summaryrefslogtreecommitdiffstats
path: root/src/bin
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:17:33 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:17:33 +0000
commit5e45211a64149b3c659b90ff2de6fa982a5a93ed (patch)
tree739caf8c461053357daa9f162bef34516c7bf452 /src/bin
parentInitial commit. (diff)
downloadpostgresql-15-5e45211a64149b3c659b90ff2de6fa982a5a93ed.tar.xz
postgresql-15-5e45211a64149b3c659b90ff2de6fa982a5a93ed.zip
Adding upstream version 15.5.upstream/15.5
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/bin')
-rw-r--r--src/bin/Makefile44
-rw-r--r--src/bin/initdb/.gitignore5
-rw-r--r--src/bin/initdb/Makefile71
-rw-r--r--src/bin/initdb/findtimezone.c1777
-rw-r--r--src/bin/initdb/initdb.c3191
-rw-r--r--src/bin/initdb/nls.mk6
-rw-r--r--src/bin/initdb/po/de.po1051
-rw-r--r--src/bin/initdb/po/el.po1051
-rw-r--r--src/bin/initdb/po/es.po1064
-rw-r--r--src/bin/initdb/po/fr.po1296
-rw-r--r--src/bin/initdb/po/it.po1168
-rw-r--r--src/bin/initdb/po/ja.po1176
-rw-r--r--src/bin/initdb/po/ka.po1131
-rw-r--r--src/bin/initdb/po/ko.po1120
-rw-r--r--src/bin/initdb/po/pt_BR.po1040
-rw-r--r--src/bin/initdb/po/ru.po1240
-rw-r--r--src/bin/initdb/po/sv.po1045
-rw-r--r--src/bin/initdb/po/uk.po1002
-rw-r--r--src/bin/initdb/po/zh_CN.po1004
-rw-r--r--src/bin/initdb/t/001_initdb.pl150
-rw-r--r--src/bin/pg_amcheck/.gitignore3
-rw-r--r--src/bin/pg_amcheck/Makefile51
-rw-r--r--src/bin/pg_amcheck/README21
-rw-r--r--src/bin/pg_amcheck/nls.mk13
-rw-r--r--src/bin/pg_amcheck/pg_amcheck.c2177
-rw-r--r--src/bin/pg_amcheck/po/de.po533
-rw-r--r--src/bin/pg_amcheck/po/el.po545
-rw-r--r--src/bin/pg_amcheck/po/es.po533
-rw-r--r--src/bin/pg_amcheck/po/fr.po605
-rw-r--r--src/bin/pg_amcheck/po/it.po531
-rw-r--r--src/bin/pg_amcheck/po/ja.po545
-rw-r--r--src/bin/pg_amcheck/po/ka.po592
-rw-r--r--src/bin/pg_amcheck/po/ko.po575
-rw-r--r--src/bin/pg_amcheck/po/ru.po607
-rw-r--r--src/bin/pg_amcheck/po/sv.po546
-rw-r--r--src/bin/pg_amcheck/po/uk.po516
-rw-r--r--src/bin/pg_amcheck/po/zh_CN.po500
-rw-r--r--src/bin/pg_amcheck/t/001_basic.pl14
-rw-r--r--src/bin/pg_amcheck/t/002_nonesuch.pl398
-rw-r--r--src/bin/pg_amcheck/t/003_check.pl520
-rw-r--r--src/bin/pg_amcheck/t/004_verify_heapam.pl542
-rw-r--r--src/bin/pg_amcheck/t/005_opclass_damage.pl60
-rw-r--r--src/bin/pg_archivecleanup/.gitignore3
-rw-r--r--src/bin/pg_archivecleanup/Makefile36
-rw-r--r--src/bin/pg_archivecleanup/nls.mk6
-rw-r--r--src/bin/pg_archivecleanup/pg_archivecleanup.c375
-rw-r--r--src/bin/pg_archivecleanup/po/cs.po198
-rw-r--r--src/bin/pg_archivecleanup/po/de.po183
-rw-r--r--src/bin/pg_archivecleanup/po/el.po189
-rw-r--r--src/bin/pg_archivecleanup/po/es.po185
-rw-r--r--src/bin/pg_archivecleanup/po/fr.po218
-rw-r--r--src/bin/pg_archivecleanup/po/it.po184
-rw-r--r--src/bin/pg_archivecleanup/po/ja.po201
-rw-r--r--src/bin/pg_archivecleanup/po/ka.po197
-rw-r--r--src/bin/pg_archivecleanup/po/ko.po197
-rw-r--r--src/bin/pg_archivecleanup/po/pt_BR.po185
-rw-r--r--src/bin/pg_archivecleanup/po/ru.po212
-rw-r--r--src/bin/pg_archivecleanup/po/sv.po184
-rw-r--r--src/bin/pg_archivecleanup/po/tr.po185
-rw-r--r--src/bin/pg_archivecleanup/po/uk.po173
-rw-r--r--src/bin/pg_archivecleanup/po/zh_CN.po179
-rw-r--r--src/bin/pg_archivecleanup/t/010_pg_archivecleanup.pl105
-rw-r--r--src/bin/pg_basebackup/.gitignore5
-rw-r--r--src/bin/pg_basebackup/Makefile84
-rw-r--r--src/bin/pg_basebackup/bbstreamer.h226
-rw-r--r--src/bin/pg_basebackup/bbstreamer_file.c374
-rw-r--r--src/bin/pg_basebackup/bbstreamer_gzip.c364
-rw-r--r--src/bin/pg_basebackup/bbstreamer_inject.c249
-rw-r--r--src/bin/pg_basebackup/bbstreamer_lz4.c422
-rw-r--r--src/bin/pg_basebackup/bbstreamer_tar.c516
-rw-r--r--src/bin/pg_basebackup/bbstreamer_zstd.c355
-rw-r--r--src/bin/pg_basebackup/nls.mk23
-rw-r--r--src/bin/pg_basebackup/pg_basebackup.c2797
-rw-r--r--src/bin/pg_basebackup/pg_receivewal.c992
-rw-r--r--src/bin/pg_basebackup/pg_recvlogical.c1039
-rw-r--r--src/bin/pg_basebackup/po/de.po1812
-rw-r--r--src/bin/pg_basebackup/po/el.po1839
-rw-r--r--src/bin/pg_basebackup/po/es.po1813
-rw-r--r--src/bin/pg_basebackup/po/fr.po2197
-rw-r--r--src/bin/pg_basebackup/po/it.po1937
-rw-r--r--src/bin/pg_basebackup/po/ja.po1813
-rw-r--r--src/bin/pg_basebackup/po/ka.po1997
-rw-r--r--src/bin/pg_basebackup/po/ko.po1917
-rw-r--r--src/bin/pg_basebackup/po/ru.po2178
-rw-r--r--src/bin/pg_basebackup/po/sv.po1805
-rw-r--r--src/bin/pg_basebackup/po/uk.po1759
-rw-r--r--src/bin/pg_basebackup/receivelog.c1276
-rw-r--r--src/bin/pg_basebackup/receivelog.h57
-rw-r--r--src/bin/pg_basebackup/streamutil.c864
-rw-r--r--src/bin/pg_basebackup/streamutil.h68
-rw-r--r--src/bin/pg_basebackup/t/010_pg_basebackup.pl945
-rw-r--r--src/bin/pg_basebackup/t/020_pg_receivewal.pl326
-rw-r--r--src/bin/pg_basebackup/t/030_pg_recvlogical.pl113
-rw-r--r--src/bin/pg_basebackup/walmethods.c1386
-rw-r--r--src/bin/pg_basebackup/walmethods.h107
-rw-r--r--src/bin/pg_checksums/.gitignore3
-rw-r--r--src/bin/pg_checksums/Makefile47
-rw-r--r--src/bin/pg_checksums/nls.mk8
-rw-r--r--src/bin/pg_checksums/pg_checksums.c655
-rw-r--r--src/bin/pg_checksums/po/de.po330
-rw-r--r--src/bin/pg_checksums/po/el.po337
-rw-r--r--src/bin/pg_checksums/po/es.po332
-rw-r--r--src/bin/pg_checksums/po/fr.po374
-rw-r--r--src/bin/pg_checksums/po/it.po327
-rw-r--r--src/bin/pg_checksums/po/ja.po339
-rw-r--r--src/bin/pg_checksums/po/ka.po351
-rw-r--r--src/bin/pg_checksums/po/ko.po355
-rw-r--r--src/bin/pg_checksums/po/pt_BR.po328
-rw-r--r--src/bin/pg_checksums/po/ru.po352
-rw-r--r--src/bin/pg_checksums/po/sv.po329
-rw-r--r--src/bin/pg_checksums/po/uk.po319
-rw-r--r--src/bin/pg_checksums/t/001_basic.pl13
-rw-r--r--src/bin/pg_checksums/t/002_actions.pl253
-rw-r--r--src/bin/pg_config/.gitignore2
-rw-r--r--src/bin/pg_config/Makefile44
-rw-r--r--src/bin/pg_config/nls.mk4
-rw-r--r--src/bin/pg_config/pg_config.c189
-rw-r--r--src/bin/pg_config/po/cs.po280
-rw-r--r--src/bin/pg_config/po/de.po265
-rw-r--r--src/bin/pg_config/po/el.po261
-rw-r--r--src/bin/pg_config/po/es.po289
-rw-r--r--src/bin/pg_config/po/fr.po325
-rw-r--r--src/bin/pg_config/po/he.po316
-rw-r--r--src/bin/pg_config/po/it.po297
-rw-r--r--src/bin/pg_config/po/ja.po293
-rw-r--r--src/bin/pg_config/po/ka.po313
-rw-r--r--src/bin/pg_config/po/ko.po279
-rw-r--r--src/bin/pg_config/po/pl.po273
-rw-r--r--src/bin/pg_config/po/pt_BR.po259
-rw-r--r--src/bin/pg_config/po/ru.po320
-rw-r--r--src/bin/pg_config/po/sv.po257
-rw-r--r--src/bin/pg_config/po/tr.po281
-rw-r--r--src/bin/pg_config/po/uk.po241
-rw-r--r--src/bin/pg_config/po/vi.po300
-rw-r--r--src/bin/pg_config/po/zh_CN.po255
-rw-r--r--src/bin/pg_config/t/001_pg_config.pl21
-rw-r--r--src/bin/pg_controldata/.gitignore2
-rw-r--r--src/bin/pg_controldata/Makefile44
-rw-r--r--src/bin/pg_controldata/nls.mk6
-rw-r--r--src/bin/pg_controldata/pg_controldata.c332
-rw-r--r--src/bin/pg_controldata/po/cs.po561
-rw-r--r--src/bin/pg_controldata/po/de.po512
-rw-r--r--src/bin/pg_controldata/po/el.po521
-rw-r--r--src/bin/pg_controldata/po/es.po515
-rw-r--r--src/bin/pg_controldata/po/fr.po569
-rw-r--r--src/bin/pg_controldata/po/it.po551
-rw-r--r--src/bin/pg_controldata/po/ja.po526
-rw-r--r--src/bin/pg_controldata/po/ka.po515
-rw-r--r--src/bin/pg_controldata/po/ko.po508
-rw-r--r--src/bin/pg_controldata/po/pt_BR.po512
-rw-r--r--src/bin/pg_controldata/po/ru.po585
-rw-r--r--src/bin/pg_controldata/po/sv.po518
-rw-r--r--src/bin/pg_controldata/po/tr.po555
-rw-r--r--src/bin/pg_controldata/po/uk.po480
-rw-r--r--src/bin/pg_controldata/po/zh_CN.po505
-rw-r--r--src/bin/pg_controldata/t/001_pg_controldata.pl46
-rw-r--r--src/bin/pg_ctl/.gitignore2
-rw-r--r--src/bin/pg_ctl/Makefile53
-rw-r--r--src/bin/pg_ctl/nls.mk4
-rw-r--r--src/bin/pg_ctl/pg_ctl.c2615
-rw-r--r--src/bin/pg_ctl/po/cs.po945
-rw-r--r--src/bin/pg_ctl/po/de.po863
-rw-r--r--src/bin/pg_ctl/po/el.po889
-rw-r--r--src/bin/pg_ctl/po/es.po882
-rw-r--r--src/bin/pg_ctl/po/fr.po1021
-rw-r--r--src/bin/pg_ctl/po/it.po889
-rw-r--r--src/bin/pg_ctl/po/ja.po911
-rw-r--r--src/bin/pg_ctl/po/ka.po939
-rw-r--r--src/bin/pg_ctl/po/ko.po911
-rw-r--r--src/bin/pg_ctl/po/pt_BR.po852
-rw-r--r--src/bin/pg_ctl/po/ru.po1023
-rw-r--r--src/bin/pg_ctl/po/sv.po858
-rw-r--r--src/bin/pg_ctl/po/tr.po869
-rw-r--r--src/bin/pg_ctl/po/uk.po818
-rw-r--r--src/bin/pg_ctl/po/zh_CN.po874
-rw-r--r--src/bin/pg_ctl/t/001_start_stop.pl103
-rw-r--r--src/bin/pg_ctl/t/002_status.pl29
-rw-r--r--src/bin/pg_ctl/t/003_promote.pl66
-rw-r--r--src/bin/pg_ctl/t/004_logrotate.pl140
-rw-r--r--src/bin/pg_dump/.gitignore5
-rw-r--r--src/bin/pg_dump/Makefile68
-rw-r--r--src/bin/pg_dump/common.c1085
-rw-r--r--src/bin/pg_dump/compress_io.c717
-rw-r--r--src/bin/pg_dump/compress_io.h70
-rw-r--r--src/bin/pg_dump/dumputils.c885
-rw-r--r--src/bin/pg_dump/dumputils.h66
-rw-r--r--src/bin/pg_dump/nls.mk18
-rw-r--r--src/bin/pg_dump/parallel.c1803
-rw-r--r--src/bin/pg_dump/parallel.h85
-rw-r--r--src/bin/pg_dump/pg_backup.h328
-rw-r--r--src/bin/pg_dump/pg_backup_archiver.c4935
-rw-r--r--src/bin/pg_dump/pg_backup_archiver.h483
-rw-r--r--src/bin/pg_dump/pg_backup_custom.c1022
-rw-r--r--src/bin/pg_dump/pg_backup_db.c570
-rw-r--r--src/bin/pg_dump/pg_backup_db.h26
-rw-r--r--src/bin/pg_dump/pg_backup_directory.c851
-rw-r--r--src/bin/pg_dump/pg_backup_null.c228
-rw-r--r--src/bin/pg_dump/pg_backup_tar.c1209
-rw-r--r--src/bin/pg_dump/pg_backup_tar.h37
-rw-r--r--src/bin/pg_dump/pg_backup_utils.c104
-rw-r--r--src/bin/pg_dump/pg_backup_utils.h41
-rw-r--r--src/bin/pg_dump/pg_dump.c18348
-rw-r--r--src/bin/pg_dump/pg_dump.h752
-rw-r--r--src/bin/pg_dump/pg_dump_sort.c1561
-rw-r--r--src/bin/pg_dump/pg_dumpall.c1753
-rw-r--r--src/bin/pg_dump/pg_restore.c496
-rw-r--r--src/bin/pg_dump/po/cs.po2965
-rw-r--r--src/bin/pg_dump/po/de.po2644
-rw-r--r--src/bin/pg_dump/po/el.po2764
-rw-r--r--src/bin/pg_dump/po/es.po2651
-rw-r--r--src/bin/pg_dump/po/fr.po3404
-rw-r--r--src/bin/pg_dump/po/it.po2939
-rw-r--r--src/bin/pg_dump/po/ja.po2639
-rw-r--r--src/bin/pg_dump/po/ka.po2624
-rw-r--r--src/bin/pg_dump/po/ko.po2773
-rw-r--r--src/bin/pg_dump/po/ru.po3452
-rw-r--r--src/bin/pg_dump/po/sv.po2618
-rw-r--r--src/bin/pg_dump/po/tr.po3070
-rw-r--r--src/bin/pg_dump/po/uk.po2577
-rw-r--r--src/bin/pg_dump/po/zh_CN.po2643
-rw-r--r--src/bin/pg_dump/t/001_basic.pl207
-rw-r--r--src/bin/pg_dump/t/002_pg_dump.pl4280
-rw-r--r--src/bin/pg_dump/t/003_pg_dump_with_server.pl40
-rw-r--r--src/bin/pg_dump/t/004_pg_dump_parallel.pl81
-rw-r--r--src/bin/pg_dump/t/010_dump_connstr.pl233
-rw-r--r--src/bin/pg_resetwal/.gitignore2
-rw-r--r--src/bin/pg_resetwal/Makefile44
-rw-r--r--src/bin/pg_resetwal/nls.mk6
-rw-r--r--src/bin/pg_resetwal/pg_resetwal.c1155
-rw-r--r--src/bin/pg_resetwal/po/cs.po721
-rw-r--r--src/bin/pg_resetwal/po/de.po667
-rw-r--r--src/bin/pg_resetwal/po/el.po679
-rw-r--r--src/bin/pg_resetwal/po/es.po681
-rw-r--r--src/bin/pg_resetwal/po/fr.po839
-rw-r--r--src/bin/pg_resetwal/po/it.po666
-rw-r--r--src/bin/pg_resetwal/po/ja.po775
-rw-r--r--src/bin/pg_resetwal/po/ka.po697
-rw-r--r--src/bin/pg_resetwal/po/ko.po680
-rw-r--r--src/bin/pg_resetwal/po/pt_BR.po667
-rw-r--r--src/bin/pg_resetwal/po/ru.po788
-rw-r--r--src/bin/pg_resetwal/po/sv.po670
-rw-r--r--src/bin/pg_resetwal/po/uk.po634
-rw-r--r--src/bin/pg_resetwal/po/zh_CN.po638
-rw-r--r--src/bin/pg_resetwal/t/001_basic.pl32
-rw-r--r--src/bin/pg_resetwal/t/002_corrupted.pl58
-rw-r--r--src/bin/pg_rewind/.gitignore6
-rw-r--r--src/bin/pg_rewind/Makefile60
-rw-r--r--src/bin/pg_rewind/datapagemap.c127
-rw-r--r--src/bin/pg_rewind/datapagemap.h29
-rw-r--r--src/bin/pg_rewind/file_ops.c477
-rw-r--r--src/bin/pg_rewind/file_ops.h29
-rw-r--r--src/bin/pg_rewind/filemap.c831
-rw-r--r--src/bin/pg_rewind/filemap.h113
-rw-r--r--src/bin/pg_rewind/libpq_source.c675
-rw-r--r--src/bin/pg_rewind/local_source.c187
-rw-r--r--src/bin/pg_rewind/nls.mk7
-rw-r--r--src/bin/pg_rewind/parsexlog.c462
-rw-r--r--src/bin/pg_rewind/pg_rewind.c1169
-rw-r--r--src/bin/pg_rewind/pg_rewind.h56
-rw-r--r--src/bin/pg_rewind/po/de.po1010
-rw-r--r--src/bin/pg_rewind/po/el.po1016
-rw-r--r--src/bin/pg_rewind/po/es.po1013
-rw-r--r--src/bin/pg_rewind/po/fr.po1300
-rw-r--r--src/bin/pg_rewind/po/it.po1190
-rw-r--r--src/bin/pg_rewind/po/ja.po1009
-rw-r--r--src/bin/pg_rewind/po/ka.po1101
-rw-r--r--src/bin/pg_rewind/po/ko.po1073
-rw-r--r--src/bin/pg_rewind/po/ru.po1208
-rw-r--r--src/bin/pg_rewind/po/sv.po1010
-rw-r--r--src/bin/pg_rewind/po/uk.po993
-rw-r--r--src/bin/pg_rewind/po/zh_CN.po959
-rw-r--r--src/bin/pg_rewind/rewind_source.h86
-rw-r--r--src/bin/pg_rewind/t/001_basic.pl194
-rw-r--r--src/bin/pg_rewind/t/002_databases.pl77
-rw-r--r--src/bin/pg_rewind/t/003_extrafiles.pl106
-rw-r--r--src/bin/pg_rewind/t/004_pg_xlog_symlink.pl80
-rw-r--r--src/bin/pg_rewind/t/005_same_timeline.pl24
-rw-r--r--src/bin/pg_rewind/t/006_options.pl45
-rw-r--r--src/bin/pg_rewind/t/007_standby_source.pl179
-rw-r--r--src/bin/pg_rewind/t/008_min_recovery_point.pl177
-rw-r--r--src/bin/pg_rewind/t/009_growing_files.pl77
-rw-r--r--src/bin/pg_rewind/t/RewindTest.pm393
-rw-r--r--src/bin/pg_rewind/timeline.c130
-rw-r--r--src/bin/pg_test_fsync/.gitignore3
-rw-r--r--src/bin/pg_test_fsync/Makefile36
-rw-r--r--src/bin/pg_test_fsync/nls.mk6
-rw-r--r--src/bin/pg_test_fsync/pg_test_fsync.c652
-rw-r--r--src/bin/pg_test_fsync/po/de.po224
-rw-r--r--src/bin/pg_test_fsync/po/el.po228
-rw-r--r--src/bin/pg_test_fsync/po/es.po228
-rw-r--r--src/bin/pg_test_fsync/po/fr.po242
-rw-r--r--src/bin/pg_test_fsync/po/it.po226
-rw-r--r--src/bin/pg_test_fsync/po/ja.po237
-rw-r--r--src/bin/pg_test_fsync/po/ka.po226
-rw-r--r--src/bin/pg_test_fsync/po/ko.po241
-rw-r--r--src/bin/pg_test_fsync/po/pt_BR.po227
-rw-r--r--src/bin/pg_test_fsync/po/ru.po238
-rw-r--r--src/bin/pg_test_fsync/po/sv.po229
-rw-r--r--src/bin/pg_test_fsync/po/uk.po211
-rw-r--r--src/bin/pg_test_fsync/t/001_basic.pl29
-rw-r--r--src/bin/pg_test_timing/.gitignore3
-rw-r--r--src/bin/pg_test_timing/Makefile36
-rw-r--r--src/bin/pg_test_timing/nls.mk4
-rw-r--r--src/bin/pg_test_timing/pg_test_timing.c208
-rw-r--r--src/bin/pg_test_timing/po/de.po84
-rw-r--r--src/bin/pg_test_timing/po/el.po86
-rw-r--r--src/bin/pg_test_timing/po/es.po86
-rw-r--r--src/bin/pg_test_timing/po/fr.po90
-rw-r--r--src/bin/pg_test_timing/po/it.po84
-rw-r--r--src/bin/pg_test_timing/po/ja.po86
-rw-r--r--src/bin/pg_test_timing/po/ka.po84
-rw-r--r--src/bin/pg_test_timing/po/ko.po86
-rw-r--r--src/bin/pg_test_timing/po/pt_BR.po85
-rw-r--r--src/bin/pg_test_timing/po/ru.po88
-rw-r--r--src/bin/pg_test_timing/po/sv.po83
-rw-r--r--src/bin/pg_test_timing/po/uk.po86
-rw-r--r--src/bin/pg_test_timing/po/zh_CN.po83
-rw-r--r--src/bin/pg_test_timing/t/001_basic.pl29
-rw-r--r--src/bin/pg_upgrade/.gitignore8
-rw-r--r--src/bin/pg_upgrade/IMPLEMENTATION98
-rw-r--r--src/bin/pg_upgrade/Makefile58
-rw-r--r--src/bin/pg_upgrade/TESTING57
-rw-r--r--src/bin/pg_upgrade/check.c1571
-rw-r--r--src/bin/pg_upgrade/controldata.c723
-rw-r--r--src/bin/pg_upgrade/dump.c71
-rw-r--r--src/bin/pg_upgrade/exec.c455
-rw-r--r--src/bin/pg_upgrade/file.c376
-rw-r--r--src/bin/pg_upgrade/function.c196
-rw-r--r--src/bin/pg_upgrade/info.c622
-rw-r--r--src/bin/pg_upgrade/nls.mk13
-rw-r--r--src/bin/pg_upgrade/option.c496
-rw-r--r--src/bin/pg_upgrade/parallel.c347
-rw-r--r--src/bin/pg_upgrade/pg_upgrade.c785
-rw-r--r--src/bin/pg_upgrade/pg_upgrade.h466
-rw-r--r--src/bin/pg_upgrade/po/cs.po1804
-rw-r--r--src/bin/pg_upgrade/po/de.po1892
-rw-r--r--src/bin/pg_upgrade/po/es.po1872
-rw-r--r--src/bin/pg_upgrade/po/fr.po2111
-rw-r--r--src/bin/pg_upgrade/po/it.po1852
-rw-r--r--src/bin/pg_upgrade/po/ja.po1896
-rw-r--r--src/bin/pg_upgrade/po/ka.po1851
-rw-r--r--src/bin/pg_upgrade/po/ko.po1964
-rw-r--r--src/bin/pg_upgrade/po/ru.po2273
-rw-r--r--src/bin/pg_upgrade/po/sv.po1861
-rw-r--r--src/bin/pg_upgrade/po/uk.po1700
-rw-r--r--src/bin/pg_upgrade/po/zh_CN.po1850
-rw-r--r--src/bin/pg_upgrade/relfilenode.c259
-rw-r--r--src/bin/pg_upgrade/server.c380
-rw-r--r--src/bin/pg_upgrade/t/001_basic.pl11
-rw-r--r--src/bin/pg_upgrade/t/002_pg_upgrade.pl394
-rw-r--r--src/bin/pg_upgrade/tablespace.c111
-rw-r--r--src/bin/pg_upgrade/util.c328
-rw-r--r--src/bin/pg_upgrade/version.c466
-rw-r--r--src/bin/pg_verifybackup/.gitignore2
-rw-r--r--src/bin/pg_verifybackup/Makefile49
-rw-r--r--src/bin/pg_verifybackup/nls.mk17
-rw-r--r--src/bin/pg_verifybackup/parse_manifest.c748
-rw-r--r--src/bin/pg_verifybackup/parse_manifest.h46
-rw-r--r--src/bin/pg_verifybackup/pg_verifybackup.c916
-rw-r--r--src/bin/pg_verifybackup/po/de.po498
-rw-r--r--src/bin/pg_verifybackup/po/el.po505
-rw-r--r--src/bin/pg_verifybackup/po/es.po503
-rw-r--r--src/bin/pg_verifybackup/po/fr.po517
-rw-r--r--src/bin/pg_verifybackup/po/it.po500
-rw-r--r--src/bin/pg_verifybackup/po/ja.po509
-rw-r--r--src/bin/pg_verifybackup/po/ka.po516
-rw-r--r--src/bin/pg_verifybackup/po/ko.po516
-rw-r--r--src/bin/pg_verifybackup/po/ru.po518
-rw-r--r--src/bin/pg_verifybackup/po/sv.po528
-rw-r--r--src/bin/pg_verifybackup/po/uk.po491
-rw-r--r--src/bin/pg_verifybackup/po/zh_CN.po494
-rw-r--r--src/bin/pg_verifybackup/t/001_basic.pl38
-rw-r--r--src/bin/pg_verifybackup/t/002_algorithm.pl61
-rw-r--r--src/bin/pg_verifybackup/t/003_corruption.pl292
-rw-r--r--src/bin/pg_verifybackup/t/004_options.pl108
-rw-r--r--src/bin/pg_verifybackup/t/005_bad_manifest.pl209
-rw-r--r--src/bin/pg_verifybackup/t/006_encoding.pl34
-rw-r--r--src/bin/pg_verifybackup/t/007_wal.pl80
-rw-r--r--src/bin/pg_verifybackup/t/008_untar.pl127
-rw-r--r--src/bin/pg_verifybackup/t/009_extract.pl97
-rw-r--r--src/bin/pg_verifybackup/t/010_client_untar.pl155
-rw-r--r--src/bin/pg_waldump/.gitignore31
-rw-r--r--src/bin/pg_waldump/Makefile56
-rw-r--r--src/bin/pg_waldump/compat.c64
-rw-r--r--src/bin/pg_waldump/nls.mk7
-rw-r--r--src/bin/pg_waldump/pg_waldump.c1182
-rw-r--r--src/bin/pg_waldump/po/de.po535
-rw-r--r--src/bin/pg_waldump/po/el.po564
-rw-r--r--src/bin/pg_waldump/po/es.po536
-rw-r--r--src/bin/pg_waldump/po/fr.po646
-rw-r--r--src/bin/pg_waldump/po/it.po532
-rw-r--r--src/bin/pg_waldump/po/ja.po532
-rw-r--r--src/bin/pg_waldump/po/ka.po615
-rw-r--r--src/bin/pg_waldump/po/ko.po572
-rw-r--r--src/bin/pg_waldump/po/ru.po654
-rw-r--r--src/bin/pg_waldump/po/sv.po534
-rw-r--r--src/bin/pg_waldump/po/uk.po515
-rw-r--r--src/bin/pg_waldump/rmgrdesc.c99
-rw-r--r--src/bin/pg_waldump/rmgrdesc.h23
-rw-r--r--src/bin/pg_waldump/t/001_basic.pl13
-rw-r--r--src/bin/pgbench/.gitignore4
-rw-r--r--src/bin/pgbench/Makefile54
-rw-r--r--src/bin/pgbench/exprparse.c2200
-rw-r--r--src/bin/pgbench/exprparse.y546
-rw-r--r--src/bin/pgbench/exprscan.c2835
-rw-r--r--src/bin/pgbench/exprscan.l463
-rw-r--r--src/bin/pgbench/pgbench.c7863
-rw-r--r--src/bin/pgbench/pgbench.h167
-rw-r--r--src/bin/pgbench/t/001_pgbench_with_server.pl1447
-rw-r--r--src/bin/pgbench/t/002_pgbench_no_server.pl387
-rw-r--r--src/bin/pgevent/MSG00001.binbin0 -> 28 bytes
-rw-r--r--src/bin/pgevent/Makefile38
-rw-r--r--src/bin/pgevent/README20
-rw-r--r--src/bin/pgevent/exports.txt3
-rw-r--r--src/bin/pgevent/pgevent.c160
-rw-r--r--src/bin/pgevent/pgevent.def5
-rw-r--r--src/bin/pgevent/pgmsgevent.h46
-rw-r--r--src/bin/pgevent/pgmsgevent.mc5
-rw-r--r--src/bin/pgevent/pgmsgevent.rc4
-rw-r--r--src/bin/psql/.gitignore5
-rw-r--r--src/bin/psql/Makefile90
-rw-r--r--src/bin/psql/command.c5606
-rw-r--r--src/bin/psql/command.h49
-rw-r--r--src/bin/psql/common.c2388
-rw-r--r--src/bin/psql/common.h44
-rw-r--r--src/bin/psql/copy.c728
-rw-r--r--src/bin/psql/copy.h24
-rw-r--r--src/bin/psql/create_help.pl219
-rw-r--r--src/bin/psql/crosstabview.c713
-rw-r--r--src/bin/psql/crosstabview.h29
-rw-r--r--src/bin/psql/describe.c7007
-rw-r--r--src/bin/psql/describe.h149
-rw-r--r--src/bin/psql/help.c766
-rw-r--r--src/bin/psql/help.h21
-rw-r--r--src/bin/psql/input.c552
-rw-r--r--src/bin/psql/input.h51
-rw-r--r--src/bin/psql/large_obj.c264
-rw-r--r--src/bin/psql/large_obj.h15
-rw-r--r--src/bin/psql/mainloop.c662
-rw-r--r--src/bin/psql/mainloop.h17
-rw-r--r--src/bin/psql/nls.mk15
-rw-r--r--src/bin/psql/po/cs.po6603
-rw-r--r--src/bin/psql/po/de.po6486
-rw-r--r--src/bin/psql/po/el.po6535
-rw-r--r--src/bin/psql/po/es.po6405
-rw-r--r--src/bin/psql/po/fr.po7011
-rw-r--r--src/bin/psql/po/it.po6647
-rw-r--r--src/bin/psql/po/ja.po6476
-rw-r--r--src/bin/psql/po/ka.po6456
-rw-r--r--src/bin/psql/po/ko.po6597
-rw-r--r--src/bin/psql/po/ru.po7067
-rw-r--r--src/bin/psql/po/sv.po6479
-rw-r--r--src/bin/psql/po/uk.po6427
-rw-r--r--src/bin/psql/po/zh_CN.po6476
-rw-r--r--src/bin/psql/prompt.c382
-rw-r--r--src/bin/psql/prompt.h17
-rw-r--r--src/bin/psql/psqlrc.sample8
-rw-r--r--src/bin/psql/psqlscanslash.c3485
-rw-r--r--src/bin/psql/psqlscanslash.h40
-rw-r--r--src/bin/psql/psqlscanslash.l829
-rw-r--r--src/bin/psql/settings.h170
-rw-r--r--src/bin/psql/sql_help.c6238
-rw-r--r--src/bin/psql/sql_help.h30
-rw-r--r--src/bin/psql/startup.c1268
-rw-r--r--src/bin/psql/stringutils.c342
-rw-r--r--src/bin/psql/stringutils.h28
-rw-r--r--src/bin/psql/t/001_basic.pl328
-rw-r--r--src/bin/psql/t/010_tab_completion.pl452
-rw-r--r--src/bin/psql/t/020_cancel.pl80
-rw-r--r--src/bin/psql/tab-complete.c6238
-rw-r--r--src/bin/psql/tab-complete.h17
-rw-r--r--src/bin/psql/variables.c422
-rw-r--r--src/bin/psql/variables.h97
-rw-r--r--src/bin/scripts/.gitignore10
-rw-r--r--src/bin/scripts/Makefile62
-rw-r--r--src/bin/scripts/clusterdb.c286
-rw-r--r--src/bin/scripts/common.c167
-rw-r--r--src/bin/scripts/common.h26
-rw-r--r--src/bin/scripts/createdb.c308
-rw-r--r--src/bin/scripts/createuser.c378
-rw-r--r--src/bin/scripts/dropdb.c190
-rw-r--r--src/bin/scripts/dropuser.c187
-rw-r--r--src/bin/scripts/nls.mk17
-rw-r--r--src/bin/scripts/pg_isready.c242
-rw-r--r--src/bin/scripts/po/cs.po1267
-rw-r--r--src/bin/scripts/po/de.po1210
-rw-r--r--src/bin/scripts/po/el.po1196
-rw-r--r--src/bin/scripts/po/es.po1191
-rw-r--r--src/bin/scripts/po/fr.po1444
-rw-r--r--src/bin/scripts/po/it.po1228
-rw-r--r--src/bin/scripts/po/ja.po1195
-rw-r--r--src/bin/scripts/po/ka.po1299
-rw-r--r--src/bin/scripts/po/ko.po1245
-rw-r--r--src/bin/scripts/po/pt_BR.po1169
-rw-r--r--src/bin/scripts/po/ru.po1467
-rw-r--r--src/bin/scripts/po/sv.po1181
-rw-r--r--src/bin/scripts/po/tr.po1223
-rw-r--r--src/bin/scripts/po/uk.po1124
-rw-r--r--src/bin/scripts/po/zh_CN.po1147
-rw-r--r--src/bin/scripts/reindexdb.c789
-rw-r--r--src/bin/scripts/t/010_clusterdb.pl38
-rw-r--r--src/bin/scripts/t/011_clusterdb_all.pl38
-rw-r--r--src/bin/scripts/t/020_createdb.pl161
-rw-r--r--src/bin/scripts/t/040_createuser.pl39
-rw-r--r--src/bin/scripts/t/050_dropdb.pl43
-rw-r--r--src/bin/scripts/t/070_dropuser.pl28
-rw-r--r--src/bin/scripts/t/080_pg_isready.pl25
-rw-r--r--src/bin/scripts/t/090_reindexdb.pl202
-rw-r--r--src/bin/scripts/t/091_reindexdb_all.pl35
-rw-r--r--src/bin/scripts/t/100_vacuumdb.pl150
-rw-r--r--src/bin/scripts/t/101_vacuumdb_all.pl33
-rw-r--r--src/bin/scripts/t/102_vacuumdb_stages.pl40
-rw-r--r--src/bin/scripts/t/200_connstr.pl44
-rw-r--r--src/bin/scripts/vacuumdb.c1001
514 files changed, 432168 insertions, 0 deletions
diff --git a/src/bin/Makefile b/src/bin/Makefile
new file mode 100644
index 0000000..7f9dde9
--- /dev/null
+++ b/src/bin/Makefile
@@ -0,0 +1,44 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin (client programs)
+#
+# Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/bin/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/bin
+top_builddir = ../..
+include $(top_builddir)/src/Makefile.global
+
+SUBDIRS = \
+ initdb \
+ pg_amcheck \
+ pg_archivecleanup \
+ pg_basebackup \
+ pg_checksums \
+ pg_config \
+ pg_controldata \
+ pg_ctl \
+ pg_dump \
+ pg_resetwal \
+ pg_rewind \
+ pg_test_fsync \
+ pg_test_timing \
+ pg_upgrade \
+ pg_verifybackup \
+ pg_waldump \
+ pgbench \
+ psql \
+ scripts
+
+ifeq ($(PORTNAME), win32)
+SUBDIRS += pgevent
+else
+ALWAYS_SUBDIRS += pgevent
+endif
+
+$(recurse)
+$(recurse_always)
diff --git a/src/bin/initdb/.gitignore b/src/bin/initdb/.gitignore
new file mode 100644
index 0000000..b3167c4
--- /dev/null
+++ b/src/bin/initdb/.gitignore
@@ -0,0 +1,5 @@
+/localtime.c
+
+/initdb
+
+/tmp_check/
diff --git a/src/bin/initdb/Makefile b/src/bin/initdb/Makefile
new file mode 100644
index 0000000..b0dd13d
--- /dev/null
+++ b/src/bin/initdb/Makefile
@@ -0,0 +1,71 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/initdb
+#
+# Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/bin/initdb/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "initdb - initialize a new database cluster"
+PGAPPICON=win32
+
+subdir = src/bin/initdb
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+override CPPFLAGS := -DFRONTEND -I$(libpq_srcdir) -I$(top_srcdir)/src/timezone $(CPPFLAGS)
+
+# Note: it's important that we link to encnames.o from libpgcommon, not
+# from libpq, else we have risks of version skew if we run with a libpq
+# shared library from a different PG version. The libpq_pgport macro
+# should ensure that that happens.
+#
+# We need libpq only because fe_utils does.
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+# use system timezone data?
+ifneq (,$(with_system_tzdata))
+override CPPFLAGS += '-DSYSTEMTZDIR="$(with_system_tzdata)"'
+endif
+
+OBJS = \
+ $(WIN32RES) \
+ findtimezone.o \
+ initdb.o \
+ localtime.o
+
+all: initdb
+
+initdb: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+# We must pull in localtime.c from src/timezones
+localtime.c: % : $(top_srcdir)/src/timezone/%
+ rm -f $@ && $(LN_S) $< .
+
+install: all installdirs
+ $(INSTALL_PROGRAM) initdb$(X) '$(DESTDIR)$(bindir)/initdb$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/initdb$(X)'
+
+clean distclean maintainer-clean:
+ rm -f initdb$(X) $(OBJS) localtime.c
+ rm -rf tmp_check
+
+# ensure that changes in datadir propagate into object file
+initdb.o: initdb.c $(top_builddir)/src/Makefile.global
+
+export with_icu
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/initdb/findtimezone.c b/src/bin/initdb/findtimezone.c
new file mode 100644
index 0000000..ddb65e6
--- /dev/null
+++ b/src/bin/initdb/findtimezone.c
@@ -0,0 +1,1777 @@
+/*-------------------------------------------------------------------------
+ *
+ * findtimezone.c
+ * Functions for determining the default timezone to use.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/initdb/findtimezone.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "pgtz.h"
+
+/* Ideally this would be in a .h file, but it hardly seems worth the trouble */
+extern const char *select_default_timezone(const char *share_path);
+
+
+#ifndef SYSTEMTZDIR
+static char tzdirpath[MAXPGPATH];
+#endif
+
+
+/*
+ * Return full pathname of timezone data directory
+ *
+ * In this file, tzdirpath is assumed to be set up by select_default_timezone.
+ */
+static const char *
+pg_TZDIR(void)
+{
+#ifndef SYSTEMTZDIR
+ /* normal case: timezone stuff is under our share dir */
+ return tzdirpath;
+#else
+ /* we're configured to use system's timezone database */
+ return SYSTEMTZDIR;
+#endif
+}
+
+
+/*
+ * Given a timezone name, open() the timezone data file. Return the
+ * file descriptor if successful, -1 if not.
+ *
+ * This is simpler than the backend function of the same name because
+ * we assume that the input string has the correct case already, so there
+ * is no need for case-folding. (This is obviously true if we got the file
+ * name from the filesystem to start with. The only other place it can come
+ * from is the environment variable TZ, and there seems no need to allow
+ * case variation in that; other programs aren't likely to.)
+ *
+ * If "canonname" is not NULL, then on success the canonical spelling of the
+ * given name is stored there (the buffer must be > TZ_STRLEN_MAX bytes!).
+ * This is redundant but kept for compatibility with the backend code.
+ */
+int
+pg_open_tzfile(const char *name, char *canonname)
+{
+ char fullname[MAXPGPATH];
+
+ if (canonname)
+ strlcpy(canonname, name, TZ_STRLEN_MAX + 1);
+
+ strlcpy(fullname, pg_TZDIR(), sizeof(fullname));
+ if (strlen(fullname) + 1 + strlen(name) >= MAXPGPATH)
+ return -1; /* not gonna fit */
+ strcat(fullname, "/");
+ strcat(fullname, name);
+
+ return open(fullname, O_RDONLY | PG_BINARY, 0);
+}
+
+
+
+/*
+ * Load a timezone definition.
+ * Does not verify that the timezone is acceptable!
+ *
+ * This corresponds to the backend's pg_tzset(), except that we only support
+ * one loaded timezone at a time.
+ */
+static pg_tz *
+pg_load_tz(const char *name)
+{
+ static pg_tz tz;
+
+ if (strlen(name) > TZ_STRLEN_MAX)
+ return NULL; /* not going to fit */
+
+ /*
+ * "GMT" is always sent to tzparse(); see comments for pg_tzset().
+ */
+ if (strcmp(name, "GMT") == 0)
+ {
+ if (!tzparse(name, &tz.state, true))
+ {
+ /* This really, really should not happen ... */
+ return NULL;
+ }
+ }
+ else if (tzload(name, NULL, &tz.state, true) != 0)
+ {
+ if (name[0] == ':' || !tzparse(name, &tz.state, false))
+ {
+ return NULL; /* unknown timezone */
+ }
+ }
+
+ strcpy(tz.TZname, name);
+
+ return &tz;
+}
+
+
+/*
+ * The following block of code attempts to determine which timezone in our
+ * timezone database is the best match for the active system timezone.
+ *
+ * On most systems, we rely on trying to match the observable behavior of
+ * the C library's localtime() function. The database zone that matches
+ * furthest into the past is the one to use. Often there will be several
+ * zones with identical rankings (since the IANA database assigns multiple
+ * names to many zones). We break ties by first checking for "preferred"
+ * names (such as "UTC"), and then arbitrarily by preferring shorter, then
+ * alphabetically earlier zone names. (If we did not explicitly prefer
+ * "UTC", we would get the alias name "UCT" instead due to alphabetic
+ * ordering.)
+ *
+ * Many modern systems use the IANA database, so if we can determine the
+ * system's idea of which zone it is using and its behavior matches our zone
+ * of the same name, we can skip the rather-expensive search through all the
+ * zones in our database. This short-circuit path also ensures that we spell
+ * the zone name the same way the system setting does, even in the presence
+ * of multiple aliases for the same zone.
+ *
+ * Win32's native knowledge about timezones appears to be too incomplete
+ * and too different from the IANA database for the above matching strategy
+ * to be of any use. But there is just a limited number of timezones
+ * available, so we can rely on a handmade mapping table instead.
+ */
+
+#ifndef WIN32
+
+#define T_DAY ((time_t) (60*60*24))
+#define T_WEEK ((time_t) (60*60*24*7))
+#define T_MONTH ((time_t) (60*60*24*31))
+
+#define MAX_TEST_TIMES (52*100) /* 100 years */
+
+struct tztry
+{
+ int n_test_times;
+ time_t test_times[MAX_TEST_TIMES];
+};
+
+static bool check_system_link_file(const char *linkname, struct tztry *tt,
+ char *bestzonename);
+static void scan_available_timezones(char *tzdir, char *tzdirsub,
+ struct tztry *tt,
+ int *bestscore, char *bestzonename);
+
+
+/*
+ * Get GMT offset from a system struct tm
+ */
+static int
+get_timezone_offset(struct tm *tm)
+{
+#if defined(HAVE_STRUCT_TM_TM_ZONE)
+ return tm->tm_gmtoff;
+#elif defined(HAVE_INT_TIMEZONE)
+ return -TIMEZONE_GLOBAL;
+#else
+#error No way to determine TZ? Can this happen?
+#endif
+}
+
+/*
+ * Convenience subroutine to convert y/m/d to time_t (NOT pg_time_t)
+ */
+static time_t
+build_time_t(int year, int month, int day)
+{
+ struct tm tm;
+
+ memset(&tm, 0, sizeof(tm));
+ tm.tm_mday = day;
+ tm.tm_mon = month - 1;
+ tm.tm_year = year - 1900;
+ tm.tm_isdst = -1;
+
+ return mktime(&tm);
+}
+
+/*
+ * Does a system tm value match one we computed ourselves?
+ */
+static bool
+compare_tm(struct tm *s, struct pg_tm *p)
+{
+ if (s->tm_sec != p->tm_sec ||
+ s->tm_min != p->tm_min ||
+ s->tm_hour != p->tm_hour ||
+ s->tm_mday != p->tm_mday ||
+ s->tm_mon != p->tm_mon ||
+ s->tm_year != p->tm_year ||
+ s->tm_wday != p->tm_wday ||
+ s->tm_yday != p->tm_yday ||
+ s->tm_isdst != p->tm_isdst)
+ return false;
+ return true;
+}
+
+/*
+ * See how well a specific timezone setting matches the system behavior
+ *
+ * We score a timezone setting according to the number of test times it
+ * matches. (The test times are ordered later-to-earlier, but this routine
+ * doesn't actually know that; it just scans until the first non-match.)
+ *
+ * We return -1 for a completely unusable setting; this is worse than the
+ * score of zero for a setting that works but matches not even the first
+ * test time.
+ */
+static int
+score_timezone(const char *tzname, struct tztry *tt)
+{
+ int i;
+ pg_time_t pgtt;
+ struct tm *systm;
+ struct pg_tm *pgtm;
+ char cbuf[TZ_STRLEN_MAX + 1];
+ pg_tz *tz;
+
+ /* Load timezone definition */
+ tz = pg_load_tz(tzname);
+ if (!tz)
+ return -1; /* unrecognized zone name */
+
+ /* Reject if leap seconds involved */
+ if (!pg_tz_acceptable(tz))
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "Reject TZ \"%s\": uses leap seconds\n", tzname);
+#endif
+ return -1;
+ }
+
+ /* Check for match at all the test times */
+ for (i = 0; i < tt->n_test_times; i++)
+ {
+ pgtt = (pg_time_t) (tt->test_times[i]);
+ pgtm = pg_localtime(&pgtt, tz);
+ if (!pgtm)
+ return -1; /* probably shouldn't happen */
+ systm = localtime(&(tt->test_times[i]));
+ if (!systm)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "TZ \"%s\" scores %d: at %ld %04d-%02d-%02d %02d:%02d:%02d %s, system had no data\n",
+ tzname, i, (long) pgtt,
+ pgtm->tm_year + 1900, pgtm->tm_mon + 1, pgtm->tm_mday,
+ pgtm->tm_hour, pgtm->tm_min, pgtm->tm_sec,
+ pgtm->tm_isdst ? "dst" : "std");
+#endif
+ return i;
+ }
+ if (!compare_tm(systm, pgtm))
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "TZ \"%s\" scores %d: at %ld %04d-%02d-%02d %02d:%02d:%02d %s versus %04d-%02d-%02d %02d:%02d:%02d %s\n",
+ tzname, i, (long) pgtt,
+ pgtm->tm_year + 1900, pgtm->tm_mon + 1, pgtm->tm_mday,
+ pgtm->tm_hour, pgtm->tm_min, pgtm->tm_sec,
+ pgtm->tm_isdst ? "dst" : "std",
+ systm->tm_year + 1900, systm->tm_mon + 1, systm->tm_mday,
+ systm->tm_hour, systm->tm_min, systm->tm_sec,
+ systm->tm_isdst ? "dst" : "std");
+#endif
+ return i;
+ }
+ if (systm->tm_isdst >= 0)
+ {
+ /* Check match of zone names, too */
+ if (pgtm->tm_zone == NULL)
+ return -1; /* probably shouldn't happen */
+ memset(cbuf, 0, sizeof(cbuf));
+ strftime(cbuf, sizeof(cbuf) - 1, "%Z", systm); /* zone abbr */
+ if (strcmp(cbuf, pgtm->tm_zone) != 0)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "TZ \"%s\" scores %d: at %ld \"%s\" versus \"%s\"\n",
+ tzname, i, (long) pgtt,
+ pgtm->tm_zone, cbuf);
+#endif
+ return i;
+ }
+ }
+ }
+
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "TZ \"%s\" gets max score %d\n", tzname, i);
+#endif
+
+ return i;
+}
+
+/*
+ * Test whether given zone name is a perfect match to localtime() behavior
+ */
+static bool
+perfect_timezone_match(const char *tzname, struct tztry *tt)
+{
+ return (score_timezone(tzname, tt) == tt->n_test_times);
+}
+
+
+/*
+ * Try to identify a timezone name (in our terminology) that best matches the
+ * observed behavior of the system localtime() function.
+ */
+static const char *
+identify_system_timezone(void)
+{
+ static char resultbuf[TZ_STRLEN_MAX + 1];
+ time_t tnow;
+ time_t t;
+ struct tztry tt;
+ struct tm *tm;
+ int thisyear;
+ int bestscore;
+ char tmptzdir[MAXPGPATH];
+ int std_ofs;
+ char std_zone_name[TZ_STRLEN_MAX + 1],
+ dst_zone_name[TZ_STRLEN_MAX + 1];
+ char cbuf[TZ_STRLEN_MAX + 1];
+
+ /* Initialize OS timezone library */
+ tzset();
+
+ /*
+ * Set up the list of dates to be probed to see how well our timezone
+ * matches the system zone. We first probe January and July of the
+ * current year; this serves to quickly eliminate the vast majority of the
+ * TZ database entries. If those dates match, we probe every week for 100
+ * years backwards from the current July. (Weekly resolution is good
+ * enough to identify DST transition rules, since everybody switches on
+ * Sundays.) This is sufficient to cover most of the Unix time_t range,
+ * and we don't want to look further than that since many systems won't
+ * have sane TZ behavior further back anyway. The further back the zone
+ * matches, the better we score it. This may seem like a rather random
+ * way of doing things, but experience has shown that system-supplied
+ * timezone definitions are likely to have DST behavior that is right for
+ * the recent past and not so accurate further back. Scoring in this way
+ * allows us to recognize zones that have some commonality with the IANA
+ * database, without insisting on exact match. (Note: we probe Thursdays,
+ * not Sundays, to avoid triggering DST-transition bugs in localtime
+ * itself.)
+ */
+ tnow = time(NULL);
+ tm = localtime(&tnow);
+ if (!tm)
+ return NULL; /* give up if localtime is broken... */
+ thisyear = tm->tm_year + 1900;
+
+ t = build_time_t(thisyear, 1, 15);
+
+ /*
+ * Round back to GMT midnight Thursday. This depends on the knowledge
+ * that the time_t origin is Thu Jan 01 1970. (With a different origin
+ * we'd be probing some other day of the week, but it wouldn't matter
+ * anyway unless localtime() had DST-transition bugs.)
+ */
+ t -= (t % T_WEEK);
+
+ tt.n_test_times = 0;
+ tt.test_times[tt.n_test_times++] = t;
+
+ t = build_time_t(thisyear, 7, 15);
+ t -= (t % T_WEEK);
+
+ tt.test_times[tt.n_test_times++] = t;
+
+ while (tt.n_test_times < MAX_TEST_TIMES)
+ {
+ t -= T_WEEK;
+ tt.test_times[tt.n_test_times++] = t;
+ }
+
+ /*
+ * Try to avoid the brute-force search by seeing if we can recognize the
+ * system's timezone setting directly.
+ *
+ * Currently we just check /etc/localtime; there are other conventions for
+ * this, but that seems to be the only one used on enough platforms to be
+ * worth troubling over.
+ */
+ if (check_system_link_file("/etc/localtime", &tt, resultbuf))
+ return resultbuf;
+
+ /* No luck, so search for the best-matching timezone file */
+ strlcpy(tmptzdir, pg_TZDIR(), sizeof(tmptzdir));
+ bestscore = -1;
+ resultbuf[0] = '\0';
+ scan_available_timezones(tmptzdir, tmptzdir + strlen(tmptzdir) + 1,
+ &tt,
+ &bestscore, resultbuf);
+ if (bestscore > 0)
+ {
+ /* Ignore IANA's rather silly "Factory" zone; use GMT instead */
+ if (strcmp(resultbuf, "Factory") == 0)
+ return NULL;
+ return resultbuf;
+ }
+
+ /*
+ * Couldn't find a match in the database, so next we try constructed zone
+ * names (like "PST8PDT").
+ *
+ * First we need to determine the names of the local standard and daylight
+ * zones. The idea here is to scan forward from today until we have seen
+ * both zones, if both are in use.
+ */
+ memset(std_zone_name, 0, sizeof(std_zone_name));
+ memset(dst_zone_name, 0, sizeof(dst_zone_name));
+ std_ofs = 0;
+
+ tnow = time(NULL);
+
+ /*
+ * Round back to a GMT midnight so results don't depend on local time of
+ * day
+ */
+ tnow -= (tnow % T_DAY);
+
+ /*
+ * We have to look a little further ahead than one year, in case today is
+ * just past a DST boundary that falls earlier in the year than the next
+ * similar boundary. Arbitrarily scan up to 14 months.
+ */
+ for (t = tnow; t <= tnow + T_MONTH * 14; t += T_MONTH)
+ {
+ tm = localtime(&t);
+ if (!tm)
+ continue;
+ if (tm->tm_isdst < 0)
+ continue;
+ if (tm->tm_isdst == 0 && std_zone_name[0] == '\0')
+ {
+ /* found STD zone */
+ memset(cbuf, 0, sizeof(cbuf));
+ strftime(cbuf, sizeof(cbuf) - 1, "%Z", tm); /* zone abbr */
+ strcpy(std_zone_name, cbuf);
+ std_ofs = get_timezone_offset(tm);
+ }
+ if (tm->tm_isdst > 0 && dst_zone_name[0] == '\0')
+ {
+ /* found DST zone */
+ memset(cbuf, 0, sizeof(cbuf));
+ strftime(cbuf, sizeof(cbuf) - 1, "%Z", tm); /* zone abbr */
+ strcpy(dst_zone_name, cbuf);
+ }
+ /* Done if found both */
+ if (std_zone_name[0] && dst_zone_name[0])
+ break;
+ }
+
+ /* We should have found a STD zone name by now... */
+ if (std_zone_name[0] == '\0')
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not determine system time zone\n");
+#endif
+ return NULL; /* go to GMT */
+ }
+
+ /* If we found DST then try STD<ofs>DST */
+ if (dst_zone_name[0] != '\0')
+ {
+ snprintf(resultbuf, sizeof(resultbuf), "%s%d%s",
+ std_zone_name, -std_ofs / 3600, dst_zone_name);
+ if (score_timezone(resultbuf, &tt) > 0)
+ return resultbuf;
+ }
+
+ /* Try just the STD timezone (works for GMT at least) */
+ strcpy(resultbuf, std_zone_name);
+ if (score_timezone(resultbuf, &tt) > 0)
+ return resultbuf;
+
+ /* Try STD<ofs> */
+ snprintf(resultbuf, sizeof(resultbuf), "%s%d",
+ std_zone_name, -std_ofs / 3600);
+ if (score_timezone(resultbuf, &tt) > 0)
+ return resultbuf;
+
+ /*
+ * Did not find the timezone. Fallback to use a GMT zone. Note that the
+ * IANA timezone database names the GMT-offset zones in POSIX style: plus
+ * is west of Greenwich. It's unfortunate that this is opposite of SQL
+ * conventions. Should we therefore change the names? Probably not...
+ */
+ snprintf(resultbuf, sizeof(resultbuf), "Etc/GMT%s%d",
+ (-std_ofs > 0) ? "+" : "", -std_ofs / 3600);
+
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not recognize system time zone, using \"%s\"\n",
+ resultbuf);
+#endif
+ return resultbuf;
+}
+
+/*
+ * Examine a system-provided symlink file to see if it tells us the timezone.
+ *
+ * Unfortunately, there is little standardization of how the system default
+ * timezone is determined in the absence of a TZ environment setting.
+ * But a common strategy is to create a symlink at a well-known place.
+ * If "linkname" identifies a readable symlink, and the tail of its contents
+ * matches a zone name we know, and the actual behavior of localtime() agrees
+ * with what we think that zone means, then we may use that zone name.
+ *
+ * We insist on a perfect behavioral match, which might not happen if the
+ * system has a different IANA database version than we do; but in that case
+ * it seems best to fall back to the brute-force search.
+ *
+ * linkname is the symlink file location to probe.
+ *
+ * tt tells about the system timezone behavior we need to match.
+ *
+ * If we successfully identify a zone name, store it in *bestzonename and
+ * return true; else return false. bestzonename must be a buffer of length
+ * TZ_STRLEN_MAX + 1.
+ */
+static bool
+check_system_link_file(const char *linkname, struct tztry *tt,
+ char *bestzonename)
+{
+#ifdef HAVE_READLINK
+ char link_target[MAXPGPATH];
+ int len;
+ const char *cur_name;
+
+ /*
+ * Try to read the symlink. If not there, not a symlink, etc etc, just
+ * quietly fail; the precise reason needn't concern us.
+ */
+ len = readlink(linkname, link_target, sizeof(link_target));
+ if (len < 0 || len >= sizeof(link_target))
+ return false;
+ link_target[len] = '\0';
+
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "symbolic link \"%s\" contains \"%s\"\n",
+ linkname, link_target);
+#endif
+
+ /*
+ * The symlink is probably of the form "/path/to/zones/zone/name", or
+ * possibly it is a relative path. Nobody puts their zone DB directly in
+ * the root directory, so we can definitely skip the first component; but
+ * after that it's trial-and-error to identify which path component begins
+ * the zone name.
+ */
+ cur_name = link_target;
+ while (*cur_name)
+ {
+ /* Advance to next segment of path */
+ cur_name = strchr(cur_name + 1, '/');
+ if (cur_name == NULL)
+ break;
+ /* If there are consecutive slashes, skip all, as the kernel would */
+ do
+ {
+ cur_name++;
+ } while (*cur_name == '/');
+
+ /*
+ * Test remainder of path to see if it is a matching zone name.
+ * Relative paths might contain ".."; we needn't bother testing if the
+ * first component is that. Also defend against overlength names.
+ */
+ if (*cur_name && *cur_name != '.' &&
+ strlen(cur_name) <= TZ_STRLEN_MAX &&
+ perfect_timezone_match(cur_name, tt))
+ {
+ /* Success! */
+ strcpy(bestzonename, cur_name);
+ return true;
+ }
+ }
+
+ /* Couldn't extract a matching zone name */
+ return false;
+#else
+ /* No symlinks? Forget it */
+ return false;
+#endif
+}
+
+/*
+ * Given a timezone name, determine whether it should be preferred over other
+ * names which are equally good matches. The output is arbitrary but we will
+ * use 0 for "neutral" default preference; larger values are more preferred.
+ */
+static int
+zone_name_pref(const char *zonename)
+{
+ /*
+ * Prefer UTC over alternatives such as UCT. Also prefer Etc/UTC over
+ * Etc/UCT; but UTC is preferred to Etc/UTC.
+ */
+ if (strcmp(zonename, "UTC") == 0)
+ return 50;
+ if (strcmp(zonename, "Etc/UTC") == 0)
+ return 40;
+
+ /*
+ * We don't want to pick "localtime" or "posixrules", unless we can find
+ * no other name for the prevailing zone. Those aren't real zone names.
+ */
+ if (strcmp(zonename, "localtime") == 0 ||
+ strcmp(zonename, "posixrules") == 0)
+ return -50;
+
+ return 0;
+}
+
+/*
+ * Recursively scan the timezone database looking for the best match to
+ * the system timezone behavior.
+ *
+ * tzdir points to a buffer of size MAXPGPATH. On entry, it holds the
+ * pathname of a directory containing TZ files. We internally modify it
+ * to hold pathnames of sub-directories and files, but must restore it
+ * to its original contents before exit.
+ *
+ * tzdirsub points to the part of tzdir that represents the subfile name
+ * (ie, tzdir + the original directory name length, plus one for the
+ * first added '/').
+ *
+ * tt tells about the system timezone behavior we need to match.
+ *
+ * *bestscore and *bestzonename on entry hold the best score found so far
+ * and the name of the best zone. We overwrite them if we find a better
+ * score. bestzonename must be a buffer of length TZ_STRLEN_MAX + 1.
+ */
+static void
+scan_available_timezones(char *tzdir, char *tzdirsub, struct tztry *tt,
+ int *bestscore, char *bestzonename)
+{
+ int tzdir_orig_len = strlen(tzdir);
+ char **names;
+ char **namep;
+
+ names = pgfnames(tzdir);
+ if (!names)
+ return;
+
+ for (namep = names; *namep; namep++)
+ {
+ char *name = *namep;
+ struct stat statbuf;
+
+ /* Ignore . and .., plus any other "hidden" files */
+ if (name[0] == '.')
+ continue;
+
+ snprintf(tzdir + tzdir_orig_len, MAXPGPATH - tzdir_orig_len,
+ "/%s", name);
+
+ if (stat(tzdir, &statbuf) != 0)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not stat \"%s\": %s\n",
+ tzdir, strerror(errno));
+#endif
+ tzdir[tzdir_orig_len] = '\0';
+ continue;
+ }
+
+ if (S_ISDIR(statbuf.st_mode))
+ {
+ /* Recurse into subdirectory */
+ scan_available_timezones(tzdir, tzdirsub, tt,
+ bestscore, bestzonename);
+ }
+ else
+ {
+ /* Load and test this file */
+ int score = score_timezone(tzdirsub, tt);
+
+ if (score > *bestscore)
+ {
+ *bestscore = score;
+ strlcpy(bestzonename, tzdirsub, TZ_STRLEN_MAX + 1);
+ }
+ else if (score == *bestscore)
+ {
+ /* Consider how to break a tie */
+ int namepref = (zone_name_pref(tzdirsub) -
+ zone_name_pref(bestzonename));
+
+ if (namepref > 0 ||
+ (namepref == 0 &&
+ (strlen(tzdirsub) < strlen(bestzonename) ||
+ (strlen(tzdirsub) == strlen(bestzonename) &&
+ strcmp(tzdirsub, bestzonename) < 0))))
+ strlcpy(bestzonename, tzdirsub, TZ_STRLEN_MAX + 1);
+ }
+ }
+
+ /* Restore tzdir */
+ tzdir[tzdir_orig_len] = '\0';
+ }
+
+ pgfnames_cleanup(names);
+}
+#else /* WIN32 */
+
+static const struct
+{
+ const char *stdname; /* Windows name of standard timezone */
+ const char *dstname; /* Windows name of daylight timezone */
+ const char *pgtzname; /* Name of pgsql timezone to map to */
+} win32_tzmap[] =
+
+{
+ /*
+ * This list was built from the contents of the registry at
+ * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time
+ * Zones on Windows 7, Windows 10, and Windows Server 2019. Some recent
+ * additions have been made by comparing to the CLDR project's
+ * windowsZones.xml file.
+ *
+ * The zones have been matched to IANA timezones based on CLDR's mapping
+ * for "territory 001".
+ */
+ {
+ /* (UTC+04:30) Kabul */
+ "Afghanistan Standard Time", "Afghanistan Daylight Time",
+ "Asia/Kabul"
+ },
+ {
+ /* (UTC-09:00) Alaska */
+ "Alaskan Standard Time", "Alaskan Daylight Time",
+ "America/Anchorage"
+ },
+ {
+ /* (UTC-10:00) Aleutian Islands */
+ "Aleutian Standard Time", "Aleutian Daylight Time",
+ "America/Adak"
+ },
+ {
+ /* (UTC+07:00) Barnaul, Gorno-Altaysk */
+ "Altai Standard Time", "Altai Daylight Time",
+ "Asia/Barnaul"
+ },
+ {
+ /* (UTC+03:00) Kuwait, Riyadh */
+ "Arab Standard Time", "Arab Daylight Time",
+ "Asia/Riyadh"
+ },
+ {
+ /* (UTC+04:00) Abu Dhabi, Muscat */
+ "Arabian Standard Time", "Arabian Daylight Time",
+ "Asia/Dubai"
+ },
+ {
+ /* (UTC+03:00) Baghdad */
+ "Arabic Standard Time", "Arabic Daylight Time",
+ "Asia/Baghdad"
+ },
+ {
+ /* (UTC-03:00) City of Buenos Aires */
+ "Argentina Standard Time", "Argentina Daylight Time",
+ "America/Buenos_Aires"
+ },
+ {
+ /* (UTC+04:00) Baku, Tbilisi, Yerevan */
+ "Armenian Standard Time", "Armenian Daylight Time",
+ "Asia/Yerevan"
+ },
+ {
+ /* (UTC+04:00) Astrakhan, Ulyanovsk */
+ "Astrakhan Standard Time", "Astrakhan Daylight Time",
+ "Europe/Astrakhan"
+ },
+ {
+ /* (UTC-04:00) Atlantic Time (Canada) */
+ "Atlantic Standard Time", "Atlantic Daylight Time",
+ "America/Halifax"
+ },
+ {
+ /* (UTC+09:30) Darwin */
+ "AUS Central Standard Time", "AUS Central Daylight Time",
+ "Australia/Darwin"
+ },
+ {
+ /* (UTC+08:45) Eucla */
+ "Aus Central W. Standard Time", "Aus Central W. Daylight Time",
+ "Australia/Eucla"
+ },
+ {
+ /* (UTC+10:00) Canberra, Melbourne, Sydney */
+ "AUS Eastern Standard Time", "AUS Eastern Daylight Time",
+ "Australia/Sydney"
+ },
+ {
+ /* (UTC+04:00) Baku */
+ "Azerbaijan Standard Time", "Azerbaijan Daylight Time",
+ "Asia/Baku"
+ },
+ {
+ /* (UTC-01:00) Azores */
+ "Azores Standard Time", "Azores Daylight Time",
+ "Atlantic/Azores"
+ },
+ {
+ /* (UTC-03:00) Salvador */
+ "Bahia Standard Time", "Bahia Daylight Time",
+ "America/Bahia"
+ },
+ {
+ /* (UTC+06:00) Dhaka */
+ "Bangladesh Standard Time", "Bangladesh Daylight Time",
+ "Asia/Dhaka"
+ },
+ {
+ /* (UTC+03:00) Minsk */
+ "Belarus Standard Time", "Belarus Daylight Time",
+ "Europe/Minsk"
+ },
+ {
+ /* (UTC+11:00) Bougainville Island */
+ "Bougainville Standard Time", "Bougainville Daylight Time",
+ "Pacific/Bougainville"
+ },
+ {
+ /* (UTC-01:00) Cabo Verde Is. */
+ "Cabo Verde Standard Time", "Cabo Verde Daylight Time",
+ "Atlantic/Cape_Verde"
+ },
+ {
+ /* (UTC-06:00) Saskatchewan */
+ "Canada Central Standard Time", "Canada Central Daylight Time",
+ "America/Regina"
+ },
+ {
+ /* (UTC-01:00) Cape Verde Is. */
+ "Cape Verde Standard Time", "Cape Verde Daylight Time",
+ "Atlantic/Cape_Verde"
+ },
+ {
+ /* (UTC+04:00) Yerevan */
+ "Caucasus Standard Time", "Caucasus Daylight Time",
+ "Asia/Yerevan"
+ },
+ {
+ /* (UTC+09:30) Adelaide */
+ "Cen. Australia Standard Time", "Cen. Australia Daylight Time",
+ "Australia/Adelaide"
+ },
+ {
+ /* (UTC-06:00) Central America */
+ "Central America Standard Time", "Central America Daylight Time",
+ "America/Guatemala"
+ },
+ {
+ /* (UTC+06:00) Astana */
+ "Central Asia Standard Time", "Central Asia Daylight Time",
+ "Asia/Almaty"
+ },
+ {
+ /* (UTC-04:00) Cuiaba */
+ "Central Brazilian Standard Time", "Central Brazilian Daylight Time",
+ "America/Cuiaba"
+ },
+ {
+ /* (UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague */
+ "Central Europe Standard Time", "Central Europe Daylight Time",
+ "Europe/Budapest"
+ },
+ {
+ /* (UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb */
+ "Central European Standard Time", "Central European Daylight Time",
+ "Europe/Warsaw"
+ },
+ {
+ /* (UTC+11:00) Solomon Is., New Caledonia */
+ "Central Pacific Standard Time", "Central Pacific Daylight Time",
+ "Pacific/Guadalcanal"
+ },
+ {
+ /* (UTC-06:00) Central Time (US & Canada) */
+ "Central Standard Time", "Central Daylight Time",
+ "America/Chicago"
+ },
+ {
+ /* (UTC-06:00) Guadalajara, Mexico City, Monterrey */
+ "Central Standard Time (Mexico)", "Central Daylight Time (Mexico)",
+ "America/Mexico_City"
+ },
+ {
+ /* (UTC+12:45) Chatham Islands */
+ "Chatham Islands Standard Time", "Chatham Islands Daylight Time",
+ "Pacific/Chatham"
+ },
+ {
+ /* (UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi */
+ "China Standard Time", "China Daylight Time",
+ "Asia/Shanghai"
+ },
+ {
+ /* (UTC) Coordinated Universal Time */
+ "Coordinated Universal Time", "Coordinated Universal Time",
+ "UTC"
+ },
+ {
+ /* (UTC-05:00) Havana */
+ "Cuba Standard Time", "Cuba Daylight Time",
+ "America/Havana"
+ },
+ {
+ /* (UTC-12:00) International Date Line West */
+ "Dateline Standard Time", "Dateline Daylight Time",
+ "Etc/GMT+12"
+ },
+ {
+ /* (UTC+03:00) Nairobi */
+ "E. Africa Standard Time", "E. Africa Daylight Time",
+ "Africa/Nairobi"
+ },
+ {
+ /* (UTC+10:00) Brisbane */
+ "E. Australia Standard Time", "E. Australia Daylight Time",
+ "Australia/Brisbane"
+ },
+ {
+ /* (UTC+02:00) Chisinau */
+ "E. Europe Standard Time", "E. Europe Daylight Time",
+ "Europe/Chisinau"
+ },
+ {
+ /* (UTC-03:00) Brasilia */
+ "E. South America Standard Time", "E. South America Daylight Time",
+ "America/Sao_Paulo"
+ },
+ {
+ /* (UTC-06:00) Easter Island */
+ "Easter Island Standard Time", "Easter Island Daylight Time",
+ "Pacific/Easter"
+ },
+ {
+ /* (UTC-05:00) Eastern Time (US & Canada) */
+ "Eastern Standard Time", "Eastern Daylight Time",
+ "America/New_York"
+ },
+ {
+ /* (UTC-05:00) Chetumal */
+ "Eastern Standard Time (Mexico)", "Eastern Daylight Time (Mexico)",
+ "America/Cancun"
+ },
+ {
+ /* (UTC+02:00) Cairo */
+ "Egypt Standard Time", "Egypt Daylight Time",
+ "Africa/Cairo"
+ },
+ {
+ /* (UTC+05:00) Ekaterinburg */
+ "Ekaterinburg Standard Time", "Ekaterinburg Daylight Time",
+ "Asia/Yekaterinburg"
+ },
+ {
+ /* (UTC+12:00) Fiji */
+ "Fiji Standard Time", "Fiji Daylight Time",
+ "Pacific/Fiji"
+ },
+ {
+ /* (UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius */
+ "FLE Standard Time", "FLE Daylight Time",
+ "Europe/Kiev"
+ },
+ {
+ /* (UTC+04:00) Tbilisi */
+ "Georgian Standard Time", "Georgian Daylight Time",
+ "Asia/Tbilisi"
+ },
+ {
+ /* (UTC+00:00) Dublin, Edinburgh, Lisbon, London */
+ "GMT Standard Time", "GMT Daylight Time",
+ "Europe/London"
+ },
+ {
+ /* (UTC-03:00) Greenland */
+ "Greenland Standard Time", "Greenland Daylight Time",
+ "America/Godthab"
+ },
+ {
+ /*
+ * Windows uses this zone name in various places that lie near the
+ * prime meridian, but are not in the UK. However, most people
+ * probably think that "Greenwich" means UK civil time, or maybe even
+ * straight-up UTC. Atlantic/Reykjavik is a decent match for that
+ * interpretation because Iceland hasn't observed DST since 1968.
+ */
+ /* (UTC+00:00) Monrovia, Reykjavik */
+ "Greenwich Standard Time", "Greenwich Daylight Time",
+ "Atlantic/Reykjavik"
+ },
+ {
+ /* (UTC+02:00) Athens, Bucharest */
+ "GTB Standard Time", "GTB Daylight Time",
+ "Europe/Bucharest"
+ },
+ {
+ /* (UTC-05:00) Haiti */
+ "Haiti Standard Time", "Haiti Daylight Time",
+ "America/Port-au-Prince"
+ },
+ {
+ /* (UTC-10:00) Hawaii */
+ "Hawaiian Standard Time", "Hawaiian Daylight Time",
+ "Pacific/Honolulu"
+ },
+ {
+ /* (UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi */
+ "India Standard Time", "India Daylight Time",
+ "Asia/Calcutta"
+ },
+ {
+ /* (UTC+03:30) Tehran */
+ "Iran Standard Time", "Iran Daylight Time",
+ "Asia/Tehran"
+ },
+ {
+ /* (UTC+02:00) Jerusalem */
+ "Israel Standard Time", "Israel Daylight Time",
+ "Asia/Jerusalem"
+ },
+ {
+ /* (UTC+02:00) Jerusalem (old spelling of zone name) */
+ "Jerusalem Standard Time", "Jerusalem Daylight Time",
+ "Asia/Jerusalem"
+ },
+ {
+ /* (UTC+02:00) Amman */
+ "Jordan Standard Time", "Jordan Daylight Time",
+ "Asia/Amman"
+ },
+ {
+ /* (UTC+02:00) Kaliningrad */
+ "Kaliningrad Standard Time", "Kaliningrad Daylight Time",
+ "Europe/Kaliningrad"
+ },
+ {
+ /* (UTC+12:00) Petropavlovsk-Kamchatsky - Old */
+ "Kamchatka Standard Time", "Kamchatka Daylight Time",
+ "Asia/Kamchatka"
+ },
+ {
+ /* (UTC+09:00) Seoul */
+ "Korea Standard Time", "Korea Daylight Time",
+ "Asia/Seoul"
+ },
+ {
+ /* (UTC+02:00) Tripoli */
+ "Libya Standard Time", "Libya Daylight Time",
+ "Africa/Tripoli"
+ },
+ {
+ /* (UTC+14:00) Kiritimati Island */
+ "Line Islands Standard Time", "Line Islands Daylight Time",
+ "Pacific/Kiritimati"
+ },
+ {
+ /* (UTC+10:30) Lord Howe Island */
+ "Lord Howe Standard Time", "Lord Howe Daylight Time",
+ "Australia/Lord_Howe"
+ },
+ {
+ /* (UTC+11:00) Magadan */
+ "Magadan Standard Time", "Magadan Daylight Time",
+ "Asia/Magadan"
+ },
+ {
+ /* (UTC-03:00) Punta Arenas */
+ "Magallanes Standard Time", "Magallanes Daylight Time",
+ "America/Punta_Arenas"
+ },
+ {
+ /* (UTC+08:00) Kuala Lumpur, Singapore */
+ "Malay Peninsula Standard Time", "Malay Peninsula Daylight Time",
+ "Asia/Kuala_Lumpur"
+ },
+ {
+ /* (UTC-09:30) Marquesas Islands */
+ "Marquesas Standard Time", "Marquesas Daylight Time",
+ "Pacific/Marquesas"
+ },
+ {
+ /* (UTC+04:00) Port Louis */
+ "Mauritius Standard Time", "Mauritius Daylight Time",
+ "Indian/Mauritius"
+ },
+ {
+ /* (UTC-06:00) Guadalajara, Mexico City, Monterrey */
+ "Mexico Standard Time", "Mexico Daylight Time",
+ "America/Mexico_City"
+ },
+ {
+ /* (UTC-07:00) Chihuahua, La Paz, Mazatlan */
+ "Mexico Standard Time 2", "Mexico Daylight Time 2",
+ "America/Chihuahua"
+ },
+ {
+ /* (UTC-02:00) Mid-Atlantic - Old */
+ "Mid-Atlantic Standard Time", "Mid-Atlantic Daylight Time",
+ "Atlantic/South_Georgia"
+ },
+ {
+ /* (UTC+02:00) Beirut */
+ "Middle East Standard Time", "Middle East Daylight Time",
+ "Asia/Beirut"
+ },
+ {
+ /* (UTC-03:00) Montevideo */
+ "Montevideo Standard Time", "Montevideo Daylight Time",
+ "America/Montevideo"
+ },
+ {
+ /* (UTC+01:00) Casablanca */
+ "Morocco Standard Time", "Morocco Daylight Time",
+ "Africa/Casablanca"
+ },
+ {
+ /* (UTC-07:00) Mountain Time (US & Canada) */
+ "Mountain Standard Time", "Mountain Daylight Time",
+ "America/Denver"
+ },
+ {
+ /* (UTC-07:00) Chihuahua, La Paz, Mazatlan */
+ "Mountain Standard Time (Mexico)", "Mountain Daylight Time (Mexico)",
+ "America/Chihuahua"
+ },
+ {
+ /* (UTC+06:30) Yangon (Rangoon) */
+ "Myanmar Standard Time", "Myanmar Daylight Time",
+ "Asia/Rangoon"
+ },
+ {
+ /* (UTC+07:00) Novosibirsk */
+ "N. Central Asia Standard Time", "N. Central Asia Daylight Time",
+ "Asia/Novosibirsk"
+ },
+ {
+ /* (UTC+02:00) Windhoek */
+ "Namibia Standard Time", "Namibia Daylight Time",
+ "Africa/Windhoek"
+ },
+ {
+ /* (UTC+05:45) Kathmandu */
+ "Nepal Standard Time", "Nepal Daylight Time",
+ "Asia/Katmandu"
+ },
+ {
+ /* (UTC+12:00) Auckland, Wellington */
+ "New Zealand Standard Time", "New Zealand Daylight Time",
+ "Pacific/Auckland"
+ },
+ {
+ /* (UTC-03:30) Newfoundland */
+ "Newfoundland Standard Time", "Newfoundland Daylight Time",
+ "America/St_Johns"
+ },
+ {
+ /* (UTC+11:00) Norfolk Island */
+ "Norfolk Standard Time", "Norfolk Daylight Time",
+ "Pacific/Norfolk"
+ },
+ {
+ /* (UTC+08:00) Irkutsk */
+ "North Asia East Standard Time", "North Asia East Daylight Time",
+ "Asia/Irkutsk"
+ },
+ {
+ /* (UTC+07:00) Krasnoyarsk */
+ "North Asia Standard Time", "North Asia Daylight Time",
+ "Asia/Krasnoyarsk"
+ },
+ {
+ /* (UTC+09:00) Pyongyang */
+ "North Korea Standard Time", "North Korea Daylight Time",
+ "Asia/Pyongyang"
+ },
+ {
+ /* (UTC+07:00) Novosibirsk */
+ "Novosibirsk Standard Time", "Novosibirsk Daylight Time",
+ "Asia/Novosibirsk"
+ },
+ {
+ /* (UTC+06:00) Omsk */
+ "Omsk Standard Time", "Omsk Daylight Time",
+ "Asia/Omsk"
+ },
+ {
+ /* (UTC-04:00) Santiago */
+ "Pacific SA Standard Time", "Pacific SA Daylight Time",
+ "America/Santiago"
+ },
+ {
+ /* (UTC-08:00) Pacific Time (US & Canada) */
+ "Pacific Standard Time", "Pacific Daylight Time",
+ "America/Los_Angeles"
+ },
+ {
+ /* (UTC-08:00) Baja California */
+ "Pacific Standard Time (Mexico)", "Pacific Daylight Time (Mexico)",
+ "America/Tijuana"
+ },
+ {
+ /* (UTC+05:00) Islamabad, Karachi */
+ "Pakistan Standard Time", "Pakistan Daylight Time",
+ "Asia/Karachi"
+ },
+ {
+ /* (UTC-04:00) Asuncion */
+ "Paraguay Standard Time", "Paraguay Daylight Time",
+ "America/Asuncion"
+ },
+ {
+ /* (UTC+05:00) Qyzylorda */
+ "Qyzylorda Standard Time", "Qyzylorda Daylight Time",
+ "Asia/Qyzylorda"
+ },
+ {
+ /* (UTC+01:00) Brussels, Copenhagen, Madrid, Paris */
+ "Romance Standard Time", "Romance Daylight Time",
+ "Europe/Paris"
+ },
+ {
+ /* (UTC+04:00) Izhevsk, Samara */
+ "Russia Time Zone 3", "Russia Time Zone 3",
+ "Europe/Samara"
+ },
+ {
+ /* (UTC+11:00) Chokurdakh */
+ "Russia Time Zone 10", "Russia Time Zone 10",
+ "Asia/Srednekolymsk"
+ },
+ {
+ /* (UTC+12:00) Anadyr, Petropavlovsk-Kamchatsky */
+ "Russia Time Zone 11", "Russia Time Zone 11",
+ "Asia/Kamchatka"
+ },
+ {
+ /* (UTC+02:00) Kaliningrad */
+ "Russia TZ 1 Standard Time", "Russia TZ 1 Daylight Time",
+ "Europe/Kaliningrad"
+ },
+ {
+ /* (UTC+03:00) Moscow, St. Petersburg */
+ "Russia TZ 2 Standard Time", "Russia TZ 2 Daylight Time",
+ "Europe/Moscow"
+ },
+ {
+ /* (UTC+04:00) Izhevsk, Samara */
+ "Russia TZ 3 Standard Time", "Russia TZ 3 Daylight Time",
+ "Europe/Samara"
+ },
+ {
+ /* (UTC+05:00) Ekaterinburg */
+ "Russia TZ 4 Standard Time", "Russia TZ 4 Daylight Time",
+ "Asia/Yekaterinburg"
+ },
+ {
+ /* (UTC+06:00) Novosibirsk (RTZ 5) */
+ "Russia TZ 5 Standard Time", "Russia TZ 5 Daylight Time",
+ "Asia/Novosibirsk"
+ },
+ {
+ /* (UTC+07:00) Krasnoyarsk */
+ "Russia TZ 6 Standard Time", "Russia TZ 6 Daylight Time",
+ "Asia/Krasnoyarsk"
+ },
+ {
+ /* (UTC+08:00) Irkutsk */
+ "Russia TZ 7 Standard Time", "Russia TZ 7 Daylight Time",
+ "Asia/Irkutsk"
+ },
+ {
+ /* (UTC+09:00) Yakutsk */
+ "Russia TZ 8 Standard Time", "Russia TZ 8 Daylight Time",
+ "Asia/Yakutsk"
+ },
+ {
+ /* (UTC+10:00) Vladivostok */
+ "Russia TZ 9 Standard Time", "Russia TZ 9 Daylight Time",
+ "Asia/Vladivostok"
+ },
+ {
+ /* (UTC+11:00) Chokurdakh */
+ "Russia TZ 10 Standard Time", "Russia TZ 10 Daylight Time",
+ "Asia/Magadan"
+ },
+ {
+ /* (UTC+12:00) Anadyr, Petropavlovsk-Kamchatsky */
+ "Russia TZ 11 Standard Time", "Russia TZ 11 Daylight Time",
+ "Asia/Anadyr"
+ },
+ {
+ /* (UTC+03:00) Moscow, St. Petersburg */
+ "Russian Standard Time", "Russian Daylight Time",
+ "Europe/Moscow"
+ },
+ {
+ /* (UTC-03:00) Cayenne, Fortaleza */
+ "SA Eastern Standard Time", "SA Eastern Daylight Time",
+ "America/Cayenne"
+ },
+ {
+ /* (UTC-05:00) Bogota, Lima, Quito, Rio Branco */
+ "SA Pacific Standard Time", "SA Pacific Daylight Time",
+ "America/Bogota"
+ },
+ {
+ /* (UTC-04:00) Georgetown, La Paz, Manaus, San Juan */
+ "SA Western Standard Time", "SA Western Daylight Time",
+ "America/La_Paz"
+ },
+ {
+ /* (UTC-03:00) Saint Pierre and Miquelon */
+ "Saint Pierre Standard Time", "Saint Pierre Daylight Time",
+ "America/Miquelon"
+ },
+ {
+ /* (UTC+11:00) Sakhalin */
+ "Sakhalin Standard Time", "Sakhalin Daylight Time",
+ "Asia/Sakhalin"
+ },
+ {
+ /* (UTC+13:00) Samoa */
+ "Samoa Standard Time", "Samoa Daylight Time",
+ "Pacific/Apia"
+ },
+ {
+ /* (UTC+00:00) Sao Tome */
+ "Sao Tome Standard Time", "Sao Tome Daylight Time",
+ "Africa/Sao_Tome"
+ },
+ {
+ /* (UTC+04:00) Saratov */
+ "Saratov Standard Time", "Saratov Daylight Time",
+ "Europe/Saratov"
+ },
+ {
+ /* (UTC+07:00) Bangkok, Hanoi, Jakarta */
+ "SE Asia Standard Time", "SE Asia Daylight Time",
+ "Asia/Bangkok"
+ },
+ {
+ /* (UTC+08:00) Kuala Lumpur, Singapore */
+ "Singapore Standard Time", "Singapore Daylight Time",
+ "Asia/Singapore"
+ },
+ {
+ /* (UTC+02:00) Harare, Pretoria */
+ "South Africa Standard Time", "South Africa Daylight Time",
+ "Africa/Johannesburg"
+ },
+ {
+ /* (UTC+02:00) Juba */
+ "South Sudan Standard Time", "South Sudan Daylight Time",
+ "Africa/Juba"
+ },
+ {
+ /* (UTC+05:30) Sri Jayawardenepura */
+ "Sri Lanka Standard Time", "Sri Lanka Daylight Time",
+ "Asia/Colombo"
+ },
+ {
+ /* (UTC+02:00) Khartoum */
+ "Sudan Standard Time", "Sudan Daylight Time",
+ "Africa/Khartoum"
+ },
+ {
+ /* (UTC+02:00) Damascus */
+ "Syria Standard Time", "Syria Daylight Time",
+ "Asia/Damascus"
+ },
+ {
+ /* (UTC+08:00) Taipei */
+ "Taipei Standard Time", "Taipei Daylight Time",
+ "Asia/Taipei"
+ },
+ {
+ /* (UTC+10:00) Hobart */
+ "Tasmania Standard Time", "Tasmania Daylight Time",
+ "Australia/Hobart"
+ },
+ {
+ /* (UTC-03:00) Araguaina */
+ "Tocantins Standard Time", "Tocantins Daylight Time",
+ "America/Araguaina"
+ },
+ {
+ /* (UTC+09:00) Osaka, Sapporo, Tokyo */
+ "Tokyo Standard Time", "Tokyo Daylight Time",
+ "Asia/Tokyo"
+ },
+ {
+ /* (UTC+07:00) Tomsk */
+ "Tomsk Standard Time", "Tomsk Daylight Time",
+ "Asia/Tomsk"
+ },
+ {
+ /* (UTC+13:00) Nuku'alofa */
+ "Tonga Standard Time", "Tonga Daylight Time",
+ "Pacific/Tongatapu"
+ },
+ {
+ /* (UTC+09:00) Chita */
+ "Transbaikal Standard Time", "Transbaikal Daylight Time",
+ "Asia/Chita"
+ },
+ {
+ /* (UTC+03:00) Istanbul */
+ "Turkey Standard Time", "Turkey Daylight Time",
+ "Europe/Istanbul"
+ },
+ {
+ /* (UTC-05:00) Turks and Caicos */
+ "Turks And Caicos Standard Time", "Turks And Caicos Daylight Time",
+ "America/Grand_Turk"
+ },
+ {
+ /* (UTC+08:00) Ulaanbaatar */
+ "Ulaanbaatar Standard Time", "Ulaanbaatar Daylight Time",
+ "Asia/Ulaanbaatar"
+ },
+ {
+ /* (UTC-05:00) Indiana (East) */
+ "US Eastern Standard Time", "US Eastern Daylight Time",
+ "America/Indianapolis"
+ },
+ {
+ /* (UTC-07:00) Arizona */
+ "US Mountain Standard Time", "US Mountain Daylight Time",
+ "America/Phoenix"
+ },
+ {
+ /* (UTC) Coordinated Universal Time */
+ "UTC", "UTC",
+ "UTC"
+ },
+ {
+ /* (UTC+12:00) Coordinated Universal Time+12 */
+ "UTC+12", "UTC+12",
+ "Etc/GMT-12"
+ },
+ {
+ /* (UTC+13:00) Coordinated Universal Time+13 */
+ "UTC+13", "UTC+13",
+ "Etc/GMT-13"
+ },
+ {
+ /* (UTC-02:00) Coordinated Universal Time-02 */
+ "UTC-02", "UTC-02",
+ "Etc/GMT+2"
+ },
+ {
+ /* (UTC-08:00) Coordinated Universal Time-08 */
+ "UTC-08", "UTC-08",
+ "Etc/GMT+8"
+ },
+ {
+ /* (UTC-09:00) Coordinated Universal Time-09 */
+ "UTC-09", "UTC-09",
+ "Etc/GMT+9"
+ },
+ {
+ /* (UTC-11:00) Coordinated Universal Time-11 */
+ "UTC-11", "UTC-11",
+ "Etc/GMT+11"
+ },
+ {
+ /* (UTC-04:00) Caracas */
+ "Venezuela Standard Time", "Venezuela Daylight Time",
+ "America/Caracas"
+ },
+ {
+ /* (UTC+10:00) Vladivostok */
+ "Vladivostok Standard Time", "Vladivostok Daylight Time",
+ "Asia/Vladivostok"
+ },
+ {
+ /* (UTC+04:00) Volgograd */
+ "Volgograd Standard Time", "Volgograd Daylight Time",
+ "Europe/Volgograd"
+ },
+ {
+ /* (UTC+08:00) Perth */
+ "W. Australia Standard Time", "W. Australia Daylight Time",
+ "Australia/Perth"
+ },
+ {
+ /* (UTC+01:00) West Central Africa */
+ "W. Central Africa Standard Time", "W. Central Africa Daylight Time",
+ "Africa/Lagos"
+ },
+ {
+ /* (UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna */
+ "W. Europe Standard Time", "W. Europe Daylight Time",
+ "Europe/Berlin"
+ },
+ {
+ /* (UTC+07:00) Hovd */
+ "W. Mongolia Standard Time", "W. Mongolia Daylight Time",
+ "Asia/Hovd"
+ },
+ {
+ /* (UTC+05:00) Ashgabat, Tashkent */
+ "West Asia Standard Time", "West Asia Daylight Time",
+ "Asia/Tashkent"
+ },
+ {
+ /* (UTC+02:00) Gaza, Hebron */
+ "West Bank Gaza Standard Time", "West Bank Gaza Daylight Time",
+ "Asia/Gaza"
+ },
+ {
+ /* (UTC+02:00) Gaza, Hebron */
+ "West Bank Standard Time", "West Bank Daylight Time",
+ "Asia/Hebron"
+ },
+ {
+ /* (UTC+10:00) Guam, Port Moresby */
+ "West Pacific Standard Time", "West Pacific Daylight Time",
+ "Pacific/Port_Moresby"
+ },
+ {
+ /* (UTC+09:00) Yakutsk */
+ "Yakutsk Standard Time", "Yakutsk Daylight Time",
+ "Asia/Yakutsk"
+ },
+ {
+ /* (UTC-07:00) Yukon */
+ "Yukon Standard Time", "Yukon Daylight Time",
+ "America/Whitehorse"
+ },
+ {
+ NULL, NULL, NULL
+ }
+};
+
+static const char *
+identify_system_timezone(void)
+{
+ int i;
+ char tzname[128];
+ char localtzname[256];
+ time_t t = time(NULL);
+ struct tm *tm = localtime(&t);
+ HKEY rootKey;
+ int idx;
+
+ if (!tm)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not identify system time zone: localtime() failed\n");
+#endif
+ return NULL; /* go to GMT */
+ }
+
+ memset(tzname, 0, sizeof(tzname));
+ strftime(tzname, sizeof(tzname) - 1, "%Z", tm);
+
+ for (i = 0; win32_tzmap[i].stdname != NULL; i++)
+ {
+ if (strcmp(tzname, win32_tzmap[i].stdname) == 0 ||
+ strcmp(tzname, win32_tzmap[i].dstname) == 0)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "TZ \"%s\" matches system time zone \"%s\"\n",
+ win32_tzmap[i].pgtzname, tzname);
+#endif
+ return win32_tzmap[i].pgtzname;
+ }
+ }
+
+ /*
+ * Localized Windows versions return localized names for the timezone.
+ * Scan the registry to find the English name, and then try matching
+ * against our table again.
+ */
+ memset(localtzname, 0, sizeof(localtzname));
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+ "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones",
+ 0,
+ KEY_READ,
+ &rootKey) != ERROR_SUCCESS)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not open registry key to identify system time zone: error code %lu\n",
+ GetLastError());
+#endif
+ return NULL; /* go to GMT */
+ }
+
+ for (idx = 0;; idx++)
+ {
+ char keyname[256];
+ char zonename[256];
+ DWORD namesize;
+ FILETIME lastwrite;
+ HKEY key;
+ LONG r;
+
+ memset(keyname, 0, sizeof(keyname));
+ namesize = sizeof(keyname);
+ if ((r = RegEnumKeyEx(rootKey,
+ idx,
+ keyname,
+ &namesize,
+ NULL,
+ NULL,
+ NULL,
+ &lastwrite)) != ERROR_SUCCESS)
+ {
+ if (r == ERROR_NO_MORE_ITEMS)
+ break;
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not enumerate registry subkeys to identify system time zone: %d\n",
+ (int) r);
+#endif
+ break;
+ }
+
+ if ((r = RegOpenKeyEx(rootKey, keyname, 0, KEY_READ, &key)) != ERROR_SUCCESS)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not open registry subkey to identify system time zone: %d\n",
+ (int) r);
+#endif
+ break;
+ }
+
+ memset(zonename, 0, sizeof(zonename));
+ namesize = sizeof(zonename);
+ if ((r = RegQueryValueEx(key, "Std", NULL, NULL, (unsigned char *) zonename, &namesize)) != ERROR_SUCCESS)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not query value for key \"std\" to identify system time zone \"%s\": %d\n",
+ keyname, (int) r);
+#endif
+ RegCloseKey(key);
+ continue; /* Proceed to look at the next timezone */
+ }
+ if (strcmp(tzname, zonename) == 0)
+ {
+ /* Matched zone */
+ strcpy(localtzname, keyname);
+ RegCloseKey(key);
+ break;
+ }
+ memset(zonename, 0, sizeof(zonename));
+ namesize = sizeof(zonename);
+ if ((r = RegQueryValueEx(key, "Dlt", NULL, NULL, (unsigned char *) zonename, &namesize)) != ERROR_SUCCESS)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not query value for key \"dlt\" to identify system time zone \"%s\": %d\n",
+ keyname, (int) r);
+#endif
+ RegCloseKey(key);
+ continue; /* Proceed to look at the next timezone */
+ }
+ if (strcmp(tzname, zonename) == 0)
+ {
+ /* Matched DST zone */
+ strcpy(localtzname, keyname);
+ RegCloseKey(key);
+ break;
+ }
+
+ RegCloseKey(key);
+ }
+
+ RegCloseKey(rootKey);
+
+ if (localtzname[0])
+ {
+ /* Found a localized name, so scan for that one too */
+ for (i = 0; win32_tzmap[i].stdname != NULL; i++)
+ {
+ if (strcmp(localtzname, win32_tzmap[i].stdname) == 0 ||
+ strcmp(localtzname, win32_tzmap[i].dstname) == 0)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "TZ \"%s\" matches localized system time zone \"%s\" (\"%s\")\n",
+ win32_tzmap[i].pgtzname, tzname, localtzname);
+#endif
+ return win32_tzmap[i].pgtzname;
+ }
+ }
+ }
+
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not find a match for system time zone \"%s\"\n",
+ tzname);
+#endif
+ return NULL; /* go to GMT */
+}
+#endif /* WIN32 */
+
+
+/*
+ * Return true if the given zone name is valid and is an "acceptable" zone.
+ */
+static bool
+validate_zone(const char *tzname)
+{
+ pg_tz *tz;
+
+ if (!tzname || !tzname[0])
+ return false;
+
+ tz = pg_load_tz(tzname);
+ if (!tz)
+ return false;
+
+ if (!pg_tz_acceptable(tz))
+ return false;
+
+ return true;
+}
+
+/*
+ * Identify a suitable default timezone setting based on the environment.
+ *
+ * The installation share_path must be passed in, as that is the default
+ * location for the timezone database directory.
+ *
+ * We first look to the TZ environment variable. If not found or not
+ * recognized by our own code, we see if we can identify the timezone
+ * from the behavior of the system timezone library. When all else fails,
+ * return NULL, indicating that we should default to GMT.
+ */
+const char *
+select_default_timezone(const char *share_path)
+{
+ const char *tzname;
+
+ /* Initialize timezone directory path, if needed */
+#ifndef SYSTEMTZDIR
+ snprintf(tzdirpath, sizeof(tzdirpath), "%s/timezone", share_path);
+#endif
+
+ /* Check TZ environment variable */
+ tzname = getenv("TZ");
+ if (validate_zone(tzname))
+ return tzname;
+
+ /* Nope, so try to identify the system timezone */
+ tzname = identify_system_timezone();
+ if (validate_zone(tzname))
+ return tzname;
+
+ return NULL;
+}
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
new file mode 100644
index 0000000..429844f
--- /dev/null
+++ b/src/bin/initdb/initdb.c
@@ -0,0 +1,3191 @@
+/*-------------------------------------------------------------------------
+ *
+ * initdb --- initialize a PostgreSQL installation
+ *
+ * initdb creates (initializes) a PostgreSQL database cluster (site,
+ * instance, installation, whatever). A database cluster is a
+ * collection of PostgreSQL databases all managed by the same server.
+ *
+ * To create the database cluster, we create the directory that contains
+ * all its data, create the files that hold the global tables, create
+ * a few other control files for it, and create three databases: the
+ * template databases "template0" and "template1", and a default user
+ * database "postgres".
+ *
+ * The template databases are ordinary PostgreSQL databases. template0
+ * is never supposed to change after initdb, whereas template1 can be
+ * changed to add site-local standard data. Either one can be copied
+ * to produce a new database.
+ *
+ * For largely-historical reasons, the template1 database is the one built
+ * by the basic bootstrap process. After it is complete, template0 and
+ * the default database, postgres, are made just by copying template1.
+ *
+ * To create template1, we run the postgres (backend) program in bootstrap
+ * mode and feed it data from the postgres.bki library file. After this
+ * initial bootstrap phase, some additional stuff is created by normal
+ * SQL commands fed to a standalone backend. Some of those commands are
+ * just embedded into this program (yeah, it's ugly), but larger chunks
+ * are taken from script files.
+ *
+ *
+ * Note:
+ * The program has some memory leakage - it isn't worth cleaning it up.
+ *
+ * This is a C implementation of the previous shell script for setting up a
+ * PostgreSQL cluster location, and should be highly compatible with it.
+ * author of C translation: Andrew Dunstan mailto:andrew@dunslane.net
+ *
+ * This code is released under the terms of the PostgreSQL License.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/initdb/initdb.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <dirent.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+
+#ifdef HAVE_SHM_OPEN
+#include "sys/mman.h"
+#endif
+
+#include "access/xlog_internal.h"
+#include "catalog/pg_authid_d.h"
+#include "catalog/pg_class_d.h" /* pgrminclude ignore */
+#include "catalog/pg_collation_d.h"
+#include "catalog/pg_database_d.h" /* pgrminclude ignore */
+#include "common/file_perm.h"
+#include "common/file_utils.h"
+#include "common/logging.h"
+#include "common/pg_prng.h"
+#include "common/restricted_token.h"
+#include "common/string.h"
+#include "common/username.h"
+#include "fe_utils/string_utils.h"
+#include "getaddrinfo.h"
+#include "getopt_long.h"
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+
+
+/* Ideally this would be in a .h file, but it hardly seems worth the trouble */
+extern const char *select_default_timezone(const char *share_path);
+
+static const char *const auth_methods_host[] = {
+ "trust", "reject", "scram-sha-256", "md5", "password", "ident", "radius",
+#ifdef ENABLE_GSS
+ "gss",
+#endif
+#ifdef ENABLE_SSPI
+ "sspi",
+#endif
+#ifdef USE_PAM
+ "pam", "pam ",
+#endif
+#ifdef USE_BSD_AUTH
+ "bsd",
+#endif
+#ifdef USE_LDAP
+ "ldap",
+#endif
+#ifdef USE_SSL
+ "cert",
+#endif
+ NULL
+};
+static const char *const auth_methods_local[] = {
+ "trust", "reject", "scram-sha-256", "md5", "password", "peer", "radius",
+#ifdef USE_PAM
+ "pam", "pam ",
+#endif
+#ifdef USE_BSD_AUTH
+ "bsd",
+#endif
+#ifdef USE_LDAP
+ "ldap",
+#endif
+ NULL
+};
+
+/*
+ * these values are passed in by makefile defines
+ */
+static char *share_path = NULL;
+
+/* values to be obtained from arguments */
+static char *pg_data = NULL;
+static char *encoding = NULL;
+static char *locale = NULL;
+static char *lc_collate = NULL;
+static char *lc_ctype = NULL;
+static char *lc_monetary = NULL;
+static char *lc_numeric = NULL;
+static char *lc_time = NULL;
+static char *lc_messages = NULL;
+static char locale_provider = COLLPROVIDER_LIBC;
+static char *icu_locale = NULL;
+static const char *default_text_search_config = NULL;
+static char *username = NULL;
+static bool pwprompt = false;
+static char *pwfilename = NULL;
+static char *superuser_password = NULL;
+static const char *authmethodhost = NULL;
+static const char *authmethodlocal = NULL;
+static bool debug = false;
+static bool noclean = false;
+static bool noinstructions = false;
+static bool do_sync = true;
+static bool sync_only = false;
+static bool show_setting = false;
+static bool data_checksums = false;
+static char *xlog_dir = NULL;
+static char *str_wal_segment_size_mb = NULL;
+static int wal_segment_size_mb;
+
+
+/* internal vars */
+static const char *progname;
+static int encodingid;
+static char *bki_file;
+static char *hba_file;
+static char *ident_file;
+static char *conf_file;
+static char *dictionary_file;
+static char *info_schema_file;
+static char *features_file;
+static char *system_constraints_file;
+static char *system_functions_file;
+static char *system_views_file;
+static bool success = false;
+static bool made_new_pgdata = false;
+static bool found_existing_pgdata = false;
+static bool made_new_xlogdir = false;
+static bool found_existing_xlogdir = false;
+static char infoversion[100];
+static bool caught_signal = false;
+static bool output_failed = false;
+static int output_errno = 0;
+static char *pgdata_native;
+
+/* defaults */
+static int n_connections = 10;
+static int n_buffers = 50;
+static const char *dynamic_shared_memory_type = NULL;
+static const char *default_timezone = NULL;
+
+/*
+ * Warning messages for authentication methods
+ */
+#define AUTHTRUST_WARNING \
+"# CAUTION: Configuring the system for local \"trust\" authentication\n" \
+"# allows any local user to connect as any PostgreSQL user, including\n" \
+"# the database superuser. If you do not trust all your local users,\n" \
+"# use another authentication method.\n"
+static bool authwarning = false;
+
+/*
+ * Centralized knowledge of switches to pass to backend
+ *
+ * Note: we run the backend with -F (fsync disabled) and then do a single
+ * pass of fsync'ing at the end. This is faster than fsync'ing each step.
+ *
+ * Note: in the shell-script version, we also passed PGDATA as a -D switch,
+ * but here it is more convenient to pass it as an environment variable
+ * (no quoting to worry about).
+ */
+static const char *boot_options = "-F -c log_checkpoints=false";
+static const char *backend_options = "--single -F -O -j -c search_path=pg_catalog -c exit_on_error=true -c log_checkpoints=false";
+
+/* Additional switches to pass to backend (either boot or standalone) */
+static char *extra_options = "";
+
+static const char *const subdirs[] = {
+ "global",
+ "pg_wal/archive_status",
+ "pg_commit_ts",
+ "pg_dynshmem",
+ "pg_notify",
+ "pg_serial",
+ "pg_snapshots",
+ "pg_subtrans",
+ "pg_twophase",
+ "pg_multixact",
+ "pg_multixact/members",
+ "pg_multixact/offsets",
+ "base",
+ "base/1",
+ "pg_replslot",
+ "pg_tblspc",
+ "pg_stat",
+ "pg_stat_tmp",
+ "pg_xact",
+ "pg_logical",
+ "pg_logical/snapshots",
+ "pg_logical/mappings"
+};
+
+
+/* path to 'initdb' binary directory */
+static char bin_path[MAXPGPATH];
+static char backend_exec[MAXPGPATH];
+
+static char **replace_token(char **lines,
+ const char *token, const char *replacement);
+
+#ifndef HAVE_UNIX_SOCKETS
+static char **filter_lines_with_token(char **lines, const char *token);
+#endif
+static char **readfile(const char *path);
+static void writefile(char *path, char **lines);
+static FILE *popen_check(const char *command, const char *mode);
+static char *get_id(void);
+static int get_encoding_id(const char *encoding_name);
+static void set_input(char **dest, const char *filename);
+static void check_input(char *path);
+static void write_version_file(const char *extrapath);
+static void set_null_conf(void);
+static void test_config_settings(void);
+static void setup_config(void);
+static void bootstrap_template1(void);
+static void setup_auth(FILE *cmdfd);
+static void get_su_pwd(void);
+static void setup_depend(FILE *cmdfd);
+static void setup_run_file(FILE *cmdfd, const char *filename);
+static void setup_description(FILE *cmdfd);
+static void setup_collation(FILE *cmdfd);
+static void setup_privileges(FILE *cmdfd);
+static void set_info_version(void);
+static void setup_schema(FILE *cmdfd);
+static void load_plpgsql(FILE *cmdfd);
+static void vacuum_db(FILE *cmdfd);
+static void make_template0(FILE *cmdfd);
+static void make_postgres(FILE *cmdfd);
+static void trapsig(int signum);
+static void check_ok(void);
+static char *escape_quotes(const char *src);
+static char *escape_quotes_bki(const char *src);
+static int locale_date_order(const char *locale);
+static void check_locale_name(int category, const char *locale,
+ char **canonname);
+static bool check_locale_encoding(const char *locale, int encoding);
+static void setlocales(void);
+static void usage(const char *progname);
+void setup_pgdata(void);
+void setup_bin_paths(const char *argv0);
+void setup_data_file_paths(void);
+void setup_locale_encoding(void);
+void setup_signals(void);
+void setup_text_search(void);
+void create_data_directory(void);
+void create_xlog_or_symlink(void);
+void warn_on_mount_point(int error);
+void initialize_data_directory(void);
+
+/*
+ * macros for running pipes to postgres
+ */
+#define PG_CMD_DECL char cmd[MAXPGPATH]; FILE *cmdfd
+
+#define PG_CMD_OPEN \
+do { \
+ cmdfd = popen_check(cmd, "w"); \
+ if (cmdfd == NULL) \
+ exit(1); /* message already printed by popen_check */ \
+} while (0)
+
+#define PG_CMD_CLOSE \
+do { \
+ if (pclose_check(cmdfd)) \
+ exit(1); /* message already printed by pclose_check */ \
+} while (0)
+
+#define PG_CMD_PUTS(line) \
+do { \
+ if (fputs(line, cmdfd) < 0 || fflush(cmdfd) < 0) \
+ output_failed = true, output_errno = errno; \
+} while (0)
+
+#define PG_CMD_PRINTF(fmt, ...) \
+do { \
+ if (fprintf(cmdfd, fmt, __VA_ARGS__) < 0 || fflush(cmdfd) < 0) \
+ output_failed = true, output_errno = errno; \
+} while (0)
+
+/*
+ * Escape single quotes and backslashes, suitably for insertions into
+ * configuration files or SQL E'' strings.
+ */
+static char *
+escape_quotes(const char *src)
+{
+ char *result = escape_single_quotes_ascii(src);
+
+ if (!result)
+ pg_fatal("out of memory");
+ return result;
+}
+
+/*
+ * Escape a field value to be inserted into the BKI data.
+ * Run the value through escape_quotes (which will be inverted
+ * by the backend's DeescapeQuotedString() function), then wrap
+ * the value in single quotes, even if that isn't strictly necessary.
+ */
+static char *
+escape_quotes_bki(const char *src)
+{
+ char *result;
+ char *data = escape_quotes(src);
+ char *resultp;
+ char *datap;
+
+ result = (char *) pg_malloc(strlen(data) + 3);
+ resultp = result;
+ *resultp++ = '\'';
+ for (datap = data; *datap; datap++)
+ *resultp++ = *datap;
+ *resultp++ = '\'';
+ *resultp = '\0';
+
+ free(data);
+ return result;
+}
+
+/*
+ * make a copy of the array of lines, with token replaced by replacement
+ * the first time it occurs on each line.
+ *
+ * This does most of what sed was used for in the shell script, but
+ * doesn't need any regexp stuff.
+ */
+static char **
+replace_token(char **lines, const char *token, const char *replacement)
+{
+ int numlines = 1;
+ int i;
+ char **result;
+ int toklen,
+ replen,
+ diff;
+
+ for (i = 0; lines[i]; i++)
+ numlines++;
+
+ result = (char **) pg_malloc(numlines * sizeof(char *));
+
+ toklen = strlen(token);
+ replen = strlen(replacement);
+ diff = replen - toklen;
+
+ for (i = 0; i < numlines; i++)
+ {
+ char *where;
+ char *newline;
+ int pre;
+
+ /* just copy pointer if NULL or no change needed */
+ if (lines[i] == NULL || (where = strstr(lines[i], token)) == NULL)
+ {
+ result[i] = lines[i];
+ continue;
+ }
+
+ /* if we get here a change is needed - set up new line */
+
+ newline = (char *) pg_malloc(strlen(lines[i]) + diff + 1);
+
+ pre = where - lines[i];
+
+ memcpy(newline, lines[i], pre);
+
+ memcpy(newline + pre, replacement, replen);
+
+ strcpy(newline + pre + replen, lines[i] + pre + toklen);
+
+ result[i] = newline;
+ }
+
+ return result;
+}
+
+/*
+ * make a copy of lines without any that contain the token
+ *
+ * a sort of poor man's grep -v
+ */
+#ifndef HAVE_UNIX_SOCKETS
+static char **
+filter_lines_with_token(char **lines, const char *token)
+{
+ int numlines = 1;
+ int i,
+ src,
+ dst;
+ char **result;
+
+ for (i = 0; lines[i]; i++)
+ numlines++;
+
+ result = (char **) pg_malloc(numlines * sizeof(char *));
+
+ for (src = 0, dst = 0; src < numlines; src++)
+ {
+ if (lines[src] == NULL || strstr(lines[src], token) == NULL)
+ result[dst++] = lines[src];
+ }
+
+ return result;
+}
+#endif
+
+/*
+ * get the lines from a text file
+ */
+static char **
+readfile(const char *path)
+{
+ char **result;
+ FILE *infile;
+ StringInfoData line;
+ int maxlines;
+ int n;
+
+ if ((infile = fopen(path, "r")) == NULL)
+ pg_fatal("could not open file \"%s\" for reading: %m", path);
+
+ initStringInfo(&line);
+
+ maxlines = 1024;
+ result = (char **) pg_malloc(maxlines * sizeof(char *));
+
+ n = 0;
+ while (pg_get_line_buf(infile, &line))
+ {
+ /* make sure there will be room for a trailing NULL pointer */
+ if (n >= maxlines - 1)
+ {
+ maxlines *= 2;
+ result = (char **) pg_realloc(result, maxlines * sizeof(char *));
+ }
+
+ result[n++] = pg_strdup(line.data);
+ }
+ result[n] = NULL;
+
+ pfree(line.data);
+
+ fclose(infile);
+
+ return result;
+}
+
+/*
+ * write an array of lines to a file
+ *
+ * This is only used to write text files. Use fopen "w" not PG_BINARY_W
+ * so that the resulting configuration files are nicely editable on Windows.
+ */
+static void
+writefile(char *path, char **lines)
+{
+ FILE *out_file;
+ char **line;
+
+ if ((out_file = fopen(path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\" for writing: %m", path);
+ for (line = lines; *line != NULL; line++)
+ {
+ if (fputs(*line, out_file) < 0)
+ pg_fatal("could not write file \"%s\": %m", path);
+ free(*line);
+ }
+ if (fclose(out_file))
+ pg_fatal("could not close file \"%s\": %m", path);
+}
+
+/*
+ * Open a subcommand with suitable error messaging
+ */
+static FILE *
+popen_check(const char *command, const char *mode)
+{
+ FILE *cmdfd;
+
+ fflush(stdout);
+ fflush(stderr);
+ errno = 0;
+ cmdfd = popen(command, mode);
+ if (cmdfd == NULL)
+ pg_log_error("could not execute command \"%s\": %m", command);
+ return cmdfd;
+}
+
+/*
+ * clean up any files we created on failure
+ * if we created the data directory remove it too
+ */
+static void
+cleanup_directories_atexit(void)
+{
+ if (success)
+ return;
+
+ if (!noclean)
+ {
+ if (made_new_pgdata)
+ {
+ pg_log_info("removing data directory \"%s\"", pg_data);
+ if (!rmtree(pg_data, true))
+ pg_log_error("failed to remove data directory");
+ }
+ else if (found_existing_pgdata)
+ {
+ pg_log_info("removing contents of data directory \"%s\"",
+ pg_data);
+ if (!rmtree(pg_data, false))
+ pg_log_error("failed to remove contents of data directory");
+ }
+
+ if (made_new_xlogdir)
+ {
+ pg_log_info("removing WAL directory \"%s\"", xlog_dir);
+ if (!rmtree(xlog_dir, true))
+ pg_log_error("failed to remove WAL directory");
+ }
+ else if (found_existing_xlogdir)
+ {
+ pg_log_info("removing contents of WAL directory \"%s\"", xlog_dir);
+ if (!rmtree(xlog_dir, false))
+ pg_log_error("failed to remove contents of WAL directory");
+ }
+ /* otherwise died during startup, do nothing! */
+ }
+ else
+ {
+ if (made_new_pgdata || found_existing_pgdata)
+ pg_log_info("data directory \"%s\" not removed at user's request",
+ pg_data);
+
+ if (made_new_xlogdir || found_existing_xlogdir)
+ pg_log_info("WAL directory \"%s\" not removed at user's request",
+ xlog_dir);
+ }
+}
+
+/*
+ * find the current user
+ *
+ * on unix make sure it isn't root
+ */
+static char *
+get_id(void)
+{
+ const char *username;
+
+#ifndef WIN32
+ if (geteuid() == 0) /* 0 is root's uid */
+ {
+ pg_log_error("cannot be run as root");
+ pg_log_error_hint("Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process.");
+ exit(1);
+ }
+#endif
+
+ username = get_user_name_or_exit(progname);
+
+ return pg_strdup(username);
+}
+
+static char *
+encodingid_to_string(int enc)
+{
+ char result[20];
+
+ sprintf(result, "%d", enc);
+ return pg_strdup(result);
+}
+
+/*
+ * get the encoding id for a given encoding name
+ */
+static int
+get_encoding_id(const char *encoding_name)
+{
+ int enc;
+
+ if (encoding_name && *encoding_name)
+ {
+ if ((enc = pg_valid_server_encoding(encoding_name)) >= 0)
+ return enc;
+ }
+ pg_fatal("\"%s\" is not a valid server encoding name",
+ encoding_name ? encoding_name : "(null)");
+}
+
+/*
+ * Support for determining the best default text search configuration.
+ * We key this off the first part of LC_CTYPE (ie, the language name).
+ */
+struct tsearch_config_match
+{
+ const char *tsconfname;
+ const char *langname;
+};
+
+static const struct tsearch_config_match tsearch_config_languages[] =
+{
+ {"arabic", "ar"},
+ {"arabic", "Arabic"},
+ {"armenian", "hy"},
+ {"armenian", "Armenian"},
+ {"basque", "eu"},
+ {"basque", "Basque"},
+ {"catalan", "ca"},
+ {"catalan", "Catalan"},
+ {"danish", "da"},
+ {"danish", "Danish"},
+ {"dutch", "nl"},
+ {"dutch", "Dutch"},
+ {"english", "C"},
+ {"english", "POSIX"},
+ {"english", "en"},
+ {"english", "English"},
+ {"finnish", "fi"},
+ {"finnish", "Finnish"},
+ {"french", "fr"},
+ {"french", "French"},
+ {"german", "de"},
+ {"german", "German"},
+ {"greek", "el"},
+ {"greek", "Greek"},
+ {"hindi", "hi"},
+ {"hindi", "Hindi"},
+ {"hungarian", "hu"},
+ {"hungarian", "Hungarian"},
+ {"indonesian", "id"},
+ {"indonesian", "Indonesian"},
+ {"irish", "ga"},
+ {"irish", "Irish"},
+ {"italian", "it"},
+ {"italian", "Italian"},
+ {"lithuanian", "lt"},
+ {"lithuanian", "Lithuanian"},
+ {"nepali", "ne"},
+ {"nepali", "Nepali"},
+ {"norwegian", "no"},
+ {"norwegian", "Norwegian"},
+ {"portuguese", "pt"},
+ {"portuguese", "Portuguese"},
+ {"romanian", "ro"},
+ {"russian", "ru"},
+ {"russian", "Russian"},
+ {"serbian", "sr"},
+ {"serbian", "Serbian"},
+ {"spanish", "es"},
+ {"spanish", "Spanish"},
+ {"swedish", "sv"},
+ {"swedish", "Swedish"},
+ {"tamil", "ta"},
+ {"tamil", "Tamil"},
+ {"turkish", "tr"},
+ {"turkish", "Turkish"},
+ {"yiddish", "yi"},
+ {"yiddish", "Yiddish"},
+ {NULL, NULL} /* end marker */
+};
+
+/*
+ * Look for a text search configuration matching lc_ctype, and return its
+ * name; return NULL if no match.
+ */
+static const char *
+find_matching_ts_config(const char *lc_type)
+{
+ int i;
+ char *langname,
+ *ptr;
+
+ /*
+ * Convert lc_ctype to a language name by stripping everything after an
+ * underscore (usual case) or a hyphen (Windows "locale name"; see
+ * comments at IsoLocaleName()).
+ *
+ * XXX Should ' ' be a stop character? This would select "norwegian" for
+ * the Windows locale "Norwegian (Nynorsk)_Norway.1252". If we do so, we
+ * should also accept the "nn" and "nb" Unix locales.
+ *
+ * Just for paranoia, we also stop at '.' or '@'.
+ */
+ if (lc_type == NULL)
+ langname = pg_strdup("");
+ else
+ {
+ ptr = langname = pg_strdup(lc_type);
+ while (*ptr &&
+ *ptr != '_' && *ptr != '-' && *ptr != '.' && *ptr != '@')
+ ptr++;
+ *ptr = '\0';
+ }
+
+ for (i = 0; tsearch_config_languages[i].tsconfname; i++)
+ {
+ if (pg_strcasecmp(tsearch_config_languages[i].langname, langname) == 0)
+ {
+ free(langname);
+ return tsearch_config_languages[i].tsconfname;
+ }
+ }
+
+ free(langname);
+ return NULL;
+}
+
+
+/*
+ * set name of given input file variable under data directory
+ */
+static void
+set_input(char **dest, const char *filename)
+{
+ *dest = psprintf("%s/%s", share_path, filename);
+}
+
+/*
+ * check that given input file exists
+ */
+static void
+check_input(char *path)
+{
+ struct stat statbuf;
+
+ if (stat(path, &statbuf) != 0)
+ {
+ if (errno == ENOENT)
+ {
+ pg_log_error("file \"%s\" does not exist", path);
+ pg_log_error_hint("This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L.");
+ }
+ else
+ {
+ pg_log_error("could not access file \"%s\": %m", path);
+ pg_log_error_hint("This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L.");
+ }
+ exit(1);
+ }
+ if (!S_ISREG(statbuf.st_mode))
+ {
+ pg_log_error("file \"%s\" is not a regular file", path);
+ pg_log_error_hint("This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L.");
+ exit(1);
+ }
+}
+
+/*
+ * write out the PG_VERSION file in the data dir, or its subdirectory
+ * if extrapath is not NULL
+ */
+static void
+write_version_file(const char *extrapath)
+{
+ FILE *version_file;
+ char *path;
+
+ if (extrapath == NULL)
+ path = psprintf("%s/PG_VERSION", pg_data);
+ else
+ path = psprintf("%s/%s/PG_VERSION", pg_data, extrapath);
+
+ if ((version_file = fopen(path, PG_BINARY_W)) == NULL)
+ pg_fatal("could not open file \"%s\" for writing: %m", path);
+ if (fprintf(version_file, "%s\n", PG_MAJORVERSION) < 0 ||
+ fclose(version_file))
+ pg_fatal("could not write file \"%s\": %m", path);
+ free(path);
+}
+
+/*
+ * set up an empty config file so we can check config settings by launching
+ * a test backend
+ */
+static void
+set_null_conf(void)
+{
+ FILE *conf_file;
+ char *path;
+
+ path = psprintf("%s/postgresql.conf", pg_data);
+ conf_file = fopen(path, PG_BINARY_W);
+ if (conf_file == NULL)
+ pg_fatal("could not open file \"%s\" for writing: %m", path);
+ if (fclose(conf_file))
+ pg_fatal("could not write file \"%s\": %m", path);
+ free(path);
+}
+
+/*
+ * Determine which dynamic shared memory implementation should be used on
+ * this platform. POSIX shared memory is preferable because the default
+ * allocation limits are much higher than the limits for System V on most
+ * systems that support both, but the fact that a platform has shm_open
+ * doesn't guarantee that that call will succeed when attempted. So, we
+ * attempt to reproduce what the postmaster will do when allocating a POSIX
+ * segment in dsm_impl.c; if it doesn't work, we assume it won't work for
+ * the postmaster either, and configure the cluster for System V shared
+ * memory instead.
+ *
+ * We avoid choosing Solaris's implementation of shm_open() by default. It
+ * can sleep and fail spuriously under contention.
+ */
+static const char *
+choose_dsm_implementation(void)
+{
+#if defined(HAVE_SHM_OPEN) && !defined(__sun__)
+ int ntries = 10;
+ pg_prng_state prng_state;
+
+ /* Initialize prng; this function is its only user in this program. */
+ pg_prng_seed(&prng_state, (uint64) (getpid() ^ time(NULL)));
+
+ while (ntries > 0)
+ {
+ uint32 handle;
+ char name[64];
+ int fd;
+
+ handle = pg_prng_uint32(&prng_state);
+ snprintf(name, 64, "/PostgreSQL.%u", handle);
+ if ((fd = shm_open(name, O_CREAT | O_RDWR | O_EXCL, 0600)) != -1)
+ {
+ close(fd);
+ shm_unlink(name);
+ return "posix";
+ }
+ if (errno != EEXIST)
+ break;
+ --ntries;
+ }
+#endif
+
+#ifdef WIN32
+ return "windows";
+#else
+ return "sysv";
+#endif
+}
+
+/*
+ * Determine platform-specific config settings
+ *
+ * Use reasonable values if kernel will let us, else scale back.
+ */
+static void
+test_config_settings(void)
+{
+ /*
+ * This macro defines the minimum shared_buffers we want for a given
+ * max_connections value. The arrays show the settings to try.
+ */
+#define MIN_BUFS_FOR_CONNS(nconns) ((nconns) * 10)
+
+ static const int trial_conns[] = {
+ 100, 50, 40, 30, 20
+ };
+ static const int trial_bufs[] = {
+ 16384, 8192, 4096, 3584, 3072, 2560, 2048, 1536,
+ 1000, 900, 800, 700, 600, 500,
+ 400, 300, 200, 100, 50
+ };
+
+ char cmd[MAXPGPATH];
+ const int connslen = sizeof(trial_conns) / sizeof(int);
+ const int bufslen = sizeof(trial_bufs) / sizeof(int);
+ int i,
+ status,
+ test_conns,
+ test_buffs,
+ ok_buffers = 0;
+
+ /*
+ * Need to determine working DSM implementation first so that subsequent
+ * tests don't fail because DSM setting doesn't work.
+ */
+ printf(_("selecting dynamic shared memory implementation ... "));
+ fflush(stdout);
+ dynamic_shared_memory_type = choose_dsm_implementation();
+ printf("%s\n", dynamic_shared_memory_type);
+
+ /*
+ * Probe for max_connections before shared_buffers, since it is subject to
+ * more constraints than shared_buffers.
+ */
+ printf(_("selecting default max_connections ... "));
+ fflush(stdout);
+
+ for (i = 0; i < connslen; i++)
+ {
+ test_conns = trial_conns[i];
+ test_buffs = MIN_BUFS_FOR_CONNS(test_conns);
+
+ snprintf(cmd, sizeof(cmd),
+ "\"%s\" --check %s %s "
+ "-c max_connections=%d "
+ "-c shared_buffers=%d "
+ "-c dynamic_shared_memory_type=%s "
+ "< \"%s\" > \"%s\" 2>&1",
+ backend_exec, boot_options, extra_options,
+ test_conns, test_buffs,
+ dynamic_shared_memory_type,
+ DEVNULL, DEVNULL);
+ status = system(cmd);
+ if (status == 0)
+ {
+ ok_buffers = test_buffs;
+ break;
+ }
+ }
+ if (i >= connslen)
+ i = connslen - 1;
+ n_connections = trial_conns[i];
+
+ printf("%d\n", n_connections);
+
+ printf(_("selecting default shared_buffers ... "));
+ fflush(stdout);
+
+ for (i = 0; i < bufslen; i++)
+ {
+ /* Use same amount of memory, independent of BLCKSZ */
+ test_buffs = (trial_bufs[i] * 8192) / BLCKSZ;
+ if (test_buffs <= ok_buffers)
+ {
+ test_buffs = ok_buffers;
+ break;
+ }
+
+ snprintf(cmd, sizeof(cmd),
+ "\"%s\" --check %s %s "
+ "-c max_connections=%d "
+ "-c shared_buffers=%d "
+ "-c dynamic_shared_memory_type=%s "
+ "< \"%s\" > \"%s\" 2>&1",
+ backend_exec, boot_options, extra_options,
+ n_connections, test_buffs,
+ dynamic_shared_memory_type,
+ DEVNULL, DEVNULL);
+ status = system(cmd);
+ if (status == 0)
+ break;
+ }
+ n_buffers = test_buffs;
+
+ if ((n_buffers * (BLCKSZ / 1024)) % 1024 == 0)
+ printf("%dMB\n", (n_buffers * (BLCKSZ / 1024)) / 1024);
+ else
+ printf("%dkB\n", n_buffers * (BLCKSZ / 1024));
+
+ printf(_("selecting default time zone ... "));
+ fflush(stdout);
+ default_timezone = select_default_timezone(share_path);
+ printf("%s\n", default_timezone ? default_timezone : "GMT");
+}
+
+/*
+ * Calculate the default wal_size with a "pretty" unit.
+ */
+static char *
+pretty_wal_size(int segment_count)
+{
+ int sz = wal_segment_size_mb * segment_count;
+ char *result = pg_malloc(14);
+
+ if ((sz % 1024) == 0)
+ snprintf(result, 14, "%dGB", sz / 1024);
+ else
+ snprintf(result, 14, "%dMB", sz);
+
+ return result;
+}
+
+/*
+ * set up all the config files
+ */
+static void
+setup_config(void)
+{
+ char **conflines;
+ char repltok[MAXPGPATH];
+ char path[MAXPGPATH];
+ char *autoconflines[3];
+
+ fputs(_("creating configuration files ... "), stdout);
+ fflush(stdout);
+
+ /* postgresql.conf */
+
+ conflines = readfile(conf_file);
+
+ snprintf(repltok, sizeof(repltok), "max_connections = %d", n_connections);
+ conflines = replace_token(conflines, "#max_connections = 100", repltok);
+
+ if ((n_buffers * (BLCKSZ / 1024)) % 1024 == 0)
+ snprintf(repltok, sizeof(repltok), "shared_buffers = %dMB",
+ (n_buffers * (BLCKSZ / 1024)) / 1024);
+ else
+ snprintf(repltok, sizeof(repltok), "shared_buffers = %dkB",
+ n_buffers * (BLCKSZ / 1024));
+ conflines = replace_token(conflines, "#shared_buffers = 128MB", repltok);
+
+#ifdef HAVE_UNIX_SOCKETS
+ snprintf(repltok, sizeof(repltok), "#unix_socket_directories = '%s'",
+ DEFAULT_PGSOCKET_DIR);
+#else
+ snprintf(repltok, sizeof(repltok), "#unix_socket_directories = ''");
+#endif
+ conflines = replace_token(conflines, "#unix_socket_directories = '/tmp'",
+ repltok);
+
+#if DEF_PGPORT != 5432
+ snprintf(repltok, sizeof(repltok), "#port = %d", DEF_PGPORT);
+ conflines = replace_token(conflines, "#port = 5432", repltok);
+#endif
+
+ /* set default max_wal_size and min_wal_size */
+ snprintf(repltok, sizeof(repltok), "min_wal_size = %s",
+ pretty_wal_size(DEFAULT_MIN_WAL_SEGS));
+ conflines = replace_token(conflines, "#min_wal_size = 80MB", repltok);
+
+ snprintf(repltok, sizeof(repltok), "max_wal_size = %s",
+ pretty_wal_size(DEFAULT_MAX_WAL_SEGS));
+ conflines = replace_token(conflines, "#max_wal_size = 1GB", repltok);
+
+ snprintf(repltok, sizeof(repltok), "lc_messages = '%s'",
+ escape_quotes(lc_messages));
+ conflines = replace_token(conflines, "#lc_messages = 'C'", repltok);
+
+ snprintf(repltok, sizeof(repltok), "lc_monetary = '%s'",
+ escape_quotes(lc_monetary));
+ conflines = replace_token(conflines, "#lc_monetary = 'C'", repltok);
+
+ snprintf(repltok, sizeof(repltok), "lc_numeric = '%s'",
+ escape_quotes(lc_numeric));
+ conflines = replace_token(conflines, "#lc_numeric = 'C'", repltok);
+
+ snprintf(repltok, sizeof(repltok), "lc_time = '%s'",
+ escape_quotes(lc_time));
+ conflines = replace_token(conflines, "#lc_time = 'C'", repltok);
+
+ switch (locale_date_order(lc_time))
+ {
+ case DATEORDER_YMD:
+ strcpy(repltok, "datestyle = 'iso, ymd'");
+ break;
+ case DATEORDER_DMY:
+ strcpy(repltok, "datestyle = 'iso, dmy'");
+ break;
+ case DATEORDER_MDY:
+ default:
+ strcpy(repltok, "datestyle = 'iso, mdy'");
+ break;
+ }
+ conflines = replace_token(conflines, "#datestyle = 'iso, mdy'", repltok);
+
+ snprintf(repltok, sizeof(repltok),
+ "default_text_search_config = 'pg_catalog.%s'",
+ escape_quotes(default_text_search_config));
+ conflines = replace_token(conflines,
+ "#default_text_search_config = 'pg_catalog.simple'",
+ repltok);
+
+ if (default_timezone)
+ {
+ snprintf(repltok, sizeof(repltok), "timezone = '%s'",
+ escape_quotes(default_timezone));
+ conflines = replace_token(conflines, "#timezone = 'GMT'", repltok);
+ snprintf(repltok, sizeof(repltok), "log_timezone = '%s'",
+ escape_quotes(default_timezone));
+ conflines = replace_token(conflines, "#log_timezone = 'GMT'", repltok);
+ }
+
+ snprintf(repltok, sizeof(repltok), "dynamic_shared_memory_type = %s",
+ dynamic_shared_memory_type);
+ conflines = replace_token(conflines, "#dynamic_shared_memory_type = posix",
+ repltok);
+
+#if DEFAULT_BACKEND_FLUSH_AFTER > 0
+ snprintf(repltok, sizeof(repltok), "#backend_flush_after = %dkB",
+ DEFAULT_BACKEND_FLUSH_AFTER * (BLCKSZ / 1024));
+ conflines = replace_token(conflines, "#backend_flush_after = 0",
+ repltok);
+#endif
+
+#if DEFAULT_BGWRITER_FLUSH_AFTER > 0
+ snprintf(repltok, sizeof(repltok), "#bgwriter_flush_after = %dkB",
+ DEFAULT_BGWRITER_FLUSH_AFTER * (BLCKSZ / 1024));
+ conflines = replace_token(conflines, "#bgwriter_flush_after = 0",
+ repltok);
+#endif
+
+#if DEFAULT_CHECKPOINT_FLUSH_AFTER > 0
+ snprintf(repltok, sizeof(repltok), "#checkpoint_flush_after = %dkB",
+ DEFAULT_CHECKPOINT_FLUSH_AFTER * (BLCKSZ / 1024));
+ conflines = replace_token(conflines, "#checkpoint_flush_after = 0",
+ repltok);
+#endif
+
+#ifndef USE_PREFETCH
+ conflines = replace_token(conflines,
+ "#effective_io_concurrency = 1",
+ "#effective_io_concurrency = 0");
+#endif
+
+#ifdef WIN32
+ conflines = replace_token(conflines,
+ "#update_process_title = on",
+ "#update_process_title = off");
+#endif
+
+ /*
+ * Change password_encryption setting to md5 if md5 was chosen as an
+ * authentication method, unless scram-sha-256 was also chosen.
+ */
+ if ((strcmp(authmethodlocal, "md5") == 0 &&
+ strcmp(authmethodhost, "scram-sha-256") != 0) ||
+ (strcmp(authmethodhost, "md5") == 0 &&
+ strcmp(authmethodlocal, "scram-sha-256") != 0))
+ {
+ conflines = replace_token(conflines,
+ "#password_encryption = scram-sha-256",
+ "password_encryption = md5");
+ }
+
+ /*
+ * If group access has been enabled for the cluster then it makes sense to
+ * ensure that the log files also allow group access. Otherwise a backup
+ * from a user in the group would fail if the log files were not
+ * relocated.
+ */
+ if (pg_dir_create_mode == PG_DIR_MODE_GROUP)
+ {
+ conflines = replace_token(conflines,
+ "#log_file_mode = 0600",
+ "log_file_mode = 0640");
+ }
+
+ snprintf(path, sizeof(path), "%s/postgresql.conf", pg_data);
+
+ writefile(path, conflines);
+ if (chmod(path, pg_file_create_mode) != 0)
+ pg_fatal("could not change permissions of \"%s\": %m", path);
+
+ /*
+ * create the automatic configuration file to store the configuration
+ * parameters set by ALTER SYSTEM command. The parameters present in this
+ * file will override the value of parameters that exists before parse of
+ * this file.
+ */
+ autoconflines[0] = pg_strdup("# Do not edit this file manually!\n");
+ autoconflines[1] = pg_strdup("# It will be overwritten by the ALTER SYSTEM command.\n");
+ autoconflines[2] = NULL;
+
+ sprintf(path, "%s/postgresql.auto.conf", pg_data);
+
+ writefile(path, autoconflines);
+ if (chmod(path, pg_file_create_mode) != 0)
+ pg_fatal("could not change permissions of \"%s\": %m", path);
+
+ free(conflines);
+
+
+ /* pg_hba.conf */
+
+ conflines = readfile(hba_file);
+
+#ifndef HAVE_UNIX_SOCKETS
+ conflines = filter_lines_with_token(conflines, "@remove-line-for-nolocal@");
+#else
+ conflines = replace_token(conflines, "@remove-line-for-nolocal@", "");
+#endif
+
+#ifdef HAVE_IPV6
+
+ /*
+ * Probe to see if there is really any platform support for IPv6, and
+ * comment out the relevant pg_hba line if not. This avoids runtime
+ * warnings if getaddrinfo doesn't actually cope with IPv6. Particularly
+ * useful on Windows, where executables built on a machine with IPv6 may
+ * have to run on a machine without.
+ */
+ {
+ struct addrinfo *gai_result;
+ struct addrinfo hints;
+ int err = 0;
+
+#ifdef WIN32
+ /* need to call WSAStartup before calling getaddrinfo */
+ WSADATA wsaData;
+
+ err = WSAStartup(MAKEWORD(2, 2), &wsaData);
+#endif
+
+ /* for best results, this code should match parse_hba_line() */
+ hints.ai_flags = AI_NUMERICHOST;
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = 0;
+ hints.ai_protocol = 0;
+ hints.ai_addrlen = 0;
+ hints.ai_canonname = NULL;
+ hints.ai_addr = NULL;
+ hints.ai_next = NULL;
+
+ if (err != 0 ||
+ getaddrinfo("::1", NULL, &hints, &gai_result) != 0)
+ {
+ conflines = replace_token(conflines,
+ "host all all ::1",
+ "#host all all ::1");
+ conflines = replace_token(conflines,
+ "host replication all ::1",
+ "#host replication all ::1");
+ }
+ }
+#else /* !HAVE_IPV6 */
+ /* If we didn't compile IPV6 support at all, always comment it out */
+ conflines = replace_token(conflines,
+ "host all all ::1",
+ "#host all all ::1");
+ conflines = replace_token(conflines,
+ "host replication all ::1",
+ "#host replication all ::1");
+#endif /* HAVE_IPV6 */
+
+ /* Replace default authentication methods */
+ conflines = replace_token(conflines,
+ "@authmethodhost@",
+ authmethodhost);
+ conflines = replace_token(conflines,
+ "@authmethodlocal@",
+ authmethodlocal);
+
+ conflines = replace_token(conflines,
+ "@authcomment@",
+ (strcmp(authmethodlocal, "trust") == 0 || strcmp(authmethodhost, "trust") == 0) ? AUTHTRUST_WARNING : "");
+
+ snprintf(path, sizeof(path), "%s/pg_hba.conf", pg_data);
+
+ writefile(path, conflines);
+ if (chmod(path, pg_file_create_mode) != 0)
+ pg_fatal("could not change permissions of \"%s\": %m", path);
+
+ free(conflines);
+
+ /* pg_ident.conf */
+
+ conflines = readfile(ident_file);
+
+ snprintf(path, sizeof(path), "%s/pg_ident.conf", pg_data);
+
+ writefile(path, conflines);
+ if (chmod(path, pg_file_create_mode) != 0)
+ pg_fatal("could not change permissions of \"%s\": %m", path);
+
+ free(conflines);
+
+ check_ok();
+}
+
+
+/*
+ * run the BKI script in bootstrap mode to create template1
+ */
+static void
+bootstrap_template1(void)
+{
+ PG_CMD_DECL;
+ char **line;
+ char **bki_lines;
+ char headerline[MAXPGPATH];
+ char buf[64];
+
+ printf(_("running bootstrap script ... "));
+ fflush(stdout);
+
+ bki_lines = readfile(bki_file);
+
+ /* Check that bki file appears to be of the right version */
+
+ snprintf(headerline, sizeof(headerline), "# PostgreSQL %s\n",
+ PG_MAJORVERSION);
+
+ if (strcmp(headerline, *bki_lines) != 0)
+ {
+ pg_log_error("input file \"%s\" does not belong to PostgreSQL %s",
+ bki_file, PG_VERSION);
+ pg_log_error_hint("Specify the correct path using the option -L.");
+ exit(1);
+ }
+
+ /* Substitute for various symbols used in the BKI file */
+
+ sprintf(buf, "%d", NAMEDATALEN);
+ bki_lines = replace_token(bki_lines, "NAMEDATALEN", buf);
+
+ sprintf(buf, "%d", (int) sizeof(Pointer));
+ bki_lines = replace_token(bki_lines, "SIZEOF_POINTER", buf);
+
+ bki_lines = replace_token(bki_lines, "ALIGNOF_POINTER",
+ (sizeof(Pointer) == 4) ? "i" : "d");
+
+ bki_lines = replace_token(bki_lines, "FLOAT8PASSBYVAL",
+ FLOAT8PASSBYVAL ? "true" : "false");
+
+ bki_lines = replace_token(bki_lines, "POSTGRES",
+ escape_quotes_bki(username));
+
+ bki_lines = replace_token(bki_lines, "ENCODING",
+ encodingid_to_string(encodingid));
+
+ bki_lines = replace_token(bki_lines, "LC_COLLATE",
+ escape_quotes_bki(lc_collate));
+
+ bki_lines = replace_token(bki_lines, "LC_CTYPE",
+ escape_quotes_bki(lc_ctype));
+
+ bki_lines = replace_token(bki_lines, "ICU_LOCALE",
+ locale_provider == COLLPROVIDER_ICU ? escape_quotes_bki(icu_locale) : "_null_");
+
+ sprintf(buf, "%c", locale_provider);
+ bki_lines = replace_token(bki_lines, "LOCALE_PROVIDER", buf);
+
+ /* Also ensure backend isn't confused by this environment var: */
+ unsetenv("PGCLIENTENCODING");
+
+ snprintf(cmd, sizeof(cmd),
+ "\"%s\" --boot -X %d %s %s %s %s",
+ backend_exec,
+ wal_segment_size_mb * (1024 * 1024),
+ data_checksums ? "-k" : "",
+ boot_options, extra_options,
+ debug ? "-d 5" : "");
+
+
+ PG_CMD_OPEN;
+
+ for (line = bki_lines; *line != NULL; line++)
+ {
+ PG_CMD_PUTS(*line);
+ free(*line);
+ }
+
+ PG_CMD_CLOSE;
+
+ free(bki_lines);
+
+ check_ok();
+}
+
+/*
+ * set up the shadow password table
+ */
+static void
+setup_auth(FILE *cmdfd)
+{
+ const char *const *line;
+ static const char *const pg_authid_setup[] = {
+ /*
+ * The authid table shouldn't be readable except through views, to
+ * ensure passwords are not publicly visible.
+ */
+ "REVOKE ALL ON pg_authid FROM public;\n\n",
+ NULL
+ };
+
+ for (line = pg_authid_setup; *line != NULL; line++)
+ PG_CMD_PUTS(*line);
+
+ if (superuser_password)
+ PG_CMD_PRINTF("ALTER USER \"%s\" WITH PASSWORD E'%s';\n\n",
+ username, escape_quotes(superuser_password));
+}
+
+/*
+ * get the superuser password if required
+ */
+static void
+get_su_pwd(void)
+{
+ char *pwd1;
+
+ if (pwprompt)
+ {
+ /*
+ * Read password from terminal
+ */
+ char *pwd2;
+
+ printf("\n");
+ fflush(stdout);
+ pwd1 = simple_prompt("Enter new superuser password: ", false);
+ pwd2 = simple_prompt("Enter it again: ", false);
+ if (strcmp(pwd1, pwd2) != 0)
+ {
+ fprintf(stderr, _("Passwords didn't match.\n"));
+ exit(1);
+ }
+ free(pwd2);
+ }
+ else
+ {
+ /*
+ * Read password from file
+ *
+ * Ideally this should insist that the file not be world-readable.
+ * However, this option is mainly intended for use on Windows where
+ * file permissions may not exist at all, so we'll skip the paranoia
+ * for now.
+ */
+ FILE *pwf = fopen(pwfilename, "r");
+
+ if (!pwf)
+ pg_fatal("could not open file \"%s\" for reading: %m",
+ pwfilename);
+ pwd1 = pg_get_line(pwf, NULL);
+ if (!pwd1)
+ {
+ if (ferror(pwf))
+ pg_fatal("could not read password from file \"%s\": %m",
+ pwfilename);
+ else
+ pg_fatal("password file \"%s\" is empty",
+ pwfilename);
+ }
+ fclose(pwf);
+
+ (void) pg_strip_crlf(pwd1);
+ }
+
+ superuser_password = pwd1;
+}
+
+/*
+ * set up pg_depend
+ */
+static void
+setup_depend(FILE *cmdfd)
+{
+ const char *const *line;
+ static const char *const pg_depend_setup[] = {
+ /*
+ * Advance the OID counter so that subsequently-created objects aren't
+ * pinned.
+ */
+ "SELECT pg_stop_making_pinned_objects();\n\n",
+ NULL
+ };
+
+ for (line = pg_depend_setup; *line != NULL; line++)
+ PG_CMD_PUTS(*line);
+}
+
+/*
+ * Run external file
+ */
+static void
+setup_run_file(FILE *cmdfd, const char *filename)
+{
+ char **lines;
+
+ lines = readfile(filename);
+
+ for (char **line = lines; *line != NULL; line++)
+ {
+ PG_CMD_PUTS(*line);
+ free(*line);
+ }
+
+ PG_CMD_PUTS("\n\n");
+
+ free(lines);
+}
+
+/*
+ * fill in extra description data
+ */
+static void
+setup_description(FILE *cmdfd)
+{
+ /* Create default descriptions for operator implementation functions */
+ PG_CMD_PUTS("WITH funcdescs AS ( "
+ "SELECT p.oid as p_oid, o.oid as o_oid, oprname "
+ "FROM pg_proc p JOIN pg_operator o ON oprcode = p.oid ) "
+ "INSERT INTO pg_description "
+ " SELECT p_oid, 'pg_proc'::regclass, 0, "
+ " 'implementation of ' || oprname || ' operator' "
+ " FROM funcdescs "
+ " WHERE NOT EXISTS (SELECT 1 FROM pg_description "
+ " WHERE objoid = p_oid AND classoid = 'pg_proc'::regclass) "
+ " AND NOT EXISTS (SELECT 1 FROM pg_description "
+ " WHERE objoid = o_oid AND classoid = 'pg_operator'::regclass"
+ " AND description LIKE 'deprecated%');\n\n");
+}
+
+/*
+ * populate pg_collation
+ */
+static void
+setup_collation(FILE *cmdfd)
+{
+ /*
+ * Add an SQL-standard name. We don't want to pin this, so it doesn't go
+ * in pg_collation.h. But add it before reading system collations, so
+ * that it wins if libc defines a locale named ucs_basic.
+ */
+ PG_CMD_PRINTF("INSERT INTO pg_collation (oid, collname, collnamespace, collowner, collprovider, collisdeterministic, collencoding, collcollate, collctype)"
+ "VALUES (pg_nextoid('pg_catalog.pg_collation', 'oid', 'pg_catalog.pg_collation_oid_index'), 'ucs_basic', 'pg_catalog'::regnamespace, %u, '%c', true, %d, 'C', 'C');\n\n",
+ BOOTSTRAP_SUPERUSERID, COLLPROVIDER_LIBC, PG_UTF8);
+
+ /* Now import all collations we can find in the operating system */
+ PG_CMD_PUTS("SELECT pg_import_system_collations('pg_catalog');\n\n");
+}
+
+/*
+ * Set up privileges
+ *
+ * We mark most system catalogs as world-readable. We don't currently have
+ * to touch functions, languages, or databases, because their default
+ * permissions are OK.
+ *
+ * Some objects may require different permissions by default, so we
+ * make sure we don't overwrite privilege sets that have already been
+ * set (NOT NULL).
+ *
+ * Also populate pg_init_privs to save what the privileges are at init
+ * time. This is used by pg_dump to allow users to change privileges
+ * on catalog objects and to have those privilege changes preserved
+ * across dump/reload and pg_upgrade.
+ *
+ * Note that pg_init_privs is only for per-database objects and therefore
+ * we don't include databases or tablespaces.
+ */
+static void
+setup_privileges(FILE *cmdfd)
+{
+ char **line;
+ char **priv_lines;
+ static char *privileges_setup[] = {
+ "UPDATE pg_class "
+ " SET relacl = (SELECT array_agg(a.acl) FROM "
+ " (SELECT E'=r/\"$POSTGRES_SUPERUSERNAME\"' as acl "
+ " UNION SELECT unnest(pg_catalog.acldefault("
+ " CASE WHEN relkind = " CppAsString2(RELKIND_SEQUENCE) " THEN 's' "
+ " ELSE 'r' END::\"char\"," CppAsString2(BOOTSTRAP_SUPERUSERID) "::oid))"
+ " ) as a) "
+ " WHERE relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_VIEW) ", " CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_SEQUENCE) ")"
+ " AND relacl IS NULL;\n\n",
+ "GRANT USAGE ON SCHEMA pg_catalog, public TO PUBLIC;\n\n",
+ "REVOKE ALL ON pg_largeobject FROM PUBLIC;\n\n",
+ "INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " oid,"
+ " (SELECT oid FROM pg_class WHERE relname = 'pg_class'),"
+ " 0,"
+ " relacl,"
+ " 'i'"
+ " FROM"
+ " pg_class"
+ " WHERE"
+ " relacl IS NOT NULL"
+ " AND relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_VIEW) ", " CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_SEQUENCE) ");\n\n",
+ "INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " pg_class.oid,"
+ " (SELECT oid FROM pg_class WHERE relname = 'pg_class'),"
+ " pg_attribute.attnum,"
+ " pg_attribute.attacl,"
+ " 'i'"
+ " FROM"
+ " pg_class"
+ " JOIN pg_attribute ON (pg_class.oid = pg_attribute.attrelid)"
+ " WHERE"
+ " pg_attribute.attacl IS NOT NULL"
+ " AND pg_class.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_VIEW) ", " CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_SEQUENCE) ");\n\n",
+ "INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " oid,"
+ " (SELECT oid FROM pg_class WHERE relname = 'pg_proc'),"
+ " 0,"
+ " proacl,"
+ " 'i'"
+ " FROM"
+ " pg_proc"
+ " WHERE"
+ " proacl IS NOT NULL;\n\n",
+ "INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " oid,"
+ " (SELECT oid FROM pg_class WHERE relname = 'pg_type'),"
+ " 0,"
+ " typacl,"
+ " 'i'"
+ " FROM"
+ " pg_type"
+ " WHERE"
+ " typacl IS NOT NULL;\n\n",
+ "INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " oid,"
+ " (SELECT oid FROM pg_class WHERE relname = 'pg_language'),"
+ " 0,"
+ " lanacl,"
+ " 'i'"
+ " FROM"
+ " pg_language"
+ " WHERE"
+ " lanacl IS NOT NULL;\n\n",
+ "INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " oid,"
+ " (SELECT oid FROM pg_class WHERE "
+ " relname = 'pg_largeobject_metadata'),"
+ " 0,"
+ " lomacl,"
+ " 'i'"
+ " FROM"
+ " pg_largeobject_metadata"
+ " WHERE"
+ " lomacl IS NOT NULL;\n\n",
+ "INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " oid,"
+ " (SELECT oid FROM pg_class WHERE relname = 'pg_namespace'),"
+ " 0,"
+ " nspacl,"
+ " 'i'"
+ " FROM"
+ " pg_namespace"
+ " WHERE"
+ " nspacl IS NOT NULL;\n\n",
+ "INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " oid,"
+ " (SELECT oid FROM pg_class WHERE "
+ " relname = 'pg_foreign_data_wrapper'),"
+ " 0,"
+ " fdwacl,"
+ " 'i'"
+ " FROM"
+ " pg_foreign_data_wrapper"
+ " WHERE"
+ " fdwacl IS NOT NULL;\n\n",
+ "INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " oid,"
+ " (SELECT oid FROM pg_class "
+ " WHERE relname = 'pg_foreign_server'),"
+ " 0,"
+ " srvacl,"
+ " 'i'"
+ " FROM"
+ " pg_foreign_server"
+ " WHERE"
+ " srvacl IS NOT NULL;\n\n",
+ NULL
+ };
+
+ priv_lines = replace_token(privileges_setup, "$POSTGRES_SUPERUSERNAME",
+ escape_quotes(username));
+ for (line = priv_lines; *line != NULL; line++)
+ PG_CMD_PUTS(*line);
+}
+
+/*
+ * extract the strange version of version required for information schema
+ * (09.08.0007abc)
+ */
+static void
+set_info_version(void)
+{
+ char *letterversion;
+ long major = 0,
+ minor = 0,
+ micro = 0;
+ char *endptr;
+ char *vstr = pg_strdup(PG_VERSION);
+ char *ptr;
+
+ ptr = vstr + (strlen(vstr) - 1);
+ while (ptr != vstr && (*ptr < '0' || *ptr > '9'))
+ ptr--;
+ letterversion = ptr + 1;
+ major = strtol(vstr, &endptr, 10);
+ if (*endptr)
+ minor = strtol(endptr + 1, &endptr, 10);
+ if (*endptr)
+ micro = strtol(endptr + 1, &endptr, 10);
+ snprintf(infoversion, sizeof(infoversion), "%02ld.%02ld.%04ld%s",
+ major, minor, micro, letterversion);
+}
+
+/*
+ * load info schema and populate from features file
+ */
+static void
+setup_schema(FILE *cmdfd)
+{
+ setup_run_file(cmdfd, info_schema_file);
+
+ PG_CMD_PRINTF("UPDATE information_schema.sql_implementation_info "
+ " SET character_value = '%s' "
+ " WHERE implementation_info_name = 'DBMS VERSION';\n\n",
+ infoversion);
+
+ PG_CMD_PRINTF("COPY information_schema.sql_features "
+ " (feature_id, feature_name, sub_feature_id, "
+ " sub_feature_name, is_supported, comments) "
+ " FROM E'%s';\n\n",
+ escape_quotes(features_file));
+}
+
+/*
+ * load PL/pgSQL server-side language
+ */
+static void
+load_plpgsql(FILE *cmdfd)
+{
+ PG_CMD_PUTS("CREATE EXTENSION plpgsql;\n\n");
+}
+
+/*
+ * clean everything up in template1
+ */
+static void
+vacuum_db(FILE *cmdfd)
+{
+ /* Run analyze before VACUUM so the statistics are frozen. */
+ PG_CMD_PUTS("ANALYZE;\n\nVACUUM FREEZE;\n\n");
+}
+
+/*
+ * copy template1 to template0
+ */
+static void
+make_template0(FILE *cmdfd)
+{
+ const char *const *line;
+
+ /*
+ * pg_upgrade tries to preserve database OIDs across upgrades. It's smart
+ * enough to drop and recreate a conflicting database with the same name,
+ * but if the same OID were used for one system-created database in the
+ * old cluster and a different system-created database in the new cluster,
+ * it would fail. To avoid that, assign a fixed OID to template0 rather
+ * than letting the server choose one.
+ *
+ * (Note that, while the user could have dropped and recreated these
+ * objects in the old cluster, the problem scenario only exists if the OID
+ * that is in use in the old cluster is also used in the new cluster - and
+ * the new cluster should be the result of a fresh initdb.)
+ *
+ * We use "STRATEGY = file_copy" here because checkpoints during initdb
+ * are cheap. "STRATEGY = wal_log" would generate more WAL, which would be
+ * a little bit slower and make the new cluster a little bit bigger.
+ */
+ static const char *const template0_setup[] = {
+ "CREATE DATABASE template0 IS_TEMPLATE = true ALLOW_CONNECTIONS = false"
+ " OID = " CppAsString2(Template0DbOid)
+ " STRATEGY = file_copy;\n\n",
+
+ /*
+ * template0 shouldn't have any collation-dependent objects, so unset
+ * the collation version. This disables collation version checks when
+ * making a new database from it.
+ */
+ "UPDATE pg_database SET datcollversion = NULL WHERE datname = 'template0';\n\n",
+
+ /*
+ * While we are here, do set the collation version on template1.
+ */
+ "UPDATE pg_database SET datcollversion = pg_database_collation_actual_version(oid) WHERE datname = 'template1';\n\n",
+
+ /*
+ * Explicitly revoke public create-schema and create-temp-table
+ * privileges in template1 and template0; else the latter would be on
+ * by default
+ */
+ "REVOKE CREATE,TEMPORARY ON DATABASE template1 FROM public;\n\n",
+ "REVOKE CREATE,TEMPORARY ON DATABASE template0 FROM public;\n\n",
+
+ "COMMENT ON DATABASE template0 IS 'unmodifiable empty database';\n\n",
+
+ /*
+ * Finally vacuum to clean up dead rows in pg_database
+ */
+ "VACUUM pg_database;\n\n",
+ NULL
+ };
+
+ for (line = template0_setup; *line; line++)
+ PG_CMD_PUTS(*line);
+}
+
+/*
+ * copy template1 to postgres
+ */
+static void
+make_postgres(FILE *cmdfd)
+{
+ const char *const *line;
+
+ /*
+ * Just as we did for template0, and for the same reasons, assign a fixed
+ * OID to postgres and select the file_copy strategy.
+ */
+ static const char *const postgres_setup[] = {
+ "CREATE DATABASE postgres OID = " CppAsString2(PostgresDbOid)
+ " STRATEGY = file_copy;\n\n",
+ "COMMENT ON DATABASE postgres IS 'default administrative connection database';\n\n",
+ NULL
+ };
+
+ for (line = postgres_setup; *line; line++)
+ PG_CMD_PUTS(*line);
+}
+
+/*
+ * signal handler in case we are interrupted.
+ *
+ * The Windows runtime docs at
+ * https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/signal
+ * specifically forbid a number of things being done from a signal handler,
+ * including IO, memory allocation and system calls, and only allow jmpbuf
+ * if you are handling SIGFPE.
+ *
+ * I avoided doing the forbidden things by setting a flag instead of calling
+ * exit() directly.
+ *
+ * Also note the behaviour of Windows with SIGINT, which says this:
+ * SIGINT is not supported for any Win32 application. When a CTRL+C interrupt
+ * occurs, Win32 operating systems generate a new thread to specifically
+ * handle that interrupt. This can cause a single-thread application, such as
+ * one in UNIX, to become multithreaded and cause unexpected behavior.
+ *
+ * I have no idea how to handle this. (Strange they call UNIX an application!)
+ * So this will need some testing on Windows.
+ */
+static void
+trapsig(int signum)
+{
+ /* handle systems that reset the handler, like Windows (grr) */
+ pqsignal(signum, trapsig);
+ caught_signal = true;
+}
+
+/*
+ * call exit() if we got a signal, or else output "ok".
+ */
+static void
+check_ok(void)
+{
+ if (caught_signal)
+ {
+ printf(_("caught signal\n"));
+ fflush(stdout);
+ exit(1);
+ }
+ else if (output_failed)
+ {
+ printf(_("could not write to child process: %s\n"),
+ strerror(output_errno));
+ fflush(stdout);
+ exit(1);
+ }
+ else
+ {
+ /* all seems well */
+ printf(_("ok\n"));
+ fflush(stdout);
+ }
+}
+
+/* Hack to suppress a warning about %x from some versions of gcc */
+static inline size_t
+my_strftime(char *s, size_t max, const char *fmt, const struct tm *tm)
+{
+ return strftime(s, max, fmt, tm);
+}
+
+/*
+ * Determine likely date order from locale
+ */
+static int
+locale_date_order(const char *locale)
+{
+ struct tm testtime;
+ char buf[128];
+ char *posD;
+ char *posM;
+ char *posY;
+ char *save;
+ size_t res;
+ int result;
+
+ result = DATEORDER_MDY; /* default */
+
+ save = setlocale(LC_TIME, NULL);
+ if (!save)
+ return result;
+ save = pg_strdup(save);
+
+ setlocale(LC_TIME, locale);
+
+ memset(&testtime, 0, sizeof(testtime));
+ testtime.tm_mday = 22;
+ testtime.tm_mon = 10; /* November, should come out as "11" */
+ testtime.tm_year = 133; /* 2033 */
+
+ res = my_strftime(buf, sizeof(buf), "%x", &testtime);
+
+ setlocale(LC_TIME, save);
+ free(save);
+
+ if (res == 0)
+ return result;
+
+ posM = strstr(buf, "11");
+ posD = strstr(buf, "22");
+ posY = strstr(buf, "33");
+
+ if (!posM || !posD || !posY)
+ return result;
+
+ if (posY < posM && posM < posD)
+ result = DATEORDER_YMD;
+ else if (posD < posM)
+ result = DATEORDER_DMY;
+ else
+ result = DATEORDER_MDY;
+
+ return result;
+}
+
+/*
+ * Verify that locale name is valid for the locale category.
+ *
+ * If successful, and canonname isn't NULL, a malloc'd copy of the locale's
+ * canonical name is stored there. This is especially useful for figuring out
+ * what locale name "" means (ie, the environment value). (Actually,
+ * it seems that on most implementations that's the only thing it's good for;
+ * we could wish that setlocale gave back a canonically spelled version of
+ * the locale name, but typically it doesn't.)
+ *
+ * this should match the backend's check_locale() function
+ */
+static void
+check_locale_name(int category, const char *locale, char **canonname)
+{
+ char *save;
+ char *res;
+
+ if (canonname)
+ *canonname = NULL; /* in case of failure */
+
+ save = setlocale(category, NULL);
+ if (!save)
+ pg_fatal("setlocale() failed");
+
+ /* save may be pointing at a modifiable scratch variable, so copy it. */
+ save = pg_strdup(save);
+
+ /* for setlocale() call */
+ if (!locale)
+ locale = "";
+
+ /* set the locale with setlocale, to see if it accepts it. */
+ res = setlocale(category, locale);
+
+ /* save canonical name if requested. */
+ if (res && canonname)
+ *canonname = pg_strdup(res);
+
+ /* restore old value. */
+ if (!setlocale(category, save))
+ pg_fatal("failed to restore old locale \"%s\"", save);
+ free(save);
+
+ /* complain if locale wasn't valid */
+ if (res == NULL)
+ {
+ if (*locale)
+ pg_fatal("invalid locale name \"%s\"", locale);
+ else
+ {
+ /*
+ * If no relevant switch was given on command line, locale is an
+ * empty string, which is not too helpful to report. Presumably
+ * setlocale() found something it did not like in the environment.
+ * Ideally we'd report the bad environment variable, but since
+ * setlocale's behavior is implementation-specific, it's hard to
+ * be sure what it didn't like. Print a safe generic message.
+ */
+ pg_fatal("invalid locale settings; check LANG and LC_* environment variables");
+ }
+ }
+}
+
+/*
+ * check if the chosen encoding matches the encoding required by the locale
+ *
+ * this should match the similar check in the backend createdb() function
+ */
+static bool
+check_locale_encoding(const char *locale, int user_enc)
+{
+ int locale_enc;
+
+ locale_enc = pg_get_encoding_from_locale(locale, true);
+
+ /* See notes in createdb() to understand these tests */
+ if (!(locale_enc == user_enc ||
+ locale_enc == PG_SQL_ASCII ||
+ locale_enc == -1 ||
+#ifdef WIN32
+ user_enc == PG_UTF8 ||
+#endif
+ user_enc == PG_SQL_ASCII))
+ {
+ pg_log_error("encoding mismatch");
+ pg_log_error_detail("The encoding you selected (%s) and the encoding that the "
+ "selected locale uses (%s) do not match. This would lead to "
+ "misbehavior in various character string processing functions.",
+ pg_encoding_to_char(user_enc),
+ pg_encoding_to_char(locale_enc));
+ pg_log_error_hint("Rerun %s and either do not specify an encoding explicitly, "
+ "or choose a matching combination.",
+ progname);
+ return false;
+ }
+ return true;
+}
+
+/*
+ * check if the chosen encoding matches is supported by ICU
+ *
+ * this should match the similar check in the backend createdb() function
+ */
+static bool
+check_icu_locale_encoding(int user_enc)
+{
+ if (!(is_encoding_supported_by_icu(user_enc)))
+ {
+ pg_log_error("encoding mismatch");
+ pg_log_error_detail("The encoding you selected (%s) is not supported with the ICU provider.",
+ pg_encoding_to_char(user_enc));
+ pg_log_error_hint("Rerun %s and either do not specify an encoding explicitly, "
+ "or choose a matching combination.",
+ progname);
+ return false;
+ }
+ return true;
+}
+
+/*
+ * set up the locale variables
+ *
+ * assumes we have called setlocale(LC_ALL, "") -- see set_pglocale_pgservice
+ */
+static void
+setlocales(void)
+{
+ char *canonname;
+
+ /* set empty lc_* values to locale config if set */
+
+ if (locale)
+ {
+ if (!lc_ctype)
+ lc_ctype = locale;
+ if (!lc_collate)
+ lc_collate = locale;
+ if (!lc_numeric)
+ lc_numeric = locale;
+ if (!lc_time)
+ lc_time = locale;
+ if (!lc_monetary)
+ lc_monetary = locale;
+ if (!lc_messages)
+ lc_messages = locale;
+ }
+
+ /*
+ * canonicalize locale names, and obtain any missing values from our
+ * current environment
+ */
+ check_locale_name(LC_CTYPE, lc_ctype, &canonname);
+ lc_ctype = canonname;
+ check_locale_name(LC_COLLATE, lc_collate, &canonname);
+ lc_collate = canonname;
+ check_locale_name(LC_NUMERIC, lc_numeric, &canonname);
+ lc_numeric = canonname;
+ check_locale_name(LC_TIME, lc_time, &canonname);
+ lc_time = canonname;
+ check_locale_name(LC_MONETARY, lc_monetary, &canonname);
+ lc_monetary = canonname;
+#if defined(LC_MESSAGES) && !defined(WIN32)
+ check_locale_name(LC_MESSAGES, lc_messages, &canonname);
+ lc_messages = canonname;
+#else
+ /* when LC_MESSAGES is not available, use the LC_CTYPE setting */
+ check_locale_name(LC_CTYPE, lc_messages, &canonname);
+ lc_messages = canonname;
+#endif
+
+ if (locale_provider == COLLPROVIDER_ICU)
+ {
+ if (!icu_locale)
+ pg_fatal("ICU locale must be specified");
+
+ /*
+ * In supported builds, the ICU locale ID will be checked by the
+ * backend during post-bootstrap initialization.
+ */
+#ifndef USE_ICU
+ pg_fatal("ICU is not supported in this build");
+#endif
+ }
+}
+
+/*
+ * print help text
+ */
+static void
+usage(const char *progname)
+{
+ printf(_("%s initializes a PostgreSQL database cluster.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DATADIR]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -A, --auth=METHOD default authentication method for local connections\n"));
+ printf(_(" --auth-host=METHOD default authentication method for local TCP/IP connections\n"));
+ printf(_(" --auth-local=METHOD default authentication method for local-socket connections\n"));
+ printf(_(" [-D, --pgdata=]DATADIR location for this database cluster\n"));
+ printf(_(" -E, --encoding=ENCODING set default encoding for new databases\n"));
+ printf(_(" -g, --allow-group-access allow group read/execute on data directory\n"));
+ printf(_(" --icu-locale=LOCALE set ICU locale ID for new databases\n"));
+ printf(_(" -k, --data-checksums use data page checksums\n"));
+ printf(_(" --locale=LOCALE set default locale for new databases\n"));
+ printf(_(" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+ " --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+ " set default locale in the respective category for\n"
+ " new databases (default taken from environment)\n"));
+ printf(_(" --no-locale equivalent to --locale=C\n"));
+ printf(_(" --locale-provider={libc|icu}\n"
+ " set default locale provider for new databases\n"));
+ printf(_(" --pwfile=FILE read password for the new superuser from file\n"));
+ printf(_(" -T, --text-search-config=CFG\n"
+ " default text search configuration\n"));
+ printf(_(" -U, --username=NAME database superuser name\n"));
+ printf(_(" -W, --pwprompt prompt for a password for the new superuser\n"));
+ printf(_(" -X, --waldir=WALDIR location for the write-ahead log directory\n"));
+ printf(_(" --wal-segsize=SIZE size of WAL segments, in megabytes\n"));
+ printf(_("\nLess commonly used options:\n"));
+ printf(_(" -d, --debug generate lots of debugging output\n"));
+ printf(_(" --discard-caches set debug_discard_caches=1\n"));
+ printf(_(" -L DIRECTORY where to find the input files\n"));
+ printf(_(" -n, --no-clean do not clean up after errors\n"));
+ printf(_(" -N, --no-sync do not wait for changes to be written safely to disk\n"));
+ printf(_(" --no-instructions do not print instructions for next steps\n"));
+ printf(_(" -s, --show show internal settings\n"));
+ printf(_(" -S, --sync-only only sync database files to disk, then exit\n"));
+ printf(_("\nOther options:\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nIf the data directory is not specified, the environment variable PGDATA\n"
+ "is used.\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+static void
+check_authmethod_unspecified(const char **authmethod)
+{
+ if (*authmethod == NULL)
+ {
+ authwarning = true;
+ *authmethod = "trust";
+ }
+}
+
+static void
+check_authmethod_valid(const char *authmethod, const char *const *valid_methods, const char *conntype)
+{
+ const char *const *p;
+
+ for (p = valid_methods; *p; p++)
+ {
+ if (strcmp(authmethod, *p) == 0)
+ return;
+ /* with space = param */
+ if (strchr(authmethod, ' '))
+ if (strncmp(authmethod, *p, (authmethod - strchr(authmethod, ' '))) == 0)
+ return;
+ }
+
+ pg_fatal("invalid authentication method \"%s\" for \"%s\" connections",
+ authmethod, conntype);
+}
+
+static void
+check_need_password(const char *authmethodlocal, const char *authmethodhost)
+{
+ if ((strcmp(authmethodlocal, "md5") == 0 ||
+ strcmp(authmethodlocal, "password") == 0 ||
+ strcmp(authmethodlocal, "scram-sha-256") == 0) &&
+ (strcmp(authmethodhost, "md5") == 0 ||
+ strcmp(authmethodhost, "password") == 0 ||
+ strcmp(authmethodhost, "scram-sha-256") == 0) &&
+ !(pwprompt || pwfilename))
+ pg_fatal("must specify a password for the superuser to enable password authentication");
+}
+
+
+void
+setup_pgdata(void)
+{
+ char *pgdata_get_env;
+
+ if (!pg_data)
+ {
+ pgdata_get_env = getenv("PGDATA");
+ if (pgdata_get_env && strlen(pgdata_get_env))
+ {
+ /* PGDATA found */
+ pg_data = pg_strdup(pgdata_get_env);
+ }
+ else
+ {
+ pg_log_error("no data directory specified");
+ pg_log_error_hint("You must identify the directory where the data for this database system "
+ "will reside. Do this with either the invocation option -D or the "
+ "environment variable PGDATA.");
+ exit(1);
+ }
+ }
+
+ pgdata_native = pg_strdup(pg_data);
+ canonicalize_path(pg_data);
+
+ /*
+ * we have to set PGDATA for postgres rather than pass it on the command
+ * line to avoid dumb quoting problems on Windows, and we would especially
+ * need quotes otherwise on Windows because paths there are most likely to
+ * have embedded spaces.
+ */
+ if (setenv("PGDATA", pg_data, 1) != 0)
+ pg_fatal("could not set environment");
+}
+
+
+void
+setup_bin_paths(const char *argv0)
+{
+ int ret;
+
+ if ((ret = find_other_exec(argv0, "postgres", PG_BACKEND_VERSIONSTR,
+ backend_exec)) < 0)
+ {
+ char full_path[MAXPGPATH];
+
+ if (find_my_exec(argv0, full_path) < 0)
+ strlcpy(full_path, progname, sizeof(full_path));
+
+ if (ret == -1)
+ pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"",
+ "postgres", progname, full_path);
+ else
+ pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s",
+ "postgres", full_path, progname);
+ }
+
+ /* store binary directory */
+ strcpy(bin_path, backend_exec);
+ *last_dir_separator(bin_path) = '\0';
+ canonicalize_path(bin_path);
+
+ if (!share_path)
+ {
+ share_path = pg_malloc(MAXPGPATH);
+ get_share_path(backend_exec, share_path);
+ }
+ else if (!is_absolute_path(share_path))
+ pg_fatal("input file location must be an absolute path");
+
+ canonicalize_path(share_path);
+}
+
+void
+setup_locale_encoding(void)
+{
+ setlocales();
+
+ if (locale_provider == COLLPROVIDER_LIBC &&
+ strcmp(lc_ctype, lc_collate) == 0 &&
+ strcmp(lc_ctype, lc_time) == 0 &&
+ strcmp(lc_ctype, lc_numeric) == 0 &&
+ strcmp(lc_ctype, lc_monetary) == 0 &&
+ strcmp(lc_ctype, lc_messages) == 0 &&
+ (!icu_locale || strcmp(lc_ctype, icu_locale) == 0))
+ printf(_("The database cluster will be initialized with locale \"%s\".\n"), lc_ctype);
+ else
+ {
+ printf(_("The database cluster will be initialized with this locale configuration:\n"));
+ printf(_(" provider: %s\n"), collprovider_name(locale_provider));
+ if (icu_locale)
+ printf(_(" ICU locale: %s\n"), icu_locale);
+ printf(_(" LC_COLLATE: %s\n"
+ " LC_CTYPE: %s\n"
+ " LC_MESSAGES: %s\n"
+ " LC_MONETARY: %s\n"
+ " LC_NUMERIC: %s\n"
+ " LC_TIME: %s\n"),
+ lc_collate,
+ lc_ctype,
+ lc_messages,
+ lc_monetary,
+ lc_numeric,
+ lc_time);
+ }
+
+ if (!encoding && locale_provider == COLLPROVIDER_ICU)
+ {
+ encodingid = PG_UTF8;
+ printf(_("The default database encoding has been set to \"%s\".\n"),
+ pg_encoding_to_char(encodingid));
+ }
+ else if (!encoding)
+ {
+ int ctype_enc;
+
+ ctype_enc = pg_get_encoding_from_locale(lc_ctype, true);
+
+ if (ctype_enc == -1)
+ {
+ /* Couldn't recognize the locale's codeset */
+ pg_log_error("could not find suitable encoding for locale \"%s\"",
+ lc_ctype);
+ pg_log_error_hint("Rerun %s with the -E option.", progname);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ else if (!pg_valid_server_encoding_id(ctype_enc))
+ {
+ /*
+ * We recognized it, but it's not a legal server encoding. On
+ * Windows, UTF-8 works with any locale, so we can fall back to
+ * UTF-8.
+ */
+#ifdef WIN32
+ encodingid = PG_UTF8;
+ printf(_("Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+ "The default database encoding will be set to \"%s\" instead.\n"),
+ pg_encoding_to_char(ctype_enc),
+ pg_encoding_to_char(encodingid));
+#else
+ pg_log_error("locale \"%s\" requires unsupported encoding \"%s\"",
+ lc_ctype, pg_encoding_to_char(ctype_enc));
+ pg_log_error_detail("Encoding \"%s\" is not allowed as a server-side encoding.",
+ pg_encoding_to_char(ctype_enc));
+ pg_log_error_hint("Rerun %s with a different locale selection.",
+ progname);
+ exit(1);
+#endif
+ }
+ else
+ {
+ encodingid = ctype_enc;
+ printf(_("The default database encoding has accordingly been set to \"%s\".\n"),
+ pg_encoding_to_char(encodingid));
+ }
+ }
+ else
+ encodingid = get_encoding_id(encoding);
+
+ if (!check_locale_encoding(lc_ctype, encodingid) ||
+ !check_locale_encoding(lc_collate, encodingid))
+ exit(1); /* check_locale_encoding printed the error */
+
+ if (locale_provider == COLLPROVIDER_ICU &&
+ !check_icu_locale_encoding(encodingid))
+ exit(1);
+}
+
+
+void
+setup_data_file_paths(void)
+{
+ set_input(&bki_file, "postgres.bki");
+ set_input(&hba_file, "pg_hba.conf.sample");
+ set_input(&ident_file, "pg_ident.conf.sample");
+ set_input(&conf_file, "postgresql.conf.sample");
+ set_input(&dictionary_file, "snowball_create.sql");
+ set_input(&info_schema_file, "information_schema.sql");
+ set_input(&features_file, "sql_features.txt");
+ set_input(&system_constraints_file, "system_constraints.sql");
+ set_input(&system_functions_file, "system_functions.sql");
+ set_input(&system_views_file, "system_views.sql");
+
+ if (show_setting || debug)
+ {
+ fprintf(stderr,
+ "VERSION=%s\n"
+ "PGDATA=%s\nshare_path=%s\nPGPATH=%s\n"
+ "POSTGRES_SUPERUSERNAME=%s\nPOSTGRES_BKI=%s\n"
+ "POSTGRESQL_CONF_SAMPLE=%s\n"
+ "PG_HBA_SAMPLE=%s\nPG_IDENT_SAMPLE=%s\n",
+ PG_VERSION,
+ pg_data, share_path, bin_path,
+ username, bki_file,
+ conf_file,
+ hba_file, ident_file);
+ if (show_setting)
+ exit(0);
+ }
+
+ check_input(bki_file);
+ check_input(hba_file);
+ check_input(ident_file);
+ check_input(conf_file);
+ check_input(dictionary_file);
+ check_input(info_schema_file);
+ check_input(features_file);
+ check_input(system_constraints_file);
+ check_input(system_functions_file);
+ check_input(system_views_file);
+}
+
+
+void
+setup_text_search(void)
+{
+ if (!default_text_search_config)
+ {
+ default_text_search_config = find_matching_ts_config(lc_ctype);
+ if (!default_text_search_config)
+ {
+ pg_log_info("could not find suitable text search configuration for locale \"%s\"",
+ lc_ctype);
+ default_text_search_config = "simple";
+ }
+ }
+ else
+ {
+ const char *checkmatch = find_matching_ts_config(lc_ctype);
+
+ if (checkmatch == NULL)
+ {
+ pg_log_warning("suitable text search configuration for locale \"%s\" is unknown",
+ lc_ctype);
+ }
+ else if (strcmp(checkmatch, default_text_search_config) != 0)
+ {
+ pg_log_warning("specified text search configuration \"%s\" might not match locale \"%s\"",
+ default_text_search_config, lc_ctype);
+ }
+ }
+
+ printf(_("The default text search configuration will be set to \"%s\".\n"),
+ default_text_search_config);
+}
+
+
+void
+setup_signals(void)
+{
+ /* some of these are not valid on Windows */
+#ifdef SIGHUP
+ pqsignal(SIGHUP, trapsig);
+#endif
+#ifdef SIGINT
+ pqsignal(SIGINT, trapsig);
+#endif
+#ifdef SIGQUIT
+ pqsignal(SIGQUIT, trapsig);
+#endif
+#ifdef SIGTERM
+ pqsignal(SIGTERM, trapsig);
+#endif
+
+ /* Ignore SIGPIPE when writing to backend, so we can clean up */
+#ifdef SIGPIPE
+ pqsignal(SIGPIPE, SIG_IGN);
+#endif
+
+ /* Prevent SIGSYS so we can probe for kernel calls that might not work */
+#ifdef SIGSYS
+ pqsignal(SIGSYS, SIG_IGN);
+#endif
+}
+
+
+void
+create_data_directory(void)
+{
+ int ret;
+
+ switch ((ret = pg_check_dir(pg_data)))
+ {
+ case 0:
+ /* PGDATA not there, must create it */
+ printf(_("creating directory %s ... "),
+ pg_data);
+ fflush(stdout);
+
+ if (pg_mkdir_p(pg_data, pg_dir_create_mode) != 0)
+ pg_fatal("could not create directory \"%s\": %m", pg_data);
+ else
+ check_ok();
+
+ made_new_pgdata = true;
+ break;
+
+ case 1:
+ /* Present but empty, fix permissions and use it */
+ printf(_("fixing permissions on existing directory %s ... "),
+ pg_data);
+ fflush(stdout);
+
+ if (chmod(pg_data, pg_dir_create_mode) != 0)
+ pg_fatal("could not change permissions of directory \"%s\": %m",
+ pg_data);
+ else
+ check_ok();
+
+ found_existing_pgdata = true;
+ break;
+
+ case 2:
+ case 3:
+ case 4:
+ /* Present and not empty */
+ pg_log_error("directory \"%s\" exists but is not empty", pg_data);
+ if (ret != 4)
+ warn_on_mount_point(ret);
+ else
+ pg_log_error_hint("If you want to create a new database system, either remove or empty "
+ "the directory \"%s\" or run %s "
+ "with an argument other than \"%s\".",
+ pg_data, progname, pg_data);
+ exit(1); /* no further message needed */
+
+ default:
+ /* Trouble accessing directory */
+ pg_fatal("could not access directory \"%s\": %m", pg_data);
+ }
+}
+
+
+/* Create WAL directory, and symlink if required */
+void
+create_xlog_or_symlink(void)
+{
+ char *subdirloc;
+
+ /* form name of the place for the subdirectory or symlink */
+ subdirloc = psprintf("%s/pg_wal", pg_data);
+
+ if (xlog_dir)
+ {
+ int ret;
+
+ /* clean up xlog directory name, check it's absolute */
+ canonicalize_path(xlog_dir);
+ if (!is_absolute_path(xlog_dir))
+ pg_fatal("WAL directory location must be an absolute path");
+
+ /* check if the specified xlog directory exists/is empty */
+ switch ((ret = pg_check_dir(xlog_dir)))
+ {
+ case 0:
+ /* xlog directory not there, must create it */
+ printf(_("creating directory %s ... "),
+ xlog_dir);
+ fflush(stdout);
+
+ if (pg_mkdir_p(xlog_dir, pg_dir_create_mode) != 0)
+ pg_fatal("could not create directory \"%s\": %m",
+ xlog_dir);
+ else
+ check_ok();
+
+ made_new_xlogdir = true;
+ break;
+
+ case 1:
+ /* Present but empty, fix permissions and use it */
+ printf(_("fixing permissions on existing directory %s ... "),
+ xlog_dir);
+ fflush(stdout);
+
+ if (chmod(xlog_dir, pg_dir_create_mode) != 0)
+ pg_fatal("could not change permissions of directory \"%s\": %m",
+ xlog_dir);
+ else
+ check_ok();
+
+ found_existing_xlogdir = true;
+ break;
+
+ case 2:
+ case 3:
+ case 4:
+ /* Present and not empty */
+ pg_log_error("directory \"%s\" exists but is not empty", xlog_dir);
+ if (ret != 4)
+ warn_on_mount_point(ret);
+ else
+ pg_log_error_hint("If you want to store the WAL there, either remove or empty the directory \"%s\".",
+ xlog_dir);
+ exit(1);
+
+ default:
+ /* Trouble accessing directory */
+ pg_fatal("could not access directory \"%s\": %m", xlog_dir);
+ }
+
+#ifdef HAVE_SYMLINK
+ if (symlink(xlog_dir, subdirloc) != 0)
+ pg_fatal("could not create symbolic link \"%s\": %m",
+ subdirloc);
+#else
+ pg_fatal("symlinks are not supported on this platform");
+#endif
+ }
+ else
+ {
+ /* Without -X option, just make the subdirectory normally */
+ if (mkdir(subdirloc, pg_dir_create_mode) < 0)
+ pg_fatal("could not create directory \"%s\": %m",
+ subdirloc);
+ }
+
+ free(subdirloc);
+}
+
+
+void
+warn_on_mount_point(int error)
+{
+ if (error == 2)
+ pg_log_error_detail("It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.");
+ else if (error == 3)
+ pg_log_error_detail("It contains a lost+found directory, perhaps due to it being a mount point.");
+
+ pg_log_error_hint("Using a mount point directly as the data directory is not recommended.\n"
+ "Create a subdirectory under the mount point.");
+}
+
+
+void
+initialize_data_directory(void)
+{
+ PG_CMD_DECL;
+ int i;
+
+ setup_signals();
+
+ /*
+ * Set mask based on requested PGDATA permissions. pg_mode_mask, and
+ * friends like pg_dir_create_mode, are set to owner-only by default and
+ * then updated if -g is passed in by calling SetDataDirectoryCreatePerm()
+ * when parsing our options (see above).
+ */
+ umask(pg_mode_mask);
+
+ create_data_directory();
+
+ create_xlog_or_symlink();
+
+ /* Create required subdirectories (other than pg_wal) */
+ printf(_("creating subdirectories ... "));
+ fflush(stdout);
+
+ for (i = 0; i < lengthof(subdirs); i++)
+ {
+ char *path;
+
+ path = psprintf("%s/%s", pg_data, subdirs[i]);
+
+ /*
+ * The parent directory already exists, so we only need mkdir() not
+ * pg_mkdir_p() here, which avoids some failure modes; cf bug #13853.
+ */
+ if (mkdir(path, pg_dir_create_mode) < 0)
+ pg_fatal("could not create directory \"%s\": %m", path);
+
+ free(path);
+ }
+
+ check_ok();
+
+ /* Top level PG_VERSION is checked by bootstrapper, so make it first */
+ write_version_file(NULL);
+
+ /* Select suitable configuration settings */
+ set_null_conf();
+ test_config_settings();
+
+ /* Now create all the text config files */
+ setup_config();
+
+ /* Bootstrap template1 */
+ bootstrap_template1();
+
+ /*
+ * Make the per-database PG_VERSION for template1 only after init'ing it
+ */
+ write_version_file("base/1");
+
+ /*
+ * Create the stuff we don't need to use bootstrap mode for, using a
+ * backend running in simple standalone mode.
+ */
+ fputs(_("performing post-bootstrap initialization ... "), stdout);
+ fflush(stdout);
+
+ snprintf(cmd, sizeof(cmd),
+ "\"%s\" %s %s template1 >%s",
+ backend_exec, backend_options, extra_options,
+ DEVNULL);
+
+ PG_CMD_OPEN;
+
+ setup_auth(cmdfd);
+
+ setup_run_file(cmdfd, system_constraints_file);
+
+ setup_run_file(cmdfd, system_functions_file);
+
+ setup_depend(cmdfd);
+
+ /*
+ * Note that no objects created after setup_depend() will be "pinned".
+ * They are all droppable at the whim of the DBA.
+ */
+
+ setup_run_file(cmdfd, system_views_file);
+
+ setup_description(cmdfd);
+
+ setup_collation(cmdfd);
+
+ setup_run_file(cmdfd, dictionary_file);
+
+ setup_privileges(cmdfd);
+
+ setup_schema(cmdfd);
+
+ load_plpgsql(cmdfd);
+
+ vacuum_db(cmdfd);
+
+ make_template0(cmdfd);
+
+ make_postgres(cmdfd);
+
+ PG_CMD_CLOSE;
+
+ check_ok();
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"pgdata", required_argument, NULL, 'D'},
+ {"encoding", required_argument, NULL, 'E'},
+ {"locale", required_argument, NULL, 1},
+ {"lc-collate", required_argument, NULL, 2},
+ {"lc-ctype", required_argument, NULL, 3},
+ {"lc-monetary", required_argument, NULL, 4},
+ {"lc-numeric", required_argument, NULL, 5},
+ {"lc-time", required_argument, NULL, 6},
+ {"lc-messages", required_argument, NULL, 7},
+ {"no-locale", no_argument, NULL, 8},
+ {"text-search-config", required_argument, NULL, 'T'},
+ {"auth", required_argument, NULL, 'A'},
+ {"auth-local", required_argument, NULL, 10},
+ {"auth-host", required_argument, NULL, 11},
+ {"pwprompt", no_argument, NULL, 'W'},
+ {"pwfile", required_argument, NULL, 9},
+ {"username", required_argument, NULL, 'U'},
+ {"help", no_argument, NULL, '?'},
+ {"version", no_argument, NULL, 'V'},
+ {"debug", no_argument, NULL, 'd'},
+ {"show", no_argument, NULL, 's'},
+ {"noclean", no_argument, NULL, 'n'}, /* for backwards compatibility */
+ {"no-clean", no_argument, NULL, 'n'},
+ {"nosync", no_argument, NULL, 'N'}, /* for backwards compatibility */
+ {"no-sync", no_argument, NULL, 'N'},
+ {"no-instructions", no_argument, NULL, 13},
+ {"sync-only", no_argument, NULL, 'S'},
+ {"waldir", required_argument, NULL, 'X'},
+ {"wal-segsize", required_argument, NULL, 12},
+ {"data-checksums", no_argument, NULL, 'k'},
+ {"allow-group-access", no_argument, NULL, 'g'},
+ {"discard-caches", no_argument, NULL, 14},
+ {"locale-provider", required_argument, NULL, 15},
+ {"icu-locale", required_argument, NULL, 16},
+ {NULL, 0, NULL, 0}
+ };
+
+ /*
+ * options with no short version return a low integer, the rest return
+ * their short version value
+ */
+ int c;
+ int option_index;
+ char *effective_user;
+ PQExpBuffer start_db_cmd;
+ char pg_ctl_path[MAXPGPATH];
+
+ /*
+ * Ensure that buffering behavior of stdout matches what it is in
+ * interactive usage (at least on most platforms). This prevents
+ * unexpected output ordering when, eg, output is redirected to a file.
+ * POSIX says we must do this before any other usage of these files.
+ */
+ setvbuf(stdout, NULL, PG_IOLBF, 0);
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("initdb"));
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage(progname);
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("initdb (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ /* process command-line options */
+
+ while ((c = getopt_long(argc, argv, "A:dD:E:gkL:nNsST:U:WX:", long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+ case 'A':
+ authmethodlocal = authmethodhost = pg_strdup(optarg);
+
+ /*
+ * When ident is specified, use peer for local connections.
+ * Mirrored, when peer is specified, use ident for TCP/IP
+ * connections.
+ */
+ if (strcmp(authmethodhost, "ident") == 0)
+ authmethodlocal = "peer";
+ else if (strcmp(authmethodlocal, "peer") == 0)
+ authmethodhost = "ident";
+ break;
+ case 10:
+ authmethodlocal = pg_strdup(optarg);
+ break;
+ case 11:
+ authmethodhost = pg_strdup(optarg);
+ break;
+ case 'D':
+ pg_data = pg_strdup(optarg);
+ break;
+ case 'E':
+ encoding = pg_strdup(optarg);
+ break;
+ case 'W':
+ pwprompt = true;
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'd':
+ debug = true;
+ printf(_("Running in debug mode.\n"));
+ break;
+ case 'n':
+ noclean = true;
+ printf(_("Running in no-clean mode. Mistakes will not be cleaned up.\n"));
+ break;
+ case 'N':
+ do_sync = false;
+ break;
+ case 'S':
+ sync_only = true;
+ break;
+ case 'k':
+ data_checksums = true;
+ break;
+ case 'L':
+ share_path = pg_strdup(optarg);
+ break;
+ case 1:
+ locale = pg_strdup(optarg);
+ break;
+ case 2:
+ lc_collate = pg_strdup(optarg);
+ break;
+ case 3:
+ lc_ctype = pg_strdup(optarg);
+ break;
+ case 4:
+ lc_monetary = pg_strdup(optarg);
+ break;
+ case 5:
+ lc_numeric = pg_strdup(optarg);
+ break;
+ case 6:
+ lc_time = pg_strdup(optarg);
+ break;
+ case 7:
+ lc_messages = pg_strdup(optarg);
+ break;
+ case 8:
+ locale = "C";
+ break;
+ case 9:
+ pwfilename = pg_strdup(optarg);
+ break;
+ case 's':
+ show_setting = true;
+ break;
+ case 'T':
+ default_text_search_config = pg_strdup(optarg);
+ break;
+ case 'X':
+ xlog_dir = pg_strdup(optarg);
+ break;
+ case 12:
+ str_wal_segment_size_mb = pg_strdup(optarg);
+ break;
+ case 13:
+ noinstructions = true;
+ break;
+ case 'g':
+ SetDataDirectoryCreatePerm(PG_DIR_MODE_GROUP);
+ break;
+ case 14:
+ extra_options = psprintf("%s %s",
+ extra_options,
+ "-c debug_discard_caches=1");
+ break;
+ case 15:
+ if (strcmp(optarg, "icu") == 0)
+ locale_provider = COLLPROVIDER_ICU;
+ else if (strcmp(optarg, "libc") == 0)
+ locale_provider = COLLPROVIDER_LIBC;
+ else
+ pg_fatal("unrecognized locale provider: %s", optarg);
+ break;
+ case 16:
+ icu_locale = pg_strdup(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+
+ /*
+ * Non-option argument specifies data directory as long as it wasn't
+ * already specified with -D / --pgdata
+ */
+ if (optind < argc && !pg_data)
+ {
+ pg_data = pg_strdup(argv[optind]);
+ optind++;
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (icu_locale && locale_provider != COLLPROVIDER_ICU)
+ pg_fatal("%s cannot be specified unless locale provider \"%s\" is chosen",
+ "--icu-locale", "icu");
+
+ atexit(cleanup_directories_atexit);
+
+ /* If we only need to fsync, just do it and exit */
+ if (sync_only)
+ {
+ setup_pgdata();
+
+ /* must check that directory is readable */
+ if (pg_check_dir(pg_data) <= 0)
+ pg_fatal("could not access directory \"%s\": %m", pg_data);
+
+ fputs(_("syncing data to disk ... "), stdout);
+ fflush(stdout);
+ fsync_pgdata(pg_data, PG_VERSION_NUM);
+ check_ok();
+ return 0;
+ }
+
+ if (pwprompt && pwfilename)
+ pg_fatal("password prompt and password file cannot be specified together");
+
+ check_authmethod_unspecified(&authmethodlocal);
+ check_authmethod_unspecified(&authmethodhost);
+
+ check_authmethod_valid(authmethodlocal, auth_methods_local, "local");
+ check_authmethod_valid(authmethodhost, auth_methods_host, "host");
+
+ check_need_password(authmethodlocal, authmethodhost);
+
+ /* set wal segment size */
+ if (str_wal_segment_size_mb == NULL)
+ wal_segment_size_mb = (DEFAULT_XLOG_SEG_SIZE) / (1024 * 1024);
+ else
+ {
+ char *endptr;
+
+ /* check that the argument is a number */
+ wal_segment_size_mb = strtol(str_wal_segment_size_mb, &endptr, 10);
+
+ /* verify that wal segment size is valid */
+ if (endptr == str_wal_segment_size_mb || *endptr != '\0')
+ pg_fatal("argument of --wal-segsize must be a number");
+ if (!IsValidWalSegSize(wal_segment_size_mb * 1024 * 1024))
+ pg_fatal("argument of --wal-segsize must be a power of 2 between 1 and 1024");
+ }
+
+ get_restricted_token();
+
+ setup_pgdata();
+
+ setup_bin_paths(argv[0]);
+
+ effective_user = get_id();
+ if (!username)
+ username = effective_user;
+
+ if (strncmp(username, "pg_", 3) == 0)
+ pg_fatal("superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"", username);
+
+ printf(_("The files belonging to this database system will be owned "
+ "by user \"%s\".\n"
+ "This user must also own the server process.\n\n"),
+ effective_user);
+
+ set_info_version();
+
+ setup_data_file_paths();
+
+ setup_locale_encoding();
+
+ setup_text_search();
+
+ printf("\n");
+
+ if (data_checksums)
+ printf(_("Data page checksums are enabled.\n"));
+ else
+ printf(_("Data page checksums are disabled.\n"));
+
+ if (pwprompt || pwfilename)
+ get_su_pwd();
+
+ printf("\n");
+
+ initialize_data_directory();
+
+ if (do_sync)
+ {
+ fputs(_("syncing data to disk ... "), stdout);
+ fflush(stdout);
+ fsync_pgdata(pg_data, PG_VERSION_NUM);
+ check_ok();
+ }
+ else
+ printf(_("\nSync to disk skipped.\nThe data directory might become corrupt if the operating system crashes.\n"));
+
+ if (authwarning)
+ {
+ printf("\n");
+ pg_log_warning("enabling \"trust\" authentication for local connections");
+ pg_log_warning_hint("You can change this by editing pg_hba.conf or using the option -A, or "
+ "--auth-local and --auth-host, the next time you run initdb.");
+ }
+
+ if (!noinstructions)
+ {
+ /*
+ * Build up a shell command to tell the user how to start the server
+ */
+ start_db_cmd = createPQExpBuffer();
+
+ /* Get directory specification used to start initdb ... */
+ strlcpy(pg_ctl_path, argv[0], sizeof(pg_ctl_path));
+ canonicalize_path(pg_ctl_path);
+ get_parent_directory(pg_ctl_path);
+ /* ... and tag on pg_ctl instead */
+ join_path_components(pg_ctl_path, pg_ctl_path, "pg_ctl");
+
+ /* Convert the path to use native separators */
+ make_native_path(pg_ctl_path);
+
+ /* path to pg_ctl, properly quoted */
+ appendShellString(start_db_cmd, pg_ctl_path);
+
+ /* add -D switch, with properly quoted data directory */
+ appendPQExpBufferStr(start_db_cmd, " -D ");
+ appendShellString(start_db_cmd, pgdata_native);
+
+ /* add suggested -l switch and "start" command */
+ /* translator: This is a placeholder in a shell command. */
+ appendPQExpBuffer(start_db_cmd, " -l %s start", _("logfile"));
+
+ printf(_("\nSuccess. You can now start the database server using:\n\n"
+ " %s\n\n"),
+ start_db_cmd->data);
+
+ destroyPQExpBuffer(start_db_cmd);
+ }
+
+
+ success = true;
+ return 0;
+}
diff --git a/src/bin/initdb/nls.mk b/src/bin/initdb/nls.mk
new file mode 100644
index 0000000..354420d
--- /dev/null
+++ b/src/bin/initdb/nls.mk
@@ -0,0 +1,6 @@
+# src/bin/initdb/nls.mk
+CATALOG_NAME = initdb
+AVAIL_LANGUAGES = de el es fr it ja ka ko pt_BR ru sv uk zh_CN
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) findtimezone.c initdb.c ../../common/exec.c ../../common/fe_memutils.c ../../common/file_utils.c ../../common/pgfnames.c ../../common/restricted_token.c ../../common/rmtree.c ../../common/username.c ../../common/wait_error.c ../../port/dirmod.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) simple_prompt
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/initdb/po/de.po b/src/bin/initdb/po/de.po
new file mode 100644
index 0000000..830c106
--- /dev/null
+++ b/src/bin/initdb/po/de.po
@@ -0,0 +1,1051 @@
+# German message translation file for initdb.
+# Peter Eisentraut <peter@eisentraut.org>, 2003 - 2022.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-23 03:19+0000\n"
+"PO-Revision-Date: 2022-09-23 07:03-0400\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "konnte aktuelles Verzeichnis nicht ermitteln: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "ungültige Programmdatei »%s«"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "konnte Programmdatei »%s« nicht lesen"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "konnte kein »%s« zum Ausführen finden"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "konnte nicht in Verzeichnis »%s« wechseln: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() fehlgeschlagen: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: initdb.c:334
+#, c-format
+msgid "out of memory"
+msgstr "Speicher aufgebraucht"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m"
+
+#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht öffnen: %m"
+
+#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht lesen: %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht fsyncen: %m"
+
+#: ../../common/file_utils.c:383
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht schließen: %m"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "konnte Bibliothek »%s« nicht laden: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "auf dieser Plattform können keine beschränkten Token erzeugt werden: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "konnte Prozess-Token nicht öffnen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "konnte SIDs nicht erzeugen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "konnte beschränktes Token nicht erzeugen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "konnte Prozess für Befehl »%s« nicht starten: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "konnte Prozess nicht mit beschränktem Token neu starten: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "konnte »stat« für Datei oder Verzeichnis »%s« nicht ausführen: %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "konnte Datei oder Verzeichnis »%s« nicht entfernen: %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "konnte effektive Benutzer-ID %ld nicht nachschlagen: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "Benutzer existiert nicht"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "Fehler beim Nachschlagen des Benutzernamens: Fehlercode %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "Befehl ist nicht ausführbar"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "Befehl nicht gefunden"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "Kindprozess hat mit Code %d beendet"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "Kindprozess wurde durch Ausnahme 0x%X beendet"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "Kindprozess wurde von Signal %d beendet: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "Kindprozess hat mit unbekanntem Status %d beendet"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "konnte Junction für »%s« nicht erzeugen: %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "konnte Junction für »%s« nicht ermitteln: %s\n"
+
+#: initdb.c:464 initdb.c:1459
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m"
+
+#: initdb.c:505 initdb.c:809 initdb.c:829
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "konnte Datei »%s« nicht zum Schreiben öffnen: %m"
+
+#: initdb.c:509 initdb.c:812 initdb.c:831
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schreiben: %m"
+
+#: initdb.c:513
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schließen: %m"
+
+#: initdb.c:529
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "konnte Befehl »%s« nicht ausführen: %m"
+
+#: initdb.c:547
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "entferne Datenverzeichnis »%s«"
+
+#: initdb.c:549
+#, c-format
+msgid "failed to remove data directory"
+msgstr "konnte Datenverzeichnis nicht entfernen"
+
+#: initdb.c:553
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "entferne Inhalt des Datenverzeichnisses »%s«"
+
+#: initdb.c:556
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "konnte Inhalt des Datenverzeichnisses nicht entfernen"
+
+#: initdb.c:561
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "entferne WAL-Verzeichnis »%s«"
+
+#: initdb.c:563
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "konnte WAL-Verzeichnis nicht entfernen"
+
+#: initdb.c:567
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "entferne Inhalt des WAL-Verzeichnisses »%s«"
+
+#: initdb.c:569
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "konnte Inhalt des WAL-Verzeichnisses nicht entfernen"
+
+#: initdb.c:576
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "Datenverzeichnis »%s« wurde auf Anwenderwunsch nicht entfernt"
+
+#: initdb.c:580
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "WAL-Verzeichnis »%s« wurde auf Anwenderwunsch nicht entfernt"
+
+#: initdb.c:598
+#, c-format
+msgid "cannot be run as root"
+msgstr "kann nicht als root ausgeführt werden"
+
+#: initdb.c:599
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "Bitte loggen Sie sich (z.B. mit »su«) als der (unprivilegierte) Benutzer ein, der Eigentümer des Serverprozesses sein soll."
+
+#: initdb.c:631
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "»%s« ist keine gültige Serverkodierung"
+
+#: initdb.c:775
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "Datei »%s« existiert nicht"
+
+#: initdb.c:776 initdb.c:781 initdb.c:788
+#, c-format
+msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."
+msgstr "Das könnte bedeuten, dass Ihre Installation fehlerhaft ist oder dass Sie das falsche Verzeichnis mit der Kommandozeilenoption -L angegeben haben."
+
+#: initdb.c:780
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "konnte nicht auf Datei »%s« zugreifen: %m"
+
+#: initdb.c:787
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "Datei »%s« ist keine normale Datei"
+
+#: initdb.c:922
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "wähle Implementierung von dynamischem Shared Memory ... "
+
+#: initdb.c:931
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "wähle Vorgabewert für max_connections ... "
+
+#: initdb.c:962
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "wähle Vorgabewert für shared_buffers ... "
+
+#: initdb.c:996
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "wähle Vorgabewert für Zeitzone ... "
+
+#: initdb.c:1030
+msgid "creating configuration files ... "
+msgstr "erzeuge Konfigurationsdateien ... "
+
+#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "konnte Zugriffsrechte von »%s« nicht ändern: %m"
+
+#: initdb.c:1319
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "führe Bootstrap-Skript aus ... "
+
+#: initdb.c:1331
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "Eingabedatei »%s« gehört nicht zu PostgreSQL %s"
+
+#: initdb.c:1333
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Geben Sie den korrekten Pfad mit der Option -L an."
+
+#: initdb.c:1437
+msgid "Enter new superuser password: "
+msgstr "Geben Sie das neue Superuser-Passwort ein: "
+
+#: initdb.c:1438
+msgid "Enter it again: "
+msgstr "Geben Sie es noch einmal ein: "
+
+#: initdb.c:1441
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Passwörter stimmten nicht überein.\n"
+
+#: initdb.c:1465
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "konnte Passwort nicht aus Datei »%s« lesen: %m"
+
+#: initdb.c:1468
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "Passwortdatei »%s« ist leer"
+
+#: initdb.c:1915
+#, c-format
+msgid "caught signal\n"
+msgstr "Signal abgefangen\n"
+
+#: initdb.c:1921
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "konnte nicht an Kindprozess schreiben: %s\n"
+
+#: initdb.c:1929
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2018
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() fehlgeschlagen"
+
+#: initdb.c:2036
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "konnte alte Locale »%s« nicht wiederherstellen"
+
+#: initdb.c:2043
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "ungültiger Locale-Name: »%s«"
+
+#: initdb.c:2054
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "ungültige Locale-Einstellungen; prüfen Sie die Umgebungsvariablen LANG und LC_*"
+
+#: initdb.c:2080 initdb.c:2104
+#, c-format
+msgid "encoding mismatch"
+msgstr "unpassende Kodierungen"
+
+#: initdb.c:2081
+#, c-format
+msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions."
+msgstr "Die von Ihnen gewählte Kodierung (%s) und die von der gewählten Locale verwendete Kodierung (%s) passen nicht zu einander. Das würde in verschiedenen Zeichenkettenfunktionen zu Fehlverhalten führen."
+
+#: initdb.c:2086 initdb.c:2107
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "Starten Sie %s erneut und geben Sie entweder keine Kodierung explizit an oder wählen Sie eine passende Kombination."
+
+#: initdb.c:2105
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "Die von Ihnen gewählte Kodierung (%s) wird vom ICU-Provider nicht unterstützt."
+
+#: initdb.c:2169
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "ICU-Locale muss angegeben werden"
+
+#: initdb.c:2176
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU wird in dieser Installation nicht unterstützt"
+
+#: initdb.c:2187
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s initialisiert einen PostgreSQL-Datenbankcluster.\n"
+"\n"
+
+#: initdb.c:2188
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: initdb.c:2189
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATENVERZEICHNIS]\n"
+
+#: initdb.c:2190
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Optionen:\n"
+
+#: initdb.c:2191
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=METHODE vorgegebene Authentifizierungsmethode für lokale Verbindungen\n"
+
+#: initdb.c:2192
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr ""
+" --auth-host=METHODE vorgegebene Authentifizierungsmethode für lokale\n"
+" TCP/IP-Verbindungen\n"
+
+#: initdb.c:2193
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr ""
+" --auth-local=METHODE vorgegebene Authentifizierungsmethode für Verbindungen\n"
+" auf lokalen Sockets\n"
+
+#: initdb.c:2194
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATENVERZ Datenverzeichnis für diesen Datenbankcluster\n"
+
+#: initdb.c:2195
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=KODIERUNG setze Standardkodierung für neue Datenbanken\n"
+
+#: initdb.c:2196
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr ""
+" -g, --allow-group-access Lese- und Ausführungsrechte am Datenverzeichnis\n"
+" für Gruppe setzen\n"
+
+#: initdb.c:2197
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOCALE setze ICU-Locale-ID für neue Datenbanken\n"
+
+#: initdb.c:2198
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums Datenseitenprüfsummen verwenden\n"
+
+#: initdb.c:2199
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE setze Standardlocale für neue Datenbanken\n"
+
+#: initdb.c:2200
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" setze Standardlocale in der jeweiligen Kategorie\n"
+" für neue Datenbanken (Voreinstellung aus der\n"
+" Umgebung entnommen)\n"
+
+#: initdb.c:2204
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale entspricht --locale=C\n"
+
+#: initdb.c:2205
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" setze Standard-Locale-Provider für neue Datenbanken\n"
+
+#: initdb.c:2207
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=DATEI lese Passwort des neuen Superusers aus Datei\n"
+
+#: initdb.c:2208
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=KFG\n"
+" Standardtextsuchekonfiguration\n"
+
+#: initdb.c:2210
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAME Datenbank-Superusername\n"
+
+#: initdb.c:2211
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt frage nach Passwort für neuen Superuser\n"
+
+#: initdb.c:2212
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALVERZ Verzeichnis für das Write-Ahead-Log\n"
+
+#: initdb.c:2213
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=ZAHL Größe eines WAL-Segments, in Megabyte\n"
+
+#: initdb.c:2214
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Weniger häufig verwendete Optionen:\n"
+
+#: initdb.c:2215
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug erzeuge eine Menge Debug-Ausgaben\n"
+
+#: initdb.c:2216
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches debug_discard_caches=1 setzen\n"
+
+#: initdb.c:2217
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L VERZEICHNIS wo sind die Eingabedateien zu finden\n"
+
+#: initdb.c:2218
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean nach Fehlern nicht aufräumen\n"
+
+#: initdb.c:2219
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n"
+" geschrieben sind\n"
+
+#: initdb.c:2220
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions Anleitung für nächste Schritte nicht ausgeben\n"
+
+#: initdb.c:2221
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show zeige interne Einstellungen\n"
+
+#: initdb.c:2222
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr ""
+" -S, --sync-only nur Datenbankdateien auf Festplatte synchronisieren,\n"
+" dann beenden\n"
+
+#: initdb.c:2223
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Weitere Optionen:\n"
+
+#: initdb.c:2224
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: initdb.c:2225
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: initdb.c:2226
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Wenn kein Datenverzeichnis angegeben ist, dann wird die Umgebungsvariable\n"
+"PGDATA verwendet.\n"
+
+#: initdb.c:2228
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: initdb.c:2229
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: initdb.c:2257
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "ungültige Authentifizierungsmethode »%s« für »%s«-Verbindungen"
+
+#: initdb.c:2271
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "Superuser-Passwort muss angegeben werden um Passwortauthentifizierung einzuschalten"
+
+#: initdb.c:2290
+#, c-format
+msgid "no data directory specified"
+msgstr "kein Datenverzeichnis angegeben"
+
+#: initdb.c:2291
+#, c-format
+msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA."
+msgstr "Sie müssen das Verzeichnis angeben, wo dieses Datenbanksystem abgelegt werden soll. Machen Sie dies entweder mit der Kommandozeilenoption -D oder mit der Umgebungsvariable PGDATA."
+
+#: initdb.c:2308
+#, c-format
+msgid "could not set environment"
+msgstr "konnte Umgebung nicht setzen"
+
+#: initdb.c:2326
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden"
+
+#: initdb.c:2329
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s"
+
+#: initdb.c:2344
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "Eingabedatei muss absoluten Pfad haben"
+
+#: initdb.c:2361
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "Der Datenbankcluster wird mit der Locale »%s« initialisiert werden.\n"
+
+#: initdb.c:2364
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "Der Datenbankcluster wird mit dieser Locale-Konfiguration initialisiert werden:\n"
+
+#: initdb.c:2365
+#, c-format
+msgid " provider: %s\n"
+msgstr " Provider: %s\n"
+
+#: initdb.c:2367
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " ICU-Locale: %s\n"
+
+#: initdb.c:2368
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2385
+#, c-format
+msgid "The default database encoding has been set to \"%s\".\n"
+msgstr "Die Standarddatenbankkodierung wurde auf »%s« gesetzt.\n"
+
+#: initdb.c:2397
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "konnte keine passende Kodierung für Locale »%s« finden"
+
+#: initdb.c:2399
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "Führen Sie %s erneut mit der Option -E aus."
+
+#: initdb.c:2400 initdb.c:3021 initdb.c:3041
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: initdb.c:2412
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"Die von der Locale gesetzte Kodierung »%s« ist nicht als serverseitige Kodierung erlaubt.\n"
+"Die Standarddatenbankkodierung wird stattdessen auf »%s« gesetzt.\n"
+
+#: initdb.c:2417
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "Locale »%s« benötigt nicht unterstützte Kodierung »%s«"
+
+#: initdb.c:2419
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "Kodierung »%s« ist nicht als serverseitige Kodierung erlaubt."
+
+#: initdb.c:2421
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "Starten Sie %s erneut mit einer anderen Locale-Wahl."
+
+#: initdb.c:2429
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "Die Standarddatenbankkodierung wurde entsprechend auf »%s« gesetzt.\n"
+
+#: initdb.c:2498
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "konnte keine passende Textsuchekonfiguration für Locale »%s« finden"
+
+#: initdb.c:2509
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "passende Textsuchekonfiguration für Locale »%s« ist unbekannt"
+
+#: initdb.c:2514
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "angegebene Textsuchekonfiguration »%s« passt möglicherweise nicht zur Locale »%s«"
+
+#: initdb.c:2519
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "Die Standardtextsuchekonfiguration wird auf »%s« gesetzt.\n"
+
+#: initdb.c:2562 initdb.c:2633
+#, c-format
+msgid "creating directory %s ... "
+msgstr "erzeuge Verzeichnis %s ... "
+
+#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m"
+
+#: initdb.c:2576 initdb.c:2648
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "berichtige Zugriffsrechte des bestehenden Verzeichnisses %s ... "
+
+#: initdb.c:2581 initdb.c:2653
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "konnte Rechte des Verzeichnisses »%s« nicht ändern: %m"
+
+#: initdb.c:2593 initdb.c:2665
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "Verzeichnis »%s« existiert aber ist nicht leer"
+
+#: initdb.c:2597
+#, c-format
+msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"."
+msgstr "Wenn Sie ein neues Datenbanksystem erzeugen wollen, entfernen oder leeren Sie das Verzeichnis »%s« or führen Sie %s mit einem anderen Argument als »%s« aus."
+
+#: initdb.c:2605 initdb.c:2675 initdb.c:3058
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m"
+
+#: initdb.c:2626
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL-Verzeichnis muss absoluten Pfad haben"
+
+#: initdb.c:2669
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "Wenn Sie dort den WAL ablegen wollen, entfernen oder leeren Sie das Verzeichnis »%s«."
+
+#: initdb.c:2680
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m"
+
+#: initdb.c:2683
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "symbolische Verknüpfungen werden auf dieser Plattform nicht unterstützt"
+
+#: initdb.c:2702
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "Es enthält eine unsichtbare Datei (beginnt mit Punkt), vielleicht weil es ein Einhängepunkt ist."
+
+#: initdb.c:2704
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Es enthält ein Verzeichnis »lost+found«, vielleicht weil es ein Einhängepunkt ist."
+
+#: initdb.c:2706
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"Einen Einhängepunkt direkt als Datenverzeichnis zu verwenden wird nicht empfohlen.\n"
+"Erzeugen Sie ein Unterverzeichnis unter dem Einhängepunkt."
+
+#: initdb.c:2732
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "erzeuge Unterverzeichnisse ... "
+
+#: initdb.c:2775
+msgid "performing post-bootstrap initialization ... "
+msgstr "führe Post-Bootstrap-Initialisierung durch ... "
+
+#: initdb.c:2940
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Debug-Modus ist an.\n"
+
+#: initdb.c:2944
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "No-Clean-Modus ist an. Bei Fehlern wird nicht aufgeräumt.\n"
+
+#: initdb.c:3014
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "unbekannter Locale-Provider: %s"
+
+#: initdb.c:3039
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: initdb.c:3046
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s kann nur angegeben werden, wenn Locale-Provider »%s« gewählt ist"
+
+#: initdb.c:3060 initdb.c:3137
+msgid "syncing data to disk ... "
+msgstr "synchronisiere Daten auf Festplatte ... "
+
+#: initdb.c:3068
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "Passwortprompt und Passwortdatei können nicht zusammen angegeben werden"
+
+#: initdb.c:3090
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "Argument von --wal-segsize muss eine Zahl sein"
+
+#: initdb.c:3092
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "Argument von --wal-segsize muss eine Zweierpotenz zwischen 1 und 1024 sein"
+
+#: initdb.c:3106
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "Superuser-Name »%s« nicht erlaubt; Rollennamen können nicht mit »pg_« anfangen"
+
+#: initdb.c:3108
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Die Dateien, die zu diesem Datenbanksystem gehören, werden dem Benutzer\n"
+"»%s« gehören. Diesem Benutzer muss auch der Serverprozess gehören.\n"
+"\n"
+
+#: initdb.c:3124
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Datenseitenprüfsummen sind eingeschaltet.\n"
+
+#: initdb.c:3126
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Datenseitenprüfsummen sind ausgeschaltet.\n"
+
+#: initdb.c:3143
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Synchronisation auf Festplatte übersprungen.\n"
+"Das Datenverzeichnis könnte verfälscht werden, falls das Betriebssystem abstürzt.\n"
+
+#: initdb.c:3148
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "Authentifizierung für lokale Verbindungen auf »trust« gesetzt"
+
+#: initdb.c:3149
+#, c-format
+msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb."
+msgstr "Sie können dies ändern, indem Sie pg_hba.conf bearbeiten oder beim nächsten Aufruf von initdb die Option -A, oder --auth-local und --auth-host, verwenden."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3179
+msgid "logfile"
+msgstr "logdatei"
+
+#: initdb.c:3181
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Erfolg. Sie können den Datenbankserver jetzt mit\n"
+"\n"
+" %s\n"
+"\n"
+"starten.\n"
+"\n"
diff --git a/src/bin/initdb/po/el.po b/src/bin/initdb/po/el.po
new file mode 100644
index 0000000..7c1c32a
--- /dev/null
+++ b/src/bin/initdb/po/el.po
@@ -0,0 +1,1051 @@
+# Greek message translation file for initdb
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the initdb (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 08:19+0000\n"
+"PO-Revision-Date: 2023-04-12 11:22+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "προειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέρεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "δεν ήταν δυνατή η αναγνώριση του τρέχοντος καταλόγου: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "μη έγκυρο δυαδικό αρχείο «%s»"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "δεν ήταν δυνατή η ανάγνωση του δυαδικού αρχείου «%s»"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "δεν βρέθηκε το αρχείο «%s» για να εκτελεστεί"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου «%s»: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() απέτυχε: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: initdb.c:334
+#, c-format
+msgid "out of memory"
+msgstr "έλλειψη μνήμης"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "έλλειψη μνήμης\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "δεν ήταν δυνατή η αντιγραφή δείκτη null (εσωτερικό σφάλμα)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο «%s»: %m"
+
+#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m"
+
+#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής fsync στο αρχείο «%s»: %m"
+
+#: ../../common/file_utils.c:383
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "δεν ήταν δυνατή η μετονομασία του αρχείου «%s» σε «%s»: %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "δεν ήταν δυνατή η φόρτωση της βιβλιοθήκης «%s»: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "δεν ήταν δυνατή η δημιουργία διακριτικών περιορισμού στην παρούσα πλατφόρμα: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "δεν ήταν δυνατό το άνοιγμα διακριτικού διεργασίας: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "δεν ήταν δυνατή η εκχώρηση SID: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "δεν ήταν δυνατή η δημιουργία διακριτικού διεργασίας: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "δεν ήταν δυνατή η εκκίνηση διεργασίας για την εντολή «%s»: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "δεν ήταν δυνατή η επανεκκίνηση με διακριτικό περιορισμού: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "δεν ήταν δυνατή η απόκτηση κωδικού εξόδου από την υποδιεργασία: κωδικός σφάλματος %lu"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο ή κατάλογο «%s»: %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αφαίρεση αρχείου ή καταλόγου «%s»: %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "δεν ήταν δυνατή η αναζήτηση ενεργής ταυτότητας χρήστη %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "ο χρήστης δεν υπάρχει"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "αποτυχία αναζήτησης ονόματος χρήστη: κωδικός σφάλματος %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "εντολή μη εκτελέσιμη"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "εντολή δεν βρέθηκε"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "απόγονος διεργασίας τερμάτισε με κωδικό εξόδου %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "απόγονος διεργασίας τερματίστηκε με εξαίρεση 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "απόγονος διεργασίας τερματίστηκε με σήμα %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "απόγονος διεργασίας τερμάτισε με μη αναγνωρίσιμη κατάσταση %d"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "δεν ήταν δυνατός ο ορισμός διασταύρωσης για «%s»: %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "δεν ήταν δυνατή η απόκτηση διασταύρωσης για «%s»: %s\n"
+
+#: initdb.c:464 initdb.c:1459
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου «%s» για ανάγνωση: %m"
+
+#: initdb.c:505 initdb.c:809 initdb.c:829
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου «%s» για εγγραφή: %m"
+
+#: initdb.c:509 initdb.c:812 initdb.c:831
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγραφή αρχείου «%s»: %m"
+
+#: initdb.c:513
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου «%s»: %m"
+
+#: initdb.c:529
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής «%s»: %m"
+
+#: initdb.c:547
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "αφαιρείται ο κατάλογος δεδομένων «%s»"
+
+#: initdb.c:549
+#, c-format
+msgid "failed to remove data directory"
+msgstr "απέτυχε η αφαίρεση καταλόγου δεδομένων"
+
+#: initdb.c:553
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "αφαιρούνται περιεχόμενα του καταλόγου δεδομένων «%s»"
+
+#: initdb.c:556
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "απέτυχε η αφαίρεση περιεχομένων του καταλόγου δεδομένων"
+
+#: initdb.c:561
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "αφαίρεση καταλόγου WAL «%s»"
+
+#: initdb.c:563
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "απέτυχε η αφαίρεση καταλόγου WAL"
+
+#: initdb.c:567
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "αφαιρούνται τα περιεχόμενα του καταλόγου WAL «%s»"
+
+#: initdb.c:569
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "απέτυχε η αφαίρεση περιεχόμενων του καταλόγου WAL"
+
+#: initdb.c:576
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "ο κατάλογος δεδομένων «%s» δεν αφαιρείται κατα απαίτηση του χρήστη"
+
+#: initdb.c:580
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "ο κατάλογος WAL «%s» δεν αφαιρέθηκε κατά απαίτηση του χρήστη"
+
+#: initdb.c:598
+#, c-format
+msgid "cannot be run as root"
+msgstr "δεν δύναται η εκτέλεση ως υπερχρήστης"
+
+#: initdb.c:599
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "Παρακαλώ συνδεθείτε (χρησιμοποιώντας, π.χ. την εντολή «su») ως ο (μη προνομιούχος) χρήστης που θα είναι κάτοχος της διεργασίας του διακομιστή."
+
+#: initdb.c:631
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "«%s» δεν είναι έγκυρο όνομα κωδικοποίησης διακομιστή"
+
+#: initdb.c:775
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "το αρχείο «%s» δεν υπάρχει"
+
+#: initdb.c:776 initdb.c:781 initdb.c:788
+#, c-format
+msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."
+msgstr "Αυτό μπορεί να σημαίνει ότι έχετε μια κατεστραμμένη εγκατάσταση ή ορίσατε λάθος κατάλογο με την επιλογή επίκλησης -L."
+
+#: initdb.c:780
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η πρόσβαση του αρχείο «%s»: %m"
+
+#: initdb.c:787
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "το αρχείο «%s» δεν είναι ένα κανονικό αρχείο"
+
+#: initdb.c:922
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "επιλογή εφαρμογής δυναμικής κοινόχρηστης μνήμης ... "
+
+#: initdb.c:931
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "επιλογή προκαθορισμένης τιμής max_connections ... "
+
+#: initdb.c:962
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "επιλογή προκαθορισμένης τιμής shared_buffers ... "
+
+#: initdb.c:996
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "επιλογή προκαθορισμένης ζώνης ώρας ... "
+
+#: initdb.c:1030
+msgid "creating configuration files ... "
+msgstr "δημιουργία αρχείων ρύθμισης ... "
+
+#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αλλαγή δικαιωμάτων του «%s»: %m"
+
+#: initdb.c:1319
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "εκτέλεση σεναρίου bootstrap ... "
+
+#: initdb.c:1331
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "το αρχείο εισόδου «%s» δεν ανήκει στην PostgreSQL %s"
+
+#: initdb.c:1333
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Καθορίστε τη σωστή διαδρομή χρησιμοποιώντας την επιλογή -L."
+
+#: initdb.c:1437
+msgid "Enter new superuser password: "
+msgstr "Εισάγετε νέο κωδικό πρόσβασης υπερχρήστη: "
+
+#: initdb.c:1438
+msgid "Enter it again: "
+msgstr "Εισάγετε ξανά: "
+
+#: initdb.c:1441
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Οι κωδικοί πρόσβασης δεν είναι ίδιοι.\n"
+
+#: initdb.c:1465
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση κωδικού πρόσβασης από το αρχείο «%s»: %m"
+
+#: initdb.c:1468
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "αρχείο κωδικών πρόσβασης «%s» είναι άδειο"
+
+#: initdb.c:1915
+#, c-format
+msgid "caught signal\n"
+msgstr "συνελήφθει σήμα\n"
+
+#: initdb.c:1921
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "δεν ήταν δυνατή η εγγραφή στην απογονική διεργασία: %s\n"
+
+#: initdb.c:1929
+#, c-format
+msgid "ok\n"
+msgstr "εντάξει\n"
+
+#: initdb.c:2018
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() απέτυχε"
+
+#: initdb.c:2036
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "απέτυχε να επαναφέρει την παλαιά εντοπιότητα «%s»"
+
+#: initdb.c:2043
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "άκυρη ονομασία εντοπιότητας «%s»"
+
+#: initdb.c:2054
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "μη έγκυρες ρυθμίσεις εντοπιότητας, ελέγξτε τις μεταβλητές περιβάλλοντος LANG και LC_*"
+
+#: initdb.c:2080 initdb.c:2104
+#, c-format
+msgid "encoding mismatch"
+msgstr "αναντιστοιχία κωδικοποίησης"
+
+#: initdb.c:2081
+#, c-format
+msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions."
+msgstr "Η κωδικοποίηση που επιλέξατε (%s) και η κωδικοποίηση που χρησιμοποιεί η επιλεγμένη τοπική γλώσσα (%s) δεν ταιριάζουν. Αυτό θα οδηγούσε σε κακή συμπεριφορά σε διάφορες λειτουργίες επεξεργασίας συμβολοσειρών χαρακτήρων."
+
+#: initdb.c:2086 initdb.c:2107
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "Επανεκτελέστε %s και είτε μην καθορίσετε ρητά μια κωδικοποίηση, είτε επιλέξτε ταιριαστό συνδυασμό."
+
+#: initdb.c:2105
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "Η κωδικοποίηση που επιλέξατε (%s) δεν υποστηρίζεται από τον πάροχο ICU."
+
+#: initdb.c:2169
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "ICU εντοπιότητα πρέπει να έχει καθοριστεί"
+
+#: initdb.c:2176
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU δεν υποστηρίζεται σε αυτήν την πλατφόρμα"
+
+#: initdb.c:2187
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s αρχικοποιεί μία συστάδα PostgreSQL βάσης δεδομένων.\n"
+"\n"
+
+#: initdb.c:2188
+#, c-format
+msgid "Usage:\n"
+msgstr "Χρήση:\n"
+
+#: initdb.c:2189
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [ΕΠΙΛΟΓH]... [DATADIR]\n"
+
+#: initdb.c:2190
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Επιλογές:\n"
+
+#: initdb.c:2191
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=METHOD προκαθορισμένη μέθοδος ταυτοποίησης για τοπικές συνδέσεις\n"
+
+#: initdb.c:2192
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=METHOD προκαθορισμένη μέθοδος ταυτοποίησης για τοπικές συνδέσεις πρωτοκόλλου TCP/IP\n"
+
+#: initdb.c:2193
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=METHOD προκαθορισμένη μέθοδος ταυτοποίησης για συνδέσεις τοπικής υποδοχής\n"
+
+#: initdb.c:2194
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATADIR τοποθεσία για αυτή τη συστάδα βάσης δεδομένων\n"
+
+#: initdb.c:2195
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=ENCODING όρισε την προκαθορισμένη κωδικοποίηση για καινούριες βάσεις δεδομένων\n"
+
+#: initdb.c:2196
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access επέτρεψε εγγραφή/ανάγνωση για την ομάδα στο κατάλογο δεδομένων\n"
+
+#: initdb.c:2197
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --locale=LOCALE όρισε την ICU εντοπιότητα για καινούριες βάσεις δεδομένων\n"
+
+#: initdb.c:2198
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums χρησιμοποίησε αθροίσματα ελέγχου σελίδων δεδομένων\n"
+
+#: initdb.c:2199
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE όρισε την προκαθορισμένη εντοπιότητα για καινούριες βάσεις δεδομένων\n"
+
+#: initdb.c:2200
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" όρισε την προκαθορισμένη εντοπιότητα για τις σχετικές κατηγορίες\n"
+" καινούριων βάσεων δεδομένων (προκαθορισμένη τιμή διαβάζεται από το περιβάλλον)\n"
+
+#: initdb.c:2204
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale ισοδύναμο με --locale=C\n"
+
+#: initdb.c:2205
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" όρισε τον προκαθορισμένο πάροχο εντοπιότητας για νέες βάσεις δεδομένων\n"
+
+#: initdb.c:2207
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=FILE διάβασε τον κωδικό πρόσβασης για τον νέο υπερχρήστη από το αρχείο\n"
+
+#: initdb.c:2208
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" προκαθορισμένη ρύθμιση αναζήτησης κειμένου\n"
+
+#: initdb.c:2210
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAME όνομα υπερχρήστη βάσης δεδομένων\n"
+
+#: initdb.c:2211
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt προτροπή για κωδικό πρόσβασης για τον νέο υπερχρήστη\n"
+
+#: initdb.c:2212
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR τοποθεσία για τον κατάλογο write-ahead log\n"
+
+#: initdb.c:2213
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE μέγεθος των τμημάτων WAL, σε megabytes\n"
+
+#: initdb.c:2214
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Λιγότερο συχνά χρησιμοποιούμενες επιλογές:\n"
+
+#: initdb.c:2215
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug δημιούργησε πολλές καταγραφές αποσφαλμάτωσης\n"
+
+#: initdb.c:2216
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches όρισε debug_discard_caches=1\n"
+
+#: initdb.c:2217
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORY τοποθεσία εύρεσης αρχείων εισόδου\n"
+
+#: initdb.c:2218
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean να μην καθαριστούν σφάλματα\n"
+
+#: initdb.c:2219
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync να μην αναμένει την ασφαλή εγγραφή αλλαγών στον δίσκο\n"
+
+#: initdb.c:2220
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions να μην εκτυπώσει οδηγίες για τα επόμενα βήματα\n"
+
+#: initdb.c:2221
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show δείξε τις εσωτερικές ρυθμίσεις\n"
+
+#: initdb.c:2222
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only συγχρόνισε μόνο αρχεία της βάσης δεδομένων στον δίσκο, στη συνέχεια έξοδος\n"
+
+#: initdb.c:2223
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Άλλες επιλογές:\n"
+
+#: initdb.c:2224
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: initdb.c:2225
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: initdb.c:2226
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Εάν δεν έχει καθοριστεί ο κατάλογος δεδομένων, χρησιμοποιείται η\n"
+"μεταβλητή περιβάλλοντος PGDATA.\n"
+
+#: initdb.c:2228
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφορές σφάλματων σε <%s>.\n"
+
+#: initdb.c:2229
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αρχική σελίδα: <%s>\n"
+
+#: initdb.c:2257
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "μη έγκυρη μέθοδος ταυτοποίησης «%s» για συνδέσεις «%s»"
+
+#: initdb.c:2271
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "απαιτείται ο καθορισμός κωδικού πρόσβασης για τον υπερχρήστη για να την ενεργοποίηση του ελέγχου ταυτότητας κωδικού πρόσβασης"
+
+#: initdb.c:2290
+#, c-format
+msgid "no data directory specified"
+msgstr "δεν ορίστηκε κατάλογος δεδομένων"
+
+#: initdb.c:2291
+#, c-format
+msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA."
+msgstr "Πρέπει να προσδιορίσετε τον κατάλογο όπου θα αποθηκεύονται τα δεδομένα. Κάντε το είτε με την επιλογή κλήσης -D ή με τη μεταβλητή περιβάλλοντος PGDATA."
+
+#: initdb.c:2308
+#, c-format
+msgid "could not set environment"
+msgstr "δεν ήταν δυνατή η ρύθμιση περιβάλλοντος"
+
+#: initdb.c:2326
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "το πρόγραμμα «%s» απαιτείται από το %s αλλά δεν βρέθηκε στον ίδιο κατάλογο με το «%s»."
+
+#: initdb.c:2329
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "το πρόγραμμα «%s» βρέθηκε από το «%s» αλλά δεν ήταν η ίδια έκδοση με το %s"
+
+#: initdb.c:2344
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "η τοποθεσία του αρχείου εισόδου πρέπει να είναι μία πλήρης διαδρομή"
+
+#: initdb.c:2361
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "Η συστάδα βάσης δεδομένων θα αρχικοποιηθεί με εντοπιότητα «%s».\n"
+
+#: initdb.c:2364
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "Η συστάδα βάσης δεδομένων θα αρχικοποιηθεί με αυτή τη ρύθμιση εντοπιότητας:\n"
+
+#: initdb.c:2365
+#, c-format
+msgid " provider: %s\n"
+msgstr " πάροχος: %s\n"
+
+#: initdb.c:2367
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " ICU εντοπιότητα: %s\n"
+
+#: initdb.c:2368
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2385
+#, c-format
+msgid "The default database encoding has been set to \"%s\".\n"
+msgstr "Η προεπιλεγμένη κωδικοποίηση βάσης δεδομένων έχει οριστεί ως «%s».\n"
+
+#: initdb.c:2397
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "δεν μπόρεσε να βρεθεί κατάλληλη κωδικοποίηση για την εντοπιότητα «%s»"
+
+#: initdb.c:2399
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "Επανεκτελέστε %s με την επιλογή -E."
+
+#: initdb.c:2400 initdb.c:3021 initdb.c:3041
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες."
+
+#: initdb.c:2412
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"Η κωδικοποίηση «%s» που υπονοείται από τις τοπικές ρυθμίσεις δεν επιτρέπεται ως κωδικοποίηση από την πλευρά του διακομιστή.\n"
+"Η προεπιλεγμένη κωδικοποίηση βάσης δεδομένων θα οριστεί σε «%s».\n"
+
+#: initdb.c:2417
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "εντοπιότητα «%s» προαπαιτεί τη μην υποστηριζόμενη κωδικοποίηση«%s»"
+
+#: initdb.c:2419
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "Η κωδικοποίηση «%s» δεν επιτρέπεται ως κωδικοποίηση από την πλευρά του διακομιστή."
+
+#: initdb.c:2421
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "Επανεκτελέστε %s με διαφορετική επιλογή εντοπιότητας."
+
+#: initdb.c:2429
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "Η προεπιλεγμένη κωδικοποίηση βάσης δεδομένων έχει οριστεί ως «%s».\n"
+
+#: initdb.c:2498
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "δεν ήταν δυνατή η εύρεση κατάλληλων ρυθμίσεων για την μηχανή αναζήτησης για την εντοπιότητα «%s»"
+
+#: initdb.c:2509
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "οι κατάλληλες ρυθμίσεις για την μηχανή αναζήτησης για την εντοπιότητα «%s» δεν είναι γνωστές"
+
+#: initdb.c:2514
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "η ορισμένη ρύθμιση μηχανής αναζήτησης «%s» μπορεί να μην ταιριάζει με την εντοπιότητα «%s»"
+
+#: initdb.c:2519
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "Η προκαθορισμένη ρύθμιση μηχανής αναζήτησης θα οριστεί ως «%s».\n"
+
+#: initdb.c:2562 initdb.c:2633
+#, c-format
+msgid "creating directory %s ... "
+msgstr "δημιουργία καταλόγου %s ... "
+
+#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουργία του καταλόγου «%s»: %m"
+
+#: initdb.c:2576 initdb.c:2648
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "διορθώνονται τα δικαιώματα του υπάρχοντος καταλόγου %s ... "
+
+#: initdb.c:2581 initdb.c:2653
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αλλαγή δικαιωμάτων του καταλόγου «%s»: %m"
+
+#: initdb.c:2593 initdb.c:2665
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "ο κατάλογος «%s» υπάρχει και δεν είναι άδειος"
+
+#: initdb.c:2597
+#, c-format
+msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"."
+msgstr "Αν θέλετε να δημιουργήσετε ένα νέο σύστημα βάσεων δεδομένων, είτε αφαιρέστε ή αδειάστε τον κατάλογο «%s» είτε εκτελέστε το %s με ένα άλλο όρισμα εκτός από το «%s» ."
+
+#: initdb.c:2605 initdb.c:2675 initdb.c:3058
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η πρόσβαση του καταλόγου «%s»: %m"
+
+#: initdb.c:2626
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "η τοποθεσία του καταλόγου WAL πρέπει να είναι μία πλήρης διαδρομή"
+
+#: initdb.c:2669
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "Εάν θέλετε να αποθηκεύσετε το WAL εκεί, είτε αφαιρέστε ή αδειάστε τον κατάλογο «%s»."
+
+#: initdb.c:2680
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουργία του συμβολικού συνδέσμου «%s»: %m"
+
+#: initdb.c:2683
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "συμβολικοί σύνδεσμοι δεν υποστηρίζονται στην παρούσα πλατφόρμα"
+
+#: initdb.c:2702
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "Περιέχει ένα αρχείο με πρόθεμα κουκκίδας/αόρατο, ίσως επειδή είναι ένα σημείο προσάρτησης."
+
+#: initdb.c:2704
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Περιέχει έναν κατάλογο lost+found, ίσως επειδή είναι ένα σημείο προσάρτησης."
+
+#: initdb.c:2706
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"Δεν προτείνεται η άμεση χρήση ενός σημείου προσάρτησης ως καταλόγου δεδομένων.\n"
+"Δημιουργείστε έναν υποκατάλογο υπό του σημείου προσάρτησης."
+
+#: initdb.c:2732
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "δημιουργία υποκαταλόγων ... "
+
+#: initdb.c:2775
+msgid "performing post-bootstrap initialization ... "
+msgstr "πραγματοποίηση σταδίου αρχικοποίησης post-bootstrap ... "
+
+#: initdb.c:2940
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Εκτέλεση σε λειτουργία αποσφαλμάτωσης.\n"
+
+#: initdb.c:2944
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "Εκτέλεση σε λειτουργία μη καθαρισμού. Τα σφάλματα δεν θα καθαριστούν.\n"
+
+#: initdb.c:3014
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "μη αναγνωρίσιμος πάροχος εντοπιότητας: %s"
+
+#: initdb.c:3039
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)"
+
+#: initdb.c:3046
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s δεν είναι δυνατό να καθοριστεί, εκτός εάν επιλεγεί «%s» ως πάροχος εντοπιότητας"
+
+#: initdb.c:3060 initdb.c:3137
+msgid "syncing data to disk ... "
+msgstr "συγχρονίζονται δεδομένα στο δίσκο ... "
+
+#: initdb.c:3068
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "η προτροπή κωδικού εισόδου και το αρχείο κωδικού εισόδου δεν δύναται να οριστούν ταυτόχρονα"
+
+#: initdb.c:3090
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "η παράμετρος --wal-segsize πρέπει να είναι αριθμός"
+
+#: initdb.c:3092
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "η παράμετρος --wal-segsize πρέπει να έχει τιμή δύναμης 2 μεταξύ 1 και 1024"
+
+#: initdb.c:3106
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "το όνομα υπερχρήστη «%s» δεν επιτρέπεται, τα ονόματα ρόλων δεν δύναται να αρχίζουν με «pg_»"
+
+#: initdb.c:3108
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Τα αρχεία που ανήκουν σε αυτό το σύστημα βάσης δεδομένων θα ανήκουν στο χρήστη «%s».\n"
+"Αυτός ο χρήστης πρέπει επίσης να κατέχει τη διαδικασία διακομιστή.\n"
+"\n"
+
+#: initdb.c:3124
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Τα αθροίσματα ελέγχου σελίδων δεδομένων είναι ενεργοποιημένα.\n"
+
+#: initdb.c:3126
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Τα αθροίσματα ελέγχου των σελίδων δεδομένων είναι απενεργοποιημένα.\n"
+
+#: initdb.c:3143
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Ο συγχρονισμός με το δίσκο παραλείφθηκε.\n"
+"Ο κατάλογος δεδομένων ενδέχεται να αλλοιωθεί εάν καταρρεύσει το λειτουργικού συστήματος.\n"
+
+#: initdb.c:3148
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "ενεργοποιείται η μέθοδος ταυτοποίησης «trust» για τοπικές συνδέσεις"
+
+#: initdb.c:3149
+#, c-format
+msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb."
+msgstr "Μπορείτε να το αλλάξετε αυτό τροποποιώντας το pg_hba.conf ή χρησιμοποιώντας την επιλογή -A ή --auth-local και --auth-host, την επόμενη φορά που θα εκτελέσετε το initdb."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3179
+msgid "logfile"
+msgstr "logfile"
+
+#: initdb.c:3181
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Επιτυχία. Μπορείτε τώρα να εκκινήσετε τον διακομιστή βάσης δεδομένων χρησιμοποιώντας:\n"
+"\n"
+" %s\n"
+"\n"
+
+#~ msgid " --clobber-cache use cache-clobbering debug option\n"
+#~ msgstr " --clobber-cache χρησιμοποίησε την επιλογή εντοπισμού σφαλμάτων cache-clobbering\n"
+
+#~ msgid "fatal: "
+#~ msgstr "κρίσιμο: "
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "απέτυχε η εντολή pclose: %m"
diff --git a/src/bin/initdb/po/es.po b/src/bin/initdb/po/es.po
new file mode 100644
index 0000000..b9c388a
--- /dev/null
+++ b/src/bin/initdb/po/es.po
@@ -0,0 +1,1064 @@
+# Spanish translation of initdb.
+#
+# Copyright (c) 2004-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Álvaro Herrera <alvherre@alvh.no-ip.org>, 2004-2013
+# Carlos Chapi <carloswaldo@babelruins.org>, 2014, 2021
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:49+0000\n"
+"PO-Revision-Date: 2023-05-24 19:23+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "no se pudo identificar el directorio actual: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "el binario «%s» no es válido"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "no se pudo leer el binario «%s»"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "no se pudo encontrar un «%s» para ejecutar"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "no se pudo cambiar al directorio «%s»: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "no se pudo leer el enlace simbólico «%s»: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falló: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: initdb.c:334
+#, c-format
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "no se puede duplicar un puntero nulo (error interno)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "no se pudo hacer stat al archivo «%s»: %m"
+
+#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "no se pudo leer el directorio «%s»: %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m"
+
+#: ../../common/file_utils.c:383
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "no se pudo cargar la biblioteca «%s»: código de error %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "no se pueden crear tokens restrigidos en esta plataforma: código de error %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "no se pudo abrir el token de proceso: código de error %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "no se pudo emplazar los SIDs: código de error %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "no se pudo crear el token restringido: código de error %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "no se pudo iniciar el proceso para la orden «%s»: código de error %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "no se pudo re-ejecutar con el token restringido: código de error %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "no se pudo obtener el código de salida del subproceso»: código de error %lu"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "no se pudo hacer stat al archivo o directorio «%s»: %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "no se pudo borrar el archivo o el directorio «%s»: %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "no se pudo buscar el ID de usuario efectivo %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "el usuario no existe"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "fallo en la búsqueda de nombre de usuario: código de error %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "la orden no es ejecutable"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "orden no encontrada"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "el proceso hijo terminó con código de salida %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "el proceso hijo fue terminado por una excepción 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "el proceso hijo fue terminado por una señal %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "el proceso hijo terminó con código no reconocido %d"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "no se pudo definir un junction para «%s»: %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "no se pudo obtener junction para «%s»: %s\n"
+
+#: initdb.c:464 initdb.c:1459
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "no se pudo abrir archivo «%s» para lectura: %m"
+
+#: initdb.c:505 initdb.c:809 initdb.c:829
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "no se pudo abrir el archivo «%s» para escritura: %m"
+
+#: initdb.c:509 initdb.c:812 initdb.c:831
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "no se pudo escribir el archivo «%s»: %m"
+
+#: initdb.c:513
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo «%s»: %m"
+
+#: initdb.c:529
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "no se pudo ejecutar la orden «%s»: %m"
+
+#: initdb.c:547
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "eliminando el directorio de datos «%s»"
+
+#: initdb.c:549
+#, c-format
+msgid "failed to remove data directory"
+msgstr "no se pudo eliminar el directorio de datos"
+
+#: initdb.c:553
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "eliminando el contenido del directorio «%s»"
+
+#: initdb.c:556
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "no se pudo eliminar el contenido del directorio de datos"
+
+#: initdb.c:561
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "eliminando el directorio de WAL «%s»"
+
+#: initdb.c:563
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "no se pudo eliminar el directorio de WAL"
+
+#: initdb.c:567
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "eliminando el contenido del directorio de WAL «%s»"
+
+#: initdb.c:569
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "no se pudo eliminar el contenido del directorio de WAL"
+
+#: initdb.c:576
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "directorio de datos «%s» no eliminado a petición del usuario"
+
+#: initdb.c:580
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "directorio de WAL «%s» no eliminado a petición del usuario"
+
+#: initdb.c:598
+#, c-format
+msgid "cannot be run as root"
+msgstr "no se puede ejecutar como «root»"
+
+#: initdb.c:599
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "Por favor conéctese (usando, por ejemplo, «su») con un usuario no privilegiado, quien ejecutará el proceso servidor."
+
+#: initdb.c:631
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "«%s» no es un nombre válido de codificación"
+
+#: initdb.c:775
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "el archivo «%s» no existe"
+
+#: initdb.c:776 initdb.c:781 initdb.c:788
+#, c-format
+msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."
+msgstr "Esto puede significar que tiene una instalación corrupta o ha identificado el directorio equivocado con la opción -L."
+
+#: initdb.c:780
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "no se pudo acceder al archivo «%s»: %m"
+
+#: initdb.c:787
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "el archivo «%s» no es un archivo regular"
+
+#: initdb.c:922
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "seleccionando implementación de memoria compartida dinámica ... "
+
+#: initdb.c:931
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "seleccionando el valor para max_connections ... "
+
+#: initdb.c:962
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "seleccionando el valor para shared_buffers ... "
+
+#: initdb.c:996
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "seleccionando el huso horario por omisión ... "
+
+#: initdb.c:1030
+msgid "creating configuration files ... "
+msgstr "creando archivos de configuración ... "
+
+#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "no se pudo cambiar los permisos de «%s»: %m"
+
+#: initdb.c:1319
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "ejecutando script de inicio (bootstrap) ... "
+
+#: initdb.c:1331
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "el archivo de entrada «%s» no pertenece a PostgreSQL %s"
+
+#: initdb.c:1333
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Especifique la ruta correcta usando la opción -L."
+
+#: initdb.c:1437
+msgid "Enter new superuser password: "
+msgstr "Ingrese la nueva contraseña del superusuario: "
+
+#: initdb.c:1438
+msgid "Enter it again: "
+msgstr "Ingrésela nuevamente: "
+
+#: initdb.c:1441
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Las contraseñas no coinciden.\n"
+
+#: initdb.c:1465
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "no se pudo leer la contraseña desde el archivo «%s»: %m"
+
+#: initdb.c:1468
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "el archivo de contraseña «%s» está vacío"
+
+#: initdb.c:1915
+#, c-format
+msgid "caught signal\n"
+msgstr "se ha capturado una señal\n"
+
+#: initdb.c:1921
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "no se pudo escribir al proceso hijo: %s\n"
+
+#: initdb.c:1929
+#, c-format
+msgid "ok\n"
+msgstr "hecho\n"
+
+#: initdb.c:2018
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() falló"
+
+#: initdb.c:2036
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "no se pudo restaurar la configuración regional anterior «%s»"
+
+#: initdb.c:2043
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "nombre de configuración regional «%s» no es válido"
+
+#: initdb.c:2054
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "configuración regional inválida; revise las variables de entorno LANG y LC_*"
+
+#: initdb.c:2080 initdb.c:2104
+#, c-format
+msgid "encoding mismatch"
+msgstr "codificaciones no coinciden"
+
+#: initdb.c:2081
+#, c-format
+msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions."
+msgstr "La codificación que seleccionó (%s) y la codificación de la configuración regional elegida (%s) no coinciden. Esto llevaría a comportamientos erráticos en ciertas funciones de procesamiento de cadenas de caracteres."
+
+#: initdb.c:2086 initdb.c:2107
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr ""
+"Vuelva a ejecutar %s sin escoger explícitamente una codificación, o bien\n"
+"escoja una combinación coincidente."
+
+#: initdb.c:2105
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "La codificación que seleccionó (%s) no está soportada con el proveedor ICU."
+
+#: initdb.c:2169
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "el locale ICU debe ser especificado"
+
+#: initdb.c:2176
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU no está soportado en este servidor"
+
+#: initdb.c:2187
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s inicializa un cluster de base de datos PostgreSQL.\n"
+"\n"
+
+#: initdb.c:2188
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: initdb.c:2189
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPCIÓN]... [DATADIR]\n"
+
+#: initdb.c:2190
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opciones:\n"
+
+#: initdb.c:2191
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr ""
+" -A, --auth=MÉTODO método de autentificación por omisión para\n"
+" conexiones locales\n"
+
+#: initdb.c:2192
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr ""
+" --auth-host=MÉTODO método de autentificación por omisión para\n"
+" conexiones locales TCP/IP\n"
+
+#: initdb.c:2193
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr ""
+" --auth-local=MÉTODO método de autentificación por omisión para\n"
+" conexiones de socket local\n"
+
+#: initdb.c:2194
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATADIR ubicación para este cluster de bases de datos\n"
+
+#: initdb.c:2195
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=CODIF codificación por omisión para nuevas bases de datos\n"
+
+#: initdb.c:2196
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr ""
+" -g, --allow-group-access dar al grupo permisos de lectura/ejecución sobre\n"
+" el directorio de datos\n"
+
+#: initdb.c:2197
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr ""
+" --icu-locale=LOCALE definir el ID de configuración regional ICU para\n"
+" nuevas bases de datos\n"
+
+#: initdb.c:2198
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums activar sumas de verificación en páginas de datos\n"
+
+#: initdb.c:2199
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr ""
+" --locale=LOCALE configuración regional por omisión para \n"
+" nuevas bases de datos\n"
+
+#: initdb.c:2200
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" inicializar usando esta configuración regional\n"
+" en la categoría respectiva (el valor por omisión\n"
+" es tomado de variables de ambiente)\n"
+
+#: initdb.c:2204
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale equivalente a --locale=C\n"
+
+#: initdb.c:2205
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" define el proveedor de configuración regional\n"
+" para nuevas bases de datos\n"
+
+#: initdb.c:2207
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=ARCHIVO leer contraseña del nuevo superusuario del archivo\n"
+
+#: initdb.c:2208
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CONF\n"
+" configuración de búsqueda en texto por omisión\n"
+
+#: initdb.c:2210
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=USUARIO nombre del superusuario del cluster\n"
+
+#: initdb.c:2211
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt pedir una contraseña para el nuevo superusuario\n"
+
+#: initdb.c:2212
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR ubicación del directorio WAL\n"
+
+#: initdb.c:2213
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=TAMAÑO tamaño de los segmentos de WAL, en megabytes\n"
+
+#: initdb.c:2214
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Opciones menos usadas:\n"
+
+#: initdb.c:2215
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug genera mucha salida de depuración\n"
+
+#: initdb.c:2216
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches establece debug_discard_caches=1\n"
+
+#: initdb.c:2217
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORIO donde encontrar los archivos de entrada\n"
+
+#: initdb.c:2218
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean no limpiar después de errores\n"
+
+#: initdb.c:2219
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n"
+
+#: initdb.c:2220
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions no mostrar instrucciones para los siguientes pasos\n"
+
+#: initdb.c:2221
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show muestra variables internas\n"
+
+#: initdb.c:2222
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only sólo sincronizar el directorio de datos y salir\n"
+
+#: initdb.c:2223
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Otras opciones:\n"
+
+#: initdb.c:2224
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de version y salir\n"
+
+#: initdb.c:2225
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: initdb.c:2226
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Si el directorio de datos no es especificado, se usa la variable de\n"
+"ambiente PGDATA.\n"
+
+#: initdb.c:2228
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: initdb.c:2229
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: initdb.c:2257
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "método de autentificación «%s» no válido para conexiones «%s»"
+
+#: initdb.c:2271
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "debe especificar una contraseña al superusuario para activar autentificación mediante contraseña"
+
+#: initdb.c:2290
+#, c-format
+msgid "no data directory specified"
+msgstr "no se especificó un directorio de datos"
+
+#: initdb.c:2291
+#, c-format
+msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA."
+msgstr "Debe especificar el directorio donde residirán los datos para este clúster. Hágalo usando la opción -D o la variable de ambiente PGDATA."
+
+#: initdb.c:2308
+#, c-format
+msgid "could not set environment"
+msgstr "no se pudo establecer el ambiente"
+
+#: initdb.c:2326
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "el programa «%s» es requerido por %s pero se encontró en el mismo directorio que «%s»"
+
+#: initdb.c:2329
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "El programa «%s» fue encontrado por «%s», pero no es de la misma versión que %s"
+
+#: initdb.c:2344
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "la ubicación de archivos de entrada debe ser una ruta absoluta"
+
+#: initdb.c:2361
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "El cluster será inicializado con configuración regional «%s».\n"
+
+#: initdb.c:2364
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "El cluster será inicializado con esta configuración regional:\n"
+
+#: initdb.c:2365
+#, c-format
+msgid " provider: %s\n"
+msgstr " proveedor: %s\n"
+
+#: initdb.c:2367
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " Locale ICU: %s\n"
+
+#: initdb.c:2368
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2385
+#, c-format
+msgid "The default database encoding has been set to \"%s\".\n"
+msgstr "La codificación por omisión ha sido definida a «%s».\n"
+
+#: initdb.c:2397
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "no se pudo encontrar una codificación apropiada para la configuración regional «%s»"
+
+#: initdb.c:2399
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "Ejecute %s nuevamente con la opción -E."
+
+#: initdb.c:2400 initdb.c:3021 initdb.c:3041
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: initdb.c:2412
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"La codificación «%s», implícita en la configuración regional,\n"
+"no puede ser usada como codificación del lado del servidor.\n"
+"La codificación por omisión será «%s».\n"
+
+#: initdb.c:2417
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "la configuración regional «%s» requiere la codificación no soportada «%s»"
+
+#: initdb.c:2419
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "La codificación «%s» no puede ser usada como codificación del lado del servidor."
+
+#: initdb.c:2421
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "Ejecute %s nuevamente con opciones de configuración regional diferente."
+
+#: initdb.c:2429
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "La codificación por omisión ha sido por lo tanto definida a «%s».\n"
+
+#: initdb.c:2498
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr ""
+"no se pudo encontrar una configuración para búsqueda en texto apropiada\n"
+"para la configuración regional «%s»"
+
+#: initdb.c:2509
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "la configuración de búsqueda en texto apropiada para la configuración regional «%s» es desconocida"
+
+#: initdb.c:2514
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "la configuración de búsqueda en texto «%s» especificada podría no coincidir con la configuración regional «%s»"
+
+#: initdb.c:2519
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "La configuración de búsqueda en texto ha sido definida a «%s».\n"
+
+#: initdb.c:2562 initdb.c:2633
+#, c-format
+msgid "creating directory %s ... "
+msgstr "creando el directorio %s ... "
+
+#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "no se pudo crear el directorio «%s»: %m"
+
+#: initdb.c:2576 initdb.c:2648
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "corrigiendo permisos en el directorio existente %s ... "
+
+#: initdb.c:2581 initdb.c:2653
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "no se pudo cambiar los permisos del directorio «%s»: %m"
+
+#: initdb.c:2593 initdb.c:2665
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "el directorio «%s» existe pero no está vacío"
+
+#: initdb.c:2597
+#, c-format
+msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"."
+msgstr "Si quiere crear un nuevo cluster de bases de datos, elimine o vacíe el directorio «%s», o ejecute %s con un argumento distinto de «%s»."
+
+#: initdb.c:2605 initdb.c:2675 initdb.c:3058
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "no se pudo acceder al directorio «%s»: %m"
+
+#: initdb.c:2626
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "la ubicación del directorio de WAL debe ser una ruta absoluta"
+
+#: initdb.c:2669
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "Si quiere almacenar el WAL ahí, elimine o vacíe el directorio «%s»."
+
+#: initdb.c:2680
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "no se pudo crear el enlace simbólico «%s»: %m"
+
+#: initdb.c:2683
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "los enlaces simbólicos no están soportados en esta plataforma"
+
+#: initdb.c:2702
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "Contiene un archivo invisible o que empieza con un punto (.), quizás por ser un punto de montaje."
+
+#: initdb.c:2704
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Contiene un directorio lost+found, quizás por ser un punto de montaje."
+
+#: initdb.c:2706
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"Usar un punto de montaje directamente como directorio de datos no es recomendado.\n"
+"Cree un subdirectorio bajo el punto de montaje."
+
+#: initdb.c:2732
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "creando subdirectorios ... "
+
+#: initdb.c:2775
+msgid "performing post-bootstrap initialization ... "
+msgstr "realizando inicialización post-bootstrap ... "
+
+#: initdb.c:2940
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Ejecutando en modo de depuración.\n"
+
+#: initdb.c:2944
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "Ejecutando en modo no-clean. Los errores no serán limpiados.\n"
+
+#: initdb.c:3014
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "proveedor de ordenamiento no reconocido: %s"
+
+#: initdb.c:3039
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: initdb.c:3046
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s no puede especificarse a menos que el proveedor de locale «%s» sea escogido"
+
+#: initdb.c:3060 initdb.c:3137
+msgid "syncing data to disk ... "
+msgstr "sincronizando los datos a disco ... "
+
+#: initdb.c:3068
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr ""
+"la petición de contraseña y el archivo de contraseña no pueden\n"
+"ser especificados simultáneamente"
+
+#: initdb.c:3090
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "el argumento de --wal-segsize debe ser un número"
+
+#: initdb.c:3092
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "el argumento de --wal-segsize debe ser una potencia de 2 entre 1 y 1024"
+
+#: initdb.c:3106
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "nombre de superusuario «%s» no permitido; los nombres de rol no pueden comenzar con «pg_»"
+
+#: initdb.c:3108
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Los archivos de este cluster serán de propiedad del usuario «%s».\n"
+"Este usuario también debe ser quien ejecute el proceso servidor.\n"
+"\n"
+
+#: initdb.c:3124
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Las sumas de verificación en páginas de datos han sido activadas.\n"
+
+#: initdb.c:3126
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Las sumas de verificación en páginas de datos han sido desactivadas.\n"
+
+#: initdb.c:3143
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"La sincronización a disco se ha omitido.\n"
+"El directorio de datos podría corromperse si el sistema operativo sufre\n"
+"una caída.\n"
+
+#: initdb.c:3148
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "activando el método de autentificación «trust» para conexiones locales"
+
+#: initdb.c:3149
+#, c-format
+msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb."
+msgstr "Puede cambiar esto editando pg_hba.conf o usando el parámetro -A, o --auth-local y --auth-host la próxima vez que ejecute initdb."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3179
+msgid "logfile"
+msgstr "archivo_de_registro"
+
+#: initdb.c:3181
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Completado. Ahora puede iniciar el servidor de bases de datos usando:\n"
+"\n"
+" %s\n"
+"\n"
diff --git a/src/bin/initdb/po/fr.po b/src/bin/initdb/po/fr.po
new file mode 100644
index 0000000..7d2097e
--- /dev/null
+++ b/src/bin/initdb/po/fr.po
@@ -0,0 +1,1296 @@
+# LANGUAGE message translation file for initdb
+# Copyright (C) 2004-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the initdb (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2004-2009.
+# Stéphane Schildknecht <stephane.schildknecht@dalibo.com>, 2009.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2010-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:19+0000\n"
+"PO-Revision-Date: 2022-09-26 14:05+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "n'a pas pu identifier le répertoire courant : %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binaire « %s » invalide"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "n'a pas pu lire le binaire « %s »"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "n'a pas pu trouver un « %s » à exécuter"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "n'a pas pu modifier le répertoire par « %s » : %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "n'a pas pu lire le lien symbolique « %s » : %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "échec de %s() : %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: initdb.c:334
+#, c-format
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "n'a pas pu tester le fichier « %s » : %m"
+
+#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "n'a pas pu ouvrir le répertoire « %s » : %m"
+
+#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "n'a pas pu lire le répertoire « %s » : %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m"
+
+#: ../../common/file_utils.c:383
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "n'a pas pu fermer le répertoire « %s » : %m"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "n'a pas pu charger la bibliothèque « %s » : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "ne peut pas créer les jetons restreints sur cette plateforme : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "n'a pas pu ouvrir le jeton du processus : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "n'a pas pu allouer les SID : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "n'a pas pu créer le jeton restreint : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr ""
+"n'a pas pu récupérer les informations sur le fichier ou répertoire\n"
+"« %s » : %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "n'a pas pu supprimer le fichier ou répertoire « %s » : %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "n'a pas pu trouver l'identifiant réel %ld de l'utilisateur : %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "l'utilisateur n'existe pas"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "commande non exécutable"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "commande introuvable"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "le processus fils a quitté avec le code de sortie %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "le processus fils a été terminé par l'exception 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "le processus fils a été terminé par le signal %d : %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "le processus fils a quitté avec un statut %d non reconnu"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "n'a pas pu configurer la jonction pour « %s » : %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "n'a pas pu obtenir la jonction pour « %s » : %s\n"
+
+#: initdb.c:464 initdb.c:1459
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m"
+
+#: initdb.c:505 initdb.c:809 initdb.c:829
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » en écriture : %m"
+
+#: initdb.c:509 initdb.c:812 initdb.c:831
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "impossible d'écrire le fichier « %s » : %m"
+
+#: initdb.c:513
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier « %s » : %m"
+
+#: initdb.c:529
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "n'a pas pu exécuter la commande « %s » : %m"
+
+#: initdb.c:547
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "suppression du répertoire des données « %s »"
+
+#: initdb.c:549
+#, c-format
+msgid "failed to remove data directory"
+msgstr "échec de la suppression du répertoire des données"
+
+#: initdb.c:553
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "suppression du contenu du répertoire des données « %s »"
+
+#: initdb.c:556
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "échec de la suppression du contenu du répertoire des données"
+
+#: initdb.c:561
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "suppression du répertoire des journaux de transactions « %s »"
+
+#: initdb.c:563
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "échec de la suppression du répertoire des journaux de transactions"
+
+#: initdb.c:567
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "suppression du contenu du répertoire des journaux de transactions « %s »"
+
+#: initdb.c:569
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "échec de la suppression du contenu du répertoire des journaux de transactions"
+
+#: initdb.c:576
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "répertoire des données « %s » non supprimé à la demande de l'utilisateur"
+
+#: initdb.c:580
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "répertoire des journaux de transactions « %s » non supprimé à la demande de l'utilisateur"
+
+#: initdb.c:598
+#, c-format
+msgid "cannot be run as root"
+msgstr "ne peut pas être exécuté en tant que root"
+
+#: initdb.c:599
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "Connectez-vous (par exemple en utilisant « su ») sous l'utilisateur (non privilégié) qui sera propriétaire du processus serveur."
+
+#: initdb.c:631
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "« %s » n'est pas un nom d'encodage serveur valide"
+
+#: initdb.c:775
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "le rôle « %s » n'existe pas"
+
+#: initdb.c:776 initdb.c:781 initdb.c:788
+#, c-format
+msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."
+msgstr "Cela peut signifier que votre installation est corrompue ou que vous avez identifié le mauvais répertoire avec l'option -L."
+
+#: initdb.c:780
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "n'a pas pu accéder au fichier « %s » : %m"
+
+#: initdb.c:787
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "le fichier « %s » n'est pas un fichier standard"
+
+#: initdb.c:922
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "sélection de l'implémentation de la mémoire partagée dynamique..."
+
+#: initdb.c:931
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "sélection de la valeur par défaut pour max_connections... "
+
+#: initdb.c:962
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "sélection de la valeur par défaut pour shared_buffers... "
+
+#: initdb.c:996
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "sélection du fuseau horaire par défaut... "
+
+#: initdb.c:1030
+msgid "creating configuration files ... "
+msgstr "création des fichiers de configuration... "
+
+#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "n'a pas pu modifier les droits de « %s » : %m"
+
+#: initdb.c:1319
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "lancement du script bootstrap..."
+
+#: initdb.c:1331
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "le fichier en entrée « %s » n'appartient pas à PostgreSQL %s"
+
+#: initdb.c:1333
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Indiquez le bon chemin avec l'option -L."
+
+#: initdb.c:1437
+msgid "Enter new superuser password: "
+msgstr "Saisir le nouveau mot de passe du super-utilisateur : "
+
+#: initdb.c:1438
+msgid "Enter it again: "
+msgstr "Saisir le mot de passe à nouveau : "
+
+#: initdb.c:1441
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Les mots de passe ne sont pas identiques.\n"
+
+#: initdb.c:1465
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "n'a pas pu lire le mot de passe à partir du fichier « %s » : %m"
+
+#: initdb.c:1468
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "le fichier de mots de passe « %s » est vide"
+
+#: initdb.c:1915
+#, c-format
+msgid "caught signal\n"
+msgstr "signal reçu\n"
+
+#: initdb.c:1921
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "n'a pas pu écrire au processus fils : %s\n"
+
+#: initdb.c:1929
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2018
+#, c-format
+msgid "setlocale() failed"
+msgstr "échec de setlocale()"
+
+#: initdb.c:2036
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "a échoué pour restaurer l'ancienne locale « %s »"
+
+#: initdb.c:2043
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "nom de locale « %s » invalide"
+
+#: initdb.c:2054
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "configuration invalide de la locale ; vérifiez les variables d'environnement LANG et LC_*"
+
+#: initdb.c:2080 initdb.c:2104
+#, c-format
+msgid "encoding mismatch"
+msgstr "différence d'encodage"
+
+#: initdb.c:2081
+#, c-format
+msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions."
+msgstr "L'encodage que vous avez sélectionné (%s) et celui que la locale sélectionnée utilise (%s) ne sont pas compatibles. Cela peut conduire à des erreurs dans les fonctions de manipulation de chaînes de caractères."
+
+#: initdb.c:2086 initdb.c:2107
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "Relancez %s et soit vous ne spécifiez pas explicitement d'encodage, soit vous choisissez une combinaison compatible."
+
+#: initdb.c:2105
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "L'encodage que vous avez sélectionné (%s) n'est pas supporté avec le fournisseur ICU."
+
+#: initdb.c:2169
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "la locale ICU doit être précisée"
+
+#: initdb.c:2176
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU n'est pas supporté dans cette installation"
+
+#: initdb.c:2187
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s initialise une instance PostgreSQL.\n"
+"\n"
+
+#: initdb.c:2188
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: initdb.c:2189
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [RÉP_DONNÉES]\n"
+
+#: initdb.c:2190
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options :\n"
+
+#: initdb.c:2191
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr ""
+" -A, --auth=MÉTHODE méthode d'authentification par défaut pour les\n"
+" connexions locales\n"
+
+#: initdb.c:2192
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr ""
+" --auth-host=MÉTHODE méthode d'authentification par défaut pour les\n"
+" connexions locales TCP/IP\n"
+
+#: initdb.c:2193
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr ""
+" --auth-local=MÉTHODE méthode d'authentification par défaut pour les\n"
+" connexions locales socket\n"
+
+#: initdb.c:2194
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]RÉP_DONNÉES emplacement du répertoire principal des données\n"
+
+#: initdb.c:2195
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr ""
+" -E, --encoding=ENCODAGE initialise l'encodage par défaut des nouvelles\n"
+" bases de données\n"
+
+#: initdb.c:2196
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr ""
+" -g, --allow-group-access autorise la lecture/écriture pour le groupe sur\n"
+" le répertoire des données\n"
+
+#: initdb.c:2197
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOCALE initialise l'identifiant de locale ICU pour les nouvelles bases de données\n"
+
+#: initdb.c:2198
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr ""
+" -k, --data-checksums active les sommes de contrôle pour les blocs des\n"
+" fichiers de données\n"
+
+#: initdb.c:2199
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr ""
+" --locale=LOCALE initialise la locale par défaut pour les\n"
+" nouvelles bases de données\n"
+
+#: initdb.c:2200
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" initialise la locale par défaut dans la catégorie\n"
+" respective pour les nouvelles bases de données\n"
+" (les valeurs par défaut sont prises dans\n"
+" l'environnement)\n"
+
+#: initdb.c:2204
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale équivalent à --locale=C\n"
+
+#: initdb.c:2205
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" initialise le fournisseur de locale par défaut pour\n"
+" les nouvelles bases de données\n"
+
+#: initdb.c:2207
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr ""
+" --pwfile=FICHIER lit le mot de passe du nouveau super-utilisateur\n"
+" à partir de ce fichier\n"
+
+#: initdb.c:2208
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG configuration par défaut de la recherche plein\n"
+" texte\n"
+
+#: initdb.c:2210
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NOM nom du super-utilisateur de la base de données\n"
+
+#: initdb.c:2211
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr ""
+" -W, --pwprompt demande un mot de passe pour le nouveau\n"
+" super-utilisateur\n"
+
+#: initdb.c:2212
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr ""
+" -X, --waldir=RÉP_WAL emplacement du répertoire des journaux de\n"
+" transactions\n"
+
+#: initdb.c:2213
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=TAILLE configure la taille des segments WAL, en Mo\n"
+
+#: initdb.c:2214
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Options moins utilisées :\n"
+
+#: initdb.c:2215
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug engendre un grand nombre de traces de débogage\n"
+
+#: initdb.c:2216
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches initialise debug_discard_caches à 1\n"
+
+#: initdb.c:2217
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr ""
+" -L RÉPERTOIRE indique où trouver les fichiers servant à la\n"
+" création de l'instance\n"
+
+#: initdb.c:2218
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --noclean ne nettoie pas après des erreurs\n"
+
+#: initdb.c:2219
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --nosync n'attend pas que les modifications soient\n"
+" proprement écrites sur disque\n"
+
+#: initdb.c:2220
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr ""
+" --no-instructions n'affiche pas les instructions des prochaines\n"
+" étapes\n"
+
+#: initdb.c:2221
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show affiche la configuration interne\n"
+
+#: initdb.c:2222
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only synchronise uniquement le répertoire des données, puis quitte\n"
+
+#: initdb.c:2223
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Autres options :\n"
+
+#: initdb.c:2224
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: initdb.c:2225
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: initdb.c:2226
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Si le répertoire des données n'est pas indiqué, la variable d'environnement\n"
+"PGDATA est utilisée.\n"
+
+#: initdb.c:2228
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: initdb.c:2229
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: initdb.c:2257
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "méthode d'authentification « %s » invalide pour « %s » connexions"
+
+#: initdb.c:2271
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "doit indiquer un mot de passe pour le super-utilisateur afin d'activer l'authentification par mot de passe"
+
+#: initdb.c:2290
+#, c-format
+msgid "no data directory specified"
+msgstr "aucun répertoire de données indiqué"
+
+#: initdb.c:2291
+#, c-format
+msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA."
+msgstr "Vous devez identifier le répertoire où résideront les données pour ce système de bases de données. Faites-le soit avec l'option -D soit avec la variable d'environnement PGDATA."
+
+#: initdb.c:2308
+#, c-format
+msgid "could not set environment"
+msgstr "n'a pas pu configurer l'environnement"
+
+#: initdb.c:2326
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »"
+
+#: initdb.c:2329
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s"
+
+#: initdb.c:2344
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "l'emplacement du fichier d'entrée doit être indiqué avec un chemin absolu"
+
+#: initdb.c:2361
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "L'instance sera initialisée avec la locale « %s ».\n"
+
+#: initdb.c:2364
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "L'instance sera initialisée avec cette configuration de locale :\n"
+
+#: initdb.c:2365
+#, c-format
+msgid " provider: %s\n"
+msgstr " fournisseur: %s\n"
+
+#: initdb.c:2367
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " locale ICU : %s\n"
+
+#: initdb.c:2368
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2385
+#, c-format
+msgid "The default database encoding has been set to \"%s\".\n"
+msgstr "L'encodage par défaut des bases de données a été configuré à « %s ».\n"
+
+#: initdb.c:2397
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "n'a pas pu trouver un encodage adéquat pour la locale « %s »"
+
+#: initdb.c:2399
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "Relancez %s avec l'option -E."
+
+#: initdb.c:2400 initdb.c:3021 initdb.c:3041
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: initdb.c:2412
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"L'encodage « %s » a été déduit de la locale mais n'est pas autorisé en tant qu'encodage serveur.\n"
+"L'encodage par défaut des bases de données sera configuré à « %s ».\n"
+
+#: initdb.c:2417
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "la locale « %s » nécessite l'encodage « %s » non supporté"
+
+#: initdb.c:2419
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "L'encodage « %s » n'est pas autorisé en tant qu'encodage serveur."
+
+#: initdb.c:2421
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "Relancez %s avec une locale différente."
+
+#: initdb.c:2429
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr ""
+"L'encodage par défaut des bases de données a été configuré en conséquence\n"
+"avec « %s ».\n"
+
+#: initdb.c:2498
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "n'a pas pu trouver la configuration de la recherche plein texte en adéquation avec la locale « %s »"
+
+#: initdb.c:2509
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "la configuration de la recherche plein texte convenable pour la locale « %s » est inconnue"
+
+#: initdb.c:2514
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "la configuration indiquée pour la recherche plein texte, « %s », pourrait ne pas correspondre à la locale « %s »"
+
+#: initdb.c:2519
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "La configuration de la recherche plein texte a été initialisée à « %s ».\n"
+
+#: initdb.c:2562 initdb.c:2633
+#, c-format
+msgid "creating directory %s ... "
+msgstr "création du répertoire %s... "
+
+#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "n'a pas pu créer le répertoire « %s » : %m"
+
+#: initdb.c:2576 initdb.c:2648
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "correction des droits sur le répertoire existant %s... "
+
+#: initdb.c:2581 initdb.c:2653
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "n'a pas pu modifier les droits du répertoire « %s » : %m"
+
+#: initdb.c:2593 initdb.c:2665
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "le répertoire « %s » existe mais n'est pas vide"
+
+#: initdb.c:2597
+#, c-format
+msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"."
+msgstr "Si vous voulez créer un nouveau système de bases de données, supprimez ou videz le répertoire « %s ». Vous pouvez aussi exécuter %s avec un argument autre que « %s »."
+
+#: initdb.c:2605 initdb.c:2675 initdb.c:3058
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "n'a pas pu accéder au répertoire « %s » : %m"
+
+#: initdb.c:2626
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "l'emplacement du répertoire des journaux de transactions doit être indiqué avec un chemin absolu"
+
+#: initdb.c:2669
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "Si vous voulez enregistrer ici les WAL, supprimez ou videz le répertoire « %s »."
+
+#: initdb.c:2680
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "n'a pas pu créer le lien symbolique « %s » : %m"
+
+#: initdb.c:2683
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "les liens symboliques ne sont pas supportés sur cette plateforme"
+
+#: initdb.c:2702
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "Il contient un fichier invisible, peut-être parce qu'il s'agit d'un point de montage."
+
+#: initdb.c:2704
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Il contient un répertoire lost+found, peut-être parce qu'il s'agit d'un point de montage.\\"
+
+#: initdb.c:2706
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"Utiliser un point de montage comme répertoire des données n'est pas recommandé.\n"
+"Créez un sous-répertoire sous le point de montage."
+
+#: initdb.c:2732
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "création des sous-répertoires... "
+
+#: initdb.c:2775
+msgid "performing post-bootstrap initialization ... "
+msgstr "exécution de l'initialisation après bootstrap... "
+
+#: initdb.c:2940
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Lancé en mode débogage.\n"
+
+#: initdb.c:2944
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "Lancé en mode « sans nettoyage ». Les erreurs ne seront pas nettoyées.\n"
+
+#: initdb.c:3014
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "fournisseur de locale non reconnu : %s"
+
+#: initdb.c:3039
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: initdb.c:3046
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s ne peut pas être spécifié sauf si le fournisseur de locale « %s » est choisi"
+
+#: initdb.c:3060 initdb.c:3137
+msgid "syncing data to disk ... "
+msgstr "synchronisation des données sur disque... "
+
+#: initdb.c:3068
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr ""
+"les options d'invite du mot de passe et de fichier de mots de passe ne\n"
+"peuvent pas être indiquées simultanément"
+
+#: initdb.c:3090
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "l'argument de --wal-segsize doit être un nombre"
+
+#: initdb.c:3092
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "l'argument de --wal-segsize doit être une puissance de 2 comprise entre 1 et 1024"
+
+#: initdb.c:3106
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "le nom de superutilisateur « %s » n'est pas autorisé ; les noms de rôle ne peuvent pas commencer par « pg_ »"
+
+#: initdb.c:3108
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Les fichiers de ce système de bases de données appartiendront à l'utilisateur « %s ».\n"
+"Le processus serveur doit également lui appartenir.\n"
+"\n"
+
+#: initdb.c:3124
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Les sommes de contrôle des pages de données sont activées.\n"
+
+#: initdb.c:3126
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Les sommes de contrôle des pages de données sont désactivées.\n"
+
+#: initdb.c:3143
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Synchronisation sur disque ignorée.\n"
+"Le répertoire des données pourrait être corrompu si le système d'exploitation s'arrêtait brutalement.\n"
+
+#: initdb.c:3148
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "activation de l'authentification « trust » pour les connexions locales"
+
+#: initdb.c:3149
+#, c-format
+msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb."
+msgstr "Vous pouvez changer cette configuration en éditant le fichier pg_hba.conf ou en utilisant l'option -A, ou --auth-local et --auth-host, à la prochaine exécution d'initdb."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3179
+msgid "logfile"
+msgstr "fichier_de_trace"
+
+#: initdb.c:3181
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Succès. Vous pouvez maintenant lancer le serveur de bases de données en utilisant :\n"
+"\n"
+" %s\n"
+"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "%s: The password file was not generated. Please report this problem.\n"
+#~ msgstr ""
+#~ "%s : le fichier de mots de passe n'a pas été créé.\n"
+#~ "Merci de rapporter ce problème.\n"
+
+#~ msgid "%s: could not access directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not access file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu accéder au fichier « %s » : %s\n"
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu fermer le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not create directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu créer le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not create symbolic link \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu créer le lien symbolique « %s » : %s\n"
+
+#~ msgid "%s: could not determine valid short version string\n"
+#~ msgstr "%s : n'a pas pu déterminer une chaîne de version courte valide\n"
+
+#~ msgid "%s: could not execute command \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu exécuter la commande « %s » : %s\n"
+
+#~ msgid "%s: could not fsync file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s : n'a pas pu obtenir le nom de l'utilisateur courant : %s\n"
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s : n'a pas pu obtenir d'informations sur l'utilisateur courant : %s\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en lecture : %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for writing: %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en écriture : %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu renommer le fichier « %s » en « %s » : %s\n"
+
+#~ msgid "%s: could not stat file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not to allocate SIDs: error code %lu\n"
+#~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n"
+
+#~ msgid "%s: could not write file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu écrire le fichier « %s » : %s\n"
+
+#~ msgid "%s: failed to remove contents of transaction log directory\n"
+#~ msgstr "%s : échec de la suppression du contenu du répertoire des journaux de transaction\n"
+
+#~ msgid "%s: failed to remove transaction log directory\n"
+#~ msgstr "%s : échec de la suppression du répertoire des journaux de transaction\n"
+
+#~ msgid "%s: failed to restore old locale \"%s\"\n"
+#~ msgstr "%s : n'a pas pu restaurer l'ancienne locale « %s »\n"
+
+#~ msgid "%s: file \"%s\" does not exist\n"
+#~ msgstr "%s : le fichier « %s » n'existe pas\n"
+
+#~ msgid "%s: invalid locale name \"%s\"\n"
+#~ msgstr "%s : nom de locale invalide (« %s »)\n"
+
+#~ msgid "%s: locale name has non-ASCII characters, skipped: \"%s\"\n"
+#~ msgstr "%s : le nom de la locale contient des caractères non ASCII, ignoré : « %s »\n"
+
+#~ msgid "%s: locale name too long, skipped: \"%s\"\n"
+#~ msgstr "%s : nom de locale trop long, ignoré : « %s »\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s : mémoire épuisée\n"
+
+#~ msgid "%s: removing contents of transaction log directory \"%s\"\n"
+#~ msgstr "%s : suppression du contenu du répertoire des journaux de transaction « %s »\n"
+
+#~ msgid "%s: removing transaction log directory \"%s\"\n"
+#~ msgstr "%s : suppression du répertoire des journaux de transaction « %s »\n"
+
+#~ msgid "%s: symlinks are not supported on this platform\n"
+#~ msgstr "%s : les liens symboliques ne sont pas supportés sur cette plateforme\n"
+
+#~ msgid "%s: transaction log directory \"%s\" not removed at user's request\n"
+#~ msgstr ""
+#~ "%s : répertoire des journaux de transaction « %s » non supprimé à la demande\n"
+#~ "de l'utilisateur\n"
+
+#~ msgid "%s: unrecognized authentication method \"%s\"\n"
+#~ msgstr "%s : méthode d'authentification « %s » inconnue.\n"
+
+#~ msgid "No usable system locales were found.\n"
+#~ msgstr "Aucune locale système utilisable n'a été trouvée.\n"
+
+#~ msgid ""
+#~ "The program \"postgres\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Le programme « postgres » est nécessaire à %s mais n'a pas été trouvé dans\n"
+#~ "le même répertoire que « %s ».\n"
+#~ "Vérifiez votre installation."
+
+#~ msgid ""
+#~ "The program \"postgres\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Le programme « postgres » a été trouvé par « %s » mais n'est pas de la même\n"
+#~ "version que « %s ».\n"
+#~ "Vérifiez votre installation."
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayer « %s --help » pour plus d'informations.\n"
+
+#~ msgid "Use the option \"--debug\" to see details.\n"
+#~ msgstr "Utilisez l'option « --debug » pour voir le détail.\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "le processus fils a été terminé par le signal %s"
+
+#~ msgid "copying template1 to postgres ... "
+#~ msgstr "copie de template1 vers postgres... "
+
+#~ msgid "copying template1 to template0 ... "
+#~ msgstr "copie de template1 vers template0... "
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "n'a pas pu accéder au répertoire « %s »"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "n'a pas pu modifier le répertoire par « %s » : %s"
+
+#~ msgid "could not open directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s\n"
+
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "n'a pas pu lire le lien symbolique « %s »"
+
+#~ msgid "could not stat file or directory \"%s\": %s\n"
+#~ msgstr ""
+#~ "n'a pas pu récupérer les informations sur le fichier ou répertoire\n"
+#~ "« %s » : %s\n"
+
+#~ msgid "creating collations ... "
+#~ msgstr "création des collationnements... "
+
+#~ msgid "creating conversions ... "
+#~ msgstr "création des conversions... "
+
+#~ msgid "creating dictionaries ... "
+#~ msgstr "création des dictionnaires... "
+
+#~ msgid "creating information schema ... "
+#~ msgstr "création du schéma d'informations... "
+
+#~ msgid "creating system views ... "
+#~ msgstr "création des vues système... "
+
+#~ msgid "creating template1 database in %s/base/1 ... "
+#~ msgstr "création de la base de données template1 dans %s/base/1... "
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#~ msgid "initializing dependencies ... "
+#~ msgstr "initialisation des dépendances... "
+
+#~ msgid "initializing pg_authid ... "
+#~ msgstr "initialisation de pg_authid... "
+
+#~ msgid "loading PL/pgSQL server-side language ... "
+#~ msgstr "chargement du langage PL/pgSQL... "
+
+#~ msgid "loading system objects' descriptions ... "
+#~ msgstr "chargement de la description des objets système... "
+
+#~ msgid "not supported on this platform\n"
+#~ msgstr "non supporté sur cette plateforme\n"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "échec de pclose : %m"
+
+#~ msgid "setting password ... "
+#~ msgstr "initialisation du mot de passe... "
+
+#~ msgid "setting privileges on built-in objects ... "
+#~ msgstr "initialisation des droits sur les objets internes... "
+
+#~ msgid "vacuuming database template1 ... "
+#~ msgstr "lancement du vacuum sur la base de données template1... "
diff --git a/src/bin/initdb/po/it.po b/src/bin/initdb/po/it.po
new file mode 100644
index 0000000..93ce7ec
--- /dev/null
+++ b/src/bin/initdb/po/it.po
@@ -0,0 +1,1168 @@
+#
+# initdb.po
+# Italian message translation file for initdb
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+# Copyright (C) 2010, Associazione Culturale ITPUG
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017
+# Flavio Spada <flavio.spada@itpug.org>, 2010
+# Ottavio Campana <campana@oc-si.it>, 2007.
+# Fabrizio Mazzoni <veramente@libero.it>, 2003.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:19+0000\n"
+"PO-Revision-Date: 2022-10-02 18:31+0200\n"
+"Last-Translator: Daniele Varrazzo <daniele.varrazzo@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "impossibile identificare la directory corrente: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binario non valido \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "lettura del binario \"%s\" fallita"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "programma \"%s\" da eseguire non trovato"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "spostamento nella directory \"%s\" fallito: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "lettura del link simbolico \"%s\" fallita: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() non riuscito: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: initdb.c:334
+#, c-format
+msgid "out of memory"
+msgstr "memoria esaurita"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "impossibile duplicare il puntatore nullo (errore interno)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file \"%s\": %m"
+
+#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "apertura della directory \"%s\" fallita: %m"
+
+#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "lettura della directory \"%s\" fallita: %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "apertura del file \"%s\" fallita: %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "fsync del file \"%s\" fallito: %m"
+
+#: ../../common/file_utils.c:383
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "non è stato possibile rinominare il file \"%s\" in \"%s\": %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "impossibile chiudere la directory \"%s\": %m"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "impossibile caricare la libreria \"%s\": codice di errore %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "impossibile creare token con restrizioni su questa piattaforma: codice di errore %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "impossibile aprire il token di processo: codice di errore %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "impossibile allocare i SID: codice di errore %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "impossibile creare token limitato: codice di errore %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "impossibile avviare il processo per il comando \"%s\": codice di errore %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "impossibile rieseguire con token limitato: codice di errore %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "impossibile ottenere il codice di uscita dal processo secondario: codice di errore %lu"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file o directory \"%s\": %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "impossibile rimuovere il file o la directory \"%s\": %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "impossibile cercare l'ID utente effettivo %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "l'utente non esiste"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "ricerca del nome utente fallita: codice di errore %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "comando non eseguibile"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "comando non trovato"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "processo figlio uscito con codice di uscita %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "processo figlio terminato da eccezione 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "il processo figlio è stato terminato dal segnale %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "processo figlio uscito con stato non riconosciuto %d"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "non è stato possibile impostare la giunzione per \"%s\": %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "non è stato possibile ottenere la giunzione per \"%s\": %s\n"
+
+#: initdb.c:464 initdb.c:1459
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "apertura del file \"%s\" in lettura fallita: %m"
+
+#: initdb.c:505 initdb.c:809 initdb.c:829
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "apertura del file \"%s\" in scrittura fallita: %m"
+
+#: initdb.c:509 initdb.c:812 initdb.c:831
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "scrittura nel file \"%s\" fallita: %m"
+
+#: initdb.c:513
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "chiusura del file \"%s\" fallita: %m"
+
+#: initdb.c:529
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "esecuzione del comando \"%s\" fallita: %m"
+
+#: initdb.c:547
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "rimozione della directory dei dati \"%s\""
+
+#: initdb.c:549
+#, c-format
+msgid "failed to remove data directory"
+msgstr "impossibile rimuovere la directory dei dati"
+
+#: initdb.c:553
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "rimozione del contenuto della directory dei dati \"%s\""
+
+#: initdb.c:556
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "impossibile rimuovere il contenuto della directory dei dati"
+
+#: initdb.c:561
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "rimozione della directory WAL \"%s\""
+
+#: initdb.c:563
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "impossibile rimuovere la directory WAL"
+
+#: initdb.c:567
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "rimozione del contenuto della directory WAL \"%s\""
+
+#: initdb.c:569
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "impossibile rimuovere il contenuto della directory WAL"
+
+#: initdb.c:576
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "directory dati \"%s\" non rimossa su richiesta dell'utente"
+
+#: initdb.c:580
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "Directory WAL \"%s\" non rimossa su richiesta dell'utente"
+
+#: initdb.c:598
+#, c-format
+msgid "cannot be run as root"
+msgstr "non può essere eseguito come root"
+
+#: initdb.c:599
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "Effettua il login (usando, ad esempio, \"su\") come utente (senza privilegi) che sarà proprietario del processo del server."
+
+#: initdb.c:631
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" non è un nome di codifica del server valido"
+
+#: initdb.c:775
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "il file \"%s\" non esiste"
+
+#: initdb.c:776 initdb.c:781 initdb.c:788
+#, c-format
+msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."
+msgstr "Ciò potrebbe significare che hai un'installazione danneggiata o che hai identificato la directory errata con l'opzione di chiamata -L."
+
+#: initdb.c:780
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "accesso al file \"%s\" fallito: %m"
+
+#: initdb.c:787
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "il file \"%s\" non è un file normale"
+
+#: initdb.c:922
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "selezione dell'implementazione della memoria dinamica ... "
+
+#: initdb.c:931
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "selezione del parametro max_connections predefinito ... "
+
+#: initdb.c:962
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "selezione di shared_buffers predefinito ... "
+
+#: initdb.c:996
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "selezione del fuso orario predefinito... "
+
+#: initdb.c:1030
+msgid "creating configuration files ... "
+msgstr "creazione dei file di configurazione ... "
+
+#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "impossibile modificare le autorizzazioni di \"%s\": %m"
+
+#: initdb.c:1319
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "esecuzione dello script di bootstrap ... "
+
+#: initdb.c:1331
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "il file di input \"%s\" non appartiene a PostgreSQL %s"
+
+#: initdb.c:1333
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Specificare il percorso corretto utilizzando l'opzione -L."
+
+#: initdb.c:1437
+msgid "Enter new superuser password: "
+msgstr "Inserisci la nuova password del superutente: "
+
+#: initdb.c:1438
+msgid "Enter it again: "
+msgstr "Conferma password: "
+
+#: initdb.c:1441
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Le password non corrispondono.\n"
+
+#: initdb.c:1465
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "impossibile leggere la password dal file \"%s\": %m"
+
+#: initdb.c:1468
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "il file della password \"%s\" è vuoto"
+
+#: initdb.c:1915
+#, c-format
+msgid "caught signal\n"
+msgstr "intercettato segnale\n"
+
+#: initdb.c:1921
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "scrittura verso il processo figlio fallita: %s\n"
+
+#: initdb.c:1929
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2018
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() non è riuscito"
+
+#: initdb.c:2036
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "impossibile ripristinare la vecchia lingua \"%s\""
+
+#: initdb.c:2043
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "nome locale \"%s\" non valido"
+
+#: initdb.c:2054
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "impostazioni locali non valide; controlla le variabili di ambiente LANG e LC_*"
+
+#: initdb.c:2080 initdb.c:2104
+#, c-format
+msgid "encoding mismatch"
+msgstr "mancata corrispondenza della codifica"
+
+#: initdb.c:2081
+#, c-format
+msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions."
+msgstr "La codifica selezionata (%s) e la codifica utilizzata dalla locale selezionata (%s) non corrispondono. Ciò comporterebbe un comportamento scorretto in varie funzioni di elaborazione delle stringhe di caratteri."
+
+#: initdb.c:2086 initdb.c:2107
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "Riesegui %s e non specificare una codifica in modo esplicito oppure scegli una combinazione corrispondente."
+
+#: initdb.c:2105
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "La codifica selezionata (%s) non è supportata dal provider di terapia intensiva."
+
+#: initdb.c:2169
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "È necessario specificare la lingua dell'ICU"
+
+#: initdb.c:2176
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU non supportato in questo build"
+
+#: initdb.c:2187
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s inizializza un cluster di database PostgreSQL.\n"
+"\n"
+
+#: initdb.c:2188
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: initdb.c:2189
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPZIONE]... [DATADIR]\n"
+
+#: initdb.c:2190
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opzioni:\n"
+
+#: initdb.c:2191
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr ""
+" -A, --auth=METODO metodo di autenticazione predefinito per le\n"
+" connessioni locali\n"
+
+#: initdb.c:2192
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr ""
+" --auth-host=METODO metodo di autenticazione predefinito per le\n"
+" connessioni TCP/IP\n"
+
+#: initdb.c:2193
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr ""
+" --auth-local=METODO metodo di autenticazione predefinito per le\n"
+" connessioni locali\n"
+
+#: initdb.c:2194
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATADIR dove creare questo cluster di database\n"
+
+#: initdb.c:2195
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr ""
+" -E, --encoding=ENCODING imposta la codifica predefinita per i nuovi\n"
+" database\n"
+
+#: initdb.c:2196
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access permette read/execute di gruppo sulla directory dati\n"
+
+#: initdb.c:2197
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOCALE imposta l'ID locale ICU per i nuovi database\n"
+
+#: initdb.c:2198
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums usa i checksum delle pagine dati\n"
+
+#: initdb.c:2199
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr ""
+" --locale=LOCALE imposta il locale predefinito per i nuovi\n"
+" database\n"
+
+#: initdb.c:2200
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate, --lc-ctype, --lc-messages=LOCALE\n"
+" --lc-monetary, --lc-numeric, --lc-time=LOCALE\n"
+" inizializza il nuovo cluster di database con il\n"
+" locale specificato nella categoria corrispondente.\n"
+" Il valore predefinito viene preso dalle variabili\n"
+" d'ambiente\n"
+
+#: initdb.c:2204
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale equivalente a --locale=C\n"
+
+#: initdb.c:2205
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" impostare il provider delle impostazioni locali predefinito per i nuovi database\n"
+
+#: initdb.c:2207
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=FILE leggi la password per il nuovo superutente dal file\n"
+
+#: initdb.c:2208
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" configurazione predefinita per la ricerca di testo\n"
+
+#: initdb.c:2210
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NOME nome del superutente del database\n"
+
+#: initdb.c:2211
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt richiedi la password per il nuovo superutente\n"
+
+#: initdb.c:2212
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR locazione della la directory di write-ahead log\n"
+
+#: initdb.c:2213
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE dimensioni dei segmenti WAL, in megabyte\n"
+
+#: initdb.c:2214
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Opzioni utilizzate meno frequentemente:\n"
+
+#: initdb.c:2215
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug genera molto output di debug\n"
+
+#: initdb.c:2216
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches imposta debug_discard_caches=1\n"
+
+#: initdb.c:2217
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORY dove trovare i file di input\n"
+
+#: initdb.c:2218
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean non ripulire dopo gli errori\n"
+
+#: initdb.c:2219
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync non aspettare che i dati siano scritti con sicurezza\n"
+" sul disco\n"
+
+#: initdb.c:2220
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions non stampa le istruzioni per i passaggi successivi\n"
+
+#: initdb.c:2221
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show mostra le impostazioni interne\n"
+
+#: initdb.c:2222
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only only sync database files to disk, then exit\n"
+
+#: initdb.c:2223
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Altre opzioni:\n"
+
+#: initdb.c:2224
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: initdb.c:2225
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: initdb.c:2226
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Se la directory dati non è specificata, viene usata la variabile\n"
+"d'ambiente PGDATA.\n"
+
+#: initdb.c:2228
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: initdb.c:2229
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: initdb.c:2257
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "metodo di autenticazione \"%s\" non valido per le connessioni \"%s\""
+
+#: initdb.c:2271
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "deve specificare una password per il superutente per abilitare l'autenticazione della password"
+
+#: initdb.c:2290
+#, c-format
+msgid "no data directory specified"
+msgstr "nessuna directory di dati specificata"
+
+#: initdb.c:2291
+#, c-format
+msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA."
+msgstr "È necessario identificare la directory in cui risiedono i dati per questo sistema di database. Fallo con l'opzione di chiamata -D o la variabile di ambiente PGDATA."
+
+#: initdb.c:2308
+#, c-format
+msgid "could not set environment"
+msgstr "non è stato possibile impostare l'ambiente"
+
+#: initdb.c:2326
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "il programma \"%s\" è necessario per %s ma non è stato trovato nella stessa directory di \"%s\""
+
+#: initdb.c:2329
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "il programma \"%s\" è stato trovato da \"%s\" ma non era della stessa versione di %s"
+
+#: initdb.c:2344
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "il percorso del file di input deve essere un percorso assoluto"
+
+#: initdb.c:2361
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "Il cluster di database sarà inizializzato con il locale \"%s\".\n"
+
+#: initdb.c:2364
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "Il cluster di database verrà inizializzato con questa configurazione locale:\n"
+
+#: initdb.c:2365
+#, c-format
+msgid " provider: %s\n"
+msgstr " fornitore: %s\n"
+
+#: initdb.c:2367
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " Locale ICU: %s\n"
+
+#: initdb.c:2368
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+"LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGGI: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2385
+#, c-format
+msgid "The default database encoding has been set to \"%s\".\n"
+msgstr "La codifica del database predefinita è stata impostata su \"%s\".\n"
+
+#: initdb.c:2397
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "non è stato possibile trovare la codifica adatta per la locale \"%s\""
+
+#: initdb.c:2399
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "Riesegui %s con l'opzione -E."
+
+#: initdb.c:2400 initdb.c:3021 initdb.c:3041
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: initdb.c:2412
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"La codifica \"%s\" implicata dal locale non è consentita come codifica lato server.\n"
+"La codifica predefinita dei database sarà impostata invece a \"%s\".\n"
+
+#: initdb.c:2417
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "la lingua \"%s\" richiede una codifica non supportata \"%s\""
+
+#: initdb.c:2419
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "La codifica \"%s\" non è consentita come codifica lato server."
+
+#: initdb.c:2421
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "Riesegui %s con una selezione di locale diversa."
+
+#: initdb.c:2429
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "La codifica predefinita del database è stata impostata a \"%s\".\n"
+
+#: initdb.c:2498
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "non è stato possibile trovare una configurazione di ricerca del testo adatta per la locale \"%s\""
+
+#: initdb.c:2509
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "la configurazione di ricerca del testo adatta per la locale \"%s\" è sconosciuta"
+
+#: initdb.c:2514
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "la configurazione di ricerca del testo specificata \"%s\" potrebbe non corrispondere alla locale \"%s\""
+
+#: initdb.c:2519
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "La configurazione predefinita di ricerca testo sarà impostata a \"%s\".\n"
+
+#: initdb.c:2562 initdb.c:2633
+#, c-format
+msgid "creating directory %s ... "
+msgstr "creazione della directory %s ... "
+
+#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "creazione della directory \"%s\" fallita: %m"
+
+#: initdb.c:2576 initdb.c:2648
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "correzione dei permessi sulla directory esistente %s ... "
+
+#: initdb.c:2581 initdb.c:2653
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "impossibile modificare i permessi della directory \"%s\": %m"
+
+#: initdb.c:2593 initdb.c:2665
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "la directory \"%s\" esiste ma non è vuota"
+
+#: initdb.c:2597
+#, c-format
+msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"."
+msgstr "Se vuoi creare un nuovo sistema di database, rimuovi o svuota la directory \"%s\" oppure esegui %s con un argomento diverso da \"%s\"."
+
+#: initdb.c:2605 initdb.c:2675 initdb.c:3058
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "accesso alla directory \"%s\" fallito: %m"
+
+#: initdb.c:2626
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "Il percorso della directory WAL deve essere un percorso assoluto"
+
+#: initdb.c:2669
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "Se vuoi archiviare il WAL lì, rimuovi o svuota la directory \"%s\"."
+
+#: initdb.c:2680
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "creazione del link simbolico \"%s\" fallita: %m"
+
+#: initdb.c:2683
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "i collegamenti simbolici non sono supportati su questa piattaforma"
+
+#: initdb.c:2702
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "Contiene un file con prefisso punto/invisibile, forse perché è un punto di montaggio."
+
+#: initdb.c:2704
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Contiene una directory persa + trovata, forse a causa del fatto che è un punto di montaggio."
+
+#: initdb.c:2706
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"Non è consigliabile utilizzare un punto di montaggio direttamente come directory dei dati.\n"
+"Crea una sottodirectory sotto il punto di montaggio."
+
+#: initdb.c:2732
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "creazione delle sottodirectory ... "
+
+#: initdb.c:2775
+msgid "performing post-bootstrap initialization ... "
+msgstr "esecuzione dell'inizializzazione successiva al bootstrap ... "
+
+#: initdb.c:2940
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Esecuzione in modalità debug\n"
+
+#: initdb.c:2944
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "Esecuzione in modalità senza pulizia. Gli errori non verranno ripuliti.\n"
+
+#: initdb.c:3014
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "provider locale non riconosciuto: %s"
+
+#: initdb.c:3039
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: initdb.c:3046
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s non può essere specificato a meno che non venga scelto il provider di impostazioni locali \"%s\""
+
+#: initdb.c:3060 initdb.c:3137
+msgid "syncing data to disk ... "
+msgstr "sincronizzazione dati sul disco ... "
+
+#: initdb.c:3068
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "la richiesta della password e il file della password non possono essere specificati insieme"
+
+#: initdb.c:3090
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "l'argomento di --wal-segsize deve essere un numero"
+
+#: initdb.c:3092
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "argomento di --wal-segsize deve essere una potenza di 2 tra 1 e 1024"
+
+#: initdb.c:3106
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "il nome del superutente \"%s\" non è consentito; i nomi dei ruoli non possono iniziare con \"pg_\""
+
+#: initdb.c:3108
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"I file di questo database apparterranno all'utente \"%s\".\n"
+"Questo utente deve inoltre possedere il processo server.\n"
+"\n"
+
+#: initdb.c:3124
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "La somma di controllo dei dati delle pagine è abilitata.\n"
+
+#: initdb.c:3126
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "La somma di controllo dei dati delle pagine è disabilitata.\n"
+
+#: initdb.c:3143
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Sync sul disco saltato.\n"
+"La directory dei dati potrebbe diventare corrotta in caso di crash del sistema operativo.\n"
+
+#: initdb.c:3148
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "abilitare l'autenticazione \"trust\" per le connessioni locali"
+
+#: initdb.c:3149
+#, c-format
+msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb."
+msgstr "Puoi cambiarlo modificando pg_hba.conf o usando l'opzione -A, o --auth-local e --auth-host, la prossima volta che esegui initdb."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3179
+msgid "logfile"
+msgstr "file_log"
+
+#: initdb.c:3181
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Successo. Ora puoi avviare il server database con:\n"
+"\n"
+" %s\n"
+"\n"
+
+#~ msgid "%s: could not access directory \"%s\": %s\n"
+#~ msgstr "%s: accesso alla directory \"%s\" fallito: %s\n"
+
+#~ msgid "%s: could not access file \"%s\": %s\n"
+#~ msgstr "%s: accesso al file \"%s\" fallito: %s\n"
+
+#~ msgid "%s: could not create directory \"%s\": %s\n"
+#~ msgstr "%s: creazione della directory \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not create symbolic link \"%s\": %s\n"
+#~ msgstr "%s: creazione del link simbolico \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not execute command \"%s\": %s\n"
+#~ msgstr "%s: esecuzione del comando \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not fsync file \"%s\": %s\n"
+#~ msgstr "%s: fsync del file \"%s\" fallito: %s\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s: apertura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: errore nell'apertura del file \"%s\" per la lettura: %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for writing: %s\n"
+#~ msgstr "%s: errore nell'apertura del file \"%s\" per la scrittura: %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s: apertura del file \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s: lettura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+#~ msgstr "%s: non è stato possibile rinominare il file \"%s\" in \"%s\": %s\n"
+
+#~ msgid "%s: could not stat file \"%s\": %s\n"
+#~ msgstr "%s: non è stato possibile ottenere informazioni sul file \"%s\": %s\n"
+
+#~ msgid "%s: could not write file \"%s\": %s\n"
+#~ msgstr "%s: errore nella scrittura del file \"%s\": %s\n"
+
+#~ msgid "%s: file \"%s\" does not exist\n"
+#~ msgstr "%s: il file \"%s\" non esiste\n"
+
+#~ msgid ""
+#~ "%s: input file \"%s\" does not belong to PostgreSQL %s\n"
+#~ "Check your installation or specify the correct path using the option -L.\n"
+#~ msgstr ""
+#~ "%s: il file di input \"%s\" non appartiene a PostgreSQL %s\n"
+#~ "Controlla la correttezza dell'installazione oppure specifica\n"
+#~ "il percorso corretto con l'opzione -L.\n"
+
+#~ msgid "%s: invalid locale name \"%s\"\n"
+#~ msgstr "%s: nome locale non valido \"%s\"\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: memoria esaurita\n"
+
+#~ msgid ""
+#~ "The program \"postgres\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Il programma \"postgres\" è richiesto da %s ma non è stato trovato\n"
+#~ "nella stessa directory \"%s\".\n"
+#~ "Verifica la correttezza dell'installazione.\n"
+
+#~ msgid ""
+#~ "The program \"postgres\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Il programma \"postgres\" è stato trovato da \"%s\"\n"
+#~ "ma non ha la stessa versione di %s.\n"
+#~ "Verifica la correttezza dell'installazione.\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "processo figlio terminato da segnale %s"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "spostamento nella directory \"%s\" fallito: %s"
+
+#~ msgid "could not open directory \"%s\": %s\n"
+#~ msgstr "apertura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "lettura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "lettura del link simbolico \"%s\" fallita"
+
+#~ msgid "could not stat file or directory \"%s\": %s\n"
+#~ msgstr "non è stato possibile ottenere informazioni sul file o directory \"%s\": %s\n"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "pclose fallita: %s"
diff --git a/src/bin/initdb/po/ja.po b/src/bin/initdb/po/ja.po
new file mode 100644
index 0000000..3f4f1f0
--- /dev/null
+++ b/src/bin/initdb/po/ja.po
@@ -0,0 +1,1176 @@
+# Japanese message translation file for initdb
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 11:13+0900\n"
+"PO-Revision-Date: 2022-09-26 14:44+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "カレントディレクトリを特定できませんでした: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "バイナリ\"%s\"は無効です"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "バイナリ\"%s\"を読み取れませんでした"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "実行する\"%s\"がありませんでした"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "ディレクトリ\"%s\"に移動できませんでした: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "シンボリックリンク\"%s\"を読めませんでした: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() が失敗しました: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: initdb.c:334
+#, c-format
+msgid "out of memory"
+msgstr "メモリ不足です"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリ不足です\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null ポインタを複製できません(内部エラー)。\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ファイル\"%s\"のstatに失敗しました: %m"
+
+#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m"
+
+#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンできませんでした: %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "ファイル\"%s\"をfsyncできませんでした: %m"
+
+#: ../../common/file_utils.c:383
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をクローズできませんでした: %m"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "ライブラリ\"%s\"をロードできませんでした: エラーコード %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "このプラットフォームでは制限付きトークンを生成できません: エラーコード %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "プロセストークンをオープンできませんでした: エラーコード %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "SIDを割り当てられませんでした: エラーコード %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "制限付きトークンを生成できませんでした: エラーコード %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "コマンド\"%s\"のためのプロセスを起動できませんでした: エラーコード %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "制限付きトークンで再実行できませんでした: %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "サブプロセスの終了コードを取得できませんでした: エラーコード %lu"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "\"%s\"というファイルまたはディレクトリの情報を取得できませんでした。: %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "\"%s\"というファイルまたはディレクトリを削除できませんでした: %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "実効ユーザーID %ld が見つかりませんでした: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "ユーザーが存在しません"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "ユーザー名の参照に失敗: エラーコード %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "コマンドは実行形式ではありません"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "コマンドが見つかりません"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "子プロセスが終了コード%dで終了しました"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "子プロセスが例外0x%Xで終了しました"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "子プロセスはシグナル%dにより終了しました: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "子プロセスが未知のステータス%dで終了しました"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "\"%s\"のjunctionを設定できませんでした: %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "\"%s\"のjunctionを入手できませんでした: %s\n"
+
+#: initdb.c:464 initdb.c:1459
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "ファイル\"%s\"を読み取り用にオープンできませんでした: %m"
+
+#: initdb.c:505 initdb.c:809 initdb.c:829
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "ファイル\"%s\"を書き込み用にオープンできませんでした: %m"
+
+#: initdb.c:509 initdb.c:812 initdb.c:831
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ファイル\"%s\"を書き出せませんでした: %m"
+
+#: initdb.c:513
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ファイル\"%s\"をクローズできませんでした: %m"
+
+#: initdb.c:529
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "コマンド\"%s\"を実行できませんでした: %m"
+
+#: initdb.c:547
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "データディレクトリ\"%s\"を削除しています"
+
+#: initdb.c:549
+#, c-format
+msgid "failed to remove data directory"
+msgstr "データディレクトリの削除に失敗しました"
+
+#: initdb.c:553
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "データディレクトリ\"%s\"の内容を削除しています"
+
+#: initdb.c:556
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "データディレクトリの内容の削除に失敗しました"
+
+#: initdb.c:561
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "WAL ディレクトリ\"%s\"を削除しています"
+
+#: initdb.c:563
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "WAL ディレクトリの削除に失敗しました"
+
+#: initdb.c:567
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "WAL ディレクトリ\"%s\"の中身を削除しています"
+
+#: initdb.c:569
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "WAL ディレクトリの中身の削除に失敗しました"
+
+#: initdb.c:576
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "ユーザーの要求によりデータディレクトリ\"%s\"を削除しませんでした"
+
+#: initdb.c:580
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "ユーザーの要求により WAL ディレクトリ\"%s\"を削除しませんでした"
+
+#: initdb.c:598
+#, c-format
+msgid "cannot be run as root"
+msgstr "root では実行できません"
+
+#: initdb.c:599
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "サーバープロセスの所有者となる(非特権)ユーザーとして(例えば\"su\"を使用して)ログインしてください。"
+
+#: initdb.c:631
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\"は有効なサーバー符号化方式名ではありません"
+
+#: initdb.c:775
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "ファイル\"%s\"は存在しません"
+
+#: initdb.c:776 initdb.c:781 initdb.c:788
+#, c-format
+msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."
+msgstr "インストール先が破損しているか実行時オプション-Lで間違ったディレクトリを指定した可能性があります。"
+
+#: initdb.c:780
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "ファイル\"%s\"にアクセスできませんでした: %m"
+
+#: initdb.c:787
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "ファイル\"%s\"は通常のファイルではありません"
+
+#: initdb.c:922
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "動的共有メモリの実装を選択しています ... "
+
+#: initdb.c:931
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "デフォルトのmax_connectionsを選択しています ... "
+
+#: initdb.c:962
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "デフォルトのshared_buffersを選択しています ... "
+
+#: initdb.c:996
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "デフォルトの時間帯を選択しています ... "
+
+#: initdb.c:1030
+msgid "creating configuration files ... "
+msgstr "設定ファイルを作成しています ... "
+
+#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "\"%s\"の権限を変更できませんでした: %m"
+
+#: initdb.c:1319
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "ブートストラップスクリプトを実行しています ... "
+
+#: initdb.c:1331
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "入力ファイル\"%s\"は PostgreSQL %s のものではありません"
+
+#: initdb.c:1333
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "-Lオプションを使用して正しいパスを指定してください。"
+
+#: initdb.c:1437
+msgid "Enter new superuser password: "
+msgstr "新しいスーパーユーザーのパスワードを入力してください:"
+
+#: initdb.c:1438
+msgid "Enter it again: "
+msgstr "再入力してください:"
+
+#: initdb.c:1441
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "パスワードが一致しません。\n"
+
+#: initdb.c:1465
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "ファイル\"%s\"からパスワードを読み取ることができませんでした: %m"
+
+#: initdb.c:1468
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "パスワードファイル\"%s\"が空です"
+
+#: initdb.c:1915
+#, c-format
+msgid "caught signal\n"
+msgstr "シグナルが発生しました\n"
+
+#: initdb.c:1921
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "子プロセスへの書き込みができませんでした: %s\n"
+
+#: initdb.c:1929
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2018
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale()が失敗しました"
+
+#: initdb.c:2036
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "古いロケール\"%s\"を復元できませんでした"
+
+#: initdb.c:2043
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "ロケール名\"%s\"は不正です"
+
+#: initdb.c:2054
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "不正なロケール設定; 環境変数LANGおよびLC_* を確認してください"
+
+#: initdb.c:2080 initdb.c:2104
+#, c-format
+msgid "encoding mismatch"
+msgstr "符号化方式が合いません"
+
+#: initdb.c:2081
+#, c-format
+msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions."
+msgstr "選択した符号化方式(%s)と選択したロケールが使用する符号化方式(%s)が合っていません。これにより各種の文字列処理関数が間違った動作をすることになります。"
+
+#: initdb.c:2086 initdb.c:2107
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "%sを再度実行してください、その際にはエンコーディングを明示的に指定しないか、適合する組み合わせを選択してください。"
+
+#: initdb.c:2105
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "指定された符号化方式(%s)はICUプロバイダではサポートされません。"
+
+#: initdb.c:2169
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "ICUロケールを指定しなければなりません"
+
+#: initdb.c:2176
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "このビルドではICUはサポートされていません"
+
+#: initdb.c:2187
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr "%sはPostgreSQLデータベースクラスタを初期化します。\n"
+
+#: initdb.c:2188
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: initdb.c:2189
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATADIR]\n"
+
+#: initdb.c:2190
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"オプション:\n"
+
+#: initdb.c:2191
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=METHOD ローカル接続のデフォルト認証方式\n"
+
+#: initdb.c:2192
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=METHOD ローカルTCP/IP接続のデフォルト認証方式\n"
+
+#: initdb.c:2193
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=METHOD ローカルソケット接続のデフォルト認証方式\n"
+
+#: initdb.c:2194
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATADIR データベースクラスタの場所\n"
+
+#: initdb.c:2195
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=ENCODING 新規データベースのデフォルト符号化方式\n"
+
+#: initdb.c:2196
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access データディレクトリのグループ読み取り/実行を許可\n"
+
+#: initdb.c:2197
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOCALE 新しいデータベースのICUロケールIDを設定\n"
+
+#: initdb.c:2198
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums データページのチェックサムを使用\n"
+
+#: initdb.c:2199
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE 新しいデータベースのデフォルトロケールをセット\n"
+
+#: initdb.c:2200
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate, --lc-ctype, --lc-messages=ロケール名\n"
+" --lc-monetary, --lc-numeric, --lc-time=ロケール名\n"
+" 新しいデータベースで使用する、おのおののカテゴリの\n"
+" デフォルトロケールを設定(デフォルト値は環境変数から\n"
+" 取得)\n"
+
+#: initdb.c:2204
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale --locale=C と同じ\n"
+
+#: initdb.c:2205
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" 新しいデータベースにおけるデフォルトのロケール\n"
+" プロバイダを設定\n"
+
+#: initdb.c:2207
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr ""
+" --pwfile=ファイル名 新しいスーパーユーザーのパスワードをファイルから\n"
+" 読み込む\n"
+
+#: initdb.c:2208
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\\\n"
+" デフォルトのテキスト検索設定\n"
+
+#: initdb.c:2210
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAME データベースのスーパーユーザーの名前\n"
+
+#: initdb.c:2211
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt 新規スーパーユーザーに対してパスワード入力を促す\n"
+
+#: initdb.c:2212
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR 先行書き込みログ用ディレクトリの位置\n"
+
+#: initdb.c:2213
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE WALセグメントのサイズ、メガバイト単位\n"
+
+#: initdb.c:2214
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"使用頻度の低いオプション:\n"
+
+#: initdb.c:2215
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug 多くのデバッグ用の出力を生成\n"
+
+#: initdb.c:2216
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches debug_discard_cachesを1に設定する\n"
+
+#: initdb.c:2217
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORY 入力ファイルの場所を指定\n"
+
+#: initdb.c:2218
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean エラー発生後のクリーンアップを行わない\n"
+
+#: initdb.c:2219
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync 変更の安全なディスクへの書き出しを待機しない\n"
+
+#: initdb.c:2220
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions 次の手順の指示を表示しない\n"
+
+#: initdb.c:2221
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show 内部設定を表示\n"
+
+#: initdb.c:2222
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only データベースファイルのsyncのみを実行して終了\n"
+
+#: initdb.c:2223
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"その他のオプション:\n"
+
+#: initdb.c:2224
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: initdb.c:2225
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: initdb.c:2226
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"データディレクトリが指定されない場合、PGDATA環境変数が使用されます。\n"
+
+#: initdb.c:2228
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"バグは<%s>に報告してください。\n"
+
+#: initdb.c:2229
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: initdb.c:2257
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "\"%2$s\"接続では認証方式\"%1$s\"は無効です"
+
+#: initdb.c:2271
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "パスワード認証を有効にするにはスーパーユーザーのパスワードを指定する必要があります"
+
+#: initdb.c:2290
+#, c-format
+msgid "no data directory specified"
+msgstr "データディレクトリが指定されていません"
+
+#: initdb.c:2291
+#, c-format
+msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA."
+msgstr "データベースシステムのデータを格納するディレクトリを指定する必要があります。実行時オプション -D、もしくは、PGDATA環境変数で指定してください。"
+
+#: initdb.c:2308
+#, c-format
+msgid "could not set environment"
+msgstr "環境を設定できません"
+
+#: initdb.c:2326
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "%2$sにはプログラム\"%1$s\"が必要ですが、\"%3$s\"と同じディレクトリにはありませんでした。"
+
+#: initdb.c:2329
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じバージョンではありませんでした。"
+
+#: initdb.c:2344
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "入力ファイルの場所は絶対パスでなければなりません"
+
+#: initdb.c:2361
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "データベースクラスタはロケール\"%s\"で初期化されます。\n"
+
+#: initdb.c:2364
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "データベースクラスタは以下のロケール構成で初期化されます。\n"
+
+#: initdb.c:2365
+#, c-format
+msgid " provider: %s\n"
+msgstr " プロバイダ: %s\n"
+
+#: initdb.c:2367
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " ICUロケール: %s\n"
+
+#: initdb.c:2368
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2385
+#, c-format
+msgid "The default database encoding has been set to \"%s\".\n"
+msgstr "デフォルトのデータベース符号化方式は%sに設定されました。\n"
+
+#: initdb.c:2397
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "ロケール\"%s\"に対して適切な符号化方式がありませんでした"
+
+#: initdb.c:2399
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "-Eオプションを付けて%sを再実行してください。"
+
+#: initdb.c:2400 initdb.c:3021 initdb.c:3041
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細は\"%s --help\"を実行してください。"
+
+#: initdb.c:2412
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"ロケールにより暗黙的に指定される符号化方式\"%s\"はサーバー側の\n"
+"符号化方式として使用できません。\n"
+"デフォルトのデータベース符号化方式は代わりに\"%s\"に設定されます。\n"
+
+#: initdb.c:2417
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "ロケール\"%s\"は非サポートの符号化方式\"%s\"を必要とします"
+
+#: initdb.c:2419
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "符号化方式\"%s\"はサーバー側の符号化方式として使用できません。"
+
+#: initdb.c:2421
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "別のローケルを選択して%sを再実行してください。"
+
+#: initdb.c:2429
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "デフォルトのデータベース符号化方式はそれに対応して%sに設定されました。\n"
+
+#: initdb.c:2498
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "ロケール\"%s\"用の適切なテキスト検索設定が見つかりませんでした"
+
+#: initdb.c:2509
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "ロケール\"%s\"に適したテキスト検索設定が不明です"
+
+#: initdb.c:2514
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "指定したテキスト検索設定\"%s\"がロケール\"%s\"に合わない可能性があります"
+
+#: initdb.c:2519
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "デフォルトのテキスト検索構成は %s に設定されます。\n"
+
+#: initdb.c:2562 initdb.c:2633
+#, c-format
+msgid "creating directory %s ... "
+msgstr "ディレクトリ%sを作成しています ... "
+
+#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を作成できませんでした: %m"
+
+#: initdb.c:2576 initdb.c:2648
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "ディレクトリ%sの権限を設定しています ... "
+
+#: initdb.c:2581 initdb.c:2653
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"の権限を変更できませんでした: %m"
+
+#: initdb.c:2593 initdb.c:2665
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "ディレクトリ\"%s\"は存在しますが、空ではありません"
+
+#: initdb.c:2597
+#, c-format
+msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"."
+msgstr "新規にデータベースシステムを作成したいのであれば、ディレクトリ\"%s\"を削除あるいは空にする、または%sを\"%s\"以外の引数で実行してください。"
+
+#: initdb.c:2605 initdb.c:2675 initdb.c:3058
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"にアクセスできませんでした: %m"
+
+#: initdb.c:2626
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL ディレクトリの位置は、絶対パスでなければなりません"
+
+#: initdb.c:2669
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "そこにWALを格納したい場合は、ディレクトリ\"%s\"を削除するか空にしてください。"
+
+#: initdb.c:2680
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "シンボリックリンク\"%s\"を作成できませんでした: %m"
+
+#: initdb.c:2683
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "このプラットフォームでシンボリックリンクはサポートされていません"
+
+#: initdb.c:2702
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "おそらくマウントポイントであることに起因した先頭がドットであるファイル、または不可視なファイルが含まれています。"
+
+#: initdb.c:2704
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "おそらくマウントポイントであることに起因したlost+foundディレクトリが含まれています。"
+
+#: initdb.c:2706
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"マウントポイントであるディレクトリをデータディレクトリとして使用することはお勧めしません。\n"
+"この下にサブディレクトリを作成してください。"
+
+#: initdb.c:2732
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "サブディレクトリを作成しています ... "
+
+#: initdb.c:2775
+msgid "performing post-bootstrap initialization ... "
+msgstr "ブートストラップ後の初期化を実行しています ... "
+
+#: initdb.c:2940
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "デバッグモードで実行しています。\n"
+
+#: initdb.c:2944
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "no-clean モードで実行しています。失敗した状況は削除されません。\n"
+
+#: initdb.c:3014
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "認識できない照合順序プロバイダ: %s"
+
+#: initdb.c:3039
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")"
+
+#: initdb.c:3046
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "ロケールプロバイダ\"%2$s\"が選択されていなければ%1$sは指定できません"
+
+#: initdb.c:3060 initdb.c:3137
+msgid "syncing data to disk ... "
+msgstr "データをディスクに同期しています ... "
+
+#: initdb.c:3068
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "パスワードプロンプトとパスワードファイルは同時に指定できません"
+
+#: initdb.c:3090
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segsize の引数は数値でなければなりません"
+
+#: initdb.c:3092
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "--wal-segsize のパラメータは1から1024の間の2の倍数でなければなりません"
+
+#: initdb.c:3106
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "スーパーユーザー名\"%s\"は許可されません; ロール名は\"pg_\"で始めることはできません"
+
+#: initdb.c:3108
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"データベースシステム内のファイルの所有者はユーザー\"%s\"となります。\n"
+"このユーザーをサーバープロセスの所有者とする必要があります。\n"
+"\n"
+
+#: initdb.c:3124
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "データページのチェックサムは有効です。\n"
+
+#: initdb.c:3126
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "データベージのチェックサムは無効です。\n"
+
+#: initdb.c:3143
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"ディスクへの同期がスキップされました。\n"
+"オペレーティングシステムがクラッシュした場合データディレクトリは破損されるかもしれません。\n"
+
+#: initdb.c:3148
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "ローカル接続に対して\"trust\"認証を有効にします "
+
+#: initdb.c:3149
+#, c-format
+msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb."
+msgstr "pg_hba.confを編集する、もしくは、次回initdbを実行する時に -A オプション、あるいは --auth-local および --auth-host オプションを使用することで変更できます。"
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3179
+msgid "logfile"
+msgstr "ログファイル"
+
+#: initdb.c:3181
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"成功しました。以下のようにしてデータベースサーバーを起動できます:\n"
+"\n"
+" %s\n"
+"\n"
+
+#~ msgid "%s: unrecognized authentication method \"%s\"\n"
+#~ msgstr "%s: \"%s\"は未知の認証方式です\n"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "ディレクトリを\"%s\"に変更できませんでした"
+
+#~ msgid "%s: could not create symbolic link \"%s\": %s\n"
+#~ msgstr "%s: シンボリックリンク\"%s\"を作成できませんでした: %s\n"
+
+#~ msgid "%s: transaction log directory location must be an absolute path\n"
+#~ msgstr "%s: トランザクションログのディレクトリの位置は、絶対パスでなければなりません\n"
+
+#~ msgid "%s: could not access directory \"%s\": %s\n"
+#~ msgstr "%s: ディレクトリ\"%s\"にアクセスできませんでした: %s\n"
+
+#~ msgid " -X, --xlogdir=XLOGDIR location for the transaction log directory\n"
+#~ msgstr " -X, --xlogdir=XLOGDIR トランザクションログディレクトリの場所です\n"
+
+#~ msgid "%s: could not to allocate SIDs: error code %lu\n"
+#~ msgstr "%s: SIDを割り当てられませんでした: エラーコード %lu\n"
+
+#~ msgid "%s: invalid locale name \"%s\"\n"
+#~ msgstr "%s: ロケール名\"%s\"は無効です。\n"
+
+#~ msgid "%s: failed to restore old locale \"%s\"\n"
+#~ msgstr "%s:古いロケール\"%s\"を戻すことができませんでした。\n"
+
+#~ msgid "copying template1 to postgres ... "
+#~ msgstr "template1からpostgresへコピーしています ... "
+
+#~ msgid "copying template1 to template0 ... "
+#~ msgstr "template1からtemplate0へコピーしています ... "
+
+#~ msgid "vacuuming database template1 ... "
+#~ msgstr "template1データベースをバキュームしています ... "
+
+#~ msgid "loading PL/pgSQL server-side language ... "
+#~ msgstr "PL/pgSQL サーバーサイド言語をロードしています ... "
+
+#~ msgid "creating information schema ... "
+#~ msgstr "情報スキーマを作成しています ... "
+
+#~ msgid "setting privileges on built-in objects ... "
+#~ msgstr "組み込みオブジェクトに権限を設定しています ... "
+
+#~ msgid "creating dictionaries ... "
+#~ msgstr "ディレクトリを作成しています ... "
+
+#~ msgid "creating conversions ... "
+#~ msgstr "変換を作成しています ... "
+
+#~ msgid "not supported on this platform\n"
+#~ msgstr "このプラットフォームではサポートされません\n"
+
+#~ msgid "Use the option \"--debug\" to see details.\n"
+#~ msgstr "詳細を確認するためには\"--debug\"オプションを使用してください。\n"
+
+#~ msgid "No usable system locales were found.\n"
+#~ msgstr "使用できるシステムロケールが見つかりません\n"
+
+#~ msgid "%s: locale name has non-ASCII characters, skipped: \"%s\"\n"
+#~ msgstr "%s: ロケール名に非ASCII文字がありますので飛ばします: \"%s\"\n"
+
+#~ msgid "%s: locale name too long, skipped: \"%s\"\n"
+#~ msgstr "%s: ロケール名が長過ぎますので飛ばします: \"%s\"\n"
+
+#~ msgid "creating collations ... "
+#~ msgstr "照合順序を作成しています ... "
+
+#~ msgid "loading system objects' descriptions ... "
+#~ msgstr "システムオブジェクトの定義をロードしています ... "
+
+#~ msgid "creating system views ... "
+#~ msgstr "システムビューを作成しています ... "
+
+#~ msgid "initializing dependencies ... "
+#~ msgstr "依存関係を初期化しています ... "
+
+#~ msgid "setting password ... "
+#~ msgstr "パスワードを設定しています ... "
+
+#~ msgid "initializing pg_authid ... "
+#~ msgstr "pg_authidを初期化しています ... "
+
+#~ msgid "creating template1 database in %s/base/1 ... "
+#~ msgstr "%s/base/1にtemplate1データベースを作成しています ... "
+
+#~ msgid "%s: could not access file \"%s\": %s\n"
+#~ msgstr "%s: ファイル\"%s\"にアクセスできませんでした: %s\n"
+
+#~ msgid "%s: file \"%s\" does not exist\n"
+#~ msgstr "%s: ファイル\"%s\"がありません\n"
+
+#~ msgid "%s: could not create directory \"%s\": %s\n"
+#~ msgstr "%s: ディレクトリ\"%s\"を作成できませんでした。: %s\n"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s: 現在のユーザー名を得ることができませんでした: %s\n"
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s: 現在のユーザーに関する情報を得ることができませんでした: %s\n"
+
+#~ msgid "%s: transaction log directory \"%s\" not removed at user's request\n"
+#~ msgstr "%s: ユーザーが要求したトランザクションログディレクトリ\"%s\"を削除しません\n"
+
+#~ msgid "%s: failed to remove contents of transaction log directory\n"
+#~ msgstr "%s: トランザクションログディレクトリの内容の削除に失敗しました\n"
+
+#~ msgid "%s: removing contents of transaction log directory \"%s\"\n"
+#~ msgstr "%s: トランザクションログディレクトリ\"%s\"の内容を削除しています\n"
+
+#~ msgid "%s: failed to remove transaction log directory\n"
+#~ msgstr "%s: トランザクションログディレクトリの削除に失敗しました\n"
+
+#~ msgid "%s: removing transaction log directory \"%s\"\n"
+#~ msgstr "%s: トランザクションログディレクトリ\"%s\"を削除しています\n"
+
+#~ msgid "%s: could not execute command \"%s\": %s\n"
+#~ msgstr "%s: コマンド\"%s\"の実効に失敗しました: %s\n"
+
+#~ msgid "%s: could not fsync file \"%s\": %s\n"
+#~ msgstr "%s: ファイル\"%s\"をfsyncできませんでした: %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s: ファイル\"%s\"をオープンできませんでした: %s\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "詳細は\"%s --help\"で確認してください。\n"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "pcloseが失敗しました: %m"
+
+#~ msgid "fatal: "
+#~ msgstr "致命的エラー: "
diff --git a/src/bin/initdb/po/ka.po b/src/bin/initdb/po/ka.po
new file mode 100644
index 0000000..8078a2a
--- /dev/null
+++ b/src/bin/initdb/po/ka.po
@@ -0,0 +1,1131 @@
+# Georgian message translation file for initdb
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the initdb (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-17 06:49+0000\n"
+"PO-Revision-Date: 2022-09-17 10:48+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდომა: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გაფრთხილება: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტალები: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნება: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "მიმდინარე საქაღალდის იდენტიფიკაციის პრობლემა: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "არასწორი ბინარული ფაილი \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "ბინარული ფაილის (%s) წაკითხვის შეცდოა"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "გასაშვებად ფაილის \"%s\" პოვნა შეუძლებელია"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "საქაღალდის %s-ზე შეცვლის შეცდომა: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "სიმბოლური ბმის \"%s\" წაკითხვის შეცდომა: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s()-ის შეცდომა: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: initdb.c:334
+#, c-format
+msgid "out of memory"
+msgstr "არასაკმარისი მეხსიერება"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "არასაკმარისი მეხსიერება\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ნულოვანი მაჩვენებლის დუბლირება შეუძლებელია (შიდა შეცდომა)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ფაილი \"%s\" არ არსებობს: %m"
+
+#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "საქაღალდის (%s) გახსნის შეცდომა: %m"
+
+#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "საქაღალდის (%s) წაკითხვის შეცდომა: %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფაილის (%s) გახსნის შეცდომა: %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "ფაილის (%s) fsync-ის შეცდომა: %m"
+
+#: ../../common/file_utils.c:383
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "გადარქმევის შეცდომა %s - %s: %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "საქაღალდის %s-ზე დახურვის შეცდომა: %m"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "ბიბლიოთეკის (\"%s\") ჩატვირთვის შეცდომა: შეცდომის კოდი: %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "ამ პლატფორმაზე შეზღუდული კოდების შექმნა შეუძლებელია: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "პროცესის კოდის გახსნა შეუძლებელია: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "შეცდომა SSID-ების გამოყოფისას: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "შეზღუდული კოდის შექმნა ვერ მოხერხდა: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "„%s“ ბრძანების პროცესის დაწყება ვერ მოხერხდა: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "შეზღუდულ კოდის ხელახლა შესრულება ვერ მოხერხდა: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "ქვეპროცესიდან გასასვლელი კოდი ვერ მივიღე: შეცდომის კოდი %lu"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "ფაილის ან საქაღალდის \"%s\" პოვნა შეუძლებელია: %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "ფაილის ან საქაღალდე „%s“ ვერ წაიშალა: %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "მომხმარებლის ეფექტური ID-ის (%ld) ამოხსნა შეუძლებელია: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "მომხმარებელი არ არსებობს"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "მომხარებლის სახელის ამოხსნის პრობლემა: შეცდომის კოდი: %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "ბრძანება გაშვებადი არაა"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "ბრძანება ვერ ვიპოვე"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "შვილეული პროცესი დასრულდა სტატუსით %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "შვილეული პროცესი დასრულდა გამონაკლისით 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "პროცესი გაჩერდა სიგნალით: %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "შვილეული პროცესი დასრულდა უცნობი სტატუსით %d"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "\"%s\"-ისთვის შეერთების დაყენება ვერ მოხერხდა: %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "\"%s\"-ისთვის შეერთების მიღება ვერ მოხერხდა: %s\n"
+
+#: initdb.c:464 initdb.c:1459
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "ფაილის (%s) გახსნის შეცდომა: %m"
+
+#: initdb.c:505 initdb.c:809 initdb.c:829
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "ფაილის (\"%s\") ჩასაწერად გახსნა შეუძლებელია: %m"
+
+#: initdb.c:509 initdb.c:812 initdb.c:831
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ფაილში (%s) ჩაწერის შეცდომა: %m"
+
+#: initdb.c:513
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ფაილის (%s) დახურვის შეცდომა: %m"
+
+#: initdb.c:529
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "ბრძანების (\"%s\") შესრულების შეცდომა: %m"
+
+#: initdb.c:547
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "მონაცემების საქაღალდის წაშლა \"%s\""
+
+#: initdb.c:549
+#, c-format
+msgid "failed to remove data directory"
+msgstr "მონაცემების საქაღალდის წაშლის შეცდომა"
+
+#: initdb.c:553
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "მონაცემების საქაღალდის შემცველობის წაშლა \"%s\""
+
+#: initdb.c:556
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "მონაცემების საქაღალდის შემცველობის წაშლის შეცდომა"
+
+#: initdb.c:561
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "მიმდინარეობს WAL საქაღალდის წაშლა \"%s\""
+
+#: initdb.c:563
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "შეცდომა WAL საქაღალდის წაშლისას"
+
+#: initdb.c:567
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "მიმდინარეობს WAL საქაღალდის (\"%s\") შემცველობის წაშლა"
+
+#: initdb.c:569
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "შეცდომა WAL საქაღალდის შემცველობის წაშლისას"
+
+#: initdb.c:576
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "მონაცემების საქაღალდე \"%s\" მომხმარებლის მოთხოვნისას არ წაიშლება"
+
+#: initdb.c:580
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "WAL საქაღალდე \"%s\" მომხმარებლის მოთხოვნისას არ წაიშლება"
+
+#: initdb.c:598
+#, c-format
+msgid "cannot be run as root"
+msgstr "root-ით ვერ გაეშვება"
+
+#: initdb.c:599
+#, c-format
+msgid ""
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will own "
+"the server process."
+msgstr ""
+"შედით (ან გამოიყენეთ \"su\") არაპრივილეგირებული მომხმარებლით, რომელიც "
+"სერვერს პროცესის მფლობელი იქნება."
+
+#: initdb.c:631
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" კოდირების სწორ სახელს არ წარმოადგენს"
+
+#: initdb.c:775
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "ფაილი %s არ არსებობს"
+
+#: initdb.c:776 initdb.c:781 initdb.c:788
+#, c-format
+msgid ""
+"This might mean you have a corrupted installation or identified the wrong "
+"directory with the invocation option -L."
+msgstr ""
+"შეიძლება ნიშნავდეს, რომ თქვენი დაყენებული ვერსია გაფუჭებულია ან -L -ს "
+"არასწორი საქაღალდე მიუთითეთ."
+
+#: initdb.c:780
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "ფაილის (%s) წვდომის შეცდომა: %m"
+
+#: initdb.c:787
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "ფაილ \"%s\" ჩვეულებრივი ფაილი არაა"
+
+#: initdb.c:922
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "დინამიკური გაზიარებული მეხსიერების იმპლემენტაციის არჩევა ... "
+
+#: initdb.c:931
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "ნაგულისხმები max_connections-ის არჩევა … "
+
+#: initdb.c:962
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "ნაგულისხმები shared_buffers-ის არჩევა … "
+
+#: initdb.c:996
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "დროის ნაგულისხმები სარტყლის არჩევა … "
+
+#: initdb.c:1030
+msgid "creating configuration files ... "
+msgstr "კონფიგურაციის ფაილების შექმნა … "
+
+#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "\"%s\"-ის წვდომების შეცვლის შეცდომა: %m"
+
+#: initdb.c:1319
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "მოსამზადებელი სკრიპტის გაშვება ... "
+
+#: initdb.c:1331
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "შეყვანილი ფაილი \"%s\" PostgreSQL %s -ს არ ეკუთვნის"
+
+#: initdb.c:1333
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "მიუთითეთ სწორი ბილიკი -L პარამეტრით."
+
+#: initdb.c:1437
+msgid "Enter new superuser password: "
+msgstr "შეიყვანეთ ზემომხმარებლის ახალი პაროლი: "
+
+#: initdb.c:1438
+msgid "Enter it again: "
+msgstr "შეიყვანეთ კდევ ერთხელ: "
+
+#: initdb.c:1441
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "პაროლები არ ემთხვევა.\n"
+
+#: initdb.c:1465
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "პაროლის ფაილიდან (\"%s\") წაკითხვის შეცდომა: %m"
+
+#: initdb.c:1468
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "პაროლის ფაილი (\"%s\") ცარიელია"
+
+#: initdb.c:1915
+#, c-format
+msgid "caught signal\n"
+msgstr "მიღებულია სიგნალი\n"
+
+#: initdb.c:1921
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "შვილობილი პროცესისთვის ჩაწერის შეცდომა: %s\n"
+
+#: initdb.c:1929
+#, c-format
+msgid "ok\n"
+msgstr "დიახ\n"
+
+#: initdb.c:2018
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale()-ის შეცდომა"
+
+#: initdb.c:2036
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "ძველი ენის (\"%s\") აღდგენის შეცდომა"
+
+#: initdb.c:2043
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "ენის არასწორი სახელი: \"%s\""
+
+#: initdb.c:2054
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "ენის არასწორი პარამეტრები; გადაამოწმეთ გარემოს ცვლადები: LANG და LC_*"
+
+#: initdb.c:2080 initdb.c:2104
+#, c-format
+msgid "encoding mismatch"
+msgstr "კოდირება არ ემთხვევა"
+
+#: initdb.c:2081
+#, c-format
+msgid ""
+"The encoding you selected (%s) and the encoding that the selected locale "
+"uses (%s) do not match. This would lead to misbehavior in various character "
+"string processing functions."
+msgstr ""
+"თქვენ მიერ არჩეული კოდირება (%s) და კოდირება, რომელსაც არჩეული ენა იყენებს "
+"(%s) არ ემთხვევა. ეს სიმბოლოების სტრიქონების დამუშავების სხვადასხვა "
+"ფუნქციების არასწორ ქცევას გამოიწვევს."
+
+#: initdb.c:2086 initdb.c:2107
+#, c-format
+msgid ""
+"Rerun %s and either do not specify an encoding explicitly, or choose a "
+"matching combination."
+msgstr "თავიდან გაუშვით %s და კოდირება ან არ მიუთითოთ, ან სწორად მიუთითეთ."
+
+#: initdb.c:2105
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr ""
+"თქვენს მიერ შერჩეული კოდირება (%s) ICU -ის მომწოდებელთან ერთად "
+"მხარდაუჭერელია."
+
+#: initdb.c:2169
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "საჭროა ICU ენის მითითება"
+
+#: initdb.c:2176
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ამ აგებაში ICU-ის მხარდაჭერა არ არსებბს"
+
+#: initdb.c:2187
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL ბაზის კლასერის ინიციალიზაციას ახდენს.\n"
+"\n"
+
+#: initdb.c:2188
+#, c-format
+msgid "Usage:\n"
+msgstr "გამოყენება:\n"
+
+#: initdb.c:2189
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [პარამეტრი]... [მონაცემებისსაქაღალდე]\n"
+
+#: initdb.c:2190
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"პარამეტრები:\n"
+
+#: initdb.c:2191
+#, c-format
+msgid ""
+" -A, --auth=METHOD default authentication method for local "
+"connections\n"
+msgstr ""
+" -A, --auth=მეთოდი ავთენტიკაციის ნაგულისხმები მეთოდი ლოკალური "
+"შეერთებებისთვის\n"
+
+#: initdb.c:2192
+#, c-format
+msgid ""
+" --auth-host=METHOD default authentication method for local TCP/IP "
+"connections\n"
+msgstr ""
+" --auth-host=მეთოდი ლოკალური TCP/IP შეერთების ავთენტიკაციის "
+"ნაგულისხმები მეთოდი\n"
+
+#: initdb.c:2193
+#, c-format
+msgid ""
+" --auth-local=METHOD default authentication method for local-socket "
+"connections\n"
+msgstr ""
+" --auth-local=მეთოდი ლოკალური სოკეტის შეერთების ავთენტიკაციის "
+"ნაგულისხმები მეთოდი\n"
+
+#: initdb.c:2194
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATADIR ბაზის კლასტერის მდებარეობა\n"
+
+#: initdb.c:2195
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=კოდირება ახალი ბაზების ნაგულისხმები კოდირება\n"
+
+#: initdb.c:2196
+#, c-format
+msgid ""
+" -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr ""
+" -g, --allow-group-access მონაცემების საქაღალდეზე ჯგუფის კითხვა/გაშვების "
+"წვდომის დაყენება\n"
+
+#: initdb.c:2197
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=კოდირება ICU ენის ID ახალი ბაზებისთვის\n"
+
+#: initdb.c:2198
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr ""
+" -k, --data-checksums მონაცემების გვერდის საკონტროლო ჯამების "
+"გამოყენება\n"
+
+#: initdb.c:2199
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=ენა ახალი ბაზების ნაგულისხმები ენის დაყენება\n"
+
+#: initdb.c:2200
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category "
+"for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" დააყენეთ ნაგულისხმები ენა შესაბამის კატეგორიაში\n"
+" ახალი ბაზებისთვის (ნაგულისხმები აღებულია "
+"გარემოდან)\n"
+
+#: initdb.c:2204
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale იგივე, რაც --locale=C\n"
+
+#: initdb.c:2205
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" ახალი ბაზებისთვის ენის ნაგულისხმები მიმწოდებლის "
+"დაყენება\n"
+
+#: initdb.c:2207
+#, c-format
+msgid ""
+" --pwfile=FILE read password for the new superuser from file\n"
+msgstr ""
+" --pwfile=FILE ახალი ზემომხმარებლის პაროლის ფაილიდან წაკითხვა\n"
+
+#: initdb.c:2208
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" ტექსტის ძებნის ნაგულისხმები კონფიგურაცია\n"
+
+#: initdb.c:2210
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=სახელი ბაზის ზემომხმარებლის სახელი\n"
+
+#: initdb.c:2211
+#, c-format
+msgid ""
+" -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt ზემომხმარებლის პაროლის კითხვა\n"
+
+#: initdb.c:2212
+#, c-format
+msgid ""
+" -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr ""
+" -X, --waldir=WALDIR წინასწარ ჩაწერადი ჟურნალის (WAL) საქაღალდის "
+"მდებარეობა\n"
+
+#: initdb.c:2213
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=ზომა WAL სეგმენტების ზომა, მეგაბაიტებში\n"
+
+#: initdb.c:2214
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"იშვიათად გამოყენებული პარამეტრები:\n"
+
+#: initdb.c:2215
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug გასამართი ინფორმაციის გენერაცია\n"
+
+#: initdb.c:2216
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches debug_discard_caches=1 დაყენება\n"
+
+#: initdb.c:2217
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L საქაღალდე შეყვანის ფაილების შემცველი საქაღალდე\n"
+
+#: initdb.c:2218
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean შეცდომის შემთხვევაში არ გაასუფთავო\n"
+
+#: initdb.c:2219
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync არ დაველოდო ცვლილებების დისკზე უსაფრთხოდ "
+"ჩაწერას\n"
+
+#: initdb.c:2220
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr ""
+" --no-instructions შემდეგი ნაბიჯის ინსტრუქციები ნაჩვენები არ "
+"იქნება\n"
+
+#: initdb.c:2221
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show შიდა პარამეტრების ჩვენება\n"
+
+#: initdb.c:2222
+#, c-format
+msgid ""
+" -S, --sync-only only sync database files to disk, then exit\n"
+msgstr ""
+" -S, --sync-only ბაზის ფაილების დისკზე სინქრონიზაცია და გასვლა\n"
+
+#: initdb.c:2223
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"სხვა პარამეტრები:\n"
+
+#: initdb.c:2224
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: initdb.c:2225
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: initdb.c:2226
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"თუ მონაცემების საქაღალდე მითითებული არაა, გამოყენებული იქნება \n"
+"გარემოს ცვლადი PGDATA.\n"
+
+#: initdb.c:2228
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდომების შესახებ მიწერეთ: %s\n"
+
+#: initdb.c:2229
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
+
+#: initdb.c:2257
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "ავთენტიკაციის მეთოდი (\"%s\") არასწორია \"%s\" შეერთებებისთვის"
+
+#: initdb.c:2271
+#, c-format
+msgid ""
+"must specify a password for the superuser to enable password authentication"
+msgstr ""
+"პაროლით ავთენტიკაციის ჩასართავად საჭიროა ზემომხმარებლის პაროლის მითითება"
+
+#: initdb.c:2290
+#, c-format
+msgid "no data directory specified"
+msgstr "მონაცემების საქაღალდე მითითებული არაა"
+
+#: initdb.c:2291
+#, c-format
+msgid ""
+"You must identify the directory where the data for this database system will "
+"reside. Do this with either the invocation option -D or the environment "
+"variable PGDATA."
+msgstr ""
+"უნდა დაადგინოთ საქაღლდე, სადაც ბაზის ამ სისტემის მონაცემები იქნება "
+"განთავსებული . გააკეთეთ ეს ან გამოძახების პარამეტრით -D ან გარემოს ცვლადით "
+"PGDATA."
+
+#: initdb.c:2308
+#, c-format
+msgid "could not set environment"
+msgstr "გარემოს დაყენების შეცდომა"
+
+#: initdb.c:2326
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr ""
+"პროგრამა \"%s\" სჭირდება \"%s\"-ს, მაგრამ იგივე საქაღალდეში, სადაც \"%s\", "
+"ნაპოვნი არაა"
+
+#: initdb.c:2329
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"პროგრამა „%s“ ნაპოვნია „%s“-ის მიერ, მაგრამ ვერსია, იგივეა არაა, რაც %s"
+
+#: initdb.c:2344
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "შეყვანის ფაილის მდებარეობა აბსტოლუტური ბილიკი უნდა იყოს"
+
+#: initdb.c:2361
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "ბაზის კლასტერის ინიციალიზაცია ენით \"%s\".\n"
+
+#: initdb.c:2364
+#, c-format
+msgid ""
+"The database cluster will be initialized with this locale configuration:\n"
+msgstr "ბაზის კლასტერის ინიციალიზაცია ენის ამ კონფიგურაციით მოხდება:\n"
+
+#: initdb.c:2365
+#, c-format
+msgid " provider: %s\n"
+msgstr " მომწოდებელი: %s\n"
+
+#: initdb.c:2367
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " ICU ენა: %s\n"
+
+#: initdb.c:2368
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2385
+#, c-format
+msgid "The default database encoding has been set to \"%s\".\n"
+msgstr "ბაზის ნაგულისხმები კოდირება „%s“-ზეა დაყენებული.\n"
+
+#: initdb.c:2397
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "ენისთვის (\"%s\") შესაბამისი კოდირება ვერ ვიპოვე"
+
+#: initdb.c:2399
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "გაუშვით %s თავიდან -E პარამეტრით."
+
+#: initdb.c:2400 initdb.c:3021 initdb.c:3041
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'."
+
+#: initdb.c:2412
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"ენის ნაგულისხმები „%s“ კოდირების დაყენება, სერვერის დასაშიფრად შეუძლებელია.\n"
+"სანაცვლოდ, ბაზის ნაგულისხმევი კოდირება დაყენდება „%s“.\n"
+
+#: initdb.c:2417
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "ენას (\"%s\") მხარდაუჭერელი კოდირება (\"%s\") სჭირდება"
+
+#: initdb.c:2419
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "%s სერვერის მხარეს კოდირება ვერ იქნება."
+
+#: initdb.c:2421
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "%s-ის თავიდან გაშვება ენის სხვა არჩევანით."
+
+#: initdb.c:2429
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "ბაზის ნაგულისხმები კოდირება შესაბამისად დაყენებულია „%s“-ზე.\n"
+
+#: initdb.c:2498
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr ""
+"ტექსტის ძებნის ენისთვის შესაფერისი კონფიგურაციის მოძებნა შეუძლებელია: \"%s\""
+
+#: initdb.c:2509
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "ტექსტის ძებნის ენისთვის შესაფერისი კონფიგურაცია არ არსებობს: \"%s\""
+
+#: initdb.c:2514
+#, c-format
+msgid ""
+"specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr ""
+"ტექსტის ძებნის მითითებული კონფიგურაცია \"%s\" ენას (\"%s\") არ ემთხვევა"
+
+#: initdb.c:2519
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "ტექსტის ძებნის ნაგულისხმები კონფიგურაცია \"%s\" იქნება.\n"
+
+#: initdb.c:2562 initdb.c:2633
+#, c-format
+msgid "creating directory %s ... "
+msgstr "საქაღალდის (\"%s\") შექმნა .... "
+
+#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "საქაღალდის (%s) შექმნის შეცდომა: %m"
+
+#: initdb.c:2576 initdb.c:2648
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "არსებულ საქაღალდეზე (\"%s\") წვდომების ჩასწორება ... "
+
+#: initdb.c:2581 initdb.c:2653
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "საქაღალდის წვდომების შეცვლა შეუძლებელია \"%s\": %m"
+
+#: initdb.c:2593 initdb.c:2665
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "საქაღალდე \"%s\" არსებობს, მაგრამ ცარიელი არაა"
+
+#: initdb.c:2597
+#, c-format
+msgid ""
+"If you want to create a new database system, either remove or empty the "
+"directory \"%s\" or run %s with an argument other than \"%s\"."
+msgstr ""
+"თუ გსურთ ბაზის ახალი სისტემის შექმნა, წაშალეთ ან დააცარიელეთ საქაღალდე, %s "
+"ან %s „%s“-ის გარდა არგუმენტით გაუშვით."
+
+#: initdb.c:2605 initdb.c:2675 initdb.c:3058
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "საქაღალდის (%s) წვდომის შეცდომა: %m"
+
+#: initdb.c:2626
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL საქაღალდის მდებარეობა აბსოლუტური ბილიკი უნდა იყოს"
+
+#: initdb.c:2669
+#, c-format
+msgid ""
+"If you want to store the WAL there, either remove or empty the directory \"%s"
+"\"."
+msgstr "თუ გსურთ WAL-ის იქ შენახვა, წაშალეთ ან დააცარიელეთ საქაღალდე „%s“."
+
+#: initdb.c:2680
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "სიმბმულის შექმნის შეცდომა %s: %m"
+
+#: initdb.c:2683
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "სიმბმულები ამ პლატფორმაზე მხარდაჭერილი არაა"
+
+#: initdb.c:2702
+#, c-format
+msgid ""
+"It contains a dot-prefixed/invisible file, perhaps due to it being a mount "
+"point."
+msgstr ""
+"ის შეიცავს წერტილით დაწყებულ/უხილავ ფაილს, შესაძლოა იმის გამო, რომ ის "
+"მიმაგრების წერტილია."
+
+#: initdb.c:2704
+#, c-format
+msgid ""
+"It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr ""
+"ის შეიცავს lost+found საქაღალდეს. ალბათ იმის გამო, რომ ის მიმაგრების "
+"წერტილია."
+
+#: initdb.c:2706
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"მიმაგრების წერტილის პირდაპირ მონაცემთა საქაღალდედ გამოყენება რეკომენდებული "
+"არაა.\n"
+"შექმენით ქვესაქაღალდე მიმაგრების წერტილის ქვეშ."
+
+#: initdb.c:2732
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "ქვესაქაღალდეების შექმნა ... "
+
+#: initdb.c:2775
+msgid "performing post-bootstrap initialization ... "
+msgstr "პირველადი მომზადების შემდგომი ინიციალიზაციის შესრულება ... "
+
+#: initdb.c:2940
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "გაშვებულია გამართვის რეჟიმში.\n"
+
+#: initdb.c:2944
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "გაშვებულია მოუწმენდავ რეჟიმში. შეცდომები არ გაიწმინდება.\n"
+
+#: initdb.c:3014
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "ენის უცნობი მომწოდებელი: %s"
+
+#: initdb.c:3039
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")"
+
+#: initdb.c:3046
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s ვერ იქნება მითითებული, თუ ენის მომწოდებლად „%s“ არ არის არჩეული"
+
+#: initdb.c:3060 initdb.c:3137
+msgid "syncing data to disk ... "
+msgstr "მონაცემების სინქრონიზაცია დისკზე ... "
+
+#: initdb.c:3068
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "პაროლის მოთხოვნისა და პაროლის ფაილის ერთდროულად მითითება შეუძებელია"
+
+#: initdb.c:3090
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segisze -ის არგუმენტი რიცხვი უნდა იყოს"
+
+#: initdb.c:3092
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "--wal-segsize -ის არგუმენტი 2-ის ხარისხი უნდა იყოს 1-1024 დიაპაზონიდან"
+
+#: initdb.c:3106
+#, c-format
+msgid ""
+"superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr ""
+"ზემომხმარებლის სახელი \"%s\" უარყოფილია. როლის სახელებია \"pg_\"-ით ვერ "
+"დაიწყება"
+
+#: initdb.c:3108
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"ამ მონაცემთა ბაზის სისტემის ფაილები მომხმარებლის \"%s\"-ის მფლობელობაშია.\n"
+"ეს მომხმარებელი სერვერის პროცესსაც უნდა ფლობდეს.\n"
+"\n"
+
+#: initdb.c:3124
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "მონაცემების გვერდის საკონტროლო ჯამები ჩართულია.\n"
+
+#: initdb.c:3126
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "მონაცემების გვერდის საკონტროლო ჯამები გამორთულია.\n"
+
+#: initdb.c:3143
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"დისკთან სინქრონიზაცია გამოტოვებულია.\n"
+"ოპერაციული სისტემის სიკვდილის შემთხვევაში მონაცემების საქაღალდე შეიძლება "
+"დაზიანდეს.\n"
+
+#: initdb.c:3148
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "ლოკალური შეერთებებისთვის \"trust\" ავთენტიკაციის ჩართვა"
+
+#: initdb.c:3149
+#, c-format
+msgid ""
+"You can change this by editing pg_hba.conf or using the option -A, or --auth-"
+"local and --auth-host, the next time you run initdb."
+msgstr ""
+"შეცვლა შეგიძლიათ pg_hba.conf-ის რედაქტირებით ან როცა შემდეგ ჯერზე გაუშვებთ "
+"initdb-ს, -A, ან --auth-local და --auth-host-ის გამოყენებით."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3179
+msgid "logfile"
+msgstr "ჟურნალის ფაილი"
+
+#: initdb.c:3181
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"წარმატება. ახლა ბაზის სერვერის შემდეგი ბრძანებით გაშვება შეგიძლიათ:\n"
+"\n"
+" %s\n"
+"\n"
diff --git a/src/bin/initdb/po/ko.po b/src/bin/initdb/po/ko.po
new file mode 100644
index 0000000..dc3c0de
--- /dev/null
+++ b/src/bin/initdb/po/ko.po
@@ -0,0 +1,1120 @@
+# Korean message translation file for PostgreSQL initdb
+# Ioseph Kim <ioseph@uri.sarang.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:49+0000\n"
+"PO-Revision-Date: 2023-04-06 11:29+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <kr@postgresql.org>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "상세정보: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "현재 디렉터리를 알 수 없음: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "\"%s\" 파일은 잘못된 바이너리 파일입니다"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "\"%s\" 바이너리 파일을 읽을 수 없음"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "\"%s\" 실행 파일을 찾을 수 없음"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "\"%s\" 이름의 디렉터리로 이동할 수 없습니다: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "\"%s\" 심볼릭 링크 파일을 읽을 수 없음: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 실패: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: initdb.c:334
+#, c-format
+msgid "out of memory"
+msgstr "메모리 부족"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null 포인터를 중복할 수 없음 (내부 오류)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" 파일의 상태값을 알 수 없음: %m"
+
+#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 열 수 없음: %m"
+
+#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 읽을 수 없음: %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파일을 열 수 없음: %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "\"%s\" 파일 fsync 실패: %m"
+
+#: ../../common/file_utils.c:383
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "\"%s\" 파일을 \"%s\" 파일로 이름을 바꿀 수 없음: %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 닫을 수 없음: %m"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "\"%s\" 라이브러리를 불러 올 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "이 운영체제에서 restricted token을 만들 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "프로세스 토큰을 열 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "SID를 할당할 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "제한된 토큰을 만들 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "\"%s\" 명령용 프로세스를 시작할 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "제한된 토큰으로 재실행할 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "하위 프로세스의 종료 코드를 구할 수 없음: 오류 코드 %lu"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "파일 또는 디렉터리 \"%s\"의 상태를 확인할 수 없음: %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "\"%s\" 파일 또는 디렉터리를 지울 수 없음: %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "%ld UID를 찾을 수 없음: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "사용자 없음"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "사용자 이름 찾기 실패: 오류 코드 %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "명령을 실행할 수 없음"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "해당 명령어 없음"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "하위 프로세스가 종료되었음, 종료 코드 %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "0x%X 예외로 하위 프로세스가 종료되었음."
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "하위 프로세스가 종료되었음, 시그널 %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "하위 프로세스가 종료되었음, 알수 없는 상태 %d"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "\"%s\" 파일의 연결을 설정할 수 없음: %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "\"%s\" 파일의 정션을 구할 수 없음: %s\n"
+
+#: initdb.c:464 initdb.c:1459
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "\"%s\" 파일 일기 모드로 열기 실패: %m"
+
+#: initdb.c:505 initdb.c:809 initdb.c:829
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "\"%s\" 파일 열기 실패: %m"
+
+#: initdb.c:509 initdb.c:812 initdb.c:831
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "\"%s\" 파일 쓰기 실패: %m"
+
+#: initdb.c:513
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "\"%s\" 파일을 닫을 수 없음: %m"
+
+#: initdb.c:529
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "\"%s\" 명령을 실행할 수 없음: %m"
+
+#: initdb.c:547
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "\"%s\" 데이터 디렉터리를 지우는 중"
+
+#: initdb.c:549
+#, c-format
+msgid "failed to remove data directory"
+msgstr "데이터 디렉터리를 지우는데 실패"
+
+#: initdb.c:553
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "\"%s\" 데이터 디렉터리 안의 내용을 지우는 중"
+
+#: initdb.c:556
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "데이터 디렉터리 내용을 지우는데 실패"
+
+#: initdb.c:561
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "\"%s\" WAL 디렉터리를 지우는 중"
+
+#: initdb.c:563
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "WAL 디렉터리를 지우는데 실패"
+
+#: initdb.c:567
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "\"%s\" WAL 디렉터리 안의 내용을 지우는 중"
+
+#: initdb.c:569
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "WAL 디렉터리 내용을 지우는데 실패"
+
+#: initdb.c:576
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "\"%s\" 데이터 디렉터리가 사용자의 요청으로 삭제되지 않았음"
+
+#: initdb.c:580
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "\"%s\" WAL 디렉터리가 사용자의 요청으로 삭제되지 않았음"
+
+#: initdb.c:598
+#, c-format
+msgid "cannot be run as root"
+msgstr "root 권한으로 실행할 수 없음"
+
+#: initdb.c:599
+#, c-format
+msgid ""
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will own "
+"the server process."
+msgstr ""
+"시스템관리자 권한이 없는, 서버프로세스의 소유주가 될 일반 사용자로 로그인 해"
+"서(\"su\" 같은 명령 이용) 실행하십시오."
+
+#: initdb.c:631
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" 인코딩은 서버 인코딩 이름을 사용할 수 없음"
+
+#: initdb.c:775
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "\"%s\" 파일 없음"
+
+#: initdb.c:776 initdb.c:781 initdb.c:788
+#, c-format
+msgid ""
+"This might mean you have a corrupted installation or identified the wrong "
+"directory with the invocation option -L."
+msgstr ""
+"설치가 잘못되었거나 -L 호출 옵션으로 지정한 디렉터리가 잘못되었을 수 있습니"
+"다."
+
+#: initdb.c:780
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "\"%s\" 파일에 액세스할 수 없음: %m"
+
+#: initdb.c:787
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "\"%s\" 파일은 일반 파일이 아님"
+
+#: initdb.c:922
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "사용할 동적 공유 메모리 관리방식을 선택하는 중 ... "
+
+#: initdb.c:931
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "max_connections 초기값을 선택하는 중 ..."
+
+#: initdb.c:962
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "기본 shared_buffers를 선택하는 중... "
+
+#: initdb.c:996
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "기본 지역 시간대를 선택 중 ... "
+
+#: initdb.c:1030
+msgid "creating configuration files ... "
+msgstr "환경설정 파일을 만드는 중 ..."
+
+#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "\"%s\" 접근 권한을 바꿀 수 없음: %m"
+
+#: initdb.c:1319
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "부트스트랩 스크립트 실행 중 ... "
+
+#: initdb.c:1331
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "\"%s\" 입력 파일이 PostgreSQL %s 용이 아님"
+
+#: initdb.c:1333
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "-L 옵션으로 바른 경로를 지정하십시오."
+
+#: initdb.c:1437
+msgid "Enter new superuser password: "
+msgstr "새 superuser 암호를 입력하십시오:"
+
+#: initdb.c:1438
+msgid "Enter it again: "
+msgstr "암호 확인:"
+
+#: initdb.c:1441
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "암호가 서로 틀립니다.\n"
+
+#: initdb.c:1465
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "\"%s\" 파일에서 암호를 읽을 수 없음: %m"
+
+#: initdb.c:1468
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "\"%s\" 패스워드 파일이 비어있음"
+
+#: initdb.c:1915
+#, c-format
+msgid "caught signal\n"
+msgstr "시스템의 간섭 신호(signal) 받았음\n"
+
+#: initdb.c:1921
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "하위 프로세스에 쓸 수 없음: %s\n"
+
+#: initdb.c:1929
+#, c-format
+msgid "ok\n"
+msgstr "완료\n"
+
+# # search5 끝
+# # advance 부분
+#: initdb.c:2018
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() 실패"
+
+#: initdb.c:2036
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "\"%s\" 옛 로케일을 복원할 수 없음"
+
+#: initdb.c:2043
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "\"%s\" 로케일 이름이 잘못됨"
+
+#: initdb.c:2054
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "잘못된 로케일 설정; LANG 또는 LC_* OS 환경 변수를 확인하세요"
+
+#: initdb.c:2080 initdb.c:2104
+#, c-format
+msgid "encoding mismatch"
+msgstr "인코딩 불일치"
+
+#: initdb.c:2081
+#, c-format
+msgid ""
+"The encoding you selected (%s) and the encoding that the selected locale "
+"uses (%s) do not match. This would lead to misbehavior in various character "
+"string processing functions."
+msgstr ""
+"선택한 인코딩(%s)과 선택한 로케일에서 사용하는 인코딩(%s)이 일치하지 않습니"
+"다. 이로 인해 여러 문자열 처리 함수에 오작동이 발생할 수 있습니다."
+
+#: initdb.c:2086 initdb.c:2107
+#, c-format
+msgid ""
+"Rerun %s and either do not specify an encoding explicitly, or choose a "
+"matching combination."
+msgstr ""
+"암묵적으로 지정된 인코딩이 마음에 들지 않으면 지정할 수 있는 인코딩을 지정해"
+"서 %s 작업을 다시 하세요."
+
+#: initdb.c:2105
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "지정한 %s 인코딩을 ICU 제공자가 지원하지 않습니다."
+
+#: initdb.c:2169
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "ICU 로케일을 지정해야 함"
+
+#: initdb.c:2176
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU 지원 기능을 뺀 채로 서버가 만들어졌습니다."
+
+#: initdb.c:2187
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL 데이터베이스 클러스터를 초기화 하는 프로그램.\n"
+"\n"
+
+#: initdb.c:2188
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: initdb.c:2189
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [옵션]... [DATADIR]\n"
+
+#: initdb.c:2190
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"옵션들:\n"
+
+#: initdb.c:2191
+#, c-format
+msgid ""
+" -A, --auth=METHOD default authentication method for local "
+"connections\n"
+msgstr " -A, --auth=METHOD 로컬 연결의 기본 인증 방법\n"
+
+#: initdb.c:2192
+#, c-format
+msgid ""
+" --auth-host=METHOD default authentication method for local TCP/IP "
+"connections\n"
+msgstr " --auth-host=METHOD local TCP/IP 연결에 대한 기본 인증 방법\n"
+
+#: initdb.c:2193
+#, c-format
+msgid ""
+" --auth-local=METHOD default authentication method for local-socket "
+"connections\n"
+msgstr " --auth-local=METHOD local-socket 연결에 대한 기본 인증 방법\n"
+
+#: initdb.c:2194
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATADIR 새 데이터베이스 클러스터를 만들 디렉터리\n"
+
+#: initdb.c:2195
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=ENCODING 새 데이터베이스의 기본 인코딩\n"
+
+#: initdb.c:2196
+#, c-format
+msgid ""
+" -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr ""
+" -g, --allow-group-access 데이터 디렉터리를 그룹이 읽고 접근할 있게 함\n"
+
+#: initdb.c:2197
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOCALE 새 데이터베이스의 ICU 로케일 ID 지정\n"
+
+#: initdb.c:2198
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums 자료 페이지 체크섬 사용\n"
+
+#: initdb.c:2199
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE 새 데이터베이스의 기본 로케일 설정\n"
+
+#: initdb.c:2200
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category "
+"for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" 새 데이터베이스의 각 범주에 기본 로케일 설정\n"
+" (환경에서 가져온 기본 값)\n"
+
+#: initdb.c:2204
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale -locale=C와 같음\n"
+
+#: initdb.c:2205
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" 새 데이터베이스의 로케일 제공자 지정\n"
+
+#: initdb.c:2207
+#, c-format
+msgid ""
+" --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=FILE 파일에서 새 superuser의 암호 읽기\n"
+
+#: initdb.c:2208
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" 기본 텍스트 검색 구성\n"
+
+#: initdb.c:2210
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAME 데이터베이스 superuser 이름\n"
+
+#: initdb.c:2211
+#, c-format
+msgid ""
+" -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt 새 superuser 암호를 입력 받음\n"
+
+#: initdb.c:2212
+#, c-format
+msgid ""
+" -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR 트랜잭션 로그 디렉터리 위치\n"
+
+#: initdb.c:2213
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE WAL 조각 파일 크기, MB단위\n"
+
+#: initdb.c:2214
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"덜 일반적으로 사용되는 옵션들:\n"
+
+#: initdb.c:2215
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug 디버깅에 필요한 정보들도 함께 출력함\n"
+
+#: initdb.c:2216
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches debug_discard_caches=1 지정\n"
+
+#: initdb.c:2217
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORY 입력파일들이 있는 디렉터리\n"
+
+#: initdb.c:2218
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean 오류가 발생되었을 경우 그대로 둠\n"
+
+#: initdb.c:2219
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync 작업 완료 뒤 디스크 동기화 작업을 하지 않음\n"
+
+#: initdb.c:2220
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions 다음 작업을 위해 구성 정보를 출력 안함\n"
+
+#: initdb.c:2221
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show 내부 설정값들을 보여줌\n"
+
+#: initdb.c:2222
+#, c-format
+msgid ""
+" -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only 데이터 디렉터리만 동기화하고 마침\n"
+
+#: initdb.c:2223
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"기타 옵션:\n"
+
+#: initdb.c:2224
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: initdb.c:2225
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: initdb.c:2226
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"데이터 디렉터리를 지정하지 않으면, PGDATA 환경 변수값을 사용합니다.\n"
+
+#: initdb.c:2228
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"문제점 보고 주소: <%s>\n"
+
+#: initdb.c:2229
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: initdb.c:2257
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "\"%s\" 인증 방법은 \"%s\" 연결에서는 사용할 수 없음"
+
+#: initdb.c:2271
+#, c-format
+msgid ""
+"must specify a password for the superuser to enable password authentication"
+msgstr "비밀번호 인증방식을 사용하려면, 반드시 superuser의 암호를 지정해야함"
+
+#: initdb.c:2290
+#, c-format
+msgid "no data directory specified"
+msgstr "데이터 디렉터리를 지정하지 않았음"
+
+#: initdb.c:2291
+#, c-format
+msgid ""
+"You must identify the directory where the data for this database system will "
+"reside. Do this with either the invocation option -D or the environment "
+"variable PGDATA."
+msgstr ""
+"이 작업을 진행하려면, 반드시 이 데이터 디렉터리를 지정해 주어야합니다. 지정하"
+"는 방법은 -D 옵션의 값이나, PGDATA 환경 변수값으로 지정해 주면 됩니 다."
+
+#: initdb.c:2308
+#, c-format
+msgid "could not set environment"
+msgstr "환경 변수를 지정할 수 없음"
+
+#: initdb.c:2326
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr ""
+"\"%s\" 프로그램이 %s 작업에서 필요합니다. 그런데, 이 파일이 \"%s\" 파일이 있"
+"는 디렉터리안에 없습니다."
+
+#: initdb.c:2329
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"\"%s\" 프로그램을 \"%s\" 작업 때문에 찾았지만 이 파일은 %s 프로그램의 버전과 "
+"다릅니다."
+
+#: initdb.c:2344
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "입력 파일 위치는 반드시 절대경로여야함"
+
+#: initdb.c:2361
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "데이터베이스 클러스터는 \"%s\" 로케일으로 초기화될 것입니다.\n"
+
+#: initdb.c:2364
+#, c-format
+msgid ""
+"The database cluster will be initialized with this locale configuration:\n"
+msgstr "데이터베이스 클러스터는 아래 로케일 환경으로 초기화될 것입니다:\n"
+
+#: initdb.c:2365
+#, c-format
+msgid " provider: %s\n"
+msgstr " 제공자: %s\n"
+
+#: initdb.c:2367
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " ICU 로케일: %s\n"
+
+#: initdb.c:2368
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2385
+#, c-format
+msgid "The default database encoding has been set to \"%s\".\n"
+msgstr "기본 데이터베이스는 \"%s\" 인코딩으로 설정되었습니다.\n"
+
+#: initdb.c:2397
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "\"%s\" 로케일에 알맞은 인코딩을 찾을 수 없음"
+
+#: initdb.c:2399
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "-E 옵션 지정해서 %s 작업을 다시 하세요."
+
+#: initdb.c:2400 initdb.c:3021 initdb.c:3041
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "자세한 사항은 \"%s --help\" 명령으로 살펴보세요."
+
+#: initdb.c:2412
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"\"%s\" 인코딩을 서버측 인코딩으로 사용할 수 없습니다.\n"
+"기본 데이터베이스는 \"%s\" 인코딩으로 지정됩니다.\n"
+
+#: initdb.c:2417
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "\"%s\" 로케일은 지원하지 않는 \"%s\" 인코딩을 필요로 함"
+
+#: initdb.c:2419
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "\"%s\" 인코딩을 서버측 인코딩으로 사용할 수 없습니다."
+
+#: initdb.c:2421
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "다른 로케일을 지정해서 %s 작업을 다시 하세요."
+
+#: initdb.c:2429
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "기본 데이터베이스 인코딩은 \"%s\" 인코딩으로 설정되었습니다.\n"
+
+#: initdb.c:2498
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "\"%s\" 로케일에 알맞은 전문검색 설정을 찾을 수 없음"
+
+#: initdb.c:2509
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "\"%s\" 로케일에 알맞은 전문검색 설정을 알 수 없음"
+
+#: initdb.c:2514
+#, c-format
+msgid ""
+"specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "지정한 \"%s\" 전문검색 설정은 \"%s\" 로케일과 일치하지 않음"
+
+#: initdb.c:2519
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "기본 텍스트 검색 구성이 \"%s\"(으)로 설정됩니다.\n"
+
+#: initdb.c:2562 initdb.c:2633
+#, c-format
+msgid "creating directory %s ... "
+msgstr "%s 디렉터리 만드는 중 ..."
+
+#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 만들 수 없음: %m"
+
+#: initdb.c:2576 initdb.c:2648
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "이미 있는 %s 디렉터리의 액세스 권한을 고치는 중 ..."
+
+#: initdb.c:2581 initdb.c:2653
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리의 액세스 권한을 바꿀 수 없습니다: %m"
+
+#: initdb.c:2593 initdb.c:2665
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "\"%s\" 디렉터리가 있지만 비어 있지 않음"
+
+#: initdb.c:2597
+#, c-format
+msgid ""
+"If you want to create a new database system, either remove or empty the "
+"directory \"%s\" or run %s with an argument other than \"%s\"."
+msgstr ""
+"새로운 데이터베이스 시스템을 만들려면 \"%s\" 디렉터리를 제거하거나 비우십시"
+"오. 또는 %s 작업을 \"%s\" 디렉터리가 아닌 것으로 지정해서 하세요."
+
+#: initdb.c:2605 initdb.c:2675 initdb.c:3058
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 액세스할 수 없습니다: %m"
+
+#: initdb.c:2626
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL 디렉터리 위치는 절대 경로여야 함"
+
+#: initdb.c:2669
+#, c-format
+msgid ""
+"If you want to store the WAL there, either remove or empty the directory \"%s"
+"\"."
+msgstr ""
+"트랜잭션 로그를 해당 위치에 저장하려면 \"%s\" 디렉터리를 제거하거나 비우십시"
+"오."
+
+#: initdb.c:2680
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "\"%s\" 심벌릭 링크를 만들 수 없음: %m"
+
+#: initdb.c:2683
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "이 플랫폼에서는 심볼 링크가 지원되지 않음"
+
+#: initdb.c:2702
+#, c-format
+msgid ""
+"It contains a dot-prefixed/invisible file, perhaps due to it being a mount "
+"point."
+msgstr ""
+"점(.)으로 시작하는 숨은 파일이 포함되어 있습니다. 마운트 최상위 디렉터리 같습"
+"니다."
+
+#: initdb.c:2704
+#, c-format
+msgid ""
+"It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "lost-found 디렉터리가 있습니다. 마운트 최상위 디렉터리 같습니다."
+
+#: initdb.c:2706
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"마운트 최상위 디렉터리를 데이터 디렉터리로 사용하는 것은 권장하지 않습니다.\n"
+"하위 디렉터리를 만들어서 그것을 데이터 디렉터리로 사용하세요."
+
+#: initdb.c:2732
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "하위 디렉터리 만드는 중 ..."
+
+#: initdb.c:2775
+msgid "performing post-bootstrap initialization ... "
+msgstr "부트스트랩 다음 초기화 작업 중 ... "
+
+#: initdb.c:2940
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "디버그 모드로 실행 중.\n"
+
+#: initdb.c:2944
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "지저분 모드로 실행 중. 오류가 발생되어도 뒷정리를 안합니다.\n"
+
+#: initdb.c:3014
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "알 수 없는 로케일 제공자 이름: %s"
+
+#: initdb.c:3039
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 많은 명령행 인자를 지정했습니다. (처음 \"%s\")"
+
+#: initdb.c:3046
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s 옵션은 \"%s\" 로케일 제공자를 사용할 때만 사용할 수 있습니다."
+
+#: initdb.c:3060 initdb.c:3137
+msgid "syncing data to disk ... "
+msgstr "자료를 디스크에 동기화 하는 중 ... "
+
+#: initdb.c:3068
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr ""
+"암호를 입력받는 옵션과 암호를 파일에서 가져오는 옵션은 동시에 사용될 수 없음"
+
+#: initdb.c:3090
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segsize 옵션 값은 숫자여야 함"
+
+#: initdb.c:3092
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "--wal-segsize 옵션값은 1에서 1024사이 2^n 값이여야 함"
+
+#: initdb.c:3106
+#, c-format
+msgid ""
+"superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr ""
+"\"%s\" 사용자는 슈퍼유저 이름으로 쓸 수 없습니다. \"pg_\"로 시작하는롤 이름"
+"은 허용하지 않음"
+
+#: initdb.c:3108
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"이 데이터베이스 시스템에서 만들어지는 파일들은 그 소유주가 \"%s\" id로\n"
+"지정될 것입니다. 또한 이 사용자는 서버 프로세스의 소유주가 됩니다.\n"
+"\n"
+
+#: initdb.c:3124
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "자료 페이지 체크섬 기능 사용함.\n"
+
+#: initdb.c:3126
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "자료 페이지 체크섬 기능 사용 하지 않음\n"
+
+#: initdb.c:3143
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"디스크 동기화 작업은 생략했습니다.\n"
+"이 상태에서 OS가 갑자기 중지 되면 데이터 디렉토리 안에 있는 자료가 깨질 수 있"
+"습니다.\n"
+
+#: initdb.c:3148
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "로컬 접속용 \"trust\" 인증을 설정 함"
+
+#: initdb.c:3149
+#, c-format
+msgid ""
+"You can change this by editing pg_hba.conf or using the option -A, or --auth-"
+"local and --auth-host, the next time you run initdb."
+msgstr ""
+"이 값을 바꾸려면, pg_hba.conf 파일을 수정하든지, 다음번 initdb 명령을 사용할 "
+"때, -A 옵션 또는 --auth-local, --auth-host 옵션을 사용해서 initdb 작업을 하세"
+"요."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3179
+msgid "logfile"
+msgstr "로그파일"
+
+#: initdb.c:3181
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"작업완료. 이제 다음 명령을 이용해서 서버를 가동 할 수 있습니다:\n"
+"\n"
+" %s\n"
+"\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "보다 자세한 정보를 보려면 \"%s --help\" 옵션을 사용하십시오.\n"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "심각: "
+
+#, c-format
+#~ msgid "pclose failed: %m"
+#~ msgstr "pclose 실패: %m"
diff --git a/src/bin/initdb/po/pt_BR.po b/src/bin/initdb/po/pt_BR.po
new file mode 100644
index 0000000..acb4cbb
--- /dev/null
+++ b/src/bin/initdb/po/pt_BR.po
@@ -0,0 +1,1040 @@
+# Brazilian Portuguese message translation file for initdb
+#
+# Copyright (C) 2003-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Euler Taveira <euler@eulerto.com>, 2003-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-27 13:15-0300\n"
+"PO-Revision-Date: 2010-09-25 00:45-0300\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erro: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "aviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalhe: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "dica: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "não pôde identificar diretório atual: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binário \"%s\" é inválido"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "não pôde ler o binário \"%s\""
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "não pôde encontrar o \"%s\" para executá-lo"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "não pôde mudar diretório para \"%s\": %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "não pôde ler link simbólico \"%s\": %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falhou: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: initdb.c:334
+#, c-format
+msgid "out of memory"
+msgstr "sem memória"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "sem memória\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "não pode duplicar ponteiro nulo (erro interno)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "não pôde executar stat no arquivo \"%s\": %m"
+
+#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "não pôde abrir diretório \"%s\": %m"
+
+#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "não pôde ler diretório \"%s\": %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "não pôde abrir arquivo \"%s\": %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "não pôde executar fsync no arquivo \"%s\": %m"
+
+#: ../../common/file_utils.c:383
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "não pôde renomear arquivo \"%s\" para \"%s\": %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "não pôde fechar diretório \"%s\": %m"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "não pôde carregar biblioteca \"%s\": código de erro %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "não pode criar informações restritas nessa plataforma: código de erro %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "não pôde abrir informação sobre processo: código de erro %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "não pôde alocar SIDs: código de erro %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "não pôde criar informação restrita: código de erro %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "não pôde iniciar processo para comando \"%s\": código de erro %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "não pôde executar novamente com informação restrita: código de erro %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "não pôde obter código de saída de subprocesso: código de erro %lu"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "não pôde executar stat no arquivo ou diretório \"%s\": %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "não pôde remover arquivo ou diretório \"%s\": %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "não pôde encontrar ID de usuário efetivo %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "usuário não existe"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "falhou ao pesquisar nome de usuário: código de erro %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "comando não é executável"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "comando não encontrado"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "processo filho terminou com código de saída %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "processo filho foi terminado pela exceção 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "processo filho foi terminado pelo sinal %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "processo filho terminou com status desconhecido %d"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "não pôde definir junção para \"%s\": %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "não pôde obter junção para \"%s\": %s\n"
+
+#: initdb.c:464 initdb.c:1459
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "não pôde abrir arquivo \"%s\" para leitura: %m"
+
+#: initdb.c:505 initdb.c:809 initdb.c:829
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "não pôde abrir arquivo \"%s\" para escrita: %m"
+
+#: initdb.c:509 initdb.c:812 initdb.c:831
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "não pôde escrever no arquivo \"%s\": %m"
+
+#: initdb.c:513
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "não pôde fechar arquivo \"%s\": %m"
+
+#: initdb.c:529
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "não pôde executar comando \"%s\": %m"
+
+#: initdb.c:547
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "removendo diretório de dados \"%s\""
+
+#: initdb.c:549
+#, c-format
+msgid "failed to remove data directory"
+msgstr "falhou ao remover diretório de dados"
+
+#: initdb.c:553
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "removendo conteúdo do diretório de dados \"%s\""
+
+#: initdb.c:556
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "falhou ao remover conteúdo do diretório de dados"
+
+#: initdb.c:561
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "removendo diretório do WAL \"%s\""
+
+#: initdb.c:563
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "falhou ao remover diretório do WAL"
+
+#: initdb.c:567
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "removendo conteúdo do diretório do WAL \"%s\""
+
+#: initdb.c:569
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "falhou ao remover conteúdo do diretório do WAL"
+
+#: initdb.c:576
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "diretório de dados \"%s\" não foi removido a pedido do usuário"
+
+#: initdb.c:580
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "diretório do WAL \"%s\" não foi removido a pedido do usuário"
+
+#: initdb.c:598
+#, c-format
+msgid "cannot be run as root"
+msgstr "não pode ser executado como root"
+
+#: initdb.c:599
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "Por favor entre (utilizando, e.g., \"su\") como usuário (sem privilégios) que será o dono do processo do servidor."
+
+#: initdb.c:631
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" não é um nome de codificação do servidor válido"
+
+#: initdb.c:775
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "arquivo \"%s\" não existe"
+
+#: initdb.c:776 initdb.c:781 initdb.c:788
+#, c-format
+msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."
+msgstr "Isso significa que você tem uma instalação corrompida ou especificou o diretório errado com a invocação da opção -L."
+
+#: initdb.c:780
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "não pôde acessar arquivo \"%s\": %m"
+
+#: initdb.c:787
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "arquivo \"%s\" não é um arquivo regular"
+
+#: initdb.c:922
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "selecionando implementação de memória compartilhada dinâmica ... "
+
+#: initdb.c:931
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "selecionando max_connections padrão ... "
+
+#: initdb.c:962
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "selecionando shared_buffers padrão ... "
+
+#: initdb.c:996
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "selecionando fuso horário padrão ... "
+
+#: initdb.c:1030
+msgid "creating configuration files ... "
+msgstr "criando arquivos de configuração ... "
+
+#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "não pôde mudar permissões de \"%s\": %m"
+
+#: initdb.c:1319
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "executando script de inicialização ... "
+
+#: initdb.c:1331
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "arquivo de entrada \"%s\" não pertence ao PostgreSQL %s"
+
+#: initdb.c:1333
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Especifique o caminho correto utilizando a opção -L."
+
+#: initdb.c:1437
+msgid "Enter new superuser password: "
+msgstr "Digite nova senha de super-usuário: "
+
+#: initdb.c:1438
+msgid "Enter it again: "
+msgstr "Digite-a novamente: "
+
+#: initdb.c:1441
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Senhas não correspondem.\n"
+
+#: initdb.c:1465
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "não pôde ler senha do arquivo \"%s\": %m"
+
+#: initdb.c:1468
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "arquivo de senhas \"%s\" está vazio"
+
+#: initdb.c:1915
+#, c-format
+msgid "caught signal\n"
+msgstr "sinal foi recebido\n"
+
+#: initdb.c:1921
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "não pôde escrever em processo filho: %s\n"
+
+#: initdb.c:1929
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2018
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() falhou"
+
+#: initdb.c:2036
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "falhou ao restaurar configuração regional antiga \"%s\""
+
+#: initdb.c:2043
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "nome de configuração regional \"%s\" é inválido"
+
+#: initdb.c:2054
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "definições de configuração regional inválidas; verifique as variáveis de ambiente LANG e LC_*"
+
+#: initdb.c:2080 initdb.c:2104
+#, c-format
+msgid "encoding mismatch"
+msgstr "codificação não corresponde"
+
+#: initdb.c:2081
+#, c-format
+msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions."
+msgstr "A codificação que você escolheu (%s) e a codificação que a configuração regional selecionada utiliza (%s) não tem correspondência. Isto pode conduzir a um comportamento inesperado em funções de processamento de cadeia de caracteres."
+
+#: initdb.c:2086 initdb.c:2107
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "Execute %s novamente e não especifique uma codificação explicitamente ou escolha uma outra combinação."
+
+#: initdb.c:2105
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "A codificação que você selecionou (%s) não é suportada com o provedor ICU."
+
+#: initdb.c:2169
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "configuração regional ICU deve ser especificado"
+
+#: initdb.c:2176
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU não é suportado por essa construção"
+
+#: initdb.c:2187
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s inicializa um agrupamento de banco de dados PostgreSQL.\n"
+"\n"
+
+#: initdb.c:2188
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: initdb.c:2189
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPÇÃO]... [DIRDADOS]\n"
+
+#: initdb.c:2190
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opções:\n"
+
+#: initdb.c:2191
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=MÉTODO método de autenticação padrão para conexões locais\n"
+
+#: initdb.c:2192
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=MÉTODO método de autenticação padrão para conexões TCP/IP locais\n"
+
+#: initdb.c:2193
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=MÉTODO método de autenticação padrão para conexões de soquete locais\n"
+
+#: initdb.c:2194
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DIRDADOS local do agrupamento de banco de dados\n"
+
+#: initdb.c:2195
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=CODIFICAÇÃO ajusta a codificação padrão para novos bancos de dados\n"
+
+#: initdb.c:2196
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access permite leitura/execução do grupo no diretório de dados\n"
+
+#: initdb.c:2197
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOCALE ajusta ID de configuração regional ICU para novos bancos de dados\n"
+
+#: initdb.c:2198
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums verificações de páginas de dados\n"
+
+#: initdb.c:2199
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE ajusta configuração regional padrão para novos bancos de dados\n"
+
+#: initdb.c:2200
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate, --lc-ctype, --lc-messages=LOCALE\n"
+" --lc-monetary, --lc-numeric, --lc-time=LOCALE\n"
+" ajusta configuração regional padrão na respectiva categoria\n"
+" para novos bancos de dados (o ambiente é assumido como padrão)\n"
+
+#: initdb.c:2204
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale equivalente a --locale=C\n"
+
+#: initdb.c:2205
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" ajusta provedor de configuração regional padrão para novos bancos de dados\n"
+
+#: initdb.c:2207
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=ARQUIVO lê senha do novo super-usuário a partir do arquivo\n"
+
+#: initdb.c:2208
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" configuração de busca textual padrão\n"
+
+#: initdb.c:2210
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NOME nome do super-usuário do banco de dados\n"
+
+#: initdb.c:2211
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt pergunta senha do novo super-usuário\n"
+
+#: initdb.c:2212
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=DIRWAL local do diretório do log de transação\n"
+
+#: initdb.c:2213
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=TAMANHO tamanho dos segmentos do WAL, em megabytes\n"
+
+#: initdb.c:2214
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Opções utilizadas com menos frequência:\n"
+
+#: initdb.c:2215
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug mostra saída da depuração\n"
+
+#: initdb.c:2216
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches define debug_discard_caches=1\n"
+
+#: initdb.c:2217
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRETÓRIO onde encontrar os arquivos de entrada\n"
+
+#: initdb.c:2218
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean não remove após erros\n"
+
+#: initdb.c:2219
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync não espera mudanças serem escritas com segurança no disco\n"
+
+#: initdb.c:2220
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions não mostra instruções para próximos passos\n"
+
+#: initdb.c:2221
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show mostra definições internas\n"
+
+#: initdb.c:2222
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only sincroniza somente os arquivos de banco de dados no disco e termina\n"
+
+#: initdb.c:2223
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Outras opções:\n"
+
+#: initdb.c:2224
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: initdb.c:2225
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: initdb.c:2226
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Se o diretório de dados não for especificado, a variável de ambiente PGDATA\n"
+"é utilizada.\n"
+
+#: initdb.c:2228
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Relate erros a <%s>.\n"
+
+#: initdb.c:2229
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "página web do %s: <%s>\n"
+
+#: initdb.c:2257
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "método de autenticação \"%s\" é inválido para conexões \"%s\""
+
+#: initdb.c:2271
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "você precisa especificar uma senha para o super-usuário para habilitar a autenticação password"
+
+#: initdb.c:2290
+#, c-format
+msgid "no data directory specified"
+msgstr "nenhum diretório de dados foi especificado"
+
+#: initdb.c:2291
+#, c-format
+msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA."
+msgstr "Você deve identificar o diretório onde os dados para esse sistema de banco de dados irá residir. Faça isso especificando a opção -D ou definindo a variável de ambiente PGDATA."
+
+#: initdb.c:2308
+#, c-format
+msgid "could not set environment"
+msgstr "não pôde definir variável de ambiente"
+
+#: initdb.c:2326
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "O programa \"%s\" é requerido pelo %s mas não foi encontrado no mesmo diretório que \"%s\""
+
+#: initdb.c:2329
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "O programa \"%s\" foi encontrado pelo \"%s\" mas não tem a mesma versão que %s"
+
+#: initdb.c:2344
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "local do arquivo de entrada deve ser um caminho absoluto"
+
+#: initdb.c:2361
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "O agrupamento de banco de dados será inicializado com configuração regional \"%s\".\n"
+
+#: initdb.c:2364
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "O agrupamento de banco de dados será inicializado com essa configuração regional:\n"
+
+#: initdb.c:2365
+#, c-format
+msgid " provider: %s\n"
+msgstr " provedor: %s\n"
+
+#: initdb.c:2367
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " configuração regional ICU: %s\n"
+
+#: initdb.c:2368
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2385
+#, c-format
+msgid "The default database encoding has been set to \"%s\".\n"
+msgstr "A codificação padrão do banco de dados foi definida para \"%s\".\n"
+
+#: initdb.c:2397
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "não pôde encontrar codificação ideal para configuração regional \"%s\""
+
+#: initdb.c:2399
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "Execute novamente %s com a opção -E."
+
+#: initdb.c:2400 initdb.c:3021 initdb.c:3041
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Tente \"%s --help\" para obter informações adicionais."
+
+#: initdb.c:2412
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"Codificação \"%s\" sugerida pela configuração regional não é permitida como uma codificação do servidor.\n"
+"A codificação do banco de dados padrão será definida como \"%s\".\n"
+
+#: initdb.c:2417
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "configuração regional \"%s\" requer codificação \"%s\" que não é suportada"
+
+#: initdb.c:2419
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "Codificação \"%s\" não é permitida como uma codificação do servidor."
+
+#: initdb.c:2421
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "Execute novamente %s com uma seleção de configuração regional diferente."
+
+#: initdb.c:2429
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "A codificação padrão do banco de dados foi definida para \"%s\".\n"
+
+#: initdb.c:2498
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "não pôde encontrar configuração de busca textual ideal para configuração regional \"%s\""
+
+#: initdb.c:2509
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "configuração de busca textual ideal para configuração regional \"%s\" é desconhecida"
+
+#: initdb.c:2514
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "configuração de busca textual especificada \"%s\" pode não corresponder a configuração regional \"%s\""
+
+#: initdb.c:2519
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "A configuração de busca textual padrão será definida como \"%s\".\n"
+
+#: initdb.c:2562 initdb.c:2633
+#, c-format
+msgid "creating directory %s ... "
+msgstr "criando diretório %s ... "
+
+#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "não pôde criar diretório \"%s\": %m"
+
+#: initdb.c:2576 initdb.c:2648
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "alterando permissões no diretório existente %s ... "
+
+#: initdb.c:2581 initdb.c:2653
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "não pôde mudar permissões do diretório \"%s\": %m"
+
+#: initdb.c:2593 initdb.c:2665
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "diretório \"%s\" existe mas não está vazio"
+
+#: initdb.c:2597
+#, c-format
+msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"."
+msgstr "Se você quer criar um novo sistema de banco de dados, remova ou esvazie o diretório \"%s\" ou execute %s com um argumento ao invés de \"%s\"."
+
+#: initdb.c:2605 initdb.c:2675 initdb.c:3058
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "não pôde acessar diretório \"%s\": %m"
+
+#: initdb.c:2626
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "local do diretório do WAL deve ser um caminho absoluto"
+
+#: initdb.c:2669
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "Se você quer armazenar o WAL no mesmo, remova ou esvazie o diretório \"%s\"."
+
+#: initdb.c:2680
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "não pôde criar link simbólico \"%s\": %m"
+
+#: initdb.c:2683
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "links simbólicos não são suportados nesta plataforma"
+
+#: initdb.c:2702
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "Ele contém um arquivo iniciado por ponto/invisível, talvez por ser um ponto de montagem."
+
+#: initdb.c:2704
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Ele contém um diretório lost+found, talvez por ser um ponto de montagem."
+
+#: initdb.c:2706
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"Utilizar um ponto de montagem diretamente como diretório de dados não é recomendado.\n"
+"Crie um subdiretório no ponto de montagem."
+
+#: initdb.c:2732
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "criando subdiretórios ... "
+
+#: initdb.c:2775
+msgid "performing post-bootstrap initialization ... "
+msgstr "executando pós-inicialização ... "
+
+#: initdb.c:2940
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Executando no modo de depuração.\n"
+
+#: initdb.c:2944
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "Executando no modo sem limpeza. Erros não serão removidos.\n"
+
+#: initdb.c:3014
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "provedor de configuração regional é desconhecido: %s"
+
+#: initdb.c:3039
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "muitos argumentos de linha de comando (primeiro é \"%s\")"
+
+#: initdb.c:3046
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s não pode ser especificado a não ser que o provedor de configuração regional \"%s\" seja escolhido"
+
+#: initdb.c:3060 initdb.c:3137
+msgid "syncing data to disk ... "
+msgstr "sincronizando dados no disco ... "
+
+#: initdb.c:3068
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "opção para perguntar a senha e um arquivo de senhas não podem ser especificados juntos"
+
+#: initdb.c:3090
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "argumento de --wal-segsize deve ser um número"
+
+#: initdb.c:3092
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "argumento de --wal-segsize deve ser uma potência de 2 entre 1 e 1024"
+
+#: initdb.c:3106
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "nome de super-usuário \"%s\" não é permitido; nomes de roles não podem começar com \"pg_\""
+
+#: initdb.c:3108
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Os arquivos deste sistema de banco de dados pertencerão ao usuário \"%s\".\n"
+"Esse usuário deve ser o dono do processo do servidor também.\n"
+"\n"
+
+#: initdb.c:3124
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Verificações de páginas de dados estão habilitadas.\n"
+
+#: initdb.c:3126
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Verificações de páginas de dados estão desabilitadas.\n"
+
+#: initdb.c:3143
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Sincronização com o disco foi ignorada.\n"
+"O diretório de dados pode ser danificado se houver uma queda do sistema operacional.\n"
+
+#: initdb.c:3148
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "habilitando autenticação \"trust\" para conexões locais"
+
+#: initdb.c:3149
+#, c-format
+msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb."
+msgstr "Você pode mudá-lo editando o pg_hba.conf ou utilizando a opção -A, ou --auth-local e --auth-host, na próxima vez que você executar o initdb."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3179
+msgid "logfile"
+msgstr "arquivolog"
+
+#: initdb.c:3181
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Sucesso. Você pode iniciar o servidor de banco de dados utilizando:\n"
+"\n"
+" %s\n"
+"\n"
diff --git a/src/bin/initdb/po/ru.po b/src/bin/initdb/po/ru.po
new file mode 100644
index 0000000..047d2d8
--- /dev/null
+++ b/src/bin/initdb/po/ru.po
@@ -0,0 +1,1240 @@
+# Russian message translation file for initdb
+# Copyright (C) 2004-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Serguei A. Mokhov <mokhov@cs.concordia.ca>, 2004-2005.
+# Oleg Bartunov <oleg@sai.msu.su>, 2004.
+# Sergey Burladyan <eshkinkot@gmail.com>, 2009.
+# Andrey Sudnik <sudnikand@yandex.ru>, 2010.
+# Dmitriy Olshevskiy <olshevskiy87@bk.ru>, 2014.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-29 10:17+0300\n"
+"PO-Revision-Date: 2022-09-29 11:39+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробности: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подсказка: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "не удалось определить текущий каталог: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "неверный исполняемый файл \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "не удалось прочитать исполняемый файл \"%s\""
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "не удалось найти запускаемый файл \"%s\""
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "не удалось перейти в каталог \"%s\": %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "не удалось прочитать символическую ссылку \"%s\": %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "ошибка в %s(): %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: initdb.c:334
+#, c-format
+msgid "out of memory"
+msgstr "нехватка памяти"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памяти\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не удалось получить информацию о файле \"%s\": %m"
+
+#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не удалось открыть каталог \"%s\": %m"
+
+#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не удалось прочитать каталог \"%s\": %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалось открыть файл \"%s\": %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "не удалось синхронизировать с ФС файл \"%s\": %m"
+
+#: ../../common/file_utils.c:383
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "не удалось переименовать файл \"%s\" в \"%s\": %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не удалось закрыть каталог \"%s\": %m"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "не удалось загрузить библиотеку \"%s\" (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "в этой ОС нельзя создавать ограниченные маркеры (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "не удалось открыть маркер процесса (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "не удалось подготовить структуры SID (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "не удалось создать ограниченный маркер (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "не удалось запустить процесс для команды \"%s\" (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "не удалось перезапуститься с ограниченным маркером (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "не удалось получить код выхода от подпроцесса (код ошибки: %lu)"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "не удалось получить информацию о файле или каталоге \"%s\": %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "ошибка при удалении файла или каталога \"%s\": %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "выяснить эффективный идентификатор пользователя (%ld) не удалось: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "пользователь не существует"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "распознать имя пользователя не удалось (код ошибки: %lu)"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "неисполняемая команда"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "команда не найдена"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "дочерний процесс завершился с кодом возврата %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "дочерний процесс прерван исключением 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "дочерний процесс завершён по сигналу %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "дочерний процесс завершился с нераспознанным состоянием %d"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "не удалось создать связь для каталога \"%s\": %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "не удалось получить связь для каталога \"%s\": %s\n"
+
+#: initdb.c:464 initdb.c:1459
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "не удалось открыть файл \"%s\" для чтения: %m"
+
+#: initdb.c:505 initdb.c:809 initdb.c:829
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "не удалось открыть файл \"%s\" для записи: %m"
+
+#: initdb.c:509 initdb.c:812 initdb.c:831
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не удалось записать файл \"%s\": %m"
+
+#: initdb.c:513
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "не удалось закрыть файл \"%s\": %m"
+
+#: initdb.c:529
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "не удалось выполнить команду \"%s\": %m"
+
+#: initdb.c:547
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "удаление каталога данных \"%s\""
+
+#: initdb.c:549
+#, c-format
+msgid "failed to remove data directory"
+msgstr "ошибка при удалении каталога данных"
+
+#: initdb.c:553
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "удаление содержимого каталога данных \"%s\""
+
+#: initdb.c:556
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "ошибка при удалении содержимого каталога данных"
+
+#: initdb.c:561
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "удаление каталога WAL \"%s\""
+
+#: initdb.c:563
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "ошибка при удалении каталога WAL"
+
+#: initdb.c:567
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "удаление содержимого каталога WAL \"%s\""
+
+#: initdb.c:569
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "ошибка при удалении содержимого каталога WAL"
+
+#: initdb.c:576
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "каталог данных \"%s\" не был удалён по запросу пользователя"
+
+#: initdb.c:580
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "каталог WAL \"%s\" не был удалён по запросу пользователя"
+
+#: initdb.c:598
+#, c-format
+msgid "cannot be run as root"
+msgstr "программу не должен запускать root"
+
+#: initdb.c:599
+#, c-format
+msgid ""
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will own "
+"the server process."
+msgstr ""
+"Пожалуйста, переключитесь на обычного пользователя (например, используя "
+"\"su\"), которому будет принадлежать серверный процесс."
+
+#: initdb.c:631
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" — некорректное имя серверной кодировки"
+
+#: initdb.c:775
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "файл \"%s\" не существует"
+
+#: initdb.c:776 initdb.c:781 initdb.c:788
+#, c-format
+msgid ""
+"This might mean you have a corrupted installation or identified the wrong "
+"directory with the invocation option -L."
+msgstr ""
+"Это означает, что ваша установка PostgreSQL испорчена или в параметре -L "
+"задан неправильный каталог."
+
+#: initdb.c:780
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "нет доступа к файлу \"%s\": %m"
+
+#: initdb.c:787
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "\"%s\" — не обычный файл"
+
+#: initdb.c:922
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "выбирается реализация динамической разделяемой памяти... "
+
+#: initdb.c:931
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "выбирается значение max_connections по умолчанию... "
+
+#: initdb.c:962
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "выбирается значение shared_buffers по умолчанию... "
+
+#: initdb.c:996
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "выбирается часовой пояс по умолчанию... "
+
+#: initdb.c:1030
+msgid "creating configuration files ... "
+msgstr "создание конфигурационных файлов... "
+
+#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "не удалось поменять права для \"%s\": %m"
+
+#: initdb.c:1319
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "выполняется подготовительный скрипт... "
+
+#: initdb.c:1331
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "входной файл \"%s\" не принадлежит PostgreSQL %s"
+
+#: initdb.c:1333
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Укажите корректный путь в параметре -L."
+
+#: initdb.c:1437
+msgid "Enter new superuser password: "
+msgstr "Введите новый пароль суперпользователя: "
+
+#: initdb.c:1438
+msgid "Enter it again: "
+msgstr "Повторите его: "
+
+#: initdb.c:1441
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Пароли не совпадают.\n"
+
+#: initdb.c:1465
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "не удалось прочитать пароль из файла \"%s\": %m"
+
+#: initdb.c:1468
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "файл пароля \"%s\" пуст"
+
+#: initdb.c:1915
+#, c-format
+msgid "caught signal\n"
+msgstr "получен сигнал\n"
+
+#: initdb.c:1921
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "не удалось записать в поток дочернего процесса: %s\n"
+
+#: initdb.c:1929
+#, c-format
+msgid "ok\n"
+msgstr "ок\n"
+
+#: initdb.c:2018
+#, c-format
+msgid "setlocale() failed"
+msgstr "ошибка в setlocale()"
+
+#: initdb.c:2036
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "не удалось восстановить старую локаль \"%s\""
+
+#: initdb.c:2043
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "ошибочное имя локали \"%s\""
+
+#: initdb.c:2054
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "неверные установки локали; проверьте переменные окружения LANG и LC_*"
+
+#: initdb.c:2080 initdb.c:2104
+#, c-format
+msgid "encoding mismatch"
+msgstr "несоответствие кодировки"
+
+#: initdb.c:2081
+#, c-format
+msgid ""
+"The encoding you selected (%s) and the encoding that the selected locale "
+"uses (%s) do not match. This would lead to misbehavior in various character "
+"string processing functions."
+msgstr ""
+"Выбранная вами кодировка (%s) не совпадает с кодировкой локали (%s). Это "
+"может привести к неправильной работе различных функций обработки текстовых "
+"строк."
+
+#: initdb.c:2086 initdb.c:2107
+#, c-format
+msgid ""
+"Rerun %s and either do not specify an encoding explicitly, or choose a "
+"matching combination."
+msgstr ""
+"Для исправления перезапустите %s, не указывая кодировку явно, либо выберите "
+"подходящее сочетание параметров локализации."
+
+#: initdb.c:2105
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "Выбранная вами кодировка (%s) не поддерживается провайдером ICU."
+
+#: initdb.c:2169
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "необходимо задать локаль ICU"
+
+#: initdb.c:2176
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU не поддерживается в данной сборке"
+
+#: initdb.c:2187
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s инициализирует кластер PostgreSQL.\n"
+"\n"
+
+#: initdb.c:2188
+#, c-format
+msgid "Usage:\n"
+msgstr "Использование:\n"
+
+#: initdb.c:2189
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [ПАРАМЕТР]... [КАТАЛОГ]\n"
+
+#: initdb.c:2190
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметры:\n"
+
+#: initdb.c:2191
+#, c-format
+msgid ""
+" -A, --auth=METHOD default authentication method for local "
+"connections\n"
+msgstr ""
+" -A, --auth=МЕТОД метод проверки подлинности по умолчанию\n"
+" для локальных подключений\n"
+
+#: initdb.c:2192
+#, c-format
+msgid ""
+" --auth-host=METHOD default authentication method for local TCP/IP "
+"connections\n"
+msgstr ""
+" --auth-host=МЕТОД метод проверки подлинности по умолчанию\n"
+" для локальных TCP/IP-подключений\n"
+
+#: initdb.c:2193
+#, c-format
+msgid ""
+" --auth-local=METHOD default authentication method for local-socket "
+"connections\n"
+msgstr ""
+" --auth-local=МЕТОД метод проверки подлинности по умолчанию\n"
+" для локальных подключений через сокет\n"
+
+#: initdb.c:2194
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]КАТАЛОГ расположение данных этого кластера БД\n"
+
+#: initdb.c:2195
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=КОДИРОВКА кодировка по умолчанию для новых баз\n"
+
+#: initdb.c:2196
+#, c-format
+msgid ""
+" -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr ""
+" -g, --allow-group-access разрешить чтение/выполнение в каталоге данных "
+"для\n"
+" группы\n"
+
+#: initdb.c:2197
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=ЛОКАЛЬ идентификатор локали ICU для новых баз\n"
+
+#: initdb.c:2198
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums включить контроль целостности страниц\n"
+
+#: initdb.c:2199
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=ЛОКАЛЬ локаль по умолчанию для новых баз\n"
+
+#: initdb.c:2200
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category "
+"for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=ЛОКАЛЬ\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=ЛОКАЛЬ\n"
+" установить соответствующий параметр локали\n"
+" для новых баз (вместо значения из окружения)\n"
+
+#: initdb.c:2204
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale эквивалентно --locale=C\n"
+
+#: initdb.c:2205
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" провайдер основной локали для новых баз\n"
+
+#: initdb.c:2207
+#, c-format
+msgid ""
+" --pwfile=FILE read password for the new superuser from file\n"
+msgstr ""
+" --pwfile=ФАЙЛ прочитать пароль суперпользователя из файла\n"
+
+#: initdb.c:2208
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=КОНФИГУРАЦИЯ\n"
+" конфигурация текстового поиска по умолчанию\n"
+
+#: initdb.c:2210
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=ИМЯ имя суперпользователя БД\n"
+
+#: initdb.c:2211
+#, c-format
+msgid ""
+" -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt запросить пароль суперпользователя\n"
+
+#: initdb.c:2212
+#, c-format
+msgid ""
+" -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=КАТАЛОГ расположение журнала предзаписи\n"
+
+#: initdb.c:2213
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=РАЗМЕР размер сегментов WAL (в мегабайтах)\n"
+
+#: initdb.c:2214
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Редко используемые параметры:\n"
+
+#: initdb.c:2215
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug выдавать много отладочных сообщений\n"
+
+#: initdb.c:2216
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches установить debug_discard_caches=1\n"
+
+#: initdb.c:2217
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L КАТАЛОГ расположение входных файлов\n"
+
+#: initdb.c:2218
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean не очищать после ошибок\n"
+
+#: initdb.c:2219
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync не ждать завершения сохранения данных на диске\n"
+
+#: initdb.c:2220
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr ""
+" --no-instructions не выводить инструкции для дальнейших действий\n"
+
+#: initdb.c:2221
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show показать внутренние установки\n"
+
+#: initdb.c:2222
+#, c-format
+msgid ""
+" -S, --sync-only only sync database files to disk, then exit\n"
+msgstr ""
+" -S, --sync-only только синхронизировать с ФС файлы базы и "
+"завершиться\n"
+
+#: initdb.c:2223
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Другие параметры:\n"
+
+#: initdb.c:2224
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: initdb.c:2225
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: initdb.c:2226
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Если каталог данных не указан, используется переменная окружения PGDATA.\n"
+
+#: initdb.c:2228
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках сообщайте по адресу <%s>.\n"
+
+#: initdb.c:2229
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: initdb.c:2257
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr ""
+"нераспознанный метод проверки подлинности \"%s\" для подключений \"%s\""
+
+#: initdb.c:2271
+#, c-format
+msgid ""
+"must specify a password for the superuser to enable password authentication"
+msgstr ""
+"для включения аутентификации по паролю необходимо указать пароль "
+"суперпользователя"
+
+#: initdb.c:2290
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог данных не указан"
+
+#: initdb.c:2291
+#, c-format
+msgid ""
+"You must identify the directory where the data for this database system will "
+"reside. Do this with either the invocation option -D or the environment "
+"variable PGDATA."
+msgstr ""
+"Вы должны указать каталог, в котором будут располагаться данные этой СУБД. "
+"Это можно сделать, добавив ключ -D или установив переменную окружения PGDATA."
+
+#: initdb.c:2308
+#, c-format
+msgid "could not set environment"
+msgstr "не удалось задать переменную окружения"
+
+#: initdb.c:2326
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr "программа \"%s\" нужна для %s, но она не найдена в каталоге \"%s\""
+
+#: initdb.c:2329
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"программа \"%s\" найдена программой \"%s\", но её версия отличается от "
+"версии %s"
+
+#: initdb.c:2344
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "расположение входных файлов должно задаваться абсолютным путём"
+
+#: initdb.c:2361
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "Кластер баз данных будет инициализирован с локалью \"%s\".\n"
+
+#: initdb.c:2364
+#, c-format
+msgid ""
+"The database cluster will be initialized with this locale configuration:\n"
+msgstr ""
+"Кластер баз данных будет инициализирован со следующими параметрами локали:\n"
+
+#: initdb.c:2365
+#, c-format
+msgid " provider: %s\n"
+msgstr " провайдер: %s\n"
+
+#: initdb.c:2367
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " локаль ICU: %s\n"
+
+#: initdb.c:2368
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2385
+#, c-format
+msgid "The default database encoding has been set to \"%s\".\n"
+msgstr "В качестве кодировки БД по умолчанию установлена \"%s\".\n"
+
+#: initdb.c:2397
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "не удалось найти подходящую кодировку для локали \"%s\""
+
+#: initdb.c:2399
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "Перезапустите %s с параметром -E."
+
+#: initdb.c:2400 initdb.c:3021 initdb.c:3041
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Для дополнительной информации попробуйте \"%s --help\"."
+
+#: initdb.c:2412
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"Кодировка \"%s\", подразумеваемая локалью, не годится для сервера.\n"
+"Вместо неё в качестве кодировки БД по умолчанию будет выбрана \"%s\".\n"
+
+#: initdb.c:2417
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "для локали \"%s\" требуется неподдерживаемая кодировка \"%s\""
+
+#: initdb.c:2419
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "Кодировка \"%s\" недопустима в качестве серверной кодировки."
+
+#: initdb.c:2421
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "Перезапустите %s, выбрав другую локаль."
+
+#: initdb.c:2429
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr ""
+"Кодировка БД по умолчанию, выбранная в соответствии с настройками: \"%s\".\n"
+
+#: initdb.c:2498
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr ""
+"не удалось найти подходящую конфигурацию текстового поиска для локали \"%s\""
+
+#: initdb.c:2509
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr ""
+"внимание: для локали \"%s\" нет известной конфигурации текстового поиска"
+
+#: initdb.c:2514
+#, c-format
+msgid ""
+"specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr ""
+"указанная конфигурация текстового поиска \"%s\" может не соответствовать "
+"локали \"%s\""
+
+#: initdb.c:2519
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "Выбрана конфигурация текстового поиска по умолчанию \"%s\".\n"
+
+#: initdb.c:2562 initdb.c:2633
+#, c-format
+msgid "creating directory %s ... "
+msgstr "создание каталога %s... "
+
+#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не удалось создать каталог \"%s\": %m"
+
+#: initdb.c:2576 initdb.c:2648
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "исправление прав для существующего каталога %s... "
+
+#: initdb.c:2581 initdb.c:2653
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "не удалось поменять права для каталога \"%s\": %m"
+
+#: initdb.c:2593 initdb.c:2665
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "каталог \"%s\" существует, но он не пуст"
+
+#: initdb.c:2597
+#, c-format
+msgid ""
+"If you want to create a new database system, either remove or empty the "
+"directory \"%s\" or run %s with an argument other than \"%s\"."
+msgstr ""
+"Если вы хотите создать новую систему баз данных, удалите или очистите "
+"каталог \"%s\", либо при запуске %s в качестве пути укажите не \"%s\"."
+
+#: initdb.c:2605 initdb.c:2675 initdb.c:3058
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "ошибка доступа к каталогу \"%s\": %m"
+
+#: initdb.c:2626
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "расположение каталога WAL должно определяться абсолютным путём"
+
+#: initdb.c:2669
+#, c-format
+msgid ""
+"If you want to store the WAL there, either remove or empty the directory "
+"\"%s\"."
+msgstr "Если вы хотите хранить WAL здесь, удалите или очистите каталог \"%s\"."
+
+#: initdb.c:2680
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "не удалось создать символическую ссылку \"%s\": %m"
+
+#: initdb.c:2683
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "символические ссылки не поддерживаются в этой ОС"
+
+#: initdb.c:2702
+#, c-format
+msgid ""
+"It contains a dot-prefixed/invisible file, perhaps due to it being a mount "
+"point."
+msgstr ""
+"Он содержит файл с точкой (невидимый), возможно, это точка монтирования."
+
+#: initdb.c:2704
+#, c-format
+msgid ""
+"It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Он содержит подкаталог lost+found, возможно, это точка монтирования."
+
+#: initdb.c:2706
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"Использовать в качестве каталога данных точку монтирования не "
+"рекомендуется.\n"
+"Создайте в монтируемом ресурсе подкаталог и используйте его."
+
+#: initdb.c:2732
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "создание подкаталогов... "
+
+#: initdb.c:2775
+msgid "performing post-bootstrap initialization ... "
+msgstr "выполняется заключительная инициализация... "
+
+#: initdb.c:2940
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Программа запущена в режиме отладки.\n"
+
+#: initdb.c:2944
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr ""
+"Программа запущена в режиме 'no-clean' - очистки и исправления ошибок не "
+"будет.\n"
+
+#: initdb.c:3014
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "нераспознанный провайдер локали: %s"
+
+#: initdb.c:3039
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "слишком много аргументов командной строки (первый: \"%s\")"
+
+#: initdb.c:3046
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s можно указать, только если выбран провайдер локали \"%s\""
+
+#: initdb.c:3060 initdb.c:3137
+msgid "syncing data to disk ... "
+msgstr "сохранение данных на диске... "
+
+#: initdb.c:3068
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "нельзя одновременно запросить пароль и прочитать пароль из файла"
+
+#: initdb.c:3090
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "аргументом --wal-segsize должно быть число"
+
+#: initdb.c:3092
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "аргументом --wal-segsize должна быть степень 2 от 1 до 1024"
+
+#: initdb.c:3106
+#, c-format
+msgid ""
+"superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr ""
+"имя \"%s\" для суперпользователя не допускается; имена ролей не могут "
+"начинаться с \"pg_\""
+
+#: initdb.c:3108
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Файлы, относящиеся к этой СУБД, будут принадлежать пользователю \"%s\".\n"
+"От его имени также будет запускаться процесс сервера.\n"
+"\n"
+
+#: initdb.c:3124
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Контроль целостности страниц данных включён.\n"
+
+#: initdb.c:3126
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Контроль целостности страниц данных отключён.\n"
+
+#: initdb.c:3143
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Сохранение данных на диск пропускается.\n"
+"Каталог данных может повредиться при сбое операционной системы.\n"
+
+#: initdb.c:3148
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "включение метода аутентификации \"trust\" для локальных подключений"
+
+#: initdb.c:3149
+#, c-format
+msgid ""
+"You can change this by editing pg_hba.conf or using the option -A, or --auth-"
+"local and --auth-host, the next time you run initdb."
+msgstr ""
+"Другой метод можно выбрать, отредактировав pg_hba.conf или ещё раз запустив "
+"initdb с ключом -A, --auth-local или --auth-host."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3179
+msgid "logfile"
+msgstr "файл_журнала"
+
+#: initdb.c:3181
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Готово. Теперь вы можете запустить сервер баз данных:\n"
+"\n"
+" %s\n"
+"\n"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s: не удалось открыть каталог \"%s\": %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s: не удалось прочитать каталог \"%s\": %s\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "дочерний процесс завершён по сигналу %s"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: нехватка памяти\n"
+
+#~ msgid "%s: removing transaction log directory \"%s\"\n"
+#~ msgstr "%s: удаление каталога журнала транзакций \"%s\"\n"
+
+#~ msgid "%s: failed to remove transaction log directory\n"
+#~ msgstr "%s: ошибка при удалении каталога журнала транзакций\n"
+
+#~ msgid "%s: removing contents of transaction log directory \"%s\"\n"
+#~ msgstr "%s: очистка каталога журнала транзакций \"%s\"\n"
+
+#~ msgid "%s: failed to remove contents of transaction log directory\n"
+#~ msgstr "%s: ошибка при очистке каталога журнала транзакций\n"
+
+#~ msgid "%s: transaction log directory \"%s\" not removed at user's request\n"
+#~ msgstr ""
+#~ "%s: каталог журнала транзакций \"%s\" не был удалён по запросу "
+#~ "пользователя\n"
+
+#~ msgid "%s: locale name too long, skipped: \"%s\"\n"
+#~ msgstr "%s: слишком длинное имя локали, пропущено: \"%s\"\n"
+
+#~ msgid "%s: locale name has non-ASCII characters, skipped: \"%s\"\n"
+#~ msgstr "%s: имя локали содержит не ASCII-символы, пропущено: \"%s\"\n"
+
+#~ msgid "No usable system locales were found.\n"
+#~ msgstr "Пригодные локали в системе не найдены.\n"
+
+#~ msgid "Use the option \"--debug\" to see details.\n"
+#~ msgstr "Добавьте параметр \"--debug\", чтобы узнать подробности.\n"
+
+#~ msgid "creating template1 database in %s/base/1 ... "
+#~ msgstr "создание базы template1 в %s/base/1... "
+
+#~ msgid "initializing pg_authid ... "
+#~ msgstr "инициализация pg_authid... "
+
+#~ msgid "setting password ... "
+#~ msgstr "установка пароля... "
+
+#~ msgid "initializing dependencies ... "
+#~ msgstr "инициализация зависимостей... "
+
+#~ msgid "creating system views ... "
+#~ msgstr "создание системных представлений... "
+
+#~ msgid "loading system objects' descriptions ... "
+#~ msgstr "загрузка описаний системных объектов... "
+
+#~ msgid "creating collations ... "
+#~ msgstr "создание правил сортировки... "
+
+#~ msgid "creating conversions ... "
+#~ msgstr "создание преобразований... "
+
+#~ msgid "creating dictionaries ... "
+#~ msgstr "создание словарей... "
+
+#~ msgid "setting privileges on built-in objects ... "
+#~ msgstr "установка прав для встроенных объектов... "
+
+#~ msgid "creating information schema ... "
+#~ msgstr "создание информационной схемы... "
+
+#~ msgid "loading PL/pgSQL server-side language ... "
+#~ msgstr "загрузка серверного языка PL/pgSQL... "
+
+#~ msgid "vacuuming database template1 ... "
+#~ msgstr "очистка базы данных template1... "
+
+#~ msgid "copying template1 to template0 ... "
+#~ msgstr "копирование template1 в template0... "
+
+#~ msgid "copying template1 to postgres ... "
+#~ msgstr "копирование template1 в postgres... "
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s: не удалось закрыть каталог \"%s\": %s\n"
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s: не удалось получить информацию о текущем пользователе: %s\n"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s: не удалось узнать имя текущего пользователя: %s\n"
+
+#~ msgid "Using the top-level directory of a mount point is not recommended.\n"
+#~ msgstr ""
+#~ "Использовать в качестве основного каталога точку монтирования не "
+#~ "рекомендуется.\n"
diff --git a/src/bin/initdb/po/sv.po b/src/bin/initdb/po/sv.po
new file mode 100644
index 0000000..98ef72f
--- /dev/null
+++ b/src/bin/initdb/po/sv.po
@@ -0,0 +1,1045 @@
+# Swedish message translation file for initdb
+# Dennis Björklund <db@zigo.dhs.org>, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022.
+# Magnus Hagander <magnus@hagander.net>, 2007.
+# Peter Eisentraut <peter_e@gmx.net>, 2009.
+# Mats Erik Andersson <bsd@gisladisker.se>, 2014.
+#
+# Use these quotes: "%s"
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-16 19:19+0000\n"
+"PO-Revision-Date: 2022-09-17 07:24+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "kunde inte identifiera aktuell katalog: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "ogiltig binär \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "kunde inte läsa binär \"%s\""
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "kunde inte hitta en \"%s\" att köra"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "kunde inte byta katalog till \"%s\": %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "kan inte läsa symbolisk länk \"%s\": %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() misslyckades: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: initdb.c:334
+#, c-format
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kan inte duplicera null-pekare (internt fel)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "kunde inte göra stat() på fil \"%s\": %m"
+
+#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "kunde inte öppna katalog \"%s\": %m"
+
+#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "kunde inte läsa katalog \"%s\": %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "kunde inte fsync:a fil \"%s\": %m"
+
+#: ../../common/file_utils.c:383
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "kunde inte stänga katalog \"%s\": %m"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "kunde inte ladda länkbibliotek \"%s\": felkod %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "kan inte skapa token för begränsad åtkomst på denna plattorm: felkod %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "kunde inte öppna process-token: felkod %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "kunde inte allokera SID: felkod %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "kunde inte skapa token för begränsad åtkomst: felkod %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "kunde inte starta process för kommando \"%s\": felkod %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "kunde inte köra igen med token för begränsad åtkomst: felkod %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "kunde inte hämta statuskod för underprocess: felkod %lu"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "kunde inte ta status på fil eller katalog \"%s\": %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "kunde inte ta bort fil eller katalog \"%s\": %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "kunde inte slå upp effektivt användar-id %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "användaren finns inte"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "misslyckad sökning efter användarnamn: felkod %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "kommandot är inte körbart"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "kommandot kan ej hittas"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "barnprocess avslutade med kod %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "barnprocess terminerades med avbrott 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "barnprocess terminerades av signal %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "barnprocess avslutade med okänd statuskod %d"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "kunde inte sätta en knutpunkt (junction) för \"%s\": %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "kunde inte få en knutpunkt (junction) för \"%s\": %s\n"
+
+#: initdb.c:464 initdb.c:1459
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "kunde inte öppna filen \"%s\" för läsning: %m"
+
+#: initdb.c:505 initdb.c:809 initdb.c:829
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "kunde inte öppna fil \"%s\" för skrivning: %m"
+
+#: initdb.c:509 initdb.c:812 initdb.c:831
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "kunde inte skriva fil \"%s\": %m"
+
+#: initdb.c:513
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "kunde inte stänga fil \"%s\": %m"
+
+#: initdb.c:529
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "kunde inte köra kommandot \"%s\": %m"
+
+#: initdb.c:547
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "tar bort datakatalog \"%s\""
+
+#: initdb.c:549
+#, c-format
+msgid "failed to remove data directory"
+msgstr "misslyckades med att ta bort datakatalog"
+
+#: initdb.c:553
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "tar bort innehållet i datakatalog \"%s\""
+
+#: initdb.c:556
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "misslyckades med att ta bort innehållet i datakatalogen"
+
+#: initdb.c:561
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "tar bort WAL-katalog \"%s\""
+
+#: initdb.c:563
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "misslyckades med att ta bort WAL-katalog"
+
+#: initdb.c:567
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "tar bort innehållet i WAL-katalog \"%s\""
+
+#: initdb.c:569
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "misslyckades med att ta bort innehållet i WAL-katalogen"
+
+#: initdb.c:576
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "datakatalog \"%s\" är ej borttagen på användares begäran"
+
+#: initdb.c:580
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "WAL-katalog \"%s\" är ej borttagen på användares begäran"
+
+#: initdb.c:598
+#, c-format
+msgid "cannot be run as root"
+msgstr "kan inte köras som root"
+
+#: initdb.c:599
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "Logga in (t.ex. med \"su\") som den (opriviligerade) användare som skall äga serverprocessen."
+
+#: initdb.c:631
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" är inte en giltig teckenkodning för servern"
+
+#: initdb.c:775
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "filen \"%s\" finns inte"
+
+#: initdb.c:776 initdb.c:781 initdb.c:788
+#, c-format
+msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."
+msgstr "Detta kan betyda att du har en korrupt installation eller att du har angivit felaktig katalog till flaggan -L."
+
+#: initdb.c:780
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "kunde inte komma åt filen \"%s\": %m"
+
+#: initdb.c:787
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "filen \"%s\" är inte en normal fil"
+
+#: initdb.c:922
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "väljer mekanism för dynamiskt, delat minne ... "
+
+#: initdb.c:931
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "sätter förvalt värde för max_connections ... "
+
+#: initdb.c:962
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "sätter förvalt värde för shared_buffers ... "
+
+#: initdb.c:996
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "sätter förvalt värde för tidszon ... "
+
+#: initdb.c:1030
+msgid "creating configuration files ... "
+msgstr "skapar konfigurationsfiler ... "
+
+#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "kunde inte ändra rättigheter på \"%s\": %m"
+
+#: initdb.c:1319
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "kör uppsättningsskript..."
+
+#: initdb.c:1331
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "indatafil \"%s\" tillhör inte PostgreSQL %s"
+
+# The expected string length of bki_file (for the first "%s")
+# with a standard directory "/usr/local/pgsql", is such that
+# the translated message string produces a reasonable output.
+#
+#: initdb.c:1333
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Ange korrekt sökväg med flaggan -L."
+
+#: initdb.c:1437
+msgid "Enter new superuser password: "
+msgstr "Mata in ett nytt lösenord för superuser: "
+
+#: initdb.c:1438
+msgid "Enter it again: "
+msgstr "Mata in det igen: "
+
+#: initdb.c:1441
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Lösenorden stämde inte överens.\n"
+
+#: initdb.c:1465
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "kunde inte läsa lösenord i filen \"%s\": %m"
+
+#: initdb.c:1468
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "lösenordsfilen \"%s\" är tom"
+
+#: initdb.c:1915
+#, c-format
+msgid "caught signal\n"
+msgstr "mottog signal\n"
+
+#: initdb.c:1921
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "kunde inte skriva till barnprocess: %s\n"
+
+#: initdb.c:1929
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2018
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() misslyckades"
+
+#: initdb.c:2036
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "misslyckades med att återställa gamla lokalen \"%s\""
+
+#: initdb.c:2043
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "ogiltigt lokalnamn \"%s\""
+
+#: initdb.c:2054
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "ogiltig lokalinställning. Kontrollera miljövariablerna LANG och LC_*"
+
+#: initdb.c:2080 initdb.c:2104
+#, c-format
+msgid "encoding mismatch"
+msgstr "teckenkodning matchar inte"
+
+#: initdb.c:2081
+#, c-format
+msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions."
+msgstr "Teckenkodningen du har valt (%s) och teckenkodningen som valda lokalen använder (%s) passar inte ihop. Detta kommer leda till problem för funktioner som arbetar med strängar."
+
+#: initdb.c:2086 initdb.c:2107
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "Kör %s igen och ange antingen ingen explicit kodning eller välj en matchande kombination."
+
+#: initdb.c:2105
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "Den valda teckenkodningen (%s) stöds inte av ICU."
+
+#: initdb.c:2169
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "ICU-lokal måste anges"
+
+#: initdb.c:2176
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU stöds inte av detta bygge"
+
+#: initdb.c:2187
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s initierar ett databaskluster för PostgreSQL.\n"
+"\n"
+
+#: initdb.c:2188
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: initdb.c:2189
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [FLAGGA]... [DATAKATALOG]\n"
+
+#: initdb.c:2190
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Flaggor:\n"
+
+#: initdb.c:2191
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=METOD förvald autentiseringsmetod för alla anslutningar\n"
+
+#: initdb.c:2192
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=METOD autentiseringsmetod för TCP/IP-anslutningar\n"
+
+#: initdb.c:2193
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=METOD autentiseringsmetod för anslutningar via unix-uttag\n"
+
+#: initdb.c:2194
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATAKATALOG läge för detta databaskluster\n"
+
+#: initdb.c:2195
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=KODNING sätter teckenkodning för nya databaser\n"
+
+#: initdb.c:2196
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access tillåt läs/kör för grupp på datakatalogen\n"
+
+#: initdb.c:2197
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOKAL sätt ID för ICU-lokal för nya databaser\n"
+
+#: initdb.c:2198
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums använd checksummor på datablock\n"
+
+#: initdb.c:2199
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOKAL sätt standardlokal för nya databaser\n"
+
+#: initdb.c:2200
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOKAL\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOKAL\n"
+" sätter standardlokal i utvald kategori för\n"
+" nya databaser (förval hämtas ur omgivningen)\n"
+
+#: initdb.c:2204
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale samma som --locale=C\n"
+
+#: initdb.c:2205
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" sätt standard lokalleverantör för nya databaser\n"
+
+#: initdb.c:2207
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=FIL läser lösenord för superuser från fil\n"
+
+#: initdb.c:2208
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" standardkonfiguration för textsökning\n"
+
+#: initdb.c:2210
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAMN namn på databasens superuser\n"
+
+#: initdb.c:2211
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt efterfråga lösenord för superuser\n"
+
+#: initdb.c:2212
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR katalog för write-ahead-log (WAL)\n"
+
+#: initdb.c:2213
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=STORLEK storlek på WAL-segment i megabyte\n"
+
+#: initdb.c:2214
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Mindre vanliga flaggor:\n"
+
+#: initdb.c:2215
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug generera massor med debug-utskrifter\n"
+
+#: initdb.c:2216
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches sätt debug_discard_caches=1\n"
+
+#: initdb.c:2217
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L KATALOG katalog där indatafiler skall sökas\n"
+
+#: initdb.c:2218
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean städa inte upp efter fel\n"
+
+#: initdb.c:2219
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync vänta inte på att ändingar säkert skrivits till disk\n"
+
+#: initdb.c:2220
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions skriv inte instruktioner för nästa steg\n"
+
+#: initdb.c:2221
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show visa interna inställningar\n"
+
+#: initdb.c:2222
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only synka bara databasfiler till disk, avsluta seden\n"
+
+#: initdb.c:2223
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Andra flaggor:\n"
+
+#: initdb.c:2224
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: initdb.c:2225
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: initdb.c:2226
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Om datakatalogen inte anges så tas den från omgivningsvariabeln PGDATA.\n"
+
+#: initdb.c:2228
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: initdb.c:2229
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: initdb.c:2257
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "ogiltig autentiseringsmetod \"%s\" för anslutning av typen \"%s\""
+
+#: initdb.c:2271
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "du måste ange ett lösenord för superuser för att kunna slå på lösenordsautentisering"
+
+#: initdb.c:2290
+#, c-format
+msgid "no data directory specified"
+msgstr "ingen datakatalog angiven"
+
+#: initdb.c:2291
+#, c-format
+msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA."
+msgstr "Du måste uppge den katalog där data för detta databassystem skall lagras. Gör det antingen med flaggan -D eller genom att sätta omgivningsvariabeln PGDATA."
+
+#: initdb.c:2308
+#, c-format
+msgid "could not set environment"
+msgstr "kunde inte sätta omgivningen"
+
+#: initdb.c:2326
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\""
+
+#: initdb.c:2329
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s"
+
+#: initdb.c:2344
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "plats för indatafiler måste vara en absolut sökväg"
+
+#: initdb.c:2361
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "Databasklustret kommer att skapas med lokalnamn \"%s\".\n"
+
+#: initdb.c:2364
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "Databasklustret kommer att initieras med denna lokalkonfiguration:\n"
+
+#: initdb.c:2365
+#, c-format
+msgid " provider: %s\n"
+msgstr " leverantör: %s\n"
+
+#: initdb.c:2367
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " ICU-lokal: %s\n"
+
+#: initdb.c:2368
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2385
+#, c-format
+msgid "The default database encoding has been set to \"%s\".\n"
+msgstr "Förvald teckenkodning för databaser är satt till \"%s\".\n"
+
+#: initdb.c:2397
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "kunde inte välja en lämplig kodning för lokal \"%s\""
+
+#: initdb.c:2399
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "Kör %s igen men med flaggan -E."
+
+#: initdb.c:2400 initdb.c:3021 initdb.c:3041
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: initdb.c:2412
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"Teckenkodning \"%s\", tagen ur lokalnamnet, är inte godtagbar för servern.\n"
+"I dess ställe sättes databasens förvalda teckenkodning till \"%s\".\n"
+
+#: initdb.c:2417
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "lokalen \"%s\" kräver ej supportad teckenkodning \"%s\""
+
+#: initdb.c:2419
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "Teckenkodning \"%s\" tillåts inte som serverteckenkodning."
+
+#: initdb.c:2421
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "Kör %s igen men välj en annan lokal."
+
+#: initdb.c:2429
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "Förvald teckenkodning för databaser är satt till \"%s\".\n"
+
+#: initdb.c:2498
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "kunde inte hitta en lämplig textsökningskonfiguration för lokalnamn \"%s\""
+
+#: initdb.c:2509
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "ingen lämplig textsökningskonfiguration för lokalnamn \"%s\""
+
+#: initdb.c:2514
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "uppgiven textsökningskonfiguration \"%s\" passar kanske inte till lokalnamn \"%s\""
+
+#: initdb.c:2519
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "Förvald textsökningskonfiguration för databaser är satt till \"%s\".\n"
+
+#: initdb.c:2562 initdb.c:2633
+#, c-format
+msgid "creating directory %s ... "
+msgstr "skapar katalog %s ... "
+
+#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "kunde inte skapa katalog \"%s\": %m"
+
+#: initdb.c:2576 initdb.c:2648
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "sätter rättigheter på existerande katalog %s ... "
+
+#: initdb.c:2581 initdb.c:2653
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "kunde inte ändra rättigheter på katalogen \"%s\": %m"
+
+#: initdb.c:2593 initdb.c:2665
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "katalogen \"%s\" existerar men är inte tom"
+
+#: initdb.c:2597
+#, c-format
+msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"."
+msgstr "Om du vill skapa ett nytt databassystem, tag då antingen bort eller töm katalogen \"%s\" eller kör %s med annat argument än \"%s\"."
+
+#: initdb.c:2605 initdb.c:2675 initdb.c:3058
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "kunde inte komma åt katalog \"%s\": %m"
+
+#: initdb.c:2626
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL-katalogen måste vara en absolut sökväg"
+
+#: initdb.c:2669
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "Om du vill spara WAL där, antingen radera eller töm katalogen \"%s\"."
+
+#: initdb.c:2680
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "kan inte skapa symbolisk länk \"%s\": %m"
+
+#: initdb.c:2683
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "symboliska länkar stöds inte på denna plattform"
+
+#: initdb.c:2702
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "Den innehåller en gömd fil, med inledande punkt i namnet; kanske är detta en monteringspunkt."
+
+#: initdb.c:2704
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Den innehåller \"lost+found\"; kanske är detta en monteringspunkt."
+
+#: initdb.c:2706
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"Att använda en monteringspunkt som datakatalog rekommenderas inte.\n"
+"Skapa först en underkatalog under monteringspunkten."
+
+#: initdb.c:2732
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "Skapar underkataloger ... "
+
+#: initdb.c:2775
+msgid "performing post-bootstrap initialization ... "
+msgstr "utför initiering efter uppstättning..."
+
+#: initdb.c:2940
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Kör i debug-läge.\n"
+
+#: initdb.c:2944
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "Kör i no-clean-läge. Misstag kommer inte städas bort.\n"
+
+#: initdb.c:3014
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "okänd lokalleverantör: %s"
+
+#: initdb.c:3039
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: initdb.c:3046
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s kan inte anges om inte lokalleverantör \"%s\" valts"
+
+#: initdb.c:3060 initdb.c:3137
+msgid "syncing data to disk ... "
+msgstr "synkar data till disk ... "
+
+#: initdb.c:3068
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "lösenordsfråga och lösenordsfil kan inte anges samtidigt"
+
+#: initdb.c:3090
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "argumentet till --wal-segsize måste vara ett tal"
+
+#: initdb.c:3092
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "argumentet till --wal-segsize måste vara en tvåpotens mellan 1 och 1024"
+
+#: initdb.c:3106
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "superuser-namn \"%s\" tillåts inte; rollnamn får inte börja på \"pg_\""
+
+#: initdb.c:3108
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Filer tillhörande databasen kommer att ägas av användaren \"%s\".\n"
+"Denna användare måste också vara ägare av server-processen.\n"
+"\n"
+
+#: initdb.c:3124
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Checksummor för datablock är aktiva.\n"
+
+#: initdb.c:3126
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Checksummor för datablock är avstängda.\n"
+
+#: initdb.c:3143
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Avstod från synkning mot lagringsmedium.\n"
+"Datakatalogen kan komma att fördärvas om operativsystemet störtar.\n"
+
+#: initdb.c:3148
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "slår på autentiseringsmetod \"trust\" för lokala anslutningar"
+
+#: initdb.c:3149
+#, c-format
+msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb."
+msgstr "Du kan ändra detta genom att redigera pg_hba.conf eller genom att sätta flaggor -A eller --auth-local och --auth-host nästa gång du kör initdb."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3179
+msgid "logfile"
+msgstr "loggfil"
+
+#: initdb.c:3181
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Lyckades. Du kan nu starta databasservern med:\n"
+"\n"
+" %s\n"
+"\n"
diff --git a/src/bin/initdb/po/uk.po b/src/bin/initdb/po/uk.po
new file mode 100644
index 0000000..a1679aa
--- /dev/null
+++ b/src/bin/initdb/po/uk.po
@@ -0,0 +1,1002 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-01-31 23:19+0000\n"
+"PO-Revision-Date: 2023-04-19 15:06\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/initdb.pot\n"
+"X-Crowdin-File-ID: 882\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередження: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "не вдалося визначити поточний каталог: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "невірний бінарний файл \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "неможливо прочитати бінарний файл \"%s\""
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "неможливо знайти \"%s\" для виконання"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "не вдалося змінити каталог на \"%s\": %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "не можливо прочитати символічне послання \"%s\": %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() помилка: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: initdb.c:334
+#, c-format
+msgid "out of memory"
+msgstr "недостатньо пам'яті"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "недостатньо пам'яті\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "неможливо дублювати нульовий покажчик (внутрішня помилка)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не вдалося отримати інформацію від файлу \"%s\": %m"
+
+#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не вдалося відкрити каталог \"%s\": %m"
+
+#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не вдалося прочитати каталог \"%s\": %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "не вдалося fsync файл \"%s\": %m"
+
+#: ../../common/file_utils.c:383
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "не вдалося перейменувати файл \"%s\" на \"%s\": %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не вдалося закрити каталог \"%s\": %m"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "не вдалося завантажити бібліотеку \"%s\": код помилки %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "не вдалося створити обмежені токени на цій платформі: код помилки %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "не вдалося відкрити токен процесу: код помилки %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "не вдалося виділити SID: код помилки %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "не вдалося створити обмежений токен: код помилки %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "не вдалося запустити процес для команди \"%s\": код помилки %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "не вдалося перезапустити з обмеженим токеном: код помилки %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "не вдалося отримати код завершення підпроцесу: код помилки %lu"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "не вдалося отримати інформацію про файл або каталог \"%s\": %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "не вдалося видалити файл або каталог \"%s\": %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "не можу знайти користувача з ефективним ID %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "користувача не існує"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "невдала підстановка імені користувача: код помилки %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "неможливо виконати команду"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "команду не знайдено"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "дочірній процес завершився з кодом виходу %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "дочірній процес перервано через помилку 0х%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "дочірній процес перервано через сигнал %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "дочірній процес завершився з невизнаним статусом %d"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "не вдалося встановити сполучення для \"%s\": %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "не вдалося встановити сполучення для \"%s\": %s\n"
+
+#: initdb.c:464 initdb.c:1459
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "не вдалося відкрити файл \"%s\" для читання: %m"
+
+#: initdb.c:505 initdb.c:809 initdb.c:829
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "не вдалося відкрити файл \"%s\" для запису: %m"
+
+#: initdb.c:509 initdb.c:812 initdb.c:831
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не вдалося записати файл \"%s\": %m"
+
+#: initdb.c:513
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "неможливо закрити файл \"%s\": %m"
+
+#: initdb.c:529
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "не вдалося виконати команду \"%s\": %m"
+
+#: initdb.c:547
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "видалення даних з директорії \"%s\""
+
+#: initdb.c:549
+#, c-format
+msgid "failed to remove data directory"
+msgstr "не вдалося видалити дані директорії"
+
+#: initdb.c:553
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "видалення даних з директорії \"%s\""
+
+#: initdb.c:556
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "не вдалося видалити дані директорії"
+
+#: initdb.c:561
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "видалення WAL директорії \"%s\""
+
+#: initdb.c:563
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "не вдалося видалити директорію WAL"
+
+#: initdb.c:567
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "видалення даних з директорії WAL \"%s\""
+
+#: initdb.c:569
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "не вдалося видалити дані директорії WAL"
+
+#: initdb.c:576
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "директорія даних \"%s\" не видалена за запитом користувача"
+
+#: initdb.c:580
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "директорія WAL \"%s\" не видалена за запитом користувача"
+
+#: initdb.c:598
+#, c-format
+msgid "cannot be run as root"
+msgstr "не може виконуватись як root"
+
+#: initdb.c:599
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "Будь ласка, увійдіть (за допомогою, наприклад, \"su\") як (непривілейований) користувач, від імені якого буде запущено серверний процес."
+
+#: initdb.c:631
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" невірне ім'я серверного кодування"
+
+#: initdb.c:775
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "файл \"%s\" не існує"
+
+#: initdb.c:776 initdb.c:781 initdb.c:788
+#, c-format
+msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."
+msgstr "Це означає, що ваша інсталяція пошкоджена або в параметрі -L задана неправильна директорія."
+
+#: initdb.c:780
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "немає доступу до файлу \"%s\": %m"
+
+#: initdb.c:787
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "файл \"%s\" не є звичайним файлом"
+
+#: initdb.c:922
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "обирається реалізація динамічної спільної пам'яті ... "
+
+#: initdb.c:931
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "обирається значення max_connections ... \n"
+" "
+
+#: initdb.c:962
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "обирається значення shared_buffers... "
+
+#: initdb.c:996
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "обирається часовий пояс за замовчуванням ... "
+
+#: initdb.c:1030
+msgid "creating configuration files ... "
+msgstr "створення конфігураційних файлів... "
+
+#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "неможливо змінити дозволи \"%s\": %m"
+
+#: initdb.c:1319
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "виконуємо сценарій ініціалізації ... "
+
+#: initdb.c:1331
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "вхідний файл \"%s\" не належить PostgreSQL %s"
+
+#: initdb.c:1333
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Вкажіть правильний шлях за допомогою параметру -L."
+
+#: initdb.c:1437
+msgid "Enter new superuser password: "
+msgstr "Введіть новий пароль для superuser: "
+
+#: initdb.c:1438
+msgid "Enter it again: "
+msgstr "Введіть знову: "
+
+#: initdb.c:1441
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Паролі не співпадають.\n"
+
+#: initdb.c:1465
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "не вдалося прочитати пароль з файлу \"%s\": %m"
+
+#: initdb.c:1468
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "файл з паролями \"%s\" є порожнім"
+
+#: initdb.c:1915
+#, c-format
+msgid "caught signal\n"
+msgstr "отримано сигнал\n"
+
+#: initdb.c:1921
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "не вдалося написати у дочірній процес: %s\n"
+
+#: initdb.c:1929
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2018
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() завершився невдало"
+
+#: initdb.c:2036
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "не вдалося відновити стару локаль \"%s\""
+
+#: initdb.c:2043
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "не допустиме ім'я локалі \"%s\""
+
+#: initdb.c:2054
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "неприпустимі параметри локалі; перевірте LANG та LC_* змінні середовища"
+
+#: initdb.c:2080 initdb.c:2104
+#, c-format
+msgid "encoding mismatch"
+msgstr "невідповідність кодування"
+
+#: initdb.c:2081
+#, c-format
+msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions."
+msgstr "Вибране вами кодування (%s) і кодування, яке використовує обрана локаль (%s) не збігаються. Це призведе до неправильної поведінки у різних функціях обробки символьних рядків."
+
+#: initdb.c:2086 initdb.c:2107
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "Перезапустіть %s і або не вказуйте кодування прямо або виберіть відповідну комбінацію."
+
+#: initdb.c:2105
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "Обране вами кодування (%s) не підтримується провайдером ICU."
+
+#: initdb.c:2169
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "Необхідно вказати локаль ICU"
+
+#: initdb.c:2176
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU не підтримується в цій збірці"
+
+#: initdb.c:2187
+#, c-format
+msgid "%s initializes a PostgreSQL database cluster.\n\n"
+msgstr "%s ініціалізує кластер баз даних PostgreSQL.\n\n"
+
+#: initdb.c:2188
+#, c-format
+msgid "Usage:\n"
+msgstr "Використання:\n"
+
+#: initdb.c:2189
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATADIR]\n"
+
+#: initdb.c:2190
+#, c-format
+msgid "\n"
+"Options:\n"
+msgstr "\n"
+"Параметри:\n"
+
+#: initdb.c:2191
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, -- auth=METHOD метод аутентифікації за замовчуванням для локальних підключень\n"
+
+#: initdb.c:2192
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=METHOD метод аутентифікації за замовчуванням для локального TCP/IP підключення\n"
+
+#: initdb.c:2193
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=METHOD метод аутентифікації за замовчуванням для локального під'єднання через сокет\n"
+
+#: initdb.c:2194
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D - pgdata =] DATADIR розташування кластеру цієї бази даних\n"
+
+#: initdb.c:2195
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=ENCODING встановлення кодування за замовчуванням для нової бази даних\n"
+
+#: initdb.c:2196
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access дозволити читати/виконувати у каталозі даних для групи\n"
+
+#: initdb.c:2197
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOCALE встановлює ідентифікатор мови ICU для нових баз даних\n"
+
+#: initdb.c:2198
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums використовувати контрольні суми сторінок\n"
+
+#: initdb.c:2199
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE встановлює локаль за замовчуванням для нових баз даних\n"
+
+#: initdb.c:2200
+#, c-format
+msgid " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" встановлення локалі за замовчуванням для відповідної категорії в\n"
+" нових базах даних (замість значення з середовища)\n"
+
+#: initdb.c:2204
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale еквівалентно --locale=C\n"
+
+#: initdb.c:2205
+#, c-format
+msgid " --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr " --locale-provider={libc|icu}\n"
+" встановлює провайдер локалі за замовченням для нових баз даних\n"
+
+#: initdb.c:2207
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=FILE прочитати пароль для нового суперкористувача з файлу\n"
+
+#: initdb.c:2208
+#, c-format
+msgid " -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr " -T, --text-search-config=CFG конфігурація текстового пошуку за замовчуванням\n"
+
+#: initdb.c:2210
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAME ім'я суперкористувача бази даних\n"
+
+#: initdb.c:2211
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt запитувати пароль нового суперкористувача\n"
+
+#: initdb.c:2212
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR розташування журналу попереднього запису\n"
+
+#: initdb.c:2213
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE розмір сегментів WAL у мегабайтах\n"
+
+#: initdb.c:2214
+#, c-format
+msgid "\n"
+"Less commonly used options:\n"
+msgstr "\n"
+"Рідковживані параметри:\n"
+
+#: initdb.c:2215
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug генерувати багато налагоджувальних повідомлень\n"
+
+#: initdb.c:2216
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches встановити debug_discard_caches=1\n"
+
+#: initdb.c:2217
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORY розташування вхідних файлів\n"
+
+#: initdb.c:2218
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean не очищувати після помилок\n"
+" \n"
+
+#: initdb.c:2219
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync не чекати на безпечний запис змін на диск\n"
+
+#: initdb.c:2220
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions не друкувати інструкції для наступних кроків\n"
+
+#: initdb.c:2221
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show показати внутрішні налаштування\n"
+
+#: initdb.c:2222
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only лише синхронізувати файли бази даних на диск, потім вийти\n"
+
+#: initdb.c:2223
+#, c-format
+msgid "\n"
+"Other options:\n"
+msgstr "\n"
+"Інші параметри:\n"
+
+#: initdb.c:2224
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію і вийти\n"
+
+#: initdb.c:2225
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: initdb.c:2226
+#, c-format
+msgid "\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr "\n"
+"Якщо каталог даних не вказано, використовується змінна середовища PGDATA.\n"
+
+#: initdb.c:2228
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"Повідомляти про помилки на <%s>.\n"
+
+#: initdb.c:2229
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: initdb.c:2257
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "неприпустимий спосіб автентифікації \"%s\" для \"%s\" підключення"
+
+#: initdb.c:2271
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "необхідно вказати пароль суперкористувача для активації автентифікації за допомогою пароля"
+
+#: initdb.c:2290
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог даних не вказано"
+
+#: initdb.c:2291
+#, c-format
+msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA."
+msgstr "Ви повинні зазначити каталог, де будуть зберігатися дані цієї системи баз даних. Зробіть це або параметром -D, або змінною середовища PGDATA."
+
+#: initdb.c:2308
+#, c-format
+msgid "could not set environment"
+msgstr "не вдалося встановити середовище"
+
+#: initdb.c:2326
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "програма \"%s\" потрібна для %s, але не знайдена в тому ж каталозі, що й \"%s\""
+
+#: initdb.c:2329
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "програма \"%s\" знайдена для \"%s\", але має відмінну версію від %s"
+
+#: initdb.c:2344
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "розташування вхідного файлу має бути абсолютним шляхом"
+
+#: initdb.c:2361
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "Кластер бази даних буде ініціалізовано з локалізацією \"%s\".\n"
+
+#: initdb.c:2364
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "Кластер бази даних буде ініціалізовано з локалізацією:\n"
+
+#: initdb.c:2365
+#, c-format
+msgid " provider: %s\n"
+msgstr " постачальник: %s\n"
+
+#: initdb.c:2367
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " Локаль ICU: %s\n"
+
+#: initdb.c:2368
+#, c-format
+msgid " LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr " LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2385
+#, c-format
+msgid "The default database encoding has been set to \"%s\".\n"
+msgstr "Кодування бази даних за замовчуванням встановлено на \"%s.\n"
+
+#: initdb.c:2397
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "не вдалося знайти відповідне кодування для локалі \"%s\""
+
+#: initdb.c:2399
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "Перезапустіть %s з параметром -E."
+
+#: initdb.c:2400 initdb.c:3021 initdb.c:3041
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" для додаткової інформації."
+
+#: initdb.c:2412
+#, c-format
+msgid "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr "Кодування \"%s\", що очікується локалізацією, не дозволено у якості кодування сервера.\n"
+"Замість нього буде встановлене кодування \"%s\" за замовчуванням.\n"
+
+#: initdb.c:2417
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "локалізація \"%s\" потребує кодування \"%s\", що не підтримується"
+
+#: initdb.c:2419
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "Кодування \"%s\" не допускається як кодування сервера."
+
+#: initdb.c:2421
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "Перезапустіть %s з іншим вибором локалі."
+
+#: initdb.c:2429
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "Кодування бази даних за замовчуванням встановлено: \"%s\".\n"
+
+#: initdb.c:2498
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "не вдалося знайти відповідну конфігурацію текстового пошуку для локалі\"%s\""
+
+#: initdb.c:2509
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "відповідна конфігурація текстового пошуку для локалі \"%s\" невідома"
+
+#: initdb.c:2514
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "вказана конфігурація текстового пошуку \"%s\" може не підходити локалі \"%s\""
+
+#: initdb.c:2519
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "Конфігурація текстового пошуку за замовчуванням буде встановлена в \"%s\".\n"
+
+#: initdb.c:2562 initdb.c:2633
+#, c-format
+msgid "creating directory %s ... "
+msgstr "створення каталогу %s... "
+
+#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не вдалося створити каталог \"%s\": %m"
+
+#: initdb.c:2576 initdb.c:2648
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "виправляю дозволи для створеного каталогу %s... "
+
+#: initdb.c:2581 initdb.c:2653
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "не вдалося змінити дозволи каталогу \"%s\": %m"
+
+#: initdb.c:2593 initdb.c:2665
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "каталог \"%s\" існує, але він не порожній"
+
+#: initdb.c:2597
+#, c-format
+msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"."
+msgstr "Якщо ви хочете створити нову систему бази даних, видаліть або очистіть каталог \"%s\", або запустіть %s з аргументом, відмінним від \"%s\"."
+
+#: initdb.c:2605 initdb.c:2675 initdb.c:3058
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "немає доступу до каталогу \"%s\": %m"
+
+#: initdb.c:2626
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "розташування WAL каталогу має бути абсолютним шляхом"
+
+#: initdb.c:2669
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "Якщо ви хочете зберігати дані з WAL там, потрібно видалити або очистити директорію \"%s\"."
+
+#: initdb.c:2680
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "не вдалося створити символічне послання \"%s\": %m"
+
+#: initdb.c:2683
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "символічні посилання не підтримуються цією платформою"
+
+#: initdb.c:2702
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "Він містить файл з крапкою або невидимий файл, можливо це точка під'єднання."
+
+#: initdb.c:2704
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Він містить каталог lost+found, можливо це точка під'єднання."
+
+#: initdb.c:2706
+#, c-format
+msgid "Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr "Не рекомендується використовувати точку під'єднання у якості каталогу даних.\n"
+"Створіть підкаталог і використайте його."
+
+#: initdb.c:2732
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "створення підкаталогів... "
+
+#: initdb.c:2775
+msgid "performing post-bootstrap initialization ... "
+msgstr "виконується кінцева фаза ініціалізації ... "
+
+#: initdb.c:2940
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Виконується у режимі налагодження.\n"
+
+#: initdb.c:2944
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "Виконується у режимі 'no-clean'. Помилки не будуть виправлені.\n"
+
+#: initdb.c:3014
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "нерозпізнаний постачальник локалів: %s"
+
+#: initdb.c:3039
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному рядку (перший \"%s\")"
+
+#: initdb.c:3046
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s не може бути вказано, поки не буде обрано постачальник локалі \"%s\""
+
+#: initdb.c:3060 initdb.c:3137
+msgid "syncing data to disk ... "
+msgstr "синхронізація даних з диском ... "
+
+#: initdb.c:3068
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "неможливо вказати одночасно пароль і файл паролю"
+
+#: initdb.c:3090
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "аргумент --wal-segsize повинен бути числом"
+
+#: initdb.c:3092
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "аргумент --wal-segsize повинен бути ступенем 2 між 1 і 1024"
+
+#: initdb.c:3106
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "неприпустиме ім'я суперкористувача \"%s\"; імена ролей не можуть починатися на \"pg_\""
+
+#: initdb.c:3108
+#, c-format
+msgid "The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n\n"
+msgstr "Файли цієї бази даних будуть належати користувачеві \"%s\".\n"
+"Від імені цього користувача повинен запускатися процес сервера.\n\n"
+
+#: initdb.c:3124
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Контроль цілісності сторінок даних увімкнено.\n"
+
+#: initdb.c:3126
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Контроль цілісності сторінок даних вимкнено.\n"
+
+#: initdb.c:3143
+#, c-format
+msgid "\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr "\n"
+"Синхронізація з диском пропущена.\n"
+"Каталог з даними може бути пошкоджено під час аварійного завершення роботи операційної системи.\n"
+
+#: initdb.c:3148
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "увімкнення автентифікації \"довіри\" для локальних підключень"
+
+#: initdb.c:3149
+#, c-format
+msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb."
+msgstr "Ви можете змінити це, змінивши pg_hba.conf або скориставшись опцією -A, або --auth-local і --auth-host, наступного разу, коли ви запускаєте initdb."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3179
+msgid "logfile"
+msgstr "logfile"
+
+#: initdb.c:3181
+#, c-format
+msgid "\n"
+"Success. You can now start the database server using:\n\n"
+" %s\n\n"
+msgstr "\n"
+"Готово. Тепер ви можете запустити сервер бази даних командою:\n\n"
+" %s\n\n"
+
diff --git a/src/bin/initdb/po/zh_CN.po b/src/bin/initdb/po/zh_CN.po
new file mode 100644
index 0000000..9876679
--- /dev/null
+++ b/src/bin/initdb/po/zh_CN.po
@@ -0,0 +1,1004 @@
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:47+0000\n"
+"PO-Revision-Date: 2021-08-15 18:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.7\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的: "
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "无法确认当前目录: %m"
+
+#: ../../common/exec.c:155
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "无效的二进制码 \"%s\""
+
+#: ../../common/exec.c:205
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "无法读取二进制码 \"%s\""
+
+#: ../../common/exec.c:213
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "未能找到一个 \"%s\" 来执行"
+
+#: ../../common/exec.c:269 ../../common/exec.c:308
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "无法跳转到目录 \"%s\" 中: %m"
+
+#: ../../common/exec.c:286
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "无法读取符号链接 \"%s\": %m"
+
+#: ../../common/exec.c:409
+msgid "%s() failed: %m"
+msgstr "%s()失败: %m"
+
+#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659
+#: initdb.c:331
+#, c-format
+msgid "out of memory"
+msgstr "内存不足"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "内存不足\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "无法复制空指针 (内部错误)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "无法取文件 \"%s\" 的状态: %m"
+
+#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "无法打开目录 \"%s\": %m"
+
+#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "无法读取目录 \"%s\": %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "无法打开文件 \"%s\": %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "无法 fsync 文件 \"%s\": %m"
+
+#: ../../common/file_utils.c:383
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "无法把文件 \"%s\" 重命名为 \"%s\": %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "无法关闭目录 \"%s\": %m"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "无法加载库 \"%s\": 错误码 %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "无法为该平台创建受限制的令牌:错误码 %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "无法打开进程令牌 (token): 错误码 %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "无法分配SID: 错误码 %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "无法创建受限令牌: 错误码为 %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "无法为命令 \"%s\"创建进程: 错误码 %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "无法使用受限令牌再次执行: 错误码 %lu"
+
+#: ../../common/restricted_token.c:194
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "无法从子进程得到退出码: 错误码 %lu"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "无法统计文件或目录\"%s\": %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "无法删除文件或目录 \"%s\": %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "无法找到有效的用户ID %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "用户不存在"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "用户名查找失败:错误代码%lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "无法执行命令"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "命令没有找到"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "子进程已退出, 退出码为 %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "子进程被例外(exception) 0x%X 终止"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "子进程被信号 %d 终止: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "子进程已退出, 未知状态 %d"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "无法为 \"%s\"设置连接: %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "无法为\"%s\"得到连接: %s\n"
+
+#: initdb.c:464 initdb.c:1496
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "为了读取, 无法打开文件 \"%s\": %m"
+
+#: initdb.c:508 initdb.c:830 initdb.c:856
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "为了写入, 无法打开文件 \"%s\": %m"
+
+#: initdb.c:515 initdb.c:522 initdb.c:836 initdb.c:861
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "无法写入文件 \"%s\": %m"
+
+#: initdb.c:540
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "无法执行命令 \"%s\": %m"
+
+#: initdb.c:558
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "删除数据目录 \"%s\""
+
+#: initdb.c:560
+#, c-format
+msgid "failed to remove data directory"
+msgstr "删除数据目录失败"
+
+#: initdb.c:564
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "删除数据目录 \"%s\" 的内容"
+
+#: initdb.c:567
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "删除数据目录内容失败"
+
+#: initdb.c:572
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "正在删除WAL目录\"%s\""
+
+#: initdb.c:574
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "删除WAL目录失败"
+
+#: initdb.c:578
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "正在删除WAL目录 \"%s\" 的内容"
+
+#: initdb.c:580
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "删除WAL目录内容失败"
+
+#: initdb.c:587
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "在用户的要求下数据库目录 \"%s\" 不被删除"
+
+#: initdb.c:591
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "在用户的要求下WAL目录 \"%s\" 不被删除"
+
+#: initdb.c:609
+#, c-format
+msgid "cannot be run as root"
+msgstr "不能使用root用户运行"
+
+#: initdb.c:611
+#, c-format
+msgid ""
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"请以服务器进程所有者的用户 (无特权) 身份\n"
+"登陆 (使用, e.g., \"su\").\n"
+
+#: initdb.c:644
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" 不是一个有效的服务器编码名字"
+
+#: initdb.c:789
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "文件 \"%s\" 不存在"
+
+#: initdb.c:791 initdb.c:798 initdb.c:807
+#, c-format
+msgid ""
+"This might mean you have a corrupted installation or identified\n"
+"the wrong directory with the invocation option -L.\n"
+msgstr ""
+"这意味着您的安装发生了错误或\n"
+"使用 -L 选项指定了错误的路径.\n"
+
+#: initdb.c:796
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "无法访问文件 \"%s\": %m"
+
+#: initdb.c:805
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "文件 \"%s\" 不是常规文件"
+
+#: initdb.c:950
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "选择动态共享内存实现 ......"
+
+#: initdb.c:959
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "选择默认最大联接数 (max_connections) ... "
+
+#: initdb.c:990
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "选择默认共享缓冲区大小 (shared_buffers) ... "
+
+#: initdb.c:1024
+msgid "selecting default time zone ... "
+msgstr "选择默认时区 ... "
+
+#: initdb.c:1058
+msgid "creating configuration files ... "
+msgstr "创建配置文件 ... "
+
+#: initdb.c:1217 initdb.c:1236 initdb.c:1322 initdb.c:1337
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "无法改变\"%s\"的权限: %m"
+
+#: initdb.c:1359
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "正在运行自举脚本 ..."
+
+#: initdb.c:1371
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "输入文件 \"%s\" 不属于PostgreSQL %s"
+
+#: initdb.c:1374
+#, c-format
+msgid "Check your installation or specify the correct path using the option -L.\n"
+msgstr "检查你的安装或使用 -L 选项指定正确的路径.\n"
+
+#: initdb.c:1473
+msgid "Enter new superuser password: "
+msgstr "输入新的超级用户口令: "
+
+#: initdb.c:1474
+msgid "Enter it again: "
+msgstr "再输入一遍: "
+
+#: initdb.c:1477
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "口令不匹配.\n"
+
+#: initdb.c:1504
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "无法从文件 \"%s\" 读取口令: %m"
+
+#: initdb.c:1507
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "口令文件\"%s\"为空"
+
+#: initdb.c:1998
+#, c-format
+msgid "caught signal\n"
+msgstr "捕获信号\n"
+
+#: initdb.c:2004
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "无法写到子进程: %s\n"
+
+#: initdb.c:2012
+#, c-format
+msgid "ok\n"
+msgstr "成功\n"
+
+#: initdb.c:2102
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale()调用失败"
+
+#: initdb.c:2123
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "还原旧区域\"%s\"失败"
+
+#: initdb.c:2132
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "无效的语言环境名称 \"%s\""
+
+#: initdb.c:2143
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "无效的本地化设置; 请检查环境变量LANG和LC_*的值"
+
+#: initdb.c:2170
+#, c-format
+msgid "encoding mismatch"
+msgstr "编码不匹配"
+
+#: initdb.c:2172
+#, c-format
+msgid ""
+"The encoding you selected (%s) and the encoding that the\n"
+"selected locale uses (%s) do not match. This would lead to\n"
+"misbehavior in various character string processing functions.\n"
+"Rerun %s and either do not specify an encoding explicitly,\n"
+"or choose a matching combination.\n"
+msgstr ""
+"您选择的编码 (%s) 和所选择的语言环境使用的编码 (%s) 不匹配的.\n"
+"这样将导致处理不同字符串的函数时产生错误.\n"
+"要修复此问题, 重新运行 %s 并且不要明确指定编码, 或者先选择一个匹配\n"
+"组合类型.\n"
+"\n"
+
+#: initdb.c:2244
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s 初始化一个 PostgreSQL 数据库簇.\n"
+"\n"
+
+#: initdb.c:2245
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: initdb.c:2246
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [选项]... [DATADIR]\n"
+
+#: initdb.c:2247
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"选项:\n"
+
+#: initdb.c:2248
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=METHOD 本地连接的默认认证方法\n"
+
+#: initdb.c:2249
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=METHOD 本地的TCP/IP连接的默认认证方法\n"
+
+#: initdb.c:2250
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=METHOD 本地socket连接的默认认证方法\n"
+
+#: initdb.c:2251
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " -D, --pgdata=DATADIR 当前数据库簇的位置\n"
+
+#: initdb.c:2252
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=ENCODING 为新数据库设置默认编码\n"
+
+#: initdb.c:2253
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access 允许组对数据目录进行读/执行\n"
+
+#: initdb.c:2254
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums 使用数据页产生效验和\n"
+
+#: initdb.c:2255
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE 为新数据库设置默认语言环境\n"
+
+#: initdb.c:2256
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate, --lc-ctype, --lc-messages=LOCALE\n"
+" --lc-monetary, --lc-numeric, --lc-time=LOCALE\n"
+" 为新的数据库簇在各自的目录中分别\n"
+" 设定缺省语言环境(默认使用环境变量)\n"
+
+#: initdb.c:2260
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale 等同于 --locale=C\n"
+
+#: initdb.c:2261
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=FILE 对于新的超级用户从文件读取口令\n"
+
+#: initdb.c:2262
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" 缺省的文本搜索配置\n"
+
+#: initdb.c:2264
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAME 数据库超级用户名\n"
+
+#: initdb.c:2265
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt 对于新的超级用户提示输入口令\n"
+
+#: initdb.c:2266
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR 预写日志目录的位置\n"
+
+#: initdb.c:2267
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE WAL段的大小(兆字节)\n"
+
+#: initdb.c:2268
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"非普通使用选项:\n"
+
+#: initdb.c:2269
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug 产生大量的除错信息\n"
+
+#: initdb.c:2270
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches 设置debug_discard_caches=1\n"
+
+#: initdb.c:2271
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORY 输入文件的位置\n"
+
+#: initdb.c:2272
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean 出错后不清理\n"
+
+#: initdb.c:2273
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync 不用等待变化安全写入磁盘\n"
+
+#: initdb.c:2274
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions 不要打印后续步骤的说明\n"
+
+#: initdb.c:2275
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show 显示内部设置\n"
+
+#: initdb.c:2276
+#, c-format
+msgid " -S, --sync-only only sync data directory\n"
+msgstr " -S, --sync-only 只同步数据目录\n"
+
+#: initdb.c:2277
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"其它选项:\n"
+
+#: initdb.c:2278
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信息, 然后退出\n"
+
+#: initdb.c:2279
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然后退出\n"
+
+#: initdb.c:2280
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"如果没有指定数据目录, 将使用环境变量 PGDATA\n"
+
+#: initdb.c:2282
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: initdb.c:2283
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: initdb.c:2311
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "无效认证方法 \"%s\" 用于 \"%s\" 连接"
+
+#: initdb.c:2327
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "为了启动密码认证, 你需要为超级用户指定一个口令"
+
+#: initdb.c:2348
+#, c-format
+msgid "no data directory specified"
+msgstr "没有指定数据目录"
+
+#: initdb.c:2350
+#, c-format
+msgid ""
+"You must identify the directory where the data for this database system\n"
+"will reside. Do this with either the invocation option -D or the\n"
+"environment variable PGDATA.\n"
+msgstr ""
+"您必须确认此数据库系统的数据所在目录\n"
+"存在. 使用 -D 选项或者\n"
+"环境变量 PGDATA.\n"
+
+#: initdb.c:2368
+msgid "could not set environment"
+msgstr "无法设置环境"
+
+#: initdb.c:2388
+#, c-format
+msgid ""
+"The program \"%s\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation."
+msgstr ""
+"%2$s需要程序\"%1$s\"\n"
+"但在与\"%3$s\"相同的目录中找不到该程序.\n"
+"检查您的安装."
+
+#: initdb.c:2393
+#, c-format
+msgid ""
+"The program \"%s\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation."
+msgstr ""
+"程序\"%s\"是由\"%s\"找到的\n"
+"但与%s的版本不同.\n"
+"检查您的安装."
+
+#: initdb.c:2412
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "输入文件位置必须为绝对路径"
+
+#: initdb.c:2429
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "数据库簇将使用本地化语言 \"%s\"进行初始化.\n"
+
+#: initdb.c:2432
+#, c-format
+msgid ""
+"The database cluster will be initialized with locales\n"
+" COLLATE: %s\n"
+" CTYPE: %s\n"
+" MESSAGES: %s\n"
+" MONETARY: %s\n"
+" NUMERIC: %s\n"
+" TIME: %s\n"
+msgstr ""
+"数据库簇将带有一下 locales 初始化\n"
+" COLLATE: %s\n"
+" CTYPE: %s\n"
+" MESSAGES: %s\n"
+" MONETARY: %s\n"
+" NUMERIC: %s\n"
+" TIME: %s\n"
+
+#: initdb.c:2456
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "无法为locale(本地化语言)\"%s\"找到合适的编码"
+
+#: initdb.c:2458
+#, c-format
+msgid "Rerun %s with the -E option.\n"
+msgstr "带 -E 选项重新运行 %s.\n"
+
+#: initdb.c:2459 initdb.c:3099 initdb.c:3120
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获取更多的信息.\n"
+
+#: initdb.c:2472
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"本地化隐含的编码 \"%s\" 不允许作为服务器端的编码.\n"
+"默认的数据库编码将采用 \"%s\" 作为代替.\n"
+
+#: initdb.c:2477
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "本地化语言环境 \"%s\"要求使用不支持的编码\"%s\""
+
+#: initdb.c:2480
+#, c-format
+msgid ""
+"Encoding \"%s\" is not allowed as a server-side encoding.\n"
+"Rerun %s with a different locale selection.\n"
+msgstr ""
+"不允许将编码\"%s\"作为服务器端编码.\n"
+"使用一个不同的本地化语言环境重新运行%s.\n"
+
+#: initdb.c:2489
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "默认的数据库编码已经相应的设置为 \"%s\".\n"
+
+#: initdb.c:2555
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "无法为本地化语言环境\"%s\"找到合适的文本搜索配置"
+
+#: initdb.c:2566
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "对于本地化语言环境\"%s\"合适的文本搜索配置未知"
+
+#: initdb.c:2571
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "所指定的文本搜索配置\"%s\"可能与本地语言环境\"%s\"不匹配"
+
+#: initdb.c:2576
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "缺省的文本搜索配置将会被设置到\"%s\"\n"
+
+#: initdb.c:2620 initdb.c:2702
+#, c-format
+msgid "creating directory %s ... "
+msgstr "创建目录 %s ... "
+
+#: initdb.c:2626 initdb.c:2708 initdb.c:2773 initdb.c:2835
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "无法创建目录 \"%s\": %m"
+
+#: initdb.c:2637 initdb.c:2720
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "修复已存在目录 %s 的权限 ... "
+
+#: initdb.c:2643 initdb.c:2726
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "无法改变目录 \"%s\" 的权限: %m"
+
+#: initdb.c:2657 initdb.c:2740
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "目录\"%s\"已存在,但不是空的"
+
+#: initdb.c:2662
+#, c-format
+msgid ""
+"If you want to create a new database system, either remove or empty\n"
+"the directory \"%s\" or run %s\n"
+"with an argument other than \"%s\".\n"
+msgstr ""
+"如果您想创建一个新的数据库系统, 请删除或清空\n"
+"目录 \"%s\" 或者运行带参数的 %s\n"
+"而不是 \"%s\".\n"
+
+#: initdb.c:2670 initdb.c:2752 initdb.c:3135
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "无法访问目录 \"%s\": %m"
+
+#: initdb.c:2693
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL目录的位置必须为绝对路径"
+
+#: initdb.c:2745
+#, c-format
+msgid ""
+"If you want to store the WAL there, either remove or empty the directory\n"
+"\"%s\".\n"
+msgstr "如果您要存储WAL日志,需要删除或者清空目录\"%s\".\n"
+
+#: initdb.c:2759
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "无法创建符号链接 \"%s\": %m"
+
+#: initdb.c:2764
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "在这个平台上不支持符号链接"
+
+#: initdb.c:2788
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.\n"
+msgstr "它包含一个不可见的带固定点的文件,可能因为它是一个装载点。\n"
+
+#: initdb.c:2791
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point.\n"
+msgstr "它包含名为lost+found的目录,可能因为它是一个加载点.\n"
+
+#: initdb.c:2794
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point.\n"
+msgstr ""
+"不推荐将加载点作为数据目录.\n"
+"通常在加载点下边创建一个子目录.\n"
+
+#: initdb.c:2820
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "正在创建子目录 ... "
+
+#: initdb.c:2866
+msgid "performing post-bootstrap initialization ... "
+msgstr "正在执行自举后初始化 ..."
+
+#: initdb.c:3029
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "运行在除错模式中. \n"
+
+#: initdb.c:3033
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "运行在 no-clean 模式中. 错误将不被清理.\n"
+
+#: initdb.c:3118
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行参数太多 (第一个是 \"%s\")"
+
+#: initdb.c:3139 initdb.c:3228
+msgid "syncing data to disk ... "
+msgstr "同步数据到磁盘..."
+
+#: initdb.c:3148
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "口令提示和口令文件不能同时都指定"
+
+#: initdb.c:3173
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segsize的参数必须是一个数字"
+
+#: initdb.c:3178
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "--wal-segsize的参数必须是2的幂次方(在1和1024之间)"
+
+#: initdb.c:3195
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "超级用户名\"%s\"是不允许的;角色名称不能以\"pg_\"开始"
+
+#: initdb.c:3199
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"属于此数据库系统的文件宿主为用户 \"%s\".\n"
+"此用户也必须为服务器进程的宿主.\n"
+
+#: initdb.c:3215
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "允许生成数据页校验和.\n"
+
+#: initdb.c:3217
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "禁止为数据页生成校验和.\n"
+
+#: initdb.c:3234
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"跳过同步到磁盘操作.\n"
+"如果操作系统宕机,数据目录可能会毁坏.\n"
+
+#: initdb.c:3239
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "为本地连接启用\"trust\"身份验证"
+
+#: initdb.c:3240
+#, c-format
+msgid ""
+"You can change this by editing pg_hba.conf or using the option -A, or\n"
+"--auth-local and --auth-host, the next time you run initdb.\n"
+msgstr ""
+"你可以通过编辑 pg_hba.conf 更改或你下次\n"
+"执行 initdb 时使用 -A或者--auth-local和--auth-host选项.\n"
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3270
+msgid "logfile"
+msgstr "日志文件"
+
+#: initdb.c:3272
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"成功。您现在可以用下面的命令开启数据库服务器:\n"
+"\n"
+" %s\n"
+"\n"
+
diff --git a/src/bin/initdb/t/001_initdb.pl b/src/bin/initdb/t/001_initdb.pl
new file mode 100644
index 0000000..164fc11
--- /dev/null
+++ b/src/bin/initdb/t/001_initdb.pl
@@ -0,0 +1,150 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+# To test successful data directory creation with an additional feature, first
+# try to elaborate the "successful creation" test instead of adding a test.
+# Successful initdb consumes much time and I/O.
+
+use strict;
+use warnings;
+use Fcntl ':mode';
+use File::stat qw{lstat};
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+my $xlogdir = "$tempdir/pgxlog";
+my $datadir = "$tempdir/data";
+
+program_help_ok('initdb');
+program_version_ok('initdb');
+program_options_handling_ok('initdb');
+
+command_fails([ 'initdb', '-S', "$tempdir/nonexistent" ],
+ 'sync missing data directory');
+
+mkdir $xlogdir;
+mkdir "$xlogdir/lost+found";
+command_fails(
+ [ 'initdb', '-X', $xlogdir, $datadir ],
+ 'existing nonempty xlog directory');
+rmdir "$xlogdir/lost+found";
+command_fails(
+ [ 'initdb', '-X', 'pgxlog', $datadir ],
+ 'relative xlog directory not allowed');
+
+command_fails(
+ [ 'initdb', '-U', 'pg_test', $datadir ],
+ 'role names cannot begin with "pg_"');
+
+mkdir $datadir;
+
+# make sure we run one successful test without a TZ setting so we test
+# initdb's time zone setting code
+{
+
+ # delete local only works from perl 5.12, so use the older way to do this
+ local (%ENV) = %ENV;
+ delete $ENV{TZ};
+
+ command_ok([ 'initdb', '-N', '-T', 'german', '-X', $xlogdir, $datadir ],
+ 'successful creation');
+
+ # Permissions on PGDATA should be default
+ SKIP:
+ {
+ skip "unix-style permissions not supported on Windows", 1
+ if ($windows_os);
+
+ ok(check_mode_recursive($datadir, 0700, 0600),
+ "check PGDATA permissions");
+ }
+}
+
+# Control file should tell that data checksums are disabled by default.
+command_like(
+ [ 'pg_controldata', $datadir ],
+ qr/Data page checksum version:.*0/,
+ 'checksums are disabled in control file');
+# pg_checksums fails with checksums disabled by default. This is
+# not part of the tests included in pg_checksums to save from
+# the creation of an extra instance.
+command_fails([ 'pg_checksums', '-D', $datadir ],
+ "pg_checksums fails with data checksum disabled");
+
+command_ok([ 'initdb', '-S', $datadir ], 'sync only');
+command_fails([ 'initdb', $datadir ], 'existing data directory');
+
+# Check group access on PGDATA
+SKIP:
+{
+ skip "unix-style permissions not supported on Windows", 2
+ if ($windows_os);
+
+ # Init a new db with group access
+ my $datadir_group = "$tempdir/data_group";
+
+ command_ok(
+ [ 'initdb', '-g', $datadir_group ],
+ 'successful creation with group access');
+
+ ok(check_mode_recursive($datadir_group, 0750, 0640),
+ 'check PGDATA permissions');
+}
+
+# Locale provider tests
+
+if ($ENV{with_icu} eq 'yes')
+{
+ command_fails_like(
+ [ 'initdb', '--no-sync', '--locale-provider=icu', "$tempdir/data2" ],
+ qr/initdb: error: ICU locale must be specified/,
+ 'locale provider ICU requires --icu-locale');
+
+ command_ok(
+ [
+ 'initdb', '--no-sync',
+ '--locale-provider=icu', '--icu-locale=en',
+ "$tempdir/data3"
+ ],
+ 'option --icu-locale');
+
+ command_fails_like(
+ [
+ 'initdb', '--no-sync',
+ '--locale-provider=icu', '--icu-locale=@colNumeric=lower',
+ "$tempdir/dataX"
+ ],
+ qr/FATAL: could not open collator for locale/,
+ 'fails for invalid ICU locale');
+
+ command_fails_like(
+ [
+ 'initdb', '--no-sync',
+ '--locale-provider=icu', '--encoding=SQL_ASCII',
+ '--icu-locale=en', "$tempdir/dataX"
+ ],
+ qr/error: encoding mismatch/,
+ 'fails for encoding not supported by ICU');
+}
+else
+{
+ command_fails(
+ [ 'initdb', '--no-sync', '--locale-provider=icu', "$tempdir/data2" ],
+ 'locale provider ICU fails since no ICU support');
+}
+
+command_fails(
+ [ 'initdb', '--no-sync', '--locale-provider=xyz', "$tempdir/dataX" ],
+ 'fails for invalid locale provider');
+
+command_fails(
+ [
+ 'initdb', '--no-sync',
+ '--locale-provider=libc', '--icu-locale=en',
+ "$tempdir/dataX"
+ ],
+ 'fails for invalid option combination');
+
+done_testing();
diff --git a/src/bin/pg_amcheck/.gitignore b/src/bin/pg_amcheck/.gitignore
new file mode 100644
index 0000000..c21a14d
--- /dev/null
+++ b/src/bin/pg_amcheck/.gitignore
@@ -0,0 +1,3 @@
+pg_amcheck
+
+/tmp_check/
diff --git a/src/bin/pg_amcheck/Makefile b/src/bin/pg_amcheck/Makefile
new file mode 100644
index 0000000..d0cc298
--- /dev/null
+++ b/src/bin/pg_amcheck/Makefile
@@ -0,0 +1,51 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_amcheck
+#
+# Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/bin/pg_amcheck/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_amcheck - detect corruption within database relations"
+PGAPPICON=win32
+
+EXTRA_INSTALL=contrib/amcheck contrib/pageinspect
+
+subdir = src/bin/pg_amcheck
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+OBJS = \
+ $(WIN32RES) \
+ pg_amcheck.o
+
+all: pg_amcheck
+
+pg_amcheck: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_amcheck$(X) '$(DESTDIR)$(bindir)/pg_amcheck$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_amcheck$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_amcheck$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_amcheck/README b/src/bin/pg_amcheck/README
new file mode 100644
index 0000000..dd6f0c5
--- /dev/null
+++ b/src/bin/pg_amcheck/README
@@ -0,0 +1,21 @@
+src/bin/pg_amcheck/README
+
+pg_amcheck is a command-line tool for running the amcheck extension.
+
+Running the regression tests
+============================
+
+NOTE: You must have given the --enable-tap-tests argument to configure.
+Also, to use "make installcheck", you must have built and installed
+contrib/amcheck and contrib/pageinspect in addition to the core code.
+
+Run
+ make check
+or
+ make installcheck
+You can use "make installcheck" if you previously did "make install".
+In that case, the code in the installation tree is tested. With
+"make check", a temporary installation tree is built from the current
+sources and then tested.
+
+See src/test/perl/README for more info about running these tests.
diff --git a/src/bin/pg_amcheck/nls.mk b/src/bin/pg_amcheck/nls.mk
new file mode 100644
index 0000000..9fc47f8
--- /dev/null
+++ b/src/bin/pg_amcheck/nls.mk
@@ -0,0 +1,13 @@
+# src/bin/pg_amcheck/nls.mk
+CATALOG_NAME = pg_amcheck
+AVAIL_LANGUAGES = de el es fr it ja ka ko ru sv uk zh_CN
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ pg_amcheck.c \
+ ../../fe_utils/cancel.c \
+ ../../fe_utils/connect_utils.c \
+ ../../fe_utils/option_utils.c \
+ ../../fe_utils/query_utils.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \
+ log_no_match
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \
+ log_no_match:1:c-format
diff --git a/src/bin/pg_amcheck/pg_amcheck.c b/src/bin/pg_amcheck/pg_amcheck.c
new file mode 100644
index 0000000..6a83fae
--- /dev/null
+++ b/src/bin/pg_amcheck/pg_amcheck.c
@@ -0,0 +1,2177 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_amcheck.c
+ * Detects corruption within database relations.
+ *
+ * Copyright (c) 2017-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_amcheck/pg_amcheck.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <limits.h>
+#include <time.h>
+
+#include "catalog/pg_am_d.h"
+#include "catalog/pg_namespace_d.h"
+#include "common/logging.h"
+#include "common/username.h"
+#include "fe_utils/cancel.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/parallel_slot.h"
+#include "fe_utils/query_utils.h"
+#include "fe_utils/simple_list.h"
+#include "fe_utils/string_utils.h"
+#include "getopt_long.h" /* pgrminclude ignore */
+#include "pgtime.h"
+#include "storage/block.h"
+
+typedef struct PatternInfo
+{
+ const char *pattern; /* Unaltered pattern from the command line */
+ char *db_regex; /* Database regexp parsed from pattern, or
+ * NULL */
+ char *nsp_regex; /* Schema regexp parsed from pattern, or NULL */
+ char *rel_regex; /* Relation regexp parsed from pattern, or
+ * NULL */
+ bool heap_only; /* true if rel_regex should only match heap
+ * tables */
+ bool btree_only; /* true if rel_regex should only match btree
+ * indexes */
+ bool matched; /* true if the pattern matched in any database */
+} PatternInfo;
+
+typedef struct PatternInfoArray
+{
+ PatternInfo *data;
+ size_t len;
+} PatternInfoArray;
+
+/* pg_amcheck command line options controlled by user flags */
+typedef struct AmcheckOptions
+{
+ bool dbpattern;
+ bool alldb;
+ bool echo;
+ bool verbose;
+ bool strict_names;
+ bool show_progress;
+ int jobs;
+
+ /*
+ * Whether to install missing extensions, and optionally the name of the
+ * schema in which to install the extension's objects.
+ */
+ bool install_missing;
+ char *install_schema;
+
+ /* Objects to check or not to check, as lists of PatternInfo structs. */
+ PatternInfoArray include;
+ PatternInfoArray exclude;
+
+ /*
+ * As an optimization, if any pattern in the exclude list applies to heap
+ * tables, or similarly if any such pattern applies to btree indexes, or
+ * to schemas, then these will be true, otherwise false. These should
+ * always agree with what you'd conclude by grep'ing through the exclude
+ * list.
+ */
+ bool excludetbl;
+ bool excludeidx;
+ bool excludensp;
+
+ /*
+ * If any inclusion pattern exists, then we should only be checking
+ * matching relations rather than all relations, so this is true iff
+ * include is empty.
+ */
+ bool allrel;
+
+ /* heap table checking options */
+ bool no_toast_expansion;
+ bool reconcile_toast;
+ bool on_error_stop;
+ int64 startblock;
+ int64 endblock;
+ const char *skip;
+
+ /* btree index checking options */
+ bool parent_check;
+ bool rootdescend;
+ bool heapallindexed;
+
+ /* heap and btree hybrid option */
+ bool no_btree_expansion;
+} AmcheckOptions;
+
+static AmcheckOptions opts = {
+ .dbpattern = false,
+ .alldb = false,
+ .echo = false,
+ .verbose = false,
+ .strict_names = true,
+ .show_progress = false,
+ .jobs = 1,
+ .install_missing = false,
+ .install_schema = "pg_catalog",
+ .include = {NULL, 0},
+ .exclude = {NULL, 0},
+ .excludetbl = false,
+ .excludeidx = false,
+ .excludensp = false,
+ .allrel = true,
+ .no_toast_expansion = false,
+ .reconcile_toast = true,
+ .on_error_stop = false,
+ .startblock = -1,
+ .endblock = -1,
+ .skip = "none",
+ .parent_check = false,
+ .rootdescend = false,
+ .heapallindexed = false,
+ .no_btree_expansion = false
+};
+
+static const char *progname = NULL;
+
+/* Whether all relations have so far passed their corruption checks */
+static bool all_checks_pass = true;
+
+/* Time last progress report was displayed */
+static pg_time_t last_progress_report = 0;
+static bool progress_since_last_stderr = false;
+
+typedef struct DatabaseInfo
+{
+ char *datname;
+ char *amcheck_schema; /* escaped, quoted literal */
+} DatabaseInfo;
+
+typedef struct RelationInfo
+{
+ const DatabaseInfo *datinfo; /* shared by other relinfos */
+ Oid reloid;
+ bool is_heap; /* true if heap, false if btree */
+ char *nspname;
+ char *relname;
+ int relpages;
+ int blocks_to_check;
+ char *sql; /* set during query run, pg_free'd after */
+} RelationInfo;
+
+/*
+ * Query for determining if contrib's amcheck is installed. If so, selects the
+ * namespace name where amcheck's functions can be found.
+ */
+static const char *amcheck_sql =
+"SELECT n.nspname, x.extversion FROM pg_catalog.pg_extension x"
+"\nJOIN pg_catalog.pg_namespace n ON x.extnamespace = n.oid"
+"\nWHERE x.extname = 'amcheck'";
+
+static void prepare_heap_command(PQExpBuffer sql, RelationInfo *rel,
+ PGconn *conn);
+static void prepare_btree_command(PQExpBuffer sql, RelationInfo *rel,
+ PGconn *conn);
+static void run_command(ParallelSlot *slot, const char *sql);
+static bool verify_heap_slot_handler(PGresult *res, PGconn *conn,
+ void *context);
+static bool verify_btree_slot_handler(PGresult *res, PGconn *conn, void *context);
+static void help(const char *progname);
+static void progress_report(uint64 relations_total, uint64 relations_checked,
+ uint64 relpages_total, uint64 relpages_checked,
+ const char *datname, bool force, bool finished);
+
+static void append_database_pattern(PatternInfoArray *pia, const char *pattern,
+ int encoding);
+static void append_schema_pattern(PatternInfoArray *pia, const char *pattern,
+ int encoding);
+static void append_relation_pattern(PatternInfoArray *pia, const char *pattern,
+ int encoding);
+static void append_heap_pattern(PatternInfoArray *pia, const char *pattern,
+ int encoding);
+static void append_btree_pattern(PatternInfoArray *pia, const char *pattern,
+ int encoding);
+static void compile_database_list(PGconn *conn, SimplePtrList *databases,
+ const char *initial_dbname);
+static void compile_relation_list_one_db(PGconn *conn, SimplePtrList *relations,
+ const DatabaseInfo *datinfo,
+ uint64 *pagecount);
+
+#define log_no_match(...) do { \
+ if (opts.strict_names) \
+ pg_log_error(__VA_ARGS__); \
+ else \
+ pg_log_warning(__VA_ARGS__); \
+ } while(0)
+
+#define FREE_AND_SET_NULL(x) do { \
+ pg_free(x); \
+ (x) = NULL; \
+ } while (0)
+
+int
+main(int argc, char *argv[])
+{
+ PGconn *conn = NULL;
+ SimplePtrListCell *cell;
+ SimplePtrList databases = {NULL, NULL};
+ SimplePtrList relations = {NULL, NULL};
+ bool failed = false;
+ const char *latest_datname;
+ int parallel_workers;
+ ParallelSlotArray *sa;
+ PQExpBufferData sql;
+ uint64 reltotal = 0;
+ uint64 pageschecked = 0;
+ uint64 pagestotal = 0;
+ uint64 relprogress = 0;
+ int pattern_id;
+
+ static struct option long_options[] = {
+ /* Connection options */
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"maintenance-db", required_argument, NULL, 1},
+
+ /* check options */
+ {"all", no_argument, NULL, 'a'},
+ {"database", required_argument, NULL, 'd'},
+ {"exclude-database", required_argument, NULL, 'D'},
+ {"echo", no_argument, NULL, 'e'},
+ {"index", required_argument, NULL, 'i'},
+ {"exclude-index", required_argument, NULL, 'I'},
+ {"jobs", required_argument, NULL, 'j'},
+ {"progress", no_argument, NULL, 'P'},
+ {"relation", required_argument, NULL, 'r'},
+ {"exclude-relation", required_argument, NULL, 'R'},
+ {"schema", required_argument, NULL, 's'},
+ {"exclude-schema", required_argument, NULL, 'S'},
+ {"table", required_argument, NULL, 't'},
+ {"exclude-table", required_argument, NULL, 'T'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"no-dependent-indexes", no_argument, NULL, 2},
+ {"no-dependent-toast", no_argument, NULL, 3},
+ {"exclude-toast-pointers", no_argument, NULL, 4},
+ {"on-error-stop", no_argument, NULL, 5},
+ {"skip", required_argument, NULL, 6},
+ {"startblock", required_argument, NULL, 7},
+ {"endblock", required_argument, NULL, 8},
+ {"rootdescend", no_argument, NULL, 9},
+ {"no-strict-names", no_argument, NULL, 10},
+ {"heapallindexed", no_argument, NULL, 11},
+ {"parent-check", no_argument, NULL, 12},
+ {"install-missing", optional_argument, NULL, 13},
+
+ {NULL, 0, NULL, 0}
+ };
+
+ int optindex;
+ int c;
+
+ const char *db = NULL;
+ const char *maintenance_db = NULL;
+
+ const char *host = NULL;
+ const char *port = NULL;
+ const char *username = NULL;
+ enum trivalue prompt_password = TRI_DEFAULT;
+ int encoding = pg_get_encoding_from_locale(NULL, false);
+ ConnParams cparams;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_amcheck"));
+
+ handle_help_version_opts(argc, argv, progname, help);
+
+ /* process command-line options */
+ while ((c = getopt_long(argc, argv, "ad:D:eh:Hi:I:j:p:Pr:R:s:S:t:T:U:wWv",
+ long_options, &optindex)) != -1)
+ {
+ char *endptr;
+ unsigned long optval;
+
+ switch (c)
+ {
+ case 'a':
+ opts.alldb = true;
+ break;
+ case 'd':
+ opts.dbpattern = true;
+ append_database_pattern(&opts.include, optarg, encoding);
+ break;
+ case 'D':
+ opts.dbpattern = true;
+ append_database_pattern(&opts.exclude, optarg, encoding);
+ break;
+ case 'e':
+ opts.echo = true;
+ break;
+ case 'h':
+ host = pg_strdup(optarg);
+ break;
+ case 'i':
+ opts.allrel = false;
+ append_btree_pattern(&opts.include, optarg, encoding);
+ break;
+ case 'I':
+ opts.excludeidx = true;
+ append_btree_pattern(&opts.exclude, optarg, encoding);
+ break;
+ case 'j':
+ if (!option_parse_int(optarg, "-j/--jobs", 1, INT_MAX,
+ &opts.jobs))
+ exit(1);
+ break;
+ case 'p':
+ port = pg_strdup(optarg);
+ break;
+ case 'P':
+ opts.show_progress = true;
+ break;
+ case 'r':
+ opts.allrel = false;
+ append_relation_pattern(&opts.include, optarg, encoding);
+ break;
+ case 'R':
+ opts.excludeidx = true;
+ opts.excludetbl = true;
+ append_relation_pattern(&opts.exclude, optarg, encoding);
+ break;
+ case 's':
+ opts.allrel = false;
+ append_schema_pattern(&opts.include, optarg, encoding);
+ break;
+ case 'S':
+ opts.excludensp = true;
+ append_schema_pattern(&opts.exclude, optarg, encoding);
+ break;
+ case 't':
+ opts.allrel = false;
+ append_heap_pattern(&opts.include, optarg, encoding);
+ break;
+ case 'T':
+ opts.excludetbl = true;
+ append_heap_pattern(&opts.exclude, optarg, encoding);
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'w':
+ prompt_password = TRI_NO;
+ break;
+ case 'W':
+ prompt_password = TRI_YES;
+ break;
+ case 'v':
+ opts.verbose = true;
+ pg_logging_increase_verbosity();
+ break;
+ case 1:
+ maintenance_db = pg_strdup(optarg);
+ break;
+ case 2:
+ opts.no_btree_expansion = true;
+ break;
+ case 3:
+ opts.no_toast_expansion = true;
+ break;
+ case 4:
+ opts.reconcile_toast = false;
+ break;
+ case 5:
+ opts.on_error_stop = true;
+ break;
+ case 6:
+ if (pg_strcasecmp(optarg, "all-visible") == 0)
+ opts.skip = "all-visible";
+ else if (pg_strcasecmp(optarg, "all-frozen") == 0)
+ opts.skip = "all-frozen";
+ else if (pg_strcasecmp(optarg, "none") == 0)
+ opts.skip = "none";
+ else
+ pg_fatal("invalid argument for option %s", "--skip");
+ break;
+ case 7:
+ errno = 0;
+ optval = strtoul(optarg, &endptr, 10);
+ if (endptr == optarg || *endptr != '\0' || errno != 0)
+ pg_fatal("invalid start block");
+ if (optval > MaxBlockNumber)
+ pg_fatal("start block out of bounds");
+ opts.startblock = optval;
+ break;
+ case 8:
+ errno = 0;
+ optval = strtoul(optarg, &endptr, 10);
+ if (endptr == optarg || *endptr != '\0' || errno != 0)
+ pg_fatal("invalid end block");
+ if (optval > MaxBlockNumber)
+ pg_fatal("end block out of bounds");
+ opts.endblock = optval;
+ break;
+ case 9:
+ opts.rootdescend = true;
+ opts.parent_check = true;
+ break;
+ case 10:
+ opts.strict_names = false;
+ break;
+ case 11:
+ opts.heapallindexed = true;
+ break;
+ case 12:
+ opts.parent_check = true;
+ break;
+ case 13:
+ opts.install_missing = true;
+ if (optarg)
+ opts.install_schema = pg_strdup(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ if (opts.endblock >= 0 && opts.endblock < opts.startblock)
+ pg_fatal("end block precedes start block");
+
+ /*
+ * A single non-option arguments specifies a database name or connection
+ * string.
+ */
+ if (optind < argc)
+ {
+ db = argv[optind];
+ optind++;
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* fill cparams except for dbname, which is set below */
+ cparams.pghost = host;
+ cparams.pgport = port;
+ cparams.pguser = username;
+ cparams.prompt_password = prompt_password;
+ cparams.dbname = NULL;
+ cparams.override_dbname = NULL;
+
+ setup_cancel_handler(NULL);
+
+ /* choose the database for our initial connection */
+ if (opts.alldb)
+ {
+ if (db != NULL)
+ pg_fatal("cannot specify a database name with --all");
+ cparams.dbname = maintenance_db;
+ }
+ else if (db != NULL)
+ {
+ if (opts.dbpattern)
+ pg_fatal("cannot specify both a database name and database patterns");
+ cparams.dbname = db;
+ }
+
+ if (opts.alldb || opts.dbpattern)
+ {
+ conn = connectMaintenanceDatabase(&cparams, progname, opts.echo);
+ compile_database_list(conn, &databases, NULL);
+ }
+ else
+ {
+ if (cparams.dbname == NULL)
+ {
+ if (getenv("PGDATABASE"))
+ cparams.dbname = getenv("PGDATABASE");
+ else if (getenv("PGUSER"))
+ cparams.dbname = getenv("PGUSER");
+ else
+ cparams.dbname = get_user_name_or_exit(progname);
+ }
+ conn = connectDatabase(&cparams, progname, opts.echo, false, true);
+ compile_database_list(conn, &databases, PQdb(conn));
+ }
+
+ if (databases.head == NULL)
+ {
+ if (conn != NULL)
+ disconnectDatabase(conn);
+ pg_log_warning("no databases to check");
+ exit(0);
+ }
+
+ /*
+ * Compile a list of all relations spanning all databases to be checked.
+ */
+ for (cell = databases.head; cell; cell = cell->next)
+ {
+ PGresult *result;
+ int ntups;
+ const char *amcheck_schema = NULL;
+ DatabaseInfo *dat = (DatabaseInfo *) cell->ptr;
+
+ cparams.override_dbname = dat->datname;
+ if (conn == NULL || strcmp(PQdb(conn), dat->datname) != 0)
+ {
+ if (conn != NULL)
+ disconnectDatabase(conn);
+ conn = connectDatabase(&cparams, progname, opts.echo, false, true);
+ }
+
+ /*
+ * Optionally install amcheck if not already installed in this
+ * database.
+ */
+ if (opts.install_missing)
+ {
+ char *schema;
+ char *install_sql;
+
+ /*
+ * Must re-escape the schema name for each database, as the
+ * escaping rules may change.
+ */
+ schema = PQescapeIdentifier(conn, opts.install_schema,
+ strlen(opts.install_schema));
+ install_sql = psprintf("CREATE EXTENSION IF NOT EXISTS amcheck WITH SCHEMA %s",
+ schema);
+
+ executeCommand(conn, install_sql, opts.echo);
+ pfree(install_sql);
+ pfree(schema);
+ }
+
+ /*
+ * Verify that amcheck is installed for this next database. User
+ * error could result in a database not having amcheck that should
+ * have it, but we also could be iterating over multiple databases
+ * where not all of them have amcheck installed (for example,
+ * 'template1').
+ */
+ result = executeQuery(conn, amcheck_sql, opts.echo);
+ if (PQresultStatus(result) != PGRES_TUPLES_OK)
+ {
+ /* Querying the catalog failed. */
+ pg_log_error("database \"%s\": %s",
+ PQdb(conn), PQerrorMessage(conn));
+ pg_log_error_detail("Query was: %s", amcheck_sql);
+ PQclear(result);
+ disconnectDatabase(conn);
+ exit(1);
+ }
+ ntups = PQntuples(result);
+ if (ntups == 0)
+ {
+ /* Querying the catalog succeeded, but amcheck is missing. */
+ pg_log_warning("skipping database \"%s\": amcheck is not installed",
+ PQdb(conn));
+ disconnectDatabase(conn);
+ conn = NULL;
+ continue;
+ }
+ amcheck_schema = PQgetvalue(result, 0, 0);
+ if (opts.verbose)
+ pg_log_info("in database \"%s\": using amcheck version \"%s\" in schema \"%s\"",
+ PQdb(conn), PQgetvalue(result, 0, 1), amcheck_schema);
+ dat->amcheck_schema = PQescapeIdentifier(conn, amcheck_schema,
+ strlen(amcheck_schema));
+ PQclear(result);
+
+ compile_relation_list_one_db(conn, &relations, dat, &pagestotal);
+ }
+
+ /*
+ * Check that all inclusion patterns matched at least one schema or
+ * relation that we can check.
+ */
+ for (pattern_id = 0; pattern_id < opts.include.len; pattern_id++)
+ {
+ PatternInfo *pat = &opts.include.data[pattern_id];
+
+ if (!pat->matched && (pat->nsp_regex != NULL || pat->rel_regex != NULL))
+ {
+ failed = opts.strict_names;
+
+ if (pat->heap_only)
+ log_no_match("no heap tables to check matching \"%s\"",
+ pat->pattern);
+ else if (pat->btree_only)
+ log_no_match("no btree indexes to check matching \"%s\"",
+ pat->pattern);
+ else if (pat->rel_regex == NULL)
+ log_no_match("no relations to check in schemas matching \"%s\"",
+ pat->pattern);
+ else
+ log_no_match("no relations to check matching \"%s\"",
+ pat->pattern);
+ }
+ }
+
+ if (failed)
+ {
+ if (conn != NULL)
+ disconnectDatabase(conn);
+ exit(1);
+ }
+
+ /*
+ * Set parallel_workers to the lesser of opts.jobs and the number of
+ * relations.
+ */
+ parallel_workers = 0;
+ for (cell = relations.head; cell; cell = cell->next)
+ {
+ reltotal++;
+ if (parallel_workers < opts.jobs)
+ parallel_workers++;
+ }
+
+ if (reltotal == 0)
+ {
+ if (conn != NULL)
+ disconnectDatabase(conn);
+ pg_fatal("no relations to check");
+ }
+ progress_report(reltotal, relprogress, pagestotal, pageschecked,
+ NULL, true, false);
+
+ /*
+ * Main event loop.
+ *
+ * We use server-side parallelism to check up to parallel_workers
+ * relations in parallel. The list of relations was computed in database
+ * order, which minimizes the number of connects and disconnects as we
+ * process the list.
+ */
+ latest_datname = NULL;
+ sa = ParallelSlotsSetup(parallel_workers, &cparams, progname, opts.echo,
+ NULL);
+ if (conn != NULL)
+ {
+ ParallelSlotsAdoptConn(sa, conn);
+ conn = NULL;
+ }
+
+ initPQExpBuffer(&sql);
+ for (relprogress = 0, cell = relations.head; cell; cell = cell->next)
+ {
+ ParallelSlot *free_slot;
+ RelationInfo *rel;
+
+ rel = (RelationInfo *) cell->ptr;
+
+ if (CancelRequested)
+ {
+ failed = true;
+ break;
+ }
+
+ /*
+ * The list of relations is in database sorted order. If this next
+ * relation is in a different database than the last one seen, we are
+ * about to start checking this database. Note that other slots may
+ * still be working on relations from prior databases.
+ */
+ latest_datname = rel->datinfo->datname;
+
+ progress_report(reltotal, relprogress, pagestotal, pageschecked,
+ latest_datname, false, false);
+
+ relprogress++;
+ pageschecked += rel->blocks_to_check;
+
+ /*
+ * Get a parallel slot for the next amcheck command, blocking if
+ * necessary until one is available, or until a previously issued slot
+ * command fails, indicating that we should abort checking the
+ * remaining objects.
+ */
+ free_slot = ParallelSlotsGetIdle(sa, rel->datinfo->datname);
+ if (!free_slot)
+ {
+ /*
+ * Something failed. We don't need to know what it was, because
+ * the handler should already have emitted the necessary error
+ * messages.
+ */
+ failed = true;
+ break;
+ }
+
+ if (opts.verbose)
+ PQsetErrorVerbosity(free_slot->connection, PQERRORS_VERBOSE);
+
+ /*
+ * Execute the appropriate amcheck command for this relation using our
+ * slot's database connection. We do not wait for the command to
+ * complete, nor do we perform any error checking, as that is done by
+ * the parallel slots and our handler callback functions.
+ */
+ if (rel->is_heap)
+ {
+ if (opts.verbose)
+ {
+ if (opts.show_progress && progress_since_last_stderr)
+ fprintf(stderr, "\n");
+ pg_log_info("checking heap table \"%s.%s.%s\"",
+ rel->datinfo->datname, rel->nspname, rel->relname);
+ progress_since_last_stderr = false;
+ }
+ prepare_heap_command(&sql, rel, free_slot->connection);
+ rel->sql = pstrdup(sql.data); /* pg_free'd after command */
+ ParallelSlotSetHandler(free_slot, verify_heap_slot_handler, rel);
+ run_command(free_slot, rel->sql);
+ }
+ else
+ {
+ if (opts.verbose)
+ {
+ if (opts.show_progress && progress_since_last_stderr)
+ fprintf(stderr, "\n");
+
+ pg_log_info("checking btree index \"%s.%s.%s\"",
+ rel->datinfo->datname, rel->nspname, rel->relname);
+ progress_since_last_stderr = false;
+ }
+ prepare_btree_command(&sql, rel, free_slot->connection);
+ rel->sql = pstrdup(sql.data); /* pg_free'd after command */
+ ParallelSlotSetHandler(free_slot, verify_btree_slot_handler, rel);
+ run_command(free_slot, rel->sql);
+ }
+ }
+ termPQExpBuffer(&sql);
+
+ if (!failed)
+ {
+
+ /*
+ * Wait for all slots to complete, or for one to indicate that an
+ * error occurred. Like above, we rely on the handler emitting the
+ * necessary error messages.
+ */
+ if (sa && !ParallelSlotsWaitCompletion(sa))
+ failed = true;
+
+ progress_report(reltotal, relprogress, pagestotal, pageschecked, NULL, true, true);
+ }
+
+ if (sa)
+ {
+ ParallelSlotsTerminate(sa);
+ FREE_AND_SET_NULL(sa);
+ }
+
+ if (failed)
+ exit(1);
+
+ if (!all_checks_pass)
+ exit(2);
+}
+
+/*
+ * prepare_heap_command
+ *
+ * Creates a SQL command for running amcheck checking on the given heap
+ * relation. The command is phrased as a SQL query, with column order and
+ * names matching the expectations of verify_heap_slot_handler, which will
+ * receive and handle each row returned from the verify_heapam() function.
+ *
+ * The constructed SQL command will silently skip temporary tables, as checking
+ * them would needlessly draw errors from the underlying amcheck function.
+ *
+ * sql: buffer into which the heap table checking command will be written
+ * rel: relation information for the heap table to be checked
+ * conn: the connection to be used, for string escaping purposes
+ */
+static void
+prepare_heap_command(PQExpBuffer sql, RelationInfo *rel, PGconn *conn)
+{
+ resetPQExpBuffer(sql);
+ appendPQExpBuffer(sql,
+ "SELECT v.blkno, v.offnum, v.attnum, v.msg "
+ "FROM pg_catalog.pg_class c, %s.verify_heapam("
+ "\nrelation := c.oid, on_error_stop := %s, check_toast := %s, skip := '%s'",
+ rel->datinfo->amcheck_schema,
+ opts.on_error_stop ? "true" : "false",
+ opts.reconcile_toast ? "true" : "false",
+ opts.skip);
+
+ if (opts.startblock >= 0)
+ appendPQExpBuffer(sql, ", startblock := " INT64_FORMAT, opts.startblock);
+ if (opts.endblock >= 0)
+ appendPQExpBuffer(sql, ", endblock := " INT64_FORMAT, opts.endblock);
+
+ appendPQExpBuffer(sql,
+ "\n) v WHERE c.oid = %u "
+ "AND c.relpersistence != 't'",
+ rel->reloid);
+}
+
+/*
+ * prepare_btree_command
+ *
+ * Creates a SQL command for running amcheck checking on the given btree index
+ * relation. The command does not select any columns, as btree checking
+ * functions do not return any, but rather return corruption information by
+ * raising errors, which verify_btree_slot_handler expects.
+ *
+ * The constructed SQL command will silently skip temporary indexes, and
+ * indexes being reindexed concurrently, as checking them would needlessly draw
+ * errors from the underlying amcheck functions.
+ *
+ * sql: buffer into which the heap table checking command will be written
+ * rel: relation information for the index to be checked
+ * conn: the connection to be used, for string escaping purposes
+ */
+static void
+prepare_btree_command(PQExpBuffer sql, RelationInfo *rel, PGconn *conn)
+{
+ resetPQExpBuffer(sql);
+
+ if (opts.parent_check)
+ appendPQExpBuffer(sql,
+ "SELECT %s.bt_index_parent_check("
+ "index := c.oid, heapallindexed := %s, rootdescend := %s)"
+ "\nFROM pg_catalog.pg_class c, pg_catalog.pg_index i "
+ "WHERE c.oid = %u "
+ "AND c.oid = i.indexrelid "
+ "AND c.relpersistence != 't' "
+ "AND i.indisready AND i.indisvalid AND i.indislive",
+ rel->datinfo->amcheck_schema,
+ (opts.heapallindexed ? "true" : "false"),
+ (opts.rootdescend ? "true" : "false"),
+ rel->reloid);
+ else
+ appendPQExpBuffer(sql,
+ "SELECT %s.bt_index_check("
+ "index := c.oid, heapallindexed := %s)"
+ "\nFROM pg_catalog.pg_class c, pg_catalog.pg_index i "
+ "WHERE c.oid = %u "
+ "AND c.oid = i.indexrelid "
+ "AND c.relpersistence != 't' "
+ "AND i.indisready AND i.indisvalid AND i.indislive",
+ rel->datinfo->amcheck_schema,
+ (opts.heapallindexed ? "true" : "false"),
+ rel->reloid);
+}
+
+/*
+ * run_command
+ *
+ * Sends a command to the server without waiting for the command to complete.
+ * Logs an error if the command cannot be sent, but otherwise any errors are
+ * expected to be handled by a ParallelSlotHandler.
+ *
+ * If reconnecting to the database is necessary, the cparams argument may be
+ * modified.
+ *
+ * slot: slot with connection to the server we should use for the command
+ * sql: query to send
+ */
+static void
+run_command(ParallelSlot *slot, const char *sql)
+{
+ if (opts.echo)
+ printf("%s\n", sql);
+
+ if (PQsendQuery(slot->connection, sql) == 0)
+ {
+ pg_log_error("error sending command to database \"%s\": %s",
+ PQdb(slot->connection),
+ PQerrorMessage(slot->connection));
+ pg_log_error_detail("Command was: %s", sql);
+ exit(1);
+ }
+}
+
+/*
+ * should_processing_continue
+ *
+ * Checks a query result returned from a query (presumably issued on a slot's
+ * connection) to determine if parallel slots should continue issuing further
+ * commands.
+ *
+ * Note: Heap relation corruption is reported by verify_heapam() via the result
+ * set, rather than an ERROR, but running verify_heapam() on a corrupted heap
+ * table may still result in an error being returned from the server due to
+ * missing relation files, bad checksums, etc. The btree corruption checking
+ * functions always use errors to communicate corruption messages. We can't
+ * just abort processing because we got a mere ERROR.
+ *
+ * res: result from an executed sql query
+ */
+static bool
+should_processing_continue(PGresult *res)
+{
+ const char *severity;
+
+ switch (PQresultStatus(res))
+ {
+ /* These are expected and ok */
+ case PGRES_COMMAND_OK:
+ case PGRES_TUPLES_OK:
+ case PGRES_NONFATAL_ERROR:
+ break;
+
+ /* This is expected but requires closer scrutiny */
+ case PGRES_FATAL_ERROR:
+ severity = PQresultErrorField(res, PG_DIAG_SEVERITY_NONLOCALIZED);
+ if (severity == NULL)
+ return false; /* libpq failure, probably lost connection */
+ if (strcmp(severity, "FATAL") == 0)
+ return false;
+ if (strcmp(severity, "PANIC") == 0)
+ return false;
+ break;
+
+ /* These are unexpected */
+ case PGRES_BAD_RESPONSE:
+ case PGRES_EMPTY_QUERY:
+ case PGRES_COPY_OUT:
+ case PGRES_COPY_IN:
+ case PGRES_COPY_BOTH:
+ case PGRES_SINGLE_TUPLE:
+ case PGRES_PIPELINE_SYNC:
+ case PGRES_PIPELINE_ABORTED:
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Returns a copy of the argument string with all lines indented four spaces.
+ *
+ * The caller should pg_free the result when finished with it.
+ */
+static char *
+indent_lines(const char *str)
+{
+ PQExpBufferData buf;
+ const char *c;
+ char *result;
+
+ initPQExpBuffer(&buf);
+ appendPQExpBufferStr(&buf, " ");
+ for (c = str; *c; c++)
+ {
+ appendPQExpBufferChar(&buf, *c);
+ if (c[0] == '\n' && c[1] != '\0')
+ appendPQExpBufferStr(&buf, " ");
+ }
+ result = pstrdup(buf.data);
+ termPQExpBuffer(&buf);
+
+ return result;
+}
+
+/*
+ * verify_heap_slot_handler
+ *
+ * ParallelSlotHandler that receives results from a heap table checking command
+ * created by prepare_heap_command and outputs the results for the user.
+ *
+ * res: result from an executed sql query
+ * conn: connection on which the sql query was executed
+ * context: the sql query being handled, as a cstring
+ */
+static bool
+verify_heap_slot_handler(PGresult *res, PGconn *conn, void *context)
+{
+ RelationInfo *rel = (RelationInfo *) context;
+
+ if (PQresultStatus(res) == PGRES_TUPLES_OK)
+ {
+ int i;
+ int ntups = PQntuples(res);
+
+ if (ntups > 0)
+ all_checks_pass = false;
+
+ for (i = 0; i < ntups; i++)
+ {
+ const char *msg;
+
+ /* The message string should never be null, but check */
+ if (PQgetisnull(res, i, 3))
+ msg = "NO MESSAGE";
+ else
+ msg = PQgetvalue(res, i, 3);
+
+ if (!PQgetisnull(res, i, 2))
+ printf(_("heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"),
+ rel->datinfo->datname, rel->nspname, rel->relname,
+ PQgetvalue(res, i, 0), /* blkno */
+ PQgetvalue(res, i, 1), /* offnum */
+ PQgetvalue(res, i, 2)); /* attnum */
+
+ else if (!PQgetisnull(res, i, 1))
+ printf(_("heap table \"%s.%s.%s\", block %s, offset %s:\n"),
+ rel->datinfo->datname, rel->nspname, rel->relname,
+ PQgetvalue(res, i, 0), /* blkno */
+ PQgetvalue(res, i, 1)); /* offnum */
+
+ else if (!PQgetisnull(res, i, 0))
+ printf(_("heap table \"%s.%s.%s\", block %s:\n"),
+ rel->datinfo->datname, rel->nspname, rel->relname,
+ PQgetvalue(res, i, 0)); /* blkno */
+
+ else
+ printf(_("heap table \"%s.%s.%s\":\n"),
+ rel->datinfo->datname, rel->nspname, rel->relname);
+
+ printf(" %s\n", msg);
+ }
+ }
+ else if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ char *msg = indent_lines(PQerrorMessage(conn));
+
+ all_checks_pass = false;
+ printf(_("heap table \"%s.%s.%s\":\n"),
+ rel->datinfo->datname, rel->nspname, rel->relname);
+ printf("%s", msg);
+ if (opts.verbose)
+ printf(_("query was: %s\n"), rel->sql);
+ FREE_AND_SET_NULL(msg);
+ }
+
+ FREE_AND_SET_NULL(rel->sql);
+ FREE_AND_SET_NULL(rel->nspname);
+ FREE_AND_SET_NULL(rel->relname);
+
+ return should_processing_continue(res);
+}
+
+/*
+ * verify_btree_slot_handler
+ *
+ * ParallelSlotHandler that receives results from a btree checking command
+ * created by prepare_btree_command and outputs them for the user. The results
+ * from the btree checking command is assumed to be empty, but when the results
+ * are an error code, the useful information about the corruption is expected
+ * in the connection's error message.
+ *
+ * res: result from an executed sql query
+ * conn: connection on which the sql query was executed
+ * context: unused
+ */
+static bool
+verify_btree_slot_handler(PGresult *res, PGconn *conn, void *context)
+{
+ RelationInfo *rel = (RelationInfo *) context;
+
+ if (PQresultStatus(res) == PGRES_TUPLES_OK)
+ {
+ int ntups = PQntuples(res);
+
+ if (ntups > 1)
+ {
+ /*
+ * We expect the btree checking functions to return one void row
+ * each, or zero rows if the check was skipped due to the object
+ * being in the wrong state to be checked, so we should output
+ * some sort of warning if we get anything more, not because it
+ * indicates corruption, but because it suggests a mismatch
+ * between amcheck and pg_amcheck versions.
+ *
+ * In conjunction with --progress, anything written to stderr at
+ * this time would present strangely to the user without an extra
+ * newline, so we print one. If we were multithreaded, we'd have
+ * to avoid splitting this across multiple calls, but we're in an
+ * event loop, so it doesn't matter.
+ */
+ if (opts.show_progress && progress_since_last_stderr)
+ fprintf(stderr, "\n");
+ pg_log_warning("btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d",
+ rel->datinfo->datname, rel->nspname, rel->relname, ntups);
+ if (opts.verbose)
+ pg_log_warning_detail("Query was: %s", rel->sql);
+ pg_log_warning_hint("Are %s's and amcheck's versions compatible?",
+ progname);
+ progress_since_last_stderr = false;
+ }
+ }
+ else
+ {
+ char *msg = indent_lines(PQerrorMessage(conn));
+
+ all_checks_pass = false;
+ printf(_("btree index \"%s.%s.%s\":\n"),
+ rel->datinfo->datname, rel->nspname, rel->relname);
+ printf("%s", msg);
+ if (opts.verbose)
+ printf(_("query was: %s\n"), rel->sql);
+ FREE_AND_SET_NULL(msg);
+ }
+
+ FREE_AND_SET_NULL(rel->sql);
+ FREE_AND_SET_NULL(rel->nspname);
+ FREE_AND_SET_NULL(rel->relname);
+
+ return should_processing_continue(res);
+}
+
+/*
+ * help
+ *
+ * Prints help page for the program
+ *
+ * progname: the name of the executed program, such as "pg_amcheck"
+ */
+static void
+help(const char *progname)
+{
+ printf(_("%s checks objects in a PostgreSQL database for corruption.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DBNAME]\n"), progname);
+ printf(_("\nTarget options:\n"));
+ printf(_(" -a, --all check all databases\n"));
+ printf(_(" -d, --database=PATTERN check matching database(s)\n"));
+ printf(_(" -D, --exclude-database=PATTERN do NOT check matching database(s)\n"));
+ printf(_(" -i, --index=PATTERN check matching index(es)\n"));
+ printf(_(" -I, --exclude-index=PATTERN do NOT check matching index(es)\n"));
+ printf(_(" -r, --relation=PATTERN check matching relation(s)\n"));
+ printf(_(" -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"));
+ printf(_(" -s, --schema=PATTERN check matching schema(s)\n"));
+ printf(_(" -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"));
+ printf(_(" -t, --table=PATTERN check matching table(s)\n"));
+ printf(_(" -T, --exclude-table=PATTERN do NOT check matching table(s)\n"));
+ printf(_(" --no-dependent-indexes do NOT expand list of relations to include indexes\n"));
+ printf(_(" --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"));
+ printf(_(" --no-strict-names do NOT require patterns to match objects\n"));
+ printf(_("\nTable checking options:\n"));
+ printf(_(" --exclude-toast-pointers do NOT follow relation TOAST pointers\n"));
+ printf(_(" --on-error-stop stop checking at end of first corrupt page\n"));
+ printf(_(" --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"));
+ printf(_(" --startblock=BLOCK begin checking table(s) at the given block number\n"));
+ printf(_(" --endblock=BLOCK check table(s) only up to the given block number\n"));
+ printf(_("\nB-tree index checking options:\n"));
+ printf(_(" --heapallindexed check that all heap tuples are found within indexes\n"));
+ printf(_(" --parent-check check index parent/child relationships\n"));
+ printf(_(" --rootdescend search from root page to refind tuples\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -U, --username=USERNAME user name to connect as\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt\n"));
+ printf(_(" --maintenance-db=DBNAME alternate maintenance database\n"));
+ printf(_("\nOther options:\n"));
+ printf(_(" -e, --echo show the commands being sent to the server\n"));
+ printf(_(" -j, --jobs=NUM use this many concurrent connections to the server\n"));
+ printf(_(" -P, --progress show progress information\n"));
+ printf(_(" -v, --verbose write a lot of output\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" --install-missing install missing extensions\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+/*
+ * Print a progress report based on the global variables.
+ *
+ * Progress report is written at maximum once per second, unless the force
+ * parameter is set to true.
+ *
+ * If finished is set to true, this is the last progress report. The cursor
+ * is moved to the next line.
+ */
+static void
+progress_report(uint64 relations_total, uint64 relations_checked,
+ uint64 relpages_total, uint64 relpages_checked,
+ const char *datname, bool force, bool finished)
+{
+ int percent_rel = 0;
+ int percent_pages = 0;
+ char checked_rel[32];
+ char total_rel[32];
+ char checked_pages[32];
+ char total_pages[32];
+ pg_time_t now;
+
+ if (!opts.show_progress)
+ return;
+
+ now = time(NULL);
+ if (now == last_progress_report && !force && !finished)
+ return; /* Max once per second */
+
+ last_progress_report = now;
+ if (relations_total)
+ percent_rel = (int) (relations_checked * 100 / relations_total);
+ if (relpages_total)
+ percent_pages = (int) (relpages_checked * 100 / relpages_total);
+
+ snprintf(checked_rel, sizeof(checked_rel), UINT64_FORMAT, relations_checked);
+ snprintf(total_rel, sizeof(total_rel), UINT64_FORMAT, relations_total);
+ snprintf(checked_pages, sizeof(checked_pages), UINT64_FORMAT, relpages_checked);
+ snprintf(total_pages, sizeof(total_pages), UINT64_FORMAT, relpages_total);
+
+#define VERBOSE_DATNAME_LENGTH 35
+ if (opts.verbose)
+ {
+ if (!datname)
+
+ /*
+ * No datname given, so clear the status line (used for first and
+ * last call)
+ */
+ fprintf(stderr,
+ _("%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"),
+ (int) strlen(total_rel),
+ checked_rel, total_rel, percent_rel,
+ (int) strlen(total_pages),
+ checked_pages, total_pages, percent_pages,
+ VERBOSE_DATNAME_LENGTH + 2, "");
+ else
+ {
+ bool truncate = (strlen(datname) > VERBOSE_DATNAME_LENGTH);
+
+ fprintf(stderr,
+ _("%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"),
+ (int) strlen(total_rel),
+ checked_rel, total_rel, percent_rel,
+ (int) strlen(total_pages),
+ checked_pages, total_pages, percent_pages,
+ /* Prefix with "..." if we do leading truncation */
+ truncate ? "..." : "",
+ truncate ? VERBOSE_DATNAME_LENGTH - 3 : VERBOSE_DATNAME_LENGTH,
+ truncate ? VERBOSE_DATNAME_LENGTH - 3 : VERBOSE_DATNAME_LENGTH,
+ /* Truncate datname at beginning if it's too long */
+ truncate ? datname + strlen(datname) - VERBOSE_DATNAME_LENGTH + 3 : datname);
+ }
+ }
+ else
+ fprintf(stderr,
+ _("%*s/%s relations (%d%%), %*s/%s pages (%d%%)"),
+ (int) strlen(total_rel),
+ checked_rel, total_rel, percent_rel,
+ (int) strlen(total_pages),
+ checked_pages, total_pages, percent_pages);
+
+ /*
+ * Stay on the same line if reporting to a terminal and we're not done
+ * yet.
+ */
+ if (!finished && isatty(fileno(stderr)))
+ {
+ fputc('\r', stderr);
+ progress_since_last_stderr = true;
+ }
+ else
+ fputc('\n', stderr);
+}
+
+/*
+ * Extend the pattern info array to hold one additional initialized pattern
+ * info entry.
+ *
+ * Returns a pointer to the new entry.
+ */
+static PatternInfo *
+extend_pattern_info_array(PatternInfoArray *pia)
+{
+ PatternInfo *result;
+
+ pia->len++;
+ pia->data = (PatternInfo *) pg_realloc(pia->data, pia->len * sizeof(PatternInfo));
+ result = &pia->data[pia->len - 1];
+ memset(result, 0, sizeof(*result));
+
+ return result;
+}
+
+/*
+ * append_database_pattern
+ *
+ * Adds the given pattern interpreted as a database name pattern.
+ *
+ * pia: the pattern info array to be appended
+ * pattern: the database name pattern
+ * encoding: client encoding for parsing the pattern
+ */
+static void
+append_database_pattern(PatternInfoArray *pia, const char *pattern, int encoding)
+{
+ PQExpBufferData buf;
+ int dotcnt;
+ PatternInfo *info = extend_pattern_info_array(pia);
+
+ initPQExpBuffer(&buf);
+ patternToSQLRegex(encoding, NULL, NULL, &buf, pattern, false, false,
+ &dotcnt);
+ if (dotcnt > 0)
+ {
+ pg_log_error("improper qualified name (too many dotted names): %s", pattern);
+ exit(2);
+ }
+ info->pattern = pattern;
+ info->db_regex = pstrdup(buf.data);
+
+ termPQExpBuffer(&buf);
+}
+
+/*
+ * append_schema_pattern
+ *
+ * Adds the given pattern interpreted as a schema name pattern.
+ *
+ * pia: the pattern info array to be appended
+ * pattern: the schema name pattern
+ * encoding: client encoding for parsing the pattern
+ */
+static void
+append_schema_pattern(PatternInfoArray *pia, const char *pattern, int encoding)
+{
+ PQExpBufferData dbbuf;
+ PQExpBufferData nspbuf;
+ int dotcnt;
+ PatternInfo *info = extend_pattern_info_array(pia);
+
+ initPQExpBuffer(&dbbuf);
+ initPQExpBuffer(&nspbuf);
+
+ patternToSQLRegex(encoding, NULL, &dbbuf, &nspbuf, pattern, false, false,
+ &dotcnt);
+ if (dotcnt > 1)
+ {
+ pg_log_error("improper qualified name (too many dotted names): %s", pattern);
+ exit(2);
+ }
+ info->pattern = pattern;
+ if (dbbuf.data[0])
+ {
+ opts.dbpattern = true;
+ info->db_regex = pstrdup(dbbuf.data);
+ }
+ if (nspbuf.data[0])
+ info->nsp_regex = pstrdup(nspbuf.data);
+
+ termPQExpBuffer(&dbbuf);
+ termPQExpBuffer(&nspbuf);
+}
+
+/*
+ * append_relation_pattern_helper
+ *
+ * Adds to a list the given pattern interpreted as a relation pattern.
+ *
+ * pia: the pattern info array to be appended
+ * pattern: the relation name pattern
+ * encoding: client encoding for parsing the pattern
+ * heap_only: whether the pattern should only be matched against heap tables
+ * btree_only: whether the pattern should only be matched against btree indexes
+ */
+static void
+append_relation_pattern_helper(PatternInfoArray *pia, const char *pattern,
+ int encoding, bool heap_only, bool btree_only)
+{
+ PQExpBufferData dbbuf;
+ PQExpBufferData nspbuf;
+ PQExpBufferData relbuf;
+ int dotcnt;
+ PatternInfo *info = extend_pattern_info_array(pia);
+
+ initPQExpBuffer(&dbbuf);
+ initPQExpBuffer(&nspbuf);
+ initPQExpBuffer(&relbuf);
+
+ patternToSQLRegex(encoding, &dbbuf, &nspbuf, &relbuf, pattern, false,
+ false, &dotcnt);
+ if (dotcnt > 2)
+ {
+ pg_log_error("improper relation name (too many dotted names): %s", pattern);
+ exit(2);
+ }
+ info->pattern = pattern;
+ if (dbbuf.data[0])
+ {
+ opts.dbpattern = true;
+ info->db_regex = pstrdup(dbbuf.data);
+ }
+ if (nspbuf.data[0])
+ info->nsp_regex = pstrdup(nspbuf.data);
+ if (relbuf.data[0])
+ info->rel_regex = pstrdup(relbuf.data);
+
+ termPQExpBuffer(&dbbuf);
+ termPQExpBuffer(&nspbuf);
+ termPQExpBuffer(&relbuf);
+
+ info->heap_only = heap_only;
+ info->btree_only = btree_only;
+}
+
+/*
+ * append_relation_pattern
+ *
+ * Adds the given pattern interpreted as a relation pattern, to be matched
+ * against both heap tables and btree indexes.
+ *
+ * pia: the pattern info array to be appended
+ * pattern: the relation name pattern
+ * encoding: client encoding for parsing the pattern
+ */
+static void
+append_relation_pattern(PatternInfoArray *pia, const char *pattern, int encoding)
+{
+ append_relation_pattern_helper(pia, pattern, encoding, false, false);
+}
+
+/*
+ * append_heap_pattern
+ *
+ * Adds the given pattern interpreted as a relation pattern, to be matched only
+ * against heap tables.
+ *
+ * pia: the pattern info array to be appended
+ * pattern: the relation name pattern
+ * encoding: client encoding for parsing the pattern
+ */
+static void
+append_heap_pattern(PatternInfoArray *pia, const char *pattern, int encoding)
+{
+ append_relation_pattern_helper(pia, pattern, encoding, true, false);
+}
+
+/*
+ * append_btree_pattern
+ *
+ * Adds the given pattern interpreted as a relation pattern, to be matched only
+ * against btree indexes.
+ *
+ * pia: the pattern info array to be appended
+ * pattern: the relation name pattern
+ * encoding: client encoding for parsing the pattern
+ */
+static void
+append_btree_pattern(PatternInfoArray *pia, const char *pattern, int encoding)
+{
+ append_relation_pattern_helper(pia, pattern, encoding, false, true);
+}
+
+/*
+ * append_db_pattern_cte
+ *
+ * Appends to the buffer the body of a Common Table Expression (CTE) containing
+ * the database portions filtered from the list of patterns expressed as two
+ * columns:
+ *
+ * pattern_id: the index of this pattern in pia->data[]
+ * rgx: the database regular expression parsed from the pattern
+ *
+ * Patterns without a database portion are skipped. Patterns with more than
+ * just a database portion are optionally skipped, depending on argument
+ * 'inclusive'.
+ *
+ * buf: the buffer to be appended
+ * pia: the array of patterns to be inserted into the CTE
+ * conn: the database connection
+ * inclusive: whether to include patterns with schema and/or relation parts
+ *
+ * Returns whether any database patterns were appended.
+ */
+static bool
+append_db_pattern_cte(PQExpBuffer buf, const PatternInfoArray *pia,
+ PGconn *conn, bool inclusive)
+{
+ int pattern_id;
+ const char *comma;
+ bool have_values;
+
+ comma = "";
+ have_values = false;
+ for (pattern_id = 0; pattern_id < pia->len; pattern_id++)
+ {
+ PatternInfo *info = &pia->data[pattern_id];
+
+ if (info->db_regex != NULL &&
+ (inclusive || (info->nsp_regex == NULL && info->rel_regex == NULL)))
+ {
+ if (!have_values)
+ appendPQExpBufferStr(buf, "\nVALUES");
+ have_values = true;
+ appendPQExpBuffer(buf, "%s\n(%d, ", comma, pattern_id);
+ appendStringLiteralConn(buf, info->db_regex, conn);
+ appendPQExpBufferStr(buf, ")");
+ comma = ",";
+ }
+ }
+
+ if (!have_values)
+ appendPQExpBufferStr(buf, "\nSELECT NULL, NULL, NULL WHERE false");
+
+ return have_values;
+}
+
+/*
+ * compile_database_list
+ *
+ * If any database patterns exist, or if --all was given, compiles a distinct
+ * list of databases to check using a SQL query based on the patterns plus the
+ * literal initial database name, if given. If no database patterns exist and
+ * --all was not given, the query is not necessary, and only the initial
+ * database name (if any) is added to the list.
+ *
+ * conn: connection to the initial database
+ * databases: the list onto which databases should be appended
+ * initial_dbname: an optional extra database name to include in the list
+ */
+static void
+compile_database_list(PGconn *conn, SimplePtrList *databases,
+ const char *initial_dbname)
+{
+ PGresult *res;
+ PQExpBufferData sql;
+ int ntups;
+ int i;
+ bool fatal;
+
+ if (initial_dbname)
+ {
+ DatabaseInfo *dat = (DatabaseInfo *) pg_malloc0(sizeof(DatabaseInfo));
+
+ /* This database is included. Add to list */
+ if (opts.verbose)
+ pg_log_info("including database \"%s\"", initial_dbname);
+
+ dat->datname = pstrdup(initial_dbname);
+ simple_ptr_list_append(databases, dat);
+ }
+
+ initPQExpBuffer(&sql);
+
+ /* Append the include patterns CTE. */
+ appendPQExpBufferStr(&sql, "WITH include_raw (pattern_id, rgx) AS (");
+ if (!append_db_pattern_cte(&sql, &opts.include, conn, true) &&
+ !opts.alldb)
+ {
+ /*
+ * None of the inclusion patterns (if any) contain database portions,
+ * so there is no need to query the database to resolve database
+ * patterns.
+ *
+ * Since we're also not operating under --all, we don't need to query
+ * the exhaustive list of connectable databases, either.
+ */
+ termPQExpBuffer(&sql);
+ return;
+ }
+
+ /* Append the exclude patterns CTE. */
+ appendPQExpBufferStr(&sql, "),\nexclude_raw (pattern_id, rgx) AS (");
+ append_db_pattern_cte(&sql, &opts.exclude, conn, false);
+ appendPQExpBufferStr(&sql, "),");
+
+ /*
+ * Append the database CTE, which includes whether each database is
+ * connectable and also joins against exclude_raw to determine whether
+ * each database is excluded.
+ */
+ appendPQExpBufferStr(&sql,
+ "\ndatabase (datname) AS ("
+ "\nSELECT d.datname "
+ "FROM pg_catalog.pg_database d "
+ "LEFT OUTER JOIN exclude_raw e "
+ "ON d.datname ~ e.rgx "
+ "\nWHERE d.datallowconn AND datconnlimit != -2 "
+ "AND e.pattern_id IS NULL"
+ "),"
+
+ /*
+ * Append the include_pat CTE, which joins the include_raw CTE against the
+ * databases CTE to determine if all the inclusion patterns had matches,
+ * and whether each matched pattern had the misfortune of only matching
+ * excluded or unconnectable databases.
+ */
+ "\ninclude_pat (pattern_id, checkable) AS ("
+ "\nSELECT i.pattern_id, "
+ "COUNT(*) FILTER ("
+ "WHERE d IS NOT NULL"
+ ") AS checkable"
+ "\nFROM include_raw i "
+ "LEFT OUTER JOIN database d "
+ "ON d.datname ~ i.rgx"
+ "\nGROUP BY i.pattern_id"
+ "),"
+
+ /*
+ * Append the filtered_databases CTE, which selects from the database CTE
+ * optionally joined against the include_raw CTE to only select databases
+ * that match an inclusion pattern. This appears to duplicate what the
+ * include_pat CTE already did above, but here we want only databases, and
+ * there we wanted patterns.
+ */
+ "\nfiltered_databases (datname) AS ("
+ "\nSELECT DISTINCT d.datname "
+ "FROM database d");
+ if (!opts.alldb)
+ appendPQExpBufferStr(&sql,
+ " INNER JOIN include_raw i "
+ "ON d.datname ~ i.rgx");
+ appendPQExpBufferStr(&sql,
+ ")"
+
+ /*
+ * Select the checkable databases and the unmatched inclusion patterns.
+ */
+ "\nSELECT pattern_id, datname FROM ("
+ "\nSELECT pattern_id, NULL::TEXT AS datname "
+ "FROM include_pat "
+ "WHERE checkable = 0 "
+ "UNION ALL"
+ "\nSELECT NULL, datname "
+ "FROM filtered_databases"
+ ") AS combined_records"
+ "\nORDER BY pattern_id NULLS LAST, datname");
+
+ res = executeQuery(conn, sql.data, opts.echo);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("query failed: %s", PQerrorMessage(conn));
+ pg_log_error_detail("Query was: %s", sql.data);
+ disconnectDatabase(conn);
+ exit(1);
+ }
+ termPQExpBuffer(&sql);
+
+ ntups = PQntuples(res);
+ for (fatal = false, i = 0; i < ntups; i++)
+ {
+ int pattern_id = -1;
+ const char *datname = NULL;
+
+ if (!PQgetisnull(res, i, 0))
+ pattern_id = atoi(PQgetvalue(res, i, 0));
+ if (!PQgetisnull(res, i, 1))
+ datname = PQgetvalue(res, i, 1);
+
+ if (pattern_id >= 0)
+ {
+ /*
+ * Current record pertains to an inclusion pattern that matched no
+ * checkable databases.
+ */
+ fatal = opts.strict_names;
+ if (pattern_id >= opts.include.len)
+ pg_fatal("internal error: received unexpected database pattern_id %d",
+ pattern_id);
+ log_no_match("no connectable databases to check matching \"%s\"",
+ opts.include.data[pattern_id].pattern);
+ }
+ else
+ {
+ DatabaseInfo *dat;
+
+ /* Current record pertains to a database */
+ Assert(datname != NULL);
+
+ /* Avoid entering a duplicate entry matching the initial_dbname */
+ if (initial_dbname != NULL && strcmp(initial_dbname, datname) == 0)
+ continue;
+
+ /* This database is included. Add to list */
+ if (opts.verbose)
+ pg_log_info("including database \"%s\"", datname);
+
+ dat = (DatabaseInfo *) pg_malloc0(sizeof(DatabaseInfo));
+ dat->datname = pstrdup(datname);
+ simple_ptr_list_append(databases, dat);
+ }
+ }
+ PQclear(res);
+
+ if (fatal)
+ {
+ if (conn != NULL)
+ disconnectDatabase(conn);
+ exit(1);
+ }
+}
+
+/*
+ * append_rel_pattern_raw_cte
+ *
+ * Appends to the buffer the body of a Common Table Expression (CTE) containing
+ * the given patterns as six columns:
+ *
+ * pattern_id: the index of this pattern in pia->data[]
+ * db_regex: the database regexp parsed from the pattern, or NULL if the
+ * pattern had no database part
+ * nsp_regex: the namespace regexp parsed from the pattern, or NULL if the
+ * pattern had no namespace part
+ * rel_regex: the relname regexp parsed from the pattern, or NULL if the
+ * pattern had no relname part
+ * heap_only: true if the pattern applies only to heap tables (not indexes)
+ * btree_only: true if the pattern applies only to btree indexes (not tables)
+ *
+ * buf: the buffer to be appended
+ * patterns: the array of patterns to be inserted into the CTE
+ * conn: the database connection
+ */
+static void
+append_rel_pattern_raw_cte(PQExpBuffer buf, const PatternInfoArray *pia,
+ PGconn *conn)
+{
+ int pattern_id;
+ const char *comma;
+ bool have_values;
+
+ comma = "";
+ have_values = false;
+ for (pattern_id = 0; pattern_id < pia->len; pattern_id++)
+ {
+ PatternInfo *info = &pia->data[pattern_id];
+
+ if (!have_values)
+ appendPQExpBufferStr(buf, "\nVALUES");
+ have_values = true;
+ appendPQExpBuffer(buf, "%s\n(%d::INTEGER, ", comma, pattern_id);
+ if (info->db_regex == NULL)
+ appendPQExpBufferStr(buf, "NULL");
+ else
+ appendStringLiteralConn(buf, info->db_regex, conn);
+ appendPQExpBufferStr(buf, "::TEXT, ");
+ if (info->nsp_regex == NULL)
+ appendPQExpBufferStr(buf, "NULL");
+ else
+ appendStringLiteralConn(buf, info->nsp_regex, conn);
+ appendPQExpBufferStr(buf, "::TEXT, ");
+ if (info->rel_regex == NULL)
+ appendPQExpBufferStr(buf, "NULL");
+ else
+ appendStringLiteralConn(buf, info->rel_regex, conn);
+ if (info->heap_only)
+ appendPQExpBufferStr(buf, "::TEXT, true::BOOLEAN");
+ else
+ appendPQExpBufferStr(buf, "::TEXT, false::BOOLEAN");
+ if (info->btree_only)
+ appendPQExpBufferStr(buf, ", true::BOOLEAN");
+ else
+ appendPQExpBufferStr(buf, ", false::BOOLEAN");
+ appendPQExpBufferStr(buf, ")");
+ comma = ",";
+ }
+
+ if (!have_values)
+ appendPQExpBufferStr(buf,
+ "\nSELECT NULL::INTEGER, NULL::TEXT, NULL::TEXT, "
+ "NULL::TEXT, NULL::BOOLEAN, NULL::BOOLEAN "
+ "WHERE false");
+}
+
+/*
+ * append_rel_pattern_filtered_cte
+ *
+ * Appends to the buffer a Common Table Expression (CTE) which selects
+ * all patterns from the named raw CTE, filtered by database. All patterns
+ * which have no database portion or whose database portion matches our
+ * connection's database name are selected, with other patterns excluded.
+ *
+ * The basic idea here is that if we're connected to database "foo" and we have
+ * patterns "foo.bar.baz", "alpha.beta" and "one.two.three", we only want to
+ * use the first two while processing relations in this database, as the third
+ * one is not relevant.
+ *
+ * buf: the buffer to be appended
+ * raw: the name of the CTE to select from
+ * filtered: the name of the CTE to create
+ * conn: the database connection
+ */
+static void
+append_rel_pattern_filtered_cte(PQExpBuffer buf, const char *raw,
+ const char *filtered, PGconn *conn)
+{
+ appendPQExpBuffer(buf,
+ "\n%s (pattern_id, nsp_regex, rel_regex, heap_only, btree_only) AS ("
+ "\nSELECT pattern_id, nsp_regex, rel_regex, heap_only, btree_only "
+ "FROM %s r"
+ "\nWHERE (r.db_regex IS NULL "
+ "OR ",
+ filtered, raw);
+ appendStringLiteralConn(buf, PQdb(conn), conn);
+ appendPQExpBufferStr(buf, " ~ r.db_regex)");
+ appendPQExpBufferStr(buf,
+ " AND (r.nsp_regex IS NOT NULL"
+ " OR r.rel_regex IS NOT NULL)"
+ "),");
+}
+
+/*
+ * compile_relation_list_one_db
+ *
+ * Compiles a list of relations to check within the currently connected
+ * database based on the user supplied options, sorted by descending size,
+ * and appends them to the given list of relations.
+ *
+ * The cells of the constructed list contain all information about the relation
+ * necessary to connect to the database and check the object, including which
+ * database to connect to, where contrib/amcheck is installed, and the Oid and
+ * type of object (heap table vs. btree index). Rather than duplicating the
+ * database details per relation, the relation structs use references to the
+ * same database object, provided by the caller.
+ *
+ * conn: connection to this next database, which should be the same as in 'dat'
+ * relations: list onto which the relations information should be appended
+ * dat: the database info struct for use by each relation
+ * pagecount: gets incremented by the number of blocks to check in all
+ * relations added
+ */
+static void
+compile_relation_list_one_db(PGconn *conn, SimplePtrList *relations,
+ const DatabaseInfo *dat,
+ uint64 *pagecount)
+{
+ PGresult *res;
+ PQExpBufferData sql;
+ int ntups;
+ int i;
+
+ initPQExpBuffer(&sql);
+ appendPQExpBufferStr(&sql, "WITH");
+
+ /* Append CTEs for the relation inclusion patterns, if any */
+ if (!opts.allrel)
+ {
+ appendPQExpBufferStr(&sql,
+ " include_raw (pattern_id, db_regex, nsp_regex, rel_regex, heap_only, btree_only) AS (");
+ append_rel_pattern_raw_cte(&sql, &opts.include, conn);
+ appendPQExpBufferStr(&sql, "\n),");
+ append_rel_pattern_filtered_cte(&sql, "include_raw", "include_pat", conn);
+ }
+
+ /* Append CTEs for the relation exclusion patterns, if any */
+ if (opts.excludetbl || opts.excludeidx || opts.excludensp)
+ {
+ appendPQExpBufferStr(&sql,
+ " exclude_raw (pattern_id, db_regex, nsp_regex, rel_regex, heap_only, btree_only) AS (");
+ append_rel_pattern_raw_cte(&sql, &opts.exclude, conn);
+ appendPQExpBufferStr(&sql, "\n),");
+ append_rel_pattern_filtered_cte(&sql, "exclude_raw", "exclude_pat", conn);
+ }
+
+ /* Append the relation CTE. */
+ appendPQExpBufferStr(&sql,
+ " relation (pattern_id, oid, nspname, relname, reltoastrelid, relpages, is_heap, is_btree) AS ("
+ "\nSELECT DISTINCT ON (c.oid");
+ if (!opts.allrel)
+ appendPQExpBufferStr(&sql, ", ip.pattern_id) ip.pattern_id,");
+ else
+ appendPQExpBufferStr(&sql, ") NULL::INTEGER AS pattern_id,");
+ appendPQExpBuffer(&sql,
+ "\nc.oid, n.nspname, c.relname, c.reltoastrelid, c.relpages, "
+ "c.relam = %u AS is_heap, "
+ "c.relam = %u AS is_btree"
+ "\nFROM pg_catalog.pg_class c "
+ "INNER JOIN pg_catalog.pg_namespace n "
+ "ON c.relnamespace = n.oid",
+ HEAP_TABLE_AM_OID, BTREE_AM_OID);
+ if (!opts.allrel)
+ appendPQExpBuffer(&sql,
+ "\nINNER JOIN include_pat ip"
+ "\nON (n.nspname ~ ip.nsp_regex OR ip.nsp_regex IS NULL)"
+ "\nAND (c.relname ~ ip.rel_regex OR ip.rel_regex IS NULL)"
+ "\nAND (c.relam = %u OR NOT ip.heap_only)"
+ "\nAND (c.relam = %u OR NOT ip.btree_only)",
+ HEAP_TABLE_AM_OID, BTREE_AM_OID);
+ if (opts.excludetbl || opts.excludeidx || opts.excludensp)
+ appendPQExpBuffer(&sql,
+ "\nLEFT OUTER JOIN exclude_pat ep"
+ "\nON (n.nspname ~ ep.nsp_regex OR ep.nsp_regex IS NULL)"
+ "\nAND (c.relname ~ ep.rel_regex OR ep.rel_regex IS NULL)"
+ "\nAND (c.relam = %u OR NOT ep.heap_only OR ep.rel_regex IS NULL)"
+ "\nAND (c.relam = %u OR NOT ep.btree_only OR ep.rel_regex IS NULL)",
+ HEAP_TABLE_AM_OID, BTREE_AM_OID);
+
+ /*
+ * Exclude temporary tables and indexes, which must necessarily belong to
+ * other sessions. (We don't create any ourselves.) We must ultimately
+ * exclude indexes marked invalid or not ready, but we delay that decision
+ * until firing off the amcheck command, as the state of an index may
+ * change by then.
+ */
+ appendPQExpBufferStr(&sql, "\nWHERE c.relpersistence != 't'");
+ if (opts.excludetbl || opts.excludeidx || opts.excludensp)
+ appendPQExpBufferStr(&sql, "\nAND ep.pattern_id IS NULL");
+
+ /*
+ * We need to be careful not to break the --no-dependent-toast and
+ * --no-dependent-indexes options. By default, the btree indexes, toast
+ * tables, and toast table btree indexes associated with primary heap
+ * tables are included, using their own CTEs below. We implement the
+ * --exclude-* options by not creating those CTEs, but that's no use if
+ * we've already selected the toast and indexes here. On the other hand,
+ * we want inclusion patterns that match indexes or toast tables to be
+ * honored. So, if inclusion patterns were given, we want to select all
+ * tables, toast tables, or indexes that match the patterns. But if no
+ * inclusion patterns were given, and we're simply matching all relations,
+ * then we only want to match the primary tables here.
+ */
+ if (opts.allrel)
+ appendPQExpBuffer(&sql,
+ " AND c.relam = %u "
+ "AND c.relkind IN ('r', 'S', 'm', 't') "
+ "AND c.relnamespace != %u",
+ HEAP_TABLE_AM_OID, PG_TOAST_NAMESPACE);
+ else
+ appendPQExpBuffer(&sql,
+ " AND c.relam IN (%u, %u)"
+ "AND c.relkind IN ('r', 'S', 'm', 't', 'i') "
+ "AND ((c.relam = %u AND c.relkind IN ('r', 'S', 'm', 't')) OR "
+ "(c.relam = %u AND c.relkind = 'i'))",
+ HEAP_TABLE_AM_OID, BTREE_AM_OID,
+ HEAP_TABLE_AM_OID, BTREE_AM_OID);
+
+ appendPQExpBufferStr(&sql,
+ "\nORDER BY c.oid)");
+
+ if (!opts.no_toast_expansion)
+ {
+ /*
+ * Include a CTE for toast tables associated with primary heap tables
+ * selected above, filtering by exclusion patterns (if any) that match
+ * toast table names.
+ */
+ appendPQExpBufferStr(&sql,
+ ", toast (oid, nspname, relname, relpages) AS ("
+ "\nSELECT t.oid, 'pg_toast', t.relname, t.relpages"
+ "\nFROM pg_catalog.pg_class t "
+ "INNER JOIN relation r "
+ "ON r.reltoastrelid = t.oid");
+ if (opts.excludetbl || opts.excludensp)
+ appendPQExpBufferStr(&sql,
+ "\nLEFT OUTER JOIN exclude_pat ep"
+ "\nON ('pg_toast' ~ ep.nsp_regex OR ep.nsp_regex IS NULL)"
+ "\nAND (t.relname ~ ep.rel_regex OR ep.rel_regex IS NULL)"
+ "\nAND ep.heap_only"
+ "\nWHERE ep.pattern_id IS NULL"
+ "\nAND t.relpersistence != 't'");
+ appendPQExpBufferStr(&sql,
+ "\n)");
+ }
+ if (!opts.no_btree_expansion)
+ {
+ /*
+ * Include a CTE for btree indexes associated with primary heap tables
+ * selected above, filtering by exclusion patterns (if any) that match
+ * btree index names.
+ */
+ appendPQExpBuffer(&sql,
+ ", index (oid, nspname, relname, relpages) AS ("
+ "\nSELECT c.oid, r.nspname, c.relname, c.relpages "
+ "FROM relation r"
+ "\nINNER JOIN pg_catalog.pg_index i "
+ "ON r.oid = i.indrelid "
+ "INNER JOIN pg_catalog.pg_class c "
+ "ON i.indexrelid = c.oid "
+ "AND c.relpersistence != 't'");
+ if (opts.excludeidx || opts.excludensp)
+ appendPQExpBufferStr(&sql,
+ "\nINNER JOIN pg_catalog.pg_namespace n "
+ "ON c.relnamespace = n.oid"
+ "\nLEFT OUTER JOIN exclude_pat ep "
+ "ON (n.nspname ~ ep.nsp_regex OR ep.nsp_regex IS NULL) "
+ "AND (c.relname ~ ep.rel_regex OR ep.rel_regex IS NULL) "
+ "AND ep.btree_only"
+ "\nWHERE ep.pattern_id IS NULL");
+ else
+ appendPQExpBufferStr(&sql,
+ "\nWHERE true");
+ appendPQExpBuffer(&sql,
+ " AND c.relam = %u "
+ "AND c.relkind = 'i'",
+ BTREE_AM_OID);
+ if (opts.no_toast_expansion)
+ appendPQExpBuffer(&sql,
+ " AND c.relnamespace != %u",
+ PG_TOAST_NAMESPACE);
+ appendPQExpBufferStr(&sql, "\n)");
+ }
+
+ if (!opts.no_toast_expansion && !opts.no_btree_expansion)
+ {
+ /*
+ * Include a CTE for btree indexes associated with toast tables of
+ * primary heap tables selected above, filtering by exclusion patterns
+ * (if any) that match the toast index names.
+ */
+ appendPQExpBuffer(&sql,
+ ", toast_index (oid, nspname, relname, relpages) AS ("
+ "\nSELECT c.oid, 'pg_toast', c.relname, c.relpages "
+ "FROM toast t "
+ "INNER JOIN pg_catalog.pg_index i "
+ "ON t.oid = i.indrelid"
+ "\nINNER JOIN pg_catalog.pg_class c "
+ "ON i.indexrelid = c.oid "
+ "AND c.relpersistence != 't'");
+ if (opts.excludeidx)
+ appendPQExpBufferStr(&sql,
+ "\nLEFT OUTER JOIN exclude_pat ep "
+ "ON ('pg_toast' ~ ep.nsp_regex OR ep.nsp_regex IS NULL) "
+ "AND (c.relname ~ ep.rel_regex OR ep.rel_regex IS NULL) "
+ "AND ep.btree_only "
+ "WHERE ep.pattern_id IS NULL");
+ else
+ appendPQExpBufferStr(&sql,
+ "\nWHERE true");
+ appendPQExpBuffer(&sql,
+ " AND c.relam = %u"
+ " AND c.relkind = 'i')",
+ BTREE_AM_OID);
+ }
+
+ /*
+ * Roll-up distinct rows from CTEs.
+ *
+ * Relations that match more than one pattern may occur more than once in
+ * the list, and indexes and toast for primary relations may also have
+ * matched in their own right, so we rely on UNION to deduplicate the
+ * list.
+ */
+ appendPQExpBuffer(&sql,
+ "\nSELECT pattern_id, is_heap, is_btree, oid, nspname, relname, relpages "
+ "FROM (");
+ appendPQExpBufferStr(&sql,
+ /* Inclusion patterns that failed to match */
+ "\nSELECT pattern_id, is_heap, is_btree, "
+ "NULL::OID AS oid, "
+ "NULL::TEXT AS nspname, "
+ "NULL::TEXT AS relname, "
+ "NULL::INTEGER AS relpages"
+ "\nFROM relation "
+ "WHERE pattern_id IS NOT NULL "
+ "UNION"
+ /* Primary relations */
+ "\nSELECT NULL::INTEGER AS pattern_id, "
+ "is_heap, is_btree, oid, nspname, relname, relpages "
+ "FROM relation");
+ if (!opts.no_toast_expansion)
+ appendPQExpBufferStr(&sql,
+ " UNION"
+ /* Toast tables for primary relations */
+ "\nSELECT NULL::INTEGER AS pattern_id, TRUE AS is_heap, "
+ "FALSE AS is_btree, oid, nspname, relname, relpages "
+ "FROM toast");
+ if (!opts.no_btree_expansion)
+ appendPQExpBufferStr(&sql,
+ " UNION"
+ /* Indexes for primary relations */
+ "\nSELECT NULL::INTEGER AS pattern_id, FALSE AS is_heap, "
+ "TRUE AS is_btree, oid, nspname, relname, relpages "
+ "FROM index");
+ if (!opts.no_toast_expansion && !opts.no_btree_expansion)
+ appendPQExpBufferStr(&sql,
+ " UNION"
+ /* Indexes for toast relations */
+ "\nSELECT NULL::INTEGER AS pattern_id, FALSE AS is_heap, "
+ "TRUE AS is_btree, oid, nspname, relname, relpages "
+ "FROM toast_index");
+ appendPQExpBufferStr(&sql,
+ "\n) AS combined_records "
+ "ORDER BY relpages DESC NULLS FIRST, oid");
+
+ res = executeQuery(conn, sql.data, opts.echo);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("query failed: %s", PQerrorMessage(conn));
+ pg_log_error_detail("Query was: %s", sql.data);
+ disconnectDatabase(conn);
+ exit(1);
+ }
+ termPQExpBuffer(&sql);
+
+ ntups = PQntuples(res);
+ for (i = 0; i < ntups; i++)
+ {
+ int pattern_id = -1;
+ bool is_heap = false;
+ bool is_btree PG_USED_FOR_ASSERTS_ONLY = false;
+ Oid oid = InvalidOid;
+ const char *nspname = NULL;
+ const char *relname = NULL;
+ int relpages = 0;
+
+ if (!PQgetisnull(res, i, 0))
+ pattern_id = atoi(PQgetvalue(res, i, 0));
+ if (!PQgetisnull(res, i, 1))
+ is_heap = (PQgetvalue(res, i, 1)[0] == 't');
+ if (!PQgetisnull(res, i, 2))
+ is_btree = (PQgetvalue(res, i, 2)[0] == 't');
+ if (!PQgetisnull(res, i, 3))
+ oid = atooid(PQgetvalue(res, i, 3));
+ if (!PQgetisnull(res, i, 4))
+ nspname = PQgetvalue(res, i, 4);
+ if (!PQgetisnull(res, i, 5))
+ relname = PQgetvalue(res, i, 5);
+ if (!PQgetisnull(res, i, 6))
+ relpages = atoi(PQgetvalue(res, i, 6));
+
+ if (pattern_id >= 0)
+ {
+ /*
+ * Current record pertains to an inclusion pattern. Record that
+ * it matched.
+ */
+
+ if (pattern_id >= opts.include.len)
+ pg_fatal("internal error: received unexpected relation pattern_id %d",
+ pattern_id);
+
+ opts.include.data[pattern_id].matched = true;
+ }
+ else
+ {
+ /* Current record pertains to a relation */
+
+ RelationInfo *rel = (RelationInfo *) pg_malloc0(sizeof(RelationInfo));
+
+ Assert(OidIsValid(oid));
+ Assert((is_heap && !is_btree) || (is_btree && !is_heap));
+
+ rel->datinfo = dat;
+ rel->reloid = oid;
+ rel->is_heap = is_heap;
+ rel->nspname = pstrdup(nspname);
+ rel->relname = pstrdup(relname);
+ rel->relpages = relpages;
+ rel->blocks_to_check = relpages;
+ if (is_heap && (opts.startblock >= 0 || opts.endblock >= 0))
+ {
+ /*
+ * We apply --startblock and --endblock to heap tables, but
+ * not btree indexes, and for progress purposes we need to
+ * track how many blocks we expect to check.
+ */
+ if (opts.endblock >= 0 && rel->blocks_to_check > opts.endblock)
+ rel->blocks_to_check = opts.endblock + 1;
+ if (opts.startblock >= 0)
+ {
+ if (rel->blocks_to_check > opts.startblock)
+ rel->blocks_to_check -= opts.startblock;
+ else
+ rel->blocks_to_check = 0;
+ }
+ }
+ *pagecount += rel->blocks_to_check;
+
+ simple_ptr_list_append(relations, rel);
+ }
+ }
+ PQclear(res);
+}
diff --git a/src/bin/pg_amcheck/po/de.po b/src/bin/pg_amcheck/po/de.po
new file mode 100644
index 0000000..cf5b3b9
--- /dev/null
+++ b/src/bin/pg_amcheck/po/de.po
@@ -0,0 +1,533 @@
+# German message translation file for pg_amcheck
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-11 15:50+0000\n"
+"PO-Revision-Date: 2022-05-11 22:10+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Abbruchsanforderung gesendet\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Konnte Abbruchsanforderung nicht senden: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "konnte nicht mit Datenbank %s verbinden: Speicher aufgebraucht"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ungültiger Wert »%s« für Option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s muss im Bereich %d..%d sein"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1645 pg_amcheck.c:2090
+#, c-format
+msgid "query failed: %s"
+msgstr "Anfrage fehlgeschlagen: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1100 pg_amcheck.c:1646 pg_amcheck.c:2091
+#, c-format
+msgid "Query was: %s"
+msgstr "Anfrage war: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "ungültiges Argument für Option %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "ungültiger Startblock"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "Startblock außerhalb des gültigen Bereichs"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "ungültiger Endblock"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "Endblock außerhalb des gültigen Bereichs"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "Endblock kommt vor dem Startblock"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "ein Datenbankname kann nicht mit --all angegeben werden"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "Datenbankname und Datenbankmuster können nicht zusammen angegeben werden"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "keine zu prüfenden Datenbanken"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "Datenbank »%s«: %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "Datenbank »%s« übersprungen: amcheck nicht installiert"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "in Datenbank »%s«: verwende amcheck Version »%s« in Schema »%s«"
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "keine zu prüfenden Tabellen, die mit »%s« übereinstimmen"
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "keine zu prüfenden B-Tree-Indexe, die mit »%s« übereinstimmen"
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "keine zu prüfenden Relationen in Schemas, die mit »%s« übereinstimmen"
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "keine zu prüfenden Relationen, die mit »%s« übereinstimmen"
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "keine zu prüfenden Relationen"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "prüfe Heap-Tabelle »%s.%s.%s«"
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "prüfe B-Tree-Index »%s.%s.%s«"
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "Fehler beim Senden von Befehl an Datenbank »%s«: %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "Die Anweisung war: %s"
+
+#: pg_amcheck.c:1013
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "Heap-Tabelle »%s.%s.%s«, Block %s, Offset %s, Attribut %s:\n"
+
+#: pg_amcheck.c:1020
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "Heap-Tabelle »%s.%s.%s«, Block %s, Offset %s:\n"
+
+#: pg_amcheck.c:1026
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "Heap-Tabelle »%s.%s.%s«, Block %s:\n"
+
+#: pg_amcheck.c:1031 pg_amcheck.c:1042
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "Heap-Tabelle »%s.%s.%s«:\n"
+
+#: pg_amcheck.c:1046 pg_amcheck.c:1115
+#, c-format
+msgid "query was: %s\n"
+msgstr "Anfrage war: %s\n"
+
+#: pg_amcheck.c:1097
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "B-Tree-Index »%s.%s.%s«: B-Tree-Prüffunktion gab unerwartete Anzahl Zeilen zurück: %d"
+
+#: pg_amcheck.c:1101
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "Sind die Versionen von %s und amcheck kompatibel?"
+
+#: pg_amcheck.c:1111
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "B-Tree-Index »%s.%s.%s«:\n"
+
+#: pg_amcheck.c:1136
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s prüft Objekte in einer PostgreSQL-Datenbank auf Beschädigung.\n"
+"\n"
+
+#: pg_amcheck.c:1137
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [DBNAME]\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"Zieloptionen:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all alle Datenbanken prüfen\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=MUSTER übereinstimmende Datenbanken prüfen\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=MUSTER übereinstimmende Datenbanken NICHT prüfen\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=MUSTER übereinstimmende Indexe prüfen\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=MUSTER übereinstimmende Indexe NICHT prüfen\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=MUSTER übereinstimmende Relationen prüfen\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=MUSTER übereinstimmende Relationen NICHT prüfen\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=MUSTER übereinstimmende Schemas prüfen\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=MUSTER übereinstimmende Schemas NICHT prüfen\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=MUSTER übereinstimmende Tabellen prüfen\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=MUSTER übereinstimmende Tabellen NICHT prüfen\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr " --no-dependent-indexes Liste der Relationen NICHT um Indexe erweitern\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr " --no-dependent-toast Liste der Relationen NICHT um TOAST-Tabellen erweitern\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr " --no-strict-names Muster müssen NICHT mit Objekten übereinstimmen\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"Optionen für Tabellen:\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers TOAST-Zeigern NICHT folgen\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop Prüfung nach der ersten beschädigten Seite beenden\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr " --skip=OPTION Blöcke mit »all-frozen« oder »all-visible« NICHT prüfen\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr " --startblock=BLOCK Prüfen der Tabelle(n) bei angegebener Blocknummer beginnen\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOCK Tabelle(n) nur bis zur angegebenen Blocknummer prüfen\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"Optionen für B-Tree-Indexe:\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr " --heapallindexed prüfen, dass alle Heap-Tupel in Indexen zu finden sind\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check Index-Eltern/Kind-Beziehungen prüfen\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend Tupel erneut von der Wurzelseite aus suchen\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Verbindungsoptionen:\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT Port des Datenbankservers\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=NAME Datenbankbenutzername\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password niemals nach Passwort fragen\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password Passwortfrage erzwingen\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME alternative Wartungsdatenbank\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Weitere Optionen:\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr ""
+" -e, --echo zeige die Befehle, die an den Server\n"
+" gesendet werden\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr ""
+" -j, --jobs=NUM so viele parallele Verbindungen zum Server\n"
+" verwenden\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress Fortschrittsinformationen zeigen\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose erzeuge viele Meldungen\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing fehlende Erweiterungen installieren\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: pg_amcheck.c:1181
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_amcheck.c:1234
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s Relationen (%d%%), %*s/%s Seiten (%d%%) %*s"
+
+#: pg_amcheck.c:1245
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s Relationen (%d%%), %*s/%s Seiten (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1260
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s Relationen (%d%%), %*s/%s Seiten (%d%%)"
+
+#: pg_amcheck.c:1319 pg_amcheck.c:1352
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "falscher qualifizierter Name (zu viele Namensteile): %s"
+
+#: pg_amcheck.c:1397
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "falscher Relationsname (zu viele Namensteile): %s"
+
+#: pg_amcheck.c:1550 pg_amcheck.c:1689
+#, c-format
+msgid "including database \"%s\""
+msgstr "Datenbank »%s« einbezogen"
+
+#: pg_amcheck.c:1671
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "interner Fehler: unerwartete pattern_id %d für Datenbank empfangen"
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "keine Datenbanken, mit denen verbunden werden kann und die mit »%s« übereinstimmen"
+
+#: pg_amcheck.c:2131
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "interner Fehler: unerwartete pattern_id %d für Relation empfangen"
diff --git a/src/bin/pg_amcheck/po/el.po b/src/bin/pg_amcheck/po/el.po
new file mode 100644
index 0000000..a75941b
--- /dev/null
+++ b/src/bin/pg_amcheck/po/el.po
@@ -0,0 +1,545 @@
+# Greek message translation file for pg_amcheck
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 16:50+0000\n"
+"PO-Revision-Date: 2023-04-13 13:49+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "προειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέρεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Αίτηση ακύρωσης εστάλη\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Δεν ήταν δυνατή η αποστολή αίτησης ακύρωσης: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "δεν ήταν δυνατή η σύνδεση με τη βάσης δεδομένων %s: έλλειψη μνήμης"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "μη έγκυρη τιμή «%s» για την επιλογή %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s πρέπει να βρίσκεται εντός εύρους %d..%d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "το ερώτημα απέτυχε: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "Το ερώτημα ήταν: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "μη έγκυρη παράμετρος για την επιλογή %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "μη έγκυρο μπλοκ εκκίνησης"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "μπλοκ εκκίνησης εκτός ορίων"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "μη έγκυρο μπλοκ τερματισμού"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "μπλοκ τερματισμού εκτός ορίων"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "μπλοκ τερματισμού προηγείται του μπλοκ εκκίνησης"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "δεν είναι δυνατό να οριστεί ένα όνομα βάσης δεδομένων μαζί με --all"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "δεν είναι δυνατός ο καθορισμός τόσο ενός ονόματος βάσης δεδομένων όσο και μοτίβων βάσης δεδομένων"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "καθόλου βάσεις δεδομένων για έλεγχο"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "βάση δεδομένων «%s»: %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "παρακάμπτει βάση δεδομένων «%s»: το amcheck δεν είναι εγκαταστημένο"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "στη βάση δεδομένων «%s»: χρησιμοποιώντας την έκδοση «%s» του amcheck στο σχήμα «%s»"
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "δεν υπάρχουν πίνακες heap για έλεγχο που ταιριάζουν με «%s»"
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "δεν υπάρχουν ευρετήρια BTREE για έλεγχο που ταιριάζουν με «%s»"
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "καθόλου σχέσεις για έλεγχο σε σχήματα που ταιριάζουν με «%s»"
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "καθόλου σχέσεις για έλεγχο που ταιριάζουν με «%s»"
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "καθόλου σχέσεις για έλεγχο"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "ελέγχει τον πίνακα heap «%s.%s.%s»"
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "ελέγχει το ευρετήριο btree «%s.%s.%s»"
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "εντολή αποστολής σφάλματος στη βάση δεδομένων «%s»: %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "Η εντολή ήταν: %s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "πίνακας heap «%s.%s.%s», μπλοκ %s, μετατόπιση %s, χαρακτηριστικό %s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "πίνακας heap «%s.%s.%s», μπλοκ %s, μετατόπιση %s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "πίνακας heap «%s.%s.%s», μπλοκ %s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "πίνακας heap «%s.%s.%s»:\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "το ερώτημα ήταν: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "ευρετήριο btree «%s.%s.%s»: η συνάρτηση ελέγχου btree επέστρεψε απροσδόκητο αριθμό γραμμών: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "Είναι συμβατές οι εκδόσεις του %s και του amcheck;"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "ευρετήριο btree «%s.%s.%s»:\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s ελέγχει αντικείμενα σε μια βάση δεδομένων PostgreSQL για αλλοίωση.\n"
+"\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "Χρήση:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"Επιλογές στόχου:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all έλεγξε όλες τις βάσεις δεδομένων\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=PATTERN έλεγξε ταιριαστή(-ες) με το μοτίβο βάση(-εις) δεδομένων\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=PATTERN να ΜΗΝ ελέγξει ταιριαστή(-ες) με το μοτίβο βάση(-εις) δεδομένων\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=PATTERN έλεγξε ταιριαστό(-ά) με το μοτίβο ευρετήριο(-ά)\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=PATTERN να ΜΗΝ ελέγξει ταιριαστό(-ά) με το μοτίβο ευρετήριο(-ά)\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -i, --index=PATTERN έλεγξε ταιριαστή(-ές) με το μοτίβο σχέση(-εις)\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=PATTERN να ΜΗΝ ελέγξει ταιριαστή(-ές) με το μοτίβο σχέση(-εις)\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=PATTERN έλεγξε ταιριαστό(-ά) με το μοτίβο σχήμα(-τα)\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=PATTERN να ΜΗΝ ελέγξει ταιριαστό(-ά) με το μοτίβο σχήμα(-τα)\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=PATTERN έλεγξε ταιριαστό(-ούς) με το μοτίβο πίνακα(-ες)\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=PATTERN να ΜΗΝ ελέγξει ταιριαστό(-ούς) με το μοτίβο πίνακα(-ες)\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr " --no-dependent-indexes να ΜΗΝ επεκτείνεις τη λίστα σχέσεων ώστε να συμπεριλάβει ευρετήρια\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr " --no-dependent-toast να ΜΗΝ επεκτείνεις τη λίστα σχέσεων ώστε να συμπεριλάβει πίνακες TOAST\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr " --no-strict-names να ΜΗΝ απαιτήσει μοτίβα για την αντιστοίχιση αντικειμένων\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"Επιλογές ελέγχου πίνακα:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers να ΜΗΝ ακολουθήσει τους δείκτες σχέσεων TOAST\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop διακοπή ελέγχου στο τέλος της πρώτης αλλοιωμένης σελίδας\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr " --skip=OPTION να ΜΗΝ ελέγξει τα «all-frozen» ή «all-visible» μπλοκ\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr " --startblock=BLOCK εκκίνηση του ελέγχου πίνακα(-ων) από τον δοσμένο αριθμό μπλοκ\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOCK τερματισμός του ελέγχου πίνακα(-ων) από τον δοσμένο αριθμό μπλοκ\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"Επιλογές ελέγχου ευρετηρίου B-tree:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr " --heapallindexed έλεγξε ότι όλες οι πλειάδες heap περιλαμβάνονται σε ευρετήρια\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check έλεγξε σχέσεις γονέα/απογόνου ευρετηρίου\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend αναζήτησε από τη ριζική σελίδα για την επανεύρεση πλειάδων\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Επιλογές σύνδεσης:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT θύρα διακομιστή βάσης δεδομένων\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME όνομα χρήστη με το οποίο να συνδεθεί\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός πρόσβασης\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password αναγκαστική προτροπή κωδικού πρόσβασης\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME εναλλακτική βάση δεδομένων συντήρησης\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Άλλες επιλογές:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr " -j, --jobs=NUM χρησιμοποιήσε τόσες πολλές ταυτόχρονες συνδέσεις με το διακομιστή\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress εμφάνισε πληροφορίες προόδου\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose γράψε πολλά μηνύματα εξόδου\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing εγκατάστησε επεκτάσεις που λείπουν\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφορές σφάλματων σε <%s>.\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αρχική σελίδα: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s σχέσεις (%d%%), %*s/%s σελίδες (%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s σχέσεις (%d%%), %*s/%s σελίδες (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s σχέσεις (%d%%), %*s/%s σελίδες (%d%%)"
+
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "ακατάλληλο αναγνωρισμένο όνομα (πάρα πολλά διάστικτα ονόματα): %s"
+
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "ακατάλληλο όνομα σχέσης (πολλά διάστικτα ονόματα): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "συμπεριλαμβανομένης της βάσης δεδομένων «%s»"
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "εσωτερικό σφάλμα: ελήφθη μη αναμενόμενο pattern_id %d"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "δεν υπάρχουν βάσεις δεδομένων με δυνατότητα σύνδεσης για έλεγχο που να ταιριάζουν με «%s»"
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "εσωτερικό σφάλμα: ελήφθη μη αναμενόμενο pattern_id σχέσης %d"
+
+#~ msgid " -q, --quiet don't write any messages\n"
+#~ msgstr " -q, --quiet να μην γράψεις κανένα μήνυμα\n"
+
+#~ msgid "command was: %s"
+#~ msgstr "η εντολή ήταν: %s"
+
+#~ msgid "fatal: "
+#~ msgstr "κρίσιμο: "
+
+#~ msgid "number of parallel jobs must be at least 1"
+#~ msgstr "ο αριθμός παράλληλων εργασιών πρέπει να είναι τουλάχιστον 1"
diff --git a/src/bin/pg_amcheck/po/es.po b/src/bin/pg_amcheck/po/es.po
new file mode 100644
index 0000000..6c3ea4d
--- /dev/null
+++ b/src/bin/pg_amcheck/po/es.po
@@ -0,0 +1,533 @@
+# Spanish translation file for pg_amcheck
+#
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+#
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-24 23:20+0000\n"
+"PO-Revision-Date: 2022-10-20 09:06+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Petición de cancelación enviada\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "No se pudo enviar la petición de cancelación: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "no se pudo conectar a la base de datos %s: memoria agotada"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "el valor «%s» no es válido para la opción %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s debe estar en el rango %d..%d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "la consulta falló: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "La consulta era: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argumento no válido para la opción %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "bloque de inicio no válido"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "bloque de inicio fuera de rango"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "bloque final no válido"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "bloque final fuera de rango"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "bloque final precede al bloque de inicio"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "no se puede especificar un nombre de base de datos al usar --all"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "no se puede especificar al mismo tiempo un nombre de base de datos junto con patrones de bases de datos"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "no hay bases de datos para revisar"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "base de datos «%s»: %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "omitiendo la base de datos «%s»: amcheck no está instalado"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "en base de datos «%s»: usando amcheck versión «%s» en esquema «%s»"
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "no hay tablas heap para revisar que coincidan con «%s»"
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "no hay índices btree para revisar que coincidan con «%s»"
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "no hay relaciones para revisar en esquemas que coincidan con «%s»"
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "no hay relaciones para revisar que coincidan con «%s»"
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "no hay relaciones para revisar"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "revisando tabla heap «%s.%s.%s»"
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "revisando índice btree «%s.%s.%s»"
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "error al enviar orden a la base de datos «%s»: %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "La orden era: % s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "tabla heap «%s.%s.%s», bloque %s, posición %s, atributo %s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "tabla heap «%s.%s.%s», bloque %s, posición %s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "tabla heap «%s.%s.%s», bloque %s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "tabla heap «%s.%s.%s»:\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "la consulta era: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "índice btree «%s.%s.%s»: la función de comprobación de btree devolvió un número inesperado de registros: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "¿Son compatibles la versión de %s con la de amcheck?"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "índice btree «%s.%s.%s»:\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s busca corrupción en objetos de una base de datos PostgreSQL.\n"
+"\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPCIÓN]... [BASE-DE-DATOS]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"Opciones de objetivo:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all revisar todas las bases de datos\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=PATRÓN revisar la(s) base(s) de datos que coincida(n)\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=PATRÓN NO revisar la(s) base(s) de datos que coincida(n)\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=PATRÓN revisar el(los) índice(s) que coincida(n)\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=PATRÓN NO revisar el(los) índice(s) que coincida(n)\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=PATRÓN revisar la(s) relación(es) que coincida(n)\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=PATRÓN NO revisar la(s) relación(es) que coincida(n)\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=PATRÓN revisar el(los) esquema(s) que coincida(n)\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=PATRÓN NO revisar el(los) esquema(s) que coincida(n)\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=PATRÓN revisar la(s) tabla(s) que coincida(n)\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=PATRÓN NO revisar la(s) tabla(s) que coincida(n)\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr " --no-dependent-indexes NO expandir la lista de relaciones para incluir índices\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr " --no-dependent-toast NO expandir lista de relaciones para incluir tablas TOAST\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr " --no-strict-names NO requerir que los patrones coincidan con los objetos\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"Opciones para revisión de tabla:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers NO seguir punteros TOAST de la relación\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop detener la revisión al final de la primera página corrupta\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr " --skip=OPTION NO revisar bloques «all-frozen» u «all-visible»\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr " --startblock=BLOQUE empezar la revisión de la(s) tabla(s) en el número de bloque especificado\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOQUE solo revisar la(s) tabla(s) hasta el número de bloque especificado\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"Opciones para revisión de índices B-tree:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr " --heapallindexed revisar que todas las tuplas heap se encuentren en los índices\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check revisar relaciones padre/hijo de índice\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend buscar desde la página raíz para volver a encontrar tuplas\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opciones de conexión:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=ANFITRIÓN nombre del servidor o directorio del socket\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PUERTO puerto del servidor de base de datos\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USUARIO nombre de usuario para la conexión\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pedir contraseña\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password forzar la petición de contraseña\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=BASE base de datos de mantención alternativa\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Otras opciones:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostrar las órdenes enviadas al servidor\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr " -j, --jobs=NUM usar esta cantidad de conexiones concurrentes hacia el servidor\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostrar información de progreso\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose desplegar varios mensajes informativos\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing instalar extensiones faltantes\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s relaciones (%d%%), %*s/%s páginas (%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s relaciones (%d%%), %*s/%s páginas (%d%%), (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s relaciones (%d%%), %*s/%s páginas (%d%%)"
+
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "el nombre no es válido (demasiados puntos): %s"
+
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "el nombre de relación no es válido (demasiados puntos): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "incluyendo base de datos «%s»"
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "error interno: se recibió pattern_id de base de datos inesperado (%d)"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "no hay bases de datos a las que se pueda conectar que coincidan con «%s»"
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "error interno: se recibió pattern_id de relación inesperado (%d)"
diff --git a/src/bin/pg_amcheck/po/fr.po b/src/bin/pg_amcheck/po/fr.po
new file mode 100644
index 0000000..9fc553f
--- /dev/null
+++ b/src/bin/pg_amcheck/po/fr.po
@@ -0,0 +1,605 @@
+# LANGUAGE message translation file for pg_amcheck
+# Copyright (C) 2021-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2021-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-14 10:19+0000\n"
+"PO-Revision-Date: 2022-05-14 17:15+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Requête d'annulation envoyée\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "N'a pas pu envoyer la requête d'annulation : "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "n'a pas pu se connecter à la base de données %s : plus de mémoire"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valeur « %s » invalide pour l'option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s doit être compris entre %d et %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1645 pg_amcheck.c:2090
+#, c-format
+msgid "query failed: %s"
+msgstr "échec de la requête : %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1100 pg_amcheck.c:1646 pg_amcheck.c:2091
+#, c-format
+msgid "Query was: %s"
+msgstr "La requête était : %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argument invalide pour l'option %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "bloc de début invalide"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "bloc de début hors des limites"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "bloc de fin invalide"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "bloc de fin hors des limites"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "le bloc de fin précède le bloc de début"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "ne peut pas spécifier un nom de base de données avec --all"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "ne peut pas spécifier à la fois le nom d'une base de données et des motifs de noms de base"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "aucune base de données à vérifier"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "base de données « %s » : %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "ignore la base « %s » : amcheck n'est pas installé"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "dans la base de données « %s » : utilisation de la version « %s » d'amcheck dans le schéma « %s »"
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "aucune table heap à vérifier correspondant à « %s »"
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "aucun index btree à vérifier correspondant à « %s »"
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "aucune relation à vérifier dans les schémas correspondant à « %s »"
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "aucune relation à vérifier correspondant à « %s »"
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "aucune relation à vérifier"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "vérification de la table heap « %s %s.%s »"
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "vérification de l'index btree « %s %s.%s »"
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "erreur de l'envoi d'une commande à la base de données « %s » : %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "La commande était : %s"
+
+#: pg_amcheck.c:1013
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "table heap « %s.%s.%s », bloc %s, décalage %s, attribut %s :\n"
+
+#: pg_amcheck.c:1020
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "table heap « %s.%s.%s », bloc %s, décalage %s :\n"
+
+#: pg_amcheck.c:1026
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "table heap « %s %s.%s », bloc %s :\n"
+
+#: pg_amcheck.c:1031 pg_amcheck.c:1042
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "table heap « %s %s.%s » :\n"
+
+#: pg_amcheck.c:1046 pg_amcheck.c:1115
+#, c-format
+msgid "query was: %s\n"
+msgstr "la requête était : %s\n"
+
+#: pg_amcheck.c:1097
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "index btree « %s.%s.%s » : la fonction de vérification des index btree a renvoyé un nombre de lignes inattendu : %d"
+
+#: pg_amcheck.c:1101
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "est-ce que les versions de %s et d'amcheck sont compatibles ?"
+
+#: pg_amcheck.c:1111
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "vérification de l'index btree« %s %s.%s » :\n"
+
+#: pg_amcheck.c:1136
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s utilise le module amcheck pour vérifier si les objets d' une base\n"
+"PostgreSQL sont corrompus.\n"
+"\n"
+
+#: pg_amcheck.c:1137
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [BASE]\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"Options de la cible :\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all vérifie toutes les bases\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=MOTIF vérifie les bases correspondantes\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=MOTIF ne vérifie PAS les bases correspondantes\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=MOTIF vérifie les index correspondants\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=MOTIF ne vérifie PAS les index correspondants\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=MOTIF vérifie les relations correspondantes\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=MOTIF ne vérifie PAS les relations correspondantes\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=MOTIF vérifie les schémas correspondants\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=MOTIF ne vérifie PAS les schémas correspondants\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=MOTIF vérifie les tables correspondantes\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=MOTIF ne vérifie PAS les tables correspondantes\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr ""
+" --no-dependent-indexes n'étend PAS la liste des relations pour inclure\n"
+" les index\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr ""
+" --no-dependent-toast n'étend PAS la liste des relations pour inclure\n"
+" les TOAST\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr ""
+" --no-strict-names ne requiert PAS que les motifs correspondent à\n"
+" des objets\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"Options de vérification des tables :\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers ne suit PAS les pointeurs de TOAST\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr ""
+" --on-error-stop arrête la vérification à la fin du premier bloc\n"
+" corrompu\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr ""
+" --skip=OPTION ne vérifie PAS les blocs « all-frozen » et\n"
+" « all-visible »\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr ""
+" --startblock=BLOC commence la vérification des tables au numéro\n"
+" de bloc indiqué\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr ""
+" --endblock=BLOC vérifie les tables jusqu'au numéro de bloc\n"
+" indiqué\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"Options de vérification des index Btree :\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr ""
+" --heapallindexed vérifie que tous les enregistrements de la\n"
+" table sont référencés dans les index\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr ""
+" --parent-check vérifie les relations parent/enfants dans les\n"
+" index\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr ""
+" --rootdescend recherche à partir de la racine pour trouver\n"
+" les lignes\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Options de connexion :\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HÔTE IP/alias du serveur ou répertoire du socket\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT port du serveur de bases de données\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ne demande jamais un mot de passe\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password force la saisie d'un mot de passe\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=BASE change la base de maintenance\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Autres options :\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo affiche les commandes envoyées au serveur\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr ""
+" -j, --jobs=NOMBRE utilise ce nombre de connexions simultanées au\n"
+" serveur\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress affiche la progression\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mode verbeux\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing installe les extensions manquantes\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: pg_amcheck.c:1181
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_amcheck.c:1234
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "relations %*s/%s (%d%%), blocs %*s/%s (%d%%) %*s"
+
+#: pg_amcheck.c:1245
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "relations %*s/%s (%d%%), blocs %*s/%s (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1260
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "relations %*s/%s (%d%%), blocs %*s/%s (%d%%)"
+
+#: pg_amcheck.c:1319 pg_amcheck.c:1352
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "mauvaise qualification du nom (trop de points entre les noms) : %s"
+
+#: pg_amcheck.c:1397
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "nom de relation incorrecte (trop de points entre les noms) : %s"
+
+#: pg_amcheck.c:1550 pg_amcheck.c:1689
+#, c-format
+msgid "including database \"%s\""
+msgstr "en incluant la base de données : « %s »"
+
+#: pg_amcheck.c:1671
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "erreur interne : a reçu un pattern_id %d inattendu de la base"
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "aucune base de données connectable à vérifier correspondant à « %s »"
+
+#: pg_amcheck.c:2131
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "erreur interne : a reçu un pattern_id %d inattendu de la relation"
+
+#~ msgid ""
+#~ "\n"
+#~ "Other Options:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Autres options:\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help affiche cette aide, puis quitte\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version affiche la version, puis quitte\n"
+
+#~ msgid " -e, --echo show the commands being sent to the server\n"
+#~ msgstr " -e, --echo affiche les commandes envoyées au serveur\n"
+
+#~ msgid " -q, --quiet don't write any messages\n"
+#~ msgstr " -q, --quiet n'écrit aucun message\n"
+
+#~ msgid " -q, --quiet don't write any messages\n"
+#~ msgstr " -q, --quiet n'écrit aucun message\n"
+
+#~ msgid " -v, --verbose write a lot of output\n"
+#~ msgstr " -v, --verbose mode verbeux\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#, c-format
+#~ msgid "command was: %s"
+#~ msgstr "la commande était : %s"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#~ msgid "invalid skip option"
+#~ msgstr "option skip invalide"
+
+#, c-format
+#~ msgid "number of parallel jobs must be at least 1"
+#~ msgstr "le nombre maximum de jobs en parallèle doit être au moins de 1"
+
+#~ msgid "number of parallel jobs must be at least 1\n"
+#~ msgstr "le nombre de jobs parallèles doit être au moins de 1\n"
diff --git a/src/bin/pg_amcheck/po/it.po b/src/bin/pg_amcheck/po/it.po
new file mode 100644
index 0000000..881b5c3
--- /dev/null
+++ b/src/bin/pg_amcheck/po/it.po
@@ -0,0 +1,531 @@
+# LANGUAGE message translation file for pg_amcheck
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:20+0000\n"
+"PO-Revision-Date: 2022-09-30 14:42+0200\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Last-Translator: Domenico Sgarbossa <sgarbossa.domenico@gmail.com>\n"
+"Language-Team: \n"
+"X-Generator: Poedit 2.3\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Richiesta di annullamento inviata\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Impossibile inviare la richiesta di annullamento: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "impossibile connettersi al database %s: memoria insufficiente"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valore \"%s\" non valido per l'opzione %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s deve essere compreso nell'intervallo %d..%d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "query fallita: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "La richiesta era: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argomento non valido per l'opzione %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "blocco di avvio non valido"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "blocco di partenza fuori limite"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "blocco finale non valido"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "blocco finale fuori limite"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "il blocco finale precede il blocco iniziale"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "non è possibile specificare un nome di database con --all"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "non è possibile specificare sia il nome del database che i modelli del database"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "nessun database da controllare"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "database \"%s\": %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "saltando il database \"%s\": amcheck non è installato"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "nel database \"%s\": utilizzando la versione amcheck \"%s\" nello schema \"%s\""
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "nessuna tabella heap per verificare la corrispondenza \"%s\""
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "nessun indice btree per verificare la corrispondenza \"%s\""
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "nessuna relazione da archiviare negli schemi corrispondenti a \"%s\""
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "nessuna relazione da verificare corrispondente a \"%s\""
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "nessuna relazione da controllare"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "controllo della tabella heap \"%s.%s.%s\""
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "controllo dell'indice btree \"%s.%s.%s\""
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "errore durante l'invio del comando al database \"%s\": %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "Il comando era: %s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "tabella heap \"%s.%s.%s\", blocco %s, offset %s, attributo %s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "tabella heap \"%s.%s.%s\", blocco %s, offset %s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "tabella heap \"%s.%s.%s\", blocco %s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "tabella heap \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "la query era: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "btree index \"%s.%s.%s\": la funzione di controllo btree ha restituito un numero imprevisto di righe: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "Le versioni di %s e amcheck sono compatibili?"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "btree index \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s verifica la corruzione degli oggetti in un database PostgreSQL.\n"
+"\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPZIONE]... [NOMEDB]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"Opzioni di destinazione:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all controlla tutti i database\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=PATTERN controlla i database corrispondenti\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=PATTERN Non controlla i database corrispondenti\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=PATTERN controlla gli indici corrispondenti\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=PATTERN Non controlla gli indici corrispondenti\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=PATTERN controlla le relazioni di corrispondenza\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=PATTERN Non controlla le relazioni corrispondenti\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=PATTERN controlla gli schemi corrispondenti\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=PATTERN Non controlla gli schemi corrispondenti\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=PATTERN controlla le tabelle corrispondenti\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=PATTERN Non controlla le tabelle corrispondenti\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr " --no-dependent-indexes Non espande l'elenco di relazioni per includere gli indici\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr " --no-dependent-toast Non espande l'elenco delle relazioni per includere le tabelle TOAST\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr " --no-strict-names Non richiede modelli per abbinare gli oggetti\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"Opzioni di controllo della tabella:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers NON seguono i puntatori TOAST di relazione\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop interrompe il controllo alla fine della prima pagina danneggiata\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr " --skip=OPZIONE Non controlla i blocchi \"tutto congelato\" o \"tutto visibile\".\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr " --startblock=BLOCCO inizia a controllare le tabelle al numero di blocco dato\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOCCO controlla le tabelle solo fino al numero di blocco specificato\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"Opzioni di controllo dell'indice B-tree:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr " --heapallindexed controlla che tutte le tuple dell'heap si trovino all'interno degli indici\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check controlla le relazioni genitore/figlio dell'indice\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend cerca dalla pagina principale per trovare le tuple\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opzioni di connessione:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME host del database o directory socket\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT porta del server del database\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME nome utente con cui connettersi\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password non richiede mai la password\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password forza la richiesta della password\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME database di manutenzione alternativo\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Altre opzioni:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostra i comandi inviati al server\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr " -j, --jobs=NUM usa questo numero di connessioni simultanee al server\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostra le informazioni sullo stato di avanzamento\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mostra molti messaggi\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing installa le estensioni mancanti\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s relazioni (%d%%), %*s/%s pagine (%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s relazioni (%d%%), %*s/%s pagine (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s relazioni (%d%%), %*s/%s pagine (%d%%)"
+
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "nome qualificato improprio (troppi nomi puntati): %s"
+
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "nome di relazione improprio (troppi nomi puntati): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "incluso il database \"%s\""
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "errore interno: ricevuto database imprevisto pattern_id %d"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "nessun database collegabile per verificare la corrispondenza \"%s\""
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "errore interno: ricevuta relazione imprevista pattern_id %d"
diff --git a/src/bin/pg_amcheck/po/ja.po b/src/bin/pg_amcheck/po/ja.po
new file mode 100644
index 0000000..6fa8208
--- /dev/null
+++ b/src/bin/pg_amcheck/po/ja.po
@@ -0,0 +1,545 @@
+# LANGUAGE message translation file for pg_amcheck
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-09 12:00+0900\n"
+"PO-Revision-Date: 2022-05-10 11:31+0900\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "キャンセル要求を送信しました\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "キャンセル要求を送信できませんでした: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "データベース%sに接続できませんでした: メモリ不足です"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "オプション%2$sに対する不正な値\"%1$s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%sは%d..%dの範囲になければなりません"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "問い合わせが失敗しました: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "問い合わせ: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "オプション%sの引数が不正です"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "不正な開始ブロック"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "開始ブロックが範囲外です"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "不正な終了ブロック"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "終了ブロックが範囲外です"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細は\"%s --help\"を実行してください。"
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "終了ブロックが開始ブロックより前になっています"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "--allではデータベース名は指定できません"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "データベース名とデータベースパターンは同時に指定はできません"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "検査すべきデータベースがありません"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "データベース\"%s\": %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "データベース\"%s\"をスキップします: amcheckがインストールされていません"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "データベース\"%1$s\"内: スキーマ\"%3$s\"内でamcheck バージョン\"%2$s\"を使用中"
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "\"%s\"に合致する検査対象のヒープテーブルがありません"
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "%s\"に合致する検査対象のbtreeインデックスがありません"
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "\"%s\"に合致するスキーマ内に検査対象のリレーションがありません"
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "\"%s\"に合致する検査対象のリレーションがありません"
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "検査対象のリレーションがありません"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "ヒープテーブル\"%s.%s.%s\"を検査"
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "btreeインデックス\"%s.%s.%s\"を検査"
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "データベース\"%s\"へのコマンド送出中のエラー: %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "コマンド: %s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "ヒープテーブル\"%s.%s.%s\"、ブロック%s、オフセット%s、属性%s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "ヒープテーブル\"%s.%s.%s\"、ブロック%s、オフセット%s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "ヒープテーブル\"%s.%s.%s\"、ブロック%s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "ヒープテーブル\"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "問い合わせ: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "btreeインデックス\"%s.%s.%s\": btree検索関数が予期しない数の行を返却しました: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "%sとamcheckのバージョンは合っていますか?"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "btreeインデックス\"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%sはPostgreSQLデータベース内のオブジェクトの破損を検査します。\n"
+"\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [オプション]... [データベース名]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"対象指定オプション:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all すべてのデータベースを検査\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=PATTERN 合致するデータベースを検査\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=PATTERN 合致するデータベースを検査「しない」\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=PATTERN 合致するインデックスを検査\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=PATTERN 合致するインデックスを検査「しない」\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=PATTERN 合致するリレーションを検査\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=PATTERN 合致するリレーションを検査「しない」\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=PATTERN 合致するスキーマを検査\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=PATTERN 合致するスキーマを検査「しない」\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=PATTERN 合致するテーブルを検査\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=PATTERN 合致するテーブルを検査「しない」\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr ""
+" --no-dependent-indexes リレーションのリストをインデックスを含むように\n"
+" 拡張「しない」\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr ""
+" --no-dependent-toast リレーションのリストをTOASTテーブルを含む\n"
+" ように拡張「しない」\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr ""
+" --no-strict-names パターンがオブジェクトに合致することを必須と\n"
+" しない\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"テーブル検査オプション:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers リレーションのTOASTポインタを追跡「しない」\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop 最初の破損ページの終わりで検査を中断する\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr ""
+" --skip=OPTION \"all-frozen\"および\"all-visible\"である\n"
+" ブロックを検査「しない」\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr ""
+" --startblock=BLOCK 指定したブロック番号からテーブルの検査を\n"
+" 開始する\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOCK 指定したブロック番号までデーブルの検査を行う\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"B-treeインデックス検査オプション:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr ""
+" --heapallindexed すべてのヒープタプルがインデックス内に\n"
+" 見つかることを検査\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check インデックスの親子関係を検査\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend タプル再探索をルートページから実行する\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"接続オプション:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME データベースサーバーのホストまたは\n"
+" ソケットディレクトリ\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT データベースサーバーのポート\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME 接続に用いるユーザー名\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password パスワード入力を要求しない\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password パスワード入力要求を強制する\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 代替の保守データベース\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"その他のオプション:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo サーバーに送られるコマンドを表示\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr " -j, --jobs=NUM サーバーに対して指定した数の接続を使用する\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 進行状況を表示\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 多くのメッセージを出力します\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing 機能拡張がない場合にインストールする\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"バグは<%s>に報告してください。\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s個のリレーション(%d%%), %*s/%sページ(%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s個のリレーション(%d%%), %*s/%sページ(%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s個のリレーション(%d%%), %*s/%sページ(%d%%)"
+
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "修飾名が不適切です(ドット区切りの名前が多すぎます): %s"
+
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "リレーション名が不適切です(ドット区切りの名前が多すぎます): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "データベース\"%s\"を含めます"
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "内部エラー: 予期しないデータベースパターンID %dを受信"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "\"%s\"に合致する検査対象の接続可能なデータベースがありません"
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "内部エラー: 予期しないリレーションパターンID %dを受信"
diff --git a/src/bin/pg_amcheck/po/ka.po b/src/bin/pg_amcheck/po/ka.po
new file mode 100644
index 0000000..99b2c56
--- /dev/null
+++ b/src/bin/pg_amcheck/po/ka.po
@@ -0,0 +1,592 @@
+# Georgian message translation file for pg_amcheck
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:50+0000\n"
+"PO-Revision-Date: 2022-07-04 11:33+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდომა: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გაფრთხილება: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტალები: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნება: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "გაუქმების მოთხოვნა გაგზავნილია\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "გაუქმების მოთხოვნის გაგზავნა შეუძლებელია: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "ბაზასთან (%s) მიერთება შეუძლებელია: არასაკმარისი მეხსიერება"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "არასწორი მნიშვნელობა \"%s\" პარამეტრისთვის %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s არაა საზღვრებში %d-დან %d-მდე"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "მოთხოვნის შეცდომა: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "მოთხოვნის შინაარსი: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "არასწორი არგუმენტი პარამეტრისთვის: %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "არასწორი საწყისი ბლოკი"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "საწყისი ბლოკი საზღვრებს გარეთაა"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "არასწორი ბოლო ბლოკი"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "ბოლო ბლოკი საზღვრებს გარეთაა"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "ბოლო ბლოკი საწყის ბლოკამდე მდებარეობს"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "--all -თან ერთად ბაზის სახელს ვერ მიუთითებთ"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "ორივეს, ბაზის სახელსა და მის შაბლონს ვერ მიუთითებთ"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "შემოსამოწმებელი ბაზის გარეშე"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "ბაზა \"%s\": %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "\"%s\" ბაზის გამოტოვება: amcheck დაყენებული არაა"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "ბაზაში \"%s\": გამოიყენება amcheck-ის ვერსია \"%s\" სქემაში \"%s\""
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "მეხსირების ცხრილები, რომლებიც ემთხვევა \"%s\"-ს, არ არსებბს"
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "ორობით ხის ინდექსები, რომლებიც ემთხვევა \"%s\"-ს, არ არსებობს"
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "\"%s\"-ს არც ერთი სქემა არ ემთხვევა"
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "\"%s\"-ს არც ერთი ურთიერთობა არ ემთხვევა"
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "შესამოწმებელი ურთიერთობების გარეშე"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "მეხსიერების ცხრილის შემოწმება\"%s.%s.%s\""
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "ორობითი ხის ინდექსის შემოწმება \"%s.%s.%s\""
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "ბაზისთვის ბრძანების გაგზავნის შეცდომა \"%s\": %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "ბრძანება იყო: %s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr ""
+"მეხსიერების ცხრილი \"%s.%s.%s\", ბლოკი %s, წანაცვლება %s, ატრიბუტი %s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "მეხსიერების ცხრილი \"%s.%s.%s\", ბლოკი %s, წანაცვლება %s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "მეხსიერების ცხრილი \"%s.%s.%s\", ბლოკი %s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "ცხრილი მეხსიერებაში \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "მოთხოვნის შინაარსი: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid ""
+"btree index \"%s.%s.%s\": btree checking function returned unexpected number "
+"of rows: %d"
+msgstr ""
+"ორობითი ხის ინდექსი\"%s.%s.%s\": ორობითი ხის შემოწმების ფუნქციამ მწკრივების "
+"მოულოდნელი რაოდენობა დააბრუნა: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "არიან %s\"-ის და amcheck-ის ვერსიები თავსებადი?"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "btree index \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL -ის ბაზაში არსებულ ობიექტებს დაზიანებებზე შეამოწმებს.\n"
+"\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "გამოყენება:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [პარამეტრი]... [ბაზისსახელი]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"სამიზნის პარამეტრები:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all ყველა ბაზის შემოწმება\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=შაბლონი შესაბამისი ბაზ(ებ)-ის შემოწმება\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=შაბლონი შესაბამისი ბაზ(ებ)ის არ-შემოწმება\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=შაბლონი შესაბამისი ინდექს(ებ)-ის შემოწმება\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr ""
+" -I, --exclude-index=შაბლონი შესაბამისი შაბლონ(ებ)-ის არ-შემოწმება\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr ""
+" -r, --relation=შაბლონი შესაბამისი ურთითერთობ(ებ)-ის შემოწმება\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr ""
+" -R, --exclude-relation=შაბლონი შესაბამისი ურთიერთობ(ებ)-ის არ-შემოწმება\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=შაბლონი შესაბამისი სქემ(ებ)-ის შემოწმება\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr ""
+" -S, --exclude-schema=შაბლონი შესაბამისი სქემ(ებ)-ის არ შემოწმება\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=შაბლონი შესაბამისი ცხრილ(ებ)-ის შემოწმება\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr ""
+" -T, --exclude-table=შაბლონი შესაბამისი ცხრილ(ებ)-ი არ შემოწმდება\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid ""
+" --no-dependent-indexes do NOT expand list of relations to include "
+"indexes\n"
+msgstr ""
+" --no-dependent-indexes ურთერთობების სიის დამუშავებისას ინდექსები "
+"არ დამუშავებდება\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid ""
+" --no-dependent-toast do NOT expand list of relations to include "
+"TOAST tables\n"
+msgstr ""
+" --no-dependent-toast ურთიერთობების სიის დამუშავებისას TOAST "
+"ცხრილები არ დამუშავდება \n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid ""
+" --no-strict-names do NOT require patterns to match objects\n"
+msgstr ""
+" --no-strict-names მოთხოვნებში შაბლონზე დამთხვევა ჩასმული არ "
+"იქნება\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"ცხრილის შემოწმების პარამეტრები:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid ""
+" --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr ""
+" --exclude-toast-pointers ურთიერთობის TOAST მაჩვენებლებს არ "
+"გაჰყვება\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid ""
+" --on-error-stop stop checking at end of first corrupt "
+"page\n"
+msgstr ""
+" --on-error-stop მუშაობის პირველი დაზიანებული გვერდის "
+"ბოლოში შეწყვეტა\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid ""
+" --skip=OPTION do NOT check \"all-frozen\" or \"all-"
+"visible\" blocks\n"
+msgstr ""
+" --skip=პარამეტრი \"all-frozen\" და \"all-visible\" "
+"ბლოკები არ შემოწმდება\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid ""
+" --startblock=BLOCK begin checking table(s) at the given block "
+"number\n"
+msgstr ""
+" --startblock=ბლოკი შემოწმების ბლოკის მითითებული ნომრიდან "
+"დაწყება\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid ""
+" --endblock=BLOCK check table(s) only up to the given block "
+"number\n"
+msgstr ""
+" --endblock=ბლოკი შემოწმების მითითებულ ბლოკზე დამთავრება\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"ორობითი ხის ინდექსის შემოწმების პარამეტრები:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid ""
+" --heapallindexed check that all heap tuples are found "
+"within indexes\n"
+msgstr ""
+" --heapallindexed შემოწმება, მეხსიერების ცხრილში ყველა "
+"მონაცემი არსებობს, თუ არა\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid ""
+" --parent-check check index parent/child relationships\n"
+msgstr ""
+" --parent-check ინდექსის მშობელი/შვილის ურთიერთობის "
+"შემოწმება\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid ""
+" --rootdescend search from root page to refind tuples\n"
+msgstr ""
+" --rootdescend მონაცემების თავიდან საპოვნელად ძებნის root "
+"გვერდიდან დაწყება\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"შეერთების პარამეტრები:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=ჰოსტის_სახელი ბაზის სერვერის სახელი ან სოკეტის "
+"საქაღალდე\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=პორტი ბაზის სერვერის პორტი\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr ""
+" -U, --username=მომხმარებელი მისაერთებელი მომხმარებლის სახელი\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password პაროლის მოთხოვნა არ მოხდება\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password პაროლის ყველა შემთხვევაში კითხვა\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=ბაზისსახელი ალტერნატიული საავარიო ბაზა\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"სხვა პარამეტრები:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the "
+"server\n"
+msgstr " -e, --echo-queries სერვერზე გაგზავნილი ბრძანებების გამოტანა\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"the server\n"
+msgstr ""
+" -j, --jobs=რიცხვი სერვერთან მითითებული რაოდენობის "
+"მიერთებების გამოყენება\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress მიმდინარეობის ინფორმაციის ჩვენება\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose დამატებითი ინფორმაციის გამოტანა\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing ნაკლული გაფართოებების დაყენება\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდომების შესახებ მიწერეთ: %s\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s ურთიერთობა (%d%%), %*s/%s გვერდი (%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s ურთიერთობა(%d%%), %*s/%s გვერდი (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s ურთიერთობა (%d%%), %*s/%s გვერდი (%d%%)"
+
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "არასწორი სრული სახელი (ძალიან ბევრი წერტილიანი სახელი): %s"
+
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "ურთიერთობის არასწორი სახელი (ძალიან ბევრი წერტილიანი სახელი): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "არასწორი საქაღალდე \"%s\""
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "შიდა შეცდომა: მიღებულა ბაზის მოულოდნელი შაბლონის_id: %d"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "\"%s\"-ის დამთხვევის შესამოწმებლად მიერთებადი ბაზა არ არსებობს"
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "შიდა შეცდომა: მიღებულა ურთიერთობის მოულოდნელი შაბლონის_id: %d"
diff --git a/src/bin/pg_amcheck/po/ko.po b/src/bin/pg_amcheck/po/ko.po
new file mode 100644
index 0000000..c417b05
--- /dev/null
+++ b/src/bin/pg_amcheck/po/ko.po
@@ -0,0 +1,575 @@
+# Korean message translation file for pg_amcheck
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+# Dong Wook Lee <sh95119@gmail.com>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:50+0000\n"
+"PO-Revision-Date: 2023-05-05 17:21+0200\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <kr@postgresql.org>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "상세정보: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "취소 요청 보냄\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "취소 요청 보내기 실패: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "%s 데이터베이스에 연결 할 수 없음: 메모리 부족"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "\"%s\" 값은 %s 옵션의 값으로 적당하지 않음"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s 값은 %d부터 %d까지만 허용합니다"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "쿼리 실패: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "사용한 쿼리: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "%s 옵션의 잘못된 인자"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "시작 블록이 유효하지 않음"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "시작 블록이 범위를 벗어남"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "마지막 블록이 유효하지 않음"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "마지막 블록이 범위를 벗어남"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "자세한 사항은 \"%s --help\" 명령으로 살펴보십시오."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "마지막 블록이 시작 블록보다 앞에 존재함"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 많은 명령행 인자를 지정했습니다. (처음 \"%s\")"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "데이터베이스 이름을 —all 와 같이 지정할 수 없습니다"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "데이터베이스 이름과 형식을 지정할 수 없습니다"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "확인할 데이터베이스가 없습니다"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "데이터베이스 “%s”: %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "데이터베이스 생략 “%s”: amcheck 가 설치되지 않음"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "데이터베이스 “%s”: 사용하는 amcheck 버전 “%s” 스키마 “%s”"
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "“%s” 와 일치하는 heap 테이블을 찾을 수 없습니다"
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "“%s” 와 일치하는 btree 인덱스를 찾을 수 없습니다"
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "스키마에서 “%s” 와 일치하는 릴레이션을 찾을 수 없습니다"
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "“%s” 와 일치하는 릴레이션을 찾을 수 없습니다"
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "확인할 릴레이션이 없습니다"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "heap 테이블 확인 “%s.%s.%s”"
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "btree 인덱스 확인 “%s.%s.%s”"
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "데이터베이스에 명령을 보내는 중 오류 발생 “%s”: %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "사용한 명령: %s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "heap 테이블 “%s.%s.%s”, 블록 %s, 오프셋 %s, 에트리뷰트 %s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "heap 테이블 “%s.%s.%s”, 블록 %s, 오프셋 %s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "heap 테이블 “%s.%s.%s”, 블록 %s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "heap 테이블 “%s.%s.%s”:\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "사용한 쿼리: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid ""
+"btree index \"%s.%s.%s\": btree checking function returned unexpected number "
+"of rows: %d"
+msgstr "btree 인덱스 “%s.%s.%s”: btree 확인 중에 예기치 않은 행수를 반환함: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "%s 버전과 amcheck의 버전이 호환 가능합니까?"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "btree 인덱스 “%s.%s.%s”:\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s 가 PostgreSQL 데이터베이스 개체 손상 여부를 검사합니다.\n"
+"\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [옵션]... [DB이름]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"사용가능한 옵션들:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, —all 모든 데이터베이스를 검사\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, —database=PATTERN 일치하는 모든 데이터베이스를 검사\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr ""
+" -D, —exclude-database=PATTERN 일치하는 데이터베이스를 제외 하고 검사\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, —index=PATTERN 일치하는 인덱스를 검사\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, —exclude-index=PATTERN 일치하는 인덱스를 제외하고 검사\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, —relation=PATTERN 일치하는 릴레이션을 검사\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, —exclude-relation=PATTERN 일치하는 릴레이션을 제외하고 검사\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, —schema=PATTERN 일치하는 스키마를 검사\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, —exclude-schema=PATTERN 일치하는 스키마를 제외하고 검사\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, —table=PATTERN 일치하는 테이블을 검사\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, —exclude-table=PATTERN 일치하는 테이블을 제외하고 검사\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid ""
+" --no-dependent-indexes do NOT expand list of relations to include "
+"indexes\n"
+msgstr " —no-dependent-indexes 릴레이션에 인덱스를 포함하지 않음 \n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid ""
+" --no-dependent-toast do NOT expand list of relations to include "
+"TOAST tables\n"
+msgstr ""
+" —no-dependent-toast 릴레이션에 TOAST 테이블을 포함하지 않음\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid ""
+" --no-strict-names do NOT require patterns to match objects\n"
+msgstr ""
+" —no-strict-names 개체가 패턴과 일치하지 않아도 허용함\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"테이블 검사 옵션들:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid ""
+" --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " —exclude-toast-pointers TOAST 포인터를 확인하지 않음\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid ""
+" --on-error-stop stop checking at end of first corrupt "
+"page\n"
+msgstr " —on-error-stop 손상된 페이지 끝에서 검사를 멈춤\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid ""
+" --skip=OPTION do NOT check \"all-frozen\" or \"all-"
+"visible\" blocks\n"
+msgstr ""
+" —skip=OPTION “all-frozen” 또는 “all-visible” 블록을 검사"
+"하지 않음\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid ""
+" --startblock=BLOCK begin checking table(s) at the given block "
+"number\n"
+msgstr ""
+" —startblock=BLOCK 지정된 블록 번호부터 테이블 검사를 시작\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid ""
+" --endblock=BLOCK check table(s) only up to the given block "
+"number\n"
+msgstr ""
+" —endblock=BLOCK 지정된 블록 번호까지 테이블 검사 마침 \n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"B-tree 인덱스 검사 옵션들:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid ""
+" --heapallindexed check that all heap tuples are found "
+"within indexes\n"
+msgstr ""
+" —heapallindexed 모든 heap 튜플이 인덱스 내에 있는지 검사\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid ""
+" --parent-check check index parent/child relationships\n"
+msgstr " —parent-check 인덱스의 부모/자식 관계를 검사\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid ""
+" --rootdescend search from root page to refind tuples\n"
+msgstr " —rootdescend 루트 페이지 부터 튜플을 다시 찾음 \n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"연결 옵션들:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, —host=HOSTNAME 데이터베이스 서버 호스트 또는 소켓의 디렉터"
+"리\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, —port=PORT 데이터베이스 서버 포트\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, —username=USERNAME 연결할 유저 이름\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, —no-password 암호 입력 프롬프트가 나타나지 않음\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, —password 암호 입력 프롬프트가 나타남\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " —maintenance-db=DBNAME 대체 연결 데이터베이스\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"기타 옵션:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the "
+"server\n"
+msgstr " -e, --echo 서버로 보내는 명령들을 보여줌\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"the server\n"
+msgstr " -j, —jobs=NUM 서버에 동시 연결할 수를 지정\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, —progress 진행 사항 정보를 보여줌\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 작업내역의 자세한 출력\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " —install-missing 누락된 익스텐션을 설치\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 도움말을 표시하고 종료\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"문제점 보고 주소: <%s>\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s 릴레이션 (%d%%), %*s/%s 페이지 (%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s 릴레이션 (%d%%), %*s/%s 페이지 (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s 릴레이션 (%d%%), %*s/%s 페이지 (%d%%)"
+
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "바르지 못한 규정 이름(점으로 구분된 이름이 너무 많음): %s"
+
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "바르지 못한 릴레이션 이름(점으로 구분된 이름이 너무 많음): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "“%s” 데이터베이스를 포함합니다"
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "내부 오류: 올바르지 않은 데이터베이스 패턴 아이디 %d"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "“%s” 와 일치하는 연결 가능한 데이터베이스를 찾을 수 없음"
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "내부 오류: 올바르지 않은 릴레이션 패턴 아이디 %d"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "심각: "
+
+#, c-format
+#~ msgid "number of parallel jobs must be at least 1"
+#~ msgstr "병렬 작업 숫자는 최소 1이어야 함"
diff --git a/src/bin/pg_amcheck/po/ru.po b/src/bin/pg_amcheck/po/ru.po
new file mode 100644
index 0000000..8b66545
--- /dev/null
+++ b/src/bin/pg_amcheck/po/ru.po
@@ -0,0 +1,607 @@
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2021, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-27 14:52+0300\n"
+"PO-Revision-Date: 2022-09-05 13:33+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробности: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подсказка: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Сигнал отмены отправлен\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Отправить сигнал отмены не удалось: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "не удалось подключиться к базе %s (нехватка памяти)"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неверное значение \"%s\" для параметра %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "значение %s должно быть в диапазоне %d..%d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "ошибка при выполнении запроса: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "Выполнялся запрос: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "недопустимый аргумент параметра %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "неверный начальный блок"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "начальный блок вне допустимых пределов"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "неверный конечный блок"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "конечный блок вне допустимых пределов"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Для дополнительной информации попробуйте \"%s --help\"."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "конечный блок предшествует начальному"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "слишком много аргументов командной строки (первый: \"%s\")"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "имя базы данных нельзя задавать с --all"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "нельзя задавать одновременно имя базы данных и шаблоны имён"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "не указаны базы для проверки"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "база данных \"%s\": %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "база \"%s\" пропускается: расширение amcheck не установлено"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "база \"%s\": используется amcheck версии \"%s\" в схеме \"%s\""
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "не найдены подлежащие проверке базовые таблицы, соответствующие \"%s\""
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "не найдены подлежащие проверке индексы btree, соответствующие \"%s\""
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr ""
+"не найдены подлежащие проверке отношения в схемах, соответствующих \"%s\""
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "не найдены подлежащие проверке отношения, соответствующие \"%s\""
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "не найдены отношения для проверки"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "проверка базовой таблицы \"%s.%s.%s\""
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "проверка индекса btree \"%s.%s.%s\""
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "ошибка передачи команды базе \"%s\": %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "Выполнялась команда: %s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "базовая таблица \"%s.%s.%s\", блок %s, смещение %s, атрибут %s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "базовая таблица \"%s.%s.%s\", блок %s, смещение %s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "базовая таблица \"%s.%s.%s\", блок %s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "базовая таблица \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "запрос: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid ""
+"btree index \"%s.%s.%s\": btree checking function returned unexpected number "
+"of rows: %d"
+msgstr ""
+"индекс btree \"%s.%s.%s\": функция проверки btree выдала неожиданное "
+"количество строк: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "Совместимы ли версии %s и amcheck?"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "индекс btree \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s проверяет объекты в базе данных PostgreSQL на предмет повреждений.\n"
+"\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "Использование:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [ПАРАМЕТР]... [ИМЯ_БД]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"Параметры выбора объектов:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all проверить все базы\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr ""
+" -d, --database=ШАБЛОН проверить соответствующие шаблону базы\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr ""
+" -D, --exclude-database=ШАБЛОН не проверять соответствующие шаблону базы\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr ""
+" -i, --index=ШАБЛОН проверить соответствующие шаблону индексы\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr ""
+" -I, --exclude-index=ШАБЛОН не проверять соответствующие шаблону "
+"индексы\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr ""
+" -r, --relation=ШАБЛОН проверить соответствующие шаблону "
+"отношения\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr ""
+" -R, --exclude-relation=ШАБЛОН не проверять соответствующие шаблону "
+"отношения\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr ""
+" -s, --schema=ШАБЛОН проверить соответствующие шаблону схемы\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr ""
+" -S, --exclude-schema=ШАБЛОН не проверять соответствующие шаблону "
+"схемы\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr ""
+" -t, --table=ШАБЛОН проверить соответствующие шаблону таблицы\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr ""
+" -T, --exclude-table=ШАБЛОН не проверять соответствующие шаблону "
+"таблицы\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid ""
+" --no-dependent-indexes do NOT expand list of relations to include "
+"indexes\n"
+msgstr ""
+" --no-dependent-indexes не включать в список проверяемых отношений "
+"индексы\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid ""
+" --no-dependent-toast do NOT expand list of relations to include "
+"TOAST tables\n"
+msgstr ""
+" --no-dependent-toast не включать в список проверяемых отношений "
+"TOAST-таблицы\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid ""
+" --no-strict-names do NOT require patterns to match objects\n"
+msgstr ""
+" --no-strict-names не требовать наличия объектов, "
+"соответствующих шаблонам\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"Параметры проверки таблиц:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid ""
+" --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr ""
+" --exclude-toast-pointers не переходить по указателям в TOAST\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid ""
+" --on-error-stop stop checking at end of first corrupt "
+"page\n"
+msgstr ""
+" --on-error-stop прекратить проверку по достижении конца "
+"первой повреждённой страницы\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid ""
+" --skip=OPTION do NOT check \"all-frozen\" or \"all-"
+"visible\" blocks\n"
+msgstr ""
+" --skip=ТИП_БЛОКА не проверять блоки типа \"all-frozen\" или "
+"\"all-visible\"\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid ""
+" --startblock=BLOCK begin checking table(s) at the given block "
+"number\n"
+msgstr ""
+" --startblock=БЛОК начать проверку таблиц(ы) с блока с "
+"заданным номером\n"
+
+# skip-rule: no-space-before-parentheses
+#: pg_amcheck.c:1161
+#, c-format
+msgid ""
+" --endblock=BLOCK check table(s) only up to the given block "
+"number\n"
+msgstr ""
+" --endblock=БЛОК проверить таблицы(у) до блока с заданным "
+"номером\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"Параметры проверки индексов-B-деревьев:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid ""
+" --heapallindexed check that all heap tuples are found "
+"within indexes\n"
+msgstr ""
+" --heapallindexed проверить, что всем кортежам кучи "
+"находится соответствие в индексах\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid ""
+" --parent-check check index parent/child relationships\n"
+msgstr ""
+" --parent-check проверить связи родитель/потомок в "
+"индексах\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid ""
+" --rootdescend search from root page to refind tuples\n"
+msgstr ""
+" --rootdescend перепроверять поиск кортежей от корневой "
+"страницы\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Параметры подключения:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=ИМЯ имя сервера баз данных или каталог "
+"сокетов\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=ПОРТ порт сервера баз данных\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr ""
+" -U, --username=ИМЯ имя пользователя для подключения к "
+"серверу\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password не запрашивать пароль\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password запросить пароль\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=ИМЯ_БД другая опорная база данных\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Другие параметры:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the "
+"server\n"
+msgstr ""
+" -e, --echo отображать команды, отправляемые серверу\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"the server\n"
+msgstr ""
+" -j, --jobs=ЧИСЛО устанавливать заданное число подключений к "
+"серверу\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress показывать прогресс операции\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose выводить исчерпывающие сообщения\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing установить недостающие расширения\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках сообщайте по адресу <%s>.\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "отношений: %*s/%s (%d%%), страниц: %*s/%s (%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "отношений: %*s/%s (%d%%), страниц: %*s/%s (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "отношений: %*s/%s (%d%%), страниц: %*s/%s (%d%%)"
+
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "неверное полное имя (слишком много компонентов): %s"
+
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "неверное имя отношения (слишком много компонентов): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "выбирается база \"%s\""
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "внутренняя ошибка: получен неожиданный идентификатор шаблона базы %d"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr ""
+"не найдены подлежащие проверке доступные базы, соответствующие шаблону \"%s\""
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr ""
+"внутренняя ошибка: получен неожиданный идентификатор шаблона отношения %d"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "number of parallel jobs must be at least 1"
+#~ msgstr "число параллельных заданий должно быть не меньше 1"
diff --git a/src/bin/pg_amcheck/po/sv.po b/src/bin/pg_amcheck/po/sv.po
new file mode 100644
index 0000000..96aa844
--- /dev/null
+++ b/src/bin/pg_amcheck/po/sv.po
@@ -0,0 +1,546 @@
+# SWEDISH message translation file for pg_amcheck
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+# Dennis Björklund <db@zigo.dhs.org>, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-09 18:50+0000\n"
+"PO-Revision-Date: 2022-05-09 21:45+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Förfrågan om avbrytning skickad\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Kunde inte skicka förfrågan om avbrytning: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "kunde inte ansluta till databas %s: slut på minne"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ogiltigt värde \"%s\" för flaggan \"%s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s måste vara i intervallet %d..%d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1645 pg_amcheck.c:2090
+#, c-format
+msgid "query failed: %s"
+msgstr "fråga misslyckades: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1100 pg_amcheck.c:1646 pg_amcheck.c:2091
+#, c-format
+msgid "Query was: %s"
+msgstr "Frågan var: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "ogiltigt argument för flaggan %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "ogiltigt startblock"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "startblocket utanför giltig gräns"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "ogiltigt slutblock"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "slutblocket utanför giltig gräns"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "slutblocket kommer före startblocket"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "kan inte ange databasnamn tillsammans med --all"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "kan inte ange både ett databasnamn och ett databasmönster"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "inga databaser att kontrollera"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "databas \"%s\": %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "hoppar över databas \"%s\": amcheck är inte installerad"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "i databas \"%s\": använder amcheck version \"%s\" i schema \"%s\""
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "finns inga heap-tabeller för att kontrollera matchning \"%s\""
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "finns inga btree-index för att kontrollera matching \"%s\""
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "finns inga relationer att kontrollera i schemamatchning \"%s\""
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "finns inga relations för att kontrollera matching \"%s\""
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "finns inga relationer att kontrollera"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "kontrollerar heap-tabell \"%s.%s.%s\""
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "kontrollerar btree-index \"%s.%s.%s\""
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "fel vid skickande av kommando till databas \"%s\": %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "Kommandot var: %s"
+
+#: pg_amcheck.c:1013
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "heap-tabell \"%s.%s.%s\", block %s, offset %s, attribut %s:\n"
+
+#: pg_amcheck.c:1020
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "heap-tabell \"%s.%s.%s\", block %s, offset %s:\n"
+
+#: pg_amcheck.c:1026
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "heap-tabell \"%s.%s.%s\", block %s:\n"
+
+#: pg_amcheck.c:1031 pg_amcheck.c:1042
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "heap-tabell \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1046 pg_amcheck.c:1115
+#, c-format
+msgid "query was: %s\n"
+msgstr "frågan var: %s\n"
+
+#: pg_amcheck.c:1097
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "btree-index \"%s.%s.%s\": kontrollfunktion för btree returnerade oväntat antal rader: %d"
+
+#: pg_amcheck.c:1101
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "Är versionerna på %s och amcheck kompatibla?"
+
+#: pg_amcheck.c:1111
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "btree-index \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1136
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s kontrollerar objekt i en PostgreSQL-database för att hitta korruption.\n"
+"\n"
+
+#: pg_amcheck.c:1137
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [FLAGGA]... [DBNAMN]\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"Flaggor för destinationen:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all kontrollera alla databaser\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=MALL kontrollera matchande databas(er)\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=MALL kontrollera INTE matchande databas(er)\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=MALL kontrollera matchande index\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=MALL kontrollera INTE matchande index\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=MALL kontrollera matchande relation(er)\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=MALL kontrollera INTE matchande relation(er)\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=MALL kontrollera matchande schema(n)\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=MALL kontrollera INTE matchande schema(n)\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=MALL kontollera matchande tabell(er)\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=MALL kontollera INTE matchande tabell(er)\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr " --no-dependent-indexes expandera INTE listan med relationer för att inkludera index\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr " --no-dependent-toast expandera inte listan av relationer för att inkludera TOAST-tabeller\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr " --no-strict-names kräv INTE mallar för matcha objekt\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"Flaggor för kontroll av tabeller:\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers följ INTE relationers TOAST-pekare\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop sluta kontrollera efter första korrupta sidan\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr " --skip=FLAGGA kontrollera INTE block som är \"all-frozen\" eller \"all-visible\"\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr " --startblock=BLOCK börja kontollera tabell(er) vid angivet blocknummer\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOCK kontrollera tabell(er) fram till angivet blocknummer\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"Flaggor för kontroll av B-tree-index:\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr " --heapallindexed kontrollera att alla heap-tupler hittas i index\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check kontrollera förhållandet mellan barn/förälder i index\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend sök från root-sidan för att återfinna tupler\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Flaggor för anslutning:\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT databasserverns port\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password fråga ej efter lösenord\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password tvinga fram lösenordsfråga\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAMN val av underhållsdatabas\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Andra flaggor:\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo visa kommandon som skickas till servern\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr " -j, --jobs=NUM antal samtidiga anslutningar till servern\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress visa förloppsinformation\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose skriv massor med utdata\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing installera utökningar som saknas\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: pg_amcheck.c:1181
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_amcheck.c:1234
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s relationer (%d%%), %*s/%s sidor (%d%%) %*s"
+
+#: pg_amcheck.c:1245
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s relationer (%d%%), %*s/%s sidor (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1260
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s relationer (%d%%), %*s/%s sidor (%d%%)"
+
+#: pg_amcheck.c:1319 pg_amcheck.c:1352
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "ej korrekt kvalificerat namn (för många namn med punkt): %s"
+
+#: pg_amcheck.c:1397
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "ej korrekt relationsnamn (för många namn med punkt): %s"
+
+#: pg_amcheck.c:1550 pg_amcheck.c:1689
+#, c-format
+msgid "including database \"%s\""
+msgstr "inkludera databas \"%s\""
+
+#: pg_amcheck.c:1671
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "internt fel: tog emot oväntat pattern_id %d för databas"
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "finns inga anslutningsbara databaser att kontrollera som matchar \"%s\""
+
+#: pg_amcheck.c:2131
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "internt fel: tog emot oväntat pattern_id %d för relation"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Försök med \"%s --help\" för mer information.\n"
+
+#, c-format
+#~ msgid "command was: %s"
+#~ msgstr "kommandot var: %s"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatalt: "
+
+#, c-format
+#~ msgid "number of parallel jobs must be at least 1"
+#~ msgstr "antalet parallella jobb måste vara minst 1"
diff --git a/src/bin/pg_amcheck/po/uk.po b/src/bin/pg_amcheck/po/uk.po
new file mode 100644
index 0000000..601e043
--- /dev/null
+++ b/src/bin/pg_amcheck/po/uk.po
@@ -0,0 +1,516 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:50+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_amcheck.pot\n"
+"X-Crowdin-File-ID: 892\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередження: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Запит на скасування відправлений\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Не вдалося надіслати запит на скасування: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "не можливо під'єднатися до бази даних %s: не вистачає пам'яті"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неприпустиме значення \"%s\" для параметра %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s має бути в діапазоні %d..%d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "запит не вдався: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "Запит був: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "неприпустимий аргумент для параметру %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "неприпустимий початковий блок"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "початковий блок поза межами"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "неприпустимий кінцевий блок"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "кінцевий блок поза межами"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" для додаткової інформації."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "кінцевий блок передує початковому блоку"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному рядку (перший \"%s\")"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "не можна вказати назву бази даних з --all"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "не можна вказати одночасно ім'я бази даних і шаблони бази даних"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "немає баз даних для перевірки"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "база даних \"%s\": %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "пропуск бази даних \"%s\": amcheck не встановлено"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "у базі даних \"%s\": використовується amcheck версії \"%s\" у схемі \"%s\""
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "немає таблиць в динамічній пам'яті для перевірки відповідності \"%s\""
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "немає індексів btree для перевірки відповідності \"%s\""
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "немає відношень для перевірки в схемах, відповідних \"%s\""
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "немає відношень для перевірки відповідності \"%s\""
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "немає зв'язків для перевірки"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "перевірка таблиць динамічної пам'яті \"%s.%s.%s\""
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "перевірка індексу btree \"%s.%s.%s\""
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "помилка надсилання команди до бази даних \"%s: %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "Команда була: %s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "таблиця динамічної пам'яті \"%s.%s.%s\", блок %s, зсув %s, атрибут %s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "таблиця динамічної пам'яті \"%s.%s.%s\", блок %s, зсув %s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "таблиця динамічної пам'яті \"%s.%s.%s\", блок %s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "таблиця динамічної пам'яті \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "запит був: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "індекс btree \"%s.%s.%s\": функція перевірки btree повернула неочікувану кількість рядків: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "Чи сумісні версії %s і amcheck?"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "індекс btree \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid "%s checks objects in a PostgreSQL database for corruption.\n\n"
+msgstr "%s перевіряє об'єкти бази даних PostgreSQL на пошкодження.\n\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "Використання:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [DBNAME]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid "\n"
+"Target options:\n"
+msgstr "\n"
+"Цільові параметри:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all перевірити всі бази даних\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=PATTERN перевірити відповідні бази даних\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=PATTERN НЕ перевіряти відповідні бази даних\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=PATTERN перевірити відповідні індекси\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=PATTERN НЕ перевіряти відповідні індекси\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=PATTERN перевірити відповідні відношення\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=PATTERN НЕ перевіряти відповідні відношення\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=PATTERN перевірити відповідні схеми\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=PATTERN НЕ перевіряти відповідні схеми\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=PATTERN перевірити відповідні таблиці\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=PATTERN НЕ перевіряти відповідні таблиці\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr " --no-dependent-indexes НЕ розширювати список відносин, щоб включити індекси\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr " --no-dependent-toast НЕ розширювати список відносин, щоб включити таблиці TOAST\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr " --no-strict-names НЕ вимагати відповідності шаблонів об'єктам\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid "\n"
+"Table checking options:\n"
+msgstr "\n"
+"Параметри перевірки таблиць:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers НЕ слідувати покажчикам відношень TOAST\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop зупинити перевірку наприкінці першої пошкодженої сторінки\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr " --skip=OPTION НЕ перевіряти \"всі заморожені\" або \"всі видимі\" блоки\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr " --startblock=BLOCK почати перевірку таблиць за поданим номером блоку\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOCK перевіряти таблиці лише до поданого номеру блоку\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid "\n"
+"B-tree index checking options:\n"
+msgstr "\n"
+"Параметри перевірки індексів B-tree:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr " --heapallindexed перевірити чи всі кортежі динамічної пам'яті містяться в індексах\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check перевірити індекс батьківських/дочірніх відносин\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend шукати з кореневої сторінки, для повторного пошуку кортежів\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid "\n"
+"Connection options:\n"
+msgstr "\n"
+"Налаштування з'єднання:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME хост сервера бази даних або каталог сокетів\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT порт серверу бази даних\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME ім'я користувача для з'єднання з сервером\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ніколи не запитувати пароль\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password примусовий запит пароля\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME база даних альтернативного обслуговування\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid "\n"
+"Other options:\n"
+msgstr "\n"
+"Інші параметри:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo показати команди, надіслані серверу\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr " -j, --jobs=NUM використати цю кількість одночасних з'єднань з сервером\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress показати інформацію про прогрес\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose виводити багато інформації\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію і вийти\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing встановити відсутні розширення\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю справку, потім вийти\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"Повідомляти про помилки на <%s>.\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s відношень (%d%%), %*s/%s сторінок (%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s відношень (%d%%), %*s/%s сторінок (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s відношень (%d%%), %*s/%s сторінок (%d%%)"
+
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "неправильне повне ім'я (забагато компонентів): %s"
+
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "неправильне ім'я зв'язку (забагато компонентів): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "включаючи базу даних \"%s\""
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "внутрішня помилка: отримано неочікувану помилку шаблону бази даних %d"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "немає бази даних для підключення, щоб перевірити відповідність\"%s\""
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "внутрішня помилка: отримано неочікувану помилку шаблону відношення %d"
+
diff --git a/src/bin/pg_amcheck/po/zh_CN.po b/src/bin/pg_amcheck/po/zh_CN.po
new file mode 100644
index 0000000..5ca9f01
--- /dev/null
+++ b/src/bin/pg_amcheck/po/zh_CN.po
@@ -0,0 +1,500 @@
+# LANGUAGE message translation file for pg_amcheck
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+# Jie Zhang <zhangjie2@fujitsu.com>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:48+0000\n"
+"PO-Revision-Date: 2021-08-15 18:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的:"
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206
+msgid "Cancel request sent\n"
+msgstr "取消发送的请求\n"
+
+#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210
+msgid "Could not send cancel request: "
+msgstr "无法发送取消请求: "
+
+#: ../../fe_utils/connect_utils.c:92
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "无法连接到数据库 %s:内存不足"
+
+#: ../../fe_utils/connect_utils.c:120
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1646 pg_amcheck.c:2085
+#, c-format
+msgid "query failed: %s"
+msgstr "查询失败: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:597 pg_amcheck.c:1116 pg_amcheck.c:1647 pg_amcheck.c:2086
+#, c-format
+msgid "query was: %s"
+msgstr "查询是: %s"
+
+#: pg_amcheck.c:332
+#, c-format
+msgid "number of parallel jobs must be at least 1"
+msgstr "并行工作的数量必须至少为1"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "选项%s的参数无效"
+
+#: pg_amcheck.c:413
+#, c-format
+msgid "invalid start block"
+msgstr "起始块无效"
+
+#: pg_amcheck.c:418
+#, c-format
+msgid "start block out of bounds"
+msgstr "起始块超出范围"
+
+#: pg_amcheck.c:426
+#, c-format
+msgid "invalid end block"
+msgstr "无效的结束块"
+
+#: pg_amcheck.c:431
+#, c-format
+msgid "end block out of bounds"
+msgstr "结束块超出范围"
+
+#: pg_amcheck.c:455 pg_amcheck.c:481
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获取更多的信息.\n"
+
+#: pg_amcheck.c:463
+#, c-format
+msgid "end block precedes start block"
+msgstr "结束块在开始块之前"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行参数太多 (第一个是 \"%s\")"
+
+#: pg_amcheck.c:500
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "无法使用--all指定数据库名称"
+
+#: pg_amcheck.c:509
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "不能同时指定数据库名称和数据库模式"
+
+#: pg_amcheck.c:539
+#, c-format
+msgid "no databases to check"
+msgstr "没有要检查的数据库"
+
+#: pg_amcheck.c:595
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "数据库 \"%s\": %s"
+
+#: pg_amcheck.c:606
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "正在跳过数据库\"%s\":未安装amcheck"
+
+#: pg_amcheck.c:614
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "在数据库\"%1$s\"中:在模式\"%3$s\"中使用amcheck版本\"%2$s\""
+
+#: pg_amcheck.c:638
+msgid "no heap tables to check matching \"%s\""
+msgstr "没有要检查匹配\"%s\"的堆表"
+
+#: pg_amcheck.c:641
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "没有要检查匹配\"%s\"的B树索引"
+
+#: pg_amcheck.c:644
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "在模式中没有要检查匹配\"%s\"的关系"
+
+#: pg_amcheck.c:647
+msgid "no relations to check matching \"%s\""
+msgstr "没有要检查匹配\"%s\"的关系"
+
+#: pg_amcheck.c:676
+#, c-format
+msgid "no relations to check"
+msgstr "没有要检查的关系"
+
+#: pg_amcheck.c:762
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "正在检查堆表\"%s.%s.%s\""
+
+#: pg_amcheck.c:778
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "检查B树索引\"%s.%s.%s\""
+
+#: pg_amcheck.c:911
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "向数据库\"%s\"发送命令时出错: %s"
+
+#: pg_amcheck.c:914
+#, c-format
+msgid "command was: %s"
+msgstr "命令是: %s"
+
+#: pg_amcheck.c:1031
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "堆表\"%s.%s.%s\",块%s,偏移量%s,属性%s:\n"
+
+#: pg_amcheck.c:1038
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "堆表\"%s.%s.%s\",块%s,偏移量%s:\n"
+
+#: pg_amcheck.c:1044
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "堆表\"%s.%s.%s\",块%s:\n"
+
+#: pg_amcheck.c:1049 pg_amcheck.c:1060
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "堆表\"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1064 pg_amcheck.c:1131
+msgid "query was: %s\n"
+msgstr "查询是: %s\n"
+
+#: pg_amcheck.c:1113
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "B树索引\"%s.%s.%s\":B树检查函数返回了意外的行数: %d"
+
+#: pg_amcheck.c:1117
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "%s和amcheck的版本兼容吗?"
+
+#: pg_amcheck.c:1127
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "B树索引\"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s检查PostgreSQL数据库中的对象是否损坏.\n"
+"\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [选项]... [数据库名字]\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"目标选项:\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all 检查所有数据库\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=PATTERN 检查匹配的数据库\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=PATTERN 不检查匹配的数据库\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=PATTERN 检查匹配的索引\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=PATTERN 不检查匹配的索引\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=PATTERN 检查匹配的关系\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=PATTERN 不检查匹配的关系\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=PATTERN 检查匹配的模式\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=PATTERN 不检查匹配模式\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=PATTERN 检查匹配的表\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=PATTERN 不检查匹的配表\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr " --no-dependent-indexes 不要展开关系列表以包含索引\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr " --no-dependent-toast 不要展开关系列表以包括TOAST表\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr " --no-strict-names 不需要模式来匹配对象\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"表检查选项:\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers 不要遵循关系TOAST指示\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop 在第一个损坏页的末尾停止检查\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr " --skip=OPTION 不要检查\"all-frozen\"或\"all-visible\"块\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr " --startblock=BLOCK 在给定的块编号处开始检查表\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOCK 检查表仅限于给定的块编号\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"B树索引检查选项:\n"
+
+#: pg_amcheck.c:1177
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr " --heapallindexed 检查是否在索引中找到所有堆元组\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check 检查索引父/子关系\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend 从根页搜索到重新填充元组\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"联接选项:\n"
+
+#: pg_amcheck.c:1181
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME 数据库服务器主机或套接字目录\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT 数据库服务器端口\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME 要连接的用户名\n"
+
+#: pg_amcheck.c:1184
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 从不提示输入密码\n"
+
+#: pg_amcheck.c:1185
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password 强制密码提示\n"
+
+#: pg_amcheck.c:1186
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 备用维护数据库\n"
+
+#: pg_amcheck.c:1187
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"其它选项:\n"
+
+#: pg_amcheck.c:1188
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo 显示发送到服务端的命令\n"
+
+#: pg_amcheck.c:1189
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr " -j, --jobs=NUM 使用这么多到服务器的并发连接\n"
+
+#: pg_amcheck.c:1190
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet 不写任何信息\n"
+
+#: pg_amcheck.c:1191
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 显示进度信息\n"
+
+#: pg_amcheck.c:1192
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 写大量的输出\n"
+
+#: pg_amcheck.c:1193
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信息, 然后退出\n"
+
+#: pg_amcheck.c:1194
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing 安装缺少的扩展\n"
+
+#: pg_amcheck.c:1195
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助信息, 然后退出\n"
+
+#: pg_amcheck.c:1197
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: pg_amcheck.c:1198
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: pg_amcheck.c:1256
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s 关系 (%d%%), %*s/%s 页 (%d%%) %*s"
+
+#: pg_amcheck.c:1267
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s 关系 (%d%%), %*s/%s 页 (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1282
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s 关系 (%d%%), %*s/%s 页 (%d%%)"
+
+#: pg_amcheck.c:1551 pg_amcheck.c:1693
+#, c-format
+msgid "including database \"%s\""
+msgstr "包含的数据库\"%s\""
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "内部错误:收到意外的数据库pattern_id %d"
+
+#: pg_amcheck.c:1677
+msgid "no connectable databases to check matching \"%s\""
+msgstr "没有可连接的数据库来检查匹配的\"%s\""
+
+#: pg_amcheck.c:2127
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "内部错误:收到意外的关系pattern_id %d"
diff --git a/src/bin/pg_amcheck/t/001_basic.pl b/src/bin/pg_amcheck/t/001_basic.pl
new file mode 100644
index 0000000..e273128
--- /dev/null
+++ b/src/bin/pg_amcheck/t/001_basic.pl
@@ -0,0 +1,14 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_amcheck');
+program_version_ok('pg_amcheck');
+program_options_handling_ok('pg_amcheck');
+
+done_testing();
diff --git a/src/bin/pg_amcheck/t/002_nonesuch.pl b/src/bin/pg_amcheck/t/002_nonesuch.pl
new file mode 100644
index 0000000..6c89ead
--- /dev/null
+++ b/src/bin/pg_amcheck/t/002_nonesuch.pl
@@ -0,0 +1,398 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+# Test set-up
+my ($node, $port);
+$node = PostgreSQL::Test::Cluster->new('test');
+$node->init;
+$node->start;
+$port = $node->port;
+
+# Load the amcheck extension, upon which pg_amcheck depends
+$node->safe_psql('postgres', q(CREATE EXTENSION amcheck));
+
+#########################################
+# Test non-existent databases
+
+# Failing to connect to the initial database is an error.
+$node->command_checks_all(
+ [ 'pg_amcheck', 'qqq' ],
+ 1, [qr/^$/],
+ [qr/FATAL: database "qqq" does not exist/],
+ 'checking a non-existent database');
+
+# Failing to resolve a database pattern is an error by default.
+$node->command_checks_all(
+ [ 'pg_amcheck', '-d', 'qqq', '-d', 'postgres' ],
+ 1,
+ [qr/^$/],
+ [qr/pg_amcheck: error: no connectable databases to check matching "qqq"/],
+ 'checking an unresolvable database pattern');
+
+# But only a warning under --no-strict-names
+$node->command_checks_all(
+ [ 'pg_amcheck', '--no-strict-names', '-d', 'qqq', '-d', 'postgres' ],
+ 0,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: warning: no connectable databases to check matching "qqq"/
+ ],
+ 'checking an unresolvable database pattern under --no-strict-names');
+
+# Check that a substring of an existent database name does not get interpreted
+# as a matching pattern.
+$node->command_checks_all(
+ [ 'pg_amcheck', '-d', 'post', '-d', 'postgres' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: no connectable databases to check matching "post"/
+ ],
+ 'checking an unresolvable database pattern (substring of existent database)'
+);
+
+# Check that a superstring of an existent database name does not get interpreted
+# as a matching pattern.
+$node->command_checks_all(
+ [ 'pg_amcheck', '-d', 'postgresql', '-d', 'postgres' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: no connectable databases to check matching "postgresql"/
+ ],
+ 'checking an unresolvable database pattern (superstring of existent database)'
+);
+
+#########################################
+# Test connecting with a non-existent user
+
+# Failing to connect to the initial database due to bad username is an error.
+$node->command_checks_all([ 'pg_amcheck', '-U', 'no_such_user', 'postgres' ],
+ 1, [qr/^$/], [], 'checking with a non-existent user');
+
+#########################################
+# Test checking databases without amcheck installed
+
+# Attempting to check a database by name where amcheck is not installed should
+# raise a warning. If all databases are skipped, having no relations to check
+# raises an error.
+$node->command_checks_all(
+ [ 'pg_amcheck', 'template1' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: warning: skipping database "template1": amcheck is not installed/,
+ qr/pg_amcheck: error: no relations to check/
+ ],
+ 'checking a database by name without amcheck installed, no other databases'
+);
+
+# Again, but this time with another database to check, so no error is raised.
+$node->command_checks_all(
+ [ 'pg_amcheck', '-d', 'template1', '-d', 'postgres' ],
+ 0,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: warning: skipping database "template1": amcheck is not installed/
+ ],
+ 'checking a database by name without amcheck installed, with other databases'
+);
+
+# Again, but by way of checking all databases
+$node->command_checks_all(
+ [ 'pg_amcheck', '--all' ],
+ 0,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: warning: skipping database "template1": amcheck is not installed/
+ ],
+ 'checking a database by pattern without amcheck installed, with other databases'
+);
+
+#########################################
+# Test unreasonable patterns
+
+# Check three-part unreasonable pattern that has zero-length names
+$node->command_checks_all(
+ [ 'pg_amcheck', '-d', 'postgres', '-t', '..' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: no connectable databases to check matching "\.\."/
+ ],
+ 'checking table pattern ".."');
+
+# Again, but with non-trivial schema and relation parts
+$node->command_checks_all(
+ [ 'pg_amcheck', '-d', 'postgres', '-t', '.foo.bar' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: no connectable databases to check matching "\.foo\.bar"/
+ ],
+ 'checking table pattern ".foo.bar"');
+
+# Check two-part unreasonable pattern that has zero-length names
+$node->command_checks_all(
+ [ 'pg_amcheck', '-d', 'postgres', '-t', '.' ],
+ 1,
+ [qr/^$/],
+ [qr/pg_amcheck: error: no heap tables to check matching "\."/],
+ 'checking table pattern "."');
+
+# Check that a multipart database name is rejected
+$node->command_checks_all(
+ [ 'pg_amcheck', '-d', 'localhost.postgres' ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper qualified name \(too many dotted names\): localhost\.postgres/
+ ],
+ 'multipart database patterns are rejected');
+
+# Check that a three-part schema name is rejected
+$node->command_checks_all(
+ [ 'pg_amcheck', '-s', 'localhost.postgres.pg_catalog' ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper qualified name \(too many dotted names\): localhost\.postgres\.pg_catalog/
+ ],
+ 'three part schema patterns are rejected');
+
+# Check that a four-part table name is rejected
+$node->command_checks_all(
+ [ 'pg_amcheck', '-t', 'localhost.postgres.pg_catalog.pg_class' ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper relation name \(too many dotted names\): localhost\.postgres\.pg_catalog\.pg_class/
+ ],
+ 'four part table patterns are rejected');
+
+# Check that too many dotted names still draws an error under --no-strict-names
+# That flag means that it is ok for the object to be missing, not that it is ok
+# for the object name to be ungrammatical
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '--no-strict-names',
+ '-t', 'this.is.a.really.long.dotted.string'
+ ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper relation name \(too many dotted names\): this\.is\.a\.really\.long\.dotted\.string/
+ ],
+ 'ungrammatical table names still draw errors under --no-strict-names');
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '--no-strict-names', '-s',
+ 'postgres.long.dotted.string'
+ ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper qualified name \(too many dotted names\): postgres\.long\.dotted\.string/
+ ],
+ 'ungrammatical schema names still draw errors under --no-strict-names');
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '--no-strict-names', '-d',
+ 'postgres.long.dotted.string'
+ ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper qualified name \(too many dotted names\): postgres\.long\.dotted\.string/
+ ],
+ 'ungrammatical database names still draw errors under --no-strict-names');
+
+# Likewise for exclusion patterns
+$node->command_checks_all(
+ [ 'pg_amcheck', '--no-strict-names', '-T', 'a.b.c.d' ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper relation name \(too many dotted names\): a\.b\.c\.d/
+ ],
+ 'ungrammatical table exclusions still draw errors under --no-strict-names'
+);
+$node->command_checks_all(
+ [ 'pg_amcheck', '--no-strict-names', '-S', 'a.b.c' ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper qualified name \(too many dotted names\): a\.b\.c/
+ ],
+ 'ungrammatical schema exclusions still draw errors under --no-strict-names'
+);
+$node->command_checks_all(
+ [ 'pg_amcheck', '--no-strict-names', '-D', 'a.b' ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper qualified name \(too many dotted names\): a\.b/
+ ],
+ 'ungrammatical database exclusions still draw errors under --no-strict-names'
+);
+
+
+#########################################
+# Test checking non-existent databases, schemas, tables, and indexes
+
+# Use --no-strict-names and a single existent table so we only get warnings
+# about the failed pattern matches
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '--no-strict-names',
+ '-t', 'no_such_table',
+ '-t', 'no*such*table',
+ '-i', 'no_such_index',
+ '-i', 'no*such*index',
+ '-r', 'no_such_relation',
+ '-r', 'no*such*relation',
+ '-d', 'no_such_database',
+ '-d', 'no*such*database',
+ '-r', 'none.none',
+ '-r', 'none.none.none',
+ '-r', 'postgres.none.none',
+ '-r', 'postgres.pg_catalog.none',
+ '-r', 'postgres.none.pg_class',
+ '-t', 'postgres.pg_catalog.pg_class', # This exists
+ ],
+ 0,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: warning: no heap tables to check matching "no_such_table"/,
+ qr/pg_amcheck: warning: no heap tables to check matching "no\*such\*table"/,
+ qr/pg_amcheck: warning: no btree indexes to check matching "no_such_index"/,
+ qr/pg_amcheck: warning: no btree indexes to check matching "no\*such\*index"/,
+ qr/pg_amcheck: warning: no relations to check matching "no_such_relation"/,
+ qr/pg_amcheck: warning: no relations to check matching "no\*such\*relation"/,
+ qr/pg_amcheck: warning: no heap tables to check matching "no\*such\*table"/,
+ qr/pg_amcheck: warning: no connectable databases to check matching "no_such_database"/,
+ qr/pg_amcheck: warning: no connectable databases to check matching "no\*such\*database"/,
+ qr/pg_amcheck: warning: no relations to check matching "none\.none"/,
+ qr/pg_amcheck: warning: no connectable databases to check matching "none\.none\.none"/,
+ qr/pg_amcheck: warning: no relations to check matching "postgres\.none\.none"/,
+ qr/pg_amcheck: warning: no relations to check matching "postgres\.pg_catalog\.none"/,
+ qr/pg_amcheck: warning: no relations to check matching "postgres\.none\.pg_class"/,
+ qr/pg_amcheck: warning: no connectable databases to check matching "no_such_database"/,
+ qr/pg_amcheck: warning: no connectable databases to check matching "no\*such\*database"/,
+ qr/pg_amcheck: warning: no connectable databases to check matching "none\.none\.none"/,
+ ],
+ 'many unmatched patterns and one matched pattern under --no-strict-names'
+);
+
+
+#########################################
+# Test that an invalid / partially dropped database won't be targeted
+
+$node->safe_psql(
+ 'postgres', q(
+ CREATE DATABASE regression_invalid;
+ UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid';
+));
+
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '-d', 'regression_invalid'
+ ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: no connectable databases to check matching "regression_invalid"/,
+ ],
+ 'checking handling of invalid database');
+
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '-d', 'postgres',
+ '-t', 'regression_invalid.public.foo',
+ ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: no connectable databases to check matching "regression_invalid.public.foo"/,
+ ],
+ 'checking handling of object in invalid database');
+
+
+#########################################
+# Test checking otherwise existent objects but in databases where they do not exist
+
+$node->safe_psql(
+ 'postgres', q(
+ CREATE TABLE public.foo (f integer);
+ CREATE INDEX foo_idx ON foo(f);
+));
+$node->safe_psql('postgres', q(CREATE DATABASE another_db));
+
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '-d',
+ 'postgres', '--no-strict-names',
+ '-t', 'template1.public.foo',
+ '-t', 'another_db.public.foo',
+ '-t', 'no_such_database.public.foo',
+ '-i', 'template1.public.foo_idx',
+ '-i', 'another_db.public.foo_idx',
+ '-i', 'no_such_database.public.foo_idx',
+ ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: warning: skipping database "template1": amcheck is not installed/,
+ qr/pg_amcheck: warning: no heap tables to check matching "template1\.public\.foo"/,
+ qr/pg_amcheck: warning: no heap tables to check matching "another_db\.public\.foo"/,
+ qr/pg_amcheck: warning: no connectable databases to check matching "no_such_database\.public\.foo"/,
+ qr/pg_amcheck: warning: no btree indexes to check matching "template1\.public\.foo_idx"/,
+ qr/pg_amcheck: warning: no btree indexes to check matching "another_db\.public\.foo_idx"/,
+ qr/pg_amcheck: warning: no connectable databases to check matching "no_such_database\.public\.foo_idx"/,
+ qr/pg_amcheck: error: no relations to check/,
+ ],
+ 'checking otherwise existent objets in the wrong databases');
+
+
+#########################################
+# Test schema exclusion patterns
+
+# Check with only schema exclusion patterns
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '--all', '--no-strict-names', '-S',
+ 'public', '-S', 'pg_catalog', '-S',
+ 'pg_toast', '-S', 'information_schema',
+ ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: warning: skipping database "template1": amcheck is not installed/,
+ qr/pg_amcheck: error: no relations to check/
+ ],
+ 'schema exclusion patterns exclude all relations');
+
+# Check with schema exclusion patterns overriding relation and schema inclusion patterns
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '--all', '--no-strict-names', '-s',
+ 'public', '-s', 'pg_catalog', '-s',
+ 'pg_toast', '-s', 'information_schema', '-t',
+ 'pg_catalog.pg_class', '-S*'
+ ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: warning: skipping database "template1": amcheck is not installed/,
+ qr/pg_amcheck: error: no relations to check/
+ ],
+ 'schema exclusion pattern overrides all inclusion patterns');
+
+done_testing();
diff --git a/src/bin/pg_amcheck/t/003_check.pl b/src/bin/pg_amcheck/t/003_check.pl
new file mode 100644
index 0000000..0cf6706
--- /dev/null
+++ b/src/bin/pg_amcheck/t/003_check.pl
@@ -0,0 +1,520 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+my ($node, $port, %corrupt_page, %remove_relation);
+
+# Returns the filesystem path for the named relation.
+#
+# Assumes the test node is running
+sub relation_filepath
+{
+ my ($dbname, $relname) = @_;
+
+ my $pgdata = $node->data_dir;
+ my $rel =
+ $node->safe_psql($dbname, qq(SELECT pg_relation_filepath('$relname')));
+ die "path not found for relation $relname" unless defined $rel;
+ return "$pgdata/$rel";
+}
+
+# Returns the name of the toast relation associated with the named relation.
+#
+# Assumes the test node is running
+sub relation_toast
+{
+ my ($dbname, $relname) = @_;
+
+ my $rel = $node->safe_psql(
+ $dbname, qq(
+ SELECT c.reltoastrelid::regclass
+ FROM pg_catalog.pg_class c
+ WHERE c.oid = '$relname'::regclass
+ AND c.reltoastrelid != 0
+ ));
+ return $rel;
+}
+
+# Adds the relation file for the given (dbname, relname) to the list
+# to be corrupted by means of overwriting junk in the first page.
+#
+# Assumes the test node is running.
+sub plan_to_corrupt_first_page
+{
+ my ($dbname, $relname) = @_;
+ my $relpath = relation_filepath($dbname, $relname);
+ $corrupt_page{$relpath} = 1;
+}
+
+# Adds the relation file for the given (dbname, relname) to the list
+# to be corrupted by means of removing the file..
+#
+# Assumes the test node is running
+sub plan_to_remove_relation_file
+{
+ my ($dbname, $relname) = @_;
+ my $relpath = relation_filepath($dbname, $relname);
+ $remove_relation{$relpath} = 1;
+}
+
+# For the given (dbname, relname), if a corresponding toast table
+# exists, adds that toast table's relation file to the list to be
+# corrupted by means of removing the file.
+#
+# Assumes the test node is running.
+sub plan_to_remove_toast_file
+{
+ my ($dbname, $relname) = @_;
+ my $toastname = relation_toast($dbname, $relname);
+ plan_to_remove_relation_file($dbname, $toastname) if ($toastname);
+}
+
+# Corrupts the first page of the given file path
+sub corrupt_first_page
+{
+ my ($relpath) = @_;
+
+ my $fh;
+ open($fh, '+<', $relpath)
+ or BAIL_OUT("open failed: $!");
+ binmode $fh;
+
+ # Corrupt some line pointers. The values are chosen to hit the
+ # various line-pointer-corruption checks in verify_heapam.c
+ # on both little-endian and big-endian architectures.
+ sysseek($fh, 32, 0)
+ or BAIL_OUT("sysseek failed: $!");
+ syswrite(
+ $fh,
+ pack("L*",
+ 0xAAA15550, 0xAAA0D550, 0x00010000, 0x00008000,
+ 0x0000800F, 0x001e8000, 0xFFFFFFFF)
+ ) or BAIL_OUT("syswrite failed: $!");
+ close($fh)
+ or BAIL_OUT("close failed: $!");
+}
+
+# Stops the node, performs all the corruptions previously planned, and
+# starts the node again.
+#
+sub perform_all_corruptions()
+{
+ $node->stop();
+ for my $relpath (keys %corrupt_page)
+ {
+ corrupt_first_page($relpath);
+ }
+ for my $relpath (keys %remove_relation)
+ {
+ unlink($relpath);
+ }
+ $node->start;
+}
+
+# Test set-up
+$node = PostgreSQL::Test::Cluster->new('test');
+$node->init;
+$node->append_conf('postgresql.conf', 'autovacuum=off');
+$node->start;
+$port = $node->port;
+
+for my $dbname (qw(db1 db2 db3))
+{
+ # Create the database
+ $node->safe_psql('postgres', qq(CREATE DATABASE $dbname));
+
+ # Load the amcheck extension, upon which pg_amcheck depends. Put the
+ # extension in an unexpected location to test that pg_amcheck finds it
+ # correctly. Create tables with names that look like pg_catalog names to
+ # check that pg_amcheck does not get confused by them. Create functions in
+ # schema public that look like amcheck functions to check that pg_amcheck
+ # does not use them.
+ $node->safe_psql(
+ $dbname, q(
+ CREATE SCHEMA amcheck_schema;
+ CREATE EXTENSION amcheck WITH SCHEMA amcheck_schema;
+ CREATE TABLE amcheck_schema.pg_database (junk text);
+ CREATE TABLE amcheck_schema.pg_namespace (junk text);
+ CREATE TABLE amcheck_schema.pg_class (junk text);
+ CREATE TABLE amcheck_schema.pg_operator (junk text);
+ CREATE TABLE amcheck_schema.pg_proc (junk text);
+ CREATE TABLE amcheck_schema.pg_tablespace (junk text);
+
+ CREATE FUNCTION public.bt_index_check(index regclass,
+ heapallindexed boolean default false)
+ RETURNS VOID AS $$
+ BEGIN
+ RAISE EXCEPTION 'Invoked wrong bt_index_check!';
+ END;
+ $$ LANGUAGE plpgsql;
+
+ CREATE FUNCTION public.bt_index_parent_check(index regclass,
+ heapallindexed boolean default false,
+ rootdescend boolean default false)
+ RETURNS VOID AS $$
+ BEGIN
+ RAISE EXCEPTION 'Invoked wrong bt_index_parent_check!';
+ END;
+ $$ LANGUAGE plpgsql;
+
+ CREATE FUNCTION public.verify_heapam(relation regclass,
+ on_error_stop boolean default false,
+ check_toast boolean default false,
+ skip text default 'none',
+ startblock bigint default null,
+ endblock bigint default null,
+ blkno OUT bigint,
+ offnum OUT integer,
+ attnum OUT integer,
+ msg OUT text)
+ RETURNS SETOF record AS $$
+ BEGIN
+ RAISE EXCEPTION 'Invoked wrong verify_heapam!';
+ END;
+ $$ LANGUAGE plpgsql;
+ ));
+
+ # Create schemas, tables and indexes in five separate
+ # schemas. The schemas are all identical to start, but
+ # we will corrupt them differently later.
+ #
+ for my $schema (qw(s1 s2 s3 s4 s5))
+ {
+ $node->safe_psql(
+ $dbname, qq(
+ CREATE SCHEMA $schema;
+ CREATE SEQUENCE $schema.seq1;
+ CREATE SEQUENCE $schema.seq2;
+ CREATE TABLE $schema.t1 (
+ i INTEGER,
+ b BOX,
+ ia int4[],
+ ir int4range,
+ t TEXT
+ );
+ CREATE TABLE $schema.t2 (
+ i INTEGER,
+ b BOX,
+ ia int4[],
+ ir int4range,
+ t TEXT
+ );
+ CREATE VIEW $schema.t2_view AS (
+ SELECT i*2, t FROM $schema.t2
+ );
+ ALTER TABLE $schema.t2
+ ALTER COLUMN t
+ SET STORAGE EXTERNAL;
+
+ INSERT INTO $schema.t1 (i, b, ia, ir, t)
+ (SELECT gs::INTEGER AS i,
+ box(point(gs,gs+5),point(gs*2,gs*3)) AS b,
+ array[gs, gs + 1]::int4[] AS ia,
+ int4range(gs, gs+100) AS ir,
+ repeat('foo', gs) AS t
+ FROM generate_series(1,10000,3000) AS gs);
+
+ INSERT INTO $schema.t2 (i, b, ia, ir, t)
+ (SELECT gs::INTEGER AS i,
+ box(point(gs,gs+5),point(gs*2,gs*3)) AS b,
+ array[gs, gs + 1]::int4[] AS ia,
+ int4range(gs, gs+100) AS ir,
+ repeat('foo', gs) AS t
+ FROM generate_series(1,10000,3000) AS gs);
+
+ CREATE MATERIALIZED VIEW $schema.t1_mv AS SELECT * FROM $schema.t1;
+ CREATE MATERIALIZED VIEW $schema.t2_mv AS SELECT * FROM $schema.t2;
+
+ create table $schema.p1 (a int, b int) PARTITION BY list (a);
+ create table $schema.p2 (a int, b int) PARTITION BY list (a);
+
+ create table $schema.p1_1 partition of $schema.p1 for values in (1, 2, 3);
+ create table $schema.p1_2 partition of $schema.p1 for values in (4, 5, 6);
+ create table $schema.p2_1 partition of $schema.p2 for values in (1, 2, 3);
+ create table $schema.p2_2 partition of $schema.p2 for values in (4, 5, 6);
+
+ CREATE INDEX t1_btree ON $schema.t1 USING BTREE (i);
+ CREATE INDEX t2_btree ON $schema.t2 USING BTREE (i);
+
+ CREATE INDEX t1_hash ON $schema.t1 USING HASH (i);
+ CREATE INDEX t2_hash ON $schema.t2 USING HASH (i);
+
+ CREATE INDEX t1_brin ON $schema.t1 USING BRIN (i);
+ CREATE INDEX t2_brin ON $schema.t2 USING BRIN (i);
+
+ CREATE INDEX t1_gist ON $schema.t1 USING GIST (b);
+ CREATE INDEX t2_gist ON $schema.t2 USING GIST (b);
+
+ CREATE INDEX t1_gin ON $schema.t1 USING GIN (ia);
+ CREATE INDEX t2_gin ON $schema.t2 USING GIN (ia);
+
+ CREATE INDEX t1_spgist ON $schema.t1 USING SPGIST (ir);
+ CREATE INDEX t2_spgist ON $schema.t2 USING SPGIST (ir);
+ ));
+ }
+}
+
+# Database 'db1' corruptions
+#
+
+# Corrupt indexes in schema "s1"
+plan_to_remove_relation_file('db1', 's1.t1_btree');
+plan_to_corrupt_first_page('db1', 's1.t2_btree');
+
+# Corrupt tables in schema "s2"
+plan_to_remove_relation_file('db1', 's2.t1');
+plan_to_corrupt_first_page('db1', 's2.t2');
+
+# Corrupt tables, partitions, matviews, and btrees in schema "s3"
+plan_to_remove_relation_file('db1', 's3.t1');
+plan_to_corrupt_first_page('db1', 's3.t2');
+
+plan_to_remove_relation_file('db1', 's3.t1_mv');
+plan_to_remove_relation_file('db1', 's3.p1_1');
+
+plan_to_corrupt_first_page('db1', 's3.t2_mv');
+plan_to_corrupt_first_page('db1', 's3.p2_1');
+
+plan_to_remove_relation_file('db1', 's3.t1_btree');
+plan_to_corrupt_first_page('db1', 's3.t2_btree');
+
+# Corrupt toast table, partitions, and materialized views in schema "s4"
+plan_to_remove_toast_file('db1', 's4.t2');
+
+# Corrupt all other object types in schema "s5". We don't have amcheck support
+# for these types, but we check that their corruption does not trigger any
+# errors in pg_amcheck
+plan_to_remove_relation_file('db1', 's5.seq1');
+plan_to_remove_relation_file('db1', 's5.t1_hash');
+plan_to_remove_relation_file('db1', 's5.t1_gist');
+plan_to_remove_relation_file('db1', 's5.t1_gin');
+plan_to_remove_relation_file('db1', 's5.t1_brin');
+plan_to_remove_relation_file('db1', 's5.t1_spgist');
+
+plan_to_corrupt_first_page('db1', 's5.seq2');
+plan_to_corrupt_first_page('db1', 's5.t2_hash');
+plan_to_corrupt_first_page('db1', 's5.t2_gist');
+plan_to_corrupt_first_page('db1', 's5.t2_gin');
+plan_to_corrupt_first_page('db1', 's5.t2_brin');
+plan_to_corrupt_first_page('db1', 's5.t2_spgist');
+
+
+# Database 'db2' corruptions
+#
+plan_to_remove_relation_file('db2', 's1.t1');
+plan_to_remove_relation_file('db2', 's1.t1_btree');
+
+
+# Leave 'db3' uncorrupted
+#
+
+# Standard first arguments to PostgreSQL::Test::Utils functions
+my @cmd = ('pg_amcheck', '-p', $port);
+
+# Regular expressions to match various expected output
+my $no_output_re = qr/^$/;
+my $line_pointer_corruption_re = qr/line pointer/;
+my $missing_file_re = qr/could not open file ".*": No such file or directory/;
+my $index_missing_relation_fork_re =
+ qr/index ".*" lacks a main relation fork/;
+
+# We have created test databases with tables populated with data, but have not
+# yet corrupted anything. As such, we expect no corruption and verify that
+# none is reported
+#
+$node->command_checks_all([ @cmd, '-d', 'db1', '-d', 'db2', '-d', 'db3' ],
+ 0, [$no_output_re], [$no_output_re], 'pg_amcheck prior to corruption');
+
+# Perform the corruptions we planned above using only a single database restart.
+#
+perform_all_corruptions();
+
+
+# Checking databases with amcheck installed and corrupt relations, pg_amcheck
+# command itself should return exit status = 2, because tables and indexes are
+# corrupt, not exit status = 1, which would mean the pg_amcheck command itself
+# failed. Corruption messages should go to stdout, and nothing to stderr.
+#
+$node->command_checks_all(
+ [ @cmd, 'db1' ],
+ 2,
+ [
+ $index_missing_relation_fork_re, $line_pointer_corruption_re,
+ $missing_file_re,
+ ],
+ [$no_output_re],
+ 'pg_amcheck all schemas, tables and indexes in database db1');
+
+$node->command_checks_all(
+ [ @cmd, '-d', 'db1', '-d', 'db2', '-d', 'db3' ],
+ 2,
+ [
+ $index_missing_relation_fork_re, $line_pointer_corruption_re,
+ $missing_file_re,
+ ],
+ [$no_output_re],
+ 'pg_amcheck all schemas, tables and indexes in databases db1, db2, and db3'
+);
+
+# Scans of indexes in s1 should detect the specific corruption that we created
+# above. For missing relation forks, we know what the error message looks
+# like. For corrupted index pages, the error might vary depending on how the
+# page was formatted on disk, including variations due to alignment differences
+# between platforms, so we accept any non-empty error message.
+#
+# If we don't limit the check to databases with amcheck installed, we expect
+# complaint on stderr, but otherwise stderr should be quiet.
+#
+$node->command_checks_all(
+ [ @cmd, '--all', '-s', 's1', '-i', 't1_btree' ],
+ 2,
+ [$index_missing_relation_fork_re],
+ [
+ qr/pg_amcheck: warning: skipping database "postgres": amcheck is not installed/
+ ],
+ 'pg_amcheck index s1.t1_btree reports missing main relation fork');
+
+$node->command_checks_all(
+ [ @cmd, '-d', 'db1', '-s', 's1', '-i', 't2_btree' ],
+ 2,
+ [qr/.+/], # Any non-empty error message is acceptable
+ [$no_output_re],
+ 'pg_amcheck index s1.s2 reports index corruption');
+
+# Checking db1.s1 with indexes excluded should show no corruptions because we
+# did not corrupt any tables in db1.s1. Verify that both stdout and stderr
+# are quiet.
+#
+$node->command_checks_all(
+ [ @cmd, '-t', 's1.*', '--no-dependent-indexes', 'db1' ],
+ 0, [$no_output_re], [$no_output_re],
+ 'pg_amcheck of db1.s1 excluding indexes');
+
+# Checking db2.s1 should show table corruptions if indexes are excluded
+#
+$node->command_checks_all(
+ [ @cmd, '-t', 's1.*', '--no-dependent-indexes', 'db2' ],
+ 2, [$missing_file_re], [$no_output_re],
+ 'pg_amcheck of db2.s1 excluding indexes');
+
+# In schema db1.s3, the tables and indexes are both corrupt. We should see
+# corruption messages on stdout, and nothing on stderr.
+#
+$node->command_checks_all(
+ [ @cmd, '-s', 's3', 'db1' ],
+ 2,
+ [
+ $index_missing_relation_fork_re, $line_pointer_corruption_re,
+ $missing_file_re,
+ ],
+ [$no_output_re],
+ 'pg_amcheck schema s3 reports table and index errors');
+
+# In schema db1.s4, only toast tables are corrupt. Check that under default
+# options the toast corruption is reported, but when excluding toast we get no
+# error reports.
+$node->command_checks_all([ @cmd, '-s', 's4', 'db1' ],
+ 2, [$missing_file_re], [$no_output_re],
+ 'pg_amcheck in schema s4 reports toast corruption');
+
+$node->command_checks_all(
+ [
+ @cmd, '--no-dependent-toast', '--exclude-toast-pointers', '-s', 's4',
+ 'db1'
+ ],
+ 0,
+ [$no_output_re],
+ [$no_output_re],
+ 'pg_amcheck in schema s4 excluding toast reports no corruption');
+
+# Check that no corruption is reported in schema db1.s5
+$node->command_checks_all([ @cmd, '-s', 's5', 'db1' ],
+ 0, [$no_output_re], [$no_output_re],
+ 'pg_amcheck over schema s5 reports no corruption');
+
+# In schema db1.s1, only indexes are corrupt. Verify that when we exclude
+# the indexes, no corruption is reported about the schema.
+#
+$node->command_checks_all(
+ [ @cmd, '-s', 's1', '-I', 't1_btree', '-I', 't2_btree', 'db1' ],
+ 0,
+ [$no_output_re],
+ [$no_output_re],
+ 'pg_amcheck over schema s1 with corrupt indexes excluded reports no corruption'
+);
+
+# In schema db1.s1, only indexes are corrupt. Verify that when we provide only
+# table inclusions, and disable index expansion, no corruption is reported
+# about the schema.
+#
+$node->command_checks_all(
+ [ @cmd, '-t', 's1.*', '--no-dependent-indexes', 'db1' ],
+ 0,
+ [$no_output_re],
+ [$no_output_re],
+ 'pg_amcheck over schema s1 with all indexes excluded reports no corruption'
+);
+
+# In schema db1.s2, only tables are corrupt. Verify that when we exclude those
+# tables that no corruption is reported.
+#
+$node->command_checks_all(
+ [ @cmd, '-s', 's2', '-T', 't1', '-T', 't2', 'db1' ],
+ 0,
+ [$no_output_re],
+ [$no_output_re],
+ 'pg_amcheck over schema s2 with corrupt tables excluded reports no corruption'
+);
+
+# Check errors about bad block range command line arguments. We use schema s5
+# to avoid getting messages about corrupt tables or indexes.
+#
+command_fails_like(
+ [ @cmd, '-s', 's5', '--startblock', 'junk', 'db1' ],
+ qr/invalid start block/,
+ 'pg_amcheck rejects garbage startblock');
+
+command_fails_like(
+ [ @cmd, '-s', 's5', '--endblock', '1234junk', 'db1' ],
+ qr/invalid end block/,
+ 'pg_amcheck rejects garbage endblock');
+
+command_fails_like(
+ [ @cmd, '-s', 's5', '--startblock', '5', '--endblock', '4', 'db1' ],
+ qr/end block precedes start block/,
+ 'pg_amcheck rejects invalid block range');
+
+# Check bt_index_parent_check alternates. We don't create any index corruption
+# that would behave differently under these modes, so just smoke test that the
+# arguments are handled sensibly.
+#
+$node->command_checks_all(
+ [ @cmd, '-s', 's1', '-i', 't1_btree', '--parent-check', 'db1' ],
+ 2,
+ [$index_missing_relation_fork_re],
+ [$no_output_re],
+ 'pg_amcheck smoke test --parent-check');
+
+$node->command_checks_all(
+ [
+ @cmd, '-s', 's1', '-i', 't1_btree', '--heapallindexed',
+ '--rootdescend', 'db1'
+ ],
+ 2,
+ [$index_missing_relation_fork_re],
+ [$no_output_re],
+ 'pg_amcheck smoke test --heapallindexed --rootdescend');
+
+$node->command_checks_all(
+ [ @cmd, '-d', 'db1', '-d', 'db2', '-d', 'db3', '-S', 's*' ],
+ 0, [$no_output_re], [$no_output_re],
+ 'pg_amcheck excluding all corrupt schemas');
+
+done_testing();
diff --git a/src/bin/pg_amcheck/t/004_verify_heapam.pl b/src/bin/pg_amcheck/t/004_verify_heapam.pl
new file mode 100644
index 0000000..25f1478
--- /dev/null
+++ b/src/bin/pg_amcheck/t/004_verify_heapam.pl
@@ -0,0 +1,542 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+# This regression test demonstrates that the pg_amcheck binary correctly
+# identifies specific kinds of corruption within pages. To test this, we need
+# a mechanism to create corrupt pages with predictable, repeatable corruption.
+# The postgres backend cannot be expected to help us with this, as its design
+# is not consistent with the goal of intentionally corrupting pages.
+#
+# Instead, we create a table to corrupt, and with careful consideration of how
+# postgresql lays out heap pages, we seek to offsets within the page and
+# overwrite deliberately chosen bytes with specific values calculated to
+# corrupt the page in expected ways. We then verify that pg_amcheck reports
+# the corruption, and that it runs without crashing. Note that the backend
+# cannot simply be started to run queries against the corrupt table, as the
+# backend will crash, at least for some of the corruption types we generate.
+#
+# Autovacuum potentially touching the table in the background makes the exact
+# behavior of this test harder to reason about. We turn it off to keep things
+# simpler. We use a "belt and suspenders" approach, turning it off for the
+# system generally in postgresql.conf, and turning it off specifically for the
+# test table.
+#
+# This test depends on the table being written to the heap file exactly as we
+# expect it to be, so we take care to arrange the columns of the table, and
+# insert rows of the table, that give predictable sizes and locations within
+# the table page.
+#
+# The HeapTupleHeaderData has 23 bytes of fixed size fields before the variable
+# length t_bits[] array. We have exactly 3 columns in the table, so natts = 3,
+# t_bits is 1 byte long, and t_hoff = MAXALIGN(23 + 1) = 24.
+#
+# We're not too fussy about which datatypes we use for the test, but we do care
+# about some specific properties. We'd like to test both fixed size and
+# varlena types. We'd like some varlena data inline and some toasted. And
+# we'd like the layout of the table such that the datums land at predictable
+# offsets within the tuple. We choose a structure without padding on all
+# supported architectures:
+#
+# a BIGINT
+# b TEXT
+# c TEXT
+#
+# We always insert a 7-ascii character string into field 'b', which with a
+# 1-byte varlena header gives an 8 byte inline value. We always insert a long
+# text string in field 'c', long enough to force toast storage.
+#
+# We choose to read and write binary copies of our table's tuples, using perl's
+# pack() and unpack() functions. Perl uses a packing code system in which:
+#
+# l = "signed 32-bit Long",
+# L = "Unsigned 32-bit Long",
+# S = "Unsigned 16-bit Short",
+# C = "Unsigned 8-bit Octet",
+#
+# Each tuple in our table has a layout as follows:
+#
+# xx xx xx xx t_xmin: xxxx offset = 0 L
+# xx xx xx xx t_xmax: xxxx offset = 4 L
+# xx xx xx xx t_field3: xxxx offset = 8 L
+# xx xx bi_hi: xx offset = 12 S
+# xx xx bi_lo: xx offset = 14 S
+# xx xx ip_posid: xx offset = 16 S
+# xx xx t_infomask2: xx offset = 18 S
+# xx xx t_infomask: xx offset = 20 S
+# xx t_hoff: x offset = 22 C
+# xx t_bits: x offset = 23 C
+# xx xx xx xx xx xx xx xx 'a': xxxxxxxx offset = 24 LL
+# xx xx xx xx xx xx xx xx 'b': xxxxxxxx offset = 32 CCCCCCCC
+# xx xx xx xx xx xx xx xx 'c': xxxxxxxx offset = 40 CCllLL
+# xx xx xx xx xx xx xx xx : xxxxxxxx ...continued
+# xx xx : xx ...continued
+#
+# We could choose to read and write columns 'b' and 'c' in other ways, but
+# it is convenient enough to do it this way. We define packing code
+# constants here, where they can be compared easily against the layout.
+
+use constant HEAPTUPLE_PACK_CODE => 'LLLSSSSSCCLLCCCCCCCCCCllLL';
+use constant HEAPTUPLE_PACK_LENGTH => 58; # Total size
+
+# Read a tuple of our table from a heap page.
+#
+# Takes an open filehandle to the heap file, and the offset of the tuple.
+#
+# Rather than returning the binary data from the file, unpacks the data into a
+# perl hash with named fields. These fields exactly match the ones understood
+# by write_tuple(), below. Returns a reference to this hash.
+#
+sub read_tuple
+{
+ my ($fh, $offset) = @_;
+ my ($buffer, %tup);
+ sysseek($fh, $offset, 0)
+ or BAIL_OUT("sysseek failed: $!");
+ defined(sysread($fh, $buffer, HEAPTUPLE_PACK_LENGTH))
+ or BAIL_OUT("sysread failed: $!");
+
+ @_ = unpack(HEAPTUPLE_PACK_CODE, $buffer);
+ %tup = (
+ t_xmin => shift,
+ t_xmax => shift,
+ t_field3 => shift,
+ bi_hi => shift,
+ bi_lo => shift,
+ ip_posid => shift,
+ t_infomask2 => shift,
+ t_infomask => shift,
+ t_hoff => shift,
+ t_bits => shift,
+ a_1 => shift,
+ a_2 => shift,
+ b_header => shift,
+ b_body1 => shift,
+ b_body2 => shift,
+ b_body3 => shift,
+ b_body4 => shift,
+ b_body5 => shift,
+ b_body6 => shift,
+ b_body7 => shift,
+ c_va_header => shift,
+ c_va_vartag => shift,
+ c_va_rawsize => shift,
+ c_va_extinfo => shift,
+ c_va_valueid => shift,
+ c_va_toastrelid => shift);
+ # Stitch together the text for column 'b'
+ $tup{b} = join('', map { chr($tup{"b_body$_"}) } (1 .. 7));
+ return \%tup;
+}
+
+# Write a tuple of our table to a heap page.
+#
+# Takes an open filehandle to the heap file, the offset of the tuple, and a
+# reference to a hash with the tuple values, as returned by read_tuple().
+# Writes the tuple fields from the hash into the heap file.
+#
+# The purpose of this function is to write a tuple back to disk with some
+# subset of fields modified. The function does no error checking. Use
+# cautiously.
+#
+sub write_tuple
+{
+ my ($fh, $offset, $tup) = @_;
+ my $buffer = pack(
+ HEAPTUPLE_PACK_CODE,
+ $tup->{t_xmin}, $tup->{t_xmax},
+ $tup->{t_field3}, $tup->{bi_hi},
+ $tup->{bi_lo}, $tup->{ip_posid},
+ $tup->{t_infomask2}, $tup->{t_infomask},
+ $tup->{t_hoff}, $tup->{t_bits},
+ $tup->{a_1}, $tup->{a_2},
+ $tup->{b_header}, $tup->{b_body1},
+ $tup->{b_body2}, $tup->{b_body3},
+ $tup->{b_body4}, $tup->{b_body5},
+ $tup->{b_body6}, $tup->{b_body7},
+ $tup->{c_va_header}, $tup->{c_va_vartag},
+ $tup->{c_va_rawsize}, $tup->{c_va_extinfo},
+ $tup->{c_va_valueid}, $tup->{c_va_toastrelid});
+ sysseek($fh, $offset, 0)
+ or BAIL_OUT("sysseek failed: $!");
+ defined(syswrite($fh, $buffer, HEAPTUPLE_PACK_LENGTH))
+ or BAIL_OUT("syswrite failed: $!");
+ return;
+}
+
+# Set umask so test directories and files are created with default permissions
+umask(0077);
+
+# Set up the node. Once we create and corrupt the table,
+# autovacuum workers visiting the table could crash the backend.
+# Disable autovacuum so that won't happen.
+my $node = PostgreSQL::Test::Cluster->new('test');
+$node->init;
+$node->append_conf('postgresql.conf', 'autovacuum=off');
+
+# Start the node and load the extensions. We depend on both
+# amcheck and pageinspect for this test.
+$node->start;
+my $port = $node->port;
+my $pgdata = $node->data_dir;
+$node->safe_psql('postgres', "CREATE EXTENSION amcheck");
+$node->safe_psql('postgres', "CREATE EXTENSION pageinspect");
+
+# Get a non-zero datfrozenxid
+$node->safe_psql('postgres', qq(VACUUM FREEZE));
+
+# Create the test table with precisely the schema that our corruption function
+# expects.
+$node->safe_psql(
+ 'postgres', qq(
+ CREATE TABLE public.test (a BIGINT, b TEXT, c TEXT);
+ ALTER TABLE public.test SET (autovacuum_enabled=false);
+ ALTER TABLE public.test ALTER COLUMN c SET STORAGE EXTERNAL;
+ CREATE INDEX test_idx ON public.test(a, b);
+ ));
+
+# We want (0 < datfrozenxid < test.relfrozenxid). To achieve this, we freeze
+# an otherwise unused table, public.junk, prior to inserting data and freezing
+# public.test
+$node->safe_psql(
+ 'postgres', qq(
+ CREATE TABLE public.junk AS SELECT 'junk'::TEXT AS junk_column;
+ ALTER TABLE public.junk SET (autovacuum_enabled=false);
+ VACUUM FREEZE public.junk
+ ));
+
+my $rel = $node->safe_psql('postgres',
+ qq(SELECT pg_relation_filepath('public.test')));
+my $relpath = "$pgdata/$rel";
+
+# Insert data and freeze public.test
+use constant ROWCOUNT => 17;
+$node->safe_psql(
+ 'postgres', qq(
+ INSERT INTO public.test (a, b, c)
+ VALUES (
+ x'DEADF9F9DEADF9F9'::bigint,
+ 'abcdefg',
+ repeat('w', 10000)
+ );
+ VACUUM FREEZE public.test
+ )) for (1 .. ROWCOUNT);
+
+my $relfrozenxid = $node->safe_psql('postgres',
+ q(select relfrozenxid from pg_class where relname = 'test'));
+my $datfrozenxid = $node->safe_psql('postgres',
+ q(select datfrozenxid from pg_database where datname = 'postgres'));
+
+# Sanity check that our 'test' table has a relfrozenxid newer than the
+# datfrozenxid for the database, and that the datfrozenxid is greater than the
+# first normal xid. We rely on these invariants in some of our tests.
+if ($datfrozenxid <= 3 || $datfrozenxid >= $relfrozenxid)
+{
+ $node->clean_node;
+ plan skip_all =>
+ "Xid thresholds not as expected: got datfrozenxid = $datfrozenxid, relfrozenxid = $relfrozenxid";
+ exit;
+}
+
+# Find where each of the tuples is located on the page.
+my @lp_off;
+for my $tup (0 .. ROWCOUNT - 1)
+{
+ push(
+ @lp_off,
+ $node->safe_psql(
+ 'postgres', qq(
+select lp_off from heap_page_items(get_raw_page('test', 'main', 0))
+ offset $tup limit 1)));
+}
+
+# Sanity check that our 'test' table on disk layout matches expectations. If
+# this is not so, we will have to skip the test until somebody updates the test
+# to work on this platform.
+$node->stop;
+my $file;
+open($file, '+<', $relpath)
+ or BAIL_OUT("open failed: $!");
+binmode $file;
+
+my $ENDIANNESS;
+for (my $tupidx = 0; $tupidx < ROWCOUNT; $tupidx++)
+{
+ my $offnum = $tupidx + 1; # offnum is 1-based, not zero-based
+ my $offset = $lp_off[$tupidx];
+ my $tup = read_tuple($file, $offset);
+
+ # Sanity-check that the data appears on the page where we expect.
+ my $a_1 = $tup->{a_1};
+ my $a_2 = $tup->{a_2};
+ my $b = $tup->{b};
+ if ($a_1 != 0xDEADF9F9 || $a_2 != 0xDEADF9F9 || $b ne 'abcdefg')
+ {
+ close($file); # ignore errors on close; we're exiting anyway
+ $node->clean_node;
+ plan skip_all =>
+ sprintf(
+ "Page layout differs from our expectations: expected (%x, %x, \"%s\"), got (%x, %x, \"%s\")",
+ 0xDEADF9F9, 0xDEADF9F9, "abcdefg", $a_1, $a_2, $b);
+ exit;
+ }
+
+ # Determine endianness of current platform from the 1-byte varlena header
+ $ENDIANNESS = $tup->{b_header} == 0x11 ? "little" : "big";
+}
+close($file)
+ or BAIL_OUT("close failed: $!");
+$node->start;
+
+# Ok, Xids and page layout look ok. We can run corruption tests.
+
+# Check that pg_amcheck runs against the uncorrupted table without error.
+$node->command_ok(
+ [ 'pg_amcheck', '-p', $port, 'postgres' ],
+ 'pg_amcheck test table, prior to corruption');
+
+# Check that pg_amcheck runs against the uncorrupted table and index without error.
+$node->command_ok([ 'pg_amcheck', '-p', $port, 'postgres' ],
+ 'pg_amcheck test table and index, prior to corruption');
+
+$node->stop;
+
+# Some #define constants from access/htup_details.h for use while corrupting.
+use constant HEAP_HASNULL => 0x0001;
+use constant HEAP_XMAX_LOCK_ONLY => 0x0080;
+use constant HEAP_XMIN_COMMITTED => 0x0100;
+use constant HEAP_XMIN_INVALID => 0x0200;
+use constant HEAP_XMAX_COMMITTED => 0x0400;
+use constant HEAP_XMAX_INVALID => 0x0800;
+use constant HEAP_NATTS_MASK => 0x07FF;
+use constant HEAP_XMAX_IS_MULTI => 0x1000;
+use constant HEAP_KEYS_UPDATED => 0x2000;
+
+# Helper function to generate a regular expression matching the header we
+# expect verify_heapam() to return given which fields we expect to be non-null.
+sub header
+{
+ my ($blkno, $offnum, $attnum) = @_;
+ return
+ qr/heap table "postgres\.public\.test", block $blkno, offset $offnum, attribute $attnum:\s+/ms
+ if (defined $attnum);
+ return
+ qr/heap table "postgres\.public\.test", block $blkno, offset $offnum:\s+/ms
+ if (defined $offnum);
+ return qr/heap table "postgres\.public\.test", block $blkno:\s+/ms
+ if (defined $blkno);
+ return qr/heap table "postgres\.public\.test":\s+/ms;
+}
+
+# Corrupt the tuples, one type of corruption per tuple. Some types of
+# corruption cause verify_heapam to skip to the next tuple without
+# performing any remaining checks, so we can't exercise the system properly if
+# we focus all our corruption on a single tuple.
+#
+my @expected;
+open($file, '+<', $relpath)
+ or BAIL_OUT("open failed: $!");
+binmode $file;
+
+for (my $tupidx = 0; $tupidx < ROWCOUNT; $tupidx++)
+{
+ my $offnum = $tupidx + 1; # offnum is 1-based, not zero-based
+ my $offset = $lp_off[$tupidx];
+ my $tup = read_tuple($file, $offset);
+
+ my $header = header(0, $offnum, undef);
+ if ($offnum == 1)
+ {
+ # Corruptly set xmin < relfrozenxid
+ my $xmin = $relfrozenxid - 1;
+ $tup->{t_xmin} = $xmin;
+ $tup->{t_infomask} &= ~HEAP_XMIN_COMMITTED;
+ $tup->{t_infomask} &= ~HEAP_XMIN_INVALID;
+
+ # Expected corruption report
+ push @expected,
+ qr/${header}xmin $xmin precedes relation freeze threshold 0:\d+/;
+ }
+ if ($offnum == 2)
+ {
+ # Corruptly set xmin < datfrozenxid
+ my $xmin = 3;
+ $tup->{t_xmin} = $xmin;
+ $tup->{t_infomask} &= ~HEAP_XMIN_COMMITTED;
+ $tup->{t_infomask} &= ~HEAP_XMIN_INVALID;
+
+ push @expected,
+ qr/${$header}xmin $xmin precedes oldest valid transaction ID 0:\d+/;
+ }
+ elsif ($offnum == 3)
+ {
+ # Corruptly set xmin < datfrozenxid, further back, noting circularity
+ # of xid comparison.
+ my $xmin = 4026531839;
+ $tup->{t_xmin} = $xmin;
+ $tup->{t_infomask} &= ~HEAP_XMIN_COMMITTED;
+ $tup->{t_infomask} &= ~HEAP_XMIN_INVALID;
+
+ push @expected,
+ qr/${$header}xmin ${xmin} precedes oldest valid transaction ID 0:\d+/;
+ }
+ elsif ($offnum == 4)
+ {
+ # Corruptly set xmax < relminmxid;
+ my $xmax = 4026531839;
+ $tup->{t_xmax} = $xmax;
+ $tup->{t_infomask} &= ~HEAP_XMAX_INVALID;
+
+ push @expected,
+ qr/${$header}xmax ${xmax} precedes oldest valid transaction ID 0:\d+/;
+ }
+ elsif ($offnum == 5)
+ {
+ # Corrupt the tuple t_hoff, but keep it aligned properly
+ $tup->{t_hoff} += 128;
+
+ push @expected,
+ qr/${$header}data begins at offset 152 beyond the tuple length 58/,
+ qr/${$header}tuple data should begin at byte 24, but actually begins at byte 152 \(3 attributes, no nulls\)/;
+ }
+ elsif ($offnum == 6)
+ {
+ # Corrupt the tuple t_hoff, wrong alignment
+ $tup->{t_hoff} += 3;
+
+ push @expected,
+ qr/${$header}tuple data should begin at byte 24, but actually begins at byte 27 \(3 attributes, no nulls\)/;
+ }
+ elsif ($offnum == 7)
+ {
+ # Corrupt the tuple t_hoff, underflow but correct alignment
+ $tup->{t_hoff} -= 8;
+
+ push @expected,
+ qr/${$header}tuple data should begin at byte 24, but actually begins at byte 16 \(3 attributes, no nulls\)/;
+ }
+ elsif ($offnum == 8)
+ {
+ # Corrupt the tuple t_hoff, underflow and wrong alignment
+ $tup->{t_hoff} -= 3;
+
+ push @expected,
+ qr/${$header}tuple data should begin at byte 24, but actually begins at byte 21 \(3 attributes, no nulls\)/;
+ }
+ elsif ($offnum == 9)
+ {
+ # Corrupt the tuple to look like it has lots of attributes, not just 3
+ $tup->{t_infomask2} |= HEAP_NATTS_MASK;
+
+ push @expected,
+ qr/${$header}number of attributes 2047 exceeds maximum expected for table 3/;
+ }
+ elsif ($offnum == 10)
+ {
+ # Corrupt the tuple to look like it has lots of attributes, some of
+ # them null. This falsely creates the impression that the t_bits
+ # array is longer than just one byte, but t_hoff still says otherwise.
+ $tup->{t_infomask} |= HEAP_HASNULL;
+ $tup->{t_infomask2} |= HEAP_NATTS_MASK;
+ $tup->{t_bits} = 0xAA;
+
+ push @expected,
+ qr/${$header}tuple data should begin at byte 280, but actually begins at byte 24 \(2047 attributes, has nulls\)/;
+ }
+ elsif ($offnum == 11)
+ {
+ # Same as above, but this time t_hoff plays along
+ $tup->{t_infomask} |= HEAP_HASNULL;
+ $tup->{t_infomask2} |= (HEAP_NATTS_MASK & 0x40);
+ $tup->{t_bits} = 0xAA;
+ $tup->{t_hoff} = 32;
+
+ push @expected,
+ qr/${$header}number of attributes 67 exceeds maximum expected for table 3/;
+ }
+ elsif ($offnum == 12)
+ {
+ # Overwrite column 'b' 1-byte varlena header and initial characters to
+ # look like a long 4-byte varlena
+ #
+ # On little endian machines, bytes ending in two zero bits (xxxxxx00 bytes)
+ # are 4-byte length word, aligned, uncompressed data (up to 1G). We set the
+ # high six bits to 111111 and the lower two bits to 00, then the next three
+ # bytes with 0xFF using 0xFCFFFFFF.
+ #
+ # On big endian machines, bytes starting in two zero bits (00xxxxxx bytes)
+ # are 4-byte length word, aligned, uncompressed data (up to 1G). We set the
+ # low six bits to 111111 and the high two bits to 00, then the next three
+ # bytes with 0xFF using 0x3FFFFFFF.
+ #
+ $tup->{b_header} = $ENDIANNESS eq 'little' ? 0xFC : 0x3F;
+ $tup->{b_body1} = 0xFF;
+ $tup->{b_body2} = 0xFF;
+ $tup->{b_body3} = 0xFF;
+
+ $header = header(0, $offnum, 1);
+ push @expected,
+ qr/${header}attribute with length \d+ ends at offset \d+ beyond total tuple length \d+/;
+ }
+ elsif ($offnum == 13)
+ {
+ # Corrupt the bits in column 'c' toast pointer
+ $tup->{c_va_valueid} = 0xFFFFFFFF;
+
+ $header = header(0, $offnum, 2);
+ push @expected, qr/${header}toast value \d+ not found in toast table/;
+ }
+ elsif ($offnum == 14)
+ {
+ # Set both HEAP_XMAX_COMMITTED and HEAP_XMAX_IS_MULTI
+ $tup->{t_infomask} |= HEAP_XMAX_COMMITTED;
+ $tup->{t_infomask} |= HEAP_XMAX_IS_MULTI;
+ $tup->{t_xmax} = 4;
+
+ push @expected,
+ qr/${header}multitransaction ID 4 equals or exceeds next valid multitransaction ID 1/;
+ }
+ elsif ($offnum == 15)
+ {
+ # Set both HEAP_XMAX_COMMITTED and HEAP_XMAX_IS_MULTI
+ $tup->{t_infomask} |= HEAP_XMAX_COMMITTED;
+ $tup->{t_infomask} |= HEAP_XMAX_IS_MULTI;
+ $tup->{t_xmax} = 4000000000;
+
+ push @expected,
+ qr/${header}multitransaction ID 4000000000 precedes relation minimum multitransaction ID threshold 1/;
+ }
+ elsif ($offnum == 16) # Last offnum must equal ROWCOUNT
+ {
+ # Corruptly set xmin > next_xid to be in the future.
+ my $xmin = 123456;
+ $tup->{t_xmin} = $xmin;
+ $tup->{t_infomask} &= ~HEAP_XMIN_COMMITTED;
+ $tup->{t_infomask} &= ~HEAP_XMIN_INVALID;
+
+ push @expected,
+ qr/${$header}xmin ${xmin} equals or exceeds next valid transaction ID 0:\d+/;
+ }
+ write_tuple($file, $offset, $tup);
+}
+close($file)
+ or BAIL_OUT("close failed: $!");
+$node->start;
+
+# Run pg_amcheck against the corrupt table with epoch=0, comparing actual
+# corruption messages against the expected messages
+$node->command_checks_all(
+ [ 'pg_amcheck', '--no-dependent-indexes', '-p', $port, 'postgres' ],
+ 2, [@expected], [], 'Expected corruption message output');
+
+$node->teardown_node;
+$node->clean_node;
+
+done_testing();
diff --git a/src/bin/pg_amcheck/t/005_opclass_damage.pl b/src/bin/pg_amcheck/t/005_opclass_damage.pl
new file mode 100644
index 0000000..ce376f2
--- /dev/null
+++ b/src/bin/pg_amcheck/t/005_opclass_damage.pl
@@ -0,0 +1,60 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+# This regression test checks the behavior of the btree validation in the
+# presence of breaking sort order changes.
+#
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $node = PostgreSQL::Test::Cluster->new('test');
+$node->init;
+$node->start;
+
+# Create a custom operator class and an index which uses it.
+$node->safe_psql(
+ 'postgres', q(
+ CREATE EXTENSION amcheck;
+
+ CREATE FUNCTION int4_asc_cmp (a int4, b int4) RETURNS int LANGUAGE sql AS $$
+ SELECT CASE WHEN $1 = $2 THEN 0 WHEN $1 > $2 THEN 1 ELSE -1 END; $$;
+
+ CREATE OPERATOR CLASS int4_fickle_ops FOR TYPE int4 USING btree AS
+ OPERATOR 1 < (int4, int4), OPERATOR 2 <= (int4, int4),
+ OPERATOR 3 = (int4, int4), OPERATOR 4 >= (int4, int4),
+ OPERATOR 5 > (int4, int4), FUNCTION 1 int4_asc_cmp(int4, int4);
+
+ CREATE TABLE int4tbl (i int4);
+ INSERT INTO int4tbl (SELECT * FROM generate_series(1,1000) gs);
+ CREATE INDEX fickleidx ON int4tbl USING btree (i int4_fickle_ops);
+));
+
+# We have not yet broken the index, so we should get no corruption
+$node->command_like([ 'pg_amcheck', '-p', $node->port, 'postgres' ],
+ qr/^$/,
+ 'pg_amcheck all schemas, tables and indexes reports no corruption');
+
+# Change the operator class to use a function which sorts in a different
+# order to corrupt the btree index
+$node->safe_psql(
+ 'postgres', q(
+ CREATE FUNCTION int4_desc_cmp (int4, int4) RETURNS int LANGUAGE sql AS $$
+ SELECT CASE WHEN $1 = $2 THEN 0 WHEN $1 > $2 THEN -1 ELSE 1 END; $$;
+ UPDATE pg_catalog.pg_amproc
+ SET amproc = 'int4_desc_cmp'::regproc
+ WHERE amproc = 'int4_asc_cmp'::regproc
+));
+
+# Index corruption should now be reported
+$node->command_checks_all(
+ [ 'pg_amcheck', '-p', $node->port, 'postgres' ],
+ 2,
+ [qr/item order invariant violated for index "fickleidx"/],
+ [],
+ 'pg_amcheck all schemas, tables and indexes reports fickleidx corruption'
+);
+
+done_testing();
diff --git a/src/bin/pg_archivecleanup/.gitignore b/src/bin/pg_archivecleanup/.gitignore
new file mode 100644
index 0000000..bd05d00
--- /dev/null
+++ b/src/bin/pg_archivecleanup/.gitignore
@@ -0,0 +1,3 @@
+/pg_archivecleanup
+
+/tmp_check/
diff --git a/src/bin/pg_archivecleanup/Makefile b/src/bin/pg_archivecleanup/Makefile
new file mode 100644
index 0000000..49935d6
--- /dev/null
+++ b/src/bin/pg_archivecleanup/Makefile
@@ -0,0 +1,36 @@
+# src/bin/pg_archivecleanup/Makefile
+
+PGFILEDESC = "pg_archivecleanup - cleans archive when used with streaming replication"
+PGAPPICON = win32
+
+subdir = src/bin/pg_archivecleanup
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ pg_archivecleanup.o
+
+all: pg_archivecleanup
+
+pg_archivecleanup: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_archivecleanup$(X) '$(DESTDIR)$(bindir)/pg_archivecleanup$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_archivecleanup$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_archivecleanup$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_archivecleanup/nls.mk b/src/bin/pg_archivecleanup/nls.mk
new file mode 100644
index 0000000..6fca0e5
--- /dev/null
+++ b/src/bin/pg_archivecleanup/nls.mk
@@ -0,0 +1,6 @@
+# src/bin/pg_archivecleanup/nls.mk
+CATALOG_NAME = pg_archivecleanup
+AVAIL_LANGUAGES = cs de el es fr it ja ka ko pt_BR ru sv tr uk zh_CN
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_archivecleanup.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS)
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/pg_archivecleanup/pg_archivecleanup.c b/src/bin/pg_archivecleanup/pg_archivecleanup.c
new file mode 100644
index 0000000..064cbb2
--- /dev/null
+++ b/src/bin/pg_archivecleanup/pg_archivecleanup.c
@@ -0,0 +1,375 @@
+/*
+ * pg_archivecleanup.c
+ *
+ * To be used as archive_cleanup_command to clean an archive when using
+ * standby mode.
+ *
+ * src/bin/pg_archivecleanup/pg_archivecleanup.c
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <sys/time.h>
+
+#include "access/xlog_internal.h"
+#include "common/logging.h"
+#include "pg_getopt.h"
+
+const char *progname;
+
+/* Options and defaults */
+bool dryrun = false; /* are we performing a dry-run operation? */
+char *additional_ext = NULL; /* Extension to remove from filenames */
+
+char *archiveLocation; /* where to find the archive? */
+char *restartWALFileName; /* the file from which we can restart restore */
+char exclusiveCleanupFileName[MAXFNAMELEN]; /* the oldest file we want
+ * to remain in archive */
+
+
+/* =====================================================================
+ *
+ * Customizable section
+ *
+ * =====================================================================
+ *
+ * Currently, this section assumes that the Archive is a locally
+ * accessible directory. If you want to make other assumptions,
+ * such as using a vendor-specific archive and access API, these
+ * routines are the ones you'll need to change. You're
+ * encouraged to submit any changes to pgsql-hackers@lists.postgresql.org
+ * or personally to the current maintainer. Those changes may be
+ * folded in to later versions of this program.
+ */
+
+/*
+ * Initialize allows customized commands into the archive cleanup program.
+ *
+ * You may wish to add code to check for tape libraries, etc..
+ */
+static void
+Initialize(void)
+{
+ /*
+ * This code assumes that archiveLocation is a directory, so we use stat
+ * to test if it's accessible.
+ */
+ struct stat stat_buf;
+
+ if (stat(archiveLocation, &stat_buf) != 0 ||
+ !S_ISDIR(stat_buf.st_mode))
+ {
+ pg_log_error("archive location \"%s\" does not exist",
+ archiveLocation);
+ exit(2);
+ }
+}
+
+static void
+TrimExtension(char *filename, char *extension)
+{
+ int flen;
+ int elen;
+
+ if (extension == NULL)
+ return;
+
+ elen = strlen(extension);
+ flen = strlen(filename);
+
+ if (flen > elen && strcmp(filename + flen - elen, extension) == 0)
+ filename[flen - elen] = '\0';
+}
+
+static void
+CleanupPriorWALFiles(void)
+{
+ int rc;
+ DIR *xldir;
+ struct dirent *xlde;
+ char walfile[MAXPGPATH];
+
+ if ((xldir = opendir(archiveLocation)) != NULL)
+ {
+ while (errno = 0, (xlde = readdir(xldir)) != NULL)
+ {
+ /*
+ * Truncation is essentially harmless, because we skip names of
+ * length other than XLOG_FNAME_LEN. (In principle, one could use
+ * a 1000-character additional_ext and get trouble.)
+ */
+ strlcpy(walfile, xlde->d_name, MAXPGPATH);
+ TrimExtension(walfile, additional_ext);
+
+ /*
+ * We ignore the timeline part of the XLOG segment identifiers in
+ * deciding whether a segment is still needed. This ensures that
+ * we won't prematurely remove a segment from a parent timeline.
+ * We could probably be a little more proactive about removing
+ * segments of non-parent timelines, but that would be a whole lot
+ * more complicated.
+ *
+ * We use the alphanumeric sorting property of the filenames to
+ * decide which ones are earlier than the exclusiveCleanupFileName
+ * file. Note that this means files are not removed in the order
+ * they were originally written, in case this worries you.
+ */
+ if ((IsXLogFileName(walfile) || IsPartialXLogFileName(walfile)) &&
+ strcmp(walfile + 8, exclusiveCleanupFileName + 8) < 0)
+ {
+ char WALFilePath[MAXPGPATH * 2]; /* the file path
+ * including archive */
+
+ /*
+ * Use the original file name again now, including any
+ * extension that might have been chopped off before testing
+ * the sequence.
+ */
+ snprintf(WALFilePath, sizeof(WALFilePath), "%s/%s",
+ archiveLocation, xlde->d_name);
+
+ if (dryrun)
+ {
+ /*
+ * Prints the name of the file to be removed and skips the
+ * actual removal. The regular printout is so that the
+ * user can pipe the output into some other program.
+ */
+ printf("%s\n", WALFilePath);
+ pg_log_debug("file \"%s\" would be removed", WALFilePath);
+ continue;
+ }
+
+ pg_log_debug("removing file \"%s\"", WALFilePath);
+
+ rc = unlink(WALFilePath);
+ if (rc != 0)
+ pg_fatal("could not remove file \"%s\": %m",
+ WALFilePath);
+ }
+ }
+
+ if (errno)
+ pg_fatal("could not read archive location \"%s\": %m",
+ archiveLocation);
+ if (closedir(xldir))
+ pg_fatal("could not close archive location \"%s\": %m",
+ archiveLocation);
+ }
+ else
+ pg_fatal("could not open archive location \"%s\": %m",
+ archiveLocation);
+}
+
+/*
+ * SetWALFileNameForCleanup()
+ *
+ * Set the earliest WAL filename that we want to keep on the archive
+ * and decide whether we need cleanup
+ */
+static void
+SetWALFileNameForCleanup(void)
+{
+ bool fnameOK = false;
+
+ TrimExtension(restartWALFileName, additional_ext);
+
+ /*
+ * If restartWALFileName is a WAL file name then just use it directly. If
+ * restartWALFileName is a .partial or .backup filename, make sure we use
+ * the prefix of the filename, otherwise we will remove wrong files since
+ * 000000010000000000000010.partial and
+ * 000000010000000000000010.00000020.backup are after
+ * 000000010000000000000010.
+ */
+ if (IsXLogFileName(restartWALFileName))
+ {
+ strcpy(exclusiveCleanupFileName, restartWALFileName);
+ fnameOK = true;
+ }
+ else if (IsPartialXLogFileName(restartWALFileName))
+ {
+ int args;
+ uint32 tli = 1,
+ log = 0,
+ seg = 0;
+
+ args = sscanf(restartWALFileName, "%08X%08X%08X.partial",
+ &tli, &log, &seg);
+ if (args == 3)
+ {
+ fnameOK = true;
+
+ /*
+ * Use just the prefix of the filename, ignore everything after
+ * first period
+ */
+ XLogFileNameById(exclusiveCleanupFileName, tli, log, seg);
+ }
+ }
+ else if (IsBackupHistoryFileName(restartWALFileName))
+ {
+ int args;
+ uint32 tli = 1,
+ log = 0,
+ seg = 0,
+ offset = 0;
+
+ args = sscanf(restartWALFileName, "%08X%08X%08X.%08X.backup", &tli, &log, &seg, &offset);
+ if (args == 4)
+ {
+ fnameOK = true;
+
+ /*
+ * Use just the prefix of the filename, ignore everything after
+ * first period
+ */
+ XLogFileNameById(exclusiveCleanupFileName, tli, log, seg);
+ }
+ }
+
+ if (!fnameOK)
+ {
+ pg_log_error("invalid file name argument");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(2);
+ }
+}
+
+/* =====================================================================
+ * End of Customizable section
+ * =====================================================================
+ */
+
+static void
+usage(void)
+{
+ printf(_("%s removes older WAL files from PostgreSQL archives.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -d generate debug output (verbose mode)\n"));
+ printf(_(" -n dry run, show the names of the files that would be removed\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -x EXT clean up files if they have this extension\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\n"
+ "For use as archive_cleanup_command in postgresql.conf:\n"
+ " archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+ "e.g.\n"
+ " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"));
+ printf(_("\n"
+ "Or for use as a standalone archive cleaner:\n"
+ "e.g.\n"
+ " pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+/*------------ MAIN ----------------------------------------*/
+int
+main(int argc, char **argv)
+{
+ int c;
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_archivecleanup"));
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_archivecleanup (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((c = getopt(argc, argv, "x:dn")) != -1)
+ {
+ switch (c)
+ {
+ case 'd': /* Debug mode */
+ pg_logging_increase_verbosity();
+ break;
+ case 'n': /* Dry-Run mode */
+ dryrun = true;
+ break;
+ case 'x':
+ additional_ext = pg_strdup(optarg); /* Extension to remove
+ * from xlogfile names */
+ break;
+ default:
+ /* getopt already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(2);
+ }
+ }
+
+ /*
+ * We will go to the archiveLocation to check restartWALFileName.
+ * restartWALFileName may not exist anymore, which would not be an error,
+ * so we separate the archiveLocation and restartWALFileName so we can
+ * check separately whether archiveLocation exists, if not that is an
+ * error
+ */
+ if (optind < argc)
+ {
+ archiveLocation = argv[optind];
+ optind++;
+ }
+ else
+ {
+ pg_log_error("must specify archive location");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(2);
+ }
+
+ if (optind < argc)
+ {
+ restartWALFileName = argv[optind];
+ optind++;
+ }
+ else
+ {
+ pg_log_error("must specify oldest kept WAL file");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(2);
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(2);
+ }
+
+ /*
+ * Check archive exists and other initialization if required.
+ */
+ Initialize();
+
+ /*
+ * Check filename is a valid name, then process to find cut-off
+ */
+ SetWALFileNameForCleanup();
+
+ pg_log_debug("keeping WAL file \"%s/%s\" and later",
+ archiveLocation, exclusiveCleanupFileName);
+
+ /*
+ * Remove WAL files older than cut-off
+ */
+ CleanupPriorWALFiles();
+
+ exit(0);
+}
diff --git a/src/bin/pg_archivecleanup/po/cs.po b/src/bin/pg_archivecleanup/po/cs.po
new file mode 100644
index 0000000..3a9419c
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/cs.po
@@ -0,0 +1,198 @@
+# LANGUAGE message translation file for pg_archivecleanup
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:16+0000\n"
+"PO-Revision-Date: 2020-10-31 21:37+0100\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "fatal: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "archivní lokace \"%s\" neexistuje"
+
+#: pg_archivecleanup.c:152
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "nelze odstranit soubor \"%s\": %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "nelze načíst archivní lokaci \"%s\": %m"
+
+#: pg_archivecleanup.c:163
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "nelze uzavřít archivní lokaci \"%s\": %m"
+
+#: pg_archivecleanup.c:167
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "nelze otevřít archivní lokaci \"%s\": %m"
+
+#: pg_archivecleanup.c:240
+#, c-format
+msgid "invalid file name argument"
+msgstr "chybný argument jména souboru"
+
+#: pg_archivecleanup.c:241 pg_archivecleanup.c:315 pg_archivecleanup.c:336
+#: pg_archivecleanup.c:348 pg_archivecleanup.c:355
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s odstraní starší WAL soubory z PostgreSQL archivů.\n"
+"\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Přepínače:\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d vygeneruje debug výstup (více informací)\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n zkušební běh, ukazuje jména souborů které by byly odstraněny\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version vypíše informaci o verzi, pak skončí\n"
+
+#: pg_archivecleanup.c:261
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT vyčistí soubory pokud mají tuto příponu\n"
+
+#: pg_archivecleanup.c:262
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukáže tuto nápovědu, a skončí\n"
+
+#: pg_archivecleanup.c:263
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Pro použití jako archive_cleanup_command v recovery.conf pokud standby_mode = on:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:268
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Nebo jako samostatný čistič archivu:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:272
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Chyby hlašte na <%s>.\n"
+
+#: pg_archivecleanup.c:273
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: pg_archivecleanup.c:335
+#, c-format
+msgid "must specify archive location"
+msgstr "nutno zadat archivní lokaci"
+
+#: pg_archivecleanup.c:347
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "nutno zadat nejstarčí uchovávaný WAL soubor"
+
+#: pg_archivecleanup.c:354
+#, c-format
+msgid "too many command-line arguments"
+msgstr "příliš mnoho argumentů na příkazové řádce"
+
+#~ msgid "%s: file \"%s\" would be removed\n"
+#~ msgstr "%s: soubor \"%s\" by byl odstraněn\n"
+
+#~ msgid "%s: removing file \"%s\"\n"
+#~ msgstr "%s: odstraňuji soubor \"%s\"\n"
+
+#~ msgid "%s: ERROR: could not remove file \"%s\": %s\n"
+#~ msgstr "%s: ERROR: nelze odstranit soubor \"%s\": %s\n"
+
+#~ msgid "%s: keeping WAL file \"%s\" and later\n"
+#~ msgstr "%s: uchovávám WAL soubor \"%s\" a novější\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
diff --git a/src/bin/pg_archivecleanup/po/de.po b/src/bin/pg_archivecleanup/po/de.po
new file mode 100644
index 0000000..64ff8d9
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/de.po
@@ -0,0 +1,183 @@
+# pg_archivecleanup message translation file for pg_archivecleanup
+# Copyright (C) 2019-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Peter Eisentraut <peter@eisentraut.org>, 2019 - 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-11 15:50+0000\n"
+"PO-Revision-Date: 2022-05-11 22:07+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "Archivverzeichnis »%s« existiert nicht"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht löschen: %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "konnte Archivverzeichnis »%s« nicht lesen: %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "konnte Archivverzeichnis »%s« nicht schließen: %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "konnte Archivverzeichnis »%s« nicht öffnen: %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "ungültiges Dateinamenargument"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s entfernt alte WAL-Dateien aus PostgreSQL-Archiven.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [OPTION]... ARCHIVVERZEICHNIS ÄLTESTE-ZU-BEHALTENE-WALDATEI\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Optionen:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d Debug-Ausgaben erzeugen (Verbose-Modus)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n Probelauf, Namen der Dateien anzeigen, die entfernt würden\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x ERW Dateien mit dieser Erweiterung aufräumen\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Verwendung als archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVVERZ %%r'\n"
+"z.B.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiv %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Oder alleinstehende Verwendung zum Aufräumen eines Archivs:\n"
+"z.B.\n"
+" pg_archivecleanup /mnt/server/archiv 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "Archivverzeichnis muss angegeben werden"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "älteste zu behaltene WAL-Datei muss angegeben werden"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "zu viele Kommandozeilenargumente"
diff --git a/src/bin/pg_archivecleanup/po/el.po b/src/bin/pg_archivecleanup/po/el.po
new file mode 100644
index 0000000..5a1b7a6
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/el.po
@@ -0,0 +1,189 @@
+# Greek message translation file for pg_archivecleanup
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 16:50+0000\n"
+"PO-Revision-Date: 2023-04-13 13:51+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "προειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέρεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "η τοποθεσία της αρχειοθήκης «%s» δεν υπάρχει"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αφαίρεση του αρχείου «%s»: %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση της τοποθεσίας αρχειοθήκης «%s»: %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο της τοποθεσίας αρχειοθήκης «%s»: %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα της τοποθεσίας αρχειοθήκης «%s»: %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "μη έγκυρη παράμετρος ονόματος αρχείου"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s αφαιρεί παλαιότερα αρχεία WAL από αρχειοθήκες PostgreSQL.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "Χρήση:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Επιλογές:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d δημιουργία εξόδου αποσφαλμάτωσης (περιφραστική λειτουργία)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n ξηρή λειτουργία, εμφάνιση των ονομάτων των αρχείων που θα αφαιρεθούν\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT εκκαθάριση αρχείων εάν περιέχουν αυτήν την επέκταση\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Για χρήση ως archive_cleanup_command στο postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [ΕΠΙΛΟΓΗ]... ARCHIVELOCATION %%r’\n"
+"π.χ.\n"
+" archive_cleanup_command = ‘pg_archivecleanup /mnt/διακομιστής/αρχειοθήκη %%r’\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Ή για χρήση ως αυτόνομο εκκαθαριστικό αρχειοθήκης:\n"
+"π.χ.\n"
+" pg_archivecleanup /mnt/server/archiverdir 0000000100000000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφορές σφάλματων σε <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αρχική σελίδα: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "πρέπει να καθορίσετε τη τοποθεσία αρχειοθήκης"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "πρέπει να καθορίσετε το παλαιότερο κρατημένο αρχείο WAL"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών"
+
+#~ msgid "fatal: "
+#~ msgstr "κρίσιμο: "
diff --git a/src/bin/pg_archivecleanup/po/es.po b/src/bin/pg_archivecleanup/po/es.po
new file mode 100644
index 0000000..ed1f77b
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/es.po
@@ -0,0 +1,185 @@
+# Spanish message translation file for pg_archivecleanup
+# Copyright (c) 2017-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Carlos Chapi <carlos.chapi@2ndquadrant.com>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:50+0000\n"
+"PO-Revision-Date: 2022-10-20 09:06+0200\n"
+"Last-Translator: Carlos Chapi <carlos.chapi@2ndquadrant.com>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: BlackCAT 1.0\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "ubicación de archivador «%s» no existe"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "no se pudo eliminar el archivo «%s»: %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "no se pudo leer la ubicación del archivador «%s»: %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "no se pudo cerrar la ubicación del archivador «%s»: %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "no se pudo abrir la ubicación del archivador «%s»: %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "el nombre de archivo usado como argumento no es válido"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s elimina archivos de WAL antiguos del archivador de PostgreSQL.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [OPCIÓN].... UBICACIÓNARCHIVADOR WALMÁSANTIGUOAMANTENER\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opciones:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d genera salida de depuración (modo verboso)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n simulacro, muestra el nombre de los archivos que se eliminarían\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version muestra información de la versión, luego sale\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT hace limpieza de archivos que tengan esta extensión\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help muestra esta ayuda, luego sale\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Para usar como archive_cleanup_command en postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPCIÓN]... UBICACIÓNARCHIVADOR %%r'\n"
+"por ej.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/servidor/directorioarchivador %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"O para usar como un limpiador de archivador de forma independiente:\n"
+"por ej.\n"
+" pg_archivecleanup /mnt/servidor/directorioarchivador 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "debe especificar la ubicación del archivador"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "debe especificar el fichero WAL más antiguo a mantener"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "demasiados argumentos de línea de órdenes"
diff --git a/src/bin/pg_archivecleanup/po/fr.po b/src/bin/pg_archivecleanup/po/fr.po
new file mode 100644
index 0000000..0ac310c
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/fr.po
@@ -0,0 +1,218 @@
+# LANGUAGE message translation file for pg_archivecleanup
+# Copyright (C) 2017-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2017-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-12 05:16+0000\n"
+"PO-Revision-Date: 2022-04-12 17:29+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:280
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:291
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:298
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "l'emplacement d'archivage « %s » n'existe pas"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "n'a pas pu supprimer le fichier « %s » : %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "n'a pas pu lire l'emplacement de l'archive « %s » : %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "n'a pas pu fermer l'emplacement de l'archive « %s » : %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "n'a pas pu ouvrir l'emplacement de l'archive « %s » : %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "argument du nom de fichier invalide"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s supprime les anciens fichiers WAL des archives de PostgreSQL.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [OPTION]... EMPLACEMENTARCHIVE PLUSANCIENFICHIERWALCONSERVÉ\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options :\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d affiche des informations de débugage (mode verbeux)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n test, affiche le nom des fichiers qui seraient supprimés\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version et quitte\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT nettoie les fichiers s'ils ont cette extension\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide et quitte\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Pour utiliser comme archive_cleanup_command dans postgresql.conf :\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... EMPLACEMENTARCHIVE %%r'\n"
+"Par exemple :\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/serveur/reparchives %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Ou pour utiliser comme nettoyeur autonome d'archives :\n"
+"Par exemple :\n"
+" pg_archivecleanup /mnt/serveur/reparchives 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "doit spécifier l'emplacement de l'archive"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "doit spécifier le plus ancien journal de transactions conservé"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "trop d'arguments en ligne de commande"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "%s: ERROR: could not remove file \"%s\": %s\n"
+#~ msgstr "%s : ERREUR : n'a pas pu supprimer le fichier « %s » : %s\n"
+
+#~ msgid "%s: file \"%s\" would be removed\n"
+#~ msgstr "%s : le fichier « %s » serait supprimé\n"
+
+#~ msgid "%s: keeping WAL file \"%s\" and later\n"
+#~ msgstr "%s : conservation du fichier WAL « %s » et des suivants\n"
+
+#~ msgid "%s: removing file \"%s\"\n"
+#~ msgstr "%s : suppression du fichier « %s »\n"
+
+#~ msgid "%s: too many parameters\n"
+#~ msgstr "%s : trop de paramètres\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
diff --git a/src/bin/pg_archivecleanup/po/it.po b/src/bin/pg_archivecleanup/po/it.po
new file mode 100644
index 0000000..6be1003
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/it.po
@@ -0,0 +1,184 @@
+# LANGUAGE message translation file for pg_archivecleanup
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:20+0000\n"
+"PO-Revision-Date: 2022-09-30 14:18+0200\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Last-Translator: Domenico Sgarbossa <sgarbossa.domenico@gmail.com>\n"
+"Language-Team: \n"
+"X-Generator: Poedit 2.3\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore:"
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "il percorso di archiviazione \"%s\" non esiste"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "rimozione del file \"%s\" fallita: %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "impossibile leggere la posizione dell'archivio \"%s\": %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "impossibile chiudere la posizione dell'archivio \"%s\": %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "impossibile aprire la posizione dell'archivio \"%s\": %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "argomento nome file non valido"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s rimuove i file WAL meno recenti dagli archivi PostgreSQL.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr "%s [OPZIONE]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opzioni:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d genera output di debug (modalità dettagliata)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n dry run, mostra i nomi dei file che verrebbero rimossi\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT ripulisce i file se hanno questa estensione\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Da utilizzare come archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPZIONE]... ARCHIVELOCATION %%r'\n"
+"per esempio.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"O per l'uso come pulitore di archivi autonomo:\n"
+"per esempio.\n"
+" pg_archivecleanup /mnt/server/archiverdir 0000000100000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "deve specificare la posizione dell'archivio"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "deve specificare il file WAL più vecchio conservato"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "troppi argomenti della riga di comando"
diff --git a/src/bin/pg_archivecleanup/po/ja.po b/src/bin/pg_archivecleanup/po/ja.po
new file mode 100644
index 0000000..cabca2e
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/ja.po
@@ -0,0 +1,201 @@
+# Japanese message translation file for pg_archivecleanup
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-09 12:00+0900\n"
+"PO-Revision-Date: 2020-09-13 08:55+0200\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "アーカイブの場所\"%s\"が存在しません"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "ファイル\"%s\"を削除できませんでした: %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "アーカイブの場所\"%s\"を読み込めませんでした: %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "アーカイブの場所\"%s\"をクローズできませんでした: %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "アーカイブの場所\"%s\"をオープンできませんでした: %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "ファイル名引数が無効です"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細は\"%s --help\"を実行してください。"
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%sはPostgreSQLのアーカイブから古いWALファイルを削除します。\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "使用法:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr "%s [オプション] ... {アーカイブの場所} {保存する最古の WAL ファイル名}\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"オプション:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d デバッグ情報を出力(冗長モード)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n リハーサル、削除対象のファイル名を表示\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を出力して終了\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT この拡張子を持つファイルを削除対象とする\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"postgresql.confでarchive_cleanup_commandとして使用する場合は以下のようにします:\n"
+" archive_cleanup_command = 'pg_archivecleanup [オプション]... アーカイブの場所 %%r'\n"
+"例としては:\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"もしくはスタンドアロンのアーカイブクリーナーとして使う場合は:\n"
+"使用例\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"バグは<%s>に報告してください。\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "アーカイブの場所を指定してください"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "保存する最古のWALファイルを指定してください"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "コマンドライン引数が多すぎます"
+
+#~ msgid "%s: keeping WAL file \"%s\" and later\n"
+#~ msgstr "%s: WAL file \"%s\" とそれ以降の分を保存しています\n"
+
+#~ msgid "%s: ERROR: could not remove file \"%s\": %s\n"
+#~ msgstr "%s: エラー: ファイル \"%s\" を削除できませんでした: %s\n"
+
+#~ msgid "%s: removing file \"%s\"\n"
+#~ msgstr "%s: ファイル \"%s\" を削除しています\n"
+
+#~ msgid "%s: file \"%s\" would be removed\n"
+#~ msgstr "%s: ファイル \"%s\" は削除されます\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "\"%s --help\"で詳細が参照できます。\n"
+
+#~ msgid "fatal: "
+#~ msgstr "致命的エラー: "
diff --git a/src/bin/pg_archivecleanup/po/ka.po b/src/bin/pg_archivecleanup/po/ka.po
new file mode 100644
index 0000000..6bfc887
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/ka.po
@@ -0,0 +1,197 @@
+# Georgian message translation file for pg_archivecleanup
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:50+0000\n"
+"PO-Revision-Date: 2022-07-04 09:06+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდომა: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტალები: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნება: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "არქივის მდებარეობა არ არსებობს: %s"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "ფაილის წაშლის შეცდომა \"%s\": %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "არქივის მდებარეობის წაკითხვის შეცდომა\"%s\": %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "არქივის მდებარეობის დაყენების შეცდომა\"%s\": %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "არქივის მდებარეობის გახსნის შეცდომა\"%s\": %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "ფაილის სახელის არასწორი არგუმენტი"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL-ის არქივებიდან ძველი WAL ფაილების წაშლა.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "გამოყენება:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [პარამეტრი]... არქივისმდგომარეობა უძველესიშენახულიWALფაილი\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"პარამეტრები\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr ""
+" -d, --debug გასამართი ინფორმაციის გენერაცია(verbose mode)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid ""
+" -n dry run, show the names of the files that would be "
+"removed\n"
+msgstr ""
+" -n მშრალი გაშვება. ფაილების წაშლის მაგიერ მხოლოდ მათი "
+"სახელების ჩვენება\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ჩვენება და გასვლა\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr ""
+" -x EXT ფაილების გასუფთავება, თუ მათ ეს გაფართოება გააჩნიათ\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION "
+"%%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir "
+"%%r'\n"
+msgstr ""
+"\n"
+"გამოსაყენებლად, როგორც archive_cleanup_command postgresql.conf-ში: \n"
+" archive_cleanup_command = 'pg_archivecleanup [პარამეტრი]... "
+"არქივისმდებარეობა %%r'\n"
+"მაგ: \n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir "
+"%%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir "
+"000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"ან ეული არქივის გამწმენდად გამოყენება:\n"
+"მაგ:\n"
+" pg_archivecleanup /mnt/server/archiverdir "
+"000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდომების შესახებ მიწერეთ: %s\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "არქივის მდებარეობის მითითება აუცილებელია"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "დატოვებული უძველესი WAL ფაილის მითითება აუცილებელია"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი"
diff --git a/src/bin/pg_archivecleanup/po/ko.po b/src/bin/pg_archivecleanup/po/ko.po
new file mode 100644
index 0000000..6673d47
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/ko.po
@@ -0,0 +1,197 @@
+# LANGUAGE message translation file for pg_archivecleanup
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:50+0000\n"
+"PO-Revision-Date: 2023-04-05 18:06+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "상세정보: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "\"%s\" 이름의 아카이브 위치가 없음"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "\"%s\" 파일을 삭제할 수 없음: %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "\"%s\" 아카이브 위치를 읽을 수 없음: %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "\"%s\" 아카이브 위치를 닫을 수 없음: %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "\"%s\" 아카이브 위치를 열 수 없음: %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "잘못된 파일 이름 매개변수"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "자세한 사항은 \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s 명령은 PostgreSQL 아카이브 보관소에서 오래된\n"
+"WAL 파일을 지웁니다.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [옵션]... 아카이브위치 보관할제일오래된파일\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"옵션들:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d 보다 자세한 작업 내용 출력\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid ""
+" -n dry run, show the names of the files that would be removed\n"
+msgstr " -n 지울 대상만 확인하고 지우지는 않음\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT 해당 확장자 파일들을 작업 대상으로 함\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 도움말을 보여주고 마침\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION "
+"%%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"postgresql.conf 파일에서 archive_cleanup_command 설정 방법:\n"
+" archive_cleanup_command = 'pg_archivecleanup [옵션]... 아카이브위치 %%r'\n"
+"사용예:\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir "
+"000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"또는 명령행에서 독립적으로 사용하는 경우:\n"
+"사용예:\n"
+" pg_archivecleanup /mnt/server/archiverdir "
+"000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"문제점 보고 주소: <%s>\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "아카이브 위치는 지정해야 함"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "남길 가장 오래된 WAL 파일은 지정해야 함"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "너무 많은 명령행 인자를 지정했음"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "보다 자세한 정보는 \"%s --help\" 명령을 참조하세요.\n"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "심각: "
diff --git a/src/bin/pg_archivecleanup/po/pt_BR.po b/src/bin/pg_archivecleanup/po/pt_BR.po
new file mode 100644
index 0000000..d31c83e
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/pt_BR.po
@@ -0,0 +1,185 @@
+# Brazilian Portuguese message translation file for pg_archivecleanup
+
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+
+# Euler Taveira <euler@eulerto.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-27 13:15-0300\n"
+"PO-Revision-Date: 2022-09-27 19:00-0300\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erro: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "aviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalhe: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "dica: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "local da cópia de segurança \"%s\" não existe"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "não pôde remover arquivo \"%s\": %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "não pôde ler local da cópia de segurança \"%s\": %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "não pôde fechar local da cópia de segurança \"%s\": %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "não pôde abrir local da cópia de segurança \"%s\": %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "argumento de nome de arquivo é inválido"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Tente \"%s --help\" para obter informações adicionais."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s remove arquivos mais antigos do WAL da cópia de segurança do PostgreSQL.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [OPÇÃO]... LOCALARCHIVE ARQUIVOWALMAISANTIGO\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opções:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d gera saída de depuração (modo detalhe)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n execução simulada, mostra os nomes dos arquivos que seriam removidos\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT limpa arquivos se eles têm esta extensão\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Para usar com archive_cleanup_command no postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPÇÃO]... LOCALARCHIVE %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Ou para usar como um limpador autônomo da cópia de segurança:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Relate erros a <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "página web do %s: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "deve especificar local da cópia de segurança"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "deve especificar o arquvo do WAL mais antigo a ser mantido"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "muitos argumentos de linha de comando"
diff --git a/src/bin/pg_archivecleanup/po/ru.po b/src/bin/pg_archivecleanup/po/ru.po
new file mode 100644
index 0000000..c28de42
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/ru.po
@@ -0,0 +1,212 @@
+# Russian message translation file for pg_archivecleanup
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2017, 2019, 2020, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-27 14:52+0300\n"
+"PO-Revision-Date: 2022-09-05 13:34+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробности: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подсказка: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "расположение архива \"%s\" не существует"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "не удалось стереть файл \"%s\": %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "не удалось прочитать расположение архива \"%s\": %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "не удалось закрыть расположение архива \"%s\": %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "не удалось открыть расположение архива \"%s\": %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "неверный аргумент с именем файла"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Для дополнительной информации попробуйте \"%s --help\"."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s удаляет старые файлы WAL из архивов PostgreSQL.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "Использование:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr ""
+" %s [ПАРАМЕТР]... РАСПОЛОЖЕНИЕ_АРХИВА СТАРЕЙШИЙ_СОХРАНЯЕМЫЙ_ФАЙЛ_WAL\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметры:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d генерировать подробные сообщения (отладочный режим)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid ""
+" -n dry run, show the names of the files that would be removed\n"
+msgstr ""
+" -n холостой запуск, только показать имена файлов, которые "
+"будут удалены\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+# well-spelled: РСШ
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x РСШ убрать файлы с заданным расширением\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION "
+"%%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Для использования в качестве archive_cleanup_command в postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [ПАРАМЕТР]... "
+"РАСПОЛОЖЕНИЕ_АРХИВА %%r'\n"
+"например:\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir "
+"000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Либо для использования в качестве отдельного средства очистки архива,\n"
+"например:\n"
+" pg_archivecleanup /mnt/server/archiverdir "
+"000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках сообщайте по адресу <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "необходимо задать расположение архива"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "необходимо задать имя старейшего сохраняемого файла WAL"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "слишком много аргументов командной строки"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "%s: file \"%s\" would be removed\n"
+#~ msgstr "%s: файл \"%s\" не будет удалён\n"
+
+#~ msgid "%s: removing file \"%s\"\n"
+#~ msgstr "%s: удаление файла \"%s\"\n"
+
+#~ msgid "%s: keeping WAL file \"%s\" and later\n"
+#~ msgstr "%s: будет сохранён файл WAL \"%s\" и последующие\n"
diff --git a/src/bin/pg_archivecleanup/po/sv.po b/src/bin/pg_archivecleanup/po/sv.po
new file mode 100644
index 0000000..6cebbc1
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/sv.po
@@ -0,0 +1,184 @@
+# Swedish message translation file for pg_archivecleanup
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Dennis Björklund <db@zigo.dhs.org>, 2017, 2018, 2019, 2020, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-11 13:50+0000\n"
+"PO-Revision-Date: 2022-04-11 16:06+0200\n"
+"Last-Translator: FDennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:268
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:275
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:287
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "arkivplats \"%s\" finns inte"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "kunde inte ta bort fil \"%s\": %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "kunde inte läsa arkivplats \"%s\": %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "kunde inte stänga arkivplats \"%s\": %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "kunde inte öppna arkivplats \"%s\": %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "ogiltigt filnamnsargument"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s tar bort gamla WAL-filer från PostgreSQLs arkiv.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [FLAGGA]... ARKIVPLATS ÄLDSTASPARADEWALFIL\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Flaggor:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d generera debugutskrift (utförligt läge)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n gör inga ändringar visa namn på de filer som skulle ha tagits bort\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x SUF städa upp filer om de har detta suffix\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"För att använda som archive_cleanup_command i postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [FLAGGA]... ARKIVPLATS %%r'\n"
+"t.ex.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Eller för att använda som en separat arkivstädare:\n"
+"t.ex.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "måste ange en arkivplats"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "måste ange äldsta sparade WAL-filen"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "för många kommandoradsargument"
diff --git a/src/bin/pg_archivecleanup/po/tr.po b/src/bin/pg_archivecleanup/po/tr.po
new file mode 100644
index 0000000..fac3be6
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/tr.po
@@ -0,0 +1,185 @@
+# LANGUAGE message translation file for pg_archivecleanup
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2019-04-26 13:48+0000\n"
+"PO-Revision-Date: 2021-09-16 09:39+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: ../../../src/fe_utils/logging.c:182
+#, c-format
+msgid "fatal: "
+msgstr "ölümcül (fatal): "
+
+#: ../../../src/fe_utils/logging.c:189
+#, c-format
+msgid "error: "
+msgstr "hata: "
+
+#: ../../../src/fe_utils/logging.c:196
+#, c-format
+msgid "warning: "
+msgstr "uyarı: "
+
+#: pg_archivecleanup.c:68
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "\"%s\" arşiv lokasyonu mevcut değil"
+
+#: pg_archivecleanup.c:153
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "\"%s\" dosyası silinemedi: %m"
+
+#: pg_archivecleanup.c:161
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "\"%s\" arşiv lokasyonu okunamadı: %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "\"%s\" arşiv lokasyonu kapatılamadı: %m"
+
+#: pg_archivecleanup.c:168
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "\"%s\" arşiv lokasyonu açılamadı: %m"
+
+#: pg_archivecleanup.c:241
+#, c-format
+msgid "invalid file name argument"
+msgstr "geçersiz dosya adı argümanı"
+
+#: pg_archivecleanup.c:242 pg_archivecleanup.c:315 pg_archivecleanup.c:336
+#: pg_archivecleanup.c:348 pg_archivecleanup.c:355
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" yazın\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr "%s daha eski WAL dosyalarını PostgreSQL arşivlerinden kaldırır.\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [SECENEK]... ARSIVLOKASYONU TUTULANENESKIWALDOSYASI\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Seçenekler:\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d hata ayıklama çıktısı oluştur (ayrıntılı açıklamalı mod)\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n tatbikat modu, sadece kaldırılacak dosyaların adlarını göster\n"
+
+#: pg_archivecleanup.c:261
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#: pg_archivecleanup.c:262
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT bu uzantıya sahip dosyaları temizle\n"
+
+#: pg_archivecleanup.c:263
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#: pg_archivecleanup.c:264
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"postgresql.conf'da archive_cleanup_command olarak kullanmak için:\n"
+" archive_cleanup_command = 'pg_archivecleanup [SECENEK]... ARSIVLOKASYONU %%r'\n"
+"örnek:\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+"\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Veya bağımsız bir arşiv temizleyici olarak kullanmak için: \n"
+"örnek:\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:273
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+msgstr ""
+"\n"
+"Hataları <pgsql-bugs@lists.postgresql.org> adresine bildirebilirsiniz.\n"
+
+#: pg_archivecleanup.c:335
+#, c-format
+msgid "must specify archive location"
+msgstr "arşiv lokasyonu belirtilmeli"
+
+#: pg_archivecleanup.c:347
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "tutulan en eski WAL dosyası belirtilmeli"
+
+#: pg_archivecleanup.c:354
+#, c-format
+msgid "too many command-line arguments"
+msgstr "çok fazla komut-satırı argümanı"
+
+#~ msgid "%s: keeping WAL file \"%s\" and later\n"
+#~ msgstr "%s: \"%s\" ve sonrasındaki WAl dosyaları tutuluyor\n"
+
+#~ msgid "%s: ERROR: could not remove file \"%s\": %s\n"
+#~ msgstr "%s: HATA: \"%s\" dosyası kaldırılamadı: %s\n"
+
+#~ msgid "%s: removing file \"%s\"\n"
+#~ msgstr "%s: \"%s\" dosyası kaldırılıyor\n"
+
+#~ msgid "%s: file \"%s\" would be removed\n"
+#~ msgstr "%s: \"%s\" dosyası kaldırılacak\n"
diff --git a/src/bin/pg_archivecleanup/po/uk.po b/src/bin/pg_archivecleanup/po/uk.po
new file mode 100644
index 0000000..120f799
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/uk.po
@@ -0,0 +1,173 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:51+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_archivecleanup.pot\n"
+"X-Crowdin-File-ID: 898\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередження: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "архівного розташування \"%s\" не існує"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "не можливо видалити файл \"%s\": %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "не вдалося прочитати архівне розташування \"%s\":%m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "не вдалося закрити архівне розташування \"%s\":%m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "не вдалося відкрити архівне розташування \"%s\":%m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "недійсна назва файла з аргументом"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" для додаткової інформації."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid "%s removes older WAL files from PostgreSQL archives.\n\n"
+msgstr "%s видаляє старі WAL-файли з архівів PostgreSQL.\n\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "Використання:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [OPTION]... РОЗТАШУВАННЯ_АРХІВА НАЙДАВНІШИЙ_ЗБЕРЕЖЕНИЙ_WAL_ФАЙЛ\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid "\n"
+"Options:\n"
+msgstr "\n"
+"Параметри:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d генерує налагоджувальні повідомлення (детальний режим)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n сухий запуск, показує тільки ті файли, які будуть видалені\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показати версію, потім вийти\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT прибрати файли з цим розширенням\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid "\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr "\n"
+"Для використання як archive_cleanup_command у postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"напр.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid "\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr "\n"
+"Або для використання в якості окремого засобу для чистки архівів,\n"
+"наприклад:\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"Повідомляти про помилки на <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "необхідно вказати розташування архіва"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "необхідно вказати найдавніший збережений WAL-файл"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "занадто багато аргументів командного рядка"
+
diff --git a/src/bin/pg_archivecleanup/po/zh_CN.po b/src/bin/pg_archivecleanup/po/zh_CN.po
new file mode 100644
index 0000000..e8c3348
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/zh_CN.po
@@ -0,0 +1,179 @@
+# LANGUAGE message translation file for pg_archivecleanup
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# FIRST AUTHOR <zhangjie2@fujitsu.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:48+0000\n"
+"PO-Revision-Date: 2021-08-14 19:40+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的: "
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "存档位置\"%s\"不存在"
+
+#: pg_archivecleanup.c:152
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "无法删除文件 \"%s\": %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "无法读取存档位置\"%s\": %m"
+
+#: pg_archivecleanup.c:163
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "无法关闭存档位置 \"%s\": %m"
+
+#: pg_archivecleanup.c:167
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "无法打开存档位置\"%s\": %m"
+
+#: pg_archivecleanup.c:240
+#, c-format
+msgid "invalid file name argument"
+msgstr "文件名参数无效"
+
+#: pg_archivecleanup.c:241 pg_archivecleanup.c:315 pg_archivecleanup.c:336
+#: pg_archivecleanup.c:348 pg_archivecleanup.c:355
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获取更多的信息.\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s 从PostgreSQL存档中删除旧的WAL文件.\n"
+"\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [OPTION]... 归档文件位置 最早保存的WAL文件\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"选项:\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d 生成调试输出(详细模式)\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n dry运行,显示要删除的文件的名称\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信息,然后退出\n"
+
+#: pg_archivecleanup.c:261
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT 如果文件具有此扩展名,则清除文件\n"
+
+#: pg_archivecleanup.c:262
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示帮助信息,然后退出\n"
+
+#: pg_archivecleanup.c:263
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"在postgresql.conf中,archive_cleanup_command的用法 \n"
+" archive_cleanup_command = 'pg_archivecleanup [选项]... 存档位置 %%r'\n"
+"例.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:268
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"或者,用作独立存档清理程序:\n"
+"例.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:272
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: pg_archivecleanup.c:273
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: pg_archivecleanup.c:335
+#, c-format
+msgid "must specify archive location"
+msgstr "必须指定存档位置"
+
+#: pg_archivecleanup.c:347
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "必须指定最早保存的WAL文件"
+
+#: pg_archivecleanup.c:354
+#, c-format
+msgid "too many command-line arguments"
+msgstr "命令行参数太多"
+
diff --git a/src/bin/pg_archivecleanup/t/010_pg_archivecleanup.pl b/src/bin/pg_archivecleanup/t/010_pg_archivecleanup.pl
new file mode 100644
index 0000000..4894a2e
--- /dev/null
+++ b/src/bin/pg_archivecleanup/t/010_pg_archivecleanup.pl
@@ -0,0 +1,105 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_archivecleanup');
+program_version_ok('pg_archivecleanup');
+program_options_handling_ok('pg_archivecleanup');
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+my @walfiles = (
+ '00000001000000370000000C.gz', '00000001000000370000000D',
+ '00000001000000370000000E', '00000001000000370000000F.partial',);
+
+sub create_files
+{
+ foreach my $fn (@walfiles, 'unrelated_file')
+ {
+ open my $file, '>', "$tempdir/$fn";
+ print $file 'CONTENT';
+ close $file;
+ }
+ return;
+}
+
+create_files();
+
+command_fails_like(
+ ['pg_archivecleanup'],
+ qr/must specify archive location/,
+ 'fails if archive location is not specified');
+
+command_fails_like(
+ [ 'pg_archivecleanup', $tempdir ],
+ qr/must specify oldest kept WAL file/,
+ 'fails if oldest kept WAL file name is not specified');
+
+command_fails_like(
+ [ 'pg_archivecleanup', 'notexist', 'foo' ],
+ qr/archive location .* does not exist/,
+ 'fails if archive location does not exist');
+
+command_fails_like(
+ [ 'pg_archivecleanup', $tempdir, 'foo', 'bar' ],
+ qr/too many command-line arguments/,
+ 'fails with too many command-line arguments');
+
+command_fails_like(
+ [ 'pg_archivecleanup', $tempdir, 'foo' ],
+ qr/invalid file name argument/,
+ 'fails with invalid restart file name');
+
+{
+ # like command_like but checking stderr
+ my $stderr;
+ my $result = IPC::Run::run [ 'pg_archivecleanup', '-d', '-n', $tempdir,
+ $walfiles[2] ], '2>', \$stderr;
+ ok($result, "pg_archivecleanup dry run: exit code 0");
+ like(
+ $stderr,
+ qr/$walfiles[1].*would be removed/,
+ "pg_archivecleanup dry run: matches");
+ foreach my $fn (@walfiles)
+ {
+ ok(-f "$tempdir/$fn", "$fn not removed");
+ }
+}
+
+sub run_check
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($suffix, $test_name) = @_;
+
+ create_files();
+
+ command_ok(
+ [
+ 'pg_archivecleanup', '-x', '.gz', $tempdir,
+ $walfiles[2] . $suffix
+ ],
+ "$test_name: runs");
+
+ ok(!-f "$tempdir/$walfiles[0]",
+ "$test_name: first older WAL file was cleaned up");
+ ok(!-f "$tempdir/$walfiles[1]",
+ "$test_name: second older WAL file was cleaned up");
+ ok(-f "$tempdir/$walfiles[2]",
+ "$test_name: restartfile was not cleaned up");
+ ok(-f "$tempdir/$walfiles[3]",
+ "$test_name: newer WAL file was not cleaned up");
+ ok(-f "$tempdir/unrelated_file",
+ "$test_name: unrelated file was not cleaned up");
+ return;
+}
+
+run_check('', 'pg_archivecleanup');
+run_check('.partial', 'pg_archivecleanup with .partial file');
+run_check('.00000020.backup', 'pg_archivecleanup with .backup file');
+
+done_testing();
diff --git a/src/bin/pg_basebackup/.gitignore b/src/bin/pg_basebackup/.gitignore
new file mode 100644
index 0000000..26048bd
--- /dev/null
+++ b/src/bin/pg_basebackup/.gitignore
@@ -0,0 +1,5 @@
+/pg_basebackup
+/pg_receivewal
+/pg_recvlogical
+
+/tmp_check/
diff --git a/src/bin/pg_basebackup/Makefile b/src/bin/pg_basebackup/Makefile
new file mode 100644
index 0000000..0035ebc
--- /dev/null
+++ b/src/bin/pg_basebackup/Makefile
@@ -0,0 +1,84 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_basebackup
+#
+# Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/bin/pg_basebackup/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_basebackup/pg_receivewal/pg_recvlogical - streaming WAL and backup receivers"
+PGAPPICON=win32
+
+EXTRA_INSTALL=contrib/test_decoding
+
+subdir = src/bin/pg_basebackup
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+# make these available to TAP test scripts
+export LZ4
+export TAR
+# Note that GZIP cannot be used directly as this environment variable is
+# used by the command "gzip" to pass down options, so stick with a different
+# name.
+export GZIP_PROGRAM=$(GZIP)
+
+override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+OBJS = \
+ $(WIN32RES) \
+ receivelog.o \
+ streamutil.o \
+ walmethods.o
+
+# If you add or remove files here, also update Mkvcbuild.pm, which only knows
+# about OBJS, not BBOBJS, and thus has to be manually updated to stay in sync
+# with this list.
+BBOBJS = \
+ pg_basebackup.o \
+ bbstreamer_file.o \
+ bbstreamer_gzip.o \
+ bbstreamer_inject.o \
+ bbstreamer_lz4.o \
+ bbstreamer_zstd.o \
+ bbstreamer_tar.o
+
+all: pg_basebackup pg_receivewal pg_recvlogical
+
+pg_basebackup: $(BBOBJS) $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) $(BBOBJS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+pg_receivewal: pg_receivewal.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) pg_receivewal.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+pg_recvlogical: pg_recvlogical.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) pg_recvlogical.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_basebackup$(X) '$(DESTDIR)$(bindir)/pg_basebackup$(X)'
+ $(INSTALL_PROGRAM) pg_receivewal$(X) '$(DESTDIR)$(bindir)/pg_receivewal$(X)'
+ $(INSTALL_PROGRAM) pg_recvlogical$(X) '$(DESTDIR)$(bindir)/pg_recvlogical$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_basebackup$(X)'
+ rm -f '$(DESTDIR)$(bindir)/pg_receivewal$(X)'
+ rm -f '$(DESTDIR)$(bindir)/pg_recvlogical$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_basebackup$(X) pg_receivewal$(X) pg_recvlogical$(X) \
+ $(BBOBJS) pg_receivewal.o pg_recvlogical.o \
+ $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_basebackup/bbstreamer.h b/src/bin/pg_basebackup/bbstreamer.h
new file mode 100644
index 0000000..29b48ef
--- /dev/null
+++ b/src/bin/pg_basebackup/bbstreamer.h
@@ -0,0 +1,226 @@
+/*-------------------------------------------------------------------------
+ *
+ * bbstreamer.h
+ *
+ * Each tar archive returned by the server is passed to one or more
+ * bbstreamer objects for further processing. The bbstreamer may do
+ * something simple, like write the archive to a file, perhaps after
+ * compressing it, but it can also do more complicated things, like
+ * annotating the byte stream to indicate which parts of the data
+ * correspond to tar headers or trailing padding, vs. which parts are
+ * payload data. A subsequent bbstreamer may use this information to
+ * make further decisions about how to process the data; for example,
+ * it might choose to modify the archive contents.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/bbstreamer.h
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef BBSTREAMER_H
+#define BBSTREAMER_H
+
+#include "common/compression.h"
+#include "lib/stringinfo.h"
+#include "pqexpbuffer.h"
+
+struct bbstreamer;
+struct bbstreamer_ops;
+typedef struct bbstreamer bbstreamer;
+typedef struct bbstreamer_ops bbstreamer_ops;
+
+/*
+ * Each chunk of archive data passed to a bbstreamer is classified into one
+ * of these categories. When data is first received from the remote server,
+ * each chunk will be categorized as BBSTREAMER_UNKNOWN, and the chunks will
+ * be of whatever size the remote server chose to send.
+ *
+ * If the archive is parsed (e.g. see bbstreamer_tar_parser_new()), then all
+ * chunks should be labelled as one of the other types listed here. In
+ * addition, there should be exactly one BBSTREAMER_MEMBER_HEADER chunk and
+ * exactly one BBSTREAMER_MEMBER_TRAILER chunk per archive member, even if
+ * that means a zero-length call. There can be any number of
+ * BBSTREAMER_MEMBER_CONTENTS chunks in between those calls. There
+ * should exactly BBSTREAMER_ARCHIVE_TRAILER chunk, and it should follow the
+ * last BBSTREAMER_MEMBER_TRAILER chunk.
+ *
+ * In theory, we could need other classifications here, such as a way of
+ * indicating an archive header, but the "tar" format doesn't need anything
+ * else, so for the time being there's no point.
+ */
+typedef enum
+{
+ BBSTREAMER_UNKNOWN,
+ BBSTREAMER_MEMBER_HEADER,
+ BBSTREAMER_MEMBER_CONTENTS,
+ BBSTREAMER_MEMBER_TRAILER,
+ BBSTREAMER_ARCHIVE_TRAILER
+} bbstreamer_archive_context;
+
+/*
+ * Each chunk of data that is classified as BBSTREAMER_MEMBER_HEADER,
+ * BBSTREAMER_MEMBER_CONTENTS, or BBSTREAMER_MEMBER_TRAILER should also
+ * pass a pointer to an instance of this struct. The details are expected
+ * to be present in the archive header and used to fill the struct, after
+ * which all subsequent calls for the same archive member are expected to
+ * pass the same details.
+ */
+typedef struct
+{
+ char pathname[MAXPGPATH];
+ pgoff_t size;
+ mode_t mode;
+ uid_t uid;
+ gid_t gid;
+ bool is_directory;
+ bool is_link;
+ char linktarget[MAXPGPATH];
+} bbstreamer_member;
+
+/*
+ * Generally, each type of bbstreamer will define its own struct, but the
+ * first element should be 'bbstreamer base'. A bbstreamer that does not
+ * require any additional private data could use this structure directly.
+ *
+ * bbs_ops is a pointer to the bbstreamer_ops object which contains the
+ * function pointers appropriate to this type of bbstreamer.
+ *
+ * bbs_next is a pointer to the successor bbstreamer, for those types of
+ * bbstreamer which forward data to a successor. It need not be used and
+ * should be set to NULL when not relevant.
+ *
+ * bbs_buffer is a buffer for accumulating data for temporary storage. Each
+ * type of bbstreamer makes its own decisions about whether and how to use
+ * this buffer.
+ */
+struct bbstreamer
+{
+ const bbstreamer_ops *bbs_ops;
+ bbstreamer *bbs_next;
+ StringInfoData bbs_buffer;
+};
+
+/*
+ * There are three callbacks for a bbstreamer. The 'content' callback is
+ * called repeatedly, as described in the bbstreamer_archive_context comments.
+ * Then, the 'finalize' callback is called once at the end, to give the
+ * bbstreamer a chance to perform cleanup such as closing files. Finally,
+ * because this code is running in a frontend environment where, as of this
+ * writing, there are no memory contexts, the 'free' callback is called to
+ * release memory. These callbacks should always be invoked using the static
+ * inline functions defined below.
+ */
+struct bbstreamer_ops
+{
+ void (*content) (bbstreamer *streamer, bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+ void (*finalize) (bbstreamer *streamer);
+ void (*free) (bbstreamer *streamer);
+};
+
+/* Send some content to a bbstreamer. */
+static inline void
+bbstreamer_content(bbstreamer *streamer, bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ Assert(streamer != NULL);
+ streamer->bbs_ops->content(streamer, member, data, len, context);
+}
+
+/* Finalize a bbstreamer. */
+static inline void
+bbstreamer_finalize(bbstreamer *streamer)
+{
+ Assert(streamer != NULL);
+ streamer->bbs_ops->finalize(streamer);
+}
+
+/* Free a bbstreamer. */
+static inline void
+bbstreamer_free(bbstreamer *streamer)
+{
+ Assert(streamer != NULL);
+ streamer->bbs_ops->free(streamer);
+}
+
+/*
+ * This is a convenience method for use when implementing a bbstreamer; it is
+ * not for use by outside callers. It adds the amount of data specified by
+ * 'nbytes' to the bbstreamer's buffer and adjusts '*len' and '*data'
+ * accordingly.
+ */
+static inline void
+bbstreamer_buffer_bytes(bbstreamer *streamer, const char **data, int *len,
+ int nbytes)
+{
+ Assert(nbytes <= *len);
+
+ appendBinaryStringInfo(&streamer->bbs_buffer, *data, nbytes);
+ *len -= nbytes;
+ *data += nbytes;
+}
+
+/*
+ * This is a convenence method for use when implementing a bbstreamer; it is
+ * not for use by outsider callers. It attempts to add enough data to the
+ * bbstreamer's buffer to reach a length of target_bytes and adjusts '*len'
+ * and '*data' accordingly. It returns true if the target length has been
+ * reached and false otherwise.
+ */
+static inline bool
+bbstreamer_buffer_until(bbstreamer *streamer, const char **data, int *len,
+ int target_bytes)
+{
+ int buflen = streamer->bbs_buffer.len;
+
+ if (buflen >= target_bytes)
+ {
+ /* Target length already reached; nothing to do. */
+ return true;
+ }
+
+ if (buflen + *len < target_bytes)
+ {
+ /* Not enough data to reach target length; buffer all of it. */
+ bbstreamer_buffer_bytes(streamer, data, len, *len);
+ return false;
+ }
+
+ /* Buffer just enough to reach the target length. */
+ bbstreamer_buffer_bytes(streamer, data, len, target_bytes - buflen);
+ return true;
+}
+
+/*
+ * Functions for creating bbstreamer objects of various types. See the header
+ * comments for each of these functions for details.
+ */
+extern bbstreamer *bbstreamer_plain_writer_new(char *pathname, FILE *file);
+extern bbstreamer *bbstreamer_gzip_writer_new(char *pathname, FILE *file,
+ pg_compress_specification *compress);
+extern bbstreamer *bbstreamer_extractor_new(const char *basepath,
+ const char *(*link_map) (const char *),
+ void (*report_output_file) (const char *));
+
+extern bbstreamer *bbstreamer_gzip_decompressor_new(bbstreamer *next);
+extern bbstreamer *bbstreamer_lz4_compressor_new(bbstreamer *next,
+ pg_compress_specification *compress);
+extern bbstreamer *bbstreamer_lz4_decompressor_new(bbstreamer *next);
+extern bbstreamer *bbstreamer_zstd_compressor_new(bbstreamer *next,
+ pg_compress_specification *compress);
+extern bbstreamer *bbstreamer_zstd_decompressor_new(bbstreamer *next);
+extern bbstreamer *bbstreamer_tar_parser_new(bbstreamer *next);
+extern bbstreamer *bbstreamer_tar_terminator_new(bbstreamer *next);
+extern bbstreamer *bbstreamer_tar_archiver_new(bbstreamer *next);
+
+extern bbstreamer *bbstreamer_recovery_injector_new(bbstreamer *next,
+ bool is_recovery_guc_supported,
+ PQExpBuffer recoveryconfcontents);
+extern void bbstreamer_inject_file(bbstreamer *streamer, char *pathname,
+ char *data, int len);
+
+#endif
diff --git a/src/bin/pg_basebackup/bbstreamer_file.c b/src/bin/pg_basebackup/bbstreamer_file.c
new file mode 100644
index 0000000..1a94fb2
--- /dev/null
+++ b/src/bin/pg_basebackup/bbstreamer_file.c
@@ -0,0 +1,374 @@
+/*-------------------------------------------------------------------------
+ *
+ * bbstreamer_file.c
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/bbstreamer_file.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <unistd.h>
+
+#include "bbstreamer.h"
+#include "common/logging.h"
+#include "common/file_perm.h"
+#include "common/string.h"
+
+typedef struct bbstreamer_plain_writer
+{
+ bbstreamer base;
+ char *pathname;
+ FILE *file;
+ bool should_close_file;
+} bbstreamer_plain_writer;
+
+typedef struct bbstreamer_extractor
+{
+ bbstreamer base;
+ char *basepath;
+ const char *(*link_map) (const char *);
+ void (*report_output_file) (const char *);
+ char filename[MAXPGPATH];
+ FILE *file;
+} bbstreamer_extractor;
+
+static void bbstreamer_plain_writer_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_plain_writer_finalize(bbstreamer *streamer);
+static void bbstreamer_plain_writer_free(bbstreamer *streamer);
+
+const bbstreamer_ops bbstreamer_plain_writer_ops = {
+ .content = bbstreamer_plain_writer_content,
+ .finalize = bbstreamer_plain_writer_finalize,
+ .free = bbstreamer_plain_writer_free
+};
+
+static void bbstreamer_extractor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_extractor_finalize(bbstreamer *streamer);
+static void bbstreamer_extractor_free(bbstreamer *streamer);
+static void extract_directory(const char *filename, mode_t mode);
+static void extract_link(const char *filename, const char *linktarget);
+static FILE *create_file_for_extract(const char *filename, mode_t mode);
+
+const bbstreamer_ops bbstreamer_extractor_ops = {
+ .content = bbstreamer_extractor_content,
+ .finalize = bbstreamer_extractor_finalize,
+ .free = bbstreamer_extractor_free
+};
+
+/*
+ * Create a bbstreamer that just writes data to a file.
+ *
+ * The caller must specify a pathname and may specify a file. The pathname is
+ * used for error-reporting purposes either way. If file is NULL, the pathname
+ * also identifies the file to which the data should be written: it is opened
+ * for writing and closed when done. If file is not NULL, the data is written
+ * there.
+ */
+bbstreamer *
+bbstreamer_plain_writer_new(char *pathname, FILE *file)
+{
+ bbstreamer_plain_writer *streamer;
+
+ streamer = palloc0(sizeof(bbstreamer_plain_writer));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_plain_writer_ops;
+
+ streamer->pathname = pstrdup(pathname);
+ streamer->file = file;
+
+ if (file == NULL)
+ {
+ streamer->file = fopen(pathname, "wb");
+ if (streamer->file == NULL)
+ pg_fatal("could not create file \"%s\": %m", pathname);
+ streamer->should_close_file = true;
+ }
+
+ return &streamer->base;
+}
+
+/*
+ * Write archive content to file.
+ */
+static void
+bbstreamer_plain_writer_content(bbstreamer *streamer,
+ bbstreamer_member *member, const char *data,
+ int len, bbstreamer_archive_context context)
+{
+ bbstreamer_plain_writer *mystreamer;
+
+ mystreamer = (bbstreamer_plain_writer *) streamer;
+
+ if (len == 0)
+ return;
+
+ errno = 0;
+ if (fwrite(data, len, 1, mystreamer->file) != 1)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to file \"%s\": %m",
+ mystreamer->pathname);
+ }
+}
+
+/*
+ * End-of-archive processing when writing to a plain file consists of closing
+ * the file if we opened it, but not if the caller provided it.
+ */
+static void
+bbstreamer_plain_writer_finalize(bbstreamer *streamer)
+{
+ bbstreamer_plain_writer *mystreamer;
+
+ mystreamer = (bbstreamer_plain_writer *) streamer;
+
+ if (mystreamer->should_close_file && fclose(mystreamer->file) != 0)
+ pg_fatal("could not close file \"%s\": %m",
+ mystreamer->pathname);
+
+ mystreamer->file = NULL;
+ mystreamer->should_close_file = false;
+}
+
+/*
+ * Free memory associated with this bbstreamer.
+ */
+static void
+bbstreamer_plain_writer_free(bbstreamer *streamer)
+{
+ bbstreamer_plain_writer *mystreamer;
+
+ mystreamer = (bbstreamer_plain_writer *) streamer;
+
+ Assert(!mystreamer->should_close_file);
+ Assert(mystreamer->base.bbs_next == NULL);
+
+ pfree(mystreamer->pathname);
+ pfree(mystreamer);
+}
+
+/*
+ * Create a bbstreamer that extracts an archive.
+ *
+ * All pathnames in the archive are interpreted relative to basepath.
+ *
+ * Unlike e.g. bbstreamer_plain_writer_new() we can't do anything useful here
+ * with untyped chunks; we need typed chunks which follow the rules described
+ * in bbstreamer.h. Assuming we have that, we don't need to worry about the
+ * original archive format; it's enough to just look at the member information
+ * provided and write to the corresponding file.
+ *
+ * 'link_map' is a function that will be applied to the target of any
+ * symbolic link, and which should return a replacement pathname to be used
+ * in its place. If NULL, the symbolic link target is used without
+ * modification.
+ *
+ * 'report_output_file' is a function that will be called each time we open a
+ * new output file. The pathname to that file is passed as an argument. If
+ * NULL, the call is skipped.
+ */
+bbstreamer *
+bbstreamer_extractor_new(const char *basepath,
+ const char *(*link_map) (const char *),
+ void (*report_output_file) (const char *))
+{
+ bbstreamer_extractor *streamer;
+
+ streamer = palloc0(sizeof(bbstreamer_extractor));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_extractor_ops;
+ streamer->basepath = pstrdup(basepath);
+ streamer->link_map = link_map;
+ streamer->report_output_file = report_output_file;
+
+ return &streamer->base;
+}
+
+/*
+ * Extract archive contents to the filesystem.
+ */
+static void
+bbstreamer_extractor_content(bbstreamer *streamer, bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_extractor *mystreamer = (bbstreamer_extractor *) streamer;
+ int fnamelen;
+
+ Assert(member != NULL || context == BBSTREAMER_ARCHIVE_TRAILER);
+ Assert(context != BBSTREAMER_UNKNOWN);
+
+ switch (context)
+ {
+ case BBSTREAMER_MEMBER_HEADER:
+ Assert(mystreamer->file == NULL);
+
+ /* Prepend basepath. */
+ snprintf(mystreamer->filename, sizeof(mystreamer->filename),
+ "%s/%s", mystreamer->basepath, member->pathname);
+
+ /* Remove any trailing slash. */
+ fnamelen = strlen(mystreamer->filename);
+ if (mystreamer->filename[fnamelen - 1] == '/')
+ mystreamer->filename[fnamelen - 1] = '\0';
+
+ /* Dispatch based on file type. */
+ if (member->is_directory)
+ extract_directory(mystreamer->filename, member->mode);
+ else if (member->is_link)
+ {
+ const char *linktarget = member->linktarget;
+
+ if (mystreamer->link_map)
+ linktarget = mystreamer->link_map(linktarget);
+ extract_link(mystreamer->filename, linktarget);
+ }
+ else
+ mystreamer->file =
+ create_file_for_extract(mystreamer->filename,
+ member->mode);
+
+ /* Report output file change. */
+ if (mystreamer->report_output_file)
+ mystreamer->report_output_file(mystreamer->filename);
+ break;
+
+ case BBSTREAMER_MEMBER_CONTENTS:
+ if (mystreamer->file == NULL)
+ break;
+
+ errno = 0;
+ if (len > 0 && fwrite(data, len, 1, mystreamer->file) != 1)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to file \"%s\": %m",
+ mystreamer->filename);
+ }
+ break;
+
+ case BBSTREAMER_MEMBER_TRAILER:
+ if (mystreamer->file == NULL)
+ break;
+ fclose(mystreamer->file);
+ mystreamer->file = NULL;
+ break;
+
+ case BBSTREAMER_ARCHIVE_TRAILER:
+ break;
+
+ default:
+ /* Shouldn't happen. */
+ pg_fatal("unexpected state while extracting archive");
+ }
+}
+
+/*
+ * Create a directory.
+ */
+static void
+extract_directory(const char *filename, mode_t mode)
+{
+ if (mkdir(filename, pg_dir_create_mode) != 0)
+ {
+ /*
+ * When streaming WAL, pg_wal (or pg_xlog for pre-9.6 clusters) will
+ * have been created by the wal receiver process. Also, when the WAL
+ * directory location was specified, pg_wal (or pg_xlog) has already
+ * been created as a symbolic link before starting the actual backup.
+ * So just ignore creation failures on related directories.
+ */
+ if (!((pg_str_endswith(filename, "/pg_wal") ||
+ pg_str_endswith(filename, "/pg_xlog") ||
+ pg_str_endswith(filename, "/archive_status")) &&
+ errno == EEXIST))
+ pg_fatal("could not create directory \"%s\": %m",
+ filename);
+ }
+
+#ifndef WIN32
+ if (chmod(filename, mode))
+ pg_fatal("could not set permissions on directory \"%s\": %m",
+ filename);
+#endif
+}
+
+/*
+ * Create a symbolic link.
+ *
+ * It's most likely a link in pg_tblspc directory, to the location of a
+ * tablespace. Apply any tablespace mapping given on the command line
+ * (--tablespace-mapping). (We blindly apply the mapping without checking that
+ * the link really is inside pg_tblspc. We don't expect there to be other
+ * symlinks in a data directory, but if there are, you can call it an
+ * undocumented feature that you can map them too.)
+ */
+static void
+extract_link(const char *filename, const char *linktarget)
+{
+ if (symlink(linktarget, filename) != 0)
+ pg_fatal("could not create symbolic link from \"%s\" to \"%s\": %m",
+ filename, linktarget);
+}
+
+/*
+ * Create a regular file.
+ *
+ * Return the resulting handle so we can write the content to the file.
+ */
+static FILE *
+create_file_for_extract(const char *filename, mode_t mode)
+{
+ FILE *file;
+
+ file = fopen(filename, "wb");
+ if (file == NULL)
+ pg_fatal("could not create file \"%s\": %m", filename);
+
+#ifndef WIN32
+ if (chmod(filename, mode))
+ pg_fatal("could not set permissions on file \"%s\": %m",
+ filename);
+#endif
+
+ return file;
+}
+
+/*
+ * End-of-stream processing for extracting an archive.
+ *
+ * There's nothing to do here but sanity checking.
+ */
+static void
+bbstreamer_extractor_finalize(bbstreamer *streamer)
+{
+ bbstreamer_extractor *mystreamer PG_USED_FOR_ASSERTS_ONLY
+ = (bbstreamer_extractor *) streamer;
+
+ Assert(mystreamer->file == NULL);
+}
+
+/*
+ * Free memory.
+ */
+static void
+bbstreamer_extractor_free(bbstreamer *streamer)
+{
+ bbstreamer_extractor *mystreamer = (bbstreamer_extractor *) streamer;
+
+ pfree(mystreamer->basepath);
+ pfree(mystreamer);
+}
diff --git a/src/bin/pg_basebackup/bbstreamer_gzip.c b/src/bin/pg_basebackup/bbstreamer_gzip.c
new file mode 100644
index 0000000..c3455ff
--- /dev/null
+++ b/src/bin/pg_basebackup/bbstreamer_gzip.c
@@ -0,0 +1,364 @@
+/*-------------------------------------------------------------------------
+ *
+ * bbstreamer_gzip.c
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/bbstreamer_gzip.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <unistd.h>
+
+#ifdef HAVE_LIBZ
+#include <zlib.h>
+#endif
+
+#include "bbstreamer.h"
+#include "common/logging.h"
+#include "common/file_perm.h"
+#include "common/string.h"
+
+#ifdef HAVE_LIBZ
+typedef struct bbstreamer_gzip_writer
+{
+ bbstreamer base;
+ char *pathname;
+ gzFile gzfile;
+} bbstreamer_gzip_writer;
+
+typedef struct bbstreamer_gzip_decompressor
+{
+ bbstreamer base;
+ z_stream zstream;
+ size_t bytes_written;
+} bbstreamer_gzip_decompressor;
+
+static void bbstreamer_gzip_writer_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_gzip_writer_finalize(bbstreamer *streamer);
+static void bbstreamer_gzip_writer_free(bbstreamer *streamer);
+static const char *get_gz_error(gzFile gzf);
+
+const bbstreamer_ops bbstreamer_gzip_writer_ops = {
+ .content = bbstreamer_gzip_writer_content,
+ .finalize = bbstreamer_gzip_writer_finalize,
+ .free = bbstreamer_gzip_writer_free
+};
+
+static void bbstreamer_gzip_decompressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_gzip_decompressor_finalize(bbstreamer *streamer);
+static void bbstreamer_gzip_decompressor_free(bbstreamer *streamer);
+static void *gzip_palloc(void *opaque, unsigned items, unsigned size);
+static void gzip_pfree(void *opaque, void *address);
+
+const bbstreamer_ops bbstreamer_gzip_decompressor_ops = {
+ .content = bbstreamer_gzip_decompressor_content,
+ .finalize = bbstreamer_gzip_decompressor_finalize,
+ .free = bbstreamer_gzip_decompressor_free
+};
+#endif
+
+/*
+ * Create a bbstreamer that just compresses data using gzip, and then writes
+ * it to a file.
+ *
+ * As in the case of bbstreamer_plain_writer_new, pathname is always used
+ * for error reporting purposes; if file is NULL, it is also the opened and
+ * closed so that the data may be written there.
+ */
+bbstreamer *
+bbstreamer_gzip_writer_new(char *pathname, FILE *file,
+ pg_compress_specification *compress)
+{
+#ifdef HAVE_LIBZ
+ bbstreamer_gzip_writer *streamer;
+
+ streamer = palloc0(sizeof(bbstreamer_gzip_writer));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_gzip_writer_ops;
+
+ streamer->pathname = pstrdup(pathname);
+
+ if (file == NULL)
+ {
+ streamer->gzfile = gzopen(pathname, "wb");
+ if (streamer->gzfile == NULL)
+ pg_fatal("could not create compressed file \"%s\": %m",
+ pathname);
+ }
+ else
+ {
+ int fd = dup(fileno(file));
+
+ if (fd < 0)
+ pg_fatal("could not duplicate stdout: %m");
+
+ streamer->gzfile = gzdopen(fd, "wb");
+ if (streamer->gzfile == NULL)
+ pg_fatal("could not open output file: %m");
+ }
+
+ if (gzsetparams(streamer->gzfile, compress->level, Z_DEFAULT_STRATEGY) != Z_OK)
+ pg_fatal("could not set compression level %d: %s",
+ compress->level, get_gz_error(streamer->gzfile));
+
+ return &streamer->base;
+#else
+ pg_fatal("this build does not support gzip compression");
+ return NULL; /* keep compiler quiet */
+#endif
+}
+
+#ifdef HAVE_LIBZ
+/*
+ * Write archive content to gzip file.
+ */
+static void
+bbstreamer_gzip_writer_content(bbstreamer *streamer,
+ bbstreamer_member *member, const char *data,
+ int len, bbstreamer_archive_context context)
+{
+ bbstreamer_gzip_writer *mystreamer;
+
+ mystreamer = (bbstreamer_gzip_writer *) streamer;
+
+ if (len == 0)
+ return;
+
+ errno = 0;
+ if (gzwrite(mystreamer->gzfile, data, len) != len)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to compressed file \"%s\": %s",
+ mystreamer->pathname, get_gz_error(mystreamer->gzfile));
+ }
+}
+
+/*
+ * End-of-archive processing when writing to a gzip file consists of just
+ * calling gzclose.
+ *
+ * It makes no difference whether we opened the file or the caller did it,
+ * because libz provides no way of avoiding a close on the underling file
+ * handle. Notice, however, that bbstreamer_gzip_writer_new() uses dup() to
+ * work around this issue, so that the behavior from the caller's viewpoint
+ * is the same as for bbstreamer_plain_writer.
+ */
+static void
+bbstreamer_gzip_writer_finalize(bbstreamer *streamer)
+{
+ bbstreamer_gzip_writer *mystreamer;
+
+ mystreamer = (bbstreamer_gzip_writer *) streamer;
+
+ errno = 0; /* in case gzclose() doesn't set it */
+ if (gzclose(mystreamer->gzfile) != 0)
+ pg_fatal("could not close compressed file \"%s\": %m",
+ mystreamer->pathname);
+
+ mystreamer->gzfile = NULL;
+}
+
+/*
+ * Free memory associated with this bbstreamer.
+ */
+static void
+bbstreamer_gzip_writer_free(bbstreamer *streamer)
+{
+ bbstreamer_gzip_writer *mystreamer;
+
+ mystreamer = (bbstreamer_gzip_writer *) streamer;
+
+ Assert(mystreamer->base.bbs_next == NULL);
+ Assert(mystreamer->gzfile == NULL);
+
+ pfree(mystreamer->pathname);
+ pfree(mystreamer);
+}
+
+/*
+ * Helper function for libz error reporting.
+ */
+static const char *
+get_gz_error(gzFile gzf)
+{
+ int errnum;
+ const char *errmsg;
+
+ errmsg = gzerror(gzf, &errnum);
+ if (errnum == Z_ERRNO)
+ return strerror(errno);
+ else
+ return errmsg;
+}
+#endif
+
+/*
+ * Create a new base backup streamer that performs decompression of gzip
+ * compressed blocks.
+ */
+bbstreamer *
+bbstreamer_gzip_decompressor_new(bbstreamer *next)
+{
+#ifdef HAVE_LIBZ
+ bbstreamer_gzip_decompressor *streamer;
+ z_stream *zs;
+
+ Assert(next != NULL);
+
+ streamer = palloc0(sizeof(bbstreamer_gzip_decompressor));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_gzip_decompressor_ops;
+
+ streamer->base.bbs_next = next;
+ initStringInfo(&streamer->base.bbs_buffer);
+
+ /* Initialize internal stream state for decompression */
+ zs = &streamer->zstream;
+ zs->zalloc = gzip_palloc;
+ zs->zfree = gzip_pfree;
+ zs->next_out = (uint8 *) streamer->base.bbs_buffer.data;
+ zs->avail_out = streamer->base.bbs_buffer.maxlen;
+
+ /*
+ * Data compression was initialized using deflateInit2 to request a gzip
+ * header. Similarly, we are using inflateInit2 to initialize data
+ * decompression.
+ *
+ * Per the documentation for inflateInit2, the second argument is
+ * "windowBits" and its value must be greater than or equal to the value
+ * provided while compressing the data, so we are using the maximum
+ * possible value for safety.
+ */
+ if (inflateInit2(zs, 15 + 16) != Z_OK)
+ pg_fatal("could not initialize compression library");
+
+ return &streamer->base;
+#else
+ pg_fatal("this build does not support gzip compression");
+ return NULL; /* keep compiler quiet */
+#endif
+}
+
+#ifdef HAVE_LIBZ
+/*
+ * Decompress the input data to output buffer until we run out of input
+ * data. Each time the output buffer is full, pass on the decompressed data
+ * to the next streamer.
+ */
+static void
+bbstreamer_gzip_decompressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_gzip_decompressor *mystreamer;
+ z_stream *zs;
+
+ mystreamer = (bbstreamer_gzip_decompressor *) streamer;
+
+ zs = &mystreamer->zstream;
+ zs->next_in = (uint8 *) data;
+ zs->avail_in = len;
+
+ /* Process the current chunk */
+ while (zs->avail_in > 0)
+ {
+ int res;
+
+ Assert(mystreamer->bytes_written < mystreamer->base.bbs_buffer.maxlen);
+
+ zs->next_out = (uint8 *)
+ mystreamer->base.bbs_buffer.data + mystreamer->bytes_written;
+ zs->avail_out =
+ mystreamer->base.bbs_buffer.maxlen - mystreamer->bytes_written;
+
+ /*
+ * This call decompresses data starting at zs->next_in and updates
+ * zs->next_in * and zs->avail_in. It generates output data starting
+ * at zs->next_out and updates zs->next_out and zs->avail_out
+ * accordingly.
+ */
+ res = inflate(zs, Z_NO_FLUSH);
+
+ if (res == Z_STREAM_ERROR)
+ pg_log_error("could not decompress data: %s", zs->msg);
+
+ mystreamer->bytes_written =
+ mystreamer->base.bbs_buffer.maxlen - zs->avail_out;
+
+ /* If output buffer is full then pass data to next streamer */
+ if (mystreamer->bytes_written >= mystreamer->base.bbs_buffer.maxlen)
+ {
+ bbstreamer_content(mystreamer->base.bbs_next, member,
+ mystreamer->base.bbs_buffer.data,
+ mystreamer->base.bbs_buffer.maxlen, context);
+ mystreamer->bytes_written = 0;
+ }
+ }
+}
+
+/*
+ * End-of-stream processing.
+ */
+static void
+bbstreamer_gzip_decompressor_finalize(bbstreamer *streamer)
+{
+ bbstreamer_gzip_decompressor *mystreamer;
+
+ mystreamer = (bbstreamer_gzip_decompressor *) streamer;
+
+ /*
+ * End of the stream, if there is some pending data in output buffers then
+ * we must forward it to next streamer.
+ */
+ bbstreamer_content(mystreamer->base.bbs_next, NULL,
+ mystreamer->base.bbs_buffer.data,
+ mystreamer->base.bbs_buffer.maxlen,
+ BBSTREAMER_UNKNOWN);
+
+ bbstreamer_finalize(mystreamer->base.bbs_next);
+}
+
+/*
+ * Free memory.
+ */
+static void
+bbstreamer_gzip_decompressor_free(bbstreamer *streamer)
+{
+ bbstreamer_free(streamer->bbs_next);
+ pfree(streamer->bbs_buffer.data);
+ pfree(streamer);
+}
+
+/*
+ * Wrapper function to adjust the signature of palloc to match what libz
+ * expects.
+ */
+static void *
+gzip_palloc(void *opaque, unsigned items, unsigned size)
+{
+ return palloc(items * size);
+}
+
+/*
+ * Wrapper function to adjust the signature of pfree to match what libz
+ * expects.
+ */
+static void
+gzip_pfree(void *opaque, void *address)
+{
+ pfree(address);
+}
+#endif
diff --git a/src/bin/pg_basebackup/bbstreamer_inject.c b/src/bin/pg_basebackup/bbstreamer_inject.c
new file mode 100644
index 0000000..cc804f1
--- /dev/null
+++ b/src/bin/pg_basebackup/bbstreamer_inject.c
@@ -0,0 +1,249 @@
+/*-------------------------------------------------------------------------
+ *
+ * bbstreamer_inject.c
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/bbstreamer_inject.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include "bbstreamer.h"
+#include "common/file_perm.h"
+#include "common/logging.h"
+
+typedef struct bbstreamer_recovery_injector
+{
+ bbstreamer base;
+ bool skip_file;
+ bool is_recovery_guc_supported;
+ bool is_postgresql_auto_conf;
+ bool found_postgresql_auto_conf;
+ PQExpBuffer recoveryconfcontents;
+ bbstreamer_member member;
+} bbstreamer_recovery_injector;
+
+static void bbstreamer_recovery_injector_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_recovery_injector_finalize(bbstreamer *streamer);
+static void bbstreamer_recovery_injector_free(bbstreamer *streamer);
+
+const bbstreamer_ops bbstreamer_recovery_injector_ops = {
+ .content = bbstreamer_recovery_injector_content,
+ .finalize = bbstreamer_recovery_injector_finalize,
+ .free = bbstreamer_recovery_injector_free
+};
+
+/*
+ * Create a bbstreamer that can edit recoverydata into an archive stream.
+ *
+ * The input should be a series of typed chunks (not BBSTREAMER_UNKNOWN) as
+ * per the conventions described in bbstreamer.h; the chunks forwarded to
+ * the next bbstreamer will be similarly typed, but the
+ * BBSTREAMER_MEMBER_HEADER chunks may be zero-length in cases where we've
+ * edited the archive stream.
+ *
+ * Our goal is to do one of the following three things with the content passed
+ * via recoveryconfcontents: (1) if is_recovery_guc_supported is false, then
+ * put the content into recovery.conf, replacing any existing archive member
+ * by that name; (2) if is_recovery_guc_supported is true and
+ * postgresql.auto.conf exists in the archive, then append the content
+ * provided to the existing file; and (3) if is_recovery_guc_supported is
+ * true but postgresql.auto.conf does not exist in the archive, then create
+ * it with the specified content.
+ *
+ * In addition, if is_recovery_guc_supported is true, then we create a
+ * zero-length standby.signal file, dropping any file with that name from
+ * the archive.
+ */
+extern bbstreamer *
+bbstreamer_recovery_injector_new(bbstreamer *next,
+ bool is_recovery_guc_supported,
+ PQExpBuffer recoveryconfcontents)
+{
+ bbstreamer_recovery_injector *streamer;
+
+ streamer = palloc0(sizeof(bbstreamer_recovery_injector));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_recovery_injector_ops;
+ streamer->base.bbs_next = next;
+ streamer->is_recovery_guc_supported = is_recovery_guc_supported;
+ streamer->recoveryconfcontents = recoveryconfcontents;
+
+ return &streamer->base;
+}
+
+/*
+ * Handle each chunk of tar content while injecting recovery configuration.
+ */
+static void
+bbstreamer_recovery_injector_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_recovery_injector *mystreamer;
+
+ mystreamer = (bbstreamer_recovery_injector *) streamer;
+ Assert(member != NULL || context == BBSTREAMER_ARCHIVE_TRAILER);
+
+ switch (context)
+ {
+ case BBSTREAMER_MEMBER_HEADER:
+ /* Must copy provided data so we have the option to modify it. */
+ memcpy(&mystreamer->member, member, sizeof(bbstreamer_member));
+
+ /*
+ * On v12+, skip standby.signal and edit postgresql.auto.conf; on
+ * older versions, skip recovery.conf.
+ */
+ if (mystreamer->is_recovery_guc_supported)
+ {
+ mystreamer->skip_file =
+ (strcmp(member->pathname, "standby.signal") == 0);
+ mystreamer->is_postgresql_auto_conf =
+ (strcmp(member->pathname, "postgresql.auto.conf") == 0);
+ if (mystreamer->is_postgresql_auto_conf)
+ {
+ /* Remember we saw it so we don't add it again. */
+ mystreamer->found_postgresql_auto_conf = true;
+
+ /* Increment length by data to be injected. */
+ mystreamer->member.size +=
+ mystreamer->recoveryconfcontents->len;
+
+ /*
+ * Zap data and len because the archive header is no
+ * longer valid; some subsequent bbstreamer must
+ * regenerate it if it's necessary.
+ */
+ data = NULL;
+ len = 0;
+ }
+ }
+ else
+ mystreamer->skip_file =
+ (strcmp(member->pathname, "recovery.conf") == 0);
+
+ /* Do not forward if the file is to be skipped. */
+ if (mystreamer->skip_file)
+ return;
+ break;
+
+ case BBSTREAMER_MEMBER_CONTENTS:
+ /* Do not forward if the file is to be skipped. */
+ if (mystreamer->skip_file)
+ return;
+ break;
+
+ case BBSTREAMER_MEMBER_TRAILER:
+ /* Do not forward it the file is to be skipped. */
+ if (mystreamer->skip_file)
+ return;
+
+ /* Append provided content to whatever we already sent. */
+ if (mystreamer->is_postgresql_auto_conf)
+ bbstreamer_content(mystreamer->base.bbs_next, member,
+ mystreamer->recoveryconfcontents->data,
+ mystreamer->recoveryconfcontents->len,
+ BBSTREAMER_MEMBER_CONTENTS);
+ break;
+
+ case BBSTREAMER_ARCHIVE_TRAILER:
+ if (mystreamer->is_recovery_guc_supported)
+ {
+ /*
+ * If we didn't already find (and thus modify)
+ * postgresql.auto.conf, inject it as an additional archive
+ * member now.
+ */
+ if (!mystreamer->found_postgresql_auto_conf)
+ bbstreamer_inject_file(mystreamer->base.bbs_next,
+ "postgresql.auto.conf",
+ mystreamer->recoveryconfcontents->data,
+ mystreamer->recoveryconfcontents->len);
+
+ /* Inject empty standby.signal file. */
+ bbstreamer_inject_file(mystreamer->base.bbs_next,
+ "standby.signal", "", 0);
+ }
+ else
+ {
+ /* Inject recovery.conf file with specified contents. */
+ bbstreamer_inject_file(mystreamer->base.bbs_next,
+ "recovery.conf",
+ mystreamer->recoveryconfcontents->data,
+ mystreamer->recoveryconfcontents->len);
+ }
+
+ /* Nothing to do here. */
+ break;
+
+ default:
+ /* Shouldn't happen. */
+ pg_fatal("unexpected state while injecting recovery settings");
+ }
+
+ bbstreamer_content(mystreamer->base.bbs_next, &mystreamer->member,
+ data, len, context);
+}
+
+/*
+ * End-of-stream processing for this bbstreamer.
+ */
+static void
+bbstreamer_recovery_injector_finalize(bbstreamer *streamer)
+{
+ bbstreamer_finalize(streamer->bbs_next);
+}
+
+/*
+ * Free memory associated with this bbstreamer.
+ */
+static void
+bbstreamer_recovery_injector_free(bbstreamer *streamer)
+{
+ bbstreamer_free(streamer->bbs_next);
+ pfree(streamer);
+}
+
+/*
+ * Inject a member into the archive with specified contents.
+ */
+void
+bbstreamer_inject_file(bbstreamer *streamer, char *pathname, char *data,
+ int len)
+{
+ bbstreamer_member member;
+
+ strlcpy(member.pathname, pathname, MAXPGPATH);
+ member.size = len;
+ member.mode = pg_file_create_mode;
+ member.is_directory = false;
+ member.is_link = false;
+ member.linktarget[0] = '\0';
+
+ /*
+ * There seems to be no principled argument for these values, but they are
+ * what PostgreSQL has historically used.
+ */
+ member.uid = 04000;
+ member.gid = 02000;
+
+ /*
+ * We don't know here how to generate valid member headers and trailers
+ * for the archiving format in use, so if those are needed, some successor
+ * bbstreamer will have to generate them using the data from 'member'.
+ */
+ bbstreamer_content(streamer, &member, NULL, 0,
+ BBSTREAMER_MEMBER_HEADER);
+ bbstreamer_content(streamer, &member, data, len,
+ BBSTREAMER_MEMBER_CONTENTS);
+ bbstreamer_content(streamer, &member, NULL, 0,
+ BBSTREAMER_MEMBER_TRAILER);
+}
diff --git a/src/bin/pg_basebackup/bbstreamer_lz4.c b/src/bin/pg_basebackup/bbstreamer_lz4.c
new file mode 100644
index 0000000..ed2aa01
--- /dev/null
+++ b/src/bin/pg_basebackup/bbstreamer_lz4.c
@@ -0,0 +1,422 @@
+/*-------------------------------------------------------------------------
+ *
+ * bbstreamer_lz4.c
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/bbstreamer_lz4.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <unistd.h>
+
+#ifdef USE_LZ4
+#include <lz4frame.h>
+#endif
+
+#include "bbstreamer.h"
+#include "common/logging.h"
+#include "common/file_perm.h"
+#include "common/string.h"
+
+#ifdef USE_LZ4
+typedef struct bbstreamer_lz4_frame
+{
+ bbstreamer base;
+
+ LZ4F_compressionContext_t cctx;
+ LZ4F_decompressionContext_t dctx;
+ LZ4F_preferences_t prefs;
+
+ size_t bytes_written;
+ bool header_written;
+} bbstreamer_lz4_frame;
+
+static void bbstreamer_lz4_compressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_lz4_compressor_finalize(bbstreamer *streamer);
+static void bbstreamer_lz4_compressor_free(bbstreamer *streamer);
+
+const bbstreamer_ops bbstreamer_lz4_compressor_ops = {
+ .content = bbstreamer_lz4_compressor_content,
+ .finalize = bbstreamer_lz4_compressor_finalize,
+ .free = bbstreamer_lz4_compressor_free
+};
+
+static void bbstreamer_lz4_decompressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_lz4_decompressor_finalize(bbstreamer *streamer);
+static void bbstreamer_lz4_decompressor_free(bbstreamer *streamer);
+
+const bbstreamer_ops bbstreamer_lz4_decompressor_ops = {
+ .content = bbstreamer_lz4_decompressor_content,
+ .finalize = bbstreamer_lz4_decompressor_finalize,
+ .free = bbstreamer_lz4_decompressor_free
+};
+#endif
+
+/*
+ * Create a new base backup streamer that performs lz4 compression of tar
+ * blocks.
+ */
+bbstreamer *
+bbstreamer_lz4_compressor_new(bbstreamer *next, pg_compress_specification *compress)
+{
+#ifdef USE_LZ4
+ bbstreamer_lz4_frame *streamer;
+ LZ4F_errorCode_t ctxError;
+ LZ4F_preferences_t *prefs;
+
+ Assert(next != NULL);
+
+ streamer = palloc0(sizeof(bbstreamer_lz4_frame));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_lz4_compressor_ops;
+
+ streamer->base.bbs_next = next;
+ initStringInfo(&streamer->base.bbs_buffer);
+ streamer->header_written = false;
+
+ /* Initialize stream compression preferences */
+ prefs = &streamer->prefs;
+ memset(prefs, 0, sizeof(LZ4F_preferences_t));
+ prefs->frameInfo.blockSizeID = LZ4F_max256KB;
+ prefs->compressionLevel = compress->level;
+
+ ctxError = LZ4F_createCompressionContext(&streamer->cctx, LZ4F_VERSION);
+ if (LZ4F_isError(ctxError))
+ pg_log_error("could not create lz4 compression context: %s",
+ LZ4F_getErrorName(ctxError));
+
+ return &streamer->base;
+#else
+ pg_fatal("this build does not support lz4 compression");
+ return NULL; /* keep compiler quiet */
+#endif
+}
+
+#ifdef USE_LZ4
+/*
+ * Compress the input data to output buffer.
+ *
+ * Find out the compression bound based on input data length for each
+ * invocation to make sure that output buffer has enough capacity to
+ * accommodate the compressed data. In case if the output buffer
+ * capacity falls short of compression bound then forward the content
+ * of output buffer to next streamer and empty the buffer.
+ */
+static void
+bbstreamer_lz4_compressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_lz4_frame *mystreamer;
+ uint8 *next_in,
+ *next_out;
+ size_t out_bound,
+ compressed_size,
+ avail_out;
+
+ mystreamer = (bbstreamer_lz4_frame *) streamer;
+ next_in = (uint8 *) data;
+
+ /* Write header before processing the first input chunk. */
+ if (!mystreamer->header_written)
+ {
+ compressed_size = LZ4F_compressBegin(mystreamer->cctx,
+ (uint8 *) mystreamer->base.bbs_buffer.data,
+ mystreamer->base.bbs_buffer.maxlen,
+ &mystreamer->prefs);
+
+ if (LZ4F_isError(compressed_size))
+ pg_log_error("could not write lz4 header: %s",
+ LZ4F_getErrorName(compressed_size));
+
+ mystreamer->bytes_written += compressed_size;
+ mystreamer->header_written = true;
+ }
+
+ /*
+ * Update the offset and capacity of output buffer based on number of
+ * bytes written to output buffer.
+ */
+ next_out = (uint8 *) mystreamer->base.bbs_buffer.data + mystreamer->bytes_written;
+ avail_out = mystreamer->base.bbs_buffer.maxlen - mystreamer->bytes_written;
+
+ /*
+ * Find out the compression bound and make sure that output buffer has the
+ * required capacity for the success of LZ4F_compressUpdate. If needed
+ * forward the content to next streamer and empty the buffer.
+ */
+ out_bound = LZ4F_compressBound(len, &mystreamer->prefs);
+ if (avail_out < out_bound)
+ {
+ bbstreamer_content(mystreamer->base.bbs_next, member,
+ mystreamer->base.bbs_buffer.data,
+ mystreamer->bytes_written,
+ context);
+
+ /* Enlarge buffer if it falls short of out bound. */
+ if (mystreamer->base.bbs_buffer.maxlen < out_bound)
+ enlargeStringInfo(&mystreamer->base.bbs_buffer, out_bound);
+
+ avail_out = mystreamer->base.bbs_buffer.maxlen;
+ mystreamer->bytes_written = 0;
+ next_out = (uint8 *) mystreamer->base.bbs_buffer.data;
+ }
+
+ /*
+ * This call compresses the data starting at next_in and generates the
+ * output starting at next_out. It expects the caller to provide the size
+ * of input buffer and capacity of output buffer by providing parameters
+ * len and avail_out.
+ *
+ * It returns the number of bytes compressed to output buffer.
+ */
+ compressed_size = LZ4F_compressUpdate(mystreamer->cctx,
+ next_out, avail_out,
+ next_in, len, NULL);
+
+ if (LZ4F_isError(compressed_size))
+ pg_log_error("could not compress data: %s",
+ LZ4F_getErrorName(compressed_size));
+
+ mystreamer->bytes_written += compressed_size;
+}
+
+/*
+ * End-of-stream processing.
+ */
+static void
+bbstreamer_lz4_compressor_finalize(bbstreamer *streamer)
+{
+ bbstreamer_lz4_frame *mystreamer;
+ uint8 *next_out;
+ size_t footer_bound,
+ compressed_size,
+ avail_out;
+
+ mystreamer = (bbstreamer_lz4_frame *) streamer;
+
+ /* Find out the footer bound and update the output buffer. */
+ footer_bound = LZ4F_compressBound(0, &mystreamer->prefs);
+ if ((mystreamer->base.bbs_buffer.maxlen - mystreamer->bytes_written) <
+ footer_bound)
+ {
+ bbstreamer_content(mystreamer->base.bbs_next, NULL,
+ mystreamer->base.bbs_buffer.data,
+ mystreamer->bytes_written,
+ BBSTREAMER_UNKNOWN);
+
+ /* Enlarge buffer if it falls short of footer bound. */
+ if (mystreamer->base.bbs_buffer.maxlen < footer_bound)
+ enlargeStringInfo(&mystreamer->base.bbs_buffer, footer_bound);
+
+ avail_out = mystreamer->base.bbs_buffer.maxlen;
+ mystreamer->bytes_written = 0;
+ next_out = (uint8 *) mystreamer->base.bbs_buffer.data;
+ }
+ else
+ {
+ next_out = (uint8 *) mystreamer->base.bbs_buffer.data + mystreamer->bytes_written;
+ avail_out = mystreamer->base.bbs_buffer.maxlen - mystreamer->bytes_written;
+ }
+
+ /*
+ * Finalize the frame and flush whatever data remaining in compression
+ * context.
+ */
+ compressed_size = LZ4F_compressEnd(mystreamer->cctx,
+ next_out, avail_out, NULL);
+
+ if (LZ4F_isError(compressed_size))
+ pg_log_error("could not end lz4 compression: %s",
+ LZ4F_getErrorName(compressed_size));
+
+ mystreamer->bytes_written += compressed_size;
+
+ bbstreamer_content(mystreamer->base.bbs_next, NULL,
+ mystreamer->base.bbs_buffer.data,
+ mystreamer->bytes_written,
+ BBSTREAMER_UNKNOWN);
+
+ bbstreamer_finalize(mystreamer->base.bbs_next);
+}
+
+/*
+ * Free memory.
+ */
+static void
+bbstreamer_lz4_compressor_free(bbstreamer *streamer)
+{
+ bbstreamer_lz4_frame *mystreamer;
+
+ mystreamer = (bbstreamer_lz4_frame *) streamer;
+ bbstreamer_free(streamer->bbs_next);
+ LZ4F_freeCompressionContext(mystreamer->cctx);
+ pfree(streamer->bbs_buffer.data);
+ pfree(streamer);
+}
+#endif
+
+/*
+ * Create a new base backup streamer that performs decompression of lz4
+ * compressed blocks.
+ */
+bbstreamer *
+bbstreamer_lz4_decompressor_new(bbstreamer *next)
+{
+#ifdef USE_LZ4
+ bbstreamer_lz4_frame *streamer;
+ LZ4F_errorCode_t ctxError;
+
+ Assert(next != NULL);
+
+ streamer = palloc0(sizeof(bbstreamer_lz4_frame));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_lz4_decompressor_ops;
+
+ streamer->base.bbs_next = next;
+ initStringInfo(&streamer->base.bbs_buffer);
+
+ /* Initialize internal stream state for decompression */
+ ctxError = LZ4F_createDecompressionContext(&streamer->dctx, LZ4F_VERSION);
+ if (LZ4F_isError(ctxError))
+ pg_fatal("could not initialize compression library: %s",
+ LZ4F_getErrorName(ctxError));
+
+ return &streamer->base;
+#else
+ pg_fatal("this build does not support lz4 compression");
+ return NULL; /* keep compiler quiet */
+#endif
+}
+
+#ifdef USE_LZ4
+/*
+ * Decompress the input data to output buffer until we run out of input
+ * data. Each time the output buffer is full, pass on the decompressed data
+ * to the next streamer.
+ */
+static void
+bbstreamer_lz4_decompressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_lz4_frame *mystreamer;
+ uint8 *next_in,
+ *next_out;
+ size_t avail_in,
+ avail_out;
+
+ mystreamer = (bbstreamer_lz4_frame *) streamer;
+ next_in = (uint8 *) data;
+ next_out = (uint8 *) mystreamer->base.bbs_buffer.data;
+ avail_in = len;
+ avail_out = mystreamer->base.bbs_buffer.maxlen;
+
+ while (avail_in > 0)
+ {
+ size_t ret,
+ read_size,
+ out_size;
+
+ read_size = avail_in;
+ out_size = avail_out;
+
+ /*
+ * This call decompresses the data starting at next_in and generates
+ * the output data starting at next_out. It expects the caller to
+ * provide size of the input buffer and total capacity of the output
+ * buffer by providing the read_size and out_size parameters
+ * respectively.
+ *
+ * Per the documentation of LZ4, parameters read_size and out_size
+ * behaves as dual parameters. On return, the number of bytes consumed
+ * from the input buffer will be written back to read_size and the
+ * number of bytes decompressed to output buffer will be written back
+ * to out_size respectively.
+ */
+ ret = LZ4F_decompress(mystreamer->dctx,
+ next_out, &out_size,
+ next_in, &read_size, NULL);
+
+ if (LZ4F_isError(ret))
+ pg_log_error("could not decompress data: %s",
+ LZ4F_getErrorName(ret));
+
+ /* Update input buffer based on number of bytes consumed */
+ avail_in -= read_size;
+ next_in += read_size;
+
+ mystreamer->bytes_written += out_size;
+
+ /*
+ * If output buffer is full then forward the content to next streamer
+ * and update the output buffer.
+ */
+ if (mystreamer->bytes_written >= mystreamer->base.bbs_buffer.maxlen)
+ {
+ bbstreamer_content(mystreamer->base.bbs_next, member,
+ mystreamer->base.bbs_buffer.data,
+ mystreamer->base.bbs_buffer.maxlen,
+ context);
+
+ avail_out = mystreamer->base.bbs_buffer.maxlen;
+ mystreamer->bytes_written = 0;
+ next_out = (uint8 *) mystreamer->base.bbs_buffer.data;
+ }
+ else
+ {
+ avail_out = mystreamer->base.bbs_buffer.maxlen - mystreamer->bytes_written;
+ next_out += mystreamer->bytes_written;
+ }
+ }
+}
+
+/*
+ * End-of-stream processing.
+ */
+static void
+bbstreamer_lz4_decompressor_finalize(bbstreamer *streamer)
+{
+ bbstreamer_lz4_frame *mystreamer;
+
+ mystreamer = (bbstreamer_lz4_frame *) streamer;
+
+ /*
+ * End of the stream, if there is some pending data in output buffers then
+ * we must forward it to next streamer.
+ */
+ bbstreamer_content(mystreamer->base.bbs_next, NULL,
+ mystreamer->base.bbs_buffer.data,
+ mystreamer->base.bbs_buffer.maxlen,
+ BBSTREAMER_UNKNOWN);
+
+ bbstreamer_finalize(mystreamer->base.bbs_next);
+}
+
+/*
+ * Free memory.
+ */
+static void
+bbstreamer_lz4_decompressor_free(bbstreamer *streamer)
+{
+ bbstreamer_lz4_frame *mystreamer;
+
+ mystreamer = (bbstreamer_lz4_frame *) streamer;
+ bbstreamer_free(streamer->bbs_next);
+ LZ4F_freeDecompressionContext(mystreamer->dctx);
+ pfree(streamer->bbs_buffer.data);
+ pfree(streamer);
+}
+#endif
diff --git a/src/bin/pg_basebackup/bbstreamer_tar.c b/src/bin/pg_basebackup/bbstreamer_tar.c
new file mode 100644
index 0000000..ef5586c
--- /dev/null
+++ b/src/bin/pg_basebackup/bbstreamer_tar.c
@@ -0,0 +1,516 @@
+/*-------------------------------------------------------------------------
+ *
+ * bbstreamer_tar.c
+ *
+ * This module implements three types of tar processing. A tar parser
+ * expects unlabelled chunks of data (e.g. BBSTREAMER_UNKNOWN) and splits
+ * it into labelled chunks (any other value of bbstreamer_archive_context).
+ * A tar archiver does the reverse: it takes a bunch of labelled chunks
+ * and produces a tarfile, optionally replacing member headers and trailers
+ * so that upstream bbstreamer objects can perform surgery on the tarfile
+ * contents without knowing the details of the tar format. A tar terminator
+ * just adds two blocks of NUL bytes to the end of the file, since older
+ * server versions produce files with this terminator omitted.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/bbstreamer_tar.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <time.h>
+
+#include "bbstreamer.h"
+#include "common/logging.h"
+#include "pgtar.h"
+
+typedef struct bbstreamer_tar_parser
+{
+ bbstreamer base;
+ bbstreamer_archive_context next_context;
+ bbstreamer_member member;
+ size_t file_bytes_sent;
+ size_t pad_bytes_expected;
+} bbstreamer_tar_parser;
+
+typedef struct bbstreamer_tar_archiver
+{
+ bbstreamer base;
+ bool rearchive_member;
+} bbstreamer_tar_archiver;
+
+static void bbstreamer_tar_parser_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_tar_parser_finalize(bbstreamer *streamer);
+static void bbstreamer_tar_parser_free(bbstreamer *streamer);
+static bool bbstreamer_tar_header(bbstreamer_tar_parser *mystreamer);
+
+const bbstreamer_ops bbstreamer_tar_parser_ops = {
+ .content = bbstreamer_tar_parser_content,
+ .finalize = bbstreamer_tar_parser_finalize,
+ .free = bbstreamer_tar_parser_free
+};
+
+static void bbstreamer_tar_archiver_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_tar_archiver_finalize(bbstreamer *streamer);
+static void bbstreamer_tar_archiver_free(bbstreamer *streamer);
+
+const bbstreamer_ops bbstreamer_tar_archiver_ops = {
+ .content = bbstreamer_tar_archiver_content,
+ .finalize = bbstreamer_tar_archiver_finalize,
+ .free = bbstreamer_tar_archiver_free
+};
+
+static void bbstreamer_tar_terminator_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_tar_terminator_finalize(bbstreamer *streamer);
+static void bbstreamer_tar_terminator_free(bbstreamer *streamer);
+
+const bbstreamer_ops bbstreamer_tar_terminator_ops = {
+ .content = bbstreamer_tar_terminator_content,
+ .finalize = bbstreamer_tar_terminator_finalize,
+ .free = bbstreamer_tar_terminator_free
+};
+
+/*
+ * Create a bbstreamer that can parse a stream of content as tar data.
+ *
+ * The input should be a series of BBSTREAMER_UNKNOWN chunks; the bbstreamer
+ * specified by 'next' will receive a series of typed chunks, as per the
+ * conventions described in bbstreamer.h.
+ */
+extern bbstreamer *
+bbstreamer_tar_parser_new(bbstreamer *next)
+{
+ bbstreamer_tar_parser *streamer;
+
+ streamer = palloc0(sizeof(bbstreamer_tar_parser));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_tar_parser_ops;
+ streamer->base.bbs_next = next;
+ initStringInfo(&streamer->base.bbs_buffer);
+ streamer->next_context = BBSTREAMER_MEMBER_HEADER;
+
+ return &streamer->base;
+}
+
+/*
+ * Parse unknown content as tar data.
+ */
+static void
+bbstreamer_tar_parser_content(bbstreamer *streamer, bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_tar_parser *mystreamer = (bbstreamer_tar_parser *) streamer;
+ size_t nbytes;
+
+ /* Expect unparsed input. */
+ Assert(member == NULL);
+ Assert(context == BBSTREAMER_UNKNOWN);
+
+ while (len > 0)
+ {
+ switch (mystreamer->next_context)
+ {
+ case BBSTREAMER_MEMBER_HEADER:
+
+ /*
+ * If we're expecting an archive member header, accumulate a
+ * full block of data before doing anything further.
+ */
+ if (!bbstreamer_buffer_until(streamer, &data, &len,
+ TAR_BLOCK_SIZE))
+ return;
+
+ /*
+ * Now we can process the header and get ready to process the
+ * file contents; however, we might find out that what we
+ * thought was the next file header is actually the start of
+ * the archive trailer. Switch modes accordingly.
+ */
+ if (bbstreamer_tar_header(mystreamer))
+ {
+ if (mystreamer->member.size == 0)
+ {
+ /* No content; trailer is zero-length. */
+ bbstreamer_content(mystreamer->base.bbs_next,
+ &mystreamer->member,
+ NULL, 0,
+ BBSTREAMER_MEMBER_TRAILER);
+
+ /* Expect next header. */
+ mystreamer->next_context = BBSTREAMER_MEMBER_HEADER;
+ }
+ else
+ {
+ /* Expect contents. */
+ mystreamer->next_context = BBSTREAMER_MEMBER_CONTENTS;
+ }
+ mystreamer->base.bbs_buffer.len = 0;
+ mystreamer->file_bytes_sent = 0;
+ }
+ else
+ mystreamer->next_context = BBSTREAMER_ARCHIVE_TRAILER;
+ break;
+
+ case BBSTREAMER_MEMBER_CONTENTS:
+
+ /*
+ * Send as much content as we have, but not more than the
+ * remaining file length.
+ */
+ Assert(mystreamer->file_bytes_sent < mystreamer->member.size);
+ nbytes = mystreamer->member.size - mystreamer->file_bytes_sent;
+ nbytes = Min(nbytes, len);
+ Assert(nbytes > 0);
+ bbstreamer_content(mystreamer->base.bbs_next,
+ &mystreamer->member,
+ data, nbytes,
+ BBSTREAMER_MEMBER_CONTENTS);
+ mystreamer->file_bytes_sent += nbytes;
+ data += nbytes;
+ len -= nbytes;
+
+ /*
+ * If we've not yet sent the whole file, then there's more
+ * content to come; otherwise, it's time to expect the file
+ * trailer.
+ */
+ Assert(mystreamer->file_bytes_sent <= mystreamer->member.size);
+ if (mystreamer->file_bytes_sent == mystreamer->member.size)
+ {
+ if (mystreamer->pad_bytes_expected == 0)
+ {
+ /* Trailer is zero-length. */
+ bbstreamer_content(mystreamer->base.bbs_next,
+ &mystreamer->member,
+ NULL, 0,
+ BBSTREAMER_MEMBER_TRAILER);
+
+ /* Expect next header. */
+ mystreamer->next_context = BBSTREAMER_MEMBER_HEADER;
+ }
+ else
+ {
+ /* Trailer is not zero-length. */
+ mystreamer->next_context = BBSTREAMER_MEMBER_TRAILER;
+ }
+ mystreamer->base.bbs_buffer.len = 0;
+ }
+ break;
+
+ case BBSTREAMER_MEMBER_TRAILER:
+
+ /*
+ * If we're expecting an archive member trailer, accumulate
+ * the expected number of padding bytes before sending
+ * anything onward.
+ */
+ if (!bbstreamer_buffer_until(streamer, &data, &len,
+ mystreamer->pad_bytes_expected))
+ return;
+
+ /* OK, now we can send it. */
+ bbstreamer_content(mystreamer->base.bbs_next,
+ &mystreamer->member,
+ data, mystreamer->pad_bytes_expected,
+ BBSTREAMER_MEMBER_TRAILER);
+
+ /* Expect next file header. */
+ mystreamer->next_context = BBSTREAMER_MEMBER_HEADER;
+ mystreamer->base.bbs_buffer.len = 0;
+ break;
+
+ case BBSTREAMER_ARCHIVE_TRAILER:
+
+ /*
+ * We've seen an end-of-archive indicator, so anything more is
+ * buffered and sent as part of the archive trailer. But we
+ * don't expect more than 2 blocks.
+ */
+ bbstreamer_buffer_bytes(streamer, &data, &len, len);
+ if (len > 2 * TAR_BLOCK_SIZE)
+ pg_fatal("tar file trailer exceeds 2 blocks");
+ return;
+
+ default:
+ /* Shouldn't happen. */
+ pg_fatal("unexpected state while parsing tar archive");
+ }
+ }
+}
+
+/*
+ * Parse a file header within a tar stream.
+ *
+ * The return value is true if we found a file header and passed it on to the
+ * next bbstreamer; it is false if we have reached the archive trailer.
+ */
+static bool
+bbstreamer_tar_header(bbstreamer_tar_parser *mystreamer)
+{
+ bool has_nonzero_byte = false;
+ int i;
+ bbstreamer_member *member = &mystreamer->member;
+ char *buffer = mystreamer->base.bbs_buffer.data;
+
+ Assert(mystreamer->base.bbs_buffer.len == TAR_BLOCK_SIZE);
+
+ /* Check whether we've got a block of all zero bytes. */
+ for (i = 0; i < TAR_BLOCK_SIZE; ++i)
+ {
+ if (buffer[i] != '\0')
+ {
+ has_nonzero_byte = true;
+ break;
+ }
+ }
+
+ /*
+ * If the entire block was zeros, this is the end of the archive, not the
+ * start of the next file.
+ */
+ if (!has_nonzero_byte)
+ return false;
+
+ /*
+ * Parse key fields out of the header.
+ *
+ * FIXME: It's terrible that we use hard-coded values here instead of some
+ * more principled approach. It's been like this for a long time, but we
+ * ought to do better.
+ */
+ strlcpy(member->pathname, &buffer[0], MAXPGPATH);
+ if (member->pathname[0] == '\0')
+ pg_fatal("tar member has empty name");
+ member->size = read_tar_number(&buffer[124], 12);
+ member->mode = read_tar_number(&buffer[100], 8);
+ member->uid = read_tar_number(&buffer[108], 8);
+ member->gid = read_tar_number(&buffer[116], 8);
+ member->is_directory = (buffer[156] == '5');
+ member->is_link = (buffer[156] == '2');
+ if (member->is_link)
+ strlcpy(member->linktarget, &buffer[157], 100);
+
+ /* Compute number of padding bytes. */
+ mystreamer->pad_bytes_expected = tarPaddingBytesRequired(member->size);
+
+ /* Forward the entire header to the next bbstreamer. */
+ bbstreamer_content(mystreamer->base.bbs_next, member,
+ buffer, TAR_BLOCK_SIZE,
+ BBSTREAMER_MEMBER_HEADER);
+
+ return true;
+}
+
+/*
+ * End-of-stream processing for a tar parser.
+ */
+static void
+bbstreamer_tar_parser_finalize(bbstreamer *streamer)
+{
+ bbstreamer_tar_parser *mystreamer = (bbstreamer_tar_parser *) streamer;
+
+ if (mystreamer->next_context != BBSTREAMER_ARCHIVE_TRAILER &&
+ (mystreamer->next_context != BBSTREAMER_MEMBER_HEADER ||
+ mystreamer->base.bbs_buffer.len > 0))
+ pg_fatal("COPY stream ended before last file was finished");
+
+ /* Send the archive trailer, even if empty. */
+ bbstreamer_content(streamer->bbs_next, NULL,
+ streamer->bbs_buffer.data, streamer->bbs_buffer.len,
+ BBSTREAMER_ARCHIVE_TRAILER);
+
+ /* Now finalize successor. */
+ bbstreamer_finalize(streamer->bbs_next);
+}
+
+/*
+ * Free memory associated with a tar parser.
+ */
+static void
+bbstreamer_tar_parser_free(bbstreamer *streamer)
+{
+ pfree(streamer->bbs_buffer.data);
+ bbstreamer_free(streamer->bbs_next);
+}
+
+/*
+ * Create an bbstreamer that can generate a tar archive.
+ *
+ * This is intended to be usable either for generating a brand-new tar archive
+ * or for modifying one on the fly. The input should be a series of typed
+ * chunks (i.e. not BBSTREAMER_UNKNOWN). See also the comments for
+ * bbstreamer_tar_parser_content.
+ */
+extern bbstreamer *
+bbstreamer_tar_archiver_new(bbstreamer *next)
+{
+ bbstreamer_tar_archiver *streamer;
+
+ streamer = palloc0(sizeof(bbstreamer_tar_archiver));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_tar_archiver_ops;
+ streamer->base.bbs_next = next;
+
+ return &streamer->base;
+}
+
+/*
+ * Fix up the stream of input chunks to create a valid tar file.
+ *
+ * If a BBSTREAMER_MEMBER_HEADER chunk is of size 0, it is replaced with a
+ * newly-constructed tar header. If it is of size TAR_BLOCK_SIZE, it is
+ * passed through without change. Any other size is a fatal error (and
+ * indicates a bug).
+ *
+ * Whenever a new BBSTREAMER_MEMBER_HEADER chunk is constructed, the
+ * corresponding BBSTREAMER_MEMBER_TRAILER chunk is also constructed from
+ * scratch. Specifically, we construct a block of zero bytes sufficient to
+ * pad out to a block boundary, as required by the tar format. Other
+ * BBSTREAMER_MEMBER_TRAILER chunks are passed through without change.
+ *
+ * Any BBSTREAMER_MEMBER_CONTENTS chunks are passed through without change.
+ *
+ * The BBSTREAMER_ARCHIVE_TRAILER chunk is replaced with two
+ * blocks of zero bytes. Not all tar programs require this, but apparently
+ * some do. The server does not supply this trailer. If no archive trailer is
+ * present, one will be added by bbstreamer_tar_parser_finalize.
+ */
+static void
+bbstreamer_tar_archiver_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_tar_archiver *mystreamer = (bbstreamer_tar_archiver *) streamer;
+ char buffer[2 * TAR_BLOCK_SIZE];
+
+ Assert(context != BBSTREAMER_UNKNOWN);
+
+ if (context == BBSTREAMER_MEMBER_HEADER && len != TAR_BLOCK_SIZE)
+ {
+ Assert(len == 0);
+
+ /* Replace zero-length tar header with a newly constructed one. */
+ tarCreateHeader(buffer, member->pathname, NULL,
+ member->size, member->mode, member->uid, member->gid,
+ time(NULL));
+ data = buffer;
+ len = TAR_BLOCK_SIZE;
+
+ /* Also make a note to replace padding, in case size changed. */
+ mystreamer->rearchive_member = true;
+ }
+ else if (context == BBSTREAMER_MEMBER_TRAILER &&
+ mystreamer->rearchive_member)
+ {
+ int pad_bytes = tarPaddingBytesRequired(member->size);
+
+ /* Also replace padding, if we regenerated the header. */
+ memset(buffer, 0, pad_bytes);
+ data = buffer;
+ len = pad_bytes;
+
+ /* Don't do this again unless we replace another header. */
+ mystreamer->rearchive_member = false;
+ }
+ else if (context == BBSTREAMER_ARCHIVE_TRAILER)
+ {
+ /* Trailer should always be two blocks of zero bytes. */
+ memset(buffer, 0, 2 * TAR_BLOCK_SIZE);
+ data = buffer;
+ len = 2 * TAR_BLOCK_SIZE;
+ }
+
+ bbstreamer_content(streamer->bbs_next, member, data, len, context);
+}
+
+/*
+ * End-of-stream processing for a tar archiver.
+ */
+static void
+bbstreamer_tar_archiver_finalize(bbstreamer *streamer)
+{
+ bbstreamer_finalize(streamer->bbs_next);
+}
+
+/*
+ * Free memory associated with a tar archiver.
+ */
+static void
+bbstreamer_tar_archiver_free(bbstreamer *streamer)
+{
+ bbstreamer_free(streamer->bbs_next);
+ pfree(streamer);
+}
+
+/*
+ * Create a bbstreamer that blindly adds two blocks of NUL bytes to the
+ * end of an incomplete tarfile that the server might send us.
+ */
+bbstreamer *
+bbstreamer_tar_terminator_new(bbstreamer *next)
+{
+ bbstreamer *streamer;
+
+ streamer = palloc0(sizeof(bbstreamer));
+ *((const bbstreamer_ops **) &streamer->bbs_ops) =
+ &bbstreamer_tar_terminator_ops;
+ streamer->bbs_next = next;
+
+ return streamer;
+}
+
+/*
+ * Pass all the content through without change.
+ */
+static void
+bbstreamer_tar_terminator_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ /* Expect unparsed input. */
+ Assert(member == NULL);
+ Assert(context == BBSTREAMER_UNKNOWN);
+
+ /* Just forward it. */
+ bbstreamer_content(streamer->bbs_next, member, data, len, context);
+}
+
+/*
+ * At the end, blindly add the two blocks of NUL bytes which the server fails
+ * to supply.
+ */
+static void
+bbstreamer_tar_terminator_finalize(bbstreamer *streamer)
+{
+ char buffer[2 * TAR_BLOCK_SIZE];
+
+ memset(buffer, 0, 2 * TAR_BLOCK_SIZE);
+ bbstreamer_content(streamer->bbs_next, NULL, buffer,
+ 2 * TAR_BLOCK_SIZE, BBSTREAMER_UNKNOWN);
+ bbstreamer_finalize(streamer->bbs_next);
+}
+
+/*
+ * Free memory associated with a tar terminator.
+ */
+static void
+bbstreamer_tar_terminator_free(bbstreamer *streamer)
+{
+ bbstreamer_free(streamer->bbs_next);
+ pfree(streamer);
+}
diff --git a/src/bin/pg_basebackup/bbstreamer_zstd.c b/src/bin/pg_basebackup/bbstreamer_zstd.c
new file mode 100644
index 0000000..1207dd7
--- /dev/null
+++ b/src/bin/pg_basebackup/bbstreamer_zstd.c
@@ -0,0 +1,355 @@
+/*-------------------------------------------------------------------------
+ *
+ * bbstreamer_zstd.c
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/bbstreamer_zstd.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <unistd.h>
+
+#ifdef USE_ZSTD
+#include <zstd.h>
+#endif
+
+#include "bbstreamer.h"
+#include "common/logging.h"
+
+#ifdef USE_ZSTD
+
+typedef struct bbstreamer_zstd_frame
+{
+ bbstreamer base;
+
+ ZSTD_CCtx *cctx;
+ ZSTD_DCtx *dctx;
+ ZSTD_outBuffer zstd_outBuf;
+} bbstreamer_zstd_frame;
+
+static void bbstreamer_zstd_compressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_zstd_compressor_finalize(bbstreamer *streamer);
+static void bbstreamer_zstd_compressor_free(bbstreamer *streamer);
+
+const bbstreamer_ops bbstreamer_zstd_compressor_ops = {
+ .content = bbstreamer_zstd_compressor_content,
+ .finalize = bbstreamer_zstd_compressor_finalize,
+ .free = bbstreamer_zstd_compressor_free
+};
+
+static void bbstreamer_zstd_decompressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_zstd_decompressor_finalize(bbstreamer *streamer);
+static void bbstreamer_zstd_decompressor_free(bbstreamer *streamer);
+
+const bbstreamer_ops bbstreamer_zstd_decompressor_ops = {
+ .content = bbstreamer_zstd_decompressor_content,
+ .finalize = bbstreamer_zstd_decompressor_finalize,
+ .free = bbstreamer_zstd_decompressor_free
+};
+#endif
+
+/*
+ * Create a new base backup streamer that performs zstd compression of tar
+ * blocks.
+ */
+bbstreamer *
+bbstreamer_zstd_compressor_new(bbstreamer *next, pg_compress_specification *compress)
+{
+#ifdef USE_ZSTD
+ bbstreamer_zstd_frame *streamer;
+ size_t ret;
+
+ Assert(next != NULL);
+
+ streamer = palloc0(sizeof(bbstreamer_zstd_frame));
+
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_zstd_compressor_ops;
+
+ streamer->base.bbs_next = next;
+ initStringInfo(&streamer->base.bbs_buffer);
+ enlargeStringInfo(&streamer->base.bbs_buffer, ZSTD_DStreamOutSize());
+
+ streamer->cctx = ZSTD_createCCtx();
+ if (!streamer->cctx)
+ pg_fatal("could not create zstd compression context");
+
+ /* Set compression level */
+ ret = ZSTD_CCtx_setParameter(streamer->cctx, ZSTD_c_compressionLevel,
+ compress->level);
+ if (ZSTD_isError(ret))
+ pg_fatal("could not set zstd compression level to %d: %s",
+ compress->level, ZSTD_getErrorName(ret));
+
+ /* Set # of workers, if specified */
+ if ((compress->options & PG_COMPRESSION_OPTION_WORKERS) != 0)
+ {
+ /*
+ * On older versions of libzstd, this option does not exist, and
+ * trying to set it will fail. Similarly for newer versions if they
+ * are compiled without threading support.
+ */
+ ret = ZSTD_CCtx_setParameter(streamer->cctx, ZSTD_c_nbWorkers,
+ compress->workers);
+ if (ZSTD_isError(ret))
+ pg_fatal("could not set compression worker count to %d: %s",
+ compress->workers, ZSTD_getErrorName(ret));
+ }
+
+ /* Initialize the ZSTD output buffer. */
+ streamer->zstd_outBuf.dst = streamer->base.bbs_buffer.data;
+ streamer->zstd_outBuf.size = streamer->base.bbs_buffer.maxlen;
+ streamer->zstd_outBuf.pos = 0;
+
+ return &streamer->base;
+#else
+ pg_fatal("this build does not support zstd compression");
+ return NULL; /* keep compiler quiet */
+#endif
+}
+
+#ifdef USE_ZSTD
+/*
+ * Compress the input data to output buffer.
+ *
+ * Find out the compression bound based on input data length for each
+ * invocation to make sure that output buffer has enough capacity to
+ * accommodate the compressed data. In case if the output buffer
+ * capacity falls short of compression bound then forward the content
+ * of output buffer to next streamer and empty the buffer.
+ */
+static void
+bbstreamer_zstd_compressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer;
+ ZSTD_inBuffer inBuf = {data, len, 0};
+
+ while (inBuf.pos < inBuf.size)
+ {
+ size_t yet_to_flush;
+ size_t max_needed = ZSTD_compressBound(inBuf.size - inBuf.pos);
+
+ /*
+ * If the output buffer is not left with enough space, send the
+ * compressed bytes to the next streamer, and empty the buffer.
+ */
+ if (mystreamer->zstd_outBuf.size - mystreamer->zstd_outBuf.pos <
+ max_needed)
+ {
+ bbstreamer_content(mystreamer->base.bbs_next, member,
+ mystreamer->zstd_outBuf.dst,
+ mystreamer->zstd_outBuf.pos,
+ context);
+
+ /* Reset the ZSTD output buffer. */
+ mystreamer->zstd_outBuf.dst = mystreamer->base.bbs_buffer.data;
+ mystreamer->zstd_outBuf.size = mystreamer->base.bbs_buffer.maxlen;
+ mystreamer->zstd_outBuf.pos = 0;
+ }
+
+ yet_to_flush =
+ ZSTD_compressStream2(mystreamer->cctx, &mystreamer->zstd_outBuf,
+ &inBuf, ZSTD_e_continue);
+
+ if (ZSTD_isError(yet_to_flush))
+ pg_log_error("could not compress data: %s",
+ ZSTD_getErrorName(yet_to_flush));
+ }
+}
+
+/*
+ * End-of-stream processing.
+ */
+static void
+bbstreamer_zstd_compressor_finalize(bbstreamer *streamer)
+{
+ bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer;
+ size_t yet_to_flush;
+
+ do
+ {
+ ZSTD_inBuffer in = {NULL, 0, 0};
+ size_t max_needed = ZSTD_compressBound(0);
+
+ /*
+ * If the output buffer is not left with enough space, send the
+ * compressed bytes to the next streamer, and empty the buffer.
+ */
+ if (mystreamer->zstd_outBuf.size - mystreamer->zstd_outBuf.pos <
+ max_needed)
+ {
+ bbstreamer_content(mystreamer->base.bbs_next, NULL,
+ mystreamer->zstd_outBuf.dst,
+ mystreamer->zstd_outBuf.pos,
+ BBSTREAMER_UNKNOWN);
+
+ /* Reset the ZSTD output buffer. */
+ mystreamer->zstd_outBuf.dst = mystreamer->base.bbs_buffer.data;
+ mystreamer->zstd_outBuf.size = mystreamer->base.bbs_buffer.maxlen;
+ mystreamer->zstd_outBuf.pos = 0;
+ }
+
+ yet_to_flush = ZSTD_compressStream2(mystreamer->cctx,
+ &mystreamer->zstd_outBuf,
+ &in, ZSTD_e_end);
+
+ if (ZSTD_isError(yet_to_flush))
+ pg_log_error("could not compress data: %s",
+ ZSTD_getErrorName(yet_to_flush));
+
+ } while (yet_to_flush > 0);
+
+ /* Make sure to pass any remaining bytes to the next streamer. */
+ if (mystreamer->zstd_outBuf.pos > 0)
+ bbstreamer_content(mystreamer->base.bbs_next, NULL,
+ mystreamer->zstd_outBuf.dst,
+ mystreamer->zstd_outBuf.pos,
+ BBSTREAMER_UNKNOWN);
+
+ bbstreamer_finalize(mystreamer->base.bbs_next);
+}
+
+/*
+ * Free memory.
+ */
+static void
+bbstreamer_zstd_compressor_free(bbstreamer *streamer)
+{
+ bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer;
+
+ bbstreamer_free(streamer->bbs_next);
+ ZSTD_freeCCtx(mystreamer->cctx);
+ pfree(streamer->bbs_buffer.data);
+ pfree(streamer);
+}
+#endif
+
+/*
+ * Create a new base backup streamer that performs decompression of zstd
+ * compressed blocks.
+ */
+bbstreamer *
+bbstreamer_zstd_decompressor_new(bbstreamer *next)
+{
+#ifdef USE_ZSTD
+ bbstreamer_zstd_frame *streamer;
+
+ Assert(next != NULL);
+
+ streamer = palloc0(sizeof(bbstreamer_zstd_frame));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_zstd_decompressor_ops;
+
+ streamer->base.bbs_next = next;
+ initStringInfo(&streamer->base.bbs_buffer);
+ enlargeStringInfo(&streamer->base.bbs_buffer, ZSTD_DStreamOutSize());
+
+ streamer->dctx = ZSTD_createDCtx();
+ if (!streamer->dctx)
+ pg_fatal("could not create zstd decompression context");
+
+ /* Initialize the ZSTD output buffer. */
+ streamer->zstd_outBuf.dst = streamer->base.bbs_buffer.data;
+ streamer->zstd_outBuf.size = streamer->base.bbs_buffer.maxlen;
+ streamer->zstd_outBuf.pos = 0;
+
+ return &streamer->base;
+#else
+ pg_fatal("this build does not support zstd compression");
+ return NULL; /* keep compiler quiet */
+#endif
+}
+
+#ifdef USE_ZSTD
+/*
+ * Decompress the input data to output buffer until we run out of input
+ * data. Each time the output buffer is full, pass on the decompressed data
+ * to the next streamer.
+ */
+static void
+bbstreamer_zstd_decompressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer;
+ ZSTD_inBuffer inBuf = {data, len, 0};
+
+ while (inBuf.pos < inBuf.size)
+ {
+ size_t ret;
+
+ /*
+ * If output buffer is full then forward the content to next streamer
+ * and update the output buffer.
+ */
+ if (mystreamer->zstd_outBuf.pos >= mystreamer->zstd_outBuf.size)
+ {
+ bbstreamer_content(mystreamer->base.bbs_next, member,
+ mystreamer->zstd_outBuf.dst,
+ mystreamer->zstd_outBuf.pos,
+ context);
+
+ /* Reset the ZSTD output buffer. */
+ mystreamer->zstd_outBuf.dst = mystreamer->base.bbs_buffer.data;
+ mystreamer->zstd_outBuf.size = mystreamer->base.bbs_buffer.maxlen;
+ mystreamer->zstd_outBuf.pos = 0;
+ }
+
+ ret = ZSTD_decompressStream(mystreamer->dctx,
+ &mystreamer->zstd_outBuf, &inBuf);
+
+ if (ZSTD_isError(ret))
+ pg_log_error("could not decompress data: %s",
+ ZSTD_getErrorName(ret));
+ }
+}
+
+/*
+ * End-of-stream processing.
+ */
+static void
+bbstreamer_zstd_decompressor_finalize(bbstreamer *streamer)
+{
+ bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer;
+
+ /*
+ * End of the stream, if there is some pending data in output buffers then
+ * we must forward it to next streamer.
+ */
+ if (mystreamer->zstd_outBuf.pos > 0)
+ bbstreamer_content(mystreamer->base.bbs_next, NULL,
+ mystreamer->base.bbs_buffer.data,
+ mystreamer->base.bbs_buffer.maxlen,
+ BBSTREAMER_UNKNOWN);
+
+ bbstreamer_finalize(mystreamer->base.bbs_next);
+}
+
+/*
+ * Free memory.
+ */
+static void
+bbstreamer_zstd_decompressor_free(bbstreamer *streamer)
+{
+ bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer;
+
+ bbstreamer_free(streamer->bbs_next);
+ ZSTD_freeDCtx(mystreamer->dctx);
+ pfree(streamer->bbs_buffer.data);
+ pfree(streamer);
+}
+#endif
diff --git a/src/bin/pg_basebackup/nls.mk b/src/bin/pg_basebackup/nls.mk
new file mode 100644
index 0000000..d127f18
--- /dev/null
+++ b/src/bin/pg_basebackup/nls.mk
@@ -0,0 +1,23 @@
+# src/bin/pg_basebackup/nls.mk
+CATALOG_NAME = pg_basebackup
+AVAIL_LANGUAGES = de el es fr it ja ka ko ru sv uk
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ bbstreamer_file.c \
+ bbstreamer_gzip.c \
+ bbstreamer_inject.c \
+ bbstreamer_lz4.c \
+ bbstreamer_tar.c \
+ bbstreamer_zstd.c \
+ pg_basebackup.c \
+ pg_receivewal.c \
+ pg_recvlogical.c \
+ receivelog.c \
+ streamutil.c \
+ walmethods.c \
+ ../../common/compression.c \
+ ../../common/fe_memutils.c \
+ ../../common/file_utils.c \
+ ../../fe_utils/option_utils.c \
+ ../../fe_utils/recovery_gen.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) simple_prompt tar_set_error
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c
new file mode 100644
index 0000000..73bb8ff
--- /dev/null
+++ b/src/bin/pg_basebackup/pg_basebackup.c
@@ -0,0 +1,2797 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_basebackup.c - receive a base backup using streaming replication protocol
+ *
+ * Author: Magnus Hagander <magnus@hagander.net>
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/pg_basebackup.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <unistd.h>
+#include <dirent.h>
+#include <limits.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <time.h>
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+#ifdef HAVE_LIBZ
+#include <zlib.h>
+#endif
+
+#include "access/xlog_internal.h"
+#include "backup/basebackup.h"
+#include "bbstreamer.h"
+#include "common/compression.h"
+#include "common/file_perm.h"
+#include "common/file_utils.h"
+#include "common/logging.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/recovery_gen.h"
+#include "getopt_long.h"
+#include "receivelog.h"
+#include "streamutil.h"
+
+#define ERRCODE_DATA_CORRUPTED "XX001"
+
+typedef struct TablespaceListCell
+{
+ struct TablespaceListCell *next;
+ char old_dir[MAXPGPATH];
+ char new_dir[MAXPGPATH];
+} TablespaceListCell;
+
+typedef struct TablespaceList
+{
+ TablespaceListCell *head;
+ TablespaceListCell *tail;
+} TablespaceList;
+
+typedef struct ArchiveStreamState
+{
+ int tablespacenum;
+ pg_compress_specification *compress;
+ bbstreamer *streamer;
+ bbstreamer *manifest_inject_streamer;
+ PQExpBuffer manifest_buffer;
+ char manifest_filename[MAXPGPATH];
+ FILE *manifest_file;
+} ArchiveStreamState;
+
+typedef struct WriteTarState
+{
+ int tablespacenum;
+ bbstreamer *streamer;
+} WriteTarState;
+
+typedef struct WriteManifestState
+{
+ char filename[MAXPGPATH];
+ FILE *file;
+} WriteManifestState;
+
+typedef void (*WriteDataCallback) (size_t nbytes, char *buf,
+ void *callback_data);
+
+/*
+ * pg_xlog has been renamed to pg_wal in version 10. This version number
+ * should be compared with PQserverVersion().
+ */
+#define MINIMUM_VERSION_FOR_PG_WAL 100000
+
+/*
+ * Temporary replication slots are supported from version 10.
+ */
+#define MINIMUM_VERSION_FOR_TEMP_SLOTS 100000
+
+/*
+ * Backup manifests are supported from version 13.
+ */
+#define MINIMUM_VERSION_FOR_MANIFESTS 130000
+
+/*
+ * Before v15, tar files received from the server will be improperly
+ * terminated.
+ */
+#define MINIMUM_VERSION_FOR_TERMINATED_TARFILE 150000
+
+/*
+ * Different ways to include WAL
+ */
+typedef enum
+{
+ NO_WAL,
+ FETCH_WAL,
+ STREAM_WAL
+} IncludeWal;
+
+/*
+ * Different places to perform compression
+ */
+typedef enum
+{
+ COMPRESS_LOCATION_UNSPECIFIED,
+ COMPRESS_LOCATION_CLIENT,
+ COMPRESS_LOCATION_SERVER
+} CompressionLocation;
+
+/* Global options */
+static char *basedir = NULL;
+static TablespaceList tablespace_dirs = {NULL, NULL};
+static char *xlog_dir = NULL;
+static char format = '\0'; /* p(lain)/t(ar) */
+static char *label = "pg_basebackup base backup";
+static bool noclean = false;
+static bool checksum_failure = false;
+static bool showprogress = false;
+static bool estimatesize = true;
+static int verbose = 0;
+static IncludeWal includewal = STREAM_WAL;
+static bool fastcheckpoint = false;
+static bool writerecoveryconf = false;
+static bool do_sync = true;
+static int standby_message_timeout = 10 * 1000; /* 10 sec = default */
+static pg_time_t last_progress_report = 0;
+static int32 maxrate = 0; /* no limit by default */
+static char *replication_slot = NULL;
+static bool temp_replication_slot = true;
+static char *backup_target = NULL;
+static bool create_slot = false;
+static bool no_slot = false;
+static bool verify_checksums = true;
+static bool manifest = true;
+static bool manifest_force_encode = false;
+static char *manifest_checksums = NULL;
+
+static bool success = false;
+static bool made_new_pgdata = false;
+static bool found_existing_pgdata = false;
+static bool made_new_xlogdir = false;
+static bool found_existing_xlogdir = false;
+static bool made_tablespace_dirs = false;
+static bool found_tablespace_dirs = false;
+
+/* Progress indicators */
+static uint64 totalsize_kb;
+static uint64 totaldone;
+static int tablespacecount;
+static char *progress_filename = NULL;
+
+/* Pipe to communicate with background wal receiver process */
+#ifndef WIN32
+static int bgpipe[2] = {-1, -1};
+#endif
+
+/* Handle to child process */
+static pid_t bgchild = -1;
+static bool in_log_streamer = false;
+
+/* Flag to indicate if child process exited unexpectedly */
+static volatile sig_atomic_t bgchild_exited = false;
+
+/* End position for xlog streaming, empty string if unknown yet */
+static XLogRecPtr xlogendptr;
+
+#ifndef WIN32
+static int has_xlogendptr = 0;
+#else
+static volatile LONG has_xlogendptr = 0;
+#endif
+
+/* Contents of configuration file to be generated */
+static PQExpBuffer recoveryconfcontents = NULL;
+
+/* Function headers */
+static void usage(void);
+static void verify_dir_is_empty_or_create(char *dirname, bool *created, bool *found);
+static void progress_update_filename(const char *filename);
+static void progress_report(int tablespacenum, bool force, bool finished);
+
+static bbstreamer *CreateBackupStreamer(char *archive_name, char *spclocation,
+ bbstreamer **manifest_inject_streamer_p,
+ bool is_recovery_guc_supported,
+ bool expect_unterminated_tarfile,
+ pg_compress_specification *compress);
+static void ReceiveArchiveStreamChunk(size_t r, char *copybuf,
+ void *callback_data);
+static char GetCopyDataByte(size_t r, char *copybuf, size_t *cursor);
+static char *GetCopyDataString(size_t r, char *copybuf, size_t *cursor);
+static uint64 GetCopyDataUInt64(size_t r, char *copybuf, size_t *cursor);
+static void GetCopyDataEnd(size_t r, char *copybuf, size_t cursor);
+static void ReportCopyDataParseError(size_t r, char *copybuf);
+static void ReceiveTarFile(PGconn *conn, char *archive_name, char *spclocation,
+ bool tablespacenum, pg_compress_specification *compress);
+static void ReceiveTarCopyChunk(size_t r, char *copybuf, void *callback_data);
+static void ReceiveBackupManifest(PGconn *conn);
+static void ReceiveBackupManifestChunk(size_t r, char *copybuf,
+ void *callback_data);
+static void ReceiveBackupManifestInMemory(PGconn *conn, PQExpBuffer buf);
+static void ReceiveBackupManifestInMemoryChunk(size_t r, char *copybuf,
+ void *callback_data);
+static void BaseBackup(char *compression_algorithm, char *compression_detail,
+ CompressionLocation compressloc,
+ pg_compress_specification *client_compress);
+
+static bool reached_end_position(XLogRecPtr segendpos, uint32 timeline,
+ bool segment_finished);
+
+static const char *get_tablespace_mapping(const char *dir);
+static void tablespace_list_append(const char *arg);
+
+
+static void
+cleanup_directories_atexit(void)
+{
+ if (success || in_log_streamer)
+ return;
+
+ if (!noclean && !checksum_failure)
+ {
+ if (made_new_pgdata)
+ {
+ pg_log_info("removing data directory \"%s\"", basedir);
+ if (!rmtree(basedir, true))
+ pg_log_error("failed to remove data directory");
+ }
+ else if (found_existing_pgdata)
+ {
+ pg_log_info("removing contents of data directory \"%s\"", basedir);
+ if (!rmtree(basedir, false))
+ pg_log_error("failed to remove contents of data directory");
+ }
+
+ if (made_new_xlogdir)
+ {
+ pg_log_info("removing WAL directory \"%s\"", xlog_dir);
+ if (!rmtree(xlog_dir, true))
+ pg_log_error("failed to remove WAL directory");
+ }
+ else if (found_existing_xlogdir)
+ {
+ pg_log_info("removing contents of WAL directory \"%s\"", xlog_dir);
+ if (!rmtree(xlog_dir, false))
+ pg_log_error("failed to remove contents of WAL directory");
+ }
+ }
+ else
+ {
+ if ((made_new_pgdata || found_existing_pgdata) && !checksum_failure)
+ pg_log_info("data directory \"%s\" not removed at user's request", basedir);
+
+ if (made_new_xlogdir || found_existing_xlogdir)
+ pg_log_info("WAL directory \"%s\" not removed at user's request", xlog_dir);
+ }
+
+ if ((made_tablespace_dirs || found_tablespace_dirs) && !checksum_failure)
+ pg_log_info("changes to tablespace directories will not be undone");
+}
+
+static void
+disconnect_atexit(void)
+{
+ if (conn != NULL)
+ PQfinish(conn);
+}
+
+#ifndef WIN32
+/*
+ * If the bgchild exits prematurely and raises a SIGCHLD signal, we can abort
+ * processing rather than wait until the backup has finished and error out at
+ * that time. On Windows, we use a background thread which can communicate
+ * without the need for a signal handler.
+ */
+static void
+sigchld_handler(SIGNAL_ARGS)
+{
+ bgchild_exited = true;
+}
+
+/*
+ * On windows, our background thread dies along with the process. But on
+ * Unix, if we have started a subprocess, we want to kill it off so it
+ * doesn't remain running trying to stream data.
+ */
+static void
+kill_bgchild_atexit(void)
+{
+ if (bgchild > 0 && !bgchild_exited)
+ kill(bgchild, SIGTERM);
+}
+#endif
+
+/*
+ * Split argument into old_dir and new_dir and append to tablespace mapping
+ * list.
+ */
+static void
+tablespace_list_append(const char *arg)
+{
+ TablespaceListCell *cell = (TablespaceListCell *) pg_malloc0(sizeof(TablespaceListCell));
+ char *dst;
+ char *dst_ptr;
+ const char *arg_ptr;
+
+ dst_ptr = dst = cell->old_dir;
+ for (arg_ptr = arg; *arg_ptr; arg_ptr++)
+ {
+ if (dst_ptr - dst >= MAXPGPATH)
+ pg_fatal("directory name too long");
+
+ if (*arg_ptr == '\\' && *(arg_ptr + 1) == '=')
+ ; /* skip backslash escaping = */
+ else if (*arg_ptr == '=' && (arg_ptr == arg || *(arg_ptr - 1) != '\\'))
+ {
+ if (*cell->new_dir)
+ pg_fatal("multiple \"=\" signs in tablespace mapping");
+ else
+ dst = dst_ptr = cell->new_dir;
+ }
+ else
+ *dst_ptr++ = *arg_ptr;
+ }
+
+ if (!*cell->old_dir || !*cell->new_dir)
+ pg_fatal("invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"", arg);
+
+ /*
+ * All tablespaces are created with absolute directories, so specifying a
+ * non-absolute path here would just never match, possibly confusing users.
+ * Since we don't know whether the remote side is Windows or not, and it
+ * might be different than the local side, permit any path that could be
+ * absolute under either set of rules.
+ *
+ * (There is little practical risk of confusion here, because someone
+ * running entirely on Linux isn't likely to have a relative path that
+ * begins with a backslash or something that looks like a drive
+ * specification. If they do, and they also incorrectly believe that
+ * a relative path is acceptable here, we'll silently fail to warn them
+ * of their mistake, and the -T option will just not get applied, same
+ * as if they'd specified -T for a nonexistent tablespace.)
+ */
+ if (!is_nonwindows_absolute_path(cell->old_dir) &&
+ !is_windows_absolute_path(cell->old_dir))
+ pg_fatal("old directory is not an absolute path in tablespace mapping: %s",
+ cell->old_dir);
+
+ if (!is_absolute_path(cell->new_dir))
+ pg_fatal("new directory is not an absolute path in tablespace mapping: %s",
+ cell->new_dir);
+
+ /*
+ * Comparisons done with these values should involve similarly
+ * canonicalized path values. This is particularly sensitive on Windows
+ * where path values may not necessarily use Unix slashes.
+ */
+ canonicalize_path(cell->old_dir);
+ canonicalize_path(cell->new_dir);
+
+ if (tablespace_dirs.tail)
+ tablespace_dirs.tail->next = cell;
+ else
+ tablespace_dirs.head = cell;
+ tablespace_dirs.tail = cell;
+}
+
+
+static void
+usage(void)
+{
+ printf(_("%s takes a base backup of a running PostgreSQL server.\n\n"),
+ progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]...\n"), progname);
+ printf(_("\nOptions controlling the output:\n"));
+ printf(_(" -D, --pgdata=DIRECTORY receive base backup into directory\n"));
+ printf(_(" -F, --format=p|t output format (plain (default), tar)\n"));
+ printf(_(" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+ " (in kB/s, or use suffix \"k\" or \"M\")\n"));
+ printf(_(" -R, --write-recovery-conf\n"
+ " write configuration for replication\n"));
+ printf(_(" -t, --target=TARGET[:DETAIL]\n"
+ " backup target (if other than client)\n"));
+ printf(_(" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+ " relocate tablespace in OLDDIR to NEWDIR\n"));
+ printf(_(" --waldir=WALDIR location for the write-ahead log directory\n"));
+ printf(_(" -X, --wal-method=none|fetch|stream\n"
+ " include required WAL files with specified method\n"));
+ printf(_(" -z, --gzip compress tar output\n"));
+ printf(_(" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+ " compress on client or server as specified\n"));
+ printf(_(" -Z, --compress=none do not compress tar output\n"));
+ printf(_("\nGeneral options:\n"));
+ printf(_(" -c, --checkpoint=fast|spread\n"
+ " set fast or spread checkpointing\n"));
+ printf(_(" -C, --create-slot create replication slot\n"));
+ printf(_(" -l, --label=LABEL set backup label\n"));
+ printf(_(" -n, --no-clean do not clean up after errors\n"));
+ printf(_(" -N, --no-sync do not wait for changes to be written safely to disk\n"));
+ printf(_(" -P, --progress show progress information\n"));
+ printf(_(" -S, --slot=SLOTNAME replication slot to use\n"));
+ printf(_(" -v, --verbose output verbose messages\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+ " use algorithm for manifest checksums\n"));
+ printf(_(" --manifest-force-encode\n"
+ " hex encode all file names in manifest\n"));
+ printf(_(" --no-estimate-size do not estimate backup size in server side\n"));
+ printf(_(" --no-manifest suppress generation of backup manifest\n"));
+ printf(_(" --no-slot prevent creation of temporary replication slot\n"));
+ printf(_(" --no-verify-checksums\n"
+ " do not verify checksums\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -d, --dbname=CONNSTR connection string\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port number\n"));
+ printf(_(" -s, --status-interval=INTERVAL\n"
+ " time between status packets sent to server (in seconds)\n"));
+ printf(_(" -U, --username=NAME connect as specified database user\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt (should happen automatically)\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+
+/*
+ * Called in the background process every time data is received.
+ * On Unix, we check to see if there is any data on our pipe
+ * (which would mean we have a stop position), and if it is, check if
+ * it is time to stop.
+ * On Windows, we are in a single process, so we can just check if it's
+ * time to stop.
+ */
+static bool
+reached_end_position(XLogRecPtr segendpos, uint32 timeline,
+ bool segment_finished)
+{
+ if (!has_xlogendptr)
+ {
+#ifndef WIN32
+ fd_set fds;
+ struct timeval tv;
+ int r;
+
+ /*
+ * Don't have the end pointer yet - check our pipe to see if it has
+ * been sent yet.
+ */
+ FD_ZERO(&fds);
+ FD_SET(bgpipe[0], &fds);
+
+ MemSet(&tv, 0, sizeof(tv));
+
+ r = select(bgpipe[0] + 1, &fds, NULL, NULL, &tv);
+ if (r == 1)
+ {
+ char xlogend[64];
+ uint32 hi,
+ lo;
+
+ MemSet(xlogend, 0, sizeof(xlogend));
+ r = read(bgpipe[0], xlogend, sizeof(xlogend) - 1);
+ if (r < 0)
+ pg_fatal("could not read from ready pipe: %m");
+
+ if (sscanf(xlogend, "%X/%X", &hi, &lo) != 2)
+ pg_fatal("could not parse write-ahead log location \"%s\"",
+ xlogend);
+ xlogendptr = ((uint64) hi) << 32 | lo;
+ has_xlogendptr = 1;
+
+ /*
+ * Fall through to check if we've reached the point further
+ * already.
+ */
+ }
+ else
+ {
+ /*
+ * No data received on the pipe means we don't know the end
+ * position yet - so just say it's not time to stop yet.
+ */
+ return false;
+ }
+#else
+
+ /*
+ * On win32, has_xlogendptr is set by the main thread, so if it's not
+ * set here, we just go back and wait until it shows up.
+ */
+ return false;
+#endif
+ }
+
+ /*
+ * At this point we have an end pointer, so compare it to the current
+ * position to figure out if it's time to stop.
+ */
+ if (segendpos >= xlogendptr)
+ return true;
+
+ /*
+ * Have end pointer, but haven't reached it yet - so tell the caller to
+ * keep streaming.
+ */
+ return false;
+}
+
+typedef struct
+{
+ PGconn *bgconn;
+ XLogRecPtr startptr;
+ char xlog[MAXPGPATH]; /* directory or tarfile depending on mode */
+ char *sysidentifier;
+ int timeline;
+ pg_compress_algorithm wal_compress_algorithm;
+ int wal_compress_level;
+} logstreamer_param;
+
+static int
+LogStreamerMain(logstreamer_param *param)
+{
+ StreamCtl stream;
+
+ in_log_streamer = true;
+
+ MemSet(&stream, 0, sizeof(stream));
+ stream.startpos = param->startptr;
+ stream.timeline = param->timeline;
+ stream.sysidentifier = param->sysidentifier;
+ stream.stream_stop = reached_end_position;
+#ifndef WIN32
+ stream.stop_socket = bgpipe[0];
+#else
+ stream.stop_socket = PGINVALID_SOCKET;
+#endif
+ stream.standby_message_timeout = standby_message_timeout;
+ stream.synchronous = false;
+ /* fsync happens at the end of pg_basebackup for all data */
+ stream.do_sync = false;
+ stream.mark_done = true;
+ stream.partial_suffix = NULL;
+ stream.replication_slot = replication_slot;
+ if (format == 'p')
+ stream.walmethod = CreateWalDirectoryMethod(param->xlog,
+ PG_COMPRESSION_NONE, 0,
+ stream.do_sync);
+ else
+ stream.walmethod = CreateWalTarMethod(param->xlog,
+ param->wal_compress_algorithm,
+ param->wal_compress_level,
+ stream.do_sync);
+
+ if (!ReceiveXlogStream(param->bgconn, &stream))
+ {
+ /*
+ * Any errors will already have been reported in the function process,
+ * but we need to tell the parent that we didn't shutdown in a nice
+ * way.
+ */
+#ifdef WIN32
+ /*
+ * In order to signal the main thread of an ungraceful exit we set the
+ * same flag that we use on Unix to signal SIGCHLD.
+ */
+ bgchild_exited = true;
+#endif
+ return 1;
+ }
+
+ if (!stream.walmethod->finish())
+ {
+ pg_log_error("could not finish writing WAL files: %m");
+#ifdef WIN32
+ bgchild_exited = true;
+#endif
+ return 1;
+ }
+
+ PQfinish(param->bgconn);
+
+ if (format == 'p')
+ FreeWalDirectoryMethod();
+ else
+ FreeWalTarMethod();
+ pg_free(stream.walmethod);
+
+ return 0;
+}
+
+/*
+ * Initiate background process for receiving xlog during the backup.
+ * The background stream will use its own database connection so we can
+ * stream the logfile in parallel with the backups.
+ */
+static void
+StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier,
+ pg_compress_algorithm wal_compress_algorithm,
+ int wal_compress_level)
+{
+ logstreamer_param *param;
+ uint32 hi,
+ lo;
+ char statusdir[MAXPGPATH];
+
+ param = pg_malloc0(sizeof(logstreamer_param));
+ param->timeline = timeline;
+ param->sysidentifier = sysidentifier;
+ param->wal_compress_algorithm = wal_compress_algorithm;
+ param->wal_compress_level = wal_compress_level;
+
+ /* Convert the starting position */
+ if (sscanf(startpos, "%X/%X", &hi, &lo) != 2)
+ pg_fatal("could not parse write-ahead log location \"%s\"",
+ startpos);
+ param->startptr = ((uint64) hi) << 32 | lo;
+ /* Round off to even segment position */
+ param->startptr -= XLogSegmentOffset(param->startptr, WalSegSz);
+
+#ifndef WIN32
+ /* Create our background pipe */
+ if (pipe(bgpipe) < 0)
+ pg_fatal("could not create pipe for background process: %m");
+#endif
+
+ /* Get a second connection */
+ param->bgconn = GetConnection();
+ if (!param->bgconn)
+ /* Error message already written in GetConnection() */
+ exit(1);
+
+ /* In post-10 cluster, pg_xlog has been renamed to pg_wal */
+ snprintf(param->xlog, sizeof(param->xlog), "%s/%s",
+ basedir,
+ PQserverVersion(conn) < MINIMUM_VERSION_FOR_PG_WAL ?
+ "pg_xlog" : "pg_wal");
+
+ /* Temporary replication slots are only supported in 10 and newer */
+ if (PQserverVersion(conn) < MINIMUM_VERSION_FOR_TEMP_SLOTS)
+ temp_replication_slot = false;
+
+ /*
+ * Create replication slot if requested
+ */
+ if (temp_replication_slot && !replication_slot)
+ replication_slot = psprintf("pg_basebackup_%u",
+ (unsigned int) PQbackendPID(param->bgconn));
+ if (temp_replication_slot || create_slot)
+ {
+ if (!CreateReplicationSlot(param->bgconn, replication_slot, NULL,
+ temp_replication_slot, true, true, false, false))
+ exit(1);
+
+ if (verbose)
+ {
+ if (temp_replication_slot)
+ pg_log_info("created temporary replication slot \"%s\"",
+ replication_slot);
+ else
+ pg_log_info("created replication slot \"%s\"",
+ replication_slot);
+ }
+ }
+
+ if (format == 'p')
+ {
+ /*
+ * Create pg_wal/archive_status or pg_xlog/archive_status (and thus
+ * pg_wal or pg_xlog) depending on the target server so we can write
+ * to basedir/pg_wal or basedir/pg_xlog as the directory entry in the
+ * tar file may arrive later.
+ */
+ snprintf(statusdir, sizeof(statusdir), "%s/%s/archive_status",
+ basedir,
+ PQserverVersion(conn) < MINIMUM_VERSION_FOR_PG_WAL ?
+ "pg_xlog" : "pg_wal");
+
+ if (pg_mkdir_p(statusdir, pg_dir_create_mode) != 0 && errno != EEXIST)
+ pg_fatal("could not create directory \"%s\": %m", statusdir);
+ }
+
+ /*
+ * Start a child process and tell it to start streaming. On Unix, this is
+ * a fork(). On Windows, we create a thread.
+ */
+#ifndef WIN32
+ bgchild = fork();
+ if (bgchild == 0)
+ {
+ /* in child process */
+ exit(LogStreamerMain(param));
+ }
+ else if (bgchild < 0)
+ pg_fatal("could not create background process: %m");
+
+ /*
+ * Else we are in the parent process and all is well.
+ */
+ atexit(kill_bgchild_atexit);
+#else /* WIN32 */
+ bgchild = _beginthreadex(NULL, 0, (void *) LogStreamerMain, param, 0, NULL);
+ if (bgchild == 0)
+ pg_fatal("could not create background thread: %m");
+#endif
+}
+
+/*
+ * Verify that the given directory exists and is empty. If it does not
+ * exist, it is created. If it exists but is not empty, an error will
+ * be given and the process ended.
+ */
+static void
+verify_dir_is_empty_or_create(char *dirname, bool *created, bool *found)
+{
+ switch (pg_check_dir(dirname))
+ {
+ case 0:
+
+ /*
+ * Does not exist, so create
+ */
+ if (pg_mkdir_p(dirname, pg_dir_create_mode) == -1)
+ pg_fatal("could not create directory \"%s\": %m", dirname);
+ if (created)
+ *created = true;
+ return;
+ case 1:
+
+ /*
+ * Exists, empty
+ */
+ if (found)
+ *found = true;
+ return;
+ case 2:
+ case 3:
+ case 4:
+
+ /*
+ * Exists, not empty
+ */
+ pg_fatal("directory \"%s\" exists but is not empty", dirname);
+ case -1:
+
+ /*
+ * Access problem
+ */
+ pg_fatal("could not access directory \"%s\": %m", dirname);
+ }
+}
+
+/*
+ * Callback to update our notion of the current filename.
+ *
+ * No other code should modify progress_filename!
+ */
+static void
+progress_update_filename(const char *filename)
+{
+ /* We needn't maintain this variable if not doing verbose reports. */
+ if (showprogress && verbose)
+ {
+ if (progress_filename)
+ free(progress_filename);
+ if (filename)
+ progress_filename = pg_strdup(filename);
+ else
+ progress_filename = NULL;
+ }
+}
+
+/*
+ * Print a progress report based on the global variables. If verbose output
+ * is enabled, also print the current file name.
+ *
+ * Progress report is written at maximum once per second, unless the force
+ * parameter is set to true.
+ *
+ * If finished is set to true, this is the last progress report. The cursor
+ * is moved to the next line.
+ */
+static void
+progress_report(int tablespacenum, bool force, bool finished)
+{
+ int percent;
+ char totaldone_str[32];
+ char totalsize_str[32];
+ pg_time_t now;
+
+ if (!showprogress)
+ return;
+
+ now = time(NULL);
+ if (now == last_progress_report && !force && !finished)
+ return; /* Max once per second */
+
+ last_progress_report = now;
+ percent = totalsize_kb ? (int) ((totaldone / 1024) * 100 / totalsize_kb) : 0;
+
+ /*
+ * Avoid overflowing past 100% or the full size. This may make the total
+ * size number change as we approach the end of the backup (the estimate
+ * will always be wrong if WAL is included), but that's better than having
+ * the done column be bigger than the total.
+ */
+ if (percent > 100)
+ percent = 100;
+ if (totaldone / 1024 > totalsize_kb)
+ totalsize_kb = totaldone / 1024;
+
+ snprintf(totaldone_str, sizeof(totaldone_str), UINT64_FORMAT,
+ totaldone / 1024);
+ snprintf(totalsize_str, sizeof(totalsize_str), UINT64_FORMAT, totalsize_kb);
+
+#define VERBOSE_FILENAME_LENGTH 35
+ if (verbose)
+ {
+ if (!progress_filename)
+
+ /*
+ * No filename given, so clear the status line (used for last
+ * call)
+ */
+ fprintf(stderr,
+ ngettext("%*s/%s kB (100%%), %d/%d tablespace %*s",
+ "%*s/%s kB (100%%), %d/%d tablespaces %*s",
+ tablespacecount),
+ (int) strlen(totalsize_str),
+ totaldone_str, totalsize_str,
+ tablespacenum, tablespacecount,
+ VERBOSE_FILENAME_LENGTH + 5, "");
+ else
+ {
+ bool truncate = (strlen(progress_filename) > VERBOSE_FILENAME_LENGTH);
+
+ fprintf(stderr,
+ ngettext("%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)",
+ "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)",
+ tablespacecount),
+ (int) strlen(totalsize_str),
+ totaldone_str, totalsize_str, percent,
+ tablespacenum, tablespacecount,
+ /* Prefix with "..." if we do leading truncation */
+ truncate ? "..." : "",
+ truncate ? VERBOSE_FILENAME_LENGTH - 3 : VERBOSE_FILENAME_LENGTH,
+ truncate ? VERBOSE_FILENAME_LENGTH - 3 : VERBOSE_FILENAME_LENGTH,
+ /* Truncate filename at beginning if it's too long */
+ truncate ? progress_filename + strlen(progress_filename) - VERBOSE_FILENAME_LENGTH + 3 : progress_filename);
+ }
+ }
+ else
+ fprintf(stderr,
+ ngettext("%*s/%s kB (%d%%), %d/%d tablespace",
+ "%*s/%s kB (%d%%), %d/%d tablespaces",
+ tablespacecount),
+ (int) strlen(totalsize_str),
+ totaldone_str, totalsize_str, percent,
+ tablespacenum, tablespacecount);
+
+ /*
+ * Stay on the same line if reporting to a terminal and we're not done
+ * yet.
+ */
+ fputc((!finished && isatty(fileno(stderr))) ? '\r' : '\n', stderr);
+}
+
+static int32
+parse_max_rate(char *src)
+{
+ double result;
+ char *after_num;
+ char *suffix = NULL;
+
+ errno = 0;
+ result = strtod(src, &after_num);
+ if (src == after_num)
+ pg_fatal("transfer rate \"%s\" is not a valid value", src);
+ if (errno != 0)
+ pg_fatal("invalid transfer rate \"%s\": %m", src);
+
+ if (result <= 0)
+ {
+ /*
+ * Reject obviously wrong values here.
+ */
+ pg_fatal("transfer rate must be greater than zero");
+ }
+
+ /*
+ * Evaluate suffix, after skipping over possible whitespace. Lack of
+ * suffix means kilobytes.
+ */
+ while (*after_num != '\0' && isspace((unsigned char) *after_num))
+ after_num++;
+
+ if (*after_num != '\0')
+ {
+ suffix = after_num;
+ if (*after_num == 'k')
+ {
+ /* kilobyte is the expected unit. */
+ after_num++;
+ }
+ else if (*after_num == 'M')
+ {
+ after_num++;
+ result *= 1024.0;
+ }
+ }
+
+ /* The rest can only consist of white space. */
+ while (*after_num != '\0' && isspace((unsigned char) *after_num))
+ after_num++;
+
+ if (*after_num != '\0')
+ pg_fatal("invalid --max-rate unit: \"%s\"", suffix);
+
+ /* Valid integer? */
+ if ((uint64) result != (uint64) ((uint32) result))
+ pg_fatal("transfer rate \"%s\" exceeds integer range", src);
+
+ /*
+ * The range is checked on the server side too, but avoid the server
+ * connection if a nonsensical value was passed.
+ */
+ if (result < MAX_RATE_LOWER || result > MAX_RATE_UPPER)
+ pg_fatal("transfer rate \"%s\" is out of range", src);
+
+ return (int32) result;
+}
+
+/*
+ * Basic parsing of a value specified for -Z/--compress.
+ *
+ * We're not concerned here with understanding exactly what behavior the
+ * user wants, but we do need to know whether the user is requesting client
+ * or server side compression or leaving it unspecified, and we need to
+ * separate the name of the compression algorithm from the detail string.
+ *
+ * For instance, if the user writes --compress client-lz4:6, we want to
+ * separate that into (a) client-side compression, (b) algorithm "lz4",
+ * and (c) detail "6". Note, however, that all the client/server prefix is
+ * optional, and so is the detail. The algorithm name is required, unless
+ * the whole string is an integer, in which case we assume "gzip" as the
+ * algorithm and use the integer as the detail.
+ *
+ * We're not concerned with validation at this stage, so if the user writes
+ * --compress client-turkey:sandwich, the requested algorithm is "turkey"
+ * and the detail string is "sandwich". We'll sort out whether that's legal
+ * at a later stage.
+ */
+static void
+parse_compress_options(char *option, char **algorithm, char **detail,
+ CompressionLocation *locationres)
+{
+ char *sep;
+ char *endp;
+
+ /*
+ * Check whether the compression specification consists of a bare integer.
+ *
+ * If so, for backward compatibility, assume gzip.
+ */
+ (void) strtol(option, &endp, 10);
+ if (*endp == '\0')
+ {
+ *locationres = COMPRESS_LOCATION_UNSPECIFIED;
+ *algorithm = pstrdup("gzip");
+ *detail = pstrdup(option);
+ return;
+ }
+
+ /* Strip off any "client-" or "server-" prefix. */
+ if (strncmp(option, "server-", 7) == 0)
+ {
+ *locationres = COMPRESS_LOCATION_SERVER;
+ option += 7;
+ }
+ else if (strncmp(option, "client-", 7) == 0)
+ {
+ *locationres = COMPRESS_LOCATION_CLIENT;
+ option += 7;
+ }
+ else
+ *locationres = COMPRESS_LOCATION_UNSPECIFIED;
+
+ /*
+ * Check whether there is a compression detail following the algorithm
+ * name.
+ */
+ sep = strchr(option, ':');
+ if (sep == NULL)
+ {
+ *algorithm = pstrdup(option);
+ *detail = NULL;
+ }
+ else
+ {
+ char *alg;
+
+ alg = palloc((sep - option) + 1);
+ memcpy(alg, option, sep - option);
+ alg[sep - option] = '\0';
+
+ *algorithm = alg;
+ *detail = pstrdup(sep + 1);
+ }
+}
+
+/*
+ * Read a stream of COPY data and invoke the provided callback for each
+ * chunk.
+ */
+static void
+ReceiveCopyData(PGconn *conn, WriteDataCallback callback,
+ void *callback_data)
+{
+ PGresult *res;
+
+ /* Get the COPY data stream. */
+ res = PQgetResult(conn);
+ if (PQresultStatus(res) != PGRES_COPY_OUT)
+ pg_fatal("could not get COPY data stream: %s",
+ PQerrorMessage(conn));
+ PQclear(res);
+
+ /* Loop over chunks until done. */
+ while (1)
+ {
+ int r;
+ char *copybuf;
+
+ r = PQgetCopyData(conn, &copybuf, 0);
+ if (r == -1)
+ {
+ /* End of chunk. */
+ break;
+ }
+ else if (r == -2)
+ pg_fatal("could not read COPY data: %s",
+ PQerrorMessage(conn));
+
+ if (bgchild_exited)
+ pg_fatal("background process terminated unexpectedly");
+
+ (*callback) (r, copybuf, callback_data);
+
+ PQfreemem(copybuf);
+ }
+}
+
+/*
+ * Figure out what to do with an archive received from the server based on
+ * the options selected by the user. We may just write the results directly
+ * to a file, or we might compress first, or we might extract the tar file
+ * and write each member separately. This function doesn't do any of that
+ * directly, but it works out what kind of bbstreamer we need to create so
+ * that the right stuff happens when, down the road, we actually receive
+ * the data.
+ */
+static bbstreamer *
+CreateBackupStreamer(char *archive_name, char *spclocation,
+ bbstreamer **manifest_inject_streamer_p,
+ bool is_recovery_guc_supported,
+ bool expect_unterminated_tarfile,
+ pg_compress_specification *compress)
+{
+ bbstreamer *streamer = NULL;
+ bbstreamer *manifest_inject_streamer = NULL;
+ bool inject_manifest;
+ bool is_tar,
+ is_tar_gz,
+ is_tar_lz4,
+ is_tar_zstd,
+ is_compressed_tar;
+ bool must_parse_archive;
+ int archive_name_len = strlen(archive_name);
+
+ /*
+ * Normally, we emit the backup manifest as a separate file, but when
+ * we're writing a tarfile to stdout, we don't have that option, so
+ * include it in the one tarfile we've got.
+ */
+ inject_manifest = (format == 't' && strcmp(basedir, "-") == 0 && manifest);
+
+ /* Is this a tar archive? */
+ is_tar = (archive_name_len > 4 &&
+ strcmp(archive_name + archive_name_len - 4, ".tar") == 0);
+
+ /* Is this a .tar.gz archive? */
+ is_tar_gz = (archive_name_len > 7 &&
+ strcmp(archive_name + archive_name_len - 7, ".tar.gz") == 0);
+
+ /* Is this a .tar.lz4 archive? */
+ is_tar_lz4 = (archive_name_len > 8 &&
+ strcmp(archive_name + archive_name_len - 8, ".tar.lz4") == 0);
+
+ /* Is this a .tar.zst archive? */
+ is_tar_zstd = (archive_name_len > 8 &&
+ strcmp(archive_name + archive_name_len - 8, ".tar.zst") == 0);
+
+ /* Is this any kind of compressed tar? */
+ is_compressed_tar = is_tar_gz || is_tar_lz4 || is_tar_zstd;
+
+ /*
+ * Injecting the manifest into a compressed tar file would be possible if
+ * we decompressed it, parsed the tarfile, generated a new tarfile, and
+ * recompressed it, but compressing and decompressing multiple times just
+ * to inject the manifest seems inefficient enough that it's probably not
+ * what the user wants. So, instead, reject the request and tell the user
+ * to specify something more reasonable.
+ */
+ if (inject_manifest && is_compressed_tar)
+ {
+ pg_log_error("cannot inject manifest into a compressed tar file");
+ pg_log_error_hint("Use client-side compression, send the output to a directory rather than standard output, or use %s.",
+ "--no-manifest");
+ exit(1);
+ }
+
+ /*
+ * We have to parse the archive if (1) we're suppose to extract it, or if
+ * (2) we need to inject backup_manifest or recovery configuration into
+ * it. However, we only know how to parse tar archives.
+ */
+ must_parse_archive = (format == 'p' || inject_manifest ||
+ (spclocation == NULL && writerecoveryconf));
+
+ /* At present, we only know how to parse tar archives. */
+ if (must_parse_archive && !is_tar && !is_compressed_tar)
+ {
+ pg_log_error("cannot parse archive \"%s\"", archive_name);
+ pg_log_error_detail("Only tar archives can be parsed.");
+ if (format == 'p')
+ pg_log_error_detail("Plain format requires pg_basebackup to parse the archive.");
+ if (inject_manifest)
+ pg_log_error_detail("Using - as the output directory requires pg_basebackup to parse the archive.");
+ if (writerecoveryconf)
+ pg_log_error_detail("The -R option requires pg_basebackup to parse the archive.");
+ exit(1);
+ }
+
+ if (format == 'p')
+ {
+ const char *directory;
+
+ /*
+ * In plain format, we must extract the archive. The data for the main
+ * tablespace will be written to the base directory, and the data for
+ * other tablespaces will be written to the directory where they're
+ * located on the server, after applying any user-specified tablespace
+ * mappings.
+ */
+ directory = spclocation == NULL ? basedir
+ : get_tablespace_mapping(spclocation);
+ streamer = bbstreamer_extractor_new(directory,
+ get_tablespace_mapping,
+ progress_update_filename);
+ }
+ else
+ {
+ FILE *archive_file;
+ char archive_filename[MAXPGPATH];
+
+ /*
+ * In tar format, we just write the archive without extracting it.
+ * Normally, we write it to the archive name provided by the caller,
+ * but when the base directory is "-" that means we need to write to
+ * standard output.
+ */
+ if (strcmp(basedir, "-") == 0)
+ {
+ snprintf(archive_filename, sizeof(archive_filename), "-");
+ archive_file = stdout;
+ }
+ else
+ {
+ snprintf(archive_filename, sizeof(archive_filename),
+ "%s/%s", basedir, archive_name);
+ archive_file = NULL;
+ }
+
+ if (compress->algorithm == PG_COMPRESSION_NONE)
+ streamer = bbstreamer_plain_writer_new(archive_filename,
+ archive_file);
+ else if (compress->algorithm == PG_COMPRESSION_GZIP)
+ {
+ strlcat(archive_filename, ".gz", sizeof(archive_filename));
+ streamer = bbstreamer_gzip_writer_new(archive_filename,
+ archive_file, compress);
+ }
+ else if (compress->algorithm == PG_COMPRESSION_LZ4)
+ {
+ strlcat(archive_filename, ".lz4", sizeof(archive_filename));
+ streamer = bbstreamer_plain_writer_new(archive_filename,
+ archive_file);
+ streamer = bbstreamer_lz4_compressor_new(streamer, compress);
+ }
+ else if (compress->algorithm == PG_COMPRESSION_ZSTD)
+ {
+ strlcat(archive_filename, ".zst", sizeof(archive_filename));
+ streamer = bbstreamer_plain_writer_new(archive_filename,
+ archive_file);
+ streamer = bbstreamer_zstd_compressor_new(streamer, compress);
+ }
+ else
+ {
+ Assert(false); /* not reachable */
+ }
+
+ /*
+ * If we need to parse the archive for whatever reason, then we'll
+ * also need to re-archive, because, if the output format is tar, the
+ * only point of parsing the archive is to be able to inject stuff
+ * into it.
+ */
+ if (must_parse_archive)
+ streamer = bbstreamer_tar_archiver_new(streamer);
+ progress_update_filename(archive_filename);
+ }
+
+ /*
+ * If we're supposed to inject the backup manifest into the results, it
+ * should be done here, so that the file content can be injected directly,
+ * without worrying about the details of the tar format.
+ */
+ if (inject_manifest)
+ manifest_inject_streamer = streamer;
+
+ /*
+ * If this is the main tablespace and we're supposed to write recovery
+ * information, arrange to do that.
+ */
+ if (spclocation == NULL && writerecoveryconf)
+ {
+ Assert(must_parse_archive);
+ streamer = bbstreamer_recovery_injector_new(streamer,
+ is_recovery_guc_supported,
+ recoveryconfcontents);
+ }
+
+ /*
+ * If we're doing anything that involves understanding the contents of the
+ * archive, we'll need to parse it. If not, we can skip parsing it, but
+ * old versions of the server send improperly terminated tarfiles, so if
+ * we're talking to such a server we'll need to add the terminator here.
+ */
+ if (must_parse_archive)
+ streamer = bbstreamer_tar_parser_new(streamer);
+ else if (expect_unterminated_tarfile)
+ streamer = bbstreamer_tar_terminator_new(streamer);
+
+ /*
+ * If the user has requested a server compressed archive along with
+ * archive extraction at client then we need to decompress it.
+ */
+ if (format == 'p')
+ {
+ if (is_tar_gz)
+ streamer = bbstreamer_gzip_decompressor_new(streamer);
+ else if (is_tar_lz4)
+ streamer = bbstreamer_lz4_decompressor_new(streamer);
+ else if (is_tar_zstd)
+ streamer = bbstreamer_zstd_decompressor_new(streamer);
+ }
+
+ /* Return the results. */
+ *manifest_inject_streamer_p = manifest_inject_streamer;
+ return streamer;
+}
+
+/*
+ * Receive all of the archives the server wants to send - and the backup
+ * manifest if present - as a single COPY stream.
+ */
+static void
+ReceiveArchiveStream(PGconn *conn, pg_compress_specification *compress)
+{
+ ArchiveStreamState state;
+
+ /* Set up initial state. */
+ memset(&state, 0, sizeof(state));
+ state.tablespacenum = -1;
+ state.compress = compress;
+
+ /* All the real work happens in ReceiveArchiveStreamChunk. */
+ ReceiveCopyData(conn, ReceiveArchiveStreamChunk, &state);
+
+ /* If we wrote the backup manifest to a file, close the file. */
+ if (state.manifest_file !=NULL)
+ {
+ fclose(state.manifest_file);
+ state.manifest_file = NULL;
+ }
+
+ /*
+ * If we buffered the backup manifest in order to inject it into the
+ * output tarfile, do that now.
+ */
+ if (state.manifest_inject_streamer != NULL &&
+ state.manifest_buffer != NULL)
+ {
+ bbstreamer_inject_file(state.manifest_inject_streamer,
+ "backup_manifest",
+ state.manifest_buffer->data,
+ state.manifest_buffer->len);
+ destroyPQExpBuffer(state.manifest_buffer);
+ state.manifest_buffer = NULL;
+ }
+
+ /* If there's still an archive in progress, end processing. */
+ if (state.streamer != NULL)
+ {
+ bbstreamer_finalize(state.streamer);
+ bbstreamer_free(state.streamer);
+ state.streamer = NULL;
+ }
+}
+
+/*
+ * Receive one chunk of data sent by the server as part of a single COPY
+ * stream that includes all archives and the manifest.
+ */
+static void
+ReceiveArchiveStreamChunk(size_t r, char *copybuf, void *callback_data)
+{
+ ArchiveStreamState *state = callback_data;
+ size_t cursor = 0;
+
+ /* Each CopyData message begins with a type byte. */
+ switch (GetCopyDataByte(r, copybuf, &cursor))
+ {
+ case 'n':
+ {
+ /* New archive. */
+ char *archive_name;
+ char *spclocation;
+
+ /*
+ * We force a progress report at the end of each tablespace. A
+ * new tablespace starts when the previous one ends, except in
+ * the case of the very first one.
+ */
+ if (++state->tablespacenum > 0)
+ progress_report(state->tablespacenum, true, false);
+
+ /* Sanity check. */
+ if (state->manifest_buffer != NULL ||
+ state->manifest_file !=NULL)
+ pg_fatal("archives must precede manifest");
+
+ /* Parse the rest of the CopyData message. */
+ archive_name = GetCopyDataString(r, copybuf, &cursor);
+ spclocation = GetCopyDataString(r, copybuf, &cursor);
+ GetCopyDataEnd(r, copybuf, cursor);
+
+ /*
+ * Basic sanity checks on the archive name: it shouldn't be
+ * empty, it shouldn't start with a dot, and it shouldn't
+ * contain a path separator.
+ */
+ if (archive_name[0] == '\0' || archive_name[0] == '.' ||
+ strchr(archive_name, '/') != NULL ||
+ strchr(archive_name, '\\') != NULL)
+ pg_fatal("invalid archive name: \"%s\"",
+ archive_name);
+
+ /*
+ * An empty spclocation is treated as NULL. We expect this
+ * case to occur for the data directory itself, but not for
+ * any archives that correspond to tablespaces.
+ */
+ if (spclocation[0] == '\0')
+ spclocation = NULL;
+
+ /* End processing of any prior archive. */
+ if (state->streamer != NULL)
+ {
+ bbstreamer_finalize(state->streamer);
+ bbstreamer_free(state->streamer);
+ state->streamer = NULL;
+ }
+
+ /*
+ * Create an appropriate backup streamer, unless a backup
+ * target was specified. In that case, it's up to the server
+ * to put the backup wherever it needs to go.
+ */
+ if (backup_target == NULL)
+ {
+ /*
+ * We know that recovery GUCs are supported, because this
+ * protocol can only be used on v15+.
+ */
+ state->streamer =
+ CreateBackupStreamer(archive_name,
+ spclocation,
+ &state->manifest_inject_streamer,
+ true, false,
+ state->compress);
+ }
+ break;
+ }
+
+ case 'd':
+ {
+ /* Archive or manifest data. */
+ if (state->manifest_buffer != NULL)
+ {
+ /* Manifest data, buffer in memory. */
+ appendPQExpBuffer(state->manifest_buffer, copybuf + 1,
+ r - 1);
+ }
+ else if (state->manifest_file !=NULL)
+ {
+ /* Manifest data, write to disk. */
+ if (fwrite(copybuf + 1, r - 1, 1,
+ state->manifest_file) != 1)
+ {
+ /*
+ * If fwrite() didn't set errno, assume that the
+ * problem is that we're out of disk space.
+ */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to file \"%s\": %m",
+ state->manifest_filename);
+ }
+ }
+ else if (state->streamer != NULL)
+ {
+ /* Archive data. */
+ bbstreamer_content(state->streamer, NULL, copybuf + 1,
+ r - 1, BBSTREAMER_UNKNOWN);
+ }
+ else
+ pg_fatal("unexpected payload data");
+ break;
+ }
+
+ case 'p':
+ {
+ /*
+ * Progress report.
+ *
+ * The remainder of the message is expected to be an 8-byte
+ * count of bytes completed.
+ */
+ totaldone = GetCopyDataUInt64(r, copybuf, &cursor);
+ GetCopyDataEnd(r, copybuf, cursor);
+
+ /*
+ * The server shouldn't send progress report messages too
+ * often, so we force an update each time we receive one.
+ */
+ progress_report(state->tablespacenum, true, false);
+ break;
+ }
+
+ case 'm':
+ {
+ /*
+ * Manifest data will be sent next. This message is not
+ * expected to have any further payload data.
+ */
+ GetCopyDataEnd(r, copybuf, cursor);
+
+ /*
+ * If a backup target was specified, figuring out where to put
+ * the manifest is the server's problem. Otherwise, we need to
+ * deal with it.
+ */
+ if (backup_target == NULL)
+ {
+ /*
+ * If we're supposed inject the manifest into the archive,
+ * we prepare to buffer it in memory; otherwise, we
+ * prepare to write it to a temporary file.
+ */
+ if (state->manifest_inject_streamer != NULL)
+ state->manifest_buffer = createPQExpBuffer();
+ else
+ {
+ snprintf(state->manifest_filename,
+ sizeof(state->manifest_filename),
+ "%s/backup_manifest.tmp", basedir);
+ state->manifest_file =
+ fopen(state->manifest_filename, "wb");
+ if (state->manifest_file == NULL)
+ pg_fatal("could not create file \"%s\": %m",
+ state->manifest_filename);
+ }
+ }
+ break;
+ }
+
+ default:
+ ReportCopyDataParseError(r, copybuf);
+ break;
+ }
+}
+
+/*
+ * Get a single byte from a CopyData message.
+ *
+ * Bail out if none remain.
+ */
+static char
+GetCopyDataByte(size_t r, char *copybuf, size_t *cursor)
+{
+ if (*cursor >= r)
+ ReportCopyDataParseError(r, copybuf);
+
+ return copybuf[(*cursor)++];
+}
+
+/*
+ * Get a NUL-terminated string from a CopyData message.
+ *
+ * Bail out if the terminating NUL cannot be found.
+ */
+static char *
+GetCopyDataString(size_t r, char *copybuf, size_t *cursor)
+{
+ size_t startpos = *cursor;
+ size_t endpos = startpos;
+
+ while (1)
+ {
+ if (endpos >= r)
+ ReportCopyDataParseError(r, copybuf);
+ if (copybuf[endpos] == '\0')
+ break;
+ ++endpos;
+ }
+
+ *cursor = endpos + 1;
+ return &copybuf[startpos];
+}
+
+/*
+ * Get an unsigned 64-bit integer from a CopyData message.
+ *
+ * Bail out if there are not at least 8 bytes remaining.
+ */
+static uint64
+GetCopyDataUInt64(size_t r, char *copybuf, size_t *cursor)
+{
+ uint64 result;
+
+ if (*cursor + sizeof(uint64) > r)
+ ReportCopyDataParseError(r, copybuf);
+ memcpy(&result, &copybuf[*cursor], sizeof(uint64));
+ *cursor += sizeof(uint64);
+ return pg_ntoh64(result);
+}
+
+/*
+ * Bail out if we didn't parse the whole message.
+ */
+static void
+GetCopyDataEnd(size_t r, char *copybuf, size_t cursor)
+{
+ if (r != cursor)
+ ReportCopyDataParseError(r, copybuf);
+}
+
+/*
+ * Report failure to parse a CopyData message from the server. Then exit.
+ *
+ * As a debugging aid, we try to give some hint about what kind of message
+ * provoked the failure. Perhaps this is not detailed enough, but it's not
+ * clear that it's worth expending any more code on what should be a
+ * can't-happen case.
+ */
+static void
+ReportCopyDataParseError(size_t r, char *copybuf)
+{
+ if (r == 0)
+ pg_fatal("empty COPY message");
+ else
+ pg_fatal("malformed COPY message of type %d, length %zu",
+ copybuf[0], r);
+}
+
+/*
+ * Receive raw tar data from the server, and stream it to the appropriate
+ * location. If we're writing a single tarfile to standard output, also
+ * receive the backup manifest and inject it into that tarfile.
+ */
+static void
+ReceiveTarFile(PGconn *conn, char *archive_name, char *spclocation,
+ bool tablespacenum, pg_compress_specification *compress)
+{
+ WriteTarState state;
+ bbstreamer *manifest_inject_streamer;
+ bool is_recovery_guc_supported;
+ bool expect_unterminated_tarfile;
+
+ /* Pass all COPY data through to the backup streamer. */
+ memset(&state, 0, sizeof(state));
+ is_recovery_guc_supported =
+ PQserverVersion(conn) >= MINIMUM_VERSION_FOR_RECOVERY_GUC;
+ expect_unterminated_tarfile =
+ PQserverVersion(conn) < MINIMUM_VERSION_FOR_TERMINATED_TARFILE;
+ state.streamer = CreateBackupStreamer(archive_name, spclocation,
+ &manifest_inject_streamer,
+ is_recovery_guc_supported,
+ expect_unterminated_tarfile,
+ compress);
+ state.tablespacenum = tablespacenum;
+ ReceiveCopyData(conn, ReceiveTarCopyChunk, &state);
+ progress_update_filename(NULL);
+
+ /*
+ * The decision as to whether we need to inject the backup manifest into
+ * the output at this stage is made by CreateBackupStreamer; if that is
+ * needed, manifest_inject_streamer will be non-NULL; otherwise, it will
+ * be NULL.
+ */
+ if (manifest_inject_streamer != NULL)
+ {
+ PQExpBufferData buf;
+
+ /* Slurp the entire backup manifest into a buffer. */
+ initPQExpBuffer(&buf);
+ ReceiveBackupManifestInMemory(conn, &buf);
+ if (PQExpBufferDataBroken(buf))
+ pg_fatal("out of memory");
+
+ /* Inject it into the output tarfile. */
+ bbstreamer_inject_file(manifest_inject_streamer, "backup_manifest",
+ buf.data, buf.len);
+
+ /* Free memory. */
+ termPQExpBuffer(&buf);
+ }
+
+ /* Cleanup. */
+ bbstreamer_finalize(state.streamer);
+ bbstreamer_free(state.streamer);
+
+ progress_report(tablespacenum, true, false);
+
+ /*
+ * Do not sync the resulting tar file yet, all files are synced once at
+ * the end.
+ */
+}
+
+/*
+ * Receive one chunk of tar-format data from the server.
+ */
+static void
+ReceiveTarCopyChunk(size_t r, char *copybuf, void *callback_data)
+{
+ WriteTarState *state = callback_data;
+
+ bbstreamer_content(state->streamer, NULL, copybuf, r, BBSTREAMER_UNKNOWN);
+
+ totaldone += r;
+ progress_report(state->tablespacenum, false, false);
+}
+
+
+/*
+ * Retrieve tablespace path, either relocated or original depending on whether
+ * -T was passed or not.
+ */
+static const char *
+get_tablespace_mapping(const char *dir)
+{
+ TablespaceListCell *cell;
+ char canon_dir[MAXPGPATH];
+
+ /* Canonicalize path for comparison consistency */
+ strlcpy(canon_dir, dir, sizeof(canon_dir));
+ canonicalize_path(canon_dir);
+
+ for (cell = tablespace_dirs.head; cell; cell = cell->next)
+ if (strcmp(canon_dir, cell->old_dir) == 0)
+ return cell->new_dir;
+
+ return dir;
+}
+
+/*
+ * Receive the backup manifest file and write it out to a file.
+ */
+static void
+ReceiveBackupManifest(PGconn *conn)
+{
+ WriteManifestState state;
+
+ snprintf(state.filename, sizeof(state.filename),
+ "%s/backup_manifest.tmp", basedir);
+ state.file = fopen(state.filename, "wb");
+ if (state.file == NULL)
+ pg_fatal("could not create file \"%s\": %m", state.filename);
+
+ ReceiveCopyData(conn, ReceiveBackupManifestChunk, &state);
+
+ fclose(state.file);
+}
+
+/*
+ * Receive one chunk of the backup manifest file and write it out to a file.
+ */
+static void
+ReceiveBackupManifestChunk(size_t r, char *copybuf, void *callback_data)
+{
+ WriteManifestState *state = callback_data;
+
+ errno = 0;
+ if (fwrite(copybuf, r, 1, state->file) != 1)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to file \"%s\": %m", state->filename);
+ }
+}
+
+/*
+ * Receive the backup manifest file and write it out to a file.
+ */
+static void
+ReceiveBackupManifestInMemory(PGconn *conn, PQExpBuffer buf)
+{
+ ReceiveCopyData(conn, ReceiveBackupManifestInMemoryChunk, buf);
+}
+
+/*
+ * Receive one chunk of the backup manifest file and write it out to a file.
+ */
+static void
+ReceiveBackupManifestInMemoryChunk(size_t r, char *copybuf,
+ void *callback_data)
+{
+ PQExpBuffer buf = callback_data;
+
+ appendPQExpBuffer(buf, copybuf, r);
+}
+
+static void
+BaseBackup(char *compression_algorithm, char *compression_detail,
+ CompressionLocation compressloc, pg_compress_specification *client_compress)
+{
+ PGresult *res;
+ char *sysidentifier;
+ TimeLineID latesttli;
+ TimeLineID starttli;
+ char *basebkp;
+ int i;
+ char xlogstart[64];
+ char xlogend[64];
+ int minServerMajor,
+ maxServerMajor;
+ int serverVersion,
+ serverMajor;
+ int writing_to_stdout;
+ bool use_new_option_syntax = false;
+ PQExpBufferData buf;
+
+ Assert(conn != NULL);
+ initPQExpBuffer(&buf);
+
+ /*
+ * Check server version. BASE_BACKUP command was introduced in 9.1, so we
+ * can't work with servers older than 9.1.
+ */
+ minServerMajor = 901;
+ maxServerMajor = PG_VERSION_NUM / 100;
+ serverVersion = PQserverVersion(conn);
+ serverMajor = serverVersion / 100;
+ if (serverMajor < minServerMajor || serverMajor > maxServerMajor)
+ {
+ const char *serverver = PQparameterStatus(conn, "server_version");
+
+ pg_fatal("incompatible server version %s",
+ serverver ? serverver : "'unknown'");
+ }
+ if (serverMajor >= 1500)
+ use_new_option_syntax = true;
+
+ /*
+ * If WAL streaming was requested, also check that the server is new
+ * enough for that.
+ */
+ if (includewal == STREAM_WAL && !CheckServerVersionForStreaming(conn))
+ {
+ /*
+ * Error message already written in CheckServerVersionForStreaming(),
+ * but add a hint about using -X none.
+ */
+ pg_log_error_hint("Use -X none or -X fetch to disable log streaming.");
+ exit(1);
+ }
+
+ /*
+ * Build contents of configuration file if requested
+ */
+ if (writerecoveryconf)
+ recoveryconfcontents = GenerateRecoveryConfig(conn, replication_slot);
+
+ /*
+ * Run IDENTIFY_SYSTEM so we can get the timeline
+ */
+ if (!RunIdentifySystem(conn, &sysidentifier, &latesttli, NULL, NULL))
+ exit(1);
+
+ /*
+ * Start the actual backup
+ */
+ AppendStringCommandOption(&buf, use_new_option_syntax, "LABEL", label);
+ if (estimatesize)
+ AppendPlainCommandOption(&buf, use_new_option_syntax, "PROGRESS");
+ if (includewal == FETCH_WAL)
+ AppendPlainCommandOption(&buf, use_new_option_syntax, "WAL");
+ if (fastcheckpoint)
+ {
+ if (use_new_option_syntax)
+ AppendStringCommandOption(&buf, use_new_option_syntax,
+ "CHECKPOINT", "fast");
+ else
+ AppendPlainCommandOption(&buf, use_new_option_syntax, "FAST");
+ }
+ if (includewal != NO_WAL)
+ {
+ if (use_new_option_syntax)
+ AppendIntegerCommandOption(&buf, use_new_option_syntax, "WAIT", 0);
+ else
+ AppendPlainCommandOption(&buf, use_new_option_syntax, "NOWAIT");
+ }
+ if (maxrate > 0)
+ AppendIntegerCommandOption(&buf, use_new_option_syntax, "MAX_RATE",
+ maxrate);
+ if (format == 't')
+ AppendPlainCommandOption(&buf, use_new_option_syntax, "TABLESPACE_MAP");
+ if (!verify_checksums)
+ {
+ if (use_new_option_syntax)
+ AppendIntegerCommandOption(&buf, use_new_option_syntax,
+ "VERIFY_CHECKSUMS", 0);
+ else
+ AppendPlainCommandOption(&buf, use_new_option_syntax,
+ "NOVERIFY_CHECKSUMS");
+ }
+
+ if (manifest)
+ {
+ AppendStringCommandOption(&buf, use_new_option_syntax, "MANIFEST",
+ manifest_force_encode ? "force-encode" : "yes");
+ if (manifest_checksums != NULL)
+ AppendStringCommandOption(&buf, use_new_option_syntax,
+ "MANIFEST_CHECKSUMS", manifest_checksums);
+ }
+
+ if (backup_target != NULL)
+ {
+ char *colon;
+
+ if (serverMajor < 1500)
+ pg_fatal("backup targets are not supported by this server version");
+
+ if (writerecoveryconf)
+ pg_fatal("recovery configuration cannot be written when a backup target is used");
+
+ AppendPlainCommandOption(&buf, use_new_option_syntax, "TABLESPACE_MAP");
+
+ if ((colon = strchr(backup_target, ':')) == NULL)
+ {
+ AppendStringCommandOption(&buf, use_new_option_syntax,
+ "TARGET", backup_target);
+ }
+ else
+ {
+ char *target;
+
+ target = pnstrdup(backup_target, colon - backup_target);
+ AppendStringCommandOption(&buf, use_new_option_syntax,
+ "TARGET", target);
+ AppendStringCommandOption(&buf, use_new_option_syntax,
+ "TARGET_DETAIL", colon + 1);
+ }
+ }
+ else if (serverMajor >= 1500)
+ AppendStringCommandOption(&buf, use_new_option_syntax,
+ "TARGET", "client");
+
+ if (compressloc == COMPRESS_LOCATION_SERVER)
+ {
+ if (!use_new_option_syntax)
+ pg_fatal("server does not support server-side compression");
+ AppendStringCommandOption(&buf, use_new_option_syntax,
+ "COMPRESSION", compression_algorithm);
+ if (compression_detail != NULL)
+ AppendStringCommandOption(&buf, use_new_option_syntax,
+ "COMPRESSION_DETAIL",
+ compression_detail);
+ }
+
+ if (verbose)
+ pg_log_info("initiating base backup, waiting for checkpoint to complete");
+
+ if (showprogress && !verbose)
+ {
+ fprintf(stderr, _("waiting for checkpoint"));
+ if (isatty(fileno(stderr)))
+ fprintf(stderr, "\r");
+ else
+ fprintf(stderr, "\n");
+ }
+
+ if (use_new_option_syntax && buf.len > 0)
+ basebkp = psprintf("BASE_BACKUP (%s)", buf.data);
+ else
+ basebkp = psprintf("BASE_BACKUP %s", buf.data);
+
+ if (PQsendQuery(conn, basebkp) == 0)
+ pg_fatal("could not send replication command \"%s\": %s",
+ "BASE_BACKUP", PQerrorMessage(conn));
+
+ /*
+ * Get the starting WAL location
+ */
+ res = PQgetResult(conn);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ pg_fatal("could not initiate base backup: %s",
+ PQerrorMessage(conn));
+ if (PQntuples(res) != 1)
+ pg_fatal("server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields",
+ PQntuples(res), PQnfields(res), 1, 2);
+
+ strlcpy(xlogstart, PQgetvalue(res, 0, 0), sizeof(xlogstart));
+
+ if (verbose)
+ pg_log_info("checkpoint completed");
+
+ /*
+ * 9.3 and later sends the TLI of the starting point. With older servers,
+ * assume it's the same as the latest timeline reported by
+ * IDENTIFY_SYSTEM.
+ */
+ if (PQnfields(res) >= 2)
+ starttli = atoi(PQgetvalue(res, 0, 1));
+ else
+ starttli = latesttli;
+ PQclear(res);
+ MemSet(xlogend, 0, sizeof(xlogend));
+
+ if (verbose && includewal != NO_WAL)
+ pg_log_info("write-ahead log start point: %s on timeline %u",
+ xlogstart, starttli);
+
+ /*
+ * Get the header
+ */
+ res = PQgetResult(conn);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ pg_fatal("could not get backup header: %s",
+ PQerrorMessage(conn));
+ if (PQntuples(res) < 1)
+ pg_fatal("no data returned from server");
+
+ /*
+ * Sum up the total size, for progress reporting
+ */
+ totalsize_kb = totaldone = 0;
+ tablespacecount = PQntuples(res);
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ totalsize_kb += atol(PQgetvalue(res, i, 2));
+
+ /*
+ * Verify tablespace directories are empty. Don't bother with the
+ * first once since it can be relocated, and it will be checked before
+ * we do anything anyway.
+ *
+ * Note that this is skipped for tar format backups and backups that
+ * the server is storing to a target location, since in that case we
+ * won't be storing anything into these directories and thus should
+ * not create them.
+ */
+ if (backup_target == NULL && format == 'p' && !PQgetisnull(res, i, 1))
+ {
+ char *path = unconstify(char *, get_tablespace_mapping(PQgetvalue(res, i, 1)));
+
+ verify_dir_is_empty_or_create(path, &made_tablespace_dirs, &found_tablespace_dirs);
+ }
+ }
+
+ /*
+ * When writing to stdout, require a single tablespace
+ */
+ writing_to_stdout = format == 't' && basedir != NULL &&
+ strcmp(basedir, "-") == 0;
+ if (writing_to_stdout && PQntuples(res) > 1)
+ pg_fatal("can only write single tablespace to stdout, database has %d",
+ PQntuples(res));
+
+ /*
+ * If we're streaming WAL, start the streaming session before we start
+ * receiving the actual data chunks.
+ */
+ if (includewal == STREAM_WAL)
+ {
+ pg_compress_algorithm wal_compress_algorithm;
+ int wal_compress_level;
+
+ if (verbose)
+ pg_log_info("starting background WAL receiver");
+
+ if (client_compress->algorithm == PG_COMPRESSION_GZIP)
+ {
+ wal_compress_algorithm = PG_COMPRESSION_GZIP;
+ wal_compress_level = client_compress->level;
+ }
+ else
+ {
+ wal_compress_algorithm = PG_COMPRESSION_NONE;
+ wal_compress_level = 0;
+ }
+
+ StartLogStreamer(xlogstart, starttli, sysidentifier,
+ wal_compress_algorithm,
+ wal_compress_level);
+ }
+
+ if (serverMajor >= 1500)
+ {
+ /* Receive a single tar stream with everything. */
+ ReceiveArchiveStream(conn, client_compress);
+ }
+ else
+ {
+ /* Receive a tar file for each tablespace in turn */
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ char archive_name[MAXPGPATH];
+ char *spclocation;
+
+ /*
+ * If we write the data out to a tar file, it will be named
+ * base.tar if it's the main data directory or <tablespaceoid>.tar
+ * if it's for another tablespace. CreateBackupStreamer() will
+ * arrange to add .gz to the archive name if pg_basebackup is
+ * performing compression.
+ */
+ if (PQgetisnull(res, i, 0))
+ {
+ strlcpy(archive_name, "base.tar", sizeof(archive_name));
+ spclocation = NULL;
+ }
+ else
+ {
+ snprintf(archive_name, sizeof(archive_name),
+ "%s.tar", PQgetvalue(res, i, 0));
+ spclocation = PQgetvalue(res, i, 1);
+ }
+
+ ReceiveTarFile(conn, archive_name, spclocation, i,
+ client_compress);
+ }
+
+ /*
+ * Now receive backup manifest, if appropriate.
+ *
+ * If we're writing a tarfile to stdout, ReceiveTarFile will have
+ * already processed the backup manifest and included it in the output
+ * tarfile. Such a configuration doesn't allow for writing multiple
+ * files.
+ *
+ * If we're talking to an older server, it won't send a backup
+ * manifest, so don't try to receive one.
+ */
+ if (!writing_to_stdout && manifest)
+ ReceiveBackupManifest(conn);
+ }
+
+ if (showprogress)
+ {
+ progress_update_filename(NULL);
+ progress_report(PQntuples(res), true, true);
+ }
+
+ PQclear(res);
+
+ /*
+ * Get the stop position
+ */
+ res = PQgetResult(conn);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ pg_fatal("backup failed: %s",
+ PQerrorMessage(conn));
+ if (PQntuples(res) != 1)
+ pg_fatal("no write-ahead log end position returned from server");
+ strlcpy(xlogend, PQgetvalue(res, 0, 0), sizeof(xlogend));
+ if (verbose && includewal != NO_WAL)
+ pg_log_info("write-ahead log end point: %s", xlogend);
+ PQclear(res);
+
+ res = PQgetResult(conn);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ const char *sqlstate = PQresultErrorField(res, PG_DIAG_SQLSTATE);
+
+ if (sqlstate &&
+ strcmp(sqlstate, ERRCODE_DATA_CORRUPTED) == 0)
+ {
+ pg_log_error("checksum error occurred");
+ checksum_failure = true;
+ }
+ else
+ {
+ pg_log_error("final receive failed: %s",
+ PQerrorMessage(conn));
+ }
+ exit(1);
+ }
+
+ if (bgchild > 0)
+ {
+#ifndef WIN32
+ int status;
+ pid_t r;
+#else
+ DWORD status;
+
+ /*
+ * get a pointer sized version of bgchild to avoid warnings about
+ * casting to a different size on WIN64.
+ */
+ intptr_t bgchild_handle = bgchild;
+ uint32 hi,
+ lo;
+#endif
+
+ if (verbose)
+ pg_log_info("waiting for background process to finish streaming ...");
+
+#ifndef WIN32
+ if (write(bgpipe[1], xlogend, strlen(xlogend)) != strlen(xlogend))
+ pg_fatal("could not send command to background pipe: %m");
+
+ /* Just wait for the background process to exit */
+ r = waitpid(bgchild, &status, 0);
+ if (r == (pid_t) -1)
+ pg_fatal("could not wait for child process: %m");
+ if (r != bgchild)
+ pg_fatal("child %d died, expected %d", (int) r, (int) bgchild);
+ if (status != 0)
+ pg_fatal("%s", wait_result_to_str(status));
+ /* Exited normally, we're happy! */
+#else /* WIN32 */
+
+ /*
+ * On Windows, since we are in the same process, we can just store the
+ * value directly in the variable, and then set the flag that says
+ * it's there.
+ */
+ if (sscanf(xlogend, "%X/%X", &hi, &lo) != 2)
+ pg_fatal("could not parse write-ahead log location \"%s\"",
+ xlogend);
+ xlogendptr = ((uint64) hi) << 32 | lo;
+ InterlockedIncrement(&has_xlogendptr);
+
+ /* First wait for the thread to exit */
+ if (WaitForSingleObjectEx((HANDLE) bgchild_handle, INFINITE, FALSE) !=
+ WAIT_OBJECT_0)
+ {
+ _dosmaperr(GetLastError());
+ pg_fatal("could not wait for child thread: %m");
+ }
+ if (GetExitCodeThread((HANDLE) bgchild_handle, &status) == 0)
+ {
+ _dosmaperr(GetLastError());
+ pg_fatal("could not get child thread exit status: %m");
+ }
+ if (status != 0)
+ pg_fatal("child thread exited with error %u",
+ (unsigned int) status);
+ /* Exited normally, we're happy */
+#endif
+ }
+
+ /* Free the configuration file contents */
+ destroyPQExpBuffer(recoveryconfcontents);
+
+ /*
+ * End of copy data. Final result is already checked inside the loop.
+ */
+ PQclear(res);
+ PQfinish(conn);
+ conn = NULL;
+
+ /*
+ * Make data persistent on disk once backup is completed. For tar format
+ * sync the parent directory and all its contents as each tar file was not
+ * synced after being completed. In plain format, all the data of the
+ * base directory is synced, taking into account all the tablespaces.
+ * Errors are not considered fatal.
+ *
+ * If, however, there's a backup target, we're not writing anything
+ * locally, so in that case we skip this step.
+ */
+ if (do_sync && backup_target == NULL)
+ {
+ if (verbose)
+ pg_log_info("syncing data to disk ...");
+ if (format == 't')
+ {
+ if (strcmp(basedir, "-") != 0)
+ (void) fsync_dir_recurse(basedir);
+ }
+ else
+ {
+ (void) fsync_pgdata(basedir, serverVersion);
+ }
+ }
+
+ /*
+ * After synchronizing data to disk, perform a durable rename of
+ * backup_manifest.tmp to backup_manifest, if we wrote such a file. This
+ * way, a failure or system crash before we reach this point will leave us
+ * without a backup_manifest file, decreasing the chances that a directory
+ * we leave behind will be mistaken for a valid backup.
+ */
+ if (!writing_to_stdout && manifest && backup_target == NULL)
+ {
+ char tmp_filename[MAXPGPATH];
+ char filename[MAXPGPATH];
+
+ if (verbose)
+ pg_log_info("renaming backup_manifest.tmp to backup_manifest");
+
+ snprintf(tmp_filename, MAXPGPATH, "%s/backup_manifest.tmp", basedir);
+ snprintf(filename, MAXPGPATH, "%s/backup_manifest", basedir);
+
+ if (do_sync)
+ {
+ /* durable_rename emits its own log message in case of failure */
+ if (durable_rename(tmp_filename, filename) != 0)
+ exit(1);
+ }
+ else
+ {
+ if (rename(tmp_filename, filename) != 0)
+ pg_fatal("could not rename file \"%s\" to \"%s\": %m",
+ tmp_filename, filename);
+ }
+ }
+
+ if (verbose)
+ pg_log_info("base backup completed");
+}
+
+
+int
+main(int argc, char **argv)
+{
+ static struct option long_options[] = {
+ {"help", no_argument, NULL, '?'},
+ {"version", no_argument, NULL, 'V'},
+ {"pgdata", required_argument, NULL, 'D'},
+ {"format", required_argument, NULL, 'F'},
+ {"checkpoint", required_argument, NULL, 'c'},
+ {"create-slot", no_argument, NULL, 'C'},
+ {"max-rate", required_argument, NULL, 'r'},
+ {"write-recovery-conf", no_argument, NULL, 'R'},
+ {"slot", required_argument, NULL, 'S'},
+ {"target", required_argument, NULL, 't'},
+ {"tablespace-mapping", required_argument, NULL, 'T'},
+ {"wal-method", required_argument, NULL, 'X'},
+ {"gzip", no_argument, NULL, 'z'},
+ {"compress", required_argument, NULL, 'Z'},
+ {"label", required_argument, NULL, 'l'},
+ {"no-clean", no_argument, NULL, 'n'},
+ {"no-sync", no_argument, NULL, 'N'},
+ {"dbname", required_argument, NULL, 'd'},
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"status-interval", required_argument, NULL, 's'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"progress", no_argument, NULL, 'P'},
+ {"waldir", required_argument, NULL, 1},
+ {"no-slot", no_argument, NULL, 2},
+ {"no-verify-checksums", no_argument, NULL, 3},
+ {"no-estimate-size", no_argument, NULL, 4},
+ {"no-manifest", no_argument, NULL, 5},
+ {"manifest-force-encode", no_argument, NULL, 6},
+ {"manifest-checksums", required_argument, NULL, 7},
+ {NULL, 0, NULL, 0}
+ };
+ int c;
+
+ int option_index;
+ char *compression_algorithm = "none";
+ char *compression_detail = NULL;
+ CompressionLocation compressloc = COMPRESS_LOCATION_UNSPECIFIED;
+ pg_compress_specification client_compress;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_basebackup"));
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ else if (strcmp(argv[1], "-V") == 0
+ || strcmp(argv[1], "--version") == 0)
+ {
+ puts("pg_basebackup (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ atexit(cleanup_directories_atexit);
+
+ while ((c = getopt_long(argc, argv, "CD:F:r:RS:t:T:X:l:nNzZ:d:c:h:p:U:s:wWkvP",
+ long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+ case 'C':
+ create_slot = true;
+ break;
+ case 'D':
+ basedir = pg_strdup(optarg);
+ break;
+ case 'F':
+ if (strcmp(optarg, "p") == 0 || strcmp(optarg, "plain") == 0)
+ format = 'p';
+ else if (strcmp(optarg, "t") == 0 || strcmp(optarg, "tar") == 0)
+ format = 't';
+ else
+ pg_fatal("invalid output format \"%s\", must be \"plain\" or \"tar\"",
+ optarg);
+ break;
+ case 'r':
+ maxrate = parse_max_rate(optarg);
+ break;
+ case 'R':
+ writerecoveryconf = true;
+ break;
+ case 'S':
+
+ /*
+ * When specifying replication slot name, use a permanent
+ * slot.
+ */
+ replication_slot = pg_strdup(optarg);
+ temp_replication_slot = false;
+ break;
+ case 2:
+ no_slot = true;
+ break;
+ case 't':
+ backup_target = pg_strdup(optarg);
+ break;
+ case 'T':
+ tablespace_list_append(optarg);
+ break;
+ case 'X':
+ if (strcmp(optarg, "n") == 0 ||
+ strcmp(optarg, "none") == 0)
+ {
+ includewal = NO_WAL;
+ }
+ else if (strcmp(optarg, "f") == 0 ||
+ strcmp(optarg, "fetch") == 0)
+ {
+ includewal = FETCH_WAL;
+ }
+ else if (strcmp(optarg, "s") == 0 ||
+ strcmp(optarg, "stream") == 0)
+ {
+ includewal = STREAM_WAL;
+ }
+ else
+ pg_fatal("invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"",
+ optarg);
+ break;
+ case 1:
+ xlog_dir = pg_strdup(optarg);
+ break;
+ case 'l':
+ label = pg_strdup(optarg);
+ break;
+ case 'n':
+ noclean = true;
+ break;
+ case 'N':
+ do_sync = false;
+ break;
+ case 'z':
+ compression_algorithm = "gzip";
+ compression_detail = NULL;
+ compressloc = COMPRESS_LOCATION_UNSPECIFIED;
+ break;
+ case 'Z':
+ parse_compress_options(optarg, &compression_algorithm,
+ &compression_detail, &compressloc);
+ break;
+ case 'c':
+ if (pg_strcasecmp(optarg, "fast") == 0)
+ fastcheckpoint = true;
+ else if (pg_strcasecmp(optarg, "spread") == 0)
+ fastcheckpoint = false;
+ else
+ pg_fatal("invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"",
+ optarg);
+ break;
+ case 'd':
+ connection_string = pg_strdup(optarg);
+ break;
+ case 'h':
+ dbhost = pg_strdup(optarg);
+ break;
+ case 'p':
+ dbport = pg_strdup(optarg);
+ break;
+ case 'U':
+ dbuser = pg_strdup(optarg);
+ break;
+ case 'w':
+ dbgetpassword = -1;
+ break;
+ case 'W':
+ dbgetpassword = 1;
+ break;
+ case 's':
+ if (!option_parse_int(optarg, "-s/--status-interval", 0,
+ INT_MAX / 1000,
+ &standby_message_timeout))
+ exit(1);
+ standby_message_timeout *= 1000;
+ break;
+ case 'v':
+ verbose++;
+ break;
+ case 'P':
+ showprogress = true;
+ break;
+ case 3:
+ verify_checksums = false;
+ break;
+ case 4:
+ estimatesize = false;
+ break;
+ case 5:
+ manifest = false;
+ break;
+ case 6:
+ manifest_force_encode = true;
+ break;
+ case 7:
+ manifest_checksums = pg_strdup(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /*
+ * Any non-option arguments?
+ */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Setting the backup target to 'client' is equivalent to leaving out the
+ * option. This logic allows us to assume elsewhere that the backup is
+ * being stored locally if and only if backup_target == NULL.
+ */
+ if (backup_target != NULL && strcmp(backup_target, "client") == 0)
+ {
+ pg_free(backup_target);
+ backup_target = NULL;
+ }
+
+ /*
+ * Can't use --format with --target. Without --target, default format is
+ * tar.
+ */
+ if (backup_target != NULL && format != '\0')
+ {
+ pg_log_error("cannot specify both format and backup target");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (format == '\0')
+ format = 'p';
+
+ /*
+ * Either directory or backup target should be specified, but not both
+ */
+ if (basedir == NULL && backup_target == NULL)
+ {
+ pg_log_error("must specify output directory or backup target");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (basedir != NULL && backup_target != NULL)
+ {
+ pg_log_error("cannot specify both output directory and backup target");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * If the user has not specified where to perform backup compression,
+ * default to the client, unless the user specified --target, in which
+ * case the server is the only choice.
+ */
+ if (compressloc == COMPRESS_LOCATION_UNSPECIFIED)
+ {
+ if (backup_target == NULL)
+ compressloc = COMPRESS_LOCATION_CLIENT;
+ else
+ compressloc = COMPRESS_LOCATION_SERVER;
+ }
+
+ /*
+ * If any compression that we're doing is happening on the client side, we
+ * must try to parse the compression algorithm and detail, but if it's all
+ * on the server side, then we're just going to pass through whatever was
+ * requested and let the server decide what to do.
+ */
+ if (compressloc == COMPRESS_LOCATION_CLIENT)
+ {
+ pg_compress_algorithm alg;
+ char *error_detail;
+
+ if (!parse_compress_algorithm(compression_algorithm, &alg))
+ pg_fatal("unrecognized compression algorithm: \"%s\"",
+ compression_algorithm);
+
+ parse_compress_specification(alg, compression_detail, &client_compress);
+ error_detail = validate_compress_specification(&client_compress);
+ if (error_detail != NULL)
+ pg_fatal("invalid compression specification: %s",
+ error_detail);
+ }
+ else
+ {
+ Assert(compressloc == COMPRESS_LOCATION_SERVER);
+ client_compress.algorithm = PG_COMPRESSION_NONE;
+ client_compress.options = 0;
+ }
+
+ /*
+ * Can't perform client-side compression if the backup is not being sent
+ * to the client.
+ */
+ if (backup_target != NULL && compressloc == COMPRESS_LOCATION_CLIENT)
+ {
+ pg_log_error("client-side compression is not possible when a backup target is specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Client-side compression doesn't make sense unless tar format is in use.
+ */
+ if (format == 'p' && compressloc == COMPRESS_LOCATION_CLIENT &&
+ client_compress.algorithm != PG_COMPRESSION_NONE)
+ {
+ pg_log_error("only tar mode backups can be compressed");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Sanity checks for WAL method.
+ */
+ if (backup_target != NULL && includewal == STREAM_WAL)
+ {
+ pg_log_error("WAL cannot be streamed when a backup target is specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (format == 't' && includewal == STREAM_WAL && strcmp(basedir, "-") == 0)
+ {
+ pg_log_error("cannot stream write-ahead logs in tar mode to stdout");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (replication_slot && includewal != STREAM_WAL)
+ {
+ pg_log_error("replication slots can only be used with WAL streaming");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Sanity checks for replication slot options.
+ */
+ if (no_slot)
+ {
+ if (replication_slot)
+ {
+ pg_log_error("--no-slot cannot be used with slot name");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ temp_replication_slot = false;
+ }
+
+ if (create_slot)
+ {
+ if (!replication_slot)
+ {
+ pg_log_error("%s needs a slot to be specified using --slot",
+ "--create-slot");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (no_slot)
+ {
+ pg_log_error("%s and %s are incompatible options",
+ "--create-slot", "--no-slot");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /*
+ * Sanity checks on WAL directory.
+ */
+ if (xlog_dir)
+ {
+ if (backup_target != NULL)
+ {
+ pg_log_error("WAL directory location cannot be specified along with a backup target");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (format != 'p')
+ {
+ pg_log_error("WAL directory location can only be specified in plain mode");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* clean up xlog directory name, check it's absolute */
+ canonicalize_path(xlog_dir);
+ if (!is_absolute_path(xlog_dir))
+ {
+ pg_log_error("WAL directory location must be an absolute path");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /*
+ * Sanity checks for progress reporting options.
+ */
+ if (showprogress && !estimatesize)
+ {
+ pg_log_error("%s and %s are incompatible options",
+ "--progress", "--no-estimate-size");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Sanity checks for backup manifest options.
+ */
+ if (!manifest && manifest_checksums != NULL)
+ {
+ pg_log_error("%s and %s are incompatible options",
+ "--no-manifest", "--manifest-checksums");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (!manifest && manifest_force_encode)
+ {
+ pg_log_error("%s and %s are incompatible options",
+ "--no-manifest", "--manifest-force-encode");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* connection in replication mode to server */
+ conn = GetConnection();
+ if (!conn)
+ {
+ /* Error message already written in GetConnection() */
+ exit(1);
+ }
+ atexit(disconnect_atexit);
+
+#ifndef WIN32
+
+ /*
+ * Trap SIGCHLD to be able to handle the WAL stream process exiting. There
+ * is no SIGCHLD on Windows, there we rely on the background thread
+ * setting the signal variable on unexpected but graceful exit. If the WAL
+ * stream thread crashes on Windows it will bring down the entire process
+ * as it's a thread, so there is nothing to catch should that happen. A
+ * crash on UNIX will be caught by the signal handler.
+ */
+ pqsignal(SIGCHLD, sigchld_handler);
+#endif
+
+ /*
+ * Set umask so that directories/files are created with the same
+ * permissions as directories/files in the source data directory.
+ *
+ * pg_mode_mask is set to owner-only by default and then updated in
+ * GetConnection() where we get the mode from the server-side with
+ * RetrieveDataDirCreatePerm() and then call SetDataDirectoryCreatePerm().
+ */
+ umask(pg_mode_mask);
+
+ /* Backup manifests are supported in 13 and newer versions */
+ if (PQserverVersion(conn) < MINIMUM_VERSION_FOR_MANIFESTS)
+ manifest = false;
+
+ /*
+ * If an output directory was specified, verify that it exists, or create
+ * it. Note that for a tar backup, an output directory of "-" means we are
+ * writing to stdout, so do nothing in that case.
+ */
+ if (basedir != NULL && (format == 'p' || strcmp(basedir, "-") != 0))
+ verify_dir_is_empty_or_create(basedir, &made_new_pgdata, &found_existing_pgdata);
+
+ /* determine remote server's xlog segment size */
+ if (!RetrieveWalSegSize(conn))
+ exit(1);
+
+ /* Create pg_wal symlink, if required */
+ if (xlog_dir)
+ {
+ char *linkloc;
+
+ verify_dir_is_empty_or_create(xlog_dir, &made_new_xlogdir, &found_existing_xlogdir);
+
+ /*
+ * Form name of the place where the symlink must go. pg_xlog has been
+ * renamed to pg_wal in post-10 clusters.
+ */
+ linkloc = psprintf("%s/%s", basedir,
+ PQserverVersion(conn) < MINIMUM_VERSION_FOR_PG_WAL ?
+ "pg_xlog" : "pg_wal");
+
+#ifdef HAVE_SYMLINK
+ if (symlink(xlog_dir, linkloc) != 0)
+ pg_fatal("could not create symbolic link \"%s\": %m", linkloc);
+#else
+ pg_fatal("symlinks are not supported on this platform");
+#endif
+ free(linkloc);
+ }
+
+ BaseBackup(compression_algorithm, compression_detail, compressloc,
+ &client_compress);
+
+ success = true;
+ return 0;
+}
diff --git a/src/bin/pg_basebackup/pg_receivewal.c b/src/bin/pg_basebackup/pg_receivewal.c
new file mode 100644
index 0000000..26dcf33
--- /dev/null
+++ b/src/bin/pg_basebackup/pg_receivewal.c
@@ -0,0 +1,992 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_receivewal.c - receive streaming WAL data and write it
+ * to a local file.
+ *
+ * Author: Magnus Hagander <magnus@hagander.net>
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/pg_receivewal.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <dirent.h>
+#include <limits.h>
+#include <signal.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#ifdef USE_LZ4
+#include <lz4frame.h>
+#endif
+#ifdef HAVE_LIBZ
+#include <zlib.h>
+#endif
+
+#include "access/xlog_internal.h"
+#include "common/file_perm.h"
+#include "common/logging.h"
+#include "fe_utils/option_utils.h"
+#include "getopt_long.h"
+#include "libpq-fe.h"
+#include "receivelog.h"
+#include "streamutil.h"
+
+/* Time to sleep between reconnection attempts */
+#define RECONNECT_SLEEP_TIME 5
+
+/* Global options */
+static char *basedir = NULL;
+static int verbose = 0;
+static int compresslevel = 0;
+static int noloop = 0;
+static int standby_message_timeout = 10 * 1000; /* 10 sec = default */
+static volatile bool time_to_stop = false;
+static bool do_create_slot = false;
+static bool slot_exists_ok = false;
+static bool do_drop_slot = false;
+static bool do_sync = true;
+static bool synchronous = false;
+static char *replication_slot = NULL;
+static pg_compress_algorithm compression_algorithm = PG_COMPRESSION_NONE;
+static XLogRecPtr endpos = InvalidXLogRecPtr;
+
+
+static void usage(void);
+static void parse_compress_options(char *option, char **algorithm,
+ char **detail);
+static DIR *get_destination_dir(char *dest_folder);
+static void close_destination_dir(DIR *dest_dir, char *dest_folder);
+static XLogRecPtr FindStreamingStart(uint32 *tli);
+static void StreamLog(void);
+static bool stop_streaming(XLogRecPtr segendpos, uint32 timeline,
+ bool segment_finished);
+
+static void
+disconnect_atexit(void)
+{
+ if (conn != NULL)
+ PQfinish(conn);
+}
+
+static void
+usage(void)
+{
+ printf(_("%s receives PostgreSQL streaming write-ahead logs.\n\n"),
+ progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]...\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -D, --directory=DIR receive write-ahead log files into this directory\n"));
+ printf(_(" -E, --endpos=LSN exit after receiving the specified LSN\n"));
+ printf(_(" --if-not-exists do not error if slot already exists when creating a slot\n"));
+ printf(_(" -n, --no-loop do not loop on connection lost\n"));
+ printf(_(" --no-sync do not wait for changes to be written safely to disk\n"));
+ printf(_(" -s, --status-interval=SECS\n"
+ " time between status packets sent to server (default: %d)\n"), (standby_message_timeout / 1000));
+ printf(_(" -S, --slot=SLOTNAME replication slot to use\n"));
+ printf(_(" --synchronous flush write-ahead log immediately after writing\n"));
+ printf(_(" -v, --verbose output verbose messages\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -Z, --compress=METHOD[:DETAIL]\n"
+ " compress as specified\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -d, --dbname=CONNSTR connection string\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port number\n"));
+ printf(_(" -U, --username=NAME connect as specified database user\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt (should happen automatically)\n"));
+ printf(_("\nOptional actions:\n"));
+ printf(_(" --create-slot create a new replication slot (for the slot's name see --slot)\n"));
+ printf(_(" --drop-slot drop the replication slot (for the slot's name see --slot)\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+/*
+ * Basic parsing of a value specified for -Z/--compress
+ *
+ * The parsing consists of a METHOD:DETAIL string fed later on to a more
+ * advanced routine in charge of proper validation checks. This only extracts
+ * METHOD and DETAIL. If only an integer is found, the method is implied by
+ * the value specified.
+ */
+static void
+parse_compress_options(char *option, char **algorithm, char **detail)
+{
+ char *sep;
+ char *endp;
+ long result;
+
+ /*
+ * Check whether the compression specification consists of a bare integer.
+ *
+ * For backward-compatibility, assume "none" if the integer found is zero
+ * and "gzip" otherwise.
+ */
+ result = strtol(option, &endp, 10);
+ if (*endp == '\0')
+ {
+ if (result == 0)
+ {
+ *algorithm = pstrdup("none");
+ *detail = NULL;
+ }
+ else
+ {
+ *algorithm = pstrdup("gzip");
+ *detail = pstrdup(option);
+ }
+ return;
+ }
+
+ /*
+ * Check whether there is a compression detail following the algorithm
+ * name.
+ */
+ sep = strchr(option, ':');
+ if (sep == NULL)
+ {
+ *algorithm = pstrdup(option);
+ *detail = NULL;
+ }
+ else
+ {
+ char *alg;
+
+ alg = palloc((sep - option) + 1);
+ memcpy(alg, option, sep - option);
+ alg[sep - option] = '\0';
+
+ *algorithm = alg;
+ *detail = pstrdup(sep + 1);
+ }
+}
+
+/*
+ * Check if the filename looks like a WAL file, letting caller know if this
+ * WAL segment is partial and/or compressed.
+ */
+static bool
+is_xlogfilename(const char *filename, bool *ispartial,
+ pg_compress_algorithm *wal_compression_algorithm)
+{
+ size_t fname_len = strlen(filename);
+ size_t xlog_pattern_len = strspn(filename, "0123456789ABCDEF");
+
+ /* File does not look like a WAL file */
+ if (xlog_pattern_len != XLOG_FNAME_LEN)
+ return false;
+
+ /* File looks like a completed uncompressed WAL file */
+ if (fname_len == XLOG_FNAME_LEN)
+ {
+ *ispartial = false;
+ *wal_compression_algorithm = PG_COMPRESSION_NONE;
+ return true;
+ }
+
+ /* File looks like a completed gzip-compressed WAL file */
+ if (fname_len == XLOG_FNAME_LEN + strlen(".gz") &&
+ strcmp(filename + XLOG_FNAME_LEN, ".gz") == 0)
+ {
+ *ispartial = false;
+ *wal_compression_algorithm = PG_COMPRESSION_GZIP;
+ return true;
+ }
+
+ /* File looks like a completed LZ4-compressed WAL file */
+ if (fname_len == XLOG_FNAME_LEN + strlen(".lz4") &&
+ strcmp(filename + XLOG_FNAME_LEN, ".lz4") == 0)
+ {
+ *ispartial = false;
+ *wal_compression_algorithm = PG_COMPRESSION_LZ4;
+ return true;
+ }
+
+ /* File looks like a partial uncompressed WAL file */
+ if (fname_len == XLOG_FNAME_LEN + strlen(".partial") &&
+ strcmp(filename + XLOG_FNAME_LEN, ".partial") == 0)
+ {
+ *ispartial = true;
+ *wal_compression_algorithm = PG_COMPRESSION_NONE;
+ return true;
+ }
+
+ /* File looks like a partial gzip-compressed WAL file */
+ if (fname_len == XLOG_FNAME_LEN + strlen(".gz.partial") &&
+ strcmp(filename + XLOG_FNAME_LEN, ".gz.partial") == 0)
+ {
+ *ispartial = true;
+ *wal_compression_algorithm = PG_COMPRESSION_GZIP;
+ return true;
+ }
+
+ /* File looks like a partial LZ4-compressed WAL file */
+ if (fname_len == XLOG_FNAME_LEN + strlen(".lz4.partial") &&
+ strcmp(filename + XLOG_FNAME_LEN, ".lz4.partial") == 0)
+ {
+ *ispartial = true;
+ *wal_compression_algorithm = PG_COMPRESSION_LZ4;
+ return true;
+ }
+
+ /* File does not look like something we know */
+ return false;
+}
+
+static bool
+stop_streaming(XLogRecPtr xlogpos, uint32 timeline, bool segment_finished)
+{
+ static uint32 prevtimeline = 0;
+ static XLogRecPtr prevpos = InvalidXLogRecPtr;
+
+ /* we assume that we get called once at the end of each segment */
+ if (verbose && segment_finished)
+ pg_log_info("finished segment at %X/%X (timeline %u)",
+ LSN_FORMAT_ARGS(xlogpos),
+ timeline);
+
+ if (!XLogRecPtrIsInvalid(endpos) && endpos < xlogpos)
+ {
+ if (verbose)
+ pg_log_info("stopped log streaming at %X/%X (timeline %u)",
+ LSN_FORMAT_ARGS(xlogpos),
+ timeline);
+ time_to_stop = true;
+ return true;
+ }
+
+ /*
+ * Note that we report the previous, not current, position here. After a
+ * timeline switch, xlogpos points to the beginning of the segment because
+ * that's where we always begin streaming. Reporting the end of previous
+ * timeline isn't totally accurate, because the next timeline can begin
+ * slightly before the end of the WAL that we received on the previous
+ * timeline, but it's close enough for reporting purposes.
+ */
+ if (verbose && prevtimeline != 0 && prevtimeline != timeline)
+ pg_log_info("switched to timeline %u at %X/%X",
+ timeline,
+ LSN_FORMAT_ARGS(prevpos));
+
+ prevtimeline = timeline;
+ prevpos = xlogpos;
+
+ if (time_to_stop)
+ {
+ if (verbose)
+ pg_log_info("received interrupt signal, exiting");
+ return true;
+ }
+ return false;
+}
+
+
+/*
+ * Get destination directory.
+ */
+static DIR *
+get_destination_dir(char *dest_folder)
+{
+ DIR *dir;
+
+ Assert(dest_folder != NULL);
+ dir = opendir(dest_folder);
+ if (dir == NULL)
+ pg_fatal("could not open directory \"%s\": %m", dest_folder);
+
+ return dir;
+}
+
+
+/*
+ * Close existing directory.
+ */
+static void
+close_destination_dir(DIR *dest_dir, char *dest_folder)
+{
+ Assert(dest_dir != NULL && dest_folder != NULL);
+ if (closedir(dest_dir))
+ pg_fatal("could not close directory \"%s\": %m", dest_folder);
+}
+
+
+/*
+ * Determine starting location for streaming, based on any existing xlog
+ * segments in the directory. We start at the end of the last one that is
+ * complete (size matches wal segment size), on the timeline with highest ID.
+ *
+ * If there are no WAL files in the directory, returns InvalidXLogRecPtr.
+ */
+static XLogRecPtr
+FindStreamingStart(uint32 *tli)
+{
+ DIR *dir;
+ struct dirent *dirent;
+ XLogSegNo high_segno = 0;
+ uint32 high_tli = 0;
+ bool high_ispartial = false;
+
+ dir = get_destination_dir(basedir);
+
+ while (errno = 0, (dirent = readdir(dir)) != NULL)
+ {
+ uint32 tli;
+ XLogSegNo segno;
+ pg_compress_algorithm wal_compression_algorithm;
+ bool ispartial;
+
+ if (!is_xlogfilename(dirent->d_name,
+ &ispartial, &wal_compression_algorithm))
+ continue;
+
+ /*
+ * Looks like an xlog file. Parse its position.
+ */
+ XLogFromFileName(dirent->d_name, &tli, &segno, WalSegSz);
+
+ /*
+ * Check that the segment has the right size, if it's supposed to be
+ * completed. For non-compressed segments just check the on-disk size
+ * and see if it matches a completed segment. For gzip-compressed
+ * segments, look at the last 4 bytes of the compressed file, which is
+ * where the uncompressed size is located for files with a size lower
+ * than 4GB, and then compare it to the size of a completed segment.
+ * The 4 last bytes correspond to the ISIZE member according to
+ * http://www.zlib.org/rfc-gzip.html.
+ *
+ * For LZ4-compressed segments, uncompress the file in a throw-away
+ * buffer keeping track of the uncompressed size, then compare it to
+ * the size of a completed segment. Per its protocol, LZ4 does not
+ * store the uncompressed size of an object by default. contentSize
+ * is one possible way to do that, but we need to rely on a method
+ * where WAL segments could have been compressed by a different source
+ * than pg_receivewal, like an archive_command with lz4.
+ */
+ if (!ispartial && wal_compression_algorithm == PG_COMPRESSION_NONE)
+ {
+ struct stat statbuf;
+ char fullpath[MAXPGPATH * 2];
+
+ snprintf(fullpath, sizeof(fullpath), "%s/%s", basedir, dirent->d_name);
+ if (stat(fullpath, &statbuf) != 0)
+ pg_fatal("could not stat file \"%s\": %m", fullpath);
+
+ if (statbuf.st_size != WalSegSz)
+ {
+ pg_log_warning("segment file \"%s\" has incorrect size %lld, skipping",
+ dirent->d_name, (long long int) statbuf.st_size);
+ continue;
+ }
+ }
+ else if (!ispartial && wal_compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ int fd;
+ char buf[4];
+ int bytes_out;
+ char fullpath[MAXPGPATH * 2];
+ int r;
+
+ snprintf(fullpath, sizeof(fullpath), "%s/%s", basedir, dirent->d_name);
+
+ fd = open(fullpath, O_RDONLY | PG_BINARY, 0);
+ if (fd < 0)
+ pg_fatal("could not open compressed file \"%s\": %m",
+ fullpath);
+ if (lseek(fd, (off_t) (-4), SEEK_END) < 0)
+ pg_fatal("could not seek in compressed file \"%s\": %m",
+ fullpath);
+ r = read(fd, (char *) buf, sizeof(buf));
+ if (r != sizeof(buf))
+ {
+ if (r < 0)
+ pg_fatal("could not read compressed file \"%s\": %m",
+ fullpath);
+ else
+ pg_fatal("could not read compressed file \"%s\": read %d of %zu",
+ fullpath, r, sizeof(buf));
+ }
+
+ close(fd);
+ bytes_out = (buf[3] << 24) | (buf[2] << 16) |
+ (buf[1] << 8) | buf[0];
+
+ if (bytes_out != WalSegSz)
+ {
+ pg_log_warning("compressed segment file \"%s\" has incorrect uncompressed size %d, skipping",
+ dirent->d_name, bytes_out);
+ continue;
+ }
+ }
+ else if (!ispartial && wal_compression_algorithm == PG_COMPRESSION_LZ4)
+ {
+#ifdef USE_LZ4
+#define LZ4_CHUNK_SZ 64 * 1024 /* 64kB as maximum chunk size read */
+ int fd;
+ ssize_t r;
+ size_t uncompressed_size = 0;
+ char fullpath[MAXPGPATH * 2];
+ char *outbuf;
+ char *readbuf;
+ LZ4F_decompressionContext_t ctx = NULL;
+ LZ4F_decompressOptions_t dec_opt;
+ LZ4F_errorCode_t status;
+
+ memset(&dec_opt, 0, sizeof(dec_opt));
+ snprintf(fullpath, sizeof(fullpath), "%s/%s", basedir, dirent->d_name);
+
+ fd = open(fullpath, O_RDONLY | PG_BINARY, 0);
+ if (fd < 0)
+ pg_fatal("could not open file \"%s\": %m", fullpath);
+
+ status = LZ4F_createDecompressionContext(&ctx, LZ4F_VERSION);
+ if (LZ4F_isError(status))
+ pg_fatal("could not create LZ4 decompression context: %s",
+ LZ4F_getErrorName(status));
+
+ outbuf = pg_malloc0(LZ4_CHUNK_SZ);
+ readbuf = pg_malloc0(LZ4_CHUNK_SZ);
+ do
+ {
+ char *readp;
+ char *readend;
+
+ r = read(fd, readbuf, LZ4_CHUNK_SZ);
+ if (r < 0)
+ pg_fatal("could not read file \"%s\": %m", fullpath);
+
+ /* Done reading the file */
+ if (r == 0)
+ break;
+
+ /* Process one chunk */
+ readp = readbuf;
+ readend = readbuf + r;
+ while (readp < readend)
+ {
+ size_t out_size = LZ4_CHUNK_SZ;
+ size_t read_size = readend - readp;
+
+ memset(outbuf, 0, LZ4_CHUNK_SZ);
+ status = LZ4F_decompress(ctx, outbuf, &out_size,
+ readp, &read_size, &dec_opt);
+ if (LZ4F_isError(status))
+ pg_fatal("could not decompress file \"%s\": %s",
+ fullpath,
+ LZ4F_getErrorName(status));
+
+ readp += read_size;
+ uncompressed_size += out_size;
+ }
+
+ /*
+ * No need to continue reading the file when the
+ * uncompressed_size exceeds WalSegSz, even if there are still
+ * data left to read. However, if uncompressed_size is equal
+ * to WalSegSz, it should verify that there is no more data to
+ * read.
+ */
+ } while (uncompressed_size <= WalSegSz && r > 0);
+
+ close(fd);
+ pg_free(outbuf);
+ pg_free(readbuf);
+
+ status = LZ4F_freeDecompressionContext(ctx);
+ if (LZ4F_isError(status))
+ pg_fatal("could not free LZ4 decompression context: %s",
+ LZ4F_getErrorName(status));
+
+ if (uncompressed_size != WalSegSz)
+ {
+ pg_log_warning("compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping",
+ dirent->d_name, uncompressed_size);
+ continue;
+ }
+#else
+ pg_log_error("cannot check file \"%s\": compression with %s not supported by this build",
+ dirent->d_name, "LZ4");
+ exit(1);
+#endif
+ }
+
+ /* Looks like a valid segment. Remember that we saw it. */
+ if ((segno > high_segno) ||
+ (segno == high_segno && tli > high_tli) ||
+ (segno == high_segno && tli == high_tli && high_ispartial && !ispartial))
+ {
+ high_segno = segno;
+ high_tli = tli;
+ high_ispartial = ispartial;
+ }
+ }
+
+ if (errno)
+ pg_fatal("could not read directory \"%s\": %m", basedir);
+
+ close_destination_dir(dir, basedir);
+
+ if (high_segno > 0)
+ {
+ XLogRecPtr high_ptr;
+
+ /*
+ * Move the starting pointer to the start of the next segment, if the
+ * highest one we saw was completed. Otherwise start streaming from
+ * the beginning of the .partial segment.
+ */
+ if (!high_ispartial)
+ high_segno++;
+
+ XLogSegNoOffsetToRecPtr(high_segno, 0, WalSegSz, high_ptr);
+
+ *tli = high_tli;
+ return high_ptr;
+ }
+ else
+ return InvalidXLogRecPtr;
+}
+
+/*
+ * Start the log streaming
+ */
+static void
+StreamLog(void)
+{
+ XLogRecPtr serverpos;
+ TimeLineID servertli;
+ StreamCtl stream;
+ char *sysidentifier;
+
+ MemSet(&stream, 0, sizeof(stream));
+
+ /*
+ * Connect in replication mode to the server
+ */
+ if (conn == NULL)
+ conn = GetConnection();
+ if (!conn)
+ /* Error message already written in GetConnection() */
+ return;
+
+ if (!CheckServerVersionForStreaming(conn))
+ {
+ /*
+ * Error message already written in CheckServerVersionForStreaming().
+ * There's no hope of recovering from a version mismatch, so don't
+ * retry.
+ */
+ exit(1);
+ }
+
+ /*
+ * Identify server, obtaining start LSN position and current timeline ID
+ * at the same time, necessary if not valid data can be found in the
+ * existing output directory.
+ */
+ if (!RunIdentifySystem(conn, &sysidentifier, &servertli, &serverpos, NULL))
+ exit(1);
+
+ /*
+ * Figure out where to start streaming. First scan the local directory.
+ */
+ stream.startpos = FindStreamingStart(&stream.timeline);
+ if (stream.startpos == InvalidXLogRecPtr)
+ {
+ /*
+ * Try to get the starting point from the slot if any. This is
+ * supported in PostgreSQL 15 and newer.
+ */
+ if (replication_slot != NULL &&
+ PQserverVersion(conn) >= 150000)
+ {
+ if (!GetSlotInformation(conn, replication_slot, &stream.startpos,
+ &stream.timeline))
+ {
+ /* Error is logged by GetSlotInformation() */
+ return;
+ }
+ }
+
+ /*
+ * If it the starting point is still not known, use the current WAL
+ * flush value as last resort.
+ */
+ if (stream.startpos == InvalidXLogRecPtr)
+ {
+ stream.startpos = serverpos;
+ stream.timeline = servertli;
+ }
+ }
+
+ Assert(stream.startpos != InvalidXLogRecPtr &&
+ stream.timeline != 0);
+
+ /*
+ * Always start streaming at the beginning of a segment
+ */
+ stream.startpos -= XLogSegmentOffset(stream.startpos, WalSegSz);
+
+ /*
+ * Start the replication
+ */
+ if (verbose)
+ pg_log_info("starting log streaming at %X/%X (timeline %u)",
+ LSN_FORMAT_ARGS(stream.startpos),
+ stream.timeline);
+
+ stream.stream_stop = stop_streaming;
+ stream.stop_socket = PGINVALID_SOCKET;
+ stream.standby_message_timeout = standby_message_timeout;
+ stream.synchronous = synchronous;
+ stream.do_sync = do_sync;
+ stream.mark_done = false;
+ stream.walmethod = CreateWalDirectoryMethod(basedir,
+ compression_algorithm,
+ compresslevel,
+ stream.do_sync);
+ stream.partial_suffix = ".partial";
+ stream.replication_slot = replication_slot;
+ stream.sysidentifier = sysidentifier;
+
+ ReceiveXlogStream(conn, &stream);
+
+ if (!stream.walmethod->finish())
+ {
+ pg_log_info("could not finish writing WAL files: %m");
+ return;
+ }
+
+ PQfinish(conn);
+ conn = NULL;
+
+ FreeWalDirectoryMethod();
+ pg_free(stream.walmethod);
+ pg_free(stream.sysidentifier);
+}
+
+/*
+ * When sigint is called, just tell the system to exit at the next possible
+ * moment.
+ */
+#ifndef WIN32
+
+static void
+sigint_handler(int signum)
+{
+ time_to_stop = true;
+}
+#endif
+
+int
+main(int argc, char **argv)
+{
+ static struct option long_options[] = {
+ {"help", no_argument, NULL, '?'},
+ {"version", no_argument, NULL, 'V'},
+ {"directory", required_argument, NULL, 'D'},
+ {"dbname", required_argument, NULL, 'd'},
+ {"endpos", required_argument, NULL, 'E'},
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-loop", no_argument, NULL, 'n'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"status-interval", required_argument, NULL, 's'},
+ {"slot", required_argument, NULL, 'S'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"compress", required_argument, NULL, 'Z'},
+/* action */
+ {"create-slot", no_argument, NULL, 1},
+ {"drop-slot", no_argument, NULL, 2},
+ {"if-not-exists", no_argument, NULL, 3},
+ {"synchronous", no_argument, NULL, 4},
+ {"no-sync", no_argument, NULL, 5},
+ {NULL, 0, NULL, 0}
+ };
+
+ int c;
+ int option_index;
+ char *db_name;
+ uint32 hi,
+ lo;
+ pg_compress_specification compression_spec;
+ char *compression_detail = NULL;
+ char *compression_algorithm_str = "none";
+ char *error_detail = NULL;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_basebackup"));
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ else if (strcmp(argv[1], "-V") == 0 ||
+ strcmp(argv[1], "--version") == 0)
+ {
+ puts("pg_receivewal (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((c = getopt_long(argc, argv, "D:d:E:h:p:U:s:S:nwWvZ:",
+ long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+ case 'D':
+ basedir = pg_strdup(optarg);
+ break;
+ case 'd':
+ connection_string = pg_strdup(optarg);
+ break;
+ case 'h':
+ dbhost = pg_strdup(optarg);
+ break;
+ case 'p':
+ dbport = pg_strdup(optarg);
+ break;
+ case 'U':
+ dbuser = pg_strdup(optarg);
+ break;
+ case 'w':
+ dbgetpassword = -1;
+ break;
+ case 'W':
+ dbgetpassword = 1;
+ break;
+ case 's':
+ if (!option_parse_int(optarg, "-s/--status-interval", 0,
+ INT_MAX / 1000,
+ &standby_message_timeout))
+ exit(1);
+ standby_message_timeout *= 1000;
+ break;
+ case 'S':
+ replication_slot = pg_strdup(optarg);
+ break;
+ case 'E':
+ if (sscanf(optarg, "%X/%X", &hi, &lo) != 2)
+ pg_fatal("could not parse end position \"%s\"", optarg);
+ endpos = ((uint64) hi) << 32 | lo;
+ break;
+ case 'n':
+ noloop = 1;
+ break;
+ case 'v':
+ verbose++;
+ break;
+ case 'Z':
+ parse_compress_options(optarg, &compression_algorithm_str,
+ &compression_detail);
+ break;
+/* action */
+ case 1:
+ do_create_slot = true;
+ break;
+ case 2:
+ do_drop_slot = true;
+ break;
+ case 3:
+ slot_exists_ok = true;
+ break;
+ case 4:
+ synchronous = true;
+ break;
+ case 5:
+ do_sync = false;
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /*
+ * Any non-option arguments?
+ */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (do_drop_slot && do_create_slot)
+ {
+ pg_log_error("cannot use --create-slot together with --drop-slot");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (replication_slot == NULL && (do_drop_slot || do_create_slot))
+ {
+ /* translator: second %s is an option name */
+ pg_log_error("%s needs a slot to be specified using --slot",
+ do_drop_slot ? "--drop-slot" : "--create-slot");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (synchronous && !do_sync)
+ {
+ pg_log_error("cannot use --synchronous together with --no-sync");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Required arguments
+ */
+ if (basedir == NULL && !do_drop_slot && !do_create_slot)
+ {
+ pg_log_error("no target directory specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Compression options
+ */
+ if (!parse_compress_algorithm(compression_algorithm_str,
+ &compression_algorithm))
+ pg_fatal("unrecognized compression algorithm: \"%s\"",
+ compression_algorithm_str);
+
+ parse_compress_specification(compression_algorithm, compression_detail,
+ &compression_spec);
+ error_detail = validate_compress_specification(&compression_spec);
+ if (error_detail != NULL)
+ pg_fatal("invalid compression specification: %s",
+ error_detail);
+
+ /* Extract the compression level */
+ compresslevel = compression_spec.level;
+
+ if (compression_algorithm == PG_COMPRESSION_ZSTD)
+ pg_fatal("compression with %s is not yet supported", "ZSTD");
+
+ /*
+ * Check existence of destination folder.
+ */
+ if (!do_drop_slot && !do_create_slot)
+ {
+ DIR *dir = get_destination_dir(basedir);
+
+ close_destination_dir(dir, basedir);
+ }
+
+ /*
+ * Obtain a connection before doing anything.
+ */
+ conn = GetConnection();
+ if (!conn)
+ /* error message already written in GetConnection() */
+ exit(1);
+ atexit(disconnect_atexit);
+
+ /*
+ * Trap signals. (Don't do this until after the initial password prompt,
+ * if one is needed, in GetConnection.)
+ */
+#ifndef WIN32
+ pqsignal(SIGINT, sigint_handler);
+#endif
+
+ /*
+ * Run IDENTIFY_SYSTEM to make sure we've successfully have established a
+ * replication connection and haven't connected using a database specific
+ * connection.
+ */
+ if (!RunIdentifySystem(conn, NULL, NULL, NULL, &db_name))
+ exit(1);
+
+ /*
+ * Check that there is a database associated with connection, none should
+ * be defined in this context.
+ */
+ if (db_name)
+ pg_fatal("replication connection using slot \"%s\" is unexpectedly database specific",
+ replication_slot);
+
+ /*
+ * Set umask so that directories/files are created with the same
+ * permissions as directories/files in the source data directory.
+ *
+ * pg_mode_mask is set to owner-only by default and then updated in
+ * GetConnection() where we get the mode from the server-side with
+ * RetrieveDataDirCreatePerm() and then call SetDataDirectoryCreatePerm().
+ */
+ umask(pg_mode_mask);
+
+ /*
+ * Drop a replication slot.
+ */
+ if (do_drop_slot)
+ {
+ if (verbose)
+ pg_log_info("dropping replication slot \"%s\"", replication_slot);
+
+ if (!DropReplicationSlot(conn, replication_slot))
+ exit(1);
+ exit(0);
+ }
+
+ /* Create a replication slot */
+ if (do_create_slot)
+ {
+ if (verbose)
+ pg_log_info("creating replication slot \"%s\"", replication_slot);
+
+ if (!CreateReplicationSlot(conn, replication_slot, NULL, false, true, false,
+ slot_exists_ok, false))
+ exit(1);
+ exit(0);
+ }
+
+ /* determine remote server's xlog segment size */
+ if (!RetrieveWalSegSize(conn))
+ exit(1);
+
+ /*
+ * Don't close the connection here so that subsequent StreamLog() can
+ * reuse it.
+ */
+
+ while (true)
+ {
+ StreamLog();
+ if (time_to_stop)
+ {
+ /*
+ * We've been Ctrl-C'ed or end of streaming position has been
+ * willingly reached, so exit without an error code.
+ */
+ exit(0);
+ }
+ else if (noloop)
+ pg_fatal("disconnected");
+ else
+ {
+ /* translator: check source for value for %d */
+ pg_log_info("disconnected; waiting %d seconds to try again",
+ RECONNECT_SLEEP_TIME);
+ pg_usleep(RECONNECT_SLEEP_TIME * 1000000);
+ }
+ }
+}
diff --git a/src/bin/pg_basebackup/pg_recvlogical.c b/src/bin/pg_basebackup/pg_recvlogical.c
new file mode 100644
index 0000000..02b8e27
--- /dev/null
+++ b/src/bin/pg_basebackup/pg_recvlogical.c
@@ -0,0 +1,1039 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_recvlogical.c - receive data from a logical decoding slot in a streaming
+ * fashion and write it to a local file.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/pg_recvlogical.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <dirent.h>
+#include <limits.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+#include "access/xlog_internal.h"
+#include "common/fe_memutils.h"
+#include "common/file_perm.h"
+#include "common/logging.h"
+#include "fe_utils/option_utils.h"
+#include "getopt_long.h"
+#include "libpq-fe.h"
+#include "libpq/pqsignal.h"
+#include "pqexpbuffer.h"
+#include "streamutil.h"
+
+/* Time to sleep between reconnection attempts */
+#define RECONNECT_SLEEP_TIME 5
+
+/* Global Options */
+static char *outfile = NULL;
+static int verbose = 0;
+static bool two_phase = false;
+static int noloop = 0;
+static int standby_message_timeout = 10 * 1000; /* 10 sec = default */
+static int fsync_interval = 10 * 1000; /* 10 sec = default */
+static XLogRecPtr startpos = InvalidXLogRecPtr;
+static XLogRecPtr endpos = InvalidXLogRecPtr;
+static bool do_create_slot = false;
+static bool slot_exists_ok = false;
+static bool do_start_slot = false;
+static bool do_drop_slot = false;
+static char *replication_slot = NULL;
+
+/* filled pairwise with option, value. value may be NULL */
+static char **options;
+static size_t noptions = 0;
+static const char *plugin = "test_decoding";
+
+/* Global State */
+static int outfd = -1;
+static volatile sig_atomic_t time_to_abort = false;
+static volatile sig_atomic_t output_reopen = false;
+static bool output_isfile;
+static TimestampTz output_last_fsync = -1;
+static bool output_needs_fsync = false;
+static XLogRecPtr output_written_lsn = InvalidXLogRecPtr;
+static XLogRecPtr output_fsync_lsn = InvalidXLogRecPtr;
+
+static void usage(void);
+static void StreamLogicalLog(void);
+static bool flushAndSendFeedback(PGconn *conn, TimestampTz *now);
+static void prepareToTerminate(PGconn *conn, XLogRecPtr endpos,
+ bool keepalive, XLogRecPtr lsn);
+
+static void
+usage(void)
+{
+ printf(_("%s controls PostgreSQL logical decoding streams.\n\n"),
+ progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]...\n"), progname);
+ printf(_("\nAction to be performed:\n"));
+ printf(_(" --create-slot create a new replication slot (for the slot's name see --slot)\n"));
+ printf(_(" --drop-slot drop the replication slot (for the slot's name see --slot)\n"));
+ printf(_(" --start start streaming in a replication slot (for the slot's name see --slot)\n"));
+ printf(_("\nOptions:\n"));
+ printf(_(" -E, --endpos=LSN exit after receiving the specified LSN\n"));
+ printf(_(" -f, --file=FILE receive log into this file, - for stdout\n"));
+ printf(_(" -F --fsync-interval=SECS\n"
+ " time between fsyncs to the output file (default: %d)\n"), (fsync_interval / 1000));
+ printf(_(" --if-not-exists do not error if slot already exists when creating a slot\n"));
+ printf(_(" -I, --startpos=LSN where in an existing slot should the streaming start\n"));
+ printf(_(" -n, --no-loop do not loop on connection lost\n"));
+ printf(_(" -o, --option=NAME[=VALUE]\n"
+ " pass option NAME with optional value VALUE to the\n"
+ " output plugin\n"));
+ printf(_(" -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"), plugin);
+ printf(_(" -s, --status-interval=SECS\n"
+ " time between status packets sent to server (default: %d)\n"), (standby_message_timeout / 1000));
+ printf(_(" -S, --slot=SLOTNAME name of the logical replication slot\n"));
+ printf(_(" -t, --two-phase enable decoding of prepared transactions when creating a slot\n"));
+ printf(_(" -v, --verbose output verbose messages\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -d, --dbname=DBNAME database to connect to\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port number\n"));
+ printf(_(" -U, --username=NAME connect as specified database user\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt (should happen automatically)\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+/*
+ * Send a Standby Status Update message to server.
+ */
+static bool
+sendFeedback(PGconn *conn, TimestampTz now, bool force, bool replyRequested)
+{
+ static XLogRecPtr last_written_lsn = InvalidXLogRecPtr;
+ static XLogRecPtr last_fsync_lsn = InvalidXLogRecPtr;
+
+ char replybuf[1 + 8 + 8 + 8 + 8 + 1];
+ int len = 0;
+
+ /*
+ * we normally don't want to send superfluous feedback, but if it's
+ * because of a timeout we need to, otherwise wal_sender_timeout will kill
+ * us.
+ */
+ if (!force &&
+ last_written_lsn == output_written_lsn &&
+ last_fsync_lsn == output_fsync_lsn)
+ return true;
+
+ if (verbose)
+ pg_log_info("confirming write up to %X/%X, flush to %X/%X (slot %s)",
+ LSN_FORMAT_ARGS(output_written_lsn),
+ LSN_FORMAT_ARGS(output_fsync_lsn),
+ replication_slot);
+
+ replybuf[len] = 'r';
+ len += 1;
+ fe_sendint64(output_written_lsn, &replybuf[len]); /* write */
+ len += 8;
+ fe_sendint64(output_fsync_lsn, &replybuf[len]); /* flush */
+ len += 8;
+ fe_sendint64(InvalidXLogRecPtr, &replybuf[len]); /* apply */
+ len += 8;
+ fe_sendint64(now, &replybuf[len]); /* sendTime */
+ len += 8;
+ replybuf[len] = replyRequested ? 1 : 0; /* replyRequested */
+ len += 1;
+
+ startpos = output_written_lsn;
+ last_written_lsn = output_written_lsn;
+ last_fsync_lsn = output_fsync_lsn;
+
+ if (PQputCopyData(conn, replybuf, len) <= 0 || PQflush(conn))
+ {
+ pg_log_error("could not send feedback packet: %s",
+ PQerrorMessage(conn));
+ return false;
+ }
+
+ return true;
+}
+
+static void
+disconnect_atexit(void)
+{
+ if (conn != NULL)
+ PQfinish(conn);
+}
+
+static bool
+OutputFsync(TimestampTz now)
+{
+ output_last_fsync = now;
+
+ output_fsync_lsn = output_written_lsn;
+
+ if (fsync_interval <= 0)
+ return true;
+
+ if (!output_needs_fsync)
+ return true;
+
+ output_needs_fsync = false;
+
+ /* can only fsync if it's a regular file */
+ if (!output_isfile)
+ return true;
+
+ if (fsync(outfd) != 0)
+ pg_fatal("could not fsync file \"%s\": %m", outfile);
+
+ return true;
+}
+
+/*
+ * Start the log streaming
+ */
+static void
+StreamLogicalLog(void)
+{
+ PGresult *res;
+ char *copybuf = NULL;
+ TimestampTz last_status = -1;
+ int i;
+ PQExpBuffer query;
+
+ output_written_lsn = InvalidXLogRecPtr;
+ output_fsync_lsn = InvalidXLogRecPtr;
+
+ /*
+ * Connect in replication mode to the server
+ */
+ if (!conn)
+ conn = GetConnection();
+ if (!conn)
+ /* Error message already written in GetConnection() */
+ return;
+
+ /*
+ * Start the replication
+ */
+ if (verbose)
+ pg_log_info("starting log streaming at %X/%X (slot %s)",
+ LSN_FORMAT_ARGS(startpos),
+ replication_slot);
+
+ /* Initiate the replication stream at specified location */
+ query = createPQExpBuffer();
+ appendPQExpBuffer(query, "START_REPLICATION SLOT \"%s\" LOGICAL %X/%X",
+ replication_slot, LSN_FORMAT_ARGS(startpos));
+
+ /* print options if there are any */
+ if (noptions)
+ appendPQExpBufferStr(query, " (");
+
+ for (i = 0; i < noptions; i++)
+ {
+ /* separator */
+ if (i > 0)
+ appendPQExpBufferStr(query, ", ");
+
+ /* write option name */
+ appendPQExpBuffer(query, "\"%s\"", options[(i * 2)]);
+
+ /* write option value if specified */
+ if (options[(i * 2) + 1] != NULL)
+ appendPQExpBuffer(query, " '%s'", options[(i * 2) + 1]);
+ }
+
+ if (noptions)
+ appendPQExpBufferChar(query, ')');
+
+ res = PQexec(conn, query->data);
+ if (PQresultStatus(res) != PGRES_COPY_BOTH)
+ {
+ pg_log_error("could not send replication command \"%s\": %s",
+ query->data, PQresultErrorMessage(res));
+ PQclear(res);
+ goto error;
+ }
+ PQclear(res);
+ resetPQExpBuffer(query);
+
+ if (verbose)
+ pg_log_info("streaming initiated");
+
+ while (!time_to_abort)
+ {
+ int r;
+ int bytes_left;
+ int bytes_written;
+ TimestampTz now;
+ int hdr_len;
+ XLogRecPtr cur_record_lsn = InvalidXLogRecPtr;
+
+ if (copybuf != NULL)
+ {
+ PQfreemem(copybuf);
+ copybuf = NULL;
+ }
+
+ /*
+ * Potentially send a status message to the primary.
+ */
+ now = feGetCurrentTimestamp();
+
+ if (outfd != -1 &&
+ feTimestampDifferenceExceeds(output_last_fsync, now,
+ fsync_interval))
+ {
+ if (!OutputFsync(now))
+ goto error;
+ }
+
+ if (standby_message_timeout > 0 &&
+ feTimestampDifferenceExceeds(last_status, now,
+ standby_message_timeout))
+ {
+ /* Time to send feedback! */
+ if (!sendFeedback(conn, now, true, false))
+ goto error;
+
+ last_status = now;
+ }
+
+ /* got SIGHUP, close output file */
+ if (outfd != -1 && output_reopen && strcmp(outfile, "-") != 0)
+ {
+ now = feGetCurrentTimestamp();
+ if (!OutputFsync(now))
+ goto error;
+ close(outfd);
+ outfd = -1;
+ }
+ output_reopen = false;
+
+ /* open the output file, if not open yet */
+ if (outfd == -1)
+ {
+ struct stat statbuf;
+
+ if (strcmp(outfile, "-") == 0)
+ outfd = fileno(stdout);
+ else
+ outfd = open(outfile, O_CREAT | O_APPEND | O_WRONLY | PG_BINARY,
+ S_IRUSR | S_IWUSR);
+ if (outfd == -1)
+ {
+ pg_log_error("could not open log file \"%s\": %m", outfile);
+ goto error;
+ }
+
+ if (fstat(outfd, &statbuf) != 0)
+ {
+ pg_log_error("could not stat file \"%s\": %m", outfile);
+ goto error;
+ }
+
+ output_isfile = S_ISREG(statbuf.st_mode) && !isatty(outfd);
+ }
+
+ r = PQgetCopyData(conn, &copybuf, 1);
+ if (r == 0)
+ {
+ /*
+ * In async mode, and no data available. We block on reading but
+ * not more than the specified timeout, so that we can send a
+ * response back to the client.
+ */
+ fd_set input_mask;
+ TimestampTz message_target = 0;
+ TimestampTz fsync_target = 0;
+ struct timeval timeout;
+ struct timeval *timeoutptr = NULL;
+
+ if (PQsocket(conn) < 0)
+ {
+ pg_log_error("invalid socket: %s", PQerrorMessage(conn));
+ goto error;
+ }
+
+ FD_ZERO(&input_mask);
+ FD_SET(PQsocket(conn), &input_mask);
+
+ /* Compute when we need to wakeup to send a keepalive message. */
+ if (standby_message_timeout)
+ message_target = last_status + (standby_message_timeout - 1) *
+ ((int64) 1000);
+
+ /* Compute when we need to wakeup to fsync the output file. */
+ if (fsync_interval > 0 && output_needs_fsync)
+ fsync_target = output_last_fsync + (fsync_interval - 1) *
+ ((int64) 1000);
+
+ /* Now compute when to wakeup. */
+ if (message_target > 0 || fsync_target > 0)
+ {
+ TimestampTz targettime;
+ long secs;
+ int usecs;
+
+ targettime = message_target;
+
+ if (fsync_target > 0 && fsync_target < targettime)
+ targettime = fsync_target;
+
+ feTimestampDifference(now,
+ targettime,
+ &secs,
+ &usecs);
+ if (secs <= 0)
+ timeout.tv_sec = 1; /* Always sleep at least 1 sec */
+ else
+ timeout.tv_sec = secs;
+ timeout.tv_usec = usecs;
+ timeoutptr = &timeout;
+ }
+
+ r = select(PQsocket(conn) + 1, &input_mask, NULL, NULL, timeoutptr);
+ if (r == 0 || (r < 0 && errno == EINTR))
+ {
+ /*
+ * Got a timeout or signal. Continue the loop and either
+ * deliver a status packet to the server or just go back into
+ * blocking.
+ */
+ continue;
+ }
+ else if (r < 0)
+ {
+ pg_log_error("%s() failed: %m", "select");
+ goto error;
+ }
+
+ /* Else there is actually data on the socket */
+ if (PQconsumeInput(conn) == 0)
+ {
+ pg_log_error("could not receive data from WAL stream: %s",
+ PQerrorMessage(conn));
+ goto error;
+ }
+ continue;
+ }
+
+ /* End of copy stream */
+ if (r == -1)
+ break;
+
+ /* Failure while reading the copy stream */
+ if (r == -2)
+ {
+ pg_log_error("could not read COPY data: %s",
+ PQerrorMessage(conn));
+ goto error;
+ }
+
+ /* Check the message type. */
+ if (copybuf[0] == 'k')
+ {
+ int pos;
+ bool replyRequested;
+ XLogRecPtr walEnd;
+ bool endposReached = false;
+
+ /*
+ * Parse the keepalive message, enclosed in the CopyData message.
+ * We just check if the server requested a reply, and ignore the
+ * rest.
+ */
+ pos = 1; /* skip msgtype 'k' */
+ walEnd = fe_recvint64(&copybuf[pos]);
+ output_written_lsn = Max(walEnd, output_written_lsn);
+
+ pos += 8; /* read walEnd */
+
+ pos += 8; /* skip sendTime */
+
+ if (r < pos + 1)
+ {
+ pg_log_error("streaming header too small: %d", r);
+ goto error;
+ }
+ replyRequested = copybuf[pos];
+
+ if (endpos != InvalidXLogRecPtr && walEnd >= endpos)
+ {
+ /*
+ * If there's nothing to read on the socket until a keepalive
+ * we know that the server has nothing to send us; and if
+ * walEnd has passed endpos, we know nothing else can have
+ * committed before endpos. So we can bail out now.
+ */
+ endposReached = true;
+ }
+
+ /* Send a reply, if necessary */
+ if (replyRequested || endposReached)
+ {
+ if (!flushAndSendFeedback(conn, &now))
+ goto error;
+ last_status = now;
+ }
+
+ if (endposReached)
+ {
+ prepareToTerminate(conn, endpos, true, InvalidXLogRecPtr);
+ time_to_abort = true;
+ break;
+ }
+
+ continue;
+ }
+ else if (copybuf[0] != 'w')
+ {
+ pg_log_error("unrecognized streaming header: \"%c\"",
+ copybuf[0]);
+ goto error;
+ }
+
+ /*
+ * Read the header of the XLogData message, enclosed in the CopyData
+ * message. We only need the WAL location field (dataStart), the rest
+ * of the header is ignored.
+ */
+ hdr_len = 1; /* msgtype 'w' */
+ hdr_len += 8; /* dataStart */
+ hdr_len += 8; /* walEnd */
+ hdr_len += 8; /* sendTime */
+ if (r < hdr_len + 1)
+ {
+ pg_log_error("streaming header too small: %d", r);
+ goto error;
+ }
+
+ /* Extract WAL location for this block */
+ cur_record_lsn = fe_recvint64(&copybuf[1]);
+
+ if (endpos != InvalidXLogRecPtr && cur_record_lsn > endpos)
+ {
+ /*
+ * We've read past our endpoint, so prepare to go away being
+ * cautious about what happens to our output data.
+ */
+ if (!flushAndSendFeedback(conn, &now))
+ goto error;
+ prepareToTerminate(conn, endpos, false, cur_record_lsn);
+ time_to_abort = true;
+ break;
+ }
+
+ output_written_lsn = Max(cur_record_lsn, output_written_lsn);
+
+ bytes_left = r - hdr_len;
+ bytes_written = 0;
+
+ /* signal that a fsync is needed */
+ output_needs_fsync = true;
+
+ while (bytes_left)
+ {
+ int ret;
+
+ ret = write(outfd,
+ copybuf + hdr_len + bytes_written,
+ bytes_left);
+
+ if (ret < 0)
+ {
+ pg_log_error("could not write %d bytes to log file \"%s\": %m",
+ bytes_left, outfile);
+ goto error;
+ }
+
+ /* Write was successful, advance our position */
+ bytes_written += ret;
+ bytes_left -= ret;
+ }
+
+ if (write(outfd, "\n", 1) != 1)
+ {
+ pg_log_error("could not write %d bytes to log file \"%s\": %m",
+ 1, outfile);
+ goto error;
+ }
+
+ if (endpos != InvalidXLogRecPtr && cur_record_lsn == endpos)
+ {
+ /* endpos was exactly the record we just processed, we're done */
+ if (!flushAndSendFeedback(conn, &now))
+ goto error;
+ prepareToTerminate(conn, endpos, false, cur_record_lsn);
+ time_to_abort = true;
+ break;
+ }
+ }
+
+ res = PQgetResult(conn);
+ if (PQresultStatus(res) == PGRES_COPY_OUT)
+ {
+ PQclear(res);
+
+ /*
+ * We're doing a client-initiated clean exit and have sent CopyDone to
+ * the server. Drain any messages, so we don't miss a last-minute
+ * ErrorResponse. The walsender stops generating XLogData records once
+ * it sees CopyDone, so expect this to finish quickly. After CopyDone,
+ * it's too late for sendFeedback(), even if this were to take a long
+ * time. Hence, use synchronous-mode PQgetCopyData().
+ */
+ while (1)
+ {
+ int r;
+
+ if (copybuf != NULL)
+ {
+ PQfreemem(copybuf);
+ copybuf = NULL;
+ }
+ r = PQgetCopyData(conn, &copybuf, 0);
+ if (r == -1)
+ break;
+ if (r == -2)
+ {
+ pg_log_error("could not read COPY data: %s",
+ PQerrorMessage(conn));
+ time_to_abort = false; /* unclean exit */
+ goto error;
+ }
+ }
+
+ res = PQgetResult(conn);
+ }
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("unexpected termination of replication stream: %s",
+ PQresultErrorMessage(res));
+ goto error;
+ }
+ PQclear(res);
+
+ if (outfd != -1 && strcmp(outfile, "-") != 0)
+ {
+ TimestampTz t = feGetCurrentTimestamp();
+
+ /* no need to jump to error on failure here, we're finishing anyway */
+ OutputFsync(t);
+
+ if (close(outfd) != 0)
+ pg_log_error("could not close file \"%s\": %m", outfile);
+ }
+ outfd = -1;
+error:
+ if (copybuf != NULL)
+ {
+ PQfreemem(copybuf);
+ copybuf = NULL;
+ }
+ destroyPQExpBuffer(query);
+ PQfinish(conn);
+ conn = NULL;
+}
+
+/*
+ * Unfortunately we can't do sensible signal handling on windows...
+ */
+#ifndef WIN32
+
+/*
+ * When sigint is called, just tell the system to exit at the next possible
+ * moment.
+ */
+static void
+sigint_handler(int signum)
+{
+ time_to_abort = true;
+}
+
+/*
+ * Trigger the output file to be reopened.
+ */
+static void
+sighup_handler(int signum)
+{
+ output_reopen = true;
+}
+#endif
+
+
+int
+main(int argc, char **argv)
+{
+ static struct option long_options[] = {
+/* general options */
+ {"file", required_argument, NULL, 'f'},
+ {"fsync-interval", required_argument, NULL, 'F'},
+ {"no-loop", no_argument, NULL, 'n'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"two-phase", no_argument, NULL, 't'},
+ {"version", no_argument, NULL, 'V'},
+ {"help", no_argument, NULL, '?'},
+/* connection options */
+ {"dbname", required_argument, NULL, 'd'},
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+/* replication options */
+ {"startpos", required_argument, NULL, 'I'},
+ {"endpos", required_argument, NULL, 'E'},
+ {"option", required_argument, NULL, 'o'},
+ {"plugin", required_argument, NULL, 'P'},
+ {"status-interval", required_argument, NULL, 's'},
+ {"slot", required_argument, NULL, 'S'},
+/* action */
+ {"create-slot", no_argument, NULL, 1},
+ {"start", no_argument, NULL, 2},
+ {"drop-slot", no_argument, NULL, 3},
+ {"if-not-exists", no_argument, NULL, 4},
+ {NULL, 0, NULL, 0}
+ };
+ int c;
+ int option_index;
+ uint32 hi,
+ lo;
+ char *db_name;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_basebackup"));
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ else if (strcmp(argv[1], "-V") == 0 ||
+ strcmp(argv[1], "--version") == 0)
+ {
+ puts("pg_recvlogical (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((c = getopt_long(argc, argv, "E:f:F:nvtd:h:p:U:wWI:o:P:s:S:",
+ long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+/* general options */
+ case 'f':
+ outfile = pg_strdup(optarg);
+ break;
+ case 'F':
+ if (!option_parse_int(optarg, "-F/--fsync-interval", 0,
+ INT_MAX / 1000,
+ &fsync_interval))
+ exit(1);
+ fsync_interval *= 1000;
+ break;
+ case 'n':
+ noloop = 1;
+ break;
+ case 'v':
+ verbose++;
+ break;
+ case 't':
+ two_phase = true;
+ break;
+/* connection options */
+ case 'd':
+ dbname = pg_strdup(optarg);
+ break;
+ case 'h':
+ dbhost = pg_strdup(optarg);
+ break;
+ case 'p':
+ dbport = pg_strdup(optarg);
+ break;
+ case 'U':
+ dbuser = pg_strdup(optarg);
+ break;
+ case 'w':
+ dbgetpassword = -1;
+ break;
+ case 'W':
+ dbgetpassword = 1;
+ break;
+/* replication options */
+ case 'I':
+ if (sscanf(optarg, "%X/%X", &hi, &lo) != 2)
+ pg_fatal("could not parse start position \"%s\"", optarg);
+ startpos = ((uint64) hi) << 32 | lo;
+ break;
+ case 'E':
+ if (sscanf(optarg, "%X/%X", &hi, &lo) != 2)
+ pg_fatal("could not parse end position \"%s\"", optarg);
+ endpos = ((uint64) hi) << 32 | lo;
+ break;
+ case 'o':
+ {
+ char *data = pg_strdup(optarg);
+ char *val = strchr(data, '=');
+
+ if (val != NULL)
+ {
+ /* remove =; separate data from val */
+ *val = '\0';
+ val++;
+ }
+
+ noptions += 1;
+ options = pg_realloc(options, sizeof(char *) * noptions * 2);
+
+ options[(noptions - 1) * 2] = data;
+ options[(noptions - 1) * 2 + 1] = val;
+ }
+
+ break;
+ case 'P':
+ plugin = pg_strdup(optarg);
+ break;
+ case 's':
+ if (!option_parse_int(optarg, "-s/--status-interval", 0,
+ INT_MAX / 1000,
+ &standby_message_timeout))
+ exit(1);
+ standby_message_timeout *= 1000;
+ break;
+ case 'S':
+ replication_slot = pg_strdup(optarg);
+ break;
+/* action */
+ case 1:
+ do_create_slot = true;
+ break;
+ case 2:
+ do_start_slot = true;
+ break;
+ case 3:
+ do_drop_slot = true;
+ break;
+ case 4:
+ slot_exists_ok = true;
+ break;
+
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /*
+ * Any non-option arguments?
+ */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Required arguments
+ */
+ if (replication_slot == NULL)
+ {
+ pg_log_error("no slot specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (do_start_slot && outfile == NULL)
+ {
+ pg_log_error("no target file specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (!do_drop_slot && dbname == NULL)
+ {
+ pg_log_error("no database specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (!do_drop_slot && !do_create_slot && !do_start_slot)
+ {
+ pg_log_error("at least one action needs to be specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (do_drop_slot && (do_create_slot || do_start_slot))
+ {
+ pg_log_error("cannot use --create-slot or --start together with --drop-slot");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (startpos != InvalidXLogRecPtr && (do_create_slot || do_drop_slot))
+ {
+ pg_log_error("cannot use --create-slot or --drop-slot together with --startpos");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (endpos != InvalidXLogRecPtr && !do_start_slot)
+ {
+ pg_log_error("--endpos may only be specified with --start");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (two_phase && !do_create_slot)
+ {
+ pg_log_error("--two-phase may only be specified with --create-slot");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Obtain a connection to server. Notably, if we need a password, we want
+ * to collect it from the user immediately.
+ */
+ conn = GetConnection();
+ if (!conn)
+ /* Error message already written in GetConnection() */
+ exit(1);
+ atexit(disconnect_atexit);
+
+ /*
+ * Trap signals. (Don't do this until after the initial password prompt,
+ * if one is needed, in GetConnection.)
+ */
+#ifndef WIN32
+ pqsignal(SIGINT, sigint_handler);
+ pqsignal(SIGHUP, sighup_handler);
+#endif
+
+ /*
+ * Run IDENTIFY_SYSTEM to make sure we connected using a database specific
+ * replication connection.
+ */
+ if (!RunIdentifySystem(conn, NULL, NULL, NULL, &db_name))
+ exit(1);
+
+ if (db_name == NULL)
+ pg_fatal("could not establish database-specific replication connection");
+
+ /*
+ * Set umask so that directories/files are created with the same
+ * permissions as directories/files in the source data directory.
+ *
+ * pg_mode_mask is set to owner-only by default and then updated in
+ * GetConnection() where we get the mode from the server-side with
+ * RetrieveDataDirCreatePerm() and then call SetDataDirectoryCreatePerm().
+ */
+ umask(pg_mode_mask);
+
+ /* Drop a replication slot. */
+ if (do_drop_slot)
+ {
+ if (verbose)
+ pg_log_info("dropping replication slot \"%s\"", replication_slot);
+
+ if (!DropReplicationSlot(conn, replication_slot))
+ exit(1);
+ }
+
+ /* Create a replication slot. */
+ if (do_create_slot)
+ {
+ if (verbose)
+ pg_log_info("creating replication slot \"%s\"", replication_slot);
+
+ if (!CreateReplicationSlot(conn, replication_slot, plugin, false,
+ false, false, slot_exists_ok, two_phase))
+ exit(1);
+ startpos = InvalidXLogRecPtr;
+ }
+
+ if (!do_start_slot)
+ exit(0);
+
+ /* Stream loop */
+ while (true)
+ {
+ StreamLogicalLog();
+ if (time_to_abort)
+ {
+ /*
+ * We've been Ctrl-C'ed or reached an exit limit condition. That's
+ * not an error, so exit without an errorcode.
+ */
+ exit(0);
+ }
+ else if (noloop)
+ pg_fatal("disconnected");
+ else
+ {
+ /* translator: check source for value for %d */
+ pg_log_info("disconnected; waiting %d seconds to try again",
+ RECONNECT_SLEEP_TIME);
+ pg_usleep(RECONNECT_SLEEP_TIME * 1000000);
+ }
+ }
+}
+
+/*
+ * Fsync our output data, and send a feedback message to the server. Returns
+ * true if successful, false otherwise.
+ *
+ * If successful, *now is updated to the current timestamp just before sending
+ * feedback.
+ */
+static bool
+flushAndSendFeedback(PGconn *conn, TimestampTz *now)
+{
+ /* flush data to disk, so that we send a recent flush pointer */
+ if (!OutputFsync(*now))
+ return false;
+ *now = feGetCurrentTimestamp();
+ if (!sendFeedback(conn, *now, true, false))
+ return false;
+
+ return true;
+}
+
+/*
+ * Try to inform the server about our upcoming demise, but don't wait around or
+ * retry on failure.
+ */
+static void
+prepareToTerminate(PGconn *conn, XLogRecPtr endpos, bool keepalive, XLogRecPtr lsn)
+{
+ (void) PQputCopyEnd(conn, NULL);
+ (void) PQflush(conn);
+
+ if (verbose)
+ {
+ if (keepalive)
+ pg_log_info("end position %X/%X reached by keepalive",
+ LSN_FORMAT_ARGS(endpos));
+ else
+ pg_log_info("end position %X/%X reached by WAL record at %X/%X",
+ LSN_FORMAT_ARGS(endpos), LSN_FORMAT_ARGS(lsn));
+ }
+}
diff --git a/src/bin/pg_basebackup/po/de.po b/src/bin/pg_basebackup/po/de.po
new file mode 100644
index 0000000..97fc0f6
--- /dev/null
+++ b/src/bin/pg_basebackup/po/de.po
@@ -0,0 +1,1812 @@
+# German message translation file for pg_basebackup
+# Copyright (C) 2011 - 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-24 23:18+0000\n"
+"PO-Revision-Date: 2022-09-25 10:56+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../common/compression.c:130 ../../common/compression.c:139
+#: ../../common/compression.c:148
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "diese Installation unterstützt keine Komprimierung mit %s"
+
+#: ../../common/compression.c:203
+msgid "found empty string where a compression option was expected"
+msgstr "leere Zeichenkette gefunden wo eine Komprimierungsoption erwartet wurde"
+
+#: ../../common/compression.c:237
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "unbekannte Komprimierungsoption: »%s«"
+
+#: ../../common/compression.c:276
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "Komprimierungsoption »%s« benötigt einen Wert"
+
+#: ../../common/compression.c:285
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "Wert für Komprimierungsoption »%s« muss eine ganze Zahl sein"
+
+#: ../../common/compression.c:335
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "Komprimierungsalgorithmus »%s« akzeptiert kein Komprimierungsniveau"
+
+#: ../../common/compression.c:342
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "Komprimierungsalgorithmus »%s« erwartet ein Komprimierungsniveau zwischen %d und %d (Standard bei %d)"
+
+#: ../../common/compression.c:353
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "Komprimierungsalgorithmus »%s« akzeptiert keine Worker-Anzahl"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#: pg_receivewal.c:380 pg_recvlogical.c:341
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m"
+
+#: ../../common/file_utils.c:166 pg_receivewal.c:303
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht öffnen: %m"
+
+#: ../../common/file_utils.c:200 pg_receivewal.c:532
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht lesen: %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:447
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#: pg_recvlogical.c:196
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht fsyncen: %m"
+
+#: ../../common/file_utils.c:383 pg_basebackup.c:2256 walmethods.c:459
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ungültiger Wert »%s« für Option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s muss im Bereich %d..%d sein"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1636
+#, c-format
+msgid "out of memory"
+msgstr "Speicher aufgebraucht"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "konnte nicht in Datei »%s« schreiben: %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339
+#: pg_basebackup.c:1497 pg_basebackup.c:1706
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht erstellen: %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:635
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schließen: %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "unerwarteter Zustand beim Extrahieren des Archivs"
+
+#: bbstreamer_file.c:298 pg_basebackup.c:686 pg_basebackup.c:730
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m"
+
+#: bbstreamer_file.c:304
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "konnte Zugriffsrechte für Verzeichnis »%s« nicht setzen: %m"
+
+#: bbstreamer_file.c:323
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "konnte symbolische Verknüpfung von »%s« nach »%s« nicht erzeugen: %m"
+
+#: bbstreamer_file.c:343
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "konnte Zugriffsrechte von Datei »%s« nicht setzen: %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "konnte komprimierte Datei »%s« nicht erzeugen: %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "konnte Standardausgabe nicht duplizieren: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "konnte Ausgabedatei nicht öffnen: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "konnte Komprimierungsniveau %d nicht setzen: %s"
+
+#: bbstreamer_gzip.c:116 bbstreamer_gzip.c:249
+#, c-format
+msgid "this build does not support gzip compression"
+msgstr "diese Installation unterstützt keine gzip-Komprimierung"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "konnte nicht in komprimierte Datei »%s« schreiben: %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "konnte komprimierte Datei »%s« nicht schließen: %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:869
+#, c-format
+msgid "could not initialize compression library"
+msgstr "konnte Komprimierungsbibliothek nicht initialisieren"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:316
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "konnte Daten nicht dekomprimieren: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "unerwarteter Zustand beim Einfügen der Recovery-Einstellungen"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "konnte lz4-Komprimierungskontext nicht erzeugen: %s"
+
+#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298
+#, c-format
+msgid "this build does not support lz4 compression"
+msgstr "diese Installation unterstützt keine lz4-Komprimierung"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "konnte lz4-Header nicht schreiben: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:168 bbstreamer_zstd.c:210
+#, c-format
+msgid "could not compress data: %s"
+msgstr "konnte Daten nicht komprimieren: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "konnte lz4-Komprimierung nicht beenden: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "konnte Komprimierungsbibliothek nicht initialisieren: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "Tar-Datei-Trailer überschreitet 2 Blöcke"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "unerwarteter Zustand beim Parsen des Tar-Archivs"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "Tar-Mitglied hat leeren Namen"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "COPY-Strom endete vor dem Ende der letzten Datei"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "konnte zstd-Komprimierungskontext nicht erzeugen"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "konnte zstd-Komprimierungsniveau nicht auf %d setzen: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "konnte Komprimierungs-Worker-Anzahl nicht auf %d setzen: %s"
+
+#: bbstreamer_zstd.c:116 bbstreamer_zstd.c:271
+#, c-format
+msgid "this build does not support zstd compression"
+msgstr "diese Installation unterstützt keine zstd-Komprimierung"
+
+#: bbstreamer_zstd.c:262
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "konnte zstd-Dekomprimierungskontext nicht erzeugen"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "entferne Datenverzeichnis »%s«"
+
+#: pg_basebackup.c:242
+#, c-format
+msgid "failed to remove data directory"
+msgstr "konnte Datenverzeichnis nicht entfernen"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "entferne Inhalt des Datenverzeichnisses »%s«"
+
+#: pg_basebackup.c:248
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "konnte Inhalt des Datenverzeichnisses nicht entfernen"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "entferne WAL-Verzeichnis »%s«"
+
+#: pg_basebackup.c:255
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "konnte WAL-Verzeichnis nicht entfernen"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "entferne Inhalt des WAL-Verzeichnisses »%s«"
+
+#: pg_basebackup.c:261
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "konnte Inhalt des WAL-Verzeichnisses nicht entfernen"
+
+#: pg_basebackup.c:267
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "Datenverzeichnis »%s« wurde auf Anwenderwunsch nicht entfernt"
+
+#: pg_basebackup.c:270
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "WAL-Verzeichnis »%s« wurde auf Anwenderwunsch nicht entfernt"
+
+#: pg_basebackup.c:274
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "Änderungen in Tablespace-Verzeichnissen werden nicht rückgängig gemacht"
+
+#: pg_basebackup.c:326
+#, c-format
+msgid "directory name too long"
+msgstr "Verzeichnisname zu lang"
+
+#: pg_basebackup.c:333
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "mehrere »=«-Zeichen im Tablespace-Mapping"
+
+#: pg_basebackup.c:342
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "ungültiges Tablespace-Mapping-Format »%s«, muss »ALTES_VERZ=NEUES_VERZ« sein"
+
+#: pg_basebackup.c:351
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "altes Verzeichnis im Tablespace-Mapping ist kein absoluter Pfad: %s"
+
+#: pg_basebackup.c:355
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "neues Verzeichnis im Tablespace-Mapping ist kein absoluter Pfad: %s"
+
+#: pg_basebackup.c:377
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s erzeugt eine Basissicherung eines laufenden PostgreSQL-Servers.\n"
+"\n"
+
+#: pg_basebackup.c:379 pg_receivewal.c:81 pg_recvlogical.c:78
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_basebackup.c:380 pg_receivewal.c:82 pg_recvlogical.c:79
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_basebackup.c:381
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Optionen die die Ausgabe kontrollieren:\n"
+
+#: pg_basebackup.c:382
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=VERZ Basissicherung in dieses Verzeichnis empfangen\n"
+
+#: pg_basebackup.c:383
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t Ausgabeformat (plain (Voreinstellung), tar)\n"
+
+#: pg_basebackup.c:384
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE maximale Transferrate für Übertragung des Datenver-\n"
+" zeichnisses (in kB/s, oder Suffix »k« oder »M« abgeben)\n"
+
+#: pg_basebackup.c:386
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" Konfiguration für Replikation schreiben\n"
+
+#: pg_basebackup.c:388
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=ZIEL[:DETAIL]\n"
+" Backup-Ziel (wenn nicht Client)\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=ALTES_VERZ=NEUES_VERZ\n"
+" Tablespace in ALTES_VERZ nach NEUES_VERZ verlagern\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALVERZ Verzeichnis für das Write-Ahead-Log\n"
+
+#: pg_basebackup.c:393
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" benötigte WAL-Dateien mit angegebener Methode einbeziehen\n"
+
+#: pg_basebackup.c:395
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip Tar-Ausgabe komprimieren\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METHODE[:DETAIL]\n"
+" auf Client oder Server wie angegeben komprimieren\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none Tar-Ausgabe nicht komprimieren\n"
+
+#: pg_basebackup.c:399
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Allgemeine Optionen:\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" schnelles oder verteiltes Checkpointing einstellen\n"
+
+#: pg_basebackup.c:402
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot Replikations-Slot erzeugen\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL Backup-Label setzen\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean nach Fehlern nicht aufräumen\n"
+
+#: pg_basebackup.c:405
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n"
+" geschrieben sind\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress Fortschrittsinformationen zeigen\n"
+
+#: pg_basebackup.c:407 pg_receivewal.c:91
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=SLOTNAME zu verwendender Replikations-Slot\n"
+
+#: pg_basebackup.c:408 pg_receivewal.c:93 pg_recvlogical.c:100
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose »Verbose«-Modus\n"
+
+#: pg_basebackup.c:409 pg_receivewal.c:94 pg_recvlogical.c:101
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" Algorithmus für Manifest-Prüfsummen\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" alle Dateinamen im Manifest hex-kodieren\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size nicht die Backup-Größe auf dem Server schätzen\n"
+
+#: pg_basebackup.c:415
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest kein Backup-Manifest erzeugen\n"
+
+#: pg_basebackup.c:416
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot keinen temporären Replikations-Slot erzeugen\n"
+
+#: pg_basebackup.c:417
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" Prüfsummen nicht überprüfen\n"
+
+#: pg_basebackup.c:419 pg_receivewal.c:97 pg_recvlogical.c:102
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_basebackup.c:420 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Verbindungsoptionen:\n"
+
+#: pg_basebackup.c:421 pg_receivewal.c:99
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=VERBDG Verbindungsparameter\n"
+
+#: pg_basebackup.c:422 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n"
+
+#: pg_basebackup.c:423 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT Portnummer des Datenbankservers\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVALL\n"
+" Zeit zwischen an Server gesendeten Statuspaketen (in Sekunden)\n"
+
+#: pg_basebackup.c:426 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME Datenbankbenutzername\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:103 pg_recvlogical.c:108
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password niemals nach Passwort fragen\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:104 pg_recvlogical.c:109
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password nach Passwort fragen (sollte automatisch geschehen)\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:108 pg_recvlogical.c:110
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:109 pg_recvlogical.c:111
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_basebackup.c:472
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "konnte nicht aus bereiter Pipe lesen: %m"
+
+#: pg_basebackup.c:475 pg_basebackup.c:622 pg_basebackup.c:2170
+#: streamutil.c:444
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "konnte Write-Ahead-Log-Position »%s« nicht interpretieren"
+
+#: pg_basebackup.c:581 pg_receivewal.c:663
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "konnte WAL-Dateien nicht zu Ende schreiben: %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "konnte Pipe für Hintergrundprozess nicht erzeugen: %m"
+
+#: pg_basebackup.c:664
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "temporärer Replikations-Slot »%s« wurde erzeugt"
+
+#: pg_basebackup.c:667
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "Replikations-Slot »%s« wurde erzeugt"
+
+#: pg_basebackup.c:701
+#, c-format
+msgid "could not create background process: %m"
+msgstr "konnte Hintergrundprozess nicht erzeugen: %m"
+
+#: pg_basebackup.c:710
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "konnte Hintergrund-Thread nicht erzeugen: %m"
+
+#: pg_basebackup.c:749
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "Verzeichnis »%s« existiert aber ist nicht leer"
+
+#: pg_basebackup.c:755
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m"
+
+#: pg_basebackup.c:832
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d Tablespace %*s"
+msgstr[1] "%*s/%s kB (100%%), %d/%d Tablespaces %*s"
+
+#: pg_basebackup.c:844
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d Tablespace (%s%-*.*s)"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d Tablespaces (%s%-*.*s)"
+
+#: pg_basebackup.c:860
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d Tablespace"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d Tablespaces"
+
+#: pg_basebackup.c:884
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "Transferrate »%s« ist kein gültiger Wert"
+
+#: pg_basebackup.c:886
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "ungültige Transferrate »%s«: %m"
+
+#: pg_basebackup.c:893
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "Transferrate muss größer als null sein"
+
+#: pg_basebackup.c:923
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "ungültige Einheit für --max-rate: »%s«"
+
+#: pg_basebackup.c:927
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "Transferrate »%s« überschreitet Bereich für ganze Zahlen"
+
+#: pg_basebackup.c:934
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "Transferrate »%s« ist außerhalb des gültigen Bereichs"
+
+#: pg_basebackup.c:1030
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "konnte COPY-Datenstrom nicht empfangen: %s"
+
+#: pg_basebackup.c:1047 pg_recvlogical.c:438 pg_recvlogical.c:610
+#: receivelog.c:981
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "konnte COPY-Daten nicht lesen: %s"
+
+#: pg_basebackup.c:1051
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "Hintergrundprozess beendete unerwartet"
+
+#: pg_basebackup.c:1122
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "Manifest kann nicht in eine komprimierte Tar-Datei eingefügt werden"
+
+#: pg_basebackup.c:1123
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "Verwenden Sie clientseitige Komprimierung, senden Sie die Ausgabe in ein Verzeichnis statt auf die Standardausgabe, oder verwenden Sie %s."
+
+#: pg_basebackup.c:1139
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "kann Archiv »%s« nicht parsen"
+
+#: pg_basebackup.c:1140
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "Nur Tar-Archive können geparst werden."
+
+#: pg_basebackup.c:1142
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "Format »plain« benötigt pg_basebackup, um das Archiv zu parsen."
+
+#: pg_basebackup.c:1144
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "Wenn - als Ausgabeverzeichnis verwendet wird, wird pg_basebackup benötigt, um das Archiv zu parsen."
+
+#: pg_basebackup.c:1146
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "Die Option -R benötigt pg_basebackup, um das Archiv zu parsen."
+
+#: pg_basebackup.c:1357
+#, c-format
+msgid "archives must precede manifest"
+msgstr "Archive müssen vor dem Manifest kommen"
+
+#: pg_basebackup.c:1372
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "ungültiger Archivname: »%s«"
+
+#: pg_basebackup.c:1444
+#, c-format
+msgid "unexpected payload data"
+msgstr "unerwartete Payload-Daten"
+
+#: pg_basebackup.c:1587
+#, c-format
+msgid "empty COPY message"
+msgstr "leere COPY-Nachricht"
+
+#: pg_basebackup.c:1589
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "fehlerhafte COPY-Nachricht vom Typ %d, Länge %zu"
+
+#: pg_basebackup.c:1787
+#, c-format
+msgid "incompatible server version %s"
+msgstr "inkompatible Serverversion %s"
+
+#: pg_basebackup.c:1803
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "Verwenden Sie -X none oder -X fetch, um Log-Streaming abzuschalten."
+
+#: pg_basebackup.c:1871
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "Backup-Ziele werden von dieser Serverversion nicht unterstützt"
+
+#: pg_basebackup.c:1874
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "Recovery-Konfiguration kann nicht geschrieben werden, wenn ein Backup-Ziel verwendet wird"
+
+#: pg_basebackup.c:1901
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "Server unterstützt keine serverseitige Komprimierung"
+
+#: pg_basebackup.c:1911
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "Basissicherung eingeleitet, warte auf Abschluss des Checkpoints"
+
+#: pg_basebackup.c:1915
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "Warten auf Checkpoint"
+
+#: pg_basebackup.c:1928 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588
+#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504
+#: streamutil.c:656 streamutil.c:701
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "konnte Replikationsbefehl »%s« nicht senden: %s"
+
+#: pg_basebackup.c:1936
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "konnte Basissicherung nicht starten: %s"
+
+#: pg_basebackup.c:1939
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "unerwartete Antwort auf Befehl BASE_BACKUP: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet"
+
+#: pg_basebackup.c:1945
+#, c-format
+msgid "checkpoint completed"
+msgstr "Checkpoint abgeschlossen"
+
+#: pg_basebackup.c:1960
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "Write-Ahead-Log-Startpunkt: %s auf Zeitleiste %u"
+
+#: pg_basebackup.c:1968
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "konnte Kopf der Sicherung nicht empfangen: %s"
+
+#: pg_basebackup.c:1971
+#, c-format
+msgid "no data returned from server"
+msgstr "keine Daten vom Server zurückgegeben"
+
+#: pg_basebackup.c:2006
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "kann nur einen einzelnen Tablespace auf die Standardausgabe schreiben, Datenbank hat %d"
+
+#: pg_basebackup.c:2019
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "Hintergrund-WAL-Receiver wird gestartet"
+
+#: pg_basebackup.c:2101
+#, c-format
+msgid "backup failed: %s"
+msgstr "Backup fehlgeschlagen: %s"
+
+#: pg_basebackup.c:2104
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "keine Write-Ahead-Log-Endposition vom Server zurückgegeben"
+
+#: pg_basebackup.c:2107
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "Write-Ahead-Log-Endposition: %s"
+
+#: pg_basebackup.c:2118
+#, c-format
+msgid "checksum error occurred"
+msgstr "ein Prüfsummenfehler ist aufgetreten"
+
+#: pg_basebackup.c:2123
+#, c-format
+msgid "final receive failed: %s"
+msgstr "letztes Empfangen fehlgeschlagen: %s"
+
+#: pg_basebackup.c:2147
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "warte bis Hintergrundprozess Streaming beendet hat ..."
+
+#: pg_basebackup.c:2151
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "konnte Befehl nicht an Hintergrund-Pipe senden: %m"
+
+#: pg_basebackup.c:2156
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "konnte nicht auf Kindprozess warten: %m"
+
+#: pg_basebackup.c:2158
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "Kindprozess %d endete, aber %d wurde erwartet"
+
+#: pg_basebackup.c:2160 streamutil.c:91 streamutil.c:197
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2180
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "konnte nicht auf Kind-Thread warten: %m"
+
+#: pg_basebackup.c:2185
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "konnte Statuscode des Kind-Threads nicht ermitteln: %m"
+
+#: pg_basebackup.c:2188
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "Kind-Thread hat mit Fehler %u beendet"
+
+#: pg_basebackup.c:2217
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "synchronisiere Daten auf Festplatte ..."
+
+#: pg_basebackup.c:2242
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "umbenennen von backup_manifest.tmp nach backup_manifest"
+
+#: pg_basebackup.c:2262
+#, c-format
+msgid "base backup completed"
+msgstr "Basissicherung abgeschlossen"
+
+#: pg_basebackup.c:2351
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "ungültiges Ausgabeformat »%s«, muss »plain« oder »tar« sein"
+
+#: pg_basebackup.c:2395
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "ungültige Option »%s« für --wal-method, muss »fetch«, »stream« oder »none« sein"
+
+#: pg_basebackup.c:2425
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "ungültiges Checkpoint-Argument »%s«, muss »fast« oder »spread« sein"
+
+#: pg_basebackup.c:2476 pg_basebackup.c:2488 pg_basebackup.c:2510
+#: pg_basebackup.c:2522 pg_basebackup.c:2528 pg_basebackup.c:2580
+#: pg_basebackup.c:2591 pg_basebackup.c:2601 pg_basebackup.c:2607
+#: pg_basebackup.c:2614 pg_basebackup.c:2626 pg_basebackup.c:2638
+#: pg_basebackup.c:2646 pg_basebackup.c:2659 pg_basebackup.c:2665
+#: pg_basebackup.c:2674 pg_basebackup.c:2686 pg_basebackup.c:2697
+#: pg_basebackup.c:2705 pg_receivewal.c:814 pg_receivewal.c:826
+#: pg_receivewal.c:833 pg_receivewal.c:842 pg_receivewal.c:849
+#: pg_receivewal.c:859 pg_recvlogical.c:837 pg_recvlogical.c:849
+#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873
+#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894
+#: pg_recvlogical.c:901 pg_recvlogical.c:908
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_basebackup.c:2486 pg_receivewal.c:824 pg_recvlogical.c:847
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_basebackup.c:2509
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "Format und Backup-Ziel können nicht beide angegeben werden"
+
+#: pg_basebackup.c:2521
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "Ausgabeverzeichnis oder Backup-Ziel muss angegeben werden"
+
+#: pg_basebackup.c:2527
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "Ausgabeverzeichnis und Backup-Ziel können nicht beide angegeben werden"
+
+#: pg_basebackup.c:2557 pg_receivewal.c:868
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "unbekannter Komprimierungsalgorithmus: »%s«"
+
+#: pg_basebackup.c:2563 pg_receivewal.c:875
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "ungültige Komprimierungsangabe: %s"
+
+#: pg_basebackup.c:2579
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "clientseitige Komprimierung ist nicht möglich, wenn ein Backup-Ziel angegeben ist"
+
+#: pg_basebackup.c:2590
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "nur Sicherungen im Tar-Modus können komprimiert werden"
+
+#: pg_basebackup.c:2600
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "WAL-Streaming ist nicht möglich, wenn ein Backup-Ziel angegeben ist"
+
+#: pg_basebackup.c:2606
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "im Tar-Modus können Write-Ahead-Logs nicht auf Standardausgabe geschrieben werden"
+
+#: pg_basebackup.c:2613
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "Replikations-Slots können nur mit WAL-Streaming verwendet werden"
+
+#: pg_basebackup.c:2625
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot kann nicht zusammen mit einem Slot-Namen verwendet werden"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2636 pg_receivewal.c:840
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "für %s muss ein Slot mit --slot angegeben werden"
+
+#: pg_basebackup.c:2644 pg_basebackup.c:2684 pg_basebackup.c:2695
+#: pg_basebackup.c:2703
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s und %s sind inkompatible Optionen"
+
+#: pg_basebackup.c:2658
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "WAL-Verzeichnis kann nicht zusammen mit einem Backup-Ziel angegeben werden"
+
+#: pg_basebackup.c:2664
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "WAL-Verzeichnis kann nur im »plain«-Modus angegeben werden"
+
+#: pg_basebackup.c:2673
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL-Verzeichnis muss absoluten Pfad haben"
+
+#: pg_basebackup.c:2774
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m"
+
+#: pg_basebackup.c:2776
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "symbolische Verknüpfungen werden auf dieser Plattform nicht unterstützt"
+
+#: pg_receivewal.c:79
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s empfängt PostgreSQL-Write-Ahead-Logs.\n"
+"\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:84
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Optionen:\n"
+
+#: pg_receivewal.c:84
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=VERZ Write-Ahead-Log-Dateien in dieses Verzeichnis empfangen\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:85
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN nach Empfang der angegebenen LSN beenden\n"
+
+#: pg_receivewal.c:86 pg_recvlogical.c:89
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists keinen Fehler ausgeben, wenn Slot beim Erzeugen schon existiert\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:91
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop bei Verbindungsverlust nicht erneut probieren\n"
+
+#: pg_receivewal.c:88
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n"
+" geschrieben sind\n"
+
+#: pg_receivewal.c:89 pg_recvlogical.c:96
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SEK\n"
+" Zeit zwischen an Server gesendeten Statuspaketen (Standard: %d)\n"
+
+#: pg_receivewal.c:92
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous Write-Ahead-Log sofort nach dem Schreiben flushen\n"
+
+#: pg_receivewal.c:95
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METHODE[:DETAIL]\n"
+" wie angegeben komprimieren\n"
+
+#: pg_receivewal.c:105
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Optionale Aktionen:\n"
+
+#: pg_receivewal.c:106 pg_recvlogical.c:81
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot neuen Replikations-Slot erzeugen (Slot-Name siehe --slot)\n"
+
+#: pg_receivewal.c:107 pg_recvlogical.c:82
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot Replikations-Slot löschen (Slot-Name siehe --slot)\n"
+
+#: pg_receivewal.c:252
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "Segment bei %X/%X abgeschlossen (Zeitleiste %u)"
+
+#: pg_receivewal.c:259
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "Log-Streaming gestoppt bei %X/%X (Zeitleiste %u)"
+
+#: pg_receivewal.c:275
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "auf Zeitleiste %u umgeschaltet bei %X/%X"
+
+#: pg_receivewal.c:285
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "Interrupt-Signal erhalten, beende"
+
+#: pg_receivewal.c:317
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht schließen: %m"
+
+#: pg_receivewal.c:384
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "Segmentdatei »%s« hat falsche Größe %lld, wird übersprungen"
+
+#: pg_receivewal.c:401
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "konnte komprimierte Datei »%s« nicht öffnen: %m"
+
+#: pg_receivewal.c:404
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "konnte Positionszeiger in komprimierter Datei »%s« nicht setzen: %m"
+
+#: pg_receivewal.c:410
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "konnte komprimierte Datei »%s« nicht lesen: %m"
+
+#: pg_receivewal.c:413
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen"
+
+#: pg_receivewal.c:423
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "komprimierte Segmentdatei »%s« hat falsche unkomprimierte Größe %d, wird übersprungen"
+
+#: pg_receivewal.c:451
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "konnte LZ4-Dekomprimierungskontext nicht erzeugen: %s"
+
+#: pg_receivewal.c:463
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht lesen: %m"
+
+#: pg_receivewal.c:481
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "konnte Datei »%s« nicht dekomprimieren: %s"
+
+#: pg_receivewal.c:504
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "konnte LZ4-Dekomprimierungskontext nicht freigeben: %s"
+
+#: pg_receivewal.c:509
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "komprimierte Segmentdatei »%s« hat falsche unkomprimierte Größe %zu, wird übersprungen"
+
+#: pg_receivewal.c:514
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "kann Datei »%s« nicht prüfen: Komprimierung mit %s wird von dieser Installation nicht unterstützt"
+
+#: pg_receivewal.c:641
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "starte Log-Streaming bei %X/%X (Zeitleiste %u)"
+
+#: pg_receivewal.c:783 pg_recvlogical.c:785
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "konnte Endposition »%s« nicht parsen"
+
+#: pg_receivewal.c:832
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "--create-slot kann nicht zusammen mit --drop-slot verwendet werden"
+
+#: pg_receivewal.c:848
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "--synchronous kann nicht zusammen mit --no-sync verwendet werden"
+
+#: pg_receivewal.c:858
+#, c-format
+msgid "no target directory specified"
+msgstr "kein Zielverzeichnis angegeben"
+
+#: pg_receivewal.c:882
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "Komprimierung mit %s wird noch nicht unterstützt"
+
+#: pg_receivewal.c:924
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "Replikationsverbindung, die Slot »%s« verwendet, ist unerwarteterweise datenbankspezifisch"
+
+#: pg_receivewal.c:943 pg_recvlogical.c:955
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "lösche Replikations-Slot »%s«"
+
+#: pg_receivewal.c:954 pg_recvlogical.c:965
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "erzeuge Replikations-Slot »%s«"
+
+#: pg_receivewal.c:983 pg_recvlogical.c:989
+#, c-format
+msgid "disconnected"
+msgstr "Verbindung beendet"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:987 pg_recvlogical.c:993
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "Verbindung beendet; erneuter Versuch in %d Sekunden"
+
+#: pg_recvlogical.c:76
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s kontrolliert logische Dekodierungsströme von PostgreSQL.\n"
+"\n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Auszuführende Aktion:\n"
+
+#: pg_recvlogical.c:83
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start Streaming in einem Replikations-Slot starten (Slot-Name siehe --slot)\n"
+
+#: pg_recvlogical.c:86
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=DATEI Log in diese Datei empfangen, - für Standardausgabe\n"
+
+#: pg_recvlogical.c:87
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SEK\n"
+" Zeit zwischen Fsyncs der Ausgabedatei (Standard: %d)\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN wo in einem bestehenden Slot das Streaming starten soll\n"
+
+#: pg_recvlogical.c:92
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NAME[=WERT]\n"
+" Option NAME mit optionalem Wert WERT an den\n"
+" Ausgabe-Plugin übergeben\n"
+
+#: pg_recvlogical.c:95
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN Ausgabe-Plugin PLUGIN verwenden (Standard: %s)\n"
+
+#: pg_recvlogical.c:98
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAME Name des logischen Replikations-Slots\n"
+
+#: pg_recvlogical.c:99
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr ""
+" -t, --two-phase Dekodieren von vorbereiteten Transaktionen beim Erzeugen\n"
+" eines Slots einschalten\n"
+
+#: pg_recvlogical.c:104
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=DBNAME Datenbank, mit der verbunden werden soll\n"
+
+#: pg_recvlogical.c:137
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "bestätige Schreiben bis %X/%X, Flush bis %X/%X (Slot %s)"
+
+#: pg_recvlogical.c:161 receivelog.c:366
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "konnte Rückmeldungspaket nicht senden: %s"
+
+#: pg_recvlogical.c:229
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "starte Log-Streaming bei %X/%X (Slot %s)"
+
+#: pg_recvlogical.c:271
+#, c-format
+msgid "streaming initiated"
+msgstr "Streaming eingeleitet"
+
+#: pg_recvlogical.c:335
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "konnte Logdatei »%s« nicht öffnen: %m"
+
+#: pg_recvlogical.c:364 receivelog.c:889
+#, c-format
+msgid "invalid socket: %s"
+msgstr "ungültiges Socket: %s"
+
+#: pg_recvlogical.c:417 receivelog.c:917
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() fehlgeschlagen: %m"
+
+#: pg_recvlogical.c:424 receivelog.c:967
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "konnte keine Daten vom WAL-Stream empfangen: %s"
+
+#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011
+#: receivelog.c:1074
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "Streaming-Header zu klein: %d"
+
+#: pg_recvlogical.c:501 receivelog.c:849
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "unbekannter Streaming-Header: »%c«"
+
+#: pg_recvlogical.c:555 pg_recvlogical.c:567
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "konnte %d Bytes nicht in Logdatei »%s« schreiben: %m"
+
+#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "unerwarteter Abbruch des Replikations-Streams: %s"
+
+#: pg_recvlogical.c:780
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "konnte Startposition »%s« nicht parsen"
+
+#: pg_recvlogical.c:858
+#, c-format
+msgid "no slot specified"
+msgstr "kein Slot angegeben"
+
+#: pg_recvlogical.c:865
+#, c-format
+msgid "no target file specified"
+msgstr "keine Zieldatei angegeben"
+
+#: pg_recvlogical.c:872
+#, c-format
+msgid "no database specified"
+msgstr "keine Datenbank angegeben"
+
+#: pg_recvlogical.c:879
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "mindestens eine Aktion muss angegeben werden"
+
+#: pg_recvlogical.c:886
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "--create-slot oder --start kann nicht zusammen mit --drop-slot verwendet werden"
+
+#: pg_recvlogical.c:893
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "--create-slot oder --drop-slot kann nicht zusammen mit --startpos verwendet werden"
+
+#: pg_recvlogical.c:900
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos kann nur zusammen mit --start angegeben werden"
+
+#: pg_recvlogical.c:907
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase kann nur zusammen mit --create-slot angegeben werden"
+
+#: pg_recvlogical.c:939
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "konnte keine datenbankspezifische Replikationsverbindung herstellen"
+
+#: pg_recvlogical.c:1033
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "Endposition %X/%X durch Keepalive erreicht"
+
+#: pg_recvlogical.c:1036
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "Endposition %X/%X erreicht durch WAL-Eintrag bei %X/%X"
+
+#: receivelog.c:68
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "konnte Archivstatusdatei »%s« nicht erstellen: %s"
+
+#: receivelog.c:75
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "konnte Archivstatusdatei »%s« nicht schließen: %s"
+
+#: receivelog.c:123
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "konnte Größe der Write-Ahead-Log-Datei »%s« nicht ermittlen: %s"
+
+#: receivelog.c:134
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "konnte bestehende Write-Ahead-Log-Datei »%s« nicht öffnen: %s"
+
+#: receivelog.c:143
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "konnte bestehende Write-Ahead-Log-Datei »%s« nicht fsyncen: %s"
+
+#: receivelog.c:158
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "Write-Ahead-Log-Datei »%s« hat %zd Byte, sollte 0 oder %d sein"
+msgstr[1] "Write-Ahead-Log-Datei »%s« hat %zd Bytes, sollte 0 oder %d sein"
+
+#: receivelog.c:174
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "konnte Write-Ahead-Log-Datei »%s« nicht öffnen: %s"
+
+#: receivelog.c:208
+#, c-format
+msgid "could not determine seek position in file \"%s\": %s"
+msgstr "konnte Positionszeiger in Datei »%s« nicht ermitteln: %s"
+
+#: receivelog.c:223
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "»%s« wird nicht umbenannt, Segment ist noch nicht vollständig"
+
+#: receivelog.c:234 receivelog.c:323 receivelog.c:694
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "konnte Datei »%s« nicht schließen: %s"
+
+#: receivelog.c:295
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "Server berichtete unerwarteten History-Dateinamen für Zeitleiste %u: %s"
+
+#: receivelog.c:303
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "konnte Zeitleisten-History-Datei »%s« nicht erzeugen: %s"
+
+#: receivelog.c:310
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "konnte Zeitleisten-History-Datei »%s« nicht schreiben: %s"
+
+#: receivelog.c:400
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "inkompatible Serverversion %s; Client unterstützt Streaming nicht mit Serverversionen älter als %s"
+
+#: receivelog.c:409
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "inkompatible Serverversion %s; Client unterstützt Streaming nicht mit Serverversionen neuer als %s"
+
+#: receivelog.c:514
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "Systemidentifikator stimmt nicht zwischen Basissicherung und Streaming-Verbindung überein"
+
+#: receivelog.c:522
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "Startzeitleiste %u ist auf dem Server nicht vorhanden"
+
+#: receivelog.c:561
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "unerwartete Antwort auf Befehl TIMELINE_HISTORY: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet"
+
+#: receivelog.c:632
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "Server berichtete unerwartete nächste Zeitleiste %u, folgend auf Zeitleiste %u"
+
+#: receivelog.c:638
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "Server beendete Streaming von Zeitleiste %u bei %X/%X, aber gab an, dass nächste Zeitleiste %u bei %X/%X beginnt"
+
+#: receivelog.c:678
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "Replikationsstrom wurde vor Stopppunkt abgebrochen"
+
+#: receivelog.c:724
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "unerwartete Ergebnismenge nach Ende der Zeitleiste: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet"
+
+#: receivelog.c:733
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "konnte Startpunkt der nächsten Zeitleiste (»%s«) nicht interpretieren"
+
+#: receivelog.c:781 receivelog.c:1030 walmethods.c:1205
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "konnte Datei »%s« nicht fsyncen: %s"
+
+#: receivelog.c:1091
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "Write-Ahead-Log-Eintrag für Offset %u erhalten ohne offene Datei"
+
+#: receivelog.c:1101
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "WAL-Daten-Offset %08x erhalten, %08x erwartet"
+
+#: receivelog.c:1135
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "konnte %d Bytes nicht in WAL-Datei »%s« schreiben: %s"
+
+#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "konnte COPY-Ende-Paket nicht senden: %s"
+
+#: streamutil.c:159
+msgid "Password: "
+msgstr "Passwort: "
+
+#: streamutil.c:182
+#, c-format
+msgid "could not connect to server"
+msgstr "konnte nicht mit Server verbinden"
+
+#: streamutil.c:225
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "konnte search_path nicht auf leer setzen: %s"
+
+#: streamutil.c:241
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "konnte Servereinstellung für integer_datetimes nicht ermitteln"
+
+#: streamutil.c:248
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "Kompilieroption »integer_datetimes« stimmt nicht mit Server überein"
+
+#: streamutil.c:299
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "konnte WAL-Segmentgröße nicht ermitteln: %d Zeilen und %d Felder erhalten, %d Zeilen und %d oder mehr Felder erwartet"
+
+#: streamutil.c:309
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "WAL-Segmentgröße konnte nicht interpretiert werden"
+
+#: streamutil.c:327
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber der Server gab einen Wert von %d Byte an"
+msgstr[1] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber der Server gab einen Wert von %d Bytes an"
+
+#: streamutil.c:372
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "konnte Gruppenzugriffseinstellung nicht ermitteln: %d Zeilen und %d Felder erhalten, %d Zeilen und %d oder mehr Felder erwartet"
+
+#: streamutil.c:381
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "Gruppenzugriffseinstellung konnte nicht interpretiert werden: %s"
+
+#: streamutil.c:424 streamutil.c:461
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "Konnte System nicht identifizieren: %d Zeilen und %d Felder erhalten, %d Zeilen und %d oder mehr Felder erwartet"
+
+#: streamutil.c:513
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "konnte Replikations-Slot »%s« nicht lesen: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet"
+
+#: streamutil.c:525
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "Replikations-Slot »%s« existiert nicht"
+
+#: streamutil.c:536
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "physischer Replikations-Slot wurde erwartet, stattdessen wurde Typ »%s« erhalten"
+
+#: streamutil.c:550
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "konnte restart_lsn »%s« für Replikations-Slot »%s« nicht parsen"
+
+#: streamutil.c:667
+#, c-format
+msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "konnte Replikations-Slot »%s« nicht erzeugen: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet"
+
+#: streamutil.c:711
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "konnte Replikations-Slot »%s« nicht löschen: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet"
+
+#: walmethods.c:720 walmethods.c:1267
+msgid "could not compress data"
+msgstr "konnte Daten nicht komprimieren"
+
+#: walmethods.c:749
+msgid "could not reset compression stream"
+msgstr "konnte Komprimierungsstrom nicht zurücksetzen"
+
+#: walmethods.c:880
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "Implementierungsfehler: Tar-Dateien können nicht mehr als eine offene Datei haben"
+
+#: walmethods.c:894
+msgid "could not create tar header"
+msgstr "konnte Tar-Dateikopf nicht erzeugen"
+
+#: walmethods.c:910 walmethods.c:951 walmethods.c:1170 walmethods.c:1183
+msgid "could not change compression parameters"
+msgstr "konnte Komprimierungsparameter nicht ändern"
+
+#: walmethods.c:1055
+msgid "unlink not supported with compression"
+msgstr "Unlink wird bei Komprimierung nicht unterstützt"
+
+#: walmethods.c:1291
+msgid "could not close compression stream"
+msgstr "konnte Komprimierungsstrom nicht schließen"
diff --git a/src/bin/pg_basebackup/po/el.po b/src/bin/pg_basebackup/po/el.po
new file mode 100644
index 0000000..f4fd4d6
--- /dev/null
+++ b/src/bin/pg_basebackup/po/el.po
@@ -0,0 +1,1839 @@
+# Greek message translation file for pg_basebackup
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_basebackup (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 16:47+0000\n"
+"PO-Revision-Date: 2023-04-14 10:40+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "προειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέρεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../common/compression.c:130 ../../common/compression.c:139
+#: ../../common/compression.c:148
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "η παρούσα κατασκευή δεν υποστηρίζει συμπίεση με %s"
+
+#: ../../common/compression.c:203
+msgid "found empty string where a compression option was expected"
+msgstr "βρέθηκε κενή συμβολοσειρά όπου αναμενόταν μια επιλογή συμπίεσης"
+
+#: ../../common/compression.c:237
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "μη αναγνωρίσιμη παράμετρος συμπίεσης: «%s»"
+
+#: ../../common/compression.c:276
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "η επιλογή συμπίεσης «%s» απαιτεί τιμή"
+
+#: ../../common/compression.c:285
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "η τιμή της επιλογής συμπίεσης «%s» πρέπει να είναι ακέραια"
+
+#: ../../common/compression.c:335
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "ο αλγόριθμος συμπίεσης «%s» δεν δέχεται επίπεδο συμπίεσης"
+
+#: ../../common/compression.c:342
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "ο αλγόριθμος συμπίεσης «%s» αναμένει ένα επίπεδο συμπίεσης μεταξύ %d και %d (προεπιλογμένο %d)"
+
+#: ../../common/compression.c:353
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "ο αλγόριθμος συμπίεσης «%s» δεν δέχεται μέγεθος εργατών"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "έλλειψη μνήμης\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "δεν ήταν δυνατή η αντιγραφή δείκτη null (εσωτερικό σφάλμα)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#: pg_receivewal.c:380 pg_recvlogical.c:341
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο «%s»: %m"
+
+#: ../../common/file_utils.c:166 pg_receivewal.c:303
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m"
+
+#: ../../common/file_utils.c:200 pg_receivewal.c:532
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:447
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#: pg_recvlogical.c:196
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής fsync στο αρχείο «%s»: %m"
+
+#: ../../common/file_utils.c:383 pg_basebackup.c:2266 walmethods.c:459
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "δεν ήταν δυνατή η μετονομασία του αρχείου «%s» σε «%s»: %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "μη έγκυρη τιμή «%s» για την επιλογή %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s πρέπει να βρίσκεται εντός εύρους %d..%d"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1646
+#, c-format
+msgid "out of memory"
+msgstr "έλλειψη μνήμης"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1443 pg_basebackup.c:1737
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγραφή στο αρχείο «%s»: %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339
+#: pg_basebackup.c:1507 pg_basebackup.c:1716
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουργία αρχείου «%s»: %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:635
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου «%s»: %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "μη αναμενόμενη κατάσταση κατά την εξαγωγή αρχειοθήκης"
+
+#: bbstreamer_file.c:298 pg_basebackup.c:696 pg_basebackup.c:740
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουργία του καταλόγου «%s»: %m"
+
+#: bbstreamer_file.c:304
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση δικαιωμάτων του καταλόγου «%s»: %m"
+
+#: bbstreamer_file.c:323
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουργία συμβολικού συνδέσμου από «%s» σε «%s»: %m"
+
+#: bbstreamer_file.c:343
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "δεν ήταν δυνατός ο ορισμός δικαιωμάτων στο αρχείο «%s»: %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουργία συμπιεσμένου αρχείου «%s»: %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "δεν ήταν δυνατή η αναπαραγωγή τυπικής εξόδου: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου εξόδου %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "δεν ήταν δυνατή η ρύθμιση επιπέδου συμπίεσης %d: %s"
+
+#: bbstreamer_gzip.c:116 bbstreamer_gzip.c:249
+#, c-format
+msgid "this build does not support gzip compression"
+msgstr "η παρούσα κατασκευή δεν υποστηρίζει συμπίεση gzip"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η εγγραφή σε συμπιεσμένο αρχείο «%s»: %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του συμπιεσμένου αρχείου «%s»: %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:869
+#, c-format
+msgid "could not initialize compression library"
+msgstr "δεν ήταν δυνατή η αρχικοποίηση της βιβλιοθήκης συμπίεσης"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:316
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "δεν ήταν δυνατή η αποσυμπίεση δεδομένων: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "απροσδόκητη κατάσταση κατά την έγχυση ρυθμίσεων αποκατάστασης"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "δεν ήταν δυνατή η δημιουργία lz4 περιεχομένου συμπίεσης: %s"
+
+#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298
+#, c-format
+msgid "this build does not support lz4 compression"
+msgstr "η παρούσα κατασκευή δεν υποστηρίζει συμπίεση lz4"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "δεν ήταν δυνατή η εγγραφή κεφαλίδας lz4: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:168 bbstreamer_zstd.c:210
+#, c-format
+msgid "could not compress data: %s"
+msgstr "δεν ήταν δυνατή η συμπίεση δεδομένων: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "δεν ήταν δυνατός ο τερματισμός συμπίεσης lz4: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "δεν ήταν δυνατή η αρχικοποίηση της βιβλιοθήκης συμπίεσης: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "το αρχείο tar υπερβαίνει τα 2 μπλοκ"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "μη αναμενόμενη κατάσταση κατά την ανάλυση αρχειοθήκης tar"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "το μέλος tar έχει κενό όνομα"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "η ροή COPY τερματίστηκε πριν ολοκληρωθεί το τελευταίο αρχείο"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "δεν ήταν δυνατή η δημιουργία zstd περιεχομένου συμπίεσης"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "δεν ήταν δυνατή η ρύθμιση επιπέδου συμπίεσης zstd σε %d: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "δεν ήταν δυνατή η ρύθμιση αριθμού εργατών συμπίεσης %d: %s"
+
+#: bbstreamer_zstd.c:116 bbstreamer_zstd.c:271
+#, c-format
+msgid "this build does not support zstd compression"
+msgstr "η παρούσα κατασκευή δεν υποστηρίζει συμπίεση zstd"
+
+#: bbstreamer_zstd.c:262
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "δεν ήταν δυνατή η δημιουργία zstd περιεχομένου αποσυμπίεσης"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "αφαιρείται ο κατάλογος δεδομένων «%s»"
+
+#: pg_basebackup.c:242
+#, c-format
+msgid "failed to remove data directory"
+msgstr "απέτυχε η αφαίρεση καταλόγου δεδομένων"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "αφαιρούνται περιεχόμενα του καταλόγου δεδομένων «%s»"
+
+#: pg_basebackup.c:248
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "απέτυχε η αφαίρεση περιεχομένων του καταλόγου δεδομένων"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "αφαίρεση καταλόγου WAL «%s»"
+
+#: pg_basebackup.c:255
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "απέτυχε η αφαίρεση καταλόγου WAL"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "αφαιρούνται τα περιεχόμενα του καταλόγου WAL «%s»"
+
+#: pg_basebackup.c:261
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "απέτυχε η αφαίρεση περιεχόμενων του καταλόγου WAL"
+
+#: pg_basebackup.c:267
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "ο κατάλογος δεδομένων «%s» δεν αφαιρείται κατα απαίτηση του χρήστη"
+
+#: pg_basebackup.c:270
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "κατάλογος WAL «%s» δεν αφαιρέθηκε κατά απαίτηση του χρήστη"
+
+#: pg_basebackup.c:274
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "οι αλλαγές στους καταλόγους πινακοχώρων δεν θα αναιρεθούν"
+
+#: pg_basebackup.c:326
+#, c-format
+msgid "directory name too long"
+msgstr "πολύ μακρύ όνομα καταλόγου"
+
+#: pg_basebackup.c:333
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "πολλαπλά σύμβολα \"=\" στην αντιστοίχιση πινακοχώρου"
+
+#: pg_basebackup.c:342
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "μη έγκυρη μορφή αντιστοίχισης πινακοχώρου «%s», πρέπει να είναι «OLDDIR=NEWDIR»"
+
+#: pg_basebackup.c:361
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "ο παλιός κατάλογος δεν είναι απόλυτη διαδρομή στην αντιστοίχιση πινακοχώρου: %s"
+
+#: pg_basebackup.c:365
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "ο νέος κατάλογος δεν είναι μια απόλυτη διαδρομή στην αντιστοίχιση πινακοχώρου: %s"
+
+#: pg_basebackup.c:387
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s λαμβάνει ένα αντίγραφο ασφαλείας βάσης ενός διακομιστή PostgreSQL που εκτελείται.\n"
+"\n"
+
+#: pg_basebackup.c:389 pg_receivewal.c:81 pg_recvlogical.c:78
+#, c-format
+msgid "Usage:\n"
+msgstr "Χρήση:\n"
+
+#: pg_basebackup.c:390 pg_receivewal.c:82 pg_recvlogical.c:79
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]...\n"
+
+#: pg_basebackup.c:391
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Επιλογές που ελέγχουν το περιεχόμενο εξόδου:\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=DIRECTORY λάβε το αντίγραφο ασφαλείας βάσης στον κατάλογο\n"
+
+#: pg_basebackup.c:393
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t μορφή εξόδου (απλή (προεπιλογή), tar)\n"
+
+#: pg_basebackup.c:394
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE μέγιστος ρυθμός μεταφοράς για τη μεταφορά καταλόγου δεδομένων\n"
+" (σε kB/s, ή χρησιμοποιήστε το επίθημα «k» ή «M»)\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" εγγραφή των ρυθμίσεων αναπαραγωγής\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=TARGET[:DETAIL]\n"
+" προορισμός αντιγράφων ασφαλείας (εάν είναι άλλος από τον πελάτη)\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" μετακίνησε τον πινακοχώρο από OLDDIR σε NEWDIR\n"
+
+#: pg_basebackup.c:402
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALDIR τοποθεσία για τον κατάλογο write-ahead log\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" περιέλαβε τα απαιτούμενα αρχεία WAL με την ορισμένη μέθοδο\n"
+
+#: pg_basebackup.c:405
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip συμπίεσε την έξοδο tar\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" συμπίεσε στον πελάτη ή στον διακομιστή όπως ορίζεται\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr ""
+" -Z, --compress=none να μην συμπιέσει την έξοδο tar\n"
+"\n"
+
+#: pg_basebackup.c:409
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Γενικές επιλογές:\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" όρισε fast ή spread λειτουργία λήψης σημείων ελέγχου\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot δημιούργησε υποδοχή αναπαραγωγής\n"
+
+#: pg_basebackup.c:413
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL όρισε ετικέτα αντιγράφου ασφαλείας\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean να μην καθαριστούν σφάλματα\n"
+
+#: pg_basebackup.c:415
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync να μην αναμένει την ασφαλή εγγραφή αλλαγών στον δίσκο\n"
+
+#: pg_basebackup.c:416
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress εμφάνισε πληροφορίες προόδου\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:91
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=SLOTNAME υποδοχή αναπαραγωγής για χρήση\n"
+
+#: pg_basebackup.c:418 pg_receivewal.c:93 pg_recvlogical.c:100
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose περιφραστικά μηνύματα εξόδου\n"
+
+#: pg_basebackup.c:419 pg_receivewal.c:94 pg_recvlogical.c:101
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_basebackup.c:420
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" χρησιμοποίησε αυτόν τον αλγόριθμο για τα αθροίσματα ελέγχου διακήρυξης\n"
+
+#: pg_basebackup.c:422
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" χρήση δεκαεξαδικής κωδικοποίησης για όλα\n"
+" τα ονόματα αρχείων στη διακήρυξη\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size να μην εκτιμήσει το μέγεθος του αντιγράφου ασφαλείας στην πλευρά του διακομιστή\n"
+
+#: pg_basebackup.c:425
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest κατάστειλε τη δημιουργία της διακήρυξης αντιγράφων ασφαλείας\n"
+
+#: pg_basebackup.c:426
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot εμπόδισε την δημιουργία προσωρινής υποδοχής αναπαραγωγής\n"
+
+#: pg_basebackup.c:427
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" να μην επιβεβαιώσει τα αθροίσματα ελέγχου\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:97 pg_recvlogical.c:102
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, μετά έξοδος\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Επιλογές σύνδεσης:\n"
+
+#: pg_basebackup.c:431 pg_receivewal.c:99
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR συμβολοσειρά σύνδεσης\n"
+
+#: pg_basebackup.c:432 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n"
+
+#: pg_basebackup.c:433 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT θύρα διακομιστή βάσης δεδομένων\n"
+
+#: pg_basebackup.c:434
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVAL\n"
+" χρόνος μεταξύ αποστολής πακέτων κατάστασης στον διακομιστή (σε δευτερόλεπτα)\n"
+
+#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME σύνδεση ως ο ορισμένος χρήστης βάσης δεδομένων\n"
+
+#: pg_basebackup.c:437 pg_receivewal.c:103 pg_recvlogical.c:108
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός πρόσβασης\n"
+
+#: pg_basebackup.c:438 pg_receivewal.c:104 pg_recvlogical.c:109
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password αναγκαστική προτροπή κωδικού πρόσβασης (πρέπει να συμβεί αυτόματα)\n"
+
+#: pg_basebackup.c:439 pg_receivewal.c:108 pg_recvlogical.c:110
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφορές σφάλματων σε <%s>.\n"
+
+#: pg_basebackup.c:440 pg_receivewal.c:109 pg_recvlogical.c:111
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αρχική σελίδα: <%s>\n"
+
+#: pg_basebackup.c:482
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση από έτοιμη pipe: %m"
+
+#: pg_basebackup.c:485 pg_basebackup.c:632 pg_basebackup.c:2180
+#: streamutil.c:444
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση της τοποθεσίας write-ahead log «%s»"
+
+#: pg_basebackup.c:591 pg_receivewal.c:663
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "δεν ήταν δυνατός ο τερματισμός εγγραφής αρχείων WAL: %m"
+
+#: pg_basebackup.c:641
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "δεν ήταν δυνατή η δημιουργία pipe για διεργασίες παρασκηνίου : %m"
+
+#: pg_basebackup.c:674
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "δημιουργήθηκε προσωρινή υποδοχή αναπαραγωγής «%s»"
+
+#: pg_basebackup.c:677
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "δημιουργήθηκε υποδοχή αναπαραγωγής «%s»"
+
+#: pg_basebackup.c:711
+#, c-format
+msgid "could not create background process: %m"
+msgstr "δεν ήταν δυνατή η δημιουργία διαδικασίας παρασκηνίου: %m"
+
+#: pg_basebackup.c:720
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "δεν ήταν δυνατή η δημιουργία νήματος παρασκηνίου: %m"
+
+#: pg_basebackup.c:759
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "ο κατάλογος «%s» υπάρχει και δεν είναι άδειος"
+
+#: pg_basebackup.c:765
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η πρόσβαση του καταλόγου «%s»: %m"
+
+#: pg_basebackup.c:842
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d πινακοχώρος %*s"
+msgstr[1] "%*s/%s kB (100%%), %d/%d πινακοχώροι %*s"
+
+#: pg_basebackup.c:854
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d πινακοχώρος (%s%-*.*s)"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d πινακοχώροι (%s%-*.*s)"
+
+#: pg_basebackup.c:870
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d πινακοχώρος"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d πινακοχώροι"
+
+#: pg_basebackup.c:894
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "η τιμή ρυθμού μεταφοράς «%s» δεν είναι έγκυρη"
+
+#: pg_basebackup.c:896
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "μη έγκυρος ρυθμός μεταφοράς «%s»: %m"
+
+#: pg_basebackup.c:903
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "ο ρυθμός μεταφοράς πρέπει να είναι μεγαλύτερος από μηδέν"
+
+#: pg_basebackup.c:933
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "μη έγκυρη μονάδα --max-rate: «%s»"
+
+#: pg_basebackup.c:937
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "ο ρυθμός μεταφοράς «%s» υπερβαίνει το εύρος ακεραίων"
+
+#: pg_basebackup.c:944
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "ο ρυθμός μεταφοράς «%s» βρίσκεται εκτός εύρους τιμών"
+
+#: pg_basebackup.c:1040
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "δεν ήταν δυνατή η λήψη ροής δεδομένων COPY: %s"
+
+#: pg_basebackup.c:1057 pg_recvlogical.c:438 pg_recvlogical.c:610
+#: receivelog.c:981
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "δεν ήταν δυνατή η ανάγνωση δεδομένων COPY: %s"
+
+#: pg_basebackup.c:1061
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "διεργασία παρασκηνίου τερματίστηκε απρόσμενα"
+
+#: pg_basebackup.c:1132
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "δεν είναι δυνατή η έγχυση διακύρηξης σε συμπιεσμένο αρχείο tarfile"
+
+#: pg_basebackup.c:1133
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "Χρησιμοποιήστε συμπίεση από την πλευρά του πελάτη, στείλτε την έξοδο σε έναν κατάλογο αντί για την τυπική έξοδο, ή χρησιμοποιήστε %s."
+
+#: pg_basebackup.c:1149
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση αρχειοθήκης «%s»"
+
+#: pg_basebackup.c:1150
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "Μόνο οι αρχειοθήκες tar μπορούν να συμπιεστούν."
+
+#: pg_basebackup.c:1152
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "Η απλή μορφή απαιτεί pg_basebackup για την ανάλυση του αρχείου."
+
+#: pg_basebackup.c:1154
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "Η χρήση του - ως καταλόγου εξόδου απαιτεί την ανάλυση του αρχείου από το pg_basebackup."
+
+#: pg_basebackup.c:1156
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "Η επιλογή -R απαιτεί pg_basebackup για την ανάλυση του αρχείου."
+
+#: pg_basebackup.c:1367
+#, c-format
+msgid "archives must precede manifest"
+msgstr "τα αρχεία πρέπει να προηγούνται του μανιφέστου"
+
+#: pg_basebackup.c:1382
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "άκυρη ονομασία αρχειοθήκης «%s»"
+
+#: pg_basebackup.c:1454
+#, c-format
+msgid "unexpected payload data"
+msgstr "μη αναμενόμενα δεδομένα φορτίου"
+
+#: pg_basebackup.c:1597
+#, c-format
+msgid "empty COPY message"
+msgstr "κενό μήνυμα COPY"
+
+#: pg_basebackup.c:1599
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "κακοσχηματισμένο μήνυμα COPY τύπου %d, μήκους %zu"
+
+#: pg_basebackup.c:1797
+#, c-format
+msgid "incompatible server version %s"
+msgstr "μη συμβατή έκδοση διακομιστή %s"
+
+#: pg_basebackup.c:1813
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "Χρησιμοποίησε -X none ή -X fetch για την απενεργοποίηση της ροής καταγραφής."
+
+#: pg_basebackup.c:1881
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "οι στόχοι αντιγράφων ασφαλείας δεν υποστηρίζονται από αυτήν την έκδοση διακομιστή"
+
+#: pg_basebackup.c:1884
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "δεν είναι δυνατή η σύνταξη αρχείου ρυθμίσεων αποκατάστασης όταν χρησιμοποιείται προορισμός αντιγράφων ασφαλείας"
+
+#: pg_basebackup.c:1911
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "ο διακομιστής δεν υποστηρίζει συμπίεση από την πλευρά του διακομιστή"
+
+#: pg_basebackup.c:1921
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "έναρξη δημιουργίας αντιγράφων ασφαλείας βάσης, αναμονή ολοκλήρωσης του σημείου ελέγχου"
+
+#: pg_basebackup.c:1925
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "αναμονή για το σημείο ελέγχου"
+
+#: pg_basebackup.c:1938 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588
+#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504
+#: streamutil.c:656 streamutil.c:701
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "δεν ήταν δυνατή η αποστολή εντολής αναπαραγωγής «%s»: %s"
+
+#: pg_basebackup.c:1946
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "δεν ήταν δυνατή η έναρξη αντιγράφου ασφαλείας βάσης: %s"
+
+#: pg_basebackup.c:1949
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "ο διακομιστής επέστρεψε μη αναμενόμενη απόκριση στην εντολή BASE_BACKUP· έλαβε %d σειρές και %d πεδία, ανέμενε %d σειρές και %d πεδία"
+
+#: pg_basebackup.c:1955
+#, c-format
+msgid "checkpoint completed"
+msgstr "ολοκληρώθηκε το σημείο ελέγχου"
+
+#: pg_basebackup.c:1970
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "σημείο εκκίνησης write-ahead: %s στην χρονογραμμή %u"
+
+#: pg_basebackup.c:1978
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "δεν ήταν δυνατή η απόκτηση κεφαλίδας αντιγράφου ασφαλείας: %s"
+
+#: pg_basebackup.c:1981
+#, c-format
+msgid "no data returned from server"
+msgstr "δεν επιστράφηκαν δεδομένα από τον διακομιστή"
+
+#: pg_basebackup.c:2016
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "μπορεί να γράψει μόνο έναν πινακοχώρο στην τυπική έξοδο, η βάση δεδομένων διαθέτει %d"
+
+#: pg_basebackup.c:2029
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "εκκίνηση λήψης WAL στο παρασκήνιο"
+
+#: pg_basebackup.c:2111
+#, c-format
+msgid "backup failed: %s"
+msgstr "η δημιουργία αντιγράφων ασφαλείας απέτυχε: %s"
+
+#: pg_basebackup.c:2114
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "δεν επιστράφηκε τελική θέση write-ahead log από τον διακομιστή"
+
+#: pg_basebackup.c:2117
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "τελικό σημείο write-ahead log: %s"
+
+#: pg_basebackup.c:2128
+#, c-format
+msgid "checksum error occurred"
+msgstr "προέκυψε σφάλμα αθροίσματος ελέγχου"
+
+#: pg_basebackup.c:2133
+#, c-format
+msgid "final receive failed: %s"
+msgstr "απέτυχε η τελική λήψη: %s"
+
+#: pg_basebackup.c:2157
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "αναμένει τη διαδικασία παρασκηνίου να ολοκληρώσει τη ροή ..."
+
+#: pg_basebackup.c:2161
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "δεν ήταν δυνατή η αποστολή της εντολής σε pipe παρασκηνίου: %m"
+
+#: pg_basebackup.c:2166
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "δεν ήταν δυνατή η αναμονή απογονικής διεργασίας: %m"
+
+#: pg_basebackup.c:2168
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "απόγονος %d πέθανε, ανέμενε %d"
+
+#: pg_basebackup.c:2170 streamutil.c:91 streamutil.c:197
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2190
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "δεν ήταν δυνατή η αναμονή απογονικού νήματος: %m"
+
+#: pg_basebackup.c:2195
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "δεν ήταν δυνατή η απόκτηση κατάστασης εξόδου απογονικού νήματος: %m"
+
+#: pg_basebackup.c:2198
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "το απογονικό νήμα εξήλθε με σφάλμα %u"
+
+#: pg_basebackup.c:2227
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "συγχρονίζονται δεδομένα στο δίσκο …"
+
+#: pg_basebackup.c:2252
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "μετονομάζει backup_manifest.tmp σε backup_manifest"
+
+#: pg_basebackup.c:2272
+#, c-format
+msgid "base backup completed"
+msgstr "ολοκληρώθηκε το αντίγραφο ασφαλείας βάσης"
+
+#: pg_basebackup.c:2361
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "μη έγκυρη μορφή εξόδου «%s», πρέπει να είναι «plain» ή «tar»"
+
+#: pg_basebackup.c:2405
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "μη έγκυρη επιλογή μεθόδου wal «%s», πρέπει να είναι «fetch», «stream», ή «none»"
+
+#: pg_basebackup.c:2435
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "μη έγκυρη παράμετρος σημείου ελέγχου «%s», πρέπει να είναι «fast» ή «spread»"
+
+#: pg_basebackup.c:2486 pg_basebackup.c:2498 pg_basebackup.c:2520
+#: pg_basebackup.c:2532 pg_basebackup.c:2538 pg_basebackup.c:2590
+#: pg_basebackup.c:2601 pg_basebackup.c:2611 pg_basebackup.c:2617
+#: pg_basebackup.c:2624 pg_basebackup.c:2636 pg_basebackup.c:2648
+#: pg_basebackup.c:2656 pg_basebackup.c:2669 pg_basebackup.c:2675
+#: pg_basebackup.c:2684 pg_basebackup.c:2696 pg_basebackup.c:2707
+#: pg_basebackup.c:2715 pg_receivewal.c:814 pg_receivewal.c:826
+#: pg_receivewal.c:833 pg_receivewal.c:842 pg_receivewal.c:849
+#: pg_receivewal.c:859 pg_recvlogical.c:837 pg_recvlogical.c:849
+#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873
+#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894
+#: pg_recvlogical.c:901 pg_recvlogical.c:908
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες."
+
+#: pg_basebackup.c:2496 pg_receivewal.c:824 pg_recvlogical.c:847
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)"
+
+#: pg_basebackup.c:2519
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "δεν είναι δυνατός ο καθορισμός τόσο ενός ονόματος βάσης δεδομένων όσο και στόχου αντιγράφων ασφαλείας"
+
+#: pg_basebackup.c:2531
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "πρέπει να καθορίσετε τον κατάλογο εξόδου ή το στόχο δημιουργίας αντιγράφων ασφαλείας"
+
+#: pg_basebackup.c:2537
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "δεν είναι δυνατός ο καθορισμός τόσο του καταλόγου εξόδου όσο και του προορισμού αντιγράφων ασφαλείας"
+
+#: pg_basebackup.c:2567 pg_receivewal.c:868
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "μη αναγνωρίσιμος αλγόριθμος συμπίεσης: «%s»"
+
+#: pg_basebackup.c:2573 pg_receivewal.c:875
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "μη έγκυρη προδιαγραφή συμπίεσης: %s"
+
+#: pg_basebackup.c:2589
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "η συμπίεση από την πλευρά του πελάτη δεν είναι δυνατή όταν έχει καθοριστεί ένας στόχος δημιουργίας αντιγράφων ασφαλείας"
+
+#: pg_basebackup.c:2600
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "μόνο τα αντίγραφα ασφαλείας tar μπορούν να συμπιεστούν"
+
+#: pg_basebackup.c:2610
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "δεν είναι δυνατή η ροή WAL όταν καθορίζεται στόχος αντιγράφου ασφαλείας"
+
+#: pg_basebackup.c:2616
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "δεν είναι δυνατή η ροή write-ahead logs σε λειτουργία tar στην τυπική έξοδο"
+
+#: pg_basebackup.c:2623
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "οι υποδοχές αναπαραγωγής μπορούν να χρησιμοποιηθούν μόνο με ροή WAL"
+
+#: pg_basebackup.c:2635
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot δεν μπορεί να χρησιμοποιηθεί σε συνδυασμό με όνομα υποδοχής"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2646 pg_receivewal.c:840
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s χρειάζεται να έχει οριστεί μία υποδοχή με --slot"
+
+#: pg_basebackup.c:2654 pg_basebackup.c:2694 pg_basebackup.c:2705
+#: pg_basebackup.c:2713
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s και %s αποτελούν μη συμβατές επιλογές"
+
+#: pg_basebackup.c:2668
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "η τοποθεσία του καταλόγου WAL δεν μπορεί να καθοριστεί μαζί με στόχο αντιγράφου ασφαλείας"
+
+#: pg_basebackup.c:2674
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "η τοποθεσία του καταλόγου WAL μπορεί να καθοριστεί μόνο σε λειτουργία plain"
+
+#: pg_basebackup.c:2683
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "η τοποθεσία του καταλόγου WAL πρέπει να είναι μία πλήρης διαδρομή"
+
+#: pg_basebackup.c:2784
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουργία του συμβολικού συνδέσμου «%s»: %m"
+
+#: pg_basebackup.c:2786
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "συμβολικοί σύνδεσμοι δεν υποστηρίζονται στην παρούσα πλατφόρμα"
+
+#: pg_receivewal.c:79
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s λαμβάνει ροές PostgreSQL write-ahead logs.\n"
+"\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:84
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Επιλογές:\n"
+
+#: pg_receivewal.c:84
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=DIR να λάβει αρχεία write-ahead log files into this directory\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:85
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN έξοδος μετά τη λήψη του καθορισμένου LSN\n"
+
+#: pg_receivewal.c:86 pg_recvlogical.c:89
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists μην θεωρηθεί ώς σφάλμα η ήδη ύπαρξη υποδοχής κατά τη δημιουργία μιας υποδοχής\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:91
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop να μην εισέλθει σε βρόχο κατά την απώλεια σύνδεσης\n"
+
+#: pg_receivewal.c:88
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync να μην αναμένει την ασφαλή εγγραφή αλλαγών στον δίσκο\n"
+
+#: pg_receivewal.c:89 pg_recvlogical.c:96
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SECS\n"
+" χρόνος μεταξύ πακέτων κατάστασης που αποστέλλονται στο διακομιστή (προεπιλογή: %d)\n"
+
+#: pg_receivewal.c:92
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous flush write-ahead log αμέσως μετά τη γραφή\n"
+
+#: pg_receivewal.c:95
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" συμπίεσε όπως ορίζεται\n"
+
+#: pg_receivewal.c:105
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Προαιρετικές δράσεις:\n"
+
+#: pg_receivewal.c:106 pg_recvlogical.c:81
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot δημιούργησε μια νέα υποδοχή αναπαραγωγής (για το όνομα της υποδοχής, δείτε --slot)\n"
+
+#: pg_receivewal.c:107 pg_recvlogical.c:82
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot εγκατάληψη της υποδοχής αναπαραγωγής (για το όνομα της υποδοχής δείτε --slot)\n"
+
+#: pg_receivewal.c:252
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "τελείωσε το τμήμα σε %X/%X (χρονογραμμή %u)"
+
+#: pg_receivewal.c:259
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "διακοπή ροής αρχείων καταγραφής σε %X/%X (χρονογραμμή %u)"
+
+#: pg_receivewal.c:275
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "μεταπήδησε στη χρονογραμμή %u στο %X/%X"
+
+#: pg_receivewal.c:285
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "λήψη σήματος διακοπής, έξοδος"
+
+#: pg_receivewal.c:317
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m"
+
+#: pg_receivewal.c:384
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "το αρχείο τμήματος «%s» έχει εσφαλμένο μέγεθος %lld, θα παραληφθεί"
+
+#: pg_receivewal.c:401
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του συμπιεσμένου αρχείου «%s»: %m"
+
+#: pg_receivewal.c:404
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αναζήτηση στο συμπιεσμένο αρχείο «%s»: %m"
+
+#: pg_receivewal.c:410
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του συμπιεσμένου αρχείου «%s»: %m"
+
+#: pg_receivewal.c:413
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "δεν ήταν δυνατή η ανάγνωση του συμπιεσμένου αρχείου «%s»: ανέγνωσε %d από %zu"
+
+#: pg_receivewal.c:423
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "συμπιεσμένο αρχείο τμήματος «%s» έχει εσφαλμένο μη συμπιεσμένο μέγεθος %d, θα παραληφθεί"
+
+#: pg_receivewal.c:451
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "δεν ήταν δυνατή η δημιουργία LZ4 περιεχομένου αποσυμπίεσης: %s"
+
+#: pg_receivewal.c:463
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: %m"
+
+#: pg_receivewal.c:481
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η αποσυμπιέση αρχείου «%s»: %s"
+
+#: pg_receivewal.c:504
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "δεν ήταν δυνατή η απελευθέρωση LZ4 περιεχομένου αποσυμπίεσης: %s"
+
+#: pg_receivewal.c:509
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "συμπιεσμένο αρχείο τμήματος «%s» έχει εσφαλμένο μη συμπιεσμένο μέγεθος %zu, θα παραληφθεί"
+
+#: pg_receivewal.c:514
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "δεν είναι δυνατός ο έλεγχος του αρχείου «%s»: η συμπίεση με %s δεν υποστηρίζεται από αυτήν την κατασκευή"
+
+#: pg_receivewal.c:641
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "έναρξη ροής αρχείων καταγραφής σε %X/%X (χρονογραμμή %u)"
+
+#: pg_receivewal.c:783 pg_recvlogical.c:785
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση της τελικής τοποθεσίας «%s»"
+
+#: pg_receivewal.c:832
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "δεν είναι δυνατή η χρήση --create-slot σε συνδυασμό με --drop-slot"
+
+#: pg_receivewal.c:848
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "δεν είναι δυνατή η χρήση --synchronous σε συνδυασμό με --no-sync"
+
+#: pg_receivewal.c:858
+#, c-format
+msgid "no target directory specified"
+msgstr "δεν καθορίστηκε κατάλογος δεδομένων προορισμού"
+
+#: pg_receivewal.c:882
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "η συμπίεση με %s δεν υποστηρίζεται ακόμα"
+
+#: pg_receivewal.c:924
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "η σύνδεση αναπαραγωγής χρησιμοποιώντας την υποδοχή «%s» είναι απροσδόκητα συνυφασμένη με βάση δεδομένων"
+
+#: pg_receivewal.c:943 pg_recvlogical.c:955
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "κατάργηση υποδοχής αναπαραγωγής «%s»"
+
+#: pg_receivewal.c:954 pg_recvlogical.c:965
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "δημιουργία υποδοχής αναπαραγωγής «%s»"
+
+#: pg_receivewal.c:983 pg_recvlogical.c:989
+#, c-format
+msgid "disconnected"
+msgstr "αποσυνδέθηκε"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:987 pg_recvlogical.c:993
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "αποσυνδέθηκε· αναμένει %d δεύτερα για να προσπαθήσει ξανά"
+
+#: pg_recvlogical.c:76
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s ελέγχει ροές λογικής αποκωδικοποίησης PostgreSQL.\n"
+"\n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Δράση που θα πραγματοποιηθεί:\n"
+
+#: pg_recvlogical.c:83
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start εκκίνηση ροής σε μια υποδοχή αναπαραγωγής (για το όνομα της υποδοχής δείτε --slot)\n"
+
+#: pg_recvlogical.c:86
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=FILE λάβε το log σε αυτό το αρείο, - για τυπική έξοδο\n"
+
+#: pg_recvlogical.c:87
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SECS\n"
+" χρόνος μεταξύ fsyncs του αρχείου εξόδου (προεπιλογή: %d)\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN από πού θα ξεκινήσει η ροή σε μια υπάρχουσα υποδοχή\n"
+
+#: pg_recvlogical.c:92
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NAME[=VALUE]\n"
+" πέρασε την επιλογή NAME με προαιρετική τιμή VALUE στο\n"
+" plugin εξόδου\n"
+
+#: pg_recvlogical.c:95
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN χρησιμοποίησε το plugin εξόδου PLUGIN (προεπιλογή: %s)\n"
+
+#: pg_recvlogical.c:98
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAME όνομα της λογικής υποδοχής αναπαραγωγής\n"
+
+#: pg_recvlogical.c:99
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr " -t, --two-phase ενεργοποιήσε την αποκωδικοποίηση των προετοιμασμένων συναλλαγών κατά τη δημιουργία μιας υποδοχής\n"
+
+#: pg_recvlogical.c:104
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=DBNAME βάση δεδομένων για να συνδεθεί\n"
+
+#: pg_recvlogical.c:137
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "επιβεβαίωση εγγραφής έως %X/%X, flush σε %X/%X (υποδοχή %s)"
+
+#: pg_recvlogical.c:161 receivelog.c:366
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "δεν ήταν δυνατή η αποστολή πακέτου σχολίων: %s"
+
+#: pg_recvlogical.c:229
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "έναρξη ροής αρχείων καταγραφής σε %X/%X (υποδοχή %s)"
+
+#: pg_recvlogical.c:271
+#, c-format
+msgid "streaming initiated"
+msgstr "έναρξη ροής"
+
+#: pg_recvlogical.c:335
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου καταγραφής «%s»: %m"
+
+#: pg_recvlogical.c:364 receivelog.c:889
+#, c-format
+msgid "invalid socket: %s"
+msgstr "άκυρος υποδοχέας: %s"
+
+#: pg_recvlogical.c:417 receivelog.c:917
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() απέτυχε: %m"
+
+#: pg_recvlogical.c:424 receivelog.c:967
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "δεν ήταν δυνατή η λήψη δεδομένων από τη ροή WAL: %s"
+
+#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011
+#: receivelog.c:1074
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "πολύ μικρή κεφαλίδα ροής: %d"
+
+#: pg_recvlogical.c:501 receivelog.c:849
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "μη αναγνωρίσιμη κεφαλίδα ροής: «%c»"
+
+#: pg_recvlogical.c:555 pg_recvlogical.c:567
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγραφή %d bytes στο αρχείο καταγραφής «%s»: %m"
+
+#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "μη αναμενόμενος τερματισμός της ροής αναπαραγωγής: %s"
+
+#: pg_recvlogical.c:780
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση της θέσης έναρξης «%s»"
+
+#: pg_recvlogical.c:858
+#, c-format
+msgid "no slot specified"
+msgstr "δεν καθορίστηκε υποδοχή"
+
+#: pg_recvlogical.c:865
+#, c-format
+msgid "no target file specified"
+msgstr "δεν καθορίστηκε αρχείο προορισμού"
+
+#: pg_recvlogical.c:872
+#, c-format
+msgid "no database specified"
+msgstr "δεν καθορίστηκε βάση δεδομένων"
+
+#: pg_recvlogical.c:879
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "πρέπει να οριστεί τουλάχιστον μία πράξη"
+
+#: pg_recvlogical.c:886
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "δεν είναι δυνατή η χρήση --create-slot ή --start σε συνδυασμό με --drop-slot"
+
+#: pg_recvlogical.c:893
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "δεν είναι δυνατή η χρήση --create-slot ή --start σε συνδυασμό με --startpos"
+
+#: pg_recvlogical.c:900
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos μπορεί να καθοριστεί μόνο με --start"
+
+#: pg_recvlogical.c:907
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase μπορεί να καθοριστεί μόνο με --create-slot"
+
+#: pg_recvlogical.c:939
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "δεν ήταν δυνατή η δημιουργία σύνδεσης αναπαραγωγής συγκεκριμένης βάσης δεδομένων"
+
+#: pg_recvlogical.c:1033
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "τελική θέση %X/%X που επιτεύχθηκε από keepalive"
+
+#: pg_recvlogical.c:1036
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "τελική θέση %X/%X που επιτεύχθηκε από εγγραφή WAL στο %X/%X"
+
+#: receivelog.c:68
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η δημιουργία αρχείου κατάστασης αρχειοθήκης «%s»: %s"
+
+#: receivelog.c:75
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "δεν ήταν δυνατό το κλείσιμο αρχείου κατάστασης αρχειοθήκης «%s»: %s"
+
+#: receivelog.c:123
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η απόκτηση μεγέθους του υπάρχοντος αρχείου write-ahead log «%s»: %s"
+
+#: receivelog.c:134
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "δεν ήταν δυνατό το άνοιγμα του υπάρχοντος αρχείου write-ahead log «%s»: %s"
+
+#: receivelog.c:143
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "δεν ήταν δυνατό το fsync του υπάρχοντος αρχείου write-ahead log «%s»: %s"
+
+#: receivelog.c:158
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "το αρχείο write-ahead log «%s» έχει %zd byte, θα έπρεπε να είναι 0 ή %d"
+msgstr[1] "το αρχείο write-ahead log «%s» έχει %zd bytes, θα έπρεπε να είναι 0 ή %d"
+
+#: receivelog.c:174
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου write-ahead log «%s»: %s"
+
+#: receivelog.c:208
+#, c-format
+msgid "could not determine seek position in file \"%s\": %s"
+msgstr "δεν ήταν δυνατός ο προσδιορισμός της θέσης αναζήτησης στο αρχείο «%s»: %s"
+
+#: receivelog.c:223
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "δεν μετονομάζει «%s», το τμήμα δεν είναι πλήρες"
+
+#: receivelog.c:234 receivelog.c:323 receivelog.c:694
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου «%s»: %s"
+
+#: receivelog.c:295
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "ο διακομιστής ανέφερε μη αναμενόμενο όνομα αρχείου ιστορικού για την χρονογραμμή %u: %s"
+
+#: receivelog.c:303
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η δημιουργία αρχείου ιστορικού χρονογραμμής «%s»: %s"
+
+#: receivelog.c:310
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η εγγραφή αρχείου ιστορικού χρονογραμμής «%s»: %s"
+
+#: receivelog.c:400
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "μη συμβατή έκδοση διακομιστή %s· Ο πελάτης δεν υποστηρίζει ροή από εκδόσεις διακομιστών παλαιότερες από %s"
+
+#: receivelog.c:409
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "μη συμβατή έκδοση διακομιστή %s· Ο πελάτης δεν υποστηρίζει ροή από εκδόσεις διακομιστών νεότερες από %s"
+
+#: receivelog.c:514
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "το αναγνωριστικό συστήματος δεν αντιστοιχεί μεταξύ βασικού αντιγράφου ασφαλείας και σύνδεσης ροής"
+
+#: receivelog.c:522
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "η χρονογραμμή εκκίνησης %u δεν υπάρχει στο διακομιστή"
+
+#: receivelog.c:561
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "μη αναμενόμενη απόκριση στην εντολή TIMELINE_HISTORY: έλαβε %d σειρές και %d πεδία, ανέμενε %d σειρές και %d πεδία"
+
+#: receivelog.c:632
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "ο διακομιστής ανέφερε απροσδόκητη επόμενη χρονογραμμή %u, ακολουθώντας τη χρονογραμμή %u"
+
+#: receivelog.c:638
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "ο διακομιστής σταμάτησε τη ροή χρονογραμμής %u στο %X/%X, αλλά ανέφερε ότι η επόμενη χρονογραμμή %u να ξεκινήσει από το %X/%X"
+
+#: receivelog.c:678
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "η ροή αναπαραγωγής τερματίστηκε πριν από το σημείο διακοπής"
+
+#: receivelog.c:724
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "μη αναμενόμενο σύνολο αποτελεσμάτων μετά το τέλος της χρονογραμμής: έλαβε %d σειρές και %d πεδία, ανέμενε %d σειρές και %d πεδία"
+
+#: receivelog.c:733
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση του σημείου εκκίνησης «%s» της επόμενης χρονογραμμής"
+
+#: receivelog.c:781 receivelog.c:1030 walmethods.c:1205
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής fsync στο αρχείο «%s»: %s"
+
+#: receivelog.c:1091
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "έλαβε εγγραφή write-ahead log για μετατόπιση %u χωρίς ανοικτό αρχείου"
+
+#: receivelog.c:1101
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "έλαβε μετατόπιση δεδομένων WAL %08x, ανέμενε %08x"
+
+#: receivelog.c:1135
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η εγγραφή %d bytes στο αρχείο WAL «%s»: %s"
+
+#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "δεν ήταν δυνατή η αποστολή πακέτου copy-end: %s"
+
+#: streamutil.c:159
+msgid "Password: "
+msgstr "Κωδικός πρόσβασης: "
+
+#: streamutil.c:182
+#, c-format
+msgid "could not connect to server"
+msgstr "δεν ήταν δυνατή η σύνδεση με το διακομιστή"
+
+#: streamutil.c:225
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "δεν ήταν δυνατή η εκκαθάριση του search_path: %s"
+
+#: streamutil.c:241
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "δεν ήταν δυνατός ο προσδιορισμός της ρύθμισης διακομιστή για integer_datetimes"
+
+#: streamutil.c:248
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "η επισήμανση μεταγλώττισης integer_datetimes δεν συμφωνεί με το διακομιστή"
+
+#: streamutil.c:299
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "δεν ήταν δυνατή η λήψη μεγέθους τμήματος WAL: %d σειρές και %d πεδία, ανέμενε %d σειρές και %d ή περισσότερα πεδία"
+
+#: streamutil.c:309
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "δεν ήταν δυνατή η ανάλυση του μεγέθους του τμήματος WAL"
+
+#: streamutil.c:327
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "το μέγεθος τμήματος WAL πρέπει να έχει τιμή δύναμη του δύο μεταξύ 1 MB και 1 GB, αλλά ο απομακρυσμένος διακομιστής ανέφερε τιμή %d byte"
+msgstr[1] "το μέγεθος τμήματος WAL πρέπει να έχει τιμή δύναμη του δύο μεταξύ 1 MB και 1 GB, αλλά ο απομακρυσμένος διακομιστής ανέφερε τιμή %d bytes"
+
+#: streamutil.c:372
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "δεν ήταν δυνατή η λήψη επισήμανσης πρόσβασης group: %d σειρές και %d πεδία, ανέμενε %d σειρές και %d ή περισσότερα πεδία"
+
+#: streamutil.c:381
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "δεν ήταν δυνατή η ανάλυση της σημαίας πρόσβασης γκρουπ: %s"
+
+#: streamutil.c:424 streamutil.c:461
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "δεν ήταν δυνατή η αναγνώριση του συστήματος: έλαβε %d σειρές και %d πεδία, ανέμενε %d σειρές και %d ή περισσότερα πεδία"
+
+#: streamutil.c:513
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "δεν ήταν δυνατή η ανάγνωση της υποδοχής αναπαραγωγής «%s»: έλαβε %d σειρές και %d πεδία, ανέμενε %d σειρές και %d πεδία"
+
+#: streamutil.c:525
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "η υποδοχή αναπαραγωγής «%s» δεν υπάρχει"
+
+#: streamutil.c:536
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "αναμένεται μια φυσική υποδοχή αναπαραγωγής, πήρε τον τύπο «%s» αντ 'αυτού"
+
+#: streamutil.c:550
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση restart_lsn «%s» για την υποδοχή αναπαραγωγής «%s»"
+
+#: streamutil.c:667
+#, c-format
+msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "δεν ήταν δυνατή η δημιουργία της υποδοχής αναπαραγωγής «%s»: %d σειρές και %d πεδία, ανέμενε %d σειρές και %d πεδία"
+
+#: streamutil.c:711
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "δεν ήταν δυνατή η κατάργηση της υποδοχής αναπαραγωγής «%s»: έλαβε %d σειρές και %d πεδία, ανέμενε %d σειρές και %d πεδία"
+
+#: walmethods.c:720 walmethods.c:1267
+msgid "could not compress data"
+msgstr "δεν ήταν δυνατή η συμπίεση δεδομένων"
+
+#: walmethods.c:749
+msgid "could not reset compression stream"
+msgstr "δεν ήταν δυνατή η επαναφορά της ροής συμπίεσης"
+
+#: walmethods.c:880
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "σφάλμα υλοποίησης: τα αρχεία tar δεν μπορούν να έχουν περισσότερα από ένα ανοιχτά αρχεία"
+
+#: walmethods.c:894
+msgid "could not create tar header"
+msgstr "δεν ήταν δυνατή η δημιουργία κεφαλίδας tar"
+
+#: walmethods.c:910 walmethods.c:951 walmethods.c:1170 walmethods.c:1183
+msgid "could not change compression parameters"
+msgstr "δεν ήταν δυνατή η αλλαγή παραμέτρων συμπίεσης"
+
+#: walmethods.c:1055
+msgid "unlink not supported with compression"
+msgstr "το unlink δεν υποστηρίζεται με συμπίεση"
+
+#: walmethods.c:1291
+msgid "could not close compression stream"
+msgstr "δεν ήταν δυνατό το κλείσιμο της ροής συμπίεσης"
+
+#~ msgid " -Z, --compress=0-9 compress logs with given compression level\n"
+#~ msgstr " -Z, --compress=0-9 συμπίεσε logs με το ορισμένο επίπεδο συμπίεσης\n"
+
+#~ msgid " -Z, --compress=0-9 compress tar output with given compression level\n"
+#~ msgstr " -Z, --compress=0-9 συμπίεσε την έξοδο tar με το ορισμένο επίπεδο συμπίεσης\n"
+
+#~ msgid "could not get write-ahead log end position from server: %s"
+#~ msgstr "δεν ήταν δυνατή η απόκτηση τελικής θέσης write-ahead log από τον διακομιστή: %s"
+
+#~ msgid "fatal: "
+#~ msgstr "κρίσιμο: "
+
+#~ msgid "invalid compression level \"%s\""
+#~ msgstr "μη έγκυρο επίπεδο συμπίεσης «%s»"
+
+#~ msgid "invalid fsync interval \"%s\""
+#~ msgstr "μη έγκυρο διάστημα FSYNC «%s»"
+
+#~ msgid "invalid port number \"%s\""
+#~ msgstr "μη έγκυρος αριθμός πύλης: «%s»"
+
+#~ msgid "invalid status interval \"%s\""
+#~ msgstr "μη έγκυρο διάστημα status «%s»"
+
+#~ msgid "invalid tar block header size: %zu"
+#~ msgstr "μη έγκυρο μέγεθος κεφαλίδας μπλοκ tar: %zu"
+
+#~ msgid "unrecognized link indicator \"%c\""
+#~ msgstr "μη αναγνωρίσιμος δείκτης σύνδεσης «%c»"
diff --git a/src/bin/pg_basebackup/po/es.po b/src/bin/pg_basebackup/po/es.po
new file mode 100644
index 0000000..1be3250
--- /dev/null
+++ b/src/bin/pg_basebackup/po/es.po
@@ -0,0 +1,1813 @@
+# Spanish message translation file for pg_basebackup
+#
+# Copyright (c) 2011-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Álvaro Herrera <alvherre@alvh.no-ip.org>, 2011-2014.
+# Carlos Chapi <carlos.chapi@2ndquadrant.com>, 2017, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:48+0000\n"
+"PO-Revision-Date: 2022-10-20 09:06+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../common/compression.c:130 ../../common/compression.c:139
+#: ../../common/compression.c:148
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "esta instalación no soporta compresión con %s"
+
+#: ../../common/compression.c:203
+msgid "found empty string where a compression option was expected"
+msgstr "se encontró una cadena vacía donde se esperaba una opción de compresión"
+
+#: ../../common/compression.c:237
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "opción de compresión no reconocida: «%s»"
+
+#: ../../common/compression.c:276
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "la opción de compresión «%s» requiere un valor"
+
+#: ../../common/compression.c:285
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "el valor para la opción de compresión «%s» debe ser un entero"
+
+#: ../../common/compression.c:335
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "el algoritmo de compresión «%s» no acepta un nivel de compresión"
+
+#: ../../common/compression.c:342
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "el algoritmo de compresión «%s» espera un nivel de compresión entre %d y %d (por omisión %d)"
+
+#: ../../common/compression.c:353
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "el algoritmo de compresión «%s» no acepta una cantidad de procesos ayudantes"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "no se puede duplicar un puntero nulo (error interno)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#: pg_receivewal.c:380 pg_recvlogical.c:341
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "no se pudo hacer stat al archivo «%s»: %m"
+
+#: ../../common/file_utils.c:166 pg_receivewal.c:303
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: ../../common/file_utils.c:200 pg_receivewal.c:532
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "no se pudo leer el directorio «%s»: %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:447
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#: pg_recvlogical.c:196
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m"
+
+#: ../../common/file_utils.c:383 pg_basebackup.c:2266 walmethods.c:459
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "el valor «%s» no es válido para la opción «%s»"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s debe estar en el rango %d..%d"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1646
+#, c-format
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1443 pg_basebackup.c:1737
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "no se pudo escribir a archivo «%s»: %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339
+#: pg_basebackup.c:1507 pg_basebackup.c:1716
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "no se pudo crear archivo «%s»: %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:635
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo «%s»: %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "estado inesperado mientras se extraía el archivo"
+
+#: bbstreamer_file.c:298 pg_basebackup.c:696 pg_basebackup.c:740
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "no se pudo crear el directorio «%s»: %m"
+
+#: bbstreamer_file.c:304
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "no se pudo definir los permisos del directorio «%s»: %m"
+
+#: bbstreamer_file.c:323
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "no se pudo crear un enlace simbólico desde «%s» a «%s»: %m"
+
+#: bbstreamer_file.c:343
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "no se pudo definir los permisos al archivo «%s»: %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "no se pudo crear el archivo comprimido «%s»: %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "no se pudo duplicar stdout: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "no se pudo abrir el archivo de salida: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "no se pudo definir el nivel de compresión %d: %s"
+
+#: bbstreamer_gzip.c:116 bbstreamer_gzip.c:249
+#, c-format
+msgid "this build does not support gzip compression"
+msgstr "esta instalación no soporta compresión gzip"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "no se pudo escribir al archivo comprimido «%s»: %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo comprimido «%s»: %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:869
+#, c-format
+msgid "could not initialize compression library"
+msgstr "no se pudo inicializar la biblioteca de compresión"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:316
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "no se pudo descomprimir datos: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "formato de resultados inesperado mientras se inyectaban los parámetros de recuperación"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "no se pudo crear un contexto de compresión lz4: %s"
+
+#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298
+#, c-format
+msgid "this build does not support lz4 compression"
+msgstr "esta instalación no soporta compresión lz4"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "no se pudo escribir la cabecera lz4: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:168 bbstreamer_zstd.c:210
+#, c-format
+msgid "could not compress data: %s"
+msgstr "no se pudo comprimir datos: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "no se pudo terminar la compresión lz4: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "no se pudo inicializar la biblioteca de compresión: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "la terminación del archivo tar excede de 2 bloques"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "se encontró un estado inesperado mientras se interpretaba el archivo tar"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "miembro de tar tiene nombre vacío"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "el flujo COPY terminó antes que el último archivo estuviera completo"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "no se pudo restablecer el contexto de compresión zstd"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "no se pudo definir el nivel de compresión zstd a %d: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "no se pudo definir la cantidad de procesos ayudantes de compresión a %d: %s"
+
+#: bbstreamer_zstd.c:116 bbstreamer_zstd.c:271
+#, c-format
+msgid "this build does not support zstd compression"
+msgstr "esta instalación no soporta compresión zstd"
+
+#: bbstreamer_zstd.c:262
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "no se pudo crear el contexto de descompresión zstd"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "eliminando el directorio de datos «%s»"
+
+#: pg_basebackup.c:242
+#, c-format
+msgid "failed to remove data directory"
+msgstr "no se pudo eliminar el directorio de datos"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "eliminando el contenido del directorio «%s»"
+
+#: pg_basebackup.c:248
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "no se pudo eliminar el contenido del directorio de datos"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "eliminando el directorio de WAL «%s»"
+
+#: pg_basebackup.c:255
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "no se pudo eliminar el directorio de WAL"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "eliminando el contenido del directorio de WAL «%s»"
+
+#: pg_basebackup.c:261
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "no se pudo eliminar el contenido del directorio de WAL"
+
+#: pg_basebackup.c:267
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "directorio de datos «%s» no eliminado a petición del usuario"
+
+#: pg_basebackup.c:270
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "directorio de WAL «%s» no eliminado a petición del usuario"
+
+#: pg_basebackup.c:274
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "los cambios a los directorios de tablespaces no se desharán"
+
+#: pg_basebackup.c:326
+#, c-format
+msgid "directory name too long"
+msgstr "nombre de directorio demasiado largo"
+
+#: pg_basebackup.c:333
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "múltiples signos «=» en mapeo de tablespace"
+
+#: pg_basebackup.c:342
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "formato de mapeo de tablespace «%s» no válido, debe ser «ANTIGUO=NUEVO»"
+
+#: pg_basebackup.c:361
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "directorio antiguo no es una ruta absoluta en mapeo de tablespace: %s"
+
+#: pg_basebackup.c:365
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "directorio nuevo no es una ruta absoluta en mapeo de tablespace: %s"
+
+#: pg_basebackup.c:387
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s obtiene un respaldo base a partir de un servidor PostgreSQL en ejecución.\n"
+"\n"
+
+#: pg_basebackup.c:389 pg_receivewal.c:81 pg_recvlogical.c:78
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_basebackup.c:390 pg_receivewal.c:82 pg_recvlogical.c:79
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPCIÓN]...\n"
+
+#: pg_basebackup.c:391
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Opciones que controlan la salida:\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=DIR directorio en el cual recibir el respaldo base\n"
+
+#: pg_basebackup.c:393
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t formato de salida (plano (por omisión), tar)\n"
+
+#: pg_basebackup.c:394
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=TASA máxima tasa a la que transferir el directorio de datos\n"
+" (en kB/s, o use sufijos «k» o «M»)\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" escribe configuración para replicación\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=DESTINO:[DETALLE]\n"
+" destino del respaldo base (si no es el cliente)\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=ANTIGUO=NUEVO\n"
+" reubicar el directorio de tablespace de ANTIGUO a NUEVO\n"
+
+#: pg_basebackup.c:402
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=DIRWAL ubicación para el directorio WAL\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" incluye los archivos WAL necesarios,\n"
+" en el modo especificado\n"
+
+#: pg_basebackup.c:405
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip comprimir la salida de tar\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]MÉTODO[:DETALLE]\n"
+" comprimir en cliente o servidor como se especifica\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none no comprimir la salida tar\n"
+
+#: pg_basebackup.c:409
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Opciones generales:\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" utilizar checkpoint rápido o extendido\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot crear un slot de replicación\n"
+
+#: pg_basebackup.c:413
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=ETIQUETA establecer etiqueta del respaldo\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean no hacer limpieza tras errores\n"
+
+#: pg_basebackup.c:415
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n"
+
+#: pg_basebackup.c:416
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostrar información de progreso\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:91
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=NOMBRE slot de replicación a usar\n"
+
+#: pg_basebackup.c:418 pg_receivewal.c:93 pg_recvlogical.c:100
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose desplegar mensajes verbosos\n"
+
+#: pg_basebackup.c:419 pg_receivewal.c:94 pg_recvlogical.c:101
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión, luego salir\n"
+
+#: pg_basebackup.c:420
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" usar algoritmo para sumas de comprobación del manifiesto\n"
+
+#: pg_basebackup.c:422
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" codifica a hexadecimal todos los nombres de archivo en el manifiesto\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size no estimar el tamaño del la copia de seguridad en el lado del servidor\n"
+
+#: pg_basebackup.c:425
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest suprimir la generación del manifiesto de la copia de seguridad\n"
+
+#: pg_basebackup.c:426
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot evitar la creación de un slot de replicación temporal\n"
+
+#: pg_basebackup.c:427
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" no verificar checksums\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:97 pg_recvlogical.c:102
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda, luego salir\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opciones de conexión:\n"
+
+#: pg_basebackup.c:431 pg_receivewal.c:99
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONSTR cadena de conexión\n"
+
+#: pg_basebackup.c:432 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=ANFITRIÓN dirección del servidor o directorio del socket\n"
+
+#: pg_basebackup.c:433 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT número de port del servidor\n"
+
+#: pg_basebackup.c:434
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVALO (segundos)\n"
+" tiempo entre envíos de paquetes de estado al servidor\n"
+
+#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NOMBRE conectarse con el usuario especificado\n"
+
+#: pg_basebackup.c:437 pg_receivewal.c:103 pg_recvlogical.c:108
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pedir contraseña\n"
+
+#: pg_basebackup.c:438 pg_receivewal.c:104 pg_recvlogical.c:109
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password forzar un prompt para la contraseña\n"
+" (debería ser automático)\n"
+
+#: pg_basebackup.c:439 pg_receivewal.c:108 pg_recvlogical.c:110
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: pg_basebackup.c:440 pg_receivewal.c:109 pg_recvlogical.c:111
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_basebackup.c:482
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "no se pudo leer desde la tubería: %m"
+
+#: pg_basebackup.c:485 pg_basebackup.c:632 pg_basebackup.c:2180
+#: streamutil.c:444
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "no se pudo interpretar la ubicación del WAL «%s»"
+
+#: pg_basebackup.c:591 pg_receivewal.c:663
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "no se pudo completar la escritura de archivos WAL: %m"
+
+#: pg_basebackup.c:641
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "no se pudo crear la tubería para el proceso en segundo plano: %m"
+
+#: pg_basebackup.c:674
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "se creó slot temporal de replicación «%s»"
+
+#: pg_basebackup.c:677
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "se creó el slot de replicación «%s»"
+
+#: pg_basebackup.c:711
+#, c-format
+msgid "could not create background process: %m"
+msgstr "no se pudo lanzar el proceso en segundo plano: %m"
+
+#: pg_basebackup.c:720
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "no se pudo lanzar el hilo en segundo plano: %m"
+
+#: pg_basebackup.c:759
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "el directorio «%s» existe pero no está vacío"
+
+#: pg_basebackup.c:765
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "no se pudo acceder al directorio «%s»: %m"
+
+#: pg_basebackup.c:842
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgstr[1] "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+
+#: pg_basebackup.c:854
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+
+#: pg_basebackup.c:870
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespaces"
+
+#: pg_basebackup.c:894
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "tasa de transferencia «%s» no es un valor válido"
+
+#: pg_basebackup.c:896
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "tasa de transferencia «%s» no válida: %m"
+
+#: pg_basebackup.c:903
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "tasa de transferencia debe ser mayor que cero"
+
+#: pg_basebackup.c:933
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "unidad de --max-rato no válida: «%s»"
+
+#: pg_basebackup.c:937
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "la tasa de transferencia «%s» excede el rango de enteros"
+
+#: pg_basebackup.c:944
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "la tasa de transferencia «%s» está fuera de rango"
+
+#: pg_basebackup.c:1040
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "no se pudo obtener un flujo de datos COPY: %s"
+
+#: pg_basebackup.c:1057 pg_recvlogical.c:438 pg_recvlogical.c:610
+#: receivelog.c:981
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "no fue posible leer datos COPY: %s"
+
+#: pg_basebackup.c:1061
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "un proceso en segundo plano terminó inesperadamente"
+
+#: pg_basebackup.c:1132
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "no se pueden inyectar un manifiesto en un archivo tar comprimido"
+
+#: pg_basebackup.c:1133
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "Use compresión del lado del cliente, envíe la salida a un directorio en lugar de a salida estándar, o use %s."
+
+#: pg_basebackup.c:1149
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "no se pudo interpretar el archivo «%s»"
+
+#: pg_basebackup.c:1150
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "Sólo los archivos tar pueden ser interpretados."
+
+#: pg_basebackup.c:1152
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "El formato plano requiere que pg_basebackup interprete el archivo."
+
+#: pg_basebackup.c:1154
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "Usar - como directorio de salida requiere que pg_basebackup interprete el archivo."
+
+#: pg_basebackup.c:1156
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "La opción -R requiere que pg_basebackup interprete el archivo."
+
+#: pg_basebackup.c:1367
+#, c-format
+msgid "archives must precede manifest"
+msgstr "los archivos deben preceder al manifiesto"
+
+#: pg_basebackup.c:1382
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "nombre de archivo no válido: «%s»"
+
+#: pg_basebackup.c:1454
+#, c-format
+msgid "unexpected payload data"
+msgstr "datos inesperados"
+
+#: pg_basebackup.c:1597
+#, c-format
+msgid "empty COPY message"
+msgstr "mensaje COPY vacío"
+
+#: pg_basebackup.c:1599
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "mensaje COPY mal formado de tipo %d, largo %zu"
+
+#: pg_basebackup.c:1797
+#, c-format
+msgid "incompatible server version %s"
+msgstr "versión del servidor %s incompatible"
+
+#: pg_basebackup.c:1813
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "Use -X none o -X fetch para deshabilitar el flujo de log."
+
+#: pg_basebackup.c:1881
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "los destinos de respaldo no están soportados por esta versión de servidor"
+
+#: pg_basebackup.c:1884
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "la configuración de recuperación no puede ser escrita cuando se usa un destino de respaldo base"
+
+#: pg_basebackup.c:1911
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "el servidor no soporta compresión del lado del servidor"
+
+#: pg_basebackup.c:1921
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "iniciando el respaldo base, esperando que el checkpoint se complete"
+
+#: pg_basebackup.c:1925
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "esperando al checkpoint"
+
+#: pg_basebackup.c:1938 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588
+#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504
+#: streamutil.c:656 streamutil.c:701
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "no se pudo ejecutar la orden de replicación «%s»: %s"
+
+#: pg_basebackup.c:1946
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "no se pudo iniciar el respaldo base: %s"
+
+#: pg_basebackup.c:1949
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "el servidor envió una respuesta inesperada a la orden BASE_BACKUP; se obtuvieron %d filas y %d campos, se esperaban %d filas y %d campos"
+
+#: pg_basebackup.c:1955
+#, c-format
+msgid "checkpoint completed"
+msgstr "el checkpoint se ha completado"
+
+#: pg_basebackup.c:1970
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "punto de inicio del WAL: %s en el timeline %u"
+
+#: pg_basebackup.c:1978
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "no se pudo obtener la cabecera de respaldo: %s"
+
+#: pg_basebackup.c:1981
+#, c-format
+msgid "no data returned from server"
+msgstr "el servidor no retornó datos"
+
+#: pg_basebackup.c:2016
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "sólo se puede escribir un tablespace a stdout, la base de datos tiene %d"
+
+#: pg_basebackup.c:2029
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "iniciando el receptor de WAL en segundo plano"
+
+#: pg_basebackup.c:2111
+#, c-format
+msgid "backup failed: %s"
+msgstr "el respaldo falló: %s"
+
+#: pg_basebackup.c:2114
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "el servidor no retornó la posición final del WAL"
+
+#: pg_basebackup.c:2117
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "posición final del WAL: %s"
+
+#: pg_basebackup.c:2128
+#, c-format
+msgid "checksum error occurred"
+msgstr "ocurrió un error de checksums"
+
+#: pg_basebackup.c:2133
+#, c-format
+msgid "final receive failed: %s"
+msgstr "la recepción final falló: %s"
+
+#: pg_basebackup.c:2157
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "esperando que el proceso en segundo plano complete el flujo..."
+
+#: pg_basebackup.c:2161
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "no se pudo enviar una orden a la tubería de segundo plano: %m"
+
+#: pg_basebackup.c:2166
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "no se pudo esperar al proceso hijo: %m"
+
+#: pg_basebackup.c:2168
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "el hijo %d murió, pero se esperaba al %d"
+
+#: pg_basebackup.c:2170 streamutil.c:91 streamutil.c:197
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2190
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "no se pudo esperar el hilo hijo: %m"
+
+#: pg_basebackup.c:2195
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "no se pudo obtener la cabecera de respaldo: %m"
+
+#: pg_basebackup.c:2198
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "el hilo hijo terminó con error %u"
+
+#: pg_basebackup.c:2227
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "sincronizando datos a disco ..."
+
+#: pg_basebackup.c:2252
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "renombrando backup_manifest.tmp a backup_manifest"
+
+#: pg_basebackup.c:2272
+#, c-format
+msgid "base backup completed"
+msgstr "el respaldo base se ha completado"
+
+#: pg_basebackup.c:2361
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "formato de salida «%s» no válido, debe ser «plain» o «tar»"
+
+#: pg_basebackup.c:2405
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "opción de wal-method «%s» no válida, debe ser «fetch», «stream» o «none»"
+
+#: pg_basebackup.c:2435
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "argumento de checkpoint «%s» no válido, debe ser «fast» o «spread»"
+
+#: pg_basebackup.c:2486 pg_basebackup.c:2498 pg_basebackup.c:2520
+#: pg_basebackup.c:2532 pg_basebackup.c:2538 pg_basebackup.c:2590
+#: pg_basebackup.c:2601 pg_basebackup.c:2611 pg_basebackup.c:2617
+#: pg_basebackup.c:2624 pg_basebackup.c:2636 pg_basebackup.c:2648
+#: pg_basebackup.c:2656 pg_basebackup.c:2669 pg_basebackup.c:2675
+#: pg_basebackup.c:2684 pg_basebackup.c:2696 pg_basebackup.c:2707
+#: pg_basebackup.c:2715 pg_receivewal.c:814 pg_receivewal.c:826
+#: pg_receivewal.c:833 pg_receivewal.c:842 pg_receivewal.c:849
+#: pg_receivewal.c:859 pg_recvlogical.c:837 pg_recvlogical.c:849
+#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873
+#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894
+#: pg_recvlogical.c:901 pg_recvlogical.c:908
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_basebackup.c:2496 pg_receivewal.c:824 pg_recvlogical.c:847
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_basebackup.c:2519
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "no se puede especificar un formato junto con un destino de respaldo"
+
+#: pg_basebackup.c:2531
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "debe especificar un directorio de salida o destino de respaldo base"
+
+#: pg_basebackup.c:2537
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "no se puede especificar un directorio de salida junto con un destino de respaldo"
+
+#: pg_basebackup.c:2567 pg_receivewal.c:868
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "algoritmo de compresión no reconocido: «%s»"
+
+#: pg_basebackup.c:2573 pg_receivewal.c:875
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "especificación de compresión no válida: %s"
+
+#: pg_basebackup.c:2589
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "la compresión del lado del cliente no es posible cuando se especifica un destino del respaldo base"
+
+#: pg_basebackup.c:2600
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "sólo los respaldos de modo tar pueden ser comprimidos"
+
+#: pg_basebackup.c:2610
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "no se puede enviar WAL cuando se especifica un destino del respaldo base"
+
+#: pg_basebackup.c:2616
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "no se puede enviar WALs en modo tar a stdout"
+
+#: pg_basebackup.c:2623
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "los slots de replicación sólo pueden usarse con flujo de WAL"
+
+#: pg_basebackup.c:2635
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "no se puede usar --no-slot junto con nombre de slot"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2646 pg_receivewal.c:840
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "la opcón %s necesita que se especifique un slot con --slot"
+
+#: pg_basebackup.c:2654 pg_basebackup.c:2694 pg_basebackup.c:2705
+#: pg_basebackup.c:2713
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s y %s son opciones incompatibles"
+
+#: pg_basebackup.c:2668
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "la ubicación del directorio de WAL no puede especificarse junto con un destino de respaldo"
+
+#: pg_basebackup.c:2674
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "la ubicación del directorio de WAL sólo puede especificarse en modo «plain»"
+
+#: pg_basebackup.c:2683
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "la ubicación del directorio de WAL debe ser una ruta absoluta"
+
+#: pg_basebackup.c:2784
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "no se pudo crear el enlace simbólico «%s»: %m"
+
+#: pg_basebackup.c:2786
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "los enlaces simbólicos no están soportados en esta plataforma"
+
+#: pg_receivewal.c:79
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s recibe flujos del WAL de PostgreSQL.\n"
+"\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:84
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opciones:\n"
+
+#: pg_receivewal.c:84
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=DIR recibir los archivos de WAL en este directorio\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:85
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN salir luego de recibir el LSN especificado\n"
+
+#: pg_receivewal.c:86 pg_recvlogical.c:89
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists no abandonar si el slot ya existe al crear un slot\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:91
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop no entrar en bucle al perder la conexión\n"
+
+#: pg_receivewal.c:88
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync no esperar que los cambios se sincronicen a disco\n"
+
+#: pg_receivewal.c:89 pg_recvlogical.c:96
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SECS\n"
+" tiempo entre envíos de paquetes de estado al servidor\n"
+" (por omisión: %d)\n"
+
+#: pg_receivewal.c:92
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous sincronizar el WAL inmediatamente después de escribir\n"
+
+#: pg_receivewal.c:95
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=MÉTODO[:DETALLE]\n"
+" comprimir como se indica\n"
+
+#: pg_receivewal.c:105
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Acciones optativas:\n"
+
+#: pg_receivewal.c:106 pg_recvlogical.c:81
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot crear un nuevo slot de replicación (para el nombre, vea --slot)\n"
+
+#: pg_receivewal.c:107 pg_recvlogical.c:82
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot eliminar un slot de replicación (para el nombre, vea --slot)\n"
+
+#: pg_receivewal.c:252
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "terminó el segmento en %X/%X (timeline %u)"
+
+#: pg_receivewal.c:259
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "detenido el flujo de log en %X/%X (timeline %u)"
+
+#: pg_receivewal.c:275
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "cambiado al timeline %u en %X/%X"
+
+#: pg_receivewal.c:285
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "se recibió una señal de interrupción, saliendo"
+
+#: pg_receivewal.c:317
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_receivewal.c:384
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "el archivo de segmento «%s» tiene tamaño incorrecto %lld, ignorando"
+
+#: pg_receivewal.c:401
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "no se pudo abrir el archivo comprimido «%s»: %m"
+
+#: pg_receivewal.c:404
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "no se pudo buscar en el archivo comprimido «%s»: %m"
+
+#: pg_receivewal.c:410
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "no se pudo leer el archivo comprimido «%s»: %m"
+
+#: pg_receivewal.c:413
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "no se pudo leer el archivo comprimido «%s»: leídos %d de %zu"
+
+#: pg_receivewal.c:423
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "el archivo de segmento «%s» tiene tamaño incorrecto %d al descomprimirse, ignorando"
+
+#: pg_receivewal.c:451
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "no se pudo crear un contexto de descompresión LZ4: %s"
+
+#: pg_receivewal.c:463
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "no se pudo leer el archivo «%s»: %m"
+
+#: pg_receivewal.c:481
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "no se pudo descomprimir el archivo «%s»: %s"
+
+#: pg_receivewal.c:504
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "no se pudo liberar el contexto de descompresión LZ4: %s"
+
+#: pg_receivewal.c:509
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "el archivo de segmento «%s» tiene tamaño incorrecto %zu al descomprimirse, ignorando"
+
+#: pg_receivewal.c:514
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "no se puede verificar el archivo «%s»: la compresión con %s no está soportada en este servidor"
+
+#: pg_receivewal.c:641
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "iniciando el flujo de log en %X/%X (timeline %u)"
+
+#: pg_receivewal.c:783 pg_recvlogical.c:785
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "no se pudo interpretar la posición final «%s»"
+
+#: pg_receivewal.c:832
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "no puede usarse --create-slot junto con --drop-slot"
+
+#: pg_receivewal.c:848
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "no puede usarse --synchronous junto con --no-sync"
+
+#: pg_receivewal.c:858
+#, c-format
+msgid "no target directory specified"
+msgstr "no se especificó un directorio de salida"
+
+#: pg_receivewal.c:882
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "el método de compresión %s no está soportado aún"
+
+#: pg_receivewal.c:924
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "la conexión de replicación usando el slot «%s» es inesperadamente específica a una base de datos"
+
+#: pg_receivewal.c:943 pg_recvlogical.c:955
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "eliminando el slot de replicación «%s»"
+
+#: pg_receivewal.c:954 pg_recvlogical.c:965
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "creando el slot de replicación «%s»"
+
+#: pg_receivewal.c:983 pg_recvlogical.c:989
+#, c-format
+msgid "disconnected"
+msgstr "desconectado"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:987 pg_recvlogical.c:993
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "desconectado; esperando %d segundos para intentar nuevamente"
+
+#: pg_recvlogical.c:76
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s controla flujos de decodificación lógica de PostgreSQL.\n"
+"\n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Acciones a ejecutar:\n"
+
+#: pg_recvlogical.c:83
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start iniciar flujo en un slot de replicación (para el nombre, vea --slot)\n"
+
+#: pg_recvlogical.c:86
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=ARCHIVO recibir el log en este archivo, - para stdout\n"
+
+#: pg_recvlogical.c:87
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F, --fsync-interval=SEGS\n"
+" tiempo entre fsyncs del archivo de salida (omisión: %d)\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN dónde en un slot existente debe empezar el flujo\n"
+
+#: pg_recvlogical.c:92
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NOMBRE[=VALOR]\n"
+" pasar opción NOMBRE con valor opcional VALOR al\n"
+" plugin de salida\n"
+
+#: pg_recvlogical.c:95
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN usar plug-in de salida PLUGIN (omisión: %s)\n"
+
+#: pg_recvlogical.c:98
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=NOMBRE-SLOT nombre del slot de replicación lógica\n"
+
+#: pg_recvlogical.c:99
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr " -t, --two-phase activa decodificación de transacciones preparadas al crear un slot\n"
+
+#: pg_recvlogical.c:104
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=BASE base de datos a la cual conectarse\n"
+
+#: pg_recvlogical.c:137
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "confirmando escritura hasta %X/%X, fsync hasta %X/%X (slot %s)"
+
+#: pg_recvlogical.c:161 receivelog.c:366
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "no se pudo enviar el paquete de retroalimentación: %s"
+
+#: pg_recvlogical.c:229
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "iniciando el flujo de log en %X/%X (slot %s)"
+
+#: pg_recvlogical.c:271
+#, c-format
+msgid "streaming initiated"
+msgstr "flujo iniciado"
+
+#: pg_recvlogical.c:335
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "no se pudo abrir el archivo de registro «%s»: %m"
+
+#: pg_recvlogical.c:364 receivelog.c:889
+#, c-format
+msgid "invalid socket: %s"
+msgstr "el socket no es válido: %s"
+
+#: pg_recvlogical.c:417 receivelog.c:917
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falló: %m"
+
+#: pg_recvlogical.c:424 receivelog.c:967
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "no se pudo recibir datos desde el flujo de WAL: %s"
+
+#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011
+#: receivelog.c:1074
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "cabecera de flujo demasiado pequeña: %d"
+
+#: pg_recvlogical.c:501 receivelog.c:849
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "cabecera de flujo no reconocida: «%c»"
+
+#: pg_recvlogical.c:555 pg_recvlogical.c:567
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "no se pudo escribir %d bytes al archivo de registro «%s»: %m"
+
+#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "término inesperado del flujo de replicación: %s"
+
+#: pg_recvlogical.c:780
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "no se pudo interpretar la posición de inicio «%s»"
+
+#: pg_recvlogical.c:858
+#, c-format
+msgid "no slot specified"
+msgstr "no se especificó slot"
+
+#: pg_recvlogical.c:865
+#, c-format
+msgid "no target file specified"
+msgstr "no se especificó un archivo de destino"
+
+#: pg_recvlogical.c:872
+#, c-format
+msgid "no database specified"
+msgstr "no se especificó una base de datos"
+
+#: pg_recvlogical.c:879
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "debe especificarse al menos una operación"
+
+#: pg_recvlogical.c:886
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "no puede usarse --create-slot o --start junto con --drop-slot"
+
+#: pg_recvlogical.c:893
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "no puede usarse --create-slot o --drop-slot junto con --startpos"
+
+#: pg_recvlogical.c:900
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos sólo se puede utilizar con --start"
+
+#: pg_recvlogical.c:907
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase sólo se puede utilizar con --create-slot"
+
+#: pg_recvlogical.c:939
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "no se pudo establecer una conexión de replicación específica a una base de datos"
+
+#: pg_recvlogical.c:1033
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "ubicación de término %X/%X alcanzado por «keep-alive»"
+
+#: pg_recvlogical.c:1036
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "ubicación de término %X/%X alcanzado por registro WAL en %X/%X"
+
+#: receivelog.c:68
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "no se pudo crear el archivo de estado «%s»: %s"
+
+#: receivelog.c:75
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "no se pudo cerrar el archivo de estado «%s»: %s"
+
+#: receivelog.c:123
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "no se pudo obtener el tamaño del archivo de WAL «%s»: %s"
+
+#: receivelog.c:134
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "no se pudo abrir el archivo de WAL «%s»: %s"
+
+#: receivelog.c:143
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "no se pudo sincronizar (fsync) el archivo de WAL «%s»: %s"
+
+#: receivelog.c:158
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "el archivo de WAL «%s» mide %zd byte, debería ser 0 o %d"
+msgstr[1] "el archivo de WAL «%s» mide %zd bytes, debería ser 0 o %d"
+
+#: receivelog.c:174
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "no se pudo abrir archivo de WAL «%s»: %s"
+
+#: receivelog.c:208
+#, c-format
+msgid "could not determine seek position in file \"%s\": %s"
+msgstr "no se pudo determinar la posición (seek) en el archivo «%s»: %s"
+
+#: receivelog.c:223
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "no se cambiará el nombre a «%s», el segmento no está completo"
+
+#: receivelog.c:234 receivelog.c:323 receivelog.c:694
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "no se pudo cerrar el archivo «%s»: %s"
+
+#: receivelog.c:295
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "el servidor reportó un nombre inesperado para el archivo de historia de timeline %u: %s"
+
+#: receivelog.c:303
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "no se pudo crear el archivo de historia de timeline «%s»: %s"
+
+#: receivelog.c:310
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "no se pudo escribir al archivo de historia de timeline «%s»: %s"
+
+#: receivelog.c:400
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "versión de servidor %s incompatible; el cliente no soporta flujos de servidores anteriores a la versión %s"
+
+#: receivelog.c:409
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "versión de servidor %s incompatible; el cliente no soporta flujos de servidores posteriores a %s"
+
+#: receivelog.c:514
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "el identificador de sistema no coincide entre el respaldo base y la conexión de flujo"
+
+#: receivelog.c:522
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "el timeline de inicio %u no está presente en el servidor"
+
+#: receivelog.c:561
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "respuesta inesperada a la orden TIMELINE_HISTORY: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d campos"
+
+#: receivelog.c:632
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "el servidor reportó un timeline siguiente %u inesperado, a continuación del timeline %u"
+
+#: receivelog.c:638
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "el servidor paró la transmisión del timeline %u en %X/%X, pero reportó que el siguiente timeline %u comienza en %X/%X"
+
+#: receivelog.c:678
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "el flujo de replicación terminó antes del punto de término"
+
+#: receivelog.c:724
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "respuesta inesperada después del fin-de-timeline: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d campos"
+
+#: receivelog.c:733
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "no se pudo interpretar el punto de inicio del siguiente timeline «%s»"
+
+#: receivelog.c:781 receivelog.c:1030 walmethods.c:1205
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "no se pudo sincronizar (fsync) archivo «%s»: %s"
+
+#: receivelog.c:1091
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "se recibió un registro de WAL para el desplazamiento %u sin ningún archivo abierto"
+
+#: receivelog.c:1101
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "se obtuvo desplazamiento de datos WAL %08x, se esperaba %08x"
+
+#: receivelog.c:1135
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "no se pudo escribir %d bytes al archivo WAL «%s»: %s"
+
+#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "no se pudo enviar el paquete copy-end: %s"
+
+#: streamutil.c:159
+msgid "Password: "
+msgstr "Contraseña: "
+
+#: streamutil.c:182
+#, c-format
+msgid "could not connect to server"
+msgstr "no se pudo conectar al servidor"
+
+#: streamutil.c:225
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "no se pudo limpiar search_path: %s"
+
+#: streamutil.c:241
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "no se pudo determinar la opción integer_datetimes del servidor"
+
+#: streamutil.c:248
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "la opción de compilación integer_datetimes no coincide con el servidor"
+
+#: streamutil.c:299
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "no se pudo obtener el tamaño del segmento de WAL: se obtuvo %d filas y %d campos, se esperaban %d filas y %d o más campos"
+
+#: streamutil.c:309
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "el tamaño de segmento de WAL no pudo ser analizado"
+
+#: streamutil.c:327
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "el tamaño de segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero el servidor remoto reportó un valor de %d byte"
+msgstr[1] "el tamaño de segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero el servidor remoto reportó un valor de %d bytes"
+
+#: streamutil.c:372
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "no se pudo obtener el indicador de acceso de grupo: se obtuvo %d filas y %d campos, se esperaban %d filas y %d o más campos"
+
+#: streamutil.c:381
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "el indicador de acceso de grupo no pudo ser analizado: %s"
+
+#: streamutil.c:424 streamutil.c:461
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "no se pudo identificar al sistema: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d o más campos"
+
+#: streamutil.c:513
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "no se pudo leer el slot de replicación «%s»: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d campos"
+
+#: streamutil.c:525
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "no existe el slot de replicación «%s»"
+
+#: streamutil.c:536
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "se esperaba un slot de replicación físico, en cambio se obtuvo tipo «%s»"
+
+#: streamutil.c:550
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "no se pudo interpretar restart_lsn de WAL «%s» para el slot de replicación «%s»"
+
+#: streamutil.c:667
+#, c-format
+msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "no se pudo create el slot de replicación «%s»: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d campos"
+
+#: streamutil.c:711
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "no se pudo eliminar el slot de replicación «%s»: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d campos"
+
+#: walmethods.c:720 walmethods.c:1267
+msgid "could not compress data"
+msgstr "no se pudo comprimir datos"
+
+#: walmethods.c:749
+msgid "could not reset compression stream"
+msgstr "no se pudo restablecer el flujo comprimido"
+
+#: walmethods.c:880
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "error de implementación: los archivos tar no pueden tener abierto más de un fichero"
+
+#: walmethods.c:894
+msgid "could not create tar header"
+msgstr "no se pudo crear la cabecera del archivo tar"
+
+#: walmethods.c:910 walmethods.c:951 walmethods.c:1170 walmethods.c:1183
+msgid "could not change compression parameters"
+msgstr "no se pudo cambiar los parámetros de compresión"
+
+#: walmethods.c:1055
+msgid "unlink not supported with compression"
+msgstr "unlink no soportado con compresión"
+
+#: walmethods.c:1291
+msgid "could not close compression stream"
+msgstr "no se pudo cerrar el flujo comprimido"
diff --git a/src/bin/pg_basebackup/po/fr.po b/src/bin/pg_basebackup/po/fr.po
new file mode 100644
index 0000000..f8be071
--- /dev/null
+++ b/src/bin/pg_basebackup/po/fr.po
@@ -0,0 +1,2197 @@
+# LANGUAGE message translation file for pg_basebackup
+# Copyright (C) 2011-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_basebackup (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2011-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:18+0000\n"
+"PO-Revision-Date: 2022-09-26 14:09+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../common/compression.c:130 ../../common/compression.c:139
+#: ../../common/compression.c:148
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "cette construction ne supporte pas la compression avec %s"
+
+#: ../../common/compression.c:203
+msgid "found empty string where a compression option was expected"
+msgstr "a trouvé une chaîne vide alors qu'une option de compression était attendue"
+
+#: ../../common/compression.c:237
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "option de compression inconnue : « %s »"
+
+#: ../../common/compression.c:276
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "l'option de compression « %s » requiert une valeur"
+
+#: ../../common/compression.c:285
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "la valeur pour l'option de compression « %s » doit être un entier"
+
+#: ../../common/compression.c:335
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "l'algorithme de compression « %s » n'accepte pas un niveau de compression"
+
+#: ../../common/compression.c:342
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "l'algorithme de compression « %s » attend un niveau de compression compris entre %d et %d (par défaut à %d)"
+
+#: ../../common/compression.c:353
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "l'algorithme de compression « %s » n'accepte pas un nombre de workers"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#: pg_receivewal.c:380 pg_recvlogical.c:341
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "n'a pas pu tester le fichier « %s » : %m"
+
+#: ../../common/file_utils.c:166 pg_receivewal.c:303
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "n'a pas pu ouvrir le répertoire « %s » : %m"
+
+#: ../../common/file_utils.c:200 pg_receivewal.c:532
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "n'a pas pu lire le répertoire « %s » : %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:447
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#: pg_recvlogical.c:196
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m"
+
+#: ../../common/file_utils.c:383 pg_basebackup.c:2256 walmethods.c:459
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valeur « %s » invalide pour l'option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s doit être compris entre %d et %d"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1636
+#, c-format
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "n'a pas pu écrire dans le fichier « %s » : %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339
+#: pg_basebackup.c:1497 pg_basebackup.c:1706
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "n'a pas pu créer le fichier « %s » : %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:635
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier « %s » : %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "état inattendu lors de l'extraction de l'archive"
+
+#: bbstreamer_file.c:298 pg_basebackup.c:686 pg_basebackup.c:730
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "n'a pas pu créer le répertoire « %s » : %m"
+
+#: bbstreamer_file.c:304
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "n'a pas pu configurer les droits du répertoire « %s » : %m"
+
+#: bbstreamer_file.c:323
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "n'a pas pu créer le lien symbolique de « %s » vers « %s » : %m"
+
+#: bbstreamer_file.c:343
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "n'a pas pu initialiser les droits du fichier « %s » : %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "n'a pas pu créer le fichier compressé « %s » : %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "n'a pas pu dupliquer la sortie (stdout) : %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "n'a pas pu ouvrir le fichier de sauvegarde : %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "n'a pas pu configurer le niveau de compression %d : %s"
+
+#: bbstreamer_gzip.c:116 bbstreamer_gzip.c:249
+#, c-format
+msgid "this build does not support gzip compression"
+msgstr "cette construction ne supporte pas la compression gzip"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "n'a pas pu écrire dans le fichier compressé « %s » : %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier compressé « %s » : %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:869
+#, c-format
+msgid "could not initialize compression library"
+msgstr "n'a pas pu initialiser la bibliothèque de compression"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:316
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "n'a pas pu décompresser les données : %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "état inattendu lors de l'injection des paramètres de restauration"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "n'a pas pu créer le contexte de compression lz4 : %s"
+
+#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298
+#, c-format
+msgid "this build does not support lz4 compression"
+msgstr "cette construction ne supporte pas la compression lz4"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "n'a pas pu écrire l'entête lz4 : %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:168 bbstreamer_zstd.c:210
+#, c-format
+msgid "could not compress data: %s"
+msgstr "n'a pas pu compresser les données : %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "n'a pas pu terminer la compression lz4 : %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "n'a pas pu initialiser la bibliothèque de compression : %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "la fin du fichier tar fait plus de 2 blocs"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "état inattendu lors de l'analyse de l'archive tar"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "le membre de tar a un nom vide"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "le flux COPY s'est terminé avant que le dernier fichier soit terminé"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "n'a pas pu créer le contexte de compression zstd"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "n'a pas pu configurer le niveau de compression zstd à %d : %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "n'a pas pu configurer le nombre de workers de compression à %d : %s"
+
+#: bbstreamer_zstd.c:116 bbstreamer_zstd.c:271
+#, c-format
+msgid "this build does not support zstd compression"
+msgstr "cette construction ne supporte pas la compression zstd"
+
+#: bbstreamer_zstd.c:262
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "n'a pas pu créer le contexte de décompression zstd"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "suppression du répertoire des données « %s »"
+
+#: pg_basebackup.c:242
+#, c-format
+msgid "failed to remove data directory"
+msgstr "échec de la suppression du répertoire des données"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "suppression du contenu du répertoire des données « %s »"
+
+#: pg_basebackup.c:248
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "échec de la suppression du contenu du répertoire des données"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "suppression du répertoire des journaux de transactions « %s »"
+
+#: pg_basebackup.c:255
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "échec de la suppression du répertoire des journaux de transactions"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "suppression du contenu du répertoire des journaux de transactions « %s »"
+
+#: pg_basebackup.c:261
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "échec de la suppression du contenu du répertoire des journaux de transactions"
+
+#: pg_basebackup.c:267
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "répertoire des données « %s » non supprimé à la demande de l'utilisateur"
+
+#: pg_basebackup.c:270
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "répertoire des journaux de transactions « %s » non supprimé à la demande de l'utilisateur"
+
+#: pg_basebackup.c:274
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "les modifications des répertoires des tablespaces ne seront pas annulées"
+
+#: pg_basebackup.c:326
+#, c-format
+msgid "directory name too long"
+msgstr "nom du répertoire trop long"
+
+#: pg_basebackup.c:333
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "multiple signes « = » dans la correspondance de tablespace"
+
+#: pg_basebackup.c:342
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "format de correspondance de tablespace « %s » invalide, doit être « ANCIENREPERTOIRE=NOUVEAUREPERTOIRE »"
+
+#: pg_basebackup.c:351
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "l'ancien répertoire n'est pas un chemin absolu dans la correspondance de tablespace : %s"
+
+#: pg_basebackup.c:355
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "le nouveau répertoire n'est pas un chemin absolu dans la correspondance de tablespace : %s"
+
+#: pg_basebackup.c:377
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s prend une sauvegarde binaire d'un serveur PostgreSQL en cours\n"
+"d'exécution.\n"
+"\n"
+
+#: pg_basebackup.c:379 pg_receivewal.c:81 pg_recvlogical.c:78
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_basebackup.c:380 pg_receivewal.c:82 pg_recvlogical.c:79
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_basebackup.c:381
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Options contrôlant la sortie :\n"
+
+#: pg_basebackup.c:382
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=RÉPERTOIRE reçoit la sauvegarde de base dans ce répertoire\n"
+
+#: pg_basebackup.c:383
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t format en sortie (plain (par défaut), tar)\n"
+
+#: pg_basebackup.c:384
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=TAUX taux maximum de transfert du répertoire de\n"
+" données (en Ko/s, ou utiliser le suffixe « k »\n"
+" ou « M »)\n"
+
+#: pg_basebackup.c:386
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr " -R, --write-recovery-conf écrit la configuration pour la réplication\n"
+
+#: pg_basebackup.c:388
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr " -t, --target=CIBLE[:DETAIL] cible de sauvegarde (si autre que client)\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=ANCIENREP=NOUVEAUREP\n"
+" déplace le répertoire ANCIENREP en NOUVEAUREP\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr ""
+" --waldir=RÉP_WAL emplacement du répertoire des journaux de\n"
+" transactions\n"
+
+#: pg_basebackup.c:393
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" inclut les journaux de transactions requis avec\n"
+" la méthode spécifiée\n"
+
+#: pg_basebackup.c:395
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip compresse la sortie tar\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METHODE[:DETAIL]\n"
+" compresse sur le client ou le serveur comme indiqué\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none ne compresse pas la sortie tar\n"
+
+#: pg_basebackup.c:399
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Options générales :\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr " -c, --checkpoint=fast|spread exécute un CHECKPOINT rapide ou réparti\n"
+
+#: pg_basebackup.c:402
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " --create-slot crée un slot de réplication\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL configure le label de sauvegarde\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean ne nettoie pas en cas d'erreur\n"
+
+#: pg_basebackup.c:405
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync n'attend pas que les modifications soient\n"
+" proprement écrites sur disque\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress affiche la progression de la sauvegarde\n"
+
+#: pg_basebackup.c:407 pg_receivewal.c:91
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=NOMREP slot de réplication à utiliser\n"
+
+#: pg_basebackup.c:408 pg_receivewal.c:93 pg_recvlogical.c:100
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose affiche des messages verbeux\n"
+
+#: pg_basebackup.c:409 pg_receivewal.c:94 pg_recvlogical.c:101
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" utilise cet algorithme pour les sommes de\n"
+" contrôle du manifeste\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode encode tous les noms de fichier dans le\n"
+" manifeste en hexadécimal\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr ""
+" --no-estimate-size ne réalise pas d'estimation sur la taille de la\n"
+" sauvegarde côté serveur\n"
+
+#: pg_basebackup.c:415
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr ""
+" --no-manifest supprime la génération de manifeste de\n"
+" sauvegarde\n"
+
+#: pg_basebackup.c:416
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr ""
+" --no-slot empêche la création de slots de réplication\n"
+" temporaires\n"
+
+#: pg_basebackup.c:417
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr " --no-verify-checksums ne vérifie pas les sommes de contrôle\n"
+
+#: pg_basebackup.c:419 pg_receivewal.c:97 pg_recvlogical.c:102
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_basebackup.c:420 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Options de connexion :\n"
+
+#: pg_basebackup.c:421 pg_receivewal.c:99
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CHAÎNE_CONNEX chaîne de connexion\n"
+
+#: pg_basebackup.c:422 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HÔTE hôte du serveur de bases de données ou\n"
+" répertoire des sockets\n"
+
+#: pg_basebackup.c:423 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT numéro de port du serveur de bases de données\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVAL durée entre l'envoi de paquets de statut au\n"
+" serveur (en secondes)\n"
+
+#: pg_basebackup.c:426 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=UTILISATEUR se connecte avec cet utilisateur\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:103 pg_recvlogical.c:108
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ne demande jamais le mot de passe\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:104 pg_recvlogical.c:109
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password force la demande du mot de passe (devrait\n"
+" survenir automatiquement)\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:108 pg_recvlogical.c:110
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:109 pg_recvlogical.c:111
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_basebackup.c:472
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "n'a pas pu lire à partir du tube : %m"
+
+#: pg_basebackup.c:475 pg_basebackup.c:622 pg_basebackup.c:2170
+#: streamutil.c:444
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "n'a pas pu analyser l'emplacement du journal des transactions « %s »"
+
+#: pg_basebackup.c:581 pg_receivewal.c:663
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "n'a pas pu finir l'écriture dans les fichiers de transactions : %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "n'a pas pu créer un tube pour le processus en tâche de fond : %m"
+
+#: pg_basebackup.c:664
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "a créé le slot de réplication temporaire « %s »"
+
+#: pg_basebackup.c:667
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "a créé le slot de réplication « %s »"
+
+#: pg_basebackup.c:701
+#, c-format
+msgid "could not create background process: %m"
+msgstr "n'a pas pu créer un processus en tâche de fond : %m"
+
+#: pg_basebackup.c:710
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "n'a pas pu créer un thread en tâche de fond : %m"
+
+#: pg_basebackup.c:749
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "le répertoire « %s » existe mais n'est pas vide"
+
+#: pg_basebackup.c:755
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "n'a pas pu accéder au répertoire « %s » : %m"
+
+#: pg_basebackup.c:832
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s Ko (100%%), %d/%d tablespace %*s"
+msgstr[1] "%*s/%s Ko (100%%), %d/%d tablespaces %*s"
+
+#: pg_basebackup.c:844
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s Ko (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgstr[1] "%*s/%s Ko (%d%%), %d/%d tablespaces (%s%-*.*s)"
+
+#: pg_basebackup.c:860
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s Ko (%d%%), %d/%d tablespace"
+msgstr[1] "%*s/%s Ko (%d%%), %d/%d tablespaces"
+
+#: pg_basebackup.c:884
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "le taux de transfert « %s » ne correspond pas à une valeur valide"
+
+#: pg_basebackup.c:886
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "taux de transfert invalide (« %s ») : %m"
+
+#: pg_basebackup.c:893
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "le taux de transfert doit être supérieur à zéro"
+
+#: pg_basebackup.c:923
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "unité invalide pour --max-rate : « %s »"
+
+#: pg_basebackup.c:927
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "le taux de transfert « %s » dépasse l'échelle des entiers"
+
+#: pg_basebackup.c:934
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "le taux de transfert « %s » est en dehors des limites"
+
+#: pg_basebackup.c:1030
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "n'a pas pu obtenir le flux de données de COPY : %s"
+
+#: pg_basebackup.c:1047 pg_recvlogical.c:438 pg_recvlogical.c:610
+#: receivelog.c:981
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "n'a pas pu lire les données du COPY : %s"
+
+#: pg_basebackup.c:1051
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "un processus worker s'est arrêté de façon inattendue"
+
+#: pg_basebackup.c:1122
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "ne peut pas injecter le manifeste dans un fichier tar compressé"
+
+#: pg_basebackup.c:1123
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "Utilisez la compression côté client, envoyez la sortie dans un répertoire plutôt que sur la sortie standard, ou utilisez %s."
+
+#: pg_basebackup.c:1139
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "n'a pas pu analyser l'archive « %s »"
+
+#: pg_basebackup.c:1140
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "Seules les archives tar peuvent être analysées"
+
+#: pg_basebackup.c:1142
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "Le format plain requiert que pg_basebackup analyse l'archive."
+
+#: pg_basebackup.c:1144
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "Utiliser - comme répertoire de sortie requiert que pg_basebackup analyse l'archive."
+
+#: pg_basebackup.c:1146
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "L'option -R requiert que pg_basebackup analyse l'archive."
+
+#: pg_basebackup.c:1357
+#, c-format
+msgid "archives must precede manifest"
+msgstr "les archives doivent précéder le manifeste"
+
+#: pg_basebackup.c:1372
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "nom d'archive invalide : « %s »"
+
+#: pg_basebackup.c:1444
+#, c-format
+msgid "unexpected payload data"
+msgstr "donnée de charge inattendue"
+
+#: pg_basebackup.c:1587
+#, c-format
+msgid "empty COPY message"
+msgstr "message COPY vide"
+
+#: pg_basebackup.c:1589
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "message COPY malformé de type %d, longueur %zu"
+
+#: pg_basebackup.c:1787
+#, c-format
+msgid "incompatible server version %s"
+msgstr "version « %s » du serveur incompatible"
+
+#: pg_basebackup.c:1803
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "Utilisez -X none ou -X fetch pour désactiver la réplication en flux."
+
+#: pg_basebackup.c:1871
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "les cibles de sauvegarde ne sont pas supportées par cette version du serveur"
+
+#: pg_basebackup.c:1874
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "la configuration de la restauration ne peut pas être écrite quand une cible de restauration est utilisée"
+
+#: pg_basebackup.c:1901
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "le serveur ne supporte pas la compression côté serveur"
+
+#: pg_basebackup.c:1911
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "début de la sauvegarde de base, en attente de la fin du checkpoint"
+
+#: pg_basebackup.c:1915
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "en attente du checkpoint"
+
+#: pg_basebackup.c:1928 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588
+#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504
+#: streamutil.c:656 streamutil.c:701
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "n'a pas pu envoyer la commande de réplication « %s » : %s"
+
+#: pg_basebackup.c:1936
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "n'a pas pu initier la sauvegarde de base : %s"
+
+#: pg_basebackup.c:1939
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "le serveur a renvoyé une réponse inattendue à la commande BASE_BACKUP ; a récupéré %d lignes et %d champs, alors qu'il attendait %d lignes et %d champs"
+
+#: pg_basebackup.c:1945
+#, c-format
+msgid "checkpoint completed"
+msgstr "checkpoint terminé"
+
+#: pg_basebackup.c:1960
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "point de départ du journal de transactions : %s sur la timeline %u"
+
+#: pg_basebackup.c:1968
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "n'a pas pu obtenir l'en-tête du serveur : %s"
+
+#: pg_basebackup.c:1971
+#, c-format
+msgid "no data returned from server"
+msgstr "aucune donnée renvoyée du serveur"
+
+#: pg_basebackup.c:2006
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "peut seulement écrire un tablespace sur la sortie standard, la base en a %d"
+
+#: pg_basebackup.c:2019
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "lance le récepteur de journaux de transactions en tâche de fond"
+
+#: pg_basebackup.c:2101
+#, c-format
+msgid "backup failed: %s"
+msgstr "échec de la sauvegarde : %s"
+
+#: pg_basebackup.c:2104
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "aucune position de fin du journal de transactions renvoyée par le serveur"
+
+#: pg_basebackup.c:2107
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "point final du journal de transactions : %s"
+
+#: pg_basebackup.c:2118
+#, c-format
+msgid "checksum error occurred"
+msgstr "erreur de somme de contrôle"
+
+#: pg_basebackup.c:2123
+#, c-format
+msgid "final receive failed: %s"
+msgstr "échec lors de la réception finale : %s"
+
+#: pg_basebackup.c:2147
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "en attente que le processus en tâche de fond termine le flux..."
+
+#: pg_basebackup.c:2151
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "n'a pas pu envoyer la commande au tube du processus : %m"
+
+#: pg_basebackup.c:2156
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "n'a pas pu attendre le processus fils : %m"
+
+#: pg_basebackup.c:2158
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "le fils %d est mort, %d attendu"
+
+#: pg_basebackup.c:2160 streamutil.c:91 streamutil.c:197
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2180
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "n'a pas pu attendre le thread : %m"
+
+#: pg_basebackup.c:2185
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "n'a pas pu obtenir le code de sortie du thread : %m"
+
+#: pg_basebackup.c:2188
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "le thread a quitté avec le code d'erreur %u"
+
+#: pg_basebackup.c:2217
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "synchronisation des données sur disque..."
+
+#: pg_basebackup.c:2242
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "renommage de backup_manifest.tmp en backup_manifest"
+
+#: pg_basebackup.c:2262
+#, c-format
+msgid "base backup completed"
+msgstr "sauvegarde de base terminée"
+
+#: pg_basebackup.c:2351
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "format de sortie « %s » invalide, doit être soit « plain » soit « tar »"
+
+#: pg_basebackup.c:2395
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "option wal-method « %s » invalide, doit être soit « fetch » soit « stream » soit « none »"
+
+#: pg_basebackup.c:2425
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "argument « %s » invalide pour le CHECKPOINT, doit être soit « fast » soit « spread »"
+
+#: pg_basebackup.c:2476 pg_basebackup.c:2488 pg_basebackup.c:2510
+#: pg_basebackup.c:2522 pg_basebackup.c:2528 pg_basebackup.c:2580
+#: pg_basebackup.c:2591 pg_basebackup.c:2601 pg_basebackup.c:2607
+#: pg_basebackup.c:2614 pg_basebackup.c:2626 pg_basebackup.c:2638
+#: pg_basebackup.c:2646 pg_basebackup.c:2659 pg_basebackup.c:2665
+#: pg_basebackup.c:2674 pg_basebackup.c:2686 pg_basebackup.c:2697
+#: pg_basebackup.c:2705 pg_receivewal.c:814 pg_receivewal.c:826
+#: pg_receivewal.c:833 pg_receivewal.c:842 pg_receivewal.c:849
+#: pg_receivewal.c:859 pg_recvlogical.c:837 pg_recvlogical.c:849
+#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873
+#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894
+#: pg_recvlogical.c:901 pg_recvlogical.c:908
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_basebackup.c:2486 pg_receivewal.c:824 pg_recvlogical.c:847
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_basebackup.c:2509
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "ne peut pas spécifier à la fois le format et la cible de sauvegarde"
+
+#: pg_basebackup.c:2521
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "doit spécifier un répertoire de sortie ou une cible de sauvegarde"
+
+#: pg_basebackup.c:2527
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "ne peut pas spécifier à la fois le répertoire en sortie et la cible de sauvegarde"
+
+#: pg_basebackup.c:2557 pg_receivewal.c:868
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "algorithme de compression inconnu : « %s »"
+
+#: pg_basebackup.c:2563 pg_receivewal.c:875
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "spécification de compression invalide : %s"
+
+#: pg_basebackup.c:2579
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "la compression client n'est pas possible quand une cible de restauration est indiquée."
+
+#: pg_basebackup.c:2590
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "seules les sauvegardes en mode tar peuvent être compressées"
+
+#: pg_basebackup.c:2600
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "Les journaux de transactions ne peuvent pas être envoyés en flux quand une cible de sauvegarde est indiquée."
+
+#: pg_basebackup.c:2606
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "ne peut pas envoyer les journaux de transactions vers stdout en mode tar"
+
+#: pg_basebackup.c:2613
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "les slots de réplications peuvent seulement être utilisés avec la réplication en flux des WAL"
+
+#: pg_basebackup.c:2625
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot ne peut pas être utilisé avec un nom de slot"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2636 pg_receivewal.c:840
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s a besoin du slot avec l'option --slot"
+
+#: pg_basebackup.c:2644 pg_basebackup.c:2684 pg_basebackup.c:2695
+#: pg_basebackup.c:2703
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s et %s sont des options incompatibles"
+
+#: pg_basebackup.c:2658
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "l'emplacement du répertoire des journaux de transactions ne peut pas être indiqué avec une cible de sauvegarde"
+
+#: pg_basebackup.c:2664
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "l'emplacement du répertoire des journaux de transactions doit être indiqué uniquement dans le mode plain"
+
+#: pg_basebackup.c:2673
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "l'emplacement du répertoire des journaux de transactions doit être indiqué avec un chemin absolu"
+
+#: pg_basebackup.c:2774
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "n'a pas pu créer le lien symbolique « %s » : %m"
+
+#: pg_basebackup.c:2776
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "les liens symboliques ne sont pas supportés sur cette plateforme"
+
+#: pg_receivewal.c:79
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s reçoit le flux des journaux de transactions PostgreSQL.\n"
+"\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:84
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options :\n"
+
+#: pg_receivewal.c:84
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr ""
+" -D, --directory=RÉPERTOIRE reçoit les journaux de transactions dans ce\n"
+" répertoire\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:85
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN quitte après avoir reçu le LSN spécifié\n"
+
+#: pg_receivewal.c:86 pg_recvlogical.c:89
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr ""
+" --if-not-exists ne pas renvoyer une erreur si le slot existe\n"
+" déjà lors de sa création\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:91
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop ne boucle pas en cas de perte de la connexion\n"
+
+#: pg_receivewal.c:88
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" --no-sync n'attend pas que les modifications soient\n"
+" proprement écrites sur disque\n"
+
+#: pg_receivewal.c:89 pg_recvlogical.c:96
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SECS durée entre l'envoi de paquets de statut au\n"
+" (par défaut %d)\n"
+
+#: pg_receivewal.c:92
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr ""
+" --synchronous vide le journal de transactions immédiatement\n"
+" après son écriture\n"
+
+#: pg_receivewal.c:95
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compresse comme indiqué\n"
+
+#: pg_receivewal.c:105
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Actions optionnelles :\n"
+
+#: pg_receivewal.c:106 pg_recvlogical.c:81
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr ""
+" --create-slot crée un nouveau slot de réplication\n"
+" (pour le nom du slot, voir --slot)\n"
+
+#: pg_receivewal.c:107 pg_recvlogical.c:82
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr ""
+" --drop-slot supprime un nouveau slot de réplication\n"
+" (pour le nom du slot, voir --slot)\n"
+
+#: pg_receivewal.c:252
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "segment terminé à %X/%X (timeline %u)"
+
+#: pg_receivewal.c:259
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "arrêt du flux streaming à %X/%X (timeline %u)"
+
+#: pg_receivewal.c:275
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "a basculé sur la timeline %u à %X/%X"
+
+#: pg_receivewal.c:285
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "a reçu un signal d'interruption, quitte"
+
+#: pg_receivewal.c:317
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "n'a pas pu fermer le répertoire « %s » : %m"
+
+#: pg_receivewal.c:384
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "le segment « %s » a une taille incorrecte (%lld), ignoré"
+
+#: pg_receivewal.c:401
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier compressé « %s » : %m"
+
+#: pg_receivewal.c:404
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "n'a pas pu chercher dans le fichier compressé « %s » : %m"
+
+#: pg_receivewal.c:410
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "n'a pas pu lire le fichier compressé « %s » : %m"
+
+#: pg_receivewal.c:413
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "n'a pas pu lire le fichier compressé « %s » : a lu %d sur %zu"
+
+#: pg_receivewal.c:423
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "le segment compressé « %s » a une taille %d non compressé incorrecte, ignoré"
+
+#: pg_receivewal.c:451
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "n'a pas pu créer le contexte de décompression LZ4 : %s"
+
+#: pg_receivewal.c:463
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "n'a pas pu lire le fichier « %s » : %m"
+
+#: pg_receivewal.c:481
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "n'a pas pu décompresser le fichier « %s » : %s"
+
+#: pg_receivewal.c:504
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "n'a pas pu libérer le contexte de décompression LZ4 : %s"
+
+#: pg_receivewal.c:509
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "le fichier segment compressé « %s » a une taille %zu décompressée incorrecte, ignoré"
+
+#: pg_receivewal.c:514
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "ne peut pas vérifier le fichier « %s » : la compression avec %s n'a pas été intégrée lors de la compilation"
+
+#: pg_receivewal.c:641
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "commence le flux des journaux à %X/%X (timeline %u)"
+
+#: pg_receivewal.c:783 pg_recvlogical.c:785
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "n'a pas pu analyser la position finale « %s »"
+
+#: pg_receivewal.c:832
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "ne peut pas utiliser --create-slot avec --drop-slot"
+
+#: pg_receivewal.c:848
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "ne peut pas utiliser --synchronous avec --no-sync"
+
+#: pg_receivewal.c:858
+#, c-format
+msgid "no target directory specified"
+msgstr "aucun répertoire cible indiqué"
+
+#: pg_receivewal.c:882
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "la méthode de compression %s n'est pas encore supportée"
+
+#: pg_receivewal.c:924
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "la connexion de réplication utilisant le slot « %s » est spécifique à une base, ce qui est inattendu"
+
+#: pg_receivewal.c:943 pg_recvlogical.c:955
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "suppression du slot de réplication « %s »"
+
+#: pg_receivewal.c:954 pg_recvlogical.c:965
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "création du slot de réplication « %s »"
+
+#: pg_receivewal.c:983 pg_recvlogical.c:989
+#, c-format
+msgid "disconnected"
+msgstr "déconnecté"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:987 pg_recvlogical.c:993
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "déconnecté, attente de %d secondes avant une nouvelle tentative"
+
+#: pg_recvlogical.c:76
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s contrôle le flux des modifications logiques de PostgreSQL.\n"
+"\n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Action à réaliser :\n"
+
+#: pg_recvlogical.c:83
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr ""
+" --start lance le flux dans un slot de réplication (pour\n"
+" le nom du slot, voir --slot)\n"
+
+#: pg_recvlogical.c:86
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr ""
+" -f, --file=FICHIER trace la réception dans ce fichier, - pour\n"
+" stdout\n"
+
+#: pg_recvlogical.c:87
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SECS durée entre les fsyncs vers le fichier de sortie\n"
+" (par défaut %d)\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr ""
+" -I, --startpos=LSN position de début du streaming dans le slot\n"
+" existant\n"
+
+#: pg_recvlogical.c:92
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NOM[=VALEUR] passe l'option NOM avec la valeur optionnelle\n"
+" VALEUR au plugin en sortie\n"
+
+#: pg_recvlogical.c:95
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr ""
+" -P, --plugin=PLUGIN utilise le plugin PLUGIN en sortie (par défaut\n"
+" %s)\n"
+
+#: pg_recvlogical.c:98
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOT nom du slot de réplication logique\n"
+
+#: pg_recvlogical.c:99
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr " -t, --two-phase active le décodage des transactions préparées lors de la création d'un slot\n"
+
+#: pg_recvlogical.c:104
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=BASE base de données de connexion\n"
+
+#: pg_recvlogical.c:137
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "confirmation d'écriture jusqu'à %X/%X et de synchronisation jusqu'à %X/%X (slot %s)"
+
+#: pg_recvlogical.c:161 receivelog.c:366
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "n'a pas pu envoyer le paquet d'informations en retour : %s"
+
+#: pg_recvlogical.c:229
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "commence le flux des journaux à %X/%X (slot %s)"
+
+#: pg_recvlogical.c:271
+#, c-format
+msgid "streaming initiated"
+msgstr "flux lancé"
+
+#: pg_recvlogical.c:335
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m"
+
+#: pg_recvlogical.c:364 receivelog.c:889
+#, c-format
+msgid "invalid socket: %s"
+msgstr "socket invalide : %s"
+
+#: pg_recvlogical.c:417 receivelog.c:917
+#, c-format
+msgid "%s() failed: %m"
+msgstr "échec de %s() : %m"
+
+#: pg_recvlogical.c:424 receivelog.c:967
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "n'a pas pu recevoir des données du flux de WAL : %s"
+
+#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011
+#: receivelog.c:1074
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "en-tête de flux trop petit : %d"
+
+#: pg_recvlogical.c:501 receivelog.c:849
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "entête non reconnu du flux : « %c »"
+
+#: pg_recvlogical.c:555 pg_recvlogical.c:567
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "n'a pas pu écrire %d octets dans le journal de transactions « %s » : %m"
+
+#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "fin inattendue du flux de réplication : %s"
+
+#: pg_recvlogical.c:780
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "n'a pas pu analyser la position de départ « %s »"
+
+#: pg_recvlogical.c:858
+#, c-format
+msgid "no slot specified"
+msgstr "aucun slot de réplication indiqué"
+
+#: pg_recvlogical.c:865
+#, c-format
+msgid "no target file specified"
+msgstr "aucun fichier cible indiqué"
+
+#: pg_recvlogical.c:872
+#, c-format
+msgid "no database specified"
+msgstr "aucune base de données indiquée"
+
+#: pg_recvlogical.c:879
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "au moins une action doit être indiquée"
+
+#: pg_recvlogical.c:886
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "ne peut pas utiliser --create-slot ou --start avec --drop-slot"
+
+#: pg_recvlogical.c:893
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "ne peut pas utiliser --create-slot ou --drop-slot avec --startpos"
+
+#: pg_recvlogical.c:900
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos peut seulement être spécifié avec --start"
+
+#: pg_recvlogical.c:907
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase peut seulement être spécifié avec --create-slot"
+
+#: pg_recvlogical.c:939
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "n'a pas pu établir une connexion de réplication spécifique à la base"
+
+#: pg_recvlogical.c:1033
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "position finale %X/%X atteinte par keepalive"
+
+#: pg_recvlogical.c:1036
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "position finale %X/%X atteinte à l'enregistrement WAL %X/%X"
+
+#: receivelog.c:68
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "n'a pas pu créer le fichier de statut d'archivage « %s » : %s"
+
+#: receivelog.c:75
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "n'a pas pu fermer le fichier de statut d'archivage « %s » : %s"
+
+#: receivelog.c:123
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "n'a pas pu obtenir la taille du journal de transactions « %s » : %s"
+
+#: receivelog.c:134
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "n'a pas pu ouvrir le journal des transactions « %s » existant : %s"
+
+#: receivelog.c:143
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "n'a pas pu synchroniser sur disque le journal de transactions « %s » existant : %s"
+
+#: receivelog.c:158
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "le journal de transactions « %s » comprend %zd octet, cela devrait être 0 ou %d"
+msgstr[1] "le journal de transactions « %s » comprend %zd octets, cela devrait être 0 ou %d"
+
+#: receivelog.c:174
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "n'a pas pu ouvrir le journal de transactions « %s » : %s"
+
+#: receivelog.c:208
+#, c-format
+msgid "could not determine seek position in file \"%s\": %s"
+msgstr "n'a pas pu déterminer la position de recherche dans le fichier d'archive « %s » : %s"
+
+#: receivelog.c:223
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "pas de renommage de « %s », le segment n'est pas complet"
+
+#: receivelog.c:234 receivelog.c:323 receivelog.c:694
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "n'a pas pu fermer le fichier « %s » : %s"
+
+#: receivelog.c:295
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "le serveur a renvoyé un nom de fichier historique inattendu pour la timeline %u : %s"
+
+#: receivelog.c:303
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "n'a pas pu créer le fichier historique de la timeline « %s » : %s"
+
+#: receivelog.c:310
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "n'a pas pu écrire dans le fichier historique de la timeline « %s » : %s"
+
+#: receivelog.c:400
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "version %s du serveur incompatible ; le client ne supporte pas le streaming de versions plus anciennes que %s"
+
+#: receivelog.c:409
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "version %s du serveur incompatible ; le client ne supporte pas le streaming de versions plus récentes que %s"
+
+#: receivelog.c:514
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "l'identifiant système ne correspond pas entre la sauvegarde des fichiers et la connexion de réplication"
+
+#: receivelog.c:522
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "la timeline %u de départ n'est pas dans le serveur"
+
+#: receivelog.c:561
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "réponse inattendue à la commande TIMELINE_HISTORY : a récupéré %d lignes et %d champs, alors qu'il attendait %d lignes et %d champs"
+
+#: receivelog.c:632
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "le serveur a renvoyé une timeline suivante %u inattendue, après la timeline %u"
+
+#: receivelog.c:638
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "le serveur a arrêté l'envoi de la timeline %u à %X/%X, mais a indiqué que la timeline suivante, %u, commence à %X/%X"
+
+#: receivelog.c:678
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "le flux de réplication a été abandonné avant d'arriver au point d'arrêt"
+
+#: receivelog.c:724
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "ensemble de résultats inattendu après la fin de la timeline : a récupéré %d lignes et %d champs, alors qu'il attendait %d lignes et %d champs"
+
+#: receivelog.c:733
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "n'a pas pu analyser la position de départ de la prochaine timeline « %s »"
+
+#: receivelog.c:781 receivelog.c:1030 walmethods.c:1205
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %s"
+
+#: receivelog.c:1091
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "a reçu l'enregistrement du journal de transactions pour le décalage %u sans fichier ouvert"
+
+#: receivelog.c:1101
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "a obtenu le décalage %08x pour les données du journal, attendait %08x"
+
+#: receivelog.c:1135
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "n'a pas pu écrire %d octets dans le journal de transactions « %s » : %s"
+
+#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "n'a pas pu envoyer le paquet de fin de copie : %s"
+
+#: streamutil.c:159
+msgid "Password: "
+msgstr "Mot de passe : "
+
+#: streamutil.c:182
+#, c-format
+msgid "could not connect to server"
+msgstr "n'a pas pu se connecter au serveur"
+
+#: streamutil.c:225
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "n'a pas pu effacer search_path : %s"
+
+#: streamutil.c:241
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "n'a pas pu déterminer la configuration serveur de integer_datetimes"
+
+#: streamutil.c:248
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "l'option de compilation integer_datetimes ne correspond pas au serveur"
+
+#: streamutil.c:299
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "n'a pas pu récupéré la taille d'un segment WAL : a obtenu %d lignes et %d champs, attendait %d lignes et %d champs (ou plus)"
+
+#: streamutil.c:309
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "la taille du segment WAL n'a pas pu être analysée"
+
+#: streamutil.c:327
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "la taille d'un WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go mais le serveur distant a rapporté une valeur de %d octet"
+msgstr[1] "la taille d'un WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go mais le serveur distant a rapporté une valeur de %d octets"
+
+#: streamutil.c:372
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "n'a pas pu récupérer les options d'accès du groupe : a obtenu %d lignes et %d champs, attendait %d lignes et %d champs (ou plus)"
+
+#: streamutil.c:381
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "l'option d'accès du groupe n'a pas pu être analysé : %s"
+
+#: streamutil.c:424 streamutil.c:461
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "n'a pas pu identifier le système : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs (ou plus)."
+
+#: streamutil.c:513
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "n'a pas pu lire le slot de réplication « %s » : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs"
+
+#: streamutil.c:525
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "le slot de réplication « %s » n'existe pas"
+
+#: streamutil.c:536
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "attendait un slot de réplication physique, a obtenu le type « %s » à la place"
+
+#: streamutil.c:550
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "n'a pas pu analyser le champ restart_lsn « %s » pour le slot de réplication « %s »"
+
+#: streamutil.c:667
+#, c-format
+msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "n'a pas pu créer le slot de réplication « %s » : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs"
+
+#: streamutil.c:711
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "n'a pas pu supprimer le slot de réplication « %s » : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs"
+
+#: walmethods.c:720 walmethods.c:1267
+msgid "could not compress data"
+msgstr "n'a pas pu compresser les données"
+
+#: walmethods.c:749
+msgid "could not reset compression stream"
+msgstr "n'a pas pu réinitialiser le flux de compression"
+
+#: walmethods.c:880
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "erreur d'implémentation : les fichiers tar ne peuvent pas avoir plus d'un fichier ouvert"
+
+#: walmethods.c:894
+msgid "could not create tar header"
+msgstr "n'a pas pu créer l'en-tête du fichier tar"
+
+#: walmethods.c:910 walmethods.c:951 walmethods.c:1170 walmethods.c:1183
+msgid "could not change compression parameters"
+msgstr "n'a pas pu modifier les paramètres de compression"
+
+#: walmethods.c:1055
+msgid "unlink not supported with compression"
+msgstr "suppression non supportée avec la compression"
+
+#: walmethods.c:1291
+msgid "could not close compression stream"
+msgstr "n'a pas pu fermer le flux de compression"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#, c-format
+#~ msgid ""
+#~ " --compression-method=METHOD\n"
+#~ " method to compress logs\n"
+#~ msgstr ""
+#~ " --compression-method=METHODE\n"
+#~ " méthode pour compresser les journaux\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide et quitte\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version affiche la version et quitte\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version affiche la version puis quitte\n"
+
+#, c-format
+#~ msgid " -Z, --compress=0-9 compress tar output with given compression level\n"
+#~ msgstr ""
+#~ " -Z, --compress=0-9 compresse la sortie tar avec le niveau de\n"
+#~ " compression indiqué\n"
+
+#, c-format
+#~ msgid " -Z, --compress=1-9 compress logs with given compression level\n"
+#~ msgstr ""
+#~ " -Z, --compress=0-9 compresse les journaux avec le niveau de\n"
+#~ " compression indiqué\n"
+
+#~ msgid " -x, --xlog include required WAL files in backup (fetch mode)\n"
+#~ msgstr ""
+#~ " -x, --xlog inclut les journaux de transactions nécessaires\n"
+#~ " dans la sauvegarde (mode fetch)\n"
+
+#~ msgid "%s: WAL directory \"%s\" not removed at user's request\n"
+#~ msgstr "%s : répertoire des journaux de transactions « %s » non supprimé à la demande de l'utilisateur\n"
+
+#~ msgid "%s: WAL directory location must be an absolute path\n"
+#~ msgstr ""
+#~ "%s : l'emplacement du répertoire des journaux de transactions doit être\n"
+#~ "indiqué avec un chemin absolu\n"
+
+#~ msgid "%s: WAL streaming can only be used in plain mode\n"
+#~ msgstr "%s : le flux de journaux de transactions peut seulement être utilisé en mode plain\n"
+
+#~ msgid "%s: cannot specify both --xlog and --xlog-method\n"
+#~ msgstr "%s : ne peut pas spécifier à la fois --xlog et --xlog-method\n"
+
+#~ msgid "%s: child process did not exit normally\n"
+#~ msgstr "%s : le processus fils n'a pas quitté normalement\n"
+
+#~ msgid "%s: child process exited with error %d\n"
+#~ msgstr "%s : le processus fils a quitté avec le code erreur %d\n"
+
+#~ msgid "%s: could not access directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not clear search_path: %s"
+#~ msgstr "%s : n'a pas pu effacer search_path : %s"
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu fermer le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not close file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu fermer le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not close file %s: %s\n"
+#~ msgstr "%s : n'a pas pu fermer le fichier %s : %s\n"
+
+#~ msgid "%s: could not connect to server\n"
+#~ msgstr "%s : n'a pas pu se connecter au serveur\n"
+
+#~ msgid "%s: could not connect to server: %s"
+#~ msgstr "%s : n'a pas pu se connecter au serveur : %s"
+
+#~ msgid "%s: could not create archive status file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu créer le fichier de statut d'archivage « %s » : %s\n"
+
+#~ msgid "%s: could not create directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu créer le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not create file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu créer le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not create symbolic link \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu créer le lien symbolique « %s » : %s\n"
+
+#~ msgid "%s: could not fsync file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not fsync log file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not get current position in file %s: %s\n"
+#~ msgstr "%s : n'a pas pu obtenir la position courant dans le fichier %s : %s\n"
+
+#~ msgid "%s: could not identify system: %s"
+#~ msgstr "%s : n'a pas pu identifier le système : %s"
+
+#~ msgid "%s: could not identify system: %s\n"
+#~ msgstr "%s : n'a pas pu identifier le système : %s\n"
+
+#~ msgid "%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n"
+#~ msgstr ""
+#~ "%s : n'a pas pu identifier le système, a récupéré %d lignes et %d champs,\n"
+#~ "attendait %d lignes et %d champs (ou plus)\n"
+
+#~ msgid "%s: could not open WAL segment %s: %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le segment WAL %s : %s\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not open log file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s » : %s\n"
+
+#~ msgid "%s: could not open timeline history file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le journal historique de la timeline « %s » : %s\n"
+
+#~ msgid "%s: could not open write-ahead log file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le journal de transactions « %s » : %s\n"
+
+#~ msgid "%s: could not pad WAL segment %s: %s\n"
+#~ msgstr "%s : n'a pas pu terminer le segment WAL %s : %s\n"
+
+#~ msgid "%s: could not pad transaction log file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu remplir de zéros le journal de transactions « %s » : %s\n"
+
+#~ msgid "%s: could not parse file mode\n"
+#~ msgstr "%s : n'a pas pu analyser le mode du fichier\n"
+
+#~ msgid "%s: could not parse file size\n"
+#~ msgstr "%s : n'a pas pu analyser la taille du fichier\n"
+
+#~ msgid "%s: could not parse log start position from value \"%s\"\n"
+#~ msgstr "%s : n'a pas pu analyser la position de départ des WAL à partir de la valeur « %s »\n"
+
+#~ msgid "%s: could not parse transaction log file name \"%s\"\n"
+#~ msgstr "%s : n'a pas pu analyser le nom du journal de transactions « %s »\n"
+
+#~ msgid "%s: could not read copy data: %s\n"
+#~ msgstr "%s : n'a pas pu lire les données du COPY : %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not receive data from WAL stream: %s"
+#~ msgstr "%s : n'a pas pu recevoir des données du flux de WAL : %s"
+
+#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu renommer le fichier « %s » en « %s » : %s\n"
+
+#~ msgid "%s: could not rename file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu renommer le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not seek back to beginning of WAL segment %s: %s\n"
+#~ msgstr "%s : n'a pas pu se déplacer au début du segment WAL %s : %s\n"
+
+#~ msgid "%s: could not seek to beginning of transaction log file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu rechercher le début du journal de transaction « %s » : %s\n"
+
+#~ msgid "%s: could not send base backup command: %s"
+#~ msgstr "%s : n'a pas pu envoyer la commande de sauvegarde de base : %s"
+
+#~ msgid "%s: could not set permissions on directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas configurer les droits sur le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not set permissions on file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu configurer les droits sur le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not stat WAL segment %s: %s\n"
+#~ msgstr "%s : n'a pas pu récupérer les informations sur le segment WAL %s : %s\n"
+
+#~ msgid "%s: could not stat file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not stat transaction log file \"%s\": %s\n"
+#~ msgstr ""
+#~ "%s : n'a pas pu récupérer les informations sur le journal de transactions\n"
+#~ "« %s » : %s\n"
+
+#~ msgid "%s: could not write to file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu écrire dans le fichier « %s » : %s\n"
+
+#~ msgid "%s: data directory \"%s\" not removed at user's request\n"
+#~ msgstr "%s : répertoire des données « %s » non supprimé à la demande de l'utilisateur\n"
+
+#~ msgid "%s: directory \"%s\" exists but is not empty\n"
+#~ msgstr "%s : le répertoire « %s » existe mais n'est pas vide\n"
+
+#~ msgid "%s: failed to remove WAL directory\n"
+#~ msgstr "%s : échec de la suppression du répertoire des journaux de transactions\n"
+
+#~ msgid "%s: failed to remove contents of WAL directory\n"
+#~ msgstr "%s : échec de la suppression du contenu du répertoire des journaux de transactions\n"
+
+#~ msgid "%s: failed to remove contents of data directory\n"
+#~ msgstr "%s : échec de la suppression du contenu du répertoire des données\n"
+
+#~ msgid "%s: failed to remove data directory\n"
+#~ msgstr "%s : échec de la suppression du répertoire des données\n"
+
+#~ msgid "%s: invalid format of xlog location: %s\n"
+#~ msgstr "%s : format invalide de l'emplacement du journal de transactions : %s\n"
+
+#~ msgid "%s: invalid port number \"%s\"\n"
+#~ msgstr "%s : numéro de port invalide : « %s »\n"
+
+#~ msgid "%s: invalid socket: %s"
+#~ msgstr "%s : socket invalide : %s"
+
+#~ msgid "%s: keepalive message has incorrect size %d\n"
+#~ msgstr "%s : le message keepalive a une taille %d incorrecte\n"
+
+#~ msgid "%s: no start point returned from server\n"
+#~ msgstr "%s : aucun point de redémarrage renvoyé du serveur\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s : mémoire épuisée\n"
+
+#~ msgid "%s: removing WAL directory \"%s\"\n"
+#~ msgstr "%s : suppression du répertoire des journaux de transactions « %s »\n"
+
+#~ msgid "%s: removing contents of WAL directory \"%s\"\n"
+#~ msgstr "%s : suppression du contenu du répertoire des journaux de transactions « %s »\n"
+
+#~ msgid "%s: removing contents of data directory \"%s\"\n"
+#~ msgstr "%s : suppression du contenu du répertoire des données « %s »\n"
+
+#~ msgid "%s: removing data directory \"%s\"\n"
+#~ msgstr "%s : suppression du répertoire des données « %s »\n"
+
+#~ msgid "%s: select() failed: %s\n"
+#~ msgstr "%s : échec de select() : %s\n"
+
+#~ msgid "%s: socket not open"
+#~ msgstr "%s : socket non ouvert"
+
+#~ msgid "%s: symlinks are not supported on this platform\n"
+#~ msgstr "%s : les liens symboliques ne sont pas supportés sur cette plateforme\n"
+
+#~ msgid "%s: timeline does not match between base backup and streaming connection\n"
+#~ msgstr ""
+#~ "%s : la timeline ne correspond pas entre la sauvegarde des fichiers et la\n"
+#~ "connexion de réplication\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#~ msgid "--create-slot and --no-slot are incompatible options"
+#~ msgstr "--create-slot et --no-slot sont des options incompatibles"
+
+#~ msgid "--no-manifest and --manifest-checksums are incompatible options"
+#~ msgstr "--no-manifest et --manifest-checksums sont des options incompatibles"
+
+#~ msgid "--no-manifest and --manifest-force-encode are incompatible options"
+#~ msgstr "--no-manifest et --manifest-force-encode sont des options incompatibles"
+
+#~ msgid "--progress and --no-estimate-size are incompatible options"
+#~ msgstr "--progress et --no-estimate-size sont des options incompatibles"
+
+#, c-format
+#~ msgid "This build does not support compression with %s."
+#~ msgstr "Cette construction ne supporte pas la compression avec %s."
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayer « %s --help » pour plus d'informations.\n"
+
+#, c-format
+#~ msgid "cannot use --compress with --compression-method=%s"
+#~ msgstr "ne peut pas utiliser --compress avec --compression-method=%s"
+
+#, c-format
+#~ msgid "could not check file \"%s\""
+#~ msgstr "n'a pas pu vérifier le fichier « %s »"
+
+#~ msgid "could not connect to server: %s"
+#~ msgstr "n'a pas pu se connecter au serveur : %s"
+
+#, c-format
+#~ msgid "could not find replication slot \"%s\""
+#~ msgstr "n'a pas pu trouver le slot de réplication « %s »"
+
+#, c-format
+#~ msgid "could not get write-ahead log end position from server: %s"
+#~ msgstr "n'a pas pu obtenir la position finale des journaux de transactions à partir du serveur : %s"
+
+#~ msgid "deflate failed"
+#~ msgstr "échec en décompression"
+
+#~ msgid "deflateEnd failed"
+#~ msgstr "échec de deflateEnd"
+
+#~ msgid "deflateInit2 failed"
+#~ msgstr "échec de deflateInit2"
+
+#~ msgid "deflateParams failed"
+#~ msgstr "échec de deflateParams"
+
+#~ msgid "deflateReset failed"
+#~ msgstr "échec de deflateReset"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#, c-format
+#~ msgid "invalid compression level \"%s\""
+#~ msgstr "niveau de compression « %s » invalide"
+
+#, c-format
+#~ msgid "invalid fsync interval \"%s\""
+#~ msgstr "intervalle fsync « %s » invalide"
+
+#, c-format
+#~ msgid "invalid port number \"%s\""
+#~ msgstr "numéro de port invalide : « %s »"
+
+#, c-format
+#~ msgid "invalid status interval \"%s\""
+#~ msgstr "intervalle « %s » invalide du statut"
+
+#, c-format
+#~ msgid "invalid tar block header size: %zu"
+#~ msgstr "taille invalide de l'en-tête de bloc du fichier tar : %zu"
+
+#, c-format
+#~ msgid "log streamer with pid %d exiting"
+#~ msgstr "le processus d'envoi des journaux de PID %d quitte"
+
+#, c-format
+#~ msgid "no value specified for --compress, switching to default"
+#~ msgstr "aucune valeur indiquée pour --compression, utilise la valeur par défaut"
+
+#~ msgid "select() failed: %m"
+#~ msgstr "échec de select() : %m"
+
+#, c-format
+#~ msgid "unknown compression option \"%s\""
+#~ msgstr "option de compression « %s » inconnue"
+
+#, c-format
+#~ msgid "unrecognized link indicator \"%c\""
+#~ msgstr "indicateur de lien « %c » non reconnu"
diff --git a/src/bin/pg_basebackup/po/it.po b/src/bin/pg_basebackup/po/it.po
new file mode 100644
index 0000000..37892c7
--- /dev/null
+++ b/src/bin/pg_basebackup/po/it.po
@@ -0,0 +1,1937 @@
+#
+# pg_basebackup.po
+# Italian message translation file for pg_basebackup
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:18+0000\n"
+"PO-Revision-Date: 2022-10-04 19:29+0200\n"
+"Last-Translator: Domenico Sgarbossa <sgarbossa.domenico@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../common/compression.c:130 ../../common/compression.c:139
+#: ../../common/compression.c:148
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "questa build non supporta la compressione con %s"
+
+#: ../../common/compression.c:203
+msgid "found empty string where a compression option was expected"
+msgstr "trovata una stringa vuota in cui era prevista un'opzione di compressione"
+
+#: ../../common/compression.c:237
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "opzione di colonna \"%s\" non riconosciuta"
+
+#: ../../common/compression.c:276
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "l'opzione di compressione \"%s\" richiede un valore"
+
+#: ../../common/compression.c:285
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "il valore per l'opzione di compressione \"%s\" deve essere un numero intero"
+
+#: ../../common/compression.c:335
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "l'algoritmo di compressione \"%s\" non accetta un livello di compressione"
+
+#: ../../common/compression.c:342
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "l'algoritmo di compressione \"%s\" prevede un livello di compressione compreso tra %d e %d (impostazione predefinita a %d)"
+
+#: ../../common/compression.c:353
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "l'algoritmo di compressione \"%s\" non accetta un conteggio di lavoro"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "impossibile duplicare il puntatore nullo (errore interno)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#: pg_receivewal.c:380 pg_recvlogical.c:341
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file \"%s\": %m"
+
+#: ../../common/file_utils.c:166 pg_receivewal.c:303
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "apertura della directory \"%s\" fallita: %m"
+
+#: ../../common/file_utils.c:200 pg_receivewal.c:532
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "lettura della directory \"%s\" fallita: %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:447
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "apertura del file \"%s\" fallita: %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#: pg_recvlogical.c:196
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "fsync del file \"%s\" fallito: %m"
+
+#: ../../common/file_utils.c:383 pg_basebackup.c:2256 walmethods.c:459
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "non è stato possibile rinominare il file \"%s\" in \"%s\": %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valore \"%s\" per \"%s\" non valido"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s deve essere compreso nell'intervallo %d..%d"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1636
+#, c-format
+msgid "out of memory"
+msgstr "memoria esaurita"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "scrittura nel file \"%s\" fallita: %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339
+#: pg_basebackup.c:1497 pg_basebackup.c:1706
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "creazione del file \"%s\" fallita: %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:635
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "chiusura del file \"%s\" fallita: %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "stato imprevisto durante l'estrazione dell'archivio"
+
+#: bbstreamer_file.c:298 pg_basebackup.c:686 pg_basebackup.c:730
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "creazione della directory \"%s\" fallita: %m"
+
+#: bbstreamer_file.c:304
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "impostazione dei permessi sulla directory \"%s\" fallita: %m"
+
+#: bbstreamer_file.c:323
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "impossibile creare un collegamento simbolico da \"%s\" a \"%s\": %m"
+
+#: bbstreamer_file.c:343
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "impossibile impostare i permessi sul file \"%s\": %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "impossibile creare il file compresso \"%s\": %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "impossibile duplicare lo stdout: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "impossibile aprire il file di output: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "impossibile impostare il livello di compressione %d: %s"
+
+#: bbstreamer_gzip.c:116 bbstreamer_gzip.c:249
+#, c-format
+msgid "this build does not support gzip compression"
+msgstr "questa build non supporta la compressione gzip"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "impossibile scrivere nel file compresso \"%s\": %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "impossibile chiudere il file compresso \"%s\": %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:869
+#, c-format
+msgid "could not initialize compression library"
+msgstr "inizializzazione della libreria di compressione fallita"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:316
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "impossibile decomprimere i dati: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "stato imprevisto durante l'iniezione delle impostazioni di ripristino"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "impossibile creare il contesto di compressione lz4: %s"
+
+#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298
+#, c-format
+msgid "this build does not support lz4 compression"
+msgstr "questa build non supporta la compressione lz4"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "impossibile scrivere l'intestazione lz4: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:168 bbstreamer_zstd.c:210
+#, c-format
+msgid "could not compress data: %s"
+msgstr "impossibile comprimere i dati: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "impossibile terminare la compressione lz4: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "impossibile inizializzare la libreria di compressione: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "il trailer del file tar supera i 2 blocchi"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "stato imprevisto durante l'analisi dell'archivio tar"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "il membro tar ha un nome vuoto"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "Il flusso COPY è terminato prima che l'ultimo file fosse terminato"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "impossibile creare il contesto di compressione zstd"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "impossibile impostare il livello di compressione zstd su %d: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "impossibile impostare il conteggio degli operatori di compressione su %d: %s"
+
+#: bbstreamer_zstd.c:116 bbstreamer_zstd.c:271
+#, c-format
+msgid "this build does not support zstd compression"
+msgstr "questa build non supporta la compressione zstd"
+
+#: bbstreamer_zstd.c:262
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "impossibile creare il contesto di decompressione zstd"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "rimozione della directory dei dati \"%s\""
+
+#: pg_basebackup.c:242
+#, c-format
+msgid "failed to remove data directory"
+msgstr "impossibile rimuovere la directory dei dati"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "rimozione del contenuto della directory dei dati \"%s\""
+
+#: pg_basebackup.c:248
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "impossibile rimuovere il contenuto della directory dei dati"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "rimozione della directory WAL \"%s\""
+
+#: pg_basebackup.c:255
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "impossibile rimuovere la directory WAL"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "rimozione del contenuto della directory WAL \"%s\""
+
+#: pg_basebackup.c:261
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "più segni \"=\" nella mappatura del tablespace"
+
+#: pg_basebackup.c:267
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "directory dati \"%s\" non rimossa su richiesta dell'utente"
+
+#: pg_basebackup.c:270
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "Directory WAL \"%s\" non rimossa su richiesta dell'utente"
+
+#: pg_basebackup.c:274
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "le modifiche alle directory del tablespace non verranno annullate"
+
+#: pg_basebackup.c:326
+#, c-format
+msgid "directory name too long"
+msgstr "nome della directory troppo lungo"
+
+#: pg_basebackup.c:333
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "più segni \"=\" nella mappatura del tablespace"
+
+#: pg_basebackup.c:342
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "formato di mappatura tablespace non valido \"%s\", deve essere \"OLDDIR=NEWDIR\""
+
+#: pg_basebackup.c:351
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "la vecchia directory non è un percorso assoluto nella mappatura del tablespace: %s"
+
+#: pg_basebackup.c:355
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "nuova directory non è un percorso assoluto nella mappatura del tablespace: %s"
+
+#: pg_basebackup.c:377
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s crea un backup di base di un server PostgreSQL in esecuzione.\n"
+"\n"
+
+#: pg_basebackup.c:379 pg_receivewal.c:81 pg_recvlogical.c:78
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_basebackup.c:380 pg_receivewal.c:82 pg_recvlogical.c:79
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPZIONE]...\n"
+
+#: pg_basebackup.c:381
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Opzioni di controllo del'output:\n"
+
+#: pg_basebackup.c:382
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=DIRECTORY directory in cui ricevere il backup di base\n"
+
+#: pg_basebackup.c:383
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t formato di output (plain (default), tar)\n"
+
+#: pg_basebackup.c:384
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE transfer rate massimo per trasferire la directory dei dati\n"
+" (in kB/s, oppure usa i suffissi \"k\" o \"M\")\n"
+
+#: pg_basebackup.c:386
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" scrivere la configurazione per la replica\n"
+
+#: pg_basebackup.c:388
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=TARGET[:DETTAGLIO]\n"
+" destinazione di backup (se diversa dal client)\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=VECCHIADIR=NUOVADIR\n"
+" sposta il tablespace da VECCHIADIR a NUOVADIR\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALDIR posizione della directory del write-ahead log\n"
+
+#: pg_basebackup.c:393
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" includi i file di WAL richiesti col metodo specificato\n"
+
+#: pg_basebackup.c:395
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip comprimi l'output tar\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METODO[:DETTAGLIO]\n"
+" comprimere su client o server come specificato\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none non comprime l'output tar\n"
+
+#: pg_basebackup.c:399
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Opzioni generali:\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" imposta punti di controllo più veloci o più radi\n"
+
+#: pg_basebackup.c:402
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot crea uno slot di replica\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL imposta l'etichetta del backup\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean non rimuovere i file in caso di errore\n"
+
+#: pg_basebackup.c:405
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync non aspettare che le modifiche siano scritte con sicurezza su disco\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostra informazioni sull'esecuzione\n"
+
+#: pg_basebackup.c:407 pg_receivewal.c:91
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=NOMESLOT slot di replicazione da usare\n"
+
+#: pg_basebackup.c:408 pg_receivewal.c:93 pg_recvlogical.c:100
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose messaggi di output più numerosi\n"
+
+#: pg_basebackup.c:409 pg_receivewal.c:94 pg_recvlogical.c:101
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NESSUNO\n"
+" utilizzare l'algoritmo per i checksum manifest\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --codifica-forza-manifest\n"
+" hex codifica tutti i nomi di file in manifest\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-stimate-size non stima la dimensione del backup sul lato server\n"
+
+#: pg_basebackup.c:415
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-slot impedisci la creazione di uno slot di replica temporanea\n"
+
+#: pg_basebackup.c:416
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot impedisci la creazione di uno slot di replica temporaneo\n"
+
+#: pg_basebackup.c:417
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" non verificare i checksum\n"
+
+#: pg_basebackup.c:419 pg_receivewal.c:97 pg_recvlogical.c:102
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_basebackup.c:420 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opzioni di connessione:\n"
+
+#: pg_basebackup.c:421 pg_receivewal.c:99
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR stringa di connessione\n"
+
+#: pg_basebackup.c:422 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME host del server database o directory del socket\n"
+
+#: pg_basebackup.c:423 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT numero di porta del server database\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVAL\n"
+" intervallo tra i pacchetti di stato inviati al server\n"
+" (in secondi)\n"
+
+#: pg_basebackup.c:426 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME connettiti al database col nome utente specificato\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:103 pg_recvlogical.c:108
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password non chiedere mai la password\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:104 pg_recvlogical.c:109
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password forza la richiesta della password\n"
+" (dovrebbe essere automatico)\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:108 pg_recvlogical.c:110
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:109 pg_recvlogical.c:111
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_basebackup.c:472
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "impossibile leggere dalla pipe pronta: %m"
+
+#: pg_basebackup.c:475 pg_basebackup.c:622 pg_basebackup.c:2170
+#: streamutil.c:444
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "impossibile analizzare la posizione del registro write-ahead \"%s\""
+
+#: pg_basebackup.c:581 pg_receivewal.c:663
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "impossibile completare la scrittura dei file WAL: %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "impossibile creare pipe per il processo in background: %m"
+
+#: pg_basebackup.c:664
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "creato slot di replica temporanea \"%s\""
+
+#: pg_basebackup.c:667
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "slot di replica creato \"%s\""
+
+#: pg_basebackup.c:701
+#, c-format
+msgid "could not create background process: %m"
+msgstr "impossibile creare un processo in background: %m"
+
+#: pg_basebackup.c:710
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "impossibile creare thread in background: %m"
+
+#: pg_basebackup.c:749
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "la directory \"%s\" esiste ma non è vuota"
+
+#: pg_basebackup.c:755
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "accesso alla directory \"%s\" fallito: %m"
+
+#: pg_basebackup.c:832
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgstr[1] "%*s/%s kB (100%%), %d/%d tablespace %*s"
+
+#: pg_basebackup.c:844
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+
+#: pg_basebackup.c:860
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespace"
+
+#: pg_basebackup.c:884
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "la velocità di trasferimento \"%s\" non è un valore valido"
+
+#: pg_basebackup.c:886
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "velocità di trasferimento non valida \"%s\": %m"
+
+#: pg_basebackup.c:893
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "la velocità di trasferimento deve essere maggiore di zero"
+
+#: pg_basebackup.c:923
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "unità --max-rate non valida: \"%s\""
+
+#: pg_basebackup.c:927
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "la velocità di trasferimento \"%s\" supera l'intervallo di numeri interi"
+
+#: pg_basebackup.c:934
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "la velocità di trasferimento \"%s\" non è compresa nell'intervallo"
+
+#: pg_basebackup.c:1030
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "impossibile ottenere il flusso di dati COPY: %s"
+
+#: pg_basebackup.c:1047 pg_recvlogical.c:438 pg_recvlogical.c:610
+#: receivelog.c:981
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "impossibile leggere i dati COPY: %s"
+
+#: pg_basebackup.c:1051
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "processo in background terminato in modo imprevisto"
+
+#: pg_basebackup.c:1122
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "impossibile iniettare manifest in un file tar compresso"
+
+#: pg_basebackup.c:1123
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "Usa la compressione lato client, invia l'output a una directory anziché all'output standard o usa %s."
+
+#: pg_basebackup.c:1139
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "impossibile analizzare l'archivio \"%s\""
+
+#: pg_basebackup.c:1140
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "È possibile analizzare solo gli archivi tar."
+
+#: pg_basebackup.c:1142
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "Il formato normale richiede pg_basebackup per analizzare l'archivio."
+
+#: pg_basebackup.c:1144
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "L'utilizzo di - come directory di output richiede pg_basebackup per analizzare l'archivio."
+
+#: pg_basebackup.c:1146
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "L'opzione -R richiede pg_basebackup per analizzare l'archivio."
+
+#: pg_basebackup.c:1357
+#, c-format
+msgid "archives must precede manifest"
+msgstr "gli archivi devono precedere manifest"
+
+#: pg_basebackup.c:1372
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "nome archivio non valido: \"%s\""
+
+#: pg_basebackup.c:1444
+#, c-format
+msgid "unexpected payload data"
+msgstr "dati di carico utile imprevisti"
+
+#: pg_basebackup.c:1587
+#, c-format
+msgid "empty COPY message"
+msgstr "messaggio COPIA vuoto"
+
+#: pg_basebackup.c:1589
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "messaggio COPY non corretto di tipo %d, lunghezza %zu"
+
+#: pg_basebackup.c:1787
+#, c-format
+msgid "incompatible server version %s"
+msgstr "versione server incompatibile %s"
+
+#: pg_basebackup.c:1803
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "Usa -X nessuno o -X fetch per disabilitare lo streaming del registro."
+
+#: pg_basebackup.c:1871
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "le destinazioni di backup non sono supportate da questa versione del server"
+
+#: pg_basebackup.c:1874
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "non è possibile scrivere la configurazione di ripristino quando viene utilizzata una destinazione di backup"
+
+#: pg_basebackup.c:1901
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "il server non supporta la compressione lato server"
+
+#: pg_basebackup.c:1911
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "avvio del backup di base, in attesa del completamento del checkpoint"
+
+#: pg_basebackup.c:1915
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "in attesa del checkpoint"
+
+#: pg_basebackup.c:1928 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588
+#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504
+#: streamutil.c:656 streamutil.c:701
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "impossibile inviare il comando di replica \"%s\": %s"
+
+#: pg_basebackup.c:1936
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "impossibile avviare il backup di base: %s"
+
+#: pg_basebackup.c:1939
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "il server ha restituito una risposta imprevista al comando BASE_BACKUP; ottenuto %d righe e %d campi, previsto %d righe e %d campi"
+
+#: pg_basebackup.c:1945
+#, c-format
+msgid "checkpoint completed"
+msgstr "posto di blocco completato"
+
+#: pg_basebackup.c:1960
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "punto di inizio registro write-ahead: %s sulla sequenza temporale %u"
+
+#: pg_basebackup.c:1968
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "impossibile ottenere l'intestazione del backup: %s"
+
+#: pg_basebackup.c:1971
+#, c-format
+msgid "no data returned from server"
+msgstr "nessun dato restituito dal server"
+
+#: pg_basebackup.c:2006
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "può scrivere solo un singolo tablespace su stdout, il database ha %d"
+
+#: pg_basebackup.c:2019
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "ricevitore WAL in background iniziale"
+
+#: pg_basebackup.c:2101
+#, c-format
+msgid "backup failed: %s"
+msgstr "backup fallito: %s"
+
+#: pg_basebackup.c:2104
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "nessuna posizione finale del registro write-ahead restituita dal server"
+
+#: pg_basebackup.c:2107
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "punto finale del registro write-ahead: %s"
+
+#: pg_basebackup.c:2118
+#, c-format
+msgid "checksum error occurred"
+msgstr "si è verificato un errore di checksum"
+
+#: pg_basebackup.c:2123
+#, c-format
+msgid "final receive failed: %s"
+msgstr "ricezione finale non riuscita: %s"
+
+#: pg_basebackup.c:2147
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "in attesa che il processo in background finisca lo streaming..."
+
+#: pg_basebackup.c:2151
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "impossibile inviare il comando alla pipe in background: %m"
+
+#: pg_basebackup.c:2156
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "non potevo aspettare il processo figlio: %m"
+
+#: pg_basebackup.c:2158
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "processo figlio %d interrotto, atteso %d"
+
+#: pg_basebackup.c:2160 streamutil.c:91 streamutil.c:197
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2180
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "non potevo aspettare il thread figlio: %m"
+
+#: pg_basebackup.c:2185
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "impossibile ottenere lo stato di uscita del thread figlio: %m"
+
+#: pg_basebackup.c:2188
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "thread figlio terminato con errore %u"
+
+#: pg_basebackup.c:2217
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "sincronizzazione dei dati su disco..."
+
+#: pg_basebackup.c:2242
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "rinominando backup_manifest.tmp in backup_manifest"
+
+#: pg_basebackup.c:2262
+#, c-format
+msgid "base backup completed"
+msgstr "backup di base completato"
+
+#: pg_basebackup.c:2351
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "formato di output \"%s\" non valido, deve essere \"normale\" o \"tar\""
+
+#: pg_basebackup.c:2395
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "opzione wal-method \"%s\" non valida, deve essere \"fetch\", \"stream\" o \"none\""
+
+#: pg_basebackup.c:2425
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "argomento checkpoint non valido \"%s\", deve essere \"fast\" o \"spread\""
+
+#: pg_basebackup.c:2476 pg_basebackup.c:2488 pg_basebackup.c:2510
+#: pg_basebackup.c:2522 pg_basebackup.c:2528 pg_basebackup.c:2580
+#: pg_basebackup.c:2591 pg_basebackup.c:2601 pg_basebackup.c:2607
+#: pg_basebackup.c:2614 pg_basebackup.c:2626 pg_basebackup.c:2638
+#: pg_basebackup.c:2646 pg_basebackup.c:2659 pg_basebackup.c:2665
+#: pg_basebackup.c:2674 pg_basebackup.c:2686 pg_basebackup.c:2697
+#: pg_basebackup.c:2705 pg_receivewal.c:814 pg_receivewal.c:826
+#: pg_receivewal.c:833 pg_receivewal.c:842 pg_receivewal.c:849
+#: pg_receivewal.c:859 pg_recvlogical.c:837 pg_recvlogical.c:849
+#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873
+#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894
+#: pg_recvlogical.c:901 pg_recvlogical.c:908
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_basebackup.c:2486 pg_receivewal.c:824 pg_recvlogical.c:847
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_basebackup.c:2509
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "non è possibile specificare sia il formato che la destinazione del backup"
+
+#: pg_basebackup.c:2521
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "deve specificare la directory di output o la destinazione del backup"
+
+#: pg_basebackup.c:2527
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "non è possibile specificare sia la directory di output che la destinazione del backup"
+
+#: pg_basebackup.c:2557 pg_receivewal.c:868
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "algoritmo di compressione non riconosciuto: \"%s\""
+
+#: pg_basebackup.c:2563 pg_receivewal.c:875
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "specifica di compressione non valida: %s"
+
+#: pg_basebackup.c:2579
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "la compressione lato client non è possibile quando viene specificata una destinazione di backup"
+
+#: pg_basebackup.c:2590
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "solo i backup in modalità tar possono essere compressi"
+
+#: pg_basebackup.c:2600
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "Non è possibile eseguire lo streaming di WAL quando viene specificata una destinazione di backup"
+
+#: pg_basebackup.c:2606
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "impossibile eseguire lo streaming di registri write-ahead in modalità tar su stdout"
+
+#: pg_basebackup.c:2613
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "gli slot di replica possono essere utilizzati solo con lo streaming WAL"
+
+#: pg_basebackup.c:2625
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot non può essere utilizzato con il nome dello slot"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2636 pg_receivewal.c:840
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s ha bisogno di uno slot da specificare usando --slot"
+
+#: pg_basebackup.c:2644 pg_basebackup.c:2684 pg_basebackup.c:2695
+#: pg_basebackup.c:2703
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s e %s sono opzioni incompatibili"
+
+#: pg_basebackup.c:2658
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "Non è possibile specificare il percorso della directory WAL insieme a una destinazione di backup"
+
+#: pg_basebackup.c:2664
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "Il percorso della directory WAL può essere specificato solo in modalità normale"
+
+#: pg_basebackup.c:2673
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "Il percorso della directory WAL deve essere un percorso assoluto"
+
+#: pg_basebackup.c:2774
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "creazione del link simbolico \"%s\" fallita: %m"
+
+#: pg_basebackup.c:2776
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "i collegamenti simbolici non sono supportati su questa piattaforma"
+
+#: pg_receivewal.c:79
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s serve a ricevere il flusso dei write-ahead log di PostgreSQL.\n"
+"\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:84
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opzioni:\n"
+
+#: pg_receivewal.c:84
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=DIR ricevi i file di write-ahead log in questa directory\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:85
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN esci dopo aver ricevuto la posizione LSN specificata\n"
+
+#: pg_receivewal.c:86 pg_recvlogical.c:89
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists non dare un errore se esiste già uno slot con lo stesso nome\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:91
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop non ri-eseguire se la connessione è persa\n"
+
+#: pg_receivewal.c:88
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync non aspettare che i cambiamenti siano scritti sul disco in sicurezza\n"
+
+#: pg_receivewal.c:89 pg_recvlogical.c:96
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SEC\n"
+" tempo tra i pacchetti di status inviati al server (default: %d)\n"
+
+#: pg_receivewal.c:92
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous esegui il flush del write-ahead log immediatamente dopo la scrittura\n"
+
+#: pg_receivewal.c:95
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METODO[:DETTAGLIO]\n"
+" comprimere come specificato\n"
+
+#: pg_receivewal.c:105
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Azioni opzionali:\n"
+
+#: pg_receivewal.c:106 pg_recvlogical.c:81
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot crea un nuovo slot di replica (per il nome vedi --slot)\n"
+
+#: pg_receivewal.c:107 pg_recvlogical.c:82
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot elimina lo slot di replica (per il nome vedi --slot)\n"
+
+#: pg_receivewal.c:252
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "segmento finito alle %X/%X (timeline %u)"
+
+#: pg_receivewal.c:259
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "flusso di log interrotto alle %X/%X (timeline %u)"
+
+#: pg_receivewal.c:275
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "passato alla sequenza temporale %u alle %X/%X"
+
+#: pg_receivewal.c:285
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "segnale di interruzione ricevuto, in uscita"
+
+#: pg_receivewal.c:317
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "impossibile chiudere la directory \"%s\": %m"
+
+#: pg_receivewal.c:384
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "il file di segmento \"%s\" ha una dimensione errata %lld, saltando"
+
+#: pg_receivewal.c:401
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "impossibile aprire il file compresso \"%s\": %m"
+
+#: pg_receivewal.c:404
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "impossibile cercare nel file compresso \"%s\": %m"
+
+#: pg_receivewal.c:410
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "impossibile leggere il file compresso \"%s\": %m"
+
+#: pg_receivewal.c:413
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "impossibile leggere il file compresso \"%s\": leggere %d di %zu"
+
+#: pg_receivewal.c:423
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "il file del segmento compresso \"%s\" ha una dimensione non compressa %d errata, saltando"
+
+#: pg_receivewal.c:451
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "impossibile creare il contesto di decompressione LZ4: %s"
+
+#: pg_receivewal.c:463
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "lettura del file \"%s\" fallita: %m"
+
+#: pg_receivewal.c:481
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "impossibile decomprimere il file \"%s\": %s"
+
+#: pg_receivewal.c:504
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "impossibile liberare il contesto di decompressione LZ4: %s"
+
+#: pg_receivewal.c:509
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "il file del segmento compresso \"%s\" ha una dimensione non compressa %zu errata, saltando"
+
+#: pg_receivewal.c:514
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "impossibile controllare il file \"%s\": compressione con %s non supportata da questa build"
+
+#: pg_receivewal.c:641
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "avvio del flusso di log alle %X/%X (timeline %u)"
+
+#: pg_receivewal.c:783 pg_recvlogical.c:785
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "impossibile analizzare la posizione finale \"%s\""
+
+#: pg_receivewal.c:832
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "non è possibile utilizzare --create-slot insieme a --drop-slot"
+
+#: pg_receivewal.c:848
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "impossibile utilizzare --synchronous insieme a --no-sync"
+
+#: pg_receivewal.c:858
+#, c-format
+msgid "no target directory specified"
+msgstr "nessuna directory di destinazione specificata"
+
+#: pg_receivewal.c:882
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "la compressione con %s non è ancora supportata"
+
+#: pg_receivewal.c:924
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "la connessione di replica che utilizza lo slot \"%s\" è inaspettatamente specifica del database"
+
+#: pg_receivewal.c:943 pg_recvlogical.c:955
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "eliminazione dello slot di replica \"%s\""
+
+#: pg_receivewal.c:954 pg_recvlogical.c:965
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "creazione dello slot di replica \"%s\""
+
+#: pg_receivewal.c:983 pg_recvlogical.c:989
+#, c-format
+msgid "disconnected"
+msgstr "disconnesso"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:987 pg_recvlogical.c:993
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "disconnesso; in attesa di %d secondi per riprovare"
+
+#: pg_recvlogical.c:76
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s controlla i flussi di decodifica logica di PostgreSQL.\n"
+"\n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Azioni da effettuare:\n"
+
+#: pg_recvlogical.c:83
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start avvia lo streaming in uno slot di replica (per il nome vedi --slot)\n"
+
+#: pg_recvlogical.c:86
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=FILE riceve i log in questo file, - per stdout\n"
+
+#: pg_recvlogical.c:87
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SEC\n"
+" tempo tra i sync del file di output (default: %d)\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN dove deve partire lo streaming in uno slot esistente\n"
+
+#: pg_recvlogical.c:92
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NOME[=VALORE]\n"
+" passa l'opzione NOME col valore opzionale VALORE\n"
+" al plugin di output\n"
+
+#: pg_recvlogical.c:95
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN usa il plugin di output PLUGIN (default: %s)\n"
+
+#: pg_recvlogical.c:98
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=NOMESLOT nome dello slot di replica logica\n"
+
+#: pg_recvlogical.c:99
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr " -t, --two-phase abilita la decodifica delle transazioni preparate durante la creazione di uno slot\n"
+
+#: pg_recvlogical.c:104
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=NOMEDB database a cui connettersi\n"
+
+#: pg_recvlogical.c:137
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "conferma scrittura fino a %X/%X, svuota fino a %X/%X (slot %s)"
+
+#: pg_recvlogical.c:161 receivelog.c:366
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "impossibile inviare il pacchetto di feedback: %s"
+
+#: pg_recvlogical.c:229
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "avvio dello streaming del registro a %X/%X (slot %s)"
+
+#: pg_recvlogical.c:271
+#, c-format
+msgid "streaming initiated"
+msgstr "streaming avviato"
+
+#: pg_recvlogical.c:335
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "apertura del file di log \"%s\" fallita: %m"
+
+#: pg_recvlogical.c:364 receivelog.c:889
+#, c-format
+msgid "invalid socket: %s"
+msgstr "socket non valido: %s"
+
+#: pg_recvlogical.c:417 receivelog.c:917
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() non riuscito: %m"
+
+#: pg_recvlogical.c:424 receivelog.c:967
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "ricezione dati dallo stream WAL fallita: %s"
+
+#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011
+#: receivelog.c:1074
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "intestazione streaming troppo piccola: %d"
+
+#: pg_recvlogical.c:501 receivelog.c:849
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "intestazione streaming non riconosciuta: \"%c\""
+
+#: pg_recvlogical.c:555 pg_recvlogical.c:567
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "impossibile scrivere %d byte nel file di registro \"%s\": %m"
+
+#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "interruzione imprevista del flusso di replica: %s"
+
+#: pg_recvlogical.c:780
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "impossibile analizzare la posizione iniziale \"%s\""
+
+#: pg_recvlogical.c:858
+#, c-format
+msgid "no slot specified"
+msgstr "nessuno slot specificato"
+
+#: pg_recvlogical.c:865
+#, c-format
+msgid "no target file specified"
+msgstr "nessun file di destinazione specificato"
+
+#: pg_recvlogical.c:872
+#, c-format
+msgid "no database specified"
+msgstr "nessun database specificato"
+
+#: pg_recvlogical.c:879
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "è necessario specificare almeno un'azione"
+
+#: pg_recvlogical.c:886
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "non può usare --create-slot o --start insieme a --drop-slot"
+
+#: pg_recvlogical.c:893
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "non è possibile utilizzare --create-slot o --drop-slot insieme a --startpos"
+
+#: pg_recvlogical.c:900
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos può essere specificato solo con --start"
+
+#: pg_recvlogical.c:907
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase può essere specificato solo con --create-slot"
+
+#: pg_recvlogical.c:939
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "non è stato possibile stabilire una connessione di replica specifica del database"
+
+#: pg_recvlogical.c:1033
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "posizione finale %X/%X raggiunta da keepalive"
+
+#: pg_recvlogical.c:1036
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "posizione finale %X/%X raggiunta dal record WAL a %X/%X"
+
+#: receivelog.c:68
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "impossibile creare il file di stato dell'archivio \"%s\": %s"
+
+#: receivelog.c:75
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "impossibile chiudere il file di stato dell'archivio \"%s\": %s"
+
+#: receivelog.c:123
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "impossibile ottenere la dimensione del file di registro write-ahead \"%s\": %s"
+
+#: receivelog.c:134
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "impossibile aprire il file di registro write-ahead esistente \"%s\": %s"
+
+#: receivelog.c:143
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "impossibile sincronizzare il file di registro write-ahead esistente \"%s\": %s"
+
+#: receivelog.c:158
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "il file di registro write-ahead \"%s\" contiene %zd byte, dovrebbe essere 0 o %d"
+msgstr[1] "il files di registro write-ahead \"%s\" contengono %zd byte, dovrebbe essere 0 o %d"
+
+#: receivelog.c:174
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "impossibile aprire il file di registro write-ahead \"%s\": %s"
+
+#: receivelog.c:208
+#, c-format
+msgid "could not determine seek position in file \"%s\": %s"
+msgstr "impossibile determinare la posizione di ricerca nel file \"%s\": %s"
+
+#: receivelog.c:223
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "non rinominando \"%s\", il segmento non è completo"
+
+#: receivelog.c:234 receivelog.c:323 receivelog.c:694
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "impossibile chiudere il file \"%s\": %s"
+
+#: receivelog.c:295
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "il server ha segnalato il nome del file della cronologia imprevisto per la sequenza temporale %u: %s"
+
+#: receivelog.c:303
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "impossibile creare il file della cronologia della sequenza temporale \"%s\": %s"
+
+#: receivelog.c:310
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "impossibile scrivere il file della cronologia della sequenza temporale \"%s\": %s"
+
+#: receivelog.c:400
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "versione server incompatibile %s; il client non supporta lo streaming da versioni del server precedenti a %s"
+
+#: receivelog.c:409
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "versione server incompatibile %s; il client non supporta lo streaming da versioni del server successive a %s"
+
+#: receivelog.c:514
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "l'identificatore di sistema non corrisponde tra il backup di base e la connessione in streaming"
+
+#: receivelog.c:522
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "sequenza temporale di inizio %u non è presente nel server"
+
+#: receivelog.c:561
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "risposta inaspettata al comando TIMELINE_HISTORY: ottenuto %d righe e %d campi, previsto %d righe e %d campi"
+
+#: receivelog.c:632
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "il server ha segnalato la sequenza temporale successiva inaspettata %u, dopo la sequenza temporale %u"
+
+#: receivelog.c:638
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "il server ha interrotto lo streaming della sequenza temporale %u alle %X/%X, ma ha segnalato che la sequenza temporale successiva %u inizia alle %X/%X"
+
+#: receivelog.c:678
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "flusso di replica è stato terminato prima del punto di arresto"
+
+#: receivelog.c:724
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "set di risultati imprevisti dopo la fine della sequenza temporale: ottenuto %d righe e %d campi, previsti %d righe e %d campi"
+
+#: receivelog.c:733
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "impossibile analizzare il punto iniziale della sequenza temporale successiva \"%s\""
+
+#: receivelog.c:781 receivelog.c:1030 walmethods.c:1205
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "impossibile sincronizzare il file \"%s\": %s"
+
+#: receivelog.c:1091
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "ha ricevuto il record di registro write-ahead per l'offset %u senza file aperti"
+
+#: receivelog.c:1101
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "ottenuto offset dati WAL %08x, previsto %08x"
+
+#: receivelog.c:1135
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "impossibile scrivere %d byte nel file WAL \"%s\": %s"
+
+#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "impossibile inviare il pacchetto di fine copia: %s"
+
+#: streamutil.c:159
+msgid "Password: "
+msgstr "Password: "
+
+#: streamutil.c:182
+#, c-format
+msgid "could not connect to server"
+msgstr "non poteva collegarsi al server"
+
+#: streamutil.c:225
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "pulizia del search_path fallita: %s"
+
+#: streamutil.c:241
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "impossibile determinare l'impostazione del server per integer_datetimes"
+
+#: streamutil.c:248
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "integer_datetimes flag di compilazione non corrisponde al server"
+
+#: streamutil.c:299
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "impossibile recuperare la dimensione del segmento WAL: ottenuto %d righe e %d campi, previsto %d righe e %d o più campi"
+
+#: streamutil.c:309
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "Impossibile analizzare la dimensione del segmento WAL"
+
+#: streamutil.c:327
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "La dimensione del segmento WAL deve essere una potenza di due tra 1 MB e 1 GB, ma il server remoto ha riportato un valore di %d byte"
+msgstr[1] "La dimensione dei segmenti WAL deve essere una potenza di due tra 1 MB e 1 GB, ma il server remoto ha riportato un valore di %d byte"
+
+#: streamutil.c:372
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "impossibile recuperare il flag di accesso al gruppo: ottenuto %d righe e %d campi, previsto %d righe e %d o più campi"
+
+#: streamutil.c:381
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "Impossibile analizzare il flag di accesso al gruppo: %s"
+
+#: streamutil.c:424 streamutil.c:461
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "impossibile identificare il sistema: ottenuto %d righe e %d campi, previsto %d righe e %d o più campi"
+
+#: streamutil.c:513
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "impossibile leggere lo slot di replica \"%s\": ottenuto %d righe e %d campi, previsto %d righe e %d campi"
+
+#: streamutil.c:525
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "lo slot di replica \"%s\" non esiste"
+
+#: streamutil.c:536
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "previsto uno slot di replica fisico, è stato invece ottenuto il tipo \"%s\"."
+
+#: streamutil.c:550
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "impossibile analizzare restart_lsn \"%s\" per lo slot di replica \"%s\""
+
+#: streamutil.c:667
+#, c-format
+msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "impossibile creare lo slot di replica \"%s\": ottenuto %d righe e %d campi, previsto %d righe e %d campi"
+
+#: streamutil.c:711
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "impossibile eliminare lo slot di replica \"%s\": ottenuto %d righe e %d campi, previsto %d righe e %d campi"
+
+#: walmethods.c:720 walmethods.c:1267
+msgid "could not compress data"
+msgstr "compressione dei dati fallita"
+
+#: walmethods.c:749
+msgid "could not reset compression stream"
+msgstr "reset dello stream di compressione fallito"
+
+#: walmethods.c:880
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "errore di implementazione: i file tar non possono avere più di un file aperto"
+
+#: walmethods.c:894
+msgid "could not create tar header"
+msgstr "creazione dell'intestazione del tar fallita"
+
+#: walmethods.c:910 walmethods.c:951 walmethods.c:1170 walmethods.c:1183
+msgid "could not change compression parameters"
+msgstr "modifica dei parametri di compressione fallita"
+
+#: walmethods.c:1055
+msgid "unlink not supported with compression"
+msgstr "unlink non supportato con la compressione"
+
+#: walmethods.c:1291
+msgid "could not close compression stream"
+msgstr "chiusura dello stream di compressione fallita"
+
+#~ msgid " -Z, --compress=0-9 compress logs with given compression level\n"
+#~ msgstr " -Z, --compress=0-9 comprimi i log con questo livello di compressoine\n"
+
+#~ msgid " -Z, --compress=0-9 compress tar output with given compression level\n"
+#~ msgstr " -Z, --compress=0-9 comprimi l'output tar a questo livello di compressione\n"
+
+#~ msgid "%s: --create-slot and --no-slot are incompatible options\n"
+#~ msgstr "%s: --create-slot e --no-slot sono opzioni incompatibili\n"
+
+#~ msgid "%s: child process did not exit normally\n"
+#~ msgstr "%s: il processo figlio non è terminato normalmente\n"
+
+#~ msgid "%s: child process exited with error %d\n"
+#~ msgstr "%s: il processo figlio è terminato con errore %d\n"
+
+#~ msgid "%s: could not access directory \"%s\": %s\n"
+#~ msgstr "%s: accesso alla directory \"%s\" fallito: %s\n"
+
+#~ msgid "%s: could not clear search_path: %s"
+#~ msgstr "%s: pulizia del search_path fallita: %s"
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s: chiusura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not close file \"%s\": %s\n"
+#~ msgstr "%s: chiusura del file \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not connect to server\n"
+#~ msgstr "%s: connessione al server fallita\n"
+
+#~ msgid "%s: could not connect to server: %s"
+#~ msgstr "%s: connessione al server fallita: %s"
+
+#~ msgid "%s: could not create archive status file \"%s\": %s\n"
+#~ msgstr "%s: creazione del file di stato dell'archivio \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not create directory \"%s\": %s\n"
+#~ msgstr "%s: creazione della directory \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not create file \"%s\": %s\n"
+#~ msgstr "%s: creazione del file \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not create symbolic link \"%s\": %s\n"
+#~ msgstr "%s: creazione del link simbolico \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not fsync file \"%s\": %s\n"
+#~ msgstr "%s: fsync del file \"%s\" fallito: %s\n"
+
+#~ msgid "%s: could not fsync log file \"%s\": %s\n"
+#~ msgstr "%s: fsync del file di log \"%s\" fallito: %s\n"
+
+#~ msgid "%s: could not get write-ahead log end position from server: %s"
+#~ msgstr "%s: non è stato possibile ottenere la posizione finale del write-ahead log dal server: %s"
+
+#~ msgid "%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n"
+#~ msgstr "%s: identificazione del sistema fallita: ricevute %d righe e %d campi, attese %d righe e %d o più campi\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s: apertura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s: apertura del file \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not open log file \"%s\": %s\n"
+#~ msgstr "%s: apertura del file di log \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not open write-ahead log file \"%s\": %s\n"
+#~ msgstr "%s: apertura del file di write-ahead log \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s: lettura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not receive data from WAL stream: %s"
+#~ msgstr "%s: ricezione dati dallo stream WAL fallita: %s"
+
+#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+#~ msgstr "%s: non è stato possibile rinominare il file di storia della timeline \"%s\" in \"%s\": %s\n"
+
+#~ msgid "%s: could not set permissions on directory \"%s\": %s\n"
+#~ msgstr "%s: impostazione dei permessi sulla directory \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not set permissions on file \"%s\": %s\n"
+#~ msgstr "%s: impostazione dei permessi sul file \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not stat file \"%s\": %s\n"
+#~ msgstr "%s: non è stato possibile ottenere informazioni sul file \"%s\": %s\n"
+
+#~ msgid "%s: could not write to file \"%s\": %s\n"
+#~ msgstr "%s: scrittura nel file \"%s\" fallita: %s\n"
+
+#~ msgid "%s: invalid compression level \"%s\"\n"
+#~ msgstr "%s: livello di compressione non valido \"%s\"\n"
+
+#~ msgid "%s: invalid fsync interval \"%s\"\n"
+#~ msgstr "%s: intervallo di fsync \"%s\" non valido\n"
+
+#~ msgid "%s: invalid port number \"%s\"\n"
+#~ msgstr "%s: numero di porta non valido \"%s\"\n"
+
+#~ msgid "%s: invalid status interval \"%s\"\n"
+#~ msgstr "%s: intervallo di status \"%s\" non valido\n"
+
+#~ msgid "%s: invalid tar block header size: %d\n"
+#~ msgstr "%s: dimensione del blocco di intestazione del file tar non valida: %d\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: memoria esaurita\n"
+
+#~ msgid "%s: select() failed: %s\n"
+#~ msgstr "%s: select() fallita: %s\n"
+
+#~ msgid "%s: symlinks are not supported on this platform\n"
+#~ msgstr "%s: questa piattaforma non supporta i link simbolici\n"
+
+#~ msgid "%s: unrecognized link indicator \"%c\"\n"
+#~ msgstr "%s: indicatore di link sconosciuto \"%c\"\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
diff --git a/src/bin/pg_basebackup/po/ja.po b/src/bin/pg_basebackup/po/ja.po
new file mode 100644
index 0000000..8ff0f6e
--- /dev/null
+++ b/src/bin/pg_basebackup/po/ja.po
@@ -0,0 +1,1813 @@
+# pg_basebackup.po
+# Japanese message translation file for pg_basebackup
+#
+# Copyright (C) 2013-2022 PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# <iwata.aya@jp.fujitsu.com>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 11:13+0900\n"
+"PO-Revision-Date: 2022-09-26 14:52+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../common/compression.c:130 ../../common/compression.c:139
+#: ../../common/compression.c:148
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "このビルドでは%sによる圧縮をサポートしていません"
+
+#: ../../common/compression.c:203
+msgid "found empty string where a compression option was expected"
+msgstr "圧縮オプションがあるはずの場所に空文字列が見つかりました"
+
+#: ../../common/compression.c:237
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "認識できない圧縮オプション: \"%s\""
+
+#: ../../common/compression.c:276
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "圧縮オプション\"%s\"には値が必要です"
+
+#: ../../common/compression.c:285
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "圧縮オプション\"%s\"の値は整数でなければなりません"
+
+#: ../../common/compression.c:335
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "圧縮アルゴリズム\"%s\"は圧縮レベルを受け付けません"
+
+#: ../../common/compression.c:342
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "圧縮アルゴリズム\"%s\"では%dから%dまでの圧縮レベルが指定可能です(デフォルトは%d)"
+
+#: ../../common/compression.c:353
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "圧縮アルゴリズム\"%s\"はワーカー数を受け付けません"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリ不足です\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null ポインタを複製できません (内部エラー)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#: pg_receivewal.c:380 pg_recvlogical.c:341
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ファイル\"%s\"のstatに失敗しました: %m"
+
+#: ../../common/file_utils.c:166 pg_receivewal.c:303
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m"
+
+#: ../../common/file_utils.c:200 pg_receivewal.c:532
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:447
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンできませんでした: %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#: pg_recvlogical.c:196
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "ファイル\"%s\"をfsyncできませんでした: %m"
+
+#: ../../common/file_utils.c:383 pg_basebackup.c:2256 walmethods.c:459
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "オプション\"%2$s\"に対する不正な値\"%1$s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%sは%d..%dの範囲でなければなりません"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1636
+#, c-format
+msgid "out of memory"
+msgstr "メモリ不足です"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "ファイル\"%s\"を書き込めませんでした: %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339
+#: pg_basebackup.c:1497 pg_basebackup.c:1706
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "ファイル\"%s\"を作成できませんでした: %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:635
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ファイル\"%s\"をクローズできませんでした: %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "アーカイブの抽出中に想定外の状態"
+
+#: bbstreamer_file.c:298 pg_basebackup.c:686 pg_basebackup.c:730
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を作成できませんでした: %m"
+
+#: bbstreamer_file.c:304
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"に権限を設定できませんでした: %m"
+
+#: bbstreamer_file.c:323
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "\"%s\"から\"%s\"へのシンボリックリンクを作成できませんでした: %m"
+
+#: bbstreamer_file.c:343
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "ファイル\"%s\"の権限を設定できませんでした: %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "圧縮ファイル\"%s\"を作成できませんでした: %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "標準出力の複製に失敗しました: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "出力ファイルをオープンできませんでした: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "圧縮レベルを%dに設定できませんでした: %s"
+
+#: bbstreamer_gzip.c:116 bbstreamer_gzip.c:249
+#, c-format
+msgid "this build does not support gzip compression"
+msgstr "このビルドではgzip圧縮をサポートしていません"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "圧縮ファイル\"%s\"に書き込めませんでした: %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "圧縮ファイル\"%s\"をクローズすることができませんでした: %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:869
+#, c-format
+msgid "could not initialize compression library"
+msgstr "圧縮ライブラリを初期化できませんでした"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:316
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "データを伸張できませんでした: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "リカバリ設定の出力中に想定外の状態"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "lz4圧縮コンテクストを生成できませんでした: %s"
+
+#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298
+#, c-format
+msgid "this build does not support lz4 compression"
+msgstr "このビルドではlz4圧縮をサポートしていません"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "lz4ヘッダを出力できませんでした: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:168 bbstreamer_zstd.c:210
+#, c-format
+msgid "could not compress data: %s"
+msgstr "データを圧縮できませんでした: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "lz4圧縮を終了できませんでした: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "圧縮ライブラリを初期化できませんでした: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "tarファイル後続ブロックが2ブロックを超えています"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "tarアーカイブのパース中に想定外の状態"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "tarメンバーの名前が空です"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "最後のファイルが終わる前にCOPYストリームが終了しました"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "zstd圧縮コンテクストを生成できませんでした"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "zstd圧縮レベルを%dに設定できませんでした: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "圧縮ワーカー数を%dに設定できませんでした: %s"
+
+#: bbstreamer_zstd.c:116 bbstreamer_zstd.c:271
+#, c-format
+msgid "this build does not support zstd compression"
+msgstr "このビルドではzstd圧縮をサポートしていません"
+
+#: bbstreamer_zstd.c:262
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "zstd伸張コンテクストを生成できませんでした"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "データディレクトリ\"%s\"を削除しています"
+
+#: pg_basebackup.c:242
+#, c-format
+msgid "failed to remove data directory"
+msgstr "データディレクトリの削除に失敗しました"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "データディレクトリ\"%s\"の内容を削除しています"
+
+#: pg_basebackup.c:248
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "データディレクトリの中身の削除に失敗しました"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "WAL ディレクトリ\"%s\"を削除しています"
+
+#: pg_basebackup.c:255
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "WAL ディレクトリの削除に失敗しました"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "WAL ディレクトリ\"%s\"の中身を削除しています"
+
+#: pg_basebackup.c:261
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "WAL ディレクトリの中身の削除に失敗しました"
+
+#: pg_basebackup.c:267
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "ユーザーの要求により、データディレクトリ\"%s\"を削除しませんでした"
+
+#: pg_basebackup.c:270
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "ユーザーの要求により、WAL ディレクトリ\"%s\"を削除しませんでした"
+
+#: pg_basebackup.c:274
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "テーブル空間用ディレクトリへの変更は取り消されません"
+
+#: pg_basebackup.c:326
+#, c-format
+msgid "directory name too long"
+msgstr "ディレクトリ名が長すぎます"
+
+#: pg_basebackup.c:333
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "テーブル空間のマッピングに複数の\"=\"記号があります"
+
+#: pg_basebackup.c:342
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "テーブル空間のマッピング形式\"%s\"が不正です。\"旧DIR=新DIR\"でなければなりません"
+
+#: pg_basebackup.c:351
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "テーブル空間のマッピングにおいて、旧ディレクトリが絶対パスではありません: %s"
+
+#: pg_basebackup.c:355
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "テーブル空間のマッピングにおいて、新ディレクトリが絶対パスではありません: %s"
+
+#: pg_basebackup.c:377
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%sは実行中のPostgreSQLサーバーのベースバックアップを取得します。\n"
+"\n"
+
+#: pg_basebackup.c:379 pg_receivewal.c:81 pg_recvlogical.c:78
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_basebackup.c:380 pg_receivewal.c:82 pg_recvlogical.c:79
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [オプション]...\n"
+
+#: pg_basebackup.c:381
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"出力を制御するオプション:\n"
+
+#: pg_basebackup.c:382
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=DIRECTORY ベースバックアップをディレクトリ内に格納\n"
+
+#: pg_basebackup.c:383
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t 出力フォーマット(プレイン(デフォルト)またはtar)\n"
+
+#: pg_basebackup.c:384
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE データディレクトリ転送の際の最大転送速度\n"
+" (kB/s 単位、または 接尾辞 \"k\" か\"M\" を使用)\n"
+
+#: pg_basebackup.c:386
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" レプリケーションのための設定を書き込む\n"
+
+#: pg_basebackup.c:388
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=ターゲット[:詳細]\n"
+" バックアップターゲット(クライアント以外の場合)\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=旧DIR=新DIR\n"
+" テーブル空間を旧DIRから新DIRに移動する\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALDIR 先行書き込みログ用ディレクトリの位置\n"
+
+#: pg_basebackup.c:393
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" 要求されたWALファイルを指定の方式でバックアップ\n"
+" に含める\n"
+
+#: pg_basebackup.c:395
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip tar の出力を圧縮する\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]方式[:詳細]\n"
+" 指定に従ってクライアント側またはサーバー側で圧縮\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none tar出力を圧縮しない\n"
+
+#: pg_basebackup.c:399
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"汎用オプション:\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" 高速または分散チェックポイント処理の指定\n"
+
+#: pg_basebackup.c:402
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot 新しいレプリケーションスロットを作成する\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL バックアップラベルの設定\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --noclean エラー発生後作成したファイルの削除を行わない\n"
+
+#: pg_basebackup.c:405
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --nosync ディスクへの安全な書き込みを待機しない\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 進行状況の表示\n"
+
+#: pg_basebackup.c:407 pg_receivewal.c:91
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=スロット名 使用するレプリケーションスロット\n"
+
+#: pg_basebackup.c:408 pg_receivewal.c:93 pg_recvlogical.c:100
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose 冗長メッセージの出力\n"
+
+#: pg_basebackup.c:409 pg_receivewal.c:94 pg_recvlogical.c:101
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" 目録チェックサムに使用するアルゴリズム\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" 目録中の全てのファイル名を16進エンコードする\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size サーバー側でバックアップサイズを見積もらない\n"
+
+#: pg_basebackup.c:415
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest バックアップ目録の作成を省略する\n"
+
+#: pg_basebackup.c:416
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot 一時レプリケーションスロットの作成を行わない\n"
+
+#: pg_basebackup.c:417
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" チェックサムを検証しない\n"
+
+#: pg_basebackup.c:419 pg_receivewal.c:97 pg_recvlogical.c:102
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: pg_basebackup.c:420 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"接続オプション:\n"
+
+#: pg_basebackup.c:421 pg_receivewal.c:99
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR 接続文字列\n"
+
+#: pg_basebackup.c:422 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME データベースサーバーホストまたはソケットディレクトリ\n"
+
+#: pg_basebackup.c:423 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT データベースサーバーのポート番号\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVAL\n"
+" サーバーへ送出するステータスパケットの間隔(秒単位)\n"
+
+#: pg_basebackup.c:426 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME 指定したデータベースユーザーで接続\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:103 pg_recvlogical.c:108
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password パスワードの入力を要求しない\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:104 pg_recvlogical.c:109
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password パスワード入力要求を強制(自動的に行われるはず)\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:108 pg_recvlogical.c:110
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"バグは<%s>に報告してください。\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:109 pg_recvlogical.c:111
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_basebackup.c:472
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "準備ができたパイプからの読み込みが失敗しました: %m"
+
+#: pg_basebackup.c:475 pg_basebackup.c:622 pg_basebackup.c:2170
+#: streamutil.c:444
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "先行書き込みログの位置\"%s\"をパースできませんでした"
+
+#: pg_basebackup.c:581 pg_receivewal.c:663
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "WALファイルの書き込みを終了できませんでした: %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "バックグランドプロセス用のパイプを作成できませんでした: \"%m"
+
+#: pg_basebackup.c:664
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "一時レプリケーションスロット\"%s\"を作成しました"
+
+#: pg_basebackup.c:667
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "レプリケーションスロット\"%s\"を作成していました"
+
+#: pg_basebackup.c:701
+#, c-format
+msgid "could not create background process: %m"
+msgstr "バックグラウンドプロセスを生成できませんでした: %m"
+
+#: pg_basebackup.c:710
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "バックグラウンドスレッドを生成できませんでした: %m"
+
+#: pg_basebackup.c:749
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "ディレクトリ\"%s\"は存在しますが空ではありません"
+
+#: pg_basebackup.c:755
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"にアクセスできませんでした: %m"
+
+#: pg_basebackup.c:832
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d テーブル空間 %*s"
+
+#: pg_basebackup.c:844
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d テーブル空間 (%s%-*.*s)"
+
+#: pg_basebackup.c:860
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d テーブル空間"
+
+#: pg_basebackup.c:884
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "転送速度\"%s\"は無効な値です"
+
+#: pg_basebackup.c:886
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "転送速度\"%s\"は無効です: %m"
+
+#: pg_basebackup.c:893
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "転送速度は0より大きな値でなければなりません"
+
+#: pg_basebackup.c:923
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "--max-rate の単位が不正です: \"%s\""
+
+#: pg_basebackup.c:927
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "転送速度\"%s\"がintegerの範囲を超えています"
+
+#: pg_basebackup.c:934
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "転送速度\"%s\"が範囲外です"
+
+#: pg_basebackup.c:1030
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "COPYデータストリームを取得できませんでした: %s"
+
+#: pg_basebackup.c:1047 pg_recvlogical.c:438 pg_recvlogical.c:610
+#: receivelog.c:981
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "COPYデータを読み取ることができませんでした: %s"
+
+#: pg_basebackup.c:1051
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "バックグラウンドプロセスが突然終了しました"
+
+#: pg_basebackup.c:1122
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "圧縮tarファイルには目録は出力できません"
+
+#: pg_basebackup.c:1123
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "クライアントサイド圧縮を使用して標準出力ではなくディレクトリに出力する、または %s を使用してください。"
+
+#: pg_basebackup.c:1139
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "アーカイブ\"%s\"のパースができませんでした"
+
+#: pg_basebackup.c:1140
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "tarアーカイブのみパース可能です。"
+
+#: pg_basebackup.c:1142
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "Plainフォーマットではpg_basebackupがアーカイブをパースする必要があります。"
+
+#: pg_basebackup.c:1144
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "出力ディレクトリに - を指定する際にはpg_basebackupがアーカイブをパースする必要があります。"
+
+#: pg_basebackup.c:1146
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "-Rオプションを指定する場合はpg_basebackupがアーカイブをパースする必要があります。"
+
+#: pg_basebackup.c:1357
+#, c-format
+msgid "archives must precede manifest"
+msgstr "アーカイブは目録より先にあるはずです"
+
+#: pg_basebackup.c:1372
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "不正なアーカイブ名: \"%s\""
+
+#: pg_basebackup.c:1444
+#, c-format
+msgid "unexpected payload data"
+msgstr "予期しないペイロードのデータ"
+
+#: pg_basebackup.c:1587
+#, c-format
+msgid "empty COPY message"
+msgstr "空のCOPYメッセージ"
+
+#: pg_basebackup.c:1589
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "タイプ%d、長さ%zuのCOPYメッセージのフォーマット異常"
+
+#: pg_basebackup.c:1787
+#, c-format
+msgid "incompatible server version %s"
+msgstr "非互換のサーバーバージョン \"%s\""
+
+#: pg_basebackup.c:1803
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "-X none または -X fetch でログストリーミングを無効にできます。"
+
+#: pg_basebackup.c:1871
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "バックアップターゲットはこのサーバーバージョンではサポートされません"
+
+#: pg_basebackup.c:1874
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "バックアップターゲットが使用されている場合にはリカバリ設定は出力できません"
+
+#: pg_basebackup.c:1901
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "サーバーはサーバーサイド圧縮をサポートしていません"
+
+#: pg_basebackup.c:1911
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "ベースバックアップを開始しています - チェックポイントの完了を待機中"
+
+#: pg_basebackup.c:1915
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "チェックポイントを待っています"
+
+#: pg_basebackup.c:1928 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588
+#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504
+#: streamutil.c:656 streamutil.c:701
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "レプリケーションコマンド\"%s\"を送信できませんでした: %s"
+
+#: pg_basebackup.c:1936
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "ベースバックアップを開始できませんでした: %s"
+
+#: pg_basebackup.c:1939
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "サーバーが BASE_BACKUP コマンドに期待していない応答を返しました; %d行 %d列を受信しましたが期待は %d列 %d行でした"
+
+#: pg_basebackup.c:1945
+#, c-format
+msgid "checkpoint completed"
+msgstr "チェックポイントが完了しました"
+
+#: pg_basebackup.c:1960
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "先行書き込みログの開始ポイント: タイムライン %2$u 上の %1$s"
+
+#: pg_basebackup.c:1968
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "バックアップヘッダを取得できませんでした: %s"
+
+#: pg_basebackup.c:1971
+#, c-format
+msgid "no data returned from server"
+msgstr "サーバーからデータが返されませんでした"
+
+#: pg_basebackup.c:2006
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "標準出力に書き出せるテーブル空間は1つだけですが、データベースには%d個あります"
+
+#: pg_basebackup.c:2019
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "バックグランドWAL受信処理を起動します"
+
+#: pg_basebackup.c:2101
+#, c-format
+msgid "backup failed: %s"
+msgstr "バックアップが失敗しました: %s"
+
+#: pg_basebackup.c:2104
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "サーバーから先行書き込みログの終了位置が返されませんでした"
+
+#: pg_basebackup.c:2107
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "先行書き込みログの終了ポイント: %s"
+
+#: pg_basebackup.c:2118
+#, c-format
+msgid "checksum error occurred"
+msgstr "チェックサムエラーが発生しました"
+
+#: pg_basebackup.c:2123
+#, c-format
+msgid "final receive failed: %s"
+msgstr "終端の受信に失敗しました: %s"
+
+#: pg_basebackup.c:2147
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "バックグランドプロセスがストリーミング処理が終わるまで待機します ..."
+
+#: pg_basebackup.c:2151
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "バックグランドへのパイプにコマンドを送信できませんでした: %m"
+
+#: pg_basebackup.c:2156
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "子プロセスの待機ができませんでした: %m"
+
+#: pg_basebackup.c:2158
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "子プロセス %d が終了しましたが、期待していたのは %d でした"
+
+#: pg_basebackup.c:2160 streamutil.c:91 streamutil.c:197
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2180
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "子スレッドの待機ができませんでした: %m"
+
+#: pg_basebackup.c:2185
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "子スレッドの終了ステータスを取得できませんでした: %m"
+
+#: pg_basebackup.c:2188
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "子スレッドがエラー%uで終了しました"
+
+#: pg_basebackup.c:2217
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "データをディスクに同期しています..."
+
+#: pg_basebackup.c:2242
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "backup_manifest.tmp の名前を backup_manifest に変更してください"
+
+#: pg_basebackup.c:2262
+#, c-format
+msgid "base backup completed"
+msgstr "ベースバックアップが完了しました"
+
+#: pg_basebackup.c:2351
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "不正な出力フォーマット\"%s\"、\"plain\"か\"tar\"でなければなりません"
+
+#: pg_basebackup.c:2395
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "不正な wal-method オプション\"%s\"、\"fetch\"、\"stream\" または \"none\" のいずれかでなければなりません"
+
+#: pg_basebackup.c:2425
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "不正な checkpoint の引数\"%s\"、\"fast\" または \"spreadでなければなりません"
+
+#: pg_basebackup.c:2476 pg_basebackup.c:2488 pg_basebackup.c:2510
+#: pg_basebackup.c:2522 pg_basebackup.c:2528 pg_basebackup.c:2580
+#: pg_basebackup.c:2591 pg_basebackup.c:2601 pg_basebackup.c:2607
+#: pg_basebackup.c:2614 pg_basebackup.c:2626 pg_basebackup.c:2638
+#: pg_basebackup.c:2646 pg_basebackup.c:2659 pg_basebackup.c:2665
+#: pg_basebackup.c:2674 pg_basebackup.c:2686 pg_basebackup.c:2697
+#: pg_basebackup.c:2705 pg_receivewal.c:814 pg_receivewal.c:826
+#: pg_receivewal.c:833 pg_receivewal.c:842 pg_receivewal.c:849
+#: pg_receivewal.c:859 pg_recvlogical.c:837 pg_recvlogical.c:849
+#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873
+#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894
+#: pg_recvlogical.c:901 pg_recvlogical.c:908
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細は\"%s --help\"を実行してください。"
+
+#: pg_basebackup.c:2486 pg_receivewal.c:824 pg_recvlogical.c:847
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数が多過ぎます(先頭は\"%s\"です)"
+
+#: pg_basebackup.c:2509
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "フォーマットとバックアップターゲットの両方を同時には指定できません"
+
+#: pg_basebackup.c:2521
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "出力ディレクトリかバックアップターゲットを指定する必要があります"
+
+#: pg_basebackup.c:2527
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "出力先ディレクトリとバックアップターゲットの両方を同時には指定できません"
+
+#: pg_basebackup.c:2557 pg_receivewal.c:868
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "認識できない圧縮アルゴリズム\"%s\""
+
+#: pg_basebackup.c:2563 pg_receivewal.c:875
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "不正な圧縮指定: %s"
+
+#: pg_basebackup.c:2579
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "バックアップターゲットが指定されているとクライアントサイド圧縮はできません"
+
+#: pg_basebackup.c:2590
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "tarモードでのバックアップのみが圧縮可能です"
+
+#: pg_basebackup.c:2600
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "バックアップターゲット指定されているとWALはストリーム出力できません"
+
+#: pg_basebackup.c:2606
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "標準出力への tar モードでは書き込み先行ログをストリーム出力できません"
+
+#: pg_basebackup.c:2613
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "レプリケーションスロットはWALストリーミングでのみ使用可能です"
+
+#: pg_basebackup.c:2625
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot はスロット名と同時には指定できません"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2636 pg_receivewal.c:840
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s は --slot でスロットを指定する必要があります"
+
+#: pg_basebackup.c:2644 pg_basebackup.c:2684 pg_basebackup.c:2695
+#: pg_basebackup.c:2703
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s と %s は非互換なオプションです"
+
+#: pg_basebackup.c:2658
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "WALディレクトリの位置はバックアップターゲットと同時には指定できません"
+
+#: pg_basebackup.c:2664
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "WALディレクトリの位置は plainモードでのみ指定可能です"
+
+#: pg_basebackup.c:2673
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WALディレクトリの位置は、絶対パスでなければなりません"
+
+#: pg_basebackup.c:2774
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "シンボリックリンク\"%s\"を作成できませんでした: %m"
+
+#: pg_basebackup.c:2776
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "このプラットフォームでシンボリックリンクはサポートされていません"
+
+#: pg_receivewal.c:79
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%sはPostgreSQLの先行書き込みログストリームを受信します。\n"
+"\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:84
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"オプション:\n"
+
+#: pg_receivewal.c:84
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=DIR 受信した先行書き込みログの格納ディレクトリ\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:85
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN 指定したLSNの受信後に終了\n"
+
+#: pg_receivewal.c:86 pg_recvlogical.c:89
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr "   --if-not-exists スロットの作成時に既に存在していてもエラーとしない\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:91
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop 接続断の際にループしない\n"
+
+#: pg_receivewal.c:88
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync ディスクへの安全な書き込みの待機を行わない\n"
+
+#: pg_receivewal.c:89 pg_recvlogical.c:96
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SECS\n"
+" サーバーへ送出するステータスパケットの間隔\n"
+" (デフォルト: %d)\n"
+
+#: pg_receivewal.c:92
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous 先行書き込みログを書き込み後直ちにフラッシュ\n"
+
+#: pg_receivewal.c:95
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=方式[:詳細]\n"
+" 指定のとおり圧縮\n"
+
+#: pg_receivewal.c:105
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"追加の動作:\n"
+
+#: pg_receivewal.c:106 pg_recvlogical.c:81
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr ""
+" --create-slot 新しいレプリケーションスロットを作成する\n"
+" (スロット名については --slot を参照)\n"
+
+#: pg_receivewal.c:107 pg_recvlogical.c:82
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr ""
+" --drop-slot レプリケーションスロットを削除する\n"
+" (スロット名については --slot を参照)\n"
+
+#: pg_receivewal.c:252
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "%X/%X (タイムライン %u)でセグメントが完了"
+
+#: pg_receivewal.c:259
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "%X/%X (タイムライン %u)でログのストリーミングを停止しました"
+
+#: pg_receivewal.c:275
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "%3$X/%2$Xで タイムライン%1$uに切り替えました"
+
+#: pg_receivewal.c:285
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "割り込みシグナルを受信、終了します"
+
+#: pg_receivewal.c:317
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をクローズできませんでした: %m"
+
+#: pg_receivewal.c:384
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "セグメントファイル\"%s\"のサイズ%lldが間違っています、スキップします"
+
+#: pg_receivewal.c:401
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "圧縮ファイル\"%s\"を開けませんでした: %m"
+
+#: pg_receivewal.c:404
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "圧縮ファイル\"%s\"でseekできませんでした: %m"
+
+#: pg_receivewal.c:410
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "圧縮ファイル\"%s\"を読めませんでした: %m"
+
+#: pg_receivewal.c:413
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "圧縮ファイル\"%1$s\"を読めませんでした: %3$zuバイトのうち%2$dバイトを読み込み済み"
+
+#: pg_receivewal.c:423
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "圧縮セグメントファイル\"%s\"の展開後サイズ%dが不正です、スキップします"
+
+#: pg_receivewal.c:451
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "LZ4伸張コンテキストを作成できませんでした: %s"
+
+#: pg_receivewal.c:463
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ファイル\"%s\"の読み取りに失敗しました: %m"
+
+#: pg_receivewal.c:481
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "ファイル\"%s\"を伸張できませんでした: %s"
+
+#: pg_receivewal.c:504
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "LZ4伸張コンテクストを解放きませんでした: %s"
+
+#: pg_receivewal.c:509
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "圧縮セグメントファイル\"%s\"の伸張後のサイズ%zuが不正です、スキップします"
+
+#: pg_receivewal.c:514
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "ファイル\"%s\"の確認ができません: %sによる圧縮はこのビルドではサポートされません"
+
+#: pg_receivewal.c:641
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "%X/%X (タイムライン %u)からログのストリーミングを開始"
+
+#: pg_receivewal.c:783 pg_recvlogical.c:785
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "終了位置\"%s\"をパースできませんでした"
+
+#: pg_receivewal.c:832
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "--create-slot は --drop-slot と同時には指定できません"
+
+#: pg_receivewal.c:848
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "--synchronous は --no-sync と同時には指定できません"
+
+#: pg_receivewal.c:858
+#, c-format
+msgid "no target directory specified"
+msgstr "格納先ディレクトリが指定されていません"
+
+#: pg_receivewal.c:882
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "%sによる圧縮`まだサポートされていません"
+
+#: pg_receivewal.c:924
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "スロット\"%s\"を使用するレプリケーション接続で、想定に反してデータベースが指定されています"
+
+#: pg_receivewal.c:943 pg_recvlogical.c:955
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "レプリケーションスロット\"%s\"を削除しています"
+
+#: pg_receivewal.c:954 pg_recvlogical.c:965
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "レプリケーションスロット\"%s\"を作成しています"
+
+#: pg_receivewal.c:983 pg_recvlogical.c:989
+#, c-format
+msgid "disconnected"
+msgstr "切断しました"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:987 pg_recvlogical.c:993
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "切断しました; %d秒待機して再試行します"
+
+#: pg_recvlogical.c:76
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s はPostgreSQLの論理デコードストリームを制御します。\n"
+"\n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"実行する動作:\n"
+
+#: pg_recvlogical.c:83
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr ""
+" --start レプリケーションスロットでストリーミングを開始する\n"
+" (スロット名については --slot を参照)\n"
+
+#: pg_recvlogical.c:86
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=FILE このファイルにログを受け取る、 - で標準出力\n"
+
+#: pg_recvlogical.c:87
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SECS\n"
+" 出力ファイルへのfsync時間間隔(デフォルト: %d)\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN 既存スロット内のストリーミング開始位置\n"
+
+#: pg_recvlogical.c:92
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NAME[=VALUE]\n"
+" 出力プラグインにオプションNAMEをオプション値VALUEと\n"
+" ともに渡す\n"
+
+#: pg_recvlogical.c:95
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN 出力プラグインPLUGINを使う(デフォルト: %s)\n"
+
+#: pg_recvlogical.c:98
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAME 論理レプリケーションスロットの名前\n"
+
+#: pg_recvlogical.c:99
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr " -t, --two-phase スロット作成時にプリペアドトランザクションのデコードを有効にする\n"
+
+#: pg_recvlogical.c:104
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=DBNAME 接続先データベース\n"
+
+#: pg_recvlogical.c:137
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "PrecPpg%X/%Xまでの書き込みと、%X/%X (スロット %s)までのフラッシュを確認しています"
+
+#: pg_recvlogical.c:161 receivelog.c:366
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "フィードバックパケットを送信できませんでした: %s"
+
+#: pg_recvlogical.c:229
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "%X/%X (スロット %s)からログのストリーミングを開始します"
+
+#: pg_recvlogical.c:271
+#, c-format
+msgid "streaming initiated"
+msgstr "ストリーミングを開始しました"
+
+#: pg_recvlogical.c:335
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "ロックファイル\"%s\"をオープンできませんでした: %m"
+
+#: pg_recvlogical.c:364 receivelog.c:889
+#, c-format
+msgid "invalid socket: %s"
+msgstr "無効なソケット: %s"
+
+#: pg_recvlogical.c:417 receivelog.c:917
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() が失敗しました: %m"
+
+#: pg_recvlogical.c:424 receivelog.c:967
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "WAL ストリームからデータを受信できませんでした: %s"
+
+#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011
+#: receivelog.c:1074
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "ストリーミングヘッダが小さ過ぎます: %d"
+
+#: pg_recvlogical.c:501 receivelog.c:849
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "ストリーミングヘッダを認識できませんでした: \"%c\""
+
+#: pg_recvlogical.c:555 pg_recvlogical.c:567
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "%dバイトをログファイル\"%s\"に書き込めませんでした: %m"
+
+#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "レプリケーションストリームが突然終了しました: %s"
+
+#: pg_recvlogical.c:780
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "開始位置\"%s\"をパースできませんでした"
+
+#: pg_recvlogical.c:858
+#, c-format
+msgid "no slot specified"
+msgstr "スロットが指定されていません"
+
+#: pg_recvlogical.c:865
+#, c-format
+msgid "no target file specified"
+msgstr "ターゲットファイルが指定されていません"
+
+#: pg_recvlogical.c:872
+#, c-format
+msgid "no database specified"
+msgstr "データベースが指定されていません"
+
+#: pg_recvlogical.c:879
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "少なくとも一つのアクションを指定する必要があります"
+
+#: pg_recvlogical.c:886
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "--create-slot や --start は --drop-slot と同時には指定できません"
+
+#: pg_recvlogical.c:893
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "--create-slot や --drop-slot は --startpos と同時には指定できません"
+
+#: pg_recvlogical.c:900
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos は --start が指定されているときにのみ指定可能です"
+
+#: pg_recvlogical.c:907
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phaseは--create-slotが指定されているときにのみ指定可能です"
+
+#: pg_recvlogical.c:939
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "データベース指定のレプリケーション接続が確立できませんでした"
+
+#: pg_recvlogical.c:1033
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "キープアライブで終了位置 %X/%X に到達しました "
+
+#: pg_recvlogical.c:1036
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "%X/%X のWALレコードで終了位置 %X/%X に到達しました"
+
+#: receivelog.c:68
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "アーカイブステータスファイル\"%s\"を作成できませんでした: %s"
+
+#: receivelog.c:75
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "アーカイブステータスファイル\"%s\"をクローズできませんでした: %s"
+
+#: receivelog.c:123
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "先行書き込みログファイル\"%s\"のサイズを取得できませんでした: %s"
+
+#: receivelog.c:134
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "既存の先行書き込みログファイル\"%s\"をオープンできませんでした: %s"
+
+#: receivelog.c:143
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "既存の先行書き込みログファイル\"%s\"をfsyncできませんでした: %s"
+
+#: receivelog.c:158
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "先行書き込みログファイル\"%s\"は%zdバイトですが、0または%dであるはずです"
+
+#: receivelog.c:174
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "先行書き込みログファイル\"%s\"をオープンできませんでした: %s"
+
+#: receivelog.c:208
+#, c-format
+msgid "could not determine seek position in file \"%s\": %s"
+msgstr "ファイル\"%s\"のシーク位置を取得できませんでした: %s"
+
+#: receivelog.c:223
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "\"%s\"の名前を変更しません、セグメントが完成していません"
+
+#: receivelog.c:234 receivelog.c:323 receivelog.c:694
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "ファイル\"%s\"をクローズできませんでした: %s"
+
+#: receivelog.c:295
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "サーバーがタイムライン%uに対する想定外の履歴ファイル名を通知してきました: %s"
+
+#: receivelog.c:303
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "タイムライン履歴ファイル\"%s\"を作成できませんでした: %s"
+
+#: receivelog.c:310
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "タイムライン履歴ファイル\"%s\"に書き込めませんでした: %s"
+
+#: receivelog.c:400
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "非互換のサーバーバージョン%s、クライアントは%sより古いサーバーバージョンからのストリーミングをサポートしていません"
+
+#: receivelog.c:409
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "非互換のサーバーバージョン%s、クライアントは%sより新しいサーバーバージョンからのストリーミングをサポートしていません"
+
+#: receivelog.c:514
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "システム識別子がベースバックアップとストリーミング接続の間で一致しません"
+
+#: receivelog.c:522
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "開始タイムライン%uがサーバーに存在しません"
+
+#: receivelog.c:561
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "TIMELINE_HISTORYコマンドへの想定外の応答: 受信したのは%d行%d列、想定は%d行%d列"
+
+#: receivelog.c:632
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "サーバーがタイムライン%2$uに続いて想定外のタイムライン%1$uを通知してきました"
+
+#: receivelog.c:638
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "サーバーはタイムライン%uのストリーミングを%X/%Xで停止しました、しかし次のタイムライン%uが%X/%Xから開始すると通知してきています"
+
+#: receivelog.c:678
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "レプリケーションストリームが停止ポイントより前で終了しました"
+
+#: receivelog.c:724
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "タイムライン終了後に想定外の結果セット: 受信したのは%d行%d列、想定は%d行%d列"
+
+#: receivelog.c:733
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "次のタイムラインの開始ポイント\"%s\"をパースできませんでした"
+
+#: receivelog.c:781 receivelog.c:1030 walmethods.c:1205
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "ファイル\"%s\"をfsyncできませんでした: %s"
+
+#: receivelog.c:1091
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "ファイルがオープンされていない状態で、オフセット%uに対する先行書き込みログレコードを受信しました"
+
+#: receivelog.c:1101
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "WALデータオフセット%08xを受信、想定は%08x"
+
+#: receivelog.c:1135
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "WALファイル\"%2$s\"に%1$dバイト書き込めませんでした: %3$s"
+
+#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "コピー終端パケットを送信できませんでした: %s"
+
+#: streamutil.c:159
+msgid "Password: "
+msgstr "パスワード: "
+
+#: streamutil.c:182
+#, c-format
+msgid "could not connect to server"
+msgstr "サーバーに接続できませんでした"
+
+#: streamutil.c:225
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "search_pathを消去できませんでした: %s"
+
+#: streamutil.c:241
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "integer_datetimesのサーバー設定を取得できませんでした"
+
+#: streamutil.c:248
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "integer_datetimesコンパイル時フラグがサーバーと一致しません"
+
+#: streamutil.c:299
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "WALセグメントサイズを取得できませんでした: 受信したのは%d行で%d列、想定は%d行で%d列以上"
+
+#: streamutil.c:309
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "WALセグメントサイズがパースできませんでした"
+
+#: streamutil.c:327
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "WALセグメントのサイズ指定は1MBと1GBの間の2の累乗でなければなりません、しかし対向サーバーは%dバイトと報告してきました"
+
+#: streamutil.c:372
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "グループアクセスフラグを取得できませんでした: 受信したのは%d行で%d列、想定は%d行で%d列以上"
+
+#: streamutil.c:381
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "グループアクセスフラグがパースできませんでした: %s"
+
+#: streamutil.c:424 streamutil.c:461
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "システムを識別できませんでした: 受信したのは%d行%d列、想定は%d行%d列以上"
+
+#: streamutil.c:513
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "レプリケーションスロット\"%s\"を読み取れませんでした: 受信したのは%d行%d列、想定は%d行%d列"
+
+#: streamutil.c:525
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "レプリケーションスロット\"%s\"は存在しません"
+
+#: streamutil.c:536
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "物理レプリケーションスロットが必要ですが、タイプは\"%s\"でした"
+
+#: streamutil.c:550
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "レプリケーションスロット\"%2$s\"のrestart_lsn\"%1$s\"をパースできませんでした"
+
+#: streamutil.c:667
+#, c-format
+msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "レプリケーションスロット\"%s\"を作成できませんでした: 受信したのは%d行%d列、想定は%d行%d列"
+
+#: streamutil.c:711
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "レプリケーションスロット\"%s\"を削除できませんでした: 受信したのは%d行%d列、想定は%d行%d列"
+
+#: walmethods.c:720 walmethods.c:1267
+msgid "could not compress data"
+msgstr "データを圧縮できませんでした"
+
+#: walmethods.c:749
+msgid "could not reset compression stream"
+msgstr "圧縮ストリームをリセットできませんでした"
+
+#: walmethods.c:880
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "実装エラー:tar ファイルが複数のオープンされたファイルを保持できません"
+
+#: walmethods.c:894
+msgid "could not create tar header"
+msgstr "tar ヘッダを作成できませんでした"
+
+#: walmethods.c:910 walmethods.c:951 walmethods.c:1170 walmethods.c:1183
+msgid "could not change compression parameters"
+msgstr "圧縮用パラメーターを変更できませんでした"
+
+#: walmethods.c:1055
+msgid "unlink not supported with compression"
+msgstr "圧縮モードにおける unlink はサポートしていません"
+
+#: walmethods.c:1291
+msgid "could not close compression stream"
+msgstr "圧縮ストリームをクローズできませんでした"
diff --git a/src/bin/pg_basebackup/po/ka.po b/src/bin/pg_basebackup/po/ka.po
new file mode 100644
index 0000000..82f7b89
--- /dev/null
+++ b/src/bin/pg_basebackup/po/ka.po
@@ -0,0 +1,1997 @@
+# Georgian message translation file for pg_basebackup
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_basebackup (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-25 19:48+0000\n"
+"PO-Revision-Date: 2022-09-25 22:06+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდომა: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გაფრთხილება: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტალები: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნება: "
+
+#: ../../common/compression.c:130 ../../common/compression.c:139
+#: ../../common/compression.c:148
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "ამ აგებაში %s-ით შეკუმშვის მხარდაჭრა არ არსებობს"
+
+#: ../../common/compression.c:203
+msgid "found empty string where a compression option was expected"
+msgstr "შეკუმშვის პარამეტრების მაგიერ მოწოდებული სტრიქონი ცარიელია"
+
+#: ../../common/compression.c:237
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "შეკუმშვის უცნობი პარამეტრი: \"%s\""
+
+#: ../../common/compression.c:276
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "შეკუმშვის პარამეტრ \"%s\"-ს მნიშვნელობა სჭირდება"
+
+#: ../../common/compression.c:285
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "შემუმშვის პარამეტრ \"%s\"-ის ნიშვნელობა მთელი რიცხვი უნდა იყოს"
+
+#: ../../common/compression.c:335
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "შეკუმშვის ალგორითმს \"%s\" შეკუმშვის დონე არ მიეთითება"
+
+#: ../../common/compression.c:342
+#, c-format
+msgid ""
+"compression algorithm \"%s\" expects a compression level between %d and %d "
+"(default at %d)"
+msgstr ""
+"შეკუმშვის ალგორითმის \"%s\" შეკუმშვის დონე %d-სა და %d-ს შორის უნდა იყოს "
+"(ნაგულისხმები %d)"
+
+#: ../../common/compression.c:353
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "შეკუმშვის ალგორითმს \"%s\" დამხმარე პროცესების რაოდენობა არ მიეთითება"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "არასაკმარისი მეხსიერება\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ნულოვანი მაჩვენებლის დუბლირება შეუძლებელია (შიდა შეცდომა)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#: pg_receivewal.c:380 pg_recvlogical.c:341
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ფაილი \"%s\" არ არსებობს: %m"
+
+#: ../../common/file_utils.c:166 pg_receivewal.c:303
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "საქაღალდის (%s) გახსნის შეცდომა: %m"
+
+#: ../../common/file_utils.c:200 pg_receivewal.c:532
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "საქაღალდის (%s) წაკითხვის შეცდომა: %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:447
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფაილის (%s) გახსნის შეცდომა: %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#: pg_recvlogical.c:196
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "ფაილის (%s) fsync-ის შეცდომა: %m"
+
+#: ../../common/file_utils.c:383 pg_basebackup.c:2256 walmethods.c:459
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "გადარქმევის შეცდომა %s - %s: %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "არასწორი მნიშვნელობა \"%s\" პარამეტრისთვის %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s არაა საზღვრებში %d-დან %d-მდე"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1636
+#, c-format
+msgid "out of memory"
+msgstr "არასაკმარისი მეხსიერება"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "ფაილში (%s) ჩაწერის შეცდომა: %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339
+#: pg_basebackup.c:1497 pg_basebackup.c:1706
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "ფაილის (%s) შექმნის შეცდომა: %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:635
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ფაილის (%s) დახურვის შეცდომა: %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "არქივის გაშლის მოულოდნელი მდგომარეობა"
+
+#: bbstreamer_file.c:298 pg_basebackup.c:686 pg_basebackup.c:730
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "საქაღალდის (%s) შექმნის შეცდომა: %m"
+
+#: bbstreamer_file.c:304
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "საქაღალდეზე \"%s\" წვდომების დაყენების შეცდომა: %m"
+
+#: bbstreamer_file.c:323
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "%s-დან %s-მდე სიმბმულის შექმნა შეუძლებელია: %m"
+
+#: bbstreamer_file.c:343
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "ფაილზე \"%s\" წვდომების დაყენების შეცდომა: %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "ვერ შექმნა შეკუმშული ფაილი \"%s\": %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "stdout-ის დუბლირების შეცდომა: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "გამოტანის ფაილის გახსნის შეცდომა: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "შეკუმშვის დონის დაყენების შეცდომა %d: %s"
+
+#: bbstreamer_gzip.c:116 bbstreamer_gzip.c:249
+#, c-format
+msgid "this build does not support gzip compression"
+msgstr "ამ აგებაში gzip შეკუმშვის მხარდაჭერა არ არსებობს"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "შეკუმშული ფაილში (\"%s\") ჩაწერის შეცდომა: %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "შეკუმშული ფაილის (\"%s\") დახურვის შეცდომა: %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:869
+#, c-format
+msgid "could not initialize compression library"
+msgstr "შეკუმშვის ბიბლიოთეკის ინიციალიზაციის შეცდომა"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:316
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "მონაცემების გაშლის შეცდომა: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "უცნობი მდგომარეობა აღდგენის ინფორმაციის ჩასმისას"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "lz4 შეკუმშვის კონტექსტის შექმნის შეცდომა: %s"
+
+#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298
+#, c-format
+msgid "this build does not support lz4 compression"
+msgstr "ამ აგებაში lz4 შეკუმშვის მხარდაჭერა არ არსებობს"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "lz4 თავსართის ჩაწერის შეცდოა: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:168 bbstreamer_zstd.c:210
+#, c-format
+msgid "could not compress data: %s"
+msgstr "მონაცემების შეკუმშვა შეუძლებელია: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "lz4 შეკუმშვის დასრულების შეცდომა: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "შეკუმშვის ბიბლიოთეკის ინიციალიზება ვერ მოხერხდა: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "tar ფაილის ბოლოსართი 2 ბლოკს სცდება"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "მოულოდნელი მდგომარეობა tar არქივის დამუშავებისას"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "tar-ის წევრს ცარიელი სახელი აქვს"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "COPY-ის ნაკადი ბოლო ფაილის დასრულებამდე დასრულდა"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "zstd შეკუმშვის კონტექსტის შექმნის შეცდომა"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "zstd შეკუმშვის დონის %d-ზე დაყენების შეცდომა: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "შეკუმშვის დამხმარე პროცესების რიცხვის %d-ზე დაყენების შეცდომა: %s"
+
+#: bbstreamer_zstd.c:116 bbstreamer_zstd.c:271
+#, c-format
+msgid "this build does not support zstd compression"
+msgstr "ამ აგებაში zstd შეკუმშვის მხარდაჭერა არ არსებობს"
+
+#: bbstreamer_zstd.c:262
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "zstd გაშლის კონტექსტის შექმნის შეცდომა"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "მონაცემების საქაღალდის წაშლა \"%s\""
+
+#: pg_basebackup.c:242
+#, c-format
+msgid "failed to remove data directory"
+msgstr "მონაცემების საქაღალდის წაშლის შეცდომა"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "მონაცემების საქაღალდის შემცველობის წაშლა \"%s\""
+
+#: pg_basebackup.c:248
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "მონაცემების საქაღალდის შემცველობის წაშლის შეცდომა"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "მიმდინარეობს WAL საქაღალდის წაშლა \"%s\""
+
+#: pg_basebackup.c:255
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "შეცდომა WAL საქაღალდის წაშლისას"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "მიმდინარეობს WAL საქაღალდის (\"%s\") შემცველობის წაშლა"
+
+#: pg_basebackup.c:261
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "შეცდომა WAL საქაღალდის შემცველობის წაშლისას"
+
+#: pg_basebackup.c:267
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "მონაცემების საქაღალდე \"%s\" მომხმარებლის მოთხოვნისას არ წაიშლება"
+
+#: pg_basebackup.c:270
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "WAL საქაღალდე \"%s\" მომხმარებლის მოთხოვნისას არ წაიშლება"
+
+#: pg_basebackup.c:274
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "ცხრილების სივრცის საქაღალდეების ცვლილებების დაბრუნება შეუძლებელია"
+
+#: pg_basebackup.c:326
+#, c-format
+msgid "directory name too long"
+msgstr "საქაღალდის სახელი ძალიან გრძელია"
+
+#: pg_basebackup.c:333
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "ცხრილების სივრცის მიბმაში ერთზე მეტი \"=\" ნიშანია"
+
+#: pg_basebackup.c:342
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "ცხრილების მიბმის არასწორი ფორმატი \"%s\", უნდა იყოს \"OLDDIR=NEWDIR\""
+
+#: pg_basebackup.c:351
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "ძველი საქაღალდის ბილიკი ცხრილის სივრცის მიბმაში აბსოლუტური არაა: %s"
+
+#: pg_basebackup.c:355
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "ახალი საქაღალდის ბილიკი ცხრილის სივრცის მიბმაში აბსოლუტური არაა: %s"
+
+#: pg_basebackup.c:377
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s გაშვებული PostgreSQL სერვერის მარქაფს იღებს.\n"
+"\n"
+
+#: pg_basebackup.c:379 pg_receivewal.c:81 pg_recvlogical.c:78
+#, c-format
+msgid "Usage:\n"
+msgstr "გამოყენება:\n"
+
+#: pg_basebackup.c:380 pg_receivewal.c:82 pg_recvlogical.c:79
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [პარამეტრი]...\n"
+
+#: pg_basebackup.c:381
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"პარამეტრები, რომლებიც აკონტროლებენ გამოტანას:\n"
+
+#: pg_basebackup.c:382
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=საქაღლდე იღებს ბაზის სარეზერვო ასლს საქაღალდეში\n"
+
+#: pg_basebackup.c:383
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr ""
+" -F, --format=p|t გამოტანის ფორმატი (plain (ნაგულისხმები), tar)\n"
+
+#: pg_basebackup.c:384
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE მაქსიმალური სიჩქარე მონაცემთა საქაღალდის "
+"გადასაცემისას\n"
+" (kB/s-ში, ან გამოიყენეთ სუფიქსი \"k\" ან \"M\")\n"
+
+#: pg_basebackup.c:386
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" რეპლიკაციის კონფიგურაციის ჩაწერა \n"
+
+#: pg_basebackup.c:388
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=TARGET[:DETAIL]\n"
+" სამიზნის მარქაფი(თუ კლიენტისგან განსხვავებულია)\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" ცხრილების სივრცის OLDDIR -დან NEWDIR-ში გადატანა\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr ""
+" --waldir=WALDIR წინასწარ ჩაწერადი ჟურნალის (WAL) საქაღალდის "
+"მდებარეობა\n"
+
+#: pg_basebackup.c:393
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" საჭირო WAL ფაილების მითითებული მეთოდით ჩასმა\n"
+
+#: pg_basebackup.c:395
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip შექნილი tar ფაილის შეკუმშვა\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" შეკუმშვის ჩართვა სერვერზე ან კლიენტზე, "
+"მითითებისამებრ\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none შექმნილი tar არქივი არ შეიკუმშება\n"
+
+#: pg_basebackup.c:399
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"ზოგადი პარამეტრები:\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" სწრაფი ან გაფანტული საკონტროლო წერტილები\n"
+
+#: pg_basebackup.c:402
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot რეპლიკაციის სლოტის შექმნა\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL მარქაფის ჭდის შექმნა\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean შეცდომის შემთხვევაში არ გაასუფთავო\n"
+
+#: pg_basebackup.c:405
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync არ დაველოდო ცვლილებების დისკზე უსაფრთხოდ "
+"ჩაწერას\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress მიმდინარეობის ინფორმაციის ჩვენება\n"
+
+#: pg_basebackup.c:407 pg_receivewal.c:91
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=SLOTNAME გამოსაყენებელი სლოტი\n"
+
+#: pg_basebackup.c:408 pg_receivewal.c:93 pg_recvlogical.c:100
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose დამატებითი ინფორმაციის გამოტანა\n"
+
+#: pg_basebackup.c:409 pg_receivewal.c:94 pg_recvlogical.c:101
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" მანიფესტების საკონტროლო ჯამის გამოსათვლელი "
+"ალფორითმი\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" მანიფესტში ყველა ფაილის სახელის თექვსმეტობითში "
+"კოდირება\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size მარქაფის ზომა სერვერის მხარეს არ გაიზომება\n"
+
+#: pg_basebackup.c:415
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest მარქაფის მანიფესტი არ შეიქმნება\n"
+
+#: pg_basebackup.c:416
+#, c-format
+msgid ""
+" --no-slot prevent creation of temporary replication slot\n"
+msgstr ""
+" --no-slot რეპლიკაციის დროებითი სლოტის შექმნის თავიდან "
+"აცილება\n"
+
+#: pg_basebackup.c:417
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" საკონტროლო ჯამები არ შემოწმდება\n"
+
+#: pg_basebackup.c:419 pg_receivewal.c:97 pg_recvlogical.c:102
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: pg_basebackup.c:420 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"შეერთების პარამეტრები:\n"
+
+#: pg_basebackup.c:421 pg_receivewal.c:99
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR კავშირის სტრიქონი\n"
+
+#: pg_basebackup.c:422 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME მონაცემთა ბაზის სერვერის ჰოსტის ან სოკეტის "
+"საქაღალდე\n"
+
+#: pg_basebackup.c:423 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT მონაცემთა ბაზის სერვერის პორტი\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in "
+"seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVAL=INTERVAL\n"
+" სერვერზე გაგზავნილ სტატუსის პაკეტებს შორის "
+"დაყოვნება(წამებში)\n"
+
+#: pg_basebackup.c:426 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=მომხმარებელი ბაზის მომხმარებლის სახელი\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:103 pg_recvlogical.c:108
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password არასოდეს მკითხო პაროლი\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:104 pg_recvlogical.c:109
+#, c-format
+msgid ""
+" -W, --password force password prompt (should happen "
+"automatically)\n"
+msgstr ""
+" -W, --password პაროლის ყოველთვის კითხვა (ავტომატურად უნდა "
+"ხდებოდეს)\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:108 pg_recvlogical.c:110
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდომების შესახებ მიწერეთ: %s\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:109 pg_recvlogical.c:111
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
+
+#: pg_basebackup.c:472
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "მზა ფაიფიდან წაკითხვის შეცდომა: %m"
+
+#: pg_basebackup.c:475 pg_basebackup.c:622 pg_basebackup.c:2170
+#: streamutil.c:444
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "წინასწარ-ჩაწერადი ჟურნალის მდებარეობის დამუშავების შეცდომა: %s"
+
+#: pg_basebackup.c:581 pg_receivewal.c:663
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "\"WAL\" ფაილების ჩაწერის დასრულების შეცდომა: %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "ფონური პროცესისთვის ფაიფის შექმნის შეცდომა: %m"
+
+#: pg_basebackup.c:664
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "შექმნილია რეპლიკაციის დროებითი სლოტი %s"
+
+#: pg_basebackup.c:667
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "შექმნილია რეპლიკაციის სლოტი %s"
+
+#: pg_basebackup.c:701
+#, c-format
+msgid "could not create background process: %m"
+msgstr "ფონური პროცესის შექმნის შეცდომა: %m"
+
+#: pg_basebackup.c:710
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "ფონური ნაკადის შექმნის შეცდომა: %m"
+
+#: pg_basebackup.c:749
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "საქაღალდე \"%s\" არსებობს, მაგრამ ცარიელი არაა"
+
+#: pg_basebackup.c:755
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "საქაღალდის (%s) წვდომის შეცდომა: %m"
+
+#: pg_basebackup.c:832
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s კბ (100%%), %d/%d ცხრილების სივრცე %*s"
+msgstr[1] "%*s/%s კბ (100%%), %d/%d ცხრილების სივრცე %*s"
+
+#: pg_basebackup.c:844
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s კბ (%d%%), %d/%d ცხრილების სივრცე (%s%-*.*s)"
+msgstr[1] "%*s/%s კბ (%d%%), %d/%d ცხრილების სივრცე (%s%-*.*s)"
+
+#: pg_basebackup.c:860
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s კბ (%d%%), %d/%d ცხრილების სივრცე"
+msgstr[1] "%*s/%s კბ (%d%%), %d/%d ცხრილების სივრცე"
+
+#: pg_basebackup.c:884
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "გადაცემის სიჩქარის არასწორი მნიშვნელობა: %s"
+
+#: pg_basebackup.c:886
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "გადაცემის არასწორი სიჩქარე \"%s\": %m"
+
+#: pg_basebackup.c:893
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "გადაცემის სიჩქარე ნულზე მეტი უნდა იყოს"
+
+#: pg_basebackup.c:923
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "--max-rate -ის არასწორი ერთეული: \"%s\""
+
+#: pg_basebackup.c:927
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "გადაცემის სიჩქარე მთელი რიცხვის დიაპაზონს აღემატება: %s"
+
+#: pg_basebackup.c:934
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "გადაცემის სიჩქარის მნიშვნელობა დიაპაზონს გარეთაა: %s"
+
+#: pg_basebackup.c:1030
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "\"COPY\"-ის მონაცემების ნაკადის მიღების შეცდომა: %s"
+
+#: pg_basebackup.c:1047 pg_recvlogical.c:438 pg_recvlogical.c:610
+#: receivelog.c:981
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "\"COPY\"-ის მონაცემების წაკითხვის შეცდომა: %s"
+
+#: pg_basebackup.c:1051
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "ფონური პროცესი მოულოდნელად დასრულდა"
+
+#: pg_basebackup.c:1122
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "შეკუმშულ tar ფაილში მანიფესტის შეჩურთვა შეუძლებელია"
+
+#: pg_basebackup.c:1123
+#, c-format
+msgid ""
+"Use client-side compression, send the output to a directory rather than "
+"standard output, or use %s."
+msgstr ""
+"გამოიყენეთ კლიენტის მხარეს შეკუმშვა და გააგზავნეთ გამონატანი საქაღალდეში "
+"stdout-ის მაგიერ, ან გამოიყენეთ %s."
+
+#: pg_basebackup.c:1139
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "არქივის დამუშავების შეცდომა: %s"
+
+#: pg_basebackup.c:1140
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "შესაძლებელია მხოლოდ tar არქივების დამუშავება."
+
+#: pg_basebackup.c:1142
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "Plain-ის ფორმატი არქივის დასამუშავებლად pg_basebackup-ს მოითხოვს."
+
+#: pg_basebackup.c:1144
+#, c-format
+msgid ""
+"Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr ""
+"გამოსატან საქაღალდედ - -ის მითითება არქივის დასამუშავებლად pg_basebackup-ს "
+"მოითხოვს."
+
+#: pg_basebackup.c:1146
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "-R პარამეტრს არქივის დასამუშავებლად pg_basebackup-ს მოითხოვს."
+
+#: pg_basebackup.c:1357
+#, c-format
+msgid "archives must precede manifest"
+msgstr "არქივები წინ უნდა უსწრებდეს მანიფესტს"
+
+#: pg_basebackup.c:1372
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "არქივის არასწორი სახელი: \"%s\""
+
+#: pg_basebackup.c:1444
+#, c-format
+msgid "unexpected payload data"
+msgstr "მოულოდნელი შიგთავსი"
+
+#: pg_basebackup.c:1587
+#, c-format
+msgid "empty COPY message"
+msgstr "შეტყობინება COPY ცარიელია"
+
+#: pg_basebackup.c:1589
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "არასწორი COPY შეტყობინება ტიპით %d, სიგრძე %zu"
+
+#: pg_basebackup.c:1787
+#, c-format
+msgid "incompatible server version %s"
+msgstr "სერვერის შეუთავსებელი ვერსია %s"
+
+#: pg_basebackup.c:1803
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "ჟურნალის ნაკადის გასათიშად -X none ან -X fetch გამოიყენეთ."
+
+#: pg_basebackup.c:1871
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "სერვერის ამ ვერსიას მარქაფის სამიზნის მხარდაჭერა არ გააჩნია"
+
+#: pg_basebackup.c:1874
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr ""
+"აღდგენის კონფიგურაციის ჩაწერა მაშინ, როცა მარქაფის სამიზნე გამოიყენება, "
+"შეუძლებელია"
+
+#: pg_basebackup.c:1901
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "სერვერს თავის მხარეს შეკუმშვის მხარდაჭერა არ გააჩნია"
+
+#: pg_basebackup.c:1911
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "ბაზის მარქაფის პროფესი დაიწყო. ველოდები საკონტროლო წერტილის დასასრულს"
+
+#: pg_basebackup.c:1915
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "საკონტროლო წერტილის მოლოდინი"
+
+#: pg_basebackup.c:1928 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588
+#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504
+#: streamutil.c:656 streamutil.c:701
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "რეპლიკაციის ბრძანების (\"%s\") გაგზავნის შეცდომა: %s"
+
+#: pg_basebackup.c:1936
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "ბაზის მარქაფის ინიციალიზაციის შეცდომა: %s"
+
+#: pg_basebackup.c:1939
+#, c-format
+msgid ""
+"server returned unexpected response to BASE_BACKUP command; got %d rows and "
+"%d fields, expected %d rows and %d fields"
+msgstr ""
+"სერვერმა BASE_BACKUP ბრძანებაზე მოულოდნელი პასუხი დააბრუნა; მივიღე %d "
+"მწკრივი და %d ველი, მოველოდი %d მწკრივს და %d ველს"
+
+#: pg_basebackup.c:1945
+#, c-format
+msgid "checkpoint completed"
+msgstr "საკონტროლო წერტილი დასრულებულია"
+
+#: pg_basebackup.c:1960
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "წინასწარ-ჩაწერადი ჟურნალის საწყისი წერტილი: %s დროს ხაზზე %u"
+
+#: pg_basebackup.c:1968
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "მარქაფის თავსართის მიღების შეცდომა: %s"
+
+#: pg_basebackup.c:1971
+#, c-format
+msgid "no data returned from server"
+msgstr "სერვერიდან მონაცემები არ დაბრუნებულა"
+
+#: pg_basebackup.c:2006
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr ""
+"stdout-ში მხოლოდ ერთი ცხრილების სივრცის ჩაწერა შეუძლია. ბაზას კი %d აქვს"
+
+#: pg_basebackup.c:2019
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "ფონური WAL მიმღების გაშვება"
+
+#: pg_basebackup.c:2101
+#, c-format
+msgid "backup failed: %s"
+msgstr "მარქაფის შეცდომა: %s"
+
+#: pg_basebackup.c:2104
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "სერვერიდან წინასწარ-ჩაწერადი ჟურნალის ბოლო პოზიცია არ დაბრუნებულა"
+
+#: pg_basebackup.c:2107
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "წინასწარ-ჩაწერადი ჟურნალის ბოლო წერტილი: %s"
+
+#: pg_basebackup.c:2118
+#, c-format
+msgid "checksum error occurred"
+msgstr "საკონტროლო ჯამის შეცდომა"
+
+#: pg_basebackup.c:2123
+#, c-format
+msgid "final receive failed: %s"
+msgstr "მიღების დასრულების შეცდომა: %s"
+
+#: pg_basebackup.c:2147
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "ფონური პროცესის მიერ ნაკადის დასრულების მოლოდინი ..."
+
+#: pg_basebackup.c:2151
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "ფონური ფაიფისთვის ბრძანების გაგზავნის შეცდომა: %m"
+
+#: pg_basebackup.c:2156
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "შვულეულ პროცესს ვერ დაველოდები: %m"
+
+#: pg_basebackup.c:2158
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "%d შვილი მოკვდა, მოველოდი %d"
+
+#: pg_basebackup.c:2160 streamutil.c:91 streamutil.c:197
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2180
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "შვილეულ ნაკადს ვერ დაველოდები %m"
+
+#: pg_basebackup.c:2185
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "შვილეული ნაკადის გამოსვლის სტატუსის მიღების შეცდომა: %m"
+
+#: pg_basebackup.c:2188
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "შვილეული ნაკადის შეცდომა: %u"
+
+#: pg_basebackup.c:2217
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "მონაცემების სინქრონიზაცია დისკზე ..."
+
+#: pg_basebackup.c:2242
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "backup_manifest.tmp -ის სახელის გადარქმევა backup_manifest"
+
+#: pg_basebackup.c:2262
+#, c-format
+msgid "base backup completed"
+msgstr "ბაზის მარქაფი დასრულდა"
+
+#: pg_basebackup.c:2351
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "\"%s\"-ის არასწორი გამოტანის ფორმატი. უნდა იყოს: \"plain\" ან \"tar\""
+
+#: pg_basebackup.c:2395
+#, c-format
+msgid ""
+"invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr ""
+"wal-method-ის არასწორი მნიშვნელობა: %s. უნდა იყოს \"fetch\", \"stream\" ან "
+"\"none\""
+
+#: pg_basebackup.c:2425
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr ""
+"საკონტროლო წერტილის არასწორი არგუმენტი %s: უნდა იყოს \"fast\" an \"spread\""
+
+#: pg_basebackup.c:2476 pg_basebackup.c:2488 pg_basebackup.c:2510
+#: pg_basebackup.c:2522 pg_basebackup.c:2528 pg_basebackup.c:2580
+#: pg_basebackup.c:2591 pg_basebackup.c:2601 pg_basebackup.c:2607
+#: pg_basebackup.c:2614 pg_basebackup.c:2626 pg_basebackup.c:2638
+#: pg_basebackup.c:2646 pg_basebackup.c:2659 pg_basebackup.c:2665
+#: pg_basebackup.c:2674 pg_basebackup.c:2686 pg_basebackup.c:2697
+#: pg_basebackup.c:2705 pg_receivewal.c:814 pg_receivewal.c:826
+#: pg_receivewal.c:833 pg_receivewal.c:842 pg_receivewal.c:849
+#: pg_receivewal.c:859 pg_recvlogical.c:837 pg_recvlogical.c:849
+#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873
+#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894
+#: pg_recvlogical.c:901 pg_recvlogical.c:908
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'."
+
+#: pg_basebackup.c:2486 pg_receivewal.c:824 pg_recvlogical.c:847
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")"
+
+#: pg_basebackup.c:2509
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "ერთდროულად შეუძლებელია ორივე, ფორმატის და მარქაფის სამიზნის მითითება"
+
+#: pg_basebackup.c:2521
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "გამოტანის საქაღალდის ან მარქაფის სამიზნის მითითება აუცილებელია"
+
+#: pg_basebackup.c:2527
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr ""
+"ორივე, გამოტანის საქაღალდის და მარქაფის სამიზნის მითითება ერთდროულად "
+"შეუძლებელია"
+
+#: pg_basebackup.c:2557 pg_receivewal.c:868
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "შეკუმშვის უცხო ალგორითმი: \"%s\""
+
+#: pg_basebackup.c:2563 pg_receivewal.c:875
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "შეკუმშვის არასწორი სპეციფიკაცია: %s"
+
+#: pg_basebackup.c:2579
+#, c-format
+msgid ""
+"client-side compression is not possible when a backup target is specified"
+msgstr ""
+"როცა მარქაფის სამიზნე მითითებულია, კლიენტის-მხრის შეკუმშვის მითითება "
+"შეუძლებელია"
+
+#: pg_basebackup.c:2590
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "შესაძლებელია მხოლოდ tar რეჟიმის მარქაფების შეკუმშვა"
+
+#: pg_basebackup.c:2600
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "WAL-ის ნაკადი მაშინ, როცა მარქაფის სამიზნე მითითებულია, შეუძლებელია"
+
+#: pg_basebackup.c:2606
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr ""
+"წინასწარ-ჩაწერადი ჟურნალის ნაკადის tar-ის რეჟიმში stdout-ზე გამოტანა "
+"შეუძლებელია"
+
+#: pg_basebackup.c:2613
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr ""
+"რეპლიკაციის სლოტების გამოყენება მხოლოდ WAL ნაკადთან ერთადაა შესაძლებელი"
+
+#: pg_basebackup.c:2625
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot სლოტის სახელთან ერთად არ გამოიყენება"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2636 pg_receivewal.c:840
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s-სთვის საჭიროა სლოტის მითითება --slot პარამეტრის საშუალებით"
+
+#: pg_basebackup.c:2644 pg_basebackup.c:2684 pg_basebackup.c:2695
+#: pg_basebackup.c:2703
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "პარამეტრები %s და %s შეუთავსებელია"
+
+#: pg_basebackup.c:2658
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr ""
+"WAL საქაღალდის მდებარეობა მარქაფის სამიზნესთან ერთად მითითებული არ შეიძლება "
+"იყოს"
+
+#: pg_basebackup.c:2664
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr ""
+"WAL-ის საქაღალდის მდებარეობის მითითება მხოლოდ უბრალო რეჟიმშია შესაძლებელი"
+
+#: pg_basebackup.c:2673
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL საქაღალდის მდებარეობა აბსოლუტური ბილიკი უნდა იყოს"
+
+#: pg_basebackup.c:2774
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "სიმბმულის შექმნის შეცდომა %s: %m"
+
+#: pg_basebackup.c:2776
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "სიმბმულები ამ პლატფორმაზე მხარდაჭერილი არაა"
+
+#: pg_receivewal.c:79
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL-ის ნაკადური წინასწარ-ჩაწერადი ჟურნალს ახდენს.\n"
+"\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:84
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"პარამეტრები:\n"
+
+#: pg_receivewal.c:84
+#, c-format
+msgid ""
+" -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr ""
+" -D, --directory=DIR წინასწარ-ჩაწერადი ჟურნალის ფაილების მითითებულ "
+"საქაღალდეში ჩაწერა\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:85
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN გამოსვლა მითითებული LSN-ის მიღების შემდეგ\n"
+
+#: pg_receivewal.c:86 pg_recvlogical.c:89
+#, c-format
+msgid ""
+" --if-not-exists do not error if slot already exists when creating a "
+"slot\n"
+msgstr ""
+" --if-not-exists სლოტის შექმნისას მისი არსებობის შემთხვევაში ფაქტი "
+"შეცდომად არ ჩაითვლება\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:91
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop შეერთების დაკარგვისას თავიდან არ ცდა\n"
+
+#: pg_receivewal.c:88
+#, c-format
+msgid ""
+" --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" --no-sync არ დაველოდო ცვლილებების დისკზე უსაფრთხოდ "
+"ჩაწერას\n"
+
+#: pg_receivewal.c:89 pg_recvlogical.c:96
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server "
+"(default: %d)\n"
+msgstr ""
+" -s, --status-interval=SECS\n"
+" შუალედი სერვერზე სტატუსის პაკეტების გაგზავნებს "
+"შორის (ნაგულისხმები: %d)\n"
+
+#: pg_receivewal.c:92
+#, c-format
+msgid ""
+" --synchronous flush write-ahead log immediately after writing\n"
+msgstr ""
+" --synchronous მისი ჩაწერის შემდეგ წინასწარ-ჩაწერადი ჟურნალის "
+"დაუყოვნებლივი გასუფთავება\n"
+
+#: pg_receivewal.c:95
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=მეთოდი[:წვრილმანი]\n"
+" შეკუმშვის მითითება\n"
+
+#: pg_receivewal.c:105
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"არასავალდებულო ქმედებები:\n"
+
+#: pg_receivewal.c:106 pg_recvlogical.c:81
+#, c-format
+msgid ""
+" --create-slot create a new replication slot (for the slot's name "
+"see --slot)\n"
+msgstr ""
+" --create-slot ახალი რეპლიკაციის სლოტის შექმნა (სლოტის სახელისთვის "
+"იხილეთ --slot)\n"
+
+#: pg_receivewal.c:107 pg_recvlogical.c:82
+#, c-format
+msgid ""
+" --drop-slot drop the replication slot (for the slot's name see "
+"--slot)\n"
+msgstr ""
+" --drop-slot რეპლიკაციის სლოტის გადაგდება (რეპლიკაციის "
+"სახელისთვის იხილეთ --slot)\n"
+
+#: pg_receivewal.c:252
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "სეგმენტის დასრულების მისამართია %X/%X (დროის ხაზი %u)"
+
+#: pg_receivewal.c:259
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "ჟურნალის ნაკადი შეჩერდა მისამართზე %X/%X (დროის ხაზი %u)"
+
+#: pg_receivewal.c:275
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "გადავერთე %u-ე დროის ხაზზე მისამართით %X/%X"
+
+#: pg_receivewal.c:285
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "მიღებულია შეწყვეტის სიგნალი. გამოსვლა"
+
+#: pg_receivewal.c:317
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "საქაღალდის %s-ზე დახურვის შეცდომა: %m"
+
+#: pg_receivewal.c:384
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "სეგმენტის ფაილის \"%s\" არასწორი ზომა %lld, გამოტოვება"
+
+#: pg_receivewal.c:401
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "შეკუმშული ფაილის (\"%s\") გახსნის შეცდომა: %m"
+
+#: pg_receivewal.c:404
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "შეკუმშული ფაილში (\"%s\") გადახვევის შეცდომა: %m"
+
+#: pg_receivewal.c:410
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "შეკუმშული ფაილის (\"%s\") წაკითხვის შეცდომა: %m"
+
+#: pg_receivewal.c:413
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "შეკუმშული ფაილის (\"%s\") წაკითხვის შეცდომა: წაკითხულია %d %zu-დან"
+
+#: pg_receivewal.c:423
+#, c-format
+msgid ""
+"compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "შეკუმშული სეგმენტის ფაილის \"%s\" არასწორი გაშლილი ზომა %d, გამოტოვება"
+
+#: pg_receivewal.c:451
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "lz4 შეკუმშვის კონტექსტის შექმნის შეცდომა: %s"
+
+#: pg_receivewal.c:463
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ფაილის (%s) წაკითხვის შეცდომა: %m"
+
+#: pg_receivewal.c:481
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "ფაილის (\"%s\") გაშლის შეცდომა: %s"
+
+#: pg_receivewal.c:504
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "lz4 შეკუმშვის კონტექსტის გასუფთავების შეცდომა: %s"
+
+#: pg_receivewal.c:509
+#, c-format
+msgid ""
+"compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr ""
+"შეკუმშული სეგმენტის ფაილის \"%s\" არასწორი გაშლილი ზომა %zu, გამოტოვება"
+
+#: pg_receivewal.c:514
+#, c-format
+msgid ""
+"cannot check file \"%s\": compression with %s not supported by this build"
+msgstr ""
+"ფაილის (%s) შემოწმება შეუძლებელია: ამ აგებაში %s-ით შეკუმშვა მხარდაჭერილი "
+"არაა"
+
+#: pg_receivewal.c:641
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "ჟურნალის ნაკადი დაიწყო მისამართზე %X/%X (დროის ხაზი %u)"
+
+#: pg_receivewal.c:783 pg_recvlogical.c:785
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "ბოლო პოზიციის დამუშავების შეცდომა: %s"
+
+#: pg_receivewal.c:832
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "--create-slot -ს და --drop-slot -ს ერთად ვერ გამოიყენებთ"
+
+#: pg_receivewal.c:848
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "--synchronous -ს --no-sync -თან ერთად ვერ გამოიყენებთ"
+
+#: pg_receivewal.c:858
+#, c-format
+msgid "no target directory specified"
+msgstr "სამიზნე საქაღალდე მითითებული არაა"
+
+#: pg_receivewal.c:882
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "%s-სთან დაკავშირების მხარდაჭერა ჯერ არ არსებობს"
+
+#: pg_receivewal.c:924
+#, c-format
+msgid ""
+"replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "რეპლიკაციის შეერთება სლოტით \"%s\" მოულოდნელად ბაზაზეა დამოკიდებული"
+
+#: pg_receivewal.c:943 pg_recvlogical.c:955
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "რეპლიკაციის სლოტის წაშლა: %s"
+
+#: pg_receivewal.c:954 pg_recvlogical.c:965
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "რეპლიკაციის სლოტის შექმნა \"%s\""
+
+#: pg_receivewal.c:983 pg_recvlogical.c:989
+#, c-format
+msgid "disconnected"
+msgstr "გათიშულია"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:987 pg_recvlogical.c:993
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "გათიშულია; თავიდან ცდამდე დაყოვნება %d წამია"
+
+#: pg_recvlogical.c:76
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL_ის ლოგიკური გაშიფვრის ნაკადებს აკონტროლებს.\n"
+"\n"
+" \n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"შესასრულებელი ქმედებები:\n"
+
+#: pg_recvlogical.c:83
+#, c-format
+msgid ""
+" --start start streaming in a replication slot (for the "
+"slot's name see --slot)\n"
+msgstr ""
+" --start რეპლიკაციის სლოტში ნაკადის გაშვება (სლოტის "
+"სახელისთვის იხილეთ --slot)\n"
+
+#: pg_recvlogical.c:86
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr ""
+" -f, --file=FILE ჟურნალის მითითებულ ფაილში მიღება. stdout-ისთვის -\n"
+
+#: pg_recvlogical.c:87
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: "
+"%d)\n"
+msgstr ""
+" -F --fsync-interval=SECS\n"
+" შუალედი გამოსატანი ფაილის fsync-ებს შორის "
+"(ნაგულისხმები: %d)\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid ""
+" -I, --startpos=LSN where in an existing slot should the streaming "
+"start\n"
+msgstr " -I, --startpos=LSN ნაკადის დასაწყისი არსებული სლოტისთვის\n"
+
+#: pg_recvlogical.c:92
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=სახელი[=მნიშვნელობა]\n"
+" გამოტანის დამატებისთვის მითითებული სახელის, "
+"არასავალდებულო მნიშვნელობით,\n"
+" გადაცემა\n"
+
+#: pg_recvlogical.c:95
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr ""
+" -P, --plugin=PLUGIN გამოტანის მითითებული დამატების გამოყენება "
+"(ნაგულისხმები: %s)\n"
+
+#: pg_recvlogical.c:98
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAME ლოგიკური რეპლიკაციის სლოტის სახელი\n"
+
+#: pg_recvlogical.c:99
+#, c-format
+msgid ""
+" -t, --two-phase enable decoding of prepared transactions when "
+"creating a slot\n"
+msgstr ""
+" -t, --two-phase სლოტის შექმნისას მომზადებული ტრანზაქციების "
+"დეკოდერის ჩართვა\n"
+
+#: pg_recvlogical.c:104
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=DBNAME მისაერთებელი ბაზის სახელი\n"
+
+#: pg_recvlogical.c:137
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "ჩაწერის დადასტურება %X/%X-მდე, %X/%X-მდე მოცილება (სლოტი %s)"
+
+#: pg_recvlogical.c:161 receivelog.c:366
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "უკუკავშირის პაკეტის გაგზავნის შეცდომა: %s"
+
+#: pg_recvlogical.c:229
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "ჟურნალის ნაკადის დაწყება მისამართზე %X/%X (სლოტი %s)"
+
+#: pg_recvlogical.c:271
+#, c-format
+msgid "streaming initiated"
+msgstr "ნაკადი ინიცირებულია"
+
+#: pg_recvlogical.c:335
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "ჟურნალის ფაილის გახსნის შეცდომა \"%s\": %m"
+
+#: pg_recvlogical.c:364 receivelog.c:889
+#, c-format
+msgid "invalid socket: %s"
+msgstr "არასწორი სოკეტი: %s"
+
+#: pg_recvlogical.c:417 receivelog.c:917
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s()-ის შეცდომა: %m"
+
+#: pg_recvlogical.c:424 receivelog.c:967
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "\"WAL\" ნაკადიდან მონაცემების მიღების შეცდომა: %s"
+
+#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011
+#: receivelog.c:1074
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "ნაკადის თავსართი ძალიან პატარაა: %d"
+
+#: pg_recvlogical.c:501 receivelog.c:849
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "ნაკადის უცნობი თავსართი: \"%c\""
+
+#: pg_recvlogical.c:555 pg_recvlogical.c:567
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "%d ბაიტის ჩაწერის შეცდომა ჟურნალის ფაილში \"%s\": %m"
+
+#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "რეპლიკაციის ნაკადის მოულოდნელი დასასრული: %s"
+
+#: pg_recvlogical.c:780
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "საწყისი მდებარეობის დამუშავების შეცდომა: %s"
+
+#: pg_recvlogical.c:858
+#, c-format
+msgid "no slot specified"
+msgstr "სლოტი მითითებული არაა"
+
+#: pg_recvlogical.c:865
+#, c-format
+msgid "no target file specified"
+msgstr "სამიზნე ფაილი მითითებული არაა"
+
+#: pg_recvlogical.c:872
+#, c-format
+msgid "no database specified"
+msgstr "ბაზა მითითებული არაა"
+
+#: pg_recvlogical.c:879
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "საჭიროა, სულ ცოტა, ერთი ქმედების მითითება"
+
+#: pg_recvlogical.c:886
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "--create-slot -ს და ---start-ს -drop-slot -თან ერთად ვერ გამოიყენებთ"
+
+#: pg_recvlogical.c:893
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr ""
+"--create-slot -ს და --drop-slot-ს --startpos -თან ერთად ვერ გამოიყენებთ"
+
+#: pg_recvlogical.c:900
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos -ის მითითება მხოლოდ --start -თან ერთად შეიძლება"
+
+#: pg_recvlogical.c:907
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase -ის მითითება მხოლოდ --create-slot -თან ერთად შეიძლება"
+
+#: pg_recvlogical.c:939
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "ბაზაზე-დამოკიდებული რეპლიკაციის შეერთების დამყარების შეცდომა"
+
+#: pg_recvlogical.c:1033
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "ბოლო მდებარეობა %X/%X keepalive-ის მიერ მიღწეული"
+
+#: pg_recvlogical.c:1036
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "ბოლო მდებარეობა %X/%X WAL ჩანაწერის მიერ მიღწეულია მისამართზე %X/%X"
+
+#: receivelog.c:68
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "არქივის სტატუსის ფაილის \"%s\" შექმნის შეცდომა: %s"
+
+#: receivelog.c:75
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "არქივის სტატუსის ფაილის \"%s\" დახურვის შეცდომა: %s"
+
+#: receivelog.c:123
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "წინასწარ-ჩაწერადი ჟურნალის ფაილის \"%s\" ზომის მიღების შეცდომა: %s"
+
+#: receivelog.c:134
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "წინასწარ-ჩაწერადი ჟურნალის არსებული ფაილის \"%s\" გახსნის შეცდომა: %s"
+
+#: receivelog.c:143
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr ""
+"წინასწარ-ჩაწერადი ჟურნალის არსებული ფაილის \"%s\" fsync()-ის შეცდომა: %s"
+
+#: receivelog.c:158
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] ""
+"წინასწარ-ჩაწერადი ჟურნალის ფაილს \"%s\" აქვს %zd ბაიტი. უნდა იყოს 0 ან %d"
+msgstr[1] ""
+"წინასწარ-ჩაწერადი ჟურნალის ფაილს \"%s\" აქვს %zd ბაიტი. უნდა იყოს 0 ან %d"
+
+#: receivelog.c:174
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "წინასწარ-ჩაწერადი ჟურნალის არსებული ფაილის \"%s\" გახსნის შეცდომა: %s"
+
+#: receivelog.c:208
+#, c-format
+msgid "could not determine seek position in file \"%s\": %s"
+msgstr "ფაილში %s გადახვევის მდებარეობის დადგენა შეუძლებელია: %s"
+
+#: receivelog.c:223
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "\"%s\"-ის სახელი არ შეიცვლება. სეგმენტი დაუსრულებელია"
+
+#: receivelog.c:234 receivelog.c:323 receivelog.c:694
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "ფაილის (\"%s\") დახურვის შეცდომა: %s"
+
+#: receivelog.c:295
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr ""
+"სერვერის პასუხში მოულოდნელი ისტორიის ფაილის სახელია, დროის ხაზისთვის %u: %s"
+
+#: receivelog.c:303
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "დროის ხაზის ისტორიის ფაილის (%s) შექმნის შეცდომა: %s"
+
+#: receivelog.c:310
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "დროის ხაზის ისტორიის ფაილის (%s) ჩაწერის შეცდომა: %s"
+
+#: receivelog.c:400
+#, c-format
+msgid ""
+"incompatible server version %s; client does not support streaming from "
+"server versions older than %s"
+msgstr ""
+"სერვერის შეუთავსებელი ვერსია %s: კლიენტს ნაკადის მხარდაჭერა სერვერებიდან, "
+"რომლის ვერსიაც დაბალია %s-ზე, არ გააჩნია"
+
+#: receivelog.c:409
+#, c-format
+msgid ""
+"incompatible server version %s; client does not support streaming from "
+"server versions newer than %s"
+msgstr ""
+"სერვერის შეუთავსებელი ვერსია %s: კლიენტს ნაკადის მხარდაჭერა სერვერებიდან, "
+"რომლის ვერსიაც მაღალია %s-ზე, არ გააჩნია"
+
+#: receivelog.c:514
+#, c-format
+msgid ""
+"system identifier does not match between base backup and streaming connection"
+msgstr ""
+"სისტემის იდენტიფიკატორი ბაზს მარქაფსა და ნაკადურ შეერთებას შორის არ ემთხვევა"
+
+#: receivelog.c:522
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "დაწყების დროის ხაზი %u სერვერზე არ არსებობს"
+
+#: receivelog.c:561
+#, c-format
+msgid ""
+"unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, "
+"expected %d rows and %d fields"
+msgstr ""
+"მოულოდნელი პასუხი TIMELINE_HISTORY ბრძანებაზე: მივიღე %d მწკრივი და %d ველი, "
+"ველოდებოდი %d მწკრივს და %d ველს"
+
+#: receivelog.c:632
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr ""
+"სერვერის პასუხში მოულოდნელი შემდეგი დროის ხაზია (%u), დროის ხაზის შემდეგ: %u"
+
+#: receivelog.c:638
+#, c-format
+msgid ""
+"server stopped streaming timeline %u at %X/%X, but reported next timeline %u "
+"to begin at %X/%X"
+msgstr ""
+"სერვერმა შეწყვიტა დროის ხაზის %u ნაკადი მისამართზე %X/%X, მაგრამ მოიწერა, "
+"რომ შემდეგი დროის ხაზი %u მისამართზე %X/%X იწყება"
+
+#: receivelog.c:678
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "რეპლიკაციის ნაკადი გაჩერების წერტილამდე შეწყდა"
+
+#: receivelog.c:724
+#, c-format
+msgid ""
+"unexpected result set after end-of-timeline: got %d rows and %d fields, "
+"expected %d rows and %d fields"
+msgstr ""
+"მოულოდნელი შედეგების ნაკრები დროის-ხაზის-დამთავრების შემდეგ: მივიღე %d "
+"მწკრივი და %d ველი. მოველოდი %d მწკრივს და %d ველს"
+
+#: receivelog.c:733
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "შემდეგი დროის ხაზის დაწყების წერტილის (%s) დამუშავების შეცდომა"
+
+#: receivelog.c:781 receivelog.c:1030 walmethods.c:1205
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "ფაილის (\"%s\") fsync-ის შეცდომა: %s"
+
+#: receivelog.c:1091
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr ""
+"მიღებულია წინასწარ-ჩაწერადი ჟურნალის ჩანაწერი წანაცვლებისთვის %u მაშინ, როცა "
+"ფაილები ღია არაა"
+
+#: receivelog.c:1101
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "მიღებული WAL მონაცემის წანაცვლება %08x, მოველოდი %08x"
+
+#: receivelog.c:1135
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "%d ბაიტის WAL ფაილში (\"%s\") ჩაწერის შეცდომა: %s"
+
+#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "copy-end პაკეტის გაგზავნის შეცდომა: %s"
+
+#: streamutil.c:159
+msgid "Password: "
+msgstr "პაროლი: "
+
+#: streamutil.c:182
+#, c-format
+msgid "could not connect to server"
+msgstr "სერვერთან მიერთების პრობლემა"
+
+#: streamutil.c:225
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "search_path-ის გასუფთავების პრობლემა: %s"
+
+#: streamutil.c:241
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "სერვერის პარამეტრის \"integer_datetimes\" დადგენა შეუძლებელია"
+
+#: streamutil.c:248
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "აგებისას მითითებული ალამი integer_datetimes სერვერისას არ ემთხვვევა"
+
+#: streamutil.c:299
+#, c-format
+msgid ""
+"could not fetch WAL segment size: got %d rows and %d fields, expected %d "
+"rows and %d or more fields"
+msgstr ""
+"შეცდომა WAL-ის სეგმენტის ზომის მიღებისას: მივიღე %d მწკრივი და %d ველი. "
+"მოველოდი %d მწკრივს და %d ან მეტ ველს"
+
+#: streamutil.c:309
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "WAL სეგმენტის ზომის დამუშავების შეცდომა"
+
+#: streamutil.c:327
+#, c-format
+msgid ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"remote server reported a value of %d byte"
+msgid_plural ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"remote server reported a value of %d bytes"
+msgstr[0] ""
+"WAL-ის სეგმენტის ზომა ორის ხარისხი უნდა იყოს 1 მბ-სა და 1გბ-ს შორის, მაგრამ "
+"დაშორებულმა სერვერმა %d ბაიტიანი მნიშვნელობა დააბრუნა"
+msgstr[1] ""
+"WAL-ის სეგმენტის ზომა ორის ხარისხი უნდა იყოს 1 მბ-სა და 1გბ-ს შორის, მაგრამ "
+"დაშორებულმა სერვერმა %d ბაიტიანი მნიშვნელობა დააბრუნა"
+
+#: streamutil.c:372
+#, c-format
+msgid ""
+"could not fetch group access flag: got %d rows and %d fields, expected %d "
+"rows and %d or more fields"
+msgstr ""
+"ჯგუფის წვდომის ალმის გამოთხოვის შეცდომა: მივიღე %d მწკრივი და %d ველი. "
+"მოველოდი %d მწკრივს და %d ან მეტ ველს"
+
+#: streamutil.c:381
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "ჯგუფის წვდომის ალმის დამუშავების შეცდომა: %s"
+
+#: streamutil.c:424 streamutil.c:461
+#, c-format
+msgid ""
+"could not identify system: got %d rows and %d fields, expected %d rows and "
+"%d or more fields"
+msgstr ""
+"სისტემის ამოცნობის შეცდომა: მივიღე %d მწკრივი და %d ველი. მოველოდი %d "
+"მწკრივს და %d ან მეტ ველს"
+
+#: streamutil.c:513
+#, c-format
+msgid ""
+"could not read replication slot \"%s\": got %d rows and %d fields, expected "
+"%d rows and %d fields"
+msgstr ""
+"რეპლიკაციის სლოტის (\"%s\") წაკითხვის შეცდომა: მივიღე %d მწკრივი და %d ველი. "
+"მოველოდი %d მწკრივს და %d ველს"
+
+#: streamutil.c:525
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "რეპლიკაციის სლოტი \"%s\"არ არსებობს"
+
+#: streamutil.c:536
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "მოველოდი ფიზიკური რეპლიკაციის სლოტს. მივიღე: %s"
+
+#: streamutil.c:550
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr ""
+"restart_lsn \"%s\"-ის დამუშავების შეცდომა რეპლიკაციის სლოტისთვის \"%s\""
+
+#: streamutil.c:667
+#, c-format
+msgid ""
+"could not create replication slot \"%s\": got %d rows and %d fields, "
+"expected %d rows and %d fields"
+msgstr ""
+"რეპლიკაციის სლოტის (\"%s\") შექმნის შეცდომა: მივიღე %d მწკრივი და %d ველი. "
+"მოველოდი %d მწკრივს და %d ველს"
+
+#: streamutil.c:711
+#, c-format
+msgid ""
+"could not drop replication slot \"%s\": got %d rows and %d fields, expected "
+"%d rows and %d fields"
+msgstr ""
+"რეპლიკაციის სლოტის (\"%s\") გადაგდების შეცდომა: მივიღე %d მწკრივი და %d "
+"ველი. მოველოდი %d მწკრივს და %d ველს"
+
+#: walmethods.c:720 walmethods.c:1267
+msgid "could not compress data"
+msgstr "მონაცემების შეკუმშვის შეცდომა"
+
+#: walmethods.c:749
+msgid "could not reset compression stream"
+msgstr "შეკუმშვის ნაკადის თავიდან დაწყების შეცდომა"
+
+#: walmethods.c:880
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "განხორციელების შეცდომა: tar ფაილებს ერთზე მეტი ღია ფაილი ვერ ექნებათ"
+
+#: walmethods.c:894
+msgid "could not create tar header"
+msgstr "tar-ის თავსართის შექმნის შეცდომა"
+
+#: walmethods.c:910 walmethods.c:951 walmethods.c:1170 walmethods.c:1183
+msgid "could not change compression parameters"
+msgstr "შეკუმშვის პარამეტრების შეცვლა შეუძლებელა"
+
+#: walmethods.c:1055
+msgid "unlink not supported with compression"
+msgstr "წაშლა შეკუმშვით მხარდაუჭერელია"
+
+#: walmethods.c:1291
+msgid "could not close compression stream"
+msgstr "შეკუმშვის ნაკადის დახურვის შეცდომა"
+
+#, c-format
+#~ msgid "unknown compression option \"%s\""
+#~ msgstr "შეკუმშვის უცნობი პარამეტრი: \"%s\""
+
+#, c-format
+#~ msgid "log streamer with pid %d exiting"
+#~ msgstr "ჟურნალის ნაკადის პროცესი pid-ით %d ასრულებს მუშაობას"
+
+#, c-format
+#~ msgid "could not check file \"%s\""
+#~ msgstr "ფაილის შემოწმება შეუძლებელია: %s"
+
+#, c-format
+#~ msgid "This build does not support compression with %s."
+#~ msgstr "ამ აგებაში %s-ით შეკუმშვის მხარდაჭრა არ არსებობს."
+
+#, c-format
+#~ msgid "no value specified for --compress, switching to default"
+#~ msgstr ""
+#~ "--compress -ის მნიშვნელობა მითითებული არაა. გამოიყენება ნაგულისხმები"
+
+#, c-format
+#~ msgid "could not find replication slot \"%s\""
+#~ msgstr "რეპლიკაციის სლოტი არ არსებობს: %s"
diff --git a/src/bin/pg_basebackup/po/ko.po b/src/bin/pg_basebackup/po/ko.po
new file mode 100644
index 0000000..3c12349
--- /dev/null
+++ b/src/bin/pg_basebackup/po/ko.po
@@ -0,0 +1,1917 @@
+# LANGUAGE message translation file for pg_basebackup
+# Copyright (C) 2015 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2015
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:47+0000\n"
+"PO-Revision-Date: 2023-04-06 17:17+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <kr@postgresql.org>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "상세정보: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../common/compression.c:130 ../../common/compression.c:139
+#: ../../common/compression.c:148
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "이 버전은 %s 압축 기능을 포함 하지 않고 빌드 되었습니다."
+
+#: ../../common/compression.c:203
+msgid "found empty string where a compression option was expected"
+msgstr "압축 옵션을 지정하는 자리에 빈 문자열이 있습니다."
+
+#: ../../common/compression.c:237
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "인식할 수 없는 압축 옵션: \"%s\""
+
+#: ../../common/compression.c:276
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "\"%s\" 압축 옵션에는 그 지정값이 필요합니다."
+
+#: ../../common/compression.c:285
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "\"%s\" 압축 옵션 값은 정수여야 합니다."
+
+#: ../../common/compression.c:335
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "\"%s\" 압축 알고리즘은 압축 수준을 지정할 수 없습니다."
+
+#: ../../common/compression.c:342
+#, c-format
+msgid ""
+"compression algorithm \"%s\" expects a compression level between %d and %d "
+"(default at %d)"
+msgstr ""
+"\"%s\" 압축 알고리즘은 압축 수준값으로 %d에서 %d까지만 허용함 (기본값 %d)"
+
+#: ../../common/compression.c:353
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "\"%s\" 압축 알고리즘은 병렬 작업 수를 지정할 수 없습니다."
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null 포인터를 복제할 수 없음(내부 오류)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#: pg_receivewal.c:380 pg_recvlogical.c:341
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" 파일의 상태값을 알 수 없음: %m"
+
+#: ../../common/file_utils.c:166 pg_receivewal.c:303
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 열 수 없음: %m"
+
+#: ../../common/file_utils.c:200 pg_receivewal.c:532
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 읽을 수 없음: %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:447
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파일을 열 수 없음: %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#: pg_recvlogical.c:196
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "\"%s\" 파일 fsync 실패: %m"
+
+#: ../../common/file_utils.c:383 pg_basebackup.c:2266 walmethods.c:459
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "\"%s\" 파일을 \"%s\" 파일로 이름을 바꿀 수 없음: %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "\"%s\" 값은 \"%s\" 옵션값으로 유효하지 않음"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s 값은 %d부터 %d까지 지정할 수 있습니다."
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1646
+#, c-format
+msgid "out of memory"
+msgstr "메모리 부족"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1443 pg_basebackup.c:1737
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "\"%s\" 파일 쓰기 실패: %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339
+#: pg_basebackup.c:1507 pg_basebackup.c:1716
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "\"%s\" 파일을 만들 수 없음: %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:635
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "\"%s\" 파일을 닫을 수 없음: %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "아카이브 추출 중 예상치 못한 상태값 발견"
+
+#: bbstreamer_file.c:298 pg_basebackup.c:696 pg_basebackup.c:740
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 만들 수 없음: %m"
+
+#: bbstreamer_file.c:304
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 액세스 권한을 지정할 수 없음: %m"
+
+#: bbstreamer_file.c:323
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "\"%s\" 파일을 \"%s\" 심볼릭 링크로 만들 수 없음: %m"
+
+#: bbstreamer_file.c:343
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "파일 \"%s\" 의 접근권한을 지정할 수 없음: %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "\"%s\" 압축 파일 만들기 실패: %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "stdout을 중복할 수 없음: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "출력파일을 열 수 없음: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "잘못된 압축 수위 %d: %s"
+
+#: bbstreamer_gzip.c:116 bbstreamer_gzip.c:249
+#, c-format
+msgid "this build does not support gzip compression"
+msgstr "이 버전은 gzip 압축 기능을 포함 하지 않고 빌드 되었습니다."
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "\"%s\" 압축 파일 쓰기 실패: %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "\"%s\" 압축 파일 닫기 실패: %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:869
+#, c-format
+msgid "could not initialize compression library"
+msgstr "압축 라이브러리를 초기화할 수 없음"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:316
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "압축 풀기 실패: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "복원 관련 설정을 추가 하는 도중 예상치 못한 상태 발견"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "lz4 압축 컨텍스트 정보를 생성할 수 없습니다: %s"
+
+#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298
+#, c-format
+msgid "this build does not support lz4 compression"
+msgstr "이 버전은 lz4 압축 기능을 포함 하지 않고 빌드 되었습니다."
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "lz4 헤더를 쓸 수 없음: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:168 bbstreamer_zstd.c:210
+#, c-format
+msgid "could not compress data: %s"
+msgstr "자료를 압축할 수 없음: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "lz4 압축을 끝낼 수 없음: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "압축 라이브러리를 초기화 할 수 없음: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "tar 파일 끝부분에서 2 블록이 초과됨"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "tar 아카이브 분석 중 예상치 못한 상태 발견"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "tar 맴버에 이름이 없음"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "마지막 파일을 끝내기 전에 COPY 스트림이 끝났음"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "zstd 압축 컨텍스트를 만들 수 없음"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "zstd 압축 수준을 %d 값으로 지정할 수 없음: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "압축용 병렬 작업자 수를 %d 값으로 지정할 수 없음: %s"
+
+#: bbstreamer_zstd.c:116 bbstreamer_zstd.c:271
+#, c-format
+msgid "this build does not support zstd compression"
+msgstr "이 버전은 zstd 압축 기능을 포함 하지 않고 빌드 되었습니다."
+
+#: bbstreamer_zstd.c:262
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "zstd 압축 컨텍스트를 만들 수 없음"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "\"%s\" 디렉터리를 지우는 중"
+
+#: pg_basebackup.c:242
+#, c-format
+msgid "failed to remove data directory"
+msgstr "데이터 디렉터리 삭제 실패"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "\"%s\" 데이터 디렉터리의 내용을 지우는 중"
+
+#: pg_basebackup.c:248
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "데이터 디렉터리의 내용을 지울 수 없음"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "\"%s\" WAL 디렉터리를 지우는 중"
+
+#: pg_basebackup.c:255
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "WAL 디렉터리 삭제 실패"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "\"%s\" WAL 디렉터리 내용을 지우는 중"
+
+#: pg_basebackup.c:261
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "WAL 디렉터리의 내용을 지울 수 없음"
+
+#: pg_basebackup.c:267
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "사용자 요청으로 \"%s\" 데이터 디렉터리를 지우지 않았음"
+
+#: pg_basebackup.c:270
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "사용자 요청으로 \"%s\" WAL 디렉터리를 지우지 않았음"
+
+#: pg_basebackup.c:274
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "아직 마무리 되지 않은 테이블스페이스 디렉터리 변경함"
+
+#: pg_basebackup.c:326
+#, c-format
+msgid "directory name too long"
+msgstr "디렉터리 이름이 너무 김"
+
+#: pg_basebackup.c:333
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "테이블스페이스 맵핑 하는 곳에서 \"=\" 문자가 중복 되어 있음"
+
+#: pg_basebackup.c:342
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr ""
+"\"%s\" 형식의 테이블스페이스 맵핑이 잘못 되었음, \"OLDDIR=NEWDIR\" 형식이어"
+"야 함"
+
+#: pg_basebackup.c:361
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "테이블스페이스 맵핑용 옛 디렉터리가 절대 경로가 아님: %s"
+
+#: pg_basebackup.c:365
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "테이블스페이스 맵핑용 새 디렉터리가 절대 경로가 아님: %s"
+
+#: pg_basebackup.c:387
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 운영 중인 PostgreSQL 서버에 대해서 베이스 백업을 하는 도구입니"
+"다.\n"
+"\n"
+
+#: pg_basebackup.c:389 pg_receivewal.c:81 pg_recvlogical.c:78
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_basebackup.c:390 pg_receivewal.c:82 pg_recvlogical.c:79
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [옵션]...\n"
+
+#: pg_basebackup.c:391
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"출력물을 제어야하는 옵션들:\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=디렉터리 베이스 백업 결과물이 저장될 디렉터리\n"
+
+#: pg_basebackup.c:393
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t 출력 형식 (plain (초기값), tar)\n"
+
+#: pg_basebackup.c:394
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=속도 최대 전송 속도\n"
+" (단위는 kB/s, 또는 숫자 뒤에 \"k\" 또는 \"M\" 단위 "
+"문자 지정 가능)\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" 복제를 위한 환경 설정 함\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=TARGET[:DETAIL]\n"
+" 백업 타겟 지정 (이곳 또는 다른 곳)\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=옛DIR=새DIR\n"
+" 테이블스페이스 디렉터리 새 맵핑\n"
+
+#: pg_basebackup.c:402
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALDIR 트랜잭션 로그 디렉터리 지정\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" 필요한 WAL 파일을 백업하는 방법\n"
+
+#: pg_basebackup.c:405
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip tar 출력물을 압축\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" 압축 관련 설정\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none tar 출력에서 압축 안함\n"
+
+#: pg_basebackup.c:409
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"일반 옵션들:\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" 체크포인트 방법\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot 새 복제 슬롯을 만듬\n"
+
+#: pg_basebackup.c:413
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=라벨 백업 라벨 지정\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean 오류 발생 시 정리하지 않음\n"
+
+#: pg_basebackup.c:415
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr " -N, --no-sync 디스크 쓰기 뒤 sync 작업 생략\n"
+
+#: pg_basebackup.c:416
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 진행 과정 보여줌\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:91
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=슬롯이름 지정한 복제 슬롯을 사용함\n"
+
+#: pg_basebackup.c:418 pg_receivewal.c:93 pg_recvlogical.c:100
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose 자세한 작업 메시지 보여줌\n"
+
+#: pg_basebackup.c:419 pg_receivewal.c:94 pg_recvlogical.c:101
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보 보여주고 마침\n"
+
+#: pg_basebackup.c:420
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" 사용할 manifest 체크섬 알고리즘\n"
+
+#: pg_basebackup.c:422
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" manifest 내 모든 파일 이름을 16진수 인코딩함\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size 서버측 백업 크기를 예상하지 않음\n"
+
+#: pg_basebackup.c:425
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest 백업 매니페스트 만들지 않음\n"
+
+#: pg_basebackup.c:426
+#, c-format
+msgid ""
+" --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot 임시 복제 슬롯 만들지 않음\n"
+
+#: pg_basebackup.c:427
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" 체크섬 검사 안함\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:97 pg_recvlogical.c:102
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"연결 옵션들:\n"
+
+#: pg_basebackup.c:431 pg_receivewal.c:99
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=접속문자열 서버 접속 문자열\n"
+
+#: pg_basebackup.c:432 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=호스트이름 접속할 데이터베이스 서버나 소켓 디렉터리\n"
+
+#: pg_basebackup.c:433 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=포트 데이터베이스 서버 포트 번호\n"
+
+#: pg_basebackup.c:434
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in "
+"seconds)\n"
+msgstr ""
+" -s, --status-interval=초\n"
+" 초 단위 매번 서버로 상태 패킷을 보냄\n"
+
+#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=사용자 접속할 특정 데이터베이스 사용자\n"
+
+#: pg_basebackup.c:437 pg_receivewal.c:103 pg_recvlogical.c:108
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 비밀번호 물어 보지 않음\n"
+
+#: pg_basebackup.c:438 pg_receivewal.c:104 pg_recvlogical.c:109
+#, c-format
+msgid ""
+" -W, --password force password prompt (should happen "
+"automatically)\n"
+msgstr ""
+" -W, --password 항상 비밀번호 프롬프트 보임 (자동으로 판단 함)\n"
+
+#: pg_basebackup.c:439 pg_receivewal.c:108 pg_recvlogical.c:110
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"문제점 보고 주소: <%s>\n"
+
+#: pg_basebackup.c:440 pg_receivewal.c:109 pg_recvlogical.c:111
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: pg_basebackup.c:482
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "준비된 파이프로부터 읽기 실패: %m"
+
+#: pg_basebackup.c:485 pg_basebackup.c:632 pg_basebackup.c:2180
+#: streamutil.c:444
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "트랜잭션 로그 위치 \"%s\" 분석 실패"
+
+#: pg_basebackup.c:591 pg_receivewal.c:663
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "WAL 파일 쓰기 마무리 실패: %m"
+
+#: pg_basebackup.c:641
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "백그라운드 프로세스를 위한 파이프 만들기 실패: %m"
+
+#: pg_basebackup.c:674
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "\"%s\" 임시 복제 슬롯을 만듦"
+
+#: pg_basebackup.c:677
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "\"%s\" 이름의 복제 슬롯을 만듦"
+
+#: pg_basebackup.c:711
+#, c-format
+msgid "could not create background process: %m"
+msgstr "백그라운드 프로세스 만들기 실패: %m"
+
+#: pg_basebackup.c:720
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "백그라운드 스래드 만들기 실패: %m"
+
+#: pg_basebackup.c:759
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "\"%s\" 디렉터리가 있지만 비어 있지 않음"
+
+#: pg_basebackup.c:765
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 액세스할 수 없습니다: %m"
+
+#: pg_basebackup.c:842
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d 테이블스페이스 %*s"
+
+#: pg_basebackup.c:854
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d 테이블스페이스 (%s%-*.*s)"
+
+#: pg_basebackup.c:870
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d 테이블스페이스"
+
+#: pg_basebackup.c:894
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "\"%s\" 전송 속도는 잘못된 값임"
+
+#: pg_basebackup.c:896
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "잘못된 전송 속도 \"%s\": %m"
+
+#: pg_basebackup.c:903
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "전송 속도는 0보다 커야 함"
+
+#: pg_basebackup.c:933
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "잘못된 --max-rate 단위: \"%s\""
+
+#: pg_basebackup.c:937
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "\"%s\" 전송 속도는 정수형 범위가 아님"
+
+#: pg_basebackup.c:944
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "\"%s\" 전송 속도는 범위 초과"
+
+#: pg_basebackup.c:1040
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "COPY 데이터 스트림을 사용할 수 없음: %s"
+
+#: pg_basebackup.c:1057 pg_recvlogical.c:438 pg_recvlogical.c:610
+#: receivelog.c:981
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "COPY 자료를 읽을 수 없음: %s"
+
+#: pg_basebackup.c:1061
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "백그라운드 프로세스가 예상치 않게 종료됨"
+
+#: pg_basebackup.c:1132
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "압축된 tar 파일에는 manifest를 넣을 수 없습니다."
+
+#: pg_basebackup.c:1133
+#, c-format
+msgid ""
+"Use client-side compression, send the output to a directory rather than "
+"standard output, or use %s."
+msgstr ""
+"결과물을 표준 출력으로 보내지 말고, 디렉터리로 보낸 뒤 클라이언트 측에서 압"
+"축 하거나, %s 옵션을 사용하세요."
+
+#: pg_basebackup.c:1149
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "\"%s\" 아카이브를 구문분석할 수 없음"
+
+#: pg_basebackup.c:1150
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "tar 형식만 구문분석할 수 있음"
+
+#: pg_basebackup.c:1152
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "아카이브를 분석하기 위해서는 일반 양식이어야 합니다."
+
+#: pg_basebackup.c:1154
+#, c-format
+msgid ""
+"Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "아카이브를 분석하기 위해 출력 디렉터리 이름으로 - 문자를 사용하세요."
+
+#: pg_basebackup.c:1156
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "아카이브를 분석하기 위해 -R 옵션을 사용하세요."
+
+#: pg_basebackup.c:1367
+#, c-format
+msgid "archives must precede manifest"
+msgstr "아카이브 작업은 매니페스트보다 앞서야합니다"
+
+#: pg_basebackup.c:1382
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "잘못된 아카이브 이름: \"%s\""
+
+#: pg_basebackup.c:1454
+#, c-format
+msgid "unexpected payload data"
+msgstr "비정상 payload 자료"
+
+#: pg_basebackup.c:1597
+#, c-format
+msgid "empty COPY message"
+msgstr "빈 COPY 메시지"
+
+#: pg_basebackup.c:1599
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "타입 %d의 잘못된 COPY 메시지, 길이: %zu"
+
+#: pg_basebackup.c:1797
+#, c-format
+msgid "incompatible server version %s"
+msgstr "호환하지 않는 서버 버전 %s"
+
+#: pg_basebackup.c:1813
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr ""
+"트랜잭션 로그 스트리밍을 사용하지 않으려면 -X none 또는 -X fetch 옵션을 사용"
+"하세요."
+
+#: pg_basebackup.c:1881
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "이 서버는 백업 타켓을 지원하지 않음."
+
+#: pg_basebackup.c:1884
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "백업 타겟을 사용할 때는 원 환경 설정을 기록할 수 없습니다."
+
+#: pg_basebackup.c:1911
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "이 서버는 서버 측 압축을 지원하지 않습니다"
+
+#: pg_basebackup.c:1921
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "베이스 백업을 초기화 중, 체크포인트 완료를 기다리는 중"
+
+#: pg_basebackup.c:1925
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "체크포인트가 끝나길 기다리는 중"
+
+#: pg_basebackup.c:1938 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588
+#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504
+#: streamutil.c:656 streamutil.c:701
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "\"%s\" 복제 명령을 보낼 수 없음: %s"
+
+#: pg_basebackup.c:1946
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "베이스 백업을 초기화 할 수 없음: %s"
+
+#: pg_basebackup.c:1949
+#, c-format
+msgid ""
+"server returned unexpected response to BASE_BACKUP command; got %d rows and "
+"%d fields, expected %d rows and %d fields"
+msgstr ""
+"서버가 BASE_BACKUP 명령에 대해서 잘못된 응답을 했습니다; 응답값: %d 로우, %d "
+"필드, (기대값: %d 로우, %d 필드)"
+
+#: pg_basebackup.c:1955
+#, c-format
+msgid "checkpoint completed"
+msgstr "체크포인트 완료"
+
+#: pg_basebackup.c:1970
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "트랙잭션 로그 시작 위치: %s, 타임라인: %u"
+
+#: pg_basebackup.c:1978
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "백업 헤더를 구할 수 없음: %s"
+
+#: pg_basebackup.c:1981
+#, c-format
+msgid "no data returned from server"
+msgstr "서버가 아무런 자료도 주지 않았음"
+
+#: pg_basebackup.c:2016
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr ""
+"표준 출력으로는 하나의 테이블스페이스만 쓸 수 있음, 데이터베이스는 %d 개의 테"
+"이블 스페이스가 있음"
+
+#: pg_basebackup.c:2029
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "백그라운드 WAL 수신자 시작 중"
+
+#: pg_basebackup.c:2111
+#, c-format
+msgid "backup failed: %s"
+msgstr "백업 실패: %s"
+
+#: pg_basebackup.c:2114
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "서버에서 트랜잭션 로그 마지막 위치가 수신 되지 않았음"
+
+#: pg_basebackup.c:2117
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "트랜잭션 로그 마지막 위치: %s"
+
+#: pg_basebackup.c:2128
+#, c-format
+msgid "checksum error occurred"
+msgstr "체크섬 오류 발생"
+
+#: pg_basebackup.c:2133
+#, c-format
+msgid "final receive failed: %s"
+msgstr "수신 작업 마무리 실패: %s"
+
+#: pg_basebackup.c:2157
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "스트리밍을 끝내기 위해서 백그라운드 프로세스를 기다리는 중 ..."
+
+#: pg_basebackup.c:2161
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "백그라운드 파이프로 명령을 보낼 수 없음: %m"
+
+#: pg_basebackup.c:2166
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "하위 프로세스를 기다릴 수 없음: %m"
+
+#: pg_basebackup.c:2168
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "%d 개의 하위 프로세스가 종료됨, 기대값 %d"
+
+#: pg_basebackup.c:2170 streamutil.c:91 streamutil.c:197
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2190
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "하위 스레드를 기다릴 수 없음: %m"
+
+#: pg_basebackup.c:2195
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "하위 스레드 종료 상태가 정상적이지 않음: %m"
+
+#: pg_basebackup.c:2198
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "하위 스레드가 비정상 종료됨: 오류 코드 %u"
+
+#: pg_basebackup.c:2227
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "자료를 디스크에 동기화 하는 중 ... "
+
+#: pg_basebackup.c:2252
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "backup_manifest.tmp 파일을 backup_manifest로 바꾸는 중"
+
+#: pg_basebackup.c:2272
+#, c-format
+msgid "base backup completed"
+msgstr "베이스 백업 완료"
+
+#: pg_basebackup.c:2361
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "\"%s\" 값은 잘못된 출력 형식, \"plain\" 또는 \"tar\" 만 사용 가능"
+
+#: pg_basebackup.c:2405
+#, c-format
+msgid ""
+"invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr ""
+"\"%s\" 값은 잘못된 wal-method 옵션값, \"fetch\", \"stream\" 또는 \"none\"만 "
+"사용 가능"
+
+#: pg_basebackup.c:2435
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "잘못된 체크포인트 옵션값 \"%s\", \"fast\" 또는 \"spread\"만 사용 가능"
+
+#: pg_basebackup.c:2486 pg_basebackup.c:2498 pg_basebackup.c:2520
+#: pg_basebackup.c:2532 pg_basebackup.c:2538 pg_basebackup.c:2590
+#: pg_basebackup.c:2601 pg_basebackup.c:2611 pg_basebackup.c:2617
+#: pg_basebackup.c:2624 pg_basebackup.c:2636 pg_basebackup.c:2648
+#: pg_basebackup.c:2656 pg_basebackup.c:2669 pg_basebackup.c:2675
+#: pg_basebackup.c:2684 pg_basebackup.c:2696 pg_basebackup.c:2707
+#: pg_basebackup.c:2715 pg_receivewal.c:814 pg_receivewal.c:826
+#: pg_receivewal.c:833 pg_receivewal.c:842 pg_receivewal.c:849
+#: pg_receivewal.c:859 pg_recvlogical.c:837 pg_recvlogical.c:849
+#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873
+#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894
+#: pg_recvlogical.c:901 pg_recvlogical.c:908
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "자세한 사항은 \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_basebackup.c:2496 pg_receivewal.c:824 pg_recvlogical.c:847
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 많은 명령행 인자를 지정했습니다. (처음 \"%s\")"
+
+#: pg_basebackup.c:2519
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "백업 양식과 백업 타겟을 함께 사용할 수 없음"
+
+#: pg_basebackup.c:2531
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "출력 디렉터리를 지정하거나, 백업 타겟을 지정하세요."
+
+#: pg_basebackup.c:2537
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "출력 디렉터리와 백업 타겟은 함께 지정할 수 없음"
+
+#: pg_basebackup.c:2567 pg_receivewal.c:868
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "알 수 없는 압축 알고리즘: \"%s\""
+
+#: pg_basebackup.c:2573 pg_receivewal.c:875
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "잘못된 압축 정보: %s"
+
+#: pg_basebackup.c:2589
+#, c-format
+msgid ""
+"client-side compression is not possible when a backup target is specified"
+msgstr "백업 타켓을 사용할 때는 클라이언트 측 압축을 사용할 수 없습니다."
+
+#: pg_basebackup.c:2600
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "tar 형식만 압축을 사용할 수 있음"
+
+#: pg_basebackup.c:2610
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "백업 타겟을 지정할 때는 WAL 스트리밍을 사용할 수 없습니다."
+
+#: pg_basebackup.c:2616
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "tar 방식에서 stdout으로 트랜잭션 로그 스트리밍 불가"
+
+#: pg_basebackup.c:2623
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "복제 슬롯은 WAL 스트리밍 방식에서만 사용할 수 있음"
+
+#: pg_basebackup.c:2635
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "슬롯 이름을 지정한 경우 --no-slot 옵션을 사용할 수 없음"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2646 pg_receivewal.c:840
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s 옵션은 --slot 옵션을 함께 사용해야 함"
+
+#: pg_basebackup.c:2654 pg_basebackup.c:2694 pg_basebackup.c:2705
+#: pg_basebackup.c:2713
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s 옵션과 %s 옵션은 함께 사용할 수 없음"
+
+#: pg_basebackup.c:2668
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "트랜잭션 로그 디렉터리 위치는 백업 타켓과 함께 지정할 수 없음"
+
+#: pg_basebackup.c:2674
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "트랜잭션 로그 디렉터리 위치는 plain 모드에서만 사용할 수 있음"
+
+#: pg_basebackup.c:2683
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "트랜잭션 로그 디렉터리 위치는 절대 경로여야 함"
+
+#: pg_basebackup.c:2784
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "\"%s\" 심벌릭 링크를 만들 수 없음: %m"
+
+#: pg_basebackup.c:2786
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "이 플랫폼에서는 심볼 링크가 지원되지 않음"
+
+#: pg_receivewal.c:79
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 PostgreSQL 스트리밍 트랜잭션 로그를 수신하는 도구입니다.\n"
+"\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:84
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"옵션들:\n"
+
+#: pg_receivewal.c:84
+#, c-format
+msgid ""
+" -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr ""
+" -D, --directory=DIR 지정한 디렉터리로 트랜잭션 로그 파일을 백업함\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:85
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN 지정한 LSN까지 받고 종료함\n"
+
+#: pg_receivewal.c:86 pg_recvlogical.c:89
+#, c-format
+msgid ""
+" --if-not-exists do not error if slot already exists when creating a "
+"slot\n"
+msgstr ""
+" --if-not-exists 슬롯을 새로 만들 때 이미 있어도 오류 내지 않음\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:91
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop 접속이 끊겼을 때 재연결 하지 않음\n"
+
+#: pg_receivewal.c:88
+#, c-format
+msgid ""
+" --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr " --no-sync 디스크 쓰기 뒤 sync 작업 생략\n"
+
+#: pg_receivewal.c:89 pg_recvlogical.c:96
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server "
+"(default: %d)\n"
+msgstr ""
+" -s, --status-interval=초\n"
+" 지정한 초 간격으로 서버로 상태 패킷을 보냄 (초기값: "
+"%d)\n"
+
+#: pg_receivewal.c:92
+#, c-format
+msgid ""
+" --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous 쓰기 작업 후 즉시 트랜잭션 로그를 플러시 함\n"
+
+#: pg_receivewal.c:95
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" 압축 관련 속성 지정\n"
+
+#: pg_receivewal.c:105
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"추가 기능:\n"
+
+#: pg_receivewal.c:106 pg_recvlogical.c:81
+#, c-format
+msgid ""
+" --create-slot create a new replication slot (for the slot's name "
+"see --slot)\n"
+msgstr ""
+" --create-slot 새 복제 슬롯을 만듬 (--slot 옵션에서 슬롯 이름 지"
+"정)\n"
+
+#: pg_receivewal.c:107 pg_recvlogical.c:82
+#, c-format
+msgid ""
+" --drop-slot drop the replication slot (for the slot's name see "
+"--slot)\n"
+msgstr ""
+" --drop-slot 복제 슬롯 삭제 (--slot 옵션에서 슬롯 이름 지정)\n"
+
+#: pg_receivewal.c:252
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "마무리된 세그먼트 위치: %X/%X (타임라인 %u)"
+
+#: pg_receivewal.c:259
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "로그 스트리밍 중지된 위치: %X/%X (타임라인 %u)"
+
+#: pg_receivewal.c:275
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "전환됨: 타임라인 %u, 위치 %X/%X"
+
+#: pg_receivewal.c:285
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "인터럽터 시그널을 받음, 종료함"
+
+#: pg_receivewal.c:317
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 닫을 수 없음: %m"
+
+#: pg_receivewal.c:384
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "\"%s\" 조각 파일은 잘못된 크기임: %lld, 무시함"
+
+#: pg_receivewal.c:401
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "\"%s\" 압축 파일 열기 실패: %m"
+
+#: pg_receivewal.c:404
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "\"%s\" 압축 파일 작업 위치 찾기 실패: %m"
+
+#: pg_receivewal.c:410
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "\"%s\" 압축 파일 읽기 실패: %m"
+
+#: pg_receivewal.c:413
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "\"%s\" 압축 파일을 읽을 수 없음: %d 읽음, 전체 %zu"
+
+#: pg_receivewal.c:423
+#, c-format
+msgid ""
+"compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "\"%s\" 압축 파일은 압축 풀었을 때 잘못된 크기임: %d, 무시함"
+
+#: pg_receivewal.c:451
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "LZ4 압축 컨텍스트 정보를 생성할 수 없습니다: %s"
+
+#: pg_receivewal.c:463
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "\"%s\" 파일을 읽을 수 없음: %m"
+
+#: pg_receivewal.c:481
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "\"%s\" 파일 압축 풀기 실패: %s"
+
+#: pg_receivewal.c:504
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "LZ4 압축 해제 컨텍스트 반환 실패: %s"
+
+#: pg_receivewal.c:509
+#, c-format
+msgid ""
+"compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "\"%s\" 압축된 조각 파일은 압축 풀었을 때 잘못된 크기임: %zu, 무시함"
+
+#: pg_receivewal.c:514
+#, c-format
+msgid ""
+"cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "\"%s\" 파일 검사 실패: %s 압축을 지원 안하게 빌드되었음"
+
+#: pg_receivewal.c:641
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "로그 스트리밍 시작 위치: %X/%X (타임라인 %u)"
+
+#: pg_receivewal.c:783 pg_recvlogical.c:785
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "시작 위치 구문이 잘못됨 \"%s\""
+
+#: pg_receivewal.c:832
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "--create-slot 옵션과 --drop-slot 옵션을 함께 사용할 수 없음"
+
+#: pg_receivewal.c:848
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "--synchronous 옵션과 --no-sync 옵션을 함께 사용할 수 없음"
+
+#: pg_receivewal.c:858
+#, c-format
+msgid "no target directory specified"
+msgstr "대상 디렉터리를 지정하지 않음"
+
+#: pg_receivewal.c:882
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "%s 압축을 아직 지원하지 않음"
+
+#: pg_receivewal.c:924
+#, c-format
+msgid ""
+"replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "\"%s\" 슬롯을 이용한 복제 연결은 이 데이터베이스에서 사용할 수 없음"
+
+#: pg_receivewal.c:943 pg_recvlogical.c:955
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "\"%s\" 이름의 복제 슬롯을 삭제 중"
+
+#: pg_receivewal.c:954 pg_recvlogical.c:965
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "\"%s\" 이름의 복제 슬롯을 만드는 중"
+
+#: pg_receivewal.c:983 pg_recvlogical.c:989
+#, c-format
+msgid "disconnected"
+msgstr "연결 끊김"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:987 pg_recvlogical.c:993
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "연결 끊김; 다시 연결 하기 위해 %d 초를 기다리는 중"
+
+#: pg_recvlogical.c:76
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 논리 디코딩 스트림을 제어하는 도구입니다.\n"
+"\n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"성능에 관계된 기능들:\n"
+
+#: pg_recvlogical.c:83
+#, c-format
+msgid ""
+" --start start streaming in a replication slot (for the "
+"slot's name see --slot)\n"
+msgstr ""
+" --start 복제 슬롯을 이용한 스트리밍 시작 (--slot 옵션에서 슬"
+"롯 이름 지정)\n"
+
+#: pg_recvlogical.c:86
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=파일 작업 로그를 해당 파일에 기록, 표준 출력은 -\n"
+
+#: pg_recvlogical.c:87
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: "
+"%d)\n"
+msgstr ""
+" -F --fsync-interval=초\n"
+" 지정한 초 간격으로 파일 fsync 작업을 함 (초기값: "
+"%d)\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid ""
+" -I, --startpos=LSN where in an existing slot should the streaming "
+"start\n"
+msgstr " -I, --startpos=LSN 스트리밍을 시작할 기존 슬롯 위치\n"
+
+#: pg_recvlogical.c:92
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=이름[=값]\n"
+" 출력 플러그인에서 사용할 옵션들의 옵션 이름과 그 "
+"값\n"
+
+#: pg_recvlogical.c:95
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN 사용할 출력 플러그인 (초기값: %s)\n"
+
+#: pg_recvlogical.c:98
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=슬롯이름 논리 복제 슬롯 이름\n"
+
+#: pg_recvlogical.c:99
+#, c-format
+msgid ""
+" -t, --two-phase enable decoding of prepared transactions when "
+"creating a slot\n"
+msgstr ""
+" -t, --two-phase 슬롯을 만들 때 미리 준비된 트랜잭션 디코딩 활성화\n"
+
+#: pg_recvlogical.c:104
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=디비이름 접속할 데이터베이스\n"
+
+#: pg_recvlogical.c:137
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "쓰기 확인 위치: %X/%X, 플러시 위치 %X/%X (슬롯 %s)"
+
+#: pg_recvlogical.c:161 receivelog.c:366
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "피드백 패킷을 보낼 수 없음: %s"
+
+#: pg_recvlogical.c:229
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "로그 스트리밍 시작 함, 위치: %X/%X (슬롯 %s)"
+
+#: pg_recvlogical.c:271
+#, c-format
+msgid "streaming initiated"
+msgstr "스트리밍 초기화 됨"
+
+#: pg_recvlogical.c:335
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "\"%s\" 잠금파일을 열 수 없음: %m"
+
+#: pg_recvlogical.c:364 receivelog.c:889
+#, c-format
+msgid "invalid socket: %s"
+msgstr "잘못된 소켓: %s"
+
+#: pg_recvlogical.c:417 receivelog.c:917
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 실패: %m"
+
+#: pg_recvlogical.c:424 receivelog.c:967
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "WAL 스트림에서 자료 받기 실패: %s"
+
+#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011
+#: receivelog.c:1074
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "스트리밍 헤더 크기가 너무 작음: %d"
+
+#: pg_recvlogical.c:501 receivelog.c:849
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "알 수 없는 스트리밍 헤더: \"%c\""
+
+#: pg_recvlogical.c:555 pg_recvlogical.c:567
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "%d 바이트 쓰기 실패, 대상 로그파일 \"%s\": %m"
+
+#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "복제 스트림의 예상치 못한 종료: %s"
+
+#: pg_recvlogical.c:780
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "시작 위치 구문이 잘못됨 \"%s\""
+
+#: pg_recvlogical.c:858
+#, c-format
+msgid "no slot specified"
+msgstr "슬롯을 지정하지 않았음"
+
+#: pg_recvlogical.c:865
+#, c-format
+msgid "no target file specified"
+msgstr "대상 파일을 지정하지 않았음"
+
+#: pg_recvlogical.c:872
+#, c-format
+msgid "no database specified"
+msgstr "데이터베이스 지정하지 않았음"
+
+#: pg_recvlogical.c:879
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "적어도 하나 이상의 작업 방법을 지정해야 함"
+
+#: pg_recvlogical.c:886
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr ""
+"--create-slot 옵션 또는 --start 옵션은 --drop-slot 옵션과 함께 사용할 수 없음"
+
+#: pg_recvlogical.c:893
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr ""
+" --create-slot 옵션이나 --drop-slot 옵션은 --startpos 옵션과 함께 쓸 수 없음"
+
+#: pg_recvlogical.c:900
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos 옵션은 --start 옵션과 함께 사용해야 함"
+
+#: pg_recvlogical.c:907
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase 옵션은 --create-slot 옵션을 쓸 때만 사용 가능함"
+
+#: pg_recvlogical.c:939
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "데이터베이스 의존적인 복제 연결을 할 수 없음"
+
+#: pg_recvlogical.c:1033
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "keepalive에 의해서 %X/%X 마지막 위치에 도달했음"
+
+#: pg_recvlogical.c:1036
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "%X/%X 마지막 위치가 WAL 레코드 %X/%X 위치에서 도달했음"
+
+#: receivelog.c:68
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "\"%s\" archive status 파일을 만들 수 없습니다: %s"
+
+#: receivelog.c:75
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "\"%s\" archive status 파일을 닫을 수 없습니다: %s"
+
+#: receivelog.c:123
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "\"%s\" WAL 파일 크기를 알 수 없음: %s"
+
+#: receivelog.c:134
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "이미 있는 \"%s\" 트랜잭션 로그 파일을 열 수 없음: %s"
+
+#: receivelog.c:143
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "이미 있는 \"%s\" WAL 파일 fsync 실패: %s"
+
+#: receivelog.c:158
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] ""
+"\"%s\" 트랜잭션 로그파일의 크기가 %zd 바이트임, 0 또는 %d 바이트여야 함"
+
+#: receivelog.c:174
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "\"%s\" WAL 파일을 열 수 없음: %s"
+
+#: receivelog.c:208
+#, c-format
+msgid "could not determine seek position in file \"%s\": %s"
+msgstr "\"%s\" 파일의 시작 위치를 결정할 수 없음: %s"
+
+#: receivelog.c:223
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "\"%s\" 이름 변경 실패, 세그먼트가 완료되지 않았음"
+
+#: receivelog.c:234 receivelog.c:323 receivelog.c:694
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "\"%s\" 파일을 닫을 수 없음: %s"
+
+#: receivelog.c:295
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "타임라인 %u 번을 위한 내역 파일 이름이 잘못 되었음: %s"
+
+#: receivelog.c:303
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "\"%s\" 타임라인 내역 파일을 만들 수 없음: %s"
+
+#: receivelog.c:310
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "\"%s\" 타임라인 내역 파일에 쓸 수 없음: %s"
+
+#: receivelog.c:400
+#, c-format
+msgid ""
+"incompatible server version %s; client does not support streaming from "
+"server versions older than %s"
+msgstr ""
+"%s 서버 버전은 호환되지 않음; 클라이언트는 %s 버전 보다 오래된 서버의 스트리"
+"밍은 지원하지 않음"
+
+#: receivelog.c:409
+#, c-format
+msgid ""
+"incompatible server version %s; client does not support streaming from "
+"server versions newer than %s"
+msgstr ""
+"%s 서버 버전은 호환되지 않음; 클라이언트는 %s 버전 보다 새로운 서버의 스트리"
+"밍은 지원하지 않음"
+
+#: receivelog.c:514
+#, c-format
+msgid ""
+"system identifier does not match between base backup and streaming connection"
+msgstr "시스템 식별자가 베이스 백업과 스트리밍 연결에서 서로 다름"
+
+#: receivelog.c:522
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "%u 타임라인으로 시작하는 것을 서버에서 제공 하지 않음"
+
+#: receivelog.c:561
+#, c-format
+msgid ""
+"unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, "
+"expected %d rows and %d fields"
+msgstr ""
+"TIMELINE_HISTORY 명령 결과가 잘못됨: 받은 값: 로우수 %d, 필드수 %d, 예상값: "
+"로우수 %d, 필드수 %d"
+
+#: receivelog.c:632
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "서버가 잘못된 다음 타임라인 번호 %u 보고함, 이전 타임라인 번호 %u"
+
+#: receivelog.c:638
+#, c-format
+msgid ""
+"server stopped streaming timeline %u at %X/%X, but reported next timeline %u "
+"to begin at %X/%X"
+msgstr ""
+"서버의 중지 위치: 타임라인 %u, 위치 %X/%X, 하지만 보고 받은 위치: 타임라인 "
+"%u 위치 %X/%X"
+
+#: receivelog.c:678
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "복제 스트림이 중지 위치 전에 종료 되었음"
+
+#: receivelog.c:724
+#, c-format
+msgid ""
+"unexpected result set after end-of-timeline: got %d rows and %d fields, "
+"expected %d rows and %d fields"
+msgstr ""
+"타임라인 끝에 잘못된 결과가 발견 됨: 로우수 %d, 필드수 %d / 예상값: 로우수 "
+"%d, 필드수 %d"
+
+#: receivelog.c:733
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "다음 타임라인 시작 위치 분석 실패 \"%s\""
+
+#: receivelog.c:781 receivelog.c:1030 walmethods.c:1205
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "\"%s\" 파일 fsync 실패: %s"
+
+#: receivelog.c:1091
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "%u 위치의 수신된 트랜잭션 로그 레코드에 파일을 열 수 없음"
+
+#: receivelog.c:1101
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "잘못된 WAL 자료 위치 %08x, 기대값 %08x"
+
+#: receivelog.c:1135
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "%d 바이트를 \"%s\" WAL 파일에 쓸 수 없음: %s"
+
+#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "copy-end 패킷을 보낼 수 없음: %s"
+
+#: streamutil.c:159
+msgid "Password: "
+msgstr "암호: "
+
+#: streamutil.c:182
+#, c-format
+msgid "could not connect to server"
+msgstr "서버 접속 실패"
+
+#: streamutil.c:225
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "search_path를 지울 수 없음: %s"
+
+#: streamutil.c:241
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "integer_datetimes 서버 설정을 알 수 없음"
+
+#: streamutil.c:248
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "integer_datetimes 컴파일 플래그가 서버와 일치하지 않음"
+
+#: streamutil.c:299
+#, c-format
+msgid ""
+"could not fetch WAL segment size: got %d rows and %d fields, expected %d "
+"rows and %d or more fields"
+msgstr ""
+"WAL 조각 크기 계산 실패: 로우수 %d, 필드수 %d, 예상값: 로우수 %d, 필드수 %d "
+"이상"
+
+#: streamutil.c:309
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "WAL 조각 크기 분석 못함"
+
+#: streamutil.c:327
+#, c-format
+msgid ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"remote server reported a value of %d byte"
+msgid_plural ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"remote server reported a value of %d bytes"
+msgstr[0] ""
+"WAL 조각 파일 크기는 1MB에서 1GB사이 2의 제곱 크기여야 하는데, 원격 서버는 "
+"%d 바이트입니다."
+
+#: streamutil.c:372
+#, c-format
+msgid ""
+"could not fetch group access flag: got %d rows and %d fields, expected %d "
+"rows and %d or more fields"
+msgstr ""
+"그룹 접근 플래그를 가져올 수 없음: 로우수 %d, 필드수 %d, 예상값: 로우수 %d, "
+"필드수 %d 이상"
+
+#: streamutil.c:381
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "그룹 접근 플래그를 분석 못함: %s"
+
+#: streamutil.c:424 streamutil.c:461
+#, c-format
+msgid ""
+"could not identify system: got %d rows and %d fields, expected %d rows and "
+"%d or more fields"
+msgstr ""
+"시스템을 식별할 수 없음: 로우수 %d, 필드수 %d, 예상값: 로우수 %d, 필드수 %d "
+"이상"
+
+#: streamutil.c:513
+#, c-format
+msgid ""
+"could not read replication slot \"%s\": got %d rows and %d fields, expected "
+"%d rows and %d fields"
+msgstr ""
+"\"%s\" 복제 슬롯을 읽을 수 없음: 로우수 %d, 필드수 %d, 기대값 로우수 %d, 필드"
+"수 %d"
+
+#: streamutil.c:525
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "\"%s\" 이름의 복제 슬롯이 없습니다"
+
+#: streamutil.c:536
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "물리 복제 슬롯을 사용해야 함, \"%s\" 복제 슬롯임"
+
+#: streamutil.c:550
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "\"%s\" restart_lsn 위치를 해석할 수 없음, 해당 슬롯: \"%s\""
+
+#: streamutil.c:667
+#, c-format
+msgid ""
+"could not create replication slot \"%s\": got %d rows and %d fields, "
+"expected %d rows and %d fields"
+msgstr ""
+"\"%s\" 복제 슬롯을 만들 수 없음: 로우수 %d, 필드수 %d, 기대값 로우수 %d, 필드"
+"수 %d"
+
+#: streamutil.c:711
+#, c-format
+msgid ""
+"could not drop replication slot \"%s\": got %d rows and %d fields, expected "
+"%d rows and %d fields"
+msgstr ""
+"\"%s\" 복제 슬롯을 삭제할 수 없음: 로우수 %d, 필드수 %d, 기대값 로우수 %d, 필"
+"드수 %d"
+
+#: walmethods.c:720 walmethods.c:1267
+msgid "could not compress data"
+msgstr "자료를 압축할 수 없음"
+
+#: walmethods.c:749
+msgid "could not reset compression stream"
+msgstr "압축 스트림을 리셋할 수 없음"
+
+#: walmethods.c:880
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "구현 오류: tar 파일은 하나 이상 열 수 없음"
+
+#: walmethods.c:894
+msgid "could not create tar header"
+msgstr "tar 해더를 만들 수 없음"
+
+#: walmethods.c:910 walmethods.c:951 walmethods.c:1170 walmethods.c:1183
+msgid "could not change compression parameters"
+msgstr "압축 매개 변수를 바꿀 수 없음"
+
+#: walmethods.c:1055
+msgid "unlink not supported with compression"
+msgstr "압축 상태에서 파일 삭제는 지원하지 않음"
+
+#: walmethods.c:1291
+msgid "could not close compression stream"
+msgstr "압축 스트림을 닫을 수 없음"
diff --git a/src/bin/pg_basebackup/po/ru.po b/src/bin/pg_basebackup/po/ru.po
new file mode 100644
index 0000000..7099dc6
--- /dev/null
+++ b/src/bin/pg_basebackup/po/ru.po
@@ -0,0 +1,2178 @@
+# Russian message translation file for pg_basebackup
+# Copyright (C) 2012-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-11 15:32+0300\n"
+"PO-Revision-Date: 2022-09-29 12:01+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробности: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подсказка: "
+
+#: ../../common/compression.c:130 ../../common/compression.c:139
+#: ../../common/compression.c:148
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "эта сборка программы не поддерживает сжатие %s"
+
+#: ../../common/compression.c:203
+msgid "found empty string where a compression option was expected"
+msgstr "вместо указания параметра сжатия получена пустая строка"
+
+#: ../../common/compression.c:237
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "нераспознанный параметр сжатия: \"%s\""
+
+#: ../../common/compression.c:276
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "для параметра сжатия \"%s\" требуется значение"
+
+#: ../../common/compression.c:285
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "значение параметра сжатия \"%s\" должно быть целочисленным"
+
+#: ../../common/compression.c:335
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "для алгоритма сжатия \"%s\" нельзя задать уровень сжатия"
+
+#: ../../common/compression.c:342
+#, c-format
+msgid ""
+"compression algorithm \"%s\" expects a compression level between %d and %d "
+"(default at %d)"
+msgstr ""
+"для алгоритма сжатия \"%s\" ожидается уровень сжатия от %d до %d (по "
+"умолчанию %d)"
+
+#: ../../common/compression.c:353
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "для алгоритма сжатия \"%s\" нельзя задать число потоков"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памяти\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#: pg_receivewal.c:380 pg_recvlogical.c:341
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не удалось получить информацию о файле \"%s\": %m"
+
+#: ../../common/file_utils.c:166 pg_receivewal.c:303
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не удалось открыть каталог \"%s\": %m"
+
+#: ../../common/file_utils.c:200 pg_receivewal.c:532
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не удалось прочитать каталог \"%s\": %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:447
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалось открыть файл \"%s\": %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#: pg_recvlogical.c:196
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "не удалось синхронизировать с ФС файл \"%s\": %m"
+
+#: ../../common/file_utils.c:383 pg_basebackup.c:2267 walmethods.c:459
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "не удалось переименовать файл \"%s\" в \"%s\": %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неверное значение \"%s\" для параметра %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "значение %s должно быть в диапазоне %d..%d"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1647
+#, c-format
+msgid "out of memory"
+msgstr "нехватка памяти"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1444 pg_basebackup.c:1738
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "не удалось записать в файл \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339
+#: pg_basebackup.c:1508 pg_basebackup.c:1717
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "не удалось создать файл \"%s\": %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:635
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "не удалось закрыть файл \"%s\": %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "неожиданное состояние при извлечении архива"
+
+#: bbstreamer_file.c:298 pg_basebackup.c:697 pg_basebackup.c:741
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не удалось создать каталог \"%s\": %m"
+
+#: bbstreamer_file.c:304
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "не удалось установить права для каталога \"%s\": %m"
+
+#: bbstreamer_file.c:323
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "не удалось создать символическую ссылку \"%s\" в \"%s\": %m"
+
+#: bbstreamer_file.c:343
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "не удалось установить права доступа для файла \"%s\": %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "не удалось создать сжатый файл \"%s\": %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "не удалось продублировать stdout: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "не удалось открыть выходной файл: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "не удалось установить уровень сжатия %d: %s"
+
+#: bbstreamer_gzip.c:116 bbstreamer_gzip.c:249
+#, c-format
+msgid "this build does not support gzip compression"
+msgstr "эта сборка программы не поддерживает сжатие gzip"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "не удалось записать сжатый файл \"%s\": %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "не удалось закрыть сжатый файл \"%s\": %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:869
+#, c-format
+msgid "could not initialize compression library"
+msgstr "не удалось инициализировать библиотеку сжатия"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:316
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "не удалось распаковать данные: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "неожиданное состояние при внедрении параметров восстановления"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "не удалось создать контекст сжатия lz4: %s"
+
+#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298
+#, c-format
+msgid "this build does not support lz4 compression"
+msgstr "эта сборка программы не поддерживает сжатие lz4"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "не удалось записать заголовок lz4: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:168 bbstreamer_zstd.c:210
+#, c-format
+msgid "could not compress data: %s"
+msgstr "не удалось сжать данные: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "не удалось завершить сжатие lz4: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "не удалось инициализировать библиотеку сжатия: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "окончание файла tar занимает больше 2 блоков"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "неожиданное состояние при разборе архива tar"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "пустое имя у компонента tar"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "поток COPY закончился до завершения последнего файла"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "не удалось создать контекст сжатия zstd"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "не удалось установить для zstd уровень сжатия %d: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "не удалось установить для zstd число потоков %d: %s"
+
+#: bbstreamer_zstd.c:116 bbstreamer_zstd.c:271
+#, c-format
+msgid "this build does not support zstd compression"
+msgstr "эта сборка программы не поддерживает сжатие zstd"
+
+#: bbstreamer_zstd.c:262
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "не удалось создать контекст распаковки zstd"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "удаление каталога данных \"%s\""
+
+#: pg_basebackup.c:242
+#, c-format
+msgid "failed to remove data directory"
+msgstr "ошибка при удалении каталога данных"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "удаление содержимого каталога данных \"%s\""
+
+#: pg_basebackup.c:248
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "ошибка при удалении содержимого каталога данных"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "удаление каталога WAL \"%s\""
+
+#: pg_basebackup.c:255
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "ошибка при удалении каталога WAL"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "удаление содержимого каталога WAL \"%s\""
+
+#: pg_basebackup.c:261
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "ошибка при удалении содержимого каталога WAL"
+
+#: pg_basebackup.c:267
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "каталог данных \"%s\" не был удалён по запросу пользователя"
+
+#: pg_basebackup.c:270
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "каталог WAL \"%s\" не был удалён по запросу пользователя"
+
+#: pg_basebackup.c:274
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "изменения в каталогах табличных пространств не будут отменены"
+
+#: pg_basebackup.c:326
+#, c-format
+msgid "directory name too long"
+msgstr "слишком длинное имя каталога"
+
+#: pg_basebackup.c:333
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "несколько знаков \"=\" в сопоставлении табличного пространства"
+
+#: pg_basebackup.c:342
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr ""
+"сопоставление табл. пространства записано неверно: \"%s\"; должно быть "
+"\"СТАРЫЙ_КАТАЛОГ=НОВЫЙ_КАТАЛОГ\""
+
+#: pg_basebackup.c:361
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr ""
+"старый каталог в сопоставлении табл. пространства задан не абсолютным путём: "
+"%s"
+
+#: pg_basebackup.c:365
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr ""
+"новый каталог в сопоставлении табл. пространства задан не абсолютным путём: "
+"%s"
+
+#: pg_basebackup.c:387
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s делает базовую резервную копию работающего сервера PostgreSQL.\n"
+"\n"
+
+#: pg_basebackup.c:389 pg_receivewal.c:81 pg_recvlogical.c:78
+#, c-format
+msgid "Usage:\n"
+msgstr "Использование:\n"
+
+#: pg_basebackup.c:390 pg_receivewal.c:82 pg_recvlogical.c:79
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [ПАРАМЕТР]...\n"
+
+#: pg_basebackup.c:391
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Параметры, управляющие выводом:\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=КАТАЛОГ сохранить базовую копию в указанный каталог\n"
+
+#: pg_basebackup.c:393
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr ""
+" -F, --format=p|t формат вывода (p (по умолчанию) - простой, t - "
+"tar)\n"
+
+#: pg_basebackup.c:394
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=СКОРОСТЬ макс. скорость передачи данных в целевой каталог\n"
+" (в КБ/с, либо добавьте суффикс \"k\" или \"M\")\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" записать конфигурацию для репликации\n"
+
+# well-spelled: ИНФО
+#: pg_basebackup.c:398
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=ПОЛУЧАТЕЛЬ[:ДОП_ИНФО]\n"
+" получатель копии (если отличается от client)\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=СТАРЫЙ_КАТАЛОГ=НОВЫЙ_КАТАЛОГ\n"
+" перенести табличное пространство из старого "
+"каталога\n"
+" в новый\n"
+
+#: pg_basebackup.c:402
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr ""
+" --waldir=КАТАЛОГ_WAL\n"
+" расположение каталога с журналом предзаписи\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" включить в копию требуемые файлы WAL, используя\n"
+" заданный метод\n"
+
+#: pg_basebackup.c:405
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip сжать выходной tar\n"
+
+# well-spelled: ИНФО
+#: pg_basebackup.c:406
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]МЕТОД[:ДОП_ИНФО]\n"
+" выполнять сжатие на клиенте или сервере как "
+"указано\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none не сжимать вывод tar\n"
+
+#: pg_basebackup.c:409
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Общие параметры:\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" режим быстрых или распределённых контрольных точек\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot создать слот репликации\n"
+
+#: pg_basebackup.c:413
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=МЕТКА установить метку резервной копии\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean не очищать после ошибок\n"
+
+#: pg_basebackup.c:415
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync не ждать завершения сохранения данных на диске\n"
+
+#: pg_basebackup.c:416
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress показывать прогресс операции\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:91
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=ИМЯ_СЛОТА использовать заданный слот репликации\n"
+
+#: pg_basebackup.c:418 pg_receivewal.c:93 pg_recvlogical.c:100
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose выводить подробные сообщения\n"
+
+#: pg_basebackup.c:419 pg_receivewal.c:94 pg_recvlogical.c:101
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: pg_basebackup.c:420
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" алгоритм подсчёта контрольных сумм в манифесте\n"
+
+# skip-rule: capital-letter-first
+# well-spelled: шестнадц
+#: pg_basebackup.c:422
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" записывать все имена файлов в манифесте в шестнадц. "
+"виде\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr ""
+" --no-estimate-size не рассчитывать размер копии на стороне сервера\n"
+
+#: pg_basebackup.c:425
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest отключить создание манифеста копии\n"
+
+#: pg_basebackup.c:426
+#, c-format
+msgid ""
+" --no-slot prevent creation of temporary replication slot\n"
+msgstr ""
+" --no-slot предотвратить создание временного слота репликации\n"
+
+#: pg_basebackup.c:427
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" не проверять контрольные суммы\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:97 pg_recvlogical.c:102
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Параметры подключения:\n"
+
+#: pg_basebackup.c:431 pg_receivewal.c:99
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=СТРОКА строка подключения\n"
+
+#: pg_basebackup.c:432 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=ИМЯ имя сервера баз данных или каталог сокетов\n"
+
+#: pg_basebackup.c:433 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=ПОРТ номер порта сервера БД\n"
+
+#: pg_basebackup.c:434
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in "
+"seconds)\n"
+msgstr ""
+" -s, --status-interval=ИНТЕРВАЛ\n"
+" интервал между передаваемыми серверу\n"
+" пакетами состояния (в секундах)\n"
+
+#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr ""
+" -U, --username=NAME connect as specified database user\n"
+" -U, --username=ИМЯ имя пользователя баз данных\n"
+
+#: pg_basebackup.c:437 pg_receivewal.c:103 pg_recvlogical.c:108
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password не запрашивать пароль\n"
+
+#: pg_basebackup.c:438 pg_receivewal.c:104 pg_recvlogical.c:109
+#, c-format
+msgid ""
+" -W, --password force password prompt (should happen "
+"automatically)\n"
+msgstr ""
+" -W, --password запрашивать пароль всегда (обычно не требуется)\n"
+
+#: pg_basebackup.c:439 pg_receivewal.c:108 pg_recvlogical.c:110
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках сообщайте по адресу <%s>.\n"
+
+#: pg_basebackup.c:440 pg_receivewal.c:109 pg_recvlogical.c:111
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: pg_basebackup.c:482
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "не удалось прочитать из готового канала: %m"
+
+#: pg_basebackup.c:485 pg_basebackup.c:632 pg_basebackup.c:2181
+#: streamutil.c:444
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "не удалось разобрать положение в журнале предзаписи \"%s\""
+
+#: pg_basebackup.c:591 pg_receivewal.c:663
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "не удалось завершить запись файлов WAL: %m"
+
+#: pg_basebackup.c:641
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "не удалось создать канал для фонового процесса: %m"
+
+#: pg_basebackup.c:675
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "создан временный слот репликации \"%s\""
+
+#: pg_basebackup.c:678
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "создан слот репликации \"%s\""
+
+#: pg_basebackup.c:712
+#, c-format
+msgid "could not create background process: %m"
+msgstr "не удалось создать фоновый процесс: %m"
+
+#: pg_basebackup.c:721
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "не удалось создать фоновый поток выполнения: %m"
+
+#: pg_basebackup.c:760
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "каталог \"%s\" существует, но он не пуст"
+
+#: pg_basebackup.c:766
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "ошибка доступа к каталогу \"%s\": %m"
+
+#: pg_basebackup.c:843
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s КБ (100%%), табличное пространство %d/%d %*s"
+msgstr[1] "%*s/%s КБ (100%%), табличное пространство %d/%d %*s"
+msgstr[2] "%*s/%s КБ (100%%), табличное пространство %d/%d %*s"
+
+#: pg_basebackup.c:855
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s КБ (%d%%), табличное пространство %d/%d (%s%-*.*s)"
+msgstr[1] "%*s/%s КБ (%d%%), табличное пространство %d/%d (%s%-*.*s)"
+msgstr[2] "%*s/%s КБ (%d%%), табличное пространство %d/%d (%s%-*.*s)"
+
+#: pg_basebackup.c:871
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s КБ (%d%%), табличное пространство %d/%d"
+msgstr[1] "%*s/%s КБ (%d%%), табличное пространство %d/%d"
+msgstr[2] "%*s/%s КБ (%d%%), табличное пространство %d/%d"
+
+#: pg_basebackup.c:895
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "неверное значение (\"%s\") для скорости передачи данных"
+
+#: pg_basebackup.c:897
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "неверная скорость передачи данных \"%s\": %m"
+
+#: pg_basebackup.c:904
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "скорость передачи должна быть больше 0"
+
+#: pg_basebackup.c:934
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "неверная единица измерения в --max-rate: \"%s\""
+
+#: pg_basebackup.c:938
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "скорость передачи \"%s\" вне целочисленного диапазона"
+
+#: pg_basebackup.c:945
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "скорость передачи \"%s\" вне диапазона"
+
+#: pg_basebackup.c:1041
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "не удалось получить поток данных COPY: %s"
+
+#: pg_basebackup.c:1058 pg_recvlogical.c:438 pg_recvlogical.c:610
+#: receivelog.c:981
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "не удалось прочитать данные COPY: %s"
+
+#: pg_basebackup.c:1062
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "фоновый процесс завершился неожиданно"
+
+#: pg_basebackup.c:1133
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "манифест нельзя внедрить в сжатый архив tar"
+
+#: pg_basebackup.c:1134
+#, c-format
+msgid ""
+"Use client-side compression, send the output to a directory rather than "
+"standard output, or use %s."
+msgstr ""
+"Примените сжатие на стороне клиента, передайте вывод в каталог, а не в "
+"стандартный вывод, или используйте %s."
+
+#: pg_basebackup.c:1150
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "обработать архив \"%s\" невозможно"
+
+#: pg_basebackup.c:1151
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "Возможна обработка только архивов tar."
+
+#: pg_basebackup.c:1153
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr ""
+"Когда используется простой формат, программа pg_basebackup должна обработать "
+"архив."
+
+#: pg_basebackup.c:1155
+#, c-format
+msgid ""
+"Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr ""
+"Когда в качестве выходного каталога используется \"-\", программа "
+"pg_basebackup должна обработать архив."
+
+#: pg_basebackup.c:1157
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr ""
+"Когда используется ключ -R, программа pg_basebackup должна обработать архив."
+
+#: pg_basebackup.c:1368
+#, c-format
+msgid "archives must precede manifest"
+msgstr "архивы должны предшествовать манифесту"
+
+#: pg_basebackup.c:1383
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "неверное имя архива: \"%s\""
+
+#: pg_basebackup.c:1455
+#, c-format
+msgid "unexpected payload data"
+msgstr "неожиданно получены данные"
+
+#: pg_basebackup.c:1598
+#, c-format
+msgid "empty COPY message"
+msgstr "пустое сообщение COPY"
+
+#: pg_basebackup.c:1600
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "неправильное сообщение COPY типа %d, длины %zu"
+
+#: pg_basebackup.c:1798
+#, c-format
+msgid "incompatible server version %s"
+msgstr "несовместимая версия сервера %s"
+
+#: pg_basebackup.c:1814
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "Укажите -X none или -X fetch для отключения трансляции журнала."
+
+#: pg_basebackup.c:1882
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "получатели копий не поддерживаются данной версией сервера"
+
+#: pg_basebackup.c:1885
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr ""
+"при использовании получателя копии записать конфигурацию восстановления "
+"нельзя"
+
+#: pg_basebackup.c:1912
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "сервер не поддерживает сжатие на стороне сервера"
+
+#: pg_basebackup.c:1922
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr ""
+"начинается базовое резервное копирование, ожидается завершение контрольной "
+"точки"
+
+#: pg_basebackup.c:1926
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "ожидание контрольной точки"
+
+#: pg_basebackup.c:1939 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588
+#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504
+#: streamutil.c:656 streamutil.c:701
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "не удалось передать команду репликации \"%s\": %s"
+
+#: pg_basebackup.c:1947
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "не удалось инициализировать базовое резервное копирование: %s"
+
+#: pg_basebackup.c:1950
+#, c-format
+msgid ""
+"server returned unexpected response to BASE_BACKUP command; got %d rows and "
+"%d fields, expected %d rows and %d fields"
+msgstr ""
+"сервер вернул неожиданный ответ на команду BASE_BACKUP; получено строк: %d, "
+"полей: %d, а ожидалось строк: %d, полей: %d"
+
+#: pg_basebackup.c:1956
+#, c-format
+msgid "checkpoint completed"
+msgstr "контрольная точка завершена"
+
+#: pg_basebackup.c:1971
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "стартовая точка в журнале предзаписи: %s на линии времени %u"
+
+#: pg_basebackup.c:1979
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "не удалось получить заголовок резервной копии: %s"
+
+#: pg_basebackup.c:1982
+#, c-format
+msgid "no data returned from server"
+msgstr "сервер не вернул данные"
+
+#: pg_basebackup.c:2017
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr ""
+"в stdout можно вывести только одно табличное пространство, всего в СУБД их %d"
+
+#: pg_basebackup.c:2030
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "запуск фонового процесса считывания WAL"
+
+#: pg_basebackup.c:2112
+#, c-format
+msgid "backup failed: %s"
+msgstr "ошибка при создании копии: %s"
+
+#: pg_basebackup.c:2115
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "сервер не передал конечную позицию в журнале предзаписи"
+
+#: pg_basebackup.c:2118
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "конечная точка в журнале предзаписи: %s"
+
+#: pg_basebackup.c:2129
+#, c-format
+msgid "checksum error occurred"
+msgstr "выявлена ошибка контрольной суммы"
+
+#: pg_basebackup.c:2134
+#, c-format
+msgid "final receive failed: %s"
+msgstr "ошибка в конце передачи: %s"
+
+#: pg_basebackup.c:2158
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "ожидание завершения потоковой передачи фоновым процессом..."
+
+#: pg_basebackup.c:2162
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "не удалось отправить команду в канал фонового процесса: %m"
+
+#: pg_basebackup.c:2167
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "сбой при ожидании дочернего процесса: %m"
+
+#: pg_basebackup.c:2169
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "завершился дочерний процесс %d вместо ожидаемого %d"
+
+#: pg_basebackup.c:2171 streamutil.c:91 streamutil.c:197
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2191
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "сбой при ожидании дочернего потока: %m"
+
+#: pg_basebackup.c:2196
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "не удалось получить состояние завершения дочернего потока: %m"
+
+#: pg_basebackup.c:2199
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "дочерний поток завершился с ошибкой %u"
+
+#: pg_basebackup.c:2228
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "сохранение данных на диске..."
+
+#: pg_basebackup.c:2253
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "переименование backup_manifest.tmp в backup_manifest"
+
+#: pg_basebackup.c:2273
+#, c-format
+msgid "base backup completed"
+msgstr "базовое резервное копирование завершено"
+
+#: pg_basebackup.c:2362
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "неверный формат вывода \"%s\", должен быть \"plain\" или \"tar\""
+
+#: pg_basebackup.c:2406
+#, c-format
+msgid ""
+"invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr ""
+"неверный аргумент для wal-method — \"%s\", допускается только \"fetch\", "
+"\"stream\" или \"none\""
+
+#: pg_basebackup.c:2436
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr ""
+"неверный аргумент режима контрольных точек \"%s\"; должен быть \"fast\" или "
+"\"spread\""
+
+#: pg_basebackup.c:2487 pg_basebackup.c:2499 pg_basebackup.c:2521
+#: pg_basebackup.c:2533 pg_basebackup.c:2539 pg_basebackup.c:2591
+#: pg_basebackup.c:2602 pg_basebackup.c:2612 pg_basebackup.c:2618
+#: pg_basebackup.c:2625 pg_basebackup.c:2637 pg_basebackup.c:2649
+#: pg_basebackup.c:2657 pg_basebackup.c:2670 pg_basebackup.c:2676
+#: pg_basebackup.c:2685 pg_basebackup.c:2697 pg_basebackup.c:2708
+#: pg_basebackup.c:2716 pg_receivewal.c:814 pg_receivewal.c:826
+#: pg_receivewal.c:833 pg_receivewal.c:842 pg_receivewal.c:849
+#: pg_receivewal.c:859 pg_recvlogical.c:837 pg_recvlogical.c:849
+#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873
+#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894
+#: pg_recvlogical.c:901 pg_recvlogical.c:908
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Для дополнительной информации попробуйте \"%s --help\"."
+
+#: pg_basebackup.c:2497 pg_receivewal.c:824 pg_recvlogical.c:847
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "слишком много аргументов командной строки (первый: \"%s\")"
+
+#: pg_basebackup.c:2520
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "указать и формат, и получателя копии одновременно нельзя"
+
+#: pg_basebackup.c:2532
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "необходимо указать выходной каталог или получателя копии"
+
+#: pg_basebackup.c:2538
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "указать и выходной каталог, и получателя копии одновременно нельзя"
+
+#: pg_basebackup.c:2568 pg_receivewal.c:868
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "нераспознанный алгоритм сжатия: \"%s\""
+
+#: pg_basebackup.c:2574 pg_receivewal.c:875
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "неправильное указание сжатия: %s"
+
+#: pg_basebackup.c:2590
+#, c-format
+msgid ""
+"client-side compression is not possible when a backup target is specified"
+msgstr "сжатие на стороне клиента невозможно при указании получателя копии"
+
+#: pg_basebackup.c:2601
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "сжиматься могут только резервные копии в архиве tar"
+
+#: pg_basebackup.c:2611
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "потоковая передача WAL невозможна при указании получателя копии"
+
+#: pg_basebackup.c:2617
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "транслировать журналы предзаписи в режиме tar в поток stdout нельзя"
+
+#: pg_basebackup.c:2624
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "слоты репликации можно использовать только при потоковой передаче WAL"
+
+#: pg_basebackup.c:2636
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot нельзя использовать с именем слота"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2647 pg_receivewal.c:840
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "для %s необходимо задать слот с помощью параметра --slot"
+
+#: pg_basebackup.c:2655 pg_basebackup.c:2695 pg_basebackup.c:2706
+#: pg_basebackup.c:2714
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "параметры %s и %s несовместимы"
+
+#: pg_basebackup.c:2669
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "расположение каталога WAL нельзя указать вместе с получателем копии"
+
+#: pg_basebackup.c:2675
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "расположение каталога WAL можно указать только в режиме plain"
+
+#: pg_basebackup.c:2684
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "расположение каталога WAL должно определяться абсолютным путём"
+
+#: pg_basebackup.c:2785
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "не удалось создать символическую ссылку \"%s\": %m"
+
+#: pg_basebackup.c:2787
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "символические ссылки не поддерживаются в этой ОС"
+
+#: pg_receivewal.c:79
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s получает транслируемые журналы предзаписи PostgreSQL.\n"
+"\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:84
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметры:\n"
+
+#: pg_receivewal.c:84
+#, c-format
+msgid ""
+" -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr ""
+" -D, --directory=ПУТЬ сохранять файлы журнала предзаписи в данный "
+"каталог\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:85
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr ""
+" -E, --endpos=LSN определяет позицию, после которой нужно "
+"остановиться\n"
+
+#: pg_receivewal.c:86 pg_recvlogical.c:89
+#, c-format
+msgid ""
+" --if-not-exists do not error if slot already exists when creating a "
+"slot\n"
+msgstr ""
+" --if-not-exists не выдавать ошибку при попытке создать уже "
+"существующий слот\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:91
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop прерывать работу при потере соединения\n"
+
+#: pg_receivewal.c:88
+#, c-format
+msgid ""
+" --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" --no-sync не ждать надёжного сохранения изменений на диске\n"
+
+#: pg_receivewal.c:89 pg_recvlogical.c:96
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server "
+"(default: %d)\n"
+msgstr ""
+" -s, --status-interval=СЕК\n"
+" интервал между отправкой статусных пакетов серверу "
+"(по умолчанию: %d)\n"
+
+#: pg_receivewal.c:92
+#, c-format
+msgid ""
+" --synchronous flush write-ahead log immediately after writing\n"
+msgstr ""
+" --synchronous сбрасывать журнал предзаписи сразу после записи\n"
+
+# well-spelled: ИНФО
+#: pg_receivewal.c:95
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=МЕТОД[:ДОП_ИНФО]\n"
+" выполнять сжатие как указано\n"
+
+#: pg_receivewal.c:105
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Дополнительные действия:\n"
+
+#: pg_receivewal.c:106 pg_recvlogical.c:81
+#, c-format
+msgid ""
+" --create-slot create a new replication slot (for the slot's name "
+"see --slot)\n"
+msgstr ""
+" --create-slot создать новый слот репликации (имя слота задаёт "
+"параметр --slot)\n"
+
+#: pg_receivewal.c:107 pg_recvlogical.c:82
+#, c-format
+msgid ""
+" --drop-slot drop the replication slot (for the slot's name see "
+"--slot)\n"
+msgstr ""
+" --drop-slot удалить слот репликации (имя слота задаёт параметр "
+"--slot)\n"
+
+#: pg_receivewal.c:252
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "завершён сегмент %X/%X (линия времени %u)"
+
+#: pg_receivewal.c:259
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "завершена передача журнала с позиции %X/%X (линия времени %u)"
+
+#: pg_receivewal.c:275
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "переключение на линию времени %u (позиция %X/%X)"
+
+#: pg_receivewal.c:285
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "получен сигнал прерывания, работа завершается"
+
+#: pg_receivewal.c:317
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не удалось закрыть каталог \"%s\": %m"
+
+#: pg_receivewal.c:384
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "файл сегмента \"%s\" имеет неправильный размер %lld, файл пропускается"
+
+#: pg_receivewal.c:401
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "не удалось открыть сжатый файл \"%s\": %m"
+
+#: pg_receivewal.c:404
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "ошибка позиционирования в сжатом файле \"%s\": %m"
+
+#: pg_receivewal.c:410
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "не удалось прочитать сжатый файл \"%s\": %m"
+
+#: pg_receivewal.c:413
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "не удалось прочитать сжатый файл \"%s\" (прочитано байт: %d из %zu)"
+
+#: pg_receivewal.c:423
+#, c-format
+msgid ""
+"compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr ""
+"файл сжатого сегмента \"%s\" имеет неправильный исходный размер %d, файл "
+"пропускается"
+
+#: pg_receivewal.c:451
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "не удалось создать контекст распаковки LZ4: %s"
+
+#: pg_receivewal.c:463
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не удалось прочитать файл \"%s\": %m"
+
+#: pg_receivewal.c:481
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "не удалось распаковать файл \"%s\": %s"
+
+#: pg_receivewal.c:504
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "не удалось освободить контекст распаковки LZ4: %s"
+
+#: pg_receivewal.c:509
+#, c-format
+msgid ""
+"compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr ""
+"файл сжатого сегмента \"%s\" имеет неправильный исходный размер %zu, файл "
+"пропускается"
+
+#: pg_receivewal.c:514
+#, c-format
+msgid ""
+"cannot check file \"%s\": compression with %s not supported by this build"
+msgstr ""
+"не удалось проверить файл \"%s\": сжатие методом %s не поддерживается данной "
+"сборкой"
+
+#: pg_receivewal.c:641
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "начало передачи журнала с позиции %X/%X (линия времени %u)"
+
+#: pg_receivewal.c:783 pg_recvlogical.c:785
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "не удалось разобрать конечную позицию \"%s\""
+
+#: pg_receivewal.c:832
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "--create-slot нельзя применять вместе с --drop-slot"
+
+#: pg_receivewal.c:848
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "--synchronous нельзя применять вместе с --no-sync"
+
+#: pg_receivewal.c:858
+#, c-format
+msgid "no target directory specified"
+msgstr "целевой каталог не указан"
+
+#: pg_receivewal.c:882
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "метод сжатия %s ещё не поддерживается"
+
+#: pg_receivewal.c:924
+#, c-format
+msgid ""
+"replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr ""
+"подключение для репликации через слот \"%s\" оказалось привязано к базе "
+"данных"
+
+#: pg_receivewal.c:943 pg_recvlogical.c:955
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "удаление слота репликации \"%s\""
+
+#: pg_receivewal.c:954 pg_recvlogical.c:965
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "создание слота репликации \"%s\""
+
+#: pg_receivewal.c:983 pg_recvlogical.c:989
+#, c-format
+msgid "disconnected"
+msgstr "отключение"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:987 pg_recvlogical.c:993
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "отключение; через %d сек. последует повторное подключение"
+
+#: pg_recvlogical.c:76
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s управляет потоками логического декодирования PostgreSQL.\n"
+"\n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Действие, которое будет выполнено:\n"
+
+#: pg_recvlogical.c:83
+#, c-format
+msgid ""
+" --start start streaming in a replication slot (for the "
+"slot's name see --slot)\n"
+msgstr ""
+" --start начать передачу в слоте репликации (имя слота "
+"задаёт параметр --slot)\n"
+
+#: pg_recvlogical.c:86
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr ""
+" -f, --file=ФАЙЛ сохранять журнал в этот файл, - обозначает stdout\n"
+
+#: pg_recvlogical.c:87
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: "
+"%d)\n"
+msgstr ""
+" -F --fsync-interval=СЕК\n"
+" периодичность сброса на диск выходного файла (по "
+"умолчанию: %d)\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid ""
+" -I, --startpos=LSN where in an existing slot should the streaming "
+"start\n"
+msgstr ""
+" -I, --startpos=LSN определяет, с какой позиции в существующем слоте "
+"начнётся передача\n"
+
+#: pg_recvlogical.c:92
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=ИМЯ[=ЗНАЧЕНИЕ]\n"
+" передать параметр с заданным именем и "
+"необязательным\n"
+" значением модулю вывода\n"
+
+#: pg_recvlogical.c:95
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr ""
+" -P, --plugin=МОДУЛЬ использовать заданный модуль вывода (по умолчанию: "
+"%s)\n"
+
+#: pg_recvlogical.c:98
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=ИМЯ_СЛОТА имя слота логической репликации\n"
+
+#: pg_recvlogical.c:99
+#, c-format
+msgid ""
+" -t, --two-phase enable decoding of prepared transactions when "
+"creating a slot\n"
+msgstr ""
+" -t, --two-phase включить декодирование подготовленных транзакций "
+"при создании слота\n"
+
+#: pg_recvlogical.c:104
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=ИМЯ_БД целевая база данных\n"
+
+#: pg_recvlogical.c:137
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "подтверждается запись до %X/%X, синхронизация с ФС до %X/%X (слот %s)"
+
+#: pg_recvlogical.c:161 receivelog.c:366
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "не удалось отправить пакет ответа: %s"
+
+#: pg_recvlogical.c:229
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "начало передачи журнала с позиции %X/%X (слот %s)"
+
+#: pg_recvlogical.c:271
+#, c-format
+msgid "streaming initiated"
+msgstr "передача запущена"
+
+#: pg_recvlogical.c:335
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "не удалось открыть файл протокола \"%s\": %m"
+
+#: pg_recvlogical.c:364 receivelog.c:889
+#, c-format
+msgid "invalid socket: %s"
+msgstr "неверный сокет: %s"
+
+#: pg_recvlogical.c:417 receivelog.c:917
+#, c-format
+msgid "%s() failed: %m"
+msgstr "ошибка в %s(): %m"
+
+#: pg_recvlogical.c:424 receivelog.c:967
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "не удалось получить данные из потока WAL: %s"
+
+#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011
+#: receivelog.c:1074
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "заголовок потока слишком мал: %d"
+
+#: pg_recvlogical.c:501 receivelog.c:849
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "нераспознанный заголовок потока: \"%c\""
+
+#: pg_recvlogical.c:555 pg_recvlogical.c:567
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "не удалось записать %d Б в файл журнала \"%s\": %m"
+
+#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "неожиданный конец потока репликации: %s"
+
+#: pg_recvlogical.c:780
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "не удалось разобрать начальную позицию \"%s\""
+
+#: pg_recvlogical.c:858
+#, c-format
+msgid "no slot specified"
+msgstr "слот не указан"
+
+#: pg_recvlogical.c:865
+#, c-format
+msgid "no target file specified"
+msgstr "целевой файл не задан"
+
+#: pg_recvlogical.c:872
+#, c-format
+msgid "no database specified"
+msgstr "база данных не задана"
+
+#: pg_recvlogical.c:879
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "необходимо задать минимум одно действие"
+
+#: pg_recvlogical.c:886
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "--create-slot или --start нельзя применять вместе с --drop-slot"
+
+#: pg_recvlogical.c:893
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "--create-slot или --drop-slot нельзя применять вместе с --startpos"
+
+#: pg_recvlogical.c:900
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos можно задать только вместе с --start"
+
+#: pg_recvlogical.c:907
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase можно задать только вместе с --create-slot"
+
+#: pg_recvlogical.c:939
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr ""
+"не удалось установить подключение для репликации к определённой базе данных"
+
+#: pg_recvlogical.c:1033
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "конечная позиция %X/%X достигнута при обработке keepalive"
+
+#: pg_recvlogical.c:1036
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "конечная позиция %X/%X достигнута при обработке записи WAL %X/%X"
+
+#: receivelog.c:68
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "не удалось создать файл статуса архива \"%s\": %s"
+
+#: receivelog.c:75
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "не удалось закрыть файл статуса архива \"%s\": %s"
+
+#: receivelog.c:123
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "не удалось получить размер файла журнала предзаписи \"%s\": %s"
+
+#: receivelog.c:134
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "не удалось открыть существующий файл журнала предзаписи \"%s\": %s"
+
+#: receivelog.c:143
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr ""
+"не удалось сбросить на диск существующий файл журнала предзаписи \"%s\": %s"
+
+#: receivelog.c:158
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] ""
+"файл журнала предзаписи \"%s\" имеет размер %zd Б, а должен — 0 или %d"
+msgstr[1] ""
+"файл журнала предзаписи \"%s\" имеет размер %zd Б, а должен — 0 или %d"
+msgstr[2] ""
+"файл журнала предзаписи \"%s\" имеет размер %zd Б, а должен — 0 или %d"
+
+#: receivelog.c:174
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "не удалось открыть файл журнала предзаписи \"%s\": %s"
+
+#: receivelog.c:208
+#, c-format
+msgid "could not determine seek position in file \"%s\": %s"
+msgstr "не удалось определить текущую позицию в файле \"%s\": %s"
+
+#: receivelog.c:223
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "файл сегмента \"%s\" не переименовывается, так как он неполный"
+
+#: receivelog.c:234 receivelog.c:323 receivelog.c:694
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "не удалось закрыть файл \"%s\": %s"
+
+#: receivelog.c:295
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "сервер сообщил неожиданное имя файла истории для линии времени %u: %s"
+
+#: receivelog.c:303
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "не удалось создать файл истории линии времени \"%s\": %s"
+
+#: receivelog.c:310
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "не удалось записать файл истории линии времени \"%s\": %s"
+
+#: receivelog.c:400
+#, c-format
+msgid ""
+"incompatible server version %s; client does not support streaming from "
+"server versions older than %s"
+msgstr ""
+"несовместимая версия сервера %s; клиент не поддерживает репликацию с "
+"серверов версии ниже %s"
+
+#: receivelog.c:409
+#, c-format
+msgid ""
+"incompatible server version %s; client does not support streaming from "
+"server versions newer than %s"
+msgstr ""
+"несовместимая версия сервера %s; клиент не поддерживает репликацию с "
+"серверов версии выше %s"
+
+#: receivelog.c:514
+#, c-format
+msgid ""
+"system identifier does not match between base backup and streaming connection"
+msgstr ""
+"системный идентификатор базовой резервной копии отличается от идентификатора "
+"потоковой передачи"
+
+#: receivelog.c:522
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "на сервере нет начальной линии времени %u"
+
+#: receivelog.c:561
+#, c-format
+msgid ""
+"unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, "
+"expected %d rows and %d fields"
+msgstr ""
+"сервер вернул неожиданный ответ на команду TIMELINE_HISTORY; получено строк: "
+"%d, полей: %d, а ожидалось строк: %d, полей: %d"
+
+#: receivelog.c:632
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "сервер неожиданно сообщил линию времени %u после линии времени %u"
+
+#: receivelog.c:638
+#, c-format
+msgid ""
+"server stopped streaming timeline %u at %X/%X, but reported next timeline %u "
+"to begin at %X/%X"
+msgstr ""
+"сервер прекратил передачу линии времени %u в %X/%X, но сообщил, что "
+"следующая линии времени %u начнётся в %X/%X"
+
+#: receivelog.c:678
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "поток репликации закончился до точки остановки"
+
+#: receivelog.c:724
+#, c-format
+msgid ""
+"unexpected result set after end-of-timeline: got %d rows and %d fields, "
+"expected %d rows and %d fields"
+msgstr ""
+"сервер вернул неожиданный набор данных после конца линии времени; получено "
+"строк: %d, полей: %d, а ожидалось строк: %d, полей: %d"
+
+#: receivelog.c:733
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "не удалось разобрать начальную точку следующей линии времени \"%s\""
+
+#: receivelog.c:781 receivelog.c:1030 walmethods.c:1205
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "не удалось синхронизировать с ФС файл \"%s\": %s"
+
+#: receivelog.c:1091
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "получена запись журнала предзаписи по смещению %u, но файл не открыт"
+
+#: receivelog.c:1101
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "получено смещение данных WAL %08x, но ожидалось %08x"
+
+#: receivelog.c:1135
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "не удалось записать %d Б в файл WAL \"%s\": %s"
+
+#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "не удалось отправить пакет \"конец COPY\": %s"
+
+#: streamutil.c:159
+msgid "Password: "
+msgstr "Пароль: "
+
+#: streamutil.c:182
+#, c-format
+msgid "could not connect to server"
+msgstr "не удалось подключиться к серверу"
+
+#: streamutil.c:225
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "не удалось очистить search_path: %s"
+
+#: streamutil.c:241
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "не удалось получить настройку сервера integer_datetimes"
+
+#: streamutil.c:248
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "флаг компиляции integer_datetimes не соответствует настройке сервера"
+
+#: streamutil.c:299
+#, c-format
+msgid ""
+"could not fetch WAL segment size: got %d rows and %d fields, expected %d "
+"rows and %d or more fields"
+msgstr ""
+"не удалось извлечь размер сегмента WAL; получено строк: %d, полей: %d "
+"(ожидалось: %d и %d (или более))"
+
+#: streamutil.c:309
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "разобрать размер сегмента WAL не удалось"
+
+#: streamutil.c:327
+#, c-format
+msgid ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"remote server reported a value of %d byte"
+msgid_plural ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"remote server reported a value of %d bytes"
+msgstr[0] ""
+"размер сегмента WAL должен задаваться степенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но удалённый сервер сообщил значение: %d"
+msgstr[1] ""
+"размер сегмента WAL должен задаваться степенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но удалённый сервер сообщил значение: %d"
+msgstr[2] ""
+"размер сегмента WAL должен задаваться степенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но удалённый сервер сообщил значение: %d"
+
+#: streamutil.c:372
+#, c-format
+msgid ""
+"could not fetch group access flag: got %d rows and %d fields, expected %d "
+"rows and %d or more fields"
+msgstr ""
+"не удалось извлечь флаг доступа группы; получено строк: %d, полей: %d "
+"(ожидалось: %d и %d (или более))"
+
+#: streamutil.c:381
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "не удалось разобрать флаг доступа группы: %s"
+
+#: streamutil.c:424 streamutil.c:461
+#, c-format
+msgid ""
+"could not identify system: got %d rows and %d fields, expected %d rows and "
+"%d or more fields"
+msgstr ""
+"не удалось идентифицировать систему; получено строк: %d, полей: %d "
+"(ожидалось: %d и %d (или более))"
+
+#: streamutil.c:513
+#, c-format
+msgid ""
+"could not read replication slot \"%s\": got %d rows and %d fields, expected "
+"%d rows and %d fields"
+msgstr ""
+"прочитать из слота репликации \"%s\" не удалось; получено строк: %d, полей: "
+"%d (ожидалось: %d и %d)"
+
+#: streamutil.c:525
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "слот репликации \"%s\" не существует"
+
+#: streamutil.c:536
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "ожидался слот физической репликации, вместо этого получен тип \"%s\""
+
+#: streamutil.c:550
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr ""
+"не удалось разобрать позицию restart_lsn \"%s\" для слота репликации \"%s\""
+
+#: streamutil.c:667
+#, c-format
+msgid ""
+"could not create replication slot \"%s\": got %d rows and %d fields, "
+"expected %d rows and %d fields"
+msgstr ""
+"создать слот репликации \"%s\" не удалось; получено строк: %d, полей: %d "
+"(ожидалось: %d и %d)"
+
+#: streamutil.c:711
+#, c-format
+msgid ""
+"could not drop replication slot \"%s\": got %d rows and %d fields, expected "
+"%d rows and %d fields"
+msgstr ""
+"удалить слот репликации \"%s\" не получилось; получено строк: %d, полей: %d "
+"(ожидалось: %d и %d)"
+
+#: walmethods.c:720 walmethods.c:1267
+msgid "could not compress data"
+msgstr "не удалось сжать данные"
+
+#: walmethods.c:749
+msgid "could not reset compression stream"
+msgstr "не удалось сбросить поток сжатых данных"
+
+#: walmethods.c:880
+msgid "implementation error: tar files can't have more than one open file"
+msgstr ""
+"ошибка реализации: в файлах tar не может быть больше одно открытого файла"
+
+#: walmethods.c:894
+msgid "could not create tar header"
+msgstr "не удалось создать заголовок tar"
+
+#: walmethods.c:910 walmethods.c:951 walmethods.c:1170 walmethods.c:1183
+msgid "could not change compression parameters"
+msgstr "не удалось изменить параметры сжатия"
+
+#: walmethods.c:1055
+msgid "unlink not supported with compression"
+msgstr "со сжатием закрытие файла с удалением не поддерживается"
+
+#: walmethods.c:1291
+msgid "could not close compression stream"
+msgstr "не удалось закрыть поток сжатых данных"
+
+#~ msgid "unknown compression option \"%s\""
+#~ msgstr "неизвестный параметр сжатия \"%s\""
+
+#~ msgid "could not check file \"%s\""
+#~ msgstr "не удалось проверить файл \"%s\""
+
+#~ msgid "This build does not support compression with %s."
+#~ msgstr "Эта сборка программы не поддерживает сжатие %s."
+
+#~ msgid "no value specified for --compress, switching to default"
+#~ msgstr ""
+#~ "для параметра --compress не задано значение, используется значение по "
+#~ "умолчанию"
+
+#~ msgid "could not find replication slot \"%s\""
+#~ msgstr "не удалось найти слот репликации \"%s\""
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid ""
+#~ " -Z, --compress=0-9 compress tar output with given compression "
+#~ "level\n"
+#~ msgstr ""
+#~ " -Z, --compress=0-9 установить уровень сжатия выходного архива\n"
+
+#~ msgid "invalid tar block header size: %zu"
+#~ msgstr "неверный размер заголовка блока tar: %zu"
+
+#~ msgid "unrecognized link indicator \"%c\""
+#~ msgstr "нераспознанный индикатор связи \"%c\""
+
+#~ msgid "could not get write-ahead log end position from server: %s"
+#~ msgstr ""
+#~ "не удалось получить от сервера конечную позицию в журнале предзаписи: %s"
+
+#~ msgid "invalid status interval \"%s\""
+#~ msgstr "неверный интервал сообщений о состоянии \"%s\""
+
+#~ msgid ""
+#~ " -Z, --compress=0-9 compress logs with given compression level\n"
+#~ msgstr " -Z, --compress=0-9 установить уровень сжатия журналов\n"
+
+#~ msgid "invalid fsync interval \"%s\""
+#~ msgstr "неверный интервал синхронизации с ФС \"%s\""
+
+#~ msgid "--progress and --no-estimate-size are incompatible options"
+#~ msgstr "параметры --progress и --no-estimate-size несовместимы"
+
+#~ msgid "--no-manifest and --manifest-checksums are incompatible options"
+#~ msgstr "параметры --no-manifest и --manifest-checksums несовместимы"
+
+#~ msgid "--no-manifest and --manifest-force-encode are incompatible options"
+#~ msgstr "параметры --no-manifest и --manifest-force-encode несовместимы"
+
+#~ msgid "could not connect to server: %s"
+#~ msgstr "не удалось подключиться к серверу: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: нехватка памяти\n"
+
+#~ msgid "%s: child process did not exit normally\n"
+#~ msgstr "%s: дочерний процесс завершён ненормально\n"
+
+#~ msgid "%s: child process exited with error %d\n"
+#~ msgstr "%s: дочерний процесс завершился с ошибкой %d\n"
+
+#~ msgid "%s: could not fsync log file \"%s\": %s\n"
+#~ msgstr "%s: не удалось синхронизировать с ФС файл журнала \"%s\": %s\n"
+
+#~ msgid "%s: removing transaction log directory \"%s\"\n"
+#~ msgstr "%s: удаление каталога журнала транзакций \"%s\"\n"
+
+#~ msgid "%s: failed to remove transaction log directory\n"
+#~ msgstr "%s: ошибка при удалении каталога журнала транзакций\n"
+
+#~ msgid "%s: removing contents of transaction log directory \"%s\"\n"
+#~ msgstr "%s: очистка каталога журнала транзакций \"%s\"\n"
+
+#~ msgid "%s: failed to remove contents of transaction log directory\n"
+#~ msgstr "%s: ошибка при очистке каталога журнала транзакций\n"
+
+#~ msgid "%s: transaction log directory \"%s\" not removed at user's request\n"
+#~ msgstr ""
+#~ "%s: каталог журнала транзакций \"%s\" не был удалён по запросу "
+#~ "пользователя\n"
+
+#~ msgid "%s: could not open transaction log file \"%s\": %s\n"
+#~ msgstr "%s: не удалось открыть файл журнала транзакций \"%s\": %s\n"
+
+#~ msgid ""
+#~ " -x, --xlog include required WAL files in backup (fetch "
+#~ "mode)\n"
+#~ msgstr ""
+#~ " -x, --xlog включить в копию требуемые файлы WAL (режим "
+#~ "fetch)\n"
+
+#~ msgid "%s: WAL streaming can only be used in plain mode\n"
+#~ msgstr "%s: потоковая передача WAL поддерживается только в режиме plain\n"
+
+#~ msgid "%s: could not stat transaction log file \"%s\": %s\n"
+#~ msgstr "%s: не удалось проверить файл журнала транзакций \"%s\": %s\n"
+
+#~ msgid "%s: could not pad transaction log file \"%s\": %s\n"
+#~ msgstr "%s: не удалось дополнить файл журнала транзакций \"%s\": %s\n"
+
+#~ msgid "%s: could not rename file \"%s\": %s\n"
+#~ msgstr "%s: не удалось переименовать файл \"%s\": %s\n"
+
+#~ msgid "%s: could not open timeline history file \"%s\": %s\n"
+#~ msgstr "%s: не удалось открыть файл истории линии времени \"%s\": %s\n"
+
+#~ msgid "%s: could not parse file size\n"
+#~ msgstr "%s: не удалось разобрать размер файла\n"
+
+#~ msgid "%s: could not parse file mode\n"
+#~ msgstr "%s: не удалось разобрать режим файла\n"
+
+#~ msgid "%s: socket not open"
+#~ msgstr "%s: сокет не открыт"
+
+#~ msgid "%s: could not remove symbolic link \"%s\": %s\n"
+#~ msgstr "%s: ошибка при удалении символической ссылки \"%s\": %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Replication options:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Параметры репликации:\n"
+
+#~ msgid "%s: initializing replication slot \"%s\"\n"
+#~ msgstr "%s: инициализируется слот репликации \"%s\"\n"
+
+#~ msgid ""
+#~ "%s: could not init logical replication: got %d rows and %d fields, "
+#~ "expected %d rows and %d fields\n"
+#~ msgstr ""
+#~ "%s: не удалось инициализировать логическую репликацию; получено строк: "
+#~ "%d, полей: %d (ожидалось: %d и %d)\n"
+
+#~ msgid "%s: no start point returned from server\n"
+#~ msgstr "%s: сервер не вернул стартовую точку\n"
+
+#~ msgid ""
+#~ "%s: timeline does not match between base backup and streaming connection\n"
+#~ msgstr ""
+#~ "%s: линия времени базовой резервной копии отличается от линии времени "
+#~ "потоковой передачи\n"
+
+#~ msgid "%s: keepalive message has incorrect size %d\n"
+#~ msgstr "%s: контрольное сообщение имеет некорректный размер: %d\n"
+
+#~ msgid "%s: could not close file %s: %s\n"
+#~ msgstr "%s: не удалось закрыть файл %s: %s\n"
+
+#~ msgid "%s: invalid format of xlog location: %s\n"
+#~ msgstr "%s: неверный формат позиции в xlog: %s\n"
+
+#~ msgid "%s: could not identify system: %s"
+#~ msgstr "%s: не удалось идентифицировать систему: %s"
+
+#~ msgid "%s: could not send base backup command: %s"
+#~ msgstr ""
+#~ "%s: не удалось отправить команду базового резервного копирования: %s"
+
+#~ msgid "%s: could not identify system: %s\n"
+#~ msgstr "%s: не удалось идентифицировать систему: %s\n"
+
+#~ msgid "%s: could not open WAL segment %s: %s\n"
+#~ msgstr "%s: не удалось открыть сегмент WAL %s: %s\n"
+
+#~ msgid "%s: could not stat WAL segment %s: %s\n"
+#~ msgstr "%s: не удалось получить информацию о сегменте WAL %s: %s\n"
+
+#~ msgid "%s: could not pad WAL segment %s: %s\n"
+#~ msgstr "%s: не удалось дополнить сегмент WAL %s: %s\n"
+
+#~ msgid "%s: could not get current position in file %s: %s\n"
+#~ msgstr "%s: не удалось получить текущую позицию в файле %s: %s\n"
diff --git a/src/bin/pg_basebackup/po/sv.po b/src/bin/pg_basebackup/po/sv.po
new file mode 100644
index 0000000..c239ab7
--- /dev/null
+++ b/src/bin/pg_basebackup/po/sv.po
@@ -0,0 +1,1805 @@
+# SWEDISH message translation file for pg_basebackup
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Dennis Björklund <db@zigo.dhs.org>, 2017, 2018, 2019, 2020, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-29 11:48+0000\n"
+"PO-Revision-Date: 2022-09-29 21:41+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../common/compression.c:130 ../../common/compression.c:139
+#: ../../common/compression.c:148
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "detta bygge stöder inte komprimering med %s"
+
+#: ../../common/compression.c:203
+msgid "found empty string where a compression option was expected"
+msgstr "hittade en tom sträng där en komprimeringsinställning förväntades"
+
+#: ../../common/compression.c:237
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "okänd komprimeringsflagga \"%s\""
+
+#: ../../common/compression.c:276
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "komprimeringsflaggan \"%s\" kräver ett värde"
+
+#: ../../common/compression.c:285
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "värdet på komprimeringsflaggan \"%s\" måste vara ett heltal"
+
+#: ../../common/compression.c:335
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "komprimeringsalgoritmen \"%s\" stöder inte komprimeringsnivåer"
+
+#: ../../common/compression.c:342
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "komprimeringsalgoritmen \"%s\" förväntar sig en komprimeringsnivå mellan %d och %d (standard är %d)"
+
+#: ../../common/compression.c:353
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "komprimeringsalgoritmen \"%s\" stöder inte inställning av antal arbetarprocesser"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kan inte duplicera null-pekare (internt fel)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#: pg_receivewal.c:380 pg_recvlogical.c:341
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "kunde inte göra stat() på fil \"%s\": %m"
+
+#: ../../common/file_utils.c:166 pg_receivewal.c:303
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "kunde inte öppna katalog \"%s\": %m"
+
+#: ../../common/file_utils.c:200 pg_receivewal.c:532
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "kunde inte läsa katalog \"%s\": %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:447
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#: pg_recvlogical.c:196
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "kunde inte fsync:a fil \"%s\": %m"
+
+#: ../../common/file_utils.c:383 pg_basebackup.c:2256 walmethods.c:459
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ogiltigt värde \"%s\" för flaggan \"%s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s måste vara i intervallet %d..%d"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1636
+#, c-format
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "kunde inte skriva till fil \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339
+#: pg_basebackup.c:1497 pg_basebackup.c:1706
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "kunde inte skapa fil \"%s\": %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:635
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "kunde inte stänga fil \"%s\": %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "oväntat tillstånd vid uppackning av arkiv"
+
+#: bbstreamer_file.c:298 pg_basebackup.c:686 pg_basebackup.c:730
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "kunde inte skapa katalog \"%s\": %m"
+
+#: bbstreamer_file.c:304
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "kunde inte sätta rättigheter på katalogen \"%s\": %m"
+
+#: bbstreamer_file.c:323
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "kunde inte skapa symbolisk länk från \"%s\" till \"%s\": %m"
+
+#: bbstreamer_file.c:343
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "kunde inte sätta rättigheter på filen \"%s\": %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "kunde inte skapa komprimerad fil \"%s\": %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "kunde inte duplicera stdout: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "kunde inte öppna utdatafilen: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "kunde inte sätta komprimeringsnivå %d: %s"
+
+#: bbstreamer_gzip.c:116 bbstreamer_gzip.c:249
+#, c-format
+msgid "this build does not support gzip compression"
+msgstr "detta bygge stöder inte gzip-komprimering"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "kunde inte skriva till komprimerad fil \"%s\": %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "kunde inte stänga komprimerad fil \"%s\": %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:869
+#, c-format
+msgid "could not initialize compression library"
+msgstr "kunde inte initierar komprimeringsbibliotek"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:316
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "kunde inte dekomprimera data: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "oväntat tillstånd vid injicering av återställningsinställningar"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "kunde inte skapa kontext för lz4-komprimering: %s"
+
+#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298
+#, c-format
+msgid "this build does not support lz4 compression"
+msgstr "detta bygge stöder inte lz4-komprimering"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "kunde inte skriva lz4-header: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:168 bbstreamer_zstd.c:210
+#, c-format
+msgid "could not compress data: %s"
+msgstr "kunde inte komprimera data: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "kunde inte avsluta lz4-komprimering: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "kunde inte initiera komprimeringsbibliotek: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "tarfilens slutdel överskred 2 block"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "oväntat tillstånd vid parsning av tar-arkiv"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "tar-medlem har tomt namn"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "COPY-ström avslutade innan sista filen var klar"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "kunde inte skapa kontext för zstd-komprimering"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "kunde inte sätta zstd-komprimeringsnivå till %d: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "kunde inte sätta komprimeringsarbetarantalet till %d: %s"
+
+#: bbstreamer_zstd.c:116 bbstreamer_zstd.c:271
+#, c-format
+msgid "this build does not support zstd compression"
+msgstr "detta bygge stöder inte zstd-komprimering"
+
+#: bbstreamer_zstd.c:262
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "kunde inte skapa kontext för zstd-dekomprimering"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "tar bort datakatalog \"%s\""
+
+#: pg_basebackup.c:242
+#, c-format
+msgid "failed to remove data directory"
+msgstr "misslyckades med att ta bort datakatalog"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "tar bort innehållet i datakatalog \"%s\""
+
+#: pg_basebackup.c:248
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "misslyckades med att ta bort innehållet i datakatalogen"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "tar bort WAL-katalog \"%s\""
+
+#: pg_basebackup.c:255
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "misslyckades med att ta bort WAL-katalog"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "tar bort innehållet i WAL-katalog \"%s\""
+
+#: pg_basebackup.c:261
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "misslyckades med att ta bort innehållet i WAL-katalogen"
+
+#: pg_basebackup.c:267
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "datakatalog \"%s\" är ej borttagen på användares begäran"
+
+#: pg_basebackup.c:270
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "WAL-katalog \"%s\" är ej borttagen på användares begäran"
+
+#: pg_basebackup.c:274
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "ändringar av tablespace-kataloger kan inte backas"
+
+#: pg_basebackup.c:326
+#, c-format
+msgid "directory name too long"
+msgstr "katalognamn för långt"
+
+#: pg_basebackup.c:333
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "multipla \"=\"-tecken i tablespace-mappning"
+
+#: pg_basebackup.c:342
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "ogiltigt tablespace-mappningsformat \"%s\", måste vara \"OLDDIR=NEWDIR\""
+
+#: pg_basebackup.c:351
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "gammal katalog är inte en absolut sökväg i tablespace-mappning: %s"
+
+#: pg_basebackup.c:355
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "ny katalog är inte en absolut sökväg i tablespace-mappning: %s"
+
+#: pg_basebackup.c:377
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s tar en basbackup av en körande PostgreSQL-server.\n"
+"\n"
+
+#: pg_basebackup.c:379 pg_receivewal.c:81 pg_recvlogical.c:78
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_basebackup.c:380 pg_receivewal.c:82 pg_recvlogical.c:79
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [FLAGGA]...\n"
+
+#: pg_basebackup.c:381
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Flaggor som styr utmatning:\n"
+
+#: pg_basebackup.c:382
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=KATALOG ta emot basbackup till katalog\n"
+
+#: pg_basebackup.c:383
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t utdataformat (plain (standard), tar)\n"
+
+#: pg_basebackup.c:384
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE maximal överföringshastighet för att överföra datakatalog\n"
+" (i kB/s, eller använd suffix \"k\" resp. \"M\")\n"
+
+#: pg_basebackup.c:386
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" skriv konfiguration för replikering\n"
+
+#: pg_basebackup.c:388
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=MÅL[:DETALJ]\n"
+" backupmål (om annat än klienten)\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=GAMMALKAT=NYKAT\n"
+" flytta tablespace i GAMMALKAT till NYKAT\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALKAT plats för write-ahead-logg-katalog\n"
+
+#: pg_basebackup.c:393
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" inkludera behövda WAL-filer med angiven metod\n"
+
+#: pg_basebackup.c:395
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip komprimera tar-utdata\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METOD[:DETALJ]\n"
+" komprimera på klient- eller serversida\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none komprimera inte tar-utdata\n"
+
+#: pg_basebackup.c:399
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Allmänna flaggor:\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" ställ in \"fast\" eller \"spread\" checkpoint-metod\n"
+
+#: pg_basebackup.c:402
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " --create-slot skapa en replikeringsslot\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=ETIKETT sätt backup-etikett\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean städa inte upp efter fel\n"
+
+#: pg_basebackup.c:405
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync vänta inte på att ändringar skall skrivas säkert till disk\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress visa förloppsinformation\n"
+
+#: pg_basebackup.c:407 pg_receivewal.c:91
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=SLOTNAMN replikerings-slot att använda\n"
+
+#: pg_basebackup.c:408 pg_receivewal.c:93 pg_recvlogical.c:100
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose mata ut utförliga meddelanden\n"
+
+#: pg_basebackup.c:409 pg_receivewal.c:94 pg_recvlogical.c:101
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" använd algoritm för manifestchecksummor\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" hex-koda alla filnamn i manifestet\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size estimerar inte backupstorlek på serversidan\n"
+
+#: pg_basebackup.c:415
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest förhindra att backupmanifest genereras\n"
+
+#: pg_basebackup.c:416
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot förhindra skapande av temporär replikerings-slot\n"
+
+#: pg_basebackup.c:417
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" verifiera inte checksummor\n"
+
+#: pg_basebackup.c:419 pg_receivewal.c:97 pg_recvlogical.c:102
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa den här hjälpen, avsluta sedan\n"
+
+#: pg_basebackup.c:420 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Flaggor för anslutning:\n"
+
+#: pg_basebackup.c:421 pg_receivewal.c:99
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR anslutningssträng\n"
+
+#: pg_basebackup.c:422 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAMN databasserverns värdnamn eller socket-katalog\n"
+
+#: pg_basebackup.c:423 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT databasserverns postnummer\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVAL\n"
+" tid mellan att statuspaket skickas till servern (i sekunder)\n"
+
+#: pg_basebackup.c:426 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAMN ansluta som angiven databasanvändare\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:103 pg_recvlogical.c:108
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password fråga aldrig efter lösenord\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:104 pg_recvlogical.c:109
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password tvinga fram lösenordsfråga (skall ske automatiskt)\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:108 pg_recvlogical.c:110
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:109 pg_recvlogical.c:111
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_basebackup.c:472
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "kunde inte läsa från rör (pipe) som har data: %m"
+
+#: pg_basebackup.c:475 pg_basebackup.c:622 pg_basebackup.c:2170
+#: streamutil.c:444
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "kunde inte parsa write-ahead-logg-plats \"%s\""
+
+#: pg_basebackup.c:581 pg_receivewal.c:663
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "kunde inte slutföra skrivning av WAL-filer: %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "kunde inte skapa rör (pipe) för bakgrundsprocess: %m"
+
+#: pg_basebackup.c:664
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "skapade en temporär replikeringsslot \"%s\""
+
+#: pg_basebackup.c:667
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "skapade en replikeringsslot \"%s\""
+
+#: pg_basebackup.c:701
+#, c-format
+msgid "could not create background process: %m"
+msgstr "kunde inte skapa bakgrundsprocess: %m"
+
+#: pg_basebackup.c:710
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "kunde inte skapa bakgrundstråd: %m"
+
+#: pg_basebackup.c:749
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "katalogen \"%s\" existerar men är inte tom"
+
+#: pg_basebackup.c:755
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "kunde inte komma åt katalog \"%s\": %m"
+
+#: pg_basebackup.c:832
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgstr[1] "%*s/%s kB (100%%), %d/%d tablespace %*s"
+
+#: pg_basebackup.c:844
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+
+#: pg_basebackup.c:860
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespace"
+
+#: pg_basebackup.c:884
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "överföringshastighet \"%s\" är inte ett giltigt värde"
+
+#: pg_basebackup.c:886
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "ogiltig överföringshastighet \"%s\": %m"
+
+#: pg_basebackup.c:893
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "överföringshastigheten måste vara större än noll"
+
+#: pg_basebackup.c:923
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "ogiltig enhet för --max-rate: \"%s\""
+
+#: pg_basebackup.c:927
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "överföringshastighet \"%s\" överskrider heltalsintervall"
+
+#: pg_basebackup.c:934
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "överföringshastighet \"%s\" är utanför sitt intervall"
+
+#: pg_basebackup.c:1030
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "kunde inte hämta COPY-data-ström: %s"
+
+#: pg_basebackup.c:1047 pg_recvlogical.c:438 pg_recvlogical.c:610
+#: receivelog.c:981
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "kunde inte läsa COPY-data: %s"
+
+#: pg_basebackup.c:1051
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "en bakgrundsprocess avslutade oväntat"
+
+#: pg_basebackup.c:1122
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "kan inte injicera manifest in i en komprimerad tarfil"
+
+#: pg_basebackup.c:1123
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "använd komprimering på klientsidan, skicka utdatan till en katalog istället för till standard ut eller använd %s."
+
+#: pg_basebackup.c:1139
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "kunde inte parsa arkiv \"%s\""
+
+#: pg_basebackup.c:1140
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "Bara tar-arkiv kan parsas."
+
+#: pg_basebackup.c:1142
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "Enkelt format kräver pg_basebackup för att parsa arkivet."
+
+#: pg_basebackup.c:1144
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "Att använda - som utkatalog kräver att pg_basebackup parsar arkivet."
+
+#: pg_basebackup.c:1146
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "Flaggan -R kräver att pg_basebackup parsar arkivet."
+
+#: pg_basebackup.c:1357
+#, c-format
+msgid "archives must precede manifest"
+msgstr "arkiv skall komma före manifest"
+
+#: pg_basebackup.c:1372
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "ogiltigt arkivnamn: \"%s\""
+
+#: pg_basebackup.c:1444
+#, c-format
+msgid "unexpected payload data"
+msgstr "oväntat datainnehåll"
+
+#: pg_basebackup.c:1587
+#, c-format
+msgid "empty COPY message"
+msgstr "tomt COPY-meddelande"
+
+#: pg_basebackup.c:1589
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "felaktigt COPY-meddelande av typ %d, längd %zu"
+
+#: pg_basebackup.c:1787
+#, c-format
+msgid "incompatible server version %s"
+msgstr "inkompatibel serverversion %s"
+
+#: pg_basebackup.c:1803
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "Använd -X none eller -X fetch för att stänga av logg-strömning"
+
+#: pg_basebackup.c:1871
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "backupmål stöds inte av denna serverversion"
+
+#: pg_basebackup.c:1874
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "återställningskonfiguration kan inte skrivas när backupmål används"
+
+#: pg_basebackup.c:1901
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "servern stöder inte komprimering på serversidan"
+
+#: pg_basebackup.c:1911
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "initierar basbackup, väntar på att checkpoint skall gå klart"
+
+#: pg_basebackup.c:1915
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "väntar på checkpoint"
+
+#: pg_basebackup.c:1928 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588
+#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504
+#: streamutil.c:656 streamutil.c:701
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "kunde inte skicka replikeringskommando \"%s\": %s"
+
+#: pg_basebackup.c:1936
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "kunde inte initiera basbackup: %s"
+
+#: pg_basebackup.c:1939
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "servern retunerade ett oväntat svar på BASE_BACKUP-kommandot; fick %d rader och %d fält, förväntade %d rader och %d fält"
+
+#: pg_basebackup.c:1945
+#, c-format
+msgid "checkpoint completed"
+msgstr "checkpoint klar"
+
+#: pg_basebackup.c:1960
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "write-ahead-loggens startposition: %s på tidslinje %u"
+
+#: pg_basebackup.c:1968
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "kunde inte hämta backup-header: %s"
+
+#: pg_basebackup.c:1971
+#, c-format
+msgid "no data returned from server"
+msgstr "ingen data returnerades från servern"
+
+#: pg_basebackup.c:2006
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "kunde bara skriva en endaste tablespace till stdout, databasen har %d"
+
+#: pg_basebackup.c:2019
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "startar bakgrunds-WAL-mottagare"
+
+#: pg_basebackup.c:2101
+#, c-format
+msgid "backup failed: %s"
+msgstr "backup misslyckades: %s"
+
+#: pg_basebackup.c:2104
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "ingen write-ahead-logg-slutposition returnerad från servern"
+
+#: pg_basebackup.c:2107
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "write-ahead-logg-slutposition: %s"
+
+#: pg_basebackup.c:2118
+#, c-format
+msgid "checksum error occurred"
+msgstr "felaktig kontrollsumma upptäcktes"
+
+#: pg_basebackup.c:2123
+#, c-format
+msgid "final receive failed: %s"
+msgstr "sista mottagning misslyckades: %s"
+
+#: pg_basebackup.c:2147
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "väntat på att bakgrundsprocess skall avsluta strömmande ..."
+
+#: pg_basebackup.c:2151
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "kunde inte skicka kommando till bakgrundsrör (pipe): %m"
+
+#: pg_basebackup.c:2156
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "kunde inte vänta på barnprocess: %m"
+
+#: pg_basebackup.c:2158
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "barn %d dog, förväntade %d"
+
+#: pg_basebackup.c:2160 streamutil.c:91 streamutil.c:197
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2180
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "kunde inte vänta på barntråd: %m"
+
+#: pg_basebackup.c:2185
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "kunde inte hämta barntrådens slutstatus: %m"
+
+#: pg_basebackup.c:2188
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "barntråd avslutade med fel %u"
+
+#: pg_basebackup.c:2217
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "synkar data till disk ..."
+
+#: pg_basebackup.c:2242
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "byter namn på backup_manifest.tmp till backup_manifest"
+
+#: pg_basebackup.c:2262
+#, c-format
+msgid "base backup completed"
+msgstr "basbackup klar"
+
+#: pg_basebackup.c:2351
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "ogiltigt utdataformat \"%s\", måste vara \"plain\" eller \"tar\""
+
+#: pg_basebackup.c:2395
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "ogiltig wal-metod-flagga \"%s\", måste vara \"fetch\", \"stream\" eller \"none\""
+
+#: pg_basebackup.c:2425
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "ogiltigt checkpoint-argument \"%s\", måste vara \"fast\" eller \"spread\""
+
+#: pg_basebackup.c:2476 pg_basebackup.c:2488 pg_basebackup.c:2510
+#: pg_basebackup.c:2522 pg_basebackup.c:2528 pg_basebackup.c:2580
+#: pg_basebackup.c:2591 pg_basebackup.c:2601 pg_basebackup.c:2607
+#: pg_basebackup.c:2614 pg_basebackup.c:2626 pg_basebackup.c:2638
+#: pg_basebackup.c:2646 pg_basebackup.c:2659 pg_basebackup.c:2665
+#: pg_basebackup.c:2674 pg_basebackup.c:2686 pg_basebackup.c:2697
+#: pg_basebackup.c:2705 pg_receivewal.c:814 pg_receivewal.c:826
+#: pg_receivewal.c:833 pg_receivewal.c:842 pg_receivewal.c:849
+#: pg_receivewal.c:859 pg_recvlogical.c:837 pg_recvlogical.c:849
+#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873
+#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894
+#: pg_recvlogical.c:901 pg_recvlogical.c:908
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_basebackup.c:2486 pg_receivewal.c:824 pg_recvlogical.c:847
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_basebackup.c:2509
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "kan inte ange både format och backupmål"
+
+#: pg_basebackup.c:2521
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "måste ange utkatalog eller backupmål"
+
+#: pg_basebackup.c:2527
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "kan inte ange både utdatakatalog och backupmål"
+
+#: pg_basebackup.c:2557 pg_receivewal.c:868
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "okänd komprimeringsalgoritm \"%s\""
+
+#: pg_basebackup.c:2563 pg_receivewal.c:875
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "ogiltig komprimeringsangivelse: %s"
+
+#: pg_basebackup.c:2579
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "komprimering på klientsidan är inte möjlig när backupmål angivits"
+
+#: pg_basebackup.c:2590
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "bara backupper i tar-läge kan komprimeras"
+
+#: pg_basebackup.c:2600
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "WAL kan inte strömmas när ett backupmål angivits"
+
+#: pg_basebackup.c:2606
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "kan inte strömma write-ahead-logg i tar-läge till stdout"
+
+#: pg_basebackup.c:2613
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "replikerings-slot kan bara användas med WAL-strömning"
+
+#: pg_basebackup.c:2625
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot kan inte användas tillsammans med slot-namn"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2636 pg_receivewal.c:840
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s kräver att en slot anges med --slot"
+
+#: pg_basebackup.c:2644 pg_basebackup.c:2684 pg_basebackup.c:2695
+#: pg_basebackup.c:2703
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s och %s är inkompatibla flaggor"
+
+#: pg_basebackup.c:2658
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "WAL-katalogplats kan inte anges tillsammans med backupmål"
+
+#: pg_basebackup.c:2664
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "WAL-katalogplats kan bara anges i läget \"plain\""
+
+#: pg_basebackup.c:2673
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL-katalogen måste vara en absolut sökväg"
+
+#: pg_basebackup.c:2774
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "kan inte skapa symbolisk länk \"%s\": %m"
+
+#: pg_basebackup.c:2776
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "symboliska länkar stöds inte på denna plattform"
+
+#: pg_receivewal.c:79
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s tar emot PostgreSQL-strömning-write-ahead-logg.\n"
+"\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:84
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Flaggor:\n"
+
+#: pg_receivewal.c:84
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=KAT ta emot write-ahead-logg-filer till denna katalog\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:85
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN avsluta efter att ha taget emot den angivna LSN\n"
+
+#: pg_receivewal.c:86 pg_recvlogical.c:89
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists inget fel om slot:en redan finns när vi skapar slot:en\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:91
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop loopa inte om anslutning tappas\n"
+
+#: pg_receivewal.c:88
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync vänta inte på att ändringar skall skrivas säkert till disk\n"
+
+#: pg_receivewal.c:89 pg_recvlogical.c:96
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SEKS\n"
+" tid mellan att statuspaket skickas till serverb (standard: %d)\n"
+
+#: pg_receivewal.c:92
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous flush:a write-ahead-logg direkt efter skrivning\n"
+
+#: pg_receivewal.c:95
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METOD[:DETALJ]\n"
+" komprimera enligt detta\n"
+
+#: pg_receivewal.c:105
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Valfria handlingar:\n"
+
+#: pg_receivewal.c:106 pg_recvlogical.c:81
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot skapa en ny replikeringsslot (angående slot:ens namn, se --slot)\n"
+
+#: pg_receivewal.c:107 pg_recvlogical.c:82
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot släng replikeringsslot (angående slot:ens namn, se --slot)\n"
+
+#: pg_receivewal.c:252
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "slutförde segment vid %X/%X (tidslinje %u)"
+
+#: pg_receivewal.c:259
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "stoppade logg-strömning vid %X/%X (tidslinje %u)"
+
+#: pg_receivewal.c:275
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "bytte till tidslinje %u vid %X/%X"
+
+#: pg_receivewal.c:285
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "mottog avbrottsignal, avslutar"
+
+#: pg_receivewal.c:317
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "kunde inte stänga katalog \"%s\": %m"
+
+#: pg_receivewal.c:384
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "segmentfil \"%s\" har inkorrekt storlek %lld, hoppar över"
+
+#: pg_receivewal.c:401
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "kunde inte öppna komprimerad fil \"%s\": %m"
+
+#: pg_receivewal.c:404
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "kunde inte söka i komprimerad fil \"%s\": %m"
+
+#: pg_receivewal.c:410
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "kunde inte läsa komprimerad fil \"%s\": %m"
+
+#: pg_receivewal.c:413
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "kunde inte läsa komprimerad fil \"%s\": läste %d av %zu"
+
+#: pg_receivewal.c:423
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "komprimerad segmentfil \"%s\" har inkorrekt okomprimerad storlek %d, hoppar över"
+
+#: pg_receivewal.c:451
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "kunde inte skapa kontext för LZ4-dekomprimering: %s"
+
+#: pg_receivewal.c:463
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "kunde inte läsa fil \"%s\": %m"
+
+#: pg_receivewal.c:481
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "kunde inte dekomprimera fil \"%s\": %s"
+
+#: pg_receivewal.c:504
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "kunde inte frigöra kontext för LZ4-dekomprimering: %s"
+
+#: pg_receivewal.c:509
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "komprimerad segmentfil \"%s\" har inkorrekt okomprimerad storlek %zu, hoppar över"
+
+#: pg_receivewal.c:514
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "kan inte kontrollera filen \"%s\": komprimering med %s stöds inte av detta bygge"
+
+#: pg_receivewal.c:641
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "startar logg-strömning vid %X/%X (tidslinje %u)"
+
+#: pg_receivewal.c:783 pg_recvlogical.c:785
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "kunde inte parsa slutposition \"%s\""
+
+#: pg_receivewal.c:832
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "kan inte använda --create-slot tillsammans med --drop-slot"
+
+#: pg_receivewal.c:848
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "kan inte använda --synchronous tillsammans med --no-sync"
+
+#: pg_receivewal.c:858
+#, c-format
+msgid "no target directory specified"
+msgstr "ingen målkatalog angiven"
+
+#: pg_receivewal.c:882
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "komprimering med %s stöds inte än"
+
+#: pg_receivewal.c:924
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "replikeringsanslutning som använder slot \"%s\" är oväntat databasspecifik"
+
+#: pg_receivewal.c:943 pg_recvlogical.c:955
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "slänger replikeringsslot \"%s\""
+
+#: pg_receivewal.c:954 pg_recvlogical.c:965
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "skapar replikeringsslot \"%s\""
+
+#: pg_receivewal.c:983 pg_recvlogical.c:989
+#, c-format
+msgid "disconnected"
+msgstr "nerkopplad"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:987 pg_recvlogical.c:993
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "nerkopplad; väntar %d sekunder för att försöka igen"
+
+#: pg_recvlogical.c:76
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s styr PostgreSQL:s logiskt avkodade strömmar.\n"
+"\n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Handling att utföra:\n"
+
+#: pg_recvlogical.c:83
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start starta strömning i en replikeringsslot (angående slot:ens namn, se --slot)\n"
+
+#: pg_recvlogical.c:86
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=FIL ta emot logg till denna fil, - för stdout\n"
+
+#: pg_recvlogical.c:87
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SEK\n"
+" tid mellan fsync av utdatafil (standard: %d)\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN var i en existerande slot skall strömningen starta\n"
+
+#: pg_recvlogical.c:92
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NAMN[=VÄRDE]\n"
+" skicka vidare flaggan NAMN med ev. värde VÄRDE till\n"
+" utmatnings-plugin:en\n"
+
+#: pg_recvlogical.c:95
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN använd utmatnings-plugin:en PLUGIN (standard: %s)\n"
+
+#: pg_recvlogical.c:98
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAMN namn på den logiska replikerings-slotten\n"
+
+#: pg_recvlogical.c:99
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr " -t, --two-phase slå på avkodning av förberedda transaktioner när en slot skapas\n"
+
+#: pg_recvlogical.c:104
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=DBNAMN databas att ansluta till\n"
+
+#: pg_recvlogical.c:137
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "bekräftar skrivning fram till %X/%X, flush till %X/%X (slot %s)"
+
+#: pg_recvlogical.c:161 receivelog.c:366
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "kunde inte skicka feedback-paket: %s"
+
+#: pg_recvlogical.c:229
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "startar logg-strömning vid %X/%X (slot %s)"
+
+#: pg_recvlogical.c:271
+#, c-format
+msgid "streaming initiated"
+msgstr "strömning initierad"
+
+#: pg_recvlogical.c:335
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "kunde inte öppna loggfil \"%s\": %m"
+
+#: pg_recvlogical.c:364 receivelog.c:889
+#, c-format
+msgid "invalid socket: %s"
+msgstr "ogiltigt uttag: %s"
+
+#: pg_recvlogical.c:417 receivelog.c:917
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() misslyckades: %m"
+
+#: pg_recvlogical.c:424 receivelog.c:967
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "kunde inte ta emot data från WAL-ström: %s"
+
+#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011
+#: receivelog.c:1074
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "strömningsheader för liten: %d"
+
+#: pg_recvlogical.c:501 receivelog.c:849
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "okänd strömningsheader: \"%c\""
+
+#: pg_recvlogical.c:555 pg_recvlogical.c:567
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "kunde inte skriva %d byte till loggfil \"%s\": %m"
+
+#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "oväntad terminering av replikeringsström: %s"
+
+#: pg_recvlogical.c:780
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "kunde inte parsa startposition \"%s\""
+
+#: pg_recvlogical.c:858
+#, c-format
+msgid "no slot specified"
+msgstr "ingen slot angiven"
+
+#: pg_recvlogical.c:865
+#, c-format
+msgid "no target file specified"
+msgstr "ingen målfil angiven"
+
+#: pg_recvlogical.c:872
+#, c-format
+msgid "no database specified"
+msgstr "ingen databas angiven"
+
+#: pg_recvlogical.c:879
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "minst en handling måste anges"
+
+#: pg_recvlogical.c:886
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "kan inte använda --create-slot eller --start tillsammans med --drop-slot"
+
+#: pg_recvlogical.c:893
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "kan inte använda --create-slot eller --drop-slot tillsammans med --startpos"
+
+#: pg_recvlogical.c:900
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos får bara anges tillsammans med --start"
+
+#: pg_recvlogical.c:907
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase får bara anges tillsammans med --create-slot"
+
+#: pg_recvlogical.c:939
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "kunde inte upprätta databasspecifik replikeringsanslutning"
+
+#: pg_recvlogical.c:1033
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "slutposition %X/%X nådd av keepalive"
+
+#: pg_recvlogical.c:1036
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "slutposition %X/%X nådd av WAL-post vid %X/%X"
+
+#: receivelog.c:68
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "kunde inte skapa arkiveringsstatusfil \"%s\": %s"
+
+#: receivelog.c:75
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "kunde inte stänga arkiveringsstatusfil \"%s\": %s"
+
+#: receivelog.c:123
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "kunde inte hämta storleken på write-ahead-logg-fil \"%s\": %s"
+
+#: receivelog.c:134
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "kunde inte öppna existerande write-ahead-logg-fil \"%s\": %s"
+
+#: receivelog.c:143
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "kunde inte fsync:a befintlig write-ahead-logg-fil \"%s\": %s"
+
+#: receivelog.c:158
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "write-ahead-logg-fil \"%s\" har %zd byte, skall vara 0 eller %d"
+msgstr[1] "write-ahead-logg-fil \"%s\" har %zd byte, skall vara 0 eller %d"
+
+#: receivelog.c:174
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "kunde inte öppna write-ahead-logg-fil \"%s\": %s"
+
+#: receivelog.c:208
+#, c-format
+msgid "could not determine seek position in file \"%s\": %s"
+msgstr "kunde inte fastställa sökposition i fil \"%s\": %s"
+
+#: receivelog.c:223
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "byter inte namn på \"%s\", segmentet är inte komplett"
+
+#: receivelog.c:234 receivelog.c:323 receivelog.c:694
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "kunde inte stänga fil \"%s\": %s"
+
+#: receivelog.c:295
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "servern rapporterade oväntat historikfilnamn för tidslinje %u: %s"
+
+#: receivelog.c:303
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "kunde inte skapa tidslinjehistorikfil \"%s\": %s"
+
+#: receivelog.c:310
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "kunde inte skriva tidslinjehistorikfil \"%s\": %s"
+
+#: receivelog.c:400
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "inkompatibel serverversion %s; klienten stöder inte stömning från serverversioner äldre än %s"
+
+#: receivelog.c:409
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "inkompatibel serverversion %s; klienten stöder inte stömning från serverversioner nyare än %s"
+
+#: receivelog.c:514
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "systemidentifieraren matchar inte mellan basbackup och strömningsanslutning"
+
+#: receivelog.c:522
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "starttidslinje %u finns inte tillgänglig i servern"
+
+#: receivelog.c:561
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "oväntat svar på TIMELINE_HISTORY-kommando: fick %d rader och %d fält, förväntade %d rader och %d fält"
+
+#: receivelog.c:632
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "servern rapporterade oväntad nästa tidslinje %u, följer på tidslinje %u"
+
+#: receivelog.c:638
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "servern stoppade strömning av tidslinje %u vid %X/%X men rapporterade nästa tidslinje %u skulle börja vid %X/%X"
+
+#: receivelog.c:678
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "replikeringsström avslutades innan stoppunkt"
+
+#: receivelog.c:724
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "oväntad resultatmängd efter slut-på-tidslinje: fick %d rader och %d fält, förväntade %d rader och %d fält"
+
+#: receivelog.c:733
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "kunde inte parsa nästa tidslinjens startpunkt \"%s\""
+
+#: receivelog.c:781 receivelog.c:1030 walmethods.c:1205
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "kunde inte fsync:a fil \"%s\": %s"
+
+#: receivelog.c:1091
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "tog emot write-ahead-logg-post för offset %u utan att ha någon öppen fil"
+
+#: receivelog.c:1101
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "fick WAL-data-offset %08x, förväntade %08x"
+
+#: receivelog.c:1135
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "kunde inte skriva %d byte till WAL-fil \"%s\": %s"
+
+#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "kunde inte skicka \"copy-end\"-paket: %s"
+
+#: streamutil.c:159
+msgid "Password: "
+msgstr "Lösenord: "
+
+#: streamutil.c:182
+#, c-format
+msgid "could not connect to server"
+msgstr "kunde inte ansluta till server"
+
+#: streamutil.c:225
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "kunde inte nollställa search_path: %s"
+
+#: streamutil.c:241
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "kunde inte lista ut serverns inställning för integer_datetimes"
+
+#: streamutil.c:248
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "kompileringsflaggan integer_datetimes matchar inte servern"
+
+#: streamutil.c:299
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "kunde inte hämta WAL-segmentstorlek: fick %d rader och %d fält, förväntade %d rader och %d eller fler fält"
+
+#: streamutil.c:309
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "WAL-segment-storlek kunde inte parsas"
+
+#: streamutil.c:327
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men fjärrservern rapporterade värdet %d byte"
+msgstr[1] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men fjärrservern rapporterade värdet %d byte"
+
+#: streamutil.c:372
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "kunde inte hämta gruppaccessflagga: fick %d rader och %d fält, förväntade %d rader och %d eller fler fält"
+
+#: streamutil.c:381
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "gruppaccessflagga kunde inte parsas: %s"
+
+#: streamutil.c:424 streamutil.c:461
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "kunde inte identifiera system: fick %d rader och %d fält, förväntade %d rader och %d eller fler fält"
+
+#: streamutil.c:513
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "kunde inte läsa replikeringsslot \"%s\": fick %d rader och %d fält, förväntade %d rader och %d fält"
+
+#: streamutil.c:525
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "replikeringsslot \"%s\" existerar inte"
+
+#: streamutil.c:536
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "förväntade en fysisk replikeringsslot men fick av typen \"%s\" istället"
+
+#: streamutil.c:550
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "kunde inte parsa restart_lsn \"%s\" för replikeringsslot \"%s\""
+
+#: streamutil.c:667
+#, c-format
+msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "kunde inte skapa replikeringsslot \"%s\": fick %d rader och %d fält, förväntade %d rader och %d fält"
+
+#: streamutil.c:711
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "kunde inte slänga replikeringsslot \"%s\": fick %d rader och %d fält, förväntade %d rader och %d fält"
+
+#: walmethods.c:720 walmethods.c:1267
+msgid "could not compress data"
+msgstr "kunde inte komprimera data"
+
+#: walmethods.c:749
+msgid "could not reset compression stream"
+msgstr "kunde inte nollställa komprimeringsström"
+
+#: walmethods.c:880
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "implementationsfel: tar-filer kan inte ha mer än en öppen fil"
+
+#: walmethods.c:894
+msgid "could not create tar header"
+msgstr "kunde inte skapa tar-header"
+
+#: walmethods.c:910 walmethods.c:951 walmethods.c:1170 walmethods.c:1183
+msgid "could not change compression parameters"
+msgstr "kunde inte ändra komprimeringsparametrar"
+
+#: walmethods.c:1055
+msgid "unlink not supported with compression"
+msgstr "unlink stöds inte med komprimering"
+
+#: walmethods.c:1291
+msgid "could not close compression stream"
+msgstr "kunde inte stänga komprimeringsström"
diff --git a/src/bin/pg_basebackup/po/uk.po b/src/bin/pg_basebackup/po/uk.po
new file mode 100644
index 0000000..d840949
--- /dev/null
+++ b/src/bin/pg_basebackup/po/uk.po
@@ -0,0 +1,1759 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-01-31 23:18+0000\n"
+"PO-Revision-Date: 2023-04-19 15:06\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_basebackup.pot\n"
+"X-Crowdin-File-ID: 910\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередження: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../common/compression.c:130 ../../common/compression.c:139
+#: ../../common/compression.c:148
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "ця збірка не підтримує стиснення з %s"
+
+#: ../../common/compression.c:203
+msgid "found empty string where a compression option was expected"
+msgstr "знайдено порожній рядок, де очікувався параметр стискання"
+
+#: ../../common/compression.c:237
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "нерозпізнаний алгоритм стискання: \"%s\""
+
+#: ../../common/compression.c:276
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "параметр стискання \"%s\" потребує значення"
+
+#: ../../common/compression.c:285
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "значення параметру стискання \"%s\" має бути цілим числом"
+
+#: ../../common/compression.c:335
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "алгоритм стискання \"%s\" не приймає рівень стискання"
+
+#: ../../common/compression.c:342
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "алгоритм стискання \"%s\" очікує рівень стискання між %d і %d (за замовчуванням %d)"
+
+#: ../../common/compression.c:353
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "алгоритм стиснення \"%s\" не приймає кількість працівників"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "недостатньо пам'яті\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "неможливо дублювати нульовий покажчик (внутрішня помилка)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#: pg_receivewal.c:380 pg_recvlogical.c:341
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не вдалося отримати інформацію від файлу \"%s\": %m"
+
+#: ../../common/file_utils.c:166 pg_receivewal.c:303
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не вдалося відкрити каталог \"%s\": %m"
+
+#: ../../common/file_utils.c:200 pg_receivewal.c:532
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не вдалося прочитати каталог \"%s\": %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:447
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#: pg_recvlogical.c:196
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "не вдалося fsync файл \"%s\": %m"
+
+#: ../../common/file_utils.c:383 pg_basebackup.c:2266 walmethods.c:459
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "не вдалося перейменувати файл \"%s\" на \"%s\": %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неприпустиме значення \"%s\" для параметра %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s має бути в діапазоні %d..%d"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1646
+#, c-format
+msgid "out of memory"
+msgstr "недостатньо пам'яті"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1443 pg_basebackup.c:1737
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "неможливо записати до файлу \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339
+#: pg_basebackup.c:1507 pg_basebackup.c:1716
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "неможливо створити файл \"%s\": %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:635
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "неможливо закрити файл \"%s\": %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "неочікуваний стан під час розпакування архіву"
+
+#: bbstreamer_file.c:298 pg_basebackup.c:696 pg_basebackup.c:740
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не вдалося створити каталог \"%s\": %m"
+
+#: bbstreamer_file.c:304
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "не вдалося встановити права для каталогу \"%s\": %m"
+
+#: bbstreamer_file.c:323
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "не вдалося створити символічне послання з \"%s\" на \"%s\": %m"
+
+#: bbstreamer_file.c:343
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "не вдалося встановити права на файл \"%s\": %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "не вдалося створити стиснутий файл \"%s\": %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "не вдалося дублювати stdout: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "не вдалося відкрити вихідний файл: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "не вдалося встановити рівень стискання %d: %s"
+
+#: bbstreamer_gzip.c:116 bbstreamer_gzip.c:249
+#, c-format
+msgid "this build does not support gzip compression"
+msgstr "ця збірка не підтримує стиснення gzip"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "не вдалося записати до стиснутого файлу \"%s\": %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "не вдалося закрити стиснутий файл \"%s\": %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:869
+#, c-format
+msgid "could not initialize compression library"
+msgstr "не вдалося ініціалізувати бібліотеку стискання"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:316
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "не вдалося розпакувати дані: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "неочікуваний стан під час введення налаштувань відновлення"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "не вдалося створити контекст стиснення lz4: %s"
+
+#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298
+#, c-format
+msgid "this build does not support lz4 compression"
+msgstr "ця збірка не підтримує стиснення lz4"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "не вдалося записати заголовок lz4: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:168 bbstreamer_zstd.c:210
+#, c-format
+msgid "could not compress data: %s"
+msgstr "не вдалося стиснути дані: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "не вдалося закінчити стискання lz4: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "не вдалося ініціалізувати бібліотеку стиснення: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "причіп файлу tar перевищує 2 блоки"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "неочікуваний стан під час розбору архіву tar"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "частина tar містить порожню назву"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "потік COPY завершився до завершення останнього файлу"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "не вдалося створити контекст стиснення zstd"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "не вдалося встановити рівень стискання zstd на %d: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "не вдалося встановити кількість процесів стискання на %d: %s"
+
+#: bbstreamer_zstd.c:116 bbstreamer_zstd.c:271
+#, c-format
+msgid "this build does not support zstd compression"
+msgstr "ця збірка не підтримує стиснення zstd"
+
+#: bbstreamer_zstd.c:262
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "не вдалося створити контекст zstd декомпресії"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "видалення даних з директорії \"%s\""
+
+#: pg_basebackup.c:242
+#, c-format
+msgid "failed to remove data directory"
+msgstr "не вдалося видалити дані директорії"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "видалення даних з директорії \"%s\""
+
+#: pg_basebackup.c:248
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "не вдалося видалити дані директорії"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "видалення WAL директорії \"%s\""
+
+#: pg_basebackup.c:255
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "не вдалося видалити директорію WAL"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "видалення даних з директорії WAL \"%s\""
+
+#: pg_basebackup.c:261
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "не вдалося видалити дані директорії WAL"
+
+#: pg_basebackup.c:267
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "директорія даних \"%s\" не видалена за запитом користувача"
+
+#: pg_basebackup.c:270
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "директорія WAL \"%s\" не видалена за запитом користувача"
+
+#: pg_basebackup.c:274
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "зміни в каталогах табличних просторів незворотні"
+
+#: pg_basebackup.c:326
+#, c-format
+msgid "directory name too long"
+msgstr "ім'я директорії задовге"
+
+#: pg_basebackup.c:333
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "кілька знаків \"=\" зіставленні табличних просторів"
+
+#: pg_basebackup.c:342
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "неприпустимий табличний простір зіставлення формату \"%s\", має бути \"OLDDIR = NEWDIR\""
+
+#: pg_basebackup.c:361
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "старий каталог не є абсолютним шляхом у зіставлення табличного простору: %s"
+
+#: pg_basebackup.c:365
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "новий каталог не є абсолютним шляхом у зіставлення табличного простору: %s"
+
+#: pg_basebackup.c:387
+#, c-format
+msgid "%s takes a base backup of a running PostgreSQL server.\n\n"
+msgstr "%s робить базову резервну копію працюючого сервера PostgreSQL.\n\n"
+
+#: pg_basebackup.c:389 pg_receivewal.c:81 pg_recvlogical.c:78
+#, c-format
+msgid "Usage:\n"
+msgstr "Використання:\n"
+
+#: pg_basebackup.c:390 pg_receivewal.c:82 pg_recvlogical.c:79
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s: [OPTION]...\n"
+
+#: pg_basebackup.c:391
+#, c-format
+msgid "\n"
+"Options controlling the output:\n"
+msgstr "\n"
+"Параметри, що контролюють вивід:\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, -- pgdata=DIRECTORY директорія, в яку зберегти резервну копію бази\n"
+
+#: pg_basebackup.c:393
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|т формат виводу (звичайний за замовчуванням, tar)\n"
+
+#: pg_basebackup.c:394
+#, c-format
+msgid " -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr " -r, --max-rate=RATE максимальна швидкість передавання даних до директорії\n"
+" (у кБ/с або з використанням суфіксів \"k\" або \"М\")\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid " -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr " -R, --write-recovery-conf\n"
+" записати конфігурацію для реплікації\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid " -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr " -t, --target=TARGET[:DETAIL]\n"
+" ціль резервного копіювання (якщо не клієнт)\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid " -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr " -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" перенестb табличний простір з OLDDIR до NEWDIR\n"
+
+#: pg_basebackup.c:402
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr "--waldir=WALDIR розташування журналу попереднього запису\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr " -X, --wal-method=none|fetch|stream\n"
+" додати необхідні WAL файли за допомогою вказаного методу\n"
+
+#: pg_basebackup.c:405
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip стиснути вихідний tar\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr " -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" стискати на клієнті або сервері, як зазначено\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none не стискати вивід tar\n"
+
+#: pg_basebackup.c:409
+#, c-format
+msgid "\n"
+"General options:\n"
+msgstr "\n"
+"Основні налаштування:\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid " -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr " -c, --checkpoint=fast|spread\n"
+" режим швидких або розділених контрольних точок\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot створити слот для реплікації\n"
+
+#: pg_basebackup.c:413
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL встановити мітку резервної копії\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean не очищати після помилок\n"
+
+#: pg_basebackup.c:415
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync не чекати завершення збереження даних на диску\n"
+
+#: pg_basebackup.c:416
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress відображати інформацію про прогрес\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:91
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=ИМ'Я_СЛОТА використовувати вказаний слот реплікації\n"
+
+#: pg_basebackup.c:418 pg_receivewal.c:93 pg_recvlogical.c:100
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose виводити детальні повідомлення\n"
+
+#: pg_basebackup.c:419 pg_receivewal.c:94 pg_recvlogical.c:101
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію і вийти\n"
+
+#: pg_basebackup.c:420
+#, c-format
+msgid " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr " --manifest-checksums=SHA{224,256,384,512}|CRC32C|НЕ\n"
+" використовувати алгоритм для контрольних сум маніфесту\n"
+
+#: pg_basebackup.c:422
+#, c-format
+msgid " --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr " --manifest-force-encode\n"
+" кодувати у hex всі імена файлів у маніфесті\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size не оцінювати розмір резервної копії на стороні сервера\n"
+
+#: pg_basebackup.c:425
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest пропустити створення маніфесту резервного копіювання\n"
+
+#: pg_basebackup.c:426
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot не створювати тимчасового слоту реплікації\n"
+
+#: pg_basebackup.c:427
+#, c-format
+msgid " --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr " --no-verify-checksums\n"
+" не перевіряти контрольні суми\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:97 pg_recvlogical.c:102
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку потім вийти\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid "\n"
+"Connection options:\n"
+msgstr "\n"
+"Налаштування з'єднання:\n"
+
+#: pg_basebackup.c:431 pg_receivewal.c:99
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR рядок з'єднання\n"
+
+#: pg_basebackup.c:432 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME хост сервера бази даних або каталог сокетів\n"
+
+#: pg_basebackup.c:433 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT порт сервера бази даних\n"
+
+#: pg_basebackup.c:434
+#, c-format
+msgid " -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr " -s, --status-interval=INTERVAL часу між пакетами статусу до сервера (у секундах)\n"
+
+#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME підключатись як вказаний користувач бази даних\n"
+
+#: pg_basebackup.c:437 pg_receivewal.c:103 pg_recvlogical.c:108
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ніколи не питати пароль\n"
+
+#: pg_basebackup.c:438 pg_receivewal.c:104 pg_recvlogical.c:109
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password обов'язково питати пароль (повинно відбуватися автоматично)\n"
+
+#: pg_basebackup.c:439 pg_receivewal.c:108 pg_recvlogical.c:110
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"Повідомляти про помилки на <%s>.\n"
+
+#: pg_basebackup.c:440 pg_receivewal.c:109 pg_recvlogical.c:111
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: pg_basebackup.c:482
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "не можливо прочитати з готових каналів: %m"
+
+#: pg_basebackup.c:485 pg_basebackup.c:632 pg_basebackup.c:2180
+#: streamutil.c:444
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "не вдалося проаналізувати наперед журнал локації \"%s\""
+
+#: pg_basebackup.c:591 pg_receivewal.c:663
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "не можливо закінчити написання файлів WAL: %m"
+
+#: pg_basebackup.c:641
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "не можливо створити канал для фонового процесу: %m"
+
+#: pg_basebackup.c:674
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "створено слот тимчасових реплікацій \"%s\""
+
+#: pg_basebackup.c:677
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "створено слот реплікацій \"%s\""
+
+#: pg_basebackup.c:711
+#, c-format
+msgid "could not create background process: %m"
+msgstr "не можливо створити фоновий процес: %m"
+
+#: pg_basebackup.c:720
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "не можливо створити фоновий потік: %m"
+
+#: pg_basebackup.c:759
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "каталог \"%s\" існує, але він не порожній"
+
+#: pg_basebackup.c:765
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "немає доступу до каталогу \"%s\": %m"
+
+#: pg_basebackup.c:842
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d табличний простір %*s"
+msgstr[1] "%*s/%s kB (100%%), %d/%d табличних простори %*s"
+msgstr[2] "%*s/%s kB (100%%), %d/%d табличних просторів %*s"
+msgstr[3] "%*s/%s kB (100%%), %d/%d табличних просторів %*s"
+
+#: pg_basebackup.c:854
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d табличний простір (%s%-*.*s)"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d табличних простори (%s%-*.*s)"
+msgstr[2] "%*s/%s kB (%d%%), %d/%d табличних просторів (%s%-*.*s)"
+msgstr[3] "%*s/%s kB (%d%%), %d/%d табличних просторів (%s%-*.*s)"
+
+#: pg_basebackup.c:870
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d табличний простір"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d табличних простори"
+msgstr[2] "%*s/%s kB (%d%%), %d/%d табличних просторів"
+msgstr[3] "%*s/%s kB (%d%%), %d/%d табличних просторів"
+
+#: pg_basebackup.c:894
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "частота передач \"%s\" не є припустимим значенням"
+
+#: pg_basebackup.c:896
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "неприпустима частота передач \"%s\": %m"
+
+#: pg_basebackup.c:903
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "частота передач повинна бути більша за нуль"
+
+#: pg_basebackup.c:933
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "неприпустима одиниця виміру в --max-rate: \"%s\""
+
+#: pg_basebackup.c:937
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "швидкість передачі \"%s\" перевищує діапазон цілого числа"
+
+#: pg_basebackup.c:944
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "швидкість передавання \"%s\" поза діапазоном"
+
+#: pg_basebackup.c:1040
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "не вдалося отримати потік даних COPY: %s"
+
+#: pg_basebackup.c:1057 pg_recvlogical.c:438 pg_recvlogical.c:610
+#: receivelog.c:981
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "не вдалося прочитати дані COPY: %s"
+
+#: pg_basebackup.c:1061
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "фоновий процес несподівано перервано"
+
+#: pg_basebackup.c:1132
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "неможливо підставити маніфест в стиснений tar-файл"
+
+#: pg_basebackup.c:1133
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "Використайте стиснення на клієнті та відправлення даних в каталог замість стандартного виводу, або використайте %s."
+
+#: pg_basebackup.c:1149
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "неможливо розібрати архів \"%s\""
+
+#: pg_basebackup.c:1150
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "Тільки архів tar може бути проаналізований."
+
+#: pg_basebackup.c:1152
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "Простий формат потребує обробки архіву в pg_basebackup для обробки."
+
+#: pg_basebackup.c:1154
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "Використання - в якості вихідного каталогу потребує pg_basebackup для аналізу архіву."
+
+#: pg_basebackup.c:1156
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "Параметр -R потребує використання pg_basebackup для аналізу архіву."
+
+#: pg_basebackup.c:1367
+#, c-format
+msgid "archives must precede manifest"
+msgstr "архіви повинні передувати маніфесту"
+
+#: pg_basebackup.c:1382
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "неприпустиме ім'я архіву: \"%s\""
+
+#: pg_basebackup.c:1454
+#, c-format
+msgid "unexpected payload data"
+msgstr "неочікувані дані корисного навантаження"
+
+#: pg_basebackup.c:1597
+#, c-format
+msgid "empty COPY message"
+msgstr "порожнє повідомлення COPY"
+
+#: pg_basebackup.c:1599
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "неправильне повідомлення COPY з типом %d, довжина %zu"
+
+#: pg_basebackup.c:1797
+#, c-format
+msgid "incompatible server version %s"
+msgstr "несумісна версія серверу %s"
+
+#: pg_basebackup.c:1813
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "Використайте -X none або -X fetch, щоб вимкнути потокову передачу журналу."
+
+#: pg_basebackup.c:1881
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "цілі резервного копіювання не підтримуються цією версією сервера"
+
+#: pg_basebackup.c:1884
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "конфігурація відновлення не може бути записана під час використання цілі резервного копіювання"
+
+#: pg_basebackup.c:1911
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "сервер не підтримує стиснення на сервері"
+
+#: pg_basebackup.c:1921
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "початок базового резервного копіювання, очікується завершення контрольної точки"
+
+#: pg_basebackup.c:1925
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "очікування контрольної точки"
+
+#: pg_basebackup.c:1938 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588
+#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504
+#: streamutil.c:656 streamutil.c:701
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "не вдалося відправити реплікаційну команду \"%s\": %s"
+
+#: pg_basebackup.c:1946
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "не вдалося почати базове резервне копіювання: %s"
+
+#: pg_basebackup.c:1949
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "сервер повернув неочікувану відповідь на команду BASE_BACKUP; отримано %d рядків і %d полів, очікувалось %d рядків і %d полів"
+
+#: pg_basebackup.c:1955
+#, c-format
+msgid "checkpoint completed"
+msgstr "контрольна точка завершена"
+
+#: pg_basebackup.c:1970
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "стартова точка у випереджувальному журналюванні: %s на часовій шкалі %u"
+
+#: pg_basebackup.c:1978
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "не вдалося отримати заголовок резервної копії: %s"
+
+#: pg_basebackup.c:1981
+#, c-format
+msgid "no data returned from server"
+msgstr "сервер не повернув дані"
+
+#: pg_basebackup.c:2016
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "можна записати лише один табличний простір в stdout, всього їх в базі даних %d"
+
+#: pg_basebackup.c:2029
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "запуск фонового процесу зчитування WAL"
+
+#: pg_basebackup.c:2111
+#, c-format
+msgid "backup failed: %s"
+msgstr "помилка резервного копіювання: %s"
+
+#: pg_basebackup.c:2114
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "сервер не повернув кінцеву позицію у випереджувальному журналюванні"
+
+#: pg_basebackup.c:2117
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "кінцева точка у випереджувальному журналюванні: %s"
+
+#: pg_basebackup.c:2128
+#, c-format
+msgid "checksum error occurred"
+msgstr "сталася помилка контрольної суми"
+
+#: pg_basebackup.c:2133
+#, c-format
+msgid "final receive failed: %s"
+msgstr "помилка в кінці передачі: %s"
+
+#: pg_basebackup.c:2157
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "очікування завершення потокового передавання фоновим процесом ..."
+
+#: pg_basebackup.c:2161
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "не вдалося надіслати команду до канала фонового процесу: %m"
+
+#: pg_basebackup.c:2166
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "збій при очікуванні дочірнього процесу: %m"
+
+#: pg_basebackup.c:2168
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "завершився дочірній процес %d, очікувалося %d"
+
+#: pg_basebackup.c:2170 streamutil.c:91 streamutil.c:197
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2190
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "неможливо дочекатися дочірнього потоку: %m"
+
+#: pg_basebackup.c:2195
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "не можливо отримати статус завершення дочірнього потоку: %m"
+
+#: pg_basebackup.c:2198
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "дочірній потік завершився з помилкою %u"
+
+#: pg_basebackup.c:2227
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "синхронізація даних з диском ..."
+
+#: pg_basebackup.c:2252
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "перейменування backup_manifest.tmp в backup_manifest"
+
+#: pg_basebackup.c:2272
+#, c-format
+msgid "base backup completed"
+msgstr "базове резервне копіювання завершено"
+
+#: pg_basebackup.c:2361
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "неприпустимий формат виводу \"%s\", повинен бути \"plain\" або \"tar\""
+
+#: pg_basebackup.c:2405
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "неприпустимий параметр wal-method \"%s\", повинен бути \"fetch\", \"stream\" або \"none\""
+
+#: pg_basebackup.c:2435
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "неприпустимий аргумент контрольної точки \"%s\", повинен бути \"fast\" або \"spread\""
+
+#: pg_basebackup.c:2486 pg_basebackup.c:2498 pg_basebackup.c:2520
+#: pg_basebackup.c:2532 pg_basebackup.c:2538 pg_basebackup.c:2590
+#: pg_basebackup.c:2601 pg_basebackup.c:2611 pg_basebackup.c:2617
+#: pg_basebackup.c:2624 pg_basebackup.c:2636 pg_basebackup.c:2648
+#: pg_basebackup.c:2656 pg_basebackup.c:2669 pg_basebackup.c:2675
+#: pg_basebackup.c:2684 pg_basebackup.c:2696 pg_basebackup.c:2707
+#: pg_basebackup.c:2715 pg_receivewal.c:814 pg_receivewal.c:826
+#: pg_receivewal.c:833 pg_receivewal.c:842 pg_receivewal.c:849
+#: pg_receivewal.c:859 pg_recvlogical.c:837 pg_recvlogical.c:849
+#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873
+#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894
+#: pg_recvlogical.c:901 pg_recvlogical.c:908
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" для додаткової інформації."
+
+#: pg_basebackup.c:2496 pg_receivewal.c:824 pg_recvlogical.c:847
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному рядку (перший \"%s\")"
+
+#: pg_basebackup.c:2519
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "неможливо одночасно вказати формат і ціль резервного копіювання"
+
+#: pg_basebackup.c:2531
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "потрібно вказати вихідний каталог або ціль резервного копіювання"
+
+#: pg_basebackup.c:2537
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "неможливо одночасно вказати вихідну директорію і ціль резервного копіювання"
+
+#: pg_basebackup.c:2567 pg_receivewal.c:868
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "нерозпізнаний алгоритм стискання: \"%s\""
+
+#: pg_basebackup.c:2573 pg_receivewal.c:875
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "неприпустима специфікація стискання: %s"
+
+#: pg_basebackup.c:2589
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "стиснення на стороні клієнта неможливе, коли вказана ціль резервного копіювання"
+
+#: pg_basebackup.c:2600
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "лише резервні копії в архіві tar можуть стискатись"
+
+#: pg_basebackup.c:2610
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "неможливо передавати WAL, коли вказана ціль резервного копіювання"
+
+#: pg_basebackup.c:2616
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "транслювати випереджувальні журналювання в режимі tar в потік stdout не можна"
+
+#: pg_basebackup.c:2623
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "слоти реплікації можуть використовуватись тільки з потоковим передаванням WAL"
+
+#: pg_basebackup.c:2635
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot не можна використовувати з іменем слота"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2646 pg_receivewal.c:840
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "для %s потрібно вказати слот за допомогою --slot"
+
+#: pg_basebackup.c:2654 pg_basebackup.c:2694 pg_basebackup.c:2705
+#: pg_basebackup.c:2713
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "параметри %s і %s несумісні"
+
+#: pg_basebackup.c:2668
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "Не можна вказати розташування директорії WAL разом з ціллю резервного копіювання"
+
+#: pg_basebackup.c:2674
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "розташування каталога WAL можна вказати лише в режимі plain"
+
+#: pg_basebackup.c:2683
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "розташування WAL каталогу має бути абсолютним шляхом"
+
+#: pg_basebackup.c:2784
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "не вдалося створити символічне послання \"%s\": %m"
+
+#: pg_basebackup.c:2786
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "символічні посилання не підтримуються цією платформою"
+
+#: pg_receivewal.c:79
+#, c-format
+msgid "%s receives PostgreSQL streaming write-ahead logs.\n\n"
+msgstr "%s отримує передачу випереджувальних журналів PostgreSQL.\n\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:84
+#, c-format
+msgid "\n"
+"Options:\n"
+msgstr "\n"
+"Параметри:\n"
+
+#: pg_receivewal.c:84
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=DIR зберігати файли випереджувального журналювання до цього каталогу\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:85
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN вийти після отримання вказаного LSN\n"
+
+#: pg_receivewal.c:86 pg_recvlogical.c:89
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists не видавати помилку, при створенні слота, якщо слот вже існує\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:91
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop переривати роботу при втраті підключення\n"
+
+#: pg_receivewal.c:88
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync не чекати безпечного збереження змін на диск\n"
+
+#: pg_receivewal.c:89 pg_recvlogical.c:96
+#, c-format
+msgid " -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr " -s, --status-interval=SECS\n"
+" інтервал між відправкою статусних пакетів серверу (за замовчуванням: %d)\n"
+
+#: pg_receivewal.c:92
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous очистити випереджувальне журналювання відразу після запису\n"
+
+#: pg_receivewal.c:95
+#, c-format
+msgid " -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr " -Z, --compress=METHOD[:DETAIL]\n"
+" стискати як вказано\n"
+
+#: pg_receivewal.c:105
+#, c-format
+msgid "\n"
+"Optional actions:\n"
+msgstr "\n"
+"Додаткові дії:\n"
+
+#: pg_receivewal.c:106 pg_recvlogical.c:81
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot створити новий слот реплікації (ім'я слота задає параметр --slot)\n"
+
+#: pg_receivewal.c:107 pg_recvlogical.c:82
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot видалити слот реплікації (ім'я слота задає параметр --slot)\n"
+
+#: pg_receivewal.c:252
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "завершено сегмент в позиції %X/%X (часова шкала %u)"
+
+#: pg_receivewal.c:259
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "зупинено потокове передавання журналу в позиції %X/%X (часова шкала %u)"
+
+#: pg_receivewal.c:275
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "переключено на часову шкалу %u в позиції %X/%X"
+
+#: pg_receivewal.c:285
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "отримано сигнал переривання, завершення роботи"
+
+#: pg_receivewal.c:317
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не вдалося закрити каталог \"%s\": %m"
+
+#: pg_receivewal.c:384
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "файл сегменту \"%s\" має неправильний розмір %lld, пропускається"
+
+#: pg_receivewal.c:401
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "не вдалося відкрити стиснутий файл \"%s\": %m"
+
+#: pg_receivewal.c:404
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "не вдалося знайти в стиснутому файлі \"%s\": %m"
+
+#: pg_receivewal.c:410
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "не вдалося прочитати стиснутий файл \"%s\": %m"
+
+#: pg_receivewal.c:413
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "не вдалося прочитати стиснутий файл \"%s\": прочитано %d з %zu"
+
+#: pg_receivewal.c:423
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "файл стиснутого сегменту \"%s\" має неправильний розмір без стискання %d, пропускається"
+
+#: pg_receivewal.c:451
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "не вдалося створити контекст декомпресії LZ4: %s"
+
+#: pg_receivewal.c:463
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не вдалося прочитати файл \"%s\": %m"
+
+#: pg_receivewal.c:481
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "не вдалося розпакувати файл \"%s\": %s"
+
+#: pg_receivewal.c:504
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "не вдалося звільнити контекст декомпресії LZ4: %s"
+
+#: pg_receivewal.c:509
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "файл стиснутого сегменту \"%s\" має неправильний розмір не стиснутого розміру %zu, пропускається"
+
+#: pg_receivewal.c:514
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "неможливо перевірити файл \"%s\": стиснення %s не підтримується даною збіркою"
+
+#: pg_receivewal.c:641
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "початок потокового передавання журналу в позиції %X/%X (часова шкала %u)"
+
+#: pg_receivewal.c:783 pg_recvlogical.c:785
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "не вдалося проаналізувати кінцеву позицію \"%s\""
+
+#: pg_receivewal.c:832
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "використовувати --create-slot разом з --drop-slot не можна"
+
+#: pg_receivewal.c:848
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "використовувати --synchronous разом з --no-sync не можна"
+
+#: pg_receivewal.c:858
+#, c-format
+msgid "no target directory specified"
+msgstr "цільовий каталог не вказано"
+
+#: pg_receivewal.c:882
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "стиснення з %s ще не підтримується"
+
+#: pg_receivewal.c:924
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "підключення для реплікації з використанням слоту \"%s\" неочікувано виявилось прив'язаним до бази даних"
+
+#: pg_receivewal.c:943 pg_recvlogical.c:955
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "видалення слоту реплікації \"%s\""
+
+#: pg_receivewal.c:954 pg_recvlogical.c:965
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "створення слоту реплікації \"%s\""
+
+#: pg_receivewal.c:983 pg_recvlogical.c:989
+#, c-format
+msgid "disconnected"
+msgstr "роз’єднано"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:987 pg_recvlogical.c:993
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "роз’єднано; через %d секунд буде повторна спроба"
+
+#: pg_recvlogical.c:76
+#, c-format
+msgid "%s controls PostgreSQL logical decoding streams.\n\n"
+msgstr "%s керує потоковими передаваннями логічного декодування PostgreSQL.\n\n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid "\n"
+"Action to be performed:\n"
+msgstr "\n"
+"Дія до виконання:\n"
+
+#: pg_recvlogical.c:83
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start почати потокове передавання в слоті реплікації (ім'я слоту задає параметр --slot)\n"
+
+#: pg_recvlogical.c:86
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=FILE зберігати журнал до цього файлу, - позначає stdout\n"
+
+#: pg_recvlogical.c:87
+#, c-format
+msgid " -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr " -F --fsync-interval=SECS\n"
+" час між fsyncs до файлу виводу (за замовчуванням: %d)\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN де в існуючому слоті слід почати потокове передавання\n"
+
+#: pg_recvlogical.c:92
+#, c-format
+msgid " -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr " -o, --option=NAME[=VALUE]\n"
+" передати параметр NAME з додатковим значенням VALUE до\n"
+" плагіну виводу\n"
+
+#: pg_recvlogical.c:95
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN використовувати плагін виводу PLUGIN (за замовчуванням: %s)\n"
+
+#: pg_recvlogical.c:98
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAME ім'я слоту логічної реплікації\n"
+
+#: pg_recvlogical.c:99
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr " -t, --two-phase активувати декодування підготовлених транзакцій під час створення слоту\n"
+
+#: pg_recvlogical.c:104
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=DBNAME бази даних для підключення\n"
+
+#: pg_recvlogical.c:137
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "підтвердження запису до %X/%X, очищення до %X/%X (слот %s)"
+
+#: pg_recvlogical.c:161 receivelog.c:366
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "не вдалося відправити пакет зворотнього зв'язку: %s"
+
+#: pg_recvlogical.c:229
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "початок потокового передавання журналу в позиції %X/%X (слот %s)"
+
+#: pg_recvlogical.c:271
+#, c-format
+msgid "streaming initiated"
+msgstr "потокове передавання ініційовано"
+
+#: pg_recvlogical.c:335
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "не вдалося відкрити файл журналу \"%s\": %m"
+
+#: pg_recvlogical.c:364 receivelog.c:889
+#, c-format
+msgid "invalid socket: %s"
+msgstr "неприпустимий сокет: %s"
+
+#: pg_recvlogical.c:417 receivelog.c:917
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() помилка: %m"
+
+#: pg_recvlogical.c:424 receivelog.c:967
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "не вдалося отримати дані з WAL потоку: %s"
+
+#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011
+#: receivelog.c:1074
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "заголовок потокового передавання занадто малий: %d"
+
+#: pg_recvlogical.c:501 receivelog.c:849
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "нерозпізнаний заголовок потокового передавання: \"%c\""
+
+#: pg_recvlogical.c:555 pg_recvlogical.c:567
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "не вдалося записати %d байт до файлу журналу \"%s\": %m"
+
+#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "неочікуване завершення роботи потоку реплікації: %s"
+
+#: pg_recvlogical.c:780
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "не вдалося аналізувати початкову позицію \"%s\""
+
+#: pg_recvlogical.c:858
+#, c-format
+msgid "no slot specified"
+msgstr "слот не вказано"
+
+#: pg_recvlogical.c:865
+#, c-format
+msgid "no target file specified"
+msgstr "цільовий файл не вказано"
+
+#: pg_recvlogical.c:872
+#, c-format
+msgid "no database specified"
+msgstr "база даних не вказана"
+
+#: pg_recvlogical.c:879
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "необхідно вказати щонайменше одну дію"
+
+#: pg_recvlogical.c:886
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "використовувати --create-slot або --start разом з --drop-slot не можна"
+
+#: pg_recvlogical.c:893
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "використовувати --create-slot або --drop-slot разом з --startpos не можна"
+
+#: pg_recvlogical.c:900
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos можна вказати лише з --start"
+
+#: pg_recvlogical.c:907
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase може бути вказано тільки з --create-slot"
+
+#: pg_recvlogical.c:939
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "не вдалося встановити підключення для реплікації до вказаної бази даних"
+
+#: pg_recvlogical.c:1033
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "кінцева позиція %X/%X досягнута наживо"
+
+#: pg_recvlogical.c:1036
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "кінцева позиція %X/%X досягнута WAL записом %X/%X"
+
+#: receivelog.c:68
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "не вдалося створити файл статусу архіву \"%s\": %s"
+
+#: receivelog.c:75
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "не вдалося закрити файл статусу архіву \"%s\": %s"
+
+#: receivelog.c:123
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "не вдалося отримати розмір файлу випереджувального журналювання \"%s\": %s"
+
+#: receivelog.c:134
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "не вдалося відкрити існуючий файл випереджувального журналювання \"%s\": %s"
+
+#: receivelog.c:143
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "не вдалося fsync існуючий файл випереджувального журналювання \"%s\": %s"
+
+#: receivelog.c:158
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "файл випереджувального журналювання \"%s\" має %zd байт, а повинен мати 0 або %d"
+msgstr[1] "файл випереджувального журналювання \"%s\" має %zd байти, а повинен мати 0 або %d"
+msgstr[2] "файл випереджувального журналювання \"%s\" має %zd байтів, а повинен мати 0 або %d"
+msgstr[3] "файл випереджувального журналювання \"%s\" має %zd байтів, а повинен мати 0 або %d"
+
+#: receivelog.c:174
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "не вдалося відкрити файл випереджувального журналювання \"%s\": %s"
+
+#: receivelog.c:208
+#, c-format
+msgid "could not determine seek position in file \"%s\": %s"
+msgstr "не вдалося визначити позицію у файлі \"%s\": %s"
+
+#: receivelog.c:223
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "не перейменовується \"%s\", сегмент не завершений"
+
+#: receivelog.c:234 receivelog.c:323 receivelog.c:694
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "не вдалося закрити файл \"%s\": %s"
+
+#: receivelog.c:295
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "сервер повідомив неочікуване ім'я файлу історії часової шкали %u: %s"
+
+#: receivelog.c:303
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "не вдалося створити файл історії часової шкали \"%s\": %s"
+
+#: receivelog.c:310
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "не вдалося записати файл історії часової шкали \"%s\": %s"
+
+#: receivelog.c:400
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "несумісна версія серверу %s; клієнт не підтримує потокове передавання з версій серверу старіших, ніж %s"
+
+#: receivelog.c:409
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "несумісна версія серверу %s; клієнт не підтримує потокове передавання з версій серверу новіших, ніж %s"
+
+#: receivelog.c:514
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "системний ідентифікатор базової резервної копії не відповідає ідентифікатору потокового передавання підключення"
+
+#: receivelog.c:522
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "початкова часова шкала %u не існує на сервері"
+
+#: receivelog.c:561
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "неочікувана відповідь на команду TIMELINE_HISTORY: отримано %d рядків і %d полів, очікувалось %d рядків і %d полів"
+
+#: receivelog.c:632
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "сервер неочікувано повідомив наступну часову шкалу %u після часової шкали %u"
+
+#: receivelog.c:638
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "сервер зупинив потокове передавання часової шкали %u в позиції %X/%X, але повідомив, що наступна часова шкала %u почнеться в позиції %X/%X"
+
+#: receivelog.c:678
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "потік реплікації перервано до точки зупинки"
+
+#: receivelog.c:724
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "неочікуваний набір результатів після кінця часової шкали: отримано %d рядків і %d полів, очікувалось %d рядків і %d полів"
+
+#: receivelog.c:733
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "не вдалося аналізувати початкову точку наступної часової шкали \"%s\""
+
+#: receivelog.c:781 receivelog.c:1030 walmethods.c:1205
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "не вдалося fsync файл \"%s\": %s"
+
+#: receivelog.c:1091
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "отримано запис випереджувального журналювання для зсуву %u з закритим файлом"
+
+#: receivelog.c:1101
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "отримано дані зсуву WAL %08x, очікувалось %08x"
+
+#: receivelog.c:1135
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "не вдалося записати %d байт до файлу WAL \"%s\": %s"
+
+#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "не вдалося відправити пакет кінця копіювання \"copy-end\": %s"
+
+#: streamutil.c:159
+msgid "Password: "
+msgstr "Пароль: "
+
+#: streamutil.c:182
+#, c-format
+msgid "could not connect to server"
+msgstr "не вдалося підключитись до серверу"
+
+#: streamutil.c:225
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "не вдалося очистити search_path: %s"
+
+#: streamutil.c:241
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "не вдалося визначити настроювання серверу для integer_datetimes"
+
+#: streamutil.c:248
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "параметри компіляції integer_datetimes не відповідають серверу"
+
+#: streamutil.c:299
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "не вдалося отримати розмір сегменту WAL: отримано %d рядків і %d полів, очікувалось %d рядків і %d або більше полів"
+
+#: streamutil.c:309
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "не вдалося аналізувати розмір сегмента WAL"
+
+#: streamutil.c:327
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "Розмір сегменту WAL повинен бути двійкою, піднесеною до степеня в інтервалі між 1 МБ і 1 ГБ, але віддалений сервер повідомив значення %d байт"
+msgstr[1] "Розмір сегменту WAL повинен бути двійкою, піднесеною до степеня в інтервалі між 1 МБ і 1 ГБ, але віддалений сервер повідомив значення %d байти"
+msgstr[2] "Розмір сегменту WAL повинен бути двійкою, піднесеною до степеня в інтервалі між 1 МБ і 1 ГБ, але віддалений сервер повідомив значення %d байтів"
+msgstr[3] "Розмір сегменту WAL повинен бути двійкою, піднесеною до степеня в інтервалі між 1 МБ і 1 ГБ, але віддалений сервер повідомив значення %d байтів"
+
+#: streamutil.c:372
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "не вдалося вилучити позначку доступа групи: отримано %d рядків і %d полів, очікувалось %d рядків і %d або більше полів"
+
+#: streamutil.c:381
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "не вдалося аналізувати позначку доступа групи: %s"
+
+#: streamutil.c:424 streamutil.c:461
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "не вдалося ідентифікувати систему: отримано %d рядків і %d полів, очікувалось %d рядків і %d або більше полів"
+
+#: streamutil.c:513
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "не вдалося прочитати слот реплікації \"%s\": отримано %d рядків і %d полів, очікувалось %d рядків і %d полів"
+
+#: streamutil.c:525
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "слот реплікації \"%s\" не існує"
+
+#: streamutil.c:536
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "очікувався слот фізичної реплікації, а натомість знайдено \"%s\""
+
+#: streamutil.c:550
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "не вдалося аналізувати restart_lsn \"%s\" для слоту реплікації \"%s\""
+
+#: streamutil.c:667
+#, c-format
+msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "не вдалося створити слот реплікації \"%s\": отримано %d рядків і %d полів, очікувалось %d рядків і %d полів"
+
+#: streamutil.c:711
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "не вдалося видалити слот реплікації \"%s\": отримано %d рядків і %d полів, очікувалось %d рядків і %d полів"
+
+#: walmethods.c:720 walmethods.c:1267
+msgid "could not compress data"
+msgstr "не вдалося стиснути дані"
+
+#: walmethods.c:749
+msgid "could not reset compression stream"
+msgstr "не вдалося скинути потік стискання"
+
+#: walmethods.c:880
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "помилка реалізації: файли tar не можуть мати більше одного відкритого файлу"
+
+#: walmethods.c:894
+msgid "could not create tar header"
+msgstr "не вдалося створити заголовок tar"
+
+#: walmethods.c:910 walmethods.c:951 walmethods.c:1170 walmethods.c:1183
+msgid "could not change compression parameters"
+msgstr "не вдалося змінити параметри стискання"
+
+#: walmethods.c:1055
+msgid "unlink not supported with compression"
+msgstr "unink не підтримується зі стисканням"
+
+#: walmethods.c:1291
+msgid "could not close compression stream"
+msgstr "не вдалося закрити потік стискання"
+
diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c
new file mode 100644
index 0000000..ad866a7
--- /dev/null
+++ b/src/bin/pg_basebackup/receivelog.c
@@ -0,0 +1,1276 @@
+/*-------------------------------------------------------------------------
+ *
+ * receivelog.c - receive WAL files using the streaming
+ * replication protocol.
+ *
+ * Author: Magnus Hagander <magnus@hagander.net>
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/receivelog.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+#include <unistd.h>
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+#include "access/xlog_internal.h"
+#include "common/file_utils.h"
+#include "common/logging.h"
+#include "libpq-fe.h"
+#include "receivelog.h"
+#include "streamutil.h"
+
+/* fd and filename for currently open WAL file */
+static Walfile *walfile = NULL;
+static char current_walfile_name[MAXPGPATH] = "";
+static bool reportFlushPosition = false;
+static XLogRecPtr lastFlushPosition = InvalidXLogRecPtr;
+
+static bool still_sending = true; /* feedback still needs to be sent? */
+
+static PGresult *HandleCopyStream(PGconn *conn, StreamCtl *stream,
+ XLogRecPtr *stoppos);
+static int CopyStreamPoll(PGconn *conn, long timeout_ms, pgsocket stop_socket);
+static int CopyStreamReceive(PGconn *conn, long timeout, pgsocket stop_socket,
+ char **buffer);
+static bool ProcessKeepaliveMsg(PGconn *conn, StreamCtl *stream, char *copybuf,
+ int len, XLogRecPtr blockpos, TimestampTz *last_status);
+static bool ProcessXLogDataMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
+ XLogRecPtr *blockpos);
+static PGresult *HandleEndOfCopyStream(PGconn *conn, StreamCtl *stream, char *copybuf,
+ XLogRecPtr blockpos, XLogRecPtr *stoppos);
+static bool CheckCopyStreamStop(PGconn *conn, StreamCtl *stream, XLogRecPtr blockpos);
+static long CalculateCopyStreamSleeptime(TimestampTz now, int standby_message_timeout,
+ TimestampTz last_status);
+
+static bool ReadEndOfStreamingResult(PGresult *res, XLogRecPtr *startpos,
+ uint32 *timeline);
+
+static bool
+mark_file_as_archived(StreamCtl *stream, const char *fname)
+{
+ Walfile *f;
+ static char tmppath[MAXPGPATH];
+
+ snprintf(tmppath, sizeof(tmppath), "archive_status/%s.done",
+ fname);
+
+ f = stream->walmethod->open_for_write(tmppath, NULL, 0);
+ if (f == NULL)
+ {
+ pg_log_error("could not create archive status file \"%s\": %s",
+ tmppath, stream->walmethod->getlasterror());
+ return false;
+ }
+
+ if (stream->walmethod->close(f, CLOSE_NORMAL) != 0)
+ {
+ pg_log_error("could not close archive status file \"%s\": %s",
+ tmppath, stream->walmethod->getlasterror());
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * Open a new WAL file in the specified directory.
+ *
+ * Returns true if OK; on failure, returns false after printing an error msg.
+ * On success, 'walfile' is set to the FD for the file, and the base filename
+ * (without partial_suffix) is stored in 'current_walfile_name'.
+ *
+ * The file will be padded to 16Mb with zeroes.
+ */
+static bool
+open_walfile(StreamCtl *stream, XLogRecPtr startpoint)
+{
+ Walfile *f;
+ char *fn;
+ ssize_t size;
+ XLogSegNo segno;
+
+ XLByteToSeg(startpoint, segno, WalSegSz);
+ XLogFileName(current_walfile_name, stream->timeline, segno, WalSegSz);
+
+ /* Note that this considers the compression used if necessary */
+ fn = stream->walmethod->get_file_name(current_walfile_name,
+ stream->partial_suffix);
+
+ /*
+ * When streaming to files, if an existing file exists we verify that it's
+ * either empty (just created), or a complete WalSegSz segment (in which
+ * case it has been created and padded). Anything else indicates a corrupt
+ * file. Compressed files have no need for padding, so just ignore this
+ * case.
+ *
+ * When streaming to tar, no file with this name will exist before, so we
+ * never have to verify a size.
+ */
+ if (stream->walmethod->compression_algorithm() == PG_COMPRESSION_NONE &&
+ stream->walmethod->existsfile(fn))
+ {
+ size = stream->walmethod->get_file_size(fn);
+ if (size < 0)
+ {
+ pg_log_error("could not get size of write-ahead log file \"%s\": %s",
+ fn, stream->walmethod->getlasterror());
+ pg_free(fn);
+ return false;
+ }
+ if (size == WalSegSz)
+ {
+ /* Already padded file. Open it for use */
+ f = stream->walmethod->open_for_write(current_walfile_name, stream->partial_suffix, 0);
+ if (f == NULL)
+ {
+ pg_log_error("could not open existing write-ahead log file \"%s\": %s",
+ fn, stream->walmethod->getlasterror());
+ pg_free(fn);
+ return false;
+ }
+
+ /* fsync file in case of a previous crash */
+ if (stream->walmethod->sync(f) != 0)
+ {
+ pg_log_error("could not fsync existing write-ahead log file \"%s\": %s",
+ fn, stream->walmethod->getlasterror());
+ stream->walmethod->close(f, CLOSE_UNLINK);
+ exit(1);
+ }
+
+ walfile = f;
+ pg_free(fn);
+ return true;
+ }
+ if (size != 0)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_log_error(ngettext("write-ahead log file \"%s\" has %zd byte, should be 0 or %d",
+ "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d",
+ size),
+ fn, size, WalSegSz);
+ pg_free(fn);
+ return false;
+ }
+ /* File existed and was empty, so fall through and open */
+ }
+
+ /* No file existed, so create one */
+
+ f = stream->walmethod->open_for_write(current_walfile_name,
+ stream->partial_suffix, WalSegSz);
+ if (f == NULL)
+ {
+ pg_log_error("could not open write-ahead log file \"%s\": %s",
+ fn, stream->walmethod->getlasterror());
+ pg_free(fn);
+ return false;
+ }
+
+ pg_free(fn);
+ walfile = f;
+ return true;
+}
+
+/*
+ * Close the current WAL file (if open), and rename it to the correct
+ * filename if it's complete. On failure, prints an error message to stderr
+ * and returns false, otherwise returns true.
+ */
+static bool
+close_walfile(StreamCtl *stream, XLogRecPtr pos)
+{
+ char *fn;
+ off_t currpos;
+ int r;
+
+ if (walfile == NULL)
+ return true;
+
+ /* Note that this considers the compression used if necessary */
+ fn = stream->walmethod->get_file_name(current_walfile_name,
+ stream->partial_suffix);
+
+ currpos = stream->walmethod->get_current_pos(walfile);
+
+ if (currpos == -1)
+ {
+ pg_log_error("could not determine seek position in file \"%s\": %s",
+ fn, stream->walmethod->getlasterror());
+ stream->walmethod->close(walfile, CLOSE_UNLINK);
+ walfile = NULL;
+
+ pg_free(fn);
+ return false;
+ }
+
+ if (stream->partial_suffix)
+ {
+ if (currpos == WalSegSz)
+ r = stream->walmethod->close(walfile, CLOSE_NORMAL);
+ else
+ {
+ pg_log_info("not renaming \"%s\", segment is not complete", fn);
+ r = stream->walmethod->close(walfile, CLOSE_NO_RENAME);
+ }
+ }
+ else
+ r = stream->walmethod->close(walfile, CLOSE_NORMAL);
+
+ walfile = NULL;
+
+ if (r != 0)
+ {
+ pg_log_error("could not close file \"%s\": %s",
+ fn, stream->walmethod->getlasterror());
+
+ pg_free(fn);
+ return false;
+ }
+
+ pg_free(fn);
+
+ /*
+ * Mark file as archived if requested by the caller - pg_basebackup needs
+ * to do so as files can otherwise get archived again after promotion of a
+ * new node. This is in line with walreceiver.c always doing a
+ * XLogArchiveForceDone() after a complete segment.
+ */
+ if (currpos == WalSegSz && stream->mark_done)
+ {
+ /* writes error message if failed */
+ if (!mark_file_as_archived(stream, current_walfile_name))
+ return false;
+ }
+
+ lastFlushPosition = pos;
+ return true;
+}
+
+
+/*
+ * Check if a timeline history file exists.
+ */
+static bool
+existsTimeLineHistoryFile(StreamCtl *stream)
+{
+ char histfname[MAXFNAMELEN];
+
+ /*
+ * Timeline 1 never has a history file. We treat that as if it existed,
+ * since we never need to stream it.
+ */
+ if (stream->timeline == 1)
+ return true;
+
+ TLHistoryFileName(histfname, stream->timeline);
+
+ return stream->walmethod->existsfile(histfname);
+}
+
+static bool
+writeTimeLineHistoryFile(StreamCtl *stream, char *filename, char *content)
+{
+ int size = strlen(content);
+ char histfname[MAXFNAMELEN];
+ Walfile *f;
+
+ /*
+ * Check that the server's idea of how timeline history files should be
+ * named matches ours.
+ */
+ TLHistoryFileName(histfname, stream->timeline);
+ if (strcmp(histfname, filename) != 0)
+ {
+ pg_log_error("server reported unexpected history file name for timeline %u: %s",
+ stream->timeline, filename);
+ return false;
+ }
+
+ f = stream->walmethod->open_for_write(histfname, ".tmp", 0);
+ if (f == NULL)
+ {
+ pg_log_error("could not create timeline history file \"%s\": %s",
+ histfname, stream->walmethod->getlasterror());
+ return false;
+ }
+
+ if ((int) stream->walmethod->write(f, content, size) != size)
+ {
+ pg_log_error("could not write timeline history file \"%s\": %s",
+ histfname, stream->walmethod->getlasterror());
+
+ /*
+ * If we fail to make the file, delete it to release disk space
+ */
+ stream->walmethod->close(f, CLOSE_UNLINK);
+
+ return false;
+ }
+
+ if (stream->walmethod->close(f, CLOSE_NORMAL) != 0)
+ {
+ pg_log_error("could not close file \"%s\": %s",
+ histfname, stream->walmethod->getlasterror());
+ return false;
+ }
+
+ /* Maintain archive_status, check close_walfile() for details. */
+ if (stream->mark_done)
+ {
+ /* writes error message if failed */
+ if (!mark_file_as_archived(stream, histfname))
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * Send a Standby Status Update message to server.
+ */
+static bool
+sendFeedback(PGconn *conn, XLogRecPtr blockpos, TimestampTz now, bool replyRequested)
+{
+ char replybuf[1 + 8 + 8 + 8 + 8 + 1];
+ int len = 0;
+
+ replybuf[len] = 'r';
+ len += 1;
+ fe_sendint64(blockpos, &replybuf[len]); /* write */
+ len += 8;
+ if (reportFlushPosition)
+ fe_sendint64(lastFlushPosition, &replybuf[len]); /* flush */
+ else
+ fe_sendint64(InvalidXLogRecPtr, &replybuf[len]); /* flush */
+ len += 8;
+ fe_sendint64(InvalidXLogRecPtr, &replybuf[len]); /* apply */
+ len += 8;
+ fe_sendint64(now, &replybuf[len]); /* sendTime */
+ len += 8;
+ replybuf[len] = replyRequested ? 1 : 0; /* replyRequested */
+ len += 1;
+
+ if (PQputCopyData(conn, replybuf, len) <= 0 || PQflush(conn))
+ {
+ pg_log_error("could not send feedback packet: %s",
+ PQerrorMessage(conn));
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * Check that the server version we're connected to is supported by
+ * ReceiveXlogStream().
+ *
+ * If it's not, an error message is printed to stderr, and false is returned.
+ */
+bool
+CheckServerVersionForStreaming(PGconn *conn)
+{
+ int minServerMajor,
+ maxServerMajor;
+ int serverMajor;
+
+ /*
+ * The message format used in streaming replication changed in 9.3, so we
+ * cannot stream from older servers. And we don't support servers newer
+ * than the client; it might work, but we don't know, so err on the safe
+ * side.
+ */
+ minServerMajor = 903;
+ maxServerMajor = PG_VERSION_NUM / 100;
+ serverMajor = PQserverVersion(conn) / 100;
+ if (serverMajor < minServerMajor)
+ {
+ const char *serverver = PQparameterStatus(conn, "server_version");
+
+ pg_log_error("incompatible server version %s; client does not support streaming from server versions older than %s",
+ serverver ? serverver : "'unknown'",
+ "9.3");
+ return false;
+ }
+ else if (serverMajor > maxServerMajor)
+ {
+ const char *serverver = PQparameterStatus(conn, "server_version");
+
+ pg_log_error("incompatible server version %s; client does not support streaming from server versions newer than %s",
+ serverver ? serverver : "'unknown'",
+ PG_VERSION);
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Receive a log stream starting at the specified position.
+ *
+ * Individual parameters are passed through the StreamCtl structure.
+ *
+ * If sysidentifier is specified, validate that both the system
+ * identifier and the timeline matches the specified ones
+ * (by sending an extra IDENTIFY_SYSTEM command)
+ *
+ * All received segments will be written to the directory
+ * specified by basedir. This will also fetch any missing timeline history
+ * files.
+ *
+ * The stream_stop callback will be called every time data
+ * is received, and whenever a segment is completed. If it returns
+ * true, the streaming will stop and the function
+ * return. As long as it returns false, streaming will continue
+ * indefinitely.
+ *
+ * If stream_stop() checks for external input, stop_socket should be set to
+ * the FD it checks. This will allow such input to be detected promptly
+ * rather than after standby_message_timeout (which might be indefinite).
+ * Note that signals will interrupt waits for input as well, but that is
+ * race-y since a signal received while busy won't interrupt the wait.
+ *
+ * standby_message_timeout controls how often we send a message
+ * back to the primary letting it know our progress, in milliseconds.
+ * Zero means no messages are sent.
+ * This message will only contain the write location, and never
+ * flush or replay.
+ *
+ * If 'partial_suffix' is not NULL, files are initially created with the
+ * given suffix, and the suffix is removed once the file is finished. That
+ * allows you to tell the difference between partial and completed files,
+ * so that you can continue later where you left.
+ *
+ * If 'synchronous' is true, the received WAL is flushed as soon as written,
+ * otherwise only when the WAL file is closed.
+ *
+ * Note: The WAL location *must* be at a log segment start!
+ */
+bool
+ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
+{
+ char query[128];
+ char slotcmd[128];
+ PGresult *res;
+ XLogRecPtr stoppos;
+
+ /*
+ * The caller should've checked the server version already, but doesn't do
+ * any harm to check it here too.
+ */
+ if (!CheckServerVersionForStreaming(conn))
+ return false;
+
+ /*
+ * Decide whether we want to report the flush position. If we report the
+ * flush position, the primary will know what WAL we'll possibly
+ * re-request, and it can then remove older WAL safely. We must always do
+ * that when we are using slots.
+ *
+ * Reporting the flush position makes one eligible as a synchronous
+ * replica. People shouldn't include generic names in
+ * synchronous_standby_names, but we've protected them against it so far,
+ * so let's continue to do so unless specifically requested.
+ */
+ if (stream->replication_slot != NULL)
+ {
+ reportFlushPosition = true;
+ sprintf(slotcmd, "SLOT \"%s\" ", stream->replication_slot);
+ }
+ else
+ {
+ if (stream->synchronous)
+ reportFlushPosition = true;
+ else
+ reportFlushPosition = false;
+ slotcmd[0] = 0;
+ }
+
+ if (stream->sysidentifier != NULL)
+ {
+ char *sysidentifier = NULL;
+ TimeLineID servertli;
+
+ /*
+ * Get the server system identifier and timeline, and validate them.
+ */
+ if (!RunIdentifySystem(conn, &sysidentifier, &servertli, NULL, NULL))
+ {
+ pg_free(sysidentifier);
+ return false;
+ }
+
+ if (strcmp(stream->sysidentifier, sysidentifier) != 0)
+ {
+ pg_log_error("system identifier does not match between base backup and streaming connection");
+ pg_free(sysidentifier);
+ return false;
+ }
+ pg_free(sysidentifier);
+
+ if (stream->timeline > servertli)
+ {
+ pg_log_error("starting timeline %u is not present in the server",
+ stream->timeline);
+ return false;
+ }
+ }
+
+ /*
+ * initialize flush position to starting point, it's the caller's
+ * responsibility that that's sane.
+ */
+ lastFlushPosition = stream->startpos;
+
+ while (1)
+ {
+ /*
+ * Fetch the timeline history file for this timeline, if we don't have
+ * it already. When streaming log to tar, this will always return
+ * false, as we are never streaming into an existing file and
+ * therefore there can be no pre-existing timeline history file.
+ */
+ if (!existsTimeLineHistoryFile(stream))
+ {
+ snprintf(query, sizeof(query), "TIMELINE_HISTORY %u", stream->timeline);
+ res = PQexec(conn, query);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ /* FIXME: we might send it ok, but get an error */
+ pg_log_error("could not send replication command \"%s\": %s",
+ "TIMELINE_HISTORY", PQresultErrorMessage(res));
+ PQclear(res);
+ return false;
+ }
+
+ /*
+ * The response to TIMELINE_HISTORY is a single row result set
+ * with two fields: filename and content
+ */
+ if (PQnfields(res) != 2 || PQntuples(res) != 1)
+ {
+ pg_log_warning("unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields",
+ PQntuples(res), PQnfields(res), 1, 2);
+ }
+
+ /* Write the history file to disk */
+ writeTimeLineHistoryFile(stream,
+ PQgetvalue(res, 0, 0),
+ PQgetvalue(res, 0, 1));
+
+ PQclear(res);
+ }
+
+ /*
+ * Before we start streaming from the requested location, check if the
+ * callback tells us to stop here.
+ */
+ if (stream->stream_stop(stream->startpos, stream->timeline, false))
+ return true;
+
+ /* Initiate the replication stream at specified location */
+ snprintf(query, sizeof(query), "START_REPLICATION %s%X/%X TIMELINE %u",
+ slotcmd,
+ LSN_FORMAT_ARGS(stream->startpos),
+ stream->timeline);
+ res = PQexec(conn, query);
+ if (PQresultStatus(res) != PGRES_COPY_BOTH)
+ {
+ pg_log_error("could not send replication command \"%s\": %s",
+ "START_REPLICATION", PQresultErrorMessage(res));
+ PQclear(res);
+ return false;
+ }
+ PQclear(res);
+
+ /* Stream the WAL */
+ res = HandleCopyStream(conn, stream, &stoppos);
+ if (res == NULL)
+ goto error;
+
+ /*
+ * Streaming finished.
+ *
+ * There are two possible reasons for that: a controlled shutdown, or
+ * we reached the end of the current timeline. In case of
+ * end-of-timeline, the server sends a result set after Copy has
+ * finished, containing information about the next timeline. Read
+ * that, and restart streaming from the next timeline. In case of
+ * controlled shutdown, stop here.
+ */
+ if (PQresultStatus(res) == PGRES_TUPLES_OK)
+ {
+ /*
+ * End-of-timeline. Read the next timeline's ID and starting
+ * position. Usually, the starting position will match the end of
+ * the previous timeline, but there are corner cases like if the
+ * server had sent us half of a WAL record, when it was promoted.
+ * The new timeline will begin at the end of the last complete
+ * record in that case, overlapping the partial WAL record on the
+ * old timeline.
+ */
+ uint32 newtimeline;
+ bool parsed;
+
+ parsed = ReadEndOfStreamingResult(res, &stream->startpos, &newtimeline);
+ PQclear(res);
+ if (!parsed)
+ goto error;
+
+ /* Sanity check the values the server gave us */
+ if (newtimeline <= stream->timeline)
+ {
+ pg_log_error("server reported unexpected next timeline %u, following timeline %u",
+ newtimeline, stream->timeline);
+ goto error;
+ }
+ if (stream->startpos > stoppos)
+ {
+ pg_log_error("server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X",
+ stream->timeline, LSN_FORMAT_ARGS(stoppos),
+ newtimeline, LSN_FORMAT_ARGS(stream->startpos));
+ goto error;
+ }
+
+ /* Read the final result, which should be CommandComplete. */
+ res = PQgetResult(conn);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("unexpected termination of replication stream: %s",
+ PQresultErrorMessage(res));
+ PQclear(res);
+ goto error;
+ }
+ PQclear(res);
+
+ /*
+ * Loop back to start streaming from the new timeline. Always
+ * start streaming at the beginning of a segment.
+ */
+ stream->timeline = newtimeline;
+ stream->startpos = stream->startpos -
+ XLogSegmentOffset(stream->startpos, WalSegSz);
+ continue;
+ }
+ else if (PQresultStatus(res) == PGRES_COMMAND_OK)
+ {
+ PQclear(res);
+
+ /*
+ * End of replication (ie. controlled shut down of the server).
+ *
+ * Check if the callback thinks it's OK to stop here. If not,
+ * complain.
+ */
+ if (stream->stream_stop(stoppos, stream->timeline, false))
+ return true;
+ else
+ {
+ pg_log_error("replication stream was terminated before stop point");
+ goto error;
+ }
+ }
+ else
+ {
+ /* Server returned an error. */
+ pg_log_error("unexpected termination of replication stream: %s",
+ PQresultErrorMessage(res));
+ PQclear(res);
+ goto error;
+ }
+ }
+
+error:
+ if (walfile != NULL && stream->walmethod->close(walfile, CLOSE_NO_RENAME) != 0)
+ pg_log_error("could not close file \"%s\": %s",
+ current_walfile_name, stream->walmethod->getlasterror());
+ walfile = NULL;
+ return false;
+}
+
+/*
+ * Helper function to parse the result set returned by server after streaming
+ * has finished. On failure, prints an error to stderr and returns false.
+ */
+static bool
+ReadEndOfStreamingResult(PGresult *res, XLogRecPtr *startpos, uint32 *timeline)
+{
+ uint32 startpos_xlogid,
+ startpos_xrecoff;
+
+ /*----------
+ * The result set consists of one row and two columns, e.g:
+ *
+ * next_tli | next_tli_startpos
+ * ----------+-------------------
+ * 4 | 0/9949AE0
+ *
+ * next_tli is the timeline ID of the next timeline after the one that
+ * just finished streaming. next_tli_startpos is the WAL location where
+ * the server switched to it.
+ *----------
+ */
+ if (PQnfields(res) < 2 || PQntuples(res) != 1)
+ {
+ pg_log_error("unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields",
+ PQntuples(res), PQnfields(res), 1, 2);
+ return false;
+ }
+
+ *timeline = atoi(PQgetvalue(res, 0, 0));
+ if (sscanf(PQgetvalue(res, 0, 1), "%X/%X", &startpos_xlogid,
+ &startpos_xrecoff) != 2)
+ {
+ pg_log_error("could not parse next timeline's starting point \"%s\"",
+ PQgetvalue(res, 0, 1));
+ return false;
+ }
+ *startpos = ((uint64) startpos_xlogid << 32) | startpos_xrecoff;
+
+ return true;
+}
+
+/*
+ * The main loop of ReceiveXlogStream. Handles the COPY stream after
+ * initiating streaming with the START_REPLICATION command.
+ *
+ * If the COPY ends (not necessarily successfully) due a message from the
+ * server, returns a PGresult and sets *stoppos to the last byte written.
+ * On any other sort of error, returns NULL.
+ */
+static PGresult *
+HandleCopyStream(PGconn *conn, StreamCtl *stream,
+ XLogRecPtr *stoppos)
+{
+ char *copybuf = NULL;
+ TimestampTz last_status = -1;
+ XLogRecPtr blockpos = stream->startpos;
+
+ still_sending = true;
+
+ while (1)
+ {
+ int r;
+ TimestampTz now;
+ long sleeptime;
+
+ /*
+ * Check if we should continue streaming, or abort at this point.
+ */
+ if (!CheckCopyStreamStop(conn, stream, blockpos))
+ goto error;
+
+ now = feGetCurrentTimestamp();
+
+ /*
+ * If synchronous option is true, issue sync command as soon as there
+ * are WAL data which has not been flushed yet.
+ */
+ if (stream->synchronous && lastFlushPosition < blockpos && walfile != NULL)
+ {
+ if (stream->walmethod->sync(walfile) != 0)
+ pg_fatal("could not fsync file \"%s\": %s",
+ current_walfile_name, stream->walmethod->getlasterror());
+ lastFlushPosition = blockpos;
+
+ /*
+ * Send feedback so that the server sees the latest WAL locations
+ * immediately.
+ */
+ if (!sendFeedback(conn, blockpos, now, false))
+ goto error;
+ last_status = now;
+ }
+
+ /*
+ * Potentially send a status message to the primary
+ */
+ if (still_sending && stream->standby_message_timeout > 0 &&
+ feTimestampDifferenceExceeds(last_status, now,
+ stream->standby_message_timeout))
+ {
+ /* Time to send feedback! */
+ if (!sendFeedback(conn, blockpos, now, false))
+ goto error;
+ last_status = now;
+ }
+
+ /*
+ * Calculate how long send/receive loops should sleep
+ */
+ sleeptime = CalculateCopyStreamSleeptime(now, stream->standby_message_timeout,
+ last_status);
+
+ r = CopyStreamReceive(conn, sleeptime, stream->stop_socket, &copybuf);
+ while (r != 0)
+ {
+ if (r == -1)
+ goto error;
+ if (r == -2)
+ {
+ PGresult *res = HandleEndOfCopyStream(conn, stream, copybuf, blockpos, stoppos);
+
+ if (res == NULL)
+ goto error;
+ else
+ return res;
+ }
+
+ /* Check the message type. */
+ if (copybuf[0] == 'k')
+ {
+ if (!ProcessKeepaliveMsg(conn, stream, copybuf, r, blockpos,
+ &last_status))
+ goto error;
+ }
+ else if (copybuf[0] == 'w')
+ {
+ if (!ProcessXLogDataMsg(conn, stream, copybuf, r, &blockpos))
+ goto error;
+
+ /*
+ * Check if we should continue streaming, or abort at this
+ * point.
+ */
+ if (!CheckCopyStreamStop(conn, stream, blockpos))
+ goto error;
+ }
+ else
+ {
+ pg_log_error("unrecognized streaming header: \"%c\"",
+ copybuf[0]);
+ goto error;
+ }
+
+ /*
+ * Process the received data, and any subsequent data we can read
+ * without blocking.
+ */
+ r = CopyStreamReceive(conn, 0, stream->stop_socket, &copybuf);
+ }
+ }
+
+error:
+ if (copybuf != NULL)
+ PQfreemem(copybuf);
+ return NULL;
+}
+
+/*
+ * Wait until we can read a CopyData message,
+ * or timeout, or occurrence of a signal or input on the stop_socket.
+ * (timeout_ms < 0 means wait indefinitely; 0 means don't wait.)
+ *
+ * Returns 1 if data has become available for reading, 0 if timed out
+ * or interrupted by signal or stop_socket input, and -1 on an error.
+ */
+static int
+CopyStreamPoll(PGconn *conn, long timeout_ms, pgsocket stop_socket)
+{
+ int ret;
+ fd_set input_mask;
+ int connsocket;
+ int maxfd;
+ struct timeval timeout;
+ struct timeval *timeoutptr;
+
+ connsocket = PQsocket(conn);
+ if (connsocket < 0)
+ {
+ pg_log_error("invalid socket: %s", PQerrorMessage(conn));
+ return -1;
+ }
+
+ FD_ZERO(&input_mask);
+ FD_SET(connsocket, &input_mask);
+ maxfd = connsocket;
+ if (stop_socket != PGINVALID_SOCKET)
+ {
+ FD_SET(stop_socket, &input_mask);
+ maxfd = Max(maxfd, stop_socket);
+ }
+
+ if (timeout_ms < 0)
+ timeoutptr = NULL;
+ else
+ {
+ timeout.tv_sec = timeout_ms / 1000L;
+ timeout.tv_usec = (timeout_ms % 1000L) * 1000L;
+ timeoutptr = &timeout;
+ }
+
+ ret = select(maxfd + 1, &input_mask, NULL, NULL, timeoutptr);
+
+ if (ret < 0)
+ {
+ if (errno == EINTR)
+ return 0; /* Got a signal, so not an error */
+ pg_log_error("%s() failed: %m", "select");
+ return -1;
+ }
+ if (ret > 0 && FD_ISSET(connsocket, &input_mask))
+ return 1; /* Got input on connection socket */
+
+ return 0; /* Got timeout or input on stop_socket */
+}
+
+/*
+ * Receive CopyData message available from XLOG stream, blocking for
+ * maximum of 'timeout' ms.
+ *
+ * If data was received, returns the length of the data. *buffer is set to
+ * point to a buffer holding the received message. The buffer is only valid
+ * until the next CopyStreamReceive call.
+ *
+ * Returns 0 if no data was available within timeout, or if wait was
+ * interrupted by signal or stop_socket input.
+ * -1 on error. -2 if the server ended the COPY.
+ */
+static int
+CopyStreamReceive(PGconn *conn, long timeout, pgsocket stop_socket,
+ char **buffer)
+{
+ char *copybuf = NULL;
+ int rawlen;
+
+ if (*buffer != NULL)
+ PQfreemem(*buffer);
+ *buffer = NULL;
+
+ /* Try to receive a CopyData message */
+ rawlen = PQgetCopyData(conn, &copybuf, 1);
+ if (rawlen == 0)
+ {
+ int ret;
+
+ /*
+ * No data available. Wait for some to appear, but not longer than
+ * the specified timeout, so that we can ping the server. Also stop
+ * waiting if input appears on stop_socket.
+ */
+ ret = CopyStreamPoll(conn, timeout, stop_socket);
+ if (ret <= 0)
+ return ret;
+
+ /* Now there is actually data on the socket */
+ if (PQconsumeInput(conn) == 0)
+ {
+ pg_log_error("could not receive data from WAL stream: %s",
+ PQerrorMessage(conn));
+ return -1;
+ }
+
+ /* Now that we've consumed some input, try again */
+ rawlen = PQgetCopyData(conn, &copybuf, 1);
+ if (rawlen == 0)
+ return 0;
+ }
+ if (rawlen == -1) /* end-of-streaming or error */
+ return -2;
+ if (rawlen == -2)
+ {
+ pg_log_error("could not read COPY data: %s", PQerrorMessage(conn));
+ return -1;
+ }
+
+ /* Return received messages to caller */
+ *buffer = copybuf;
+ return rawlen;
+}
+
+/*
+ * Process the keepalive message.
+ */
+static bool
+ProcessKeepaliveMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
+ XLogRecPtr blockpos, TimestampTz *last_status)
+{
+ int pos;
+ bool replyRequested;
+ TimestampTz now;
+
+ /*
+ * Parse the keepalive message, enclosed in the CopyData message. We just
+ * check if the server requested a reply, and ignore the rest.
+ */
+ pos = 1; /* skip msgtype 'k' */
+ pos += 8; /* skip walEnd */
+ pos += 8; /* skip sendTime */
+
+ if (len < pos + 1)
+ {
+ pg_log_error("streaming header too small: %d", len);
+ return false;
+ }
+ replyRequested = copybuf[pos];
+
+ /* If the server requested an immediate reply, send one. */
+ if (replyRequested && still_sending)
+ {
+ if (reportFlushPosition && lastFlushPosition < blockpos &&
+ walfile != NULL)
+ {
+ /*
+ * If a valid flush location needs to be reported, flush the
+ * current WAL file so that the latest flush location is sent back
+ * to the server. This is necessary to see whether the last WAL
+ * data has been successfully replicated or not, at the normal
+ * shutdown of the server.
+ */
+ if (stream->walmethod->sync(walfile) != 0)
+ pg_fatal("could not fsync file \"%s\": %s",
+ current_walfile_name, stream->walmethod->getlasterror());
+ lastFlushPosition = blockpos;
+ }
+
+ now = feGetCurrentTimestamp();
+ if (!sendFeedback(conn, blockpos, now, false))
+ return false;
+ *last_status = now;
+ }
+
+ return true;
+}
+
+/*
+ * Process XLogData message.
+ */
+static bool
+ProcessXLogDataMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
+ XLogRecPtr *blockpos)
+{
+ int xlogoff;
+ int bytes_left;
+ int bytes_written;
+ int hdr_len;
+
+ /*
+ * Once we've decided we don't want to receive any more, just ignore any
+ * subsequent XLogData messages.
+ */
+ if (!(still_sending))
+ return true;
+
+ /*
+ * Read the header of the XLogData message, enclosed in the CopyData
+ * message. We only need the WAL location field (dataStart), the rest of
+ * the header is ignored.
+ */
+ hdr_len = 1; /* msgtype 'w' */
+ hdr_len += 8; /* dataStart */
+ hdr_len += 8; /* walEnd */
+ hdr_len += 8; /* sendTime */
+ if (len < hdr_len)
+ {
+ pg_log_error("streaming header too small: %d", len);
+ return false;
+ }
+ *blockpos = fe_recvint64(&copybuf[1]);
+
+ /* Extract WAL location for this block */
+ xlogoff = XLogSegmentOffset(*blockpos, WalSegSz);
+
+ /*
+ * Verify that the initial location in the stream matches where we think
+ * we are.
+ */
+ if (walfile == NULL)
+ {
+ /* No file open yet */
+ if (xlogoff != 0)
+ {
+ pg_log_error("received write-ahead log record for offset %u with no file open",
+ xlogoff);
+ return false;
+ }
+ }
+ else
+ {
+ /* More data in existing segment */
+ if (stream->walmethod->get_current_pos(walfile) != xlogoff)
+ {
+ pg_log_error("got WAL data offset %08x, expected %08x",
+ xlogoff, (int) stream->walmethod->get_current_pos(walfile));
+ return false;
+ }
+ }
+
+ bytes_left = len - hdr_len;
+ bytes_written = 0;
+
+ while (bytes_left)
+ {
+ int bytes_to_write;
+
+ /*
+ * If crossing a WAL boundary, only write up until we reach wal
+ * segment size.
+ */
+ if (xlogoff + bytes_left > WalSegSz)
+ bytes_to_write = WalSegSz - xlogoff;
+ else
+ bytes_to_write = bytes_left;
+
+ if (walfile == NULL)
+ {
+ if (!open_walfile(stream, *blockpos))
+ {
+ /* Error logged by open_walfile */
+ return false;
+ }
+ }
+
+ if (stream->walmethod->write(walfile, copybuf + hdr_len + bytes_written,
+ bytes_to_write) != bytes_to_write)
+ {
+ pg_log_error("could not write %d bytes to WAL file \"%s\": %s",
+ bytes_to_write, current_walfile_name,
+ stream->walmethod->getlasterror());
+ return false;
+ }
+
+ /* Write was successful, advance our position */
+ bytes_written += bytes_to_write;
+ bytes_left -= bytes_to_write;
+ *blockpos += bytes_to_write;
+ xlogoff += bytes_to_write;
+
+ /* Did we reach the end of a WAL segment? */
+ if (XLogSegmentOffset(*blockpos, WalSegSz) == 0)
+ {
+ if (!close_walfile(stream, *blockpos))
+ /* Error message written in close_walfile() */
+ return false;
+
+ xlogoff = 0;
+
+ if (still_sending && stream->stream_stop(*blockpos, stream->timeline, true))
+ {
+ if (PQputCopyEnd(conn, NULL) <= 0 || PQflush(conn))
+ {
+ pg_log_error("could not send copy-end packet: %s",
+ PQerrorMessage(conn));
+ return false;
+ }
+ still_sending = false;
+ return true; /* ignore the rest of this XLogData packet */
+ }
+ }
+ }
+ /* No more data left to write, receive next copy packet */
+
+ return true;
+}
+
+/*
+ * Handle end of the copy stream.
+ */
+static PGresult *
+HandleEndOfCopyStream(PGconn *conn, StreamCtl *stream, char *copybuf,
+ XLogRecPtr blockpos, XLogRecPtr *stoppos)
+{
+ PGresult *res = PQgetResult(conn);
+
+ /*
+ * The server closed its end of the copy stream. If we haven't closed
+ * ours already, we need to do so now, unless the server threw an error,
+ * in which case we don't.
+ */
+ if (still_sending)
+ {
+ if (!close_walfile(stream, blockpos))
+ {
+ /* Error message written in close_walfile() */
+ PQclear(res);
+ return NULL;
+ }
+ if (PQresultStatus(res) == PGRES_COPY_IN)
+ {
+ if (PQputCopyEnd(conn, NULL) <= 0 || PQflush(conn))
+ {
+ pg_log_error("could not send copy-end packet: %s",
+ PQerrorMessage(conn));
+ PQclear(res);
+ return NULL;
+ }
+ res = PQgetResult(conn);
+ }
+ still_sending = false;
+ }
+ if (copybuf != NULL)
+ PQfreemem(copybuf);
+ *stoppos = blockpos;
+ return res;
+}
+
+/*
+ * Check if we should continue streaming, or abort at this point.
+ */
+static bool
+CheckCopyStreamStop(PGconn *conn, StreamCtl *stream, XLogRecPtr blockpos)
+{
+ if (still_sending && stream->stream_stop(blockpos, stream->timeline, false))
+ {
+ if (!close_walfile(stream, blockpos))
+ {
+ /* Potential error message is written by close_walfile */
+ return false;
+ }
+ if (PQputCopyEnd(conn, NULL) <= 0 || PQflush(conn))
+ {
+ pg_log_error("could not send copy-end packet: %s",
+ PQerrorMessage(conn));
+ return false;
+ }
+ still_sending = false;
+ }
+
+ return true;
+}
+
+/*
+ * Calculate how long send/receive loops should sleep
+ */
+static long
+CalculateCopyStreamSleeptime(TimestampTz now, int standby_message_timeout,
+ TimestampTz last_status)
+{
+ TimestampTz status_targettime = 0;
+ long sleeptime;
+
+ if (standby_message_timeout && still_sending)
+ status_targettime = last_status +
+ (standby_message_timeout - 1) * ((int64) 1000);
+
+ if (status_targettime > 0)
+ {
+ long secs;
+ int usecs;
+
+ feTimestampDifference(now,
+ status_targettime,
+ &secs,
+ &usecs);
+ /* Always sleep at least 1 sec */
+ if (secs <= 0)
+ {
+ secs = 1;
+ usecs = 0;
+ }
+
+ sleeptime = secs * 1000 + usecs / 1000;
+ }
+ else
+ sleeptime = -1;
+
+ return sleeptime;
+}
diff --git a/src/bin/pg_basebackup/receivelog.h b/src/bin/pg_basebackup/receivelog.h
new file mode 100644
index 0000000..050d4bc
--- /dev/null
+++ b/src/bin/pg_basebackup/receivelog.h
@@ -0,0 +1,57 @@
+/*-------------------------------------------------------------------------
+ *
+ * receivelog.h
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/receivelog.h
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef RECEIVELOG_H
+#define RECEIVELOG_H
+
+#include "access/xlogdefs.h"
+#include "libpq-fe.h"
+#include "walmethods.h"
+
+/*
+ * Called before trying to read more data or when a segment is
+ * finished. Return true to stop streaming.
+ */
+typedef bool (*stream_stop_callback) (XLogRecPtr segendpos, uint32 timeline, bool segment_finished);
+
+/*
+ * Global parameters when receiving xlog stream. For details about the individual fields,
+ * see the function comment for ReceiveXlogStream().
+ */
+typedef struct StreamCtl
+{
+ XLogRecPtr startpos; /* Start position for streaming */
+ TimeLineID timeline; /* Timeline to stream data from */
+ char *sysidentifier; /* Validate this system identifier and
+ * timeline */
+ int standby_message_timeout; /* Send status messages this often */
+ bool synchronous; /* Flush immediately WAL data on write */
+ bool mark_done; /* Mark segment as done in generated archive */
+ bool do_sync; /* Flush to disk to ensure consistent state of
+ * data */
+
+ stream_stop_callback stream_stop; /* Stop streaming when returns true */
+
+ pgsocket stop_socket; /* if valid, watch for input on this socket
+ * and check stream_stop() when there is any */
+
+ WalWriteMethod *walmethod; /* How to write the WAL */
+ char *partial_suffix; /* Suffix appended to partially received files */
+ char *replication_slot; /* Replication slot to use, or NULL */
+} StreamCtl;
+
+
+
+extern bool CheckServerVersionForStreaming(PGconn *conn);
+extern bool ReceiveXlogStream(PGconn *conn,
+ StreamCtl *stream);
+
+#endif /* RECEIVELOG_H */
diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c
new file mode 100644
index 0000000..1478aa9
--- /dev/null
+++ b/src/bin/pg_basebackup/streamutil.c
@@ -0,0 +1,864 @@
+/*-------------------------------------------------------------------------
+ *
+ * streamutil.c - utility functions for pg_basebackup, pg_receivewal and
+ * pg_recvlogical
+ *
+ * Author: Magnus Hagander <magnus@hagander.net>
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/streamutil.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/time.h>
+#include <unistd.h>
+
+#include "access/xlog_internal.h"
+#include "common/connect.h"
+#include "common/fe_memutils.h"
+#include "common/file_perm.h"
+#include "common/logging.h"
+#include "common/string.h"
+#include "datatype/timestamp.h"
+#include "port/pg_bswap.h"
+#include "pqexpbuffer.h"
+#include "receivelog.h"
+#include "streamutil.h"
+
+#define ERRCODE_DUPLICATE_OBJECT "42710"
+
+uint32 WalSegSz;
+
+static bool RetrieveDataDirCreatePerm(PGconn *conn);
+
+/* SHOW command for replication connection was introduced in version 10 */
+#define MINIMUM_VERSION_FOR_SHOW_CMD 100000
+
+/*
+ * Group access is supported from version 11.
+ */
+#define MINIMUM_VERSION_FOR_GROUP_ACCESS 110000
+
+const char *progname;
+char *connection_string = NULL;
+char *dbhost = NULL;
+char *dbuser = NULL;
+char *dbport = NULL;
+char *dbname = NULL;
+int dbgetpassword = 0; /* 0=auto, -1=never, 1=always */
+static char *password = NULL;
+PGconn *conn = NULL;
+
+/*
+ * Connect to the server. Returns a valid PGconn pointer if connected,
+ * or NULL on non-permanent error. On permanent error, the function will
+ * call exit(1) directly.
+ */
+PGconn *
+GetConnection(void)
+{
+ PGconn *tmpconn;
+ int argcount = 7; /* dbname, replication, fallback_app_name,
+ * host, user, port, password */
+ int i;
+ const char **keywords;
+ const char **values;
+ const char *tmpparam;
+ bool need_password;
+ PQconninfoOption *conn_opts = NULL;
+ PQconninfoOption *conn_opt;
+ char *err_msg = NULL;
+
+ /* pg_recvlogical uses dbname only; others use connection_string only. */
+ Assert(dbname == NULL || connection_string == NULL);
+
+ /*
+ * Merge the connection info inputs given in form of connection string,
+ * options and default values (dbname=replication, replication=true, etc.)
+ * Explicitly discard any dbname value in the connection string;
+ * otherwise, PQconnectdbParams() would interpret that value as being
+ * itself a connection string.
+ */
+ i = 0;
+ if (connection_string)
+ {
+ conn_opts = PQconninfoParse(connection_string, &err_msg);
+ if (conn_opts == NULL)
+ pg_fatal("%s", err_msg);
+
+ for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++)
+ {
+ if (conn_opt->val != NULL && conn_opt->val[0] != '\0' &&
+ strcmp(conn_opt->keyword, "dbname") != 0)
+ argcount++;
+ }
+
+ keywords = pg_malloc0((argcount + 1) * sizeof(*keywords));
+ values = pg_malloc0((argcount + 1) * sizeof(*values));
+
+ for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++)
+ {
+ if (conn_opt->val != NULL && conn_opt->val[0] != '\0' &&
+ strcmp(conn_opt->keyword, "dbname") != 0)
+ {
+ keywords[i] = conn_opt->keyword;
+ values[i] = conn_opt->val;
+ i++;
+ }
+ }
+ }
+ else
+ {
+ keywords = pg_malloc0((argcount + 1) * sizeof(*keywords));
+ values = pg_malloc0((argcount + 1) * sizeof(*values));
+ }
+
+ keywords[i] = "dbname";
+ values[i] = dbname == NULL ? "replication" : dbname;
+ i++;
+ keywords[i] = "replication";
+ values[i] = dbname == NULL ? "true" : "database";
+ i++;
+ keywords[i] = "fallback_application_name";
+ values[i] = progname;
+ i++;
+
+ if (dbhost)
+ {
+ keywords[i] = "host";
+ values[i] = dbhost;
+ i++;
+ }
+ if (dbuser)
+ {
+ keywords[i] = "user";
+ values[i] = dbuser;
+ i++;
+ }
+ if (dbport)
+ {
+ keywords[i] = "port";
+ values[i] = dbport;
+ i++;
+ }
+
+ /* If -W was given, force prompt for password, but only the first time */
+ need_password = (dbgetpassword == 1 && !password);
+
+ do
+ {
+ /* Get a new password if appropriate */
+ if (need_password)
+ {
+ if (password)
+ free(password);
+ password = simple_prompt("Password: ", false);
+ need_password = false;
+ }
+
+ /* Use (or reuse, on a subsequent connection) password if we have it */
+ if (password)
+ {
+ keywords[i] = "password";
+ values[i] = password;
+ }
+ else
+ {
+ keywords[i] = NULL;
+ values[i] = NULL;
+ }
+
+ tmpconn = PQconnectdbParams(keywords, values, true);
+
+ /*
+ * If there is too little memory even to allocate the PGconn object
+ * and PQconnectdbParams returns NULL, we call exit(1) directly.
+ */
+ if (!tmpconn)
+ pg_fatal("could not connect to server");
+
+ /* If we need a password and -w wasn't given, loop back and get one */
+ if (PQstatus(tmpconn) == CONNECTION_BAD &&
+ PQconnectionNeedsPassword(tmpconn) &&
+ dbgetpassword != -1)
+ {
+ PQfinish(tmpconn);
+ need_password = true;
+ }
+ }
+ while (need_password);
+
+ if (PQstatus(tmpconn) != CONNECTION_OK)
+ {
+ pg_log_error("%s", PQerrorMessage(tmpconn));
+ PQfinish(tmpconn);
+ free(values);
+ free(keywords);
+ if (conn_opts)
+ PQconninfoFree(conn_opts);
+ return NULL;
+ }
+
+ /* Connection ok! */
+ free(values);
+ free(keywords);
+ if (conn_opts)
+ PQconninfoFree(conn_opts);
+
+ /*
+ * Set always-secure search path, so malicious users can't get control.
+ * The capacity to run normal SQL queries was added in PostgreSQL 10, so
+ * the search path cannot be changed (by us or attackers) on earlier
+ * versions.
+ */
+ if (dbname != NULL && PQserverVersion(tmpconn) >= 100000)
+ {
+ PGresult *res;
+
+ res = PQexec(tmpconn, ALWAYS_SECURE_SEARCH_PATH_SQL);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("could not clear search_path: %s",
+ PQerrorMessage(tmpconn));
+ PQclear(res);
+ PQfinish(tmpconn);
+ exit(1);
+ }
+ PQclear(res);
+ }
+
+ /*
+ * Ensure we have the same value of integer_datetimes (now always "on") as
+ * the server we are connecting to.
+ */
+ tmpparam = PQparameterStatus(tmpconn, "integer_datetimes");
+ if (!tmpparam)
+ {
+ pg_log_error("could not determine server setting for integer_datetimes");
+ PQfinish(tmpconn);
+ exit(1);
+ }
+
+ if (strcmp(tmpparam, "on") != 0)
+ {
+ pg_log_error("integer_datetimes compile flag does not match server");
+ PQfinish(tmpconn);
+ exit(1);
+ }
+
+ /*
+ * Retrieve the source data directory mode and use it to construct a umask
+ * for creating directories and files.
+ */
+ if (!RetrieveDataDirCreatePerm(tmpconn))
+ {
+ PQfinish(tmpconn);
+ exit(1);
+ }
+
+ return tmpconn;
+}
+
+/*
+ * From version 10, explicitly set wal segment size using SHOW wal_segment_size
+ * since ControlFile is not accessible here.
+ */
+bool
+RetrieveWalSegSize(PGconn *conn)
+{
+ PGresult *res;
+ char xlog_unit[3];
+ int xlog_val,
+ multiplier = 1;
+
+ /* check connection existence */
+ Assert(conn != NULL);
+
+ /* for previous versions set the default xlog seg size */
+ if (PQserverVersion(conn) < MINIMUM_VERSION_FOR_SHOW_CMD)
+ {
+ WalSegSz = DEFAULT_XLOG_SEG_SIZE;
+ return true;
+ }
+
+ res = PQexec(conn, "SHOW wal_segment_size");
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("could not send replication command \"%s\": %s",
+ "SHOW wal_segment_size", PQerrorMessage(conn));
+
+ PQclear(res);
+ return false;
+ }
+ if (PQntuples(res) != 1 || PQnfields(res) < 1)
+ {
+ pg_log_error("could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields",
+ PQntuples(res), PQnfields(res), 1, 1);
+
+ PQclear(res);
+ return false;
+ }
+
+ /* fetch xlog value and unit from the result */
+ if (sscanf(PQgetvalue(res, 0, 0), "%d%2s", &xlog_val, xlog_unit) != 2)
+ {
+ pg_log_error("WAL segment size could not be parsed");
+ PQclear(res);
+ return false;
+ }
+
+ PQclear(res);
+
+ /* set the multiplier based on unit to convert xlog_val to bytes */
+ if (strcmp(xlog_unit, "MB") == 0)
+ multiplier = 1024 * 1024;
+ else if (strcmp(xlog_unit, "GB") == 0)
+ multiplier = 1024 * 1024 * 1024;
+
+ /* convert and set WalSegSz */
+ WalSegSz = xlog_val * multiplier;
+
+ if (!IsValidWalSegSize(WalSegSz))
+ {
+ pg_log_error(ngettext("WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte",
+ "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes",
+ WalSegSz),
+ WalSegSz);
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * RetrieveDataDirCreatePerm
+ *
+ * This function is used to determine the privileges on the server's PG data
+ * directory and, based on that, set what the permissions will be for
+ * directories and files we create.
+ *
+ * PG11 added support for (optionally) group read/execute rights to be set on
+ * the data directory. Prior to PG11, only the owner was allowed to have rights
+ * on the data directory.
+ */
+static bool
+RetrieveDataDirCreatePerm(PGconn *conn)
+{
+ PGresult *res;
+ int data_directory_mode;
+
+ /* check connection existence */
+ Assert(conn != NULL);
+
+ /* for previous versions leave the default group access */
+ if (PQserverVersion(conn) < MINIMUM_VERSION_FOR_GROUP_ACCESS)
+ return true;
+
+ res = PQexec(conn, "SHOW data_directory_mode");
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("could not send replication command \"%s\": %s",
+ "SHOW data_directory_mode", PQerrorMessage(conn));
+
+ PQclear(res);
+ return false;
+ }
+ if (PQntuples(res) != 1 || PQnfields(res) < 1)
+ {
+ pg_log_error("could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields",
+ PQntuples(res), PQnfields(res), 1, 1);
+
+ PQclear(res);
+ return false;
+ }
+
+ if (sscanf(PQgetvalue(res, 0, 0), "%o", &data_directory_mode) != 1)
+ {
+ pg_log_error("group access flag could not be parsed: %s",
+ PQgetvalue(res, 0, 0));
+
+ PQclear(res);
+ return false;
+ }
+
+ SetDataDirectoryCreatePerm(data_directory_mode);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * Run IDENTIFY_SYSTEM through a given connection and give back to caller
+ * some result information if requested:
+ * - System identifier
+ * - Current timeline ID
+ * - Start LSN position
+ * - Database name (NULL in servers prior to 9.4)
+ */
+bool
+RunIdentifySystem(PGconn *conn, char **sysid, TimeLineID *starttli,
+ XLogRecPtr *startpos, char **db_name)
+{
+ PGresult *res;
+ uint32 hi,
+ lo;
+
+ /* Check connection existence */
+ Assert(conn != NULL);
+
+ res = PQexec(conn, "IDENTIFY_SYSTEM");
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("could not send replication command \"%s\": %s",
+ "IDENTIFY_SYSTEM", PQerrorMessage(conn));
+
+ PQclear(res);
+ return false;
+ }
+ if (PQntuples(res) != 1 || PQnfields(res) < 3)
+ {
+ pg_log_error("could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields",
+ PQntuples(res), PQnfields(res), 1, 3);
+
+ PQclear(res);
+ return false;
+ }
+
+ /* Get system identifier */
+ if (sysid != NULL)
+ *sysid = pg_strdup(PQgetvalue(res, 0, 0));
+
+ /* Get timeline ID to start streaming from */
+ if (starttli != NULL)
+ *starttli = atoi(PQgetvalue(res, 0, 1));
+
+ /* Get LSN start position if necessary */
+ if (startpos != NULL)
+ {
+ if (sscanf(PQgetvalue(res, 0, 2), "%X/%X", &hi, &lo) != 2)
+ {
+ pg_log_error("could not parse write-ahead log location \"%s\"",
+ PQgetvalue(res, 0, 2));
+
+ PQclear(res);
+ return false;
+ }
+ *startpos = ((uint64) hi) << 32 | lo;
+ }
+
+ /* Get database name, only available in 9.4 and newer versions */
+ if (db_name != NULL)
+ {
+ *db_name = NULL;
+ if (PQserverVersion(conn) >= 90400)
+ {
+ if (PQnfields(res) < 4)
+ {
+ pg_log_error("could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields",
+ PQntuples(res), PQnfields(res), 1, 4);
+
+ PQclear(res);
+ return false;
+ }
+ if (!PQgetisnull(res, 0, 3))
+ *db_name = pg_strdup(PQgetvalue(res, 0, 3));
+ }
+ }
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * Run READ_REPLICATION_SLOT through a given connection and give back to
+ * caller some result information if requested for this slot:
+ * - Start LSN position, InvalidXLogRecPtr if unknown.
+ * - Current timeline ID, 0 if unknown.
+ * Returns false on failure, and true otherwise.
+ */
+bool
+GetSlotInformation(PGconn *conn, const char *slot_name,
+ XLogRecPtr *restart_lsn, TimeLineID *restart_tli)
+{
+ PGresult *res;
+ PQExpBuffer query;
+ XLogRecPtr lsn_loc = InvalidXLogRecPtr;
+ TimeLineID tli_loc = 0;
+
+ if (restart_lsn)
+ *restart_lsn = lsn_loc;
+ if (restart_tli)
+ *restart_tli = tli_loc;
+
+ query = createPQExpBuffer();
+ appendPQExpBuffer(query, "READ_REPLICATION_SLOT %s", slot_name);
+ res = PQexec(conn, query->data);
+ destroyPQExpBuffer(query);
+
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("could not send replication command \"%s\": %s",
+ "READ_REPLICATION_SLOT", PQerrorMessage(conn));
+ PQclear(res);
+ return false;
+ }
+
+ /* The command should always return precisely one tuple and three fields */
+ if (PQntuples(res) != 1 || PQnfields(res) != 3)
+ {
+ pg_log_error("could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields",
+ slot_name, PQntuples(res), PQnfields(res), 1, 3);
+ PQclear(res);
+ return false;
+ }
+
+ /*
+ * When the slot doesn't exist, the command returns a tuple with NULL
+ * values. This checks only the slot type field.
+ */
+ if (PQgetisnull(res, 0, 0))
+ {
+ pg_log_error("replication slot \"%s\" does not exist", slot_name);
+ PQclear(res);
+ return false;
+ }
+
+ /*
+ * Note that this cannot happen as READ_REPLICATION_SLOT supports only
+ * physical slots, but play it safe.
+ */
+ if (strcmp(PQgetvalue(res, 0, 0), "physical") != 0)
+ {
+ pg_log_error("expected a physical replication slot, got type \"%s\" instead",
+ PQgetvalue(res, 0, 0));
+ PQclear(res);
+ return false;
+ }
+
+ /* restart LSN */
+ if (!PQgetisnull(res, 0, 1))
+ {
+ uint32 hi,
+ lo;
+
+ if (sscanf(PQgetvalue(res, 0, 1), "%X/%X", &hi, &lo) != 2)
+ {
+ pg_log_error("could not parse restart_lsn \"%s\" for replication slot \"%s\"",
+ PQgetvalue(res, 0, 1), slot_name);
+ PQclear(res);
+ return false;
+ }
+ lsn_loc = ((uint64) hi) << 32 | lo;
+ }
+
+ /* current TLI */
+ if (!PQgetisnull(res, 0, 2))
+ tli_loc = (TimeLineID) atol(PQgetvalue(res, 0, 2));
+
+ PQclear(res);
+
+ /* Assign results if requested */
+ if (restart_lsn)
+ *restart_lsn = lsn_loc;
+ if (restart_tli)
+ *restart_tli = tli_loc;
+
+ return true;
+}
+
+/*
+ * Create a replication slot for the given connection. This function
+ * returns true in case of success.
+ */
+bool
+CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin,
+ bool is_temporary, bool is_physical, bool reserve_wal,
+ bool slot_exists_ok, bool two_phase)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ bool use_new_option_syntax = (PQserverVersion(conn) >= 150000);
+
+ query = createPQExpBuffer();
+
+ Assert((is_physical && plugin == NULL) ||
+ (!is_physical && plugin != NULL));
+ Assert(!(two_phase && is_physical));
+ Assert(slot_name != NULL);
+
+ /* Build base portion of query */
+ appendPQExpBuffer(query, "CREATE_REPLICATION_SLOT \"%s\"", slot_name);
+ if (is_temporary)
+ appendPQExpBufferStr(query, " TEMPORARY");
+ if (is_physical)
+ appendPQExpBufferStr(query, " PHYSICAL");
+ else
+ appendPQExpBuffer(query, " LOGICAL \"%s\"", plugin);
+
+ /* Add any requested options */
+ if (use_new_option_syntax)
+ appendPQExpBufferStr(query, " (");
+ if (is_physical)
+ {
+ if (reserve_wal)
+ AppendPlainCommandOption(query, use_new_option_syntax,
+ "RESERVE_WAL");
+ }
+ else
+ {
+ if (two_phase && PQserverVersion(conn) >= 150000)
+ AppendPlainCommandOption(query, use_new_option_syntax,
+ "TWO_PHASE");
+
+ if (PQserverVersion(conn) >= 100000)
+ {
+ /* pg_recvlogical doesn't use an exported snapshot, so suppress */
+ if (use_new_option_syntax)
+ AppendStringCommandOption(query, use_new_option_syntax,
+ "SNAPSHOT", "nothing");
+ else
+ AppendPlainCommandOption(query, use_new_option_syntax,
+ "NOEXPORT_SNAPSHOT");
+ }
+ }
+ if (use_new_option_syntax)
+ {
+ /* Suppress option list if it would be empty, otherwise terminate */
+ if (query->data[query->len - 1] == '(')
+ {
+ query->len -= 2;
+ query->data[query->len] = '\0';
+ }
+ else
+ appendPQExpBufferChar(query, ')');
+ }
+
+ /* Now run the query */
+ res = PQexec(conn, query->data);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ const char *sqlstate = PQresultErrorField(res, PG_DIAG_SQLSTATE);
+
+ if (slot_exists_ok &&
+ sqlstate &&
+ strcmp(sqlstate, ERRCODE_DUPLICATE_OBJECT) == 0)
+ {
+ destroyPQExpBuffer(query);
+ PQclear(res);
+ return true;
+ }
+ else
+ {
+ pg_log_error("could not send replication command \"%s\": %s",
+ query->data, PQerrorMessage(conn));
+
+ destroyPQExpBuffer(query);
+ PQclear(res);
+ return false;
+ }
+ }
+
+ if (PQntuples(res) != 1 || PQnfields(res) != 4)
+ {
+ pg_log_error("could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields",
+ slot_name,
+ PQntuples(res), PQnfields(res), 1, 4);
+
+ destroyPQExpBuffer(query);
+ PQclear(res);
+ return false;
+ }
+
+ destroyPQExpBuffer(query);
+ PQclear(res);
+ return true;
+}
+
+/*
+ * Drop a replication slot for the given connection. This function
+ * returns true in case of success.
+ */
+bool
+DropReplicationSlot(PGconn *conn, const char *slot_name)
+{
+ PQExpBuffer query;
+ PGresult *res;
+
+ Assert(slot_name != NULL);
+
+ query = createPQExpBuffer();
+
+ /* Build query */
+ appendPQExpBuffer(query, "DROP_REPLICATION_SLOT \"%s\"",
+ slot_name);
+ res = PQexec(conn, query->data);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("could not send replication command \"%s\": %s",
+ query->data, PQerrorMessage(conn));
+
+ destroyPQExpBuffer(query);
+ PQclear(res);
+ return false;
+ }
+
+ if (PQntuples(res) != 0 || PQnfields(res) != 0)
+ {
+ pg_log_error("could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields",
+ slot_name,
+ PQntuples(res), PQnfields(res), 0, 0);
+
+ destroyPQExpBuffer(query);
+ PQclear(res);
+ return false;
+ }
+
+ destroyPQExpBuffer(query);
+ PQclear(res);
+ return true;
+}
+
+/*
+ * Append a "plain" option - one with no value - to a server command that
+ * is being constructed.
+ *
+ * In the old syntax, all options were parser keywords, so you could just
+ * write things like SOME_COMMAND OPTION1 OPTION2 'opt2value' OPTION3 42. The
+ * new syntax uses a comma-separated list surrounded by parentheses, so the
+ * equivalent is SOME_COMMAND (OPTION1, OPTION2 'optvalue', OPTION3 42).
+ */
+void
+AppendPlainCommandOption(PQExpBuffer buf, bool use_new_option_syntax,
+ char *option_name)
+{
+ if (buf->len > 0 && buf->data[buf->len - 1] != '(')
+ {
+ if (use_new_option_syntax)
+ appendPQExpBufferStr(buf, ", ");
+ else
+ appendPQExpBufferChar(buf, ' ');
+ }
+
+ appendPQExpBuffer(buf, " %s", option_name);
+}
+
+/*
+ * Append an option with an associated string value to a server command that
+ * is being constructed.
+ *
+ * See comments for AppendPlainCommandOption, above.
+ */
+void
+AppendStringCommandOption(PQExpBuffer buf, bool use_new_option_syntax,
+ char *option_name, char *option_value)
+{
+ AppendPlainCommandOption(buf, use_new_option_syntax, option_name);
+
+ if (option_value != NULL)
+ {
+ size_t length = strlen(option_value);
+ char *escaped_value = palloc(1 + 2 * length);
+
+ PQescapeStringConn(conn, escaped_value, option_value, length, NULL);
+ appendPQExpBuffer(buf, " '%s'", escaped_value);
+ pfree(escaped_value);
+ }
+}
+
+/*
+ * Append an option with an associated integer value to a server command
+ * is being constructed.
+ *
+ * See comments for AppendPlainCommandOption, above.
+ */
+void
+AppendIntegerCommandOption(PQExpBuffer buf, bool use_new_option_syntax,
+ char *option_name, int32 option_value)
+{
+ AppendPlainCommandOption(buf, use_new_option_syntax, option_name);
+
+ appendPQExpBuffer(buf, " %d", option_value);
+}
+
+/*
+ * Frontend version of GetCurrentTimestamp(), since we are not linked with
+ * backend code.
+ */
+TimestampTz
+feGetCurrentTimestamp(void)
+{
+ TimestampTz result;
+ struct timeval tp;
+
+ gettimeofday(&tp, NULL);
+
+ result = (TimestampTz) tp.tv_sec -
+ ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY);
+ result = (result * USECS_PER_SEC) + tp.tv_usec;
+
+ return result;
+}
+
+/*
+ * Frontend version of TimestampDifference(), since we are not linked with
+ * backend code.
+ */
+void
+feTimestampDifference(TimestampTz start_time, TimestampTz stop_time,
+ long *secs, int *microsecs)
+{
+ TimestampTz diff = stop_time - start_time;
+
+ if (diff <= 0)
+ {
+ *secs = 0;
+ *microsecs = 0;
+ }
+ else
+ {
+ *secs = (long) (diff / USECS_PER_SEC);
+ *microsecs = (int) (diff % USECS_PER_SEC);
+ }
+}
+
+/*
+ * Frontend version of TimestampDifferenceExceeds(), since we are not
+ * linked with backend code.
+ */
+bool
+feTimestampDifferenceExceeds(TimestampTz start_time,
+ TimestampTz stop_time,
+ int msec)
+{
+ TimestampTz diff = stop_time - start_time;
+
+ return (diff >= msec * INT64CONST(1000));
+}
+
+/*
+ * Converts an int64 to network byte order.
+ */
+void
+fe_sendint64(int64 i, char *buf)
+{
+ uint64 n64 = pg_hton64(i);
+
+ memcpy(buf, &n64, sizeof(n64));
+}
+
+/*
+ * Converts an int64 from network byte order to native format.
+ */
+int64
+fe_recvint64(char *buf)
+{
+ uint64 n64;
+
+ memcpy(&n64, buf, sizeof(n64));
+
+ return pg_ntoh64(n64);
+}
diff --git a/src/bin/pg_basebackup/streamutil.h b/src/bin/pg_basebackup/streamutil.h
new file mode 100644
index 0000000..8638f81
--- /dev/null
+++ b/src/bin/pg_basebackup/streamutil.h
@@ -0,0 +1,68 @@
+/*-------------------------------------------------------------------------
+ *
+ * streamutil.h
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/streamutil.h
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef STREAMUTIL_H
+#define STREAMUTIL_H
+
+#include "access/xlogdefs.h"
+#include "datatype/timestamp.h"
+#include "libpq-fe.h"
+#include "pqexpbuffer.h"
+
+extern const char *progname;
+extern char *connection_string;
+extern char *dbhost;
+extern char *dbuser;
+extern char *dbport;
+extern char *dbname;
+extern int dbgetpassword;
+extern uint32 WalSegSz;
+
+/* Connection kept global so we can disconnect easily */
+extern PGconn *conn;
+
+extern PGconn *GetConnection(void);
+
+/* Replication commands */
+extern bool CreateReplicationSlot(PGconn *conn, const char *slot_name,
+ const char *plugin, bool is_temporary,
+ bool is_physical, bool reserve_wal,
+ bool slot_exists_ok, bool two_phase);
+extern bool DropReplicationSlot(PGconn *conn, const char *slot_name);
+extern bool RunIdentifySystem(PGconn *conn, char **sysid,
+ TimeLineID *starttli,
+ XLogRecPtr *startpos,
+ char **db_name);
+
+extern void AppendPlainCommandOption(PQExpBuffer buf,
+ bool use_new_option_syntax,
+ char *option_value);
+extern void AppendStringCommandOption(PQExpBuffer buf,
+ bool use_new_option_syntax,
+ char *option_name, char *option_value);
+extern void AppendIntegerCommandOption(PQExpBuffer buf,
+ bool use_new_option_syntax,
+ char *option_name, int32 option_value);
+
+extern bool GetSlotInformation(PGconn *conn, const char *slot_name,
+ XLogRecPtr *restart_lsn,
+ TimeLineID *restart_tli);
+extern bool RetrieveWalSegSize(PGconn *conn);
+extern TimestampTz feGetCurrentTimestamp(void);
+extern void feTimestampDifference(TimestampTz start_time, TimestampTz stop_time,
+ long *secs, int *microsecs);
+
+extern bool feTimestampDifferenceExceeds(TimestampTz start_time, TimestampTz stop_time,
+ int msec);
+extern void fe_sendint64(int64 i, char *buf);
+extern int64 fe_recvint64(char *buf);
+
+#endif /* STREAMUTIL_H */
diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl
new file mode 100644
index 0000000..ec72282
--- /dev/null
+++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl
@@ -0,0 +1,945 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use File::Basename qw(basename dirname);
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_basebackup');
+program_version_ok('pg_basebackup');
+program_options_handling_ok('pg_basebackup');
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+
+# For nearly all pg_basebackup invocations some options should be specified,
+# to keep test times reasonable. Using @pg_basebackup_defs as the first
+# element of the array passed to IPC::Run interpolate the array (as it is
+# not a reference to an array)...
+my @pg_basebackup_defs = ('pg_basebackup', '--no-sync', '-cfast');
+
+
+# Set umask so test directories and files are created with default permissions
+umask(0077);
+
+# Initialize node without replication settings
+$node->init(
+ extra => ['--data-checksums'],
+ auth_extra => [ '--create-role', 'backupuser' ]);
+$node->start;
+my $pgdata = $node->data_dir;
+
+$node->command_fails(['pg_basebackup'],
+ 'pg_basebackup needs target directory specified');
+
+# Sanity checks for options
+$node->command_fails_like(
+ [ 'pg_basebackup', '-D', "$tempdir/backup", '--compress', 'none:1' ],
+ qr/\Qcompression algorithm "none" does not accept a compression level/,
+ 'failure if method "none" specified with compression level');
+$node->command_fails_like(
+ [ 'pg_basebackup', '-D', "$tempdir/backup", '--compress', 'none+' ],
+ qr/\Qunrecognized compression algorithm: "none+"/,
+ 'failure on incorrect separator to define compression level');
+
+# Some Windows ANSI code pages may reject this filename, in which case we
+# quietly proceed without this bit of test coverage.
+if (open my $badchars, '>>', "$tempdir/pgdata/FOO\xe0\xe0\xe0BAR")
+{
+ print $badchars "test backup of file with non-UTF8 name\n";
+ close $badchars;
+}
+
+$node->set_replication_conf();
+$node->reload;
+
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup" ],
+ 'pg_basebackup fails because of WAL configuration');
+
+ok(!-d "$tempdir/backup", 'backup directory was cleaned up');
+
+# Create a backup directory that is not empty so the next command will fail
+# but leave the data directory behind
+mkdir("$tempdir/backup")
+ or BAIL_OUT("unable to create $tempdir/backup");
+append_to_file("$tempdir/backup/dir-not-empty.txt", "Some data");
+
+$node->command_fails([ @pg_basebackup_defs, '-D', "$tempdir/backup", '-n' ],
+ 'failing run with no-clean option');
+
+ok(-d "$tempdir/backup", 'backup directory was created and left behind');
+rmtree("$tempdir/backup");
+
+open my $conf, '>>', "$pgdata/postgresql.conf";
+print $conf "max_replication_slots = 10\n";
+print $conf "max_wal_senders = 10\n";
+print $conf "wal_level = replica\n";
+close $conf;
+$node->restart;
+
+# Now that we have a server that supports replication commands, test whether
+# certain invalid compression commands fail on the client side with client-side
+# compression and on the server side with server-side compression.
+SKIP:
+{
+ skip "postgres was not built with ZLIB support", 6
+ if (!check_pg_config("#define HAVE_LIBZ 1"));
+
+ my $client_fails = 'pg_basebackup: error: ';
+ my $server_fails =
+ 'pg_basebackup: error: could not initiate base backup: ERROR: ';
+ my @compression_failure_tests = (
+ [
+ 'extrasquishy',
+ 'unrecognized compression algorithm: "extrasquishy"',
+ 'failure on invalid compression algorithm'
+ ],
+ [
+ 'gzip:',
+ 'invalid compression specification: found empty string where a compression option was expected',
+ 'failure on empty compression options list'
+ ],
+ [
+ 'gzip:thunk',
+ 'invalid compression specification: unrecognized compression option: "thunk"',
+ 'failure on unknown compression option'
+ ],
+ [
+ 'gzip:level',
+ 'invalid compression specification: compression option "level" requires a value',
+ 'failure on missing compression level'
+ ],
+ [
+ 'gzip:level=',
+ 'invalid compression specification: value for compression option "level" must be an integer',
+ 'failure on empty compression level'
+ ],
+ [
+ 'gzip:level=high',
+ 'invalid compression specification: value for compression option "level" must be an integer',
+ 'failure on non-numeric compression level'
+ ],
+ [
+ 'gzip:level=236',
+ 'invalid compression specification: compression algorithm "gzip" expects a compression level between 1 and 9',
+ 'failure on out-of-range compression level'
+ ],
+ [
+ 'gzip:level=9,',
+ 'invalid compression specification: found empty string where a compression option was expected',
+ 'failure on extra, empty compression option'
+ ],
+ [
+ 'gzip:workers=3',
+ 'invalid compression specification: compression algorithm "gzip" does not accept a worker count',
+ 'failure on worker count for gzip'
+ ],);
+ for my $cft (@compression_failure_tests)
+ {
+ my $cfail = quotemeta($client_fails . $cft->[1]);
+ my $sfail = quotemeta($server_fails . $cft->[1]);
+ $node->command_fails_like(
+ [
+ 'pg_basebackup', '-D',
+ "$tempdir/backup", '--compress',
+ $cft->[0]
+ ],
+ qr/$cfail/,
+ 'client ' . $cft->[2]);
+ $node->command_fails_like(
+ [
+ 'pg_basebackup', '-D',
+ "$tempdir/backup", '--compress',
+ 'server-' . $cft->[0]
+ ],
+ qr/$sfail/,
+ 'server ' . $cft->[2]);
+ }
+}
+
+# Write some files to test that they are not copied.
+foreach my $filename (
+ qw(backup_label tablespace_map postgresql.auto.conf.tmp
+ current_logfiles.tmp global/pg_internal.init.123))
+{
+ open my $file, '>>', "$pgdata/$filename";
+ print $file "DONOTCOPY";
+ close $file;
+}
+
+# Connect to a database to create global/pg_internal.init. If this is removed
+# the test to ensure global/pg_internal.init is not copied will return a false
+# positive.
+$node->safe_psql('postgres', 'SELECT 1;');
+
+# Create an unlogged table to test that forks other than init are not copied.
+$node->safe_psql('postgres', 'CREATE UNLOGGED TABLE base_unlogged (id int)');
+
+my $baseUnloggedPath = $node->safe_psql('postgres',
+ q{select pg_relation_filepath('base_unlogged')});
+
+# Make sure main and init forks exist
+ok(-f "$pgdata/${baseUnloggedPath}_init", 'unlogged init fork in base');
+ok(-f "$pgdata/$baseUnloggedPath", 'unlogged main fork in base');
+
+# Create files that look like temporary relations to ensure they are ignored.
+my $postgresOid = $node->safe_psql('postgres',
+ q{select oid from pg_database where datname = 'postgres'});
+
+my @tempRelationFiles =
+ qw(t999_999 t9999_999.1 t999_9999_vm t99999_99999_vm.1);
+
+foreach my $filename (@tempRelationFiles)
+{
+ append_to_file("$pgdata/base/$postgresOid/$filename", 'TEMP_RELATION');
+}
+
+# Run base backup.
+$node->command_ok(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup", '-X', 'none' ],
+ 'pg_basebackup runs');
+ok(-f "$tempdir/backup/PG_VERSION", 'backup was created');
+ok(-f "$tempdir/backup/backup_manifest", 'backup manifest included');
+
+# Permissions on backup should be default
+SKIP:
+{
+ skip "unix-style permissions not supported on Windows", 1
+ if ($windows_os);
+
+ ok(check_mode_recursive("$tempdir/backup", 0700, 0600),
+ "check backup dir permissions");
+}
+
+# Only archive_status directory should be copied in pg_wal/.
+is_deeply(
+ [ sort(slurp_dir("$tempdir/backup/pg_wal/")) ],
+ [ sort qw(. .. archive_status) ],
+ 'no WAL files copied');
+
+# Contents of these directories should not be copied.
+foreach my $dirname (
+ qw(pg_dynshmem pg_notify pg_replslot pg_serial pg_snapshots pg_stat_tmp pg_subtrans)
+ )
+{
+ is_deeply(
+ [ sort(slurp_dir("$tempdir/backup/$dirname/")) ],
+ [ sort qw(. ..) ],
+ "contents of $dirname/ not copied");
+}
+
+# These files should not be copied.
+foreach my $filename (
+ qw(postgresql.auto.conf.tmp postmaster.opts postmaster.pid tablespace_map current_logfiles.tmp
+ global/pg_internal.init global/pg_internal.init.123))
+{
+ ok(!-f "$tempdir/backup/$filename", "$filename not copied");
+}
+
+# Unlogged relation forks other than init should not be copied
+ok(-f "$tempdir/backup/${baseUnloggedPath}_init",
+ 'unlogged init fork in backup');
+ok( !-f "$tempdir/backup/$baseUnloggedPath",
+ 'unlogged main fork not in backup');
+
+# Temp relations should not be copied.
+foreach my $filename (@tempRelationFiles)
+{
+ ok( !-f "$tempdir/backup/base/$postgresOid/$filename",
+ "base/$postgresOid/$filename not copied");
+}
+
+# Make sure existing backup_label was ignored.
+isnt(slurp_file("$tempdir/backup/backup_label"),
+ 'DONOTCOPY', 'existing backup_label not copied');
+rmtree("$tempdir/backup");
+
+# Now delete the bogus backup_label file since it will interfere with startup
+unlink("$pgdata/backup_label")
+ or BAIL_OUT("unable to unlink $pgdata/backup_label");
+
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backup2", '--no-manifest',
+ '--waldir', "$tempdir/xlog2"
+ ],
+ 'separate xlog directory');
+ok(-f "$tempdir/backup2/PG_VERSION", 'backup was created');
+ok(!-f "$tempdir/backup2/backup_manifest", 'manifest was suppressed');
+ok(-d "$tempdir/xlog2/", 'xlog directory was created');
+rmtree("$tempdir/backup2");
+rmtree("$tempdir/xlog2");
+
+$node->command_ok([ @pg_basebackup_defs, '-D', "$tempdir/tarbackup", '-Ft' ],
+ 'tar format');
+ok(-f "$tempdir/tarbackup/base.tar", 'backup tar was created');
+rmtree("$tempdir/tarbackup");
+
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', "-T=/foo" ],
+ '-T with empty old directory fails');
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', "-T/foo=" ],
+ '-T with empty new directory fails');
+$node->command_fails(
+ [
+ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp',
+ "-T/foo=/bar=/baz"
+ ],
+ '-T with multiple = fails');
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', "-Tfoo=/bar" ],
+ '-T with old directory not absolute fails');
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', "-T/foo=bar" ],
+ '-T with new directory not absolute fails');
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', "-Tfoo" ],
+ '-T with invalid format fails');
+
+my $superlongname = "superlongname_" . ("x" x 100);
+# Tar format doesn't support filenames longer than 100 bytes.
+SKIP:
+{
+ my $superlongpath = "$pgdata/$superlongname";
+
+ skip "File path too long", 1
+ if $windows_os && length($superlongpath) > 255;
+
+ open my $file, '>', "$superlongpath"
+ or die "unable to create file $superlongpath";
+ close $file;
+ $node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/tarbackup_l1", '-Ft' ],
+ 'pg_basebackup tar with long name fails');
+ unlink "$superlongpath";
+}
+
+# The following tests are for symlinks.
+
+# Move pg_replslot out of $pgdata and create a symlink to it.
+$node->stop;
+
+# Set umask so test directories and files are created with group permissions
+umask(0027);
+
+# Enable group permissions on PGDATA
+chmod_recursive("$pgdata", 0750, 0640);
+
+# Create a temporary directory in the system location.
+my $sys_tempdir = PostgreSQL::Test::Utils::tempdir_short;
+
+# On Windows use the short location to avoid path length issues.
+# Elsewhere use $tempdir to avoid file system boundary issues with moving.
+my $tmploc = $windows_os ? $sys_tempdir : $tempdir;
+
+rename("$pgdata/pg_replslot", "$tmploc/pg_replslot")
+ or BAIL_OUT "could not move $pgdata/pg_replslot";
+dir_symlink("$tmploc/pg_replslot", "$pgdata/pg_replslot")
+ or BAIL_OUT "could not symlink to $pgdata/pg_replslot";
+
+$node->start;
+
+# Test backup of a tablespace using tar format.
+# Symlink the system located tempdir to our physical temp location.
+# That way we can use shorter names for the tablespace directories,
+# which hopefully won't run afoul of the 99 character length limit.
+my $real_sys_tempdir = "$sys_tempdir/tempdir";
+dir_symlink "$tempdir", $real_sys_tempdir;
+
+mkdir "$tempdir/tblspc1";
+my $realTsDir = "$real_sys_tempdir/tblspc1";
+$node->safe_psql('postgres',
+ "CREATE TABLESPACE tblspc1 LOCATION '$realTsDir';");
+$node->safe_psql('postgres',
+ "CREATE TABLE test1 (a int) TABLESPACE tblspc1;"
+ . "INSERT INTO test1 VALUES (1234);");
+$node->backup('tarbackup2', backup_options => ['-Ft']);
+# empty test1, just so that it's different from the to-be-restored data
+$node->safe_psql('postgres', "TRUNCATE TABLE test1;");
+
+# basic checks on the output
+my $backupdir = $node->backup_dir . '/tarbackup2';
+ok(-f "$backupdir/base.tar", 'backup tar was created');
+ok(-f "$backupdir/pg_wal.tar", 'WAL tar was created');
+my @tblspc_tars = glob "$backupdir/[0-9]*.tar";
+is(scalar(@tblspc_tars), 1, 'one tablespace tar was created');
+
+# Try to verify the tar-format backup by restoring it.
+# For this, we use the tar program identified by configure.
+SKIP:
+{
+ my $tar = $ENV{TAR};
+ # don't check for a working tar here, to accommodate various odd
+ # cases such as AIX. If tar doesn't work the init_from_backup below
+ # will fail.
+ skip "no tar program available", 1
+ if (!defined $tar || $tar eq '');
+
+ my $node2 = PostgreSQL::Test::Cluster->new('replica');
+
+ # Recover main data directory
+ $node2->init_from_backup($node, 'tarbackup2', tar_program => $tar);
+
+ # Recover tablespace into a new directory (not where it was!)
+ my $repTsDir = "$tempdir/tblspc1replica";
+ my $realRepTsDir = "$real_sys_tempdir/tblspc1replica";
+ mkdir $repTsDir;
+ PostgreSQL::Test::Utils::system_or_bail($tar, 'xf', $tblspc_tars[0],
+ '-C', $repTsDir);
+
+ # Update tablespace map to point to new directory.
+ # XXX Ideally pg_basebackup would handle this.
+ $tblspc_tars[0] =~ m|/([0-9]*)\.tar$|;
+ my $tblspcoid = $1;
+ my $escapedRepTsDir = $realRepTsDir;
+ $escapedRepTsDir =~ s/\\/\\\\/g;
+ open my $mapfile, '>', $node2->data_dir . '/tablespace_map';
+ print $mapfile "$tblspcoid $escapedRepTsDir\n";
+ close $mapfile;
+
+ $node2->start;
+ my $result = $node2->safe_psql('postgres', 'SELECT * FROM test1');
+ is($result, '1234', "tablespace data restored from tar-format backup");
+ $node2->stop;
+}
+
+# Create an unlogged table to test that forks other than init are not copied.
+$node->safe_psql('postgres',
+ 'CREATE UNLOGGED TABLE tblspc1_unlogged (id int) TABLESPACE tblspc1;');
+
+my $tblspc1UnloggedPath = $node->safe_psql('postgres',
+ q{select pg_relation_filepath('tblspc1_unlogged')});
+
+# Make sure main and init forks exist
+ok( -f "$pgdata/${tblspc1UnloggedPath}_init",
+ 'unlogged init fork in tablespace');
+ok(-f "$pgdata/$tblspc1UnloggedPath", 'unlogged main fork in tablespace');
+
+# Create files that look like temporary relations to ensure they are ignored
+# in a tablespace.
+@tempRelationFiles = qw(t888_888 t888888_888888_vm.1);
+my $tblSpc1Id = basename(
+ dirname(
+ dirname(
+ $node->safe_psql(
+ 'postgres', q{select pg_relation_filepath('test1')}))));
+
+foreach my $filename (@tempRelationFiles)
+{
+ append_to_file(
+ "$real_sys_tempdir/tblspc1/$tblSpc1Id/$postgresOid/$filename",
+ 'TEMP_RELATION');
+}
+
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup1", '-Fp' ],
+ 'plain format with tablespaces fails without tablespace mapping');
+
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backup1", '-Fp',
+ "-T$realTsDir=$tempdir/tbackup/tblspc1",
+ ],
+ 'plain format with tablespaces succeeds with tablespace mapping');
+ok(-d "$tempdir/tbackup/tblspc1", 'tablespace was relocated');
+
+# This symlink check is not supported on Windows as -l
+# doesn't work with junctions
+SKIP:
+{
+ skip "symlink check not implemented on Windows", 1
+ if ($windows_os);
+ opendir(my $dh, "$pgdata/pg_tblspc") or die;
+ ok( ( grep {
+ -l "$tempdir/backup1/pg_tblspc/$_"
+ and readlink "$tempdir/backup1/pg_tblspc/$_" eq
+ "$tempdir/tbackup/tblspc1"
+ } readdir($dh)),
+ "tablespace symlink was updated");
+ closedir $dh;
+}
+
+# Group access should be enabled on all backup files
+SKIP:
+{
+ skip "unix-style permissions not supported on Windows", 1
+ if ($windows_os);
+
+ ok(check_mode_recursive("$tempdir/backup1", 0750, 0640),
+ "check backup dir permissions");
+}
+
+# Unlogged relation forks other than init should not be copied
+my ($tblspc1UnloggedBackupPath) =
+ $tblspc1UnloggedPath =~ /[^\/]*\/[^\/]*\/[^\/]*$/g;
+
+ok(-f "$tempdir/tbackup/tblspc1/${tblspc1UnloggedBackupPath}_init",
+ 'unlogged init fork in tablespace backup');
+ok(!-f "$tempdir/tbackup/tblspc1/$tblspc1UnloggedBackupPath",
+ 'unlogged main fork not in tablespace backup');
+
+# Temp relations should not be copied.
+foreach my $filename (@tempRelationFiles)
+{
+ ok(!-f "$tempdir/tbackup/tblspc1/$tblSpc1Id/$postgresOid/$filename",
+ "[tblspc1]/$postgresOid/$filename not copied");
+
+ # Also remove temp relation files or tablespace drop will fail.
+ my $filepath =
+ "$real_sys_tempdir/tblspc1/$tblSpc1Id/$postgresOid/$filename";
+
+ unlink($filepath)
+ or BAIL_OUT("unable to unlink $filepath");
+}
+
+ok( -d "$tempdir/backup1/pg_replslot",
+ 'pg_replslot symlink copied as directory');
+rmtree("$tempdir/backup1");
+
+mkdir "$tempdir/tbl=spc2";
+$realTsDir = "$real_sys_tempdir/tbl=spc2";
+$node->safe_psql('postgres', "DROP TABLE test1;");
+$node->safe_psql('postgres', "DROP TABLE tblspc1_unlogged;");
+$node->safe_psql('postgres', "DROP TABLESPACE tblspc1;");
+$node->safe_psql('postgres',
+ "CREATE TABLESPACE tblspc2 LOCATION '$realTsDir';");
+$realTsDir =~ s/=/\\=/;
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backup3", '-Fp',
+ "-T$realTsDir=$tempdir/tbackup/tbl\\=spc2",
+ ],
+ 'mapping tablespace with = sign in path');
+ok(-d "$tempdir/tbackup/tbl=spc2", 'tablespace with = sign was relocated');
+$node->safe_psql('postgres', "DROP TABLESPACE tblspc2;");
+rmtree("$tempdir/backup3");
+
+mkdir "$tempdir/$superlongname";
+$realTsDir = "$real_sys_tempdir/$superlongname";
+$node->safe_psql('postgres',
+ "CREATE TABLESPACE tblspc3 LOCATION '$realTsDir';");
+$node->command_ok(
+ [ @pg_basebackup_defs, '-D', "$tempdir/tarbackup_l3", '-Ft' ],
+ 'pg_basebackup tar with long symlink target');
+$node->safe_psql('postgres', "DROP TABLESPACE tblspc3;");
+rmtree("$tempdir/tarbackup_l3");
+
+$node->command_ok([ @pg_basebackup_defs, '-D', "$tempdir/backupR", '-R' ],
+ 'pg_basebackup -R runs');
+ok(-f "$tempdir/backupR/postgresql.auto.conf", 'postgresql.auto.conf exists');
+ok(-f "$tempdir/backupR/standby.signal", 'standby.signal was created');
+my $recovery_conf = slurp_file "$tempdir/backupR/postgresql.auto.conf";
+rmtree("$tempdir/backupR");
+
+my $port = $node->port;
+like(
+ $recovery_conf,
+ qr/^primary_conninfo = '.*port=$port.*'\n/m,
+ 'postgresql.auto.conf sets primary_conninfo');
+
+$node->command_ok(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backupxd" ],
+ 'pg_basebackup runs in default xlog mode');
+ok(grep(/^[0-9A-F]{24}$/, slurp_dir("$tempdir/backupxd/pg_wal")),
+ 'WAL files copied');
+rmtree("$tempdir/backupxd");
+
+$node->command_ok(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backupxf", '-X', 'fetch' ],
+ 'pg_basebackup -X fetch runs');
+ok(grep(/^[0-9A-F]{24}$/, slurp_dir("$tempdir/backupxf/pg_wal")),
+ 'WAL files copied');
+rmtree("$tempdir/backupxf");
+$node->command_ok(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backupxs", '-X', 'stream' ],
+ 'pg_basebackup -X stream runs');
+ok(grep(/^[0-9A-F]{24}$/, slurp_dir("$tempdir/backupxs/pg_wal")),
+ 'WAL files copied');
+rmtree("$tempdir/backupxs");
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D', "$tempdir/backupxst", '-X', 'stream',
+ '-Ft'
+ ],
+ 'pg_basebackup -X stream runs in tar mode');
+ok(-f "$tempdir/backupxst/pg_wal.tar", "tar file was created");
+rmtree("$tempdir/backupxst");
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backupnoslot", '-X',
+ 'stream', '--no-slot'
+ ],
+ 'pg_basebackup -X stream runs with --no-slot');
+rmtree("$tempdir/backupnoslot");
+$node->command_ok(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backupxf", '-X', 'fetch' ],
+ 'pg_basebackup -X fetch runs');
+
+$node->command_fails_like(
+ [ @pg_basebackup_defs, '--target', 'blackhole' ],
+ qr/WAL cannot be streamed when a backup target is specified/,
+ 'backup target requires -X');
+$node->command_fails_like(
+ [ @pg_basebackup_defs, '--target', 'blackhole', '-X', 'stream' ],
+ qr/WAL cannot be streamed when a backup target is specified/,
+ 'backup target requires -X other than -X stream');
+$node->command_fails_like(
+ [ @pg_basebackup_defs, '--target', 'bogus', '-X', 'none' ],
+ qr/unrecognized target/,
+ 'backup target unrecognized');
+$node->command_fails_like(
+ [
+ @pg_basebackup_defs, '--target', 'blackhole', '-X',
+ 'none', '-D', "$tempdir/blackhole"
+ ],
+ qr/cannot specify both output directory and backup target/,
+ 'backup target and output directory');
+$node->command_fails_like(
+ [ @pg_basebackup_defs, '--target', 'blackhole', '-X', 'none', '-Ft' ],
+ qr/cannot specify both format and backup target/,
+ 'backup target and output directory');
+$node->command_ok(
+ [ @pg_basebackup_defs, '--target', 'blackhole', '-X', 'none' ],
+ 'backup target blackhole');
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '--target',
+ "server:$tempdir/backuponserver", '-X',
+ 'none'
+ ],
+ 'backup target server');
+ok(-f "$tempdir/backuponserver/base.tar", 'backup tar was created');
+rmtree("$tempdir/backuponserver");
+
+$node->command_ok(
+ [qw(createuser --replication --role=pg_write_server_files backupuser)],
+ 'create backup user');
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-U', 'backupuser', '--target',
+ "server:$tempdir/backuponserver",
+ '-X', 'none'
+ ],
+ 'backup target server');
+ok( -f "$tempdir/backuponserver/base.tar",
+ 'backup tar was created as non-superuser');
+rmtree("$tempdir/backuponserver");
+
+$node->command_fails(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backupxs_sl_fail", '-X',
+ 'stream', '-S',
+ 'slot0'
+ ],
+ 'pg_basebackup fails with nonexistent replication slot');
+
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backupxs_slot", '-C' ],
+ 'pg_basebackup -C fails without slot name');
+
+$node->command_fails(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backupxs_slot", '-C',
+ '-S', 'slot0',
+ '--no-slot'
+ ],
+ 'pg_basebackup fails with -C -S --no-slot');
+$node->command_fails_like(
+ [
+ @pg_basebackup_defs, '--target', 'blackhole', '-D',
+ "$tempdir/blackhole"
+ ],
+ qr/cannot specify both output directory and backup target/,
+ 'backup target and output directory');
+
+$node->command_ok(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backuptr/co", '-X', 'none' ],
+ 'pg_basebackup -X fetch runs');
+
+$node->command_fails(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backupxs_sl_fail", '-X',
+ 'stream', '-S',
+ 'slot0'
+ ],
+ 'pg_basebackup fails with nonexistent replication slot');
+
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backupxs_slot", '-C' ],
+ 'pg_basebackup -C fails without slot name');
+
+$node->command_fails(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backupxs_slot", '-C',
+ '-S', 'slot0',
+ '--no-slot'
+ ],
+ 'pg_basebackup fails with -C -S --no-slot');
+
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backupxs_slot", '-C',
+ '-S', 'slot0'
+ ],
+ 'pg_basebackup -C runs');
+rmtree("$tempdir/backupxs_slot");
+
+is( $node->safe_psql(
+ 'postgres',
+ q{SELECT slot_name FROM pg_replication_slots WHERE slot_name = 'slot0'}
+ ),
+ 'slot0',
+ 'replication slot was created');
+isnt(
+ $node->safe_psql(
+ 'postgres',
+ q{SELECT restart_lsn FROM pg_replication_slots WHERE slot_name = 'slot0'}
+ ),
+ '',
+ 'restart LSN of new slot is not null');
+
+$node->command_fails(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backupxs_slot1", '-C',
+ '-S', 'slot0'
+ ],
+ 'pg_basebackup fails with -C -S and a previously existing slot');
+
+$node->safe_psql('postgres',
+ q{SELECT * FROM pg_create_physical_replication_slot('slot1')});
+my $lsn = $node->safe_psql('postgres',
+ q{SELECT restart_lsn FROM pg_replication_slots WHERE slot_name = 'slot1'}
+);
+is($lsn, '', 'restart LSN of new slot is null');
+$node->command_fails(
+ [
+ @pg_basebackup_defs, '-D', "$tempdir/fail", '-S',
+ 'slot1', '-X', 'none'
+ ],
+ 'pg_basebackup with replication slot fails without WAL streaming');
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D', "$tempdir/backupxs_sl", '-X',
+ 'stream', '-S', 'slot1'
+ ],
+ 'pg_basebackup -X stream with replication slot runs');
+$lsn = $node->safe_psql('postgres',
+ q{SELECT restart_lsn FROM pg_replication_slots WHERE slot_name = 'slot1'}
+);
+like($lsn, qr!^0/[0-9A-Z]{7,8}$!, 'restart LSN of slot has advanced');
+rmtree("$tempdir/backupxs_sl");
+
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D', "$tempdir/backupxs_sl_R", '-X',
+ 'stream', '-S', 'slot1', '-R',
+ ],
+ 'pg_basebackup with replication slot and -R runs');
+like(
+ slurp_file("$tempdir/backupxs_sl_R/postgresql.auto.conf"),
+ qr/^primary_slot_name = 'slot1'\n/m,
+ 'recovery conf file sets primary_slot_name');
+
+my $checksum = $node->safe_psql('postgres', 'SHOW data_checksums;');
+is($checksum, 'on', 'checksums are enabled');
+rmtree("$tempdir/backupxs_sl_R");
+
+# create tables to corrupt and get their relfilenodes
+my $file_corrupt1 = $node->safe_psql('postgres',
+ q{CREATE TABLE corrupt1 AS SELECT a FROM generate_series(1,10000) AS a; ALTER TABLE corrupt1 SET (autovacuum_enabled=false); SELECT pg_relation_filepath('corrupt1')}
+);
+my $file_corrupt2 = $node->safe_psql('postgres',
+ q{CREATE TABLE corrupt2 AS SELECT b FROM generate_series(1,2) AS b; ALTER TABLE corrupt2 SET (autovacuum_enabled=false); SELECT pg_relation_filepath('corrupt2')}
+);
+
+# get block size for corruption steps
+my $block_size = $node->safe_psql('postgres', 'SHOW block_size;');
+
+# induce corruption
+$node->stop;
+$node->corrupt_page_checksum($file_corrupt1, 0);
+$node->start;
+
+$node->command_checks_all(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup_corrupt" ],
+ 1,
+ [qr{^$}],
+ [qr/^WARNING.*checksum verification failed/s],
+ 'pg_basebackup reports checksum mismatch');
+rmtree("$tempdir/backup_corrupt");
+
+# induce further corruption in 5 more blocks
+$node->stop;
+for my $i (1 .. 5)
+{
+ $node->corrupt_page_checksum($file_corrupt1, $i * $block_size);
+}
+$node->start;
+
+$node->command_checks_all(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup_corrupt2" ],
+ 1,
+ [qr{^$}],
+ [qr/^WARNING.*further.*failures.*will.not.be.reported/s],
+ 'pg_basebackup does not report more than 5 checksum mismatches');
+rmtree("$tempdir/backup_corrupt2");
+
+# induce corruption in a second file
+$node->stop;
+$node->corrupt_page_checksum($file_corrupt2, 0);
+$node->start;
+
+$node->command_checks_all(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup_corrupt3" ],
+ 1,
+ [qr{^$}],
+ [qr/^WARNING.*7 total checksum verification failures/s],
+ 'pg_basebackup correctly report the total number of checksum mismatches');
+rmtree("$tempdir/backup_corrupt3");
+
+# do not verify checksums, should return ok
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backup_corrupt4", '--no-verify-checksums',
+ ],
+ 'pg_basebackup with -k does not report checksum mismatch');
+rmtree("$tempdir/backup_corrupt4");
+
+$node->safe_psql('postgres', "DROP TABLE corrupt1;");
+$node->safe_psql('postgres', "DROP TABLE corrupt2;");
+
+note "Testing pg_basebackup with compression methods";
+
+# Check ZLIB compression if available.
+SKIP:
+{
+ skip "postgres was not built with ZLIB support", 7
+ if (!check_pg_config("#define HAVE_LIBZ 1"));
+
+ $node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backup_gzip", '--compress',
+ '1', '--format',
+ 't'
+ ],
+ 'pg_basebackup with --compress');
+ $node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backup_gzip2", '--gzip',
+ '--format', 't'
+ ],
+ 'pg_basebackup with --gzip');
+ $node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backup_gzip3", '--compress',
+ 'gzip:1', '--format',
+ 't'
+ ],
+ 'pg_basebackup with --compress=gzip:1');
+
+ # Verify that the stored files are generated with their expected
+ # names.
+ my @zlib_files = glob "$tempdir/backup_gzip/*.tar.gz";
+ is(scalar(@zlib_files), 2,
+ "two files created with --compress=NUM (base.tar.gz and pg_wal.tar.gz)"
+ );
+ my @zlib_files2 = glob "$tempdir/backup_gzip2/*.tar.gz";
+ is(scalar(@zlib_files2), 2,
+ "two files created with --gzip (base.tar.gz and pg_wal.tar.gz)");
+ my @zlib_files3 = glob "$tempdir/backup_gzip3/*.tar.gz";
+ is(scalar(@zlib_files3), 2,
+ "two files created with --compress=gzip:NUM (base.tar.gz and pg_wal.tar.gz)"
+ );
+
+ # Check the integrity of the files generated.
+ my $gzip = $ENV{GZIP_PROGRAM};
+ skip "program gzip is not found in your system", 1
+ if (!defined $gzip
+ || $gzip eq '');
+
+ my $gzip_is_valid =
+ system_log($gzip, '--test', @zlib_files, @zlib_files2, @zlib_files3);
+ is($gzip_is_valid, 0, "gzip verified the integrity of compressed data");
+ rmtree("$tempdir/backup_gzip");
+ rmtree("$tempdir/backup_gzip2");
+ rmtree("$tempdir/backup_gzip3");
+}
+
+# Test background stream process terminating before the basebackup has
+# finished, the main process should exit gracefully with an error message on
+# stderr. To reduce the risk of timing related issues we invoke the base
+# backup with rate throttling enabled.
+$node->safe_psql('postgres',
+ q{CREATE TABLE t AS SELECT a FROM generate_series(1,10000) AS a;});
+
+my $sigchld_bb_timeout =
+ IPC::Run::timer($PostgreSQL::Test::Utils::timeout_default);
+my ($sigchld_bb_stdin, $sigchld_bb_stdout, $sigchld_bb_stderr) = ('', '', '');
+my $sigchld_bb = IPC::Run::start(
+ [
+ @pg_basebackup_defs, '--wal-method=stream',
+ '-D', "$tempdir/sigchld",
+ '--max-rate=32', '-d',
+ $node->connstr('postgres')
+ ],
+ '<',
+ \$sigchld_bb_stdin,
+ '>',
+ \$sigchld_bb_stdout,
+ '2>',
+ \$sigchld_bb_stderr,
+ $sigchld_bb_timeout);
+
+is( $node->poll_query_until(
+ 'postgres',
+ "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE "
+ . "application_name = '010_pg_basebackup.pl' AND wait_event = 'WalSenderMain' "
+ . "AND backend_type = 'walsender' AND query ~ 'START_REPLICATION'"),
+ "1",
+ "Walsender killed");
+
+ok( pump_until(
+ $sigchld_bb, $sigchld_bb_timeout,
+ \$sigchld_bb_stderr, qr/background process terminated unexpectedly/),
+ 'background process exit message');
+$sigchld_bb->finish();
+
+# Test that we can back up an in-place tablespace
+$node->safe_psql('postgres',
+ "SET allow_in_place_tablespaces = on; CREATE TABLESPACE tblspc2 LOCATION '';");
+$node->safe_psql('postgres',
+ "CREATE TABLE test2 (a int) TABLESPACE tblspc2;"
+ . "INSERT INTO test2 VALUES (1234);");
+my $tblspc_oid = $node->safe_psql('postgres',
+ "SELECT oid FROM pg_tablespace WHERE spcname = 'tblspc2';");
+$node->backup('backup3');
+$node->safe_psql('postgres', "DROP TABLE test2;");
+$node->safe_psql('postgres', "DROP TABLESPACE tblspc2;");
+
+# check that the in-place tablespace exists in the backup
+$backupdir = $node->backup_dir . '/backup3';
+my @dst_tblspc = glob "$backupdir/pg_tblspc/$tblspc_oid/PG_*";
+is(@dst_tblspc, 1, 'tblspc directory copied');
+
+done_testing();
diff --git a/src/bin/pg_basebackup/t/020_pg_receivewal.pl b/src/bin/pg_basebackup/t/020_pg_receivewal.pl
new file mode 100644
index 0000000..985e68e
--- /dev/null
+++ b/src/bin/pg_basebackup/t/020_pg_receivewal.pl
@@ -0,0 +1,326 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use PostgreSQL::Test::Cluster;
+use Test::More;
+
+program_help_ok('pg_receivewal');
+program_version_ok('pg_receivewal');
+program_options_handling_ok('pg_receivewal');
+
+# Set umask so test directories and files are created with default permissions
+umask(0077);
+
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1, extra => ['--wal-segsize=1']);
+$primary->start;
+
+my $stream_dir = $primary->basedir . '/archive_wal';
+mkdir($stream_dir);
+
+# Sanity checks for command line options.
+$primary->command_fails(['pg_receivewal'],
+ 'pg_receivewal needs target directory specified');
+$primary->command_fails(
+ [ 'pg_receivewal', '-D', $stream_dir, '--create-slot', '--drop-slot' ],
+ 'failure if both --create-slot and --drop-slot specified');
+$primary->command_fails(
+ [ 'pg_receivewal', '-D', $stream_dir, '--create-slot' ],
+ 'failure if --create-slot specified without --slot');
+$primary->command_fails(
+ [ 'pg_receivewal', '-D', $stream_dir, '--synchronous', '--no-sync' ],
+ 'failure if --synchronous specified with --no-sync');
+$primary->command_fails_like(
+ [ 'pg_receivewal', '-D', $stream_dir, '--compress', 'none:1', ],
+ qr/\Qpg_receivewal: error: invalid compression specification: compression algorithm "none" does not accept a compression level/,
+ 'failure if --compress none:N (where N > 0)');
+
+# Slot creation and drop
+my $slot_name = 'test';
+$primary->command_ok(
+ [ 'pg_receivewal', '--slot', $slot_name, '--create-slot' ],
+ 'creating a replication slot');
+my $slot = $primary->slot($slot_name);
+is($slot->{'slot_type'}, 'physical', 'physical replication slot was created');
+is($slot->{'restart_lsn'}, '', 'restart LSN of new slot is null');
+$primary->command_ok([ 'pg_receivewal', '--slot', $slot_name, '--drop-slot' ],
+ 'dropping a replication slot');
+is($primary->slot($slot_name)->{'slot_type'},
+ '', 'replication slot was removed');
+
+# Generate some WAL. Use --synchronous at the same time to add more
+# code coverage. Switch to the next segment first so that subsequent
+# restarts of pg_receivewal will see this segment as full..
+$primary->psql('postgres', 'CREATE TABLE test_table(x integer PRIMARY KEY);');
+$primary->psql('postgres', 'SELECT pg_switch_wal();');
+my $nextlsn =
+ $primary->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn();');
+chomp($nextlsn);
+$primary->psql('postgres', 'INSERT INTO test_table VALUES (1);');
+
+# Stream up to the given position. This is necessary to have a fixed
+# started point for the next commands done in this test, with or without
+# compression involved.
+$primary->command_ok(
+ [
+ 'pg_receivewal', '-D', $stream_dir, '--verbose',
+ '--endpos', $nextlsn, '--synchronous', '--no-loop'
+ ],
+ 'streaming some WAL with --synchronous');
+
+# Verify that one partial file was generated and keep track of it
+my @partial_wals = glob "$stream_dir/*\.partial";
+is(scalar(@partial_wals), 1, "one partial WAL segment was created");
+
+note "Testing pg_receivewal with compression methods";
+
+# Check ZLIB compression if available.
+SKIP:
+{
+ skip "postgres was not built with ZLIB support", 5
+ if (!check_pg_config("#define HAVE_LIBZ 1"));
+
+ # Generate more WAL worth one completed, compressed, segment.
+ $primary->psql('postgres', 'SELECT pg_switch_wal();');
+ $nextlsn =
+ $primary->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn();');
+ chomp($nextlsn);
+ $primary->psql('postgres', 'INSERT INTO test_table VALUES (2);');
+
+ $primary->command_ok(
+ [
+ 'pg_receivewal', '-D', $stream_dir, '--verbose',
+ '--endpos', $nextlsn, '--compress', 'gzip:1',
+ '--no-loop'
+ ],
+ "streaming some WAL using ZLIB compression");
+
+ # Verify that the stored files are generated with their expected
+ # names.
+ my @zlib_wals = glob "$stream_dir/*.gz";
+ is(scalar(@zlib_wals), 1,
+ "one WAL segment compressed with ZLIB was created");
+ my @zlib_partial_wals = glob "$stream_dir/*.gz.partial";
+ is(scalar(@zlib_partial_wals),
+ 1, "one partial WAL segment compressed with ZLIB was created");
+
+ # Verify that the start streaming position is computed correctly by
+ # comparing it with the partial file generated previously. The name
+ # of the previous partial, now-completed WAL segment is updated, keeping
+ # its base number.
+ $partial_wals[0] =~ s/\.partial$/.gz/;
+ is($zlib_wals[0] eq $partial_wals[0],
+ 1, "one partial WAL segment is now completed");
+ # Update the list of partial wals with the current one.
+ @partial_wals = @zlib_partial_wals;
+
+ # Check the integrity of the completed segment, if gzip is a command
+ # available.
+ my $gzip = $ENV{GZIP_PROGRAM};
+ skip "program gzip is not found in your system", 1
+ if (!defined $gzip
+ || $gzip eq '');
+
+ my $gzip_is_valid = system_log($gzip, '--test', @zlib_wals);
+ is($gzip_is_valid, 0,
+ "gzip verified the integrity of compressed WAL segments");
+}
+
+# Check LZ4 compression if available
+SKIP:
+{
+ skip "postgres was not built with LZ4 support", 5
+ if (!check_pg_config("#define USE_LZ4 1"));
+
+ # Generate more WAL including one completed, compressed segment.
+ $primary->psql('postgres', 'SELECT pg_switch_wal();');
+ $nextlsn =
+ $primary->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn();');
+ chomp($nextlsn);
+ $primary->psql('postgres', 'INSERT INTO test_table VALUES (3);');
+
+ # Stream up to the given position.
+ $primary->command_ok(
+ [
+ 'pg_receivewal', '-D', $stream_dir, '--verbose',
+ '--endpos', $nextlsn, '--no-loop', '--compress',
+ 'lz4'
+ ],
+ 'streaming some WAL using --compress=lz4');
+
+ # Verify that the stored files are generated with their expected
+ # names.
+ my @lz4_wals = glob "$stream_dir/*.lz4";
+ is(scalar(@lz4_wals), 1,
+ "one WAL segment compressed with LZ4 was created");
+ my @lz4_partial_wals = glob "$stream_dir/*.lz4.partial";
+ is(scalar(@lz4_partial_wals),
+ 1, "one partial WAL segment compressed with LZ4 was created");
+
+ # Verify that the start streaming position is computed correctly by
+ # comparing it with the partial file generated previously. The name
+ # of the previous partial, now-completed WAL segment is updated, keeping
+ # its base number.
+ $partial_wals[0] =~ s/(\.gz)?\.partial$/.lz4/;
+ is($lz4_wals[0] eq $partial_wals[0],
+ 1, "one partial WAL segment is now completed");
+ # Update the list of partial wals with the current one.
+ @partial_wals = @lz4_partial_wals;
+
+ # Check the integrity of the completed segment, if LZ4 is an available
+ # command.
+ my $lz4 = $ENV{LZ4};
+ skip "program lz4 is not found in your system", 1
+ if (!defined $lz4
+ || $lz4 eq '');
+
+ my $lz4_is_valid = system_log($lz4, '-t', @lz4_wals);
+ is($lz4_is_valid, 0,
+ "lz4 verified the integrity of compressed WAL segments");
+}
+
+# Verify that the start streaming position is computed and that the value is
+# correct regardless of whether any compression is available.
+$primary->psql('postgres', 'SELECT pg_switch_wal();');
+$nextlsn =
+ $primary->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn();');
+chomp($nextlsn);
+$primary->psql('postgres', 'INSERT INTO test_table VALUES (4);');
+$primary->command_ok(
+ [
+ 'pg_receivewal', '-D', $stream_dir, '--verbose',
+ '--endpos', $nextlsn, '--no-loop'
+ ],
+ "streaming some WAL");
+
+$partial_wals[0] =~ s/(\.gz|\.lz4)?.partial//;
+ok(-e $partial_wals[0], "check that previously partial WAL is now complete");
+
+# Permissions on WAL files should be default
+SKIP:
+{
+ skip "unix-style permissions not supported on Windows", 1
+ if ($windows_os);
+
+ ok(check_mode_recursive($stream_dir, 0700, 0600),
+ "check stream dir permissions");
+}
+
+note "Testing pg_receivewal with slot as starting streaming point";
+
+# When using a replication slot, archiving should be resumed from the slot's
+# restart LSN. Use a new archive location and new slot for this test.
+my $slot_dir = $primary->basedir . '/slot_wal';
+mkdir($slot_dir);
+$slot_name = 'archive_slot';
+
+# Setup the slot, reserving WAL at creation (corresponding to the
+# last redo LSN here, actually, so use a checkpoint to reduce the
+# number of segments archived).
+$primary->psql('postgres', 'checkpoint;');
+$primary->psql('postgres',
+ "SELECT pg_create_physical_replication_slot('$slot_name', true);");
+
+# Get the segment name associated with the slot's restart LSN, that should
+# be archived.
+my $walfile_streamed = $primary->safe_psql(
+ 'postgres',
+ "SELECT pg_walfile_name(restart_lsn)
+ FROM pg_replication_slots
+ WHERE slot_name = '$slot_name';");
+
+# Switch to a new segment, to make sure that the segment retained by the
+# slot is still streamed. This may not be necessary, but play it safe.
+$primary->psql('postgres', 'INSERT INTO test_table VALUES (5);');
+$primary->psql('postgres', 'SELECT pg_switch_wal();');
+$nextlsn =
+ $primary->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn();');
+chomp($nextlsn);
+
+# Add a bit more data to accelerate the end of the next pg_receivewal
+# commands.
+$primary->psql('postgres', 'INSERT INTO test_table VALUES (6);');
+
+# Check case where the slot does not exist.
+$primary->command_fails_like(
+ [
+ 'pg_receivewal', '-D', $slot_dir, '--slot',
+ 'nonexistentslot', '-n', '--no-sync', '--verbose',
+ '--endpos', $nextlsn
+ ],
+ qr/pg_receivewal: error: replication slot "nonexistentslot" does not exist/,
+ 'pg_receivewal fails with non-existing slot');
+$primary->command_ok(
+ [
+ 'pg_receivewal', '-D', $slot_dir, '--slot',
+ $slot_name, '-n', '--no-sync', '--verbose',
+ '--endpos', $nextlsn
+ ],
+ "WAL streamed from the slot's restart_lsn");
+ok(-e "$slot_dir/$walfile_streamed",
+ "WAL from the slot's restart_lsn has been archived");
+
+# Test timeline switch using a replication slot, requiring a promoted
+# standby.
+my $backup_name = "basebackup";
+$primary->backup($backup_name);
+my $standby = PostgreSQL::Test::Cluster->new("standby");
+$standby->init_from_backup($primary, $backup_name, has_streaming => 1);
+$standby->start;
+
+# Create a replication slot on this new standby
+my $archive_slot = "archive_slot";
+$standby->psql(
+ '',
+ "CREATE_REPLICATION_SLOT $archive_slot PHYSICAL (RESERVE_WAL)",
+ replication => 1);
+# Wait for standby catchup
+$primary->wait_for_catchup($standby);
+# Get a walfilename from before the promotion to make sure it is archived
+# after promotion
+my $standby_slot = $standby->slot($archive_slot);
+my $replication_slot_lsn = $standby_slot->{'restart_lsn'};
+
+# pg_walfile_name() is not supported while in recovery, so use the primary
+# to build the segment name. Both nodes are on the same timeline, so this
+# produces a segment name with the timeline we are switching from.
+my $walfile_before_promotion =
+ $primary->safe_psql('postgres',
+ "SELECT pg_walfile_name('$replication_slot_lsn');");
+# Everything is setup, promote the standby to trigger a timeline switch.
+$standby->promote;
+
+# Force a segment switch to make sure at least one full WAL is archived
+# on the new timeline.
+my $walfile_after_promotion = $standby->safe_psql('postgres',
+ "SELECT pg_walfile_name(pg_current_wal_insert_lsn());");
+$standby->psql('postgres', 'INSERT INTO test_table VALUES (7);');
+$standby->psql('postgres', 'SELECT pg_switch_wal();');
+$nextlsn =
+ $standby->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn();');
+chomp($nextlsn);
+# This speeds up the operation.
+$standby->psql('postgres', 'INSERT INTO test_table VALUES (8);');
+
+# Now try to resume from the slot after the promotion.
+my $timeline_dir = $primary->basedir . '/timeline_wal';
+mkdir($timeline_dir);
+
+$standby->command_ok(
+ [
+ 'pg_receivewal', '-D', $timeline_dir, '--verbose',
+ '--endpos', $nextlsn, '--slot', $archive_slot,
+ '--no-sync', '-n'
+ ],
+ "Stream some wal after promoting, resuming from the slot's position");
+ok(-e "$timeline_dir/$walfile_before_promotion",
+ "WAL segment $walfile_before_promotion archived after timeline jump");
+ok(-e "$timeline_dir/$walfile_after_promotion",
+ "WAL segment $walfile_after_promotion archived after timeline jump");
+ok(-e "$timeline_dir/00000002.history",
+ "timeline history file archived after timeline jump");
+
+done_testing();
diff --git a/src/bin/pg_basebackup/t/030_pg_recvlogical.pl b/src/bin/pg_basebackup/t/030_pg_recvlogical.pl
new file mode 100644
index 0000000..38576c2
--- /dev/null
+++ b/src/bin/pg_basebackup/t/030_pg_recvlogical.pl
@@ -0,0 +1,113 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use PostgreSQL::Test::Cluster;
+use Test::More;
+
+program_help_ok('pg_recvlogical');
+program_version_ok('pg_recvlogical');
+program_options_handling_ok('pg_recvlogical');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+
+# Initialize node without replication settings
+$node->init(allows_streaming => 1, has_archiving => 1);
+$node->append_conf(
+ 'postgresql.conf', q{
+wal_level = 'logical'
+max_replication_slots = 4
+max_wal_senders = 4
+log_min_messages = 'debug1'
+log_error_verbosity = verbose
+max_prepared_transactions = 10
+});
+$node->dump_info;
+$node->start;
+
+$node->command_fails(['pg_recvlogical'], 'pg_recvlogical needs a slot name');
+$node->command_fails([ 'pg_recvlogical', '-S', 'test' ],
+ 'pg_recvlogical needs a database');
+$node->command_fails([ 'pg_recvlogical', '-S', 'test', '-d', 'postgres' ],
+ 'pg_recvlogical needs an action');
+$node->command_fails(
+ [
+ 'pg_recvlogical', '-S',
+ 'test', '-d',
+ $node->connstr('postgres'), '--start'
+ ],
+ 'no destination file');
+
+$node->command_ok(
+ [
+ 'pg_recvlogical', '-S',
+ 'test', '-d',
+ $node->connstr('postgres'), '--create-slot'
+ ],
+ 'slot created');
+
+my $slot = $node->slot('test');
+isnt($slot->{'restart_lsn'}, '', 'restart lsn is defined for new slot');
+
+$node->psql('postgres', 'CREATE TABLE test_table(x integer)');
+$node->psql('postgres',
+ 'INSERT INTO test_table(x) SELECT y FROM generate_series(1, 10) a(y);');
+my $nextlsn =
+ $node->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn()');
+chomp($nextlsn);
+
+$node->command_ok(
+ [
+ 'pg_recvlogical', '-S', 'test', '-d', $node->connstr('postgres'),
+ '--start', '--endpos', "$nextlsn", '--no-loop', '-f', '-'
+ ],
+ 'replayed a transaction');
+
+$node->command_ok(
+ [
+ 'pg_recvlogical', '-S',
+ 'test', '-d',
+ $node->connstr('postgres'), '--drop-slot'
+ ],
+ 'slot dropped');
+
+#test with two-phase option enabled
+$node->command_ok(
+ [
+ 'pg_recvlogical', '-S',
+ 'test', '-d',
+ $node->connstr('postgres'), '--create-slot',
+ '--two-phase'
+ ],
+ 'slot with two-phase created');
+
+$slot = $node->slot('test');
+isnt($slot->{'restart_lsn'}, '', 'restart lsn is defined for new slot');
+
+$node->safe_psql('postgres',
+ "BEGIN; INSERT INTO test_table values (11); PREPARE TRANSACTION 'test'");
+$node->safe_psql('postgres', "COMMIT PREPARED 'test'");
+$nextlsn = $node->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn()');
+chomp($nextlsn);
+
+$node->command_fails(
+ [
+ 'pg_recvlogical', '-S',
+ 'test', '-d',
+ $node->connstr('postgres'), '--start',
+ '--endpos', "$nextlsn",
+ '--two-phase', '--no-loop',
+ '-f', '-'
+ ],
+ 'incorrect usage');
+
+$node->command_ok(
+ [
+ 'pg_recvlogical', '-S', 'test', '-d', $node->connstr('postgres'),
+ '--start', '--endpos', "$nextlsn", '--no-loop', '-f', '-'
+ ],
+ 'replayed a two-phase transaction');
+
+done_testing();
diff --git a/src/bin/pg_basebackup/walmethods.c b/src/bin/pg_basebackup/walmethods.c
new file mode 100644
index 0000000..602727f
--- /dev/null
+++ b/src/bin/pg_basebackup/walmethods.c
@@ -0,0 +1,1386 @@
+/*-------------------------------------------------------------------------
+ *
+ * walmethods.c - implementations of different ways to write received wal
+ *
+ * NOTE! The caller must ensure that only one method is instantiated in
+ * any given program, and that it's only instantiated once!
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/walmethods.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+#include <time.h>
+#include <unistd.h>
+
+#ifdef USE_LZ4
+#include <lz4frame.h>
+#endif
+#ifdef HAVE_LIBZ
+#include <zlib.h>
+#endif
+
+#include "common/file_perm.h"
+#include "common/file_utils.h"
+#include "common/logging.h"
+#include "pgtar.h"
+#include "receivelog.h"
+#include "streamutil.h"
+
+/* Size of zlib buffer for .tar.gz */
+#define ZLIB_OUT_SIZE 4096
+
+/* Size of LZ4 input chunk for .lz4 */
+#define LZ4_IN_SIZE 4096
+
+/*-------------------------------------------------------------------------
+ * WalDirectoryMethod - write wal to a directory looking like pg_wal
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * Global static data for this method
+ */
+typedef struct DirectoryMethodData
+{
+ char *basedir;
+ pg_compress_algorithm compression_algorithm;
+ int compression_level;
+ bool sync;
+ const char *lasterrstring; /* if set, takes precedence over lasterrno */
+ int lasterrno;
+} DirectoryMethodData;
+static DirectoryMethodData *dir_data = NULL;
+
+/*
+ * Local file handle
+ */
+typedef struct DirectoryMethodFile
+{
+ int fd;
+ off_t currpos;
+ char *pathname;
+ char *fullpath;
+ char *temp_suffix;
+#ifdef HAVE_LIBZ
+ gzFile gzfp;
+#endif
+#ifdef USE_LZ4
+ LZ4F_compressionContext_t ctx;
+ size_t lz4bufsize;
+ void *lz4buf;
+#endif
+} DirectoryMethodFile;
+
+#define dir_clear_error() \
+ (dir_data->lasterrstring = NULL, dir_data->lasterrno = 0)
+#define dir_set_error(msg) \
+ (dir_data->lasterrstring = _(msg))
+
+static const char *
+dir_getlasterror(void)
+{
+ if (dir_data->lasterrstring)
+ return dir_data->lasterrstring;
+ return strerror(dir_data->lasterrno);
+}
+
+static char *
+dir_get_file_name(const char *pathname, const char *temp_suffix)
+{
+ char *filename = pg_malloc0(MAXPGPATH * sizeof(char));
+
+ snprintf(filename, MAXPGPATH, "%s%s%s",
+ pathname,
+ dir_data->compression_algorithm == PG_COMPRESSION_GZIP ? ".gz" :
+ dir_data->compression_algorithm == PG_COMPRESSION_LZ4 ? ".lz4" : "",
+ temp_suffix ? temp_suffix : "");
+
+ return filename;
+}
+
+static Walfile
+dir_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_size)
+{
+ char tmppath[MAXPGPATH];
+ char *filename;
+ int fd;
+ DirectoryMethodFile *f;
+#ifdef HAVE_LIBZ
+ gzFile gzfp = NULL;
+#endif
+#ifdef USE_LZ4
+ LZ4F_compressionContext_t ctx = NULL;
+ size_t lz4bufsize = 0;
+ void *lz4buf = NULL;
+#endif
+
+ dir_clear_error();
+
+ filename = dir_get_file_name(pathname, temp_suffix);
+ snprintf(tmppath, sizeof(tmppath), "%s/%s",
+ dir_data->basedir, filename);
+ pg_free(filename);
+
+ /*
+ * Open a file for non-compressed as well as compressed files. Tracking
+ * the file descriptor is important for dir_sync() method as gzflush()
+ * does not do any system calls to fsync() to make changes permanent on
+ * disk.
+ */
+ fd = open(tmppath, O_WRONLY | O_CREAT | PG_BINARY, pg_file_create_mode);
+ if (fd < 0)
+ {
+ dir_data->lasterrno = errno;
+ return NULL;
+ }
+
+#ifdef HAVE_LIBZ
+ if (dir_data->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ gzfp = gzdopen(fd, "wb");
+ if (gzfp == NULL)
+ {
+ dir_data->lasterrno = errno;
+ close(fd);
+ return NULL;
+ }
+
+ if (gzsetparams(gzfp, dir_data->compression_level,
+ Z_DEFAULT_STRATEGY) != Z_OK)
+ {
+ dir_data->lasterrno = errno;
+ gzclose(gzfp);
+ return NULL;
+ }
+ }
+#endif
+#ifdef USE_LZ4
+ if (dir_data->compression_algorithm == PG_COMPRESSION_LZ4)
+ {
+ size_t ctx_out;
+ size_t header_size;
+ LZ4F_preferences_t prefs;
+
+ ctx_out = LZ4F_createCompressionContext(&ctx, LZ4F_VERSION);
+ if (LZ4F_isError(ctx_out))
+ {
+ dir_data->lasterrstring = LZ4F_getErrorName(ctx_out);
+ close(fd);
+ return NULL;
+ }
+
+ lz4bufsize = LZ4F_compressBound(LZ4_IN_SIZE, NULL);
+ lz4buf = pg_malloc0(lz4bufsize);
+
+ /* assign the compression level, default is 0 */
+ memset(&prefs, 0, sizeof(prefs));
+ prefs.compressionLevel = dir_data->compression_level;
+
+ /* add the header */
+ header_size = LZ4F_compressBegin(ctx, lz4buf, lz4bufsize, &prefs);
+ if (LZ4F_isError(header_size))
+ {
+ dir_data->lasterrstring = LZ4F_getErrorName(header_size);
+ (void) LZ4F_freeCompressionContext(ctx);
+ pg_free(lz4buf);
+ close(fd);
+ return NULL;
+ }
+
+ errno = 0;
+ if (write(fd, lz4buf, header_size) != header_size)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ dir_data->lasterrno = errno ? errno : ENOSPC;
+ (void) LZ4F_freeCompressionContext(ctx);
+ pg_free(lz4buf);
+ close(fd);
+ return NULL;
+ }
+ }
+#endif
+
+ /* Do pre-padding on non-compressed files */
+ if (pad_to_size && dir_data->compression_algorithm == PG_COMPRESSION_NONE)
+ {
+ PGAlignedXLogBlock zerobuf;
+ int bytes;
+
+ memset(zerobuf.data, 0, XLOG_BLCKSZ);
+ for (bytes = 0; bytes < pad_to_size; bytes += XLOG_BLCKSZ)
+ {
+ errno = 0;
+ if (write(fd, zerobuf.data, XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ dir_data->lasterrno = errno ? errno : ENOSPC;
+ close(fd);
+ return NULL;
+ }
+ }
+
+ if (lseek(fd, 0, SEEK_SET) != 0)
+ {
+ dir_data->lasterrno = errno;
+ close(fd);
+ return NULL;
+ }
+ }
+
+ /*
+ * fsync WAL file and containing directory, to ensure the file is
+ * persistently created and zeroed (if padded). That's particularly
+ * important when using synchronous mode, where the file is modified and
+ * fsynced in-place, without a directory fsync.
+ */
+ if (dir_data->sync)
+ {
+ if (fsync_fname(tmppath, false) != 0 ||
+ fsync_parent_path(tmppath) != 0)
+ {
+ dir_data->lasterrno = errno;
+#ifdef HAVE_LIBZ
+ if (dir_data->compression_algorithm == PG_COMPRESSION_GZIP)
+ gzclose(gzfp);
+ else
+#endif
+#ifdef USE_LZ4
+ if (dir_data->compression_algorithm == PG_COMPRESSION_LZ4)
+ {
+ (void) LZ4F_compressEnd(ctx, lz4buf, lz4bufsize, NULL);
+ (void) LZ4F_freeCompressionContext(ctx);
+ pg_free(lz4buf);
+ close(fd);
+ }
+ else
+#endif
+ close(fd);
+ return NULL;
+ }
+ }
+
+ f = pg_malloc0(sizeof(DirectoryMethodFile));
+#ifdef HAVE_LIBZ
+ if (dir_data->compression_algorithm == PG_COMPRESSION_GZIP)
+ f->gzfp = gzfp;
+#endif
+#ifdef USE_LZ4
+ if (dir_data->compression_algorithm == PG_COMPRESSION_LZ4)
+ {
+ f->ctx = ctx;
+ f->lz4buf = lz4buf;
+ f->lz4bufsize = lz4bufsize;
+ }
+#endif
+
+ f->fd = fd;
+ f->currpos = 0;
+ f->pathname = pg_strdup(pathname);
+ f->fullpath = pg_strdup(tmppath);
+ if (temp_suffix)
+ f->temp_suffix = pg_strdup(temp_suffix);
+
+ return f;
+}
+
+static ssize_t
+dir_write(Walfile f, const void *buf, size_t count)
+{
+ ssize_t r;
+ DirectoryMethodFile *df = (DirectoryMethodFile *) f;
+
+ Assert(f != NULL);
+ dir_clear_error();
+
+#ifdef HAVE_LIBZ
+ if (dir_data->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ errno = 0;
+ r = (ssize_t) gzwrite(df->gzfp, buf, count);
+ if (r != count)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ dir_data->lasterrno = errno ? errno : ENOSPC;
+ }
+ }
+ else
+#endif
+#ifdef USE_LZ4
+ if (dir_data->compression_algorithm == PG_COMPRESSION_LZ4)
+ {
+ size_t chunk;
+ size_t remaining;
+ const void *inbuf = buf;
+
+ remaining = count;
+ while (remaining > 0)
+ {
+ size_t compressed;
+
+ if (remaining > LZ4_IN_SIZE)
+ chunk = LZ4_IN_SIZE;
+ else
+ chunk = remaining;
+
+ remaining -= chunk;
+ compressed = LZ4F_compressUpdate(df->ctx,
+ df->lz4buf, df->lz4bufsize,
+ inbuf, chunk,
+ NULL);
+
+ if (LZ4F_isError(compressed))
+ {
+ dir_data->lasterrstring = LZ4F_getErrorName(compressed);
+ return -1;
+ }
+
+ errno = 0;
+ if (write(df->fd, df->lz4buf, compressed) != compressed)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ dir_data->lasterrno = errno ? errno : ENOSPC;
+ return -1;
+ }
+
+ inbuf = ((char *) inbuf) + chunk;
+ }
+
+ /* Our caller keeps track of the uncompressed size. */
+ r = (ssize_t) count;
+ }
+ else
+#endif
+ {
+ errno = 0;
+ r = write(df->fd, buf, count);
+ if (r != count)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ dir_data->lasterrno = errno ? errno : ENOSPC;
+ }
+ }
+ if (r > 0)
+ df->currpos += r;
+ return r;
+}
+
+static off_t
+dir_get_current_pos(Walfile f)
+{
+ Assert(f != NULL);
+ dir_clear_error();
+
+ /* Use a cached value to prevent lots of reseeks */
+ return ((DirectoryMethodFile *) f)->currpos;
+}
+
+static int
+dir_close(Walfile f, WalCloseMethod method)
+{
+ int r;
+ DirectoryMethodFile *df = (DirectoryMethodFile *) f;
+ char tmppath[MAXPGPATH];
+ char tmppath2[MAXPGPATH];
+
+ Assert(f != NULL);
+ dir_clear_error();
+
+#ifdef HAVE_LIBZ
+ if (dir_data->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ errno = 0; /* in case gzclose() doesn't set it */
+ r = gzclose(df->gzfp);
+ }
+ else
+#endif
+#ifdef USE_LZ4
+ if (dir_data->compression_algorithm == PG_COMPRESSION_LZ4)
+ {
+ size_t compressed;
+
+ compressed = LZ4F_compressEnd(df->ctx,
+ df->lz4buf, df->lz4bufsize,
+ NULL);
+
+ if (LZ4F_isError(compressed))
+ {
+ dir_data->lasterrstring = LZ4F_getErrorName(compressed);
+ return -1;
+ }
+
+ errno = 0;
+ if (write(df->fd, df->lz4buf, compressed) != compressed)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ dir_data->lasterrno = errno ? errno : ENOSPC;
+ return -1;
+ }
+
+ r = close(df->fd);
+ }
+ else
+#endif
+ r = close(df->fd);
+
+ if (r == 0)
+ {
+ /* Build path to the current version of the file */
+ if (method == CLOSE_NORMAL && df->temp_suffix)
+ {
+ char *filename;
+ char *filename2;
+
+ /*
+ * If we have a temp prefix, normal operation is to rename the
+ * file.
+ */
+ filename = dir_get_file_name(df->pathname, df->temp_suffix);
+ snprintf(tmppath, sizeof(tmppath), "%s/%s",
+ dir_data->basedir, filename);
+ pg_free(filename);
+
+ /* permanent name, so no need for the prefix */
+ filename2 = dir_get_file_name(df->pathname, NULL);
+ snprintf(tmppath2, sizeof(tmppath2), "%s/%s",
+ dir_data->basedir, filename2);
+ pg_free(filename2);
+ if (dir_data->sync)
+ r = durable_rename(tmppath, tmppath2);
+ else
+ {
+ if (rename(tmppath, tmppath2) != 0)
+ {
+ pg_log_error("could not rename file \"%s\" to \"%s\": %m",
+ tmppath, tmppath2);
+ r = -1;
+ }
+ }
+ }
+ else if (method == CLOSE_UNLINK)
+ {
+ char *filename;
+
+ /* Unlink the file once it's closed */
+ filename = dir_get_file_name(df->pathname, df->temp_suffix);
+ snprintf(tmppath, sizeof(tmppath), "%s/%s",
+ dir_data->basedir, filename);
+ pg_free(filename);
+ r = unlink(tmppath);
+ }
+ else
+ {
+ /*
+ * Else either CLOSE_NORMAL and no temp suffix, or
+ * CLOSE_NO_RENAME. In this case, fsync the file and containing
+ * directory if sync mode is requested.
+ */
+ if (dir_data->sync)
+ {
+ r = fsync_fname(df->fullpath, false);
+ if (r == 0)
+ r = fsync_parent_path(df->fullpath);
+ }
+ }
+ }
+
+ if (r != 0)
+ dir_data->lasterrno = errno;
+
+#ifdef USE_LZ4
+ pg_free(df->lz4buf);
+ /* supports free on NULL */
+ LZ4F_freeCompressionContext(df->ctx);
+#endif
+
+ pg_free(df->pathname);
+ pg_free(df->fullpath);
+ if (df->temp_suffix)
+ pg_free(df->temp_suffix);
+ pg_free(df);
+
+ return r;
+}
+
+static int
+dir_sync(Walfile f)
+{
+ int r;
+
+ Assert(f != NULL);
+ dir_clear_error();
+
+ if (!dir_data->sync)
+ return 0;
+
+#ifdef HAVE_LIBZ
+ if (dir_data->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ if (gzflush(((DirectoryMethodFile *) f)->gzfp, Z_SYNC_FLUSH) != Z_OK)
+ {
+ dir_data->lasterrno = errno;
+ return -1;
+ }
+ }
+#endif
+#ifdef USE_LZ4
+ if (dir_data->compression_algorithm == PG_COMPRESSION_LZ4)
+ {
+ DirectoryMethodFile *df = (DirectoryMethodFile *) f;
+ size_t compressed;
+
+ /* Flush any internal buffers */
+ compressed = LZ4F_flush(df->ctx, df->lz4buf, df->lz4bufsize, NULL);
+ if (LZ4F_isError(compressed))
+ {
+ dir_data->lasterrstring = LZ4F_getErrorName(compressed);
+ return -1;
+ }
+
+ errno = 0;
+ if (write(df->fd, df->lz4buf, compressed) != compressed)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ dir_data->lasterrno = errno ? errno : ENOSPC;
+ return -1;
+ }
+ }
+#endif
+
+ r = fsync(((DirectoryMethodFile *) f)->fd);
+ if (r < 0)
+ dir_data->lasterrno = errno;
+ return r;
+}
+
+static ssize_t
+dir_get_file_size(const char *pathname)
+{
+ struct stat statbuf;
+ char tmppath[MAXPGPATH];
+
+ snprintf(tmppath, sizeof(tmppath), "%s/%s",
+ dir_data->basedir, pathname);
+
+ if (stat(tmppath, &statbuf) != 0)
+ {
+ dir_data->lasterrno = errno;
+ return -1;
+ }
+
+ return statbuf.st_size;
+}
+
+static pg_compress_algorithm
+dir_compression_algorithm(void)
+{
+ return dir_data->compression_algorithm;
+}
+
+static bool
+dir_existsfile(const char *pathname)
+{
+ char tmppath[MAXPGPATH];
+ int fd;
+
+ dir_clear_error();
+
+ snprintf(tmppath, sizeof(tmppath), "%s/%s",
+ dir_data->basedir, pathname);
+
+ fd = open(tmppath, O_RDONLY | PG_BINARY, 0);
+ if (fd < 0)
+ return false;
+ close(fd);
+ return true;
+}
+
+static bool
+dir_finish(void)
+{
+ dir_clear_error();
+
+ if (dir_data->sync)
+ {
+ /*
+ * Files are fsynced when they are closed, but we need to fsync the
+ * directory entry here as well.
+ */
+ if (fsync_fname(dir_data->basedir, true) != 0)
+ {
+ dir_data->lasterrno = errno;
+ return false;
+ }
+ }
+ return true;
+}
+
+
+WalWriteMethod *
+CreateWalDirectoryMethod(const char *basedir,
+ pg_compress_algorithm compression_algorithm,
+ int compression_level, bool sync)
+{
+ WalWriteMethod *method;
+
+ method = pg_malloc0(sizeof(WalWriteMethod));
+ method->open_for_write = dir_open_for_write;
+ method->write = dir_write;
+ method->get_current_pos = dir_get_current_pos;
+ method->get_file_size = dir_get_file_size;
+ method->get_file_name = dir_get_file_name;
+ method->compression_algorithm = dir_compression_algorithm;
+ method->close = dir_close;
+ method->sync = dir_sync;
+ method->existsfile = dir_existsfile;
+ method->finish = dir_finish;
+ method->getlasterror = dir_getlasterror;
+
+ dir_data = pg_malloc0(sizeof(DirectoryMethodData));
+ dir_data->compression_algorithm = compression_algorithm;
+ dir_data->compression_level = compression_level;
+ dir_data->basedir = pg_strdup(basedir);
+ dir_data->sync = sync;
+
+ return method;
+}
+
+void
+FreeWalDirectoryMethod(void)
+{
+ pg_free(dir_data->basedir);
+ pg_free(dir_data);
+ dir_data = NULL;
+}
+
+
+/*-------------------------------------------------------------------------
+ * WalTarMethod - write wal to a tar file containing pg_wal contents
+ *-------------------------------------------------------------------------
+ */
+
+typedef struct TarMethodFile
+{
+ off_t ofs_start; /* Where does the *header* for this file start */
+ off_t currpos;
+ char header[TAR_BLOCK_SIZE];
+ char *pathname;
+ size_t pad_to_size;
+} TarMethodFile;
+
+typedef struct TarMethodData
+{
+ char *tarfilename;
+ int fd;
+ pg_compress_algorithm compression_algorithm;
+ int compression_level;
+ bool sync;
+ TarMethodFile *currentfile;
+ const char *lasterrstring; /* if set, takes precedence over lasterrno */
+ int lasterrno;
+#ifdef HAVE_LIBZ
+ z_streamp zp;
+ void *zlibOut;
+#endif
+} TarMethodData;
+static TarMethodData *tar_data = NULL;
+
+#define tar_clear_error() \
+ (tar_data->lasterrstring = NULL, tar_data->lasterrno = 0)
+#define tar_set_error(msg) \
+ (tar_data->lasterrstring = _(msg))
+
+static const char *
+tar_getlasterror(void)
+{
+ if (tar_data->lasterrstring)
+ return tar_data->lasterrstring;
+ return strerror(tar_data->lasterrno);
+}
+
+#ifdef HAVE_LIBZ
+static bool
+tar_write_compressed_data(void *buf, size_t count, bool flush)
+{
+ tar_data->zp->next_in = buf;
+ tar_data->zp->avail_in = count;
+
+ while (tar_data->zp->avail_in || flush)
+ {
+ int r;
+
+ r = deflate(tar_data->zp, flush ? Z_FINISH : Z_NO_FLUSH);
+ if (r == Z_STREAM_ERROR)
+ {
+ tar_set_error("could not compress data");
+ return false;
+ }
+
+ if (tar_data->zp->avail_out < ZLIB_OUT_SIZE)
+ {
+ size_t len = ZLIB_OUT_SIZE - tar_data->zp->avail_out;
+
+ errno = 0;
+ if (write(tar_data->fd, tar_data->zlibOut, len) != len)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ tar_data->lasterrno = errno ? errno : ENOSPC;
+ return false;
+ }
+
+ tar_data->zp->next_out = tar_data->zlibOut;
+ tar_data->zp->avail_out = ZLIB_OUT_SIZE;
+ }
+
+ if (r == Z_STREAM_END)
+ break;
+ }
+
+ if (flush)
+ {
+ /* Reset the stream for writing */
+ if (deflateReset(tar_data->zp) != Z_OK)
+ {
+ tar_set_error("could not reset compression stream");
+ return false;
+ }
+ }
+
+ return true;
+}
+#endif
+
+static ssize_t
+tar_write(Walfile f, const void *buf, size_t count)
+{
+ ssize_t r;
+
+ Assert(f != NULL);
+ tar_clear_error();
+
+ /* Tarfile will always be positioned at the end */
+ if (tar_data->compression_algorithm == PG_COMPRESSION_NONE)
+ {
+ errno = 0;
+ r = write(tar_data->fd, buf, count);
+ if (r != count)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ tar_data->lasterrno = errno ? errno : ENOSPC;
+ return -1;
+ }
+ ((TarMethodFile *) f)->currpos += r;
+ return r;
+ }
+#ifdef HAVE_LIBZ
+ else if (tar_data->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ if (!tar_write_compressed_data(unconstify(void *, buf), count, false))
+ return -1;
+ ((TarMethodFile *) f)->currpos += count;
+ return count;
+ }
+#endif
+ else
+ {
+ /* Can't happen - compression enabled with no method set */
+ tar_data->lasterrno = ENOSYS;
+ return -1;
+ }
+}
+
+static bool
+tar_write_padding_data(TarMethodFile *f, size_t bytes)
+{
+ PGAlignedXLogBlock zerobuf;
+ size_t bytesleft = bytes;
+
+ memset(zerobuf.data, 0, XLOG_BLCKSZ);
+ while (bytesleft)
+ {
+ size_t bytestowrite = Min(bytesleft, XLOG_BLCKSZ);
+ ssize_t r = tar_write(f, zerobuf.data, bytestowrite);
+
+ if (r < 0)
+ return false;
+ bytesleft -= r;
+ }
+
+ return true;
+}
+
+static char *
+tar_get_file_name(const char *pathname, const char *temp_suffix)
+{
+ char *filename = pg_malloc0(MAXPGPATH * sizeof(char));
+
+ snprintf(filename, MAXPGPATH, "%s%s",
+ pathname, temp_suffix ? temp_suffix : "");
+
+ return filename;
+}
+
+static Walfile
+tar_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_size)
+{
+ char *tmppath;
+
+ tar_clear_error();
+
+ if (tar_data->fd < 0)
+ {
+ /*
+ * We open the tar file only when we first try to write to it.
+ */
+ tar_data->fd = open(tar_data->tarfilename,
+ O_WRONLY | O_CREAT | PG_BINARY,
+ pg_file_create_mode);
+ if (tar_data->fd < 0)
+ {
+ tar_data->lasterrno = errno;
+ return NULL;
+ }
+
+#ifdef HAVE_LIBZ
+ if (tar_data->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ tar_data->zp = (z_streamp) pg_malloc(sizeof(z_stream));
+ tar_data->zp->zalloc = Z_NULL;
+ tar_data->zp->zfree = Z_NULL;
+ tar_data->zp->opaque = Z_NULL;
+ tar_data->zp->next_out = tar_data->zlibOut;
+ tar_data->zp->avail_out = ZLIB_OUT_SIZE;
+
+ /*
+ * Initialize deflation library. Adding the magic value 16 to the
+ * default 15 for the windowBits parameter makes the output be
+ * gzip instead of zlib.
+ */
+ if (deflateInit2(tar_data->zp, tar_data->compression_level,
+ Z_DEFLATED, 15 + 16, 8, Z_DEFAULT_STRATEGY) != Z_OK)
+ {
+ pg_free(tar_data->zp);
+ tar_data->zp = NULL;
+ tar_set_error("could not initialize compression library");
+ return NULL;
+ }
+ }
+#endif
+
+ /* There's no tar header itself, the file starts with regular files */
+ }
+
+ if (tar_data->currentfile != NULL)
+ {
+ tar_set_error("implementation error: tar files can't have more than one open file");
+ return NULL;
+ }
+
+ tar_data->currentfile = pg_malloc0(sizeof(TarMethodFile));
+
+ tmppath = tar_get_file_name(pathname, temp_suffix);
+
+ /* Create a header with size set to 0 - we will fill out the size on close */
+ if (tarCreateHeader(tar_data->currentfile->header, tmppath, NULL, 0, S_IRUSR | S_IWUSR, 0, 0, time(NULL)) != TAR_OK)
+ {
+ pg_free(tar_data->currentfile);
+ pg_free(tmppath);
+ tar_data->currentfile = NULL;
+ tar_set_error("could not create tar header");
+ return NULL;
+ }
+
+ pg_free(tmppath);
+
+#ifdef HAVE_LIBZ
+ if (tar_data->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ /* Flush existing data */
+ if (!tar_write_compressed_data(NULL, 0, true))
+ return NULL;
+
+ /* Turn off compression for header */
+ if (deflateParams(tar_data->zp, 0, Z_DEFAULT_STRATEGY) != Z_OK)
+ {
+ tar_set_error("could not change compression parameters");
+ return NULL;
+ }
+ }
+#endif
+
+ tar_data->currentfile->ofs_start = lseek(tar_data->fd, 0, SEEK_CUR);
+ if (tar_data->currentfile->ofs_start == -1)
+ {
+ tar_data->lasterrno = errno;
+ pg_free(tar_data->currentfile);
+ tar_data->currentfile = NULL;
+ return NULL;
+ }
+ tar_data->currentfile->currpos = 0;
+
+ if (tar_data->compression_algorithm == PG_COMPRESSION_NONE)
+ {
+ errno = 0;
+ if (write(tar_data->fd, tar_data->currentfile->header,
+ TAR_BLOCK_SIZE) != TAR_BLOCK_SIZE)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ tar_data->lasterrno = errno ? errno : ENOSPC;
+ pg_free(tar_data->currentfile);
+ tar_data->currentfile = NULL;
+ return NULL;
+ }
+ }
+#ifdef HAVE_LIBZ
+ else if (tar_data->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ /* Write header through the zlib APIs but with no compression */
+ if (!tar_write_compressed_data(tar_data->currentfile->header,
+ TAR_BLOCK_SIZE, true))
+ return NULL;
+
+ /* Re-enable compression for the rest of the file */
+ if (deflateParams(tar_data->zp, tar_data->compression_level,
+ Z_DEFAULT_STRATEGY) != Z_OK)
+ {
+ tar_set_error("could not change compression parameters");
+ return NULL;
+ }
+ }
+#endif
+ else
+ {
+ /* not reachable */
+ Assert(false);
+ }
+
+ tar_data->currentfile->pathname = pg_strdup(pathname);
+
+ /*
+ * Uncompressed files are padded on creation, but for compression we can't
+ * do that
+ */
+ if (pad_to_size)
+ {
+ tar_data->currentfile->pad_to_size = pad_to_size;
+ if (tar_data->compression_algorithm == PG_COMPRESSION_NONE)
+ {
+ /* Uncompressed, so pad now */
+ if (!tar_write_padding_data(tar_data->currentfile, pad_to_size))
+ return NULL;
+ /* Seek back to start */
+ if (lseek(tar_data->fd,
+ tar_data->currentfile->ofs_start + TAR_BLOCK_SIZE,
+ SEEK_SET) != tar_data->currentfile->ofs_start + TAR_BLOCK_SIZE)
+ {
+ tar_data->lasterrno = errno;
+ return NULL;
+ }
+
+ tar_data->currentfile->currpos = 0;
+ }
+ }
+
+ return tar_data->currentfile;
+}
+
+static ssize_t
+tar_get_file_size(const char *pathname)
+{
+ tar_clear_error();
+
+ /* Currently not used, so not supported */
+ tar_data->lasterrno = ENOSYS;
+ return -1;
+}
+
+static pg_compress_algorithm
+tar_compression_algorithm(void)
+{
+ return tar_data->compression_algorithm;
+}
+
+static off_t
+tar_get_current_pos(Walfile f)
+{
+ Assert(f != NULL);
+ tar_clear_error();
+
+ return ((TarMethodFile *) f)->currpos;
+}
+
+static int
+tar_sync(Walfile f)
+{
+ int r;
+
+ Assert(f != NULL);
+ tar_clear_error();
+
+ if (!tar_data->sync)
+ return 0;
+
+ /*
+ * Always sync the whole tarfile, because that's all we can do. This makes
+ * no sense on compressed files, so just ignore those.
+ */
+ if (tar_data->compression_algorithm != PG_COMPRESSION_NONE)
+ return 0;
+
+ r = fsync(tar_data->fd);
+ if (r < 0)
+ tar_data->lasterrno = errno;
+ return r;
+}
+
+static int
+tar_close(Walfile f, WalCloseMethod method)
+{
+ ssize_t filesize;
+ int padding;
+ TarMethodFile *tf = (TarMethodFile *) f;
+
+ Assert(f != NULL);
+ tar_clear_error();
+
+ if (method == CLOSE_UNLINK)
+ {
+ if (tar_data->compression_algorithm != PG_COMPRESSION_NONE)
+ {
+ tar_set_error("unlink not supported with compression");
+ return -1;
+ }
+
+ /*
+ * Unlink the file that we just wrote to the tar. We do this by
+ * truncating it to the start of the header. This is safe as we only
+ * allow writing of the very last file.
+ */
+ if (ftruncate(tar_data->fd, tf->ofs_start) != 0)
+ {
+ tar_data->lasterrno = errno;
+ return -1;
+ }
+
+ pg_free(tf->pathname);
+ pg_free(tf);
+ tar_data->currentfile = NULL;
+
+ return 0;
+ }
+
+ /*
+ * Pad the file itself with zeroes if necessary. Note that this is
+ * different from the tar format padding -- this is the padding we asked
+ * for when the file was opened.
+ */
+ if (tf->pad_to_size)
+ {
+ if (tar_data->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ /*
+ * A compressed tarfile is padded on close since we cannot know
+ * the size of the compressed output until the end.
+ */
+ size_t sizeleft = tf->pad_to_size - tf->currpos;
+
+ if (sizeleft)
+ {
+ if (!tar_write_padding_data(tf, sizeleft))
+ return -1;
+ }
+ }
+ else
+ {
+ /*
+ * An uncompressed tarfile was padded on creation, so just adjust
+ * the current position as if we seeked to the end.
+ */
+ tf->currpos = tf->pad_to_size;
+ }
+ }
+
+ /*
+ * Get the size of the file, and pad out to a multiple of the tar block
+ * size.
+ */
+ filesize = tar_get_current_pos(f);
+ padding = tarPaddingBytesRequired(filesize);
+ if (padding)
+ {
+ char zerobuf[TAR_BLOCK_SIZE];
+
+ MemSet(zerobuf, 0, padding);
+ if (tar_write(f, zerobuf, padding) != padding)
+ return -1;
+ }
+
+
+#ifdef HAVE_LIBZ
+ if (tar_data->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ /* Flush the current buffer */
+ if (!tar_write_compressed_data(NULL, 0, true))
+ return -1;
+ }
+#endif
+
+ /*
+ * Now go back and update the header with the correct filesize and
+ * possibly also renaming the file. We overwrite the entire current header
+ * when done, including the checksum.
+ */
+ print_tar_number(&(tf->header[124]), 12, filesize);
+
+ if (method == CLOSE_NORMAL)
+
+ /*
+ * We overwrite it with what it was before if we have no tempname,
+ * since we're going to write the buffer anyway.
+ */
+ strlcpy(&(tf->header[0]), tf->pathname, 100);
+
+ print_tar_number(&(tf->header[148]), 8, tarChecksum(((TarMethodFile *) f)->header));
+ if (lseek(tar_data->fd, tf->ofs_start, SEEK_SET) != ((TarMethodFile *) f)->ofs_start)
+ {
+ tar_data->lasterrno = errno;
+ return -1;
+ }
+ if (tar_data->compression_algorithm == PG_COMPRESSION_NONE)
+ {
+ errno = 0;
+ if (write(tar_data->fd, tf->header, TAR_BLOCK_SIZE) != TAR_BLOCK_SIZE)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ tar_data->lasterrno = errno ? errno : ENOSPC;
+ return -1;
+ }
+ }
+#ifdef HAVE_LIBZ
+ else if (tar_data->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ /* Turn off compression */
+ if (deflateParams(tar_data->zp, 0, Z_DEFAULT_STRATEGY) != Z_OK)
+ {
+ tar_set_error("could not change compression parameters");
+ return -1;
+ }
+
+ /* Overwrite the header, assuming the size will be the same */
+ if (!tar_write_compressed_data(tar_data->currentfile->header,
+ TAR_BLOCK_SIZE, true))
+ return -1;
+
+ /* Turn compression back on */
+ if (deflateParams(tar_data->zp, tar_data->compression_level,
+ Z_DEFAULT_STRATEGY) != Z_OK)
+ {
+ tar_set_error("could not change compression parameters");
+ return -1;
+ }
+ }
+#endif
+ else
+ {
+ /* not reachable */
+ Assert(false);
+ }
+
+ /* Move file pointer back down to end, so we can write the next file */
+ if (lseek(tar_data->fd, 0, SEEK_END) < 0)
+ {
+ tar_data->lasterrno = errno;
+ return -1;
+ }
+
+ /* Always fsync on close, so the padding gets fsynced */
+ if (tar_sync(f) < 0)
+ {
+ /* XXX this seems pretty bogus; why is only this case fatal? */
+ pg_fatal("could not fsync file \"%s\": %s",
+ tf->pathname, tar_getlasterror());
+ }
+
+ /* Clean up and done */
+ pg_free(tf->pathname);
+ pg_free(tf);
+ tar_data->currentfile = NULL;
+
+ return 0;
+}
+
+static bool
+tar_existsfile(const char *pathname)
+{
+ tar_clear_error();
+ /* We only deal with new tarfiles, so nothing externally created exists */
+ return false;
+}
+
+static bool
+tar_finish(void)
+{
+ char zerobuf[1024];
+
+ tar_clear_error();
+
+ if (tar_data->currentfile)
+ {
+ if (tar_close(tar_data->currentfile, CLOSE_NORMAL) != 0)
+ return false;
+ }
+
+ /* A tarfile always ends with two empty blocks */
+ MemSet(zerobuf, 0, sizeof(zerobuf));
+ if (tar_data->compression_algorithm == PG_COMPRESSION_NONE)
+ {
+ errno = 0;
+ if (write(tar_data->fd, zerobuf, sizeof(zerobuf)) != sizeof(zerobuf))
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ tar_data->lasterrno = errno ? errno : ENOSPC;
+ return false;
+ }
+ }
+#ifdef HAVE_LIBZ
+ else if (tar_data->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ if (!tar_write_compressed_data(zerobuf, sizeof(zerobuf), false))
+ return false;
+
+ /* Also flush all data to make sure the gzip stream is finished */
+ tar_data->zp->next_in = NULL;
+ tar_data->zp->avail_in = 0;
+ while (true)
+ {
+ int r;
+
+ r = deflate(tar_data->zp, Z_FINISH);
+
+ if (r == Z_STREAM_ERROR)
+ {
+ tar_set_error("could not compress data");
+ return false;
+ }
+ if (tar_data->zp->avail_out < ZLIB_OUT_SIZE)
+ {
+ size_t len = ZLIB_OUT_SIZE - tar_data->zp->avail_out;
+
+ errno = 0;
+ if (write(tar_data->fd, tar_data->zlibOut, len) != len)
+ {
+ /*
+ * If write didn't set errno, assume problem is no disk
+ * space.
+ */
+ tar_data->lasterrno = errno ? errno : ENOSPC;
+ return false;
+ }
+ }
+ if (r == Z_STREAM_END)
+ break;
+ }
+
+ if (deflateEnd(tar_data->zp) != Z_OK)
+ {
+ tar_set_error("could not close compression stream");
+ return false;
+ }
+ }
+#endif
+ else
+ {
+ /* not reachable */
+ Assert(false);
+ }
+
+ /* sync the empty blocks as well, since they're after the last file */
+ if (tar_data->sync)
+ {
+ if (fsync(tar_data->fd) != 0)
+ {
+ tar_data->lasterrno = errno;
+ return false;
+ }
+ }
+
+ if (close(tar_data->fd) != 0)
+ {
+ tar_data->lasterrno = errno;
+ return false;
+ }
+
+ tar_data->fd = -1;
+
+ if (tar_data->sync)
+ {
+ if (fsync_fname(tar_data->tarfilename, false) != 0 ||
+ fsync_parent_path(tar_data->tarfilename) != 0)
+ {
+ tar_data->lasterrno = errno;
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/*
+ * The argument compression_algorithm is currently ignored. It is in place for
+ * symmetry with CreateWalDirectoryMethod which uses it for distinguishing
+ * between the different compression methods. CreateWalTarMethod and its family
+ * of functions handle only zlib compression.
+ */
+WalWriteMethod *
+CreateWalTarMethod(const char *tarbase,
+ pg_compress_algorithm compression_algorithm,
+ int compression_level, bool sync)
+{
+ WalWriteMethod *method;
+ const char *suffix = (compression_algorithm == PG_COMPRESSION_GZIP) ?
+ ".tar.gz" : ".tar";
+
+ method = pg_malloc0(sizeof(WalWriteMethod));
+ method->open_for_write = tar_open_for_write;
+ method->write = tar_write;
+ method->get_current_pos = tar_get_current_pos;
+ method->get_file_size = tar_get_file_size;
+ method->get_file_name = tar_get_file_name;
+ method->compression_algorithm = tar_compression_algorithm;
+ method->close = tar_close;
+ method->sync = tar_sync;
+ method->existsfile = tar_existsfile;
+ method->finish = tar_finish;
+ method->getlasterror = tar_getlasterror;
+
+ tar_data = pg_malloc0(sizeof(TarMethodData));
+ tar_data->tarfilename = pg_malloc0(strlen(tarbase) + strlen(suffix) + 1);
+ sprintf(tar_data->tarfilename, "%s%s", tarbase, suffix);
+ tar_data->fd = -1;
+ tar_data->compression_algorithm = compression_algorithm;
+ tar_data->compression_level = compression_level;
+ tar_data->sync = sync;
+#ifdef HAVE_LIBZ
+ if (compression_algorithm == PG_COMPRESSION_GZIP)
+ tar_data->zlibOut = (char *) pg_malloc(ZLIB_OUT_SIZE + 1);
+#endif
+
+ return method;
+}
+
+void
+FreeWalTarMethod(void)
+{
+ pg_free(tar_data->tarfilename);
+#ifdef HAVE_LIBZ
+ if (tar_data->compression_algorithm == PG_COMPRESSION_GZIP)
+ pg_free(tar_data->zlibOut);
+#endif
+ pg_free(tar_data);
+ tar_data = NULL;
+}
diff --git a/src/bin/pg_basebackup/walmethods.h b/src/bin/pg_basebackup/walmethods.h
new file mode 100644
index 0000000..76530dc
--- /dev/null
+++ b/src/bin/pg_basebackup/walmethods.h
@@ -0,0 +1,107 @@
+/*-------------------------------------------------------------------------
+ *
+ * walmethods.h
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/walmethods.h
+ *-------------------------------------------------------------------------
+ */
+
+#include "common/compression.h"
+
+typedef void *Walfile;
+
+typedef enum
+{
+ CLOSE_NORMAL,
+ CLOSE_UNLINK,
+ CLOSE_NO_RENAME
+} WalCloseMethod;
+
+/*
+ * A WalWriteMethod structure represents the different methods used
+ * to write the streaming WAL as it's received.
+ *
+ * All methods that have a failure return indicator will set state
+ * allowing the getlasterror() method to return a suitable message.
+ * Commonly, errno is this state (or part of it); so callers must take
+ * care not to clobber errno between a failed method call and use of
+ * getlasterror() to retrieve the message.
+ */
+typedef struct WalWriteMethod WalWriteMethod;
+struct WalWriteMethod
+{
+ /*
+ * Open a target file. Returns Walfile, or NULL if open failed. If a temp
+ * suffix is specified, a file with that name will be opened, and then
+ * automatically renamed in close(). If pad_to_size is specified, the file
+ * will be padded with NUL up to that size, if supported by the Walmethod.
+ */
+ Walfile (*open_for_write) (const char *pathname, const char *temp_suffix, size_t pad_to_size);
+
+ /*
+ * Close an open Walfile, using one or more methods for handling automatic
+ * unlinking etc. Returns 0 on success, other values for error.
+ */
+ int (*close) (Walfile f, WalCloseMethod method);
+
+ /* Check if a file exist */
+ bool (*existsfile) (const char *pathname);
+
+ /* Return the size of a file, or -1 on failure. */
+ ssize_t (*get_file_size) (const char *pathname);
+
+ /*
+ * Return the name of the current file to work on in pg_malloc()'d string,
+ * without the base directory. This is useful for logging.
+ */
+ char *(*get_file_name) (const char *pathname, const char *temp_suffix);
+
+ /* Returns the compression method */
+ pg_compress_algorithm (*compression_algorithm) (void);
+
+ /*
+ * Write count number of bytes to the file, and return the number of bytes
+ * actually written or -1 for error.
+ */
+ ssize_t (*write) (Walfile f, const void *buf, size_t count);
+
+ /* Return the current position in a file or -1 on error */
+ off_t (*get_current_pos) (Walfile f);
+
+ /*
+ * fsync the contents of the specified file. Returns 0 on success.
+ */
+ int (*sync) (Walfile f);
+
+ /*
+ * Clean up the Walmethod, closing any shared resources. For methods like
+ * tar, this includes writing updated headers. Returns true if the
+ * close/write/sync of shared resources succeeded, otherwise returns false
+ * (but the resources are still closed).
+ */
+ bool (*finish) (void);
+
+ /* Return a text for the last error in this Walfile */
+ const char *(*getlasterror) (void);
+};
+
+/*
+ * Available WAL methods:
+ * - WalDirectoryMethod - write WAL to regular files in a standard pg_wal
+ * - WalTarMethod - write WAL to a tarfile corresponding to pg_wal
+ * (only implements the methods required for pg_basebackup,
+ * not all those required for pg_receivewal)
+ */
+WalWriteMethod *CreateWalDirectoryMethod(const char *basedir,
+ pg_compress_algorithm compression_algo,
+ int compression, bool sync);
+WalWriteMethod *CreateWalTarMethod(const char *tarbase,
+ pg_compress_algorithm compression_algo,
+ int compression, bool sync);
+
+/* Cleanup routines for previously-created methods */
+void FreeWalDirectoryMethod(void);
+void FreeWalTarMethod(void);
diff --git a/src/bin/pg_checksums/.gitignore b/src/bin/pg_checksums/.gitignore
new file mode 100644
index 0000000..7888625
--- /dev/null
+++ b/src/bin/pg_checksums/.gitignore
@@ -0,0 +1,3 @@
+/pg_checksums
+
+/tmp_check/
diff --git a/src/bin/pg_checksums/Makefile b/src/bin/pg_checksums/Makefile
new file mode 100644
index 0000000..77dc97a
--- /dev/null
+++ b/src/bin/pg_checksums/Makefile
@@ -0,0 +1,47 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_checksums
+#
+# Copyright (c) 1998-2022, PostgreSQL Global Development Group
+#
+# src/bin/pg_checksums/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_checksums - verify data checksums in an offline cluster"
+PGAPPICON=win32
+
+subdir = src/bin/pg_checksums
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+# We need libpq only because fe_utils does.
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+OBJS = \
+ $(WIN32RES) \
+ pg_checksums.o
+
+all: pg_checksums
+
+pg_checksums: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_checksums$(X) '$(DESTDIR)$(bindir)/pg_checksums$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_checksums$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_checksums$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_checksums/nls.mk b/src/bin/pg_checksums/nls.mk
new file mode 100644
index 0000000..a0d776c
--- /dev/null
+++ b/src/bin/pg_checksums/nls.mk
@@ -0,0 +1,8 @@
+# src/bin/pg_checksums/nls.mk
+CATALOG_NAME = pg_checksums
+AVAIL_LANGUAGES = de el es fr it ja ka ko pt_BR ru sv uk
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ pg_checksums.c \
+ ../../fe_utils/option_utils.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS)
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/pg_checksums/pg_checksums.c b/src/bin/pg_checksums/pg_checksums.c
new file mode 100644
index 0000000..21dfe1b
--- /dev/null
+++ b/src/bin/pg_checksums/pg_checksums.c
@@ -0,0 +1,655 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_checksums.c
+ * Checks, enables or disables page level checksums for an offline
+ * cluster
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_checksums/pg_checksums.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <dirent.h>
+#include <limits.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "access/xlog_internal.h"
+#include "common/controldata_utils.h"
+#include "common/file_perm.h"
+#include "common/file_utils.h"
+#include "common/logging.h"
+#include "fe_utils/option_utils.h"
+#include "getopt_long.h"
+#include "pg_getopt.h"
+#include "storage/bufpage.h"
+#include "storage/checksum.h"
+#include "storage/checksum_impl.h"
+
+
+static int64 files_scanned = 0;
+static int64 files_written = 0;
+static int64 blocks_scanned = 0;
+static int64 blocks_written = 0;
+static int64 badblocks = 0;
+static ControlFileData *ControlFile;
+
+static char *only_filenode = NULL;
+static bool do_sync = true;
+static bool verbose = false;
+static bool showprogress = false;
+
+typedef enum
+{
+ PG_MODE_CHECK,
+ PG_MODE_DISABLE,
+ PG_MODE_ENABLE
+} PgChecksumMode;
+
+/*
+ * Filename components.
+ *
+ * XXX: fd.h is not declared here as frontend side code is not able to
+ * interact with the backend-side definitions for the various fsync
+ * wrappers.
+ */
+#define PG_TEMP_FILES_DIR "pgsql_tmp"
+#define PG_TEMP_FILE_PREFIX "pgsql_tmp"
+
+static PgChecksumMode mode = PG_MODE_CHECK;
+
+static const char *progname;
+
+/*
+ * Progress status information.
+ */
+int64 total_size = 0;
+int64 current_size = 0;
+static pg_time_t last_progress_report = 0;
+
+static void
+usage(void)
+{
+ printf(_("%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DATADIR]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" [-D, --pgdata=]DATADIR data directory\n"));
+ printf(_(" -c, --check check data checksums (default)\n"));
+ printf(_(" -d, --disable disable data checksums\n"));
+ printf(_(" -e, --enable enable data checksums\n"));
+ printf(_(" -f, --filenode=FILENODE check only relation with specified filenode\n"));
+ printf(_(" -N, --no-sync do not wait for changes to be written safely to disk\n"));
+ printf(_(" -P, --progress show progress information\n"));
+ printf(_(" -v, --verbose output verbose messages\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nIf no data directory (DATADIR) is specified, "
+ "the environment variable PGDATA\nis used.\n\n"));
+ printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+/*
+ * Definition of one element part of an exclusion list, used for files
+ * to exclude from checksum validation. "name" is the name of the file
+ * or path to check for exclusion. If "match_prefix" is true, any items
+ * matching the name as prefix are excluded.
+ */
+struct exclude_list_item
+{
+ const char *name;
+ bool match_prefix;
+};
+
+/*
+ * List of files excluded from checksum validation.
+ *
+ * Note: this list should be kept in sync with what basebackup.c includes.
+ */
+static const struct exclude_list_item skip[] = {
+ {"pg_control", false},
+ {"pg_filenode.map", false},
+ {"pg_internal.init", true},
+ {"PG_VERSION", false},
+#ifdef EXEC_BACKEND
+ {"config_exec_params", true},
+#endif
+ {NULL, false}
+};
+
+/*
+ * Report current progress status. Parts borrowed from
+ * src/bin/pg_basebackup/pg_basebackup.c.
+ */
+static void
+progress_report(bool finished)
+{
+ int percent;
+ pg_time_t now;
+
+ Assert(showprogress);
+
+ now = time(NULL);
+ if (now == last_progress_report && !finished)
+ return; /* Max once per second */
+
+ /* Save current time */
+ last_progress_report = now;
+
+ /* Adjust total size if current_size is larger */
+ if (current_size > total_size)
+ total_size = current_size;
+
+ /* Calculate current percentage of size done */
+ percent = total_size ? (int) ((current_size) * 100 / total_size) : 0;
+
+ fprintf(stderr, _("%lld/%lld MB (%d%%) computed"),
+ (long long) (current_size / (1024 * 1024)),
+ (long long) (total_size / (1024 * 1024)),
+ percent);
+
+ /*
+ * Stay on the same line if reporting to a terminal and we're not done
+ * yet.
+ */
+ fputc((!finished && isatty(fileno(stderr))) ? '\r' : '\n', stderr);
+}
+
+static bool
+skipfile(const char *fn)
+{
+ int excludeIdx;
+
+ for (excludeIdx = 0; skip[excludeIdx].name != NULL; excludeIdx++)
+ {
+ int cmplen = strlen(skip[excludeIdx].name);
+
+ if (!skip[excludeIdx].match_prefix)
+ cmplen++;
+ if (strncmp(skip[excludeIdx].name, fn, cmplen) == 0)
+ return true;
+ }
+
+ return false;
+}
+
+static void
+scan_file(const char *fn, int segmentno)
+{
+ PGAlignedBlock buf;
+ PageHeader header = (PageHeader) buf.data;
+ int f;
+ BlockNumber blockno;
+ int flags;
+ int64 blocks_written_in_file = 0;
+
+ Assert(mode == PG_MODE_ENABLE ||
+ mode == PG_MODE_CHECK);
+
+ flags = (mode == PG_MODE_ENABLE) ? O_RDWR : O_RDONLY;
+ f = open(fn, PG_BINARY | flags, 0);
+
+ if (f < 0)
+ pg_fatal("could not open file \"%s\": %m", fn);
+
+ files_scanned++;
+
+ for (blockno = 0;; blockno++)
+ {
+ uint16 csum;
+ int r = read(f, buf.data, BLCKSZ);
+
+ if (r == 0)
+ break;
+ if (r != BLCKSZ)
+ {
+ if (r < 0)
+ pg_fatal("could not read block %u in file \"%s\": %m",
+ blockno, fn);
+ else
+ pg_fatal("could not read block %u in file \"%s\": read %d of %d",
+ blockno, fn, r, BLCKSZ);
+ }
+ blocks_scanned++;
+
+ /*
+ * Since the file size is counted as total_size for progress status
+ * information, the sizes of all pages including new ones in the file
+ * should be counted as current_size. Otherwise the progress reporting
+ * calculated using those counters may not reach 100%.
+ */
+ current_size += r;
+
+ /* New pages have no checksum yet */
+ if (PageIsNew(header))
+ continue;
+
+ csum = pg_checksum_page(buf.data, blockno + segmentno * RELSEG_SIZE);
+ if (mode == PG_MODE_CHECK)
+ {
+ if (csum != header->pd_checksum)
+ {
+ if (ControlFile->data_checksum_version == PG_DATA_CHECKSUM_VERSION)
+ pg_log_error("checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X",
+ fn, blockno, csum, header->pd_checksum);
+ badblocks++;
+ }
+ }
+ else if (mode == PG_MODE_ENABLE)
+ {
+ int w;
+
+ /*
+ * Do not rewrite if the checksum is already set to the expected
+ * value.
+ */
+ if (header->pd_checksum == csum)
+ continue;
+
+ blocks_written_in_file++;
+
+ /* Set checksum in page header */
+ header->pd_checksum = csum;
+
+ /* Seek back to beginning of block */
+ if (lseek(f, -BLCKSZ, SEEK_CUR) < 0)
+ pg_fatal("seek failed for block %u in file \"%s\": %m", blockno, fn);
+
+ /* Write block with checksum */
+ w = write(f, buf.data, BLCKSZ);
+ if (w != BLCKSZ)
+ {
+ if (w < 0)
+ pg_fatal("could not write block %u in file \"%s\": %m",
+ blockno, fn);
+ else
+ pg_fatal("could not write block %u in file \"%s\": wrote %d of %d",
+ blockno, fn, w, BLCKSZ);
+ }
+ }
+
+ if (showprogress)
+ progress_report(false);
+ }
+
+ if (verbose)
+ {
+ if (mode == PG_MODE_CHECK)
+ pg_log_info("checksums verified in file \"%s\"", fn);
+ if (mode == PG_MODE_ENABLE)
+ pg_log_info("checksums enabled in file \"%s\"", fn);
+ }
+
+ /* Update write counters if any write activity has happened */
+ if (blocks_written_in_file > 0)
+ {
+ files_written++;
+ blocks_written += blocks_written_in_file;
+ }
+
+ close(f);
+}
+
+/*
+ * Scan the given directory for items which can be checksummed and
+ * operate on each one of them. If "sizeonly" is true, the size of
+ * all the items which have checksums is computed and returned back
+ * to the caller without operating on the files. This is used to compile
+ * the total size of the data directory for progress reports.
+ */
+static int64
+scan_directory(const char *basedir, const char *subdir, bool sizeonly)
+{
+ int64 dirsize = 0;
+ char path[MAXPGPATH];
+ DIR *dir;
+ struct dirent *de;
+
+ snprintf(path, sizeof(path), "%s/%s", basedir, subdir);
+ dir = opendir(path);
+ if (!dir)
+ pg_fatal("could not open directory \"%s\": %m", path);
+ while ((de = readdir(dir)) != NULL)
+ {
+ char fn[MAXPGPATH];
+ struct stat st;
+
+ if (strcmp(de->d_name, ".") == 0 ||
+ strcmp(de->d_name, "..") == 0)
+ continue;
+
+ /* Skip temporary files */
+ if (strncmp(de->d_name,
+ PG_TEMP_FILE_PREFIX,
+ strlen(PG_TEMP_FILE_PREFIX)) == 0)
+ continue;
+
+ /* Skip temporary folders */
+ if (strncmp(de->d_name,
+ PG_TEMP_FILES_DIR,
+ strlen(PG_TEMP_FILES_DIR)) == 0)
+ continue;
+
+ snprintf(fn, sizeof(fn), "%s/%s", path, de->d_name);
+ if (lstat(fn, &st) < 0)
+ pg_fatal("could not stat file \"%s\": %m", fn);
+ if (S_ISREG(st.st_mode))
+ {
+ char fnonly[MAXPGPATH];
+ char *forkpath,
+ *segmentpath;
+ int segmentno = 0;
+
+ if (skipfile(de->d_name))
+ continue;
+
+ /*
+ * Cut off at the segment boundary (".") to get the segment number
+ * in order to mix it into the checksum. Then also cut off at the
+ * fork boundary, to get the filenode the file belongs to for
+ * filtering.
+ */
+ strlcpy(fnonly, de->d_name, sizeof(fnonly));
+ segmentpath = strchr(fnonly, '.');
+ if (segmentpath != NULL)
+ {
+ *segmentpath++ = '\0';
+ segmentno = atoi(segmentpath);
+ if (segmentno == 0)
+ pg_fatal("invalid segment number %d in file name \"%s\"",
+ segmentno, fn);
+ }
+
+ forkpath = strchr(fnonly, '_');
+ if (forkpath != NULL)
+ *forkpath++ = '\0';
+
+ if (only_filenode && strcmp(only_filenode, fnonly) != 0)
+ /* filenode not to be included */
+ continue;
+
+ dirsize += st.st_size;
+
+ /*
+ * No need to work on the file when calculating only the size of
+ * the items in the data folder.
+ */
+ if (!sizeonly)
+ scan_file(fn, segmentno);
+ }
+#ifndef WIN32
+ else if (S_ISDIR(st.st_mode) || S_ISLNK(st.st_mode))
+#else
+ else if (S_ISDIR(st.st_mode) || pgwin32_is_junction(fn))
+#endif
+ {
+ /*
+ * If going through the entries of pg_tblspc, we assume to operate
+ * on tablespace locations where only TABLESPACE_VERSION_DIRECTORY
+ * is valid, resolving the linked locations and dive into them
+ * directly.
+ */
+ if (strncmp("pg_tblspc", subdir, strlen("pg_tblspc")) == 0)
+ {
+ char tblspc_path[MAXPGPATH];
+ struct stat tblspc_st;
+
+ /*
+ * Resolve tablespace location path and check whether
+ * TABLESPACE_VERSION_DIRECTORY exists. Not finding a valid
+ * location is unexpected, since there should be no orphaned
+ * links and no links pointing to something else than a
+ * directory.
+ */
+ snprintf(tblspc_path, sizeof(tblspc_path), "%s/%s/%s",
+ path, de->d_name, TABLESPACE_VERSION_DIRECTORY);
+
+ if (lstat(tblspc_path, &tblspc_st) < 0)
+ pg_fatal("could not stat file \"%s\": %m",
+ tblspc_path);
+
+ /*
+ * Move backwards once as the scan needs to happen for the
+ * contents of TABLESPACE_VERSION_DIRECTORY.
+ */
+ snprintf(tblspc_path, sizeof(tblspc_path), "%s/%s",
+ path, de->d_name);
+
+ /* Looks like a valid tablespace location */
+ dirsize += scan_directory(tblspc_path,
+ TABLESPACE_VERSION_DIRECTORY,
+ sizeonly);
+ }
+ else
+ {
+ dirsize += scan_directory(path, de->d_name, sizeonly);
+ }
+ }
+ }
+ closedir(dir);
+ return dirsize;
+}
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"check", no_argument, NULL, 'c'},
+ {"pgdata", required_argument, NULL, 'D'},
+ {"disable", no_argument, NULL, 'd'},
+ {"enable", no_argument, NULL, 'e'},
+ {"filenode", required_argument, NULL, 'f'},
+ {"no-sync", no_argument, NULL, 'N'},
+ {"progress", no_argument, NULL, 'P'},
+ {"verbose", no_argument, NULL, 'v'},
+ {NULL, 0, NULL, 0}
+ };
+
+ char *DataDir = NULL;
+ int c;
+ int option_index;
+ bool crc_ok;
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_checksums"));
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_checksums (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((c = getopt_long(argc, argv, "cD:deNPf:v", long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+ case 'c':
+ mode = PG_MODE_CHECK;
+ break;
+ case 'd':
+ mode = PG_MODE_DISABLE;
+ break;
+ case 'e':
+ mode = PG_MODE_ENABLE;
+ break;
+ case 'f':
+ if (!option_parse_int(optarg, "-f/--filenode", 0,
+ INT_MAX,
+ NULL))
+ exit(1);
+ only_filenode = pstrdup(optarg);
+ break;
+ case 'N':
+ do_sync = false;
+ break;
+ case 'v':
+ verbose = true;
+ break;
+ case 'D':
+ DataDir = optarg;
+ break;
+ case 'P':
+ showprogress = true;
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ if (DataDir == NULL)
+ {
+ if (optind < argc)
+ DataDir = argv[optind++];
+ else
+ DataDir = getenv("PGDATA");
+
+ /* If no DataDir was specified, and none could be found, error out */
+ if (DataDir == NULL)
+ {
+ pg_log_error("no data directory specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /* Complain if any arguments remain */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* filenode checking only works in --check mode */
+ if (mode != PG_MODE_CHECK && only_filenode)
+ {
+ pg_log_error("option -f/--filenode can only be used with --check");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* Read the control file and check compatibility */
+ ControlFile = get_controlfile(DataDir, &crc_ok);
+ if (!crc_ok)
+ pg_fatal("pg_control CRC value is incorrect");
+
+ if (ControlFile->pg_control_version != PG_CONTROL_VERSION)
+ pg_fatal("cluster is not compatible with this version of pg_checksums");
+
+ if (ControlFile->blcksz != BLCKSZ)
+ {
+ pg_log_error("database cluster is not compatible");
+ pg_log_error_detail("The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u.",
+ ControlFile->blcksz, BLCKSZ);
+ exit(1);
+ }
+
+ /*
+ * Check if cluster is running. A clean shutdown is required to avoid
+ * random checksum failures caused by torn pages. Note that this doesn't
+ * guard against someone starting the cluster concurrently.
+ */
+ if (ControlFile->state != DB_SHUTDOWNED &&
+ ControlFile->state != DB_SHUTDOWNED_IN_RECOVERY)
+ pg_fatal("cluster must be shut down");
+
+ if (ControlFile->data_checksum_version == 0 &&
+ mode == PG_MODE_CHECK)
+ pg_fatal("data checksums are not enabled in cluster");
+
+ if (ControlFile->data_checksum_version == 0 &&
+ mode == PG_MODE_DISABLE)
+ pg_fatal("data checksums are already disabled in cluster");
+
+ if (ControlFile->data_checksum_version > 0 &&
+ mode == PG_MODE_ENABLE)
+ pg_fatal("data checksums are already enabled in cluster");
+
+ /* Operate on all files if checking or enabling checksums */
+ if (mode == PG_MODE_CHECK || mode == PG_MODE_ENABLE)
+ {
+ /*
+ * If progress status information is requested, we need to scan the
+ * directory tree twice: once to know how much total data needs to be
+ * processed and once to do the real work.
+ */
+ if (showprogress)
+ {
+ total_size = scan_directory(DataDir, "global", true);
+ total_size += scan_directory(DataDir, "base", true);
+ total_size += scan_directory(DataDir, "pg_tblspc", true);
+ }
+
+ (void) scan_directory(DataDir, "global", false);
+ (void) scan_directory(DataDir, "base", false);
+ (void) scan_directory(DataDir, "pg_tblspc", false);
+
+ if (showprogress)
+ progress_report(true);
+
+ printf(_("Checksum operation completed\n"));
+ printf(_("Files scanned: %lld\n"), (long long) files_scanned);
+ printf(_("Blocks scanned: %lld\n"), (long long) blocks_scanned);
+ if (mode == PG_MODE_CHECK)
+ {
+ printf(_("Bad checksums: %lld\n"), (long long) badblocks);
+ printf(_("Data checksum version: %u\n"), ControlFile->data_checksum_version);
+
+ if (badblocks > 0)
+ exit(1);
+ }
+ else if (mode == PG_MODE_ENABLE)
+ {
+ printf(_("Files written: %lld\n"), (long long) files_written);
+ printf(_("Blocks written: %lld\n"), (long long) blocks_written);
+ }
+ }
+
+ /*
+ * Finally make the data durable on disk if enabling or disabling
+ * checksums. Flush first the data directory for safety, and then update
+ * the control file to keep the switch consistent.
+ */
+ if (mode == PG_MODE_ENABLE || mode == PG_MODE_DISABLE)
+ {
+ ControlFile->data_checksum_version =
+ (mode == PG_MODE_ENABLE) ? PG_DATA_CHECKSUM_VERSION : 0;
+
+ if (do_sync)
+ {
+ pg_log_info("syncing data directory");
+ fsync_pgdata(DataDir, PG_VERSION_NUM);
+ }
+
+ pg_log_info("updating control file");
+ update_controlfile(DataDir, ControlFile, do_sync);
+
+ if (verbose)
+ printf(_("Data checksum version: %u\n"), ControlFile->data_checksum_version);
+ if (mode == PG_MODE_ENABLE)
+ printf(_("Checksums enabled in cluster\n"));
+ else
+ printf(_("Checksums disabled in cluster\n"));
+ }
+
+ return 0;
+}
diff --git a/src/bin/pg_checksums/po/de.po b/src/bin/pg_checksums/po/de.po
new file mode 100644
index 0000000..460b5b5
--- /dev/null
+++ b/src/bin/pg_checksums/po/de.po
@@ -0,0 +1,330 @@
+# German message translation file for pg_checksums
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Peter Eisentraut <peter@eisentraut.org>, 2018 - 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-11 15:51+0000\n"
+"PO-Revision-Date: 2022-05-11 22:16+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ungültiger Wert »%s« für Option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s muss im Bereich %d..%d sein"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s überprüft die Datenprüfsummen in einem PostgreSQL-Datenbankcluster oder schaltet sie ein oder aus.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATENVERZEICHNIS]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Optionen:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]VERZ Datenbankverzeichnis\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check Datenprüfsummen prüfen (Voreinstellung)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable Datenprüfsummen ausschalten\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable Datenprüfsummen einschalten\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE nur Relation mit angegebenem Filenode prüfen\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n"
+" geschrieben sind\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress Fortschrittsinformationen zeigen\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose »Verbose«-Modus\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Wenn kein Datenverzeichnis angegeben ist, wird die Umgebungsvariable\n"
+"PGDATA verwendet.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Berichten Sie Fehler an <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) berechnet"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "konnte Block %u in Datei »%s« nicht lesen: %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "konnte Block %u in Datei »%s« nicht lesen: %d von %d gelesen"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "Prüfsummenprüfung fehlgeschlagen in Datei »%s«, Block %u: berechnete Prüfsumme ist %X, aber der Block enthält %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "seek fehlgeschlagen für Block %u in Datei »%s«: %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "konnte Block %u in Datei »%s« nicht schreiben: %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "konnte Block %u in Datei »%s« nicht schreiben: %d von %d geschrieben"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "Prüfsummen wurden überprüft in Datei »%s«"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "Prüfsummen wurden eingeschaltet in Datei »%s«"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht öffnen: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "ungültige Segmentnummer %d in Dateiname »%s«"
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "kein Datenverzeichnis angegeben"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "Option -f/--filenode kann nur mit --check verwendet werden"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "CRC-Wert in pg_control ist falsch"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "die Cluster sind nicht mit dieser Version von pg_checksums kompatibel"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "Datenbank-Cluster ist nicht kompatibel"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "Der Datenbank-Cluster wurde mit Blockgröße %u initialisiert, aber pg_checksums wurde mit Blockgröße %u kompiliert."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "Cluster muss heruntergefahren sein"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "Datenprüfsummen sind im Cluster nicht eingeschaltet"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "Datenprüfsummen sind im Cluster bereits ausgeschaltet"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "Datenprüfsummen sind im Cluster bereits eingeschaltet"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Prüfsummenoperation abgeschlossen\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Überprüfte Dateien: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Überprüfte Blöcke: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Falsche Prüfsummen: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Datenprüfsummenversion: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Geschriebene Dateien: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Geschriebene Blöcke: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "synchronisiere Datenverzeichnis"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "aktualisiere Kontrolldatei"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Prüfsummen wurden im Cluster eingeschaltet\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Prüfsummen wurden im Cluster ausgeschaltet\n"
diff --git a/src/bin/pg_checksums/po/el.po b/src/bin/pg_checksums/po/el.po
new file mode 100644
index 0000000..86395be
--- /dev/null
+++ b/src/bin/pg_checksums/po/el.po
@@ -0,0 +1,337 @@
+# Greek message translation file for pg_checksums
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-14 09:21+0000\n"
+"PO-Revision-Date: 2023-04-14 13:01+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "προειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέρεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "μη έγκυρη τιμή «%s» για την επιλογή %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s πρέπει να βρίσκεται εντός εύρους %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s ενεργοποιεί, απενεργοποιεί ή επαληθεύει τα αθροίσματα ελέγχου δεδομένων σε μία συστάδα βάσεων δεδομένων PostgreSQL.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Χρήση:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Επιλογές:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR κατάλογος δεδομένων\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check έλεγξε αθροίσματα ελέγχου δεδομένων (προεπιλογή)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable απενεργοποίησε τα αθροίσματα ελέγχου δεδομένων\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable ενεργοποίησε τα αθροίσματα ελέγχου δεδομένων\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE έλεγξε μόνο τη σχέση με το καθορισμένο filenode\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync να μην αναμένει την ασφαλή εγγραφή αλλαγών στον δίσκο\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress εμφάνισε πληροφορίες προόδου\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose περιφραστικά μηνύματα εξόδου\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Εάν δεν έχει καθοριστεί κατάλογος δεδομένων (DATADIR), χρησιμοποιείται η\n"
+"μεταβλητή περιβάλλοντος PGDATA.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Υποβάλετε αναφορές σφάλματων σε <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αρχική σελίδα: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld ΜΒ (%d%%) υπολογισμένο"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του μπλοκ %u στο αρχείο «%s»: %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "δεν ήταν δυνατή η ανάγνωση του μπλοκ %u στο αρχείο «%s»: ανάγνωσε %d από %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "επαλήθευση του αθροίσματος ελέγχου απέτυχε στο αρχείο «%s», μπλοκ %u: υπολογισμένο άθροισμα ελέγχου %X αλλά το μπλοκ περιέχει %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "αναζήτηση απέτυχε για μπλοκ %u στο αρχείο «%s»: %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγραφή μπλοκ %u στο αρχείο «%s»: %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "δεν ήταν δυνατή η εγγραφή μπλοκ %u στο αρχείο «%s»: έγραψε %d από %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "επαληθευμένα αθροίσματα ελέγχου στο αρχείο «%s»"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "ενεργοποιημένα αθροίσματα ελέγχου στο αρχείο «%s»"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο «%s»: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "μη έγκυρος αριθμός τμήματος %d στο αρχείο με όνομα «%s»"
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "δεν ορίστηκε κατάλογος δεδομένων"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "η επιλογή -f/--filenode μπορεί να χρησιμοποιηθεί μόνο μαζί με την --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "η τιμή pg_control CRC είναι λανθασμένη"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "η συστάδα δεν είναι συμβατή με αυτήν την έκδοση pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "η συστάδα βάσεων δεδομένων δεν είναι συμβατή"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "Η συστάδα βάσεων δεδομένων αρχικοποιήθηκε με μέγεθος μπλοκ %u, αλλά το pg_checksums συντάχθηκε με μέγεθος μπλοκ %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "η συστάδα πρέπει να τερματιστεί"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "τα αθροίσματα ελέγχου δεδομένων δεν είναι ενεργοποιημένα στη συστάδα"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "τα αθροίσματα ελέγχου δεδομένων είναι ήδη απενεργοποιημένα στη συστάδα"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "τα αθροίσματα ελέγχου δεδομένων είναι ήδη ενεργοποιημένα στη συστάδα"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Ολοκληρώθηκε η λειτουργία του αθροίσματος ελέγχου\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Σαρωμένα αρχεία: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Σαρωμένα μπλοκ: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Εσφαλμένα αθροίσματα ελέγχου: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Έκδοση αθροισμάτων ελέγχου: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Γραμμένα αρχεία: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Γραμμένα μπλοκ: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "συγχρονίζεται κατάλογος δεδομένων"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "ενημερώνεται αρχείο ελέγχου"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Ενεργοποίηση των αθροισμάτων ελέγχου στη συστάδα\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Τα αθροίσματα ελέγχου δεδομένων είναι απενεργοποιημένα στη συστάδα\n"
+
+#~ msgid "fatal: "
+#~ msgstr "κρίσιμο: "
+
+#~ msgid "invalid filenode specification, must be numeric: %s"
+#~ msgstr "μη έγκυρη προδιαγραφή filenode, πρέπει να είναι αριθμητική: %s"
diff --git a/src/bin/pg_checksums/po/es.po b/src/bin/pg_checksums/po/es.po
new file mode 100644
index 0000000..3e390e5
--- /dev/null
+++ b/src/bin/pg_checksums/po/es.po
@@ -0,0 +1,332 @@
+# Spanish message translation file for pg_checksums
+#
+# Copyright (c) 2019-2021, PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# Álvaro Herrera <alvherre@alvh.no-ip.org>, 2019.
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:51+0000\n"
+"PO-Revision-Date: 2022-10-20 09:06+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: pgsql-es-ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "el valor «%s» no es válido para la opción %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s debe estar en el rango %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s activa, desactiva o verifica checksums de datos en un clúster PostgreSQL.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPCIÓN]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opciones:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR directorio de datos\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check verificar checksums (por omisión)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable desactivar checksums\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable activar checksums\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE verificar sólo la relación con el filenode dado\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostrar información de progreso\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose desplegar mensajes verbosos\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si no se especifica un directorio de datos (DATADIR), se utilizará\n"
+"la variable de entorno PGDATA.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Reportar errores a <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) calculado"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "no se pudo leer el bloque %u del archivo «%s»: %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "no se pudo leer bloque %u en archivo «%s»: leídos %d de %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "verificación de checksums falló en archivo «%s», bloque %u: checksum calculado %X pero bloque contiene %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "posicionamiento (seek) falló para el bloque %u en archivo «%s»: %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "no se pudo escribir el bloque %u en el archivo «%s»: %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "no se pudo escribir el bloque %u en el archivo «%s»: se escribieron %d de %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "checksums verificados en archivo «%s»"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "checksums activados en archivo «%s»"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "no se pudo hacer stat al archivo «%s»: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "número de segmento %d no válido en nombre de archivo «%s»"
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "no se especificó el directorio de datos"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "la opción -f/--filenode sólo puede usarse con --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "el valor de CRC de pg_control es incorrecto"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "el clúster no es compatible con esta versión de pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "el clúster de bases de datos no es compatible"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "El clúster fue inicializado con tamaño de bloque %u, pero pg_checksums fue compilado con tamaño de bloques %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "el clúster debe estar apagado"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "los checksums de datos no están activados en el clúster"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "los checksums de datos ya están desactivados en el clúster"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "los checksums de datos ya están activados en el clúster"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Operación de checksums completa\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Archivos recorridos: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Bloques recorridos: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Checksums incorrectos: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Versión de checksums de datos: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Archivos escritos: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Bloques escritos: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "sincronizando directorio de datos"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "actualizando archivo de control"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Checksums activos en el clúster\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Checksums inactivos en el clúster\n"
diff --git a/src/bin/pg_checksums/po/fr.po b/src/bin/pg_checksums/po/fr.po
new file mode 100644
index 0000000..dcdb4c7
--- /dev/null
+++ b/src/bin/pg_checksums/po/fr.po
@@ -0,0 +1,374 @@
+# LANGUAGE message translation file for pg_verify_checksums
+# Copyright (C) 2018-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verify_checksums (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2018-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-14 10:21+0000\n"
+"PO-Revision-Date: 2022-05-14 17:15+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valeur « %s » invalide pour l'option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s doit être compris entre %d et %d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s active, désactive ou vérifie les sommes de contrôle de données dans\n"
+"une instance PostgreSQL.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [RÉP_DONNÉES]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options :\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]REP_DONNEES répertoire des données\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check vérifie les sommes de contrôle (par défaut)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable désactive les sommes de contrôle\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable active les sommes de contrôle\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr ""
+" -f, --filenode=FILENODE vérifie seulement la relation dont l'identifiant\n"
+" relfilenode est indiqué\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync n'attend pas que les modifications soient\n"
+" proprement écrites sur disque\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress affiche la progression de l'opération\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose affiche des messages verbeux\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si aucun répertoire (RÉP_DONNÉES) n'est indiqué, la variable d'environnement\n"
+"PGDATA est utilisée.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapporter les bogues à <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld Mo (%d%%) traités"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "n'a pas pu lire le bloc %u dans le fichier « %s » : %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "n'a pas pu lire le bloc %u dans le fichier « %s » : %d lus sur %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "échec de la vérification de la somme de contrôle dans le fichier « %s », bloc %u : somme de contrôle calculée %X, alors que le bloc contient %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "n'a pas pu rechercher le bloc %u dans le fichier « %s » : %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "n'a pas pu écrire le bloc %u dans le fichier « %s » : %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "n'a pas pu écrire le bloc %u du fichier « %s » : a écrit %d octets sur %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "sommes de contrôle vérifiées dans le fichier « %s »"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "sommes de contrôle activées dans le fichier « %s »"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "n'a pas pu ouvrir le répertoire « %s » : %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "n'a pas pu tester le fichier « %s » : %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "numéro de segment %d invalide dans le nom de fichier « %s »"
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "aucun répertoire de données indiqué"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "l'option « -f/--filenode » peut seulement être utilisée avec --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "la valeur CRC de pg_control n'est pas correcte"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "l'instance n'est pas compatible avec cette version de pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "l'instance n'est pas compatible"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "L'instance a été initialisée avec une taille de bloc à %u alors que pg_checksums a été compilé avec une taille de bloc à %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "l'instance doit être arrêtée"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "les sommes de contrôle sur les données ne sont pas activées sur cette instance"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "les sommes de contrôle sur les données sont déjà désactivées sur cette instance"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "les sommes de contrôle sur les données sont déjà activées sur cette instance"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Opération sur les sommes de contrôle terminée\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Fichiers parcourus : %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Blocs parcourus : %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Mauvaises sommes de contrôle : %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Version des sommes de contrôle sur les données : %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Fichiers écrits : %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Blocs écrits : %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "synchronisation du répertoire des données"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "mise à jour du fichier de contrôle"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Sommes de contrôle sur les données activées sur cette instance\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Sommes de contrôle sur les données désactivées sur cette instance\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version affiche la version puis quitte\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not stat file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n"
+
+#~ msgid "%s: no data directory specified\n"
+#~ msgstr "%s : aucun répertoire de données indiqué\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#, c-format
+#~ msgid "invalid filenode specification, must be numeric: %s"
+#~ msgstr "spécification invalide du relfilnode, doit être numérique : %s"
diff --git a/src/bin/pg_checksums/po/it.po b/src/bin/pg_checksums/po/it.po
new file mode 100644
index 0000000..9e37af3
--- /dev/null
+++ b/src/bin/pg_checksums/po/it.po
@@ -0,0 +1,327 @@
+# LANGUAGE message translation file for pg_checksums
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:21+0000\n"
+"PO-Revision-Date: 2022-09-29 20:10+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valore \"%s\" non valido per l'opzione %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s deve essere compreso nell'intervallo %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr "%s abilita, disabilita o verifica i checksum dei dati in un cluster di database PostgreSQL.\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPZIONE]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opzioni:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR directory dei dati\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check controlla i checksum dei dati (predefinito)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable disabilita i checksum dei dati\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable abilita i checksum dei dati\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE controlla solo la relazione con il filenode specificato\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync non attende che le modifiche vengano scritte in modo sicuro sul disco\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostra le informazioni sullo stato di avanzamento\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose genera messaggi dettagliati\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Se non viene specificata un directory per i dati (DATADIR) verrà usata la\n"
+"variabile d'ambiente PGDATA.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Segnala i bug a <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) calcolati"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "apertura del file \"%s\" fallita: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "lettura del blocco %u nel file \"%s\" fallita: %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "impossibile leggere il blocco %u nel file \"%s\": leggere %d di %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "verifica del checksum non riuscita nel file \"%s\", blocco %u: checksum calcolato %X ma il blocco contiene %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "ricerca non riuscita per il blocco %u nel file \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "scrittura del blocco %u nel file \"%s\" fallita: %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "impossibile scrivere il blocco %u nel file \"%s\": ha scritto %d di %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "checksum verificati nel file \"%s\""
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "checksum abilitati nel file \"%s\""
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "apertura della directory \"%s\" fallita: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file \"%s\": %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "numero segmento non valido %d nel nome file \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "nessuna directory di dati specificata"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "l'opzione -f/--filenode può essere utilizzata solo con --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_control Il valore CRC non è corretto"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "cluster non è compatibile con questa versione di pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "il cluster di database non è compatibile"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "Il cluster di database è stato inizializzato con la dimensione del blocco %u, ma pg_checksums è stato compilato con la dimensione del blocco %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "il cluster deve essere spento"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "i checksum dei dati non sono abilitati nel cluster"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "i checksum dei dati sono già disabilitati nel cluster"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "i checksum dei dati sono già abilitati nel cluster"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Operazione di checksum completata\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "File scansionati: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Blocchi scansionati: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Checksum errati: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Versione checksum dati: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "File scritti: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Blocchi scritti: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "sincronizzazione della directory dei dati"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "aggiornamento del file di controllo"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Checksum abilitati nel cluster\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Checksum disabilitati nel cluster\n"
diff --git a/src/bin/pg_checksums/po/ja.po b/src/bin/pg_checksums/po/ja.po
new file mode 100644
index 0000000..aacabde
--- /dev/null
+++ b/src/bin/pg_checksums/po/ja.po
@@ -0,0 +1,339 @@
+# Japanese message translation file for pg_checksums
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-09 12:00+0900\n"
+"PO-Revision-Date: 2022-05-10 13:45+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "オプション%sの不正な値\"%s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%sは%d..%dの範囲でなければなりません"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%sはPostgreSQLデータベースクラスタにおけるデータチェックサムの有効化、無効化および検証を行います。\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"オプション:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR データディレクトリ\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check データチェックサムを検証(デフォルト)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable データチェックサムを無効化\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable データチェックサムを有効化\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE 指定したファイルノードのリレーションのみ検証\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync ディスクへの安全な書き込みを待機しない\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 進行状況を表示\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose 冗長メッセージを出力\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"データディレクトリ(DATADIR)が指定されない場合、PGDATA環境変数が使用されます。\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "バグは<%s>に報告してください。\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) 完了"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンできませんでした: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "ファイル\"%2$s\"で%1$uブロックを読み取れませんでした: %3$m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr " ファイル\"%2$s\"のブロック%1$uが読み込めませんでした: %4$d中%3$d読み込み済み"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "ファイル\"%s\" ブロック%uでチェックサム検証が失敗: 算出したチェックサムは%X 、しかしブロック上の値は%X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "ファイル\"%2$s\" ブロック%1$uへのシーク失敗: %3$m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "ファイル\"%2$s\"で%1$uブロックが書き出せませんでした: %3$m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "ファイル\"%2$s\"のブロック%1$uの書き込みに失敗しました: %4$dバイト中%3$dバイトのみ書き込みました"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "ファイル\"%s\"のチェックサムは検証されました"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "ファイル\"%s\"のチェックサムは有効化されました"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ファイル\"%s\"のstatに失敗しました: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "ファイル名\"%2$s\"の不正なセグメント番号%1$d"
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細については\"%s --help\"を実行してください。"
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "データディレクトリが指定されていません"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数が多すぎます (最初は\"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "オプション-f/--filenodeは--checkを指定したときのみ指定可能"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_controlのCRC値が正しくありません"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "クラスタはこのバージョンのpg_checksumsと互換性がありません"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "データベースクラスタが非互換です"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "データベースクラスタはブロックサイズ%uで初期化されています、しかしpg_checksumsはブロックサイズ%uでコンパイルされています。"
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "クラスタはシャットダウンされていなければなりません"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "クラスタのデータチェックサムは有効になっていません"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "クラスタのデータチェックサムはすでに無効になっています"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "クラスタのデータチェックサムはすでに有効になっています"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "チェックサム操作が完了しました\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "スキャンしたファイル数: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "スキャンしたブロック数: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "不正なチェックサム数: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "データチェックサムバージョン: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "スキャンしたファイル数: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "スキャンしたブロック数: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "データディレクトリを同期しています"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "コントロールファイルを更新しています"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "クラスタのチェックサムが有効化されました\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "クラスタのチェックサムが無効化されました\n"
+
+#~ msgid "fatal: "
+#~ msgstr "致命的エラー: "
+
+#~ msgid "invalid filenode specification, must be numeric: %s"
+#~ msgstr "不正なファイルノード指定、数値である必要があります: %s"
+
+#~ msgid "could not update checksum of block %u in file \"%s\": %m"
+#~ msgstr "ファイル\"%2$s\" ブロック%1$uのチェックサム更新失敗: %3$m"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "バグは <pgsql-bugs@lists.postgresql.org> に報告してください。\n"
diff --git a/src/bin/pg_checksums/po/ka.po b/src/bin/pg_checksums/po/ka.po
new file mode 100644
index 0000000..d202cd7
--- /dev/null
+++ b/src/bin/pg_checksums/po/ka.po
@@ -0,0 +1,351 @@
+# Georgian message translation file for pg_checksums
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:51+0000\n"
+"PO-Revision-Date: 2022-07-04 17:50+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდომა: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გაფრთხილება: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტალები: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნება: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "არასწორი მნიშვნელობა \"%s\" პარამეტრისთვის %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s არაა საზღვრებში %d-დან %d-მდე"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database "
+"cluster.\n"
+"\n"
+msgstr ""
+"%s ჩართავს, გამორთავს და შეამოწმებს მონაცემების საკონტროლო ჯამებს "
+"PostgreSQL მონაცემთა ბაზის კლასტერში.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "გამოყენება:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [პარამეტრი]... [მონაცემებისსაქაღალდე]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"პარამეტრები:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR მონაცემების საქაღალდე\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr ""
+" -c, --check მონაცემების საკნტროლო ჯამის "
+"შემოწმება(ნაგულისხმები)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable მონაცემების საკონტროლო ჯამების გამორთვა\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable მონაცემების საკონტროლო ჯამების ჩართვა\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid ""
+" -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr ""
+" -f, --filenode=ფაილისკვანძი მხოლოდ მითითებულ ფაილის კვანძთან ურთიერთობის "
+"შემოწმება\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync არ დაველოდო ცვლილებების დისკზე უსაფრთხოდ "
+"ჩაწერას\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress მიმდინარეობის ინფორმაციის ჩვენება\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose დამატებითი ინფორმაციის გამოტანა\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"თუ მონაცემების საქაღალდე მითითებული არაა, გამოყენებული იქნება \n"
+"გარემოს ცვლადი PGDATA.\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "შეცდომების შესახებ მიწერეთ: <%s>\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld მბ (%d%%) გამოთვლილია"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფაილის (%s) გახსნის შეცდომა: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "ბლოკის %u წაკითხვის შეცდომა ფაილში \"%s\": %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "ბლოკის %u წაკითხვის შეცდომა ფაილში \"%s\": წაკითხულია %d %d-დან"
+
+#: pg_checksums.c:240
+#, c-format
+msgid ""
+"checksum verification failed in file \"%s\", block %u: calculated checksum "
+"%X but block contains %X"
+msgstr ""
+"საკონტროლო ჯამის გამოთვლის შეცდომა ფაილში \"%s\", ბლოკი \"%u\": გამოთვლილი "
+"საკონტროლო კამია %X, მაგრამ ბლოკი შეიცავს: %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "გადახვევის შეცდომა ბლოკისთვის %u ფაილში \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "ბლოკის %u ჩაწერის შეცდომა ფაილში \"%s\": %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "ბლოკის %u ჩაწერის შეცდომა ფაილში \"%s\": ჩაწერილია %d %d-დან"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "ფაილის საკონტროლო ჯამები შემოწმებულია ფაილში: \"%s\""
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "ფაილის საკონტროლო ჯამები ჩართულია ფაილიდან: \"%s\""
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "საქაღალდის (%s) გახსნის შეცდომა: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ფაილი \"%s\" არ არსებობს: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "სეგმენტის არასწორი ნომერი %d ფაილის სახელში \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "მონაცემების საქაღალდე მითითებული არაა"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr ""
+"პარამეტრი -f/--filenode მხოლოდ --check -თან ერთად შეიძლება იქნას "
+"გამოყენებული"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_control CRC მნიშვნელობა არასწორია"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "კლასტერი შეუთავსებელია pg_checksums-ის ამ ვერსიასთან"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "ბაზის კლასტერი შეუთავსებელია"
+
+#: pg_checksums.c:561
+#, c-format
+msgid ""
+"The database cluster was initialized with block size %u, but pg_checksums "
+"was compiled with block size %u."
+msgstr ""
+"ბაზის კლასტერის ინიციალიზაცია მოხდა ბლოკის ზომით %u მაშინ, როცა "
+"pg_checksums აგებულია ბლოკის ზომით: %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "კლასტერი უნდა გამოირთოს"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "კლასტერში მონაცემების საკონტროლო ჯამები ჩართული არაა"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "კლასტერში მონაცემების საკონტროლო ჯამები უკვე გამორთულია"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "კლასტერში მონაცემების საკონტროლო ჯამები უკვე ჩართულია"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "საკონტროლო ჯამების ოპერაცია დასრულდა\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "დასკანერებულია ფაილები: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "დასკარერებული ბლოკები: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "ცუდი საკონტროლო ჯამები: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "მონაცემების საკონტროლო ჯამის ვერსია: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "ჩაწერილი ფაილები: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "ჩაწერილი ბლოკები: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "მონაცემების საქაღალდის სინქრონიზაცია"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "საკონტროლო ფაილის ატვირთვა"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "კლასტერში მონაცემების საკონტროლო ჯამები ჩართულია\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "კლასტერში საკონტროლო ჯამები გამორთულია\n"
diff --git a/src/bin/pg_checksums/po/ko.po b/src/bin/pg_checksums/po/ko.po
new file mode 100644
index 0000000..10c4241
--- /dev/null
+++ b/src/bin/pg_checksums/po/ko.po
@@ -0,0 +1,355 @@
+# LANGUAGE message translation file for pg_verify_checksums
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verify_checksums (PostgreSQL) package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:51+0000\n"
+"PO-Revision-Date: 2023-04-05 18:06+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: PostgreSQL Korea <kr@postgresql.org>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "상세정보: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "\"%s\" 값은 \"%s\" 옵션값으로 유효하지 않음"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s 값은 %d부터 %d까지 지정할 수 있습니다."
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database "
+"cluster.\n"
+"\n"
+msgstr ""
+"%s 명령은 PostgreSQL 데이터베이스 클러스터 내 자료 체크섬을 활성화 또는\n"
+"비활성화 또는 유효성 검사를 합니다.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [옵션]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"옵션들:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR 데이터 디렉터리\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check 실 작업 없이, 그냥 검사만 (기본값)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable 자료 페이지 체크섬 비활성화\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable 자료 페이지 체크섬 활성화\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid ""
+" -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE 지정한 파일노드만 검사\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync 작업 완료 뒤 디스크 동기화 작업을 하지 않음\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 진행 과정 보여줌\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose 자세한 작업 메시지 보여줌\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"DATADIR인 데이터 디렉터리를 지정하지 않으며, PGDATA 환경 변수값을\n"
+"사용합니다.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "문제점 보고 주소: <%s>\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) 계산됨"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파일을 열 수 없음: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "%u 블럭을 \"%s\" 파일에서 읽을 수 없음: %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "%u 블럭을 \"%s\" 파일에서 읽을 수 없음: %d / %d 바이트만 읽음"
+
+#: pg_checksums.c:240
+#, c-format
+msgid ""
+"checksum verification failed in file \"%s\", block %u: calculated checksum "
+"%X but block contains %X"
+msgstr ""
+"\"%s\" 파일, %u 블럭의 체크섬 검사 실패: 계산된 체크섬은 %X 값이지만, 블럭에"
+"는 %X 값이 있음"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "%u 블럭을 \"%s\" 파일에서 찾을 수 없음: %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "%u 블럭을 \"%s\" 파일에 쓸 수 없음: %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "%u 블럭을 \"%s\" 파일에 쓸 수 없음: %d / %d 바이트만 씀"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "\"%s\" 파일 체크섬 검사 마침"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "\"%s\" 파일 체크섬 활성화 함"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 열 수 없음: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" 파일의 상태값을 알 수 없음: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "잘못된 조각 번호 %d, 해당 파일: \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "자세한 사항은 \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "데이터 디렉터리를 지정하지 않았음"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 많은 명령행 인수를 지정했음 (처음 \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "-f/--filenode 옵션은 --check 옵션만 사용할 수 있음"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_control CRC 값이 잘못되었음"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "해당 클러스터는 이 버전 pg_checksum과 호환되지 않음"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "데이터베이스 클러스터는 호환되지 않음"
+
+#: pg_checksums.c:561
+#, c-format
+msgid ""
+"The database cluster was initialized with block size %u, but pg_checksums "
+"was compiled with block size %u."
+msgstr ""
+"이 데이터베이스 클러스터는 %u 블록 크기로 초기화 되었지만, pg_checksum은 %u "
+"블록 크기로 컴파일 되어있습니다."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "먼저 서버가 중지되어야 함"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "이 클러스터는 자료 체크섬이 비활성화 상태임"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "이 클러스터는 이미 자료 체크섬이 비활성화 상태임"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "이 클러스터는 이미 자료 체크섬이 활성화 상태임"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "체크섬 작업 완료\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "조사한 파일수: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "조사한 블럭수: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "잘못된 체크섬: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "자료 체크섬 버전: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "기록한 파일수: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "기록한 블럭수: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "데이터 디렉터리 fsync 중"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "컨트롤 파일 바꾸는 중"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "이 클러스터는 자료 체크섬 옵션이 활성화 되었음\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "이 클러스터는 자료 체크섬 옵션이 비활성화 되었음\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "자제한 사항은 \"%s --help\" 명령으로 살펴보십시오.\n"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "심각: "
+
+#, c-format
+#~ msgid "invalid filenode specification, must be numeric: %s"
+#~ msgstr "파일노드 값이 이상함. 이 값은 숫자여야 함: %s"
diff --git a/src/bin/pg_checksums/po/pt_BR.po b/src/bin/pg_checksums/po/pt_BR.po
new file mode 100644
index 0000000..d310b37
--- /dev/null
+++ b/src/bin/pg_checksums/po/pt_BR.po
@@ -0,0 +1,328 @@
+# Brazilian Portuguese message translation file for pg_checksums
+
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Euler Taveira <euler@eulerto.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-27 13:15-0300\n"
+"PO-Revision-Date: 2022-09-27 20:27-0300\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erro: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "aviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalhe: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "dica: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valor \"%s\" é inválido para opção %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s deve estar no intervalo de %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr "%s habilita, desabilita ou verifica somas de verificação de dados em um agrupamento de banco de dados do PostgreSQL.\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPÇÃO]... [DIRDADOS]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opções:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DIRDADOS diretório de dados\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check verifica soma de verificação de dados (padrão)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable desabilita soma de verificação de dados\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable habilita soma de verificação de dados\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE verifica somente relação com o filenode especificado\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync não espera mudanças serem escritas com segurança no disco\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostra informação de progresso\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose mostra mensagens de detalhe\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Se o diretório de dados (DIRDADOS) não for especificado, a variável de ambiente PGDATA\n"
+"é utilizada.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Relate erros a <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "página web do %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) calculado"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "não pôde abrir arquivo \"%s\": %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "não pôde ler bloco %u no arquivo \"%s\": %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "não pôde ler bloco %u no arquivo \"%s\": leu %d de %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "comparação de soma de verificação falhou no arquivo \"%s\", bloco %u: soma de verificação calculada %X mas bloco contém %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "posicionamento falhou para block %u no arquivo \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "não pôde escrever bloco %u no arquivo \"%s\": %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "não pôde escrever bloco %u no arquivo \"%s\": escreveu %d de %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "somas de verificação comparadas no arquivo \"%s\""
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "somas de verificação habilitadas no arquivo \"%s\""
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "não pôde abrir diretório \"%s\": %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "não pôde executar stat no arquivo \"%s\": %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "número de segmento %d é inválido no nome do arquivo \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Tente \"%s --help\" para obter informações adicionais."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "nenhum diretório de dados foi especificado"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "muitos argumentos de linha de comando (primeiro é \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "opção -f/--filenode só pode ser utilizado com --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "valor de CRC do pg_control está incorreto"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "agrupamento de banco de dados não é compatível com esta versão do pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "agrupamento de banco de dados não é compatível"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "O agrupamento de banco de dados foi inicializado com tamanho de bloco %u, mas pg_checksums foi compilado com tamanho de bloco %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "agrupamento de banco de dados deve ser desligado"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "somas de verificação de dados não estão habilitadas no agrupamento de banco de dados"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "somas de verificação de dados já estão desabilitadas no agrupamento de banco de dados"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "somas de verificação de dados já estão habilitadas no agrupamento de banco de dados"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Operação de soma de verificação concluída\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Arquivos verificados: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Blocos verificados: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Somas de verificação incorretas: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Versão da soma de verificação de dados: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Arquivos verificados: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Blocos verificados: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "sincronizando diretório de dados"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "atualizando arquivo de controle"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Somas de verificação habilitadas no agrupamento de banco de dados\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Somas de verificação desabilitadas no agrupamento de banco de dados\n"
diff --git a/src/bin/pg_checksums/po/ru.po b/src/bin/pg_checksums/po/ru.po
new file mode 100644
index 0000000..df62e9d
--- /dev/null
+++ b/src/bin/pg_checksums/po/ru.po
@@ -0,0 +1,352 @@
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2019, 2020, 2021, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verify_checksums (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-27 14:52+0300\n"
+"PO-Revision-Date: 2022-09-05 13:34+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробности: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подсказка: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неверное значение \"%s\" для параметра %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "значение %s должно быть в диапазоне %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database "
+"cluster.\n"
+"\n"
+msgstr ""
+"%s включает, отключает, проверяет контрольные суммы данных в кластере БД "
+"PostgreSQL.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Использование:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [ПАРАМЕТР]... [КАТАЛОГ]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметры:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]КАТ_ДАННЫХ каталог данных\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr ""
+" -c, --check проверить контрольные суммы данных (по "
+"умолчанию)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable отключить контрольные суммы\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable включить контрольные суммы\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid ""
+" -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr ""
+" -f, --filenode=ФАЙЛ_УЗЕЛ проверить только отношение с заданным файловым "
+"узлом\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync не ждать завершения сохранения данных на диске\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress показывать прогресс операции\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose выводить подробные сообщения\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Если каталог данных (КАТ_ДАННЫХ) не задан, используется значение\n"
+"переменной окружения PGDATA.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Об ошибках сообщайте по адресу <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld МБ (%d%%) обработано"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалось открыть файл \"%s\": %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "не удалось прочитать блок %u в файле \"%s\": %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "не удалось прочитать блок %u в файле \"%s\" (прочитано байт: %d из %d)"
+
+#: pg_checksums.c:240
+#, c-format
+msgid ""
+"checksum verification failed in file \"%s\", block %u: calculated checksum "
+"%X but block contains %X"
+msgstr ""
+"ошибка контрольных сумм в файле \"%s\", блоке %u: вычислена контрольная "
+"сумма %X, но блок содержит %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "ошибка при переходе к блоку %u в файле \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "не удалось записать блок %u в файл \"%s\": %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "не удалось записать блок %u в файле \"%s\" (записано байт: %d из %d)"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "контрольные суммы в файле \"%s\" проверены"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "контрольные суммы в файле \"%s\" включены"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не удалось открыть каталог \"%s\": %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не удалось получить информацию о файле \"%s\": %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "неверный номер сегмента %d в имени файла \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Для дополнительной информации попробуйте \"%s --help\"."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог данных не указан"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "слишком много аргументов командной строки (первый: \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "параметр -f/--filenode можно использовать только с --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "ошибка контрольного значения в pg_control"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "кластер несовместим с этой версией pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "несовместимый кластер баз данных"
+
+#: pg_checksums.c:561
+#, c-format
+msgid ""
+"The database cluster was initialized with block size %u, but pg_checksums "
+"was compiled with block size %u."
+msgstr ""
+"Кластер баз данных был инициализирован с размером блока %u, а утилита "
+"pg_checksums скомпилирована для размера блока %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "кластер должен быть отключён"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "контрольные суммы в кластере не включены"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "контрольные суммы в кластере уже отключены"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "контрольные суммы в кластере уже включены"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Обработка контрольных сумм завершена\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Просканировано файлов: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Просканировано блоков: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Неверные контрольные суммы: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Версия контрольных сумм данных: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Записано файлов: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Записано блоков: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "синхронизация каталога данных"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "модификация управляющего файла"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Контрольные суммы в кластере включены\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Контрольные суммы в кластере отключены\n"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "invalid filenode specification, must be numeric: %s"
+#~ msgstr "неверное указание файлового узла, требуется число: %s"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
diff --git a/src/bin/pg_checksums/po/sv.po b/src/bin/pg_checksums/po/sv.po
new file mode 100644
index 0000000..8e92a9e
--- /dev/null
+++ b/src/bin/pg_checksums/po/sv.po
@@ -0,0 +1,329 @@
+# Swedish message translation file for pg_checksums
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# Dennis Björklund <db@zigo.dhs.org>, 2019, 2020, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-09 18:52+0000\n"
+"PO-Revision-Date: 2022-05-09 21:46+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ogiltigt värde \"%s\" för flaggan \"%s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s måste vara i intervallet %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s slår på, slår av eller verifierar datakontrollsummor i ett PostgreSQL databaskluster.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [FLAGGA]... [DATAKATALOG]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Flaggor:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATAKAT datakatalog\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check kontrollera datakontrollsummor (standard)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable slå av datakontrollsummor\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable slå på datakontrollsummor\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILNOD kontrollera bara relation med angiven filnod\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync vänta inte på att ändingar säkert skrivits till disk\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress visa förloppsinformation\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose visa utförliga meddelanden\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Om ingen datakatalog (DATAKATALOG) har angivits så nyttjas omgivningsvariabeln\n"
+"PGDATA för detta syfte.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapportera fel till <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) beräknad"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "kunde inte läsa block %u i fil \"%s\": %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "kunde inte läsa block %u i fil \"%s\": läste %d av %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "verifiering av kontrollsumma misslyckades i fil \"%s\", block %u: beräknad kontrollsumma är %X men blocket innehåller %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "seek misslyckades för block %u i fil \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "kunde inte skriva block %u i fil \"%s\": %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "kunde inte skriva block %u i fil \"%s\": skrev %d av %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "kontrollsummor verifierade i fil \"%s\""
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "kontrollsummor påslagen i fil \"%s\""
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "kunde inte öppna katalog \"%s\": %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "kunde inte göra stat() på fil \"%s\": %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "ogiltigt segmentnummer %d i filnamn \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "ingen datakatalog angiven"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "inställningen -f/--filenode tillåts bara med --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_control CRC-värde är inkorrekt"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "klustret är inte kompatibelt med denna version av pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "databasklustret är inte kompatibelt"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "Databasklustret initierades med blockstorlek %u men pg_checksums kompilerades med blockstorlek %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "klustret måste stängas ner"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "datakontrollsummor är inte påslaget i klustret"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "datakontrollsummor är redan avslaget i klustret"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "datakontrollsummor är redan påslagna i klustret"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Kontrollsummeoperation avslutad\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Skannade filer: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Skannade block: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Felaktiga kontrollsummor: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Datakontrollsummeversion: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Skrivna filer: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Skrivna block: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "synkar datakatalogen"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "uppdaterar kontrollfil"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Kontrollsummor påslaget i klustret\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Kontrollsummor avslaget i klustret\n"
diff --git a/src/bin/pg_checksums/po/uk.po b/src/bin/pg_checksums/po/uk.po
new file mode 100644
index 0000000..0a994be
--- /dev/null
+++ b/src/bin/pg_checksums/po/uk.po
@@ -0,0 +1,319 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:52+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_checksums.pot\n"
+"X-Crowdin-File-ID: 888\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередження: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неприпустиме значення \"%s\" для параметра %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s має бути в діапазоні %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid "%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n\n"
+msgstr "%s активує, деактивує або перевіряє контрольні суми даних в кластері бази даних PostgreSQL.\n\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Використання:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid "\n"
+"Options:\n"
+msgstr "\n"
+"Параметри:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR каталог даних\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check перевірити контрольні суми даних (за замовчуванням)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable вимкнути контрольні суми даних\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable активувати контрольні суми даних\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE перевіряти відношення лише із вказаним файлом\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync не чекати на безпечний запис змін на диск\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress показати інформацію про прогрес\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose виводити детальні повідомлення\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію, потім вийти\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid "\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n\n"
+msgstr "\n"
+"Якщо каталог даних не вказано (DATADIR), використовується змінна середовища PGDATA.\n\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Повідомляти про помилки на <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) обчислено"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "не вдалося прочитати блок %u в файлі \"%s\": %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "не вдалося прочитати блок %u у файлі \"%s\": прочитано %d з %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "помилка перевірки контрольних сум у файлі \"%s\", блок %u: обчислена контрольна сума %X, але блок містить %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "помилка пошуку для блоку %u у файлі \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "не вдалося записати блок %u у файл \"%s\": %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "не вдалося записати блок %u у файлі \"%s\": записано %d з %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "контрольні суми у файлі \"%s\" перевірені"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "контрольні суми у файлі \"%s\" активовані"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не вдалося відкрити каталог \"%s\": %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не вдалося отримати інформацію від файлу \"%s\": %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "неприпустимий номер сегменту %d в імені файлу \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" для додаткової інформації."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог даних не вказано"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному рядку (перший \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "параметр -f/--filenode може бути використаний тільки з --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "значення CRC pg_control неправильне"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "кластер не сумісний з цією версією pg_checksum"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "кластер бази даних не сумісний"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "Кластер бази даних було ініціалізовано з розміром блоку %u, але pg_checksums було скомпільовано з розміром блоку %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "кластер повинен бути закритий"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "контрольні суми в кластері неактивовані"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "контрольні суми вже неактивовані в кластері"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "контрольні суми вже активовані в кластері"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Операція контрольної суми завершена\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Файлів проскановано: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Блоків відскановано: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Помилкові контрольні суми: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Версія контрольних сум даних: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Файлів записано: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Блоків записано: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "синхронізація даних каталогу"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "оновлення контрольного файлу"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Контрольні суми активовані в кластері\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Контрольні суми вимкнені у кластері\n"
+
diff --git a/src/bin/pg_checksums/t/001_basic.pl b/src/bin/pg_checksums/t/001_basic.pl
new file mode 100644
index 0000000..d7cede1
--- /dev/null
+++ b/src/bin/pg_checksums/t/001_basic.pl
@@ -0,0 +1,13 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_checksums');
+program_version_ok('pg_checksums');
+program_options_handling_ok('pg_checksums');
+
+done_testing();
diff --git a/src/bin/pg_checksums/t/002_actions.pl b/src/bin/pg_checksums/t/002_actions.pl
new file mode 100644
index 0000000..0309cbb
--- /dev/null
+++ b/src/bin/pg_checksums/t/002_actions.pl
@@ -0,0 +1,253 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+# Do basic sanity checks supported by pg_checksums using
+# an initialized cluster.
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+
+# Utility routine to create and check a table with corrupted checksums
+# on a wanted tablespace. Note that this stops and starts the node
+# multiple times to perform the checks, leaving the node started
+# at the end.
+sub check_relation_corruption
+{
+ my $node = shift;
+ my $table = shift;
+ my $tablespace = shift;
+ my $pgdata = $node->data_dir;
+
+ # Create table and discover its filesystem location.
+ $node->safe_psql(
+ 'postgres',
+ "CREATE TABLE $table AS SELECT a FROM generate_series(1,10000) AS a;
+ ALTER TABLE $table SET (autovacuum_enabled=false);");
+
+ $node->safe_psql('postgres',
+ "ALTER TABLE " . $table . " SET TABLESPACE " . $tablespace . ";");
+
+ my $file_corrupted =
+ $node->safe_psql('postgres', "SELECT pg_relation_filepath('$table');");
+ my $relfilenode_corrupted = $node->safe_psql('postgres',
+ "SELECT relfilenode FROM pg_class WHERE relname = '$table';");
+
+ $node->stop;
+
+ # Checksums are correct for single relfilenode as the table is not
+ # corrupted yet.
+ command_ok(
+ [
+ 'pg_checksums', '--check',
+ '-D', $pgdata,
+ '--filenode', $relfilenode_corrupted
+ ],
+ "succeeds for single relfilenode on tablespace $tablespace with offline cluster"
+ );
+
+ # Time to create some corruption
+ $node->corrupt_page_checksum($file_corrupted, 0);
+
+ # Checksum checks on single relfilenode fail
+ $node->command_checks_all(
+ [
+ 'pg_checksums', '--check',
+ '-D', $pgdata,
+ '--filenode', $relfilenode_corrupted
+ ],
+ 1,
+ [qr/Bad checksums:.*1/],
+ [qr/checksum verification failed/],
+ "fails with corrupted data for single relfilenode on tablespace $tablespace"
+ );
+
+ # Global checksum checks fail as well
+ $node->command_checks_all(
+ [ 'pg_checksums', '--check', '-D', $pgdata ],
+ 1,
+ [qr/Bad checksums:.*1/],
+ [qr/checksum verification failed/],
+ "fails with corrupted data on tablespace $tablespace");
+
+ # Drop corrupted table again and make sure there is no more corruption.
+ $node->start;
+ $node->safe_psql('postgres', "DROP TABLE $table;");
+ $node->stop;
+ $node->command_ok([ 'pg_checksums', '--check', '-D', $pgdata ],
+ "succeeds again after table drop on tablespace $tablespace");
+
+ $node->start;
+ return;
+}
+
+# Initialize node with checksums disabled.
+my $node = PostgreSQL::Test::Cluster->new('node_checksum');
+$node->init();
+my $pgdata = $node->data_dir;
+
+# Control file should know that checksums are disabled.
+command_like(
+ [ 'pg_controldata', $pgdata ],
+ qr/Data page checksum version:.*0/,
+ 'checksums disabled in control file');
+
+# These are correct but empty files, so they should pass through.
+append_to_file "$pgdata/global/99999", "";
+append_to_file "$pgdata/global/99999.123", "";
+append_to_file "$pgdata/global/99999_fsm", "";
+append_to_file "$pgdata/global/99999_init", "";
+append_to_file "$pgdata/global/99999_vm", "";
+append_to_file "$pgdata/global/99999_init.123", "";
+append_to_file "$pgdata/global/99999_fsm.123", "";
+append_to_file "$pgdata/global/99999_vm.123", "";
+
+# These are temporary files and folders with dummy contents, which
+# should be ignored by the scan.
+append_to_file "$pgdata/global/pgsql_tmp_123", "foo";
+mkdir "$pgdata/global/pgsql_tmp";
+append_to_file "$pgdata/global/pgsql_tmp/1.1", "foo";
+append_to_file "$pgdata/global/pg_internal.init", "foo";
+append_to_file "$pgdata/global/pg_internal.init.123", "foo";
+
+# Enable checksums.
+command_ok([ 'pg_checksums', '--enable', '--no-sync', '-D', $pgdata ],
+ "checksums successfully enabled in cluster");
+
+# Successive attempt to enable checksums fails.
+command_fails([ 'pg_checksums', '--enable', '--no-sync', '-D', $pgdata ],
+ "enabling checksums fails if already enabled");
+
+# Control file should know that checksums are enabled.
+command_like(
+ [ 'pg_controldata', $pgdata ],
+ qr/Data page checksum version:.*1/,
+ 'checksums enabled in control file');
+
+# Disable checksums again. Flush result here as that should be cheap.
+command_ok(
+ [ 'pg_checksums', '--disable', '-D', $pgdata ],
+ "checksums successfully disabled in cluster");
+
+# Successive attempt to disable checksums fails.
+command_fails(
+ [ 'pg_checksums', '--disable', '--no-sync', '-D', $pgdata ],
+ "disabling checksums fails if already disabled");
+
+# Control file should know that checksums are disabled.
+command_like(
+ [ 'pg_controldata', $pgdata ],
+ qr/Data page checksum version:.*0/,
+ 'checksums disabled in control file');
+
+# Enable checksums again for follow-up tests.
+command_ok([ 'pg_checksums', '--enable', '--no-sync', '-D', $pgdata ],
+ "checksums successfully enabled in cluster");
+
+# Control file should know that checksums are enabled.
+command_like(
+ [ 'pg_controldata', $pgdata ],
+ qr/Data page checksum version:.*1/,
+ 'checksums enabled in control file');
+
+# Checksums pass on a newly-created cluster
+command_ok([ 'pg_checksums', '--check', '-D', $pgdata ],
+ "succeeds with offline cluster");
+
+# Checksums are verified if no other arguments are specified
+command_ok(
+ [ 'pg_checksums', '-D', $pgdata ],
+ "verifies checksums as default action");
+
+# Specific relation files cannot be requested when action is --disable
+# or --enable.
+command_fails(
+ [ 'pg_checksums', '--disable', '--filenode', '1234', '-D', $pgdata ],
+ "fails when relfilenodes are requested and action is --disable");
+command_fails(
+ [ 'pg_checksums', '--enable', '--filenode', '1234', '-D', $pgdata ],
+ "fails when relfilenodes are requested and action is --enable");
+
+# Test postgres -C for an offline cluster.
+# Run-time GUCs are safe to query here. Note that a lock file is created,
+# then removed, leading to an extra LOG entry showing in stderr. This uses
+# log_min_messages=fatal to remove any noise. This test uses a startup
+# wrapped with pg_ctl to allow the case where this runs under a privileged
+# account on Windows.
+command_checks_all(
+ [
+ 'pg_ctl', 'start', '-D', $pgdata, '-s', '-o',
+ '-C data_checksums -c log_min_messages=fatal'
+ ],
+ 1,
+ [qr/^on$/],
+ [qr/could not start server/],
+ 'data_checksums=on is reported on an offline cluster');
+
+# Checks cannot happen with an online cluster
+$node->start;
+command_fails([ 'pg_checksums', '--check', '-D', $pgdata ],
+ "fails with online cluster");
+
+# Check corruption of table on default tablespace.
+check_relation_corruption($node, 'corrupt1', 'pg_default');
+
+# Create tablespace to check corruptions in a non-default tablespace.
+my $basedir = $node->basedir;
+my $tablespace_dir = "$basedir/ts_corrupt_dir";
+mkdir($tablespace_dir);
+$node->safe_psql('postgres',
+ "CREATE TABLESPACE ts_corrupt LOCATION '$tablespace_dir';");
+check_relation_corruption($node, 'corrupt2', 'ts_corrupt');
+
+# Utility routine to check that pg_checksums is able to detect
+# correctly-named relation files filled with some corrupted data.
+sub fail_corrupt
+{
+ my $node = shift;
+ my $file = shift;
+ my $pgdata = $node->data_dir;
+
+ # Create the file with some dummy data in it.
+ my $file_name = "$pgdata/global/$file";
+ append_to_file $file_name, "foo";
+
+ $node->command_checks_all(
+ [ 'pg_checksums', '--check', '-D', $pgdata ],
+ 1,
+ [qr/^$/],
+ [qr/could not read block 0 in file.*$file\":/],
+ "fails for corrupted data in $file");
+
+ # Remove file to prevent future lookup errors on conflicts.
+ unlink $file_name;
+ return;
+}
+
+# Stop instance for the follow-up checks.
+$node->stop;
+
+# Create a fake tablespace location that should not be scanned
+# when verifying checksums.
+mkdir "$tablespace_dir/PG_99_999999991/";
+append_to_file "$tablespace_dir/PG_99_999999991/foo", "123";
+command_ok([ 'pg_checksums', '--check', '-D', $pgdata ],
+ "succeeds with foreign tablespace");
+
+# Authorized relation files filled with corrupted data cause the
+# checksum checks to fail. Make sure to use file names different
+# than the previous ones.
+fail_corrupt($node, "99990");
+fail_corrupt($node, "99990.123");
+fail_corrupt($node, "99990_fsm");
+fail_corrupt($node, "99990_init");
+fail_corrupt($node, "99990_vm");
+fail_corrupt($node, "99990_init.123");
+fail_corrupt($node, "99990_fsm.123");
+fail_corrupt($node, "99990_vm.123");
+
+done_testing();
diff --git a/src/bin/pg_config/.gitignore b/src/bin/pg_config/.gitignore
new file mode 100644
index 0000000..cc42247
--- /dev/null
+++ b/src/bin/pg_config/.gitignore
@@ -0,0 +1,2 @@
+/pg_config
+/tmp_check/
diff --git a/src/bin/pg_config/Makefile b/src/bin/pg_config/Makefile
new file mode 100644
index 0000000..c599f88
--- /dev/null
+++ b/src/bin/pg_config/Makefile
@@ -0,0 +1,44 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_config
+#
+# Copyright (c) 1998-2022, PostgreSQL Global Development Group
+#
+# src/bin/pg_config/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_config - report configuration information"
+PGAPPICON=win32
+
+subdir = src/bin/pg_config
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ pg_config.o
+
+all: pg_config
+
+pg_config: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_SCRIPT) pg_config$(X) '$(DESTDIR)$(bindir)/pg_config$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_config$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_config$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_config/nls.mk b/src/bin/pg_config/nls.mk
new file mode 100644
index 0000000..f2d9042
--- /dev/null
+++ b/src/bin/pg_config/nls.mk
@@ -0,0 +1,4 @@
+# src/bin/pg_config/nls.mk
+CATALOG_NAME = pg_config
+AVAIL_LANGUAGES = cs de el es fr he it ja ka ko pl pt_BR ru sv tr uk vi zh_CN
+GETTEXT_FILES = pg_config.c ../../common/config_info.c ../../common/exec.c
diff --git a/src/bin/pg_config/pg_config.c b/src/bin/pg_config/pg_config.c
new file mode 100644
index 0000000..62b97af
--- /dev/null
+++ b/src/bin/pg_config/pg_config.c
@@ -0,0 +1,189 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_config.c
+ *
+ * This program reports various pieces of information about the
+ * installed version of PostgreSQL. Packages that interface to
+ * PostgreSQL can use it to configure their build.
+ *
+ * This is a C implementation of the previous shell script written by
+ * Peter Eisentraut <peter_e@gmx.net>, with adjustments made to
+ * accommodate the possibility that the installation has been relocated from
+ * the place originally configured.
+ *
+ * author of C translation: Andrew Dunstan mailto:andrew@dunslane.net
+ *
+ * This code is released under the terms of the PostgreSQL License.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/pg_config/pg_config.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include "common/config_info.h"
+#include "port.h"
+
+static const char *progname;
+
+/*
+ * Table of known information items
+ *
+ * Be careful to keep this in sync with the help() display.
+ */
+typedef struct
+{
+ const char *switchname;
+ const char *configname;
+} InfoItem;
+
+static const InfoItem info_items[] = {
+ {"--bindir", "BINDIR"},
+ {"--docdir", "DOCDIR"},
+ {"--htmldir", "HTMLDIR"},
+ {"--includedir", "INCLUDEDIR"},
+ {"--pkgincludedir", "PKGINCLUDEDIR"},
+ {"--includedir-server", "INCLUDEDIR-SERVER"},
+ {"--libdir", "LIBDIR"},
+ {"--pkglibdir", "PKGLIBDIR"},
+ {"--localedir", "LOCALEDIR"},
+ {"--mandir", "MANDIR"},
+ {"--sharedir", "SHAREDIR"},
+ {"--sysconfdir", "SYSCONFDIR"},
+ {"--pgxs", "PGXS"},
+ {"--configure", "CONFIGURE"},
+ {"--cc", "CC"},
+ {"--cppflags", "CPPFLAGS"},
+ {"--cflags", "CFLAGS"},
+ {"--cflags_sl", "CFLAGS_SL"},
+ {"--ldflags", "LDFLAGS"},
+ {"--ldflags_ex", "LDFLAGS_EX"},
+ {"--ldflags_sl", "LDFLAGS_SL"},
+ {"--libs", "LIBS"},
+ {"--version", "VERSION"},
+ {NULL, NULL}
+};
+
+
+static void
+help(void)
+{
+ printf(_("\n%s provides information about the installed version of PostgreSQL.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]...\n\n"), progname);
+ printf(_("Options:\n"));
+ printf(_(" --bindir show location of user executables\n"));
+ printf(_(" --docdir show location of documentation files\n"));
+ printf(_(" --htmldir show location of HTML documentation files\n"));
+ printf(_(" --includedir show location of C header files of the client\n"
+ " interfaces\n"));
+ printf(_(" --pkgincludedir show location of other C header files\n"));
+ printf(_(" --includedir-server show location of C header files for the server\n"));
+ printf(_(" --libdir show location of object code libraries\n"));
+ printf(_(" --pkglibdir show location of dynamically loadable modules\n"));
+ printf(_(" --localedir show location of locale support files\n"));
+ printf(_(" --mandir show location of manual pages\n"));
+ printf(_(" --sharedir show location of architecture-independent support files\n"));
+ printf(_(" --sysconfdir show location of system-wide configuration files\n"));
+ printf(_(" --pgxs show location of extension makefile\n"));
+ printf(_(" --configure show options given to \"configure\" script when\n"
+ " PostgreSQL was built\n"));
+ printf(_(" --cc show CC value used when PostgreSQL was built\n"));
+ printf(_(" --cppflags show CPPFLAGS value used when PostgreSQL was built\n"));
+ printf(_(" --cflags show CFLAGS value used when PostgreSQL was built\n"));
+ printf(_(" --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"));
+ printf(_(" --ldflags show LDFLAGS value used when PostgreSQL was built\n"));
+ printf(_(" --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"));
+ printf(_(" --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"));
+ printf(_(" --libs show LIBS value used when PostgreSQL was built\n"));
+ printf(_(" --version show the PostgreSQL version\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nWith no arguments, all known items are shown.\n\n"));
+ printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+static void
+advice(void)
+{
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
+}
+
+static void
+show_item(const char *configname,
+ ConfigData *configdata,
+ size_t configdata_len)
+{
+ int i;
+
+ for (i = 0; i < configdata_len; i++)
+ {
+ if (strcmp(configname, configdata[i].name) == 0)
+ printf("%s\n", configdata[i].setting);
+ }
+}
+
+int
+main(int argc, char **argv)
+{
+ ConfigData *configdata;
+ size_t configdata_len;
+ char my_exec_path[MAXPGPATH];
+ int i;
+ int j;
+
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_config"));
+
+ progname = get_progname(argv[0]);
+
+ /* check for --help */
+ for (i = 1; i < argc; i++)
+ {
+ if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-?") == 0)
+ {
+ help();
+ exit(0);
+ }
+ }
+
+ if (find_my_exec(argv[0], my_exec_path) < 0)
+ {
+ fprintf(stderr, _("%s: could not find own program executable\n"), progname);
+ exit(1);
+ }
+
+ configdata = get_configdata(my_exec_path, &configdata_len);
+ /* no arguments -> print everything */
+ if (argc < 2)
+ {
+ for (i = 0; i < configdata_len; i++)
+ printf("%s = %s\n", configdata[i].name, configdata[i].setting);
+ exit(0);
+ }
+
+ /* otherwise print requested items */
+ for (i = 1; i < argc; i++)
+ {
+ for (j = 0; info_items[j].switchname != NULL; j++)
+ {
+ if (strcmp(argv[i], info_items[j].switchname) == 0)
+ {
+ show_item(info_items[j].configname,
+ configdata, configdata_len);
+ break;
+ }
+ }
+ if (info_items[j].switchname == NULL)
+ {
+ fprintf(stderr, _("%s: invalid argument: %s\n"),
+ progname, argv[i]);
+ advice();
+ exit(1);
+ }
+ }
+
+ return 0;
+}
diff --git a/src/bin/pg_config/po/cs.po b/src/bin/pg_config/po/cs.po
new file mode 100644
index 0000000..9a61683
--- /dev/null
+++ b/src/bin/pg_config/po/cs.po
@@ -0,0 +1,280 @@
+# Czech message translation file for pg_config
+# Copyright (C) 2012 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Tomas Vondra <tv@fuzzy.cz>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config-cs (PostgreSQL 9.3)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:14+0000\n"
+"PO-Revision-Date: 2020-10-31 21:30+0100\n"
+"Last-Translator: Tomas Vondra <tv@fuzzy.cz>\n"
+"Language-Team: Czech <info@cspug.cx>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "nezaznamenáno"
+
+#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "nelze získat aktuální adresář: %m"
+
+#: ../../common/exec.c:156
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "neplatný binární soubor\"%s\""
+
+#: ../../common/exec.c:206
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "nelze číst binární soubor \"%s\""
+
+#: ../../common/exec.c:214
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "nelze najít soubor \"%s\" ke spuštění"
+
+#: ../../common/exec.c:270 ../../common/exec.c:309
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "nelze změnit adresář na \"%s\" : %m"
+
+#: ../../common/exec.c:287
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "nelze přečíst symbolický odkaz \"%s\": %m"
+
+#: ../../common/exec.c:410
+#, c-format
+msgid "pclose failed: %m"
+msgstr "volání pclose selhalo: %m"
+
+#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676
+msgid "out of memory"
+msgstr "nedostatek paměti"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s poskytuje informace o nainstalované verzi PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [PŘEPÍNAČ]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Přepínače:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir ukáže umístění spustitelných souborů\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir ukáže umístění souborů s dokumentací\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir ukáže umístění souborl s HTML dokumentací\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir ukáže umístění C hlavičkových souborů klientských\n"
+" rozhraní\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir ukáže umístění dalších C hlavičkových souborů\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server ukáže umístění C hlavičkových souborů pro server\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir ukáže umístění knihoven\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir ukáže umístění dynamicky zaváděných modulů\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir ukáže umístění souborů pro podporu locale\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir ukáže umístění souborů s manuálovými stránkami\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir ukáže umístění podpůrných souborů nezávislých na architektuře\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir ukáže umístění konfiguračních souborů platných pro celý systém\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs ukáže umístění makefile souboru pro rozšíření\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure ukáže přepínače použité pro \"configure\" skript ke\n"
+" kompilaci PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc ukáže hodnotu CC použitou při buildu PostgreSQL\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags ukáže hodnotu CPPFLAGS použitou při buildu PostgreSQL\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags ukáže hodnotu CFLAGS použitou při buildu PostgreSQL\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl ukáže hodnotu CFLAGS_SL použitou při buildu PostgreSQL\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags ukáže hodnotu LDFLAGS použitou při buildu PostgreSQL\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex ukáže hodnotu LDFLAGS_EX použitou při buildu PostgreSQL\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl ukáže hodnotu LDFLAGS_SL použitou při buildu PostgreSQL\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs ukáže hodnotu LIBS použitou při buildu PostgreSQL\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version ukáže verzi PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukáže tuto nápovědu, a skončí\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Bez argumentů jsou vypsány všechny známé položky.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Chyby hlašte na <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: nelze najít vlastní spustitelný soubor\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: neplatný parametr: %s\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "nelze číst symbolický link \"%s\""
+
+#~ msgid "child process exited with exit code %d"
+#~ msgstr "potomek skončil s návratovým kódem %d"
+
+#~ msgid "child process was terminated by exception 0x%X"
+#~ msgstr "potomek byl ukončen vyjímkou 0x%X"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "potomek byl ukončen signálem %s"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "potomek byl ukončen signálem %d"
+
+#~ msgid "child process exited with unrecognized status %d"
+#~ msgstr "potomek skončil s nerozponaným stavem %d"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Oznámení o chybách zasílejte na <pgsql-bugs@postgresql.org>.\n"
diff --git a/src/bin/pg_config/po/de.po b/src/bin/pg_config/po/de.po
new file mode 100644
index 0000000..93c9088
--- /dev/null
+++ b/src/bin/pg_config/po/de.po
@@ -0,0 +1,265 @@
+# German message translation file for pg_config
+# Peter Eisentraut <peter@eisentraut.org>, 2004 - 2021.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-04-29 03:16+0000\n"
+"PO-Revision-Date: 2021-04-29 06:58+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "nicht aufgezeichnet"
+
+#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "konnte aktuelles Verzeichnis nicht ermitteln: %m"
+
+#: ../../common/exec.c:155
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "ungültige Programmdatei »%s«"
+
+#: ../../common/exec.c:205
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "konnte Programmdatei »%s« nicht lesen"
+
+#: ../../common/exec.c:213
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "konnte kein »%s« zum Ausführen finden"
+
+#: ../../common/exec.c:269 ../../common/exec.c:308
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "konnte nicht in Verzeichnis »%s« wechseln: %m"
+
+#: ../../common/exec.c:286
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m"
+
+#: ../../common/exec.c:409
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() fehlgeschlagen: %m"
+
+#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659
+msgid "out of memory"
+msgstr "Speicher aufgebraucht"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s gibt Informationen über die installierte Version von PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPTION]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Optionen:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir zeige Installationsverzeichnis der Benutzerprogramme\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir zeige Installationsverzeichnis der Dokumentation\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir zeige Installationsverzeichnis der HTML-Dokumentation\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir zeige Installationsverzeichnis der Headerdateien der\n"
+" Client-Schnittstellen\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir zeige Installationsverzeichnis von weiteren Headerdateien\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr ""
+" --includedir-server zeige Installationsverzeichnis der Headerdateien des\n"
+" Servers\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir zeige Installationsverzeichnis der Objektbibliotheken\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr ""
+" --pkglibdir zeige Installationsverzeichnis der dynamisch\n"
+" ladbaren Module\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir zeige Installationsverzeichnis der Locale-Dateien\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir zeige Installationsverzeichnis der Manpages\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr ""
+" --sharedir zeige Installationsverzeichnis der architektur-\n"
+" unabhängigen Datendateien\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr ""
+" --sysconfdir zeige Installationsverzeichnis der systemweiten\n"
+" Konfigurationsdateien\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs zeige Ort der Erweiterungs-Makefile\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure zeige Optionen des »configure«-Skriptes beim Bauen\n"
+" von PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc zeige CC-Wert, mit dem PostgreSQL gebaut wurde\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags zeige CPPFLAGS-Wert, mit dem PostgreSQL gebaut wurde\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags zeige CFLAGS-Wert, mit dem PostgreSQL gebaut wurde\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl zeige CFLAGS_SL-Wert, mit dem PostgreSQL gebaut wurde\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags zeige LDFLAGS-Wert, mit dem PostgreSQL gebaut wurde\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex zeige LDFLAGS_EX-Wert, mit dem PostgreSQL gebaut wurde\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl zeige LDFLAGS_SL-Wert, mit dem PostgreSQL gebaut wurde\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs zeige LIBS-Wert, mit dem PostgreSQL gebaut wurde\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version zeige PostgreSQL-Version\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Ohne Argumente werden alle bekannten Informationen angezeigt.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Berichten Sie Fehler an <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: konnte eigene Programmdatei nicht finden\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: ungültiges Argument: %s\n"
diff --git a/src/bin/pg_config/po/el.po b/src/bin/pg_config/po/el.po
new file mode 100644
index 0000000..5f96e8a
--- /dev/null
+++ b/src/bin/pg_config/po/el.po
@@ -0,0 +1,261 @@
+# Greek message translation file for pg_config
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_config (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-07-20 03:45+0000\n"
+"PO-Revision-Date: 2021-07-20 10:27+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.0\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "δεν έχει καταγραφεί"
+
+#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "δεν ήταν δυνατή η αναγνώριση του τρέχοντος καταλόγου: %m"
+
+#: ../../common/exec.c:155
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "μη έγκυρο δυαδικό αρχείο «%s»"
+
+#: ../../common/exec.c:205
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "δεν ήταν δυνατή η ανάγνωση του δυαδικού αρχείου «%s»"
+
+#: ../../common/exec.c:213
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "δεν βρέθηκε το αρχείο «%s» για να εκτελεστεί"
+
+#: ../../common/exec.c:269 ../../common/exec.c:308
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m"
+
+#: ../../common/exec.c:286
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου «%s»: %m"
+
+#: ../../common/exec.c:409
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() απέτυχε: %m"
+
+#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659
+msgid "out of memory"
+msgstr "έλλειψη μνήμης"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s παρέχει πληροφορίες σχετικά με την εγκατεστημένη έκδοση της PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Χρήση:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [ΕΠΙΛΟΓΗ]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Επιλογές:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir εμφάνισε τη τοποθεσία των εκτελέσιμων αρχείων του χρήστη\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir εμφάνισε τη τοποθεσία των αρχείων τεκμηρίωσης\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir εμφάνισε τη τοποθεσία των αρχείων τεκμηρίωσης HTML\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir εμφάνισε τη τοποθεσία των αρχείων κεφαλίδας C\n"
+" των διεπαφών πελάτη\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir εμφάνισε τη τοποθεσία άλλων αρχείων κεφαλίδας C\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server εμφάνισε τη τοποθεσία των αρχείων κεφαλίδας C για τον διακομιστή\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir εμφάνισε τη τοποθεσία των βιβλιοθηκών κώδικα αντικειμένων\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir εμφάνισε τη τοποθεσία των δυναμικά φορτώσιμων ενοτήτων\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir εμφάνισε τη τοποθεσία των αρχείων υποστήριξης εντοπιότητας\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir εμφάνισε τη τοποθεσία των σελίδων τεκμηρίωσης\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir εμφάνισε τη τοποθεσία των ανεξάρτητων από την αρχιτεκτονική αρχείων υποστήριξης\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir εμφάνισε την τοποθεσία των αρχείων ρύθμισης παραμέτρων όλου του συστήματος\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs εμφάνισε τη τοποθεσία του makefile επέκτασης\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure εμφάνισε τις παραμέτρους που δόθηκαν ώστε να «ρυθμιστεί» το σενάριο\n"
+" κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc εμφάνισε την τιμή CC που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags εμφάνισε την τιμή CPPFLAGS που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags εμφάνισε την τιμή CFLAGS που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl εμφάνισε την τιμή CFLAGS_SL που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags εμφάνισε την τιμή LDFLAGS που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex εμφάνισε την τιμή LDFLAGS_EX που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl εμφάνισε την τιμή LDFLAGS_SL που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs εμφάνισε την τιμή LIBS που χρησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version εμφάνισε την έκδοση PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Χωρίς παραμέτρους, εμφανίζονται όλα τα γνωστά στοιχεία.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Υποβάλετε αναφορές σφάλματων σε <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αρχική σελίδα: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: δεν ήταν δυνατή η εύρεση του ιδίου εκτελέσιμου προγράμματος\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: μη έγκυρη παράμετρος: %s\n"
diff --git a/src/bin/pg_config/po/es.po b/src/bin/pg_config/po/es.po
new file mode 100644
index 0000000..7d1cbbd
--- /dev/null
+++ b/src/bin/pg_config/po/es.po
@@ -0,0 +1,289 @@
+# pg_config spanish translation
+#
+# Copyright (c) 2004-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Alvaro Herrera <alvherre@alvh.no-ip.org>, 2004-2013
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:47+0000\n"
+"PO-Revision-Date: 2022-10-20 09:06+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.2\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "no registrado"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "no se pudo identificar el directorio actual: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "el binario «%s» no es válido"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "no se pudo leer el binario «%s»"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "no se pudo encontrar un «%s» para ejecutar"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "no se pudo cambiar al directorio «%s»: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "no se pudo leer el enlace simbólico «%s»: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falló: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s provee información sobre la versión instalada de PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPCIÓN]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Opciones:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir muestra la ubicación de ejecutables de usuario\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir muestra la ubicación de archivos de documentación\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir muestra la ubicación de archivos de documentación HTML\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir muestra la ubicación de archivos de encabezados C\n"
+" de las interfaces cliente\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr ""
+" --pkgincludedir muestra la ubicación de otros archivos de\n"
+" encabezados C\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr ""
+" --includedir-server muestra la ubicación de archivos de encabezados C\n"
+" del servidor\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr ""
+" --libdir muestra la ubicación de bibliotecas\n"
+" de código objeto\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir muestra la ubicación de módulos para carga dinámica\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr ""
+" --localedir muestra la ubicación de archivos de soporte de\n"
+" configuraciones locales\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir muestra la ubicación de páginas de manual\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr ""
+" --sharedir muestra la ubicación de archivos de soporte\n"
+" independientes de arquitectura\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr ""
+" --sysconfdir muestra la ubicación de archivos de configuración\n"
+" global del sistema\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr ""
+" --pgxs muestra la ubicación del archivo makefile\n"
+" para extensiones\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure muestra las opciones que se dieron a «configure»\n"
+" cuando PostgreSQL fue construido\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc muestra el valor de CC cuando PostgreSQL fue construido\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cppflags muestra el valor de CPPFLAGS cuando PostgreSQL fue\n"
+" construido\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags muestra el valor de CFLAGS cuando PostgreSQL fue\n"
+" construido\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags_sl muestra el valor de CFLAGS_SL cuando PostgreSQL fue\n"
+" construido\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags muestra el valor de LDFLAGS cuando PostgreSQL fue\n"
+" construido\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags_ex muestra el valor de LDFLAGS_EX cuando PostgreSQL fue\n"
+" construido\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags_sl muestra el valor de LDFLAGS_SL cuando PostgreSQL fue\n"
+" construido\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr ""
+" --libs muestra el valor de LIBS cuando PostgreSQL fue\n"
+" construido\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version muestra la versión de PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help muestra esta ayuda, luego sale\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Si no se pasa ningún argumento, se muestra toda la información conocida\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Reporte errores a <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Use «%s --help» para mayor información.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: no se pudo encontrar el ejecutable propio\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: el argumento no es válido: %s\n"
diff --git a/src/bin/pg_config/po/fr.po b/src/bin/pg_config/po/fr.po
new file mode 100644
index 0000000..0fb56a7
--- /dev/null
+++ b/src/bin/pg_config/po/fr.po
@@ -0,0 +1,325 @@
+# LANGUAGE message translation file for pg_config
+# Copyright (C) 2004-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_config (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2004-2009.
+# Stéphane Schildknecht <stephane.schildknecht@dalibo.com>, 2009.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2010-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-12 05:16+0000\n"
+"PO-Revision-Date: 2022-04-12 17:29+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "non enregistré"
+
+#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "n'a pas pu identifier le répertoire courant : %m"
+
+#: ../../common/exec.c:155
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binaire « %s » invalide"
+
+#: ../../common/exec.c:205
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "n'a pas pu lire le binaire « %s »"
+
+#: ../../common/exec.c:213
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "n'a pas pu trouver un « %s » à exécuter"
+
+#: ../../common/exec.c:269 ../../common/exec.c:308
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "n'a pas pu modifier le répertoire par « %s » : %m"
+
+#: ../../common/exec.c:286
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "n'a pas pu lire le lien symbolique « %s » : %m"
+
+#: ../../common/exec.c:409
+#, c-format
+msgid "%s() failed: %m"
+msgstr "échec de %s() : %m"
+
+#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s fournit des informations sur la version installée de PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPTION]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Options :\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir affiche l'emplacement des exécutables utilisateur\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir affiche l'emplacement des fichiers de documentation\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr ""
+" --htmldir affiche l'emplacement des fichiers de documentation HTML\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir affiche l'emplacement des fichiers d'en-tête C\n"
+" des interfaces client\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr ""
+" --pkgincludedir affiche l'emplacement des autres fichiers d'en-tête C\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr ""
+" --includedir-server affiche l'emplacement des fichiers d'en-tête C du\n"
+" serveur\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir affiche l'emplacement des bibliothèques\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr ""
+" --pkglibdir affiche l'emplacement des modules chargeables\n"
+" dynamiquement\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr ""
+" --localedir affiche l'emplacement des fichiers de support de la\n"
+" locale\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir affiche l'emplacement des pages man\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr ""
+" --sharedir affiche l'emplacement des fichiers de support\n"
+" indépendants de l'architecture\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr ""
+" --sysconfdir affiche l'emplacement des fichiers de configuration\n"
+" globaux du système\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs affiche l'emplacement du makefile des extensions\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure affiche les options passées au script « configure »\n"
+" lors de la construction de PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr ""
+" --cc affiche la valeur de CC utilisée lors de la\n"
+" construction de PostgreSQL\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cppflags affiche la valeur de CPPFLAGS utilisée lors de la\n"
+" construction de PostgreSQL\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags affiche la valeur de CFLAGS utilisée lors de la\n"
+" construction de PostgreSQL\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags_sl affiche la valeur de CFLAGS_SL utilisée lors de la\n"
+" construction de PostgreSQL\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags affiche la valeur de LDFLAGS utilisée à lors de la\n"
+" construction de PostgreSQL\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags_ex affiche la valeur de LDFLAGS_EX utilisée lors de la\n"
+" construction de PostgreSQL\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags_sl affiche la valeur de LDFLAGS_SL utilisée lors de la\n"
+" construction de PostgreSQL\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr ""
+" --libs affiche la valeur de LIBS utilisée lors de la\n"
+" construction de PostgreSQL\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version affiche la version de PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Sans argument, tous les éléments connus sont affichés.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapporter les bogues à <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Essayer « %s --help » pour plus d'informations.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s : n'a pas pu trouver l'exécutable du programme\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s : argument invalide : %s\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide puis quitte\n"
+
+#~ msgid "child process exited with unrecognized status %d"
+#~ msgstr "le processus fils a quitté avec un statut %d non reconnu"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "le processus fils a été terminé par le signal %d"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "le processus fils a été terminé par le signal %s"
+
+#~ msgid "child process was terminated by exception 0x%X"
+#~ msgstr "le processus fils a été terminé par l'exception 0x%X"
+
+#~ msgid "child process exited with exit code %d"
+#~ msgstr "le processus fils a quitté avec le code de sortie %d"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "n'a pas pu accéder au répertoire « %s »"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "n'a pas pu lire le lien symbolique « %s »"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "n'a pas pu changer le répertoire par « %s » : %s"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "échec de pclose : %m"
diff --git a/src/bin/pg_config/po/he.po b/src/bin/pg_config/po/he.po
new file mode 100644
index 0000000..c8d2ab9
--- /dev/null
+++ b/src/bin/pg_config/po/he.po
@@ -0,0 +1,316 @@
+# Hebrew message translation file for pg_config
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Michael Goldberg <mic.goldbrg@gmail.com>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-05-16 22:38+0300\n"
+"PO-Revision-Date: 2017-05-16 22:56+0300\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.2\n"
+"Last-Translator: Michael Goldberg <mic.goldbrg@gmail.com>, 2017.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Language: he_IL\n"
+
+#: ../../common/config_info.c:131 ../../common/config_info.c:139
+#: ../../common/config_info.c:147 ../../common/config_info.c:155
+#: ../../common/config_info.c:163 ../../common/config_info.c:171
+#: ../../common/config_info.c:179 ../../common/config_info.c:187
+#: ../../common/config_info.c:195
+msgid "not recorded"
+msgstr "לא הוקלט"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "לא יוכל לזהות את הספריה הנוכחית: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "בינארי לא חוקי \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "לא ניתן לקרוא בינארי \"%s\""
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "לא ניתן למצוא \"%s\" לביצוע"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "לא לשנות לשנות ספריות ל \"%s\": %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "לא ניתן לקרוא את הקישור הסימבולי \"%s\""
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "נכשלpclose : %s"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"תכנית %s מספק מידע אודות הגירסה המותקנת של PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "שימוש:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPTION]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "אפשרויות:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr ""
+" --bindir\n"
+"להציג את המיקום של קבצי פעלה של משתמש\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr ""
+" --docdir\n"
+"להציג את המיקום של קבצי תיעוד\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr ""
+" --htmldir\n"
+"להציג את המיקום של קבצי תיעוד HTML\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir\n"
+"להציג את המיקום של קבצי כותרת C של ממשקי הלקוח\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr ""
+" --pkgincludedir\n"
+"להציג את המיקום של קבצי כותרות אחרות C\n"
+
+#: pg_config.c:84
+#, c-format
+msgid ""
+" --includedir-server show location of C header files for the server\n"
+msgstr ""
+" --includedir-שרת\n"
+"להציג את המיקום של קבצי כותרות C עבור השרת\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr ""
+" --libdir\n"
+"להציג מיקום של ספריות קוד אובייקט\n"
+
+#: pg_config.c:86
+#, c-format
+msgid ""
+" --pkglibdir show location of dynamically loadable modules\n"
+msgstr ""
+" --pkglibdir\n"
+"להציג את המיקום של מודולים נטענים באופן דינמי\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr ""
+" --localedir\n"
+"להציג מיקום של קבצי תמיכה מקומיים\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr ""
+" --mandir\n"
+"להציג את המיקום של דפי הסבר (manual pages)\n"
+
+#: pg_config.c:89
+#, c-format
+msgid ""
+" --sharedir show location of architecture-independent support "
+"files\n"
+msgstr ""
+" --sharedir\n"
+"להציג את מיקום של קבצי תמיכה אשר לא תלויים בארכיטקטורה\n"
+
+#: pg_config.c:90
+#, c-format
+msgid ""
+" --sysconfdir show location of system-wide configuration files\n"
+msgstr ""
+" --sysconfdir\n"
+"להציג מיקום של קבצי תצורה של המערכת כולה\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr ""
+" --pgxs\n"
+"להציג מיקום של makefile של הרחבה\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure\n"
+"להראות את האפשרויות שניתנו לסקירפט \"configure\", כאשר PostgreSQL נבנה\n"
+
+#: pg_config.c:94
+#, c-format
+msgid ""
+" --cc show CC value used when PostgreSQL was built\n"
+msgstr ""
+" -cc\n"
+"להראות ערך CC אשר היה בשימוש כאשר PostgreSQL נבנה\n"
+
+#: pg_config.c:95
+#, c-format
+msgid ""
+" --cppflags show CPPFLAGS value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --cppflags\n"
+"להראות ערך CPPFLAGS אשר היה בשימוש כאשר PostgreSQL נבנה\n"
+
+#: pg_config.c:96
+#, c-format
+msgid ""
+" --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags\n"
+"CFLAGS_SL\n"
+"להראות ערך CFLAGS אשר היה בשימוש כאשר PostgreSQL נבנה\n"
+"\n"
+
+#: pg_config.c:97
+#, c-format
+msgid ""
+" --cflags_sl show CFLAGS_SL value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --cflags_sl\n"
+"להראות ערך CFLAGS_SL אשר היה בשימוש כאשר PostgreSQL נבנה\n"
+
+#: pg_config.c:98
+#, c-format
+msgid ""
+" --ldflags show LDFLAGS value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags\n"
+"להראות ערך LDFLAGS אשר היה בשימוש כאשר PostgreSQL נבנה\n"
+
+#: pg_config.c:99
+#, c-format
+msgid ""
+" --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags_ex\n"
+"להראות ערך LDFLAGS_EX אשר היה בשימוש כאשר PostgreSQL נבנה\n"
+
+#: pg_config.c:100
+#, c-format
+msgid ""
+" --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags_sl\n"
+"להראות ערך LDFLAGS_SL אשר היה בשימוש כאשר PostgreSQL נבנה\n"
+
+#: pg_config.c:101
+#, c-format
+msgid ""
+" --libs show LIBS value used when PostgreSQL was built\n"
+msgstr ""
+" --libs\n"
+"להראות ערך LIBS אשר היה בשימוש כאשר PostgreSQL נבנה\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr ""
+" -version\n"
+"להראות את הגירסה PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr ""
+" -?\n"
+" --help\n"
+"להציג עזרה זו, ולאחר מכן לצאת\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"ללא ארגומנטים, מוצגים כל הפריטים הידועים.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "לדווח על באגים ל <pgsql-bugs@postgresql.org>\n"
+
+#: pg_config.c:111
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "נסה '%s --help' לקבלת מידע נוסף.\n"
+
+#: pg_config.c:153
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: לא ניתן למצוא תוכנית הפעלה משלו\n"
+
+#: pg_config.c:180
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "תכנית %s: ארגומנט לא חוקי: %s\n"
diff --git a/src/bin/pg_config/po/it.po b/src/bin/pg_config/po/it.po
new file mode 100644
index 0000000..17ddf95
--- /dev/null
+++ b/src/bin/pg_config/po/it.po
@@ -0,0 +1,297 @@
+#
+# pg_config.po
+# Italian message translation file for pg_config
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+# Copyright (C) 2010, Associazione Culturale ITPUG
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017
+# Cosimo D'Arcangelo <cosimo.darcangelo@itpug.org> 2010
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:17+0000\n"
+"PO-Revision-Date: 2022-09-26 15:09+0200\n"
+"Last-Translator: Daniele Varrazzo <daniele.varrazzo@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "non registrato"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "identificazione della directory corrente fallita: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binario non valido \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "lettura del binario \"%s\" fallita"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "programma \"%s\" da eseguire non trovato"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "spostamento nella directory \"%s\" fallito: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "lettura del link simbolico \"%s\" fallita: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() non riuscito: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "memoria esaurita"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s fornisce informazioni circa la versione di PostgreSQL installata.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPZIONE]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Opzioni:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir mostra la posizione degli eseguibili utente\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir mostra la posizione dei file di documentazione\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir mostra la posizione dei file di documentazione HTML\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir mostra la posizione dei file header C delle interfacce\n"
+" client\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir mostra la posizione degli altri file header C\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server mostra la posizione dei file header C per il server\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir mostra la posizione delle librerie codice oggetto\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir mostra la posizione dei moduli caricabili dinamicamente\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir mostra la posizione dei file di supporto locale\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir mostra la posizione delle pagine del manuale\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir mostra la posizione dei file di supporto non dipendenti dall'architettura\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr ""
+" --sysconfdir mostra la posizione dei file di configurazione\n"
+" di sistema\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs mostra la posizione delle estensioni makefile\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure mostra le opzioni fornite allo script \"configure\"\n"
+" alla compilazione di PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr ""
+" --cc mostra il valore di CC usato alla compilazione di\n"
+" PostgreSQL\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cppflags mostra il valore di CPPFLAGS usato alla compilazione\n"
+" di PostgreSQL\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags mostra il valore di CFLAGS usato alla compilazione\n"
+" di PostgreSQL\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags_sl mostra il valore di CFLAGS_SL usato alla compilazione\n"
+" di PostgreSQL\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags mostra il valore di LDFLAGS usato alla compilazione\n"
+" di PostgreSQL\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags_ex mostra il valore di LDFLAGS_EX usato alla compilazione\n"
+" di PostgreSQL\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags_sl mostra il valore di LDFLAGS_SL usato alla compilazione\n"
+" di PostgreSQL\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr ""
+" --libs mostra il valore LIBS usato alla compilazione di\n"
+" PostgreSQL\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version mostra la versione di PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Senza argomenti, vengono mostrati tutti gli elementi conosciuti.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Segnala i bug a <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s pagina iniziale: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: il proprio programma eseguibile non è stato trovato\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: parametro non valido: %s\n"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "spostamento nella directory \"%s\" fallito: %s"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "lettura del link simbolico \"%s\" fallita"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "pclose fallita: %s"
diff --git a/src/bin/pg_config/po/ja.po b/src/bin/pg_config/po/ja.po
new file mode 100644
index 0000000..fc164d6
--- /dev/null
+++ b/src/bin/pg_config/po/ja.po
@@ -0,0 +1,293 @@
+# Japanese message translation file for pg_config
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# Shigehiro Honda <fwif0083@mb.infoweb.ne.jp>, 2005
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-09 12:00+0900\n"
+"PO-Revision-Date: 2022-05-10 13:47+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "記録されていません"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "カレントディレクトリを識別できませんでした: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "バイナリ\"%s\"は無効です"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "バイナリ\"%s\"を読み取れませんでした"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "実行する\"%s\"がありませんでした"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "ディレクトリ\"%s\"に移動できませんでした: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "シンボリックリンク\"%s\"を読めませんでした: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s()が失敗しました: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "メモリ不足です"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%sはインストールされたバージョンのPostgreSQLに関する情報を提供します。\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [オプション]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "オプション:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir ユーザー実行ファイルの場所を表示\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir 文書ファイルの場所を表示\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir html文書ファイルの場所を表示\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr " --includedir クライアントインタフェースのCヘッダファイルの場所を表示\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir その他のCヘッダファイルの場所を表示\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server サーバー用Cヘッダファイルの場所を表示\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir オブジェクトコードライブラリの場所を表示\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir 動的ロード可能モジュールの場所を表示\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir ロケールサポートファイルの場所を表示\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir マニュアルページの場所を表示\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir アーキテクチャ非依存のサポートファイルの場所を表示\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir システム全体の設定ファイルの場所を表示\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs 機能拡張のmakefileの場所を表示\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure PostgreSQL構築時に\"configure\"スクリプトに与えた\n"
+" オプションを表示\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc PostgreSQL構築時に使用したCCの値を表示\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags PostgreSQL構築時に使用したCPPFLAGSの値を表示\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags PostgreSQL構築時に使用したCFLAGSの値を表示\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl PostgreSQL構築時に使用したCFLAGS_SLの値を表示\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags PostgreSQL構築時に使用したLDFLAGSの値を表示\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex PostgreSQL構築時に使用したLDFLAGS_EXの値を表示\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl PostgreSQL構築時に使用したLDFLAGS_SLの値を表示\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs PostgreSQL構築時に使用したLIBSの値を表示\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version PostgreSQLのバージョンを表示\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"引数がない場合、既知の項目をすべて表示します。\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "バグは<%s>に報告してください。\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "詳細は\"%s --help\"を行ってください\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 実行ファイル自体がありませんでした\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: 無効な引数です: %s\n"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "pcloseが失敗しました: %m"
+
+#~ msgid "could not identify current directory: %s"
+#~ msgstr "現在のディレクトリを認識できませんでした: %s"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "ディレクトリ\"%s\"に移動できませんでした: %s"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "シンボリックリンク\"%s\"を読み取ることができませんでした"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "pcloseが失敗しました: %s"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "子プロセスがシグナル%dで終了しました"
+
+#~ msgid "child process exited with unrecognized status %d"
+#~ msgstr "子プロセスが未知のステータス%dで終了しました"
+
+#~ msgid "child process exited with exit code %d"
+#~ msgstr "子プロセスが終了コード%dで終了しました"
+
+#~ msgid "child process was terminated by exception 0x%X"
+#~ msgstr "子プロセスが例外0x%Xで終了しました"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "子プロセスがシグナル%sで終了しました"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "ディレクトリ\"%s\"に移動できませんでした"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help ヘルプを表示し、終了します\n"
diff --git a/src/bin/pg_config/po/ka.po b/src/bin/pg_config/po/ka.po
new file mode 100644
index 0000000..269c8dc
--- /dev/null
+++ b/src/bin/pg_config/po/ka.po
@@ -0,0 +1,313 @@
+# Georgian message translation file for pg_config
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_config (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:47+0000\n"
+"PO-Revision-Date: 2022-07-04 06:47+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "ჩაწერილი არაა"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "მიმდინარე საქაღალდის იდენტიფიკაციის პრობლემა: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "არასწორი ბინარული ფაილი \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "ბინარული ფაილის (%s) წაკითხვის შეცდოა"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "გასაშვებად ფაილის \"%s\" პოვნა შეუძლებელია"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "საქაღალდის %s-ზე შეცვლის შეცდომა: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "სიმბოლური ბმის \"%s\" წაკითხვის შეცდომა: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s()-ის შეცდომა: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "არასაკმარისი მეხსიერება"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s ინფორმაცია PostgreSQL-ის დაყენებული ვერსიის შესახებ.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "გამოყენება:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [პარამეტრი]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "პარამეტრები:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr ""
+" --bindir მომხმარებლების გამშვები ფაილების მდებარეობის "
+"ჩვენება\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr ""
+" --docdir დოკუმენტაციის ფაილების მდებარეობის ჩვენება\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr ""
+" --htmldir HTML დოკუმენტაციის ფაილების მდებარეობის ჩვენება\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir კლიენტსი ინტერფეისის C თავსართის ფაილების "
+"მდებარეობის\n"
+" ჩვენება\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr ""
+" --pkgincludedir დარჩენილი C თავსართის ფაილების მდებარეობის "
+"ჩვენება\n"
+
+#: pg_config.c:84
+#, c-format
+msgid ""
+" --includedir-server show location of C header files for the server\n"
+msgstr ""
+" --includedir-server სერვერის C-ის თავსართის ფაილების მდებარეობის "
+"ჩვენება\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr ""
+" --libdir ობიექტის კოდის ბიბლიოთეკების მდებარეობის ჩვენება\n"
+
+#: pg_config.c:86
+#, c-format
+msgid ""
+" --pkglibdir show location of dynamically loadable modules\n"
+msgstr ""
+" --pkglibdir დინამიკურად ჩატვირთვადი მოდულების მდებარეობის "
+"ჩვენება\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr ""
+" --localedir ენის მხარდაჭერის ფაილების მდებარეობის ჩვენება\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr ""
+" --mandir სახელმძღვანელოს ფაილების მდებარეობის ჩვენება\n"
+
+#: pg_config.c:89
+#, c-format
+msgid ""
+" --sharedir show location of architecture-independent support "
+"files\n"
+msgstr ""
+" --sharedir არქიტექტურისგან დამოუკიდებელი მხარდაჭერის "
+"ფაილების მდებარეობის ჩვენება\n"
+
+#: pg_config.c:90
+#, c-format
+msgid ""
+" --sysconfdir show location of system-wide configuration files\n"
+msgstr ""
+" --sysconfdir სისტემური კონფიგურაციის ფაილების მდებარეობის "
+"ჩვენება\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr ""
+" --pgxs გაფართოების makefile-ის მდებარეობის ჩვენება\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure PostgreSQL-ის აგებისას \"configure\" სკრიპტისთვის "
+"გადაცემული\n"
+" პარამეტრების ჩვენება\n"
+
+#: pg_config.c:94
+#, c-format
+msgid ""
+" --cc show CC value used when PostgreSQL was built\n"
+msgstr ""
+" --cc PostgreSQL-ის აგებისას გამოყენებული CC-ის "
+"მნიშვნელობის ჩვენება\n"
+
+#: pg_config.c:95
+#, c-format
+msgid ""
+" --cppflags show CPPFLAGS value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --cppflags PostgreSQL-ის აგებისას გამოყენებული CPPFLAGS-ის "
+"ჩვენება\n"
+
+#: pg_config.c:96
+#, c-format
+msgid ""
+" --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags PostgreSQL-ის აგებისას გამოყენებული CFLAGS-ის "
+"ჩვენება\n"
+
+#: pg_config.c:97
+#, c-format
+msgid ""
+" --cflags_sl show CFLAGS_SL value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --cflags_sl PostgreSQL-ის აგებისას გამოყენებული CFLAGS_SL-ის "
+"ჩვენება\n"
+
+#: pg_config.c:98
+#, c-format
+msgid ""
+" --ldflags show LDFLAGS value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags PostgreSQL -ის აგებისას გამოყენებული LDFLAGS-ის "
+"მნიშვნელობა\n"
+
+#: pg_config.c:99
+#, c-format
+msgid ""
+" --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags_ex PostgreSQL -ის აგებისას გამოყენებული LDFLAGS_EX-"
+"ის მნიშვნელობა\n"
+
+#: pg_config.c:100
+#, c-format
+msgid ""
+" --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags_sl PostgreSQL-ის აგებისას გამოყენებული LDFLAGS_SL-"
+"ის ჩვენება\n"
+
+#: pg_config.c:101
+#, c-format
+msgid ""
+" --libs show LIBS value used when PostgreSQL was built\n"
+msgstr ""
+" --libs PostgreSQL-ის აგებისას გამოყენებული LIBS-ის "
+"ჩვენება\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version PostgreSQL-ის ვერსიის ჩვენება\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"თუ არგუმენტებს არ მიუთითებთ, ნაჩვენები იქნება ყველა ცნობილი ჩანაწერი.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "შეცდომების შესახებ მიწერეთ: <%s>\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: საკუთარი პროგრამის გამშვები ფაილის პოვნა შეუძლებელია\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: არასწორი არგუმენტი: %s\n"
diff --git a/src/bin/pg_config/po/ko.po b/src/bin/pg_config/po/ko.po
new file mode 100644
index 0000000..f85bf80
--- /dev/null
+++ b/src/bin/pg_config/po/ko.po
@@ -0,0 +1,279 @@
+# Korean message translation file for PostgreSQL pg_config
+# Ioseph Kim <ioseph@uri.sarang.net>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:47+0000\n"
+"PO-Revision-Date: 2023-04-05 18:06+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean team <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "기록되어 있지 않음"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "현재 디렉터리를 알 수 없음: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "잘못된 바이너리 파일: \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "\"%s\" 바이너리 파일을 읽을 수 없음"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "실행할 \"%s\" 파일 찾을 수 없음"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "\"%s\" 디렉터리로 바꿀 수 없음: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "\"%s\" 심벌릭 링크를 읽을 수 없음: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 실패: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "메모리 부족"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s 프로그램은 설치된 PostgreSQL 버전에 대한 정보를 제공합니다.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPTION]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "옵션들:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr ""
+" --bindir 사용자가 실행할 수 있는 응용프로그램들이 있는\n"
+" 경로를 보여줌\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir 문서 파일들이 있는 위치를 보여줌\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir HTML 문서 파일의 위치를 보여줌\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir 클라이언트 인터페이스의 C 헤더 파일이 있는 경로를\n"
+" 보여줌\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir 기타 C 헤더 파일 위치를 보여줌\n"
+
+#: pg_config.c:84
+#, c-format
+msgid ""
+" --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server 서버용 C 헤더 파일 경로를 보여줌\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir 라이브러리 경로를 보여줌\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir 동적 호출 가능 모듈의 경로를 보여줌\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir 로케인 지원 파일들의 위치를 보여줌\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir 맨페이지 위치를 보여줌\n"
+
+#: pg_config.c:89
+#, c-format
+msgid ""
+" --sharedir show location of architecture-independent support "
+"files\n"
+msgstr ""
+" --sharedir 각종 공용으로 사용되는 share 파일들의 위치를 보여줌\n"
+
+#: pg_config.c:90
+#, c-format
+msgid ""
+" --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir 시스템 전역 환경 설정 파일의 위치를 보여줌\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs 확장 makefile 경로를 보여줌\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure PostgreSQL 만들 때 사용한 \"configure\" 스크립트의\n"
+" 옵션들을 보여줌\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc PostgreSQL 만들 때 사용된 CC 값을 보여줌\n"
+
+#: pg_config.c:95
+#, c-format
+msgid ""
+" --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags PostgreSQL 만들 때 지정한 CPPFLAGS 값\n"
+
+#: pg_config.c:96
+#, c-format
+msgid ""
+" --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags PostgreSQL 만들 때, 사용한 CFLAGS 값을 보여줌\n"
+
+#: pg_config.c:97
+#, c-format
+msgid ""
+" --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl PostgreSQL 만들 때 지정한 CFLAGS_SL 값\n"
+
+#: pg_config.c:98
+#, c-format
+msgid ""
+" --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags PostgreSQL 만들 때, 사용한 LDFLAGS 값을 보여줌\n"
+
+#: pg_config.c:99
+#, c-format
+msgid ""
+" --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags_ex PostgreSQL 만들 때, 사용한 LDFLAGS_EX 값을 보여줌\n"
+
+#: pg_config.c:100
+#, c-format
+msgid ""
+" --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was "
+"built\n"
+msgstr " --ldflags_sl PostgreSQL 만들 때 지정한 LDFLAGS_SL 값\n"
+
+#: pg_config.c:101
+#, c-format
+msgid ""
+" --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs PostgreSQL 만들 때, 사용한 LIBS 값을 보여줌\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version PostgreSQL 버전을 보여줌\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"명령행 인수가 없으면 모든 항목에 대한 정보를 보여 줌\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "문제점 보고 주소: <%s>\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "보다 자세한 정보가 필요하면, \"%s --help\"\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 실행 가능한 프로그램을 찾을 수 없습니다\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: 잘못된 인수: %s\n"
+
+#, c-format
+#~ msgid "pclose failed: %m"
+#~ msgstr "pclose 실패: %m"
diff --git a/src/bin/pg_config/po/pl.po b/src/bin/pg_config/po/pl.po
new file mode 100644
index 0000000..f57a4c4
--- /dev/null
+++ b/src/bin/pg_config/po/pl.po
@@ -0,0 +1,273 @@
+# PG_CONFIG Translated Messages into the Polish Language
+# Copyright (c) 2005 toczek, xxxtoczekxxx@wp.pl
+# Distributed under the same licensing terms as PostgreSQL itself.
+# Begina Felicysym <begina.felicysym@wp.eu>, 2011, 2012, 2013.
+# grzegorz <begina.felicysym@wp.eu>, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL 9.1)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2016-07-03 03:13+0000\n"
+"PO-Revision-Date: 2016-07-03 17:31+0200\n"
+"Last-Translator: grzegorz <begina.felicysym@wp.eu>\n"
+"Language-Team: begina.felicysym@wp.eu\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: ../../common/config_info.c:131 ../../common/config_info.c:139
+#: ../../common/config_info.c:147 ../../common/config_info.c:155
+#: ../../common/config_info.c:163 ../../common/config_info.c:171
+#: ../../common/config_info.c:179 ../../common/config_info.c:187
+#: ../../common/config_info.c:195
+#| msgid "not recorded\n"
+msgid "not recorded"
+msgstr "niezarejestrowane"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "nie można zidentyfikować bieżącego katalogu: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "niepoprawny binarny \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "nie można odczytać binarnego \"%s\""
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "nie znaleziono \"%s\" do wykonania"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "nie można zmienić katalogu na \"%s\": %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "nie można odczytać odwołania symbolicznego \"%s\""
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "pclose nie powiodło się: %s"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s dostarcza informacji na temat zainstalowanej wersji PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Składnia:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPCJA]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Opcje:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir pokaż lokalizację plików użytkownika\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir pokaż położenie plików dokumentacji\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir pokaż lokalizację plików HTML dokumentacji\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir pokaż lokalizację nagłówków C interfejsu \n"
+" użytkownika\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir pokaż położenie innych plików nagłówkowych C\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server pokaż lokalizację nagłówków C dla serwera\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir pokaż lokalizację bibliotek obiektów\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir pokaż lokalizację dynamicznych modułów\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir pokaż położenie plików obsługi lokalizacji\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir pokaż położenie plików podręcznika\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr ""
+" --sharedir pokaż położenie niezależnych od architektury\n"
+" plików obsługi\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir pokaż położenie ogólnosystemowych plików konfiguracyjnych\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs pokaż lokalizację makefile rozszerzeń\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure pokaż opcje użyte przy skrypcie \"configure\" \n"
+" podczas budowania PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc pokaż wartość CC użytą podczas budowania PostgreSQL\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags pokaż wartość CPPFLAGS użytą podczas budowania PostgreSQL\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags pokaż wartość CFLAGS użytą podczas budowania PostgreSQL\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl pokaż wartość CFLAGS_SL użytą podczas budowania PostgreSQL\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags pokaż wartość LDFLAGS użytą podczas budowania PostgreSQL\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex pokaż wartość LDFLAGS_EX użytą podczas budowania PostgreSQL\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl pokaż wartość LDFLAGS_SL użytą podczas budowania PostgreSQL\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs pokaż wartość LIBS użytą podczas budowania PostgreSQL\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version pokaż wersję PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help pokaż tą pomoc i zakończ działanie\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Bez argumentów są pokazane wszystkie znane elementy.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "Błędy proszę przesyłać na adres <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_config.c:111
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Spróbuj \"%s --help\" aby uzyskać więcej informacji.\n"
+
+#: pg_config.c:153
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: nie można znaleźć programu wykonywalnego\n"
+
+#: pg_config.c:180
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: niepoprawny parametr: %s\n"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "nie można zmienić katalogu na \"%s\""
+
+#~ msgid "child process exited with exit code %d"
+#~ msgstr "proces potomny zakończył działanie z kodem %d"
+
+#~ msgid "child process was terminated by exception 0x%X"
+#~ msgstr "proces potomny został zatrzymany przez wyjątek 0x%X"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "proces potomny został zatrzymany przez sygnał %s"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "proces potomny został zatrzymany przez sygnał %d"
+
+#~ msgid "child process exited with unrecognized status %d"
+#~ msgstr "proces potomny zakończył działanie z nieznanym stanem %d"
diff --git a/src/bin/pg_config/po/pt_BR.po b/src/bin/pg_config/po/pt_BR.po
new file mode 100644
index 0000000..4ab4c93
--- /dev/null
+++ b/src/bin/pg_config/po/pt_BR.po
@@ -0,0 +1,259 @@
+# Brazilian Portuguese message translation file for pg_config
+#
+# Copyright (C) 2004-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Euler Taveira <euler@eulerto.com>, 2004-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-10 18:27-0300\n"
+"PO-Revision-Date: 2005-10-04 22:15-0300\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "não informado"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "não pôde identificar diretório atual: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binário \"%s\" é inválido"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "não pôde ler o binário \"%s\""
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "não pôde encontrar o \"%s\" para executá-lo"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "não pôde mudar diretório para \"%s\": %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "não pôde ler link simbólico \"%s\": %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falhou: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "sem memória"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s fornece informação sobre a versão do PostgreSQL instalada.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPÇÃO]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Opções:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir mostra local dos executáveis\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir mostra local dos arquivos da documentação\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir mostra local dos arquivos HTML da documentação\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir mostra local dos arquivos de cabeçalho das interfaces\n"
+" com cliente\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir mostra local dos outros arquivos de cabeçalho\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server mostra local dos arquivos de cabeçalho do servidor\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir mostra local das bibliotecas objeto\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir mostra local dos módulos carregáveis dinamicamente\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir mostra local dos arquivos de suporte a configurações regionais\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir mostra local das páginas de manual\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir mostra local dos arquivos de suporte independentes de arquitetura\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir mostra local dos arquivos de configuração do sistema\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs mostra local do makefile extensível\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure mostra opções informadas ao script \"configure\" quando\n"
+" o PostgreSQL foi construído\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc mostra valor de CC utilizado quando PostgreSQL foi construído\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags mostra valor de CPPFLAGS utilizado quando PostgreSQL foi construído\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags mostra valor de CFLAGS utilizado quando PostgreSQL foi construído\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl mostra valor de CFLAGS_SL utilizado quando PostgreSQL foi construído\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags mostra valor de LDFLAGS utilizado quando PostgreSQL foi construído\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex mostra valor de LDFLAGS_EX utilizado quando PostgreSQL foi construído\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl mostra valor de LDFLAGS_SL utilizado quando PostgreSQL foi construído\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs mostra valor de LIBS utilizado quando PostgreSQL foi construído\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version mostra a versão do PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Sem argumentos, todos os itens serão mostrados.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Relate erros a <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Página web do %s: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Tente \"%s --help\" para obter informações adicionais.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: não pôde encontrar executável\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: argumento inválido: %s\n"
diff --git a/src/bin/pg_config/po/ru.po b/src/bin/pg_config/po/ru.po
new file mode 100644
index 0000000..4aa7a59
--- /dev/null
+++ b/src/bin/pg_config/po/ru.po
@@ -0,0 +1,320 @@
+# Russian message translation file for pg_config
+# Copyright (C) 2004-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Oleg Bartunov <oleg@sai.msu.su>, 2004.
+# Serguei A. Mokhov <mokhov@cs.concordia.ca>, 2004-2005.
+# Sergey Burladyan <eshkinkot@gmail.com>, 2009, 2012.
+# Andrey Sudnik <sudnikand@gmail.com>, 2010.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2016, 2017, 2019, 2020, 2021, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-27 14:52+0300\n"
+"PO-Revision-Date: 2021-09-04 12:15+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "не записано"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "не удалось определить текущий каталог: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "неверный исполняемый файл \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "не удалось прочитать исполняемый файл \"%s\""
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "не удалось найти запускаемый файл \"%s\""
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "не удалось перейти в каталог \"%s\": %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "не удалось прочитать символическую ссылку \"%s\": %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "ошибка в %s(): %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "нехватка памяти"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s предоставляет информацию об установленной версии PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Использование:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [ПАРАМЕТР]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Параметры:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir показать расположение исполняемых файлов\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir показать расположение файлов документации\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr ""
+" --htmldir показать расположение HTML-файлов документации\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir показать расположение файлов-заголовков (.h) для\n"
+" клиентских интерфейсов на языке C\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr ""
+" --pkgincludedir показать расположение других файлов-заголовков (.h)\n"
+
+#: pg_config.c:84
+#, c-format
+msgid ""
+" --includedir-server show location of C header files for the server\n"
+msgstr ""
+" --includedir-server показать расположение файлов-заголовков (.h) для "
+"сервера\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr ""
+" --libdir показать расположение библиотек объектного кода\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr ""
+" --pkglibdir показать расположение динамически загружаемых "
+"модулей\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr ""
+" --localedir показать расположение файлов описания локалей\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir показать расположение справочных страниц\n"
+
+#: pg_config.c:89
+#, c-format
+msgid ""
+" --sharedir show location of architecture-independent support "
+"files\n"
+msgstr ""
+" --sharedir показать расположение платформенно-независимых "
+"файлов\n"
+
+#: pg_config.c:90
+#, c-format
+msgid ""
+" --sysconfdir show location of system-wide configuration files\n"
+msgstr ""
+" --sysconfdir показать расположение общесистемных файлов "
+"конфигурации\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr ""
+" --pgxs показать расположение makefile для расширений\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure показать параметры скрипта \"configure\", с "
+"которыми\n"
+" был собран PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr ""
+" --cc показать, с каким значением CC собран PostgreSQL\n"
+
+#: pg_config.c:95
+#, c-format
+msgid ""
+" --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cppflags показать, с каким значением CPPFLAGS собран "
+"PostgreSQL\n"
+
+#: pg_config.c:96
+#, c-format
+msgid ""
+" --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags показать, с какими флагами C собран PostgreSQL\n"
+
+#: pg_config.c:97
+#, c-format
+msgid ""
+" --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags_sl показать, с каким значением CFLAGS_SL собран "
+"PostgreSQL\n"
+
+#: pg_config.c:98
+#, c-format
+msgid ""
+" --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags показать, с каким значением LDFLAGS собран "
+"PostgreSQL\n"
+
+#: pg_config.c:99
+#, c-format
+msgid ""
+" --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags_ex показать, с каким значением LDFLAGS_EX собран "
+"PostgreSQL\n"
+
+#: pg_config.c:100
+#, c-format
+msgid ""
+" --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags_sl показать, с каким значением LDFLAGS_SL собран "
+"PostgreSQL\n"
+
+#: pg_config.c:101
+#, c-format
+msgid ""
+" --libs show LIBS value used when PostgreSQL was built\n"
+msgstr ""
+" --libs показать, с каким значением LIBS собран PostgreSQL\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version показать версию PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"При запуске без аргументов выводятся все известные значения.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Об ошибках сообщайте по адресу <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Для дополнительной информации попробуйте \"%s --help\".\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: не удалось найти свой исполняемый файл\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: неверный аргумент: %s\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "child process exited with unrecognized status %d"
+#~ msgstr "дочерний процесс завершился с нераспознанным состоянием %d"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "дочерний процесс завершён по сигналу %d"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "дочерний процесс завершён по сигналу %s"
+
+#~ msgid "child process was terminated by exception 0x%X"
+#~ msgstr "дочерний процесс прерван исключением 0x%X"
+
+#~ msgid "child process exited with exit code %d"
+#~ msgstr "дочерний процесс завершился с кодом возврата %d"
diff --git a/src/bin/pg_config/po/sv.po b/src/bin/pg_config/po/sv.po
new file mode 100644
index 0000000..6421680
--- /dev/null
+++ b/src/bin/pg_config/po/sv.po
@@ -0,0 +1,257 @@
+# Swedish message translation file for pg_config.
+# Dennis Björklund <db@zigo.dhs.org>, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021.
+# Mats Erik Andersson <bsd@gisladisker.se>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-11-06 22:15+0000\n"
+"PO-Revision-Date: 2021-11-07 06:44+0100\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "ej sparad"
+
+#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "kunde inte identifiera aktuell katalog: %m"
+
+#: ../../common/exec.c:155
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "ogiltig binär \"%s\""
+
+#: ../../common/exec.c:205
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "kunde inte läsa binär \"%s\""
+
+#: ../../common/exec.c:213
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "kunde inte hitta en \"%s\" att köra"
+
+#: ../../common/exec.c:269 ../../common/exec.c:308
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "kunde inte byta katalog till \"%s\": %m"
+
+#: ../../common/exec.c:286
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "kan inte läsa symbolisk länk \"%s\": %m"
+
+#: ../../common/exec.c:409
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() misslyckades: %m"
+
+#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s ger information on den installerade versionen av PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [FLAGGA]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Flaggor:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir visa filkatalog för körbara filer\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir visa filkatalog för dokumentationsfiler\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir visa filkatalog för HTML-dokumentationsfiler\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir visa filkatalog för C-header-filerna med\n"
+" klientgränssnitt\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir visa filkatalog för C-header-filer\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server visa filkatalog för C-header-filerna till servern\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir visa filkatalog för bibliotekens objektfiler\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir visa filkatalog för dynamiskt laddade moduler\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir visa filkatalog för lokalstödsfiler\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir visa filkatalog för manualsidor\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir visa filkatalog för arkitekturoberoende filer\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir visa filkatalog för systemkonfigurationsfiler\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs visa plats för make-filen vid utvidgningar\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure dessa flaggor gavs till \"configure\"-skriptet när\n"
+" PostgreSQL byggdes\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc visa värde på CC när PostgreSQL byggdes\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags visa värde på CPPFLAGS när PostgreSQL byggdes\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags visa värde på CFLAGS när PostgreSQL byggdes\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl visa värde på CFLAGS_SL när PostgreSQL byggdes\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags visa värde på LDFLAGS när PostgreSQL byggdes\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex visa värde på LDFLAGS_EX när PostgreSQL byggdes\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl visa värde på LDFLAGS_SL när PostgreSQL byggdes\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs visa värde på LIBS när PostgreSQL byggdes\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version visa version för PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Utan argument visas alla kända värden.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapportera fel till <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Försök med \"%s --help\" för mer information.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: kunde inte hitta det egna programmets körbara fil\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: ogiltigt argument: %s\n"
diff --git a/src/bin/pg_config/po/tr.po b/src/bin/pg_config/po/tr.po
new file mode 100644
index 0000000..6a9988c
--- /dev/null
+++ b/src/bin/pg_config/po/tr.po
@@ -0,0 +1,281 @@
+# translation of pg_config-tr.po to Turkish
+# Devrim GUNDUZ <devrim@CommandPrompt.com>, 2004, 2005, 2007.
+# Nicolai Tufar <ntufar@gmail.com>, 2005, 2007.
+# Abdullah Gülner <agulner@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config-tr\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-11-27 07:44+0000\n"
+"PO-Revision-Date: 2021-09-16 09:40+0200\n"
+"Last-Translator: Abdullah Gülner\n"
+"Language-Team: Turkish <ceviri@postgresql.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: ../../common/config_info.c:130 ../../common/config_info.c:138
+#: ../../common/config_info.c:146 ../../common/config_info.c:154
+#: ../../common/config_info.c:162 ../../common/config_info.c:170
+#: ../../common/config_info.c:178 ../../common/config_info.c:186
+#: ../../common/config_info.c:194
+msgid "not recorded"
+msgstr "kayıtlı değil"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "geçerli dizin tespit edilemedi: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "geçersiz ikili (binary) \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "\"%s\" ikili (binary) dosyası okunamadı"
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "\"%s\" çalıştırmak için bulunamadı"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "çalışma dizini \"%s\" olarak değiştirilemedi: %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "symbolic link \"%s\" okuma hatası"
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "pclose başarısız oldu: %s"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s kurulu PostgreSQL sürümü hakkında bilgi verir.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [SEÇENEK]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Seçenekler:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir kullanıcı tarafından çalıştırılabilir dosyaların yerlerini göster\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir dokümantasyon dosyaların yerini göster\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --docdir HTML belge dosyalarının yerini göster\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir İstemci arabirimlerinin C başlık dosyalarının yerlerini\n"
+" göster\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir diğer C başlık dosyalarının yerlerini göster\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server Sunucu için C başlık dosyalarının yerlerini göster\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir nesne kod kütüphanelerinin yerini göster\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir Dinamik olarak yüklenebilen modüllerin yerlerini göster\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir yerel dil destek dosyalarının yerini göster\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir kullanıcı kılavuzu (man) dosyaların yerini göster\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir platform bağımsız dosyaların yerini göster\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir sistem geneli parametre dosyaların yerini göster\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs extension makefile dosyasının yerini göster\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure PostgreSQL yapılandırıldığında \"configure\" betiğine verilen\n"
+" seçeneklerin listesini göster\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --ldflags PostgreSQL derleme sırasında kullanılan CC değerini göster\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags PostgreSQL derleme sırasında kullanılan CPPFLAGS değerini göster\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags PostgreSQL derleme sırasında kullanılan CFLAGS değerini göster\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags PostgreSQL derleme sırasında kullanılan CFLAGS_SL değerini göster\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags PostgreSQL derleme sırasında kullanılan LDFLAGS değerini göster\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex PostgreSQL derlemesi sırasında kullanılan LDFLAGS_EX değerini göster\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags PostgreSQL derleme sırasında kullanılan LDFLAGS_SL değerini göster\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs PostgreSQL derleme sırasında kullanılan LIBS değerini göster\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version PostgreSQL sürümünü göster ve çık\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Parametre verilmediyse, tüm değerleri gösterilmektedir.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "Hataları <pgsql-bugs@postgresql.org> adresine bildirebilirsiniz.\n"
+
+#: pg_config.c:111
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için\"%s --help\" parametresini kullanabilirsiniz\n"
+
+#: pg_config.c:153
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: çalıştırılabilir dosya bulunamadı\n"
+
+#: pg_config.c:180
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: geçersiz argüman: %s\n"
+
+#~ msgid ""
+#~ " %s [ OPTION ... ]\n"
+#~ "\n"
+#~ msgstr ""
+#~ " %s [ SEÇENEK ... ]\n"
+#~ "\n"
+
+#~ msgid "child process exited with unrecognized status %d"
+#~ msgstr "alt süreç %d bilinmeyen durumu ile sonlandırıldı"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "alt süreç %d sinyali tarafından sonlandırıldı"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "alt süreç %s sinyali tarafından sonlandırıldı"
+
+#~ msgid "child process was terminated by exception 0x%X"
+#~ msgstr "alt süreç 0x%X exception tarafından sonlandırıldı"
+
+#~ msgid "child process exited with exit code %d"
+#~ msgstr "alt süreç %d çıkış koduyla sonuçlandı"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "çalışma dizini \"%s\" olarak değiştirilemedi"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help bu yardımı göster ve çık\n"
+
+#~ msgid "not recorded\n"
+#~ msgstr "kayıtlı değil\n"
diff --git a/src/bin/pg_config/po/uk.po b/src/bin/pg_config/po/uk.po
new file mode 100644
index 0000000..30681db
--- /dev/null
+++ b/src/bin/pg_config/po/uk.po
@@ -0,0 +1,241 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:47+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_config.pot\n"
+"X-Crowdin-File-ID: 926\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "не записано"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "не вдалося визначити поточний каталог: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "невірний бінарний файл \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "неможливо прочитати бінарний файл \"%s\""
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "неможливо знайти \"%s\" для виконання"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "не вдалося змінити каталог на \"%s\": %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "не можливо прочитати символічне послання \"%s\": %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() помилка: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "недостатньо пам'яті"
+
+#: pg_config.c:74
+#, c-format
+msgid "\n"
+"%s provides information about the installed version of PostgreSQL.\n\n"
+msgstr "\n"
+"%s надає інформацію про інстальовану версію PostgreSQL.\n\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Використання:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid " %s [OPTION]...\n\n"
+msgstr " %s: [OPTION]...\n\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Параметри:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir показує розташування виконуваних файлів користувача\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir показує розташування файлів документації\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir показує розташування файлів документації HTML\n"
+
+#: pg_config.c:81
+#, c-format
+msgid " --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr " -includedir показує розташування заголовків файлів С клієнтських інтерфейсів\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " -pkgincludedir показує розташування інших файлів з заголовками C\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " -includedir-server показує розташування заголовків файлів С сервера\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir показує розташування бібліотек об'єктного коду\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir показує місце динамічно завантажувальних модулів\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir показує місце файлів перекладу\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir показує розташування сторінок мануала\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir показує місцерозташування архітектурно незалежних файлів підтримки\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir показує розташування всесистемних файлів конфігурації\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs показує місцерозташування makefile для розширень\n"
+
+#: pg_config.c:92
+#, c-format
+msgid " --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr " --configure показує параметри скрипта \"configure\" збірки PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc показує значення CC збірки PostgreSQL\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags показує значення CPPFLAGS збірки PostgreSQL \n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags показує значення CFLAGS збірки PostgreSQL\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl показує значення CFLAGS_SL збірки PostgreSQL\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags показує значення LDFLAGS збірки PostgreSQL\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex показує значення LDFLAGS_EX збірки PostgreSQL\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl показує значення LDFLAGS_SL збірки PostgreSQL\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs показує значення LIBS збірки PostgreSQL\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version показує версію PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показує цю довідку, потім вихід\n"
+
+#: pg_config.c:104
+#, c-format
+msgid "\n"
+"With no arguments, all known items are shown.\n\n"
+msgstr "\n"
+"Без аргументів, всі відображаються відомі елементи.\n\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Повідомляти про помилки на <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: не вдалося знайти ехе файл власної програми\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: недопустимий аргумент: %s\n"
+
diff --git a/src/bin/pg_config/po/vi.po b/src/bin/pg_config/po/vi.po
new file mode 100644
index 0000000..cd87cd7
--- /dev/null
+++ b/src/bin/pg_config/po/vi.po
@@ -0,0 +1,300 @@
+# LANGUAGE message translation file for pg_config
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_config (PostgreSQL) package.
+# FIRST AUTHOR <kakalot49@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-04-22 12:15+0000\n"
+"PO-Revision-Date: 2018-05-04 22:18+0900\n"
+"Language-Team: <pgvn_translators@postgresql.vn>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.6\n"
+"Last-Translator: Dang Minh Huong <kakalot49@gmail.com>\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Language: vi_VN\n"
+
+#: ../../common/config_info.c:130 ../../common/config_info.c:138
+#: ../../common/config_info.c:146 ../../common/config_info.c:154
+#: ../../common/config_info.c:162 ../../common/config_info.c:170
+#: ../../common/config_info.c:178 ../../common/config_info.c:186
+#: ../../common/config_info.c:194
+msgid "not recorded"
+msgstr "không được ghi lại"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "không thể xác định thư mục hiện tại: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "tệp nhị phân không hợp lệ \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "không thể đọc tệp nhị phân \"%s\""
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "không thể tìm thấy tệp \"%s\" để thực thi"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "không thể thay đổi thư mục thành \"%s\": %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "không thể đọc symbolic link \"%s\""
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "pclose lỗi: %s"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s cung cấp thông tin về phiên bản đã cài đặt của PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Cách sử dụng:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [TÙY CHỌN]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Tùy chọn:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr ""
+" --bindir hiển thị vị trí thư mục tệp thực thi của người "
+"dùng\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir hiển thị vị trí của các tệp tài liệu\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir hiển thị vị trí của các tệp tài liệu HTML\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir hiển thị vị trí của tệp header ngôn ngữ C của\n"
+" giao diện phía client\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr ""
+" --pkgincludedir hiện thị vị trí của các tệp header cho ngôn ngữ C "
+"khác\n"
+
+#: pg_config.c:84
+#, c-format
+msgid ""
+" --includedir-server show location of C header files for the server\n"
+msgstr ""
+" --includedir-server hiện thị vị trí của các tệp header ngôn ngữ C "
+"phía server\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr ""
+" --libdir hiện thị ví trí của các tệp thư viện chương "
+"trình\n"
+
+#: pg_config.c:86
+#, c-format
+msgid ""
+" --pkglibdir show location of dynamically loadable modules\n"
+msgstr ""
+" --pkglibdir hiển thị vị trí của các mô-đun có thể nạp động\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir hiển thị vị trí của tệp hỗ trợ ngôn ngữ\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir hiển thị vị trí của các trang hướng dẫn\n"
+
+#: pg_config.c:89
+#, c-format
+msgid ""
+" --sharedir show location of architecture-independent support "
+"files\n"
+msgstr ""
+" --sharedir hiển thị vị trí của các tệp hỗ trợ kiến trúc độc "
+"lập\n"
+
+#: pg_config.c:90
+#, c-format
+msgid ""
+" --sysconfdir show location of system-wide configuration files\n"
+msgstr ""
+" --sysconfdir hiển thị vị trí của tệp cấu hình trên toàn hệ "
+"thống\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr ""
+" --pgxs hiển thị vị trí tệp makefile của extension\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure hiện thị tùy chọn chỉ định trong script "
+"\"configure\" \n"
+" khi built PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid ""
+" --cc show CC value used when PostgreSQL was built\n"
+msgstr ""
+" --cc hiển thị giá trị CC được sử dụng khi built "
+"PostgreSQL\n"
+
+#: pg_config.c:95
+#, c-format
+msgid ""
+" --cppflags show CPPFLAGS value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --cppflags hiện thị giá trị CPPFLAGS được sử dụng khi built "
+"PostgreSQL\n"
+
+#: pg_config.c:96
+#, c-format
+msgid ""
+" --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags hiện thị giá trị CFLAGS được sử dụng khi built "
+"PostgreSQL\n"
+
+#: pg_config.c:97
+#, c-format
+msgid ""
+" --cflags_sl show CFLAGS_SL value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --cflags_sl hiện thị giá trị CFLAGS_SL được sử dụng khi built "
+"PostgreSQL\n"
+
+#: pg_config.c:98
+#, c-format
+msgid ""
+" --ldflags show LDFLAGS value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags hiện thị giá trị LDFLAGS được sử dụng khi built "
+"PostgreSQL\n"
+
+#: pg_config.c:99
+#, c-format
+msgid ""
+" --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags_ex hiện thị giá trị LDFLAGS_EX được sử dụng khi "
+"built PostgreSQL\n"
+
+#: pg_config.c:100
+#, c-format
+msgid ""
+" --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags_sl hiện thị giá trị LDFLAGS_SL được sử dụng khi "
+"built PostgreSQL\n"
+
+#: pg_config.c:101
+#, c-format
+msgid ""
+" --libs show LIBS value used when PostgreSQL was built\n"
+msgstr ""
+" --libs hiện thị giá trị LIBS được sử dụng khi built "
+"PostgreSQL\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version hiển thị phiên bản PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help hiển thị trợ giúp này, sau đó thoát\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Nếu không có đối số, tất cả các mục sẽ được hiện thị.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "Báo cáo lỗi tới <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_config.c:111
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Hãy thử \"%s --help\" để biết thêm thông tin.\n"
+
+#: pg_config.c:153
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: không thể tìm thấy chương trình có thể thực thi\n"
+
+#: pg_config.c:180
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: đối số không hợp lệ: %s\n"
diff --git a/src/bin/pg_config/po/zh_CN.po b/src/bin/pg_config/po/zh_CN.po
new file mode 100644
index 0000000..8c32e10
--- /dev/null
+++ b/src/bin/pg_config/po/zh_CN.po
@@ -0,0 +1,255 @@
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:46+0000\n"
+"PO-Revision-Date: 2021-08-15 17:25+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.4\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "没有被记录"
+
+#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "无法确认当前目录: %m"
+
+#: ../../common/exec.c:155
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "无效的二进制码 \"%s\""
+
+#: ../../common/exec.c:205
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "无法读取二进制码 \"%s\""
+
+#: ../../common/exec.c:213
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "未能找到一个 \"%s\" 来执行"
+
+#: ../../common/exec.c:269 ../../common/exec.c:308
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "无法跳转到目录 \"%s\" 中: %m"
+
+#: ../../common/exec.c:286
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "无法读取符号链接 \"%s\": %m"
+
+#: ../../common/exec.c:409
+msgid "%s() failed: %m"
+msgstr "%s()失败: %m"
+
+#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659
+msgid "out of memory"
+msgstr "内存不足"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s 提供 PostgreSQL 的安装信息.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr " %s [选项]...\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "选项:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir 显示执行文件所在位置\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir 显示文档所在位置\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir 显示HTML文档文件所在位置\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir 显示客户端接口 C 头文件所在\n"
+" 位置\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir 显示其它C语言头文件所在的位置\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server 显示服务端 C 头文件所在位置\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir 显示目标代码库文件所在位置\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir 显示动态加载库所在位置\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir 显示语言环境支持文件所在位置\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir 显示参考手册所在位置\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir 显示独立架构支持文件所在位置\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir 显示系统范围的配置文件的所在位置\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs 显示扩展 makefile 所在位置\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure 显示编译 PostgreSQL 时 \"configure\"\n"
+" 的选项\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc 显示在创建PostgreSQL时所使用的CC值\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags 当创建PostgreSQL时显示CPPFLAGS的值\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags 显示在创建PostgreSQL时所使用的CFLAG值\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl 当创建PostgreSQL时显示CFLAGS_SL的值\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags 显示在创建PostgreSQL时所使用的LDFLAG值\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex 当创建PostgreSQL时显示LDFLAGS_EX的值\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl 当创建PostgreSQL时显示LDFLAGS_SL的值\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs 显示在创建PostgreSQL时所使用的LIBS值\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version 显示PostgreSQL的版本信息\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示帮助, 然后退出\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"没有参数,将显示所有已知的成员.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "臭虫报告至<%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获取更多的信息.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 无法找到执行文件\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: 无效参数: %s\n"
+
diff --git a/src/bin/pg_config/t/001_pg_config.pl b/src/bin/pg_config/t/001_pg_config.pl
new file mode 100644
index 0000000..9a89109
--- /dev/null
+++ b/src/bin/pg_config/t/001_pg_config.pl
@@ -0,0 +1,21 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_config');
+program_version_ok('pg_config');
+program_options_handling_ok('pg_config');
+command_like([ 'pg_config', '--bindir' ], qr/bin/, 'pg_config single option')
+ ; # XXX might be wrong
+command_like([ 'pg_config', '--bindir', '--libdir' ],
+ qr/bin.*\n.*lib/, 'pg_config two options');
+command_like([ 'pg_config', '--libdir', '--bindir' ],
+ qr/lib.*\n.*bin/, 'pg_config two options different order');
+command_like(['pg_config'], qr/.*\n.*\n.*/,
+ 'pg_config without options prints many lines');
+
+done_testing();
diff --git a/src/bin/pg_controldata/.gitignore b/src/bin/pg_controldata/.gitignore
new file mode 100644
index 0000000..051d71d
--- /dev/null
+++ b/src/bin/pg_controldata/.gitignore
@@ -0,0 +1,2 @@
+/pg_controldata
+/tmp_check/
diff --git a/src/bin/pg_controldata/Makefile b/src/bin/pg_controldata/Makefile
new file mode 100644
index 0000000..9e77073
--- /dev/null
+++ b/src/bin/pg_controldata/Makefile
@@ -0,0 +1,44 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_controldata
+#
+# Copyright (c) 1998-2022, PostgreSQL Global Development Group
+#
+# src/bin/pg_controldata/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_controldata - reads the data from pg_control"
+PGAPPICON=win32
+
+subdir = src/bin/pg_controldata
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ pg_controldata.o
+
+all: pg_controldata
+
+pg_controldata: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_controldata$(X) '$(DESTDIR)$(bindir)/pg_controldata$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_controldata$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_controldata$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_controldata/nls.mk b/src/bin/pg_controldata/nls.mk
new file mode 100644
index 0000000..ba60f88
--- /dev/null
+++ b/src/bin/pg_controldata/nls.mk
@@ -0,0 +1,6 @@
+# src/bin/pg_controldata/nls.mk
+CATALOG_NAME = pg_controldata
+AVAIL_LANGUAGES = cs de el es fr it ja ka ko pt_BR ru sv tr uk zh_CN
+GETTEXT_FILES = pg_controldata.c ../../common/controldata_utils.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS)
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/pg_controldata/pg_controldata.c b/src/bin/pg_controldata/pg_controldata.c
new file mode 100644
index 0000000..c390ec5
--- /dev/null
+++ b/src/bin/pg_controldata/pg_controldata.c
@@ -0,0 +1,332 @@
+/*
+ * pg_controldata
+ *
+ * reads the data from $PGDATA/global/pg_control
+ *
+ * copyright (c) Oliver Elphick <olly@lfix.co.uk>, 2001;
+ * license: BSD
+ *
+ * src/bin/pg_controldata/pg_controldata.c
+ */
+
+/*
+ * We have to use postgres.h not postgres_fe.h here, because there's so much
+ * backend-only stuff in the XLOG include files we need. But we need a
+ * frontend-ish environment otherwise. Hence this ugly hack.
+ */
+#define FRONTEND 1
+
+#include "postgres.h"
+
+#include <time.h>
+
+#include "access/transam.h"
+#include "access/xlog.h"
+#include "access/xlog_internal.h"
+#include "catalog/pg_control.h"
+#include "common/controldata_utils.h"
+#include "common/logging.h"
+#include "getopt_long.h"
+#include "pg_getopt.h"
+
+static void
+usage(const char *progname)
+{
+ printf(_("%s displays control information of a PostgreSQL database cluster.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION] [DATADIR]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" [-D, --pgdata=]DATADIR data directory\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nIf no data directory (DATADIR) is specified, "
+ "the environment variable PGDATA\nis used.\n\n"));
+ printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+
+static const char *
+dbState(DBState state)
+{
+ switch (state)
+ {
+ case DB_STARTUP:
+ return _("starting up");
+ case DB_SHUTDOWNED:
+ return _("shut down");
+ case DB_SHUTDOWNED_IN_RECOVERY:
+ return _("shut down in recovery");
+ case DB_SHUTDOWNING:
+ return _("shutting down");
+ case DB_IN_CRASH_RECOVERY:
+ return _("in crash recovery");
+ case DB_IN_ARCHIVE_RECOVERY:
+ return _("in archive recovery");
+ case DB_IN_PRODUCTION:
+ return _("in production");
+ }
+ return _("unrecognized status code");
+}
+
+static const char *
+wal_level_str(WalLevel wal_level)
+{
+ switch (wal_level)
+ {
+ case WAL_LEVEL_MINIMAL:
+ return "minimal";
+ case WAL_LEVEL_REPLICA:
+ return "replica";
+ case WAL_LEVEL_LOGICAL:
+ return "logical";
+ }
+ return _("unrecognized wal_level");
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"pgdata", required_argument, NULL, 'D'},
+ {NULL, 0, NULL, 0}
+ };
+
+ ControlFileData *ControlFile;
+ bool crc_ok;
+ char *DataDir = NULL;
+ time_t time_tmp;
+ char pgctime_str[128];
+ char ckpttime_str[128];
+ char mock_auth_nonce_str[MOCK_AUTH_NONCE_LEN * 2 + 1];
+ const char *strftime_fmt = "%c";
+ const char *progname;
+ char xlogfilename[MAXFNAMELEN];
+ int c;
+ int i;
+ int WalSegSz;
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_controldata"));
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage(progname);
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_controldata (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((c = getopt_long(argc, argv, "D:", long_options, NULL)) != -1)
+ {
+ switch (c)
+ {
+ case 'D':
+ DataDir = optarg;
+ break;
+
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ if (DataDir == NULL)
+ {
+ if (optind < argc)
+ DataDir = argv[optind++];
+ else
+ DataDir = getenv("PGDATA");
+ }
+
+ /* Complain if any arguments remain */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (DataDir == NULL)
+ {
+ pg_log_error("no data directory specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* get a copy of the control file */
+ ControlFile = get_controlfile(DataDir, &crc_ok);
+ if (!crc_ok)
+ printf(_("WARNING: Calculated CRC checksum does not match value stored in file.\n"
+ "Either the file is corrupt, or it has a different layout than this program\n"
+ "is expecting. The results below are untrustworthy.\n\n"));
+
+ /* set wal segment size */
+ WalSegSz = ControlFile->xlog_seg_size;
+
+ if (!IsValidWalSegSize(WalSegSz))
+ {
+ printf(_("WARNING: invalid WAL segment size\n"));
+ printf(ngettext("The WAL segment size stored in the file, %d byte, is not a power of two\n"
+ "between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+ "untrustworthy.\n\n",
+ "The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+ "between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+ "untrustworthy.\n\n",
+ WalSegSz),
+ WalSegSz);
+ }
+
+ /*
+ * This slightly-chintzy coding will work as long as the control file
+ * timestamps are within the range of time_t; that should be the case in
+ * all foreseeable circumstances, so we don't bother importing the
+ * backend's timezone library into pg_controldata.
+ *
+ * Use variable for format to suppress overly-anal-retentive gcc warning
+ * about %c
+ */
+ time_tmp = (time_t) ControlFile->time;
+ strftime(pgctime_str, sizeof(pgctime_str), strftime_fmt,
+ localtime(&time_tmp));
+ time_tmp = (time_t) ControlFile->checkPointCopy.time;
+ strftime(ckpttime_str, sizeof(ckpttime_str), strftime_fmt,
+ localtime(&time_tmp));
+
+ /*
+ * Calculate name of the WAL file containing the latest checkpoint's REDO
+ * start point.
+ *
+ * A corrupted control file could report a WAL segment size of 0, and to
+ * guard against division by zero, we need to treat that specially.
+ */
+ if (WalSegSz != 0)
+ {
+ XLogSegNo segno;
+
+ XLByteToSeg(ControlFile->checkPointCopy.redo, segno, WalSegSz);
+ XLogFileName(xlogfilename, ControlFile->checkPointCopy.ThisTimeLineID,
+ segno, WalSegSz);
+ }
+ else
+ strcpy(xlogfilename, _("???"));
+
+ for (i = 0; i < MOCK_AUTH_NONCE_LEN; i++)
+ snprintf(&mock_auth_nonce_str[i * 2], 3, "%02x",
+ (unsigned char) ControlFile->mock_authentication_nonce[i]);
+
+ printf(_("pg_control version number: %u\n"),
+ ControlFile->pg_control_version);
+ printf(_("Catalog version number: %u\n"),
+ ControlFile->catalog_version_no);
+ printf(_("Database system identifier: %llu\n"),
+ (unsigned long long) ControlFile->system_identifier);
+ printf(_("Database cluster state: %s\n"),
+ dbState(ControlFile->state));
+ printf(_("pg_control last modified: %s\n"),
+ pgctime_str);
+ printf(_("Latest checkpoint location: %X/%X\n"),
+ LSN_FORMAT_ARGS(ControlFile->checkPoint));
+ printf(_("Latest checkpoint's REDO location: %X/%X\n"),
+ LSN_FORMAT_ARGS(ControlFile->checkPointCopy.redo));
+ printf(_("Latest checkpoint's REDO WAL file: %s\n"),
+ xlogfilename);
+ printf(_("Latest checkpoint's TimeLineID: %u\n"),
+ ControlFile->checkPointCopy.ThisTimeLineID);
+ printf(_("Latest checkpoint's PrevTimeLineID: %u\n"),
+ ControlFile->checkPointCopy.PrevTimeLineID);
+ printf(_("Latest checkpoint's full_page_writes: %s\n"),
+ ControlFile->checkPointCopy.fullPageWrites ? _("on") : _("off"));
+ printf(_("Latest checkpoint's NextXID: %u:%u\n"),
+ EpochFromFullTransactionId(ControlFile->checkPointCopy.nextXid),
+ XidFromFullTransactionId(ControlFile->checkPointCopy.nextXid));
+ printf(_("Latest checkpoint's NextOID: %u\n"),
+ ControlFile->checkPointCopy.nextOid);
+ printf(_("Latest checkpoint's NextMultiXactId: %u\n"),
+ ControlFile->checkPointCopy.nextMulti);
+ printf(_("Latest checkpoint's NextMultiOffset: %u\n"),
+ ControlFile->checkPointCopy.nextMultiOffset);
+ printf(_("Latest checkpoint's oldestXID: %u\n"),
+ ControlFile->checkPointCopy.oldestXid);
+ printf(_("Latest checkpoint's oldestXID's DB: %u\n"),
+ ControlFile->checkPointCopy.oldestXidDB);
+ printf(_("Latest checkpoint's oldestActiveXID: %u\n"),
+ ControlFile->checkPointCopy.oldestActiveXid);
+ printf(_("Latest checkpoint's oldestMultiXid: %u\n"),
+ ControlFile->checkPointCopy.oldestMulti);
+ printf(_("Latest checkpoint's oldestMulti's DB: %u\n"),
+ ControlFile->checkPointCopy.oldestMultiDB);
+ printf(_("Latest checkpoint's oldestCommitTsXid:%u\n"),
+ ControlFile->checkPointCopy.oldestCommitTsXid);
+ printf(_("Latest checkpoint's newestCommitTsXid:%u\n"),
+ ControlFile->checkPointCopy.newestCommitTsXid);
+ printf(_("Time of latest checkpoint: %s\n"),
+ ckpttime_str);
+ printf(_("Fake LSN counter for unlogged rels: %X/%X\n"),
+ LSN_FORMAT_ARGS(ControlFile->unloggedLSN));
+ printf(_("Minimum recovery ending location: %X/%X\n"),
+ LSN_FORMAT_ARGS(ControlFile->minRecoveryPoint));
+ printf(_("Min recovery ending loc's timeline: %u\n"),
+ ControlFile->minRecoveryPointTLI);
+ printf(_("Backup start location: %X/%X\n"),
+ LSN_FORMAT_ARGS(ControlFile->backupStartPoint));
+ printf(_("Backup end location: %X/%X\n"),
+ LSN_FORMAT_ARGS(ControlFile->backupEndPoint));
+ printf(_("End-of-backup record required: %s\n"),
+ ControlFile->backupEndRequired ? _("yes") : _("no"));
+ printf(_("wal_level setting: %s\n"),
+ wal_level_str(ControlFile->wal_level));
+ printf(_("wal_log_hints setting: %s\n"),
+ ControlFile->wal_log_hints ? _("on") : _("off"));
+ printf(_("max_connections setting: %d\n"),
+ ControlFile->MaxConnections);
+ printf(_("max_worker_processes setting: %d\n"),
+ ControlFile->max_worker_processes);
+ printf(_("max_wal_senders setting: %d\n"),
+ ControlFile->max_wal_senders);
+ printf(_("max_prepared_xacts setting: %d\n"),
+ ControlFile->max_prepared_xacts);
+ printf(_("max_locks_per_xact setting: %d\n"),
+ ControlFile->max_locks_per_xact);
+ printf(_("track_commit_timestamp setting: %s\n"),
+ ControlFile->track_commit_timestamp ? _("on") : _("off"));
+ printf(_("Maximum data alignment: %u\n"),
+ ControlFile->maxAlign);
+ /* we don't print floatFormat since can't say much useful about it */
+ printf(_("Database block size: %u\n"),
+ ControlFile->blcksz);
+ printf(_("Blocks per segment of large relation: %u\n"),
+ ControlFile->relseg_size);
+ printf(_("WAL block size: %u\n"),
+ ControlFile->xlog_blcksz);
+ printf(_("Bytes per WAL segment: %u\n"),
+ ControlFile->xlog_seg_size);
+ printf(_("Maximum length of identifiers: %u\n"),
+ ControlFile->nameDataLen);
+ printf(_("Maximum columns in an index: %u\n"),
+ ControlFile->indexMaxKeys);
+ printf(_("Maximum size of a TOAST chunk: %u\n"),
+ ControlFile->toast_max_chunk_size);
+ printf(_("Size of a large-object chunk: %u\n"),
+ ControlFile->loblksize);
+ /* This is no longer configurable, but users may still expect to see it: */
+ printf(_("Date/time type storage: %s\n"),
+ _("64-bit integers"));
+ printf(_("Float8 argument passing: %s\n"),
+ (ControlFile->float8ByVal ? _("by value") : _("by reference")));
+ printf(_("Data page checksum version: %u\n"),
+ ControlFile->data_checksum_version);
+ printf(_("Mock authentication nonce: %s\n"),
+ mock_auth_nonce_str);
+ return 0;
+}
diff --git a/src/bin/pg_controldata/po/cs.po b/src/bin/pg_controldata/po/cs.po
new file mode 100644
index 0000000..4774832
--- /dev/null
+++ b/src/bin/pg_controldata/po/cs.po
@@ -0,0 +1,561 @@
+# Czech message translation file for pg_controldata
+# Copyright (C) 2012 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Tomas Vondra <tv@fuzzy.cz>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata-cs (PostgreSQL 9.3)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:17+0000\n"
+"PO-Revision-Date: 2020-10-31 20:50+0100\n"
+"Last-Translator: Tomas Vondra <tv@fuzzy.cz>\n"
+"Language-Team: Czech <info@cspug.cx>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "nelze otevřít soubor \"%s\" pro čtení: %m"
+
+#: ../../common/controldata_utils.c:89
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "nelze číst soubor \"%s\": %m"
+
+#: ../../common/controldata_utils.c:101
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "nelze číst soubor \"%s\": načteno %d z %zu"
+
+#: ../../common/controldata_utils.c:117 ../../common/controldata_utils.c:259
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "nelze uzavřít soubor \"%s\": %m"
+
+#: ../../common/controldata_utils.c:135
+msgid "byte ordering mismatch"
+msgstr "pořadí bytů nesouhlasí"
+
+#: ../../common/controldata_utils.c:137
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the "
+"one\n"
+"used by this program. In that case the results below would be incorrect, "
+"and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"možný nesoulad v pořadí bytů\n"
+"Pořadí bytů používané pro uložení pg_control souboru nemusí odpovídat "
+"tomu\n"
+"používanému tímto programem. V tom případě by výsledky uvedené níže byly "
+"chybné, a\n"
+"PostgreSQL instalace by byla nekompatibilní s tímto datovým adresářem."
+
+#: ../../common/controldata_utils.c:203
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "nelze otevřít soubor \"%s\": %m"
+
+#: ../../common/controldata_utils.c:224
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "nelze zapsat soubor \"%s\": %m"
+
+#: ../../common/controldata_utils.c:245
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "nelze provést fsync souboru \"%s\": %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s vypíše kontrolní informace o PostgreSQL databázi.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [VOLBY] [DATOVÝ-ADRESÁŘ]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Volby:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR datový adresář\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version vypiš informaci o verzi, potom skonči\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help vypiš tuto nápovědu, potom skonči\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Není-li specifikován datový adresář, je použita proměnná prostředí\n"
+"PGDATA.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Chyby hlašte na <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domovská stránka: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "startování"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "ukončení"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "ukončení (shut down) během obnovy"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "ukončování"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "probíhá zotavení z pádu"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "probíhá obnova z archivu"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "v provozu"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "neznámý stavový kód"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "neznámý wal_level"
+
+#: pg_controldata.c:137 pg_controldata.c:155 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_controldata.c:153
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "příliš mnoho argumentů v příkazové řádce (první je \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "není specifikován datový adresář"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this "
+"program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"UPOZORNĚNÍ: Spočítaný CRC kontrolní součet nesouhlasí s hodnotou uloženou\n"
+"v souboru. Buď je soubor poškozen nebo má jinou strukturu než tento "
+"program\n"
+"očekává. Níže uvedené výsledky jsou nedůvěryhodné.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "WARNING: neplatná velikost WAL segmentu\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"Velikost WAL segmentu uloženého v souboru, %d byte, není mocnina dvou\n"
+"mezi 1 MB a 1 GB. Soubor je poškozený a výsledky uvedené níže jsou\n"
+"nedůvěryhodné.\n"
+"\n"
+msgstr[1] ""
+"Velikost WAL segmentu uloženého v souboru, %d bytů, není mocnina dvou\n"
+"mezi 1 MB a 1 GB. Soubor je poškozený a výsledky uvedené níže jsou\n"
+"nedůvěryhodné.\n"
+"\n"
+msgstr[2] ""
+"Velikost WAL segmentu uloženého v souboru, %d bytů, není mocnina dvou\n"
+"mezi 1 MB a 1 GB. Soubor je poškozený a výsledky uvedené níže jsou\n"
+"nedůvěryhodné.\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Číslo verze pg_controlu: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Číslo verze katalogu: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr ""
+"Identifikátor databázového systému: %llu\n"
+"\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Status databázového klastru: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "Poslední modifikace pg_control: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Poslední umístění checkpointu: %X/%X\n"
+
+#: pg_controldata.c:241
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Poslední umístění REDO checkpointu: %X/%X\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "REDO WAL file posledního checkpointu: %s\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID posledního checkpointu: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "PrevTimeLineID posledního checkpointu: %u\n"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Poslední full_page_writes checkpointu: %s\n"
+
+#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308
+msgid "off"
+msgstr "vypnuto"
+
+#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308
+msgid "on"
+msgstr "zapnuto"
+
+#: pg_controldata.c:252
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID posledního checkpointu: %u:%u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "Poslední umístění NextOID checkpointu: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId posledního checkpointu: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset posledního checkpointu: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID posledního checkpointu: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB k oldestXID posledního checkpointu: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID posledního checkpointu: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid posledního checkpointu: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB k oldestMulti posledního checkpointu: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid posledního checkpointu: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid posledního checkpointu: %u\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Čas posledního checkpointu: %s\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Falešné LSN počítadlo pro unlogged relace: %X/%X\n"
+
+#: pg_controldata.c:280
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Minimální pozice ukončení obnovy: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Timeline minimální pozice ukončení obnovy: %u\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Pozice počátku backupu: %X/%X\n"
+
+#: pg_controldata.c:288
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Koncová pozice zálohy: %X/%X\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Vyžadován záznam konce backupu: %s\n"
+
+#: pg_controldata.c:292
+msgid "no"
+msgstr "ne"
+
+#: pg_controldata.c:292
+msgid "yes"
+msgstr "ano"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "wal_level hodnota: %s\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "wal_log_hints hodnota: %s\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "max_connections hodnota: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "max_worker_processes hodnota: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "max_wal_senders setting: %d\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "max_prepared_xacts hodnota: %d\n"
+
+#: pg_controldata.c:305
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "max_locks_per_xact hodnota: %d\n"
+
+#: pg_controldata.c:307
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "track_commit_timestamp hodnota: %s\n"
+
+#: pg_controldata.c:309
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Maximální zarovnání dat: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Velikost databázového bloku: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Bloků v segmentu velké relace: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Velikost WAL bloku: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytů ve WAL segmentu: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Maximální délka identifikátorů: %u\n"
+
+#: pg_controldata.c:322
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Maximální počet sloupců v indexu: %u\n"
+
+#: pg_controldata.c:324
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Maximální velikost úseku TOAST: %u\n"
+
+#: pg_controldata.c:326
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Velikost large-object chunku: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Způsob uložení typu date/time: %s\n"
+
+#: pg_controldata.c:330
+msgid "64-bit integers"
+msgstr "64-bitová čísla"
+
+#: pg_controldata.c:331
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Způsob předávání float8 hodnot: %s\n"
+
+#: pg_controldata.c:332
+msgid "by reference"
+msgstr "odkazem"
+
+#: pg_controldata.c:332
+msgid "by value"
+msgstr "hodnotou"
+
+#: pg_controldata.c:333
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Verze kontrolních součtů datových stránek: %u\n"
+
+#: pg_controldata.c:335
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Zkušební authentizační nonce: %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: nelze otevřít soubor \"%s\" pro čtení: %s\n"
+
+#~ msgid "%s: could not read file \"%s\": %s\n"
+#~ msgstr "%s: nelze číst soubor \"%s\": %s\n"
+
+#~ msgid ""
+#~ "Usage:\n"
+#~ " %s [OPTION] [DATADIR]\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --help show this help, then exit\n"
+#~ " --version output version information, then exit\n"
+#~ msgstr ""
+#~ "Použití:\n"
+#~ " %s [PŘEPÍNAČ] [ADRESÁŘ]\n"
+#~ "\n"
+#~ "Přepínače:\n"
+#~ " --help ukáže tuto nápovědu a skončí\n"
+#~ " --version ukáže verzi tohoto programu a skončí\n"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "čísla s plovoucí řádovou čárkou"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help ukáže tuto nápovědu, a skončí\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version vypíše informaci o verzi, pak skončí\n"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Způsob předávání float4 hodnot: %s\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Oznámení o chybách zasílejte na <pgsql-bugs@postgresql.org>.\n"
diff --git a/src/bin/pg_controldata/po/de.po b/src/bin/pg_controldata/po/de.po
new file mode 100644
index 0000000..02b3a2d
--- /dev/null
+++ b/src/bin/pg_controldata/po/de.po
@@ -0,0 +1,512 @@
+# German message translation file for pg_controldata
+# Peter Eisentraut <peter@eisentraut.org>, 2002 - 2022.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-10 13:51+0000\n"
+"PO-Revision-Date: 2022-04-10 20:16+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht lesen: %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schließen: %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "falsche Byte-Reihenfolge"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"möglicherweise falsche Byte-Reihenfolge\n"
+"Die Byte-Reihenfolge, die zur Speicherung der Datei pg_control verwendet wurde,\n"
+"stimmt möglicherweise nicht mit der von diesem Programm verwendeten überein. In\n"
+"diesem Fall wären die Ergebnisse unten falsch und die PostgreSQL-Installation\n"
+"wäre inkompatibel mit diesem Datenverzeichnis."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schreiben: %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht fsyncen: %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s zeigt Kontrollinformationen über einen PostgreSQL-Datenbankcluster.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [OPTION] [DATENVERZEICHNIS]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Optionen:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]VERZ Datenbankverzeichnis\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Wenn kein Datenverzeichnis angegeben ist, wird die Umgebungsvariable\n"
+"PGDATA verwendet.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Berichten Sie Fehler an <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "startet"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "heruntergefahren"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "in der Wiederherstellung heruntergefahren"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "fährt herunter"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "bei der Wiederherstellung nach Absturz"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "bei der Archivwiederherstellung"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "im Produktionsmodus"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "nicht erkannter Statuscode"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "unbekanntes wal_level"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "kein Datenverzeichnis angegeben"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"WARNUNG: Berechnete CRC-Prüfsumme stimmt nicht mit dem Wert in der Datei\n"
+"überein. Entweder ist die Datei kaputt oder sie hat ein anderes Layout\n"
+"als von diesem Programm erwartet. Die Ergebnisse unten sind nicht\n"
+"verlässlich.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "WARNUNG: ungültige WAL-Segmentgröße\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"Die in der Datei gespeicherte WAL-Segmentgröße, %d Byte, ist keine\n"
+"Zweierpotenz zwischen 1 MB und 1 GB. Die Datei ist kaputt und die\n"
+"Ergebnisse unten sind nicht verlässlich.\n"
+"\n"
+msgstr[1] ""
+"Die in der Datei gespeicherte WAL-Segmentgröße, %d Bytes, ist keine\n"
+"Zweierpotenz zwischen 1 MB und 1 GB. Die Datei ist kaputt und die\n"
+"Ergebnisse unten sind nicht verlässlich.\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control-Versionsnummer: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Katalogversionsnummer: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Datenbanksystemidentifikation: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Datenbank-Cluster-Status: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control zuletzt geändert: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Position des letzten Checkpoints: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "REDO-Position des letzten Checkpoints: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "REDO-WAL-Datei des letzten Checkpoints: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "PrevTimeLineID des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "full_page_writes des letzten Checkpoints: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "aus"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "an"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID des letzten Checkpoints: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB der oldestXID des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB des oldestMulti des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Zeit des letzten Checkpoints: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Fake-LSN-Zähler für ungeloggte Relationen: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Minimaler Wiederherstellungsendpunkt: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Zeitleiste des minimalen Wiederherstellungsendpunkts: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Backup-Startpunkt: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Backup-Endpunkt: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "End-of-Backup-Eintrag erforderlich: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "nein"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "ja"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "wal_level-Einstellung: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "wal_log_hints-Einstellung: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "max_connections-Einstellung: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "max_worker_processes-Einstellung: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "max_wal_senders-Einstellung: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "max_prepared_xacts-Einstellung: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "max_locks_per_xact-Einstellung: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "track_commit_timestamp-Einstellung: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Maximale Datenausrichtung (Alignment): %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Datenbankblockgröße: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Blöcke pro Segment: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL-Blockgröße: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytes pro WAL-Segment: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Maximale Bezeichnerlänge: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Maximale Spalten in einem Index: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Maximale Größe eines Stücks TOAST: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Größe eines Large-Object-Chunks: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Speicherung von Datum/Zeit-Typen: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64-Bit-Ganzzahlen"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Übergabe von Float8-Argumenten: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "Referenz"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "Wert"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Datenseitenprüfsummenversion: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Mock-Authentifizierungs-Nonce: %s\n"
diff --git a/src/bin/pg_controldata/po/el.po b/src/bin/pg_controldata/po/el.po
new file mode 100644
index 0000000..f08b70f
--- /dev/null
+++ b/src/bin/pg_controldata/po/el.po
@@ -0,0 +1,521 @@
+# Greek message translation file for pg_controldata
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_controldata (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-14 09:20+0000\n"
+"PO-Revision-Date: 2023-04-14 13:09+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου «%s» για ανάγνωση: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: ανέγνωσε %d από %zu"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου «%s»: %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "αναντιστοιχία διάταξης byte"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"πιθανή αναντιστοιχία διάταξης byte\n"
+"Η διάταξη byte που χρησιμοποιείται για την αποθήκευση του αρχείου pg_control "
+"ενδέχεται να μην ταιριάζει με αυτήν\n"
+"που χρησιμοποιείται από αυτό το πρόγραμμα. Στην περίπτωση αυτή, τα παρακάτω "
+"αποτελέσματα θα ήταν εσφαλμένα, και\n"
+"η εγκατάσταση PostgreSQL θα ήταν ασύμβατη με αυτόν τον κατάλογο δεδομένων."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγραφή αρχείου «%s»: %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής fsync στο αρχείο «%s»: %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s εμφανίζει πληροφορίες ελέγχου μίας συστάδας βάσεων δεδομένων PostgreSQL.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Χρήση:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ] [DATADIR]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Επιλογές:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR κατάλογος δεδομένων\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, μετά έξοδος\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Εάν δεν έχει καθοριστεί κατάλογος δεδομένων (DATADIR), χρησιμοποιείται η\n"
+"μεταβλητή περιβάλλοντος PGDATA.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Υποβάλετε αναφορές σφάλματων σε <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αρχική σελίδα: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "εκκίνηση"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "τερματισμός"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "τερματισμός σε αποκατάσταση"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "τερματίζει"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "σε αποκατάσταση από κρασάρισμα"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "σε αποκατάσταση αρχειοθήκης"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "σε παραγωγή"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "μη αναγνωρίσιμος κωδικός κατάστασης"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "μη αναγνωρίσιμο wal_level"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "δεν ορίστηκε κατάλογος δεδομένων"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Το υπολογιζόμενο άθροισμα ελέγχου CRC δεν συμφωνεί με την τιμή που "
+"είναι αποθηκευμένη στο αρχείο.\n"
+"Είτε το αρχείο είναι αλλοιωμένο είτε έχει διαφορετική διάταξη από αυτή που "
+"περιμένει\n"
+"αυτό το πρόγραμμα. Τα παρακάτω αποτελέσματα είναι αναξιόπιστα.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: μη έγκυρο μέγεθος τμήματος WAL\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"Το μέγεθος τμήματος WAL που είναι αποθηκευμένο στο αρχείο, %d byte, δεν είναι "
+"δύναμη\n"
+"του δύο μεταξύ 1 MB και 1 GB. Το αρχείο είναι αλλοιωμένο και τα παρακάτω "
+"αποτελέσματα\n"
+"είναι αναξιόπιστα.\n"
+"\n"
+msgstr[1] ""
+"Το μέγεθος τμήματος WAL που είναι αποθηκευμένο στο αρχείο, %d bytes, δεν είναι "
+"δύναμη\n"
+"του δύο μεταξύ 1 MB και 1 GB. Το αρχείο είναι αλλοιωμένο και τα παρακάτω "
+"αποτελέσματα\n"
+"είναι αναξιόπιστα.\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control αριθμός έκδοσης: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Αριθμός έκδοσης καταλόγου: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Αναγνωριστικό συστήματος βάσης δεδομένων: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Κατάσταση συστάδας βάσης δεδομένων: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "πιο πρόσφατη μετατροπή pg_control: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Πιο πρόσφατη τοποθεσία σημείου ελέγχου: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Πιο πρόσφατη τοποθεσία REDO του σημείου ελέγχου: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "Πιο πρόσφατο αρχείο REDO WAL του σημείου ελέγχου: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "Πιο πρόσφατο TimeLineID του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "Πιο πρόσφατο PrevTimeLineID του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Πιο πρόσφατο full_page_writes του σημείου ελέγχου: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "κλειστό"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "ανοικτό"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "Πιο πρόσφατο NextXID του σημείου ελέγχου: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "Πιο πρόσφατο NextOID του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "Πιο πρόσφατο NextMultiXactId του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "Πιο πρόσφατο NextMultiOffset του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "Πιο πρόσφατο oldestXID του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "Πιο πρόσφατο oldestXID’s DB του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "Πιο πρόσφατο oldestActiveXID του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "Πιο πρόσφατο oldestMultiXid του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "Πιο πρόσφατο oldestMulti’s DB του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "Πιο πρόσφατο oldestCommitTsXid του σημείου ελέγχου:%u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "Πιο πρόσφατο newestCommitTsXid του σημείου ελέγχου:%u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Ώρα του πιο πρόσφατου σημείου ελέγχου: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Ψεύτικος μετρητής LSN για μη κενές rels: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Ελάχιστη τοποθεσία τερματισμού ανάκαμψης: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Χρονογραμμή ελάχιστης θέσης τερματισμού ανάκαμψης: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Τοποθεσία εκκίνησης Backup: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Τοποθεσία τερματισμου Backup: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Απαιτείται εγγραφή end-of-backup: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "όχι"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "ναι"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "ρύθμιση wal_level: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "ρύθμιση wal_log_hints: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "ρύθμιση max_connections: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "ρύθμιση max_worker_processes: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "ρύθμιση max_wal_senders: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "ρύθμιση max_prepared_xacts: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "ρύθμιση max_locks_per_xact: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "ρύθμιση track_commit_timestamp: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Μέγιστη στοίχιση δεδομένων: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Μέγεθος μπλοκ βάσης δεδομένων: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Μπλοκ ανά τμήμα μεγάλης σχέσης: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Μέγεθος μπλοκ WAL: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytes ανά τμήμα WAL: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Μέγιστο μήκος αναγνωριστικών: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Μέγιστες στήλες σε ένα ευρετήριο: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Μέγιστο μέγεθος ενός τμήματος TOAST: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Μέγεθος τμήματος μεγάλου αντικειμένου: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Τύπος αποθήκευσης ημερομηνίας/ώρας: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "Ακέραιοι 64-bit"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Μεταβλητή Float8 τέθηκε: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "με αναφορά"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "με τιμή"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Έκδοση αθροίσματος ελέγχου σελίδας δεδομένων: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Μακέτα (mock) nonce ταυτοποίησης: %s\n"
diff --git a/src/bin/pg_controldata/po/es.po b/src/bin/pg_controldata/po/es.po
new file mode 100644
index 0000000..e257ff4
--- /dev/null
+++ b/src/bin/pg_controldata/po/es.po
@@ -0,0 +1,515 @@
+# Spanish message translation file for pg_controldata
+#
+# Copyright (c) 2002-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Karim Mribti <karim@mribti.com>, 2002.
+# Alvaro Herrera <alvherre@alvh.no-ip.org>, 2003-2014
+# Martín Marqués <martin@2ndquadrant.com>, 2013
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:51+0000\n"
+"PO-Revision-Date: 2022-10-20 09:06+0200\n"
+"Last-Translator: Carlos Chapi <carlos.chapi@2ndquadrant.com>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "no se pudo abrir archivo «%s» para lectura: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "no se pudo leer el archivo «%s»: %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "no se pudo leer el archivo «%s»: leídos %d de %zu"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo «%s»: %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "discordancia en orden de bytes"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"posible discordancia en orden de bytes\n"
+"El ordenamiento de bytes usado para almacenar el archivo pg_control puede no\n"
+"coincidir con el usado por este programa. En tal caso los resultados de abajo\n"
+"serían erróneos, y la instalación de PostgreSQL sería incompatible con este\n"
+"directorio de datos."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "no se pudo escribir el archivo «%s»: %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s muestra información de control del cluster de PostgreSQL.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [OPCIÓN] [DATADIR]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opciones:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR directorio de datos\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión, luego salir\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda, luego salir\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si no se especifica un directorio de datos (DATADIR), se utilizará\n"
+"la variable de entorno PGDATA.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Reporte errores a <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "iniciando"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "apagado"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "apagado durante recuperación"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "apagándose"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "en recuperación"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "en recuperación desde archivo"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "en producción"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "código de estado no reconocido"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "wal_level no reconocido"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "no se especificó el directorio de datos"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"ATENCIÓN: La suma de verificación calculada no coincide con el valor\n"
+"almacenado en el archivo. Puede ser que el archivo esté corrupto, o\n"
+"bien tiene una estructura diferente de la que este programa está\n"
+"esperando. Los resultados presentados a continuación no son confiables.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "PRECAUCIÓN: tamaño de segmento de WAL no válido\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"El tamaño de segmento de WAL almacenado en el archivo, %d byte,\n"
+"no es una potencia de dos entre 1 MB y 1 GB. El archivo está corrupto y los\n"
+"resultados de abajo no son confiables.\n"
+msgstr[1] ""
+"El tamaño de segmento de WAL almacenado en el archivo, %d bytes,\n"
+"no es una potencia de dos entre 1 MB y 1 GB. El archivo está corrupto y los\n"
+"resultados de abajo no son confiables.\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Número de versión de pg_control: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Número de versión del catálogo: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identificador de sistema: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Estado del sistema de base de datos: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "Última modificación de pg_control: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Ubicación del último checkpoint: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Ubicación de REDO de último checkpoint: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "Ubicación de REDO de último checkpoint: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID del último checkpoint: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "PrevTimeLineID del último checkpoint: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "full_page_writes del último checkpoint: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "desactivado"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "activado"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID de último checkpoint: %u/%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID de último checkpoint: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId de último checkpoint: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset de último checkpoint: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID del último checkpoint: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB del oldestXID del último checkpoint: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID del último checkpoint: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid del último checkpoint: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB del oldestMultiXid del últ. checkpoint: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid del último checkpoint: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid del último checkpoint: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Instante de último checkpoint: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Contador de LSN falsas para rels. unlogged: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Punto final mínimo de recuperación: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Timeline de dicho punto final mínimo: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Ubicación del inicio de backup: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Ubicación del fin de backup: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Registro fin-de-backup requerido: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "no"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "sí"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "Parámetro wal_level: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "Parámetro wal_log_hings: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "Parámetro max_connections: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "Parámetro max_worker_processes: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "Parámetro max_wal_senders: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "Parámetro max_prepared_xacts: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "Parámetro max_locks_per_xact: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "Parámetro track_commit_timestamp: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Alineamiento máximo de datos: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Tamaño de bloque de la base de datos: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Bloques por segmento en relación grande: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Tamaño del bloque de WAL: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytes por segmento WAL: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Máxima longitud de identificadores: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Máximo número de columnas de un índice: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Longitud máxima de un trozo TOAST: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Longitud máx. de un trozo de objeto grande: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Tipo de almacenamiento de horas y fechas: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "enteros de 64 bits"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Paso de parámetros float8: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "por referencia"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "por valor"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Versión de sumas de verificación de datos: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Nonce para autentificación simulada: %s\n"
diff --git a/src/bin/pg_controldata/po/fr.po b/src/bin/pg_controldata/po/fr.po
new file mode 100644
index 0000000..c9c0f01
--- /dev/null
+++ b/src/bin/pg_controldata/po/fr.po
@@ -0,0 +1,569 @@
+# LANGUAGE message translation file for pg_controldata
+# Copyright (C) 2002-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_controldata (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Loïc Hennequin <loic.hennequin@wanadoo.fr>, 2002.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2003-2009.
+# Stéphane Schildknecht <stephane.schildknecht@dalibo.com>, 2009.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2010-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-12 05:16+0000\n"
+"PO-Revision-Date: 2022-04-12 17:29+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "n'a pas pu lire le fichier « %s » : %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier « %s » : %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "différence de l'ordre des octets"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"possible incohérence dans l'ordre des octets\n"
+"L'ordre des octets utilisé pour enregistrer le fichier pg_control peut ne\n"
+"pas correspondre à celui utilisé par ce programme. Dans ce cas, les\n"
+"résultats ci-dessous sont incorrects, et l'installation de PostgreSQL\n"
+"est incompatible avec ce répertoire des données."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "impossible d'écrire le fichier « %s » : %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s affiche les informations de contrôle de l'instance PostgreSQL.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [OPTION] [RÉP_DONNÉES]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options :\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata] RÉP_DONNEES répertoire de la base de données\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si aucun répertoire (RÉP_DONNÉES) n'est indiqué, la variable d'environnement\n"
+"PGDATA est utilisée.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapporter les bogues à <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "démarrage en cours"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "arrêt"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "arrêt pendant la restauration"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "arrêt en cours"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "restauration en cours (suite à un arrêt brutal)"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "restauration en cours (à partir des archives)"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "en production"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "code de statut inconnu"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "wal_level non reconnu"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "aucun répertoire de données indiqué"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"ATTENTION : Les sommes de contrôle (CRC) calculées ne correspondent pas aux\n"
+"valeurs stockées dans le fichier.\n"
+"Soit le fichier est corrompu, soit son organisation diffère de celle\n"
+"attendue par le programme.\n"
+"Les résultats ci-dessous ne sont pas dignes de confiance.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "ATTENTION : taille invalide du segment WAL\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"La taille d'un segment WAL enregistré dans le fichier, %d octet, n'est pas une puissance de deux "
+"entre 1 Mo et 1 Go. Le fichier est corrompu et les résultats ci-dessous ne proviennent pas d'une "
+"source fiable.\n"
+"\n"
+msgstr[1] ""
+"La taille d'un segment WAL enregistré dans le fichier, %d octets, n'est pas une puissance de deux "
+"entre 1 Mo et 1 Go. Le fichier est corrompu et les résultats ci-dessous ne proviennent pas d'une "
+"source fiable.\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Numéro de version de pg_control : %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Numéro de version du catalogue : %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identifiant du système de base de données : %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "État du cluster de base de données : %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "Dernière modification de pg_control : %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Dernier point de contrôle : %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Dernier REDO (reprise) du point de contrôle : %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "Dernier fichier WAL du rejeu du point de contrôle : %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "Dernier TimeLineID du point de contrôle : %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "Dernier PrevTimeLineID du point de contrôle : %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Dernier full_page_writes du point de contrôle : %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "désactivé"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "activé"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "Dernier NextXID du point de contrôle : %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "Dernier NextOID du point de contrôle : %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "Dernier NextMultiXactId du point de contrôle : %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "Dernier NextMultiOffset du point de contrôle : %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "Dernier oldestXID du point de contrôle : %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "Dernier oldestXID du point de contrôle de la base : %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "Dernier oldestActiveXID du point de contrôle : %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "Dernier oldestMultiXid du point de contrôle : %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "Dernier oldestMulti du point de contrôle de base : %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "Dernier oldestCommitTsXid du point de contrôle : %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "Dernier newestCommitTsXid du point de contrôle : %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Heure du dernier point de contrôle : %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Faux compteur LSN pour les relations non journalisés : %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Emplacement de fin de la récupération minimale : %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Timeline de l'emplacement de fin de restauration : %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Début de la sauvegarde : %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Fin de la sauvegarde : %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Enregistrement de fin de sauvegarde requis : %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "non"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "oui"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "Paramètrage actuel de wal_level : %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "Paramétrage actuel de wal_log_hints : %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "Paramètrage actuel de max_connections : %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "Paramétrage actuel de max_worker_processes : %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "Paramètrage actuel de max_wal_senders : %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "Paramètrage actuel de max_prepared_xacts : %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "Paramètrage actuel de max_locks_per_xact : %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "Paramètrage actuel de track_commit_timestamp : %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Alignement maximal des données : %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Taille du bloc de la base de données : %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Blocs par segment des relations volumineuses : %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Taille de bloc du journal de transaction : %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Octets par segment du journal de transaction : %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Longueur maximale des identifiants : %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Nombre maximum de colonnes d'un index: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Longueur maximale d'un morceau TOAST : %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Taille d'un morceau de Large Object : %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Stockage du type date/heure : %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "entiers 64-bits"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Passage d'argument float8 : %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "par référence"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "par valeur"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Version des sommes de contrôle des pages de données : %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Nonce pour simuler une identité: %s\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help affiche cette aide et quitte\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version affiche la version et quitte\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en lecture : %s\n"
+
+#~ msgid "%s: could not read file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu lire le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not read file \"%s\": read %d of %d\n"
+#~ msgstr "%s : n'a pas pu lire le fichier « %s » : a lu %d sur %d\n"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Passage d'argument float4 : %s\n"
+
+#~ msgid "Prior checkpoint location: %X/%X\n"
+#~ msgstr "Point de contrôle précédent : %X/%X\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayer « %s --help » pour plus d'informations.\n"
+
+#~ msgid ""
+#~ "Usage:\n"
+#~ " %s [OPTION] [DATADIR]\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --help show this help, then exit\n"
+#~ " --version output version information, then exit\n"
+#~ msgstr ""
+#~ "Usage :\n"
+#~ " %s [OPTION] [RÉP_DONNÉES]\n"
+#~ "\n"
+#~ "Options :\n"
+#~ " --help affiche cette aide et quitte\n"
+#~ " --version affiche les informations de version et quitte\n"
+
+#~ msgid "calculated CRC checksum does not match value stored in file"
+#~ msgstr "la somme de contrôle CRC calculée ne correspond par à la valeur enregistrée dans le fichier"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "nombres à virgule flottante"
diff --git a/src/bin/pg_controldata/po/it.po b/src/bin/pg_controldata/po/it.po
new file mode 100644
index 0000000..814e334
--- /dev/null
+++ b/src/bin/pg_controldata/po/it.po
@@ -0,0 +1,551 @@
+#
+# pg_controldata.po
+# Italian message translation file for pg_controldata
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+# Copyright (C) 2010, Associazione Culturale ITPUG
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017
+# Cosimo D'Arcangelo <cosimo.darcangelo@itpug.org> 2010
+# Mirko Tebaldi <mirko.tebaldi@libero.it>, 2004
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:20+0000\n"
+"PO-Revision-Date: 2022-09-26 15:19+0200\n"
+"Last-Translator: Daniele Varrazzo <daniele.varrazzo@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "apertura del file \"%s\" in lettura fallita: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "lettura del file \"%s\" fallita: %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "lettura del file \"%s\" fallita: letti %d di %zu"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "chiusura del file \"%s\" fallita: %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "ordinamento dei byte non combaciante"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the "
+"one\n"
+"used by this program. In that case the results below would be incorrect, "
+"and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"possibile mancata corrispondenza dell'ordine dei byte\n"
+"L'ordine dei byte utilizzato per memorizzare il file pg_control potrebbe "
+"non corrispondere a quello\n"
+"utilizzato da questo programma. In tal caso i risultati seguenti non "
+"sarebbero corretti, e\n"
+"l'installazione di PostgreSQL sarebbe incompatibile con questa directory "
+"di dati."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "apertura del file \"%s\" fallita: %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "scrittura nel file \"%s\" fallita: %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "fsync del file \"%s\" fallito: %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s mostra informazioni di controllo su un cluster di database PostgreSQL.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [OPZIONE] [DATADIR]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opzioni:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR directory dei dati\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr ""
+" -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Se non viene specificata un directory per i dati (DATADIR) verrà usata la\n"
+"variabile d'ambiente PGDATA.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Segnala i bug a <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s pagina iniziale: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "avvio in corso"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "spento"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "arresto durante il ripristino"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "arresto in corso"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "in fase di recupero da un crash"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "in fase di recupero di un archivio"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "in produzione"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "codice di stato sconosciuto"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "wal_level sconosciuto"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "nessuna directory di dati specificata"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this "
+"program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"ATTENZIONE: Il codice di controllo CRC calcolato non combacia con quello\n"
+"memorizzato nel file. O il file è corrotto o ha un formato diverso da "
+"quanto\n"
+"questo programma si aspetta. I risultati seguenti non sono affidabili.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "ATTENZIONE: dimensione del segmento WAL non valida\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"La dimensione del segmento WAL memorizzata nel file, %d byte, non è una\n"
+"potenza di 2 tra 1 MB e 1 GB. Il file è corrotto e i risultati\n"
+"sottostanti non sono affidabili.\n"
+"\n"
+msgstr[1] ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "numero di versione di pg_control: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Numero di versione del catalogo: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr ""
+"Identificatore di sistema del database: %llu\n"
+"\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Stato del cluster di database: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "ultima modifica a pg_control: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Ultima posizione del checkpoint: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Locazione di REDO dell'ultimo checkpoint: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "File WAL di REDO dell'ultimo checkpoint: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineId dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "PrevTimeLineID dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Full_page_writes dell'ultimo checkpoint: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "disattivato"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "attivato"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID dell'ultimo checkpoint: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "OldestXID dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB dell'oldestXID dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "OldestActiveXID dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "OldestMultiXID dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB dell'oldestMulti dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "OldestCommitTsXid dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "NewestCommitTsXid dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Orario ultimo checkpoint: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Falso contatore LSN per rel. non loggate: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Posizione del minimum recovery ending: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Timeline posiz. minimum recovery ending: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Posizione dell'inizio del backup: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Posizione della fine del backup: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Record di fine backup richiesto: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "no"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "sì"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "impostazione di wal_level: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "impostazione di wal_log_hints: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "impostazione di max_connections: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "impostazione di max_worker_processes: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr ""
+"impostazione di max_wal_senders: %d\n"
+"\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "impostazione di max_prepared_xacts: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "impostazione di max_locks_per_xact: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "impostazione di track_commit_timestamp: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Massimo allineamento dei dati: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Dimensione blocco database: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Blocchi per ogni segmento grosse tabelle: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Dimensione blocco WAL: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Byte per segmento WAL: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Lunghezza massima degli identificatori: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Massimo numero di colonne in un indice: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Massima dimensione di un segmento TOAST: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Dimensione di un blocco large-object: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Memorizzazione per tipi data/ora: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "interi a 64 bit"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Passaggio di argomenti Float8: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "per riferimento"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "per valore"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Versione somma di controllo dati pagine: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Finto nonce di autenticazione: %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: apertura del file \"%s\" per la lettura fallita: %s\n"
+
+#~ msgid "%s: could not read file \"%s\": %s\n"
+#~ msgstr "%s: lettura del file \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not read file \"%s\": read %d of %d\n"
+#~ msgstr "%s: lettura del file \"%s\" fallita: letti %d di %d\n"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Passaggio di argomenti Float4: %s\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
diff --git a/src/bin/pg_controldata/po/ja.po b/src/bin/pg_controldata/po/ja.po
new file mode 100644
index 0000000..1e0c7e4
--- /dev/null
+++ b/src/bin/pg_controldata/po/ja.po
@@ -0,0 +1,526 @@
+# Japanese message translation file for pg_controldata
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# Shigehiro Honda <fwif0083@mb.infoweb.ne.jp>, 2005
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-09 12:00+0900\n"
+"PO-Revision-Date: 2022-05-10 13:48+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "ファイル\"%s\"を読み取り用にオープンできませんでした: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ファイル\"%s\"の読み取りに失敗しました: %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込みました"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ファイル\"%s\"をクローズできませんでした: %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "バイトオーダの不整合"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"バイトオーダが異なる可能性があります。\n"
+"pg_controlファイルを格納するために使用するバイトオーダが本プログラムで使用\n"
+"されるものと一致しないようです。この場合以下の結果は不正確になります。また、\n"
+"PostgreSQLインストレーションはこのデータディレクトリと互換性がなくなります。"
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンできませんでした: %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ファイル\"%s\"を書き出せませんでした: %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "ファイル\"%s\"をfsyncできませんでした: %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s はPostgreSQLデータベースクラスタの制御情報を表示します。\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [OPTION] [DATADIR]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"オプション:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR データディレクトリ\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"データディレクトリ(DATADIR)が指定されない場合、PGDATA環境変数が使用されます。\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "バグは<%s>に報告してください。\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "起動処理中"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "シャットダウン"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "リカバリ中にシャットダウンされている"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "シャットダウン処理中"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "クラッシュリカバリ中"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "アーカイブリカバリ中"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "運用中"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "未知のステータスコード"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "wal_level を認識できません"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細は\"%s --help\"を実行してください。"
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "データディレクトリが指定されていません"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"警告: CRCチェックサムの計算結果がファイル内の値と一致しません。\n"
+"ファイルの破損、あるいは、本プログラムが想定するレイアウトと異なる\n"
+"可能性があります。以下の結果は信頼できません。\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "警告: 不正なWALセグメントサイズ\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"ファイル中のWALセグメントサイズは %d バイトとなっていますが、これは\n"
+"1MBから1GBまでの2の累乗ではありません。このファイルは壊れており、\n"
+"以下の情報は信頼できません。\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_controlバージョン番号: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "カタログバージョン番号: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "データベースシステム識別子: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "データベースクラスタの状態: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control最終更新: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "最終チェックポイント位置: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "最終チェックポイントのREDO位置: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "最終チェックポイントのREDO WALファイル: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "最終チェックポイントの時系列ID: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "最終チェックポイントのPrevTimeLineID: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "最終チェックポイントのfull_page_writes: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "オフ"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "オン"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "最終チェックポイントのNextXID: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "最終チェックポイントのNextOID: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "最終チェックポイントのNextMultiXactId: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "最終チェックポイントのNextMultiOffset: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "最終チェックポイントのoldestXID: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "最終チェックポイントのoldestXIDのDB: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "最終チェックポイントのoldestActiveXID: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "最終チェックポイントのoldestMultiXid: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "最終チェックポイントのoldestMultiのDB: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "最終チェックポイントのoldestCommitTsXid: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "最終チェックポイントのnewestCommitTsXid: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "最終チェックポイント時刻: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "UNLOGGEDリレーションの偽のLSNカウンタ: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "最小リカバリ終了位置: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "最小リカバリ終了位置のタイムライン: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "バックアップ開始位置: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "バックアップ終了位置: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "必要なバックアップ最終レコード: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "いいえ"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "はい"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "wal_levelの設定: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "wal_log_hintsの設定: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "max_connectionsの設定: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "max_worker_processesの設定: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "max_wal_sendersの設定: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "max_prepared_xactsの設定: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "max_locks_per_xactの設定: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "track_commit_timestampの設定: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "最大データアラインメント: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "データベースのブロックサイズ: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "大きなリレーションのセグメント毎のブロック数:%u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WALのブロックサイズ: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "WALセグメント当たりのバイト数: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "識別子の最大長: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "インデックス内の最大列数: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOASTチャンクの最大サイズ: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "ラージオブジェクトチャンクのサイズ: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "日付/時刻型の格納方式: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64ビット整数"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8引数の渡し方: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "参照渡し"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "値渡し"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "データベージチェックサムのバージョン: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "認証用の疑似nonce: %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: 読み取り用の\"%s\"ファイルのオープンに失敗しました: %s\n"
+
+#~ msgid "%s: could not read file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\"ファイルの読み取りに失敗しました: %s\n"
+
+#~ msgid "%s: could not read file \"%s\": read %d of %d\n"
+#~ msgstr "%1$s: ファイル\"%2$s\"を読み込めませんでした: %4$dバイトのうち%3$dバイトを読み込みました\n"
+
+#~ msgid "Prior checkpoint location: %X/%X\n"
+#~ msgstr "前回のチェックポイント位置: %X/%X\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help このヘルプを表示して、終了します\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version バージョン情報を表示して、終了します\n"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Float4引数の渡し方: %s\n"
diff --git a/src/bin/pg_controldata/po/ka.po b/src/bin/pg_controldata/po/ka.po
new file mode 100644
index 0000000..49044c0
--- /dev/null
+++ b/src/bin/pg_controldata/po/ka.po
@@ -0,0 +1,515 @@
+# Georgian message translation file for pg_controldata
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_controldata (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:51+0000\n"
+"PO-Revision-Date: 2022-07-04 20:26+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "ფაილის (%s) გახსნის შეცდომა: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ფაილის (%s) წაკითხვის შეცდომა: %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "\"%s\"-ის წაკითხვის შეცდომა: წაკითხულია %d %zu-დან"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ფაილის (%s) დახურვის შეცდომა: %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "ბაიტების მიმდევრობა არ ემთხვევა"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the "
+"one\n"
+"used by this program. In that case the results below would be incorrect, "
+"and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"ბაიტების მიმდევრობის შესაძლო შეუსაბამობა pg_control ფაილის შესანახად "
+"გამოყენებული \n"
+"ბაიტების მიმდევრობა შესაძლოა არ ემთხვეოდეს ამ პროგრამის მიერ გამოყენებულს. "
+"ამ შემთხვევაში ქვემოთ \n"
+"მოცემული შედეგები არასწორი იქნება და PostgreSQL ეს აგება ამ მონაცემთა "
+"საქაღალდესთან შეუთავსებელი იქნება."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფაილის (%s) გახსნის შეცდომა: %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ფაილში (%s) ჩაწერის შეცდომა: %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "ფაილის (%s) fsync-ის შეცდომა: %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s გამოიტანს ინფორმაციას PostgreSQL ბაზის კლასტერის შესახებ.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "გამოყენება:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [პარამეტრი]... [მონაცემებისსაქაღალდე]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"პარამეტრები\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR მონაცემების საქაღალდე\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"თუ მონაცემების საქაღალდე მითითებული არაა, გამოყენებული იქნება \n"
+"გარემოს ცვლადი PGDATA.\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "შეცდომების შესახებ მიწერეთ: <%s>\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "გაშვება"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "გამორთვა"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "გამორთვა აღდგენსთვის"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "მიმდინარეობს გამორთვა"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "ავარიის აღდგენა"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "არქივიდან აღდგენა"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "წარმოებაში გაშვებული"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "სტატუსის უცნობი კოდი"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "უცნობი wal_level"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "მონაცემების საქაღალდე მითითებული არაა"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this "
+"program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"გაფრთხილება: გამოთვლილი CRC საკონტროლო ჯამი ფაილში შენახულ მნიშვნელობას არ "
+"ემთხვევა. \n"
+"ფაილი ან დაზიანებულია, ან აქვს განსხვავებული მიმდევრობა. ვიდრე \n"
+"პროგრამა ელოდება. ქვემოთ მოყვანილი შედეგები არასანდოა.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "გაფრთხლება: WAL-ის სეგმენტის არასწორი ზომა\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"ფაილში შენახული WAL სეგმენტის ზომა, %d ბაიტი, არ არის ორის \n"
+"ხარისხი1 მბ-დან 1 გბ-მდე. ფაილი დაზიანებულია და ქვემოთ მოცემულია შედეგები\n"
+"არასანდოა.\n"
+msgstr[1] ""
+"ფაილში შენახული WAL სეგმენტის ზომა, %d ბაიტი, არ არის ორის \n"
+"ხარისხი1 მბ-დან 1 გბ-მდე. ფაილი დაზიანებულია და ქვემოთ მოცემულია შედეგები\n"
+"არასანდოა.\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control ვერსიის ნომერი: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "კატალოგის ვერსიის ნომერი: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "ბაზის სისტემური იდენტიფიკატორი: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "ბაზის კლასტერის მდგომარეობა: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control-ის ბოლო ცვლილების დრო: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "საკონტროლო წერტილის უკანასკნელი მდებარეობა: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "საკონტროლო წერტილის REDO-ის უკანასკნელი მდებარეობა: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "უკანასკნელი საკონტროლო წერტილის REDO WAL ფაილი: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "უახლესი საკონტროლო წერტილისTimeLineID: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის PrevTimeLineID: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "უახლესი უკანასკნელი საკონტროლო წერტილის full_page_writes: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "გამორთული"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "ჩართ"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "უახლესი საკონტროლო წერტილის NextXID: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის NextOID: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის NextMultiXactId: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის NextMultiOffset: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის oldestXID: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის oldestXID's DB: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის oldestActiveXID: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის oldestMultiXid: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის oldestMulti's DB: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "უახლესი საკონტროლო წერტილის oldestCommitTsXid:%u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "უახლესი საკონტროლო წერტილის newestCommitTsXid:%u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "უახლესი საკონტოლო წერტილის დრო: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "LSN-ის ყალბი მთვლელი არაჟურნალიზებადი ურთ-თვის: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "მინიმალური აღდგენის დასასრულის მდებარეობა %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "მინ. აღდგ დასასრ მდებარ დროის ხაზი: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "მარქაფის დაწყების მდებარეობა: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "მარქაფს დასასრულის მდებარეობა: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "მარქაფის-ბოლო ჩანაწერი აუცილებელია: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "არა"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "დიახ"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "wal_level პარამეტრი: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "wal_log_hints პარამეტრი: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "max_connections პარამეტრი: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "max_worker_processes პარამეტრი: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "max_wal_senders პარამეტრი: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "max_prepared_xacts პარამეტრი: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "max_locks_per_xact პარამეტრი: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "track_commit_timestamp პარამეტრი: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "მონაცემების სწორების მაქსიმუმი: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "ბაზის ბლოკის ზომა: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "დიდი ურთიერთობის სეგმენტები თითოეულ ბლოკში: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL ბლოკის ზომა: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "ბაიტები თითოეულ WAL სეგმენტში: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "იდენტიფიკატორების მაქსიმალური სიგრძე: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "ინდექსში სვეტების მაქსიმალური რაოდენობა: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST ნაგლეჯის მაქსიმალური ზომა: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "დიდი ობიექტის ნაგლეჯის ზომა: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "თარიღის ტიპის საცავი: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64-ბიტიანი მთელ რიცხვები"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8 არგუმენტის გადაცემა: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "ბმით"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "მნიშვნელობით"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "მონაცემების გვერდის საკონტროლო ჯამის ვერსია: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "ფსევდოავთენტიკაციის შემთხვევითი რიცხვი: %s\n"
diff --git a/src/bin/pg_controldata/po/ko.po b/src/bin/pg_controldata/po/ko.po
new file mode 100644
index 0000000..784f452
--- /dev/null
+++ b/src/bin/pg_controldata/po/ko.po
@@ -0,0 +1,508 @@
+# Korean message translation file for PostgreSQL pg_controldata
+# Ioseph Kim <ioseph@uri.sarang.net>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:50+0000\n"
+"PO-Revision-Date: 2023-04-05 18:06+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean Team <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "\"%s\" 파일을 읽기 모드로 열 수 없습니다: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "\"%s\" 파일을 읽을 수 없습니다: %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "\"%s\" 파일을 읽을 수 없음: %d 읽음, 전체 %zu"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "\"%s\" 파일을 닫을 수 없습니다: %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "바이트 순서 불일치"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, "
+"and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"바이트 순서가 일치하지 않습니다.\n"
+"pg_control 파일을 저장하는 데 사용된 바이트 순서는 \n"
+"이 프로그램에서 사용하는 순서와 일치해야 합니다. 이 경우 아래 결과는\n"
+"올바르지 않으며 이 데이터 디렉터리에 PostgreSQL을 설치할 수 없습니다."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파일을 읽을 수 없습니다: %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "\"%s\" 파일을 쓸 수 없습니다: %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "\"%s\" 파일을 fsync 할 수 없습니다: %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 PostgreSQL 데이터베이스 클러스터의 제어정보를 보여줌.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [옵션] [DATADIR]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"옵션들:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR 데이터 디렉터리\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보 보여주고 마침\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"DATADIR인 데이터 디렉터리를 지정하지 않으며, PGDATA 환경 변수값을\n"
+"사용합니다.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "문제점 보고 주소: <%s>\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "시작 중"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "중지됨"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "복구 작업 중 중지됨"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "중지 중"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "비정상 종료 복구 중"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "자료 복구 중"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "정상가동중"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "알수 없는 상태 코드"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "알 수 없는 wal_level"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "자세한 사항은 \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 많은 명령행 인수를 지정했습니다. (처음 \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "데이터 디렉터리를 지정하지 않았습니다"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"경고: 계산된 CRC 체크섬값이 파일에 있는 값과 틀립니다.\n"
+"이 경우는 파일이 손상되었거나, 이 프로그램과 컨트롤 파일의 버전이 틀린\n"
+"경우입니다. 결과값들은 믿지 못할 값들이 출력될 수 있습니다.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "경고: 잘못된 WAL 조각 크기\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"저장된 WAL 조각 파일의 크기는 %d 바이트입니다. 이 값은 1MB부터 1GB사이\n"
+"2^n 값이 아닙니다. 파일이 손상되었으며, 결과 또한 믿을 수 없습니다.\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control 버전 번호: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "카탈로그 버전 번호: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "데이터베이스 시스템 식별자: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "데이터베이스 클러스터 상태: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control 마지막 변경시간: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "마지막 체크포인트 위치: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "마지막 체크포인트 REDO 위치: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "마지막 체크포인트 REDO WAL 파일: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "마지막 체크포인트 TimeLineID: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "마지막 체크포인트 PrevTimeLineID: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "마지막 체크포인트 full_page_writes: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "off"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "on"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "마지막 체크포인트 NextXID: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "마지막 체크포인트 NextOID: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "마지막 체크포인트 NextMultiXactId: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "마지막 체크포인트 NextMultiOffset: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "마지막 체크포인트 제일오래된XID: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "마지막 체크포인트 제일오래된XID의 DB: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "마지막 체크포인트 제일오래된ActiveXID:%u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "마지막 체크포인트 제일오래된MultiXid: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "마지막 체크포인트 제일오래된멀티Xid DB:%u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "마지막 체크포인트 제일오래된CommitTsXid:%u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "마지막 체크포인트 최신CommitTsXid: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "마지막 체크포인트 시간: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "언로그 릴레이션의 가짜 LSN 카운터: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "최소 복구 마지막 위치: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "최소 복구 종료 위치의 타임라인: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "백업 시작 위치: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "백업 종료 위치: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "백업 종료 레코드 필요 여부: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "아니오"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "예"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "wal_level 설정값: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "wal_log_hints 설정값: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "max_connections 설정값: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "max_worker_processes 설정값: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "max_wal_senders 설정값: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "max_prepared_xacts 설정값: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "max_locks_per_xact 설정값: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "track_commit_timestamp 설정값: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "최대 자료 정렬: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "데이터베이스 블록 크기: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "대형 릴레이션의 세그먼트당 블럭 개수: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL 블록 크기: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "WAL 세그먼트의 크기(byte): %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "식별자 최대 길이: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "인덱스에서 사용하는 최대 열 수: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST 청크 최대 크기: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "대형 객체 청크 크기: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "날짜/시간형 자료의 저장방식: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64-비트 정수"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8 인수 전달: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "참조별"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "값별"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "데이터 페이지 체크섬 버전: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "임시 모의 인증: %s\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "보다 자세한 정보는 \"%s --help\"\n"
diff --git a/src/bin/pg_controldata/po/pt_BR.po b/src/bin/pg_controldata/po/pt_BR.po
new file mode 100644
index 0000000..14f8bd2
--- /dev/null
+++ b/src/bin/pg_controldata/po/pt_BR.po
@@ -0,0 +1,512 @@
+# Brazilian Portuguese message translation file for pg_controldata
+
+# Copyright (C) 2002-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Cesar Suga <sartre@linuxbr.com>, 2002.
+# Roberto Mello <rmello@fslc.usu.edu>, 2002.
+# Euler Taveira <euler@eulerto.com>, 2003-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-27 13:15-0300\n"
+"PO-Revision-Date: 2005-10-04 23:00-0300\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n>1);\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "não pôde abrir arquivo \"%s\" para leitura: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "não pôde ler arquivo \"%s\": %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "não pôde ler arquivo \"%s\", leu %d de %zu"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "não pôde fechar arquivo \"%s\": %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "ordenação de bytes não corresponde"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"possível não correspondência da ordenação de bytes\n"
+"A ordenação de bytes utilizada para armazenar o arquivo pg_control pode não \n"
+"corresponder com a utilizada por este programa. Neste caso os resultados abaixo\n"
+"seriam incorretos, e a instalação do PostgreSQL seria incompatível com o diretório de dados."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "não pôde abrir arquivo \"%s\": %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "não pôde escrever no arquivo \"%s\": %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "não pôde executar fsync no arquivo \"%s\": %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s mostra informações de controle de um agrupamento de banco de dados PostgreSQL.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [OPÇÃO] [DIRDADOS]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opções:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DIRDADOS diretório de dados\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Se o diretório de dados (DIRDADOS) não for especificado, a variável de ambiente PGDATA\n"
+"é utilizada.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Relate erros a <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "página web do %s: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "iniciando"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "desligado"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "desligado em recuperação"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "desligando"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "recuperando de uma queda"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "recuperando de uma cópia"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "em produção"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "código de status desconhecido"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "wal_level desconhecido"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Tente \"%s --help\" para obter informações adicionais."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "muitos argumentos de linha de comando (primeiro é \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "nenhum diretório de dados foi especificado"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"AVISO: A soma de verificação de CRC não é a mesma do valor armazenado no arquivo.\n"
+"O arquivo está corrompido ou tem um formato diferente do que este programa\n"
+"está esperando. Os resultados abaixo não são confiáveis.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "AVISO: tamanho do segmento do WAL inválido\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"Tamanho do segmento do WAL armazenado no arquivo, %d byte, não é uma potência de\n"
+"dois entre 1 MB e 1 GB. O arquivo está corrompido e os resultados abaixos não são\n"
+"confiáveis.\n"
+msgstr[1] ""
+"Tamanho do segmento do WAL armazenado no arquivo, %d bytes, não é uma potência de\n"
+"dois entre 1 MB e 1 GB. O arquivo está corrompido e os resultados abaixos não são\n"
+"confiáveis.\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "número da versão do pg_control: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Número da versão do catálogo: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identificador do sistema de banco de dados: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Estado do agrupamento de banco de dados: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "Última modificação do pg_control: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Local do último ponto de controle: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Local de REDO do último ponto de controle: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "Arquivo com REDO do último ponto de controle: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID do último ponto de controle: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "PrevTimeLineID do último ponto de controle: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "full_page_writes do último ponto de controle: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "desabilitado"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "habilitado"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID do último ponto de controle: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID do último ponto de controle: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId do último ponto de controle: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset do último ponto de controle: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID do último ponto de controle: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "BD do oldestXID do último ponto de controle: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID do último ponto de controle: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid do último ponto de controle: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "BD do oldestMulti do último ponto de controle: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid do último ponto de controle: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid do último ponto de controle: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Hora do último ponto de controle: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Contador LSN falso para relações unlogged: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Local final mínimo de recuperação: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Linha do tempo do local final mínimo de recuperação: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Local de início da cópia de segurança: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Local de fim da cópia de segurança: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Registro de fim-da-cópia-de-segurança requerido: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "não"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "sim"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "Definição de wal_level: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "Definição de wal_log_hints: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "Definição de max_connections: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "Definição de max_worker_processes: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "Definição de max_wal_senders: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "Definição de max_prepared_xacts: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "Definição de max_locks_per_xact: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "Definição de track_commit_timestamp: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Máximo alinhamento de dado: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Tamanho do bloco do banco de dados: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Blocos por segmento da relação grande: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Tamanho do bloco do WAL: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytes por segmento do WAL: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Tamanho máximo de identificadores: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Máximo de colunas em um índice: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Tamanho máximo do bloco TOAST: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Tamanho máximo do bloco de objeto grande: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Tipo de data/hora do repositório: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "inteiros de 64 bits"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Passagem de argumento float8: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "por referência"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "por valor"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Versão da verificação de páginas de dados: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "nonce para autenticação simulada: %s\n"
diff --git a/src/bin/pg_controldata/po/ru.po b/src/bin/pg_controldata/po/ru.po
new file mode 100644
index 0000000..f33621c
--- /dev/null
+++ b/src/bin/pg_controldata/po/ru.po
@@ -0,0 +1,585 @@
+# Russian message translation file for pg_controldata
+# Copyright (C) 2002-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Serguei A. Mokhov <mokhov@cs.concordia.ca>, 2002-2004.
+# Oleg Bartunov <oleg@sai.msu.su>, 2004.
+# Andrey Sudnik <sudnikand@gmail.com>, 2011.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2017, 2018, 2019, 2020, 2021, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 09:09+0300\n"
+"PO-Revision-Date: 2022-09-05 13:34+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../../common/controldata_utils.c:83
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "не удалось открыть файл \"%s\" для чтения: %m"
+
+#: ../../common/controldata_utils.c:96
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не удалось прочитать файл \"%s\": %m"
+
+#: ../../common/controldata_utils.c:105
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %zu)"
+
+#: ../../common/controldata_utils.c:118 ../../common/controldata_utils.c:274
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "не удалось закрыть файл \"%s\": %m"
+
+#: ../../common/controldata_utils.c:154
+msgid "byte ordering mismatch"
+msgstr "несоответствие порядка байт"
+
+#: ../../common/controldata_utils.c:156
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, "
+"and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"возможно несоответствие порядка байт\n"
+"Порядок байт в файле pg_control может не соответствовать используемому\n"
+"этой программой. В этом случае результаты будут неверными и\n"
+"установленный PostgreSQL будет несовместим с этим каталогом данных."
+
+#: ../../common/controldata_utils.c:224
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалось открыть файл \"%s\": %m"
+
+#: ../../common/controldata_utils.c:243
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не удалось записать файл \"%s\": %m"
+
+#: ../../common/controldata_utils.c:262
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "не удалось синхронизировать с ФС файл \"%s\": %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s показывает информацию о работе кластера баз PostgreSQL.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Использование:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [ПАРАМЕТР] [КАТ_ДАННЫХ]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметры:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]КАТ_ДАННЫХ каталог данных\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Если каталог данных (КАТ_ДАННЫХ) не задан, используется значение\n"
+"переменной окружения PGDATA.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Об ошибках сообщайте по адресу <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "запускается"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "выключен"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "выключен при восстановлении"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "выключение"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "восстановление после сбоя"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "восстановление из архива"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "в работе"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "нераспознанный код состояния"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "нераспознанный уровень WAL"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Для дополнительной информации попробуйте \"%s --help\"."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "слишком много аргументов командной строки (первый: \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог данных не указан"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"ПРЕДУПРЕЖДЕНИЕ: Вычисленная контрольная сумма не совпадает со значением в "
+"файле.\n"
+"Либо файл повреждён, либо его формат отличается от ожидаемого.\n"
+"Следующая информация может быть недостоверной.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: неверный размер сегмента WAL\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"Сохранённый в этом файле размер сегмента WAL (байт: %d) не является "
+"степенью\n"
+"двух между 1 МБ и 1 ГБ. Файл испорчен, выводимая ниже информация\n"
+"подлежит сомнению.\n"
+"\n"
+msgstr[1] ""
+"Сохранённый в этом файле размер сегмента WAL (байт: %d) не является "
+"степенью\n"
+"двух между 1 МБ и 1 ГБ. Файл испорчен, выводимая ниже информация\n"
+"подлежит сомнению.\n"
+"\n"
+msgstr[2] ""
+"Сохранённый в этом файле размер сегмента WAL (байт: %d) не является "
+"степенью\n"
+"двух между 1 МБ и 1 ГБ. Файл испорчен, выводимая ниже информация\n"
+"подлежит сомнению.\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Номер версии pg_control: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Номер версии каталога: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Идентификатор системы баз данных: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Состояние кластера БД: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "Последнее обновление pg_control: %s\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Положение последней конт. точки: %X/%X\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Положение REDO последней конт. точки: %X/%X\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "Файл WAL c REDO последней к. т.: %s\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "Линия времени последней конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "Пред. линия времени последней к. т.: %u\n"
+
+# skip-rule: no-space-after-period
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Режим full_page_writes последней к.т: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "выкл."
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "вкл."
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID последней конт. точки: %u:%u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID последней конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId послед. конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset послед. конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID последней конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "БД с oldestXID последней конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID последней к. т.: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid последней конт. точки: %u\n"
+
+# skip-rule: double-space, capital-letter-first
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "БД с oldestMulti последней к. т.: %u\n"
+
+# skip-rule: double-space, capital-letter-first
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid последней к. т.: %u\n"
+
+# skip-rule: capital-letter-first, double-space
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid последней к. т.: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Время последней контрольной точки: %s\n"
+
+# skip-rule: capital-letter-first
+# well-spelled: нежурналир
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Фиктивный LSN для нежурналир. таблиц: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Мин. положение конца восстановления: %X/%X\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Линия времени мин. положения к. в.: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Положение начала копии: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Положение конца копии: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Требуется запись конец-копии: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "нет"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "да"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "Значение wal_level: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "Значение wal_log_hints: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "Значение max_connections: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "Значение max_worker_processes: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "Значение max_wal_senders: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "Значение max_prepared_xacts: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "Значение max_locks_per_xact: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "Значение track_commit_timestamp: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Макс. предел выравнивания данных: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Размер блока БД: %u\n"
+
+# skip-rule: double-space
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Блоков в макс. сегменте отношений: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Размер блока WAL: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Байт в сегменте WAL: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Максимальная длина идентификаторов: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Макс. число столбцов в индексе: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Максимальный размер порции TOAST: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Размер порции большого объекта: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Формат хранения даты/времени: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64-битные целые"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Передача аргумента float8: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "по ссылке"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "по значению"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Версия контрольных сумм страниц: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Случ. число для псевдоаутентификации: %s\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Передача аргумента Float4: %s\n"
+
+# skip-rule: capital-letter-first
+#~ msgid "Prior checkpoint location: %X/%X\n"
+#~ msgstr "Положение предыдущей конт. точки: %X/%X\n"
+
+#~ msgid "calculated CRC checksum does not match value stored in file"
+#~ msgstr ""
+#~ "вычисленная контрольная сумма (CRC) не соответствует значению, "
+#~ "сохранённому в файле"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "числа с плавающей точкой"
+
+#~ msgid ""
+#~ "Usage:\n"
+#~ " %s [OPTION] [DATADIR]\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --help show this help, then exit\n"
+#~ " --version output version information, then exit\n"
+#~ msgstr ""
+#~ "Использование:\n"
+#~ " %s [ПАРАМЕТР] [КАТАЛОГ_ДАННЫХ]\n"
+#~ "\n"
+#~ "Параметры:\n"
+#~ " --help показать эту справку и выйти\n"
+#~ " --version показать версию и выйти\n"
+
+#~ msgid "enabled"
+#~ msgstr "включен"
+
+#~ msgid "disabled"
+#~ msgstr "отключен"
diff --git a/src/bin/pg_controldata/po/sv.po b/src/bin/pg_controldata/po/sv.po
new file mode 100644
index 0000000..aa7501a
--- /dev/null
+++ b/src/bin/pg_controldata/po/sv.po
@@ -0,0 +1,518 @@
+# Swedish message translation file for pg_controldata
+# This file is put in the public domain.
+# Dennis Björklund <db@zigo.dhs.org>, 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022.
+# Mats Erik Andersson <bsd@gisladisker.se>, 2014.
+#
+# Use these quotes: "%s"
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-11 09:21+0000\n"
+"PO-Revision-Date: 2022-04-11 14:40+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "kunde inte öppna filen \"%s\" för läsning: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "kunde inte läsa fil \"%s\": %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "kunde inte läsa fil \"%s\": läste %d av %zu"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "kunde inte stänga fil \"%s\": %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "byte-ordning stämmer inte"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"möjligt fel i byteordning\n"
+"Den byteordning som filen från pg_control lagrats med passar kanske\n"
+"inte detta program. I så fall kan nedanstående resultat vara felaktiga\n"
+"och PostgreSQL-installationen vara inkompatibel med databaskatalogen."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "kunde inte skriva fil \"%s\": %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "kunde inte fsync:a fil \"%s\": %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s visar kontrollinformation om ett databaskluster för PostgreSQL.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [FLAGGA] [DATAKATALOG]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Flaggor:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR datakatalog\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa den här hjälpen, avsluta sedan\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Om ingen datakatalog (DATAKATALOG) har angivits så nyttjas omgivningsvariabeln\n"
+"PGDATA för detta syfte.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapportera fel till <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "startar"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "avstängt"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "avslutat med återställning"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "stänger ner"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "återställer efter krash"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "utför arkivåterställning"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "i full drift"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "okänd statuskod"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "okänd wal_level"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "ingen datakatalog angiven"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"VARNING: Beräknad CRC-kontrollsumma matchar inte det värde som har sparats i filen.\n"
+"Antingen är filen trasig, eller så har den en annan uppbyggnad än vad detta\n"
+"program förväntade sig. Resultatet nedan är inte helt tillförlitligt.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "VARNING: ogiltig WAL-segmentstorlek\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"WAL-segmentstorleken sparad i filen, %d byte, är inte en tvåpotens\n"
+"mellan 1 MB och 1 GB. Filen är trasig och resultatet nedan går\n"
+"ej att lita på.\n"
+"\n"
+msgstr[1] ""
+"WAL-segmentstorleken sparad i filen, %d byte, är inte en tvåpotens\n"
+"mellan 1 MB och 1 GB. Filen är trasig och resultatet nedan går\n"
+"ej att lita på.\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+# Sep. 6th, 2014:
+# Insert additional spaces in translated strings for the
+# purpose of alignment. Of lingustic reasons the separation
+# used for English is insufficient for Swedish. New indenting
+# is consistent for all reporting statements: six additional
+# space characters.
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Versionsnummer för pg_control: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Katalogversion: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Databasens systemidentifierare: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Databasklustrets tillstånd: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control ändrades senast: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Läge för senaste checkpoint: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "REDO-läge för senaste checkpoint: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "REDO-WAL-fil vid senaste checkpoint: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID vid senaste checkpoint: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "PrevTimeLineID vid senaste checkpoint: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Senaste checkpoint:ens full_page_writes: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "av"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "på"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID vid senaste checkpoint: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID vid senaste checkpoint: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId vid senaste checkpoint: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset vid senaste checkpoint: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID vid senaste checkpoint: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB för oldestXID vid senaste checkpoint: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID vid senaste checkpoint: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid vid senaste checkpoint: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB för oldestMulti vid senaste checkpoint: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid vid senaste checkpoint: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid vid senaste checkpoint: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Tidpunkt för senaste checkpoint: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Beräknat LSN-tal av ologgade relationer: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Minsta slutposition vid återställning: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Tidslinje för min slutpos vid återställning:%u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Startpunkt för backup: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Slutpunkt för backup: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Tvingande markering av backupslut: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "nej"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "ja"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "Värde på wal_level: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "Värde på wal_log_hints: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "Värde på max_connections: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "Värde på max_worker_processes: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "Värde på max_wal_senders setting %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "Värde på max_prepared_xacts: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "Nuvarande max_locks_per_xact: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "Värde på track_commit_timestamp: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Maximal jämkning av data (alignment): %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Databasens blockstorlek: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Block per segment i en stor relation: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Blockstorlek i transaktionsloggen: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Segmentstorlek i transaktionsloggen: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Maximal längd för identifierare: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Maximalt antal kolonner i ett index: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Maximal storlek för en TOAST-enhet: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Storlek för large-object-enheter: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Representation av dag och tid: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64-bitars heltal"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Överföring av float8-argument: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "med referens"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "med värde"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Checksummaversion för datasidor: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Fejkat authentiseringsvärde: %s\n"
diff --git a/src/bin/pg_controldata/po/tr.po b/src/bin/pg_controldata/po/tr.po
new file mode 100644
index 0000000..528889f
--- /dev/null
+++ b/src/bin/pg_controldata/po/tr.po
@@ -0,0 +1,555 @@
+# translation of pg_controldata.po to Turkish
+# Devrim GUNDUZ <devrim@CommandPrompt.com>, 2004, 2005, 2006.
+# Nicolai TUFAR <ntufar@gmail.com>, 2004, 2005, 2006.
+# Abdullah Gülner <agulner@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata-tr\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-11-27 07:46+0000\n"
+"PO-Revision-Date: 2018-11-27 16:39+0300\n"
+"Last-Translator: Abdullah Gülner\n"
+"Language-Team: Turkish <ceviri@postgresql.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../common/controldata_utils.c:62
+#, c-format
+msgid "%s: could not open file \"%s\" for reading: %s\n"
+msgstr "%s: \"%s\" dosyası okunmak için açılamadı: %s\n"
+
+#: ../../common/controldata_utils.c:78
+#, c-format
+msgid "%s: could not read file \"%s\": %s\n"
+msgstr "%s: \"%s\" dosyası okunamadı: %s\n"
+
+#: ../../common/controldata_utils.c:90
+#, c-format
+msgid "%s: could not read file \"%s\": read %d of %d\n"
+msgstr ""
+"%1$s: \"%2$s\" dosyası okuma hatası: %4$d nin %3$d si okundu\n"
+
+#: ../../common/controldata_utils.c:112
+msgid "byte ordering mismatch"
+msgstr "byte sıralama uyuşmazlığı"
+
+#: ../../common/controldata_utils.c:114
+#, c-format
+msgid ""
+"WARNING: possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not "
+"match the one\n"
+"used by this program. In that case the results below would be "
+"incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this "
+"data directory.\n"
+msgstr ""
+"UYARI: olası bayt sıralama uyumsuzluğu\n"
+"pg_control dosyasını saklamak için kullanılan bayt sıralaması, "
+"bu program\n"
+"tarafından kullanılan sıralama ile uyuşmayabilir. Bu durumda "
+"aşağıdaki\n"
+"sonuçlar yanlış olacak ve PostgreSQL kurulumu bu veri dizini "
+"ile uyumsuz\n"
+"olacaktır.\n"
+
+#: pg_controldata.c:34
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database "
+"cluster.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL veritabanı kümesinin kontrol bilgisini "
+"gösterir.\n"
+"\n"
+
+#: pg_controldata.c:35
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [SEÇENEK] [DATADIR]\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Seçenekler:\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR veri dizini\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid ""
+" -V, --version output version information, then "
+"exit\n"
+msgstr ""
+" -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment "
+"variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Eğer hiçbir veri dizini (DATADIR) belirtilmezse, PGDATA "
+"çevresel değişkeni\n"
+"kullanılır.\n"
+"\n"
+
+#: pg_controldata.c:43
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"Hataları <pgsql-bugs@postgresql.org> adresine "
+"bildirebilirsiniz.\n"
+
+#: pg_controldata.c:53
+msgid "starting up"
+msgstr "başlıyor"
+
+#: pg_controldata.c:55
+msgid "shut down"
+msgstr "kapat"
+
+#: pg_controldata.c:57
+msgid "shut down in recovery"
+msgstr "kurtarma modunda kapatma"
+
+#: pg_controldata.c:59
+msgid "shutting down"
+msgstr "kapanıyor"
+
+#: pg_controldata.c:61
+msgid "in crash recovery"
+msgstr "çöküş (crash) kurtarma modunda"
+
+#: pg_controldata.c:63
+msgid "in archive recovery"
+msgstr "arşiv kurtarma modunda"
+
+#: pg_controldata.c:65
+msgid "in production"
+msgstr "üretim modunda"
+
+#: pg_controldata.c:67
+msgid "unrecognized status code"
+msgstr "tanımlayamayan durum kodu"
+
+#: pg_controldata.c:82
+msgid "unrecognized wal_level"
+msgstr "tanımsız wal_level değeri"
+
+#: pg_controldata.c:136 pg_controldata.c:154 pg_controldata.c:162
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr ""
+"Ayrıntılı bilgi için \"%s --help\" komutunu "
+"kullanabilirsiniz.\n"
+
+#: pg_controldata.c:152
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: Çok fazla komut satırı girdisi var (ilki \"%s\")\n"
+
+#: pg_controldata.c:161
+#, c-format
+msgid "%s: no data directory specified\n"
+msgstr "%s: hiçbir veri dizini belirtilmedi\n"
+
+#: pg_controldata.c:169
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored "
+"in file.\n"
+"Either the file is corrupt, or it has a different layout than "
+"this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"UYARI: Hesaplanan CRC kontrol toplamı dosyadakinden farklı.\n"
+"Dosya zarar görmüş ya da bu programın beklediğinden farklı \n"
+"bir yapıya sahip olabilir. Aşağıdaki sonuçlar güvenilir "
+"değildir.\n"
+"\n"
+
+#: pg_controldata.c:178
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "UYARI: geçersiz WAL kesim boyutu (segment size)\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a "
+"power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results "
+"below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a "
+"power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results "
+"below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"Dosyada tutulan WAL segment boyutu, %d bayt, 1MB ve 1GB \n"
+"arasında ikinin bir üssü değil. Dosya bozuk ve aşağıdaki "
+"sonuçlar\n"
+"güvenilmez.\n"
+msgstr[1] ""
+"Dosyada tutulan WAL segment boyutu, %d bayt, 1MB ve 1GB \n"
+"arasında ikinin bir üssü değil. Dosya bozuk ve aşağıdaki "
+"sonuçlar\n"
+"güvenilmez.\n"
+
+#: pg_controldata.c:221
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control sürüm numarası: %u\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Katalog sürüm numarası: %u\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Database system identifier: %s\n"
+msgstr "Veritabanı sistem belirteci: %s\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Veritabanı kümesinin durumu: %s\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control son düzenlenme tarihi: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "En son checkpoint yeri: %X/%X\n"
+
+#: pg_controldata.c:247
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "En son checkpoint'in REDO yeri: %X/%X\n"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "En son checkpoint'in REDO WAL dosyası: %s\n"
+
+#: pg_controldata.c:252
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "En son checkpoint'in TimeLineID'si: %u\n"
+
+#: pg_controldata.c:254
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "En son checkpoint'in PrevTimeLineID'si: %u\n"
+
+#: pg_controldata.c:256
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "En son checkpoint'in full_page_writes'ı: %s\n"
+
+#: pg_controldata.c:257 pg_controldata.c:302 pg_controldata.c:312
+msgid "off"
+msgstr "kapalı"
+
+#: pg_controldata.c:257 pg_controldata.c:302 pg_controldata.c:312
+msgid "on"
+msgstr "açık"
+
+#: pg_controldata.c:258
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "En son checkpoint'in NextXID'si: %u:%u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "En son checkpoint'in NextOID'si: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "En son checkpoint'in NextMultiXactId'si: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "En son checkpoint'in NextMultiOffset'i: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "En son checkpoint'in oldestXID'si: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "En son checkpoint'in oldestXID'sini DB'si: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "En son checkpoint'in odestActiveXID'si: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "En son checkpoint'in oldestMultiXid'si: %u\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "En son checkpoint'in oldestMulti'sinin DB'si: %u\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "En son checkpoint'in oldestCommitTsXid'si: %u\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "En son checkpoint'in newestCommitTsXid'si: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "En son checkpoint'in zamanı: %s\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Loglanmayan nesneler için sahte LSN sayacı: %X/%X\n"
+
+#: pg_controldata.c:286
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Minimum kurtarma sonlandırma yeri: %X/%X\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr ""
+"Minimum kurtarma sonlandırma yerinin zaman çizelgesi: %u\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Yedek başlama yeri: %X/%X\n"
+
+#: pg_controldata.c:294
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Yedek bitiş yeri: %X/%X\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Yedek sonu kaydı gerekiyor: %s\n"
+
+#: pg_controldata.c:298
+msgid "no"
+msgstr "hayır"
+
+#: pg_controldata.c:298
+msgid "yes"
+msgstr "evet"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "wal_level ayarı: %s\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "wal_log_hints ayarı: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "max_connections ayarı: %d\n"
+
+#: pg_controldata.c:305
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "max_worker_processes ayarı: %d\n"
+
+#: pg_controldata.c:307
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "max_prepared_xacts ayarı: %d\n"
+
+#: pg_controldata.c:309
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "max_locks_per_xact ayarı: %d\n"
+
+#: pg_controldata.c:311
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "track_commit_timestamp ayarı: %s\n"
+
+#: pg_controldata.c:313
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Azami veri hizalama: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Veritabanı blok boyutu: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Büyük ilişkilerin parçası başına blok sayısı: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL blok boyutu: %u\n"
+
+#: pg_controldata.c:322
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr ""
+"Her bir WAL parçası başına byte sayısı: %u\n"
+
+#: pg_controldata.c:324
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Belirteçlerin en fazla uzunluğu: %u\n"
+
+#: pg_controldata.c:326
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "İndekste en fazla kolon sayısı: %u\n"
+
+#: pg_controldata.c:328
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST parçasının en yüksek boyutu: %u\n"
+
+#: pg_controldata.c:330
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Bir büyük-nesne parçasının boyutu: %u\n"
+
+#: pg_controldata.c:333
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Tarih/zaman tipi saklanması: %s\n"
+
+#: pg_controldata.c:334
+msgid "64-bit integers"
+msgstr "64-bit tamsayı"
+
+#: pg_controldata.c:335
+#, c-format
+msgid "Float4 argument passing: %s\n"
+msgstr "Float4 argument passing: %s\n"
+
+#: pg_controldata.c:336 pg_controldata.c:338
+msgid "by reference"
+msgstr "referans ile"
+
+#: pg_controldata.c:336 pg_controldata.c:338
+msgid "by value"
+msgstr "değer ile"
+
+#: pg_controldata.c:337
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8 argument passing: %s\n"
+
+#: pg_controldata.c:339
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr ""
+"Veri sayfası sağlama (checksum) sürümü: %u\n"
+
+#: pg_controldata.c:341
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Sahte (mock) kimlik doğrulaması nonce'u: %s\n"
+
+#~ msgid ""
+#~ "Usage:\n"
+#~ " %s [OPTION] [DATADIR]\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --help show this help, then exit\n"
+#~ " --version output version information, then exit\n"
+#~ msgstr ""
+#~ "Kullanımı:\n"
+#~ " %s [SEÇENEK] [VERİ_DİZİNİ]\n"
+#~ "\n"
+#~ "SEÇENEKLER:\n"
+#~ " --help bu yardımı gösterir ve sonra çıkar\n"
+#~ " --version sürüm bilgisini gösterir ve çıkar\n"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "kayan noktalı sayılar"
+
+#~ msgid "Maximum length of locale name: %u\n"
+#~ msgstr "Yerel adının en fazla büyüklüğü: %u\n"
+
+#~ msgid "LC_COLLATE: %s\n"
+#~ msgstr "LC_COLLATE: %s\n"
+
+#~ msgid "LC_CTYPE: %s\n"
+#~ msgstr "LC_CTYPE: %s\n"
+
+#~ msgid "Prior checkpoint location: %X/%X\n"
+#~ msgstr "Önceki checkpoint yeri: %X/%X\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#~ msgid ""
+#~ " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#~ msgid " [-D] DATADIR data directory\n"
+#~ msgstr " [-D] DATADIR veri dizini\n"
diff --git a/src/bin/pg_controldata/po/uk.po b/src/bin/pg_controldata/po/uk.po
new file mode 100644
index 0000000..758c4c1
--- /dev/null
+++ b/src/bin/pg_controldata/po/uk.po
@@ -0,0 +1,480 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:51+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_controldata.pot\n"
+"X-Crowdin-File-ID: 924\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "не вдалося відкрити файл \"%s\" для читання: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не вдалося прочитати файл \"%s\": %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "не вдалося прочитати файл \"%s\": прочитано %d з %zu"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "неможливо закрити файл \"%s\": %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "неправильний порядок байтів"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid "possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr "можлива помилка у послідовності байтів.\n"
+"Порядок байтів, що використовують для зберігання файлу pg_control, може не відповідати тому, який використовується цією програмою. У такому випадку результати нижче будуть неправильним, і інсталяція PostgreSQL буде несумісною з цим каталогом даних."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не вдалося записати файл \"%s\": %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "не вдалося fsync файл \"%s\": %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid "%s displays control information of a PostgreSQL database cluster.\n\n"
+msgstr "%s відображає контрольну інформацію щодо кластеру PostgreSQL.\n\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Використання:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [OPTION] [DATADIR]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid "\n"
+"Options:\n"
+msgstr "\n"
+"Параметри:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR каталог з даними\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію і вийти\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку потім вийти\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid "\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n\n"
+msgstr "\n"
+"Якщо каталог даних не вказано (DATADIR), використовується змінна середовища PGDATA.\n\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Повідомляти про помилки на <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "запуск"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "завершення роботи"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "завершення роботи у відновленні"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "завершення роботи"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "відновлення при збої"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "відновлення в архіві"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "у виробництві"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "невизнаний код статусу"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "невизнаний wal_рівень"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" для додаткової інформації."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному рядку (перший \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог даних не вказано"
+
+#: pg_controldata.c:170
+#, c-format
+msgid "WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n\n"
+msgstr "ПОПЕРЕДЖЕННЯ: Контрольна сума CRC не відповідає збереженому значенню у файлі. Або файл пошкоджено, або він містить іншу структуру, ніж очікує ця програма. Результати нижче є недостовірними.\n\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "ПОПЕРЕДЖЕННЯ: неправильний розмір WAL сегменту \n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid "The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n\n"
+msgid_plural "The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n\n"
+msgstr[0] "Розмір WAL сегменту збережений у файлі, %d байт, не є степенем двійки між 1 MB та 1 GB. Файл пошкоджено та результати нижче є недостовірними.\n\n"
+msgstr[1] "Розмір WAL сегменту збережений у файлі, %d байтів, не є степенем двійки між 1 MB та 1 GB. Файл пошкоджено та результати нижче є недостовірними.\n\n"
+msgstr[2] "Розмір WAL сегменту збережений у файлі, %d байтів, не є степенем двійки між 1 MB та 1 GB. Файл пошкоджено та результати нижче є недостовірними.\n\n"
+msgstr[3] "Розмір WAL сегменту збережений у файлі, %d байта, не є степенем двійки між 1 MB та 1 GB. Файл пошкоджено та результати нижче є недостовірними.\n\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control номер версії: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Номер версії каталогу: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Системний ідентифікатор бази даних: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Стан кластеру бази даних: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control був модифікований востаннє: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Останнє місце знаходження контрольної точки: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Розташування останньої контрольної точки: %X%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "Останній файл контрольної точки REDO WAL: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "Останній TimeLineID контрольної точки: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "Останній PrevTimeLineID контрольної точки: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Останній full_page_writes контрольної точки: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "вимк"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "увімк"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "Останній NextXID контрольної точки: %u%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "Останній NextOID контрольної точки: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "Останній NextMultiXactId контрольної точки: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "Останній NextMultiOffset контрольної точки: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "Останній oldestXID контрольної точки: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "Остання DB останнього oldestXID контрольної точки: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "Останній oldestActiveXID контрольної точки: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "Останній oldestMultiXid контрольної точки: %u \n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "Остання DB останньої oldestMulti контрольної точки: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "Останній oldestCommitTsXid контрольної точки:%u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "Останній newestCommitTsXid контрольної точки: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Час останньої контрольної точки: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Фіктивний LSN для таблиць без журналювання: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Мінімальне розташування кінця відновлення: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Мінімальна позиція історії часу завершення відновлення: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Початкове розташування резервного копіювання: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Кінцеве розташування резервного копіювання: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Вимагається запис кінця резервного копіювання: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "ні"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "так"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "налаштування wal_рівня: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "налаштування wal_log_hints: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "налаштування max_connections: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "налаштування max_worker_processes: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "налаштування max_wal_senders: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "налаштування max_prepared_xacts: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "налаштування max_locks_per_xact: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "налаштування track_commit_timestamp: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Максимальне вирівнювання даних: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Розмір блоку бази даних: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Блоків на сегмент великого відношення: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Pозмір блоку WAL: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Байтів на сегмент WAL: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Максимальна довжина ідентифікаторів: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Максимальна кількість стовпців в індексі: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Максимальний розмір сегменту TOAST: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Розмір сегменту великих обїєктів: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Дата/час типу сховища: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64-бітні цілі"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Передача аргументу Float8: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "за посиланням"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "за значенням"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Версія контрольних сум сторінок даних: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Імітувати нонс для аутентифікації: %s\n"
+
diff --git a/src/bin/pg_controldata/po/zh_CN.po b/src/bin/pg_controldata/po/zh_CN.po
new file mode 100644
index 0000000..d6d2140
--- /dev/null
+++ b/src/bin/pg_controldata/po/zh_CN.po
@@ -0,0 +1,505 @@
+# simplified Chinese translation file for pg_controldata and friends
+# Bao Wei <weibao@forevertek.com>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:49+0000\n"
+"PO-Revision-Date: 2021-08-15 18:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.5.7\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "为了读取, 无法打开文件 \"%s\": %m"
+
+#: ../../common/controldata_utils.c:89
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "无法读取文件 \"%s\": %m"
+
+#: ../../common/controldata_utils.c:101
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "无法读取文件\"%1$s\":读取了%3$zu中的%2$d"
+
+#: ../../common/controldata_utils.c:117 ../../common/controldata_utils.c:259
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "无法关闭文件 \"%s\": %m"
+
+#: ../../common/controldata_utils.c:135
+msgid "byte ordering mismatch"
+msgstr "字节排序不匹配"
+
+#: ../../common/controldata_utils.c:137
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"可能字节顺序不匹配\n"
+"用于存储文件pg_control的字节顺序可能与程序使用的不匹配\n"
+"在那种情况下结果将会是不正确的,并且所安装的PostgreSQL\n"
+"将会与这个数据目录不兼容"
+
+#: ../../common/controldata_utils.c:203
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "无法打开文件 \"%s\": %m"
+
+#: ../../common/controldata_utils.c:224
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "无法写入文件 \"%s\": %m"
+
+#: ../../common/controldata_utils.c:245
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "无法 fsync 文件 \"%s\": %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s 显示 PostgreSQL 数据库簇控制信息.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [选项][数据目录]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"选项:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR 数据目录\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信息, 然后退出\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然后退出\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"如果没有指定数据目录(DATADIR), 将使用\n"
+"环境变量PGDATA.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "臭虫报告至<%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "正在启动"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "关闭"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "在恢复过程中关闭数据库"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "正在关闭"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "在恢复中"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "正在归档恢复"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "在运行中"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "不被认可的状态码"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "参数wal_level的值无法识别"
+
+#: pg_controldata.c:137 pg_controldata.c:155 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获取更多的信息.\n"
+
+#: pg_controldata.c:153
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行参数太多 (第一个是 \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "没有指定数据目录"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"警告: 计算出来的CRC校验值与已保存在文件中的值不匹配.\n"
+"不是文件坏了,就是设计与程序的期望值不同.\n"
+"下面的结果是不可靠的.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "警告: 无效的WAL段大小\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"WAL段的大小保存在文件中,%d字节不是2的幂次方(在1MB至1BG之间)\n"
+"文件已损坏,下面的结果不可信.\n"
+msgstr[1] ""
+"WAL段的大小保存在文件中,%d字节不是2的幂次方(在1MB至1BG之间)\n"
+"文件已损坏,下面的结果不可信.\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control 版本: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Catalog 版本: %u\n"
+
+#: pg_controldata.c:232
+msgid "Database system identifier: %llu\n"
+msgstr "数据库系统标识符: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "数据库簇状态: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control 最后修改: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "最新检查点位置: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "最新检查点的 REDO 位置: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "最新检查点的重做日志文件: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "最新检查点的 TimeLineID: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "最新检查点的PrevTimeLineID: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "最新检查点的full_page_writes: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "关闭"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "开启"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "最新检查点的NextXID: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "最新检查点的 NextOID: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "最新检查点的NextMultiXactId: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "最新检查点的NextMultiOffsetD: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "最新检查点的oldestXID: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "最新检查点的oldestXID所在的数据库:%u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "最新检查点的oldestActiveXID: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "最新检查点的oldestMultiXid: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "最新检查点的oldestMulti所在的数据库:%u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "最新检查点的oldestCommitTsXid:%u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "最新检查点的newestCommitTsXid:%u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "最新检查点的时间: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "不带日志的关系: %X/%X使用虚假的LSN计数器\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "最小恢复结束位置: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "最小恢复结束位置时间表: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "开始进行备份的点位置: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "备份的最终位置: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "需要终止备份的记录: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "否"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "是"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "wal_level设置: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "wal_log_hints设置: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "max_connections设置: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "max_worker_processes设置: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "max_wal_senders设置: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "max_prepared_xacts设置: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "max_locks_per_xact设置: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "track_commit_timestamp设置: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "最大数据校准: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "数据库块大小: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "大关系的每段块数: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL的块大小: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "每一个 WAL 段字节数: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "标识符的最大长度: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "在索引中可允许使用最大的列数: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST区块的最大长度: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "大对象区块的大小: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "日期/时间 类型存储: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64位整数"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "正在传递Flloat8类型的参数: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "由引用"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "由值"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "数据页校验和版本: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "当前身份验证: %s\n"
+
diff --git a/src/bin/pg_controldata/t/001_pg_controldata.pl b/src/bin/pg_controldata/t/001_pg_controldata.pl
new file mode 100644
index 0000000..adb9af4
--- /dev/null
+++ b/src/bin/pg_controldata/t/001_pg_controldata.pl
@@ -0,0 +1,46 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_controldata');
+program_version_ok('pg_controldata');
+program_options_handling_ok('pg_controldata');
+command_fails(['pg_controldata'], 'pg_controldata without arguments fails');
+command_fails([ 'pg_controldata', 'nonexistent' ],
+ 'pg_controldata with nonexistent directory fails');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+
+command_like([ 'pg_controldata', $node->data_dir ],
+ qr/checkpoint/, 'pg_controldata produces output');
+
+
+# check with a corrupted pg_control
+
+my $pg_control = $node->data_dir . '/global/pg_control';
+my $size = (stat($pg_control))[7];
+
+open my $fh, '>', $pg_control or BAIL_OUT($!);
+binmode $fh;
+
+# fill file with zeros
+print $fh pack("x[$size]");
+close $fh;
+
+command_checks_all(
+ [ 'pg_controldata', $node->data_dir ],
+ 0,
+ [
+ qr/WARNING: Calculated CRC checksum does not match value stored in file/,
+ qr/WARNING: invalid WAL segment size/
+ ],
+ [qr/^$/],
+ 'pg_controldata with corrupted pg_control');
+
+done_testing();
diff --git a/src/bin/pg_ctl/.gitignore b/src/bin/pg_ctl/.gitignore
new file mode 100644
index 0000000..73ab4ed
--- /dev/null
+++ b/src/bin/pg_ctl/.gitignore
@@ -0,0 +1,2 @@
+/pg_ctl
+/tmp_check/
diff --git a/src/bin/pg_ctl/Makefile b/src/bin/pg_ctl/Makefile
new file mode 100644
index 0000000..7d5be76
--- /dev/null
+++ b/src/bin/pg_ctl/Makefile
@@ -0,0 +1,53 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_ctl
+#
+# Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/bin/pg_ctl/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_ctl - starts/stops/restarts the PostgreSQL server"
+PGAPPICON=win32
+
+subdir = src/bin/pg_ctl
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+# On Windows, we need to link with libpq, just for use of pqexpbuffer;
+# but let's not pull that in on platforms where we don't need it.
+ifeq ($(PORTNAME), win32)
+override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += $(libpq_pgport)
+SUBMAKE_LIBPQ := submake-libpq
+endif
+
+OBJS = \
+ $(WIN32RES) \
+ pg_ctl.o
+
+all: pg_ctl
+
+pg_ctl: $(OBJS) | submake-libpgport $(SUBMAKE_LIBPQ)
+ $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_ctl$(X) '$(DESTDIR)$(bindir)/pg_ctl$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_ctl$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_ctl$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_ctl/nls.mk b/src/bin/pg_ctl/nls.mk
new file mode 100644
index 0000000..adde90b
--- /dev/null
+++ b/src/bin/pg_ctl/nls.mk
@@ -0,0 +1,4 @@
+# src/bin/pg_ctl/nls.mk
+CATALOG_NAME = pg_ctl
+AVAIL_LANGUAGES = cs de el es fr it ja ka ko pt_BR ru sv tr uk zh_CN
+GETTEXT_FILES = pg_ctl.c ../../common/exec.c ../../common/fe_memutils.c ../../common/wait_error.c ../../port/path.c
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
new file mode 100644
index 0000000..dd78e5b
--- /dev/null
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -0,0 +1,2615 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_ctl --- start/stops/restarts the PostgreSQL server
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/pg_ctl/pg_ctl.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <fcntl.h>
+#include <signal.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#ifdef HAVE_SYS_RESOURCE_H
+#include <sys/time.h>
+#include <sys/resource.h>
+#endif
+
+#include "catalog/pg_control.h"
+#include "common/controldata_utils.h"
+#include "common/file_perm.h"
+#include "common/logging.h"
+#include "common/string.h"
+#include "getopt_long.h"
+#include "utils/pidfile.h"
+
+#ifdef WIN32 /* on Unix, we don't need libpq */
+#include "pqexpbuffer.h"
+#endif
+
+/* PID can be negative for standalone backend */
+typedef long pgpid_t;
+
+
+typedef enum
+{
+ SMART_MODE,
+ FAST_MODE,
+ IMMEDIATE_MODE
+} ShutdownMode;
+
+typedef enum
+{
+ POSTMASTER_READY,
+ POSTMASTER_STILL_STARTING,
+ POSTMASTER_FAILED
+} WaitPMResult;
+
+typedef enum
+{
+ NO_COMMAND = 0,
+ INIT_COMMAND,
+ START_COMMAND,
+ STOP_COMMAND,
+ RESTART_COMMAND,
+ RELOAD_COMMAND,
+ STATUS_COMMAND,
+ PROMOTE_COMMAND,
+ LOGROTATE_COMMAND,
+ KILL_COMMAND,
+ REGISTER_COMMAND,
+ UNREGISTER_COMMAND,
+ RUN_AS_SERVICE_COMMAND
+} CtlCommand;
+
+#define DEFAULT_WAIT 60
+
+#define USEC_PER_SEC 1000000
+
+#define WAITS_PER_SEC 10 /* should divide USEC_PER_SEC evenly */
+
+static bool do_wait = true;
+static int wait_seconds = DEFAULT_WAIT;
+static bool wait_seconds_arg = false;
+static bool silent_mode = false;
+static ShutdownMode shutdown_mode = FAST_MODE;
+static int sig = SIGINT; /* default */
+static CtlCommand ctl_command = NO_COMMAND;
+static char *pg_data = NULL;
+static char *pg_config = NULL;
+static char *pgdata_opt = NULL;
+static char *post_opts = NULL;
+static const char *progname;
+static char *log_file = NULL;
+static char *exec_path = NULL;
+static char *event_source = NULL;
+static char *register_servicename = "PostgreSQL"; /* FIXME: + version ID? */
+static char *register_username = NULL;
+static char *register_password = NULL;
+static char *argv0 = NULL;
+static bool allow_core_files = false;
+static time_t start_time;
+
+static char postopts_file[MAXPGPATH];
+static char version_file[MAXPGPATH];
+static char pid_file[MAXPGPATH];
+static char backup_file[MAXPGPATH];
+static char promote_file[MAXPGPATH];
+static char logrotate_file[MAXPGPATH];
+
+static volatile pgpid_t postmasterPID = -1;
+
+#ifdef WIN32
+static DWORD pgctl_start_type = SERVICE_AUTO_START;
+static SERVICE_STATUS status;
+static SERVICE_STATUS_HANDLE hStatus = (SERVICE_STATUS_HANDLE) 0;
+static HANDLE shutdownHandles[2];
+
+#define shutdownEvent shutdownHandles[0]
+#define postmasterProcess shutdownHandles[1]
+#endif
+
+
+static void write_stderr(const char *fmt,...) pg_attribute_printf(1, 2);
+static void do_advice(void);
+static void do_help(void);
+static void set_mode(char *modeopt);
+static void set_sig(char *signame);
+static void do_init(void);
+static void do_start(void);
+static void do_stop(void);
+static void do_restart(void);
+static void do_reload(void);
+static void do_status(void);
+static void do_promote(void);
+static void do_logrotate(void);
+static void do_kill(pgpid_t pid);
+static void print_msg(const char *msg);
+static void adjust_data_dir(void);
+
+#ifdef WIN32
+#include <versionhelpers.h>
+static bool pgwin32_IsInstalled(SC_HANDLE);
+static char *pgwin32_CommandLine(bool);
+static void pgwin32_doRegister(void);
+static void pgwin32_doUnregister(void);
+static void pgwin32_SetServiceStatus(DWORD);
+static void WINAPI pgwin32_ServiceHandler(DWORD);
+static void WINAPI pgwin32_ServiceMain(DWORD, LPTSTR *);
+static void pgwin32_doRunAsService(void);
+static int CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_service);
+static PTOKEN_PRIVILEGES GetPrivilegesToDelete(HANDLE hToken);
+#endif
+
+static pgpid_t get_pgpid(bool is_status_request);
+static char **readfile(const char *path, int *numlines);
+static void free_readfile(char **optlines);
+static pgpid_t start_postmaster(void);
+static void read_post_opts(void);
+
+static WaitPMResult wait_for_postmaster_start(pgpid_t pm_pid, bool do_checkpoint);
+static bool wait_for_postmaster_stop(void);
+static bool wait_for_postmaster_promote(void);
+static bool postmaster_is_alive(pid_t pid);
+
+#if defined(HAVE_GETRLIMIT) && defined(RLIMIT_CORE)
+static void unlimit_core_size(void);
+#endif
+
+static DBState get_control_dbstate(void);
+
+
+#ifdef WIN32
+static void
+write_eventlog(int level, const char *line)
+{
+ static HANDLE evtHandle = INVALID_HANDLE_VALUE;
+
+ if (silent_mode && level == EVENTLOG_INFORMATION_TYPE)
+ return;
+
+ if (evtHandle == INVALID_HANDLE_VALUE)
+ {
+ evtHandle = RegisterEventSource(NULL,
+ event_source ? event_source : DEFAULT_EVENT_SOURCE);
+ if (evtHandle == NULL)
+ {
+ evtHandle = INVALID_HANDLE_VALUE;
+ return;
+ }
+ }
+
+ ReportEvent(evtHandle,
+ level,
+ 0,
+ 0, /* All events are Id 0 */
+ NULL,
+ 1,
+ 0,
+ &line,
+ NULL);
+}
+#endif
+
+/*
+ * Write errors to stderr (or by equal means when stderr is
+ * not available).
+ */
+static void
+write_stderr(const char *fmt,...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+#ifndef WIN32
+ /* On Unix, we just fprintf to stderr */
+ vfprintf(stderr, fmt, ap);
+#else
+
+ /*
+ * On Win32, we print to stderr if running on a console, or write to
+ * eventlog if running as a service
+ */
+ if (pgwin32_is_service()) /* Running as a service */
+ {
+ char errbuf[2048]; /* Arbitrary size? */
+
+ vsnprintf(errbuf, sizeof(errbuf), fmt, ap);
+
+ write_eventlog(EVENTLOG_ERROR_TYPE, errbuf);
+ }
+ else
+ /* Not running as service, write to stderr */
+ vfprintf(stderr, fmt, ap);
+#endif
+ va_end(ap);
+}
+
+/*
+ * Given an already-localized string, print it to stdout unless the
+ * user has specified that no messages should be printed.
+ */
+static void
+print_msg(const char *msg)
+{
+ if (!silent_mode)
+ {
+ fputs(msg, stdout);
+ fflush(stdout);
+ }
+}
+
+static pgpid_t
+get_pgpid(bool is_status_request)
+{
+ FILE *pidf;
+ long pid;
+ struct stat statbuf;
+
+ if (stat(pg_data, &statbuf) != 0)
+ {
+ if (errno == ENOENT)
+ write_stderr(_("%s: directory \"%s\" does not exist\n"), progname,
+ pg_data);
+ else
+ write_stderr(_("%s: could not access directory \"%s\": %s\n"), progname,
+ pg_data, strerror(errno));
+
+ /*
+ * The Linux Standard Base Core Specification 3.1 says this should
+ * return '4, program or service status is unknown'
+ * https://refspecs.linuxbase.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
+ */
+ exit(is_status_request ? 4 : 1);
+ }
+
+ if (stat(version_file, &statbuf) != 0 && errno == ENOENT)
+ {
+ write_stderr(_("%s: directory \"%s\" is not a database cluster directory\n"),
+ progname, pg_data);
+ exit(is_status_request ? 4 : 1);
+ }
+
+ pidf = fopen(pid_file, "r");
+ if (pidf == NULL)
+ {
+ /* No pid file, not an error on startup */
+ if (errno == ENOENT)
+ return 0;
+ else
+ {
+ write_stderr(_("%s: could not open PID file \"%s\": %s\n"),
+ progname, pid_file, strerror(errno));
+ exit(1);
+ }
+ }
+ if (fscanf(pidf, "%ld", &pid) != 1)
+ {
+ /* Is the file empty? */
+ if (ftell(pidf) == 0 && feof(pidf))
+ write_stderr(_("%s: the PID file \"%s\" is empty\n"),
+ progname, pid_file);
+ else
+ write_stderr(_("%s: invalid data in PID file \"%s\"\n"),
+ progname, pid_file);
+ exit(1);
+ }
+ fclose(pidf);
+ return (pgpid_t) pid;
+}
+
+
+/*
+ * get the lines from a text file - return NULL if file can't be opened
+ *
+ * Trailing newlines are deleted from the lines (this is a change from pre-v10)
+ *
+ * *numlines is set to the number of line pointers returned; there is
+ * also an additional NULL pointer after the last real line.
+ */
+static char **
+readfile(const char *path, int *numlines)
+{
+ int fd;
+ int nlines;
+ char **result;
+ char *buffer;
+ char *linebegin;
+ int i;
+ int n;
+ int len;
+ struct stat statbuf;
+
+ *numlines = 0; /* in case of failure or empty file */
+
+ /*
+ * Slurp the file into memory.
+ *
+ * The file can change concurrently, so we read the whole file into memory
+ * with a single read() call. That's not guaranteed to get an atomic
+ * snapshot, but in practice, for a small file, it's close enough for the
+ * current use.
+ */
+ fd = open(path, O_RDONLY | PG_BINARY, 0);
+ if (fd < 0)
+ return NULL;
+ if (fstat(fd, &statbuf) < 0)
+ {
+ close(fd);
+ return NULL;
+ }
+ if (statbuf.st_size == 0)
+ {
+ /* empty file */
+ close(fd);
+ result = (char **) pg_malloc(sizeof(char *));
+ *result = NULL;
+ return result;
+ }
+ buffer = pg_malloc(statbuf.st_size + 1);
+
+ len = read(fd, buffer, statbuf.st_size + 1);
+ close(fd);
+ if (len != statbuf.st_size)
+ {
+ /* oops, the file size changed between fstat and read */
+ free(buffer);
+ return NULL;
+ }
+
+ /*
+ * Count newlines. We expect there to be a newline after each full line,
+ * including one at the end of file. If there isn't a newline at the end,
+ * any characters after the last newline will be ignored.
+ */
+ nlines = 0;
+ for (i = 0; i < len; i++)
+ {
+ if (buffer[i] == '\n')
+ nlines++;
+ }
+
+ /* set up the result buffer */
+ result = (char **) pg_malloc((nlines + 1) * sizeof(char *));
+ *numlines = nlines;
+
+ /* now split the buffer into lines */
+ linebegin = buffer;
+ n = 0;
+ for (i = 0; i < len; i++)
+ {
+ if (buffer[i] == '\n')
+ {
+ int slen = &buffer[i] - linebegin;
+ char *linebuf = pg_malloc(slen + 1);
+
+ memcpy(linebuf, linebegin, slen);
+ /* we already dropped the \n, but get rid of any \r too */
+ if (slen > 0 && linebuf[slen - 1] == '\r')
+ slen--;
+ linebuf[slen] = '\0';
+ result[n++] = linebuf;
+ linebegin = &buffer[i + 1];
+ }
+ }
+ result[n] = NULL;
+
+ free(buffer);
+
+ return result;
+}
+
+
+/*
+ * Free memory allocated for optlines through readfile()
+ */
+static void
+free_readfile(char **optlines)
+{
+ char *curr_line = NULL;
+ int i = 0;
+
+ if (!optlines)
+ return;
+
+ while ((curr_line = optlines[i++]))
+ free(curr_line);
+
+ free(optlines);
+}
+
+/*
+ * start/test/stop routines
+ */
+
+/*
+ * Start the postmaster and return its PID.
+ *
+ * Currently, on Windows what we return is the PID of the shell process
+ * that launched the postmaster (and, we trust, is waiting for it to exit).
+ * So the PID is usable for "is the postmaster still running" checks,
+ * but cannot be compared directly to postmaster.pid.
+ *
+ * On Windows, we also save aside a handle to the shell process in
+ * "postmasterProcess", which the caller should close when done with it.
+ */
+static pgpid_t
+start_postmaster(void)
+{
+ char *cmd;
+
+#ifndef WIN32
+ pgpid_t pm_pid;
+
+ /* Flush stdio channels just before fork, to avoid double-output problems */
+ fflush(stdout);
+ fflush(stderr);
+
+#ifdef EXEC_BACKEND
+ pg_disable_aslr();
+#endif
+
+ pm_pid = fork();
+ if (pm_pid < 0)
+ {
+ /* fork failed */
+ write_stderr(_("%s: could not start server: %s\n"),
+ progname, strerror(errno));
+ exit(1);
+ }
+ if (pm_pid > 0)
+ {
+ /* fork succeeded, in parent */
+ return pm_pid;
+ }
+
+ /* fork succeeded, in child */
+
+ /*
+ * If possible, detach the postmaster process from the launching process
+ * group and make it a group leader, so that it doesn't get signaled along
+ * with the current group that launched it.
+ */
+#ifdef HAVE_SETSID
+ if (setsid() < 0)
+ {
+ write_stderr(_("%s: could not start server due to setsid() failure: %s\n"),
+ progname, strerror(errno));
+ exit(1);
+ }
+#endif
+
+ /*
+ * Since there might be quotes to handle here, it is easier simply to pass
+ * everything to a shell to process them. Use exec so that the postmaster
+ * has the same PID as the current child process.
+ */
+ if (log_file != NULL)
+ cmd = psprintf("exec \"%s\" %s%s < \"%s\" >> \"%s\" 2>&1",
+ exec_path, pgdata_opt, post_opts,
+ DEVNULL, log_file);
+ else
+ cmd = psprintf("exec \"%s\" %s%s < \"%s\" 2>&1",
+ exec_path, pgdata_opt, post_opts, DEVNULL);
+
+ (void) execl("/bin/sh", "/bin/sh", "-c", cmd, (char *) NULL);
+
+ /* exec failed */
+ write_stderr(_("%s: could not start server: %s\n"),
+ progname, strerror(errno));
+ exit(1);
+
+ return 0; /* keep dumb compilers quiet */
+
+#else /* WIN32 */
+
+ /*
+ * As with the Unix case, it's easiest to use the shell (CMD.EXE) to
+ * handle redirection etc. Unfortunately CMD.EXE lacks any equivalent of
+ * "exec", so we don't get to find out the postmaster's PID immediately.
+ */
+ PROCESS_INFORMATION pi;
+ const char *comspec;
+
+ /* Find CMD.EXE location using COMSPEC, if it's set */
+ comspec = getenv("COMSPEC");
+ if (comspec == NULL)
+ comspec = "CMD";
+
+ if (log_file != NULL)
+ {
+ /*
+ * First, open the log file if it exists. The idea is that if the
+ * file is still locked by a previous postmaster run, we'll wait until
+ * it comes free, instead of failing with ERROR_SHARING_VIOLATION.
+ * (It'd be better to open the file in a sharing-friendly mode, but we
+ * can't use CMD.EXE to do that, so work around it. Note that the
+ * previous postmaster will still have the file open for a short time
+ * after removing postmaster.pid.)
+ *
+ * If the log file doesn't exist, we *must not* create it here. If we
+ * were launched with higher privileges than the restricted process
+ * will have, the log file might end up with permissions settings that
+ * prevent the postmaster from writing on it.
+ */
+ int fd = open(log_file, O_RDWR, 0);
+
+ if (fd == -1)
+ {
+ /*
+ * ENOENT is expectable since we didn't use O_CREAT. Otherwise
+ * complain. We could just fall through and let CMD.EXE report
+ * the problem, but its error reporting is pretty miserable.
+ */
+ if (errno != ENOENT)
+ {
+ write_stderr(_("%s: could not open log file \"%s\": %s\n"),
+ progname, log_file, strerror(errno));
+ exit(1);
+ }
+ }
+ else
+ close(fd);
+
+ cmd = psprintf("\"%s\" /C \"\"%s\" %s%s < \"%s\" >> \"%s\" 2>&1\"",
+ comspec, exec_path, pgdata_opt, post_opts, DEVNULL, log_file);
+ }
+ else
+ cmd = psprintf("\"%s\" /C \"\"%s\" %s%s < \"%s\" 2>&1\"",
+ comspec, exec_path, pgdata_opt, post_opts, DEVNULL);
+
+ if (!CreateRestrictedProcess(cmd, &pi, false))
+ {
+ write_stderr(_("%s: could not start server: error code %lu\n"),
+ progname, (unsigned long) GetLastError());
+ exit(1);
+ }
+ /* Don't close command process handle here; caller must do so */
+ postmasterProcess = pi.hProcess;
+ CloseHandle(pi.hThread);
+ return pi.dwProcessId; /* Shell's PID, not postmaster's! */
+#endif /* WIN32 */
+}
+
+
+
+/*
+ * Wait for the postmaster to become ready.
+ *
+ * On Unix, pm_pid is the PID of the just-launched postmaster. On Windows,
+ * it may be the PID of an ancestor shell process, so we can't check the
+ * contents of postmaster.pid quite as carefully.
+ *
+ * On Windows, the static variable postmasterProcess is an implicit argument
+ * to this routine; it contains a handle to the postmaster process or an
+ * ancestor shell process thereof.
+ *
+ * Note that the checkpoint parameter enables a Windows service control
+ * manager checkpoint, it's got nothing to do with database checkpoints!!
+ */
+static WaitPMResult
+wait_for_postmaster_start(pgpid_t pm_pid, bool do_checkpoint)
+{
+ int i;
+
+ for (i = 0; i < wait_seconds * WAITS_PER_SEC; i++)
+ {
+ char **optlines;
+ int numlines;
+
+ /*
+ * Try to read the postmaster.pid file. If it's not valid, or if the
+ * status line isn't there yet, just keep waiting.
+ */
+ if ((optlines = readfile(pid_file, &numlines)) != NULL &&
+ numlines >= LOCK_FILE_LINE_PM_STATUS)
+ {
+ /* File is complete enough for us, parse it */
+ pgpid_t pmpid;
+ time_t pmstart;
+
+ /*
+ * Make sanity checks. If it's for the wrong PID, or the recorded
+ * start time is before pg_ctl started, then either we are looking
+ * at the wrong data directory, or this is a pre-existing pidfile
+ * that hasn't (yet?) been overwritten by our child postmaster.
+ * Allow 2 seconds slop for possible cross-process clock skew.
+ */
+ pmpid = atol(optlines[LOCK_FILE_LINE_PID - 1]);
+ pmstart = atol(optlines[LOCK_FILE_LINE_START_TIME - 1]);
+ if (pmstart >= start_time - 2 &&
+#ifndef WIN32
+ pmpid == pm_pid
+#else
+ /* Windows can only reject standalone-backend PIDs */
+ pmpid > 0
+#endif
+ )
+ {
+ /*
+ * OK, seems to be a valid pidfile from our child. Check the
+ * status line (this assumes a v10 or later server).
+ */
+ char *pmstatus = optlines[LOCK_FILE_LINE_PM_STATUS - 1];
+
+ if (strcmp(pmstatus, PM_STATUS_READY) == 0 ||
+ strcmp(pmstatus, PM_STATUS_STANDBY) == 0)
+ {
+ /* postmaster is done starting up */
+ free_readfile(optlines);
+ return POSTMASTER_READY;
+ }
+ }
+ }
+
+ /*
+ * Free the results of readfile.
+ *
+ * This is safe to call even if optlines is NULL.
+ */
+ free_readfile(optlines);
+
+ /*
+ * Check whether the child postmaster process is still alive. This
+ * lets us exit early if the postmaster fails during startup.
+ *
+ * On Windows, we may be checking the postmaster's parent shell, but
+ * that's fine for this purpose.
+ */
+#ifndef WIN32
+ {
+ int exitstatus;
+
+ if (waitpid((pid_t) pm_pid, &exitstatus, WNOHANG) == (pid_t) pm_pid)
+ return POSTMASTER_FAILED;
+ }
+#else
+ if (WaitForSingleObject(postmasterProcess, 0) == WAIT_OBJECT_0)
+ return POSTMASTER_FAILED;
+#endif
+
+ /* Startup still in process; wait, printing a dot once per second */
+ if (i % WAITS_PER_SEC == 0)
+ {
+#ifdef WIN32
+ if (do_checkpoint)
+ {
+ /*
+ * Increment the wait hint by 6 secs (connection timeout +
+ * sleep). We must do this to indicate to the SCM that our
+ * startup time is changing, otherwise it'll usually send a
+ * stop signal after 20 seconds, despite incrementing the
+ * checkpoint counter.
+ */
+ status.dwWaitHint += 6000;
+ status.dwCheckPoint++;
+ SetServiceStatus(hStatus, (LPSERVICE_STATUS) &status);
+ }
+ else
+#endif
+ print_msg(".");
+ }
+
+ pg_usleep(USEC_PER_SEC / WAITS_PER_SEC);
+ }
+
+ /* out of patience; report that postmaster is still starting up */
+ return POSTMASTER_STILL_STARTING;
+}
+
+
+/*
+ * Wait for the postmaster to stop.
+ *
+ * Returns true if the postmaster stopped cleanly (i.e., removed its pidfile).
+ * Returns false if the postmaster dies uncleanly, or if we time out.
+ */
+static bool
+wait_for_postmaster_stop(void)
+{
+ int cnt;
+
+ for (cnt = 0; cnt < wait_seconds * WAITS_PER_SEC; cnt++)
+ {
+ pgpid_t pid;
+
+ if ((pid = get_pgpid(false)) == 0)
+ return true; /* pid file is gone */
+
+ if (kill((pid_t) pid, 0) != 0)
+ {
+ /*
+ * Postmaster seems to have died. Check the pid file once more to
+ * avoid a race condition, but give up waiting.
+ */
+ if (get_pgpid(false) == 0)
+ return true; /* pid file is gone */
+ return false; /* postmaster died untimely */
+ }
+
+ if (cnt % WAITS_PER_SEC == 0)
+ print_msg(".");
+ pg_usleep(USEC_PER_SEC / WAITS_PER_SEC);
+ }
+ return false; /* timeout reached */
+}
+
+
+/*
+ * Wait for the postmaster to promote.
+ *
+ * Returns true on success, else false.
+ * To avoid waiting uselessly, we check for postmaster death here too.
+ */
+static bool
+wait_for_postmaster_promote(void)
+{
+ int cnt;
+
+ for (cnt = 0; cnt < wait_seconds * WAITS_PER_SEC; cnt++)
+ {
+ pgpid_t pid;
+ DBState state;
+
+ if ((pid = get_pgpid(false)) == 0)
+ return false; /* pid file is gone */
+ if (kill((pid_t) pid, 0) != 0)
+ return false; /* postmaster died */
+
+ state = get_control_dbstate();
+ if (state == DB_IN_PRODUCTION)
+ return true; /* successful promotion */
+
+ if (cnt % WAITS_PER_SEC == 0)
+ print_msg(".");
+ pg_usleep(USEC_PER_SEC / WAITS_PER_SEC);
+ }
+ return false; /* timeout reached */
+}
+
+
+#if defined(HAVE_GETRLIMIT) && defined(RLIMIT_CORE)
+static void
+unlimit_core_size(void)
+{
+ struct rlimit lim;
+
+ getrlimit(RLIMIT_CORE, &lim);
+ if (lim.rlim_max == 0)
+ {
+ write_stderr(_("%s: cannot set core file size limit; disallowed by hard limit\n"),
+ progname);
+ return;
+ }
+ else if (lim.rlim_max == RLIM_INFINITY || lim.rlim_cur < lim.rlim_max)
+ {
+ lim.rlim_cur = lim.rlim_max;
+ setrlimit(RLIMIT_CORE, &lim);
+ }
+}
+#endif
+
+static void
+read_post_opts(void)
+{
+ if (post_opts == NULL)
+ {
+ post_opts = ""; /* default */
+ if (ctl_command == RESTART_COMMAND)
+ {
+ char **optlines;
+ int numlines;
+
+ optlines = readfile(postopts_file, &numlines);
+ if (optlines == NULL)
+ {
+ write_stderr(_("%s: could not read file \"%s\"\n"), progname, postopts_file);
+ exit(1);
+ }
+ else if (numlines != 1)
+ {
+ write_stderr(_("%s: option file \"%s\" must have exactly one line\n"),
+ progname, postopts_file);
+ exit(1);
+ }
+ else
+ {
+ char *optline;
+ char *arg1;
+
+ optline = optlines[0];
+
+ /*
+ * Are we at the first option, as defined by space and
+ * double-quote?
+ */
+ if ((arg1 = strstr(optline, " \"")) != NULL)
+ {
+ *arg1 = '\0'; /* terminate so we get only program name */
+ post_opts = pg_strdup(arg1 + 1); /* point past whitespace */
+ }
+ if (exec_path == NULL)
+ exec_path = pg_strdup(optline);
+ }
+
+ /* Free the results of readfile. */
+ free_readfile(optlines);
+ }
+ }
+}
+
+/*
+ * SIGINT signal handler used while waiting for postmaster to start up.
+ * Forwards the SIGINT to the postmaster process, asking it to shut down,
+ * before terminating pg_ctl itself. This way, if the user hits CTRL-C while
+ * waiting for the server to start up, the server launch is aborted.
+ */
+static void
+trap_sigint_during_startup(int sig)
+{
+ if (postmasterPID != -1)
+ {
+ if (kill(postmasterPID, SIGINT) != 0)
+ write_stderr(_("%s: could not send stop signal (PID: %ld): %s\n"),
+ progname, (pgpid_t) postmasterPID, strerror(errno));
+ }
+
+ /*
+ * Clear the signal handler, and send the signal again, to terminate the
+ * process as normal.
+ */
+ pqsignal(SIGINT, SIG_DFL);
+ raise(SIGINT);
+}
+
+static char *
+find_other_exec_or_die(const char *argv0, const char *target, const char *versionstr)
+{
+ int ret;
+ char *found_path;
+
+ found_path = pg_malloc(MAXPGPATH);
+
+ if ((ret = find_other_exec(argv0, target, versionstr, found_path)) < 0)
+ {
+ char full_path[MAXPGPATH];
+
+ if (find_my_exec(argv0, full_path) < 0)
+ strlcpy(full_path, progname, sizeof(full_path));
+
+ if (ret == -1)
+ write_stderr(_("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"),
+ target, progname, full_path);
+ else
+ write_stderr(_("program \"%s\" was found by \"%s\" but was not the same version as %s\n"),
+ target, full_path, progname);
+ exit(1);
+ }
+
+ return found_path;
+}
+
+static void
+do_init(void)
+{
+ char *cmd;
+
+ if (exec_path == NULL)
+ exec_path = find_other_exec_or_die(argv0, "initdb", "initdb (PostgreSQL) " PG_VERSION "\n");
+
+ if (pgdata_opt == NULL)
+ pgdata_opt = "";
+
+ if (post_opts == NULL)
+ post_opts = "";
+
+ if (!silent_mode)
+ cmd = psprintf("\"%s\" %s%s",
+ exec_path, pgdata_opt, post_opts);
+ else
+ cmd = psprintf("\"%s\" %s%s > \"%s\"",
+ exec_path, pgdata_opt, post_opts, DEVNULL);
+
+ if (system(cmd) != 0)
+ {
+ write_stderr(_("%s: database system initialization failed\n"), progname);
+ exit(1);
+ }
+}
+
+static void
+do_start(void)
+{
+ pgpid_t old_pid = 0;
+ pgpid_t pm_pid;
+
+ if (ctl_command != RESTART_COMMAND)
+ {
+ old_pid = get_pgpid(false);
+ if (old_pid != 0)
+ write_stderr(_("%s: another server might be running; "
+ "trying to start server anyway\n"),
+ progname);
+ }
+
+ read_post_opts();
+
+ /* No -D or -D already added during server start */
+ if (ctl_command == RESTART_COMMAND || pgdata_opt == NULL)
+ pgdata_opt = "";
+
+ if (exec_path == NULL)
+ exec_path = find_other_exec_or_die(argv0, "postgres", PG_BACKEND_VERSIONSTR);
+
+#if defined(HAVE_GETRLIMIT) && defined(RLIMIT_CORE)
+ if (allow_core_files)
+ unlimit_core_size();
+#endif
+
+ /*
+ * If possible, tell the postmaster our parent shell's PID (see the
+ * comments in CreateLockFile() for motivation). Windows hasn't got
+ * getppid() unfortunately.
+ */
+#ifndef WIN32
+ {
+ char env_var[32];
+
+ snprintf(env_var, sizeof(env_var), "%d", (int) getppid());
+ setenv("PG_GRANDPARENT_PID", env_var, 1);
+ }
+#endif
+
+ pm_pid = start_postmaster();
+
+ if (do_wait)
+ {
+ /*
+ * If the user interrupts the startup (e.g. with CTRL-C), we'd like to
+ * abort the server launch. Install a signal handler that will
+ * forward SIGINT to the postmaster process, while we wait.
+ *
+ * (We don't bother to reset the signal handler after the launch, as
+ * we're about to exit, anyway.)
+ */
+ postmasterPID = pm_pid;
+ pqsignal(SIGINT, trap_sigint_during_startup);
+
+ print_msg(_("waiting for server to start..."));
+
+ switch (wait_for_postmaster_start(pm_pid, false))
+ {
+ case POSTMASTER_READY:
+ print_msg(_(" done\n"));
+ print_msg(_("server started\n"));
+ break;
+ case POSTMASTER_STILL_STARTING:
+ print_msg(_(" stopped waiting\n"));
+ write_stderr(_("%s: server did not start in time\n"),
+ progname);
+ exit(1);
+ break;
+ case POSTMASTER_FAILED:
+ print_msg(_(" stopped waiting\n"));
+ write_stderr(_("%s: could not start server\n"
+ "Examine the log output.\n"),
+ progname);
+ exit(1);
+ break;
+ }
+ }
+ else
+ print_msg(_("server starting\n"));
+
+#ifdef WIN32
+ /* Now we don't need the handle to the shell process anymore */
+ CloseHandle(postmasterProcess);
+ postmasterProcess = INVALID_HANDLE_VALUE;
+#endif
+}
+
+
+static void
+do_stop(void)
+{
+ pgpid_t pid;
+
+ pid = get_pgpid(false);
+
+ if (pid == 0) /* no pid file */
+ {
+ write_stderr(_("%s: PID file \"%s\" does not exist\n"), progname, pid_file);
+ write_stderr(_("Is server running?\n"));
+ exit(1);
+ }
+ else if (pid < 0) /* standalone backend, not postmaster */
+ {
+ pid = -pid;
+ write_stderr(_("%s: cannot stop server; "
+ "single-user server is running (PID: %ld)\n"),
+ progname, pid);
+ exit(1);
+ }
+
+ if (kill((pid_t) pid, sig) != 0)
+ {
+ write_stderr(_("%s: could not send stop signal (PID: %ld): %s\n"), progname, pid,
+ strerror(errno));
+ exit(1);
+ }
+
+ if (!do_wait)
+ {
+ print_msg(_("server shutting down\n"));
+ return;
+ }
+ else
+ {
+ print_msg(_("waiting for server to shut down..."));
+
+ if (!wait_for_postmaster_stop())
+ {
+ print_msg(_(" failed\n"));
+
+ write_stderr(_("%s: server does not shut down\n"), progname);
+ if (shutdown_mode == SMART_MODE)
+ write_stderr(_("HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+ "waiting for session-initiated disconnection.\n"));
+ exit(1);
+ }
+ print_msg(_(" done\n"));
+
+ print_msg(_("server stopped\n"));
+ }
+}
+
+
+/*
+ * restart/reload routines
+ */
+
+static void
+do_restart(void)
+{
+ pgpid_t pid;
+
+ pid = get_pgpid(false);
+
+ if (pid == 0) /* no pid file */
+ {
+ write_stderr(_("%s: PID file \"%s\" does not exist\n"),
+ progname, pid_file);
+ write_stderr(_("Is server running?\n"));
+ write_stderr(_("trying to start server anyway\n"));
+ do_start();
+ return;
+ }
+ else if (pid < 0) /* standalone backend, not postmaster */
+ {
+ pid = -pid;
+ if (postmaster_is_alive((pid_t) pid))
+ {
+ write_stderr(_("%s: cannot restart server; "
+ "single-user server is running (PID: %ld)\n"),
+ progname, pid);
+ write_stderr(_("Please terminate the single-user server and try again.\n"));
+ exit(1);
+ }
+ }
+
+ if (postmaster_is_alive((pid_t) pid))
+ {
+ if (kill((pid_t) pid, sig) != 0)
+ {
+ write_stderr(_("%s: could not send stop signal (PID: %ld): %s\n"), progname, pid,
+ strerror(errno));
+ exit(1);
+ }
+
+ print_msg(_("waiting for server to shut down..."));
+
+ /* always wait for restart */
+ if (!wait_for_postmaster_stop())
+ {
+ print_msg(_(" failed\n"));
+
+ write_stderr(_("%s: server does not shut down\n"), progname);
+ if (shutdown_mode == SMART_MODE)
+ write_stderr(_("HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+ "waiting for session-initiated disconnection.\n"));
+ exit(1);
+ }
+
+ print_msg(_(" done\n"));
+ print_msg(_("server stopped\n"));
+ }
+ else
+ {
+ write_stderr(_("%s: old server process (PID: %ld) seems to be gone\n"),
+ progname, pid);
+ write_stderr(_("starting server anyway\n"));
+ }
+
+ do_start();
+}
+
+static void
+do_reload(void)
+{
+ pgpid_t pid;
+
+ pid = get_pgpid(false);
+ if (pid == 0) /* no pid file */
+ {
+ write_stderr(_("%s: PID file \"%s\" does not exist\n"), progname, pid_file);
+ write_stderr(_("Is server running?\n"));
+ exit(1);
+ }
+ else if (pid < 0) /* standalone backend, not postmaster */
+ {
+ pid = -pid;
+ write_stderr(_("%s: cannot reload server; "
+ "single-user server is running (PID: %ld)\n"),
+ progname, pid);
+ write_stderr(_("Please terminate the single-user server and try again.\n"));
+ exit(1);
+ }
+
+ if (kill((pid_t) pid, sig) != 0)
+ {
+ write_stderr(_("%s: could not send reload signal (PID: %ld): %s\n"),
+ progname, pid, strerror(errno));
+ exit(1);
+ }
+
+ print_msg(_("server signaled\n"));
+}
+
+
+/*
+ * promote
+ */
+
+static void
+do_promote(void)
+{
+ FILE *prmfile;
+ pgpid_t pid;
+
+ pid = get_pgpid(false);
+
+ if (pid == 0) /* no pid file */
+ {
+ write_stderr(_("%s: PID file \"%s\" does not exist\n"), progname, pid_file);
+ write_stderr(_("Is server running?\n"));
+ exit(1);
+ }
+ else if (pid < 0) /* standalone backend, not postmaster */
+ {
+ pid = -pid;
+ write_stderr(_("%s: cannot promote server; "
+ "single-user server is running (PID: %ld)\n"),
+ progname, pid);
+ exit(1);
+ }
+
+ if (get_control_dbstate() != DB_IN_ARCHIVE_RECOVERY)
+ {
+ write_stderr(_("%s: cannot promote server; "
+ "server is not in standby mode\n"),
+ progname);
+ exit(1);
+ }
+
+ snprintf(promote_file, MAXPGPATH, "%s/promote", pg_data);
+
+ if ((prmfile = fopen(promote_file, "w")) == NULL)
+ {
+ write_stderr(_("%s: could not create promote signal file \"%s\": %s\n"),
+ progname, promote_file, strerror(errno));
+ exit(1);
+ }
+ if (fclose(prmfile))
+ {
+ write_stderr(_("%s: could not write promote signal file \"%s\": %s\n"),
+ progname, promote_file, strerror(errno));
+ exit(1);
+ }
+
+ sig = SIGUSR1;
+ if (kill((pid_t) pid, sig) != 0)
+ {
+ write_stderr(_("%s: could not send promote signal (PID: %ld): %s\n"),
+ progname, pid, strerror(errno));
+ if (unlink(promote_file) != 0)
+ write_stderr(_("%s: could not remove promote signal file \"%s\": %s\n"),
+ progname, promote_file, strerror(errno));
+ exit(1);
+ }
+
+ if (do_wait)
+ {
+ print_msg(_("waiting for server to promote..."));
+ if (wait_for_postmaster_promote())
+ {
+ print_msg(_(" done\n"));
+ print_msg(_("server promoted\n"));
+ }
+ else
+ {
+ print_msg(_(" stopped waiting\n"));
+ write_stderr(_("%s: server did not promote in time\n"),
+ progname);
+ exit(1);
+ }
+ }
+ else
+ print_msg(_("server promoting\n"));
+}
+
+/*
+ * log rotate
+ */
+
+static void
+do_logrotate(void)
+{
+ FILE *logrotatefile;
+ pgpid_t pid;
+
+ pid = get_pgpid(false);
+
+ if (pid == 0) /* no pid file */
+ {
+ write_stderr(_("%s: PID file \"%s\" does not exist\n"), progname, pid_file);
+ write_stderr(_("Is server running?\n"));
+ exit(1);
+ }
+ else if (pid < 0) /* standalone backend, not postmaster */
+ {
+ pid = -pid;
+ write_stderr(_("%s: cannot rotate log file; "
+ "single-user server is running (PID: %ld)\n"),
+ progname, pid);
+ exit(1);
+ }
+
+ snprintf(logrotate_file, MAXPGPATH, "%s/logrotate", pg_data);
+
+ if ((logrotatefile = fopen(logrotate_file, "w")) == NULL)
+ {
+ write_stderr(_("%s: could not create log rotation signal file \"%s\": %s\n"),
+ progname, logrotate_file, strerror(errno));
+ exit(1);
+ }
+ if (fclose(logrotatefile))
+ {
+ write_stderr(_("%s: could not write log rotation signal file \"%s\": %s\n"),
+ progname, logrotate_file, strerror(errno));
+ exit(1);
+ }
+
+ sig = SIGUSR1;
+ if (kill((pid_t) pid, sig) != 0)
+ {
+ write_stderr(_("%s: could not send log rotation signal (PID: %ld): %s\n"),
+ progname, pid, strerror(errno));
+ if (unlink(logrotate_file) != 0)
+ write_stderr(_("%s: could not remove log rotation signal file \"%s\": %s\n"),
+ progname, logrotate_file, strerror(errno));
+ exit(1);
+ }
+
+ print_msg(_("server signaled to rotate log file\n"));
+}
+
+
+/*
+ * utility routines
+ */
+
+static bool
+postmaster_is_alive(pid_t pid)
+{
+ /*
+ * Test to see if the process is still there. Note that we do not
+ * consider an EPERM failure to mean that the process is still there;
+ * EPERM must mean that the given PID belongs to some other userid, and
+ * considering the permissions on $PGDATA, that means it's not the
+ * postmaster we are after.
+ *
+ * Don't believe that our own PID or parent shell's PID is the postmaster,
+ * either. (Windows hasn't got getppid(), though.)
+ */
+ if (pid == getpid())
+ return false;
+#ifndef WIN32
+ if (pid == getppid())
+ return false;
+#endif
+ if (kill(pid, 0) == 0)
+ return true;
+ return false;
+}
+
+static void
+do_status(void)
+{
+ pgpid_t pid;
+
+ pid = get_pgpid(true);
+ /* Is there a pid file? */
+ if (pid != 0)
+ {
+ /* standalone backend? */
+ if (pid < 0)
+ {
+ pid = -pid;
+ if (postmaster_is_alive((pid_t) pid))
+ {
+ printf(_("%s: single-user server is running (PID: %ld)\n"),
+ progname, pid);
+ return;
+ }
+ }
+ else
+ /* must be a postmaster */
+ {
+ if (postmaster_is_alive((pid_t) pid))
+ {
+ char **optlines;
+ char **curr_line;
+ int numlines;
+
+ printf(_("%s: server is running (PID: %ld)\n"),
+ progname, pid);
+
+ optlines = readfile(postopts_file, &numlines);
+ if (optlines != NULL)
+ {
+ for (curr_line = optlines; *curr_line != NULL; curr_line++)
+ puts(*curr_line);
+
+ /* Free the results of readfile */
+ free_readfile(optlines);
+ }
+ return;
+ }
+ }
+ }
+ printf(_("%s: no server running\n"), progname);
+
+ /*
+ * The Linux Standard Base Core Specification 3.1 says this should return
+ * '3, program is not running'
+ * https://refspecs.linuxbase.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
+ */
+ exit(3);
+}
+
+
+
+static void
+do_kill(pgpid_t pid)
+{
+ if (kill((pid_t) pid, sig) != 0)
+ {
+ write_stderr(_("%s: could not send signal %d (PID: %ld): %s\n"),
+ progname, sig, pid, strerror(errno));
+ exit(1);
+ }
+}
+
+#ifdef WIN32
+
+static bool
+pgwin32_IsInstalled(SC_HANDLE hSCM)
+{
+ SC_HANDLE hService = OpenService(hSCM, register_servicename, SERVICE_QUERY_CONFIG);
+ bool bResult = (hService != NULL);
+
+ if (bResult)
+ CloseServiceHandle(hService);
+ return bResult;
+}
+
+static char *
+pgwin32_CommandLine(bool registration)
+{
+ PQExpBuffer cmdLine = createPQExpBuffer();
+ char cmdPath[MAXPGPATH];
+ int ret;
+
+ if (registration)
+ {
+ ret = find_my_exec(argv0, cmdPath);
+ if (ret != 0)
+ {
+ write_stderr(_("%s: could not find own program executable\n"), progname);
+ exit(1);
+ }
+ }
+ else
+ {
+ ret = find_other_exec(argv0, "postgres", PG_BACKEND_VERSIONSTR,
+ cmdPath);
+ if (ret != 0)
+ {
+ write_stderr(_("%s: could not find postgres program executable\n"), progname);
+ exit(1);
+ }
+ }
+
+ /* if path does not end in .exe, append it */
+ if (strlen(cmdPath) < 4 ||
+ pg_strcasecmp(cmdPath + strlen(cmdPath) - 4, ".exe") != 0)
+ snprintf(cmdPath + strlen(cmdPath), sizeof(cmdPath) - strlen(cmdPath),
+ ".exe");
+
+ /* use backslashes in path to avoid problems with some third-party tools */
+ make_native_path(cmdPath);
+
+ /* be sure to double-quote the executable's name in the command */
+ appendPQExpBuffer(cmdLine, "\"%s\"", cmdPath);
+
+ /* append assorted switches to the command line, as needed */
+
+ if (registration)
+ appendPQExpBuffer(cmdLine, " runservice -N \"%s\"",
+ register_servicename);
+
+ if (pg_config)
+ {
+ /* We need the -D path to be absolute */
+ char *dataDir;
+
+ if ((dataDir = make_absolute_path(pg_config)) == NULL)
+ {
+ /* make_absolute_path already reported the error */
+ exit(1);
+ }
+ make_native_path(dataDir);
+ appendPQExpBuffer(cmdLine, " -D \"%s\"", dataDir);
+ free(dataDir);
+ }
+
+ if (registration && event_source != NULL)
+ appendPQExpBuffer(cmdLine, " -e \"%s\"", event_source);
+
+ if (registration && do_wait)
+ appendPQExpBufferStr(cmdLine, " -w");
+
+ /* Don't propagate a value from an environment variable. */
+ if (registration && wait_seconds_arg && wait_seconds != DEFAULT_WAIT)
+ appendPQExpBuffer(cmdLine, " -t %d", wait_seconds);
+
+ if (registration && silent_mode)
+ appendPQExpBufferStr(cmdLine, " -s");
+
+ if (post_opts)
+ {
+ if (registration)
+ appendPQExpBuffer(cmdLine, " -o \"%s\"", post_opts);
+ else
+ appendPQExpBuffer(cmdLine, " %s", post_opts);
+ }
+
+ return cmdLine->data;
+}
+
+static void
+pgwin32_doRegister(void)
+{
+ SC_HANDLE hService;
+ SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
+
+ if (hSCM == NULL)
+ {
+ write_stderr(_("%s: could not open service manager\n"), progname);
+ exit(1);
+ }
+ if (pgwin32_IsInstalled(hSCM))
+ {
+ CloseServiceHandle(hSCM);
+ write_stderr(_("%s: service \"%s\" already registered\n"), progname, register_servicename);
+ exit(1);
+ }
+
+ if ((hService = CreateService(hSCM, register_servicename, register_servicename,
+ SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
+ pgctl_start_type, SERVICE_ERROR_NORMAL,
+ pgwin32_CommandLine(true),
+ NULL, NULL, "RPCSS\0", register_username, register_password)) == NULL)
+ {
+ CloseServiceHandle(hSCM);
+ write_stderr(_("%s: could not register service \"%s\": error code %lu\n"),
+ progname, register_servicename,
+ (unsigned long) GetLastError());
+ exit(1);
+ }
+ CloseServiceHandle(hService);
+ CloseServiceHandle(hSCM);
+}
+
+static void
+pgwin32_doUnregister(void)
+{
+ SC_HANDLE hService;
+ SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
+
+ if (hSCM == NULL)
+ {
+ write_stderr(_("%s: could not open service manager\n"), progname);
+ exit(1);
+ }
+ if (!pgwin32_IsInstalled(hSCM))
+ {
+ CloseServiceHandle(hSCM);
+ write_stderr(_("%s: service \"%s\" not registered\n"), progname, register_servicename);
+ exit(1);
+ }
+
+ if ((hService = OpenService(hSCM, register_servicename, DELETE)) == NULL)
+ {
+ CloseServiceHandle(hSCM);
+ write_stderr(_("%s: could not open service \"%s\": error code %lu\n"),
+ progname, register_servicename,
+ (unsigned long) GetLastError());
+ exit(1);
+ }
+ if (!DeleteService(hService))
+ {
+ CloseServiceHandle(hService);
+ CloseServiceHandle(hSCM);
+ write_stderr(_("%s: could not unregister service \"%s\": error code %lu\n"),
+ progname, register_servicename,
+ (unsigned long) GetLastError());
+ exit(1);
+ }
+ CloseServiceHandle(hService);
+ CloseServiceHandle(hSCM);
+}
+
+static void
+pgwin32_SetServiceStatus(DWORD currentState)
+{
+ status.dwCurrentState = currentState;
+ SetServiceStatus(hStatus, (LPSERVICE_STATUS) &status);
+}
+
+static void WINAPI
+pgwin32_ServiceHandler(DWORD request)
+{
+ switch (request)
+ {
+ case SERVICE_CONTROL_STOP:
+ case SERVICE_CONTROL_SHUTDOWN:
+
+ /*
+ * We only need a short wait hint here as it just needs to wait
+ * for the next checkpoint. They occur every 5 seconds during
+ * shutdown
+ */
+ status.dwWaitHint = 10000;
+ pgwin32_SetServiceStatus(SERVICE_STOP_PENDING);
+ SetEvent(shutdownEvent);
+ return;
+
+ case SERVICE_CONTROL_PAUSE:
+ /* Win32 config reloading */
+ status.dwWaitHint = 5000;
+ kill(postmasterPID, SIGHUP);
+ return;
+
+ /* FIXME: These could be used to replace other signals etc */
+ case SERVICE_CONTROL_CONTINUE:
+ case SERVICE_CONTROL_INTERROGATE:
+ default:
+ break;
+ }
+}
+
+static void WINAPI
+pgwin32_ServiceMain(DWORD argc, LPTSTR *argv)
+{
+ PROCESS_INFORMATION pi;
+ DWORD ret;
+
+ /* Initialize variables */
+ status.dwWin32ExitCode = S_OK;
+ status.dwCheckPoint = 0;
+ status.dwWaitHint = 60000;
+ status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+ status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
+ status.dwServiceSpecificExitCode = 0;
+ status.dwCurrentState = SERVICE_START_PENDING;
+
+ memset(&pi, 0, sizeof(pi));
+
+ read_post_opts();
+
+ /* Register the control request handler */
+ if ((hStatus = RegisterServiceCtrlHandler(register_servicename, pgwin32_ServiceHandler)) == (SERVICE_STATUS_HANDLE) 0)
+ return;
+
+ if ((shutdownEvent = CreateEvent(NULL, true, false, NULL)) == NULL)
+ return;
+
+ /* Start the postmaster */
+ pgwin32_SetServiceStatus(SERVICE_START_PENDING);
+ if (!CreateRestrictedProcess(pgwin32_CommandLine(false), &pi, true))
+ {
+ pgwin32_SetServiceStatus(SERVICE_STOPPED);
+ return;
+ }
+ postmasterPID = pi.dwProcessId;
+ postmasterProcess = pi.hProcess;
+ CloseHandle(pi.hThread);
+
+ if (do_wait)
+ {
+ write_eventlog(EVENTLOG_INFORMATION_TYPE, _("Waiting for server startup...\n"));
+ if (wait_for_postmaster_start(postmasterPID, true) != POSTMASTER_READY)
+ {
+ write_eventlog(EVENTLOG_ERROR_TYPE, _("Timed out waiting for server startup\n"));
+ pgwin32_SetServiceStatus(SERVICE_STOPPED);
+ return;
+ }
+ write_eventlog(EVENTLOG_INFORMATION_TYPE, _("Server started and accepting connections\n"));
+ }
+
+ pgwin32_SetServiceStatus(SERVICE_RUNNING);
+
+ /* Wait for quit... */
+ ret = WaitForMultipleObjects(2, shutdownHandles, FALSE, INFINITE);
+
+ pgwin32_SetServiceStatus(SERVICE_STOP_PENDING);
+ switch (ret)
+ {
+ case WAIT_OBJECT_0: /* shutdown event */
+ {
+ /*
+ * status.dwCheckPoint can be incremented by
+ * wait_for_postmaster_start(), so it might not start from 0.
+ */
+ int maxShutdownCheckPoint = status.dwCheckPoint + 12;
+
+ kill(postmasterPID, SIGINT);
+
+ /*
+ * Increment the checkpoint and try again. Abort after 12
+ * checkpoints as the postmaster has probably hung.
+ */
+ while (WaitForSingleObject(postmasterProcess, 5000) == WAIT_TIMEOUT && status.dwCheckPoint < maxShutdownCheckPoint)
+ {
+ status.dwCheckPoint++;
+ SetServiceStatus(hStatus, (LPSERVICE_STATUS) &status);
+ }
+ break;
+ }
+
+ case (WAIT_OBJECT_0 + 1): /* postmaster went down */
+ break;
+
+ default:
+ /* shouldn't get here? */
+ break;
+ }
+
+ CloseHandle(shutdownEvent);
+ CloseHandle(postmasterProcess);
+
+ pgwin32_SetServiceStatus(SERVICE_STOPPED);
+}
+
+static void
+pgwin32_doRunAsService(void)
+{
+ SERVICE_TABLE_ENTRY st[] = {{register_servicename, pgwin32_ServiceMain},
+ {NULL, NULL}};
+
+ if (StartServiceCtrlDispatcher(st) == 0)
+ {
+ write_stderr(_("%s: could not start service \"%s\": error code %lu\n"),
+ progname, register_servicename,
+ (unsigned long) GetLastError());
+ exit(1);
+ }
+}
+
+
+/*
+ * Mingw headers are incomplete, and so are the libraries. So we have to load
+ * a whole lot of API functions dynamically. Since we have to do this anyway,
+ * also load the couple of functions that *do* exist in mingw headers but not
+ * on NT4. That way, we don't break on NT4.
+ */
+typedef BOOL (WINAPI * __CreateRestrictedToken) (HANDLE, DWORD, DWORD, PSID_AND_ATTRIBUTES, DWORD, PLUID_AND_ATTRIBUTES, DWORD, PSID_AND_ATTRIBUTES, PHANDLE);
+typedef BOOL (WINAPI * __IsProcessInJob) (HANDLE, HANDLE, PBOOL);
+typedef HANDLE (WINAPI * __CreateJobObject) (LPSECURITY_ATTRIBUTES, LPCTSTR);
+typedef BOOL (WINAPI * __SetInformationJobObject) (HANDLE, JOBOBJECTINFOCLASS, LPVOID, DWORD);
+typedef BOOL (WINAPI * __AssignProcessToJobObject) (HANDLE, HANDLE);
+typedef BOOL (WINAPI * __QueryInformationJobObject) (HANDLE, JOBOBJECTINFOCLASS, LPVOID, DWORD, LPDWORD);
+
+/*
+ * Set up STARTUPINFO for the new process to inherit this process' handles.
+ *
+ * Process started as services appear to have "empty" handles (GetStdHandle()
+ * returns NULL) rather than invalid ones. But passing down NULL ourselves
+ * doesn't work, it's interpreted as STARTUPINFO->hStd* not being set. But we
+ * can pass down INVALID_HANDLE_VALUE - which makes GetStdHandle() in the new
+ * process (and its child processes!) return INVALID_HANDLE_VALUE. Which
+ * achieves the goal of postmaster running in a similar environment as pg_ctl.
+ */
+static void
+InheritStdHandles(STARTUPINFO *si)
+{
+ si->dwFlags |= STARTF_USESTDHANDLES;
+ si->hStdInput = GetStdHandle(STD_INPUT_HANDLE);
+ if (si->hStdInput == NULL)
+ si->hStdInput = INVALID_HANDLE_VALUE;
+ si->hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
+ if (si->hStdOutput == NULL)
+ si->hStdOutput = INVALID_HANDLE_VALUE;
+ si->hStdError = GetStdHandle(STD_ERROR_HANDLE);
+ if (si->hStdError == NULL)
+ si->hStdError = INVALID_HANDLE_VALUE;
+}
+
+/*
+ * Create a restricted token, a job object sandbox, and execute the specified
+ * process with it.
+ *
+ * Returns 0 on success, non-zero on failure, same as CreateProcess().
+ *
+ * On NT4, or any other system not containing the required functions, will
+ * launch the process under the current token without doing any modifications.
+ *
+ * NOTE! Job object will only work when running as a service, because it's
+ * automatically destroyed when pg_ctl exits.
+ */
+static int
+CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_service)
+{
+ int r;
+ BOOL b;
+ STARTUPINFO si;
+ HANDLE origToken;
+ HANDLE restrictedToken;
+ SID_IDENTIFIER_AUTHORITY NtAuthority = {SECURITY_NT_AUTHORITY};
+ SID_AND_ATTRIBUTES dropSids[2];
+ PTOKEN_PRIVILEGES delPrivs;
+
+ /* Functions loaded dynamically */
+ __CreateRestrictedToken _CreateRestrictedToken = NULL;
+ __IsProcessInJob _IsProcessInJob = NULL;
+ __CreateJobObject _CreateJobObject = NULL;
+ __SetInformationJobObject _SetInformationJobObject = NULL;
+ __AssignProcessToJobObject _AssignProcessToJobObject = NULL;
+ __QueryInformationJobObject _QueryInformationJobObject = NULL;
+ HANDLE Kernel32Handle;
+ HANDLE Advapi32Handle;
+
+ ZeroMemory(&si, sizeof(si));
+ si.cb = sizeof(si);
+
+ /*
+ * Set stdin/stdout/stderr handles to be inherited in the child process.
+ * That allows postmaster and the processes it starts to perform
+ * additional checks to see if running in a service (otherwise they get
+ * the default console handles - which point to "somewhere").
+ */
+ InheritStdHandles(&si);
+
+ Advapi32Handle = LoadLibrary("ADVAPI32.DLL");
+ if (Advapi32Handle != NULL)
+ {
+ _CreateRestrictedToken = (__CreateRestrictedToken) (pg_funcptr_t) GetProcAddress(Advapi32Handle, "CreateRestrictedToken");
+ }
+
+ if (_CreateRestrictedToken == NULL)
+ {
+ /*
+ * NT4 doesn't have CreateRestrictedToken, so just call ordinary
+ * CreateProcess
+ */
+ write_stderr(_("%s: WARNING: cannot create restricted tokens on this platform\n"), progname);
+ if (Advapi32Handle != NULL)
+ FreeLibrary(Advapi32Handle);
+ return CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, processInfo);
+ }
+
+ /* Open the current token to use as a base for the restricted one */
+ if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &origToken))
+ {
+ /*
+ * Most Windows targets make DWORD a 32-bit unsigned long, but in case
+ * it doesn't cast DWORD before printing.
+ */
+ write_stderr(_("%s: could not open process token: error code %lu\n"),
+ progname, (unsigned long) GetLastError());
+ return 0;
+ }
+
+ /* Allocate list of SIDs to remove */
+ ZeroMemory(&dropSids, sizeof(dropSids));
+ if (!AllocateAndInitializeSid(&NtAuthority, 2,
+ SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0,
+ 0, &dropSids[0].Sid) ||
+ !AllocateAndInitializeSid(&NtAuthority, 2,
+ SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_POWER_USERS, 0, 0, 0, 0, 0,
+ 0, &dropSids[1].Sid))
+ {
+ write_stderr(_("%s: could not allocate SIDs: error code %lu\n"),
+ progname, (unsigned long) GetLastError());
+ return 0;
+ }
+
+ /* Get list of privileges to remove */
+ delPrivs = GetPrivilegesToDelete(origToken);
+ if (delPrivs == NULL)
+ /* Error message already printed */
+ return 0;
+
+ b = _CreateRestrictedToken(origToken,
+ 0,
+ sizeof(dropSids) / sizeof(dropSids[0]),
+ dropSids,
+ delPrivs->PrivilegeCount, delPrivs->Privileges,
+ 0, NULL,
+ &restrictedToken);
+
+ free(delPrivs);
+ FreeSid(dropSids[1].Sid);
+ FreeSid(dropSids[0].Sid);
+ CloseHandle(origToken);
+ FreeLibrary(Advapi32Handle);
+
+ if (!b)
+ {
+ write_stderr(_("%s: could not create restricted token: error code %lu\n"),
+ progname, (unsigned long) GetLastError());
+ return 0;
+ }
+
+ AddUserToTokenDacl(restrictedToken);
+ r = CreateProcessAsUser(restrictedToken, NULL, cmd, NULL, NULL, TRUE, CREATE_SUSPENDED, NULL, NULL, &si, processInfo);
+
+ Kernel32Handle = LoadLibrary("KERNEL32.DLL");
+ if (Kernel32Handle != NULL)
+ {
+ _IsProcessInJob = (__IsProcessInJob) (pg_funcptr_t) GetProcAddress(Kernel32Handle, "IsProcessInJob");
+ _CreateJobObject = (__CreateJobObject) (pg_funcptr_t) GetProcAddress(Kernel32Handle, "CreateJobObjectA");
+ _SetInformationJobObject = (__SetInformationJobObject) (pg_funcptr_t) GetProcAddress(Kernel32Handle, "SetInformationJobObject");
+ _AssignProcessToJobObject = (__AssignProcessToJobObject) (pg_funcptr_t) GetProcAddress(Kernel32Handle, "AssignProcessToJobObject");
+ _QueryInformationJobObject = (__QueryInformationJobObject) (pg_funcptr_t) GetProcAddress(Kernel32Handle, "QueryInformationJobObject");
+ }
+
+ /* Verify that we found all functions */
+ if (_IsProcessInJob == NULL || _CreateJobObject == NULL || _SetInformationJobObject == NULL || _AssignProcessToJobObject == NULL || _QueryInformationJobObject == NULL)
+ {
+ /*
+ * IsProcessInJob() is not available on < WinXP, so there is no need
+ * to log the error every time in that case
+ */
+ if (IsWindowsXPOrGreater())
+
+ /*
+ * Log error if we can't get version, or if we're on WinXP/2003 or
+ * newer
+ */
+ write_stderr(_("%s: WARNING: could not locate all job object functions in system API\n"), progname);
+ }
+ else
+ {
+ BOOL inJob;
+
+ if (_IsProcessInJob(processInfo->hProcess, NULL, &inJob))
+ {
+ if (!inJob)
+ {
+ /*
+ * Job objects are working, and the new process isn't in one,
+ * so we can create one safely. If any problems show up when
+ * setting it, we're going to ignore them.
+ */
+ HANDLE job;
+ char jobname[128];
+
+ sprintf(jobname, "PostgreSQL_%lu",
+ (unsigned long) processInfo->dwProcessId);
+
+ job = _CreateJobObject(NULL, jobname);
+ if (job)
+ {
+ JOBOBJECT_BASIC_LIMIT_INFORMATION basicLimit;
+ JOBOBJECT_BASIC_UI_RESTRICTIONS uiRestrictions;
+ JOBOBJECT_SECURITY_LIMIT_INFORMATION securityLimit;
+
+ ZeroMemory(&basicLimit, sizeof(basicLimit));
+ ZeroMemory(&uiRestrictions, sizeof(uiRestrictions));
+ ZeroMemory(&securityLimit, sizeof(securityLimit));
+
+ basicLimit.LimitFlags = JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION | JOB_OBJECT_LIMIT_PRIORITY_CLASS;
+ basicLimit.PriorityClass = NORMAL_PRIORITY_CLASS;
+ _SetInformationJobObject(job, JobObjectBasicLimitInformation, &basicLimit, sizeof(basicLimit));
+
+ uiRestrictions.UIRestrictionsClass = JOB_OBJECT_UILIMIT_DESKTOP | JOB_OBJECT_UILIMIT_DISPLAYSETTINGS |
+ JOB_OBJECT_UILIMIT_EXITWINDOWS | JOB_OBJECT_UILIMIT_READCLIPBOARD |
+ JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS | JOB_OBJECT_UILIMIT_WRITECLIPBOARD;
+
+ if (as_service)
+ {
+ if (!IsWindows7OrGreater())
+ {
+ /*
+ * On Windows 7 (and presumably later),
+ * JOB_OBJECT_UILIMIT_HANDLES prevents us from
+ * starting as a service. So we only enable it on
+ * Vista and earlier (version <= 6.0)
+ */
+ uiRestrictions.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_HANDLES;
+ }
+ }
+ _SetInformationJobObject(job, JobObjectBasicUIRestrictions, &uiRestrictions, sizeof(uiRestrictions));
+
+ securityLimit.SecurityLimitFlags = JOB_OBJECT_SECURITY_NO_ADMIN | JOB_OBJECT_SECURITY_ONLY_TOKEN;
+ securityLimit.JobToken = restrictedToken;
+ _SetInformationJobObject(job, JobObjectSecurityLimitInformation, &securityLimit, sizeof(securityLimit));
+
+ _AssignProcessToJobObject(job, processInfo->hProcess);
+ }
+ }
+ }
+ }
+
+
+ CloseHandle(restrictedToken);
+
+ ResumeThread(processInfo->hThread);
+
+ FreeLibrary(Kernel32Handle);
+
+ /*
+ * We intentionally don't close the job object handle, because we want the
+ * object to live on until pg_ctl shuts down.
+ */
+ return r;
+}
+
+/*
+ * Get a list of privileges to delete from the access token. We delete all privileges
+ * except SeLockMemoryPrivilege which is needed to use large pages, and
+ * SeChangeNotifyPrivilege which is enabled by default in DISABLE_MAX_PRIVILEGE.
+ */
+static PTOKEN_PRIVILEGES
+GetPrivilegesToDelete(HANDLE hToken)
+{
+ int i,
+ j;
+ DWORD length;
+ PTOKEN_PRIVILEGES tokenPrivs;
+ LUID luidLockPages;
+ LUID luidChangeNotify;
+
+ if (!LookupPrivilegeValue(NULL, SE_LOCK_MEMORY_NAME, &luidLockPages) ||
+ !LookupPrivilegeValue(NULL, SE_CHANGE_NOTIFY_NAME, &luidChangeNotify))
+ {
+ write_stderr(_("%s: could not get LUIDs for privileges: error code %lu\n"),
+ progname, (unsigned long) GetLastError());
+ return NULL;
+ }
+
+ if (!GetTokenInformation(hToken, TokenPrivileges, NULL, 0, &length) &&
+ GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+ {
+ write_stderr(_("%s: could not get token information: error code %lu\n"),
+ progname, (unsigned long) GetLastError());
+ return NULL;
+ }
+
+ tokenPrivs = (PTOKEN_PRIVILEGES) pg_malloc_extended(length,
+ MCXT_ALLOC_NO_OOM);
+ if (tokenPrivs == NULL)
+ {
+ write_stderr(_("%s: out of memory\n"), progname);
+ return NULL;
+ }
+
+ if (!GetTokenInformation(hToken, TokenPrivileges, tokenPrivs, length, &length))
+ {
+ write_stderr(_("%s: could not get token information: error code %lu\n"),
+ progname, (unsigned long) GetLastError());
+ free(tokenPrivs);
+ return NULL;
+ }
+
+ for (i = 0; i < tokenPrivs->PrivilegeCount; i++)
+ {
+ if (memcmp(&tokenPrivs->Privileges[i].Luid, &luidLockPages, sizeof(LUID)) == 0 ||
+ memcmp(&tokenPrivs->Privileges[i].Luid, &luidChangeNotify, sizeof(LUID)) == 0)
+ {
+ for (j = i; j < tokenPrivs->PrivilegeCount - 1; j++)
+ tokenPrivs->Privileges[j] = tokenPrivs->Privileges[j + 1];
+ tokenPrivs->PrivilegeCount--;
+ }
+ }
+
+ return tokenPrivs;
+}
+#endif /* WIN32 */
+
+static void
+do_advice(void)
+{
+ write_stderr(_("Try \"%s --help\" for more information.\n"), progname);
+}
+
+
+
+static void
+do_help(void)
+{
+ printf(_("%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"), progname);
+ printf(_(" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+ " [-o OPTIONS] [-p PATH] [-c]\n"), progname);
+ printf(_(" %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"), progname);
+ printf(_(" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+ " [-o OPTIONS] [-c]\n"), progname);
+ printf(_(" %s reload [-D DATADIR] [-s]\n"), progname);
+ printf(_(" %s status [-D DATADIR]\n"), progname);
+ printf(_(" %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"), progname);
+ printf(_(" %s logrotate [-D DATADIR] [-s]\n"), progname);
+ printf(_(" %s kill SIGNALNAME PID\n"), progname);
+#ifdef WIN32
+ printf(_(" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+ " [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"), progname);
+ printf(_(" %s unregister [-N SERVICENAME]\n"), progname);
+#endif
+
+ printf(_("\nCommon options:\n"));
+ printf(_(" -D, --pgdata=DATADIR location of the database storage area\n"));
+#ifdef WIN32
+ printf(_(" -e SOURCE event source for logging when running as a service\n"));
+#endif
+ printf(_(" -s, --silent only print errors, no informational messages\n"));
+ printf(_(" -t, --timeout=SECS seconds to wait when using -w option\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -w, --wait wait until operation completes (default)\n"));
+ printf(_(" -W, --no-wait do not wait until operation completes\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("If the -D option is omitted, the environment variable PGDATA is used.\n"));
+
+ printf(_("\nOptions for start or restart:\n"));
+#if defined(HAVE_GETRLIMIT) && defined(RLIMIT_CORE)
+ printf(_(" -c, --core-files allow postgres to produce core files\n"));
+#else
+ printf(_(" -c, --core-files not applicable on this platform\n"));
+#endif
+ printf(_(" -l, --log=FILENAME write (or append) server log to FILENAME\n"));
+ printf(_(" -o, --options=OPTIONS command line options to pass to postgres\n"
+ " (PostgreSQL server executable) or initdb\n"));
+ printf(_(" -p PATH-TO-POSTGRES normally not necessary\n"));
+ printf(_("\nOptions for stop or restart:\n"));
+ printf(_(" -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"));
+
+ printf(_("\nShutdown modes are:\n"));
+ printf(_(" smart quit after all clients have disconnected\n"));
+ printf(_(" fast quit directly, with proper shutdown (default)\n"));
+ printf(_(" immediate quit without complete shutdown; will lead to recovery on restart\n"));
+
+ printf(_("\nAllowed signal names for kill:\n"));
+ printf(" ABRT HUP INT KILL QUIT TERM USR1 USR2\n");
+
+#ifdef WIN32
+ printf(_("\nOptions for register and unregister:\n"));
+ printf(_(" -N SERVICENAME service name with which to register PostgreSQL server\n"));
+ printf(_(" -P PASSWORD password of account to register PostgreSQL server\n"));
+ printf(_(" -U USERNAME user name of account to register PostgreSQL server\n"));
+ printf(_(" -S START-TYPE service start type to register PostgreSQL server\n"));
+
+ printf(_("\nStart types are:\n"));
+ printf(_(" auto start service automatically during system startup (default)\n"));
+ printf(_(" demand start service on demand\n"));
+#endif
+
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+
+
+static void
+set_mode(char *modeopt)
+{
+ if (strcmp(modeopt, "s") == 0 || strcmp(modeopt, "smart") == 0)
+ {
+ shutdown_mode = SMART_MODE;
+ sig = SIGTERM;
+ }
+ else if (strcmp(modeopt, "f") == 0 || strcmp(modeopt, "fast") == 0)
+ {
+ shutdown_mode = FAST_MODE;
+ sig = SIGINT;
+ }
+ else if (strcmp(modeopt, "i") == 0 || strcmp(modeopt, "immediate") == 0)
+ {
+ shutdown_mode = IMMEDIATE_MODE;
+ sig = SIGQUIT;
+ }
+ else
+ {
+ write_stderr(_("%s: unrecognized shutdown mode \"%s\"\n"), progname, modeopt);
+ do_advice();
+ exit(1);
+ }
+}
+
+
+
+static void
+set_sig(char *signame)
+{
+ if (strcmp(signame, "HUP") == 0)
+ sig = SIGHUP;
+ else if (strcmp(signame, "INT") == 0)
+ sig = SIGINT;
+ else if (strcmp(signame, "QUIT") == 0)
+ sig = SIGQUIT;
+ else if (strcmp(signame, "ABRT") == 0)
+ sig = SIGABRT;
+ else if (strcmp(signame, "KILL") == 0)
+ sig = SIGKILL;
+ else if (strcmp(signame, "TERM") == 0)
+ sig = SIGTERM;
+ else if (strcmp(signame, "USR1") == 0)
+ sig = SIGUSR1;
+ else if (strcmp(signame, "USR2") == 0)
+ sig = SIGUSR2;
+ else
+ {
+ write_stderr(_("%s: unrecognized signal name \"%s\"\n"), progname, signame);
+ do_advice();
+ exit(1);
+ }
+}
+
+
+#ifdef WIN32
+static void
+set_starttype(char *starttypeopt)
+{
+ if (strcmp(starttypeopt, "a") == 0 || strcmp(starttypeopt, "auto") == 0)
+ pgctl_start_type = SERVICE_AUTO_START;
+ else if (strcmp(starttypeopt, "d") == 0 || strcmp(starttypeopt, "demand") == 0)
+ pgctl_start_type = SERVICE_DEMAND_START;
+ else
+ {
+ write_stderr(_("%s: unrecognized start type \"%s\"\n"), progname, starttypeopt);
+ do_advice();
+ exit(1);
+ }
+}
+#endif
+
+/*
+ * adjust_data_dir
+ *
+ * If a configuration-only directory was specified, find the real data dir.
+ */
+static void
+adjust_data_dir(void)
+{
+ char filename[MAXPGPATH];
+ char *my_exec_path,
+ *cmd;
+ FILE *fd;
+
+ /* do nothing if we're working without knowledge of data dir */
+ if (pg_config == NULL)
+ return;
+
+ /* If there is no postgresql.conf, it can't be a config-only dir */
+ snprintf(filename, sizeof(filename), "%s/postgresql.conf", pg_config);
+ if ((fd = fopen(filename, "r")) == NULL)
+ return;
+ fclose(fd);
+
+ /* If PG_VERSION exists, it can't be a config-only dir */
+ snprintf(filename, sizeof(filename), "%s/PG_VERSION", pg_config);
+ if ((fd = fopen(filename, "r")) != NULL)
+ {
+ fclose(fd);
+ return;
+ }
+
+ /* Must be a configuration directory, so find the data directory */
+
+ /* we use a private my_exec_path to avoid interfering with later uses */
+ if (exec_path == NULL)
+ my_exec_path = find_other_exec_or_die(argv0, "postgres", PG_BACKEND_VERSIONSTR);
+ else
+ my_exec_path = pg_strdup(exec_path);
+
+ /* it's important for -C to be the first option, see main.c */
+ cmd = psprintf("\"%s\" -C data_directory %s%s",
+ my_exec_path,
+ pgdata_opt ? pgdata_opt : "",
+ post_opts ? post_opts : "");
+
+ fd = popen(cmd, "r");
+ if (fd == NULL || fgets(filename, sizeof(filename), fd) == NULL)
+ {
+ write_stderr(_("%s: could not determine the data directory using command \"%s\"\n"), progname, cmd);
+ exit(1);
+ }
+ pclose(fd);
+ free(my_exec_path);
+
+ /* strip trailing newline and carriage return */
+ (void) pg_strip_crlf(filename);
+
+ free(pg_data);
+ pg_data = pg_strdup(filename);
+ canonicalize_path(pg_data);
+}
+
+
+static DBState
+get_control_dbstate(void)
+{
+ DBState ret;
+ bool crc_ok;
+ ControlFileData *control_file_data = get_controlfile(pg_data, &crc_ok);
+
+ if (!crc_ok)
+ {
+ write_stderr(_("%s: control file appears to be corrupt\n"), progname);
+ exit(1);
+ }
+
+ ret = control_file_data->state;
+ pfree(control_file_data);
+ return ret;
+}
+
+
+int
+main(int argc, char **argv)
+{
+ static struct option long_options[] = {
+ {"help", no_argument, NULL, '?'},
+ {"version", no_argument, NULL, 'V'},
+ {"log", required_argument, NULL, 'l'},
+ {"mode", required_argument, NULL, 'm'},
+ {"pgdata", required_argument, NULL, 'D'},
+ {"options", required_argument, NULL, 'o'},
+ {"silent", no_argument, NULL, 's'},
+ {"timeout", required_argument, NULL, 't'},
+ {"core-files", no_argument, NULL, 'c'},
+ {"wait", no_argument, NULL, 'w'},
+ {"no-wait", no_argument, NULL, 'W'},
+ {NULL, 0, NULL, 0}
+ };
+
+ char *env_wait;
+ int option_index;
+ int c;
+ pgpid_t killproc = 0;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_ctl"));
+ start_time = time(NULL);
+
+ /*
+ * save argv[0] so do_start() can look for the postmaster if necessary. we
+ * don't look for postmaster here because in many cases we won't need it.
+ */
+ argv0 = argv[0];
+
+ /* Set restrictive mode mask until PGDATA permissions are checked */
+ umask(PG_MODE_MASK_OWNER);
+
+ /* support --help and --version even if invoked as root */
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ do_help();
+ exit(0);
+ }
+ else if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_ctl (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ /*
+ * Disallow running as root, to forestall any possible security holes.
+ */
+#ifndef WIN32
+ if (geteuid() == 0)
+ {
+ write_stderr(_("%s: cannot be run as root\n"
+ "Please log in (using, e.g., \"su\") as the "
+ "(unprivileged) user that will\n"
+ "own the server process.\n"),
+ progname);
+ exit(1);
+ }
+#endif
+
+ env_wait = getenv("PGCTLTIMEOUT");
+ if (env_wait != NULL)
+ wait_seconds = atoi(env_wait);
+
+ /*
+ * 'Action' can be before or after args so loop over both. Some
+ * getopt_long() implementations will reorder argv[] to place all flags
+ * first (GNU?), but we don't rely on it. Our /port version doesn't do
+ * that.
+ */
+ optind = 1;
+
+ /* process command-line options */
+ while (optind < argc)
+ {
+ while ((c = getopt_long(argc, argv, "cD:e:l:m:N:o:p:P:sS:t:U:wW",
+ long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+ case 'D':
+ {
+ char *pgdata_D;
+
+ pgdata_D = pg_strdup(optarg);
+ canonicalize_path(pgdata_D);
+ setenv("PGDATA", pgdata_D, 1);
+
+ /*
+ * We could pass PGDATA just in an environment
+ * variable but we do -D too for clearer postmaster
+ * 'ps' display
+ */
+ pgdata_opt = psprintf("-D \"%s\" ", pgdata_D);
+ free(pgdata_D);
+ break;
+ }
+ case 'e':
+ event_source = pg_strdup(optarg);
+ break;
+ case 'l':
+ log_file = pg_strdup(optarg);
+ break;
+ case 'm':
+ set_mode(optarg);
+ break;
+ case 'N':
+ register_servicename = pg_strdup(optarg);
+ break;
+ case 'o':
+ /* append option? */
+ if (!post_opts)
+ post_opts = pg_strdup(optarg);
+ else
+ {
+ char *old_post_opts = post_opts;
+
+ post_opts = psprintf("%s %s", old_post_opts, optarg);
+ free(old_post_opts);
+ }
+ break;
+ case 'p':
+ exec_path = pg_strdup(optarg);
+ break;
+ case 'P':
+ register_password = pg_strdup(optarg);
+ break;
+ case 's':
+ silent_mode = true;
+ break;
+ case 'S':
+#ifdef WIN32
+ set_starttype(optarg);
+#else
+ write_stderr(_("%s: -S option not supported on this platform\n"),
+ progname);
+ exit(1);
+#endif
+ break;
+ case 't':
+ wait_seconds = atoi(optarg);
+ wait_seconds_arg = true;
+ break;
+ case 'U':
+ if (strchr(optarg, '\\'))
+ register_username = pg_strdup(optarg);
+ else
+ /* Prepend .\ for local accounts */
+ register_username = psprintf(".\\%s", optarg);
+ break;
+ case 'w':
+ do_wait = true;
+ break;
+ case 'W':
+ do_wait = false;
+ break;
+ case 'c':
+ allow_core_files = true;
+ break;
+ default:
+ /* getopt_long already issued a suitable error message */
+ do_advice();
+ exit(1);
+ }
+ }
+
+ /* Process an action */
+ if (optind < argc)
+ {
+ if (ctl_command != NO_COMMAND)
+ {
+ write_stderr(_("%s: too many command-line arguments (first is \"%s\")\n"), progname, argv[optind]);
+ do_advice();
+ exit(1);
+ }
+
+ if (strcmp(argv[optind], "init") == 0
+ || strcmp(argv[optind], "initdb") == 0)
+ ctl_command = INIT_COMMAND;
+ else if (strcmp(argv[optind], "start") == 0)
+ ctl_command = START_COMMAND;
+ else if (strcmp(argv[optind], "stop") == 0)
+ ctl_command = STOP_COMMAND;
+ else if (strcmp(argv[optind], "restart") == 0)
+ ctl_command = RESTART_COMMAND;
+ else if (strcmp(argv[optind], "reload") == 0)
+ ctl_command = RELOAD_COMMAND;
+ else if (strcmp(argv[optind], "status") == 0)
+ ctl_command = STATUS_COMMAND;
+ else if (strcmp(argv[optind], "promote") == 0)
+ ctl_command = PROMOTE_COMMAND;
+ else if (strcmp(argv[optind], "logrotate") == 0)
+ ctl_command = LOGROTATE_COMMAND;
+ else if (strcmp(argv[optind], "kill") == 0)
+ {
+ if (argc - optind < 3)
+ {
+ write_stderr(_("%s: missing arguments for kill mode\n"), progname);
+ do_advice();
+ exit(1);
+ }
+ ctl_command = KILL_COMMAND;
+ set_sig(argv[++optind]);
+ killproc = atol(argv[++optind]);
+ }
+#ifdef WIN32
+ else if (strcmp(argv[optind], "register") == 0)
+ ctl_command = REGISTER_COMMAND;
+ else if (strcmp(argv[optind], "unregister") == 0)
+ ctl_command = UNREGISTER_COMMAND;
+ else if (strcmp(argv[optind], "runservice") == 0)
+ ctl_command = RUN_AS_SERVICE_COMMAND;
+#endif
+ else
+ {
+ write_stderr(_("%s: unrecognized operation mode \"%s\"\n"), progname, argv[optind]);
+ do_advice();
+ exit(1);
+ }
+ optind++;
+ }
+ }
+
+ if (ctl_command == NO_COMMAND)
+ {
+ write_stderr(_("%s: no operation specified\n"), progname);
+ do_advice();
+ exit(1);
+ }
+
+ /* Note we put any -D switch into the env var above */
+ pg_config = getenv("PGDATA");
+ if (pg_config)
+ {
+ pg_config = pg_strdup(pg_config);
+ canonicalize_path(pg_config);
+ pg_data = pg_strdup(pg_config);
+ }
+
+ /* -D might point at config-only directory; if so find the real PGDATA */
+ adjust_data_dir();
+
+ /* Complain if -D needed and not provided */
+ if (pg_config == NULL &&
+ ctl_command != KILL_COMMAND && ctl_command != UNREGISTER_COMMAND)
+ {
+ write_stderr(_("%s: no database directory specified and environment variable PGDATA unset\n"),
+ progname);
+ do_advice();
+ exit(1);
+ }
+
+ if (ctl_command == RELOAD_COMMAND)
+ {
+ sig = SIGHUP;
+ do_wait = false;
+ }
+
+ if (pg_data)
+ {
+ snprintf(postopts_file, MAXPGPATH, "%s/postmaster.opts", pg_data);
+ snprintf(version_file, MAXPGPATH, "%s/PG_VERSION", pg_data);
+ snprintf(pid_file, MAXPGPATH, "%s/postmaster.pid", pg_data);
+ snprintf(backup_file, MAXPGPATH, "%s/backup_label", pg_data);
+
+ /*
+ * Set mask based on PGDATA permissions,
+ *
+ * Don't error here if the data directory cannot be stat'd. This is
+ * handled differently based on the command and we don't want to
+ * interfere with that logic.
+ */
+ if (GetDataDirectoryCreatePerm(pg_data))
+ umask(pg_mode_mask);
+ }
+
+ switch (ctl_command)
+ {
+ case INIT_COMMAND:
+ do_init();
+ break;
+ case STATUS_COMMAND:
+ do_status();
+ break;
+ case START_COMMAND:
+ do_start();
+ break;
+ case STOP_COMMAND:
+ do_stop();
+ break;
+ case RESTART_COMMAND:
+ do_restart();
+ break;
+ case RELOAD_COMMAND:
+ do_reload();
+ break;
+ case PROMOTE_COMMAND:
+ do_promote();
+ break;
+ case LOGROTATE_COMMAND:
+ do_logrotate();
+ break;
+ case KILL_COMMAND:
+ do_kill(killproc);
+ break;
+#ifdef WIN32
+ case REGISTER_COMMAND:
+ pgwin32_doRegister();
+ break;
+ case UNREGISTER_COMMAND:
+ pgwin32_doUnregister();
+ break;
+ case RUN_AS_SERVICE_COMMAND:
+ pgwin32_doRunAsService();
+ break;
+#endif
+ default:
+ break;
+ }
+
+ exit(0);
+}
diff --git a/src/bin/pg_ctl/po/cs.po b/src/bin/pg_ctl/po/cs.po
new file mode 100644
index 0000000..99183ab
--- /dev/null
+++ b/src/bin/pg_ctl/po/cs.po
@@ -0,0 +1,945 @@
+# Czech message translation file for pg_ctl
+# Copyright (C) 2012 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Tomas Vondra <tv@fuzzy.cz>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl-cs (PostgreSQL 9.3)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:14+0000\n"
+"PO-Revision-Date: 2021-09-16 09:07+0200\n"
+"Last-Translator: Tomas Vondra <tv@fuzzy.cz>\n"
+"Language-Team: Czech <info@cspug.cx>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "nelze identifikovat aktuální adresář: %m"
+
+#: ../../common/exec.c:156
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "neplatný binární soubor\"%s\""
+
+#: ../../common/exec.c:206
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "nelze číst binární soubor \"%s\""
+
+#: ../../common/exec.c:214
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "nelze najít soubor \"%s\" ke spuštění"
+
+#: ../../common/exec.c:270 ../../common/exec.c:309
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "nelze změnit adresář na \"%s\" : %m"
+
+#: ../../common/exec.c:287
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "nelze přečíst symbolický odkaz \"%s\": %m"
+
+#: ../../common/exec.c:410
+#, c-format
+msgid "pclose failed: %m"
+msgstr "volání pclose selhalo: %m"
+
+#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676
+msgid "out of memory"
+msgstr "nedostatek paměti"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#: ../../port/path.c:632 ../../port/path.c:670 ../../port/path.c:687
+#, c-format
+msgid "out of memory\n"
+msgstr "nedostatek paměti\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nelze duplikovat null pointer (interní chyba)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "příkaz není spustitelný"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "příkaz nenalezen"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "potomek skončil s návratovým kódem %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "potomek byl ukončen vyjímkou 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "potomek byl ukončen signálem %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "potomek skončil s nerozponaným stavem %d"
+
+#: ../../port/path.c:654
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "nelze získat aktuální pracovní adresář: %s\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: adresář \"%s\" neexistuje\n"
+
+#: pg_ctl.c:261
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: nelze otevřít adresář \"%s\": %s\n"
+
+#: pg_ctl.c:274
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: adresář \"%s\" není datový adresář databázového clusteru\n"
+
+#: pg_ctl.c:287
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: nelze otevřít PID soubor \"%s\": %s\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: PID soubor \"%s\" je prázdný\n"
+
+#: pg_ctl.c:299
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: neplatná data v PID souboru \"%s\"\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: nelze nastartovat server: %s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: nelze nastartovat server kvůli selhání setsid(): %s\n"
+
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: nelze otevřít logovací soubor \"%s\": %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: nelze nastartovat server: chybový kód %lu\n"
+
+#: pg_ctl.c:712
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: nelze nastavit limit pro core soubor; zakázáno hard limitem\n"
+
+#: pg_ctl.c:738
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: nelze číst soubor \"%s\"\n"
+
+#: pg_ctl.c:743
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: soubor s volbami \"%s\" musí mít přesně jednu řádku\n"
+
+#: pg_ctl.c:785 pg_ctl.c:975 pg_ctl.c:1071
+#, c-format
+msgid "%s: could not send stop signal (PID: %ld): %s\n"
+msgstr "%s: nelze poslat stop signál (PID: %ld): %s\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid ""
+"The program \"%s\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation.\n"
+msgstr ""
+"Program \"%s\" je vyžadován aplikací %s, ale nebyl nalezen ve stejném\n"
+"adresáři jako \"%s\".\n"
+"Zkontrolujte vaši instalaci.\n"
+
+#: pg_ctl.c:818
+#, c-format
+msgid ""
+"The program \"%s\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation.\n"
+msgstr ""
+"Program \"%s\" byl nalezen pomocí \"%s\",\n"
+"ale nebyl ve stejné verzi jako %s.\n"
+"Zkontrolujte vaši instalaci.\n"
+
+#: pg_ctl.c:851
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: inicializace databáze selhala\n"
+
+#: pg_ctl.c:866
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: další server možná běží; i tak zkouším start\n"
+
+#: pg_ctl.c:915
+msgid "waiting for server to start..."
+msgstr "čekám na start serveru ..."
+
+#: pg_ctl.c:920 pg_ctl.c:1025 pg_ctl.c:1117 pg_ctl.c:1247
+msgid " done\n"
+msgstr " hotovo\n"
+
+#: pg_ctl.c:921
+msgid "server started\n"
+msgstr "server spuštěn\n"
+
+#: pg_ctl.c:924 pg_ctl.c:930 pg_ctl.c:1252
+msgid " stopped waiting\n"
+msgstr " přestávám čekat\n"
+
+#: pg_ctl.c:925
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: server nenastartoval v časovém limitu\n"
+
+#: pg_ctl.c:931
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: nelze spustit server\n"
+"Zkontrolujte záznam v logu.\n"
+
+#: pg_ctl.c:939
+msgid "server starting\n"
+msgstr "server startuje\n"
+
+#: pg_ctl.c:960 pg_ctl.c:1047 pg_ctl.c:1138 pg_ctl.c:1177 pg_ctl.c:1276
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: PID soubor \"%s\" neexistuje\n"
+
+#: pg_ctl.c:961 pg_ctl.c:1049 pg_ctl.c:1139 pg_ctl.c:1178 pg_ctl.c:1277
+msgid "Is server running?\n"
+msgstr "Běží server?\n"
+
+#: pg_ctl.c:967
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n"
+msgstr "%s: nemohu zastavit server; postgres běží v single-user módu (PID: %ld)\n"
+
+#: pg_ctl.c:982
+msgid "server shutting down\n"
+msgstr "server se ukončuje\n"
+
+#: pg_ctl.c:997 pg_ctl.c:1086
+msgid ""
+"WARNING: online backup mode is active\n"
+"Shutdown will not complete until pg_stop_backup() is called.\n"
+"\n"
+msgstr ""
+"VAROVÁNÍ: online backup mód je aktivní\n"
+"Shutdown nebude ukončen dokud nebude zavolán pg_stop_backup().\n"
+"\n"
+
+#: pg_ctl.c:1001 pg_ctl.c:1090
+msgid "waiting for server to shut down..."
+msgstr "čekám na ukončení serveru ..."
+
+#: pg_ctl.c:1017 pg_ctl.c:1108
+msgid " failed\n"
+msgstr " selhalo\n"
+
+#: pg_ctl.c:1019 pg_ctl.c:1110
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: server se neukončuje\n"
+
+#: pg_ctl.c:1021 pg_ctl.c:1112
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"TIP: Volba \"-m fast\" okamžitě ukončí sezení namísto aby čekala\n"
+"na odpojení iniciované přímo session.\n"
+
+#: pg_ctl.c:1027 pg_ctl.c:1118
+msgid "server stopped\n"
+msgstr "server zastaven\n"
+
+#: pg_ctl.c:1050
+msgid "trying to start server anyway\n"
+msgstr "přesto zkouším server spustit\n"
+
+#: pg_ctl.c:1059
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n"
+msgstr "%s: nemohu restartovat server; postgres běží v single-user módu (PID: %ld)\n"
+
+#: pg_ctl.c:1062 pg_ctl.c:1148
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Prosím ukončete single-user postgres a zkuste to znovu.\n"
+
+#: pg_ctl.c:1122
+#, c-format
+msgid "%s: old server process (PID: %ld) seems to be gone\n"
+msgstr "%s: starý proces serveru (PID: %ld) zřejmě skončil\n"
+
+#: pg_ctl.c:1124
+msgid "starting server anyway\n"
+msgstr "přesto server spouštím\n"
+
+#: pg_ctl.c:1145
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgstr "%s: nemohu znovunačíst server; server běží v single-user módu (PID: %ld)\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgstr "%s: nelze poslat signál pro reload (PID: %ld): %s\n"
+
+#: pg_ctl.c:1159
+msgid "server signaled\n"
+msgstr "server obdržel signál\n"
+
+#: pg_ctl.c:1184
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n"
+msgstr "%s: nelze povýšit (promote) server; server běží v single-user módu (PID: %ld)\n"
+
+#: pg_ctl.c:1192
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: nelze povýšit (promote) server; server není ve standby módu\n"
+
+#: pg_ctl.c:1207
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: nelze vytvořit signální soubor pro povýšení (promote) \"%s\": %s\n"
+
+#: pg_ctl.c:1213
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: nelze zapsat do signálního souboru pro povýšení (promote) \"%s\": %s\n"
+
+#: pg_ctl.c:1221
+#, c-format
+msgid "%s: could not send promote signal (PID: %ld): %s\n"
+msgstr "%s: nelze poslat signál pro povýšení (promote, PID: %ld): %s\n"
+
+#: pg_ctl.c:1224
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: nelze odstranit signální soubor pro povýšení (promote) \"%s\": %s\n"
+
+#: pg_ctl.c:1234
+msgid "waiting for server to promote..."
+msgstr "čekám na promote serveru ..."
+
+#: pg_ctl.c:1248
+msgid "server promoted\n"
+msgstr "server je povyšován (promote)\n"
+
+#: pg_ctl.c:1253
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: server neprovedl promote v časovém intervalu\n"
+
+#: pg_ctl.c:1259
+msgid "server promoting\n"
+msgstr "server je povyšován (promote)\n"
+
+#: pg_ctl.c:1283
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n"
+msgstr "%s: nemohu odrotovat log soubor; server běží v single-user módu (PID: %ld)\n"
+
+#: pg_ctl.c:1293
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: nelze vytvořit signální soubor pro odrotování logu \"%s\": %s\n"
+
+#: pg_ctl.c:1299
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: nelze zapsat do signálního souboru pro odrotování logu \"%s\": %s\n"
+
+#: pg_ctl.c:1307
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %ld): %s\n"
+msgstr "%s: nelze poslat signál pro odrotování logu (PID: %ld): %s\n"
+
+#: pg_ctl.c:1310
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: nelze odstranit signální soubor pro odrotování logu \"%s\": %s\n"
+
+#: pg_ctl.c:1315
+msgid "server signaled to rotate log file\n"
+msgstr "server obdržel signál pro odrotování logu\n"
+
+#: pg_ctl.c:1362
+#, c-format
+msgid "%s: single-user server is running (PID: %ld)\n"
+msgstr "%s: server běží v single-user módu (PID: %ld)\n"
+
+#: pg_ctl.c:1376
+#, c-format
+msgid "%s: server is running (PID: %ld)\n"
+msgstr "%s: server běží (PID: %ld)\n"
+
+#: pg_ctl.c:1392
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: žádný server neběží\n"
+
+#: pg_ctl.c:1409
+#, c-format
+msgid "%s: could not send signal %d (PID: %ld): %s\n"
+msgstr "%s: nelze poslat signál pro reload %d (PID: %ld): %s\n"
+
+#: pg_ctl.c:1440
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: nelze najít vlastní spustitelný soubor\n"
+
+#: pg_ctl.c:1450
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: nelze najít spustitelný program postgres\n"
+
+#: pg_ctl.c:1520 pg_ctl.c:1554
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: nelze otevřít manažera služeb\n"
+
+#: pg_ctl.c:1526
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: služba \"%s\" je již registrována\n"
+
+#: pg_ctl.c:1537
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: nelze zaregistrovat službu \"%s\": chybový kód %lu\n"
+
+#: pg_ctl.c:1560
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: služba \"%s\" není registrována\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: nelze otevřít službu \"%s\": chybový kód %lu\n"
+
+#: pg_ctl.c:1576
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: nelze odregistrovat službu \"%s\": chybový kód %lu\n"
+
+#: pg_ctl.c:1663
+msgid "Waiting for server startup...\n"
+msgstr "Čekám na start serveru ...\n"
+
+#: pg_ctl.c:1666
+msgid "Timed out waiting for server startup\n"
+msgstr "Časový limit pro čekání na start serveru vypršel\n"
+
+#: pg_ctl.c:1670
+msgid "Server started and accepting connections\n"
+msgstr "Server nastartoval a přijímá spojení\n"
+
+#: pg_ctl.c:1725
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: nelze nastartovat službu \"%s\": chybový kód %lu\n"
+
+#: pg_ctl.c:1795
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: VAROVÁNÍ: na této platformě nelze vytvořit tajné tokeny\n"
+
+#: pg_ctl.c:1808
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: nelze otevřít token procesu: chybový kód %lu\n"
+
+#: pg_ctl.c:1822
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: nelze alokovat SIDs: chybový kód %lu\n"
+
+#: pg_ctl.c:1849
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: nelze vytvořit vyhrazený token: chybový kód %lu\n"
+
+#: pg_ctl.c:1880
+#, c-format
+msgid "%s: WARNING: could not locate all job object functions in system API\n"
+msgstr "%s: VAROVÁNÍ: v systémovém API nelze najít všechny \"job object\" funkce\n"
+
+#: pg_ctl.c:1977
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: nelze získat seznam LUID pro privilegia: chybový kód %lu\n"
+
+#: pg_ctl.c:1985 pg_ctl.c:2000
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: nelze získat informace o tokenu: chybový kód %lu\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: nedostatek paměti\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s je nástroj pro inicializaci, spuštění, zastavení, nebo ovládání PostgreSQL serveru.\n"
+"\n"
+
+#: pg_ctl.c:2033
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: pg_ctl.c:2034
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s init[db] [-D ADRESÁŘ] [-s] [-o PŘEPÍNAČE]\n"
+"\n"
+
+#: pg_ctl.c:2035
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D ADRESÁŘ] [-l SOUBOR] [-W] [-t SECS] [-s]\n"
+" [-o VOLBY] [-p CESTA] [-c]\n"
+
+#: pg_ctl.c:2037
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr ""
+" %s stop [-D ADRESÁŘ] [-m MÓD-UKONČENÍ] [-W] [-t SECS] [-s]\n"
+"\n"
+
+#: pg_ctl.c:2038
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D ADRESÁŘ] [-m MÓD-UKONČENÍ] [-W] [-t SECS] [-s]\n"
+" [-o VOLBY] [-c]\n"
+
+#: pg_ctl.c:2040
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D ADRESÁŘ] [-s]\n"
+
+#: pg_ctl.c:2041
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D ADRESÁŘ]\n"
+
+#: pg_ctl.c:2042
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D ADRESÁŘ] [-W] [-t SECS] [-s]\n"
+
+#: pg_ctl.c:2043
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D ADRESÁŘ] [-s]\n"
+
+#: pg_ctl.c:2044
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill NAZEVSIGNALU PID\n"
+
+#: pg_ctl.c:2046
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D ADRESÁŘ] [-N NÁZEVSLUŽBY] [-U UŽIVATEL] [-P HESLO]\n"
+" [-S MÓD-STARTU] [-e ZDROJ] [-W] [-t SECS] [-s] [-o VOLBY]\n"
+
+#: pg_ctl.c:2048
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N SERVICENAME]\n"
+
+#: pg_ctl.c:2051
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Společné přepínače:\n"
+
+#: pg_ctl.c:2052
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=ADRESÁŘ umístění úložiště databáze\n"
+
+#: pg_ctl.c:2054
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e SOURCE název zdroje pro logování při běhu jako služba\n"
+
+#: pg_ctl.c:2056
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent vypisuj jen chyby, žádné informativní zprávy\n"
+
+#: pg_ctl.c:2057
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SECS počet vteřin pro čekání při využití volby -w\n"
+
+#: pg_ctl.c:2058
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version vypsat informace o verzi, potom skončit\n"
+
+#: pg_ctl.c:2059
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait čekat na dokončení operace (výchozí)\n"
+
+#: pg_ctl.c:2060
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait nečekat na dokončení operace\n"
+
+#: pg_ctl.c:2061
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help vypsat tuto nápovědu, potom skončit\n"
+
+#: pg_ctl.c:2062
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Pokud je vynechán parametr -D, použije se proměnná prostředí PGDATA.\n"
+
+#: pg_ctl.c:2064
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Přepínače pro start nebo restart:\n"
+
+#: pg_ctl.c:2066
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files povolit postgresu vytvářet core soubory\n"
+
+#: pg_ctl.c:2068
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files nepoužitelné pro tuto platformu\n"
+
+#: pg_ctl.c:2070
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=SOUBOR zapisuj (nebo připoj na konec) log serveru do SOUBORU.\n"
+
+#: pg_ctl.c:2071
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=VOLBY přepínače, které budou předány postgresu\n"
+" (spustitelnému souboru PostgreSQL) či initdb\n"
+
+#: pg_ctl.c:2073
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p CESTA-K-POSTGRESU za normálních okolností není potřeba\n"
+
+#: pg_ctl.c:2074
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Přepínače pro start nebo restart:\n"
+
+#: pg_ctl.c:2075
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=MODE může být \"smart\", \"fast\", or \"immediate\"\n"
+
+#: pg_ctl.c:2077
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Módy ukončení jsou:\n"
+
+#: pg_ctl.c:2078
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart skonči potom, co se odpojí všichni klienti\n"
+
+#: pg_ctl.c:2079
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast skonči okamžitě, s korektním zastavením serveru (výchozí)\n"
+
+#: pg_ctl.c:2080
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr ""
+" immediate skonči bez kompletního zastavení; po restartu se provede\n"
+" obnova po pádu (crash recovery)\n"
+
+#: pg_ctl.c:2082
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Povolené signály pro \"kill\":\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Přepínače pro register nebo unregister:\n"
+
+#: pg_ctl.c:2087
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N SERVICENAME jméno služby, pod kterým registrovat PostgreSQL server\n"
+
+#: pg_ctl.c:2088
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P PASSWORD heslo k účtu pro registraci PostgreSQL serveru\n"
+
+#: pg_ctl.c:2089
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U USERNAME uživatelské jméno pro registraci PostgreSQL server\n"
+
+#: pg_ctl.c:2090
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S TYP-STARTU typ spuštění služby pro registraci PostgreSQL serveru\n"
+
+#: pg_ctl.c:2092
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Módy spuštění jsou:\n"
+
+#: pg_ctl.c:2093
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto spusť službu automaticky během startu systému (implicitní)\n"
+
+#: pg_ctl.c:2094
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand spusť službu na vyžádání\n"
+
+#: pg_ctl.c:2097
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Chyby hlašte na <%s>.\n"
+
+#: pg_ctl.c:2098
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: pg_ctl.c:2123
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: neplatný mód ukončení mode \"%s\"\n"
+
+#: pg_ctl.c:2152
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: neplatné jméno signálu \"%s\"\n"
+
+#: pg_ctl.c:2169
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: neplatný typ spuštění \"%s\"\n"
+
+#: pg_ctl.c:2224
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: nelze najít datový adresář pomocí příkazu \"%s\"\n"
+
+#: pg_ctl.c:2248
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: control file se zdá být poškozený\n"
+
+#: pg_ctl.c:2316
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: nemůže běžet pod uživatelem root\n"
+"Prosím přihlaste se jako (neprivilegovaný) uživatel, který bude vlastníkem\n"
+"serverového procesu (například pomocí příkazu \"su\").\n"
+
+#: pg_ctl.c:2400
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: -S nepoužitelné pro tuto platformu\n"
+
+#: pg_ctl.c:2437
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: příliš mnoho argumentů v příkazové řádce (první je \"%s\")\n"
+
+#: pg_ctl.c:2463
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: chýbějící parametr pro \"kill\" mód\n"
+
+#: pg_ctl.c:2481
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: neplatný mód operace \"%s\"\n"
+
+#: pg_ctl.c:2491
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: není specifikována operace\n"
+
+#: pg_ctl.c:2512
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: není zadán datový adresář a ani není nastavena proměnná prostředí PGDATA\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "nelze číst symbolický link \"%s\""
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "potomek byl ukončen signálem %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: -w option is not supported when starting a pre-9.1 server\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s: -w volba není podporována při startu pre-9.1 serveru\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: -w option cannot use a relative socket directory specification\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s: -w volba nemůže používat relativně zadaný adresář socketu\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: this data directory appears to be running a pre-existing postmaster\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s: zdá se že v tomto datovém adresáři již běží existující postmaster\n"
+
+#~ msgid "server is still starting up\n"
+#~ msgstr "server stále startuje\n"
+
+#~ msgid "%s: could not wait for server because of misconfiguration\n"
+#~ msgstr "%s: nelze čekat na server kvůli chybné konfiguraci\n"
+
+#~ msgid " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n"
+#~ msgstr " %s start [-w] [-t SECS] [-D ADRESÁŘ] [-s] [-l SOUBOR] [-o \"PŘEPÍNAČE\"]\n"
+
+#~ msgid ""
+#~ "(The default is to wait for shutdown, but not for start or restart.)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "(Implicitní chování je čekat na ukončení, ale ne při startu nebo restartu.)\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Options for stop, restart, or promote:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Přepínače pro zastavení, restart a promote:\n"
+
+#~ msgid " smart promote after performing a checkpoint\n"
+#~ msgstr " smart promote po provedení checkpointu\n"
+
+#~ msgid " fast promote quickly without waiting for checkpoint completion\n"
+#~ msgstr " fast promote rychlé bez čekání na dokončení checkpointu\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
diff --git a/src/bin/pg_ctl/po/de.po b/src/bin/pg_ctl/po/de.po
new file mode 100644
index 0000000..8a136f7
--- /dev/null
+++ b/src/bin/pg_ctl/po/de.po
@@ -0,0 +1,863 @@
+# German message translation file for pg_ctl
+# Peter Eisentraut <peter@eisentraut.org>, 2004 - 2022.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-06 07:48+0000\n"
+"PO-Revision-Date: 2022-05-06 10:55+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "konnte aktuelles Verzeichnis nicht ermitteln: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "ungültige Programmdatei »%s«"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "konnte Programmdatei »%s« nicht lesen"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "konnte kein »%s« zum Ausführen finden"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "konnte nicht in Verzeichnis »%s« wechseln: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() fehlgeschlagen: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "Speicher aufgebraucht"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "Befehl ist nicht ausführbar"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "Befehl nicht gefunden"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "Kindprozess hat mit Code %d beendet"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "Kindprozess wurde durch Ausnahme 0x%X beendet"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "Kindprozess wurde von Signal %d beendet: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "Kindprozess hat mit unbekanntem Status %d beendet"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "konnte aktuelles Arbeitsverzeichnis nicht ermitteln: %s\n"
+
+#: pg_ctl.c:260
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: Verzeichnis »%s« existiert nicht\n"
+
+#: pg_ctl.c:263
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: konnte nicht auf Verzeichnis »%s« zugreifen: %s\n"
+
+#: pg_ctl.c:276
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: Verzeichnis »%s« ist kein Datenbankclusterverzeichnis\n"
+
+#: pg_ctl.c:289
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: konnte PID-Datei »%s« nicht öffnen: %s\n"
+
+#: pg_ctl.c:298
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: die PID-Datei »%s« ist leer\n"
+
+#: pg_ctl.c:301
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: ungültige Daten in PID-Datei »%s«\n"
+
+#: pg_ctl.c:464 pg_ctl.c:506
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: konnte Server nicht starten: %s\n"
+
+#: pg_ctl.c:484
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: konnte Server wegen setsid()-Fehler nicht starten: %s\n"
+
+#: pg_ctl.c:554
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: konnte Logdatei »%s« nicht öffnen: %s\n"
+
+#: pg_ctl.c:571
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: konnte Server nicht starten: Fehlercode %lu\n"
+
+#: pg_ctl.c:788
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: kann Grenzwert für Core-Datei-Größe nicht setzen; durch harten Grenzwert verboten\n"
+
+#: pg_ctl.c:814
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: konnte Datei »%s« nicht lesen\n"
+
+#: pg_ctl.c:819
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: Optionsdatei »%s« muss genau eine Zeile haben\n"
+
+#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112
+#, c-format
+msgid "%s: could not send stop signal (PID: %ld): %s\n"
+msgstr "%s: konnte Stopp-Signal nicht senden (PID: %ld): %s\n"
+
+#: pg_ctl.c:889
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden\n"
+
+#: pg_ctl.c:892
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s\n"
+
+#: pg_ctl.c:923
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: Initialisierung des Datenbanksystems fehlgeschlagen\n"
+
+#: pg_ctl.c:938
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: ein anderer Server läuft möglicherweise; versuche trotzdem zu starten\n"
+
+#: pg_ctl.c:986
+msgid "waiting for server to start..."
+msgstr "warte auf Start des Servers..."
+
+#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243
+msgid " done\n"
+msgstr " fertig\n"
+
+#: pg_ctl.c:992
+msgid "server started\n"
+msgstr "Server gestartet\n"
+
+#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248
+msgid " stopped waiting\n"
+msgstr " Warten beendet\n"
+
+#: pg_ctl.c:996
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: Starten des Servers hat nicht rechtzeitig abgeschlossen\n"
+
+#: pg_ctl.c:1002
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: konnte Server nicht starten\n"
+"Prüfen Sie die Logausgabe.\n"
+
+#: pg_ctl.c:1010
+msgid "server starting\n"
+msgstr "Server startet\n"
+
+#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: PID-Datei »%s« existiert nicht\n"
+
+#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273
+msgid "Is server running?\n"
+msgstr "Läuft der Server?\n"
+
+#: pg_ctl.c:1036
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n"
+msgstr "%s: kann Server nicht anhalten; Einzelbenutzerserver läuft (PID: %ld)\n"
+
+#: pg_ctl.c:1051
+msgid "server shutting down\n"
+msgstr "Server fährt herunter\n"
+
+#: pg_ctl.c:1056 pg_ctl.c:1117
+msgid "waiting for server to shut down..."
+msgstr "warte auf Herunterfahren des Servers..."
+
+#: pg_ctl.c:1060 pg_ctl.c:1122
+msgid " failed\n"
+msgstr " Fehler\n"
+
+#: pg_ctl.c:1062 pg_ctl.c:1124
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: Server fährt nicht herunter\n"
+
+#: pg_ctl.c:1064 pg_ctl.c:1126
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"TIPP: Die Option »-m fast« beendet Sitzungen sofort, statt auf das Beenden\n"
+"durch die Sitzungen selbst zu warten.\n"
+
+#: pg_ctl.c:1070 pg_ctl.c:1132
+msgid "server stopped\n"
+msgstr "Server angehalten\n"
+
+#: pg_ctl.c:1091
+msgid "trying to start server anyway\n"
+msgstr "versuche Server trotzdem zu starten\n"
+
+#: pg_ctl.c:1100
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n"
+msgstr "%s: kann Server nicht neu starten; Einzelbenutzerserver läuft (PID: %ld)\n"
+
+#: pg_ctl.c:1103 pg_ctl.c:1162
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Bitte beenden Sie den Einzelbenutzerserver und versuchen Sie es noch einmal.\n"
+
+#: pg_ctl.c:1136
+#, c-format
+msgid "%s: old server process (PID: %ld) seems to be gone\n"
+msgstr "%s: alter Serverprozess (PID: %ld) scheint verschwunden zu sein\n"
+
+#: pg_ctl.c:1138
+msgid "starting server anyway\n"
+msgstr "starte Server trotzdem\n"
+
+#: pg_ctl.c:1159
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgstr "%s: kann Server nicht neu laden; Einzelbenutzerserver läuft (PID: %ld)\n"
+
+#: pg_ctl.c:1168
+#, c-format
+msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgstr "%s: konnte Signal zum Neuladen nicht senden (PID: %ld): %s\n"
+
+#: pg_ctl.c:1173
+msgid "server signaled\n"
+msgstr "Signal an Server gesendet\n"
+
+#: pg_ctl.c:1198
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n"
+msgstr "%s: kann Server nicht befördern; Einzelbenutzerserver läuft (PID: %ld)\n"
+
+#: pg_ctl.c:1206
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: kann Server nicht befördern; Server ist nicht im Standby-Modus\n"
+
+#: pg_ctl.c:1216
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: konnte Signaldatei zum Befördern »%s« nicht erzeugen: %s\n"
+
+#: pg_ctl.c:1222
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: konnte Signaldatei zum Befördern »%s« nicht schreiben: %s\n"
+
+#: pg_ctl.c:1230
+#, c-format
+msgid "%s: could not send promote signal (PID: %ld): %s\n"
+msgstr "%s: konnte Signal zum Befördern nicht senden (PID: %ld): %s\n"
+
+#: pg_ctl.c:1233
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: konnte Signaldatei zum Befördern »%s« nicht entfernen: %s\n"
+
+#: pg_ctl.c:1240
+msgid "waiting for server to promote..."
+msgstr "warte auf Befördern des Servers..."
+
+#: pg_ctl.c:1244
+msgid "server promoted\n"
+msgstr "Server wurde befördert\n"
+
+#: pg_ctl.c:1249
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: Befördern des Servers hat nicht rechtzeitig abgeschlossen\n"
+
+#: pg_ctl.c:1255
+msgid "server promoting\n"
+msgstr "Server wird befördert\n"
+
+#: pg_ctl.c:1279
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n"
+msgstr "%s: kann Logdatei nicht rotieren; Einzelbenutzerserver läuft (PID: %ld)\n"
+
+#: pg_ctl.c:1289
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: konnte Signaldatei zum Logrotieren »%s« nicht erzeugen: %s\n"
+
+#: pg_ctl.c:1295
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: konnte Signaldatei zum Logrotieren »%s« nicht schreiben: %s\n"
+
+#: pg_ctl.c:1303
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %ld): %s\n"
+msgstr "%s: konnte Signal zum Logrotieren nicht senden (PID: %ld): %s\n"
+
+#: pg_ctl.c:1306
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: konnte Signaldatei zum Logrotieren »%s« nicht entfernen: %s\n"
+
+#: pg_ctl.c:1311
+msgid "server signaled to rotate log file\n"
+msgstr "Signal zum Logrotieren an Server gesendet\n"
+
+#: pg_ctl.c:1358
+#, c-format
+msgid "%s: single-user server is running (PID: %ld)\n"
+msgstr "%s: Einzelbenutzerserver läuft (PID: %ld)\n"
+
+#: pg_ctl.c:1372
+#, c-format
+msgid "%s: server is running (PID: %ld)\n"
+msgstr "%s: Server läuft (PID: %ld)\n"
+
+#: pg_ctl.c:1388
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: kein Server läuft\n"
+
+#: pg_ctl.c:1405
+#, c-format
+msgid "%s: could not send signal %d (PID: %ld): %s\n"
+msgstr "%s: konnte Signal %d nicht senden (PID: %ld): %s\n"
+
+#: pg_ctl.c:1436
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: konnte eigene Programmdatei nicht finden\n"
+
+#: pg_ctl.c:1446
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: konnte »postgres« Programmdatei nicht finden\n"
+
+#: pg_ctl.c:1516 pg_ctl.c:1550
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: konnte Servicemanager nicht öffnen\n"
+
+#: pg_ctl.c:1522
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: Systemdienst »%s« ist bereits registriert\n"
+
+#: pg_ctl.c:1533
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: konnte Systemdienst »%s« nicht registrieren: Fehlercode %lu\n"
+
+#: pg_ctl.c:1556
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: Systemdienst »%s« ist nicht registriert\n"
+
+#: pg_ctl.c:1563
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: konnte Systemdienst »%s« nicht öffnen: Fehlercode %lu\n"
+
+#: pg_ctl.c:1572
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: konnte Systemdienst »%s« nicht deregistrieren: Fehlercode %lu\n"
+
+#: pg_ctl.c:1659
+msgid "Waiting for server startup...\n"
+msgstr "Warte auf Start des Servers...\n"
+
+#: pg_ctl.c:1662
+msgid "Timed out waiting for server startup\n"
+msgstr "Zeitüberschreitung beim Warten auf Start des Servers\n"
+
+#: pg_ctl.c:1666
+msgid "Server started and accepting connections\n"
+msgstr "Server wurde gestartet und nimmt Verbindungen an\n"
+
+#: pg_ctl.c:1721
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: konnte Systemdienst »%s« nicht starten: Fehlercode %lu\n"
+
+#: pg_ctl.c:1824
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: WARNUNG: auf dieser Plattform können keine beschränkten Token erzeugt werden\n"
+
+#: pg_ctl.c:1837
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: konnte Prozess-Token nicht öffnen: Fehlercode %lu\n"
+
+#: pg_ctl.c:1851
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: konnte SIDs nicht erzeugen: Fehlercode %lu\n"
+
+#: pg_ctl.c:1878
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: konnte beschränktes Token nicht erzeugen: Fehlercode %lu\n"
+
+#: pg_ctl.c:1909
+#, c-format
+msgid "%s: WARNING: could not locate all job object functions in system API\n"
+msgstr "%s: WARNUNG: konnte nicht alle Job-Objekt-Funtionen in der System-API finden\n"
+
+#: pg_ctl.c:2006
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: konnte LUIDs für Privilegien nicht ermitteln: Fehlercode %lu\n"
+
+#: pg_ctl.c:2014 pg_ctl.c:2029
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: konnte Token-Informationen nicht ermitteln: Fehlercode %lu\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: Speicher aufgebraucht\n"
+
+#: pg_ctl.c:2053
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n"
+
+#: pg_ctl.c:2061
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s ist ein Hilfsprogramm, um einen PostgreSQL-Server zu initialisieren, zu\n"
+"starten, anzuhalten oder zu steuern.\n"
+"\n"
+
+#: pg_ctl.c:2062
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_ctl.c:2063
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D DATENVERZ] [-s] [-o OPTIONEN]\n"
+
+#: pg_ctl.c:2064
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D DATENVERZ] [-l DATEINAME] [-W] [-t SEK] [-s]\n"
+" [-o OPTIONEN] [-p PFAD] [-c]\n"
+
+#: pg_ctl.c:2066
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D DATENVERZ] [-m SHUTDOWN-MODUS] [-W] [-t SEK] [-s]\n"
+
+#: pg_ctl.c:2067
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D DATENVERZ] [-m SHUTDOWN-MODUS] [-W] [-t SEK] [-s]\n"
+" [-o OPTIONEN] [-c]\n"
+
+#: pg_ctl.c:2069
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D DATENVERZ] [-s]\n"
+
+#: pg_ctl.c:2070
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DATENVERZ]\n"
+
+#: pg_ctl.c:2071
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D DATENVERZ] [-W] [-t SEK] [-s]\n"
+
+#: pg_ctl.c:2072
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DATENVERZ] [-s]\n"
+
+#: pg_ctl.c:2073
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill SIGNALNAME PID\n"
+
+#: pg_ctl.c:2075
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D DATENVERZ] [-N DIENSTNAME] [-U BENUTZERNAME] [-P PASSWORT]\n"
+" [-S STARTTYP] [-e QUELLE] [-W] [-t SEK] [-s] [-o OPTIONEN]\n"
+
+#: pg_ctl.c:2077
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N DIENSTNAME]\n"
+
+#: pg_ctl.c:2080
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Optionen für alle Modi:\n"
+
+#: pg_ctl.c:2081
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=DATENVERZ Datenbankverzeichnis\n"
+
+#: pg_ctl.c:2083
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr ""
+" -e QUELLE Ereignisquelle fürs Loggen, wenn als Systemdienst\n"
+" gestartet\n"
+
+#: pg_ctl.c:2085
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent nur Fehler zeigen, keine Informationsmeldungen\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SEK Sekunden zu warten bei Option -w\n"
+
+#: pg_ctl.c:2087
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_ctl.c:2088
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait warten bis Operation abgeschlossen ist (Voreinstellung)\n"
+
+#: pg_ctl.c:2089
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait nicht warten bis Operation abgeschlossen ist\n"
+
+#: pg_ctl.c:2090
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_ctl.c:2091
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr ""
+"Wenn die Option -D weggelassen wird, dann wird die Umgebungsvariable\n"
+"PGDATA verwendet.\n"
+
+#: pg_ctl.c:2093
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Optionen für Start oder Neustart:\n"
+
+#: pg_ctl.c:2095
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files erlaubt postgres Core-Dateien zu erzeugen\n"
+
+#: pg_ctl.c:2097
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files betrifft diese Plattform nicht\n"
+
+#: pg_ctl.c:2099
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr ""
+" -l, --log=DATEINAME Serverlog in DATEINAME schreiben (wird an bestehende\n"
+" Datei angehängt)\n"
+
+#: pg_ctl.c:2100
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPTIONEN Kommandozeilenoptionen für postgres (PostgreSQL-\n"
+" Serverprogramm) oder initdb\n"
+
+#: pg_ctl.c:2102
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p PFAD-ZU-POSTGRES normalerweise nicht notwendig\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Optionen für Anhalten oder Neustart:\n"
+
+#: pg_ctl.c:2104
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=MODUS MODUS kann »smart«, »fast« oder »immediate« sein\n"
+
+#: pg_ctl.c:2106
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Shutdown-Modi sind:\n"
+
+#: pg_ctl.c:2107
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart beenden nachdem alle Clientverbindungen geschlossen sind\n"
+
+#: pg_ctl.c:2108
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast sofort beenden, mit richtigem Shutdown (Voreinstellung)\n"
+
+#: pg_ctl.c:2109
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr ""
+" immediate beenden ohne vollständigen Shutdown; führt zu Recovery-Lauf\n"
+" beim Neustart\n"
+
+#: pg_ctl.c:2111
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Erlaubte Signalnamen für »kill«:\n"
+
+#: pg_ctl.c:2115
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Optionen für »register« und »unregister«:\n"
+
+#: pg_ctl.c:2116
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N DIENSTNAME Systemdienstname für Registrierung des PostgreSQL-Servers\n"
+
+#: pg_ctl.c:2117
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P PASSWORD Passwort des Benutzers für Registrierung des PostgreSQL-Servers\n"
+
+#: pg_ctl.c:2118
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U USERNAME Benutzername für Registrierung des PostgreSQL-Servers\n"
+
+#: pg_ctl.c:2119
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S STARTTYP Systemdienst-Starttyp für PostgreSQL-Server\n"
+
+#: pg_ctl.c:2121
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Starttypen sind:\n"
+
+#: pg_ctl.c:2122
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr ""
+" auto Dienst automatisch starten beim Start des Betriebssystems\n"
+" (Voreinstellung)\n"
+
+#: pg_ctl.c:2123
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand Dienst bei Bedarf starten\n"
+
+#: pg_ctl.c:2126
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: pg_ctl.c:2127
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_ctl.c:2152
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: unbekannter Shutdown-Modus »%s«\n"
+
+#: pg_ctl.c:2181
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: unbekannter Signalname »%s«\n"
+
+#: pg_ctl.c:2198
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: unbekannter Starttyp »%s«\n"
+
+#: pg_ctl.c:2253
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: konnte das Datenverzeichnis mit Befehl »%s« nicht ermitteln\n"
+
+#: pg_ctl.c:2277
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: Kontrolldatei scheint kaputt zu sein\n"
+
+#: pg_ctl.c:2345
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: kann nicht als root ausgeführt werden\n"
+"Bitte loggen Sie sich (z.B. mit »su«) als der (unprivilegierte) Benutzer\n"
+"ein, der Eigentümer des Serverprozesses sein soll.\n"
+
+#: pg_ctl.c:2428
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: Option -S wird auf dieser Plattform nicht unterstützt\n"
+
+#: pg_ctl.c:2465
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: zu viele Kommandozeilenargumente (das erste ist »%s«)\n"
+
+#: pg_ctl.c:2491
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: fehlende Argumente für »kill«-Modus\n"
+
+#: pg_ctl.c:2509
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: unbekannter Operationsmodus »%s«\n"
+
+#: pg_ctl.c:2519
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: keine Operation angegeben\n"
+
+#: pg_ctl.c:2540
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: kein Datenbankverzeichnis angegeben und Umgebungsvariable PGDATA nicht gesetzt\n"
diff --git a/src/bin/pg_ctl/po/el.po b/src/bin/pg_ctl/po/el.po
new file mode 100644
index 0000000..98c84f4
--- /dev/null
+++ b/src/bin/pg_ctl/po/el.po
@@ -0,0 +1,889 @@
+# Greek message translation file for pg_ctl
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_ctl (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-14 09:17+0000\n"
+"PO-Revision-Date: 2023-04-14 13:15+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "δεν ήταν δυνατή η αναγνώριση του τρέχοντος καταλόγου: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "μη έγκυρο δυαδικό αρχείο «%s»"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "δεν ήταν δυνατή η ανάγνωση του δυαδικού αρχείου «%s»"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "δεν βρέθηκε το αρχείο «%s» για να εκτελεστεί"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου «%s»: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() απέτυχε: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "έλλειψη μνήμης"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "έλλειψη μνήμης\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "δεν ήταν δυνατή η αντιγραφή δείκτη null (εσωτερικό σφάλμα)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "εντολή μη εκτελέσιμη"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "εντολή δεν βρέθηκε"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "απόγονος διεργασίας τερμάτισε με κωδικό εξόδου %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "απόγονος διεργασίας τερματίστηκε με εξαίρεση 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "απόγονος διεργασίας τερματίστηκε με σήμα %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "απόγονος διεργασίας τερμάτισε με μη αναγνωρίσιμη κατάσταση %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "δεν ήταν δυνατή η επεξεργασία του τρέχοντος καταλόγου εργασίας: %s\n"
+
+#: pg_ctl.c:260
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: ο κατάλογος «%s» δεν υπάρχει\n"
+
+#: pg_ctl.c:263
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατή η πρόσβαση στον κατάλογο «%s»: %s\n"
+
+#: pg_ctl.c:276
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: ο κατάλογος «%s» δεν είναι κατάλογος συστάδας βάσης δεδομένων\n"
+
+#: pg_ctl.c:289
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατό το άνοιγμα αρχείου PID «%s»: %s\n"
+
+#: pg_ctl.c:298
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: το αρχείο PID «%s» είναι άδειο\n"
+
+#: pg_ctl.c:301
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: μη έγκυρα δεδομένα στο αρχείο PID «%s»\n"
+
+#: pg_ctl.c:464 pg_ctl.c:506
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: δεν μπόρεσε να εκκινήσει τον διακομιστή: %s\n"
+
+#: pg_ctl.c:484
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: δεν ήταν δυνατή η εκκίνηση του διακομιστή λόγω αποτυχίας του setsid(): %s\n"
+
+#: pg_ctl.c:554
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατό το άνοιγμα του αρχείου καταγραφής «%s»: %s\n"
+
+#: pg_ctl.c:571
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: δεν ήταν δυνατή η εκκίνηση διακομιστή: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:788
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: δεν είναι δυνατός ο ορισμός ορίου μεγέθους αρχείου πυρήνα· απαγορεύεται από το σκληρό όριο\n"
+
+#: pg_ctl.c:814
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: δεν ήταν δυνατή η ανάγνωση αρχείου «%s»\n"
+
+#: pg_ctl.c:819
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: το αρχείο επιλογής «%s» πρέπει να έχει ακριβώς μία γραμμή\n"
+
+#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112
+#, c-format
+msgid "%s: could not send stop signal (PID: %ld): %s\n"
+msgstr "%s: δεν ήταν δυνατή η αποστολή σήματος διακοπής (PID: %ld): %s\n"
+
+#: pg_ctl.c:889
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "Το πρόγραμμα «%s» απαιτείται από %s αλλά δεν βρέθηκε στον ίδιο κατάλογο με το «%s».\n"
+
+#: pg_ctl.c:892
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "το πρόγραμμα «%s» βρέθηκε από το «%s» αλλά δεν ήταν η ίδια έκδοση με το %s\n"
+
+#: pg_ctl.c:923
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: αρχικοποίηση του συστήματος βάσης δεδομένων απέτυχε\n"
+
+#: pg_ctl.c:938
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: ενδέχεται να εκτελείται ένας άλλος διακομιστής· γίνεται προσπάθεια εκκίνησης του διακομιστή ούτως ή άλλως\n"
+
+#: pg_ctl.c:986
+msgid "waiting for server to start..."
+msgstr "αναμονή για την εκκίνηση του διακομιστή..."
+
+#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243
+msgid " done\n"
+msgstr " ολοκλήρωση\n"
+
+#: pg_ctl.c:992
+msgid "server started\n"
+msgstr "ο διακομιστής ξεκίνησε\n"
+
+#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248
+msgid " stopped waiting\n"
+msgstr " διακοπή αναμονής\n"
+
+#: pg_ctl.c:996
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: ο διακομιστής δεν ξεκίνησε εγκαίρως\n"
+
+#: pg_ctl.c:1002
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: δεν ήταν δυνατή η εκκίνηση του διακομιστή\n"
+"Εξετάστε την έξοδο του αρχείου καταγραφής.\n"
+
+#: pg_ctl.c:1010
+msgid "server starting\n"
+msgstr "εκκίνηση διακομιστή\n"
+
+#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: το αρχείο PID «%s» δεν υπάρχει\n"
+
+#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273
+msgid "Is server running?\n"
+msgstr "Εκτελείται ο διακομιστής;\n"
+
+#: pg_ctl.c:1036
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n"
+msgstr "%s: δεν είναι δυνατή η διακοπή του διακομιστή· εκτελείται διακομιστής μοναδικού-χρήστη (PID: %ld)\n"
+
+#: pg_ctl.c:1051
+msgid "server shutting down\n"
+msgstr "τερματισμός λειτουργίας διακομιστή\n"
+
+#: pg_ctl.c:1056 pg_ctl.c:1117
+msgid "waiting for server to shut down..."
+msgstr "αναμονή για τερματισμό λειτουργίας του διακομιστή..."
+
+#: pg_ctl.c:1060 pg_ctl.c:1122
+msgid " failed\n"
+msgstr " απέτυχε.\n"
+
+#: pg_ctl.c:1062 pg_ctl.c:1124
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: ο διακομιστής δεν τερματίζεται\n"
+
+#: pg_ctl.c:1064 pg_ctl.c:1126
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"HINT: Η επιλογή \"-m fast\" αποσυνδέει αμέσως τις συνεδρίες αντί\n"
+"να αναμένει για εκ’ συνεδρίας εκκινούμενη αποσύνδεση.\n"
+
+#: pg_ctl.c:1070 pg_ctl.c:1132
+msgid "server stopped\n"
+msgstr "ο διακομιστής διακόπηκε\n"
+
+#: pg_ctl.c:1091
+msgid "trying to start server anyway\n"
+msgstr "προσπάθεια εκκίνησης του διακομιστή ούτως ή άλλως\n"
+
+#: pg_ctl.c:1100
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n"
+msgstr "%s: δεν είναι δυνατή η επανεκκίνηση του διακομιστή· εκτελείται διακομιστής μοναδικού-χρήστη (PID: %ld)\n"
+
+#: pg_ctl.c:1103 pg_ctl.c:1162
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Τερματίστε το διακομιστή μοναδικού-χρήστη και προσπαθήστε ξανά.\n"
+
+#: pg_ctl.c:1136
+#, c-format
+msgid "%s: old server process (PID: %ld) seems to be gone\n"
+msgstr "%s: παλεά διαδικασία διακομιστή (PID: %ld) φαίνεται να έχει χαθεί\n"
+
+#: pg_ctl.c:1138
+msgid "starting server anyway\n"
+msgstr "εκκίνηση του διακομιστή ούτως ή άλλως\n"
+
+#: pg_ctl.c:1159
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgstr "%s: δεν είναι δυνατή η επαναφόρτωση του διακομιστή· εκτελείται διακομιστής μοναδικού-χρήστη (PID: %ld)\n"
+
+#: pg_ctl.c:1168
+#, c-format
+msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgstr "%s: δεν ήταν δυνατή η αποστολή σήματος επαναφόρτωσης (PID: %ld): %s\n"
+
+#: pg_ctl.c:1173
+msgid "server signaled\n"
+msgstr "στάλθηκε σήμα στον διακομιστή\n"
+
+#: pg_ctl.c:1198
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n"
+msgstr "%s: δεν είναι δυνατή η προβίβαση του διακομιστή· εκτελείται διακομιστής μοναδικού-χρήστη (PID: %ld)\n"
+
+#: pg_ctl.c:1206
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: δεν είναι δυνατή η προβίβαση του διακομιστή· ο διακομιστής δεν βρίσκεται σε κατάσταση αναμονής\n"
+
+#: pg_ctl.c:1216
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατή η δημιουργία του αρχείου σήματος προβιβασμού «%s»: %s\n"
+
+#: pg_ctl.c:1222
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατή η εγγραφή του αρχείου σήματος προβιβασμού «%s»: %s\n"
+
+#: pg_ctl.c:1230
+#, c-format
+msgid "%s: could not send promote signal (PID: %ld): %s\n"
+msgstr "%s: δεν ήταν δυνατή η αποστολή σήματος προβιβασμού (PID: %ld): %s\n"
+
+#: pg_ctl.c:1233
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατή η κατάργηση του αρχείου σήματος προβιβασμού «%s»: %s\n"
+
+#: pg_ctl.c:1240
+msgid "waiting for server to promote..."
+msgstr "αναμονή για την προβίβαση του διακομιστή..."
+
+#: pg_ctl.c:1244
+msgid "server promoted\n"
+msgstr "ο διακομιστής προβιβάστηκε\n"
+
+#: pg_ctl.c:1249
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: ο διακομιστής δεν προβιβάστηκε εγκαίρως\n"
+
+#: pg_ctl.c:1255
+msgid "server promoting\n"
+msgstr "προβίβαση διακομιστή\n"
+
+#: pg_ctl.c:1279
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n"
+msgstr "%s: δεν είναι δυνατή η περιστροφή του αρχείου καταγραφής· εκτελείται διακομιστής μοναδικού-χρήστη (PID: %ld)\n"
+
+#: pg_ctl.c:1289
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατή η δημιουργία αρχείου σήματος περιστροφής αρχείου καταγραφής «%s»: %s\n"
+
+#: pg_ctl.c:1295
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατή η εγγραφή του αρχείου σήματος περιστροφής αρχείου καταγραφής «%s»: %s\n"
+
+#: pg_ctl.c:1303
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %ld): %s\n"
+msgstr "%s: δεν ήταν δυνατή η αποστολή σήματος περιστροφής αρχείου καταγραφής (PID: %ld): %s\n"
+
+#: pg_ctl.c:1306
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατή η κατάργηση του αρχείου σήματος περιστροφής αρχείου καταγραφής «%s»: %s\n"
+
+#: pg_ctl.c:1311
+msgid "server signaled to rotate log file\n"
+msgstr "ο διακομιστής έλαβε σήμα για την περιστροφή του αρχείου καταγραφής\n"
+
+#: pg_ctl.c:1358
+#, c-format
+msgid "%s: single-user server is running (PID: %ld)\n"
+msgstr "%s: εκτελείται διακομιστής μοναδικού-χρήστη (PID: %ld)\n"
+
+#: pg_ctl.c:1372
+#, c-format
+msgid "%s: server is running (PID: %ld)\n"
+msgstr "%s: εκτελείται διακομιστής (PID: %ld)\n"
+
+#: pg_ctl.c:1388
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: δεν εκτελείται κανένας διακομιστής\n"
+
+#: pg_ctl.c:1405
+#, c-format
+msgid "%s: could not send signal %d (PID: %ld): %s\n"
+msgstr "%s: δεν ήταν δυνατή η αποστολή %d σήματος (PID: %ld): %s\n"
+
+#: pg_ctl.c:1436
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: δεν ήταν δυνατή η εύρεση του ιδίου εκτελέσιμου προγράμματος\n"
+
+#: pg_ctl.c:1446
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: δεν ήταν δυνατή η εύρεση του εκτελέσιμου προγράμματος postgres\n"
+
+#: pg_ctl.c:1516 pg_ctl.c:1550
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: δεν ήταν δυνατό το άνοιγμα του διαχειριστή υπηρεσιών\n"
+
+#: pg_ctl.c:1522
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: η υπηρεσία «%s» έχει ήδη καταχωρηθεί\n"
+
+#: pg_ctl.c:1533
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: δεν ήταν δυνατή η καταχώρηση της υπηρεσίας «%s»: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:1556
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: η υπηρεσία «%s» δεν έχει καταχωρηθεί\n"
+
+#: pg_ctl.c:1563
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: δεν ήταν δυνατό το άνοιγμα της υπηρεσίας «%s»: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:1572
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: δεν ήταν δυνατή η διαγραφή καταχώρησης της υπηρεσίας «%s»: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:1659
+msgid "Waiting for server startup...\n"
+msgstr "Αναμονή για εκκίνηση διακομιστή...\n"
+
+#: pg_ctl.c:1662
+msgid "Timed out waiting for server startup\n"
+msgstr "Λήξη χρονικού ορίου αναμονής για εκκίνηση διακομιστή\n"
+
+#: pg_ctl.c:1666
+msgid "Server started and accepting connections\n"
+msgstr "Ο διακομιστής ξεκίνησε και αποδέχτηκε συνδέσεις\n"
+
+#: pg_ctl.c:1721
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: δεν ήταν δυνατή η εκκίνηση της υπηρεσίας «%s»: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:1824
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: WARNING: δεν είναι δυνατή η δημιουργία περιορισμένων διακριτικών σε αυτήν την πλατφόρμα\n"
+
+#: pg_ctl.c:1837
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: δεν ήταν δυνατό το άνοιγμα διακριτικού διεργασίας: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:1851
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: δεν ήταν δυνατή η εκχώρηση SIDs: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:1878
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: δεν ήταν δυνατή η δημιουργία περιορισμένου διακριτικού: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:1909
+#, c-format
+msgid "%s: WARNING: could not locate all job object functions in system API\n"
+msgstr "%s: WARNING: δεν ήταν δυνατός ο εντοπισμός όλων των λειτουργιών αντικειμένου εργασίας στο API συστήματος\n"
+
+#: pg_ctl.c:2006
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: δεν ήταν δυνατή η ανάκτηση LUIDs για δικαιώματα: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:2014 pg_ctl.c:2029
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: δεν ήταν δυνατή η ανάκτηση πληροφοριών διακριτικού: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: έλλειψη μνήμης\n"
+
+#: pg_ctl.c:2053
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n"
+
+#: pg_ctl.c:2061
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s είναι ένα βοηθητικό πρόγραμμα για την αρχικοποίηση, την εκκίνηση, τη διακοπή ή τον έλεγχο ενός διακομιστή PostgreSQL.\n"
+"\n"
+
+#: pg_ctl.c:2062
+#, c-format
+msgid "Usage:\n"
+msgstr "Χρήση:\n"
+
+#: pg_ctl.c:2063
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+
+#: pg_ctl.c:2064
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+"\n"
+
+#: pg_ctl.c:2066
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr ""
+" %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+"\n"
+
+#: pg_ctl.c:2067
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+
+#: pg_ctl.c:2069
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:2070
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DATADIR]\n"
+
+#: pg_ctl.c:2071
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+
+#: pg_ctl.c:2072
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:2073
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill SIGNALNAME PID\n"
+
+#: pg_ctl.c:2075
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+
+#: pg_ctl.c:2077
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N SERVICENAME]\n"
+
+#: pg_ctl.c:2080
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Κοινές επιλογές:\n"
+
+#: pg_ctl.c:2081
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " [-D, --pgdata=]DATADIR τοποθεσία για τη περιοχή αποθήκευσης της βάσης δεδομένων\n"
+
+#: pg_ctl.c:2083
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e SOURCE πηγή προέλευσης συμβάντων για καταγραφή κατά την εκτέλεση ως υπηρεσία\n"
+
+#: pg_ctl.c:2085
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent εκτύπωση μόνο σφαλμάτων, χωρίς ενημερωτικά μηνύματα\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SECS δευτερόλεπτα αναμονής κατά τη χρήση της επιλογής -w\n"
+
+#: pg_ctl.c:2087
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_ctl.c:2088
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait περίμενε μέχρι να ολοκληρωθεί η λειτουργία (προεπιλογή)\n"
+
+#: pg_ctl.c:2089
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait να μην περιμένει μέχρι να ολοκληρωθεί η λειτουργία\n"
+
+#: pg_ctl.c:2090
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_ctl.c:2091
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Εάν παραλειφθεί η επιλογή -D, χρησιμοποιείται η μεταβλητή περιβάλλοντος PGDATA.\n"
+
+#: pg_ctl.c:2093
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Επιλογές για έναρξη ή επανεκκίνηση:\n"
+
+#: pg_ctl.c:2095
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files επίτρεψε στην postgres να παράγει αρχεία αποτύπωσης μνήμης\n"
+
+#: pg_ctl.c:2097
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files ανεφάρμοστο σε αυτήν την πλατφόρμα\n"
+
+#: pg_ctl.c:2099
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=FILENAME ενέγραψε (ή προσάρτησε) το αρχείο καταγραφής διακομιστή στο FILENAME\n"
+
+#: pg_ctl.c:2100
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPTIONS επιλογές γραμμής εντολών που θα διαβιστούν στη postgres\n"
+" (εκτελέσιμο αρχείο διακομιστή PostgreSQL) ή initdb\n"
+
+#: pg_ctl.c:2102
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p PATH-TO-POSTGRES κανονικά δεν είναι απαραίτητο\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Επιλογές διακοπής ή επανεκκίνησης:\n"
+
+#: pg_ctl.c:2104
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=MODE MODE μπορεί να είνα «smart», «fast», ή «immediate»\n"
+
+#: pg_ctl.c:2106
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Οι λειτουργίες τερματισμού λειτουργίας είναι:\n"
+
+#: pg_ctl.c:2107
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart διάκοψε μετά την αποσύνδεση όλων των πελατών\n"
+
+#: pg_ctl.c:2108
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast διάκοψε απευθείας, με σωστό τερματισμό (προεπιλογή)\n"
+
+#: pg_ctl.c:2109
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate διάκοψε άμεσα χωρίς πλήρη τερματισμό· Θα οδηγήσει σε αποκατάσταση κατά την επανεκκίνηση\n"
+
+#: pg_ctl.c:2111
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Επιτρεπόμενα ονόματα σημάτων για θανάτωση:\n"
+
+#: pg_ctl.c:2115
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Επιλογές καταχώρησης και διαγραφής καταχώρησης:\n"
+
+#: pg_ctl.c:2116
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N SERVICENAME όνομα υπηρεσίας με το οποίο θα καταχωρηθεί ο διακομιστής PostgreSQL\n"
+
+#: pg_ctl.c:2117
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P PASSWORD κωδικός πρόσβασης του λογαριασμού για την καταγραφή του διακομιστή PostgreSQL\n"
+
+#: pg_ctl.c:2118
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U USERNAME όνομα χρήστη του λογαριασμού για την καταγραφή του διακομιστή PostgreSQL\n"
+
+#: pg_ctl.c:2119
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S START-TYPE τύπος έναρξης υπηρεσίας για την καταχώρηση διακομιστή PostgreSQL\n"
+
+#: pg_ctl.c:2121
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Οι τύποι έναρξης είναι:\n"
+
+#: pg_ctl.c:2122
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto αυτόματη εκκίνηση της υπηρεσίας κατά την εκκίνηση του συστήματος (προεπιλογή)\n"
+
+#: pg_ctl.c:2123
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand έναρξη υπηρεσίας κατ' απαίτηση\n"
+
+#: pg_ctl.c:2126
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφορές σφάλματων σε <%s>.\n"
+
+#: pg_ctl.c:2127
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αρχική σελίδα: <%s>\n"
+
+#: pg_ctl.c:2152
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: μη αναγνωρισμένη λειτουργία τερματισμού λειτουργίας «%s»\n"
+
+#: pg_ctl.c:2181
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: μη αναγνωρισμένο όνομα σήματος «%s»\n"
+
+#: pg_ctl.c:2198
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: μη αναγνωρίσιμος τύπος έναρξης «%s»\n"
+
+#: pg_ctl.c:2253
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: δεν ήταν δυνατός ο προσδιορισμός του καταλόγου δεδομένων με χρήση της εντολής «%s»\n"
+
+#: pg_ctl.c:2277
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: το αρχείο ελέγχου φαίνεται να είναι αλλοιωμένο\n"
+
+#: pg_ctl.c:2345
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: δεν είναι δυνατή η εκτέλεση ως υπερχρήστης\n"
+"Συνδεθείτε (χρησιμοποιώντας, π.χ. \"su\") ως (μη προνομιούχο) χρήστη που θα\n"
+"να είναι στην κατοχή της η διαδικασία διακομιστή.\n"
+
+#: pg_ctl.c:2428
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: επιλογή -S δεν υποστηρίζεται σε αυτήν την πλατφόρμα\n"
+
+#: pg_ctl.c:2465
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)\n"
+
+#: pg_ctl.c:2491
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: λείπουν παράμετροι για τη λειτουργία kill\n"
+
+#: pg_ctl.c:2509
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: μη αναγνωρισμένη λειτουργία «%s»\n"
+
+#: pg_ctl.c:2519
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: δεν καθορίστηκε καμία λειτουργία\n"
+
+#: pg_ctl.c:2540
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: δεν έχει καθοριστεί κατάλογος βάσης δεδομένων και δεν έχει καθοριστεί μεταβλητή περιβάλλοντος PGDATA\n"
+
+#~ msgid ""
+#~ "The program \"%s\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Το πρόγραμμα «%s» απαιτείται από %s αλλά δεν βρέθηκε στον\n"
+#~ "ίδιο κατάλογο με το «%s».\n"
+#~ "Ελέγξτε την εγκατάστασή σας.\n"
+
+#~ msgid ""
+#~ "The program \"%s\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Το πρόγραμμα «%s» βρέθηκε από το \"%s\"\n"
+#~ "αλλά δεν ήταν στην ίδια έκδοση με %s.\n"
+#~ "Ελέγξτε την εγκατάστασή σας.\n"
+
+#~ msgid ""
+#~ "WARNING: online backup mode is active\n"
+#~ "Shutdown will not complete until pg_stop_backup() is called.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "WARNING: Η λειτουργία δημιουργίας αντιγράφων ασφαλείας σε απευθείας σύνδεση είναι ενεργή\n"
+#~ "Ο τερματισμός λειτουργίας δεν θα ολοκληρωθεί μέχρι να κληθεί pg_stop_backup().\n"
+#~ "\n"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "απέτυχε η εντολή pclose: %m"
diff --git a/src/bin/pg_ctl/po/es.po b/src/bin/pg_ctl/po/es.po
new file mode 100644
index 0000000..56c0347
--- /dev/null
+++ b/src/bin/pg_ctl/po/es.po
@@ -0,0 +1,882 @@
+# Spanish translation of pg_ctl.
+#
+# Copyright (c) 2004-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Alvaro Herrera <alvherre@alvh.no-ip.org>, 2004-2013
+# Martín Marqués <martin@2ndquadrant.com>, 2013
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:47+0000\n"
+"PO-Revision-Date: 2022-10-20 09:06+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.2\n"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "no se pudo identificar el directorio actual: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "el binario «%s» no es válido"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "no se pudo leer el binario «%s»"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "no se pudo encontrar un «%s» para ejecutar"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "no se pudo cambiar al directorio «%s»: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "no se pudo leer el enlace simbólico «%s»: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falló: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "no se puede duplicar un puntero nulo (error interno)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "la orden no es ejecutable"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "orden no encontrada"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "el proceso hijo terminó con código de salida %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "el proceso hijo fue terminado por una excepción 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "el proceso hijo fue terminado por una señal %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "el proceso hijo terminó con código no reconocido %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "no se pudo obtener el directorio de trabajo actual: %s\n"
+
+#: pg_ctl.c:260
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: el directorio «%s» no existe\n"
+
+#: pg_ctl.c:263
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: no se pudo acceder al directorio «%s»: %s\n"
+
+#: pg_ctl.c:276
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: el directorio «%s» no es un directorio de base de datos\n"
+
+#: pg_ctl.c:289
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: no se pudo abrir el archivo de PID «%s»: %s\n"
+
+#: pg_ctl.c:298
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: el archivo de PID «%s» está vacío\n"
+
+#: pg_ctl.c:301
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: datos no válidos en archivo de PID «%s»\n"
+
+#: pg_ctl.c:464 pg_ctl.c:506
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: no se pudo iniciar el servidor: %s\n"
+
+#: pg_ctl.c:484
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: no se pudo iniciar el servidor debido a falla en setsid(): %s\n"
+
+#: pg_ctl.c:554
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: no se pudo abrir el archivo de log «%s»: %s\n"
+
+#: pg_ctl.c:571
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: no se pudo iniciar el servidor: código de error %lu\n"
+
+#: pg_ctl.c:788
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr ""
+"%s: no se puede establecer el límite de archivos de volcado;\n"
+"impedido por un límite duro\n"
+
+#: pg_ctl.c:814
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: no se pudo leer el archivo «%s»\n"
+
+#: pg_ctl.c:819
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: archivo de opciones «%s» debe tener exactamente una línea\n"
+
+#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112
+#, c-format
+msgid "%s: could not send stop signal (PID: %ld): %s\n"
+msgstr "%s: falló la señal de detención (PID: %ld): %s\n"
+
+#: pg_ctl.c:889
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "el programa «%s» es requerido por %s, pero no fue encontrado en el mismo directorio que «%s»\n"
+
+#: pg_ctl.c:892
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "El programa «%s» fue encontrado por «%s», pero no es de la misma versión que %s\n"
+
+#: pg_ctl.c:923
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: falló la creación de la base de datos\n"
+
+#: pg_ctl.c:938
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: otro servidor puede estar en ejecución; tratando de iniciarlo de todas formas.\n"
+
+#: pg_ctl.c:986
+msgid "waiting for server to start..."
+msgstr "esperando que el servidor se inicie..."
+
+#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243
+msgid " done\n"
+msgstr " listo\n"
+
+#: pg_ctl.c:992
+msgid "server started\n"
+msgstr "servidor iniciado\n"
+
+#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248
+msgid " stopped waiting\n"
+msgstr " abandonando la espera\n"
+
+#: pg_ctl.c:996
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: el servidor no inició a tiempo\n"
+
+#: pg_ctl.c:1002
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: no se pudo iniciar el servidor.\n"
+"Examine el registro del servidor.\n"
+
+#: pg_ctl.c:1010
+msgid "server starting\n"
+msgstr "servidor iniciándose\n"
+
+#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: el archivo de PID «%s» no existe\n"
+
+#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273
+msgid "Is server running?\n"
+msgstr "¿Está el servidor en ejecución?\n"
+
+#: pg_ctl.c:1036
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: no se puede detener el servidor;\n"
+"un servidor en modo mono-usuario está en ejecución (PID: %ld)\n"
+
+#: pg_ctl.c:1051
+msgid "server shutting down\n"
+msgstr "servidor deteniéndose\n"
+
+#: pg_ctl.c:1056 pg_ctl.c:1117
+msgid "waiting for server to shut down..."
+msgstr "esperando que el servidor se detenga..."
+
+#: pg_ctl.c:1060 pg_ctl.c:1122
+msgid " failed\n"
+msgstr " falló\n"
+
+#: pg_ctl.c:1062 pg_ctl.c:1124
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: el servidor no se detiene\n"
+
+#: pg_ctl.c:1064 pg_ctl.c:1126
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"SUGERENCIA: La opción «-m fast» desconecta las sesiones inmediatamente\n"
+"en lugar de esperar que cada sesión finalice por sí misma.\n"
+
+#: pg_ctl.c:1070 pg_ctl.c:1132
+msgid "server stopped\n"
+msgstr "servidor detenido\n"
+
+#: pg_ctl.c:1091
+msgid "trying to start server anyway\n"
+msgstr "intentando iniciae el servidor de todas maneras\n"
+
+#: pg_ctl.c:1100
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: no se puede reiniciar el servidor;\n"
+"un servidor en modo mono-usuario está en ejecución (PID: %ld)\n"
+
+#: pg_ctl.c:1103 pg_ctl.c:1162
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Por favor termine el servidor mono-usuario e intente nuevamente.\n"
+
+#: pg_ctl.c:1136
+#, c-format
+msgid "%s: old server process (PID: %ld) seems to be gone\n"
+msgstr "%s: el proceso servidor antiguo (PID: %ld) parece no estar\n"
+
+#: pg_ctl.c:1138
+msgid "starting server anyway\n"
+msgstr "iniciando el servidor de todas maneras\n"
+
+#: pg_ctl.c:1159
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: no se puede recargar el servidor;\n"
+"un servidor en modo mono-usuario está en ejecución (PID: %ld)\n"
+
+#: pg_ctl.c:1168
+#, c-format
+msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgstr "%s: la señal de recarga falló (PID: %ld): %s\n"
+
+#: pg_ctl.c:1173
+msgid "server signaled\n"
+msgstr "se ha enviado una señal al servidor\n"
+
+#: pg_ctl.c:1198
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: no se puede promover el servidor;\n"
+"un servidor en modo mono-usuario está en ejecución (PID: %ld)\n"
+
+#: pg_ctl.c:1206
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr ""
+"%s: no se puede promover el servidor;\n"
+"el servidor no está en modo «standby»\n"
+
+#: pg_ctl.c:1216
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: no se pudo crear el archivo de señal de promoción «%s»: %s\n"
+
+#: pg_ctl.c:1222
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: no se pudo escribir al archivo de señal de promoción «%s»: %s\n"
+
+#: pg_ctl.c:1230
+#, c-format
+msgid "%s: could not send promote signal (PID: %ld): %s\n"
+msgstr "%s: no se pudo enviar la señal de promoción (PID: %ld): %s\n"
+
+#: pg_ctl.c:1233
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: no se pudo eliminar el archivo de señal de promoción «%s»: %s\n"
+
+#: pg_ctl.c:1240
+msgid "waiting for server to promote..."
+msgstr "esperando que el servidor se promueva..."
+
+#: pg_ctl.c:1244
+msgid "server promoted\n"
+msgstr "servidor promovido\n"
+
+#: pg_ctl.c:1249
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: el servidor no se promovió a tiempo\n"
+
+#: pg_ctl.c:1255
+msgid "server promoting\n"
+msgstr "servidor promoviendo\n"
+
+#: pg_ctl.c:1279
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n"
+msgstr "%s: no se puede rotar el archivo de log; un servidor en modo mono-usuario está en ejecución (PID: %ld)\n"
+
+#: pg_ctl.c:1289
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: no se pudo crear el archivo de señal de rotación de log «%s»: %s\n"
+
+#: pg_ctl.c:1295
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: no se pudo escribir al archivo de señal de rotación de log «%s»: %s\n"
+
+#: pg_ctl.c:1303
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %ld): %s\n"
+msgstr "%s: no se pudo enviar la señal de rotación de log (PID: %ld): %s\n"
+
+#: pg_ctl.c:1306
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: no se pudo eliminar el archivo de señal de rotación de log «%s»: %s\n"
+
+#: pg_ctl.c:1311
+msgid "server signaled to rotate log file\n"
+msgstr "se ha enviado una señal de rotación de log al servidor\n"
+
+#: pg_ctl.c:1358
+#, c-format
+msgid "%s: single-user server is running (PID: %ld)\n"
+msgstr "%s: un servidor en modo mono-usuario está en ejecución (PID: %ld)\n"
+
+#: pg_ctl.c:1372
+#, c-format
+msgid "%s: server is running (PID: %ld)\n"
+msgstr "%s: el servidor está en ejecución (PID: %ld)\n"
+
+#: pg_ctl.c:1388
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: no hay servidor en ejecución\n"
+
+#: pg_ctl.c:1405
+#, c-format
+msgid "%s: could not send signal %d (PID: %ld): %s\n"
+msgstr "%s: no se pudo enviar la señal %d (PID: %ld): %s\n"
+
+#: pg_ctl.c:1436
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: no se pudo encontrar el ejecutable propio\n"
+
+#: pg_ctl.c:1446
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: no se pudo encontrar el ejecutable postgres\n"
+
+#: pg_ctl.c:1516 pg_ctl.c:1550
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: no se pudo abrir el gestor de servicios\n"
+
+#: pg_ctl.c:1522
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: el servicio «%s» ya está registrado\n"
+
+#: pg_ctl.c:1533
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: no se pudo registrar el servicio «%s»: código de error %lu\n"
+
+#: pg_ctl.c:1556
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: el servicio «%s» no ha sido registrado\n"
+
+#: pg_ctl.c:1563
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: no se pudo abrir el servicio «%s»: código de error %lu\n"
+
+#: pg_ctl.c:1572
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: no se pudo dar de baja el servicio «%s»: código de error %lu\n"
+
+#: pg_ctl.c:1659
+msgid "Waiting for server startup...\n"
+msgstr "Esperando que el servidor se inicie...\n"
+
+#: pg_ctl.c:1662
+msgid "Timed out waiting for server startup\n"
+msgstr "Se agotó el tiempo de espera al inicio del servidor\n"
+
+#: pg_ctl.c:1666
+msgid "Server started and accepting connections\n"
+msgstr "Servidor iniciado y aceptando conexiones\n"
+
+#: pg_ctl.c:1721
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: no se pudo iniciar el servicio «%s»: código de error %lu\n"
+
+#: pg_ctl.c:1824
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: ATENCIÓN: no se pueden crear tokens restrigidos en esta plataforma\n"
+
+#: pg_ctl.c:1837
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: no se pudo abrir el token de proceso: código de error %lu\n"
+
+#: pg_ctl.c:1851
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: no se pudo emplazar los SIDs: código de error %lu\n"
+
+#: pg_ctl.c:1878
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: no se pudo crear el token restringido: código de error %lu\n"
+
+#: pg_ctl.c:1909
+#, c-format
+msgid "%s: WARNING: could not locate all job object functions in system API\n"
+msgstr "%s: ATENCIÓN: no fue posible encontrar todas las funciones de gestión de tareas en la API del sistema\n"
+
+#: pg_ctl.c:2006
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: no se pudo obtener LUIDs para privilegios: código de error %lu\n"
+
+#: pg_ctl.c:2014 pg_ctl.c:2029
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: no se pudo obtener información de token: código de error %lu\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: memoria agotada\n"
+
+#: pg_ctl.c:2053
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Use «%s --help» para obtener más información.\n"
+
+#: pg_ctl.c:2061
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s es un programa para inicializar, iniciar, detener o controlar\n"
+"un servidor PostgreSQL.\n"
+"\n"
+
+#: pg_ctl.c:2062
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_ctl.c:2063
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D DATADIR] [-s] [-o OPCIONES]\n"
+
+#: pg_ctl.c:2064
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D DATADIR] [-l ARCHIVO] [-W] [-t SEGS] [-s]\n"
+" [-o OPCIONES] [-p RUTA] [-c]\n"
+
+#: pg_ctl.c:2066
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D DATADIR] [-m MODO-DETENCIÓN] [-W] [-t SEGS] [-s]\n"
+
+#: pg_ctl.c:2067
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D DATADIR] [-m MODO-DETENCIÓN] [-W] [-t SEGS] [-s]\n"
+" [-o OPCIONES]\n"
+
+#: pg_ctl.c:2069
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:2070
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DATADIR]\n"
+
+#: pg_ctl.c:2071
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D DATADIR] [-W] [-t SEGS] [-s]\n"
+
+#: pg_ctl.c:2072
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:2073
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill NOMBRE-SEÑAL ID-DE-PROCESO\n"
+
+#: pg_ctl.c:2075
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D DATADIR] [-N SERVICIO] [-U USUARIO] [-P PASSWORD]\n"
+" [-S TIPO-INICIO] [-e ORIGEN] [-W] [-t SEGS] [-o OPCIONES]\n"
+
+#: pg_ctl.c:2077
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N SERVICIO]\n"
+
+#: pg_ctl.c:2080
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Opciones comunes:\n"
+
+#: pg_ctl.c:2081
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata DATADIR ubicación del área de almacenamiento de datos\n"
+
+#: pg_ctl.c:2083
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e ORIGEN origen para el log de eventos cuando se ejecuta como servicio\n"
+
+#: pg_ctl.c:2085
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent mostrar sólo errores, no mensajes de información\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SEGS segundos a esperar cuando se use la opción -w\n"
+
+#: pg_ctl.c:2087
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión, luego salir\n"
+
+#: pg_ctl.c:2088
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait esperar hasta que la operación se haya completado (por omisión)\n"
+
+#: pg_ctl.c:2089
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait no esperar hasta que la operación se haya completado\n"
+
+#: pg_ctl.c:2090
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda, luego salir\n"
+
+#: pg_ctl.c:2091
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Si la opción -D es omitida, se usa la variable de ambiente PGDATA.\n"
+
+#: pg_ctl.c:2093
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Opciones para inicio y reinicio:\n"
+
+#: pg_ctl.c:2095
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr ""
+" -c, --core-files permite que postgres produzca archivos\n"
+" de volcado (core)\n"
+
+#: pg_ctl.c:2097
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files no aplicable en esta plataforma\n"
+
+#: pg_ctl.c:2099
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l --log=ARCHIVO guardar el registro del servidor en ARCHIVO.\n"
+
+#: pg_ctl.c:2100
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPCIONES parámetros de línea de órdenes a pasar a postgres\n"
+" (ejecutable del servidor de PostgreSQL) o initdb\n"
+
+#: pg_ctl.c:2102
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p RUTA-A-POSTGRES normalmente no es necesario\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Opciones para detener o reiniciar:\n"
+
+#: pg_ctl.c:2104
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=MODO puede ser «smart», «fast» o «immediate»\n"
+
+#: pg_ctl.c:2106
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Modos de detención son:\n"
+
+#: pg_ctl.c:2107
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart salir después que todos los clientes se hayan desconectado\n"
+
+#: pg_ctl.c:2108
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast salir directamente, con apagado apropiado (por omisión)\n"
+
+#: pg_ctl.c:2109
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr ""
+" immediate salir sin apagado completo; se ejecutará recuperación\n"
+" en el próximo inicio\n"
+
+#: pg_ctl.c:2111
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Nombres de señales permitidos para kill:\n"
+
+#: pg_ctl.c:2115
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Opciones para registrar y dar de baja:\n"
+
+#: pg_ctl.c:2116
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr ""
+" -N SERVICIO nombre de servicio con el cual registrar\n"
+" el servidor PostgreSQL\n"
+
+#: pg_ctl.c:2117
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr ""
+" -P CONTRASEÑA contraseña de la cuenta con la cual registrar\n"
+" el servidor PostgreSQL\n"
+
+#: pg_ctl.c:2118
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr ""
+" -U USUARIO nombre de usuario de la cuenta con la cual\n"
+" registrar el servidor PostgreSQL\n"
+
+#: pg_ctl.c:2119
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr ""
+" -S TIPO-INICIO tipo de inicio de servicio con que registrar\n"
+" el servidor PostgreSQL\n"
+
+#: pg_ctl.c:2121
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Tipos de inicio del servicio son:\n"
+
+#: pg_ctl.c:2122
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto iniciar automáticamente al inicio del sistema (por omisión)\n"
+
+#: pg_ctl.c:2123
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand iniciar el servicio en demanda\n"
+
+#: pg_ctl.c:2126
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: pg_ctl.c:2127
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_ctl.c:2152
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: modo de apagado «%s» no reconocido\n"
+
+#: pg_ctl.c:2181
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: nombre de señal «%s» no reconocido\n"
+
+#: pg_ctl.c:2198
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: tipo de inicio «%s» no reconocido\n"
+
+#: pg_ctl.c:2253
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: no se pudo determinar el directorio de datos usando la orden «%s»\n"
+
+#: pg_ctl.c:2277
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: el archivo de control parece estar corrupto\n"
+
+#: pg_ctl.c:2345
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: no puede ser ejecutado como «root»\n"
+"Por favor conéctese (usando, por ejemplo, «su») con un usuario no privilegiado,\n"
+"quien ejecutará el proceso servidor.\n"
+
+#: pg_ctl.c:2428
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: la opción -S no está soportada en esta plataforma\n"
+
+#: pg_ctl.c:2465
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: demasiados argumentos de línea de órdenes (el primero es «%s»)\n"
+
+#: pg_ctl.c:2491
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: argumentos faltantes para envío de señal\n"
+
+#: pg_ctl.c:2509
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: modo de operación «%s» no reconocido\n"
+
+#: pg_ctl.c:2519
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: no se especificó operación\n"
+
+#: pg_ctl.c:2540
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: no se especificó directorio de datos y la variable PGDATA no está definida\n"
diff --git a/src/bin/pg_ctl/po/fr.po b/src/bin/pg_ctl/po/fr.po
new file mode 100644
index 0000000..a7e8f11
--- /dev/null
+++ b/src/bin/pg_ctl/po/fr.po
@@ -0,0 +1,1021 @@
+# LANGUAGE message translation file for pg_ctl
+# Copyright (C) 2003-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_ctl (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2003-2009.
+# Stéphane Schildknecht <stephane.schildknecht@dalibo.com>, 2009.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2010-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-12 05:16+0000\n"
+"PO-Revision-Date: 2022-04-12 17:29+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: ../../common/exec.c:144 ../../common/exec.c:261 ../../common/exec.c:307
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "n'a pas pu identifier le répertoire courant : %m"
+
+#: ../../common/exec.c:163
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binaire « %s » invalide"
+
+#: ../../common/exec.c:213
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "n'a pas pu lire le binaire « %s »"
+
+#: ../../common/exec.c:221
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "n'a pas pu trouver un « %s » à exécuter"
+
+#: ../../common/exec.c:277 ../../common/exec.c:316
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "n'a pas pu modifier le répertoire par « %s » : %m"
+
+#: ../../common/exec.c:294
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "n'a pas pu lire le lien symbolique « %s » : %m"
+
+#: ../../common/exec.c:417
+#, c-format
+msgid "%s() failed: %m"
+msgstr "échec de %s() : %m"
+
+#: ../../common/exec.c:555 ../../common/exec.c:600 ../../common/exec.c:692
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "commande non exécutable"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "commande introuvable"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "le processus fils a quitté avec le code de sortie %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "le processus fils a été terminé par l'exception 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "le processus fils a été terminé par le signal %d : %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "le processus fils a quitté avec un statut %d non reconnu"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "n'a pas pu obtenir le répertoire de travail : %s\n"
+
+#: pg_ctl.c:260
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s : le répertoire « %s » n'existe pas\n"
+
+#: pg_ctl.c:263
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n"
+
+#: pg_ctl.c:276
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s : le répertoire « %s » n'est pas un répertoire d'instance\n"
+
+#: pg_ctl.c:289
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s : n'a pas pu ouvrir le fichier de PID « %s » : %s\n"
+
+#: pg_ctl.c:298
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s : le fichier PID « %s » est vide\n"
+
+#: pg_ctl.c:301
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s : données invalides dans le fichier de PID « %s »\n"
+
+#: pg_ctl.c:464 pg_ctl.c:506
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s : n'a pas pu démarrer le serveur : %s\n"
+
+#: pg_ctl.c:484
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s : n'a pas pu démarrer le serveur à cause d'un échec de setsid() : %s\n"
+
+#: pg_ctl.c:554
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s » : %s\n"
+
+#: pg_ctl.c:571
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s : n'a pas pu démarrer le serveur : code d'erreur %lu\n"
+
+#: pg_ctl.c:788
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr ""
+"%s : n'a pas pu initialiser la taille des fichiers core, ceci est interdit\n"
+"par une limite dure\n"
+
+#: pg_ctl.c:814
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s : n'a pas pu lire le fichier « %s »\n"
+
+#: pg_ctl.c:819
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s : le fichier d'options « %s » ne doit comporter qu'une seule ligne\n"
+
+#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112
+#, c-format
+msgid "%s: could not send stop signal (PID: %ld): %s\n"
+msgstr "%s : n'a pas pu envoyer le signal d'arrêt (PID : %ld) : %s\n"
+
+#: pg_ctl.c:889
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »\n"
+
+#: pg_ctl.c:892
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s\n"
+
+#: pg_ctl.c:923
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s : l'initialisation du système a échoué\n"
+
+#: pg_ctl.c:938
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr ""
+"%s : un autre serveur semble en cours d'exécution ; le démarrage du serveur\n"
+"va toutefois être tenté\n"
+
+#: pg_ctl.c:986
+msgid "waiting for server to start..."
+msgstr "en attente du démarrage du serveur..."
+
+#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243
+msgid " done\n"
+msgstr " effectué\n"
+
+#: pg_ctl.c:992
+msgid "server started\n"
+msgstr "serveur démarré\n"
+
+#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248
+msgid " stopped waiting\n"
+msgstr " attente arrêtée\n"
+
+#: pg_ctl.c:996
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s : le serveur ne s'est pas lancé à temps\n"
+
+#: pg_ctl.c:1002
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s : n'a pas pu démarrer le serveur\n"
+"Examinez le journal applicatif.\n"
+
+#: pg_ctl.c:1010
+msgid "server starting\n"
+msgstr "serveur en cours de démarrage\n"
+
+#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s : le fichier de PID « %s » n'existe pas\n"
+
+#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273
+msgid "Is server running?\n"
+msgstr "Le serveur est-il en cours d'exécution ?\n"
+
+#: pg_ctl.c:1036
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s : ne peut pas arrêter le serveur ; le serveur mono-utilisateur est en\n"
+"cours d'exécution (PID : %ld)\n"
+
+#: pg_ctl.c:1051
+msgid "server shutting down\n"
+msgstr "serveur en cours d'arrêt\n"
+
+#: pg_ctl.c:1056 pg_ctl.c:1117
+msgid "waiting for server to shut down..."
+msgstr "en attente de l'arrêt du serveur..."
+
+#: pg_ctl.c:1060 pg_ctl.c:1122
+msgid " failed\n"
+msgstr " a échoué\n"
+
+#: pg_ctl.c:1062 pg_ctl.c:1124
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s : le serveur ne s'est pas arrêté\n"
+
+#: pg_ctl.c:1064 pg_ctl.c:1126
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"ASTUCE : l'option « -m fast » déconnecte immédiatement les sessions plutôt que\n"
+"d'attendre la déconnexion des sessions déjà présentes.\n"
+
+#: pg_ctl.c:1070 pg_ctl.c:1132
+msgid "server stopped\n"
+msgstr "serveur arrêté\n"
+
+#: pg_ctl.c:1091
+msgid "trying to start server anyway\n"
+msgstr "tentative de lancement du serveur malgré tout\n"
+
+#: pg_ctl.c:1100
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s : ne peut pas relancer le serveur ; le serveur mono-utilisateur est en\n"
+"cours d'exécution (PID : %ld)\n"
+
+#: pg_ctl.c:1103 pg_ctl.c:1162
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Merci d'arrêter le serveur mono-utilisateur et de réessayer.\n"
+
+#: pg_ctl.c:1136
+#, c-format
+msgid "%s: old server process (PID: %ld) seems to be gone\n"
+msgstr "%s : l'ancien processus serveur (PID : %ld) semble être parti\n"
+
+#: pg_ctl.c:1138
+msgid "starting server anyway\n"
+msgstr "lancement du serveur malgré tout\n"
+
+#: pg_ctl.c:1159
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s : ne peut pas recharger le serveur ; le serveur mono-utilisateur est en\n"
+"cours d'exécution (PID : %ld)\n"
+
+#: pg_ctl.c:1168
+#, c-format
+msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgstr "%s : n'a pas pu envoyer le signal de rechargement (PID : %ld) : %s\n"
+
+#: pg_ctl.c:1173
+msgid "server signaled\n"
+msgstr "envoi d'un signal au serveur\n"
+
+#: pg_ctl.c:1198
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s : ne peut pas promouvoir le serveur ; le serveur mono-utilisateur est en\n"
+"cours d'exécution (PID : %ld)\n"
+
+#: pg_ctl.c:1206
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s : ne peut pas promouvoir le serveur ; le serveur n'est pas en standby\n"
+
+#: pg_ctl.c:1216
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s : n'a pas pu créer le fichier « %s » signalant la promotion : %s\n"
+
+#: pg_ctl.c:1222
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s : n'a pas pu écrire le fichier « %s » signalant la promotion : %s\n"
+
+#: pg_ctl.c:1230
+#, c-format
+msgid "%s: could not send promote signal (PID: %ld): %s\n"
+msgstr "%s : n'a pas pu envoyer le signal de promotion (PID : %ld) : %s\n"
+
+#: pg_ctl.c:1233
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s : n'a pas pu supprimer le fichier « %s » signalant la promotion : %s\n"
+
+#: pg_ctl.c:1240
+msgid "waiting for server to promote..."
+msgstr "en attente du serveur à promouvoir..."
+
+#: pg_ctl.c:1244
+msgid "server promoted\n"
+msgstr "serveur promu\n"
+
+#: pg_ctl.c:1249
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s : le serveur ne s'est pas promu à temps\n"
+
+#: pg_ctl.c:1255
+msgid "server promoting\n"
+msgstr "serveur en cours de promotion\n"
+
+#: pg_ctl.c:1279
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s : ne peut pas faire une rotation de fichier de traces ; le serveur mono-utilisateur est en\n"
+"cours d'exécution (PID : %ld)\n"
+
+#: pg_ctl.c:1289
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s : n'a pas pu créer le fichier « %s » de demande de rotation des fichiers de trace : %s\n"
+
+#: pg_ctl.c:1295
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s : n'a pas pu écrire le fichier « %s » de demande de rotation des fichiers de trace : %s\n"
+
+#: pg_ctl.c:1303
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %ld): %s\n"
+msgstr "%s : n'a pas pu envoyer le signal de rotation des fichiers de trace (PID : %ld) : %s\n"
+
+#: pg_ctl.c:1306
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s : n'a pas pu supprimer le fichier « %s » signalant la demande de rotation des fichiers de trace : %s\n"
+
+#: pg_ctl.c:1311
+msgid "server signaled to rotate log file\n"
+msgstr "envoi d'un signal au serveur pour faire une rotation des traces\n"
+
+#: pg_ctl.c:1358
+#, c-format
+msgid "%s: single-user server is running (PID: %ld)\n"
+msgstr "%s : le serveur mono-utilisateur est en cours d'exécution (PID : %ld)\n"
+
+#: pg_ctl.c:1372
+#, c-format
+msgid "%s: server is running (PID: %ld)\n"
+msgstr "%s : le serveur est en cours d'exécution (PID : %ld)\n"
+
+#: pg_ctl.c:1388
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s : aucun serveur en cours d'exécution\n"
+
+#: pg_ctl.c:1405
+#, c-format
+msgid "%s: could not send signal %d (PID: %ld): %s\n"
+msgstr "%s : n'a pas pu envoyer le signal %d (PID : %ld) : %s\n"
+
+#: pg_ctl.c:1436
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s : n'a pas pu trouver l'exécutable du programme\n"
+
+#: pg_ctl.c:1446
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s : n'a pas pu trouver l'exécutable postgres\n"
+
+#: pg_ctl.c:1516 pg_ctl.c:1550
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s : n'a pas pu ouvrir le gestionnaire de services\n"
+
+#: pg_ctl.c:1522
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s : le service « %s » est déjà enregistré\n"
+
+#: pg_ctl.c:1533
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s : n'a pas pu enregistrer le service « %s » : code d'erreur %lu\n"
+
+#: pg_ctl.c:1556
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s : le service « %s » n'est pas enregistré\n"
+
+#: pg_ctl.c:1563
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s : n'a pas pu ouvrir le service « %s » : code d'erreur %lu\n"
+
+#: pg_ctl.c:1572
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s : n'a pas pu supprimer le service « %s » : code d'erreur %lu\n"
+
+#: pg_ctl.c:1659
+msgid "Waiting for server startup...\n"
+msgstr "En attente du démarrage du serveur...\n"
+
+#: pg_ctl.c:1662
+msgid "Timed out waiting for server startup\n"
+msgstr "Dépassement du délai pour le démarrage du serveur\n"
+
+#: pg_ctl.c:1666
+msgid "Server started and accepting connections\n"
+msgstr "Serveur lancé et acceptant les connexions\n"
+
+#: pg_ctl.c:1721
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s : n'a pas pu démarrer le service « %s » : code d'erreur %lu\n"
+
+#: pg_ctl.c:1824
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s : ATTENTION : ne peut pas créer les jetons restreints sur cette plateforme\n"
+
+#: pg_ctl.c:1837
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n"
+
+#: pg_ctl.c:1851
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n"
+
+#: pg_ctl.c:1878
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s : n'a pas pu créer le jeton restreint : code d'erreur %lu\n"
+
+#: pg_ctl.c:1909
+#, c-format
+msgid "%s: WARNING: could not locate all job object functions in system API\n"
+msgstr "%s : ATTENTION : n'a pas pu localiser toutes les fonctions objet de job dans l'API système\n"
+
+#: pg_ctl.c:2006
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s : n'a pas pu obtenir les LUID pour les droits : code d'erreur %lu\n"
+
+#: pg_ctl.c:2014 pg_ctl.c:2029
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s : n'a pas pu obtenir l'information sur le jeton : code d'erreur %lu\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s : mémoire épuisée\n"
+
+#: pg_ctl.c:2053
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Essayer « %s --help » pour plus d'informations.\n"
+
+#: pg_ctl.c:2061
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s est un outil pour initialiser, démarrer, arrêter et contrôler un serveur\n"
+"PostgreSQL.\n"
+"\n"
+
+#: pg_ctl.c:2062
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_ctl.c:2063
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D RÉP_DONNÉES] [-s] [-o OPTIONS]\n"
+
+#: pg_ctl.c:2064
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D RÉP_DONNÉES] [-l FICHIER] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p CHEMIN] [-c]\n"
+
+#: pg_ctl.c:2066
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D RÉP_DONNÉES] [-m MODE_ARRÊT] [-W] [-t SECS] [-s]\n"
+
+#: pg_ctl.c:2067
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D RÉP_DONNÉES] [-m MODE_ARRÊT] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+
+#: pg_ctl.c:2069
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D RÉP_DONNÉES] [-s]\n"
+
+#: pg_ctl.c:2070
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D RÉP_DONNÉES]\n"
+
+#: pg_ctl.c:2071
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D RÉP_DONNÉES] [-W] [-t SECS] [-s]\n"
+
+#: pg_ctl.c:2072
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D RÉP_DONNÉES] [-s]\n"
+
+#: pg_ctl.c:2073
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill NOM_SIGNAL PID\n"
+
+#: pg_ctl.c:2075
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D RÉP_DONNÉES] [-N NOM_SERVICE] [-U NOM_UTILISATEUR] [-P MOT_DE_PASSE]\n"
+" [-S TYPE_DÉMARRAGE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+
+#: pg_ctl.c:2077
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N NOM_SERVICE]\n"
+
+#: pg_ctl.c:2080
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Options générales :\n"
+
+#: pg_ctl.c:2081
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=RÉP_DONNÉES emplacement du répertoire des données de l'instance\n"
+
+#: pg_ctl.c:2083
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr ""
+" -e SOURCE source de l'événement pour la trace lors de\n"
+" l'exécution en tant que service\n"
+
+#: pg_ctl.c:2085
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr ""
+" -s, --silent affiche uniquement les erreurs, aucun message\n"
+" d'informations\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr ""
+" -t, --timeout=SECS durée en secondes à attendre lors de l'utilisation\n"
+" de l'option -w\n"
+
+#: pg_ctl.c:2087
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_ctl.c:2088
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait attend la fin de l'opération (par défaut)\n"
+
+#: pg_ctl.c:2089
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait n'attend pas la fin de l'opération\n"
+
+#: pg_ctl.c:2090
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_ctl.c:2091
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Si l'option -D est omise, la variable d'environnement PGDATA est utilisée.\n"
+
+#: pg_ctl.c:2093
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Options pour le démarrage ou le redémarrage :\n"
+
+#: pg_ctl.c:2095
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files autorise postgres à produire des fichiers core\n"
+
+#: pg_ctl.c:2097
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files non applicable à cette plateforme\n"
+
+#: pg_ctl.c:2099
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=FICHIER écrit (ou ajoute) le journal du serveur dans FICHIER\n"
+
+#: pg_ctl.c:2100
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPTIONS options de la ligne de commande à passer à\n"
+" postgres (exécutable du serveur PostgreSQL)\n"
+" ou à initdb\n"
+
+#: pg_ctl.c:2102
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p CHEMIN_POSTGRES normalement pas nécessaire\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Options pour l'arrêt ou le redémarrage :\n"
+
+#: pg_ctl.c:2104
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr ""
+" -m, --mode=MODE MODE peut valoir « smart », « fast » ou\n"
+" « immediate »\n"
+
+#: pg_ctl.c:2106
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Les modes d'arrêt sont :\n"
+
+#: pg_ctl.c:2107
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart quitte après déconnexion de tous les clients\n"
+
+#: pg_ctl.c:2108
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast quitte directement, et arrête correctement (par défaut)\n"
+
+#: pg_ctl.c:2109
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr ""
+" immediate quitte sans arrêt complet ; entraîne une restauration au démarrage\n"
+" suivant\n"
+
+#: pg_ctl.c:2111
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Signaux autorisés pour kill :\n"
+
+#: pg_ctl.c:2115
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Options d'enregistrement ou de dés-enregistrement :\n"
+
+#: pg_ctl.c:2116
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr ""
+" -N NOM_SERVICE nom du service utilisé pour l'enregistrement du\n"
+" serveur PostgreSQL\n"
+
+#: pg_ctl.c:2117
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr ""
+" -P MOT_DE_PASSE mot de passe du compte utilisé pour\n"
+" l'enregistrement du serveur PostgreSQL\n"
+
+#: pg_ctl.c:2118
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr ""
+" -U NOM_UTILISATEUR nom de l'utilisateur du compte utilisé pour\n"
+" l'enregistrement du serveur PostgreSQL\n"
+
+#: pg_ctl.c:2119
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr ""
+" -S TYPE_DÉMARRAGE type de démarrage du service pour enregistrer le\n"
+" serveur PostgreSQL\n"
+
+#: pg_ctl.c:2121
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Les types de démarrage sont :\n"
+
+#: pg_ctl.c:2122
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr ""
+" auto démarre le service automatiquement lors du démarrage du système\n"
+" (par défaut)\n"
+
+#: pg_ctl.c:2123
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand démarre le service à la demande\n"
+
+#: pg_ctl.c:2126
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: pg_ctl.c:2127
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_ctl.c:2152
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s : mode d'arrêt non reconnu « %s »\n"
+
+#: pg_ctl.c:2181
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s : signal non reconnu « %s »\n"
+
+#: pg_ctl.c:2198
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s : type de redémarrage « %s » non reconnu\n"
+
+#: pg_ctl.c:2253
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s : n'a pas déterminer le répertoire des données en utilisant la commande « %s »\n"
+
+#: pg_ctl.c:2277
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s : le fichier de contrôle semble corrompu\n"
+
+#: pg_ctl.c:2345
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s : ne peut pas être exécuté en tant qu'utilisateur root\n"
+"Connectez-vous (par exemple en utilisant « su ») sous l'utilisateur (non\n"
+" privilégié) qui sera propriétaire du processus serveur.\n"
+
+#: pg_ctl.c:2428
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s : option -S non supportée sur cette plateforme\n"
+
+#: pg_ctl.c:2465
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#: pg_ctl.c:2491
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s : arguments manquant pour le mode kill\n"
+
+#: pg_ctl.c:2509
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s : mode d'opération « %s » non reconnu\n"
+
+#: pg_ctl.c:2519
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s : aucune opération indiquée\n"
+
+#: pg_ctl.c:2540
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr ""
+"%s : aucun répertoire de bases de données indiqué et variable\n"
+"d'environnement PGDATA non initialisée\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: -w option cannot use a relative socket directory specification\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s : l'option -w ne peut pas utiliser un chemin relatif vers le répertoire de\n"
+#~ "la socket\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: -w option is not supported when starting a pre-9.1 server\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s : l'option -w n'est pas supportée lors du démarrage d'un serveur pré-9.1\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: this data directory appears to be running a pre-existing postmaster\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s : ce répertoire des données semble être utilisé par un postmaster déjà existant\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Options for stop, restart, or promote:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Options pour l'arrêt, le redémarrage ou la promotion :\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n"
+#~ msgstr ""
+#~ " %s start [-w] [-t SECS] [-D RÉP_DONNÉES] [-s] [-l NOM_FICHIER]\n"
+#~ " [-o \"OPTIONS\"]\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide et quitte\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version affiche la version et quitte\n"
+
+#~ msgid ""
+#~ "%s is a utility to start, stop, restart, reload configuration files,\n"
+#~ "report the status of a PostgreSQL server, or signal a PostgreSQL process.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s est un outil qui permet de démarrer, arrêter, redémarrer, recharger les\n"
+#~ "les fichiers de configuration, rapporter le statut d'un serveur PostgreSQL\n"
+#~ "ou d'envoyer un signal à un processus PostgreSQL\n"
+#~ "\n"
+
+#~ msgid "%s: could not create log file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu créer le fichier de traces « %s » : %s\n"
+
+#~ msgid "%s: could not open process token: %lu\n"
+#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : %lu\n"
+
+#~ msgid "%s: could not start server: exit code was %d\n"
+#~ msgstr "%s : n'a pas pu démarrer le serveur : le code de sortie est %d\n"
+
+#~ msgid "%s: could not wait for server because of misconfiguration\n"
+#~ msgstr "%s : n'a pas pu attendre le serveur à cause d'une mauvaise configuration\n"
+
+#~ msgid ""
+#~ "(The default is to wait for shutdown, but not for start or restart.)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "(Le comportement par défaut attend l'arrêt, pas le démarrage ou le\n"
+#~ "redémarrage.)\n"
+#~ "\n"
+
+#, c-format
+#~ msgid ""
+#~ "The program \"%s\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé\n"
+#~ "dans le même répertoire que « %s ».\n"
+#~ "Vérifiez votre installation.\n"
+
+#, c-format
+#~ msgid ""
+#~ "The program \"%s\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Le programme « %s » a été trouvé par « %s »\n"
+#~ "mais n'est pas de la même version que %s.\n"
+#~ "Vérifiez votre installation.\n"
+
+#~ msgid ""
+#~ "WARNING: online backup mode is active\n"
+#~ "Shutdown will not complete until pg_stop_backup() is called.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ATTENTION : le mode de sauvegarde en ligne est activé.\n"
+#~ "L'arrêt ne surviendra qu'au moment où pg_stop_backup() sera appelé.\n"
+#~ "\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "le processus fils a été terminé par le signal %s"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "n'a pas pu accéder au répertoire « %s »"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "n'a pas pu modifier le répertoire par « %s » : %s"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "n'a pas pu lire le lien symbolique « %s »"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "échec de pclose : %m"
+
+#~ msgid "server is still starting up\n"
+#~ msgstr "le serveur est toujours en cours de démarrage\n"
diff --git a/src/bin/pg_ctl/po/it.po b/src/bin/pg_ctl/po/it.po
new file mode 100644
index 0000000..ac14651
--- /dev/null
+++ b/src/bin/pg_ctl/po/it.po
@@ -0,0 +1,889 @@
+#
+# pg_ctl.po
+# Italian message translation file for pg_ctl
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+# Copyright (C) 2010, Associazione Culturale ITPUG
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017.
+# Emanuele Zamprogno <emanuele.zamprogno@itpug.org>, 2010.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:17+0000\n"
+"PO-Revision-Date: 2022-09-30 14:49+0200\n"
+"Last-Translator: Domenico Sgarbossa <sgarbossa.domenico@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 2.3\n"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "impossibile identificare la directory corrente: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binario non valido \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "lettura del binario \"%s\" fallita"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "programma \"%s\" da eseguire non trovato"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "spostamento nella directory \"%s\" fallito: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "lettura del link simbolico \"%s\" fallita: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() non riuscito: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "memoria esaurita"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "impossibile duplicare il puntatore nullo (errore interno)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "comando non eseguibile"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "comando non trovato"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "processo figlio uscito con codice di uscita %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "processo figlio terminato da eccezione 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "il processo figlio è stato terminato dal segnale %d: %s\\"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "processo figlio uscito con stato non riconosciuto %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "determinazione della directory corrente fallita: %s\n"
+
+#: pg_ctl.c:260
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: la directory \"%s\" non esiste\n"
+
+#: pg_ctl.c:263
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: accesso alla directory \"%s\" fallito: %s\n"
+
+#: pg_ctl.c:276
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: la directory \"%s\" non è la directory di un cluster di database\n"
+
+#: pg_ctl.c:289
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: apertura del file PID \"%s\" fallita: %s\n"
+
+#: pg_ctl.c:298
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: il file PID \"%s\" è vuoto\n"
+
+#: pg_ctl.c:301
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: dati non validi nel file PID \"%s\"\n"
+
+#: pg_ctl.c:464 pg_ctl.c:506
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: errore di avvio del server: %s\n"
+
+#: pg_ctl.c:484
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: impossibile avviare il server a causa di un errore di setid(): %s\n"
+
+#: pg_ctl.c:554
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: apertura del file di log \"%s\" fallita: %s\n"
+
+#: pg_ctl.c:571
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: errore di avvio del server: codice dell'errore %lu\n"
+
+#: pg_ctl.c:788
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: non è possibile configurare il limite di grandezza dei core file; impedito dall'hard limit\n"
+
+#: pg_ctl.c:814
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: lettura del file \"%s\" fallita\n"
+
+#: pg_ctl.c:819
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: il file di opzione \"%s\" deve avere esattamente una riga\n"
+
+#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112
+#, c-format
+msgid "%s: could not send stop signal (PID: %ld): %s\n"
+msgstr "%s: invio del segnale di arresto fallito (PID: %ld): %s\n"
+
+#: pg_ctl.c:889
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "il programma \"%s\" è necessario per %s ma non è stato trovato nella stessa directory di \"%s\"\n"
+
+#: pg_ctl.c:892
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "il programma \"%s\" è stato trovato da \"%s\" ma non era della stessa versione di %s\n"
+
+#: pg_ctl.c:923
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: inizializzazione del sistema di database fallita\n"
+
+#: pg_ctl.c:938
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: un altro server potrebbe essere in esecuzione; si sta provando ad avviare il server ugualmente\n"
+
+#: pg_ctl.c:986
+msgid "waiting for server to start..."
+msgstr "in attesa che il server si avvii..."
+
+#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243
+msgid " done\n"
+msgstr " fatto\n"
+
+#: pg_ctl.c:992
+msgid "server started\n"
+msgstr "il server è stato avviato\n"
+
+#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248
+msgid " stopped waiting\n"
+msgstr " attesa interrotta\n"
+
+#: pg_ctl.c:996
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: il server non è partito nel tempo previsto\n"
+
+#: pg_ctl.c:1002
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: l'avvio del server è fallito\n"
+"Esamina il log di output.\n"
+
+#: pg_ctl.c:1010
+msgid "server starting\n"
+msgstr "il server si sta avviando\n"
+
+#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: il file PID \"%s\" non esiste\n"
+
+#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273
+msgid "Is server running?\n"
+msgstr "Il server è in esecuzione?\n"
+
+#: pg_ctl.c:1036
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n"
+msgstr "%s: non è possibile fermare il server; il server è in esecuzione in modalità a utente singolo (PID: %ld)\n"
+
+#: pg_ctl.c:1051
+msgid "server shutting down\n"
+msgstr "il server è in fase di arresto\n"
+
+#: pg_ctl.c:1056 pg_ctl.c:1117
+msgid "waiting for server to shut down..."
+msgstr "in attesa dell'arresto del server...."
+
+#: pg_ctl.c:1060 pg_ctl.c:1122
+msgid " failed\n"
+msgstr " fallito\n"
+
+#: pg_ctl.c:1062 pg_ctl.c:1124
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: il server non si è arrestato\n"
+
+#: pg_ctl.c:1064 pg_ctl.c:1126
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"NOTA: L'opzione \"-m fast\" disconnette le sessioni immediatamente invece di\n"
+"attendere che siano le sessioni a disconnettersi.\n"
+
+#: pg_ctl.c:1070 pg_ctl.c:1132
+msgid "server stopped\n"
+msgstr "il server è stato arrestato\n"
+
+#: pg_ctl.c:1091
+msgid "trying to start server anyway\n"
+msgstr "si sta provando ad avviare il server ugualmente\n"
+
+#: pg_ctl.c:1100
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n"
+msgstr "%s: non è possibile riavviare il server; il server è in esecuzione in modalità a utente singolo (PID: %ld)\n"
+
+#: pg_ctl.c:1103 pg_ctl.c:1162
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Si prega di terminare il server in modalità utente singolo e di riprovare.\n"
+
+#: pg_ctl.c:1136
+#, c-format
+msgid "%s: old server process (PID: %ld) seems to be gone\n"
+msgstr "%s: il vecchio processo del server (PID: %ld) sembra non essere più attivo\n"
+
+#: pg_ctl.c:1138
+msgid "starting server anyway\n"
+msgstr "il server si sta avviando comunque\n"
+
+#: pg_ctl.c:1159
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgstr "%s: non è possibile eseguire il reload del server; il server è in esecuzione in modalità a utente singolo (PID: %ld)\n"
+
+#: pg_ctl.c:1168
+#, c-format
+msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgstr "%s: invio segnale di reload fallito (PID: %ld): %s\n"
+
+#: pg_ctl.c:1173
+msgid "server signaled\n"
+msgstr "segnale inviato al server\n"
+
+#: pg_ctl.c:1198
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n"
+msgstr "%s: non è possibile promuovere il server: il server è in esecuzione in modalità a utente singolo (PID: %ld)\n"
+
+#: pg_ctl.c:1206
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: non è possibile promuovere il server: il server non è in modalità standby\n"
+
+#: pg_ctl.c:1216
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: creazione del file di segnale di promozione \"%s\" fallito: %s\n"
+
+#: pg_ctl.c:1222
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: scrittura del file di segnale di promozione \"%s\" fallita: %s\n"
+
+#: pg_ctl.c:1230
+#, c-format
+msgid "%s: could not send promote signal (PID: %ld): %s\n"
+msgstr "%s: invio del segnale di promozione fallito (PID: %ld): %s\n"
+
+#: pg_ctl.c:1233
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: rimozione del file di segnale di promozione \"%s\" fallita: %s\n"
+
+#: pg_ctl.c:1240
+msgid "waiting for server to promote..."
+msgstr "in attesa della promozione del server..."
+
+#: pg_ctl.c:1244
+msgid "server promoted\n"
+msgstr "server promosso\n"
+
+#: pg_ctl.c:1249
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: il server non è stato promosso nel tempo previsto\n"
+
+#: pg_ctl.c:1255
+msgid "server promoting\n"
+msgstr "il server sta venendo promosso\n"
+
+#: pg_ctl.c:1279
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n"
+msgstr "%s: impossibile ruotare il file di registro; il server per utente singolo è in esecuzione (PID: %ld)\n"
+
+#: pg_ctl.c:1289
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: impossibile creare il file del segnale di rotazione del registro \"%s\": %s\n"
+
+#: pg_ctl.c:1295
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: impossibile scrivere il file del segnale di rotazione del registro \"%s\": %s\n"
+
+#: pg_ctl.c:1303
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %ld): %s\n"
+msgstr "%s: impossibile inviare il segnale di rotazione del registro (PID: %ld): %s\n"
+
+#: pg_ctl.c:1306
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: impossibile rimuovere il file del segnale di rotazione del registro \"%s\": %s\n"
+
+#: pg_ctl.c:1311
+msgid "server signaled to rotate log file\n"
+msgstr "il server ha segnalato di ruotare il file di registro\n"
+
+#: pg_ctl.c:1358
+#, c-format
+msgid "%s: single-user server is running (PID: %ld)\n"
+msgstr "%s: il server è in esecuzione in modalità a utente singolo (PID: %ld)\n"
+
+#: pg_ctl.c:1372
+#, c-format
+msgid "%s: server is running (PID: %ld)\n"
+msgstr "%s: il server è in esecuzione (PID: %ld)\n"
+
+#: pg_ctl.c:1388
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: nessun server in esecuzione\n"
+
+#: pg_ctl.c:1405
+#, c-format
+msgid "%s: could not send signal %d (PID: %ld): %s\n"
+msgstr "%s: invio del segnale %d fallito (PID: %ld): %s\n"
+
+#: pg_ctl.c:1436
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: il proprio programma eseguibile non è stato trovato\n"
+
+#: pg_ctl.c:1446
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: il programma eseguibile postgres non è stato trovato\n"
+
+#: pg_ctl.c:1516 pg_ctl.c:1550
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: apertura del service manager fallita\n"
+
+#: pg_ctl.c:1522
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: il servizio \"%s\" è già registrato\n"
+
+#: pg_ctl.c:1533
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: registrazione del servizio \"%s\" fallita: codice errore %lu\n"
+
+#: pg_ctl.c:1556
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: il servizio \"%s\" non è registrato\n"
+
+#: pg_ctl.c:1563
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: apertura del servizio \"%s\" fallita: codice errore %lu\n"
+
+#: pg_ctl.c:1572
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: rimozione della registrazione del servizio \"%s\" fallita: codice errore %lu\n"
+
+#: pg_ctl.c:1659
+msgid "Waiting for server startup...\n"
+msgstr "In attesa che il server si avvii...\n"
+
+#: pg_ctl.c:1662
+msgid "Timed out waiting for server startup\n"
+msgstr "Il tempo di attesa per l'avvio del server è scaduto\n"
+
+#: pg_ctl.c:1666
+msgid "Server started and accepting connections\n"
+msgstr "Il server è avviato e accetta connessioni\n"
+
+#: pg_ctl.c:1721
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: non è possibile avviare il servizio \"%s\": codice errore %lu\n"
+
+#: pg_ctl.c:1824
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: ATTENZIONE: non è possibile creare token ristretti su questa piattaforma\n"
+
+#: pg_ctl.c:1837
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: apertura del token di processo fallita: codice errore %lu\n"
+
+#: pg_ctl.c:1851
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: allocazione dei SID fallita: codice errore %lu\n"
+
+#: pg_ctl.c:1878
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: creazione del token ristretto fallita: codice errore %lu\n"
+
+#: pg_ctl.c:1909
+#, c-format
+msgid "%s: WARNING: could not locate all job object functions in system API\n"
+msgstr "%s: ATTENZIONE: non tutte le funzioni di controllo dei job nella API di sistema sono state trovate\n"
+
+#: pg_ctl.c:2006
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: errore nella lettura dei LUID per i privilegi: codice di errore %lu\n"
+
+#: pg_ctl.c:2014 pg_ctl.c:2029
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: errore nella lettura del token di informazione: codice di errore %lu\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: memoria esaurita\n"
+
+#: pg_ctl.c:2053
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
+
+#: pg_ctl.c:2061
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s è un programma per inizializzare, avviare, fermare o controllare un server PostgreSQL.\n"
+"\n"
+
+#: pg_ctl.c:2062
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_ctl.c:2063
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+
+#: pg_ctl.c:2064
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s inizio [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPZIONI] [-p PERCORSO] [-c]\n"
+"\n"
+
+#: pg_ctl.c:2066
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+
+#: pg_ctl.c:2067
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s riavvia [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPZIONI] [-c]\n"
+
+#: pg_ctl.c:2069
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s ricarica [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:2070
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " Stato %s [-D DATADIR]\n"
+
+#: pg_ctl.c:2071
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promuovono [-D DATADIR] [-W] [-t SECS] [-s]\n"
+
+#: pg_ctl.c:2072
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:2073
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s elimina SIGNALNAME PID\n"
+
+#: pg_ctl.c:2075
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s registra [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+
+#: pg_ctl.c:2077
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N SERVIZIO]\n"
+
+#: pg_ctl.c:2080
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Opzioni comuni:\n"
+
+#: pg_ctl.c:2081
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata DATADIR posizione dell'area di archiviazione del database\n"
+
+#: pg_ctl.c:2083
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e SORGENTE sorgente eventi per il log quando eseguito come servizio\n"
+
+#: pg_ctl.c:2085
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent mostra solo gli errori, non i messaggi di informazione\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SEC secondi da aspettare quando si usa l'opzione -w\n"
+
+#: pg_ctl.c:2087
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_ctl.c:2088
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait aspetta fino al completamento dell'operazione (default)\n"
+
+#: pg_ctl.c:2089
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait non aspettare fino al completamento dell'operazione\n"
+
+#: pg_ctl.c:2090
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_ctl.c:2091
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Se l'opzione -D è omessa, viene usata la variabile d'ambiente PGDATA.\n"
+
+#: pg_ctl.c:2093
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Opzioni per l'avvio o il riavvio:\n"
+
+#: pg_ctl.c:2095
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files permette a postgres di produrre core file\n"
+
+#: pg_ctl.c:2097
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files non disponibile su questa piattaforma\n"
+
+#: pg_ctl.c:2099
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log NOMEFILE scrivi (o accoda) il log del server in NOMEFILE\n"
+
+#: pg_ctl.c:2100
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPZIONI opzioni da riga di comando da passare a postgres\n"
+" (programma eseguibile del server PostgreSQL) o initdb\n"
+
+#: pg_ctl.c:2102
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p PATH-TO-POSTGRES normalmente non necessario\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Opzioni per l'arresto o il riavvio:\n"
+
+#: pg_ctl.c:2104
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=MODE MODE può essere \"smart\", \"fast\" o \"immediate\"\n"
+
+#: pg_ctl.c:2106
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"I modi di spegnimento sono:\n"
+
+#: pg_ctl.c:2107
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart termina dopo che tutti i client si sono disconnessi\n"
+
+#: pg_ctl.c:2108
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast termina direttamente, con una corretta procedura di arresto (default)\n"
+
+#: pg_ctl.c:2109
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr ""
+" immediate termina senza un arresto completo: ciò porterà ad un recupero\n"
+" dei dati al riavvio\n"
+
+#: pg_ctl.c:2111
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Nomi di segnali permessi per kill:\n"
+
+#: pg_ctl.c:2115
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Opzioni per register e unregister:\n"
+
+#: pg_ctl.c:2116
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N SERVIZIO nome del servizio con cui registrare il server PostgreSQL\n"
+
+#: pg_ctl.c:2117
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P PASSWORD password per l'account con cui registrare il server PostgreSQL\n"
+
+#: pg_ctl.c:2118
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U UTENTE nome utente dell'account con cui registrare il server PostgreSQL\n"
+
+#: pg_ctl.c:2119
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S TIPO-AVVIO tipo di avvio del servizio con cui registrare il server PostgreSQL\n"
+
+#: pg_ctl.c:2121
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"I tipi di avvio sono:\n"
+
+#: pg_ctl.c:2122
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto avvia il servizio automaticamente durante l'avvio del sistema (predefinito)\n"
+
+#: pg_ctl.c:2123
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand avvia il servizio quando richiesto\n"
+
+#: pg_ctl.c:2126
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: pg_ctl.c:2127
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_ctl.c:2152
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: modalità di arresto sconosciuta \"%s\"\n"
+
+#: pg_ctl.c:2181
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: nome del segnale sconosciuto \"%s\"\n"
+
+#: pg_ctl.c:2198
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: tipo di avvio sconosciuto \"%s\"\n"
+
+#: pg_ctl.c:2253
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: non è stato possibile determinare la directory dei dati usando il comando \"%s\"\n"
+
+#: pg_ctl.c:2277
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: il file di controllo sembra corrotto\n"
+
+#: pg_ctl.c:2345
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: non può essere eseguito da root\n"
+"Effettua il login (usando per esempio \"su\") con l'utente\n"
+"(non privilegiato) che controllerà il processo server.\n"
+
+#: pg_ctl.c:2428
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: l'opzione -S non è supportata su questa piattaforma\n"
+
+#: pg_ctl.c:2465
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: troppi argomenti nella riga di comando (il primo è \"%s\")\n"
+
+#: pg_ctl.c:2491
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: mancano gli argomenti per la modalità di kill\n"
+
+#: pg_ctl.c:2509
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: modalità di operazione sconosciuta \"%s\"\n"
+
+#: pg_ctl.c:2519
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: nessuna operazione specificata\n"
+
+#: pg_ctl.c:2540
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: nessuna directory del database è stata specificata e la variabile d'ambiente PGDATA non è configurata\n"
+
+#~ msgid ""
+#~ "WARNING: online backup mode is active\n"
+#~ "Shutdown will not complete until pg_stop_backup() is called.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ATTENZIONE: è attiva la modalità di backup online\n"
+#~ "L'arresto non sarà completato finché non sarà chiamata pg_stop_backup().\n"
+#~ "\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "processo figlio terminato da segnale %s"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "spostamento nella directory \"%s\" fallito: %s"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "lettura del link simbolico \"%s\" fallita"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "pclose fallita: %s"
diff --git a/src/bin/pg_ctl/po/ja.po b/src/bin/pg_ctl/po/ja.po
new file mode 100644
index 0000000..cbe92bc
--- /dev/null
+++ b/src/bin/pg_ctl/po/ja.po
@@ -0,0 +1,911 @@
+# pg_ctl.po
+# Japanese message translation file for pg_ctl
+#
+# Copyright (C) 2005-2022 PostgreSQL Global Development Group
+#
+# Shigehiro Honda <fwif0083@mb.infoweb.ne.jp>, 2005.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-09 12:00+0900\n"
+"PO-Revision-Date: 2022-08-09 09:47+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "カレントディレクトリを識別できませんでした: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "バイナリ\"%s\"は無効です"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "バイナリ\"%s\"を読み取れませんでした"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "実行する\"%s\"がありませんでした"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "ディレクトリ\"%s\"に移動できませんでした: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "シンボリックリンク\"%s\"を読めませんでした: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() が失敗しました: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "メモリ不足です"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリ不足です\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null ポインタを複製できません(内部エラー)。\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "コマンドは実行形式ではありません"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "コマンドが見つかりません"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "子プロセスが終了コード%dで終了しました"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "子プロセスが例外0x%Xで終了しました"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "子プロセスはシグナル%dにより終了しました: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "子プロセスが未知のステータス%dで終了しました"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "現在の作業ディレクトリを取得できませんでした: %s\n"
+
+#: pg_ctl.c:260
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: ディレクトリ \"%s\" は存在しません\n"
+
+#: pg_ctl.c:263
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: ディレクトリ\"%s\"にアクセスできませんでした: %s\n"
+
+#: pg_ctl.c:276
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: ディレクトリ\"%s\"はデータベースクラスタディレクトリではありません\n"
+
+#: pg_ctl.c:289
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: PIDファイル\"%s\"をオープンできませんでした: %s\n"
+
+#: pg_ctl.c:298
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: PIDファイル\"%s\"が空です\n"
+
+#: pg_ctl.c:301
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: PIDファイル\"%s\"内に無効なデータがあります\n"
+
+#: pg_ctl.c:464 pg_ctl.c:506
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: サーバーに接続できませんでした: %s\n"
+
+#: pg_ctl.c:484
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: setsid()に失敗したためサーバーに接続できませんでした: %s\n"
+
+#: pg_ctl.c:554
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: ログファイル \"%s\" をオープンできませんでした: %s\n"
+
+#: pg_ctl.c:571
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: サーバーの起動に失敗しました: エラーコード %lu\n"
+
+#: pg_ctl.c:788
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: コアファイルのサイズ制限を設定できません:固定の制限により許されていません\n"
+
+#: pg_ctl.c:814
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: ファイル\"%s\"を読み取ることに失敗しました\n"
+
+#: pg_ctl.c:819
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: オプションファイル\"%s\"は1行のみでなければなりません\n"
+
+#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112
+#, c-format
+msgid "%s: could not send stop signal (PID: %ld): %s\n"
+msgstr "%s: 停止シグナルを送信できませんでした。(PID: %ld): %s\n"
+
+#: pg_ctl.c:889
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "%2$sにはプログラム\"%1$s\"が必要ですが、\"%3$s\"と同じディレクトリにありませんでした\n"
+
+#: pg_ctl.c:892
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じバージョンではありませんでした\n"
+
+#: pg_ctl.c:923
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: データベースシステムが初期化に失敗しました\n"
+
+#: pg_ctl.c:938
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: 他のサーバーが動作中の可能性がありますが、とにかくpostmasterの起動を試みます。\n"
+
+#: pg_ctl.c:986
+msgid "waiting for server to start..."
+msgstr "サーバーの起動完了を待っています..."
+
+#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243
+msgid " done\n"
+msgstr "完了\n"
+
+#: pg_ctl.c:992
+msgid "server started\n"
+msgstr "サーバー起動完了\n"
+
+#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248
+msgid " stopped waiting\n"
+msgstr " 待機処理が停止されました\n"
+
+#: pg_ctl.c:996
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: サーバーは時間内に起動しませんでした\n"
+
+#: pg_ctl.c:1002
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: サーバーを起動できませんでした。\n"
+"ログ出力を確認してください。\n"
+
+#: pg_ctl.c:1010
+msgid "server starting\n"
+msgstr "サーバーは起動中です。\n"
+
+#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: PIDファイル\"%s\"がありません\n"
+
+#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273
+msgid "Is server running?\n"
+msgstr "サーバーが動作していますか?\n"
+
+#: pg_ctl.c:1036
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n"
+msgstr "%s: サーバーを停止できません。シングルユーザーサーバー(PID: %ld)が動作しています。\n"
+
+#: pg_ctl.c:1051
+msgid "server shutting down\n"
+msgstr "サーバーの停止中です\n"
+
+#: pg_ctl.c:1056 pg_ctl.c:1117
+msgid "waiting for server to shut down..."
+msgstr "サーバー停止処理の完了を待っています..."
+
+#: pg_ctl.c:1060 pg_ctl.c:1122
+msgid " failed\n"
+msgstr "失敗しました\n"
+
+#: pg_ctl.c:1062 pg_ctl.c:1124
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: サーバーは停止していません\n"
+
+#: pg_ctl.c:1064 pg_ctl.c:1126
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"ヒント: \"-m fast\"オプションは、セッション切断が始まるまで待機するのではなく\n"
+"即座にセッションを切断します。\n"
+
+#: pg_ctl.c:1070 pg_ctl.c:1132
+msgid "server stopped\n"
+msgstr "サーバーは停止しました\n"
+
+#: pg_ctl.c:1091
+msgid "trying to start server anyway\n"
+msgstr "とにかくサーバーの起動を試みます\n"
+
+#: pg_ctl.c:1100
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n"
+msgstr "%s: サーバーを再起動できません。シングルユーザーサーバー(PID: %ld)が動作中です。\n"
+
+#: pg_ctl.c:1103 pg_ctl.c:1162
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "シングルユーザーサーバーを終了させてから、再度実行してください\n"
+
+#: pg_ctl.c:1136
+#, c-format
+msgid "%s: old server process (PID: %ld) seems to be gone\n"
+msgstr "%s: 古いサーバープロセス(PID: %ld)が動作していないようです\n"
+
+#: pg_ctl.c:1138
+msgid "starting server anyway\n"
+msgstr "とにかくサーバーを起動しています\n"
+
+#: pg_ctl.c:1159
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgstr "%s: サーバーをリロードできません。シングルユーザーサーバー(PID: %ld)が動作中です\n"
+
+#: pg_ctl.c:1168
+#, c-format
+msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgstr "%s: リロードシグナルを送信できませんでした。(PID: %ld): %s\n"
+
+#: pg_ctl.c:1173
+msgid "server signaled\n"
+msgstr "サーバーにシグナルを送信しました\n"
+
+#: pg_ctl.c:1198
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n"
+msgstr "%s: サーバーを昇格できません; シングルユーザーサーバー(PID: %ld)が動作中です\n"
+
+#: pg_ctl.c:1206
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: サーバーを昇格できません; サーバーはスタンバイモードではありません\n"
+
+#: pg_ctl.c:1216
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: 昇格指示ファイル\"%s\"を作成することができませんでした: %s\n"
+
+#: pg_ctl.c:1222
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: 昇格指示ファイル\"%s\"に書き出すことができませんでした: %s\n"
+
+#: pg_ctl.c:1230
+#, c-format
+msgid "%s: could not send promote signal (PID: %ld): %s\n"
+msgstr "%s: 昇格シグナルを送信できませんでした (PID: %ld): %s\n"
+
+#: pg_ctl.c:1233
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: 昇格指示ファイル\"%s\"の削除に失敗しました: %s\n"
+
+#: pg_ctl.c:1240
+msgid "waiting for server to promote..."
+msgstr "サーバーの昇格を待っています..."
+
+#: pg_ctl.c:1244
+msgid "server promoted\n"
+msgstr "サーバーは昇格しました\n"
+
+#: pg_ctl.c:1249
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: サーバーは時間内に昇格しませんでした\n"
+
+#: pg_ctl.c:1255
+msgid "server promoting\n"
+msgstr "サーバーを昇格中です\n"
+
+#: pg_ctl.c:1279
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n"
+msgstr "%s: ログをローテートできません; シングルユーザーサーバーが動作中です (PID: %ld)\n"
+
+#: pg_ctl.c:1289
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: ログローテート指示ファイル\"%s\"を作成することができませんでした: %s\n"
+
+#: pg_ctl.c:1295
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: ログローテート指示ファイル\"%s\"に書き出すことができませんでした: %s\n"
+
+#: pg_ctl.c:1303
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %ld): %s\n"
+msgstr "%s: ログローテートシグナルを送信できませんでした (PID: %ld): %s\n"
+
+#: pg_ctl.c:1306
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: ログローテーション指示ファイル\"%s\"の削除に失敗しました: %s\n"
+
+#: pg_ctl.c:1311
+msgid "server signaled to rotate log file\n"
+msgstr "サーバーがログローテートをシグナルされました\n"
+
+#: pg_ctl.c:1358
+#, c-format
+msgid "%s: single-user server is running (PID: %ld)\n"
+msgstr "%s: シングルユーザーサーバーが動作中です(PID: %ld)\n"
+
+#: pg_ctl.c:1372
+#, c-format
+msgid "%s: server is running (PID: %ld)\n"
+msgstr "%s: サーバーが動作中です(PID: %ld)\n"
+
+#: pg_ctl.c:1388
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: サーバーが動作していません\n"
+
+#: pg_ctl.c:1405
+#, c-format
+msgid "%s: could not send signal %d (PID: %ld): %s\n"
+msgstr "%s: シグナル%dを送信できませんでした(PID: %ld): %s\n"
+
+#: pg_ctl.c:1436
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 本プログラムの実行ファイルの検索に失敗しました\n"
+
+#: pg_ctl.c:1446
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: postgres の実行ファイルが見つかりません\n"
+
+#: pg_ctl.c:1516 pg_ctl.c:1550
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: サービスマネージャのオープンに失敗しました\n"
+
+#: pg_ctl.c:1522
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: サービス\\\"%s\\\"は登録済みです\n"
+
+#: pg_ctl.c:1533
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: サービス\"%s\"の登録に失敗しました: エラーコード %lu\n"
+
+#: pg_ctl.c:1556
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: サービス\"%s\"は登録されていません\n"
+
+#: pg_ctl.c:1563
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: サービス\"%s\"のオープンに失敗しました: エラーコード %lu\n"
+
+#: pg_ctl.c:1572
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: サービス\"%s\"の登録削除に失敗しました: エラーコード %lu\n"
+
+#: pg_ctl.c:1659
+msgid "Waiting for server startup...\n"
+msgstr "サーバーの起動完了を待っています...\n"
+
+#: pg_ctl.c:1662
+msgid "Timed out waiting for server startup\n"
+msgstr "サーバーの起動待機がタイムアウトしました\n"
+
+#: pg_ctl.c:1666
+msgid "Server started and accepting connections\n"
+msgstr "サーバーは起動し、接続を受け付けています\n"
+
+#: pg_ctl.c:1721
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: サービス\"%s\"の起動に失敗しました: エラーコード %lu\n"
+
+#: pg_ctl.c:1824
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: 警告: このプラットフォームでは制限付きトークンを作成できません\n"
+
+#: pg_ctl.c:1837
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: プロセストークンをオープンできませんでした: エラーコード %lu\n"
+
+#: pg_ctl.c:1851
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: SIDを割り当てられませんでした: エラーコード %lu\n"
+
+#: pg_ctl.c:1878
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: 制限付きトークンを作成できませんでした: エラーコード %lu\n"
+
+#: pg_ctl.c:1909
+#, c-format
+msgid "%s: WARNING: could not locate all job object functions in system API\n"
+msgstr "%s: 警告: システムAPI内にすべてのジョブオブジェクト関数を格納できませんでした\n"
+
+#: pg_ctl.c:2006
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: 権限の LUID を取得できません: エラーコード %lu\n"
+
+#: pg_ctl.c:2014 pg_ctl.c:2029
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: トークン情報を取得できませんでした: エラーコード %lu\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: メモリ不足です\n"
+
+#: pg_ctl.c:2053
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "詳細は\"%s --help\"を実行してください。\n"
+
+#: pg_ctl.c:2061
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr "%sはPostgreSQLサーバーの初期化、起動、停止、制御を行うユーティリティです。\n"
+
+#: pg_ctl.c:2062
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_ctl.c:2063
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+
+#: pg_ctl.c:2064
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+
+#: pg_ctl.c:2066
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+
+#: pg_ctl.c:2067
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+
+#: pg_ctl.c:2069
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:2070
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DATADIR]\n"
+
+#: pg_ctl.c:2071
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+
+#: pg_ctl.c:2072
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:2073
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill SIGNALNAME PID\n"
+
+#: pg_ctl.c:2075
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+
+#: pg_ctl.c:2077
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N SERVICENAME]\n"
+
+#: pg_ctl.c:2080
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"共通のオプション:\n"
+
+#: pg_ctl.c:2081
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=DATADIR データベース格納領域の場所\n"
+
+#: pg_ctl.c:2083
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e SOURCE サービスとして起動させたときのログのイベントソース\n"
+
+#: pg_ctl.c:2085
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent エラーメッセージのみを表示、情報メッセージは表示しない\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SECS -wオプションを使用する時に待機する秒数\n"
+
+#: pg_ctl.c:2087
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: pg_ctl.c:2088
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait 操作が完了するまで待機 (デフォルト)\n"
+
+#: pg_ctl.c:2089
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait 作業の完了を待たない\n"
+
+#: pg_ctl.c:2090
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: pg_ctl.c:2091
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "-Dオプションの省略時はPGDATA環境変数が使用されます。\n"
+
+#: pg_ctl.c:2093
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"起動、再起動のオプション\n"
+
+#: pg_ctl.c:2095
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files postgresのコアファイル生成を許可\n"
+
+#: pg_ctl.c:2097
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files このプラットフォームでは適用されない\n"
+
+#: pg_ctl.c:2099
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log FILENAME サーバーログをFILENAMEへ書き込む(または追加する)\n"
+
+#: pg_ctl.c:2100
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPTIONS postgres(PostgreSQLサーバー実行ファイル)または\n"
+" initdb に渡すコマンドラインオプション\n"
+
+#: pg_ctl.c:2102
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p PATH-TO-POSTGRES 通常は不要\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"停止、再起動のオプション\n"
+
+#: pg_ctl.c:2104
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=MODE MODEは\"smart\"、\"fast\"、\"immediate\"のいずれか\n"
+
+#: pg_ctl.c:2106
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"シャットダウンモードは以下の通り:\n"
+
+#: pg_ctl.c:2107
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart 全クライアントの接続切断後に停止\n"
+
+#: pg_ctl.c:2108
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast 適切な手続きで直ちに停止(デフォルト)\n"
+
+#: pg_ctl.c:2109
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate 適切な手続き抜きで停止; 再起動時にはリカバリが実行される\n"
+
+#: pg_ctl.c:2111
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"killモードで利用できるシグナル名:\n"
+
+#: pg_ctl.c:2115
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"登録、登録解除のオプション:\n"
+
+#: pg_ctl.c:2116
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N SERVICENAME PostgreSQLサーバーを登録する際のサービス名\n"
+
+#: pg_ctl.c:2117
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P PASSWORD PostgreSQLサーバーを登録するためのアカウントのパスワード\n"
+
+#: pg_ctl.c:2118
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U USERNAME PostgreSQLサーバーを登録するためのアカウント名\n"
+
+#: pg_ctl.c:2119
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S START-TYPE PostgreSQLサーバーを登録する際のサービス起動タイプ\n"
+
+#: pg_ctl.c:2121
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"起動タイプは以下の通り:\n"
+
+#: pg_ctl.c:2122
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto システムの起動時にサービスを自動的に開始(デフォルト)\n"
+
+#: pg_ctl.c:2123
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand 要求に応じてサービスを開始\n"
+
+#: pg_ctl.c:2126
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"バグは<%s>に報告してください。\n"
+
+#: pg_ctl.c:2127
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_ctl.c:2152
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: 不正なシャットダウンモード\"%s\"\n"
+
+#: pg_ctl.c:2181
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: 不正なシグナル名\"%s\"\n"
+
+#: pg_ctl.c:2198
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: 不正な起動タイプ\"%s\"\n"
+
+#: pg_ctl.c:2253
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: コマンド\"%s\"を使用するデータディレクトリを決定できませんでした\n"
+
+#: pg_ctl.c:2277
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: 制御ファイルが壊れているようです\n"
+
+#: pg_ctl.c:2345
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: rootでは実行できません\n"
+"サーバープロセスの所有者となる(非特権)ユーザーとして(\"su\"などを使用して)\n"
+"ログインしてください。\n"
+
+#: pg_ctl.c:2428
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: -Sオプションはこのプラットフォームでサポートされていません\n"
+
+#: pg_ctl.c:2465
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: コマンドライン引数が多すぎます(先頭は\"%s\")\n"
+
+#: pg_ctl.c:2491
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: killモード用の引数がありません\n"
+
+#: pg_ctl.c:2509
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: 操作モード\"%s\"は不明です\n"
+
+#: pg_ctl.c:2519
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: 操作モードが指定されていません\n"
+
+#: pg_ctl.c:2540
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: データベースの指定も、PGDATA環境変数の設定もありません\n"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "pcloseが失敗しました: %m"
+
+#~ msgid ""
+#~ "The program \"%s\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "%2$sには\"%1$s\"プログラムが必要ですが、\"%3$s\"と同じディレクトリ\n"
+#~ "にありませんでした。\n"
+#~ "インストール状況を確認してください。\n"
+
+#~ msgid ""
+#~ "The program \"%s\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じ\n"
+#~ "バージョンではありませんでした。\n"
+#~ "インストレーションを検査してください。\n"
+
+#~ msgid ""
+#~ "WARNING: online backup mode is active\n"
+#~ "Shutdown will not complete until pg_stop_backup() is called.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "警告: オンラインバックアップモードが実行中です。\n"
+#~ "pg_stop_backup()が呼び出されるまでシャットダウンは完了しません\n"
+#~ "\n"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "子プロセスがシグナル%dで終了しました"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "子プロセスがシグナル%sで終了しました"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "pcloseが失敗しました: %s"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "シンボリックリンク\"%s\"の読み取りに失敗しました"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "ディレクトリ\"%s\"に移動できませんでした: %s"
+
+#~ msgid "could not identify current directory: %s"
+#~ msgstr "現在のディレクトリを特定できませんでした: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "不具合は<pgsql-bugs@lists.postgresql.org>まで報告してください。\n"
diff --git a/src/bin/pg_ctl/po/ka.po b/src/bin/pg_ctl/po/ka.po
new file mode 100644
index 0000000..495a70c
--- /dev/null
+++ b/src/bin/pg_ctl/po/ka.po
@@ -0,0 +1,939 @@
+# Georgian message translation file for pg_ctl
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_ctl (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:48+0000\n"
+"PO-Revision-Date: 2022-07-05 11:23+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "მიმდინარე საქაღალდის იდენტიფიკაციის პრობლემა: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "არასწორი ბინარული ფაილი \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "ბინარული ფაილის (%s) წაკითხვის შეცდოა"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "გასაშვებად ფაილის \"%s\" პოვნა შეუძლებელია"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "საქაღალდის %s-ზე შეცვლის შეცდომა: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "სიმბოლური ბმის \"%s\" წაკითხვის შეცდომა: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s()-ის შეცდომა: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "არასაკმარისი მეხსიერება"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "არასაკმარისი მეხსიერება\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ნულოვანი მაჩვენებლის დუბლირება შეუძლებელია (შიდა შეცდომა)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "ბრძანება გაშვებადი არაა"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "ბრძანება ვერ ვიპოვე"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "შვილეული პროცესი დასრულდა სტატუსით %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "შვილეული პროცესი დასრულდა გამონაკლისით 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "პროცესი გაჩერდა სიგნალით: %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "შვილეული პროცესი დასრულდა უცნობი სტატუსით %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "მიმდინარე სამუშაო საქაღალდის მიღების შეცდომა: %s\n"
+
+#: pg_ctl.c:260
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: საქაღალდე %s არ არსებობს\n"
+
+#: pg_ctl.c:263
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s საქაღალდესთან %s წვდომის უფლება არ გაქვთ: %s\n"
+
+#: pg_ctl.c:276
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: საქაღალდე \"%s\" ბაზის კლასტერის საქაღალდეს არ წარმოადგენს\n"
+
+#: pg_ctl.c:289
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: PID ფაილის (\"%s\") გახსნის შეცდომა: %s\n"
+
+#: pg_ctl.c:298
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: PID ფაილი \"%s\" ცარიელია\n"
+
+#: pg_ctl.c:301
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: PID ფაილის (\"%s\") არასწორი შიგთავსი\n"
+
+#: pg_ctl.c:464 pg_ctl.c:506
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: სერვერის გაშვების შეცდომა: %s\n"
+
+#: pg_ctl.c:484
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: სერვერის გაშვება შეუძლებელია setsid()-ის შეცდომის გამო: %s\n"
+
+#: pg_ctl.c:554
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: ჟურნალის ფაილის გახსნის შეცდომა \"%s\": %s\n"
+
+#: pg_ctl.c:571
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: სერვერის გაშვება შეუძლებელია: შეცდომის კოდი %lu\n"
+
+#: pg_ctl.c:788
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr ""
+"%s ბირთვის ფაილის ზომის ლიმიტის დაყენება აკრძალულია hardlimit-ის მიერ\n"
+
+#: pg_ctl.c:814
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "ფაილის (%s) წაკითხვის შეცდომა: %s\n"
+
+#: pg_ctl.c:819
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: პარამეტრების ფაილში \"%s\" ზუსტად ერთი ხაზი უნდა იყოს\n"
+
+#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112
+#, c-format
+msgid "%s: could not send stop signal (PID: %ld): %s\n"
+msgstr "%s: გაჩერების სიგნალის გაგზავნა შეუძლებელია (PID: %ld): %s\n"
+
+#: pg_ctl.c:889
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\"\n"
+msgstr ""
+"პროგრამა \"%s\" სჭირდება \"%s\"-ს, მაგრამ იგივე საქაღალდეში, სადაც \"%s"
+"\", ნაპოვნი არაა\n"
+
+#: pg_ctl.c:892
+#, c-format
+msgid ""
+"program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr ""
+"პროგრამა „%s“ ნაპოვნია „%s“-ის მიერ, მაგრამ ვერსია, იგივეა არაა, რაც %s\n"
+
+#: pg_ctl.c:923
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: მონაცემთა ბაზის ინიციალიზაციის შეცდომა\n"
+
+#: pg_ctl.c:938
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: შეიძლება გაშვებულია სხვა სერვერი; გაშვებას მაინც ვეცდები\n"
+
+#: pg_ctl.c:986
+msgid "waiting for server to start..."
+msgstr "სერვერის გაშვების მოლოდინი..."
+
+#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243
+msgid " done\n"
+msgstr " დასრულდა\n"
+
+#: pg_ctl.c:992
+msgid "server started\n"
+msgstr "სერვერი გაეშვა\n"
+
+#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248
+msgid " stopped waiting\n"
+msgstr " ლოდინი შეწყვეტილია\n"
+
+#: pg_ctl.c:996
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: სერვერი დროზე არ გაეშვა\n"
+
+#: pg_ctl.c:1002
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: სერვერის გაშვების შეცდომა\n"
+"შეამოწმეთ ჟურნალის ფაილი.\n"
+
+#: pg_ctl.c:1010
+msgid "server starting\n"
+msgstr "სერვერი ეშვება\n"
+
+#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: PID-ის ფაილი \"%s\" არ არსებობს\n"
+
+#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273
+msgid "Is server running?\n"
+msgstr "სერვერი გაშვებიულია?\n"
+
+#: pg_ctl.c:1036
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: სერვერის გაჩერების შეცდომა; გაშვებულია ერთმომხმარებლიანი სერვერი "
+"(PID: %ld)\n"
+
+#: pg_ctl.c:1051
+msgid "server shutting down\n"
+msgstr "მიმდინარეობს სერვერის გამორთვა\n"
+
+#: pg_ctl.c:1056 pg_ctl.c:1117
+msgid "waiting for server to shut down..."
+msgstr "სერვერის გამორთვის მოლოდინი..."
+
+#: pg_ctl.c:1060 pg_ctl.c:1122
+msgid " failed\n"
+msgstr " წარუმატებელი.\n"
+
+#: pg_ctl.c:1062 pg_ctl.c:1124
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s სერვერი არ გამორთულა\n"
+
+#: pg_ctl.c:1064 pg_ctl.c:1126
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather "
+"than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"მინიშნება: \"-m fast\" პარამეტრი სესიებს მაშინვე წყვეტს,\n"
+"სესიის-ინიცირებული გათიშვის მოლოდინის გარეშე.\n"
+
+#: pg_ctl.c:1070 pg_ctl.c:1132
+msgid "server stopped\n"
+msgstr "სერვერი გამოირთო\n"
+
+#: pg_ctl.c:1091
+msgid "trying to start server anyway\n"
+msgstr "სერვერის მაინც გაშვების მცდელობა\n"
+
+#: pg_ctl.c:1100
+#, c-format
+msgid ""
+"%s: cannot restart server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: სერვერის რესტარტი შეუძლებელია; გაშვებულია ერთმომხმარებლიანი სერვერი "
+"(PID: %ld)\n"
+
+#: pg_ctl.c:1103 pg_ctl.c:1162
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "შეაჩერეთ ერთმომხმარებლიანი სერვერი და თავიდან სცადეთ.\n"
+
+#: pg_ctl.c:1136
+#, c-format
+msgid "%s: old server process (PID: %ld) seems to be gone\n"
+msgstr "%s: სერვერის ძველი პროცესი (PID: %ld) როგორც ჩანს, მოკვდა\n"
+
+#: pg_ctl.c:1138
+msgid "starting server anyway\n"
+msgstr "სერვერის მაინც გაშვება\n"
+
+#: pg_ctl.c:1159
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: სერვერის გადატვირთვის შეცდომა; გაშვებულია ერთმომხმარებლიანი სერვერი "
+"(PID: %ld)\n"
+
+#: pg_ctl.c:1168
+#, c-format
+msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgstr "%s: გადატვირთვის სიგნალის გაგზავნის შეცდომა (PID: %ld): %s\n"
+
+#: pg_ctl.c:1173
+msgid "server signaled\n"
+msgstr "სერვერს სიგნალი გაეგზავნა\n"
+
+#: pg_ctl.c:1198
+#, c-format
+msgid ""
+"%s: cannot promote server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: სერვერის წახალისების შეცდომა; გაშვებულია ერთმომხმარებლიანი სერვერი "
+"(PID: %ld)\n"
+
+#: pg_ctl.c:1206
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s:სერვერის წახალისება შეუძლებელია; სერვერი უქმე რეჟიმში არაა\n"
+
+#: pg_ctl.c:1216
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: წახალისების სიგნალის ფაილის (\"%s\") შექმნა შეუძლებელია: %s\n"
+
+#: pg_ctl.c:1222
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: წახალისების სიგნალის ფაილში (\"%s\") ჩაწერა შეუძლებელია: %s\n"
+
+#: pg_ctl.c:1230
+#, c-format
+msgid "%s: could not send promote signal (PID: %ld): %s\n"
+msgstr "%s: წახალისების სიგნალის გაგზავნა შეუძლებელია(PID: %ld): %s\n"
+
+#: pg_ctl.c:1233
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: წახალისების სიგნალის ფაილის (\"%s\") წაშლის შეცდომა: %s\n"
+
+#: pg_ctl.c:1240
+msgid "waiting for server to promote..."
+msgstr "სერვერის დაწინაურების მოლოდინი..."
+
+#: pg_ctl.c:1244
+msgid "server promoted\n"
+msgstr "სერვერი დაწინაურდა\n"
+
+#: pg_ctl.c:1249
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s სერვერი დროზე არ დაწინაურდა\n"
+
+#: pg_ctl.c:1255
+msgid "server promoting\n"
+msgstr "სერვერის დაწინაურება\n"
+
+#: pg_ctl.c:1279
+#, c-format
+msgid ""
+"%s: cannot rotate log file; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: ჟურნალის ფაილების როტაცია შეუძლებელია; გაშვებულია ერთმომხმარებლიანი "
+"სერვერი (PID: %ld)\n"
+
+#: pg_ctl.c:1289
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr ""
+"%s: ჟურნალის როტაციის სიგნალის ფაილის (\"%s\") შექმნა შეუძლებელია: %s\n"
+
+#: pg_ctl.c:1295
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr ""
+"%s: ჟურნალის როტაციის სიგნალის ფაილში (\"%s\") ჩაწერა შეუძლებელია: %s\n"
+
+#: pg_ctl.c:1303
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %ld): %s\n"
+msgstr "%s ჟურნალის როტაციის სიგნალის გაგზავნის შეცდომა (PID: %ld): %s\n"
+
+#: pg_ctl.c:1306
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr ""
+"%s: ჟურნალის როტაციის სიგნალის ფაილის (\"%s\") წაშლის შეცდომა : %s\n"
+
+#: pg_ctl.c:1311
+msgid "server signaled to rotate log file\n"
+msgstr "სერვერმა გვანიშნა რომ ჟურნალის ფაილი დასატრიალებელია\n"
+
+#: pg_ctl.c:1358
+#, c-format
+msgid "%s: single-user server is running (PID: %ld)\n"
+msgstr "%s: გაშვებულია ერთმომხმარებლიანი სერვერი (PID: %ld)\n"
+
+#: pg_ctl.c:1372
+#, c-format
+msgid "%s: server is running (PID: %ld)\n"
+msgstr "%s: სერვერი გაშვებულია (PID: %ld)\n"
+
+#: pg_ctl.c:1388
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: სერვერი გაშვებული არა\n"
+
+#: pg_ctl.c:1405
+#, c-format
+msgid "%s: could not send signal %d (PID: %ld): %s\n"
+msgstr "%s: სიგნალის (%d) გაგზავნის შეცდომა (PID: %ld): %s\n"
+
+#: pg_ctl.c:1436
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: საკუთარი პროგრამის გამშვები ფაილის პოვნა შეუძლებელია\n"
+
+#: pg_ctl.c:1446
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: გამშვები ფაილი postgres არ არსებობს\n"
+
+#: pg_ctl.c:1516 pg_ctl.c:1550
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: სერვისის მმართველის გახსნის შეცდომა\n"
+
+#: pg_ctl.c:1522
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: სერვისი %s უკვე რეგისტრირებულია\n"
+
+#: pg_ctl.c:1533
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: სერვისის (\"%s\") რეგისტრაციის შეცდომა: შეცდომის კოდი %lu\n"
+
+#: pg_ctl.c:1556
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: სერვისი %s უკვე რეგისტრირებულია\n"
+
+#: pg_ctl.c:1563
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: სერვისის (%s) გახსნა შეუძლებელია: შეცდომის კოდი: %lu\n"
+
+#: pg_ctl.c:1572
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr ""
+"%s: სერვისის (\"%s\") რეგისტრაციის მოხსნა შეუძლებელია: შეცდომის კოდი: "
+"%lu\n"
+
+#: pg_ctl.c:1659
+msgid "Waiting for server startup...\n"
+msgstr "სერვერის გაშვების მოლოდინი...\n"
+
+#: pg_ctl.c:1662
+msgid "Timed out waiting for server startup\n"
+msgstr "სერვერის გაშვების მოლოდინის ვადა გავიდა\n"
+
+#: pg_ctl.c:1666
+msgid "Server started and accepting connections\n"
+msgstr "სერვერი გაეშვა და მზადაა შეერთებისთვის\n"
+
+#: pg_ctl.c:1721
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: სერვისის (%s) გაშვება შეუძლებელია: შეცდომის კოდი %lu\n"
+
+#: pg_ctl.c:1824
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr ""
+"%s: გაფრთხილება: ამ პლატფორმაზე შეზღუდული კოდების შექმნა შეუძლებელია\n"
+
+#: pg_ctl.c:1837
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: პროცესის კოდის გახსნა შეუძლებელია: შეცდომის კოდი %lu\n"
+
+#: pg_ctl.c:1851
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: შეცდომა SSID-ების გამოყოფისას: შეცდომის კოდი %lu\n"
+
+#: pg_ctl.c:1878
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: შეზღუდული კოდის შექმნა ვერ მოხერხდა: შეცდომის კოდი %lu\n"
+
+#: pg_ctl.c:1909
+#, c-format
+msgid ""
+"%s: WARNING: could not locate all job object functions in system API\n"
+msgstr ""
+"%s: გაფრთხილება: სისტემურ API-ში დავალების ობიექტის ყველა ფუნქცია არ "
+"არსებობს\n"
+
+#: pg_ctl.c:2006
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr ""
+"%s: პრივილეგიებისთვის LUID-ების მიღება შეუძლებელია: შეცდომის კოდი: %lu\n"
+
+#: pg_ctl.c:2014 pg_ctl.c:2029
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr ""
+"%s: შეზღუდული კოდის ინფორმაციის მიღება ვერ მოხერხდა: შეცდომის კოდი %lu\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: არასაკმარისი მეხსიერება\n"
+
+#: pg_ctl.c:2053
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'.\n"
+
+#: pg_ctl.c:2061
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL "
+"server.\n"
+"\n"
+msgstr ""
+"%s წარმოადგენს პროგრამას PostgreSQL სერვერის ინიციალიზაციის, გაშვების, "
+"გაჩერების და კონტროლისთვის.\n"
+"\n"
+
+#: pg_ctl.c:2062
+#, c-format
+msgid "Usage:\n"
+msgstr "გამოყენება:\n"
+
+#: pg_ctl.c:2063
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D მონაცემებისსაქაღალდე] [-s] [-o პარამეტრები]\n"
+
+#: pg_ctl.c:2064
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D მონაცემებსსაქაღალდე] [-l ფაილისსახელი] [-W] [-t წამი] "
+"[-s]\n"
+" [-o პარამეტრი] [-p ბილიკი] [-c]\n"
+
+#: pg_ctl.c:2066
+#, c-format
+msgid ""
+" %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr ""
+" %s stop [-D მონაცემებსსაქაღალდე] [-m გამორთვის-რეჟიმი] [-W] [-t "
+"წამი] [-s]\n"
+
+#: pg_ctl.c:2067
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D მონაცემებსსაქაღალდე] [-m გამორთვის-რეჟიმი] [-W] [-t "
+"წამი] [-s]\n"
+" [-o პარამეტრები] [-c]\n"
+
+#: pg_ctl.c:2069
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D მონაცემებსსაქაღალდე] [-s]\n"
+
+#: pg_ctl.c:2070
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D მონაცემებსსაქაღალდე]\n"
+
+#: pg_ctl.c:2071
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D მონაცემებისსაქაღალდე] [-W] [-t წამი] [-s]\n"
+
+#: pg_ctl.c:2072
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D მონაცემებისსაქაღალდე] [-s]\n"
+
+#: pg_ctl.c:2073
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill სიგნალისსახელი PID\n"
+
+#: pg_ctl.c:2075
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P "
+"PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o "
+"OPTIONS]\n"
+msgstr ""
+" %s register [-D მონაცემებსსაქაღალდე] [-N სერვისისსახელი] [-U "
+"მომხმარებელი] [-P პაროლი]\n"
+" [-S გაშვების-ტიპი] [-e წყარო] [-W] [-t წამი] [-s] [-o "
+"პარამეტრები]\n"
+
+#: pg_ctl.c:2077
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N სერვისისსახელი]\n"
+
+#: pg_ctl.c:2080
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"ზოგადი პარამეტრები:\n"
+
+#: pg_ctl.c:2081
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " [-D, --pgdata=]DATADIR ბაზის საცავის მდებარეობა\n"
+
+#: pg_ctl.c:2083
+#, c-format
+msgid ""
+" -e SOURCE event source for logging when running as a "
+"service\n"
+msgstr ""
+" -e SOURCE მოვლენების წყარო სერვისად გაშვებულობის დროს "
+"ჟურნალის ჩასაწერად\n"
+
+#: pg_ctl.c:2085
+#, c-format
+msgid ""
+" -s, --silent only print errors, no informational messages\n"
+msgstr ""
+" -s, --silent მხოლოდ შეცდომების გამოტანა. საინფორმაციო "
+"შეტყობინებები არ გამოჩნდება\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr ""
+" -t, --timeout=წამი -w პარამეტრის გამოყენებისას მითითებული ლოდინის "
+"დრო\n"
+
+#: pg_ctl.c:2087
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: pg_ctl.c:2088
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr ""
+" -w, --wait დალოდება ოპერაციის დასრულებამდე(ნაგულისხმები)\n"
+
+#: pg_ctl.c:2089
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait არ დაელოდება ოპერაციის დასასრულს\n"
+
+#: pg_ctl.c:2090
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: pg_ctl.c:2091
+#, c-format
+msgid ""
+"If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr ""
+"თუ -D პარამეტრი მითითებული არაა, გამოყენებული იქნება გარემოს ცვლადი "
+"PGDATA.\n"
+
+#: pg_ctl.c:2093
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"გაშვების ან თავიდან გაშვების პარამეტრები:\n"
+
+#: pg_ctl.c:2095
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr ""
+" -c, --core-files postgres-ისთვის ბირთვის ფაილების ჩაწერის უფლების "
+"მიცემა\n"
+
+#: pg_ctl.c:2097
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files ამ პლატფორმაზე არ მუშაობს\n"
+
+#: pg_ctl.c:2099
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr ""
+" -l, --log=ფაილისსახელი სერვერის ჟურნალის ფაილში ჩაწერა (ან არსებული "
+"ფაილის ბოლოში მიწერა)\n"
+
+#: pg_ctl.c:2100
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPTIONS postgres-ისთვის (PostgreSQL სერვერი) ან initdb-"
+"სთვის გადასაცემი \n"
+" ბრძანების სტრიქონის "
+"პარამეტრები \n"
+
+#: pg_ctl.c:2102
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p ბილიკი-POSTGRES-მდე ჩვეულებრივ საჭირო არაა\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"გაჩერებისა და გადატვირთვის პარამეტრები:\n"
+
+#: pg_ctl.c:2104
+#, c-format
+msgid ""
+" -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate"
+"\"\n"
+msgstr ""
+" -m, --mode=რეჟიმი რეჟიმი შეიძლება იყოს: (ჭკვიანი)\"smart\", "
+"(ჩქარი)\"fast\", ან (ახლავე)\"immediate\"\n"
+
+#: pg_ctl.c:2106
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"გამორთვის რეჟიმებია:\n"
+
+#: pg_ctl.c:2107
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart გასვლა, როცა ყველა კლიენტი გაითიშება\n"
+
+#: pg_ctl.c:2108
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast პირდაპირ გასვლა, სწორად გამორთვით (ნაგულისხმები)\n"
+
+#: pg_ctl.c:2109
+#, c-format
+msgid ""
+" immediate quit without complete shutdown; will lead to recovery on "
+"restart\n"
+msgstr ""
+" immediate სრული გათიშვის გარეშე გასვლა; დიდი ალბათობით შემდეგ "
+"გაშვებაზე მონაცემების აღდგენა მოგიწევთ\n"
+
+#: pg_ctl.c:2111
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"მოსაკლავად დაშვებული სიგნალის სახელები:\n"
+
+#: pg_ctl.c:2115
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"რეგისტრაციისა და მისი მოხსნის პარამეტრები:\n"
+
+#: pg_ctl.c:2116
+#, c-format
+msgid ""
+" -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr ""
+" -N სერვისისსახელი სერვისის სახელი, რომელიც PostgreSQL სერვერი "
+"დარეგისტრირდება\n"
+
+#: pg_ctl.c:2117
+#, c-format
+msgid ""
+" -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr ""
+" -P პაროლი PostgreSQL სერვერის დასარეგისტრირებელი მომხმარებლის "
+"პაროლი\n"
+
+#: pg_ctl.c:2118
+#, c-format
+msgid ""
+" -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr ""
+" -U მომხმარებელი PostgreSQL სერვერის დასარეგისტრირებელი მომხმარებლის "
+"სახელი\n"
+
+#: pg_ctl.c:2119
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S გაშვების ტიპი PostgreSQL სერვერის გაშვების ტიპი\n"
+
+#: pg_ctl.c:2121
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"გაშვების ტიპები:\n"
+
+#: pg_ctl.c:2122
+#, c-format
+msgid ""
+" auto start service automatically during system startup (default)\n"
+msgstr ""
+" auto სერვისი ავტომატურად გაეშვება სისტემის ჩატვირთვისას "
+"(ნაგულისხმები)\n"
+
+#: pg_ctl.c:2123
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand საჭიროების მიხედვით\n"
+
+#: pg_ctl.c:2126
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდომების შესახებ მიწერეთ: %s\n"
+
+#: pg_ctl.c:2127
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
+
+#: pg_ctl.c:2152
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: მუშაობის დასრულების უცნობი რეჟიმი: \"%s\"\n"
+
+#: pg_ctl.c:2181
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: სიგნალის უცნობი სახელი: \"%s\"\n"
+
+#: pg_ctl.c:2198
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: გაშვების უცნობი ტიპი \"%s\"\n"
+
+#: pg_ctl.c:2253
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: შეუძლებელია მონაცემების საქაღალდის პოვნა ბრძანებით \"%s\"\n"
+
+#: pg_ctl.c:2277
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: როგორც ჩანს, საკონტროლო ფაილი დაზიანებულია\n"
+
+#: pg_ctl.c:2345
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: არ შეიძლება გაშვებული როგორც root \n"
+"გთხოვთ შეხვიდეთ (მაგ. \"su\"-ის გამოყენებით) როგორც (არაპრივილეგირებული)\n"
+"მომხმარებელი, რომელიც ფლობს სერვერის პროცესს.\n"
+
+#: pg_ctl.c:2428
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: პარამეტრი -S ამ პლატფორმაზე მხარდაუჭერელია\n"
+
+#: pg_ctl.c:2465
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr ""
+"%s: მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")\n"
+
+#: pg_ctl.c:2491
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: ნაკლული არგუმენტები მოკვლის რეჟიმისთვის\n"
+
+#: pg_ctl.c:2509
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: ოპერაციის უცნობი რეჟიმი \"%s\"\n"
+
+#: pg_ctl.c:2519
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: ოპერაცია მითითებული არაა\n"
+
+#: pg_ctl.c:2540
+#, c-format
+msgid ""
+"%s: no database directory specified and environment variable PGDATA "
+"unset\n"
+msgstr "%s: ბაზის საქაღალდე და გარემოს ცვლადი PGDATA მითითებული არაა\n"
diff --git a/src/bin/pg_ctl/po/ko.po b/src/bin/pg_ctl/po/ko.po
new file mode 100644
index 0000000..349cb38
--- /dev/null
+++ b/src/bin/pg_ctl/po/ko.po
@@ -0,0 +1,911 @@
+# Korean message translation file for PostgreSQL pg_ctl
+# Ioseph Kim <ioseph@uri.sarang.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:47+0000\n"
+"PO-Revision-Date: 2023-04-05 18:07+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean Team <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "현재 디렉터리를 알 수 없음: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "잘못된 바이너리 파일 \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "\"%s\" 바이너리 파일을 읽을 수 없음"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "실행할 \"%s\" 파일을 찾을 수 없음"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "\"%s\" 이름의 디렉터리로 이동할 수 없습니다: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "\"%s\" 심벌릭 링크를 읽을 수 없음: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 실패: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "메모리 부족"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null 포인터를 복제할 수 없음(내부 오류)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "명령을 실행할 수 없음"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "명령어를 찾을 수 없음"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "하위 프로세스가 종료되었음, 종료 코드 %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "0x%X 예외처리로 하위 프로세스가 종료되었음"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "하위 프로세스가 종료되었음, 시그널 %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "하위 프로세스가 종료되었음, 알수 없는 상태 %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "현재 작업 디렉터리를 알 수 없음: %s\n"
+
+#: pg_ctl.c:260
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: \"%s\" 디렉터리 없음\n"
+
+#: pg_ctl.c:263
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: \"%s\" 디렉터리에 액세스할 수 없음: %s\n"
+
+#: pg_ctl.c:276
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: 지정한 \"%s\" 디렉터리는 데이터베이스 클러스트 디렉터리가 아님\n"
+
+#: pg_ctl.c:289
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: \"%s\" PID 파일을 열 수 없음: %s\n"
+
+#: pg_ctl.c:298
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: \"%s\" PID 파일에 내용이 없습니다\n"
+
+#: pg_ctl.c:301
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: \"%s\" PID 파일이 비었음\n"
+
+#: pg_ctl.c:464 pg_ctl.c:506
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: 서버를 시작 할 수 없음: %s\n"
+
+#: pg_ctl.c:484
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: setsid() 실패로 서버를 시작 할 수 없음: %s\n"
+
+#: pg_ctl.c:554
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: \"%s\" 로그 파일을 열 수 없음: %s\n"
+
+#: pg_ctl.c:571
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: 서버를 시작할 수 없음: 오류 코드 %lu\n"
+
+#: pg_ctl.c:788
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr ""
+"%s: 코어 파일 크기 한도를 설정할 수 없음, 하드 디스크 용량 초과로 허용되지 않"
+"음\n"
+
+#: pg_ctl.c:814
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: \"%s\" 파일을 읽을 수 없음\n"
+
+#: pg_ctl.c:819
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: \"%s\" 환경설정파일은 반드시 한 줄을 가져야한다?\n"
+
+#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112
+#, c-format
+msgid "%s: could not send stop signal (PID: %ld): %s\n"
+msgstr "%s: stop 시그널을 보낼 수 없음 (PID: %ld): %s\n"
+
+#: pg_ctl.c:889
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\"\n"
+msgstr ""
+"\"%s\" 프로그램이 %s 작업에서 필요합니다. 그런데, 이 파일이\n"
+"\"%s\" 파일이 있는 디렉터리안에 없습니다.\n"
+
+#: pg_ctl.c:892
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr ""
+"\"%s\" 프로그램을 \"%s\" 작업 때문에 찾았지만 이 파일은\n"
+"%s 프로그램의 버전과 다릅니다.\n"
+
+#: pg_ctl.c:923
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: 데이터베이스 초기화 실패\n"
+
+#: pg_ctl.c:938
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: 다른 서버가 가동 중인 것 같음; 어째든 서버 가동을 시도함\n"
+
+#: pg_ctl.c:986
+msgid "waiting for server to start..."
+msgstr "서버를 시작하기 위해 기다리는 중..."
+
+#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243
+msgid " done\n"
+msgstr " 완료\n"
+
+#: pg_ctl.c:992
+msgid "server started\n"
+msgstr "서버 시작됨\n"
+
+#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248
+msgid " stopped waiting\n"
+msgstr " 중지 기다리는 중\n"
+
+#: pg_ctl.c:996
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: 서버가 제 시간에 시작되지 못했음\n"
+
+#: pg_ctl.c:1002
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: 서버를 시작 할 수 없음\n"
+"로그 출력을 살펴보십시오.\n"
+
+#: pg_ctl.c:1010
+msgid "server starting\n"
+msgstr "서버를 시작합니다\n"
+
+#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: \"%s\" PID 파일이 없습니다\n"
+
+#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273
+msgid "Is server running?\n"
+msgstr "서버가 실행 중입니까?\n"
+
+#: pg_ctl.c:1036
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n"
+msgstr "%s: 서버 중지 실패; 단일 사용자 서버가 실행 중 (PID: %ld)\n"
+
+#: pg_ctl.c:1051
+msgid "server shutting down\n"
+msgstr "서버를 멈춥니다\n"
+
+#: pg_ctl.c:1056 pg_ctl.c:1117
+msgid "waiting for server to shut down..."
+msgstr "서버를 멈추기 위해 기다리는 중..."
+
+#: pg_ctl.c:1060 pg_ctl.c:1122
+msgid " failed\n"
+msgstr " 실패\n"
+
+#: pg_ctl.c:1062 pg_ctl.c:1124
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: 서버를 멈추지 못했음\n"
+
+#: pg_ctl.c:1064 pg_ctl.c:1126
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"힌트: \"-m fast\" 옵션을 사용하면 접속한 세션들을 즉시 정리합니다.\n"
+"이 옵션을 사용하지 않으면 접속한 세션들 스스로 끊을 때까지 기다립니다.\n"
+
+#: pg_ctl.c:1070 pg_ctl.c:1132
+msgid "server stopped\n"
+msgstr "서버 멈추었음\n"
+
+#: pg_ctl.c:1091
+msgid "trying to start server anyway\n"
+msgstr "어째든 서버를 시작해 봅니다\n"
+
+#: pg_ctl.c:1100
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: 서버를 다시 시작 할 수 없음; 단일사용자 서버가 실행 중임 (PID: %ld)\n"
+
+#: pg_ctl.c:1103 pg_ctl.c:1162
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "단일 사용자 서버를 멈추고 다시 시도하십시오.\n"
+
+#: pg_ctl.c:1136
+#, c-format
+msgid "%s: old server process (PID: %ld) seems to be gone\n"
+msgstr "%s: 이전 서버 프로세스(PID: %ld)가 없어졌습니다\n"
+
+#: pg_ctl.c:1138
+msgid "starting server anyway\n"
+msgstr "어째든 서버를 시작합니다\n"
+
+#: pg_ctl.c:1159
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: 서버 환경설정을 다시 불러올 수 없음; 단일 사용자 서버가 실행 중임 (PID: "
+"%ld)\n"
+
+#: pg_ctl.c:1168
+#, c-format
+msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgstr "%s: reload 시그널을 보낼 수 없음 (PID: %ld): %s\n"
+
+#: pg_ctl.c:1173
+msgid "server signaled\n"
+msgstr "서버가 시스템 시그널을 받았음\n"
+
+#: pg_ctl.c:1198
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n"
+msgstr "%s: 운영서버 전환 실패; 단일사용자 서버가 실행 중(PID: %ld)\n"
+
+#: pg_ctl.c:1206
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: 운영서버 전환 실패; 서버가 대기 모드로 상태가 아님\n"
+
+#: pg_ctl.c:1216
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: 운영전환 시그널 파일인 \"%s\" 파일을 만들 수 없음: %s\n"
+
+#: pg_ctl.c:1222
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: 운영전환 시그널 파일인 \"%s\" 파일에 쓰기 실패: %s\n"
+
+#: pg_ctl.c:1230
+#, c-format
+msgid "%s: could not send promote signal (PID: %ld): %s\n"
+msgstr "%s: 운영전환 시그널을 서버(PID: %ld)로 보낼 수 없음: %s\n"
+
+#: pg_ctl.c:1233
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: 운영전환 시그널 파일인 \"%s\" 파일을 지울 수 없음: %s\n"
+
+#: pg_ctl.c:1240
+msgid "waiting for server to promote..."
+msgstr "서버를 운영 모드로 전환하는 중 ..."
+
+#: pg_ctl.c:1244
+msgid "server promoted\n"
+msgstr "운영 모드 전환 완료\n"
+
+#: pg_ctl.c:1249
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: 서버를 제 시간에 운영 모드로 전환하지 못했음\n"
+
+#: pg_ctl.c:1255
+msgid "server promoting\n"
+msgstr "서버를 운영 모드로 전환합니다\n"
+
+#: pg_ctl.c:1279
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: 서버 로그 파일을 바꿀 수 없음; 단일 사용자 서버가 실행 중임 (PID: %ld)\n"
+
+#: pg_ctl.c:1289
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: 로그 전환 시그널 파일인 \"%s\" 파일을 만들 수 없음: %s\n"
+
+#: pg_ctl.c:1295
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: 로그 전환 시그널 파일인 \"%s\" 파일에 쓰기 실패: %s\n"
+
+#: pg_ctl.c:1303
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %ld): %s\n"
+msgstr "%s: 로그 전환 시그널을 보낼 수 없음 (PID: %ld): %s\n"
+
+#: pg_ctl.c:1306
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: 로그 전환 시그널 파일인 \"%s\" 파일을 지울 수 없음: %s\n"
+
+#: pg_ctl.c:1311
+msgid "server signaled to rotate log file\n"
+msgstr "서버가 로그 전환 시그널을 받았음\n"
+
+#: pg_ctl.c:1358
+#, c-format
+msgid "%s: single-user server is running (PID: %ld)\n"
+msgstr "%s: 단일사용자 서버가 실행 중임 (PID: %ld)\n"
+
+#: pg_ctl.c:1372
+#, c-format
+msgid "%s: server is running (PID: %ld)\n"
+msgstr "%s: 서버가 실행 중임 (PID: %ld)\n"
+
+#: pg_ctl.c:1388
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: 가동 중인 서버가 없음\n"
+
+#: pg_ctl.c:1405
+#, c-format
+msgid "%s: could not send signal %d (PID: %ld): %s\n"
+msgstr "%s: %d 시그널을 보낼 수 없음 (PID: %ld): %s\n"
+
+#: pg_ctl.c:1436
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 실행 가능한 프로그램을 찾을 수 없습니다\n"
+
+#: pg_ctl.c:1446
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: 실행 가능한 postgres 프로그램을 찾을 수 없음\n"
+
+#: pg_ctl.c:1516 pg_ctl.c:1550
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: 서비스 관리자를 열 수 없음\n"
+
+#: pg_ctl.c:1522
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: \"%s\" 서비스가 이미 등록 되어 있음\n"
+
+#: pg_ctl.c:1533
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: \"%s\" 서비스를 등록할 수 없음: 오류 코드 %lu\n"
+
+#: pg_ctl.c:1556
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: \"%s\" 서비스가 등록되어 있지 않음\n"
+
+#: pg_ctl.c:1563
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: \"%s\" 서비스를 열 수 없음: 오류 코드 %lu\n"
+
+#: pg_ctl.c:1572
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: \"%s\" 서비스를 서비스 목록에서 뺄 수 없음: 오류 코드 %lu\n"
+
+#: pg_ctl.c:1659
+msgid "Waiting for server startup...\n"
+msgstr "서버를 시작하기 위해 기다리는 중...\n"
+
+#: pg_ctl.c:1662
+msgid "Timed out waiting for server startup\n"
+msgstr "서버 시작을 기다리는 동안 시간 초과됨\n"
+
+#: pg_ctl.c:1666
+msgid "Server started and accepting connections\n"
+msgstr "서버가 시작되었으며 연결을 허용함\n"
+
+#: pg_ctl.c:1721
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: \"%s\" 서비스를 시작할 수 없음: 오류 코드 %lu\n"
+
+#: pg_ctl.c:1824
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: 경고: 이 운영체제에서 restricted token을 만들 수 없음\n"
+
+#: pg_ctl.c:1837
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: 프로세스 토큰을 열 수 없음: 오류 코드 %lu\n"
+
+#: pg_ctl.c:1851
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: SID를 할당할 수 없음: 오류 코드 %lu\n"
+
+#: pg_ctl.c:1878
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: restricted token을 만들 수 없음: 오류 코드 %lu\n"
+
+#: pg_ctl.c:1909
+#, c-format
+msgid "%s: WARNING: could not locate all job object functions in system API\n"
+msgstr "%s: 경고: 시스템 API에서 모든 job 객체 함수를 찾을 수 없음\n"
+
+#: pg_ctl.c:2006
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: 접근 권한용 LUID를 구할 수 없음: 오류 코드 %lu\n"
+
+#: pg_ctl.c:2014 pg_ctl.c:2029
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: 토큰 정보를 구할 수 없음: 오류 코드 %lu\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: 메모리 부족\n"
+
+#: pg_ctl.c:2053
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "보다 자세한 사용법은 \"%s --help\"\n"
+
+#: pg_ctl.c:2061
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 PostgreSQL 서버를 초기화, 시작, 중지, 제어하는 도구입니다.\n"
+"\n"
+
+#: pg_ctl.c:2062
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_ctl.c:2063
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D 데이터디렉터리] [-s] [-o 옵션]\n"
+
+#: pg_ctl.c:2064
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D 데이터디렉터리] [-l 파일이름] [-W] [-t 초] [-s]\n"
+" [-o 옵션] [-p 경로] [-c]\n"
+
+#: pg_ctl.c:2066
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D 데이터디렉터리] [-m 중지방법] [-W] [-t 초] [-s]\n"
+
+#: pg_ctl.c:2067
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D 데이터디렉터리] [-m 중지방법] [-W] [-t 초] [-s]\n"
+" [-o 옵션] [-c]\n"
+
+#: pg_ctl.c:2069
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D 데이터디렉터리] [-s]\n"
+
+#: pg_ctl.c:2070
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D 데이터디렉터리]\n"
+
+#: pg_ctl.c:2071
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D 데이터디렉터리] [-W] [-t 초] [-s]\n"
+
+#: pg_ctl.c:2072
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D 데이터디렉터리] [-s]\n"
+
+#: pg_ctl.c:2073
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill 시그널이름 PID\n"
+
+#: pg_ctl.c:2075
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o "
+"OPTIONS]\n"
+msgstr ""
+" %s register [-D 데이터디렉터리] [-N 서비스이름] [-U 사용자이름] [-P 암"
+"호]\n"
+" [-S 시작형태] [-e SOURCE] [-w] [-t 초] [-o 옵션]\n"
+
+#: pg_ctl.c:2077
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N 서비스이름]\n"
+
+#: pg_ctl.c:2080
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"일반 옵션들:\n"
+
+#: pg_ctl.c:2081
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr ""
+" -D, --pgdata=데이터디렉터리 데이터베이스 자료가 저장되어있는 디렉터리\n"
+
+#: pg_ctl.c:2083
+#, c-format
+msgid ""
+" -e SOURCE event source for logging when running as a service\n"
+msgstr ""
+" -e SOURCE 서비스가 실행 중일때 쌓을 로그를 위한 이벤트 소스\n"
+
+#: pg_ctl.c:2085
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr ""
+" -s, --silent 일반적인 메시지는 보이지 않고, 오류만 보여줌\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=초 -w 옵션 사용 시 대기 시간(초)\n"
+
+#: pg_ctl.c:2087
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_ctl.c:2088
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait 작업이 끝날 때까지 기다림 (기본값)\n"
+
+#: pg_ctl.c:2089
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait 작업이 끝날 때까지 기다리지 않음\n"
+
+#: pg_ctl.c:2090
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: pg_ctl.c:2091
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "-D 옵션을 사용하지 않으면, PGDATA 환경변수값을 사용함.\n"
+
+#: pg_ctl.c:2093
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"start, restart 때 사용할 수 있는 옵션들:\n"
+
+#: pg_ctl.c:2095
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files 코어 덤프 파일을 만듬\n"
+
+#: pg_ctl.c:2097
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files 이 플랫폼에서는 사용할 수 없음\n"
+
+#: pg_ctl.c:2099
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=로그파일 서버 로그를 이 로그파일에 기록함\n"
+
+#: pg_ctl.c:2100
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=옵션들 PostgreSQL 서버프로그램인 postgres나 initdb\n"
+" 명령에서 사용할 명령행 옵션들\n"
+
+#: pg_ctl.c:2102
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p PATH-TO-POSTGRES 보통은 필요치 않음\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"stop, restart 때 사용 할 수 있는 옵션들:\n"
+
+#: pg_ctl.c:2104
+#, c-format
+msgid ""
+" -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr ""
+" -m, --mode=모드 모드는 \"smart\", \"fast\", \"immediate\" 중 하나\n"
+
+#: pg_ctl.c:2106
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"중지방법 설명:\n"
+
+#: pg_ctl.c:2107
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart 모든 클라이언트의 연결이 끊기게 되면 중지 됨\n"
+
+#: pg_ctl.c:2108
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr ""
+" fast 클라이언트의 연결을 강제로 끊고 정상적으로 중지 됨 (기본값)\n"
+
+#: pg_ctl.c:2109
+#, c-format
+msgid ""
+" immediate quit without complete shutdown; will lead to recovery on "
+"restart\n"
+msgstr ""
+" immediate 그냥 무조건 중지함; 다시 시작할 때 복구 작업을 할 수도 있음\n"
+
+#: pg_ctl.c:2111
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"사용할 수 있는 중지용(for kill) 시그널 이름:\n"
+
+#: pg_ctl.c:2115
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"서비스 등록/제거용 옵션들:\n"
+
+#: pg_ctl.c:2116
+#, c-format
+msgid ""
+" -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N SERVICENAME 서비스 목록에 등록될 PostgreSQL 서비스 이름\n"
+
+#: pg_ctl.c:2117
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P PASSWORD 이 서비스를 실행할 사용자의 암호\n"
+
+#: pg_ctl.c:2118
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U USERNAME 이 서비스를 실행할 사용자 이름\n"
+
+#: pg_ctl.c:2119
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S 시작형태 서비스로 등록된 PostgreSQL 서버 시작 방법\n"
+
+#: pg_ctl.c:2121
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"시작형태 설명:\n"
+
+#: pg_ctl.c:2122
+#, c-format
+msgid ""
+" auto start service automatically during system startup (default)\n"
+msgstr " auto 시스템이 시작되면 자동으로 서비스가 시작됨 (초기값)\n"
+
+#: pg_ctl.c:2123
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand 수동 시작\n"
+
+#: pg_ctl.c:2126
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"문제점 보고 주소: <%s>\n"
+
+#: pg_ctl.c:2127
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: pg_ctl.c:2152
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: 잘못된 중지 방법 \"%s\"\n"
+
+#: pg_ctl.c:2181
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: 잘못된 시그널 이름 \"%s\"\n"
+
+#: pg_ctl.c:2198
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: 알 수 없는 시작형태 \"%s\"\n"
+
+#: pg_ctl.c:2253
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: \"%s\" 명령에서 사용할 데이터 디렉터리를 알 수 없음\n"
+
+#: pg_ctl.c:2277
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: 컨트롤 파일이 깨졌음\n"
+
+#: pg_ctl.c:2345
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: root로 이 프로그램을 실행하지 마십시오\n"
+"시스템관리자 권한이 없는, 서버프로세스의 소유주가 될 일반 사용자로\n"
+"로그인 해서(\"su\", \"runas\" 같은 명령 이용) 실행하십시오.\n"
+
+#: pg_ctl.c:2428
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: -S 옵션은 이 운영체제에서는 지원하지 않음\n"
+
+#: pg_ctl.c:2465
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: 너무 많은 명령행 인수들 (시작 \"%s\")\n"
+
+#: pg_ctl.c:2491
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: kill 작업에 필요한 인수가 빠졌습니다\n"
+
+#: pg_ctl.c:2509
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: 알 수 없는 작업 모드 \"%s\"\n"
+
+#: pg_ctl.c:2519
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: 수행할 작업을 지정하지 않았습니다\n"
+
+#: pg_ctl.c:2540
+#, c-format
+msgid ""
+"%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: -D 옵션도 없고, PGDATA 환경변수값도 지정되어 있지 않습니다.\n"
+
+#, c-format
+#~ msgid ""
+#~ "The program \"%s\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "\"%s\" 프로그램은 %s 에서 필요로 합니다. 그런데, 이 파일이\n"
+#~ "\"%s\" 디렉터리 안에 없습니다.\n"
+#~ "설치 상태를 확인해 주십시오.\n"
+
+#, c-format
+#~ msgid ""
+#~ "The program \"%s\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "\"%s\" 프로그램을 \"%s\" 에서 필요해서 찾았지만 이 파일은\n"
+#~ "%s 버전과 같지 않습니다.\n"
+#~ "설치 상태를 확인해 주십시오.\n"
+
+#~ msgid ""
+#~ "WARNING: online backup mode is active\n"
+#~ "Shutdown will not complete until pg_stop_backup() is called.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "경고: 온라인 백업 모드가 활성 상태입니다.\n"
+#~ "pg_stop_backup()이 호출될 때까지 종료가 완료되지 않습니다.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "pclose failed: %m"
+#~ msgstr "pclose 실패: %m"
diff --git a/src/bin/pg_ctl/po/pt_BR.po b/src/bin/pg_ctl/po/pt_BR.po
new file mode 100644
index 0000000..088b764
--- /dev/null
+++ b/src/bin/pg_ctl/po/pt_BR.po
@@ -0,0 +1,852 @@
+# Brazilian Portuguese message translation file for pg_ctl
+#
+# Copyright (C) 2004-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Euler Taveira <euler@eulerto.com>, 2004-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-10 18:27-0300\n"
+"PO-Revision-Date: 2005-10-04 22:15-0300\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "não pôde identificar diretório atual: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binário \"%s\" é inválido"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "não pôde ler o binário \"%s\""
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "não pôde encontrar o \"%s\" para executá-lo"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "não pôde mudar diretório para \"%s\": %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "não pôde ler link simbólico \"%s\": %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falhou: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "sem memória"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "sem memória\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "não pode duplicar ponteiro nulo (erro interno)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "comando não é executável"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "comando não foi encontrado"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "processo filho terminou com código de saída %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "processo filho foi terminado pela exceção 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "processo filho foi terminado pelo sinal %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "processo filho terminou com status desconhecido %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "não pôde obter diretório de trabalho atual: %s\n"
+
+#: pg_ctl.c:260
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: diretório \"%s\" não existe\n"
+
+#: pg_ctl.c:263
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: não pôde acessar diretório \"%s\": %s\n"
+
+#: pg_ctl.c:276
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: diretório \"%s\" não é um diretório de agrupamento de banco dados\n"
+
+#: pg_ctl.c:289
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: não pôde abrir arquivo do PID \"%s\": %s\n"
+
+#: pg_ctl.c:298
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: arquivo do PID \"%s\" está vazio\n"
+
+#: pg_ctl.c:301
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: dado inválido no arquivo do PID \"%s\"\n"
+
+#: pg_ctl.c:464 pg_ctl.c:506
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: não pôde iniciar servidor: %s\n"
+
+#: pg_ctl.c:484
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: não pôde iniciar servidor devido a falha no setsid(): %s\n"
+
+#: pg_ctl.c:554
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: não pôde abrir arquivo de log \"%s\": %s\n"
+
+#: pg_ctl.c:571
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: não pôde iniciar servidor: código de erro %lu\n"
+
+#: pg_ctl.c:788
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: não pode definir tamanho limite do arquivo core; não é permitido pelo limite superior\n"
+
+#: pg_ctl.c:814
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: não pôde ler arquivo \"%s\"\n"
+
+#: pg_ctl.c:819
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: arquivo de opções \"%s\" deve ter exatamente uma linha\n"
+
+#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112
+#, c-format
+msgid "%s: could not send stop signal (PID: %ld): %s\n"
+msgstr "%s: não pôde enviar sinal de parada (PID: %ld): %s\n"
+
+#: pg_ctl.c:889
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "O programa \"%s\" é requerido pelo %s mas não foi encontrado no mesmo diretório que \"%s\"\n"
+
+#: pg_ctl.c:892
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "O programa \"%s\" foi encontrado pelo \"%s\" mas não tem a mesma versão que %s\n"
+
+#: pg_ctl.c:923
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: inicialização do sistema de banco de dados falhou\n"
+
+#: pg_ctl.c:938
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: outro servidor pode estar executando; tentando iniciar o servidor assim mesmo\n"
+
+#: pg_ctl.c:986
+msgid "waiting for server to start..."
+msgstr "esperando o servidor iniciar..."
+
+#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243
+msgid " done\n"
+msgstr "feito\n"
+
+#: pg_ctl.c:992
+msgid "server started\n"
+msgstr "servidor iniciado\n"
+
+#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248
+msgid " stopped waiting\n"
+msgstr "parou de esperar\n"
+
+#: pg_ctl.c:996
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: servidor não iniciou a tempo\n"
+
+#: pg_ctl.c:1002
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: não pode iniciar o servidor\n"
+"Examine o arquivo de log.\n"
+
+#: pg_ctl.c:1010
+msgid "server starting\n"
+msgstr "servidor está iniciando\n"
+
+#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: arquivo do PID \"%s\" não existe\n"
+
+#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273
+msgid "Is server running?\n"
+msgstr "O servidor está executando?\n"
+
+#: pg_ctl.c:1036
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n"
+msgstr "%s: não pode parar servidor; servidor monousuário está executando (PID: %ld)\n"
+
+#: pg_ctl.c:1051
+msgid "server shutting down\n"
+msgstr "servidor está desligando\n"
+
+#: pg_ctl.c:1056 pg_ctl.c:1117
+msgid "waiting for server to shut down..."
+msgstr "esperando o servidor desligar..."
+
+#: pg_ctl.c:1060 pg_ctl.c:1122
+msgid " failed\n"
+msgstr "falhou\n"
+
+#: pg_ctl.c:1062 pg_ctl.c:1124
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: servidor não desligou\n"
+
+#: pg_ctl.c:1064 pg_ctl.c:1126
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr "DICA: A opção \"-m fast\" desconecta imediatamente sessões ao invés de esperar pela desconexão das sessões iniciadas.\n"
+
+#: pg_ctl.c:1070 pg_ctl.c:1132
+msgid "server stopped\n"
+msgstr "servidor está parado\n"
+
+#: pg_ctl.c:1091
+msgid "trying to start server anyway\n"
+msgstr "tentando iniciar servidor mesmo assim\n"
+
+#: pg_ctl.c:1100
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n"
+msgstr "%s: não pode reiniciar servidor; servidor monousuário está executando (PID: %ld)\n"
+
+#: pg_ctl.c:1103 pg_ctl.c:1162
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Por favor finalize o servidor monousuário e tente novamente.\n"
+
+#: pg_ctl.c:1136
+#, c-format
+msgid "%s: old server process (PID: %ld) seems to be gone\n"
+msgstr "%s: processo servidor antigo (PID: %ld) parece estar terminado\n"
+
+#: pg_ctl.c:1138
+msgid "starting server anyway\n"
+msgstr "iniciando servidor mesmo assim\n"
+
+#: pg_ctl.c:1159
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgstr "%s: não pode recarregar servidor; servidor monousuário está executando (PID: %ld)\n"
+
+#: pg_ctl.c:1168
+#, c-format
+msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgstr "%s: não pôde enviar sinal de recarga (PID: %ld): %s\n"
+
+#: pg_ctl.c:1173
+msgid "server signaled\n"
+msgstr "servidor foi sinalizado\n"
+
+#: pg_ctl.c:1198
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n"
+msgstr "%s: não pode promover servidor; servidor monousuário está executando (PID: %ld)\n"
+
+#: pg_ctl.c:1206
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: não pode promover servidor; servidor não está no modo em espera\n"
+
+#: pg_ctl.c:1216
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: não pôde criar arquivo de sinal de promoção \"%s\": %s\n"
+
+#: pg_ctl.c:1222
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: não pôde escrever no arquivo de sinal de promoção \"%s\": %s\n"
+
+#: pg_ctl.c:1230
+#, c-format
+msgid "%s: could not send promote signal (PID: %ld): %s\n"
+msgstr "%s: não pôde enviar sinal de promoção (PID: %ld): %s\n"
+
+#: pg_ctl.c:1233
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: não pôde remover arquivo de sinal de promoção \"%s\": %s\n"
+
+#: pg_ctl.c:1240
+msgid "waiting for server to promote..."
+msgstr "esperando servidor ser promovido..."
+
+#: pg_ctl.c:1244
+msgid "server promoted\n"
+msgstr "servidor promovido\n"
+
+#: pg_ctl.c:1249
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: servidor não foi promovido a tempo\n"
+
+#: pg_ctl.c:1255
+msgid "server promoting\n"
+msgstr "servidor está sendo promovido\n"
+
+#: pg_ctl.c:1279
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n"
+msgstr "%s: não pode rotacionar log do servidor; servidor monousuário está executando (PID: %ld)\n"
+
+#: pg_ctl.c:1289
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: não pôde criar arquivo de sinal de rotação de log \"%s\": %s\n"
+
+#: pg_ctl.c:1295
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: não pôde escrever no arquivo de sinal de rotação de log \"%s\": %s\n"
+
+#: pg_ctl.c:1303
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %ld): %s\n"
+msgstr "%s: não pôde enviar sinal de rotação de log (PID: %ld): %s\n"
+
+#: pg_ctl.c:1306
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: não pôde remover arquivo de sinal de rotação de log \"%s\": %s\n"
+
+#: pg_ctl.c:1311
+msgid "server signaled to rotate log file\n"
+msgstr "servidor sinalizado para rotacionar arquivo de log\n"
+
+#: pg_ctl.c:1358
+#, c-format
+msgid "%s: single-user server is running (PID: %ld)\n"
+msgstr "%s: servidor monousuário está executando (PID: %ld)\n"
+
+#: pg_ctl.c:1372
+#, c-format
+msgid "%s: server is running (PID: %ld)\n"
+msgstr "%s: servidor está executando (PID: %ld)\n"
+
+#: pg_ctl.c:1388
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: nenhum servidor está executando\n"
+
+#: pg_ctl.c:1405
+#, c-format
+msgid "%s: could not send signal %d (PID: %ld): %s\n"
+msgstr "%s: não pôde enviar sinal %d (PID: %ld): %s\n"
+
+#: pg_ctl.c:1436
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: não pôde encontrar executável\n"
+
+#: pg_ctl.c:1446
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: não pôde encontrar o programa executável do postgres\n"
+
+#: pg_ctl.c:1516 pg_ctl.c:1550
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: não pôde abrir gerenciador de serviço\n"
+
+#: pg_ctl.c:1522
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: serviço \"%s\" já está registrado\n"
+
+#: pg_ctl.c:1533
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: não pôde registrar serviço \"%s\": código de erro %lu\n"
+
+#: pg_ctl.c:1556
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: serviço \"%s\" não está registrado\n"
+
+#: pg_ctl.c:1563
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: não pôde abrir serviço \"%s\": código de erro %lu\n"
+
+#: pg_ctl.c:1572
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: não pôde remover registro do serviço \"%s\": código de erro %lu\n"
+
+#: pg_ctl.c:1659
+msgid "Waiting for server startup...\n"
+msgstr "Esperando o servidor iniciar...\n"
+
+#: pg_ctl.c:1662
+msgid "Timed out waiting for server startup\n"
+msgstr "Tempo de espera esgotado para início do servidor\n"
+
+#: pg_ctl.c:1666
+msgid "Server started and accepting connections\n"
+msgstr "Servidor foi iniciado e está aceitando conexões\n"
+
+#: pg_ctl.c:1721
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: não pôde iniciar serviço \"%s\": código de erro %lu\n"
+
+#: pg_ctl.c:1824
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: AVISO: não pode criar tokens restritos nesta plataforma\n"
+
+#: pg_ctl.c:1837
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: não pôde abrir token de processo: código de erro %lu\n"
+
+#: pg_ctl.c:1851
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: não pôde alocar SIDs: código de erro %lu\n"
+
+#: pg_ctl.c:1878
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: não pôde criar token restrito: código de erro %lu\n"
+
+#: pg_ctl.c:1909
+#, c-format
+msgid "%s: WARNING: could not locate all job object functions in system API\n"
+msgstr "%s: AVISO: não pôde localizar todas funções job object na API do sistema\n"
+
+#: pg_ctl.c:2006
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: não pôde obter LUIDs para privilégios: código de erro %lu\n"
+
+#: pg_ctl.c:2014 pg_ctl.c:2029
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: não pôde obter informação sobre token: código de erro %lu\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: sem memória\n"
+
+#: pg_ctl.c:2053
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Tente \"%s --help\" para obter informações adicionais.\n"
+
+#: pg_ctl.c:2061
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s é um utilitário para inicializar, iniciar, parar e controlar um servidor PostgreSQL.\n"
+"\n"
+
+#: pg_ctl.c:2062
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: pg_ctl.c:2063
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D DIRDADOS] [-s] [-o OPÇÕES]\n"
+
+#: pg_ctl.c:2064
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D DIRDADOS] [-l ARQUIVO] [-W] [-t SEGS] [-s]\n"
+" [-o OPÇÕES] [-p CAMINHO] [-c]\n"
+
+#: pg_ctl.c:2066
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D DIRDADOS] [-m MODO-DESLIGAMENTO] [-W] [-t SEGS] [-s]\n"
+
+#: pg_ctl.c:2067
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D DIRDADOS] [-m MODO-DESLIGAMENTO] [-W] [-t SEGS] [-s]\n"
+" [-o OPÇÕES] [-c]\n"
+
+#: pg_ctl.c:2069
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D DIRDADOS] [-s]\n"
+
+#: pg_ctl.c:2070
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DIRDADOS]\n"
+
+#: pg_ctl.c:2071
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D DIRDADOS] [-W] [-t SEGS] [-s]\n"
+
+#: pg_ctl.c:2072
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DIRDADOS] [-s]\n"
+
+#: pg_ctl.c:2073
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill NOMESINAL PID\n"
+
+#: pg_ctl.c:2075
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D DIRDADOS] [-N NOMESERVIÇO] [-U USUÁRIO] [-P SENHA]\n"
+" [-S TIPO-INÍCIO] [-e ORIGEM] [-W] [-t SEGS] [-s] [-o OPÇÕES]\n"
+
+#: pg_ctl.c:2077
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N NOMESERVIÇO]\n"
+
+#: pg_ctl.c:2080
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Opções comuns:\n"
+
+#: pg_ctl.c:2081
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=DIRDADOS local da área de armazenamento dos bancos de dados\n"
+
+#: pg_ctl.c:2083
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e ORIGEM origem de eventos para registro quando executar como um serviço\n"
+
+#: pg_ctl.c:2085
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent mostra somente erros, nenhuma mensagem informativa\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout= SEGS segundos a esperar quando a opção -w for utilizada\n"
+
+#: pg_ctl.c:2087
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_ctl.c:2088
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait espera até que a operação seja concluída (padrão)\n"
+
+#: pg_ctl.c:2089
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait não espera até que a operação seja concluída\n"
+
+#: pg_ctl.c:2090
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_ctl.c:2091
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Se a opção -D for omitida, a variável de ambiente PGDATA é utilizada.\n"
+
+#: pg_ctl.c:2093
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Opções para início ou reinício:\n"
+
+#: pg_ctl.c:2095
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files permite o postgres produzir arquivos core\n"
+
+#: pg_ctl.c:2097
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files não é aplicável a esta plataforma\n"
+
+#: pg_ctl.c:2099
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=ARQUIVO escreve (ou concatena) log do servidor para ARQUIVO\n"
+
+#: pg_ctl.c:2100
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPÇÕES opções de linha de comando passadas para o postgres\n"
+" (executável do servidor PostgreSQL) ou initdb\n"
+
+#: pg_ctl.c:2102
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p CAMINHO-DO-POSTGRES normalmente não é necessário\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Opções para parada ou reinício:\n"
+
+#: pg_ctl.c:2104
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=MODO MODO pode ser \"smart\", \"fast\" ou \"immediate\"\n"
+
+#: pg_ctl.c:2106
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Modos de desligamento são:\n"
+
+#: pg_ctl.c:2107
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart termina depois que todos os clientes desconectarem\n"
+
+#: pg_ctl.c:2108
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast termina diretamente, com desligamento apropriado (padrão)\n"
+
+#: pg_ctl.c:2109
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate termina sem desligamento completo; conduzirá a uma recuperação durante o reinício\n"
+
+#: pg_ctl.c:2111
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Sinais permitidos para sinalização:\n"
+
+#: pg_ctl.c:2115
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Opções para registrar ou remover registro:\n"
+
+#: pg_ctl.c:2116
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N NOMESERVIÇO nome do serviço no qual se registrou o servidor PostgreSQL\n"
+
+#: pg_ctl.c:2117
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P SENHA senha da conta que registrou o servidor PostgreSQL\n"
+
+#: pg_ctl.c:2118
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U USUÁRIO nome do usuário que registrou o servidor PostgreSQL\n"
+
+#: pg_ctl.c:2119
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S TIPO-INÍCIO tipo de início do serviço para registrar o servidor PostgreSQL\n"
+
+#: pg_ctl.c:2121
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Tipos de início são:\n"
+
+#: pg_ctl.c:2122
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto inicia serviço automaticamente durante a inicialização do sistema (padrão)\n"
+
+#: pg_ctl.c:2123
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand inicia serviço sob demanda\n"
+
+#: pg_ctl.c:2126
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Relate erros a <%s>.\n"
+
+#: pg_ctl.c:2127
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Página web do %s: <%s>\n"
+
+#: pg_ctl.c:2152
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: modo de desligamento \"%s\" desconhecido\n"
+
+#: pg_ctl.c:2181
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: nome de sinal \"%s\" desconhecido\n"
+
+#: pg_ctl.c:2198
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: tipo de início \"%s\" desconhecido\n"
+
+#: pg_ctl.c:2253
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: não pôde determinar diretório de dados utilizando comando \"%s\"\n"
+
+#: pg_ctl.c:2277
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: arquivo de controle parece estar corrompido\n"
+
+#: pg_ctl.c:2345
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: não pode ser executado como root\n"
+"Por favor entre (utilizando \"su\") como um usuário (sem privilégios) que\n"
+"será o dono do processo do servidor.\n"
+
+#: pg_ctl.c:2428
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: opção -S não é suportada nessa plataforma\n"
+
+#: pg_ctl.c:2465
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: muitos argumentos de linha de comando (primeiro é \"%s\")\n"
+
+#: pg_ctl.c:2491
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: faltando argumento para modo kill\n"
+
+#: pg_ctl.c:2509
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: modo de operação \"%s\" é desconhecido\n"
+
+#: pg_ctl.c:2519
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: nenhuma operação especificada\n"
+
+#: pg_ctl.c:2540
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: nenhum diretório de banco de dados especificado e variável de ambiente PGDATA não foi definida\n"
diff --git a/src/bin/pg_ctl/po/ru.po b/src/bin/pg_ctl/po/ru.po
new file mode 100644
index 0000000..b8e1edc
--- /dev/null
+++ b/src/bin/pg_ctl/po/ru.po
@@ -0,0 +1,1023 @@
+# Russian message translation file for pg_ctl
+# Copyright (C) 2004-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Oleg Bartunov <oleg@sai.msu.su>, 2004.
+# Serguei A. Mokhov <mokhov@cs.concordia.ca>, 2004-2005.
+# Sergey Burladyan <eshkinkot@gmail.com>, 2009, 2012.
+# Andrey Sudnik <sudnikand@gmail.com>, 2010.
+# Dmitriy Olshevskiy <olshevskiy87@bk.ru>, 2014.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-27 14:52+0300\n"
+"PO-Revision-Date: 2022-09-05 13:35+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "не удалось определить текущий каталог: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "неверный исполняемый файл \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "не удалось прочитать исполняемый файл \"%s\""
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "не удалось найти запускаемый файл \"%s\""
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "не удалось перейти в каталог \"%s\": %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "не удалось прочитать символическую ссылку \"%s\": %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "ошибка в %s(): %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "нехватка памяти"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памяти\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "неисполняемая команда"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "команда не найдена"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "дочерний процесс завершился с кодом возврата %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "дочерний процесс прерван исключением 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "дочерний процесс завершён по сигналу %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "дочерний процесс завершился с нераспознанным состоянием %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "не удалось определить текущий рабочий каталог: %s\n"
+
+#: pg_ctl.c:260
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: каталог \"%s\" не существует\n"
+
+#: pg_ctl.c:263
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: ошибка доступа к каталогу \"%s\": %s\n"
+
+#: pg_ctl.c:276
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: каталог \"%s\" не содержит структуры кластера баз данных\n"
+
+#: pg_ctl.c:289
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: не удалось открыть файл PID \"%s\": %s\n"
+
+#: pg_ctl.c:298
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: файл PID \"%s\" пуст\n"
+
+#: pg_ctl.c:301
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: неверные данные в файле PID \"%s\"\n"
+
+#: pg_ctl.c:464 pg_ctl.c:506
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: не удалось запустить сервер: %s\n"
+
+#: pg_ctl.c:484
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: не удалось запустить сервер из-за ошибки в setsid(): %s\n"
+
+#: pg_ctl.c:554
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: не удалось открыть файл протокола \"%s\": %s\n"
+
+#: pg_ctl.c:571
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: не удалось запустить сервер (код ошибки: %lu)\n"
+
+#: pg_ctl.c:788
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr ""
+"%s: не удалось ограничить размер дампа памяти; запрещено жёстким "
+"ограничением\n"
+
+#: pg_ctl.c:814
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: не удалось прочитать файл \"%s\"\n"
+
+#: pg_ctl.c:819
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: в файле параметров \"%s\" должна быть ровно одна строка\n"
+
+#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112
+#, c-format
+msgid "%s: could not send stop signal (PID: %ld): %s\n"
+msgstr "%s: не удалось отправить сигнал остановки (PID: %ld): %s\n"
+
+#: pg_ctl.c:889
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\"\n"
+msgstr "программа \"%s\" нужна для %s, но она не найдена в каталоге \"%s\"\n"
+
+#: pg_ctl.c:892
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr ""
+"программа \"%s\" найдена программой \"%s\", но её версия отличается от "
+"версии %s\n"
+
+#: pg_ctl.c:923
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: сбой при инициализации системы баз данных\n"
+
+#: pg_ctl.c:938
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr ""
+"%s: возможно, уже работает другой сервер; всё же пробуем запустить этот "
+"сервер\n"
+
+#: pg_ctl.c:986
+msgid "waiting for server to start..."
+msgstr "ожидание запуска сервера..."
+
+#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243
+msgid " done\n"
+msgstr " готово\n"
+
+#: pg_ctl.c:992
+msgid "server started\n"
+msgstr "сервер запущен\n"
+
+#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248
+msgid " stopped waiting\n"
+msgstr " прекращение ожидания\n"
+
+#: pg_ctl.c:996
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: сервер не запустился за отведённое время\n"
+
+#: pg_ctl.c:1002
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: не удалось запустить сервер\n"
+"Изучите протокол выполнения.\n"
+
+#: pg_ctl.c:1010
+msgid "server starting\n"
+msgstr "сервер запускается\n"
+
+#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: файл PID \"%s\" не существует\n"
+
+#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273
+msgid "Is server running?\n"
+msgstr "Запущен ли сервер?\n"
+
+#: pg_ctl.c:1036
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: остановить сервер с PID %ld нельзя - он запущен в монопольном режиме\n"
+
+#: pg_ctl.c:1051
+msgid "server shutting down\n"
+msgstr "сервер останавливается\n"
+
+#: pg_ctl.c:1056 pg_ctl.c:1117
+msgid "waiting for server to shut down..."
+msgstr "ожидание завершения работы сервера..."
+
+#: pg_ctl.c:1060 pg_ctl.c:1122
+msgid " failed\n"
+msgstr " ошибка\n"
+
+#: pg_ctl.c:1062 pg_ctl.c:1124
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: сервер не останавливается\n"
+
+#: pg_ctl.c:1064 pg_ctl.c:1126
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"ПОДСКАЗКА: Параметр \"-m fast\" может сбросить сеансы принудительно,\n"
+"не дожидаясь, пока они завершатся сами.\n"
+
+#: pg_ctl.c:1070 pg_ctl.c:1132
+msgid "server stopped\n"
+msgstr "сервер остановлен\n"
+
+#: pg_ctl.c:1091
+msgid "trying to start server anyway\n"
+msgstr "производится попытка запуска сервера в любом случае\n"
+
+#: pg_ctl.c:1100
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: перезапустить сервер с PID %ld нельзя - он запущен в монопольном режиме\n"
+
+#: pg_ctl.c:1103 pg_ctl.c:1162
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Пожалуйста, остановите его и повторите попытку.\n"
+
+#: pg_ctl.c:1136
+#, c-format
+msgid "%s: old server process (PID: %ld) seems to be gone\n"
+msgstr "%s: похоже, что старый серверный процесс (PID: %ld) исчез\n"
+
+#: pg_ctl.c:1138
+msgid "starting server anyway\n"
+msgstr "сервер запускается, несмотря на это\n"
+
+#: pg_ctl.c:1159
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: перезагрузить сервер с PID %ld нельзя - он запущен в монопольном режиме\n"
+
+#: pg_ctl.c:1168
+#, c-format
+msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgstr "%s: не удалось отправить сигнал перезагрузки (PID: %ld): %s\n"
+
+#: pg_ctl.c:1173
+msgid "server signaled\n"
+msgstr "сигнал отправлен серверу\n"
+
+#: pg_ctl.c:1198
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: повысить сервер с PID %ld нельзя - он выполняется в монопольном режиме\n"
+
+#: pg_ctl.c:1206
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: повысить сервер нельзя - он работает не в режиме резерва\n"
+
+#: pg_ctl.c:1216
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: не удалось создать файл \"%s\" с сигналом к повышению: %s\n"
+
+#: pg_ctl.c:1222
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: не удалось записать файл \"%s\" с сигналом к повышению: %s\n"
+
+#: pg_ctl.c:1230
+#, c-format
+msgid "%s: could not send promote signal (PID: %ld): %s\n"
+msgstr "%s: не удалось отправить сигнал к повышению (PID: %ld): %s\n"
+
+#: pg_ctl.c:1233
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: ошибка при удалении файла \"%s\" с сигналом к повышению: %s\n"
+
+#: pg_ctl.c:1240
+msgid "waiting for server to promote..."
+msgstr "ожидание повышения сервера..."
+
+#: pg_ctl.c:1244
+msgid "server promoted\n"
+msgstr "сервер повышен\n"
+
+#: pg_ctl.c:1249
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: повышение сервера не завершилось за отведённое время\n"
+
+#: pg_ctl.c:1255
+msgid "server promoting\n"
+msgstr "сервер повышается\n"
+
+#: pg_ctl.c:1279
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n"
+msgstr ""
+"%s: не удалось прокрутить файл журнала; сервер работает в монопольном режиме "
+"(PID: %ld)\n"
+
+#: pg_ctl.c:1289
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr ""
+"%s: не удалось создать файл \"%s\" с сигналом к прокрутке журнала: %s\n"
+
+#: pg_ctl.c:1295
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr ""
+"%s: не удалось записать файл \"%s\" с сигналом к прокрутке журнала: %s\n"
+
+#: pg_ctl.c:1303
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %ld): %s\n"
+msgstr "%s: не удалось отправить сигнал к прокрутке журнала (PID: %ld): %s\n"
+
+#: pg_ctl.c:1306
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr ""
+"%s: ошибка при удалении файла \"%s\" с сигналом к прокрутке журнала: %s\n"
+
+#: pg_ctl.c:1311
+msgid "server signaled to rotate log file\n"
+msgstr "сигнал для прокрутки файла журнала отправлен серверу\n"
+
+#: pg_ctl.c:1358
+#, c-format
+msgid "%s: single-user server is running (PID: %ld)\n"
+msgstr "%s: сервер работает в монопольном режиме (PID: %ld)\n"
+
+#: pg_ctl.c:1372
+#, c-format
+msgid "%s: server is running (PID: %ld)\n"
+msgstr "%s: сервер работает (PID: %ld)\n"
+
+#: pg_ctl.c:1388
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: сервер не работает\n"
+
+#: pg_ctl.c:1405
+#, c-format
+msgid "%s: could not send signal %d (PID: %ld): %s\n"
+msgstr "%s: не удалось отправить сигнал %d (PID: %ld): %s\n"
+
+#: pg_ctl.c:1436
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: не удалось найти свой исполняемый файл\n"
+
+#: pg_ctl.c:1446
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: не удалось найти исполняемый файл postgres\n"
+
+#: pg_ctl.c:1516 pg_ctl.c:1550
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: не удалось открыть менеджер служб\n"
+
+#: pg_ctl.c:1522
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: служба \"%s\" уже зарегистрирована\n"
+
+#: pg_ctl.c:1533
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: не удалось зарегистрировать службу \"%s\" (код ошибки: %lu)\n"
+
+#: pg_ctl.c:1556
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: служба \"%s\" не зарегистрирована\n"
+
+#: pg_ctl.c:1563
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: не удалось открыть службу \"%s\" (код ошибки: %lu)\n"
+
+#: pg_ctl.c:1572
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: ошибка при удалении службы \"%s\" (код ошибки: %lu)\n"
+
+#: pg_ctl.c:1659
+msgid "Waiting for server startup...\n"
+msgstr "Ожидание запуска сервера...\n"
+
+#: pg_ctl.c:1662
+msgid "Timed out waiting for server startup\n"
+msgstr "Превышено время ожидания запуска сервера\n"
+
+#: pg_ctl.c:1666
+msgid "Server started and accepting connections\n"
+msgstr "Сервер запущен и принимает подключения\n"
+
+#: pg_ctl.c:1721
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: не удалось запустить службу \"%s\" (код ошибки: %lu)\n"
+
+#: pg_ctl.c:1824
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: ПРЕДУПРЕЖДЕНИЕ: в этой ОС нельзя создавать ограниченные маркеры\n"
+
+#: pg_ctl.c:1837
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: не удалось открыть маркер процесса (код ошибки: %lu)\n"
+
+#: pg_ctl.c:1851
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: не удалось подготовить структуры SID (код ошибки: %lu)\n"
+
+#: pg_ctl.c:1878
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: не удалось создать ограниченный маркер (код ошибки: %lu)\n"
+
+#: pg_ctl.c:1909
+#, c-format
+msgid "%s: WARNING: could not locate all job object functions in system API\n"
+msgstr ""
+"%s: ПРЕДУПРЕЖДЕНИЕ: не удалось найти все функции для работы с задачами в "
+"системном API\n"
+
+#: pg_ctl.c:2006
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: не удалось получить LUID для привилегий (код ошибки: %lu)\n"
+
+#: pg_ctl.c:2014 pg_ctl.c:2029
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: не удалось получить информацию о маркере (код ошибки: %lu)\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: нехватка памяти\n"
+
+#: pg_ctl.c:2053
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Для дополнительной информации попробуйте \"%s --help\".\n"
+
+#: pg_ctl.c:2061
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s - это утилита для инициализации, запуска, остановки и управления сервером "
+"PostgreSQL.\n"
+"\n"
+
+#: pg_ctl.c:2062
+#, c-format
+msgid "Usage:\n"
+msgstr "Использование:\n"
+
+#: pg_ctl.c:2063
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D КАТАЛОГ-ДАННЫХ] [-s] [-o ПАРАМЕТРЫ]\n"
+
+#: pg_ctl.c:2064
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D КАТАЛОГ-ДАННЫХ] [-l ИМЯ-ФАЙЛА] [-W] [-t СЕК] [-s]\n"
+" [-o ПАРАМЕТРЫ] [-p ПУТЬ] [-c]\n"
+
+#: pg_ctl.c:2066
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr ""
+" %s stop [-D КАТАЛОГ-ДАННЫХ] [-m РЕЖИМ-ОСТАНОВКИ] [-W] [-t СЕК] [-s]\n"
+
+#: pg_ctl.c:2067
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D КАТАЛОГ-ДАННЫХ] [-m РЕЖИМ-ОСТАНОВКИ] [-W] [-t СЕК] [-s]\n"
+" [-o ПАРАМЕТРЫ] [-c]\n"
+
+#: pg_ctl.c:2069
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D КАТАЛОГ-ДАННЫХ] [-s]\n"
+
+#: pg_ctl.c:2070
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D КАТАЛОГ-ДАННЫХ]\n"
+
+#: pg_ctl.c:2071
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D КАТАЛОГ-ДАННЫХ] [-W] [-t СЕК] [-s]\n"
+
+#: pg_ctl.c:2072
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D КАТАЛОГ-ДАННЫХ] [-s]\n"
+
+#: pg_ctl.c:2073
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill СИГНАЛ PID\n"
+
+#: pg_ctl.c:2075
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o "
+"OPTIONS]\n"
+msgstr ""
+" %s register [-D КАТАЛОГ-ДАННЫХ] [-N ИМЯ-СЛУЖБЫ] [-U ПОЛЬЗОВАТЕЛЬ] [-P "
+"ПАРОЛЬ]\n"
+" [-S ТИП-ЗАПУСКА] [-e ИСТОЧНИК] [-W] [-t СЕК] [-s] [-o "
+"ПАРАМЕТРЫ]\n"
+
+#: pg_ctl.c:2077
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N ИМЯ-СЛУЖБЫ]\n"
+
+#: pg_ctl.c:2080
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Общие параметры:\n"
+
+#: pg_ctl.c:2081
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=КАТАЛОГ расположение хранилища баз данных\n"
+
+#: pg_ctl.c:2083
+#, c-format
+msgid ""
+" -e SOURCE event source for logging when running as a service\n"
+msgstr ""
+" -e ИСТОЧНИК источник событий, устанавливаемый при записи в "
+"журнал,\n"
+" когда сервер работает в виде службы\n"
+
+#: pg_ctl.c:2085
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr ""
+" -s, --silent выводить только ошибки, без информационных "
+"сообщений\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr ""
+" -t, --timeout=СЕК время ожидания при использовании параметра -w\n"
+
+#: pg_ctl.c:2087
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: pg_ctl.c:2088
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait ждать завершения операции (по умолчанию)\n"
+
+#: pg_ctl.c:2089
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait не ждать завершения операции\n"
+
+#: pg_ctl.c:2090
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: pg_ctl.c:2091
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Если параметр -D опущен, используется переменная окружения PGDATA.\n"
+
+#: pg_ctl.c:2093
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Параметры запуска и перезапуска:\n"
+
+#: pg_ctl.c:2095
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files указать postgres создавать дампы памяти\n"
+
+#: pg_ctl.c:2097
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files неприменимо на этой платформе\n"
+
+#: pg_ctl.c:2099
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr ""
+" -l, --log=ФАЙЛ записывать (или добавлять) протокол сервера в "
+"ФАЙЛ.\n"
+
+#: pg_ctl.c:2100
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=ПАРАМЕТРЫ передаваемые postgres (исполняемому файлу "
+"PostgreSQL)\n"
+" или initdb параметры командной строки\n"
+
+#: pg_ctl.c:2102
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p ПУТЬ-К-POSTGRES обычно не требуется\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Параметры остановки и перезапуска:\n"
+
+#: pg_ctl.c:2104
+#, c-format
+msgid ""
+" -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr ""
+" -m, --mode=РЕЖИМ может быть \"smart\", \"fast\" или \"immediate\"\n"
+
+#: pg_ctl.c:2106
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Режимы остановки:\n"
+
+#: pg_ctl.c:2107
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart закончить работу после отключения всех клиентов\n"
+
+#: pg_ctl.c:2108
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast закончить сразу, в штатном режиме (по умолчанию)\n"
+
+#: pg_ctl.c:2109
+#, c-format
+msgid ""
+" immediate quit without complete shutdown; will lead to recovery on "
+"restart\n"
+msgstr ""
+" immediate закончить немедленно, в экстренном режиме; влечёт за собой\n"
+" восстановление при перезапуске\n"
+
+#: pg_ctl.c:2111
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Разрешённые сигналы для команды kill:\n"
+
+#: pg_ctl.c:2115
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Параметры для регистрации и удаления:\n"
+
+#: pg_ctl.c:2116
+#, c-format
+msgid ""
+" -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N ИМЯ-СЛУЖБЫ имя службы для регистрации сервера PostgreSQL\n"
+
+#: pg_ctl.c:2117
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr ""
+" -P ПАРОЛЬ пароль учётной записи для регистрации сервера PostgreSQL\n"
+
+#: pg_ctl.c:2118
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr ""
+" -U ПОЛЬЗОВАТЕЛЬ имя пользователя для регистрации сервера PostgreSQL\n"
+
+#: pg_ctl.c:2119
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S ТИП-ЗАПУСКА тип запуска службы сервера PostgreSQL\n"
+
+#: pg_ctl.c:2121
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Типы запуска:\n"
+
+#: pg_ctl.c:2122
+#, c-format
+msgid ""
+" auto start service automatically during system startup (default)\n"
+msgstr ""
+" auto запускать службу автоматически при старте системы (по "
+"умолчанию)\n"
+
+#: pg_ctl.c:2123
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand запускать службу по требованию\n"
+
+#: pg_ctl.c:2126
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках сообщайте по адресу <%s>.\n"
+
+#: pg_ctl.c:2127
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: pg_ctl.c:2152
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: неизвестный режим остановки \"%s\"\n"
+
+#: pg_ctl.c:2181
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: нераспознанное имя сигнала \"%s\"\n"
+
+#: pg_ctl.c:2198
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: нераспознанный тип запуска \"%s\"\n"
+
+#: pg_ctl.c:2253
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: не удалось определить каталог данных с помощью команды \"%s\"\n"
+
+#: pg_ctl.c:2277
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: управляющий файл, по-видимому, испорчен\n"
+
+#: pg_ctl.c:2345
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"Запускать %s от имени root нельзя.\n"
+"Пожалуйста, переключитесь на обычного пользователя (например,\n"
+"используя \"su\"), который будет запускать серверный процесс.\n"
+
+#: pg_ctl.c:2428
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: параметр -S не поддерживается в этой ОС\n"
+
+#: pg_ctl.c:2465
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: слишком много аргументов командной строки (первый: \"%s\")\n"
+
+#: pg_ctl.c:2491
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: отсутствуют аргументы для режима kill\n"
+
+#: pg_ctl.c:2509
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: нераспознанный режим работы \"%s\"\n"
+
+#: pg_ctl.c:2519
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: команда не указана\n"
+
+#: pg_ctl.c:2540
+#, c-format
+msgid ""
+"%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr ""
+"%s: каталог баз данных не указан и переменная окружения PGDATA не "
+"установлена\n"
+
+#~ msgid ""
+#~ "WARNING: online backup mode is active\n"
+#~ "Shutdown will not complete until pg_stop_backup() is called.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ПРЕДУПРЕЖДЕНИЕ: активен режим копирования \"на ходу\"\n"
+#~ "Выключение произойдёт только при вызове pg_stop_backup().\n"
+#~ "\n"
+
+#~ msgid "%s: could not create log file \"%s\": %s\n"
+#~ msgstr "%s: не удалось создать файл журнала \"%s\": %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "дочерний процесс завершён по сигналу %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: -w option is not supported when starting a pre-9.1 server\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s: параметр -w не поддерживается при запуске сервера до версии 9.1\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: -w option cannot use a relative socket directory specification\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s: в параметре -w нельзя указывать относительный путь к каталогу "
+#~ "сокетов\n"
+
+#~ msgid "server is still starting up\n"
+#~ msgstr "сервер всё ещё запускается\n"
+
+#~ msgid "%s: could not wait for server because of misconfiguration\n"
+#~ msgstr "%s: не удалось дождаться сервера вследствие ошибки конфигурации\n"
+
+#~ msgid ""
+#~ " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o "
+#~ "\"OPTIONS\"]\n"
+#~ msgstr ""
+#~ " %s start [-w] [-t СЕК] [-D КАТАЛОГ-ДАННЫХ] [-s] [-l ИМЯ-ФАЙЛА]\n"
+#~ " [-o \"ПАРАМЕТРЫ\"]\n"
+
+#~ msgid " %s promote [-w] [-t SECS] [-D DATADIR] [-s]\n"
+#~ msgstr " %s promote [-w] [-t СЕК] [-D КАТАЛОГ-ДАННЫХ] [-s]\n"
+
+#~ msgid ""
+#~ "(The default is to wait for shutdown, but not for start or restart.)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "(По умолчанию ожидание имеет место при остановке, но не при "
+#~ "(пере)запуске.)\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: could not stat file \"%s\": %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s: не удалось получить информацию о файле \"%s\": %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: this data directory appears to be running a pre-existing postmaster\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s: похоже, что с этим каталогом уже работает управляющий процесс "
+#~ "postmaster\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Options for stop, restart, or promote:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Параметры остановки, перезапуска и повышения:\n"
+
+#~ msgid "%s: another server might be running\n"
+#~ msgstr "%s: возможно, работает другой сервер\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Options for start or stop:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Параметры запуска и остановки сервера:\n"
+
+#~ msgid ""
+#~ " -I, --idempotent don't error if server already running or "
+#~ "stopped\n"
+#~ msgstr ""
+#~ " -I, --idempotent не считать ошибкой, если он уже запущен или "
+#~ "остановлен\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Promotion modes are:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Режимы повышения:\n"
+
+#~ msgid " smart promote after performing a checkpoint\n"
+#~ msgstr " smart повышение после выполнения контрольной точки\n"
+
+#~ msgid ""
+#~ " fast promote quickly without waiting for checkpoint completion\n"
+#~ msgstr ""
+#~ " fast быстрое повышение, без ожидания завершения контрольной "
+#~ "точки\n"
diff --git a/src/bin/pg_ctl/po/sv.po b/src/bin/pg_ctl/po/sv.po
new file mode 100644
index 0000000..9762a39
--- /dev/null
+++ b/src/bin/pg_ctl/po/sv.po
@@ -0,0 +1,858 @@
+# Swedish message translation file for pg_ctl
+# Dennis Björklund <db@zigo.dhs.org>, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022.
+# Magnus Hagander <magnus@hagander.net>, 2010.
+# Mats Erik Andersson <bsd@gisladisker.se>, 2013, 2014.
+#
+# Use these quotes: "%s"
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-11 09:18+0000\n"
+"PO-Revision-Date: 2022-04-11 14:43+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../common/exec.c:144 ../../common/exec.c:261 ../../common/exec.c:307
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "kunde inte identifiera aktuell katalog: %m"
+
+#: ../../common/exec.c:163
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "ogiltig binär \"%s\""
+
+#: ../../common/exec.c:213
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "kunde inte läsa binär \"%s\""
+
+#: ../../common/exec.c:221
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "kunde inte hitta en \"%s\" att köra"
+
+#: ../../common/exec.c:277 ../../common/exec.c:316
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "kunde inte byta katalog till \"%s\": %m"
+
+#: ../../common/exec.c:294
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "kan inte läsa symbolisk länk \"%s\": %m"
+
+#: ../../common/exec.c:417
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() misslyckades: %m"
+
+#: ../../common/exec.c:555 ../../common/exec.c:600 ../../common/exec.c:692
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kan inte duplicera null-pekare (internt fel)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "kommandot är inte körbart"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "kommandot kan ej hittas"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "barnprocess avslutade med kod %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "barnprocess terminerades med avbrott 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "barnprocess terminerades av signal %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "barnprocess avslutade med okänd statuskod %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "kunde inte fastställa nuvarande arbetskatalog: %s\n"
+
+#: pg_ctl.c:260
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: katalogen \"%s\" existerar inte\n"
+
+#: pg_ctl.c:263
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: kunde inte komma åt katalogen \"%s\": %s\n"
+
+#: pg_ctl.c:276
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: katalogen \"%s\" innehåller inte något databaskluster.\n"
+
+#: pg_ctl.c:289
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: kunde inte öppna PID-fil \"%s\": %s\n"
+
+#: pg_ctl.c:298
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: PID-filen \"%s\" är tom\n"
+
+#: pg_ctl.c:301
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: ogiltig data i PID-fil \"%s\"\n"
+
+#: pg_ctl.c:464 pg_ctl.c:506
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: kunde inte starta servern: %s\n"
+
+#: pg_ctl.c:484
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: kunde inte starta servern då setsid() misslyckades: %s\n"
+
+#: pg_ctl.c:554
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: kunde inte öppna logg-fil \"%s\": %s\n"
+
+#: pg_ctl.c:571
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: kunde inte starta servern: felkod %lu\n"
+
+#: pg_ctl.c:788
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: kan inte sätta storleksgränsning på core-fil; tillåts inte av hård gräns\n"
+
+#: pg_ctl.c:814
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: kunde inte läsa filen \"%s\"\n"
+
+#: pg_ctl.c:819
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: inställningsfilen \"%s\" måste bestå av en enda rad.\n"
+
+#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112
+#, c-format
+msgid "%s: could not send stop signal (PID: %ld): %s\n"
+msgstr "%s: kunde inte skicka stopp-signal (PID: %ld): %s\n"
+
+#: pg_ctl.c:889
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "Programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\"\n"
+
+#: pg_ctl.c:892
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "Programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s.\n"
+
+#: pg_ctl.c:923
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: skapande av databaskluster misslyckades\n"
+
+#: pg_ctl.c:938
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: en annan server verkar köra; försöker starta servern ändå.\n"
+
+#: pg_ctl.c:986
+msgid "waiting for server to start..."
+msgstr "väntar på att servern skall starta..."
+
+#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243
+msgid " done\n"
+msgstr " klar\n"
+
+#: pg_ctl.c:992
+msgid "server started\n"
+msgstr "servern startad\n"
+
+#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248
+msgid " stopped waiting\n"
+msgstr " avslutade väntan\n"
+
+#: pg_ctl.c:996
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: servern startade inte i tid\n"
+
+#: pg_ctl.c:1002
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: kunde inte starta servern\n"
+"Undersök logg-utskriften.\n"
+
+#: pg_ctl.c:1010
+msgid "server starting\n"
+msgstr "servern startar\n"
+
+#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: PID-filen \"%s\" finns inte\n"
+
+#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273
+msgid "Is server running?\n"
+msgstr "Kör servern?\n"
+
+#: pg_ctl.c:1036
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n"
+msgstr "%s: Kan inte stanna servern. En-användar-server i drift (PID: %ld).\n"
+
+#: pg_ctl.c:1051
+msgid "server shutting down\n"
+msgstr "servern stänger ner\n"
+
+#: pg_ctl.c:1056 pg_ctl.c:1117
+msgid "waiting for server to shut down..."
+msgstr "väntar på att servern skall stänga ner..."
+
+#: pg_ctl.c:1060 pg_ctl.c:1122
+msgid " failed\n"
+msgstr " misslyckades\n"
+
+#: pg_ctl.c:1062 pg_ctl.c:1124
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: servern stänger inte ner\n"
+
+#: pg_ctl.c:1064 pg_ctl.c:1126
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"TIPS: Flaggan \"-m fast\" avslutar sessioner omedelbart, i stället för att\n"
+"vänta på deras självvalda avslut.\n"
+
+#: pg_ctl.c:1070 pg_ctl.c:1132
+msgid "server stopped\n"
+msgstr "servern är stoppad\n"
+
+#: pg_ctl.c:1091
+msgid "trying to start server anyway\n"
+msgstr "försöker starta servern ändå\n"
+
+#: pg_ctl.c:1100
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n"
+msgstr "%s: kan inte starta om servern. En-användar-server kör (PID: %ld).\n"
+
+#: pg_ctl.c:1103 pg_ctl.c:1162
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Var vänlig att stanna en-användar-servern och försök sedan igen.\n"
+
+#: pg_ctl.c:1136
+#, c-format
+msgid "%s: old server process (PID: %ld) seems to be gone\n"
+msgstr "%s: gamla serverprocessen (PID: %ld) verkar vara borta\n"
+
+#: pg_ctl.c:1138
+msgid "starting server anyway\n"
+msgstr "startar servern ändå\n"
+
+#: pg_ctl.c:1159
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgstr "%s: kan inte ladda om servern; en-användar-server kör (PID: %ld)\n"
+
+#: pg_ctl.c:1168
+#, c-format
+msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgstr "%s: kunde inte skicka signalen \"reload\" (PID: %ld): %s\n"
+
+#: pg_ctl.c:1173
+msgid "server signaled\n"
+msgstr "servern är signalerad\n"
+
+#: pg_ctl.c:1198
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n"
+msgstr "%s: kan inte befordra servern; en-användar-server kör (PID: %ld)\n"
+
+#: pg_ctl.c:1206
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: kan inte befordra servern; servern är inte i beredskapsläge.\n"
+
+#: pg_ctl.c:1216
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: kunde inte skapa befordringssignalfil \"%s\": %s\n"
+
+#: pg_ctl.c:1222
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: kunde inte skriva befordringssignalfil \"%s\": %s\n"
+
+#: pg_ctl.c:1230
+#, c-format
+msgid "%s: could not send promote signal (PID: %ld): %s\n"
+msgstr "%s: kunde inte skicka befordringssignal (PID: %ld): %s\n"
+
+#: pg_ctl.c:1233
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: kunde inte ta bort befordringssignalfil \"%s\": %s\n"
+
+#: pg_ctl.c:1240
+msgid "waiting for server to promote..."
+msgstr "väntar på att servern skall befordras..."
+
+#: pg_ctl.c:1244
+msgid "server promoted\n"
+msgstr "servern befordrad\n"
+
+#: pg_ctl.c:1249
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: servern befordrades inte i tid\n"
+
+#: pg_ctl.c:1255
+msgid "server promoting\n"
+msgstr "servern befordras\n"
+
+#: pg_ctl.c:1279
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n"
+msgstr "%s: kan inte rotera loggfil; en-användar-server kör (PID: %ld)\n"
+
+#: pg_ctl.c:1289
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: kunde inte skapa loggroteringssignalfil \"%s\": %s\n"
+
+#: pg_ctl.c:1295
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: kunde inte skriva loggroteringssignalfil \"%s\": %s\n"
+
+#: pg_ctl.c:1303
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %ld): %s\n"
+msgstr "%s: kunde inte skicka signalen för loggrotering (PID: %ld): %s\n"
+
+#: pg_ctl.c:1306
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: kunde inte ta bort loggroteringssignalfil \"%s\": %s\n"
+
+#: pg_ctl.c:1311
+msgid "server signaled to rotate log file\n"
+msgstr "servern är signalerad att rotera loggfil\n"
+
+#: pg_ctl.c:1358
+#, c-format
+msgid "%s: single-user server is running (PID: %ld)\n"
+msgstr "%s: en-användar-server kör. (PID: %ld)\n"
+
+#: pg_ctl.c:1372
+#, c-format
+msgid "%s: server is running (PID: %ld)\n"
+msgstr "%s: servern kör (PID: %ld)\n"
+
+#: pg_ctl.c:1388
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: ingen server kör\n"
+
+#: pg_ctl.c:1405
+#, c-format
+msgid "%s: could not send signal %d (PID: %ld): %s\n"
+msgstr "%s: kunde inte skicka signal %d (PID: %ld): %s\n"
+
+#: pg_ctl.c:1436
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: kunde inte hitta det egna programmets körbara fil\n"
+
+#: pg_ctl.c:1446
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: kunde inte hitta körbar postgres.\n"
+
+#: pg_ctl.c:1516 pg_ctl.c:1550
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: kunde inte öppna tjänstehanteraren\n"
+
+#: pg_ctl.c:1522
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: tjänsten \"%s\" är redan registrerad\n"
+
+#: pg_ctl.c:1533
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: kunde inte registrera tjänsten \"%s\": felkod %lu\n"
+
+#: pg_ctl.c:1556
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: tjänsten \"%s\" är inte registrerad\n"
+
+#: pg_ctl.c:1563
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: kunde inte öppna tjänsten \"%s\": felkod %lu\n"
+
+#: pg_ctl.c:1572
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: kunde inte avregistrera tjänsten \"%s\": felkod %lu\n"
+
+#: pg_ctl.c:1659
+msgid "Waiting for server startup...\n"
+msgstr "Väntar på serverstart...\n"
+
+#: pg_ctl.c:1662
+msgid "Timed out waiting for server startup\n"
+msgstr "Tidsfristen ute vid väntan på serverstart\n"
+
+#: pg_ctl.c:1666
+msgid "Server started and accepting connections\n"
+msgstr "Server startad och accepterar nu anslutningar\n"
+
+#: pg_ctl.c:1721
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: kunde inte starta tjänsten \"%s\": felkod %lu\n"
+
+#: pg_ctl.c:1824
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: VARNING: \"Restricted Token\" stöds inte av plattformen.\n"
+
+#: pg_ctl.c:1837
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: kunde inte öppna process-token: felkod %lu\n"
+
+#: pg_ctl.c:1851
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: kunde inte tilldela SID: felkod %lu\n"
+
+#: pg_ctl.c:1878
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: kunde inte skapa restriktivt styrmärke (token): felkod %lu\n"
+
+#: pg_ctl.c:1909
+#, c-format
+msgid "%s: WARNING: could not locate all job object functions in system API\n"
+msgstr "%s: VARNING: kunde inte hitta alla jobb-funktioner system-API:et.\n"
+
+#: pg_ctl.c:2006
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: kunde inte hämta LUID:er för rättigheter: felkod %lu\n"
+
+#: pg_ctl.c:2014 pg_ctl.c:2029
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: kunde inte hämta token-information: felkod %lu\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: slut på minne\n"
+
+#: pg_ctl.c:2053
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Försök med \"%s --help\" för mer information.\n"
+
+#: pg_ctl.c:2061
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s är ett verktyg för att initiera, starta, stanna och att styra\n"
+"PostgreSQL-tjänsten.\n"
+"\n"
+
+#: pg_ctl.c:2062
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_ctl.c:2063
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D DATAKAT] [-s] [-o FLAGGOR]\n"
+
+#: pg_ctl.c:2064
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D DATAKAT] [-l FILNAMN] [-W] [-t SEK] [-s]\n"
+" [-o FLAGGOR] [-p SOKVÄG] [-c]\n"
+
+#: pg_ctl.c:2066
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D DATAKAT] [-m STÄNGNINGSMETOD] [-W] [-t SEK] [-s]\n"
+
+#: pg_ctl.c:2067
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D DATAKAT] [-m STÄNGNINGSMETOD] [-W] [-t SEK] [-s]\n"
+" [-o FLAGGOR] [-c]\n"
+
+#: pg_ctl.c:2069
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D DATAKAT] [-s]\n"
+
+#: pg_ctl.c:2070
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DATAKAT]\n"
+
+#: pg_ctl.c:2071
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D DATAKAT] [-W] [-t SEK] [-s]\n"
+
+#: pg_ctl.c:2072
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DATAKAT] [-s]\n"
+
+#: pg_ctl.c:2073
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill SIGNALNAMN PID\n"
+
+#: pg_ctl.c:2075
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D DATAKAT] [-N TJÄNSTENAMN] [-U ANVÄNDARNAMN] [-P LÖSENORD]\n"
+" [-S STARTTYPE] [-e KÄLLA] [-W] [-t SEK] [-s] [-o FLAGGOR]\n"
+
+#: pg_ctl.c:2077
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N TJÄNSTNAMN]\n"
+
+#: pg_ctl.c:2080
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Gemensamma flaggor:\n"
+
+#: pg_ctl.c:2081
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=DATAKAT plats för databasens lagringsarea\n"
+
+#: pg_ctl.c:2083
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e KÄLLA händelsekälla för loggning när vi kör som en tjänst\n"
+
+#: pg_ctl.c:2085
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent skriv bara ut fel, inga informationsmeddelanden\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SEK antal sekunder att vänta när växeln -w används\n"
+
+#: pg_ctl.c:2087
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_ctl.c:2088
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait vänta på att operationen slutförs (standard)\n"
+
+#: pg_ctl.c:2089
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait vänta inte på att operationen slutförs\n"
+
+#: pg_ctl.c:2090
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa den här hjälpen, avsluta sedan\n"
+
+#: pg_ctl.c:2091
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Om flaggan -D inte har angivits så används omgivningsvariabeln PGDATA.\n"
+
+#: pg_ctl.c:2093
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Flaggor för start eller omstart:\n"
+
+#: pg_ctl.c:2095
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files tillåt postgres att skapa core-filer\n"
+
+#: pg_ctl.c:2097
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files inte giltig för denna plattform\n"
+
+#: pg_ctl.c:2099
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=FILNAMN skriv, eller tillfoga, server-loggen till FILNAMN\n"
+
+#: pg_ctl.c:2100
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPTIONS kommandoradsflaggor som skickas vidare till postgres\n"
+" (PostgreSQL-serverns körbara fil) eller till initdb\n"
+
+#: pg_ctl.c:2102
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr ""
+" -p SÖKVÄG-TILL-POSTGRES\n"
+" behövs normalt inte\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Flaggor för stopp eller omstart:\n"
+
+#: pg_ctl.c:2104
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=METOD METOD kan vara \"smart\", \"fast\" eller \"immediate\"\n"
+
+#: pg_ctl.c:2106
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Stängningsmetoder är:\n"
+
+#: pg_ctl.c:2107
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart stäng när alla klienter har avslutat\n"
+
+#: pg_ctl.c:2108
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast stäng omedelbart, med en kontrollerad nedstängning (standard)\n"
+
+#: pg_ctl.c:2109
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate stäng utan kontroller; kommer leda till återställning vid omstart\n"
+
+#: pg_ctl.c:2111
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Tillåtna signalnamn för kommando \"kill\":\n"
+
+#: pg_ctl.c:2115
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Flaggor för registrering och avregistrering:\n"
+
+#: pg_ctl.c:2116
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N TJÄNSTENAMN tjänstenamn att registrera PostgreSQL-servern med\n"
+
+#: pg_ctl.c:2117
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P LÖSENORD lösenord för konto vid registrering av PostgreSQL-servern\n"
+
+#: pg_ctl.c:2118
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U NAMN användarnamn för konto vid registrering av PostgreSQL-servern\n"
+
+#: pg_ctl.c:2119
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S STARTSÄTT sätt att registrera PostgreSQL-servern vid tjänstestart\n"
+
+#: pg_ctl.c:2121
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Startmetoder är:\n"
+
+#: pg_ctl.c:2122
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto starta tjänsten automatiskt vid systemstart (förval)\n"
+
+#: pg_ctl.c:2123
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand starta tjänsten vid behov\n"
+
+#: pg_ctl.c:2126
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: pg_ctl.c:2127
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_ctl.c:2152
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: ogiltig stängningsmetod \"%s\"\n"
+
+#: pg_ctl.c:2181
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: ogiltigt signalnamn \"%s\"\n"
+
+#: pg_ctl.c:2198
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: ogiltigt startvillkor \"%s\"\n"
+
+#: pg_ctl.c:2253
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: kunde inte bestämma databaskatalogen från kommandot \"%s\"\n"
+
+#: pg_ctl.c:2277
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: kontrollfilen verkar vara trasig\n"
+
+#: pg_ctl.c:2345
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: kan inte köras som root\n"
+"Logga in (t.ex. med \"su\") som den (opriviligerade) användare\n"
+"vilken skall äga serverprocessen.\n"
+
+#: pg_ctl.c:2428
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: flaggan -S stöds inte på denna plattform.\n"
+
+#: pg_ctl.c:2465
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: för många kommandoradsargument (första är \"%s\")\n"
+
+#: pg_ctl.c:2491
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: saknar argument för \"kill\"-kommando.\n"
+
+#: pg_ctl.c:2509
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: okänd operationsmetod \"%s\"\n"
+
+#: pg_ctl.c:2519
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: ingen operation angiven\n"
+
+#: pg_ctl.c:2540
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: ingen databaskatalog angiven och omgivningsvariabeln PGDATA är inte satt\n"
diff --git a/src/bin/pg_ctl/po/tr.po b/src/bin/pg_ctl/po/tr.po
new file mode 100644
index 0000000..f65c378
--- /dev/null
+++ b/src/bin/pg_ctl/po/tr.po
@@ -0,0 +1,869 @@
+# translation of pg_ctl-tr.po to Turkish
+# Devrim GUNDUZ <devrim@CommandPrompt.com>, 2004, 2005, 2007.
+# Nicolai Tufar <ntufar@gmail.com>, 2004, 2005, 2007.
+# Abdullah Gülner <agulner@gmail.com>, 2018.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl-tr\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-10-10 21:15+0000\n"
+"PO-Revision-Date: 2018-10-15 12:14+0300\n"
+"Last-Translator: Abdullah Gülner\n"
+"Language-Team: Turkish <ceviri@postgresql.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "geçerli dizin tespit edilemedi: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "geçersiz ikili (binary) \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "\"%s\" ikili (binary) dosyası okunamadı"
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "\"%s\" çalıştırmak için bulunamadı"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "çalışma dizini \"%s\" olarak değiştirilemedi: %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "symbolic link \"%s\" okuma hatası"
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "pclose başarısız oldu: %s"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../port/path.c:632 ../../port/path.c:670
+#: ../../port/path.c:687
+#, c-format
+msgid "out of memory\n"
+msgstr "bellek yetersiz\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null pointer duplicate edilemiyor (iç hata)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "komut çalıştırılabilir değil"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "komut bulunamadı"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "alt süreç %d çıkış koduyla sonuçlandırılmıştır"
+
+#: ../../common/wait_error.c:61
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "alt süreç 0x%X exception tarafından sonlandırılmıştır"
+
+#: ../../common/wait_error.c:71
+#, c-format
+msgid "child process was terminated by signal %s"
+msgstr "alt süreç %s sinyali tarafından sonlandırılmıştır"
+
+#: ../../common/wait_error.c:75
+#, c-format
+msgid "child process was terminated by signal %d"
+msgstr "alt süreç %d sinyali tarafından sonlandırılmıştır"
+
+#: ../../common/wait_error.c:80
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "alt süreç %d bilinmeyen durumu ile sonlandırılmıştır"
+
+#: ../../port/path.c:654
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "geçerli dizin belirlenemedi: %s\n"
+
+#: pg_ctl.c:257
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: \"%s\" dizini mevcut değil\n"
+
+#: pg_ctl.c:260
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: \"%s\" dizine erişim hatası: %s\n"
+
+#: pg_ctl.c:273
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: \"%s\" dizini bir veritabanı kümesi dizini değil\n"
+
+#: pg_ctl.c:286
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: \"%s\" PID dosyası açılamadı: %s\n"
+
+#: pg_ctl.c:295
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: \"%s\" PID dosyası boştur\n"
+
+#: pg_ctl.c:298
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: \"%s\" PID dosyasında geçersiz veri\n"
+
+#: pg_ctl.c:459 pg_ctl.c:487
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: sunucu başlatılamadı: %s\n"
+
+#: pg_ctl.c:511
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: sunucu başlatılamadı: hata kodu %lu\n"
+
+#: pg_ctl.c:658
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: core boyutu ayarlanamadı; hard limit tarafından sınırlanmış.\n"
+
+#: pg_ctl.c:684
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: \"%s\" dosyası okunamadı\n"
+
+#: pg_ctl.c:689
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: \"%s\" seçenek dosyası sadece 1 satır olmalıdır\n"
+
+#: pg_ctl.c:735
+#, c-format
+msgid ""
+"The program \"%s\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation.\n"
+msgstr ""
+"\"%s\" programına %s tarafından gereksinim duyuluyor, ancak \n"
+"\"%s\" ile aynı dizinde bulunamadı.\n"
+"Kurulumunuzu kontrol ediniz.\n"
+
+#: pg_ctl.c:741
+#, c-format
+msgid ""
+"The program \"%s\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation.\n"
+msgstr ""
+"\"%s\" programı \"%s\" tarafından\n"
+"bulundu ancak %s ile aynı sürüm numarasına sahip değil.\n"
+"Kurulumunuzu kontrol ediniz.\n"
+
+#: pg_ctl.c:774
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: veritabanı ilklendirme başarısız oldu\n"
+
+#: pg_ctl.c:789
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: başka bir sunucu çalışıyor olabilir; yine de başlatmaya çalışılıyor.\n"
+
+#: pg_ctl.c:827
+msgid "waiting for server to start..."
+msgstr "sunucunun başlaması bekleniyor..."
+
+#: pg_ctl.c:832 pg_ctl.c:937 pg_ctl.c:1029 pg_ctl.c:1159
+msgid " done\n"
+msgstr " tamam\n"
+
+#: pg_ctl.c:833
+msgid "server started\n"
+msgstr "sunucu başlatıldı\n"
+
+#: pg_ctl.c:836 pg_ctl.c:842 pg_ctl.c:1164
+msgid " stopped waiting\n"
+msgstr "bekleme durduruldu\n"
+
+#: pg_ctl.c:837
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: sunucu zamanında başlamadı\n"
+
+#: pg_ctl.c:843
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: sunucu başlatılamadı\n"
+"Kayıt dosyasını inceleyiniz\n"
+
+#: pg_ctl.c:851
+msgid "server starting\n"
+msgstr "sunucu başlıyor\n"
+
+#: pg_ctl.c:872 pg_ctl.c:959 pg_ctl.c:1050 pg_ctl.c:1089
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: \"%s\" PID dosyası bulunamadı\n"
+
+#: pg_ctl.c:873 pg_ctl.c:961 pg_ctl.c:1051 pg_ctl.c:1090
+msgid "Is server running?\n"
+msgstr "Sunucu çalışıyor mu?\n"
+
+#: pg_ctl.c:879
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n"
+msgstr "%s: sunucu durdurulamadı; tek kullanıcılı sunucu çalışıyor (PID: %ld)\n"
+
+#: pg_ctl.c:887 pg_ctl.c:983
+#, c-format
+msgid "%s: could not send stop signal (PID: %ld): %s\n"
+msgstr "%s:durdurma sinyali başarısız oldu (PID: %ld): %s\n"
+
+#: pg_ctl.c:894
+msgid "server shutting down\n"
+msgstr "sunucu kapatılıyor\n"
+
+#: pg_ctl.c:909 pg_ctl.c:998
+msgid ""
+"WARNING: online backup mode is active\n"
+"Shutdown will not complete until pg_stop_backup() is called.\n"
+"\n"
+msgstr ""
+"WARNING: çevrimiçi yedekleme modu etkin\n"
+"pg_stop_backup() çalıştırılmadam sunucu kapatılmayacaktır.\n"
+"\n"
+
+#: pg_ctl.c:913 pg_ctl.c:1002
+msgid "waiting for server to shut down..."
+msgstr "sunucunun kapanması bekleniyor..."
+
+#: pg_ctl.c:929 pg_ctl.c:1020
+msgid " failed\n"
+msgstr " başarısız oldu\n"
+
+#: pg_ctl.c:931 pg_ctl.c:1022
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: sunucu kapanmıyor\n"
+
+#: pg_ctl.c:933 pg_ctl.c:1024
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"İPUCU: \"-m fast\" seçeneği oturumların kendilerinin bitmesini beklemektense\n"
+"oturumları aniden keser.\n"
+
+#: pg_ctl.c:939 pg_ctl.c:1030
+msgid "server stopped\n"
+msgstr "sunucu durduruldu\n"
+
+#: pg_ctl.c:962
+msgid "trying to start server anyway\n"
+msgstr "sunucu yine de başlatılmaya çalışılıyor\n"
+
+#: pg_ctl.c:971
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n"
+msgstr "%s: sunucu başlatılamadı; tek kullanıcılı sunucu çalışıyor (PID: %ld)\n"
+
+#: pg_ctl.c:974 pg_ctl.c:1060
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Lütfen tek kullanıcılı sunucuyu durdurun ve yeniden deneyin.\n"
+
+#: pg_ctl.c:1034
+#, c-format
+msgid "%s: old server process (PID: %ld) seems to be gone\n"
+msgstr "%s: eski sunucu süreci (PID: %ld) kaybolmuştur\n"
+
+#: pg_ctl.c:1036
+msgid "starting server anyway\n"
+msgstr "sunucu yine de başlatılıyor\n"
+
+#: pg_ctl.c:1057
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgstr "%s: sunucu yeniden yüklenemedi, tek kullanıcılı sunucu çalışıyor (PID: %ld)\n"
+
+#: pg_ctl.c:1066
+#, c-format
+msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgstr "%s: yeniden yükleme sinyali gönderilemedi (PID: %ld): %s\n"
+
+#: pg_ctl.c:1071
+msgid "server signaled\n"
+msgstr "sunucuya sinyal gönderildi\n"
+
+#: pg_ctl.c:1096
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n"
+msgstr "%s: sunucu yükseltilemedi (promote), tek kullanıcılı sunucu çalışıyor (PID: %ld)\n"
+
+#: pg_ctl.c:1104
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: sunucu yükseltilemiyor (promote), sunucu yedek (standby) modda değil\n"
+
+#: pg_ctl.c:1119
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: \"%s\" yükseltme (promote) sinyal dosyası yaratılamadı: %s\n"
+
+#: pg_ctl.c:1125
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: \"%s\" yükseltme (promote) sinyal dosyasına yazılamadı: %s\n"
+
+#: pg_ctl.c:1133
+#, c-format
+msgid "%s: could not send promote signal (PID: %ld): %s\n"
+msgstr "%s: yükseltme (promote) sinyali gönderilemedi (PID: %ld): %s\n"
+
+#: pg_ctl.c:1136
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: \"%s\" yükseltme (promote) sinyal dosyası slinemedi: %s\n"
+
+#: pg_ctl.c:1146
+msgid "waiting for server to promote..."
+msgstr "sunucunun yükseltilmesi (promote) bekleniyor..."
+
+#: pg_ctl.c:1160
+msgid "server promoted\n"
+msgstr "sunucu yükseltildi (promote)\n"
+
+#: pg_ctl.c:1165
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: sunucu zamanında yükseltilemedi (promote)\n"
+
+#: pg_ctl.c:1171
+msgid "server promoting\n"
+msgstr "sunucu yükeltiliyor (promote)\n"
+
+#: pg_ctl.c:1218
+#, c-format
+msgid "%s: single-user server is running (PID: %ld)\n"
+msgstr "%s: sunucu, tek kullanıcı biçiminde çalışıyor (PID: %ld)\n"
+
+#: pg_ctl.c:1232
+#, c-format
+msgid "%s: server is running (PID: %ld)\n"
+msgstr "%s: sunucu çalışıyor (PID: %ld)\n"
+
+#: pg_ctl.c:1248
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: çalışan sunucu yok\n"
+
+#: pg_ctl.c:1265
+#, c-format
+msgid "%s: could not send signal %d (PID: %ld): %s\n"
+msgstr "%s: %d reload sinyali gönderilemedi (PID: %ld): %s\n"
+
+#: pg_ctl.c:1322
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s:Çalıştırılabilir dosya bulunamadı\n"
+
+#: pg_ctl.c:1332
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: çalıştırılabilir postgres programı bulunamadı\n"
+
+#: pg_ctl.c:1402 pg_ctl.c:1436
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: servis yöneticisi açılamadı\n"
+
+#: pg_ctl.c:1408
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: \"%s\" servisi daha önce kaydedilmiştir\n"
+
+#: pg_ctl.c:1419
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: \"%s\" servisi kayıt edilemedi: hata kodu %lu\n"
+
+#: pg_ctl.c:1442
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: \"%s\" servisi kayıtlı değil\n"
+
+#: pg_ctl.c:1449
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: \"%s\" servisi açılamadı: hata kodu %lu\n"
+
+#: pg_ctl.c:1458
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: \"%s\" servisinin kaydı silinemedi: hata kodu %lu\n"
+
+#: pg_ctl.c:1545
+msgid "Waiting for server startup...\n"
+msgstr "Sunucunun başlaması bekleniyor...\n"
+
+#: pg_ctl.c:1548
+msgid "Timed out waiting for server startup\n"
+msgstr "Sunucu başlarken zaman aşımı oldu\n"
+
+#: pg_ctl.c:1552
+msgid "Server started and accepting connections\n"
+msgstr "Sunucu başladı ve bağlantı kabul ediyor\n"
+
+#: pg_ctl.c:1607
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: \"%s\" servisi başlatılamadı: Hata kodu %lu\n"
+
+#: pg_ctl.c:1677
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: UYARI: bu platformda restricted token oluşturulamıyor\n"
+
+#: pg_ctl.c:1690
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: process token açma başarısız: hata kodu %lu\n"
+
+#: pg_ctl.c:1704
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: SIDler ayrılamadı: Hata kodu %lu\n"
+
+#: pg_ctl.c:1731
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: kısıtlı andaç (restricted token) oluşturulamıyor: hata kodu %lu\n"
+
+#: pg_ctl.c:1762
+#, c-format
+msgid "%s: WARNING: could not locate all job object functions in system API\n"
+msgstr "%s: UYARI: sistem API içinde tüm iş nesnesi fonksiyonlarının yeri belirlenemedi\n"
+
+#: pg_ctl.c:1859
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: yetkiler için LUID'ler alınamadı: hata kodu %lu\n"
+
+#: pg_ctl.c:1867 pg_ctl.c:1881
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: andaç (token) bilgisi alınamadı: hata kodu %lu\n"
+
+#: pg_ctl.c:1875
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: yetersiz bellek\n"
+
+#: pg_ctl.c:1905
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" komutunu kullanabilirsiniz.\n"
+
+#: pg_ctl.c:1913
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s bir PostgreSQL sunucusunu ilklendirmek, başlatmak, durdurmak ya da kontrol etmek için bir araçtır.\n"
+"\n"
+
+#: pg_ctl.c:1914
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: pg_ctl.c:1915
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D VERİDİZİN] [-s] [-o SEÇENEKLER]\n"
+
+#: pg_ctl.c:1916
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D VERİDİZİN] [-l DOSYAADI] [-W] [-t SANİYE] [-s]\n"
+" [-o SECENEKLER] [-p YOL] [-c]\n"
+
+#: pg_ctl.c:1918
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr ""
+" %s stop [-D VERİDİZİNİ] [-m KAPATMA_MODU] [-W] [-t SANİYE] [-s]\n"
+"\n"
+
+#: pg_ctl.c:1919
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D VERİDİZİNİ] [-m KAPATMA-MODU] [-W] [-t SANİYE] [-s]\n"
+" [-o SEÇENEKLER] [-c]\n"
+"\n"
+
+#: pg_ctl.c:1921
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D VERİ_DİZİNİ] [-s]\n"
+
+#: pg_ctl.c:1922
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D VERİ_DİZİNİ]\n"
+
+#: pg_ctl.c:1923
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr ""
+" %s promote [-D VERİDİZİNİ] [-W] [-t SANİYE] [-s]\n"
+"\n"
+
+#: pg_ctl.c:1924
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill SİNYAL_ADI SÜREÇ_NUMARASI\n"
+
+#: pg_ctl.c:1926
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D VERİDİZİNİ] [-N SERVISADI] [-U KULLANICIADI] [-P PAROLA]\n"
+" [-S BAŞLATMA-TİPİ] [-e KAYNAK] [-W] [-t SANİYE] [-s] [-o SEÇENEKLER]\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N SERVİS_ADI]\n"
+
+#: pg_ctl.c:1931
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Ortak seçenekler:\n"
+
+#: pg_ctl.c:1932
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=VERİDİZİNİ verinin tutulacağı alan\n"
+
+#: pg_ctl.c:1934
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e SOURCE servis olarak çalışırken loglama için olay (event) kaynağı\n"
+
+#: pg_ctl.c:1936
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent sadece hataları yazar, hiç bir bilgi mesajı yazmaz\n"
+
+#: pg_ctl.c:1937
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SANİYE -w seçeneğini kullanırken beklenecek saniye\n"
+
+#: pg_ctl.c:1938
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#: pg_ctl.c:1939
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait işlem bitene kadar bekle (varsayılan)\n"
+
+#: pg_ctl.c:1940
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait işlem bitene kadar bekleme\n"
+
+#: pg_ctl.c:1941
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#: pg_ctl.c:1942
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Eğer -D seçeneği gözardı edilirse, PGDATA çevresel değişkeni kullanılacaktır.\n"
+
+#: pg_ctl.c:1944
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Başlamak ya da yeniden başlamak için seçenekler:\n"
+
+#: pg_ctl.c:1946
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files postgres'in core dosyaları oluşturmasına izin ver\n"
+
+#: pg_ctl.c:1948
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files bu platformda uygulanmaz\n"
+
+#: pg_ctl.c:1950
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=DOSYA_ADI sunucu loglarını DOSYA_ADI dosyasına yaz (ya da dosyanın sonuna ekle).\n"
+
+#: pg_ctl.c:1951
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=SEÇENEKLER postgres'e (PostgreSQL sunucusu çalıştırılabilir dosyası)\n"
+" ya da initdb'ye geçilecek komut satırı seçenekleri\n"
+
+#: pg_ctl.c:1953
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p PATH-TO-POSTGRES normalde gerekli değildir\n"
+
+#: pg_ctl.c:1954
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Durdurmak ya da yeniden başlatmak için seçenekler:\n"
+
+#: pg_ctl.c:1955
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=MOD MOD \"smart\", \"fast\", veya \"immediate\" olabilir\n"
+
+#: pg_ctl.c:1957
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Kapatma modları:\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart tüm istemciler bağlantılarını kestikten sonra dur\n"
+
+#: pg_ctl.c:1959
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast düzgünce kapanarak direk olarak dur (varsayılan)\n"
+
+#: pg_ctl.c:1960
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate tam bir kapanma gerçekleşmeden dur; yeniden başladığında kurtarma modunda açılır\n"
+
+#: pg_ctl.c:1962
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"kill için izin verilen sinyal adları:\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Kaydetmek ya da kaydı silmek için seçenekler:\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N SERVICENAME PostgreSQL sunucusunu kaydedeceğiniz servis adı\n"
+
+#: pg_ctl.c:1968
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P PASSWORD PostgreSQL sunucusunu kaydetmek için hesabın şifresi\n"
+
+#: pg_ctl.c:1969
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U USERNAME PostgreSQL sunucusunu kaydetmek için gerekli kullanıcı adı\n"
+
+#: pg_ctl.c:1970
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S START-TYPE PostgreSQL sunucusunu kaydedeceğiniz servis başlama tipi\n"
+
+#: pg_ctl.c:1972
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Başlama tipleri: \n"
+
+#: pg_ctl.c:1973
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto sistem açılışında servisi otomatik başlat (varsayılan)\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand hizmeti talep üzerine başlat\n"
+
+#: pg_ctl.c:1977
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"Hataları <pgsql-bugs@postgresql.org> adresine bildiriniz.\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: geçersiz kapanma modu \"%s\"\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: geçersiz sinyal adı \"%s\"\n"
+
+#: pg_ctl.c:2048
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: geçersiz başlama tipi \"%s\"\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: \"%s\" komutu kullanılarak veri dizini belirlenemedi\n"
+
+#: pg_ctl.c:2128
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: kontrol dosyası bozuk görünüyor\n"
+
+#: pg_ctl.c:2199
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: root olarak çalıştırılamaz\n"
+"Lütfen (yani \"su\" kullanarak) sunucu sürecine sahip olacak (yetkisiz) kullanıcı\n"
+"ile sisteme giriş yapınız.\n"
+
+#: pg_ctl.c:2283
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: -S seçeneği bu platformda desteklenmiyor.\n"
+
+#: pg_ctl.c:2320
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: çok fazla komut satırı argümanı (ilki : \"%s\")\n"
+
+#: pg_ctl.c:2344
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: kill modu için eksik argümanlar\n"
+
+#: pg_ctl.c:2362
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: geçersiz işlem modu \"%s\"\n"
+
+#: pg_ctl.c:2372
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: hiçbir işlem belirtilmedi\n"
+
+#: pg_ctl.c:2393
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: Hiçbir veritabanı dizini belirtilmemiş ve PGDATA çevresel değişkeni boş\n"
+
+#~ msgid "%s: could not start server: exit code was %d\n"
+#~ msgstr "%s: sunucu başlatılamadı: çıkış kodu: %d\n"
+
+#~ msgid "server is still starting up\n"
+#~ msgstr "sunucu hala başlıyor\n"
+
+#, fuzzy
+#~ msgid "%s: could not wait for server because of misconfiguration\n"
+#~ msgstr "geçersiz ayarlarından dolayı autovacuum çalıştırılamadı"
+
+#~ msgid " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n"
+#~ msgstr " %s start [-w] [-t saniye] [-D VERİ_DİZİNİ] [-s] [-l DOSYA_ADI] [-o \"SEÇENEKLER\"]\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help Bu yardımı göster ve çık\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version sürüm numarasını yazar ve çıkar\n"
+
+#~ msgid ""
+#~ "(The default is to wait for shutdown, but not for start or restart.)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "(Ön tanımlı işlem kapanmak için beklemektir; başlamak ya da yeniden başlamak değildir.)\n"
+#~ "\n"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "çalışma dizini \"%s\" olarak değiştirilemedi"
+
+#~ msgid ""
+#~ "%s is a utility to start, stop, restart, reload configuration files,\n"
+#~ "report the status of a PostgreSQL server, or signal a PostgreSQL process.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s başlatmak, durdurmak, yeniden başlatmak, yapılandırma dosyalarını yeniden yüklemek\n"
+#~ "PostgreSQL sunucusunun durumunu bildirmek, ya da PostgreSQL sürecini öldürmek için bir yardımcı programdır\n"
+#~ "\n"
diff --git a/src/bin/pg_ctl/po/uk.po b/src/bin/pg_ctl/po/uk.po
new file mode 100644
index 0000000..79531ef
--- /dev/null
+++ b/src/bin/pg_ctl/po/uk.po
@@ -0,0 +1,818 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:48+0000\n"
+"PO-Revision-Date: 2022-09-13 12:09\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_ctl.pot\n"
+"X-Crowdin-File-ID: 878\n"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "не вдалося визначити поточний каталог: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "невірний бінарний файл \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "неможливо прочитати бінарний файл \"%s\""
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "неможливо знайти \"%s\" для виконання"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "не вдалося змінити каталог на \"%s\": %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "не можливо прочитати символічне послання \"%s\": %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() помилка: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "недостатньо пам'яті"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "недостатньо пам'яті\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "неможливо дублювати нульовий покажчик (внутрішня помилка)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "неможливо виконати команду"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "команду не знайдено"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "дочірній процес завершився з кодом виходу %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "дочірній процес перервано через помилку 0х%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "дочірній процес перервано через сигнал %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "дочірній процес завершився з невизнаним статусом %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "не вдалося отримати поточний робочий каталог: %s\n"
+
+#: pg_ctl.c:260
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: директорія \"%s\" не існує\n"
+
+#: pg_ctl.c:263
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: немає доступу до каталогу \"%s\": %s\n"
+
+#: pg_ctl.c:276
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: каталог \"%s\" не є каталогом кластера бази даних\n"
+
+#: pg_ctl.c:289
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: не вдалося відкрити файл PID \"%s\": %s\n"
+
+#: pg_ctl.c:298
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: файл PID \"%s\" пустий\n"
+
+#: pg_ctl.c:301
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: невірні дані у файлі PID \"%s\"\n"
+
+#: pg_ctl.c:464 pg_ctl.c:506
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: не вдалося запустити сервер: %s\n"
+
+#: pg_ctl.c:484
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: не вдалося запустити сервер через помилку setsid(): %s\n"
+
+#: pg_ctl.c:554
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: не вдалося відкрити файл журналу \"%s\": %s\n"
+
+#: pg_ctl.c:571
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: не вдалося запустити сервер: код помилки %lu\n"
+
+#: pg_ctl.c:788
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: не вдалося встановити обмеження на розмір файлу; заборонено жорстким лімітом\n"
+
+#: pg_ctl.c:814
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: не вдалося прочитати файл \"%s\"\n"
+
+#: pg_ctl.c:819
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: файл параметрів \"%s\" повинен містити рівно один рядок\n"
+
+#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112
+#, c-format
+msgid "%s: could not send stop signal (PID: %ld): %s\n"
+msgstr "%s: не вдалося надіслати стоп-сигнал (PID: %ld): %s\n"
+
+#: pg_ctl.c:889
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "програма \"%s\" потрібна для %s, але не знайдена в тому ж каталозі, що й \"%s\"\n"
+
+#: pg_ctl.c:892
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "програма \"%s\" знайдена для \"%s\", але має відмінну версію від %s\n"
+
+#: pg_ctl.c:923
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: не вдалося виконати ініціалізацію системи бази даних\n"
+
+#: pg_ctl.c:938
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: мабуть, інший сервер вже працює; у будь-якому разі спробуємо запустити сервер\n"
+
+#: pg_ctl.c:986
+msgid "waiting for server to start..."
+msgstr "очікується запуск серверу..."
+
+#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243
+msgid " done\n"
+msgstr " готово\n"
+
+#: pg_ctl.c:992
+msgid "server started\n"
+msgstr "сервер запущено\n"
+
+#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248
+msgid " stopped waiting\n"
+msgstr " очікування припинено\n"
+
+#: pg_ctl.c:996
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: сервер не було запущено вчасно\n"
+
+#: pg_ctl.c:1002
+#, c-format
+msgid "%s: could not start server\n"
+"Examine the log output.\n"
+msgstr "%s: неможливо запустити сервер\n"
+"Передивіться протокол виконання.\n"
+
+#: pg_ctl.c:1010
+msgid "server starting\n"
+msgstr "запуск серверу\n"
+
+#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: файл PID \"%s\" не існує\n"
+
+#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273
+msgid "Is server running?\n"
+msgstr "Сервер працює?\n"
+
+#: pg_ctl.c:1036
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n"
+msgstr "%s: не можливо зупинити сервер; сервер запущений в режимі single-user (PID: %ld)\n"
+
+#: pg_ctl.c:1051
+msgid "server shutting down\n"
+msgstr "сервер зупиняється\n"
+
+#: pg_ctl.c:1056 pg_ctl.c:1117
+msgid "waiting for server to shut down..."
+msgstr "очікується зупинка серверу..."
+
+#: pg_ctl.c:1060 pg_ctl.c:1122
+msgid " failed\n"
+msgstr " помилка\n"
+
+#: pg_ctl.c:1062 pg_ctl.c:1124
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: сервер не зупинено\n"
+
+#: pg_ctl.c:1064 pg_ctl.c:1126
+msgid "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr "ПІДКАЗКА: Режим \"-m fast\" закриває сесії відразу, не чекаючи на відключення ініційовані сесіями.\n"
+
+#: pg_ctl.c:1070 pg_ctl.c:1132
+msgid "server stopped\n"
+msgstr "сервер зупинено\n"
+
+#: pg_ctl.c:1091
+msgid "trying to start server anyway\n"
+msgstr "спроба запуску серверу в будь-якому разі\n"
+
+#: pg_ctl.c:1100
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n"
+msgstr "%s: не можливо перезапустити сервер; сервер запущений в режимі single-user (PID: %ld)\n"
+
+#: pg_ctl.c:1103 pg_ctl.c:1162
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Будь ласка, припиніть однокористувацький сервер та спробуйте ще раз.\n"
+
+#: pg_ctl.c:1136
+#, c-format
+msgid "%s: old server process (PID: %ld) seems to be gone\n"
+msgstr "%s: старий серверний процес (PID: %ld), здається, зник\n"
+
+#: pg_ctl.c:1138
+msgid "starting server anyway\n"
+msgstr "запуск серверу в будь-якому разі\n"
+
+#: pg_ctl.c:1159
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgstr "%s: неможливо перезавантажити сервер; сервер запущено в однокористувацькому режимі (PID: %ld)\n"
+
+#: pg_ctl.c:1168
+#, c-format
+msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgstr "%s: не можливо надіслати сигнал перезавантаження (PID: %ld): %s\n"
+
+#: pg_ctl.c:1173
+msgid "server signaled\n"
+msgstr "серверу надіслано сигнал\n"
+
+#: pg_ctl.c:1198
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n"
+msgstr "%s: неможливо підвищити сервер; сервер запущено в режимі single-user (PID: %ld)\n"
+
+#: pg_ctl.c:1206
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: неможливо підвищити сервер; сервер запущено не в режимі резерву\n"
+
+#: pg_ctl.c:1216
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: неможливо створити файл \"%s\" із сигналом для підвищення: %s\n"
+
+#: pg_ctl.c:1222
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: неможливо записати файл \"%s\" із сигналом для підвищення: %s\n"
+
+#: pg_ctl.c:1230
+#, c-format
+msgid "%s: could not send promote signal (PID: %ld): %s\n"
+msgstr "%s: неможливо надіслати сигнал підвищення (PID: %ld): %s\n"
+
+#: pg_ctl.c:1233
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: неможливо видалити файл \"%s\" із сигналом для підвищення: %s\n"
+
+#: pg_ctl.c:1240
+msgid "waiting for server to promote..."
+msgstr "очікується підвищення серверу..."
+
+#: pg_ctl.c:1244
+msgid "server promoted\n"
+msgstr "сервер підвищено\n"
+
+#: pg_ctl.c:1249
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: сервер не було підвищено вчасно\n"
+
+#: pg_ctl.c:1255
+msgid "server promoting\n"
+msgstr "сервер підвищується\n"
+
+#: pg_ctl.c:1279
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n"
+msgstr "%s: не можливо розвернути файл журналу; сервер працює в режимі одного користувача (PID: %ld)\n"
+
+#: pg_ctl.c:1289
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: не вдалося створити файл сигналу розвороту журналу \"%s\": %s\n"
+
+#: pg_ctl.c:1295
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: не вдалося записати у файл сигналу розвороту журналу \"%s\": %s\n"
+
+#: pg_ctl.c:1303
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %ld): %s\n"
+msgstr "%s: не вдалося надіслати сигнал розвороту журналу (PID: %ld): %s\n"
+
+#: pg_ctl.c:1306
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: не вдалося видалити файл сигналу розвороту журналу \"%s\": %s\n"
+
+#: pg_ctl.c:1311
+msgid "server signaled to rotate log file\n"
+msgstr "серверу надіслано сигнал для розворот файлу журналу\n"
+
+#: pg_ctl.c:1358
+#, c-format
+msgid "%s: single-user server is running (PID: %ld)\n"
+msgstr "%s: однокористувацький сервер працює (PID: %ld)\n"
+
+#: pg_ctl.c:1372
+#, c-format
+msgid "%s: server is running (PID: %ld)\n"
+msgstr "%s: сервер працює (PID: %ld)\n"
+
+#: pg_ctl.c:1388
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: сервер не працює \n"
+
+#: pg_ctl.c:1405
+#, c-format
+msgid "%s: could not send signal %d (PID: %ld): %s\n"
+msgstr "%s: не вдалося надіслати сигнал %d (PID: %ld): %s\n"
+
+#: pg_ctl.c:1436
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: не вдалося знайти ехе файл власної програми\n"
+
+#: pg_ctl.c:1446
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: не вдалося знайти виконану програму postgres\n"
+
+#: pg_ctl.c:1516 pg_ctl.c:1550
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: не вдалося відкрити менеджер служб\n"
+
+#: pg_ctl.c:1522
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: служба \"%s\" вже зареєстрована \n"
+
+#: pg_ctl.c:1533
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: не вдалося зареєструвати службу \"%s\": код помилки %lu\n"
+
+#: pg_ctl.c:1556
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: служба \"%s\" не зареєстрована \n"
+
+#: pg_ctl.c:1563
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: не вдалося відкрити службу \"%s\": код помилки %lu\n"
+
+#: pg_ctl.c:1572
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: не вдалося видалити службу \"%s\": код помилки %lu\n"
+
+#: pg_ctl.c:1659
+msgid "Waiting for server startup...\n"
+msgstr "Очікування запуску сервера...\n"
+
+#: pg_ctl.c:1662
+msgid "Timed out waiting for server startup\n"
+msgstr "Перевищено час очікування запуску сервера\n"
+
+#: pg_ctl.c:1666
+msgid "Server started and accepting connections\n"
+msgstr "Сервер запущений і приймає з'єднання\n"
+
+#: pg_ctl.c:1721
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: не вдалося почати службу \"%s\": код помилки %lu\n"
+
+#: pg_ctl.c:1824
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: УВАГА: не вдалося створити обмежені токени на цій платформі\n"
+
+#: pg_ctl.c:1837
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: не вдалося відкрити токен процесу: код помилки %lu\n"
+
+#: pg_ctl.c:1851
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: не вдалося виділити SID: код помилки %lu\n"
+
+#: pg_ctl.c:1878
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: не вдалося створити обмежений токен: код помилки %lu\n"
+
+#: pg_ctl.c:1909
+#, c-format
+msgid "%s: WARNING: could not locate all job object functions in system API\n"
+msgstr "%s: ПОПЕРЕДЖЕННЯ: не вдалося знайти усі робочі функції у системному API для завдань\n"
+
+#: pg_ctl.c:2006
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: не вдалося отримати LUIDs для прав: код помилки %lu\n"
+
+#: pg_ctl.c:2014 pg_ctl.c:2029
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: не вдалося отримати інформацію токену: код помилки %lu\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: бракує пам'яті\n"
+
+#: pg_ctl.c:2053
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n"
+
+#: pg_ctl.c:2061
+#, c-format
+msgid "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n\n"
+msgstr "%s - це утиліта для ініціалізації, запуску, зупинки і контролю серверу PostgreSQL.\n\n"
+
+#: pg_ctl.c:2062
+#, c-format
+msgid "Usage:\n"
+msgstr "Використання:\n"
+
+#: pg_ctl.c:2063
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D КАТАЛОГ-ДАНИХ] [-s] [-o ПАРАМЕТРИ]\n"
+
+#: pg_ctl.c:2064
+#, c-format
+msgid " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr " %s start [-D КАТАЛОГ-ДАНИХ] [-l ІМ'Я-ФАЙЛ] [-W] [-t СЕК] [-s]\n"
+" [-o ПАРАМЕТРИ] [-p ШЛЯХ] [-c]\n"
+
+#: pg_ctl.c:2066
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D КАТАЛОГ-ДАНИХ] [-m РЕЖИМ-ЗУПИНКИ] [-W] [-t СЕК] [-s]\n"
+
+#: pg_ctl.c:2067
+#, c-format
+msgid " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr " %s restart [-D КАТАЛОГ-ДАНИХ] [-m РЕЖИМ-ЗУПИНКИ] [-W] [-t СЕК] [-s]\n"
+" [-o ПАРАМЕТРИ] [-c]\n"
+
+#: pg_ctl.c:2069
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D КАТАЛОГ-ДАНИХ] [-s]\n"
+
+#: pg_ctl.c:2070
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DATADIR]\n"
+
+#: pg_ctl.c:2071
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D КАТАЛОГ-ДАНИХ] [-W] [-t СЕК] [-s]\n"
+
+#: pg_ctl.c:2072
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:2073
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill ІМ'Я-СИГНАЛУ PID\n"
+
+#: pg_ctl.c:2075
+#, c-format
+msgid " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr " %s register [-D КАТАЛОГ-ДАНИХ] [-N ІМ'Я-СЛУЖБИ] [-U ІМ'Я-КОРИСТУВАЧА] [-P ПАРОЛЬ]\n"
+" [-S ТИП-ЗАПУСКУ] [-e ДЖЕРЕЛО] [-W] [-t СЕК] [-s] [-o ПАРАМЕТРИ]\n"
+
+#: pg_ctl.c:2077
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N ІМ'Я-СЛУЖБИ]\n"
+
+#: pg_ctl.c:2080
+#, c-format
+msgid "\n"
+"Common options:\n"
+msgstr "\n"
+"Загальні параметри:\n"
+
+#: pg_ctl.c:2081
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=КАТАЛОГ-ДАНИХ розташування простору зберігання бази даних\n"
+
+#: pg_ctl.c:2083
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e ДЖЕРЕЛО джерело подій для протоколу при запуску в якості послуги\n"
+
+#: pg_ctl.c:2085
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent виводити лише помилки, без інформаційних повідомлень\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=СЕК час очікування при використанні -w параметра\n"
+
+#: pg_ctl.c:2087
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію і вийти\n"
+
+#: pg_ctl.c:2088
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait чекати завершення операції (за замовчуванням)\n"
+
+#: pg_ctl.c:2089
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait не чекати завершення операції\n"
+
+#: pg_ctl.c:2090
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку потім вийти\n"
+
+#: pg_ctl.c:2091
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Якщо -D параметр пропущено, використовувати змінну середовища PGDATA.\n"
+
+#: pg_ctl.c:2093
+#, c-format
+msgid "\n"
+"Options for start or restart:\n"
+msgstr "\n"
+"Параметри запуску або перезапуску:\n"
+
+#: pg_ctl.c:2095
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files дозволяти postgres створювати дампи пам'яті\n"
+
+#: pg_ctl.c:2097
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files недопустимо цією платформою\n"
+
+#: pg_ctl.c:2099
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=ФАЙЛ записувати (або додавати) протокол служби до ФАЙЛ\n"
+
+#: pg_ctl.c:2100
+#, c-format
+msgid " -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr " -o, --options=ПАРАМЕТРИ параметри командного рядку для PostgreSQL або initdb\n"
+
+#: pg_ctl.c:2102
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p ШЛЯХ-ДО-СЕРВЕРУ зазвичай зайвий\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "\n"
+"Options for stop or restart:\n"
+msgstr "\n"
+"Параметри припинення або перезапуску:\n"
+
+#: pg_ctl.c:2104
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=РЕЖИМ РЕЖИМ може бути \"smart\", \"fast\", або \"immediate\"\n"
+
+#: pg_ctl.c:2106
+#, c-format
+msgid "\n"
+"Shutdown modes are:\n"
+msgstr "\n"
+"Режими зупинки:\n"
+
+#: pg_ctl.c:2107
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart вийти після від'єднання усіх клієнтів\n"
+
+#: pg_ctl.c:2108
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast вийти негайно з коректним вимкненням (за замовченням)\n"
+
+#: pg_ctl.c:2109
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate вийти негайно без повної процедури. Приведе до відновлення під час перезапуску\n"
+
+#: pg_ctl.c:2111
+#, c-format
+msgid "\n"
+"Allowed signal names for kill:\n"
+msgstr "\n"
+"Дозволенні сигнали для команди kill:\n"
+
+#: pg_ctl.c:2115
+#, c-format
+msgid "\n"
+"Options for register and unregister:\n"
+msgstr "\n"
+"Параметри для реєстрації і видалення: \n"
+
+#: pg_ctl.c:2116
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N ІМ'Я-СЛУЖБИ ім'я служби під яким зареєструвати сервер PostgreSQL\n"
+
+#: pg_ctl.c:2117
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P ПАРОЛЬ пароль облікового запису для реєстрації серверу PostgreSQL\n"
+
+#: pg_ctl.c:2118
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U КОРИСТУВАЧ ім'я користувача під яким зареєструвати сервер PostgreSQL\n"
+
+#: pg_ctl.c:2119
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S ТИП-ЗАПУСКУ тип запуску служби для реєстрації серверу PostgreSQL\n"
+
+#: pg_ctl.c:2121
+#, c-format
+msgid "\n"
+"Start types are:\n"
+msgstr "\n"
+"Типи запуску:\n"
+
+#: pg_ctl.c:2122
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto запускати сервер автоматично під час запуску системи (за замовчуванням)\n"
+
+#: pg_ctl.c:2123
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand запускати сервер за потреби\n"
+
+#: pg_ctl.c:2126
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"Повідомляти про помилки на <%s>.\n"
+
+#: pg_ctl.c:2127
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: pg_ctl.c:2152
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: невідомий режим завершення \"%s\"\n"
+
+#: pg_ctl.c:2181
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: невідомий сигнал \"%s\"\n"
+
+#: pg_ctl.c:2198
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: невідомий тип запуску \"%s\"\n"
+
+#: pg_ctl.c:2253
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: неможливо визначити каталог даних за допомогою команди \"%s\"\n"
+
+#: pg_ctl.c:2277
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: контрольний файл видається пошкодженим\n"
+
+#: pg_ctl.c:2345
+#, c-format
+msgid "%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr "%s: не може бути запущеним від ім'я супер-користувача\n"
+" Будь ласка увійдіть (використовуючи наприклад, \"su\") як (непривілейований) користувач який буде мати\n"
+"свій серверний процес. \n"
+
+#: pg_ctl.c:2428
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: параметр -S не підтримується цією платформою\n"
+
+#: pg_ctl.c:2465
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: забагато аргументів у командному рядку (перший \"%s\")\n"
+
+#: pg_ctl.c:2491
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: відсутні аргументи для режиму kill\n"
+
+#: pg_ctl.c:2509
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: невідомий режим роботи \"%s\"\n"
+
+#: pg_ctl.c:2519
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: команда не вказана\n"
+
+#: pg_ctl.c:2540
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: не вказано каталог даних і змінна середовища PGDATA не встановлена\n"
+
diff --git a/src/bin/pg_ctl/po/zh_CN.po b/src/bin/pg_ctl/po/zh_CN.po
new file mode 100644
index 0000000..7c2c52f
--- /dev/null
+++ b/src/bin/pg_ctl/po/zh_CN.po
@@ -0,0 +1,874 @@
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:46+0000\n"
+"PO-Revision-Date: 2021-08-15 17:46+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified)<zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.7\n"
+
+#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "无法确认当前目录: %m"
+
+#: ../../common/exec.c:155
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "无效的二进制码 \"%s\""
+
+#: ../../common/exec.c:205
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "无法读取二进制码 \"%s\""
+
+#: ../../common/exec.c:213
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "未能找到一个 \"%s\" 来执行"
+
+#: ../../common/exec.c:269 ../../common/exec.c:308
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "无法跳转到目录 \"%s\" 中: %m"
+
+#: ../../common/exec.c:286
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "无法读取符号链接 \"%s\": %m"
+
+#: ../../common/exec.c:409
+msgid "%s() failed: %m"
+msgstr "%s()失败: %m"
+
+#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659
+msgid "out of memory"
+msgstr "内存不足"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#: ../../port/path.c:632 ../../port/path.c:670 ../../port/path.c:687
+#, c-format
+msgid "out of memory\n"
+msgstr "内存不足\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "无法复制空指针 (内部错误)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "无法执行命令"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "命令没有找到"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "子进程已退出, 退出码为 %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "子进程被例外(exception) 0x%X 终止"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "子进程被信号 %d 终止: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "子进程已退出, 未知状态 %d"
+
+#: ../../port/path.c:654
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "无法得到当前工作目录: %s\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: 目录 \"%s\" 不存在\n"
+
+#: pg_ctl.c:261
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: 无法访问目录 \"%s\": %s\n"
+
+#: pg_ctl.c:274
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: 目录 \"%s\"不是一个数据库集群目录\n"
+
+#: pg_ctl.c:287
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: 无法打开 PID 文件 \"%s\": %s\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: PID 文件 \"%s\" 为空\n"
+
+#: pg_ctl.c:299
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: PID文件 \"%s\" 中存在无效数据\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: 无法启动服务器:%s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: 由于setsid()调用失败无法启动服务器:%s\n"
+
+# command.c:1148
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s:无法开启日志文件 \"%s\":%s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s:无法启动服务器:错误代码%lu\n"
+
+#: pg_ctl.c:712
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: 不能设置核心文件大小的限制;磁盘限额不允许\n"
+
+#: pg_ctl.c:738
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: 无法读取文件 \"%s\"\n"
+
+#: pg_ctl.c:743
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: 选项文件 \"%s\" 只能有一行\n"
+
+#: pg_ctl.c:785 pg_ctl.c:974 pg_ctl.c:1070
+#, c-format
+msgid "%s: could not send stop signal (PID: %ld): %s\n"
+msgstr "%s: 无法发送停止信号 (PID: %ld): %s\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid ""
+"The program \"%s\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation.\n"
+msgstr ""
+"%2$s需要程序\"%1$s\"\n"
+"但在与\"%3$s\"相同的目录中找不到该程序.\n"
+"检查您的安装.\n"
+
+#: pg_ctl.c:818
+#, c-format
+msgid ""
+"The program \"%s\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation.\n"
+msgstr ""
+"程序\"%s\"是由\"%s\"找到的\n"
+"但与%s的版本不同.\n"
+"检查您的安装.\n"
+
+#: pg_ctl.c:851
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: 数据库系统初始化失败\n"
+
+#: pg_ctl.c:866
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: 其他服务器进程可能正在运行; 尝试启动服务器进程\n"
+
+#: pg_ctl.c:914
+msgid "waiting for server to start..."
+msgstr "等待服务器进程启动 ..."
+
+#: pg_ctl.c:919 pg_ctl.c:1024 pg_ctl.c:1116 pg_ctl.c:1241
+msgid " done\n"
+msgstr " 完成\n"
+
+#: pg_ctl.c:920
+msgid "server started\n"
+msgstr "服务器进程已经启动\n"
+
+#: pg_ctl.c:923 pg_ctl.c:929 pg_ctl.c:1246
+msgid " stopped waiting\n"
+msgstr " 已停止等待\n"
+
+#: pg_ctl.c:924
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: 服务没有及时启动\n"
+
+#: pg_ctl.c:930
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: 无法启动服务器进程\n"
+"检查日志输出.\n"
+
+#: pg_ctl.c:938
+msgid "server starting\n"
+msgstr "正在启动服务器进程\n"
+
+#: pg_ctl.c:959 pg_ctl.c:1046 pg_ctl.c:1137 pg_ctl.c:1176 pg_ctl.c:1270
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: PID 文件 \"%s\" 不存在\n"
+
+#: pg_ctl.c:960 pg_ctl.c:1048 pg_ctl.c:1138 pg_ctl.c:1177 pg_ctl.c:1271
+msgid "Is server running?\n"
+msgstr "服务器进程是否正在运行?\n"
+
+#: pg_ctl.c:966
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n"
+msgstr "%s: 无法停止服务器进程; 正在运行 单用户模式服务器进程(PID: %ld)\n"
+
+#: pg_ctl.c:981
+msgid "server shutting down\n"
+msgstr "正在关闭服务器进程\n"
+
+#: pg_ctl.c:996 pg_ctl.c:1085
+msgid ""
+"WARNING: online backup mode is active\n"
+"Shutdown will not complete until pg_stop_backup() is called.\n"
+"\n"
+msgstr ""
+"警告: 在线备份模式处于激活状态\n"
+"关闭命令将不会完成,直到调用了pg_stop_backup().\n"
+
+#: pg_ctl.c:1000 pg_ctl.c:1089
+msgid "waiting for server to shut down..."
+msgstr "等待服务器进程关闭 ..."
+
+#: pg_ctl.c:1016 pg_ctl.c:1107
+msgid " failed\n"
+msgstr " 失败\n"
+
+#: pg_ctl.c:1018 pg_ctl.c:1109
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: server进程没有关闭\n"
+
+#: pg_ctl.c:1020 pg_ctl.c:1111
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"提示: \"-m fast\" 选项可以立即断开会话, 而不用\n"
+"等待会话发起的断连.\n"
+
+#: pg_ctl.c:1026 pg_ctl.c:1117
+msgid "server stopped\n"
+msgstr "服务器进程已经关闭\n"
+
+#: pg_ctl.c:1049
+msgid "trying to start server anyway\n"
+msgstr "尝试启动服务器进程\n"
+
+#: pg_ctl.c:1058
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n"
+msgstr "%s: 无法重启服务器进程; 单用户模式服务器进程正在运行 (PID: %ld)\n"
+
+#: pg_ctl.c:1061 pg_ctl.c:1147
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "请终止单用户模式服务器进程,然后再重试.\n"
+
+#: pg_ctl.c:1121
+#, c-format
+msgid "%s: old server process (PID: %ld) seems to be gone\n"
+msgstr "%s: 原有的进程(PID: %ld)可能已经不存在了\n"
+
+#: pg_ctl.c:1123
+msgid "starting server anyway\n"
+msgstr "正在启动服务器进程\n"
+
+#: pg_ctl.c:1144
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgstr "%s: 无法重新加载服务器进程;正在运行单用户模式的服务器进程 (PID: %ld)\n"
+
+#: pg_ctl.c:1153
+#, c-format
+msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgstr "%s: 无法发送重载信号 (PID: %ld): %s\n"
+
+#: pg_ctl.c:1158
+msgid "server signaled\n"
+msgstr "服务器进程发出信号\n"
+
+#: pg_ctl.c:1183
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n"
+msgstr "%s: 无法重新加载服务器进程;正在运行单用户模式的服务器进程 (PID: %ld)\n"
+
+#: pg_ctl.c:1191
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: 无法重新加载服务器进程;服务器没有运行在standby模式下\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: 无法创建重新加载信号文件 \"%s\": %s\n"
+
+#: pg_ctl.c:1207
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: 无法写入重新加载文件 \"%s\": %s\n"
+
+#: pg_ctl.c:1215
+#, c-format
+msgid "%s: could not send promote signal (PID: %ld): %s\n"
+msgstr "%s: 无法发送重载信号(PID: %ld): %s\n"
+
+#: pg_ctl.c:1218
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: 无法移动重新加载信号文件 \"%s\": %s\n"
+
+#: pg_ctl.c:1228
+msgid "waiting for server to promote..."
+msgstr "等待服务器进程加载 ..."
+
+#: pg_ctl.c:1242
+msgid "server promoted\n"
+msgstr "服务器加载完毕\n"
+
+#: pg_ctl.c:1247
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: 服务进程没有及时加载\n"
+
+#: pg_ctl.c:1253
+msgid "server promoting\n"
+msgstr "服务器重新加载中\n"
+
+#: pg_ctl.c:1277
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n"
+msgstr "%s: 无法轮换日志文件;正在运行单用户模式的服务器进程 (PID: %ld)\n"
+
+#: pg_ctl.c:1287
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: 无法创建日志轮换信号文件 \"%s\": %s\n"
+
+#: pg_ctl.c:1293
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: 无法写入日志轮换信号文件 \"%s\": %s\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %ld): %s\n"
+msgstr "%s: 无法发送日志轮换信号 (PID: %ld): %s\n"
+
+#: pg_ctl.c:1304
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: 无法删除日志轮换信号文件 \"%s\": %s\n"
+
+#: pg_ctl.c:1309
+msgid "server signaled to rotate log file\n"
+msgstr "服务器发出轮换日志文件的信号\n"
+
+#: pg_ctl.c:1356
+#, c-format
+msgid "%s: single-user server is running (PID: %ld)\n"
+msgstr "%s: 正在运行单用户模式服务器进程 (PID: %ld)\n"
+
+#: pg_ctl.c:1370
+#, c-format
+msgid "%s: server is running (PID: %ld)\n"
+msgstr "%s: 正在运行服务器进程(PID: %ld)\n"
+
+#: pg_ctl.c:1386
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s:没有服务器进程正在运行\n"
+
+#: pg_ctl.c:1403
+#, c-format
+msgid "%s: could not send signal %d (PID: %ld): %s\n"
+msgstr "%s: 无法发送信号 %d (PID: %ld): %s\n"
+
+#: pg_ctl.c:1434
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 无法找到执行文件\n"
+
+#: pg_ctl.c:1444
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: 无法找到postgres程序的执行文件\n"
+
+#: pg_ctl.c:1514 pg_ctl.c:1548
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: 无法打开服务管理器\n"
+
+#: pg_ctl.c:1520
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: 服务 \"%s\" 已经注册了\n"
+
+#: pg_ctl.c:1531
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: 无法注册服务 \"%s\": 错误码 %lu\n"
+
+#: pg_ctl.c:1554
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: 服务 \"%s\" 没有注册\n"
+
+#: pg_ctl.c:1561
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: 无法打开服务 \"%s\": 错误码 %lu\n"
+
+#: pg_ctl.c:1570
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: 无法注销服务 \"%s\": 错误码 %lu\n"
+
+#: pg_ctl.c:1657
+msgid "Waiting for server startup...\n"
+msgstr "等待服务器进程启动 ...\n"
+
+#: pg_ctl.c:1660
+msgid "Timed out waiting for server startup\n"
+msgstr "在等待服务器启动时超时\n"
+
+#: pg_ctl.c:1664
+msgid "Server started and accepting connections\n"
+msgstr "服务器进程已启动并且接受连接\n"
+
+#: pg_ctl.c:1719
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: 无法启动服务 \"%s\": 错误码 %lu\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: 警告: 该平台上无法创建受限令牌\n"
+
+#: pg_ctl.c:1802
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: 无法打开进程令牌 (token): 错误码 %lu\n"
+
+#: pg_ctl.c:1816
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: 无法分配SID: 错误码 %lu\n"
+
+#: pg_ctl.c:1843
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: 无法创建继承套接字: 错误码为 %lu\n"
+
+#: pg_ctl.c:1874
+#, c-format
+msgid "%s: WARNING: could not locate all job object functions in system API\n"
+msgstr "%s: 警告: 系统API中无法定位所有工作对象函数\n"
+
+#: pg_ctl.c:1971
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: 由于权限无法获取LUID: 错误码 %lu\n"
+
+#: pg_ctl.c:1979 pg_ctl.c:1994
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: 无法获得令牌信息: 错误码 %lu\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: 内存不足\n"
+
+#: pg_ctl.c:2018
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获取更多的信息.\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s 是一个用于初始化、启动、停止或控制PostgreSQL服务器的工具.\n"
+"\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D 数据目录] [-s] [-o 选项]\n"
+
+#: pg_ctl.c:2029
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D 数据目录] [-l 文件名] [-W] [-t 秒数] [-s]\n"
+" [-o 选项] [-p 路径] [-c]\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D 数据目录] [-m SHUTDOWN-MODE] [-W] [-t 秒数] [-s]\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D 数据目录] [-m SHUTDOWN-MODE] [-W] [-t 秒数] [-s]\n"
+" [-o 选项] [-c]\n"
+
+#: pg_ctl.c:2034
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D 数据目录] [-s]\n"
+
+#: pg_ctl.c:2035
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D 数据目录]\n"
+
+#: pg_ctl.c:2036
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D 数据目录] [-W] [-t 秒数] [-s]\n"
+
+#: pg_ctl.c:2037
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D 数据目录] [-s]\n"
+
+#: pg_ctl.c:2038
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill 信号名称 进程号\n"
+
+#: pg_ctl.c:2040
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D 数据目录] [-N 服务名称] [-U 用户名] [-P 口令]\n"
+" [-S 启动类型] [-e 源] [-W] [-t 秒数] [-s] [-o 选项]\n"
+
+#: pg_ctl.c:2042
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N 服务名称]\n"
+
+#: pg_ctl.c:2045
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"普通选项:\n"
+
+#: pg_ctl.c:2046
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=数据目录 数据库存储区域的位置\n"
+
+#: pg_ctl.c:2048
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e SOURCE 当作为一个服务运行时要记录的事件的来源\n"
+
+#: pg_ctl.c:2050
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent 只打印错误信息, 没有其他信息\n"
+
+#: pg_ctl.c:2051
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SECS 当使用-w 选项时需要等待的秒数\n"
+
+#: pg_ctl.c:2052
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信息, 然后退出\n"
+
+#: pg_ctl.c:2053
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait 等待直到操作完成(默认)\n"
+
+#: pg_ctl.c:2054
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait 不用等待操作完成\n"
+
+#: pg_ctl.c:2055
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然后退出\n"
+
+#: pg_ctl.c:2056
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "如果省略了 -D 选项, 将使用 PGDATA 环境变量.\n"
+
+#: pg_ctl.c:2058
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"启动或重启的选项:\n"
+
+#: pg_ctl.c:2060
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files 允许postgres进程产生核心文件\n"
+
+#: pg_ctl.c:2062
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files 在这种平台上不可用\n"
+
+#: pg_ctl.c:2064
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=FILENAME 写入 (或追加) 服务器日志到文件FILENAME\n"
+
+#: pg_ctl.c:2065
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPTIONS 传递给postgres的命令行选项\n"
+" (PostgreSQL 服务器执行文件)或initdb\n"
+
+#: pg_ctl.c:2067
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p PATH-TO-POSTMASTER 正常情况不必要\n"
+
+#: pg_ctl.c:2068
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"停止或重启的选项:\n"
+
+#: pg_ctl.c:2069
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=MODE 可以是 \"smart\", \"fast\", 或者 \"immediate\"\n"
+
+#: pg_ctl.c:2071
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"关闭模式有如下几种:\n"
+
+#: pg_ctl.c:2072
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart 所有客户端断开连接后退出\n"
+
+#: pg_ctl.c:2073
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast 直接退出, 正确的关闭(默认)\n"
+
+#: pg_ctl.c:2074
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate 不完全的关闭退出; 重启后恢复\n"
+
+#: pg_ctl.c:2076
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"允许关闭的信号名称:\n"
+
+#: pg_ctl.c:2080
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"注册或注销的选项:\n"
+
+#: pg_ctl.c:2081
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N 服务名称 注册到 PostgreSQL 服务器的服务名称\n"
+
+#: pg_ctl.c:2082
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P 口令 注册到 PostgreSQL 服务器帐户的口令\n"
+
+#: pg_ctl.c:2083
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U 用户名 注册到 PostgreSQL 服务器帐户的用户名\n"
+
+#: pg_ctl.c:2084
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S START-TYPE 注册到PostgreSQL服务器的服务启动类型\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"启动类型有:\n"
+
+#: pg_ctl.c:2087
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto 在系统启动时自动启动服务(默认选项)\n"
+
+#: pg_ctl.c:2088
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand 按需启动服务\n"
+
+#: pg_ctl.c:2091
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: pg_ctl.c:2092
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: pg_ctl.c:2117
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: 无效的关闭模式 \"%s\"\n"
+
+#: pg_ctl.c:2146
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: 无效信号名称 \"%s\"\n"
+
+#: pg_ctl.c:2163
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: 无法识别的启动类型 \"%s\"\n"
+
+#: pg_ctl.c:2218
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: 使用命令 \"%s\"无法确定数据目录\n"
+
+#: pg_ctl.c:2242
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: 控制文件似乎已损坏\n"
+
+#: pg_ctl.c:2310
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: 无法以 root 用户运行\n"
+"请以服务器进程所属用户 (非特权用户) 登录 (或使用 \"su\")\n"
+"\n"
+
+#: pg_ctl.c:2393
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: -S 选项在该平台上不支持\n"
+
+#: pg_ctl.c:2430
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: 命令行参数太多 (第一个是 \"%s\")\n"
+
+#: pg_ctl.c:2456
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: 缺少 kill 模式参数\n"
+
+#: pg_ctl.c:2474
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: 无效的操作模式 \"%s\"\n"
+
+#: pg_ctl.c:2484
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: 没有指定操作\n"
+
+#: pg_ctl.c:2505
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: 没有指定数据目录, 并且没有设置 PGDATA 环境变量\n"
+
diff --git a/src/bin/pg_ctl/t/001_start_stop.pl b/src/bin/pg_ctl/t/001_start_stop.pl
new file mode 100644
index 0000000..fdffd76
--- /dev/null
+++ b/src/bin/pg_ctl/t/001_start_stop.pl
@@ -0,0 +1,103 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+my $tempdir_short = PostgreSQL::Test::Utils::tempdir_short;
+
+program_help_ok('pg_ctl');
+program_version_ok('pg_ctl');
+program_options_handling_ok('pg_ctl');
+
+command_exit_is([ 'pg_ctl', 'start', '-D', "$tempdir/nonexistent" ],
+ 1, 'pg_ctl start with nonexistent directory');
+
+command_ok([ 'pg_ctl', 'initdb', '-D', "$tempdir/data", '-o', '-N' ],
+ 'pg_ctl initdb');
+command_ok([ $ENV{PG_REGRESS}, '--config-auth', "$tempdir/data" ],
+ 'configure authentication');
+my $node_port = PostgreSQL::Test::Cluster::get_free_port();
+open my $conf, '>>', "$tempdir/data/postgresql.conf";
+print $conf "fsync = off\n";
+print $conf "port = $node_port\n";
+print $conf PostgreSQL::Test::Utils::slurp_file($ENV{TEMP_CONFIG})
+ if defined $ENV{TEMP_CONFIG};
+
+if ($use_unix_sockets)
+{
+ print $conf "listen_addresses = ''\n";
+ $tempdir_short =~ s!\\!/!g if $PostgreSQL::Test::Utils::windows_os;
+ print $conf "unix_socket_directories = '$tempdir_short'\n";
+}
+else
+{
+ print $conf "listen_addresses = '127.0.0.1'\n";
+}
+close $conf;
+my $ctlcmd = [
+ 'pg_ctl', 'start', '-D', "$tempdir/data", '-l',
+ "$PostgreSQL::Test::Utils::log_path/001_start_stop_server.log"
+];
+command_like($ctlcmd, qr/done.*server started/s, 'pg_ctl start');
+
+# sleep here is because Windows builds can't check postmaster.pid exactly,
+# so they may mistake a pre-existing postmaster.pid for one created by the
+# postmaster they start. Waiting more than the 2 seconds slop time allowed
+# by wait_for_postmaster() prevents that mistake.
+sleep 3 if ($windows_os);
+command_fails([ 'pg_ctl', 'start', '-D', "$tempdir/data" ],
+ 'second pg_ctl start fails');
+command_ok([ 'pg_ctl', 'stop', '-D', "$tempdir/data" ], 'pg_ctl stop');
+command_fails([ 'pg_ctl', 'stop', '-D', "$tempdir/data" ],
+ 'second pg_ctl stop fails');
+
+# Log file for default permission test. The permissions won't be checked on
+# Windows but we still want to do the restart test.
+my $logFileName = "$tempdir/data/perm-test-600.log";
+
+command_ok([ 'pg_ctl', 'restart', '-D', "$tempdir/data", '-l', $logFileName ],
+ 'pg_ctl restart with server not running');
+
+# Permissions on log file should be default
+SKIP:
+{
+ skip "unix-style permissions not supported on Windows", 2
+ if ($windows_os);
+
+ ok(-f $logFileName);
+ ok(check_mode_recursive("$tempdir/data", 0700, 0600));
+}
+
+# Log file for group access test
+$logFileName = "$tempdir/data/perm-test-640.log";
+
+SKIP:
+{
+ skip "group access not supported on Windows", 3 if ($windows_os);
+
+ system_or_bail 'pg_ctl', 'stop', '-D', "$tempdir/data";
+
+ # Change the data dir mode so log file will be created with group read
+ # privileges on the next start
+ chmod_recursive("$tempdir/data", 0750, 0640);
+
+ command_ok(
+ [ 'pg_ctl', 'start', '-D', "$tempdir/data", '-l', $logFileName ],
+ 'start server to check group permissions');
+
+ ok(-f $logFileName);
+ ok(check_mode_recursive("$tempdir/data", 0750, 0640));
+}
+
+command_ok([ 'pg_ctl', 'restart', '-D', "$tempdir/data" ],
+ 'pg_ctl restart with server running');
+
+system_or_bail 'pg_ctl', 'stop', '-D', "$tempdir/data";
+
+done_testing();
diff --git a/src/bin/pg_ctl/t/002_status.pl b/src/bin/pg_ctl/t/002_status.pl
new file mode 100644
index 0000000..ab26ee6
--- /dev/null
+++ b/src/bin/pg_ctl/t/002_status.pl
@@ -0,0 +1,29 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+command_exit_is([ 'pg_ctl', 'status', '-D', "$tempdir/nonexistent" ],
+ 4, 'pg_ctl status with nonexistent directory');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+
+command_exit_is([ 'pg_ctl', 'status', '-D', $node->data_dir ],
+ 3, 'pg_ctl status with server not running');
+
+system_or_bail 'pg_ctl', '-l', "$tempdir/logfile", '-D',
+ $node->data_dir, '-w', 'start';
+command_exit_is([ 'pg_ctl', 'status', '-D', $node->data_dir ],
+ 0, 'pg_ctl status with server running');
+
+system_or_bail 'pg_ctl', 'stop', '-D', $node->data_dir;
+
+done_testing();
diff --git a/src/bin/pg_ctl/t/003_promote.pl b/src/bin/pg_ctl/t/003_promote.pl
new file mode 100644
index 0000000..84d28f4
--- /dev/null
+++ b/src/bin/pg_ctl/t/003_promote.pl
@@ -0,0 +1,66 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+command_fails_like(
+ [ 'pg_ctl', '-D', "$tempdir/nonexistent", 'promote' ],
+ qr/directory .* does not exist/,
+ 'pg_ctl promote with nonexistent directory');
+
+my $node_primary = PostgreSQL::Test::Cluster->new('primary');
+$node_primary->init(allows_streaming => 1);
+
+command_fails_like(
+ [ 'pg_ctl', '-D', $node_primary->data_dir, 'promote' ],
+ qr/PID file .* does not exist/,
+ 'pg_ctl promote of not running instance fails');
+
+$node_primary->start;
+
+command_fails_like(
+ [ 'pg_ctl', '-D', $node_primary->data_dir, 'promote' ],
+ qr/not in standby mode/,
+ 'pg_ctl promote of primary instance fails');
+
+my $node_standby = PostgreSQL::Test::Cluster->new('standby');
+$node_primary->backup('my_backup');
+$node_standby->init_from_backup($node_primary, 'my_backup',
+ has_streaming => 1);
+$node_standby->start;
+
+is($node_standby->safe_psql('postgres', 'SELECT pg_is_in_recovery()'),
+ 't', 'standby is in recovery');
+
+command_ok([ 'pg_ctl', '-D', $node_standby->data_dir, '-W', 'promote' ],
+ 'pg_ctl -W promote of standby runs');
+
+ok( $node_standby->poll_query_until(
+ 'postgres', 'SELECT NOT pg_is_in_recovery()'),
+ 'promoted standby is not in recovery');
+
+# same again with default wait option
+$node_standby = PostgreSQL::Test::Cluster->new('standby2');
+$node_standby->init_from_backup($node_primary, 'my_backup',
+ has_streaming => 1);
+$node_standby->start;
+
+is($node_standby->safe_psql('postgres', 'SELECT pg_is_in_recovery()'),
+ 't', 'standby is in recovery');
+
+command_ok([ 'pg_ctl', '-D', $node_standby->data_dir, 'promote' ],
+ 'pg_ctl promote of standby runs');
+
+# no wait here
+
+is($node_standby->safe_psql('postgres', 'SELECT pg_is_in_recovery()'),
+ 'f', 'promoted standby is not in recovery');
+
+done_testing();
diff --git a/src/bin/pg_ctl/t/004_logrotate.pl b/src/bin/pg_ctl/t/004_logrotate.pl
new file mode 100644
index 0000000..d73ce03
--- /dev/null
+++ b/src/bin/pg_ctl/t/004_logrotate.pl
@@ -0,0 +1,140 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+use Time::HiRes qw(usleep);
+
+# Extract the file name of a $format from the contents of
+# current_logfiles.
+sub fetch_file_name
+{
+ my $logfiles = shift;
+ my $format = shift;
+ my @lines = split(/\n/, $logfiles);
+ my $filename = undef;
+ foreach my $line (@lines)
+ {
+ if ($line =~ /$format (.*)$/gm)
+ {
+ $filename = $1;
+ }
+ }
+
+ return $filename;
+}
+
+# Check for a pattern in the logs associated to one format.
+sub check_log_pattern
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my $format = shift;
+ my $logfiles = shift;
+ my $pattern = shift;
+ my $node = shift;
+ my $lfname = fetch_file_name($logfiles, $format);
+
+ my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default;
+
+ my $logcontents;
+ for (my $attempts = 0; $attempts < $max_attempts; $attempts++)
+ {
+ $logcontents = slurp_file($node->data_dir . '/' . $lfname);
+ last if $logcontents =~ m/$pattern/;
+ usleep(100_000);
+ }
+
+ like($logcontents, qr/$pattern/,
+ "found expected log file content for $format");
+
+ # While we're at it, test pg_current_logfile() function
+ is( $node->safe_psql('postgres', "SELECT pg_current_logfile('$format')"),
+ $lfname,
+ "pg_current_logfile() gives correct answer with $format");
+ return;
+}
+
+# Set up node with logging collector
+my $node = PostgreSQL::Test::Cluster->new('primary');
+$node->init();
+$node->append_conf(
+ 'postgresql.conf', qq(
+logging_collector = on
+log_destination = 'stderr, csvlog, jsonlog'
+# these ensure stability of test results:
+log_rotation_age = 0
+lc_messages = 'C'
+));
+
+$node->start();
+
+# Verify that log output gets to the file
+
+$node->psql('postgres', 'SELECT 1/0');
+
+# might need to retry if logging collector process is slow...
+my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default;
+
+my $current_logfiles;
+for (my $attempts = 0; $attempts < $max_attempts; $attempts++)
+{
+ eval {
+ $current_logfiles = slurp_file($node->data_dir . '/current_logfiles');
+ };
+ last unless $@;
+ usleep(100_000);
+}
+die $@ if $@;
+
+note "current_logfiles = $current_logfiles";
+
+like(
+ $current_logfiles,
+ qr|^stderr log/postgresql-.*log
+csvlog log/postgresql-.*csv
+jsonlog log/postgresql-.*json$|,
+ 'current_logfiles is sane');
+
+check_log_pattern('stderr', $current_logfiles, 'division by zero', $node);
+check_log_pattern('csvlog', $current_logfiles, 'division by zero', $node);
+check_log_pattern('jsonlog', $current_logfiles, 'division by zero', $node);
+
+# Sleep 2 seconds and ask for log rotation; this should result in
+# output into a different log file name.
+sleep(2);
+$node->logrotate();
+
+# pg_ctl logrotate doesn't wait for rotation request to be completed.
+# Allow a bit of time for it to happen.
+my $new_current_logfiles;
+for (my $attempts = 0; $attempts < $max_attempts; $attempts++)
+{
+ $new_current_logfiles = slurp_file($node->data_dir . '/current_logfiles');
+ last if $new_current_logfiles ne $current_logfiles;
+ usleep(100_000);
+}
+
+note "now current_logfiles = $new_current_logfiles";
+
+like(
+ $new_current_logfiles,
+ qr|^stderr log/postgresql-.*log
+csvlog log/postgresql-.*csv
+jsonlog log/postgresql-.*json$|,
+ 'new current_logfiles is sane');
+
+# Verify that log output gets to this file, too
+$node->psql('postgres', 'fee fi fo fum');
+
+check_log_pattern('stderr', $new_current_logfiles, 'syntax error', $node);
+check_log_pattern('csvlog', $new_current_logfiles, 'syntax error', $node);
+check_log_pattern('jsonlog', $new_current_logfiles, 'syntax error', $node);
+
+$node->stop();
+
+done_testing();
diff --git a/src/bin/pg_dump/.gitignore b/src/bin/pg_dump/.gitignore
new file mode 100644
index 0000000..e6d7812
--- /dev/null
+++ b/src/bin/pg_dump/.gitignore
@@ -0,0 +1,5 @@
+/pg_dump
+/pg_dumpall
+/pg_restore
+
+/tmp_check/
diff --git a/src/bin/pg_dump/Makefile b/src/bin/pg_dump/Makefile
new file mode 100644
index 0000000..9dc5a78
--- /dev/null
+++ b/src/bin/pg_dump/Makefile
@@ -0,0 +1,68 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_dump
+#
+# Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/bin/pg_dump/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_dump/pg_restore/pg_dumpall - backup and restore PostgreSQL databases"
+PGAPPICON=win32
+
+subdir = src/bin/pg_dump
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+export GZIP_PROGRAM=$(GZIP)
+export with_icu
+
+override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+OBJS = \
+ $(WIN32RES) \
+ compress_io.o \
+ dumputils.o \
+ parallel.o \
+ pg_backup_archiver.o \
+ pg_backup_custom.o \
+ pg_backup_db.o \
+ pg_backup_directory.o \
+ pg_backup_null.o \
+ pg_backup_tar.o \
+ pg_backup_utils.o
+
+all: pg_dump pg_restore pg_dumpall
+
+pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) pg_dump.o common.o pg_dump_sort.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+pg_restore: pg_restore.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) pg_restore.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+pg_dumpall: pg_dumpall.o dumputils.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) pg_dumpall.o dumputils.o $(WIN32RES) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_dump$(X) '$(DESTDIR)$(bindir)'/pg_dump$(X)
+ $(INSTALL_PROGRAM) pg_restore$(X) '$(DESTDIR)$(bindir)'/pg_restore$(X)
+ $(INSTALL_PROGRAM) pg_dumpall$(X) '$(DESTDIR)$(bindir)'/pg_dumpall$(X)
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
+
+uninstall:
+ rm -f $(addprefix '$(DESTDIR)$(bindir)'/, pg_dump$(X) pg_restore$(X) pg_dumpall$(X))
+
+clean distclean maintainer-clean:
+ rm -f pg_dump$(X) pg_restore$(X) pg_dumpall$(X) $(OBJS) pg_dump.o common.o pg_dump_sort.o pg_restore.o pg_dumpall.o
+ rm -rf tmp_check
diff --git a/src/bin/pg_dump/common.c b/src/bin/pg_dump/common.c
new file mode 100644
index 0000000..a64d37e
--- /dev/null
+++ b/src/bin/pg_dump/common.c
@@ -0,0 +1,1085 @@
+/*-------------------------------------------------------------------------
+ *
+ * common.c
+ * Catalog routines used by pg_dump; long ago these were shared
+ * by another dump tool, but not anymore.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/common.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+
+#include "catalog/pg_class_d.h"
+#include "catalog/pg_collation_d.h"
+#include "catalog/pg_extension_d.h"
+#include "catalog/pg_namespace_d.h"
+#include "catalog/pg_operator_d.h"
+#include "catalog/pg_proc_d.h"
+#include "catalog/pg_publication_d.h"
+#include "catalog/pg_type_d.h"
+#include "common/hashfn.h"
+#include "fe_utils/string_utils.h"
+#include "pg_backup_archiver.h"
+#include "pg_backup_utils.h"
+#include "pg_dump.h"
+
+/*
+ * Variables for mapping DumpId to DumpableObject
+ */
+static DumpableObject **dumpIdMap = NULL;
+static int allocedDumpIds = 0;
+static DumpId lastDumpId = 0; /* Note: 0 is InvalidDumpId */
+
+/*
+ * Infrastructure for mapping CatalogId to DumpableObject
+ *
+ * We use a hash table generated by simplehash.h. That infrastructure
+ * requires all the hash table entries to be the same size, and it also
+ * expects that it can move them around when resizing the table. So we
+ * cannot make the DumpableObjects be elements of the hash table directly;
+ * instead, the hash table elements contain pointers to DumpableObjects.
+ *
+ * It turns out to be convenient to also use this data structure to map
+ * CatalogIds to owning extensions, if any. Since extension membership
+ * data is read before creating most DumpableObjects, either one of dobj
+ * and ext could be NULL.
+ */
+typedef struct _catalogIdMapEntry
+{
+ CatalogId catId; /* the indexed CatalogId */
+ uint32 status; /* hash status */
+ uint32 hashval; /* hash code for the CatalogId */
+ DumpableObject *dobj; /* the associated DumpableObject, if any */
+ ExtensionInfo *ext; /* owning extension, if any */
+} CatalogIdMapEntry;
+
+#define SH_PREFIX catalogid
+#define SH_ELEMENT_TYPE CatalogIdMapEntry
+#define SH_KEY_TYPE CatalogId
+#define SH_KEY catId
+#define SH_HASH_KEY(tb, key) hash_bytes((const unsigned char *) &(key), sizeof(CatalogId))
+#define SH_EQUAL(tb, a, b) ((a).oid == (b).oid && (a).tableoid == (b).tableoid)
+#define SH_STORE_HASH
+#define SH_GET_HASH(tb, a) (a)->hashval
+#define SH_SCOPE static inline
+#define SH_RAW_ALLOCATOR pg_malloc0
+#define SH_DECLARE
+#define SH_DEFINE
+#include "lib/simplehash.h"
+
+#define CATALOGIDHASH_INITIAL_SIZE 10000
+
+static catalogid_hash *catalogIdHash = NULL;
+
+static void flagInhTables(Archive *fout, TableInfo *tbinfo, int numTables,
+ InhInfo *inhinfo, int numInherits);
+static void flagInhIndexes(Archive *fout, TableInfo *tblinfo, int numTables);
+static void flagInhAttrs(DumpOptions *dopt, TableInfo *tblinfo, int numTables);
+static void findParentsByOid(TableInfo *self,
+ InhInfo *inhinfo, int numInherits);
+static int strInArray(const char *pattern, char **arr, int arr_size);
+static IndxInfo *findIndexByOid(Oid oid);
+
+
+/*
+ * getSchemaData
+ * Collect information about all potentially dumpable objects
+ */
+TableInfo *
+getSchemaData(Archive *fout, int *numTablesPtr)
+{
+ TableInfo *tblinfo;
+ ExtensionInfo *extinfo;
+ InhInfo *inhinfo;
+ int numTables;
+ int numTypes;
+ int numFuncs;
+ int numOperators;
+ int numCollations;
+ int numNamespaces;
+ int numExtensions;
+ int numPublications;
+ int numAggregates;
+ int numInherits;
+ int numRules;
+ int numProcLangs;
+ int numCasts;
+ int numTransforms;
+ int numAccessMethods;
+ int numOpclasses;
+ int numOpfamilies;
+ int numConversions;
+ int numTSParsers;
+ int numTSTemplates;
+ int numTSDicts;
+ int numTSConfigs;
+ int numForeignDataWrappers;
+ int numForeignServers;
+ int numDefaultACLs;
+ int numEventTriggers;
+
+ /*
+ * We must read extensions and extension membership info first, because
+ * extension membership needs to be consultable during decisions about
+ * whether other objects are to be dumped.
+ */
+ pg_log_info("reading extensions");
+ extinfo = getExtensions(fout, &numExtensions);
+
+ pg_log_info("identifying extension members");
+ getExtensionMembership(fout, extinfo, numExtensions);
+
+ pg_log_info("reading schemas");
+ (void) getNamespaces(fout, &numNamespaces);
+
+ /*
+ * getTables should be done as soon as possible, so as to minimize the
+ * window between starting our transaction and acquiring per-table locks.
+ * However, we have to do getNamespaces first because the tables get
+ * linked to their containing namespaces during getTables.
+ */
+ pg_log_info("reading user-defined tables");
+ tblinfo = getTables(fout, &numTables);
+
+ getOwnedSeqs(fout, tblinfo, numTables);
+
+ pg_log_info("reading user-defined functions");
+ (void) getFuncs(fout, &numFuncs);
+
+ /* this must be after getTables and getFuncs */
+ pg_log_info("reading user-defined types");
+ (void) getTypes(fout, &numTypes);
+
+ /* this must be after getFuncs, too */
+ pg_log_info("reading procedural languages");
+ getProcLangs(fout, &numProcLangs);
+
+ pg_log_info("reading user-defined aggregate functions");
+ getAggregates(fout, &numAggregates);
+
+ pg_log_info("reading user-defined operators");
+ (void) getOperators(fout, &numOperators);
+
+ pg_log_info("reading user-defined access methods");
+ getAccessMethods(fout, &numAccessMethods);
+
+ pg_log_info("reading user-defined operator classes");
+ getOpclasses(fout, &numOpclasses);
+
+ pg_log_info("reading user-defined operator families");
+ getOpfamilies(fout, &numOpfamilies);
+
+ pg_log_info("reading user-defined text search parsers");
+ getTSParsers(fout, &numTSParsers);
+
+ pg_log_info("reading user-defined text search templates");
+ getTSTemplates(fout, &numTSTemplates);
+
+ pg_log_info("reading user-defined text search dictionaries");
+ getTSDictionaries(fout, &numTSDicts);
+
+ pg_log_info("reading user-defined text search configurations");
+ getTSConfigurations(fout, &numTSConfigs);
+
+ pg_log_info("reading user-defined foreign-data wrappers");
+ getForeignDataWrappers(fout, &numForeignDataWrappers);
+
+ pg_log_info("reading user-defined foreign servers");
+ getForeignServers(fout, &numForeignServers);
+
+ pg_log_info("reading default privileges");
+ getDefaultACLs(fout, &numDefaultACLs);
+
+ pg_log_info("reading user-defined collations");
+ (void) getCollations(fout, &numCollations);
+
+ pg_log_info("reading user-defined conversions");
+ getConversions(fout, &numConversions);
+
+ pg_log_info("reading type casts");
+ getCasts(fout, &numCasts);
+
+ pg_log_info("reading transforms");
+ getTransforms(fout, &numTransforms);
+
+ pg_log_info("reading table inheritance information");
+ inhinfo = getInherits(fout, &numInherits);
+
+ pg_log_info("reading event triggers");
+ getEventTriggers(fout, &numEventTriggers);
+
+ /* Identify extension configuration tables that should be dumped */
+ pg_log_info("finding extension tables");
+ processExtensionTables(fout, extinfo, numExtensions);
+
+ /* Link tables to parents, mark parents of target tables interesting */
+ pg_log_info("finding inheritance relationships");
+ flagInhTables(fout, tblinfo, numTables, inhinfo, numInherits);
+
+ pg_log_info("reading column info for interesting tables");
+ getTableAttrs(fout, tblinfo, numTables);
+
+ pg_log_info("flagging inherited columns in subtables");
+ flagInhAttrs(fout->dopt, tblinfo, numTables);
+
+ pg_log_info("reading partitioning data");
+ getPartitioningInfo(fout);
+
+ pg_log_info("reading indexes");
+ getIndexes(fout, tblinfo, numTables);
+
+ pg_log_info("flagging indexes in partitioned tables");
+ flagInhIndexes(fout, tblinfo, numTables);
+
+ pg_log_info("reading extended statistics");
+ getExtendedStatistics(fout);
+
+ pg_log_info("reading constraints");
+ getConstraints(fout, tblinfo, numTables);
+
+ pg_log_info("reading triggers");
+ getTriggers(fout, tblinfo, numTables);
+
+ pg_log_info("reading rewrite rules");
+ getRules(fout, &numRules);
+
+ pg_log_info("reading policies");
+ getPolicies(fout, tblinfo, numTables);
+
+ pg_log_info("reading publications");
+ (void) getPublications(fout, &numPublications);
+
+ pg_log_info("reading publication membership of tables");
+ getPublicationTables(fout, tblinfo, numTables);
+
+ pg_log_info("reading publication membership of schemas");
+ getPublicationNamespaces(fout);
+
+ pg_log_info("reading subscriptions");
+ getSubscriptions(fout);
+
+ free(inhinfo); /* not needed any longer */
+
+ *numTablesPtr = numTables;
+ return tblinfo;
+}
+
+/* flagInhTables -
+ * Fill in parent link fields of tables for which we need that information,
+ * mark parents of target tables as interesting, and create
+ * TableAttachInfo objects for partitioned tables with appropriate
+ * dependency links.
+ *
+ * Note that only direct ancestors of targets are marked interesting.
+ * This is sufficient; we don't much care whether they inherited their
+ * attributes or not.
+ *
+ * modifies tblinfo
+ */
+static void
+flagInhTables(Archive *fout, TableInfo *tblinfo, int numTables,
+ InhInfo *inhinfo, int numInherits)
+{
+ int i,
+ j;
+
+ for (i = 0; i < numTables; i++)
+ {
+ bool find_parents = true;
+ bool mark_parents = true;
+
+ /* Some kinds never have parents */
+ if (tblinfo[i].relkind == RELKIND_SEQUENCE ||
+ tblinfo[i].relkind == RELKIND_VIEW ||
+ tblinfo[i].relkind == RELKIND_MATVIEW)
+ continue;
+
+ /*
+ * Normally, we don't bother computing anything for non-target tables.
+ * However, we must find the parents of non-root partitioned tables in
+ * any case, so that we can trace from leaf partitions up to the root
+ * (in case a leaf is to be dumped but its parents are not). We need
+ * not mark such parents interesting for getTableAttrs, though.
+ */
+ if (!tblinfo[i].dobj.dump)
+ {
+ mark_parents = false;
+
+ if (!(tblinfo[i].relkind == RELKIND_PARTITIONED_TABLE &&
+ tblinfo[i].ispartition))
+ find_parents = false;
+ }
+
+ /* If needed, find all the immediate parent tables. */
+ if (find_parents)
+ findParentsByOid(&tblinfo[i], inhinfo, numInherits);
+
+ /*
+ * If needed, mark the parents as interesting for getTableAttrs and
+ * getIndexes.
+ */
+ if (mark_parents)
+ {
+ int numParents = tblinfo[i].numParents;
+ TableInfo **parents = tblinfo[i].parents;
+
+ for (j = 0; j < numParents; j++)
+ parents[j]->interesting = true;
+ }
+
+ /* Create TableAttachInfo object if needed */
+ if (tblinfo[i].dobj.dump && tblinfo[i].ispartition)
+ {
+ TableAttachInfo *attachinfo;
+
+ /* With partitions there can only be one parent */
+ if (tblinfo[i].numParents != 1)
+ pg_fatal("invalid number of parents %d for table \"%s\"",
+ tblinfo[i].numParents,
+ tblinfo[i].dobj.name);
+
+ attachinfo = (TableAttachInfo *) palloc(sizeof(TableAttachInfo));
+ attachinfo->dobj.objType = DO_TABLE_ATTACH;
+ attachinfo->dobj.catId.tableoid = 0;
+ attachinfo->dobj.catId.oid = 0;
+ AssignDumpId(&attachinfo->dobj);
+ attachinfo->dobj.name = pg_strdup(tblinfo[i].dobj.name);
+ attachinfo->dobj.namespace = tblinfo[i].dobj.namespace;
+ attachinfo->parentTbl = tblinfo[i].parents[0];
+ attachinfo->partitionTbl = &tblinfo[i];
+
+ /*
+ * We must state the DO_TABLE_ATTACH object's dependencies
+ * explicitly, since it will not match anything in pg_depend.
+ *
+ * Give it dependencies on both the partition table and the parent
+ * table, so that it will not be executed till both of those
+ * exist. (There's no need to care what order those are created
+ * in.)
+ */
+ addObjectDependency(&attachinfo->dobj, tblinfo[i].dobj.dumpId);
+ addObjectDependency(&attachinfo->dobj, tblinfo[i].parents[0]->dobj.dumpId);
+ }
+ }
+}
+
+/*
+ * flagInhIndexes -
+ * Create IndexAttachInfo objects for partitioned indexes, and add
+ * appropriate dependency links.
+ */
+static void
+flagInhIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
+{
+ int i,
+ j;
+
+ for (i = 0; i < numTables; i++)
+ {
+ if (!tblinfo[i].ispartition || tblinfo[i].numParents == 0)
+ continue;
+
+ Assert(tblinfo[i].numParents == 1);
+
+ for (j = 0; j < tblinfo[i].numIndexes; j++)
+ {
+ IndxInfo *index = &(tblinfo[i].indexes[j]);
+ IndxInfo *parentidx;
+ IndexAttachInfo *attachinfo;
+
+ if (index->parentidx == 0)
+ continue;
+
+ parentidx = findIndexByOid(index->parentidx);
+ if (parentidx == NULL)
+ continue;
+
+ attachinfo = (IndexAttachInfo *) pg_malloc(sizeof(IndexAttachInfo));
+
+ attachinfo->dobj.objType = DO_INDEX_ATTACH;
+ attachinfo->dobj.catId.tableoid = 0;
+ attachinfo->dobj.catId.oid = 0;
+ AssignDumpId(&attachinfo->dobj);
+ attachinfo->dobj.name = pg_strdup(index->dobj.name);
+ attachinfo->dobj.namespace = index->indextable->dobj.namespace;
+ attachinfo->parentIdx = parentidx;
+ attachinfo->partitionIdx = index;
+
+ /*
+ * We must state the DO_INDEX_ATTACH object's dependencies
+ * explicitly, since it will not match anything in pg_depend.
+ *
+ * Give it dependencies on both the partition index and the parent
+ * index, so that it will not be executed till both of those
+ * exist. (There's no need to care what order those are created
+ * in.)
+ *
+ * In addition, give it dependencies on the indexes' underlying
+ * tables. This does nothing of great value so far as serial
+ * restore ordering goes, but it ensures that a parallel restore
+ * will not try to run the ATTACH concurrently with other
+ * operations on those tables.
+ */
+ addObjectDependency(&attachinfo->dobj, index->dobj.dumpId);
+ addObjectDependency(&attachinfo->dobj, parentidx->dobj.dumpId);
+ addObjectDependency(&attachinfo->dobj,
+ index->indextable->dobj.dumpId);
+ addObjectDependency(&attachinfo->dobj,
+ parentidx->indextable->dobj.dumpId);
+
+ /* keep track of the list of partitions in the parent index */
+ simple_ptr_list_append(&parentidx->partattaches, &attachinfo->dobj);
+ }
+ }
+}
+
+/* flagInhAttrs -
+ * for each dumpable table in tblinfo, flag its inherited attributes
+ *
+ * What we need to do here is:
+ *
+ * - Detect child columns that inherit NOT NULL bits from their parents, so
+ * that we needn't specify that again for the child.
+ *
+ * - Detect child columns that have DEFAULT NULL when their parents had some
+ * non-null default. In this case, we make up a dummy AttrDefInfo object so
+ * that we'll correctly emit the necessary DEFAULT NULL clause; otherwise
+ * the backend will apply an inherited default to the column.
+ *
+ * - Detect child columns that have a generation expression when their parents
+ * also have one. Generation expressions are always inherited, so there is
+ * no need to set them again in child tables, and there is no syntax for it
+ * either. Exceptions: If it's a partition or we are in binary upgrade
+ * mode, we dump them because in those cases inherited tables are recreated
+ * standalone first and then reattached to the parent. (See also the logic
+ * in dumpTableSchema().) In that situation, the generation expressions
+ * must match the parent, enforced by ALTER TABLE.
+ *
+ * modifies tblinfo
+ */
+static void
+flagInhAttrs(DumpOptions *dopt, TableInfo *tblinfo, int numTables)
+{
+ int i,
+ j,
+ k;
+
+ for (i = 0; i < numTables; i++)
+ {
+ TableInfo *tbinfo = &(tblinfo[i]);
+ int numParents;
+ TableInfo **parents;
+
+ /* Some kinds never have parents */
+ if (tbinfo->relkind == RELKIND_SEQUENCE ||
+ tbinfo->relkind == RELKIND_VIEW ||
+ tbinfo->relkind == RELKIND_MATVIEW)
+ continue;
+
+ /* Don't bother computing anything for non-target tables, either */
+ if (!tbinfo->dobj.dump)
+ continue;
+
+ numParents = tbinfo->numParents;
+ parents = tbinfo->parents;
+
+ if (numParents == 0)
+ continue; /* nothing to see here, move along */
+
+ /* For each column, search for matching column names in parent(s) */
+ for (j = 0; j < tbinfo->numatts; j++)
+ {
+ bool foundNotNull; /* Attr was NOT NULL in a parent */
+ bool foundDefault; /* Found a default in a parent */
+ bool foundGenerated; /* Found a generated in a parent */
+
+ /* no point in examining dropped columns */
+ if (tbinfo->attisdropped[j])
+ continue;
+
+ foundNotNull = false;
+ foundDefault = false;
+ foundGenerated = false;
+ for (k = 0; k < numParents; k++)
+ {
+ TableInfo *parent = parents[k];
+ int inhAttrInd;
+
+ inhAttrInd = strInArray(tbinfo->attnames[j],
+ parent->attnames,
+ parent->numatts);
+ if (inhAttrInd >= 0)
+ {
+ foundNotNull |= parent->notnull[inhAttrInd];
+ foundDefault |= (parent->attrdefs[inhAttrInd] != NULL && !parent->attgenerated[inhAttrInd]);
+ foundGenerated |= parent->attgenerated[inhAttrInd];
+ }
+ }
+
+ /* Remember if we found inherited NOT NULL */
+ tbinfo->inhNotNull[j] = foundNotNull;
+
+ /* Manufacture a DEFAULT NULL clause if necessary */
+ if (foundDefault && tbinfo->attrdefs[j] == NULL)
+ {
+ AttrDefInfo *attrDef;
+
+ attrDef = (AttrDefInfo *) pg_malloc(sizeof(AttrDefInfo));
+ attrDef->dobj.objType = DO_ATTRDEF;
+ attrDef->dobj.catId.tableoid = 0;
+ attrDef->dobj.catId.oid = 0;
+ AssignDumpId(&attrDef->dobj);
+ attrDef->dobj.name = pg_strdup(tbinfo->dobj.name);
+ attrDef->dobj.namespace = tbinfo->dobj.namespace;
+ attrDef->dobj.dump = tbinfo->dobj.dump;
+
+ attrDef->adtable = tbinfo;
+ attrDef->adnum = j + 1;
+ attrDef->adef_expr = pg_strdup("NULL");
+
+ /* Will column be dumped explicitly? */
+ if (shouldPrintColumn(dopt, tbinfo, j))
+ {
+ attrDef->separate = false;
+ /* No dependency needed: NULL cannot have dependencies */
+ }
+ else
+ {
+ /* column will be suppressed, print default separately */
+ attrDef->separate = true;
+ /* ensure it comes out after the table */
+ addObjectDependency(&attrDef->dobj,
+ tbinfo->dobj.dumpId);
+ }
+
+ tbinfo->attrdefs[j] = attrDef;
+ }
+
+ /* Remove generation expression from child */
+ if (foundGenerated && !tbinfo->ispartition && !dopt->binary_upgrade)
+ tbinfo->attrdefs[j] = NULL;
+ }
+ }
+}
+
+/*
+ * AssignDumpId
+ * Given a newly-created dumpable object, assign a dump ID,
+ * and enter the object into the lookup tables.
+ *
+ * The caller is expected to have filled in objType and catId,
+ * but not any of the other standard fields of a DumpableObject.
+ */
+void
+AssignDumpId(DumpableObject *dobj)
+{
+ dobj->dumpId = ++lastDumpId;
+ dobj->name = NULL; /* must be set later */
+ dobj->namespace = NULL; /* may be set later */
+ dobj->dump = DUMP_COMPONENT_ALL; /* default assumption */
+ dobj->dump_contains = DUMP_COMPONENT_ALL; /* default assumption */
+ /* All objects have definitions; we may set more components bits later */
+ dobj->components = DUMP_COMPONENT_DEFINITION;
+ dobj->ext_member = false; /* default assumption */
+ dobj->depends_on_ext = false; /* default assumption */
+ dobj->dependencies = NULL;
+ dobj->nDeps = 0;
+ dobj->allocDeps = 0;
+
+ /* Add object to dumpIdMap[], enlarging that array if need be */
+ while (dobj->dumpId >= allocedDumpIds)
+ {
+ int newAlloc;
+
+ if (allocedDumpIds <= 0)
+ {
+ newAlloc = 256;
+ dumpIdMap = (DumpableObject **)
+ pg_malloc(newAlloc * sizeof(DumpableObject *));
+ }
+ else
+ {
+ newAlloc = allocedDumpIds * 2;
+ dumpIdMap = (DumpableObject **)
+ pg_realloc(dumpIdMap, newAlloc * sizeof(DumpableObject *));
+ }
+ memset(dumpIdMap + allocedDumpIds, 0,
+ (newAlloc - allocedDumpIds) * sizeof(DumpableObject *));
+ allocedDumpIds = newAlloc;
+ }
+ dumpIdMap[dobj->dumpId] = dobj;
+
+ /* If it has a valid CatalogId, enter it into the hash table */
+ if (OidIsValid(dobj->catId.tableoid))
+ {
+ CatalogIdMapEntry *entry;
+ bool found;
+
+ /* Initialize CatalogId hash table if not done yet */
+ if (catalogIdHash == NULL)
+ catalogIdHash = catalogid_create(CATALOGIDHASH_INITIAL_SIZE, NULL);
+
+ entry = catalogid_insert(catalogIdHash, dobj->catId, &found);
+ if (!found)
+ {
+ entry->dobj = NULL;
+ entry->ext = NULL;
+ }
+ Assert(entry->dobj == NULL);
+ entry->dobj = dobj;
+ }
+}
+
+/*
+ * Assign a DumpId that's not tied to a DumpableObject.
+ *
+ * This is used when creating a "fixed" ArchiveEntry that doesn't need to
+ * participate in the sorting logic.
+ */
+DumpId
+createDumpId(void)
+{
+ return ++lastDumpId;
+}
+
+/*
+ * Return the largest DumpId so far assigned
+ */
+DumpId
+getMaxDumpId(void)
+{
+ return lastDumpId;
+}
+
+/*
+ * Find a DumpableObject by dump ID
+ *
+ * Returns NULL for invalid ID
+ */
+DumpableObject *
+findObjectByDumpId(DumpId dumpId)
+{
+ if (dumpId <= 0 || dumpId >= allocedDumpIds)
+ return NULL; /* out of range? */
+ return dumpIdMap[dumpId];
+}
+
+/*
+ * Find a DumpableObject by catalog ID
+ *
+ * Returns NULL for unknown ID
+ */
+DumpableObject *
+findObjectByCatalogId(CatalogId catalogId)
+{
+ CatalogIdMapEntry *entry;
+
+ if (catalogIdHash == NULL)
+ return NULL; /* no objects exist yet */
+
+ entry = catalogid_lookup(catalogIdHash, catalogId);
+ if (entry == NULL)
+ return NULL;
+ return entry->dobj;
+}
+
+/*
+ * Build an array of pointers to all known dumpable objects
+ *
+ * This simply creates a modifiable copy of the internal map.
+ */
+void
+getDumpableObjects(DumpableObject ***objs, int *numObjs)
+{
+ int i,
+ j;
+
+ *objs = (DumpableObject **)
+ pg_malloc(allocedDumpIds * sizeof(DumpableObject *));
+ j = 0;
+ for (i = 1; i < allocedDumpIds; i++)
+ {
+ if (dumpIdMap[i])
+ (*objs)[j++] = dumpIdMap[i];
+ }
+ *numObjs = j;
+}
+
+/*
+ * Add a dependency link to a DumpableObject
+ *
+ * Note: duplicate dependencies are currently not eliminated
+ */
+void
+addObjectDependency(DumpableObject *dobj, DumpId refId)
+{
+ if (dobj->nDeps >= dobj->allocDeps)
+ {
+ if (dobj->allocDeps <= 0)
+ {
+ dobj->allocDeps = 16;
+ dobj->dependencies = (DumpId *)
+ pg_malloc(dobj->allocDeps * sizeof(DumpId));
+ }
+ else
+ {
+ dobj->allocDeps *= 2;
+ dobj->dependencies = (DumpId *)
+ pg_realloc(dobj->dependencies,
+ dobj->allocDeps * sizeof(DumpId));
+ }
+ }
+ dobj->dependencies[dobj->nDeps++] = refId;
+}
+
+/*
+ * Remove a dependency link from a DumpableObject
+ *
+ * If there are multiple links, all are removed
+ */
+void
+removeObjectDependency(DumpableObject *dobj, DumpId refId)
+{
+ int i;
+ int j = 0;
+
+ for (i = 0; i < dobj->nDeps; i++)
+ {
+ if (dobj->dependencies[i] != refId)
+ dobj->dependencies[j++] = dobj->dependencies[i];
+ }
+ dobj->nDeps = j;
+}
+
+
+/*
+ * findTableByOid
+ * finds the DumpableObject for the table with the given oid
+ * returns NULL if not found
+ */
+TableInfo *
+findTableByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = RelationRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL || dobj->objType == DO_TABLE);
+ return (TableInfo *) dobj;
+}
+
+/*
+ * findIndexByOid
+ * finds the DumpableObject for the index with the given oid
+ * returns NULL if not found
+ */
+static IndxInfo *
+findIndexByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = RelationRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL || dobj->objType == DO_INDEX);
+ return (IndxInfo *) dobj;
+}
+
+/*
+ * findTypeByOid
+ * finds the DumpableObject for the type with the given oid
+ * returns NULL if not found
+ */
+TypeInfo *
+findTypeByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = TypeRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL ||
+ dobj->objType == DO_TYPE || dobj->objType == DO_DUMMY_TYPE);
+ return (TypeInfo *) dobj;
+}
+
+/*
+ * findFuncByOid
+ * finds the DumpableObject for the function with the given oid
+ * returns NULL if not found
+ */
+FuncInfo *
+findFuncByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = ProcedureRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL || dobj->objType == DO_FUNC);
+ return (FuncInfo *) dobj;
+}
+
+/*
+ * findOprByOid
+ * finds the DumpableObject for the operator with the given oid
+ * returns NULL if not found
+ */
+OprInfo *
+findOprByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = OperatorRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL || dobj->objType == DO_OPERATOR);
+ return (OprInfo *) dobj;
+}
+
+/*
+ * findCollationByOid
+ * finds the DumpableObject for the collation with the given oid
+ * returns NULL if not found
+ */
+CollInfo *
+findCollationByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = CollationRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL || dobj->objType == DO_COLLATION);
+ return (CollInfo *) dobj;
+}
+
+/*
+ * findNamespaceByOid
+ * finds the DumpableObject for the namespace with the given oid
+ * returns NULL if not found
+ */
+NamespaceInfo *
+findNamespaceByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = NamespaceRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL || dobj->objType == DO_NAMESPACE);
+ return (NamespaceInfo *) dobj;
+}
+
+/*
+ * findExtensionByOid
+ * finds the DumpableObject for the extension with the given oid
+ * returns NULL if not found
+ */
+ExtensionInfo *
+findExtensionByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = ExtensionRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL || dobj->objType == DO_EXTENSION);
+ return (ExtensionInfo *) dobj;
+}
+
+/*
+ * findPublicationByOid
+ * finds the DumpableObject for the publication with the given oid
+ * returns NULL if not found
+ */
+PublicationInfo *
+findPublicationByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = PublicationRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL || dobj->objType == DO_PUBLICATION);
+ return (PublicationInfo *) dobj;
+}
+
+
+/*
+ * recordExtensionMembership
+ * Record that the object identified by the given catalog ID
+ * belongs to the given extension
+ */
+void
+recordExtensionMembership(CatalogId catId, ExtensionInfo *ext)
+{
+ CatalogIdMapEntry *entry;
+ bool found;
+
+ /* CatalogId hash table must exist, if we have an ExtensionInfo */
+ Assert(catalogIdHash != NULL);
+
+ /* Add reference to CatalogId hash */
+ entry = catalogid_insert(catalogIdHash, catId, &found);
+ if (!found)
+ {
+ entry->dobj = NULL;
+ entry->ext = NULL;
+ }
+ Assert(entry->ext == NULL);
+ entry->ext = ext;
+}
+
+/*
+ * findOwningExtension
+ * return owning extension for specified catalog ID, or NULL if none
+ */
+ExtensionInfo *
+findOwningExtension(CatalogId catalogId)
+{
+ CatalogIdMapEntry *entry;
+
+ if (catalogIdHash == NULL)
+ return NULL; /* no objects exist yet */
+
+ entry = catalogid_lookup(catalogIdHash, catalogId);
+ if (entry == NULL)
+ return NULL;
+ return entry->ext;
+}
+
+
+/*
+ * findParentsByOid
+ * find a table's parents in tblinfo[]
+ */
+static void
+findParentsByOid(TableInfo *self,
+ InhInfo *inhinfo, int numInherits)
+{
+ Oid oid = self->dobj.catId.oid;
+ int i,
+ j;
+ int numParents;
+
+ numParents = 0;
+ for (i = 0; i < numInherits; i++)
+ {
+ if (inhinfo[i].inhrelid == oid)
+ numParents++;
+ }
+
+ self->numParents = numParents;
+
+ if (numParents > 0)
+ {
+ self->parents = (TableInfo **)
+ pg_malloc(sizeof(TableInfo *) * numParents);
+ j = 0;
+ for (i = 0; i < numInherits; i++)
+ {
+ if (inhinfo[i].inhrelid == oid)
+ {
+ TableInfo *parent;
+
+ parent = findTableByOid(inhinfo[i].inhparent);
+ if (parent == NULL)
+ pg_fatal("failed sanity check, parent OID %u of table \"%s\" (OID %u) not found",
+ inhinfo[i].inhparent,
+ self->dobj.name,
+ oid);
+ self->parents[j++] = parent;
+ }
+ }
+ }
+ else
+ self->parents = NULL;
+}
+
+/*
+ * parseOidArray
+ * parse a string of numbers delimited by spaces into a character array
+ *
+ * Note: actually this is used for both Oids and potentially-signed
+ * attribute numbers. This should cause no trouble, but we could split
+ * the function into two functions with different argument types if it does.
+ */
+
+void
+parseOidArray(const char *str, Oid *array, int arraysize)
+{
+ int j,
+ argNum;
+ char temp[100];
+ char s;
+
+ argNum = 0;
+ j = 0;
+ for (;;)
+ {
+ s = *str++;
+ if (s == ' ' || s == '\0')
+ {
+ if (j > 0)
+ {
+ if (argNum >= arraysize)
+ pg_fatal("could not parse numeric array \"%s\": too many numbers", str);
+ temp[j] = '\0';
+ array[argNum++] = atooid(temp);
+ j = 0;
+ }
+ if (s == '\0')
+ break;
+ }
+ else
+ {
+ if (!(isdigit((unsigned char) s) || s == '-') ||
+ j >= sizeof(temp) - 1)
+ pg_fatal("could not parse numeric array \"%s\": invalid character in number", str);
+ temp[j++] = s;
+ }
+ }
+
+ while (argNum < arraysize)
+ array[argNum++] = InvalidOid;
+}
+
+
+/*
+ * strInArray:
+ * takes in a string and a string array and the number of elements in the
+ * string array.
+ * returns the index if the string is somewhere in the array, -1 otherwise
+ */
+
+static int
+strInArray(const char *pattern, char **arr, int arr_size)
+{
+ int i;
+
+ for (i = 0; i < arr_size; i++)
+ {
+ if (strcmp(pattern, arr[i]) == 0)
+ return i;
+ }
+ return -1;
+}
diff --git a/src/bin/pg_dump/compress_io.c b/src/bin/pg_dump/compress_io.c
new file mode 100644
index 0000000..62f940f
--- /dev/null
+++ b/src/bin/pg_dump/compress_io.c
@@ -0,0 +1,717 @@
+/*-------------------------------------------------------------------------
+ *
+ * compress_io.c
+ * Routines for archivers to write an uncompressed or compressed data
+ * stream.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * This file includes two APIs for dealing with compressed data. The first
+ * provides more flexibility, using callbacks to read/write data from the
+ * underlying stream. The second API is a wrapper around fopen/gzopen and
+ * friends, providing an interface similar to those, but abstracts away
+ * the possible compression. Both APIs use libz for the compression, but
+ * the second API uses gzip headers, so the resulting files can be easily
+ * manipulated with the gzip utility.
+ *
+ * Compressor API
+ * --------------
+ *
+ * The interface for writing to an archive consists of three functions:
+ * AllocateCompressor, WriteDataToArchive and EndCompressor. First you call
+ * AllocateCompressor, then write all the data by calling WriteDataToArchive
+ * as many times as needed, and finally EndCompressor. WriteDataToArchive
+ * and EndCompressor will call the WriteFunc that was provided to
+ * AllocateCompressor for each chunk of compressed data.
+ *
+ * The interface for reading an archive consists of just one function:
+ * ReadDataFromArchive. ReadDataFromArchive reads the whole compressed input
+ * stream, by repeatedly calling the given ReadFunc. ReadFunc returns the
+ * compressed data chunk at a time, and ReadDataFromArchive decompresses it
+ * and passes the decompressed data to ahwrite(), until ReadFunc returns 0
+ * to signal EOF.
+ *
+ * The interface is the same for compressed and uncompressed streams.
+ *
+ * Compressed stream API
+ * ----------------------
+ *
+ * The compressed stream API is a wrapper around the C standard fopen() and
+ * libz's gzopen() APIs. It allows you to use the same functions for
+ * compressed and uncompressed streams. cfopen_read() first tries to open
+ * the file with given name, and if it fails, it tries to open the same
+ * file with the .gz suffix. cfopen_write() opens a file for writing, an
+ * extra argument specifies if the file should be compressed, and adds the
+ * .gz suffix to the filename if so. This allows you to easily handle both
+ * compressed and uncompressed files.
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/compress_io.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "compress_io.h"
+#include "pg_backup_utils.h"
+
+/*----------------------
+ * Compressor API
+ *----------------------
+ */
+
+/* typedef appears in compress_io.h */
+struct CompressorState
+{
+ CompressionAlgorithm comprAlg;
+ WriteFunc writeF;
+
+#ifdef HAVE_LIBZ
+ z_streamp zp;
+ char *zlibOut;
+ size_t zlibOutSize;
+#endif
+};
+
+static void ParseCompressionOption(int compression, CompressionAlgorithm *alg,
+ int *level);
+
+/* Routines that support zlib compressed data I/O */
+#ifdef HAVE_LIBZ
+static void InitCompressorZlib(CompressorState *cs, int level);
+static void DeflateCompressorZlib(ArchiveHandle *AH, CompressorState *cs,
+ bool flush);
+static void ReadDataFromArchiveZlib(ArchiveHandle *AH, ReadFunc readF);
+static void WriteDataToArchiveZlib(ArchiveHandle *AH, CompressorState *cs,
+ const char *data, size_t dLen);
+static void EndCompressorZlib(ArchiveHandle *AH, CompressorState *cs);
+#endif
+
+/* Routines that support uncompressed data I/O */
+static void ReadDataFromArchiveNone(ArchiveHandle *AH, ReadFunc readF);
+static void WriteDataToArchiveNone(ArchiveHandle *AH, CompressorState *cs,
+ const char *data, size_t dLen);
+
+/*
+ * Interprets a numeric 'compression' value. The algorithm implied by the
+ * value (zlib or none at the moment), is returned in *alg, and the
+ * zlib compression level in *level.
+ */
+static void
+ParseCompressionOption(int compression, CompressionAlgorithm *alg, int *level)
+{
+ if (compression == Z_DEFAULT_COMPRESSION ||
+ (compression > 0 && compression <= 9))
+ *alg = COMPR_ALG_LIBZ;
+ else if (compression == 0)
+ *alg = COMPR_ALG_NONE;
+ else
+ {
+ pg_fatal("invalid compression code: %d", compression);
+ *alg = COMPR_ALG_NONE; /* keep compiler quiet */
+ }
+
+ /* The level is just the passed-in value. */
+ if (level)
+ *level = compression;
+}
+
+/* Public interface routines */
+
+/* Allocate a new compressor */
+CompressorState *
+AllocateCompressor(int compression, WriteFunc writeF)
+{
+ CompressorState *cs;
+ CompressionAlgorithm alg;
+ int level;
+
+ ParseCompressionOption(compression, &alg, &level);
+
+#ifndef HAVE_LIBZ
+ if (alg == COMPR_ALG_LIBZ)
+ pg_fatal("not built with zlib support");
+#endif
+
+ cs = (CompressorState *) pg_malloc0(sizeof(CompressorState));
+ cs->writeF = writeF;
+ cs->comprAlg = alg;
+
+ /*
+ * Perform compression algorithm specific initialization.
+ */
+#ifdef HAVE_LIBZ
+ if (alg == COMPR_ALG_LIBZ)
+ InitCompressorZlib(cs, level);
+#endif
+
+ return cs;
+}
+
+/*
+ * Read all compressed data from the input stream (via readF) and print it
+ * out with ahwrite().
+ */
+void
+ReadDataFromArchive(ArchiveHandle *AH, int compression, ReadFunc readF)
+{
+ CompressionAlgorithm alg;
+
+ ParseCompressionOption(compression, &alg, NULL);
+
+ if (alg == COMPR_ALG_NONE)
+ ReadDataFromArchiveNone(AH, readF);
+ if (alg == COMPR_ALG_LIBZ)
+ {
+#ifdef HAVE_LIBZ
+ ReadDataFromArchiveZlib(AH, readF);
+#else
+ pg_fatal("not built with zlib support");
+#endif
+ }
+}
+
+/*
+ * Compress and write data to the output stream (via writeF).
+ */
+void
+WriteDataToArchive(ArchiveHandle *AH, CompressorState *cs,
+ const void *data, size_t dLen)
+{
+ switch (cs->comprAlg)
+ {
+ case COMPR_ALG_LIBZ:
+#ifdef HAVE_LIBZ
+ WriteDataToArchiveZlib(AH, cs, data, dLen);
+#else
+ pg_fatal("not built with zlib support");
+#endif
+ break;
+ case COMPR_ALG_NONE:
+ WriteDataToArchiveNone(AH, cs, data, dLen);
+ break;
+ }
+}
+
+/*
+ * Terminate compression library context and flush its buffers.
+ */
+void
+EndCompressor(ArchiveHandle *AH, CompressorState *cs)
+{
+#ifdef HAVE_LIBZ
+ if (cs->comprAlg == COMPR_ALG_LIBZ)
+ EndCompressorZlib(AH, cs);
+#endif
+ free(cs);
+}
+
+/* Private routines, specific to each compression method. */
+
+#ifdef HAVE_LIBZ
+/*
+ * Functions for zlib compressed output.
+ */
+
+static void
+InitCompressorZlib(CompressorState *cs, int level)
+{
+ z_streamp zp;
+
+ zp = cs->zp = (z_streamp) pg_malloc(sizeof(z_stream));
+ zp->zalloc = Z_NULL;
+ zp->zfree = Z_NULL;
+ zp->opaque = Z_NULL;
+
+ /*
+ * zlibOutSize is the buffer size we tell zlib it can output to. We
+ * actually allocate one extra byte because some routines want to append a
+ * trailing zero byte to the zlib output.
+ */
+ cs->zlibOut = (char *) pg_malloc(ZLIB_OUT_SIZE + 1);
+ cs->zlibOutSize = ZLIB_OUT_SIZE;
+
+ if (deflateInit(zp, level) != Z_OK)
+ pg_fatal("could not initialize compression library: %s",
+ zp->msg);
+
+ /* Just be paranoid - maybe End is called after Start, with no Write */
+ zp->next_out = (void *) cs->zlibOut;
+ zp->avail_out = cs->zlibOutSize;
+}
+
+static void
+EndCompressorZlib(ArchiveHandle *AH, CompressorState *cs)
+{
+ z_streamp zp = cs->zp;
+
+ zp->next_in = NULL;
+ zp->avail_in = 0;
+
+ /* Flush any remaining data from zlib buffer */
+ DeflateCompressorZlib(AH, cs, true);
+
+ if (deflateEnd(zp) != Z_OK)
+ pg_fatal("could not close compression stream: %s", zp->msg);
+
+ free(cs->zlibOut);
+ free(cs->zp);
+}
+
+static void
+DeflateCompressorZlib(ArchiveHandle *AH, CompressorState *cs, bool flush)
+{
+ z_streamp zp = cs->zp;
+ char *out = cs->zlibOut;
+ int res = Z_OK;
+
+ while (cs->zp->avail_in != 0 || flush)
+ {
+ res = deflate(zp, flush ? Z_FINISH : Z_NO_FLUSH);
+ if (res == Z_STREAM_ERROR)
+ pg_fatal("could not compress data: %s", zp->msg);
+ if ((flush && (zp->avail_out < cs->zlibOutSize))
+ || (zp->avail_out == 0)
+ || (zp->avail_in != 0)
+ )
+ {
+ /*
+ * Extra paranoia: avoid zero-length chunks, since a zero length
+ * chunk is the EOF marker in the custom format. This should never
+ * happen but...
+ */
+ if (zp->avail_out < cs->zlibOutSize)
+ {
+ /*
+ * Any write function should do its own error checking but to
+ * make sure we do a check here as well...
+ */
+ size_t len = cs->zlibOutSize - zp->avail_out;
+
+ cs->writeF(AH, out, len);
+ }
+ zp->next_out = (void *) out;
+ zp->avail_out = cs->zlibOutSize;
+ }
+
+ if (res == Z_STREAM_END)
+ break;
+ }
+}
+
+static void
+WriteDataToArchiveZlib(ArchiveHandle *AH, CompressorState *cs,
+ const char *data, size_t dLen)
+{
+ cs->zp->next_in = (void *) unconstify(char *, data);
+ cs->zp->avail_in = dLen;
+ DeflateCompressorZlib(AH, cs, false);
+}
+
+static void
+ReadDataFromArchiveZlib(ArchiveHandle *AH, ReadFunc readF)
+{
+ z_streamp zp;
+ char *out;
+ int res = Z_OK;
+ size_t cnt;
+ char *buf;
+ size_t buflen;
+
+ zp = (z_streamp) pg_malloc(sizeof(z_stream));
+ zp->zalloc = Z_NULL;
+ zp->zfree = Z_NULL;
+ zp->opaque = Z_NULL;
+
+ buf = pg_malloc(ZLIB_IN_SIZE);
+ buflen = ZLIB_IN_SIZE;
+
+ out = pg_malloc(ZLIB_OUT_SIZE + 1);
+
+ if (inflateInit(zp) != Z_OK)
+ pg_fatal("could not initialize compression library: %s",
+ zp->msg);
+
+ /* no minimal chunk size for zlib */
+ while ((cnt = readF(AH, &buf, &buflen)))
+ {
+ zp->next_in = (void *) buf;
+ zp->avail_in = cnt;
+
+ while (zp->avail_in > 0)
+ {
+ zp->next_out = (void *) out;
+ zp->avail_out = ZLIB_OUT_SIZE;
+
+ res = inflate(zp, 0);
+ if (res != Z_OK && res != Z_STREAM_END)
+ pg_fatal("could not uncompress data: %s", zp->msg);
+
+ out[ZLIB_OUT_SIZE - zp->avail_out] = '\0';
+ ahwrite(out, 1, ZLIB_OUT_SIZE - zp->avail_out, AH);
+ }
+ }
+
+ zp->next_in = NULL;
+ zp->avail_in = 0;
+ while (res != Z_STREAM_END)
+ {
+ zp->next_out = (void *) out;
+ zp->avail_out = ZLIB_OUT_SIZE;
+ res = inflate(zp, 0);
+ if (res != Z_OK && res != Z_STREAM_END)
+ pg_fatal("could not uncompress data: %s", zp->msg);
+
+ out[ZLIB_OUT_SIZE - zp->avail_out] = '\0';
+ ahwrite(out, 1, ZLIB_OUT_SIZE - zp->avail_out, AH);
+ }
+
+ if (inflateEnd(zp) != Z_OK)
+ pg_fatal("could not close compression library: %s", zp->msg);
+
+ free(buf);
+ free(out);
+ free(zp);
+}
+#endif /* HAVE_LIBZ */
+
+
+/*
+ * Functions for uncompressed output.
+ */
+
+static void
+ReadDataFromArchiveNone(ArchiveHandle *AH, ReadFunc readF)
+{
+ size_t cnt;
+ char *buf;
+ size_t buflen;
+
+ buf = pg_malloc(ZLIB_OUT_SIZE);
+ buflen = ZLIB_OUT_SIZE;
+
+ while ((cnt = readF(AH, &buf, &buflen)))
+ {
+ ahwrite(buf, 1, cnt, AH);
+ }
+
+ free(buf);
+}
+
+static void
+WriteDataToArchiveNone(ArchiveHandle *AH, CompressorState *cs,
+ const char *data, size_t dLen)
+{
+ cs->writeF(AH, data, dLen);
+}
+
+
+/*----------------------
+ * Compressed stream API
+ *----------------------
+ */
+
+/*
+ * cfp represents an open stream, wrapping the underlying FILE or gzFile
+ * pointer. This is opaque to the callers.
+ */
+struct cfp
+{
+ FILE *uncompressedfp;
+#ifdef HAVE_LIBZ
+ gzFile compressedfp;
+#endif
+};
+
+#ifdef HAVE_LIBZ
+static int hasSuffix(const char *filename, const char *suffix);
+#endif
+
+/* free() without changing errno; useful in several places below */
+static void
+free_keep_errno(void *p)
+{
+ int save_errno = errno;
+
+ free(p);
+ errno = save_errno;
+}
+
+/*
+ * Open a file for reading. 'path' is the file to open, and 'mode' should
+ * be either "r" or "rb".
+ *
+ * If the file at 'path' does not exist, we append the ".gz" suffix (if 'path'
+ * doesn't already have it) and try again. So if you pass "foo" as 'path',
+ * this will open either "foo" or "foo.gz".
+ *
+ * On failure, return NULL with an error code in errno.
+ */
+cfp *
+cfopen_read(const char *path, const char *mode)
+{
+ cfp *fp;
+
+#ifdef HAVE_LIBZ
+ if (hasSuffix(path, ".gz"))
+ fp = cfopen(path, mode, 1);
+ else
+#endif
+ {
+ fp = cfopen(path, mode, 0);
+#ifdef HAVE_LIBZ
+ if (fp == NULL)
+ {
+ char *fname;
+
+ fname = psprintf("%s.gz", path);
+ fp = cfopen(fname, mode, 1);
+ free_keep_errno(fname);
+ }
+#endif
+ }
+ return fp;
+}
+
+/*
+ * Open a file for writing. 'path' indicates the path name, and 'mode' must
+ * be a filemode as accepted by fopen() and gzopen() that indicates writing
+ * ("w", "wb", "a", or "ab").
+ *
+ * If 'compression' is non-zero, a gzip compressed stream is opened, and
+ * 'compression' indicates the compression level used. The ".gz" suffix
+ * is automatically added to 'path' in that case.
+ *
+ * On failure, return NULL with an error code in errno.
+ */
+cfp *
+cfopen_write(const char *path, const char *mode, int compression)
+{
+ cfp *fp;
+
+ if (compression == 0)
+ fp = cfopen(path, mode, 0);
+ else
+ {
+#ifdef HAVE_LIBZ
+ char *fname;
+
+ fname = psprintf("%s.gz", path);
+ fp = cfopen(fname, mode, compression);
+ free_keep_errno(fname);
+#else
+ pg_fatal("not built with zlib support");
+ fp = NULL; /* keep compiler quiet */
+#endif
+ }
+ return fp;
+}
+
+/*
+ * Opens file 'path' in 'mode'. If 'compression' is non-zero, the file
+ * is opened with libz gzopen(), otherwise with plain fopen().
+ *
+ * On failure, return NULL with an error code in errno.
+ */
+cfp *
+cfopen(const char *path, const char *mode, int compression)
+{
+ cfp *fp = pg_malloc(sizeof(cfp));
+
+ if (compression != 0)
+ {
+#ifdef HAVE_LIBZ
+ if (compression != Z_DEFAULT_COMPRESSION)
+ {
+ /* user has specified a compression level, so tell zlib to use it */
+ char mode_compression[32];
+
+ snprintf(mode_compression, sizeof(mode_compression), "%s%d",
+ mode, compression);
+ fp->compressedfp = gzopen(path, mode_compression);
+ }
+ else
+ {
+ /* don't specify a level, just use the zlib default */
+ fp->compressedfp = gzopen(path, mode);
+ }
+
+ fp->uncompressedfp = NULL;
+ if (fp->compressedfp == NULL)
+ {
+ free_keep_errno(fp);
+ fp = NULL;
+ }
+#else
+ pg_fatal("not built with zlib support");
+#endif
+ }
+ else
+ {
+#ifdef HAVE_LIBZ
+ fp->compressedfp = NULL;
+#endif
+ fp->uncompressedfp = fopen(path, mode);
+ if (fp->uncompressedfp == NULL)
+ {
+ free_keep_errno(fp);
+ fp = NULL;
+ }
+ }
+
+ return fp;
+}
+
+
+int
+cfread(void *ptr, int size, cfp *fp)
+{
+ int ret;
+
+ if (size == 0)
+ return 0;
+
+#ifdef HAVE_LIBZ
+ if (fp->compressedfp)
+ {
+ ret = gzread(fp->compressedfp, ptr, size);
+ if (ret != size && !gzeof(fp->compressedfp))
+ {
+ int errnum;
+ const char *errmsg = gzerror(fp->compressedfp, &errnum);
+
+ pg_fatal("could not read from input file: %s",
+ errnum == Z_ERRNO ? strerror(errno) : errmsg);
+ }
+ }
+ else
+#endif
+ {
+ ret = fread(ptr, 1, size, fp->uncompressedfp);
+ if (ret != size && !feof(fp->uncompressedfp))
+ READ_ERROR_EXIT(fp->uncompressedfp);
+ }
+ return ret;
+}
+
+int
+cfwrite(const void *ptr, int size, cfp *fp)
+{
+#ifdef HAVE_LIBZ
+ if (fp->compressedfp)
+ return gzwrite(fp->compressedfp, ptr, size);
+ else
+#endif
+ return fwrite(ptr, 1, size, fp->uncompressedfp);
+}
+
+int
+cfgetc(cfp *fp)
+{
+ int ret;
+
+#ifdef HAVE_LIBZ
+ if (fp->compressedfp)
+ {
+ ret = gzgetc(fp->compressedfp);
+ if (ret == EOF)
+ {
+ if (!gzeof(fp->compressedfp))
+ pg_fatal("could not read from input file: %s", strerror(errno));
+ else
+ pg_fatal("could not read from input file: end of file");
+ }
+ }
+ else
+#endif
+ {
+ ret = fgetc(fp->uncompressedfp);
+ if (ret == EOF)
+ READ_ERROR_EXIT(fp->uncompressedfp);
+ }
+
+ return ret;
+}
+
+char *
+cfgets(cfp *fp, char *buf, int len)
+{
+#ifdef HAVE_LIBZ
+ if (fp->compressedfp)
+ return gzgets(fp->compressedfp, buf, len);
+ else
+#endif
+ return fgets(buf, len, fp->uncompressedfp);
+}
+
+int
+cfclose(cfp *fp)
+{
+ int result;
+
+ if (fp == NULL)
+ {
+ errno = EBADF;
+ return EOF;
+ }
+#ifdef HAVE_LIBZ
+ if (fp->compressedfp)
+ {
+ result = gzclose(fp->compressedfp);
+ fp->compressedfp = NULL;
+ }
+ else
+#endif
+ {
+ result = fclose(fp->uncompressedfp);
+ fp->uncompressedfp = NULL;
+ }
+ free_keep_errno(fp);
+
+ return result;
+}
+
+int
+cfeof(cfp *fp)
+{
+#ifdef HAVE_LIBZ
+ if (fp->compressedfp)
+ return gzeof(fp->compressedfp);
+ else
+#endif
+ return feof(fp->uncompressedfp);
+}
+
+const char *
+get_cfp_error(cfp *fp)
+{
+#ifdef HAVE_LIBZ
+ if (fp->compressedfp)
+ {
+ int errnum;
+ const char *errmsg = gzerror(fp->compressedfp, &errnum);
+
+ if (errnum != Z_ERRNO)
+ return errmsg;
+ }
+#endif
+ return strerror(errno);
+}
+
+#ifdef HAVE_LIBZ
+static int
+hasSuffix(const char *filename, const char *suffix)
+{
+ int filenamelen = strlen(filename);
+ int suffixlen = strlen(suffix);
+
+ if (filenamelen < suffixlen)
+ return 0;
+
+ return memcmp(&filename[filenamelen - suffixlen],
+ suffix,
+ suffixlen) == 0;
+}
+
+#endif
diff --git a/src/bin/pg_dump/compress_io.h b/src/bin/pg_dump/compress_io.h
new file mode 100644
index 0000000..f635787
--- /dev/null
+++ b/src/bin/pg_dump/compress_io.h
@@ -0,0 +1,70 @@
+/*-------------------------------------------------------------------------
+ *
+ * compress_io.h
+ * Interface to compress_io.c routines
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/compress_io.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef __COMPRESS_IO__
+#define __COMPRESS_IO__
+
+#include "pg_backup_archiver.h"
+
+/* Initial buffer sizes used in zlib compression. */
+#define ZLIB_OUT_SIZE 4096
+#define ZLIB_IN_SIZE 4096
+
+typedef enum
+{
+ COMPR_ALG_NONE,
+ COMPR_ALG_LIBZ
+} CompressionAlgorithm;
+
+/* Prototype for callback function to WriteDataToArchive() */
+typedef void (*WriteFunc) (ArchiveHandle *AH, const char *buf, size_t len);
+
+/*
+ * Prototype for callback function to ReadDataFromArchive()
+ *
+ * ReadDataFromArchive will call the read function repeatedly, until it
+ * returns 0 to signal EOF. ReadDataFromArchive passes a buffer to read the
+ * data into in *buf, of length *buflen. If that's not big enough for the
+ * callback function, it can free() it and malloc() a new one, returning the
+ * new buffer and its size in *buf and *buflen.
+ *
+ * Returns the number of bytes read into *buf, or 0 on EOF.
+ */
+typedef size_t (*ReadFunc) (ArchiveHandle *AH, char **buf, size_t *buflen);
+
+/* struct definition appears in compress_io.c */
+typedef struct CompressorState CompressorState;
+
+extern CompressorState *AllocateCompressor(int compression, WriteFunc writeF);
+extern void ReadDataFromArchive(ArchiveHandle *AH, int compression,
+ ReadFunc readF);
+extern void WriteDataToArchive(ArchiveHandle *AH, CompressorState *cs,
+ const void *data, size_t dLen);
+extern void EndCompressor(ArchiveHandle *AH, CompressorState *cs);
+
+
+typedef struct cfp cfp;
+
+extern cfp *cfopen(const char *path, const char *mode, int compression);
+extern cfp *cfopen_read(const char *path, const char *mode);
+extern cfp *cfopen_write(const char *path, const char *mode, int compression);
+extern int cfread(void *ptr, int size, cfp *fp);
+extern int cfwrite(const void *ptr, int size, cfp *fp);
+extern int cfgetc(cfp *fp);
+extern char *cfgets(cfp *fp, char *buf, int len);
+extern int cfclose(cfp *fp);
+extern int cfeof(cfp *fp);
+extern const char *get_cfp_error(cfp *fp);
+
+#endif
diff --git a/src/bin/pg_dump/dumputils.c b/src/bin/pg_dump/dumputils.c
new file mode 100644
index 0000000..3e68dfc
--- /dev/null
+++ b/src/bin/pg_dump/dumputils.c
@@ -0,0 +1,885 @@
+/*-------------------------------------------------------------------------
+ *
+ * Utility routines for SQL dumping
+ *
+ * Basically this is stuff that is useful in both pg_dump and pg_dumpall.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_dump/dumputils.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+
+#include "dumputils.h"
+#include "fe_utils/string_utils.h"
+
+
+static bool parseAclItem(const char *item, const char *type,
+ const char *name, const char *subname, int remoteVersion,
+ PQExpBuffer grantee, PQExpBuffer grantor,
+ PQExpBuffer privs, PQExpBuffer privswgo);
+static char *dequoteAclUserName(PQExpBuffer output, char *input);
+static void AddAcl(PQExpBuffer aclbuf, const char *keyword,
+ const char *subname);
+
+
+/*
+ * Build GRANT/REVOKE command(s) for an object.
+ *
+ * name: the object name, in the form to use in the commands (already quoted)
+ * subname: the sub-object name, if any (already quoted); NULL if none
+ * nspname: the namespace the object is in (NULL if none); not pre-quoted
+ * type: the object type (as seen in GRANT command: must be one of
+ * TABLE, SEQUENCE, FUNCTION, PROCEDURE, LANGUAGE, SCHEMA, DATABASE, TABLESPACE,
+ * FOREIGN DATA WRAPPER, SERVER, PARAMETER or LARGE OBJECT)
+ * acls: the ACL string fetched from the database
+ * baseacls: the initial ACL string for this object
+ * owner: username of object owner (will be passed through fmtId); can be
+ * NULL or empty string to indicate "no owner known"
+ * prefix: string to prefix to each generated command; typically empty
+ * remoteVersion: version of database
+ *
+ * Returns true if okay, false if could not parse the acl string.
+ * The resulting commands (if any) are appended to the contents of 'sql'.
+ *
+ * baseacls is typically the result of acldefault() for the object's type
+ * and owner. However, if there is a pg_init_privs entry for the object,
+ * it should instead be the initprivs ACLs. When acls is itself a
+ * pg_init_privs entry, baseacls is what to dump that relative to; then
+ * it can be either an acldefault() value or an empty ACL "{}".
+ *
+ * Note: when processing a default ACL, prefix is "ALTER DEFAULT PRIVILEGES "
+ * or something similar, and name is an empty string.
+ *
+ * Note: beware of passing a fmtId() result directly as 'name' or 'subname',
+ * since this routine uses fmtId() internally.
+ */
+bool
+buildACLCommands(const char *name, const char *subname, const char *nspname,
+ const char *type, const char *acls, const char *baseacls,
+ const char *owner, const char *prefix, int remoteVersion,
+ PQExpBuffer sql)
+{
+ bool ok = true;
+ char **aclitems = NULL;
+ char **baseitems = NULL;
+ char **grantitems = NULL;
+ char **revokeitems = NULL;
+ int naclitems = 0;
+ int nbaseitems = 0;
+ int ngrantitems = 0;
+ int nrevokeitems = 0;
+ int i;
+ PQExpBuffer grantee,
+ grantor,
+ privs,
+ privswgo;
+ PQExpBuffer firstsql,
+ secondsql;
+
+ /*
+ * If the acl was NULL (initial default state), we need do nothing. Note
+ * that this is distinguishable from all-privileges-revoked, which will
+ * look like an empty array ("{}").
+ */
+ if (acls == NULL || *acls == '\0')
+ return true; /* object has default permissions */
+
+ /* treat empty-string owner same as NULL */
+ if (owner && *owner == '\0')
+ owner = NULL;
+
+ /* Parse the acls array */
+ if (!parsePGArray(acls, &aclitems, &naclitems))
+ {
+ if (aclitems)
+ free(aclitems);
+ return false;
+ }
+
+ /* Parse the baseacls too */
+ if (!parsePGArray(baseacls, &baseitems, &nbaseitems))
+ {
+ if (aclitems)
+ free(aclitems);
+ if (baseitems)
+ free(baseitems);
+ return false;
+ }
+
+ /*
+ * Compare the actual ACL with the base ACL, extracting the privileges
+ * that need to be granted (i.e., are in the actual ACL but not the base
+ * ACL) and the ones that need to be revoked (the reverse). We use plain
+ * string comparisons to check for matches. In principle that could be
+ * fooled by extraneous issues such as whitespace, but since all these
+ * strings are the work of aclitemout(), it should be OK in practice.
+ * Besides, a false mismatch will just cause the output to be a little
+ * more verbose than it really needed to be.
+ */
+ grantitems = (char **) pg_malloc(naclitems * sizeof(char *));
+ for (i = 0; i < naclitems; i++)
+ {
+ bool found = false;
+
+ for (int j = 0; j < nbaseitems; j++)
+ {
+ if (strcmp(aclitems[i], baseitems[j]) == 0)
+ {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ grantitems[ngrantitems++] = aclitems[i];
+ }
+ revokeitems = (char **) pg_malloc(nbaseitems * sizeof(char *));
+ for (i = 0; i < nbaseitems; i++)
+ {
+ bool found = false;
+
+ for (int j = 0; j < naclitems; j++)
+ {
+ if (strcmp(baseitems[i], aclitems[j]) == 0)
+ {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ revokeitems[nrevokeitems++] = baseitems[i];
+ }
+
+ /* Prepare working buffers */
+ grantee = createPQExpBuffer();
+ grantor = createPQExpBuffer();
+ privs = createPQExpBuffer();
+ privswgo = createPQExpBuffer();
+
+ /*
+ * At the end, these two will be pasted together to form the result.
+ */
+ firstsql = createPQExpBuffer();
+ secondsql = createPQExpBuffer();
+
+ /*
+ * Build REVOKE statements for ACLs listed in revokeitems[].
+ */
+ for (i = 0; i < nrevokeitems; i++)
+ {
+ if (!parseAclItem(revokeitems[i],
+ type, name, subname, remoteVersion,
+ grantee, grantor, privs, NULL))
+ {
+ ok = false;
+ break;
+ }
+
+ if (privs->len > 0)
+ {
+ appendPQExpBuffer(firstsql, "%sREVOKE %s ON %s ",
+ prefix, privs->data, type);
+ if (nspname && *nspname)
+ appendPQExpBuffer(firstsql, "%s.", fmtId(nspname));
+ appendPQExpBuffer(firstsql, "%s FROM ", name);
+ if (grantee->len == 0)
+ appendPQExpBufferStr(firstsql, "PUBLIC;\n");
+ else
+ appendPQExpBuffer(firstsql, "%s;\n",
+ fmtId(grantee->data));
+ }
+ }
+
+ /*
+ * At this point we have issued REVOKE statements for all initial and
+ * default privileges that are no longer present on the object, so we are
+ * almost ready to GRANT the privileges listed in grantitems[].
+ *
+ * We still need some hacking though to cover the case where new default
+ * public privileges are added in new versions: the REVOKE ALL will revoke
+ * them, leading to behavior different from what the old version had,
+ * which is generally not what's wanted. So add back default privs if the
+ * source database is too old to have had that particular priv. (As of
+ * right now, no such cases exist in supported versions.)
+ */
+
+ /*
+ * Scan individual ACL items to be granted.
+ *
+ * The order in which privileges appear in the ACL string (the order they
+ * have been GRANT'd in, which the backend maintains) must be preserved to
+ * ensure that GRANTs WITH GRANT OPTION and subsequent GRANTs based on
+ * those are dumped in the correct order. However, some old server
+ * versions will show grants to PUBLIC before the owner's own grants; for
+ * consistency's sake, force the owner's grants to be output first.
+ */
+ for (i = 0; i < ngrantitems; i++)
+ {
+ if (parseAclItem(grantitems[i], type, name, subname, remoteVersion,
+ grantee, grantor, privs, privswgo))
+ {
+ /*
+ * If the grantor isn't the owner, we'll need to use SET SESSION
+ * AUTHORIZATION to become the grantor. Issue the SET/RESET only
+ * if there's something useful to do.
+ */
+ if (privs->len > 0 || privswgo->len > 0)
+ {
+ PQExpBuffer thissql;
+
+ /* Set owner as grantor if that's not explicit in the ACL */
+ if (grantor->len == 0 && owner)
+ printfPQExpBuffer(grantor, "%s", owner);
+
+ /* Make sure owner's own grants are output before others */
+ if (owner &&
+ strcmp(grantee->data, owner) == 0 &&
+ strcmp(grantor->data, owner) == 0)
+ thissql = firstsql;
+ else
+ thissql = secondsql;
+
+ if (grantor->len > 0
+ && (!owner || strcmp(owner, grantor->data) != 0))
+ appendPQExpBuffer(thissql, "SET SESSION AUTHORIZATION %s;\n",
+ fmtId(grantor->data));
+
+ if (privs->len > 0)
+ {
+ appendPQExpBuffer(thissql, "%sGRANT %s ON %s ",
+ prefix, privs->data, type);
+ if (nspname && *nspname)
+ appendPQExpBuffer(thissql, "%s.", fmtId(nspname));
+ appendPQExpBuffer(thissql, "%s TO ", name);
+ if (grantee->len == 0)
+ appendPQExpBufferStr(thissql, "PUBLIC;\n");
+ else
+ appendPQExpBuffer(thissql, "%s;\n", fmtId(grantee->data));
+ }
+ if (privswgo->len > 0)
+ {
+ appendPQExpBuffer(thissql, "%sGRANT %s ON %s ",
+ prefix, privswgo->data, type);
+ if (nspname && *nspname)
+ appendPQExpBuffer(thissql, "%s.", fmtId(nspname));
+ appendPQExpBuffer(thissql, "%s TO ", name);
+ if (grantee->len == 0)
+ appendPQExpBufferStr(thissql, "PUBLIC");
+ else
+ appendPQExpBufferStr(thissql, fmtId(grantee->data));
+ appendPQExpBufferStr(thissql, " WITH GRANT OPTION;\n");
+ }
+
+ if (grantor->len > 0
+ && (!owner || strcmp(owner, grantor->data) != 0))
+ appendPQExpBufferStr(thissql, "RESET SESSION AUTHORIZATION;\n");
+ }
+ }
+ else
+ {
+ /* parseAclItem failed, give up */
+ ok = false;
+ break;
+ }
+ }
+
+ destroyPQExpBuffer(grantee);
+ destroyPQExpBuffer(grantor);
+ destroyPQExpBuffer(privs);
+ destroyPQExpBuffer(privswgo);
+
+ appendPQExpBuffer(sql, "%s%s", firstsql->data, secondsql->data);
+ destroyPQExpBuffer(firstsql);
+ destroyPQExpBuffer(secondsql);
+
+ if (aclitems)
+ free(aclitems);
+ if (baseitems)
+ free(baseitems);
+ if (grantitems)
+ free(grantitems);
+ if (revokeitems)
+ free(revokeitems);
+
+ return ok;
+}
+
+/*
+ * Build ALTER DEFAULT PRIVILEGES command(s) for a single pg_default_acl entry.
+ *
+ * type: the object type (TABLES, FUNCTIONS, etc)
+ * nspname: schema name, or NULL for global default privileges
+ * acls: the ACL string fetched from the database
+ * acldefault: the appropriate default ACL for the object type and owner
+ * owner: username of privileges owner (will be passed through fmtId)
+ * remoteVersion: version of database
+ *
+ * Returns true if okay, false if could not parse the acl string.
+ * The resulting commands (if any) are appended to the contents of 'sql'.
+ */
+bool
+buildDefaultACLCommands(const char *type, const char *nspname,
+ const char *acls, const char *acldefault,
+ const char *owner,
+ int remoteVersion,
+ PQExpBuffer sql)
+{
+ PQExpBuffer prefix;
+
+ prefix = createPQExpBuffer();
+
+ /*
+ * We incorporate the target role directly into the command, rather than
+ * playing around with SET ROLE or anything like that. This is so that a
+ * permissions error leads to nothing happening, rather than changing
+ * default privileges for the wrong user.
+ */
+ appendPQExpBuffer(prefix, "ALTER DEFAULT PRIVILEGES FOR ROLE %s ",
+ fmtId(owner));
+ if (nspname)
+ appendPQExpBuffer(prefix, "IN SCHEMA %s ", fmtId(nspname));
+
+ /*
+ * There's no such thing as initprivs for a default ACL, so the base ACL
+ * is always just the object-type-specific default.
+ */
+ if (!buildACLCommands("", NULL, NULL, type,
+ acls, acldefault, owner,
+ prefix->data, remoteVersion, sql))
+ {
+ destroyPQExpBuffer(prefix);
+ return false;
+ }
+
+ destroyPQExpBuffer(prefix);
+
+ return true;
+}
+
+/*
+ * This will parse an aclitem string, having the general form
+ * username=privilegecodes/grantor
+ *
+ * Returns true on success, false on parse error. On success, the components
+ * of the string are returned in the PQExpBuffer parameters.
+ *
+ * The returned grantee string will be the dequoted username, or an empty
+ * string in the case of a grant to PUBLIC. The returned grantor is the
+ * dequoted grantor name. Privilege characters are translated to GRANT/REVOKE
+ * comma-separated privileges lists. If "privswgo" is non-NULL, the result is
+ * separate lists for privileges with grant option ("privswgo") and without
+ * ("privs"). Otherwise, "privs" bears every relevant privilege, ignoring the
+ * grant option distinction.
+ *
+ * Note: for cross-version compatibility, it's important to use ALL to
+ * represent the privilege sets whenever appropriate.
+ */
+static bool
+parseAclItem(const char *item, const char *type,
+ const char *name, const char *subname, int remoteVersion,
+ PQExpBuffer grantee, PQExpBuffer grantor,
+ PQExpBuffer privs, PQExpBuffer privswgo)
+{
+ char *buf;
+ bool all_with_go = true;
+ bool all_without_go = true;
+ char *eqpos;
+ char *slpos;
+ char *pos;
+
+ buf = pg_strdup(item);
+
+ /* user or group name is string up to = */
+ eqpos = dequoteAclUserName(grantee, buf);
+ if (*eqpos != '=')
+ {
+ pg_free(buf);
+ return false;
+ }
+
+ /* grantor should appear after / */
+ slpos = strchr(eqpos + 1, '/');
+ if (slpos)
+ {
+ *slpos++ = '\0';
+ slpos = dequoteAclUserName(grantor, slpos);
+ if (*slpos != '\0')
+ {
+ pg_free(buf);
+ return false;
+ }
+ }
+ else
+ {
+ pg_free(buf);
+ return false;
+ }
+
+ /* privilege codes */
+#define CONVERT_PRIV(code, keywd) \
+do { \
+ if ((pos = strchr(eqpos + 1, code))) \
+ { \
+ if (*(pos + 1) == '*' && privswgo != NULL) \
+ { \
+ AddAcl(privswgo, keywd, subname); \
+ all_without_go = false; \
+ } \
+ else \
+ { \
+ AddAcl(privs, keywd, subname); \
+ all_with_go = false; \
+ } \
+ } \
+ else \
+ all_with_go = all_without_go = false; \
+} while (0)
+
+ resetPQExpBuffer(privs);
+ resetPQExpBuffer(privswgo);
+
+ if (strcmp(type, "TABLE") == 0 || strcmp(type, "SEQUENCE") == 0 ||
+ strcmp(type, "TABLES") == 0 || strcmp(type, "SEQUENCES") == 0)
+ {
+ CONVERT_PRIV('r', "SELECT");
+
+ if (strcmp(type, "SEQUENCE") == 0 ||
+ strcmp(type, "SEQUENCES") == 0)
+ /* sequence only */
+ CONVERT_PRIV('U', "USAGE");
+ else
+ {
+ /* table only */
+ CONVERT_PRIV('a', "INSERT");
+ CONVERT_PRIV('x', "REFERENCES");
+ /* rest are not applicable to columns */
+ if (subname == NULL)
+ {
+ CONVERT_PRIV('d', "DELETE");
+ CONVERT_PRIV('t', "TRIGGER");
+ CONVERT_PRIV('D', "TRUNCATE");
+ }
+ }
+
+ /* UPDATE */
+ CONVERT_PRIV('w', "UPDATE");
+ }
+ else if (strcmp(type, "FUNCTION") == 0 ||
+ strcmp(type, "FUNCTIONS") == 0)
+ CONVERT_PRIV('X', "EXECUTE");
+ else if (strcmp(type, "PROCEDURE") == 0 ||
+ strcmp(type, "PROCEDURES") == 0)
+ CONVERT_PRIV('X', "EXECUTE");
+ else if (strcmp(type, "LANGUAGE") == 0)
+ CONVERT_PRIV('U', "USAGE");
+ else if (strcmp(type, "SCHEMA") == 0 ||
+ strcmp(type, "SCHEMAS") == 0)
+ {
+ CONVERT_PRIV('C', "CREATE");
+ CONVERT_PRIV('U', "USAGE");
+ }
+ else if (strcmp(type, "DATABASE") == 0)
+ {
+ CONVERT_PRIV('C', "CREATE");
+ CONVERT_PRIV('c', "CONNECT");
+ CONVERT_PRIV('T', "TEMPORARY");
+ }
+ else if (strcmp(type, "TABLESPACE") == 0)
+ CONVERT_PRIV('C', "CREATE");
+ else if (strcmp(type, "TYPE") == 0 ||
+ strcmp(type, "TYPES") == 0)
+ CONVERT_PRIV('U', "USAGE");
+ else if (strcmp(type, "FOREIGN DATA WRAPPER") == 0)
+ CONVERT_PRIV('U', "USAGE");
+ else if (strcmp(type, "FOREIGN SERVER") == 0)
+ CONVERT_PRIV('U', "USAGE");
+ else if (strcmp(type, "FOREIGN TABLE") == 0)
+ CONVERT_PRIV('r', "SELECT");
+ else if (strcmp(type, "PARAMETER") == 0)
+ {
+ CONVERT_PRIV('s', "SET");
+ CONVERT_PRIV('A', "ALTER SYSTEM");
+ }
+ else if (strcmp(type, "LARGE OBJECT") == 0)
+ {
+ CONVERT_PRIV('r', "SELECT");
+ CONVERT_PRIV('w', "UPDATE");
+ }
+ else
+ abort();
+
+#undef CONVERT_PRIV
+
+ if (all_with_go)
+ {
+ resetPQExpBuffer(privs);
+ printfPQExpBuffer(privswgo, "ALL");
+ if (subname)
+ appendPQExpBuffer(privswgo, "(%s)", subname);
+ }
+ else if (all_without_go)
+ {
+ resetPQExpBuffer(privswgo);
+ printfPQExpBuffer(privs, "ALL");
+ if (subname)
+ appendPQExpBuffer(privs, "(%s)", subname);
+ }
+
+ pg_free(buf);
+
+ return true;
+}
+
+/*
+ * Transfer the role name at *input into the output buffer, adding
+ * quoting according to the same rules as putid() in backend's acl.c.
+ */
+void
+quoteAclUserName(PQExpBuffer output, const char *input)
+{
+ const char *src;
+ bool safe = true;
+
+ for (src = input; *src; src++)
+ {
+ /* This test had better match what putid() does */
+ if (!isalnum((unsigned char) *src) && *src != '_')
+ {
+ safe = false;
+ break;
+ }
+ }
+ if (!safe)
+ appendPQExpBufferChar(output, '"');
+ for (src = input; *src; src++)
+ {
+ /* A double quote character in a username is encoded as "" */
+ if (*src == '"')
+ appendPQExpBufferChar(output, '"');
+ appendPQExpBufferChar(output, *src);
+ }
+ if (!safe)
+ appendPQExpBufferChar(output, '"');
+}
+
+/*
+ * Transfer a user or group name starting at *input into the output buffer,
+ * dequoting if needed. Returns a pointer to just past the input name.
+ * The name is taken to end at an unquoted '=' or end of string.
+ * Note: unlike quoteAclUserName(), this first clears the output buffer.
+ */
+static char *
+dequoteAclUserName(PQExpBuffer output, char *input)
+{
+ resetPQExpBuffer(output);
+
+ while (*input && *input != '=')
+ {
+ /*
+ * If user name isn't quoted, then just add it to the output buffer
+ */
+ if (*input != '"')
+ appendPQExpBufferChar(output, *input++);
+ else
+ {
+ /* Otherwise, it's a quoted username */
+ input++;
+ /* Loop until we come across an unescaped quote */
+ while (!(*input == '"' && *(input + 1) != '"'))
+ {
+ if (*input == '\0')
+ return input; /* really a syntax error... */
+
+ /*
+ * Quoting convention is to escape " as "". Keep this code in
+ * sync with putid() in backend's acl.c.
+ */
+ if (*input == '"' && *(input + 1) == '"')
+ input++;
+ appendPQExpBufferChar(output, *input++);
+ }
+ input++;
+ }
+ }
+ return input;
+}
+
+/*
+ * Append a privilege keyword to a keyword list, inserting comma if needed.
+ */
+static void
+AddAcl(PQExpBuffer aclbuf, const char *keyword, const char *subname)
+{
+ if (aclbuf->len > 0)
+ appendPQExpBufferChar(aclbuf, ',');
+ appendPQExpBufferStr(aclbuf, keyword);
+ if (subname)
+ appendPQExpBuffer(aclbuf, "(%s)", subname);
+}
+
+
+/*
+ * buildShSecLabelQuery
+ *
+ * Build a query to retrieve security labels for a shared object.
+ * The object is identified by its OID plus the name of the catalog
+ * it can be found in (e.g., "pg_database" for database names).
+ * The query is appended to "sql". (We don't execute it here so as to
+ * keep this file free of assumptions about how to deal with SQL errors.)
+ */
+void
+buildShSecLabelQuery(const char *catalog_name, Oid objectId,
+ PQExpBuffer sql)
+{
+ appendPQExpBuffer(sql,
+ "SELECT provider, label FROM pg_catalog.pg_shseclabel "
+ "WHERE classoid = 'pg_catalog.%s'::pg_catalog.regclass "
+ "AND objoid = '%u'", catalog_name, objectId);
+}
+
+/*
+ * emitShSecLabels
+ *
+ * Construct SECURITY LABEL commands using the data retrieved by the query
+ * generated by buildShSecLabelQuery, and append them to "buffer".
+ * Here, the target object is identified by its type name (e.g. "DATABASE")
+ * and its name (not pre-quoted).
+ */
+void
+emitShSecLabels(PGconn *conn, PGresult *res, PQExpBuffer buffer,
+ const char *objtype, const char *objname)
+{
+ int i;
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ char *provider = PQgetvalue(res, i, 0);
+ char *label = PQgetvalue(res, i, 1);
+
+ /* must use fmtId result before calling it again */
+ appendPQExpBuffer(buffer,
+ "SECURITY LABEL FOR %s ON %s",
+ fmtId(provider), objtype);
+ appendPQExpBuffer(buffer,
+ " %s IS ",
+ fmtId(objname));
+ appendStringLiteralConn(buffer, label, conn);
+ appendPQExpBufferStr(buffer, ";\n");
+ }
+}
+
+
+/*
+ * Detect whether the given GUC variable is of GUC_LIST_QUOTE type.
+ *
+ * It'd be better if we could inquire this directly from the backend; but even
+ * if there were a function for that, it could only tell us about variables
+ * currently known to guc.c, so that it'd be unsafe for extensions to declare
+ * GUC_LIST_QUOTE variables anyway. Lacking a solution for that, it doesn't
+ * seem worth the work to do more than have this list, which must be kept in
+ * sync with the variables actually marked GUC_LIST_QUOTE in guc.c.
+ */
+bool
+variable_is_guc_list_quote(const char *name)
+{
+ if (pg_strcasecmp(name, "local_preload_libraries") == 0 ||
+ pg_strcasecmp(name, "search_path") == 0 ||
+ pg_strcasecmp(name, "session_preload_libraries") == 0 ||
+ pg_strcasecmp(name, "shared_preload_libraries") == 0 ||
+ pg_strcasecmp(name, "temp_tablespaces") == 0 ||
+ pg_strcasecmp(name, "unix_socket_directories") == 0)
+ return true;
+ else
+ return false;
+}
+
+/*
+ * SplitGUCList --- parse a string containing identifiers or file names
+ *
+ * This is used to split the value of a GUC_LIST_QUOTE GUC variable, without
+ * presuming whether the elements will be taken as identifiers or file names.
+ * See comparable code in src/backend/utils/adt/varlena.c.
+ *
+ * Inputs:
+ * rawstring: the input string; must be overwritable! On return, it's
+ * been modified to contain the separated identifiers.
+ * separator: the separator punctuation expected between identifiers
+ * (typically '.' or ','). Whitespace may also appear around
+ * identifiers.
+ * Outputs:
+ * namelist: receives a malloc'd, null-terminated array of pointers to
+ * identifiers within rawstring. Caller should free this
+ * even on error return.
+ *
+ * Returns true if okay, false if there is a syntax error in the string.
+ */
+bool
+SplitGUCList(char *rawstring, char separator,
+ char ***namelist)
+{
+ char *nextp = rawstring;
+ bool done = false;
+ char **nextptr;
+
+ /*
+ * Since we disallow empty identifiers, this is a conservative
+ * overestimate of the number of pointers we could need. Allow one for
+ * list terminator.
+ */
+ *namelist = nextptr = (char **)
+ pg_malloc((strlen(rawstring) / 2 + 2) * sizeof(char *));
+ *nextptr = NULL;
+
+ while (isspace((unsigned char) *nextp))
+ nextp++; /* skip leading whitespace */
+
+ if (*nextp == '\0')
+ return true; /* allow empty string */
+
+ /* At the top of the loop, we are at start of a new identifier. */
+ do
+ {
+ char *curname;
+ char *endp;
+
+ if (*nextp == '"')
+ {
+ /* Quoted name --- collapse quote-quote pairs */
+ curname = nextp + 1;
+ for (;;)
+ {
+ endp = strchr(nextp + 1, '"');
+ if (endp == NULL)
+ return false; /* mismatched quotes */
+ if (endp[1] != '"')
+ break; /* found end of quoted name */
+ /* Collapse adjacent quotes into one quote, and look again */
+ memmove(endp, endp + 1, strlen(endp));
+ nextp = endp;
+ }
+ /* endp now points at the terminating quote */
+ nextp = endp + 1;
+ }
+ else
+ {
+ /* Unquoted name --- extends to separator or whitespace */
+ curname = nextp;
+ while (*nextp && *nextp != separator &&
+ !isspace((unsigned char) *nextp))
+ nextp++;
+ endp = nextp;
+ if (curname == nextp)
+ return false; /* empty unquoted name not allowed */
+ }
+
+ while (isspace((unsigned char) *nextp))
+ nextp++; /* skip trailing whitespace */
+
+ if (*nextp == separator)
+ {
+ nextp++;
+ while (isspace((unsigned char) *nextp))
+ nextp++; /* skip leading whitespace for next */
+ /* we expect another name, so done remains false */
+ }
+ else if (*nextp == '\0')
+ done = true;
+ else
+ return false; /* invalid syntax */
+
+ /* Now safe to overwrite separator with a null */
+ *endp = '\0';
+
+ /*
+ * Finished isolating current name --- add it to output array
+ */
+ *nextptr++ = curname;
+
+ /* Loop back if we didn't reach end of string */
+ } while (!done);
+
+ *nextptr = NULL;
+ return true;
+}
+
+/*
+ * Helper function for dumping "ALTER DATABASE/ROLE SET ..." commands.
+ *
+ * Parse the contents of configitem (a "name=value" string), wrap it in
+ * a complete ALTER command, and append it to buf.
+ *
+ * type is DATABASE or ROLE, and name is the name of the database or role.
+ * If we need an "IN" clause, type2 and name2 similarly define what to put
+ * there; otherwise they should be NULL.
+ * conn is used only to determine string-literal quoting conventions.
+ */
+void
+makeAlterConfigCommand(PGconn *conn, const char *configitem,
+ const char *type, const char *name,
+ const char *type2, const char *name2,
+ PQExpBuffer buf)
+{
+ char *mine;
+ char *pos;
+
+ /* Parse the configitem. If we can't find an "=", silently do nothing. */
+ mine = pg_strdup(configitem);
+ pos = strchr(mine, '=');
+ if (pos == NULL)
+ {
+ pg_free(mine);
+ return;
+ }
+ *pos++ = '\0';
+
+ /* Build the command, with suitable quoting for everything. */
+ appendPQExpBuffer(buf, "ALTER %s %s ", type, fmtId(name));
+ if (type2 != NULL && name2 != NULL)
+ appendPQExpBuffer(buf, "IN %s %s ", type2, fmtId(name2));
+ appendPQExpBuffer(buf, "SET %s TO ", fmtId(mine));
+
+ /*
+ * Variables that are marked GUC_LIST_QUOTE were already fully quoted by
+ * flatten_set_variable_args() before they were put into the setconfig
+ * array. However, because the quoting rules used there aren't exactly
+ * like SQL's, we have to break the list value apart and then quote the
+ * elements as string literals. (The elements may be double-quoted as-is,
+ * but we can't just feed them to the SQL parser; it would do the wrong
+ * thing with elements that are zero-length or longer than NAMEDATALEN.)
+ *
+ * Variables that are not so marked should just be emitted as simple
+ * string literals. If the variable is not known to
+ * variable_is_guc_list_quote(), we'll do that; this makes it unsafe to
+ * use GUC_LIST_QUOTE for extension variables.
+ */
+ if (variable_is_guc_list_quote(mine))
+ {
+ char **namelist;
+ char **nameptr;
+
+ /* Parse string into list of identifiers */
+ /* this shouldn't fail really */
+ if (SplitGUCList(pos, ',', &namelist))
+ {
+ for (nameptr = namelist; *nameptr; nameptr++)
+ {
+ if (nameptr != namelist)
+ appendPQExpBufferStr(buf, ", ");
+ appendStringLiteralConn(buf, *nameptr, conn);
+ }
+ }
+ pg_free(namelist);
+ }
+ else
+ appendStringLiteralConn(buf, pos, conn);
+
+ appendPQExpBufferStr(buf, ";\n");
+
+ pg_free(mine);
+}
diff --git a/src/bin/pg_dump/dumputils.h b/src/bin/pg_dump/dumputils.h
new file mode 100644
index 0000000..c67c3b5
--- /dev/null
+++ b/src/bin/pg_dump/dumputils.h
@@ -0,0 +1,66 @@
+/*-------------------------------------------------------------------------
+ *
+ * Utility routines for SQL dumping
+ *
+ * Basically this is stuff that is useful in both pg_dump and pg_dumpall.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_dump/dumputils.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef DUMPUTILS_H
+#define DUMPUTILS_H
+
+#include "libpq-fe.h"
+#include "pqexpbuffer.h"
+
+/*
+ * Preferred strftime(3) format specifier for printing timestamps in pg_dump
+ * and friends.
+ *
+ * We don't print the timezone on Windows, because the names are long and
+ * localized, which means they may contain characters in various random
+ * encodings; this has been seen to cause encoding errors when reading the
+ * dump script. Think not to get around that by using %z, because
+ * (1) %z is not portable to pre-C99 systems, and
+ * (2) %z doesn't actually act differently from %Z on Windows anyway.
+ */
+#ifndef WIN32
+#define PGDUMP_STRFTIME_FMT "%Y-%m-%d %H:%M:%S %Z"
+#else
+#define PGDUMP_STRFTIME_FMT "%Y-%m-%d %H:%M:%S"
+#endif
+
+
+extern bool buildACLCommands(const char *name, const char *subname, const char *nspname,
+ const char *type, const char *acls, const char *baseacls,
+ const char *owner, const char *prefix, int remoteVersion,
+ PQExpBuffer sql);
+extern bool buildDefaultACLCommands(const char *type, const char *nspname,
+ const char *acls, const char *acldefault,
+ const char *owner,
+ int remoteVersion,
+ PQExpBuffer sql);
+
+extern void quoteAclUserName(PQExpBuffer output, const char *input);
+
+extern void buildShSecLabelQuery(const char *catalog_name,
+ Oid objectId, PQExpBuffer sql);
+extern void emitShSecLabels(PGconn *conn, PGresult *res,
+ PQExpBuffer buffer, const char *objtype, const char *objname);
+
+extern bool variable_is_guc_list_quote(const char *name);
+
+extern bool SplitGUCList(char *rawstring, char separator,
+ char ***namelist);
+
+extern void makeAlterConfigCommand(PGconn *conn, const char *configitem,
+ const char *type, const char *name,
+ const char *type2, const char *name2,
+ PQExpBuffer buf);
+
+#endif /* DUMPUTILS_H */
diff --git a/src/bin/pg_dump/nls.mk b/src/bin/pg_dump/nls.mk
new file mode 100644
index 0000000..4e1653e
--- /dev/null
+++ b/src/bin/pg_dump/nls.mk
@@ -0,0 +1,18 @@
+# src/bin/pg_dump/nls.mk
+CATALOG_NAME = pg_dump
+AVAIL_LANGUAGES = cs de el es fr it ja ka ko ru sv tr uk zh_CN
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ pg_backup_archiver.c pg_backup_db.c pg_backup_custom.c \
+ pg_backup_null.c pg_backup_tar.c \
+ pg_backup_directory.c dumputils.c compress_io.c \
+ pg_dump.c common.c pg_dump_sort.c \
+ pg_restore.c pg_dumpall.c \
+ parallel.c parallel.h pg_backup_utils.c pg_backup_utils.h \
+ ../../common/exec.c ../../common/fe_memutils.c \
+ ../../common/wait_error.c \
+ ../../fe_utils/option_utils.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \
+ simple_prompt \
+ ExecuteSqlCommand:3 warn_or_exit_horribly:2
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \
+ warn_or_exit_horribly:2:c-format
diff --git a/src/bin/pg_dump/parallel.c b/src/bin/pg_dump/parallel.c
new file mode 100644
index 0000000..c9f6b86
--- /dev/null
+++ b/src/bin/pg_dump/parallel.c
@@ -0,0 +1,1803 @@
+/*-------------------------------------------------------------------------
+ *
+ * parallel.c
+ *
+ * Parallel support for pg_dump and pg_restore
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/parallel.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * Parallel operation works like this:
+ *
+ * The original, leader process calls ParallelBackupStart(), which forks off
+ * the desired number of worker processes, which each enter WaitForCommands().
+ *
+ * The leader process dispatches an individual work item to one of the worker
+ * processes in DispatchJobForTocEntry(). We send a command string such as
+ * "DUMP 1234" or "RESTORE 1234", where 1234 is the TocEntry ID.
+ * The worker process receives and decodes the command and passes it to the
+ * routine pointed to by AH->WorkerJobDumpPtr or AH->WorkerJobRestorePtr,
+ * which are routines of the current archive format. That routine performs
+ * the required action (dump or restore) and returns an integer status code.
+ * This is passed back to the leader where we pass it to the
+ * ParallelCompletionPtr callback function that was passed to
+ * DispatchJobForTocEntry(). The callback function does state updating
+ * for the leader control logic in pg_backup_archiver.c.
+ *
+ * In principle additional archive-format-specific information might be needed
+ * in commands or worker status responses, but so far that hasn't proved
+ * necessary, since workers have full copies of the ArchiveHandle/TocEntry
+ * data structures. Remember that we have forked off the workers only after
+ * we have read in the catalog. That's why our worker processes can also
+ * access the catalog information. (In the Windows case, the workers are
+ * threads in the same process. To avoid problems, they work with cloned
+ * copies of the Archive data structure; see RunWorker().)
+ *
+ * In the leader process, the workerStatus field for each worker has one of
+ * the following values:
+ * WRKR_NOT_STARTED: we've not yet forked this worker
+ * WRKR_IDLE: it's waiting for a command
+ * WRKR_WORKING: it's working on a command
+ * WRKR_TERMINATED: process ended
+ * The pstate->te[] entry for each worker is valid when it's in WRKR_WORKING
+ * state, and must be NULL in other states.
+ */
+
+#include "postgres_fe.h"
+
+#ifndef WIN32
+#include <sys/wait.h>
+#include <signal.h>
+#include <unistd.h>
+#include <fcntl.h>
+#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+#include "fe_utils/string_utils.h"
+#include "parallel.h"
+#include "pg_backup_utils.h"
+#include "port/pg_bswap.h"
+
+/* Mnemonic macros for indexing the fd array returned by pipe(2) */
+#define PIPE_READ 0
+#define PIPE_WRITE 1
+
+#define NO_SLOT (-1) /* Failure result for GetIdleWorker() */
+
+/* Worker process statuses */
+typedef enum
+{
+ WRKR_NOT_STARTED = 0,
+ WRKR_IDLE,
+ WRKR_WORKING,
+ WRKR_TERMINATED
+} T_WorkerStatus;
+
+#define WORKER_IS_RUNNING(workerStatus) \
+ ((workerStatus) == WRKR_IDLE || (workerStatus) == WRKR_WORKING)
+
+/*
+ * Private per-parallel-worker state (typedef for this is in parallel.h).
+ *
+ * Much of this is valid only in the leader process (or, on Windows, should
+ * be touched only by the leader thread). But the AH field should be touched
+ * only by workers. The pipe descriptors are valid everywhere.
+ */
+struct ParallelSlot
+{
+ T_WorkerStatus workerStatus; /* see enum above */
+
+ /* These fields are valid if workerStatus == WRKR_WORKING: */
+ ParallelCompletionPtr callback; /* function to call on completion */
+ void *callback_data; /* passthrough data for it */
+
+ ArchiveHandle *AH; /* Archive data worker is using */
+
+ int pipeRead; /* leader's end of the pipes */
+ int pipeWrite;
+ int pipeRevRead; /* child's end of the pipes */
+ int pipeRevWrite;
+
+ /* Child process/thread identity info: */
+#ifdef WIN32
+ uintptr_t hThread;
+ unsigned int threadId;
+#else
+ pid_t pid;
+#endif
+};
+
+#ifdef WIN32
+
+/*
+ * Structure to hold info passed by _beginthreadex() to the function it calls
+ * via its single allowed argument.
+ */
+typedef struct
+{
+ ArchiveHandle *AH; /* leader database connection */
+ ParallelSlot *slot; /* this worker's parallel slot */
+} WorkerInfo;
+
+/* Windows implementation of pipe access */
+static int pgpipe(int handles[2]);
+#define piperead(a,b,c) recv(a,b,c,0)
+#define pipewrite(a,b,c) send(a,b,c,0)
+
+#else /* !WIN32 */
+
+/* Non-Windows implementation of pipe access */
+#define pgpipe(a) pipe(a)
+#define piperead(a,b,c) read(a,b,c)
+#define pipewrite(a,b,c) write(a,b,c)
+
+#endif /* WIN32 */
+
+/*
+ * State info for archive_close_connection() shutdown callback.
+ */
+typedef struct ShutdownInformation
+{
+ ParallelState *pstate;
+ Archive *AHX;
+} ShutdownInformation;
+
+static ShutdownInformation shutdown_info;
+
+/*
+ * State info for signal handling.
+ * We assume signal_info initializes to zeroes.
+ *
+ * On Unix, myAH is the leader DB connection in the leader process, and the
+ * worker's own connection in worker processes. On Windows, we have only one
+ * instance of signal_info, so myAH is the leader connection and the worker
+ * connections must be dug out of pstate->parallelSlot[].
+ */
+typedef struct DumpSignalInformation
+{
+ ArchiveHandle *myAH; /* database connection to issue cancel for */
+ ParallelState *pstate; /* parallel state, if any */
+ bool handler_set; /* signal handler set up in this process? */
+#ifndef WIN32
+ bool am_worker; /* am I a worker process? */
+#endif
+} DumpSignalInformation;
+
+static volatile DumpSignalInformation signal_info;
+
+#ifdef WIN32
+static CRITICAL_SECTION signal_info_lock;
+#endif
+
+/*
+ * Write a simple string to stderr --- must be safe in a signal handler.
+ * We ignore the write() result since there's not much we could do about it.
+ * Certain compilers make that harder than it ought to be.
+ */
+#define write_stderr(str) \
+ do { \
+ const char *str_ = (str); \
+ int rc_; \
+ rc_ = write(fileno(stderr), str_, strlen(str_)); \
+ (void) rc_; \
+ } while (0)
+
+
+#ifdef WIN32
+/* file-scope variables */
+static DWORD tls_index;
+
+/* globally visible variables (needed by exit_nicely) */
+bool parallel_init_done = false;
+DWORD mainThreadId;
+#endif /* WIN32 */
+
+/* Local function prototypes */
+static ParallelSlot *GetMyPSlot(ParallelState *pstate);
+static void archive_close_connection(int code, void *arg);
+static void ShutdownWorkersHard(ParallelState *pstate);
+static void WaitForTerminatingWorkers(ParallelState *pstate);
+static void setup_cancel_handler(void);
+static void set_cancel_pstate(ParallelState *pstate);
+static void set_cancel_slot_archive(ParallelSlot *slot, ArchiveHandle *AH);
+static void RunWorker(ArchiveHandle *AH, ParallelSlot *slot);
+static int GetIdleWorker(ParallelState *pstate);
+static bool HasEveryWorkerTerminated(ParallelState *pstate);
+static void lockTableForWorker(ArchiveHandle *AH, TocEntry *te);
+static void WaitForCommands(ArchiveHandle *AH, int pipefd[2]);
+static bool ListenToWorkers(ArchiveHandle *AH, ParallelState *pstate,
+ bool do_wait);
+static char *getMessageFromLeader(int pipefd[2]);
+static void sendMessageToLeader(int pipefd[2], const char *str);
+static int select_loop(int maxFd, fd_set *workerset);
+static char *getMessageFromWorker(ParallelState *pstate,
+ bool do_wait, int *worker);
+static void sendMessageToWorker(ParallelState *pstate,
+ int worker, const char *str);
+static char *readMessageFromPipe(int fd);
+
+#define messageStartsWith(msg, prefix) \
+ (strncmp(msg, prefix, strlen(prefix)) == 0)
+
+
+/*
+ * Initialize parallel dump support --- should be called early in process
+ * startup. (Currently, this is called whether or not we intend parallel
+ * activity.)
+ */
+void
+init_parallel_dump_utils(void)
+{
+#ifdef WIN32
+ if (!parallel_init_done)
+ {
+ WSADATA wsaData;
+ int err;
+
+ /* Prepare for threaded operation */
+ tls_index = TlsAlloc();
+ mainThreadId = GetCurrentThreadId();
+
+ /* Initialize socket access */
+ err = WSAStartup(MAKEWORD(2, 2), &wsaData);
+ if (err != 0)
+ pg_fatal("%s() failed: error code %d", "WSAStartup", err);
+
+ parallel_init_done = true;
+ }
+#endif
+}
+
+/*
+ * Find the ParallelSlot for the current worker process or thread.
+ *
+ * Returns NULL if no matching slot is found (this implies we're the leader).
+ */
+static ParallelSlot *
+GetMyPSlot(ParallelState *pstate)
+{
+ int i;
+
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+#ifdef WIN32
+ if (pstate->parallelSlot[i].threadId == GetCurrentThreadId())
+#else
+ if (pstate->parallelSlot[i].pid == getpid())
+#endif
+ return &(pstate->parallelSlot[i]);
+ }
+
+ return NULL;
+}
+
+/*
+ * A thread-local version of getLocalPQExpBuffer().
+ *
+ * Non-reentrant but reduces memory leakage: we'll consume one buffer per
+ * thread, which is much better than one per fmtId/fmtQualifiedId call.
+ */
+#ifdef WIN32
+static PQExpBuffer
+getThreadLocalPQExpBuffer(void)
+{
+ /*
+ * The Tls code goes awry if we use a static var, so we provide for both
+ * static and auto, and omit any use of the static var when using Tls. We
+ * rely on TlsGetValue() to return 0 if the value is not yet set.
+ */
+ static PQExpBuffer s_id_return = NULL;
+ PQExpBuffer id_return;
+
+ if (parallel_init_done)
+ id_return = (PQExpBuffer) TlsGetValue(tls_index);
+ else
+ id_return = s_id_return;
+
+ if (id_return) /* first time through? */
+ {
+ /* same buffer, just wipe contents */
+ resetPQExpBuffer(id_return);
+ }
+ else
+ {
+ /* new buffer */
+ id_return = createPQExpBuffer();
+ if (parallel_init_done)
+ TlsSetValue(tls_index, id_return);
+ else
+ s_id_return = id_return;
+ }
+
+ return id_return;
+}
+#endif /* WIN32 */
+
+/*
+ * pg_dump and pg_restore call this to register the cleanup handler
+ * as soon as they've created the ArchiveHandle.
+ */
+void
+on_exit_close_archive(Archive *AHX)
+{
+ shutdown_info.AHX = AHX;
+ on_exit_nicely(archive_close_connection, &shutdown_info);
+}
+
+/*
+ * on_exit_nicely handler for shutting down database connections and
+ * worker processes cleanly.
+ */
+static void
+archive_close_connection(int code, void *arg)
+{
+ ShutdownInformation *si = (ShutdownInformation *) arg;
+
+ if (si->pstate)
+ {
+ /* In parallel mode, must figure out who we are */
+ ParallelSlot *slot = GetMyPSlot(si->pstate);
+
+ if (!slot)
+ {
+ /*
+ * We're the leader. Forcibly shut down workers, then close our
+ * own database connection, if any.
+ */
+ ShutdownWorkersHard(si->pstate);
+
+ if (si->AHX)
+ DisconnectDatabase(si->AHX);
+ }
+ else
+ {
+ /*
+ * We're a worker. Shut down our own DB connection if any. On
+ * Windows, we also have to close our communication sockets, to
+ * emulate what will happen on Unix when the worker process exits.
+ * (Without this, if this is a premature exit, the leader would
+ * fail to detect it because there would be no EOF condition on
+ * the other end of the pipe.)
+ */
+ if (slot->AH)
+ DisconnectDatabase(&(slot->AH->public));
+
+#ifdef WIN32
+ closesocket(slot->pipeRevRead);
+ closesocket(slot->pipeRevWrite);
+#endif
+ }
+ }
+ else
+ {
+ /* Non-parallel operation: just kill the leader DB connection */
+ if (si->AHX)
+ DisconnectDatabase(si->AHX);
+ }
+}
+
+/*
+ * Forcibly shut down any remaining workers, waiting for them to finish.
+ *
+ * Note that we don't expect to come here during normal exit (the workers
+ * should be long gone, and the ParallelState too). We're only here in a
+ * pg_fatal() situation, so intervening to cancel active commands is
+ * appropriate.
+ */
+static void
+ShutdownWorkersHard(ParallelState *pstate)
+{
+ int i;
+
+ /*
+ * Close our write end of the sockets so that any workers waiting for
+ * commands know they can exit. (Note: some of the pipeWrite fields might
+ * still be zero, if we failed to initialize all the workers. Hence, just
+ * ignore errors here.)
+ */
+ for (i = 0; i < pstate->numWorkers; i++)
+ closesocket(pstate->parallelSlot[i].pipeWrite);
+
+ /*
+ * Force early termination of any commands currently in progress.
+ */
+#ifndef WIN32
+ /* On non-Windows, send SIGTERM to each worker process. */
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+ pid_t pid = pstate->parallelSlot[i].pid;
+
+ if (pid != 0)
+ kill(pid, SIGTERM);
+ }
+#else
+
+ /*
+ * On Windows, send query cancels directly to the workers' backends. Use
+ * a critical section to ensure worker threads don't change state.
+ */
+ EnterCriticalSection(&signal_info_lock);
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+ ArchiveHandle *AH = pstate->parallelSlot[i].AH;
+ char errbuf[1];
+
+ if (AH != NULL && AH->connCancel != NULL)
+ (void) PQcancel(AH->connCancel, errbuf, sizeof(errbuf));
+ }
+ LeaveCriticalSection(&signal_info_lock);
+#endif
+
+ /* Now wait for them to terminate. */
+ WaitForTerminatingWorkers(pstate);
+}
+
+/*
+ * Wait for all workers to terminate.
+ */
+static void
+WaitForTerminatingWorkers(ParallelState *pstate)
+{
+ while (!HasEveryWorkerTerminated(pstate))
+ {
+ ParallelSlot *slot = NULL;
+ int j;
+
+#ifndef WIN32
+ /* On non-Windows, use wait() to wait for next worker to end */
+ int status;
+ pid_t pid = wait(&status);
+
+ /* Find dead worker's slot, and clear the PID field */
+ for (j = 0; j < pstate->numWorkers; j++)
+ {
+ slot = &(pstate->parallelSlot[j]);
+ if (slot->pid == pid)
+ {
+ slot->pid = 0;
+ break;
+ }
+ }
+#else /* WIN32 */
+ /* On Windows, we must use WaitForMultipleObjects() */
+ HANDLE *lpHandles = pg_malloc(sizeof(HANDLE) * pstate->numWorkers);
+ int nrun = 0;
+ DWORD ret;
+ uintptr_t hThread;
+
+ for (j = 0; j < pstate->numWorkers; j++)
+ {
+ if (WORKER_IS_RUNNING(pstate->parallelSlot[j].workerStatus))
+ {
+ lpHandles[nrun] = (HANDLE) pstate->parallelSlot[j].hThread;
+ nrun++;
+ }
+ }
+ ret = WaitForMultipleObjects(nrun, lpHandles, false, INFINITE);
+ Assert(ret != WAIT_FAILED);
+ hThread = (uintptr_t) lpHandles[ret - WAIT_OBJECT_0];
+ free(lpHandles);
+
+ /* Find dead worker's slot, and clear the hThread field */
+ for (j = 0; j < pstate->numWorkers; j++)
+ {
+ slot = &(pstate->parallelSlot[j]);
+ if (slot->hThread == hThread)
+ {
+ /* For cleanliness, close handles for dead threads */
+ CloseHandle((HANDLE) slot->hThread);
+ slot->hThread = (uintptr_t) INVALID_HANDLE_VALUE;
+ break;
+ }
+ }
+#endif /* WIN32 */
+
+ /* On all platforms, update workerStatus and te[] as well */
+ Assert(j < pstate->numWorkers);
+ slot->workerStatus = WRKR_TERMINATED;
+ pstate->te[j] = NULL;
+ }
+}
+
+
+/*
+ * Code for responding to cancel interrupts (SIGINT, control-C, etc)
+ *
+ * This doesn't quite belong in this module, but it needs access to the
+ * ParallelState data, so there's not really a better place either.
+ *
+ * When we get a cancel interrupt, we could just die, but in pg_restore that
+ * could leave a SQL command (e.g., CREATE INDEX on a large table) running
+ * for a long time. Instead, we try to send a cancel request and then die.
+ * pg_dump probably doesn't really need this, but we might as well use it
+ * there too. Note that sending the cancel directly from the signal handler
+ * is safe because PQcancel() is written to make it so.
+ *
+ * In parallel operation on Unix, each process is responsible for canceling
+ * its own connection (this must be so because nobody else has access to it).
+ * Furthermore, the leader process should attempt to forward its signal to
+ * each child. In simple manual use of pg_dump/pg_restore, forwarding isn't
+ * needed because typing control-C at the console would deliver SIGINT to
+ * every member of the terminal process group --- but in other scenarios it
+ * might be that only the leader gets signaled.
+ *
+ * On Windows, the cancel handler runs in a separate thread, because that's
+ * how SetConsoleCtrlHandler works. We make it stop worker threads, send
+ * cancels on all active connections, and then return FALSE, which will allow
+ * the process to die. For safety's sake, we use a critical section to
+ * protect the PGcancel structures against being changed while the signal
+ * thread runs.
+ */
+
+#ifndef WIN32
+
+/*
+ * Signal handler (Unix only)
+ */
+static void
+sigTermHandler(SIGNAL_ARGS)
+{
+ int i;
+ char errbuf[1];
+
+ /*
+ * Some platforms allow delivery of new signals to interrupt an active
+ * signal handler. That could muck up our attempt to send PQcancel, so
+ * disable the signals that setup_cancel_handler enabled.
+ */
+ pqsignal(SIGINT, SIG_IGN);
+ pqsignal(SIGTERM, SIG_IGN);
+ pqsignal(SIGQUIT, SIG_IGN);
+
+ /*
+ * If we're in the leader, forward signal to all workers. (It seems best
+ * to do this before PQcancel; killing the leader transaction will result
+ * in invalid-snapshot errors from active workers, which maybe we can
+ * quiet by killing workers first.) Ignore any errors.
+ */
+ if (signal_info.pstate != NULL)
+ {
+ for (i = 0; i < signal_info.pstate->numWorkers; i++)
+ {
+ pid_t pid = signal_info.pstate->parallelSlot[i].pid;
+
+ if (pid != 0)
+ kill(pid, SIGTERM);
+ }
+ }
+
+ /*
+ * Send QueryCancel if we have a connection to send to. Ignore errors,
+ * there's not much we can do about them anyway.
+ */
+ if (signal_info.myAH != NULL && signal_info.myAH->connCancel != NULL)
+ (void) PQcancel(signal_info.myAH->connCancel, errbuf, sizeof(errbuf));
+
+ /*
+ * Report we're quitting, using nothing more complicated than write(2).
+ * When in parallel operation, only the leader process should do this.
+ */
+ if (!signal_info.am_worker)
+ {
+ if (progname)
+ {
+ write_stderr(progname);
+ write_stderr(": ");
+ }
+ write_stderr("terminated by user\n");
+ }
+
+ /*
+ * And die, using _exit() not exit() because the latter will invoke atexit
+ * handlers that can fail if we interrupted related code.
+ */
+ _exit(1);
+}
+
+/*
+ * Enable cancel interrupt handler, if not already done.
+ */
+static void
+setup_cancel_handler(void)
+{
+ /*
+ * When forking, signal_info.handler_set will propagate into the new
+ * process, but that's fine because the signal handler state does too.
+ */
+ if (!signal_info.handler_set)
+ {
+ signal_info.handler_set = true;
+
+ pqsignal(SIGINT, sigTermHandler);
+ pqsignal(SIGTERM, sigTermHandler);
+ pqsignal(SIGQUIT, sigTermHandler);
+ }
+}
+
+#else /* WIN32 */
+
+/*
+ * Console interrupt handler --- runs in a newly-started thread.
+ *
+ * After stopping other threads and sending cancel requests on all open
+ * connections, we return FALSE which will allow the default ExitProcess()
+ * action to be taken.
+ */
+static BOOL WINAPI
+consoleHandler(DWORD dwCtrlType)
+{
+ int i;
+ char errbuf[1];
+
+ if (dwCtrlType == CTRL_C_EVENT ||
+ dwCtrlType == CTRL_BREAK_EVENT)
+ {
+ /* Critical section prevents changing data we look at here */
+ EnterCriticalSection(&signal_info_lock);
+
+ /*
+ * If in parallel mode, stop worker threads and send QueryCancel to
+ * their connected backends. The main point of stopping the worker
+ * threads is to keep them from reporting the query cancels as errors,
+ * which would clutter the user's screen. We needn't stop the leader
+ * thread since it won't be doing much anyway. Do this before
+ * canceling the main transaction, else we might get invalid-snapshot
+ * errors reported before we can stop the workers. Ignore errors,
+ * there's not much we can do about them anyway.
+ */
+ if (signal_info.pstate != NULL)
+ {
+ for (i = 0; i < signal_info.pstate->numWorkers; i++)
+ {
+ ParallelSlot *slot = &(signal_info.pstate->parallelSlot[i]);
+ ArchiveHandle *AH = slot->AH;
+ HANDLE hThread = (HANDLE) slot->hThread;
+
+ /*
+ * Using TerminateThread here may leave some resources leaked,
+ * but it doesn't matter since we're about to end the whole
+ * process.
+ */
+ if (hThread != INVALID_HANDLE_VALUE)
+ TerminateThread(hThread, 0);
+
+ if (AH != NULL && AH->connCancel != NULL)
+ (void) PQcancel(AH->connCancel, errbuf, sizeof(errbuf));
+ }
+ }
+
+ /*
+ * Send QueryCancel to leader connection, if enabled. Ignore errors,
+ * there's not much we can do about them anyway.
+ */
+ if (signal_info.myAH != NULL && signal_info.myAH->connCancel != NULL)
+ (void) PQcancel(signal_info.myAH->connCancel,
+ errbuf, sizeof(errbuf));
+
+ LeaveCriticalSection(&signal_info_lock);
+
+ /*
+ * Report we're quitting, using nothing more complicated than
+ * write(2). (We might be able to get away with using pg_log_*()
+ * here, but since we terminated other threads uncleanly above, it
+ * seems better to assume as little as possible.)
+ */
+ if (progname)
+ {
+ write_stderr(progname);
+ write_stderr(": ");
+ }
+ write_stderr("terminated by user\n");
+ }
+
+ /* Always return FALSE to allow signal handling to continue */
+ return FALSE;
+}
+
+/*
+ * Enable cancel interrupt handler, if not already done.
+ */
+static void
+setup_cancel_handler(void)
+{
+ if (!signal_info.handler_set)
+ {
+ signal_info.handler_set = true;
+
+ InitializeCriticalSection(&signal_info_lock);
+
+ SetConsoleCtrlHandler(consoleHandler, TRUE);
+ }
+}
+
+#endif /* WIN32 */
+
+
+/*
+ * set_archive_cancel_info
+ *
+ * Fill AH->connCancel with cancellation info for the specified database
+ * connection; or clear it if conn is NULL.
+ */
+void
+set_archive_cancel_info(ArchiveHandle *AH, PGconn *conn)
+{
+ PGcancel *oldConnCancel;
+
+ /*
+ * Activate the interrupt handler if we didn't yet in this process. On
+ * Windows, this also initializes signal_info_lock; therefore it's
+ * important that this happen at least once before we fork off any
+ * threads.
+ */
+ setup_cancel_handler();
+
+ /*
+ * On Unix, we assume that storing a pointer value is atomic with respect
+ * to any possible signal interrupt. On Windows, use a critical section.
+ */
+
+#ifdef WIN32
+ EnterCriticalSection(&signal_info_lock);
+#endif
+
+ /* Free the old one if we have one */
+ oldConnCancel = AH->connCancel;
+ /* be sure interrupt handler doesn't use pointer while freeing */
+ AH->connCancel = NULL;
+
+ if (oldConnCancel != NULL)
+ PQfreeCancel(oldConnCancel);
+
+ /* Set the new one if specified */
+ if (conn)
+ AH->connCancel = PQgetCancel(conn);
+
+ /*
+ * On Unix, there's only ever one active ArchiveHandle per process, so we
+ * can just set signal_info.myAH unconditionally. On Windows, do that
+ * only in the main thread; worker threads have to make sure their
+ * ArchiveHandle appears in the pstate data, which is dealt with in
+ * RunWorker().
+ */
+#ifndef WIN32
+ signal_info.myAH = AH;
+#else
+ if (mainThreadId == GetCurrentThreadId())
+ signal_info.myAH = AH;
+#endif
+
+#ifdef WIN32
+ LeaveCriticalSection(&signal_info_lock);
+#endif
+}
+
+/*
+ * set_cancel_pstate
+ *
+ * Set signal_info.pstate to point to the specified ParallelState, if any.
+ * We need this mainly to have an interlock against Windows signal thread.
+ */
+static void
+set_cancel_pstate(ParallelState *pstate)
+{
+#ifdef WIN32
+ EnterCriticalSection(&signal_info_lock);
+#endif
+
+ signal_info.pstate = pstate;
+
+#ifdef WIN32
+ LeaveCriticalSection(&signal_info_lock);
+#endif
+}
+
+/*
+ * set_cancel_slot_archive
+ *
+ * Set ParallelSlot's AH field to point to the specified archive, if any.
+ * We need this mainly to have an interlock against Windows signal thread.
+ */
+static void
+set_cancel_slot_archive(ParallelSlot *slot, ArchiveHandle *AH)
+{
+#ifdef WIN32
+ EnterCriticalSection(&signal_info_lock);
+#endif
+
+ slot->AH = AH;
+
+#ifdef WIN32
+ LeaveCriticalSection(&signal_info_lock);
+#endif
+}
+
+
+/*
+ * This function is called by both Unix and Windows variants to set up
+ * and run a worker process. Caller should exit the process (or thread)
+ * upon return.
+ */
+static void
+RunWorker(ArchiveHandle *AH, ParallelSlot *slot)
+{
+ int pipefd[2];
+
+ /* fetch child ends of pipes */
+ pipefd[PIPE_READ] = slot->pipeRevRead;
+ pipefd[PIPE_WRITE] = slot->pipeRevWrite;
+
+ /*
+ * Clone the archive so that we have our own state to work with, and in
+ * particular our own database connection.
+ *
+ * We clone on Unix as well as Windows, even though technically we don't
+ * need to because fork() gives us a copy in our own address space
+ * already. But CloneArchive resets the state information and also clones
+ * the database connection which both seem kinda helpful.
+ */
+ AH = CloneArchive(AH);
+
+ /* Remember cloned archive where signal handler can find it */
+ set_cancel_slot_archive(slot, AH);
+
+ /*
+ * Call the setup worker function that's defined in the ArchiveHandle.
+ */
+ (AH->SetupWorkerPtr) ((Archive *) AH);
+
+ /*
+ * Execute commands until done.
+ */
+ WaitForCommands(AH, pipefd);
+
+ /*
+ * Disconnect from database and clean up.
+ */
+ set_cancel_slot_archive(slot, NULL);
+ DisconnectDatabase(&(AH->public));
+ DeCloneArchive(AH);
+}
+
+/*
+ * Thread base function for Windows
+ */
+#ifdef WIN32
+static unsigned __stdcall
+init_spawned_worker_win32(WorkerInfo *wi)
+{
+ ArchiveHandle *AH = wi->AH;
+ ParallelSlot *slot = wi->slot;
+
+ /* Don't need WorkerInfo anymore */
+ free(wi);
+
+ /* Run the worker ... */
+ RunWorker(AH, slot);
+
+ /* Exit the thread */
+ _endthreadex(0);
+ return 0;
+}
+#endif /* WIN32 */
+
+/*
+ * This function starts a parallel dump or restore by spawning off the worker
+ * processes. For Windows, it creates a number of threads; on Unix the
+ * workers are created with fork().
+ */
+ParallelState *
+ParallelBackupStart(ArchiveHandle *AH)
+{
+ ParallelState *pstate;
+ int i;
+
+ Assert(AH->public.numWorkers > 0);
+
+ pstate = (ParallelState *) pg_malloc(sizeof(ParallelState));
+
+ pstate->numWorkers = AH->public.numWorkers;
+ pstate->te = NULL;
+ pstate->parallelSlot = NULL;
+
+ if (AH->public.numWorkers == 1)
+ return pstate;
+
+ /* Create status arrays, being sure to initialize all fields to 0 */
+ pstate->te = (TocEntry **)
+ pg_malloc0(pstate->numWorkers * sizeof(TocEntry *));
+ pstate->parallelSlot = (ParallelSlot *)
+ pg_malloc0(pstate->numWorkers * sizeof(ParallelSlot));
+
+#ifdef WIN32
+ /* Make fmtId() and fmtQualifiedId() use thread-local storage */
+ getLocalPQExpBuffer = getThreadLocalPQExpBuffer;
+#endif
+
+ /*
+ * Set the pstate in shutdown_info, to tell the exit handler that it must
+ * clean up workers as well as the main database connection. But we don't
+ * set this in signal_info yet, because we don't want child processes to
+ * inherit non-NULL signal_info.pstate.
+ */
+ shutdown_info.pstate = pstate;
+
+ /*
+ * Temporarily disable query cancellation on the leader connection. This
+ * ensures that child processes won't inherit valid AH->connCancel
+ * settings and thus won't try to issue cancels against the leader's
+ * connection. No harm is done if we fail while it's disabled, because
+ * the leader connection is idle at this point anyway.
+ */
+ set_archive_cancel_info(AH, NULL);
+
+ /* Ensure stdio state is quiesced before forking */
+ fflush(NULL);
+
+ /* Create desired number of workers */
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+#ifdef WIN32
+ WorkerInfo *wi;
+ uintptr_t handle;
+#else
+ pid_t pid;
+#endif
+ ParallelSlot *slot = &(pstate->parallelSlot[i]);
+ int pipeMW[2],
+ pipeWM[2];
+
+ /* Create communication pipes for this worker */
+ if (pgpipe(pipeMW) < 0 || pgpipe(pipeWM) < 0)
+ pg_fatal("could not create communication channels: %m");
+
+ /* leader's ends of the pipes */
+ slot->pipeRead = pipeWM[PIPE_READ];
+ slot->pipeWrite = pipeMW[PIPE_WRITE];
+ /* child's ends of the pipes */
+ slot->pipeRevRead = pipeMW[PIPE_READ];
+ slot->pipeRevWrite = pipeWM[PIPE_WRITE];
+
+#ifdef WIN32
+ /* Create transient structure to pass args to worker function */
+ wi = (WorkerInfo *) pg_malloc(sizeof(WorkerInfo));
+
+ wi->AH = AH;
+ wi->slot = slot;
+
+ handle = _beginthreadex(NULL, 0, (void *) &init_spawned_worker_win32,
+ wi, 0, &(slot->threadId));
+ slot->hThread = handle;
+ slot->workerStatus = WRKR_IDLE;
+#else /* !WIN32 */
+ pid = fork();
+ if (pid == 0)
+ {
+ /* we are the worker */
+ int j;
+
+ /* this is needed for GetMyPSlot() */
+ slot->pid = getpid();
+
+ /* instruct signal handler that we're in a worker now */
+ signal_info.am_worker = true;
+
+ /* close read end of Worker -> Leader */
+ closesocket(pipeWM[PIPE_READ]);
+ /* close write end of Leader -> Worker */
+ closesocket(pipeMW[PIPE_WRITE]);
+
+ /*
+ * Close all inherited fds for communication of the leader with
+ * previously-forked workers.
+ */
+ for (j = 0; j < i; j++)
+ {
+ closesocket(pstate->parallelSlot[j].pipeRead);
+ closesocket(pstate->parallelSlot[j].pipeWrite);
+ }
+
+ /* Run the worker ... */
+ RunWorker(AH, slot);
+
+ /* We can just exit(0) when done */
+ exit(0);
+ }
+ else if (pid < 0)
+ {
+ /* fork failed */
+ pg_fatal("could not create worker process: %m");
+ }
+
+ /* In Leader after successful fork */
+ slot->pid = pid;
+ slot->workerStatus = WRKR_IDLE;
+
+ /* close read end of Leader -> Worker */
+ closesocket(pipeMW[PIPE_READ]);
+ /* close write end of Worker -> Leader */
+ closesocket(pipeWM[PIPE_WRITE]);
+#endif /* WIN32 */
+ }
+
+ /*
+ * Having forked off the workers, disable SIGPIPE so that leader isn't
+ * killed if it tries to send a command to a dead worker. We don't want
+ * the workers to inherit this setting, though.
+ */
+#ifndef WIN32
+ pqsignal(SIGPIPE, SIG_IGN);
+#endif
+
+ /*
+ * Re-establish query cancellation on the leader connection.
+ */
+ set_archive_cancel_info(AH, AH->connection);
+
+ /*
+ * Tell the cancel signal handler to forward signals to worker processes,
+ * too. (As with query cancel, we did not need this earlier because the
+ * workers have not yet been given anything to do; if we die before this
+ * point, any already-started workers will see EOF and quit promptly.)
+ */
+ set_cancel_pstate(pstate);
+
+ return pstate;
+}
+
+/*
+ * Close down a parallel dump or restore.
+ */
+void
+ParallelBackupEnd(ArchiveHandle *AH, ParallelState *pstate)
+{
+ int i;
+
+ /* No work if non-parallel */
+ if (pstate->numWorkers == 1)
+ return;
+
+ /* There should not be any unfinished jobs */
+ Assert(IsEveryWorkerIdle(pstate));
+
+ /* Close the sockets so that the workers know they can exit */
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+ closesocket(pstate->parallelSlot[i].pipeRead);
+ closesocket(pstate->parallelSlot[i].pipeWrite);
+ }
+
+ /* Wait for them to exit */
+ WaitForTerminatingWorkers(pstate);
+
+ /*
+ * Unlink pstate from shutdown_info, so the exit handler will not try to
+ * use it; and likewise unlink from signal_info.
+ */
+ shutdown_info.pstate = NULL;
+ set_cancel_pstate(NULL);
+
+ /* Release state (mere neatnik-ism, since we're about to terminate) */
+ free(pstate->te);
+ free(pstate->parallelSlot);
+ free(pstate);
+}
+
+/*
+ * These next four functions handle construction and parsing of the command
+ * strings and response strings for parallel workers.
+ *
+ * Currently, these can be the same regardless of which archive format we are
+ * processing. In future, we might want to let format modules override these
+ * functions to add format-specific data to a command or response.
+ */
+
+/*
+ * buildWorkerCommand: format a command string to send to a worker.
+ *
+ * The string is built in the caller-supplied buffer of size buflen.
+ */
+static void
+buildWorkerCommand(ArchiveHandle *AH, TocEntry *te, T_Action act,
+ char *buf, int buflen)
+{
+ if (act == ACT_DUMP)
+ snprintf(buf, buflen, "DUMP %d", te->dumpId);
+ else if (act == ACT_RESTORE)
+ snprintf(buf, buflen, "RESTORE %d", te->dumpId);
+ else
+ Assert(false);
+}
+
+/*
+ * parseWorkerCommand: interpret a command string in a worker.
+ */
+static void
+parseWorkerCommand(ArchiveHandle *AH, TocEntry **te, T_Action *act,
+ const char *msg)
+{
+ DumpId dumpId;
+ int nBytes;
+
+ if (messageStartsWith(msg, "DUMP "))
+ {
+ *act = ACT_DUMP;
+ sscanf(msg, "DUMP %d%n", &dumpId, &nBytes);
+ Assert(nBytes == strlen(msg));
+ *te = getTocEntryByDumpId(AH, dumpId);
+ Assert(*te != NULL);
+ }
+ else if (messageStartsWith(msg, "RESTORE "))
+ {
+ *act = ACT_RESTORE;
+ sscanf(msg, "RESTORE %d%n", &dumpId, &nBytes);
+ Assert(nBytes == strlen(msg));
+ *te = getTocEntryByDumpId(AH, dumpId);
+ Assert(*te != NULL);
+ }
+ else
+ pg_fatal("unrecognized command received from leader: \"%s\"",
+ msg);
+}
+
+/*
+ * buildWorkerResponse: format a response string to send to the leader.
+ *
+ * The string is built in the caller-supplied buffer of size buflen.
+ */
+static void
+buildWorkerResponse(ArchiveHandle *AH, TocEntry *te, T_Action act, int status,
+ char *buf, int buflen)
+{
+ snprintf(buf, buflen, "OK %d %d %d",
+ te->dumpId,
+ status,
+ status == WORKER_IGNORED_ERRORS ? AH->public.n_errors : 0);
+}
+
+/*
+ * parseWorkerResponse: parse the status message returned by a worker.
+ *
+ * Returns the integer status code, and may update fields of AH and/or te.
+ */
+static int
+parseWorkerResponse(ArchiveHandle *AH, TocEntry *te,
+ const char *msg)
+{
+ DumpId dumpId;
+ int nBytes,
+ n_errors;
+ int status = 0;
+
+ if (messageStartsWith(msg, "OK "))
+ {
+ sscanf(msg, "OK %d %d %d%n", &dumpId, &status, &n_errors, &nBytes);
+
+ Assert(dumpId == te->dumpId);
+ Assert(nBytes == strlen(msg));
+
+ AH->public.n_errors += n_errors;
+ }
+ else
+ pg_fatal("invalid message received from worker: \"%s\"",
+ msg);
+
+ return status;
+}
+
+/*
+ * Dispatch a job to some free worker.
+ *
+ * te is the TocEntry to be processed, act is the action to be taken on it.
+ * callback is the function to call on completion of the job.
+ *
+ * If no worker is currently available, this will block, and previously
+ * registered callback functions may be called.
+ */
+void
+DispatchJobForTocEntry(ArchiveHandle *AH,
+ ParallelState *pstate,
+ TocEntry *te,
+ T_Action act,
+ ParallelCompletionPtr callback,
+ void *callback_data)
+{
+ int worker;
+ char buf[256];
+
+ /* Get a worker, waiting if none are idle */
+ while ((worker = GetIdleWorker(pstate)) == NO_SLOT)
+ WaitForWorkers(AH, pstate, WFW_ONE_IDLE);
+
+ /* Construct and send command string */
+ buildWorkerCommand(AH, te, act, buf, sizeof(buf));
+
+ sendMessageToWorker(pstate, worker, buf);
+
+ /* Remember worker is busy, and which TocEntry it's working on */
+ pstate->parallelSlot[worker].workerStatus = WRKR_WORKING;
+ pstate->parallelSlot[worker].callback = callback;
+ pstate->parallelSlot[worker].callback_data = callback_data;
+ pstate->te[worker] = te;
+}
+
+/*
+ * Find an idle worker and return its slot number.
+ * Return NO_SLOT if none are idle.
+ */
+static int
+GetIdleWorker(ParallelState *pstate)
+{
+ int i;
+
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+ if (pstate->parallelSlot[i].workerStatus == WRKR_IDLE)
+ return i;
+ }
+ return NO_SLOT;
+}
+
+/*
+ * Return true iff no worker is running.
+ */
+static bool
+HasEveryWorkerTerminated(ParallelState *pstate)
+{
+ int i;
+
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+ if (WORKER_IS_RUNNING(pstate->parallelSlot[i].workerStatus))
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Return true iff every worker is in the WRKR_IDLE state.
+ */
+bool
+IsEveryWorkerIdle(ParallelState *pstate)
+{
+ int i;
+
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+ if (pstate->parallelSlot[i].workerStatus != WRKR_IDLE)
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Acquire lock on a table to be dumped by a worker process.
+ *
+ * The leader process is already holding an ACCESS SHARE lock. Ordinarily
+ * it's no problem for a worker to get one too, but if anything else besides
+ * pg_dump is running, there's a possible deadlock:
+ *
+ * 1) Leader dumps the schema and locks all tables in ACCESS SHARE mode.
+ * 2) Another process requests an ACCESS EXCLUSIVE lock (which is not granted
+ * because the leader holds a conflicting ACCESS SHARE lock).
+ * 3) A worker process also requests an ACCESS SHARE lock to read the table.
+ * The worker is enqueued behind the ACCESS EXCLUSIVE lock request.
+ * 4) Now we have a deadlock, since the leader is effectively waiting for
+ * the worker. The server cannot detect that, however.
+ *
+ * To prevent an infinite wait, prior to touching a table in a worker, request
+ * a lock in ACCESS SHARE mode but with NOWAIT. If we don't get the lock,
+ * then we know that somebody else has requested an ACCESS EXCLUSIVE lock and
+ * so we have a deadlock. We must fail the backup in that case.
+ */
+static void
+lockTableForWorker(ArchiveHandle *AH, TocEntry *te)
+{
+ const char *qualId;
+ PQExpBuffer query;
+ PGresult *res;
+
+ /* Nothing to do for BLOBS */
+ if (strcmp(te->desc, "BLOBS") == 0)
+ return;
+
+ query = createPQExpBuffer();
+
+ qualId = fmtQualifiedId(te->namespace, te->tag);
+
+ appendPQExpBuffer(query, "LOCK TABLE %s IN ACCESS SHARE MODE NOWAIT",
+ qualId);
+
+ res = PQexec(AH->connection, query->data);
+
+ if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
+ pg_fatal("could not obtain lock on relation \"%s\"\n"
+ "This usually means that someone requested an ACCESS EXCLUSIVE lock "
+ "on the table after the pg_dump parent process had gotten the "
+ "initial ACCESS SHARE lock on the table.", qualId);
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * WaitForCommands: main routine for a worker process.
+ *
+ * Read and execute commands from the leader until we see EOF on the pipe.
+ */
+static void
+WaitForCommands(ArchiveHandle *AH, int pipefd[2])
+{
+ char *command;
+ TocEntry *te;
+ T_Action act;
+ int status = 0;
+ char buf[256];
+
+ for (;;)
+ {
+ if (!(command = getMessageFromLeader(pipefd)))
+ {
+ /* EOF, so done */
+ return;
+ }
+
+ /* Decode the command */
+ parseWorkerCommand(AH, &te, &act, command);
+
+ if (act == ACT_DUMP)
+ {
+ /* Acquire lock on this table within the worker's session */
+ lockTableForWorker(AH, te);
+
+ /* Perform the dump command */
+ status = (AH->WorkerJobDumpPtr) (AH, te);
+ }
+ else if (act == ACT_RESTORE)
+ {
+ /* Perform the restore command */
+ status = (AH->WorkerJobRestorePtr) (AH, te);
+ }
+ else
+ Assert(false);
+
+ /* Return status to leader */
+ buildWorkerResponse(AH, te, act, status, buf, sizeof(buf));
+
+ sendMessageToLeader(pipefd, buf);
+
+ /* command was pg_malloc'd and we are responsible for free()ing it. */
+ free(command);
+ }
+}
+
+/*
+ * Check for status messages from workers.
+ *
+ * If do_wait is true, wait to get a status message; otherwise, just return
+ * immediately if there is none available.
+ *
+ * When we get a status message, we pass the status code to the callback
+ * function that was specified to DispatchJobForTocEntry, then reset the
+ * worker status to IDLE.
+ *
+ * Returns true if we collected a status message, else false.
+ *
+ * XXX is it worth checking for more than one status message per call?
+ * It seems somewhat unlikely that multiple workers would finish at exactly
+ * the same time.
+ */
+static bool
+ListenToWorkers(ArchiveHandle *AH, ParallelState *pstate, bool do_wait)
+{
+ int worker;
+ char *msg;
+
+ /* Try to collect a status message */
+ msg = getMessageFromWorker(pstate, do_wait, &worker);
+
+ if (!msg)
+ {
+ /* If do_wait is true, we must have detected EOF on some socket */
+ if (do_wait)
+ pg_fatal("a worker process died unexpectedly");
+ return false;
+ }
+
+ /* Process it and update our idea of the worker's status */
+ if (messageStartsWith(msg, "OK "))
+ {
+ ParallelSlot *slot = &pstate->parallelSlot[worker];
+ TocEntry *te = pstate->te[worker];
+ int status;
+
+ status = parseWorkerResponse(AH, te, msg);
+ slot->callback(AH, te, status, slot->callback_data);
+ slot->workerStatus = WRKR_IDLE;
+ pstate->te[worker] = NULL;
+ }
+ else
+ pg_fatal("invalid message received from worker: \"%s\"",
+ msg);
+
+ /* Free the string returned from getMessageFromWorker */
+ free(msg);
+
+ return true;
+}
+
+/*
+ * Check for status results from workers, waiting if necessary.
+ *
+ * Available wait modes are:
+ * WFW_NO_WAIT: reap any available status, but don't block
+ * WFW_GOT_STATUS: wait for at least one more worker to finish
+ * WFW_ONE_IDLE: wait for at least one worker to be idle
+ * WFW_ALL_IDLE: wait for all workers to be idle
+ *
+ * Any received results are passed to the callback specified to
+ * DispatchJobForTocEntry.
+ *
+ * This function is executed in the leader process.
+ */
+void
+WaitForWorkers(ArchiveHandle *AH, ParallelState *pstate, WFW_WaitOption mode)
+{
+ bool do_wait = false;
+
+ /*
+ * In GOT_STATUS mode, always block waiting for a message, since we can't
+ * return till we get something. In other modes, we don't block the first
+ * time through the loop.
+ */
+ if (mode == WFW_GOT_STATUS)
+ {
+ /* Assert that caller knows what it's doing */
+ Assert(!IsEveryWorkerIdle(pstate));
+ do_wait = true;
+ }
+
+ for (;;)
+ {
+ /*
+ * Check for status messages, even if we don't need to block. We do
+ * not try very hard to reap all available messages, though, since
+ * there's unlikely to be more than one.
+ */
+ if (ListenToWorkers(AH, pstate, do_wait))
+ {
+ /*
+ * If we got a message, we are done by definition for GOT_STATUS
+ * mode, and we can also be certain that there's at least one idle
+ * worker. So we're done in all but ALL_IDLE mode.
+ */
+ if (mode != WFW_ALL_IDLE)
+ return;
+ }
+
+ /* Check whether we must wait for new status messages */
+ switch (mode)
+ {
+ case WFW_NO_WAIT:
+ return; /* never wait */
+ case WFW_GOT_STATUS:
+ Assert(false); /* can't get here, because we waited */
+ break;
+ case WFW_ONE_IDLE:
+ if (GetIdleWorker(pstate) != NO_SLOT)
+ return;
+ break;
+ case WFW_ALL_IDLE:
+ if (IsEveryWorkerIdle(pstate))
+ return;
+ break;
+ }
+
+ /* Loop back, and this time wait for something to happen */
+ do_wait = true;
+ }
+}
+
+/*
+ * Read one command message from the leader, blocking if necessary
+ * until one is available, and return it as a malloc'd string.
+ * On EOF, return NULL.
+ *
+ * This function is executed in worker processes.
+ */
+static char *
+getMessageFromLeader(int pipefd[2])
+{
+ return readMessageFromPipe(pipefd[PIPE_READ]);
+}
+
+/*
+ * Send a status message to the leader.
+ *
+ * This function is executed in worker processes.
+ */
+static void
+sendMessageToLeader(int pipefd[2], const char *str)
+{
+ int len = strlen(str) + 1;
+
+ if (pipewrite(pipefd[PIPE_WRITE], str, len) != len)
+ pg_fatal("could not write to the communication channel: %m");
+}
+
+/*
+ * Wait until some descriptor in "workerset" becomes readable.
+ * Returns -1 on error, else the number of readable descriptors.
+ */
+static int
+select_loop(int maxFd, fd_set *workerset)
+{
+ int i;
+ fd_set saveSet = *workerset;
+
+ for (;;)
+ {
+ *workerset = saveSet;
+ i = select(maxFd + 1, workerset, NULL, NULL, NULL);
+
+#ifndef WIN32
+ if (i < 0 && errno == EINTR)
+ continue;
+#else
+ if (i == SOCKET_ERROR && WSAGetLastError() == WSAEINTR)
+ continue;
+#endif
+ break;
+ }
+
+ return i;
+}
+
+
+/*
+ * Check for messages from worker processes.
+ *
+ * If a message is available, return it as a malloc'd string, and put the
+ * index of the sending worker in *worker.
+ *
+ * If nothing is available, wait if "do_wait" is true, else return NULL.
+ *
+ * If we detect EOF on any socket, we'll return NULL. It's not great that
+ * that's hard to distinguish from the no-data-available case, but for now
+ * our one caller is okay with that.
+ *
+ * This function is executed in the leader process.
+ */
+static char *
+getMessageFromWorker(ParallelState *pstate, bool do_wait, int *worker)
+{
+ int i;
+ fd_set workerset;
+ int maxFd = -1;
+ struct timeval nowait = {0, 0};
+
+ /* construct bitmap of socket descriptors for select() */
+ FD_ZERO(&workerset);
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+ if (!WORKER_IS_RUNNING(pstate->parallelSlot[i].workerStatus))
+ continue;
+ FD_SET(pstate->parallelSlot[i].pipeRead, &workerset);
+ if (pstate->parallelSlot[i].pipeRead > maxFd)
+ maxFd = pstate->parallelSlot[i].pipeRead;
+ }
+
+ if (do_wait)
+ {
+ i = select_loop(maxFd, &workerset);
+ Assert(i != 0);
+ }
+ else
+ {
+ if ((i = select(maxFd + 1, &workerset, NULL, NULL, &nowait)) == 0)
+ return NULL;
+ }
+
+ if (i < 0)
+ pg_fatal("%s() failed: %m", "select");
+
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+ char *msg;
+
+ if (!WORKER_IS_RUNNING(pstate->parallelSlot[i].workerStatus))
+ continue;
+ if (!FD_ISSET(pstate->parallelSlot[i].pipeRead, &workerset))
+ continue;
+
+ /*
+ * Read the message if any. If the socket is ready because of EOF,
+ * we'll return NULL instead (and the socket will stay ready, so the
+ * condition will persist).
+ *
+ * Note: because this is a blocking read, we'll wait if only part of
+ * the message is available. Waiting a long time would be bad, but
+ * since worker status messages are short and are always sent in one
+ * operation, it shouldn't be a problem in practice.
+ */
+ msg = readMessageFromPipe(pstate->parallelSlot[i].pipeRead);
+ *worker = i;
+ return msg;
+ }
+ Assert(false);
+ return NULL;
+}
+
+/*
+ * Send a command message to the specified worker process.
+ *
+ * This function is executed in the leader process.
+ */
+static void
+sendMessageToWorker(ParallelState *pstate, int worker, const char *str)
+{
+ int len = strlen(str) + 1;
+
+ if (pipewrite(pstate->parallelSlot[worker].pipeWrite, str, len) != len)
+ {
+ pg_fatal("could not write to the communication channel: %m");
+ }
+}
+
+/*
+ * Read one message from the specified pipe (fd), blocking if necessary
+ * until one is available, and return it as a malloc'd string.
+ * On EOF, return NULL.
+ *
+ * A "message" on the channel is just a null-terminated string.
+ */
+static char *
+readMessageFromPipe(int fd)
+{
+ char *msg;
+ int msgsize,
+ bufsize;
+ int ret;
+
+ /*
+ * In theory, if we let piperead() read multiple bytes, it might give us
+ * back fragments of multiple messages. (That can't actually occur, since
+ * neither leader nor workers send more than one message without waiting
+ * for a reply, but we don't wish to assume that here.) For simplicity,
+ * read a byte at a time until we get the terminating '\0'. This method
+ * is a bit inefficient, but since this is only used for relatively short
+ * command and status strings, it shouldn't matter.
+ */
+ bufsize = 64; /* could be any number */
+ msg = (char *) pg_malloc(bufsize);
+ msgsize = 0;
+ for (;;)
+ {
+ Assert(msgsize < bufsize);
+ ret = piperead(fd, msg + msgsize, 1);
+ if (ret <= 0)
+ break; /* error or connection closure */
+
+ Assert(ret == 1);
+
+ if (msg[msgsize] == '\0')
+ return msg; /* collected whole message */
+
+ msgsize++;
+ if (msgsize == bufsize) /* enlarge buffer if needed */
+ {
+ bufsize += 16; /* could be any number */
+ msg = (char *) pg_realloc(msg, bufsize);
+ }
+ }
+
+ /* Other end has closed the connection */
+ pg_free(msg);
+ return NULL;
+}
+
+#ifdef WIN32
+
+/*
+ * This is a replacement version of pipe(2) for Windows which allows the pipe
+ * handles to be used in select().
+ *
+ * Reads and writes on the pipe must go through piperead()/pipewrite().
+ *
+ * For consistency with Unix we declare the returned handles as "int".
+ * This is okay even on WIN64 because system handles are not more than
+ * 32 bits wide, but we do have to do some casting.
+ */
+static int
+pgpipe(int handles[2])
+{
+ pgsocket s,
+ tmp_sock;
+ struct sockaddr_in serv_addr;
+ int len = sizeof(serv_addr);
+
+ /* We have to use the Unix socket invalid file descriptor value here. */
+ handles[0] = handles[1] = -1;
+
+ /*
+ * setup listen socket
+ */
+ if ((s = socket(AF_INET, SOCK_STREAM, 0)) == PGINVALID_SOCKET)
+ {
+ pg_log_error("pgpipe: could not create socket: error code %d",
+ WSAGetLastError());
+ return -1;
+ }
+
+ memset((void *) &serv_addr, 0, sizeof(serv_addr));
+ serv_addr.sin_family = AF_INET;
+ serv_addr.sin_port = pg_hton16(0);
+ serv_addr.sin_addr.s_addr = pg_hton32(INADDR_LOOPBACK);
+ if (bind(s, (SOCKADDR *) &serv_addr, len) == SOCKET_ERROR)
+ {
+ pg_log_error("pgpipe: could not bind: error code %d",
+ WSAGetLastError());
+ closesocket(s);
+ return -1;
+ }
+ if (listen(s, 1) == SOCKET_ERROR)
+ {
+ pg_log_error("pgpipe: could not listen: error code %d",
+ WSAGetLastError());
+ closesocket(s);
+ return -1;
+ }
+ if (getsockname(s, (SOCKADDR *) &serv_addr, &len) == SOCKET_ERROR)
+ {
+ pg_log_error("pgpipe: %s() failed: error code %d", "getsockname",
+ WSAGetLastError());
+ closesocket(s);
+ return -1;
+ }
+
+ /*
+ * setup pipe handles
+ */
+ if ((tmp_sock = socket(AF_INET, SOCK_STREAM, 0)) == PGINVALID_SOCKET)
+ {
+ pg_log_error("pgpipe: could not create second socket: error code %d",
+ WSAGetLastError());
+ closesocket(s);
+ return -1;
+ }
+ handles[1] = (int) tmp_sock;
+
+ if (connect(handles[1], (SOCKADDR *) &serv_addr, len) == SOCKET_ERROR)
+ {
+ pg_log_error("pgpipe: could not connect socket: error code %d",
+ WSAGetLastError());
+ closesocket(handles[1]);
+ handles[1] = -1;
+ closesocket(s);
+ return -1;
+ }
+ if ((tmp_sock = accept(s, (SOCKADDR *) &serv_addr, &len)) == PGINVALID_SOCKET)
+ {
+ pg_log_error("pgpipe: could not accept connection: error code %d",
+ WSAGetLastError());
+ closesocket(handles[1]);
+ handles[1] = -1;
+ closesocket(s);
+ return -1;
+ }
+ handles[0] = (int) tmp_sock;
+
+ closesocket(s);
+ return 0;
+}
+
+#endif /* WIN32 */
diff --git a/src/bin/pg_dump/parallel.h b/src/bin/pg_dump/parallel.h
new file mode 100644
index 0000000..e2f6c79
--- /dev/null
+++ b/src/bin/pg_dump/parallel.h
@@ -0,0 +1,85 @@
+/*-------------------------------------------------------------------------
+ *
+ * parallel.h
+ *
+ * Parallel support for pg_dump and pg_restore
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/parallel.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef PG_DUMP_PARALLEL_H
+#define PG_DUMP_PARALLEL_H
+
+#include <limits.h>
+
+#include "pg_backup_archiver.h"
+
+/* Function to call in leader process on completion of a worker task */
+typedef void (*ParallelCompletionPtr) (ArchiveHandle *AH,
+ TocEntry *te,
+ int status,
+ void *callback_data);
+
+/* Wait options for WaitForWorkers */
+typedef enum
+{
+ WFW_NO_WAIT,
+ WFW_GOT_STATUS,
+ WFW_ONE_IDLE,
+ WFW_ALL_IDLE
+} WFW_WaitOption;
+
+/*
+ * Maximum number of parallel jobs allowed.
+ *
+ * On Windows we can only have at most MAXIMUM_WAIT_OBJECTS (= 64 usually)
+ * parallel jobs because that's the maximum limit for the
+ * WaitForMultipleObjects() call.
+ */
+#ifdef WIN32
+#define PG_MAX_JOBS MAXIMUM_WAIT_OBJECTS
+#else
+#define PG_MAX_JOBS INT_MAX
+#endif
+
+/* ParallelSlot is an opaque struct known only within parallel.c */
+typedef struct ParallelSlot ParallelSlot;
+
+/* Overall state for parallel.c */
+typedef struct ParallelState
+{
+ int numWorkers; /* allowed number of workers */
+ /* these arrays have numWorkers entries, one per worker: */
+ TocEntry **te; /* item being worked on, or NULL */
+ ParallelSlot *parallelSlot; /* private info about each worker */
+} ParallelState;
+
+#ifdef WIN32
+extern bool parallel_init_done;
+extern DWORD mainThreadId;
+#endif
+
+extern void init_parallel_dump_utils(void);
+
+extern bool IsEveryWorkerIdle(ParallelState *pstate);
+extern void WaitForWorkers(ArchiveHandle *AH, ParallelState *pstate,
+ WFW_WaitOption mode);
+
+extern ParallelState *ParallelBackupStart(ArchiveHandle *AH);
+extern void DispatchJobForTocEntry(ArchiveHandle *AH,
+ ParallelState *pstate,
+ TocEntry *te,
+ T_Action act,
+ ParallelCompletionPtr callback,
+ void *callback_data);
+extern void ParallelBackupEnd(ArchiveHandle *AH, ParallelState *pstate);
+
+extern void set_archive_cancel_info(ArchiveHandle *AH, PGconn *conn);
+
+#endif /* PG_DUMP_PARALLEL_H */
diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h
new file mode 100644
index 0000000..fcc5f6b
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup.h
@@ -0,0 +1,328 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup.h
+ *
+ * Public interface to the pg_dump archiver routines.
+ *
+ * See the headers to pg_restore for more details.
+ *
+ * Copyright (c) 2000, Philip Warner
+ * Rights are granted to use this software in any way so long
+ * as this notice is not removed.
+ *
+ * The author is not responsible for loss or damages that may
+ * result from its use.
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef PG_BACKUP_H
+#define PG_BACKUP_H
+
+#include "fe_utils/simple_list.h"
+#include "libpq-fe.h"
+
+
+typedef enum trivalue
+{
+ TRI_DEFAULT,
+ TRI_NO,
+ TRI_YES
+} trivalue;
+
+typedef enum _archiveFormat
+{
+ archUnknown = 0,
+ archCustom = 1,
+ archTar = 3,
+ archNull = 4,
+ archDirectory = 5
+} ArchiveFormat;
+
+typedef enum _archiveMode
+{
+ archModeAppend,
+ archModeWrite,
+ archModeRead
+} ArchiveMode;
+
+typedef enum _teSection
+{
+ SECTION_NONE = 1, /* COMMENTs, ACLs, etc; can be anywhere */
+ SECTION_PRE_DATA, /* stuff to be processed before data */
+ SECTION_DATA, /* TABLE DATA, BLOBS, BLOB COMMENTS */
+ SECTION_POST_DATA /* stuff to be processed after data */
+} teSection;
+
+/* We need one enum entry per prepared query in pg_dump */
+enum _dumpPreparedQueries
+{
+ PREPQUERY_DUMPAGG,
+ PREPQUERY_DUMPBASETYPE,
+ PREPQUERY_DUMPCOMPOSITETYPE,
+ PREPQUERY_DUMPDOMAIN,
+ PREPQUERY_DUMPENUMTYPE,
+ PREPQUERY_DUMPFUNC,
+ PREPQUERY_DUMPOPR,
+ PREPQUERY_DUMPRANGETYPE,
+ PREPQUERY_DUMPTABLEATTACH,
+ PREPQUERY_GETCOLUMNACLS,
+ PREPQUERY_GETDOMAINCONSTRAINTS,
+ NUM_PREP_QUERIES /* must be last */
+};
+
+/* Parameters needed by ConnectDatabase; same for dump and restore */
+typedef struct _connParams
+{
+ /* These fields record the actual command line parameters */
+ char *dbname; /* this may be a connstring! */
+ char *pgport;
+ char *pghost;
+ char *username;
+ trivalue promptPassword;
+ /* If not NULL, this overrides the dbname obtained from command line */
+ /* (but *only* the DB name, not anything else in the connstring) */
+ char *override_dbname;
+} ConnParams;
+
+typedef struct _restoreOptions
+{
+ int createDB; /* Issue commands to create the database */
+ int noOwner; /* Don't try to match original object owner */
+ int noTableAm; /* Don't issue table-AM-related commands */
+ int noTablespace; /* Don't issue tablespace-related commands */
+ int disable_triggers; /* disable triggers during data-only
+ * restore */
+ int use_setsessauth; /* Use SET SESSION AUTHORIZATION commands
+ * instead of OWNER TO */
+ char *superuser; /* Username to use as superuser */
+ char *use_role; /* Issue SET ROLE to this */
+ int dropSchema;
+ int disable_dollar_quoting;
+ int dump_inserts; /* 0 = COPY, otherwise rows per INSERT */
+ int column_inserts;
+ int if_exists;
+ int no_comments; /* Skip comments */
+ int no_publications; /* Skip publication entries */
+ int no_security_labels; /* Skip security label entries */
+ int no_subscriptions; /* Skip subscription entries */
+ int strict_names;
+
+ const char *filename;
+ int dataOnly;
+ int schemaOnly;
+ int dumpSections;
+ int verbose;
+ int aclsSkip;
+ const char *lockWaitTimeout;
+ int include_everything;
+
+ int tocSummary;
+ char *tocFile;
+ int format;
+ char *formatName;
+
+ int selTypes;
+ int selIndex;
+ int selFunction;
+ int selTrigger;
+ int selTable;
+ SimpleStringList indexNames;
+ SimpleStringList functionNames;
+ SimpleStringList schemaNames;
+ SimpleStringList schemaExcludeNames;
+ SimpleStringList triggerNames;
+ SimpleStringList tableNames;
+
+ int useDB;
+ ConnParams cparams; /* parameters to use if useDB */
+
+ int noDataForFailedTables;
+ int exit_on_error;
+ int compression;
+ int suppressDumpWarnings; /* Suppress output of WARNING entries
+ * to stderr */
+ bool single_txn;
+
+ bool *idWanted; /* array showing which dump IDs to emit */
+ int enable_row_security;
+ int sequence_data; /* dump sequence data even in schema-only mode */
+ int binary_upgrade;
+} RestoreOptions;
+
+typedef struct _dumpOptions
+{
+ ConnParams cparams;
+
+ int binary_upgrade;
+
+ /* various user-settable parameters */
+ bool schemaOnly;
+ bool dataOnly;
+ int dumpSections; /* bitmask of chosen sections */
+ bool aclsSkip;
+ const char *lockWaitTimeout;
+ int dump_inserts; /* 0 = COPY, otherwise rows per INSERT */
+
+ /* flags for various command-line long options */
+ int disable_dollar_quoting;
+ int column_inserts;
+ int if_exists;
+ int no_comments;
+ int no_security_labels;
+ int no_publications;
+ int no_subscriptions;
+ int no_toast_compression;
+ int no_unlogged_table_data;
+ int serializable_deferrable;
+ int disable_triggers;
+ int outputNoTableAm;
+ int outputNoTablespaces;
+ int use_setsessauth;
+ int enable_row_security;
+ int load_via_partition_root;
+
+ /* default, if no "inclusion" switches appear, is to dump everything */
+ bool include_everything;
+
+ int outputClean;
+ int outputCreateDB;
+ bool outputBlobs;
+ bool dontOutputBlobs;
+ int outputNoOwner;
+ char *outputSuperuser;
+
+ int sequence_data; /* dump sequence data even in schema-only mode */
+ int do_nothing;
+} DumpOptions;
+
+/*
+ * We may want to have some more user-readable data, but in the mean
+ * time this gives us some abstraction and type checking.
+ */
+typedef struct Archive
+{
+ DumpOptions *dopt; /* options, if dumping */
+ RestoreOptions *ropt; /* options, if restoring */
+
+ int verbose;
+ char *remoteVersionStr; /* server's version string */
+ int remoteVersion; /* same in numeric form */
+ bool isStandby; /* is server a standby node */
+
+ int minRemoteVersion; /* allowable range */
+ int maxRemoteVersion;
+
+ int numWorkers; /* number of parallel processes */
+ char *sync_snapshot_id; /* sync snapshot id for parallel operation */
+
+ /* info needed for string escaping */
+ int encoding; /* libpq code for client_encoding */
+ bool std_strings; /* standard_conforming_strings */
+
+ /* other important stuff */
+ char *searchpath; /* search_path to set during restore */
+ char *use_role; /* Issue SET ROLE to this */
+
+ /* error handling */
+ bool exit_on_error; /* whether to exit on SQL errors... */
+ int n_errors; /* number of errors (if no die) */
+
+ /* prepared-query status */
+ bool *is_prepared; /* indexed by enum _dumpPreparedQueries */
+
+ /* The rest is private */
+} Archive;
+
+
+/*
+ * pg_dump uses two different mechanisms for identifying database objects:
+ *
+ * CatalogId represents an object by the tableoid and oid of its defining
+ * entry in the system catalogs. We need this to interpret pg_depend entries,
+ * for instance.
+ *
+ * DumpId is a simple sequential integer counter assigned as dumpable objects
+ * are identified during a pg_dump run. We use DumpId internally in preference
+ * to CatalogId for two reasons: it's more compact, and we can assign DumpIds
+ * to "objects" that don't have a separate CatalogId. For example, it is
+ * convenient to consider a table, its data, and its ACL as three separate
+ * dumpable "objects" with distinct DumpIds --- this lets us reason about the
+ * order in which to dump these things.
+ */
+
+typedef struct
+{
+ /* Note: this struct must not contain any unused bytes */
+ Oid tableoid;
+ Oid oid;
+} CatalogId;
+
+typedef int DumpId;
+
+#define InvalidDumpId 0
+
+/*
+ * Function pointer prototypes for assorted callback methods.
+ */
+
+typedef int (*DataDumperPtr) (Archive *AH, const void *userArg);
+
+typedef void (*SetupWorkerPtrType) (Archive *AH);
+
+/*
+ * Main archiver interface.
+ */
+
+extern void ConnectDatabase(Archive *AHX,
+ const ConnParams *cparams,
+ bool isReconnect);
+extern void DisconnectDatabase(Archive *AHX);
+extern PGconn *GetConnection(Archive *AHX);
+
+/* Called to write *data* to the archive */
+extern void WriteData(Archive *AH, const void *data, size_t dLen);
+
+extern int StartBlob(Archive *AH, Oid oid);
+extern int EndBlob(Archive *AH, Oid oid);
+
+extern void CloseArchive(Archive *AH);
+
+extern void SetArchiveOptions(Archive *AH, DumpOptions *dopt, RestoreOptions *ropt);
+
+extern void ProcessArchiveRestoreOptions(Archive *AH);
+
+extern void RestoreArchive(Archive *AH);
+
+/* Open an existing archive */
+extern Archive *OpenArchive(const char *FileSpec, const ArchiveFormat fmt);
+
+/* Create a new archive */
+extern Archive *CreateArchive(const char *FileSpec, const ArchiveFormat fmt,
+ const int compression, bool dosync, ArchiveMode mode,
+ SetupWorkerPtrType setupDumpWorker);
+
+/* The --list option */
+extern void PrintTOCSummary(Archive *AH);
+
+extern RestoreOptions *NewRestoreOptions(void);
+
+extern DumpOptions *NewDumpOptions(void);
+extern void InitDumpOptions(DumpOptions *opts);
+extern DumpOptions *dumpOptionsFromRestoreOptions(RestoreOptions *ropt);
+
+/* Rearrange and filter TOC entries */
+extern void SortTocFromFile(Archive *AHX);
+
+/* Convenience functions used only when writing DATA */
+extern void archputs(const char *s, Archive *AH);
+extern int archprintf(Archive *AH, const char *fmt,...) pg_attribute_printf(2, 3);
+
+#define appendStringLiteralAH(buf,str,AH) \
+ appendStringLiteral(buf, str, (AH)->encoding, (AH)->std_strings)
+
+#endif /* PG_BACKUP_H */
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
new file mode 100644
index 0000000..5d23121
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -0,0 +1,4935 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_archiver.c
+ *
+ * Private implementation of the archiver routines.
+ *
+ * See the headers to pg_restore for more details.
+ *
+ * Copyright (c) 2000, Philip Warner
+ * Rights are granted to use this software in any way so long
+ * as this notice is not removed.
+ *
+ * The author is not responsible for loss or damages that may
+ * result from its use.
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup_archiver.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#ifdef WIN32
+#include <io.h>
+#endif
+
+#include "common/string.h"
+#include "dumputils.h"
+#include "fe_utils/string_utils.h"
+#include "lib/stringinfo.h"
+#include "libpq/libpq-fs.h"
+#include "parallel.h"
+#include "pg_backup_archiver.h"
+#include "pg_backup_db.h"
+#include "pg_backup_utils.h"
+
+#define TEXT_DUMP_HEADER "--\n-- PostgreSQL database dump\n--\n\n"
+#define TEXT_DUMPALL_HEADER "--\n-- PostgreSQL database cluster dump\n--\n\n"
+
+/* state needed to save/restore an archive's output target */
+typedef struct _outputContext
+{
+ void *OF;
+ int gzOut;
+} OutputContext;
+
+/*
+ * State for tracking TocEntrys that are ready to process during a parallel
+ * restore. (This used to be a list, and we still call it that, though now
+ * it's really an array so that we can apply qsort to it.)
+ *
+ * tes[] is sized large enough that we can't overrun it.
+ * The valid entries are indexed first_te .. last_te inclusive.
+ * We periodically sort the array to bring larger-by-dataLength entries to
+ * the front; "sorted" is true if the valid entries are known sorted.
+ */
+typedef struct _parallelReadyList
+{
+ TocEntry **tes; /* Ready-to-dump TocEntrys */
+ int first_te; /* index of first valid entry in tes[] */
+ int last_te; /* index of last valid entry in tes[] */
+ bool sorted; /* are valid entries currently sorted? */
+} ParallelReadyList;
+
+
+static ArchiveHandle *_allocAH(const char *FileSpec, const ArchiveFormat fmt,
+ const int compression, bool dosync, ArchiveMode mode,
+ SetupWorkerPtrType setupWorkerPtr);
+static void _getObjectDescription(PQExpBuffer buf, TocEntry *te);
+static void _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData);
+static char *sanitize_line(const char *str, bool want_hyphen);
+static void _doSetFixedOutputState(ArchiveHandle *AH);
+static void _doSetSessionAuth(ArchiveHandle *AH, const char *user);
+static void _reconnectToDB(ArchiveHandle *AH, const char *dbname);
+static void _becomeUser(ArchiveHandle *AH, const char *user);
+static void _becomeOwner(ArchiveHandle *AH, TocEntry *te);
+static void _selectOutputSchema(ArchiveHandle *AH, const char *schemaName);
+static void _selectTablespace(ArchiveHandle *AH, const char *tablespace);
+static void _selectTableAccessMethod(ArchiveHandle *AH, const char *tableam);
+static void processEncodingEntry(ArchiveHandle *AH, TocEntry *te);
+static void processStdStringsEntry(ArchiveHandle *AH, TocEntry *te);
+static void processSearchPathEntry(ArchiveHandle *AH, TocEntry *te);
+static int _tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH);
+static RestorePass _tocEntryRestorePass(TocEntry *te);
+static bool _tocEntryIsACL(TocEntry *te);
+static void _disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te);
+static void _enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te);
+static bool is_load_via_partition_root(TocEntry *te);
+static void buildTocEntryArrays(ArchiveHandle *AH);
+static void _moveBefore(TocEntry *pos, TocEntry *te);
+static int _discoverArchiveFormat(ArchiveHandle *AH);
+
+static int RestoringToDB(ArchiveHandle *AH);
+static void dump_lo_buf(ArchiveHandle *AH);
+static void dumpTimestamp(ArchiveHandle *AH, const char *msg, time_t tim);
+static void SetOutput(ArchiveHandle *AH, const char *filename, int compression);
+static OutputContext SaveOutput(ArchiveHandle *AH);
+static void RestoreOutput(ArchiveHandle *AH, OutputContext savedContext);
+
+static int restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel);
+static void restore_toc_entries_prefork(ArchiveHandle *AH,
+ TocEntry *pending_list);
+static void restore_toc_entries_parallel(ArchiveHandle *AH,
+ ParallelState *pstate,
+ TocEntry *pending_list);
+static void restore_toc_entries_postfork(ArchiveHandle *AH,
+ TocEntry *pending_list);
+static void pending_list_header_init(TocEntry *l);
+static void pending_list_append(TocEntry *l, TocEntry *te);
+static void pending_list_remove(TocEntry *te);
+static void ready_list_init(ParallelReadyList *ready_list, int tocCount);
+static void ready_list_free(ParallelReadyList *ready_list);
+static void ready_list_insert(ParallelReadyList *ready_list, TocEntry *te);
+static void ready_list_remove(ParallelReadyList *ready_list, int i);
+static void ready_list_sort(ParallelReadyList *ready_list);
+static int TocEntrySizeCompare(const void *p1, const void *p2);
+static void move_to_ready_list(TocEntry *pending_list,
+ ParallelReadyList *ready_list,
+ RestorePass pass);
+static TocEntry *pop_next_work_item(ParallelReadyList *ready_list,
+ ParallelState *pstate);
+static void mark_dump_job_done(ArchiveHandle *AH,
+ TocEntry *te,
+ int status,
+ void *callback_data);
+static void mark_restore_job_done(ArchiveHandle *AH,
+ TocEntry *te,
+ int status,
+ void *callback_data);
+static void fix_dependencies(ArchiveHandle *AH);
+static bool has_lock_conflicts(TocEntry *te1, TocEntry *te2);
+static void repoint_table_dependencies(ArchiveHandle *AH);
+static void identify_locking_dependencies(ArchiveHandle *AH, TocEntry *te);
+static void reduce_dependencies(ArchiveHandle *AH, TocEntry *te,
+ ParallelReadyList *ready_list);
+static void mark_create_done(ArchiveHandle *AH, TocEntry *te);
+static void inhibit_data_for_failed_table(ArchiveHandle *AH, TocEntry *te);
+
+static void StrictNamesCheck(RestoreOptions *ropt);
+
+
+/*
+ * Allocate a new DumpOptions block containing all default values.
+ */
+DumpOptions *
+NewDumpOptions(void)
+{
+ DumpOptions *opts = (DumpOptions *) pg_malloc(sizeof(DumpOptions));
+
+ InitDumpOptions(opts);
+ return opts;
+}
+
+/*
+ * Initialize a DumpOptions struct to all default values
+ */
+void
+InitDumpOptions(DumpOptions *opts)
+{
+ memset(opts, 0, sizeof(DumpOptions));
+ /* set any fields that shouldn't default to zeroes */
+ opts->include_everything = true;
+ opts->cparams.promptPassword = TRI_DEFAULT;
+ opts->dumpSections = DUMP_UNSECTIONED;
+}
+
+/*
+ * Create a freshly allocated DumpOptions with options equivalent to those
+ * found in the given RestoreOptions.
+ */
+DumpOptions *
+dumpOptionsFromRestoreOptions(RestoreOptions *ropt)
+{
+ DumpOptions *dopt = NewDumpOptions();
+
+ /* this is the inverse of what's at the end of pg_dump.c's main() */
+ dopt->cparams.dbname = ropt->cparams.dbname ? pg_strdup(ropt->cparams.dbname) : NULL;
+ dopt->cparams.pgport = ropt->cparams.pgport ? pg_strdup(ropt->cparams.pgport) : NULL;
+ dopt->cparams.pghost = ropt->cparams.pghost ? pg_strdup(ropt->cparams.pghost) : NULL;
+ dopt->cparams.username = ropt->cparams.username ? pg_strdup(ropt->cparams.username) : NULL;
+ dopt->cparams.promptPassword = ropt->cparams.promptPassword;
+ dopt->outputClean = ropt->dropSchema;
+ dopt->dataOnly = ropt->dataOnly;
+ dopt->schemaOnly = ropt->schemaOnly;
+ dopt->if_exists = ropt->if_exists;
+ dopt->column_inserts = ropt->column_inserts;
+ dopt->dumpSections = ropt->dumpSections;
+ dopt->aclsSkip = ropt->aclsSkip;
+ dopt->outputSuperuser = ropt->superuser;
+ dopt->outputCreateDB = ropt->createDB;
+ dopt->outputNoOwner = ropt->noOwner;
+ dopt->outputNoTableAm = ropt->noTableAm;
+ dopt->outputNoTablespaces = ropt->noTablespace;
+ dopt->disable_triggers = ropt->disable_triggers;
+ dopt->use_setsessauth = ropt->use_setsessauth;
+ dopt->disable_dollar_quoting = ropt->disable_dollar_quoting;
+ dopt->dump_inserts = ropt->dump_inserts;
+ dopt->no_comments = ropt->no_comments;
+ dopt->no_publications = ropt->no_publications;
+ dopt->no_security_labels = ropt->no_security_labels;
+ dopt->no_subscriptions = ropt->no_subscriptions;
+ dopt->lockWaitTimeout = ropt->lockWaitTimeout;
+ dopt->include_everything = ropt->include_everything;
+ dopt->enable_row_security = ropt->enable_row_security;
+ dopt->sequence_data = ropt->sequence_data;
+
+ return dopt;
+}
+
+
+/*
+ * Wrapper functions.
+ *
+ * The objective is to make writing new formats and dumpers as simple
+ * as possible, if necessary at the expense of extra function calls etc.
+ *
+ */
+
+/*
+ * The dump worker setup needs lots of knowledge of the internals of pg_dump,
+ * so it's defined in pg_dump.c and passed into OpenArchive. The restore worker
+ * setup doesn't need to know anything much, so it's defined here.
+ */
+static void
+setupRestoreWorker(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ AH->ReopenPtr(AH);
+}
+
+
+/* Create a new archive */
+/* Public */
+Archive *
+CreateArchive(const char *FileSpec, const ArchiveFormat fmt,
+ const int compression, bool dosync, ArchiveMode mode,
+ SetupWorkerPtrType setupDumpWorker)
+
+{
+ ArchiveHandle *AH = _allocAH(FileSpec, fmt, compression, dosync,
+ mode, setupDumpWorker);
+
+ return (Archive *) AH;
+}
+
+/* Open an existing archive */
+/* Public */
+Archive *
+OpenArchive(const char *FileSpec, const ArchiveFormat fmt)
+{
+ ArchiveHandle *AH = _allocAH(FileSpec, fmt, 0, true, archModeRead, setupRestoreWorker);
+
+ return (Archive *) AH;
+}
+
+/* Public */
+void
+CloseArchive(Archive *AHX)
+{
+ int res = 0;
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ AH->ClosePtr(AH);
+
+ /* Close the output */
+ errno = 0; /* in case gzclose() doesn't set it */
+ if (AH->gzOut)
+ res = GZCLOSE(AH->OF);
+ else if (AH->OF != stdout)
+ res = fclose(AH->OF);
+
+ if (res != 0)
+ pg_fatal("could not close output file: %m");
+}
+
+/* Public */
+void
+SetArchiveOptions(Archive *AH, DumpOptions *dopt, RestoreOptions *ropt)
+{
+ /* Caller can omit dump options, in which case we synthesize them */
+ if (dopt == NULL && ropt != NULL)
+ dopt = dumpOptionsFromRestoreOptions(ropt);
+
+ /* Save options for later access */
+ AH->dopt = dopt;
+ AH->ropt = ropt;
+}
+
+/* Public */
+void
+ProcessArchiveRestoreOptions(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ RestoreOptions *ropt = AH->public.ropt;
+ TocEntry *te;
+ teSection curSection;
+
+ /* Decide which TOC entries will be dumped/restored, and mark them */
+ curSection = SECTION_PRE_DATA;
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ /*
+ * When writing an archive, we also take this opportunity to check
+ * that we have generated the entries in a sane order that respects
+ * the section divisions. When reading, don't complain, since buggy
+ * old versions of pg_dump might generate out-of-order archives.
+ */
+ if (AH->mode != archModeRead)
+ {
+ switch (te->section)
+ {
+ case SECTION_NONE:
+ /* ok to be anywhere */
+ break;
+ case SECTION_PRE_DATA:
+ if (curSection != SECTION_PRE_DATA)
+ pg_log_warning("archive items not in correct section order");
+ break;
+ case SECTION_DATA:
+ if (curSection == SECTION_POST_DATA)
+ pg_log_warning("archive items not in correct section order");
+ break;
+ case SECTION_POST_DATA:
+ /* ok no matter which section we were in */
+ break;
+ default:
+ pg_fatal("unexpected section code %d",
+ (int) te->section);
+ break;
+ }
+ }
+
+ if (te->section != SECTION_NONE)
+ curSection = te->section;
+
+ te->reqs = _tocEntryRequired(te, curSection, AH);
+ }
+
+ /* Enforce strict names checking */
+ if (ropt->strict_names)
+ StrictNamesCheck(ropt);
+}
+
+/* Public */
+void
+RestoreArchive(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ RestoreOptions *ropt = AH->public.ropt;
+ bool parallel_mode;
+ TocEntry *te;
+ OutputContext sav;
+
+ AH->stage = STAGE_INITIALIZING;
+
+ /*
+ * If we're going to do parallel restore, there are some restrictions.
+ */
+ parallel_mode = (AH->public.numWorkers > 1 && ropt->useDB);
+ if (parallel_mode)
+ {
+ /* We haven't got round to making this work for all archive formats */
+ if (AH->ClonePtr == NULL || AH->ReopenPtr == NULL)
+ pg_fatal("parallel restore is not supported with this archive file format");
+
+ /* Doesn't work if the archive represents dependencies as OIDs */
+ if (AH->version < K_VERS_1_8)
+ pg_fatal("parallel restore is not supported with archives made by pre-8.0 pg_dump");
+
+ /*
+ * It's also not gonna work if we can't reopen the input file, so
+ * let's try that immediately.
+ */
+ AH->ReopenPtr(AH);
+ }
+
+ /*
+ * Make sure we won't need (de)compression we haven't got
+ */
+#ifndef HAVE_LIBZ
+ if (AH->compression != 0 && AH->PrintTocDataPtr != NULL)
+ {
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if (te->hadDumper && (te->reqs & REQ_DATA) != 0)
+ pg_fatal("cannot restore from compressed archive (compression not supported in this installation)");
+ }
+ }
+#endif
+
+ /*
+ * Prepare index arrays, so we can assume we have them throughout restore.
+ * It's possible we already did this, though.
+ */
+ if (AH->tocsByDumpId == NULL)
+ buildTocEntryArrays(AH);
+
+ /*
+ * If we're using a DB connection, then connect it.
+ */
+ if (ropt->useDB)
+ {
+ pg_log_info("connecting to database for restore");
+ if (AH->version < K_VERS_1_3)
+ pg_fatal("direct database connections are not supported in pre-1.3 archives");
+
+ /*
+ * We don't want to guess at whether the dump will successfully
+ * restore; allow the attempt regardless of the version of the restore
+ * target.
+ */
+ AHX->minRemoteVersion = 0;
+ AHX->maxRemoteVersion = 9999999;
+
+ ConnectDatabase(AHX, &ropt->cparams, false);
+
+ /*
+ * If we're talking to the DB directly, don't send comments since they
+ * obscure SQL when displaying errors
+ */
+ AH->noTocComments = 1;
+ }
+
+ /*
+ * Work out if we have an implied data-only restore. This can happen if
+ * the dump was data only or if the user has used a toc list to exclude
+ * all of the schema data. All we do is look for schema entries - if none
+ * are found then we set the dataOnly flag.
+ *
+ * We could scan for wanted TABLE entries, but that is not the same as
+ * dataOnly. At this stage, it seems unnecessary (6-Mar-2001).
+ */
+ if (!ropt->dataOnly)
+ {
+ int impliedDataOnly = 1;
+
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if ((te->reqs & REQ_SCHEMA) != 0)
+ { /* It's schema, and it's wanted */
+ impliedDataOnly = 0;
+ break;
+ }
+ }
+ if (impliedDataOnly)
+ {
+ ropt->dataOnly = impliedDataOnly;
+ pg_log_info("implied data-only restore");
+ }
+ }
+
+ /*
+ * Setup the output file if necessary.
+ */
+ sav = SaveOutput(AH);
+ if (ropt->filename || ropt->compression)
+ SetOutput(AH, ropt->filename, ropt->compression);
+
+ ahprintf(AH, "--\n-- PostgreSQL database dump\n--\n\n");
+
+ if (AH->archiveRemoteVersion)
+ ahprintf(AH, "-- Dumped from database version %s\n",
+ AH->archiveRemoteVersion);
+ if (AH->archiveDumpVersion)
+ ahprintf(AH, "-- Dumped by pg_dump version %s\n",
+ AH->archiveDumpVersion);
+
+ ahprintf(AH, "\n");
+
+ if (AH->public.verbose)
+ dumpTimestamp(AH, "Started on", AH->createDate);
+
+ if (ropt->single_txn)
+ {
+ if (AH->connection)
+ StartTransaction(AHX);
+ else
+ ahprintf(AH, "BEGIN;\n\n");
+ }
+
+ /*
+ * Establish important parameter values right away.
+ */
+ _doSetFixedOutputState(AH);
+
+ AH->stage = STAGE_PROCESSING;
+
+ /*
+ * Drop the items at the start, in reverse order
+ */
+ if (ropt->dropSchema)
+ {
+ for (te = AH->toc->prev; te != AH->toc; te = te->prev)
+ {
+ AH->currentTE = te;
+
+ /*
+ * In createDB mode, issue a DROP *only* for the database as a
+ * whole. Issuing drops against anything else would be wrong,
+ * because at this point we're connected to the wrong database.
+ * (The DATABASE PROPERTIES entry, if any, should be treated like
+ * the DATABASE entry.)
+ */
+ if (ropt->createDB)
+ {
+ if (strcmp(te->desc, "DATABASE") != 0 &&
+ strcmp(te->desc, "DATABASE PROPERTIES") != 0)
+ continue;
+ }
+
+ /* Otherwise, drop anything that's selected and has a dropStmt */
+ if (((te->reqs & (REQ_SCHEMA | REQ_DATA)) != 0) && te->dropStmt)
+ {
+ pg_log_info("dropping %s %s", te->desc, te->tag);
+ /* Select owner and schema as necessary */
+ _becomeOwner(AH, te);
+ _selectOutputSchema(AH, te->namespace);
+
+ /*
+ * Now emit the DROP command, if the object has one. Note we
+ * don't necessarily emit it verbatim; at this point we add an
+ * appropriate IF EXISTS clause, if the user requested it.
+ */
+ if (*te->dropStmt != '\0')
+ {
+ if (!ropt->if_exists ||
+ strncmp(te->dropStmt, "--", 2) == 0)
+ {
+ /*
+ * Without --if-exists, or if it's just a comment (as
+ * happens for the public schema), print the dropStmt
+ * as-is.
+ */
+ ahprintf(AH, "%s", te->dropStmt);
+ }
+ else
+ {
+ /*
+ * Inject an appropriate spelling of "if exists". For
+ * large objects, we have a separate routine that
+ * knows how to do it, without depending on
+ * te->dropStmt; use that. For other objects we need
+ * to parse the command.
+ */
+ if (strncmp(te->desc, "BLOB", 4) == 0)
+ {
+ DropBlobIfExists(AH, te->catalogId.oid);
+ }
+ else
+ {
+ char *dropStmt = pg_strdup(te->dropStmt);
+ char *dropStmtOrig = dropStmt;
+ PQExpBuffer ftStmt = createPQExpBuffer();
+
+ /*
+ * Need to inject IF EXISTS clause after ALTER
+ * TABLE part in ALTER TABLE .. DROP statement
+ */
+ if (strncmp(dropStmt, "ALTER TABLE", 11) == 0)
+ {
+ appendPQExpBufferStr(ftStmt,
+ "ALTER TABLE IF EXISTS");
+ dropStmt = dropStmt + 11;
+ }
+
+ /*
+ * ALTER TABLE..ALTER COLUMN..DROP DEFAULT does
+ * not support the IF EXISTS clause, and therefore
+ * we simply emit the original command for DEFAULT
+ * objects (modulo the adjustment made above).
+ *
+ * Likewise, don't mess with DATABASE PROPERTIES.
+ *
+ * If we used CREATE OR REPLACE VIEW as a means of
+ * quasi-dropping an ON SELECT rule, that should
+ * be emitted unchanged as well.
+ *
+ * For other object types, we need to extract the
+ * first part of the DROP which includes the
+ * object type. Most of the time this matches
+ * te->desc, so search for that; however for the
+ * different kinds of CONSTRAINTs, we know to
+ * search for hardcoded "DROP CONSTRAINT" instead.
+ */
+ if (strcmp(te->desc, "DEFAULT") == 0 ||
+ strcmp(te->desc, "DATABASE PROPERTIES") == 0 ||
+ strncmp(dropStmt, "CREATE OR REPLACE VIEW", 22) == 0)
+ appendPQExpBufferStr(ftStmt, dropStmt);
+ else
+ {
+ char buffer[40];
+ char *mark;
+
+ if (strcmp(te->desc, "CONSTRAINT") == 0 ||
+ strcmp(te->desc, "CHECK CONSTRAINT") == 0 ||
+ strcmp(te->desc, "FK CONSTRAINT") == 0)
+ strcpy(buffer, "DROP CONSTRAINT");
+ else
+ snprintf(buffer, sizeof(buffer), "DROP %s",
+ te->desc);
+
+ mark = strstr(dropStmt, buffer);
+
+ if (mark)
+ {
+ *mark = '\0';
+ appendPQExpBuffer(ftStmt, "%s%s IF EXISTS%s",
+ dropStmt, buffer,
+ mark + strlen(buffer));
+ }
+ else
+ {
+ /* complain and emit unmodified command */
+ pg_log_warning("could not find where to insert IF EXISTS in statement \"%s\"",
+ dropStmtOrig);
+ appendPQExpBufferStr(ftStmt, dropStmt);
+ }
+ }
+
+ ahprintf(AH, "%s", ftStmt->data);
+
+ destroyPQExpBuffer(ftStmt);
+ pg_free(dropStmtOrig);
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * _selectOutputSchema may have set currSchema to reflect the effect
+ * of a "SET search_path" command it emitted. However, by now we may
+ * have dropped that schema; or it might not have existed in the first
+ * place. In either case the effective value of search_path will not
+ * be what we think. Forcibly reset currSchema so that we will
+ * re-establish the search_path setting when needed (after creating
+ * the schema).
+ *
+ * If we treated users as pg_dump'able objects then we'd need to reset
+ * currUser here too.
+ */
+ if (AH->currSchema)
+ free(AH->currSchema);
+ AH->currSchema = NULL;
+ }
+
+ if (parallel_mode)
+ {
+ /*
+ * In parallel mode, turn control over to the parallel-restore logic.
+ */
+ ParallelState *pstate;
+ TocEntry pending_list;
+
+ /* The archive format module may need some setup for this */
+ if (AH->PrepParallelRestorePtr)
+ AH->PrepParallelRestorePtr(AH);
+
+ pending_list_header_init(&pending_list);
+
+ /* This runs PRE_DATA items and then disconnects from the database */
+ restore_toc_entries_prefork(AH, &pending_list);
+ Assert(AH->connection == NULL);
+
+ /* ParallelBackupStart() will actually fork the processes */
+ pstate = ParallelBackupStart(AH);
+ restore_toc_entries_parallel(AH, pstate, &pending_list);
+ ParallelBackupEnd(AH, pstate);
+
+ /* reconnect the leader and see if we missed something */
+ restore_toc_entries_postfork(AH, &pending_list);
+ Assert(AH->connection != NULL);
+ }
+ else
+ {
+ /*
+ * In serial mode, process everything in three phases: normal items,
+ * then ACLs, then post-ACL items. We might be able to skip one or
+ * both extra phases in some cases, eg data-only restores.
+ */
+ bool haveACL = false;
+ bool havePostACL = false;
+
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if ((te->reqs & (REQ_SCHEMA | REQ_DATA)) == 0)
+ continue; /* ignore if not to be dumped at all */
+
+ switch (_tocEntryRestorePass(te))
+ {
+ case RESTORE_PASS_MAIN:
+ (void) restore_toc_entry(AH, te, false);
+ break;
+ case RESTORE_PASS_ACL:
+ haveACL = true;
+ break;
+ case RESTORE_PASS_POST_ACL:
+ havePostACL = true;
+ break;
+ }
+ }
+
+ if (haveACL)
+ {
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if ((te->reqs & (REQ_SCHEMA | REQ_DATA)) != 0 &&
+ _tocEntryRestorePass(te) == RESTORE_PASS_ACL)
+ (void) restore_toc_entry(AH, te, false);
+ }
+ }
+
+ if (havePostACL)
+ {
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if ((te->reqs & (REQ_SCHEMA | REQ_DATA)) != 0 &&
+ _tocEntryRestorePass(te) == RESTORE_PASS_POST_ACL)
+ (void) restore_toc_entry(AH, te, false);
+ }
+ }
+ }
+
+ if (ropt->single_txn)
+ {
+ if (AH->connection)
+ CommitTransaction(AHX);
+ else
+ ahprintf(AH, "COMMIT;\n\n");
+ }
+
+ if (AH->public.verbose)
+ dumpTimestamp(AH, "Completed on", time(NULL));
+
+ ahprintf(AH, "--\n-- PostgreSQL database dump complete\n--\n\n");
+
+ /*
+ * Clean up & we're done.
+ */
+ AH->stage = STAGE_FINALIZING;
+
+ if (ropt->filename || ropt->compression)
+ RestoreOutput(AH, sav);
+
+ if (ropt->useDB)
+ DisconnectDatabase(&AH->public);
+}
+
+/*
+ * Restore a single TOC item. Used in both parallel and non-parallel restore;
+ * is_parallel is true if we are in a worker child process.
+ *
+ * Returns 0 normally, but WORKER_CREATE_DONE or WORKER_INHIBIT_DATA if
+ * the parallel parent has to make the corresponding status update.
+ */
+static int
+restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+ int status = WORKER_OK;
+ int reqs;
+ bool defnDumped;
+
+ AH->currentTE = te;
+
+ /* Dump any relevant dump warnings to stderr */
+ if (!ropt->suppressDumpWarnings && strcmp(te->desc, "WARNING") == 0)
+ {
+ if (!ropt->dataOnly && te->defn != NULL && strlen(te->defn) != 0)
+ pg_log_warning("warning from original dump file: %s", te->defn);
+ else if (te->copyStmt != NULL && strlen(te->copyStmt) != 0)
+ pg_log_warning("warning from original dump file: %s", te->copyStmt);
+ }
+
+ /* Work out what, if anything, we want from this entry */
+ reqs = te->reqs;
+
+ defnDumped = false;
+
+ /*
+ * If it has a schema component that we want, then process that
+ */
+ if ((reqs & REQ_SCHEMA) != 0)
+ {
+ /* Show namespace in log message if available */
+ if (te->namespace)
+ pg_log_info("creating %s \"%s.%s\"",
+ te->desc, te->namespace, te->tag);
+ else
+ pg_log_info("creating %s \"%s\"",
+ te->desc, te->tag);
+
+ _printTocEntry(AH, te, false);
+ defnDumped = true;
+
+ if (strcmp(te->desc, "TABLE") == 0)
+ {
+ if (AH->lastErrorTE == te)
+ {
+ /*
+ * We failed to create the table. If
+ * --no-data-for-failed-tables was given, mark the
+ * corresponding TABLE DATA to be ignored.
+ *
+ * In the parallel case this must be done in the parent, so we
+ * just set the return value.
+ */
+ if (ropt->noDataForFailedTables)
+ {
+ if (is_parallel)
+ status = WORKER_INHIBIT_DATA;
+ else
+ inhibit_data_for_failed_table(AH, te);
+ }
+ }
+ else
+ {
+ /*
+ * We created the table successfully. Mark the corresponding
+ * TABLE DATA for possible truncation.
+ *
+ * In the parallel case this must be done in the parent, so we
+ * just set the return value.
+ */
+ if (is_parallel)
+ status = WORKER_CREATE_DONE;
+ else
+ mark_create_done(AH, te);
+ }
+ }
+
+ /*
+ * If we created a DB, connect to it. Also, if we changed DB
+ * properties, reconnect to ensure that relevant GUC settings are
+ * applied to our session.
+ */
+ if (strcmp(te->desc, "DATABASE") == 0 ||
+ strcmp(te->desc, "DATABASE PROPERTIES") == 0)
+ {
+ pg_log_info("connecting to new database \"%s\"", te->tag);
+ _reconnectToDB(AH, te->tag);
+ }
+ }
+
+ /*
+ * If it has a data component that we want, then process that
+ */
+ if ((reqs & REQ_DATA) != 0)
+ {
+ /*
+ * hadDumper will be set if there is genuine data component for this
+ * node. Otherwise, we need to check the defn field for statements
+ * that need to be executed in data-only restores.
+ */
+ if (te->hadDumper)
+ {
+ /*
+ * If we can output the data, then restore it.
+ */
+ if (AH->PrintTocDataPtr != NULL)
+ {
+ _printTocEntry(AH, te, true);
+
+ if (strcmp(te->desc, "BLOBS") == 0 ||
+ strcmp(te->desc, "BLOB COMMENTS") == 0)
+ {
+ pg_log_info("processing %s", te->desc);
+
+ _selectOutputSchema(AH, "pg_catalog");
+
+ /* Send BLOB COMMENTS data to ExecuteSimpleCommands() */
+ if (strcmp(te->desc, "BLOB COMMENTS") == 0)
+ AH->outputKind = OUTPUT_OTHERDATA;
+
+ AH->PrintTocDataPtr(AH, te);
+
+ AH->outputKind = OUTPUT_SQLCMDS;
+ }
+ else
+ {
+ bool use_truncate;
+
+ _disableTriggersIfNecessary(AH, te);
+
+ /* Select owner and schema as necessary */
+ _becomeOwner(AH, te);
+ _selectOutputSchema(AH, te->namespace);
+
+ pg_log_info("processing data for table \"%s.%s\"",
+ te->namespace, te->tag);
+
+ /*
+ * In parallel restore, if we created the table earlier in
+ * this run (so that we know it is empty) and we are not
+ * restoring a load-via-partition-root data item then we
+ * wrap the COPY in a transaction and precede it with a
+ * TRUNCATE. If wal_level is set to minimal this prevents
+ * WAL-logging the COPY. This obtains a speedup similar
+ * to that from using single_txn mode in non-parallel
+ * restores.
+ *
+ * We mustn't do this for load-via-partition-root cases
+ * because some data might get moved across partition
+ * boundaries, risking deadlock and/or loss of previously
+ * loaded data. (We assume that all partitions of a
+ * partitioned table will be treated the same way.)
+ */
+ use_truncate = is_parallel && te->created &&
+ !is_load_via_partition_root(te);
+
+ if (use_truncate)
+ {
+ /*
+ * Parallel restore is always talking directly to a
+ * server, so no need to see if we should issue BEGIN.
+ */
+ StartTransaction(&AH->public);
+
+ /*
+ * Issue TRUNCATE with ONLY so that child tables are
+ * not wiped.
+ */
+ ahprintf(AH, "TRUNCATE TABLE ONLY %s;\n\n",
+ fmtQualifiedId(te->namespace, te->tag));
+ }
+
+ /*
+ * If we have a copy statement, use it.
+ */
+ if (te->copyStmt && strlen(te->copyStmt) > 0)
+ {
+ ahprintf(AH, "%s", te->copyStmt);
+ AH->outputKind = OUTPUT_COPYDATA;
+ }
+ else
+ AH->outputKind = OUTPUT_OTHERDATA;
+
+ AH->PrintTocDataPtr(AH, te);
+
+ /*
+ * Terminate COPY if needed.
+ */
+ if (AH->outputKind == OUTPUT_COPYDATA &&
+ RestoringToDB(AH))
+ EndDBCopyMode(&AH->public, te->tag);
+ AH->outputKind = OUTPUT_SQLCMDS;
+
+ /* close out the transaction started above */
+ if (use_truncate)
+ CommitTransaction(&AH->public);
+
+ _enableTriggersIfNecessary(AH, te);
+ }
+ }
+ }
+ else if (!defnDumped)
+ {
+ /* If we haven't already dumped the defn part, do so now */
+ pg_log_info("executing %s %s", te->desc, te->tag);
+ _printTocEntry(AH, te, false);
+ }
+ }
+
+ if (AH->public.n_errors > 0 && status == WORKER_OK)
+ status = WORKER_IGNORED_ERRORS;
+
+ return status;
+}
+
+/*
+ * Allocate a new RestoreOptions block.
+ * This is mainly so we can initialize it, but also for future expansion,
+ */
+RestoreOptions *
+NewRestoreOptions(void)
+{
+ RestoreOptions *opts;
+
+ opts = (RestoreOptions *) pg_malloc0(sizeof(RestoreOptions));
+
+ /* set any fields that shouldn't default to zeroes */
+ opts->format = archUnknown;
+ opts->cparams.promptPassword = TRI_DEFAULT;
+ opts->dumpSections = DUMP_UNSECTIONED;
+
+ return opts;
+}
+
+static void
+_disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+
+ /* This hack is only needed in a data-only restore */
+ if (!ropt->dataOnly || !ropt->disable_triggers)
+ return;
+
+ pg_log_info("disabling triggers for %s", te->tag);
+
+ /*
+ * Become superuser if possible, since they are the only ones who can
+ * disable constraint triggers. If -S was not given, assume the initial
+ * user identity is a superuser. (XXX would it be better to become the
+ * table owner?)
+ */
+ _becomeUser(AH, ropt->superuser);
+
+ /*
+ * Disable them.
+ */
+ ahprintf(AH, "ALTER TABLE %s DISABLE TRIGGER ALL;\n\n",
+ fmtQualifiedId(te->namespace, te->tag));
+}
+
+static void
+_enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+
+ /* This hack is only needed in a data-only restore */
+ if (!ropt->dataOnly || !ropt->disable_triggers)
+ return;
+
+ pg_log_info("enabling triggers for %s", te->tag);
+
+ /*
+ * Become superuser if possible, since they are the only ones who can
+ * disable constraint triggers. If -S was not given, assume the initial
+ * user identity is a superuser. (XXX would it be better to become the
+ * table owner?)
+ */
+ _becomeUser(AH, ropt->superuser);
+
+ /*
+ * Enable them.
+ */
+ ahprintf(AH, "ALTER TABLE %s ENABLE TRIGGER ALL;\n\n",
+ fmtQualifiedId(te->namespace, te->tag));
+}
+
+/*
+ * Detect whether a TABLE DATA TOC item is performing "load via partition
+ * root", that is the target table is an ancestor partition rather than the
+ * table the TOC item is nominally for.
+ *
+ * In newer archive files this can be detected by checking for a special
+ * comment placed in te->defn. In older files we have to fall back to seeing
+ * if the COPY statement targets the named table or some other one. This
+ * will not work for data dumped as INSERT commands, so we could give a false
+ * negative in that case; fortunately, that's a rarely-used option.
+ */
+static bool
+is_load_via_partition_root(TocEntry *te)
+{
+ if (te->defn &&
+ strncmp(te->defn, "-- load via partition root ", 27) == 0)
+ return true;
+ if (te->copyStmt && *te->copyStmt)
+ {
+ PQExpBuffer copyStmt = createPQExpBuffer();
+ bool result;
+
+ /*
+ * Build the initial part of the COPY as it would appear if the
+ * nominal target table is the actual target. If we see anything
+ * else, it must be a load-via-partition-root case.
+ */
+ appendPQExpBuffer(copyStmt, "COPY %s ",
+ fmtQualifiedId(te->namespace, te->tag));
+ result = strncmp(te->copyStmt, copyStmt->data, copyStmt->len) != 0;
+ destroyPQExpBuffer(copyStmt);
+ return result;
+ }
+ /* Assume it's not load-via-partition-root */
+ return false;
+}
+
+/*
+ * This is a routine that is part of the dumper interface, hence the 'Archive*' parameter.
+ */
+
+/* Public */
+void
+WriteData(Archive *AHX, const void *data, size_t dLen)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ if (!AH->currToc)
+ pg_fatal("internal error -- WriteData cannot be called outside the context of a DataDumper routine");
+
+ AH->WriteDataPtr(AH, data, dLen);
+}
+
+/*
+ * Create a new TOC entry. The TOC was designed as a TOC, but is now the
+ * repository for all metadata. But the name has stuck.
+ *
+ * The new entry is added to the Archive's TOC list. Most callers can ignore
+ * the result value because nothing else need be done, but a few want to
+ * manipulate the TOC entry further.
+ */
+
+/* Public */
+TocEntry *
+ArchiveEntry(Archive *AHX, CatalogId catalogId, DumpId dumpId,
+ ArchiveOpts *opts)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ TocEntry *newToc;
+
+ newToc = (TocEntry *) pg_malloc0(sizeof(TocEntry));
+
+ AH->tocCount++;
+ if (dumpId > AH->maxDumpId)
+ AH->maxDumpId = dumpId;
+
+ newToc->prev = AH->toc->prev;
+ newToc->next = AH->toc;
+ AH->toc->prev->next = newToc;
+ AH->toc->prev = newToc;
+
+ newToc->catalogId = catalogId;
+ newToc->dumpId = dumpId;
+ newToc->section = opts->section;
+
+ newToc->tag = pg_strdup(opts->tag);
+ newToc->namespace = opts->namespace ? pg_strdup(opts->namespace) : NULL;
+ newToc->tablespace = opts->tablespace ? pg_strdup(opts->tablespace) : NULL;
+ newToc->tableam = opts->tableam ? pg_strdup(opts->tableam) : NULL;
+ newToc->owner = opts->owner ? pg_strdup(opts->owner) : NULL;
+ newToc->desc = pg_strdup(opts->description);
+ newToc->defn = opts->createStmt ? pg_strdup(opts->createStmt) : NULL;
+ newToc->dropStmt = opts->dropStmt ? pg_strdup(opts->dropStmt) : NULL;
+ newToc->copyStmt = opts->copyStmt ? pg_strdup(opts->copyStmt) : NULL;
+
+ if (opts->nDeps > 0)
+ {
+ newToc->dependencies = (DumpId *) pg_malloc(opts->nDeps * sizeof(DumpId));
+ memcpy(newToc->dependencies, opts->deps, opts->nDeps * sizeof(DumpId));
+ newToc->nDeps = opts->nDeps;
+ }
+ else
+ {
+ newToc->dependencies = NULL;
+ newToc->nDeps = 0;
+ }
+
+ newToc->dataDumper = opts->dumpFn;
+ newToc->dataDumperArg = opts->dumpArg;
+ newToc->hadDumper = opts->dumpFn ? true : false;
+
+ newToc->formatData = NULL;
+ newToc->dataLength = 0;
+
+ if (AH->ArchiveEntryPtr != NULL)
+ AH->ArchiveEntryPtr(AH, newToc);
+
+ return newToc;
+}
+
+/* Public */
+void
+PrintTOCSummary(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ RestoreOptions *ropt = AH->public.ropt;
+ TocEntry *te;
+ teSection curSection;
+ OutputContext sav;
+ const char *fmtName;
+ char stamp_str[64];
+
+ sav = SaveOutput(AH);
+ if (ropt->filename)
+ SetOutput(AH, ropt->filename, 0 /* no compression */ );
+
+ if (strftime(stamp_str, sizeof(stamp_str), PGDUMP_STRFTIME_FMT,
+ localtime(&AH->createDate)) == 0)
+ strcpy(stamp_str, "[unknown]");
+
+ ahprintf(AH, ";\n; Archive created at %s\n", stamp_str);
+ ahprintf(AH, "; dbname: %s\n; TOC Entries: %d\n; Compression: %d\n",
+ sanitize_line(AH->archdbname, false),
+ AH->tocCount, AH->compression);
+
+ switch (AH->format)
+ {
+ case archCustom:
+ fmtName = "CUSTOM";
+ break;
+ case archDirectory:
+ fmtName = "DIRECTORY";
+ break;
+ case archTar:
+ fmtName = "TAR";
+ break;
+ default:
+ fmtName = "UNKNOWN";
+ }
+
+ ahprintf(AH, "; Dump Version: %d.%d-%d\n",
+ ARCHIVE_MAJOR(AH->version), ARCHIVE_MINOR(AH->version), ARCHIVE_REV(AH->version));
+ ahprintf(AH, "; Format: %s\n", fmtName);
+ ahprintf(AH, "; Integer: %d bytes\n", (int) AH->intSize);
+ ahprintf(AH, "; Offset: %d bytes\n", (int) AH->offSize);
+ if (AH->archiveRemoteVersion)
+ ahprintf(AH, "; Dumped from database version: %s\n",
+ AH->archiveRemoteVersion);
+ if (AH->archiveDumpVersion)
+ ahprintf(AH, "; Dumped by pg_dump version: %s\n",
+ AH->archiveDumpVersion);
+
+ ahprintf(AH, ";\n;\n; Selected TOC Entries:\n;\n");
+
+ curSection = SECTION_PRE_DATA;
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if (te->section != SECTION_NONE)
+ curSection = te->section;
+ if (ropt->verbose ||
+ (_tocEntryRequired(te, curSection, AH) & (REQ_SCHEMA | REQ_DATA)) != 0)
+ {
+ char *sanitized_name;
+ char *sanitized_schema;
+ char *sanitized_owner;
+
+ /*
+ */
+ sanitized_name = sanitize_line(te->tag, false);
+ sanitized_schema = sanitize_line(te->namespace, true);
+ sanitized_owner = sanitize_line(te->owner, false);
+
+ ahprintf(AH, "%d; %u %u %s %s %s %s\n", te->dumpId,
+ te->catalogId.tableoid, te->catalogId.oid,
+ te->desc, sanitized_schema, sanitized_name,
+ sanitized_owner);
+
+ free(sanitized_name);
+ free(sanitized_schema);
+ free(sanitized_owner);
+ }
+ if (ropt->verbose && te->nDeps > 0)
+ {
+ int i;
+
+ ahprintf(AH, ";\tdepends on:");
+ for (i = 0; i < te->nDeps; i++)
+ ahprintf(AH, " %d", te->dependencies[i]);
+ ahprintf(AH, "\n");
+ }
+ }
+
+ /* Enforce strict names checking */
+ if (ropt->strict_names)
+ StrictNamesCheck(ropt);
+
+ if (ropt->filename)
+ RestoreOutput(AH, sav);
+}
+
+/***********
+ * BLOB Archival
+ ***********/
+
+/* Called by a dumper to signal start of a BLOB */
+int
+StartBlob(Archive *AHX, Oid oid)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ if (!AH->StartBlobPtr)
+ pg_fatal("large-object output not supported in chosen format");
+
+ AH->StartBlobPtr(AH, AH->currToc, oid);
+
+ return 1;
+}
+
+/* Called by a dumper to signal end of a BLOB */
+int
+EndBlob(Archive *AHX, Oid oid)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ if (AH->EndBlobPtr)
+ AH->EndBlobPtr(AH, AH->currToc, oid);
+
+ return 1;
+}
+
+/**********
+ * BLOB Restoration
+ **********/
+
+/*
+ * Called by a format handler before any blobs are restored
+ */
+void
+StartRestoreBlobs(ArchiveHandle *AH)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+
+ if (!ropt->single_txn)
+ {
+ if (AH->connection)
+ StartTransaction(&AH->public);
+ else
+ ahprintf(AH, "BEGIN;\n\n");
+ }
+
+ AH->blobCount = 0;
+}
+
+/*
+ * Called by a format handler after all blobs are restored
+ */
+void
+EndRestoreBlobs(ArchiveHandle *AH)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+
+ if (!ropt->single_txn)
+ {
+ if (AH->connection)
+ CommitTransaction(&AH->public);
+ else
+ ahprintf(AH, "COMMIT;\n\n");
+ }
+
+ pg_log_info(ngettext("restored %d large object",
+ "restored %d large objects",
+ AH->blobCount),
+ AH->blobCount);
+}
+
+
+/*
+ * Called by a format handler to initiate restoration of a blob
+ */
+void
+StartRestoreBlob(ArchiveHandle *AH, Oid oid, bool drop)
+{
+ bool old_blob_style = (AH->version < K_VERS_1_12);
+ Oid loOid;
+
+ AH->blobCount++;
+
+ /* Initialize the LO Buffer */
+ AH->lo_buf_used = 0;
+
+ pg_log_info("restoring large object with OID %u", oid);
+
+ /* With an old archive we must do drop and create logic here */
+ if (old_blob_style && drop)
+ DropBlobIfExists(AH, oid);
+
+ if (AH->connection)
+ {
+ if (old_blob_style)
+ {
+ loOid = lo_create(AH->connection, oid);
+ if (loOid == 0 || loOid != oid)
+ pg_fatal("could not create large object %u: %s",
+ oid, PQerrorMessage(AH->connection));
+ }
+ AH->loFd = lo_open(AH->connection, oid, INV_WRITE);
+ if (AH->loFd == -1)
+ pg_fatal("could not open large object %u: %s",
+ oid, PQerrorMessage(AH->connection));
+ }
+ else
+ {
+ if (old_blob_style)
+ ahprintf(AH, "SELECT pg_catalog.lo_open(pg_catalog.lo_create('%u'), %d);\n",
+ oid, INV_WRITE);
+ else
+ ahprintf(AH, "SELECT pg_catalog.lo_open('%u', %d);\n",
+ oid, INV_WRITE);
+ }
+
+ AH->writingBlob = 1;
+}
+
+void
+EndRestoreBlob(ArchiveHandle *AH, Oid oid)
+{
+ if (AH->lo_buf_used > 0)
+ {
+ /* Write remaining bytes from the LO buffer */
+ dump_lo_buf(AH);
+ }
+
+ AH->writingBlob = 0;
+
+ if (AH->connection)
+ {
+ lo_close(AH->connection, AH->loFd);
+ AH->loFd = -1;
+ }
+ else
+ {
+ ahprintf(AH, "SELECT pg_catalog.lo_close(0);\n\n");
+ }
+}
+
+/***********
+ * Sorting and Reordering
+ ***********/
+
+void
+SortTocFromFile(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ RestoreOptions *ropt = AH->public.ropt;
+ FILE *fh;
+ StringInfoData linebuf;
+
+ /* Allocate space for the 'wanted' array, and init it */
+ ropt->idWanted = (bool *) pg_malloc0(sizeof(bool) * AH->maxDumpId);
+
+ /* Setup the file */
+ fh = fopen(ropt->tocFile, PG_BINARY_R);
+ if (!fh)
+ pg_fatal("could not open TOC file \"%s\": %m", ropt->tocFile);
+
+ initStringInfo(&linebuf);
+
+ while (pg_get_line_buf(fh, &linebuf))
+ {
+ char *cmnt;
+ char *endptr;
+ DumpId id;
+ TocEntry *te;
+
+ /* Truncate line at comment, if any */
+ cmnt = strchr(linebuf.data, ';');
+ if (cmnt != NULL)
+ {
+ cmnt[0] = '\0';
+ linebuf.len = cmnt - linebuf.data;
+ }
+
+ /* Ignore if all blank */
+ if (strspn(linebuf.data, " \t\r\n") == linebuf.len)
+ continue;
+
+ /* Get an ID, check it's valid and not already seen */
+ id = strtol(linebuf.data, &endptr, 10);
+ if (endptr == linebuf.data || id <= 0 || id > AH->maxDumpId ||
+ ropt->idWanted[id - 1])
+ {
+ pg_log_warning("line ignored: %s", linebuf.data);
+ continue;
+ }
+
+ /* Find TOC entry */
+ te = getTocEntryByDumpId(AH, id);
+ if (!te)
+ pg_fatal("could not find entry for ID %d",
+ id);
+
+ /* Mark it wanted */
+ ropt->idWanted[id - 1] = true;
+
+ /*
+ * Move each item to the end of the list as it is selected, so that
+ * they are placed in the desired order. Any unwanted items will end
+ * up at the front of the list, which may seem unintuitive but it's
+ * what we need. In an ordinary serial restore that makes no
+ * difference, but in a parallel restore we need to mark unrestored
+ * items' dependencies as satisfied before we start examining
+ * restorable items. Otherwise they could have surprising
+ * side-effects on the order in which restorable items actually get
+ * restored.
+ */
+ _moveBefore(AH->toc, te);
+ }
+
+ pg_free(linebuf.data);
+
+ if (fclose(fh) != 0)
+ pg_fatal("could not close TOC file: %m");
+}
+
+/**********************
+ * Convenience functions that look like standard IO functions
+ * for writing data when in dump mode.
+ **********************/
+
+/* Public */
+void
+archputs(const char *s, Archive *AH)
+{
+ WriteData(AH, s, strlen(s));
+}
+
+/* Public */
+int
+archprintf(Archive *AH, const char *fmt,...)
+{
+ int save_errno = errno;
+ char *p;
+ size_t len = 128; /* initial assumption about buffer size */
+ size_t cnt;
+
+ for (;;)
+ {
+ va_list args;
+
+ /* Allocate work buffer. */
+ p = (char *) pg_malloc(len);
+
+ /* Try to format the data. */
+ errno = save_errno;
+ va_start(args, fmt);
+ cnt = pvsnprintf(p, len, fmt, args);
+ va_end(args);
+
+ if (cnt < len)
+ break; /* success */
+
+ /* Release buffer and loop around to try again with larger len. */
+ free(p);
+ len = cnt;
+ }
+
+ WriteData(AH, p, cnt);
+ free(p);
+ return (int) cnt;
+}
+
+
+/*******************************
+ * Stuff below here should be 'private' to the archiver routines
+ *******************************/
+
+static void
+SetOutput(ArchiveHandle *AH, const char *filename, int compression)
+{
+ int fn;
+
+ if (filename)
+ {
+ if (strcmp(filename, "-") == 0)
+ fn = fileno(stdout);
+ else
+ fn = -1;
+ }
+ else if (AH->FH)
+ fn = fileno(AH->FH);
+ else if (AH->fSpec)
+ {
+ fn = -1;
+ filename = AH->fSpec;
+ }
+ else
+ fn = fileno(stdout);
+
+ /* If compression explicitly requested, use gzopen */
+#ifdef HAVE_LIBZ
+ if (compression != 0)
+ {
+ char fmode[14];
+
+ /* Don't use PG_BINARY_x since this is zlib */
+ sprintf(fmode, "wb%d", compression);
+ if (fn >= 0)
+ AH->OF = gzdopen(dup(fn), fmode);
+ else
+ AH->OF = gzopen(filename, fmode);
+ AH->gzOut = 1;
+ }
+ else
+#endif
+ { /* Use fopen */
+ if (AH->mode == archModeAppend)
+ {
+ if (fn >= 0)
+ AH->OF = fdopen(dup(fn), PG_BINARY_A);
+ else
+ AH->OF = fopen(filename, PG_BINARY_A);
+ }
+ else
+ {
+ if (fn >= 0)
+ AH->OF = fdopen(dup(fn), PG_BINARY_W);
+ else
+ AH->OF = fopen(filename, PG_BINARY_W);
+ }
+ AH->gzOut = 0;
+ }
+
+ if (!AH->OF)
+ {
+ if (filename)
+ pg_fatal("could not open output file \"%s\": %m", filename);
+ else
+ pg_fatal("could not open output file: %m");
+ }
+}
+
+static OutputContext
+SaveOutput(ArchiveHandle *AH)
+{
+ OutputContext sav;
+
+ sav.OF = AH->OF;
+ sav.gzOut = AH->gzOut;
+
+ return sav;
+}
+
+static void
+RestoreOutput(ArchiveHandle *AH, OutputContext savedContext)
+{
+ int res;
+
+ errno = 0; /* in case gzclose() doesn't set it */
+ if (AH->gzOut)
+ res = GZCLOSE(AH->OF);
+ else
+ res = fclose(AH->OF);
+
+ if (res != 0)
+ pg_fatal("could not close output file: %m");
+
+ AH->gzOut = savedContext.gzOut;
+ AH->OF = savedContext.OF;
+}
+
+
+
+/*
+ * Print formatted text to the output file (usually stdout).
+ */
+int
+ahprintf(ArchiveHandle *AH, const char *fmt,...)
+{
+ int save_errno = errno;
+ char *p;
+ size_t len = 128; /* initial assumption about buffer size */
+ size_t cnt;
+
+ for (;;)
+ {
+ va_list args;
+
+ /* Allocate work buffer. */
+ p = (char *) pg_malloc(len);
+
+ /* Try to format the data. */
+ errno = save_errno;
+ va_start(args, fmt);
+ cnt = pvsnprintf(p, len, fmt, args);
+ va_end(args);
+
+ if (cnt < len)
+ break; /* success */
+
+ /* Release buffer and loop around to try again with larger len. */
+ free(p);
+ len = cnt;
+ }
+
+ ahwrite(p, 1, cnt, AH);
+ free(p);
+ return (int) cnt;
+}
+
+/*
+ * Single place for logic which says 'We are restoring to a direct DB connection'.
+ */
+static int
+RestoringToDB(ArchiveHandle *AH)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+
+ return (ropt && ropt->useDB && AH->connection);
+}
+
+/*
+ * Dump the current contents of the LO data buffer while writing a BLOB
+ */
+static void
+dump_lo_buf(ArchiveHandle *AH)
+{
+ if (AH->connection)
+ {
+ int res;
+
+ res = lo_write(AH->connection, AH->loFd, AH->lo_buf, AH->lo_buf_used);
+ pg_log_debug(ngettext("wrote %zu byte of large object data (result = %d)",
+ "wrote %zu bytes of large object data (result = %d)",
+ AH->lo_buf_used),
+ AH->lo_buf_used, res);
+ /* We assume there are no short writes, only errors */
+ if (res != AH->lo_buf_used)
+ warn_or_exit_horribly(AH, "could not write to large object: %s",
+ PQerrorMessage(AH->connection));
+ }
+ else
+ {
+ PQExpBuffer buf = createPQExpBuffer();
+
+ appendByteaLiteralAHX(buf,
+ (const unsigned char *) AH->lo_buf,
+ AH->lo_buf_used,
+ AH);
+
+ /* Hack: turn off writingBlob so ahwrite doesn't recurse to here */
+ AH->writingBlob = 0;
+ ahprintf(AH, "SELECT pg_catalog.lowrite(0, %s);\n", buf->data);
+ AH->writingBlob = 1;
+
+ destroyPQExpBuffer(buf);
+ }
+ AH->lo_buf_used = 0;
+}
+
+
+/*
+ * Write buffer to the output file (usually stdout). This is used for
+ * outputting 'restore' scripts etc. It is even possible for an archive
+ * format to create a custom output routine to 'fake' a restore if it
+ * wants to generate a script (see TAR output).
+ */
+void
+ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH)
+{
+ int bytes_written = 0;
+
+ if (AH->writingBlob)
+ {
+ size_t remaining = size * nmemb;
+
+ while (AH->lo_buf_used + remaining > AH->lo_buf_size)
+ {
+ size_t avail = AH->lo_buf_size - AH->lo_buf_used;
+
+ memcpy((char *) AH->lo_buf + AH->lo_buf_used, ptr, avail);
+ ptr = (const void *) ((const char *) ptr + avail);
+ remaining -= avail;
+ AH->lo_buf_used += avail;
+ dump_lo_buf(AH);
+ }
+
+ memcpy((char *) AH->lo_buf + AH->lo_buf_used, ptr, remaining);
+ AH->lo_buf_used += remaining;
+
+ bytes_written = size * nmemb;
+ }
+ else if (AH->gzOut)
+ bytes_written = GZWRITE(ptr, size, nmemb, AH->OF);
+ else if (AH->CustomOutPtr)
+ bytes_written = AH->CustomOutPtr(AH, ptr, size * nmemb);
+
+ else
+ {
+ /*
+ * If we're doing a restore, and it's direct to DB, and we're
+ * connected then send it to the DB.
+ */
+ if (RestoringToDB(AH))
+ bytes_written = ExecuteSqlCommandBuf(&AH->public, (const char *) ptr, size * nmemb);
+ else
+ bytes_written = fwrite(ptr, size, nmemb, AH->OF) * size;
+ }
+
+ if (bytes_written != size * nmemb)
+ WRITE_ERROR_EXIT;
+}
+
+/* on some error, we may decide to go on... */
+void
+warn_or_exit_horribly(ArchiveHandle *AH, const char *fmt,...)
+{
+ va_list ap;
+
+ switch (AH->stage)
+ {
+
+ case STAGE_NONE:
+ /* Do nothing special */
+ break;
+
+ case STAGE_INITIALIZING:
+ if (AH->stage != AH->lastErrorStage)
+ pg_log_info("while INITIALIZING:");
+ break;
+
+ case STAGE_PROCESSING:
+ if (AH->stage != AH->lastErrorStage)
+ pg_log_info("while PROCESSING TOC:");
+ break;
+
+ case STAGE_FINALIZING:
+ if (AH->stage != AH->lastErrorStage)
+ pg_log_info("while FINALIZING:");
+ break;
+ }
+ if (AH->currentTE != NULL && AH->currentTE != AH->lastErrorTE)
+ {
+ pg_log_info("from TOC entry %d; %u %u %s %s %s",
+ AH->currentTE->dumpId,
+ AH->currentTE->catalogId.tableoid,
+ AH->currentTE->catalogId.oid,
+ AH->currentTE->desc ? AH->currentTE->desc : "(no desc)",
+ AH->currentTE->tag ? AH->currentTE->tag : "(no tag)",
+ AH->currentTE->owner ? AH->currentTE->owner : "(no owner)");
+ }
+ AH->lastErrorStage = AH->stage;
+ AH->lastErrorTE = AH->currentTE;
+
+ va_start(ap, fmt);
+ pg_log_generic_v(PG_LOG_ERROR, PG_LOG_PRIMARY, fmt, ap);
+ va_end(ap);
+
+ if (AH->public.exit_on_error)
+ exit_nicely(1);
+ else
+ AH->public.n_errors++;
+}
+
+#ifdef NOT_USED
+
+static void
+_moveAfter(ArchiveHandle *AH, TocEntry *pos, TocEntry *te)
+{
+ /* Unlink te from list */
+ te->prev->next = te->next;
+ te->next->prev = te->prev;
+
+ /* and insert it after "pos" */
+ te->prev = pos;
+ te->next = pos->next;
+ pos->next->prev = te;
+ pos->next = te;
+}
+#endif
+
+static void
+_moveBefore(TocEntry *pos, TocEntry *te)
+{
+ /* Unlink te from list */
+ te->prev->next = te->next;
+ te->next->prev = te->prev;
+
+ /* and insert it before "pos" */
+ te->prev = pos->prev;
+ te->next = pos;
+ pos->prev->next = te;
+ pos->prev = te;
+}
+
+/*
+ * Build index arrays for the TOC list
+ *
+ * This should be invoked only after we have created or read in all the TOC
+ * items.
+ *
+ * The arrays are indexed by dump ID (so entry zero is unused). Note that the
+ * array entries run only up to maxDumpId. We might see dependency dump IDs
+ * beyond that (if the dump was partial); so always check the array bound
+ * before trying to touch an array entry.
+ */
+static void
+buildTocEntryArrays(ArchiveHandle *AH)
+{
+ DumpId maxDumpId = AH->maxDumpId;
+ TocEntry *te;
+
+ AH->tocsByDumpId = (TocEntry **) pg_malloc0((maxDumpId + 1) * sizeof(TocEntry *));
+ AH->tableDataId = (DumpId *) pg_malloc0((maxDumpId + 1) * sizeof(DumpId));
+
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ /* this check is purely paranoia, maxDumpId should be correct */
+ if (te->dumpId <= 0 || te->dumpId > maxDumpId)
+ pg_fatal("bad dumpId");
+
+ /* tocsByDumpId indexes all TOCs by their dump ID */
+ AH->tocsByDumpId[te->dumpId] = te;
+
+ /*
+ * tableDataId provides the TABLE DATA item's dump ID for each TABLE
+ * TOC entry that has a DATA item. We compute this by reversing the
+ * TABLE DATA item's dependency, knowing that a TABLE DATA item has
+ * just one dependency and it is the TABLE item.
+ */
+ if (strcmp(te->desc, "TABLE DATA") == 0 && te->nDeps > 0)
+ {
+ DumpId tableId = te->dependencies[0];
+
+ /*
+ * The TABLE item might not have been in the archive, if this was
+ * a data-only dump; but its dump ID should be less than its data
+ * item's dump ID, so there should be a place for it in the array.
+ */
+ if (tableId <= 0 || tableId > maxDumpId)
+ pg_fatal("bad table dumpId for TABLE DATA item");
+
+ AH->tableDataId[tableId] = te->dumpId;
+ }
+ }
+}
+
+TocEntry *
+getTocEntryByDumpId(ArchiveHandle *AH, DumpId id)
+{
+ /* build index arrays if we didn't already */
+ if (AH->tocsByDumpId == NULL)
+ buildTocEntryArrays(AH);
+
+ if (id > 0 && id <= AH->maxDumpId)
+ return AH->tocsByDumpId[id];
+
+ return NULL;
+}
+
+int
+TocIDRequired(ArchiveHandle *AH, DumpId id)
+{
+ TocEntry *te = getTocEntryByDumpId(AH, id);
+
+ if (!te)
+ return 0;
+
+ return te->reqs;
+}
+
+size_t
+WriteOffset(ArchiveHandle *AH, pgoff_t o, int wasSet)
+{
+ int off;
+
+ /* Save the flag */
+ AH->WriteBytePtr(AH, wasSet);
+
+ /* Write out pgoff_t smallest byte first, prevents endian mismatch */
+ for (off = 0; off < sizeof(pgoff_t); off++)
+ {
+ AH->WriteBytePtr(AH, o & 0xFF);
+ o >>= 8;
+ }
+ return sizeof(pgoff_t) + 1;
+}
+
+int
+ReadOffset(ArchiveHandle *AH, pgoff_t * o)
+{
+ int i;
+ int off;
+ int offsetFlg;
+
+ /* Initialize to zero */
+ *o = 0;
+
+ /* Check for old version */
+ if (AH->version < K_VERS_1_7)
+ {
+ /* Prior versions wrote offsets using WriteInt */
+ i = ReadInt(AH);
+ /* -1 means not set */
+ if (i < 0)
+ return K_OFFSET_POS_NOT_SET;
+ else if (i == 0)
+ return K_OFFSET_NO_DATA;
+
+ /* Cast to pgoff_t because it was written as an int. */
+ *o = (pgoff_t) i;
+ return K_OFFSET_POS_SET;
+ }
+
+ /*
+ * Read the flag indicating the state of the data pointer. Check if valid
+ * and die if not.
+ *
+ * This used to be handled by a negative or zero pointer, now we use an
+ * extra byte specifically for the state.
+ */
+ offsetFlg = AH->ReadBytePtr(AH) & 0xFF;
+
+ switch (offsetFlg)
+ {
+ case K_OFFSET_POS_NOT_SET:
+ case K_OFFSET_NO_DATA:
+ case K_OFFSET_POS_SET:
+
+ break;
+
+ default:
+ pg_fatal("unexpected data offset flag %d", offsetFlg);
+ }
+
+ /*
+ * Read the bytes
+ */
+ for (off = 0; off < AH->offSize; off++)
+ {
+ if (off < sizeof(pgoff_t))
+ *o |= ((pgoff_t) (AH->ReadBytePtr(AH))) << (off * 8);
+ else
+ {
+ if (AH->ReadBytePtr(AH) != 0)
+ pg_fatal("file offset in dump file is too large");
+ }
+ }
+
+ return offsetFlg;
+}
+
+size_t
+WriteInt(ArchiveHandle *AH, int i)
+{
+ int b;
+
+ /*
+ * This is a bit yucky, but I don't want to make the binary format very
+ * dependent on representation, and not knowing much about it, I write out
+ * a sign byte. If you change this, don't forget to change the file
+ * version #, and modify ReadInt to read the new format AS WELL AS the old
+ * formats.
+ */
+
+ /* SIGN byte */
+ if (i < 0)
+ {
+ AH->WriteBytePtr(AH, 1);
+ i = -i;
+ }
+ else
+ AH->WriteBytePtr(AH, 0);
+
+ for (b = 0; b < AH->intSize; b++)
+ {
+ AH->WriteBytePtr(AH, i & 0xFF);
+ i >>= 8;
+ }
+
+ return AH->intSize + 1;
+}
+
+int
+ReadInt(ArchiveHandle *AH)
+{
+ int res = 0;
+ int bv,
+ b;
+ int sign = 0; /* Default positive */
+ int bitShift = 0;
+
+ if (AH->version > K_VERS_1_0)
+ /* Read a sign byte */
+ sign = AH->ReadBytePtr(AH);
+
+ for (b = 0; b < AH->intSize; b++)
+ {
+ bv = AH->ReadBytePtr(AH) & 0xFF;
+ if (bv != 0)
+ res = res + (bv << bitShift);
+ bitShift += 8;
+ }
+
+ if (sign)
+ res = -res;
+
+ return res;
+}
+
+size_t
+WriteStr(ArchiveHandle *AH, const char *c)
+{
+ size_t res;
+
+ if (c)
+ {
+ int len = strlen(c);
+
+ res = WriteInt(AH, len);
+ AH->WriteBufPtr(AH, c, len);
+ res += len;
+ }
+ else
+ res = WriteInt(AH, -1);
+
+ return res;
+}
+
+char *
+ReadStr(ArchiveHandle *AH)
+{
+ char *buf;
+ int l;
+
+ l = ReadInt(AH);
+ if (l < 0)
+ buf = NULL;
+ else
+ {
+ buf = (char *) pg_malloc(l + 1);
+ AH->ReadBufPtr(AH, (void *) buf, l);
+
+ buf[l] = '\0';
+ }
+
+ return buf;
+}
+
+static int
+_discoverArchiveFormat(ArchiveHandle *AH)
+{
+ FILE *fh;
+ char sig[6]; /* More than enough */
+ size_t cnt;
+ int wantClose = 0;
+
+ pg_log_debug("attempting to ascertain archive format");
+
+ if (AH->lookahead)
+ free(AH->lookahead);
+
+ AH->readHeader = 0;
+ AH->lookaheadSize = 512;
+ AH->lookahead = pg_malloc0(512);
+ AH->lookaheadLen = 0;
+ AH->lookaheadPos = 0;
+
+ if (AH->fSpec)
+ {
+ struct stat st;
+
+ wantClose = 1;
+
+ /*
+ * Check if the specified archive is a directory. If so, check if
+ * there's a "toc.dat" (or "toc.dat.gz") file in it.
+ */
+ if (stat(AH->fSpec, &st) == 0 && S_ISDIR(st.st_mode))
+ {
+ char buf[MAXPGPATH];
+
+ if (snprintf(buf, MAXPGPATH, "%s/toc.dat", AH->fSpec) >= MAXPGPATH)
+ pg_fatal("directory name too long: \"%s\"",
+ AH->fSpec);
+ if (stat(buf, &st) == 0 && S_ISREG(st.st_mode))
+ {
+ AH->format = archDirectory;
+ return AH->format;
+ }
+
+#ifdef HAVE_LIBZ
+ if (snprintf(buf, MAXPGPATH, "%s/toc.dat.gz", AH->fSpec) >= MAXPGPATH)
+ pg_fatal("directory name too long: \"%s\"",
+ AH->fSpec);
+ if (stat(buf, &st) == 0 && S_ISREG(st.st_mode))
+ {
+ AH->format = archDirectory;
+ return AH->format;
+ }
+#endif
+ pg_fatal("directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)",
+ AH->fSpec);
+ fh = NULL; /* keep compiler quiet */
+ }
+ else
+ {
+ fh = fopen(AH->fSpec, PG_BINARY_R);
+ if (!fh)
+ pg_fatal("could not open input file \"%s\": %m", AH->fSpec);
+ }
+ }
+ else
+ {
+ fh = stdin;
+ if (!fh)
+ pg_fatal("could not open input file: %m");
+ }
+
+ if ((cnt = fread(sig, 1, 5, fh)) != 5)
+ {
+ if (ferror(fh))
+ pg_fatal("could not read input file: %m");
+ else
+ pg_fatal("input file is too short (read %lu, expected 5)",
+ (unsigned long) cnt);
+ }
+
+ /* Save it, just in case we need it later */
+ memcpy(&AH->lookahead[0], sig, 5);
+ AH->lookaheadLen = 5;
+
+ if (strncmp(sig, "PGDMP", 5) == 0)
+ {
+ /* It's custom format, stop here */
+ AH->format = archCustom;
+ AH->readHeader = 1;
+ }
+ else
+ {
+ /*
+ * *Maybe* we have a tar archive format file or a text dump ... So,
+ * read first 512 byte header...
+ */
+ cnt = fread(&AH->lookahead[AH->lookaheadLen], 1, 512 - AH->lookaheadLen, fh);
+ /* read failure is checked below */
+ AH->lookaheadLen += cnt;
+
+ if (AH->lookaheadLen >= strlen(TEXT_DUMPALL_HEADER) &&
+ (strncmp(AH->lookahead, TEXT_DUMP_HEADER, strlen(TEXT_DUMP_HEADER)) == 0 ||
+ strncmp(AH->lookahead, TEXT_DUMPALL_HEADER, strlen(TEXT_DUMPALL_HEADER)) == 0))
+ {
+ /*
+ * looks like it's probably a text format dump. so suggest they
+ * try psql
+ */
+ pg_fatal("input file appears to be a text format dump. Please use psql.");
+ }
+
+ if (AH->lookaheadLen != 512)
+ {
+ if (feof(fh))
+ pg_fatal("input file does not appear to be a valid archive (too short?)");
+ else
+ READ_ERROR_EXIT(fh);
+ }
+
+ if (!isValidTarHeader(AH->lookahead))
+ pg_fatal("input file does not appear to be a valid archive");
+
+ AH->format = archTar;
+ }
+
+ /* Close the file if we opened it */
+ if (wantClose)
+ {
+ if (fclose(fh) != 0)
+ pg_fatal("could not close input file: %m");
+ /* Forget lookahead, since we'll re-read header after re-opening */
+ AH->readHeader = 0;
+ AH->lookaheadLen = 0;
+ }
+
+ return AH->format;
+}
+
+
+/*
+ * Allocate an archive handle
+ */
+static ArchiveHandle *
+_allocAH(const char *FileSpec, const ArchiveFormat fmt,
+ const int compression, bool dosync, ArchiveMode mode,
+ SetupWorkerPtrType setupWorkerPtr)
+{
+ ArchiveHandle *AH;
+
+ pg_log_debug("allocating AH for %s, format %d",
+ FileSpec ? FileSpec : "(stdio)", fmt);
+
+ AH = (ArchiveHandle *) pg_malloc0(sizeof(ArchiveHandle));
+
+ AH->version = K_VERS_SELF;
+
+ /* initialize for backwards compatible string processing */
+ AH->public.encoding = 0; /* PG_SQL_ASCII */
+ AH->public.std_strings = false;
+
+ /* sql error handling */
+ AH->public.exit_on_error = true;
+ AH->public.n_errors = 0;
+
+ AH->archiveDumpVersion = PG_VERSION;
+
+ AH->createDate = time(NULL);
+
+ AH->intSize = sizeof(int);
+ AH->offSize = sizeof(pgoff_t);
+ if (FileSpec)
+ {
+ AH->fSpec = pg_strdup(FileSpec);
+
+ /*
+ * Not used; maybe later....
+ *
+ * AH->workDir = pg_strdup(FileSpec); for(i=strlen(FileSpec) ; i > 0 ;
+ * i--) if (AH->workDir[i-1] == '/')
+ */
+ }
+ else
+ AH->fSpec = NULL;
+
+ AH->currUser = NULL; /* unknown */
+ AH->currSchema = NULL; /* ditto */
+ AH->currTablespace = NULL; /* ditto */
+ AH->currTableAm = NULL; /* ditto */
+
+ AH->toc = (TocEntry *) pg_malloc0(sizeof(TocEntry));
+
+ AH->toc->next = AH->toc;
+ AH->toc->prev = AH->toc;
+
+ AH->mode = mode;
+ AH->compression = compression;
+ AH->dosync = dosync;
+
+ memset(&(AH->sqlparse), 0, sizeof(AH->sqlparse));
+
+ /* Open stdout with no compression for AH output handle */
+ AH->gzOut = 0;
+ AH->OF = stdout;
+
+ /*
+ * On Windows, we need to use binary mode to read/write non-text files,
+ * which include all archive formats as well as compressed plain text.
+ * Force stdin/stdout into binary mode if that is what we are using.
+ */
+#ifdef WIN32
+ if ((fmt != archNull || compression != 0) &&
+ (AH->fSpec == NULL || strcmp(AH->fSpec, "") == 0))
+ {
+ if (mode == archModeWrite)
+ _setmode(fileno(stdout), O_BINARY);
+ else
+ _setmode(fileno(stdin), O_BINARY);
+ }
+#endif
+
+ AH->SetupWorkerPtr = setupWorkerPtr;
+
+ if (fmt == archUnknown)
+ AH->format = _discoverArchiveFormat(AH);
+ else
+ AH->format = fmt;
+
+ switch (AH->format)
+ {
+ case archCustom:
+ InitArchiveFmt_Custom(AH);
+ break;
+
+ case archNull:
+ InitArchiveFmt_Null(AH);
+ break;
+
+ case archDirectory:
+ InitArchiveFmt_Directory(AH);
+ break;
+
+ case archTar:
+ InitArchiveFmt_Tar(AH);
+ break;
+
+ default:
+ pg_fatal("unrecognized file format \"%d\"", fmt);
+ }
+
+ return AH;
+}
+
+/*
+ * Write out all data (tables & blobs)
+ */
+void
+WriteDataChunks(ArchiveHandle *AH, ParallelState *pstate)
+{
+ TocEntry *te;
+
+ if (pstate && pstate->numWorkers > 1)
+ {
+ /*
+ * In parallel mode, this code runs in the leader process. We
+ * construct an array of candidate TEs, then sort it into decreasing
+ * size order, then dispatch each TE to a data-transfer worker. By
+ * dumping larger tables first, we avoid getting into a situation
+ * where we're down to one job and it's big, losing parallelism.
+ */
+ TocEntry **tes;
+ int ntes;
+
+ tes = (TocEntry **) pg_malloc(AH->tocCount * sizeof(TocEntry *));
+ ntes = 0;
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ /* Consider only TEs with dataDumper functions ... */
+ if (!te->dataDumper)
+ continue;
+ /* ... and ignore ones not enabled for dump */
+ if ((te->reqs & REQ_DATA) == 0)
+ continue;
+
+ tes[ntes++] = te;
+ }
+
+ if (ntes > 1)
+ qsort((void *) tes, ntes, sizeof(TocEntry *),
+ TocEntrySizeCompare);
+
+ for (int i = 0; i < ntes; i++)
+ DispatchJobForTocEntry(AH, pstate, tes[i], ACT_DUMP,
+ mark_dump_job_done, NULL);
+
+ pg_free(tes);
+
+ /* Now wait for workers to finish. */
+ WaitForWorkers(AH, pstate, WFW_ALL_IDLE);
+ }
+ else
+ {
+ /* Non-parallel mode: just dump all candidate TEs sequentially. */
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ /* Must have same filter conditions as above */
+ if (!te->dataDumper)
+ continue;
+ if ((te->reqs & REQ_DATA) == 0)
+ continue;
+
+ WriteDataChunksForTocEntry(AH, te);
+ }
+ }
+}
+
+
+/*
+ * Callback function that's invoked in the leader process after a step has
+ * been parallel dumped.
+ *
+ * We don't need to do anything except check for worker failure.
+ */
+static void
+mark_dump_job_done(ArchiveHandle *AH,
+ TocEntry *te,
+ int status,
+ void *callback_data)
+{
+ pg_log_info("finished item %d %s %s",
+ te->dumpId, te->desc, te->tag);
+
+ if (status != 0)
+ pg_fatal("worker process failed: exit code %d",
+ status);
+}
+
+
+void
+WriteDataChunksForTocEntry(ArchiveHandle *AH, TocEntry *te)
+{
+ StartDataPtrType startPtr;
+ EndDataPtrType endPtr;
+
+ AH->currToc = te;
+
+ if (strcmp(te->desc, "BLOBS") == 0)
+ {
+ startPtr = AH->StartBlobsPtr;
+ endPtr = AH->EndBlobsPtr;
+ }
+ else
+ {
+ startPtr = AH->StartDataPtr;
+ endPtr = AH->EndDataPtr;
+ }
+
+ if (startPtr != NULL)
+ (*startPtr) (AH, te);
+
+ /*
+ * The user-provided DataDumper routine needs to call AH->WriteData
+ */
+ te->dataDumper((Archive *) AH, te->dataDumperArg);
+
+ if (endPtr != NULL)
+ (*endPtr) (AH, te);
+
+ AH->currToc = NULL;
+}
+
+void
+WriteToc(ArchiveHandle *AH)
+{
+ TocEntry *te;
+ char workbuf[32];
+ int tocCount;
+ int i;
+
+ /* count entries that will actually be dumped */
+ tocCount = 0;
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if ((te->reqs & (REQ_SCHEMA | REQ_DATA | REQ_SPECIAL)) != 0)
+ tocCount++;
+ }
+
+ /* printf("%d TOC Entries to save\n", tocCount); */
+
+ WriteInt(AH, tocCount);
+
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if ((te->reqs & (REQ_SCHEMA | REQ_DATA | REQ_SPECIAL)) == 0)
+ continue;
+
+ WriteInt(AH, te->dumpId);
+ WriteInt(AH, te->dataDumper ? 1 : 0);
+
+ /* OID is recorded as a string for historical reasons */
+ sprintf(workbuf, "%u", te->catalogId.tableoid);
+ WriteStr(AH, workbuf);
+ sprintf(workbuf, "%u", te->catalogId.oid);
+ WriteStr(AH, workbuf);
+
+ WriteStr(AH, te->tag);
+ WriteStr(AH, te->desc);
+ WriteInt(AH, te->section);
+ WriteStr(AH, te->defn);
+ WriteStr(AH, te->dropStmt);
+ WriteStr(AH, te->copyStmt);
+ WriteStr(AH, te->namespace);
+ WriteStr(AH, te->tablespace);
+ WriteStr(AH, te->tableam);
+ WriteStr(AH, te->owner);
+ WriteStr(AH, "false");
+
+ /* Dump list of dependencies */
+ for (i = 0; i < te->nDeps; i++)
+ {
+ sprintf(workbuf, "%d", te->dependencies[i]);
+ WriteStr(AH, workbuf);
+ }
+ WriteStr(AH, NULL); /* Terminate List */
+
+ if (AH->WriteExtraTocPtr)
+ AH->WriteExtraTocPtr(AH, te);
+ }
+}
+
+void
+ReadToc(ArchiveHandle *AH)
+{
+ int i;
+ char *tmp;
+ DumpId *deps;
+ int depIdx;
+ int depSize;
+ TocEntry *te;
+ bool is_supported;
+
+ AH->tocCount = ReadInt(AH);
+ AH->maxDumpId = 0;
+
+ for (i = 0; i < AH->tocCount; i++)
+ {
+ te = (TocEntry *) pg_malloc0(sizeof(TocEntry));
+ te->dumpId = ReadInt(AH);
+
+ if (te->dumpId > AH->maxDumpId)
+ AH->maxDumpId = te->dumpId;
+
+ /* Sanity check */
+ if (te->dumpId <= 0)
+ pg_fatal("entry ID %d out of range -- perhaps a corrupt TOC",
+ te->dumpId);
+
+ te->hadDumper = ReadInt(AH);
+
+ if (AH->version >= K_VERS_1_8)
+ {
+ tmp = ReadStr(AH);
+ sscanf(tmp, "%u", &te->catalogId.tableoid);
+ free(tmp);
+ }
+ else
+ te->catalogId.tableoid = InvalidOid;
+ tmp = ReadStr(AH);
+ sscanf(tmp, "%u", &te->catalogId.oid);
+ free(tmp);
+
+ te->tag = ReadStr(AH);
+ te->desc = ReadStr(AH);
+
+ if (AH->version >= K_VERS_1_11)
+ {
+ te->section = ReadInt(AH);
+ }
+ else
+ {
+ /*
+ * Rules for pre-8.4 archives wherein pg_dump hasn't classified
+ * the entries into sections. This list need not cover entry
+ * types added later than 8.4.
+ */
+ if (strcmp(te->desc, "COMMENT") == 0 ||
+ strcmp(te->desc, "ACL") == 0 ||
+ strcmp(te->desc, "ACL LANGUAGE") == 0)
+ te->section = SECTION_NONE;
+ else if (strcmp(te->desc, "TABLE DATA") == 0 ||
+ strcmp(te->desc, "BLOBS") == 0 ||
+ strcmp(te->desc, "BLOB COMMENTS") == 0)
+ te->section = SECTION_DATA;
+ else if (strcmp(te->desc, "CONSTRAINT") == 0 ||
+ strcmp(te->desc, "CHECK CONSTRAINT") == 0 ||
+ strcmp(te->desc, "FK CONSTRAINT") == 0 ||
+ strcmp(te->desc, "INDEX") == 0 ||
+ strcmp(te->desc, "RULE") == 0 ||
+ strcmp(te->desc, "TRIGGER") == 0)
+ te->section = SECTION_POST_DATA;
+ else
+ te->section = SECTION_PRE_DATA;
+ }
+
+ te->defn = ReadStr(AH);
+ te->dropStmt = ReadStr(AH);
+
+ if (AH->version >= K_VERS_1_3)
+ te->copyStmt = ReadStr(AH);
+
+ if (AH->version >= K_VERS_1_6)
+ te->namespace = ReadStr(AH);
+
+ if (AH->version >= K_VERS_1_10)
+ te->tablespace = ReadStr(AH);
+
+ if (AH->version >= K_VERS_1_14)
+ te->tableam = ReadStr(AH);
+
+ te->owner = ReadStr(AH);
+ is_supported = true;
+ if (AH->version < K_VERS_1_9)
+ is_supported = false;
+ else
+ {
+ tmp = ReadStr(AH);
+
+ if (strcmp(tmp, "true") == 0)
+ is_supported = false;
+
+ free(tmp);
+ }
+
+ if (!is_supported)
+ pg_log_warning("restoring tables WITH OIDS is not supported anymore");
+
+ /* Read TOC entry dependencies */
+ if (AH->version >= K_VERS_1_5)
+ {
+ depSize = 100;
+ deps = (DumpId *) pg_malloc(sizeof(DumpId) * depSize);
+ depIdx = 0;
+ for (;;)
+ {
+ tmp = ReadStr(AH);
+ if (!tmp)
+ break; /* end of list */
+ if (depIdx >= depSize)
+ {
+ depSize *= 2;
+ deps = (DumpId *) pg_realloc(deps, sizeof(DumpId) * depSize);
+ }
+ sscanf(tmp, "%d", &deps[depIdx]);
+ free(tmp);
+ depIdx++;
+ }
+
+ if (depIdx > 0) /* We have a non-null entry */
+ {
+ deps = (DumpId *) pg_realloc(deps, sizeof(DumpId) * depIdx);
+ te->dependencies = deps;
+ te->nDeps = depIdx;
+ }
+ else
+ {
+ free(deps);
+ te->dependencies = NULL;
+ te->nDeps = 0;
+ }
+ }
+ else
+ {
+ te->dependencies = NULL;
+ te->nDeps = 0;
+ }
+ te->dataLength = 0;
+
+ if (AH->ReadExtraTocPtr)
+ AH->ReadExtraTocPtr(AH, te);
+
+ pg_log_debug("read TOC entry %d (ID %d) for %s %s",
+ i, te->dumpId, te->desc, te->tag);
+
+ /* link completed entry into TOC circular list */
+ te->prev = AH->toc->prev;
+ AH->toc->prev->next = te;
+ AH->toc->prev = te;
+ te->next = AH->toc;
+
+ /* special processing immediately upon read for some items */
+ if (strcmp(te->desc, "ENCODING") == 0)
+ processEncodingEntry(AH, te);
+ else if (strcmp(te->desc, "STDSTRINGS") == 0)
+ processStdStringsEntry(AH, te);
+ else if (strcmp(te->desc, "SEARCHPATH") == 0)
+ processSearchPathEntry(AH, te);
+ }
+}
+
+static void
+processEncodingEntry(ArchiveHandle *AH, TocEntry *te)
+{
+ /* te->defn should have the form SET client_encoding = 'foo'; */
+ char *defn = pg_strdup(te->defn);
+ char *ptr1;
+ char *ptr2 = NULL;
+ int encoding;
+
+ ptr1 = strchr(defn, '\'');
+ if (ptr1)
+ ptr2 = strchr(++ptr1, '\'');
+ if (ptr2)
+ {
+ *ptr2 = '\0';
+ encoding = pg_char_to_encoding(ptr1);
+ if (encoding < 0)
+ pg_fatal("unrecognized encoding \"%s\"",
+ ptr1);
+ AH->public.encoding = encoding;
+ }
+ else
+ pg_fatal("invalid ENCODING item: %s",
+ te->defn);
+
+ free(defn);
+}
+
+static void
+processStdStringsEntry(ArchiveHandle *AH, TocEntry *te)
+{
+ /* te->defn should have the form SET standard_conforming_strings = 'x'; */
+ char *ptr1;
+
+ ptr1 = strchr(te->defn, '\'');
+ if (ptr1 && strncmp(ptr1, "'on'", 4) == 0)
+ AH->public.std_strings = true;
+ else if (ptr1 && strncmp(ptr1, "'off'", 5) == 0)
+ AH->public.std_strings = false;
+ else
+ pg_fatal("invalid STDSTRINGS item: %s",
+ te->defn);
+}
+
+static void
+processSearchPathEntry(ArchiveHandle *AH, TocEntry *te)
+{
+ /*
+ * te->defn should contain a command to set search_path. We just copy it
+ * verbatim for use later.
+ */
+ AH->public.searchpath = pg_strdup(te->defn);
+}
+
+static void
+StrictNamesCheck(RestoreOptions *ropt)
+{
+ const char *missing_name;
+
+ Assert(ropt->strict_names);
+
+ if (ropt->schemaNames.head != NULL)
+ {
+ missing_name = simple_string_list_not_touched(&ropt->schemaNames);
+ if (missing_name != NULL)
+ pg_fatal("schema \"%s\" not found", missing_name);
+ }
+
+ if (ropt->tableNames.head != NULL)
+ {
+ missing_name = simple_string_list_not_touched(&ropt->tableNames);
+ if (missing_name != NULL)
+ pg_fatal("table \"%s\" not found", missing_name);
+ }
+
+ if (ropt->indexNames.head != NULL)
+ {
+ missing_name = simple_string_list_not_touched(&ropt->indexNames);
+ if (missing_name != NULL)
+ pg_fatal("index \"%s\" not found", missing_name);
+ }
+
+ if (ropt->functionNames.head != NULL)
+ {
+ missing_name = simple_string_list_not_touched(&ropt->functionNames);
+ if (missing_name != NULL)
+ pg_fatal("function \"%s\" not found", missing_name);
+ }
+
+ if (ropt->triggerNames.head != NULL)
+ {
+ missing_name = simple_string_list_not_touched(&ropt->triggerNames);
+ if (missing_name != NULL)
+ pg_fatal("trigger \"%s\" not found", missing_name);
+ }
+}
+
+/*
+ * Determine whether we want to restore this TOC entry.
+ *
+ * Returns 0 if entry should be skipped, or some combination of the
+ * REQ_SCHEMA and REQ_DATA bits if we want to restore schema and/or data
+ * portions of this TOC entry, or REQ_SPECIAL if it's a special entry.
+ */
+static int
+_tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH)
+{
+ int res = REQ_SCHEMA | REQ_DATA;
+ RestoreOptions *ropt = AH->public.ropt;
+
+ /* These items are treated specially */
+ if (strcmp(te->desc, "ENCODING") == 0 ||
+ strcmp(te->desc, "STDSTRINGS") == 0 ||
+ strcmp(te->desc, "SEARCHPATH") == 0)
+ return REQ_SPECIAL;
+
+ /*
+ * DATABASE and DATABASE PROPERTIES also have a special rule: they are
+ * restored in createDB mode, and not restored otherwise, independently of
+ * all else.
+ */
+ if (strcmp(te->desc, "DATABASE") == 0 ||
+ strcmp(te->desc, "DATABASE PROPERTIES") == 0)
+ {
+ if (ropt->createDB)
+ return REQ_SCHEMA;
+ else
+ return 0;
+ }
+
+ /*
+ * Process exclusions that affect certain classes of TOC entries.
+ */
+
+ /* If it's an ACL, maybe ignore it */
+ if (ropt->aclsSkip && _tocEntryIsACL(te))
+ return 0;
+
+ /* If it's a comment, maybe ignore it */
+ if (ropt->no_comments && strcmp(te->desc, "COMMENT") == 0)
+ return 0;
+
+ /*
+ * If it's a publication or a table part of a publication, maybe ignore
+ * it.
+ */
+ if (ropt->no_publications &&
+ (strcmp(te->desc, "PUBLICATION") == 0 ||
+ strcmp(te->desc, "PUBLICATION TABLE") == 0 ||
+ strcmp(te->desc, "PUBLICATION TABLES IN SCHEMA") == 0))
+ return 0;
+
+ /* If it's a security label, maybe ignore it */
+ if (ropt->no_security_labels && strcmp(te->desc, "SECURITY LABEL") == 0)
+ return 0;
+
+ /* If it's a subscription, maybe ignore it */
+ if (ropt->no_subscriptions && strcmp(te->desc, "SUBSCRIPTION") == 0)
+ return 0;
+
+ /* Ignore it if section is not to be dumped/restored */
+ switch (curSection)
+ {
+ case SECTION_PRE_DATA:
+ if (!(ropt->dumpSections & DUMP_PRE_DATA))
+ return 0;
+ break;
+ case SECTION_DATA:
+ if (!(ropt->dumpSections & DUMP_DATA))
+ return 0;
+ break;
+ case SECTION_POST_DATA:
+ if (!(ropt->dumpSections & DUMP_POST_DATA))
+ return 0;
+ break;
+ default:
+ /* shouldn't get here, really, but ignore it */
+ return 0;
+ }
+
+ /* Ignore it if rejected by idWanted[] (cf. SortTocFromFile) */
+ if (ropt->idWanted && !ropt->idWanted[te->dumpId - 1])
+ return 0;
+
+ /*
+ * Check options for selective dump/restore.
+ */
+ if (strcmp(te->desc, "ACL") == 0 ||
+ strcmp(te->desc, "COMMENT") == 0 ||
+ strcmp(te->desc, "SECURITY LABEL") == 0)
+ {
+ /* Database properties react to createDB, not selectivity options. */
+ if (strncmp(te->tag, "DATABASE ", 9) == 0)
+ {
+ if (!ropt->createDB)
+ return 0;
+ }
+ else if (ropt->schemaNames.head != NULL ||
+ ropt->schemaExcludeNames.head != NULL ||
+ ropt->selTypes)
+ {
+ /*
+ * In a selective dump/restore, we want to restore these dependent
+ * TOC entry types only if their parent object is being restored.
+ * Without selectivity options, we let through everything in the
+ * archive. Note there may be such entries with no parent, eg
+ * non-default ACLs for built-in objects. Also, we make
+ * per-column ACLs additionally depend on the table's ACL if any
+ * to ensure correct restore order, so those dependencies should
+ * be ignored in this check.
+ *
+ * This code depends on the parent having been marked already,
+ * which should be the case; if it isn't, perhaps due to
+ * SortTocFromFile rearrangement, skipping the dependent entry
+ * seems prudent anyway.
+ *
+ * Ideally we'd handle, eg, table CHECK constraints this way too.
+ * But it's hard to tell which of their dependencies is the one to
+ * consult.
+ */
+ bool dumpthis = false;
+
+ for (int i = 0; i < te->nDeps; i++)
+ {
+ TocEntry *pte = getTocEntryByDumpId(AH, te->dependencies[i]);
+
+ if (!pte)
+ continue; /* probably shouldn't happen */
+ if (strcmp(pte->desc, "ACL") == 0)
+ continue; /* ignore dependency on another ACL */
+ if (pte->reqs == 0)
+ continue; /* this object isn't marked, so ignore it */
+ /* Found a parent to be dumped, so we want to dump this too */
+ dumpthis = true;
+ break;
+ }
+ if (!dumpthis)
+ return 0;
+ }
+ }
+ else
+ {
+ /* Apply selective-restore rules for standalone TOC entries. */
+ if (ropt->schemaNames.head != NULL)
+ {
+ /* If no namespace is specified, it means all. */
+ if (!te->namespace)
+ return 0;
+ if (!simple_string_list_member(&ropt->schemaNames, te->namespace))
+ return 0;
+ }
+
+ if (ropt->schemaExcludeNames.head != NULL &&
+ te->namespace &&
+ simple_string_list_member(&ropt->schemaExcludeNames, te->namespace))
+ return 0;
+
+ if (ropt->selTypes)
+ {
+ if (strcmp(te->desc, "TABLE") == 0 ||
+ strcmp(te->desc, "TABLE DATA") == 0 ||
+ strcmp(te->desc, "VIEW") == 0 ||
+ strcmp(te->desc, "FOREIGN TABLE") == 0 ||
+ strcmp(te->desc, "MATERIALIZED VIEW") == 0 ||
+ strcmp(te->desc, "MATERIALIZED VIEW DATA") == 0 ||
+ strcmp(te->desc, "SEQUENCE") == 0 ||
+ strcmp(te->desc, "SEQUENCE SET") == 0)
+ {
+ if (!ropt->selTable)
+ return 0;
+ if (ropt->tableNames.head != NULL &&
+ !simple_string_list_member(&ropt->tableNames, te->tag))
+ return 0;
+ }
+ else if (strcmp(te->desc, "INDEX") == 0)
+ {
+ if (!ropt->selIndex)
+ return 0;
+ if (ropt->indexNames.head != NULL &&
+ !simple_string_list_member(&ropt->indexNames, te->tag))
+ return 0;
+ }
+ else if (strcmp(te->desc, "FUNCTION") == 0 ||
+ strcmp(te->desc, "AGGREGATE") == 0 ||
+ strcmp(te->desc, "PROCEDURE") == 0)
+ {
+ if (!ropt->selFunction)
+ return 0;
+ if (ropt->functionNames.head != NULL &&
+ !simple_string_list_member(&ropt->functionNames, te->tag))
+ return 0;
+ }
+ else if (strcmp(te->desc, "TRIGGER") == 0)
+ {
+ if (!ropt->selTrigger)
+ return 0;
+ if (ropt->triggerNames.head != NULL &&
+ !simple_string_list_member(&ropt->triggerNames, te->tag))
+ return 0;
+ }
+ else
+ return 0;
+ }
+ }
+
+ /*
+ * Determine whether the TOC entry contains schema and/or data components,
+ * and mask off inapplicable REQ bits. If it had a dataDumper, assume
+ * it's both schema and data. Otherwise it's probably schema-only, but
+ * there are exceptions.
+ */
+ if (!te->hadDumper)
+ {
+ /*
+ * Special Case: If 'SEQUENCE SET' or anything to do with BLOBs, then
+ * it is considered a data entry. We don't need to check for the
+ * BLOBS entry or old-style BLOB COMMENTS, because they will have
+ * hadDumper = true ... but we do need to check new-style BLOB ACLs,
+ * comments, etc.
+ */
+ if (strcmp(te->desc, "SEQUENCE SET") == 0 ||
+ strcmp(te->desc, "BLOB") == 0 ||
+ (strcmp(te->desc, "ACL") == 0 &&
+ strncmp(te->tag, "LARGE OBJECT ", 13) == 0) ||
+ (strcmp(te->desc, "COMMENT") == 0 &&
+ strncmp(te->tag, "LARGE OBJECT ", 13) == 0) ||
+ (strcmp(te->desc, "SECURITY LABEL") == 0 &&
+ strncmp(te->tag, "LARGE OBJECT ", 13) == 0))
+ res = res & REQ_DATA;
+ else
+ res = res & ~REQ_DATA;
+ }
+
+ /*
+ * If there's no definition command, there's no schema component. Treat
+ * "load via partition root" comments as not schema.
+ */
+ if (!te->defn || !te->defn[0] ||
+ strncmp(te->defn, "-- load via partition root ", 27) == 0)
+ res = res & ~REQ_SCHEMA;
+
+ /*
+ * Special case: <Init> type with <Max OID> tag; this is obsolete and we
+ * always ignore it.
+ */
+ if ((strcmp(te->desc, "<Init>") == 0) && (strcmp(te->tag, "Max OID") == 0))
+ return 0;
+
+ /* Mask it if we only want schema */
+ if (ropt->schemaOnly)
+ {
+ /*
+ * The sequence_data option overrides schemaOnly for SEQUENCE SET.
+ *
+ * In binary-upgrade mode, even with schemaOnly set, we do not mask
+ * out large objects. (Only large object definitions, comments and
+ * other metadata should be generated in binary-upgrade mode, not the
+ * actual data, but that need not concern us here.)
+ */
+ if (!(ropt->sequence_data && strcmp(te->desc, "SEQUENCE SET") == 0) &&
+ !(ropt->binary_upgrade &&
+ (strcmp(te->desc, "BLOB") == 0 ||
+ (strcmp(te->desc, "ACL") == 0 &&
+ strncmp(te->tag, "LARGE OBJECT ", 13) == 0) ||
+ (strcmp(te->desc, "COMMENT") == 0 &&
+ strncmp(te->tag, "LARGE OBJECT ", 13) == 0) ||
+ (strcmp(te->desc, "SECURITY LABEL") == 0 &&
+ strncmp(te->tag, "LARGE OBJECT ", 13) == 0))))
+ res = res & REQ_SCHEMA;
+ }
+
+ /* Mask it if we only want data */
+ if (ropt->dataOnly)
+ res = res & REQ_DATA;
+
+ return res;
+}
+
+/*
+ * Identify which pass we should restore this TOC entry in.
+ *
+ * See notes with the RestorePass typedef in pg_backup_archiver.h.
+ */
+static RestorePass
+_tocEntryRestorePass(TocEntry *te)
+{
+ /* "ACL LANGUAGE" was a crock emitted only in PG 7.4 */
+ if (strcmp(te->desc, "ACL") == 0 ||
+ strcmp(te->desc, "ACL LANGUAGE") == 0 ||
+ strcmp(te->desc, "DEFAULT ACL") == 0)
+ return RESTORE_PASS_ACL;
+ if (strcmp(te->desc, "EVENT TRIGGER") == 0 ||
+ strcmp(te->desc, "MATERIALIZED VIEW DATA") == 0)
+ return RESTORE_PASS_POST_ACL;
+
+ /*
+ * Comments need to be emitted in the same pass as their parent objects.
+ * ACLs haven't got comments, and neither do matview data objects, but
+ * event triggers do. (Fortunately, event triggers haven't got ACLs, or
+ * we'd need yet another weird special case.)
+ */
+ if (strcmp(te->desc, "COMMENT") == 0 &&
+ strncmp(te->tag, "EVENT TRIGGER ", 14) == 0)
+ return RESTORE_PASS_POST_ACL;
+
+ /* All else can be handled in the main pass. */
+ return RESTORE_PASS_MAIN;
+}
+
+/*
+ * Identify TOC entries that are ACLs.
+ *
+ * Note: it seems worth duplicating some code here to avoid a hard-wired
+ * assumption that these are exactly the same entries that we restore during
+ * the RESTORE_PASS_ACL phase.
+ */
+static bool
+_tocEntryIsACL(TocEntry *te)
+{
+ /* "ACL LANGUAGE" was a crock emitted only in PG 7.4 */
+ if (strcmp(te->desc, "ACL") == 0 ||
+ strcmp(te->desc, "ACL LANGUAGE") == 0 ||
+ strcmp(te->desc, "DEFAULT ACL") == 0)
+ return true;
+ return false;
+}
+
+/*
+ * Issue SET commands for parameters that we want to have set the same way
+ * at all times during execution of a restore script.
+ */
+static void
+_doSetFixedOutputState(ArchiveHandle *AH)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+
+ /*
+ * Disable timeouts to allow for slow commands, idle parallel workers, etc
+ */
+ ahprintf(AH, "SET statement_timeout = 0;\n");
+ ahprintf(AH, "SET lock_timeout = 0;\n");
+ ahprintf(AH, "SET idle_in_transaction_session_timeout = 0;\n");
+
+ /* Select the correct character set encoding */
+ ahprintf(AH, "SET client_encoding = '%s';\n",
+ pg_encoding_to_char(AH->public.encoding));
+
+ /* Select the correct string literal syntax */
+ ahprintf(AH, "SET standard_conforming_strings = %s;\n",
+ AH->public.std_strings ? "on" : "off");
+
+ /* Select the role to be used during restore */
+ if (ropt && ropt->use_role)
+ ahprintf(AH, "SET ROLE %s;\n", fmtId(ropt->use_role));
+
+ /* Select the dump-time search_path */
+ if (AH->public.searchpath)
+ ahprintf(AH, "%s", AH->public.searchpath);
+
+ /* Make sure function checking is disabled */
+ ahprintf(AH, "SET check_function_bodies = false;\n");
+
+ /* Ensure that all valid XML data will be accepted */
+ ahprintf(AH, "SET xmloption = content;\n");
+
+ /* Avoid annoying notices etc */
+ ahprintf(AH, "SET client_min_messages = warning;\n");
+ if (!AH->public.std_strings)
+ ahprintf(AH, "SET escape_string_warning = off;\n");
+
+ /* Adjust row-security state */
+ if (ropt && ropt->enable_row_security)
+ ahprintf(AH, "SET row_security = on;\n");
+ else
+ ahprintf(AH, "SET row_security = off;\n");
+
+ ahprintf(AH, "\n");
+}
+
+/*
+ * Issue a SET SESSION AUTHORIZATION command. Caller is responsible
+ * for updating state if appropriate. If user is NULL or an empty string,
+ * the specification DEFAULT will be used.
+ */
+static void
+_doSetSessionAuth(ArchiveHandle *AH, const char *user)
+{
+ PQExpBuffer cmd = createPQExpBuffer();
+
+ appendPQExpBufferStr(cmd, "SET SESSION AUTHORIZATION ");
+
+ /*
+ * SQL requires a string literal here. Might as well be correct.
+ */
+ if (user && *user)
+ appendStringLiteralAHX(cmd, user, AH);
+ else
+ appendPQExpBufferStr(cmd, "DEFAULT");
+ appendPQExpBufferChar(cmd, ';');
+
+ if (RestoringToDB(AH))
+ {
+ PGresult *res;
+
+ res = PQexec(AH->connection, cmd->data);
+
+ if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
+ /* NOT warn_or_exit_horribly... use -O instead to skip this. */
+ pg_fatal("could not set session user to \"%s\": %s",
+ user, PQerrorMessage(AH->connection));
+
+ PQclear(res);
+ }
+ else
+ ahprintf(AH, "%s\n\n", cmd->data);
+
+ destroyPQExpBuffer(cmd);
+}
+
+
+/*
+ * Issue the commands to connect to the specified database.
+ *
+ * If we're currently restoring right into a database, this will
+ * actually establish a connection. Otherwise it puts a \connect into
+ * the script output.
+ */
+static void
+_reconnectToDB(ArchiveHandle *AH, const char *dbname)
+{
+ if (RestoringToDB(AH))
+ ReconnectToServer(AH, dbname);
+ else
+ {
+ PQExpBufferData connectbuf;
+
+ initPQExpBuffer(&connectbuf);
+ appendPsqlMetaConnect(&connectbuf, dbname);
+ ahprintf(AH, "%s\n", connectbuf.data);
+ termPQExpBuffer(&connectbuf);
+ }
+
+ /*
+ * NOTE: currUser keeps track of what the imaginary session user in our
+ * script is. It's now effectively reset to the original userID.
+ */
+ if (AH->currUser)
+ free(AH->currUser);
+ AH->currUser = NULL;
+
+ /* don't assume we still know the output schema, tablespace, etc either */
+ if (AH->currSchema)
+ free(AH->currSchema);
+ AH->currSchema = NULL;
+
+ if (AH->currTableAm)
+ free(AH->currTableAm);
+ AH->currTableAm = NULL;
+
+ if (AH->currTablespace)
+ free(AH->currTablespace);
+ AH->currTablespace = NULL;
+
+ /* re-establish fixed state */
+ _doSetFixedOutputState(AH);
+}
+
+/*
+ * Become the specified user, and update state to avoid redundant commands
+ *
+ * NULL or empty argument is taken to mean restoring the session default
+ */
+static void
+_becomeUser(ArchiveHandle *AH, const char *user)
+{
+ if (!user)
+ user = ""; /* avoid null pointers */
+
+ if (AH->currUser && strcmp(AH->currUser, user) == 0)
+ return; /* no need to do anything */
+
+ _doSetSessionAuth(AH, user);
+
+ /*
+ * NOTE: currUser keeps track of what the imaginary session user in our
+ * script is
+ */
+ if (AH->currUser)
+ free(AH->currUser);
+ AH->currUser = pg_strdup(user);
+}
+
+/*
+ * Become the owner of the given TOC entry object. If
+ * changes in ownership are not allowed, this doesn't do anything.
+ */
+static void
+_becomeOwner(ArchiveHandle *AH, TocEntry *te)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+
+ if (ropt && (ropt->noOwner || !ropt->use_setsessauth))
+ return;
+
+ _becomeUser(AH, te->owner);
+}
+
+
+/*
+ * Issue the commands to select the specified schema as the current schema
+ * in the target database.
+ */
+static void
+_selectOutputSchema(ArchiveHandle *AH, const char *schemaName)
+{
+ PQExpBuffer qry;
+
+ /*
+ * If there was a SEARCHPATH TOC entry, we're supposed to just stay with
+ * that search_path rather than switching to entry-specific paths.
+ * Otherwise, it's an old archive that will not restore correctly unless
+ * we set the search_path as it's expecting.
+ */
+ if (AH->public.searchpath)
+ return;
+
+ if (!schemaName || *schemaName == '\0' ||
+ (AH->currSchema && strcmp(AH->currSchema, schemaName) == 0))
+ return; /* no need to do anything */
+
+ qry = createPQExpBuffer();
+
+ appendPQExpBuffer(qry, "SET search_path = %s",
+ fmtId(schemaName));
+ if (strcmp(schemaName, "pg_catalog") != 0)
+ appendPQExpBufferStr(qry, ", pg_catalog");
+
+ if (RestoringToDB(AH))
+ {
+ PGresult *res;
+
+ res = PQexec(AH->connection, qry->data);
+
+ if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
+ warn_or_exit_horribly(AH,
+ "could not set search_path to \"%s\": %s",
+ schemaName, PQerrorMessage(AH->connection));
+
+ PQclear(res);
+ }
+ else
+ ahprintf(AH, "%s;\n\n", qry->data);
+
+ if (AH->currSchema)
+ free(AH->currSchema);
+ AH->currSchema = pg_strdup(schemaName);
+
+ destroyPQExpBuffer(qry);
+}
+
+/*
+ * Issue the commands to select the specified tablespace as the current one
+ * in the target database.
+ */
+static void
+_selectTablespace(ArchiveHandle *AH, const char *tablespace)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+ PQExpBuffer qry;
+ const char *want,
+ *have;
+
+ /* do nothing in --no-tablespaces mode */
+ if (ropt->noTablespace)
+ return;
+
+ have = AH->currTablespace;
+ want = tablespace;
+
+ /* no need to do anything for non-tablespace object */
+ if (!want)
+ return;
+
+ if (have && strcmp(want, have) == 0)
+ return; /* no need to do anything */
+
+ qry = createPQExpBuffer();
+
+ if (strcmp(want, "") == 0)
+ {
+ /* We want the tablespace to be the database's default */
+ appendPQExpBufferStr(qry, "SET default_tablespace = ''");
+ }
+ else
+ {
+ /* We want an explicit tablespace */
+ appendPQExpBuffer(qry, "SET default_tablespace = %s", fmtId(want));
+ }
+
+ if (RestoringToDB(AH))
+ {
+ PGresult *res;
+
+ res = PQexec(AH->connection, qry->data);
+
+ if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
+ warn_or_exit_horribly(AH,
+ "could not set default_tablespace to %s: %s",
+ fmtId(want), PQerrorMessage(AH->connection));
+
+ PQclear(res);
+ }
+ else
+ ahprintf(AH, "%s;\n\n", qry->data);
+
+ if (AH->currTablespace)
+ free(AH->currTablespace);
+ AH->currTablespace = pg_strdup(want);
+
+ destroyPQExpBuffer(qry);
+}
+
+/*
+ * Set the proper default_table_access_method value for the table.
+ */
+static void
+_selectTableAccessMethod(ArchiveHandle *AH, const char *tableam)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+ PQExpBuffer cmd;
+ const char *want,
+ *have;
+
+ /* do nothing in --no-table-access-method mode */
+ if (ropt->noTableAm)
+ return;
+
+ have = AH->currTableAm;
+ want = tableam;
+
+ if (!want)
+ return;
+
+ if (have && strcmp(want, have) == 0)
+ return;
+
+ cmd = createPQExpBuffer();
+ appendPQExpBuffer(cmd, "SET default_table_access_method = %s;", fmtId(want));
+
+ if (RestoringToDB(AH))
+ {
+ PGresult *res;
+
+ res = PQexec(AH->connection, cmd->data);
+
+ if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
+ warn_or_exit_horribly(AH,
+ "could not set default_table_access_method: %s",
+ PQerrorMessage(AH->connection));
+
+ PQclear(res);
+ }
+ else
+ ahprintf(AH, "%s\n\n", cmd->data);
+
+ destroyPQExpBuffer(cmd);
+
+ if (AH->currTableAm)
+ free(AH->currTableAm);
+ AH->currTableAm = pg_strdup(want);
+}
+
+/*
+ * Extract an object description for a TOC entry, and append it to buf.
+ *
+ * This is used for ALTER ... OWNER TO.
+ */
+static void
+_getObjectDescription(PQExpBuffer buf, TocEntry *te)
+{
+ const char *type = te->desc;
+
+ /* Use ALTER TABLE for views and sequences */
+ if (strcmp(type, "VIEW") == 0 || strcmp(type, "SEQUENCE") == 0 ||
+ strcmp(type, "MATERIALIZED VIEW") == 0)
+ type = "TABLE";
+
+ /* objects that don't require special decoration */
+ if (strcmp(type, "COLLATION") == 0 ||
+ strcmp(type, "CONVERSION") == 0 ||
+ strcmp(type, "DOMAIN") == 0 ||
+ strcmp(type, "TABLE") == 0 ||
+ strcmp(type, "TYPE") == 0 ||
+ strcmp(type, "FOREIGN TABLE") == 0 ||
+ strcmp(type, "TEXT SEARCH DICTIONARY") == 0 ||
+ strcmp(type, "TEXT SEARCH CONFIGURATION") == 0 ||
+ strcmp(type, "STATISTICS") == 0 ||
+ /* non-schema-specified objects */
+ strcmp(type, "DATABASE") == 0 ||
+ strcmp(type, "PROCEDURAL LANGUAGE") == 0 ||
+ strcmp(type, "SCHEMA") == 0 ||
+ strcmp(type, "EVENT TRIGGER") == 0 ||
+ strcmp(type, "FOREIGN DATA WRAPPER") == 0 ||
+ strcmp(type, "SERVER") == 0 ||
+ strcmp(type, "PUBLICATION") == 0 ||
+ strcmp(type, "SUBSCRIPTION") == 0 ||
+ strcmp(type, "USER MAPPING") == 0)
+ {
+ appendPQExpBuffer(buf, "%s ", type);
+ if (te->namespace && *te->namespace)
+ appendPQExpBuffer(buf, "%s.", fmtId(te->namespace));
+ appendPQExpBufferStr(buf, fmtId(te->tag));
+ return;
+ }
+
+ /* BLOBs just have a name, but it's numeric so must not use fmtId */
+ if (strcmp(type, "BLOB") == 0)
+ {
+ appendPQExpBuffer(buf, "LARGE OBJECT %s", te->tag);
+ return;
+ }
+
+ /*
+ * These object types require additional decoration. Fortunately, the
+ * information needed is exactly what's in the DROP command.
+ */
+ if (strcmp(type, "AGGREGATE") == 0 ||
+ strcmp(type, "FUNCTION") == 0 ||
+ strcmp(type, "OPERATOR") == 0 ||
+ strcmp(type, "OPERATOR CLASS") == 0 ||
+ strcmp(type, "OPERATOR FAMILY") == 0 ||
+ strcmp(type, "PROCEDURE") == 0)
+ {
+ /* Chop "DROP " off the front and make a modifiable copy */
+ char *first = pg_strdup(te->dropStmt + 5);
+ char *last;
+
+ /* point to last character in string */
+ last = first + strlen(first) - 1;
+
+ /* Strip off any ';' or '\n' at the end */
+ while (last >= first && (*last == '\n' || *last == ';'))
+ last--;
+ *(last + 1) = '\0';
+
+ appendPQExpBufferStr(buf, first);
+
+ free(first);
+ return;
+ }
+
+ pg_log_warning("don't know how to set owner for object type \"%s\"",
+ type);
+}
+
+/*
+ * Emit the SQL commands to create the object represented by a TOC entry
+ *
+ * This now also includes issuing an ALTER OWNER command to restore the
+ * object's ownership, if wanted. But note that the object's permissions
+ * will remain at default, until the matching ACL TOC entry is restored.
+ */
+static void
+_printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+
+ /* Select owner, schema, tablespace and default AM as necessary */
+ _becomeOwner(AH, te);
+ _selectOutputSchema(AH, te->namespace);
+ _selectTablespace(AH, te->tablespace);
+ _selectTableAccessMethod(AH, te->tableam);
+
+ /* Emit header comment for item */
+ if (!AH->noTocComments)
+ {
+ const char *pfx;
+ char *sanitized_name;
+ char *sanitized_schema;
+ char *sanitized_owner;
+
+ if (isData)
+ pfx = "Data for ";
+ else
+ pfx = "";
+
+ ahprintf(AH, "--\n");
+ if (AH->public.verbose)
+ {
+ ahprintf(AH, "-- TOC entry %d (class %u OID %u)\n",
+ te->dumpId, te->catalogId.tableoid, te->catalogId.oid);
+ if (te->nDeps > 0)
+ {
+ int i;
+
+ ahprintf(AH, "-- Dependencies:");
+ for (i = 0; i < te->nDeps; i++)
+ ahprintf(AH, " %d", te->dependencies[i]);
+ ahprintf(AH, "\n");
+ }
+ }
+
+ sanitized_name = sanitize_line(te->tag, false);
+ sanitized_schema = sanitize_line(te->namespace, true);
+ sanitized_owner = sanitize_line(ropt->noOwner ? NULL : te->owner, true);
+
+ ahprintf(AH, "-- %sName: %s; Type: %s; Schema: %s; Owner: %s",
+ pfx, sanitized_name, te->desc, sanitized_schema,
+ sanitized_owner);
+
+ free(sanitized_name);
+ free(sanitized_schema);
+ free(sanitized_owner);
+
+ if (te->tablespace && strlen(te->tablespace) > 0 && !ropt->noTablespace)
+ {
+ char *sanitized_tablespace;
+
+ sanitized_tablespace = sanitize_line(te->tablespace, false);
+ ahprintf(AH, "; Tablespace: %s", sanitized_tablespace);
+ free(sanitized_tablespace);
+ }
+ ahprintf(AH, "\n");
+
+ if (AH->PrintExtraTocPtr != NULL)
+ AH->PrintExtraTocPtr(AH, te);
+ ahprintf(AH, "--\n\n");
+ }
+
+ /*
+ * Actually print the definition.
+ *
+ * Really crude hack for suppressing AUTHORIZATION clause that old pg_dump
+ * versions put into CREATE SCHEMA. Don't mutate the variant for schema
+ * "public" that is a comment. We have to do this when --no-owner mode is
+ * selected. This is ugly, but I see no other good way ...
+ */
+ if (ropt->noOwner &&
+ strcmp(te->desc, "SCHEMA") == 0 && strncmp(te->defn, "--", 2) != 0)
+ {
+ ahprintf(AH, "CREATE SCHEMA %s;\n\n\n", fmtId(te->tag));
+ }
+ else
+ {
+ if (te->defn && strlen(te->defn) > 0)
+ ahprintf(AH, "%s\n\n", te->defn);
+ }
+
+ /*
+ * If we aren't using SET SESSION AUTH to determine ownership, we must
+ * instead issue an ALTER OWNER command. Schema "public" is special; when
+ * a dump emits a comment in lieu of creating it, we use ALTER OWNER even
+ * when using SET SESSION for all other objects. We assume that anything
+ * without a DROP command is not a separately ownable object. All the
+ * categories with DROP commands must appear in one list or the other.
+ */
+ if (!ropt->noOwner &&
+ (!ropt->use_setsessauth ||
+ (strcmp(te->desc, "SCHEMA") == 0 &&
+ strncmp(te->defn, "--", 2) == 0)) &&
+ te->owner && strlen(te->owner) > 0 &&
+ te->dropStmt && strlen(te->dropStmt) > 0)
+ {
+ if (strcmp(te->desc, "AGGREGATE") == 0 ||
+ strcmp(te->desc, "BLOB") == 0 ||
+ strcmp(te->desc, "COLLATION") == 0 ||
+ strcmp(te->desc, "CONVERSION") == 0 ||
+ strcmp(te->desc, "DATABASE") == 0 ||
+ strcmp(te->desc, "DOMAIN") == 0 ||
+ strcmp(te->desc, "FUNCTION") == 0 ||
+ strcmp(te->desc, "OPERATOR") == 0 ||
+ strcmp(te->desc, "OPERATOR CLASS") == 0 ||
+ strcmp(te->desc, "OPERATOR FAMILY") == 0 ||
+ strcmp(te->desc, "PROCEDURE") == 0 ||
+ strcmp(te->desc, "PROCEDURAL LANGUAGE") == 0 ||
+ strcmp(te->desc, "SCHEMA") == 0 ||
+ strcmp(te->desc, "EVENT TRIGGER") == 0 ||
+ strcmp(te->desc, "TABLE") == 0 ||
+ strcmp(te->desc, "TYPE") == 0 ||
+ strcmp(te->desc, "VIEW") == 0 ||
+ strcmp(te->desc, "MATERIALIZED VIEW") == 0 ||
+ strcmp(te->desc, "SEQUENCE") == 0 ||
+ strcmp(te->desc, "FOREIGN TABLE") == 0 ||
+ strcmp(te->desc, "TEXT SEARCH DICTIONARY") == 0 ||
+ strcmp(te->desc, "TEXT SEARCH CONFIGURATION") == 0 ||
+ strcmp(te->desc, "FOREIGN DATA WRAPPER") == 0 ||
+ strcmp(te->desc, "SERVER") == 0 ||
+ strcmp(te->desc, "STATISTICS") == 0 ||
+ strcmp(te->desc, "PUBLICATION") == 0 ||
+ strcmp(te->desc, "SUBSCRIPTION") == 0)
+ {
+ PQExpBuffer temp = createPQExpBuffer();
+
+ appendPQExpBufferStr(temp, "ALTER ");
+ _getObjectDescription(temp, te);
+ appendPQExpBuffer(temp, " OWNER TO %s;", fmtId(te->owner));
+ ahprintf(AH, "%s\n\n", temp->data);
+ destroyPQExpBuffer(temp);
+ }
+ else if (strcmp(te->desc, "CAST") == 0 ||
+ strcmp(te->desc, "CHECK CONSTRAINT") == 0 ||
+ strcmp(te->desc, "CONSTRAINT") == 0 ||
+ strcmp(te->desc, "DATABASE PROPERTIES") == 0 ||
+ strcmp(te->desc, "DEFAULT") == 0 ||
+ strcmp(te->desc, "FK CONSTRAINT") == 0 ||
+ strcmp(te->desc, "INDEX") == 0 ||
+ strcmp(te->desc, "RULE") == 0 ||
+ strcmp(te->desc, "TRIGGER") == 0 ||
+ strcmp(te->desc, "ROW SECURITY") == 0 ||
+ strcmp(te->desc, "POLICY") == 0 ||
+ strcmp(te->desc, "USER MAPPING") == 0)
+ {
+ /* these object types don't have separate owners */
+ }
+ else
+ {
+ pg_log_warning("don't know how to set owner for object type \"%s\"",
+ te->desc);
+ }
+ }
+
+ /*
+ * If it's an ACL entry, it might contain SET SESSION AUTHORIZATION
+ * commands, so we can no longer assume we know the current auth setting.
+ */
+ if (_tocEntryIsACL(te))
+ {
+ if (AH->currUser)
+ free(AH->currUser);
+ AH->currUser = NULL;
+ }
+}
+
+/*
+ * Sanitize a string to be included in an SQL comment or TOC listing, by
+ * replacing any newlines with spaces. This ensures each logical output line
+ * is in fact one physical output line, to prevent corruption of the dump
+ * (which could, in the worst case, present an SQL injection vulnerability
+ * if someone were to incautiously load a dump containing objects with
+ * maliciously crafted names).
+ *
+ * The result is a freshly malloc'd string. If the input string is NULL,
+ * return a malloc'ed empty string, unless want_hyphen, in which case return a
+ * malloc'ed hyphen.
+ *
+ * Note that we currently don't bother to quote names, meaning that the name
+ * fields aren't automatically parseable. "pg_restore -L" doesn't care because
+ * it only examines the dumpId field, but someday we might want to try harder.
+ */
+static char *
+sanitize_line(const char *str, bool want_hyphen)
+{
+ char *result;
+ char *s;
+
+ if (!str)
+ return pg_strdup(want_hyphen ? "-" : "");
+
+ result = pg_strdup(str);
+
+ for (s = result; *s != '\0'; s++)
+ {
+ if (*s == '\n' || *s == '\r')
+ *s = ' ';
+ }
+
+ return result;
+}
+
+/*
+ * Write the file header for a custom-format archive
+ */
+void
+WriteHead(ArchiveHandle *AH)
+{
+ struct tm crtm;
+
+ AH->WriteBufPtr(AH, "PGDMP", 5); /* Magic code */
+ AH->WriteBytePtr(AH, ARCHIVE_MAJOR(AH->version));
+ AH->WriteBytePtr(AH, ARCHIVE_MINOR(AH->version));
+ AH->WriteBytePtr(AH, ARCHIVE_REV(AH->version));
+ AH->WriteBytePtr(AH, AH->intSize);
+ AH->WriteBytePtr(AH, AH->offSize);
+ AH->WriteBytePtr(AH, AH->format);
+ WriteInt(AH, AH->compression);
+ crtm = *localtime(&AH->createDate);
+ WriteInt(AH, crtm.tm_sec);
+ WriteInt(AH, crtm.tm_min);
+ WriteInt(AH, crtm.tm_hour);
+ WriteInt(AH, crtm.tm_mday);
+ WriteInt(AH, crtm.tm_mon);
+ WriteInt(AH, crtm.tm_year);
+ WriteInt(AH, crtm.tm_isdst);
+ WriteStr(AH, PQdb(AH->connection));
+ WriteStr(AH, AH->public.remoteVersionStr);
+ WriteStr(AH, PG_VERSION);
+}
+
+void
+ReadHead(ArchiveHandle *AH)
+{
+ char vmaj,
+ vmin,
+ vrev;
+ int fmt;
+
+ /*
+ * If we haven't already read the header, do so.
+ *
+ * NB: this code must agree with _discoverArchiveFormat(). Maybe find a
+ * way to unify the cases?
+ */
+ if (!AH->readHeader)
+ {
+ char tmpMag[7];
+
+ AH->ReadBufPtr(AH, tmpMag, 5);
+
+ if (strncmp(tmpMag, "PGDMP", 5) != 0)
+ pg_fatal("did not find magic string in file header");
+ }
+
+ vmaj = AH->ReadBytePtr(AH);
+ vmin = AH->ReadBytePtr(AH);
+
+ if (vmaj > 1 || (vmaj == 1 && vmin > 0)) /* Version > 1.0 */
+ vrev = AH->ReadBytePtr(AH);
+ else
+ vrev = 0;
+
+ AH->version = MAKE_ARCHIVE_VERSION(vmaj, vmin, vrev);
+
+ if (AH->version < K_VERS_1_0 || AH->version > K_VERS_MAX)
+ pg_fatal("unsupported version (%d.%d) in file header",
+ vmaj, vmin);
+
+ AH->intSize = AH->ReadBytePtr(AH);
+ if (AH->intSize > 32)
+ pg_fatal("sanity check on integer size (%lu) failed",
+ (unsigned long) AH->intSize);
+
+ if (AH->intSize > sizeof(int))
+ pg_log_warning("archive was made on a machine with larger integers, some operations might fail");
+
+ if (AH->version >= K_VERS_1_7)
+ AH->offSize = AH->ReadBytePtr(AH);
+ else
+ AH->offSize = AH->intSize;
+
+ fmt = AH->ReadBytePtr(AH);
+
+ if (AH->format != fmt)
+ pg_fatal("expected format (%d) differs from format found in file (%d)",
+ AH->format, fmt);
+
+ if (AH->version >= K_VERS_1_2)
+ {
+ if (AH->version < K_VERS_1_4)
+ AH->compression = AH->ReadBytePtr(AH);
+ else
+ AH->compression = ReadInt(AH);
+ }
+ else
+ AH->compression = Z_DEFAULT_COMPRESSION;
+
+#ifndef HAVE_LIBZ
+ if (AH->compression != 0)
+ pg_log_warning("archive is compressed, but this installation does not support compression -- no data will be available");
+#endif
+
+ if (AH->version >= K_VERS_1_4)
+ {
+ struct tm crtm;
+
+ crtm.tm_sec = ReadInt(AH);
+ crtm.tm_min = ReadInt(AH);
+ crtm.tm_hour = ReadInt(AH);
+ crtm.tm_mday = ReadInt(AH);
+ crtm.tm_mon = ReadInt(AH);
+ crtm.tm_year = ReadInt(AH);
+ crtm.tm_isdst = ReadInt(AH);
+
+ /*
+ * Newer versions of glibc have mktime() report failure if tm_isdst is
+ * inconsistent with the prevailing timezone, e.g. tm_isdst = 1 when
+ * TZ=UTC. This is problematic when restoring an archive under a
+ * different timezone setting. If we get a failure, try again with
+ * tm_isdst set to -1 ("don't know").
+ *
+ * XXX with or without this hack, we reconstruct createDate
+ * incorrectly when the prevailing timezone is different from
+ * pg_dump's. Next time we bump the archive version, we should flush
+ * this representation and store a plain seconds-since-the-Epoch
+ * timestamp instead.
+ */
+ AH->createDate = mktime(&crtm);
+ if (AH->createDate == (time_t) -1)
+ {
+ crtm.tm_isdst = -1;
+ AH->createDate = mktime(&crtm);
+ if (AH->createDate == (time_t) -1)
+ pg_log_warning("invalid creation date in header");
+ }
+ }
+
+ if (AH->version >= K_VERS_1_4)
+ {
+ AH->archdbname = ReadStr(AH);
+ }
+
+ if (AH->version >= K_VERS_1_10)
+ {
+ AH->archiveRemoteVersion = ReadStr(AH);
+ AH->archiveDumpVersion = ReadStr(AH);
+ }
+}
+
+
+/*
+ * checkSeek
+ * check to see if ftell/fseek can be performed.
+ */
+bool
+checkSeek(FILE *fp)
+{
+ pgoff_t tpos;
+
+ /* Check that ftello works on this file */
+ tpos = ftello(fp);
+ if (tpos < 0)
+ return false;
+
+ /*
+ * Check that fseeko(SEEK_SET) works, too. NB: we used to try to test
+ * this with fseeko(fp, 0, SEEK_CUR). But some platforms treat that as a
+ * successful no-op even on files that are otherwise unseekable.
+ */
+ if (fseeko(fp, tpos, SEEK_SET) != 0)
+ return false;
+
+ return true;
+}
+
+
+/*
+ * dumpTimestamp
+ */
+static void
+dumpTimestamp(ArchiveHandle *AH, const char *msg, time_t tim)
+{
+ char buf[64];
+
+ if (strftime(buf, sizeof(buf), PGDUMP_STRFTIME_FMT, localtime(&tim)) != 0)
+ ahprintf(AH, "-- %s %s\n\n", msg, buf);
+}
+
+/*
+ * Main engine for parallel restore.
+ *
+ * Parallel restore is done in three phases. In this first phase,
+ * we'll process all SECTION_PRE_DATA TOC entries that are allowed to be
+ * processed in the RESTORE_PASS_MAIN pass. (In practice, that's all
+ * PRE_DATA items other than ACLs.) Entries we can't process now are
+ * added to the pending_list for later phases to deal with.
+ */
+static void
+restore_toc_entries_prefork(ArchiveHandle *AH, TocEntry *pending_list)
+{
+ bool skipped_some;
+ TocEntry *next_work_item;
+
+ pg_log_debug("entering restore_toc_entries_prefork");
+
+ /* Adjust dependency information */
+ fix_dependencies(AH);
+
+ /*
+ * Do all the early stuff in a single connection in the parent. There's no
+ * great point in running it in parallel, in fact it will actually run
+ * faster in a single connection because we avoid all the connection and
+ * setup overhead. Also, pre-9.2 pg_dump versions were not very good
+ * about showing all the dependencies of SECTION_PRE_DATA items, so we do
+ * not risk trying to process them out-of-order.
+ *
+ * Stuff that we can't do immediately gets added to the pending_list.
+ * Note: we don't yet filter out entries that aren't going to be restored.
+ * They might participate in dependency chains connecting entries that
+ * should be restored, so we treat them as live until we actually process
+ * them.
+ *
+ * Note: as of 9.2, it should be guaranteed that all PRE_DATA items appear
+ * before DATA items, and all DATA items before POST_DATA items. That is
+ * not certain to be true in older archives, though, and in any case use
+ * of a list file would destroy that ordering (cf. SortTocFromFile). So
+ * this loop cannot assume that it holds.
+ */
+ AH->restorePass = RESTORE_PASS_MAIN;
+ skipped_some = false;
+ for (next_work_item = AH->toc->next; next_work_item != AH->toc; next_work_item = next_work_item->next)
+ {
+ bool do_now = true;
+
+ if (next_work_item->section != SECTION_PRE_DATA)
+ {
+ /* DATA and POST_DATA items are just ignored for now */
+ if (next_work_item->section == SECTION_DATA ||
+ next_work_item->section == SECTION_POST_DATA)
+ {
+ do_now = false;
+ skipped_some = true;
+ }
+ else
+ {
+ /*
+ * SECTION_NONE items, such as comments, can be processed now
+ * if we are still in the PRE_DATA part of the archive. Once
+ * we've skipped any items, we have to consider whether the
+ * comment's dependencies are satisfied, so skip it for now.
+ */
+ if (skipped_some)
+ do_now = false;
+ }
+ }
+
+ /*
+ * Also skip items that need to be forced into later passes. We need
+ * not set skipped_some in this case, since by assumption no main-pass
+ * items could depend on these.
+ */
+ if (_tocEntryRestorePass(next_work_item) != RESTORE_PASS_MAIN)
+ do_now = false;
+
+ if (do_now)
+ {
+ /* OK, restore the item and update its dependencies */
+ pg_log_info("processing item %d %s %s",
+ next_work_item->dumpId,
+ next_work_item->desc, next_work_item->tag);
+
+ (void) restore_toc_entry(AH, next_work_item, false);
+
+ /* Reduce dependencies, but don't move anything to ready_list */
+ reduce_dependencies(AH, next_work_item, NULL);
+ }
+ else
+ {
+ /* Nope, so add it to pending_list */
+ pending_list_append(pending_list, next_work_item);
+ }
+ }
+
+ /*
+ * Now close parent connection in prep for parallel steps. We do this
+ * mainly to ensure that we don't exceed the specified number of parallel
+ * connections.
+ */
+ DisconnectDatabase(&AH->public);
+
+ /* blow away any transient state from the old connection */
+ if (AH->currUser)
+ free(AH->currUser);
+ AH->currUser = NULL;
+ if (AH->currSchema)
+ free(AH->currSchema);
+ AH->currSchema = NULL;
+ if (AH->currTablespace)
+ free(AH->currTablespace);
+ AH->currTablespace = NULL;
+ if (AH->currTableAm)
+ free(AH->currTableAm);
+ AH->currTableAm = NULL;
+}
+
+/*
+ * Main engine for parallel restore.
+ *
+ * Parallel restore is done in three phases. In this second phase,
+ * we process entries by dispatching them to parallel worker children
+ * (processes on Unix, threads on Windows), each of which connects
+ * separately to the database. Inter-entry dependencies are respected,
+ * and so is the RestorePass multi-pass structure. When we can no longer
+ * make any entries ready to process, we exit. Normally, there will be
+ * nothing left to do; but if there is, the third phase will mop up.
+ */
+static void
+restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate,
+ TocEntry *pending_list)
+{
+ ParallelReadyList ready_list;
+ TocEntry *next_work_item;
+
+ pg_log_debug("entering restore_toc_entries_parallel");
+
+ /* Set up ready_list with enough room for all known TocEntrys */
+ ready_list_init(&ready_list, AH->tocCount);
+
+ /*
+ * The pending_list contains all items that we need to restore. Move all
+ * items that are available to process immediately into the ready_list.
+ * After this setup, the pending list is everything that needs to be done
+ * but is blocked by one or more dependencies, while the ready list
+ * contains items that have no remaining dependencies and are OK to
+ * process in the current restore pass.
+ */
+ AH->restorePass = RESTORE_PASS_MAIN;
+ move_to_ready_list(pending_list, &ready_list, AH->restorePass);
+
+ /*
+ * main parent loop
+ *
+ * Keep going until there is no worker still running AND there is no work
+ * left to be done. Note invariant: at top of loop, there should always
+ * be at least one worker available to dispatch a job to.
+ */
+ pg_log_info("entering main parallel loop");
+
+ for (;;)
+ {
+ /* Look for an item ready to be dispatched to a worker */
+ next_work_item = pop_next_work_item(&ready_list, pstate);
+ if (next_work_item != NULL)
+ {
+ /* If not to be restored, don't waste time launching a worker */
+ if ((next_work_item->reqs & (REQ_SCHEMA | REQ_DATA)) == 0)
+ {
+ pg_log_info("skipping item %d %s %s",
+ next_work_item->dumpId,
+ next_work_item->desc, next_work_item->tag);
+ /* Update its dependencies as though we'd completed it */
+ reduce_dependencies(AH, next_work_item, &ready_list);
+ /* Loop around to see if anything else can be dispatched */
+ continue;
+ }
+
+ pg_log_info("launching item %d %s %s",
+ next_work_item->dumpId,
+ next_work_item->desc, next_work_item->tag);
+
+ /* Dispatch to some worker */
+ DispatchJobForTocEntry(AH, pstate, next_work_item, ACT_RESTORE,
+ mark_restore_job_done, &ready_list);
+ }
+ else if (IsEveryWorkerIdle(pstate))
+ {
+ /*
+ * Nothing is ready and no worker is running, so we're done with
+ * the current pass or maybe with the whole process.
+ */
+ if (AH->restorePass == RESTORE_PASS_LAST)
+ break; /* No more parallel processing is possible */
+
+ /* Advance to next restore pass */
+ AH->restorePass++;
+ /* That probably allows some stuff to be made ready */
+ move_to_ready_list(pending_list, &ready_list, AH->restorePass);
+ /* Loop around to see if anything's now ready */
+ continue;
+ }
+ else
+ {
+ /*
+ * We have nothing ready, but at least one child is working, so
+ * wait for some subjob to finish.
+ */
+ }
+
+ /*
+ * Before dispatching another job, check to see if anything has
+ * finished. We should check every time through the loop so as to
+ * reduce dependencies as soon as possible. If we were unable to
+ * dispatch any job this time through, wait until some worker finishes
+ * (and, hopefully, unblocks some pending item). If we did dispatch
+ * something, continue as soon as there's at least one idle worker.
+ * Note that in either case, there's guaranteed to be at least one
+ * idle worker when we return to the top of the loop. This ensures we
+ * won't block inside DispatchJobForTocEntry, which would be
+ * undesirable: we'd rather postpone dispatching until we see what's
+ * been unblocked by finished jobs.
+ */
+ WaitForWorkers(AH, pstate,
+ next_work_item ? WFW_ONE_IDLE : WFW_GOT_STATUS);
+ }
+
+ /* There should now be nothing in ready_list. */
+ Assert(ready_list.first_te > ready_list.last_te);
+
+ ready_list_free(&ready_list);
+
+ pg_log_info("finished main parallel loop");
+}
+
+/*
+ * Main engine for parallel restore.
+ *
+ * Parallel restore is done in three phases. In this third phase,
+ * we mop up any remaining TOC entries by processing them serially.
+ * This phase normally should have nothing to do, but if we've somehow
+ * gotten stuck due to circular dependencies or some such, this provides
+ * at least some chance of completing the restore successfully.
+ */
+static void
+restore_toc_entries_postfork(ArchiveHandle *AH, TocEntry *pending_list)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+ TocEntry *te;
+
+ pg_log_debug("entering restore_toc_entries_postfork");
+
+ /*
+ * Now reconnect the single parent connection.
+ */
+ ConnectDatabase((Archive *) AH, &ropt->cparams, true);
+
+ /* re-establish fixed state */
+ _doSetFixedOutputState(AH);
+
+ /*
+ * Make sure there is no work left due to, say, circular dependencies, or
+ * some other pathological condition. If so, do it in the single parent
+ * connection. We don't sweat about RestorePass ordering; it's likely we
+ * already violated that.
+ */
+ for (te = pending_list->pending_next; te != pending_list; te = te->pending_next)
+ {
+ pg_log_info("processing missed item %d %s %s",
+ te->dumpId, te->desc, te->tag);
+ (void) restore_toc_entry(AH, te, false);
+ }
+}
+
+/*
+ * Check if te1 has an exclusive lock requirement for an item that te2 also
+ * requires, whether or not te2's requirement is for an exclusive lock.
+ */
+static bool
+has_lock_conflicts(TocEntry *te1, TocEntry *te2)
+{
+ int j,
+ k;
+
+ for (j = 0; j < te1->nLockDeps; j++)
+ {
+ for (k = 0; k < te2->nDeps; k++)
+ {
+ if (te1->lockDeps[j] == te2->dependencies[k])
+ return true;
+ }
+ }
+ return false;
+}
+
+
+/*
+ * Initialize the header of the pending-items list.
+ *
+ * This is a circular list with a dummy TocEntry as header, just like the
+ * main TOC list; but we use separate list links so that an entry can be in
+ * the main TOC list as well as in the pending list.
+ */
+static void
+pending_list_header_init(TocEntry *l)
+{
+ l->pending_prev = l->pending_next = l;
+}
+
+/* Append te to the end of the pending-list headed by l */
+static void
+pending_list_append(TocEntry *l, TocEntry *te)
+{
+ te->pending_prev = l->pending_prev;
+ l->pending_prev->pending_next = te;
+ l->pending_prev = te;
+ te->pending_next = l;
+}
+
+/* Remove te from the pending-list */
+static void
+pending_list_remove(TocEntry *te)
+{
+ te->pending_prev->pending_next = te->pending_next;
+ te->pending_next->pending_prev = te->pending_prev;
+ te->pending_prev = NULL;
+ te->pending_next = NULL;
+}
+
+
+/*
+ * Initialize the ready_list with enough room for up to tocCount entries.
+ */
+static void
+ready_list_init(ParallelReadyList *ready_list, int tocCount)
+{
+ ready_list->tes = (TocEntry **)
+ pg_malloc(tocCount * sizeof(TocEntry *));
+ ready_list->first_te = 0;
+ ready_list->last_te = -1;
+ ready_list->sorted = false;
+}
+
+/*
+ * Free storage for a ready_list.
+ */
+static void
+ready_list_free(ParallelReadyList *ready_list)
+{
+ pg_free(ready_list->tes);
+}
+
+/* Add te to the ready_list */
+static void
+ready_list_insert(ParallelReadyList *ready_list, TocEntry *te)
+{
+ ready_list->tes[++ready_list->last_te] = te;
+ /* List is (probably) not sorted anymore. */
+ ready_list->sorted = false;
+}
+
+/* Remove the i'th entry in the ready_list */
+static void
+ready_list_remove(ParallelReadyList *ready_list, int i)
+{
+ int f = ready_list->first_te;
+
+ Assert(i >= f && i <= ready_list->last_te);
+
+ /*
+ * In the typical case where the item to be removed is the first ready
+ * entry, we need only increment first_te to remove it. Otherwise, move
+ * the entries before it to compact the list. (This preserves sortedness,
+ * if any.) We could alternatively move the entries after i, but there
+ * are typically many more of those.
+ */
+ if (i > f)
+ {
+ TocEntry **first_te_ptr = &ready_list->tes[f];
+
+ memmove(first_te_ptr + 1, first_te_ptr, (i - f) * sizeof(TocEntry *));
+ }
+ ready_list->first_te++;
+}
+
+/* Sort the ready_list into the desired order */
+static void
+ready_list_sort(ParallelReadyList *ready_list)
+{
+ if (!ready_list->sorted)
+ {
+ int n = ready_list->last_te - ready_list->first_te + 1;
+
+ if (n > 1)
+ qsort(ready_list->tes + ready_list->first_te, n,
+ sizeof(TocEntry *),
+ TocEntrySizeCompare);
+ ready_list->sorted = true;
+ }
+}
+
+/* qsort comparator for sorting TocEntries by dataLength */
+static int
+TocEntrySizeCompare(const void *p1, const void *p2)
+{
+ const TocEntry *te1 = *(const TocEntry *const *) p1;
+ const TocEntry *te2 = *(const TocEntry *const *) p2;
+
+ /* Sort by decreasing dataLength */
+ if (te1->dataLength > te2->dataLength)
+ return -1;
+ if (te1->dataLength < te2->dataLength)
+ return 1;
+
+ /* For equal dataLengths, sort by dumpId, just to be stable */
+ if (te1->dumpId < te2->dumpId)
+ return -1;
+ if (te1->dumpId > te2->dumpId)
+ return 1;
+
+ return 0;
+}
+
+
+/*
+ * Move all immediately-ready items from pending_list to ready_list.
+ *
+ * Items are considered ready if they have no remaining dependencies and
+ * they belong in the current restore pass. (See also reduce_dependencies,
+ * which applies the same logic one-at-a-time.)
+ */
+static void
+move_to_ready_list(TocEntry *pending_list,
+ ParallelReadyList *ready_list,
+ RestorePass pass)
+{
+ TocEntry *te;
+ TocEntry *next_te;
+
+ for (te = pending_list->pending_next; te != pending_list; te = next_te)
+ {
+ /* must save list link before possibly removing te from list */
+ next_te = te->pending_next;
+
+ if (te->depCount == 0 &&
+ _tocEntryRestorePass(te) == pass)
+ {
+ /* Remove it from pending_list ... */
+ pending_list_remove(te);
+ /* ... and add to ready_list */
+ ready_list_insert(ready_list, te);
+ }
+ }
+}
+
+/*
+ * Find the next work item (if any) that is capable of being run now,
+ * and remove it from the ready_list.
+ *
+ * Returns the item, or NULL if nothing is runnable.
+ *
+ * To qualify, the item must have no remaining dependencies
+ * and no requirements for locks that are incompatible with
+ * items currently running. Items in the ready_list are known to have
+ * no remaining dependencies, but we have to check for lock conflicts.
+ */
+static TocEntry *
+pop_next_work_item(ParallelReadyList *ready_list,
+ ParallelState *pstate)
+{
+ /*
+ * Sort the ready_list so that we'll tackle larger jobs first.
+ */
+ ready_list_sort(ready_list);
+
+ /*
+ * Search the ready_list until we find a suitable item.
+ */
+ for (int i = ready_list->first_te; i <= ready_list->last_te; i++)
+ {
+ TocEntry *te = ready_list->tes[i];
+ bool conflicts = false;
+
+ /*
+ * Check to see if the item would need exclusive lock on something
+ * that a currently running item also needs lock on, or vice versa. If
+ * so, we don't want to schedule them together.
+ */
+ for (int k = 0; k < pstate->numWorkers; k++)
+ {
+ TocEntry *running_te = pstate->te[k];
+
+ if (running_te == NULL)
+ continue;
+ if (has_lock_conflicts(te, running_te) ||
+ has_lock_conflicts(running_te, te))
+ {
+ conflicts = true;
+ break;
+ }
+ }
+
+ if (conflicts)
+ continue;
+
+ /* passed all tests, so this item can run */
+ ready_list_remove(ready_list, i);
+ return te;
+ }
+
+ pg_log_debug("no item ready");
+ return NULL;
+}
+
+
+/*
+ * Restore a single TOC item in parallel with others
+ *
+ * this is run in the worker, i.e. in a thread (Windows) or a separate process
+ * (everything else). A worker process executes several such work items during
+ * a parallel backup or restore. Once we terminate here and report back that
+ * our work is finished, the leader process will assign us a new work item.
+ */
+int
+parallel_restore(ArchiveHandle *AH, TocEntry *te)
+{
+ int status;
+
+ Assert(AH->connection != NULL);
+
+ /* Count only errors associated with this TOC entry */
+ AH->public.n_errors = 0;
+
+ /* Restore the TOC item */
+ status = restore_toc_entry(AH, te, true);
+
+ return status;
+}
+
+
+/*
+ * Callback function that's invoked in the leader process after a step has
+ * been parallel restored.
+ *
+ * Update status and reduce the dependency count of any dependent items.
+ */
+static void
+mark_restore_job_done(ArchiveHandle *AH,
+ TocEntry *te,
+ int status,
+ void *callback_data)
+{
+ ParallelReadyList *ready_list = (ParallelReadyList *) callback_data;
+
+ pg_log_info("finished item %d %s %s",
+ te->dumpId, te->desc, te->tag);
+
+ if (status == WORKER_CREATE_DONE)
+ mark_create_done(AH, te);
+ else if (status == WORKER_INHIBIT_DATA)
+ {
+ inhibit_data_for_failed_table(AH, te);
+ AH->public.n_errors++;
+ }
+ else if (status == WORKER_IGNORED_ERRORS)
+ AH->public.n_errors++;
+ else if (status != 0)
+ pg_fatal("worker process failed: exit code %d",
+ status);
+
+ reduce_dependencies(AH, te, ready_list);
+}
+
+
+/*
+ * Process the dependency information into a form useful for parallel restore.
+ *
+ * This function takes care of fixing up some missing or badly designed
+ * dependencies, and then prepares subsidiary data structures that will be
+ * used in the main parallel-restore logic, including:
+ * 1. We build the revDeps[] arrays of incoming dependency dumpIds.
+ * 2. We set up depCount fields that are the number of as-yet-unprocessed
+ * dependencies for each TOC entry.
+ *
+ * We also identify locking dependencies so that we can avoid trying to
+ * schedule conflicting items at the same time.
+ */
+static void
+fix_dependencies(ArchiveHandle *AH)
+{
+ TocEntry *te;
+ int i;
+
+ /*
+ * Initialize the depCount/revDeps/nRevDeps fields, and make sure the TOC
+ * items are marked as not being in any parallel-processing list.
+ */
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ te->depCount = te->nDeps;
+ te->revDeps = NULL;
+ te->nRevDeps = 0;
+ te->pending_prev = NULL;
+ te->pending_next = NULL;
+ }
+
+ /*
+ * POST_DATA items that are shown as depending on a table need to be
+ * re-pointed to depend on that table's data, instead. This ensures they
+ * won't get scheduled until the data has been loaded.
+ */
+ repoint_table_dependencies(AH);
+
+ /*
+ * Pre-8.4 versions of pg_dump neglected to set up a dependency from BLOB
+ * COMMENTS to BLOBS. Cope. (We assume there's only one BLOBS and only
+ * one BLOB COMMENTS in such files.)
+ */
+ if (AH->version < K_VERS_1_11)
+ {
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if (strcmp(te->desc, "BLOB COMMENTS") == 0 && te->nDeps == 0)
+ {
+ TocEntry *te2;
+
+ for (te2 = AH->toc->next; te2 != AH->toc; te2 = te2->next)
+ {
+ if (strcmp(te2->desc, "BLOBS") == 0)
+ {
+ te->dependencies = (DumpId *) pg_malloc(sizeof(DumpId));
+ te->dependencies[0] = te2->dumpId;
+ te->nDeps++;
+ te->depCount++;
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ /*
+ * At this point we start to build the revDeps reverse-dependency arrays,
+ * so all changes of dependencies must be complete.
+ */
+
+ /*
+ * Count the incoming dependencies for each item. Also, it is possible
+ * that the dependencies list items that are not in the archive at all
+ * (that should not happen in 9.2 and later, but is highly likely in older
+ * archives). Subtract such items from the depCounts.
+ */
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ for (i = 0; i < te->nDeps; i++)
+ {
+ DumpId depid = te->dependencies[i];
+
+ if (depid <= AH->maxDumpId && AH->tocsByDumpId[depid] != NULL)
+ AH->tocsByDumpId[depid]->nRevDeps++;
+ else
+ te->depCount--;
+ }
+ }
+
+ /*
+ * Allocate space for revDeps[] arrays, and reset nRevDeps so we can use
+ * it as a counter below.
+ */
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if (te->nRevDeps > 0)
+ te->revDeps = (DumpId *) pg_malloc(te->nRevDeps * sizeof(DumpId));
+ te->nRevDeps = 0;
+ }
+
+ /*
+ * Build the revDeps[] arrays of incoming-dependency dumpIds. This had
+ * better agree with the loops above.
+ */
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ for (i = 0; i < te->nDeps; i++)
+ {
+ DumpId depid = te->dependencies[i];
+
+ if (depid <= AH->maxDumpId && AH->tocsByDumpId[depid] != NULL)
+ {
+ TocEntry *otherte = AH->tocsByDumpId[depid];
+
+ otherte->revDeps[otherte->nRevDeps++] = te->dumpId;
+ }
+ }
+ }
+
+ /*
+ * Lastly, work out the locking dependencies.
+ */
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ te->lockDeps = NULL;
+ te->nLockDeps = 0;
+ identify_locking_dependencies(AH, te);
+ }
+}
+
+/*
+ * Change dependencies on table items to depend on table data items instead,
+ * but only in POST_DATA items.
+ *
+ * Also, for any item having such dependency(s), set its dataLength to the
+ * largest dataLength of the table data items it depends on. This ensures
+ * that parallel restore will prioritize larger jobs (index builds, FK
+ * constraint checks, etc) over smaller ones, avoiding situations where we
+ * end a restore with only one active job working on a large table.
+ */
+static void
+repoint_table_dependencies(ArchiveHandle *AH)
+{
+ TocEntry *te;
+ int i;
+ DumpId olddep;
+
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if (te->section != SECTION_POST_DATA)
+ continue;
+ for (i = 0; i < te->nDeps; i++)
+ {
+ olddep = te->dependencies[i];
+ if (olddep <= AH->maxDumpId &&
+ AH->tableDataId[olddep] != 0)
+ {
+ DumpId tabledataid = AH->tableDataId[olddep];
+ TocEntry *tabledatate = AH->tocsByDumpId[tabledataid];
+
+ te->dependencies[i] = tabledataid;
+ te->dataLength = Max(te->dataLength, tabledatate->dataLength);
+ pg_log_debug("transferring dependency %d -> %d to %d",
+ te->dumpId, olddep, tabledataid);
+ }
+ }
+ }
+}
+
+/*
+ * Identify which objects we'll need exclusive lock on in order to restore
+ * the given TOC entry (*other* than the one identified by the TOC entry
+ * itself). Record their dump IDs in the entry's lockDeps[] array.
+ */
+static void
+identify_locking_dependencies(ArchiveHandle *AH, TocEntry *te)
+{
+ DumpId *lockids;
+ int nlockids;
+ int i;
+
+ /*
+ * We only care about this for POST_DATA items. PRE_DATA items are not
+ * run in parallel, and DATA items are all independent by assumption.
+ */
+ if (te->section != SECTION_POST_DATA)
+ return;
+
+ /* Quick exit if no dependencies at all */
+ if (te->nDeps == 0)
+ return;
+
+ /*
+ * Most POST_DATA items are ALTER TABLEs or some moral equivalent of that,
+ * and hence require exclusive lock. However, we know that CREATE INDEX
+ * does not. (Maybe someday index-creating CONSTRAINTs will fall in that
+ * category too ... but today is not that day.)
+ */
+ if (strcmp(te->desc, "INDEX") == 0)
+ return;
+
+ /*
+ * We assume the entry requires exclusive lock on each TABLE or TABLE DATA
+ * item listed among its dependencies. Originally all of these would have
+ * been TABLE items, but repoint_table_dependencies would have repointed
+ * them to the TABLE DATA items if those are present (which they might not
+ * be, eg in a schema-only dump). Note that all of the entries we are
+ * processing here are POST_DATA; otherwise there might be a significant
+ * difference between a dependency on a table and a dependency on its
+ * data, so that closer analysis would be needed here.
+ */
+ lockids = (DumpId *) pg_malloc(te->nDeps * sizeof(DumpId));
+ nlockids = 0;
+ for (i = 0; i < te->nDeps; i++)
+ {
+ DumpId depid = te->dependencies[i];
+
+ if (depid <= AH->maxDumpId && AH->tocsByDumpId[depid] != NULL &&
+ ((strcmp(AH->tocsByDumpId[depid]->desc, "TABLE DATA") == 0) ||
+ strcmp(AH->tocsByDumpId[depid]->desc, "TABLE") == 0))
+ lockids[nlockids++] = depid;
+ }
+
+ if (nlockids == 0)
+ {
+ free(lockids);
+ return;
+ }
+
+ te->lockDeps = pg_realloc(lockids, nlockids * sizeof(DumpId));
+ te->nLockDeps = nlockids;
+}
+
+/*
+ * Remove the specified TOC entry from the depCounts of items that depend on
+ * it, thereby possibly making them ready-to-run. Any pending item that
+ * becomes ready should be moved to the ready_list, if that's provided.
+ */
+static void
+reduce_dependencies(ArchiveHandle *AH, TocEntry *te,
+ ParallelReadyList *ready_list)
+{
+ int i;
+
+ pg_log_debug("reducing dependencies for %d", te->dumpId);
+
+ for (i = 0; i < te->nRevDeps; i++)
+ {
+ TocEntry *otherte = AH->tocsByDumpId[te->revDeps[i]];
+
+ Assert(otherte->depCount > 0);
+ otherte->depCount--;
+
+ /*
+ * It's ready if it has no remaining dependencies, and it belongs in
+ * the current restore pass, and it is currently a member of the
+ * pending list (that check is needed to prevent double restore in
+ * some cases where a list-file forces out-of-order restoring).
+ * However, if ready_list == NULL then caller doesn't want any list
+ * memberships changed.
+ */
+ if (otherte->depCount == 0 &&
+ _tocEntryRestorePass(otherte) == AH->restorePass &&
+ otherte->pending_prev != NULL &&
+ ready_list != NULL)
+ {
+ /* Remove it from pending list ... */
+ pending_list_remove(otherte);
+ /* ... and add to ready_list */
+ ready_list_insert(ready_list, otherte);
+ }
+ }
+}
+
+/*
+ * Set the created flag on the DATA member corresponding to the given
+ * TABLE member
+ */
+static void
+mark_create_done(ArchiveHandle *AH, TocEntry *te)
+{
+ if (AH->tableDataId[te->dumpId] != 0)
+ {
+ TocEntry *ted = AH->tocsByDumpId[AH->tableDataId[te->dumpId]];
+
+ ted->created = true;
+ }
+}
+
+/*
+ * Mark the DATA member corresponding to the given TABLE member
+ * as not wanted
+ */
+static void
+inhibit_data_for_failed_table(ArchiveHandle *AH, TocEntry *te)
+{
+ pg_log_info("table \"%s\" could not be created, will not restore its data",
+ te->tag);
+
+ if (AH->tableDataId[te->dumpId] != 0)
+ {
+ TocEntry *ted = AH->tocsByDumpId[AH->tableDataId[te->dumpId]];
+
+ ted->reqs = 0;
+ }
+}
+
+/*
+ * Clone and de-clone routines used in parallel restoration.
+ *
+ * Enough of the structure is cloned to ensure that there is no
+ * conflict between different threads each with their own clone.
+ */
+ArchiveHandle *
+CloneArchive(ArchiveHandle *AH)
+{
+ ArchiveHandle *clone;
+
+ /* Make a "flat" copy */
+ clone = (ArchiveHandle *) pg_malloc(sizeof(ArchiveHandle));
+ memcpy(clone, AH, sizeof(ArchiveHandle));
+
+ /* Handle format-independent fields */
+ memset(&(clone->sqlparse), 0, sizeof(clone->sqlparse));
+
+ /* The clone will have its own connection, so disregard connection state */
+ clone->connection = NULL;
+ clone->connCancel = NULL;
+ clone->currUser = NULL;
+ clone->currSchema = NULL;
+ clone->currTableAm = NULL;
+ clone->currTablespace = NULL;
+
+ /* savedPassword must be local in case we change it while connecting */
+ if (clone->savedPassword)
+ clone->savedPassword = pg_strdup(clone->savedPassword);
+
+ /* clone has its own error count, too */
+ clone->public.n_errors = 0;
+
+ /*
+ * Connect our new clone object to the database, using the same connection
+ * parameters used for the original connection.
+ */
+ ConnectDatabase((Archive *) clone, &clone->public.ropt->cparams, true);
+
+ /* re-establish fixed state */
+ if (AH->mode == archModeRead)
+ _doSetFixedOutputState(clone);
+ /* in write case, setupDumpWorker will fix up connection state */
+
+ /* Let the format-specific code have a chance too */
+ clone->ClonePtr(clone);
+
+ Assert(clone->connection != NULL);
+ return clone;
+}
+
+/*
+ * Release clone-local storage.
+ *
+ * Note: we assume any clone-local connection was already closed.
+ */
+void
+DeCloneArchive(ArchiveHandle *AH)
+{
+ /* Should not have an open database connection */
+ Assert(AH->connection == NULL);
+
+ /* Clear format-specific state */
+ AH->DeClonePtr(AH);
+
+ /* Clear state allocated by CloneArchive */
+ if (AH->sqlparse.curCmd)
+ destroyPQExpBuffer(AH->sqlparse.curCmd);
+
+ /* Clear any connection-local state */
+ if (AH->currUser)
+ free(AH->currUser);
+ if (AH->currSchema)
+ free(AH->currSchema);
+ if (AH->currTablespace)
+ free(AH->currTablespace);
+ if (AH->currTableAm)
+ free(AH->currTableAm);
+ if (AH->savedPassword)
+ free(AH->savedPassword);
+
+ free(AH);
+}
diff --git a/src/bin/pg_dump/pg_backup_archiver.h b/src/bin/pg_dump/pg_backup_archiver.h
new file mode 100644
index 0000000..084cd87
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_archiver.h
@@ -0,0 +1,483 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_archiver.h
+ *
+ * Private interface to the pg_dump archiver routines.
+ * It is NOT intended that these routines be called by any
+ * dumper directly.
+ *
+ * See the headers to pg_restore for more details.
+ *
+ * Copyright (c) 2000, Philip Warner
+ * Rights are granted to use this software in any way so long
+ * as this notice is not removed.
+ *
+ * The author is not responsible for loss or damages that may
+ * result from its use.
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup_archiver.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef __PG_BACKUP_ARCHIVE__
+#define __PG_BACKUP_ARCHIVE__
+
+#include <time.h>
+
+#include "libpq-fe.h"
+#include "pg_backup.h"
+#include "pqexpbuffer.h"
+
+#define LOBBUFSIZE 16384
+
+#ifdef HAVE_LIBZ
+#include <zlib.h>
+#define GZCLOSE(fh) gzclose(fh)
+#define GZWRITE(p, s, n, fh) gzwrite(fh, p, (n) * (s))
+#define GZREAD(p, s, n, fh) gzread(fh, p, (n) * (s))
+#define GZEOF(fh) gzeof(fh)
+#else
+#define GZCLOSE(fh) fclose(fh)
+#define GZWRITE(p, s, n, fh) (fwrite(p, s, n, fh) * (s))
+#define GZREAD(p, s, n, fh) fread(p, s, n, fh)
+#define GZEOF(fh) feof(fh)
+/* this is just the redefinition of a libz constant */
+#define Z_DEFAULT_COMPRESSION (-1)
+
+typedef struct _z_stream
+{
+ void *next_in;
+ void *next_out;
+ size_t avail_in;
+ size_t avail_out;
+} z_stream;
+typedef z_stream *z_streamp;
+#endif
+
+/* Data block types */
+#define BLK_DATA 1
+#define BLK_BLOBS 3
+
+/* Encode version components into a convenient integer <maj><min><rev> */
+#define MAKE_ARCHIVE_VERSION(major, minor, rev) (((major) * 256 + (minor)) * 256 + (rev))
+
+#define ARCHIVE_MAJOR(version) (((version) >> 16) & 255)
+#define ARCHIVE_MINOR(version) (((version) >> 8) & 255)
+#define ARCHIVE_REV(version) (((version) ) & 255)
+
+/* Historical version numbers (checked in code) */
+#define K_VERS_1_0 MAKE_ARCHIVE_VERSION(1, 0, 0)
+#define K_VERS_1_2 MAKE_ARCHIVE_VERSION(1, 2, 0) /* Allow No ZLIB */
+#define K_VERS_1_3 MAKE_ARCHIVE_VERSION(1, 3, 0) /* BLOBs */
+#define K_VERS_1_4 MAKE_ARCHIVE_VERSION(1, 4, 0) /* Date & name in header */
+#define K_VERS_1_5 MAKE_ARCHIVE_VERSION(1, 5, 0) /* Handle dependencies */
+#define K_VERS_1_6 MAKE_ARCHIVE_VERSION(1, 6, 0) /* Schema field in TOCs */
+#define K_VERS_1_7 MAKE_ARCHIVE_VERSION(1, 7, 0) /* File Offset size in
+ * header */
+#define K_VERS_1_8 MAKE_ARCHIVE_VERSION(1, 8, 0) /* change interpretation
+ * of ID numbers and
+ * dependencies */
+#define K_VERS_1_9 MAKE_ARCHIVE_VERSION(1, 9, 0) /* add default_with_oids
+ * tracking */
+#define K_VERS_1_10 MAKE_ARCHIVE_VERSION(1, 10, 0) /* add tablespace */
+#define K_VERS_1_11 MAKE_ARCHIVE_VERSION(1, 11, 0) /* add toc section
+ * indicator */
+#define K_VERS_1_12 MAKE_ARCHIVE_VERSION(1, 12, 0) /* add separate BLOB
+ * entries */
+#define K_VERS_1_13 MAKE_ARCHIVE_VERSION(1, 13, 0) /* change search_path
+ * behavior */
+#define K_VERS_1_14 MAKE_ARCHIVE_VERSION(1, 14, 0) /* add tableam */
+
+/* Current archive version number (the format we can output) */
+#define K_VERS_MAJOR 1
+#define K_VERS_MINOR 14
+#define K_VERS_REV 0
+#define K_VERS_SELF MAKE_ARCHIVE_VERSION(K_VERS_MAJOR, K_VERS_MINOR, K_VERS_REV)
+
+/* Newest format we can read */
+#define K_VERS_MAX MAKE_ARCHIVE_VERSION(K_VERS_MAJOR, K_VERS_MINOR, 255)
+
+
+/* Flags to indicate disposition of offsets stored in files */
+#define K_OFFSET_POS_NOT_SET 1
+#define K_OFFSET_POS_SET 2
+#define K_OFFSET_NO_DATA 3
+
+/*
+ * Special exit values from worker children. We reserve 0 for normal
+ * success; 1 and other small values should be interpreted as crashes.
+ */
+#define WORKER_OK 0
+#define WORKER_CREATE_DONE 10
+#define WORKER_INHIBIT_DATA 11
+#define WORKER_IGNORED_ERRORS 12
+
+typedef struct _archiveHandle ArchiveHandle;
+typedef struct _tocEntry TocEntry;
+struct ParallelState;
+
+#define READ_ERROR_EXIT(fd) \
+ do { \
+ if (feof(fd)) \
+ pg_fatal("could not read from input file: end of file"); \
+ else \
+ pg_fatal("could not read from input file: %m"); \
+ } while (0)
+
+#define WRITE_ERROR_EXIT \
+ do { \
+ pg_fatal("could not write to output file: %m"); \
+ } while (0)
+
+typedef enum T_Action
+{
+ ACT_DUMP,
+ ACT_RESTORE
+} T_Action;
+
+typedef void (*ClosePtrType) (ArchiveHandle *AH);
+typedef void (*ReopenPtrType) (ArchiveHandle *AH);
+typedef void (*ArchiveEntryPtrType) (ArchiveHandle *AH, TocEntry *te);
+
+typedef void (*StartDataPtrType) (ArchiveHandle *AH, TocEntry *te);
+typedef void (*WriteDataPtrType) (ArchiveHandle *AH, const void *data, size_t dLen);
+typedef void (*EndDataPtrType) (ArchiveHandle *AH, TocEntry *te);
+
+typedef void (*StartBlobsPtrType) (ArchiveHandle *AH, TocEntry *te);
+typedef void (*StartBlobPtrType) (ArchiveHandle *AH, TocEntry *te, Oid oid);
+typedef void (*EndBlobPtrType) (ArchiveHandle *AH, TocEntry *te, Oid oid);
+typedef void (*EndBlobsPtrType) (ArchiveHandle *AH, TocEntry *te);
+
+typedef int (*WriteBytePtrType) (ArchiveHandle *AH, const int i);
+typedef int (*ReadBytePtrType) (ArchiveHandle *AH);
+typedef void (*WriteBufPtrType) (ArchiveHandle *AH, const void *c, size_t len);
+typedef void (*ReadBufPtrType) (ArchiveHandle *AH, void *buf, size_t len);
+typedef void (*WriteExtraTocPtrType) (ArchiveHandle *AH, TocEntry *te);
+typedef void (*ReadExtraTocPtrType) (ArchiveHandle *AH, TocEntry *te);
+typedef void (*PrintExtraTocPtrType) (ArchiveHandle *AH, TocEntry *te);
+typedef void (*PrintTocDataPtrType) (ArchiveHandle *AH, TocEntry *te);
+
+typedef void (*PrepParallelRestorePtrType) (ArchiveHandle *AH);
+typedef void (*ClonePtrType) (ArchiveHandle *AH);
+typedef void (*DeClonePtrType) (ArchiveHandle *AH);
+
+typedef int (*WorkerJobDumpPtrType) (ArchiveHandle *AH, TocEntry *te);
+typedef int (*WorkerJobRestorePtrType) (ArchiveHandle *AH, TocEntry *te);
+
+typedef size_t (*CustomOutPtrType) (ArchiveHandle *AH, const void *buf, size_t len);
+
+typedef enum
+{
+ SQL_SCAN = 0, /* normal */
+ SQL_IN_SINGLE_QUOTE, /* '...' literal */
+ SQL_IN_DOUBLE_QUOTE /* "..." identifier */
+} sqlparseState;
+
+typedef struct
+{
+ sqlparseState state; /* see above */
+ bool backSlash; /* next char is backslash quoted? */
+ PQExpBuffer curCmd; /* incomplete line (NULL if not created) */
+} sqlparseInfo;
+
+typedef enum
+{
+ STAGE_NONE = 0,
+ STAGE_INITIALIZING,
+ STAGE_PROCESSING,
+ STAGE_FINALIZING
+} ArchiverStage;
+
+typedef enum
+{
+ OUTPUT_SQLCMDS = 0, /* emitting general SQL commands */
+ OUTPUT_COPYDATA, /* writing COPY data */
+ OUTPUT_OTHERDATA /* writing data as INSERT commands */
+} ArchiverOutput;
+
+/*
+ * For historical reasons, ACL items are interspersed with everything else in
+ * a dump file's TOC; typically they're right after the object they're for.
+ * However, we need to restore data before ACLs, as otherwise a read-only
+ * table (ie one where the owner has revoked her own INSERT privilege) causes
+ * data restore failures. On the other hand, matview REFRESH commands should
+ * come out after ACLs, as otherwise non-superuser-owned matviews might not
+ * be able to execute. (If the permissions at the time of dumping would not
+ * allow a REFRESH, too bad; we won't fix that for you.) We also want event
+ * triggers to be restored after ACLs, so that they can't mess those up.
+ *
+ * These considerations force us to make three passes over the TOC,
+ * restoring the appropriate subset of items in each pass. We assume that
+ * the dependency sort resulted in an appropriate ordering of items within
+ * each subset.
+ *
+ * XXX This mechanism should be superseded by tracking dependencies on ACLs
+ * properly; but we'll still need it for old dump files even after that.
+ */
+typedef enum
+{
+ RESTORE_PASS_MAIN = 0, /* Main pass (most TOC item types) */
+ RESTORE_PASS_ACL, /* ACL item types */
+ RESTORE_PASS_POST_ACL /* Event trigger and matview refresh items */
+
+#define RESTORE_PASS_LAST RESTORE_PASS_POST_ACL
+} RestorePass;
+
+#define REQ_SCHEMA 0x01 /* want schema */
+#define REQ_DATA 0x02 /* want data */
+#define REQ_SPECIAL 0x04 /* for special TOC entries */
+
+struct _archiveHandle
+{
+ Archive public; /* Public part of archive */
+ int version; /* Version of file */
+
+ char *archiveRemoteVersion; /* When reading an archive, the
+ * version of the dumped DB */
+ char *archiveDumpVersion; /* When reading an archive, the version of
+ * the dumper */
+
+ size_t intSize; /* Size of an integer in the archive */
+ size_t offSize; /* Size of a file offset in the archive -
+ * Added V1.7 */
+ ArchiveFormat format; /* Archive format */
+
+ sqlparseInfo sqlparse; /* state for parsing INSERT data */
+
+ time_t createDate; /* Date archive created */
+
+ /*
+ * Fields used when discovering archive format. For tar format, we load
+ * the first block into the lookahead buffer, and verify that it looks
+ * like a tar header. The tar module must then consume bytes from the
+ * lookahead buffer before reading any more from the file. For custom
+ * format, we load only the "PGDMP" marker into the buffer, and then set
+ * readHeader after confirming it matches. The buffer is vestigial in
+ * this case, as the subsequent code just checks readHeader and doesn't
+ * examine the buffer.
+ */
+ int readHeader; /* Set if we already read "PGDMP" marker */
+ char *lookahead; /* Buffer used when reading header to discover
+ * format */
+ size_t lookaheadSize; /* Allocated size of buffer */
+ size_t lookaheadLen; /* Length of valid data in lookahead */
+ size_t lookaheadPos; /* Current read position in lookahead buffer */
+
+ ArchiveEntryPtrType ArchiveEntryPtr; /* Called for each metadata object */
+ StartDataPtrType StartDataPtr; /* Called when table data is about to be
+ * dumped */
+ WriteDataPtrType WriteDataPtr; /* Called to send some table data to the
+ * archive */
+ EndDataPtrType EndDataPtr; /* Called when table data dump is finished */
+ WriteBytePtrType WriteBytePtr; /* Write a byte to output */
+ ReadBytePtrType ReadBytePtr; /* Read a byte from an archive */
+ WriteBufPtrType WriteBufPtr; /* Write a buffer of output to the archive */
+ ReadBufPtrType ReadBufPtr; /* Read a buffer of input from the archive */
+ ClosePtrType ClosePtr; /* Close the archive */
+ ReopenPtrType ReopenPtr; /* Reopen the archive */
+ WriteExtraTocPtrType WriteExtraTocPtr; /* Write extra TOC entry data
+ * associated with the current
+ * archive format */
+ ReadExtraTocPtrType ReadExtraTocPtr; /* Read extra info associated with
+ * archive format */
+ PrintExtraTocPtrType PrintExtraTocPtr; /* Extra TOC info for format */
+ PrintTocDataPtrType PrintTocDataPtr;
+
+ StartBlobsPtrType StartBlobsPtr;
+ EndBlobsPtrType EndBlobsPtr;
+ StartBlobPtrType StartBlobPtr;
+ EndBlobPtrType EndBlobPtr;
+
+ SetupWorkerPtrType SetupWorkerPtr;
+ WorkerJobDumpPtrType WorkerJobDumpPtr;
+ WorkerJobRestorePtrType WorkerJobRestorePtr;
+
+ PrepParallelRestorePtrType PrepParallelRestorePtr;
+ ClonePtrType ClonePtr; /* Clone format-specific fields */
+ DeClonePtrType DeClonePtr; /* Clean up cloned fields */
+
+ CustomOutPtrType CustomOutPtr; /* Alternative script output routine */
+
+ /* Stuff for direct DB connection */
+ char *archdbname; /* DB name *read* from archive */
+ char *savedPassword; /* password for ropt->username, if known */
+ char *use_role;
+ PGconn *connection;
+ /* If connCancel isn't NULL, SIGINT handler will send a cancel */
+ PGcancel *volatile connCancel;
+
+ int connectToDB; /* Flag to indicate if direct DB connection is
+ * required */
+ ArchiverOutput outputKind; /* Flag for what we're currently writing */
+ bool pgCopyIn; /* Currently in libpq 'COPY IN' mode. */
+
+ int loFd; /* BLOB fd */
+ int writingBlob; /* Flag */
+ int blobCount; /* # of blobs restored */
+
+ char *fSpec; /* Archive File Spec */
+ FILE *FH; /* General purpose file handle */
+ void *OF;
+ int gzOut; /* Output file */
+
+ struct _tocEntry *toc; /* Header of circular list of TOC entries */
+ int tocCount; /* Number of TOC entries */
+ DumpId maxDumpId; /* largest DumpId among all TOC entries */
+
+ /* arrays created after the TOC list is complete: */
+ struct _tocEntry **tocsByDumpId; /* TOCs indexed by dumpId */
+ DumpId *tableDataId; /* TABLE DATA ids, indexed by table dumpId */
+
+ struct _tocEntry *currToc; /* Used when dumping data */
+ int compression; /*---------
+ * Compression requested on open().
+ * Possible values for compression:
+ * -1 Z_DEFAULT_COMPRESSION
+ * 0 COMPRESSION_NONE
+ * 1-9 levels for gzip compression
+ *---------
+ */
+ bool dosync; /* data requested to be synced on sight */
+ ArchiveMode mode; /* File mode - r or w */
+ void *formatData; /* Header data specific to file format */
+
+ /* these vars track state to avoid sending redundant SET commands */
+ char *currUser; /* current username, or NULL if unknown */
+ char *currSchema; /* current schema, or NULL */
+ char *currTablespace; /* current tablespace, or NULL */
+ char *currTableAm; /* current table access method, or NULL */
+
+ void *lo_buf;
+ size_t lo_buf_used;
+ size_t lo_buf_size;
+
+ int noTocComments;
+ ArchiverStage stage;
+ ArchiverStage lastErrorStage;
+ RestorePass restorePass; /* used only during parallel restore */
+ struct _tocEntry *currentTE;
+ struct _tocEntry *lastErrorTE;
+};
+
+struct _tocEntry
+{
+ struct _tocEntry *prev;
+ struct _tocEntry *next;
+ CatalogId catalogId;
+ DumpId dumpId;
+ teSection section;
+ bool hadDumper; /* Archiver was passed a dumper routine (used
+ * in restore) */
+ char *tag; /* index tag */
+ char *namespace; /* null or empty string if not in a schema */
+ char *tablespace; /* null if not in a tablespace; empty string
+ * means use database default */
+ char *tableam; /* table access method, only for TABLE tags */
+ char *owner;
+ char *desc;
+ char *defn;
+ char *dropStmt;
+ char *copyStmt;
+ DumpId *dependencies; /* dumpIds of objects this one depends on */
+ int nDeps; /* number of dependencies */
+
+ DataDumperPtr dataDumper; /* Routine to dump data for object */
+ const void *dataDumperArg; /* Arg for above routine */
+ void *formatData; /* TOC Entry data specific to file format */
+
+ /* working state while dumping/restoring */
+ pgoff_t dataLength; /* item's data size; 0 if none or unknown */
+ int reqs; /* do we need schema and/or data of object
+ * (REQ_* bit mask) */
+ bool created; /* set for DATA member if TABLE was created */
+
+ /* working state (needed only for parallel restore) */
+ struct _tocEntry *pending_prev; /* list links for pending-items list; */
+ struct _tocEntry *pending_next; /* NULL if not in that list */
+ int depCount; /* number of dependencies not yet restored */
+ DumpId *revDeps; /* dumpIds of objects depending on this one */
+ int nRevDeps; /* number of such dependencies */
+ DumpId *lockDeps; /* dumpIds of objects this one needs lock on */
+ int nLockDeps; /* number of such dependencies */
+};
+
+extern int parallel_restore(ArchiveHandle *AH, TocEntry *te);
+extern void on_exit_close_archive(Archive *AHX);
+
+extern void warn_or_exit_horribly(ArchiveHandle *AH, const char *fmt,...) pg_attribute_printf(2, 3);
+
+/* Options for ArchiveEntry */
+typedef struct _archiveOpts
+{
+ const char *tag;
+ const char *namespace;
+ const char *tablespace;
+ const char *tableam;
+ const char *owner;
+ const char *description;
+ teSection section;
+ const char *createStmt;
+ const char *dropStmt;
+ const char *copyStmt;
+ const DumpId *deps;
+ int nDeps;
+ DataDumperPtr dumpFn;
+ const void *dumpArg;
+} ArchiveOpts;
+#define ARCHIVE_OPTS(...) &(ArchiveOpts){__VA_ARGS__}
+/* Called to add a TOC entry */
+extern TocEntry *ArchiveEntry(Archive *AHX, CatalogId catalogId,
+ DumpId dumpId, ArchiveOpts *opts);
+
+extern void WriteHead(ArchiveHandle *AH);
+extern void ReadHead(ArchiveHandle *AH);
+extern void WriteToc(ArchiveHandle *AH);
+extern void ReadToc(ArchiveHandle *AH);
+extern void WriteDataChunks(ArchiveHandle *AH, struct ParallelState *pstate);
+extern void WriteDataChunksForTocEntry(ArchiveHandle *AH, TocEntry *te);
+extern ArchiveHandle *CloneArchive(ArchiveHandle *AH);
+extern void DeCloneArchive(ArchiveHandle *AH);
+
+extern int TocIDRequired(ArchiveHandle *AH, DumpId id);
+TocEntry *getTocEntryByDumpId(ArchiveHandle *AH, DumpId id);
+extern bool checkSeek(FILE *fp);
+
+#define appendStringLiteralAHX(buf,str,AH) \
+ appendStringLiteral(buf, str, (AH)->public.encoding, (AH)->public.std_strings)
+
+#define appendByteaLiteralAHX(buf,str,len,AH) \
+ appendByteaLiteral(buf, str, len, (AH)->public.std_strings)
+
+/*
+ * Mandatory routines for each supported format
+ */
+
+extern size_t WriteInt(ArchiveHandle *AH, int i);
+extern int ReadInt(ArchiveHandle *AH);
+extern char *ReadStr(ArchiveHandle *AH);
+extern size_t WriteStr(ArchiveHandle *AH, const char *s);
+
+int ReadOffset(ArchiveHandle *, pgoff_t *);
+size_t WriteOffset(ArchiveHandle *, pgoff_t, int);
+
+extern void StartRestoreBlobs(ArchiveHandle *AH);
+extern void StartRestoreBlob(ArchiveHandle *AH, Oid oid, bool drop);
+extern void EndRestoreBlob(ArchiveHandle *AH, Oid oid);
+extern void EndRestoreBlobs(ArchiveHandle *AH);
+
+extern void InitArchiveFmt_Custom(ArchiveHandle *AH);
+extern void InitArchiveFmt_Null(ArchiveHandle *AH);
+extern void InitArchiveFmt_Directory(ArchiveHandle *AH);
+extern void InitArchiveFmt_Tar(ArchiveHandle *AH);
+
+extern bool isValidTarHeader(char *header);
+
+extern void ReconnectToServer(ArchiveHandle *AH, const char *dbname);
+extern void DropBlobIfExists(ArchiveHandle *AH, Oid oid);
+
+void ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH);
+int ahprintf(ArchiveHandle *AH, const char *fmt,...) pg_attribute_printf(2, 3);
+
+#endif
diff --git a/src/bin/pg_dump/pg_backup_custom.c b/src/bin/pg_dump/pg_backup_custom.c
new file mode 100644
index 0000000..3443eef
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_custom.c
@@ -0,0 +1,1022 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_custom.c
+ *
+ * Implements the custom output format.
+ *
+ * The comments with the routines in this code are a good place to
+ * understand how to write a new format.
+ *
+ * See the headers to pg_restore for more details.
+ *
+ * Copyright (c) 2000, Philip Warner
+ * Rights are granted to use this software in any way so long
+ * as this notice is not removed.
+ *
+ * The author is not responsible for loss or damages that may
+ * and any liability will be limited to the time taken to fix any
+ * related bug.
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup_custom.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "common/file_utils.h"
+#include "compress_io.h"
+#include "parallel.h"
+#include "pg_backup_utils.h"
+
+/*--------
+ * Routines in the format interface
+ *--------
+ */
+
+static void _ArchiveEntry(ArchiveHandle *AH, TocEntry *te);
+static void _StartData(ArchiveHandle *AH, TocEntry *te);
+static void _WriteData(ArchiveHandle *AH, const void *data, size_t dLen);
+static void _EndData(ArchiveHandle *AH, TocEntry *te);
+static int _WriteByte(ArchiveHandle *AH, const int i);
+static int _ReadByte(ArchiveHandle *);
+static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
+static void _ReadBuf(ArchiveHandle *AH, void *buf, size_t len);
+static void _CloseArchive(ArchiveHandle *AH);
+static void _ReopenArchive(ArchiveHandle *AH);
+static void _PrintTocData(ArchiveHandle *AH, TocEntry *te);
+static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te);
+static void _ReadExtraToc(ArchiveHandle *AH, TocEntry *te);
+static void _PrintExtraToc(ArchiveHandle *AH, TocEntry *te);
+
+static void _PrintData(ArchiveHandle *AH);
+static void _skipData(ArchiveHandle *AH);
+static void _skipBlobs(ArchiveHandle *AH);
+
+static void _StartBlobs(ArchiveHandle *AH, TocEntry *te);
+static void _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
+static void _EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
+static void _EndBlobs(ArchiveHandle *AH, TocEntry *te);
+static void _LoadBlobs(ArchiveHandle *AH, bool drop);
+
+static void _PrepParallelRestore(ArchiveHandle *AH);
+static void _Clone(ArchiveHandle *AH);
+static void _DeClone(ArchiveHandle *AH);
+
+static int _WorkerJobRestoreCustom(ArchiveHandle *AH, TocEntry *te);
+
+typedef struct
+{
+ CompressorState *cs;
+ int hasSeek;
+ /* lastFilePos is used only when reading, and may be invalid if !hasSeek */
+ pgoff_t lastFilePos; /* position after last data block we've read */
+} lclContext;
+
+typedef struct
+{
+ int dataState;
+ pgoff_t dataPos; /* valid only if dataState=K_OFFSET_POS_SET */
+} lclTocEntry;
+
+
+/*------
+ * Static declarations
+ *------
+ */
+static void _readBlockHeader(ArchiveHandle *AH, int *type, int *id);
+static pgoff_t _getFilePos(ArchiveHandle *AH, lclContext *ctx);
+
+static void _CustomWriteFunc(ArchiveHandle *AH, const char *buf, size_t len);
+static size_t _CustomReadFunc(ArchiveHandle *AH, char **buf, size_t *buflen);
+
+
+/*
+ * Init routine required by ALL formats. This is a global routine
+ * and should be declared in pg_backup_archiver.h
+ *
+ * It's task is to create any extra archive context (using AH->formatData),
+ * and to initialize the supported function pointers.
+ *
+ * It should also prepare whatever it's input source is for reading/writing,
+ * and in the case of a read mode connection, it should load the Header & TOC.
+ */
+void
+InitArchiveFmt_Custom(ArchiveHandle *AH)
+{
+ lclContext *ctx;
+
+ /* Assuming static functions, this can be copied for each format. */
+ AH->ArchiveEntryPtr = _ArchiveEntry;
+ AH->StartDataPtr = _StartData;
+ AH->WriteDataPtr = _WriteData;
+ AH->EndDataPtr = _EndData;
+ AH->WriteBytePtr = _WriteByte;
+ AH->ReadBytePtr = _ReadByte;
+ AH->WriteBufPtr = _WriteBuf;
+ AH->ReadBufPtr = _ReadBuf;
+ AH->ClosePtr = _CloseArchive;
+ AH->ReopenPtr = _ReopenArchive;
+ AH->PrintTocDataPtr = _PrintTocData;
+ AH->ReadExtraTocPtr = _ReadExtraToc;
+ AH->WriteExtraTocPtr = _WriteExtraToc;
+ AH->PrintExtraTocPtr = _PrintExtraToc;
+
+ AH->StartBlobsPtr = _StartBlobs;
+ AH->StartBlobPtr = _StartBlob;
+ AH->EndBlobPtr = _EndBlob;
+ AH->EndBlobsPtr = _EndBlobs;
+
+ AH->PrepParallelRestorePtr = _PrepParallelRestore;
+ AH->ClonePtr = _Clone;
+ AH->DeClonePtr = _DeClone;
+
+ /* no parallel dump in the custom archive, only parallel restore */
+ AH->WorkerJobDumpPtr = NULL;
+ AH->WorkerJobRestorePtr = _WorkerJobRestoreCustom;
+
+ /* Set up a private area. */
+ ctx = (lclContext *) pg_malloc0(sizeof(lclContext));
+ AH->formatData = (void *) ctx;
+
+ /* Initialize LO buffering */
+ AH->lo_buf_size = LOBBUFSIZE;
+ AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE);
+
+ /*
+ * Now open the file
+ */
+ if (AH->mode == archModeWrite)
+ {
+ if (AH->fSpec && strcmp(AH->fSpec, "") != 0)
+ {
+ AH->FH = fopen(AH->fSpec, PG_BINARY_W);
+ if (!AH->FH)
+ pg_fatal("could not open output file \"%s\": %m", AH->fSpec);
+ }
+ else
+ {
+ AH->FH = stdout;
+ if (!AH->FH)
+ pg_fatal("could not open output file: %m");
+ }
+
+ ctx->hasSeek = checkSeek(AH->FH);
+ }
+ else
+ {
+ if (AH->fSpec && strcmp(AH->fSpec, "") != 0)
+ {
+ AH->FH = fopen(AH->fSpec, PG_BINARY_R);
+ if (!AH->FH)
+ pg_fatal("could not open input file \"%s\": %m", AH->fSpec);
+ }
+ else
+ {
+ AH->FH = stdin;
+ if (!AH->FH)
+ pg_fatal("could not open input file: %m");
+ }
+
+ ctx->hasSeek = checkSeek(AH->FH);
+
+ ReadHead(AH);
+ ReadToc(AH);
+
+ /*
+ * Remember location of first data block (i.e., the point after TOC)
+ * in case we have to search for desired data blocks.
+ */
+ ctx->lastFilePos = _getFilePos(AH, ctx);
+ }
+}
+
+/*
+ * Called by the Archiver when the dumper creates a new TOC entry.
+ *
+ * Optional.
+ *
+ * Set up extract format-related TOC data.
+*/
+static void
+_ArchiveEntry(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *ctx;
+
+ ctx = (lclTocEntry *) pg_malloc0(sizeof(lclTocEntry));
+ if (te->dataDumper)
+ ctx->dataState = K_OFFSET_POS_NOT_SET;
+ else
+ ctx->dataState = K_OFFSET_NO_DATA;
+
+ te->formatData = (void *) ctx;
+}
+
+/*
+ * Called by the Archiver to save any extra format-related TOC entry
+ * data.
+ *
+ * Optional.
+ *
+ * Use the Archiver routines to write data - they are non-endian, and
+ * maintain other important file information.
+ */
+static void
+_WriteExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *ctx = (lclTocEntry *) te->formatData;
+
+ WriteOffset(AH, ctx->dataPos, ctx->dataState);
+}
+
+/*
+ * Called by the Archiver to read any extra format-related TOC data.
+ *
+ * Optional.
+ *
+ * Needs to match the order defined in _WriteExtraToc, and should also
+ * use the Archiver input routines.
+ */
+static void
+_ReadExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *ctx = (lclTocEntry *) te->formatData;
+
+ if (ctx == NULL)
+ {
+ ctx = (lclTocEntry *) pg_malloc0(sizeof(lclTocEntry));
+ te->formatData = (void *) ctx;
+ }
+
+ ctx->dataState = ReadOffset(AH, &(ctx->dataPos));
+
+ /*
+ * Prior to V1.7 (pg7.3), we dumped the data size as an int now we don't
+ * dump it at all.
+ */
+ if (AH->version < K_VERS_1_7)
+ ReadInt(AH);
+}
+
+/*
+ * Called by the Archiver when restoring an archive to output a comment
+ * that includes useful information about the TOC entry.
+ *
+ * Optional.
+ */
+static void
+_PrintExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *ctx = (lclTocEntry *) te->formatData;
+
+ if (AH->public.verbose)
+ ahprintf(AH, "-- Data Pos: " INT64_FORMAT "\n",
+ (int64) ctx->dataPos);
+}
+
+/*
+ * Called by the archiver when saving TABLE DATA (not schema). This routine
+ * should save whatever format-specific information is needed to read
+ * the archive back.
+ *
+ * It is called just prior to the dumper's 'DataDumper' routine being called.
+ *
+ * Optional, but strongly recommended.
+ *
+ */
+static void
+_StartData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ tctx->dataPos = _getFilePos(AH, ctx);
+ if (tctx->dataPos >= 0)
+ tctx->dataState = K_OFFSET_POS_SET;
+
+ _WriteByte(AH, BLK_DATA); /* Block type */
+ WriteInt(AH, te->dumpId); /* For sanity check */
+
+ ctx->cs = AllocateCompressor(AH->compression, _CustomWriteFunc);
+}
+
+/*
+ * Called by archiver when dumper calls WriteData. This routine is
+ * called for both BLOB and TABLE data; it is the responsibility of
+ * the format to manage each kind of data using StartBlob/StartData.
+ *
+ * It should only be called from within a DataDumper routine.
+ *
+ * Mandatory.
+ */
+static void
+_WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ CompressorState *cs = ctx->cs;
+
+ if (dLen > 0)
+ /* WriteDataToArchive() internally throws write errors */
+ WriteDataToArchive(AH, cs, data, dLen);
+}
+
+/*
+ * Called by the archiver when a dumper's 'DataDumper' routine has
+ * finished.
+ *
+ * Optional.
+ */
+static void
+_EndData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ EndCompressor(AH, ctx->cs);
+ /* Send the end marker */
+ WriteInt(AH, 0);
+}
+
+/*
+ * Called by the archiver when starting to save all BLOB DATA (not schema).
+ * This routine should save whatever format-specific information is needed
+ * to read the BLOBs back into memory.
+ *
+ * It is called just prior to the dumper's DataDumper routine.
+ *
+ * Optional, but strongly recommended.
+ */
+static void
+_StartBlobs(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ tctx->dataPos = _getFilePos(AH, ctx);
+ if (tctx->dataPos >= 0)
+ tctx->dataState = K_OFFSET_POS_SET;
+
+ _WriteByte(AH, BLK_BLOBS); /* Block type */
+ WriteInt(AH, te->dumpId); /* For sanity check */
+}
+
+/*
+ * Called by the archiver when the dumper calls StartBlob.
+ *
+ * Mandatory.
+ *
+ * Must save the passed OID for retrieval at restore-time.
+ */
+static void
+_StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ if (oid == 0)
+ pg_fatal("invalid OID for large object");
+
+ WriteInt(AH, oid);
+
+ ctx->cs = AllocateCompressor(AH->compression, _CustomWriteFunc);
+}
+
+/*
+ * Called by the archiver when the dumper calls EndBlob.
+ *
+ * Optional.
+ */
+static void
+_EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ EndCompressor(AH, ctx->cs);
+ /* Send the end marker */
+ WriteInt(AH, 0);
+}
+
+/*
+ * Called by the archiver when finishing saving all BLOB DATA.
+ *
+ * Optional.
+ */
+static void
+_EndBlobs(ArchiveHandle *AH, TocEntry *te)
+{
+ /* Write out a fake zero OID to mark end-of-blobs. */
+ WriteInt(AH, 0);
+}
+
+/*
+ * Print data for a given TOC entry
+ */
+static void
+_PrintTocData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+ int blkType;
+ int id;
+
+ if (tctx->dataState == K_OFFSET_NO_DATA)
+ return;
+
+ if (!ctx->hasSeek || tctx->dataState == K_OFFSET_POS_NOT_SET)
+ {
+ /*
+ * We cannot seek directly to the desired block. Instead, skip over
+ * block headers until we find the one we want. Remember the
+ * positions of skipped-over blocks, so that if we later decide we
+ * need to read one, we'll be able to seek to it.
+ *
+ * When our input file is seekable, we can do the search starting from
+ * the point after the last data block we scanned in previous
+ * iterations of this function.
+ */
+ if (ctx->hasSeek)
+ {
+ if (fseeko(AH->FH, ctx->lastFilePos, SEEK_SET) != 0)
+ pg_fatal("error during file seek: %m");
+ }
+
+ for (;;)
+ {
+ pgoff_t thisBlkPos = _getFilePos(AH, ctx);
+
+ _readBlockHeader(AH, &blkType, &id);
+
+ if (blkType == EOF || id == te->dumpId)
+ break;
+
+ /* Remember the block position, if we got one */
+ if (thisBlkPos >= 0)
+ {
+ TocEntry *otherte = getTocEntryByDumpId(AH, id);
+
+ if (otherte && otherte->formatData)
+ {
+ lclTocEntry *othertctx = (lclTocEntry *) otherte->formatData;
+
+ /*
+ * Note: on Windows, multiple threads might access/update
+ * the same lclTocEntry concurrently, but that should be
+ * safe as long as we update dataPos before dataState.
+ * Ideally, we'd use pg_write_barrier() to enforce that,
+ * but the needed infrastructure doesn't exist in frontend
+ * code. But Windows only runs on machines with strong
+ * store ordering, so it should be okay for now.
+ */
+ if (othertctx->dataState == K_OFFSET_POS_NOT_SET)
+ {
+ othertctx->dataPos = thisBlkPos;
+ othertctx->dataState = K_OFFSET_POS_SET;
+ }
+ else if (othertctx->dataPos != thisBlkPos ||
+ othertctx->dataState != K_OFFSET_POS_SET)
+ {
+ /* sanity check */
+ pg_log_warning("data block %d has wrong seek position",
+ id);
+ }
+ }
+ }
+
+ switch (blkType)
+ {
+ case BLK_DATA:
+ _skipData(AH);
+ break;
+
+ case BLK_BLOBS:
+ _skipBlobs(AH);
+ break;
+
+ default: /* Always have a default */
+ pg_fatal("unrecognized data block type (%d) while searching archive",
+ blkType);
+ break;
+ }
+ }
+ }
+ else
+ {
+ /* We can just seek to the place we need to be. */
+ if (fseeko(AH->FH, tctx->dataPos, SEEK_SET) != 0)
+ pg_fatal("error during file seek: %m");
+
+ _readBlockHeader(AH, &blkType, &id);
+ }
+
+ /*
+ * If we reached EOF without finding the block we want, then either it
+ * doesn't exist, or it does but we lack the ability to seek back to it.
+ */
+ if (blkType == EOF)
+ {
+ if (!ctx->hasSeek)
+ pg_fatal("could not find block ID %d in archive -- "
+ "possibly due to out-of-order restore request, "
+ "which cannot be handled due to non-seekable input file",
+ te->dumpId);
+ else
+ pg_fatal("could not find block ID %d in archive -- "
+ "possibly corrupt archive",
+ te->dumpId);
+ }
+
+ /* Are we sane? */
+ if (id != te->dumpId)
+ pg_fatal("found unexpected block ID (%d) when reading data -- expected %d",
+ id, te->dumpId);
+
+ switch (blkType)
+ {
+ case BLK_DATA:
+ _PrintData(AH);
+ break;
+
+ case BLK_BLOBS:
+ _LoadBlobs(AH, AH->public.ropt->dropSchema);
+ break;
+
+ default: /* Always have a default */
+ pg_fatal("unrecognized data block type %d while restoring archive",
+ blkType);
+ break;
+ }
+
+ /*
+ * If our input file is seekable but lacks data offsets, update our
+ * knowledge of where to start future searches from. (Note that we did
+ * not update the current TE's dataState/dataPos. We could have, but
+ * there is no point since it will not be visited again.)
+ */
+ if (ctx->hasSeek && tctx->dataState == K_OFFSET_POS_NOT_SET)
+ {
+ pgoff_t curPos = _getFilePos(AH, ctx);
+
+ if (curPos > ctx->lastFilePos)
+ ctx->lastFilePos = curPos;
+ }
+}
+
+/*
+ * Print data from current file position.
+*/
+static void
+_PrintData(ArchiveHandle *AH)
+{
+ ReadDataFromArchive(AH, AH->compression, _CustomReadFunc);
+}
+
+static void
+_LoadBlobs(ArchiveHandle *AH, bool drop)
+{
+ Oid oid;
+
+ StartRestoreBlobs(AH);
+
+ oid = ReadInt(AH);
+ while (oid != 0)
+ {
+ StartRestoreBlob(AH, oid, drop);
+ _PrintData(AH);
+ EndRestoreBlob(AH, oid);
+ oid = ReadInt(AH);
+ }
+
+ EndRestoreBlobs(AH);
+}
+
+/*
+ * Skip the BLOBs from the current file position.
+ * BLOBS are written sequentially as data blocks (see below).
+ * Each BLOB is preceded by its original OID.
+ * A zero OID indicates the end of the BLOBS.
+ */
+static void
+_skipBlobs(ArchiveHandle *AH)
+{
+ Oid oid;
+
+ oid = ReadInt(AH);
+ while (oid != 0)
+ {
+ _skipData(AH);
+ oid = ReadInt(AH);
+ }
+}
+
+/*
+ * Skip data from current file position.
+ * Data blocks are formatted as an integer length, followed by data.
+ * A zero length indicates the end of the block.
+*/
+static void
+_skipData(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ size_t blkLen;
+ char *buf = NULL;
+ int buflen = 0;
+
+ blkLen = ReadInt(AH);
+ while (blkLen != 0)
+ {
+ if (ctx->hasSeek)
+ {
+ if (fseeko(AH->FH, blkLen, SEEK_CUR) != 0)
+ pg_fatal("error during file seek: %m");
+ }
+ else
+ {
+ if (blkLen > buflen)
+ {
+ if (buf)
+ free(buf);
+ buf = (char *) pg_malloc(blkLen);
+ buflen = blkLen;
+ }
+ if (fread(buf, 1, blkLen, AH->FH) != blkLen)
+ {
+ if (feof(AH->FH))
+ pg_fatal("could not read from input file: end of file");
+ else
+ pg_fatal("could not read from input file: %m");
+ }
+ }
+
+ blkLen = ReadInt(AH);
+ }
+
+ if (buf)
+ free(buf);
+}
+
+/*
+ * Write a byte of data to the archive.
+ *
+ * Mandatory.
+ *
+ * Called by the archiver to do integer & byte output to the archive.
+ */
+static int
+_WriteByte(ArchiveHandle *AH, const int i)
+{
+ if (fputc(i, AH->FH) == EOF)
+ WRITE_ERROR_EXIT;
+
+ return 1;
+}
+
+/*
+ * Read a byte of data from the archive.
+ *
+ * Mandatory
+ *
+ * Called by the archiver to read bytes & integers from the archive.
+ * EOF should be treated as a fatal error.
+ */
+static int
+_ReadByte(ArchiveHandle *AH)
+{
+ int res;
+
+ res = getc(AH->FH);
+ if (res == EOF)
+ READ_ERROR_EXIT(AH->FH);
+ return res;
+}
+
+/*
+ * Write a buffer of data to the archive.
+ *
+ * Mandatory.
+ *
+ * Called by the archiver to write a block of bytes to the archive.
+ */
+static void
+_WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)
+{
+ if (fwrite(buf, 1, len, AH->FH) != len)
+ WRITE_ERROR_EXIT;
+}
+
+/*
+ * Read a block of bytes from the archive.
+ *
+ * Mandatory.
+ *
+ * Called by the archiver to read a block of bytes from the archive
+ */
+static void
+_ReadBuf(ArchiveHandle *AH, void *buf, size_t len)
+{
+ if (fread(buf, 1, len, AH->FH) != len)
+ READ_ERROR_EXIT(AH->FH);
+}
+
+/*
+ * Close the archive.
+ *
+ * Mandatory.
+ *
+ * When writing the archive, this is the routine that actually starts
+ * the process of saving it to files. No data should be written prior
+ * to this point, since the user could sort the TOC after creating it.
+ *
+ * If an archive is to be written, this routine must call:
+ * WriteHead to save the archive header
+ * WriteToc to save the TOC entries
+ * WriteDataChunks to save all DATA & BLOBs.
+ *
+ */
+static void
+_CloseArchive(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ pgoff_t tpos;
+
+ if (AH->mode == archModeWrite)
+ {
+ WriteHead(AH);
+ /* Remember TOC's seek position for use below */
+ tpos = ftello(AH->FH);
+ if (tpos < 0 && ctx->hasSeek)
+ pg_fatal("could not determine seek position in archive file: %m");
+ WriteToc(AH);
+ WriteDataChunks(AH, NULL);
+
+ /*
+ * If possible, re-write the TOC in order to update the data offset
+ * information. This is not essential, as pg_restore can cope in most
+ * cases without it; but it can make pg_restore significantly faster
+ * in some situations (especially parallel restore).
+ */
+ if (ctx->hasSeek &&
+ fseeko(AH->FH, tpos, SEEK_SET) == 0)
+ WriteToc(AH);
+ }
+
+ if (fclose(AH->FH) != 0)
+ pg_fatal("could not close archive file: %m");
+
+ /* Sync the output file if one is defined */
+ if (AH->dosync && AH->mode == archModeWrite && AH->fSpec)
+ (void) fsync_fname(AH->fSpec, false);
+
+ AH->FH = NULL;
+}
+
+/*
+ * Reopen the archive's file handle.
+ *
+ * We close the original file handle, except on Windows. (The difference
+ * is because on Windows, this is used within a multithreading context,
+ * and we don't want a thread closing the parent file handle.)
+ */
+static void
+_ReopenArchive(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ pgoff_t tpos;
+
+ if (AH->mode == archModeWrite)
+ pg_fatal("can only reopen input archives");
+
+ /*
+ * These two cases are user-facing errors since they represent unsupported
+ * (but not invalid) use-cases. Word the error messages appropriately.
+ */
+ if (AH->fSpec == NULL || strcmp(AH->fSpec, "") == 0)
+ pg_fatal("parallel restore from standard input is not supported");
+ if (!ctx->hasSeek)
+ pg_fatal("parallel restore from non-seekable file is not supported");
+
+ tpos = ftello(AH->FH);
+ if (tpos < 0)
+ pg_fatal("could not determine seek position in archive file: %m");
+
+#ifndef WIN32
+ if (fclose(AH->FH) != 0)
+ pg_fatal("could not close archive file: %m");
+#endif
+
+ AH->FH = fopen(AH->fSpec, PG_BINARY_R);
+ if (!AH->FH)
+ pg_fatal("could not open input file \"%s\": %m", AH->fSpec);
+
+ if (fseeko(AH->FH, tpos, SEEK_SET) != 0)
+ pg_fatal("could not set seek position in archive file: %m");
+}
+
+/*
+ * Prepare for parallel restore.
+ *
+ * The main thing that needs to happen here is to fill in TABLE DATA and BLOBS
+ * TOC entries' dataLength fields with appropriate values to guide the
+ * ordering of restore jobs. The source of said data is format-dependent,
+ * as is the exact meaning of the values.
+ *
+ * A format module might also choose to do other setup here.
+ */
+static void
+_PrepParallelRestore(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ TocEntry *prev_te = NULL;
+ lclTocEntry *prev_tctx = NULL;
+ TocEntry *te;
+
+ /*
+ * Knowing that the data items were dumped out in TOC order, we can
+ * reconstruct the length of each item as the delta to the start offset of
+ * the next data item.
+ */
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ /*
+ * Ignore entries without a known data offset; if we were unable to
+ * seek to rewrite the TOC when creating the archive, this'll be all
+ * of them, and we'll end up with no size estimates.
+ */
+ if (tctx->dataState != K_OFFSET_POS_SET)
+ continue;
+
+ /* Compute previous data item's length */
+ if (prev_te)
+ {
+ if (tctx->dataPos > prev_tctx->dataPos)
+ prev_te->dataLength = tctx->dataPos - prev_tctx->dataPos;
+ }
+
+ prev_te = te;
+ prev_tctx = tctx;
+ }
+
+ /* If OK to seek, we can determine the length of the last item */
+ if (prev_te && ctx->hasSeek)
+ {
+ pgoff_t endpos;
+
+ if (fseeko(AH->FH, 0, SEEK_END) != 0)
+ pg_fatal("error during file seek: %m");
+ endpos = ftello(AH->FH);
+ if (endpos > prev_tctx->dataPos)
+ prev_te->dataLength = endpos - prev_tctx->dataPos;
+ }
+}
+
+/*
+ * Clone format-specific fields during parallel restoration.
+ */
+static void
+_Clone(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ /*
+ * Each thread must have private lclContext working state.
+ */
+ AH->formatData = (lclContext *) pg_malloc(sizeof(lclContext));
+ memcpy(AH->formatData, ctx, sizeof(lclContext));
+ ctx = (lclContext *) AH->formatData;
+
+ /* sanity check, shouldn't happen */
+ if (ctx->cs != NULL)
+ pg_fatal("compressor active");
+
+ /*
+ * We intentionally do not clone TOC-entry-local state: it's useful to
+ * share knowledge about where the data blocks are across threads.
+ * _PrintTocData has to be careful about the order of operations on that
+ * state, though.
+ *
+ * Note: we do not make a local lo_buf because we expect at most one BLOBS
+ * entry per archive, so no parallelism is possible.
+ */
+}
+
+static void
+_DeClone(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ free(ctx);
+}
+
+/*
+ * This function is executed in the child of a parallel restore from a
+ * custom-format archive and restores the actual data for one TOC entry.
+ */
+static int
+_WorkerJobRestoreCustom(ArchiveHandle *AH, TocEntry *te)
+{
+ return parallel_restore(AH, te);
+}
+
+/*--------------------------------------------------
+ * END OF FORMAT CALLBACKS
+ *--------------------------------------------------
+ */
+
+/*
+ * Get the current position in the archive file.
+ *
+ * With a non-seekable archive file, we may not be able to obtain the
+ * file position. If so, just return -1. It's not too important in
+ * that case because we won't be able to rewrite the TOC to fill in
+ * data block offsets anyway.
+ */
+static pgoff_t
+_getFilePos(ArchiveHandle *AH, lclContext *ctx)
+{
+ pgoff_t pos;
+
+ pos = ftello(AH->FH);
+ if (pos < 0)
+ {
+ /* Not expected if we found we can seek. */
+ if (ctx->hasSeek)
+ pg_fatal("could not determine seek position in archive file: %m");
+ }
+ return pos;
+}
+
+/*
+ * Read a data block header. The format changed in V1.3, so we
+ * centralize the code here for simplicity. Returns *type = EOF
+ * if at EOF.
+ */
+static void
+_readBlockHeader(ArchiveHandle *AH, int *type, int *id)
+{
+ int byt;
+
+ /*
+ * Note: if we are at EOF with a pre-1.3 input file, we'll pg_fatal()
+ * inside ReadInt rather than returning EOF. It doesn't seem worth
+ * jumping through hoops to deal with that case better, because no such
+ * files are likely to exist in the wild: only some 7.1 development
+ * versions of pg_dump ever generated such files.
+ */
+ if (AH->version < K_VERS_1_3)
+ *type = BLK_DATA;
+ else
+ {
+ byt = getc(AH->FH);
+ *type = byt;
+ if (byt == EOF)
+ {
+ *id = 0; /* don't return an uninitialized value */
+ return;
+ }
+ }
+
+ *id = ReadInt(AH);
+}
+
+/*
+ * Callback function for WriteDataToArchive. Writes one block of (compressed)
+ * data to the archive.
+ */
+static void
+_CustomWriteFunc(ArchiveHandle *AH, const char *buf, size_t len)
+{
+ /* never write 0-byte blocks (this should not happen) */
+ if (len > 0)
+ {
+ WriteInt(AH, len);
+ _WriteBuf(AH, buf, len);
+ }
+}
+
+/*
+ * Callback function for ReadDataFromArchive. To keep things simple, we
+ * always read one compressed block at a time.
+ */
+static size_t
+_CustomReadFunc(ArchiveHandle *AH, char **buf, size_t *buflen)
+{
+ size_t blkLen;
+
+ /* Read length */
+ blkLen = ReadInt(AH);
+ if (blkLen == 0)
+ return 0;
+
+ /* If the caller's buffer is not large enough, allocate a bigger one */
+ if (blkLen > *buflen)
+ {
+ free(*buf);
+ *buf = (char *) pg_malloc(blkLen);
+ *buflen = blkLen;
+ }
+
+ /* exits app on read errors */
+ _ReadBuf(AH, *buf, blkLen);
+
+ return blkLen;
+}
diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c
new file mode 100644
index 0000000..89cdbf8
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_db.c
@@ -0,0 +1,570 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_db.c
+ *
+ * Implements the basic DB functions used by the archiver.
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup_db.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <unistd.h>
+#include <ctype.h>
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#endif
+
+#include "common/connect.h"
+#include "common/string.h"
+#include "dumputils.h"
+#include "fe_utils/string_utils.h"
+#include "parallel.h"
+#include "pg_backup_archiver.h"
+#include "pg_backup_db.h"
+#include "pg_backup_utils.h"
+
+static void _check_database_version(ArchiveHandle *AH);
+static void notice_processor(void *arg, const char *message);
+
+static void
+_check_database_version(ArchiveHandle *AH)
+{
+ const char *remoteversion_str;
+ int remoteversion;
+ PGresult *res;
+
+ remoteversion_str = PQparameterStatus(AH->connection, "server_version");
+ remoteversion = PQserverVersion(AH->connection);
+ if (remoteversion == 0 || !remoteversion_str)
+ pg_fatal("could not get server_version from libpq");
+
+ AH->public.remoteVersionStr = pg_strdup(remoteversion_str);
+ AH->public.remoteVersion = remoteversion;
+ if (!AH->archiveRemoteVersion)
+ AH->archiveRemoteVersion = AH->public.remoteVersionStr;
+
+ if (remoteversion != PG_VERSION_NUM
+ && (remoteversion < AH->public.minRemoteVersion ||
+ remoteversion > AH->public.maxRemoteVersion))
+ {
+ pg_log_error("aborting because of server version mismatch");
+ pg_log_error_detail("server version: %s; %s version: %s",
+ remoteversion_str, progname, PG_VERSION);
+ exit(1);
+ }
+
+ /*
+ * Check if server is in recovery mode, which means we are on a hot
+ * standby.
+ */
+ res = ExecuteSqlQueryForSingleRow((Archive *) AH,
+ "SELECT pg_catalog.pg_is_in_recovery()");
+ AH->public.isStandby = (strcmp(PQgetvalue(res, 0, 0), "t") == 0);
+ PQclear(res);
+}
+
+/*
+ * Reconnect to the server. If dbname is not NULL, use that database,
+ * else the one associated with the archive handle.
+ */
+void
+ReconnectToServer(ArchiveHandle *AH, const char *dbname)
+{
+ PGconn *oldConn = AH->connection;
+ RestoreOptions *ropt = AH->public.ropt;
+
+ /*
+ * Save the dbname, if given, in override_dbname so that it will also
+ * affect any later reconnection attempt.
+ */
+ if (dbname)
+ ropt->cparams.override_dbname = pg_strdup(dbname);
+
+ /*
+ * Note: we want to establish the new connection, and in particular update
+ * ArchiveHandle's connCancel, before closing old connection. Otherwise
+ * an ill-timed SIGINT could try to access a dead connection.
+ */
+ AH->connection = NULL; /* dodge error check in ConnectDatabase */
+
+ ConnectDatabase((Archive *) AH, &ropt->cparams, true);
+
+ PQfinish(oldConn);
+}
+
+/*
+ * Make, or remake, a database connection with the given parameters.
+ *
+ * The resulting connection handle is stored in AHX->connection.
+ *
+ * An interactive password prompt is automatically issued if required.
+ * We store the results of that in AHX->savedPassword.
+ * Note: it's not really all that sensible to use a single-entry password
+ * cache if the username keeps changing. In current usage, however, the
+ * username never does change, so one savedPassword is sufficient.
+ */
+void
+ConnectDatabase(Archive *AHX,
+ const ConnParams *cparams,
+ bool isReconnect)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ trivalue prompt_password;
+ char *password;
+ bool new_pass;
+
+ if (AH->connection)
+ pg_fatal("already connected to a database");
+
+ /* Never prompt for a password during a reconnection */
+ prompt_password = isReconnect ? TRI_NO : cparams->promptPassword;
+
+ password = AH->savedPassword;
+
+ if (prompt_password == TRI_YES && password == NULL)
+ password = simple_prompt("Password: ", false);
+
+ /*
+ * Start the connection. Loop until we have a password if requested by
+ * backend.
+ */
+ do
+ {
+ const char *keywords[8];
+ const char *values[8];
+ int i = 0;
+
+ /*
+ * If dbname is a connstring, its entries can override the other
+ * values obtained from cparams; but in turn, override_dbname can
+ * override the dbname component of it.
+ */
+ keywords[i] = "host";
+ values[i++] = cparams->pghost;
+ keywords[i] = "port";
+ values[i++] = cparams->pgport;
+ keywords[i] = "user";
+ values[i++] = cparams->username;
+ keywords[i] = "password";
+ values[i++] = password;
+ keywords[i] = "dbname";
+ values[i++] = cparams->dbname;
+ if (cparams->override_dbname)
+ {
+ keywords[i] = "dbname";
+ values[i++] = cparams->override_dbname;
+ }
+ keywords[i] = "fallback_application_name";
+ values[i++] = progname;
+ keywords[i] = NULL;
+ values[i++] = NULL;
+ Assert(i <= lengthof(keywords));
+
+ new_pass = false;
+ AH->connection = PQconnectdbParams(keywords, values, true);
+
+ if (!AH->connection)
+ pg_fatal("could not connect to database");
+
+ if (PQstatus(AH->connection) == CONNECTION_BAD &&
+ PQconnectionNeedsPassword(AH->connection) &&
+ password == NULL &&
+ prompt_password != TRI_NO)
+ {
+ PQfinish(AH->connection);
+ password = simple_prompt("Password: ", false);
+ new_pass = true;
+ }
+ } while (new_pass);
+
+ /* check to see that the backend connection was successfully made */
+ if (PQstatus(AH->connection) == CONNECTION_BAD)
+ {
+ if (isReconnect)
+ pg_fatal("reconnection failed: %s",
+ PQerrorMessage(AH->connection));
+ else
+ pg_fatal("%s",
+ PQerrorMessage(AH->connection));
+ }
+
+ /* Start strict; later phases may override this. */
+ PQclear(ExecuteSqlQueryForSingleRow((Archive *) AH,
+ ALWAYS_SECURE_SEARCH_PATH_SQL));
+
+ if (password && password != AH->savedPassword)
+ free(password);
+
+ /*
+ * We want to remember connection's actual password, whether or not we got
+ * it by prompting. So we don't just store the password variable.
+ */
+ if (PQconnectionUsedPassword(AH->connection))
+ {
+ if (AH->savedPassword)
+ free(AH->savedPassword);
+ AH->savedPassword = pg_strdup(PQpass(AH->connection));
+ }
+
+ /* check for version mismatch */
+ _check_database_version(AH);
+
+ PQsetNoticeProcessor(AH->connection, notice_processor, NULL);
+
+ /* arrange for SIGINT to issue a query cancel on this connection */
+ set_archive_cancel_info(AH, AH->connection);
+}
+
+/*
+ * Close the connection to the database and also cancel off the query if we
+ * have one running.
+ */
+void
+DisconnectDatabase(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ char errbuf[1];
+
+ if (!AH->connection)
+ return;
+
+ if (AH->connCancel)
+ {
+ /*
+ * If we have an active query, send a cancel before closing, ignoring
+ * any errors. This is of no use for a normal exit, but might be
+ * helpful during pg_fatal().
+ */
+ if (PQtransactionStatus(AH->connection) == PQTRANS_ACTIVE)
+ (void) PQcancel(AH->connCancel, errbuf, sizeof(errbuf));
+
+ /*
+ * Prevent signal handler from sending a cancel after this.
+ */
+ set_archive_cancel_info(AH, NULL);
+ }
+
+ PQfinish(AH->connection);
+ AH->connection = NULL;
+}
+
+PGconn *
+GetConnection(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ return AH->connection;
+}
+
+static void
+notice_processor(void *arg, const char *message)
+{
+ pg_log_info("%s", message);
+}
+
+/* Like pg_fatal(), but with a complaint about a particular query. */
+static void
+die_on_query_failure(ArchiveHandle *AH, const char *query)
+{
+ pg_log_error("query failed: %s",
+ PQerrorMessage(AH->connection));
+ pg_log_error_detail("Query was: %s", query);
+ exit(1);
+}
+
+void
+ExecuteSqlStatement(Archive *AHX, const char *query)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ PGresult *res;
+
+ res = PQexec(AH->connection, query);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ die_on_query_failure(AH, query);
+ PQclear(res);
+}
+
+PGresult *
+ExecuteSqlQuery(Archive *AHX, const char *query, ExecStatusType status)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ PGresult *res;
+
+ res = PQexec(AH->connection, query);
+ if (PQresultStatus(res) != status)
+ die_on_query_failure(AH, query);
+ return res;
+}
+
+/*
+ * Execute an SQL query and verify that we got exactly one row back.
+ */
+PGresult *
+ExecuteSqlQueryForSingleRow(Archive *fout, const char *query)
+{
+ PGresult *res;
+ int ntups;
+
+ res = ExecuteSqlQuery(fout, query, PGRES_TUPLES_OK);
+
+ /* Expecting a single result only */
+ ntups = PQntuples(res);
+ if (ntups != 1)
+ pg_fatal(ngettext("query returned %d row instead of one: %s",
+ "query returned %d rows instead of one: %s",
+ ntups),
+ ntups, query);
+
+ return res;
+}
+
+/*
+ * Convenience function to send a query.
+ * Monitors result to detect COPY statements
+ */
+static void
+ExecuteSqlCommand(ArchiveHandle *AH, const char *qry, const char *desc)
+{
+ PGconn *conn = AH->connection;
+ PGresult *res;
+
+#ifdef NOT_USED
+ fprintf(stderr, "Executing: '%s'\n\n", qry);
+#endif
+ res = PQexec(conn, qry);
+
+ switch (PQresultStatus(res))
+ {
+ case PGRES_COMMAND_OK:
+ case PGRES_TUPLES_OK:
+ case PGRES_EMPTY_QUERY:
+ /* A-OK */
+ break;
+ case PGRES_COPY_IN:
+ /* Assume this is an expected result */
+ AH->pgCopyIn = true;
+ break;
+ default:
+ /* trouble */
+ warn_or_exit_horribly(AH, "%s: %sCommand was: %s",
+ desc, PQerrorMessage(conn), qry);
+ break;
+ }
+
+ PQclear(res);
+}
+
+
+/*
+ * Process non-COPY table data (that is, INSERT commands).
+ *
+ * The commands have been run together as one long string for compressibility,
+ * and we are receiving them in bufferloads with arbitrary boundaries, so we
+ * have to locate command boundaries and save partial commands across calls.
+ * All state must be kept in AH->sqlparse, not in local variables of this
+ * routine. We assume that AH->sqlparse was filled with zeroes when created.
+ *
+ * We have to lex the data to the extent of identifying literals and quoted
+ * identifiers, so that we can recognize statement-terminating semicolons.
+ * We assume that INSERT data will not contain SQL comments, E'' literals,
+ * or dollar-quoted strings, so this is much simpler than a full SQL lexer.
+ *
+ * Note: when restoring from a pre-9.0 dump file, this code is also used to
+ * process BLOB COMMENTS data, which has the same problem of containing
+ * multiple SQL commands that might be split across bufferloads. Fortunately,
+ * that data won't contain anything complicated to lex either.
+ */
+static void
+ExecuteSimpleCommands(ArchiveHandle *AH, const char *buf, size_t bufLen)
+{
+ const char *qry = buf;
+ const char *eos = buf + bufLen;
+
+ /* initialize command buffer if first time through */
+ if (AH->sqlparse.curCmd == NULL)
+ AH->sqlparse.curCmd = createPQExpBuffer();
+
+ for (; qry < eos; qry++)
+ {
+ char ch = *qry;
+
+ /* For neatness, we skip any newlines between commands */
+ if (!(ch == '\n' && AH->sqlparse.curCmd->len == 0))
+ appendPQExpBufferChar(AH->sqlparse.curCmd, ch);
+
+ switch (AH->sqlparse.state)
+ {
+ case SQL_SCAN: /* Default state == 0, set in _allocAH */
+ if (ch == ';')
+ {
+ /*
+ * We've found the end of a statement. Send it and reset
+ * the buffer.
+ */
+ ExecuteSqlCommand(AH, AH->sqlparse.curCmd->data,
+ "could not execute query");
+ resetPQExpBuffer(AH->sqlparse.curCmd);
+ }
+ else if (ch == '\'')
+ {
+ AH->sqlparse.state = SQL_IN_SINGLE_QUOTE;
+ AH->sqlparse.backSlash = false;
+ }
+ else if (ch == '"')
+ {
+ AH->sqlparse.state = SQL_IN_DOUBLE_QUOTE;
+ }
+ break;
+
+ case SQL_IN_SINGLE_QUOTE:
+ /* We needn't handle '' specially */
+ if (ch == '\'' && !AH->sqlparse.backSlash)
+ AH->sqlparse.state = SQL_SCAN;
+ else if (ch == '\\' && !AH->public.std_strings)
+ AH->sqlparse.backSlash = !AH->sqlparse.backSlash;
+ else
+ AH->sqlparse.backSlash = false;
+ break;
+
+ case SQL_IN_DOUBLE_QUOTE:
+ /* We needn't handle "" specially */
+ if (ch == '"')
+ AH->sqlparse.state = SQL_SCAN;
+ break;
+ }
+ }
+}
+
+
+/*
+ * Implement ahwrite() for direct-to-DB restore
+ */
+int
+ExecuteSqlCommandBuf(Archive *AHX, const char *buf, size_t bufLen)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ if (AH->outputKind == OUTPUT_COPYDATA)
+ {
+ /*
+ * COPY data.
+ *
+ * We drop the data on the floor if libpq has failed to enter COPY
+ * mode; this allows us to behave reasonably when trying to continue
+ * after an error in a COPY command.
+ */
+ if (AH->pgCopyIn &&
+ PQputCopyData(AH->connection, buf, bufLen) <= 0)
+ pg_fatal("error returned by PQputCopyData: %s",
+ PQerrorMessage(AH->connection));
+ }
+ else if (AH->outputKind == OUTPUT_OTHERDATA)
+ {
+ /*
+ * Table data expressed as INSERT commands; or, in old dump files,
+ * BLOB COMMENTS data (which is expressed as COMMENT ON commands).
+ */
+ ExecuteSimpleCommands(AH, buf, bufLen);
+ }
+ else
+ {
+ /*
+ * General SQL commands; we assume that commands will not be split
+ * across calls.
+ *
+ * In most cases the data passed to us will be a null-terminated
+ * string, but if it's not, we have to add a trailing null.
+ */
+ if (buf[bufLen] == '\0')
+ ExecuteSqlCommand(AH, buf, "could not execute query");
+ else
+ {
+ char *str = (char *) pg_malloc(bufLen + 1);
+
+ memcpy(str, buf, bufLen);
+ str[bufLen] = '\0';
+ ExecuteSqlCommand(AH, str, "could not execute query");
+ free(str);
+ }
+ }
+
+ return bufLen;
+}
+
+/*
+ * Terminate a COPY operation during direct-to-DB restore
+ */
+void
+EndDBCopyMode(Archive *AHX, const char *tocEntryTag)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ if (AH->pgCopyIn)
+ {
+ PGresult *res;
+
+ if (PQputCopyEnd(AH->connection, NULL) <= 0)
+ pg_fatal("error returned by PQputCopyEnd: %s",
+ PQerrorMessage(AH->connection));
+
+ /* Check command status and return to normal libpq state */
+ res = PQgetResult(AH->connection);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ warn_or_exit_horribly(AH, "COPY failed for table \"%s\": %s",
+ tocEntryTag, PQerrorMessage(AH->connection));
+ PQclear(res);
+
+ /* Do this to ensure we've pumped libpq back to idle state */
+ if (PQgetResult(AH->connection) != NULL)
+ pg_log_warning("unexpected extra results during COPY of table \"%s\"",
+ tocEntryTag);
+
+ AH->pgCopyIn = false;
+ }
+}
+
+void
+StartTransaction(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ ExecuteSqlCommand(AH, "BEGIN", "could not start database transaction");
+}
+
+void
+CommitTransaction(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ ExecuteSqlCommand(AH, "COMMIT", "could not commit database transaction");
+}
+
+void
+DropBlobIfExists(ArchiveHandle *AH, Oid oid)
+{
+ /*
+ * If we are not restoring to a direct database connection, we have to
+ * guess about how to detect whether the blob exists. Assume new-style.
+ */
+ if (AH->connection == NULL ||
+ PQserverVersion(AH->connection) >= 90000)
+ {
+ ahprintf(AH,
+ "SELECT pg_catalog.lo_unlink(oid) "
+ "FROM pg_catalog.pg_largeobject_metadata "
+ "WHERE oid = '%u';\n",
+ oid);
+ }
+ else
+ {
+ /* Restoring to pre-9.0 server, so do it the old way */
+ ahprintf(AH,
+ "SELECT CASE WHEN EXISTS("
+ "SELECT 1 FROM pg_catalog.pg_largeobject WHERE loid = '%u'"
+ ") THEN pg_catalog.lo_unlink('%u') END;\n",
+ oid, oid);
+ }
+}
diff --git a/src/bin/pg_dump/pg_backup_db.h b/src/bin/pg_dump/pg_backup_db.h
new file mode 100644
index 0000000..8888dd3
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_db.h
@@ -0,0 +1,26 @@
+/*
+ * Definitions for pg_backup_db.c
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup_db.h
+ */
+
+#ifndef PG_BACKUP_DB_H
+#define PG_BACKUP_DB_H
+
+#include "pg_backup.h"
+
+
+extern int ExecuteSqlCommandBuf(Archive *AHX, const char *buf, size_t bufLen);
+
+extern void ExecuteSqlStatement(Archive *AHX, const char *query);
+extern PGresult *ExecuteSqlQuery(Archive *AHX, const char *query,
+ ExecStatusType status);
+extern PGresult *ExecuteSqlQueryForSingleRow(Archive *fout, const char *query);
+
+extern void EndDBCopyMode(Archive *AHX, const char *tocEntryTag);
+
+extern void StartTransaction(Archive *AHX);
+extern void CommitTransaction(Archive *AHX);
+
+#endif
diff --git a/src/bin/pg_dump/pg_backup_directory.c b/src/bin/pg_dump/pg_backup_directory.c
new file mode 100644
index 0000000..3f46f79
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_directory.c
@@ -0,0 +1,851 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_directory.c
+ *
+ * A directory format dump is a directory, which contains a "toc.dat" file
+ * for the TOC, and a separate file for each data entry, named "<oid>.dat".
+ * Large objects (BLOBs) are stored in separate files named "blob_<oid>.dat",
+ * and there's a plain-text TOC file for them called "blobs.toc". If
+ * compression is used, each data file is individually compressed and the
+ * ".gz" suffix is added to the filenames. The TOC files are never
+ * compressed by pg_dump, however they are accepted with the .gz suffix too,
+ * in case the user has manually compressed them with 'gzip'.
+ *
+ * NOTE: This format is identical to the files written in the tar file in
+ * the 'tar' format, except that we don't write the restore.sql file (TODO),
+ * and the tar format doesn't support compression. Please keep the formats in
+ * sync.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ * Portions Copyright (c) 2000, Philip Warner
+ *
+ * Rights are granted to use this software in any way so long
+ * as this notice is not removed.
+ *
+ * The author is not responsible for loss or damages that may
+ * result from its use.
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup_directory.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <dirent.h>
+#include <sys/stat.h>
+
+#include "common/file_utils.h"
+#include "compress_io.h"
+#include "parallel.h"
+#include "pg_backup_utils.h"
+
+typedef struct
+{
+ /*
+ * Our archive location. This is basically what the user specified as his
+ * backup file but of course here it is a directory.
+ */
+ char *directory;
+
+ cfp *dataFH; /* currently open data file */
+
+ cfp *blobsTocFH; /* file handle for blobs.toc */
+ ParallelState *pstate; /* for parallel backup / restore */
+} lclContext;
+
+typedef struct
+{
+ char *filename; /* filename excluding the directory (basename) */
+} lclTocEntry;
+
+/* prototypes for private functions */
+static void _ArchiveEntry(ArchiveHandle *AH, TocEntry *te);
+static void _StartData(ArchiveHandle *AH, TocEntry *te);
+static void _EndData(ArchiveHandle *AH, TocEntry *te);
+static void _WriteData(ArchiveHandle *AH, const void *data, size_t dLen);
+static int _WriteByte(ArchiveHandle *AH, const int i);
+static int _ReadByte(ArchiveHandle *);
+static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
+static void _ReadBuf(ArchiveHandle *AH, void *buf, size_t len);
+static void _CloseArchive(ArchiveHandle *AH);
+static void _ReopenArchive(ArchiveHandle *AH);
+static void _PrintTocData(ArchiveHandle *AH, TocEntry *te);
+
+static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te);
+static void _ReadExtraToc(ArchiveHandle *AH, TocEntry *te);
+static void _PrintExtraToc(ArchiveHandle *AH, TocEntry *te);
+
+static void _StartBlobs(ArchiveHandle *AH, TocEntry *te);
+static void _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
+static void _EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
+static void _EndBlobs(ArchiveHandle *AH, TocEntry *te);
+static void _LoadBlobs(ArchiveHandle *AH);
+
+static void _PrepParallelRestore(ArchiveHandle *AH);
+static void _Clone(ArchiveHandle *AH);
+static void _DeClone(ArchiveHandle *AH);
+
+static int _WorkerJobRestoreDirectory(ArchiveHandle *AH, TocEntry *te);
+static int _WorkerJobDumpDirectory(ArchiveHandle *AH, TocEntry *te);
+
+static void setFilePath(ArchiveHandle *AH, char *buf,
+ const char *relativeFilename);
+
+/*
+ * Init routine required by ALL formats. This is a global routine
+ * and should be declared in pg_backup_archiver.h
+ *
+ * Its task is to create any extra archive context (using AH->formatData),
+ * and to initialize the supported function pointers.
+ *
+ * It should also prepare whatever its input source is for reading/writing,
+ * and in the case of a read mode connection, it should load the Header & TOC.
+ */
+void
+InitArchiveFmt_Directory(ArchiveHandle *AH)
+{
+ lclContext *ctx;
+
+ /* Assuming static functions, this can be copied for each format. */
+ AH->ArchiveEntryPtr = _ArchiveEntry;
+ AH->StartDataPtr = _StartData;
+ AH->WriteDataPtr = _WriteData;
+ AH->EndDataPtr = _EndData;
+ AH->WriteBytePtr = _WriteByte;
+ AH->ReadBytePtr = _ReadByte;
+ AH->WriteBufPtr = _WriteBuf;
+ AH->ReadBufPtr = _ReadBuf;
+ AH->ClosePtr = _CloseArchive;
+ AH->ReopenPtr = _ReopenArchive;
+ AH->PrintTocDataPtr = _PrintTocData;
+ AH->ReadExtraTocPtr = _ReadExtraToc;
+ AH->WriteExtraTocPtr = _WriteExtraToc;
+ AH->PrintExtraTocPtr = _PrintExtraToc;
+
+ AH->StartBlobsPtr = _StartBlobs;
+ AH->StartBlobPtr = _StartBlob;
+ AH->EndBlobPtr = _EndBlob;
+ AH->EndBlobsPtr = _EndBlobs;
+
+ AH->PrepParallelRestorePtr = _PrepParallelRestore;
+ AH->ClonePtr = _Clone;
+ AH->DeClonePtr = _DeClone;
+
+ AH->WorkerJobRestorePtr = _WorkerJobRestoreDirectory;
+ AH->WorkerJobDumpPtr = _WorkerJobDumpDirectory;
+
+ /* Set up our private context */
+ ctx = (lclContext *) pg_malloc0(sizeof(lclContext));
+ AH->formatData = (void *) ctx;
+
+ ctx->dataFH = NULL;
+ ctx->blobsTocFH = NULL;
+
+ /* Initialize LO buffering */
+ AH->lo_buf_size = LOBBUFSIZE;
+ AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE);
+
+ /*
+ * Now open the TOC file
+ */
+
+ if (!AH->fSpec || strcmp(AH->fSpec, "") == 0)
+ pg_fatal("no output directory specified");
+
+ ctx->directory = AH->fSpec;
+
+ if (AH->mode == archModeWrite)
+ {
+ struct stat st;
+ bool is_empty = false;
+
+ /* we accept an empty existing directory */
+ if (stat(ctx->directory, &st) == 0 && S_ISDIR(st.st_mode))
+ {
+ DIR *dir = opendir(ctx->directory);
+
+ if (dir)
+ {
+ struct dirent *d;
+
+ is_empty = true;
+ while (errno = 0, (d = readdir(dir)))
+ {
+ if (strcmp(d->d_name, ".") != 0 && strcmp(d->d_name, "..") != 0)
+ {
+ is_empty = false;
+ break;
+ }
+ }
+
+ if (errno)
+ pg_fatal("could not read directory \"%s\": %m",
+ ctx->directory);
+
+ if (closedir(dir))
+ pg_fatal("could not close directory \"%s\": %m",
+ ctx->directory);
+ }
+ }
+
+ if (!is_empty && mkdir(ctx->directory, 0700) < 0)
+ pg_fatal("could not create directory \"%s\": %m",
+ ctx->directory);
+ }
+ else
+ { /* Read Mode */
+ char fname[MAXPGPATH];
+ cfp *tocFH;
+
+ setFilePath(AH, fname, "toc.dat");
+
+ tocFH = cfopen_read(fname, PG_BINARY_R);
+ if (tocFH == NULL)
+ pg_fatal("could not open input file \"%s\": %m", fname);
+
+ ctx->dataFH = tocFH;
+
+ /*
+ * The TOC of a directory format dump shares the format code of the
+ * tar format.
+ */
+ AH->format = archTar;
+ ReadHead(AH);
+ AH->format = archDirectory;
+ ReadToc(AH);
+
+ /* Nothing else in the file, so close it again... */
+ if (cfclose(tocFH) != 0)
+ pg_fatal("could not close TOC file: %m");
+ ctx->dataFH = NULL;
+ }
+}
+
+/*
+ * Called by the Archiver when the dumper creates a new TOC entry.
+ *
+ * We determine the filename for this entry.
+*/
+static void
+_ArchiveEntry(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *tctx;
+ char fn[MAXPGPATH];
+
+ tctx = (lclTocEntry *) pg_malloc0(sizeof(lclTocEntry));
+ if (strcmp(te->desc, "BLOBS") == 0)
+ tctx->filename = pg_strdup("blobs.toc");
+ else if (te->dataDumper)
+ {
+ snprintf(fn, MAXPGPATH, "%d.dat", te->dumpId);
+ tctx->filename = pg_strdup(fn);
+ }
+ else
+ tctx->filename = NULL;
+
+ te->formatData = (void *) tctx;
+}
+
+/*
+ * Called by the Archiver to save any extra format-related TOC entry
+ * data.
+ *
+ * Use the Archiver routines to write data - they are non-endian, and
+ * maintain other important file information.
+ */
+static void
+_WriteExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ /*
+ * A dumpable object has set tctx->filename, any other object has not.
+ * (see _ArchiveEntry).
+ */
+ if (tctx->filename)
+ WriteStr(AH, tctx->filename);
+ else
+ WriteStr(AH, "");
+}
+
+/*
+ * Called by the Archiver to read any extra format-related TOC data.
+ *
+ * Needs to match the order defined in _WriteExtraToc, and should also
+ * use the Archiver input routines.
+ */
+static void
+_ReadExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ if (tctx == NULL)
+ {
+ tctx = (lclTocEntry *) pg_malloc0(sizeof(lclTocEntry));
+ te->formatData = (void *) tctx;
+ }
+
+ tctx->filename = ReadStr(AH);
+ if (strlen(tctx->filename) == 0)
+ {
+ free(tctx->filename);
+ tctx->filename = NULL;
+ }
+}
+
+/*
+ * Called by the Archiver when restoring an archive to output a comment
+ * that includes useful information about the TOC entry.
+ */
+static void
+_PrintExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ if (AH->public.verbose && tctx->filename)
+ ahprintf(AH, "-- File: %s\n", tctx->filename);
+}
+
+/*
+ * Called by the archiver when saving TABLE DATA (not schema). This routine
+ * should save whatever format-specific information is needed to read
+ * the archive back.
+ *
+ * It is called just prior to the dumper's 'DataDumper' routine being called.
+ *
+ * We create the data file for writing.
+ */
+static void
+_StartData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char fname[MAXPGPATH];
+
+ setFilePath(AH, fname, tctx->filename);
+
+ ctx->dataFH = cfopen_write(fname, PG_BINARY_W, AH->compression);
+ if (ctx->dataFH == NULL)
+ pg_fatal("could not open output file \"%s\": %m", fname);
+}
+
+/*
+ * Called by archiver when dumper calls WriteData. This routine is
+ * called for both BLOB and TABLE data; it is the responsibility of
+ * the format to manage each kind of data using StartBlob/StartData.
+ *
+ * It should only be called from within a DataDumper routine.
+ *
+ * We write the data to the open data file.
+ */
+static void
+_WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ errno = 0;
+ if (dLen > 0 && cfwrite(data, dLen, ctx->dataFH) != dLen)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to output file: %s",
+ get_cfp_error(ctx->dataFH));
+ }
+}
+
+/*
+ * Called by the archiver when a dumper's 'DataDumper' routine has
+ * finished.
+ *
+ * We close the data file.
+ */
+static void
+_EndData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ /* Close the file */
+ if (cfclose(ctx->dataFH) != 0)
+ pg_fatal("could not close data file: %m");
+
+ ctx->dataFH = NULL;
+}
+
+/*
+ * Print data for a given file (can be a BLOB as well)
+ */
+static void
+_PrintFileData(ArchiveHandle *AH, char *filename)
+{
+ size_t cnt;
+ char *buf;
+ size_t buflen;
+ cfp *cfp;
+
+ if (!filename)
+ return;
+
+ cfp = cfopen_read(filename, PG_BINARY_R);
+
+ if (!cfp)
+ pg_fatal("could not open input file \"%s\": %m", filename);
+
+ buf = pg_malloc(ZLIB_OUT_SIZE);
+ buflen = ZLIB_OUT_SIZE;
+
+ while ((cnt = cfread(buf, buflen, cfp)))
+ {
+ ahwrite(buf, 1, cnt, AH);
+ }
+
+ free(buf);
+ if (cfclose(cfp) != 0)
+ pg_fatal("could not close data file \"%s\": %m", filename);
+}
+
+/*
+ * Print data for a given TOC entry
+*/
+static void
+_PrintTocData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ if (!tctx->filename)
+ return;
+
+ if (strcmp(te->desc, "BLOBS") == 0)
+ _LoadBlobs(AH);
+ else
+ {
+ char fname[MAXPGPATH];
+
+ setFilePath(AH, fname, tctx->filename);
+ _PrintFileData(AH, fname);
+ }
+}
+
+static void
+_LoadBlobs(ArchiveHandle *AH)
+{
+ Oid oid;
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char tocfname[MAXPGPATH];
+ char line[MAXPGPATH];
+
+ StartRestoreBlobs(AH);
+
+ setFilePath(AH, tocfname, "blobs.toc");
+
+ ctx->blobsTocFH = cfopen_read(tocfname, PG_BINARY_R);
+
+ if (ctx->blobsTocFH == NULL)
+ pg_fatal("could not open large object TOC file \"%s\" for input: %m",
+ tocfname);
+
+ /* Read the blobs TOC file line-by-line, and process each blob */
+ while ((cfgets(ctx->blobsTocFH, line, MAXPGPATH)) != NULL)
+ {
+ char blobfname[MAXPGPATH + 1];
+ char path[MAXPGPATH];
+
+ /* Can't overflow because line and blobfname are the same length */
+ if (sscanf(line, "%u %" CppAsString2(MAXPGPATH) "s\n", &oid, blobfname) != 2)
+ pg_fatal("invalid line in large object TOC file \"%s\": \"%s\"",
+ tocfname, line);
+
+ StartRestoreBlob(AH, oid, AH->public.ropt->dropSchema);
+ snprintf(path, MAXPGPATH, "%s/%s", ctx->directory, blobfname);
+ _PrintFileData(AH, path);
+ EndRestoreBlob(AH, oid);
+ }
+ if (!cfeof(ctx->blobsTocFH))
+ pg_fatal("error reading large object TOC file \"%s\"",
+ tocfname);
+
+ if (cfclose(ctx->blobsTocFH) != 0)
+ pg_fatal("could not close large object TOC file \"%s\": %m",
+ tocfname);
+
+ ctx->blobsTocFH = NULL;
+
+ EndRestoreBlobs(AH);
+}
+
+
+/*
+ * Write a byte of data to the archive.
+ * Called by the archiver to do integer & byte output to the archive.
+ * These routines are only used to read & write the headers & TOC.
+ */
+static int
+_WriteByte(ArchiveHandle *AH, const int i)
+{
+ unsigned char c = (unsigned char) i;
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ errno = 0;
+ if (cfwrite(&c, 1, ctx->dataFH) != 1)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to output file: %s",
+ get_cfp_error(ctx->dataFH));
+ }
+
+ return 1;
+}
+
+/*
+ * Read a byte of data from the archive.
+ * Called by the archiver to read bytes & integers from the archive.
+ * These routines are only used to read & write headers & TOC.
+ * EOF should be treated as a fatal error.
+ */
+static int
+_ReadByte(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ return cfgetc(ctx->dataFH);
+}
+
+/*
+ * Write a buffer of data to the archive.
+ * Called by the archiver to write a block of bytes to the TOC or a data file.
+ */
+static void
+_WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ errno = 0;
+ if (cfwrite(buf, len, ctx->dataFH) != len)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to output file: %s",
+ get_cfp_error(ctx->dataFH));
+ }
+}
+
+/*
+ * Read a block of bytes from the archive.
+ *
+ * Called by the archiver to read a block of bytes from the archive
+ */
+static void
+_ReadBuf(ArchiveHandle *AH, void *buf, size_t len)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ /*
+ * If there was an I/O error, we already exited in cfread(), so here we
+ * exit on short reads.
+ */
+ if (cfread(buf, len, ctx->dataFH) != len)
+ pg_fatal("could not read from input file: end of file");
+}
+
+/*
+ * Close the archive.
+ *
+ * When writing the archive, this is the routine that actually starts
+ * the process of saving it to files. No data should be written prior
+ * to this point, since the user could sort the TOC after creating it.
+ *
+ * If an archive is to be written, this routine must call:
+ * WriteHead to save the archive header
+ * WriteToc to save the TOC entries
+ * WriteDataChunks to save all DATA & BLOBs.
+ */
+static void
+_CloseArchive(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ if (AH->mode == archModeWrite)
+ {
+ cfp *tocFH;
+ char fname[MAXPGPATH];
+
+ setFilePath(AH, fname, "toc.dat");
+
+ /* this will actually fork the processes for a parallel backup */
+ ctx->pstate = ParallelBackupStart(AH);
+
+ /* The TOC is always created uncompressed */
+ tocFH = cfopen_write(fname, PG_BINARY_W, 0);
+ if (tocFH == NULL)
+ pg_fatal("could not open output file \"%s\": %m", fname);
+ ctx->dataFH = tocFH;
+
+ /*
+ * Write 'tar' in the format field of the toc.dat file. The directory
+ * is compatible with 'tar', so there's no point having a different
+ * format code for it.
+ */
+ AH->format = archTar;
+ WriteHead(AH);
+ AH->format = archDirectory;
+ WriteToc(AH);
+ if (cfclose(tocFH) != 0)
+ pg_fatal("could not close TOC file: %m");
+ WriteDataChunks(AH, ctx->pstate);
+
+ ParallelBackupEnd(AH, ctx->pstate);
+
+ /*
+ * In directory mode, there is no need to sync all the entries
+ * individually. Just recurse once through all the files generated.
+ */
+ if (AH->dosync)
+ fsync_dir_recurse(ctx->directory);
+ }
+ AH->FH = NULL;
+}
+
+/*
+ * Reopen the archive's file handle.
+ */
+static void
+_ReopenArchive(ArchiveHandle *AH)
+{
+ /*
+ * Our TOC is in memory, our data files are opened by each child anyway as
+ * they are separate. We support reopening the archive by just doing
+ * nothing.
+ */
+}
+
+/*
+ * BLOB support
+ */
+
+/*
+ * Called by the archiver when starting to save all BLOB DATA (not schema).
+ * It is called just prior to the dumper's DataDumper routine.
+ *
+ * We open the large object TOC file here, so that we can append a line to
+ * it for each blob.
+ */
+static void
+_StartBlobs(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char fname[MAXPGPATH];
+
+ setFilePath(AH, fname, "blobs.toc");
+
+ /* The blob TOC file is never compressed */
+ ctx->blobsTocFH = cfopen_write(fname, "ab", 0);
+ if (ctx->blobsTocFH == NULL)
+ pg_fatal("could not open output file \"%s\": %m", fname);
+}
+
+/*
+ * Called by the archiver when we're about to start dumping a blob.
+ *
+ * We create a file to write the blob to.
+ */
+static void
+_StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char fname[MAXPGPATH];
+
+ snprintf(fname, MAXPGPATH, "%s/blob_%u.dat", ctx->directory, oid);
+
+ ctx->dataFH = cfopen_write(fname, PG_BINARY_W, AH->compression);
+
+ if (ctx->dataFH == NULL)
+ pg_fatal("could not open output file \"%s\": %m", fname);
+}
+
+/*
+ * Called by the archiver when the dumper is finished writing a blob.
+ *
+ * We close the blob file and write an entry to the blob TOC file for it.
+ */
+static void
+_EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char buf[50];
+ int len;
+
+ /* Close the BLOB data file itself */
+ if (cfclose(ctx->dataFH) != 0)
+ pg_fatal("could not close blob data file: %m");
+ ctx->dataFH = NULL;
+
+ /* register the blob in blobs.toc */
+ len = snprintf(buf, sizeof(buf), "%u blob_%u.dat\n", oid, oid);
+ if (cfwrite(buf, len, ctx->blobsTocFH) != len)
+ pg_fatal("could not write to blobs TOC file");
+}
+
+/*
+ * Called by the archiver when finishing saving all BLOB DATA.
+ *
+ * We close the blobs TOC file.
+ */
+static void
+_EndBlobs(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ if (cfclose(ctx->blobsTocFH) != 0)
+ pg_fatal("could not close blobs TOC file: %m");
+ ctx->blobsTocFH = NULL;
+}
+
+/*
+ * Gets a relative file name and prepends the output directory, writing the
+ * result to buf. The caller needs to make sure that buf is MAXPGPATH bytes
+ * big. Can't use a static char[MAXPGPATH] inside the function because we run
+ * multithreaded on Windows.
+ */
+static void
+setFilePath(ArchiveHandle *AH, char *buf, const char *relativeFilename)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char *dname;
+
+ dname = ctx->directory;
+
+ if (strlen(dname) + 1 + strlen(relativeFilename) + 1 > MAXPGPATH)
+ pg_fatal("file name too long: \"%s\"", dname);
+
+ strcpy(buf, dname);
+ strcat(buf, "/");
+ strcat(buf, relativeFilename);
+}
+
+/*
+ * Prepare for parallel restore.
+ *
+ * The main thing that needs to happen here is to fill in TABLE DATA and BLOBS
+ * TOC entries' dataLength fields with appropriate values to guide the
+ * ordering of restore jobs. The source of said data is format-dependent,
+ * as is the exact meaning of the values.
+ *
+ * A format module might also choose to do other setup here.
+ */
+static void
+_PrepParallelRestore(ArchiveHandle *AH)
+{
+ TocEntry *te;
+
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+ char fname[MAXPGPATH];
+ struct stat st;
+
+ /*
+ * A dumpable object has set tctx->filename, any other object has not.
+ * (see _ArchiveEntry).
+ */
+ if (tctx->filename == NULL)
+ continue;
+
+ /* We may ignore items not due to be restored */
+ if ((te->reqs & REQ_DATA) == 0)
+ continue;
+
+ /*
+ * Stat the file and, if successful, put its size in dataLength. When
+ * using compression, the physical file size might not be a very good
+ * guide to the amount of work involved in restoring the file, but we
+ * only need an approximate indicator of that.
+ */
+ setFilePath(AH, fname, tctx->filename);
+
+ if (stat(fname, &st) == 0)
+ te->dataLength = st.st_size;
+ else
+ {
+ /* It might be compressed */
+ strlcat(fname, ".gz", sizeof(fname));
+ if (stat(fname, &st) == 0)
+ te->dataLength = st.st_size;
+ }
+
+ /*
+ * If this is the BLOBS entry, what we stat'd was blobs.toc, which
+ * most likely is a lot smaller than the actual blob data. We don't
+ * have a cheap way to estimate how much smaller, but fortunately it
+ * doesn't matter too much as long as we get the blobs processed
+ * reasonably early. Arbitrarily scale up by a factor of 1K.
+ */
+ if (strcmp(te->desc, "BLOBS") == 0)
+ te->dataLength *= 1024;
+ }
+}
+
+/*
+ * Clone format-specific fields during parallel restoration.
+ */
+static void
+_Clone(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ AH->formatData = (lclContext *) pg_malloc(sizeof(lclContext));
+ memcpy(AH->formatData, ctx, sizeof(lclContext));
+ ctx = (lclContext *) AH->formatData;
+
+ /*
+ * Note: we do not make a local lo_buf because we expect at most one BLOBS
+ * entry per archive, so no parallelism is possible. Likewise,
+ * TOC-entry-local state isn't an issue because any one TOC entry is
+ * touched by just one worker child.
+ */
+
+ /*
+ * We also don't copy the ParallelState pointer (pstate), only the leader
+ * process ever writes to it.
+ */
+}
+
+static void
+_DeClone(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ free(ctx);
+}
+
+/*
+ * This function is executed in the child of a parallel backup for a
+ * directory-format archive and dumps the actual data for one TOC entry.
+ */
+static int
+_WorkerJobDumpDirectory(ArchiveHandle *AH, TocEntry *te)
+{
+ /*
+ * This function returns void. We either fail and die horribly or
+ * succeed... A failure will be detected by the parent when the child dies
+ * unexpectedly.
+ */
+ WriteDataChunksForTocEntry(AH, te);
+
+ return 0;
+}
+
+/*
+ * This function is executed in the child of a parallel restore from a
+ * directory-format archive and restores the actual data for one TOC entry.
+ */
+static int
+_WorkerJobRestoreDirectory(ArchiveHandle *AH, TocEntry *te)
+{
+ return parallel_restore(AH, te);
+}
diff --git a/src/bin/pg_dump/pg_backup_null.c b/src/bin/pg_dump/pg_backup_null.c
new file mode 100644
index 0000000..541306d
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_null.c
@@ -0,0 +1,228 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_null.c
+ *
+ * Implementation of an archive that is never saved; it is used by
+ * pg_dump to output a plain text SQL script instead of saving
+ * a real archive.
+ *
+ * See the headers to pg_restore for more details.
+ *
+ * Copyright (c) 2000, Philip Warner
+ * Rights are granted to use this software in any way so long
+ * as this notice is not removed.
+ *
+ * The author is not responsible for loss or damages that may
+ * result from its use.
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup_null.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "fe_utils/string_utils.h"
+#include "libpq/libpq-fs.h"
+#include "pg_backup_archiver.h"
+#include "pg_backup_utils.h"
+
+static void _WriteData(ArchiveHandle *AH, const void *data, size_t dLen);
+static void _WriteBlobData(ArchiveHandle *AH, const void *data, size_t dLen);
+static void _EndData(ArchiveHandle *AH, TocEntry *te);
+static int _WriteByte(ArchiveHandle *AH, const int i);
+static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
+static void _CloseArchive(ArchiveHandle *AH);
+static void _PrintTocData(ArchiveHandle *AH, TocEntry *te);
+static void _StartBlobs(ArchiveHandle *AH, TocEntry *te);
+static void _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
+static void _EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
+static void _EndBlobs(ArchiveHandle *AH, TocEntry *te);
+
+
+/*
+ * Initializer
+ */
+void
+InitArchiveFmt_Null(ArchiveHandle *AH)
+{
+ /* Assuming static functions, this can be copied for each format. */
+ AH->WriteDataPtr = _WriteData;
+ AH->EndDataPtr = _EndData;
+ AH->WriteBytePtr = _WriteByte;
+ AH->WriteBufPtr = _WriteBuf;
+ AH->ClosePtr = _CloseArchive;
+ AH->ReopenPtr = NULL;
+ AH->PrintTocDataPtr = _PrintTocData;
+
+ AH->StartBlobsPtr = _StartBlobs;
+ AH->StartBlobPtr = _StartBlob;
+ AH->EndBlobPtr = _EndBlob;
+ AH->EndBlobsPtr = _EndBlobs;
+ AH->ClonePtr = NULL;
+ AH->DeClonePtr = NULL;
+
+ /* Initialize LO buffering */
+ AH->lo_buf_size = LOBBUFSIZE;
+ AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE);
+
+ /*
+ * Now prevent reading...
+ */
+ if (AH->mode == archModeRead)
+ pg_fatal("this format cannot be read");
+}
+
+/*
+ * - Start a new TOC entry
+ */
+
+/*
+ * Called by dumper via archiver from within a data dump routine
+ */
+static void
+_WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
+{
+ /* Just send it to output, ahwrite() already errors on failure */
+ ahwrite(data, 1, dLen, AH);
+}
+
+/*
+ * Called by dumper via archiver from within a data dump routine
+ * We substitute this for _WriteData while emitting a BLOB
+ */
+static void
+_WriteBlobData(ArchiveHandle *AH, const void *data, size_t dLen)
+{
+ if (dLen > 0)
+ {
+ PQExpBuffer buf = createPQExpBuffer();
+
+ appendByteaLiteralAHX(buf,
+ (const unsigned char *) data,
+ dLen,
+ AH);
+
+ ahprintf(AH, "SELECT pg_catalog.lowrite(0, %s);\n", buf->data);
+
+ destroyPQExpBuffer(buf);
+ }
+}
+
+static void
+_EndData(ArchiveHandle *AH, TocEntry *te)
+{
+ ahprintf(AH, "\n\n");
+}
+
+/*
+ * Called by the archiver when starting to save all BLOB DATA (not schema).
+ * This routine should save whatever format-specific information is needed
+ * to read the BLOBs back into memory.
+ *
+ * It is called just prior to the dumper's DataDumper routine.
+ *
+ * Optional, but strongly recommended.
+ */
+static void
+_StartBlobs(ArchiveHandle *AH, TocEntry *te)
+{
+ ahprintf(AH, "BEGIN;\n\n");
+}
+
+/*
+ * Called by the archiver when the dumper calls StartBlob.
+ *
+ * Mandatory.
+ *
+ * Must save the passed OID for retrieval at restore-time.
+ */
+static void
+_StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid)
+{
+ bool old_blob_style = (AH->version < K_VERS_1_12);
+
+ if (oid == 0)
+ pg_fatal("invalid OID for large object");
+
+ /* With an old archive we must do drop and create logic here */
+ if (old_blob_style && AH->public.ropt->dropSchema)
+ DropBlobIfExists(AH, oid);
+
+ if (old_blob_style)
+ ahprintf(AH, "SELECT pg_catalog.lo_open(pg_catalog.lo_create('%u'), %d);\n",
+ oid, INV_WRITE);
+ else
+ ahprintf(AH, "SELECT pg_catalog.lo_open('%u', %d);\n",
+ oid, INV_WRITE);
+
+ AH->WriteDataPtr = _WriteBlobData;
+}
+
+/*
+ * Called by the archiver when the dumper calls EndBlob.
+ *
+ * Optional.
+ */
+static void
+_EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid)
+{
+ AH->WriteDataPtr = _WriteData;
+
+ ahprintf(AH, "SELECT pg_catalog.lo_close(0);\n\n");
+}
+
+/*
+ * Called by the archiver when finishing saving all BLOB DATA.
+ *
+ * Optional.
+ */
+static void
+_EndBlobs(ArchiveHandle *AH, TocEntry *te)
+{
+ ahprintf(AH, "COMMIT;\n\n");
+}
+
+/*------
+ * Called as part of a RestoreArchive call; for the NULL archive, this
+ * just sends the data for a given TOC entry to the output.
+ *------
+ */
+static void
+_PrintTocData(ArchiveHandle *AH, TocEntry *te)
+{
+ if (te->dataDumper)
+ {
+ AH->currToc = te;
+
+ if (strcmp(te->desc, "BLOBS") == 0)
+ _StartBlobs(AH, te);
+
+ te->dataDumper((Archive *) AH, te->dataDumperArg);
+
+ if (strcmp(te->desc, "BLOBS") == 0)
+ _EndBlobs(AH, te);
+
+ AH->currToc = NULL;
+ }
+}
+
+static int
+_WriteByte(ArchiveHandle *AH, const int i)
+{
+ /* Don't do anything */
+ return 0;
+}
+
+static void
+_WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)
+{
+ /* Don't do anything */
+}
+
+static void
+_CloseArchive(ArchiveHandle *AH)
+{
+ /* Nothing to do */
+}
diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c
new file mode 100644
index 0000000..39d71ba
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_tar.c
@@ -0,0 +1,1209 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_tar.c
+ *
+ * This file is copied from the 'files' format file, but dumps data into
+ * one temp file then sends it to the output TAR archive.
+ *
+ * The tar format also includes a 'restore.sql' script which is there for
+ * the benefit of humans. This script is never used by pg_restore.
+ *
+ * NOTE: If you untar the created 'tar' file, the resulting files are
+ * compatible with the 'directory' format. Please keep the two formats in
+ * sync.
+ *
+ * See the headers to pg_backup_directory & pg_restore for more details.
+ *
+ * Copyright (c) 2000, Philip Warner
+ * Rights are granted to use this software in any way so long
+ * as this notice is not removed.
+ *
+ * The author is not responsible for loss or damages that may
+ * result from its use.
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup_tar.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+#include <ctype.h>
+#include <limits.h>
+#include <unistd.h>
+
+#include "common/file_utils.h"
+#include "fe_utils/string_utils.h"
+#include "pg_backup_archiver.h"
+#include "pg_backup_tar.h"
+#include "pg_backup_utils.h"
+#include "pgtar.h"
+
+static void _ArchiveEntry(ArchiveHandle *AH, TocEntry *te);
+static void _StartData(ArchiveHandle *AH, TocEntry *te);
+static void _WriteData(ArchiveHandle *AH, const void *data, size_t dLen);
+static void _EndData(ArchiveHandle *AH, TocEntry *te);
+static int _WriteByte(ArchiveHandle *AH, const int i);
+static int _ReadByte(ArchiveHandle *);
+static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
+static void _ReadBuf(ArchiveHandle *AH, void *buf, size_t len);
+static void _CloseArchive(ArchiveHandle *AH);
+static void _PrintTocData(ArchiveHandle *AH, TocEntry *te);
+static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te);
+static void _ReadExtraToc(ArchiveHandle *AH, TocEntry *te);
+static void _PrintExtraToc(ArchiveHandle *AH, TocEntry *te);
+
+static void _StartBlobs(ArchiveHandle *AH, TocEntry *te);
+static void _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
+static void _EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid);
+static void _EndBlobs(ArchiveHandle *AH, TocEntry *te);
+
+#define K_STD_BUF_SIZE 1024
+
+
+typedef struct
+{
+ FILE *nFH;
+ FILE *tarFH;
+ FILE *tmpFH;
+ char *targetFile;
+ char mode;
+ pgoff_t pos;
+ pgoff_t fileLen;
+ ArchiveHandle *AH;
+} TAR_MEMBER;
+
+typedef struct
+{
+ int hasSeek;
+ pgoff_t filePos;
+ TAR_MEMBER *blobToc;
+ FILE *tarFH;
+ pgoff_t tarFHpos;
+ pgoff_t tarNextMember;
+ TAR_MEMBER *FH;
+ int isSpecialScript;
+ TAR_MEMBER *scriptTH;
+} lclContext;
+
+typedef struct
+{
+ TAR_MEMBER *TH;
+ char *filename;
+} lclTocEntry;
+
+static void _LoadBlobs(ArchiveHandle *AH);
+
+static TAR_MEMBER *tarOpen(ArchiveHandle *AH, const char *filename, char mode);
+static void tarClose(ArchiveHandle *AH, TAR_MEMBER *TH);
+
+#ifdef __NOT_USED__
+static char *tarGets(char *buf, size_t len, TAR_MEMBER *th);
+#endif
+static int tarPrintf(TAR_MEMBER *th, const char *fmt,...) pg_attribute_printf(2, 3);
+
+static void _tarAddFile(ArchiveHandle *AH, TAR_MEMBER *th);
+static TAR_MEMBER *_tarPositionTo(ArchiveHandle *AH, const char *filename);
+static size_t tarRead(void *buf, size_t len, TAR_MEMBER *th);
+static size_t tarWrite(const void *buf, size_t len, TAR_MEMBER *th);
+static void _tarWriteHeader(TAR_MEMBER *th);
+static int _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th);
+static size_t _tarReadRaw(ArchiveHandle *AH, void *buf, size_t len, TAR_MEMBER *th, FILE *fh);
+
+static size_t _scriptOut(ArchiveHandle *AH, const void *buf, size_t len);
+
+/*
+ * Initializer
+ */
+void
+InitArchiveFmt_Tar(ArchiveHandle *AH)
+{
+ lclContext *ctx;
+
+ /* Assuming static functions, this can be copied for each format. */
+ AH->ArchiveEntryPtr = _ArchiveEntry;
+ AH->StartDataPtr = _StartData;
+ AH->WriteDataPtr = _WriteData;
+ AH->EndDataPtr = _EndData;
+ AH->WriteBytePtr = _WriteByte;
+ AH->ReadBytePtr = _ReadByte;
+ AH->WriteBufPtr = _WriteBuf;
+ AH->ReadBufPtr = _ReadBuf;
+ AH->ClosePtr = _CloseArchive;
+ AH->ReopenPtr = NULL;
+ AH->PrintTocDataPtr = _PrintTocData;
+ AH->ReadExtraTocPtr = _ReadExtraToc;
+ AH->WriteExtraTocPtr = _WriteExtraToc;
+ AH->PrintExtraTocPtr = _PrintExtraToc;
+
+ AH->StartBlobsPtr = _StartBlobs;
+ AH->StartBlobPtr = _StartBlob;
+ AH->EndBlobPtr = _EndBlob;
+ AH->EndBlobsPtr = _EndBlobs;
+ AH->ClonePtr = NULL;
+ AH->DeClonePtr = NULL;
+
+ AH->WorkerJobDumpPtr = NULL;
+ AH->WorkerJobRestorePtr = NULL;
+
+ /*
+ * Set up some special context used in compressing data.
+ */
+ ctx = (lclContext *) pg_malloc0(sizeof(lclContext));
+ AH->formatData = (void *) ctx;
+ ctx->filePos = 0;
+ ctx->isSpecialScript = 0;
+
+ /* Initialize LO buffering */
+ AH->lo_buf_size = LOBBUFSIZE;
+ AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE);
+
+ /*
+ * Now open the tar file, and load the TOC if we're in read mode.
+ */
+ if (AH->mode == archModeWrite)
+ {
+ if (AH->fSpec && strcmp(AH->fSpec, "") != 0)
+ {
+ ctx->tarFH = fopen(AH->fSpec, PG_BINARY_W);
+ if (ctx->tarFH == NULL)
+ pg_fatal("could not open TOC file \"%s\" for output: %m",
+ AH->fSpec);
+ }
+ else
+ {
+ ctx->tarFH = stdout;
+ if (ctx->tarFH == NULL)
+ pg_fatal("could not open TOC file for output: %m");
+ }
+
+ ctx->tarFHpos = 0;
+
+ /*
+ * Make unbuffered since we will dup() it, and the buffers screw each
+ * other
+ */
+ /* setvbuf(ctx->tarFH, NULL, _IONBF, 0); */
+
+ ctx->hasSeek = checkSeek(ctx->tarFH);
+
+ /*
+ * We don't support compression because reading the files back is not
+ * possible since gzdopen uses buffered IO which totally screws file
+ * positioning.
+ */
+ if (AH->compression != 0)
+ pg_fatal("compression is not supported by tar archive format");
+ }
+ else
+ { /* Read Mode */
+ if (AH->fSpec && strcmp(AH->fSpec, "") != 0)
+ {
+ ctx->tarFH = fopen(AH->fSpec, PG_BINARY_R);
+ if (ctx->tarFH == NULL)
+ pg_fatal("could not open TOC file \"%s\" for input: %m",
+ AH->fSpec);
+ }
+ else
+ {
+ ctx->tarFH = stdin;
+ if (ctx->tarFH == NULL)
+ pg_fatal("could not open TOC file for input: %m");
+ }
+
+ /*
+ * Make unbuffered since we will dup() it, and the buffers screw each
+ * other
+ */
+ /* setvbuf(ctx->tarFH, NULL, _IONBF, 0); */
+
+ ctx->tarFHpos = 0;
+
+ ctx->hasSeek = checkSeek(ctx->tarFH);
+
+ ctx->FH = (void *) tarOpen(AH, "toc.dat", 'r');
+ ReadHead(AH);
+ ReadToc(AH);
+ tarClose(AH, ctx->FH); /* Nothing else in the file... */
+ }
+}
+
+/*
+ * - Start a new TOC entry
+ * Setup the output file name.
+ */
+static void
+_ArchiveEntry(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *ctx;
+ char fn[K_STD_BUF_SIZE];
+
+ ctx = (lclTocEntry *) pg_malloc0(sizeof(lclTocEntry));
+ if (te->dataDumper != NULL)
+ {
+ snprintf(fn, sizeof(fn), "%d.dat", te->dumpId);
+ ctx->filename = pg_strdup(fn);
+ }
+ else
+ {
+ ctx->filename = NULL;
+ ctx->TH = NULL;
+ }
+ te->formatData = (void *) ctx;
+}
+
+static void
+_WriteExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *ctx = (lclTocEntry *) te->formatData;
+
+ if (ctx->filename)
+ WriteStr(AH, ctx->filename);
+ else
+ WriteStr(AH, "");
+}
+
+static void
+_ReadExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *ctx = (lclTocEntry *) te->formatData;
+
+ if (ctx == NULL)
+ {
+ ctx = (lclTocEntry *) pg_malloc0(sizeof(lclTocEntry));
+ te->formatData = (void *) ctx;
+ }
+
+ ctx->filename = ReadStr(AH);
+ if (strlen(ctx->filename) == 0)
+ {
+ free(ctx->filename);
+ ctx->filename = NULL;
+ }
+ ctx->TH = NULL;
+}
+
+static void
+_PrintExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *ctx = (lclTocEntry *) te->formatData;
+
+ if (AH->public.verbose && ctx->filename != NULL)
+ ahprintf(AH, "-- File: %s\n", ctx->filename);
+}
+
+static void
+_StartData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ tctx->TH = tarOpen(AH, tctx->filename, 'w');
+}
+
+static TAR_MEMBER *
+tarOpen(ArchiveHandle *AH, const char *filename, char mode)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ TAR_MEMBER *tm;
+
+ if (mode == 'r')
+ {
+ tm = _tarPositionTo(AH, filename);
+ if (!tm) /* Not found */
+ {
+ if (filename)
+ {
+ /*
+ * Couldn't find the requested file. Future: do SEEK(0) and
+ * retry.
+ */
+ pg_fatal("could not find file \"%s\" in archive", filename);
+ }
+ else
+ {
+ /* Any file OK, none left, so return NULL */
+ return NULL;
+ }
+ }
+
+ if (AH->compression == 0)
+ tm->nFH = ctx->tarFH;
+ else
+ pg_fatal("compression is not supported by tar archive format");
+ }
+ else
+ {
+ int old_umask;
+
+ tm = pg_malloc0(sizeof(TAR_MEMBER));
+
+ /*
+ * POSIX does not require, but permits, tmpfile() to restrict file
+ * permissions. Given an OS crash after we write data, the filesystem
+ * might retain the data but forget tmpfile()'s unlink(). If so, the
+ * file mode protects confidentiality of the data written.
+ */
+ old_umask = umask(S_IRWXG | S_IRWXO);
+
+#ifndef WIN32
+ tm->tmpFH = tmpfile();
+#else
+
+ /*
+ * On WIN32, tmpfile() generates a filename in the root directory,
+ * which requires administrative permissions on certain systems. Loop
+ * until we find a unique file name we can create.
+ */
+ while (1)
+ {
+ char *name;
+ int fd;
+
+ name = _tempnam(NULL, "pg_temp_");
+ if (name == NULL)
+ break;
+ fd = open(name, O_RDWR | O_CREAT | O_EXCL | O_BINARY |
+ O_TEMPORARY, S_IRUSR | S_IWUSR);
+ free(name);
+
+ if (fd != -1) /* created a file */
+ {
+ tm->tmpFH = fdopen(fd, "w+b");
+ break;
+ }
+ else if (errno != EEXIST) /* failure other than file exists */
+ break;
+ }
+#endif
+
+ if (tm->tmpFH == NULL)
+ pg_fatal("could not generate temporary file name: %m");
+
+ umask(old_umask);
+
+ if (AH->compression == 0)
+ tm->nFH = tm->tmpFH;
+ else
+ pg_fatal("compression is not supported by tar archive format");
+
+ tm->AH = AH;
+ tm->targetFile = pg_strdup(filename);
+ }
+
+ tm->mode = mode;
+ tm->tarFH = ctx->tarFH;
+
+ return tm;
+}
+
+static void
+tarClose(ArchiveHandle *AH, TAR_MEMBER *th)
+{
+ if (AH->compression != 0)
+ pg_fatal("compression is not supported by tar archive format");
+
+ if (th->mode == 'w')
+ _tarAddFile(AH, th); /* This will close the temp file */
+
+ /*
+ * else Nothing to do for normal read since we don't dup() normal file
+ * handle, and we don't use temp files.
+ */
+
+ if (th->targetFile)
+ free(th->targetFile);
+
+ th->nFH = NULL;
+}
+
+#ifdef __NOT_USED__
+static char *
+tarGets(char *buf, size_t len, TAR_MEMBER *th)
+{
+ char *s;
+ size_t cnt = 0;
+ char c = ' ';
+ int eof = 0;
+
+ /* Can't read past logical EOF */
+ if (len > (th->fileLen - th->pos))
+ len = th->fileLen - th->pos;
+
+ while (cnt < len && c != '\n')
+ {
+ if (_tarReadRaw(th->AH, &c, 1, th, NULL) <= 0)
+ {
+ eof = 1;
+ break;
+ }
+ buf[cnt++] = c;
+ }
+
+ if (eof && cnt == 0)
+ s = NULL;
+ else
+ {
+ buf[cnt++] = '\0';
+ s = buf;
+ }
+
+ if (s)
+ {
+ len = strlen(s);
+ th->pos += len;
+ }
+
+ return s;
+}
+#endif
+
+/*
+ * Just read bytes from the archive. This is the low level read routine
+ * that is used for ALL reads on a tar file.
+ */
+static size_t
+_tarReadRaw(ArchiveHandle *AH, void *buf, size_t len, TAR_MEMBER *th, FILE *fh)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ size_t avail;
+ size_t used = 0;
+ size_t res = 0;
+
+ Assert(th || fh);
+
+ avail = AH->lookaheadLen - AH->lookaheadPos;
+ if (avail > 0)
+ {
+ /* We have some lookahead bytes to use */
+ if (avail >= len) /* Just use the lookahead buffer */
+ used = len;
+ else
+ used = avail;
+
+ /* Copy, and adjust buffer pos */
+ memcpy(buf, AH->lookahead + AH->lookaheadPos, used);
+ AH->lookaheadPos += used;
+
+ /* Adjust required length */
+ len -= used;
+ }
+
+ /* Read the file if len > 0 */
+ if (len > 0)
+ {
+ if (fh)
+ {
+ res = fread(&((char *) buf)[used], 1, len, fh);
+ if (res != len && !feof(fh))
+ READ_ERROR_EXIT(fh);
+ }
+ else if (th)
+ {
+ res = fread(&((char *) buf)[used], 1, len, th->nFH);
+ if (res != len && !feof(th->nFH))
+ READ_ERROR_EXIT(th->nFH);
+ }
+ }
+
+ ctx->tarFHpos += res + used;
+
+ return (res + used);
+}
+
+static size_t
+tarRead(void *buf, size_t len, TAR_MEMBER *th)
+{
+ size_t res;
+
+ if (th->pos + len > th->fileLen)
+ len = th->fileLen - th->pos;
+
+ if (len <= 0)
+ return 0;
+
+ res = _tarReadRaw(th->AH, buf, len, th, NULL);
+
+ th->pos += res;
+
+ return res;
+}
+
+static size_t
+tarWrite(const void *buf, size_t len, TAR_MEMBER *th)
+{
+ size_t res;
+
+ res = fwrite(buf, 1, len, th->nFH);
+
+ th->pos += res;
+ return res;
+}
+
+static void
+_WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
+{
+ lclTocEntry *tctx = (lclTocEntry *) AH->currToc->formatData;
+
+ if (tarWrite(data, dLen, tctx->TH) != dLen)
+ WRITE_ERROR_EXIT;
+}
+
+static void
+_EndData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ /* Close the file */
+ tarClose(AH, tctx->TH);
+ tctx->TH = NULL;
+}
+
+/*
+ * Print data for a given file
+ */
+static void
+_PrintFileData(ArchiveHandle *AH, char *filename)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char buf[4096];
+ size_t cnt;
+ TAR_MEMBER *th;
+
+ if (!filename)
+ return;
+
+ th = tarOpen(AH, filename, 'r');
+ ctx->FH = th;
+
+ while ((cnt = tarRead(buf, 4095, th)) > 0)
+ {
+ buf[cnt] = '\0';
+ ahwrite(buf, 1, cnt, AH);
+ }
+
+ tarClose(AH, th);
+}
+
+
+/*
+ * Print data for a given TOC entry
+*/
+static void
+_PrintTocData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+ int pos1;
+
+ if (!tctx->filename)
+ return;
+
+ /*
+ * If we're writing the special restore.sql script, emit a suitable
+ * command to include each table's data from the corresponding file.
+ *
+ * In the COPY case this is a bit klugy because the regular COPY command
+ * was already printed before we get control.
+ */
+ if (ctx->isSpecialScript)
+ {
+ if (te->copyStmt)
+ {
+ /* Abort the COPY FROM stdin */
+ ahprintf(AH, "\\.\n");
+
+ /*
+ * The COPY statement should look like "COPY ... FROM stdin;\n",
+ * see dumpTableData().
+ */
+ pos1 = (int) strlen(te->copyStmt) - 13;
+ if (pos1 < 6 || strncmp(te->copyStmt, "COPY ", 5) != 0 ||
+ strcmp(te->copyStmt + pos1, " FROM stdin;\n") != 0)
+ pg_fatal("unexpected COPY statement syntax: \"%s\"",
+ te->copyStmt);
+
+ /* Emit all but the FROM part ... */
+ ahwrite(te->copyStmt, 1, pos1, AH);
+ /* ... and insert modified FROM */
+ ahprintf(AH, " FROM '$$PATH$$/%s';\n\n", tctx->filename);
+ }
+ else
+ {
+ /* --inserts mode, no worries, just include the data file */
+ ahprintf(AH, "\\i $$PATH$$/%s\n\n", tctx->filename);
+ }
+
+ return;
+ }
+
+ if (strcmp(te->desc, "BLOBS") == 0)
+ _LoadBlobs(AH);
+ else
+ _PrintFileData(AH, tctx->filename);
+}
+
+static void
+_LoadBlobs(ArchiveHandle *AH)
+{
+ Oid oid;
+ lclContext *ctx = (lclContext *) AH->formatData;
+ TAR_MEMBER *th;
+ size_t cnt;
+ bool foundBlob = false;
+ char buf[4096];
+
+ StartRestoreBlobs(AH);
+
+ th = tarOpen(AH, NULL, 'r'); /* Open next file */
+ while (th != NULL)
+ {
+ ctx->FH = th;
+
+ if (strncmp(th->targetFile, "blob_", 5) == 0)
+ {
+ oid = atooid(&th->targetFile[5]);
+ if (oid != 0)
+ {
+ pg_log_info("restoring large object with OID %u", oid);
+
+ StartRestoreBlob(AH, oid, AH->public.ropt->dropSchema);
+
+ while ((cnt = tarRead(buf, 4095, th)) > 0)
+ {
+ buf[cnt] = '\0';
+ ahwrite(buf, 1, cnt, AH);
+ }
+ EndRestoreBlob(AH, oid);
+ foundBlob = true;
+ }
+ tarClose(AH, th);
+ }
+ else
+ {
+ tarClose(AH, th);
+
+ /*
+ * Once we have found the first blob, stop at the first non-blob
+ * entry (which will be 'blobs.toc'). This coding would eat all
+ * the rest of the archive if there are no blobs ... but this
+ * function shouldn't be called at all in that case.
+ */
+ if (foundBlob)
+ break;
+ }
+
+ th = tarOpen(AH, NULL, 'r');
+ }
+ EndRestoreBlobs(AH);
+}
+
+
+static int
+_WriteByte(ArchiveHandle *AH, const int i)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char b = i; /* Avoid endian problems */
+
+ if (tarWrite(&b, 1, ctx->FH) != 1)
+ WRITE_ERROR_EXIT;
+
+ ctx->filePos += 1;
+ return 1;
+}
+
+static int
+_ReadByte(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ size_t res;
+ unsigned char c;
+
+ res = tarRead(&c, 1, ctx->FH);
+ if (res != 1)
+ /* We already would have exited for errors on reads, must be EOF */
+ pg_fatal("could not read from input file: end of file");
+ ctx->filePos += 1;
+ return c;
+}
+
+static void
+_WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ if (tarWrite(buf, len, ctx->FH) != len)
+ WRITE_ERROR_EXIT;
+
+ ctx->filePos += len;
+}
+
+static void
+_ReadBuf(ArchiveHandle *AH, void *buf, size_t len)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ if (tarRead(buf, len, ctx->FH) != len)
+ /* We already would have exited for errors on reads, must be EOF */
+ pg_fatal("could not read from input file: end of file");
+
+ ctx->filePos += len;
+}
+
+static void
+_CloseArchive(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ TAR_MEMBER *th;
+ RestoreOptions *ropt;
+ RestoreOptions *savRopt;
+ DumpOptions *savDopt;
+ int savVerbose,
+ i;
+
+ if (AH->mode == archModeWrite)
+ {
+ /*
+ * Write the Header & TOC to the archive FIRST
+ */
+ th = tarOpen(AH, "toc.dat", 'w');
+ ctx->FH = th;
+ WriteHead(AH);
+ WriteToc(AH);
+ tarClose(AH, th); /* Not needed any more */
+
+ /*
+ * Now send the data (tables & blobs)
+ */
+ WriteDataChunks(AH, NULL);
+
+ /*
+ * Now this format wants to append a script which does a full restore
+ * if the files have been extracted.
+ */
+ th = tarOpen(AH, "restore.sql", 'w');
+
+ tarPrintf(th, "--\n"
+ "-- NOTE:\n"
+ "--\n"
+ "-- File paths need to be edited. Search for $$PATH$$ and\n"
+ "-- replace it with the path to the directory containing\n"
+ "-- the extracted data files.\n"
+ "--\n");
+
+ AH->CustomOutPtr = _scriptOut;
+
+ ctx->isSpecialScript = 1;
+ ctx->scriptTH = th;
+
+ ropt = NewRestoreOptions();
+ memcpy(ropt, AH->public.ropt, sizeof(RestoreOptions));
+ ropt->filename = NULL;
+ ropt->dropSchema = 1;
+ ropt->compression = 0;
+ ropt->superuser = NULL;
+ ropt->suppressDumpWarnings = true;
+
+ savDopt = AH->public.dopt;
+ savRopt = AH->public.ropt;
+
+ SetArchiveOptions((Archive *) AH, NULL, ropt);
+
+ savVerbose = AH->public.verbose;
+ AH->public.verbose = 0;
+
+ RestoreArchive((Archive *) AH);
+
+ SetArchiveOptions((Archive *) AH, savDopt, savRopt);
+
+ AH->public.verbose = savVerbose;
+
+ tarClose(AH, th);
+
+ ctx->isSpecialScript = 0;
+
+ /*
+ * EOF marker for tar files is two blocks of NULLs.
+ */
+ for (i = 0; i < TAR_BLOCK_SIZE * 2; i++)
+ {
+ if (fputc(0, ctx->tarFH) == EOF)
+ WRITE_ERROR_EXIT;
+ }
+
+ /* Sync the output file if one is defined */
+ if (AH->dosync && AH->fSpec)
+ (void) fsync_fname(AH->fSpec, false);
+ }
+
+ AH->FH = NULL;
+}
+
+static size_t
+_scriptOut(ArchiveHandle *AH, const void *buf, size_t len)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ return tarWrite(buf, len, ctx->scriptTH);
+}
+
+/*
+ * BLOB support
+ */
+
+/*
+ * Called by the archiver when starting to save all BLOB DATA (not schema).
+ * This routine should save whatever format-specific information is needed
+ * to read the BLOBs back into memory.
+ *
+ * It is called just prior to the dumper's DataDumper routine.
+ *
+ * Optional, but strongly recommended.
+ *
+ */
+static void
+_StartBlobs(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char fname[K_STD_BUF_SIZE];
+
+ sprintf(fname, "blobs.toc");
+ ctx->blobToc = tarOpen(AH, fname, 'w');
+}
+
+/*
+ * Called by the archiver when the dumper calls StartBlob.
+ *
+ * Mandatory.
+ *
+ * Must save the passed OID for retrieval at restore-time.
+ */
+static void
+_StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+ char fname[255];
+
+ if (oid == 0)
+ pg_fatal("invalid OID for large object (%u)", oid);
+
+ if (AH->compression != 0)
+ pg_fatal("compression is not supported by tar archive format");
+
+ sprintf(fname, "blob_%u.dat", oid);
+
+ tarPrintf(ctx->blobToc, "%u %s\n", oid, fname);
+
+ tctx->TH = tarOpen(AH, fname, 'w');
+}
+
+/*
+ * Called by the archiver when the dumper calls EndBlob.
+ *
+ * Optional.
+ *
+ */
+static void
+_EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid)
+{
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ tarClose(AH, tctx->TH);
+}
+
+/*
+ * Called by the archiver when finishing saving all BLOB DATA.
+ *
+ * Optional.
+ *
+ */
+static void
+_EndBlobs(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ /* Write out a fake zero OID to mark end-of-blobs. */
+ /* WriteInt(AH, 0); */
+
+ tarClose(AH, ctx->blobToc);
+}
+
+
+
+/*------------
+ * TAR Support
+ *------------
+ */
+
+static int
+tarPrintf(TAR_MEMBER *th, const char *fmt,...)
+{
+ int save_errno = errno;
+ char *p;
+ size_t len = 128; /* initial assumption about buffer size */
+ size_t cnt;
+
+ for (;;)
+ {
+ va_list args;
+
+ /* Allocate work buffer. */
+ p = (char *) pg_malloc(len);
+
+ /* Try to format the data. */
+ errno = save_errno;
+ va_start(args, fmt);
+ cnt = pvsnprintf(p, len, fmt, args);
+ va_end(args);
+
+ if (cnt < len)
+ break; /* success */
+
+ /* Release buffer and loop around to try again with larger len. */
+ free(p);
+ len = cnt;
+ }
+
+ cnt = tarWrite(p, cnt, th);
+ free(p);
+ return (int) cnt;
+}
+
+bool
+isValidTarHeader(char *header)
+{
+ int sum;
+ int chk = tarChecksum(header);
+
+ sum = read_tar_number(&header[148], 8);
+
+ if (sum != chk)
+ return false;
+
+ /* POSIX tar format */
+ if (memcmp(&header[257], "ustar\0", 6) == 0 &&
+ memcmp(&header[263], "00", 2) == 0)
+ return true;
+ /* GNU tar format */
+ if (memcmp(&header[257], "ustar \0", 8) == 0)
+ return true;
+ /* not-quite-POSIX format written by pre-9.3 pg_dump */
+ if (memcmp(&header[257], "ustar00\0", 8) == 0)
+ return true;
+
+ return false;
+}
+
+/* Given the member, write the TAR header & copy the file */
+static void
+_tarAddFile(ArchiveHandle *AH, TAR_MEMBER *th)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ FILE *tmp = th->tmpFH; /* Grab it for convenience */
+ char buf[32768];
+ size_t cnt;
+ pgoff_t len = 0;
+ size_t res;
+ size_t i,
+ pad;
+
+ /*
+ * Find file len & go back to start.
+ */
+ if (fseeko(tmp, 0, SEEK_END) != 0)
+ pg_fatal("error during file seek: %m");
+ th->fileLen = ftello(tmp);
+ if (th->fileLen < 0)
+ pg_fatal("could not determine seek position in archive file: %m");
+ if (fseeko(tmp, 0, SEEK_SET) != 0)
+ pg_fatal("error during file seek: %m");
+
+ _tarWriteHeader(th);
+
+ while ((cnt = fread(buf, 1, sizeof(buf), tmp)) > 0)
+ {
+ if ((res = fwrite(buf, 1, cnt, th->tarFH)) != cnt)
+ WRITE_ERROR_EXIT;
+ len += res;
+ }
+ if (!feof(tmp))
+ READ_ERROR_EXIT(tmp);
+
+ if (fclose(tmp) != 0) /* This *should* delete it... */
+ pg_fatal("could not close temporary file: %m");
+
+ if (len != th->fileLen)
+ pg_fatal("actual file length (%lld) does not match expected (%lld)",
+ (long long) len, (long long) th->fileLen);
+
+ pad = tarPaddingBytesRequired(len);
+ for (i = 0; i < pad; i++)
+ {
+ if (fputc('\0', th->tarFH) == EOF)
+ WRITE_ERROR_EXIT;
+ }
+
+ ctx->tarFHpos += len + pad;
+}
+
+/* Locate the file in the archive, read header and position to data */
+static TAR_MEMBER *
+_tarPositionTo(ArchiveHandle *AH, const char *filename)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ TAR_MEMBER *th = pg_malloc0(sizeof(TAR_MEMBER));
+ char c;
+ char header[TAR_BLOCK_SIZE];
+ size_t i,
+ len,
+ blks;
+ int id;
+
+ th->AH = AH;
+
+ /* Go to end of current file, if any */
+ if (ctx->tarFHpos != 0)
+ {
+ pg_log_debug("moving from position %lld to next member at file position %lld",
+ (long long) ctx->tarFHpos, (long long) ctx->tarNextMember);
+
+ while (ctx->tarFHpos < ctx->tarNextMember)
+ _tarReadRaw(AH, &c, 1, NULL, ctx->tarFH);
+ }
+
+ pg_log_debug("now at file position %lld", (long long) ctx->tarFHpos);
+
+ /* We are at the start of the file, or at the next member */
+
+ /* Get the header */
+ if (!_tarGetHeader(AH, th))
+ {
+ if (filename)
+ pg_fatal("could not find header for file \"%s\" in tar archive", filename);
+ else
+ {
+ /*
+ * We're just scanning the archive for the next file, so return
+ * null
+ */
+ free(th);
+ return NULL;
+ }
+ }
+
+ while (filename != NULL && strcmp(th->targetFile, filename) != 0)
+ {
+ pg_log_debug("skipping tar member %s", th->targetFile);
+
+ id = atoi(th->targetFile);
+ if ((TocIDRequired(AH, id) & REQ_DATA) != 0)
+ pg_fatal("restoring data out of order is not supported in this archive format: "
+ "\"%s\" is required, but comes before \"%s\" in the archive file.",
+ th->targetFile, filename);
+
+ /* Header doesn't match, so read to next header */
+ len = th->fileLen;
+ len += tarPaddingBytesRequired(th->fileLen);
+ blks = len / TAR_BLOCK_SIZE; /* # of tar blocks */
+
+ for (i = 0; i < blks; i++)
+ _tarReadRaw(AH, &header[0], TAR_BLOCK_SIZE, NULL, ctx->tarFH);
+
+ if (!_tarGetHeader(AH, th))
+ pg_fatal("could not find header for file \"%s\" in tar archive", filename);
+ }
+
+ ctx->tarNextMember = ctx->tarFHpos + th->fileLen
+ + tarPaddingBytesRequired(th->fileLen);
+ th->pos = 0;
+
+ return th;
+}
+
+/* Read & verify a header */
+static int
+_tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char h[TAR_BLOCK_SIZE];
+ char tag[100 + 1];
+ int sum,
+ chk;
+ pgoff_t len;
+ pgoff_t hPos;
+ bool gotBlock = false;
+
+ while (!gotBlock)
+ {
+ /* Save the pos for reporting purposes */
+ hPos = ctx->tarFHpos;
+
+ /* Read the next tar block, return EOF, exit if short */
+ len = _tarReadRaw(AH, h, TAR_BLOCK_SIZE, NULL, ctx->tarFH);
+ if (len == 0) /* EOF */
+ return 0;
+
+ if (len != TAR_BLOCK_SIZE)
+ pg_fatal(ngettext("incomplete tar header found (%lu byte)",
+ "incomplete tar header found (%lu bytes)",
+ len),
+ (unsigned long) len);
+
+ /* Calc checksum */
+ chk = tarChecksum(h);
+ sum = read_tar_number(&h[148], 8);
+
+ /*
+ * If the checksum failed, see if it is a null block. If so, silently
+ * continue to the next block.
+ */
+ if (chk == sum)
+ gotBlock = true;
+ else
+ {
+ int i;
+
+ for (i = 0; i < TAR_BLOCK_SIZE; i++)
+ {
+ if (h[i] != 0)
+ {
+ gotBlock = true;
+ break;
+ }
+ }
+ }
+ }
+
+ /* Name field is 100 bytes, might not be null-terminated */
+ strlcpy(tag, &h[0], 100 + 1);
+
+ len = read_tar_number(&h[124], 12);
+
+ pg_log_debug("TOC Entry %s at %llu (length %llu, checksum %d)",
+ tag, (unsigned long long) hPos, (unsigned long long) len, sum);
+
+ if (chk != sum)
+ pg_fatal("corrupt tar header found in %s (expected %d, computed %d) file position %llu",
+ tag, sum, chk, (unsigned long long) ftello(ctx->tarFH));
+
+ th->targetFile = pg_strdup(tag);
+ th->fileLen = len;
+
+ return 1;
+}
+
+
+static void
+_tarWriteHeader(TAR_MEMBER *th)
+{
+ char h[TAR_BLOCK_SIZE];
+
+ tarCreateHeader(h, th->targetFile, NULL, th->fileLen,
+ 0600, 04000, 02000, time(NULL));
+
+ /* Now write the completed header. */
+ if (fwrite(h, 1, TAR_BLOCK_SIZE, th->tarFH) != TAR_BLOCK_SIZE)
+ WRITE_ERROR_EXIT;
+}
diff --git a/src/bin/pg_dump/pg_backup_tar.h b/src/bin/pg_dump/pg_backup_tar.h
new file mode 100644
index 0000000..0277f08
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_tar.h
@@ -0,0 +1,37 @@
+/*
+ * src/bin/pg_dump/pg_backup_tar.h
+ *
+ * TAR Header (see "ustar interchange format" in POSIX 1003.1)
+ *
+ * Offset Length Contents
+ * 0 100 bytes File name ('\0' terminated, 99 maximum length)
+ * 100 8 bytes File mode (in octal ascii)
+ * 108 8 bytes User ID (in octal ascii)
+ * 116 8 bytes Group ID (in octal ascii)
+ * 124 12 bytes File size (in octal ascii)
+ * 136 12 bytes Modify time (Unix timestamp in octal ascii)
+ * 148 8 bytes Header checksum (in octal ascii)
+ * 156 1 bytes Type flag (see below)
+ * 157 100 bytes Linkname, if symlink ('\0' terminated, 99 maximum length)
+ * 257 6 bytes Magic ("ustar\0")
+ * 263 2 bytes Version ("00")
+ * 265 32 bytes User name ('\0' terminated, 31 maximum length)
+ * 297 32 bytes Group name ('\0' terminated, 31 maximum length)
+ * 329 8 bytes Major device ID (in octal ascii)
+ * 337 8 bytes Minor device ID (in octal ascii)
+ * 345 155 bytes File name prefix (not used in our implementation)
+ * 500 12 bytes Padding
+ *
+ * 512 (s+p)bytes File contents, padded out to 512-byte boundary
+ */
+
+/* The type flag defines the type of file */
+#define LF_OLDNORMAL '\0' /* Normal disk file, Unix compatible */
+#define LF_NORMAL '0' /* Normal disk file */
+#define LF_LINK '1' /* Link to previously dumped file */
+#define LF_SYMLINK '2' /* Symbolic link */
+#define LF_CHR '3' /* Character special file */
+#define LF_BLK '4' /* Block special file */
+#define LF_DIR '5' /* Directory */
+#define LF_FIFO '6' /* FIFO special file */
+#define LF_CONTIG '7' /* Contiguous file */
diff --git a/src/bin/pg_dump/pg_backup_utils.c b/src/bin/pg_dump/pg_backup_utils.c
new file mode 100644
index 0000000..e40890c
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_utils.c
@@ -0,0 +1,104 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_utils.c
+ * Utility routines shared by pg_dump and pg_restore
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_dump/pg_backup_utils.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "parallel.h"
+#include "pg_backup_utils.h"
+
+/* Globals exported by this file */
+const char *progname = NULL;
+
+#define MAX_ON_EXIT_NICELY 20
+
+static struct
+{
+ on_exit_nicely_callback function;
+ void *arg;
+} on_exit_nicely_list[MAX_ON_EXIT_NICELY];
+
+static int on_exit_nicely_index;
+
+/*
+ * Parse a --section=foo command line argument.
+ *
+ * Set or update the bitmask in *dumpSections according to arg.
+ * dumpSections is initialised as DUMP_UNSECTIONED by pg_dump and
+ * pg_restore so they can know if this has even been called.
+ */
+void
+set_dump_section(const char *arg, int *dumpSections)
+{
+ /* if this is the first call, clear all the bits */
+ if (*dumpSections == DUMP_UNSECTIONED)
+ *dumpSections = 0;
+
+ if (strcmp(arg, "pre-data") == 0)
+ *dumpSections |= DUMP_PRE_DATA;
+ else if (strcmp(arg, "data") == 0)
+ *dumpSections |= DUMP_DATA;
+ else if (strcmp(arg, "post-data") == 0)
+ *dumpSections |= DUMP_POST_DATA;
+ else
+ {
+ pg_log_error("unrecognized section name: \"%s\"", arg);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+}
+
+
+/* Register a callback to be run when exit_nicely is invoked. */
+void
+on_exit_nicely(on_exit_nicely_callback function, void *arg)
+{
+ if (on_exit_nicely_index >= MAX_ON_EXIT_NICELY)
+ pg_fatal("out of on_exit_nicely slots");
+ on_exit_nicely_list[on_exit_nicely_index].function = function;
+ on_exit_nicely_list[on_exit_nicely_index].arg = arg;
+ on_exit_nicely_index++;
+}
+
+/*
+ * Run accumulated on_exit_nicely callbacks in reverse order and then exit
+ * without printing any message.
+ *
+ * If running in a parallel worker thread on Windows, we only exit the thread,
+ * not the whole process.
+ *
+ * Note that in parallel operation on Windows, the callback(s) will be run
+ * by each thread since the list state is necessarily shared by all threads;
+ * each callback must contain logic to ensure it does only what's appropriate
+ * for its thread. On Unix, callbacks are also run by each process, but only
+ * for callbacks established before we fork off the child processes. (It'd
+ * be cleaner to reset the list after fork(), and let each child establish
+ * its own callbacks; but then the behavior would be completely inconsistent
+ * between Windows and Unix. For now, just be sure to establish callbacks
+ * before forking to avoid inconsistency.)
+ */
+void
+exit_nicely(int code)
+{
+ int i;
+
+ for (i = on_exit_nicely_index - 1; i >= 0; i--)
+ on_exit_nicely_list[i].function(code,
+ on_exit_nicely_list[i].arg);
+
+#ifdef WIN32
+ if (parallel_init_done && GetCurrentThreadId() != mainThreadId)
+ _endthreadex(code);
+#endif
+
+ exit(code);
+}
diff --git a/src/bin/pg_dump/pg_backup_utils.h b/src/bin/pg_dump/pg_backup_utils.h
new file mode 100644
index 0000000..8173bb9
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_utils.h
@@ -0,0 +1,41 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_utils.h
+ * Utility routines shared by pg_dump and pg_restore.
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_dump/pg_backup_utils.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef PG_BACKUP_UTILS_H
+#define PG_BACKUP_UTILS_H
+
+#include "common/logging.h"
+
+/* bits returned by set_dump_section */
+#define DUMP_PRE_DATA 0x01
+#define DUMP_DATA 0x02
+#define DUMP_POST_DATA 0x04
+#define DUMP_UNSECTIONED 0xff
+
+typedef void (*on_exit_nicely_callback) (int code, void *arg);
+
+extern const char *progname;
+
+extern void set_dump_section(const char *arg, int *dumpSections);
+extern void on_exit_nicely(on_exit_nicely_callback function, void *arg);
+extern void exit_nicely(int code) pg_attribute_noreturn();
+
+/* In pg_dump, we modify pg_fatal to call exit_nicely instead of exit */
+#undef pg_fatal
+#define pg_fatal(...) do { \
+ pg_log_generic(PG_LOG_ERROR, PG_LOG_PRIMARY, __VA_ARGS__); \
+ exit_nicely(1); \
+ } while(0)
+
+#endif /* PG_BACKUP_UTILS_H */
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
new file mode 100644
index 0000000..5e7317b
--- /dev/null
+++ b/src/bin/pg_dump/pg_dump.c
@@ -0,0 +1,18348 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_dump.c
+ * pg_dump is a utility for dumping out a postgres database
+ * into a script file.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * pg_dump will read the system catalogs in a database and dump out a
+ * script that reproduces the schema in terms of SQL that is understood
+ * by PostgreSQL
+ *
+ * Note that pg_dump runs in a transaction-snapshot mode transaction,
+ * so it sees a consistent snapshot of the database including system
+ * catalogs. However, it relies in part on various specialized backend
+ * functions like pg_get_indexdef(), and those things tend to look at
+ * the currently committed state. So it is possible to get 'cache
+ * lookup failed' error if someone performs DDL changes while a dump is
+ * happening. The window for this sort of thing is from the acquisition
+ * of the transaction snapshot to getSchemaData() (when pg_dump acquires
+ * AccessShareLock on every table it intends to dump). It isn't very large,
+ * but it can happen.
+ *
+ * http://archives.postgresql.org/pgsql-bugs/2010-02/msg00187.php
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_dump.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <unistd.h>
+#include <ctype.h>
+#include <limits.h>
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#endif
+
+#include "access/attnum.h"
+#include "access/sysattr.h"
+#include "access/transam.h"
+#include "catalog/pg_aggregate_d.h"
+#include "catalog/pg_am_d.h"
+#include "catalog/pg_attribute_d.h"
+#include "catalog/pg_authid_d.h"
+#include "catalog/pg_cast_d.h"
+#include "catalog/pg_class_d.h"
+#include "catalog/pg_default_acl_d.h"
+#include "catalog/pg_largeobject_d.h"
+#include "catalog/pg_largeobject_metadata_d.h"
+#include "catalog/pg_proc_d.h"
+#include "catalog/pg_subscription.h"
+#include "catalog/pg_trigger_d.h"
+#include "catalog/pg_type_d.h"
+#include "common/connect.h"
+#include "dumputils.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/string_utils.h"
+#include "getopt_long.h"
+#include "libpq/libpq-fs.h"
+#include "parallel.h"
+#include "pg_backup_db.h"
+#include "pg_backup_utils.h"
+#include "pg_dump.h"
+#include "storage/block.h"
+
+typedef struct
+{
+ Oid roleoid; /* role's OID */
+ const char *rolename; /* role's name */
+} RoleNameItem;
+
+typedef struct
+{
+ const char *descr; /* comment for an object */
+ Oid classoid; /* object class (catalog OID) */
+ Oid objoid; /* object OID */
+ int objsubid; /* subobject (table column #) */
+} CommentItem;
+
+typedef struct
+{
+ const char *provider; /* label provider of this security label */
+ const char *label; /* security label for an object */
+ Oid classoid; /* object class (catalog OID) */
+ Oid objoid; /* object OID */
+ int objsubid; /* subobject (table column #) */
+} SecLabelItem;
+
+typedef enum OidOptions
+{
+ zeroIsError = 1,
+ zeroAsStar = 2,
+ zeroAsNone = 4
+} OidOptions;
+
+/* global decls */
+static bool dosync = true; /* Issue fsync() to make dump durable on disk. */
+
+static Oid g_last_builtin_oid; /* value of the last builtin oid */
+
+/* The specified names/patterns should to match at least one entity */
+static int strict_names = 0;
+
+/*
+ * Object inclusion/exclusion lists
+ *
+ * The string lists record the patterns given by command-line switches,
+ * which we then convert to lists of OIDs of matching objects.
+ */
+static SimpleStringList schema_include_patterns = {NULL, NULL};
+static SimpleOidList schema_include_oids = {NULL, NULL};
+static SimpleStringList schema_exclude_patterns = {NULL, NULL};
+static SimpleOidList schema_exclude_oids = {NULL, NULL};
+
+static SimpleStringList table_include_patterns = {NULL, NULL};
+static SimpleOidList table_include_oids = {NULL, NULL};
+static SimpleStringList table_exclude_patterns = {NULL, NULL};
+static SimpleOidList table_exclude_oids = {NULL, NULL};
+static SimpleStringList tabledata_exclude_patterns = {NULL, NULL};
+static SimpleOidList tabledata_exclude_oids = {NULL, NULL};
+static SimpleStringList foreign_servers_include_patterns = {NULL, NULL};
+static SimpleOidList foreign_servers_include_oids = {NULL, NULL};
+
+static SimpleStringList extension_include_patterns = {NULL, NULL};
+static SimpleOidList extension_include_oids = {NULL, NULL};
+
+static const CatalogId nilCatalogId = {0, 0};
+
+/* override for standard extra_float_digits setting */
+static bool have_extra_float_digits = false;
+static int extra_float_digits;
+
+/* sorted table of role names */
+static RoleNameItem *rolenames = NULL;
+static int nrolenames = 0;
+
+/* sorted table of comments */
+static CommentItem *comments = NULL;
+static int ncomments = 0;
+
+/* sorted table of security labels */
+static SecLabelItem *seclabels = NULL;
+static int nseclabels = 0;
+
+/*
+ * The default number of rows per INSERT when
+ * --inserts is specified without --rows-per-insert
+ */
+#define DUMP_DEFAULT_ROWS_PER_INSERT 1
+
+/*
+ * Macro for producing quoted, schema-qualified name of a dumpable object.
+ */
+#define fmtQualifiedDumpable(obj) \
+ fmtQualifiedId((obj)->dobj.namespace->dobj.name, \
+ (obj)->dobj.name)
+
+static void help(const char *progname);
+static void setup_connection(Archive *AH,
+ const char *dumpencoding, const char *dumpsnapshot,
+ char *use_role);
+static ArchiveFormat parseArchiveFormat(const char *format, ArchiveMode *mode);
+static void expand_schema_name_patterns(Archive *fout,
+ SimpleStringList *patterns,
+ SimpleOidList *oids,
+ bool strict_names);
+static void expand_extension_name_patterns(Archive *fout,
+ SimpleStringList *patterns,
+ SimpleOidList *oids,
+ bool strict_names);
+static void expand_foreign_server_name_patterns(Archive *fout,
+ SimpleStringList *patterns,
+ SimpleOidList *oids);
+static void expand_table_name_patterns(Archive *fout,
+ SimpleStringList *patterns,
+ SimpleOidList *oids,
+ bool strict_names);
+static void prohibit_crossdb_refs(PGconn *conn, const char *dbname,
+ const char *pattern);
+
+static NamespaceInfo *findNamespace(Oid nsoid);
+static void dumpTableData(Archive *fout, const TableDataInfo *tdinfo);
+static void refreshMatViewData(Archive *fout, const TableDataInfo *tdinfo);
+static const char *getRoleName(const char *roleoid_str);
+static void collectRoleNames(Archive *fout);
+static void getAdditionalACLs(Archive *fout);
+static void dumpCommentExtended(Archive *fout, const char *type,
+ const char *name, const char *namespace,
+ const char *owner, CatalogId catalogId,
+ int subid, DumpId dumpId,
+ const char *initdb_comment);
+static inline void dumpComment(Archive *fout, const char *type,
+ const char *name, const char *namespace,
+ const char *owner, CatalogId catalogId,
+ int subid, DumpId dumpId);
+static int findComments(Oid classoid, Oid objoid, CommentItem **items);
+static void collectComments(Archive *fout);
+static void dumpSecLabel(Archive *fout, const char *type, const char *name,
+ const char *namespace, const char *owner,
+ CatalogId catalogId, int subid, DumpId dumpId);
+static int findSecLabels(Oid classoid, Oid objoid, SecLabelItem **items);
+static void collectSecLabels(Archive *fout);
+static void dumpDumpableObject(Archive *fout, DumpableObject *dobj);
+static void dumpNamespace(Archive *fout, const NamespaceInfo *nspinfo);
+static void dumpExtension(Archive *fout, const ExtensionInfo *extinfo);
+static void dumpType(Archive *fout, const TypeInfo *tyinfo);
+static void dumpBaseType(Archive *fout, const TypeInfo *tyinfo);
+static void dumpEnumType(Archive *fout, const TypeInfo *tyinfo);
+static void dumpRangeType(Archive *fout, const TypeInfo *tyinfo);
+static void dumpUndefinedType(Archive *fout, const TypeInfo *tyinfo);
+static void dumpDomain(Archive *fout, const TypeInfo *tyinfo);
+static void dumpCompositeType(Archive *fout, const TypeInfo *tyinfo);
+static void dumpCompositeTypeColComments(Archive *fout, const TypeInfo *tyinfo,
+ PGresult *res);
+static void dumpShellType(Archive *fout, const ShellTypeInfo *stinfo);
+static void dumpProcLang(Archive *fout, const ProcLangInfo *plang);
+static void dumpFunc(Archive *fout, const FuncInfo *finfo);
+static void dumpCast(Archive *fout, const CastInfo *cast);
+static void dumpTransform(Archive *fout, const TransformInfo *transform);
+static void dumpOpr(Archive *fout, const OprInfo *oprinfo);
+static void dumpAccessMethod(Archive *fout, const AccessMethodInfo *oprinfo);
+static void dumpOpclass(Archive *fout, const OpclassInfo *opcinfo);
+static void dumpOpfamily(Archive *fout, const OpfamilyInfo *opfinfo);
+static void dumpCollation(Archive *fout, const CollInfo *collinfo);
+static void dumpConversion(Archive *fout, const ConvInfo *convinfo);
+static void dumpRule(Archive *fout, const RuleInfo *rinfo);
+static void dumpAgg(Archive *fout, const AggInfo *agginfo);
+static void dumpTrigger(Archive *fout, const TriggerInfo *tginfo);
+static void dumpEventTrigger(Archive *fout, const EventTriggerInfo *evtinfo);
+static void dumpTable(Archive *fout, const TableInfo *tbinfo);
+static void dumpTableSchema(Archive *fout, const TableInfo *tbinfo);
+static void dumpTableAttach(Archive *fout, const TableAttachInfo *tbinfo);
+static void dumpAttrDef(Archive *fout, const AttrDefInfo *adinfo);
+static void dumpSequence(Archive *fout, const TableInfo *tbinfo);
+static void dumpSequenceData(Archive *fout, const TableDataInfo *tdinfo);
+static void dumpIndex(Archive *fout, const IndxInfo *indxinfo);
+static void dumpIndexAttach(Archive *fout, const IndexAttachInfo *attachinfo);
+static void dumpStatisticsExt(Archive *fout, const StatsExtInfo *statsextinfo);
+static void dumpConstraint(Archive *fout, const ConstraintInfo *coninfo);
+static void dumpTableConstraintComment(Archive *fout, const ConstraintInfo *coninfo);
+static void dumpTSParser(Archive *fout, const TSParserInfo *prsinfo);
+static void dumpTSDictionary(Archive *fout, const TSDictInfo *dictinfo);
+static void dumpTSTemplate(Archive *fout, const TSTemplateInfo *tmplinfo);
+static void dumpTSConfig(Archive *fout, const TSConfigInfo *cfginfo);
+static void dumpForeignDataWrapper(Archive *fout, const FdwInfo *fdwinfo);
+static void dumpForeignServer(Archive *fout, const ForeignServerInfo *srvinfo);
+static void dumpUserMappings(Archive *fout,
+ const char *servername, const char *namespace,
+ const char *owner, CatalogId catalogId, DumpId dumpId);
+static void dumpDefaultACL(Archive *fout, const DefaultACLInfo *daclinfo);
+
+static DumpId dumpACL(Archive *fout, DumpId objDumpId, DumpId altDumpId,
+ const char *type, const char *name, const char *subname,
+ const char *nspname, const char *owner,
+ const DumpableAcl *dacl);
+
+static void getDependencies(Archive *fout);
+static void BuildArchiveDependencies(Archive *fout);
+static void findDumpableDependencies(ArchiveHandle *AH, const DumpableObject *dobj,
+ DumpId **dependencies, int *nDeps, int *allocDeps);
+
+static DumpableObject *createBoundaryObjects(void);
+static void addBoundaryDependencies(DumpableObject **dobjs, int numObjs,
+ DumpableObject *boundaryObjs);
+
+static void addConstrChildIdxDeps(DumpableObject *dobj, const IndxInfo *refidx);
+static void getDomainConstraints(Archive *fout, TypeInfo *tyinfo);
+static void getTableData(DumpOptions *dopt, TableInfo *tblinfo, int numTables, char relkind);
+static void makeTableDataInfo(DumpOptions *dopt, TableInfo *tbinfo);
+static void buildMatViewRefreshDependencies(Archive *fout);
+static void getTableDataFKConstraints(void);
+static char *format_function_arguments(const FuncInfo *finfo, const char *funcargs,
+ bool is_agg);
+static char *format_function_signature(Archive *fout,
+ const FuncInfo *finfo, bool honor_quotes);
+static char *convertRegProcReference(const char *proc);
+static char *getFormattedOperatorName(const char *oproid);
+static char *convertTSFunction(Archive *fout, Oid funcOid);
+static const char *getFormattedTypeName(Archive *fout, Oid oid, OidOptions opts);
+static void getBlobs(Archive *fout);
+static void dumpBlob(Archive *fout, const BlobInfo *binfo);
+static int dumpBlobs(Archive *fout, const void *arg);
+static void dumpPolicy(Archive *fout, const PolicyInfo *polinfo);
+static void dumpPublication(Archive *fout, const PublicationInfo *pubinfo);
+static void dumpPublicationTable(Archive *fout, const PublicationRelInfo *pubrinfo);
+static void dumpSubscription(Archive *fout, const SubscriptionInfo *subinfo);
+static void dumpDatabase(Archive *AH);
+static void dumpDatabaseConfig(Archive *AH, PQExpBuffer outbuf,
+ const char *dbname, Oid dboid);
+static void dumpEncoding(Archive *AH);
+static void dumpStdStrings(Archive *AH);
+static void dumpSearchPath(Archive *AH);
+static void binary_upgrade_set_type_oids_by_type_oid(Archive *fout,
+ PQExpBuffer upgrade_buffer,
+ Oid pg_type_oid,
+ bool force_array_type,
+ bool include_multirange_type);
+static void binary_upgrade_set_type_oids_by_rel(Archive *fout,
+ PQExpBuffer upgrade_buffer,
+ const TableInfo *tbinfo);
+static void binary_upgrade_set_pg_class_oids(Archive *fout,
+ PQExpBuffer upgrade_buffer,
+ Oid pg_class_oid, bool is_index);
+static void binary_upgrade_extension_member(PQExpBuffer upgrade_buffer,
+ const DumpableObject *dobj,
+ const char *objtype,
+ const char *objname,
+ const char *objnamespace);
+static const char *getAttrName(int attrnum, const TableInfo *tblInfo);
+static const char *fmtCopyColumnList(const TableInfo *ti, PQExpBuffer buffer);
+static bool nonemptyReloptions(const char *reloptions);
+static void appendReloptionsArrayAH(PQExpBuffer buffer, const char *reloptions,
+ const char *prefix, Archive *fout);
+static char *get_synchronized_snapshot(Archive *fout);
+static void setupDumpWorker(Archive *AHX);
+static TableInfo *getRootTableInfo(const TableInfo *tbinfo);
+static bool forcePartitionRootLoad(const TableInfo *tbinfo);
+
+
+int
+main(int argc, char **argv)
+{
+ int c;
+ const char *filename = NULL;
+ const char *format = "p";
+ TableInfo *tblinfo;
+ int numTables;
+ DumpableObject **dobjs;
+ int numObjs;
+ DumpableObject *boundaryObjs;
+ int i;
+ int optindex;
+ RestoreOptions *ropt;
+ Archive *fout; /* the script file */
+ bool g_verbose = false;
+ const char *dumpencoding = NULL;
+ const char *dumpsnapshot = NULL;
+ char *use_role = NULL;
+ int numWorkers = 1;
+ int compressLevel = -1;
+ int plainText = 0;
+ ArchiveFormat archiveFormat = archUnknown;
+ ArchiveMode archiveMode;
+
+ static DumpOptions dopt;
+
+ static struct option long_options[] = {
+ {"data-only", no_argument, NULL, 'a'},
+ {"blobs", no_argument, NULL, 'b'},
+ {"no-blobs", no_argument, NULL, 'B'},
+ {"clean", no_argument, NULL, 'c'},
+ {"create", no_argument, NULL, 'C'},
+ {"dbname", required_argument, NULL, 'd'},
+ {"extension", required_argument, NULL, 'e'},
+ {"file", required_argument, NULL, 'f'},
+ {"format", required_argument, NULL, 'F'},
+ {"host", required_argument, NULL, 'h'},
+ {"jobs", 1, NULL, 'j'},
+ {"no-reconnect", no_argument, NULL, 'R'},
+ {"no-owner", no_argument, NULL, 'O'},
+ {"port", required_argument, NULL, 'p'},
+ {"schema", required_argument, NULL, 'n'},
+ {"exclude-schema", required_argument, NULL, 'N'},
+ {"schema-only", no_argument, NULL, 's'},
+ {"superuser", required_argument, NULL, 'S'},
+ {"table", required_argument, NULL, 't'},
+ {"exclude-table", required_argument, NULL, 'T'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"username", required_argument, NULL, 'U'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"no-privileges", no_argument, NULL, 'x'},
+ {"no-acl", no_argument, NULL, 'x'},
+ {"compress", required_argument, NULL, 'Z'},
+ {"encoding", required_argument, NULL, 'E'},
+ {"help", no_argument, NULL, '?'},
+ {"version", no_argument, NULL, 'V'},
+
+ /*
+ * the following options don't have an equivalent short option letter
+ */
+ {"attribute-inserts", no_argument, &dopt.column_inserts, 1},
+ {"binary-upgrade", no_argument, &dopt.binary_upgrade, 1},
+ {"column-inserts", no_argument, &dopt.column_inserts, 1},
+ {"disable-dollar-quoting", no_argument, &dopt.disable_dollar_quoting, 1},
+ {"disable-triggers", no_argument, &dopt.disable_triggers, 1},
+ {"enable-row-security", no_argument, &dopt.enable_row_security, 1},
+ {"exclude-table-data", required_argument, NULL, 4},
+ {"extra-float-digits", required_argument, NULL, 8},
+ {"if-exists", no_argument, &dopt.if_exists, 1},
+ {"inserts", no_argument, NULL, 9},
+ {"lock-wait-timeout", required_argument, NULL, 2},
+ {"no-table-access-method", no_argument, &dopt.outputNoTableAm, 1},
+ {"no-tablespaces", no_argument, &dopt.outputNoTablespaces, 1},
+ {"quote-all-identifiers", no_argument, &quote_all_identifiers, 1},
+ {"load-via-partition-root", no_argument, &dopt.load_via_partition_root, 1},
+ {"role", required_argument, NULL, 3},
+ {"section", required_argument, NULL, 5},
+ {"serializable-deferrable", no_argument, &dopt.serializable_deferrable, 1},
+ {"snapshot", required_argument, NULL, 6},
+ {"strict-names", no_argument, &strict_names, 1},
+ {"use-set-session-authorization", no_argument, &dopt.use_setsessauth, 1},
+ {"no-comments", no_argument, &dopt.no_comments, 1},
+ {"no-publications", no_argument, &dopt.no_publications, 1},
+ {"no-security-labels", no_argument, &dopt.no_security_labels, 1},
+ {"no-subscriptions", no_argument, &dopt.no_subscriptions, 1},
+ {"no-toast-compression", no_argument, &dopt.no_toast_compression, 1},
+ {"no-unlogged-table-data", no_argument, &dopt.no_unlogged_table_data, 1},
+ {"no-sync", no_argument, NULL, 7},
+ {"on-conflict-do-nothing", no_argument, &dopt.do_nothing, 1},
+ {"rows-per-insert", required_argument, NULL, 10},
+ {"include-foreign-data", required_argument, NULL, 11},
+
+ {NULL, 0, NULL, 0}
+ };
+
+ pg_logging_init(argv[0]);
+ pg_logging_set_level(PG_LOG_WARNING);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_dump"));
+
+ /*
+ * Initialize what we need for parallel execution, especially for thread
+ * support on Windows.
+ */
+ init_parallel_dump_utils();
+
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ help(progname);
+ exit_nicely(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_dump (PostgreSQL) " PG_VERSION);
+ exit_nicely(0);
+ }
+ }
+
+ InitDumpOptions(&dopt);
+
+ while ((c = getopt_long(argc, argv, "abBcCd:e:E:f:F:h:j:n:N:Op:RsS:t:T:U:vwWxZ:",
+ long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'a': /* Dump data only */
+ dopt.dataOnly = true;
+ break;
+
+ case 'b': /* Dump blobs */
+ dopt.outputBlobs = true;
+ break;
+
+ case 'B': /* Don't dump blobs */
+ dopt.dontOutputBlobs = true;
+ break;
+
+ case 'c': /* clean (i.e., drop) schema prior to create */
+ dopt.outputClean = 1;
+ break;
+
+ case 'C': /* Create DB */
+ dopt.outputCreateDB = 1;
+ break;
+
+ case 'd': /* database name */
+ dopt.cparams.dbname = pg_strdup(optarg);
+ break;
+
+ case 'e': /* include extension(s) */
+ simple_string_list_append(&extension_include_patterns, optarg);
+ dopt.include_everything = false;
+ break;
+
+ case 'E': /* Dump encoding */
+ dumpencoding = pg_strdup(optarg);
+ break;
+
+ case 'f':
+ filename = pg_strdup(optarg);
+ break;
+
+ case 'F':
+ format = pg_strdup(optarg);
+ break;
+
+ case 'h': /* server host */
+ dopt.cparams.pghost = pg_strdup(optarg);
+ break;
+
+ case 'j': /* number of dump jobs */
+ if (!option_parse_int(optarg, "-j/--jobs", 1,
+ PG_MAX_JOBS,
+ &numWorkers))
+ exit_nicely(1);
+ break;
+
+ case 'n': /* include schema(s) */
+ simple_string_list_append(&schema_include_patterns, optarg);
+ dopt.include_everything = false;
+ break;
+
+ case 'N': /* exclude schema(s) */
+ simple_string_list_append(&schema_exclude_patterns, optarg);
+ break;
+
+ case 'O': /* Don't reconnect to match owner */
+ dopt.outputNoOwner = 1;
+ break;
+
+ case 'p': /* server port */
+ dopt.cparams.pgport = pg_strdup(optarg);
+ break;
+
+ case 'R':
+ /* no-op, still accepted for backwards compatibility */
+ break;
+
+ case 's': /* dump schema only */
+ dopt.schemaOnly = true;
+ break;
+
+ case 'S': /* Username for superuser in plain text output */
+ dopt.outputSuperuser = pg_strdup(optarg);
+ break;
+
+ case 't': /* include table(s) */
+ simple_string_list_append(&table_include_patterns, optarg);
+ dopt.include_everything = false;
+ break;
+
+ case 'T': /* exclude table(s) */
+ simple_string_list_append(&table_exclude_patterns, optarg);
+ break;
+
+ case 'U':
+ dopt.cparams.username = pg_strdup(optarg);
+ break;
+
+ case 'v': /* verbose */
+ g_verbose = true;
+ pg_logging_increase_verbosity();
+ break;
+
+ case 'w':
+ dopt.cparams.promptPassword = TRI_NO;
+ break;
+
+ case 'W':
+ dopt.cparams.promptPassword = TRI_YES;
+ break;
+
+ case 'x': /* skip ACL dump */
+ dopt.aclsSkip = true;
+ break;
+
+ case 'Z': /* Compression Level */
+ if (!option_parse_int(optarg, "-Z/--compress", 0, 9,
+ &compressLevel))
+ exit_nicely(1);
+ break;
+
+ case 0:
+ /* This covers the long options. */
+ break;
+
+ case 2: /* lock-wait-timeout */
+ dopt.lockWaitTimeout = pg_strdup(optarg);
+ break;
+
+ case 3: /* SET ROLE */
+ use_role = pg_strdup(optarg);
+ break;
+
+ case 4: /* exclude table(s) data */
+ simple_string_list_append(&tabledata_exclude_patterns, optarg);
+ break;
+
+ case 5: /* section */
+ set_dump_section(optarg, &dopt.dumpSections);
+ break;
+
+ case 6: /* snapshot */
+ dumpsnapshot = pg_strdup(optarg);
+ break;
+
+ case 7: /* no-sync */
+ dosync = false;
+ break;
+
+ case 8:
+ have_extra_float_digits = true;
+ if (!option_parse_int(optarg, "--extra-float-digits", -15, 3,
+ &extra_float_digits))
+ exit_nicely(1);
+ break;
+
+ case 9: /* inserts */
+
+ /*
+ * dump_inserts also stores --rows-per-insert, careful not to
+ * overwrite that.
+ */
+ if (dopt.dump_inserts == 0)
+ dopt.dump_inserts = DUMP_DEFAULT_ROWS_PER_INSERT;
+ break;
+
+ case 10: /* rows per insert */
+ if (!option_parse_int(optarg, "--rows-per-insert", 1, INT_MAX,
+ &dopt.dump_inserts))
+ exit_nicely(1);
+ break;
+
+ case 11: /* include foreign data */
+ simple_string_list_append(&foreign_servers_include_patterns,
+ optarg);
+ break;
+
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+ }
+
+ /*
+ * Non-option argument specifies database name as long as it wasn't
+ * already specified with -d / --dbname
+ */
+ if (optind < argc && dopt.cparams.dbname == NULL)
+ dopt.cparams.dbname = argv[optind++];
+
+ /* Complain if any arguments remain */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+
+ /* --column-inserts implies --inserts */
+ if (dopt.column_inserts && dopt.dump_inserts == 0)
+ dopt.dump_inserts = DUMP_DEFAULT_ROWS_PER_INSERT;
+
+ /*
+ * Binary upgrade mode implies dumping sequence data even in schema-only
+ * mode. This is not exposed as a separate option, but kept separate
+ * internally for clarity.
+ */
+ if (dopt.binary_upgrade)
+ dopt.sequence_data = 1;
+
+ if (dopt.dataOnly && dopt.schemaOnly)
+ pg_fatal("options -s/--schema-only and -a/--data-only cannot be used together");
+
+ if (dopt.schemaOnly && foreign_servers_include_patterns.head != NULL)
+ pg_fatal("options -s/--schema-only and --include-foreign-data cannot be used together");
+
+ if (numWorkers > 1 && foreign_servers_include_patterns.head != NULL)
+ pg_fatal("option --include-foreign-data is not supported with parallel backup");
+
+ if (dopt.dataOnly && dopt.outputClean)
+ pg_fatal("options -c/--clean and -a/--data-only cannot be used together");
+
+ if (dopt.if_exists && !dopt.outputClean)
+ pg_fatal("option --if-exists requires option -c/--clean");
+
+ /*
+ * --inserts are already implied above if --column-inserts or
+ * --rows-per-insert were specified.
+ */
+ if (dopt.do_nothing && dopt.dump_inserts == 0)
+ pg_fatal("option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts");
+
+ /* Identify archive format to emit */
+ archiveFormat = parseArchiveFormat(format, &archiveMode);
+
+ /* archiveFormat specific setup */
+ if (archiveFormat == archNull)
+ plainText = 1;
+
+ /* Custom and directory formats are compressed by default, others not */
+ if (compressLevel == -1)
+ {
+#ifdef HAVE_LIBZ
+ if (archiveFormat == archCustom || archiveFormat == archDirectory)
+ compressLevel = Z_DEFAULT_COMPRESSION;
+ else
+#endif
+ compressLevel = 0;
+ }
+
+#ifndef HAVE_LIBZ
+ if (compressLevel != 0)
+ pg_log_warning("requested compression not available in this installation -- archive will be uncompressed");
+ compressLevel = 0;
+#endif
+
+ /*
+ * If emitting an archive format, we always want to emit a DATABASE item,
+ * in case --create is specified at pg_restore time.
+ */
+ if (!plainText)
+ dopt.outputCreateDB = 1;
+
+ /* Parallel backup only in the directory archive format so far */
+ if (archiveFormat != archDirectory && numWorkers > 1)
+ pg_fatal("parallel backup only supported by the directory format");
+
+ /* Open the output file */
+ fout = CreateArchive(filename, archiveFormat, compressLevel, dosync,
+ archiveMode, setupDumpWorker);
+
+ /* Make dump options accessible right away */
+ SetArchiveOptions(fout, &dopt, NULL);
+
+ /* Register the cleanup hook */
+ on_exit_close_archive(fout);
+
+ /* Let the archiver know how noisy to be */
+ fout->verbose = g_verbose;
+
+
+ /*
+ * We allow the server to be back to 9.2, and up to any minor release of
+ * our own major version. (See also version check in pg_dumpall.c.)
+ */
+ fout->minRemoteVersion = 90200;
+ fout->maxRemoteVersion = (PG_VERSION_NUM / 100) * 100 + 99;
+
+ fout->numWorkers = numWorkers;
+
+ /*
+ * Open the database using the Archiver, so it knows about it. Errors mean
+ * death.
+ */
+ ConnectDatabase(fout, &dopt.cparams, false);
+ setup_connection(fout, dumpencoding, dumpsnapshot, use_role);
+
+ /*
+ * On hot standbys, never try to dump unlogged table data, since it will
+ * just throw an error.
+ */
+ if (fout->isStandby)
+ dopt.no_unlogged_table_data = true;
+
+ /*
+ * Find the last built-in OID, if needed (prior to 8.1)
+ *
+ * With 8.1 and above, we can just use FirstNormalObjectId - 1.
+ */
+ g_last_builtin_oid = FirstNormalObjectId - 1;
+
+ pg_log_info("last built-in OID is %u", g_last_builtin_oid);
+
+ /* Expand schema selection patterns into OID lists */
+ if (schema_include_patterns.head != NULL)
+ {
+ expand_schema_name_patterns(fout, &schema_include_patterns,
+ &schema_include_oids,
+ strict_names);
+ if (schema_include_oids.head == NULL)
+ pg_fatal("no matching schemas were found");
+ }
+ expand_schema_name_patterns(fout, &schema_exclude_patterns,
+ &schema_exclude_oids,
+ false);
+ /* non-matching exclusion patterns aren't an error */
+
+ /* Expand table selection patterns into OID lists */
+ if (table_include_patterns.head != NULL)
+ {
+ expand_table_name_patterns(fout, &table_include_patterns,
+ &table_include_oids,
+ strict_names);
+ if (table_include_oids.head == NULL)
+ pg_fatal("no matching tables were found");
+ }
+ expand_table_name_patterns(fout, &table_exclude_patterns,
+ &table_exclude_oids,
+ false);
+
+ expand_table_name_patterns(fout, &tabledata_exclude_patterns,
+ &tabledata_exclude_oids,
+ false);
+
+ expand_foreign_server_name_patterns(fout, &foreign_servers_include_patterns,
+ &foreign_servers_include_oids);
+
+ /* non-matching exclusion patterns aren't an error */
+
+ /* Expand extension selection patterns into OID lists */
+ if (extension_include_patterns.head != NULL)
+ {
+ expand_extension_name_patterns(fout, &extension_include_patterns,
+ &extension_include_oids,
+ strict_names);
+ if (extension_include_oids.head == NULL)
+ pg_fatal("no matching extensions were found");
+ }
+
+ /*
+ * Dumping blobs is the default for dumps where an inclusion switch is not
+ * used (an "include everything" dump). -B can be used to exclude blobs
+ * from those dumps. -b can be used to include blobs even when an
+ * inclusion switch is used.
+ *
+ * -s means "schema only" and blobs are data, not schema, so we never
+ * include blobs when -s is used.
+ */
+ if (dopt.include_everything && !dopt.schemaOnly && !dopt.dontOutputBlobs)
+ dopt.outputBlobs = true;
+
+ /*
+ * Collect role names so we can map object owner OIDs to names.
+ */
+ collectRoleNames(fout);
+
+ /*
+ * Now scan the database and create DumpableObject structs for all the
+ * objects we intend to dump.
+ */
+ tblinfo = getSchemaData(fout, &numTables);
+
+ if (!dopt.schemaOnly)
+ {
+ getTableData(&dopt, tblinfo, numTables, 0);
+ buildMatViewRefreshDependencies(fout);
+ if (dopt.dataOnly)
+ getTableDataFKConstraints();
+ }
+
+ if (dopt.schemaOnly && dopt.sequence_data)
+ getTableData(&dopt, tblinfo, numTables, RELKIND_SEQUENCE);
+
+ /*
+ * In binary-upgrade mode, we do not have to worry about the actual blob
+ * data or the associated metadata that resides in the pg_largeobject and
+ * pg_largeobject_metadata tables, respectively.
+ *
+ * However, we do need to collect blob information as there may be
+ * comments or other information on blobs that we do need to dump out.
+ */
+ if (dopt.outputBlobs || dopt.binary_upgrade)
+ getBlobs(fout);
+
+ /*
+ * Collect dependency data to assist in ordering the objects.
+ */
+ getDependencies(fout);
+
+ /*
+ * Collect ACLs, comments, and security labels, if wanted.
+ */
+ if (!dopt.aclsSkip)
+ getAdditionalACLs(fout);
+ if (!dopt.no_comments)
+ collectComments(fout);
+ if (!dopt.no_security_labels)
+ collectSecLabels(fout);
+
+ /* Lastly, create dummy objects to represent the section boundaries */
+ boundaryObjs = createBoundaryObjects();
+
+ /* Get pointers to all the known DumpableObjects */
+ getDumpableObjects(&dobjs, &numObjs);
+
+ /*
+ * Add dummy dependencies to enforce the dump section ordering.
+ */
+ addBoundaryDependencies(dobjs, numObjs, boundaryObjs);
+
+ /*
+ * Sort the objects into a safe dump order (no forward references).
+ *
+ * We rely on dependency information to help us determine a safe order, so
+ * the initial sort is mostly for cosmetic purposes: we sort by name to
+ * ensure that logically identical schemas will dump identically.
+ */
+ sortDumpableObjectsByTypeName(dobjs, numObjs);
+
+ sortDumpableObjects(dobjs, numObjs,
+ boundaryObjs[0].dumpId, boundaryObjs[1].dumpId);
+
+ /*
+ * Create archive TOC entries for all the objects to be dumped, in a safe
+ * order.
+ */
+
+ /*
+ * First the special entries for ENCODING, STDSTRINGS, and SEARCHPATH.
+ */
+ dumpEncoding(fout);
+ dumpStdStrings(fout);
+ dumpSearchPath(fout);
+
+ /* The database items are always next, unless we don't want them at all */
+ if (dopt.outputCreateDB)
+ dumpDatabase(fout);
+
+ /* Now the rearrangeable objects. */
+ for (i = 0; i < numObjs; i++)
+ dumpDumpableObject(fout, dobjs[i]);
+
+ /*
+ * Set up options info to ensure we dump what we want.
+ */
+ ropt = NewRestoreOptions();
+ ropt->filename = filename;
+
+ /* if you change this list, see dumpOptionsFromRestoreOptions */
+ ropt->cparams.dbname = dopt.cparams.dbname ? pg_strdup(dopt.cparams.dbname) : NULL;
+ ropt->cparams.pgport = dopt.cparams.pgport ? pg_strdup(dopt.cparams.pgport) : NULL;
+ ropt->cparams.pghost = dopt.cparams.pghost ? pg_strdup(dopt.cparams.pghost) : NULL;
+ ropt->cparams.username = dopt.cparams.username ? pg_strdup(dopt.cparams.username) : NULL;
+ ropt->cparams.promptPassword = dopt.cparams.promptPassword;
+ ropt->dropSchema = dopt.outputClean;
+ ropt->dataOnly = dopt.dataOnly;
+ ropt->schemaOnly = dopt.schemaOnly;
+ ropt->if_exists = dopt.if_exists;
+ ropt->column_inserts = dopt.column_inserts;
+ ropt->dumpSections = dopt.dumpSections;
+ ropt->aclsSkip = dopt.aclsSkip;
+ ropt->superuser = dopt.outputSuperuser;
+ ropt->createDB = dopt.outputCreateDB;
+ ropt->noOwner = dopt.outputNoOwner;
+ ropt->noTableAm = dopt.outputNoTableAm;
+ ropt->noTablespace = dopt.outputNoTablespaces;
+ ropt->disable_triggers = dopt.disable_triggers;
+ ropt->use_setsessauth = dopt.use_setsessauth;
+ ropt->disable_dollar_quoting = dopt.disable_dollar_quoting;
+ ropt->dump_inserts = dopt.dump_inserts;
+ ropt->no_comments = dopt.no_comments;
+ ropt->no_publications = dopt.no_publications;
+ ropt->no_security_labels = dopt.no_security_labels;
+ ropt->no_subscriptions = dopt.no_subscriptions;
+ ropt->lockWaitTimeout = dopt.lockWaitTimeout;
+ ropt->include_everything = dopt.include_everything;
+ ropt->enable_row_security = dopt.enable_row_security;
+ ropt->sequence_data = dopt.sequence_data;
+ ropt->binary_upgrade = dopt.binary_upgrade;
+
+ if (compressLevel == -1)
+ ropt->compression = 0;
+ else
+ ropt->compression = compressLevel;
+
+ ropt->suppressDumpWarnings = true; /* We've already shown them */
+
+ SetArchiveOptions(fout, &dopt, ropt);
+
+ /* Mark which entries should be output */
+ ProcessArchiveRestoreOptions(fout);
+
+ /*
+ * The archive's TOC entries are now marked as to which ones will actually
+ * be output, so we can set up their dependency lists properly. This isn't
+ * necessary for plain-text output, though.
+ */
+ if (!plainText)
+ BuildArchiveDependencies(fout);
+
+ /*
+ * And finally we can do the actual output.
+ *
+ * Note: for non-plain-text output formats, the output file is written
+ * inside CloseArchive(). This is, um, bizarre; but not worth changing
+ * right now.
+ */
+ if (plainText)
+ RestoreArchive(fout);
+
+ CloseArchive(fout);
+
+ exit_nicely(0);
+}
+
+
+static void
+help(const char *progname)
+{
+ printf(_("%s dumps a database as a text file or to other formats.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DBNAME]\n"), progname);
+
+ printf(_("\nGeneral options:\n"));
+ printf(_(" -f, --file=FILENAME output file or directory name\n"));
+ printf(_(" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+ " plain text (default))\n"));
+ printf(_(" -j, --jobs=NUM use this many parallel jobs to dump\n"));
+ printf(_(" -v, --verbose verbose mode\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -Z, --compress=0-9 compression level for compressed formats\n"));
+ printf(_(" --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"));
+ printf(_(" --no-sync do not wait for changes to be written safely to disk\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+
+ printf(_("\nOptions controlling the output content:\n"));
+ printf(_(" -a, --data-only dump only the data, not the schema\n"));
+ printf(_(" -b, --blobs include large objects in dump\n"));
+ printf(_(" -B, --no-blobs exclude large objects in dump\n"));
+ printf(_(" -c, --clean clean (drop) database objects before recreating\n"));
+ printf(_(" -C, --create include commands to create database in dump\n"));
+ printf(_(" -e, --extension=PATTERN dump the specified extension(s) only\n"));
+ printf(_(" -E, --encoding=ENCODING dump the data in encoding ENCODING\n"));
+ printf(_(" -n, --schema=PATTERN dump the specified schema(s) only\n"));
+ printf(_(" -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"));
+ printf(_(" -O, --no-owner skip restoration of object ownership in\n"
+ " plain-text format\n"));
+ printf(_(" -s, --schema-only dump only the schema, no data\n"));
+ printf(_(" -S, --superuser=NAME superuser user name to use in plain-text format\n"));
+ printf(_(" -t, --table=PATTERN dump the specified table(s) only\n"));
+ printf(_(" -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"));
+ printf(_(" -x, --no-privileges do not dump privileges (grant/revoke)\n"));
+ printf(_(" --binary-upgrade for use by upgrade utilities only\n"));
+ printf(_(" --column-inserts dump data as INSERT commands with column names\n"));
+ printf(_(" --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"));
+ printf(_(" --disable-triggers disable triggers during data-only restore\n"));
+ printf(_(" --enable-row-security enable row security (dump only content user has\n"
+ " access to)\n"));
+ printf(_(" --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"));
+ printf(_(" --extra-float-digits=NUM override default setting for extra_float_digits\n"));
+ printf(_(" --if-exists use IF EXISTS when dropping objects\n"));
+ printf(_(" --include-foreign-data=PATTERN\n"
+ " include data of foreign tables on foreign\n"
+ " servers matching PATTERN\n"));
+ printf(_(" --inserts dump data as INSERT commands, rather than COPY\n"));
+ printf(_(" --load-via-partition-root load partitions via the root table\n"));
+ printf(_(" --no-comments do not dump comments\n"));
+ printf(_(" --no-publications do not dump publications\n"));
+ printf(_(" --no-security-labels do not dump security label assignments\n"));
+ printf(_(" --no-subscriptions do not dump subscriptions\n"));
+ printf(_(" --no-table-access-method do not dump table access methods\n"));
+ printf(_(" --no-tablespaces do not dump tablespace assignments\n"));
+ printf(_(" --no-toast-compression do not dump TOAST compression methods\n"));
+ printf(_(" --no-unlogged-table-data do not dump unlogged table data\n"));
+ printf(_(" --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"));
+ printf(_(" --quote-all-identifiers quote all identifiers, even if not key words\n"));
+ printf(_(" --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"));
+ printf(_(" --section=SECTION dump named section (pre-data, data, or post-data)\n"));
+ printf(_(" --serializable-deferrable wait until the dump can run without anomalies\n"));
+ printf(_(" --snapshot=SNAPSHOT use given snapshot for the dump\n"));
+ printf(_(" --strict-names require table and/or schema include patterns to\n"
+ " match at least one entity each\n"));
+ printf(_(" --use-set-session-authorization\n"
+ " use SET SESSION AUTHORIZATION commands instead of\n"
+ " ALTER OWNER commands to set ownership\n"));
+
+ printf(_("\nConnection options:\n"));
+ printf(_(" -d, --dbname=DBNAME database to dump\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port number\n"));
+ printf(_(" -U, --username=NAME connect as specified database user\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt (should happen automatically)\n"));
+ printf(_(" --role=ROLENAME do SET ROLE before dump\n"));
+
+ printf(_("\nIf no database name is supplied, then the PGDATABASE environment\n"
+ "variable value is used.\n\n"));
+ printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+static void
+setup_connection(Archive *AH, const char *dumpencoding,
+ const char *dumpsnapshot, char *use_role)
+{
+ DumpOptions *dopt = AH->dopt;
+ PGconn *conn = GetConnection(AH);
+ const char *std_strings;
+
+ PQclear(ExecuteSqlQueryForSingleRow(AH, ALWAYS_SECURE_SEARCH_PATH_SQL));
+
+ /*
+ * Set the client encoding if requested.
+ */
+ if (dumpencoding)
+ {
+ if (PQsetClientEncoding(conn, dumpencoding) < 0)
+ pg_fatal("invalid client encoding \"%s\" specified",
+ dumpencoding);
+ }
+
+ /*
+ * Get the active encoding and the standard_conforming_strings setting, so
+ * we know how to escape strings.
+ */
+ AH->encoding = PQclientEncoding(conn);
+
+ std_strings = PQparameterStatus(conn, "standard_conforming_strings");
+ AH->std_strings = (std_strings && strcmp(std_strings, "on") == 0);
+
+ /*
+ * Set the role if requested. In a parallel dump worker, we'll be passed
+ * use_role == NULL, but AH->use_role is already set (if user specified it
+ * originally) and we should use that.
+ */
+ if (!use_role && AH->use_role)
+ use_role = AH->use_role;
+
+ /* Set the role if requested */
+ if (use_role)
+ {
+ PQExpBuffer query = createPQExpBuffer();
+
+ appendPQExpBuffer(query, "SET ROLE %s", fmtId(use_role));
+ ExecuteSqlStatement(AH, query->data);
+ destroyPQExpBuffer(query);
+
+ /* save it for possible later use by parallel workers */
+ if (!AH->use_role)
+ AH->use_role = pg_strdup(use_role);
+ }
+
+ /* Set the datestyle to ISO to ensure the dump's portability */
+ ExecuteSqlStatement(AH, "SET DATESTYLE = ISO");
+
+ /* Likewise, avoid using sql_standard intervalstyle */
+ ExecuteSqlStatement(AH, "SET INTERVALSTYLE = POSTGRES");
+
+ /*
+ * Use an explicitly specified extra_float_digits if it has been provided.
+ * Otherwise, set extra_float_digits so that we can dump float data
+ * exactly (given correctly implemented float I/O code, anyway).
+ */
+ if (have_extra_float_digits)
+ {
+ PQExpBuffer q = createPQExpBuffer();
+
+ appendPQExpBuffer(q, "SET extra_float_digits TO %d",
+ extra_float_digits);
+ ExecuteSqlStatement(AH, q->data);
+ destroyPQExpBuffer(q);
+ }
+ else
+ ExecuteSqlStatement(AH, "SET extra_float_digits TO 3");
+
+ /*
+ * Disable synchronized scanning, to prevent unpredictable changes in row
+ * ordering across a dump and reload.
+ */
+ ExecuteSqlStatement(AH, "SET synchronize_seqscans TO off");
+
+ /*
+ * Disable timeouts if supported.
+ */
+ ExecuteSqlStatement(AH, "SET statement_timeout = 0");
+ if (AH->remoteVersion >= 90300)
+ ExecuteSqlStatement(AH, "SET lock_timeout = 0");
+ if (AH->remoteVersion >= 90600)
+ ExecuteSqlStatement(AH, "SET idle_in_transaction_session_timeout = 0");
+
+ /*
+ * Quote all identifiers, if requested.
+ */
+ if (quote_all_identifiers)
+ ExecuteSqlStatement(AH, "SET quote_all_identifiers = true");
+
+ /*
+ * Adjust row-security mode, if supported.
+ */
+ if (AH->remoteVersion >= 90500)
+ {
+ if (dopt->enable_row_security)
+ ExecuteSqlStatement(AH, "SET row_security = on");
+ else
+ ExecuteSqlStatement(AH, "SET row_security = off");
+ }
+
+ /*
+ * Initialize prepared-query state to "nothing prepared". We do this here
+ * so that a parallel dump worker will have its own state.
+ */
+ AH->is_prepared = (bool *) pg_malloc0(NUM_PREP_QUERIES * sizeof(bool));
+
+ /*
+ * Start transaction-snapshot mode transaction to dump consistent data.
+ */
+ ExecuteSqlStatement(AH, "BEGIN");
+
+ /*
+ * To support the combination of serializable_deferrable with the jobs
+ * option we use REPEATABLE READ for the worker connections that are
+ * passed a snapshot. As long as the snapshot is acquired in a
+ * SERIALIZABLE, READ ONLY, DEFERRABLE transaction, its use within a
+ * REPEATABLE READ transaction provides the appropriate integrity
+ * guarantees. This is a kluge, but safe for back-patching.
+ */
+ if (dopt->serializable_deferrable && AH->sync_snapshot_id == NULL)
+ ExecuteSqlStatement(AH,
+ "SET TRANSACTION ISOLATION LEVEL "
+ "SERIALIZABLE, READ ONLY, DEFERRABLE");
+ else
+ ExecuteSqlStatement(AH,
+ "SET TRANSACTION ISOLATION LEVEL "
+ "REPEATABLE READ, READ ONLY");
+
+ /*
+ * If user specified a snapshot to use, select that. In a parallel dump
+ * worker, we'll be passed dumpsnapshot == NULL, but AH->sync_snapshot_id
+ * is already set (if the server can handle it) and we should use that.
+ */
+ if (dumpsnapshot)
+ AH->sync_snapshot_id = pg_strdup(dumpsnapshot);
+
+ if (AH->sync_snapshot_id)
+ {
+ PQExpBuffer query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query, "SET TRANSACTION SNAPSHOT ");
+ appendStringLiteralConn(query, AH->sync_snapshot_id, conn);
+ ExecuteSqlStatement(AH, query->data);
+ destroyPQExpBuffer(query);
+ }
+ else if (AH->numWorkers > 1)
+ {
+ if (AH->isStandby && AH->remoteVersion < 100000)
+ pg_fatal("parallel dumps from standby servers are not supported by this server version");
+ AH->sync_snapshot_id = get_synchronized_snapshot(AH);
+ }
+}
+
+/* Set up connection for a parallel worker process */
+static void
+setupDumpWorker(Archive *AH)
+{
+ /*
+ * We want to re-select all the same values the leader connection is
+ * using. We'll have inherited directly-usable values in
+ * AH->sync_snapshot_id and AH->use_role, but we need to translate the
+ * inherited encoding value back to a string to pass to setup_connection.
+ */
+ setup_connection(AH,
+ pg_encoding_to_char(AH->encoding),
+ NULL,
+ NULL);
+}
+
+static char *
+get_synchronized_snapshot(Archive *fout)
+{
+ char *query = "SELECT pg_catalog.pg_export_snapshot()";
+ char *result;
+ PGresult *res;
+
+ res = ExecuteSqlQueryForSingleRow(fout, query);
+ result = pg_strdup(PQgetvalue(res, 0, 0));
+ PQclear(res);
+
+ return result;
+}
+
+static ArchiveFormat
+parseArchiveFormat(const char *format, ArchiveMode *mode)
+{
+ ArchiveFormat archiveFormat;
+
+ *mode = archModeWrite;
+
+ if (pg_strcasecmp(format, "a") == 0 || pg_strcasecmp(format, "append") == 0)
+ {
+ /* This is used by pg_dumpall, and is not documented */
+ archiveFormat = archNull;
+ *mode = archModeAppend;
+ }
+ else if (pg_strcasecmp(format, "c") == 0)
+ archiveFormat = archCustom;
+ else if (pg_strcasecmp(format, "custom") == 0)
+ archiveFormat = archCustom;
+ else if (pg_strcasecmp(format, "d") == 0)
+ archiveFormat = archDirectory;
+ else if (pg_strcasecmp(format, "directory") == 0)
+ archiveFormat = archDirectory;
+ else if (pg_strcasecmp(format, "p") == 0)
+ archiveFormat = archNull;
+ else if (pg_strcasecmp(format, "plain") == 0)
+ archiveFormat = archNull;
+ else if (pg_strcasecmp(format, "t") == 0)
+ archiveFormat = archTar;
+ else if (pg_strcasecmp(format, "tar") == 0)
+ archiveFormat = archTar;
+ else
+ pg_fatal("invalid output format \"%s\" specified", format);
+ return archiveFormat;
+}
+
+/*
+ * Find the OIDs of all schemas matching the given list of patterns,
+ * and append them to the given OID list.
+ */
+static void
+expand_schema_name_patterns(Archive *fout,
+ SimpleStringList *patterns,
+ SimpleOidList *oids,
+ bool strict_names)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ SimpleStringListCell *cell;
+ int i;
+
+ if (patterns->head == NULL)
+ return; /* nothing to do */
+
+ query = createPQExpBuffer();
+
+ /*
+ * The loop below runs multiple SELECTs might sometimes result in
+ * duplicate entries in the OID list, but we don't care.
+ */
+
+ for (cell = patterns->head; cell; cell = cell->next)
+ {
+ PQExpBufferData dbbuf;
+ int dotcnt;
+
+ appendPQExpBufferStr(query,
+ "SELECT oid FROM pg_catalog.pg_namespace n\n");
+ initPQExpBuffer(&dbbuf);
+ processSQLNamePattern(GetConnection(fout), query, cell->val, false,
+ false, NULL, "n.nspname", NULL, NULL, &dbbuf,
+ &dotcnt);
+ if (dotcnt > 1)
+ pg_fatal("improper qualified name (too many dotted names): %s",
+ cell->val);
+ else if (dotcnt == 1)
+ prohibit_crossdb_refs(GetConnection(fout), dbbuf.data, cell->val);
+ termPQExpBuffer(&dbbuf);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+ if (strict_names && PQntuples(res) == 0)
+ pg_fatal("no matching schemas were found for pattern \"%s\"", cell->val);
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ simple_oid_list_append(oids, atooid(PQgetvalue(res, i, 0)));
+ }
+
+ PQclear(res);
+ resetPQExpBuffer(query);
+ }
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * Find the OIDs of all extensions matching the given list of patterns,
+ * and append them to the given OID list.
+ */
+static void
+expand_extension_name_patterns(Archive *fout,
+ SimpleStringList *patterns,
+ SimpleOidList *oids,
+ bool strict_names)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ SimpleStringListCell *cell;
+ int i;
+
+ if (patterns->head == NULL)
+ return; /* nothing to do */
+
+ query = createPQExpBuffer();
+
+ /*
+ * The loop below runs multiple SELECTs might sometimes result in
+ * duplicate entries in the OID list, but we don't care.
+ */
+ for (cell = patterns->head; cell; cell = cell->next)
+ {
+ int dotcnt;
+
+ appendPQExpBufferStr(query,
+ "SELECT oid FROM pg_catalog.pg_extension e\n");
+ processSQLNamePattern(GetConnection(fout), query, cell->val, false,
+ false, NULL, "e.extname", NULL, NULL, NULL,
+ &dotcnt);
+ if (dotcnt > 0)
+ pg_fatal("improper qualified name (too many dotted names): %s",
+ cell->val);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+ if (strict_names && PQntuples(res) == 0)
+ pg_fatal("no matching extensions were found for pattern \"%s\"", cell->val);
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ simple_oid_list_append(oids, atooid(PQgetvalue(res, i, 0)));
+ }
+
+ PQclear(res);
+ resetPQExpBuffer(query);
+ }
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * Find the OIDs of all foreign servers matching the given list of patterns,
+ * and append them to the given OID list.
+ */
+static void
+expand_foreign_server_name_patterns(Archive *fout,
+ SimpleStringList *patterns,
+ SimpleOidList *oids)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ SimpleStringListCell *cell;
+ int i;
+
+ if (patterns->head == NULL)
+ return; /* nothing to do */
+
+ query = createPQExpBuffer();
+
+ /*
+ * The loop below runs multiple SELECTs might sometimes result in
+ * duplicate entries in the OID list, but we don't care.
+ */
+
+ for (cell = patterns->head; cell; cell = cell->next)
+ {
+ int dotcnt;
+
+ appendPQExpBufferStr(query,
+ "SELECT oid FROM pg_catalog.pg_foreign_server s\n");
+ processSQLNamePattern(GetConnection(fout), query, cell->val, false,
+ false, NULL, "s.srvname", NULL, NULL, NULL,
+ &dotcnt);
+ if (dotcnt > 0)
+ pg_fatal("improper qualified name (too many dotted names): %s",
+ cell->val);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+ if (PQntuples(res) == 0)
+ pg_fatal("no matching foreign servers were found for pattern \"%s\"", cell->val);
+
+ for (i = 0; i < PQntuples(res); i++)
+ simple_oid_list_append(oids, atooid(PQgetvalue(res, i, 0)));
+
+ PQclear(res);
+ resetPQExpBuffer(query);
+ }
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * Find the OIDs of all tables matching the given list of patterns,
+ * and append them to the given OID list. See also expand_dbname_patterns()
+ * in pg_dumpall.c
+ */
+static void
+expand_table_name_patterns(Archive *fout,
+ SimpleStringList *patterns, SimpleOidList *oids,
+ bool strict_names)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ SimpleStringListCell *cell;
+ int i;
+
+ if (patterns->head == NULL)
+ return; /* nothing to do */
+
+ query = createPQExpBuffer();
+
+ /*
+ * this might sometimes result in duplicate entries in the OID list, but
+ * we don't care.
+ */
+
+ for (cell = patterns->head; cell; cell = cell->next)
+ {
+ PQExpBufferData dbbuf;
+ int dotcnt;
+
+ /*
+ * Query must remain ABSOLUTELY devoid of unqualified names. This
+ * would be unnecessary given a pg_table_is_visible() variant taking a
+ * search_path argument.
+ */
+ appendPQExpBuffer(query,
+ "SELECT c.oid"
+ "\nFROM pg_catalog.pg_class c"
+ "\n LEFT JOIN pg_catalog.pg_namespace n"
+ "\n ON n.oid OPERATOR(pg_catalog.=) c.relnamespace"
+ "\nWHERE c.relkind OPERATOR(pg_catalog.=) ANY"
+ "\n (array['%c', '%c', '%c', '%c', '%c', '%c'])\n",
+ RELKIND_RELATION, RELKIND_SEQUENCE, RELKIND_VIEW,
+ RELKIND_MATVIEW, RELKIND_FOREIGN_TABLE,
+ RELKIND_PARTITIONED_TABLE);
+ initPQExpBuffer(&dbbuf);
+ processSQLNamePattern(GetConnection(fout), query, cell->val, true,
+ false, "n.nspname", "c.relname", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)", &dbbuf,
+ &dotcnt);
+ if (dotcnt > 2)
+ pg_fatal("improper relation name (too many dotted names): %s",
+ cell->val);
+ else if (dotcnt == 2)
+ prohibit_crossdb_refs(GetConnection(fout), dbbuf.data, cell->val);
+ termPQExpBuffer(&dbbuf);
+
+ ExecuteSqlStatement(fout, "RESET search_path");
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+ PQclear(ExecuteSqlQueryForSingleRow(fout,
+ ALWAYS_SECURE_SEARCH_PATH_SQL));
+ if (strict_names && PQntuples(res) == 0)
+ pg_fatal("no matching tables were found for pattern \"%s\"", cell->val);
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ simple_oid_list_append(oids, atooid(PQgetvalue(res, i, 0)));
+ }
+
+ PQclear(res);
+ resetPQExpBuffer(query);
+ }
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * Verifies that the connected database name matches the given database name,
+ * and if not, dies with an error about the given pattern.
+ *
+ * The 'dbname' argument should be a literal name parsed from 'pattern'.
+ */
+static void
+prohibit_crossdb_refs(PGconn *conn, const char *dbname, const char *pattern)
+{
+ const char *db;
+
+ db = PQdb(conn);
+ if (db == NULL)
+ pg_fatal("You are currently not connected to a database.");
+
+ if (strcmp(db, dbname) != 0)
+ pg_fatal("cross-database references are not implemented: %s",
+ pattern);
+}
+
+/*
+ * checkExtensionMembership
+ * Determine whether object is an extension member, and if so,
+ * record an appropriate dependency and set the object's dump flag.
+ *
+ * It's important to call this for each object that could be an extension
+ * member. Generally, we integrate this with determining the object's
+ * to-be-dumped-ness, since extension membership overrides other rules for that.
+ *
+ * Returns true if object is an extension member, else false.
+ */
+static bool
+checkExtensionMembership(DumpableObject *dobj, Archive *fout)
+{
+ ExtensionInfo *ext = findOwningExtension(dobj->catId);
+
+ if (ext == NULL)
+ return false;
+
+ dobj->ext_member = true;
+
+ /* Record dependency so that getDependencies needn't deal with that */
+ addObjectDependency(dobj, ext->dobj.dumpId);
+
+ /*
+ * In 9.6 and above, mark the member object to have any non-initial ACL,
+ * policies, and security labels dumped.
+ *
+ * Note that any initial ACLs (see pg_init_privs) will be removed when we
+ * extract the information about the object. We don't provide support for
+ * initial policies and security labels and it seems unlikely for those to
+ * ever exist, but we may have to revisit this later.
+ *
+ * Prior to 9.6, we do not include any extension member components.
+ *
+ * In binary upgrades, we still dump all components of the members
+ * individually, since the idea is to exactly reproduce the database
+ * contents rather than replace the extension contents with something
+ * different.
+ */
+ if (fout->dopt->binary_upgrade)
+ dobj->dump = ext->dobj.dump;
+ else
+ {
+ if (fout->remoteVersion < 90600)
+ dobj->dump = DUMP_COMPONENT_NONE;
+ else
+ dobj->dump = ext->dobj.dump_contains & (DUMP_COMPONENT_ACL |
+ DUMP_COMPONENT_SECLABEL |
+ DUMP_COMPONENT_POLICY);
+ }
+
+ return true;
+}
+
+/*
+ * selectDumpableNamespace: policy-setting subroutine
+ * Mark a namespace as to be dumped or not
+ */
+static void
+selectDumpableNamespace(NamespaceInfo *nsinfo, Archive *fout)
+{
+ /*
+ * DUMP_COMPONENT_DEFINITION typically implies a CREATE SCHEMA statement
+ * and (for --clean) a DROP SCHEMA statement. (In the absence of
+ * DUMP_COMPONENT_DEFINITION, this value is irrelevant.)
+ */
+ nsinfo->create = true;
+
+ /*
+ * If specific tables are being dumped, do not dump any complete
+ * namespaces. If specific namespaces are being dumped, dump just those
+ * namespaces. Otherwise, dump all non-system namespaces.
+ */
+ if (table_include_oids.head != NULL)
+ nsinfo->dobj.dump_contains = nsinfo->dobj.dump = DUMP_COMPONENT_NONE;
+ else if (schema_include_oids.head != NULL)
+ nsinfo->dobj.dump_contains = nsinfo->dobj.dump =
+ simple_oid_list_member(&schema_include_oids,
+ nsinfo->dobj.catId.oid) ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+ else if (fout->remoteVersion >= 90600 &&
+ strcmp(nsinfo->dobj.name, "pg_catalog") == 0)
+ {
+ /*
+ * In 9.6 and above, we dump out any ACLs defined in pg_catalog, if
+ * they are interesting (and not the original ACLs which were set at
+ * initdb time, see pg_init_privs).
+ */
+ nsinfo->dobj.dump_contains = nsinfo->dobj.dump = DUMP_COMPONENT_ACL;
+ }
+ else if (strncmp(nsinfo->dobj.name, "pg_", 3) == 0 ||
+ strcmp(nsinfo->dobj.name, "information_schema") == 0)
+ {
+ /* Other system schemas don't get dumped */
+ nsinfo->dobj.dump_contains = nsinfo->dobj.dump = DUMP_COMPONENT_NONE;
+ }
+ else if (strcmp(nsinfo->dobj.name, "public") == 0)
+ {
+ /*
+ * The public schema is a strange beast that sits in a sort of
+ * no-mans-land between being a system object and a user object.
+ * CREATE SCHEMA would fail, so its DUMP_COMPONENT_DEFINITION is just
+ * a comment and an indication of ownership. If the owner is the
+ * default, omit that superfluous DUMP_COMPONENT_DEFINITION. Before
+ * v15, the default owner was BOOTSTRAP_SUPERUSERID.
+ */
+ nsinfo->create = false;
+ nsinfo->dobj.dump = DUMP_COMPONENT_ALL;
+ if (nsinfo->nspowner == ROLE_PG_DATABASE_OWNER)
+ nsinfo->dobj.dump &= ~DUMP_COMPONENT_DEFINITION;
+ nsinfo->dobj.dump_contains = DUMP_COMPONENT_ALL;
+
+ /*
+ * Also, make like it has a comment even if it doesn't; this is so
+ * that we'll emit a command to drop the comment, if appropriate.
+ * (Without this, we'd not call dumpCommentExtended for it.)
+ */
+ nsinfo->dobj.components |= DUMP_COMPONENT_COMMENT;
+ }
+ else
+ nsinfo->dobj.dump_contains = nsinfo->dobj.dump = DUMP_COMPONENT_ALL;
+
+ /*
+ * In any case, a namespace can be excluded by an exclusion switch
+ */
+ if (nsinfo->dobj.dump_contains &&
+ simple_oid_list_member(&schema_exclude_oids,
+ nsinfo->dobj.catId.oid))
+ nsinfo->dobj.dump_contains = nsinfo->dobj.dump = DUMP_COMPONENT_NONE;
+
+ /*
+ * If the schema belongs to an extension, allow extension membership to
+ * override the dump decision for the schema itself. However, this does
+ * not change dump_contains, so this won't change what we do with objects
+ * within the schema. (If they belong to the extension, they'll get
+ * suppressed by it, otherwise not.)
+ */
+ (void) checkExtensionMembership(&nsinfo->dobj, fout);
+}
+
+/*
+ * selectDumpableTable: policy-setting subroutine
+ * Mark a table as to be dumped or not
+ */
+static void
+selectDumpableTable(TableInfo *tbinfo, Archive *fout)
+{
+ if (checkExtensionMembership(&tbinfo->dobj, fout))
+ return; /* extension membership overrides all else */
+
+ /*
+ * If specific tables are being dumped, dump just those tables; else, dump
+ * according to the parent namespace's dump flag.
+ */
+ if (table_include_oids.head != NULL)
+ tbinfo->dobj.dump = simple_oid_list_member(&table_include_oids,
+ tbinfo->dobj.catId.oid) ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+ else
+ tbinfo->dobj.dump = tbinfo->dobj.namespace->dobj.dump_contains;
+
+ /*
+ * In any case, a table can be excluded by an exclusion switch
+ */
+ if (tbinfo->dobj.dump &&
+ simple_oid_list_member(&table_exclude_oids,
+ tbinfo->dobj.catId.oid))
+ tbinfo->dobj.dump = DUMP_COMPONENT_NONE;
+}
+
+/*
+ * selectDumpableType: policy-setting subroutine
+ * Mark a type as to be dumped or not
+ *
+ * If it's a table's rowtype or an autogenerated array type, we also apply a
+ * special type code to facilitate sorting into the desired order. (We don't
+ * want to consider those to be ordinary types because that would bring tables
+ * up into the datatype part of the dump order.) We still set the object's
+ * dump flag; that's not going to cause the dummy type to be dumped, but we
+ * need it so that casts involving such types will be dumped correctly -- see
+ * dumpCast. This means the flag should be set the same as for the underlying
+ * object (the table or base type).
+ */
+static void
+selectDumpableType(TypeInfo *tyinfo, Archive *fout)
+{
+ /* skip complex types, except for standalone composite types */
+ if (OidIsValid(tyinfo->typrelid) &&
+ tyinfo->typrelkind != RELKIND_COMPOSITE_TYPE)
+ {
+ TableInfo *tytable = findTableByOid(tyinfo->typrelid);
+
+ tyinfo->dobj.objType = DO_DUMMY_TYPE;
+ if (tytable != NULL)
+ tyinfo->dobj.dump = tytable->dobj.dump;
+ else
+ tyinfo->dobj.dump = DUMP_COMPONENT_NONE;
+ return;
+ }
+
+ /* skip auto-generated array types */
+ if (tyinfo->isArray || tyinfo->isMultirange)
+ {
+ tyinfo->dobj.objType = DO_DUMMY_TYPE;
+
+ /*
+ * Fall through to set the dump flag; we assume that the subsequent
+ * rules will do the same thing as they would for the array's base
+ * type. (We cannot reliably look up the base type here, since
+ * getTypes may not have processed it yet.)
+ */
+ }
+
+ if (checkExtensionMembership(&tyinfo->dobj, fout))
+ return; /* extension membership overrides all else */
+
+ /* Dump based on if the contents of the namespace are being dumped */
+ tyinfo->dobj.dump = tyinfo->dobj.namespace->dobj.dump_contains;
+}
+
+/*
+ * selectDumpableDefaultACL: policy-setting subroutine
+ * Mark a default ACL as to be dumped or not
+ *
+ * For per-schema default ACLs, dump if the schema is to be dumped.
+ * Otherwise dump if we are dumping "everything". Note that dataOnly
+ * and aclsSkip are checked separately.
+ */
+static void
+selectDumpableDefaultACL(DefaultACLInfo *dinfo, DumpOptions *dopt)
+{
+ /* Default ACLs can't be extension members */
+
+ if (dinfo->dobj.namespace)
+ /* default ACLs are considered part of the namespace */
+ dinfo->dobj.dump = dinfo->dobj.namespace->dobj.dump_contains;
+ else
+ dinfo->dobj.dump = dopt->include_everything ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+}
+
+/*
+ * selectDumpableCast: policy-setting subroutine
+ * Mark a cast as to be dumped or not
+ *
+ * Casts do not belong to any particular namespace (since they haven't got
+ * names), nor do they have identifiable owners. To distinguish user-defined
+ * casts from built-in ones, we must resort to checking whether the cast's
+ * OID is in the range reserved for initdb.
+ */
+static void
+selectDumpableCast(CastInfo *cast, Archive *fout)
+{
+ if (checkExtensionMembership(&cast->dobj, fout))
+ return; /* extension membership overrides all else */
+
+ /*
+ * This would be DUMP_COMPONENT_ACL for from-initdb casts, but they do not
+ * support ACLs currently.
+ */
+ if (cast->dobj.catId.oid <= (Oid) g_last_builtin_oid)
+ cast->dobj.dump = DUMP_COMPONENT_NONE;
+ else
+ cast->dobj.dump = fout->dopt->include_everything ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+}
+
+/*
+ * selectDumpableProcLang: policy-setting subroutine
+ * Mark a procedural language as to be dumped or not
+ *
+ * Procedural languages do not belong to any particular namespace. To
+ * identify built-in languages, we must resort to checking whether the
+ * language's OID is in the range reserved for initdb.
+ */
+static void
+selectDumpableProcLang(ProcLangInfo *plang, Archive *fout)
+{
+ if (checkExtensionMembership(&plang->dobj, fout))
+ return; /* extension membership overrides all else */
+
+ /*
+ * Only include procedural languages when we are dumping everything.
+ *
+ * For from-initdb procedural languages, only include ACLs, as we do for
+ * the pg_catalog namespace. We need this because procedural languages do
+ * not live in any namespace.
+ */
+ if (!fout->dopt->include_everything)
+ plang->dobj.dump = DUMP_COMPONENT_NONE;
+ else
+ {
+ if (plang->dobj.catId.oid <= (Oid) g_last_builtin_oid)
+ plang->dobj.dump = fout->remoteVersion < 90600 ?
+ DUMP_COMPONENT_NONE : DUMP_COMPONENT_ACL;
+ else
+ plang->dobj.dump = DUMP_COMPONENT_ALL;
+ }
+}
+
+/*
+ * selectDumpableAccessMethod: policy-setting subroutine
+ * Mark an access method as to be dumped or not
+ *
+ * Access methods do not belong to any particular namespace. To identify
+ * built-in access methods, we must resort to checking whether the
+ * method's OID is in the range reserved for initdb.
+ */
+static void
+selectDumpableAccessMethod(AccessMethodInfo *method, Archive *fout)
+{
+ if (checkExtensionMembership(&method->dobj, fout))
+ return; /* extension membership overrides all else */
+
+ /*
+ * This would be DUMP_COMPONENT_ACL for from-initdb access methods, but
+ * they do not support ACLs currently.
+ */
+ if (method->dobj.catId.oid <= (Oid) g_last_builtin_oid)
+ method->dobj.dump = DUMP_COMPONENT_NONE;
+ else
+ method->dobj.dump = fout->dopt->include_everything ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+}
+
+/*
+ * selectDumpableExtension: policy-setting subroutine
+ * Mark an extension as to be dumped or not
+ *
+ * Built-in extensions should be skipped except for checking ACLs, since we
+ * assume those will already be installed in the target database. We identify
+ * such extensions by their having OIDs in the range reserved for initdb.
+ * We dump all user-added extensions by default. No extensions are dumped
+ * if include_everything is false (i.e., a --schema or --table switch was
+ * given), except if --extension specifies a list of extensions to dump.
+ */
+static void
+selectDumpableExtension(ExtensionInfo *extinfo, DumpOptions *dopt)
+{
+ /*
+ * Use DUMP_COMPONENT_ACL for built-in extensions, to allow users to
+ * change permissions on their member objects, if they wish to, and have
+ * those changes preserved.
+ */
+ if (extinfo->dobj.catId.oid <= (Oid) g_last_builtin_oid)
+ extinfo->dobj.dump = extinfo->dobj.dump_contains = DUMP_COMPONENT_ACL;
+ else
+ {
+ /* check if there is a list of extensions to dump */
+ if (extension_include_oids.head != NULL)
+ extinfo->dobj.dump = extinfo->dobj.dump_contains =
+ simple_oid_list_member(&extension_include_oids,
+ extinfo->dobj.catId.oid) ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+ else
+ extinfo->dobj.dump = extinfo->dobj.dump_contains =
+ dopt->include_everything ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+ }
+}
+
+/*
+ * selectDumpablePublicationObject: policy-setting subroutine
+ * Mark a publication object as to be dumped or not
+ *
+ * A publication can have schemas and tables which have schemas, but those are
+ * ignored in decision making, because publications are only dumped when we are
+ * dumping everything.
+ */
+static void
+selectDumpablePublicationObject(DumpableObject *dobj, Archive *fout)
+{
+ if (checkExtensionMembership(dobj, fout))
+ return; /* extension membership overrides all else */
+
+ dobj->dump = fout->dopt->include_everything ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+}
+
+/*
+ * selectDumpableObject: policy-setting subroutine
+ * Mark a generic dumpable object as to be dumped or not
+ *
+ * Use this only for object types without a special-case routine above.
+ */
+static void
+selectDumpableObject(DumpableObject *dobj, Archive *fout)
+{
+ if (checkExtensionMembership(dobj, fout))
+ return; /* extension membership overrides all else */
+
+ /*
+ * Default policy is to dump if parent namespace is dumpable, or for
+ * non-namespace-associated items, dump if we're dumping "everything".
+ */
+ if (dobj->namespace)
+ dobj->dump = dobj->namespace->dobj.dump_contains;
+ else
+ dobj->dump = fout->dopt->include_everything ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+}
+
+/*
+ * Dump a table's contents for loading using the COPY command
+ * - this routine is called by the Archiver when it wants the table
+ * to be dumped.
+ */
+static int
+dumpTableData_copy(Archive *fout, const void *dcontext)
+{
+ TableDataInfo *tdinfo = (TableDataInfo *) dcontext;
+ TableInfo *tbinfo = tdinfo->tdtable;
+ const char *classname = tbinfo->dobj.name;
+ PQExpBuffer q = createPQExpBuffer();
+
+ /*
+ * Note: can't use getThreadLocalPQExpBuffer() here, we're calling fmtId
+ * which uses it already.
+ */
+ PQExpBuffer clistBuf = createPQExpBuffer();
+ PGconn *conn = GetConnection(fout);
+ PGresult *res;
+ int ret;
+ char *copybuf;
+ const char *column_list;
+
+ pg_log_info("dumping contents of table \"%s.%s\"",
+ tbinfo->dobj.namespace->dobj.name, classname);
+
+ /*
+ * Specify the column list explicitly so that we have no possibility of
+ * retrieving data in the wrong column order. (The default column
+ * ordering of COPY will not be what we want in certain corner cases
+ * involving ADD COLUMN and inheritance.)
+ */
+ column_list = fmtCopyColumnList(tbinfo, clistBuf);
+
+ /*
+ * Use COPY (SELECT ...) TO when dumping a foreign table's data, and when
+ * a filter condition was specified. For other cases a simple COPY
+ * suffices.
+ */
+ if (tdinfo->filtercond || tbinfo->relkind == RELKIND_FOREIGN_TABLE)
+ {
+ appendPQExpBufferStr(q, "COPY (SELECT ");
+ /* klugery to get rid of parens in column list */
+ if (strlen(column_list) > 2)
+ {
+ appendPQExpBufferStr(q, column_list + 1);
+ q->data[q->len - 1] = ' ';
+ }
+ else
+ appendPQExpBufferStr(q, "* ");
+
+ appendPQExpBuffer(q, "FROM %s %s) TO stdout;",
+ fmtQualifiedDumpable(tbinfo),
+ tdinfo->filtercond ? tdinfo->filtercond : "");
+ }
+ else
+ {
+ appendPQExpBuffer(q, "COPY %s %s TO stdout;",
+ fmtQualifiedDumpable(tbinfo),
+ column_list);
+ }
+ res = ExecuteSqlQuery(fout, q->data, PGRES_COPY_OUT);
+ PQclear(res);
+ destroyPQExpBuffer(clistBuf);
+
+ for (;;)
+ {
+ ret = PQgetCopyData(conn, &copybuf, 0);
+
+ if (ret < 0)
+ break; /* done or error */
+
+ if (copybuf)
+ {
+ WriteData(fout, copybuf, ret);
+ PQfreemem(copybuf);
+ }
+
+ /* ----------
+ * THROTTLE:
+ *
+ * There was considerable discussion in late July, 2000 regarding
+ * slowing down pg_dump when backing up large tables. Users with both
+ * slow & fast (multi-processor) machines experienced performance
+ * degradation when doing a backup.
+ *
+ * Initial attempts based on sleeping for a number of ms for each ms
+ * of work were deemed too complex, then a simple 'sleep in each loop'
+ * implementation was suggested. The latter failed because the loop
+ * was too tight. Finally, the following was implemented:
+ *
+ * If throttle is non-zero, then
+ * See how long since the last sleep.
+ * Work out how long to sleep (based on ratio).
+ * If sleep is more than 100ms, then
+ * sleep
+ * reset timer
+ * EndIf
+ * EndIf
+ *
+ * where the throttle value was the number of ms to sleep per ms of
+ * work. The calculation was done in each loop.
+ *
+ * Most of the hard work is done in the backend, and this solution
+ * still did not work particularly well: on slow machines, the ratio
+ * was 50:1, and on medium paced machines, 1:1, and on fast
+ * multi-processor machines, it had little or no effect, for reasons
+ * that were unclear.
+ *
+ * Further discussion ensued, and the proposal was dropped.
+ *
+ * For those people who want this feature, it can be implemented using
+ * gettimeofday in each loop, calculating the time since last sleep,
+ * multiplying that by the sleep ratio, then if the result is more
+ * than a preset 'minimum sleep time' (say 100ms), call the 'select'
+ * function to sleep for a subsecond period ie.
+ *
+ * select(0, NULL, NULL, NULL, &tvi);
+ *
+ * This will return after the interval specified in the structure tvi.
+ * Finally, call gettimeofday again to save the 'last sleep time'.
+ * ----------
+ */
+ }
+ archprintf(fout, "\\.\n\n\n");
+
+ if (ret == -2)
+ {
+ /* copy data transfer failed */
+ pg_log_error("Dumping the contents of table \"%s\" failed: PQgetCopyData() failed.", classname);
+ pg_log_error_detail("Error message from server: %s", PQerrorMessage(conn));
+ pg_log_error_detail("Command was: %s", q->data);
+ exit_nicely(1);
+ }
+
+ /* Check command status and return to normal libpq state */
+ res = PQgetResult(conn);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("Dumping the contents of table \"%s\" failed: PQgetResult() failed.", classname);
+ pg_log_error_detail("Error message from server: %s", PQerrorMessage(conn));
+ pg_log_error_detail("Command was: %s", q->data);
+ exit_nicely(1);
+ }
+ PQclear(res);
+
+ /* Do this to ensure we've pumped libpq back to idle state */
+ if (PQgetResult(conn) != NULL)
+ pg_log_warning("unexpected extra results during COPY of table \"%s\"",
+ classname);
+
+ destroyPQExpBuffer(q);
+ return 1;
+}
+
+/*
+ * Dump table data using INSERT commands.
+ *
+ * Caution: when we restore from an archive file direct to database, the
+ * INSERT commands emitted by this function have to be parsed by
+ * pg_backup_db.c's ExecuteSimpleCommands(), which will not handle comments,
+ * E'' strings, or dollar-quoted strings. So don't emit anything like that.
+ */
+static int
+dumpTableData_insert(Archive *fout, const void *dcontext)
+{
+ TableDataInfo *tdinfo = (TableDataInfo *) dcontext;
+ TableInfo *tbinfo = tdinfo->tdtable;
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer insertStmt = NULL;
+ char *attgenerated;
+ PGresult *res;
+ int nfields,
+ i;
+ int rows_per_statement = dopt->dump_inserts;
+ int rows_this_statement = 0;
+
+ /*
+ * If we're going to emit INSERTs with column names, the most efficient
+ * way to deal with generated columns is to exclude them entirely. For
+ * INSERTs without column names, we have to emit DEFAULT rather than the
+ * actual column value --- but we can save a few cycles by fetching nulls
+ * rather than the uninteresting-to-us value.
+ */
+ attgenerated = (char *) pg_malloc(tbinfo->numatts * sizeof(char));
+ appendPQExpBufferStr(q, "DECLARE _pg_dump_cursor CURSOR FOR SELECT ");
+ nfields = 0;
+ for (i = 0; i < tbinfo->numatts; i++)
+ {
+ if (tbinfo->attisdropped[i])
+ continue;
+ if (tbinfo->attgenerated[i] && dopt->column_inserts)
+ continue;
+ if (nfields > 0)
+ appendPQExpBufferStr(q, ", ");
+ if (tbinfo->attgenerated[i])
+ appendPQExpBufferStr(q, "NULL");
+ else
+ appendPQExpBufferStr(q, fmtId(tbinfo->attnames[i]));
+ attgenerated[nfields] = tbinfo->attgenerated[i];
+ nfields++;
+ }
+ /* Servers before 9.4 will complain about zero-column SELECT */
+ if (nfields == 0)
+ appendPQExpBufferStr(q, "NULL");
+ appendPQExpBuffer(q, " FROM ONLY %s",
+ fmtQualifiedDumpable(tbinfo));
+ if (tdinfo->filtercond)
+ appendPQExpBuffer(q, " %s", tdinfo->filtercond);
+
+ ExecuteSqlStatement(fout, q->data);
+
+ while (1)
+ {
+ res = ExecuteSqlQuery(fout, "FETCH 100 FROM _pg_dump_cursor",
+ PGRES_TUPLES_OK);
+
+ /* cross-check field count, allowing for dummy NULL if any */
+ if (nfields != PQnfields(res) &&
+ !(nfields == 0 && PQnfields(res) == 1))
+ pg_fatal("wrong number of fields retrieved from table \"%s\"",
+ tbinfo->dobj.name);
+
+ /*
+ * First time through, we build as much of the INSERT statement as
+ * possible in "insertStmt", which we can then just print for each
+ * statement. If the table happens to have zero dumpable columns then
+ * this will be a complete statement, otherwise it will end in
+ * "VALUES" and be ready to have the row's column values printed.
+ */
+ if (insertStmt == NULL)
+ {
+ TableInfo *targettab;
+
+ insertStmt = createPQExpBuffer();
+
+ /*
+ * When load-via-partition-root is set or forced, get the root
+ * table name for the partition table, so that we can reload data
+ * through the root table.
+ */
+ if (tbinfo->ispartition &&
+ (dopt->load_via_partition_root ||
+ forcePartitionRootLoad(tbinfo)))
+ targettab = getRootTableInfo(tbinfo);
+ else
+ targettab = tbinfo;
+
+ appendPQExpBuffer(insertStmt, "INSERT INTO %s ",
+ fmtQualifiedDumpable(targettab));
+
+ /* corner case for zero-column table */
+ if (nfields == 0)
+ {
+ appendPQExpBufferStr(insertStmt, "DEFAULT VALUES;\n");
+ }
+ else
+ {
+ /* append the list of column names if required */
+ if (dopt->column_inserts)
+ {
+ appendPQExpBufferChar(insertStmt, '(');
+ for (int field = 0; field < nfields; field++)
+ {
+ if (field > 0)
+ appendPQExpBufferStr(insertStmt, ", ");
+ appendPQExpBufferStr(insertStmt,
+ fmtId(PQfname(res, field)));
+ }
+ appendPQExpBufferStr(insertStmt, ") ");
+ }
+
+ if (tbinfo->needs_override)
+ appendPQExpBufferStr(insertStmt, "OVERRIDING SYSTEM VALUE ");
+
+ appendPQExpBufferStr(insertStmt, "VALUES");
+ }
+ }
+
+ for (int tuple = 0; tuple < PQntuples(res); tuple++)
+ {
+ /* Write the INSERT if not in the middle of a multi-row INSERT. */
+ if (rows_this_statement == 0)
+ archputs(insertStmt->data, fout);
+
+ /*
+ * If it is zero-column table then we've already written the
+ * complete statement, which will mean we've disobeyed
+ * --rows-per-insert when it's set greater than 1. We do support
+ * a way to make this multi-row with: SELECT UNION ALL SELECT
+ * UNION ALL ... but that's non-standard so we should avoid it
+ * given that using INSERTs is mostly only ever needed for
+ * cross-database exports.
+ */
+ if (nfields == 0)
+ continue;
+
+ /* Emit a row heading */
+ if (rows_per_statement == 1)
+ archputs(" (", fout);
+ else if (rows_this_statement > 0)
+ archputs(",\n\t(", fout);
+ else
+ archputs("\n\t(", fout);
+
+ for (int field = 0; field < nfields; field++)
+ {
+ if (field > 0)
+ archputs(", ", fout);
+ if (attgenerated[field])
+ {
+ archputs("DEFAULT", fout);
+ continue;
+ }
+ if (PQgetisnull(res, tuple, field))
+ {
+ archputs("NULL", fout);
+ continue;
+ }
+
+ /* XXX This code is partially duplicated in ruleutils.c */
+ switch (PQftype(res, field))
+ {
+ case INT2OID:
+ case INT4OID:
+ case INT8OID:
+ case OIDOID:
+ case FLOAT4OID:
+ case FLOAT8OID:
+ case NUMERICOID:
+ {
+ /*
+ * These types are printed without quotes unless
+ * they contain values that aren't accepted by the
+ * scanner unquoted (e.g., 'NaN'). Note that
+ * strtod() and friends might accept NaN, so we
+ * can't use that to test.
+ *
+ * In reality we only need to defend against
+ * infinity and NaN, so we need not get too crazy
+ * about pattern matching here.
+ */
+ const char *s = PQgetvalue(res, tuple, field);
+
+ if (strspn(s, "0123456789 +-eE.") == strlen(s))
+ archputs(s, fout);
+ else
+ archprintf(fout, "'%s'", s);
+ }
+ break;
+
+ case BITOID:
+ case VARBITOID:
+ archprintf(fout, "B'%s'",
+ PQgetvalue(res, tuple, field));
+ break;
+
+ case BOOLOID:
+ if (strcmp(PQgetvalue(res, tuple, field), "t") == 0)
+ archputs("true", fout);
+ else
+ archputs("false", fout);
+ break;
+
+ default:
+ /* All other types are printed as string literals. */
+ resetPQExpBuffer(q);
+ appendStringLiteralAH(q,
+ PQgetvalue(res, tuple, field),
+ fout);
+ archputs(q->data, fout);
+ break;
+ }
+ }
+
+ /* Terminate the row ... */
+ archputs(")", fout);
+
+ /* ... and the statement, if the target no. of rows is reached */
+ if (++rows_this_statement >= rows_per_statement)
+ {
+ if (dopt->do_nothing)
+ archputs(" ON CONFLICT DO NOTHING;\n", fout);
+ else
+ archputs(";\n", fout);
+ /* Reset the row counter */
+ rows_this_statement = 0;
+ }
+ }
+
+ if (PQntuples(res) <= 0)
+ {
+ PQclear(res);
+ break;
+ }
+ PQclear(res);
+ }
+
+ /* Terminate any statements that didn't make the row count. */
+ if (rows_this_statement > 0)
+ {
+ if (dopt->do_nothing)
+ archputs(" ON CONFLICT DO NOTHING;\n", fout);
+ else
+ archputs(";\n", fout);
+ }
+
+ archputs("\n\n", fout);
+
+ ExecuteSqlStatement(fout, "CLOSE _pg_dump_cursor");
+
+ destroyPQExpBuffer(q);
+ if (insertStmt != NULL)
+ destroyPQExpBuffer(insertStmt);
+ free(attgenerated);
+
+ return 1;
+}
+
+/*
+ * getRootTableInfo:
+ * get the root TableInfo for the given partition table.
+ */
+static TableInfo *
+getRootTableInfo(const TableInfo *tbinfo)
+{
+ TableInfo *parentTbinfo;
+
+ Assert(tbinfo->ispartition);
+ Assert(tbinfo->numParents == 1);
+
+ parentTbinfo = tbinfo->parents[0];
+ while (parentTbinfo->ispartition)
+ {
+ Assert(parentTbinfo->numParents == 1);
+ parentTbinfo = parentTbinfo->parents[0];
+ }
+
+ return parentTbinfo;
+}
+
+/*
+ * forcePartitionRootLoad
+ * Check if we must force load_via_partition_root for this partition.
+ *
+ * This is required if any level of ancestral partitioned table has an
+ * unsafe partitioning scheme.
+ */
+static bool
+forcePartitionRootLoad(const TableInfo *tbinfo)
+{
+ TableInfo *parentTbinfo;
+
+ Assert(tbinfo->ispartition);
+ Assert(tbinfo->numParents == 1);
+
+ parentTbinfo = tbinfo->parents[0];
+ if (parentTbinfo->unsafe_partitions)
+ return true;
+ while (parentTbinfo->ispartition)
+ {
+ Assert(parentTbinfo->numParents == 1);
+ parentTbinfo = parentTbinfo->parents[0];
+ if (parentTbinfo->unsafe_partitions)
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * dumpTableData -
+ * dump the contents of a single table
+ *
+ * Actually, this just makes an ArchiveEntry for the table contents.
+ */
+static void
+dumpTableData(Archive *fout, const TableDataInfo *tdinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ TableInfo *tbinfo = tdinfo->tdtable;
+ PQExpBuffer copyBuf = createPQExpBuffer();
+ PQExpBuffer clistBuf = createPQExpBuffer();
+ DataDumperPtr dumpFn;
+ char *tdDefn = NULL;
+ char *copyStmt;
+ const char *copyFrom;
+
+ /* We had better have loaded per-column details about this table */
+ Assert(tbinfo->interesting);
+
+ /*
+ * When load-via-partition-root is set or forced, get the root table name
+ * for the partition table, so that we can reload data through the root
+ * table. Then construct a comment to be inserted into the TOC entry's
+ * defn field, so that such cases can be identified reliably.
+ */
+ if (tbinfo->ispartition &&
+ (dopt->load_via_partition_root ||
+ forcePartitionRootLoad(tbinfo)))
+ {
+ TableInfo *parentTbinfo;
+
+ parentTbinfo = getRootTableInfo(tbinfo);
+ copyFrom = fmtQualifiedDumpable(parentTbinfo);
+ printfPQExpBuffer(copyBuf, "-- load via partition root %s",
+ copyFrom);
+ tdDefn = pg_strdup(copyBuf->data);
+ }
+ else
+ copyFrom = fmtQualifiedDumpable(tbinfo);
+
+ if (dopt->dump_inserts == 0)
+ {
+ /* Dump/restore using COPY */
+ dumpFn = dumpTableData_copy;
+ /* must use 2 steps here 'cause fmtId is nonreentrant */
+ printfPQExpBuffer(copyBuf, "COPY %s ",
+ copyFrom);
+ appendPQExpBuffer(copyBuf, "%s FROM stdin;\n",
+ fmtCopyColumnList(tbinfo, clistBuf));
+ copyStmt = copyBuf->data;
+ }
+ else
+ {
+ /* Restore using INSERT */
+ dumpFn = dumpTableData_insert;
+ copyStmt = NULL;
+ }
+
+ /*
+ * Note: although the TableDataInfo is a full DumpableObject, we treat its
+ * dependency on its table as "special" and pass it to ArchiveEntry now.
+ * See comments for BuildArchiveDependencies.
+ */
+ if (tdinfo->dobj.dump & DUMP_COMPONENT_DATA)
+ {
+ TocEntry *te;
+
+ te = ArchiveEntry(fout, tdinfo->dobj.catId, tdinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tbinfo->dobj.name,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "TABLE DATA",
+ .section = SECTION_DATA,
+ .createStmt = tdDefn,
+ .copyStmt = copyStmt,
+ .deps = &(tbinfo->dobj.dumpId),
+ .nDeps = 1,
+ .dumpFn = dumpFn,
+ .dumpArg = tdinfo));
+
+ /*
+ * Set the TocEntry's dataLength in case we are doing a parallel dump
+ * and want to order dump jobs by table size. We choose to measure
+ * dataLength in table pages (including TOAST pages) during dump, so
+ * no scaling is needed.
+ *
+ * However, relpages is declared as "integer" in pg_class, and hence
+ * also in TableInfo, but it's really BlockNumber a/k/a unsigned int.
+ * Cast so that we get the right interpretation of table sizes
+ * exceeding INT_MAX pages.
+ */
+ te->dataLength = (BlockNumber) tbinfo->relpages;
+ te->dataLength += (BlockNumber) tbinfo->toastpages;
+
+ /*
+ * If pgoff_t is only 32 bits wide, the above refinement is useless,
+ * and instead we'd better worry about integer overflow. Clamp to
+ * INT_MAX if the correct result exceeds that.
+ */
+ if (sizeof(te->dataLength) == 4 &&
+ (tbinfo->relpages < 0 || tbinfo->toastpages < 0 ||
+ te->dataLength < 0))
+ te->dataLength = INT_MAX;
+ }
+
+ destroyPQExpBuffer(copyBuf);
+ destroyPQExpBuffer(clistBuf);
+}
+
+/*
+ * refreshMatViewData -
+ * load or refresh the contents of a single materialized view
+ *
+ * Actually, this just makes an ArchiveEntry for the REFRESH MATERIALIZED VIEW
+ * statement.
+ */
+static void
+refreshMatViewData(Archive *fout, const TableDataInfo *tdinfo)
+{
+ TableInfo *tbinfo = tdinfo->tdtable;
+ PQExpBuffer q;
+
+ /* If the materialized view is not flagged as populated, skip this. */
+ if (!tbinfo->relispopulated)
+ return;
+
+ q = createPQExpBuffer();
+
+ appendPQExpBuffer(q, "REFRESH MATERIALIZED VIEW %s;\n",
+ fmtQualifiedDumpable(tbinfo));
+
+ if (tdinfo->dobj.dump & DUMP_COMPONENT_DATA)
+ ArchiveEntry(fout,
+ tdinfo->dobj.catId, /* catalog ID */
+ tdinfo->dobj.dumpId, /* dump ID */
+ ARCHIVE_OPTS(.tag = tbinfo->dobj.name,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "MATERIALIZED VIEW DATA",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data,
+ .deps = tdinfo->dobj.dependencies,
+ .nDeps = tdinfo->dobj.nDeps));
+
+ destroyPQExpBuffer(q);
+}
+
+/*
+ * getTableData -
+ * set up dumpable objects representing the contents of tables
+ */
+static void
+getTableData(DumpOptions *dopt, TableInfo *tblinfo, int numTables, char relkind)
+{
+ int i;
+
+ for (i = 0; i < numTables; i++)
+ {
+ if (tblinfo[i].dobj.dump & DUMP_COMPONENT_DATA &&
+ (!relkind || tblinfo[i].relkind == relkind))
+ makeTableDataInfo(dopt, &(tblinfo[i]));
+ }
+}
+
+/*
+ * Make a dumpable object for the data of this specific table
+ *
+ * Note: we make a TableDataInfo if and only if we are going to dump the
+ * table data; the "dump" field in such objects isn't very interesting.
+ */
+static void
+makeTableDataInfo(DumpOptions *dopt, TableInfo *tbinfo)
+{
+ TableDataInfo *tdinfo;
+
+ /*
+ * Nothing to do if we already decided to dump the table. This will
+ * happen for "config" tables.
+ */
+ if (tbinfo->dataObj != NULL)
+ return;
+
+ /* Skip VIEWs (no data to dump) */
+ if (tbinfo->relkind == RELKIND_VIEW)
+ return;
+ /* Skip FOREIGN TABLEs (no data to dump) unless requested explicitly */
+ if (tbinfo->relkind == RELKIND_FOREIGN_TABLE &&
+ (foreign_servers_include_oids.head == NULL ||
+ !simple_oid_list_member(&foreign_servers_include_oids,
+ tbinfo->foreign_server)))
+ return;
+ /* Skip partitioned tables (data in partitions) */
+ if (tbinfo->relkind == RELKIND_PARTITIONED_TABLE)
+ return;
+
+ /* Don't dump data in unlogged tables, if so requested */
+ if (tbinfo->relpersistence == RELPERSISTENCE_UNLOGGED &&
+ dopt->no_unlogged_table_data)
+ return;
+
+ /* Check that the data is not explicitly excluded */
+ if (simple_oid_list_member(&tabledata_exclude_oids,
+ tbinfo->dobj.catId.oid))
+ return;
+
+ /* OK, let's dump it */
+ tdinfo = (TableDataInfo *) pg_malloc(sizeof(TableDataInfo));
+
+ if (tbinfo->relkind == RELKIND_MATVIEW)
+ tdinfo->dobj.objType = DO_REFRESH_MATVIEW;
+ else if (tbinfo->relkind == RELKIND_SEQUENCE)
+ tdinfo->dobj.objType = DO_SEQUENCE_SET;
+ else
+ tdinfo->dobj.objType = DO_TABLE_DATA;
+
+ /*
+ * Note: use tableoid 0 so that this object won't be mistaken for
+ * something that pg_depend entries apply to.
+ */
+ tdinfo->dobj.catId.tableoid = 0;
+ tdinfo->dobj.catId.oid = tbinfo->dobj.catId.oid;
+ AssignDumpId(&tdinfo->dobj);
+ tdinfo->dobj.name = tbinfo->dobj.name;
+ tdinfo->dobj.namespace = tbinfo->dobj.namespace;
+ tdinfo->tdtable = tbinfo;
+ tdinfo->filtercond = NULL; /* might get set later */
+ addObjectDependency(&tdinfo->dobj, tbinfo->dobj.dumpId);
+
+ /* A TableDataInfo contains data, of course */
+ tdinfo->dobj.components |= DUMP_COMPONENT_DATA;
+
+ tbinfo->dataObj = tdinfo;
+
+ /* Make sure that we'll collect per-column info for this table. */
+ tbinfo->interesting = true;
+}
+
+/*
+ * The refresh for a materialized view must be dependent on the refresh for
+ * any materialized view that this one is dependent on.
+ *
+ * This must be called after all the objects are created, but before they are
+ * sorted.
+ */
+static void
+buildMatViewRefreshDependencies(Archive *fout)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ int ntups,
+ i;
+ int i_classid,
+ i_objid,
+ i_refobjid;
+
+ /* No Mat Views before 9.3. */
+ if (fout->remoteVersion < 90300)
+ return;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query, "WITH RECURSIVE w AS "
+ "( "
+ "SELECT d1.objid, d2.refobjid, c2.relkind AS refrelkind "
+ "FROM pg_depend d1 "
+ "JOIN pg_class c1 ON c1.oid = d1.objid "
+ "AND c1.relkind = " CppAsString2(RELKIND_MATVIEW)
+ " JOIN pg_rewrite r1 ON r1.ev_class = d1.objid "
+ "JOIN pg_depend d2 ON d2.classid = 'pg_rewrite'::regclass "
+ "AND d2.objid = r1.oid "
+ "AND d2.refobjid <> d1.objid "
+ "JOIN pg_class c2 ON c2.oid = d2.refobjid "
+ "AND c2.relkind IN (" CppAsString2(RELKIND_MATVIEW) ","
+ CppAsString2(RELKIND_VIEW) ") "
+ "WHERE d1.classid = 'pg_class'::regclass "
+ "UNION "
+ "SELECT w.objid, d3.refobjid, c3.relkind "
+ "FROM w "
+ "JOIN pg_rewrite r3 ON r3.ev_class = w.refobjid "
+ "JOIN pg_depend d3 ON d3.classid = 'pg_rewrite'::regclass "
+ "AND d3.objid = r3.oid "
+ "AND d3.refobjid <> w.refobjid "
+ "JOIN pg_class c3 ON c3.oid = d3.refobjid "
+ "AND c3.relkind IN (" CppAsString2(RELKIND_MATVIEW) ","
+ CppAsString2(RELKIND_VIEW) ") "
+ ") "
+ "SELECT 'pg_class'::regclass::oid AS classid, objid, refobjid "
+ "FROM w "
+ "WHERE refrelkind = " CppAsString2(RELKIND_MATVIEW));
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_classid = PQfnumber(res, "classid");
+ i_objid = PQfnumber(res, "objid");
+ i_refobjid = PQfnumber(res, "refobjid");
+
+ for (i = 0; i < ntups; i++)
+ {
+ CatalogId objId;
+ CatalogId refobjId;
+ DumpableObject *dobj;
+ DumpableObject *refdobj;
+ TableInfo *tbinfo;
+ TableInfo *reftbinfo;
+
+ objId.tableoid = atooid(PQgetvalue(res, i, i_classid));
+ objId.oid = atooid(PQgetvalue(res, i, i_objid));
+ refobjId.tableoid = objId.tableoid;
+ refobjId.oid = atooid(PQgetvalue(res, i, i_refobjid));
+
+ dobj = findObjectByCatalogId(objId);
+ if (dobj == NULL)
+ continue;
+
+ Assert(dobj->objType == DO_TABLE);
+ tbinfo = (TableInfo *) dobj;
+ Assert(tbinfo->relkind == RELKIND_MATVIEW);
+ dobj = (DumpableObject *) tbinfo->dataObj;
+ if (dobj == NULL)
+ continue;
+ Assert(dobj->objType == DO_REFRESH_MATVIEW);
+
+ refdobj = findObjectByCatalogId(refobjId);
+ if (refdobj == NULL)
+ continue;
+
+ Assert(refdobj->objType == DO_TABLE);
+ reftbinfo = (TableInfo *) refdobj;
+ Assert(reftbinfo->relkind == RELKIND_MATVIEW);
+ refdobj = (DumpableObject *) reftbinfo->dataObj;
+ if (refdobj == NULL)
+ continue;
+ Assert(refdobj->objType == DO_REFRESH_MATVIEW);
+
+ addObjectDependency(dobj, refdobj->dumpId);
+
+ if (!reftbinfo->relispopulated)
+ tbinfo->relispopulated = false;
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * getTableDataFKConstraints -
+ * add dump-order dependencies reflecting foreign key constraints
+ *
+ * This code is executed only in a data-only dump --- in schema+data dumps
+ * we handle foreign key issues by not creating the FK constraints until
+ * after the data is loaded. In a data-only dump, however, we want to
+ * order the table data objects in such a way that a table's referenced
+ * tables are restored first. (In the presence of circular references or
+ * self-references this may be impossible; we'll detect and complain about
+ * that during the dependency sorting step.)
+ */
+static void
+getTableDataFKConstraints(void)
+{
+ DumpableObject **dobjs;
+ int numObjs;
+ int i;
+
+ /* Search through all the dumpable objects for FK constraints */
+ getDumpableObjects(&dobjs, &numObjs);
+ for (i = 0; i < numObjs; i++)
+ {
+ if (dobjs[i]->objType == DO_FK_CONSTRAINT)
+ {
+ ConstraintInfo *cinfo = (ConstraintInfo *) dobjs[i];
+ TableInfo *ftable;
+
+ /* Not interesting unless both tables are to be dumped */
+ if (cinfo->contable == NULL ||
+ cinfo->contable->dataObj == NULL)
+ continue;
+ ftable = findTableByOid(cinfo->confrelid);
+ if (ftable == NULL ||
+ ftable->dataObj == NULL)
+ continue;
+
+ /*
+ * Okay, make referencing table's TABLE_DATA object depend on the
+ * referenced table's TABLE_DATA object.
+ */
+ addObjectDependency(&cinfo->contable->dataObj->dobj,
+ ftable->dataObj->dobj.dumpId);
+ }
+ }
+ free(dobjs);
+}
+
+
+/*
+ * dumpDatabase:
+ * dump the database definition
+ */
+static void
+dumpDatabase(Archive *fout)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer dbQry = createPQExpBuffer();
+ PQExpBuffer delQry = createPQExpBuffer();
+ PQExpBuffer creaQry = createPQExpBuffer();
+ PQExpBuffer labelq = createPQExpBuffer();
+ PGconn *conn = GetConnection(fout);
+ PGresult *res;
+ int i_tableoid,
+ i_oid,
+ i_datname,
+ i_datdba,
+ i_encoding,
+ i_datlocprovider,
+ i_collate,
+ i_ctype,
+ i_daticulocale,
+ i_frozenxid,
+ i_minmxid,
+ i_datacl,
+ i_acldefault,
+ i_datistemplate,
+ i_datconnlimit,
+ i_datcollversion,
+ i_tablespace;
+ CatalogId dbCatId;
+ DumpId dbDumpId;
+ DumpableAcl dbdacl;
+ const char *datname,
+ *dba,
+ *encoding,
+ *datlocprovider,
+ *collate,
+ *ctype,
+ *iculocale,
+ *datistemplate,
+ *datconnlimit,
+ *tablespace;
+ uint32 frozenxid,
+ minmxid;
+ char *qdatname;
+
+ pg_log_info("saving database definition");
+
+ /*
+ * Fetch the database-level properties for this database.
+ */
+ appendPQExpBuffer(dbQry, "SELECT tableoid, oid, datname, "
+ "datdba, "
+ "pg_encoding_to_char(encoding) AS encoding, "
+ "datcollate, datctype, datfrozenxid, "
+ "datacl, acldefault('d', datdba) AS acldefault, "
+ "datistemplate, datconnlimit, ");
+ if (fout->remoteVersion >= 90300)
+ appendPQExpBuffer(dbQry, "datminmxid, ");
+ else
+ appendPQExpBuffer(dbQry, "0 AS datminmxid, ");
+ if (fout->remoteVersion >= 150000)
+ appendPQExpBuffer(dbQry, "datlocprovider, daticulocale, datcollversion, ");
+ else
+ appendPQExpBuffer(dbQry, "'c' AS datlocprovider, NULL AS daticulocale, NULL AS datcollversion, ");
+ appendPQExpBuffer(dbQry,
+ "(SELECT spcname FROM pg_tablespace t WHERE t.oid = dattablespace) AS tablespace, "
+ "shobj_description(oid, 'pg_database') AS description "
+ "FROM pg_database "
+ "WHERE datname = current_database()");
+
+ res = ExecuteSqlQueryForSingleRow(fout, dbQry->data);
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_datname = PQfnumber(res, "datname");
+ i_datdba = PQfnumber(res, "datdba");
+ i_encoding = PQfnumber(res, "encoding");
+ i_datlocprovider = PQfnumber(res, "datlocprovider");
+ i_collate = PQfnumber(res, "datcollate");
+ i_ctype = PQfnumber(res, "datctype");
+ i_daticulocale = PQfnumber(res, "daticulocale");
+ i_frozenxid = PQfnumber(res, "datfrozenxid");
+ i_minmxid = PQfnumber(res, "datminmxid");
+ i_datacl = PQfnumber(res, "datacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+ i_datistemplate = PQfnumber(res, "datistemplate");
+ i_datconnlimit = PQfnumber(res, "datconnlimit");
+ i_datcollversion = PQfnumber(res, "datcollversion");
+ i_tablespace = PQfnumber(res, "tablespace");
+
+ dbCatId.tableoid = atooid(PQgetvalue(res, 0, i_tableoid));
+ dbCatId.oid = atooid(PQgetvalue(res, 0, i_oid));
+ datname = PQgetvalue(res, 0, i_datname);
+ dba = getRoleName(PQgetvalue(res, 0, i_datdba));
+ encoding = PQgetvalue(res, 0, i_encoding);
+ datlocprovider = PQgetvalue(res, 0, i_datlocprovider);
+ collate = PQgetvalue(res, 0, i_collate);
+ ctype = PQgetvalue(res, 0, i_ctype);
+ if (!PQgetisnull(res, 0, i_daticulocale))
+ iculocale = PQgetvalue(res, 0, i_daticulocale);
+ else
+ iculocale = NULL;
+ frozenxid = atooid(PQgetvalue(res, 0, i_frozenxid));
+ minmxid = atooid(PQgetvalue(res, 0, i_minmxid));
+ dbdacl.acl = PQgetvalue(res, 0, i_datacl);
+ dbdacl.acldefault = PQgetvalue(res, 0, i_acldefault);
+ datistemplate = PQgetvalue(res, 0, i_datistemplate);
+ datconnlimit = PQgetvalue(res, 0, i_datconnlimit);
+ tablespace = PQgetvalue(res, 0, i_tablespace);
+
+ qdatname = pg_strdup(fmtId(datname));
+
+ /*
+ * Prepare the CREATE DATABASE command. We must specify OID (if we want
+ * to preserve that), as well as the encoding, locale, and tablespace
+ * since those can't be altered later. Other DB properties are left to
+ * the DATABASE PROPERTIES entry, so that they can be applied after
+ * reconnecting to the target DB.
+ */
+ if (dopt->binary_upgrade)
+ {
+ appendPQExpBuffer(creaQry, "CREATE DATABASE %s WITH TEMPLATE = template0 OID = %u",
+ qdatname, dbCatId.oid);
+ }
+ else
+ {
+ appendPQExpBuffer(creaQry, "CREATE DATABASE %s WITH TEMPLATE = template0",
+ qdatname);
+ }
+ if (strlen(encoding) > 0)
+ {
+ appendPQExpBufferStr(creaQry, " ENCODING = ");
+ appendStringLiteralAH(creaQry, encoding, fout);
+ }
+
+ appendPQExpBufferStr(creaQry, " LOCALE_PROVIDER = ");
+ if (datlocprovider[0] == 'c')
+ appendPQExpBufferStr(creaQry, "libc");
+ else if (datlocprovider[0] == 'i')
+ appendPQExpBufferStr(creaQry, "icu");
+ else
+ pg_fatal("unrecognized locale provider: %s",
+ datlocprovider);
+
+ if (strlen(collate) > 0 && strcmp(collate, ctype) == 0)
+ {
+ appendPQExpBufferStr(creaQry, " LOCALE = ");
+ appendStringLiteralAH(creaQry, collate, fout);
+ }
+ else
+ {
+ if (strlen(collate) > 0)
+ {
+ appendPQExpBufferStr(creaQry, " LC_COLLATE = ");
+ appendStringLiteralAH(creaQry, collate, fout);
+ }
+ if (strlen(ctype) > 0)
+ {
+ appendPQExpBufferStr(creaQry, " LC_CTYPE = ");
+ appendStringLiteralAH(creaQry, ctype, fout);
+ }
+ }
+ if (iculocale)
+ {
+ appendPQExpBufferStr(creaQry, " ICU_LOCALE = ");
+ appendStringLiteralAH(creaQry, iculocale, fout);
+ }
+
+ /*
+ * For binary upgrade, carry over the collation version. For normal
+ * dump/restore, omit the version, so that it is computed upon restore.
+ */
+ if (dopt->binary_upgrade)
+ {
+ if (!PQgetisnull(res, 0, i_datcollversion))
+ {
+ appendPQExpBufferStr(creaQry, " COLLATION_VERSION = ");
+ appendStringLiteralAH(creaQry,
+ PQgetvalue(res, 0, i_datcollversion),
+ fout);
+ }
+ }
+
+ /*
+ * Note: looking at dopt->outputNoTablespaces here is completely the wrong
+ * thing; the decision whether to specify a tablespace should be left till
+ * pg_restore, so that pg_restore --no-tablespaces applies. Ideally we'd
+ * label the DATABASE entry with the tablespace and let the normal
+ * tablespace selection logic work ... but CREATE DATABASE doesn't pay
+ * attention to default_tablespace, so that won't work.
+ */
+ if (strlen(tablespace) > 0 && strcmp(tablespace, "pg_default") != 0 &&
+ !dopt->outputNoTablespaces)
+ appendPQExpBuffer(creaQry, " TABLESPACE = %s",
+ fmtId(tablespace));
+ appendPQExpBufferStr(creaQry, ";\n");
+
+ appendPQExpBuffer(delQry, "DROP DATABASE %s;\n",
+ qdatname);
+
+ dbDumpId = createDumpId();
+
+ ArchiveEntry(fout,
+ dbCatId, /* catalog ID */
+ dbDumpId, /* dump ID */
+ ARCHIVE_OPTS(.tag = datname,
+ .owner = dba,
+ .description = "DATABASE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = creaQry->data,
+ .dropStmt = delQry->data));
+
+ /* Compute correct tag for archive entry */
+ appendPQExpBuffer(labelq, "DATABASE %s", qdatname);
+
+ /* Dump DB comment if any */
+ {
+ /*
+ * 8.2 and up keep comments on shared objects in a shared table, so we
+ * cannot use the dumpComment() code used for other database objects.
+ * Be careful that the ArchiveEntry parameters match that function.
+ */
+ char *comment = PQgetvalue(res, 0, PQfnumber(res, "description"));
+
+ if (comment && *comment && !dopt->no_comments)
+ {
+ resetPQExpBuffer(dbQry);
+
+ /*
+ * Generates warning when loaded into a differently-named
+ * database.
+ */
+ appendPQExpBuffer(dbQry, "COMMENT ON DATABASE %s IS ", qdatname);
+ appendStringLiteralAH(dbQry, comment, fout);
+ appendPQExpBufferStr(dbQry, ";\n");
+
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = labelq->data,
+ .owner = dba,
+ .description = "COMMENT",
+ .section = SECTION_NONE,
+ .createStmt = dbQry->data,
+ .deps = &dbDumpId,
+ .nDeps = 1));
+ }
+ }
+
+ /* Dump DB security label, if enabled */
+ if (!dopt->no_security_labels)
+ {
+ PGresult *shres;
+ PQExpBuffer seclabelQry;
+
+ seclabelQry = createPQExpBuffer();
+
+ buildShSecLabelQuery("pg_database", dbCatId.oid, seclabelQry);
+ shres = ExecuteSqlQuery(fout, seclabelQry->data, PGRES_TUPLES_OK);
+ resetPQExpBuffer(seclabelQry);
+ emitShSecLabels(conn, shres, seclabelQry, "DATABASE", datname);
+ if (seclabelQry->len > 0)
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = labelq->data,
+ .owner = dba,
+ .description = "SECURITY LABEL",
+ .section = SECTION_NONE,
+ .createStmt = seclabelQry->data,
+ .deps = &dbDumpId,
+ .nDeps = 1));
+ destroyPQExpBuffer(seclabelQry);
+ PQclear(shres);
+ }
+
+ /*
+ * Dump ACL if any. Note that we do not support initial privileges
+ * (pg_init_privs) on databases.
+ */
+ dbdacl.privtype = 0;
+ dbdacl.initprivs = NULL;
+
+ dumpACL(fout, dbDumpId, InvalidDumpId, "DATABASE",
+ qdatname, NULL, NULL,
+ dba, &dbdacl);
+
+ /*
+ * Now construct a DATABASE PROPERTIES archive entry to restore any
+ * non-default database-level properties. (The reason this must be
+ * separate is that we cannot put any additional commands into the TOC
+ * entry that has CREATE DATABASE. pg_restore would execute such a group
+ * in an implicit transaction block, and the backend won't allow CREATE
+ * DATABASE in that context.)
+ */
+ resetPQExpBuffer(creaQry);
+ resetPQExpBuffer(delQry);
+
+ if (strlen(datconnlimit) > 0 && strcmp(datconnlimit, "-1") != 0)
+ appendPQExpBuffer(creaQry, "ALTER DATABASE %s CONNECTION LIMIT = %s;\n",
+ qdatname, datconnlimit);
+
+ if (strcmp(datistemplate, "t") == 0)
+ {
+ appendPQExpBuffer(creaQry, "ALTER DATABASE %s IS_TEMPLATE = true;\n",
+ qdatname);
+
+ /*
+ * The backend won't accept DROP DATABASE on a template database. We
+ * can deal with that by removing the template marking before the DROP
+ * gets issued. We'd prefer to use ALTER DATABASE IF EXISTS here, but
+ * since no such command is currently supported, fake it with a direct
+ * UPDATE on pg_database.
+ */
+ appendPQExpBufferStr(delQry, "UPDATE pg_catalog.pg_database "
+ "SET datistemplate = false WHERE datname = ");
+ appendStringLiteralAH(delQry, datname, fout);
+ appendPQExpBufferStr(delQry, ";\n");
+ }
+
+ /* Add database-specific SET options */
+ dumpDatabaseConfig(fout, creaQry, datname, dbCatId.oid);
+
+ /*
+ * We stick this binary-upgrade query into the DATABASE PROPERTIES archive
+ * entry, too, for lack of a better place.
+ */
+ if (dopt->binary_upgrade)
+ {
+ appendPQExpBufferStr(creaQry, "\n-- For binary upgrade, set datfrozenxid and datminmxid.\n");
+ appendPQExpBuffer(creaQry, "UPDATE pg_catalog.pg_database\n"
+ "SET datfrozenxid = '%u', datminmxid = '%u'\n"
+ "WHERE datname = ",
+ frozenxid, minmxid);
+ appendStringLiteralAH(creaQry, datname, fout);
+ appendPQExpBufferStr(creaQry, ";\n");
+ }
+
+ if (creaQry->len > 0)
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = datname,
+ .owner = dba,
+ .description = "DATABASE PROPERTIES",
+ .section = SECTION_PRE_DATA,
+ .createStmt = creaQry->data,
+ .dropStmt = delQry->data,
+ .deps = &dbDumpId));
+
+ /*
+ * pg_largeobject comes from the old system intact, so set its
+ * relfrozenxids, relminmxids and relfilenode.
+ */
+ if (dopt->binary_upgrade)
+ {
+ PGresult *lo_res;
+ PQExpBuffer loFrozenQry = createPQExpBuffer();
+ PQExpBuffer loOutQry = createPQExpBuffer();
+ PQExpBuffer loHorizonQry = createPQExpBuffer();
+ int ii_relfrozenxid,
+ ii_relfilenode,
+ ii_oid,
+ ii_relminmxid;
+
+ /*
+ * pg_largeobject
+ */
+ if (fout->remoteVersion >= 90300)
+ appendPQExpBuffer(loFrozenQry, "SELECT relfrozenxid, relminmxid, relfilenode, oid\n"
+ "FROM pg_catalog.pg_class\n"
+ "WHERE oid IN (%u, %u);\n",
+ LargeObjectRelationId, LargeObjectLOidPNIndexId);
+ else
+ appendPQExpBuffer(loFrozenQry, "SELECT relfrozenxid, 0 AS relminmxid, relfilenode, oid\n"
+ "FROM pg_catalog.pg_class\n"
+ "WHERE oid IN (%u, %u);\n",
+ LargeObjectRelationId, LargeObjectLOidPNIndexId);
+
+ lo_res = ExecuteSqlQuery(fout, loFrozenQry->data, PGRES_TUPLES_OK);
+
+ ii_relfrozenxid = PQfnumber(lo_res, "relfrozenxid");
+ ii_relminmxid = PQfnumber(lo_res, "relminmxid");
+ ii_relfilenode = PQfnumber(lo_res, "relfilenode");
+ ii_oid = PQfnumber(lo_res, "oid");
+
+ appendPQExpBufferStr(loHorizonQry, "\n-- For binary upgrade, set pg_largeobject relfrozenxid and relminmxid\n");
+ appendPQExpBufferStr(loOutQry, "\n-- For binary upgrade, preserve pg_largeobject and index relfilenodes\n");
+ for (int i = 0; i < PQntuples(lo_res); ++i)
+ {
+ Oid oid;
+ Oid relfilenode;
+
+ appendPQExpBuffer(loHorizonQry, "UPDATE pg_catalog.pg_class\n"
+ "SET relfrozenxid = '%u', relminmxid = '%u'\n"
+ "WHERE oid = %u;\n",
+ atooid(PQgetvalue(lo_res, i, ii_relfrozenxid)),
+ atooid(PQgetvalue(lo_res, i, ii_relminmxid)),
+ atooid(PQgetvalue(lo_res, i, ii_oid)));
+
+ oid = atooid(PQgetvalue(lo_res, i, ii_oid));
+ relfilenode = atooid(PQgetvalue(lo_res, i, ii_relfilenode));
+
+ if (oid == LargeObjectRelationId)
+ appendPQExpBuffer(loOutQry,
+ "SELECT pg_catalog.binary_upgrade_set_next_heap_relfilenode('%u'::pg_catalog.oid);\n",
+ relfilenode);
+ else if (oid == LargeObjectLOidPNIndexId)
+ appendPQExpBuffer(loOutQry,
+ "SELECT pg_catalog.binary_upgrade_set_next_index_relfilenode('%u'::pg_catalog.oid);\n",
+ relfilenode);
+ }
+
+ appendPQExpBufferStr(loOutQry,
+ "TRUNCATE pg_catalog.pg_largeobject;\n");
+ appendPQExpBufferStr(loOutQry, loHorizonQry->data);
+
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = "pg_largeobject",
+ .description = "pg_largeobject",
+ .section = SECTION_PRE_DATA,
+ .createStmt = loOutQry->data));
+
+ PQclear(lo_res);
+
+ destroyPQExpBuffer(loFrozenQry);
+ destroyPQExpBuffer(loHorizonQry);
+ destroyPQExpBuffer(loOutQry);
+ }
+
+ PQclear(res);
+
+ free(qdatname);
+ destroyPQExpBuffer(dbQry);
+ destroyPQExpBuffer(delQry);
+ destroyPQExpBuffer(creaQry);
+ destroyPQExpBuffer(labelq);
+}
+
+/*
+ * Collect any database-specific or role-and-database-specific SET options
+ * for this database, and append them to outbuf.
+ */
+static void
+dumpDatabaseConfig(Archive *AH, PQExpBuffer outbuf,
+ const char *dbname, Oid dboid)
+{
+ PGconn *conn = GetConnection(AH);
+ PQExpBuffer buf = createPQExpBuffer();
+ PGresult *res;
+
+ /* First collect database-specific options */
+ printfPQExpBuffer(buf, "SELECT unnest(setconfig) FROM pg_db_role_setting "
+ "WHERE setrole = 0 AND setdatabase = '%u'::oid",
+ dboid);
+
+ res = ExecuteSqlQuery(AH, buf->data, PGRES_TUPLES_OK);
+
+ for (int i = 0; i < PQntuples(res); i++)
+ makeAlterConfigCommand(conn, PQgetvalue(res, i, 0),
+ "DATABASE", dbname, NULL, NULL,
+ outbuf);
+
+ PQclear(res);
+
+ /* Now look for role-and-database-specific options */
+ printfPQExpBuffer(buf, "SELECT rolname, unnest(setconfig) "
+ "FROM pg_db_role_setting s, pg_roles r "
+ "WHERE setrole = r.oid AND setdatabase = '%u'::oid",
+ dboid);
+
+ res = ExecuteSqlQuery(AH, buf->data, PGRES_TUPLES_OK);
+
+ for (int i = 0; i < PQntuples(res); i++)
+ makeAlterConfigCommand(conn, PQgetvalue(res, i, 1),
+ "ROLE", PQgetvalue(res, i, 0),
+ "DATABASE", dbname,
+ outbuf);
+
+ PQclear(res);
+
+ destroyPQExpBuffer(buf);
+}
+
+/*
+ * dumpEncoding: put the correct encoding into the archive
+ */
+static void
+dumpEncoding(Archive *AH)
+{
+ const char *encname = pg_encoding_to_char(AH->encoding);
+ PQExpBuffer qry = createPQExpBuffer();
+
+ pg_log_info("saving encoding = %s", encname);
+
+ appendPQExpBufferStr(qry, "SET client_encoding = ");
+ appendStringLiteralAH(qry, encname, AH);
+ appendPQExpBufferStr(qry, ";\n");
+
+ ArchiveEntry(AH, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = "ENCODING",
+ .description = "ENCODING",
+ .section = SECTION_PRE_DATA,
+ .createStmt = qry->data));
+
+ destroyPQExpBuffer(qry);
+}
+
+
+/*
+ * dumpStdStrings: put the correct escape string behavior into the archive
+ */
+static void
+dumpStdStrings(Archive *AH)
+{
+ const char *stdstrings = AH->std_strings ? "on" : "off";
+ PQExpBuffer qry = createPQExpBuffer();
+
+ pg_log_info("saving standard_conforming_strings = %s",
+ stdstrings);
+
+ appendPQExpBuffer(qry, "SET standard_conforming_strings = '%s';\n",
+ stdstrings);
+
+ ArchiveEntry(AH, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = "STDSTRINGS",
+ .description = "STDSTRINGS",
+ .section = SECTION_PRE_DATA,
+ .createStmt = qry->data));
+
+ destroyPQExpBuffer(qry);
+}
+
+/*
+ * dumpSearchPath: record the active search_path in the archive
+ */
+static void
+dumpSearchPath(Archive *AH)
+{
+ PQExpBuffer qry = createPQExpBuffer();
+ PQExpBuffer path = createPQExpBuffer();
+ PGresult *res;
+ char **schemanames = NULL;
+ int nschemanames = 0;
+ int i;
+
+ /*
+ * We use the result of current_schemas(), not the search_path GUC,
+ * because that might contain wildcards such as "$user", which won't
+ * necessarily have the same value during restore. Also, this way avoids
+ * listing schemas that may appear in search_path but not actually exist,
+ * which seems like a prudent exclusion.
+ */
+ res = ExecuteSqlQueryForSingleRow(AH,
+ "SELECT pg_catalog.current_schemas(false)");
+
+ if (!parsePGArray(PQgetvalue(res, 0, 0), &schemanames, &nschemanames))
+ pg_fatal("could not parse result of current_schemas()");
+
+ /*
+ * We use set_config(), not a simple "SET search_path" command, because
+ * the latter has less-clean behavior if the search path is empty. While
+ * that's likely to get fixed at some point, it seems like a good idea to
+ * be as backwards-compatible as possible in what we put into archives.
+ */
+ for (i = 0; i < nschemanames; i++)
+ {
+ if (i > 0)
+ appendPQExpBufferStr(path, ", ");
+ appendPQExpBufferStr(path, fmtId(schemanames[i]));
+ }
+
+ appendPQExpBufferStr(qry, "SELECT pg_catalog.set_config('search_path', ");
+ appendStringLiteralAH(qry, path->data, AH);
+ appendPQExpBufferStr(qry, ", false);\n");
+
+ pg_log_info("saving search_path = %s", path->data);
+
+ ArchiveEntry(AH, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = "SEARCHPATH",
+ .description = "SEARCHPATH",
+ .section = SECTION_PRE_DATA,
+ .createStmt = qry->data));
+
+ /* Also save it in AH->searchpath, in case we're doing plain text dump */
+ AH->searchpath = pg_strdup(qry->data);
+
+ if (schemanames)
+ free(schemanames);
+ PQclear(res);
+ destroyPQExpBuffer(qry);
+ destroyPQExpBuffer(path);
+}
+
+
+/*
+ * getBlobs:
+ * Collect schema-level data about large objects
+ */
+static void
+getBlobs(Archive *fout)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer blobQry = createPQExpBuffer();
+ BlobInfo *binfo;
+ DumpableObject *bdata;
+ PGresult *res;
+ int ntups;
+ int i;
+ int i_oid;
+ int i_lomowner;
+ int i_lomacl;
+ int i_acldefault;
+
+ pg_log_info("reading large objects");
+
+ /* Fetch BLOB OIDs, and owner/ACL data */
+ appendPQExpBuffer(blobQry,
+ "SELECT oid, lomowner, lomacl, "
+ "acldefault('L', lomowner) AS acldefault "
+ "FROM pg_largeobject_metadata");
+
+ res = ExecuteSqlQuery(fout, blobQry->data, PGRES_TUPLES_OK);
+
+ i_oid = PQfnumber(res, "oid");
+ i_lomowner = PQfnumber(res, "lomowner");
+ i_lomacl = PQfnumber(res, "lomacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+
+ ntups = PQntuples(res);
+
+ /*
+ * Each large object has its own BLOB archive entry.
+ */
+ binfo = (BlobInfo *) pg_malloc(ntups * sizeof(BlobInfo));
+
+ for (i = 0; i < ntups; i++)
+ {
+ binfo[i].dobj.objType = DO_BLOB;
+ binfo[i].dobj.catId.tableoid = LargeObjectRelationId;
+ binfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&binfo[i].dobj);
+
+ binfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_oid));
+ binfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_lomacl));
+ binfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ binfo[i].dacl.privtype = 0;
+ binfo[i].dacl.initprivs = NULL;
+ binfo[i].rolname = getRoleName(PQgetvalue(res, i, i_lomowner));
+
+ /* Blobs have data */
+ binfo[i].dobj.components |= DUMP_COMPONENT_DATA;
+
+ /* Mark whether blob has an ACL */
+ if (!PQgetisnull(res, i, i_lomacl))
+ binfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+
+ /*
+ * In binary-upgrade mode for blobs, we do *not* dump out the blob
+ * data, as it will be copied by pg_upgrade, which simply copies the
+ * pg_largeobject table. We *do* however dump out anything but the
+ * data, as pg_upgrade copies just pg_largeobject, but not
+ * pg_largeobject_metadata, after the dump is restored.
+ */
+ if (dopt->binary_upgrade)
+ binfo[i].dobj.dump &= ~DUMP_COMPONENT_DATA;
+ }
+
+ /*
+ * If we have any large objects, a "BLOBS" archive entry is needed. This
+ * is just a placeholder for sorting; it carries no data now.
+ */
+ if (ntups > 0)
+ {
+ bdata = (DumpableObject *) pg_malloc(sizeof(DumpableObject));
+ bdata->objType = DO_BLOB_DATA;
+ bdata->catId = nilCatalogId;
+ AssignDumpId(bdata);
+ bdata->name = pg_strdup("BLOBS");
+ bdata->components |= DUMP_COMPONENT_DATA;
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(blobQry);
+}
+
+/*
+ * dumpBlob
+ *
+ * dump the definition (metadata) of the given large object
+ */
+static void
+dumpBlob(Archive *fout, const BlobInfo *binfo)
+{
+ PQExpBuffer cquery = createPQExpBuffer();
+ PQExpBuffer dquery = createPQExpBuffer();
+
+ appendPQExpBuffer(cquery,
+ "SELECT pg_catalog.lo_create('%s');\n",
+ binfo->dobj.name);
+
+ appendPQExpBuffer(dquery,
+ "SELECT pg_catalog.lo_unlink('%s');\n",
+ binfo->dobj.name);
+
+ if (binfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, binfo->dobj.catId, binfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = binfo->dobj.name,
+ .owner = binfo->rolname,
+ .description = "BLOB",
+ .section = SECTION_PRE_DATA,
+ .createStmt = cquery->data,
+ .dropStmt = dquery->data));
+
+ /* Dump comment if any */
+ if (binfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "LARGE OBJECT", binfo->dobj.name,
+ NULL, binfo->rolname,
+ binfo->dobj.catId, 0, binfo->dobj.dumpId);
+
+ /* Dump security label if any */
+ if (binfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "LARGE OBJECT", binfo->dobj.name,
+ NULL, binfo->rolname,
+ binfo->dobj.catId, 0, binfo->dobj.dumpId);
+
+ /* Dump ACL if any */
+ if (binfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, binfo->dobj.dumpId, InvalidDumpId, "LARGE OBJECT",
+ binfo->dobj.name, NULL,
+ NULL, binfo->rolname, &binfo->dacl);
+
+ destroyPQExpBuffer(cquery);
+ destroyPQExpBuffer(dquery);
+}
+
+/*
+ * dumpBlobs:
+ * dump the data contents of all large objects
+ */
+static int
+dumpBlobs(Archive *fout, const void *arg)
+{
+ const char *blobQry;
+ const char *blobFetchQry;
+ PGconn *conn = GetConnection(fout);
+ PGresult *res;
+ char buf[LOBBUFSIZE];
+ int ntups;
+ int i;
+ int cnt;
+
+ pg_log_info("saving large objects");
+
+ /*
+ * Currently, we re-fetch all BLOB OIDs using a cursor. Consider scanning
+ * the already-in-memory dumpable objects instead...
+ */
+ blobQry =
+ "DECLARE bloboid CURSOR FOR "
+ "SELECT oid FROM pg_largeobject_metadata ORDER BY 1";
+
+ ExecuteSqlStatement(fout, blobQry);
+
+ /* Command to fetch from cursor */
+ blobFetchQry = "FETCH 1000 IN bloboid";
+
+ do
+ {
+ /* Do a fetch */
+ res = ExecuteSqlQuery(fout, blobFetchQry, PGRES_TUPLES_OK);
+
+ /* Process the tuples, if any */
+ ntups = PQntuples(res);
+ for (i = 0; i < ntups; i++)
+ {
+ Oid blobOid;
+ int loFd;
+
+ blobOid = atooid(PQgetvalue(res, i, 0));
+ /* Open the BLOB */
+ loFd = lo_open(conn, blobOid, INV_READ);
+ if (loFd == -1)
+ pg_fatal("could not open large object %u: %s",
+ blobOid, PQerrorMessage(conn));
+
+ StartBlob(fout, blobOid);
+
+ /* Now read it in chunks, sending data to archive */
+ do
+ {
+ cnt = lo_read(conn, loFd, buf, LOBBUFSIZE);
+ if (cnt < 0)
+ pg_fatal("error reading large object %u: %s",
+ blobOid, PQerrorMessage(conn));
+
+ WriteData(fout, buf, cnt);
+ } while (cnt > 0);
+
+ lo_close(conn, loFd);
+
+ EndBlob(fout, blobOid);
+ }
+
+ PQclear(res);
+ } while (ntups > 0);
+
+ return 1;
+}
+
+/*
+ * getPolicies
+ * get information about all RLS policies on dumpable tables.
+ */
+void
+getPolicies(Archive *fout, TableInfo tblinfo[], int numTables)
+{
+ PQExpBuffer query;
+ PQExpBuffer tbloids;
+ PGresult *res;
+ PolicyInfo *polinfo;
+ int i_oid;
+ int i_tableoid;
+ int i_polrelid;
+ int i_polname;
+ int i_polcmd;
+ int i_polpermissive;
+ int i_polroles;
+ int i_polqual;
+ int i_polwithcheck;
+ int i,
+ j,
+ ntups;
+
+ /* No policies before 9.5 */
+ if (fout->remoteVersion < 90500)
+ return;
+
+ query = createPQExpBuffer();
+ tbloids = createPQExpBuffer();
+
+ /*
+ * Identify tables of interest, and check which ones have RLS enabled.
+ */
+ appendPQExpBufferChar(tbloids, '{');
+ for (i = 0; i < numTables; i++)
+ {
+ TableInfo *tbinfo = &tblinfo[i];
+
+ /* Ignore row security on tables not to be dumped */
+ if (!(tbinfo->dobj.dump & DUMP_COMPONENT_POLICY))
+ continue;
+
+ /* It can't have RLS or policies if it's not a table */
+ if (tbinfo->relkind != RELKIND_RELATION &&
+ tbinfo->relkind != RELKIND_PARTITIONED_TABLE)
+ continue;
+
+ /* Add it to the list of table OIDs to be probed below */
+ if (tbloids->len > 1) /* do we have more than the '{'? */
+ appendPQExpBufferChar(tbloids, ',');
+ appendPQExpBuffer(tbloids, "%u", tbinfo->dobj.catId.oid);
+
+ /* Is RLS enabled? (That's separate from whether it has policies) */
+ if (tbinfo->rowsec)
+ {
+ tbinfo->dobj.components |= DUMP_COMPONENT_POLICY;
+
+ /*
+ * We represent RLS being enabled on a table by creating a
+ * PolicyInfo object with null polname.
+ *
+ * Note: use tableoid 0 so that this object won't be mistaken for
+ * something that pg_depend entries apply to.
+ */
+ polinfo = pg_malloc(sizeof(PolicyInfo));
+ polinfo->dobj.objType = DO_POLICY;
+ polinfo->dobj.catId.tableoid = 0;
+ polinfo->dobj.catId.oid = tbinfo->dobj.catId.oid;
+ AssignDumpId(&polinfo->dobj);
+ polinfo->dobj.namespace = tbinfo->dobj.namespace;
+ polinfo->dobj.name = pg_strdup(tbinfo->dobj.name);
+ polinfo->poltable = tbinfo;
+ polinfo->polname = NULL;
+ polinfo->polcmd = '\0';
+ polinfo->polpermissive = 0;
+ polinfo->polroles = NULL;
+ polinfo->polqual = NULL;
+ polinfo->polwithcheck = NULL;
+ }
+ }
+ appendPQExpBufferChar(tbloids, '}');
+
+ /*
+ * Now, read all RLS policies belonging to the tables of interest, and
+ * create PolicyInfo objects for them. (Note that we must filter the
+ * results server-side not locally, because we dare not apply pg_get_expr
+ * to tables we don't have lock on.)
+ */
+ pg_log_info("reading row-level security policies");
+
+ printfPQExpBuffer(query,
+ "SELECT pol.oid, pol.tableoid, pol.polrelid, pol.polname, pol.polcmd, ");
+ if (fout->remoteVersion >= 100000)
+ appendPQExpBuffer(query, "pol.polpermissive, ");
+ else
+ appendPQExpBuffer(query, "'t' as polpermissive, ");
+ appendPQExpBuffer(query,
+ "CASE WHEN pol.polroles = '{0}' THEN NULL ELSE "
+ " pg_catalog.array_to_string(ARRAY(SELECT pg_catalog.quote_ident(rolname) from pg_catalog.pg_roles WHERE oid = ANY(pol.polroles)), ', ') END AS polroles, "
+ "pg_catalog.pg_get_expr(pol.polqual, pol.polrelid) AS polqual, "
+ "pg_catalog.pg_get_expr(pol.polwithcheck, pol.polrelid) AS polwithcheck "
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_policy pol ON (src.tbloid = pol.polrelid)",
+ tbloids->data);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ if (ntups > 0)
+ {
+ i_oid = PQfnumber(res, "oid");
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_polrelid = PQfnumber(res, "polrelid");
+ i_polname = PQfnumber(res, "polname");
+ i_polcmd = PQfnumber(res, "polcmd");
+ i_polpermissive = PQfnumber(res, "polpermissive");
+ i_polroles = PQfnumber(res, "polroles");
+ i_polqual = PQfnumber(res, "polqual");
+ i_polwithcheck = PQfnumber(res, "polwithcheck");
+
+ polinfo = pg_malloc(ntups * sizeof(PolicyInfo));
+
+ for (j = 0; j < ntups; j++)
+ {
+ Oid polrelid = atooid(PQgetvalue(res, j, i_polrelid));
+ TableInfo *tbinfo = findTableByOid(polrelid);
+
+ tbinfo->dobj.components |= DUMP_COMPONENT_POLICY;
+
+ polinfo[j].dobj.objType = DO_POLICY;
+ polinfo[j].dobj.catId.tableoid =
+ atooid(PQgetvalue(res, j, i_tableoid));
+ polinfo[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_oid));
+ AssignDumpId(&polinfo[j].dobj);
+ polinfo[j].dobj.namespace = tbinfo->dobj.namespace;
+ polinfo[j].poltable = tbinfo;
+ polinfo[j].polname = pg_strdup(PQgetvalue(res, j, i_polname));
+ polinfo[j].dobj.name = pg_strdup(polinfo[j].polname);
+
+ polinfo[j].polcmd = *(PQgetvalue(res, j, i_polcmd));
+ polinfo[j].polpermissive = *(PQgetvalue(res, j, i_polpermissive)) == 't';
+
+ if (PQgetisnull(res, j, i_polroles))
+ polinfo[j].polroles = NULL;
+ else
+ polinfo[j].polroles = pg_strdup(PQgetvalue(res, j, i_polroles));
+
+ if (PQgetisnull(res, j, i_polqual))
+ polinfo[j].polqual = NULL;
+ else
+ polinfo[j].polqual = pg_strdup(PQgetvalue(res, j, i_polqual));
+
+ if (PQgetisnull(res, j, i_polwithcheck))
+ polinfo[j].polwithcheck = NULL;
+ else
+ polinfo[j].polwithcheck
+ = pg_strdup(PQgetvalue(res, j, i_polwithcheck));
+ }
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(tbloids);
+}
+
+/*
+ * dumpPolicy
+ * dump the definition of the given policy
+ */
+static void
+dumpPolicy(Archive *fout, const PolicyInfo *polinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ TableInfo *tbinfo = polinfo->poltable;
+ PQExpBuffer query;
+ PQExpBuffer delqry;
+ PQExpBuffer polprefix;
+ char *qtabname;
+ const char *cmd;
+ char *tag;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ /*
+ * If polname is NULL, then this record is just indicating that ROW LEVEL
+ * SECURITY is enabled for the table. Dump as ALTER TABLE <table> ENABLE
+ * ROW LEVEL SECURITY.
+ */
+ if (polinfo->polname == NULL)
+ {
+ query = createPQExpBuffer();
+
+ appendPQExpBuffer(query, "ALTER TABLE %s ENABLE ROW LEVEL SECURITY;",
+ fmtQualifiedDumpable(tbinfo));
+
+ /*
+ * We must emit the ROW SECURITY object's dependency on its table
+ * explicitly, because it will not match anything in pg_depend (unlike
+ * the case for other PolicyInfo objects).
+ */
+ if (polinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, polinfo->dobj.catId, polinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = polinfo->dobj.name,
+ .namespace = polinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "ROW SECURITY",
+ .section = SECTION_POST_DATA,
+ .createStmt = query->data,
+ .deps = &(tbinfo->dobj.dumpId),
+ .nDeps = 1));
+
+ destroyPQExpBuffer(query);
+ return;
+ }
+
+ if (polinfo->polcmd == '*')
+ cmd = "";
+ else if (polinfo->polcmd == 'r')
+ cmd = " FOR SELECT";
+ else if (polinfo->polcmd == 'a')
+ cmd = " FOR INSERT";
+ else if (polinfo->polcmd == 'w')
+ cmd = " FOR UPDATE";
+ else if (polinfo->polcmd == 'd')
+ cmd = " FOR DELETE";
+ else
+ pg_fatal("unexpected policy command type: %c",
+ polinfo->polcmd);
+
+ query = createPQExpBuffer();
+ delqry = createPQExpBuffer();
+ polprefix = createPQExpBuffer();
+
+ qtabname = pg_strdup(fmtId(tbinfo->dobj.name));
+
+ appendPQExpBuffer(query, "CREATE POLICY %s", fmtId(polinfo->polname));
+
+ appendPQExpBuffer(query, " ON %s%s%s", fmtQualifiedDumpable(tbinfo),
+ !polinfo->polpermissive ? " AS RESTRICTIVE" : "", cmd);
+
+ if (polinfo->polroles != NULL)
+ appendPQExpBuffer(query, " TO %s", polinfo->polroles);
+
+ if (polinfo->polqual != NULL)
+ appendPQExpBuffer(query, " USING (%s)", polinfo->polqual);
+
+ if (polinfo->polwithcheck != NULL)
+ appendPQExpBuffer(query, " WITH CHECK (%s)", polinfo->polwithcheck);
+
+ appendPQExpBufferStr(query, ";\n");
+
+ appendPQExpBuffer(delqry, "DROP POLICY %s", fmtId(polinfo->polname));
+ appendPQExpBuffer(delqry, " ON %s;\n", fmtQualifiedDumpable(tbinfo));
+
+ appendPQExpBuffer(polprefix, "POLICY %s ON",
+ fmtId(polinfo->polname));
+
+ tag = psprintf("%s %s", tbinfo->dobj.name, polinfo->dobj.name);
+
+ if (polinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, polinfo->dobj.catId, polinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = polinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "POLICY",
+ .section = SECTION_POST_DATA,
+ .createStmt = query->data,
+ .dropStmt = delqry->data));
+
+ if (polinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, polprefix->data, qtabname,
+ tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
+ polinfo->dobj.catId, 0, polinfo->dobj.dumpId);
+
+ free(tag);
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(delqry);
+ destroyPQExpBuffer(polprefix);
+ free(qtabname);
+}
+
+/*
+ * getPublications
+ * get information about publications
+ */
+PublicationInfo *
+getPublications(Archive *fout, int *numPublications)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PGresult *res;
+ PublicationInfo *pubinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_pubname;
+ int i_pubowner;
+ int i_puballtables;
+ int i_pubinsert;
+ int i_pubupdate;
+ int i_pubdelete;
+ int i_pubtruncate;
+ int i_pubviaroot;
+ int i,
+ ntups;
+
+ if (dopt->no_publications || fout->remoteVersion < 100000)
+ {
+ *numPublications = 0;
+ return NULL;
+ }
+
+ query = createPQExpBuffer();
+
+ resetPQExpBuffer(query);
+
+ /* Get the publications. */
+ if (fout->remoteVersion >= 130000)
+ appendPQExpBuffer(query,
+ "SELECT p.tableoid, p.oid, p.pubname, "
+ "p.pubowner, "
+ "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, p.pubviaroot "
+ "FROM pg_publication p");
+ else if (fout->remoteVersion >= 110000)
+ appendPQExpBuffer(query,
+ "SELECT p.tableoid, p.oid, p.pubname, "
+ "p.pubowner, "
+ "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, false AS pubviaroot "
+ "FROM pg_publication p");
+ else
+ appendPQExpBuffer(query,
+ "SELECT p.tableoid, p.oid, p.pubname, "
+ "p.pubowner, "
+ "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, false AS pubtruncate, false AS pubviaroot "
+ "FROM pg_publication p");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_pubname = PQfnumber(res, "pubname");
+ i_pubowner = PQfnumber(res, "pubowner");
+ i_puballtables = PQfnumber(res, "puballtables");
+ i_pubinsert = PQfnumber(res, "pubinsert");
+ i_pubupdate = PQfnumber(res, "pubupdate");
+ i_pubdelete = PQfnumber(res, "pubdelete");
+ i_pubtruncate = PQfnumber(res, "pubtruncate");
+ i_pubviaroot = PQfnumber(res, "pubviaroot");
+
+ pubinfo = pg_malloc(ntups * sizeof(PublicationInfo));
+
+ for (i = 0; i < ntups; i++)
+ {
+ pubinfo[i].dobj.objType = DO_PUBLICATION;
+ pubinfo[i].dobj.catId.tableoid =
+ atooid(PQgetvalue(res, i, i_tableoid));
+ pubinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&pubinfo[i].dobj);
+ pubinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_pubname));
+ pubinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_pubowner));
+ pubinfo[i].puballtables =
+ (strcmp(PQgetvalue(res, i, i_puballtables), "t") == 0);
+ pubinfo[i].pubinsert =
+ (strcmp(PQgetvalue(res, i, i_pubinsert), "t") == 0);
+ pubinfo[i].pubupdate =
+ (strcmp(PQgetvalue(res, i, i_pubupdate), "t") == 0);
+ pubinfo[i].pubdelete =
+ (strcmp(PQgetvalue(res, i, i_pubdelete), "t") == 0);
+ pubinfo[i].pubtruncate =
+ (strcmp(PQgetvalue(res, i, i_pubtruncate), "t") == 0);
+ pubinfo[i].pubviaroot =
+ (strcmp(PQgetvalue(res, i, i_pubviaroot), "t") == 0);
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(pubinfo[i].dobj), fout);
+ }
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ *numPublications = ntups;
+ return pubinfo;
+}
+
+/*
+ * dumpPublication
+ * dump the definition of the given publication
+ */
+static void
+dumpPublication(Archive *fout, const PublicationInfo *pubinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer delq;
+ PQExpBuffer query;
+ char *qpubname;
+ bool first = true;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ delq = createPQExpBuffer();
+ query = createPQExpBuffer();
+
+ qpubname = pg_strdup(fmtId(pubinfo->dobj.name));
+
+ appendPQExpBuffer(delq, "DROP PUBLICATION %s;\n",
+ qpubname);
+
+ appendPQExpBuffer(query, "CREATE PUBLICATION %s",
+ qpubname);
+
+ if (pubinfo->puballtables)
+ appendPQExpBufferStr(query, " FOR ALL TABLES");
+
+ appendPQExpBufferStr(query, " WITH (publish = '");
+ if (pubinfo->pubinsert)
+ {
+ appendPQExpBufferStr(query, "insert");
+ first = false;
+ }
+
+ if (pubinfo->pubupdate)
+ {
+ if (!first)
+ appendPQExpBufferStr(query, ", ");
+
+ appendPQExpBufferStr(query, "update");
+ first = false;
+ }
+
+ if (pubinfo->pubdelete)
+ {
+ if (!first)
+ appendPQExpBufferStr(query, ", ");
+
+ appendPQExpBufferStr(query, "delete");
+ first = false;
+ }
+
+ if (pubinfo->pubtruncate)
+ {
+ if (!first)
+ appendPQExpBufferStr(query, ", ");
+
+ appendPQExpBufferStr(query, "truncate");
+ first = false;
+ }
+
+ appendPQExpBufferStr(query, "'");
+
+ if (pubinfo->pubviaroot)
+ appendPQExpBufferStr(query, ", publish_via_partition_root = true");
+
+ appendPQExpBufferStr(query, ");\n");
+
+ if (pubinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, pubinfo->dobj.catId, pubinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = pubinfo->dobj.name,
+ .owner = pubinfo->rolname,
+ .description = "PUBLICATION",
+ .section = SECTION_POST_DATA,
+ .createStmt = query->data,
+ .dropStmt = delq->data));
+
+ if (pubinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "PUBLICATION", qpubname,
+ NULL, pubinfo->rolname,
+ pubinfo->dobj.catId, 0, pubinfo->dobj.dumpId);
+
+ if (pubinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "PUBLICATION", qpubname,
+ NULL, pubinfo->rolname,
+ pubinfo->dobj.catId, 0, pubinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qpubname);
+}
+
+/*
+ * getPublicationNamespaces
+ * get information about publication membership for dumpable schemas.
+ */
+void
+getPublicationNamespaces(Archive *fout)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ PublicationSchemaInfo *pubsinfo;
+ DumpOptions *dopt = fout->dopt;
+ int i_tableoid;
+ int i_oid;
+ int i_pnpubid;
+ int i_pnnspid;
+ int i,
+ j,
+ ntups;
+
+ if (dopt->no_publications || fout->remoteVersion < 150000)
+ return;
+
+ query = createPQExpBuffer();
+
+ /* Collect all publication membership info. */
+ appendPQExpBufferStr(query,
+ "SELECT tableoid, oid, pnpubid, pnnspid "
+ "FROM pg_catalog.pg_publication_namespace");
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_pnpubid = PQfnumber(res, "pnpubid");
+ i_pnnspid = PQfnumber(res, "pnnspid");
+
+ /* this allocation may be more than we need */
+ pubsinfo = pg_malloc(ntups * sizeof(PublicationSchemaInfo));
+ j = 0;
+
+ for (i = 0; i < ntups; i++)
+ {
+ Oid pnpubid = atooid(PQgetvalue(res, i, i_pnpubid));
+ Oid pnnspid = atooid(PQgetvalue(res, i, i_pnnspid));
+ PublicationInfo *pubinfo;
+ NamespaceInfo *nspinfo;
+
+ /*
+ * Ignore any entries for which we aren't interested in either the
+ * publication or the rel.
+ */
+ pubinfo = findPublicationByOid(pnpubid);
+ if (pubinfo == NULL)
+ continue;
+ nspinfo = findNamespaceByOid(pnnspid);
+ if (nspinfo == NULL)
+ continue;
+
+ /*
+ * We always dump publication namespaces unless the corresponding
+ * namespace is excluded from the dump.
+ */
+ if (nspinfo->dobj.dump == DUMP_COMPONENT_NONE)
+ continue;
+
+ /* OK, make a DumpableObject for this relationship */
+ pubsinfo[j].dobj.objType = DO_PUBLICATION_TABLE_IN_SCHEMA;
+ pubsinfo[j].dobj.catId.tableoid =
+ atooid(PQgetvalue(res, i, i_tableoid));
+ pubsinfo[j].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&pubsinfo[j].dobj);
+ pubsinfo[j].dobj.namespace = nspinfo->dobj.namespace;
+ pubsinfo[j].dobj.name = nspinfo->dobj.name;
+ pubsinfo[j].publication = pubinfo;
+ pubsinfo[j].pubschema = nspinfo;
+
+ /* Decide whether we want to dump it */
+ selectDumpablePublicationObject(&(pubsinfo[j].dobj), fout);
+
+ j++;
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * getPublicationTables
+ * get information about publication membership for dumpable tables.
+ */
+void
+getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ PublicationRelInfo *pubrinfo;
+ DumpOptions *dopt = fout->dopt;
+ int i_tableoid;
+ int i_oid;
+ int i_prpubid;
+ int i_prrelid;
+ int i_prrelqual;
+ int i_prattrs;
+ int i,
+ j,
+ ntups;
+
+ if (dopt->no_publications || fout->remoteVersion < 100000)
+ return;
+
+ query = createPQExpBuffer();
+
+ /* Collect all publication membership info. */
+ if (fout->remoteVersion >= 150000)
+ appendPQExpBufferStr(query,
+ "SELECT tableoid, oid, prpubid, prrelid, "
+ "pg_catalog.pg_get_expr(prqual, prrelid) AS prrelqual, "
+ "(CASE\n"
+ " WHEN pr.prattrs IS NOT NULL THEN\n"
+ " (SELECT array_agg(attname)\n"
+ " FROM\n"
+ " pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s,\n"
+ " pg_catalog.pg_attribute\n"
+ " WHERE attrelid = pr.prrelid AND attnum = prattrs[s])\n"
+ " ELSE NULL END) prattrs "
+ "FROM pg_catalog.pg_publication_rel pr");
+ else
+ appendPQExpBufferStr(query,
+ "SELECT tableoid, oid, prpubid, prrelid, "
+ "NULL AS prrelqual, NULL AS prattrs "
+ "FROM pg_catalog.pg_publication_rel");
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_prpubid = PQfnumber(res, "prpubid");
+ i_prrelid = PQfnumber(res, "prrelid");
+ i_prrelqual = PQfnumber(res, "prrelqual");
+ i_prattrs = PQfnumber(res, "prattrs");
+
+ /* this allocation may be more than we need */
+ pubrinfo = pg_malloc(ntups * sizeof(PublicationRelInfo));
+ j = 0;
+
+ for (i = 0; i < ntups; i++)
+ {
+ Oid prpubid = atooid(PQgetvalue(res, i, i_prpubid));
+ Oid prrelid = atooid(PQgetvalue(res, i, i_prrelid));
+ PublicationInfo *pubinfo;
+ TableInfo *tbinfo;
+
+ /*
+ * Ignore any entries for which we aren't interested in either the
+ * publication or the rel.
+ */
+ pubinfo = findPublicationByOid(prpubid);
+ if (pubinfo == NULL)
+ continue;
+ tbinfo = findTableByOid(prrelid);
+ if (tbinfo == NULL)
+ continue;
+
+ /*
+ * Ignore publication membership of tables whose definitions are not
+ * to be dumped.
+ */
+ if (!(tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION))
+ continue;
+
+ /* OK, make a DumpableObject for this relationship */
+ pubrinfo[j].dobj.objType = DO_PUBLICATION_REL;
+ pubrinfo[j].dobj.catId.tableoid =
+ atooid(PQgetvalue(res, i, i_tableoid));
+ pubrinfo[j].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&pubrinfo[j].dobj);
+ pubrinfo[j].dobj.namespace = tbinfo->dobj.namespace;
+ pubrinfo[j].dobj.name = tbinfo->dobj.name;
+ pubrinfo[j].publication = pubinfo;
+ pubrinfo[j].pubtable = tbinfo;
+ if (PQgetisnull(res, i, i_prrelqual))
+ pubrinfo[j].pubrelqual = NULL;
+ else
+ pubrinfo[j].pubrelqual = pg_strdup(PQgetvalue(res, i, i_prrelqual));
+
+ if (!PQgetisnull(res, i, i_prattrs))
+ {
+ char **attnames;
+ int nattnames;
+ PQExpBuffer attribs;
+
+ if (!parsePGArray(PQgetvalue(res, i, i_prattrs),
+ &attnames, &nattnames))
+ pg_fatal("could not parse %s array", "prattrs");
+ attribs = createPQExpBuffer();
+ for (int k = 0; k < nattnames; k++)
+ {
+ if (k > 0)
+ appendPQExpBufferStr(attribs, ", ");
+
+ appendPQExpBufferStr(attribs, fmtId(attnames[k]));
+ }
+ pubrinfo[j].pubrattrs = attribs->data;
+ }
+ else
+ pubrinfo[j].pubrattrs = NULL;
+
+ /* Decide whether we want to dump it */
+ selectDumpablePublicationObject(&(pubrinfo[j].dobj), fout);
+
+ j++;
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpPublicationNamespace
+ * dump the definition of the given publication schema mapping.
+ */
+static void
+dumpPublicationNamespace(Archive *fout, const PublicationSchemaInfo *pubsinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ NamespaceInfo *schemainfo = pubsinfo->pubschema;
+ PublicationInfo *pubinfo = pubsinfo->publication;
+ PQExpBuffer query;
+ char *tag;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ tag = psprintf("%s %s", pubinfo->dobj.name, schemainfo->dobj.name);
+
+ query = createPQExpBuffer();
+
+ appendPQExpBuffer(query, "ALTER PUBLICATION %s ", fmtId(pubinfo->dobj.name));
+ appendPQExpBuffer(query, "ADD TABLES IN SCHEMA %s;\n", fmtId(schemainfo->dobj.name));
+
+ /*
+ * There is no point in creating drop query as the drop is done by schema
+ * drop.
+ */
+ if (pubsinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, pubsinfo->dobj.catId, pubsinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = schemainfo->dobj.name,
+ .owner = pubinfo->rolname,
+ .description = "PUBLICATION TABLES IN SCHEMA",
+ .section = SECTION_POST_DATA,
+ .createStmt = query->data));
+
+ /* These objects can't currently have comments or seclabels */
+
+ free(tag);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpPublicationTable
+ * dump the definition of the given publication table mapping
+ */
+static void
+dumpPublicationTable(Archive *fout, const PublicationRelInfo *pubrinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PublicationInfo *pubinfo = pubrinfo->publication;
+ TableInfo *tbinfo = pubrinfo->pubtable;
+ PQExpBuffer query;
+ char *tag;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ tag = psprintf("%s %s", pubinfo->dobj.name, tbinfo->dobj.name);
+
+ query = createPQExpBuffer();
+
+ appendPQExpBuffer(query, "ALTER PUBLICATION %s ADD TABLE ONLY",
+ fmtId(pubinfo->dobj.name));
+ appendPQExpBuffer(query, " %s",
+ fmtQualifiedDumpable(tbinfo));
+
+ if (pubrinfo->pubrattrs)
+ appendPQExpBuffer(query, " (%s)", pubrinfo->pubrattrs);
+
+ if (pubrinfo->pubrelqual)
+ {
+ /*
+ * It's necessary to add parentheses around the expression because
+ * pg_get_expr won't supply the parentheses for things like WHERE
+ * TRUE.
+ */
+ appendPQExpBuffer(query, " WHERE (%s)", pubrinfo->pubrelqual);
+ }
+ appendPQExpBufferStr(query, ";\n");
+
+ /*
+ * There is no point in creating a drop query as the drop is done by table
+ * drop. (If you think to change this, see also _printTocEntry().)
+ * Although this object doesn't really have ownership as such, set the
+ * owner field anyway to ensure that the command is run by the correct
+ * role at restore time.
+ */
+ if (pubrinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, pubrinfo->dobj.catId, pubrinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = pubinfo->rolname,
+ .description = "PUBLICATION TABLE",
+ .section = SECTION_POST_DATA,
+ .createStmt = query->data));
+
+ /* These objects can't currently have comments or seclabels */
+
+ free(tag);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * Is the currently connected user a superuser?
+ */
+static bool
+is_superuser(Archive *fout)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) fout;
+ const char *val;
+
+ val = PQparameterStatus(AH->connection, "is_superuser");
+
+ if (val && strcmp(val, "on") == 0)
+ return true;
+
+ return false;
+}
+
+/*
+ * getSubscriptions
+ * get information about subscriptions
+ */
+void
+getSubscriptions(Archive *fout)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PGresult *res;
+ SubscriptionInfo *subinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_subname;
+ int i_subowner;
+ int i_substream;
+ int i_subtwophasestate;
+ int i_subdisableonerr;
+ int i_subconninfo;
+ int i_subslotname;
+ int i_subsynccommit;
+ int i_subpublications;
+ int i_subbinary;
+ int i,
+ ntups;
+
+ if (dopt->no_subscriptions || fout->remoteVersion < 100000)
+ return;
+
+ if (!is_superuser(fout))
+ {
+ int n;
+
+ res = ExecuteSqlQuery(fout,
+ "SELECT count(*) FROM pg_subscription "
+ "WHERE subdbid = (SELECT oid FROM pg_database"
+ " WHERE datname = current_database())",
+ PGRES_TUPLES_OK);
+ n = atoi(PQgetvalue(res, 0, 0));
+ if (n > 0)
+ pg_log_warning("subscriptions not dumped because current user is not a superuser");
+ PQclear(res);
+ return;
+ }
+
+ query = createPQExpBuffer();
+
+ /* Get the subscriptions in current database. */
+ appendPQExpBuffer(query,
+ "SELECT s.tableoid, s.oid, s.subname,\n"
+ " s.subowner,\n"
+ " s.subconninfo, s.subslotname, s.subsynccommit,\n"
+ " s.subpublications,\n");
+
+ if (fout->remoteVersion >= 140000)
+ appendPQExpBufferStr(query, " s.subbinary,\n");
+ else
+ appendPQExpBufferStr(query, " false AS subbinary,\n");
+
+ if (fout->remoteVersion >= 140000)
+ appendPQExpBufferStr(query, " s.substream,\n");
+ else
+ appendPQExpBufferStr(query, " false AS substream,\n");
+
+ if (fout->remoteVersion >= 150000)
+ appendPQExpBufferStr(query,
+ " s.subtwophasestate,\n"
+ " s.subdisableonerr\n");
+ else
+ appendPQExpBuffer(query,
+ " '%c' AS subtwophasestate,\n"
+ " false AS subdisableonerr\n",
+ LOGICALREP_TWOPHASE_STATE_DISABLED);
+
+ appendPQExpBufferStr(query,
+ "FROM pg_subscription s\n"
+ "WHERE s.subdbid = (SELECT oid FROM pg_database\n"
+ " WHERE datname = current_database())");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ /*
+ * Get subscription fields. We don't include subskiplsn in the dump as
+ * after restoring the dump this value may no longer be relevant.
+ */
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_subname = PQfnumber(res, "subname");
+ i_subowner = PQfnumber(res, "subowner");
+ i_subconninfo = PQfnumber(res, "subconninfo");
+ i_subslotname = PQfnumber(res, "subslotname");
+ i_subsynccommit = PQfnumber(res, "subsynccommit");
+ i_subpublications = PQfnumber(res, "subpublications");
+ i_subbinary = PQfnumber(res, "subbinary");
+ i_substream = PQfnumber(res, "substream");
+ i_subtwophasestate = PQfnumber(res, "subtwophasestate");
+ i_subdisableonerr = PQfnumber(res, "subdisableonerr");
+
+ subinfo = pg_malloc(ntups * sizeof(SubscriptionInfo));
+
+ for (i = 0; i < ntups; i++)
+ {
+ subinfo[i].dobj.objType = DO_SUBSCRIPTION;
+ subinfo[i].dobj.catId.tableoid =
+ atooid(PQgetvalue(res, i, i_tableoid));
+ subinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&subinfo[i].dobj);
+ subinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_subname));
+ subinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_subowner));
+ subinfo[i].subconninfo = pg_strdup(PQgetvalue(res, i, i_subconninfo));
+ if (PQgetisnull(res, i, i_subslotname))
+ subinfo[i].subslotname = NULL;
+ else
+ subinfo[i].subslotname = pg_strdup(PQgetvalue(res, i, i_subslotname));
+ subinfo[i].subsynccommit =
+ pg_strdup(PQgetvalue(res, i, i_subsynccommit));
+ subinfo[i].subpublications =
+ pg_strdup(PQgetvalue(res, i, i_subpublications));
+ subinfo[i].subbinary =
+ pg_strdup(PQgetvalue(res, i, i_subbinary));
+ subinfo[i].substream =
+ pg_strdup(PQgetvalue(res, i, i_substream));
+ subinfo[i].subtwophasestate =
+ pg_strdup(PQgetvalue(res, i, i_subtwophasestate));
+ subinfo[i].subdisableonerr =
+ pg_strdup(PQgetvalue(res, i, i_subdisableonerr));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(subinfo[i].dobj), fout);
+ }
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpSubscription
+ * dump the definition of the given subscription
+ */
+static void
+dumpSubscription(Archive *fout, const SubscriptionInfo *subinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer delq;
+ PQExpBuffer query;
+ PQExpBuffer publications;
+ char *qsubname;
+ char **pubnames = NULL;
+ int npubnames = 0;
+ int i;
+ char two_phase_disabled[] = {LOGICALREP_TWOPHASE_STATE_DISABLED, '\0'};
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ delq = createPQExpBuffer();
+ query = createPQExpBuffer();
+
+ qsubname = pg_strdup(fmtId(subinfo->dobj.name));
+
+ appendPQExpBuffer(delq, "DROP SUBSCRIPTION %s;\n",
+ qsubname);
+
+ appendPQExpBuffer(query, "CREATE SUBSCRIPTION %s CONNECTION ",
+ qsubname);
+ appendStringLiteralAH(query, subinfo->subconninfo, fout);
+
+ /* Build list of quoted publications and append them to query. */
+ if (!parsePGArray(subinfo->subpublications, &pubnames, &npubnames))
+ pg_fatal("could not parse %s array", "subpublications");
+
+ publications = createPQExpBuffer();
+ for (i = 0; i < npubnames; i++)
+ {
+ if (i > 0)
+ appendPQExpBufferStr(publications, ", ");
+
+ appendPQExpBufferStr(publications, fmtId(pubnames[i]));
+ }
+
+ appendPQExpBuffer(query, " PUBLICATION %s WITH (connect = false, slot_name = ", publications->data);
+ if (subinfo->subslotname)
+ appendStringLiteralAH(query, subinfo->subslotname, fout);
+ else
+ appendPQExpBufferStr(query, "NONE");
+
+ if (strcmp(subinfo->subbinary, "t") == 0)
+ appendPQExpBufferStr(query, ", binary = true");
+
+ if (strcmp(subinfo->substream, "f") != 0)
+ appendPQExpBufferStr(query, ", streaming = on");
+
+ if (strcmp(subinfo->subtwophasestate, two_phase_disabled) != 0)
+ appendPQExpBufferStr(query, ", two_phase = on");
+
+ if (strcmp(subinfo->subdisableonerr, "t") == 0)
+ appendPQExpBufferStr(query, ", disable_on_error = true");
+
+ if (strcmp(subinfo->subsynccommit, "off") != 0)
+ appendPQExpBuffer(query, ", synchronous_commit = %s", fmtId(subinfo->subsynccommit));
+
+ appendPQExpBufferStr(query, ");\n");
+
+ if (subinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, subinfo->dobj.catId, subinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = subinfo->dobj.name,
+ .owner = subinfo->rolname,
+ .description = "SUBSCRIPTION",
+ .section = SECTION_POST_DATA,
+ .createStmt = query->data,
+ .dropStmt = delq->data));
+
+ if (subinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "SUBSCRIPTION", qsubname,
+ NULL, subinfo->rolname,
+ subinfo->dobj.catId, 0, subinfo->dobj.dumpId);
+
+ if (subinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "SUBSCRIPTION", qsubname,
+ NULL, subinfo->rolname,
+ subinfo->dobj.catId, 0, subinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(publications);
+ if (pubnames)
+ free(pubnames);
+
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qsubname);
+}
+
+/*
+ * Given a "create query", append as many ALTER ... DEPENDS ON EXTENSION as
+ * the object needs.
+ */
+static void
+append_depends_on_extension(Archive *fout,
+ PQExpBuffer create,
+ const DumpableObject *dobj,
+ const char *catalog,
+ const char *keyword,
+ const char *objname)
+{
+ if (dobj->depends_on_ext)
+ {
+ char *nm;
+ PGresult *res;
+ PQExpBuffer query;
+ int ntups;
+ int i_extname;
+ int i;
+
+ /* dodge fmtId() non-reentrancy */
+ nm = pg_strdup(objname);
+
+ query = createPQExpBuffer();
+ appendPQExpBuffer(query,
+ "SELECT e.extname "
+ "FROM pg_catalog.pg_depend d, pg_catalog.pg_extension e "
+ "WHERE d.refobjid = e.oid AND classid = '%s'::pg_catalog.regclass "
+ "AND objid = '%u'::pg_catalog.oid AND deptype = 'x' "
+ "AND refclassid = 'pg_catalog.pg_extension'::pg_catalog.regclass",
+ catalog,
+ dobj->catId.oid);
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+ ntups = PQntuples(res);
+ i_extname = PQfnumber(res, "extname");
+ for (i = 0; i < ntups; i++)
+ {
+ appendPQExpBuffer(create, "ALTER %s %s DEPENDS ON EXTENSION %s;\n",
+ keyword, nm,
+ fmtId(PQgetvalue(res, i, i_extname)));
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+ pg_free(nm);
+ }
+}
+
+static Oid
+get_next_possible_free_pg_type_oid(Archive *fout, PQExpBuffer upgrade_query)
+{
+ /*
+ * If the old version didn't assign an array type, but the new version
+ * does, we must select an unused type OID to assign. This currently only
+ * happens for domains, when upgrading pre-v11 to v11 and up.
+ *
+ * Note: local state here is kind of ugly, but we must have some, since we
+ * mustn't choose the same unused OID more than once.
+ */
+ static Oid next_possible_free_oid = FirstNormalObjectId;
+ PGresult *res;
+ bool is_dup;
+
+ do
+ {
+ ++next_possible_free_oid;
+ printfPQExpBuffer(upgrade_query,
+ "SELECT EXISTS(SELECT 1 "
+ "FROM pg_catalog.pg_type "
+ "WHERE oid = '%u'::pg_catalog.oid);",
+ next_possible_free_oid);
+ res = ExecuteSqlQueryForSingleRow(fout, upgrade_query->data);
+ is_dup = (PQgetvalue(res, 0, 0)[0] == 't');
+ PQclear(res);
+ } while (is_dup);
+
+ return next_possible_free_oid;
+}
+
+static void
+binary_upgrade_set_type_oids_by_type_oid(Archive *fout,
+ PQExpBuffer upgrade_buffer,
+ Oid pg_type_oid,
+ bool force_array_type,
+ bool include_multirange_type)
+{
+ PQExpBuffer upgrade_query = createPQExpBuffer();
+ PGresult *res;
+ Oid pg_type_array_oid;
+ Oid pg_type_multirange_oid;
+ Oid pg_type_multirange_array_oid;
+
+ appendPQExpBufferStr(upgrade_buffer, "\n-- For binary upgrade, must preserve pg_type oid\n");
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_pg_type_oid('%u'::pg_catalog.oid);\n\n",
+ pg_type_oid);
+
+ appendPQExpBuffer(upgrade_query,
+ "SELECT typarray "
+ "FROM pg_catalog.pg_type "
+ "WHERE oid = '%u'::pg_catalog.oid;",
+ pg_type_oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, upgrade_query->data);
+
+ pg_type_array_oid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typarray")));
+
+ PQclear(res);
+
+ if (!OidIsValid(pg_type_array_oid) && force_array_type)
+ pg_type_array_oid = get_next_possible_free_pg_type_oid(fout, upgrade_query);
+
+ if (OidIsValid(pg_type_array_oid))
+ {
+ appendPQExpBufferStr(upgrade_buffer,
+ "\n-- For binary upgrade, must preserve pg_type array oid\n");
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_array_pg_type_oid('%u'::pg_catalog.oid);\n\n",
+ pg_type_array_oid);
+ }
+
+ /*
+ * Pre-set the multirange type oid and its own array type oid.
+ */
+ if (include_multirange_type)
+ {
+ if (fout->remoteVersion >= 140000)
+ {
+ printfPQExpBuffer(upgrade_query,
+ "SELECT t.oid, t.typarray "
+ "FROM pg_catalog.pg_type t "
+ "JOIN pg_catalog.pg_range r "
+ "ON t.oid = r.rngmultitypid "
+ "WHERE r.rngtypid = '%u'::pg_catalog.oid;",
+ pg_type_oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, upgrade_query->data);
+
+ pg_type_multirange_oid = atooid(PQgetvalue(res, 0, PQfnumber(res, "oid")));
+ pg_type_multirange_array_oid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typarray")));
+
+ PQclear(res);
+ }
+ else
+ {
+ pg_type_multirange_oid = get_next_possible_free_pg_type_oid(fout, upgrade_query);
+ pg_type_multirange_array_oid = get_next_possible_free_pg_type_oid(fout, upgrade_query);
+ }
+
+ appendPQExpBufferStr(upgrade_buffer,
+ "\n-- For binary upgrade, must preserve multirange pg_type oid\n");
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_multirange_pg_type_oid('%u'::pg_catalog.oid);\n\n",
+ pg_type_multirange_oid);
+ appendPQExpBufferStr(upgrade_buffer,
+ "\n-- For binary upgrade, must preserve multirange pg_type array oid\n");
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_multirange_array_pg_type_oid('%u'::pg_catalog.oid);\n\n",
+ pg_type_multirange_array_oid);
+ }
+
+ destroyPQExpBuffer(upgrade_query);
+}
+
+static void
+binary_upgrade_set_type_oids_by_rel(Archive *fout,
+ PQExpBuffer upgrade_buffer,
+ const TableInfo *tbinfo)
+{
+ Oid pg_type_oid = tbinfo->reltype;
+
+ if (OidIsValid(pg_type_oid))
+ binary_upgrade_set_type_oids_by_type_oid(fout, upgrade_buffer,
+ pg_type_oid, false, false);
+}
+
+static void
+binary_upgrade_set_pg_class_oids(Archive *fout,
+ PQExpBuffer upgrade_buffer, Oid pg_class_oid,
+ bool is_index)
+{
+ PQExpBuffer upgrade_query = createPQExpBuffer();
+ PGresult *upgrade_res;
+ Oid relfilenode;
+ Oid toast_oid;
+ Oid toast_relfilenode;
+ char relkind;
+ Oid toast_index_oid;
+ Oid toast_index_relfilenode;
+
+ /*
+ * Preserve the OID and relfilenode of the table, table's index, table's
+ * toast table and toast table's index if any.
+ *
+ * One complexity is that the current table definition might not require
+ * the creation of a TOAST table, but the old database might have a TOAST
+ * table that was created earlier, before some wide columns were dropped.
+ * By setting the TOAST oid we force creation of the TOAST heap and index
+ * by the new backend, so we can copy the files during binary upgrade
+ * without worrying about this case.
+ */
+ appendPQExpBuffer(upgrade_query,
+ "SELECT c.relkind, c.relfilenode, c.reltoastrelid, ct.relfilenode AS toast_relfilenode, i.indexrelid, cti.relfilenode AS toast_index_relfilenode "
+ "FROM pg_catalog.pg_class c LEFT JOIN "
+ "pg_catalog.pg_index i ON (c.reltoastrelid = i.indrelid AND i.indisvalid) "
+ "LEFT JOIN pg_catalog.pg_class ct ON (c.reltoastrelid = ct.oid) "
+ "LEFT JOIN pg_catalog.pg_class AS cti ON (i.indexrelid = cti.oid) "
+ "WHERE c.oid = '%u'::pg_catalog.oid;",
+ pg_class_oid);
+
+ upgrade_res = ExecuteSqlQueryForSingleRow(fout, upgrade_query->data);
+
+ relkind = *PQgetvalue(upgrade_res, 0, PQfnumber(upgrade_res, "relkind"));
+
+ relfilenode = atooid(PQgetvalue(upgrade_res, 0,
+ PQfnumber(upgrade_res, "relfilenode")));
+ toast_oid = atooid(PQgetvalue(upgrade_res, 0,
+ PQfnumber(upgrade_res, "reltoastrelid")));
+ toast_relfilenode = atooid(PQgetvalue(upgrade_res, 0,
+ PQfnumber(upgrade_res, "toast_relfilenode")));
+ toast_index_oid = atooid(PQgetvalue(upgrade_res, 0,
+ PQfnumber(upgrade_res, "indexrelid")));
+ toast_index_relfilenode = atooid(PQgetvalue(upgrade_res, 0,
+ PQfnumber(upgrade_res, "toast_index_relfilenode")));
+
+ appendPQExpBufferStr(upgrade_buffer,
+ "\n-- For binary upgrade, must preserve pg_class oids and relfilenodes\n");
+
+ if (!is_index)
+ {
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_heap_pg_class_oid('%u'::pg_catalog.oid);\n",
+ pg_class_oid);
+
+ /*
+ * Not every relation has storage. Also, in a pre-v12 database,
+ * partitioned tables have a relfilenode, which should not be
+ * preserved when upgrading.
+ */
+ if (OidIsValid(relfilenode) && relkind != RELKIND_PARTITIONED_TABLE)
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_heap_relfilenode('%u'::pg_catalog.oid);\n",
+ relfilenode);
+
+ /*
+ * In a pre-v12 database, partitioned tables might be marked as having
+ * toast tables, but we should ignore them if so.
+ */
+ if (OidIsValid(toast_oid) &&
+ relkind != RELKIND_PARTITIONED_TABLE)
+ {
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_toast_pg_class_oid('%u'::pg_catalog.oid);\n",
+ toast_oid);
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_toast_relfilenode('%u'::pg_catalog.oid);\n",
+ toast_relfilenode);
+
+ /* every toast table has an index */
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_index_pg_class_oid('%u'::pg_catalog.oid);\n",
+ toast_index_oid);
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_index_relfilenode('%u'::pg_catalog.oid);\n",
+ toast_index_relfilenode);
+ }
+
+ PQclear(upgrade_res);
+ }
+ else
+ {
+ /* Preserve the OID and relfilenode of the index */
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_index_pg_class_oid('%u'::pg_catalog.oid);\n",
+ pg_class_oid);
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_index_relfilenode('%u'::pg_catalog.oid);\n",
+ relfilenode);
+ }
+
+ appendPQExpBufferChar(upgrade_buffer, '\n');
+
+ destroyPQExpBuffer(upgrade_query);
+}
+
+/*
+ * If the DumpableObject is a member of an extension, add a suitable
+ * ALTER EXTENSION ADD command to the creation commands in upgrade_buffer.
+ *
+ * For somewhat historical reasons, objname should already be quoted,
+ * but not objnamespace (if any).
+ */
+static void
+binary_upgrade_extension_member(PQExpBuffer upgrade_buffer,
+ const DumpableObject *dobj,
+ const char *objtype,
+ const char *objname,
+ const char *objnamespace)
+{
+ DumpableObject *extobj = NULL;
+ int i;
+
+ if (!dobj->ext_member)
+ return;
+
+ /*
+ * Find the parent extension. We could avoid this search if we wanted to
+ * add a link field to DumpableObject, but the space costs of that would
+ * be considerable. We assume that member objects could only have a
+ * direct dependency on their own extension, not any others.
+ */
+ for (i = 0; i < dobj->nDeps; i++)
+ {
+ extobj = findObjectByDumpId(dobj->dependencies[i]);
+ if (extobj && extobj->objType == DO_EXTENSION)
+ break;
+ extobj = NULL;
+ }
+ if (extobj == NULL)
+ pg_fatal("could not find parent extension for %s %s",
+ objtype, objname);
+
+ appendPQExpBufferStr(upgrade_buffer,
+ "\n-- For binary upgrade, handle extension membership the hard way\n");
+ appendPQExpBuffer(upgrade_buffer, "ALTER EXTENSION %s ADD %s ",
+ fmtId(extobj->name),
+ objtype);
+ if (objnamespace && *objnamespace)
+ appendPQExpBuffer(upgrade_buffer, "%s.", fmtId(objnamespace));
+ appendPQExpBuffer(upgrade_buffer, "%s;\n", objname);
+}
+
+/*
+ * getNamespaces:
+ * read all namespaces in the system catalogs and return them in the
+ * NamespaceInfo* structure
+ *
+ * numNamespaces is set to the number of namespaces read in
+ */
+NamespaceInfo *
+getNamespaces(Archive *fout, int *numNamespaces)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ NamespaceInfo *nsinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_nspname;
+ int i_nspowner;
+ int i_nspacl;
+ int i_acldefault;
+
+ query = createPQExpBuffer();
+
+ /*
+ * we fetch all namespaces including system ones, so that every object we
+ * read in can be linked to a containing namespace.
+ */
+ appendPQExpBuffer(query, "SELECT n.tableoid, n.oid, n.nspname, "
+ "n.nspowner, "
+ "n.nspacl, "
+ "acldefault('n', n.nspowner) AS acldefault "
+ "FROM pg_namespace n");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ nsinfo = (NamespaceInfo *) pg_malloc(ntups * sizeof(NamespaceInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_nspname = PQfnumber(res, "nspname");
+ i_nspowner = PQfnumber(res, "nspowner");
+ i_nspacl = PQfnumber(res, "nspacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+
+ for (i = 0; i < ntups; i++)
+ {
+ const char *nspowner;
+
+ nsinfo[i].dobj.objType = DO_NAMESPACE;
+ nsinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ nsinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&nsinfo[i].dobj);
+ nsinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_nspname));
+ nsinfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_nspacl));
+ nsinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ nsinfo[i].dacl.privtype = 0;
+ nsinfo[i].dacl.initprivs = NULL;
+ nspowner = PQgetvalue(res, i, i_nspowner);
+ nsinfo[i].nspowner = atooid(nspowner);
+ nsinfo[i].rolname = getRoleName(nspowner);
+
+ /* Decide whether to dump this namespace */
+ selectDumpableNamespace(&nsinfo[i], fout);
+
+ /* Mark whether namespace has an ACL */
+ if (!PQgetisnull(res, i, i_nspacl))
+ nsinfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+
+ /*
+ * We ignore any pg_init_privs.initprivs entry for the public schema
+ * and assume a predetermined default, for several reasons. First,
+ * dropping and recreating the schema removes its pg_init_privs entry,
+ * but an empty destination database starts with this ACL nonetheless.
+ * Second, we support dump/reload of public schema ownership changes.
+ * ALTER SCHEMA OWNER filters nspacl through aclnewowner(), but
+ * initprivs continues to reflect the initial owner. Hence,
+ * synthesize the value that nspacl will have after the restore's
+ * ALTER SCHEMA OWNER. Third, this makes the destination database
+ * match the source's ACL, even if the latter was an initdb-default
+ * ACL, which changed in v15. An upgrade pulls in changes to most
+ * system object ACLs that the DBA had not customized. We've made the
+ * public schema depart from that, because changing its ACL so easily
+ * breaks applications.
+ */
+ if (strcmp(nsinfo[i].dobj.name, "public") == 0)
+ {
+ PQExpBuffer aclarray = createPQExpBuffer();
+ PQExpBuffer aclitem = createPQExpBuffer();
+
+ /* Standard ACL as of v15 is {owner=UC/owner,=U/owner} */
+ appendPQExpBufferChar(aclarray, '{');
+ quoteAclUserName(aclitem, nsinfo[i].rolname);
+ appendPQExpBufferStr(aclitem, "=UC/");
+ quoteAclUserName(aclitem, nsinfo[i].rolname);
+ appendPGArray(aclarray, aclitem->data);
+ resetPQExpBuffer(aclitem);
+ appendPQExpBufferStr(aclitem, "=U/");
+ quoteAclUserName(aclitem, nsinfo[i].rolname);
+ appendPGArray(aclarray, aclitem->data);
+ appendPQExpBufferChar(aclarray, '}');
+
+ nsinfo[i].dacl.privtype = 'i';
+ nsinfo[i].dacl.initprivs = pstrdup(aclarray->data);
+ nsinfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+
+ destroyPQExpBuffer(aclarray);
+ destroyPQExpBuffer(aclitem);
+ }
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+
+ *numNamespaces = ntups;
+
+ return nsinfo;
+}
+
+/*
+ * findNamespace:
+ * given a namespace OID, look up the info read by getNamespaces
+ */
+static NamespaceInfo *
+findNamespace(Oid nsoid)
+{
+ NamespaceInfo *nsinfo;
+
+ nsinfo = findNamespaceByOid(nsoid);
+ if (nsinfo == NULL)
+ pg_fatal("schema with OID %u does not exist", nsoid);
+ return nsinfo;
+}
+
+/*
+ * getExtensions:
+ * read all extensions in the system catalogs and return them in the
+ * ExtensionInfo* structure
+ *
+ * numExtensions is set to the number of extensions read in
+ */
+ExtensionInfo *
+getExtensions(Archive *fout, int *numExtensions)
+{
+ DumpOptions *dopt = fout->dopt;
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ ExtensionInfo *extinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_extname;
+ int i_nspname;
+ int i_extrelocatable;
+ int i_extversion;
+ int i_extconfig;
+ int i_extcondition;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query, "SELECT x.tableoid, x.oid, "
+ "x.extname, n.nspname, x.extrelocatable, x.extversion, x.extconfig, x.extcondition "
+ "FROM pg_extension x "
+ "JOIN pg_namespace n ON n.oid = x.extnamespace");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ extinfo = (ExtensionInfo *) pg_malloc(ntups * sizeof(ExtensionInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_extname = PQfnumber(res, "extname");
+ i_nspname = PQfnumber(res, "nspname");
+ i_extrelocatable = PQfnumber(res, "extrelocatable");
+ i_extversion = PQfnumber(res, "extversion");
+ i_extconfig = PQfnumber(res, "extconfig");
+ i_extcondition = PQfnumber(res, "extcondition");
+
+ for (i = 0; i < ntups; i++)
+ {
+ extinfo[i].dobj.objType = DO_EXTENSION;
+ extinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ extinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&extinfo[i].dobj);
+ extinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_extname));
+ extinfo[i].namespace = pg_strdup(PQgetvalue(res, i, i_nspname));
+ extinfo[i].relocatable = *(PQgetvalue(res, i, i_extrelocatable)) == 't';
+ extinfo[i].extversion = pg_strdup(PQgetvalue(res, i, i_extversion));
+ extinfo[i].extconfig = pg_strdup(PQgetvalue(res, i, i_extconfig));
+ extinfo[i].extcondition = pg_strdup(PQgetvalue(res, i, i_extcondition));
+
+ /* Decide whether we want to dump it */
+ selectDumpableExtension(&(extinfo[i]), dopt);
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+
+ *numExtensions = ntups;
+
+ return extinfo;
+}
+
+/*
+ * getTypes:
+ * read all types in the system catalogs and return them in the
+ * TypeInfo* structure
+ *
+ * numTypes is set to the number of types read in
+ *
+ * NB: this must run after getFuncs() because we assume we can do
+ * findFuncByOid().
+ */
+TypeInfo *
+getTypes(Archive *fout, int *numTypes)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ TypeInfo *tyinfo;
+ ShellTypeInfo *stinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_typname;
+ int i_typnamespace;
+ int i_typacl;
+ int i_acldefault;
+ int i_typowner;
+ int i_typelem;
+ int i_typrelid;
+ int i_typrelkind;
+ int i_typtype;
+ int i_typisdefined;
+ int i_isarray;
+
+ /*
+ * we include even the built-in types because those may be used as array
+ * elements by user-defined types
+ *
+ * we filter out the built-in types when we dump out the types
+ *
+ * same approach for undefined (shell) types and array types
+ *
+ * Note: as of 8.3 we can reliably detect whether a type is an
+ * auto-generated array type by checking the element type's typarray.
+ * (Before that the test is capable of generating false positives.) We
+ * still check for name beginning with '_', though, so as to avoid the
+ * cost of the subselect probe for all standard types. This would have to
+ * be revisited if the backend ever allows renaming of array types.
+ */
+ appendPQExpBuffer(query, "SELECT tableoid, oid, typname, "
+ "typnamespace, typacl, "
+ "acldefault('T', typowner) AS acldefault, "
+ "typowner, "
+ "typelem, typrelid, "
+ "CASE WHEN typrelid = 0 THEN ' '::\"char\" "
+ "ELSE (SELECT relkind FROM pg_class WHERE oid = typrelid) END AS typrelkind, "
+ "typtype, typisdefined, "
+ "typname[0] = '_' AND typelem != 0 AND "
+ "(SELECT typarray FROM pg_type te WHERE oid = pg_type.typelem) = oid AS isarray "
+ "FROM pg_type");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ tyinfo = (TypeInfo *) pg_malloc(ntups * sizeof(TypeInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_typname = PQfnumber(res, "typname");
+ i_typnamespace = PQfnumber(res, "typnamespace");
+ i_typacl = PQfnumber(res, "typacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+ i_typowner = PQfnumber(res, "typowner");
+ i_typelem = PQfnumber(res, "typelem");
+ i_typrelid = PQfnumber(res, "typrelid");
+ i_typrelkind = PQfnumber(res, "typrelkind");
+ i_typtype = PQfnumber(res, "typtype");
+ i_typisdefined = PQfnumber(res, "typisdefined");
+ i_isarray = PQfnumber(res, "isarray");
+
+ for (i = 0; i < ntups; i++)
+ {
+ tyinfo[i].dobj.objType = DO_TYPE;
+ tyinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ tyinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&tyinfo[i].dobj);
+ tyinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_typname));
+ tyinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_typnamespace)));
+ tyinfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_typacl));
+ tyinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ tyinfo[i].dacl.privtype = 0;
+ tyinfo[i].dacl.initprivs = NULL;
+ tyinfo[i].ftypname = NULL; /* may get filled later */
+ tyinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_typowner));
+ tyinfo[i].typelem = atooid(PQgetvalue(res, i, i_typelem));
+ tyinfo[i].typrelid = atooid(PQgetvalue(res, i, i_typrelid));
+ tyinfo[i].typrelkind = *PQgetvalue(res, i, i_typrelkind);
+ tyinfo[i].typtype = *PQgetvalue(res, i, i_typtype);
+ tyinfo[i].shellType = NULL;
+
+ if (strcmp(PQgetvalue(res, i, i_typisdefined), "t") == 0)
+ tyinfo[i].isDefined = true;
+ else
+ tyinfo[i].isDefined = false;
+
+ if (strcmp(PQgetvalue(res, i, i_isarray), "t") == 0)
+ tyinfo[i].isArray = true;
+ else
+ tyinfo[i].isArray = false;
+
+ if (tyinfo[i].typtype == 'm')
+ tyinfo[i].isMultirange = true;
+ else
+ tyinfo[i].isMultirange = false;
+
+ /* Decide whether we want to dump it */
+ selectDumpableType(&tyinfo[i], fout);
+
+ /* Mark whether type has an ACL */
+ if (!PQgetisnull(res, i, i_typacl))
+ tyinfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+
+ /*
+ * If it's a domain, fetch info about its constraints, if any
+ */
+ tyinfo[i].nDomChecks = 0;
+ tyinfo[i].domChecks = NULL;
+ if ((tyinfo[i].dobj.dump & DUMP_COMPONENT_DEFINITION) &&
+ tyinfo[i].typtype == TYPTYPE_DOMAIN)
+ getDomainConstraints(fout, &(tyinfo[i]));
+
+ /*
+ * If it's a base type, make a DumpableObject representing a shell
+ * definition of the type. We will need to dump that ahead of the I/O
+ * functions for the type. Similarly, range types need a shell
+ * definition in case they have a canonicalize function.
+ *
+ * Note: the shell type doesn't have a catId. You might think it
+ * should copy the base type's catId, but then it might capture the
+ * pg_depend entries for the type, which we don't want.
+ */
+ if ((tyinfo[i].dobj.dump & DUMP_COMPONENT_DEFINITION) &&
+ (tyinfo[i].typtype == TYPTYPE_BASE ||
+ tyinfo[i].typtype == TYPTYPE_RANGE))
+ {
+ stinfo = (ShellTypeInfo *) pg_malloc(sizeof(ShellTypeInfo));
+ stinfo->dobj.objType = DO_SHELL_TYPE;
+ stinfo->dobj.catId = nilCatalogId;
+ AssignDumpId(&stinfo->dobj);
+ stinfo->dobj.name = pg_strdup(tyinfo[i].dobj.name);
+ stinfo->dobj.namespace = tyinfo[i].dobj.namespace;
+ stinfo->baseType = &(tyinfo[i]);
+ tyinfo[i].shellType = stinfo;
+
+ /*
+ * Initially mark the shell type as not to be dumped. We'll only
+ * dump it if the I/O or canonicalize functions need to be dumped;
+ * this is taken care of while sorting dependencies.
+ */
+ stinfo->dobj.dump = DUMP_COMPONENT_NONE;
+ }
+ }
+
+ *numTypes = ntups;
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return tyinfo;
+}
+
+/*
+ * getOperators:
+ * read all operators in the system catalogs and return them in the
+ * OprInfo* structure
+ *
+ * numOprs is set to the number of operators read in
+ */
+OprInfo *
+getOperators(Archive *fout, int *numOprs)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ OprInfo *oprinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_oprname;
+ int i_oprnamespace;
+ int i_oprowner;
+ int i_oprkind;
+ int i_oprcode;
+
+ /*
+ * find all operators, including builtin operators; we filter out
+ * system-defined operators at dump-out time.
+ */
+
+ appendPQExpBuffer(query, "SELECT tableoid, oid, oprname, "
+ "oprnamespace, "
+ "oprowner, "
+ "oprkind, "
+ "oprcode::oid AS oprcode "
+ "FROM pg_operator");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numOprs = ntups;
+
+ oprinfo = (OprInfo *) pg_malloc(ntups * sizeof(OprInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_oprname = PQfnumber(res, "oprname");
+ i_oprnamespace = PQfnumber(res, "oprnamespace");
+ i_oprowner = PQfnumber(res, "oprowner");
+ i_oprkind = PQfnumber(res, "oprkind");
+ i_oprcode = PQfnumber(res, "oprcode");
+
+ for (i = 0; i < ntups; i++)
+ {
+ oprinfo[i].dobj.objType = DO_OPERATOR;
+ oprinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ oprinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&oprinfo[i].dobj);
+ oprinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_oprname));
+ oprinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_oprnamespace)));
+ oprinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_oprowner));
+ oprinfo[i].oprkind = (PQgetvalue(res, i, i_oprkind))[0];
+ oprinfo[i].oprcode = atooid(PQgetvalue(res, i, i_oprcode));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(oprinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return oprinfo;
+}
+
+/*
+ * getCollations:
+ * read all collations in the system catalogs and return them in the
+ * CollInfo* structure
+ *
+ * numCollations is set to the number of collations read in
+ */
+CollInfo *
+getCollations(Archive *fout, int *numCollations)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ CollInfo *collinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_collname;
+ int i_collnamespace;
+ int i_collowner;
+
+ query = createPQExpBuffer();
+
+ /*
+ * find all collations, including builtin collations; we filter out
+ * system-defined collations at dump-out time.
+ */
+
+ appendPQExpBuffer(query, "SELECT tableoid, oid, collname, "
+ "collnamespace, "
+ "collowner "
+ "FROM pg_collation");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numCollations = ntups;
+
+ collinfo = (CollInfo *) pg_malloc(ntups * sizeof(CollInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_collname = PQfnumber(res, "collname");
+ i_collnamespace = PQfnumber(res, "collnamespace");
+ i_collowner = PQfnumber(res, "collowner");
+
+ for (i = 0; i < ntups; i++)
+ {
+ collinfo[i].dobj.objType = DO_COLLATION;
+ collinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ collinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&collinfo[i].dobj);
+ collinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_collname));
+ collinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_collnamespace)));
+ collinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_collowner));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(collinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return collinfo;
+}
+
+/*
+ * getConversions:
+ * read all conversions in the system catalogs and return them in the
+ * ConvInfo* structure
+ *
+ * numConversions is set to the number of conversions read in
+ */
+ConvInfo *
+getConversions(Archive *fout, int *numConversions)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ ConvInfo *convinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_conname;
+ int i_connamespace;
+ int i_conowner;
+
+ query = createPQExpBuffer();
+
+ /*
+ * find all conversions, including builtin conversions; we filter out
+ * system-defined conversions at dump-out time.
+ */
+
+ appendPQExpBuffer(query, "SELECT tableoid, oid, conname, "
+ "connamespace, "
+ "conowner "
+ "FROM pg_conversion");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numConversions = ntups;
+
+ convinfo = (ConvInfo *) pg_malloc(ntups * sizeof(ConvInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_conname = PQfnumber(res, "conname");
+ i_connamespace = PQfnumber(res, "connamespace");
+ i_conowner = PQfnumber(res, "conowner");
+
+ for (i = 0; i < ntups; i++)
+ {
+ convinfo[i].dobj.objType = DO_CONVERSION;
+ convinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ convinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&convinfo[i].dobj);
+ convinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_conname));
+ convinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_connamespace)));
+ convinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_conowner));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(convinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return convinfo;
+}
+
+/*
+ * getAccessMethods:
+ * read all user-defined access methods in the system catalogs and return
+ * them in the AccessMethodInfo* structure
+ *
+ * numAccessMethods is set to the number of access methods read in
+ */
+AccessMethodInfo *
+getAccessMethods(Archive *fout, int *numAccessMethods)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ AccessMethodInfo *aminfo;
+ int i_tableoid;
+ int i_oid;
+ int i_amname;
+ int i_amhandler;
+ int i_amtype;
+
+ /* Before 9.6, there are no user-defined access methods */
+ if (fout->remoteVersion < 90600)
+ {
+ *numAccessMethods = 0;
+ return NULL;
+ }
+
+ query = createPQExpBuffer();
+
+ /* Select all access methods from pg_am table */
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, amtype, "
+ "amhandler::pg_catalog.regproc AS amhandler "
+ "FROM pg_am");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numAccessMethods = ntups;
+
+ aminfo = (AccessMethodInfo *) pg_malloc(ntups * sizeof(AccessMethodInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_amname = PQfnumber(res, "amname");
+ i_amhandler = PQfnumber(res, "amhandler");
+ i_amtype = PQfnumber(res, "amtype");
+
+ for (i = 0; i < ntups; i++)
+ {
+ aminfo[i].dobj.objType = DO_ACCESS_METHOD;
+ aminfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ aminfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&aminfo[i].dobj);
+ aminfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_amname));
+ aminfo[i].dobj.namespace = NULL;
+ aminfo[i].amhandler = pg_strdup(PQgetvalue(res, i, i_amhandler));
+ aminfo[i].amtype = *(PQgetvalue(res, i, i_amtype));
+
+ /* Decide whether we want to dump it */
+ selectDumpableAccessMethod(&(aminfo[i]), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return aminfo;
+}
+
+
+/*
+ * getOpclasses:
+ * read all opclasses in the system catalogs and return them in the
+ * OpclassInfo* structure
+ *
+ * numOpclasses is set to the number of opclasses read in
+ */
+OpclassInfo *
+getOpclasses(Archive *fout, int *numOpclasses)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ OpclassInfo *opcinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_opcname;
+ int i_opcnamespace;
+ int i_opcowner;
+
+ /*
+ * find all opclasses, including builtin opclasses; we filter out
+ * system-defined opclasses at dump-out time.
+ */
+
+ appendPQExpBuffer(query, "SELECT tableoid, oid, opcname, "
+ "opcnamespace, "
+ "opcowner "
+ "FROM pg_opclass");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numOpclasses = ntups;
+
+ opcinfo = (OpclassInfo *) pg_malloc(ntups * sizeof(OpclassInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_opcname = PQfnumber(res, "opcname");
+ i_opcnamespace = PQfnumber(res, "opcnamespace");
+ i_opcowner = PQfnumber(res, "opcowner");
+
+ for (i = 0; i < ntups; i++)
+ {
+ opcinfo[i].dobj.objType = DO_OPCLASS;
+ opcinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ opcinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&opcinfo[i].dobj);
+ opcinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opcname));
+ opcinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_opcnamespace)));
+ opcinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opcowner));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(opcinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return opcinfo;
+}
+
+/*
+ * getOpfamilies:
+ * read all opfamilies in the system catalogs and return them in the
+ * OpfamilyInfo* structure
+ *
+ * numOpfamilies is set to the number of opfamilies read in
+ */
+OpfamilyInfo *
+getOpfamilies(Archive *fout, int *numOpfamilies)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ OpfamilyInfo *opfinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_opfname;
+ int i_opfnamespace;
+ int i_opfowner;
+
+ query = createPQExpBuffer();
+
+ /*
+ * find all opfamilies, including builtin opfamilies; we filter out
+ * system-defined opfamilies at dump-out time.
+ */
+
+ appendPQExpBuffer(query, "SELECT tableoid, oid, opfname, "
+ "opfnamespace, "
+ "opfowner "
+ "FROM pg_opfamily");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numOpfamilies = ntups;
+
+ opfinfo = (OpfamilyInfo *) pg_malloc(ntups * sizeof(OpfamilyInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_opfname = PQfnumber(res, "opfname");
+ i_opfnamespace = PQfnumber(res, "opfnamespace");
+ i_opfowner = PQfnumber(res, "opfowner");
+
+ for (i = 0; i < ntups; i++)
+ {
+ opfinfo[i].dobj.objType = DO_OPFAMILY;
+ opfinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ opfinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&opfinfo[i].dobj);
+ opfinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opfname));
+ opfinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_opfnamespace)));
+ opfinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opfowner));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(opfinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return opfinfo;
+}
+
+/*
+ * getAggregates:
+ * read all the user-defined aggregates in the system catalogs and
+ * return them in the AggInfo* structure
+ *
+ * numAggs is set to the number of aggregates read in
+ */
+AggInfo *
+getAggregates(Archive *fout, int *numAggs)
+{
+ DumpOptions *dopt = fout->dopt;
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ AggInfo *agginfo;
+ int i_tableoid;
+ int i_oid;
+ int i_aggname;
+ int i_aggnamespace;
+ int i_pronargs;
+ int i_proargtypes;
+ int i_proowner;
+ int i_aggacl;
+ int i_acldefault;
+
+ /*
+ * Find all interesting aggregates. See comment in getFuncs() for the
+ * rationale behind the filtering logic.
+ */
+ if (fout->remoteVersion >= 90600)
+ {
+ const char *agg_check;
+
+ agg_check = (fout->remoteVersion >= 110000 ? "p.prokind = 'a'"
+ : "p.proisagg");
+
+ appendPQExpBuffer(query, "SELECT p.tableoid, p.oid, "
+ "p.proname AS aggname, "
+ "p.pronamespace AS aggnamespace, "
+ "p.pronargs, p.proargtypes, "
+ "p.proowner, "
+ "p.proacl AS aggacl, "
+ "acldefault('f', p.proowner) AS acldefault "
+ "FROM pg_proc p "
+ "LEFT JOIN pg_init_privs pip ON "
+ "(p.oid = pip.objoid "
+ "AND pip.classoid = 'pg_proc'::regclass "
+ "AND pip.objsubid = 0) "
+ "WHERE %s AND ("
+ "p.pronamespace != "
+ "(SELECT oid FROM pg_namespace "
+ "WHERE nspname = 'pg_catalog') OR "
+ "p.proacl IS DISTINCT FROM pip.initprivs",
+ agg_check);
+ if (dopt->binary_upgrade)
+ appendPQExpBufferStr(query,
+ " OR EXISTS(SELECT 1 FROM pg_depend WHERE "
+ "classid = 'pg_proc'::regclass AND "
+ "objid = p.oid AND "
+ "refclassid = 'pg_extension'::regclass AND "
+ "deptype = 'e')");
+ appendPQExpBufferChar(query, ')');
+ }
+ else
+ {
+ appendPQExpBuffer(query, "SELECT tableoid, oid, proname AS aggname, "
+ "pronamespace AS aggnamespace, "
+ "pronargs, proargtypes, "
+ "proowner, "
+ "proacl AS aggacl, "
+ "acldefault('f', proowner) AS acldefault "
+ "FROM pg_proc p "
+ "WHERE proisagg AND ("
+ "pronamespace != "
+ "(SELECT oid FROM pg_namespace "
+ "WHERE nspname = 'pg_catalog')");
+ if (dopt->binary_upgrade)
+ appendPQExpBufferStr(query,
+ " OR EXISTS(SELECT 1 FROM pg_depend WHERE "
+ "classid = 'pg_proc'::regclass AND "
+ "objid = p.oid AND "
+ "refclassid = 'pg_extension'::regclass AND "
+ "deptype = 'e')");
+ appendPQExpBufferChar(query, ')');
+ }
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numAggs = ntups;
+
+ agginfo = (AggInfo *) pg_malloc(ntups * sizeof(AggInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_aggname = PQfnumber(res, "aggname");
+ i_aggnamespace = PQfnumber(res, "aggnamespace");
+ i_pronargs = PQfnumber(res, "pronargs");
+ i_proargtypes = PQfnumber(res, "proargtypes");
+ i_proowner = PQfnumber(res, "proowner");
+ i_aggacl = PQfnumber(res, "aggacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+
+ for (i = 0; i < ntups; i++)
+ {
+ agginfo[i].aggfn.dobj.objType = DO_AGG;
+ agginfo[i].aggfn.dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ agginfo[i].aggfn.dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&agginfo[i].aggfn.dobj);
+ agginfo[i].aggfn.dobj.name = pg_strdup(PQgetvalue(res, i, i_aggname));
+ agginfo[i].aggfn.dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_aggnamespace)));
+ agginfo[i].aggfn.dacl.acl = pg_strdup(PQgetvalue(res, i, i_aggacl));
+ agginfo[i].aggfn.dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ agginfo[i].aggfn.dacl.privtype = 0;
+ agginfo[i].aggfn.dacl.initprivs = NULL;
+ agginfo[i].aggfn.rolname = getRoleName(PQgetvalue(res, i, i_proowner));
+ agginfo[i].aggfn.lang = InvalidOid; /* not currently interesting */
+ agginfo[i].aggfn.prorettype = InvalidOid; /* not saved */
+ agginfo[i].aggfn.nargs = atoi(PQgetvalue(res, i, i_pronargs));
+ if (agginfo[i].aggfn.nargs == 0)
+ agginfo[i].aggfn.argtypes = NULL;
+ else
+ {
+ agginfo[i].aggfn.argtypes = (Oid *) pg_malloc(agginfo[i].aggfn.nargs * sizeof(Oid));
+ parseOidArray(PQgetvalue(res, i, i_proargtypes),
+ agginfo[i].aggfn.argtypes,
+ agginfo[i].aggfn.nargs);
+ }
+ agginfo[i].aggfn.postponed_def = false; /* might get set during sort */
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(agginfo[i].aggfn.dobj), fout);
+
+ /* Mark whether aggregate has an ACL */
+ if (!PQgetisnull(res, i, i_aggacl))
+ agginfo[i].aggfn.dobj.components |= DUMP_COMPONENT_ACL;
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return agginfo;
+}
+
+/*
+ * getFuncs:
+ * read all the user-defined functions in the system catalogs and
+ * return them in the FuncInfo* structure
+ *
+ * numFuncs is set to the number of functions read in
+ */
+FuncInfo *
+getFuncs(Archive *fout, int *numFuncs)
+{
+ DumpOptions *dopt = fout->dopt;
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ FuncInfo *finfo;
+ int i_tableoid;
+ int i_oid;
+ int i_proname;
+ int i_pronamespace;
+ int i_proowner;
+ int i_prolang;
+ int i_pronargs;
+ int i_proargtypes;
+ int i_prorettype;
+ int i_proacl;
+ int i_acldefault;
+
+ /*
+ * Find all interesting functions. This is a bit complicated:
+ *
+ * 1. Always exclude aggregates; those are handled elsewhere.
+ *
+ * 2. Always exclude functions that are internally dependent on something
+ * else, since presumably those will be created as a result of creating
+ * the something else. This currently acts only to suppress constructor
+ * functions for range types. Note this is OK only because the
+ * constructors don't have any dependencies the range type doesn't have;
+ * otherwise we might not get creation ordering correct.
+ *
+ * 3. Otherwise, we normally exclude functions in pg_catalog. However, if
+ * they're members of extensions and we are in binary-upgrade mode then
+ * include them, since we want to dump extension members individually in
+ * that mode. Also, if they are used by casts or transforms then we need
+ * to gather the information about them, though they won't be dumped if
+ * they are built-in. Also, in 9.6 and up, include functions in
+ * pg_catalog if they have an ACL different from what's shown in
+ * pg_init_privs (so we have to join to pg_init_privs; annoying).
+ */
+ if (fout->remoteVersion >= 90600)
+ {
+ const char *not_agg_check;
+
+ not_agg_check = (fout->remoteVersion >= 110000 ? "p.prokind <> 'a'"
+ : "NOT p.proisagg");
+
+ appendPQExpBuffer(query,
+ "SELECT p.tableoid, p.oid, p.proname, p.prolang, "
+ "p.pronargs, p.proargtypes, p.prorettype, "
+ "p.proacl, "
+ "acldefault('f', p.proowner) AS acldefault, "
+ "p.pronamespace, "
+ "p.proowner "
+ "FROM pg_proc p "
+ "LEFT JOIN pg_init_privs pip ON "
+ "(p.oid = pip.objoid "
+ "AND pip.classoid = 'pg_proc'::regclass "
+ "AND pip.objsubid = 0) "
+ "WHERE %s"
+ "\n AND NOT EXISTS (SELECT 1 FROM pg_depend "
+ "WHERE classid = 'pg_proc'::regclass AND "
+ "objid = p.oid AND deptype = 'i')"
+ "\n AND ("
+ "\n pronamespace != "
+ "(SELECT oid FROM pg_namespace "
+ "WHERE nspname = 'pg_catalog')"
+ "\n OR EXISTS (SELECT 1 FROM pg_cast"
+ "\n WHERE pg_cast.oid > %u "
+ "\n AND p.oid = pg_cast.castfunc)"
+ "\n OR EXISTS (SELECT 1 FROM pg_transform"
+ "\n WHERE pg_transform.oid > %u AND "
+ "\n (p.oid = pg_transform.trffromsql"
+ "\n OR p.oid = pg_transform.trftosql))",
+ not_agg_check,
+ g_last_builtin_oid,
+ g_last_builtin_oid);
+ if (dopt->binary_upgrade)
+ appendPQExpBufferStr(query,
+ "\n OR EXISTS(SELECT 1 FROM pg_depend WHERE "
+ "classid = 'pg_proc'::regclass AND "
+ "objid = p.oid AND "
+ "refclassid = 'pg_extension'::regclass AND "
+ "deptype = 'e')");
+ appendPQExpBufferStr(query,
+ "\n OR p.proacl IS DISTINCT FROM pip.initprivs");
+ appendPQExpBufferChar(query, ')');
+ }
+ else
+ {
+ appendPQExpBuffer(query,
+ "SELECT tableoid, oid, proname, prolang, "
+ "pronargs, proargtypes, prorettype, proacl, "
+ "acldefault('f', proowner) AS acldefault, "
+ "pronamespace, "
+ "proowner "
+ "FROM pg_proc p "
+ "WHERE NOT proisagg"
+ "\n AND NOT EXISTS (SELECT 1 FROM pg_depend "
+ "WHERE classid = 'pg_proc'::regclass AND "
+ "objid = p.oid AND deptype = 'i')"
+ "\n AND ("
+ "\n pronamespace != "
+ "(SELECT oid FROM pg_namespace "
+ "WHERE nspname = 'pg_catalog')"
+ "\n OR EXISTS (SELECT 1 FROM pg_cast"
+ "\n WHERE pg_cast.oid > '%u'::oid"
+ "\n AND p.oid = pg_cast.castfunc)",
+ g_last_builtin_oid);
+
+ if (fout->remoteVersion >= 90500)
+ appendPQExpBuffer(query,
+ "\n OR EXISTS (SELECT 1 FROM pg_transform"
+ "\n WHERE pg_transform.oid > '%u'::oid"
+ "\n AND (p.oid = pg_transform.trffromsql"
+ "\n OR p.oid = pg_transform.trftosql))",
+ g_last_builtin_oid);
+
+ if (dopt->binary_upgrade)
+ appendPQExpBufferStr(query,
+ "\n OR EXISTS(SELECT 1 FROM pg_depend WHERE "
+ "classid = 'pg_proc'::regclass AND "
+ "objid = p.oid AND "
+ "refclassid = 'pg_extension'::regclass AND "
+ "deptype = 'e')");
+ appendPQExpBufferChar(query, ')');
+ }
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ *numFuncs = ntups;
+
+ finfo = (FuncInfo *) pg_malloc0(ntups * sizeof(FuncInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_proname = PQfnumber(res, "proname");
+ i_pronamespace = PQfnumber(res, "pronamespace");
+ i_proowner = PQfnumber(res, "proowner");
+ i_prolang = PQfnumber(res, "prolang");
+ i_pronargs = PQfnumber(res, "pronargs");
+ i_proargtypes = PQfnumber(res, "proargtypes");
+ i_prorettype = PQfnumber(res, "prorettype");
+ i_proacl = PQfnumber(res, "proacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+
+ for (i = 0; i < ntups; i++)
+ {
+ finfo[i].dobj.objType = DO_FUNC;
+ finfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ finfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&finfo[i].dobj);
+ finfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_proname));
+ finfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_pronamespace)));
+ finfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_proacl));
+ finfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ finfo[i].dacl.privtype = 0;
+ finfo[i].dacl.initprivs = NULL;
+ finfo[i].rolname = getRoleName(PQgetvalue(res, i, i_proowner));
+ finfo[i].lang = atooid(PQgetvalue(res, i, i_prolang));
+ finfo[i].prorettype = atooid(PQgetvalue(res, i, i_prorettype));
+ finfo[i].nargs = atoi(PQgetvalue(res, i, i_pronargs));
+ if (finfo[i].nargs == 0)
+ finfo[i].argtypes = NULL;
+ else
+ {
+ finfo[i].argtypes = (Oid *) pg_malloc(finfo[i].nargs * sizeof(Oid));
+ parseOidArray(PQgetvalue(res, i, i_proargtypes),
+ finfo[i].argtypes, finfo[i].nargs);
+ }
+ finfo[i].postponed_def = false; /* might get set during sort */
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(finfo[i].dobj), fout);
+
+ /* Mark whether function has an ACL */
+ if (!PQgetisnull(res, i, i_proacl))
+ finfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return finfo;
+}
+
+/*
+ * getTables
+ * read all the tables (no indexes) in the system catalogs,
+ * and return them as an array of TableInfo structures
+ *
+ * *numTables is set to the number of tables read in
+ */
+TableInfo *
+getTables(Archive *fout, int *numTables)
+{
+ DumpOptions *dopt = fout->dopt;
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ TableInfo *tblinfo;
+ int i_reltableoid;
+ int i_reloid;
+ int i_relname;
+ int i_relnamespace;
+ int i_relkind;
+ int i_reltype;
+ int i_relowner;
+ int i_relchecks;
+ int i_relhasindex;
+ int i_relhasrules;
+ int i_relpages;
+ int i_toastpages;
+ int i_owning_tab;
+ int i_owning_col;
+ int i_reltablespace;
+ int i_relhasoids;
+ int i_relhastriggers;
+ int i_relpersistence;
+ int i_relispopulated;
+ int i_relreplident;
+ int i_relrowsec;
+ int i_relforcerowsec;
+ int i_relfrozenxid;
+ int i_toastfrozenxid;
+ int i_toastoid;
+ int i_relminmxid;
+ int i_toastminmxid;
+ int i_reloptions;
+ int i_checkoption;
+ int i_toastreloptions;
+ int i_reloftype;
+ int i_foreignserver;
+ int i_amname;
+ int i_is_identity_sequence;
+ int i_relacl;
+ int i_acldefault;
+ int i_ispartition;
+
+ /*
+ * Find all the tables and table-like objects.
+ *
+ * We must fetch all tables in this phase because otherwise we cannot
+ * correctly identify inherited columns, owned sequences, etc.
+ *
+ * We include system catalogs, so that we can work if a user table is
+ * defined to inherit from a system catalog (pretty weird, but...)
+ *
+ * Note: in this phase we should collect only a minimal amount of
+ * information about each table, basically just enough to decide if it is
+ * interesting. In particular, since we do not yet have lock on any user
+ * table, we MUST NOT invoke any server-side data collection functions
+ * (for instance, pg_get_partkeydef()). Those are likely to fail or give
+ * wrong answers if any concurrent DDL is happening.
+ */
+
+ appendPQExpBuffer(query,
+ "SELECT c.tableoid, c.oid, c.relname, "
+ "c.relnamespace, c.relkind, c.reltype, "
+ "c.relowner, "
+ "c.relchecks, "
+ "c.relhasindex, c.relhasrules, c.relpages, "
+ "c.relhastriggers, "
+ "c.relpersistence, "
+ "c.reloftype, "
+ "c.relacl, "
+ "acldefault(CASE WHEN c.relkind = " CppAsString2(RELKIND_SEQUENCE)
+ " THEN 's'::\"char\" ELSE 'r'::\"char\" END, c.relowner) AS acldefault, "
+ "CASE WHEN c.relkind = " CppAsString2(RELKIND_FOREIGN_TABLE) " THEN "
+ "(SELECT ftserver FROM pg_catalog.pg_foreign_table WHERE ftrelid = c.oid) "
+ "ELSE 0 END AS foreignserver, "
+ "c.relfrozenxid, tc.relfrozenxid AS tfrozenxid, "
+ "tc.oid AS toid, "
+ "tc.relpages AS toastpages, "
+ "tc.reloptions AS toast_reloptions, "
+ "d.refobjid AS owning_tab, "
+ "d.refobjsubid AS owning_col, "
+ "tsp.spcname AS reltablespace, ");
+
+ if (fout->remoteVersion >= 120000)
+ appendPQExpBufferStr(query,
+ "false AS relhasoids, ");
+ else
+ appendPQExpBufferStr(query,
+ "c.relhasoids, ");
+
+ if (fout->remoteVersion >= 90300)
+ appendPQExpBufferStr(query,
+ "c.relispopulated, ");
+ else
+ appendPQExpBufferStr(query,
+ "'t' as relispopulated, ");
+
+ if (fout->remoteVersion >= 90400)
+ appendPQExpBufferStr(query,
+ "c.relreplident, ");
+ else
+ appendPQExpBufferStr(query,
+ "'d' AS relreplident, ");
+
+ if (fout->remoteVersion >= 90500)
+ appendPQExpBufferStr(query,
+ "c.relrowsecurity, c.relforcerowsecurity, ");
+ else
+ appendPQExpBufferStr(query,
+ "false AS relrowsecurity, "
+ "false AS relforcerowsecurity, ");
+
+ if (fout->remoteVersion >= 90300)
+ appendPQExpBufferStr(query,
+ "c.relminmxid, tc.relminmxid AS tminmxid, ");
+ else
+ appendPQExpBufferStr(query,
+ "0 AS relminmxid, 0 AS tminmxid, ");
+
+ if (fout->remoteVersion >= 90300)
+ appendPQExpBufferStr(query,
+ "array_remove(array_remove(c.reloptions,'check_option=local'),'check_option=cascaded') AS reloptions, "
+ "CASE WHEN 'check_option=local' = ANY (c.reloptions) THEN 'LOCAL'::text "
+ "WHEN 'check_option=cascaded' = ANY (c.reloptions) THEN 'CASCADED'::text ELSE NULL END AS checkoption, ");
+ else
+ appendPQExpBufferStr(query,
+ "c.reloptions, NULL AS checkoption, ");
+
+ if (fout->remoteVersion >= 90600)
+ appendPQExpBufferStr(query,
+ "am.amname, ");
+ else
+ appendPQExpBufferStr(query,
+ "NULL AS amname, ");
+
+ if (fout->remoteVersion >= 90600)
+ appendPQExpBufferStr(query,
+ "(d.deptype = 'i') IS TRUE AS is_identity_sequence, ");
+ else
+ appendPQExpBufferStr(query,
+ "false AS is_identity_sequence, ");
+
+ if (fout->remoteVersion >= 100000)
+ appendPQExpBufferStr(query,
+ "c.relispartition AS ispartition ");
+ else
+ appendPQExpBufferStr(query,
+ "false AS ispartition ");
+
+ /*
+ * Left join to pg_depend to pick up dependency info linking sequences to
+ * their owning column, if any (note this dependency is AUTO except for
+ * identity sequences, where it's INTERNAL). Also join to pg_tablespace to
+ * collect the spcname.
+ */
+ appendPQExpBufferStr(query,
+ "\nFROM pg_class c\n"
+ "LEFT JOIN pg_depend d ON "
+ "(c.relkind = " CppAsString2(RELKIND_SEQUENCE) " AND "
+ "d.classid = 'pg_class'::regclass AND d.objid = c.oid AND "
+ "d.objsubid = 0 AND "
+ "d.refclassid = 'pg_class'::regclass AND d.deptype IN ('a', 'i'))\n"
+ "LEFT JOIN pg_tablespace tsp ON (tsp.oid = c.reltablespace)\n");
+
+ /*
+ * In 9.6 and up, left join to pg_am to pick up the amname.
+ */
+ if (fout->remoteVersion >= 90600)
+ appendPQExpBufferStr(query,
+ "LEFT JOIN pg_am am ON (c.relam = am.oid)\n");
+
+ /*
+ * We purposefully ignore toast OIDs for partitioned tables; the reason is
+ * that versions 10 and 11 have them, but later versions do not, so
+ * emitting them causes the upgrade to fail.
+ */
+ appendPQExpBufferStr(query,
+ "LEFT JOIN pg_class tc ON (c.reltoastrelid = tc.oid"
+ " AND tc.relkind = " CppAsString2(RELKIND_TOASTVALUE)
+ " AND c.relkind <> " CppAsString2(RELKIND_PARTITIONED_TABLE) ")\n");
+
+ /*
+ * Restrict to interesting relkinds (in particular, not indexes). Not all
+ * relkinds are possible in older servers, but it's not worth the trouble
+ * to emit a version-dependent list.
+ *
+ * Composite-type table entries won't be dumped as such, but we have to
+ * make a DumpableObject for them so that we can track dependencies of the
+ * composite type (pg_depend entries for columns of the composite type
+ * link to the pg_class entry not the pg_type entry).
+ */
+ appendPQExpBufferStr(query,
+ "WHERE c.relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_SEQUENCE) ", "
+ CppAsString2(RELKIND_VIEW) ", "
+ CppAsString2(RELKIND_COMPOSITE_TYPE) ", "
+ CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_FOREIGN_TABLE) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ")\n"
+ "ORDER BY c.oid");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ *numTables = ntups;
+
+ /*
+ * Extract data from result and lock dumpable tables. We do the locking
+ * before anything else, to minimize the window wherein a table could
+ * disappear under us.
+ *
+ * Note that we have to save info about all tables here, even when dumping
+ * only one, because we don't yet know which tables might be inheritance
+ * ancestors of the target table.
+ */
+ tblinfo = (TableInfo *) pg_malloc0(ntups * sizeof(TableInfo));
+
+ i_reltableoid = PQfnumber(res, "tableoid");
+ i_reloid = PQfnumber(res, "oid");
+ i_relname = PQfnumber(res, "relname");
+ i_relnamespace = PQfnumber(res, "relnamespace");
+ i_relkind = PQfnumber(res, "relkind");
+ i_reltype = PQfnumber(res, "reltype");
+ i_relowner = PQfnumber(res, "relowner");
+ i_relchecks = PQfnumber(res, "relchecks");
+ i_relhasindex = PQfnumber(res, "relhasindex");
+ i_relhasrules = PQfnumber(res, "relhasrules");
+ i_relpages = PQfnumber(res, "relpages");
+ i_toastpages = PQfnumber(res, "toastpages");
+ i_owning_tab = PQfnumber(res, "owning_tab");
+ i_owning_col = PQfnumber(res, "owning_col");
+ i_reltablespace = PQfnumber(res, "reltablespace");
+ i_relhasoids = PQfnumber(res, "relhasoids");
+ i_relhastriggers = PQfnumber(res, "relhastriggers");
+ i_relpersistence = PQfnumber(res, "relpersistence");
+ i_relispopulated = PQfnumber(res, "relispopulated");
+ i_relreplident = PQfnumber(res, "relreplident");
+ i_relrowsec = PQfnumber(res, "relrowsecurity");
+ i_relforcerowsec = PQfnumber(res, "relforcerowsecurity");
+ i_relfrozenxid = PQfnumber(res, "relfrozenxid");
+ i_toastfrozenxid = PQfnumber(res, "tfrozenxid");
+ i_toastoid = PQfnumber(res, "toid");
+ i_relminmxid = PQfnumber(res, "relminmxid");
+ i_toastminmxid = PQfnumber(res, "tminmxid");
+ i_reloptions = PQfnumber(res, "reloptions");
+ i_checkoption = PQfnumber(res, "checkoption");
+ i_toastreloptions = PQfnumber(res, "toast_reloptions");
+ i_reloftype = PQfnumber(res, "reloftype");
+ i_foreignserver = PQfnumber(res, "foreignserver");
+ i_amname = PQfnumber(res, "amname");
+ i_is_identity_sequence = PQfnumber(res, "is_identity_sequence");
+ i_relacl = PQfnumber(res, "relacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+ i_ispartition = PQfnumber(res, "ispartition");
+
+ if (dopt->lockWaitTimeout)
+ {
+ /*
+ * Arrange to fail instead of waiting forever for a table lock.
+ *
+ * NB: this coding assumes that the only queries issued within the
+ * following loop are LOCK TABLEs; else the timeout may be undesirably
+ * applied to other things too.
+ */
+ resetPQExpBuffer(query);
+ appendPQExpBufferStr(query, "SET statement_timeout = ");
+ appendStringLiteralConn(query, dopt->lockWaitTimeout, GetConnection(fout));
+ ExecuteSqlStatement(fout, query->data);
+ }
+
+ for (i = 0; i < ntups; i++)
+ {
+ tblinfo[i].dobj.objType = DO_TABLE;
+ tblinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_reltableoid));
+ tblinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_reloid));
+ AssignDumpId(&tblinfo[i].dobj);
+ tblinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_relname));
+ tblinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_relnamespace)));
+ tblinfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_relacl));
+ tblinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ tblinfo[i].dacl.privtype = 0;
+ tblinfo[i].dacl.initprivs = NULL;
+ tblinfo[i].relkind = *(PQgetvalue(res, i, i_relkind));
+ tblinfo[i].reltype = atooid(PQgetvalue(res, i, i_reltype));
+ tblinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_relowner));
+ tblinfo[i].ncheck = atoi(PQgetvalue(res, i, i_relchecks));
+ tblinfo[i].hasindex = (strcmp(PQgetvalue(res, i, i_relhasindex), "t") == 0);
+ tblinfo[i].hasrules = (strcmp(PQgetvalue(res, i, i_relhasrules), "t") == 0);
+ tblinfo[i].relpages = atoi(PQgetvalue(res, i, i_relpages));
+ if (PQgetisnull(res, i, i_toastpages))
+ tblinfo[i].toastpages = 0;
+ else
+ tblinfo[i].toastpages = atoi(PQgetvalue(res, i, i_toastpages));
+ if (PQgetisnull(res, i, i_owning_tab))
+ {
+ tblinfo[i].owning_tab = InvalidOid;
+ tblinfo[i].owning_col = 0;
+ }
+ else
+ {
+ tblinfo[i].owning_tab = atooid(PQgetvalue(res, i, i_owning_tab));
+ tblinfo[i].owning_col = atoi(PQgetvalue(res, i, i_owning_col));
+ }
+ tblinfo[i].reltablespace = pg_strdup(PQgetvalue(res, i, i_reltablespace));
+ tblinfo[i].hasoids = (strcmp(PQgetvalue(res, i, i_relhasoids), "t") == 0);
+ tblinfo[i].hastriggers = (strcmp(PQgetvalue(res, i, i_relhastriggers), "t") == 0);
+ tblinfo[i].relpersistence = *(PQgetvalue(res, i, i_relpersistence));
+ tblinfo[i].relispopulated = (strcmp(PQgetvalue(res, i, i_relispopulated), "t") == 0);
+ tblinfo[i].relreplident = *(PQgetvalue(res, i, i_relreplident));
+ tblinfo[i].rowsec = (strcmp(PQgetvalue(res, i, i_relrowsec), "t") == 0);
+ tblinfo[i].forcerowsec = (strcmp(PQgetvalue(res, i, i_relforcerowsec), "t") == 0);
+ tblinfo[i].frozenxid = atooid(PQgetvalue(res, i, i_relfrozenxid));
+ tblinfo[i].toast_frozenxid = atooid(PQgetvalue(res, i, i_toastfrozenxid));
+ tblinfo[i].toast_oid = atooid(PQgetvalue(res, i, i_toastoid));
+ tblinfo[i].minmxid = atooid(PQgetvalue(res, i, i_relminmxid));
+ tblinfo[i].toast_minmxid = atooid(PQgetvalue(res, i, i_toastminmxid));
+ tblinfo[i].reloptions = pg_strdup(PQgetvalue(res, i, i_reloptions));
+ if (PQgetisnull(res, i, i_checkoption))
+ tblinfo[i].checkoption = NULL;
+ else
+ tblinfo[i].checkoption = pg_strdup(PQgetvalue(res, i, i_checkoption));
+ tblinfo[i].toast_reloptions = pg_strdup(PQgetvalue(res, i, i_toastreloptions));
+ tblinfo[i].reloftype = atooid(PQgetvalue(res, i, i_reloftype));
+ tblinfo[i].foreign_server = atooid(PQgetvalue(res, i, i_foreignserver));
+ if (PQgetisnull(res, i, i_amname))
+ tblinfo[i].amname = NULL;
+ else
+ tblinfo[i].amname = pg_strdup(PQgetvalue(res, i, i_amname));
+ tblinfo[i].is_identity_sequence = (strcmp(PQgetvalue(res, i, i_is_identity_sequence), "t") == 0);
+ tblinfo[i].ispartition = (strcmp(PQgetvalue(res, i, i_ispartition), "t") == 0);
+
+ /* other fields were zeroed above */
+
+ /*
+ * Decide whether we want to dump this table.
+ */
+ if (tblinfo[i].relkind == RELKIND_COMPOSITE_TYPE)
+ tblinfo[i].dobj.dump = DUMP_COMPONENT_NONE;
+ else
+ selectDumpableTable(&tblinfo[i], fout);
+
+ /*
+ * Now, consider the table "interesting" if we need to dump its
+ * definition or its data. Later on, we'll skip a lot of data
+ * collection for uninteresting tables.
+ *
+ * Note: the "interesting" flag will also be set by flagInhTables for
+ * parents of interesting tables, so that we collect necessary
+ * inheritance info even when the parents are not themselves being
+ * dumped. This is the main reason why we need an "interesting" flag
+ * that's separate from the components-to-dump bitmask.
+ */
+ tblinfo[i].interesting = (tblinfo[i].dobj.dump &
+ (DUMP_COMPONENT_DEFINITION |
+ DUMP_COMPONENT_DATA)) != 0;
+
+ tblinfo[i].dummy_view = false; /* might get set during sort */
+ tblinfo[i].postponed_def = false; /* might get set during sort */
+
+ /* Tables have data */
+ tblinfo[i].dobj.components |= DUMP_COMPONENT_DATA;
+
+ /* Mark whether table has an ACL */
+ if (!PQgetisnull(res, i, i_relacl))
+ tblinfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+ tblinfo[i].hascolumnACLs = false; /* may get set later */
+
+ /*
+ * Read-lock target tables to make sure they aren't DROPPED or altered
+ * in schema before we get around to dumping them.
+ *
+ * Note that we don't explicitly lock parents of the target tables; we
+ * assume our lock on the child is enough to prevent schema
+ * alterations to parent tables.
+ *
+ * NOTE: it'd be kinda nice to lock other relations too, not only
+ * plain or partitioned tables, but the backend doesn't presently
+ * allow that.
+ *
+ * We only need to lock the table for certain components; see
+ * pg_dump.h
+ */
+ if ((tblinfo[i].dobj.dump & DUMP_COMPONENTS_REQUIRING_LOCK) &&
+ (tblinfo[i].relkind == RELKIND_RELATION ||
+ tblinfo[i].relkind == RELKIND_PARTITIONED_TABLE))
+ {
+ resetPQExpBuffer(query);
+ appendPQExpBuffer(query,
+ "LOCK TABLE %s IN ACCESS SHARE MODE",
+ fmtQualifiedDumpable(&tblinfo[i]));
+ ExecuteSqlStatement(fout, query->data);
+ }
+ }
+
+ if (dopt->lockWaitTimeout)
+ {
+ ExecuteSqlStatement(fout, "SET statement_timeout = 0");
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return tblinfo;
+}
+
+/*
+ * getOwnedSeqs
+ * identify owned sequences and mark them as dumpable if owning table is
+ *
+ * We used to do this in getTables(), but it's better to do it after the
+ * index used by findTableByOid() has been set up.
+ */
+void
+getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables)
+{
+ int i;
+
+ /*
+ * Force sequences that are "owned" by table columns to be dumped whenever
+ * their owning table is being dumped.
+ */
+ for (i = 0; i < numTables; i++)
+ {
+ TableInfo *seqinfo = &tblinfo[i];
+ TableInfo *owning_tab;
+
+ if (!OidIsValid(seqinfo->owning_tab))
+ continue; /* not an owned sequence */
+
+ owning_tab = findTableByOid(seqinfo->owning_tab);
+ if (owning_tab == NULL)
+ pg_fatal("failed sanity check, parent table with OID %u of sequence with OID %u not found",
+ seqinfo->owning_tab, seqinfo->dobj.catId.oid);
+
+ /*
+ * Only dump identity sequences if we're going to dump the table that
+ * it belongs to.
+ */
+ if (owning_tab->dobj.dump == DUMP_COMPONENT_NONE &&
+ seqinfo->is_identity_sequence)
+ {
+ seqinfo->dobj.dump = DUMP_COMPONENT_NONE;
+ continue;
+ }
+
+ /*
+ * Otherwise we need to dump the components that are being dumped for
+ * the table and any components which the sequence is explicitly
+ * marked with.
+ *
+ * We can't simply use the set of components which are being dumped
+ * for the table as the table might be in an extension (and only the
+ * non-extension components, eg: ACLs if changed, security labels, and
+ * policies, are being dumped) while the sequence is not (and
+ * therefore the definition and other components should also be
+ * dumped).
+ *
+ * If the sequence is part of the extension then it should be properly
+ * marked by checkExtensionMembership() and this will be a no-op as
+ * the table will be equivalently marked.
+ */
+ seqinfo->dobj.dump = seqinfo->dobj.dump | owning_tab->dobj.dump;
+
+ if (seqinfo->dobj.dump != DUMP_COMPONENT_NONE)
+ seqinfo->interesting = true;
+ }
+}
+
+/*
+ * getInherits
+ * read all the inheritance information
+ * from the system catalogs return them in the InhInfo* structure
+ *
+ * numInherits is set to the number of pairs read in
+ */
+InhInfo *
+getInherits(Archive *fout, int *numInherits)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ InhInfo *inhinfo;
+
+ int i_inhrelid;
+ int i_inhparent;
+
+ /* find all the inheritance information */
+ appendPQExpBufferStr(query, "SELECT inhrelid, inhparent FROM pg_inherits");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ *numInherits = ntups;
+
+ inhinfo = (InhInfo *) pg_malloc(ntups * sizeof(InhInfo));
+
+ i_inhrelid = PQfnumber(res, "inhrelid");
+ i_inhparent = PQfnumber(res, "inhparent");
+
+ for (i = 0; i < ntups; i++)
+ {
+ inhinfo[i].inhrelid = atooid(PQgetvalue(res, i, i_inhrelid));
+ inhinfo[i].inhparent = atooid(PQgetvalue(res, i, i_inhparent));
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return inhinfo;
+}
+
+/*
+ * getPartitioningInfo
+ * get information about partitioning
+ *
+ * For the most part, we only collect partitioning info about tables we
+ * intend to dump. However, this function has to consider all partitioned
+ * tables in the database, because we need to know about parents of partitions
+ * we are going to dump even if the parents themselves won't be dumped.
+ *
+ * Specifically, what we need to know is whether each partitioned table
+ * has an "unsafe" partitioning scheme that requires us to force
+ * load-via-partition-root mode for its children. Currently the only case
+ * for which we force that is hash partitioning on enum columns, since the
+ * hash codes depend on enum value OIDs which won't be replicated across
+ * dump-and-reload. There are other cases in which load-via-partition-root
+ * might be necessary, but we expect users to cope with them.
+ */
+void
+getPartitioningInfo(Archive *fout)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ int ntups;
+
+ /* hash partitioning didn't exist before v11 */
+ if (fout->remoteVersion < 110000)
+ return;
+ /* needn't bother if schema-only dump */
+ if (fout->dopt->schemaOnly)
+ return;
+
+ query = createPQExpBuffer();
+
+ /*
+ * Unsafe partitioning schemes are exactly those for which hash enum_ops
+ * appears among the partition opclasses. We needn't check partstrat.
+ *
+ * Note that this query may well retrieve info about tables we aren't
+ * going to dump and hence have no lock on. That's okay since we need not
+ * invoke any unsafe server-side functions.
+ */
+ appendPQExpBufferStr(query,
+ "SELECT partrelid FROM pg_partitioned_table WHERE\n"
+ "(SELECT c.oid FROM pg_opclass c JOIN pg_am a "
+ "ON c.opcmethod = a.oid\n"
+ "WHERE opcname = 'enum_ops' "
+ "AND opcnamespace = 'pg_catalog'::regnamespace "
+ "AND amname = 'hash') = ANY(partclass)");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ for (int i = 0; i < ntups; i++)
+ {
+ Oid tabrelid = atooid(PQgetvalue(res, i, 0));
+ TableInfo *tbinfo;
+
+ tbinfo = findTableByOid(tabrelid);
+ if (tbinfo == NULL)
+ pg_fatal("failed sanity check, table OID %u appearing in pg_partitioned_table not found",
+ tabrelid);
+ tbinfo->unsafe_partitions = true;
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * getIndexes
+ * get information about every index on a dumpable table
+ *
+ * Note: index data is not returned directly to the caller, but it
+ * does get entered into the DumpableObject tables.
+ */
+void
+getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
+{
+ PQExpBuffer query = createPQExpBuffer();
+ PQExpBuffer tbloids = createPQExpBuffer();
+ PGresult *res;
+ int ntups;
+ int curtblindx;
+ IndxInfo *indxinfo;
+ int i_tableoid,
+ i_oid,
+ i_indrelid,
+ i_indexname,
+ i_parentidx,
+ i_indexdef,
+ i_indnkeyatts,
+ i_indnatts,
+ i_indkey,
+ i_indisclustered,
+ i_indisreplident,
+ i_indnullsnotdistinct,
+ i_contype,
+ i_conname,
+ i_condeferrable,
+ i_condeferred,
+ i_contableoid,
+ i_conoid,
+ i_condef,
+ i_tablespace,
+ i_indreloptions,
+ i_indstatcols,
+ i_indstatvals;
+
+ /*
+ * We want to perform just one query against pg_index. However, we
+ * mustn't try to select every row of the catalog and then sort it out on
+ * the client side, because some of the server-side functions we need
+ * would be unsafe to apply to tables we don't have lock on. Hence, we
+ * build an array of the OIDs of tables we care about (and now have lock
+ * on!), and use a WHERE clause to constrain which rows are selected.
+ */
+ appendPQExpBufferChar(tbloids, '{');
+ for (int i = 0; i < numTables; i++)
+ {
+ TableInfo *tbinfo = &tblinfo[i];
+
+ if (!tbinfo->hasindex)
+ continue;
+
+ /*
+ * We can ignore indexes of uninteresting tables.
+ */
+ if (!tbinfo->interesting)
+ continue;
+
+ /* OK, we need info for this table */
+ if (tbloids->len > 1) /* do we have more than the '{'? */
+ appendPQExpBufferChar(tbloids, ',');
+ appendPQExpBuffer(tbloids, "%u", tbinfo->dobj.catId.oid);
+ }
+ appendPQExpBufferChar(tbloids, '}');
+
+ appendPQExpBuffer(query,
+ "SELECT t.tableoid, t.oid, i.indrelid, "
+ "t.relname AS indexname, "
+ "pg_catalog.pg_get_indexdef(i.indexrelid) AS indexdef, "
+ "i.indkey, i.indisclustered, "
+ "c.contype, c.conname, "
+ "c.condeferrable, c.condeferred, "
+ "c.tableoid AS contableoid, "
+ "c.oid AS conoid, "
+ "pg_catalog.pg_get_constraintdef(c.oid, false) AS condef, "
+ "(SELECT spcname FROM pg_catalog.pg_tablespace s WHERE s.oid = t.reltablespace) AS tablespace, "
+ "t.reloptions AS indreloptions, ");
+
+
+ if (fout->remoteVersion >= 90400)
+ appendPQExpBuffer(query,
+ "i.indisreplident, ");
+ else
+ appendPQExpBuffer(query,
+ "false AS indisreplident, ");
+
+ if (fout->remoteVersion >= 110000)
+ appendPQExpBuffer(query,
+ "inh.inhparent AS parentidx, "
+ "i.indnkeyatts AS indnkeyatts, "
+ "i.indnatts AS indnatts, "
+ "(SELECT pg_catalog.array_agg(attnum ORDER BY attnum) "
+ " FROM pg_catalog.pg_attribute "
+ " WHERE attrelid = i.indexrelid AND "
+ " attstattarget >= 0) AS indstatcols, "
+ "(SELECT pg_catalog.array_agg(attstattarget ORDER BY attnum) "
+ " FROM pg_catalog.pg_attribute "
+ " WHERE attrelid = i.indexrelid AND "
+ " attstattarget >= 0) AS indstatvals, ");
+ else
+ appendPQExpBuffer(query,
+ "0 AS parentidx, "
+ "i.indnatts AS indnkeyatts, "
+ "i.indnatts AS indnatts, "
+ "'' AS indstatcols, "
+ "'' AS indstatvals, ");
+
+ if (fout->remoteVersion >= 150000)
+ appendPQExpBuffer(query,
+ "i.indnullsnotdistinct ");
+ else
+ appendPQExpBuffer(query,
+ "false AS indnullsnotdistinct ");
+
+ /*
+ * The point of the messy-looking outer join is to find a constraint that
+ * is related by an internal dependency link to the index. If we find one,
+ * create a CONSTRAINT entry linked to the INDEX entry. We assume an
+ * index won't have more than one internal dependency.
+ *
+ * Note: the check on conrelid is redundant, but useful because that
+ * column is indexed while conindid is not.
+ */
+ if (fout->remoteVersion >= 110000)
+ {
+ appendPQExpBuffer(query,
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_index i ON (src.tbloid = i.indrelid) "
+ "JOIN pg_catalog.pg_class t ON (t.oid = i.indexrelid) "
+ "JOIN pg_catalog.pg_class t2 ON (t2.oid = i.indrelid) "
+ "LEFT JOIN pg_catalog.pg_constraint c "
+ "ON (i.indrelid = c.conrelid AND "
+ "i.indexrelid = c.conindid AND "
+ "c.contype IN ('p','u','x')) "
+ "LEFT JOIN pg_catalog.pg_inherits inh "
+ "ON (inh.inhrelid = indexrelid) "
+ "WHERE (i.indisvalid OR t2.relkind = 'p') "
+ "AND i.indisready "
+ "ORDER BY i.indrelid, indexname",
+ tbloids->data);
+ }
+ else
+ {
+ /*
+ * the test on indisready is necessary in 9.2, and harmless in
+ * earlier/later versions
+ */
+ appendPQExpBuffer(query,
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_index i ON (src.tbloid = i.indrelid) "
+ "JOIN pg_catalog.pg_class t ON (t.oid = i.indexrelid) "
+ "LEFT JOIN pg_catalog.pg_constraint c "
+ "ON (i.indrelid = c.conrelid AND "
+ "i.indexrelid = c.conindid AND "
+ "c.contype IN ('p','u','x')) "
+ "WHERE i.indisvalid AND i.indisready "
+ "ORDER BY i.indrelid, indexname",
+ tbloids->data);
+ }
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_indrelid = PQfnumber(res, "indrelid");
+ i_indexname = PQfnumber(res, "indexname");
+ i_parentidx = PQfnumber(res, "parentidx");
+ i_indexdef = PQfnumber(res, "indexdef");
+ i_indnkeyatts = PQfnumber(res, "indnkeyatts");
+ i_indnatts = PQfnumber(res, "indnatts");
+ i_indkey = PQfnumber(res, "indkey");
+ i_indisclustered = PQfnumber(res, "indisclustered");
+ i_indisreplident = PQfnumber(res, "indisreplident");
+ i_indnullsnotdistinct = PQfnumber(res, "indnullsnotdistinct");
+ i_contype = PQfnumber(res, "contype");
+ i_conname = PQfnumber(res, "conname");
+ i_condeferrable = PQfnumber(res, "condeferrable");
+ i_condeferred = PQfnumber(res, "condeferred");
+ i_contableoid = PQfnumber(res, "contableoid");
+ i_conoid = PQfnumber(res, "conoid");
+ i_condef = PQfnumber(res, "condef");
+ i_tablespace = PQfnumber(res, "tablespace");
+ i_indreloptions = PQfnumber(res, "indreloptions");
+ i_indstatcols = PQfnumber(res, "indstatcols");
+ i_indstatvals = PQfnumber(res, "indstatvals");
+
+ indxinfo = (IndxInfo *) pg_malloc(ntups * sizeof(IndxInfo));
+
+ /*
+ * Outer loop iterates once per table, not once per row. Incrementing of
+ * j is handled by the inner loop.
+ */
+ curtblindx = -1;
+ for (int j = 0; j < ntups;)
+ {
+ Oid indrelid = atooid(PQgetvalue(res, j, i_indrelid));
+ TableInfo *tbinfo = NULL;
+ int numinds;
+
+ /* Count rows for this table */
+ for (numinds = 1; numinds < ntups - j; numinds++)
+ if (atooid(PQgetvalue(res, j + numinds, i_indrelid)) != indrelid)
+ break;
+
+ /*
+ * Locate the associated TableInfo; we rely on tblinfo[] being in OID
+ * order.
+ */
+ while (++curtblindx < numTables)
+ {
+ tbinfo = &tblinfo[curtblindx];
+ if (tbinfo->dobj.catId.oid == indrelid)
+ break;
+ }
+ if (curtblindx >= numTables)
+ pg_fatal("unrecognized table OID %u", indrelid);
+ /* cross-check that we only got requested tables */
+ if (!tbinfo->hasindex ||
+ !tbinfo->interesting)
+ pg_fatal("unexpected index data for table \"%s\"",
+ tbinfo->dobj.name);
+
+ /* Save data for this table */
+ tbinfo->indexes = indxinfo + j;
+ tbinfo->numIndexes = numinds;
+
+ for (int c = 0; c < numinds; c++, j++)
+ {
+ char contype;
+
+ indxinfo[j].dobj.objType = DO_INDEX;
+ indxinfo[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_tableoid));
+ indxinfo[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_oid));
+ AssignDumpId(&indxinfo[j].dobj);
+ indxinfo[j].dobj.dump = tbinfo->dobj.dump;
+ indxinfo[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_indexname));
+ indxinfo[j].dobj.namespace = tbinfo->dobj.namespace;
+ indxinfo[j].indextable = tbinfo;
+ indxinfo[j].indexdef = pg_strdup(PQgetvalue(res, j, i_indexdef));
+ indxinfo[j].indnkeyattrs = atoi(PQgetvalue(res, j, i_indnkeyatts));
+ indxinfo[j].indnattrs = atoi(PQgetvalue(res, j, i_indnatts));
+ indxinfo[j].tablespace = pg_strdup(PQgetvalue(res, j, i_tablespace));
+ indxinfo[j].indreloptions = pg_strdup(PQgetvalue(res, j, i_indreloptions));
+ indxinfo[j].indstatcols = pg_strdup(PQgetvalue(res, j, i_indstatcols));
+ indxinfo[j].indstatvals = pg_strdup(PQgetvalue(res, j, i_indstatvals));
+ indxinfo[j].indkeys = (Oid *) pg_malloc(indxinfo[j].indnattrs * sizeof(Oid));
+ parseOidArray(PQgetvalue(res, j, i_indkey),
+ indxinfo[j].indkeys, indxinfo[j].indnattrs);
+ indxinfo[j].indisclustered = (PQgetvalue(res, j, i_indisclustered)[0] == 't');
+ indxinfo[j].indisreplident = (PQgetvalue(res, j, i_indisreplident)[0] == 't');
+ indxinfo[j].indnullsnotdistinct = (PQgetvalue(res, j, i_indnullsnotdistinct)[0] == 't');
+ indxinfo[j].parentidx = atooid(PQgetvalue(res, j, i_parentidx));
+ indxinfo[j].partattaches = (SimplePtrList)
+ {
+ NULL, NULL
+ };
+ contype = *(PQgetvalue(res, j, i_contype));
+
+ if (contype == 'p' || contype == 'u' || contype == 'x')
+ {
+ /*
+ * If we found a constraint matching the index, create an
+ * entry for it.
+ */
+ ConstraintInfo *constrinfo;
+
+ constrinfo = (ConstraintInfo *) pg_malloc(sizeof(ConstraintInfo));
+ constrinfo->dobj.objType = DO_CONSTRAINT;
+ constrinfo->dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_contableoid));
+ constrinfo->dobj.catId.oid = atooid(PQgetvalue(res, j, i_conoid));
+ AssignDumpId(&constrinfo->dobj);
+ constrinfo->dobj.dump = tbinfo->dobj.dump;
+ constrinfo->dobj.name = pg_strdup(PQgetvalue(res, j, i_conname));
+ constrinfo->dobj.namespace = tbinfo->dobj.namespace;
+ constrinfo->contable = tbinfo;
+ constrinfo->condomain = NULL;
+ constrinfo->contype = contype;
+ if (contype == 'x')
+ constrinfo->condef = pg_strdup(PQgetvalue(res, j, i_condef));
+ else
+ constrinfo->condef = NULL;
+ constrinfo->confrelid = InvalidOid;
+ constrinfo->conindex = indxinfo[j].dobj.dumpId;
+ constrinfo->condeferrable = *(PQgetvalue(res, j, i_condeferrable)) == 't';
+ constrinfo->condeferred = *(PQgetvalue(res, j, i_condeferred)) == 't';
+ constrinfo->conislocal = true;
+ constrinfo->separate = true;
+
+ indxinfo[j].indexconstraint = constrinfo->dobj.dumpId;
+ }
+ else
+ {
+ /* Plain secondary index */
+ indxinfo[j].indexconstraint = 0;
+ }
+ }
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(tbloids);
+}
+
+/*
+ * getExtendedStatistics
+ * get information about extended-statistics objects.
+ *
+ * Note: extended statistics data is not returned directly to the caller, but
+ * it does get entered into the DumpableObject tables.
+ */
+void
+getExtendedStatistics(Archive *fout)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ StatsExtInfo *statsextinfo;
+ int ntups;
+ int i_tableoid;
+ int i_oid;
+ int i_stxname;
+ int i_stxnamespace;
+ int i_stxowner;
+ int i_stattarget;
+ int i;
+
+ /* Extended statistics were new in v10 */
+ if (fout->remoteVersion < 100000)
+ return;
+
+ query = createPQExpBuffer();
+
+ if (fout->remoteVersion < 130000)
+ appendPQExpBuffer(query, "SELECT tableoid, oid, stxname, "
+ "stxnamespace, stxowner, (-1) AS stxstattarget "
+ "FROM pg_catalog.pg_statistic_ext");
+ else
+ appendPQExpBuffer(query, "SELECT tableoid, oid, stxname, "
+ "stxnamespace, stxowner, stxstattarget "
+ "FROM pg_catalog.pg_statistic_ext");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_stxname = PQfnumber(res, "stxname");
+ i_stxnamespace = PQfnumber(res, "stxnamespace");
+ i_stxowner = PQfnumber(res, "stxowner");
+ i_stattarget = PQfnumber(res, "stxstattarget");
+
+ statsextinfo = (StatsExtInfo *) pg_malloc(ntups * sizeof(StatsExtInfo));
+
+ for (i = 0; i < ntups; i++)
+ {
+ statsextinfo[i].dobj.objType = DO_STATSEXT;
+ statsextinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ statsextinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&statsextinfo[i].dobj);
+ statsextinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_stxname));
+ statsextinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_stxnamespace)));
+ statsextinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_stxowner));
+ statsextinfo[i].stattarget = atoi(PQgetvalue(res, i, i_stattarget));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(statsextinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * getConstraints
+ *
+ * Get info about constraints on dumpable tables.
+ *
+ * Currently handles foreign keys only.
+ * Unique and primary key constraints are handled with indexes,
+ * while check constraints are processed in getTableAttrs().
+ */
+void
+getConstraints(Archive *fout, TableInfo tblinfo[], int numTables)
+{
+ PQExpBuffer query = createPQExpBuffer();
+ PQExpBuffer tbloids = createPQExpBuffer();
+ PGresult *res;
+ int ntups;
+ int curtblindx;
+ TableInfo *tbinfo = NULL;
+ ConstraintInfo *constrinfo;
+ int i_contableoid,
+ i_conoid,
+ i_conrelid,
+ i_conname,
+ i_confrelid,
+ i_conindid,
+ i_condef;
+
+ /*
+ * We want to perform just one query against pg_constraint. However, we
+ * mustn't try to select every row of the catalog and then sort it out on
+ * the client side, because some of the server-side functions we need
+ * would be unsafe to apply to tables we don't have lock on. Hence, we
+ * build an array of the OIDs of tables we care about (and now have lock
+ * on!), and use a WHERE clause to constrain which rows are selected.
+ */
+ appendPQExpBufferChar(tbloids, '{');
+ for (int i = 0; i < numTables; i++)
+ {
+ TableInfo *tinfo = &tblinfo[i];
+
+ /*
+ * For partitioned tables, foreign keys have no triggers so they must
+ * be included anyway in case some foreign keys are defined.
+ */
+ if ((!tinfo->hastriggers &&
+ tinfo->relkind != RELKIND_PARTITIONED_TABLE) ||
+ !(tinfo->dobj.dump & DUMP_COMPONENT_DEFINITION))
+ continue;
+
+ /* OK, we need info for this table */
+ if (tbloids->len > 1) /* do we have more than the '{'? */
+ appendPQExpBufferChar(tbloids, ',');
+ appendPQExpBuffer(tbloids, "%u", tinfo->dobj.catId.oid);
+ }
+ appendPQExpBufferChar(tbloids, '}');
+
+ appendPQExpBufferStr(query,
+ "SELECT c.tableoid, c.oid, "
+ "conrelid, conname, confrelid, ");
+ if (fout->remoteVersion >= 110000)
+ appendPQExpBufferStr(query, "conindid, ");
+ else
+ appendPQExpBufferStr(query, "0 AS conindid, ");
+ appendPQExpBuffer(query,
+ "pg_catalog.pg_get_constraintdef(c.oid) AS condef\n"
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_constraint c ON (src.tbloid = c.conrelid)\n"
+ "WHERE contype = 'f' ",
+ tbloids->data);
+ if (fout->remoteVersion >= 110000)
+ appendPQExpBufferStr(query,
+ "AND conparentid = 0 ");
+ appendPQExpBufferStr(query,
+ "ORDER BY conrelid, conname");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_contableoid = PQfnumber(res, "tableoid");
+ i_conoid = PQfnumber(res, "oid");
+ i_conrelid = PQfnumber(res, "conrelid");
+ i_conname = PQfnumber(res, "conname");
+ i_confrelid = PQfnumber(res, "confrelid");
+ i_conindid = PQfnumber(res, "conindid");
+ i_condef = PQfnumber(res, "condef");
+
+ constrinfo = (ConstraintInfo *) pg_malloc(ntups * sizeof(ConstraintInfo));
+
+ curtblindx = -1;
+ for (int j = 0; j < ntups; j++)
+ {
+ Oid conrelid = atooid(PQgetvalue(res, j, i_conrelid));
+ TableInfo *reftable;
+
+ /*
+ * Locate the associated TableInfo; we rely on tblinfo[] being in OID
+ * order.
+ */
+ if (tbinfo == NULL || tbinfo->dobj.catId.oid != conrelid)
+ {
+ while (++curtblindx < numTables)
+ {
+ tbinfo = &tblinfo[curtblindx];
+ if (tbinfo->dobj.catId.oid == conrelid)
+ break;
+ }
+ if (curtblindx >= numTables)
+ pg_fatal("unrecognized table OID %u", conrelid);
+ }
+
+ constrinfo[j].dobj.objType = DO_FK_CONSTRAINT;
+ constrinfo[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_contableoid));
+ constrinfo[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_conoid));
+ AssignDumpId(&constrinfo[j].dobj);
+ constrinfo[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_conname));
+ constrinfo[j].dobj.namespace = tbinfo->dobj.namespace;
+ constrinfo[j].contable = tbinfo;
+ constrinfo[j].condomain = NULL;
+ constrinfo[j].contype = 'f';
+ constrinfo[j].condef = pg_strdup(PQgetvalue(res, j, i_condef));
+ constrinfo[j].confrelid = atooid(PQgetvalue(res, j, i_confrelid));
+ constrinfo[j].conindex = 0;
+ constrinfo[j].condeferrable = false;
+ constrinfo[j].condeferred = false;
+ constrinfo[j].conislocal = true;
+ constrinfo[j].separate = true;
+
+ /*
+ * Restoring an FK that points to a partitioned table requires that
+ * all partition indexes have been attached beforehand. Ensure that
+ * happens by making the constraint depend on each index partition
+ * attach object.
+ */
+ reftable = findTableByOid(constrinfo[j].confrelid);
+ if (reftable && reftable->relkind == RELKIND_PARTITIONED_TABLE)
+ {
+ Oid indexOid = atooid(PQgetvalue(res, j, i_conindid));
+
+ if (indexOid != InvalidOid)
+ {
+ for (int k = 0; k < reftable->numIndexes; k++)
+ {
+ IndxInfo *refidx;
+
+ /* not our index? */
+ if (reftable->indexes[k].dobj.catId.oid != indexOid)
+ continue;
+
+ refidx = &reftable->indexes[k];
+ addConstrChildIdxDeps(&constrinfo[j].dobj, refidx);
+ break;
+ }
+ }
+ }
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(tbloids);
+}
+
+/*
+ * addConstrChildIdxDeps
+ *
+ * Recursive subroutine for getConstraints
+ *
+ * Given an object representing a foreign key constraint and an index on the
+ * partitioned table it references, mark the constraint object as dependent
+ * on the DO_INDEX_ATTACH object of each index partition, recursively
+ * drilling down to their partitions if any. This ensures that the FK is not
+ * restored until the index is fully marked valid.
+ */
+static void
+addConstrChildIdxDeps(DumpableObject *dobj, const IndxInfo *refidx)
+{
+ SimplePtrListCell *cell;
+
+ Assert(dobj->objType == DO_FK_CONSTRAINT);
+
+ for (cell = refidx->partattaches.head; cell; cell = cell->next)
+ {
+ IndexAttachInfo *attach = (IndexAttachInfo *) cell->ptr;
+
+ addObjectDependency(dobj, attach->dobj.dumpId);
+
+ if (attach->partitionIdx->partattaches.head != NULL)
+ addConstrChildIdxDeps(dobj, attach->partitionIdx);
+ }
+}
+
+/*
+ * getDomainConstraints
+ *
+ * Get info about constraints on a domain.
+ */
+static void
+getDomainConstraints(Archive *fout, TypeInfo *tyinfo)
+{
+ int i;
+ ConstraintInfo *constrinfo;
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ int i_tableoid,
+ i_oid,
+ i_conname,
+ i_consrc;
+ int ntups;
+
+ if (!fout->is_prepared[PREPQUERY_GETDOMAINCONSTRAINTS])
+ {
+ /* Set up query for constraint-specific details */
+ appendPQExpBufferStr(query,
+ "PREPARE getDomainConstraints(pg_catalog.oid) AS\n"
+ "SELECT tableoid, oid, conname, "
+ "pg_catalog.pg_get_constraintdef(oid) AS consrc, "
+ "convalidated "
+ "FROM pg_catalog.pg_constraint "
+ "WHERE contypid = $1 "
+ "ORDER BY conname");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_GETDOMAINCONSTRAINTS] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE getDomainConstraints('%u')",
+ tyinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_conname = PQfnumber(res, "conname");
+ i_consrc = PQfnumber(res, "consrc");
+
+ constrinfo = (ConstraintInfo *) pg_malloc(ntups * sizeof(ConstraintInfo));
+
+ tyinfo->nDomChecks = ntups;
+ tyinfo->domChecks = constrinfo;
+
+ for (i = 0; i < ntups; i++)
+ {
+ bool validated = PQgetvalue(res, i, 4)[0] == 't';
+
+ constrinfo[i].dobj.objType = DO_CONSTRAINT;
+ constrinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ constrinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&constrinfo[i].dobj);
+ constrinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_conname));
+ constrinfo[i].dobj.namespace = tyinfo->dobj.namespace;
+ constrinfo[i].contable = NULL;
+ constrinfo[i].condomain = tyinfo;
+ constrinfo[i].contype = 'c';
+ constrinfo[i].condef = pg_strdup(PQgetvalue(res, i, i_consrc));
+ constrinfo[i].confrelid = InvalidOid;
+ constrinfo[i].conindex = 0;
+ constrinfo[i].condeferrable = false;
+ constrinfo[i].condeferred = false;
+ constrinfo[i].conislocal = true;
+
+ constrinfo[i].separate = !validated;
+
+ /*
+ * Make the domain depend on the constraint, ensuring it won't be
+ * output till any constraint dependencies are OK. If the constraint
+ * has not been validated, it's going to be dumped after the domain
+ * anyway, so this doesn't matter.
+ */
+ if (validated)
+ addObjectDependency(&tyinfo->dobj,
+ constrinfo[i].dobj.dumpId);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * getRules
+ * get basic information about every rule in the system
+ *
+ * numRules is set to the number of rules read in
+ */
+RuleInfo *
+getRules(Archive *fout, int *numRules)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ RuleInfo *ruleinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_rulename;
+ int i_ruletable;
+ int i_ev_type;
+ int i_is_instead;
+ int i_ev_enabled;
+
+ appendPQExpBufferStr(query, "SELECT "
+ "tableoid, oid, rulename, "
+ "ev_class AS ruletable, ev_type, is_instead, "
+ "ev_enabled "
+ "FROM pg_rewrite "
+ "ORDER BY oid");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ *numRules = ntups;
+
+ ruleinfo = (RuleInfo *) pg_malloc(ntups * sizeof(RuleInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_rulename = PQfnumber(res, "rulename");
+ i_ruletable = PQfnumber(res, "ruletable");
+ i_ev_type = PQfnumber(res, "ev_type");
+ i_is_instead = PQfnumber(res, "is_instead");
+ i_ev_enabled = PQfnumber(res, "ev_enabled");
+
+ for (i = 0; i < ntups; i++)
+ {
+ Oid ruletableoid;
+
+ ruleinfo[i].dobj.objType = DO_RULE;
+ ruleinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ ruleinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&ruleinfo[i].dobj);
+ ruleinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_rulename));
+ ruletableoid = atooid(PQgetvalue(res, i, i_ruletable));
+ ruleinfo[i].ruletable = findTableByOid(ruletableoid);
+ if (ruleinfo[i].ruletable == NULL)
+ pg_fatal("failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found",
+ ruletableoid, ruleinfo[i].dobj.catId.oid);
+ ruleinfo[i].dobj.namespace = ruleinfo[i].ruletable->dobj.namespace;
+ ruleinfo[i].dobj.dump = ruleinfo[i].ruletable->dobj.dump;
+ ruleinfo[i].ev_type = *(PQgetvalue(res, i, i_ev_type));
+ ruleinfo[i].is_instead = *(PQgetvalue(res, i, i_is_instead)) == 't';
+ ruleinfo[i].ev_enabled = *(PQgetvalue(res, i, i_ev_enabled));
+ if (ruleinfo[i].ruletable)
+ {
+ /*
+ * If the table is a view or materialized view, force its ON
+ * SELECT rule to be sorted before the view itself --- this
+ * ensures that any dependencies for the rule affect the table's
+ * positioning. Other rules are forced to appear after their
+ * table.
+ */
+ if ((ruleinfo[i].ruletable->relkind == RELKIND_VIEW ||
+ ruleinfo[i].ruletable->relkind == RELKIND_MATVIEW) &&
+ ruleinfo[i].ev_type == '1' && ruleinfo[i].is_instead)
+ {
+ addObjectDependency(&ruleinfo[i].ruletable->dobj,
+ ruleinfo[i].dobj.dumpId);
+ /* We'll merge the rule into CREATE VIEW, if possible */
+ ruleinfo[i].separate = false;
+ }
+ else
+ {
+ addObjectDependency(&ruleinfo[i].dobj,
+ ruleinfo[i].ruletable->dobj.dumpId);
+ ruleinfo[i].separate = true;
+ }
+ }
+ else
+ ruleinfo[i].separate = true;
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return ruleinfo;
+}
+
+/*
+ * getTriggers
+ * get information about every trigger on a dumpable table
+ *
+ * Note: trigger data is not returned directly to the caller, but it
+ * does get entered into the DumpableObject tables.
+ */
+void
+getTriggers(Archive *fout, TableInfo tblinfo[], int numTables)
+{
+ PQExpBuffer query = createPQExpBuffer();
+ PQExpBuffer tbloids = createPQExpBuffer();
+ PGresult *res;
+ int ntups;
+ int curtblindx;
+ TriggerInfo *tginfo;
+ int i_tableoid,
+ i_oid,
+ i_tgrelid,
+ i_tgname,
+ i_tgfname,
+ i_tgtype,
+ i_tgnargs,
+ i_tgargs,
+ i_tgisconstraint,
+ i_tgconstrname,
+ i_tgconstrrelid,
+ i_tgconstrrelname,
+ i_tgenabled,
+ i_tgispartition,
+ i_tgdeferrable,
+ i_tginitdeferred,
+ i_tgdef;
+
+ /*
+ * We want to perform just one query against pg_trigger. However, we
+ * mustn't try to select every row of the catalog and then sort it out on
+ * the client side, because some of the server-side functions we need
+ * would be unsafe to apply to tables we don't have lock on. Hence, we
+ * build an array of the OIDs of tables we care about (and now have lock
+ * on!), and use a WHERE clause to constrain which rows are selected.
+ */
+ appendPQExpBufferChar(tbloids, '{');
+ for (int i = 0; i < numTables; i++)
+ {
+ TableInfo *tbinfo = &tblinfo[i];
+
+ if (!tbinfo->hastriggers ||
+ !(tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION))
+ continue;
+
+ /* OK, we need info for this table */
+ if (tbloids->len > 1) /* do we have more than the '{'? */
+ appendPQExpBufferChar(tbloids, ',');
+ appendPQExpBuffer(tbloids, "%u", tbinfo->dobj.catId.oid);
+ }
+ appendPQExpBufferChar(tbloids, '}');
+
+ if (fout->remoteVersion >= 150000)
+ {
+ /*
+ * NB: think not to use pretty=true in pg_get_triggerdef. It could
+ * result in non-forward-compatible dumps of WHEN clauses due to
+ * under-parenthesization.
+ *
+ * NB: We need to see partition triggers in case the tgenabled flag
+ * has been changed from the parent.
+ */
+ appendPQExpBuffer(query,
+ "SELECT t.tgrelid, t.tgname, "
+ "t.tgfoid::pg_catalog.regproc AS tgfname, "
+ "pg_catalog.pg_get_triggerdef(t.oid, false) AS tgdef, "
+ "t.tgenabled, t.tableoid, t.oid, "
+ "t.tgparentid <> 0 AS tgispartition\n"
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_trigger t ON (src.tbloid = t.tgrelid) "
+ "LEFT JOIN pg_catalog.pg_trigger u ON (u.oid = t.tgparentid) "
+ "WHERE ((NOT t.tgisinternal AND t.tgparentid = 0) "
+ "OR t.tgenabled != u.tgenabled) "
+ "ORDER BY t.tgrelid, t.tgname",
+ tbloids->data);
+ }
+ else if (fout->remoteVersion >= 130000)
+ {
+ /*
+ * NB: think not to use pretty=true in pg_get_triggerdef. It could
+ * result in non-forward-compatible dumps of WHEN clauses due to
+ * under-parenthesization.
+ *
+ * NB: We need to see tgisinternal triggers in partitions, in case the
+ * tgenabled flag has been changed from the parent.
+ */
+ appendPQExpBuffer(query,
+ "SELECT t.tgrelid, t.tgname, "
+ "t.tgfoid::pg_catalog.regproc AS tgfname, "
+ "pg_catalog.pg_get_triggerdef(t.oid, false) AS tgdef, "
+ "t.tgenabled, t.tableoid, t.oid, t.tgisinternal as tgispartition\n"
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_trigger t ON (src.tbloid = t.tgrelid) "
+ "LEFT JOIN pg_catalog.pg_trigger u ON (u.oid = t.tgparentid) "
+ "WHERE (NOT t.tgisinternal OR t.tgenabled != u.tgenabled) "
+ "ORDER BY t.tgrelid, t.tgname",
+ tbloids->data);
+ }
+ else if (fout->remoteVersion >= 110000)
+ {
+ /*
+ * NB: We need to see tgisinternal triggers in partitions, in case the
+ * tgenabled flag has been changed from the parent. No tgparentid in
+ * version 11-12, so we have to match them via pg_depend.
+ *
+ * See above about pretty=true in pg_get_triggerdef.
+ */
+ appendPQExpBuffer(query,
+ "SELECT t.tgrelid, t.tgname, "
+ "t.tgfoid::pg_catalog.regproc AS tgfname, "
+ "pg_catalog.pg_get_triggerdef(t.oid, false) AS tgdef, "
+ "t.tgenabled, t.tableoid, t.oid, t.tgisinternal as tgispartition "
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_trigger t ON (src.tbloid = t.tgrelid) "
+ "LEFT JOIN pg_catalog.pg_depend AS d ON "
+ " d.classid = 'pg_catalog.pg_trigger'::pg_catalog.regclass AND "
+ " d.refclassid = 'pg_catalog.pg_trigger'::pg_catalog.regclass AND "
+ " d.objid = t.oid "
+ "LEFT JOIN pg_catalog.pg_trigger AS pt ON pt.oid = refobjid "
+ "WHERE (NOT t.tgisinternal OR t.tgenabled != pt.tgenabled) "
+ "ORDER BY t.tgrelid, t.tgname",
+ tbloids->data);
+ }
+ else
+ {
+ /* See above about pretty=true in pg_get_triggerdef */
+ appendPQExpBuffer(query,
+ "SELECT t.tgrelid, t.tgname, "
+ "t.tgfoid::pg_catalog.regproc AS tgfname, "
+ "pg_catalog.pg_get_triggerdef(t.oid, false) AS tgdef, "
+ "t.tgenabled, false as tgispartition, "
+ "t.tableoid, t.oid "
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_trigger t ON (src.tbloid = t.tgrelid) "
+ "WHERE NOT tgisinternal "
+ "ORDER BY t.tgrelid, t.tgname",
+ tbloids->data);
+ }
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_tgrelid = PQfnumber(res, "tgrelid");
+ i_tgname = PQfnumber(res, "tgname");
+ i_tgfname = PQfnumber(res, "tgfname");
+ i_tgtype = PQfnumber(res, "tgtype");
+ i_tgnargs = PQfnumber(res, "tgnargs");
+ i_tgargs = PQfnumber(res, "tgargs");
+ i_tgisconstraint = PQfnumber(res, "tgisconstraint");
+ i_tgconstrname = PQfnumber(res, "tgconstrname");
+ i_tgconstrrelid = PQfnumber(res, "tgconstrrelid");
+ i_tgconstrrelname = PQfnumber(res, "tgconstrrelname");
+ i_tgenabled = PQfnumber(res, "tgenabled");
+ i_tgispartition = PQfnumber(res, "tgispartition");
+ i_tgdeferrable = PQfnumber(res, "tgdeferrable");
+ i_tginitdeferred = PQfnumber(res, "tginitdeferred");
+ i_tgdef = PQfnumber(res, "tgdef");
+
+ tginfo = (TriggerInfo *) pg_malloc(ntups * sizeof(TriggerInfo));
+
+ /*
+ * Outer loop iterates once per table, not once per row. Incrementing of
+ * j is handled by the inner loop.
+ */
+ curtblindx = -1;
+ for (int j = 0; j < ntups;)
+ {
+ Oid tgrelid = atooid(PQgetvalue(res, j, i_tgrelid));
+ TableInfo *tbinfo = NULL;
+ int numtrigs;
+
+ /* Count rows for this table */
+ for (numtrigs = 1; numtrigs < ntups - j; numtrigs++)
+ if (atooid(PQgetvalue(res, j + numtrigs, i_tgrelid)) != tgrelid)
+ break;
+
+ /*
+ * Locate the associated TableInfo; we rely on tblinfo[] being in OID
+ * order.
+ */
+ while (++curtblindx < numTables)
+ {
+ tbinfo = &tblinfo[curtblindx];
+ if (tbinfo->dobj.catId.oid == tgrelid)
+ break;
+ }
+ if (curtblindx >= numTables)
+ pg_fatal("unrecognized table OID %u", tgrelid);
+
+ /* Save data for this table */
+ tbinfo->triggers = tginfo + j;
+ tbinfo->numTriggers = numtrigs;
+
+ for (int c = 0; c < numtrigs; c++, j++)
+ {
+ tginfo[j].dobj.objType = DO_TRIGGER;
+ tginfo[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_tableoid));
+ tginfo[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_oid));
+ AssignDumpId(&tginfo[j].dobj);
+ tginfo[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_tgname));
+ tginfo[j].dobj.namespace = tbinfo->dobj.namespace;
+ tginfo[j].tgtable = tbinfo;
+ tginfo[j].tgenabled = *(PQgetvalue(res, j, i_tgenabled));
+ tginfo[j].tgispartition = *(PQgetvalue(res, j, i_tgispartition)) == 't';
+ if (i_tgdef >= 0)
+ {
+ tginfo[j].tgdef = pg_strdup(PQgetvalue(res, j, i_tgdef));
+
+ /* remaining fields are not valid if we have tgdef */
+ tginfo[j].tgfname = NULL;
+ tginfo[j].tgtype = 0;
+ tginfo[j].tgnargs = 0;
+ tginfo[j].tgargs = NULL;
+ tginfo[j].tgisconstraint = false;
+ tginfo[j].tgdeferrable = false;
+ tginfo[j].tginitdeferred = false;
+ tginfo[j].tgconstrname = NULL;
+ tginfo[j].tgconstrrelid = InvalidOid;
+ tginfo[j].tgconstrrelname = NULL;
+ }
+ else
+ {
+ tginfo[j].tgdef = NULL;
+
+ tginfo[j].tgfname = pg_strdup(PQgetvalue(res, j, i_tgfname));
+ tginfo[j].tgtype = atoi(PQgetvalue(res, j, i_tgtype));
+ tginfo[j].tgnargs = atoi(PQgetvalue(res, j, i_tgnargs));
+ tginfo[j].tgargs = pg_strdup(PQgetvalue(res, j, i_tgargs));
+ tginfo[j].tgisconstraint = *(PQgetvalue(res, j, i_tgisconstraint)) == 't';
+ tginfo[j].tgdeferrable = *(PQgetvalue(res, j, i_tgdeferrable)) == 't';
+ tginfo[j].tginitdeferred = *(PQgetvalue(res, j, i_tginitdeferred)) == 't';
+
+ if (tginfo[j].tgisconstraint)
+ {
+ tginfo[j].tgconstrname = pg_strdup(PQgetvalue(res, j, i_tgconstrname));
+ tginfo[j].tgconstrrelid = atooid(PQgetvalue(res, j, i_tgconstrrelid));
+ if (OidIsValid(tginfo[j].tgconstrrelid))
+ {
+ if (PQgetisnull(res, j, i_tgconstrrelname))
+ pg_fatal("query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)",
+ tginfo[j].dobj.name,
+ tbinfo->dobj.name,
+ tginfo[j].tgconstrrelid);
+ tginfo[j].tgconstrrelname = pg_strdup(PQgetvalue(res, j, i_tgconstrrelname));
+ }
+ else
+ tginfo[j].tgconstrrelname = NULL;
+ }
+ else
+ {
+ tginfo[j].tgconstrname = NULL;
+ tginfo[j].tgconstrrelid = InvalidOid;
+ tginfo[j].tgconstrrelname = NULL;
+ }
+ }
+ }
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(tbloids);
+}
+
+/*
+ * getEventTriggers
+ * get information about event triggers
+ */
+EventTriggerInfo *
+getEventTriggers(Archive *fout, int *numEventTriggers)
+{
+ int i;
+ PQExpBuffer query;
+ PGresult *res;
+ EventTriggerInfo *evtinfo;
+ int i_tableoid,
+ i_oid,
+ i_evtname,
+ i_evtevent,
+ i_evtowner,
+ i_evttags,
+ i_evtfname,
+ i_evtenabled;
+ int ntups;
+
+ /* Before 9.3, there are no event triggers */
+ if (fout->remoteVersion < 90300)
+ {
+ *numEventTriggers = 0;
+ return NULL;
+ }
+
+ query = createPQExpBuffer();
+
+ appendPQExpBuffer(query,
+ "SELECT e.tableoid, e.oid, evtname, evtenabled, "
+ "evtevent, evtowner, "
+ "array_to_string(array("
+ "select quote_literal(x) "
+ " from unnest(evttags) as t(x)), ', ') as evttags, "
+ "e.evtfoid::regproc as evtfname "
+ "FROM pg_event_trigger e "
+ "ORDER BY e.oid");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ *numEventTriggers = ntups;
+
+ evtinfo = (EventTriggerInfo *) pg_malloc(ntups * sizeof(EventTriggerInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_evtname = PQfnumber(res, "evtname");
+ i_evtevent = PQfnumber(res, "evtevent");
+ i_evtowner = PQfnumber(res, "evtowner");
+ i_evttags = PQfnumber(res, "evttags");
+ i_evtfname = PQfnumber(res, "evtfname");
+ i_evtenabled = PQfnumber(res, "evtenabled");
+
+ for (i = 0; i < ntups; i++)
+ {
+ evtinfo[i].dobj.objType = DO_EVENT_TRIGGER;
+ evtinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ evtinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&evtinfo[i].dobj);
+ evtinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_evtname));
+ evtinfo[i].evtname = pg_strdup(PQgetvalue(res, i, i_evtname));
+ evtinfo[i].evtevent = pg_strdup(PQgetvalue(res, i, i_evtevent));
+ evtinfo[i].evtowner = getRoleName(PQgetvalue(res, i, i_evtowner));
+ evtinfo[i].evttags = pg_strdup(PQgetvalue(res, i, i_evttags));
+ evtinfo[i].evtfname = pg_strdup(PQgetvalue(res, i, i_evtfname));
+ evtinfo[i].evtenabled = *(PQgetvalue(res, i, i_evtenabled));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(evtinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return evtinfo;
+}
+
+/*
+ * getProcLangs
+ * get basic information about every procedural language in the system
+ *
+ * numProcLangs is set to the number of langs read in
+ *
+ * NB: this must run after getFuncs() because we assume we can do
+ * findFuncByOid().
+ */
+ProcLangInfo *
+getProcLangs(Archive *fout, int *numProcLangs)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ ProcLangInfo *planginfo;
+ int i_tableoid;
+ int i_oid;
+ int i_lanname;
+ int i_lanpltrusted;
+ int i_lanplcallfoid;
+ int i_laninline;
+ int i_lanvalidator;
+ int i_lanacl;
+ int i_acldefault;
+ int i_lanowner;
+
+ appendPQExpBuffer(query, "SELECT tableoid, oid, "
+ "lanname, lanpltrusted, lanplcallfoid, "
+ "laninline, lanvalidator, "
+ "lanacl, "
+ "acldefault('l', lanowner) AS acldefault, "
+ "lanowner "
+ "FROM pg_language "
+ "WHERE lanispl "
+ "ORDER BY oid");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ *numProcLangs = ntups;
+
+ planginfo = (ProcLangInfo *) pg_malloc(ntups * sizeof(ProcLangInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_lanname = PQfnumber(res, "lanname");
+ i_lanpltrusted = PQfnumber(res, "lanpltrusted");
+ i_lanplcallfoid = PQfnumber(res, "lanplcallfoid");
+ i_laninline = PQfnumber(res, "laninline");
+ i_lanvalidator = PQfnumber(res, "lanvalidator");
+ i_lanacl = PQfnumber(res, "lanacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+ i_lanowner = PQfnumber(res, "lanowner");
+
+ for (i = 0; i < ntups; i++)
+ {
+ planginfo[i].dobj.objType = DO_PROCLANG;
+ planginfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ planginfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&planginfo[i].dobj);
+
+ planginfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_lanname));
+ planginfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_lanacl));
+ planginfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ planginfo[i].dacl.privtype = 0;
+ planginfo[i].dacl.initprivs = NULL;
+ planginfo[i].lanpltrusted = *(PQgetvalue(res, i, i_lanpltrusted)) == 't';
+ planginfo[i].lanplcallfoid = atooid(PQgetvalue(res, i, i_lanplcallfoid));
+ planginfo[i].laninline = atooid(PQgetvalue(res, i, i_laninline));
+ planginfo[i].lanvalidator = atooid(PQgetvalue(res, i, i_lanvalidator));
+ planginfo[i].lanowner = getRoleName(PQgetvalue(res, i, i_lanowner));
+
+ /* Decide whether we want to dump it */
+ selectDumpableProcLang(&(planginfo[i]), fout);
+
+ /* Mark whether language has an ACL */
+ if (!PQgetisnull(res, i, i_lanacl))
+ planginfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return planginfo;
+}
+
+/*
+ * getCasts
+ * get basic information about most casts in the system
+ *
+ * numCasts is set to the number of casts read in
+ *
+ * Skip casts from a range to its multirange, since we'll create those
+ * automatically.
+ */
+CastInfo *
+getCasts(Archive *fout, int *numCasts)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ CastInfo *castinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_castsource;
+ int i_casttarget;
+ int i_castfunc;
+ int i_castcontext;
+ int i_castmethod;
+
+ if (fout->remoteVersion >= 140000)
+ {
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, "
+ "castsource, casttarget, castfunc, castcontext, "
+ "castmethod "
+ "FROM pg_cast c "
+ "WHERE NOT EXISTS ( "
+ "SELECT 1 FROM pg_range r "
+ "WHERE c.castsource = r.rngtypid "
+ "AND c.casttarget = r.rngmultitypid "
+ ") "
+ "ORDER BY 3,4");
+ }
+ else
+ {
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, "
+ "castsource, casttarget, castfunc, castcontext, "
+ "castmethod "
+ "FROM pg_cast ORDER BY 3,4");
+ }
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ *numCasts = ntups;
+
+ castinfo = (CastInfo *) pg_malloc(ntups * sizeof(CastInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_castsource = PQfnumber(res, "castsource");
+ i_casttarget = PQfnumber(res, "casttarget");
+ i_castfunc = PQfnumber(res, "castfunc");
+ i_castcontext = PQfnumber(res, "castcontext");
+ i_castmethod = PQfnumber(res, "castmethod");
+
+ for (i = 0; i < ntups; i++)
+ {
+ PQExpBufferData namebuf;
+ TypeInfo *sTypeInfo;
+ TypeInfo *tTypeInfo;
+
+ castinfo[i].dobj.objType = DO_CAST;
+ castinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ castinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&castinfo[i].dobj);
+ castinfo[i].castsource = atooid(PQgetvalue(res, i, i_castsource));
+ castinfo[i].casttarget = atooid(PQgetvalue(res, i, i_casttarget));
+ castinfo[i].castfunc = atooid(PQgetvalue(res, i, i_castfunc));
+ castinfo[i].castcontext = *(PQgetvalue(res, i, i_castcontext));
+ castinfo[i].castmethod = *(PQgetvalue(res, i, i_castmethod));
+
+ /*
+ * Try to name cast as concatenation of typnames. This is only used
+ * for purposes of sorting. If we fail to find either type, the name
+ * will be an empty string.
+ */
+ initPQExpBuffer(&namebuf);
+ sTypeInfo = findTypeByOid(castinfo[i].castsource);
+ tTypeInfo = findTypeByOid(castinfo[i].casttarget);
+ if (sTypeInfo && tTypeInfo)
+ appendPQExpBuffer(&namebuf, "%s %s",
+ sTypeInfo->dobj.name, tTypeInfo->dobj.name);
+ castinfo[i].dobj.name = namebuf.data;
+
+ /* Decide whether we want to dump it */
+ selectDumpableCast(&(castinfo[i]), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return castinfo;
+}
+
+static char *
+get_language_name(Archive *fout, Oid langid)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ char *lanname;
+
+ query = createPQExpBuffer();
+ appendPQExpBuffer(query, "SELECT lanname FROM pg_language WHERE oid = %u", langid);
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+ lanname = pg_strdup(fmtId(PQgetvalue(res, 0, 0)));
+ destroyPQExpBuffer(query);
+ PQclear(res);
+
+ return lanname;
+}
+
+/*
+ * getTransforms
+ * get basic information about every transform in the system
+ *
+ * numTransforms is set to the number of transforms read in
+ */
+TransformInfo *
+getTransforms(Archive *fout, int *numTransforms)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ TransformInfo *transforminfo;
+ int i_tableoid;
+ int i_oid;
+ int i_trftype;
+ int i_trflang;
+ int i_trffromsql;
+ int i_trftosql;
+
+ /* Transforms didn't exist pre-9.5 */
+ if (fout->remoteVersion < 90500)
+ {
+ *numTransforms = 0;
+ return NULL;
+ }
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, "
+ "trftype, trflang, trffromsql::oid, trftosql::oid "
+ "FROM pg_transform "
+ "ORDER BY 3,4");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ *numTransforms = ntups;
+
+ transforminfo = (TransformInfo *) pg_malloc(ntups * sizeof(TransformInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_trftype = PQfnumber(res, "trftype");
+ i_trflang = PQfnumber(res, "trflang");
+ i_trffromsql = PQfnumber(res, "trffromsql");
+ i_trftosql = PQfnumber(res, "trftosql");
+
+ for (i = 0; i < ntups; i++)
+ {
+ PQExpBufferData namebuf;
+ TypeInfo *typeInfo;
+ char *lanname;
+
+ transforminfo[i].dobj.objType = DO_TRANSFORM;
+ transforminfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ transforminfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&transforminfo[i].dobj);
+ transforminfo[i].trftype = atooid(PQgetvalue(res, i, i_trftype));
+ transforminfo[i].trflang = atooid(PQgetvalue(res, i, i_trflang));
+ transforminfo[i].trffromsql = atooid(PQgetvalue(res, i, i_trffromsql));
+ transforminfo[i].trftosql = atooid(PQgetvalue(res, i, i_trftosql));
+
+ /*
+ * Try to name transform as concatenation of type and language name.
+ * This is only used for purposes of sorting. If we fail to find
+ * either, the name will be an empty string.
+ */
+ initPQExpBuffer(&namebuf);
+ typeInfo = findTypeByOid(transforminfo[i].trftype);
+ lanname = get_language_name(fout, transforminfo[i].trflang);
+ if (typeInfo && lanname)
+ appendPQExpBuffer(&namebuf, "%s %s",
+ typeInfo->dobj.name, lanname);
+ transforminfo[i].dobj.name = namebuf.data;
+ free(lanname);
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(transforminfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return transforminfo;
+}
+
+/*
+ * getTableAttrs -
+ * for each interesting table, read info about its attributes
+ * (names, types, default values, CHECK constraints, etc)
+ *
+ * modifies tblinfo
+ */
+void
+getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer tbloids = createPQExpBuffer();
+ PQExpBuffer checkoids = createPQExpBuffer();
+ PGresult *res;
+ int ntups;
+ int curtblindx;
+ int i_attrelid;
+ int i_attnum;
+ int i_attname;
+ int i_atttypname;
+ int i_atttypmod;
+ int i_attstattarget;
+ int i_attstorage;
+ int i_typstorage;
+ int i_attidentity;
+ int i_attgenerated;
+ int i_attisdropped;
+ int i_attlen;
+ int i_attalign;
+ int i_attislocal;
+ int i_attnotnull;
+ int i_attoptions;
+ int i_attcollation;
+ int i_attcompression;
+ int i_attfdwoptions;
+ int i_attmissingval;
+ int i_atthasdef;
+
+ /*
+ * We want to perform just one query against pg_attribute, and then just
+ * one against pg_attrdef (for DEFAULTs) and one against pg_constraint
+ * (for CHECK constraints). However, we mustn't try to select every row
+ * of those catalogs and then sort it out on the client side, because some
+ * of the server-side functions we need would be unsafe to apply to tables
+ * we don't have lock on. Hence, we build an array of the OIDs of tables
+ * we care about (and now have lock on!), and use a WHERE clause to
+ * constrain which rows are selected.
+ */
+ appendPQExpBufferChar(tbloids, '{');
+ appendPQExpBufferChar(checkoids, '{');
+ for (int i = 0; i < numTables; i++)
+ {
+ TableInfo *tbinfo = &tblinfo[i];
+
+ /* Don't bother to collect info for sequences */
+ if (tbinfo->relkind == RELKIND_SEQUENCE)
+ continue;
+
+ /* Don't bother with uninteresting tables, either */
+ if (!tbinfo->interesting)
+ continue;
+
+ /* OK, we need info for this table */
+ if (tbloids->len > 1) /* do we have more than the '{'? */
+ appendPQExpBufferChar(tbloids, ',');
+ appendPQExpBuffer(tbloids, "%u", tbinfo->dobj.catId.oid);
+
+ if (tbinfo->ncheck > 0)
+ {
+ /* Also make a list of the ones with check constraints */
+ if (checkoids->len > 1) /* do we have more than the '{'? */
+ appendPQExpBufferChar(checkoids, ',');
+ appendPQExpBuffer(checkoids, "%u", tbinfo->dobj.catId.oid);
+ }
+ }
+ appendPQExpBufferChar(tbloids, '}');
+ appendPQExpBufferChar(checkoids, '}');
+
+ /*
+ * Find all the user attributes and their types.
+ *
+ * Since we only want to dump COLLATE clauses for attributes whose
+ * collation is different from their type's default, we use a CASE here to
+ * suppress uninteresting attcollations cheaply.
+ */
+ appendPQExpBufferStr(q,
+ "SELECT\n"
+ "a.attrelid,\n"
+ "a.attnum,\n"
+ "a.attname,\n"
+ "a.atttypmod,\n"
+ "a.attstattarget,\n"
+ "a.attstorage,\n"
+ "t.typstorage,\n"
+ "a.attnotnull,\n"
+ "a.atthasdef,\n"
+ "a.attisdropped,\n"
+ "a.attlen,\n"
+ "a.attalign,\n"
+ "a.attislocal,\n"
+ "pg_catalog.format_type(t.oid, a.atttypmod) AS atttypname,\n"
+ "array_to_string(a.attoptions, ', ') AS attoptions,\n"
+ "CASE WHEN a.attcollation <> t.typcollation "
+ "THEN a.attcollation ELSE 0 END AS attcollation,\n"
+ "pg_catalog.array_to_string(ARRAY("
+ "SELECT pg_catalog.quote_ident(option_name) || "
+ "' ' || pg_catalog.quote_literal(option_value) "
+ "FROM pg_catalog.pg_options_to_table(attfdwoptions) "
+ "ORDER BY option_name"
+ "), E',\n ') AS attfdwoptions,\n");
+
+ if (fout->remoteVersion >= 140000)
+ appendPQExpBufferStr(q,
+ "a.attcompression AS attcompression,\n");
+ else
+ appendPQExpBufferStr(q,
+ "'' AS attcompression,\n");
+
+ if (fout->remoteVersion >= 100000)
+ appendPQExpBufferStr(q,
+ "a.attidentity,\n");
+ else
+ appendPQExpBufferStr(q,
+ "'' AS attidentity,\n");
+
+ if (fout->remoteVersion >= 110000)
+ appendPQExpBufferStr(q,
+ "CASE WHEN a.atthasmissing AND NOT a.attisdropped "
+ "THEN a.attmissingval ELSE null END AS attmissingval,\n");
+ else
+ appendPQExpBufferStr(q,
+ "NULL AS attmissingval,\n");
+
+ if (fout->remoteVersion >= 120000)
+ appendPQExpBufferStr(q,
+ "a.attgenerated\n");
+ else
+ appendPQExpBufferStr(q,
+ "'' AS attgenerated\n");
+
+ /* need left join to pg_type to not fail on dropped columns ... */
+ appendPQExpBuffer(q,
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_attribute a ON (src.tbloid = a.attrelid) "
+ "LEFT JOIN pg_catalog.pg_type t "
+ "ON (a.atttypid = t.oid)\n"
+ "WHERE a.attnum > 0::pg_catalog.int2\n"
+ "ORDER BY a.attrelid, a.attnum",
+ tbloids->data);
+
+ res = ExecuteSqlQuery(fout, q->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_attrelid = PQfnumber(res, "attrelid");
+ i_attnum = PQfnumber(res, "attnum");
+ i_attname = PQfnumber(res, "attname");
+ i_atttypname = PQfnumber(res, "atttypname");
+ i_atttypmod = PQfnumber(res, "atttypmod");
+ i_attstattarget = PQfnumber(res, "attstattarget");
+ i_attstorage = PQfnumber(res, "attstorage");
+ i_typstorage = PQfnumber(res, "typstorage");
+ i_attidentity = PQfnumber(res, "attidentity");
+ i_attgenerated = PQfnumber(res, "attgenerated");
+ i_attisdropped = PQfnumber(res, "attisdropped");
+ i_attlen = PQfnumber(res, "attlen");
+ i_attalign = PQfnumber(res, "attalign");
+ i_attislocal = PQfnumber(res, "attislocal");
+ i_attnotnull = PQfnumber(res, "attnotnull");
+ i_attoptions = PQfnumber(res, "attoptions");
+ i_attcollation = PQfnumber(res, "attcollation");
+ i_attcompression = PQfnumber(res, "attcompression");
+ i_attfdwoptions = PQfnumber(res, "attfdwoptions");
+ i_attmissingval = PQfnumber(res, "attmissingval");
+ i_atthasdef = PQfnumber(res, "atthasdef");
+
+ /* Within the next loop, we'll accumulate OIDs of tables with defaults */
+ resetPQExpBuffer(tbloids);
+ appendPQExpBufferChar(tbloids, '{');
+
+ /*
+ * Outer loop iterates once per table, not once per row. Incrementing of
+ * r is handled by the inner loop.
+ */
+ curtblindx = -1;
+ for (int r = 0; r < ntups;)
+ {
+ Oid attrelid = atooid(PQgetvalue(res, r, i_attrelid));
+ TableInfo *tbinfo = NULL;
+ int numatts;
+ bool hasdefaults;
+
+ /* Count rows for this table */
+ for (numatts = 1; numatts < ntups - r; numatts++)
+ if (atooid(PQgetvalue(res, r + numatts, i_attrelid)) != attrelid)
+ break;
+
+ /*
+ * Locate the associated TableInfo; we rely on tblinfo[] being in OID
+ * order.
+ */
+ while (++curtblindx < numTables)
+ {
+ tbinfo = &tblinfo[curtblindx];
+ if (tbinfo->dobj.catId.oid == attrelid)
+ break;
+ }
+ if (curtblindx >= numTables)
+ pg_fatal("unrecognized table OID %u", attrelid);
+ /* cross-check that we only got requested tables */
+ if (tbinfo->relkind == RELKIND_SEQUENCE ||
+ !tbinfo->interesting)
+ pg_fatal("unexpected column data for table \"%s\"",
+ tbinfo->dobj.name);
+
+ /* Save data for this table */
+ tbinfo->numatts = numatts;
+ tbinfo->attnames = (char **) pg_malloc(numatts * sizeof(char *));
+ tbinfo->atttypnames = (char **) pg_malloc(numatts * sizeof(char *));
+ tbinfo->atttypmod = (int *) pg_malloc(numatts * sizeof(int));
+ tbinfo->attstattarget = (int *) pg_malloc(numatts * sizeof(int));
+ tbinfo->attstorage = (char *) pg_malloc(numatts * sizeof(char));
+ tbinfo->typstorage = (char *) pg_malloc(numatts * sizeof(char));
+ tbinfo->attidentity = (char *) pg_malloc(numatts * sizeof(char));
+ tbinfo->attgenerated = (char *) pg_malloc(numatts * sizeof(char));
+ tbinfo->attisdropped = (bool *) pg_malloc(numatts * sizeof(bool));
+ tbinfo->attlen = (int *) pg_malloc(numatts * sizeof(int));
+ tbinfo->attalign = (char *) pg_malloc(numatts * sizeof(char));
+ tbinfo->attislocal = (bool *) pg_malloc(numatts * sizeof(bool));
+ tbinfo->attoptions = (char **) pg_malloc(numatts * sizeof(char *));
+ tbinfo->attcollation = (Oid *) pg_malloc(numatts * sizeof(Oid));
+ tbinfo->attcompression = (char *) pg_malloc(numatts * sizeof(char));
+ tbinfo->attfdwoptions = (char **) pg_malloc(numatts * sizeof(char *));
+ tbinfo->attmissingval = (char **) pg_malloc(numatts * sizeof(char *));
+ tbinfo->notnull = (bool *) pg_malloc(numatts * sizeof(bool));
+ tbinfo->inhNotNull = (bool *) pg_malloc(numatts * sizeof(bool));
+ tbinfo->attrdefs = (AttrDefInfo **) pg_malloc(numatts * sizeof(AttrDefInfo *));
+ hasdefaults = false;
+
+ for (int j = 0; j < numatts; j++, r++)
+ {
+ if (j + 1 != atoi(PQgetvalue(res, r, i_attnum)))
+ pg_fatal("invalid column numbering in table \"%s\"",
+ tbinfo->dobj.name);
+ tbinfo->attnames[j] = pg_strdup(PQgetvalue(res, r, i_attname));
+ tbinfo->atttypnames[j] = pg_strdup(PQgetvalue(res, r, i_atttypname));
+ tbinfo->atttypmod[j] = atoi(PQgetvalue(res, r, i_atttypmod));
+ tbinfo->attstattarget[j] = atoi(PQgetvalue(res, r, i_attstattarget));
+ tbinfo->attstorage[j] = *(PQgetvalue(res, r, i_attstorage));
+ tbinfo->typstorage[j] = *(PQgetvalue(res, r, i_typstorage));
+ tbinfo->attidentity[j] = *(PQgetvalue(res, r, i_attidentity));
+ tbinfo->attgenerated[j] = *(PQgetvalue(res, r, i_attgenerated));
+ tbinfo->needs_override = tbinfo->needs_override || (tbinfo->attidentity[j] == ATTRIBUTE_IDENTITY_ALWAYS);
+ tbinfo->attisdropped[j] = (PQgetvalue(res, r, i_attisdropped)[0] == 't');
+ tbinfo->attlen[j] = atoi(PQgetvalue(res, r, i_attlen));
+ tbinfo->attalign[j] = *(PQgetvalue(res, r, i_attalign));
+ tbinfo->attislocal[j] = (PQgetvalue(res, r, i_attislocal)[0] == 't');
+ tbinfo->notnull[j] = (PQgetvalue(res, r, i_attnotnull)[0] == 't');
+ tbinfo->attoptions[j] = pg_strdup(PQgetvalue(res, r, i_attoptions));
+ tbinfo->attcollation[j] = atooid(PQgetvalue(res, r, i_attcollation));
+ tbinfo->attcompression[j] = *(PQgetvalue(res, r, i_attcompression));
+ tbinfo->attfdwoptions[j] = pg_strdup(PQgetvalue(res, r, i_attfdwoptions));
+ tbinfo->attmissingval[j] = pg_strdup(PQgetvalue(res, r, i_attmissingval));
+ tbinfo->attrdefs[j] = NULL; /* fix below */
+ if (PQgetvalue(res, r, i_atthasdef)[0] == 't')
+ hasdefaults = true;
+ /* these flags will be set in flagInhAttrs() */
+ tbinfo->inhNotNull[j] = false;
+ }
+
+ if (hasdefaults)
+ {
+ /* Collect OIDs of interesting tables that have defaults */
+ if (tbloids->len > 1) /* do we have more than the '{'? */
+ appendPQExpBufferChar(tbloids, ',');
+ appendPQExpBuffer(tbloids, "%u", tbinfo->dobj.catId.oid);
+ }
+ }
+
+ PQclear(res);
+
+ /*
+ * Now get info about column defaults. This is skipped for a data-only
+ * dump, as it is only needed for table schemas.
+ */
+ if (!dopt->dataOnly && tbloids->len > 1)
+ {
+ AttrDefInfo *attrdefs;
+ int numDefaults;
+ TableInfo *tbinfo = NULL;
+
+ pg_log_info("finding table default expressions");
+
+ appendPQExpBufferChar(tbloids, '}');
+
+ printfPQExpBuffer(q, "SELECT a.tableoid, a.oid, adrelid, adnum, "
+ "pg_catalog.pg_get_expr(adbin, adrelid) AS adsrc\n"
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_attrdef a ON (src.tbloid = a.adrelid)\n"
+ "ORDER BY a.adrelid, a.adnum",
+ tbloids->data);
+
+ res = ExecuteSqlQuery(fout, q->data, PGRES_TUPLES_OK);
+
+ numDefaults = PQntuples(res);
+ attrdefs = (AttrDefInfo *) pg_malloc(numDefaults * sizeof(AttrDefInfo));
+
+ curtblindx = -1;
+ for (int j = 0; j < numDefaults; j++)
+ {
+ Oid adtableoid = atooid(PQgetvalue(res, j, 0));
+ Oid adoid = atooid(PQgetvalue(res, j, 1));
+ Oid adrelid = atooid(PQgetvalue(res, j, 2));
+ int adnum = atoi(PQgetvalue(res, j, 3));
+ char *adsrc = PQgetvalue(res, j, 4);
+
+ /*
+ * Locate the associated TableInfo; we rely on tblinfo[] being in
+ * OID order.
+ */
+ if (tbinfo == NULL || tbinfo->dobj.catId.oid != adrelid)
+ {
+ while (++curtblindx < numTables)
+ {
+ tbinfo = &tblinfo[curtblindx];
+ if (tbinfo->dobj.catId.oid == adrelid)
+ break;
+ }
+ if (curtblindx >= numTables)
+ pg_fatal("unrecognized table OID %u", adrelid);
+ }
+
+ if (adnum <= 0 || adnum > tbinfo->numatts)
+ pg_fatal("invalid adnum value %d for table \"%s\"",
+ adnum, tbinfo->dobj.name);
+
+ /*
+ * dropped columns shouldn't have defaults, but just in case,
+ * ignore 'em
+ */
+ if (tbinfo->attisdropped[adnum - 1])
+ continue;
+
+ attrdefs[j].dobj.objType = DO_ATTRDEF;
+ attrdefs[j].dobj.catId.tableoid = adtableoid;
+ attrdefs[j].dobj.catId.oid = adoid;
+ AssignDumpId(&attrdefs[j].dobj);
+ attrdefs[j].adtable = tbinfo;
+ attrdefs[j].adnum = adnum;
+ attrdefs[j].adef_expr = pg_strdup(adsrc);
+
+ attrdefs[j].dobj.name = pg_strdup(tbinfo->dobj.name);
+ attrdefs[j].dobj.namespace = tbinfo->dobj.namespace;
+
+ attrdefs[j].dobj.dump = tbinfo->dobj.dump;
+
+ /*
+ * Figure out whether the default/generation expression should be
+ * dumped as part of the main CREATE TABLE (or similar) command or
+ * as a separate ALTER TABLE (or similar) command. The preference
+ * is to put it into the CREATE command, but in some cases that's
+ * not possible.
+ */
+ if (tbinfo->attgenerated[adnum - 1])
+ {
+ /*
+ * Column generation expressions cannot be dumped separately,
+ * because there is no syntax for it. The !shouldPrintColumn
+ * case below will be tempted to set them to separate if they
+ * are attached to an inherited column without a local
+ * definition, but that would be wrong and unnecessary,
+ * because generation expressions are always inherited, so
+ * there is no need to set them again in child tables, and
+ * there is no syntax for it either. By setting separate to
+ * false here we prevent the "default" from being processed as
+ * its own dumpable object, and flagInhAttrs() will remove it
+ * from the table when it detects that it belongs to an
+ * inherited column.
+ */
+ attrdefs[j].separate = false;
+ }
+ else if (tbinfo->relkind == RELKIND_VIEW)
+ {
+ /*
+ * Defaults on a VIEW must always be dumped as separate ALTER
+ * TABLE commands.
+ */
+ attrdefs[j].separate = true;
+ }
+ else if (!shouldPrintColumn(dopt, tbinfo, adnum - 1))
+ {
+ /* column will be suppressed, print default separately */
+ attrdefs[j].separate = true;
+ }
+ else
+ {
+ attrdefs[j].separate = false;
+ }
+
+ if (!attrdefs[j].separate)
+ {
+ /*
+ * Mark the default as needing to appear before the table, so
+ * that any dependencies it has must be emitted before the
+ * CREATE TABLE. If this is not possible, we'll change to
+ * "separate" mode while sorting dependencies.
+ */
+ addObjectDependency(&tbinfo->dobj,
+ attrdefs[j].dobj.dumpId);
+ }
+
+ tbinfo->attrdefs[adnum - 1] = &attrdefs[j];
+ }
+
+ PQclear(res);
+ }
+
+ /*
+ * Get info about table CHECK constraints. This is skipped for a
+ * data-only dump, as it is only needed for table schemas.
+ */
+ if (!dopt->dataOnly && checkoids->len > 2)
+ {
+ ConstraintInfo *constrs;
+ int numConstrs;
+ int i_tableoid;
+ int i_oid;
+ int i_conrelid;
+ int i_conname;
+ int i_consrc;
+ int i_conislocal;
+ int i_convalidated;
+
+ pg_log_info("finding table check constraints");
+
+ resetPQExpBuffer(q);
+ appendPQExpBuffer(q,
+ "SELECT c.tableoid, c.oid, conrelid, conname, "
+ "pg_catalog.pg_get_constraintdef(c.oid) AS consrc, "
+ "conislocal, convalidated "
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_constraint c ON (src.tbloid = c.conrelid)\n"
+ "WHERE contype = 'c' "
+ "ORDER BY c.conrelid, c.conname",
+ checkoids->data);
+
+ res = ExecuteSqlQuery(fout, q->data, PGRES_TUPLES_OK);
+
+ numConstrs = PQntuples(res);
+ constrs = (ConstraintInfo *) pg_malloc(numConstrs * sizeof(ConstraintInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_conrelid = PQfnumber(res, "conrelid");
+ i_conname = PQfnumber(res, "conname");
+ i_consrc = PQfnumber(res, "consrc");
+ i_conislocal = PQfnumber(res, "conislocal");
+ i_convalidated = PQfnumber(res, "convalidated");
+
+ /* As above, this loop iterates once per table, not once per row */
+ curtblindx = -1;
+ for (int j = 0; j < numConstrs;)
+ {
+ Oid conrelid = atooid(PQgetvalue(res, j, i_conrelid));
+ TableInfo *tbinfo = NULL;
+ int numcons;
+
+ /* Count rows for this table */
+ for (numcons = 1; numcons < numConstrs - j; numcons++)
+ if (atooid(PQgetvalue(res, j + numcons, i_conrelid)) != conrelid)
+ break;
+
+ /*
+ * Locate the associated TableInfo; we rely on tblinfo[] being in
+ * OID order.
+ */
+ while (++curtblindx < numTables)
+ {
+ tbinfo = &tblinfo[curtblindx];
+ if (tbinfo->dobj.catId.oid == conrelid)
+ break;
+ }
+ if (curtblindx >= numTables)
+ pg_fatal("unrecognized table OID %u", conrelid);
+
+ if (numcons != tbinfo->ncheck)
+ {
+ pg_log_error(ngettext("expected %d check constraint on table \"%s\" but found %d",
+ "expected %d check constraints on table \"%s\" but found %d",
+ tbinfo->ncheck),
+ tbinfo->ncheck, tbinfo->dobj.name, numcons);
+ pg_log_error_hint("The system catalogs might be corrupted.");
+ exit_nicely(1);
+ }
+
+ tbinfo->checkexprs = constrs + j;
+
+ for (int c = 0; c < numcons; c++, j++)
+ {
+ bool validated = PQgetvalue(res, j, i_convalidated)[0] == 't';
+
+ constrs[j].dobj.objType = DO_CONSTRAINT;
+ constrs[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_tableoid));
+ constrs[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_oid));
+ AssignDumpId(&constrs[j].dobj);
+ constrs[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_conname));
+ constrs[j].dobj.namespace = tbinfo->dobj.namespace;
+ constrs[j].contable = tbinfo;
+ constrs[j].condomain = NULL;
+ constrs[j].contype = 'c';
+ constrs[j].condef = pg_strdup(PQgetvalue(res, j, i_consrc));
+ constrs[j].confrelid = InvalidOid;
+ constrs[j].conindex = 0;
+ constrs[j].condeferrable = false;
+ constrs[j].condeferred = false;
+ constrs[j].conislocal = (PQgetvalue(res, j, i_conislocal)[0] == 't');
+
+ /*
+ * An unvalidated constraint needs to be dumped separately, so
+ * that potentially-violating existing data is loaded before
+ * the constraint.
+ */
+ constrs[j].separate = !validated;
+
+ constrs[j].dobj.dump = tbinfo->dobj.dump;
+
+ /*
+ * Mark the constraint as needing to appear before the table
+ * --- this is so that any other dependencies of the
+ * constraint will be emitted before we try to create the
+ * table. If the constraint is to be dumped separately, it
+ * will be dumped after data is loaded anyway, so don't do it.
+ * (There's an automatic dependency in the opposite direction
+ * anyway, so don't need to add one manually here.)
+ */
+ if (!constrs[j].separate)
+ addObjectDependency(&tbinfo->dobj,
+ constrs[j].dobj.dumpId);
+
+ /*
+ * We will detect later whether the constraint must be split
+ * out from the table definition.
+ */
+ }
+ }
+
+ PQclear(res);
+ }
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(tbloids);
+ destroyPQExpBuffer(checkoids);
+}
+
+/*
+ * Test whether a column should be printed as part of table's CREATE TABLE.
+ * Column number is zero-based.
+ *
+ * Normally this is always true, but it's false for dropped columns, as well
+ * as those that were inherited without any local definition. (If we print
+ * such a column it will mistakenly get pg_attribute.attislocal set to true.)
+ * For partitions, it's always true, because we want the partitions to be
+ * created independently and ATTACH PARTITION used afterwards.
+ *
+ * In binary_upgrade mode, we must print all columns and fix the attislocal/
+ * attisdropped state later, so as to keep control of the physical column
+ * order.
+ *
+ * This function exists because there are scattered nonobvious places that
+ * must be kept in sync with this decision.
+ */
+bool
+shouldPrintColumn(const DumpOptions *dopt, const TableInfo *tbinfo, int colno)
+{
+ if (dopt->binary_upgrade)
+ return true;
+ if (tbinfo->attisdropped[colno])
+ return false;
+ return (tbinfo->attislocal[colno] || tbinfo->ispartition);
+}
+
+
+/*
+ * getTSParsers:
+ * read all text search parsers in the system catalogs and return them
+ * in the TSParserInfo* structure
+ *
+ * numTSParsers is set to the number of parsers read in
+ */
+TSParserInfo *
+getTSParsers(Archive *fout, int *numTSParsers)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ TSParserInfo *prsinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_prsname;
+ int i_prsnamespace;
+ int i_prsstart;
+ int i_prstoken;
+ int i_prsend;
+ int i_prsheadline;
+ int i_prslextype;
+
+ query = createPQExpBuffer();
+
+ /*
+ * find all text search objects, including builtin ones; we filter out
+ * system-defined objects at dump-out time.
+ */
+
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, prsname, prsnamespace, "
+ "prsstart::oid, prstoken::oid, "
+ "prsend::oid, prsheadline::oid, prslextype::oid "
+ "FROM pg_ts_parser");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numTSParsers = ntups;
+
+ prsinfo = (TSParserInfo *) pg_malloc(ntups * sizeof(TSParserInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_prsname = PQfnumber(res, "prsname");
+ i_prsnamespace = PQfnumber(res, "prsnamespace");
+ i_prsstart = PQfnumber(res, "prsstart");
+ i_prstoken = PQfnumber(res, "prstoken");
+ i_prsend = PQfnumber(res, "prsend");
+ i_prsheadline = PQfnumber(res, "prsheadline");
+ i_prslextype = PQfnumber(res, "prslextype");
+
+ for (i = 0; i < ntups; i++)
+ {
+ prsinfo[i].dobj.objType = DO_TSPARSER;
+ prsinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ prsinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&prsinfo[i].dobj);
+ prsinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_prsname));
+ prsinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_prsnamespace)));
+ prsinfo[i].prsstart = atooid(PQgetvalue(res, i, i_prsstart));
+ prsinfo[i].prstoken = atooid(PQgetvalue(res, i, i_prstoken));
+ prsinfo[i].prsend = atooid(PQgetvalue(res, i, i_prsend));
+ prsinfo[i].prsheadline = atooid(PQgetvalue(res, i, i_prsheadline));
+ prsinfo[i].prslextype = atooid(PQgetvalue(res, i, i_prslextype));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(prsinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return prsinfo;
+}
+
+/*
+ * getTSDictionaries:
+ * read all text search dictionaries in the system catalogs and return them
+ * in the TSDictInfo* structure
+ *
+ * numTSDicts is set to the number of dictionaries read in
+ */
+TSDictInfo *
+getTSDictionaries(Archive *fout, int *numTSDicts)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ TSDictInfo *dictinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_dictname;
+ int i_dictnamespace;
+ int i_dictowner;
+ int i_dicttemplate;
+ int i_dictinitoption;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBuffer(query, "SELECT tableoid, oid, dictname, "
+ "dictnamespace, dictowner, "
+ "dicttemplate, dictinitoption "
+ "FROM pg_ts_dict");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numTSDicts = ntups;
+
+ dictinfo = (TSDictInfo *) pg_malloc(ntups * sizeof(TSDictInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_dictname = PQfnumber(res, "dictname");
+ i_dictnamespace = PQfnumber(res, "dictnamespace");
+ i_dictowner = PQfnumber(res, "dictowner");
+ i_dictinitoption = PQfnumber(res, "dictinitoption");
+ i_dicttemplate = PQfnumber(res, "dicttemplate");
+
+ for (i = 0; i < ntups; i++)
+ {
+ dictinfo[i].dobj.objType = DO_TSDICT;
+ dictinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ dictinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&dictinfo[i].dobj);
+ dictinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_dictname));
+ dictinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_dictnamespace)));
+ dictinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_dictowner));
+ dictinfo[i].dicttemplate = atooid(PQgetvalue(res, i, i_dicttemplate));
+ if (PQgetisnull(res, i, i_dictinitoption))
+ dictinfo[i].dictinitoption = NULL;
+ else
+ dictinfo[i].dictinitoption = pg_strdup(PQgetvalue(res, i, i_dictinitoption));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(dictinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return dictinfo;
+}
+
+/*
+ * getTSTemplates:
+ * read all text search templates in the system catalogs and return them
+ * in the TSTemplateInfo* structure
+ *
+ * numTSTemplates is set to the number of templates read in
+ */
+TSTemplateInfo *
+getTSTemplates(Archive *fout, int *numTSTemplates)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ TSTemplateInfo *tmplinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_tmplname;
+ int i_tmplnamespace;
+ int i_tmplinit;
+ int i_tmpllexize;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, tmplname, "
+ "tmplnamespace, tmplinit::oid, tmpllexize::oid "
+ "FROM pg_ts_template");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numTSTemplates = ntups;
+
+ tmplinfo = (TSTemplateInfo *) pg_malloc(ntups * sizeof(TSTemplateInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_tmplname = PQfnumber(res, "tmplname");
+ i_tmplnamespace = PQfnumber(res, "tmplnamespace");
+ i_tmplinit = PQfnumber(res, "tmplinit");
+ i_tmpllexize = PQfnumber(res, "tmpllexize");
+
+ for (i = 0; i < ntups; i++)
+ {
+ tmplinfo[i].dobj.objType = DO_TSTEMPLATE;
+ tmplinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ tmplinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&tmplinfo[i].dobj);
+ tmplinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_tmplname));
+ tmplinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_tmplnamespace)));
+ tmplinfo[i].tmplinit = atooid(PQgetvalue(res, i, i_tmplinit));
+ tmplinfo[i].tmpllexize = atooid(PQgetvalue(res, i, i_tmpllexize));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(tmplinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return tmplinfo;
+}
+
+/*
+ * getTSConfigurations:
+ * read all text search configurations in the system catalogs and return
+ * them in the TSConfigInfo* structure
+ *
+ * numTSConfigs is set to the number of configurations read in
+ */
+TSConfigInfo *
+getTSConfigurations(Archive *fout, int *numTSConfigs)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ TSConfigInfo *cfginfo;
+ int i_tableoid;
+ int i_oid;
+ int i_cfgname;
+ int i_cfgnamespace;
+ int i_cfgowner;
+ int i_cfgparser;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBuffer(query, "SELECT tableoid, oid, cfgname, "
+ "cfgnamespace, cfgowner, cfgparser "
+ "FROM pg_ts_config");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numTSConfigs = ntups;
+
+ cfginfo = (TSConfigInfo *) pg_malloc(ntups * sizeof(TSConfigInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_cfgname = PQfnumber(res, "cfgname");
+ i_cfgnamespace = PQfnumber(res, "cfgnamespace");
+ i_cfgowner = PQfnumber(res, "cfgowner");
+ i_cfgparser = PQfnumber(res, "cfgparser");
+
+ for (i = 0; i < ntups; i++)
+ {
+ cfginfo[i].dobj.objType = DO_TSCONFIG;
+ cfginfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ cfginfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&cfginfo[i].dobj);
+ cfginfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_cfgname));
+ cfginfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_cfgnamespace)));
+ cfginfo[i].rolname = getRoleName(PQgetvalue(res, i, i_cfgowner));
+ cfginfo[i].cfgparser = atooid(PQgetvalue(res, i, i_cfgparser));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(cfginfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return cfginfo;
+}
+
+/*
+ * getForeignDataWrappers:
+ * read all foreign-data wrappers in the system catalogs and return
+ * them in the FdwInfo* structure
+ *
+ * numForeignDataWrappers is set to the number of fdws read in
+ */
+FdwInfo *
+getForeignDataWrappers(Archive *fout, int *numForeignDataWrappers)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ FdwInfo *fdwinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_fdwname;
+ int i_fdwowner;
+ int i_fdwhandler;
+ int i_fdwvalidator;
+ int i_fdwacl;
+ int i_acldefault;
+ int i_fdwoptions;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBuffer(query, "SELECT tableoid, oid, fdwname, "
+ "fdwowner, "
+ "fdwhandler::pg_catalog.regproc, "
+ "fdwvalidator::pg_catalog.regproc, "
+ "fdwacl, "
+ "acldefault('F', fdwowner) AS acldefault, "
+ "array_to_string(ARRAY("
+ "SELECT quote_ident(option_name) || ' ' || "
+ "quote_literal(option_value) "
+ "FROM pg_options_to_table(fdwoptions) "
+ "ORDER BY option_name"
+ "), E',\n ') AS fdwoptions "
+ "FROM pg_foreign_data_wrapper");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numForeignDataWrappers = ntups;
+
+ fdwinfo = (FdwInfo *) pg_malloc(ntups * sizeof(FdwInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_fdwname = PQfnumber(res, "fdwname");
+ i_fdwowner = PQfnumber(res, "fdwowner");
+ i_fdwhandler = PQfnumber(res, "fdwhandler");
+ i_fdwvalidator = PQfnumber(res, "fdwvalidator");
+ i_fdwacl = PQfnumber(res, "fdwacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+ i_fdwoptions = PQfnumber(res, "fdwoptions");
+
+ for (i = 0; i < ntups; i++)
+ {
+ fdwinfo[i].dobj.objType = DO_FDW;
+ fdwinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ fdwinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&fdwinfo[i].dobj);
+ fdwinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_fdwname));
+ fdwinfo[i].dobj.namespace = NULL;
+ fdwinfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_fdwacl));
+ fdwinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ fdwinfo[i].dacl.privtype = 0;
+ fdwinfo[i].dacl.initprivs = NULL;
+ fdwinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_fdwowner));
+ fdwinfo[i].fdwhandler = pg_strdup(PQgetvalue(res, i, i_fdwhandler));
+ fdwinfo[i].fdwvalidator = pg_strdup(PQgetvalue(res, i, i_fdwvalidator));
+ fdwinfo[i].fdwoptions = pg_strdup(PQgetvalue(res, i, i_fdwoptions));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(fdwinfo[i].dobj), fout);
+
+ /* Mark whether FDW has an ACL */
+ if (!PQgetisnull(res, i, i_fdwacl))
+ fdwinfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return fdwinfo;
+}
+
+/*
+ * getForeignServers:
+ * read all foreign servers in the system catalogs and return
+ * them in the ForeignServerInfo * structure
+ *
+ * numForeignServers is set to the number of servers read in
+ */
+ForeignServerInfo *
+getForeignServers(Archive *fout, int *numForeignServers)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ ForeignServerInfo *srvinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_srvname;
+ int i_srvowner;
+ int i_srvfdw;
+ int i_srvtype;
+ int i_srvversion;
+ int i_srvacl;
+ int i_acldefault;
+ int i_srvoptions;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBuffer(query, "SELECT tableoid, oid, srvname, "
+ "srvowner, "
+ "srvfdw, srvtype, srvversion, srvacl, "
+ "acldefault('S', srvowner) AS acldefault, "
+ "array_to_string(ARRAY("
+ "SELECT quote_ident(option_name) || ' ' || "
+ "quote_literal(option_value) "
+ "FROM pg_options_to_table(srvoptions) "
+ "ORDER BY option_name"
+ "), E',\n ') AS srvoptions "
+ "FROM pg_foreign_server");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numForeignServers = ntups;
+
+ srvinfo = (ForeignServerInfo *) pg_malloc(ntups * sizeof(ForeignServerInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_srvname = PQfnumber(res, "srvname");
+ i_srvowner = PQfnumber(res, "srvowner");
+ i_srvfdw = PQfnumber(res, "srvfdw");
+ i_srvtype = PQfnumber(res, "srvtype");
+ i_srvversion = PQfnumber(res, "srvversion");
+ i_srvacl = PQfnumber(res, "srvacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+ i_srvoptions = PQfnumber(res, "srvoptions");
+
+ for (i = 0; i < ntups; i++)
+ {
+ srvinfo[i].dobj.objType = DO_FOREIGN_SERVER;
+ srvinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ srvinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&srvinfo[i].dobj);
+ srvinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_srvname));
+ srvinfo[i].dobj.namespace = NULL;
+ srvinfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_srvacl));
+ srvinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ srvinfo[i].dacl.privtype = 0;
+ srvinfo[i].dacl.initprivs = NULL;
+ srvinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_srvowner));
+ srvinfo[i].srvfdw = atooid(PQgetvalue(res, i, i_srvfdw));
+ srvinfo[i].srvtype = pg_strdup(PQgetvalue(res, i, i_srvtype));
+ srvinfo[i].srvversion = pg_strdup(PQgetvalue(res, i, i_srvversion));
+ srvinfo[i].srvoptions = pg_strdup(PQgetvalue(res, i, i_srvoptions));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(srvinfo[i].dobj), fout);
+
+ /* Servers have user mappings */
+ srvinfo[i].dobj.components |= DUMP_COMPONENT_USERMAP;
+
+ /* Mark whether server has an ACL */
+ if (!PQgetisnull(res, i, i_srvacl))
+ srvinfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return srvinfo;
+}
+
+/*
+ * getDefaultACLs:
+ * read all default ACL information in the system catalogs and return
+ * them in the DefaultACLInfo structure
+ *
+ * numDefaultACLs is set to the number of ACLs read in
+ */
+DefaultACLInfo *
+getDefaultACLs(Archive *fout, int *numDefaultACLs)
+{
+ DumpOptions *dopt = fout->dopt;
+ DefaultACLInfo *daclinfo;
+ PQExpBuffer query;
+ PGresult *res;
+ int i_oid;
+ int i_tableoid;
+ int i_defaclrole;
+ int i_defaclnamespace;
+ int i_defaclobjtype;
+ int i_defaclacl;
+ int i_acldefault;
+ int i,
+ ntups;
+
+ query = createPQExpBuffer();
+
+ /*
+ * Global entries (with defaclnamespace=0) replace the hard-wired default
+ * ACL for their object type. We should dump them as deltas from the
+ * default ACL, since that will be used as a starting point for
+ * interpreting the ALTER DEFAULT PRIVILEGES commands. On the other hand,
+ * non-global entries can only add privileges not revoke them. We must
+ * dump those as-is (i.e., as deltas from an empty ACL).
+ *
+ * We can use defaclobjtype as the object type for acldefault(), except
+ * for the case of 'S' (DEFACLOBJ_SEQUENCE) which must be converted to
+ * 's'.
+ */
+ appendPQExpBuffer(query,
+ "SELECT oid, tableoid, "
+ "defaclrole, "
+ "defaclnamespace, "
+ "defaclobjtype, "
+ "defaclacl, "
+ "CASE WHEN defaclnamespace = 0 THEN "
+ "acldefault(CASE WHEN defaclobjtype = 'S' "
+ "THEN 's'::\"char\" ELSE defaclobjtype END, "
+ "defaclrole) ELSE '{}' END AS acldefault "
+ "FROM pg_default_acl");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numDefaultACLs = ntups;
+
+ daclinfo = (DefaultACLInfo *) pg_malloc(ntups * sizeof(DefaultACLInfo));
+
+ i_oid = PQfnumber(res, "oid");
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_defaclrole = PQfnumber(res, "defaclrole");
+ i_defaclnamespace = PQfnumber(res, "defaclnamespace");
+ i_defaclobjtype = PQfnumber(res, "defaclobjtype");
+ i_defaclacl = PQfnumber(res, "defaclacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+
+ for (i = 0; i < ntups; i++)
+ {
+ Oid nspid = atooid(PQgetvalue(res, i, i_defaclnamespace));
+
+ daclinfo[i].dobj.objType = DO_DEFAULT_ACL;
+ daclinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ daclinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&daclinfo[i].dobj);
+ /* cheesy ... is it worth coming up with a better object name? */
+ daclinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_defaclobjtype));
+
+ if (nspid != InvalidOid)
+ daclinfo[i].dobj.namespace = findNamespace(nspid);
+ else
+ daclinfo[i].dobj.namespace = NULL;
+
+ daclinfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_defaclacl));
+ daclinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ daclinfo[i].dacl.privtype = 0;
+ daclinfo[i].dacl.initprivs = NULL;
+ daclinfo[i].defaclrole = getRoleName(PQgetvalue(res, i, i_defaclrole));
+ daclinfo[i].defaclobjtype = *(PQgetvalue(res, i, i_defaclobjtype));
+
+ /* Default ACLs are ACLs, of course */
+ daclinfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+
+ /* Decide whether we want to dump it */
+ selectDumpableDefaultACL(&(daclinfo[i]), dopt);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return daclinfo;
+}
+
+/*
+ * getRoleName -- look up the name of a role, given its OID
+ *
+ * In current usage, we don't expect failures, so error out for a bad OID.
+ */
+static const char *
+getRoleName(const char *roleoid_str)
+{
+ Oid roleoid = atooid(roleoid_str);
+
+ /*
+ * Do binary search to find the appropriate item.
+ */
+ if (nrolenames > 0)
+ {
+ RoleNameItem *low = &rolenames[0];
+ RoleNameItem *high = &rolenames[nrolenames - 1];
+
+ while (low <= high)
+ {
+ RoleNameItem *middle = low + (high - low) / 2;
+
+ if (roleoid < middle->roleoid)
+ high = middle - 1;
+ else if (roleoid > middle->roleoid)
+ low = middle + 1;
+ else
+ return middle->rolename; /* found a match */
+ }
+ }
+
+ pg_fatal("role with OID %u does not exist", roleoid);
+ return NULL; /* keep compiler quiet */
+}
+
+/*
+ * collectRoleNames --
+ *
+ * Construct a table of all known roles.
+ * The table is sorted by OID for speed in lookup.
+ */
+static void
+collectRoleNames(Archive *fout)
+{
+ PGresult *res;
+ const char *query;
+ int i;
+
+ query = "SELECT oid, rolname FROM pg_catalog.pg_roles ORDER BY 1";
+
+ res = ExecuteSqlQuery(fout, query, PGRES_TUPLES_OK);
+
+ nrolenames = PQntuples(res);
+
+ rolenames = (RoleNameItem *) pg_malloc(nrolenames * sizeof(RoleNameItem));
+
+ for (i = 0; i < nrolenames; i++)
+ {
+ rolenames[i].roleoid = atooid(PQgetvalue(res, i, 0));
+ rolenames[i].rolename = pg_strdup(PQgetvalue(res, i, 1));
+ }
+
+ PQclear(res);
+}
+
+/*
+ * getAdditionalACLs
+ *
+ * We have now created all the DumpableObjects, and collected the ACL data
+ * that appears in the directly-associated catalog entries. However, there's
+ * more ACL-related info to collect. If any of a table's columns have ACLs,
+ * we must set the TableInfo's DUMP_COMPONENT_ACL components flag, as well as
+ * its hascolumnACLs flag (we won't store the ACLs themselves here, though).
+ * Also, in versions having the pg_init_privs catalog, read that and load the
+ * information into the relevant DumpableObjects.
+ */
+static void
+getAdditionalACLs(Archive *fout)
+{
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ int ntups,
+ i;
+
+ /* Check for per-column ACLs */
+ appendPQExpBufferStr(query,
+ "SELECT DISTINCT attrelid FROM pg_attribute "
+ "WHERE attacl IS NOT NULL");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ for (i = 0; i < ntups; i++)
+ {
+ Oid relid = atooid(PQgetvalue(res, i, 0));
+ TableInfo *tblinfo;
+
+ tblinfo = findTableByOid(relid);
+ /* OK to ignore tables we haven't got a DumpableObject for */
+ if (tblinfo)
+ {
+ tblinfo->dobj.components |= DUMP_COMPONENT_ACL;
+ tblinfo->hascolumnACLs = true;
+ }
+ }
+ PQclear(res);
+
+ /* Fetch initial-privileges data */
+ if (fout->remoteVersion >= 90600)
+ {
+ printfPQExpBuffer(query,
+ "SELECT objoid, classoid, objsubid, privtype, initprivs "
+ "FROM pg_init_privs");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ for (i = 0; i < ntups; i++)
+ {
+ Oid objoid = atooid(PQgetvalue(res, i, 0));
+ Oid classoid = atooid(PQgetvalue(res, i, 1));
+ int objsubid = atoi(PQgetvalue(res, i, 2));
+ char privtype = *(PQgetvalue(res, i, 3));
+ char *initprivs = PQgetvalue(res, i, 4);
+ CatalogId objId;
+ DumpableObject *dobj;
+
+ objId.tableoid = classoid;
+ objId.oid = objoid;
+ dobj = findObjectByCatalogId(objId);
+ /* OK to ignore entries we haven't got a DumpableObject for */
+ if (dobj)
+ {
+ /* Cope with sub-object initprivs */
+ if (objsubid != 0)
+ {
+ if (dobj->objType == DO_TABLE)
+ {
+ /* For a column initpriv, set the table's ACL flags */
+ dobj->components |= DUMP_COMPONENT_ACL;
+ ((TableInfo *) dobj)->hascolumnACLs = true;
+ }
+ else
+ pg_log_warning("unsupported pg_init_privs entry: %u %u %d",
+ classoid, objoid, objsubid);
+ continue;
+ }
+
+ /*
+ * We ignore any pg_init_privs.initprivs entry for the public
+ * schema, as explained in getNamespaces().
+ */
+ if (dobj->objType == DO_NAMESPACE &&
+ strcmp(dobj->name, "public") == 0)
+ continue;
+
+ /* Else it had better be of a type we think has ACLs */
+ if (dobj->objType == DO_NAMESPACE ||
+ dobj->objType == DO_TYPE ||
+ dobj->objType == DO_FUNC ||
+ dobj->objType == DO_AGG ||
+ dobj->objType == DO_TABLE ||
+ dobj->objType == DO_PROCLANG ||
+ dobj->objType == DO_FDW ||
+ dobj->objType == DO_FOREIGN_SERVER)
+ {
+ DumpableObjectWithAcl *daobj = (DumpableObjectWithAcl *) dobj;
+
+ daobj->dacl.privtype = privtype;
+ daobj->dacl.initprivs = pstrdup(initprivs);
+ }
+ else
+ pg_log_warning("unsupported pg_init_privs entry: %u %u %d",
+ classoid, objoid, objsubid);
+ }
+ }
+ PQclear(res);
+ }
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpCommentExtended --
+ *
+ * This routine is used to dump any comments associated with the
+ * object handed to this routine. The routine takes the object type
+ * and object name (ready to print, except for schema decoration), plus
+ * the namespace and owner of the object (for labeling the ArchiveEntry),
+ * plus catalog ID and subid which are the lookup key for pg_description,
+ * plus the dump ID for the object (for setting a dependency).
+ * If a matching pg_description entry is found, it is dumped.
+ *
+ * Note: in some cases, such as comments for triggers and rules, the "type"
+ * string really looks like, e.g., "TRIGGER name ON". This is a bit of a hack
+ * but it doesn't seem worth complicating the API for all callers to make
+ * it cleaner.
+ *
+ * Note: although this routine takes a dumpId for dependency purposes,
+ * that purpose is just to mark the dependency in the emitted dump file
+ * for possible future use by pg_restore. We do NOT use it for determining
+ * ordering of the comment in the dump file, because this routine is called
+ * after dependency sorting occurs. This routine should be called just after
+ * calling ArchiveEntry() for the specified object.
+ */
+static void
+dumpCommentExtended(Archive *fout, const char *type,
+ const char *name, const char *namespace,
+ const char *owner, CatalogId catalogId,
+ int subid, DumpId dumpId,
+ const char *initdb_comment)
+{
+ DumpOptions *dopt = fout->dopt;
+ CommentItem *comments;
+ int ncomments;
+
+ /* do nothing, if --no-comments is supplied */
+ if (dopt->no_comments)
+ return;
+
+ /* Comments are schema not data ... except blob comments are data */
+ if (strcmp(type, "LARGE OBJECT") != 0)
+ {
+ if (dopt->dataOnly)
+ return;
+ }
+ else
+ {
+ /* We do dump blob comments in binary-upgrade mode */
+ if (dopt->schemaOnly && !dopt->binary_upgrade)
+ return;
+ }
+
+ /* Search for comments associated with catalogId, using table */
+ ncomments = findComments(catalogId.tableoid, catalogId.oid,
+ &comments);
+
+ /* Is there one matching the subid? */
+ while (ncomments > 0)
+ {
+ if (comments->objsubid == subid)
+ break;
+ comments++;
+ ncomments--;
+ }
+
+ if (initdb_comment != NULL)
+ {
+ static CommentItem empty_comment = {.descr = ""};
+
+ /*
+ * initdb creates this object with a comment. Skip dumping the
+ * initdb-provided comment, which would complicate matters for
+ * non-superuser use of pg_dump. When the DBA has removed initdb's
+ * comment, replicate that.
+ */
+ if (ncomments == 0)
+ {
+ comments = &empty_comment;
+ ncomments = 1;
+ }
+ else if (strcmp(comments->descr, initdb_comment) == 0)
+ ncomments = 0;
+ }
+
+ /* If a comment exists, build COMMENT ON statement */
+ if (ncomments > 0)
+ {
+ PQExpBuffer query = createPQExpBuffer();
+ PQExpBuffer tag = createPQExpBuffer();
+
+ appendPQExpBuffer(query, "COMMENT ON %s ", type);
+ if (namespace && *namespace)
+ appendPQExpBuffer(query, "%s.", fmtId(namespace));
+ appendPQExpBuffer(query, "%s IS ", name);
+ appendStringLiteralAH(query, comments->descr, fout);
+ appendPQExpBufferStr(query, ";\n");
+
+ appendPQExpBuffer(tag, "%s %s", type, name);
+
+ /*
+ * We mark comments as SECTION_NONE because they really belong in the
+ * same section as their parent, whether that is pre-data or
+ * post-data.
+ */
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = tag->data,
+ .namespace = namespace,
+ .owner = owner,
+ .description = "COMMENT",
+ .section = SECTION_NONE,
+ .createStmt = query->data,
+ .deps = &dumpId,
+ .nDeps = 1));
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(tag);
+ }
+}
+
+/*
+ * dumpComment --
+ *
+ * Typical simplification of the above function.
+ */
+static inline void
+dumpComment(Archive *fout, const char *type,
+ const char *name, const char *namespace,
+ const char *owner, CatalogId catalogId,
+ int subid, DumpId dumpId)
+{
+ dumpCommentExtended(fout, type, name, namespace, owner,
+ catalogId, subid, dumpId, NULL);
+}
+
+/*
+ * dumpTableComment --
+ *
+ * As above, but dump comments for both the specified table (or view)
+ * and its columns.
+ */
+static void
+dumpTableComment(Archive *fout, const TableInfo *tbinfo,
+ const char *reltypename)
+{
+ DumpOptions *dopt = fout->dopt;
+ CommentItem *comments;
+ int ncomments;
+ PQExpBuffer query;
+ PQExpBuffer tag;
+
+ /* do nothing, if --no-comments is supplied */
+ if (dopt->no_comments)
+ return;
+
+ /* Comments are SCHEMA not data */
+ if (dopt->dataOnly)
+ return;
+
+ /* Search for comments associated with relation, using table */
+ ncomments = findComments(tbinfo->dobj.catId.tableoid,
+ tbinfo->dobj.catId.oid,
+ &comments);
+
+ /* If comments exist, build COMMENT ON statements */
+ if (ncomments <= 0)
+ return;
+
+ query = createPQExpBuffer();
+ tag = createPQExpBuffer();
+
+ while (ncomments > 0)
+ {
+ const char *descr = comments->descr;
+ int objsubid = comments->objsubid;
+
+ if (objsubid == 0)
+ {
+ resetPQExpBuffer(tag);
+ appendPQExpBuffer(tag, "%s %s", reltypename,
+ fmtId(tbinfo->dobj.name));
+
+ resetPQExpBuffer(query);
+ appendPQExpBuffer(query, "COMMENT ON %s %s IS ", reltypename,
+ fmtQualifiedDumpable(tbinfo));
+ appendStringLiteralAH(query, descr, fout);
+ appendPQExpBufferStr(query, ";\n");
+
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = tag->data,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "COMMENT",
+ .section = SECTION_NONE,
+ .createStmt = query->data,
+ .deps = &(tbinfo->dobj.dumpId),
+ .nDeps = 1));
+ }
+ else if (objsubid > 0 && objsubid <= tbinfo->numatts)
+ {
+ resetPQExpBuffer(tag);
+ appendPQExpBuffer(tag, "COLUMN %s.",
+ fmtId(tbinfo->dobj.name));
+ appendPQExpBufferStr(tag, fmtId(tbinfo->attnames[objsubid - 1]));
+
+ resetPQExpBuffer(query);
+ appendPQExpBuffer(query, "COMMENT ON COLUMN %s.",
+ fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(query, "%s IS ",
+ fmtId(tbinfo->attnames[objsubid - 1]));
+ appendStringLiteralAH(query, descr, fout);
+ appendPQExpBufferStr(query, ";\n");
+
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = tag->data,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "COMMENT",
+ .section = SECTION_NONE,
+ .createStmt = query->data,
+ .deps = &(tbinfo->dobj.dumpId),
+ .nDeps = 1));
+ }
+
+ comments++;
+ ncomments--;
+ }
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(tag);
+}
+
+/*
+ * findComments --
+ *
+ * Find the comment(s), if any, associated with the given object. All the
+ * objsubid values associated with the given classoid/objoid are found with
+ * one search.
+ */
+static int
+findComments(Oid classoid, Oid objoid, CommentItem **items)
+{
+ CommentItem *middle = NULL;
+ CommentItem *low;
+ CommentItem *high;
+ int nmatch;
+
+ /*
+ * Do binary search to find some item matching the object.
+ */
+ low = &comments[0];
+ high = &comments[ncomments - 1];
+ while (low <= high)
+ {
+ middle = low + (high - low) / 2;
+
+ if (classoid < middle->classoid)
+ high = middle - 1;
+ else if (classoid > middle->classoid)
+ low = middle + 1;
+ else if (objoid < middle->objoid)
+ high = middle - 1;
+ else if (objoid > middle->objoid)
+ low = middle + 1;
+ else
+ break; /* found a match */
+ }
+
+ if (low > high) /* no matches */
+ {
+ *items = NULL;
+ return 0;
+ }
+
+ /*
+ * Now determine how many items match the object. The search loop
+ * invariant still holds: only items between low and high inclusive could
+ * match.
+ */
+ nmatch = 1;
+ while (middle > low)
+ {
+ if (classoid != middle[-1].classoid ||
+ objoid != middle[-1].objoid)
+ break;
+ middle--;
+ nmatch++;
+ }
+
+ *items = middle;
+
+ middle += nmatch;
+ while (middle <= high)
+ {
+ if (classoid != middle->classoid ||
+ objoid != middle->objoid)
+ break;
+ middle++;
+ nmatch++;
+ }
+
+ return nmatch;
+}
+
+/*
+ * collectComments --
+ *
+ * Construct a table of all comments available for database objects;
+ * also set the has-comment component flag for each relevant object.
+ *
+ * We used to do per-object queries for the comments, but it's much faster
+ * to pull them all over at once, and on most databases the memory cost
+ * isn't high.
+ *
+ * The table is sorted by classoid/objid/objsubid for speed in lookup.
+ */
+static void
+collectComments(Archive *fout)
+{
+ PGresult *res;
+ PQExpBuffer query;
+ int i_description;
+ int i_classoid;
+ int i_objoid;
+ int i_objsubid;
+ int ntups;
+ int i;
+ DumpableObject *dobj;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query, "SELECT description, classoid, objoid, objsubid "
+ "FROM pg_catalog.pg_description "
+ "ORDER BY classoid, objoid, objsubid");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ /* Construct lookup table containing OIDs in numeric form */
+
+ i_description = PQfnumber(res, "description");
+ i_classoid = PQfnumber(res, "classoid");
+ i_objoid = PQfnumber(res, "objoid");
+ i_objsubid = PQfnumber(res, "objsubid");
+
+ ntups = PQntuples(res);
+
+ comments = (CommentItem *) pg_malloc(ntups * sizeof(CommentItem));
+ ncomments = 0;
+ dobj = NULL;
+
+ for (i = 0; i < ntups; i++)
+ {
+ CatalogId objId;
+ int subid;
+
+ objId.tableoid = atooid(PQgetvalue(res, i, i_classoid));
+ objId.oid = atooid(PQgetvalue(res, i, i_objoid));
+ subid = atoi(PQgetvalue(res, i, i_objsubid));
+
+ /* We needn't remember comments that don't match any dumpable object */
+ if (dobj == NULL ||
+ dobj->catId.tableoid != objId.tableoid ||
+ dobj->catId.oid != objId.oid)
+ dobj = findObjectByCatalogId(objId);
+ if (dobj == NULL)
+ continue;
+
+ /*
+ * Comments on columns of composite types are linked to the type's
+ * pg_class entry, but we need to set the DUMP_COMPONENT_COMMENT flag
+ * in the type's own DumpableObject.
+ */
+ if (subid != 0 && dobj->objType == DO_TABLE &&
+ ((TableInfo *) dobj)->relkind == RELKIND_COMPOSITE_TYPE)
+ {
+ TypeInfo *cTypeInfo;
+
+ cTypeInfo = findTypeByOid(((TableInfo *) dobj)->reltype);
+ if (cTypeInfo)
+ cTypeInfo->dobj.components |= DUMP_COMPONENT_COMMENT;
+ }
+ else
+ dobj->components |= DUMP_COMPONENT_COMMENT;
+
+ comments[ncomments].descr = pg_strdup(PQgetvalue(res, i, i_description));
+ comments[ncomments].classoid = objId.tableoid;
+ comments[ncomments].objoid = objId.oid;
+ comments[ncomments].objsubid = subid;
+ ncomments++;
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpDumpableObject
+ *
+ * This routine and its subsidiaries are responsible for creating
+ * ArchiveEntries (TOC objects) for each object to be dumped.
+ */
+static void
+dumpDumpableObject(Archive *fout, DumpableObject *dobj)
+{
+ /*
+ * Clear any dump-request bits for components that don't exist for this
+ * object. (This makes it safe to initially use DUMP_COMPONENT_ALL as the
+ * request for every kind of object.)
+ */
+ dobj->dump &= dobj->components;
+
+ /* Now, short-circuit if there's nothing to be done here. */
+ if (dobj->dump == 0)
+ return;
+
+ switch (dobj->objType)
+ {
+ case DO_NAMESPACE:
+ dumpNamespace(fout, (const NamespaceInfo *) dobj);
+ break;
+ case DO_EXTENSION:
+ dumpExtension(fout, (const ExtensionInfo *) dobj);
+ break;
+ case DO_TYPE:
+ dumpType(fout, (const TypeInfo *) dobj);
+ break;
+ case DO_SHELL_TYPE:
+ dumpShellType(fout, (const ShellTypeInfo *) dobj);
+ break;
+ case DO_FUNC:
+ dumpFunc(fout, (const FuncInfo *) dobj);
+ break;
+ case DO_AGG:
+ dumpAgg(fout, (const AggInfo *) dobj);
+ break;
+ case DO_OPERATOR:
+ dumpOpr(fout, (const OprInfo *) dobj);
+ break;
+ case DO_ACCESS_METHOD:
+ dumpAccessMethod(fout, (const AccessMethodInfo *) dobj);
+ break;
+ case DO_OPCLASS:
+ dumpOpclass(fout, (const OpclassInfo *) dobj);
+ break;
+ case DO_OPFAMILY:
+ dumpOpfamily(fout, (const OpfamilyInfo *) dobj);
+ break;
+ case DO_COLLATION:
+ dumpCollation(fout, (const CollInfo *) dobj);
+ break;
+ case DO_CONVERSION:
+ dumpConversion(fout, (const ConvInfo *) dobj);
+ break;
+ case DO_TABLE:
+ dumpTable(fout, (const TableInfo *) dobj);
+ break;
+ case DO_TABLE_ATTACH:
+ dumpTableAttach(fout, (const TableAttachInfo *) dobj);
+ break;
+ case DO_ATTRDEF:
+ dumpAttrDef(fout, (const AttrDefInfo *) dobj);
+ break;
+ case DO_INDEX:
+ dumpIndex(fout, (const IndxInfo *) dobj);
+ break;
+ case DO_INDEX_ATTACH:
+ dumpIndexAttach(fout, (const IndexAttachInfo *) dobj);
+ break;
+ case DO_STATSEXT:
+ dumpStatisticsExt(fout, (const StatsExtInfo *) dobj);
+ break;
+ case DO_REFRESH_MATVIEW:
+ refreshMatViewData(fout, (const TableDataInfo *) dobj);
+ break;
+ case DO_RULE:
+ dumpRule(fout, (const RuleInfo *) dobj);
+ break;
+ case DO_TRIGGER:
+ dumpTrigger(fout, (const TriggerInfo *) dobj);
+ break;
+ case DO_EVENT_TRIGGER:
+ dumpEventTrigger(fout, (const EventTriggerInfo *) dobj);
+ break;
+ case DO_CONSTRAINT:
+ dumpConstraint(fout, (const ConstraintInfo *) dobj);
+ break;
+ case DO_FK_CONSTRAINT:
+ dumpConstraint(fout, (const ConstraintInfo *) dobj);
+ break;
+ case DO_PROCLANG:
+ dumpProcLang(fout, (const ProcLangInfo *) dobj);
+ break;
+ case DO_CAST:
+ dumpCast(fout, (const CastInfo *) dobj);
+ break;
+ case DO_TRANSFORM:
+ dumpTransform(fout, (const TransformInfo *) dobj);
+ break;
+ case DO_SEQUENCE_SET:
+ dumpSequenceData(fout, (const TableDataInfo *) dobj);
+ break;
+ case DO_TABLE_DATA:
+ dumpTableData(fout, (const TableDataInfo *) dobj);
+ break;
+ case DO_DUMMY_TYPE:
+ /* table rowtypes and array types are never dumped separately */
+ break;
+ case DO_TSPARSER:
+ dumpTSParser(fout, (const TSParserInfo *) dobj);
+ break;
+ case DO_TSDICT:
+ dumpTSDictionary(fout, (const TSDictInfo *) dobj);
+ break;
+ case DO_TSTEMPLATE:
+ dumpTSTemplate(fout, (const TSTemplateInfo *) dobj);
+ break;
+ case DO_TSCONFIG:
+ dumpTSConfig(fout, (const TSConfigInfo *) dobj);
+ break;
+ case DO_FDW:
+ dumpForeignDataWrapper(fout, (const FdwInfo *) dobj);
+ break;
+ case DO_FOREIGN_SERVER:
+ dumpForeignServer(fout, (const ForeignServerInfo *) dobj);
+ break;
+ case DO_DEFAULT_ACL:
+ dumpDefaultACL(fout, (const DefaultACLInfo *) dobj);
+ break;
+ case DO_BLOB:
+ dumpBlob(fout, (const BlobInfo *) dobj);
+ break;
+ case DO_BLOB_DATA:
+ if (dobj->dump & DUMP_COMPONENT_DATA)
+ {
+ TocEntry *te;
+
+ te = ArchiveEntry(fout, dobj->catId, dobj->dumpId,
+ ARCHIVE_OPTS(.tag = dobj->name,
+ .description = "BLOBS",
+ .section = SECTION_DATA,
+ .dumpFn = dumpBlobs));
+
+ /*
+ * Set the TocEntry's dataLength in case we are doing a
+ * parallel dump and want to order dump jobs by table size.
+ * (We need some size estimate for every TocEntry with a
+ * DataDumper function.) We don't currently have any cheap
+ * way to estimate the size of blobs, but it doesn't matter;
+ * let's just set the size to a large value so parallel dumps
+ * will launch this job first. If there's lots of blobs, we
+ * win, and if there aren't, we don't lose much. (If you want
+ * to improve on this, really what you should be thinking
+ * about is allowing blob dumping to be parallelized, not just
+ * getting a smarter estimate for the single TOC entry.)
+ */
+ te->dataLength = INT_MAX;
+ }
+ break;
+ case DO_POLICY:
+ dumpPolicy(fout, (const PolicyInfo *) dobj);
+ break;
+ case DO_PUBLICATION:
+ dumpPublication(fout, (const PublicationInfo *) dobj);
+ break;
+ case DO_PUBLICATION_REL:
+ dumpPublicationTable(fout, (const PublicationRelInfo *) dobj);
+ break;
+ case DO_PUBLICATION_TABLE_IN_SCHEMA:
+ dumpPublicationNamespace(fout,
+ (const PublicationSchemaInfo *) dobj);
+ break;
+ case DO_SUBSCRIPTION:
+ dumpSubscription(fout, (const SubscriptionInfo *) dobj);
+ break;
+ case DO_PRE_DATA_BOUNDARY:
+ case DO_POST_DATA_BOUNDARY:
+ /* never dumped, nothing to do */
+ break;
+ }
+}
+
+/*
+ * dumpNamespace
+ * writes out to fout the queries to recreate a user-defined namespace
+ */
+static void
+dumpNamespace(Archive *fout, const NamespaceInfo *nspinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qnspname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qnspname = pg_strdup(fmtId(nspinfo->dobj.name));
+
+ if (nspinfo->create)
+ {
+ appendPQExpBuffer(delq, "DROP SCHEMA %s;\n", qnspname);
+ appendPQExpBuffer(q, "CREATE SCHEMA %s;\n", qnspname);
+ }
+ else
+ {
+ /* see selectDumpableNamespace() */
+ appendPQExpBufferStr(delq,
+ "-- *not* dropping schema, since initdb creates it\n");
+ appendPQExpBufferStr(q,
+ "-- *not* creating schema, since initdb creates it\n");
+ }
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &nspinfo->dobj,
+ "SCHEMA", qnspname, NULL);
+
+ if (nspinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, nspinfo->dobj.catId, nspinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = nspinfo->dobj.name,
+ .owner = nspinfo->rolname,
+ .description = "SCHEMA",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Schema Comments and Security Labels */
+ if (nspinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ {
+ const char *initdb_comment = NULL;
+
+ if (!nspinfo->create && strcmp(qnspname, "public") == 0)
+ initdb_comment = "standard public schema";
+ dumpCommentExtended(fout, "SCHEMA", qnspname,
+ NULL, nspinfo->rolname,
+ nspinfo->dobj.catId, 0, nspinfo->dobj.dumpId,
+ initdb_comment);
+ }
+
+ if (nspinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "SCHEMA", qnspname,
+ NULL, nspinfo->rolname,
+ nspinfo->dobj.catId, 0, nspinfo->dobj.dumpId);
+
+ if (nspinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, nspinfo->dobj.dumpId, InvalidDumpId, "SCHEMA",
+ qnspname, NULL, NULL,
+ nspinfo->rolname, &nspinfo->dacl);
+
+ free(qnspname);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+}
+
+/*
+ * dumpExtension
+ * writes out to fout the queries to recreate an extension
+ */
+static void
+dumpExtension(Archive *fout, const ExtensionInfo *extinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qextname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qextname = pg_strdup(fmtId(extinfo->dobj.name));
+
+ appendPQExpBuffer(delq, "DROP EXTENSION %s;\n", qextname);
+
+ if (!dopt->binary_upgrade)
+ {
+ /*
+ * In a regular dump, we simply create the extension, intentionally
+ * not specifying a version, so that the destination installation's
+ * default version is used.
+ *
+ * Use of IF NOT EXISTS here is unlike our behavior for other object
+ * types; but there are various scenarios in which it's convenient to
+ * manually create the desired extension before restoring, so we
+ * prefer to allow it to exist already.
+ */
+ appendPQExpBuffer(q, "CREATE EXTENSION IF NOT EXISTS %s WITH SCHEMA %s;\n",
+ qextname, fmtId(extinfo->namespace));
+ }
+ else
+ {
+ /*
+ * In binary-upgrade mode, it's critical to reproduce the state of the
+ * database exactly, so our procedure is to create an empty extension,
+ * restore all the contained objects normally, and add them to the
+ * extension one by one. This function performs just the first of
+ * those steps. binary_upgrade_extension_member() takes care of
+ * adding member objects as they're created.
+ */
+ int i;
+ int n;
+
+ appendPQExpBufferStr(q, "-- For binary upgrade, create an empty extension and insert objects into it\n");
+
+ /*
+ * We unconditionally create the extension, so we must drop it if it
+ * exists. This could happen if the user deleted 'plpgsql' and then
+ * readded it, causing its oid to be greater than g_last_builtin_oid.
+ */
+ appendPQExpBuffer(q, "DROP EXTENSION IF EXISTS %s;\n", qextname);
+
+ appendPQExpBufferStr(q,
+ "SELECT pg_catalog.binary_upgrade_create_empty_extension(");
+ appendStringLiteralAH(q, extinfo->dobj.name, fout);
+ appendPQExpBufferStr(q, ", ");
+ appendStringLiteralAH(q, extinfo->namespace, fout);
+ appendPQExpBufferStr(q, ", ");
+ appendPQExpBuffer(q, "%s, ", extinfo->relocatable ? "true" : "false");
+ appendStringLiteralAH(q, extinfo->extversion, fout);
+ appendPQExpBufferStr(q, ", ");
+
+ /*
+ * Note that we're pushing extconfig (an OID array) back into
+ * pg_extension exactly as-is. This is OK because pg_class OIDs are
+ * preserved in binary upgrade.
+ */
+ if (strlen(extinfo->extconfig) > 2)
+ appendStringLiteralAH(q, extinfo->extconfig, fout);
+ else
+ appendPQExpBufferStr(q, "NULL");
+ appendPQExpBufferStr(q, ", ");
+ if (strlen(extinfo->extcondition) > 2)
+ appendStringLiteralAH(q, extinfo->extcondition, fout);
+ else
+ appendPQExpBufferStr(q, "NULL");
+ appendPQExpBufferStr(q, ", ");
+ appendPQExpBufferStr(q, "ARRAY[");
+ n = 0;
+ for (i = 0; i < extinfo->dobj.nDeps; i++)
+ {
+ DumpableObject *extobj;
+
+ extobj = findObjectByDumpId(extinfo->dobj.dependencies[i]);
+ if (extobj && extobj->objType == DO_EXTENSION)
+ {
+ if (n++ > 0)
+ appendPQExpBufferChar(q, ',');
+ appendStringLiteralAH(q, extobj->name, fout);
+ }
+ }
+ appendPQExpBufferStr(q, "]::pg_catalog.text[]");
+ appendPQExpBufferStr(q, ");\n");
+ }
+
+ if (extinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, extinfo->dobj.catId, extinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = extinfo->dobj.name,
+ .description = "EXTENSION",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Extension Comments and Security Labels */
+ if (extinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "EXTENSION", qextname,
+ NULL, "",
+ extinfo->dobj.catId, 0, extinfo->dobj.dumpId);
+
+ if (extinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "EXTENSION", qextname,
+ NULL, "",
+ extinfo->dobj.catId, 0, extinfo->dobj.dumpId);
+
+ free(qextname);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+}
+
+/*
+ * dumpType
+ * writes out to fout the queries to recreate a user-defined type
+ */
+static void
+dumpType(Archive *fout, const TypeInfo *tyinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ /* Dump out in proper style */
+ if (tyinfo->typtype == TYPTYPE_BASE)
+ dumpBaseType(fout, tyinfo);
+ else if (tyinfo->typtype == TYPTYPE_DOMAIN)
+ dumpDomain(fout, tyinfo);
+ else if (tyinfo->typtype == TYPTYPE_COMPOSITE)
+ dumpCompositeType(fout, tyinfo);
+ else if (tyinfo->typtype == TYPTYPE_ENUM)
+ dumpEnumType(fout, tyinfo);
+ else if (tyinfo->typtype == TYPTYPE_RANGE)
+ dumpRangeType(fout, tyinfo);
+ else if (tyinfo->typtype == TYPTYPE_PSEUDO && !tyinfo->isDefined)
+ dumpUndefinedType(fout, tyinfo);
+ else
+ pg_log_warning("typtype of data type \"%s\" appears to be invalid",
+ tyinfo->dobj.name);
+}
+
+/*
+ * dumpEnumType
+ * writes out to fout the queries to recreate a user-defined enum type
+ */
+static void
+dumpEnumType(Archive *fout, const TypeInfo *tyinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer delq = createPQExpBuffer();
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ int num,
+ i;
+ Oid enum_oid;
+ char *qtypname;
+ char *qualtypname;
+ char *label;
+ int i_enumlabel;
+ int i_oid;
+
+ if (!fout->is_prepared[PREPQUERY_DUMPENUMTYPE])
+ {
+ /* Set up query for enum-specific details */
+ appendPQExpBufferStr(query,
+ "PREPARE dumpEnumType(pg_catalog.oid) AS\n"
+ "SELECT oid, enumlabel "
+ "FROM pg_catalog.pg_enum "
+ "WHERE enumtypid = $1 "
+ "ORDER BY enumsortorder");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_DUMPENUMTYPE] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE dumpEnumType('%u')",
+ tyinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ num = PQntuples(res);
+
+ qtypname = pg_strdup(fmtId(tyinfo->dobj.name));
+ qualtypname = pg_strdup(fmtQualifiedDumpable(tyinfo));
+
+ /*
+ * CASCADE shouldn't be required here as for normal types since the I/O
+ * functions are generic and do not get dropped.
+ */
+ appendPQExpBuffer(delq, "DROP TYPE %s;\n", qualtypname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_type_oids_by_type_oid(fout, q,
+ tyinfo->dobj.catId.oid,
+ false, false);
+
+ appendPQExpBuffer(q, "CREATE TYPE %s AS ENUM (",
+ qualtypname);
+
+ if (!dopt->binary_upgrade)
+ {
+ i_enumlabel = PQfnumber(res, "enumlabel");
+
+ /* Labels with server-assigned oids */
+ for (i = 0; i < num; i++)
+ {
+ label = PQgetvalue(res, i, i_enumlabel);
+ if (i > 0)
+ appendPQExpBufferChar(q, ',');
+ appendPQExpBufferStr(q, "\n ");
+ appendStringLiteralAH(q, label, fout);
+ }
+ }
+
+ appendPQExpBufferStr(q, "\n);\n");
+
+ if (dopt->binary_upgrade)
+ {
+ i_oid = PQfnumber(res, "oid");
+ i_enumlabel = PQfnumber(res, "enumlabel");
+
+ /* Labels with dump-assigned (preserved) oids */
+ for (i = 0; i < num; i++)
+ {
+ enum_oid = atooid(PQgetvalue(res, i, i_oid));
+ label = PQgetvalue(res, i, i_enumlabel);
+
+ if (i == 0)
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, must preserve pg_enum oids\n");
+ appendPQExpBuffer(q,
+ "SELECT pg_catalog.binary_upgrade_set_next_pg_enum_oid('%u'::pg_catalog.oid);\n",
+ enum_oid);
+ appendPQExpBuffer(q, "ALTER TYPE %s ADD VALUE ", qualtypname);
+ appendStringLiteralAH(q, label, fout);
+ appendPQExpBufferStr(q, ";\n\n");
+ }
+ }
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &tyinfo->dobj,
+ "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tyinfo->dobj.name,
+ .namespace = tyinfo->dobj.namespace->dobj.name,
+ .owner = tyinfo->rolname,
+ .description = "TYPE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Type Comments and Security Labels */
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE",
+ qtypname, NULL,
+ tyinfo->dobj.namespace->dobj.name,
+ tyinfo->rolname, &tyinfo->dacl);
+
+ PQclear(res);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qtypname);
+ free(qualtypname);
+}
+
+/*
+ * dumpRangeType
+ * writes out to fout the queries to recreate a user-defined range type
+ */
+static void
+dumpRangeType(Archive *fout, const TypeInfo *tyinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer delq = createPQExpBuffer();
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ Oid collationOid;
+ char *qtypname;
+ char *qualtypname;
+ char *procname;
+
+ if (!fout->is_prepared[PREPQUERY_DUMPRANGETYPE])
+ {
+ /* Set up query for range-specific details */
+ appendPQExpBufferStr(query,
+ "PREPARE dumpRangeType(pg_catalog.oid) AS\n");
+
+ appendPQExpBufferStr(query,
+ "SELECT ");
+
+ if (fout->remoteVersion >= 140000)
+ appendPQExpBufferStr(query,
+ "pg_catalog.format_type(rngmultitypid, NULL) AS rngmultitype, ");
+ else
+ appendPQExpBufferStr(query,
+ "NULL AS rngmultitype, ");
+
+ appendPQExpBufferStr(query,
+ "pg_catalog.format_type(rngsubtype, NULL) AS rngsubtype, "
+ "opc.opcname AS opcname, "
+ "(SELECT nspname FROM pg_catalog.pg_namespace nsp "
+ " WHERE nsp.oid = opc.opcnamespace) AS opcnsp, "
+ "opc.opcdefault, "
+ "CASE WHEN rngcollation = st.typcollation THEN 0 "
+ " ELSE rngcollation END AS collation, "
+ "rngcanonical, rngsubdiff "
+ "FROM pg_catalog.pg_range r, pg_catalog.pg_type st, "
+ " pg_catalog.pg_opclass opc "
+ "WHERE st.oid = rngsubtype AND opc.oid = rngsubopc AND "
+ "rngtypid = $1");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_DUMPRANGETYPE] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE dumpRangeType('%u')",
+ tyinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ qtypname = pg_strdup(fmtId(tyinfo->dobj.name));
+ qualtypname = pg_strdup(fmtQualifiedDumpable(tyinfo));
+
+ /*
+ * CASCADE shouldn't be required here as for normal types since the I/O
+ * functions are generic and do not get dropped.
+ */
+ appendPQExpBuffer(delq, "DROP TYPE %s;\n", qualtypname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_type_oids_by_type_oid(fout, q,
+ tyinfo->dobj.catId.oid,
+ false, true);
+
+ appendPQExpBuffer(q, "CREATE TYPE %s AS RANGE (",
+ qualtypname);
+
+ appendPQExpBuffer(q, "\n subtype = %s",
+ PQgetvalue(res, 0, PQfnumber(res, "rngsubtype")));
+
+ if (!PQgetisnull(res, 0, PQfnumber(res, "rngmultitype")))
+ appendPQExpBuffer(q, ",\n multirange_type_name = %s",
+ PQgetvalue(res, 0, PQfnumber(res, "rngmultitype")));
+
+ /* print subtype_opclass only if not default for subtype */
+ if (PQgetvalue(res, 0, PQfnumber(res, "opcdefault"))[0] != 't')
+ {
+ char *opcname = PQgetvalue(res, 0, PQfnumber(res, "opcname"));
+ char *nspname = PQgetvalue(res, 0, PQfnumber(res, "opcnsp"));
+
+ appendPQExpBuffer(q, ",\n subtype_opclass = %s.",
+ fmtId(nspname));
+ appendPQExpBufferStr(q, fmtId(opcname));
+ }
+
+ collationOid = atooid(PQgetvalue(res, 0, PQfnumber(res, "collation")));
+ if (OidIsValid(collationOid))
+ {
+ CollInfo *coll = findCollationByOid(collationOid);
+
+ if (coll)
+ appendPQExpBuffer(q, ",\n collation = %s",
+ fmtQualifiedDumpable(coll));
+ }
+
+ procname = PQgetvalue(res, 0, PQfnumber(res, "rngcanonical"));
+ if (strcmp(procname, "-") != 0)
+ appendPQExpBuffer(q, ",\n canonical = %s", procname);
+
+ procname = PQgetvalue(res, 0, PQfnumber(res, "rngsubdiff"));
+ if (strcmp(procname, "-") != 0)
+ appendPQExpBuffer(q, ",\n subtype_diff = %s", procname);
+
+ appendPQExpBufferStr(q, "\n);\n");
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &tyinfo->dobj,
+ "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tyinfo->dobj.name,
+ .namespace = tyinfo->dobj.namespace->dobj.name,
+ .owner = tyinfo->rolname,
+ .description = "TYPE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Type Comments and Security Labels */
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE",
+ qtypname, NULL,
+ tyinfo->dobj.namespace->dobj.name,
+ tyinfo->rolname, &tyinfo->dacl);
+
+ PQclear(res);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qtypname);
+ free(qualtypname);
+}
+
+/*
+ * dumpUndefinedType
+ * writes out to fout the queries to recreate a !typisdefined type
+ *
+ * This is a shell type, but we use different terminology to distinguish
+ * this case from where we have to emit a shell type definition to break
+ * circular dependencies. An undefined type shouldn't ever have anything
+ * depending on it.
+ */
+static void
+dumpUndefinedType(Archive *fout, const TypeInfo *tyinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer delq = createPQExpBuffer();
+ char *qtypname;
+ char *qualtypname;
+
+ qtypname = pg_strdup(fmtId(tyinfo->dobj.name));
+ qualtypname = pg_strdup(fmtQualifiedDumpable(tyinfo));
+
+ appendPQExpBuffer(delq, "DROP TYPE %s;\n", qualtypname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_type_oids_by_type_oid(fout, q,
+ tyinfo->dobj.catId.oid,
+ false, false);
+
+ appendPQExpBuffer(q, "CREATE TYPE %s;\n",
+ qualtypname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &tyinfo->dobj,
+ "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tyinfo->dobj.name,
+ .namespace = tyinfo->dobj.namespace->dobj.name,
+ .owner = tyinfo->rolname,
+ .description = "TYPE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Type Comments and Security Labels */
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE",
+ qtypname, NULL,
+ tyinfo->dobj.namespace->dobj.name,
+ tyinfo->rolname, &tyinfo->dacl);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qtypname);
+ free(qualtypname);
+}
+
+/*
+ * dumpBaseType
+ * writes out to fout the queries to recreate a user-defined base type
+ */
+static void
+dumpBaseType(Archive *fout, const TypeInfo *tyinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer delq = createPQExpBuffer();
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ char *qtypname;
+ char *qualtypname;
+ char *typlen;
+ char *typinput;
+ char *typoutput;
+ char *typreceive;
+ char *typsend;
+ char *typmodin;
+ char *typmodout;
+ char *typanalyze;
+ char *typsubscript;
+ Oid typreceiveoid;
+ Oid typsendoid;
+ Oid typmodinoid;
+ Oid typmodoutoid;
+ Oid typanalyzeoid;
+ Oid typsubscriptoid;
+ char *typcategory;
+ char *typispreferred;
+ char *typdelim;
+ char *typbyval;
+ char *typalign;
+ char *typstorage;
+ char *typcollatable;
+ char *typdefault;
+ bool typdefault_is_literal = false;
+
+ if (!fout->is_prepared[PREPQUERY_DUMPBASETYPE])
+ {
+ /* Set up query for type-specific details */
+ appendPQExpBufferStr(query,
+ "PREPARE dumpBaseType(pg_catalog.oid) AS\n"
+ "SELECT typlen, "
+ "typinput, typoutput, typreceive, typsend, "
+ "typreceive::pg_catalog.oid AS typreceiveoid, "
+ "typsend::pg_catalog.oid AS typsendoid, "
+ "typanalyze, "
+ "typanalyze::pg_catalog.oid AS typanalyzeoid, "
+ "typdelim, typbyval, typalign, typstorage, "
+ "typmodin, typmodout, "
+ "typmodin::pg_catalog.oid AS typmodinoid, "
+ "typmodout::pg_catalog.oid AS typmodoutoid, "
+ "typcategory, typispreferred, "
+ "(typcollation <> 0) AS typcollatable, "
+ "pg_catalog.pg_get_expr(typdefaultbin, 0) AS typdefaultbin, typdefault, ");
+
+ if (fout->remoteVersion >= 140000)
+ appendPQExpBufferStr(query,
+ "typsubscript, "
+ "typsubscript::pg_catalog.oid AS typsubscriptoid ");
+ else
+ appendPQExpBufferStr(query,
+ "'-' AS typsubscript, 0 AS typsubscriptoid ");
+
+ appendPQExpBufferStr(query, "FROM pg_catalog.pg_type "
+ "WHERE oid = $1");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_DUMPBASETYPE] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE dumpBaseType('%u')",
+ tyinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ typlen = PQgetvalue(res, 0, PQfnumber(res, "typlen"));
+ typinput = PQgetvalue(res, 0, PQfnumber(res, "typinput"));
+ typoutput = PQgetvalue(res, 0, PQfnumber(res, "typoutput"));
+ typreceive = PQgetvalue(res, 0, PQfnumber(res, "typreceive"));
+ typsend = PQgetvalue(res, 0, PQfnumber(res, "typsend"));
+ typmodin = PQgetvalue(res, 0, PQfnumber(res, "typmodin"));
+ typmodout = PQgetvalue(res, 0, PQfnumber(res, "typmodout"));
+ typanalyze = PQgetvalue(res, 0, PQfnumber(res, "typanalyze"));
+ typsubscript = PQgetvalue(res, 0, PQfnumber(res, "typsubscript"));
+ typreceiveoid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typreceiveoid")));
+ typsendoid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typsendoid")));
+ typmodinoid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typmodinoid")));
+ typmodoutoid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typmodoutoid")));
+ typanalyzeoid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typanalyzeoid")));
+ typsubscriptoid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typsubscriptoid")));
+ typcategory = PQgetvalue(res, 0, PQfnumber(res, "typcategory"));
+ typispreferred = PQgetvalue(res, 0, PQfnumber(res, "typispreferred"));
+ typdelim = PQgetvalue(res, 0, PQfnumber(res, "typdelim"));
+ typbyval = PQgetvalue(res, 0, PQfnumber(res, "typbyval"));
+ typalign = PQgetvalue(res, 0, PQfnumber(res, "typalign"));
+ typstorage = PQgetvalue(res, 0, PQfnumber(res, "typstorage"));
+ typcollatable = PQgetvalue(res, 0, PQfnumber(res, "typcollatable"));
+ if (!PQgetisnull(res, 0, PQfnumber(res, "typdefaultbin")))
+ typdefault = PQgetvalue(res, 0, PQfnumber(res, "typdefaultbin"));
+ else if (!PQgetisnull(res, 0, PQfnumber(res, "typdefault")))
+ {
+ typdefault = PQgetvalue(res, 0, PQfnumber(res, "typdefault"));
+ typdefault_is_literal = true; /* it needs quotes */
+ }
+ else
+ typdefault = NULL;
+
+ qtypname = pg_strdup(fmtId(tyinfo->dobj.name));
+ qualtypname = pg_strdup(fmtQualifiedDumpable(tyinfo));
+
+ /*
+ * The reason we include CASCADE is that the circular dependency between
+ * the type and its I/O functions makes it impossible to drop the type any
+ * other way.
+ */
+ appendPQExpBuffer(delq, "DROP TYPE %s CASCADE;\n", qualtypname);
+
+ /*
+ * We might already have a shell type, but setting pg_type_oid is
+ * harmless, and in any case we'd better set the array type OID.
+ */
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_type_oids_by_type_oid(fout, q,
+ tyinfo->dobj.catId.oid,
+ false, false);
+
+ appendPQExpBuffer(q,
+ "CREATE TYPE %s (\n"
+ " INTERNALLENGTH = %s",
+ qualtypname,
+ (strcmp(typlen, "-1") == 0) ? "variable" : typlen);
+
+ /* regproc result is sufficiently quoted already */
+ appendPQExpBuffer(q, ",\n INPUT = %s", typinput);
+ appendPQExpBuffer(q, ",\n OUTPUT = %s", typoutput);
+ if (OidIsValid(typreceiveoid))
+ appendPQExpBuffer(q, ",\n RECEIVE = %s", typreceive);
+ if (OidIsValid(typsendoid))
+ appendPQExpBuffer(q, ",\n SEND = %s", typsend);
+ if (OidIsValid(typmodinoid))
+ appendPQExpBuffer(q, ",\n TYPMOD_IN = %s", typmodin);
+ if (OidIsValid(typmodoutoid))
+ appendPQExpBuffer(q, ",\n TYPMOD_OUT = %s", typmodout);
+ if (OidIsValid(typanalyzeoid))
+ appendPQExpBuffer(q, ",\n ANALYZE = %s", typanalyze);
+
+ if (strcmp(typcollatable, "t") == 0)
+ appendPQExpBufferStr(q, ",\n COLLATABLE = true");
+
+ if (typdefault != NULL)
+ {
+ appendPQExpBufferStr(q, ",\n DEFAULT = ");
+ if (typdefault_is_literal)
+ appendStringLiteralAH(q, typdefault, fout);
+ else
+ appendPQExpBufferStr(q, typdefault);
+ }
+
+ if (OidIsValid(typsubscriptoid))
+ appendPQExpBuffer(q, ",\n SUBSCRIPT = %s", typsubscript);
+
+ if (OidIsValid(tyinfo->typelem))
+ appendPQExpBuffer(q, ",\n ELEMENT = %s",
+ getFormattedTypeName(fout, tyinfo->typelem,
+ zeroIsError));
+
+ if (strcmp(typcategory, "U") != 0)
+ {
+ appendPQExpBufferStr(q, ",\n CATEGORY = ");
+ appendStringLiteralAH(q, typcategory, fout);
+ }
+
+ if (strcmp(typispreferred, "t") == 0)
+ appendPQExpBufferStr(q, ",\n PREFERRED = true");
+
+ if (typdelim && strcmp(typdelim, ",") != 0)
+ {
+ appendPQExpBufferStr(q, ",\n DELIMITER = ");
+ appendStringLiteralAH(q, typdelim, fout);
+ }
+
+ if (*typalign == TYPALIGN_CHAR)
+ appendPQExpBufferStr(q, ",\n ALIGNMENT = char");
+ else if (*typalign == TYPALIGN_SHORT)
+ appendPQExpBufferStr(q, ",\n ALIGNMENT = int2");
+ else if (*typalign == TYPALIGN_INT)
+ appendPQExpBufferStr(q, ",\n ALIGNMENT = int4");
+ else if (*typalign == TYPALIGN_DOUBLE)
+ appendPQExpBufferStr(q, ",\n ALIGNMENT = double");
+
+ if (*typstorage == TYPSTORAGE_PLAIN)
+ appendPQExpBufferStr(q, ",\n STORAGE = plain");
+ else if (*typstorage == TYPSTORAGE_EXTERNAL)
+ appendPQExpBufferStr(q, ",\n STORAGE = external");
+ else if (*typstorage == TYPSTORAGE_EXTENDED)
+ appendPQExpBufferStr(q, ",\n STORAGE = extended");
+ else if (*typstorage == TYPSTORAGE_MAIN)
+ appendPQExpBufferStr(q, ",\n STORAGE = main");
+
+ if (strcmp(typbyval, "t") == 0)
+ appendPQExpBufferStr(q, ",\n PASSEDBYVALUE");
+
+ appendPQExpBufferStr(q, "\n);\n");
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &tyinfo->dobj,
+ "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tyinfo->dobj.name,
+ .namespace = tyinfo->dobj.namespace->dobj.name,
+ .owner = tyinfo->rolname,
+ .description = "TYPE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Type Comments and Security Labels */
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE",
+ qtypname, NULL,
+ tyinfo->dobj.namespace->dobj.name,
+ tyinfo->rolname, &tyinfo->dacl);
+
+ PQclear(res);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qtypname);
+ free(qualtypname);
+}
+
+/*
+ * dumpDomain
+ * writes out to fout the queries to recreate a user-defined domain
+ */
+static void
+dumpDomain(Archive *fout, const TypeInfo *tyinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer delq = createPQExpBuffer();
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ int i;
+ char *qtypname;
+ char *qualtypname;
+ char *typnotnull;
+ char *typdefn;
+ char *typdefault;
+ Oid typcollation;
+ bool typdefault_is_literal = false;
+
+ if (!fout->is_prepared[PREPQUERY_DUMPDOMAIN])
+ {
+ /* Set up query for domain-specific details */
+ appendPQExpBufferStr(query,
+ "PREPARE dumpDomain(pg_catalog.oid) AS\n");
+
+ appendPQExpBufferStr(query, "SELECT t.typnotnull, "
+ "pg_catalog.format_type(t.typbasetype, t.typtypmod) AS typdefn, "
+ "pg_catalog.pg_get_expr(t.typdefaultbin, 'pg_catalog.pg_type'::pg_catalog.regclass) AS typdefaultbin, "
+ "t.typdefault, "
+ "CASE WHEN t.typcollation <> u.typcollation "
+ "THEN t.typcollation ELSE 0 END AS typcollation "
+ "FROM pg_catalog.pg_type t "
+ "LEFT JOIN pg_catalog.pg_type u ON (t.typbasetype = u.oid) "
+ "WHERE t.oid = $1");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_DUMPDOMAIN] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE dumpDomain('%u')",
+ tyinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ typnotnull = PQgetvalue(res, 0, PQfnumber(res, "typnotnull"));
+ typdefn = PQgetvalue(res, 0, PQfnumber(res, "typdefn"));
+ if (!PQgetisnull(res, 0, PQfnumber(res, "typdefaultbin")))
+ typdefault = PQgetvalue(res, 0, PQfnumber(res, "typdefaultbin"));
+ else if (!PQgetisnull(res, 0, PQfnumber(res, "typdefault")))
+ {
+ typdefault = PQgetvalue(res, 0, PQfnumber(res, "typdefault"));
+ typdefault_is_literal = true; /* it needs quotes */
+ }
+ else
+ typdefault = NULL;
+ typcollation = atooid(PQgetvalue(res, 0, PQfnumber(res, "typcollation")));
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_type_oids_by_type_oid(fout, q,
+ tyinfo->dobj.catId.oid,
+ true, /* force array type */
+ false); /* force multirange type */
+
+ qtypname = pg_strdup(fmtId(tyinfo->dobj.name));
+ qualtypname = pg_strdup(fmtQualifiedDumpable(tyinfo));
+
+ appendPQExpBuffer(q,
+ "CREATE DOMAIN %s AS %s",
+ qualtypname,
+ typdefn);
+
+ /* Print collation only if different from base type's collation */
+ if (OidIsValid(typcollation))
+ {
+ CollInfo *coll;
+
+ coll = findCollationByOid(typcollation);
+ if (coll)
+ appendPQExpBuffer(q, " COLLATE %s", fmtQualifiedDumpable(coll));
+ }
+
+ if (typnotnull[0] == 't')
+ appendPQExpBufferStr(q, " NOT NULL");
+
+ if (typdefault != NULL)
+ {
+ appendPQExpBufferStr(q, " DEFAULT ");
+ if (typdefault_is_literal)
+ appendStringLiteralAH(q, typdefault, fout);
+ else
+ appendPQExpBufferStr(q, typdefault);
+ }
+
+ PQclear(res);
+
+ /*
+ * Add any CHECK constraints for the domain
+ */
+ for (i = 0; i < tyinfo->nDomChecks; i++)
+ {
+ ConstraintInfo *domcheck = &(tyinfo->domChecks[i]);
+
+ if (!domcheck->separate)
+ appendPQExpBuffer(q, "\n\tCONSTRAINT %s %s",
+ fmtId(domcheck->dobj.name), domcheck->condef);
+ }
+
+ appendPQExpBufferStr(q, ";\n");
+
+ appendPQExpBuffer(delq, "DROP DOMAIN %s;\n", qualtypname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &tyinfo->dobj,
+ "DOMAIN", qtypname,
+ tyinfo->dobj.namespace->dobj.name);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tyinfo->dobj.name,
+ .namespace = tyinfo->dobj.namespace->dobj.name,
+ .owner = tyinfo->rolname,
+ .description = "DOMAIN",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Domain Comments and Security Labels */
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "DOMAIN", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "DOMAIN", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE",
+ qtypname, NULL,
+ tyinfo->dobj.namespace->dobj.name,
+ tyinfo->rolname, &tyinfo->dacl);
+
+ /* Dump any per-constraint comments */
+ for (i = 0; i < tyinfo->nDomChecks; i++)
+ {
+ ConstraintInfo *domcheck = &(tyinfo->domChecks[i]);
+ PQExpBuffer conprefix = createPQExpBuffer();
+
+ appendPQExpBuffer(conprefix, "CONSTRAINT %s ON DOMAIN",
+ fmtId(domcheck->dobj.name));
+
+ if (domcheck->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, conprefix->data, qtypname,
+ tyinfo->dobj.namespace->dobj.name,
+ tyinfo->rolname,
+ domcheck->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(conprefix);
+ }
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qtypname);
+ free(qualtypname);
+}
+
+/*
+ * dumpCompositeType
+ * writes out to fout the queries to recreate a user-defined stand-alone
+ * composite type
+ */
+static void
+dumpCompositeType(Archive *fout, const TypeInfo *tyinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer dropped = createPQExpBuffer();
+ PQExpBuffer delq = createPQExpBuffer();
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ char *qtypname;
+ char *qualtypname;
+ int ntups;
+ int i_attname;
+ int i_atttypdefn;
+ int i_attlen;
+ int i_attalign;
+ int i_attisdropped;
+ int i_attcollation;
+ int i;
+ int actual_atts;
+
+ if (!fout->is_prepared[PREPQUERY_DUMPCOMPOSITETYPE])
+ {
+ /*
+ * Set up query for type-specific details.
+ *
+ * Since we only want to dump COLLATE clauses for attributes whose
+ * collation is different from their type's default, we use a CASE
+ * here to suppress uninteresting attcollations cheaply. atttypid
+ * will be 0 for dropped columns; collation does not matter for those.
+ */
+ appendPQExpBufferStr(query,
+ "PREPARE dumpCompositeType(pg_catalog.oid) AS\n"
+ "SELECT a.attname, a.attnum, "
+ "pg_catalog.format_type(a.atttypid, a.atttypmod) AS atttypdefn, "
+ "a.attlen, a.attalign, a.attisdropped, "
+ "CASE WHEN a.attcollation <> at.typcollation "
+ "THEN a.attcollation ELSE 0 END AS attcollation "
+ "FROM pg_catalog.pg_type ct "
+ "JOIN pg_catalog.pg_attribute a ON a.attrelid = ct.typrelid "
+ "LEFT JOIN pg_catalog.pg_type at ON at.oid = a.atttypid "
+ "WHERE ct.oid = $1 "
+ "ORDER BY a.attnum");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_DUMPCOMPOSITETYPE] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE dumpCompositeType('%u')",
+ tyinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_attname = PQfnumber(res, "attname");
+ i_atttypdefn = PQfnumber(res, "atttypdefn");
+ i_attlen = PQfnumber(res, "attlen");
+ i_attalign = PQfnumber(res, "attalign");
+ i_attisdropped = PQfnumber(res, "attisdropped");
+ i_attcollation = PQfnumber(res, "attcollation");
+
+ if (dopt->binary_upgrade)
+ {
+ binary_upgrade_set_type_oids_by_type_oid(fout, q,
+ tyinfo->dobj.catId.oid,
+ false, false);
+ binary_upgrade_set_pg_class_oids(fout, q, tyinfo->typrelid, false);
+ }
+
+ qtypname = pg_strdup(fmtId(tyinfo->dobj.name));
+ qualtypname = pg_strdup(fmtQualifiedDumpable(tyinfo));
+
+ appendPQExpBuffer(q, "CREATE TYPE %s AS (",
+ qualtypname);
+
+ actual_atts = 0;
+ for (i = 0; i < ntups; i++)
+ {
+ char *attname;
+ char *atttypdefn;
+ char *attlen;
+ char *attalign;
+ bool attisdropped;
+ Oid attcollation;
+
+ attname = PQgetvalue(res, i, i_attname);
+ atttypdefn = PQgetvalue(res, i, i_atttypdefn);
+ attlen = PQgetvalue(res, i, i_attlen);
+ attalign = PQgetvalue(res, i, i_attalign);
+ attisdropped = (PQgetvalue(res, i, i_attisdropped)[0] == 't');
+ attcollation = atooid(PQgetvalue(res, i, i_attcollation));
+
+ if (attisdropped && !dopt->binary_upgrade)
+ continue;
+
+ /* Format properly if not first attr */
+ if (actual_atts++ > 0)
+ appendPQExpBufferChar(q, ',');
+ appendPQExpBufferStr(q, "\n\t");
+
+ if (!attisdropped)
+ {
+ appendPQExpBuffer(q, "%s %s", fmtId(attname), atttypdefn);
+
+ /* Add collation if not default for the column type */
+ if (OidIsValid(attcollation))
+ {
+ CollInfo *coll;
+
+ coll = findCollationByOid(attcollation);
+ if (coll)
+ appendPQExpBuffer(q, " COLLATE %s",
+ fmtQualifiedDumpable(coll));
+ }
+ }
+ else
+ {
+ /*
+ * This is a dropped attribute and we're in binary_upgrade mode.
+ * Insert a placeholder for it in the CREATE TYPE command, and set
+ * length and alignment with direct UPDATE to the catalogs
+ * afterwards. See similar code in dumpTableSchema().
+ */
+ appendPQExpBuffer(q, "%s INTEGER /* dummy */", fmtId(attname));
+
+ /* stash separately for insertion after the CREATE TYPE */
+ appendPQExpBufferStr(dropped,
+ "\n-- For binary upgrade, recreate dropped column.\n");
+ appendPQExpBuffer(dropped, "UPDATE pg_catalog.pg_attribute\n"
+ "SET attlen = %s, "
+ "attalign = '%s', attbyval = false\n"
+ "WHERE attname = ", attlen, attalign);
+ appendStringLiteralAH(dropped, attname, fout);
+ appendPQExpBufferStr(dropped, "\n AND attrelid = ");
+ appendStringLiteralAH(dropped, qualtypname, fout);
+ appendPQExpBufferStr(dropped, "::pg_catalog.regclass;\n");
+
+ appendPQExpBuffer(dropped, "ALTER TYPE %s ",
+ qualtypname);
+ appendPQExpBuffer(dropped, "DROP ATTRIBUTE %s;\n",
+ fmtId(attname));
+ }
+ }
+ appendPQExpBufferStr(q, "\n);\n");
+ appendPQExpBufferStr(q, dropped->data);
+
+ appendPQExpBuffer(delq, "DROP TYPE %s;\n", qualtypname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &tyinfo->dobj,
+ "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tyinfo->dobj.name,
+ .namespace = tyinfo->dobj.namespace->dobj.name,
+ .owner = tyinfo->rolname,
+ .description = "TYPE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+
+ /* Dump Type Comments and Security Labels */
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE",
+ qtypname, NULL,
+ tyinfo->dobj.namespace->dobj.name,
+ tyinfo->rolname, &tyinfo->dacl);
+
+ /* Dump any per-column comments */
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpCompositeTypeColComments(fout, tyinfo, res);
+
+ PQclear(res);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(dropped);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qtypname);
+ free(qualtypname);
+}
+
+/*
+ * dumpCompositeTypeColComments
+ * writes out to fout the queries to recreate comments on the columns of
+ * a user-defined stand-alone composite type.
+ *
+ * The caller has already made a query to collect the names and attnums
+ * of the type's columns, so we just pass that result into here rather
+ * than reading them again.
+ */
+static void
+dumpCompositeTypeColComments(Archive *fout, const TypeInfo *tyinfo,
+ PGresult *res)
+{
+ CommentItem *comments;
+ int ncomments;
+ PQExpBuffer query;
+ PQExpBuffer target;
+ int i;
+ int ntups;
+ int i_attname;
+ int i_attnum;
+ int i_attisdropped;
+
+ /* do nothing, if --no-comments is supplied */
+ if (fout->dopt->no_comments)
+ return;
+
+ /* Search for comments associated with type's pg_class OID */
+ ncomments = findComments(RelationRelationId, tyinfo->typrelid,
+ &comments);
+
+ /* If no comments exist, we're done */
+ if (ncomments <= 0)
+ return;
+
+ /* Build COMMENT ON statements */
+ query = createPQExpBuffer();
+ target = createPQExpBuffer();
+
+ ntups = PQntuples(res);
+ i_attnum = PQfnumber(res, "attnum");
+ i_attname = PQfnumber(res, "attname");
+ i_attisdropped = PQfnumber(res, "attisdropped");
+ while (ncomments > 0)
+ {
+ const char *attname;
+
+ attname = NULL;
+ for (i = 0; i < ntups; i++)
+ {
+ if (atoi(PQgetvalue(res, i, i_attnum)) == comments->objsubid &&
+ PQgetvalue(res, i, i_attisdropped)[0] != 't')
+ {
+ attname = PQgetvalue(res, i, i_attname);
+ break;
+ }
+ }
+ if (attname) /* just in case we don't find it */
+ {
+ const char *descr = comments->descr;
+
+ resetPQExpBuffer(target);
+ appendPQExpBuffer(target, "COLUMN %s.",
+ fmtId(tyinfo->dobj.name));
+ appendPQExpBufferStr(target, fmtId(attname));
+
+ resetPQExpBuffer(query);
+ appendPQExpBuffer(query, "COMMENT ON COLUMN %s.",
+ fmtQualifiedDumpable(tyinfo));
+ appendPQExpBuffer(query, "%s IS ", fmtId(attname));
+ appendStringLiteralAH(query, descr, fout);
+ appendPQExpBufferStr(query, ";\n");
+
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = target->data,
+ .namespace = tyinfo->dobj.namespace->dobj.name,
+ .owner = tyinfo->rolname,
+ .description = "COMMENT",
+ .section = SECTION_NONE,
+ .createStmt = query->data,
+ .deps = &(tyinfo->dobj.dumpId),
+ .nDeps = 1));
+ }
+
+ comments++;
+ ncomments--;
+ }
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(target);
+}
+
+/*
+ * dumpShellType
+ * writes out to fout the queries to create a shell type
+ *
+ * We dump a shell definition in advance of the I/O functions for the type.
+ */
+static void
+dumpShellType(Archive *fout, const ShellTypeInfo *stinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+
+ /*
+ * Note the lack of a DROP command for the shell type; any required DROP
+ * is driven off the base type entry, instead. This interacts with
+ * _printTocEntry()'s use of the presence of a DROP command to decide
+ * whether an entry needs an ALTER OWNER command. We don't want to alter
+ * the shell type's owner immediately on creation; that should happen only
+ * after it's filled in, otherwise the backend complains.
+ */
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_type_oids_by_type_oid(fout, q,
+ stinfo->baseType->dobj.catId.oid,
+ false, false);
+
+ appendPQExpBuffer(q, "CREATE TYPE %s;\n",
+ fmtQualifiedDumpable(stinfo));
+
+ if (stinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, stinfo->dobj.catId, stinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = stinfo->dobj.name,
+ .namespace = stinfo->dobj.namespace->dobj.name,
+ .owner = stinfo->baseType->rolname,
+ .description = "SHELL TYPE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data));
+
+ destroyPQExpBuffer(q);
+}
+
+/*
+ * dumpProcLang
+ * writes out to fout the queries to recreate a user-defined
+ * procedural language
+ */
+static void
+dumpProcLang(Archive *fout, const ProcLangInfo *plang)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer defqry;
+ PQExpBuffer delqry;
+ bool useParams;
+ char *qlanname;
+ FuncInfo *funcInfo;
+ FuncInfo *inlineInfo = NULL;
+ FuncInfo *validatorInfo = NULL;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ /*
+ * Try to find the support function(s). It is not an error if we don't
+ * find them --- if the functions are in the pg_catalog schema, as is
+ * standard in 8.1 and up, then we won't have loaded them. (In this case
+ * we will emit a parameterless CREATE LANGUAGE command, which will
+ * require PL template knowledge in the backend to reload.)
+ */
+
+ funcInfo = findFuncByOid(plang->lanplcallfoid);
+ if (funcInfo != NULL && !funcInfo->dobj.dump)
+ funcInfo = NULL; /* treat not-dumped same as not-found */
+
+ if (OidIsValid(plang->laninline))
+ {
+ inlineInfo = findFuncByOid(plang->laninline);
+ if (inlineInfo != NULL && !inlineInfo->dobj.dump)
+ inlineInfo = NULL;
+ }
+
+ if (OidIsValid(plang->lanvalidator))
+ {
+ validatorInfo = findFuncByOid(plang->lanvalidator);
+ if (validatorInfo != NULL && !validatorInfo->dobj.dump)
+ validatorInfo = NULL;
+ }
+
+ /*
+ * If the functions are dumpable then emit a complete CREATE LANGUAGE with
+ * parameters. Otherwise, we'll write a parameterless command, which will
+ * be interpreted as CREATE EXTENSION.
+ */
+ useParams = (funcInfo != NULL &&
+ (inlineInfo != NULL || !OidIsValid(plang->laninline)) &&
+ (validatorInfo != NULL || !OidIsValid(plang->lanvalidator)));
+
+ defqry = createPQExpBuffer();
+ delqry = createPQExpBuffer();
+
+ qlanname = pg_strdup(fmtId(plang->dobj.name));
+
+ appendPQExpBuffer(delqry, "DROP PROCEDURAL LANGUAGE %s;\n",
+ qlanname);
+
+ if (useParams)
+ {
+ appendPQExpBuffer(defqry, "CREATE %sPROCEDURAL LANGUAGE %s",
+ plang->lanpltrusted ? "TRUSTED " : "",
+ qlanname);
+ appendPQExpBuffer(defqry, " HANDLER %s",
+ fmtQualifiedDumpable(funcInfo));
+ if (OidIsValid(plang->laninline))
+ appendPQExpBuffer(defqry, " INLINE %s",
+ fmtQualifiedDumpable(inlineInfo));
+ if (OidIsValid(plang->lanvalidator))
+ appendPQExpBuffer(defqry, " VALIDATOR %s",
+ fmtQualifiedDumpable(validatorInfo));
+ }
+ else
+ {
+ /*
+ * If not dumping parameters, then use CREATE OR REPLACE so that the
+ * command will not fail if the language is preinstalled in the target
+ * database.
+ *
+ * Modern servers will interpret this as CREATE EXTENSION IF NOT
+ * EXISTS; perhaps we should emit that instead? But it might just add
+ * confusion.
+ */
+ appendPQExpBuffer(defqry, "CREATE OR REPLACE PROCEDURAL LANGUAGE %s",
+ qlanname);
+ }
+ appendPQExpBufferStr(defqry, ";\n");
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(defqry, &plang->dobj,
+ "LANGUAGE", qlanname, NULL);
+
+ if (plang->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, plang->dobj.catId, plang->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = plang->dobj.name,
+ .owner = plang->lanowner,
+ .description = "PROCEDURAL LANGUAGE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = defqry->data,
+ .dropStmt = delqry->data,
+ ));
+
+ /* Dump Proc Lang Comments and Security Labels */
+ if (plang->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "LANGUAGE", qlanname,
+ NULL, plang->lanowner,
+ plang->dobj.catId, 0, plang->dobj.dumpId);
+
+ if (plang->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "LANGUAGE", qlanname,
+ NULL, plang->lanowner,
+ plang->dobj.catId, 0, plang->dobj.dumpId);
+
+ if (plang->lanpltrusted && plang->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, plang->dobj.dumpId, InvalidDumpId, "LANGUAGE",
+ qlanname, NULL, NULL,
+ plang->lanowner, &plang->dacl);
+
+ free(qlanname);
+
+ destroyPQExpBuffer(defqry);
+ destroyPQExpBuffer(delqry);
+}
+
+/*
+ * format_function_arguments: generate function name and argument list
+ *
+ * This is used when we can rely on pg_get_function_arguments to format
+ * the argument list. Note, however, that pg_get_function_arguments
+ * does not special-case zero-argument aggregates.
+ */
+static char *
+format_function_arguments(const FuncInfo *finfo, const char *funcargs, bool is_agg)
+{
+ PQExpBufferData fn;
+
+ initPQExpBuffer(&fn);
+ appendPQExpBufferStr(&fn, fmtId(finfo->dobj.name));
+ if (is_agg && finfo->nargs == 0)
+ appendPQExpBufferStr(&fn, "(*)");
+ else
+ appendPQExpBuffer(&fn, "(%s)", funcargs);
+ return fn.data;
+}
+
+/*
+ * format_function_signature: generate function name and argument list
+ *
+ * Only a minimal list of input argument types is generated; this is
+ * sufficient to reference the function, but not to define it.
+ *
+ * If honor_quotes is false then the function name is never quoted.
+ * This is appropriate for use in TOC tags, but not in SQL commands.
+ */
+static char *
+format_function_signature(Archive *fout, const FuncInfo *finfo, bool honor_quotes)
+{
+ PQExpBufferData fn;
+ int j;
+
+ initPQExpBuffer(&fn);
+ if (honor_quotes)
+ appendPQExpBuffer(&fn, "%s(", fmtId(finfo->dobj.name));
+ else
+ appendPQExpBuffer(&fn, "%s(", finfo->dobj.name);
+ for (j = 0; j < finfo->nargs; j++)
+ {
+ if (j > 0)
+ appendPQExpBufferStr(&fn, ", ");
+
+ appendPQExpBufferStr(&fn,
+ getFormattedTypeName(fout, finfo->argtypes[j],
+ zeroIsError));
+ }
+ appendPQExpBufferChar(&fn, ')');
+ return fn.data;
+}
+
+
+/*
+ * dumpFunc:
+ * dump out one function
+ */
+static void
+dumpFunc(Archive *fout, const FuncInfo *finfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PQExpBuffer q;
+ PQExpBuffer delqry;
+ PQExpBuffer asPart;
+ PGresult *res;
+ char *funcsig; /* identity signature */
+ char *funcfullsig = NULL; /* full signature */
+ char *funcsig_tag;
+ char *qual_funcsig;
+ char *proretset;
+ char *prosrc;
+ char *probin;
+ char *prosqlbody;
+ char *funcargs;
+ char *funciargs;
+ char *funcresult;
+ char *protrftypes;
+ char *prokind;
+ char *provolatile;
+ char *proisstrict;
+ char *prosecdef;
+ char *proleakproof;
+ char *proconfig;
+ char *procost;
+ char *prorows;
+ char *prosupport;
+ char *proparallel;
+ char *lanname;
+ char **configitems = NULL;
+ int nconfigitems = 0;
+ const char *keyword;
+ int i;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ query = createPQExpBuffer();
+ q = createPQExpBuffer();
+ delqry = createPQExpBuffer();
+ asPart = createPQExpBuffer();
+
+ if (!fout->is_prepared[PREPQUERY_DUMPFUNC])
+ {
+ /* Set up query for function-specific details */
+ appendPQExpBufferStr(query,
+ "PREPARE dumpFunc(pg_catalog.oid) AS\n");
+
+ appendPQExpBufferStr(query,
+ "SELECT\n"
+ "proretset,\n"
+ "prosrc,\n"
+ "probin,\n"
+ "provolatile,\n"
+ "proisstrict,\n"
+ "prosecdef,\n"
+ "lanname,\n"
+ "proconfig,\n"
+ "procost,\n"
+ "prorows,\n"
+ "pg_catalog.pg_get_function_arguments(p.oid) AS funcargs,\n"
+ "pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs,\n"
+ "pg_catalog.pg_get_function_result(p.oid) AS funcresult,\n"
+ "proleakproof,\n");
+
+ if (fout->remoteVersion >= 90500)
+ appendPQExpBufferStr(query,
+ "array_to_string(protrftypes, ' ') AS protrftypes,\n");
+ else
+ appendPQExpBufferStr(query,
+ "NULL AS protrftypes,\n");
+
+ if (fout->remoteVersion >= 90600)
+ appendPQExpBufferStr(query,
+ "proparallel,\n");
+ else
+ appendPQExpBufferStr(query,
+ "'u' AS proparallel,\n");
+
+ if (fout->remoteVersion >= 110000)
+ appendPQExpBufferStr(query,
+ "prokind,\n");
+ else
+ appendPQExpBufferStr(query,
+ "CASE WHEN proiswindow THEN 'w' ELSE 'f' END AS prokind,\n");
+
+ if (fout->remoteVersion >= 120000)
+ appendPQExpBufferStr(query,
+ "prosupport,\n");
+ else
+ appendPQExpBufferStr(query,
+ "'-' AS prosupport,\n");
+
+ if (fout->remoteVersion >= 140000)
+ appendPQExpBufferStr(query,
+ "pg_get_function_sqlbody(p.oid) AS prosqlbody\n");
+ else
+ appendPQExpBufferStr(query,
+ "NULL AS prosqlbody\n");
+
+ appendPQExpBufferStr(query,
+ "FROM pg_catalog.pg_proc p, pg_catalog.pg_language l\n"
+ "WHERE p.oid = $1 "
+ "AND l.oid = p.prolang");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_DUMPFUNC] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE dumpFunc('%u')",
+ finfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ proretset = PQgetvalue(res, 0, PQfnumber(res, "proretset"));
+ if (PQgetisnull(res, 0, PQfnumber(res, "prosqlbody")))
+ {
+ prosrc = PQgetvalue(res, 0, PQfnumber(res, "prosrc"));
+ probin = PQgetvalue(res, 0, PQfnumber(res, "probin"));
+ prosqlbody = NULL;
+ }
+ else
+ {
+ prosrc = NULL;
+ probin = NULL;
+ prosqlbody = PQgetvalue(res, 0, PQfnumber(res, "prosqlbody"));
+ }
+ funcargs = PQgetvalue(res, 0, PQfnumber(res, "funcargs"));
+ funciargs = PQgetvalue(res, 0, PQfnumber(res, "funciargs"));
+ funcresult = PQgetvalue(res, 0, PQfnumber(res, "funcresult"));
+ protrftypes = PQgetvalue(res, 0, PQfnumber(res, "protrftypes"));
+ prokind = PQgetvalue(res, 0, PQfnumber(res, "prokind"));
+ provolatile = PQgetvalue(res, 0, PQfnumber(res, "provolatile"));
+ proisstrict = PQgetvalue(res, 0, PQfnumber(res, "proisstrict"));
+ prosecdef = PQgetvalue(res, 0, PQfnumber(res, "prosecdef"));
+ proleakproof = PQgetvalue(res, 0, PQfnumber(res, "proleakproof"));
+ proconfig = PQgetvalue(res, 0, PQfnumber(res, "proconfig"));
+ procost = PQgetvalue(res, 0, PQfnumber(res, "procost"));
+ prorows = PQgetvalue(res, 0, PQfnumber(res, "prorows"));
+ prosupport = PQgetvalue(res, 0, PQfnumber(res, "prosupport"));
+ proparallel = PQgetvalue(res, 0, PQfnumber(res, "proparallel"));
+ lanname = PQgetvalue(res, 0, PQfnumber(res, "lanname"));
+
+ /*
+ * See backend/commands/functioncmds.c for details of how the 'AS' clause
+ * is used.
+ */
+ if (prosqlbody)
+ {
+ appendPQExpBufferStr(asPart, prosqlbody);
+ }
+ else if (probin[0] != '\0')
+ {
+ appendPQExpBufferStr(asPart, "AS ");
+ appendStringLiteralAH(asPart, probin, fout);
+ if (prosrc[0] != '\0')
+ {
+ appendPQExpBufferStr(asPart, ", ");
+
+ /*
+ * where we have bin, use dollar quoting if allowed and src
+ * contains quote or backslash; else use regular quoting.
+ */
+ if (dopt->disable_dollar_quoting ||
+ (strchr(prosrc, '\'') == NULL && strchr(prosrc, '\\') == NULL))
+ appendStringLiteralAH(asPart, prosrc, fout);
+ else
+ appendStringLiteralDQ(asPart, prosrc, NULL);
+ }
+ }
+ else
+ {
+ appendPQExpBufferStr(asPart, "AS ");
+ /* with no bin, dollar quote src unconditionally if allowed */
+ if (dopt->disable_dollar_quoting)
+ appendStringLiteralAH(asPart, prosrc, fout);
+ else
+ appendStringLiteralDQ(asPart, prosrc, NULL);
+ }
+
+ if (*proconfig)
+ {
+ if (!parsePGArray(proconfig, &configitems, &nconfigitems))
+ pg_fatal("could not parse %s array", "proconfig");
+ }
+ else
+ {
+ configitems = NULL;
+ nconfigitems = 0;
+ }
+
+ funcfullsig = format_function_arguments(finfo, funcargs, false);
+ funcsig = format_function_arguments(finfo, funciargs, false);
+
+ funcsig_tag = format_function_signature(fout, finfo, false);
+
+ qual_funcsig = psprintf("%s.%s",
+ fmtId(finfo->dobj.namespace->dobj.name),
+ funcsig);
+
+ if (prokind[0] == PROKIND_PROCEDURE)
+ keyword = "PROCEDURE";
+ else
+ keyword = "FUNCTION"; /* works for window functions too */
+
+ appendPQExpBuffer(delqry, "DROP %s %s;\n",
+ keyword, qual_funcsig);
+
+ appendPQExpBuffer(q, "CREATE %s %s.%s",
+ keyword,
+ fmtId(finfo->dobj.namespace->dobj.name),
+ funcfullsig ? funcfullsig :
+ funcsig);
+
+ if (prokind[0] == PROKIND_PROCEDURE)
+ /* no result type to output */ ;
+ else if (funcresult)
+ appendPQExpBuffer(q, " RETURNS %s", funcresult);
+ else
+ appendPQExpBuffer(q, " RETURNS %s%s",
+ (proretset[0] == 't') ? "SETOF " : "",
+ getFormattedTypeName(fout, finfo->prorettype,
+ zeroIsError));
+
+ appendPQExpBuffer(q, "\n LANGUAGE %s", fmtId(lanname));
+
+ if (*protrftypes)
+ {
+ Oid *typeids = palloc(FUNC_MAX_ARGS * sizeof(Oid));
+ int i;
+
+ appendPQExpBufferStr(q, " TRANSFORM ");
+ parseOidArray(protrftypes, typeids, FUNC_MAX_ARGS);
+ for (i = 0; typeids[i]; i++)
+ {
+ if (i != 0)
+ appendPQExpBufferStr(q, ", ");
+ appendPQExpBuffer(q, "FOR TYPE %s",
+ getFormattedTypeName(fout, typeids[i], zeroAsNone));
+ }
+ }
+
+ if (prokind[0] == PROKIND_WINDOW)
+ appendPQExpBufferStr(q, " WINDOW");
+
+ if (provolatile[0] != PROVOLATILE_VOLATILE)
+ {
+ if (provolatile[0] == PROVOLATILE_IMMUTABLE)
+ appendPQExpBufferStr(q, " IMMUTABLE");
+ else if (provolatile[0] == PROVOLATILE_STABLE)
+ appendPQExpBufferStr(q, " STABLE");
+ else if (provolatile[0] != PROVOLATILE_VOLATILE)
+ pg_fatal("unrecognized provolatile value for function \"%s\"",
+ finfo->dobj.name);
+ }
+
+ if (proisstrict[0] == 't')
+ appendPQExpBufferStr(q, " STRICT");
+
+ if (prosecdef[0] == 't')
+ appendPQExpBufferStr(q, " SECURITY DEFINER");
+
+ if (proleakproof[0] == 't')
+ appendPQExpBufferStr(q, " LEAKPROOF");
+
+ /*
+ * COST and ROWS are emitted only if present and not default, so as not to
+ * break backwards-compatibility of the dump without need. Keep this code
+ * in sync with the defaults in functioncmds.c.
+ */
+ if (strcmp(procost, "0") != 0)
+ {
+ if (strcmp(lanname, "internal") == 0 || strcmp(lanname, "c") == 0)
+ {
+ /* default cost is 1 */
+ if (strcmp(procost, "1") != 0)
+ appendPQExpBuffer(q, " COST %s", procost);
+ }
+ else
+ {
+ /* default cost is 100 */
+ if (strcmp(procost, "100") != 0)
+ appendPQExpBuffer(q, " COST %s", procost);
+ }
+ }
+ if (proretset[0] == 't' &&
+ strcmp(prorows, "0") != 0 && strcmp(prorows, "1000") != 0)
+ appendPQExpBuffer(q, " ROWS %s", prorows);
+
+ if (strcmp(prosupport, "-") != 0)
+ {
+ /* We rely on regprocout to provide quoting and qualification */
+ appendPQExpBuffer(q, " SUPPORT %s", prosupport);
+ }
+
+ if (proparallel[0] != PROPARALLEL_UNSAFE)
+ {
+ if (proparallel[0] == PROPARALLEL_SAFE)
+ appendPQExpBufferStr(q, " PARALLEL SAFE");
+ else if (proparallel[0] == PROPARALLEL_RESTRICTED)
+ appendPQExpBufferStr(q, " PARALLEL RESTRICTED");
+ else if (proparallel[0] != PROPARALLEL_UNSAFE)
+ pg_fatal("unrecognized proparallel value for function \"%s\"",
+ finfo->dobj.name);
+ }
+
+ for (i = 0; i < nconfigitems; i++)
+ {
+ /* we feel free to scribble on configitems[] here */
+ char *configitem = configitems[i];
+ char *pos;
+
+ pos = strchr(configitem, '=');
+ if (pos == NULL)
+ continue;
+ *pos++ = '\0';
+ appendPQExpBuffer(q, "\n SET %s TO ", fmtId(configitem));
+
+ /*
+ * Variables that are marked GUC_LIST_QUOTE were already fully quoted
+ * by flatten_set_variable_args() before they were put into the
+ * proconfig array. However, because the quoting rules used there
+ * aren't exactly like SQL's, we have to break the list value apart
+ * and then quote the elements as string literals. (The elements may
+ * be double-quoted as-is, but we can't just feed them to the SQL
+ * parser; it would do the wrong thing with elements that are
+ * zero-length or longer than NAMEDATALEN.)
+ *
+ * Variables that are not so marked should just be emitted as simple
+ * string literals. If the variable is not known to
+ * variable_is_guc_list_quote(), we'll do that; this makes it unsafe
+ * to use GUC_LIST_QUOTE for extension variables.
+ */
+ if (variable_is_guc_list_quote(configitem))
+ {
+ char **namelist;
+ char **nameptr;
+
+ /* Parse string into list of identifiers */
+ /* this shouldn't fail really */
+ if (SplitGUCList(pos, ',', &namelist))
+ {
+ for (nameptr = namelist; *nameptr; nameptr++)
+ {
+ if (nameptr != namelist)
+ appendPQExpBufferStr(q, ", ");
+ appendStringLiteralAH(q, *nameptr, fout);
+ }
+ }
+ pg_free(namelist);
+ }
+ else
+ appendStringLiteralAH(q, pos, fout);
+ }
+
+ appendPQExpBuffer(q, "\n %s;\n", asPart->data);
+
+ append_depends_on_extension(fout, q, &finfo->dobj,
+ "pg_catalog.pg_proc", keyword,
+ qual_funcsig);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &finfo->dobj,
+ keyword, funcsig,
+ finfo->dobj.namespace->dobj.name);
+
+ if (finfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, finfo->dobj.catId, finfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = funcsig_tag,
+ .namespace = finfo->dobj.namespace->dobj.name,
+ .owner = finfo->rolname,
+ .description = keyword,
+ .section = finfo->postponed_def ?
+ SECTION_POST_DATA : SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delqry->data));
+
+ /* Dump Function Comments and Security Labels */
+ if (finfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, keyword, funcsig,
+ finfo->dobj.namespace->dobj.name, finfo->rolname,
+ finfo->dobj.catId, 0, finfo->dobj.dumpId);
+
+ if (finfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, keyword, funcsig,
+ finfo->dobj.namespace->dobj.name, finfo->rolname,
+ finfo->dobj.catId, 0, finfo->dobj.dumpId);
+
+ if (finfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, finfo->dobj.dumpId, InvalidDumpId, keyword,
+ funcsig, NULL,
+ finfo->dobj.namespace->dobj.name,
+ finfo->rolname, &finfo->dacl);
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delqry);
+ destroyPQExpBuffer(asPart);
+ free(funcsig);
+ if (funcfullsig)
+ free(funcfullsig);
+ free(funcsig_tag);
+ free(qual_funcsig);
+ if (configitems)
+ free(configitems);
+}
+
+
+/*
+ * Dump a user-defined cast
+ */
+static void
+dumpCast(Archive *fout, const CastInfo *cast)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer defqry;
+ PQExpBuffer delqry;
+ PQExpBuffer labelq;
+ PQExpBuffer castargs;
+ FuncInfo *funcInfo = NULL;
+ const char *sourceType;
+ const char *targetType;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ /* Cannot dump if we don't have the cast function's info */
+ if (OidIsValid(cast->castfunc))
+ {
+ funcInfo = findFuncByOid(cast->castfunc);
+ if (funcInfo == NULL)
+ pg_fatal("could not find function definition for function with OID %u",
+ cast->castfunc);
+ }
+
+ defqry = createPQExpBuffer();
+ delqry = createPQExpBuffer();
+ labelq = createPQExpBuffer();
+ castargs = createPQExpBuffer();
+
+ sourceType = getFormattedTypeName(fout, cast->castsource, zeroAsNone);
+ targetType = getFormattedTypeName(fout, cast->casttarget, zeroAsNone);
+ appendPQExpBuffer(delqry, "DROP CAST (%s AS %s);\n",
+ sourceType, targetType);
+
+ appendPQExpBuffer(defqry, "CREATE CAST (%s AS %s) ",
+ sourceType, targetType);
+
+ switch (cast->castmethod)
+ {
+ case COERCION_METHOD_BINARY:
+ appendPQExpBufferStr(defqry, "WITHOUT FUNCTION");
+ break;
+ case COERCION_METHOD_INOUT:
+ appendPQExpBufferStr(defqry, "WITH INOUT");
+ break;
+ case COERCION_METHOD_FUNCTION:
+ if (funcInfo)
+ {
+ char *fsig = format_function_signature(fout, funcInfo, true);
+
+ /*
+ * Always qualify the function name (format_function_signature
+ * won't qualify it).
+ */
+ appendPQExpBuffer(defqry, "WITH FUNCTION %s.%s",
+ fmtId(funcInfo->dobj.namespace->dobj.name), fsig);
+ free(fsig);
+ }
+ else
+ pg_log_warning("bogus value in pg_cast.castfunc or pg_cast.castmethod field");
+ break;
+ default:
+ pg_log_warning("bogus value in pg_cast.castmethod field");
+ }
+
+ if (cast->castcontext == 'a')
+ appendPQExpBufferStr(defqry, " AS ASSIGNMENT");
+ else if (cast->castcontext == 'i')
+ appendPQExpBufferStr(defqry, " AS IMPLICIT");
+ appendPQExpBufferStr(defqry, ";\n");
+
+ appendPQExpBuffer(labelq, "CAST (%s AS %s)",
+ sourceType, targetType);
+
+ appendPQExpBuffer(castargs, "(%s AS %s)",
+ sourceType, targetType);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(defqry, &cast->dobj,
+ "CAST", castargs->data, NULL);
+
+ if (cast->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, cast->dobj.catId, cast->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = labelq->data,
+ .description = "CAST",
+ .section = SECTION_PRE_DATA,
+ .createStmt = defqry->data,
+ .dropStmt = delqry->data));
+
+ /* Dump Cast Comments */
+ if (cast->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "CAST", castargs->data,
+ NULL, "",
+ cast->dobj.catId, 0, cast->dobj.dumpId);
+
+ destroyPQExpBuffer(defqry);
+ destroyPQExpBuffer(delqry);
+ destroyPQExpBuffer(labelq);
+ destroyPQExpBuffer(castargs);
+}
+
+/*
+ * Dump a transform
+ */
+static void
+dumpTransform(Archive *fout, const TransformInfo *transform)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer defqry;
+ PQExpBuffer delqry;
+ PQExpBuffer labelq;
+ PQExpBuffer transformargs;
+ FuncInfo *fromsqlFuncInfo = NULL;
+ FuncInfo *tosqlFuncInfo = NULL;
+ char *lanname;
+ const char *transformType;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ /* Cannot dump if we don't have the transform functions' info */
+ if (OidIsValid(transform->trffromsql))
+ {
+ fromsqlFuncInfo = findFuncByOid(transform->trffromsql);
+ if (fromsqlFuncInfo == NULL)
+ pg_fatal("could not find function definition for function with OID %u",
+ transform->trffromsql);
+ }
+ if (OidIsValid(transform->trftosql))
+ {
+ tosqlFuncInfo = findFuncByOid(transform->trftosql);
+ if (tosqlFuncInfo == NULL)
+ pg_fatal("could not find function definition for function with OID %u",
+ transform->trftosql);
+ }
+
+ defqry = createPQExpBuffer();
+ delqry = createPQExpBuffer();
+ labelq = createPQExpBuffer();
+ transformargs = createPQExpBuffer();
+
+ lanname = get_language_name(fout, transform->trflang);
+ transformType = getFormattedTypeName(fout, transform->trftype, zeroAsNone);
+
+ appendPQExpBuffer(delqry, "DROP TRANSFORM FOR %s LANGUAGE %s;\n",
+ transformType, lanname);
+
+ appendPQExpBuffer(defqry, "CREATE TRANSFORM FOR %s LANGUAGE %s (",
+ transformType, lanname);
+
+ if (!transform->trffromsql && !transform->trftosql)
+ pg_log_warning("bogus transform definition, at least one of trffromsql and trftosql should be nonzero");
+
+ if (transform->trffromsql)
+ {
+ if (fromsqlFuncInfo)
+ {
+ char *fsig = format_function_signature(fout, fromsqlFuncInfo, true);
+
+ /*
+ * Always qualify the function name (format_function_signature
+ * won't qualify it).
+ */
+ appendPQExpBuffer(defqry, "FROM SQL WITH FUNCTION %s.%s",
+ fmtId(fromsqlFuncInfo->dobj.namespace->dobj.name), fsig);
+ free(fsig);
+ }
+ else
+ pg_log_warning("bogus value in pg_transform.trffromsql field");
+ }
+
+ if (transform->trftosql)
+ {
+ if (transform->trffromsql)
+ appendPQExpBufferStr(defqry, ", ");
+
+ if (tosqlFuncInfo)
+ {
+ char *fsig = format_function_signature(fout, tosqlFuncInfo, true);
+
+ /*
+ * Always qualify the function name (format_function_signature
+ * won't qualify it).
+ */
+ appendPQExpBuffer(defqry, "TO SQL WITH FUNCTION %s.%s",
+ fmtId(tosqlFuncInfo->dobj.namespace->dobj.name), fsig);
+ free(fsig);
+ }
+ else
+ pg_log_warning("bogus value in pg_transform.trftosql field");
+ }
+
+ appendPQExpBufferStr(defqry, ");\n");
+
+ appendPQExpBuffer(labelq, "TRANSFORM FOR %s LANGUAGE %s",
+ transformType, lanname);
+
+ appendPQExpBuffer(transformargs, "FOR %s LANGUAGE %s",
+ transformType, lanname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(defqry, &transform->dobj,
+ "TRANSFORM", transformargs->data, NULL);
+
+ if (transform->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, transform->dobj.catId, transform->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = labelq->data,
+ .description = "TRANSFORM",
+ .section = SECTION_PRE_DATA,
+ .createStmt = defqry->data,
+ .dropStmt = delqry->data,
+ .deps = transform->dobj.dependencies,
+ .nDeps = transform->dobj.nDeps));
+
+ /* Dump Transform Comments */
+ if (transform->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TRANSFORM", transformargs->data,
+ NULL, "",
+ transform->dobj.catId, 0, transform->dobj.dumpId);
+
+ free(lanname);
+ destroyPQExpBuffer(defqry);
+ destroyPQExpBuffer(delqry);
+ destroyPQExpBuffer(labelq);
+ destroyPQExpBuffer(transformargs);
+}
+
+
+/*
+ * dumpOpr
+ * write out a single operator definition
+ */
+static void
+dumpOpr(Archive *fout, const OprInfo *oprinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer oprid;
+ PQExpBuffer details;
+ PGresult *res;
+ int i_oprkind;
+ int i_oprcode;
+ int i_oprleft;
+ int i_oprright;
+ int i_oprcom;
+ int i_oprnegate;
+ int i_oprrest;
+ int i_oprjoin;
+ int i_oprcanmerge;
+ int i_oprcanhash;
+ char *oprkind;
+ char *oprcode;
+ char *oprleft;
+ char *oprright;
+ char *oprcom;
+ char *oprnegate;
+ char *oprrest;
+ char *oprjoin;
+ char *oprcanmerge;
+ char *oprcanhash;
+ char *oprregproc;
+ char *oprref;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ /*
+ * some operators are invalid because they were the result of user
+ * defining operators before commutators exist
+ */
+ if (!OidIsValid(oprinfo->oprcode))
+ return;
+
+ query = createPQExpBuffer();
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ oprid = createPQExpBuffer();
+ details = createPQExpBuffer();
+
+ if (!fout->is_prepared[PREPQUERY_DUMPOPR])
+ {
+ /* Set up query for operator-specific details */
+ appendPQExpBufferStr(query,
+ "PREPARE dumpOpr(pg_catalog.oid) AS\n"
+ "SELECT oprkind, "
+ "oprcode::pg_catalog.regprocedure, "
+ "oprleft::pg_catalog.regtype, "
+ "oprright::pg_catalog.regtype, "
+ "oprcom, "
+ "oprnegate, "
+ "oprrest::pg_catalog.regprocedure, "
+ "oprjoin::pg_catalog.regprocedure, "
+ "oprcanmerge, oprcanhash "
+ "FROM pg_catalog.pg_operator "
+ "WHERE oid = $1");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_DUMPOPR] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE dumpOpr('%u')",
+ oprinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ i_oprkind = PQfnumber(res, "oprkind");
+ i_oprcode = PQfnumber(res, "oprcode");
+ i_oprleft = PQfnumber(res, "oprleft");
+ i_oprright = PQfnumber(res, "oprright");
+ i_oprcom = PQfnumber(res, "oprcom");
+ i_oprnegate = PQfnumber(res, "oprnegate");
+ i_oprrest = PQfnumber(res, "oprrest");
+ i_oprjoin = PQfnumber(res, "oprjoin");
+ i_oprcanmerge = PQfnumber(res, "oprcanmerge");
+ i_oprcanhash = PQfnumber(res, "oprcanhash");
+
+ oprkind = PQgetvalue(res, 0, i_oprkind);
+ oprcode = PQgetvalue(res, 0, i_oprcode);
+ oprleft = PQgetvalue(res, 0, i_oprleft);
+ oprright = PQgetvalue(res, 0, i_oprright);
+ oprcom = PQgetvalue(res, 0, i_oprcom);
+ oprnegate = PQgetvalue(res, 0, i_oprnegate);
+ oprrest = PQgetvalue(res, 0, i_oprrest);
+ oprjoin = PQgetvalue(res, 0, i_oprjoin);
+ oprcanmerge = PQgetvalue(res, 0, i_oprcanmerge);
+ oprcanhash = PQgetvalue(res, 0, i_oprcanhash);
+
+ /* In PG14 upwards postfix operator support does not exist anymore. */
+ if (strcmp(oprkind, "r") == 0)
+ pg_log_warning("postfix operators are not supported anymore (operator \"%s\")",
+ oprcode);
+
+ oprregproc = convertRegProcReference(oprcode);
+ if (oprregproc)
+ {
+ appendPQExpBuffer(details, " FUNCTION = %s", oprregproc);
+ free(oprregproc);
+ }
+
+ appendPQExpBuffer(oprid, "%s (",
+ oprinfo->dobj.name);
+
+ /*
+ * right unary means there's a left arg and left unary means there's a
+ * right arg. (Although the "r" case is dead code for PG14 and later,
+ * continue to support it in case we're dumping from an old server.)
+ */
+ if (strcmp(oprkind, "r") == 0 ||
+ strcmp(oprkind, "b") == 0)
+ {
+ appendPQExpBuffer(details, ",\n LEFTARG = %s", oprleft);
+ appendPQExpBufferStr(oprid, oprleft);
+ }
+ else
+ appendPQExpBufferStr(oprid, "NONE");
+
+ if (strcmp(oprkind, "l") == 0 ||
+ strcmp(oprkind, "b") == 0)
+ {
+ appendPQExpBuffer(details, ",\n RIGHTARG = %s", oprright);
+ appendPQExpBuffer(oprid, ", %s)", oprright);
+ }
+ else
+ appendPQExpBufferStr(oprid, ", NONE)");
+
+ oprref = getFormattedOperatorName(oprcom);
+ if (oprref)
+ {
+ appendPQExpBuffer(details, ",\n COMMUTATOR = %s", oprref);
+ free(oprref);
+ }
+
+ oprref = getFormattedOperatorName(oprnegate);
+ if (oprref)
+ {
+ appendPQExpBuffer(details, ",\n NEGATOR = %s", oprref);
+ free(oprref);
+ }
+
+ if (strcmp(oprcanmerge, "t") == 0)
+ appendPQExpBufferStr(details, ",\n MERGES");
+
+ if (strcmp(oprcanhash, "t") == 0)
+ appendPQExpBufferStr(details, ",\n HASHES");
+
+ oprregproc = convertRegProcReference(oprrest);
+ if (oprregproc)
+ {
+ appendPQExpBuffer(details, ",\n RESTRICT = %s", oprregproc);
+ free(oprregproc);
+ }
+
+ oprregproc = convertRegProcReference(oprjoin);
+ if (oprregproc)
+ {
+ appendPQExpBuffer(details, ",\n JOIN = %s", oprregproc);
+ free(oprregproc);
+ }
+
+ appendPQExpBuffer(delq, "DROP OPERATOR %s.%s;\n",
+ fmtId(oprinfo->dobj.namespace->dobj.name),
+ oprid->data);
+
+ appendPQExpBuffer(q, "CREATE OPERATOR %s.%s (\n%s\n);\n",
+ fmtId(oprinfo->dobj.namespace->dobj.name),
+ oprinfo->dobj.name, details->data);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &oprinfo->dobj,
+ "OPERATOR", oprid->data,
+ oprinfo->dobj.namespace->dobj.name);
+
+ if (oprinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, oprinfo->dobj.catId, oprinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = oprinfo->dobj.name,
+ .namespace = oprinfo->dobj.namespace->dobj.name,
+ .owner = oprinfo->rolname,
+ .description = "OPERATOR",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Operator Comments */
+ if (oprinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "OPERATOR", oprid->data,
+ oprinfo->dobj.namespace->dobj.name, oprinfo->rolname,
+ oprinfo->dobj.catId, 0, oprinfo->dobj.dumpId);
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(oprid);
+ destroyPQExpBuffer(details);
+}
+
+/*
+ * Convert a function reference obtained from pg_operator
+ *
+ * Returns allocated string of what to print, or NULL if function references
+ * is InvalidOid. Returned string is expected to be free'd by the caller.
+ *
+ * The input is a REGPROCEDURE display; we have to strip the argument-types
+ * part.
+ */
+static char *
+convertRegProcReference(const char *proc)
+{
+ char *name;
+ char *paren;
+ bool inquote;
+
+ /* In all cases "-" means a null reference */
+ if (strcmp(proc, "-") == 0)
+ return NULL;
+
+ name = pg_strdup(proc);
+ /* find non-double-quoted left paren */
+ inquote = false;
+ for (paren = name; *paren; paren++)
+ {
+ if (*paren == '(' && !inquote)
+ {
+ *paren = '\0';
+ break;
+ }
+ if (*paren == '"')
+ inquote = !inquote;
+ }
+ return name;
+}
+
+/*
+ * getFormattedOperatorName - retrieve the operator name for the
+ * given operator OID (presented in string form).
+ *
+ * Returns an allocated string, or NULL if the given OID is invalid.
+ * Caller is responsible for free'ing result string.
+ *
+ * What we produce has the format "OPERATOR(schema.oprname)". This is only
+ * useful in commands where the operator's argument types can be inferred from
+ * context. We always schema-qualify the name, though. The predecessor to
+ * this code tried to skip the schema qualification if possible, but that led
+ * to wrong results in corner cases, such as if an operator and its negator
+ * are in different schemas.
+ */
+static char *
+getFormattedOperatorName(const char *oproid)
+{
+ OprInfo *oprInfo;
+
+ /* In all cases "0" means a null reference */
+ if (strcmp(oproid, "0") == 0)
+ return NULL;
+
+ oprInfo = findOprByOid(atooid(oproid));
+ if (oprInfo == NULL)
+ {
+ pg_log_warning("could not find operator with OID %s",
+ oproid);
+ return NULL;
+ }
+
+ return psprintf("OPERATOR(%s.%s)",
+ fmtId(oprInfo->dobj.namespace->dobj.name),
+ oprInfo->dobj.name);
+}
+
+/*
+ * Convert a function OID obtained from pg_ts_parser or pg_ts_template
+ *
+ * It is sufficient to use REGPROC rather than REGPROCEDURE, since the
+ * argument lists of these functions are predetermined. Note that the
+ * caller should ensure we are in the proper schema, because the results
+ * are search path dependent!
+ */
+static char *
+convertTSFunction(Archive *fout, Oid funcOid)
+{
+ char *result;
+ char query[128];
+ PGresult *res;
+
+ snprintf(query, sizeof(query),
+ "SELECT '%u'::pg_catalog.regproc", funcOid);
+ res = ExecuteSqlQueryForSingleRow(fout, query);
+
+ result = pg_strdup(PQgetvalue(res, 0, 0));
+
+ PQclear(res);
+
+ return result;
+}
+
+/*
+ * dumpAccessMethod
+ * write out a single access method definition
+ */
+static void
+dumpAccessMethod(Archive *fout, const AccessMethodInfo *aminfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qamname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qamname = pg_strdup(fmtId(aminfo->dobj.name));
+
+ appendPQExpBuffer(q, "CREATE ACCESS METHOD %s ", qamname);
+
+ switch (aminfo->amtype)
+ {
+ case AMTYPE_INDEX:
+ appendPQExpBufferStr(q, "TYPE INDEX ");
+ break;
+ case AMTYPE_TABLE:
+ appendPQExpBufferStr(q, "TYPE TABLE ");
+ break;
+ default:
+ pg_log_warning("invalid type \"%c\" of access method \"%s\"",
+ aminfo->amtype, qamname);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qamname);
+ return;
+ }
+
+ appendPQExpBuffer(q, "HANDLER %s;\n", aminfo->amhandler);
+
+ appendPQExpBuffer(delq, "DROP ACCESS METHOD %s;\n",
+ qamname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &aminfo->dobj,
+ "ACCESS METHOD", qamname, NULL);
+
+ if (aminfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, aminfo->dobj.catId, aminfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = aminfo->dobj.name,
+ .description = "ACCESS METHOD",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Access Method Comments */
+ if (aminfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "ACCESS METHOD", qamname,
+ NULL, "",
+ aminfo->dobj.catId, 0, aminfo->dobj.dumpId);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qamname);
+}
+
+/*
+ * dumpOpclass
+ * write out a single operator class definition
+ */
+static void
+dumpOpclass(Archive *fout, const OpclassInfo *opcinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer nameusing;
+ PGresult *res;
+ int ntups;
+ int i_opcintype;
+ int i_opckeytype;
+ int i_opcdefault;
+ int i_opcfamily;
+ int i_opcfamilyname;
+ int i_opcfamilynsp;
+ int i_amname;
+ int i_amopstrategy;
+ int i_amopopr;
+ int i_sortfamily;
+ int i_sortfamilynsp;
+ int i_amprocnum;
+ int i_amproc;
+ int i_amproclefttype;
+ int i_amprocrighttype;
+ char *opcintype;
+ char *opckeytype;
+ char *opcdefault;
+ char *opcfamily;
+ char *opcfamilyname;
+ char *opcfamilynsp;
+ char *amname;
+ char *amopstrategy;
+ char *amopopr;
+ char *sortfamily;
+ char *sortfamilynsp;
+ char *amprocnum;
+ char *amproc;
+ char *amproclefttype;
+ char *amprocrighttype;
+ bool needComma;
+ int i;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ query = createPQExpBuffer();
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ nameusing = createPQExpBuffer();
+
+ /* Get additional fields from the pg_opclass row */
+ appendPQExpBuffer(query, "SELECT opcintype::pg_catalog.regtype, "
+ "opckeytype::pg_catalog.regtype, "
+ "opcdefault, opcfamily, "
+ "opfname AS opcfamilyname, "
+ "nspname AS opcfamilynsp, "
+ "(SELECT amname FROM pg_catalog.pg_am WHERE oid = opcmethod) AS amname "
+ "FROM pg_catalog.pg_opclass c "
+ "LEFT JOIN pg_catalog.pg_opfamily f ON f.oid = opcfamily "
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = opfnamespace "
+ "WHERE c.oid = '%u'::pg_catalog.oid",
+ opcinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ i_opcintype = PQfnumber(res, "opcintype");
+ i_opckeytype = PQfnumber(res, "opckeytype");
+ i_opcdefault = PQfnumber(res, "opcdefault");
+ i_opcfamily = PQfnumber(res, "opcfamily");
+ i_opcfamilyname = PQfnumber(res, "opcfamilyname");
+ i_opcfamilynsp = PQfnumber(res, "opcfamilynsp");
+ i_amname = PQfnumber(res, "amname");
+
+ /* opcintype may still be needed after we PQclear res */
+ opcintype = pg_strdup(PQgetvalue(res, 0, i_opcintype));
+ opckeytype = PQgetvalue(res, 0, i_opckeytype);
+ opcdefault = PQgetvalue(res, 0, i_opcdefault);
+ /* opcfamily will still be needed after we PQclear res */
+ opcfamily = pg_strdup(PQgetvalue(res, 0, i_opcfamily));
+ opcfamilyname = PQgetvalue(res, 0, i_opcfamilyname);
+ opcfamilynsp = PQgetvalue(res, 0, i_opcfamilynsp);
+ /* amname will still be needed after we PQclear res */
+ amname = pg_strdup(PQgetvalue(res, 0, i_amname));
+
+ appendPQExpBuffer(delq, "DROP OPERATOR CLASS %s",
+ fmtQualifiedDumpable(opcinfo));
+ appendPQExpBuffer(delq, " USING %s;\n",
+ fmtId(amname));
+
+ /* Build the fixed portion of the CREATE command */
+ appendPQExpBuffer(q, "CREATE OPERATOR CLASS %s\n ",
+ fmtQualifiedDumpable(opcinfo));
+ if (strcmp(opcdefault, "t") == 0)
+ appendPQExpBufferStr(q, "DEFAULT ");
+ appendPQExpBuffer(q, "FOR TYPE %s USING %s",
+ opcintype,
+ fmtId(amname));
+ if (strlen(opcfamilyname) > 0)
+ {
+ appendPQExpBufferStr(q, " FAMILY ");
+ appendPQExpBuffer(q, "%s.", fmtId(opcfamilynsp));
+ appendPQExpBufferStr(q, fmtId(opcfamilyname));
+ }
+ appendPQExpBufferStr(q, " AS\n ");
+
+ needComma = false;
+
+ if (strcmp(opckeytype, "-") != 0)
+ {
+ appendPQExpBuffer(q, "STORAGE %s",
+ opckeytype);
+ needComma = true;
+ }
+
+ PQclear(res);
+
+ /*
+ * Now fetch and print the OPERATOR entries (pg_amop rows).
+ *
+ * Print only those opfamily members that are tied to the opclass by
+ * pg_depend entries.
+ */
+ resetPQExpBuffer(query);
+ appendPQExpBuffer(query, "SELECT amopstrategy, "
+ "amopopr::pg_catalog.regoperator, "
+ "opfname AS sortfamily, "
+ "nspname AS sortfamilynsp "
+ "FROM pg_catalog.pg_amop ao JOIN pg_catalog.pg_depend ON "
+ "(classid = 'pg_catalog.pg_amop'::pg_catalog.regclass AND objid = ao.oid) "
+ "LEFT JOIN pg_catalog.pg_opfamily f ON f.oid = amopsortfamily "
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = opfnamespace "
+ "WHERE refclassid = 'pg_catalog.pg_opclass'::pg_catalog.regclass "
+ "AND refobjid = '%u'::pg_catalog.oid "
+ "AND amopfamily = '%s'::pg_catalog.oid "
+ "ORDER BY amopstrategy",
+ opcinfo->dobj.catId.oid,
+ opcfamily);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_amopstrategy = PQfnumber(res, "amopstrategy");
+ i_amopopr = PQfnumber(res, "amopopr");
+ i_sortfamily = PQfnumber(res, "sortfamily");
+ i_sortfamilynsp = PQfnumber(res, "sortfamilynsp");
+
+ for (i = 0; i < ntups; i++)
+ {
+ amopstrategy = PQgetvalue(res, i, i_amopstrategy);
+ amopopr = PQgetvalue(res, i, i_amopopr);
+ sortfamily = PQgetvalue(res, i, i_sortfamily);
+ sortfamilynsp = PQgetvalue(res, i, i_sortfamilynsp);
+
+ if (needComma)
+ appendPQExpBufferStr(q, " ,\n ");
+
+ appendPQExpBuffer(q, "OPERATOR %s %s",
+ amopstrategy, amopopr);
+
+ if (strlen(sortfamily) > 0)
+ {
+ appendPQExpBufferStr(q, " FOR ORDER BY ");
+ appendPQExpBuffer(q, "%s.", fmtId(sortfamilynsp));
+ appendPQExpBufferStr(q, fmtId(sortfamily));
+ }
+
+ needComma = true;
+ }
+
+ PQclear(res);
+
+ /*
+ * Now fetch and print the FUNCTION entries (pg_amproc rows).
+ *
+ * Print only those opfamily members that are tied to the opclass by
+ * pg_depend entries.
+ *
+ * We print the amproclefttype/amprocrighttype even though in most cases
+ * the backend could deduce the right values, because of the corner case
+ * of a btree sort support function for a cross-type comparison.
+ */
+ resetPQExpBuffer(query);
+
+ appendPQExpBuffer(query, "SELECT amprocnum, "
+ "amproc::pg_catalog.regprocedure, "
+ "amproclefttype::pg_catalog.regtype, "
+ "amprocrighttype::pg_catalog.regtype "
+ "FROM pg_catalog.pg_amproc ap, pg_catalog.pg_depend "
+ "WHERE refclassid = 'pg_catalog.pg_opclass'::pg_catalog.regclass "
+ "AND refobjid = '%u'::pg_catalog.oid "
+ "AND classid = 'pg_catalog.pg_amproc'::pg_catalog.regclass "
+ "AND objid = ap.oid "
+ "ORDER BY amprocnum",
+ opcinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_amprocnum = PQfnumber(res, "amprocnum");
+ i_amproc = PQfnumber(res, "amproc");
+ i_amproclefttype = PQfnumber(res, "amproclefttype");
+ i_amprocrighttype = PQfnumber(res, "amprocrighttype");
+
+ for (i = 0; i < ntups; i++)
+ {
+ amprocnum = PQgetvalue(res, i, i_amprocnum);
+ amproc = PQgetvalue(res, i, i_amproc);
+ amproclefttype = PQgetvalue(res, i, i_amproclefttype);
+ amprocrighttype = PQgetvalue(res, i, i_amprocrighttype);
+
+ if (needComma)
+ appendPQExpBufferStr(q, " ,\n ");
+
+ appendPQExpBuffer(q, "FUNCTION %s", amprocnum);
+
+ if (*amproclefttype && *amprocrighttype)
+ appendPQExpBuffer(q, " (%s, %s)", amproclefttype, amprocrighttype);
+
+ appendPQExpBuffer(q, " %s", amproc);
+
+ needComma = true;
+ }
+
+ PQclear(res);
+
+ /*
+ * If needComma is still false it means we haven't added anything after
+ * the AS keyword. To avoid printing broken SQL, append a dummy STORAGE
+ * clause with the same datatype. This isn't sanctioned by the
+ * documentation, but actually DefineOpClass will treat it as a no-op.
+ */
+ if (!needComma)
+ appendPQExpBuffer(q, "STORAGE %s", opcintype);
+
+ appendPQExpBufferStr(q, ";\n");
+
+ appendPQExpBufferStr(nameusing, fmtId(opcinfo->dobj.name));
+ appendPQExpBuffer(nameusing, " USING %s",
+ fmtId(amname));
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &opcinfo->dobj,
+ "OPERATOR CLASS", nameusing->data,
+ opcinfo->dobj.namespace->dobj.name);
+
+ if (opcinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, opcinfo->dobj.catId, opcinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = opcinfo->dobj.name,
+ .namespace = opcinfo->dobj.namespace->dobj.name,
+ .owner = opcinfo->rolname,
+ .description = "OPERATOR CLASS",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Operator Class Comments */
+ if (opcinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "OPERATOR CLASS", nameusing->data,
+ opcinfo->dobj.namespace->dobj.name, opcinfo->rolname,
+ opcinfo->dobj.catId, 0, opcinfo->dobj.dumpId);
+
+ free(opcintype);
+ free(opcfamily);
+ free(amname);
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(nameusing);
+}
+
+/*
+ * dumpOpfamily
+ * write out a single operator family definition
+ *
+ * Note: this also dumps any "loose" operator members that aren't bound to a
+ * specific opclass within the opfamily.
+ */
+static void
+dumpOpfamily(Archive *fout, const OpfamilyInfo *opfinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer nameusing;
+ PGresult *res;
+ PGresult *res_ops;
+ PGresult *res_procs;
+ int ntups;
+ int i_amname;
+ int i_amopstrategy;
+ int i_amopopr;
+ int i_sortfamily;
+ int i_sortfamilynsp;
+ int i_amprocnum;
+ int i_amproc;
+ int i_amproclefttype;
+ int i_amprocrighttype;
+ char *amname;
+ char *amopstrategy;
+ char *amopopr;
+ char *sortfamily;
+ char *sortfamilynsp;
+ char *amprocnum;
+ char *amproc;
+ char *amproclefttype;
+ char *amprocrighttype;
+ bool needComma;
+ int i;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ query = createPQExpBuffer();
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ nameusing = createPQExpBuffer();
+
+ /*
+ * Fetch only those opfamily members that are tied directly to the
+ * opfamily by pg_depend entries.
+ */
+ appendPQExpBuffer(query, "SELECT amopstrategy, "
+ "amopopr::pg_catalog.regoperator, "
+ "opfname AS sortfamily, "
+ "nspname AS sortfamilynsp "
+ "FROM pg_catalog.pg_amop ao JOIN pg_catalog.pg_depend ON "
+ "(classid = 'pg_catalog.pg_amop'::pg_catalog.regclass AND objid = ao.oid) "
+ "LEFT JOIN pg_catalog.pg_opfamily f ON f.oid = amopsortfamily "
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = opfnamespace "
+ "WHERE refclassid = 'pg_catalog.pg_opfamily'::pg_catalog.regclass "
+ "AND refobjid = '%u'::pg_catalog.oid "
+ "AND amopfamily = '%u'::pg_catalog.oid "
+ "ORDER BY amopstrategy",
+ opfinfo->dobj.catId.oid,
+ opfinfo->dobj.catId.oid);
+
+ res_ops = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ resetPQExpBuffer(query);
+
+ appendPQExpBuffer(query, "SELECT amprocnum, "
+ "amproc::pg_catalog.regprocedure, "
+ "amproclefttype::pg_catalog.regtype, "
+ "amprocrighttype::pg_catalog.regtype "
+ "FROM pg_catalog.pg_amproc ap, pg_catalog.pg_depend "
+ "WHERE refclassid = 'pg_catalog.pg_opfamily'::pg_catalog.regclass "
+ "AND refobjid = '%u'::pg_catalog.oid "
+ "AND classid = 'pg_catalog.pg_amproc'::pg_catalog.regclass "
+ "AND objid = ap.oid "
+ "ORDER BY amprocnum",
+ opfinfo->dobj.catId.oid);
+
+ res_procs = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ /* Get additional fields from the pg_opfamily row */
+ resetPQExpBuffer(query);
+
+ appendPQExpBuffer(query, "SELECT "
+ "(SELECT amname FROM pg_catalog.pg_am WHERE oid = opfmethod) AS amname "
+ "FROM pg_catalog.pg_opfamily "
+ "WHERE oid = '%u'::pg_catalog.oid",
+ opfinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ i_amname = PQfnumber(res, "amname");
+
+ /* amname will still be needed after we PQclear res */
+ amname = pg_strdup(PQgetvalue(res, 0, i_amname));
+
+ appendPQExpBuffer(delq, "DROP OPERATOR FAMILY %s",
+ fmtQualifiedDumpable(opfinfo));
+ appendPQExpBuffer(delq, " USING %s;\n",
+ fmtId(amname));
+
+ /* Build the fixed portion of the CREATE command */
+ appendPQExpBuffer(q, "CREATE OPERATOR FAMILY %s",
+ fmtQualifiedDumpable(opfinfo));
+ appendPQExpBuffer(q, " USING %s;\n",
+ fmtId(amname));
+
+ PQclear(res);
+
+ /* Do we need an ALTER to add loose members? */
+ if (PQntuples(res_ops) > 0 || PQntuples(res_procs) > 0)
+ {
+ appendPQExpBuffer(q, "ALTER OPERATOR FAMILY %s",
+ fmtQualifiedDumpable(opfinfo));
+ appendPQExpBuffer(q, " USING %s ADD\n ",
+ fmtId(amname));
+
+ needComma = false;
+
+ /*
+ * Now fetch and print the OPERATOR entries (pg_amop rows).
+ */
+ ntups = PQntuples(res_ops);
+
+ i_amopstrategy = PQfnumber(res_ops, "amopstrategy");
+ i_amopopr = PQfnumber(res_ops, "amopopr");
+ i_sortfamily = PQfnumber(res_ops, "sortfamily");
+ i_sortfamilynsp = PQfnumber(res_ops, "sortfamilynsp");
+
+ for (i = 0; i < ntups; i++)
+ {
+ amopstrategy = PQgetvalue(res_ops, i, i_amopstrategy);
+ amopopr = PQgetvalue(res_ops, i, i_amopopr);
+ sortfamily = PQgetvalue(res_ops, i, i_sortfamily);
+ sortfamilynsp = PQgetvalue(res_ops, i, i_sortfamilynsp);
+
+ if (needComma)
+ appendPQExpBufferStr(q, " ,\n ");
+
+ appendPQExpBuffer(q, "OPERATOR %s %s",
+ amopstrategy, amopopr);
+
+ if (strlen(sortfamily) > 0)
+ {
+ appendPQExpBufferStr(q, " FOR ORDER BY ");
+ appendPQExpBuffer(q, "%s.", fmtId(sortfamilynsp));
+ appendPQExpBufferStr(q, fmtId(sortfamily));
+ }
+
+ needComma = true;
+ }
+
+ /*
+ * Now fetch and print the FUNCTION entries (pg_amproc rows).
+ */
+ ntups = PQntuples(res_procs);
+
+ i_amprocnum = PQfnumber(res_procs, "amprocnum");
+ i_amproc = PQfnumber(res_procs, "amproc");
+ i_amproclefttype = PQfnumber(res_procs, "amproclefttype");
+ i_amprocrighttype = PQfnumber(res_procs, "amprocrighttype");
+
+ for (i = 0; i < ntups; i++)
+ {
+ amprocnum = PQgetvalue(res_procs, i, i_amprocnum);
+ amproc = PQgetvalue(res_procs, i, i_amproc);
+ amproclefttype = PQgetvalue(res_procs, i, i_amproclefttype);
+ amprocrighttype = PQgetvalue(res_procs, i, i_amprocrighttype);
+
+ if (needComma)
+ appendPQExpBufferStr(q, " ,\n ");
+
+ appendPQExpBuffer(q, "FUNCTION %s (%s, %s) %s",
+ amprocnum, amproclefttype, amprocrighttype,
+ amproc);
+
+ needComma = true;
+ }
+
+ appendPQExpBufferStr(q, ";\n");
+ }
+
+ appendPQExpBufferStr(nameusing, fmtId(opfinfo->dobj.name));
+ appendPQExpBuffer(nameusing, " USING %s",
+ fmtId(amname));
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &opfinfo->dobj,
+ "OPERATOR FAMILY", nameusing->data,
+ opfinfo->dobj.namespace->dobj.name);
+
+ if (opfinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, opfinfo->dobj.catId, opfinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = opfinfo->dobj.name,
+ .namespace = opfinfo->dobj.namespace->dobj.name,
+ .owner = opfinfo->rolname,
+ .description = "OPERATOR FAMILY",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Operator Family Comments */
+ if (opfinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "OPERATOR FAMILY", nameusing->data,
+ opfinfo->dobj.namespace->dobj.name, opfinfo->rolname,
+ opfinfo->dobj.catId, 0, opfinfo->dobj.dumpId);
+
+ free(amname);
+ PQclear(res_ops);
+ PQclear(res_procs);
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(nameusing);
+}
+
+/*
+ * dumpCollation
+ * write out a single collation definition
+ */
+static void
+dumpCollation(Archive *fout, const CollInfo *collinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qcollname;
+ PGresult *res;
+ int i_collprovider;
+ int i_collisdeterministic;
+ int i_collcollate;
+ int i_collctype;
+ int i_colliculocale;
+ const char *collprovider;
+ const char *collcollate;
+ const char *collctype;
+ const char *colliculocale;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ query = createPQExpBuffer();
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qcollname = pg_strdup(fmtId(collinfo->dobj.name));
+
+ /* Get collation-specific details */
+ appendPQExpBufferStr(query, "SELECT ");
+
+ if (fout->remoteVersion >= 100000)
+ appendPQExpBufferStr(query,
+ "collprovider, "
+ "collversion, ");
+ else
+ appendPQExpBufferStr(query,
+ "'c' AS collprovider, "
+ "NULL AS collversion, ");
+
+ if (fout->remoteVersion >= 120000)
+ appendPQExpBufferStr(query,
+ "collisdeterministic, ");
+ else
+ appendPQExpBufferStr(query,
+ "true AS collisdeterministic, ");
+
+ if (fout->remoteVersion >= 150000)
+ appendPQExpBufferStr(query,
+ "colliculocale, ");
+ else
+ appendPQExpBufferStr(query,
+ "NULL AS colliculocale, ");
+
+ appendPQExpBuffer(query,
+ "collcollate, "
+ "collctype "
+ "FROM pg_catalog.pg_collation c "
+ "WHERE c.oid = '%u'::pg_catalog.oid",
+ collinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ i_collprovider = PQfnumber(res, "collprovider");
+ i_collisdeterministic = PQfnumber(res, "collisdeterministic");
+ i_collcollate = PQfnumber(res, "collcollate");
+ i_collctype = PQfnumber(res, "collctype");
+ i_colliculocale = PQfnumber(res, "colliculocale");
+
+ collprovider = PQgetvalue(res, 0, i_collprovider);
+
+ if (!PQgetisnull(res, 0, i_collcollate))
+ collcollate = PQgetvalue(res, 0, i_collcollate);
+ else
+ collcollate = NULL;
+
+ if (!PQgetisnull(res, 0, i_collctype))
+ collctype = PQgetvalue(res, 0, i_collctype);
+ else
+ collctype = NULL;
+
+ /*
+ * Before version 15, collcollate and collctype were of type NAME and
+ * non-nullable. Treat empty strings as NULL for consistency.
+ */
+ if (fout->remoteVersion < 150000)
+ {
+ if (collcollate[0] == '\0')
+ collcollate = NULL;
+ if (collctype[0] == '\0')
+ collctype = NULL;
+ }
+
+ if (!PQgetisnull(res, 0, i_colliculocale))
+ colliculocale = PQgetvalue(res, 0, i_colliculocale);
+ else
+ colliculocale = NULL;
+
+ appendPQExpBuffer(delq, "DROP COLLATION %s;\n",
+ fmtQualifiedDumpable(collinfo));
+
+ appendPQExpBuffer(q, "CREATE COLLATION %s (",
+ fmtQualifiedDumpable(collinfo));
+
+ appendPQExpBufferStr(q, "provider = ");
+ if (collprovider[0] == 'c')
+ appendPQExpBufferStr(q, "libc");
+ else if (collprovider[0] == 'i')
+ appendPQExpBufferStr(q, "icu");
+ else if (collprovider[0] == 'd')
+ /* to allow dumping pg_catalog; not accepted on input */
+ appendPQExpBufferStr(q, "default");
+ else
+ pg_fatal("unrecognized collation provider: %s",
+ collprovider);
+
+ if (strcmp(PQgetvalue(res, 0, i_collisdeterministic), "f") == 0)
+ appendPQExpBufferStr(q, ", deterministic = false");
+
+ if (collprovider[0] == 'd')
+ {
+ if (collcollate || collctype || colliculocale)
+ pg_log_warning("invalid collation \"%s\"", qcollname);
+
+ /* no locale -- the default collation cannot be reloaded anyway */
+ }
+ else if (collprovider[0] == 'i')
+ {
+ if (fout->remoteVersion >= 150000)
+ {
+ if (collcollate || collctype || !colliculocale)
+ pg_log_warning("invalid collation \"%s\"", qcollname);
+
+ appendPQExpBufferStr(q, ", locale = ");
+ appendStringLiteralAH(q, colliculocale ? colliculocale : "",
+ fout);
+ }
+ else
+ {
+ if (!collcollate || !collctype || colliculocale ||
+ strcmp(collcollate, collctype) != 0)
+ pg_log_warning("invalid collation \"%s\"", qcollname);
+
+ appendPQExpBufferStr(q, ", locale = ");
+ appendStringLiteralAH(q, collcollate ? collcollate : "", fout);
+ }
+ }
+ else if (collprovider[0] == 'c')
+ {
+ if (colliculocale || !collcollate || !collctype)
+ pg_log_warning("invalid collation \"%s\"", qcollname);
+
+ if (collcollate && collctype && strcmp(collcollate, collctype) == 0)
+ {
+ appendPQExpBufferStr(q, ", locale = ");
+ appendStringLiteralAH(q, collcollate ? collcollate : "", fout);
+ }
+ else
+ {
+ appendPQExpBufferStr(q, ", lc_collate = ");
+ appendStringLiteralAH(q, collcollate ? collcollate : "", fout);
+ appendPQExpBufferStr(q, ", lc_ctype = ");
+ appendStringLiteralAH(q, collctype ? collctype : "", fout);
+ }
+ }
+ else
+ pg_fatal("unrecognized collation provider: %s", collprovider);
+
+ /*
+ * For binary upgrade, carry over the collation version. For normal
+ * dump/restore, omit the version, so that it is computed upon restore.
+ */
+ if (dopt->binary_upgrade)
+ {
+ int i_collversion;
+
+ i_collversion = PQfnumber(res, "collversion");
+ if (!PQgetisnull(res, 0, i_collversion))
+ {
+ appendPQExpBufferStr(q, ", version = ");
+ appendStringLiteralAH(q,
+ PQgetvalue(res, 0, i_collversion),
+ fout);
+ }
+ }
+
+ appendPQExpBufferStr(q, ");\n");
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &collinfo->dobj,
+ "COLLATION", qcollname,
+ collinfo->dobj.namespace->dobj.name);
+
+ if (collinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, collinfo->dobj.catId, collinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = collinfo->dobj.name,
+ .namespace = collinfo->dobj.namespace->dobj.name,
+ .owner = collinfo->rolname,
+ .description = "COLLATION",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Collation Comments */
+ if (collinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "COLLATION", qcollname,
+ collinfo->dobj.namespace->dobj.name, collinfo->rolname,
+ collinfo->dobj.catId, 0, collinfo->dobj.dumpId);
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qcollname);
+}
+
+/*
+ * dumpConversion
+ * write out a single conversion definition
+ */
+static void
+dumpConversion(Archive *fout, const ConvInfo *convinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qconvname;
+ PGresult *res;
+ int i_conforencoding;
+ int i_contoencoding;
+ int i_conproc;
+ int i_condefault;
+ const char *conforencoding;
+ const char *contoencoding;
+ const char *conproc;
+ bool condefault;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ query = createPQExpBuffer();
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qconvname = pg_strdup(fmtId(convinfo->dobj.name));
+
+ /* Get conversion-specific details */
+ appendPQExpBuffer(query, "SELECT "
+ "pg_catalog.pg_encoding_to_char(conforencoding) AS conforencoding, "
+ "pg_catalog.pg_encoding_to_char(contoencoding) AS contoencoding, "
+ "conproc, condefault "
+ "FROM pg_catalog.pg_conversion c "
+ "WHERE c.oid = '%u'::pg_catalog.oid",
+ convinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ i_conforencoding = PQfnumber(res, "conforencoding");
+ i_contoencoding = PQfnumber(res, "contoencoding");
+ i_conproc = PQfnumber(res, "conproc");
+ i_condefault = PQfnumber(res, "condefault");
+
+ conforencoding = PQgetvalue(res, 0, i_conforencoding);
+ contoencoding = PQgetvalue(res, 0, i_contoencoding);
+ conproc = PQgetvalue(res, 0, i_conproc);
+ condefault = (PQgetvalue(res, 0, i_condefault)[0] == 't');
+
+ appendPQExpBuffer(delq, "DROP CONVERSION %s;\n",
+ fmtQualifiedDumpable(convinfo));
+
+ appendPQExpBuffer(q, "CREATE %sCONVERSION %s FOR ",
+ (condefault) ? "DEFAULT " : "",
+ fmtQualifiedDumpable(convinfo));
+ appendStringLiteralAH(q, conforencoding, fout);
+ appendPQExpBufferStr(q, " TO ");
+ appendStringLiteralAH(q, contoencoding, fout);
+ /* regproc output is already sufficiently quoted */
+ appendPQExpBuffer(q, " FROM %s;\n", conproc);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &convinfo->dobj,
+ "CONVERSION", qconvname,
+ convinfo->dobj.namespace->dobj.name);
+
+ if (convinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, convinfo->dobj.catId, convinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = convinfo->dobj.name,
+ .namespace = convinfo->dobj.namespace->dobj.name,
+ .owner = convinfo->rolname,
+ .description = "CONVERSION",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Conversion Comments */
+ if (convinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "CONVERSION", qconvname,
+ convinfo->dobj.namespace->dobj.name, convinfo->rolname,
+ convinfo->dobj.catId, 0, convinfo->dobj.dumpId);
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qconvname);
+}
+
+/*
+ * format_aggregate_signature: generate aggregate name and argument list
+ *
+ * The argument type names are qualified if needed. The aggregate name
+ * is never qualified.
+ */
+static char *
+format_aggregate_signature(const AggInfo *agginfo, Archive *fout, bool honor_quotes)
+{
+ PQExpBufferData buf;
+ int j;
+
+ initPQExpBuffer(&buf);
+ if (honor_quotes)
+ appendPQExpBufferStr(&buf, fmtId(agginfo->aggfn.dobj.name));
+ else
+ appendPQExpBufferStr(&buf, agginfo->aggfn.dobj.name);
+
+ if (agginfo->aggfn.nargs == 0)
+ appendPQExpBufferStr(&buf, "(*)");
+ else
+ {
+ appendPQExpBufferChar(&buf, '(');
+ for (j = 0; j < agginfo->aggfn.nargs; j++)
+ appendPQExpBuffer(&buf, "%s%s",
+ (j > 0) ? ", " : "",
+ getFormattedTypeName(fout,
+ agginfo->aggfn.argtypes[j],
+ zeroIsError));
+ appendPQExpBufferChar(&buf, ')');
+ }
+ return buf.data;
+}
+
+/*
+ * dumpAgg
+ * write out a single aggregate definition
+ */
+static void
+dumpAgg(Archive *fout, const AggInfo *agginfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer details;
+ char *aggsig; /* identity signature */
+ char *aggfullsig = NULL; /* full signature */
+ char *aggsig_tag;
+ PGresult *res;
+ int i_agginitval;
+ int i_aggminitval;
+ const char *aggtransfn;
+ const char *aggfinalfn;
+ const char *aggcombinefn;
+ const char *aggserialfn;
+ const char *aggdeserialfn;
+ const char *aggmtransfn;
+ const char *aggminvtransfn;
+ const char *aggmfinalfn;
+ bool aggfinalextra;
+ bool aggmfinalextra;
+ char aggfinalmodify;
+ char aggmfinalmodify;
+ const char *aggsortop;
+ char *aggsortconvop;
+ char aggkind;
+ const char *aggtranstype;
+ const char *aggtransspace;
+ const char *aggmtranstype;
+ const char *aggmtransspace;
+ const char *agginitval;
+ const char *aggminitval;
+ const char *proparallel;
+ char defaultfinalmodify;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ query = createPQExpBuffer();
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ details = createPQExpBuffer();
+
+ if (!fout->is_prepared[PREPQUERY_DUMPAGG])
+ {
+ /* Set up query for aggregate-specific details */
+ appendPQExpBufferStr(query,
+ "PREPARE dumpAgg(pg_catalog.oid) AS\n");
+
+ appendPQExpBufferStr(query,
+ "SELECT "
+ "aggtransfn,\n"
+ "aggfinalfn,\n"
+ "aggtranstype::pg_catalog.regtype,\n"
+ "agginitval,\n"
+ "aggsortop,\n"
+ "pg_catalog.pg_get_function_arguments(p.oid) AS funcargs,\n"
+ "pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs,\n");
+
+ if (fout->remoteVersion >= 90400)
+ appendPQExpBufferStr(query,
+ "aggkind,\n"
+ "aggmtransfn,\n"
+ "aggminvtransfn,\n"
+ "aggmfinalfn,\n"
+ "aggmtranstype::pg_catalog.regtype,\n"
+ "aggfinalextra,\n"
+ "aggmfinalextra,\n"
+ "aggtransspace,\n"
+ "aggmtransspace,\n"
+ "aggminitval,\n");
+ else
+ appendPQExpBufferStr(query,
+ "'n' AS aggkind,\n"
+ "'-' AS aggmtransfn,\n"
+ "'-' AS aggminvtransfn,\n"
+ "'-' AS aggmfinalfn,\n"
+ "0 AS aggmtranstype,\n"
+ "false AS aggfinalextra,\n"
+ "false AS aggmfinalextra,\n"
+ "0 AS aggtransspace,\n"
+ "0 AS aggmtransspace,\n"
+ "NULL AS aggminitval,\n");
+
+ if (fout->remoteVersion >= 90600)
+ appendPQExpBufferStr(query,
+ "aggcombinefn,\n"
+ "aggserialfn,\n"
+ "aggdeserialfn,\n"
+ "proparallel,\n");
+ else
+ appendPQExpBufferStr(query,
+ "'-' AS aggcombinefn,\n"
+ "'-' AS aggserialfn,\n"
+ "'-' AS aggdeserialfn,\n"
+ "'u' AS proparallel,\n");
+
+ if (fout->remoteVersion >= 110000)
+ appendPQExpBufferStr(query,
+ "aggfinalmodify,\n"
+ "aggmfinalmodify\n");
+ else
+ appendPQExpBufferStr(query,
+ "'0' AS aggfinalmodify,\n"
+ "'0' AS aggmfinalmodify\n");
+
+ appendPQExpBufferStr(query,
+ "FROM pg_catalog.pg_aggregate a, pg_catalog.pg_proc p "
+ "WHERE a.aggfnoid = p.oid "
+ "AND p.oid = $1");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_DUMPAGG] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE dumpAgg('%u')",
+ agginfo->aggfn.dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ i_agginitval = PQfnumber(res, "agginitval");
+ i_aggminitval = PQfnumber(res, "aggminitval");
+
+ aggtransfn = PQgetvalue(res, 0, PQfnumber(res, "aggtransfn"));
+ aggfinalfn = PQgetvalue(res, 0, PQfnumber(res, "aggfinalfn"));
+ aggcombinefn = PQgetvalue(res, 0, PQfnumber(res, "aggcombinefn"));
+ aggserialfn = PQgetvalue(res, 0, PQfnumber(res, "aggserialfn"));
+ aggdeserialfn = PQgetvalue(res, 0, PQfnumber(res, "aggdeserialfn"));
+ aggmtransfn = PQgetvalue(res, 0, PQfnumber(res, "aggmtransfn"));
+ aggminvtransfn = PQgetvalue(res, 0, PQfnumber(res, "aggminvtransfn"));
+ aggmfinalfn = PQgetvalue(res, 0, PQfnumber(res, "aggmfinalfn"));
+ aggfinalextra = (PQgetvalue(res, 0, PQfnumber(res, "aggfinalextra"))[0] == 't');
+ aggmfinalextra = (PQgetvalue(res, 0, PQfnumber(res, "aggmfinalextra"))[0] == 't');
+ aggfinalmodify = PQgetvalue(res, 0, PQfnumber(res, "aggfinalmodify"))[0];
+ aggmfinalmodify = PQgetvalue(res, 0, PQfnumber(res, "aggmfinalmodify"))[0];
+ aggsortop = PQgetvalue(res, 0, PQfnumber(res, "aggsortop"));
+ aggkind = PQgetvalue(res, 0, PQfnumber(res, "aggkind"))[0];
+ aggtranstype = PQgetvalue(res, 0, PQfnumber(res, "aggtranstype"));
+ aggtransspace = PQgetvalue(res, 0, PQfnumber(res, "aggtransspace"));
+ aggmtranstype = PQgetvalue(res, 0, PQfnumber(res, "aggmtranstype"));
+ aggmtransspace = PQgetvalue(res, 0, PQfnumber(res, "aggmtransspace"));
+ agginitval = PQgetvalue(res, 0, i_agginitval);
+ aggminitval = PQgetvalue(res, 0, i_aggminitval);
+ proparallel = PQgetvalue(res, 0, PQfnumber(res, "proparallel"));
+
+ {
+ char *funcargs;
+ char *funciargs;
+
+ funcargs = PQgetvalue(res, 0, PQfnumber(res, "funcargs"));
+ funciargs = PQgetvalue(res, 0, PQfnumber(res, "funciargs"));
+ aggfullsig = format_function_arguments(&agginfo->aggfn, funcargs, true);
+ aggsig = format_function_arguments(&agginfo->aggfn, funciargs, true);
+ }
+
+ aggsig_tag = format_aggregate_signature(agginfo, fout, false);
+
+ /* identify default modify flag for aggkind (must match DefineAggregate) */
+ defaultfinalmodify = (aggkind == AGGKIND_NORMAL) ? AGGMODIFY_READ_ONLY : AGGMODIFY_READ_WRITE;
+ /* replace omitted flags for old versions */
+ if (aggfinalmodify == '0')
+ aggfinalmodify = defaultfinalmodify;
+ if (aggmfinalmodify == '0')
+ aggmfinalmodify = defaultfinalmodify;
+
+ /* regproc and regtype output is already sufficiently quoted */
+ appendPQExpBuffer(details, " SFUNC = %s,\n STYPE = %s",
+ aggtransfn, aggtranstype);
+
+ if (strcmp(aggtransspace, "0") != 0)
+ {
+ appendPQExpBuffer(details, ",\n SSPACE = %s",
+ aggtransspace);
+ }
+
+ if (!PQgetisnull(res, 0, i_agginitval))
+ {
+ appendPQExpBufferStr(details, ",\n INITCOND = ");
+ appendStringLiteralAH(details, agginitval, fout);
+ }
+
+ if (strcmp(aggfinalfn, "-") != 0)
+ {
+ appendPQExpBuffer(details, ",\n FINALFUNC = %s",
+ aggfinalfn);
+ if (aggfinalextra)
+ appendPQExpBufferStr(details, ",\n FINALFUNC_EXTRA");
+ if (aggfinalmodify != defaultfinalmodify)
+ {
+ switch (aggfinalmodify)
+ {
+ case AGGMODIFY_READ_ONLY:
+ appendPQExpBufferStr(details, ",\n FINALFUNC_MODIFY = READ_ONLY");
+ break;
+ case AGGMODIFY_SHAREABLE:
+ appendPQExpBufferStr(details, ",\n FINALFUNC_MODIFY = SHAREABLE");
+ break;
+ case AGGMODIFY_READ_WRITE:
+ appendPQExpBufferStr(details, ",\n FINALFUNC_MODIFY = READ_WRITE");
+ break;
+ default:
+ pg_fatal("unrecognized aggfinalmodify value for aggregate \"%s\"",
+ agginfo->aggfn.dobj.name);
+ break;
+ }
+ }
+ }
+
+ if (strcmp(aggcombinefn, "-") != 0)
+ appendPQExpBuffer(details, ",\n COMBINEFUNC = %s", aggcombinefn);
+
+ if (strcmp(aggserialfn, "-") != 0)
+ appendPQExpBuffer(details, ",\n SERIALFUNC = %s", aggserialfn);
+
+ if (strcmp(aggdeserialfn, "-") != 0)
+ appendPQExpBuffer(details, ",\n DESERIALFUNC = %s", aggdeserialfn);
+
+ if (strcmp(aggmtransfn, "-") != 0)
+ {
+ appendPQExpBuffer(details, ",\n MSFUNC = %s,\n MINVFUNC = %s,\n MSTYPE = %s",
+ aggmtransfn,
+ aggminvtransfn,
+ aggmtranstype);
+ }
+
+ if (strcmp(aggmtransspace, "0") != 0)
+ {
+ appendPQExpBuffer(details, ",\n MSSPACE = %s",
+ aggmtransspace);
+ }
+
+ if (!PQgetisnull(res, 0, i_aggminitval))
+ {
+ appendPQExpBufferStr(details, ",\n MINITCOND = ");
+ appendStringLiteralAH(details, aggminitval, fout);
+ }
+
+ if (strcmp(aggmfinalfn, "-") != 0)
+ {
+ appendPQExpBuffer(details, ",\n MFINALFUNC = %s",
+ aggmfinalfn);
+ if (aggmfinalextra)
+ appendPQExpBufferStr(details, ",\n MFINALFUNC_EXTRA");
+ if (aggmfinalmodify != defaultfinalmodify)
+ {
+ switch (aggmfinalmodify)
+ {
+ case AGGMODIFY_READ_ONLY:
+ appendPQExpBufferStr(details, ",\n MFINALFUNC_MODIFY = READ_ONLY");
+ break;
+ case AGGMODIFY_SHAREABLE:
+ appendPQExpBufferStr(details, ",\n MFINALFUNC_MODIFY = SHAREABLE");
+ break;
+ case AGGMODIFY_READ_WRITE:
+ appendPQExpBufferStr(details, ",\n MFINALFUNC_MODIFY = READ_WRITE");
+ break;
+ default:
+ pg_fatal("unrecognized aggmfinalmodify value for aggregate \"%s\"",
+ agginfo->aggfn.dobj.name);
+ break;
+ }
+ }
+ }
+
+ aggsortconvop = getFormattedOperatorName(aggsortop);
+ if (aggsortconvop)
+ {
+ appendPQExpBuffer(details, ",\n SORTOP = %s",
+ aggsortconvop);
+ free(aggsortconvop);
+ }
+
+ if (aggkind == AGGKIND_HYPOTHETICAL)
+ appendPQExpBufferStr(details, ",\n HYPOTHETICAL");
+
+ if (proparallel[0] != PROPARALLEL_UNSAFE)
+ {
+ if (proparallel[0] == PROPARALLEL_SAFE)
+ appendPQExpBufferStr(details, ",\n PARALLEL = safe");
+ else if (proparallel[0] == PROPARALLEL_RESTRICTED)
+ appendPQExpBufferStr(details, ",\n PARALLEL = restricted");
+ else if (proparallel[0] != PROPARALLEL_UNSAFE)
+ pg_fatal("unrecognized proparallel value for function \"%s\"",
+ agginfo->aggfn.dobj.name);
+ }
+
+ appendPQExpBuffer(delq, "DROP AGGREGATE %s.%s;\n",
+ fmtId(agginfo->aggfn.dobj.namespace->dobj.name),
+ aggsig);
+
+ appendPQExpBuffer(q, "CREATE AGGREGATE %s.%s (\n%s\n);\n",
+ fmtId(agginfo->aggfn.dobj.namespace->dobj.name),
+ aggfullsig ? aggfullsig : aggsig, details->data);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &agginfo->aggfn.dobj,
+ "AGGREGATE", aggsig,
+ agginfo->aggfn.dobj.namespace->dobj.name);
+
+ if (agginfo->aggfn.dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, agginfo->aggfn.dobj.catId,
+ agginfo->aggfn.dobj.dumpId,
+ ARCHIVE_OPTS(.tag = aggsig_tag,
+ .namespace = agginfo->aggfn.dobj.namespace->dobj.name,
+ .owner = agginfo->aggfn.rolname,
+ .description = "AGGREGATE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Aggregate Comments */
+ if (agginfo->aggfn.dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "AGGREGATE", aggsig,
+ agginfo->aggfn.dobj.namespace->dobj.name,
+ agginfo->aggfn.rolname,
+ agginfo->aggfn.dobj.catId, 0, agginfo->aggfn.dobj.dumpId);
+
+ if (agginfo->aggfn.dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "AGGREGATE", aggsig,
+ agginfo->aggfn.dobj.namespace->dobj.name,
+ agginfo->aggfn.rolname,
+ agginfo->aggfn.dobj.catId, 0, agginfo->aggfn.dobj.dumpId);
+
+ /*
+ * Since there is no GRANT ON AGGREGATE syntax, we have to make the ACL
+ * command look like a function's GRANT; in particular this affects the
+ * syntax for zero-argument aggregates and ordered-set aggregates.
+ */
+ free(aggsig);
+
+ aggsig = format_function_signature(fout, &agginfo->aggfn, true);
+
+ if (agginfo->aggfn.dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, agginfo->aggfn.dobj.dumpId, InvalidDumpId,
+ "FUNCTION", aggsig, NULL,
+ agginfo->aggfn.dobj.namespace->dobj.name,
+ agginfo->aggfn.rolname, &agginfo->aggfn.dacl);
+
+ free(aggsig);
+ if (aggfullsig)
+ free(aggfullsig);
+ free(aggsig_tag);
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(details);
+}
+
+/*
+ * dumpTSParser
+ * write out a single text search parser
+ */
+static void
+dumpTSParser(Archive *fout, const TSParserInfo *prsinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qprsname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qprsname = pg_strdup(fmtId(prsinfo->dobj.name));
+
+ appendPQExpBuffer(q, "CREATE TEXT SEARCH PARSER %s (\n",
+ fmtQualifiedDumpable(prsinfo));
+
+ appendPQExpBuffer(q, " START = %s,\n",
+ convertTSFunction(fout, prsinfo->prsstart));
+ appendPQExpBuffer(q, " GETTOKEN = %s,\n",
+ convertTSFunction(fout, prsinfo->prstoken));
+ appendPQExpBuffer(q, " END = %s,\n",
+ convertTSFunction(fout, prsinfo->prsend));
+ if (prsinfo->prsheadline != InvalidOid)
+ appendPQExpBuffer(q, " HEADLINE = %s,\n",
+ convertTSFunction(fout, prsinfo->prsheadline));
+ appendPQExpBuffer(q, " LEXTYPES = %s );\n",
+ convertTSFunction(fout, prsinfo->prslextype));
+
+ appendPQExpBuffer(delq, "DROP TEXT SEARCH PARSER %s;\n",
+ fmtQualifiedDumpable(prsinfo));
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &prsinfo->dobj,
+ "TEXT SEARCH PARSER", qprsname,
+ prsinfo->dobj.namespace->dobj.name);
+
+ if (prsinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, prsinfo->dobj.catId, prsinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = prsinfo->dobj.name,
+ .namespace = prsinfo->dobj.namespace->dobj.name,
+ .description = "TEXT SEARCH PARSER",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Parser Comments */
+ if (prsinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TEXT SEARCH PARSER", qprsname,
+ prsinfo->dobj.namespace->dobj.name, "",
+ prsinfo->dobj.catId, 0, prsinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qprsname);
+}
+
+/*
+ * dumpTSDictionary
+ * write out a single text search dictionary
+ */
+static void
+dumpTSDictionary(Archive *fout, const TSDictInfo *dictinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer query;
+ char *qdictname;
+ PGresult *res;
+ char *nspname;
+ char *tmplname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ query = createPQExpBuffer();
+
+ qdictname = pg_strdup(fmtId(dictinfo->dobj.name));
+
+ /* Fetch name and namespace of the dictionary's template */
+ appendPQExpBuffer(query, "SELECT nspname, tmplname "
+ "FROM pg_ts_template p, pg_namespace n "
+ "WHERE p.oid = '%u' AND n.oid = tmplnamespace",
+ dictinfo->dicttemplate);
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+ nspname = PQgetvalue(res, 0, 0);
+ tmplname = PQgetvalue(res, 0, 1);
+
+ appendPQExpBuffer(q, "CREATE TEXT SEARCH DICTIONARY %s (\n",
+ fmtQualifiedDumpable(dictinfo));
+
+ appendPQExpBufferStr(q, " TEMPLATE = ");
+ appendPQExpBuffer(q, "%s.", fmtId(nspname));
+ appendPQExpBufferStr(q, fmtId(tmplname));
+
+ PQclear(res);
+
+ /* the dictinitoption can be dumped straight into the command */
+ if (dictinfo->dictinitoption)
+ appendPQExpBuffer(q, ",\n %s", dictinfo->dictinitoption);
+
+ appendPQExpBufferStr(q, " );\n");
+
+ appendPQExpBuffer(delq, "DROP TEXT SEARCH DICTIONARY %s;\n",
+ fmtQualifiedDumpable(dictinfo));
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &dictinfo->dobj,
+ "TEXT SEARCH DICTIONARY", qdictname,
+ dictinfo->dobj.namespace->dobj.name);
+
+ if (dictinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, dictinfo->dobj.catId, dictinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = dictinfo->dobj.name,
+ .namespace = dictinfo->dobj.namespace->dobj.name,
+ .owner = dictinfo->rolname,
+ .description = "TEXT SEARCH DICTIONARY",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Dictionary Comments */
+ if (dictinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TEXT SEARCH DICTIONARY", qdictname,
+ dictinfo->dobj.namespace->dobj.name, dictinfo->rolname,
+ dictinfo->dobj.catId, 0, dictinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qdictname);
+}
+
+/*
+ * dumpTSTemplate
+ * write out a single text search template
+ */
+static void
+dumpTSTemplate(Archive *fout, const TSTemplateInfo *tmplinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qtmplname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qtmplname = pg_strdup(fmtId(tmplinfo->dobj.name));
+
+ appendPQExpBuffer(q, "CREATE TEXT SEARCH TEMPLATE %s (\n",
+ fmtQualifiedDumpable(tmplinfo));
+
+ if (tmplinfo->tmplinit != InvalidOid)
+ appendPQExpBuffer(q, " INIT = %s,\n",
+ convertTSFunction(fout, tmplinfo->tmplinit));
+ appendPQExpBuffer(q, " LEXIZE = %s );\n",
+ convertTSFunction(fout, tmplinfo->tmpllexize));
+
+ appendPQExpBuffer(delq, "DROP TEXT SEARCH TEMPLATE %s;\n",
+ fmtQualifiedDumpable(tmplinfo));
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &tmplinfo->dobj,
+ "TEXT SEARCH TEMPLATE", qtmplname,
+ tmplinfo->dobj.namespace->dobj.name);
+
+ if (tmplinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tmplinfo->dobj.catId, tmplinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tmplinfo->dobj.name,
+ .namespace = tmplinfo->dobj.namespace->dobj.name,
+ .description = "TEXT SEARCH TEMPLATE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Template Comments */
+ if (tmplinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TEXT SEARCH TEMPLATE", qtmplname,
+ tmplinfo->dobj.namespace->dobj.name, "",
+ tmplinfo->dobj.catId, 0, tmplinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qtmplname);
+}
+
+/*
+ * dumpTSConfig
+ * write out a single text search configuration
+ */
+static void
+dumpTSConfig(Archive *fout, const TSConfigInfo *cfginfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer query;
+ char *qcfgname;
+ PGresult *res;
+ char *nspname;
+ char *prsname;
+ int ntups,
+ i;
+ int i_tokenname;
+ int i_dictname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ query = createPQExpBuffer();
+
+ qcfgname = pg_strdup(fmtId(cfginfo->dobj.name));
+
+ /* Fetch name and namespace of the config's parser */
+ appendPQExpBuffer(query, "SELECT nspname, prsname "
+ "FROM pg_ts_parser p, pg_namespace n "
+ "WHERE p.oid = '%u' AND n.oid = prsnamespace",
+ cfginfo->cfgparser);
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+ nspname = PQgetvalue(res, 0, 0);
+ prsname = PQgetvalue(res, 0, 1);
+
+ appendPQExpBuffer(q, "CREATE TEXT SEARCH CONFIGURATION %s (\n",
+ fmtQualifiedDumpable(cfginfo));
+
+ appendPQExpBuffer(q, " PARSER = %s.", fmtId(nspname));
+ appendPQExpBuffer(q, "%s );\n", fmtId(prsname));
+
+ PQclear(res);
+
+ resetPQExpBuffer(query);
+ appendPQExpBuffer(query,
+ "SELECT\n"
+ " ( SELECT alias FROM pg_catalog.ts_token_type('%u'::pg_catalog.oid) AS t\n"
+ " WHERE t.tokid = m.maptokentype ) AS tokenname,\n"
+ " m.mapdict::pg_catalog.regdictionary AS dictname\n"
+ "FROM pg_catalog.pg_ts_config_map AS m\n"
+ "WHERE m.mapcfg = '%u'\n"
+ "ORDER BY m.mapcfg, m.maptokentype, m.mapseqno",
+ cfginfo->cfgparser, cfginfo->dobj.catId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+ ntups = PQntuples(res);
+
+ i_tokenname = PQfnumber(res, "tokenname");
+ i_dictname = PQfnumber(res, "dictname");
+
+ for (i = 0; i < ntups; i++)
+ {
+ char *tokenname = PQgetvalue(res, i, i_tokenname);
+ char *dictname = PQgetvalue(res, i, i_dictname);
+
+ if (i == 0 ||
+ strcmp(tokenname, PQgetvalue(res, i - 1, i_tokenname)) != 0)
+ {
+ /* starting a new token type, so start a new command */
+ if (i > 0)
+ appendPQExpBufferStr(q, ";\n");
+ appendPQExpBuffer(q, "\nALTER TEXT SEARCH CONFIGURATION %s\n",
+ fmtQualifiedDumpable(cfginfo));
+ /* tokenname needs quoting, dictname does NOT */
+ appendPQExpBuffer(q, " ADD MAPPING FOR %s WITH %s",
+ fmtId(tokenname), dictname);
+ }
+ else
+ appendPQExpBuffer(q, ", %s", dictname);
+ }
+
+ if (ntups > 0)
+ appendPQExpBufferStr(q, ";\n");
+
+ PQclear(res);
+
+ appendPQExpBuffer(delq, "DROP TEXT SEARCH CONFIGURATION %s;\n",
+ fmtQualifiedDumpable(cfginfo));
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &cfginfo->dobj,
+ "TEXT SEARCH CONFIGURATION", qcfgname,
+ cfginfo->dobj.namespace->dobj.name);
+
+ if (cfginfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, cfginfo->dobj.catId, cfginfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = cfginfo->dobj.name,
+ .namespace = cfginfo->dobj.namespace->dobj.name,
+ .owner = cfginfo->rolname,
+ .description = "TEXT SEARCH CONFIGURATION",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Configuration Comments */
+ if (cfginfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TEXT SEARCH CONFIGURATION", qcfgname,
+ cfginfo->dobj.namespace->dobj.name, cfginfo->rolname,
+ cfginfo->dobj.catId, 0, cfginfo->dobj.dumpId);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qcfgname);
+}
+
+/*
+ * dumpForeignDataWrapper
+ * write out a single foreign-data wrapper definition
+ */
+static void
+dumpForeignDataWrapper(Archive *fout, const FdwInfo *fdwinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qfdwname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qfdwname = pg_strdup(fmtId(fdwinfo->dobj.name));
+
+ appendPQExpBuffer(q, "CREATE FOREIGN DATA WRAPPER %s",
+ qfdwname);
+
+ if (strcmp(fdwinfo->fdwhandler, "-") != 0)
+ appendPQExpBuffer(q, " HANDLER %s", fdwinfo->fdwhandler);
+
+ if (strcmp(fdwinfo->fdwvalidator, "-") != 0)
+ appendPQExpBuffer(q, " VALIDATOR %s", fdwinfo->fdwvalidator);
+
+ if (strlen(fdwinfo->fdwoptions) > 0)
+ appendPQExpBuffer(q, " OPTIONS (\n %s\n)", fdwinfo->fdwoptions);
+
+ appendPQExpBufferStr(q, ";\n");
+
+ appendPQExpBuffer(delq, "DROP FOREIGN DATA WRAPPER %s;\n",
+ qfdwname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &fdwinfo->dobj,
+ "FOREIGN DATA WRAPPER", qfdwname,
+ NULL);
+
+ if (fdwinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, fdwinfo->dobj.catId, fdwinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = fdwinfo->dobj.name,
+ .owner = fdwinfo->rolname,
+ .description = "FOREIGN DATA WRAPPER",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Foreign Data Wrapper Comments */
+ if (fdwinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "FOREIGN DATA WRAPPER", qfdwname,
+ NULL, fdwinfo->rolname,
+ fdwinfo->dobj.catId, 0, fdwinfo->dobj.dumpId);
+
+ /* Handle the ACL */
+ if (fdwinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, fdwinfo->dobj.dumpId, InvalidDumpId,
+ "FOREIGN DATA WRAPPER", qfdwname, NULL,
+ NULL, fdwinfo->rolname, &fdwinfo->dacl);
+
+ free(qfdwname);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+}
+
+/*
+ * dumpForeignServer
+ * write out a foreign server definition
+ */
+static void
+dumpForeignServer(Archive *fout, const ForeignServerInfo *srvinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer query;
+ PGresult *res;
+ char *qsrvname;
+ char *fdwname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ query = createPQExpBuffer();
+
+ qsrvname = pg_strdup(fmtId(srvinfo->dobj.name));
+
+ /* look up the foreign-data wrapper */
+ appendPQExpBuffer(query, "SELECT fdwname "
+ "FROM pg_foreign_data_wrapper w "
+ "WHERE w.oid = '%u'",
+ srvinfo->srvfdw);
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+ fdwname = PQgetvalue(res, 0, 0);
+
+ appendPQExpBuffer(q, "CREATE SERVER %s", qsrvname);
+ if (srvinfo->srvtype && strlen(srvinfo->srvtype) > 0)
+ {
+ appendPQExpBufferStr(q, " TYPE ");
+ appendStringLiteralAH(q, srvinfo->srvtype, fout);
+ }
+ if (srvinfo->srvversion && strlen(srvinfo->srvversion) > 0)
+ {
+ appendPQExpBufferStr(q, " VERSION ");
+ appendStringLiteralAH(q, srvinfo->srvversion, fout);
+ }
+
+ appendPQExpBufferStr(q, " FOREIGN DATA WRAPPER ");
+ appendPQExpBufferStr(q, fmtId(fdwname));
+
+ if (srvinfo->srvoptions && strlen(srvinfo->srvoptions) > 0)
+ appendPQExpBuffer(q, " OPTIONS (\n %s\n)", srvinfo->srvoptions);
+
+ appendPQExpBufferStr(q, ";\n");
+
+ appendPQExpBuffer(delq, "DROP SERVER %s;\n",
+ qsrvname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &srvinfo->dobj,
+ "SERVER", qsrvname, NULL);
+
+ if (srvinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, srvinfo->dobj.catId, srvinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = srvinfo->dobj.name,
+ .owner = srvinfo->rolname,
+ .description = "SERVER",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Foreign Server Comments */
+ if (srvinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "SERVER", qsrvname,
+ NULL, srvinfo->rolname,
+ srvinfo->dobj.catId, 0, srvinfo->dobj.dumpId);
+
+ /* Handle the ACL */
+ if (srvinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, srvinfo->dobj.dumpId, InvalidDumpId,
+ "FOREIGN SERVER", qsrvname, NULL,
+ NULL, srvinfo->rolname, &srvinfo->dacl);
+
+ /* Dump user mappings */
+ if (srvinfo->dobj.dump & DUMP_COMPONENT_USERMAP)
+ dumpUserMappings(fout,
+ srvinfo->dobj.name, NULL,
+ srvinfo->rolname,
+ srvinfo->dobj.catId, srvinfo->dobj.dumpId);
+
+ PQclear(res);
+
+ free(qsrvname);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpUserMappings
+ *
+ * This routine is used to dump any user mappings associated with the
+ * server handed to this routine. Should be called after ArchiveEntry()
+ * for the server.
+ */
+static void
+dumpUserMappings(Archive *fout,
+ const char *servername, const char *namespace,
+ const char *owner,
+ CatalogId catalogId, DumpId dumpId)
+{
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer query;
+ PQExpBuffer tag;
+ PGresult *res;
+ int ntups;
+ int i_usename;
+ int i_umoptions;
+ int i;
+
+ q = createPQExpBuffer();
+ tag = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ query = createPQExpBuffer();
+
+ /*
+ * We read from the publicly accessible view pg_user_mappings, so as not
+ * to fail if run by a non-superuser. Note that the view will show
+ * umoptions as null if the user hasn't got privileges for the associated
+ * server; this means that pg_dump will dump such a mapping, but with no
+ * OPTIONS clause. A possible alternative is to skip such mappings
+ * altogether, but it's not clear that that's an improvement.
+ */
+ appendPQExpBuffer(query,
+ "SELECT usename, "
+ "array_to_string(ARRAY("
+ "SELECT quote_ident(option_name) || ' ' || "
+ "quote_literal(option_value) "
+ "FROM pg_options_to_table(umoptions) "
+ "ORDER BY option_name"
+ "), E',\n ') AS umoptions "
+ "FROM pg_user_mappings "
+ "WHERE srvid = '%u' "
+ "ORDER BY usename",
+ catalogId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ i_usename = PQfnumber(res, "usename");
+ i_umoptions = PQfnumber(res, "umoptions");
+
+ for (i = 0; i < ntups; i++)
+ {
+ char *usename;
+ char *umoptions;
+
+ usename = PQgetvalue(res, i, i_usename);
+ umoptions = PQgetvalue(res, i, i_umoptions);
+
+ resetPQExpBuffer(q);
+ appendPQExpBuffer(q, "CREATE USER MAPPING FOR %s", fmtId(usename));
+ appendPQExpBuffer(q, " SERVER %s", fmtId(servername));
+
+ if (umoptions && strlen(umoptions) > 0)
+ appendPQExpBuffer(q, " OPTIONS (\n %s\n)", umoptions);
+
+ appendPQExpBufferStr(q, ";\n");
+
+ resetPQExpBuffer(delq);
+ appendPQExpBuffer(delq, "DROP USER MAPPING FOR %s", fmtId(usename));
+ appendPQExpBuffer(delq, " SERVER %s;\n", fmtId(servername));
+
+ resetPQExpBuffer(tag);
+ appendPQExpBuffer(tag, "USER MAPPING %s SERVER %s",
+ usename, servername);
+
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = tag->data,
+ .namespace = namespace,
+ .owner = owner,
+ .description = "USER MAPPING",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(tag);
+ destroyPQExpBuffer(q);
+}
+
+/*
+ * Write out default privileges information
+ */
+static void
+dumpDefaultACL(Archive *fout, const DefaultACLInfo *daclinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer tag;
+ const char *type;
+
+ /* Do nothing in data-only dump, or if we're skipping ACLs */
+ if (dopt->dataOnly || dopt->aclsSkip)
+ return;
+
+ q = createPQExpBuffer();
+ tag = createPQExpBuffer();
+
+ switch (daclinfo->defaclobjtype)
+ {
+ case DEFACLOBJ_RELATION:
+ type = "TABLES";
+ break;
+ case DEFACLOBJ_SEQUENCE:
+ type = "SEQUENCES";
+ break;
+ case DEFACLOBJ_FUNCTION:
+ type = "FUNCTIONS";
+ break;
+ case DEFACLOBJ_TYPE:
+ type = "TYPES";
+ break;
+ case DEFACLOBJ_NAMESPACE:
+ type = "SCHEMAS";
+ break;
+ default:
+ /* shouldn't get here */
+ pg_fatal("unrecognized object type in default privileges: %d",
+ (int) daclinfo->defaclobjtype);
+ type = ""; /* keep compiler quiet */
+ }
+
+ appendPQExpBuffer(tag, "DEFAULT PRIVILEGES FOR %s", type);
+
+ /* build the actual command(s) for this tuple */
+ if (!buildDefaultACLCommands(type,
+ daclinfo->dobj.namespace != NULL ?
+ daclinfo->dobj.namespace->dobj.name : NULL,
+ daclinfo->dacl.acl,
+ daclinfo->dacl.acldefault,
+ daclinfo->defaclrole,
+ fout->remoteVersion,
+ q))
+ pg_fatal("could not parse default ACL list (%s)",
+ daclinfo->dacl.acl);
+
+ if (daclinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ ArchiveEntry(fout, daclinfo->dobj.catId, daclinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag->data,
+ .namespace = daclinfo->dobj.namespace ?
+ daclinfo->dobj.namespace->dobj.name : NULL,
+ .owner = daclinfo->defaclrole,
+ .description = "DEFAULT ACL",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data));
+
+ destroyPQExpBuffer(tag);
+ destroyPQExpBuffer(q);
+}
+
+/*----------
+ * Write out grant/revoke information
+ *
+ * 'objDumpId' is the dump ID of the underlying object.
+ * 'altDumpId' can be a second dumpId that the ACL entry must also depend on,
+ * or InvalidDumpId if there is no need for a second dependency.
+ * 'type' must be one of
+ * TABLE, SEQUENCE, FUNCTION, LANGUAGE, SCHEMA, DATABASE, TABLESPACE,
+ * FOREIGN DATA WRAPPER, SERVER, or LARGE OBJECT.
+ * 'name' is the formatted name of the object. Must be quoted etc. already.
+ * 'subname' is the formatted name of the sub-object, if any. Must be quoted.
+ * (Currently we assume that subname is only provided for table columns.)
+ * 'nspname' is the namespace the object is in (NULL if none).
+ * 'owner' is the owner, NULL if there is no owner (for languages).
+ * 'dacl' is the DumpableAcl struct fpr the object.
+ *
+ * Returns the dump ID assigned to the ACL TocEntry, or InvalidDumpId if
+ * no ACL entry was created.
+ *----------
+ */
+static DumpId
+dumpACL(Archive *fout, DumpId objDumpId, DumpId altDumpId,
+ const char *type, const char *name, const char *subname,
+ const char *nspname, const char *owner,
+ const DumpableAcl *dacl)
+{
+ DumpId aclDumpId = InvalidDumpId;
+ DumpOptions *dopt = fout->dopt;
+ const char *acls = dacl->acl;
+ const char *acldefault = dacl->acldefault;
+ char privtype = dacl->privtype;
+ const char *initprivs = dacl->initprivs;
+ const char *baseacls;
+ PQExpBuffer sql;
+
+ /* Do nothing if ACL dump is not enabled */
+ if (dopt->aclsSkip)
+ return InvalidDumpId;
+
+ /* --data-only skips ACLs *except* BLOB ACLs */
+ if (dopt->dataOnly && strcmp(type, "LARGE OBJECT") != 0)
+ return InvalidDumpId;
+
+ sql = createPQExpBuffer();
+
+ /*
+ * In binary upgrade mode, we don't run an extension's script but instead
+ * dump out the objects independently and then recreate them. To preserve
+ * any initial privileges which were set on extension objects, we need to
+ * compute the set of GRANT and REVOKE commands necessary to get from the
+ * default privileges of an object to its initial privileges as recorded
+ * in pg_init_privs.
+ *
+ * At restore time, we apply these commands after having called
+ * binary_upgrade_set_record_init_privs(true). That tells the backend to
+ * copy the results into pg_init_privs. This is how we preserve the
+ * contents of that catalog across binary upgrades.
+ */
+ if (dopt->binary_upgrade && privtype == 'e' &&
+ initprivs && *initprivs != '\0')
+ {
+ appendPQExpBufferStr(sql, "SELECT pg_catalog.binary_upgrade_set_record_init_privs(true);\n");
+ if (!buildACLCommands(name, subname, nspname, type,
+ initprivs, acldefault, owner,
+ "", fout->remoteVersion, sql))
+ pg_fatal("could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)",
+ initprivs, acldefault, name, type);
+ appendPQExpBufferStr(sql, "SELECT pg_catalog.binary_upgrade_set_record_init_privs(false);\n");
+ }
+
+ /*
+ * Now figure the GRANT and REVOKE commands needed to get to the object's
+ * actual current ACL, starting from the initprivs if given, else from the
+ * object-type-specific default. Also, while buildACLCommands will assume
+ * that a NULL/empty acls string means it needn't do anything, what that
+ * actually represents is the object-type-specific default; so we need to
+ * substitute the acldefault string to get the right results in that case.
+ */
+ if (initprivs && *initprivs != '\0')
+ {
+ baseacls = initprivs;
+ if (acls == NULL || *acls == '\0')
+ acls = acldefault;
+ }
+ else
+ baseacls = acldefault;
+
+ if (!buildACLCommands(name, subname, nspname, type,
+ acls, baseacls, owner,
+ "", fout->remoteVersion, sql))
+ pg_fatal("could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)",
+ acls, baseacls, name, type);
+
+ if (sql->len > 0)
+ {
+ PQExpBuffer tag = createPQExpBuffer();
+ DumpId aclDeps[2];
+ int nDeps = 0;
+
+ if (subname)
+ appendPQExpBuffer(tag, "COLUMN %s.%s", name, subname);
+ else
+ appendPQExpBuffer(tag, "%s %s", type, name);
+
+ aclDeps[nDeps++] = objDumpId;
+ if (altDumpId != InvalidDumpId)
+ aclDeps[nDeps++] = altDumpId;
+
+ aclDumpId = createDumpId();
+
+ ArchiveEntry(fout, nilCatalogId, aclDumpId,
+ ARCHIVE_OPTS(.tag = tag->data,
+ .namespace = nspname,
+ .owner = owner,
+ .description = "ACL",
+ .section = SECTION_NONE,
+ .createStmt = sql->data,
+ .deps = aclDeps,
+ .nDeps = nDeps));
+
+ destroyPQExpBuffer(tag);
+ }
+
+ destroyPQExpBuffer(sql);
+
+ return aclDumpId;
+}
+
+/*
+ * dumpSecLabel
+ *
+ * This routine is used to dump any security labels associated with the
+ * object handed to this routine. The routine takes the object type
+ * and object name (ready to print, except for schema decoration), plus
+ * the namespace and owner of the object (for labeling the ArchiveEntry),
+ * plus catalog ID and subid which are the lookup key for pg_seclabel,
+ * plus the dump ID for the object (for setting a dependency).
+ * If a matching pg_seclabel entry is found, it is dumped.
+ *
+ * Note: although this routine takes a dumpId for dependency purposes,
+ * that purpose is just to mark the dependency in the emitted dump file
+ * for possible future use by pg_restore. We do NOT use it for determining
+ * ordering of the label in the dump file, because this routine is called
+ * after dependency sorting occurs. This routine should be called just after
+ * calling ArchiveEntry() for the specified object.
+ */
+static void
+dumpSecLabel(Archive *fout, const char *type, const char *name,
+ const char *namespace, const char *owner,
+ CatalogId catalogId, int subid, DumpId dumpId)
+{
+ DumpOptions *dopt = fout->dopt;
+ SecLabelItem *labels;
+ int nlabels;
+ int i;
+ PQExpBuffer query;
+
+ /* do nothing, if --no-security-labels is supplied */
+ if (dopt->no_security_labels)
+ return;
+
+ /* Security labels are schema not data ... except blob labels are data */
+ if (strcmp(type, "LARGE OBJECT") != 0)
+ {
+ if (dopt->dataOnly)
+ return;
+ }
+ else
+ {
+ /* We do dump blob security labels in binary-upgrade mode */
+ if (dopt->schemaOnly && !dopt->binary_upgrade)
+ return;
+ }
+
+ /* Search for security labels associated with catalogId, using table */
+ nlabels = findSecLabels(catalogId.tableoid, catalogId.oid, &labels);
+
+ query = createPQExpBuffer();
+
+ for (i = 0; i < nlabels; i++)
+ {
+ /*
+ * Ignore label entries for which the subid doesn't match.
+ */
+ if (labels[i].objsubid != subid)
+ continue;
+
+ appendPQExpBuffer(query,
+ "SECURITY LABEL FOR %s ON %s ",
+ fmtId(labels[i].provider), type);
+ if (namespace && *namespace)
+ appendPQExpBuffer(query, "%s.", fmtId(namespace));
+ appendPQExpBuffer(query, "%s IS ", name);
+ appendStringLiteralAH(query, labels[i].label, fout);
+ appendPQExpBufferStr(query, ";\n");
+ }
+
+ if (query->len > 0)
+ {
+ PQExpBuffer tag = createPQExpBuffer();
+
+ appendPQExpBuffer(tag, "%s %s", type, name);
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = tag->data,
+ .namespace = namespace,
+ .owner = owner,
+ .description = "SECURITY LABEL",
+ .section = SECTION_NONE,
+ .createStmt = query->data,
+ .deps = &dumpId,
+ .nDeps = 1));
+ destroyPQExpBuffer(tag);
+ }
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpTableSecLabel
+ *
+ * As above, but dump security label for both the specified table (or view)
+ * and its columns.
+ */
+static void
+dumpTableSecLabel(Archive *fout, const TableInfo *tbinfo, const char *reltypename)
+{
+ DumpOptions *dopt = fout->dopt;
+ SecLabelItem *labels;
+ int nlabels;
+ int i;
+ PQExpBuffer query;
+ PQExpBuffer target;
+
+ /* do nothing, if --no-security-labels is supplied */
+ if (dopt->no_security_labels)
+ return;
+
+ /* SecLabel are SCHEMA not data */
+ if (dopt->dataOnly)
+ return;
+
+ /* Search for comments associated with relation, using table */
+ nlabels = findSecLabels(tbinfo->dobj.catId.tableoid,
+ tbinfo->dobj.catId.oid,
+ &labels);
+
+ /* If security labels exist, build SECURITY LABEL statements */
+ if (nlabels <= 0)
+ return;
+
+ query = createPQExpBuffer();
+ target = createPQExpBuffer();
+
+ for (i = 0; i < nlabels; i++)
+ {
+ const char *colname;
+ const char *provider = labels[i].provider;
+ const char *label = labels[i].label;
+ int objsubid = labels[i].objsubid;
+
+ resetPQExpBuffer(target);
+ if (objsubid == 0)
+ {
+ appendPQExpBuffer(target, "%s %s", reltypename,
+ fmtQualifiedDumpable(tbinfo));
+ }
+ else
+ {
+ colname = getAttrName(objsubid, tbinfo);
+ /* first fmtXXX result must be consumed before calling again */
+ appendPQExpBuffer(target, "COLUMN %s",
+ fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(target, ".%s", fmtId(colname));
+ }
+ appendPQExpBuffer(query, "SECURITY LABEL FOR %s ON %s IS ",
+ fmtId(provider), target->data);
+ appendStringLiteralAH(query, label, fout);
+ appendPQExpBufferStr(query, ";\n");
+ }
+ if (query->len > 0)
+ {
+ resetPQExpBuffer(target);
+ appendPQExpBuffer(target, "%s %s", reltypename,
+ fmtId(tbinfo->dobj.name));
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = target->data,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "SECURITY LABEL",
+ .section = SECTION_NONE,
+ .createStmt = query->data,
+ .deps = &(tbinfo->dobj.dumpId),
+ .nDeps = 1));
+ }
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(target);
+}
+
+/*
+ * findSecLabels
+ *
+ * Find the security label(s), if any, associated with the given object.
+ * All the objsubid values associated with the given classoid/objoid are
+ * found with one search.
+ */
+static int
+findSecLabels(Oid classoid, Oid objoid, SecLabelItem **items)
+{
+ SecLabelItem *middle = NULL;
+ SecLabelItem *low;
+ SecLabelItem *high;
+ int nmatch;
+
+ if (nseclabels <= 0) /* no labels, so no match is possible */
+ {
+ *items = NULL;
+ return 0;
+ }
+
+ /*
+ * Do binary search to find some item matching the object.
+ */
+ low = &seclabels[0];
+ high = &seclabels[nseclabels - 1];
+ while (low <= high)
+ {
+ middle = low + (high - low) / 2;
+
+ if (classoid < middle->classoid)
+ high = middle - 1;
+ else if (classoid > middle->classoid)
+ low = middle + 1;
+ else if (objoid < middle->objoid)
+ high = middle - 1;
+ else if (objoid > middle->objoid)
+ low = middle + 1;
+ else
+ break; /* found a match */
+ }
+
+ if (low > high) /* no matches */
+ {
+ *items = NULL;
+ return 0;
+ }
+
+ /*
+ * Now determine how many items match the object. The search loop
+ * invariant still holds: only items between low and high inclusive could
+ * match.
+ */
+ nmatch = 1;
+ while (middle > low)
+ {
+ if (classoid != middle[-1].classoid ||
+ objoid != middle[-1].objoid)
+ break;
+ middle--;
+ nmatch++;
+ }
+
+ *items = middle;
+
+ middle += nmatch;
+ while (middle <= high)
+ {
+ if (classoid != middle->classoid ||
+ objoid != middle->objoid)
+ break;
+ middle++;
+ nmatch++;
+ }
+
+ return nmatch;
+}
+
+/*
+ * collectSecLabels
+ *
+ * Construct a table of all security labels available for database objects;
+ * also set the has-seclabel component flag for each relevant object.
+ *
+ * The table is sorted by classoid/objid/objsubid for speed in lookup.
+ */
+static void
+collectSecLabels(Archive *fout)
+{
+ PGresult *res;
+ PQExpBuffer query;
+ int i_label;
+ int i_provider;
+ int i_classoid;
+ int i_objoid;
+ int i_objsubid;
+ int ntups;
+ int i;
+ DumpableObject *dobj;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query,
+ "SELECT label, provider, classoid, objoid, objsubid "
+ "FROM pg_catalog.pg_seclabel "
+ "ORDER BY classoid, objoid, objsubid");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ /* Construct lookup table containing OIDs in numeric form */
+ i_label = PQfnumber(res, "label");
+ i_provider = PQfnumber(res, "provider");
+ i_classoid = PQfnumber(res, "classoid");
+ i_objoid = PQfnumber(res, "objoid");
+ i_objsubid = PQfnumber(res, "objsubid");
+
+ ntups = PQntuples(res);
+
+ seclabels = (SecLabelItem *) pg_malloc(ntups * sizeof(SecLabelItem));
+ nseclabels = 0;
+ dobj = NULL;
+
+ for (i = 0; i < ntups; i++)
+ {
+ CatalogId objId;
+ int subid;
+
+ objId.tableoid = atooid(PQgetvalue(res, i, i_classoid));
+ objId.oid = atooid(PQgetvalue(res, i, i_objoid));
+ subid = atoi(PQgetvalue(res, i, i_objsubid));
+
+ /* We needn't remember labels that don't match any dumpable object */
+ if (dobj == NULL ||
+ dobj->catId.tableoid != objId.tableoid ||
+ dobj->catId.oid != objId.oid)
+ dobj = findObjectByCatalogId(objId);
+ if (dobj == NULL)
+ continue;
+
+ /*
+ * Labels on columns of composite types are linked to the type's
+ * pg_class entry, but we need to set the DUMP_COMPONENT_SECLABEL flag
+ * in the type's own DumpableObject.
+ */
+ if (subid != 0 && dobj->objType == DO_TABLE &&
+ ((TableInfo *) dobj)->relkind == RELKIND_COMPOSITE_TYPE)
+ {
+ TypeInfo *cTypeInfo;
+
+ cTypeInfo = findTypeByOid(((TableInfo *) dobj)->reltype);
+ if (cTypeInfo)
+ cTypeInfo->dobj.components |= DUMP_COMPONENT_SECLABEL;
+ }
+ else
+ dobj->components |= DUMP_COMPONENT_SECLABEL;
+
+ seclabels[nseclabels].label = pg_strdup(PQgetvalue(res, i, i_label));
+ seclabels[nseclabels].provider = pg_strdup(PQgetvalue(res, i, i_provider));
+ seclabels[nseclabels].classoid = objId.tableoid;
+ seclabels[nseclabels].objoid = objId.oid;
+ seclabels[nseclabels].objsubid = subid;
+ nseclabels++;
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpTable
+ * write out to fout the declarations (not data) of a user-defined table
+ */
+static void
+dumpTable(Archive *fout, const TableInfo *tbinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ DumpId tableAclDumpId = InvalidDumpId;
+ char *namecopy;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ {
+ if (tbinfo->relkind == RELKIND_SEQUENCE)
+ dumpSequence(fout, tbinfo);
+ else
+ dumpTableSchema(fout, tbinfo);
+ }
+
+ /* Handle the ACL here */
+ namecopy = pg_strdup(fmtId(tbinfo->dobj.name));
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ {
+ const char *objtype =
+ (tbinfo->relkind == RELKIND_SEQUENCE) ? "SEQUENCE" : "TABLE";
+
+ tableAclDumpId =
+ dumpACL(fout, tbinfo->dobj.dumpId, InvalidDumpId,
+ objtype, namecopy, NULL,
+ tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
+ &tbinfo->dacl);
+ }
+
+ /*
+ * Handle column ACLs, if any. Note: we pull these with a separate query
+ * rather than trying to fetch them during getTableAttrs, so that we won't
+ * miss ACLs on system columns. Doing it this way also allows us to dump
+ * ACLs for catalogs that we didn't mark "interesting" back in getTables.
+ */
+ if ((tbinfo->dobj.dump & DUMP_COMPONENT_ACL) && tbinfo->hascolumnACLs)
+ {
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ int i;
+
+ if (!fout->is_prepared[PREPQUERY_GETCOLUMNACLS])
+ {
+ /* Set up query for column ACLs */
+ appendPQExpBufferStr(query,
+ "PREPARE getColumnACLs(pg_catalog.oid) AS\n");
+
+ if (fout->remoteVersion >= 90600)
+ {
+ /*
+ * In principle we should call acldefault('c', relowner) to
+ * get the default ACL for a column. However, we don't
+ * currently store the numeric OID of the relowner in
+ * TableInfo. We could convert the owner name using regrole,
+ * but that creates a risk of failure due to concurrent role
+ * renames. Given that the default ACL for columns is empty
+ * and is likely to stay that way, it's not worth extra cycles
+ * and risk to avoid hard-wiring that knowledge here.
+ */
+ appendPQExpBufferStr(query,
+ "SELECT at.attname, "
+ "at.attacl, "
+ "'{}' AS acldefault, "
+ "pip.privtype, pip.initprivs "
+ "FROM pg_catalog.pg_attribute at "
+ "LEFT JOIN pg_catalog.pg_init_privs pip ON "
+ "(at.attrelid = pip.objoid "
+ "AND pip.classoid = 'pg_catalog.pg_class'::pg_catalog.regclass "
+ "AND at.attnum = pip.objsubid) "
+ "WHERE at.attrelid = $1 AND "
+ "NOT at.attisdropped "
+ "AND (at.attacl IS NOT NULL OR pip.initprivs IS NOT NULL) "
+ "ORDER BY at.attnum");
+ }
+ else
+ {
+ appendPQExpBufferStr(query,
+ "SELECT attname, attacl, '{}' AS acldefault, "
+ "NULL AS privtype, NULL AS initprivs "
+ "FROM pg_catalog.pg_attribute "
+ "WHERE attrelid = $1 AND NOT attisdropped "
+ "AND attacl IS NOT NULL "
+ "ORDER BY attnum");
+ }
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_GETCOLUMNACLS] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE getColumnACLs('%u')",
+ tbinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ char *attname = PQgetvalue(res, i, 0);
+ char *attacl = PQgetvalue(res, i, 1);
+ char *acldefault = PQgetvalue(res, i, 2);
+ char privtype = *(PQgetvalue(res, i, 3));
+ char *initprivs = PQgetvalue(res, i, 4);
+ DumpableAcl coldacl;
+ char *attnamecopy;
+
+ coldacl.acl = attacl;
+ coldacl.acldefault = acldefault;
+ coldacl.privtype = privtype;
+ coldacl.initprivs = initprivs;
+ attnamecopy = pg_strdup(fmtId(attname));
+
+ /*
+ * Column's GRANT type is always TABLE. Each column ACL depends
+ * on the table-level ACL, since we can restore column ACLs in
+ * parallel but the table-level ACL has to be done first.
+ */
+ dumpACL(fout, tbinfo->dobj.dumpId, tableAclDumpId,
+ "TABLE", namecopy, attnamecopy,
+ tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
+ &coldacl);
+ free(attnamecopy);
+ }
+ PQclear(res);
+ destroyPQExpBuffer(query);
+ }
+
+ free(namecopy);
+}
+
+/*
+ * Create the AS clause for a view or materialized view. The semicolon is
+ * stripped because a materialized view must add a WITH NO DATA clause.
+ *
+ * This returns a new buffer which must be freed by the caller.
+ */
+static PQExpBuffer
+createViewAsClause(Archive *fout, const TableInfo *tbinfo)
+{
+ PQExpBuffer query = createPQExpBuffer();
+ PQExpBuffer result = createPQExpBuffer();
+ PGresult *res;
+ int len;
+
+ /* Fetch the view definition */
+ appendPQExpBuffer(query,
+ "SELECT pg_catalog.pg_get_viewdef('%u'::pg_catalog.oid) AS viewdef",
+ tbinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ if (PQntuples(res) != 1)
+ {
+ if (PQntuples(res) < 1)
+ pg_fatal("query to obtain definition of view \"%s\" returned no data",
+ tbinfo->dobj.name);
+ else
+ pg_fatal("query to obtain definition of view \"%s\" returned more than one definition",
+ tbinfo->dobj.name);
+ }
+
+ len = PQgetlength(res, 0, 0);
+
+ if (len == 0)
+ pg_fatal("definition of view \"%s\" appears to be empty (length zero)",
+ tbinfo->dobj.name);
+
+ /* Strip off the trailing semicolon so that other things may follow. */
+ Assert(PQgetvalue(res, 0, 0)[len - 1] == ';');
+ appendBinaryPQExpBuffer(result, PQgetvalue(res, 0, 0), len - 1);
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+
+ return result;
+}
+
+/*
+ * Create a dummy AS clause for a view. This is used when the real view
+ * definition has to be postponed because of circular dependencies.
+ * We must duplicate the view's external properties -- column names and types
+ * (including collation) -- so that it works for subsequent references.
+ *
+ * This returns a new buffer which must be freed by the caller.
+ */
+static PQExpBuffer
+createDummyViewAsClause(Archive *fout, const TableInfo *tbinfo)
+{
+ PQExpBuffer result = createPQExpBuffer();
+ int j;
+
+ appendPQExpBufferStr(result, "SELECT");
+
+ for (j = 0; j < tbinfo->numatts; j++)
+ {
+ if (j > 0)
+ appendPQExpBufferChar(result, ',');
+ appendPQExpBufferStr(result, "\n ");
+
+ appendPQExpBuffer(result, "NULL::%s", tbinfo->atttypnames[j]);
+
+ /*
+ * Must add collation if not default for the type, because CREATE OR
+ * REPLACE VIEW won't change it
+ */
+ if (OidIsValid(tbinfo->attcollation[j]))
+ {
+ CollInfo *coll;
+
+ coll = findCollationByOid(tbinfo->attcollation[j]);
+ if (coll)
+ appendPQExpBuffer(result, " COLLATE %s",
+ fmtQualifiedDumpable(coll));
+ }
+
+ appendPQExpBuffer(result, " AS %s", fmtId(tbinfo->attnames[j]));
+ }
+
+ return result;
+}
+
+/*
+ * dumpTableSchema
+ * write the declaration (not data) of one user-defined table or view
+ */
+static void
+dumpTableSchema(Archive *fout, const TableInfo *tbinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer delq = createPQExpBuffer();
+ char *qrelname;
+ char *qualrelname;
+ int numParents;
+ TableInfo **parents;
+ int actual_atts; /* number of attrs in this CREATE statement */
+ const char *reltypename;
+ char *storage;
+ int j,
+ k;
+
+ /* We had better have loaded per-column details about this table */
+ Assert(tbinfo->interesting);
+
+ qrelname = pg_strdup(fmtId(tbinfo->dobj.name));
+ qualrelname = pg_strdup(fmtQualifiedDumpable(tbinfo));
+
+ if (tbinfo->hasoids)
+ pg_log_warning("WITH OIDS is not supported anymore (table \"%s\")",
+ qrelname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_type_oids_by_rel(fout, q, tbinfo);
+
+ /* Is it a table or a view? */
+ if (tbinfo->relkind == RELKIND_VIEW)
+ {
+ PQExpBuffer result;
+
+ /*
+ * Note: keep this code in sync with the is_view case in dumpRule()
+ */
+
+ reltypename = "VIEW";
+
+ appendPQExpBuffer(delq, "DROP VIEW %s;\n", qualrelname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_pg_class_oids(fout, q,
+ tbinfo->dobj.catId.oid, false);
+
+ appendPQExpBuffer(q, "CREATE VIEW %s", qualrelname);
+
+ if (tbinfo->dummy_view)
+ result = createDummyViewAsClause(fout, tbinfo);
+ else
+ {
+ if (nonemptyReloptions(tbinfo->reloptions))
+ {
+ appendPQExpBufferStr(q, " WITH (");
+ appendReloptionsArrayAH(q, tbinfo->reloptions, "", fout);
+ appendPQExpBufferChar(q, ')');
+ }
+ result = createViewAsClause(fout, tbinfo);
+ }
+ appendPQExpBuffer(q, " AS\n%s", result->data);
+ destroyPQExpBuffer(result);
+
+ if (tbinfo->checkoption != NULL && !tbinfo->dummy_view)
+ appendPQExpBuffer(q, "\n WITH %s CHECK OPTION", tbinfo->checkoption);
+ appendPQExpBufferStr(q, ";\n");
+ }
+ else
+ {
+ char *partkeydef = NULL;
+ char *ftoptions = NULL;
+ char *srvname = NULL;
+ char *foreign = "";
+
+ /*
+ * Set reltypename, and collect any relkind-specific data that we
+ * didn't fetch during getTables().
+ */
+ switch (tbinfo->relkind)
+ {
+ case RELKIND_PARTITIONED_TABLE:
+ {
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+
+ reltypename = "TABLE";
+
+ /* retrieve partition key definition */
+ appendPQExpBuffer(query,
+ "SELECT pg_get_partkeydef('%u')",
+ tbinfo->dobj.catId.oid);
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+ partkeydef = pg_strdup(PQgetvalue(res, 0, 0));
+ PQclear(res);
+ destroyPQExpBuffer(query);
+ break;
+ }
+ case RELKIND_FOREIGN_TABLE:
+ {
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ int i_srvname;
+ int i_ftoptions;
+
+ reltypename = "FOREIGN TABLE";
+
+ /* retrieve name of foreign server and generic options */
+ appendPQExpBuffer(query,
+ "SELECT fs.srvname, "
+ "pg_catalog.array_to_string(ARRAY("
+ "SELECT pg_catalog.quote_ident(option_name) || "
+ "' ' || pg_catalog.quote_literal(option_value) "
+ "FROM pg_catalog.pg_options_to_table(ftoptions) "
+ "ORDER BY option_name"
+ "), E',\n ') AS ftoptions "
+ "FROM pg_catalog.pg_foreign_table ft "
+ "JOIN pg_catalog.pg_foreign_server fs "
+ "ON (fs.oid = ft.ftserver) "
+ "WHERE ft.ftrelid = '%u'",
+ tbinfo->dobj.catId.oid);
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+ i_srvname = PQfnumber(res, "srvname");
+ i_ftoptions = PQfnumber(res, "ftoptions");
+ srvname = pg_strdup(PQgetvalue(res, 0, i_srvname));
+ ftoptions = pg_strdup(PQgetvalue(res, 0, i_ftoptions));
+ PQclear(res);
+ destroyPQExpBuffer(query);
+
+ foreign = "FOREIGN ";
+ break;
+ }
+ case RELKIND_MATVIEW:
+ reltypename = "MATERIALIZED VIEW";
+ break;
+ default:
+ reltypename = "TABLE";
+ break;
+ }
+
+ numParents = tbinfo->numParents;
+ parents = tbinfo->parents;
+
+ appendPQExpBuffer(delq, "DROP %s %s;\n", reltypename, qualrelname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_pg_class_oids(fout, q,
+ tbinfo->dobj.catId.oid, false);
+
+ appendPQExpBuffer(q, "CREATE %s%s %s",
+ tbinfo->relpersistence == RELPERSISTENCE_UNLOGGED ?
+ "UNLOGGED " : "",
+ reltypename,
+ qualrelname);
+
+ /*
+ * Attach to type, if reloftype; except in case of a binary upgrade,
+ * we dump the table normally and attach it to the type afterward.
+ */
+ if (OidIsValid(tbinfo->reloftype) && !dopt->binary_upgrade)
+ appendPQExpBuffer(q, " OF %s",
+ getFormattedTypeName(fout, tbinfo->reloftype,
+ zeroIsError));
+
+ if (tbinfo->relkind != RELKIND_MATVIEW)
+ {
+ /* Dump the attributes */
+ actual_atts = 0;
+ for (j = 0; j < tbinfo->numatts; j++)
+ {
+ /*
+ * Normally, dump if it's locally defined in this table, and
+ * not dropped. But for binary upgrade, we'll dump all the
+ * columns, and then fix up the dropped and nonlocal cases
+ * below.
+ */
+ if (shouldPrintColumn(dopt, tbinfo, j))
+ {
+ bool print_default;
+ bool print_notnull;
+
+ /*
+ * Default value --- suppress if to be printed separately.
+ */
+ print_default = (tbinfo->attrdefs[j] != NULL &&
+ !tbinfo->attrdefs[j]->separate);
+
+ /*
+ * Not Null constraint --- suppress if inherited, except
+ * if partition, or in binary-upgrade case where that
+ * won't work.
+ */
+ print_notnull = (tbinfo->notnull[j] &&
+ (!tbinfo->inhNotNull[j] ||
+ tbinfo->ispartition || dopt->binary_upgrade));
+
+ /*
+ * Skip column if fully defined by reloftype, except in
+ * binary upgrade
+ */
+ if (OidIsValid(tbinfo->reloftype) &&
+ !print_default && !print_notnull &&
+ !dopt->binary_upgrade)
+ continue;
+
+ /* Format properly if not first attr */
+ if (actual_atts == 0)
+ appendPQExpBufferStr(q, " (");
+ else
+ appendPQExpBufferChar(q, ',');
+ appendPQExpBufferStr(q, "\n ");
+ actual_atts++;
+
+ /* Attribute name */
+ appendPQExpBufferStr(q, fmtId(tbinfo->attnames[j]));
+
+ if (tbinfo->attisdropped[j])
+ {
+ /*
+ * ALTER TABLE DROP COLUMN clears
+ * pg_attribute.atttypid, so we will not have gotten a
+ * valid type name; insert INTEGER as a stopgap. We'll
+ * clean things up later.
+ */
+ appendPQExpBufferStr(q, " INTEGER /* dummy */");
+ /* and skip to the next column */
+ continue;
+ }
+
+ /*
+ * Attribute type; print it except when creating a typed
+ * table ('OF type_name'), but in binary-upgrade mode,
+ * print it in that case too.
+ */
+ if (dopt->binary_upgrade || !OidIsValid(tbinfo->reloftype))
+ {
+ appendPQExpBuffer(q, " %s",
+ tbinfo->atttypnames[j]);
+ }
+
+ if (print_default)
+ {
+ if (tbinfo->attgenerated[j] == ATTRIBUTE_GENERATED_STORED)
+ appendPQExpBuffer(q, " GENERATED ALWAYS AS (%s) STORED",
+ tbinfo->attrdefs[j]->adef_expr);
+ else
+ appendPQExpBuffer(q, " DEFAULT %s",
+ tbinfo->attrdefs[j]->adef_expr);
+ }
+
+
+ if (print_notnull)
+ appendPQExpBufferStr(q, " NOT NULL");
+
+ /* Add collation if not default for the type */
+ if (OidIsValid(tbinfo->attcollation[j]))
+ {
+ CollInfo *coll;
+
+ coll = findCollationByOid(tbinfo->attcollation[j]);
+ if (coll)
+ appendPQExpBuffer(q, " COLLATE %s",
+ fmtQualifiedDumpable(coll));
+ }
+ }
+ }
+
+ /*
+ * Add non-inherited CHECK constraints, if any.
+ *
+ * For partitions, we need to include check constraints even if
+ * they're not defined locally, because the ALTER TABLE ATTACH
+ * PARTITION that we'll emit later expects the constraint to be
+ * there. (No need to fix conislocal: ATTACH PARTITION does that)
+ */
+ for (j = 0; j < tbinfo->ncheck; j++)
+ {
+ ConstraintInfo *constr = &(tbinfo->checkexprs[j]);
+
+ if (constr->separate ||
+ (!constr->conislocal && !tbinfo->ispartition))
+ continue;
+
+ if (actual_atts == 0)
+ appendPQExpBufferStr(q, " (\n ");
+ else
+ appendPQExpBufferStr(q, ",\n ");
+
+ appendPQExpBuffer(q, "CONSTRAINT %s ",
+ fmtId(constr->dobj.name));
+ appendPQExpBufferStr(q, constr->condef);
+
+ actual_atts++;
+ }
+
+ if (actual_atts)
+ appendPQExpBufferStr(q, "\n)");
+ else if (!(OidIsValid(tbinfo->reloftype) && !dopt->binary_upgrade))
+ {
+ /*
+ * No attributes? we must have a parenthesized attribute list,
+ * even though empty, when not using the OF TYPE syntax.
+ */
+ appendPQExpBufferStr(q, " (\n)");
+ }
+
+ /*
+ * Emit the INHERITS clause (not for partitions), except in
+ * binary-upgrade mode.
+ */
+ if (numParents > 0 && !tbinfo->ispartition &&
+ !dopt->binary_upgrade)
+ {
+ appendPQExpBufferStr(q, "\nINHERITS (");
+ for (k = 0; k < numParents; k++)
+ {
+ TableInfo *parentRel = parents[k];
+
+ if (k > 0)
+ appendPQExpBufferStr(q, ", ");
+ appendPQExpBufferStr(q, fmtQualifiedDumpable(parentRel));
+ }
+ appendPQExpBufferChar(q, ')');
+ }
+
+ if (tbinfo->relkind == RELKIND_PARTITIONED_TABLE)
+ appendPQExpBuffer(q, "\nPARTITION BY %s", partkeydef);
+
+ if (tbinfo->relkind == RELKIND_FOREIGN_TABLE)
+ appendPQExpBuffer(q, "\nSERVER %s", fmtId(srvname));
+ }
+
+ if (nonemptyReloptions(tbinfo->reloptions) ||
+ nonemptyReloptions(tbinfo->toast_reloptions))
+ {
+ bool addcomma = false;
+
+ appendPQExpBufferStr(q, "\nWITH (");
+ if (nonemptyReloptions(tbinfo->reloptions))
+ {
+ addcomma = true;
+ appendReloptionsArrayAH(q, tbinfo->reloptions, "", fout);
+ }
+ if (nonemptyReloptions(tbinfo->toast_reloptions))
+ {
+ if (addcomma)
+ appendPQExpBufferStr(q, ", ");
+ appendReloptionsArrayAH(q, tbinfo->toast_reloptions, "toast.",
+ fout);
+ }
+ appendPQExpBufferChar(q, ')');
+ }
+
+ /* Dump generic options if any */
+ if (ftoptions && ftoptions[0])
+ appendPQExpBuffer(q, "\nOPTIONS (\n %s\n)", ftoptions);
+
+ /*
+ * For materialized views, create the AS clause just like a view. At
+ * this point, we always mark the view as not populated.
+ */
+ if (tbinfo->relkind == RELKIND_MATVIEW)
+ {
+ PQExpBuffer result;
+
+ result = createViewAsClause(fout, tbinfo);
+ appendPQExpBuffer(q, " AS\n%s\n WITH NO DATA;\n",
+ result->data);
+ destroyPQExpBuffer(result);
+ }
+ else
+ appendPQExpBufferStr(q, ";\n");
+
+ /* Materialized views can depend on extensions */
+ if (tbinfo->relkind == RELKIND_MATVIEW)
+ append_depends_on_extension(fout, q, &tbinfo->dobj,
+ "pg_catalog.pg_class",
+ tbinfo->relkind == RELKIND_MATVIEW ?
+ "MATERIALIZED VIEW" : "INDEX",
+ qualrelname);
+
+ /*
+ * in binary upgrade mode, update the catalog with any missing values
+ * that might be present.
+ */
+ if (dopt->binary_upgrade)
+ {
+ for (j = 0; j < tbinfo->numatts; j++)
+ {
+ if (tbinfo->attmissingval[j][0] != '\0')
+ {
+ appendPQExpBufferStr(q, "\n-- set missing value.\n");
+ appendPQExpBufferStr(q,
+ "SELECT pg_catalog.binary_upgrade_set_missing_value(");
+ appendStringLiteralAH(q, qualrelname, fout);
+ appendPQExpBufferStr(q, "::pg_catalog.regclass,");
+ appendStringLiteralAH(q, tbinfo->attnames[j], fout);
+ appendPQExpBufferStr(q, ",");
+ appendStringLiteralAH(q, tbinfo->attmissingval[j], fout);
+ appendPQExpBufferStr(q, ");\n\n");
+ }
+ }
+ }
+
+ /*
+ * To create binary-compatible heap files, we have to ensure the same
+ * physical column order, including dropped columns, as in the
+ * original. Therefore, we create dropped columns above and drop them
+ * here, also updating their attlen/attalign values so that the
+ * dropped column can be skipped properly. (We do not bother with
+ * restoring the original attbyval setting.) Also, inheritance
+ * relationships are set up by doing ALTER TABLE INHERIT rather than
+ * using an INHERITS clause --- the latter would possibly mess up the
+ * column order. That also means we have to take care about setting
+ * attislocal correctly, plus fix up any inherited CHECK constraints.
+ * Analogously, we set up typed tables using ALTER TABLE / OF here.
+ *
+ * We process foreign and partitioned tables here, even though they
+ * lack heap storage, because they can participate in inheritance
+ * relationships and we want this stuff to be consistent across the
+ * inheritance tree. We can exclude indexes, toast tables, sequences
+ * and matviews, even though they have storage, because we don't
+ * support altering or dropping columns in them, nor can they be part
+ * of inheritance trees.
+ */
+ if (dopt->binary_upgrade &&
+ (tbinfo->relkind == RELKIND_RELATION ||
+ tbinfo->relkind == RELKIND_FOREIGN_TABLE ||
+ tbinfo->relkind == RELKIND_PARTITIONED_TABLE))
+ {
+ for (j = 0; j < tbinfo->numatts; j++)
+ {
+ if (tbinfo->attisdropped[j])
+ {
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, recreate dropped column.\n");
+ appendPQExpBuffer(q, "UPDATE pg_catalog.pg_attribute\n"
+ "SET attlen = %d, "
+ "attalign = '%c', attbyval = false\n"
+ "WHERE attname = ",
+ tbinfo->attlen[j],
+ tbinfo->attalign[j]);
+ appendStringLiteralAH(q, tbinfo->attnames[j], fout);
+ appendPQExpBufferStr(q, "\n AND attrelid = ");
+ appendStringLiteralAH(q, qualrelname, fout);
+ appendPQExpBufferStr(q, "::pg_catalog.regclass;\n");
+
+ if (tbinfo->relkind == RELKIND_RELATION ||
+ tbinfo->relkind == RELKIND_PARTITIONED_TABLE)
+ appendPQExpBuffer(q, "ALTER TABLE ONLY %s ",
+ qualrelname);
+ else
+ appendPQExpBuffer(q, "ALTER FOREIGN TABLE ONLY %s ",
+ qualrelname);
+ appendPQExpBuffer(q, "DROP COLUMN %s;\n",
+ fmtId(tbinfo->attnames[j]));
+ }
+ else if (!tbinfo->attislocal[j])
+ {
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, recreate inherited column.\n");
+ appendPQExpBufferStr(q, "UPDATE pg_catalog.pg_attribute\n"
+ "SET attislocal = false\n"
+ "WHERE attname = ");
+ appendStringLiteralAH(q, tbinfo->attnames[j], fout);
+ appendPQExpBufferStr(q, "\n AND attrelid = ");
+ appendStringLiteralAH(q, qualrelname, fout);
+ appendPQExpBufferStr(q, "::pg_catalog.regclass;\n");
+ }
+ }
+
+ /*
+ * Add inherited CHECK constraints, if any.
+ *
+ * For partitions, they were already dumped, and conislocal
+ * doesn't need fixing.
+ */
+ for (k = 0; k < tbinfo->ncheck; k++)
+ {
+ ConstraintInfo *constr = &(tbinfo->checkexprs[k]);
+
+ if (constr->separate || constr->conislocal || tbinfo->ispartition)
+ continue;
+
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, set up inherited constraint.\n");
+ appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s ADD CONSTRAINT %s %s;\n",
+ foreign, qualrelname,
+ fmtId(constr->dobj.name),
+ constr->condef);
+ appendPQExpBufferStr(q, "UPDATE pg_catalog.pg_constraint\n"
+ "SET conislocal = false\n"
+ "WHERE contype = 'c' AND conname = ");
+ appendStringLiteralAH(q, constr->dobj.name, fout);
+ appendPQExpBufferStr(q, "\n AND conrelid = ");
+ appendStringLiteralAH(q, qualrelname, fout);
+ appendPQExpBufferStr(q, "::pg_catalog.regclass;\n");
+ }
+
+ if (numParents > 0 && !tbinfo->ispartition)
+ {
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, set up inheritance this way.\n");
+ for (k = 0; k < numParents; k++)
+ {
+ TableInfo *parentRel = parents[k];
+
+ appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s INHERIT %s;\n", foreign,
+ qualrelname,
+ fmtQualifiedDumpable(parentRel));
+ }
+ }
+
+ if (OidIsValid(tbinfo->reloftype))
+ {
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, set up typed tables this way.\n");
+ appendPQExpBuffer(q, "ALTER TABLE ONLY %s OF %s;\n",
+ qualrelname,
+ getFormattedTypeName(fout, tbinfo->reloftype,
+ zeroIsError));
+ }
+ }
+
+ /*
+ * In binary_upgrade mode, arrange to restore the old relfrozenxid and
+ * relminmxid of all vacuumable relations. (While vacuum.c processes
+ * TOAST tables semi-independently, here we see them only as children
+ * of other relations; so this "if" lacks RELKIND_TOASTVALUE, and the
+ * child toast table is handled below.)
+ */
+ if (dopt->binary_upgrade &&
+ (tbinfo->relkind == RELKIND_RELATION ||
+ tbinfo->relkind == RELKIND_MATVIEW))
+ {
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, set heap's relfrozenxid and relminmxid\n");
+ appendPQExpBuffer(q, "UPDATE pg_catalog.pg_class\n"
+ "SET relfrozenxid = '%u', relminmxid = '%u'\n"
+ "WHERE oid = ",
+ tbinfo->frozenxid, tbinfo->minmxid);
+ appendStringLiteralAH(q, qualrelname, fout);
+ appendPQExpBufferStr(q, "::pg_catalog.regclass;\n");
+
+ if (tbinfo->toast_oid)
+ {
+ /*
+ * The toast table will have the same OID at restore, so we
+ * can safely target it by OID.
+ */
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, set toast's relfrozenxid and relminmxid\n");
+ appendPQExpBuffer(q, "UPDATE pg_catalog.pg_class\n"
+ "SET relfrozenxid = '%u', relminmxid = '%u'\n"
+ "WHERE oid = '%u';\n",
+ tbinfo->toast_frozenxid,
+ tbinfo->toast_minmxid, tbinfo->toast_oid);
+ }
+ }
+
+ /*
+ * In binary_upgrade mode, restore matviews' populated status by
+ * poking pg_class directly. This is pretty ugly, but we can't use
+ * REFRESH MATERIALIZED VIEW since it's possible that some underlying
+ * matview is not populated even though this matview is; in any case,
+ * we want to transfer the matview's heap storage, not run REFRESH.
+ */
+ if (dopt->binary_upgrade && tbinfo->relkind == RELKIND_MATVIEW &&
+ tbinfo->relispopulated)
+ {
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, mark materialized view as populated\n");
+ appendPQExpBufferStr(q, "UPDATE pg_catalog.pg_class\n"
+ "SET relispopulated = 't'\n"
+ "WHERE oid = ");
+ appendStringLiteralAH(q, qualrelname, fout);
+ appendPQExpBufferStr(q, "::pg_catalog.regclass;\n");
+ }
+
+ /*
+ * Dump additional per-column properties that we can't handle in the
+ * main CREATE TABLE command.
+ */
+ for (j = 0; j < tbinfo->numatts; j++)
+ {
+ /* None of this applies to dropped columns */
+ if (tbinfo->attisdropped[j])
+ continue;
+
+ /*
+ * If we didn't dump the column definition explicitly above, and
+ * it is NOT NULL and did not inherit that property from a parent,
+ * we have to mark it separately.
+ */
+ if (!shouldPrintColumn(dopt, tbinfo, j) &&
+ tbinfo->notnull[j] && !tbinfo->inhNotNull[j])
+ appendPQExpBuffer(q,
+ "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET NOT NULL;\n",
+ foreign, qualrelname,
+ fmtId(tbinfo->attnames[j]));
+
+ /*
+ * Dump per-column statistics information. We only issue an ALTER
+ * TABLE statement if the attstattarget entry for this column is
+ * non-negative (i.e. it's not the default value)
+ */
+ if (tbinfo->attstattarget[j] >= 0)
+ appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET STATISTICS %d;\n",
+ foreign, qualrelname,
+ fmtId(tbinfo->attnames[j]),
+ tbinfo->attstattarget[j]);
+
+ /*
+ * Dump per-column storage information. The statement is only
+ * dumped if the storage has been changed from the type's default.
+ */
+ if (tbinfo->attstorage[j] != tbinfo->typstorage[j])
+ {
+ switch (tbinfo->attstorage[j])
+ {
+ case TYPSTORAGE_PLAIN:
+ storage = "PLAIN";
+ break;
+ case TYPSTORAGE_EXTERNAL:
+ storage = "EXTERNAL";
+ break;
+ case TYPSTORAGE_EXTENDED:
+ storage = "EXTENDED";
+ break;
+ case TYPSTORAGE_MAIN:
+ storage = "MAIN";
+ break;
+ default:
+ storage = NULL;
+ }
+
+ /*
+ * Only dump the statement if it's a storage type we recognize
+ */
+ if (storage != NULL)
+ appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET STORAGE %s;\n",
+ foreign, qualrelname,
+ fmtId(tbinfo->attnames[j]),
+ storage);
+ }
+
+ /*
+ * Dump per-column compression, if it's been set.
+ */
+ if (!dopt->no_toast_compression)
+ {
+ const char *cmname;
+
+ switch (tbinfo->attcompression[j])
+ {
+ case 'p':
+ cmname = "pglz";
+ break;
+ case 'l':
+ cmname = "lz4";
+ break;
+ default:
+ cmname = NULL;
+ break;
+ }
+
+ if (cmname != NULL)
+ appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET COMPRESSION %s;\n",
+ foreign, qualrelname,
+ fmtId(tbinfo->attnames[j]),
+ cmname);
+ }
+
+ /*
+ * Dump per-column attributes.
+ */
+ if (tbinfo->attoptions[j][0] != '\0')
+ appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET (%s);\n",
+ foreign, qualrelname,
+ fmtId(tbinfo->attnames[j]),
+ tbinfo->attoptions[j]);
+
+ /*
+ * Dump per-column fdw options.
+ */
+ if (tbinfo->relkind == RELKIND_FOREIGN_TABLE &&
+ tbinfo->attfdwoptions[j][0] != '\0')
+ appendPQExpBuffer(q,
+ "ALTER FOREIGN TABLE %s ALTER COLUMN %s OPTIONS (\n"
+ " %s\n"
+ ");\n",
+ qualrelname,
+ fmtId(tbinfo->attnames[j]),
+ tbinfo->attfdwoptions[j]);
+ } /* end loop over columns */
+
+ if (partkeydef)
+ free(partkeydef);
+ if (ftoptions)
+ free(ftoptions);
+ if (srvname)
+ free(srvname);
+ }
+
+ /*
+ * dump properties we only have ALTER TABLE syntax for
+ */
+ if ((tbinfo->relkind == RELKIND_RELATION ||
+ tbinfo->relkind == RELKIND_PARTITIONED_TABLE ||
+ tbinfo->relkind == RELKIND_MATVIEW) &&
+ tbinfo->relreplident != REPLICA_IDENTITY_DEFAULT)
+ {
+ if (tbinfo->relreplident == REPLICA_IDENTITY_INDEX)
+ {
+ /* nothing to do, will be set when the index is dumped */
+ }
+ else if (tbinfo->relreplident == REPLICA_IDENTITY_NOTHING)
+ {
+ appendPQExpBuffer(q, "\nALTER TABLE ONLY %s REPLICA IDENTITY NOTHING;\n",
+ qualrelname);
+ }
+ else if (tbinfo->relreplident == REPLICA_IDENTITY_FULL)
+ {
+ appendPQExpBuffer(q, "\nALTER TABLE ONLY %s REPLICA IDENTITY FULL;\n",
+ qualrelname);
+ }
+ }
+
+ if (tbinfo->forcerowsec)
+ appendPQExpBuffer(q, "\nALTER TABLE ONLY %s FORCE ROW LEVEL SECURITY;\n",
+ qualrelname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &tbinfo->dobj,
+ reltypename, qrelname,
+ tbinfo->dobj.namespace->dobj.name);
+
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ {
+ char *tablespace = NULL;
+ char *tableam = NULL;
+
+ /*
+ * _selectTablespace() relies on tablespace-enabled objects in the
+ * default tablespace to have a tablespace of "" (empty string) versus
+ * non-tablespace-enabled objects to have a tablespace of NULL.
+ * getTables() sets tbinfo->reltablespace to "" for the default
+ * tablespace (not NULL).
+ */
+ if (RELKIND_HAS_TABLESPACE(tbinfo->relkind))
+ tablespace = tbinfo->reltablespace;
+
+ if (RELKIND_HAS_TABLE_AM(tbinfo->relkind))
+ tableam = tbinfo->amname;
+
+ ArchiveEntry(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tbinfo->dobj.name,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .tablespace = tablespace,
+ .tableam = tableam,
+ .owner = tbinfo->rolname,
+ .description = reltypename,
+ .section = tbinfo->postponed_def ?
+ SECTION_POST_DATA : SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+ }
+
+ /* Dump Table Comments */
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpTableComment(fout, tbinfo, reltypename);
+
+ /* Dump Table Security Labels */
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpTableSecLabel(fout, tbinfo, reltypename);
+
+ /* Dump comments on inlined table constraints */
+ for (j = 0; j < tbinfo->ncheck; j++)
+ {
+ ConstraintInfo *constr = &(tbinfo->checkexprs[j]);
+
+ if (constr->separate || !constr->conislocal)
+ continue;
+
+ if (constr->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpTableConstraintComment(fout, constr);
+ }
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qrelname);
+ free(qualrelname);
+}
+
+/*
+ * dumpTableAttach
+ * write to fout the commands to attach a child partition
+ *
+ * Child partitions are always made by creating them separately
+ * and then using ATTACH PARTITION, rather than using
+ * CREATE TABLE ... PARTITION OF. This is important for preserving
+ * any possible discrepancy in column layout, to allow assigning the
+ * correct tablespace if different, and so that it's possible to restore
+ * a partition without restoring its parent. (You'll get an error from
+ * the ATTACH PARTITION command, but that can be ignored, or skipped
+ * using "pg_restore -L" if you prefer.) The last point motivates
+ * treating ATTACH PARTITION as a completely separate ArchiveEntry
+ * rather than emitting it within the child partition's ArchiveEntry.
+ */
+static void
+dumpTableAttach(Archive *fout, const TableAttachInfo *attachinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PGresult *res;
+ char *partbound;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ if (!(attachinfo->partitionTbl->dobj.dump & DUMP_COMPONENT_DEFINITION))
+ return;
+
+ q = createPQExpBuffer();
+
+ if (!fout->is_prepared[PREPQUERY_DUMPTABLEATTACH])
+ {
+ /* Set up query for partbound details */
+ appendPQExpBufferStr(q,
+ "PREPARE dumpTableAttach(pg_catalog.oid) AS\n");
+
+ appendPQExpBufferStr(q,
+ "SELECT pg_get_expr(c.relpartbound, c.oid) "
+ "FROM pg_class c "
+ "WHERE c.oid = $1");
+
+ ExecuteSqlStatement(fout, q->data);
+
+ fout->is_prepared[PREPQUERY_DUMPTABLEATTACH] = true;
+ }
+
+ printfPQExpBuffer(q,
+ "EXECUTE dumpTableAttach('%u')",
+ attachinfo->partitionTbl->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, q->data);
+ partbound = PQgetvalue(res, 0, 0);
+
+ /* Perform ALTER TABLE on the parent */
+ printfPQExpBuffer(q,
+ "ALTER TABLE ONLY %s ",
+ fmtQualifiedDumpable(attachinfo->parentTbl));
+ appendPQExpBuffer(q,
+ "ATTACH PARTITION %s %s;\n",
+ fmtQualifiedDumpable(attachinfo->partitionTbl),
+ partbound);
+
+ /*
+ * There is no point in creating a drop query as the drop is done by table
+ * drop. (If you think to change this, see also _printTocEntry().)
+ * Although this object doesn't really have ownership as such, set the
+ * owner field anyway to ensure that the command is run by the correct
+ * role at restore time.
+ */
+ ArchiveEntry(fout, attachinfo->dobj.catId, attachinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = attachinfo->dobj.name,
+ .namespace = attachinfo->dobj.namespace->dobj.name,
+ .owner = attachinfo->partitionTbl->rolname,
+ .description = "TABLE ATTACH",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data));
+
+ PQclear(res);
+ destroyPQExpBuffer(q);
+}
+
+/*
+ * dumpAttrDef --- dump an attribute's default-value declaration
+ */
+static void
+dumpAttrDef(Archive *fout, const AttrDefInfo *adinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ TableInfo *tbinfo = adinfo->adtable;
+ int adnum = adinfo->adnum;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qualrelname;
+ char *tag;
+ char *foreign;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ /* Skip if not "separate"; it was dumped in the table's definition */
+ if (!adinfo->separate)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qualrelname = pg_strdup(fmtQualifiedDumpable(tbinfo));
+
+ foreign = tbinfo->relkind == RELKIND_FOREIGN_TABLE ? "FOREIGN " : "";
+
+ appendPQExpBuffer(q,
+ "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET DEFAULT %s;\n",
+ foreign, qualrelname, fmtId(tbinfo->attnames[adnum - 1]),
+ adinfo->adef_expr);
+
+ appendPQExpBuffer(delq, "ALTER %sTABLE %s ALTER COLUMN %s DROP DEFAULT;\n",
+ foreign, qualrelname,
+ fmtId(tbinfo->attnames[adnum - 1]));
+
+ tag = psprintf("%s %s", tbinfo->dobj.name, tbinfo->attnames[adnum - 1]);
+
+ if (adinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, adinfo->dobj.catId, adinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "DEFAULT",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ free(tag);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qualrelname);
+}
+
+/*
+ * getAttrName: extract the correct name for an attribute
+ *
+ * The array tblInfo->attnames[] only provides names of user attributes;
+ * if a system attribute number is supplied, we have to fake it.
+ * We also do a little bit of bounds checking for safety's sake.
+ */
+static const char *
+getAttrName(int attrnum, const TableInfo *tblInfo)
+{
+ if (attrnum > 0 && attrnum <= tblInfo->numatts)
+ return tblInfo->attnames[attrnum - 1];
+ switch (attrnum)
+ {
+ case SelfItemPointerAttributeNumber:
+ return "ctid";
+ case MinTransactionIdAttributeNumber:
+ return "xmin";
+ case MinCommandIdAttributeNumber:
+ return "cmin";
+ case MaxTransactionIdAttributeNumber:
+ return "xmax";
+ case MaxCommandIdAttributeNumber:
+ return "cmax";
+ case TableOidAttributeNumber:
+ return "tableoid";
+ }
+ pg_fatal("invalid column number %d for table \"%s\"",
+ attrnum, tblInfo->dobj.name);
+ return NULL; /* keep compiler quiet */
+}
+
+/*
+ * dumpIndex
+ * write out to fout a user-defined index
+ */
+static void
+dumpIndex(Archive *fout, const IndxInfo *indxinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ TableInfo *tbinfo = indxinfo->indextable;
+ bool is_constraint = (indxinfo->indexconstraint != 0);
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qindxname;
+ char *qqindxname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qindxname = pg_strdup(fmtId(indxinfo->dobj.name));
+ qqindxname = pg_strdup(fmtQualifiedDumpable(indxinfo));
+
+ /*
+ * If there's an associated constraint, don't dump the index per se, but
+ * do dump any comment for it. (This is safe because dependency ordering
+ * will have ensured the constraint is emitted first.) Note that the
+ * emitted comment has to be shown as depending on the constraint, not the
+ * index, in such cases.
+ */
+ if (!is_constraint)
+ {
+ char *indstatcols = indxinfo->indstatcols;
+ char *indstatvals = indxinfo->indstatvals;
+ char **indstatcolsarray = NULL;
+ char **indstatvalsarray = NULL;
+ int nstatcols = 0;
+ int nstatvals = 0;
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_pg_class_oids(fout, q,
+ indxinfo->dobj.catId.oid, true);
+
+ /* Plain secondary index */
+ appendPQExpBuffer(q, "%s;\n", indxinfo->indexdef);
+
+ /*
+ * Append ALTER TABLE commands as needed to set properties that we
+ * only have ALTER TABLE syntax for. Keep this in sync with the
+ * similar code in dumpConstraint!
+ */
+
+ /* If the index is clustered, we need to record that. */
+ if (indxinfo->indisclustered)
+ {
+ appendPQExpBuffer(q, "\nALTER TABLE %s CLUSTER",
+ fmtQualifiedDumpable(tbinfo));
+ /* index name is not qualified in this syntax */
+ appendPQExpBuffer(q, " ON %s;\n",
+ qindxname);
+ }
+
+ /*
+ * If the index has any statistics on some of its columns, generate
+ * the associated ALTER INDEX queries.
+ */
+ if (strlen(indstatcols) != 0 || strlen(indstatvals) != 0)
+ {
+ int j;
+
+ if (!parsePGArray(indstatcols, &indstatcolsarray, &nstatcols))
+ pg_fatal("could not parse index statistic columns");
+ if (!parsePGArray(indstatvals, &indstatvalsarray, &nstatvals))
+ pg_fatal("could not parse index statistic values");
+ if (nstatcols != nstatvals)
+ pg_fatal("mismatched number of columns and values for index statistics");
+
+ for (j = 0; j < nstatcols; j++)
+ {
+ appendPQExpBuffer(q, "ALTER INDEX %s ", qqindxname);
+
+ /*
+ * Note that this is a column number, so no quotes should be
+ * used.
+ */
+ appendPQExpBuffer(q, "ALTER COLUMN %s ",
+ indstatcolsarray[j]);
+ appendPQExpBuffer(q, "SET STATISTICS %s;\n",
+ indstatvalsarray[j]);
+ }
+ }
+
+ /* Indexes can depend on extensions */
+ append_depends_on_extension(fout, q, &indxinfo->dobj,
+ "pg_catalog.pg_class",
+ "INDEX", qqindxname);
+
+ /* If the index defines identity, we need to record that. */
+ if (indxinfo->indisreplident)
+ {
+ appendPQExpBuffer(q, "\nALTER TABLE ONLY %s REPLICA IDENTITY USING",
+ fmtQualifiedDumpable(tbinfo));
+ /* index name is not qualified in this syntax */
+ appendPQExpBuffer(q, " INDEX %s;\n",
+ qindxname);
+ }
+
+ appendPQExpBuffer(delq, "DROP INDEX %s;\n", qqindxname);
+
+ if (indxinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, indxinfo->dobj.catId, indxinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = indxinfo->dobj.name,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .tablespace = indxinfo->tablespace,
+ .owner = tbinfo->rolname,
+ .description = "INDEX",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ if (indstatcolsarray)
+ free(indstatcolsarray);
+ if (indstatvalsarray)
+ free(indstatvalsarray);
+ }
+
+ /* Dump Index Comments */
+ if (indxinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "INDEX", qindxname,
+ tbinfo->dobj.namespace->dobj.name,
+ tbinfo->rolname,
+ indxinfo->dobj.catId, 0,
+ is_constraint ? indxinfo->indexconstraint :
+ indxinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qindxname);
+ free(qqindxname);
+}
+
+/*
+ * dumpIndexAttach
+ * write out to fout a partitioned-index attachment clause
+ */
+static void
+dumpIndexAttach(Archive *fout, const IndexAttachInfo *attachinfo)
+{
+ /* Do nothing in data-only dump */
+ if (fout->dopt->dataOnly)
+ return;
+
+ if (attachinfo->partitionIdx->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ {
+ PQExpBuffer q = createPQExpBuffer();
+
+ appendPQExpBuffer(q, "ALTER INDEX %s ",
+ fmtQualifiedDumpable(attachinfo->parentIdx));
+ appendPQExpBuffer(q, "ATTACH PARTITION %s;\n",
+ fmtQualifiedDumpable(attachinfo->partitionIdx));
+
+ /*
+ * There is no point in creating a drop query as the drop is done by
+ * index drop. (If you think to change this, see also
+ * _printTocEntry().) Although this object doesn't really have
+ * ownership as such, set the owner field anyway to ensure that the
+ * command is run by the correct role at restore time.
+ */
+ ArchiveEntry(fout, attachinfo->dobj.catId, attachinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = attachinfo->dobj.name,
+ .namespace = attachinfo->dobj.namespace->dobj.name,
+ .owner = attachinfo->parentIdx->indextable->rolname,
+ .description = "INDEX ATTACH",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data));
+
+ destroyPQExpBuffer(q);
+ }
+}
+
+/*
+ * dumpStatisticsExt
+ * write out to fout an extended statistics object
+ */
+static void
+dumpStatisticsExt(Archive *fout, const StatsExtInfo *statsextinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer query;
+ char *qstatsextname;
+ PGresult *res;
+ char *stxdef;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ query = createPQExpBuffer();
+
+ qstatsextname = pg_strdup(fmtId(statsextinfo->dobj.name));
+
+ appendPQExpBuffer(query, "SELECT "
+ "pg_catalog.pg_get_statisticsobjdef('%u'::pg_catalog.oid)",
+ statsextinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ stxdef = PQgetvalue(res, 0, 0);
+
+ /* Result of pg_get_statisticsobjdef is complete except for semicolon */
+ appendPQExpBuffer(q, "%s;\n", stxdef);
+
+ /*
+ * We only issue an ALTER STATISTICS statement if the stxstattarget entry
+ * for this statistics object is non-negative (i.e. it's not the default
+ * value).
+ */
+ if (statsextinfo->stattarget >= 0)
+ {
+ appendPQExpBuffer(q, "ALTER STATISTICS %s ",
+ fmtQualifiedDumpable(statsextinfo));
+ appendPQExpBuffer(q, "SET STATISTICS %d;\n",
+ statsextinfo->stattarget);
+ }
+
+ appendPQExpBuffer(delq, "DROP STATISTICS %s;\n",
+ fmtQualifiedDumpable(statsextinfo));
+
+ if (statsextinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, statsextinfo->dobj.catId,
+ statsextinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = statsextinfo->dobj.name,
+ .namespace = statsextinfo->dobj.namespace->dobj.name,
+ .owner = statsextinfo->rolname,
+ .description = "STATISTICS",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Statistics Comments */
+ if (statsextinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "STATISTICS", qstatsextname,
+ statsextinfo->dobj.namespace->dobj.name,
+ statsextinfo->rolname,
+ statsextinfo->dobj.catId, 0,
+ statsextinfo->dobj.dumpId);
+
+ PQclear(res);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qstatsextname);
+}
+
+/*
+ * dumpConstraint
+ * write out to fout a user-defined constraint
+ */
+static void
+dumpConstraint(Archive *fout, const ConstraintInfo *coninfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ TableInfo *tbinfo = coninfo->contable;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *tag = NULL;
+ char *foreign;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ foreign = tbinfo &&
+ tbinfo->relkind == RELKIND_FOREIGN_TABLE ? "FOREIGN " : "";
+
+ if (coninfo->contype == 'p' ||
+ coninfo->contype == 'u' ||
+ coninfo->contype == 'x')
+ {
+ /* Index-related constraint */
+ IndxInfo *indxinfo;
+ int k;
+
+ indxinfo = (IndxInfo *) findObjectByDumpId(coninfo->conindex);
+
+ if (indxinfo == NULL)
+ pg_fatal("missing index for constraint \"%s\"",
+ coninfo->dobj.name);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_pg_class_oids(fout, q,
+ indxinfo->dobj.catId.oid, true);
+
+ appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s\n", foreign,
+ fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(q, " ADD CONSTRAINT %s ",
+ fmtId(coninfo->dobj.name));
+
+ if (coninfo->condef)
+ {
+ /* pg_get_constraintdef should have provided everything */
+ appendPQExpBuffer(q, "%s;\n", coninfo->condef);
+ }
+ else
+ {
+ appendPQExpBuffer(q, "%s",
+ coninfo->contype == 'p' ? "PRIMARY KEY" : "UNIQUE");
+ if (indxinfo->indnullsnotdistinct)
+ appendPQExpBuffer(q, " NULLS NOT DISTINCT");
+ appendPQExpBuffer(q, " (");
+ for (k = 0; k < indxinfo->indnkeyattrs; k++)
+ {
+ int indkey = (int) indxinfo->indkeys[k];
+ const char *attname;
+
+ if (indkey == InvalidAttrNumber)
+ break;
+ attname = getAttrName(indkey, tbinfo);
+
+ appendPQExpBuffer(q, "%s%s",
+ (k == 0) ? "" : ", ",
+ fmtId(attname));
+ }
+
+ if (indxinfo->indnkeyattrs < indxinfo->indnattrs)
+ appendPQExpBufferStr(q, ") INCLUDE (");
+
+ for (k = indxinfo->indnkeyattrs; k < indxinfo->indnattrs; k++)
+ {
+ int indkey = (int) indxinfo->indkeys[k];
+ const char *attname;
+
+ if (indkey == InvalidAttrNumber)
+ break;
+ attname = getAttrName(indkey, tbinfo);
+
+ appendPQExpBuffer(q, "%s%s",
+ (k == indxinfo->indnkeyattrs) ? "" : ", ",
+ fmtId(attname));
+ }
+
+ appendPQExpBufferChar(q, ')');
+
+ if (nonemptyReloptions(indxinfo->indreloptions))
+ {
+ appendPQExpBufferStr(q, " WITH (");
+ appendReloptionsArrayAH(q, indxinfo->indreloptions, "", fout);
+ appendPQExpBufferChar(q, ')');
+ }
+
+ if (coninfo->condeferrable)
+ {
+ appendPQExpBufferStr(q, " DEFERRABLE");
+ if (coninfo->condeferred)
+ appendPQExpBufferStr(q, " INITIALLY DEFERRED");
+ }
+
+ appendPQExpBufferStr(q, ";\n");
+ }
+
+ /*
+ * Append ALTER TABLE commands as needed to set properties that we
+ * only have ALTER TABLE syntax for. Keep this in sync with the
+ * similar code in dumpIndex!
+ */
+
+ /* If the index is clustered, we need to record that. */
+ if (indxinfo->indisclustered)
+ {
+ appendPQExpBuffer(q, "\nALTER TABLE %s CLUSTER",
+ fmtQualifiedDumpable(tbinfo));
+ /* index name is not qualified in this syntax */
+ appendPQExpBuffer(q, " ON %s;\n",
+ fmtId(indxinfo->dobj.name));
+ }
+
+ /* If the index defines identity, we need to record that. */
+ if (indxinfo->indisreplident)
+ {
+ appendPQExpBuffer(q, "\nALTER TABLE ONLY %s REPLICA IDENTITY USING",
+ fmtQualifiedDumpable(tbinfo));
+ /* index name is not qualified in this syntax */
+ appendPQExpBuffer(q, " INDEX %s;\n",
+ fmtId(indxinfo->dobj.name));
+ }
+
+ /* Indexes can depend on extensions */
+ append_depends_on_extension(fout, q, &indxinfo->dobj,
+ "pg_catalog.pg_class", "INDEX",
+ fmtQualifiedDumpable(indxinfo));
+
+ appendPQExpBuffer(delq, "ALTER %sTABLE ONLY %s ", foreign,
+ fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(delq, "DROP CONSTRAINT %s;\n",
+ fmtId(coninfo->dobj.name));
+
+ tag = psprintf("%s %s", tbinfo->dobj.name, coninfo->dobj.name);
+
+ if (coninfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .tablespace = indxinfo->tablespace,
+ .owner = tbinfo->rolname,
+ .description = "CONSTRAINT",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+ }
+ else if (coninfo->contype == 'f')
+ {
+ char *only;
+
+ /*
+ * Foreign keys on partitioned tables are always declared as
+ * inheriting to partitions; for all other cases, emit them as
+ * applying ONLY directly to the named table, because that's how they
+ * work for regular inherited tables.
+ */
+ only = tbinfo->relkind == RELKIND_PARTITIONED_TABLE ? "" : "ONLY ";
+
+ /*
+ * XXX Potentially wrap in a 'SET CONSTRAINTS OFF' block so that the
+ * current table data is not processed
+ */
+ appendPQExpBuffer(q, "ALTER %sTABLE %s%s\n", foreign,
+ only, fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(q, " ADD CONSTRAINT %s %s;\n",
+ fmtId(coninfo->dobj.name),
+ coninfo->condef);
+
+ appendPQExpBuffer(delq, "ALTER %sTABLE %s%s ", foreign,
+ only, fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(delq, "DROP CONSTRAINT %s;\n",
+ fmtId(coninfo->dobj.name));
+
+ tag = psprintf("%s %s", tbinfo->dobj.name, coninfo->dobj.name);
+
+ if (coninfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "FK CONSTRAINT",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+ }
+ else if (coninfo->contype == 'c' && tbinfo)
+ {
+ /* CHECK constraint on a table */
+
+ /* Ignore if not to be dumped separately, or if it was inherited */
+ if (coninfo->separate && coninfo->conislocal)
+ {
+ /* not ONLY since we want it to propagate to children */
+ appendPQExpBuffer(q, "ALTER %sTABLE %s\n", foreign,
+ fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(q, " ADD CONSTRAINT %s %s;\n",
+ fmtId(coninfo->dobj.name),
+ coninfo->condef);
+
+ appendPQExpBuffer(delq, "ALTER %sTABLE %s ", foreign,
+ fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(delq, "DROP CONSTRAINT %s;\n",
+ fmtId(coninfo->dobj.name));
+
+ tag = psprintf("%s %s", tbinfo->dobj.name, coninfo->dobj.name);
+
+ if (coninfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "CHECK CONSTRAINT",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+ }
+ }
+ else if (coninfo->contype == 'c' && tbinfo == NULL)
+ {
+ /* CHECK constraint on a domain */
+ TypeInfo *tyinfo = coninfo->condomain;
+
+ /* Ignore if not to be dumped separately */
+ if (coninfo->separate)
+ {
+ appendPQExpBuffer(q, "ALTER DOMAIN %s\n",
+ fmtQualifiedDumpable(tyinfo));
+ appendPQExpBuffer(q, " ADD CONSTRAINT %s %s;\n",
+ fmtId(coninfo->dobj.name),
+ coninfo->condef);
+
+ appendPQExpBuffer(delq, "ALTER DOMAIN %s ",
+ fmtQualifiedDumpable(tyinfo));
+ appendPQExpBuffer(delq, "DROP CONSTRAINT %s;\n",
+ fmtId(coninfo->dobj.name));
+
+ tag = psprintf("%s %s", tyinfo->dobj.name, coninfo->dobj.name);
+
+ if (coninfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = tyinfo->dobj.namespace->dobj.name,
+ .owner = tyinfo->rolname,
+ .description = "CHECK CONSTRAINT",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+ }
+ }
+ else
+ {
+ pg_fatal("unrecognized constraint type: %c",
+ coninfo->contype);
+ }
+
+ /* Dump Constraint Comments --- only works for table constraints */
+ if (tbinfo && coninfo->separate &&
+ coninfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpTableConstraintComment(fout, coninfo);
+
+ free(tag);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+}
+
+/*
+ * dumpTableConstraintComment --- dump a constraint's comment if any
+ *
+ * This is split out because we need the function in two different places
+ * depending on whether the constraint is dumped as part of CREATE TABLE
+ * or as a separate ALTER command.
+ */
+static void
+dumpTableConstraintComment(Archive *fout, const ConstraintInfo *coninfo)
+{
+ TableInfo *tbinfo = coninfo->contable;
+ PQExpBuffer conprefix = createPQExpBuffer();
+ char *qtabname;
+
+ qtabname = pg_strdup(fmtId(tbinfo->dobj.name));
+
+ appendPQExpBuffer(conprefix, "CONSTRAINT %s ON",
+ fmtId(coninfo->dobj.name));
+
+ if (coninfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, conprefix->data, qtabname,
+ tbinfo->dobj.namespace->dobj.name,
+ tbinfo->rolname,
+ coninfo->dobj.catId, 0,
+ coninfo->separate ? coninfo->dobj.dumpId : tbinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(conprefix);
+ free(qtabname);
+}
+
+/*
+ * dumpSequence
+ * write the declaration (not data) of one user-defined sequence
+ */
+static void
+dumpSequence(Archive *fout, const TableInfo *tbinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PGresult *res;
+ char *startv,
+ *incby,
+ *maxv,
+ *minv,
+ *cache,
+ *seqtype;
+ bool cycled;
+ bool is_ascending;
+ int64 default_minv,
+ default_maxv;
+ char bufm[32],
+ bufx[32];
+ PQExpBuffer query = createPQExpBuffer();
+ PQExpBuffer delqry = createPQExpBuffer();
+ char *qseqname;
+ TableInfo *owning_tab = NULL;
+
+ qseqname = pg_strdup(fmtId(tbinfo->dobj.name));
+
+ if (fout->remoteVersion >= 100000)
+ {
+ appendPQExpBuffer(query,
+ "SELECT format_type(seqtypid, NULL), "
+ "seqstart, seqincrement, "
+ "seqmax, seqmin, "
+ "seqcache, seqcycle "
+ "FROM pg_catalog.pg_sequence "
+ "WHERE seqrelid = '%u'::oid",
+ tbinfo->dobj.catId.oid);
+ }
+ else
+ {
+ /*
+ * Before PostgreSQL 10, sequence metadata is in the sequence itself.
+ *
+ * Note: it might seem that 'bigint' potentially needs to be
+ * schema-qualified, but actually that's a keyword.
+ */
+ appendPQExpBuffer(query,
+ "SELECT 'bigint' AS sequence_type, "
+ "start_value, increment_by, max_value, min_value, "
+ "cache_value, is_cycled FROM %s",
+ fmtQualifiedDumpable(tbinfo));
+ }
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ if (PQntuples(res) != 1)
+ pg_fatal(ngettext("query to get data of sequence \"%s\" returned %d row (expected 1)",
+ "query to get data of sequence \"%s\" returned %d rows (expected 1)",
+ PQntuples(res)),
+ tbinfo->dobj.name, PQntuples(res));
+
+ seqtype = PQgetvalue(res, 0, 0);
+ startv = PQgetvalue(res, 0, 1);
+ incby = PQgetvalue(res, 0, 2);
+ maxv = PQgetvalue(res, 0, 3);
+ minv = PQgetvalue(res, 0, 4);
+ cache = PQgetvalue(res, 0, 5);
+ cycled = (strcmp(PQgetvalue(res, 0, 6), "t") == 0);
+
+ /* Calculate default limits for a sequence of this type */
+ is_ascending = (incby[0] != '-');
+ if (strcmp(seqtype, "smallint") == 0)
+ {
+ default_minv = is_ascending ? 1 : PG_INT16_MIN;
+ default_maxv = is_ascending ? PG_INT16_MAX : -1;
+ }
+ else if (strcmp(seqtype, "integer") == 0)
+ {
+ default_minv = is_ascending ? 1 : PG_INT32_MIN;
+ default_maxv = is_ascending ? PG_INT32_MAX : -1;
+ }
+ else if (strcmp(seqtype, "bigint") == 0)
+ {
+ default_minv = is_ascending ? 1 : PG_INT64_MIN;
+ default_maxv = is_ascending ? PG_INT64_MAX : -1;
+ }
+ else
+ {
+ pg_fatal("unrecognized sequence type: %s", seqtype);
+ default_minv = default_maxv = 0; /* keep compiler quiet */
+ }
+
+ /*
+ * 64-bit strtol() isn't very portable, so convert the limits to strings
+ * and compare that way.
+ */
+ snprintf(bufm, sizeof(bufm), INT64_FORMAT, default_minv);
+ snprintf(bufx, sizeof(bufx), INT64_FORMAT, default_maxv);
+
+ /* Don't print minv/maxv if they match the respective default limit */
+ if (strcmp(minv, bufm) == 0)
+ minv = NULL;
+ if (strcmp(maxv, bufx) == 0)
+ maxv = NULL;
+
+ /*
+ * Identity sequences are not to be dropped separately.
+ */
+ if (!tbinfo->is_identity_sequence)
+ {
+ appendPQExpBuffer(delqry, "DROP SEQUENCE %s;\n",
+ fmtQualifiedDumpable(tbinfo));
+ }
+
+ resetPQExpBuffer(query);
+
+ if (dopt->binary_upgrade)
+ {
+ binary_upgrade_set_pg_class_oids(fout, query,
+ tbinfo->dobj.catId.oid, false);
+
+ /*
+ * In older PG versions a sequence will have a pg_type entry, but v14
+ * and up don't use that, so don't attempt to preserve the type OID.
+ */
+ }
+
+ if (tbinfo->is_identity_sequence)
+ {
+ owning_tab = findTableByOid(tbinfo->owning_tab);
+
+ appendPQExpBuffer(query,
+ "ALTER TABLE %s ",
+ fmtQualifiedDumpable(owning_tab));
+ appendPQExpBuffer(query,
+ "ALTER COLUMN %s ADD GENERATED ",
+ fmtId(owning_tab->attnames[tbinfo->owning_col - 1]));
+ if (owning_tab->attidentity[tbinfo->owning_col - 1] == ATTRIBUTE_IDENTITY_ALWAYS)
+ appendPQExpBufferStr(query, "ALWAYS");
+ else if (owning_tab->attidentity[tbinfo->owning_col - 1] == ATTRIBUTE_IDENTITY_BY_DEFAULT)
+ appendPQExpBufferStr(query, "BY DEFAULT");
+ appendPQExpBuffer(query, " AS IDENTITY (\n SEQUENCE NAME %s\n",
+ fmtQualifiedDumpable(tbinfo));
+ }
+ else
+ {
+ appendPQExpBuffer(query,
+ "CREATE %sSEQUENCE %s\n",
+ tbinfo->relpersistence == RELPERSISTENCE_UNLOGGED ?
+ "UNLOGGED " : "",
+ fmtQualifiedDumpable(tbinfo));
+
+ if (strcmp(seqtype, "bigint") != 0)
+ appendPQExpBuffer(query, " AS %s\n", seqtype);
+ }
+
+ appendPQExpBuffer(query, " START WITH %s\n", startv);
+
+ appendPQExpBuffer(query, " INCREMENT BY %s\n", incby);
+
+ if (minv)
+ appendPQExpBuffer(query, " MINVALUE %s\n", minv);
+ else
+ appendPQExpBufferStr(query, " NO MINVALUE\n");
+
+ if (maxv)
+ appendPQExpBuffer(query, " MAXVALUE %s\n", maxv);
+ else
+ appendPQExpBufferStr(query, " NO MAXVALUE\n");
+
+ appendPQExpBuffer(query,
+ " CACHE %s%s",
+ cache, (cycled ? "\n CYCLE" : ""));
+
+ if (tbinfo->is_identity_sequence)
+ {
+ appendPQExpBufferStr(query, "\n);\n");
+ if (tbinfo->relpersistence != owning_tab->relpersistence)
+ appendPQExpBuffer(query,
+ "ALTER SEQUENCE %s SET %s;\n",
+ fmtQualifiedDumpable(tbinfo),
+ tbinfo->relpersistence == RELPERSISTENCE_UNLOGGED ?
+ "UNLOGGED" : "LOGGED");
+ }
+ else
+ appendPQExpBufferStr(query, ";\n");
+
+ /* binary_upgrade: no need to clear TOAST table oid */
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(query, &tbinfo->dobj,
+ "SEQUENCE", qseqname,
+ tbinfo->dobj.namespace->dobj.name);
+
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tbinfo->dobj.name,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "SEQUENCE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = query->data,
+ .dropStmt = delqry->data));
+
+ /*
+ * If the sequence is owned by a table column, emit the ALTER for it as a
+ * separate TOC entry immediately following the sequence's own entry. It's
+ * OK to do this rather than using full sorting logic, because the
+ * dependency that tells us it's owned will have forced the table to be
+ * created first. We can't just include the ALTER in the TOC entry
+ * because it will fail if we haven't reassigned the sequence owner to
+ * match the table's owner.
+ *
+ * We need not schema-qualify the table reference because both sequence
+ * and table must be in the same schema.
+ */
+ if (OidIsValid(tbinfo->owning_tab) && !tbinfo->is_identity_sequence)
+ {
+ owning_tab = findTableByOid(tbinfo->owning_tab);
+
+ if (owning_tab == NULL)
+ pg_fatal("failed sanity check, parent table with OID %u of sequence with OID %u not found",
+ tbinfo->owning_tab, tbinfo->dobj.catId.oid);
+
+ if (owning_tab->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ {
+ resetPQExpBuffer(query);
+ appendPQExpBuffer(query, "ALTER SEQUENCE %s",
+ fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(query, " OWNED BY %s",
+ fmtQualifiedDumpable(owning_tab));
+ appendPQExpBuffer(query, ".%s;\n",
+ fmtId(owning_tab->attnames[tbinfo->owning_col - 1]));
+
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = tbinfo->dobj.name,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "SEQUENCE OWNED BY",
+ .section = SECTION_PRE_DATA,
+ .createStmt = query->data,
+ .deps = &(tbinfo->dobj.dumpId),
+ .nDeps = 1));
+ }
+ }
+
+ /* Dump Sequence Comments and Security Labels */
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "SEQUENCE", qseqname,
+ tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
+ tbinfo->dobj.catId, 0, tbinfo->dobj.dumpId);
+
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "SEQUENCE", qseqname,
+ tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
+ tbinfo->dobj.catId, 0, tbinfo->dobj.dumpId);
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(delqry);
+ free(qseqname);
+}
+
+/*
+ * dumpSequenceData
+ * write the data of one user-defined sequence
+ */
+static void
+dumpSequenceData(Archive *fout, const TableDataInfo *tdinfo)
+{
+ TableInfo *tbinfo = tdinfo->tdtable;
+ PGresult *res;
+ char *last;
+ bool called;
+ PQExpBuffer query = createPQExpBuffer();
+
+ appendPQExpBuffer(query,
+ "SELECT last_value, is_called FROM %s",
+ fmtQualifiedDumpable(tbinfo));
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ if (PQntuples(res) != 1)
+ pg_fatal(ngettext("query to get data of sequence \"%s\" returned %d row (expected 1)",
+ "query to get data of sequence \"%s\" returned %d rows (expected 1)",
+ PQntuples(res)),
+ tbinfo->dobj.name, PQntuples(res));
+
+ last = PQgetvalue(res, 0, 0);
+ called = (strcmp(PQgetvalue(res, 0, 1), "t") == 0);
+
+ resetPQExpBuffer(query);
+ appendPQExpBufferStr(query, "SELECT pg_catalog.setval(");
+ appendStringLiteralAH(query, fmtQualifiedDumpable(tbinfo), fout);
+ appendPQExpBuffer(query, ", %s, %s);\n",
+ last, (called ? "true" : "false"));
+
+ if (tdinfo->dobj.dump & DUMP_COMPONENT_DATA)
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = tbinfo->dobj.name,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "SEQUENCE SET",
+ .section = SECTION_DATA,
+ .createStmt = query->data,
+ .deps = &(tbinfo->dobj.dumpId),
+ .nDeps = 1));
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpTrigger
+ * write the declaration of one user-defined table trigger
+ */
+static void
+dumpTrigger(Archive *fout, const TriggerInfo *tginfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ TableInfo *tbinfo = tginfo->tgtable;
+ PQExpBuffer query;
+ PQExpBuffer delqry;
+ PQExpBuffer trigprefix;
+ PQExpBuffer trigidentity;
+ char *qtabname;
+ char *tgargs;
+ size_t lentgargs;
+ const char *p;
+ int findx;
+ char *tag;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ query = createPQExpBuffer();
+ delqry = createPQExpBuffer();
+ trigprefix = createPQExpBuffer();
+ trigidentity = createPQExpBuffer();
+
+ qtabname = pg_strdup(fmtId(tbinfo->dobj.name));
+
+ appendPQExpBuffer(trigidentity, "%s ", fmtId(tginfo->dobj.name));
+ appendPQExpBuffer(trigidentity, "ON %s", fmtQualifiedDumpable(tbinfo));
+
+ appendPQExpBuffer(delqry, "DROP TRIGGER %s;\n", trigidentity->data);
+
+ if (tginfo->tgdef)
+ {
+ appendPQExpBuffer(query, "%s;\n", tginfo->tgdef);
+ }
+ else
+ {
+ if (tginfo->tgisconstraint)
+ {
+ appendPQExpBufferStr(query, "CREATE CONSTRAINT TRIGGER ");
+ appendPQExpBufferStr(query, fmtId(tginfo->tgconstrname));
+ }
+ else
+ {
+ appendPQExpBufferStr(query, "CREATE TRIGGER ");
+ appendPQExpBufferStr(query, fmtId(tginfo->dobj.name));
+ }
+ appendPQExpBufferStr(query, "\n ");
+
+ /* Trigger type */
+ if (TRIGGER_FOR_BEFORE(tginfo->tgtype))
+ appendPQExpBufferStr(query, "BEFORE");
+ else if (TRIGGER_FOR_AFTER(tginfo->tgtype))
+ appendPQExpBufferStr(query, "AFTER");
+ else if (TRIGGER_FOR_INSTEAD(tginfo->tgtype))
+ appendPQExpBufferStr(query, "INSTEAD OF");
+ else
+ pg_fatal("unexpected tgtype value: %d", tginfo->tgtype);
+
+ findx = 0;
+ if (TRIGGER_FOR_INSERT(tginfo->tgtype))
+ {
+ appendPQExpBufferStr(query, " INSERT");
+ findx++;
+ }
+ if (TRIGGER_FOR_DELETE(tginfo->tgtype))
+ {
+ if (findx > 0)
+ appendPQExpBufferStr(query, " OR DELETE");
+ else
+ appendPQExpBufferStr(query, " DELETE");
+ findx++;
+ }
+ if (TRIGGER_FOR_UPDATE(tginfo->tgtype))
+ {
+ if (findx > 0)
+ appendPQExpBufferStr(query, " OR UPDATE");
+ else
+ appendPQExpBufferStr(query, " UPDATE");
+ findx++;
+ }
+ if (TRIGGER_FOR_TRUNCATE(tginfo->tgtype))
+ {
+ if (findx > 0)
+ appendPQExpBufferStr(query, " OR TRUNCATE");
+ else
+ appendPQExpBufferStr(query, " TRUNCATE");
+ findx++;
+ }
+ appendPQExpBuffer(query, " ON %s\n",
+ fmtQualifiedDumpable(tbinfo));
+
+ if (tginfo->tgisconstraint)
+ {
+ if (OidIsValid(tginfo->tgconstrrelid))
+ {
+ /* regclass output is already quoted */
+ appendPQExpBuffer(query, " FROM %s\n ",
+ tginfo->tgconstrrelname);
+ }
+ if (!tginfo->tgdeferrable)
+ appendPQExpBufferStr(query, "NOT ");
+ appendPQExpBufferStr(query, "DEFERRABLE INITIALLY ");
+ if (tginfo->tginitdeferred)
+ appendPQExpBufferStr(query, "DEFERRED\n");
+ else
+ appendPQExpBufferStr(query, "IMMEDIATE\n");
+ }
+
+ if (TRIGGER_FOR_ROW(tginfo->tgtype))
+ appendPQExpBufferStr(query, " FOR EACH ROW\n ");
+ else
+ appendPQExpBufferStr(query, " FOR EACH STATEMENT\n ");
+
+ /* regproc output is already sufficiently quoted */
+ appendPQExpBuffer(query, "EXECUTE FUNCTION %s(",
+ tginfo->tgfname);
+
+ tgargs = (char *) PQunescapeBytea((unsigned char *) tginfo->tgargs,
+ &lentgargs);
+ p = tgargs;
+ for (findx = 0; findx < tginfo->tgnargs; findx++)
+ {
+ /* find the embedded null that terminates this trigger argument */
+ size_t tlen = strlen(p);
+
+ if (p + tlen >= tgargs + lentgargs)
+ {
+ /* hm, not found before end of bytea value... */
+ pg_fatal("invalid argument string (%s) for trigger \"%s\" on table \"%s\"",
+ tginfo->tgargs,
+ tginfo->dobj.name,
+ tbinfo->dobj.name);
+ }
+
+ if (findx > 0)
+ appendPQExpBufferStr(query, ", ");
+ appendStringLiteralAH(query, p, fout);
+ p += tlen + 1;
+ }
+ free(tgargs);
+ appendPQExpBufferStr(query, ");\n");
+ }
+
+ /* Triggers can depend on extensions */
+ append_depends_on_extension(fout, query, &tginfo->dobj,
+ "pg_catalog.pg_trigger", "TRIGGER",
+ trigidentity->data);
+
+ if (tginfo->tgispartition)
+ {
+ Assert(tbinfo->ispartition);
+
+ /*
+ * Partition triggers only appear here because their 'tgenabled' flag
+ * differs from its parent's. The trigger is created already, so
+ * remove the CREATE and replace it with an ALTER. (Clear out the
+ * DROP query too, so that pg_dump --create does not cause errors.)
+ */
+ resetPQExpBuffer(query);
+ resetPQExpBuffer(delqry);
+ appendPQExpBuffer(query, "\nALTER %sTABLE %s ",
+ tbinfo->relkind == RELKIND_FOREIGN_TABLE ? "FOREIGN " : "",
+ fmtQualifiedDumpable(tbinfo));
+ switch (tginfo->tgenabled)
+ {
+ case 'f':
+ case 'D':
+ appendPQExpBufferStr(query, "DISABLE");
+ break;
+ case 't':
+ case 'O':
+ appendPQExpBufferStr(query, "ENABLE");
+ break;
+ case 'R':
+ appendPQExpBufferStr(query, "ENABLE REPLICA");
+ break;
+ case 'A':
+ appendPQExpBufferStr(query, "ENABLE ALWAYS");
+ break;
+ }
+ appendPQExpBuffer(query, " TRIGGER %s;\n",
+ fmtId(tginfo->dobj.name));
+ }
+ else if (tginfo->tgenabled != 't' && tginfo->tgenabled != 'O')
+ {
+ appendPQExpBuffer(query, "\nALTER %sTABLE %s ",
+ tbinfo->relkind == RELKIND_FOREIGN_TABLE ? "FOREIGN " : "",
+ fmtQualifiedDumpable(tbinfo));
+ switch (tginfo->tgenabled)
+ {
+ case 'D':
+ case 'f':
+ appendPQExpBufferStr(query, "DISABLE");
+ break;
+ case 'A':
+ appendPQExpBufferStr(query, "ENABLE ALWAYS");
+ break;
+ case 'R':
+ appendPQExpBufferStr(query, "ENABLE REPLICA");
+ break;
+ default:
+ appendPQExpBufferStr(query, "ENABLE");
+ break;
+ }
+ appendPQExpBuffer(query, " TRIGGER %s;\n",
+ fmtId(tginfo->dobj.name));
+ }
+
+ appendPQExpBuffer(trigprefix, "TRIGGER %s ON",
+ fmtId(tginfo->dobj.name));
+
+ tag = psprintf("%s %s", tbinfo->dobj.name, tginfo->dobj.name);
+
+ if (tginfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tginfo->dobj.catId, tginfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "TRIGGER",
+ .section = SECTION_POST_DATA,
+ .createStmt = query->data,
+ .dropStmt = delqry->data));
+
+ if (tginfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, trigprefix->data, qtabname,
+ tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
+ tginfo->dobj.catId, 0, tginfo->dobj.dumpId);
+
+ free(tag);
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(delqry);
+ destroyPQExpBuffer(trigprefix);
+ destroyPQExpBuffer(trigidentity);
+ free(qtabname);
+}
+
+/*
+ * dumpEventTrigger
+ * write the declaration of one user-defined event trigger
+ */
+static void
+dumpEventTrigger(Archive *fout, const EventTriggerInfo *evtinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PQExpBuffer delqry;
+ char *qevtname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ query = createPQExpBuffer();
+ delqry = createPQExpBuffer();
+
+ qevtname = pg_strdup(fmtId(evtinfo->dobj.name));
+
+ appendPQExpBufferStr(query, "CREATE EVENT TRIGGER ");
+ appendPQExpBufferStr(query, qevtname);
+ appendPQExpBufferStr(query, " ON ");
+ appendPQExpBufferStr(query, fmtId(evtinfo->evtevent));
+
+ if (strcmp("", evtinfo->evttags) != 0)
+ {
+ appendPQExpBufferStr(query, "\n WHEN TAG IN (");
+ appendPQExpBufferStr(query, evtinfo->evttags);
+ appendPQExpBufferChar(query, ')');
+ }
+
+ appendPQExpBufferStr(query, "\n EXECUTE FUNCTION ");
+ appendPQExpBufferStr(query, evtinfo->evtfname);
+ appendPQExpBufferStr(query, "();\n");
+
+ if (evtinfo->evtenabled != 'O')
+ {
+ appendPQExpBuffer(query, "\nALTER EVENT TRIGGER %s ",
+ qevtname);
+ switch (evtinfo->evtenabled)
+ {
+ case 'D':
+ appendPQExpBufferStr(query, "DISABLE");
+ break;
+ case 'A':
+ appendPQExpBufferStr(query, "ENABLE ALWAYS");
+ break;
+ case 'R':
+ appendPQExpBufferStr(query, "ENABLE REPLICA");
+ break;
+ default:
+ appendPQExpBufferStr(query, "ENABLE");
+ break;
+ }
+ appendPQExpBufferStr(query, ";\n");
+ }
+
+ appendPQExpBuffer(delqry, "DROP EVENT TRIGGER %s;\n",
+ qevtname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(query, &evtinfo->dobj,
+ "EVENT TRIGGER", qevtname, NULL);
+
+ if (evtinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, evtinfo->dobj.catId, evtinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = evtinfo->dobj.name,
+ .owner = evtinfo->evtowner,
+ .description = "EVENT TRIGGER",
+ .section = SECTION_POST_DATA,
+ .createStmt = query->data,
+ .dropStmt = delqry->data));
+
+ if (evtinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "EVENT TRIGGER", qevtname,
+ NULL, evtinfo->evtowner,
+ evtinfo->dobj.catId, 0, evtinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(delqry);
+ free(qevtname);
+}
+
+/*
+ * dumpRule
+ * Dump a rule
+ */
+static void
+dumpRule(Archive *fout, const RuleInfo *rinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ TableInfo *tbinfo = rinfo->ruletable;
+ bool is_view;
+ PQExpBuffer query;
+ PQExpBuffer cmd;
+ PQExpBuffer delcmd;
+ PQExpBuffer ruleprefix;
+ char *qtabname;
+ PGresult *res;
+ char *tag;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ /*
+ * If it is an ON SELECT rule that is created implicitly by CREATE VIEW,
+ * we do not want to dump it as a separate object.
+ */
+ if (!rinfo->separate)
+ return;
+
+ /*
+ * If it's an ON SELECT rule, we want to print it as a view definition,
+ * instead of a rule.
+ */
+ is_view = (rinfo->ev_type == '1' && rinfo->is_instead);
+
+ query = createPQExpBuffer();
+ cmd = createPQExpBuffer();
+ delcmd = createPQExpBuffer();
+ ruleprefix = createPQExpBuffer();
+
+ qtabname = pg_strdup(fmtId(tbinfo->dobj.name));
+
+ if (is_view)
+ {
+ PQExpBuffer result;
+
+ /*
+ * We need OR REPLACE here because we'll be replacing a dummy view.
+ * Otherwise this should look largely like the regular view dump code.
+ */
+ appendPQExpBuffer(cmd, "CREATE OR REPLACE VIEW %s",
+ fmtQualifiedDumpable(tbinfo));
+ if (nonemptyReloptions(tbinfo->reloptions))
+ {
+ appendPQExpBufferStr(cmd, " WITH (");
+ appendReloptionsArrayAH(cmd, tbinfo->reloptions, "", fout);
+ appendPQExpBufferChar(cmd, ')');
+ }
+ result = createViewAsClause(fout, tbinfo);
+ appendPQExpBuffer(cmd, " AS\n%s", result->data);
+ destroyPQExpBuffer(result);
+ if (tbinfo->checkoption != NULL)
+ appendPQExpBuffer(cmd, "\n WITH %s CHECK OPTION",
+ tbinfo->checkoption);
+ appendPQExpBufferStr(cmd, ";\n");
+ }
+ else
+ {
+ /* In the rule case, just print pg_get_ruledef's result verbatim */
+ appendPQExpBuffer(query,
+ "SELECT pg_catalog.pg_get_ruledef('%u'::pg_catalog.oid)",
+ rinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ if (PQntuples(res) != 1)
+ pg_fatal("query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned",
+ rinfo->dobj.name, tbinfo->dobj.name);
+
+ printfPQExpBuffer(cmd, "%s\n", PQgetvalue(res, 0, 0));
+
+ PQclear(res);
+ }
+
+ /*
+ * Add the command to alter the rules replication firing semantics if it
+ * differs from the default.
+ */
+ if (rinfo->ev_enabled != 'O')
+ {
+ appendPQExpBuffer(cmd, "ALTER TABLE %s ", fmtQualifiedDumpable(tbinfo));
+ switch (rinfo->ev_enabled)
+ {
+ case 'A':
+ appendPQExpBuffer(cmd, "ENABLE ALWAYS RULE %s;\n",
+ fmtId(rinfo->dobj.name));
+ break;
+ case 'R':
+ appendPQExpBuffer(cmd, "ENABLE REPLICA RULE %s;\n",
+ fmtId(rinfo->dobj.name));
+ break;
+ case 'D':
+ appendPQExpBuffer(cmd, "DISABLE RULE %s;\n",
+ fmtId(rinfo->dobj.name));
+ break;
+ }
+ }
+
+ if (is_view)
+ {
+ /*
+ * We can't DROP a view's ON SELECT rule. Instead, use CREATE OR
+ * REPLACE VIEW to replace the rule with something with minimal
+ * dependencies.
+ */
+ PQExpBuffer result;
+
+ appendPQExpBuffer(delcmd, "CREATE OR REPLACE VIEW %s",
+ fmtQualifiedDumpable(tbinfo));
+ result = createDummyViewAsClause(fout, tbinfo);
+ appendPQExpBuffer(delcmd, " AS\n%s;\n", result->data);
+ destroyPQExpBuffer(result);
+ }
+ else
+ {
+ appendPQExpBuffer(delcmd, "DROP RULE %s ",
+ fmtId(rinfo->dobj.name));
+ appendPQExpBuffer(delcmd, "ON %s;\n",
+ fmtQualifiedDumpable(tbinfo));
+ }
+
+ appendPQExpBuffer(ruleprefix, "RULE %s ON",
+ fmtId(rinfo->dobj.name));
+
+ tag = psprintf("%s %s", tbinfo->dobj.name, rinfo->dobj.name);
+
+ if (rinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, rinfo->dobj.catId, rinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "RULE",
+ .section = SECTION_POST_DATA,
+ .createStmt = cmd->data,
+ .dropStmt = delcmd->data));
+
+ /* Dump rule comments */
+ if (rinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, ruleprefix->data, qtabname,
+ tbinfo->dobj.namespace->dobj.name,
+ tbinfo->rolname,
+ rinfo->dobj.catId, 0, rinfo->dobj.dumpId);
+
+ free(tag);
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(cmd);
+ destroyPQExpBuffer(delcmd);
+ destroyPQExpBuffer(ruleprefix);
+ free(qtabname);
+}
+
+/*
+ * getExtensionMembership --- obtain extension membership data
+ *
+ * We need to identify objects that are extension members as soon as they're
+ * loaded, so that we can correctly determine whether they need to be dumped.
+ * Generally speaking, extension member objects will get marked as *not* to
+ * be dumped, as they will be recreated by the single CREATE EXTENSION
+ * command. However, in binary upgrade mode we still need to dump the members
+ * individually.
+ */
+void
+getExtensionMembership(Archive *fout, ExtensionInfo extinfo[],
+ int numExtensions)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ int ntups,
+ i;
+ int i_classid,
+ i_objid,
+ i_refobjid;
+ ExtensionInfo *ext;
+
+ /* Nothing to do if no extensions */
+ if (numExtensions == 0)
+ return;
+
+ query = createPQExpBuffer();
+
+ /* refclassid constraint is redundant but may speed the search */
+ appendPQExpBufferStr(query, "SELECT "
+ "classid, objid, refobjid "
+ "FROM pg_depend "
+ "WHERE refclassid = 'pg_extension'::regclass "
+ "AND deptype = 'e' "
+ "ORDER BY 3");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_classid = PQfnumber(res, "classid");
+ i_objid = PQfnumber(res, "objid");
+ i_refobjid = PQfnumber(res, "refobjid");
+
+ /*
+ * Since we ordered the SELECT by referenced ID, we can expect that
+ * multiple entries for the same extension will appear together; this
+ * saves on searches.
+ */
+ ext = NULL;
+
+ for (i = 0; i < ntups; i++)
+ {
+ CatalogId objId;
+ Oid extId;
+
+ objId.tableoid = atooid(PQgetvalue(res, i, i_classid));
+ objId.oid = atooid(PQgetvalue(res, i, i_objid));
+ extId = atooid(PQgetvalue(res, i, i_refobjid));
+
+ if (ext == NULL ||
+ ext->dobj.catId.oid != extId)
+ ext = findExtensionByOid(extId);
+
+ if (ext == NULL)
+ {
+ /* shouldn't happen */
+ pg_log_warning("could not find referenced extension %u", extId);
+ continue;
+ }
+
+ recordExtensionMembership(objId, ext);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * processExtensionTables --- deal with extension configuration tables
+ *
+ * There are two parts to this process:
+ *
+ * 1. Identify and create dump records for extension configuration tables.
+ *
+ * Extensions can mark tables as "configuration", which means that the user
+ * is able and expected to modify those tables after the extension has been
+ * loaded. For these tables, we dump out only the data- the structure is
+ * expected to be handled at CREATE EXTENSION time, including any indexes or
+ * foreign keys, which brings us to-
+ *
+ * 2. Record FK dependencies between configuration tables.
+ *
+ * Due to the FKs being created at CREATE EXTENSION time and therefore before
+ * the data is loaded, we have to work out what the best order for reloading
+ * the data is, to avoid FK violations when the tables are restored. This is
+ * not perfect- we can't handle circular dependencies and if any exist they
+ * will cause an invalid dump to be produced (though at least all of the data
+ * is included for a user to manually restore). This is currently documented
+ * but perhaps we can provide a better solution in the future.
+ */
+void
+processExtensionTables(Archive *fout, ExtensionInfo extinfo[],
+ int numExtensions)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PGresult *res;
+ int ntups,
+ i;
+ int i_conrelid,
+ i_confrelid;
+
+ /* Nothing to do if no extensions */
+ if (numExtensions == 0)
+ return;
+
+ /*
+ * Identify extension configuration tables and create TableDataInfo
+ * objects for them, ensuring their data will be dumped even though the
+ * tables themselves won't be.
+ *
+ * Note that we create TableDataInfo objects even in schemaOnly mode, ie,
+ * user data in a configuration table is treated like schema data. This
+ * seems appropriate since system data in a config table would get
+ * reloaded by CREATE EXTENSION. If the extension is not listed in the
+ * list of extensions to be included, none of its data is dumped.
+ */
+ for (i = 0; i < numExtensions; i++)
+ {
+ ExtensionInfo *curext = &(extinfo[i]);
+ char *extconfig = curext->extconfig;
+ char *extcondition = curext->extcondition;
+ char **extconfigarray = NULL;
+ char **extconditionarray = NULL;
+ int nconfigitems = 0;
+ int nconditionitems = 0;
+
+ /*
+ * Check if this extension is listed as to include in the dump. If
+ * not, any table data associated with it is discarded.
+ */
+ if (extension_include_oids.head != NULL &&
+ !simple_oid_list_member(&extension_include_oids,
+ curext->dobj.catId.oid))
+ continue;
+
+ if (strlen(extconfig) != 0 || strlen(extcondition) != 0)
+ {
+ int j;
+
+ if (!parsePGArray(extconfig, &extconfigarray, &nconfigitems))
+ pg_fatal("could not parse %s array", "extconfig");
+ if (!parsePGArray(extcondition, &extconditionarray, &nconditionitems))
+ pg_fatal("could not parse %s array", "extcondition");
+ if (nconfigitems != nconditionitems)
+ pg_fatal("mismatched number of configurations and conditions for extension");
+
+ for (j = 0; j < nconfigitems; j++)
+ {
+ TableInfo *configtbl;
+ Oid configtbloid = atooid(extconfigarray[j]);
+ bool dumpobj =
+ curext->dobj.dump & DUMP_COMPONENT_DEFINITION;
+
+ configtbl = findTableByOid(configtbloid);
+ if (configtbl == NULL)
+ continue;
+
+ /*
+ * Tables of not-to-be-dumped extensions shouldn't be dumped
+ * unless the table or its schema is explicitly included
+ */
+ if (!(curext->dobj.dump & DUMP_COMPONENT_DEFINITION))
+ {
+ /* check table explicitly requested */
+ if (table_include_oids.head != NULL &&
+ simple_oid_list_member(&table_include_oids,
+ configtbloid))
+ dumpobj = true;
+
+ /* check table's schema explicitly requested */
+ if (configtbl->dobj.namespace->dobj.dump &
+ DUMP_COMPONENT_DATA)
+ dumpobj = true;
+ }
+
+ /* check table excluded by an exclusion switch */
+ if (table_exclude_oids.head != NULL &&
+ simple_oid_list_member(&table_exclude_oids,
+ configtbloid))
+ dumpobj = false;
+
+ /* check schema excluded by an exclusion switch */
+ if (simple_oid_list_member(&schema_exclude_oids,
+ configtbl->dobj.namespace->dobj.catId.oid))
+ dumpobj = false;
+
+ if (dumpobj)
+ {
+ makeTableDataInfo(dopt, configtbl);
+ if (configtbl->dataObj != NULL)
+ {
+ if (strlen(extconditionarray[j]) > 0)
+ configtbl->dataObj->filtercond = pg_strdup(extconditionarray[j]);
+ }
+ }
+ }
+ }
+ if (extconfigarray)
+ free(extconfigarray);
+ if (extconditionarray)
+ free(extconditionarray);
+ }
+
+ /*
+ * Now that all the TableDataInfo objects have been created for all the
+ * extensions, check their FK dependencies and register them to try and
+ * dump the data out in an order that they can be restored in.
+ *
+ * Note that this is not a problem for user tables as their FKs are
+ * recreated after the data has been loaded.
+ */
+
+ query = createPQExpBuffer();
+
+ printfPQExpBuffer(query,
+ "SELECT conrelid, confrelid "
+ "FROM pg_constraint "
+ "JOIN pg_depend ON (objid = confrelid) "
+ "WHERE contype = 'f' "
+ "AND refclassid = 'pg_extension'::regclass "
+ "AND classid = 'pg_class'::regclass;");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+ ntups = PQntuples(res);
+
+ i_conrelid = PQfnumber(res, "conrelid");
+ i_confrelid = PQfnumber(res, "confrelid");
+
+ /* Now get the dependencies and register them */
+ for (i = 0; i < ntups; i++)
+ {
+ Oid conrelid,
+ confrelid;
+ TableInfo *reftable,
+ *contable;
+
+ conrelid = atooid(PQgetvalue(res, i, i_conrelid));
+ confrelid = atooid(PQgetvalue(res, i, i_confrelid));
+ contable = findTableByOid(conrelid);
+ reftable = findTableByOid(confrelid);
+
+ if (reftable == NULL ||
+ reftable->dataObj == NULL ||
+ contable == NULL ||
+ contable->dataObj == NULL)
+ continue;
+
+ /*
+ * Make referencing TABLE_DATA object depend on the referenced table's
+ * TABLE_DATA object.
+ */
+ addObjectDependency(&contable->dataObj->dobj,
+ reftable->dataObj->dobj.dumpId);
+ }
+ PQclear(res);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * getDependencies --- obtain available dependency data
+ */
+static void
+getDependencies(Archive *fout)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ int ntups,
+ i;
+ int i_classid,
+ i_objid,
+ i_refclassid,
+ i_refobjid,
+ i_deptype;
+ DumpableObject *dobj,
+ *refdobj;
+
+ pg_log_info("reading dependency data");
+
+ query = createPQExpBuffer();
+
+ /*
+ * Messy query to collect the dependency data we need. Note that we
+ * ignore the sub-object column, so that dependencies of or on a column
+ * look the same as dependencies of or on a whole table.
+ *
+ * PIN dependencies aren't interesting, and EXTENSION dependencies were
+ * already processed by getExtensionMembership.
+ */
+ appendPQExpBufferStr(query, "SELECT "
+ "classid, objid, refclassid, refobjid, deptype "
+ "FROM pg_depend "
+ "WHERE deptype != 'p' AND deptype != 'e'\n");
+
+ /*
+ * Since we don't treat pg_amop entries as separate DumpableObjects, we
+ * have to translate their dependencies into dependencies of their parent
+ * opfamily. Ignore internal dependencies though, as those will point to
+ * their parent opclass, which we needn't consider here (and if we did,
+ * it'd just result in circular dependencies). Also, "loose" opfamily
+ * entries will have dependencies on their parent opfamily, which we
+ * should drop since they'd likewise become useless self-dependencies.
+ * (But be sure to keep deps on *other* opfamilies; see amopsortfamily.)
+ */
+ appendPQExpBufferStr(query, "UNION ALL\n"
+ "SELECT 'pg_opfamily'::regclass AS classid, amopfamily AS objid, refclassid, refobjid, deptype "
+ "FROM pg_depend d, pg_amop o "
+ "WHERE deptype NOT IN ('p', 'e', 'i') AND "
+ "classid = 'pg_amop'::regclass AND objid = o.oid "
+ "AND NOT (refclassid = 'pg_opfamily'::regclass AND amopfamily = refobjid)\n");
+
+ /* Likewise for pg_amproc entries */
+ appendPQExpBufferStr(query, "UNION ALL\n"
+ "SELECT 'pg_opfamily'::regclass AS classid, amprocfamily AS objid, refclassid, refobjid, deptype "
+ "FROM pg_depend d, pg_amproc p "
+ "WHERE deptype NOT IN ('p', 'e', 'i') AND "
+ "classid = 'pg_amproc'::regclass AND objid = p.oid "
+ "AND NOT (refclassid = 'pg_opfamily'::regclass AND amprocfamily = refobjid)\n");
+
+ /* Sort the output for efficiency below */
+ appendPQExpBufferStr(query, "ORDER BY 1,2");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_classid = PQfnumber(res, "classid");
+ i_objid = PQfnumber(res, "objid");
+ i_refclassid = PQfnumber(res, "refclassid");
+ i_refobjid = PQfnumber(res, "refobjid");
+ i_deptype = PQfnumber(res, "deptype");
+
+ /*
+ * Since we ordered the SELECT by referencing ID, we can expect that
+ * multiple entries for the same object will appear together; this saves
+ * on searches.
+ */
+ dobj = NULL;
+
+ for (i = 0; i < ntups; i++)
+ {
+ CatalogId objId;
+ CatalogId refobjId;
+ char deptype;
+
+ objId.tableoid = atooid(PQgetvalue(res, i, i_classid));
+ objId.oid = atooid(PQgetvalue(res, i, i_objid));
+ refobjId.tableoid = atooid(PQgetvalue(res, i, i_refclassid));
+ refobjId.oid = atooid(PQgetvalue(res, i, i_refobjid));
+ deptype = *(PQgetvalue(res, i, i_deptype));
+
+ if (dobj == NULL ||
+ dobj->catId.tableoid != objId.tableoid ||
+ dobj->catId.oid != objId.oid)
+ dobj = findObjectByCatalogId(objId);
+
+ /*
+ * Failure to find objects mentioned in pg_depend is not unexpected,
+ * since for example we don't collect info about TOAST tables.
+ */
+ if (dobj == NULL)
+ {
+#ifdef NOT_USED
+ pg_log_warning("no referencing object %u %u",
+ objId.tableoid, objId.oid);
+#endif
+ continue;
+ }
+
+ refdobj = findObjectByCatalogId(refobjId);
+
+ if (refdobj == NULL)
+ {
+#ifdef NOT_USED
+ pg_log_warning("no referenced object %u %u",
+ refobjId.tableoid, refobjId.oid);
+#endif
+ continue;
+ }
+
+ /*
+ * For 'x' dependencies, mark the object for later; we still add the
+ * normal dependency, for possible ordering purposes. Currently
+ * pg_dump_sort.c knows to put extensions ahead of all object types
+ * that could possibly depend on them, but this is safer.
+ */
+ if (deptype == 'x')
+ dobj->depends_on_ext = true;
+
+ /*
+ * Ordinarily, table rowtypes have implicit dependencies on their
+ * tables. However, for a composite type the implicit dependency goes
+ * the other way in pg_depend; which is the right thing for DROP but
+ * it doesn't produce the dependency ordering we need. So in that one
+ * case, we reverse the direction of the dependency.
+ */
+ if (deptype == 'i' &&
+ dobj->objType == DO_TABLE &&
+ refdobj->objType == DO_TYPE)
+ addObjectDependency(refdobj, dobj->dumpId);
+ else
+ /* normal case */
+ addObjectDependency(dobj, refdobj->dumpId);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+}
+
+
+/*
+ * createBoundaryObjects - create dummy DumpableObjects to represent
+ * dump section boundaries.
+ */
+static DumpableObject *
+createBoundaryObjects(void)
+{
+ DumpableObject *dobjs;
+
+ dobjs = (DumpableObject *) pg_malloc(2 * sizeof(DumpableObject));
+
+ dobjs[0].objType = DO_PRE_DATA_BOUNDARY;
+ dobjs[0].catId = nilCatalogId;
+ AssignDumpId(dobjs + 0);
+ dobjs[0].name = pg_strdup("PRE-DATA BOUNDARY");
+
+ dobjs[1].objType = DO_POST_DATA_BOUNDARY;
+ dobjs[1].catId = nilCatalogId;
+ AssignDumpId(dobjs + 1);
+ dobjs[1].name = pg_strdup("POST-DATA BOUNDARY");
+
+ return dobjs;
+}
+
+/*
+ * addBoundaryDependencies - add dependencies as needed to enforce the dump
+ * section boundaries.
+ */
+static void
+addBoundaryDependencies(DumpableObject **dobjs, int numObjs,
+ DumpableObject *boundaryObjs)
+{
+ DumpableObject *preDataBound = boundaryObjs + 0;
+ DumpableObject *postDataBound = boundaryObjs + 1;
+ int i;
+
+ for (i = 0; i < numObjs; i++)
+ {
+ DumpableObject *dobj = dobjs[i];
+
+ /*
+ * The classification of object types here must match the SECTION_xxx
+ * values assigned during subsequent ArchiveEntry calls!
+ */
+ switch (dobj->objType)
+ {
+ case DO_NAMESPACE:
+ case DO_EXTENSION:
+ case DO_TYPE:
+ case DO_SHELL_TYPE:
+ case DO_FUNC:
+ case DO_AGG:
+ case DO_OPERATOR:
+ case DO_ACCESS_METHOD:
+ case DO_OPCLASS:
+ case DO_OPFAMILY:
+ case DO_COLLATION:
+ case DO_CONVERSION:
+ case DO_TABLE:
+ case DO_TABLE_ATTACH:
+ case DO_ATTRDEF:
+ case DO_PROCLANG:
+ case DO_CAST:
+ case DO_DUMMY_TYPE:
+ case DO_TSPARSER:
+ case DO_TSDICT:
+ case DO_TSTEMPLATE:
+ case DO_TSCONFIG:
+ case DO_FDW:
+ case DO_FOREIGN_SERVER:
+ case DO_TRANSFORM:
+ case DO_BLOB:
+ /* Pre-data objects: must come before the pre-data boundary */
+ addObjectDependency(preDataBound, dobj->dumpId);
+ break;
+ case DO_TABLE_DATA:
+ case DO_SEQUENCE_SET:
+ case DO_BLOB_DATA:
+ /* Data objects: must come between the boundaries */
+ addObjectDependency(dobj, preDataBound->dumpId);
+ addObjectDependency(postDataBound, dobj->dumpId);
+ break;
+ case DO_INDEX:
+ case DO_INDEX_ATTACH:
+ case DO_STATSEXT:
+ case DO_REFRESH_MATVIEW:
+ case DO_TRIGGER:
+ case DO_EVENT_TRIGGER:
+ case DO_DEFAULT_ACL:
+ case DO_POLICY:
+ case DO_PUBLICATION:
+ case DO_PUBLICATION_REL:
+ case DO_PUBLICATION_TABLE_IN_SCHEMA:
+ case DO_SUBSCRIPTION:
+ /* Post-data objects: must come after the post-data boundary */
+ addObjectDependency(dobj, postDataBound->dumpId);
+ break;
+ case DO_RULE:
+ /* Rules are post-data, but only if dumped separately */
+ if (((RuleInfo *) dobj)->separate)
+ addObjectDependency(dobj, postDataBound->dumpId);
+ break;
+ case DO_CONSTRAINT:
+ case DO_FK_CONSTRAINT:
+ /* Constraints are post-data, but only if dumped separately */
+ if (((ConstraintInfo *) dobj)->separate)
+ addObjectDependency(dobj, postDataBound->dumpId);
+ break;
+ case DO_PRE_DATA_BOUNDARY:
+ /* nothing to do */
+ break;
+ case DO_POST_DATA_BOUNDARY:
+ /* must come after the pre-data boundary */
+ addObjectDependency(dobj, preDataBound->dumpId);
+ break;
+ }
+ }
+}
+
+
+/*
+ * BuildArchiveDependencies - create dependency data for archive TOC entries
+ *
+ * The raw dependency data obtained by getDependencies() is not terribly
+ * useful in an archive dump, because in many cases there are dependency
+ * chains linking through objects that don't appear explicitly in the dump.
+ * For example, a view will depend on its _RETURN rule while the _RETURN rule
+ * will depend on other objects --- but the rule will not appear as a separate
+ * object in the dump. We need to adjust the view's dependencies to include
+ * whatever the rule depends on that is included in the dump.
+ *
+ * Just to make things more complicated, there are also "special" dependencies
+ * such as the dependency of a TABLE DATA item on its TABLE, which we must
+ * not rearrange because pg_restore knows that TABLE DATA only depends on
+ * its table. In these cases we must leave the dependencies strictly as-is
+ * even if they refer to not-to-be-dumped objects.
+ *
+ * To handle this, the convention is that "special" dependencies are created
+ * during ArchiveEntry calls, and an archive TOC item that has any such
+ * entries will not be touched here. Otherwise, we recursively search the
+ * DumpableObject data structures to build the correct dependencies for each
+ * archive TOC item.
+ */
+static void
+BuildArchiveDependencies(Archive *fout)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) fout;
+ TocEntry *te;
+
+ /* Scan all TOC entries in the archive */
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ DumpableObject *dobj;
+ DumpId *dependencies;
+ int nDeps;
+ int allocDeps;
+
+ /* No need to process entries that will not be dumped */
+ if (te->reqs == 0)
+ continue;
+ /* Ignore entries that already have "special" dependencies */
+ if (te->nDeps > 0)
+ continue;
+ /* Otherwise, look up the item's original DumpableObject, if any */
+ dobj = findObjectByDumpId(te->dumpId);
+ if (dobj == NULL)
+ continue;
+ /* No work if it has no dependencies */
+ if (dobj->nDeps <= 0)
+ continue;
+ /* Set up work array */
+ allocDeps = 64;
+ dependencies = (DumpId *) pg_malloc(allocDeps * sizeof(DumpId));
+ nDeps = 0;
+ /* Recursively find all dumpable dependencies */
+ findDumpableDependencies(AH, dobj,
+ &dependencies, &nDeps, &allocDeps);
+ /* And save 'em ... */
+ if (nDeps > 0)
+ {
+ dependencies = (DumpId *) pg_realloc(dependencies,
+ nDeps * sizeof(DumpId));
+ te->dependencies = dependencies;
+ te->nDeps = nDeps;
+ }
+ else
+ free(dependencies);
+ }
+}
+
+/* Recursive search subroutine for BuildArchiveDependencies */
+static void
+findDumpableDependencies(ArchiveHandle *AH, const DumpableObject *dobj,
+ DumpId **dependencies, int *nDeps, int *allocDeps)
+{
+ int i;
+
+ /*
+ * Ignore section boundary objects: if we search through them, we'll
+ * report lots of bogus dependencies.
+ */
+ if (dobj->objType == DO_PRE_DATA_BOUNDARY ||
+ dobj->objType == DO_POST_DATA_BOUNDARY)
+ return;
+
+ for (i = 0; i < dobj->nDeps; i++)
+ {
+ DumpId depid = dobj->dependencies[i];
+
+ if (TocIDRequired(AH, depid) != 0)
+ {
+ /* Object will be dumped, so just reference it as a dependency */
+ if (*nDeps >= *allocDeps)
+ {
+ *allocDeps *= 2;
+ *dependencies = (DumpId *) pg_realloc(*dependencies,
+ *allocDeps * sizeof(DumpId));
+ }
+ (*dependencies)[*nDeps] = depid;
+ (*nDeps)++;
+ }
+ else
+ {
+ /*
+ * Object will not be dumped, so recursively consider its deps. We
+ * rely on the assumption that sortDumpableObjects already broke
+ * any dependency loops, else we might recurse infinitely.
+ */
+ DumpableObject *otherdobj = findObjectByDumpId(depid);
+
+ if (otherdobj)
+ findDumpableDependencies(AH, otherdobj,
+ dependencies, nDeps, allocDeps);
+ }
+ }
+}
+
+
+/*
+ * getFormattedTypeName - retrieve a nicely-formatted type name for the
+ * given type OID.
+ *
+ * This does not guarantee to schema-qualify the output, so it should not
+ * be used to create the target object name for CREATE or ALTER commands.
+ *
+ * Note that the result is cached and must not be freed by the caller.
+ */
+static const char *
+getFormattedTypeName(Archive *fout, Oid oid, OidOptions opts)
+{
+ TypeInfo *typeInfo;
+ char *result;
+ PQExpBuffer query;
+ PGresult *res;
+
+ if (oid == 0)
+ {
+ if ((opts & zeroAsStar) != 0)
+ return "*";
+ else if ((opts & zeroAsNone) != 0)
+ return "NONE";
+ }
+
+ /* see if we have the result cached in the type's TypeInfo record */
+ typeInfo = findTypeByOid(oid);
+ if (typeInfo && typeInfo->ftypname)
+ return typeInfo->ftypname;
+
+ query = createPQExpBuffer();
+ appendPQExpBuffer(query, "SELECT pg_catalog.format_type('%u'::pg_catalog.oid, NULL)",
+ oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ /* result of format_type is already quoted */
+ result = pg_strdup(PQgetvalue(res, 0, 0));
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+
+ /*
+ * Cache the result for re-use in later requests, if possible. If we
+ * don't have a TypeInfo for the type, the string will be leaked once the
+ * caller is done with it ... but that case really should not happen, so
+ * leaking if it does seems acceptable.
+ */
+ if (typeInfo)
+ typeInfo->ftypname = result;
+
+ return result;
+}
+
+/*
+ * Return a column list clause for the given relation.
+ *
+ * Special case: if there are no undropped columns in the relation, return
+ * "", not an invalid "()" column list.
+ */
+static const char *
+fmtCopyColumnList(const TableInfo *ti, PQExpBuffer buffer)
+{
+ int numatts = ti->numatts;
+ char **attnames = ti->attnames;
+ bool *attisdropped = ti->attisdropped;
+ char *attgenerated = ti->attgenerated;
+ bool needComma;
+ int i;
+
+ appendPQExpBufferChar(buffer, '(');
+ needComma = false;
+ for (i = 0; i < numatts; i++)
+ {
+ if (attisdropped[i])
+ continue;
+ if (attgenerated[i])
+ continue;
+ if (needComma)
+ appendPQExpBufferStr(buffer, ", ");
+ appendPQExpBufferStr(buffer, fmtId(attnames[i]));
+ needComma = true;
+ }
+
+ if (!needComma)
+ return ""; /* no undropped columns */
+
+ appendPQExpBufferChar(buffer, ')');
+ return buffer->data;
+}
+
+/*
+ * Check if a reloptions array is nonempty.
+ */
+static bool
+nonemptyReloptions(const char *reloptions)
+{
+ /* Don't want to print it if it's just "{}" */
+ return (reloptions != NULL && strlen(reloptions) > 2);
+}
+
+/*
+ * Format a reloptions array and append it to the given buffer.
+ *
+ * "prefix" is prepended to the option names; typically it's "" or "toast.".
+ */
+static void
+appendReloptionsArrayAH(PQExpBuffer buffer, const char *reloptions,
+ const char *prefix, Archive *fout)
+{
+ bool res;
+
+ res = appendReloptionsArray(buffer, reloptions, prefix, fout->encoding,
+ fout->std_strings);
+ if (!res)
+ pg_log_warning("could not parse %s array", "reloptions");
+}
diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h
new file mode 100644
index 0000000..0cdcc01
--- /dev/null
+++ b/src/bin/pg_dump/pg_dump.h
@@ -0,0 +1,752 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_dump.h
+ * Common header file for the pg_dump utility
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_dump/pg_dump.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef PG_DUMP_H
+#define PG_DUMP_H
+
+#include "pg_backup.h"
+
+
+#define oidcmp(x,y) ( ((x) < (y) ? -1 : ((x) > (y)) ? 1 : 0) )
+
+/*
+ * The data structures used to store system catalog information. Every
+ * dumpable object is a subclass of DumpableObject.
+ *
+ * NOTE: the structures described here live for the entire pg_dump run;
+ * and in most cases we make a struct for every object we can find in the
+ * catalogs, not only those we are actually going to dump. Hence, it's
+ * best to store a minimal amount of per-object info in these structs,
+ * and retrieve additional per-object info when and if we dump a specific
+ * object. In particular, try to avoid retrieving expensive-to-compute
+ * information until it's known to be needed. We do, however, have to
+ * store enough info to determine whether an object should be dumped and
+ * what order to dump in.
+ */
+
+typedef enum
+{
+ /* When modifying this enum, update priority tables in pg_dump_sort.c! */
+ DO_NAMESPACE,
+ DO_EXTENSION,
+ DO_TYPE,
+ DO_SHELL_TYPE,
+ DO_FUNC,
+ DO_AGG,
+ DO_OPERATOR,
+ DO_ACCESS_METHOD,
+ DO_OPCLASS,
+ DO_OPFAMILY,
+ DO_COLLATION,
+ DO_CONVERSION,
+ DO_TABLE,
+ DO_TABLE_ATTACH,
+ DO_ATTRDEF,
+ DO_INDEX,
+ DO_INDEX_ATTACH,
+ DO_STATSEXT,
+ DO_RULE,
+ DO_TRIGGER,
+ DO_CONSTRAINT,
+ DO_FK_CONSTRAINT, /* see note for ConstraintInfo */
+ DO_PROCLANG,
+ DO_CAST,
+ DO_TABLE_DATA,
+ DO_SEQUENCE_SET,
+ DO_DUMMY_TYPE,
+ DO_TSPARSER,
+ DO_TSDICT,
+ DO_TSTEMPLATE,
+ DO_TSCONFIG,
+ DO_FDW,
+ DO_FOREIGN_SERVER,
+ DO_DEFAULT_ACL,
+ DO_TRANSFORM,
+ DO_BLOB,
+ DO_BLOB_DATA,
+ DO_PRE_DATA_BOUNDARY,
+ DO_POST_DATA_BOUNDARY,
+ DO_EVENT_TRIGGER,
+ DO_REFRESH_MATVIEW,
+ DO_POLICY,
+ DO_PUBLICATION,
+ DO_PUBLICATION_REL,
+ DO_PUBLICATION_TABLE_IN_SCHEMA,
+ DO_SUBSCRIPTION
+} DumpableObjectType;
+
+/*
+ * DumpComponents is a bitmask of the potentially dumpable components of
+ * a database object: its core definition, plus optional attributes such
+ * as ACL, comments, etc. The NONE and ALL symbols are convenient
+ * shorthands.
+ */
+typedef uint32 DumpComponents;
+#define DUMP_COMPONENT_NONE (0)
+#define DUMP_COMPONENT_DEFINITION (1 << 0)
+#define DUMP_COMPONENT_DATA (1 << 1)
+#define DUMP_COMPONENT_COMMENT (1 << 2)
+#define DUMP_COMPONENT_SECLABEL (1 << 3)
+#define DUMP_COMPONENT_ACL (1 << 4)
+#define DUMP_COMPONENT_POLICY (1 << 5)
+#define DUMP_COMPONENT_USERMAP (1 << 6)
+#define DUMP_COMPONENT_ALL (0xFFFF)
+
+/*
+ * component types which require us to obtain a lock on the table
+ *
+ * Note that some components only require looking at the information
+ * in the pg_catalog tables and, for those components, we do not need
+ * to lock the table. Be careful here though- some components use
+ * server-side functions which pull the latest information from
+ * SysCache and in those cases we *do* need to lock the table.
+ *
+ * We do not need locks for the COMMENT and SECLABEL components as
+ * those simply query their associated tables without using any
+ * server-side functions. We do not need locks for the ACL component
+ * as we pull that information from pg_class without using any
+ * server-side functions that use SysCache. The USERMAP component
+ * is only relevant for FOREIGN SERVERs and not tables, so no sense
+ * locking a table for that either (that can happen if we are going
+ * to dump "ALL" components for a table).
+ *
+ * We DO need locks for DEFINITION, due to various server-side
+ * functions that are used and POLICY due to pg_get_expr(). We set
+ * this up to grab the lock except in the cases we know to be safe.
+ */
+#define DUMP_COMPONENTS_REQUIRING_LOCK (\
+ DUMP_COMPONENT_DEFINITION |\
+ DUMP_COMPONENT_DATA |\
+ DUMP_COMPONENT_POLICY)
+
+typedef struct _dumpableObject
+{
+ DumpableObjectType objType;
+ CatalogId catId; /* zero if not a cataloged object */
+ DumpId dumpId; /* assigned by AssignDumpId() */
+ char *name; /* object name (should never be NULL) */
+ struct _namespaceInfo *namespace; /* containing namespace, or NULL */
+ DumpComponents dump; /* bitmask of components requested to dump */
+ DumpComponents dump_contains; /* as above, but for contained objects */
+ DumpComponents components; /* bitmask of components available to dump */
+ bool ext_member; /* true if object is member of extension */
+ bool depends_on_ext; /* true if object depends on an extension */
+ DumpId *dependencies; /* dumpIds of objects this one depends on */
+ int nDeps; /* number of valid dependencies */
+ int allocDeps; /* allocated size of dependencies[] */
+} DumpableObject;
+
+/*
+ * Object types that have ACLs must store them in a DumpableAcl sub-struct,
+ * which must immediately follow the DumpableObject base struct.
+ */
+typedef struct _dumpableAcl
+{
+ char *acl; /* the object's actual ACL string */
+ char *acldefault; /* default ACL for the object's type & owner */
+ /* these fields come from the object's pg_init_privs entry, if any: */
+ char privtype; /* entry type, 'i' or 'e'; 0 if no entry */
+ char *initprivs; /* the object's initial ACL string, or NULL */
+} DumpableAcl;
+
+/* Generic struct that can be used to access any object type having an ACL */
+typedef struct _dumpableObjectWithAcl
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+} DumpableObjectWithAcl;
+
+typedef struct _namespaceInfo
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+ bool create; /* CREATE SCHEMA, or just set owner? */
+ Oid nspowner; /* OID of owner */
+ const char *rolname; /* name of owner */
+} NamespaceInfo;
+
+typedef struct _extensionInfo
+{
+ DumpableObject dobj;
+ char *namespace; /* schema containing extension's objects */
+ bool relocatable;
+ char *extversion;
+ char *extconfig; /* info about configuration tables */
+ char *extcondition;
+} ExtensionInfo;
+
+typedef struct _typeInfo
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+
+ /*
+ * Note: dobj.name is the raw pg_type.typname entry. ftypname is the
+ * result of format_type(), which will be quoted if needed, and might be
+ * schema-qualified too.
+ */
+ char *ftypname;
+ const char *rolname;
+ Oid typelem;
+ Oid typrelid;
+ char typrelkind; /* 'r', 'v', 'c', etc */
+ char typtype; /* 'b', 'c', etc */
+ bool isArray; /* true if auto-generated array type */
+ bool isMultirange; /* true if auto-generated multirange type */
+ bool isDefined; /* true if typisdefined */
+ /* If needed, we'll create a "shell type" entry for it; link that here: */
+ struct _shellTypeInfo *shellType; /* shell-type entry, or NULL */
+ /* If it's a domain, we store links to its constraints here: */
+ int nDomChecks;
+ struct _constraintInfo *domChecks;
+} TypeInfo;
+
+typedef struct _shellTypeInfo
+{
+ DumpableObject dobj;
+
+ TypeInfo *baseType; /* back link to associated base type */
+} ShellTypeInfo;
+
+typedef struct _funcInfo
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+ const char *rolname;
+ Oid lang;
+ int nargs;
+ Oid *argtypes;
+ Oid prorettype;
+ bool postponed_def; /* function must be postponed into post-data */
+} FuncInfo;
+
+/* AggInfo is a superset of FuncInfo */
+typedef struct _aggInfo
+{
+ FuncInfo aggfn;
+ /* we don't require any other fields at the moment */
+} AggInfo;
+
+typedef struct _oprInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+ char oprkind;
+ Oid oprcode;
+} OprInfo;
+
+typedef struct _accessMethodInfo
+{
+ DumpableObject dobj;
+ char amtype;
+ char *amhandler;
+} AccessMethodInfo;
+
+typedef struct _opclassInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+} OpclassInfo;
+
+typedef struct _opfamilyInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+} OpfamilyInfo;
+
+typedef struct _collInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+} CollInfo;
+
+typedef struct _convInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+} ConvInfo;
+
+typedef struct _tableInfo
+{
+ /*
+ * These fields are collected for every table in the database.
+ */
+ DumpableObject dobj;
+ DumpableAcl dacl;
+ const char *rolname;
+ char relkind;
+ char relpersistence; /* relation persistence */
+ bool relispopulated; /* relation is populated */
+ char relreplident; /* replica identifier */
+ char *reltablespace; /* relation tablespace */
+ char *reloptions; /* options specified by WITH (...) */
+ char *checkoption; /* WITH CHECK OPTION, if any */
+ char *toast_reloptions; /* WITH options for the TOAST table */
+ bool hasindex; /* does it have any indexes? */
+ bool hasrules; /* does it have any rules? */
+ bool hastriggers; /* does it have any triggers? */
+ bool hascolumnACLs; /* do any columns have non-default ACLs? */
+ bool rowsec; /* is row security enabled? */
+ bool forcerowsec; /* is row security forced? */
+ bool hasoids; /* does it have OIDs? */
+ uint32 frozenxid; /* table's relfrozenxid */
+ uint32 minmxid; /* table's relminmxid */
+ Oid toast_oid; /* toast table's OID, or 0 if none */
+ uint32 toast_frozenxid; /* toast table's relfrozenxid, if any */
+ uint32 toast_minmxid; /* toast table's relminmxid */
+ int ncheck; /* # of CHECK expressions */
+ Oid reltype; /* OID of table's composite type, if any */
+ Oid reloftype; /* underlying type for typed table */
+ Oid foreign_server; /* foreign server oid, if applicable */
+ /* these two are set only if table is a sequence owned by a column: */
+ Oid owning_tab; /* OID of table owning sequence */
+ int owning_col; /* attr # of column owning sequence */
+ bool is_identity_sequence;
+ int relpages; /* table's size in pages (from pg_class) */
+ int toastpages; /* toast table's size in pages, if any */
+
+ bool interesting; /* true if need to collect more data */
+ bool dummy_view; /* view's real definition must be postponed */
+ bool postponed_def; /* matview must be postponed into post-data */
+ bool ispartition; /* is table a partition? */
+ bool unsafe_partitions; /* is it an unsafe partitioned table? */
+
+ /*
+ * These fields are computed only if we decide the table is interesting
+ * (it's either a table to dump, or a direct parent of a dumpable table).
+ */
+ int numatts; /* number of attributes */
+ char **attnames; /* the attribute names */
+ char **atttypnames; /* attribute type names */
+ int *atttypmod; /* type-specific type modifiers */
+ int *attstattarget; /* attribute statistics targets */
+ char *attstorage; /* attribute storage scheme */
+ char *typstorage; /* type storage scheme */
+ bool *attisdropped; /* true if attr is dropped; don't dump it */
+ char *attidentity;
+ char *attgenerated;
+ int *attlen; /* attribute length, used by binary_upgrade */
+ char *attalign; /* attribute align, used by binary_upgrade */
+ bool *attislocal; /* true if attr has local definition */
+ char **attoptions; /* per-attribute options */
+ Oid *attcollation; /* per-attribute collation selection */
+ char *attcompression; /* per-attribute compression method */
+ char **attfdwoptions; /* per-attribute fdw options */
+ char **attmissingval; /* per attribute missing value */
+ bool *notnull; /* NOT NULL constraints on attributes */
+ bool *inhNotNull; /* true if NOT NULL is inherited */
+ struct _attrDefInfo **attrdefs; /* DEFAULT expressions */
+ struct _constraintInfo *checkexprs; /* CHECK constraints */
+ bool needs_override; /* has GENERATED ALWAYS AS IDENTITY */
+ char *amname; /* relation access method */
+
+ /*
+ * Stuff computed only for dumpable tables.
+ */
+ int numParents; /* number of (immediate) parent tables */
+ struct _tableInfo **parents; /* TableInfos of immediate parents */
+ int numIndexes; /* number of indexes */
+ struct _indxInfo *indexes; /* indexes */
+ struct _tableDataInfo *dataObj; /* TableDataInfo, if dumping its data */
+ int numTriggers; /* number of triggers for table */
+ struct _triggerInfo *triggers; /* array of TriggerInfo structs */
+} TableInfo;
+
+typedef struct _tableAttachInfo
+{
+ DumpableObject dobj;
+ TableInfo *parentTbl; /* link to partitioned table */
+ TableInfo *partitionTbl; /* link to partition */
+} TableAttachInfo;
+
+typedef struct _attrDefInfo
+{
+ DumpableObject dobj; /* note: dobj.name is name of table */
+ TableInfo *adtable; /* link to table of attribute */
+ int adnum;
+ char *adef_expr; /* decompiled DEFAULT expression */
+ bool separate; /* true if must dump as separate item */
+} AttrDefInfo;
+
+typedef struct _tableDataInfo
+{
+ DumpableObject dobj;
+ TableInfo *tdtable; /* link to table to dump */
+ char *filtercond; /* WHERE condition to limit rows dumped */
+} TableDataInfo;
+
+typedef struct _indxInfo
+{
+ DumpableObject dobj;
+ TableInfo *indextable; /* link to table the index is for */
+ char *indexdef;
+ char *tablespace; /* tablespace in which index is stored */
+ char *indreloptions; /* options specified by WITH (...) */
+ char *indstatcols; /* column numbers with statistics */
+ char *indstatvals; /* statistic values for columns */
+ int indnkeyattrs; /* number of index key attributes */
+ int indnattrs; /* total number of index attributes */
+ Oid *indkeys; /* In spite of the name 'indkeys' this field
+ * contains both key and nonkey attributes */
+ bool indisclustered;
+ bool indisreplident;
+ bool indnullsnotdistinct;
+ Oid parentidx; /* if a partition, parent index OID */
+ SimplePtrList partattaches; /* if partitioned, partition attach objects */
+
+ /* if there is an associated constraint object, its dumpId: */
+ DumpId indexconstraint;
+} IndxInfo;
+
+typedef struct _indexAttachInfo
+{
+ DumpableObject dobj;
+ IndxInfo *parentIdx; /* link to index on partitioned table */
+ IndxInfo *partitionIdx; /* link to index on partition */
+} IndexAttachInfo;
+
+typedef struct _statsExtInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+ int stattarget; /* statistics target */
+} StatsExtInfo;
+
+typedef struct _ruleInfo
+{
+ DumpableObject dobj;
+ TableInfo *ruletable; /* link to table the rule is for */
+ char ev_type;
+ bool is_instead;
+ char ev_enabled;
+ bool separate; /* true if must dump as separate item */
+ /* separate is always true for non-ON SELECT rules */
+} RuleInfo;
+
+typedef struct _triggerInfo
+{
+ DumpableObject dobj;
+ TableInfo *tgtable; /* link to table the trigger is for */
+ char *tgfname;
+ int tgtype;
+ int tgnargs;
+ char *tgargs;
+ bool tgisconstraint;
+ char *tgconstrname;
+ Oid tgconstrrelid;
+ char *tgconstrrelname;
+ char tgenabled;
+ bool tgispartition;
+ bool tgdeferrable;
+ bool tginitdeferred;
+ char *tgdef;
+} TriggerInfo;
+
+typedef struct _evttriggerInfo
+{
+ DumpableObject dobj;
+ char *evtname;
+ char *evtevent;
+ const char *evtowner;
+ char *evttags;
+ char *evtfname;
+ char evtenabled;
+} EventTriggerInfo;
+
+/*
+ * struct ConstraintInfo is used for all constraint types. However we
+ * use a different objType for foreign key constraints, to make it easier
+ * to sort them the way we want.
+ *
+ * Note: condeferrable and condeferred are currently only valid for
+ * unique/primary-key constraints. Otherwise that info is in condef.
+ */
+typedef struct _constraintInfo
+{
+ DumpableObject dobj;
+ TableInfo *contable; /* NULL if domain constraint */
+ TypeInfo *condomain; /* NULL if table constraint */
+ char contype;
+ char *condef; /* definition, if CHECK or FOREIGN KEY */
+ Oid confrelid; /* referenced table, if FOREIGN KEY */
+ DumpId conindex; /* identifies associated index if any */
+ bool condeferrable; /* true if constraint is DEFERRABLE */
+ bool condeferred; /* true if constraint is INITIALLY DEFERRED */
+ bool conislocal; /* true if constraint has local definition */
+ bool separate; /* true if must dump as separate item */
+} ConstraintInfo;
+
+typedef struct _procLangInfo
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+ bool lanpltrusted;
+ Oid lanplcallfoid;
+ Oid laninline;
+ Oid lanvalidator;
+ const char *lanowner;
+} ProcLangInfo;
+
+typedef struct _castInfo
+{
+ DumpableObject dobj;
+ Oid castsource;
+ Oid casttarget;
+ Oid castfunc;
+ char castcontext;
+ char castmethod;
+} CastInfo;
+
+typedef struct _transformInfo
+{
+ DumpableObject dobj;
+ Oid trftype;
+ Oid trflang;
+ Oid trffromsql;
+ Oid trftosql;
+} TransformInfo;
+
+/* InhInfo isn't a DumpableObject, just temporary state */
+typedef struct _inhInfo
+{
+ Oid inhrelid; /* OID of a child table */
+ Oid inhparent; /* OID of its parent */
+} InhInfo;
+
+typedef struct _prsInfo
+{
+ DumpableObject dobj;
+ Oid prsstart;
+ Oid prstoken;
+ Oid prsend;
+ Oid prsheadline;
+ Oid prslextype;
+} TSParserInfo;
+
+typedef struct _dictInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+ Oid dicttemplate;
+ char *dictinitoption;
+} TSDictInfo;
+
+typedef struct _tmplInfo
+{
+ DumpableObject dobj;
+ Oid tmplinit;
+ Oid tmpllexize;
+} TSTemplateInfo;
+
+typedef struct _cfgInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+ Oid cfgparser;
+} TSConfigInfo;
+
+typedef struct _fdwInfo
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+ const char *rolname;
+ char *fdwhandler;
+ char *fdwvalidator;
+ char *fdwoptions;
+} FdwInfo;
+
+typedef struct _foreignServerInfo
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+ const char *rolname;
+ Oid srvfdw;
+ char *srvtype;
+ char *srvversion;
+ char *srvoptions;
+} ForeignServerInfo;
+
+typedef struct _defaultACLInfo
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+ const char *defaclrole;
+ char defaclobjtype;
+} DefaultACLInfo;
+
+typedef struct _blobInfo
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+ const char *rolname;
+} BlobInfo;
+
+/*
+ * The PolicyInfo struct is used to represent policies on a table and
+ * to indicate if a table has RLS enabled (ENABLE ROW SECURITY). If
+ * polname is NULL, then the record indicates ENABLE ROW SECURITY, while if
+ * it's non-NULL then this is a regular policy definition.
+ */
+typedef struct _policyInfo
+{
+ DumpableObject dobj;
+ TableInfo *poltable;
+ char *polname; /* null indicates RLS is enabled on rel */
+ char polcmd;
+ bool polpermissive;
+ char *polroles;
+ char *polqual;
+ char *polwithcheck;
+} PolicyInfo;
+
+/*
+ * The PublicationInfo struct is used to represent publications.
+ */
+typedef struct _PublicationInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+ bool puballtables;
+ bool pubinsert;
+ bool pubupdate;
+ bool pubdelete;
+ bool pubtruncate;
+ bool pubviaroot;
+} PublicationInfo;
+
+/*
+ * The PublicationRelInfo struct is used to represent publication table
+ * mapping.
+ */
+typedef struct _PublicationRelInfo
+{
+ DumpableObject dobj;
+ PublicationInfo *publication;
+ TableInfo *pubtable;
+ char *pubrelqual;
+ char *pubrattrs;
+} PublicationRelInfo;
+
+/*
+ * The PublicationSchemaInfo struct is used to represent publication schema
+ * mapping.
+ */
+typedef struct _PublicationSchemaInfo
+{
+ DumpableObject dobj;
+ PublicationInfo *publication;
+ NamespaceInfo *pubschema;
+} PublicationSchemaInfo;
+
+/*
+ * The SubscriptionInfo struct is used to represent subscription.
+ */
+typedef struct _SubscriptionInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+ char *subconninfo;
+ char *subslotname;
+ char *subbinary;
+ char *substream;
+ char *subtwophasestate;
+ char *subdisableonerr;
+ char *subsynccommit;
+ char *subpublications;
+} SubscriptionInfo;
+
+/*
+ * common utility functions
+ */
+
+extern TableInfo *getSchemaData(Archive *fout, int *numTablesPtr);
+
+extern void AssignDumpId(DumpableObject *dobj);
+extern DumpId createDumpId(void);
+extern DumpId getMaxDumpId(void);
+extern DumpableObject *findObjectByDumpId(DumpId dumpId);
+extern DumpableObject *findObjectByCatalogId(CatalogId catalogId);
+extern void getDumpableObjects(DumpableObject ***objs, int *numObjs);
+
+extern void addObjectDependency(DumpableObject *dobj, DumpId refId);
+extern void removeObjectDependency(DumpableObject *dobj, DumpId refId);
+
+extern TableInfo *findTableByOid(Oid oid);
+extern TypeInfo *findTypeByOid(Oid oid);
+extern FuncInfo *findFuncByOid(Oid oid);
+extern OprInfo *findOprByOid(Oid oid);
+extern CollInfo *findCollationByOid(Oid oid);
+extern NamespaceInfo *findNamespaceByOid(Oid oid);
+extern ExtensionInfo *findExtensionByOid(Oid oid);
+extern PublicationInfo *findPublicationByOid(Oid oid);
+
+extern void recordExtensionMembership(CatalogId catId, ExtensionInfo *ext);
+extern ExtensionInfo *findOwningExtension(CatalogId catalogId);
+
+extern void parseOidArray(const char *str, Oid *array, int arraysize);
+
+extern void sortDumpableObjects(DumpableObject **objs, int numObjs,
+ DumpId preBoundaryId, DumpId postBoundaryId);
+extern void sortDumpableObjectsByTypeName(DumpableObject **objs, int numObjs);
+
+/*
+ * version specific routines
+ */
+extern NamespaceInfo *getNamespaces(Archive *fout, int *numNamespaces);
+extern ExtensionInfo *getExtensions(Archive *fout, int *numExtensions);
+extern TypeInfo *getTypes(Archive *fout, int *numTypes);
+extern FuncInfo *getFuncs(Archive *fout, int *numFuncs);
+extern AggInfo *getAggregates(Archive *fout, int *numAggregates);
+extern OprInfo *getOperators(Archive *fout, int *numOperators);
+extern AccessMethodInfo *getAccessMethods(Archive *fout, int *numAccessMethods);
+extern OpclassInfo *getOpclasses(Archive *fout, int *numOpclasses);
+extern OpfamilyInfo *getOpfamilies(Archive *fout, int *numOpfamilies);
+extern CollInfo *getCollations(Archive *fout, int *numCollations);
+extern ConvInfo *getConversions(Archive *fout, int *numConversions);
+extern TableInfo *getTables(Archive *fout, int *numTables);
+extern void getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables);
+extern InhInfo *getInherits(Archive *fout, int *numInherits);
+extern void getPartitioningInfo(Archive *fout);
+extern void getIndexes(Archive *fout, TableInfo tblinfo[], int numTables);
+extern void getExtendedStatistics(Archive *fout);
+extern void getConstraints(Archive *fout, TableInfo tblinfo[], int numTables);
+extern RuleInfo *getRules(Archive *fout, int *numRules);
+extern void getTriggers(Archive *fout, TableInfo tblinfo[], int numTables);
+extern ProcLangInfo *getProcLangs(Archive *fout, int *numProcLangs);
+extern CastInfo *getCasts(Archive *fout, int *numCasts);
+extern TransformInfo *getTransforms(Archive *fout, int *numTransforms);
+extern void getTableAttrs(Archive *fout, TableInfo *tbinfo, int numTables);
+extern bool shouldPrintColumn(const DumpOptions *dopt, const TableInfo *tbinfo, int colno);
+extern TSParserInfo *getTSParsers(Archive *fout, int *numTSParsers);
+extern TSDictInfo *getTSDictionaries(Archive *fout, int *numTSDicts);
+extern TSTemplateInfo *getTSTemplates(Archive *fout, int *numTSTemplates);
+extern TSConfigInfo *getTSConfigurations(Archive *fout, int *numTSConfigs);
+extern FdwInfo *getForeignDataWrappers(Archive *fout,
+ int *numForeignDataWrappers);
+extern ForeignServerInfo *getForeignServers(Archive *fout,
+ int *numForeignServers);
+extern DefaultACLInfo *getDefaultACLs(Archive *fout, int *numDefaultACLs);
+extern void getExtensionMembership(Archive *fout, ExtensionInfo extinfo[],
+ int numExtensions);
+extern void processExtensionTables(Archive *fout, ExtensionInfo extinfo[],
+ int numExtensions);
+extern EventTriggerInfo *getEventTriggers(Archive *fout, int *numEventTriggers);
+extern void getPolicies(Archive *fout, TableInfo tblinfo[], int numTables);
+extern PublicationInfo *getPublications(Archive *fout,
+ int *numPublications);
+extern void getPublicationNamespaces(Archive *fout);
+extern void getPublicationTables(Archive *fout, TableInfo tblinfo[],
+ int numTables);
+extern void getSubscriptions(Archive *fout);
+
+#endif /* PG_DUMP_H */
diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c
new file mode 100644
index 0000000..c8388da
--- /dev/null
+++ b/src/bin/pg_dump/pg_dump_sort.c
@@ -0,0 +1,1561 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_dump_sort.c
+ * Sort the items of a dump into a safe order for dumping
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_dump_sort.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "catalog/pg_class_d.h"
+#include "pg_backup_archiver.h"
+#include "pg_backup_utils.h"
+#include "pg_dump.h"
+
+/*
+ * Sort priority for database object types.
+ * Objects are sorted by type, and within a type by name.
+ *
+ * Triggers, event triggers, and materialized views are intentionally sorted
+ * late. Triggers must be restored after all data modifications, so that
+ * they don't interfere with loading data. Event triggers are restored
+ * next-to-last so that they don't interfere with object creations of any
+ * kind. Matview refreshes are last because they should execute in the
+ * database's normal state (e.g., they must come after all ACLs are restored;
+ * also, if they choose to look at system catalogs, they should see the final
+ * restore state). If you think to change this, see also the RestorePass
+ * mechanism in pg_backup_archiver.c.
+ *
+ * On the other hand, casts are intentionally sorted earlier than you might
+ * expect; logically they should come after functions, since they usually
+ * depend on those. This works around the backend's habit of recording
+ * views that use casts as dependent on the cast's underlying function.
+ * We initially sort casts first, and then any functions used by casts
+ * will be hoisted above the casts, and in turn views that those functions
+ * depend on will be hoisted above the functions. But views not used that
+ * way won't be hoisted.
+ *
+ * NOTE: object-type priorities must match the section assignments made in
+ * pg_dump.c; that is, PRE_DATA objects must sort before DO_PRE_DATA_BOUNDARY,
+ * POST_DATA objects must sort after DO_POST_DATA_BOUNDARY, and DATA objects
+ * must sort between them.
+ */
+
+/* This enum lists the priority levels in order */
+enum dbObjectTypePriorities
+{
+ PRIO_NAMESPACE = 1,
+ PRIO_PROCLANG,
+ PRIO_COLLATION,
+ PRIO_TRANSFORM,
+ PRIO_EXTENSION,
+ PRIO_TYPE, /* used for DO_TYPE and DO_SHELL_TYPE */
+ PRIO_CAST,
+ PRIO_FUNC,
+ PRIO_AGG,
+ PRIO_ACCESS_METHOD,
+ PRIO_OPERATOR,
+ PRIO_OPFAMILY, /* used for DO_OPFAMILY and DO_OPCLASS */
+ PRIO_CONVERSION,
+ PRIO_TSPARSER,
+ PRIO_TSTEMPLATE,
+ PRIO_TSDICT,
+ PRIO_TSCONFIG,
+ PRIO_FDW,
+ PRIO_FOREIGN_SERVER,
+ PRIO_TABLE,
+ PRIO_TABLE_ATTACH,
+ PRIO_DUMMY_TYPE,
+ PRIO_ATTRDEF,
+ PRIO_BLOB,
+ PRIO_PRE_DATA_BOUNDARY, /* boundary! */
+ PRIO_TABLE_DATA,
+ PRIO_SEQUENCE_SET,
+ PRIO_BLOB_DATA,
+ PRIO_POST_DATA_BOUNDARY, /* boundary! */
+ PRIO_CONSTRAINT,
+ PRIO_INDEX,
+ PRIO_INDEX_ATTACH,
+ PRIO_STATSEXT,
+ PRIO_RULE,
+ PRIO_TRIGGER,
+ PRIO_FK_CONSTRAINT,
+ PRIO_POLICY,
+ PRIO_PUBLICATION,
+ PRIO_PUBLICATION_REL,
+ PRIO_PUBLICATION_TABLE_IN_SCHEMA,
+ PRIO_SUBSCRIPTION,
+ PRIO_DEFAULT_ACL, /* done in ACL pass */
+ PRIO_EVENT_TRIGGER, /* must be next to last! */
+ PRIO_REFRESH_MATVIEW /* must be last! */
+};
+
+/* This table is indexed by enum DumpableObjectType */
+static const int dbObjectTypePriority[] =
+{
+ PRIO_NAMESPACE, /* DO_NAMESPACE */
+ PRIO_EXTENSION, /* DO_EXTENSION */
+ PRIO_TYPE, /* DO_TYPE */
+ PRIO_TYPE, /* DO_SHELL_TYPE */
+ PRIO_FUNC, /* DO_FUNC */
+ PRIO_AGG, /* DO_AGG */
+ PRIO_OPERATOR, /* DO_OPERATOR */
+ PRIO_ACCESS_METHOD, /* DO_ACCESS_METHOD */
+ PRIO_OPFAMILY, /* DO_OPCLASS */
+ PRIO_OPFAMILY, /* DO_OPFAMILY */
+ PRIO_COLLATION, /* DO_COLLATION */
+ PRIO_CONVERSION, /* DO_CONVERSION */
+ PRIO_TABLE, /* DO_TABLE */
+ PRIO_TABLE_ATTACH, /* DO_TABLE_ATTACH */
+ PRIO_ATTRDEF, /* DO_ATTRDEF */
+ PRIO_INDEX, /* DO_INDEX */
+ PRIO_INDEX_ATTACH, /* DO_INDEX_ATTACH */
+ PRIO_STATSEXT, /* DO_STATSEXT */
+ PRIO_RULE, /* DO_RULE */
+ PRIO_TRIGGER, /* DO_TRIGGER */
+ PRIO_CONSTRAINT, /* DO_CONSTRAINT */
+ PRIO_FK_CONSTRAINT, /* DO_FK_CONSTRAINT */
+ PRIO_PROCLANG, /* DO_PROCLANG */
+ PRIO_CAST, /* DO_CAST */
+ PRIO_TABLE_DATA, /* DO_TABLE_DATA */
+ PRIO_SEQUENCE_SET, /* DO_SEQUENCE_SET */
+ PRIO_DUMMY_TYPE, /* DO_DUMMY_TYPE */
+ PRIO_TSPARSER, /* DO_TSPARSER */
+ PRIO_TSDICT, /* DO_TSDICT */
+ PRIO_TSTEMPLATE, /* DO_TSTEMPLATE */
+ PRIO_TSCONFIG, /* DO_TSCONFIG */
+ PRIO_FDW, /* DO_FDW */
+ PRIO_FOREIGN_SERVER, /* DO_FOREIGN_SERVER */
+ PRIO_DEFAULT_ACL, /* DO_DEFAULT_ACL */
+ PRIO_TRANSFORM, /* DO_TRANSFORM */
+ PRIO_BLOB, /* DO_BLOB */
+ PRIO_BLOB_DATA, /* DO_BLOB_DATA */
+ PRIO_PRE_DATA_BOUNDARY, /* DO_PRE_DATA_BOUNDARY */
+ PRIO_POST_DATA_BOUNDARY, /* DO_POST_DATA_BOUNDARY */
+ PRIO_EVENT_TRIGGER, /* DO_EVENT_TRIGGER */
+ PRIO_REFRESH_MATVIEW, /* DO_REFRESH_MATVIEW */
+ PRIO_POLICY, /* DO_POLICY */
+ PRIO_PUBLICATION, /* DO_PUBLICATION */
+ PRIO_PUBLICATION_REL, /* DO_PUBLICATION_REL */
+ PRIO_PUBLICATION_TABLE_IN_SCHEMA, /* DO_PUBLICATION_TABLE_IN_SCHEMA */
+ PRIO_SUBSCRIPTION /* DO_SUBSCRIPTION */
+};
+
+StaticAssertDecl(lengthof(dbObjectTypePriority) == (DO_SUBSCRIPTION + 1),
+ "array length mismatch");
+
+static DumpId preDataBoundId;
+static DumpId postDataBoundId;
+
+
+static int DOTypeNameCompare(const void *p1, const void *p2);
+static bool TopoSort(DumpableObject **objs,
+ int numObjs,
+ DumpableObject **ordering,
+ int *nOrdering);
+static void addHeapElement(int val, int *heap, int heapLength);
+static int removeHeapElement(int *heap, int heapLength);
+static void findDependencyLoops(DumpableObject **objs, int nObjs, int totObjs);
+static int findLoop(DumpableObject *obj,
+ DumpId startPoint,
+ bool *processed,
+ DumpId *searchFailed,
+ DumpableObject **workspace,
+ int depth);
+static void repairDependencyLoop(DumpableObject **loop,
+ int nLoop);
+static void describeDumpableObject(DumpableObject *obj,
+ char *buf, int bufsize);
+
+
+/*
+ * Sort the given objects into a type/name-based ordering
+ *
+ * Normally this is just the starting point for the dependency-based
+ * ordering.
+ */
+void
+sortDumpableObjectsByTypeName(DumpableObject **objs, int numObjs)
+{
+ if (numObjs > 1)
+ qsort((void *) objs, numObjs, sizeof(DumpableObject *),
+ DOTypeNameCompare);
+}
+
+static int
+DOTypeNameCompare(const void *p1, const void *p2)
+{
+ DumpableObject *obj1 = *(DumpableObject *const *) p1;
+ DumpableObject *obj2 = *(DumpableObject *const *) p2;
+ int cmpval;
+
+ /* Sort by type's priority */
+ cmpval = dbObjectTypePriority[obj1->objType] -
+ dbObjectTypePriority[obj2->objType];
+
+ if (cmpval != 0)
+ return cmpval;
+
+ /*
+ * Sort by namespace. Typically, all objects of the same priority would
+ * either have or not have a namespace link, but there are exceptions.
+ * Sort NULL namespace after non-NULL in such cases.
+ */
+ if (obj1->namespace)
+ {
+ if (obj2->namespace)
+ {
+ cmpval = strcmp(obj1->namespace->dobj.name,
+ obj2->namespace->dobj.name);
+ if (cmpval != 0)
+ return cmpval;
+ }
+ else
+ return -1;
+ }
+ else if (obj2->namespace)
+ return 1;
+
+ /* Sort by name */
+ cmpval = strcmp(obj1->name, obj2->name);
+ if (cmpval != 0)
+ return cmpval;
+
+ /* To have a stable sort order, break ties for some object types */
+ if (obj1->objType == DO_FUNC || obj1->objType == DO_AGG)
+ {
+ FuncInfo *fobj1 = *(FuncInfo *const *) p1;
+ FuncInfo *fobj2 = *(FuncInfo *const *) p2;
+ int i;
+
+ /* Sort by number of arguments, then argument type names */
+ cmpval = fobj1->nargs - fobj2->nargs;
+ if (cmpval != 0)
+ return cmpval;
+ for (i = 0; i < fobj1->nargs; i++)
+ {
+ TypeInfo *argtype1 = findTypeByOid(fobj1->argtypes[i]);
+ TypeInfo *argtype2 = findTypeByOid(fobj2->argtypes[i]);
+
+ if (argtype1 && argtype2)
+ {
+ if (argtype1->dobj.namespace && argtype2->dobj.namespace)
+ {
+ cmpval = strcmp(argtype1->dobj.namespace->dobj.name,
+ argtype2->dobj.namespace->dobj.name);
+ if (cmpval != 0)
+ return cmpval;
+ }
+ cmpval = strcmp(argtype1->dobj.name, argtype2->dobj.name);
+ if (cmpval != 0)
+ return cmpval;
+ }
+ }
+ }
+ else if (obj1->objType == DO_OPERATOR)
+ {
+ OprInfo *oobj1 = *(OprInfo *const *) p1;
+ OprInfo *oobj2 = *(OprInfo *const *) p2;
+
+ /* oprkind is 'l', 'r', or 'b'; this sorts prefix, postfix, infix */
+ cmpval = (oobj2->oprkind - oobj1->oprkind);
+ if (cmpval != 0)
+ return cmpval;
+ }
+ else if (obj1->objType == DO_ATTRDEF)
+ {
+ AttrDefInfo *adobj1 = *(AttrDefInfo *const *) p1;
+ AttrDefInfo *adobj2 = *(AttrDefInfo *const *) p2;
+
+ /* Sort by attribute number */
+ cmpval = (adobj1->adnum - adobj2->adnum);
+ if (cmpval != 0)
+ return cmpval;
+ }
+ else if (obj1->objType == DO_POLICY)
+ {
+ PolicyInfo *pobj1 = *(PolicyInfo *const *) p1;
+ PolicyInfo *pobj2 = *(PolicyInfo *const *) p2;
+
+ /* Sort by table name (table namespace was considered already) */
+ cmpval = strcmp(pobj1->poltable->dobj.name,
+ pobj2->poltable->dobj.name);
+ if (cmpval != 0)
+ return cmpval;
+ }
+ else if (obj1->objType == DO_TRIGGER)
+ {
+ TriggerInfo *tobj1 = *(TriggerInfo *const *) p1;
+ TriggerInfo *tobj2 = *(TriggerInfo *const *) p2;
+
+ /* Sort by table name (table namespace was considered already) */
+ cmpval = strcmp(tobj1->tgtable->dobj.name,
+ tobj2->tgtable->dobj.name);
+ if (cmpval != 0)
+ return cmpval;
+ }
+
+ /* Usually shouldn't get here, but if we do, sort by OID */
+ return oidcmp(obj1->catId.oid, obj2->catId.oid);
+}
+
+
+/*
+ * Sort the given objects into a safe dump order using dependency
+ * information (to the extent we have it available).
+ *
+ * The DumpIds of the PRE_DATA_BOUNDARY and POST_DATA_BOUNDARY objects are
+ * passed in separately, in case we need them during dependency loop repair.
+ */
+void
+sortDumpableObjects(DumpableObject **objs, int numObjs,
+ DumpId preBoundaryId, DumpId postBoundaryId)
+{
+ DumpableObject **ordering;
+ int nOrdering;
+
+ if (numObjs <= 0) /* can't happen anymore ... */
+ return;
+
+ /*
+ * Saving the boundary IDs in static variables is a bit grotty, but seems
+ * better than adding them to parameter lists of subsidiary functions.
+ */
+ preDataBoundId = preBoundaryId;
+ postDataBoundId = postBoundaryId;
+
+ ordering = (DumpableObject **) pg_malloc(numObjs * sizeof(DumpableObject *));
+ while (!TopoSort(objs, numObjs, ordering, &nOrdering))
+ findDependencyLoops(ordering, nOrdering, numObjs);
+
+ memcpy(objs, ordering, numObjs * sizeof(DumpableObject *));
+
+ free(ordering);
+}
+
+/*
+ * TopoSort -- topological sort of a dump list
+ *
+ * Generate a re-ordering of the dump list that satisfies all the dependency
+ * constraints shown in the dump list. (Each such constraint is a fact of a
+ * partial ordering.) Minimize rearrangement of the list not needed to
+ * achieve the partial ordering.
+ *
+ * The input is the list of numObjs objects in objs[]. This list is not
+ * modified.
+ *
+ * Returns true if able to build an ordering that satisfies all the
+ * constraints, false if not (there are contradictory constraints).
+ *
+ * On success (true result), ordering[] is filled with a sorted array of
+ * DumpableObject pointers, of length equal to the input list length.
+ *
+ * On failure (false result), ordering[] is filled with an unsorted array of
+ * DumpableObject pointers of length *nOrdering, listing the objects that
+ * prevented the sort from being completed. In general, these objects either
+ * participate directly in a dependency cycle, or are depended on by objects
+ * that are in a cycle. (The latter objects are not actually problematic,
+ * but it takes further analysis to identify which are which.)
+ *
+ * The caller is responsible for allocating sufficient space at *ordering.
+ */
+static bool
+TopoSort(DumpableObject **objs,
+ int numObjs,
+ DumpableObject **ordering, /* output argument */
+ int *nOrdering) /* output argument */
+{
+ DumpId maxDumpId = getMaxDumpId();
+ int *pendingHeap;
+ int *beforeConstraints;
+ int *idMap;
+ DumpableObject *obj;
+ int heapLength;
+ int i,
+ j,
+ k;
+
+ /*
+ * This is basically the same algorithm shown for topological sorting in
+ * Knuth's Volume 1. However, we would like to minimize unnecessary
+ * rearrangement of the input ordering; that is, when we have a choice of
+ * which item to output next, we always want to take the one highest in
+ * the original list. Therefore, instead of maintaining an unordered
+ * linked list of items-ready-to-output as Knuth does, we maintain a heap
+ * of their item numbers, which we can use as a priority queue. This
+ * turns the algorithm from O(N) to O(N log N) because each insertion or
+ * removal of a heap item takes O(log N) time. However, that's still
+ * plenty fast enough for this application.
+ */
+
+ *nOrdering = numObjs; /* for success return */
+
+ /* Eliminate the null case */
+ if (numObjs <= 0)
+ return true;
+
+ /* Create workspace for the above-described heap */
+ pendingHeap = (int *) pg_malloc(numObjs * sizeof(int));
+
+ /*
+ * Scan the constraints, and for each item in the input, generate a count
+ * of the number of constraints that say it must be before something else.
+ * The count for the item with dumpId j is stored in beforeConstraints[j].
+ * We also make a map showing the input-order index of the item with
+ * dumpId j.
+ */
+ beforeConstraints = (int *) pg_malloc0((maxDumpId + 1) * sizeof(int));
+ idMap = (int *) pg_malloc((maxDumpId + 1) * sizeof(int));
+ for (i = 0; i < numObjs; i++)
+ {
+ obj = objs[i];
+ j = obj->dumpId;
+ if (j <= 0 || j > maxDumpId)
+ pg_fatal("invalid dumpId %d", j);
+ idMap[j] = i;
+ for (j = 0; j < obj->nDeps; j++)
+ {
+ k = obj->dependencies[j];
+ if (k <= 0 || k > maxDumpId)
+ pg_fatal("invalid dependency %d", k);
+ beforeConstraints[k]++;
+ }
+ }
+
+ /*
+ * Now initialize the heap of items-ready-to-output by filling it with the
+ * indexes of items that already have beforeConstraints[id] == 0.
+ *
+ * The essential property of a heap is heap[(j-1)/2] >= heap[j] for each j
+ * in the range 1..heapLength-1 (note we are using 0-based subscripts
+ * here, while the discussion in Knuth assumes 1-based subscripts). So, if
+ * we simply enter the indexes into pendingHeap[] in decreasing order, we
+ * a-fortiori have the heap invariant satisfied at completion of this
+ * loop, and don't need to do any sift-up comparisons.
+ */
+ heapLength = 0;
+ for (i = numObjs; --i >= 0;)
+ {
+ if (beforeConstraints[objs[i]->dumpId] == 0)
+ pendingHeap[heapLength++] = i;
+ }
+
+ /*--------------------
+ * Now emit objects, working backwards in the output list. At each step,
+ * we use the priority heap to select the last item that has no remaining
+ * before-constraints. We remove that item from the heap, output it to
+ * ordering[], and decrease the beforeConstraints count of each of the
+ * items it was constrained against. Whenever an item's beforeConstraints
+ * count is thereby decreased to zero, we insert it into the priority heap
+ * to show that it is a candidate to output. We are done when the heap
+ * becomes empty; if we have output every element then we succeeded,
+ * otherwise we failed.
+ * i = number of ordering[] entries left to output
+ * j = objs[] index of item we are outputting
+ * k = temp for scanning constraint list for item j
+ *--------------------
+ */
+ i = numObjs;
+ while (heapLength > 0)
+ {
+ /* Select object to output by removing largest heap member */
+ j = removeHeapElement(pendingHeap, heapLength--);
+ obj = objs[j];
+ /* Output candidate to ordering[] */
+ ordering[--i] = obj;
+ /* Update beforeConstraints counts of its predecessors */
+ for (k = 0; k < obj->nDeps; k++)
+ {
+ int id = obj->dependencies[k];
+
+ if ((--beforeConstraints[id]) == 0)
+ addHeapElement(idMap[id], pendingHeap, heapLength++);
+ }
+ }
+
+ /*
+ * If we failed, report the objects that couldn't be output; these are the
+ * ones with beforeConstraints[] still nonzero.
+ */
+ if (i != 0)
+ {
+ k = 0;
+ for (j = 1; j <= maxDumpId; j++)
+ {
+ if (beforeConstraints[j] != 0)
+ ordering[k++] = objs[idMap[j]];
+ }
+ *nOrdering = k;
+ }
+
+ /* Done */
+ free(pendingHeap);
+ free(beforeConstraints);
+ free(idMap);
+
+ return (i == 0);
+}
+
+/*
+ * Add an item to a heap (priority queue)
+ *
+ * heapLength is the current heap size; caller is responsible for increasing
+ * its value after the call. There must be sufficient storage at *heap.
+ */
+static void
+addHeapElement(int val, int *heap, int heapLength)
+{
+ int j;
+
+ /*
+ * Sift-up the new entry, per Knuth 5.2.3 exercise 16. Note that Knuth is
+ * using 1-based array indexes, not 0-based.
+ */
+ j = heapLength;
+ while (j > 0)
+ {
+ int i = (j - 1) >> 1;
+
+ if (val <= heap[i])
+ break;
+ heap[j] = heap[i];
+ j = i;
+ }
+ heap[j] = val;
+}
+
+/*
+ * Remove the largest item present in a heap (priority queue)
+ *
+ * heapLength is the current heap size; caller is responsible for decreasing
+ * its value after the call.
+ *
+ * We remove and return heap[0], which is always the largest element of
+ * the heap, and then "sift up" to maintain the heap invariant.
+ */
+static int
+removeHeapElement(int *heap, int heapLength)
+{
+ int result = heap[0];
+ int val;
+ int i;
+
+ if (--heapLength <= 0)
+ return result;
+ val = heap[heapLength]; /* value that must be reinserted */
+ i = 0; /* i is where the "hole" is */
+ for (;;)
+ {
+ int j = 2 * i + 1;
+
+ if (j >= heapLength)
+ break;
+ if (j + 1 < heapLength &&
+ heap[j] < heap[j + 1])
+ j++;
+ if (val >= heap[j])
+ break;
+ heap[i] = heap[j];
+ i = j;
+ }
+ heap[i] = val;
+ return result;
+}
+
+/*
+ * findDependencyLoops - identify loops in TopoSort's failure output,
+ * and pass each such loop to repairDependencyLoop() for action
+ *
+ * In general there may be many loops in the set of objects returned by
+ * TopoSort; for speed we should try to repair as many loops as we can
+ * before trying TopoSort again. We can safely repair loops that are
+ * disjoint (have no members in common); if we find overlapping loops
+ * then we repair only the first one found, because the action taken to
+ * repair the first might have repaired the other as well. (If not,
+ * we'll fix it on the next go-round.)
+ *
+ * objs[] lists the objects TopoSort couldn't sort
+ * nObjs is the number of such objects
+ * totObjs is the total number of objects in the universe
+ */
+static void
+findDependencyLoops(DumpableObject **objs, int nObjs, int totObjs)
+{
+ /*
+ * We use three data structures here:
+ *
+ * processed[] is a bool array indexed by dump ID, marking the objects
+ * already processed during this invocation of findDependencyLoops().
+ *
+ * searchFailed[] is another array indexed by dump ID. searchFailed[j] is
+ * set to dump ID k if we have proven that there is no dependency path
+ * leading from object j back to start point k. This allows us to skip
+ * useless searching when there are multiple dependency paths from k to j,
+ * which is a common situation. We could use a simple bool array for
+ * this, but then we'd need to re-zero it for each start point, resulting
+ * in O(N^2) zeroing work. Using the start point's dump ID as the "true"
+ * value lets us skip clearing the array before we consider the next start
+ * point.
+ *
+ * workspace[] is an array of DumpableObject pointers, in which we try to
+ * build lists of objects constituting loops. We make workspace[] large
+ * enough to hold all the objects in TopoSort's output, which is huge
+ * overkill in most cases but could theoretically be necessary if there is
+ * a single dependency chain linking all the objects.
+ */
+ bool *processed;
+ DumpId *searchFailed;
+ DumpableObject **workspace;
+ bool fixedloop;
+ int i;
+
+ processed = (bool *) pg_malloc0((getMaxDumpId() + 1) * sizeof(bool));
+ searchFailed = (DumpId *) pg_malloc0((getMaxDumpId() + 1) * sizeof(DumpId));
+ workspace = (DumpableObject **) pg_malloc(totObjs * sizeof(DumpableObject *));
+ fixedloop = false;
+
+ for (i = 0; i < nObjs; i++)
+ {
+ DumpableObject *obj = objs[i];
+ int looplen;
+ int j;
+
+ looplen = findLoop(obj,
+ obj->dumpId,
+ processed,
+ searchFailed,
+ workspace,
+ 0);
+
+ if (looplen > 0)
+ {
+ /* Found a loop, repair it */
+ repairDependencyLoop(workspace, looplen);
+ fixedloop = true;
+ /* Mark loop members as processed */
+ for (j = 0; j < looplen; j++)
+ processed[workspace[j]->dumpId] = true;
+ }
+ else
+ {
+ /*
+ * There's no loop starting at this object, but mark it processed
+ * anyway. This is not necessary for correctness, but saves later
+ * invocations of findLoop() from uselessly chasing references to
+ * such an object.
+ */
+ processed[obj->dumpId] = true;
+ }
+ }
+
+ /* We'd better have fixed at least one loop */
+ if (!fixedloop)
+ pg_fatal("could not identify dependency loop");
+
+ free(workspace);
+ free(searchFailed);
+ free(processed);
+}
+
+/*
+ * Recursively search for a circular dependency loop that doesn't include
+ * any already-processed objects.
+ *
+ * obj: object we are examining now
+ * startPoint: dumpId of starting object for the hoped-for circular loop
+ * processed[]: flag array marking already-processed objects
+ * searchFailed[]: flag array marking already-unsuccessfully-visited objects
+ * workspace[]: work array in which we are building list of loop members
+ * depth: number of valid entries in workspace[] at call
+ *
+ * On success, the length of the loop is returned, and workspace[] is filled
+ * with pointers to the members of the loop. On failure, we return 0.
+ *
+ * Note: it is possible that the given starting object is a member of more
+ * than one cycle; if so, we will find an arbitrary one of the cycles.
+ */
+static int
+findLoop(DumpableObject *obj,
+ DumpId startPoint,
+ bool *processed,
+ DumpId *searchFailed,
+ DumpableObject **workspace,
+ int depth)
+{
+ int i;
+
+ /*
+ * Reject if obj is already processed. This test prevents us from finding
+ * loops that overlap previously-processed loops.
+ */
+ if (processed[obj->dumpId])
+ return 0;
+
+ /*
+ * If we've already proven there is no path from this object back to the
+ * startPoint, forget it.
+ */
+ if (searchFailed[obj->dumpId] == startPoint)
+ return 0;
+
+ /*
+ * Reject if obj is already present in workspace. This test prevents us
+ * from going into infinite recursion if we are given a startPoint object
+ * that links to a cycle it's not a member of, and it guarantees that we
+ * can't overflow the allocated size of workspace[].
+ */
+ for (i = 0; i < depth; i++)
+ {
+ if (workspace[i] == obj)
+ return 0;
+ }
+
+ /*
+ * Okay, tentatively add obj to workspace
+ */
+ workspace[depth++] = obj;
+
+ /*
+ * See if we've found a loop back to the desired startPoint; if so, done
+ */
+ for (i = 0; i < obj->nDeps; i++)
+ {
+ if (obj->dependencies[i] == startPoint)
+ return depth;
+ }
+
+ /*
+ * Recurse down each outgoing branch
+ */
+ for (i = 0; i < obj->nDeps; i++)
+ {
+ DumpableObject *nextobj = findObjectByDumpId(obj->dependencies[i]);
+ int newDepth;
+
+ if (!nextobj)
+ continue; /* ignore dependencies on undumped objects */
+ newDepth = findLoop(nextobj,
+ startPoint,
+ processed,
+ searchFailed,
+ workspace,
+ depth);
+ if (newDepth > 0)
+ return newDepth;
+ }
+
+ /*
+ * Remember there is no path from here back to startPoint
+ */
+ searchFailed[obj->dumpId] = startPoint;
+
+ return 0;
+}
+
+/*
+ * A user-defined datatype will have a dependency loop with each of its
+ * I/O functions (since those have the datatype as input or output).
+ * Similarly, a range type will have a loop with its canonicalize function,
+ * if any. Break the loop by making the function depend on the associated
+ * shell type, instead.
+ */
+static void
+repairTypeFuncLoop(DumpableObject *typeobj, DumpableObject *funcobj)
+{
+ TypeInfo *typeInfo = (TypeInfo *) typeobj;
+
+ /* remove function's dependency on type */
+ removeObjectDependency(funcobj, typeobj->dumpId);
+
+ /* add function's dependency on shell type, instead */
+ if (typeInfo->shellType)
+ {
+ addObjectDependency(funcobj, typeInfo->shellType->dobj.dumpId);
+
+ /*
+ * Mark shell type (always including the definition, as we need the
+ * shell type defined to identify the function fully) as to be dumped
+ * if any such function is
+ */
+ if (funcobj->dump)
+ typeInfo->shellType->dobj.dump = funcobj->dump |
+ DUMP_COMPONENT_DEFINITION;
+ }
+}
+
+/*
+ * Because we force a view to depend on its ON SELECT rule, while there
+ * will be an implicit dependency in the other direction, we need to break
+ * the loop. If there are no other objects in the loop then we can remove
+ * the implicit dependency and leave the ON SELECT rule non-separate.
+ * This applies to matviews, as well.
+ */
+static void
+repairViewRuleLoop(DumpableObject *viewobj,
+ DumpableObject *ruleobj)
+{
+ /* remove rule's dependency on view */
+ removeObjectDependency(ruleobj, viewobj->dumpId);
+ /* flags on the two objects are already set correctly for this case */
+}
+
+/*
+ * However, if there are other objects in the loop, we must break the loop
+ * by making the ON SELECT rule a separately-dumped object.
+ *
+ * Because findLoop() finds shorter cycles before longer ones, it's likely
+ * that we will have previously fired repairViewRuleLoop() and removed the
+ * rule's dependency on the view. Put it back to ensure the rule won't be
+ * emitted before the view.
+ *
+ * Note: this approach does *not* work for matviews, at the moment.
+ */
+static void
+repairViewRuleMultiLoop(DumpableObject *viewobj,
+ DumpableObject *ruleobj)
+{
+ TableInfo *viewinfo = (TableInfo *) viewobj;
+ RuleInfo *ruleinfo = (RuleInfo *) ruleobj;
+
+ /* remove view's dependency on rule */
+ removeObjectDependency(viewobj, ruleobj->dumpId);
+ /* mark view to be printed with a dummy definition */
+ viewinfo->dummy_view = true;
+ /* mark rule as needing its own dump */
+ ruleinfo->separate = true;
+ /* put back rule's dependency on view */
+ addObjectDependency(ruleobj, viewobj->dumpId);
+ /* now that rule is separate, it must be post-data */
+ addObjectDependency(ruleobj, postDataBoundId);
+}
+
+/*
+ * If a matview is involved in a multi-object loop, we can't currently fix
+ * that by splitting off the rule. As a stopgap, we try to fix it by
+ * dropping the constraint that the matview be dumped in the pre-data section.
+ * This is sufficient to handle cases where a matview depends on some unique
+ * index, as can happen if it has a GROUP BY for example.
+ *
+ * Note that the "next object" is not necessarily the matview itself;
+ * it could be the matview's rowtype, for example. We may come through here
+ * several times while removing all the pre-data linkages. In particular,
+ * if there are other matviews that depend on the one with the circularity
+ * problem, we'll come through here for each such matview and mark them all
+ * as postponed. (This works because all MVs have pre-data dependencies
+ * to begin with, so each of them will get visited.)
+ */
+static void
+repairMatViewBoundaryMultiLoop(DumpableObject *boundaryobj,
+ DumpableObject *nextobj)
+{
+ /* remove boundary's dependency on object after it in loop */
+ removeObjectDependency(boundaryobj, nextobj->dumpId);
+ /* if that object is a matview, mark it as postponed into post-data */
+ if (nextobj->objType == DO_TABLE)
+ {
+ TableInfo *nextinfo = (TableInfo *) nextobj;
+
+ if (nextinfo->relkind == RELKIND_MATVIEW)
+ nextinfo->postponed_def = true;
+ }
+}
+
+/*
+ * If a function is involved in a multi-object loop, we can't currently fix
+ * that by splitting it into two DumpableObjects. As a stopgap, we try to fix
+ * it by dropping the constraint that the function be dumped in the pre-data
+ * section. This is sufficient to handle cases where a function depends on
+ * some unique index, as can happen if it has a GROUP BY for example.
+ */
+static void
+repairFunctionBoundaryMultiLoop(DumpableObject *boundaryobj,
+ DumpableObject *nextobj)
+{
+ /* remove boundary's dependency on object after it in loop */
+ removeObjectDependency(boundaryobj, nextobj->dumpId);
+ /* if that object is a function, mark it as postponed into post-data */
+ if (nextobj->objType == DO_FUNC)
+ {
+ FuncInfo *nextinfo = (FuncInfo *) nextobj;
+
+ nextinfo->postponed_def = true;
+ }
+}
+
+/*
+ * Because we make tables depend on their CHECK constraints, while there
+ * will be an automatic dependency in the other direction, we need to break
+ * the loop. If there are no other objects in the loop then we can remove
+ * the automatic dependency and leave the CHECK constraint non-separate.
+ */
+static void
+repairTableConstraintLoop(DumpableObject *tableobj,
+ DumpableObject *constraintobj)
+{
+ /* remove constraint's dependency on table */
+ removeObjectDependency(constraintobj, tableobj->dumpId);
+}
+
+/*
+ * However, if there are other objects in the loop, we must break the loop
+ * by making the CHECK constraint a separately-dumped object.
+ *
+ * Because findLoop() finds shorter cycles before longer ones, it's likely
+ * that we will have previously fired repairTableConstraintLoop() and
+ * removed the constraint's dependency on the table. Put it back to ensure
+ * the constraint won't be emitted before the table...
+ */
+static void
+repairTableConstraintMultiLoop(DumpableObject *tableobj,
+ DumpableObject *constraintobj)
+{
+ /* remove table's dependency on constraint */
+ removeObjectDependency(tableobj, constraintobj->dumpId);
+ /* mark constraint as needing its own dump */
+ ((ConstraintInfo *) constraintobj)->separate = true;
+ /* put back constraint's dependency on table */
+ addObjectDependency(constraintobj, tableobj->dumpId);
+ /* now that constraint is separate, it must be post-data */
+ addObjectDependency(constraintobj, postDataBoundId);
+}
+
+/*
+ * Attribute defaults behave exactly the same as CHECK constraints...
+ */
+static void
+repairTableAttrDefLoop(DumpableObject *tableobj,
+ DumpableObject *attrdefobj)
+{
+ /* remove attrdef's dependency on table */
+ removeObjectDependency(attrdefobj, tableobj->dumpId);
+}
+
+static void
+repairTableAttrDefMultiLoop(DumpableObject *tableobj,
+ DumpableObject *attrdefobj)
+{
+ /* remove table's dependency on attrdef */
+ removeObjectDependency(tableobj, attrdefobj->dumpId);
+ /* mark attrdef as needing its own dump */
+ ((AttrDefInfo *) attrdefobj)->separate = true;
+ /* put back attrdef's dependency on table */
+ addObjectDependency(attrdefobj, tableobj->dumpId);
+}
+
+/*
+ * CHECK constraints on domains work just like those on tables ...
+ */
+static void
+repairDomainConstraintLoop(DumpableObject *domainobj,
+ DumpableObject *constraintobj)
+{
+ /* remove constraint's dependency on domain */
+ removeObjectDependency(constraintobj, domainobj->dumpId);
+}
+
+static void
+repairDomainConstraintMultiLoop(DumpableObject *domainobj,
+ DumpableObject *constraintobj)
+{
+ /* remove domain's dependency on constraint */
+ removeObjectDependency(domainobj, constraintobj->dumpId);
+ /* mark constraint as needing its own dump */
+ ((ConstraintInfo *) constraintobj)->separate = true;
+ /* put back constraint's dependency on domain */
+ addObjectDependency(constraintobj, domainobj->dumpId);
+ /* now that constraint is separate, it must be post-data */
+ addObjectDependency(constraintobj, postDataBoundId);
+}
+
+static void
+repairIndexLoop(DumpableObject *partedindex,
+ DumpableObject *partindex)
+{
+ removeObjectDependency(partedindex, partindex->dumpId);
+}
+
+/*
+ * Fix a dependency loop, or die trying ...
+ *
+ * This routine is mainly concerned with reducing the multiple ways that
+ * a loop might appear to common cases, which it passes off to the
+ * "fixer" routines above.
+ */
+static void
+repairDependencyLoop(DumpableObject **loop,
+ int nLoop)
+{
+ int i,
+ j;
+
+ /* Datatype and one of its I/O or canonicalize functions */
+ if (nLoop == 2 &&
+ loop[0]->objType == DO_TYPE &&
+ loop[1]->objType == DO_FUNC)
+ {
+ repairTypeFuncLoop(loop[0], loop[1]);
+ return;
+ }
+ if (nLoop == 2 &&
+ loop[1]->objType == DO_TYPE &&
+ loop[0]->objType == DO_FUNC)
+ {
+ repairTypeFuncLoop(loop[1], loop[0]);
+ return;
+ }
+
+ /* View (including matview) and its ON SELECT rule */
+ if (nLoop == 2 &&
+ loop[0]->objType == DO_TABLE &&
+ loop[1]->objType == DO_RULE &&
+ (((TableInfo *) loop[0])->relkind == RELKIND_VIEW ||
+ ((TableInfo *) loop[0])->relkind == RELKIND_MATVIEW) &&
+ ((RuleInfo *) loop[1])->ev_type == '1' &&
+ ((RuleInfo *) loop[1])->is_instead &&
+ ((RuleInfo *) loop[1])->ruletable == (TableInfo *) loop[0])
+ {
+ repairViewRuleLoop(loop[0], loop[1]);
+ return;
+ }
+ if (nLoop == 2 &&
+ loop[1]->objType == DO_TABLE &&
+ loop[0]->objType == DO_RULE &&
+ (((TableInfo *) loop[1])->relkind == RELKIND_VIEW ||
+ ((TableInfo *) loop[1])->relkind == RELKIND_MATVIEW) &&
+ ((RuleInfo *) loop[0])->ev_type == '1' &&
+ ((RuleInfo *) loop[0])->is_instead &&
+ ((RuleInfo *) loop[0])->ruletable == (TableInfo *) loop[1])
+ {
+ repairViewRuleLoop(loop[1], loop[0]);
+ return;
+ }
+
+ /* Indirect loop involving view (but not matview) and ON SELECT rule */
+ if (nLoop > 2)
+ {
+ for (i = 0; i < nLoop; i++)
+ {
+ if (loop[i]->objType == DO_TABLE &&
+ ((TableInfo *) loop[i])->relkind == RELKIND_VIEW)
+ {
+ for (j = 0; j < nLoop; j++)
+ {
+ if (loop[j]->objType == DO_RULE &&
+ ((RuleInfo *) loop[j])->ev_type == '1' &&
+ ((RuleInfo *) loop[j])->is_instead &&
+ ((RuleInfo *) loop[j])->ruletable == (TableInfo *) loop[i])
+ {
+ repairViewRuleMultiLoop(loop[i], loop[j]);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ /* Indirect loop involving matview and data boundary */
+ if (nLoop > 2)
+ {
+ for (i = 0; i < nLoop; i++)
+ {
+ if (loop[i]->objType == DO_TABLE &&
+ ((TableInfo *) loop[i])->relkind == RELKIND_MATVIEW)
+ {
+ for (j = 0; j < nLoop; j++)
+ {
+ if (loop[j]->objType == DO_PRE_DATA_BOUNDARY)
+ {
+ DumpableObject *nextobj;
+
+ nextobj = (j < nLoop - 1) ? loop[j + 1] : loop[0];
+ repairMatViewBoundaryMultiLoop(loop[j], nextobj);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ /* Indirect loop involving function and data boundary */
+ if (nLoop > 2)
+ {
+ for (i = 0; i < nLoop; i++)
+ {
+ if (loop[i]->objType == DO_FUNC)
+ {
+ for (j = 0; j < nLoop; j++)
+ {
+ if (loop[j]->objType == DO_PRE_DATA_BOUNDARY)
+ {
+ DumpableObject *nextobj;
+
+ nextobj = (j < nLoop - 1) ? loop[j + 1] : loop[0];
+ repairFunctionBoundaryMultiLoop(loop[j], nextobj);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ /* Table and CHECK constraint */
+ if (nLoop == 2 &&
+ loop[0]->objType == DO_TABLE &&
+ loop[1]->objType == DO_CONSTRAINT &&
+ ((ConstraintInfo *) loop[1])->contype == 'c' &&
+ ((ConstraintInfo *) loop[1])->contable == (TableInfo *) loop[0])
+ {
+ repairTableConstraintLoop(loop[0], loop[1]);
+ return;
+ }
+ if (nLoop == 2 &&
+ loop[1]->objType == DO_TABLE &&
+ loop[0]->objType == DO_CONSTRAINT &&
+ ((ConstraintInfo *) loop[0])->contype == 'c' &&
+ ((ConstraintInfo *) loop[0])->contable == (TableInfo *) loop[1])
+ {
+ repairTableConstraintLoop(loop[1], loop[0]);
+ return;
+ }
+
+ /* Indirect loop involving table and CHECK constraint */
+ if (nLoop > 2)
+ {
+ for (i = 0; i < nLoop; i++)
+ {
+ if (loop[i]->objType == DO_TABLE)
+ {
+ for (j = 0; j < nLoop; j++)
+ {
+ if (loop[j]->objType == DO_CONSTRAINT &&
+ ((ConstraintInfo *) loop[j])->contype == 'c' &&
+ ((ConstraintInfo *) loop[j])->contable == (TableInfo *) loop[i])
+ {
+ repairTableConstraintMultiLoop(loop[i], loop[j]);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ /* Table and attribute default */
+ if (nLoop == 2 &&
+ loop[0]->objType == DO_TABLE &&
+ loop[1]->objType == DO_ATTRDEF &&
+ ((AttrDefInfo *) loop[1])->adtable == (TableInfo *) loop[0])
+ {
+ repairTableAttrDefLoop(loop[0], loop[1]);
+ return;
+ }
+ if (nLoop == 2 &&
+ loop[1]->objType == DO_TABLE &&
+ loop[0]->objType == DO_ATTRDEF &&
+ ((AttrDefInfo *) loop[0])->adtable == (TableInfo *) loop[1])
+ {
+ repairTableAttrDefLoop(loop[1], loop[0]);
+ return;
+ }
+
+ /* index on partitioned table and corresponding index on partition */
+ if (nLoop == 2 &&
+ loop[0]->objType == DO_INDEX &&
+ loop[1]->objType == DO_INDEX)
+ {
+ if (((IndxInfo *) loop[0])->parentidx == loop[1]->catId.oid)
+ {
+ repairIndexLoop(loop[0], loop[1]);
+ return;
+ }
+ else if (((IndxInfo *) loop[1])->parentidx == loop[0]->catId.oid)
+ {
+ repairIndexLoop(loop[1], loop[0]);
+ return;
+ }
+ }
+
+ /* Indirect loop involving table and attribute default */
+ if (nLoop > 2)
+ {
+ for (i = 0; i < nLoop; i++)
+ {
+ if (loop[i]->objType == DO_TABLE)
+ {
+ for (j = 0; j < nLoop; j++)
+ {
+ if (loop[j]->objType == DO_ATTRDEF &&
+ ((AttrDefInfo *) loop[j])->adtable == (TableInfo *) loop[i])
+ {
+ repairTableAttrDefMultiLoop(loop[i], loop[j]);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ /* Domain and CHECK constraint */
+ if (nLoop == 2 &&
+ loop[0]->objType == DO_TYPE &&
+ loop[1]->objType == DO_CONSTRAINT &&
+ ((ConstraintInfo *) loop[1])->contype == 'c' &&
+ ((ConstraintInfo *) loop[1])->condomain == (TypeInfo *) loop[0])
+ {
+ repairDomainConstraintLoop(loop[0], loop[1]);
+ return;
+ }
+ if (nLoop == 2 &&
+ loop[1]->objType == DO_TYPE &&
+ loop[0]->objType == DO_CONSTRAINT &&
+ ((ConstraintInfo *) loop[0])->contype == 'c' &&
+ ((ConstraintInfo *) loop[0])->condomain == (TypeInfo *) loop[1])
+ {
+ repairDomainConstraintLoop(loop[1], loop[0]);
+ return;
+ }
+
+ /* Indirect loop involving domain and CHECK constraint */
+ if (nLoop > 2)
+ {
+ for (i = 0; i < nLoop; i++)
+ {
+ if (loop[i]->objType == DO_TYPE)
+ {
+ for (j = 0; j < nLoop; j++)
+ {
+ if (loop[j]->objType == DO_CONSTRAINT &&
+ ((ConstraintInfo *) loop[j])->contype == 'c' &&
+ ((ConstraintInfo *) loop[j])->condomain == (TypeInfo *) loop[i])
+ {
+ repairDomainConstraintMultiLoop(loop[i], loop[j]);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * Loop of table with itself --- just ignore it.
+ *
+ * (Actually, what this arises from is a dependency of a table column on
+ * another column, which happened with generated columns before v15; or a
+ * dependency of a table column on the whole table, which happens with
+ * partitioning. But we didn't pay attention to sub-object IDs while
+ * collecting the dependency data, so we can't see that here.)
+ */
+ if (nLoop == 1)
+ {
+ if (loop[0]->objType == DO_TABLE)
+ {
+ removeObjectDependency(loop[0], loop[0]->dumpId);
+ return;
+ }
+ }
+
+ /*
+ * If all the objects are TABLE_DATA items, what we must have is a
+ * circular set of foreign key constraints (or a single self-referential
+ * table). Print an appropriate complaint and break the loop arbitrarily.
+ */
+ for (i = 0; i < nLoop; i++)
+ {
+ if (loop[i]->objType != DO_TABLE_DATA)
+ break;
+ }
+ if (i >= nLoop)
+ {
+ pg_log_warning(ngettext("there are circular foreign-key constraints on this table:",
+ "there are circular foreign-key constraints among these tables:",
+ nLoop));
+ for (i = 0; i < nLoop; i++)
+ pg_log_warning_detail("%s", loop[i]->name);
+ pg_log_warning_hint("You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints.");
+ pg_log_warning_hint("Consider using a full dump instead of a --data-only dump to avoid this problem.");
+ if (nLoop > 1)
+ removeObjectDependency(loop[0], loop[1]->dumpId);
+ else /* must be a self-dependency */
+ removeObjectDependency(loop[0], loop[0]->dumpId);
+ return;
+ }
+
+ /*
+ * If we can't find a principled way to break the loop, complain and break
+ * it in an arbitrary fashion.
+ */
+ pg_log_warning("could not resolve dependency loop among these items:");
+ for (i = 0; i < nLoop; i++)
+ {
+ char buf[1024];
+
+ describeDumpableObject(loop[i], buf, sizeof(buf));
+ pg_log_warning_detail("%s", buf);
+ }
+
+ if (nLoop > 1)
+ removeObjectDependency(loop[0], loop[1]->dumpId);
+ else /* must be a self-dependency */
+ removeObjectDependency(loop[0], loop[0]->dumpId);
+}
+
+/*
+ * Describe a dumpable object usefully for errors
+ *
+ * This should probably go somewhere else...
+ */
+static void
+describeDumpableObject(DumpableObject *obj, char *buf, int bufsize)
+{
+ switch (obj->objType)
+ {
+ case DO_NAMESPACE:
+ snprintf(buf, bufsize,
+ "SCHEMA %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_EXTENSION:
+ snprintf(buf, bufsize,
+ "EXTENSION %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TYPE:
+ snprintf(buf, bufsize,
+ "TYPE %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_SHELL_TYPE:
+ snprintf(buf, bufsize,
+ "SHELL TYPE %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_FUNC:
+ snprintf(buf, bufsize,
+ "FUNCTION %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_AGG:
+ snprintf(buf, bufsize,
+ "AGGREGATE %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_OPERATOR:
+ snprintf(buf, bufsize,
+ "OPERATOR %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_ACCESS_METHOD:
+ snprintf(buf, bufsize,
+ "ACCESS METHOD %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_OPCLASS:
+ snprintf(buf, bufsize,
+ "OPERATOR CLASS %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_OPFAMILY:
+ snprintf(buf, bufsize,
+ "OPERATOR FAMILY %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_COLLATION:
+ snprintf(buf, bufsize,
+ "COLLATION %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_CONVERSION:
+ snprintf(buf, bufsize,
+ "CONVERSION %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TABLE:
+ snprintf(buf, bufsize,
+ "TABLE %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TABLE_ATTACH:
+ snprintf(buf, bufsize,
+ "TABLE ATTACH %s (ID %d)",
+ obj->name, obj->dumpId);
+ return;
+ case DO_ATTRDEF:
+ snprintf(buf, bufsize,
+ "ATTRDEF %s.%s (ID %d OID %u)",
+ ((AttrDefInfo *) obj)->adtable->dobj.name,
+ ((AttrDefInfo *) obj)->adtable->attnames[((AttrDefInfo *) obj)->adnum - 1],
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_INDEX:
+ snprintf(buf, bufsize,
+ "INDEX %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_INDEX_ATTACH:
+ snprintf(buf, bufsize,
+ "INDEX ATTACH %s (ID %d)",
+ obj->name, obj->dumpId);
+ return;
+ case DO_STATSEXT:
+ snprintf(buf, bufsize,
+ "STATISTICS %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_REFRESH_MATVIEW:
+ snprintf(buf, bufsize,
+ "REFRESH MATERIALIZED VIEW %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_RULE:
+ snprintf(buf, bufsize,
+ "RULE %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TRIGGER:
+ snprintf(buf, bufsize,
+ "TRIGGER %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_EVENT_TRIGGER:
+ snprintf(buf, bufsize,
+ "EVENT TRIGGER %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_CONSTRAINT:
+ snprintf(buf, bufsize,
+ "CONSTRAINT %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_FK_CONSTRAINT:
+ snprintf(buf, bufsize,
+ "FK CONSTRAINT %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_PROCLANG:
+ snprintf(buf, bufsize,
+ "PROCEDURAL LANGUAGE %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_CAST:
+ snprintf(buf, bufsize,
+ "CAST %u to %u (ID %d OID %u)",
+ ((CastInfo *) obj)->castsource,
+ ((CastInfo *) obj)->casttarget,
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TRANSFORM:
+ snprintf(buf, bufsize,
+ "TRANSFORM %u lang %u (ID %d OID %u)",
+ ((TransformInfo *) obj)->trftype,
+ ((TransformInfo *) obj)->trflang,
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TABLE_DATA:
+ snprintf(buf, bufsize,
+ "TABLE DATA %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_SEQUENCE_SET:
+ snprintf(buf, bufsize,
+ "SEQUENCE SET %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_DUMMY_TYPE:
+ snprintf(buf, bufsize,
+ "DUMMY TYPE %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TSPARSER:
+ snprintf(buf, bufsize,
+ "TEXT SEARCH PARSER %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TSDICT:
+ snprintf(buf, bufsize,
+ "TEXT SEARCH DICTIONARY %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TSTEMPLATE:
+ snprintf(buf, bufsize,
+ "TEXT SEARCH TEMPLATE %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TSCONFIG:
+ snprintf(buf, bufsize,
+ "TEXT SEARCH CONFIGURATION %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_FDW:
+ snprintf(buf, bufsize,
+ "FOREIGN DATA WRAPPER %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_FOREIGN_SERVER:
+ snprintf(buf, bufsize,
+ "FOREIGN SERVER %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_DEFAULT_ACL:
+ snprintf(buf, bufsize,
+ "DEFAULT ACL %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_BLOB:
+ snprintf(buf, bufsize,
+ "BLOB (ID %d OID %u)",
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_BLOB_DATA:
+ snprintf(buf, bufsize,
+ "BLOB DATA (ID %d)",
+ obj->dumpId);
+ return;
+ case DO_POLICY:
+ snprintf(buf, bufsize,
+ "POLICY (ID %d OID %u)",
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_PUBLICATION:
+ snprintf(buf, bufsize,
+ "PUBLICATION (ID %d OID %u)",
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_PUBLICATION_REL:
+ snprintf(buf, bufsize,
+ "PUBLICATION TABLE (ID %d OID %u)",
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_PUBLICATION_TABLE_IN_SCHEMA:
+ snprintf(buf, bufsize,
+ "PUBLICATION TABLES IN SCHEMA (ID %d OID %u)",
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_SUBSCRIPTION:
+ snprintf(buf, bufsize,
+ "SUBSCRIPTION (ID %d OID %u)",
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_PRE_DATA_BOUNDARY:
+ snprintf(buf, bufsize,
+ "PRE-DATA BOUNDARY (ID %d)",
+ obj->dumpId);
+ return;
+ case DO_POST_DATA_BOUNDARY:
+ snprintf(buf, bufsize,
+ "POST-DATA BOUNDARY (ID %d)",
+ obj->dumpId);
+ return;
+ }
+ /* shouldn't get here */
+ snprintf(buf, bufsize,
+ "object type %d (ID %d OID %u)",
+ (int) obj->objType,
+ obj->dumpId, obj->catId.oid);
+}
diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c
new file mode 100644
index 0000000..7e639f9
--- /dev/null
+++ b/src/bin/pg_dump/pg_dumpall.c
@@ -0,0 +1,1753 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_dumpall.c
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * pg_dumpall forces all pg_dump output to be text, since it also outputs
+ * text into the same output stream.
+ *
+ * src/bin/pg_dump/pg_dumpall.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <time.h>
+#include <unistd.h>
+
+#include "catalog/pg_authid_d.h"
+#include "common/connect.h"
+#include "common/file_utils.h"
+#include "common/logging.h"
+#include "common/string.h"
+#include "dumputils.h"
+#include "fe_utils/string_utils.h"
+#include "getopt_long.h"
+#include "pg_backup.h"
+
+/* version string we expect back from pg_dump */
+#define PGDUMP_VERSIONSTR "pg_dump (PostgreSQL) " PG_VERSION "\n"
+
+
+static void help(void);
+
+static void dropRoles(PGconn *conn);
+static void dumpRoles(PGconn *conn);
+static void dumpRoleMembership(PGconn *conn);
+static void dumpRoleGUCPrivs(PGconn *conn);
+static void dropTablespaces(PGconn *conn);
+static void dumpTablespaces(PGconn *conn);
+static void dropDBs(PGconn *conn);
+static void dumpUserConfig(PGconn *conn, const char *username);
+static void dumpDatabases(PGconn *conn);
+static void dumpTimestamp(const char *msg);
+static int runPgDump(const char *dbname, const char *create_opts);
+static void buildShSecLabels(PGconn *conn,
+ const char *catalog_name, Oid objectId,
+ const char *objtype, const char *objname,
+ PQExpBuffer buffer);
+static PGconn *connectDatabase(const char *dbname, const char *connstr, const char *pghost, const char *pgport,
+ const char *pguser, trivalue prompt_password, bool fail_on_error);
+static char *constructConnStr(const char **keywords, const char **values);
+static PGresult *executeQuery(PGconn *conn, const char *query);
+static void executeCommand(PGconn *conn, const char *query);
+static void expand_dbname_patterns(PGconn *conn, SimpleStringList *patterns,
+ SimpleStringList *names);
+
+static char pg_dump_bin[MAXPGPATH];
+static const char *progname;
+static PQExpBuffer pgdumpopts;
+static char *connstr = "";
+static bool output_clean = false;
+static bool skip_acls = false;
+static bool verbose = false;
+static bool dosync = true;
+
+static int binary_upgrade = 0;
+static int column_inserts = 0;
+static int disable_dollar_quoting = 0;
+static int disable_triggers = 0;
+static int if_exists = 0;
+static int inserts = 0;
+static int no_table_access_method = 0;
+static int no_tablespaces = 0;
+static int use_setsessauth = 0;
+static int no_comments = 0;
+static int no_publications = 0;
+static int no_security_labels = 0;
+static int no_subscriptions = 0;
+static int no_toast_compression = 0;
+static int no_unlogged_table_data = 0;
+static int no_role_passwords = 0;
+static int server_version;
+static int load_via_partition_root = 0;
+static int on_conflict_do_nothing = 0;
+
+static char role_catalog[10];
+#define PG_AUTHID "pg_authid"
+#define PG_ROLES "pg_roles "
+
+static FILE *OPF;
+static char *filename = NULL;
+
+static SimpleStringList database_exclude_patterns = {NULL, NULL};
+static SimpleStringList database_exclude_names = {NULL, NULL};
+
+#define exit_nicely(code) exit(code)
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"data-only", no_argument, NULL, 'a'},
+ {"clean", no_argument, NULL, 'c'},
+ {"encoding", required_argument, NULL, 'E'},
+ {"file", required_argument, NULL, 'f'},
+ {"globals-only", no_argument, NULL, 'g'},
+ {"host", required_argument, NULL, 'h'},
+ {"dbname", required_argument, NULL, 'd'},
+ {"database", required_argument, NULL, 'l'},
+ {"no-owner", no_argument, NULL, 'O'},
+ {"port", required_argument, NULL, 'p'},
+ {"roles-only", no_argument, NULL, 'r'},
+ {"schema-only", no_argument, NULL, 's'},
+ {"superuser", required_argument, NULL, 'S'},
+ {"tablespaces-only", no_argument, NULL, 't'},
+ {"username", required_argument, NULL, 'U'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"no-privileges", no_argument, NULL, 'x'},
+ {"no-acl", no_argument, NULL, 'x'},
+
+ /*
+ * the following options don't have an equivalent short option letter
+ */
+ {"attribute-inserts", no_argument, &column_inserts, 1},
+ {"binary-upgrade", no_argument, &binary_upgrade, 1},
+ {"column-inserts", no_argument, &column_inserts, 1},
+ {"disable-dollar-quoting", no_argument, &disable_dollar_quoting, 1},
+ {"disable-triggers", no_argument, &disable_triggers, 1},
+ {"exclude-database", required_argument, NULL, 6},
+ {"extra-float-digits", required_argument, NULL, 5},
+ {"if-exists", no_argument, &if_exists, 1},
+ {"inserts", no_argument, &inserts, 1},
+ {"lock-wait-timeout", required_argument, NULL, 2},
+ {"no-table-access-method", no_argument, &no_table_access_method, 1},
+ {"no-tablespaces", no_argument, &no_tablespaces, 1},
+ {"quote-all-identifiers", no_argument, &quote_all_identifiers, 1},
+ {"load-via-partition-root", no_argument, &load_via_partition_root, 1},
+ {"role", required_argument, NULL, 3},
+ {"use-set-session-authorization", no_argument, &use_setsessauth, 1},
+ {"no-comments", no_argument, &no_comments, 1},
+ {"no-publications", no_argument, &no_publications, 1},
+ {"no-role-passwords", no_argument, &no_role_passwords, 1},
+ {"no-security-labels", no_argument, &no_security_labels, 1},
+ {"no-subscriptions", no_argument, &no_subscriptions, 1},
+ {"no-sync", no_argument, NULL, 4},
+ {"no-toast-compression", no_argument, &no_toast_compression, 1},
+ {"no-unlogged-table-data", no_argument, &no_unlogged_table_data, 1},
+ {"on-conflict-do-nothing", no_argument, &on_conflict_do_nothing, 1},
+ {"rows-per-insert", required_argument, NULL, 7},
+
+ {NULL, 0, NULL, 0}
+ };
+
+ char *pghost = NULL;
+ char *pgport = NULL;
+ char *pguser = NULL;
+ char *pgdb = NULL;
+ char *use_role = NULL;
+ const char *dumpencoding = NULL;
+ trivalue prompt_password = TRI_DEFAULT;
+ bool data_only = false;
+ bool globals_only = false;
+ bool roles_only = false;
+ bool tablespaces_only = false;
+ PGconn *conn;
+ int encoding;
+ const char *std_strings;
+ int c,
+ ret;
+ int optindex;
+
+ pg_logging_init(argv[0]);
+ pg_logging_set_level(PG_LOG_WARNING);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_dump"));
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ help();
+ exit_nicely(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_dumpall (PostgreSQL) " PG_VERSION);
+ exit_nicely(0);
+ }
+ }
+
+ if ((ret = find_other_exec(argv[0], "pg_dump", PGDUMP_VERSIONSTR,
+ pg_dump_bin)) < 0)
+ {
+ char full_path[MAXPGPATH];
+
+ if (find_my_exec(argv[0], full_path) < 0)
+ strlcpy(full_path, progname, sizeof(full_path));
+
+ if (ret == -1)
+ pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"",
+ "pg_dump", progname, full_path);
+ else
+ pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s",
+ "pg_dump", full_path, progname);
+ }
+
+ pgdumpopts = createPQExpBuffer();
+
+ while ((c = getopt_long(argc, argv, "acd:E:f:gh:l:Op:rsS:tU:vwWx", long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'a':
+ data_only = true;
+ appendPQExpBufferStr(pgdumpopts, " -a");
+ break;
+
+ case 'c':
+ output_clean = true;
+ break;
+
+ case 'd':
+ connstr = pg_strdup(optarg);
+ break;
+
+ case 'E':
+ dumpencoding = pg_strdup(optarg);
+ appendPQExpBufferStr(pgdumpopts, " -E ");
+ appendShellString(pgdumpopts, optarg);
+ break;
+
+ case 'f':
+ filename = pg_strdup(optarg);
+ appendPQExpBufferStr(pgdumpopts, " -f ");
+ appendShellString(pgdumpopts, filename);
+ break;
+
+ case 'g':
+ globals_only = true;
+ break;
+
+ case 'h':
+ pghost = pg_strdup(optarg);
+ break;
+
+ case 'l':
+ pgdb = pg_strdup(optarg);
+ break;
+
+ case 'O':
+ appendPQExpBufferStr(pgdumpopts, " -O");
+ break;
+
+ case 'p':
+ pgport = pg_strdup(optarg);
+ break;
+
+ case 'r':
+ roles_only = true;
+ break;
+
+ case 's':
+ appendPQExpBufferStr(pgdumpopts, " -s");
+ break;
+
+ case 'S':
+ appendPQExpBufferStr(pgdumpopts, " -S ");
+ appendShellString(pgdumpopts, optarg);
+ break;
+
+ case 't':
+ tablespaces_only = true;
+ break;
+
+ case 'U':
+ pguser = pg_strdup(optarg);
+ break;
+
+ case 'v':
+ verbose = true;
+ pg_logging_increase_verbosity();
+ appendPQExpBufferStr(pgdumpopts, " -v");
+ break;
+
+ case 'w':
+ prompt_password = TRI_NO;
+ appendPQExpBufferStr(pgdumpopts, " -w");
+ break;
+
+ case 'W':
+ prompt_password = TRI_YES;
+ appendPQExpBufferStr(pgdumpopts, " -W");
+ break;
+
+ case 'x':
+ skip_acls = true;
+ appendPQExpBufferStr(pgdumpopts, " -x");
+ break;
+
+ case 0:
+ break;
+
+ case 2:
+ appendPQExpBufferStr(pgdumpopts, " --lock-wait-timeout ");
+ appendShellString(pgdumpopts, optarg);
+ break;
+
+ case 3:
+ use_role = pg_strdup(optarg);
+ appendPQExpBufferStr(pgdumpopts, " --role ");
+ appendShellString(pgdumpopts, use_role);
+ break;
+
+ case 4:
+ dosync = false;
+ appendPQExpBufferStr(pgdumpopts, " --no-sync");
+ break;
+
+ case 5:
+ appendPQExpBufferStr(pgdumpopts, " --extra-float-digits ");
+ appendShellString(pgdumpopts, optarg);
+ break;
+
+ case 6:
+ simple_string_list_append(&database_exclude_patterns, optarg);
+ break;
+
+ case 7:
+ appendPQExpBufferStr(pgdumpopts, " --rows-per-insert ");
+ appendShellString(pgdumpopts, optarg);
+ break;
+
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+ }
+
+ /* Complain if any arguments remain */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+
+ if (database_exclude_patterns.head != NULL &&
+ (globals_only || roles_only || tablespaces_only))
+ {
+ pg_log_error("option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+
+ /* Make sure the user hasn't specified a mix of globals-only options */
+ if (globals_only && roles_only)
+ {
+ pg_log_error("options -g/--globals-only and -r/--roles-only cannot be used together");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+
+ if (globals_only && tablespaces_only)
+ {
+ pg_log_error("options -g/--globals-only and -t/--tablespaces-only cannot be used together");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+
+ if (if_exists && !output_clean)
+ pg_fatal("option --if-exists requires option -c/--clean");
+
+ if (roles_only && tablespaces_only)
+ {
+ pg_log_error("options -r/--roles-only and -t/--tablespaces-only cannot be used together");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+
+ /*
+ * If password values are not required in the dump, switch to using
+ * pg_roles which is equally useful, just more likely to have unrestricted
+ * access than pg_authid.
+ */
+ if (no_role_passwords)
+ sprintf(role_catalog, "%s", PG_ROLES);
+ else
+ sprintf(role_catalog, "%s", PG_AUTHID);
+
+ /* Add long options to the pg_dump argument list */
+ if (binary_upgrade)
+ appendPQExpBufferStr(pgdumpopts, " --binary-upgrade");
+ if (column_inserts)
+ appendPQExpBufferStr(pgdumpopts, " --column-inserts");
+ if (disable_dollar_quoting)
+ appendPQExpBufferStr(pgdumpopts, " --disable-dollar-quoting");
+ if (disable_triggers)
+ appendPQExpBufferStr(pgdumpopts, " --disable-triggers");
+ if (inserts)
+ appendPQExpBufferStr(pgdumpopts, " --inserts");
+ if (no_table_access_method)
+ appendPQExpBufferStr(pgdumpopts, " --no-table-access-method");
+ if (no_tablespaces)
+ appendPQExpBufferStr(pgdumpopts, " --no-tablespaces");
+ if (quote_all_identifiers)
+ appendPQExpBufferStr(pgdumpopts, " --quote-all-identifiers");
+ if (load_via_partition_root)
+ appendPQExpBufferStr(pgdumpopts, " --load-via-partition-root");
+ if (use_setsessauth)
+ appendPQExpBufferStr(pgdumpopts, " --use-set-session-authorization");
+ if (no_comments)
+ appendPQExpBufferStr(pgdumpopts, " --no-comments");
+ if (no_publications)
+ appendPQExpBufferStr(pgdumpopts, " --no-publications");
+ if (no_security_labels)
+ appendPQExpBufferStr(pgdumpopts, " --no-security-labels");
+ if (no_subscriptions)
+ appendPQExpBufferStr(pgdumpopts, " --no-subscriptions");
+ if (no_toast_compression)
+ appendPQExpBufferStr(pgdumpopts, " --no-toast-compression");
+ if (no_unlogged_table_data)
+ appendPQExpBufferStr(pgdumpopts, " --no-unlogged-table-data");
+ if (on_conflict_do_nothing)
+ appendPQExpBufferStr(pgdumpopts, " --on-conflict-do-nothing");
+
+ /*
+ * If there was a database specified on the command line, use that,
+ * otherwise try to connect to database "postgres", and failing that
+ * "template1".
+ */
+ if (pgdb)
+ {
+ conn = connectDatabase(pgdb, connstr, pghost, pgport, pguser,
+ prompt_password, false);
+
+ if (!conn)
+ pg_fatal("could not connect to database \"%s\"", pgdb);
+ }
+ else
+ {
+ conn = connectDatabase("postgres", connstr, pghost, pgport, pguser,
+ prompt_password, false);
+ if (!conn)
+ conn = connectDatabase("template1", connstr, pghost, pgport, pguser,
+ prompt_password, true);
+
+ if (!conn)
+ {
+ pg_log_error("could not connect to databases \"postgres\" or \"template1\"\n"
+ "Please specify an alternative database.");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+ }
+
+ /*
+ * Get a list of database names that match the exclude patterns
+ */
+ expand_dbname_patterns(conn, &database_exclude_patterns,
+ &database_exclude_names);
+
+ /*
+ * Open the output file if required, otherwise use stdout
+ */
+ if (filename)
+ {
+ OPF = fopen(filename, PG_BINARY_W);
+ if (!OPF)
+ pg_fatal("could not open output file \"%s\": %m",
+ filename);
+ }
+ else
+ OPF = stdout;
+
+ /*
+ * Set the client encoding if requested.
+ */
+ if (dumpencoding)
+ {
+ if (PQsetClientEncoding(conn, dumpencoding) < 0)
+ pg_fatal("invalid client encoding \"%s\" specified",
+ dumpencoding);
+ }
+
+ /*
+ * Get the active encoding and the standard_conforming_strings setting, so
+ * we know how to escape strings.
+ */
+ encoding = PQclientEncoding(conn);
+ std_strings = PQparameterStatus(conn, "standard_conforming_strings");
+ if (!std_strings)
+ std_strings = "off";
+
+ /* Set the role if requested */
+ if (use_role)
+ {
+ PQExpBuffer query = createPQExpBuffer();
+
+ appendPQExpBuffer(query, "SET ROLE %s", fmtId(use_role));
+ executeCommand(conn, query->data);
+ destroyPQExpBuffer(query);
+ }
+
+ /* Force quoting of all identifiers if requested. */
+ if (quote_all_identifiers)
+ executeCommand(conn, "SET quote_all_identifiers = true");
+
+ fprintf(OPF, "--\n-- PostgreSQL database cluster dump\n--\n\n");
+ if (verbose)
+ dumpTimestamp("Started on");
+
+ /*
+ * We used to emit \connect postgres here, but that served no purpose
+ * other than to break things for installations without a postgres
+ * database. Everything we're restoring here is a global, so whichever
+ * database we're connected to at the moment is fine.
+ */
+
+ /* Restore will need to write to the target cluster */
+ fprintf(OPF, "SET default_transaction_read_only = off;\n\n");
+
+ /* Replicate encoding and std_strings in output */
+ fprintf(OPF, "SET client_encoding = '%s';\n",
+ pg_encoding_to_char(encoding));
+ fprintf(OPF, "SET standard_conforming_strings = %s;\n", std_strings);
+ if (strcmp(std_strings, "off") == 0)
+ fprintf(OPF, "SET escape_string_warning = off;\n");
+ fprintf(OPF, "\n");
+
+ if (!data_only)
+ {
+ /*
+ * If asked to --clean, do that first. We can avoid detailed
+ * dependency analysis because databases never depend on each other,
+ * and tablespaces never depend on each other. Roles could have
+ * grants to each other, but DROP ROLE will clean those up silently.
+ */
+ if (output_clean)
+ {
+ if (!globals_only && !roles_only && !tablespaces_only)
+ dropDBs(conn);
+
+ if (!roles_only && !no_tablespaces)
+ dropTablespaces(conn);
+
+ if (!tablespaces_only)
+ dropRoles(conn);
+ }
+
+ /*
+ * Now create objects as requested. Be careful that option logic here
+ * is the same as for drops above.
+ */
+ if (!tablespaces_only)
+ {
+ /* Dump roles (users) */
+ dumpRoles(conn);
+
+ /* Dump role memberships */
+ dumpRoleMembership(conn);
+
+ /* Dump role GUC privileges */
+ if (server_version >= 150000 && !skip_acls)
+ dumpRoleGUCPrivs(conn);
+ }
+
+ /* Dump tablespaces */
+ if (!roles_only && !no_tablespaces)
+ dumpTablespaces(conn);
+ }
+
+ if (!globals_only && !roles_only && !tablespaces_only)
+ dumpDatabases(conn);
+
+ PQfinish(conn);
+
+ if (verbose)
+ dumpTimestamp("Completed on");
+ fprintf(OPF, "--\n-- PostgreSQL database cluster dump complete\n--\n\n");
+
+ if (filename)
+ {
+ fclose(OPF);
+
+ /* sync the resulting file, errors are not fatal */
+ if (dosync)
+ (void) fsync_fname(filename, false);
+ }
+
+ exit_nicely(0);
+}
+
+
+static void
+help(void)
+{
+ printf(_("%s extracts a PostgreSQL database cluster into an SQL script file.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]...\n"), progname);
+
+ printf(_("\nGeneral options:\n"));
+ printf(_(" -f, --file=FILENAME output file name\n"));
+ printf(_(" -v, --verbose verbose mode\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nOptions controlling the output content:\n"));
+ printf(_(" -a, --data-only dump only the data, not the schema\n"));
+ printf(_(" -c, --clean clean (drop) databases before recreating\n"));
+ printf(_(" -E, --encoding=ENCODING dump the data in encoding ENCODING\n"));
+ printf(_(" -g, --globals-only dump only global objects, no databases\n"));
+ printf(_(" -O, --no-owner skip restoration of object ownership\n"));
+ printf(_(" -r, --roles-only dump only roles, no databases or tablespaces\n"));
+ printf(_(" -s, --schema-only dump only the schema, no data\n"));
+ printf(_(" -S, --superuser=NAME superuser user name to use in the dump\n"));
+ printf(_(" -t, --tablespaces-only dump only tablespaces, no databases or roles\n"));
+ printf(_(" -x, --no-privileges do not dump privileges (grant/revoke)\n"));
+ printf(_(" --binary-upgrade for use by upgrade utilities only\n"));
+ printf(_(" --column-inserts dump data as INSERT commands with column names\n"));
+ printf(_(" --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"));
+ printf(_(" --disable-triggers disable triggers during data-only restore\n"));
+ printf(_(" --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"));
+ printf(_(" --extra-float-digits=NUM override default setting for extra_float_digits\n"));
+ printf(_(" --if-exists use IF EXISTS when dropping objects\n"));
+ printf(_(" --inserts dump data as INSERT commands, rather than COPY\n"));
+ printf(_(" --load-via-partition-root load partitions via the root table\n"));
+ printf(_(" --no-comments do not dump comments\n"));
+ printf(_(" --no-publications do not dump publications\n"));
+ printf(_(" --no-role-passwords do not dump passwords for roles\n"));
+ printf(_(" --no-security-labels do not dump security label assignments\n"));
+ printf(_(" --no-subscriptions do not dump subscriptions\n"));
+ printf(_(" --no-sync do not wait for changes to be written safely to disk\n"));
+ printf(_(" --no-table-access-method do not dump table access methods\n"));
+ printf(_(" --no-tablespaces do not dump tablespace assignments\n"));
+ printf(_(" --no-toast-compression do not dump TOAST compression methods\n"));
+ printf(_(" --no-unlogged-table-data do not dump unlogged table data\n"));
+ printf(_(" --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"));
+ printf(_(" --quote-all-identifiers quote all identifiers, even if not key words\n"));
+ printf(_(" --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"));
+ printf(_(" --use-set-session-authorization\n"
+ " use SET SESSION AUTHORIZATION commands instead of\n"
+ " ALTER OWNER commands to set ownership\n"));
+
+ printf(_("\nConnection options:\n"));
+ printf(_(" -d, --dbname=CONNSTR connect using connection string\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -l, --database=DBNAME alternative default database\n"));
+ printf(_(" -p, --port=PORT database server port number\n"));
+ printf(_(" -U, --username=NAME connect as specified database user\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt (should happen automatically)\n"));
+ printf(_(" --role=ROLENAME do SET ROLE before dump\n"));
+
+ printf(_("\nIf -f/--file is not used, then the SQL script will be written to the standard\n"
+ "output.\n\n"));
+ printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+
+/*
+ * Drop roles
+ */
+static void
+dropRoles(PGconn *conn)
+{
+ PQExpBuffer buf = createPQExpBuffer();
+ PGresult *res;
+ int i_rolname;
+ int i;
+
+ if (server_version >= 90600)
+ printfPQExpBuffer(buf,
+ "SELECT rolname "
+ "FROM %s "
+ "WHERE rolname !~ '^pg_' "
+ "ORDER BY 1", role_catalog);
+ else
+ printfPQExpBuffer(buf,
+ "SELECT rolname "
+ "FROM %s "
+ "ORDER BY 1", role_catalog);
+
+ res = executeQuery(conn, buf->data);
+
+ i_rolname = PQfnumber(res, "rolname");
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "--\n-- Drop roles\n--\n\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ const char *rolename;
+
+ rolename = PQgetvalue(res, i, i_rolname);
+
+ fprintf(OPF, "DROP ROLE %s%s;\n",
+ if_exists ? "IF EXISTS " : "",
+ fmtId(rolename));
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(buf);
+
+ fprintf(OPF, "\n\n");
+}
+
+/*
+ * Dump roles
+ */
+static void
+dumpRoles(PGconn *conn)
+{
+ PQExpBuffer buf = createPQExpBuffer();
+ PGresult *res;
+ int i_oid,
+ i_rolname,
+ i_rolsuper,
+ i_rolinherit,
+ i_rolcreaterole,
+ i_rolcreatedb,
+ i_rolcanlogin,
+ i_rolconnlimit,
+ i_rolpassword,
+ i_rolvaliduntil,
+ i_rolreplication,
+ i_rolbypassrls,
+ i_rolcomment,
+ i_is_current_user;
+ int i;
+
+ /* note: rolconfig is dumped later */
+ if (server_version >= 90600)
+ printfPQExpBuffer(buf,
+ "SELECT oid, rolname, rolsuper, rolinherit, "
+ "rolcreaterole, rolcreatedb, "
+ "rolcanlogin, rolconnlimit, rolpassword, "
+ "rolvaliduntil, rolreplication, rolbypassrls, "
+ "pg_catalog.shobj_description(oid, '%s') as rolcomment, "
+ "rolname = current_user AS is_current_user "
+ "FROM %s "
+ "WHERE rolname !~ '^pg_' "
+ "ORDER BY 2", role_catalog, role_catalog);
+ else if (server_version >= 90500)
+ printfPQExpBuffer(buf,
+ "SELECT oid, rolname, rolsuper, rolinherit, "
+ "rolcreaterole, rolcreatedb, "
+ "rolcanlogin, rolconnlimit, rolpassword, "
+ "rolvaliduntil, rolreplication, rolbypassrls, "
+ "pg_catalog.shobj_description(oid, '%s') as rolcomment, "
+ "rolname = current_user AS is_current_user "
+ "FROM %s "
+ "ORDER BY 2", role_catalog, role_catalog);
+ else
+ printfPQExpBuffer(buf,
+ "SELECT oid, rolname, rolsuper, rolinherit, "
+ "rolcreaterole, rolcreatedb, "
+ "rolcanlogin, rolconnlimit, rolpassword, "
+ "rolvaliduntil, rolreplication, "
+ "false as rolbypassrls, "
+ "pg_catalog.shobj_description(oid, '%s') as rolcomment, "
+ "rolname = current_user AS is_current_user "
+ "FROM %s "
+ "ORDER BY 2", role_catalog, role_catalog);
+
+ res = executeQuery(conn, buf->data);
+
+ i_oid = PQfnumber(res, "oid");
+ i_rolname = PQfnumber(res, "rolname");
+ i_rolsuper = PQfnumber(res, "rolsuper");
+ i_rolinherit = PQfnumber(res, "rolinherit");
+ i_rolcreaterole = PQfnumber(res, "rolcreaterole");
+ i_rolcreatedb = PQfnumber(res, "rolcreatedb");
+ i_rolcanlogin = PQfnumber(res, "rolcanlogin");
+ i_rolconnlimit = PQfnumber(res, "rolconnlimit");
+ i_rolpassword = PQfnumber(res, "rolpassword");
+ i_rolvaliduntil = PQfnumber(res, "rolvaliduntil");
+ i_rolreplication = PQfnumber(res, "rolreplication");
+ i_rolbypassrls = PQfnumber(res, "rolbypassrls");
+ i_rolcomment = PQfnumber(res, "rolcomment");
+ i_is_current_user = PQfnumber(res, "is_current_user");
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "--\n-- Roles\n--\n\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ const char *rolename;
+ Oid auth_oid;
+
+ auth_oid = atooid(PQgetvalue(res, i, i_oid));
+ rolename = PQgetvalue(res, i, i_rolname);
+
+ if (strncmp(rolename, "pg_", 3) == 0)
+ {
+ pg_log_warning("role name starting with \"pg_\" skipped (%s)",
+ rolename);
+ continue;
+ }
+
+ resetPQExpBuffer(buf);
+
+ if (binary_upgrade)
+ {
+ appendPQExpBufferStr(buf, "\n-- For binary upgrade, must preserve pg_authid.oid\n");
+ appendPQExpBuffer(buf,
+ "SELECT pg_catalog.binary_upgrade_set_next_pg_authid_oid('%u'::pg_catalog.oid);\n\n",
+ auth_oid);
+ }
+
+ /*
+ * We dump CREATE ROLE followed by ALTER ROLE to ensure that the role
+ * will acquire the right properties even if it already exists (ie, it
+ * won't hurt for the CREATE to fail). This is particularly important
+ * for the role we are connected as, since even with --clean we will
+ * have failed to drop it. binary_upgrade cannot generate any errors,
+ * so we assume the current role is already created.
+ */
+ if (!binary_upgrade ||
+ strcmp(PQgetvalue(res, i, i_is_current_user), "f") == 0)
+ appendPQExpBuffer(buf, "CREATE ROLE %s;\n", fmtId(rolename));
+ appendPQExpBuffer(buf, "ALTER ROLE %s WITH", fmtId(rolename));
+
+ if (strcmp(PQgetvalue(res, i, i_rolsuper), "t") == 0)
+ appendPQExpBufferStr(buf, " SUPERUSER");
+ else
+ appendPQExpBufferStr(buf, " NOSUPERUSER");
+
+ if (strcmp(PQgetvalue(res, i, i_rolinherit), "t") == 0)
+ appendPQExpBufferStr(buf, " INHERIT");
+ else
+ appendPQExpBufferStr(buf, " NOINHERIT");
+
+ if (strcmp(PQgetvalue(res, i, i_rolcreaterole), "t") == 0)
+ appendPQExpBufferStr(buf, " CREATEROLE");
+ else
+ appendPQExpBufferStr(buf, " NOCREATEROLE");
+
+ if (strcmp(PQgetvalue(res, i, i_rolcreatedb), "t") == 0)
+ appendPQExpBufferStr(buf, " CREATEDB");
+ else
+ appendPQExpBufferStr(buf, " NOCREATEDB");
+
+ if (strcmp(PQgetvalue(res, i, i_rolcanlogin), "t") == 0)
+ appendPQExpBufferStr(buf, " LOGIN");
+ else
+ appendPQExpBufferStr(buf, " NOLOGIN");
+
+ if (strcmp(PQgetvalue(res, i, i_rolreplication), "t") == 0)
+ appendPQExpBufferStr(buf, " REPLICATION");
+ else
+ appendPQExpBufferStr(buf, " NOREPLICATION");
+
+ if (strcmp(PQgetvalue(res, i, i_rolbypassrls), "t") == 0)
+ appendPQExpBufferStr(buf, " BYPASSRLS");
+ else
+ appendPQExpBufferStr(buf, " NOBYPASSRLS");
+
+ if (strcmp(PQgetvalue(res, i, i_rolconnlimit), "-1") != 0)
+ appendPQExpBuffer(buf, " CONNECTION LIMIT %s",
+ PQgetvalue(res, i, i_rolconnlimit));
+
+
+ if (!PQgetisnull(res, i, i_rolpassword) && !no_role_passwords)
+ {
+ appendPQExpBufferStr(buf, " PASSWORD ");
+ appendStringLiteralConn(buf, PQgetvalue(res, i, i_rolpassword), conn);
+ }
+
+ if (!PQgetisnull(res, i, i_rolvaliduntil))
+ appendPQExpBuffer(buf, " VALID UNTIL '%s'",
+ PQgetvalue(res, i, i_rolvaliduntil));
+
+ appendPQExpBufferStr(buf, ";\n");
+
+ if (!no_comments && !PQgetisnull(res, i, i_rolcomment))
+ {
+ appendPQExpBuffer(buf, "COMMENT ON ROLE %s IS ", fmtId(rolename));
+ appendStringLiteralConn(buf, PQgetvalue(res, i, i_rolcomment), conn);
+ appendPQExpBufferStr(buf, ";\n");
+ }
+
+ if (!no_security_labels)
+ buildShSecLabels(conn, "pg_authid", auth_oid,
+ "ROLE", rolename,
+ buf);
+
+ fprintf(OPF, "%s", buf->data);
+ }
+
+ /*
+ * Dump configuration settings for roles after all roles have been dumped.
+ * We do it this way because config settings for roles could mention the
+ * names of other roles.
+ */
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "\n--\n-- User Configurations\n--\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ dumpUserConfig(conn, PQgetvalue(res, i, i_rolname));
+
+ PQclear(res);
+
+ fprintf(OPF, "\n\n");
+
+ destroyPQExpBuffer(buf);
+}
+
+
+/*
+ * Dump role memberships.
+ *
+ * Note: we expect dumpRoles already created all the roles, but there is
+ * no membership yet.
+ */
+static void
+dumpRoleMembership(PGconn *conn)
+{
+ PQExpBuffer buf = createPQExpBuffer();
+ PGresult *res;
+ int i;
+
+ printfPQExpBuffer(buf, "SELECT ur.rolname AS roleid, "
+ "um.rolname AS member, "
+ "a.admin_option, "
+ "ug.rolname AS grantor "
+ "FROM pg_auth_members a "
+ "LEFT JOIN %s ur on ur.oid = a.roleid "
+ "LEFT JOIN %s um on um.oid = a.member "
+ "LEFT JOIN %s ug on ug.oid = a.grantor "
+ "WHERE NOT (ur.rolname ~ '^pg_' AND um.rolname ~ '^pg_')"
+ "ORDER BY 1,2,3", role_catalog, role_catalog, role_catalog);
+ res = executeQuery(conn, buf->data);
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "--\n-- Role memberships\n--\n\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ char *roleid = PQgetvalue(res, i, 0);
+ char *member = PQgetvalue(res, i, 1);
+ char *option = PQgetvalue(res, i, 2);
+
+ fprintf(OPF, "GRANT %s", fmtId(roleid));
+ fprintf(OPF, " TO %s", fmtId(member));
+ if (*option == 't')
+ fprintf(OPF, " WITH ADMIN OPTION");
+
+ /*
+ * We don't track the grantor very carefully in the backend, so cope
+ * with the possibility that it has been dropped.
+ */
+ if (!PQgetisnull(res, i, 3))
+ {
+ char *grantor = PQgetvalue(res, i, 3);
+
+ fprintf(OPF, " GRANTED BY %s", fmtId(grantor));
+ }
+ fprintf(OPF, ";\n");
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(buf);
+
+ fprintf(OPF, "\n\n");
+}
+
+
+/*
+ * Dump role configuration parameter privileges. This code is used for 15.0
+ * and later servers.
+ *
+ * Note: we expect dumpRoles already created all the roles, but there are
+ * no per-role configuration parameter privileges yet.
+ */
+static void
+dumpRoleGUCPrivs(PGconn *conn)
+{
+ PGresult *res;
+ int i;
+
+ /*
+ * Get all parameters that have non-default acls defined.
+ */
+ res = executeQuery(conn, "SELECT parname, "
+ "pg_catalog.pg_get_userbyid(" CppAsString2(BOOTSTRAP_SUPERUSERID) ") AS parowner, "
+ "paracl, "
+ "pg_catalog.acldefault('p', " CppAsString2(BOOTSTRAP_SUPERUSERID) ") AS acldefault "
+ "FROM pg_catalog.pg_parameter_acl "
+ "ORDER BY 1");
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "--\n-- Role privileges on configuration parameters\n--\n\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ PQExpBuffer buf = createPQExpBuffer();
+ char *parname = PQgetvalue(res, i, 0);
+ char *parowner = PQgetvalue(res, i, 1);
+ char *paracl = PQgetvalue(res, i, 2);
+ char *acldefault = PQgetvalue(res, i, 3);
+ char *fparname;
+
+ /* needed for buildACLCommands() */
+ fparname = pg_strdup(fmtId(parname));
+
+ if (!buildACLCommands(fparname, NULL, NULL, "PARAMETER",
+ paracl, acldefault,
+ parowner, "", server_version, buf))
+ {
+ pg_log_error("could not parse ACL list (%s) for parameter \"%s\"",
+ paracl, parname);
+ PQfinish(conn);
+ exit_nicely(1);
+ }
+
+ fprintf(OPF, "%s", buf->data);
+
+ free(fparname);
+ destroyPQExpBuffer(buf);
+ }
+
+ PQclear(res);
+ fprintf(OPF, "\n\n");
+}
+
+
+/*
+ * Drop tablespaces.
+ */
+static void
+dropTablespaces(PGconn *conn)
+{
+ PGresult *res;
+ int i;
+
+ /*
+ * Get all tablespaces except built-in ones (which we assume are named
+ * pg_xxx)
+ */
+ res = executeQuery(conn, "SELECT spcname "
+ "FROM pg_catalog.pg_tablespace "
+ "WHERE spcname !~ '^pg_' "
+ "ORDER BY 1");
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "--\n-- Drop tablespaces\n--\n\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ char *spcname = PQgetvalue(res, i, 0);
+
+ fprintf(OPF, "DROP TABLESPACE %s%s;\n",
+ if_exists ? "IF EXISTS " : "",
+ fmtId(spcname));
+ }
+
+ PQclear(res);
+
+ fprintf(OPF, "\n\n");
+}
+
+/*
+ * Dump tablespaces.
+ */
+static void
+dumpTablespaces(PGconn *conn)
+{
+ PGresult *res;
+ int i;
+
+ /*
+ * Get all tablespaces except built-in ones (which we assume are named
+ * pg_xxx)
+ */
+ res = executeQuery(conn, "SELECT oid, spcname, "
+ "pg_catalog.pg_get_userbyid(spcowner) AS spcowner, "
+ "pg_catalog.pg_tablespace_location(oid), "
+ "spcacl, acldefault('t', spcowner) AS acldefault, "
+ "array_to_string(spcoptions, ', '),"
+ "pg_catalog.shobj_description(oid, 'pg_tablespace') "
+ "FROM pg_catalog.pg_tablespace "
+ "WHERE spcname !~ '^pg_' "
+ "ORDER BY 1");
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "--\n-- Tablespaces\n--\n\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ PQExpBuffer buf = createPQExpBuffer();
+ Oid spcoid = atooid(PQgetvalue(res, i, 0));
+ char *spcname = PQgetvalue(res, i, 1);
+ char *spcowner = PQgetvalue(res, i, 2);
+ char *spclocation = PQgetvalue(res, i, 3);
+ char *spcacl = PQgetvalue(res, i, 4);
+ char *acldefault = PQgetvalue(res, i, 5);
+ char *spcoptions = PQgetvalue(res, i, 6);
+ char *spccomment = PQgetvalue(res, i, 7);
+ char *fspcname;
+
+ /* needed for buildACLCommands() */
+ fspcname = pg_strdup(fmtId(spcname));
+
+ if (binary_upgrade)
+ {
+ appendPQExpBufferStr(buf, "\n-- For binary upgrade, must preserve pg_tablespace oid\n");
+ appendPQExpBuffer(buf, "SELECT pg_catalog.binary_upgrade_set_next_pg_tablespace_oid('%u'::pg_catalog.oid);\n", spcoid);
+ }
+
+ appendPQExpBuffer(buf, "CREATE TABLESPACE %s", fspcname);
+ appendPQExpBuffer(buf, " OWNER %s", fmtId(spcowner));
+
+ appendPQExpBufferStr(buf, " LOCATION ");
+ appendStringLiteralConn(buf, spclocation, conn);
+ appendPQExpBufferStr(buf, ";\n");
+
+ if (spcoptions && spcoptions[0] != '\0')
+ appendPQExpBuffer(buf, "ALTER TABLESPACE %s SET (%s);\n",
+ fspcname, spcoptions);
+
+ /* tablespaces can't have initprivs */
+
+ if (!skip_acls &&
+ !buildACLCommands(fspcname, NULL, NULL, "TABLESPACE",
+ spcacl, acldefault,
+ spcowner, "", server_version, buf))
+ {
+ pg_log_error("could not parse ACL list (%s) for tablespace \"%s\"",
+ spcacl, spcname);
+ PQfinish(conn);
+ exit_nicely(1);
+ }
+
+ if (!no_comments && spccomment && spccomment[0] != '\0')
+ {
+ appendPQExpBuffer(buf, "COMMENT ON TABLESPACE %s IS ", fspcname);
+ appendStringLiteralConn(buf, spccomment, conn);
+ appendPQExpBufferStr(buf, ";\n");
+ }
+
+ if (!no_security_labels)
+ buildShSecLabels(conn, "pg_tablespace", spcoid,
+ "TABLESPACE", spcname,
+ buf);
+
+ fprintf(OPF, "%s", buf->data);
+
+ free(fspcname);
+ destroyPQExpBuffer(buf);
+ }
+
+ PQclear(res);
+ fprintf(OPF, "\n\n");
+}
+
+
+/*
+ * Dump commands to drop each database.
+ */
+static void
+dropDBs(PGconn *conn)
+{
+ PGresult *res;
+ int i;
+
+ /*
+ * Skip databases marked not datallowconn, since we'd be unable to connect
+ * to them anyway. This must agree with dumpDatabases().
+ */
+ res = executeQuery(conn,
+ "SELECT datname "
+ "FROM pg_database d "
+ "WHERE datallowconn AND datconnlimit != -2 "
+ "ORDER BY datname");
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "--\n-- Drop databases (except postgres and template1)\n--\n\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ char *dbname = PQgetvalue(res, i, 0);
+
+ /*
+ * Skip "postgres" and "template1"; dumpDatabases() will deal with
+ * them specially. Also, be sure to skip "template0", even if for
+ * some reason it's not marked !datallowconn.
+ */
+ if (strcmp(dbname, "template1") != 0 &&
+ strcmp(dbname, "template0") != 0 &&
+ strcmp(dbname, "postgres") != 0)
+ {
+ fprintf(OPF, "DROP DATABASE %s%s;\n",
+ if_exists ? "IF EXISTS " : "",
+ fmtId(dbname));
+ }
+ }
+
+ PQclear(res);
+
+ fprintf(OPF, "\n\n");
+}
+
+
+/*
+ * Dump user-specific configuration
+ */
+static void
+dumpUserConfig(PGconn *conn, const char *username)
+{
+ PQExpBuffer buf = createPQExpBuffer();
+ PGresult *res;
+
+ printfPQExpBuffer(buf, "SELECT unnest(setconfig) FROM pg_db_role_setting "
+ "WHERE setdatabase = 0 AND setrole = "
+ "(SELECT oid FROM %s WHERE rolname = ",
+ role_catalog);
+ appendStringLiteralConn(buf, username, conn);
+ appendPQExpBufferChar(buf, ')');
+
+ res = executeQuery(conn, buf->data);
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "\n--\n-- User Config \"%s\"\n--\n\n", username);
+
+ for (int i = 0; i < PQntuples(res); i++)
+ {
+ resetPQExpBuffer(buf);
+ makeAlterConfigCommand(conn, PQgetvalue(res, i, 0),
+ "ROLE", username, NULL, NULL,
+ buf);
+ fprintf(OPF, "%s", buf->data);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(buf);
+}
+
+/*
+ * Find a list of database names that match the given patterns.
+ * See also expand_table_name_patterns() in pg_dump.c
+ */
+static void
+expand_dbname_patterns(PGconn *conn,
+ SimpleStringList *patterns,
+ SimpleStringList *names)
+{
+ PQExpBuffer query;
+ PGresult *res;
+
+ if (patterns->head == NULL)
+ return; /* nothing to do */
+
+ query = createPQExpBuffer();
+
+ /*
+ * The loop below runs multiple SELECTs, which might sometimes result in
+ * duplicate entries in the name list, but we don't care, since all we're
+ * going to do is test membership of the list.
+ */
+
+ for (SimpleStringListCell *cell = patterns->head; cell; cell = cell->next)
+ {
+ int dotcnt;
+
+ appendPQExpBufferStr(query,
+ "SELECT datname FROM pg_catalog.pg_database n\n");
+ processSQLNamePattern(conn, query, cell->val, false,
+ false, NULL, "datname", NULL, NULL, NULL,
+ &dotcnt);
+
+ if (dotcnt > 0)
+ {
+ pg_log_error("improper qualified name (too many dotted names): %s",
+ cell->val);
+ PQfinish(conn);
+ exit_nicely(1);
+ }
+
+ res = executeQuery(conn, query->data);
+ for (int i = 0; i < PQntuples(res); i++)
+ {
+ simple_string_list_append(names, PQgetvalue(res, i, 0));
+ }
+
+ PQclear(res);
+ resetPQExpBuffer(query);
+ }
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * Dump contents of databases.
+ */
+static void
+dumpDatabases(PGconn *conn)
+{
+ PGresult *res;
+ int i;
+
+ /*
+ * Skip databases marked not datallowconn, since we'd be unable to connect
+ * to them anyway. This must agree with dropDBs().
+ *
+ * We arrange for template1 to be processed first, then we process other
+ * DBs in alphabetical order. If we just did them all alphabetically, we
+ * might find ourselves trying to drop the "postgres" database while still
+ * connected to it. This makes trying to run the restore script while
+ * connected to "template1" a bad idea, but there's no fixed order that
+ * doesn't have some failure mode with --clean.
+ */
+ res = executeQuery(conn,
+ "SELECT datname "
+ "FROM pg_database d "
+ "WHERE datallowconn AND datconnlimit != -2 "
+ "ORDER BY (datname <> 'template1'), datname");
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "--\n-- Databases\n--\n\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ char *dbname = PQgetvalue(res, i, 0);
+ const char *create_opts;
+ int ret;
+
+ /* Skip template0, even if it's not marked !datallowconn. */
+ if (strcmp(dbname, "template0") == 0)
+ continue;
+
+ /* Skip any explicitly excluded database */
+ if (simple_string_list_member(&database_exclude_names, dbname))
+ {
+ pg_log_info("excluding database \"%s\"", dbname);
+ continue;
+ }
+
+ pg_log_info("dumping database \"%s\"", dbname);
+
+ fprintf(OPF, "--\n-- Database \"%s\" dump\n--\n\n", dbname);
+
+ /*
+ * We assume that "template1" and "postgres" already exist in the
+ * target installation. dropDBs() won't have removed them, for fear
+ * of removing the DB the restore script is initially connected to. If
+ * --clean was specified, tell pg_dump to drop and recreate them;
+ * otherwise we'll merely restore their contents. Other databases
+ * should simply be created.
+ */
+ if (strcmp(dbname, "template1") == 0 || strcmp(dbname, "postgres") == 0)
+ {
+ if (output_clean)
+ create_opts = "--clean --create";
+ else
+ {
+ create_opts = "";
+ /* Since pg_dump won't emit a \connect command, we must */
+ fprintf(OPF, "\\connect %s\n\n", dbname);
+ }
+ }
+ else
+ create_opts = "--create";
+
+ if (filename)
+ fclose(OPF);
+
+ ret = runPgDump(dbname, create_opts);
+ if (ret != 0)
+ pg_fatal("pg_dump failed on database \"%s\", exiting", dbname);
+
+ if (filename)
+ {
+ OPF = fopen(filename, PG_BINARY_A);
+ if (!OPF)
+ pg_fatal("could not re-open the output file \"%s\": %m",
+ filename);
+ }
+ }
+
+ PQclear(res);
+}
+
+
+
+/*
+ * Run pg_dump on dbname, with specified options.
+ */
+static int
+runPgDump(const char *dbname, const char *create_opts)
+{
+ PQExpBuffer connstrbuf = createPQExpBuffer();
+ PQExpBuffer cmd = createPQExpBuffer();
+ int ret;
+
+ appendPQExpBuffer(cmd, "\"%s\" %s %s", pg_dump_bin,
+ pgdumpopts->data, create_opts);
+
+ /*
+ * If we have a filename, use the undocumented plain-append pg_dump
+ * format.
+ */
+ if (filename)
+ appendPQExpBufferStr(cmd, " -Fa ");
+ else
+ appendPQExpBufferStr(cmd, " -Fp ");
+
+ /*
+ * Append the database name to the already-constructed stem of connection
+ * string.
+ */
+ appendPQExpBuffer(connstrbuf, "%s dbname=", connstr);
+ appendConnStrVal(connstrbuf, dbname);
+
+ appendShellString(cmd, connstrbuf->data);
+
+ pg_log_info("running \"%s\"", cmd->data);
+
+ fflush(stdout);
+ fflush(stderr);
+
+ ret = system(cmd->data);
+
+ destroyPQExpBuffer(cmd);
+ destroyPQExpBuffer(connstrbuf);
+
+ return ret;
+}
+
+/*
+ * buildShSecLabels
+ *
+ * Build SECURITY LABEL command(s) for a shared object
+ *
+ * The caller has to provide object type and identity in two separate formats:
+ * catalog_name (e.g., "pg_database") and object OID, as well as
+ * type name (e.g., "DATABASE") and object name (not pre-quoted).
+ *
+ * The command(s) are appended to "buffer".
+ */
+static void
+buildShSecLabels(PGconn *conn, const char *catalog_name, Oid objectId,
+ const char *objtype, const char *objname,
+ PQExpBuffer buffer)
+{
+ PQExpBuffer sql = createPQExpBuffer();
+ PGresult *res;
+
+ buildShSecLabelQuery(catalog_name, objectId, sql);
+ res = executeQuery(conn, sql->data);
+ emitShSecLabels(conn, res, buffer, objtype, objname);
+
+ PQclear(res);
+ destroyPQExpBuffer(sql);
+}
+
+/*
+ * Make a database connection with the given parameters. An
+ * interactive password prompt is automatically issued if required.
+ *
+ * If fail_on_error is false, we return NULL without printing any message
+ * on failure, but preserve any prompted password for the next try.
+ *
+ * On success, the global variable 'connstr' is set to a connection string
+ * containing the options used.
+ */
+static PGconn *
+connectDatabase(const char *dbname, const char *connection_string,
+ const char *pghost, const char *pgport, const char *pguser,
+ trivalue prompt_password, bool fail_on_error)
+{
+ PGconn *conn;
+ bool new_pass;
+ const char *remoteversion_str;
+ int my_version;
+ const char **keywords = NULL;
+ const char **values = NULL;
+ PQconninfoOption *conn_opts = NULL;
+ static char *password = NULL;
+
+ if (prompt_password == TRI_YES && !password)
+ password = simple_prompt("Password: ", false);
+
+ /*
+ * Start the connection. Loop until we have a password if requested by
+ * backend.
+ */
+ do
+ {
+ int argcount = 6;
+ PQconninfoOption *conn_opt;
+ char *err_msg = NULL;
+ int i = 0;
+
+ if (keywords)
+ free(keywords);
+ if (values)
+ free(values);
+ if (conn_opts)
+ PQconninfoFree(conn_opts);
+
+ /*
+ * Merge the connection info inputs given in form of connection string
+ * and other options. Explicitly discard any dbname value in the
+ * connection string; otherwise, PQconnectdbParams() would interpret
+ * that value as being itself a connection string.
+ */
+ if (connection_string)
+ {
+ conn_opts = PQconninfoParse(connection_string, &err_msg);
+ if (conn_opts == NULL)
+ pg_fatal("%s", err_msg);
+
+ for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++)
+ {
+ if (conn_opt->val != NULL && conn_opt->val[0] != '\0' &&
+ strcmp(conn_opt->keyword, "dbname") != 0)
+ argcount++;
+ }
+
+ keywords = pg_malloc0((argcount + 1) * sizeof(*keywords));
+ values = pg_malloc0((argcount + 1) * sizeof(*values));
+
+ for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++)
+ {
+ if (conn_opt->val != NULL && conn_opt->val[0] != '\0' &&
+ strcmp(conn_opt->keyword, "dbname") != 0)
+ {
+ keywords[i] = conn_opt->keyword;
+ values[i] = conn_opt->val;
+ i++;
+ }
+ }
+ }
+ else
+ {
+ keywords = pg_malloc0((argcount + 1) * sizeof(*keywords));
+ values = pg_malloc0((argcount + 1) * sizeof(*values));
+ }
+
+ if (pghost)
+ {
+ keywords[i] = "host";
+ values[i] = pghost;
+ i++;
+ }
+ if (pgport)
+ {
+ keywords[i] = "port";
+ values[i] = pgport;
+ i++;
+ }
+ if (pguser)
+ {
+ keywords[i] = "user";
+ values[i] = pguser;
+ i++;
+ }
+ if (password)
+ {
+ keywords[i] = "password";
+ values[i] = password;
+ i++;
+ }
+ if (dbname)
+ {
+ keywords[i] = "dbname";
+ values[i] = dbname;
+ i++;
+ }
+ keywords[i] = "fallback_application_name";
+ values[i] = progname;
+ i++;
+
+ new_pass = false;
+ conn = PQconnectdbParams(keywords, values, true);
+
+ if (!conn)
+ pg_fatal("could not connect to database \"%s\"", dbname);
+
+ if (PQstatus(conn) == CONNECTION_BAD &&
+ PQconnectionNeedsPassword(conn) &&
+ !password &&
+ prompt_password != TRI_NO)
+ {
+ PQfinish(conn);
+ password = simple_prompt("Password: ", false);
+ new_pass = true;
+ }
+ } while (new_pass);
+
+ /* check to see that the backend connection was successfully made */
+ if (PQstatus(conn) == CONNECTION_BAD)
+ {
+ if (fail_on_error)
+ pg_fatal("%s", PQerrorMessage(conn));
+ else
+ {
+ PQfinish(conn);
+
+ free(keywords);
+ free(values);
+ PQconninfoFree(conn_opts);
+
+ return NULL;
+ }
+ }
+
+ /*
+ * Ok, connected successfully. Remember the options used, in the form of a
+ * connection string.
+ */
+ connstr = constructConnStr(keywords, values);
+
+ free(keywords);
+ free(values);
+ PQconninfoFree(conn_opts);
+
+ /* Check version */
+ remoteversion_str = PQparameterStatus(conn, "server_version");
+ if (!remoteversion_str)
+ pg_fatal("could not get server version");
+ server_version = PQserverVersion(conn);
+ if (server_version == 0)
+ pg_fatal("could not parse server version \"%s\"",
+ remoteversion_str);
+
+ my_version = PG_VERSION_NUM;
+
+ /*
+ * We allow the server to be back to 9.2, and up to any minor release of
+ * our own major version. (See also version check in pg_dump.c.)
+ */
+ if (my_version != server_version
+ && (server_version < 90200 ||
+ (server_version / 100) > (my_version / 100)))
+ {
+ pg_log_error("aborting because of server version mismatch");
+ pg_log_error_detail("server version: %s; %s version: %s",
+ remoteversion_str, progname, PG_VERSION);
+ exit_nicely(1);
+ }
+
+ PQclear(executeQuery(conn, ALWAYS_SECURE_SEARCH_PATH_SQL));
+
+ return conn;
+}
+
+/* ----------
+ * Construct a connection string from the given keyword/value pairs. It is
+ * used to pass the connection options to the pg_dump subprocess.
+ *
+ * The following parameters are excluded:
+ * dbname - varies in each pg_dump invocation
+ * password - it's not secure to pass a password on the command line
+ * fallback_application_name - we'll let pg_dump set it
+ * ----------
+ */
+static char *
+constructConnStr(const char **keywords, const char **values)
+{
+ PQExpBuffer buf = createPQExpBuffer();
+ char *connstr;
+ int i;
+ bool firstkeyword = true;
+
+ /* Construct a new connection string in key='value' format. */
+ for (i = 0; keywords[i] != NULL; i++)
+ {
+ if (strcmp(keywords[i], "dbname") == 0 ||
+ strcmp(keywords[i], "password") == 0 ||
+ strcmp(keywords[i], "fallback_application_name") == 0)
+ continue;
+
+ if (!firstkeyword)
+ appendPQExpBufferChar(buf, ' ');
+ firstkeyword = false;
+ appendPQExpBuffer(buf, "%s=", keywords[i]);
+ appendConnStrVal(buf, values[i]);
+ }
+
+ connstr = pg_strdup(buf->data);
+ destroyPQExpBuffer(buf);
+ return connstr;
+}
+
+/*
+ * Run a query, return the results, exit program on failure.
+ */
+static PGresult *
+executeQuery(PGconn *conn, const char *query)
+{
+ PGresult *res;
+
+ pg_log_info("executing %s", query);
+
+ res = PQexec(conn, query);
+ if (!res ||
+ PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("query failed: %s", PQerrorMessage(conn));
+ pg_log_error_detail("Query was: %s", query);
+ PQfinish(conn);
+ exit_nicely(1);
+ }
+
+ return res;
+}
+
+/*
+ * As above for a SQL command (which returns nothing).
+ */
+static void
+executeCommand(PGconn *conn, const char *query)
+{
+ PGresult *res;
+
+ pg_log_info("executing %s", query);
+
+ res = PQexec(conn, query);
+ if (!res ||
+ PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("query failed: %s", PQerrorMessage(conn));
+ pg_log_error_detail("Query was: %s", query);
+ PQfinish(conn);
+ exit_nicely(1);
+ }
+
+ PQclear(res);
+}
+
+
+/*
+ * dumpTimestamp
+ */
+static void
+dumpTimestamp(const char *msg)
+{
+ char buf[64];
+ time_t now = time(NULL);
+
+ if (strftime(buf, sizeof(buf), PGDUMP_STRFTIME_FMT, localtime(&now)) != 0)
+ fprintf(OPF, "-- %s %s\n\n", msg, buf);
+}
diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c
new file mode 100644
index 0000000..049a100
--- /dev/null
+++ b/src/bin/pg_dump/pg_restore.c
@@ -0,0 +1,496 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_restore.c
+ * pg_restore is an utility extracting postgres database definitions
+ * from a backup archive created by pg_dump using the archiver
+ * interface.
+ *
+ * pg_restore will read the backup archive and
+ * dump out a script that reproduces
+ * the schema of the database in terms of
+ * user-defined types
+ * user-defined functions
+ * tables
+ * indexes
+ * aggregates
+ * operators
+ * ACL - grant/revoke
+ *
+ * the output script is SQL that is understood by PostgreSQL
+ *
+ * Basic process in a restore operation is:
+ *
+ * Open the Archive and read the TOC.
+ * Set flags in TOC entries, and *maybe* reorder them.
+ * Generate script to stdout
+ * Exit
+ *
+ * Copyright (c) 2000, Philip Warner
+ * Rights are granted to use this software in any way so long
+ * as this notice is not removed.
+ *
+ * The author is not responsible for loss or damages that may
+ * result from its use.
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_restore.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#endif
+
+#include "dumputils.h"
+#include "fe_utils/option_utils.h"
+#include "getopt_long.h"
+#include "parallel.h"
+#include "pg_backup_utils.h"
+
+static void usage(const char *progname);
+
+int
+main(int argc, char **argv)
+{
+ RestoreOptions *opts;
+ int c;
+ int exit_code;
+ int numWorkers = 1;
+ Archive *AH;
+ char *inputFileSpec;
+ static int disable_triggers = 0;
+ static int enable_row_security = 0;
+ static int if_exists = 0;
+ static int no_data_for_failed_tables = 0;
+ static int outputNoTableAm = 0;
+ static int outputNoTablespaces = 0;
+ static int use_setsessauth = 0;
+ static int no_comments = 0;
+ static int no_publications = 0;
+ static int no_security_labels = 0;
+ static int no_subscriptions = 0;
+ static int strict_names = 0;
+
+ struct option cmdopts[] = {
+ {"clean", 0, NULL, 'c'},
+ {"create", 0, NULL, 'C'},
+ {"data-only", 0, NULL, 'a'},
+ {"dbname", 1, NULL, 'd'},
+ {"exit-on-error", 0, NULL, 'e'},
+ {"exclude-schema", 1, NULL, 'N'},
+ {"file", 1, NULL, 'f'},
+ {"format", 1, NULL, 'F'},
+ {"function", 1, NULL, 'P'},
+ {"host", 1, NULL, 'h'},
+ {"index", 1, NULL, 'I'},
+ {"jobs", 1, NULL, 'j'},
+ {"list", 0, NULL, 'l'},
+ {"no-privileges", 0, NULL, 'x'},
+ {"no-acl", 0, NULL, 'x'},
+ {"no-owner", 0, NULL, 'O'},
+ {"no-reconnect", 0, NULL, 'R'},
+ {"port", 1, NULL, 'p'},
+ {"no-password", 0, NULL, 'w'},
+ {"password", 0, NULL, 'W'},
+ {"schema", 1, NULL, 'n'},
+ {"schema-only", 0, NULL, 's'},
+ {"superuser", 1, NULL, 'S'},
+ {"table", 1, NULL, 't'},
+ {"trigger", 1, NULL, 'T'},
+ {"use-list", 1, NULL, 'L'},
+ {"username", 1, NULL, 'U'},
+ {"verbose", 0, NULL, 'v'},
+ {"single-transaction", 0, NULL, '1'},
+
+ /*
+ * the following options don't have an equivalent short option letter
+ */
+ {"disable-triggers", no_argument, &disable_triggers, 1},
+ {"enable-row-security", no_argument, &enable_row_security, 1},
+ {"if-exists", no_argument, &if_exists, 1},
+ {"no-data-for-failed-tables", no_argument, &no_data_for_failed_tables, 1},
+ {"no-table-access-method", no_argument, &outputNoTableAm, 1},
+ {"no-tablespaces", no_argument, &outputNoTablespaces, 1},
+ {"role", required_argument, NULL, 2},
+ {"section", required_argument, NULL, 3},
+ {"strict-names", no_argument, &strict_names, 1},
+ {"use-set-session-authorization", no_argument, &use_setsessauth, 1},
+ {"no-comments", no_argument, &no_comments, 1},
+ {"no-publications", no_argument, &no_publications, 1},
+ {"no-security-labels", no_argument, &no_security_labels, 1},
+ {"no-subscriptions", no_argument, &no_subscriptions, 1},
+
+ {NULL, 0, NULL, 0}
+ };
+
+ pg_logging_init(argv[0]);
+ pg_logging_set_level(PG_LOG_WARNING);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_dump"));
+
+ init_parallel_dump_utils();
+
+ opts = NewRestoreOptions();
+
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage(progname);
+ exit_nicely(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_restore (PostgreSQL) " PG_VERSION);
+ exit_nicely(0);
+ }
+ }
+
+ while ((c = getopt_long(argc, argv, "acCd:ef:F:h:I:j:lL:n:N:Op:P:RsS:t:T:U:vwWx1",
+ cmdopts, NULL)) != -1)
+ {
+ switch (c)
+ {
+ case 'a': /* Dump data only */
+ opts->dataOnly = 1;
+ break;
+ case 'c': /* clean (i.e., drop) schema prior to create */
+ opts->dropSchema = 1;
+ break;
+ case 'C':
+ opts->createDB = 1;
+ break;
+ case 'd':
+ opts->cparams.dbname = pg_strdup(optarg);
+ break;
+ case 'e':
+ opts->exit_on_error = true;
+ break;
+ case 'f': /* output file name */
+ opts->filename = pg_strdup(optarg);
+ break;
+ case 'F':
+ if (strlen(optarg) != 0)
+ opts->formatName = pg_strdup(optarg);
+ break;
+ case 'h':
+ if (strlen(optarg) != 0)
+ opts->cparams.pghost = pg_strdup(optarg);
+ break;
+
+ case 'j': /* number of restore jobs */
+ if (!option_parse_int(optarg, "-j/--jobs", 1,
+ PG_MAX_JOBS,
+ &numWorkers))
+ exit(1);
+ break;
+
+ case 'l': /* Dump the TOC summary */
+ opts->tocSummary = 1;
+ break;
+
+ case 'L': /* input TOC summary file name */
+ opts->tocFile = pg_strdup(optarg);
+ break;
+
+ case 'n': /* Dump data for this schema only */
+ simple_string_list_append(&opts->schemaNames, optarg);
+ break;
+
+ case 'N': /* Do not dump data for this schema */
+ simple_string_list_append(&opts->schemaExcludeNames, optarg);
+ break;
+
+ case 'O':
+ opts->noOwner = 1;
+ break;
+
+ case 'p':
+ if (strlen(optarg) != 0)
+ opts->cparams.pgport = pg_strdup(optarg);
+ break;
+ case 'R':
+ /* no-op, still accepted for backwards compatibility */
+ break;
+ case 'P': /* Function */
+ opts->selTypes = 1;
+ opts->selFunction = 1;
+ simple_string_list_append(&opts->functionNames, optarg);
+ break;
+ case 'I': /* Index */
+ opts->selTypes = 1;
+ opts->selIndex = 1;
+ simple_string_list_append(&opts->indexNames, optarg);
+ break;
+ case 'T': /* Trigger */
+ opts->selTypes = 1;
+ opts->selTrigger = 1;
+ simple_string_list_append(&opts->triggerNames, optarg);
+ break;
+ case 's': /* dump schema only */
+ opts->schemaOnly = 1;
+ break;
+ case 'S': /* Superuser username */
+ if (strlen(optarg) != 0)
+ opts->superuser = pg_strdup(optarg);
+ break;
+ case 't': /* Dump specified table(s) only */
+ opts->selTypes = 1;
+ opts->selTable = 1;
+ simple_string_list_append(&opts->tableNames, optarg);
+ break;
+
+ case 'U':
+ opts->cparams.username = pg_strdup(optarg);
+ break;
+
+ case 'v': /* verbose */
+ opts->verbose = 1;
+ pg_logging_increase_verbosity();
+ break;
+
+ case 'w':
+ opts->cparams.promptPassword = TRI_NO;
+ break;
+
+ case 'W':
+ opts->cparams.promptPassword = TRI_YES;
+ break;
+
+ case 'x': /* skip ACL dump */
+ opts->aclsSkip = 1;
+ break;
+
+ case '1': /* Restore data in a single transaction */
+ opts->single_txn = true;
+ opts->exit_on_error = true;
+ break;
+
+ case 0:
+
+ /*
+ * This covers the long options without a short equivalent.
+ */
+ break;
+
+ case 2: /* SET ROLE */
+ opts->use_role = pg_strdup(optarg);
+ break;
+
+ case 3: /* section */
+ set_dump_section(optarg, &(opts->dumpSections));
+ break;
+
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+ }
+
+ /* Get file name from command line */
+ if (optind < argc)
+ inputFileSpec = argv[optind++];
+ else
+ inputFileSpec = NULL;
+
+ /* Complain if any arguments remain */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+
+ /* Complain if neither -f nor -d was specified (except if dumping TOC) */
+ if (!opts->cparams.dbname && !opts->filename && !opts->tocSummary)
+ pg_fatal("one of -d/--dbname and -f/--file must be specified");
+
+ /* Should get at most one of -d and -f, else user is confused */
+ if (opts->cparams.dbname)
+ {
+ if (opts->filename)
+ {
+ pg_log_error("options -d/--dbname and -f/--file cannot be used together");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+ opts->useDB = 1;
+ }
+
+ if (opts->dataOnly && opts->schemaOnly)
+ pg_fatal("options -s/--schema-only and -a/--data-only cannot be used together");
+
+ if (opts->dataOnly && opts->dropSchema)
+ pg_fatal("options -c/--clean and -a/--data-only cannot be used together");
+
+ /*
+ * -C is not compatible with -1, because we can't create a database inside
+ * a transaction block.
+ */
+ if (opts->createDB && opts->single_txn)
+ pg_fatal("options -C/--create and -1/--single-transaction cannot be used together");
+
+ /* Can't do single-txn mode with multiple connections */
+ if (opts->single_txn && numWorkers > 1)
+ pg_fatal("cannot specify both --single-transaction and multiple jobs");
+
+ opts->disable_triggers = disable_triggers;
+ opts->enable_row_security = enable_row_security;
+ opts->noDataForFailedTables = no_data_for_failed_tables;
+ opts->noTableAm = outputNoTableAm;
+ opts->noTablespace = outputNoTablespaces;
+ opts->use_setsessauth = use_setsessauth;
+ opts->no_comments = no_comments;
+ opts->no_publications = no_publications;
+ opts->no_security_labels = no_security_labels;
+ opts->no_subscriptions = no_subscriptions;
+
+ if (if_exists && !opts->dropSchema)
+ pg_fatal("option --if-exists requires option -c/--clean");
+ opts->if_exists = if_exists;
+ opts->strict_names = strict_names;
+
+ if (opts->formatName)
+ {
+ switch (opts->formatName[0])
+ {
+ case 'c':
+ case 'C':
+ opts->format = archCustom;
+ break;
+
+ case 'd':
+ case 'D':
+ opts->format = archDirectory;
+ break;
+
+ case 't':
+ case 'T':
+ opts->format = archTar;
+ break;
+
+ default:
+ pg_fatal("unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"",
+ opts->formatName);
+ }
+ }
+
+ AH = OpenArchive(inputFileSpec, opts->format);
+
+ SetArchiveOptions(AH, NULL, opts);
+
+ /*
+ * We don't have a connection yet but that doesn't matter. The connection
+ * is initialized to NULL and if we terminate through exit_nicely() while
+ * it's still NULL, the cleanup function will just be a no-op.
+ */
+ on_exit_close_archive(AH);
+
+ /* Let the archiver know how noisy to be */
+ AH->verbose = opts->verbose;
+
+ /*
+ * Whether to keep submitting sql commands as "pg_restore ... | psql ... "
+ */
+ AH->exit_on_error = opts->exit_on_error;
+
+ if (opts->tocFile)
+ SortTocFromFile(AH);
+
+ AH->numWorkers = numWorkers;
+
+ if (opts->tocSummary)
+ PrintTOCSummary(AH);
+ else
+ {
+ ProcessArchiveRestoreOptions(AH);
+ RestoreArchive(AH);
+ }
+
+ /* done, print a summary of ignored errors */
+ if (AH->n_errors)
+ pg_log_warning("errors ignored on restore: %d", AH->n_errors);
+
+ /* AH may be freed in CloseArchive? */
+ exit_code = AH->n_errors ? 1 : 0;
+
+ CloseArchive(AH);
+
+ return exit_code;
+}
+
+static void
+usage(const char *progname)
+{
+ printf(_("%s restores a PostgreSQL database from an archive created by pg_dump.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [FILE]\n"), progname);
+
+ printf(_("\nGeneral options:\n"));
+ printf(_(" -d, --dbname=NAME connect to database name\n"));
+ printf(_(" -f, --file=FILENAME output file name (- for stdout)\n"));
+ printf(_(" -F, --format=c|d|t backup file format (should be automatic)\n"));
+ printf(_(" -l, --list print summarized TOC of the archive\n"));
+ printf(_(" -v, --verbose verbose mode\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+
+ printf(_("\nOptions controlling the restore:\n"));
+ printf(_(" -a, --data-only restore only the data, no schema\n"));
+ printf(_(" -c, --clean clean (drop) database objects before recreating\n"));
+ printf(_(" -C, --create create the target database\n"));
+ printf(_(" -e, --exit-on-error exit on error, default is to continue\n"));
+ printf(_(" -I, --index=NAME restore named index\n"));
+ printf(_(" -j, --jobs=NUM use this many parallel jobs to restore\n"));
+ printf(_(" -L, --use-list=FILENAME use table of contents from this file for\n"
+ " selecting/ordering output\n"));
+ printf(_(" -n, --schema=NAME restore only objects in this schema\n"));
+ printf(_(" -N, --exclude-schema=NAME do not restore objects in this schema\n"));
+ printf(_(" -O, --no-owner skip restoration of object ownership\n"));
+ printf(_(" -P, --function=NAME(args) restore named function\n"));
+ printf(_(" -s, --schema-only restore only the schema, no data\n"));
+ printf(_(" -S, --superuser=NAME superuser user name to use for disabling triggers\n"));
+ printf(_(" -t, --table=NAME restore named relation (table, view, etc.)\n"));
+ printf(_(" -T, --trigger=NAME restore named trigger\n"));
+ printf(_(" -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"));
+ printf(_(" -1, --single-transaction restore as a single transaction\n"));
+ printf(_(" --disable-triggers disable triggers during data-only restore\n"));
+ printf(_(" --enable-row-security enable row security\n"));
+ printf(_(" --if-exists use IF EXISTS when dropping objects\n"));
+ printf(_(" --no-comments do not restore comments\n"));
+ printf(_(" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+ " created\n"));
+ printf(_(" --no-publications do not restore publications\n"));
+ printf(_(" --no-security-labels do not restore security labels\n"));
+ printf(_(" --no-subscriptions do not restore subscriptions\n"));
+ printf(_(" --no-table-access-method do not restore table access methods\n"));
+ printf(_(" --no-tablespaces do not restore tablespace assignments\n"));
+ printf(_(" --section=SECTION restore named section (pre-data, data, or post-data)\n"));
+ printf(_(" --strict-names require table and/or schema include patterns to\n"
+ " match at least one entity each\n"));
+ printf(_(" --use-set-session-authorization\n"
+ " use SET SESSION AUTHORIZATION commands instead of\n"
+ " ALTER OWNER commands to set ownership\n"));
+
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port number\n"));
+ printf(_(" -U, --username=NAME connect as specified database user\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt (should happen automatically)\n"));
+ printf(_(" --role=ROLENAME do SET ROLE before restore\n"));
+
+ printf(_("\n"
+ "The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+ "multiple times to select multiple objects.\n"));
+ printf(_("\nIf no input file name is supplied, then standard input is used.\n\n"));
+ printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/pg_dump/po/cs.po b/src/bin/pg_dump/po/cs.po
new file mode 100644
index 0000000..3319e53
--- /dev/null
+++ b/src/bin/pg_dump/po/cs.po
@@ -0,0 +1,2965 @@
+# Czech message translation file for pg_dump
+# Copyright (C) 2012 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Tomas Vondra <tv@fuzzy.cz>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump-cs (PostgreSQL 9.3)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:16+0000\n"
+"PO-Revision-Date: 2021-09-16 09:14+0200\n"
+"Last-Translator: Tomas Vondra <tv@fuzzy.cz>\n"
+"Language-Team: Czech <info@cspug.cx>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "fatal: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "chyba "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "varování: "
+
+#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "nelze získat aktuální adresář: %m"
+
+#: ../../common/exec.c:156
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "neplatný binární soubor\"%s\""
+
+#: ../../common/exec.c:206
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "nelze číst binární soubor \"%s\""
+
+#: ../../common/exec.c:214
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "nelze najít soubor \"%s\" ke spuštění"
+
+#: ../../common/exec.c:270 ../../common/exec.c:309
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "nelze změnit adresář na \"%s\" : %m"
+
+#: ../../common/exec.c:287
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "nelze přečíst symbolický odkaz \"%s\": %m"
+
+#: ../../common/exec.c:410
+#, c-format
+msgid "pclose failed: %m"
+msgstr "volání pclose selhalo: %m"
+
+#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676
+msgid "out of memory"
+msgstr "nedostatek paměti"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "nedostatek paměti\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nelze duplikovat null pointer (interní chyba)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "příkaz není spustitelný"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "příkaz nenalezen"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "potomek skončil s návratovým kódem %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "potomek byl ukončen vyjímkou 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "potomek byl ukončen signálem %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "potomek skončil s nerozponaným stavem %d"
+
+#: common.c:121
+#, c-format
+msgid "reading extensions"
+msgstr "čtu rozšíření"
+
+#: common.c:125
+#, c-format
+msgid "identifying extension members"
+msgstr "hledám položky rozšíření (extenze)"
+
+#: common.c:128
+#, c-format
+msgid "reading schemas"
+msgstr "čtu schémata"
+
+#: common.c:138
+#, c-format
+msgid "reading user-defined tables"
+msgstr "čtu uživatelem definované tabulky"
+
+#: common.c:145
+#, c-format
+msgid "reading user-defined functions"
+msgstr "čtu uživatelem definované funkce"
+
+#: common.c:150
+#, c-format
+msgid "reading user-defined types"
+msgstr "čtu uživatelem definované typy"
+
+#: common.c:155
+#, c-format
+msgid "reading procedural languages"
+msgstr "čtu procedurální jazyky"
+
+#: common.c:158
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "čtu uživatelem definované agregátní funkce"
+
+#: common.c:161
+#, c-format
+msgid "reading user-defined operators"
+msgstr "čtu uživatelem definované operátory"
+
+#: common.c:165
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "čtu uživatelem definované přístupové metody"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "čtu uživatelem definované třídy operátorů"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "čtu uživatelem definované rodiny operátorů"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "čtu uživatelem definované fulltextové parsery"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "čtu uživatelem definované fulltextové šablony"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "čtu uživatelem definované fulltextové slovníky"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "čtu uživatelské fulltextového konfigurace"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "čtu uživatelem definované foreign-data wrappery"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "čtu uživatelem definované foreign servery"
+
+#: common.c:192
+#, c-format
+msgid "reading default privileges"
+msgstr "čtu implicitní přístupová práva"
+
+#: common.c:195
+#, c-format
+msgid "reading user-defined collations"
+msgstr "čtu uživatelem definované collations"
+
+#: common.c:199
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "čtu uživatelem definované konverze"
+
+#: common.c:202
+#, c-format
+msgid "reading type casts"
+msgstr "čtu přetypování"
+
+#: common.c:205
+#, c-format
+msgid "reading transforms"
+msgstr "čtu transformace"
+
+#: common.c:208
+#, c-format
+msgid "reading table inheritance information"
+msgstr "čtu informace dědičnosti tabulky"
+
+#: common.c:211
+#, c-format
+msgid "reading event triggers"
+msgstr "čtu event triggery"
+
+#: common.c:215
+#, c-format
+msgid "finding extension tables"
+msgstr "hledám tabulky pro rozšíření"
+
+#: common.c:219
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "hledám informace o dědičnosti"
+
+#: common.c:222
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "čtu informace o sloupcích pro tabulky"
+
+#: common.c:225
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "označuji zděděné sloupce v pod-tabulkách"
+
+#: common.c:228
+#, c-format
+msgid "reading indexes"
+msgstr "čtu indexy"
+
+#: common.c:231
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "označuji indexy na partitionovaných tabulkách"
+
+#: common.c:234
+#, c-format
+msgid "reading extended statistics"
+msgstr "čtu rozšířené statistiky"
+
+#: common.c:237
+#, c-format
+msgid "reading constraints"
+msgstr "čtu omezení"
+
+#: common.c:240
+#, c-format
+msgid "reading triggers"
+msgstr "čtu triggery"
+
+#: common.c:243
+#, c-format
+msgid "reading rewrite rules"
+msgstr "čtu přepisovací pravidla"
+
+#: common.c:246
+#, c-format
+msgid "reading policies"
+msgstr "čtu přístupové politiky"
+
+#: common.c:249
+#, c-format
+msgid "reading publications"
+msgstr "čtu publikace"
+
+#: common.c:252
+#, c-format
+msgid "reading publication membership"
+msgstr "čtu členství v publikacích"
+
+#: common.c:255
+#, c-format
+msgid "reading subscriptions"
+msgstr "čtu subskripce"
+
+#: common.c:1025
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "selhala kontrola, rodičovské OID %u tabulky \"%s\" (OID %u) nenalez"
+
+#: common.c:1067
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "nemohu zpracovat numerické pole \"%s\": příliš mnoho čísel"
+
+#: common.c:1082
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "nemohu zpracovat numerické pole \"%s\": neplatný znak v čísle"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "neplatný kompresní kód: %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504
+#: compress_io.c:547
+#, c-format
+msgid "not built with zlib support"
+msgstr "nezkompilováno s podporou zlib"
+
+#: compress_io.c:236 compress_io.c:333
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "nelze inicializovat kompresní knihovnu: %s"
+
+#: compress_io.c:256
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "nelze uzavřít kompresní stream: %s"
+
+#: compress_io.c:273
+#, c-format
+msgid "could not compress data: %s"
+msgstr "nelze komprimovat data: %s"
+
+#: compress_io.c:349 compress_io.c:364
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "nelze dekomprimovat data: %s"
+
+#: compress_io.c:371
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "nelze uzavřít kompresní knihovnu: %s"
+
+#: compress_io.c:584 compress_io.c:621 pg_backup_tar.c:557 pg_backup_tar.c:560
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "nelze číst vstupní soubor: %s"
+
+#: compress_io.c:623 pg_backup_custom.c:646 pg_backup_directory.c:552
+#: pg_backup_tar.c:793 pg_backup_tar.c:816
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "nelze číst vstupní soubor: end of file"
+
+#: parallel.c:254
+#, c-format
+msgid "WSAStartup failed: %d"
+msgstr "WSAStartup selhal: %d"
+
+#: parallel.c:964
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "nelze vytvořit komunikační kanály: %m"
+
+#: parallel.c:1021
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "nelze vytvořit pracovní proces: %m"
+
+#: parallel.c:1151
+#, c-format
+msgid "unrecognized command received from master: \"%s\""
+msgstr "nerozpoznaný příkaz obdržen od mastera: %s"
+
+#: parallel.c:1194 parallel.c:1432
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "z pracovního procesu dorazila neplatná zpráva: \"%s\""
+
+#: parallel.c:1326
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"nelze získat zámek na relaci \"%s\"\n"
+"Toto obvykle znamená že někdo si vyžádal ACCESS EXCLUSIVE zámek na tabulce poté co rodičovský pg_dump proces získal výchozí ACCESS SHARE zámek na dané tabulce."
+
+#: parallel.c:1415
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "pracovní proces neočekávaně selhal"
+
+#: parallel.c:1537 parallel.c:1655
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "nelze zapsat do komunikačního kanálu: %m"
+
+#: parallel.c:1614
+#, c-format
+msgid "select() failed: %m"
+msgstr "select() selhalo: %m"
+
+#: parallel.c:1739
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: nelze vytvořit soket: chybový kód %d"
+
+#: parallel.c:1750
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: nelze provést bind: chybový kód %d"
+
+#: parallel.c:1757
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: nelze poslouchat: chybový kód %d"
+
+#: parallel.c:1764
+#, c-format
+msgid "pgpipe: getsockname() failed: error code %d"
+msgstr "pgpipe: getsockname() selhal: chybový kód %d"
+
+#: parallel.c:1775
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: nelze vytvořit druhý soket: chybový kód %d"
+
+#: parallel.c:1784
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: nelze se připojit k soketu: chybový kód %d"
+
+#: parallel.c:1793
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: nelze přijmout spojení: chybový kód %d"
+
+#: pg_backup_archiver.c:277 pg_backup_archiver.c:1587
+#, c-format
+msgid "could not close output file: %m"
+msgstr "nelze zavřít výstupní soubor: %m"
+
+#: pg_backup_archiver.c:321 pg_backup_archiver.c:325
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "archivované položky v nesprávném pořadí sekcí"
+
+#: pg_backup_archiver.c:331
+#, c-format
+msgid "unexpected section code %d"
+msgstr "neočekávaný kód sekce %d"
+
+#: pg_backup_archiver.c:368
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "paralelní obnova není pro tento formát archivu podporována"
+
+#: pg_backup_archiver.c:372
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "paralelní obnova není podporována s archivy z pre-8.0 verzí pg_dump"
+
+#: pg_backup_archiver.c:390
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)"
+msgstr "nelze obnovit z komprimovaného archivu (není nastavena podpora komprese)"
+
+#: pg_backup_archiver.c:407
+#, c-format
+msgid "connecting to database for restore"
+msgstr "navazováno spojení s databází pro obnovu"
+
+#: pg_backup_archiver.c:409
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "přímé spojení s databází nejsou podporovány v archivech před verzí 1.3"
+
+#: pg_backup_archiver.c:452
+#, c-format
+msgid "implied data-only restore"
+msgstr "předpokládána pouze obnova dat"
+
+#: pg_backup_archiver.c:518
+#, c-format
+msgid "dropping %s %s"
+msgstr "odstraňuji %s %s"
+
+#: pg_backup_archiver.c:613
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "nelze zjistit kam přidat IF EXISTS v příkazu \"%s\""
+
+#: pg_backup_archiver.c:769 pg_backup_archiver.c:771
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "varování z originálního dump souboru: %s"
+
+#: pg_backup_archiver.c:786
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "vytvářím %s \"%s.%s\""
+
+#: pg_backup_archiver.c:789
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "vytvářím %s \"%s\""
+
+#: pg_backup_archiver.c:839
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "připojuji se k nové databázi \"%s\""
+
+#: pg_backup_archiver.c:866
+#, c-format
+msgid "processing %s"
+msgstr "zpracovávám %s"
+
+#: pg_backup_archiver.c:886
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "zpracovávám data pro tabulku \"%s.%s\""
+
+#: pg_backup_archiver.c:948
+#, c-format
+msgid "executing %s %s"
+msgstr "vykonávám %s %s"
+
+#: pg_backup_archiver.c:987
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "vypínám triggery pro %s"
+
+#: pg_backup_archiver.c:1013
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "zapínám triggery pro %s"
+
+#: pg_backup_archiver.c:1041
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "interní chyba -- WriteData není možno volat mimo kontext rutiny DataDumper"
+
+#: pg_backup_archiver.c:1224
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "\"large object\" výstup není podporován ve vybraném formátu"
+
+#: pg_backup_archiver.c:1282
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "obnoven %d large objekt"
+msgstr[1] "obnoveny %d large objekty"
+msgstr[2] "obnoveny %d large objektů"
+
+#: pg_backup_archiver.c:1303 pg_backup_tar.c:736
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "obnovován \"large object\" s OID %u"
+
+#: pg_backup_archiver.c:1315
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "nelze vytvořit \"large object\" %u: %s"
+
+#: pg_backup_archiver.c:1320 pg_dump.c:3555
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "nelze otevřít \"large object\" %u:%s"
+
+#: pg_backup_archiver.c:1377
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "nelze otevřít TOC soubor \"%s\": %m"
+
+#: pg_backup_archiver.c:1417
+#, c-format
+msgid "line ignored: %s"
+msgstr "řádka ignorována: %s"
+
+#: pg_backup_archiver.c:1424
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "nelze najít záznam ID %d"
+
+#: pg_backup_archiver.c:1445 pg_backup_directory.c:222
+#: pg_backup_directory.c:598
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "nelze zavřít TOC soubor: %m"
+
+#: pg_backup_archiver.c:1559 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:585 pg_backup_directory.c:648
+#: pg_backup_directory.c:667 pg_dumpall.c:484
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "nelze otevřít výstupní soubor \"%s\": %m"
+
+#: pg_backup_archiver.c:1561 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "nelze otevřít výstupní soubor: %m"
+
+#: pg_backup_archiver.c:1654
+#, c-format
+msgid "wrote %lu byte of large object data (result = %lu)"
+msgid_plural "wrote %lu bytes of large object data (result = %lu)"
+msgstr[0] "zapsán %lu byte dat large objektů (result = %lu)"
+msgstr[1] "zapsán %lu byty dat large objektů (result = %lu)"
+msgstr[2] "zapsán %lu bytů dat large objektů (result = %lu)"
+
+#: pg_backup_archiver.c:1659
+#, c-format
+msgid "could not write to large object (result: %lu, expected: %lu)"
+msgstr "nelze zapsat \"large object\" (výsledek = %lu, očekáváno: %lu)"
+
+#: pg_backup_archiver.c:1749
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "během INICIALIZACE:"
+
+#: pg_backup_archiver.c:1754
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "během ZPRACOVÁNÍ TOC:"
+
+#: pg_backup_archiver.c:1759
+#, c-format
+msgid "while FINALIZING:"
+msgstr "během FINALIZACE:"
+
+#: pg_backup_archiver.c:1764
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "z TOC záznamu %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1840
+#, c-format
+msgid "bad dumpId"
+msgstr "neplatné dumpId"
+
+#: pg_backup_archiver.c:1861
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "špatné dumpId tabulky pro TABLE DATA položku"
+
+#: pg_backup_archiver.c:1953
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "neočekávaný příznak datového offsetu %d"
+
+#: pg_backup_archiver.c:1966
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "offset souboru v dumpu je příliš velký"
+
+#: pg_backup_archiver.c:2103 pg_backup_archiver.c:2113
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "jméno adresáře je příliš dlouhé: \"%s\""
+
+#: pg_backup_archiver.c:2121
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "adresář \"%s\" zřejmě není platným archivem (\"toc.dat\" neexistuje)"
+
+#: pg_backup_archiver.c:2129 pg_backup_custom.c:173 pg_backup_custom.c:812
+#: pg_backup_directory.c:207 pg_backup_directory.c:394
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "nelze otevřít vstupní soubor \"%s\": %m"
+
+#: pg_backup_archiver.c:2136 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "nelze otevřít vstupní soubor: %m"
+
+#: pg_backup_archiver.c:2142
+#, c-format
+msgid "could not read input file: %m"
+msgstr "nelze číst vstupní soubor: %m"
+
+#: pg_backup_archiver.c:2144
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "vstupní soubor je příliš krátký (čteno %lu, očekáváno 5)"
+
+#: pg_backup_archiver.c:2229
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "vstupní soubor se zdá být dump v textovém formátu. Použijte prosím psql."
+
+#: pg_backup_archiver.c:2235
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "vstupní soubor se nezdá být korektním archivem (příliš krátký?)"
+
+#: pg_backup_archiver.c:2241
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "vstupní soubor se nezdá být korektním archivem"
+
+#: pg_backup_archiver.c:2261
+#, c-format
+msgid "could not close input file: %m"
+msgstr "nelze zavřít výstupní soubor: %m"
+
+#: pg_backup_archiver.c:2373
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "neznámý formát souboru \"%d\""
+
+#: pg_backup_archiver.c:2455 pg_backup_archiver.c:4458
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "dokončena položka %d %s %s"
+
+#: pg_backup_archiver.c:2459 pg_backup_archiver.c:4471
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "worker proces selhal: exit kód %d"
+
+#: pg_backup_archiver.c:2579
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "ID záznamu %d je mimo rozsah -- možná je poškozena TOC"
+
+#: pg_backup_archiver.c:2646
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "obnova tabulek s volbou WITH OIDS již není podporována"
+
+#: pg_backup_archiver.c:2728
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "neplatné kódování \"%s\""
+
+#: pg_backup_archiver.c:2733
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "chybná položka ENCODING: %s"
+
+#: pg_backup_archiver.c:2751
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "chybná položka STDSTRINGS: %s"
+
+#: pg_backup_archiver.c:2776
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "schéma \"%s\" nenalezeno"
+
+#: pg_backup_archiver.c:2783
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "tabulka \"%s\" nenalezena"
+
+#: pg_backup_archiver.c:2790
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "index \"%s\" nenalezen"
+
+#: pg_backup_archiver.c:2797
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "funkce \"%s\" nenalezena"
+
+#: pg_backup_archiver.c:2804
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "trigger \"%s\" nenalezen"
+
+#: pg_backup_archiver.c:3196
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "nelze nastavit uživatele session na \"%s\": %s"
+
+#: pg_backup_archiver.c:3328
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "nelze nastavit search_path na \"%s\": %s"
+
+#: pg_backup_archiver.c:3390
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "nelze nastavit default_tablespace na %s: %s"
+
+#: pg_backup_archiver.c:3435
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "nelze nastavit default_table_access_method na: %s"
+
+#: pg_backup_archiver.c:3527 pg_backup_archiver.c:3685
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "nevím jak nastavit vlastníka pro typ objektu \"%s\""
+
+#: pg_backup_archiver.c:3789
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "nelze najít identifikační řetězec v hlavičce souboru"
+
+#: pg_backup_archiver.c:3802
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "nepodporovaná verze (%d.%d) v hlavičce souboru"
+
+#: pg_backup_archiver.c:3807
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "kontrola velikosti integeru (%lu) selhala"
+
+#: pg_backup_archiver.c:3811
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "archiv byl vytvořen na stroji s většími celými čísly (integer), některé operace mohou selhat"
+
+#: pg_backup_archiver.c:3821
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "očekávaný formát (%d) se liší se od formátu nalezeného v souboru (%d)"
+
+#: pg_backup_archiver.c:3837
+#, c-format
+msgid "archive is compressed, but this installation does not support compression -- no data will be available"
+msgstr "archiv je komprimován, ale tato instalace nepodporuje kompresi -- data nebudou dostupná"
+
+#: pg_backup_archiver.c:3855
+#, c-format
+msgid "invalid creation date in header"
+msgstr "v hlavičce je neplatné datum vytvoření"
+
+#: pg_backup_archiver.c:3983
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "zpracovávám položku %d %s %s"
+
+#: pg_backup_archiver.c:4062
+#, c-format
+msgid "entering main parallel loop"
+msgstr "vstupuji do hlavní paralelní smyčky"
+
+#: pg_backup_archiver.c:4073
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "přeskakuji položku %d %s %s"
+
+#: pg_backup_archiver.c:4082
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "spouštím položku %d %s %s"
+
+#: pg_backup_archiver.c:4136
+#, c-format
+msgid "finished main parallel loop"
+msgstr "ukončuji hlavní paralelní smyčku"
+
+#: pg_backup_archiver.c:4172
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "zpracování vynechalo položku %d %s %s"
+
+#: pg_backup_archiver.c:4777
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "tabulku \"%s\" nelze vytvořit, její data nebudou obnovena"
+
+#: pg_backup_custom.c:378 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "neplatné OID pro \"large object\""
+
+#: pg_backup_custom.c:441 pg_backup_custom.c:507 pg_backup_custom.c:632
+#: pg_backup_custom.c:870 pg_backup_tar.c:1086 pg_backup_tar.c:1091
+#, c-format
+msgid "error during file seek: %m"
+msgstr "chyba během posunu v souboru: %m"
+
+#: pg_backup_custom.c:480
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "datový blok %d má chybnou seek pozici"
+
+#: pg_backup_custom.c:497
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "nepřípustný typ datového bloku (%d) během prohledávání archivu"
+
+#: pg_backup_custom.c:519
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "v archivu nelze najít blok ID %d -- možná kvůli out-of-order restore požadavku, který nemohl být vyřízen kvůli non-seekable vstupnímu souboru"
+
+#: pg_backup_custom.c:524
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "v archivu nelze najít blok ID %d -- archiv může být poškozen"
+
+#: pg_backup_custom.c:531
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "nalezeno neočekávané ID bloku (%d) při čtení dat - očekáváno %d"
+
+#: pg_backup_custom.c:545
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "nepřípustný typ datového bloku %d během obnovení archivu"
+
+#: pg_backup_custom.c:648
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "nelze číst vstupní soubor: %m"
+
+#: pg_backup_custom.c:751 pg_backup_custom.c:803 pg_backup_custom.c:948
+#: pg_backup_tar.c:1089
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "nelze určit seek pozici v archivním souboru: %m"
+
+#: pg_backup_custom.c:767 pg_backup_custom.c:807
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "nelze uzavřít archivní soubor: %m"
+
+#: pg_backup_custom.c:790
+#, c-format
+msgid "can only reopen input archives"
+msgstr "vstupní archivy lze pouze znovu otevřít"
+
+#: pg_backup_custom.c:797
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "paralelní obnova ze standardního vstupnu není podporována"
+
+#: pg_backup_custom.c:799
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "paralelní obnova z neseekovatelného souboru není podporována"
+
+#: pg_backup_custom.c:815
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "nelze nastavit seek pozici v archivním souboru: %m"
+
+#: pg_backup_custom.c:894
+#, c-format
+msgid "compressor active"
+msgstr "compressor aktivní"
+
+#: pg_backup_db.c:41
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "nelze získat server_version z libpq"
+
+#: pg_backup_db.c:52 pg_dumpall.c:1826
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "verze serveru: %s; %s verze: %s"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1828
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "končím kvůli rozdílnosti verzí serverů"
+
+#: pg_backup_db.c:124
+#, c-format
+msgid "already connected to a database"
+msgstr "spojení s databází již existuje"
+
+#: pg_backup_db.c:133 pg_backup_db.c:185 pg_dumpall.c:1651 pg_dumpall.c:1764
+msgid "Password: "
+msgstr "Heslo: "
+
+#: pg_backup_db.c:177
+#, c-format
+msgid "could not connect to database"
+msgstr "nelze znovu navázat spojení s databází"
+
+#: pg_backup_db.c:195
+#, c-format
+msgid "reconnection to database \"%s\" failed: %s"
+msgstr "připojení k databázi \"%s\" selhalo: %s"
+
+#: pg_backup_db.c:199
+#, c-format
+msgid "connection to database \"%s\" failed: %s"
+msgstr "spojení s databází \"%s\" selhalo: %s"
+
+#: pg_backup_db.c:272 pg_dumpall.c:1684
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:279 pg_dumpall.c:1889 pg_dumpall.c:1912
+#, c-format
+msgid "query failed: %s"
+msgstr "dotaz selhal: %s"
+
+#: pg_backup_db.c:281 pg_dumpall.c:1890 pg_dumpall.c:1913
+#, c-format
+msgid "query was: %s"
+msgstr "dotaz byl: %s"
+
+#: pg_backup_db.c:322
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "dotaz vrátil %d řádku namísto jedné: %s"
+msgstr[1] "dotaz vrátil %d řádky namísto jedné: %s"
+msgstr[2] "dotaz vrátil %d řádek namísto jedné: %s"
+
+#: pg_backup_db.c:358
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sPříkaz byl: %s"
+
+#: pg_backup_db.c:414 pg_backup_db.c:488 pg_backup_db.c:495
+msgid "could not execute query"
+msgstr "nelze provést dotaz"
+
+#: pg_backup_db.c:467
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "chyba vrácená voláním PQputCopyData: %s"
+
+#: pg_backup_db.c:516
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "chyba vrícená voláním PQputCopyEnd: %s"
+
+#: pg_backup_db.c:522
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY selhal pro tabulku \"%s\": %s"
+
+#: pg_backup_db.c:528 pg_dump.c:1991
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "neočekávané další výsledky během COPY tabulky \"%s\""
+
+#: pg_backup_db.c:586
+#, c-format
+msgid "LOCK TABLE failed for \"%s\": %s"
+msgstr "LOCK TABLE selhal pro \"%s\": %s"
+
+#: pg_backup_db.c:604
+msgid "could not start database transaction"
+msgstr "nelze spustit databázovou transakci"
+
+#: pg_backup_db.c:612
+msgid "could not commit database transaction"
+msgstr "nelze provést commit transakce"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "nezadán žádný výstupní adresář"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "nelze načíst adresář \"%s\": %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "nelze zavřít adresář \"%s\": %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "nelze vytvořit adresář \"%s\": %m"
+
+#: pg_backup_directory.c:355 pg_backup_directory.c:496
+#: pg_backup_directory.c:532
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "nelze zapsat do výstupního souboru: %s"
+
+#: pg_backup_directory.c:406
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "nelze uzavřít datový soubor \"%s\": %m"
+
+#: pg_backup_directory.c:446
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "nelze otevřít TOC soubor pro large objekty \"%s\" pro vstup: %m"
+
+#: pg_backup_directory.c:457
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "neplatný řádek v TOC souboru pro large objekty \"%s\" : \"%s\""
+
+#: pg_backup_directory.c:466
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "chyba při čtení TOC souboru pro large objekty \"%s\""
+
+#: pg_backup_directory.c:470
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "nelze uzavřít TOC soubor pro large objekty \"%s\": %m"
+
+#: pg_backup_directory.c:689
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "nelze zapsat do TOC souboru pro bloby"
+
+#: pg_backup_directory.c:721
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "jméno souboru je příliš dlouhé: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "tento formát nelze číst"
+
+#: pg_backup_tar.c:177
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "nelze otevřít TOC soubor \"%s\" pro výstup: %m"
+
+#: pg_backup_tar.c:184
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "nelze otevřít TOC soubor pro výstup: %m"
+
+#: pg_backup_tar.c:203 pg_backup_tar.c:358
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "komprese není podporována v archivním formátu tar"
+
+#: pg_backup_tar.c:211
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "nelze otevřít TOC soubor \"%s\" pro vstup: %m"
+
+#: pg_backup_tar.c:218
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "nelze otevřít TOC soubor pro vstup: %m"
+
+#: pg_backup_tar.c:344
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "v archivu nelze najít soubor \"%s\""
+
+#: pg_backup_tar.c:410
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "nelze vygenerovat jméno dočasného souboru: %m"
+
+#: pg_backup_tar.c:421
+#, c-format
+msgid "could not open temporary file"
+msgstr "nelze otevřít dočasný soubor"
+
+#: pg_backup_tar.c:448
+#, c-format
+msgid "could not close tar member"
+msgstr "nelze zavřít tar položku"
+
+#: pg_backup_tar.c:691
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "neočekávaná syntaxe příkazu COPY: \"%s\""
+
+#: pg_backup_tar.c:958
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "neplatné OID pro \"large object\" (%u)"
+
+#: pg_backup_tar.c:1105
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "nelze otevřít dočasný soubor: %m"
+
+#: pg_backup_tar.c:1114
+#, c-format
+msgid "actual file length (%s) does not match expected (%s)"
+msgstr "skutečná délka souboru (%s) neodpovídá očekávané (%s)"
+
+#: pg_backup_tar.c:1171 pg_backup_tar.c:1201
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "nelze najít hlavičku pro soubor %s v tar archivu"
+
+#: pg_backup_tar.c:1189
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "obnova dat mimo pořadí není podporována v tomto formátu archivu: \"%s\" je vyžadován, ale v archivu předchází \"%s\"."
+
+#: pg_backup_tar.c:1234
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "nalezena nekompletní tar hlavička (%lu byte)"
+msgstr[1] "nalezena nekompletní tar hlavička (%lu byty)"
+msgstr[2] "nalezena nekompletní tar hlavička (%lu bytů)"
+
+#: pg_backup_tar.c:1285
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %s"
+msgstr "nalezena poškozená tar hlavička v %s (očekáváno %d, vypočteno %d) pozice souboru %s"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "neznámý název sekce \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:607 pg_dump.c:624 pg_dumpall.c:338
+#: pg_dumpall.c:348 pg_dumpall.c:357 pg_dumpall.c:366 pg_dumpall.c:374
+#: pg_dumpall.c:388 pg_dumpall.c:464 pg_restore.c:284 pg_restore.c:300
+#: pg_restore.c:318
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_backup_utils.c:68
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "vyčerpány dostupné on_exit_nicely sloty"
+
+#: pg_dump.c:533
+#, c-format
+msgid "compression level must be in range 0..9"
+msgstr "úroveň komprese musí být v rozsahu 0..9"
+
+#: pg_dump.c:571
+#, c-format
+msgid "extra_float_digits must be in range -15..3"
+msgstr "extra_float_digits musí být v intervalu -15..3"
+
+#: pg_dump.c:594
+#, c-format
+msgid "rows-per-insert must be in range %d..%d"
+msgstr "počet řádek na insert musí být v rozsahu %d..%d"
+
+#: pg_dump.c:622 pg_dumpall.c:346 pg_restore.c:298
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "příliš mnoho argumentů v příkazové řádce (první je \"%s\")"
+
+#: pg_dump.c:643 pg_restore.c:327
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "volby -s/--schema-only a -a/--data-only nelze používat společně"
+
+#: pg_dump.c:648
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "volby -s/--schema-only a --include-foreign-data nelze používat společně"
+
+#: pg_dump.c:651
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "volba --include-foreign-data není podporována pro paralelní backupy"
+
+#: pg_dump.c:655 pg_restore.c:333
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "volby -c/--clean a -a/--data-only nelze používat společně"
+
+#: pg_dump.c:660 pg_dumpall.c:381 pg_restore.c:382
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "volba --if-exists vyžaduje volbu -c/--clean"
+
+#: pg_dump.c:667
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "volba --on-conflict-do-nothing vyžaduje volbu --inserts, --rows-per-insert, nebo --column-inserts"
+
+#: pg_dump.c:689
+#, c-format
+msgid "requested compression not available in this installation -- archive will be uncompressed"
+msgstr "požadovaná komprese není v této instalaci dostupná -- archiv bude nekomprimovaný"
+
+#: pg_dump.c:710 pg_restore.c:349
+#, c-format
+msgid "invalid number of parallel jobs"
+msgstr "neplatný počet paralelních jobů"
+
+#: pg_dump.c:714
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "paralelní záloha je podporována pouze directory formátem"
+
+#: pg_dump.c:769
+#, c-format
+msgid ""
+"Synchronized snapshots are not supported by this server version.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots."
+msgstr ""
+"Synchronizované snapshoty nejsou na této verzi serveru podporovány.\n"
+"Pokud nepotřebujete synchronizované snapshoty, použijte přepínač\n"
+"--no-synchronized-snapshots."
+
+#: pg_dump.c:775
+#, c-format
+msgid "Exported snapshots are not supported by this server version."
+msgstr "Exportované snapshoty nejsou touto verzí serveru podporovány."
+
+#: pg_dump.c:787
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "poslední vestavěné OID je %u"
+
+#: pg_dump.c:796
+#, c-format
+msgid "no matching schemas were found"
+msgstr "nebyla nalezena žádná odovídající schémata"
+
+#: pg_dump.c:810
+#, c-format
+msgid "no matching tables were found"
+msgstr "nebyla nalezena žádná odpovídající tabulka"
+
+#: pg_dump.c:990
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s vytvoří dump databáze jako textový soubor nebo v jiném formátu.\n"
+"\n"
+
+#: pg_dump.c:991 pg_dumpall.c:617 pg_restore.c:462
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: pg_dump.c:992
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [PŘEPÍNAČ]... [DATABÁZE]\n"
+
+#: pg_dump.c:994 pg_dumpall.c:620 pg_restore.c:465
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Obecné volby:\n"
+
+#: pg_dump.c:995
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=SOUBOR výstupní soubor nebo adresář\n"
+
+#: pg_dump.c:996
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p formát výstupního soubor (custom, directory, tar,\n"
+" plain text (výchozí))\n"
+
+#: pg_dump.c:998
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM použij tento počet paralelních jobů pro zálohu\n"
+
+#: pg_dump.c:999 pg_dumpall.c:622
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose vypisovat více informací\n"
+
+#: pg_dump.c:1000 pg_dumpall.c:623
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version zobraz informaci o verzi, poté skonči\n"
+
+#: pg_dump.c:1001
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 úroveň komprese při použití komprimovaného formátu\n"
+
+#: pg_dump.c:1002 pg_dumpall.c:624
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=TIMEOUT selže po uplynutí TIMEOUT čekáním na zámek tabulky\n"
+
+#: pg_dump.c:1003 pg_dumpall.c:651
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync nečekat než budou změny bezpečně zapsány na disk\n"
+
+#: pg_dump.c:1004 pg_dumpall.c:625
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help zobraz tuto nápovědu, poté skonči\n"
+
+#: pg_dump.c:1006 pg_dumpall.c:626
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Přepínače ovlivňující výstup:\n"
+
+#: pg_dump.c:1007 pg_dumpall.c:627
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only dump pouze dat bez definic databázových objektů\n"
+
+#: pg_dump.c:1008
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs zahrnout \"large objects\" do dumpu\n"
+
+#: pg_dump.c:1009
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs nezahrnovat \"large objects\" do dumpu\n"
+
+#: pg_dump.c:1010 pg_restore.c:476
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean odstranit (drop) databázi před jejím vytvořením\n"
+
+#: pg_dump.c:1011
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create zahrnout příkazy pro vytvoření databáze do dumpu\n"
+
+#: pg_dump.c:1012 pg_dumpall.c:629
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=KÓDOVÁNÍ kódování znaků databáze\n"
+
+#: pg_dump.c:1013
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr ""
+" -n, --schema=PATTERN vytvořit dump pouze specifikovaného schématu\n"
+"\n"
+
+#: pg_dump.c:1014
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATTERN nedumpuj uvedená schéma(ta)\n\n"
+
+#: pg_dump.c:1015
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner nevypisovat příkazy pro nastavení vlastníka objektu\n"
+" v čistě textovém formátu\n"
+
+#: pg_dump.c:1017 pg_dumpall.c:633
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr ""
+" -s, --schema-only dump pouze definic databázových objektů\n"
+" (tabulek apod.) bez dat\n"
+
+#: pg_dump.c:1018
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=JMÉNO uživatelské jméno superuživatele použité při dumpu\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid " -t, --table=PATTERN dump the specified table(s) only\n"
+msgstr ""
+" -t, --table=PATTERN provést dump pouze uvedené tabulky\n"
+"\n"
+
+#: pg_dump.c:1020
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr ""
+" -T, --exclude-table=PATTERN neprováděj dump uvedených tabulek\n"
+"\n"
+
+#: pg_dump.c:1021 pg_dumpall.c:636
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges neprovádět dump přístupových práv (grant/revoke)\n"
+
+#: pg_dump.c:1022 pg_dumpall.c:637
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade pouze pro použití upgradovacími nástroji\n"
+
+#: pg_dump.c:1023 pg_dumpall.c:638
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts použije pro dump dat příkaz INSERT se jmény sloupců\n"
+
+#: pg_dump.c:1024 pg_dumpall.c:639
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr ""
+" --disable-dollar-quoting nepoužívat znak dolaru místo uvozovek, používat\n"
+" standardní SQL uvozování\n"
+
+#: pg_dump.c:1025 pg_dumpall.c:640 pg_restore.c:493
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers zakázat volání triggerů během obnovy dat\n"
+
+#: pg_dump.c:1026
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security povolit row security (vypíše pouze data ke kterým má\n"
+" uživatel přístup)\n"
+
+#: pg_dump.c:1028
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=VZOR nedumpuj data pro zadané tabulky\n\n"
+
+#: pg_dump.c:1029 pg_dumpall.c:642
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM přenastav výchozí nastavení pro extra_float_digits\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:643 pg_restore.c:495
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists použít IF EXISTS při mazání objektů\n"
+
+#: pg_dump.c:1031
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=PATTERN\n"
+" zahrne data z foreign tabulek náležících k foreign\n"
+" serverům odpovídajícím PATTERN\n"
+
+#: pg_dump.c:1034 pg_dumpall.c:644
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts použít pro dump dat příkazy INSERT místo COPY\n"
+
+#: pg_dump.c:1035 pg_dumpall.c:645
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root data do partition tabulek načítat přes root tabulku\n"
+
+#: pg_dump.c:1036 pg_dumpall.c:646
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments neprovádět dump komentářů\n"
+
+#: pg_dump.c:1037 pg_dumpall.c:647
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications neprovádět dump publikací\n"
+
+#: pg_dump.c:1038 pg_dumpall.c:649
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels neprovádět dump bezpečnostních štítků\n"
+
+#: pg_dump.c:1039 pg_dumpall.c:650
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions neprovádět dump subsckripcí\n"
+
+#: pg_dump.c:1040
+#, c-format
+msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"
+msgstr " --no-synchronized-snapshots nepoužívat synchronizované snapshoty v paralelních jobech\n"
+
+#: pg_dump.c:1041 pg_dumpall.c:652
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces neprovádět dump přiřazení tablespaces\n"
+
+#: pg_dump.c:1042 pg_dumpall.c:653
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data nedumpuj data unlogged tabulek\n"
+
+#: pg_dump.c:1043 pg_dumpall.c:654
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing přidej ON CONFLICT DO NOTHING do INSERT příkazů\n"
+
+#: pg_dump.c:1044 pg_dumpall.c:655
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr " --quote-all-identifiers všechny identifikátory uveď v uvozovkách, i když se nejedná o klíčová slova\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:656
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS počet řádek per INSERT; implikuje --inserts\n"
+
+#: pg_dump.c:1046
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION dump pojmenované sekce (pre-data, data, nebo post-data)\n"
+
+#: pg_dump.c:1047
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable počkej než bude možné provést dump bez anomálií\n"
+
+#: pg_dump.c:1048
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT pro dump použít zadaný snapshot\n"
+
+#: pg_dump.c:1049 pg_restore.c:504
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names vyžadovat aby každý vzor pro zahrnutí tabulek a/nebo schémat\n"
+" odpovídal alespoň jednomu objektu\n"
+
+#: pg_dump.c:1051 pg_dumpall.c:657 pg_restore.c:506
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" používat příkaz SET SESSION AUTHORIZATION namísto\n"
+" příkazu ALTER OWNER pro nastavení vlastníka\n"
+
+#: pg_dump.c:1055 pg_dumpall.c:661 pg_restore.c:510
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Volby spojení:\n"
+
+#: pg_dump.c:1056
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=JMÉNO jméno zdrojové databáze\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:663 pg_restore.c:511
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME host databázového serveru nebo adresář se sockety\n"
+
+#: pg_dump.c:1058 pg_dumpall.c:665 pg_restore.c:512
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT port databázového serveru\n"
+
+#: pg_dump.c:1059 pg_dumpall.c:666 pg_restore.c:513
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=JMÉNO připoj se jako uvedený uživatel\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:667 pg_restore.c:514
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nikdy se neptej na heslo\n"
+
+#: pg_dump.c:1061 pg_dumpall.c:668 pg_restore.c:515
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password zeptej se na heslo (mělo by se dít automaticky)\n"
+
+#: pg_dump.c:1062 pg_dumpall.c:669
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLENAME před dumpem proveď SET ROLE\n"
+
+#: pg_dump.c:1064
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Není-li specifikováno jméno databáze, použije se proměnná prostředí\n"
+"PGDATABASE.\n"
+"\n"
+
+#: pg_dump.c:1066 pg_dumpall.c:673 pg_restore.c:522
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Chyby hlašte na <%s>.\n"
+
+#: pg_dump.c:1067 pg_dumpall.c:674 pg_restore.c:523
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: pg_dump.c:1086 pg_dumpall.c:499
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "specifikováno neplatné klientské kódování \"%s\""
+
+#: pg_dump.c:1235
+#, c-format
+msgid ""
+"Synchronized snapshots on standby servers are not supported by this server version.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots."
+msgstr ""
+"Synchronizované snapshoty nejsou na této verzi serveru podporovány.\n"
+"Pokud nepotřebujete synchronizované snapshoty, použijte přepínač\n"
+"--no-synchronized-snapshots."
+
+#: pg_dump.c:1304
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "specifikován neplatný formát \"%s\" výstupu"
+
+#: pg_dump.c:1342
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "nebyla nalezena žádná schémata odpovídající vzoru \"%s\""
+
+#: pg_dump.c:1389
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "nebyly nalezeny žádné foreign servery odpovídající vzoru \"%s\""
+
+#: pg_dump.c:1452
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "nebyla nalezena žádná tabulka odpovídající vzoru \"%s\""
+
+#: pg_dump.c:1865
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "dumpuji obsah tabulky \"%s.%s\""
+
+#: pg_dump.c:1972
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Dumpování obsahu tabulky \"%s\" selhalo: volání PQgetCopyData() selhalo."
+
+#: pg_dump.c:1973 pg_dump.c:1983
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Chybová zpráva ze serveru: %s"
+
+#: pg_dump.c:1974 pg_dump.c:1984
+#, c-format
+msgid "The command was: %s"
+msgstr "Příkaz byl: %s"
+
+#: pg_dump.c:1982
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Dumpování obsahu tabulky \"%s\" selhalo: volání PQgetResult() selhalo."
+
+#: pg_dump.c:2742
+#, c-format
+msgid "saving database definition"
+msgstr "ukládám definice databáze"
+
+#: pg_dump.c:3214
+#, c-format
+msgid "saving encoding = %s"
+msgstr "ukládám kódování znaků = %s"
+
+#: pg_dump.c:3239
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "ukládám standard_conforming_strings = %s"
+
+#: pg_dump.c:3278
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "nelze zpracovat výsledek current_schemas()"
+
+#: pg_dump.c:3297
+#, c-format
+msgid "saving search_path = %s"
+msgstr "ukládám search_path = %s"
+
+#: pg_dump.c:3337
+#, c-format
+msgid "reading large objects"
+msgstr "čtu \"large objects\""
+
+#: pg_dump.c:3519
+#, c-format
+msgid "saving large objects"
+msgstr "ukládám \"large objects\""
+
+#: pg_dump.c:3565
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "chyba při čtení large objektu %u: %s"
+
+#: pg_dump.c:3617
+#, c-format
+msgid "reading row security enabled for table \"%s.%s\""
+msgstr "čtu row security enabled pro tabulku \"%s.%s\""
+
+#: pg_dump.c:3648
+#, c-format
+msgid "reading policies for table \"%s.%s\""
+msgstr "čtu policies pro tablku \"%s.%s\""
+
+#: pg_dump.c:3800
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "neočekáváný typ policy příkazu: %c"
+
+#: pg_dump.c:3951
+#, c-format
+msgid "owner of publication \"%s\" appears to be invalid"
+msgstr "vlastník publikace \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:4096
+#, c-format
+msgid "reading publication membership for table \"%s.%s\""
+msgstr "čtu členství v publikacích pro tabulku \"%s.%s\""
+
+#: pg_dump.c:4239
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "subscriptions nejsou zahrnuty do dumpu protože aktuální uživatel není superuživatl"
+
+#: pg_dump.c:4293
+#, c-format
+msgid "owner of subscription \"%s\" appears to be invalid"
+msgstr "vlastník subskripce \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:4337
+#, c-format
+msgid "could not parse subpublications array"
+msgstr "nelze naparsovat pole \"subpublications\""
+
+#: pg_dump.c:4659
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "nelze najít nadřízené rozšíření pro %s %s"
+
+#: pg_dump.c:4791
+#, c-format
+msgid "owner of schema \"%s\" appears to be invalid"
+msgstr "vlastník schématu \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:4814
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "schéma s OID %u neexistuje"
+
+#: pg_dump.c:5139
+#, c-format
+msgid "owner of data type \"%s\" appears to be invalid"
+msgstr "vlastník datového typu \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:5224
+#, c-format
+msgid "owner of operator \"%s\" appears to be invalid"
+msgstr "vlastník operátoru \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:5526
+#, c-format
+msgid "owner of operator class \"%s\" appears to be invalid"
+msgstr "vlastník třídy operátorů \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:5610
+#, c-format
+msgid "owner of operator family \"%s\" appears to be invalid"
+msgstr "vlastník rodiny operátorů \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:5779
+#, c-format
+msgid "owner of aggregate function \"%s\" appears to be invalid"
+msgstr "vlastník agregační funkce \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:6039
+#, c-format
+msgid "owner of function \"%s\" appears to be invalid"
+msgstr "vlastník funkce \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:6867
+#, c-format
+msgid "owner of table \"%s\" appears to be invalid"
+msgstr "vlastník tabulky \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:6909 pg_dump.c:17389
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "selhala kontrola, OID %u rodičovské tabulky u sekvence s OID %u nelze najít"
+
+#: pg_dump.c:7051
+#, c-format
+msgid "reading indexes for table \"%s.%s\""
+msgstr "čtu indexy pro tabulku \"%s.%s\""
+
+#: pg_dump.c:7466
+#, c-format
+msgid "reading foreign key constraints for table \"%s.%s\""
+msgstr "čtu cizí klíče pro tabulku \"%s.%s\""
+
+#: pg_dump.c:7747
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "selhala kontrola, OID %u rodičovské tabulky u pg_rewrite položky OID %u nelze najít"
+
+#: pg_dump.c:7830
+#, c-format
+msgid "reading triggers for table \"%s.%s\""
+msgstr "čtu triggery pro tabulku \"%s.%s\""
+
+#: pg_dump.c:7963
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "dotaz vrátil prázdné jméno referencované tabulky pro trigger \"%s\" cizího klíče pro tabulku \"%s\" (OID tabulky: %u)"
+
+#: pg_dump.c:8518
+#, c-format
+msgid "finding the columns and types of table \"%s.%s\""
+msgstr "hledám sloupce a typy pro tabulku \"%s.%s\""
+
+#: pg_dump.c:8654
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "neplatné číslování sloupců v tabulce \"%s\""
+
+#: pg_dump.c:8691
+#, c-format
+msgid "finding default expressions of table \"%s.%s\""
+msgstr "hledám DEFAULT výrazy pro tabulku \"%s.%s\""
+
+#: pg_dump.c:8713
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "neplatná \"adnum\" hodnota %d pro tabulku \"%s\""
+
+#: pg_dump.c:8778
+#, c-format
+msgid "finding check constraints for table \"%s.%s\""
+msgstr "hledám CHECK omezení pro tabulku \"%s.%s\""
+
+#: pg_dump.c:8827
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "očekáván %d check constraint na tabulce \"%s\" nalezeno %d"
+msgstr[1] "očekávány %d check constrainty na tabulce \"%s\" nalezeno %d"
+msgstr[2] "očekáváno %d check constraintů na tabulce \"%s\" nalezeno %d"
+
+#: pg_dump.c:8831
+#, c-format
+msgid "(The system catalogs might be corrupted.)"
+msgstr "(Systémové katalogy mohou být poškozeny.)"
+
+#: pg_dump.c:10417
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "typtype datového typu \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:11771
+#, c-format
+msgid "bogus value in proargmodes array"
+msgstr "nesmyslná hodnota v \"proargmodes\" poli"
+
+#: pg_dump.c:12143
+#, c-format
+msgid "could not parse proallargtypes array"
+msgstr "nelze naparsovat pole \"proallargtypes\""
+
+#: pg_dump.c:12159
+#, c-format
+msgid "could not parse proargmodes array"
+msgstr "nelze naparsovat pole \"proargmodes\""
+
+#: pg_dump.c:12173
+#, c-format
+msgid "could not parse proargnames array"
+msgstr "nelze naparsovat pole \"proargnames\""
+
+#: pg_dump.c:12184
+#, c-format
+msgid "could not parse proconfig array"
+msgstr "nelze naparsovat pole \"proconfig\""
+
+#: pg_dump.c:12264
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "nerozpoznaná \"provolatile\" hodnota pro funkci \"%s\""
+
+#: pg_dump.c:12314 pg_dump.c:14372
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "nerozpoznaná proparallel\" hodnota pro funkci \"%s\""
+
+#: pg_dump.c:12453 pg_dump.c:12562 pg_dump.c:12569
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "nelze najít definici pro funkci ID %u"
+
+#: pg_dump.c:12492
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "chybná hodnota v položce pg_cast.castfunc nebo pg_cast.castmethod"
+
+#: pg_dump.c:12495
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "nesmyslná hodnota v položce \"pg_cast.castmethod\""
+
+#: pg_dump.c:12588
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "chybná definice transformace, alespoň jedno z trffromsql a trftosql by mělo být nenulové"
+
+#: pg_dump.c:12605
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "nesmyslná hodnota v položce pg_transform.trffromsql"
+
+#: pg_dump.c:12626
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "nesmyslná hodnota v položce pg_transform.trftosql"
+
+#: pg_dump.c:12942
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "nelze najít operátor s OID %s"
+
+#: pg_dump.c:13010
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "neplatný typ \"%c\" access metody \"%s\""
+
+#: pg_dump.c:13764
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "neočekávaný poskytovatel collation: %s"
+
+#: pg_dump.c:14236
+#, c-format
+msgid "aggregate function %s could not be dumped correctly for this database version; ignored"
+msgstr "agregační funkci %s nelze dumpovat korektně pro tuto verzi databáze; ignorováno"
+
+#: pg_dump.c:14291
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "neznámá aggfinalmodify hodnota for agregační funkci \"%s\""
+
+#: pg_dump.c:14347
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "neznámá aggmfinalmodify hodnota for agregační funkci \"%s\""
+
+#: pg_dump.c:15069
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "neznámý typ objektu (%d) ve výchozích privilegiích"
+
+#: pg_dump.c:15087
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "nelze zpracovat seznam oprávnění ACL (%s)"
+
+#: pg_dump.c:15172
+#, c-format
+msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)"
+msgstr "nelze zpracovat výchozí GRANT ACL seznam (%s) nebo výchozí REVOKE ACL seznam (%s) pro objekt \"%s\" (%s)"
+
+#: pg_dump.c:15180
+#, c-format
+msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)"
+msgstr "nelze zpracovat GRANT ACL seznam (%s) nebo REVOKE ACL seznam (%s) pro objekt \"%s\" (%s)"
+
+#: pg_dump.c:15695
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "dotaz na získání definice view \"%s\" nevrátil žádná data"
+
+#: pg_dump.c:15698
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "dotaz na získání definice view \"%s\" vrátil více jak jednu definici"
+
+#: pg_dump.c:15705
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "definice view \"%s\" se zdá být prázdná (nulová délka)"
+
+#: pg_dump.c:15789
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS již není podporováno (tabulka \"%s\")"
+
+#: pg_dump.c:16269
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "neplatný počet rodičů %d pro tabulku \"%s\""
+
+#: pg_dump.c:16592
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "neplatné číslo sloupce %d pro tabulku \"%s\""
+
+#: pg_dump.c:16877
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "chybí index pro omezení \"%s\""
+
+#: pg_dump.c:17102
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "neočekávaný typ omezení: %c"
+
+#: pg_dump.c:17234 pg_dump.c:17454
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "dotaz pro načtení dat sekvence \"%s\" vrátil %d řádek (expected 1)"
+msgstr[1] "dotaz pro načtení dat sekvence \"%s\" vrátil %d řádky (expected 1)"
+msgstr[2] "dotaz pro načtení dat sekvence \"%s\" vrátil %d řádek (expected 1)"
+
+#: pg_dump.c:17268
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "neočekávaný typ sekvence: %s"
+
+#: pg_dump.c:17552
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "neočekávaná hodnota tgtype: %d"
+
+#: pg_dump.c:17626
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "neplatný řetězec argumentů (%s) pro trigger \"%s\" tabulky \"%s\""
+
+#: pg_dump.c:17862
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "dotaz k získání pravidla (RULE) \"%s\" pro tabulku \"%s\" selhal: vrácen chybný počet řádků"
+
+#: pg_dump.c:18024
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "nelze najít odkazované rozšíření %u"
+
+#: pg_dump.c:18236
+#, c-format
+msgid "reading dependency data"
+msgstr "čtu data o závislostech"
+
+#: pg_dump.c:18329
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "žádný odkazující objekt %u: %u"
+
+#: pg_dump.c:18340
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "žádný odkazovaný objekt %u: %u"
+
+#: pg_dump.c:18713
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "nelze naparsovat pole \"reloptions\""
+
+#: pg_dump_sort.c:360
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "neplatné dumpId %d"
+
+#: pg_dump_sort.c:366
+#, c-format
+msgid "invalid dependency %d"
+msgstr "neplatná závislost %d"
+
+#: pg_dump_sort.c:599
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "nelze identifikovat smyčku závislostí"
+
+#: pg_dump_sort.c:1170
+#, c-format
+msgid "there are circular foreign-key constraints on this table:"
+msgid_plural "there are circular foreign-key constraints among these tables:"
+msgstr[0] "na této tabulce existuje cyklus cizích klíčů:"
+msgstr[1] "mezi těmito tabulkami existuje cyklus cizích klíčů:"
+msgstr[2] "mezi těmito tabulkami existuje cyklus cizích klíčů:"
+
+#: pg_dump_sort.c:1174 pg_dump_sort.c:1194
+#, c-format
+msgid " %s"
+msgstr " %s"
+
+#: pg_dump_sort.c:1175
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "Bez zadání volby --disable-triggers nebo dočasného vypnutí constraintů zřejmě nebudete schopni tento dump obnovit."
+
+#: pg_dump_sort.c:1176
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "Zvažte použití kompletního (full) dumpu namísto --data-only dumpu pro odstranění tohoto problému."
+
+#: pg_dump_sort.c:1188
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "nelze vyřešit smyčku závislostí mezi těmito položkami:"
+
+#: pg_dumpall.c:199
+#, c-format
+msgid ""
+"The program \"%s\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation."
+msgstr ""
+"Program \"%s\" je vyžadován aplikací %s, ale nebyl nalezen ve stejném\n"
+"adresáři jako \"%s\".\n"
+"Zkontrolujte vaši instalaci."
+
+#: pg_dumpall.c:204
+#, c-format
+msgid ""
+"The program \"%s\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation."
+msgstr ""
+"Program \"%s\" byl nalezen pomocí \"%s\",\n"
+"ale nebyl ve stejné verzi jako %s.\n"
+"Zkontrolujte vaši instalaci."
+
+#: pg_dumpall.c:356
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "volba --exclude-database nemůže být použita společně s -g/--globals-only, -r/--roles-only, nebo -t/--tablespaces-only"
+
+#: pg_dumpall.c:365
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "volby -g/--globals-only a -r/--roles-only nelze používat společně"
+
+#: pg_dumpall.c:373
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "volby -g/--globals-only a -t/--tablespaces-only nelze používat společně"
+
+#: pg_dumpall.c:387
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "volby -r/--roles-only a -t/--tablespaces-only nelze používat společně"
+
+#: pg_dumpall.c:448 pg_dumpall.c:1754
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "nelze navázat spojení s databází \"%s\""
+
+#: pg_dumpall.c:462
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"nelze navázat spojení s databází \"postgres\" nebo \"template1\"\n"
+"Zadejte prosím alternativní databázi."
+
+#: pg_dumpall.c:616
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s extrahuje PostgreSQL databázi do souboru s SQL skriptem.\n"
+"\n"
+
+#: pg_dumpall.c:618
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [VOLBA]...\n"
+
+#: pg_dumpall.c:621
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=SOUBOR výstupní soubor\n"
+
+#: pg_dumpall.c:628
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean odstranit (drop) databázi před jejím vytvořením\n"
+
+#: pg_dumpall.c:630
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only dump pouze globálních objektů, ne databáze\n"
+
+#: pg_dumpall.c:631 pg_restore.c:485
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner nevypisuje příkazy k nastavení vlastníka objektů\n"
+
+#: pg_dumpall.c:632
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only dump pouze rolí, ne databází nebo tablespaců\n"
+
+#: pg_dumpall.c:634
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=JMÉNO uživatelské jméno superuživatele použité při dumpu\n"
+
+#: pg_dumpall.c:635
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only dump pouze tablespaců, ne databází nebo rolí\n"
+
+#: pg_dumpall.c:641
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=VZOR nedumpuj databáze jejichž jména odpovídají VZORu\n"
+
+#: pg_dumpall.c:648
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords hesla pro role nezahrnovat do dumpu\n"
+
+#: pg_dumpall.c:662
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONNSTR specifikace připojení do databáze\n"
+
+#: pg_dumpall.c:664
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=DBNAME alternativní výchozí databáze\n"
+
+#: pg_dumpall.c:671
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Pokud není použito -f/--file, potom SQL skript bude vypsán přímo na standardní\n"
+"výstup.\n"
+"\n"
+
+#: pg_dumpall.c:877
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "název role začínající s \"pg_\" přeskočen (%s)"
+
+#: pg_dumpall.c:1278
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "nelze zpracovat ACL seznam (%s) pro prostor tabulek \"%s\""
+
+#: pg_dumpall.c:1495
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "nedumpuji databázi \"%s\""
+
+#: pg_dumpall.c:1499
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "dumpuji databázi \"%s\""
+
+#: pg_dumpall.c:1531
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump selhal při zpracovávání databáze \"%s\", ukončuji se"
+
+#: pg_dumpall.c:1540
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "nelze otevřít logovací soubor \"%s\": %m"
+
+#: pg_dumpall.c:1584
+#, c-format
+msgid "running \"%s\""
+msgstr "běží \"%s\""
+
+#: pg_dumpall.c:1775
+#, c-format
+msgid "could not connect to database \"%s\": %s"
+msgstr "nelze navázat spojení s databází \"%s\": %s"
+
+#: pg_dumpall.c:1805
+#, c-format
+msgid "could not get server version"
+msgstr "nelze získat verzi serveru"
+
+#: pg_dumpall.c:1811
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "nelze zpracovat verzi serveru \"%s\""
+
+#: pg_dumpall.c:1883 pg_dumpall.c:1906
+#, c-format
+msgid "executing %s"
+msgstr "spouštím: %s"
+
+#: pg_restore.c:308
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "musí být specifikována jedna z voleb -d/--dbname a -f/--file"
+
+#: pg_restore.c:317
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "volby -d/--dbname a -f/--file nelze používat společně"
+
+#: pg_restore.c:343
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "volby -C/--create a -1/--single-transaction nelze používat společně"
+
+#: pg_restore.c:357
+#, c-format
+msgid "maximum number of parallel jobs is %d"
+msgstr "maximální počet paralelních jobů je %d"
+
+#: pg_restore.c:366
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "nelze zadat --single-transaction a několik úloh"
+
+#: pg_restore.c:408
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "neznámý formát archivu \"%s\"; zadejte prosím \"c\", \"d\" nebo \"t\""
+
+#: pg_restore.c:448
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "chyby ignorovány při obnovení: %d"
+
+#: pg_restore.c:461
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s obnovuje PostgreSQL databázi z archivu vytvořeného pomocí pg_dump.\n"
+"\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [PŘEPÍNAČ]... [SOUBOR]\n"
+
+#: pg_restore.c:466
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=JMÉNO jméno cílové databáze\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=SOUBOR výstupní soubor (- pro stdout)\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t formát záložního souboru (měl by být automatický)\n"
+
+#: pg_restore.c:469
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list zobrazit sumarizovaný obsah (TOC) archivu\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose vypisovat více informací\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version zobraz informaci o verzi, poté skonči\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help zobraz tuto nápovědu, poté skonči\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Přepínače ovlivňující obnovu:\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only obnovit pouze data, ne definice databázových objektů\n"
+
+#: pg_restore.c:477
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create vypíše příkazy pro vytvoření databáze\n"
+
+#: pg_restore.c:478
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error ukončit při chybě, implicitně pokračuje\n"
+
+#: pg_restore.c:479
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=JMÉNO obnovit jmenovaný index\n"
+
+#: pg_restore.c:480
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM použij pro obnovu daný počet paralelních jobů\n"
+
+#: pg_restore.c:481
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=SOUBOR použít specifikovaný obsah (TOC) pro řazení\n"
+" výstupu z tohoto souboru\n"
+
+#: pg_restore.c:483
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME obnovit pouze objekty v tomto schématu\n"
+
+#: pg_restore.c:484
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME neobnovovat objekty v tomto schématu\n"
+
+#: pg_restore.c:486
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr ""
+" -P, --function=JMÉNO(args)\n"
+" obnovit funkci daného jména\n"
+
+#: pg_restore.c:487
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only obnovit pouze definice objektů, bez dat\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr ""
+" -S, --superuser=JMÉNO jméno superuživatele použité pro\n"
+" zakázaní triggerů\n"
+
+#: pg_restore.c:489
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=JMÉNO obnovit pouze jmenovanou relaci (tabulka, pohled, etc.)\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=JMÉNO obnovit pouze jmenovaný trigger\n"
+
+#: pg_restore.c:491
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges přeskočit obnovu přístupových práv (grant/revoke)\n"
+
+#: pg_restore.c:492
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr ""
+" -1, --single-transaction\n"
+" zpracuj soubor v rámci jedné transakce\n"
+
+#: pg_restore.c:494
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security povolit row security\n"
+
+#: pg_restore.c:496
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments neobnovovat komentáře\n"
+
+#: pg_restore.c:497
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables\n"
+" neobnovuj data tabulek které nemohly být vytvořeny\n"
+
+#: pg_restore.c:499
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications do not restore publications\n"
+
+#: pg_restore.c:500
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels neobnovuj bezpečnostní štítky\n"
+
+#: pg_restore.c:501
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions neobnovovat subskripce\n"
+
+#: pg_restore.c:502
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces neobnovuj přiřazení tablespaces\n"
+
+#: pg_restore.c:503
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION obnov pojmenovanou sekci (pre-data, data, nebo post-data)\n"
+
+#: pg_restore.c:516
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME před obnovou proveď SET ROLE\n"
+
+#: pg_restore.c:518
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Volby -I, -n, -N, -P, -t, -T, a --section mohou být kombinovány a zadány několikrát\n"
+"pro výběr více objektů.\n"
+
+#: pg_restore.c:521
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Není-li definován vstupní soubor, je použit standardní vstup.\n"
+"\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "nelze číst symbolický link \"%s\""
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "potomek byl ukončen signálem %s"
+
+#~ msgid "compress_io"
+#~ msgstr "compress_io"
+
+#~ msgid "parallel archiver"
+#~ msgstr "paralelní archivář"
+
+#~ msgid "archiver"
+#~ msgstr "archivář"
+
+#~ msgid "-C and -1 are incompatible options\n"
+#~ msgstr "-C a -1 jsou nekompatibilní přepínače\n"
+
+#~ msgid "attempting to ascertain archive format\n"
+#~ msgstr "pokouším se zjistit formát archivu\n"
+
+#~ msgid "allocating AH for %s, format %d\n"
+#~ msgstr "alokován AH pro %s, formát %d\n"
+
+#~ msgid "read TOC entry %d (ID %d) for %s %s\n"
+#~ msgstr "přečetl jsem TOC záznam %d (ID %d) pro %s %s\n"
+
+#~ msgid "could not set default_with_oids: %s"
+#~ msgstr "nelze nastavit default_with_oids: %s"
+
+#~ msgid "entering restore_toc_entries_prefork\n"
+#~ msgstr "vstupuji do restore_toc_entries_prefork\n"
+
+#~ msgid "entering restore_toc_entries_parallel\n"
+#~ msgstr "vstupuji do restore_toc_entries_parallel\n"
+
+#~ msgid "entering restore_toc_entries_postfork\n"
+#~ msgstr "vstupuji do restore_toc_entries_postfork\n"
+
+#~ msgid "no item ready\n"
+#~ msgstr "žádná položka není připravena\n"
+
+#~ msgid "transferring dependency %d -> %d to %d\n"
+#~ msgstr "přenáším závislost %d -> %d to %d\n"
+
+#~ msgid "reducing dependencies for %d\n"
+#~ msgstr "redukuji závislosti pro %d\n"
+
+#~ msgid "custom archiver"
+#~ msgstr "vlastní archivář"
+
+#~ msgid "archiver (db)"
+#~ msgstr "archivář (db)"
+
+#~ msgid "failed to reconnect to database\n"
+#~ msgstr "selhalo znovunavázání spojení s databází\n"
+
+#~ msgid "failed to connect to database\n"
+#~ msgstr "selhalo spojení s databází\n"
+
+#~ msgid "directory archiver"
+#~ msgstr "directory archiver"
+
+#~ msgid "tar archiver"
+#~ msgstr "tar archivář"
+
+#~ msgid "moving from position %s to next member at file position %s\n"
+#~ msgstr "přecházím z pozice %s na následujícího položky na pozici souboru %s\n"
+
+#~ msgid "now at file position %s\n"
+#~ msgstr "nyní na pozici souboru %s\n"
+
+#~ msgid "skipping tar member %s\n"
+#~ msgstr "přeskakován tar člen %s\n"
+
+#~ msgid "TOC Entry %s at %s (length %s, checksum %d)\n"
+#~ msgstr "TOC položka %s na %s (délka %s, kontrolní součet %d)\n"
+
+#~ msgid "options --inserts/--column-inserts and -o/--oids cannot be used together\n"
+#~ msgstr "volby --inserts/--column-inserts a -o/--oids nelze používat společně\n"
+
+#~ msgid "(The INSERT command cannot set OIDs.)\n"
+#~ msgstr "(Příkaz INSERT nemůže nastavovat OID.)\n"
+
+#~ msgid " -o, --oids include OIDs in dump\n"
+#~ msgstr " -o, --oids zahrnout OID do dumpu\n"
+
+#~ msgid "WARNING: could not parse reloptions array\n"
+#~ msgstr "VAROVÁNÍ: nelze naparsovat pole reloptions\n"
+
+#~ msgid "sorter"
+#~ msgstr "sorter"
+
+#~ msgid " %s\n"
+#~ msgstr " %s\n"
+
+#~ msgid "%s: option --if-exists requires option -c/--clean\n"
+#~ msgstr "%s: volba --if-exists vyžaduje volbu -c/--clean\n"
+
+#~ msgid "%s: could not open the output file \"%s\": %s\n"
+#~ msgstr "%s: nelze otevřít výstupní soubor \"%s\": %s\n"
+
+#~ msgid "%s: invalid client encoding \"%s\" specified\n"
+#~ msgstr "%s: specifikováno neplatné klientské kódování \"%s\"\n"
+
+#~ msgid "%s: executing %s\n"
+#~ msgstr "%s: vykonávám %s\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s: dotaz selhal: %s"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s: dotaz byl: %s\n"
+
+#~ msgid "%s: options -s/--schema-only and -a/--data-only cannot be used together\n"
+#~ msgstr "%s: volby -s/--schema-only a -a/--data-only nelze použít najednou\n"
+
+#~ msgid "%s: options -c/--clean and -a/--data-only cannot be used together\n"
+#~ msgstr "%s: volby -c/--clean a -a/--data-only nelze používat společně\n"
+
+#~ msgid "%s: invalid number of parallel jobs\n"
+#~ msgstr "%s: neplatný počet paralelních jobů\n"
+
+#~ msgid "worker is terminating\n"
+#~ msgstr "worker končí\n"
+
+#~ msgid "error processing a parallel work item\n"
+#~ msgstr "chyba při paralelním zpracovávání položky\n"
+
+#~ msgid "terminated by user\n"
+#~ msgstr "ukončeno uživatelem\n"
+
+#~ msgid "setting owner and privileges for %s %s\n"
+#~ msgstr "nastavuji vlastníka a přístupová práva pro %s %s\n"
+
+#~ msgid "could not write to custom output routine\n"
+#~ msgstr "nelze zapsat do vlastní výstupní rutiny\n"
+
+#~ msgid "unexpected end of file\n"
+#~ msgstr "neočekávaný konec souboru\n"
+
+#~ msgid "could not find slot of finished worker\n"
+#~ msgstr "nelze najít slot ukončeného workera\n"
+
+#~ msgid "could not write byte: %s\n"
+#~ msgstr "nelze zapsat byte: %s\n"
+
+#~ msgid "could not write byte\n"
+#~ msgstr "nelze zapsat byte\n"
+
+#~ msgid "could not write null block at end of tar archive\n"
+#~ msgstr "nelze zapsat null blok na konec tar archivu\n"
+
+#~ msgid "archive member too large for tar format\n"
+#~ msgstr "položka archivu je příliš velká pro formát tar\n"
+
+#~ msgid "could not output padding at end of tar member\n"
+#~ msgstr "nelze zapsat vycpávku (padding) na konec položky taru\n"
+
+#~ msgid "mismatch in actual vs. predicted file position (%s vs. %s)\n"
+#~ msgstr "aktuální a předpokládaná pozice souboru se neshodují (%s vs. %s)\n"
+
+#~ msgid "could not open output file \"%s\" for writing\n"
+#~ msgstr "nelze otevřít výstupní soubor \"%s\" pro zápis\n"
+
+#~ msgid "server version must be at least 7.3 to use schema selection switches\n"
+#~ msgstr "verze serveru musí být alespoň 7.3 pro použití přepínačů prů výběr schématu\n"
+
+#~ msgid "query to get data of sequence \"%s\" returned name \"%s\"\n"
+#~ msgstr "dotaz na získání dat sekvence \"%s\" vrátil jméno \"%s\"\n"
+
+#~ msgid "%s: could not parse ACL list (%s) for database \"%s\"\n"
+#~ msgstr "%s: nelze zpracovat ACL seznam (%s) pro databázi \"%s\"\n"
+
+#~ msgid "worker process crashed: status %d\n"
+#~ msgstr "worker proces selhal: status %d\n"
+
+#~ msgid "parallel_restore should not return\n"
+#~ msgstr "parallel_restore by neměl skončit\n"
+
+#~ msgid "could not create worker thread: %s\n"
+#~ msgstr "nelze vytvořit worker thread: %s\n"
+
+#~ msgid "could not parse version string \"%s\"\n"
+#~ msgstr "neplatný formát řetězce s verzí \"%s\"\n"
+
+#~ msgid "%s: could not parse version \"%s\"\n"
+#~ msgstr "%s: nelze zpracovat verzi serveru \"%s\"\n"
+
+#~ msgid "-C and -c are incompatible options\n"
+#~ msgstr "-C a -c jsou nekompatibilní přepínače\n"
+
+#~ msgid "invalid COPY statement -- could not find \"copy\" in string \"%s\"\n"
+#~ msgstr "neplatný COPY příkaz -- nelze najít \"copy\" v řetězci \"%s\"\n"
+
+#~ msgid "invalid COPY statement -- could not find \"from stdin\" in string \"%s\" starting at position %lu\n"
+#~ msgstr "neplatný COPY příkaz -- nelze najít \"from stdin\" v řetězci \"%s\" začínající na pozici %lu\n"
+
+#~ msgid "cannot create directory %s, it exists already\n"
+#~ msgstr "nelze vytvořit adresář %s, již existuje\n"
+
+#~ msgid "cannot create directory %s, a file with this name exists already\n"
+#~ msgstr "nelze vytvořit adresář %s, soubor s tímto jménem již existuje\n"
+
+#~ msgid "path name too long: %s"
+#~ msgstr "cesta příliš dlouhá: %s"
+
+#~ msgid "restoring large object OID %u\n"
+#~ msgstr "obnovuji \"large object\" s OID %u\n"
+
+#~ msgid "options -s/--schema-only and -a/--data-only cannot be used with --section\n"
+#~ msgstr "volby -s/--schema-only a -a/--data-only nelze použít s --section\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help ukáže tento text a skončí\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version ukáže informace o verzi a skončí\n"
+
+#~ msgid "%s: options -s/--schema-only and -a/--data-only cannot be used with --section\n"
+#~ msgstr "%s: volby -s/--schema-only a -a/--data-only nelze použít s --section\n"
+
+#~ msgid " -c, --clean clean (drop) database objects before recreating\n"
+#~ msgstr " -c, --clean odstranit (drop) databázi před jejím vytvořením\n"
+
+#~ msgid " -O, --no-owner skip restoration of object ownership\n"
+#~ msgstr " -O, --no-owner přeskoč nastavení vlastníka objektů\n"
+
+#~ msgid " --disable-triggers disable triggers during data-only restore\n"
+#~ msgstr " --disable-triggers zakázat volání triggerů během obnovy dat\n"
+
+#~ msgid ""
+#~ " --use-set-session-authorization\n"
+#~ " use SET SESSION AUTHORIZATION commands instead of\n"
+#~ " ALTER OWNER commands to set ownership\n"
+#~ msgstr ""
+#~ " --use-set-session-authorization\n"
+#~ " používat příkaz SET SESSION AUTHORIZATION namísto\n"
+#~ " příkazu ALTER OWNER pro nastavení vlastníka\n"
+
+#~ msgid ""
+#~ "The program \"pg_dump\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Program \"pg_dump\" byl nalezen \"%s\",\n"
+#~ "který ale není stejné verze jako %s.\n"
+#~ "Zkontrolujte vaši instalaci."
+
+#~ msgid ""
+#~ "The program \"pg_dump\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Program \"pg_dump\" je potřebný pro %s, ale nebyl nalezen ve stejném\n"
+#~ "adresáři jako \"%s\".\n"
+#~ "Zkontrolujte vaši instalaci."
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Oznámení o chybách zasílejte na <pgsql-bugs@postgresql.org>.\n"
+
+#~ msgid "internal error -- neither th nor fh specified in tarReadRaw()"
+#~ msgstr "interní chyba -- ani th ani fh nespecifikován v tarReadRaw()"
+
+#~ msgid "connection needs password"
+#~ msgstr "spojení vyžaduje heslo"
+
+#~ msgid "could not reconnect to database: %s"
+#~ msgstr "nelze znovu navázat spojení s databází: %s"
+
+#~ msgid "could not reconnect to database"
+#~ msgstr "nelze znovu navázat spojení s databází"
+
+#~ msgid "connecting to database \"%s\" as user \"%s\""
+#~ msgstr "připojuji se k databázi \"%s\" jako uživatel \"%s\""
+
+#~ msgid "ftell mismatch with expected position -- ftell used"
+#~ msgstr "ftell neodpovídá očekávané pozici -- použit ftell"
+
+#~ msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive"
+#~ msgstr "v archivu nelze najít blok ID %d -- možná kvůli out-of-order restore požadavku, který nemohl být vyřízen kvůli chybějícím datovým offsetům v archivu"
diff --git a/src/bin/pg_dump/po/de.po b/src/bin/pg_dump/po/de.po
new file mode 100644
index 0000000..3bef0da
--- /dev/null
+++ b/src/bin/pg_dump/po/de.po
@@ -0,0 +1,2644 @@
+# German message translation file for pg_dump and friends
+# Peter Eisentraut <peter@eisentraut.org>, 2001 - 2022.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 15:05+0000\n"
+"PO-Revision-Date: 2023-04-16 11:06+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "konnte aktuelles Verzeichnis nicht ermitteln: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "ungültige Programmdatei »%s«"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "konnte Programmdatei »%s« nicht lesen"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "konnte kein »%s« zum Ausführen finden"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "konnte nicht in Verzeichnis »%s« wechseln: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m"
+
+#: ../../common/exec.c:422 parallel.c:1611
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() fehlgeschlagen: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "Speicher aufgebraucht"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "Befehl ist nicht ausführbar"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "Befehl nicht gefunden"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "Kindprozess hat mit Code %d beendet"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "Kindprozess wurde durch Ausnahme 0x%X beendet"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "Kindprozess wurde von Signal %d beendet: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "Kindprozess hat mit unbekanntem Status %d beendet"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ungültiger Wert »%s« für Option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s muss im Bereich %d..%d sein"
+
+#: common.c:134
+#, c-format
+msgid "reading extensions"
+msgstr "lese Erweiterungen"
+
+#: common.c:137
+#, c-format
+msgid "identifying extension members"
+msgstr "identifiziere Erweiterungselemente"
+
+#: common.c:140
+#, c-format
+msgid "reading schemas"
+msgstr "lese Schemas"
+
+#: common.c:149
+#, c-format
+msgid "reading user-defined tables"
+msgstr "lese benutzerdefinierte Tabellen"
+
+#: common.c:154
+#, c-format
+msgid "reading user-defined functions"
+msgstr "lese benutzerdefinierte Funktionen"
+
+#: common.c:158
+#, c-format
+msgid "reading user-defined types"
+msgstr "lese benutzerdefinierte Typen"
+
+#: common.c:162
+#, c-format
+msgid "reading procedural languages"
+msgstr "lese prozedurale Sprachen"
+
+#: common.c:165
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "lese benutzerdefinierte Aggregatfunktionen"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined operators"
+msgstr "lese benutzerdefinierte Operatoren"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "lese benutzerdefinierte Zugriffsmethoden"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "lese benutzerdefinierte Operatorklassen"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "lese benutzerdefinierte Operatorfamilien"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "lese benutzerdefinierte Textsuche-Parser"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "lese benutzerdefinierte Textsuche-Templates"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "lese benutzerdefinierte Textsuchewörterbücher"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "lese benutzerdefinierte Textsuchekonfigurationen"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "lese benutzerdefinierte Fremddaten-Wrapper"
+
+#: common.c:195
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "lese benutzerdefinierte Fremdserver"
+
+#: common.c:198
+#, c-format
+msgid "reading default privileges"
+msgstr "lese Vorgabeprivilegien"
+
+#: common.c:201
+#, c-format
+msgid "reading user-defined collations"
+msgstr "lese benutzerdefinierte Sortierfolgen"
+
+#: common.c:204
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "lese benutzerdefinierte Konversionen"
+
+#: common.c:207
+#, c-format
+msgid "reading type casts"
+msgstr "lese Typumwandlungen"
+
+#: common.c:210
+#, c-format
+msgid "reading transforms"
+msgstr "lese Transformationen"
+
+#: common.c:213
+#, c-format
+msgid "reading table inheritance information"
+msgstr "lese Tabellenvererbungsinformationen"
+
+#: common.c:216
+#, c-format
+msgid "reading event triggers"
+msgstr "lese Ereignistrigger"
+
+#: common.c:220
+#, c-format
+msgid "finding extension tables"
+msgstr "finde Erweiterungstabellen"
+
+#: common.c:224
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "finde Vererbungsbeziehungen"
+
+#: common.c:227
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "lese Spalteninfo für interessante Tabellen"
+
+#: common.c:230
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "markiere vererbte Spalten in abgeleiteten Tabellen"
+
+#: common.c:233
+#, c-format
+msgid "reading partitioning data"
+msgstr "lese Partitionierungsdaten"
+
+#: common.c:236
+#, c-format
+msgid "reading indexes"
+msgstr "lese Indexe"
+
+#: common.c:239
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "markiere Indexe in partitionierten Tabellen"
+
+#: common.c:242
+#, c-format
+msgid "reading extended statistics"
+msgstr "lese erweiterte Statistiken"
+
+#: common.c:245
+#, c-format
+msgid "reading constraints"
+msgstr "lese Constraints"
+
+#: common.c:248
+#, c-format
+msgid "reading triggers"
+msgstr "lese Trigger"
+
+#: common.c:251
+#, c-format
+msgid "reading rewrite rules"
+msgstr "lese Umschreiberegeln"
+
+#: common.c:254
+#, c-format
+msgid "reading policies"
+msgstr "lese Policies"
+
+#: common.c:257
+#, c-format
+msgid "reading publications"
+msgstr "lese Publikationen"
+
+#: common.c:260
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "lese Publikationsmitgliedschaft von Tabellen"
+
+#: common.c:263
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "lese Publikationsmitgliedschaft von Schemas"
+
+#: common.c:266
+#, c-format
+msgid "reading subscriptions"
+msgstr "lese Subskriptionen"
+
+#: common.c:345
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "ungültige Anzahl Eltern %d für Tabelle »%s«"
+
+#: common.c:1006
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "Sanity-Check fehlgeschlagen, Eltern-OID %u von Tabelle »%s« (OID %u) nicht gefunden"
+
+#: common.c:1045
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "konnte numerisches Array »%s« nicht parsen: zu viele Zahlen"
+
+#: common.c:1057
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "konnte numerisches Array »%s« nicht parsen: ungültiges Zeichen in Zahl"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "ungültiger Komprimierungscode: %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504
+#: compress_io.c:547
+#, c-format
+msgid "not built with zlib support"
+msgstr "nicht mit zlib-Unterstützung gebaut"
+
+#: compress_io.c:236 compress_io.c:333
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "konnte Komprimierungsbibliothek nicht initialisieren: %s"
+
+#: compress_io.c:256
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "konnte Komprimierungsstrom nicht schließen: %s"
+
+#: compress_io.c:273
+#, c-format
+msgid "could not compress data: %s"
+msgstr "konnte Daten nicht komprimieren: %s"
+
+#: compress_io.c:349 compress_io.c:364
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "konnte Daten nicht dekomprimieren: %s"
+
+#: compress_io.c:371
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "konnte Komprimierungsbibliothek nicht schließen: %s"
+
+#: compress_io.c:584 compress_io.c:621
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "konnte nicht aus Eingabedatei lesen: %s"
+
+#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553
+#: pg_backup_tar.c:726 pg_backup_tar.c:749
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "konnte nicht aus Eingabedatei lesen: Dateiende"
+
+#: parallel.c:253
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() fehlgeschlagen: Fehlercode %d"
+
+#: parallel.c:961
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "konnte Kommunikationskanäle nicht erzeugen: %m"
+
+#: parallel.c:1018
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "konnte Arbeitsprozess nicht erzeugen: %m"
+
+#: parallel.c:1148
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "unbekannter Befehl vom Leader-Prozess empfangen: »%s«"
+
+#: parallel.c:1191 parallel.c:1429
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "ungültige Nachricht vom Arbeitsprozess empfangen: »%s«"
+
+#: parallel.c:1323
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"konnte Sperre für Relation »%s« nicht setzen\n"
+"Das bedeutet meistens, dass jemand eine ACCESS-EXCLUSIVE-Sperre auf die Tabelle gesetzt hat, nachdem der pg-dump-Elternprozess die anfängliche ACCESS-SHARE-Sperre gesetzt hatte."
+
+#: parallel.c:1412
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "ein Arbeitsprozess endete unerwartet"
+
+#: parallel.c:1534 parallel.c:1652
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "konnte nicht in den Kommunikationskanal schreiben: %m"
+
+#: parallel.c:1736
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: konnte Socket nicht erzeugen: Fehlercode %d"
+
+#: parallel.c:1747
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: konnte nicht binden: Fehlercode %d"
+
+#: parallel.c:1754
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: konnte nicht auf Socket hören: Fehlercode %d"
+
+#: parallel.c:1761
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s() fehlgeschlagen: Fehlercode %d"
+
+#: parallel.c:1772
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: konnte zweites Socket nicht erzeugen: Fehlercode %d"
+
+#: parallel.c:1781
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: konnte Socket nicht verbinden: Fehlercode %d"
+
+#: parallel.c:1790
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: konnte Verbindung nicht annehmen: Fehlercode %d"
+
+#: pg_backup_archiver.c:280 pg_backup_archiver.c:1632
+#, c-format
+msgid "could not close output file: %m"
+msgstr "konnte Ausgabedatei nicht schließen: %m"
+
+#: pg_backup_archiver.c:324 pg_backup_archiver.c:328
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "Archivelemente nicht in richtiger Abschnittsreihenfolge"
+
+#: pg_backup_archiver.c:334
+#, c-format
+msgid "unexpected section code %d"
+msgstr "unerwarteter Abschnittscode %d"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "parallele Wiederherstellung wird von diesem Archivdateiformat nicht unterstützt"
+
+#: pg_backup_archiver.c:375
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "parallele Wiederherstellung wird mit Archiven, die mit pg_dump vor 8.0 erstellt worden sind, nicht unterstützt"
+
+#: pg_backup_archiver.c:393
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)"
+msgstr "kann komprimiertes Archiv nicht wiederherstellen (Komprimierung in dieser Installation nicht unterstützt)"
+
+#: pg_backup_archiver.c:410
+#, c-format
+msgid "connecting to database for restore"
+msgstr "verbinde mit der Datenbank zur Wiederherstellung"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "direkte Datenbankverbindungen sind in Archiven vor Version 1.3 nicht unterstützt"
+
+#: pg_backup_archiver.c:455
+#, c-format
+msgid "implied data-only restore"
+msgstr "implizit werden nur Daten wiederhergestellt"
+
+#: pg_backup_archiver.c:521
+#, c-format
+msgid "dropping %s %s"
+msgstr "entferne %s %s"
+
+#: pg_backup_archiver.c:621
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "konnte nicht bestimmen, wo IF EXISTS in die Anweisung »%s« eingefügt werden soll"
+
+#: pg_backup_archiver.c:777 pg_backup_archiver.c:779
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "Warnung aus der ursprünglichen Ausgabedatei: %s"
+
+#: pg_backup_archiver.c:794
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "erstelle %s »%s.%s«"
+
+#: pg_backup_archiver.c:797
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "erstelle %s »%s«"
+
+#: pg_backup_archiver.c:847
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "verbinde mit neuer Datenbank »%s«"
+
+#: pg_backup_archiver.c:874
+#, c-format
+msgid "processing %s"
+msgstr "verarbeite %s"
+
+#: pg_backup_archiver.c:896
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "verarbeite Daten für Tabelle »%s.%s«"
+
+#: pg_backup_archiver.c:966
+#, c-format
+msgid "executing %s %s"
+msgstr "führe %s %s aus"
+
+#: pg_backup_archiver.c:1005
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "schalte Trigger für %s aus"
+
+#: pg_backup_archiver.c:1031
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "schalte Trigger für %s ein"
+
+#: pg_backup_archiver.c:1096
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "interner Fehler -- WriteData kann nicht außerhalb des Kontexts einer DataDumper-Routine aufgerufen werden"
+
+#: pg_backup_archiver.c:1279
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "Large-Object-Ausgabe im gewählten Format nicht unterstützt"
+
+#: pg_backup_archiver.c:1337
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "%d Large Object wiederhergestellt"
+msgstr[1] "%d Large Objects wiederhergestellt"
+
+#: pg_backup_archiver.c:1358 pg_backup_tar.c:669
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "Wiederherstellung von Large Object mit OID %u"
+
+#: pg_backup_archiver.c:1370
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "konnte Large Object %u nicht erstellen: %s"
+
+#: pg_backup_archiver.c:1375 pg_dump.c:3607
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "konnte Large Object %u nicht öffnen: %s"
+
+#: pg_backup_archiver.c:1431
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "konnte Inhaltsverzeichnisdatei »%s« nicht öffnen: %m"
+
+#: pg_backup_archiver.c:1459
+#, c-format
+msgid "line ignored: %s"
+msgstr "Zeile ignoriert: %s"
+
+#: pg_backup_archiver.c:1466
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "konnte Eintrag für ID %d nicht finden"
+
+#: pg_backup_archiver.c:1489 pg_backup_directory.c:222
+#: pg_backup_directory.c:599
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "konnte Inhaltsverzeichnisdatei nicht schließen: %m"
+
+#: pg_backup_archiver.c:1603 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:586 pg_backup_directory.c:649
+#: pg_backup_directory.c:668 pg_dumpall.c:476
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "konnte Ausgabedatei »%s« nicht öffnen: %m"
+
+#: pg_backup_archiver.c:1605 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "konnte Ausgabedatei nicht öffnen: %m"
+
+#: pg_backup_archiver.c:1699
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "%zu Byte Large-Object-Daten geschrieben (Ergebnis = %d)"
+msgstr[1] "%zu Bytes Large-Object-Daten geschrieben (Ergebnis = %d)"
+
+#: pg_backup_archiver.c:1705
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "konnte Large Object nicht schreiben: %s"
+
+#: pg_backup_archiver.c:1795
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "in Phase INITIALIZING:"
+
+#: pg_backup_archiver.c:1800
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "in Phase PROCESSING TOC:"
+
+#: pg_backup_archiver.c:1805
+#, c-format
+msgid "while FINALIZING:"
+msgstr "in Phase FINALIZING:"
+
+#: pg_backup_archiver.c:1810
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "in Inhaltsverzeichniseintrag %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1886
+#, c-format
+msgid "bad dumpId"
+msgstr "ungültige DumpId"
+
+#: pg_backup_archiver.c:1907
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "ungültige Tabellen-DumpId für »TABLE DATA«-Eintrag"
+
+#: pg_backup_archiver.c:1999
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "unerwartete Datenoffsetmarkierung %d"
+
+#: pg_backup_archiver.c:2012
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "Dateioffset in Dumpdatei ist zu groß"
+
+#: pg_backup_archiver.c:2150 pg_backup_archiver.c:2160
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "Verzeichnisname zu lang: »%s«"
+
+#: pg_backup_archiver.c:2168
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "Verzeichnis »%s« scheint kein gültiges Archiv zu sein (»toc.dat« existiert nicht)"
+
+#: pg_backup_archiver.c:2176 pg_backup_custom.c:173 pg_backup_custom.c:807
+#: pg_backup_directory.c:207 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "konnte Eingabedatei »%s« nicht öffnen: %m"
+
+#: pg_backup_archiver.c:2183 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "konnte Eingabedatei nicht öffnen: %m"
+
+#: pg_backup_archiver.c:2189
+#, c-format
+msgid "could not read input file: %m"
+msgstr "konnte Eingabedatei nicht lesen: %m"
+
+#: pg_backup_archiver.c:2191
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "Eingabedatei ist zu kurz (gelesen: %lu, erwartet: 5)"
+
+#: pg_backup_archiver.c:2223
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "Eingabedatei ist anscheinend ein Dump im Textformat. Bitte verwenden Sie psql."
+
+#: pg_backup_archiver.c:2229
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "Eingabedatei scheint kein gültiges Archiv zu sein (zu kurz?)"
+
+#: pg_backup_archiver.c:2235
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "Eingabedatei scheint kein gültiges Archiv zu sein"
+
+#: pg_backup_archiver.c:2244
+#, c-format
+msgid "could not close input file: %m"
+msgstr "konnte Eingabedatei nicht schließen: %m"
+
+#: pg_backup_archiver.c:2361
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "nicht erkanntes Dateiformat »%d«"
+
+#: pg_backup_archiver.c:2443 pg_backup_archiver.c:4523
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "Element %d %s %s abgeschlossen"
+
+#: pg_backup_archiver.c:2447 pg_backup_archiver.c:4536
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "Arbeitsprozess fehlgeschlagen: Code %d"
+
+#: pg_backup_archiver.c:2568
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "ID %d des Eintrags außerhalb des gültigen Bereichs -- vielleicht ein verfälschtes Inhaltsverzeichnis"
+
+#: pg_backup_archiver.c:2648
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "Wiederherstellung von Tabellen mit WITH OIDS wird nicht mehr unterstützt"
+
+#: pg_backup_archiver.c:2730
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "nicht erkannte Kodierung »%s«"
+
+#: pg_backup_archiver.c:2735
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "ungültiger ENCODING-Eintrag: %s"
+
+#: pg_backup_archiver.c:2753
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "ungültiger STDSTRINGS-Eintrag: %s"
+
+#: pg_backup_archiver.c:2778
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "Schema »%s« nicht gefunden"
+
+#: pg_backup_archiver.c:2785
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "Tabelle »%s« nicht gefunden"
+
+#: pg_backup_archiver.c:2792
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "Index »%s« nicht gefunden"
+
+#: pg_backup_archiver.c:2799
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "Funktion »%s« nicht gefunden"
+
+#: pg_backup_archiver.c:2806
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "Trigger »%s« nicht gefunden"
+
+#: pg_backup_archiver.c:3221
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "konnte Sitzungsbenutzer nicht auf »%s« setzen: %s"
+
+#: pg_backup_archiver.c:3358
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "konnte search_path nicht auf »%s« setzen: %s"
+
+#: pg_backup_archiver.c:3420
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "konnte default_tablespace nicht auf »%s« setzen: %s"
+
+#: pg_backup_archiver.c:3470
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "konnte default_table_access_method nicht setzen: %s"
+
+#: pg_backup_archiver.c:3564 pg_backup_archiver.c:3729
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "kann Eigentümer für Objekttyp »%s« nicht setzen"
+
+#: pg_backup_archiver.c:3832
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "magische Zeichenkette im Dateikopf nicht gefunden"
+
+#: pg_backup_archiver.c:3846
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "nicht unterstützte Version (%d.%d) im Dateikopf"
+
+#: pg_backup_archiver.c:3851
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "Prüfung der Integer-Größe (%lu) fehlgeschlagen"
+
+#: pg_backup_archiver.c:3855
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "Archiv wurde auf einer Maschine mit größeren Integers erstellt; einige Operationen könnten fehlschlagen"
+
+#: pg_backup_archiver.c:3865
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "erwartetes Format (%d) ist nicht das gleiche wie das in der Datei gefundene (%d)"
+
+#: pg_backup_archiver.c:3880
+#, c-format
+msgid "archive is compressed, but this installation does not support compression -- no data will be available"
+msgstr "Archiv ist komprimiert, aber diese Installation unterstützt keine Komprimierung -- keine Daten verfügbar"
+
+#: pg_backup_archiver.c:3914
+#, c-format
+msgid "invalid creation date in header"
+msgstr "ungültiges Erstellungsdatum im Kopf"
+
+#: pg_backup_archiver.c:4048
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "verarbeite Element %d %s %s"
+
+#: pg_backup_archiver.c:4127
+#, c-format
+msgid "entering main parallel loop"
+msgstr "Eintritt in Hauptparallelschleife"
+
+#: pg_backup_archiver.c:4138
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "Element %d %s %s wird übersprungen"
+
+#: pg_backup_archiver.c:4147
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "starte Element %d %s %s"
+
+#: pg_backup_archiver.c:4201
+#, c-format
+msgid "finished main parallel loop"
+msgstr "Hauptparallelschleife beendet"
+
+#: pg_backup_archiver.c:4237
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "verarbeite verpasstes Element %d %s %s"
+
+#: pg_backup_archiver.c:4842
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "Tabelle »%s« konnte nicht erzeugt werden, ihre Daten werden nicht wiederhergestellt werden"
+
+#: pg_backup_custom.c:376 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "ungültige OID für Large Object"
+
+#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629
+#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021
+#, c-format
+msgid "error during file seek: %m"
+msgstr "Fehler beim Suchen in Datei: %m"
+
+#: pg_backup_custom.c:478
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "Datenblock %d hat falsche Seek-Position"
+
+#: pg_backup_custom.c:495
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "unerkannter Datenblocktyp (%d) beim Suchen im Archiv gefunden"
+
+#: pg_backup_custom.c:517
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "konnte Block-ID %d nicht im Archiv finden -- möglicherweise wegen Wiederherstellung außer der Reihe, was nicht möglich ist, weil die Eingabedatei kein Suchen unterstützt"
+
+#: pg_backup_custom.c:522
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "konnte Block-ID %d nicht im Archiv finden -- möglicherweise beschädigtes Archiv"
+
+#: pg_backup_custom.c:529
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "unerwartete Block-ID (%d) beim Lesen der Daten gefunden -- erwartet wurde %d"
+
+#: pg_backup_custom.c:543
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "unerkannter Datenblocktyp %d beim Wiederherstellen des Archivs gefunden"
+
+#: pg_backup_custom.c:645
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "konnte nicht aus Eingabedatei lesen: %m"
+
+#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943
+#: pg_backup_tar.c:1019
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "konnte Positionszeiger in Archivdatei nicht ermitteln: %m"
+
+#: pg_backup_custom.c:762 pg_backup_custom.c:802
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "konnte Archivdatei nicht schließen: %m"
+
+#: pg_backup_custom.c:785
+#, c-format
+msgid "can only reopen input archives"
+msgstr "nur Eingabearchive können neu geöffnet werden"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "parallele Wiederherstellung aus der Standardeingabe wird nicht unterstützt"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "parallele Wiederherstellung aus einer Datei, die kein Suchen ermöglicht, wird nicht unterstützt"
+
+#: pg_backup_custom.c:810
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "konnte Positionszeiger in Archivdatei nicht setzen: %m"
+
+#: pg_backup_custom.c:889
+#, c-format
+msgid "compressor active"
+msgstr "Kompressor ist aktiv"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "konnte server_version nicht von libpq ermitteln"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1646
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "Abbruch wegen unpassender Serverversion"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1647
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "Version des Servers: %s; Version von %s: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "bereits mit einer Datenbank verbunden"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595
+msgid "Password: "
+msgstr "Passwort: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "konnte nicht mit der Datenbank verbinden"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "Wiederverbindung fehlgeschlagen: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1520 pg_dumpall.c:1604
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732
+#, c-format
+msgid "query failed: %s"
+msgstr "Anfrage fehlgeschlagen: %s"
+
+#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733
+#, c-format
+msgid "Query was: %s"
+msgstr "Anfrage war: %s"
+
+#: pg_backup_db.c:316
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "Anfrage ergab %d Zeile anstatt einer: %s"
+msgstr[1] "Anfrage ergab %d Zeilen anstatt einer: %s"
+
+#: pg_backup_db.c:352
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sDie Anweisung war: %s"
+
+#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489
+msgid "could not execute query"
+msgstr "konnte Anfrage nicht ausführen"
+
+#: pg_backup_db.c:461
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "Fehler in PQputCopyData: %s"
+
+#: pg_backup_db.c:510
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "Fehler in PQputCopyEnd: %s"
+
+#: pg_backup_db.c:516
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY fehlgeschlagen für Tabelle »%s«: %s"
+
+#: pg_backup_db.c:522 pg_dump.c:2106
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "unerwartete zusätzliche Ergebnisse während COPY von Tabelle »%s«"
+
+#: pg_backup_db.c:534
+msgid "could not start database transaction"
+msgstr "konnte Datenbanktransaktion nicht starten"
+
+#: pg_backup_db.c:542
+msgid "could not commit database transaction"
+msgstr "konnte Datenbanktransaktion nicht beenden"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "kein Ausgabeverzeichnis angegeben"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht lesen: %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht schließen: %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m"
+
+#: pg_backup_directory.c:355 pg_backup_directory.c:497
+#: pg_backup_directory.c:533
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "konnte nicht in Ausgabedatei schreiben: %s"
+
+#: pg_backup_directory.c:373
+#, c-format
+msgid "could not close data file: %m"
+msgstr "konnte Datendatei nicht schließen: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "konnte Datendatei »%s« nicht schließen: %m"
+
+#: pg_backup_directory.c:447
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "konnte Large-Object-Inhaltsverzeichnisdatei »%s« nicht zur Eingabe öffnen: %m"
+
+#: pg_backup_directory.c:458
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "ungültige Zeile in Large-Object-Inhaltsverzeichnisdatei »%s«: %s"
+
+#: pg_backup_directory.c:467
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "Fehler beim Lesen von Large-Object-Inhaltsverzeichnisdatei »%s«"
+
+#: pg_backup_directory.c:471
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "konnte Large-Object-Inhaltsverzeichnisdatei »%s« nicht schließen: %m"
+
+#: pg_backup_directory.c:685
+#, c-format
+msgid "could not close blob data file: %m"
+msgstr "konnte BLOB-Datendatei nicht schließen: %m"
+
+#: pg_backup_directory.c:691
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "konnte nicht in Blobs-Inhaltsverzeichnisdatei schreiben"
+
+#: pg_backup_directory.c:705
+#, c-format
+msgid "could not close blobs TOC file: %m"
+msgstr "konnte BLOB-Inhaltsverzeichnisdatei nicht schließen: %m"
+
+#: pg_backup_directory.c:724
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "Dateiname zu lang: »%s«"
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "dieses Format kann nicht gelesen werden"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "konnte Inhaltsverzeichnisdatei »%s« nicht zur Ausgabe öffnen: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "konnte Inhaltsverzeichnisdatei nicht zur Ausgabe öffnen: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:893
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "Komprimierung ist im Tar-Format nicht unterstützt"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "konnte Inhaltsverzeichnisdatei »%s« nicht zur Eingabe öffnen: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "konnte Inhaltsverzeichnisdatei nicht zur Eingabe öffnen: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "konnte Datei »%s« nicht im Archiv finden"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "konnte keine temporären Dateinamen erzeugen: %m"
+
+#: pg_backup_tar.c:624
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "unerwartete Syntax der COPY-Anweisung: »%s«"
+
+#: pg_backup_tar.c:890
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "Large Object hat ungültige OID (%u)"
+
+#: pg_backup_tar.c:1035
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "konnte temporäre Datei nicht schließen: %m"
+
+#: pg_backup_tar.c:1038
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "tatsächliche Dateilänge (%lld) stimmt nicht mit erwarteter Länge (%lld) überein"
+
+#: pg_backup_tar.c:1084 pg_backup_tar.c:1115
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "konnte Kopf für Datei »%s« im Tar-Archiv nicht finden"
+
+#: pg_backup_tar.c:1102
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "Ausgabe der Daten in anderer Reihenfolge wird in diesem Archivformat nicht unterstützt: »%s« wird benötigt, aber es kommt vor »%s« in der Archivdatei."
+
+#: pg_backup_tar.c:1149
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "unvollständiger Tar-Dateikopf gefunden (%lu Byte)"
+msgstr[1] "unvollständiger Tar-Dateikopf gefunden (%lu Bytes)"
+
+#: pg_backup_tar.c:1188
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "beschädigter Tar-Kopf in %s gefunden (%d erwartet, %d berechnet), Dateiposition %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "unbekannter Abschnittsname: »%s«"
+
+#: pg_backup_utils.c:55 pg_dump.c:628 pg_dump.c:645 pg_dumpall.c:340
+#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373
+#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "on_exit_nicely-Slots aufgebraucht"
+
+#: pg_dump.c:643 pg_dumpall.c:348 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_dump.c:662 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "Optionen -s/--schema-only und -a/--data-only können nicht zusammen verwendet werden"
+
+#: pg_dump.c:665
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "Optionen -s/--schema-only und --include-foreign-data können nicht zusammen verwendet werden"
+
+#: pg_dump.c:668
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "Option --include-foreign-data wird nicht mit paralleler Sicherung unterstützt"
+
+#: pg_dump.c:671 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "Optionen -c/--clean und -a/--data-only können nicht zusammen verwendet werden"
+
+#: pg_dump.c:674 pg_dumpall.c:378 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "Option --if-exists benötigt Option -c/--clean"
+
+#: pg_dump.c:681
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "Option --on-conflict-do-nothing benötigt Option --inserts, --rows-per-insert oder --column-inserts"
+
+#: pg_dump.c:703
+#, c-format
+msgid "requested compression not available in this installation -- archive will be uncompressed"
+msgstr "Komprimierung ist in dieser Installation nicht verfügbar -- Archiv wird nicht komprimiert"
+
+#: pg_dump.c:716
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "parallele Sicherung wird nur vom Ausgabeformat »Verzeichnis« unterstützt"
+
+#: pg_dump.c:762
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "letzte eingebaute OID ist %u"
+
+#: pg_dump.c:771
+#, c-format
+msgid "no matching schemas were found"
+msgstr "keine passenden Schemas gefunden"
+
+#: pg_dump.c:785
+#, c-format
+msgid "no matching tables were found"
+msgstr "keine passenden Tabellen gefunden"
+
+#: pg_dump.c:807
+#, c-format
+msgid "no matching extensions were found"
+msgstr "keine passenden Erweiterungen gefunden"
+
+#: pg_dump.c:990
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s gibt eine Datenbank als Textdatei oder in anderen Formaten aus.\n"
+"\n"
+
+#: pg_dump.c:991 pg_dumpall.c:605 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_dump.c:992
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [DBNAME]\n"
+
+#: pg_dump.c:994 pg_dumpall.c:608 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Allgemeine Optionen:\n"
+
+#: pg_dump.c:995
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=DATEINAME Name der Ausgabedatei oder des -verzeichnisses\n"
+
+#: pg_dump.c:996
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p Ausgabeformat (custom, d=Verzeichnis, tar,\n"
+" plain text)\n"
+
+#: pg_dump.c:998
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM so viele parallele Jobs zur Sicherung verwenden\n"
+
+#: pg_dump.c:999 pg_dumpall.c:610
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose »Verbose«-Modus\n"
+
+#: pg_dump.c:1000 pg_dumpall.c:611
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_dump.c:1001
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 Komprimierungsniveau für komprimierte Formate\n"
+
+#: pg_dump.c:1002 pg_dumpall.c:612
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=ZEIT Abbruch nach ZEIT Warten auf Tabellensperre\n"
+
+#: pg_dump.c:1003 pg_dumpall.c:639
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" --no-sync nicht warten, bis Änderungen sicher auf\n"
+" Festplatte geschrieben sind\n"
+
+#: pg_dump.c:1004 pg_dumpall.c:613
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_dump.c:1006 pg_dumpall.c:614
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Optionen die den Inhalt der Ausgabe kontrollieren:\n"
+
+#: pg_dump.c:1007 pg_dumpall.c:615
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only nur Daten ausgeben, nicht das Schema\n"
+
+#: pg_dump.c:1008
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs Large Objects mit ausgeben\n"
+
+#: pg_dump.c:1009
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs Large Objects nicht mit ausgeben\n"
+
+#: pg_dump.c:1010 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean Datenbankobjekte vor der Wiedererstellung löschen\n"
+
+#: pg_dump.c:1011
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr ""
+" -C, --create Anweisungen zum Erstellen der Datenbank in\n"
+" Ausgabe einfügen\n"
+
+#: pg_dump.c:1012
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=MUSTER nur die angegebene(n) Erweiterung(en) ausgeben\n"
+
+#: pg_dump.c:1013 pg_dumpall.c:617
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=KODIERUNG Daten in Kodierung KODIERUNG ausgeben\n"
+
+#: pg_dump.c:1014
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=MUSTER nur das/die angegebene(n) Schema(s) ausgeben\n"
+
+#: pg_dump.c:1015
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=MUSTER das/die angegebene(n) Schema(s) NICHT ausgeben\n"
+
+#: pg_dump.c:1016
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner Wiederherstellung der Objekteigentümerschaft im\n"
+" »plain text«-Format auslassen\n"
+
+#: pg_dump.c:1018 pg_dumpall.c:621
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only nur das Schema, nicht die Daten, ausgeben\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAME Superusername für »plain text«-Format\n"
+
+#: pg_dump.c:1020
+#, c-format
+msgid " -t, --table=PATTERN dump the specified table(s) only\n"
+msgstr " -t, --table=MUSTER nur die angegebene(n) Tabelle(n) ausgeben\n"
+
+#: pg_dump.c:1021
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=MUSTER die angegebene(n) Tabelle(n) NICHT ausgeben\n"
+
+#: pg_dump.c:1022 pg_dumpall.c:624
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges Zugriffsprivilegien (grant/revoke) nicht ausgeben\n"
+
+#: pg_dump.c:1023 pg_dumpall.c:625
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade wird nur von Upgrade-Programmen verwendet\n"
+
+#: pg_dump.c:1024 pg_dumpall.c:626
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr ""
+" --column-inserts Daten als INSERT-Anweisungen mit Spaltennamen\n"
+" ausgeben\n"
+
+#: pg_dump.c:1025 pg_dumpall.c:627
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr ""
+" --disable-dollar-quoting Dollar-Quoting abschalten, normales SQL-Quoting\n"
+" verwenden\n"
+
+#: pg_dump.c:1026 pg_dumpall.c:628 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr ""
+" --disable-triggers Trigger während der Datenwiederherstellung\n"
+" abschalten\n"
+
+#: pg_dump.c:1027
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security Sicherheit auf Zeilenebene einschalten (nur Daten\n"
+" ausgeben, auf die der Benutzer Zugriff hat)\n"
+
+#: pg_dump.c:1029
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=MUSTER Daten der angegebenen Tabelle(n) NICHT ausgeben\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:630
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=ZAHL Einstellung für extra_float_digits\n"
+
+#: pg_dump.c:1031 pg_dumpall.c:631 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists IF EXISTS verwenden, wenn Objekte gelöscht werden\n"
+
+#: pg_dump.c:1032
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=MUSTER\n"
+" Daten von Fremdtabellen auf Fremdservern, die\n"
+" mit MUSTER übereinstimmen, mit sichern\n"
+
+#: pg_dump.c:1035 pg_dumpall.c:632
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts Daten als INSERT-Anweisungen statt COPY ausgeben\n"
+
+#: pg_dump.c:1036 pg_dumpall.c:633
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root Partitionen über die Wurzeltabelle laden\n"
+
+#: pg_dump.c:1037 pg_dumpall.c:634
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments Kommentare nicht ausgeben\n"
+
+#: pg_dump.c:1038 pg_dumpall.c:635
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications Publikationen nicht ausgeben\n"
+
+#: pg_dump.c:1039 pg_dumpall.c:637
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels Security-Label-Zuweisungen nicht ausgeben\n"
+
+#: pg_dump.c:1040 pg_dumpall.c:638
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions Subskriptionen nicht ausgeben\n"
+
+#: pg_dump.c:1041 pg_dumpall.c:640
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method Tabellenzugriffsmethoden nicht ausgeben\n"
+
+#: pg_dump.c:1042 pg_dumpall.c:641
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces Tablespace-Zuordnungen nicht ausgeben\n"
+
+#: pg_dump.c:1043 pg_dumpall.c:642
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression TOAST-Komprimierungsmethoden nicht ausgeben\n"
+
+#: pg_dump.c:1044 pg_dumpall.c:643
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data Daten in ungeloggten Tabellen nicht ausgeben\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:644
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing INSERT-Befehle mit ON CONFLICT DO NOTHING ausgeben\n"
+
+#: pg_dump.c:1046 pg_dumpall.c:645
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr ""
+" --quote-all-identifiers alle Bezeichner in Anführungszeichen, selbst wenn\n"
+" kein Schlüsselwort\n"
+
+#: pg_dump.c:1047 pg_dumpall.c:646
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=ANZAHL Anzahl Zeilen pro INSERT; impliziert --inserts\n"
+
+#: pg_dump.c:1048
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=ABSCHNITT angegebenen Abschnitt ausgeben (pre-data, data\n"
+" oder post-data)\n"
+
+#: pg_dump.c:1049
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable warten bis der Dump ohne Anomalien laufen kann\n"
+
+#: pg_dump.c:1050
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT angegebenen Snapshot für den Dump verwenden\n"
+
+#: pg_dump.c:1051 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names Tabellen- oder Schemamuster müssen auf mindestens\n"
+" je ein Objekt passen\n"
+
+#: pg_dump.c:1053 pg_dumpall.c:647 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" SET SESSION AUTHORIZATION Befehle statt ALTER\n"
+" OWNER Befehle verwenden, um Eigentümerschaft zu\n"
+" setzen\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:651 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Verbindungsoptionen:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=DBNAME auszugebende Datenbank\n"
+
+#: pg_dump.c:1059 pg_dumpall.c:653 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:655 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT Portnummer des Datenbankservers\n"
+
+#: pg_dump.c:1061 pg_dumpall.c:656 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME Datenbankbenutzername\n"
+
+#: pg_dump.c:1062 pg_dumpall.c:657 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password niemals nach Passwort fragen\n"
+
+#: pg_dump.c:1063 pg_dumpall.c:658 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password nach Passwort fragen (sollte automatisch geschehen)\n"
+
+#: pg_dump.c:1064 pg_dumpall.c:659
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLLENNAME vor der Ausgabe SET ROLE ausführen\n"
+
+#: pg_dump.c:1066
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Wenn kein Datenbankname angegeben wird, dann wird die Umgebungsvariable\n"
+"PGDATABASE verwendet.\n"
+"\n"
+
+#: pg_dump.c:1068 pg_dumpall.c:663 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Berichten Sie Fehler an <%s>.\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:664 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_dump.c:1088 pg_dumpall.c:488
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "ungültige Clientkodierung »%s« angegeben"
+
+#: pg_dump.c:1226
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "parallele Dumps von Standby-Servern werden von dieser Serverversion nicht unterstützt"
+
+#: pg_dump.c:1291
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "ungültiges Ausgabeformat »%s« angegeben"
+
+#: pg_dump.c:1332 pg_dump.c:1388 pg_dump.c:1441 pg_dumpall.c:1282
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "falscher qualifizierter Name (zu viele Namensteile): %s"
+
+#: pg_dump.c:1340
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "keine passenden Schemas für Muster »%s« gefunden"
+
+#: pg_dump.c:1393
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "keine passenden Erweiterungen für Muster »%s« gefunden"
+
+#: pg_dump.c:1446
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "keine passenden Fremdserver für Muster »%s« gefunden"
+
+#: pg_dump.c:1509
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "falscher Relationsname (zu viele Namensteile): %s"
+
+#: pg_dump.c:1520
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "keine passenden Tabellen für Muster »%s« gefunden"
+
+#: pg_dump.c:1547
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Sie sind gegenwärtig nicht mit einer Datenbank verbunden."
+
+#: pg_dump.c:1550
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "Verweise auf andere Datenbanken sind nicht implementiert: %s"
+
+#: pg_dump.c:1981
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "gebe Inhalt der Tabelle »%s.%s« aus"
+
+#: pg_dump.c:2087
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Ausgabe des Inhalts der Tabelle »%s« fehlgeschlagen: PQgetCopyData() fehlgeschlagen."
+
+#: pg_dump.c:2088 pg_dump.c:2098
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Fehlermeldung vom Server: %s"
+
+#: pg_dump.c:2089 pg_dump.c:2099
+#, c-format
+msgid "Command was: %s"
+msgstr "Die Anweisung war: %s"
+
+#: pg_dump.c:2097
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Ausgabe des Inhalts der Tabelle »%s« fehlgeschlagen: PQgetResult() fehlgeschlagen."
+
+#: pg_dump.c:2179
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "falsche Anzahl Felder von Tabelle »%s« erhalten"
+
+#: pg_dump.c:2875
+#, c-format
+msgid "saving database definition"
+msgstr "sichere Datenbankdefinition"
+
+#: pg_dump.c:2971
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "unbekannter Locale-Provider: %s"
+
+#: pg_dump.c:3317
+#, c-format
+msgid "saving encoding = %s"
+msgstr "sichere Kodierung = %s"
+
+#: pg_dump.c:3342
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "sichere standard_conforming_strings = %s"
+
+#: pg_dump.c:3381
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "konnte Ergebnis von current_schemas() nicht interpretieren"
+
+#: pg_dump.c:3400
+#, c-format
+msgid "saving search_path = %s"
+msgstr "sichere search_path = %s"
+
+#: pg_dump.c:3438
+#, c-format
+msgid "reading large objects"
+msgstr "lese Large Objects"
+
+#: pg_dump.c:3576
+#, c-format
+msgid "saving large objects"
+msgstr "sichere Large Objects"
+
+#: pg_dump.c:3617
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "Fehler beim Lesen von Large Object %u: %s"
+
+#: pg_dump.c:3723
+#, c-format
+msgid "reading row-level security policies"
+msgstr "lese Policys für Sicherheit auf Zeilenebene"
+
+#: pg_dump.c:3864
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "unerwarteter Policy-Befehlstyp: %c"
+
+#: pg_dump.c:4314 pg_dump.c:4632 pg_dump.c:11835 pg_dump.c:17724
+#: pg_dump.c:17726 pg_dump.c:18347
+#, c-format
+msgid "could not parse %s array"
+msgstr "konnte %s-Array nicht interpretieren"
+
+#: pg_dump.c:4500
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "Subskriptionen werden nicht ausgegeben, weil der aktuelle Benutzer kein Superuser ist"
+
+#: pg_dump.c:5014
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "konnte Erweiterung, zu der %s %s gehört, nicht finden"
+
+#: pg_dump.c:5159
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "Schema mit OID %u existiert nicht"
+
+#: pg_dump.c:6615 pg_dump.c:16988
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "Sanity-Check fehlgeschlagen, Elterntabelle mit OID %u von Sequenz mit OID %u nicht gefunden"
+
+#: pg_dump.c:6758
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "Sanity-Check fehlgeschlagen, Tabellen-OID %u, die in pg_partitioned_table erscheint, nicht gefunden"
+
+#: pg_dump.c:6989 pg_dump.c:7256 pg_dump.c:7727 pg_dump.c:8394 pg_dump.c:8515
+#: pg_dump.c:8669
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "unbekannte Tabellen-OID %u"
+
+#: pg_dump.c:6993
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "unerwartete Indexdaten für Tabelle »%s«"
+
+#: pg_dump.c:7488
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "Sanity-Check fehlgeschlagen, Elterntabelle mit OID %u von pg_rewrite-Eintrag mit OID %u nicht gefunden"
+
+#: pg_dump.c:7779
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "Anfrage ergab NULL als Name der Tabelle auf die sich Fremdschlüssel-Trigger »%s« von Tabelle »%s« bezieht (OID der Tabelle: %u)"
+
+#: pg_dump.c:8398
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "unerwartete Spaltendaten für Tabelle »%s«"
+
+#: pg_dump.c:8428
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "ungültige Spaltennummerierung in Tabelle »%s«"
+
+#: pg_dump.c:8477
+#, c-format
+msgid "finding table default expressions"
+msgstr "finde Tabellenvorgabeausdrücke"
+
+#: pg_dump.c:8519
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "ungültiger adnum-Wert %d für Tabelle »%s«"
+
+#: pg_dump.c:8619
+#, c-format
+msgid "finding table check constraints"
+msgstr "finde Tabellen-Check-Constraints"
+
+#: pg_dump.c:8673
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "%d Check-Constraint für Tabelle %s erwartet, aber %d gefunden"
+msgstr[1] "%d Check-Constraints für Tabelle %s erwartet, aber %d gefunden"
+
+#: pg_dump.c:8677
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "Die Systemkataloge sind wahrscheinlich verfälscht."
+
+#: pg_dump.c:9367
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "Rolle mit OID %u existiert nicht"
+
+#: pg_dump.c:9479 pg_dump.c:9508
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "nicht unterstützter pg_init_privs-Eintrag: %u %u %d"
+
+#: pg_dump.c:10329
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "typtype des Datentypen »%s« scheint ungültig zu sein"
+
+#: pg_dump.c:11904
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "ungültiger provolatile-Wert für Funktion »%s«"
+
+#: pg_dump.c:11954 pg_dump.c:13817
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "ungültiger proparallel-Wert für Funktion »%s«"
+
+#: pg_dump.c:12086 pg_dump.c:12192 pg_dump.c:12199
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "konnte Funktionsdefinition für Funktion mit OID %u nicht finden"
+
+#: pg_dump.c:12125
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "unsinniger Wert in Feld pg_cast.castfunc oder pg_cast.castmethod"
+
+#: pg_dump.c:12128
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "unsinniger Wert in Feld pg_cast.castmethod"
+
+#: pg_dump.c:12218
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "unsinnige Transformationsdefinition, mindestens eins von trffromsql und trftosql sollte nicht null sein"
+
+#: pg_dump.c:12235
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "unsinniger Wert in Feld pg_transform.trffromsql"
+
+#: pg_dump.c:12256
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "unsinniger Wert in Feld pg_transform.trftosql"
+
+#: pg_dump.c:12401
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "Postfix-Operatoren werden nicht mehr unterstützt (Operator »%s«)"
+
+#: pg_dump.c:12571
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "konnte Operator mit OID %s nicht finden"
+
+#: pg_dump.c:12639
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "ungültiger Typ »%c« für Zugriffsmethode »%s«"
+
+#: pg_dump.c:13293 pg_dump.c:13346
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "unbekannter Sortierfolgen-Provider: %s"
+
+#: pg_dump.c:13302 pg_dump.c:13311 pg_dump.c:13321 pg_dump.c:13330
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "ungültige Sortierfolge »%s«"
+
+#: pg_dump.c:13736
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "unbekannter aggfinalmodify-Wert für Aggregat »%s«"
+
+#: pg_dump.c:13792
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "unbekannter aggmfinalmodify-Wert für Aggregat »%s«"
+
+#: pg_dump.c:14510
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "unbekannter Objekttyp in den Vorgabeprivilegien: %d"
+
+#: pg_dump.c:14526
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "konnte Vorgabe-ACL-Liste (%s) nicht interpretieren"
+
+#: pg_dump.c:14608
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "konnte initiale ACL-Liste (%s) oder Default (%s) für Objekt »%s« (%s) nicht interpretieren"
+
+#: pg_dump.c:14633
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "konnte ACL-Liste (%s) oder Default (%s) für Objekt »%s« (%s) nicht interpretieren"
+
+#: pg_dump.c:15171
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "Anfrage um die Definition der Sicht »%s« zu ermitteln lieferte keine Daten"
+
+#: pg_dump.c:15174
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "Anfrage um die Definition der Sicht »%s« zu ermitteln lieferte mehr als eine Definition"
+
+#: pg_dump.c:15181
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "Definition der Sicht »%s« scheint leer zu sein (Länge null)"
+
+#: pg_dump.c:15265
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS wird nicht mehr unterstützt (Tabelle »%s«)"
+
+#: pg_dump.c:16194
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "ungültige Spaltennummer %d in Tabelle »%s«"
+
+#: pg_dump.c:16272
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "konnte Indexstatistikspalten nicht interpretieren"
+
+#: pg_dump.c:16274
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "konnte Indexstatistikwerte nicht interpretieren"
+
+#: pg_dump.c:16276
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "Anzahl Spalten und Werte für Indexstatistiken stimmt nicht überein"
+
+#: pg_dump.c:16494
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "fehlender Index für Constraint »%s«"
+
+#: pg_dump.c:16722
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "unbekannter Constraint-Typ: %c"
+
+#: pg_dump.c:16823 pg_dump.c:17052
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "Anfrage nach Daten der Sequenz %s ergab %d Zeile (erwartete 1)"
+msgstr[1] "Anfrage nach Daten der Sequenz %s ergab %d Zeilen (erwartete 1)"
+
+#: pg_dump.c:16855
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "unbekannter Sequenztyp: %s"
+
+#: pg_dump.c:17144
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "unerwarteter tgtype-Wert: %d"
+
+#: pg_dump.c:17216
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "fehlerhafte Argumentzeichenkette (%s) für Trigger »%s« von Tabelle »%s«"
+
+#: pg_dump.c:17485
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "Anfrage nach Regel »%s« der Tabelle »%s« fehlgeschlagen: falsche Anzahl Zeilen zurückgegeben"
+
+#: pg_dump.c:17638
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "konnte referenzierte Erweiterung %u nicht finden"
+
+#: pg_dump.c:17728
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "Anzahl Konfigurationen und Bedingungen für Erweiterung stimmt nicht überein"
+
+#: pg_dump.c:17860
+#, c-format
+msgid "reading dependency data"
+msgstr "lese Abhängigkeitsdaten"
+
+#: pg_dump.c:17946
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "kein referenzierendes Objekt %u %u"
+
+#: pg_dump.c:17957
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "kein referenziertes Objekt %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "ungültige dumpId %d"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "ungültige Abhängigkeit %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "konnte Abhängigkeitsschleife nicht bestimmen"
+
+#: pg_dump_sort.c:1276
+#, c-format
+msgid "there are circular foreign-key constraints on this table:"
+msgid_plural "there are circular foreign-key constraints among these tables:"
+msgstr[0] "Es gibt zirkuläre Fremdschlüssel-Constraints für diese Tabelle:"
+msgstr[1] "Es gibt zirkuläre Fremdschlüssel-Constraints zwischen diesen Tabellen:"
+
+#: pg_dump_sort.c:1281
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "Möglicherweise kann der Dump nur wiederhergestellt werden, wenn --disable-triggers verwendet wird oder die Constraints vorübergehend entfernt werden."
+
+#: pg_dump_sort.c:1282
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "Führen Sie einen vollen Dump statt eines Dumps mit --data-only durch, um dieses Problem zu vermeiden."
+
+#: pg_dump_sort.c:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "konnte Abhängigkeitsschleife zwischen diesen Elementen nicht auflösen:"
+
+#: pg_dumpall.c:205
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden"
+
+#: pg_dumpall.c:208
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s"
+
+#: pg_dumpall.c:357
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "Option --exclude-database kann nicht zusammen mit -g/--globals-only, -r/--roles-only oder -t/--tablesspaces-only verwendet werden"
+
+#: pg_dumpall.c:365
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "Optionen -g/--globals-only und -r/--roles-only können nicht zusammen verwendet werden"
+
+#: pg_dumpall.c:372
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "Optionen -g/--globals-only und -t/--tablespaces-only können nicht zusammen verwendet werden"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "Optionen -r/--roles-only und -t/--tablespaces-only können nicht zusammen verwendet werden"
+
+#: pg_dumpall.c:444 pg_dumpall.c:1587
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "konnte nicht mit der Datenbank »%s« verbinden"
+
+#: pg_dumpall.c:456
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"konnte nicht mit Datenbank »postgres« oder »template1« verbinden\n"
+"Bitte geben Sie eine alternative Datenbank an."
+
+#: pg_dumpall.c:604
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s gibt einen PostgreSQL-Datenbankcluster in eine SQL-Skriptdatei aus.\n"
+"\n"
+
+#: pg_dumpall.c:606
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_dumpall.c:609
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=DATEINAME Name der Ausgabedatei\n"
+
+#: pg_dumpall.c:616
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean Datenbanken vor der Wiedererstellung löschen\n"
+
+#: pg_dumpall.c:618
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only nur globale Objekte ausgeben, keine Datenbanken\n"
+
+#: pg_dumpall.c:619 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr ""
+" -O, --no-owner Wiederherstellung der Objekteigentümerschaft\n"
+" auslassen\n"
+
+#: pg_dumpall.c:620
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr ""
+" -r, --roles-only nur Rollen ausgeben, keine Datenbanken oder\n"
+" Tablespaces\n"
+
+#: pg_dumpall.c:622
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NAME Superusername für den Dump\n"
+
+#: pg_dumpall.c:623
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr ""
+" -t, --tablespaces-only nur Tablespaces ausgeben, keine Datenbanken oder\n"
+" Rollen\n"
+
+#: pg_dumpall.c:629
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr ""
+" --exclude-database=MUSTER Datenbanken deren Name mit MUSTER übereinstimmt\n"
+" überspringen\n"
+
+#: pg_dumpall.c:636
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords Rollenpasswörter nicht mit ausgeben\n"
+
+#: pg_dumpall.c:652
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=VERBDG mit angegebenen Verbindungsparametern verbinden\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=DBNAME alternative Standarddatenbank\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Wenn -f/--file nicht verwendet wird, dann wird das SQL-Skript auf die\n"
+"Standardausgabe geschrieben.\n"
+"\n"
+
+#: pg_dumpall.c:803
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "mit »pg_« anfangender Rollenname übersprungen (%s)"
+
+#: pg_dumpall.c:1018
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "konnte ACL-Zeichenkette (%s) für Parameter »%s« nicht interpretieren"
+
+#: pg_dumpall.c:1136
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "konnte ACL-Zeichenkette (%s) für Tablespace »%s« nicht interpretieren"
+
+#: pg_dumpall.c:1343
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "Datenbank »%s« übersprungen"
+
+#: pg_dumpall.c:1347
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "Ausgabe der Datenbank »%s«"
+
+#: pg_dumpall.c:1378
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump für Datenbank »%s« fehlgeschlagen; beende"
+
+#: pg_dumpall.c:1384
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "konnte die Ausgabedatei »%s« nicht neu öffnen: %m"
+
+#: pg_dumpall.c:1425
+#, c-format
+msgid "running \"%s\""
+msgstr "führe »%s« aus"
+
+#: pg_dumpall.c:1630
+#, c-format
+msgid "could not get server version"
+msgstr "konnte Version des Servers nicht ermitteln"
+
+#: pg_dumpall.c:1633
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "konnte Versionszeichenkette »%s« nicht entziffern"
+
+#: pg_dumpall.c:1703 pg_dumpall.c:1726
+#, c-format
+msgid "executing %s"
+msgstr "führe %s aus"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "entweder -d/--dbname oder -f/--file muss angegeben werden"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "Optionen -d/--dbname und -f/--file können nicht zusammen verwendet werden"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "Optionen -C/--create und -1/--single-transaction können nicht zusammen verwendet werden"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "--single-transaction und mehrere Jobs können nicht zusammen verwendet werden"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "unbekanntes Archivformat »%s«; bitte »c«, »d« oder »t« angeben"
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "bei Wiederherstellung ignorierte Fehler: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s stellt eine PostgreSQL-Datenbank wieder her, die mit pg_dump\n"
+"gesichert wurde.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [OPTION]... [DATEI]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NAME mit angegebener Datenbank verbinden\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=DATEINAME Name der Ausgabedatei (- für stdout)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t Format der Backup-Datei (sollte automatisch gehen)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list Inhaltsverzeichnis für dieses Archiv anzeigen\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose »Verbose«-Modus\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Optionen die die Wiederherstellung kontrollieren:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only nur Daten, nicht das Schema, wiederherstellen\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create Zieldatenbank erzeugen\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error bei Fehler beenden, Voreinstellung ist fortsetzen\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAME benannten Index wiederherstellen\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr ""
+" -j, --jobs=NUM so viele parallele Jobs zur Wiederherstellung\n"
+" verwenden\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=DATEINAME Inhaltsverzeichnis aus dieser Datei zur Auswahl oder\n"
+" Sortierung der Ausgabe verwenden\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME nur Objekte in diesem Schema wiederherstellen\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, ---exclude-schema=NAME Objekte in diesem Schema nicht wiederherstellen\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAME(args) benannte Funktion wiederherstellen\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only nur das Schema, nicht die Daten, wiederherstellen\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NAME Name des Superusers, um Trigger auszuschalten\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr ""
+" -t, --table=NAME benannte Relation (Tabelle, Sicht, usw.)\n"
+" wiederherstellen\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NAME benannten Trigger wiederherstellen\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges Wiederherstellung der Zugriffsprivilegien auslassen\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction Wiederherstellung als eine einzige Transaktion\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security Sicherheit auf Zeilenebene einschalten\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments Kommentare nicht wiederherstellen\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables Daten für Tabellen, die nicht erzeugt werden\n"
+" konnten, nicht wiederherstellen\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications Publikationen nicht wiederherstellen\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels Security-Labels nicht wiederherstellen\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions Subskriptionen nicht wiederherstellen\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method Tabellenzugriffsmethoden nicht wiederherstellen\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces Tablespace-Zuordnungen nicht wiederherstellen\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=ABSCHNITT angegebenen Abschnitt wiederherstellen (pre-data,\n"
+" data oder post-data)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLLENNAME vor der Wiederherstellung SET ROLE ausführen\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Die Optionen -I, -n, -N, -P, -t, -T und --section können kombiniert und mehrfach\n"
+"angegeben werden, um mehrere Objekte auszuwählen.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Wenn keine Eingabedatei angegeben ist, wird die Standardeingabe verwendet.\n"
+"\n"
diff --git a/src/bin/pg_dump/po/el.po b/src/bin/pg_dump/po/el.po
new file mode 100644
index 0000000..ae66e0c
--- /dev/null
+++ b/src/bin/pg_dump/po/el.po
@@ -0,0 +1,2764 @@
+# Greek message translation file for pg_dump
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_dump (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-14 09:19+0000\n"
+"PO-Revision-Date: 2023-04-14 13:39+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "προειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέρεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "δεν ήταν δυνατή η αναγνώριση του τρέχοντος καταλόγου: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "μη έγκυρο δυαδικό αρχείο «%s»"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "δεν ήταν δυνατή η ανάγνωση του δυαδικού αρχείου «%s»"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "δεν βρέθηκε το αρχείο «%s» για να εκτελεστεί"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου «%s»: %m"
+
+#: ../../common/exec.c:422 parallel.c:1611
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() απέτυχε: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "έλλειψη μνήμης"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "έλλειψη μνήμης\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "δεν ήταν δυνατή η αντιγραφή δείκτη null (εσωτερικό σφάλμα)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "εντολή μη εκτελέσιμη"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "εντολή δεν βρέθηκε"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "απόγονος διεργασίας τερμάτισε με κωδικό εξόδου %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "απόγονος διεργασίας τερματίστηκε με εξαίρεση 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "απόγονος διεργασίας τερματίστηκε με σήμα %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "απόγονος διεργασίας τερμάτισε με μη αναγνωρίσιμη κατάσταση %d"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "μη έγκυρη τιμή «%s» για την επιλογή %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s πρέπει να βρίσκεται εντός εύρους %d..%d"
+
+#: common.c:134
+#, c-format
+msgid "reading extensions"
+msgstr "ανάγνωση επεκτάσεων"
+
+#: common.c:137
+#, c-format
+msgid "identifying extension members"
+msgstr "προσδιορισμός μελών επέκτασεων"
+
+#: common.c:140
+#, c-format
+msgid "reading schemas"
+msgstr "ανάγνωση σχημάτων"
+
+#: common.c:149
+#, c-format
+msgid "reading user-defined tables"
+msgstr "ανάγνωση πινάκων ορισμένων από το χρήστη"
+
+#: common.c:154
+#, c-format
+msgid "reading user-defined functions"
+msgstr "ανάγνωση συναρτήσεων ορισμένων από το χρήστη"
+
+#: common.c:158
+#, c-format
+msgid "reading user-defined types"
+msgstr "ανάγνωση τύπων ορισμένων από το χρήστη"
+
+#: common.c:162
+#, c-format
+msgid "reading procedural languages"
+msgstr "ανάγνωση δομημένων γλωσσών"
+
+#: common.c:165
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "ανάγνωση συναρτήσεων συγκεντρωτικών αποτελεσμάτων ορισμένων από το χρήστη"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined operators"
+msgstr "ανάγνωση χειριστών ορισμένων από το χρήστη"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "ανάγνωση μεθόδων πρόσβασης ορισμένων από το χρήστη"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "ανάγνωση κλάσεων χειριστών ορισμένων από το χρήστη"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "ανάγνωση οικογενειών χειριστών ορισμένων από το χρήστη"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "ανάγνωση αναλυτών αναζήτησης κειμένου ορισμένων από το χρήστη"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "ανάγνωση προτύπων αναζήτησης κειμένου ορισμένων από το χρήστη"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "ανάγνωση λεξικών αναζήτησης κειμένου ορισμένων από το χρήστη"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "ανάγνωση ρυθμίσεων παραμέτρων αναζήτησης κειμένου ορισμένων από το χρήστη"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "ανάγνωση περιτυλίξεων ξενικών δεδομένων ορισμένων από το χρήστη"
+
+#: common.c:195
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "ανάγνωση ξενικών διακομιστών ορισμένων από το χρήστη"
+
+#: common.c:198
+#, c-format
+msgid "reading default privileges"
+msgstr "ανάγνωση προεπιλεγμένων δικαιωμάτων"
+
+#: common.c:201
+#, c-format
+msgid "reading user-defined collations"
+msgstr "ανάγνωση συρραφών ορισμένων από το χρήστη"
+
+#: common.c:204
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "ανάγνωση μετατροπών ορισμένων από το χρήστη"
+
+#: common.c:207
+#, c-format
+msgid "reading type casts"
+msgstr "ανάγνωση τύπων καστ"
+
+#: common.c:210
+#, c-format
+msgid "reading transforms"
+msgstr "ανάγωση μετατροπών"
+
+#: common.c:213
+#, c-format
+msgid "reading table inheritance information"
+msgstr "ανάγωση πληροφοριών κληρονομιάς πινάκων"
+
+#: common.c:216
+#, c-format
+msgid "reading event triggers"
+msgstr "ανάγνωση ενεργοποιήσεων συμβάντων"
+
+#: common.c:220
+#, c-format
+msgid "finding extension tables"
+msgstr "εύρεση πινάκων επέκτασης"
+
+#: common.c:224
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "εύρεση σχέσεων κληρονιμιά"
+
+#: common.c:227
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "ανάγνωση πληροφοριών στήλης για ενδιαφέροντες πίνακες"
+
+#: common.c:230
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "επισήμανση κληρονομούμενων στηλών σε υποπίνακες"
+
+#: common.c:233
+#, c-format
+msgid "reading partitioning data"
+msgstr "ανάγνωση δεδομένων κατάτμησης"
+
+#: common.c:236
+#, c-format
+msgid "reading indexes"
+msgstr "ανάγνωση ευρετηρίων"
+
+#: common.c:239
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "επισήμανση ευρετηρίων σε κατατμημένους πινάκες"
+
+#: common.c:242
+#, c-format
+msgid "reading extended statistics"
+msgstr "ανάγνωση εκτεταμένων στατιστικών στοιχείων"
+
+#: common.c:245
+#, c-format
+msgid "reading constraints"
+msgstr "ανάγνωση περιορισμών"
+
+#: common.c:248
+#, c-format
+msgid "reading triggers"
+msgstr "ανάγνωση ενεργοποιήσεων συμβάντων"
+
+#: common.c:251
+#, c-format
+msgid "reading rewrite rules"
+msgstr "ανάγνωση κανόνων επανεγγραφής"
+
+#: common.c:254
+#, c-format
+msgid "reading policies"
+msgstr "ανάγνωση πολιτικών"
+
+#: common.c:257
+#, c-format
+msgid "reading publications"
+msgstr "ανάγνωση δημοσιεύσεων"
+
+#: common.c:260
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "ανάγνωση ιδιοτήτων μελών δημοσιεύσεων πινάκων"
+
+#: common.c:263
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "ανάγνωση ιδιοτήτων μελών δημοσιεύσεων των σχημάτων"
+
+#: common.c:266
+#, c-format
+msgid "reading subscriptions"
+msgstr "ανάγνωση συνδρομών"
+
+#: common.c:345
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "μη έγκυρος αριθμός γονέων %d για τον πίνακα «%s»"
+
+#: common.c:1006
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "απέτυχε ο έλεγχος ακεραιότητας, το γονικό OID %u του πίνακα «%s» (OID %u) δεν βρέθηκε"
+
+#: common.c:1045
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "δεν ήταν δυνατή η ανάλυση της αριθμητικής συστοιχίας «%s»: πάρα πολλοί αριθμοί"
+
+#: common.c:1057
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "δεν ήταν δυνατή η ανάλυση της αριθμητικής συστοιχίας «%s»: μη έγκυρος χαρακτήρας σε αριθμό"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "μη έγκυρος κωδικός συμπίεσης: %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504
+#: compress_io.c:547
+#, c-format
+msgid "not built with zlib support"
+msgstr "δεν έχει κατασκευαστεί με υποστήριξη zlib"
+
+#: compress_io.c:236 compress_io.c:333
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "δεν ήταν δυνατή η αρχικοποίηση της βιβλιοθήκης συμπίεσης: %s"
+
+#: compress_io.c:256
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "δεν ήταν δυνατό το κλείσιμο της ροής συμπίεσης: %s"
+
+#: compress_io.c:273
+#, c-format
+msgid "could not compress data: %s"
+msgstr "δεν ήταν δυνατή η συμπίεση δεδομένων: %s"
+
+#: compress_io.c:349 compress_io.c:364
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "δεν ήταν δυνατή η αποσυμπίεση δεδομένων: %s"
+
+#: compress_io.c:371
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "δεν ήταν δυνατό το κλείσιμο της βιβλιοθήκης συμπίεσης: %s"
+
+#: compress_io.c:584 compress_io.c:621
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "δεν ήταν δυνατή η ανάγνωση από το αρχείο εισόδου: %s"
+
+#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553
+#: pg_backup_tar.c:726 pg_backup_tar.c:749
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "δεν ήταν δυνατή η ανάγνωση από το αρχείο εισόδου: τέλος αρχείου"
+
+#: parallel.c:253
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() απέτυχε: κωδικός σφάλματος %d"
+
+#: parallel.c:961
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "δεν ήταν δυνατή η δημιουργία καναλιών επικοινωνίας: %m"
+
+#: parallel.c:1018
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "δεν ήταν δυνατή η δημιουργία διεργασίας εργάτη: %m"
+
+#: parallel.c:1148
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "μη αναγνωρίσιμη εντολή που ελήφθη από τον αρχηγό: «%s»"
+
+#: parallel.c:1191 parallel.c:1429
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "άκυρο μήνυμα που ελήφθη από εργάτη: «%s»"
+
+#: parallel.c:1323
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"δεν ήταν δυνατή η απόκτηση κλειδιού για τη σχέση \"%s\"\n"
+"Αυτό συνήθως σημαίνει ότι κάποιος ζήτησε ένα κλειδί ACCESS EXCLUSIVE στον πίνακα αφού η γονική διεργασία pg_dump είχε ήδη αποκτήσει το αρχικό κλειδί ACCESS SHARE στον πίνακα."
+
+#: parallel.c:1412
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "μία διεργασία εργάτη τερματίστηκε απρόσμενα"
+
+#: parallel.c:1534 parallel.c:1652
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "δεν ήταν δυνατή η εγγραφή στο κανάλι επικοινωνίας: %m"
+
+#: parallel.c:1736
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: δεν ήταν δυνατή η δημιουργία υποδοχέα: κωδικός σφάλματος %d"
+
+#: parallel.c:1747
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: δεν ήταν δυνατή η δέσμευση: κωδικός σφάλματος %d"
+
+#: parallel.c:1754
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: δεν ήταν δυνατή η ακρόαση: κωδικός σφάλματος %d"
+
+#: parallel.c:1761
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "%s() απέτυχε: κωδικός σφάλματος %d"
+
+#: parallel.c:1772
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: δεν ήταν δυνατή η δημιουργία δεύτερης υποδοχής: κωδικός σφάλματος %d"
+
+#: parallel.c:1781
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: δεν ήταν δυνατή η σύνδεση της υποδοχής: κωδικός σφάλματος %d"
+
+#: parallel.c:1790
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: δεν ήταν δυνατή η αποδοχή σύνδεσης: κωδικός σφάλματος %d"
+
+#: pg_backup_archiver.c:280 pg_backup_archiver.c:1632
+#, c-format
+msgid "could not close output file: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο αρχείου εξόδου: %m"
+
+#: pg_backup_archiver.c:324 pg_backup_archiver.c:328
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "αρχειοθέτηση στοιχείων που δεν βρίσκονται σε σωστή σειρά ενότητας"
+
+#: pg_backup_archiver.c:334
+#, c-format
+msgid "unexpected section code %d"
+msgstr "μη αναμενόμενος κώδικας ενότητας %d"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "η παράλληλη επαναφορά δεν υποστηρίζεται από αυτήν τη μορφή αρχείου αρχειοθέτησης"
+
+#: pg_backup_archiver.c:375
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "η παράλληλη επαναφορά δεν υποστηρίζεται με αρχεία που έγιναν από pg_dump προ έκδοσης 8.0"
+
+#: pg_backup_archiver.c:393
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)"
+msgstr "δεν είναι δυνατή η επαναφορά από συμπιεσμένη αρχειοθήκη (η συμπίεση δεν υποστηρίζεται σε αυτήν την εγκατάσταση)"
+
+#: pg_backup_archiver.c:410
+#, c-format
+msgid "connecting to database for restore"
+msgstr "σύνδεση με βάση δεδομένων για επαναφορά"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "οι απευθείας συνδέσεις βάσεων δεδομένων δεν υποστηρίζονται σε προ-1.3 αρχεία"
+
+#: pg_backup_archiver.c:455
+#, c-format
+msgid "implied data-only restore"
+msgstr "υποδηλούμενη επαναφορά μόνο δεδομένων"
+
+#: pg_backup_archiver.c:521
+#, c-format
+msgid "dropping %s %s"
+msgstr "εγκαταλείπει %s: %s"
+
+#: pg_backup_archiver.c:621
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "δεν ήταν δυνατή η εύρεση του σημείου εισαγωγής IF EXISTS στη δήλωση «%s»"
+
+#: pg_backup_archiver.c:777 pg_backup_archiver.c:779
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "προειδοποίηση από το αρχικό αρχείο απόθεσης: %s"
+
+#: pg_backup_archiver.c:794
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "δημιουργία %s «%s.%s»"
+
+#: pg_backup_archiver.c:797
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "δημιουργία %s «%s»"
+
+#: pg_backup_archiver.c:847
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "σύνδεση με νέα βάση δεδομένων «%s»"
+
+#: pg_backup_archiver.c:874
+#, c-format
+msgid "processing %s"
+msgstr "επεξεργασία %s"
+
+#: pg_backup_archiver.c:896
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "επεξεργασία δεδομένων για τον πίνακα «%s.%s»"
+
+#: pg_backup_archiver.c:966
+#, c-format
+msgid "executing %s %s"
+msgstr "εκτέλεση %s %s"
+
+#: pg_backup_archiver.c:1005
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "απενεργοποίηση ενεργοποιήσεων για %s"
+
+#: pg_backup_archiver.c:1031
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "ενεργοποίηση ενεργοποιήσεων για %s"
+
+#: pg_backup_archiver.c:1096
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "εσωτερικό σφάλμα -- Δεν είναι δυνατή η κλήση του WriteData εκτός του περιβάλλοντος μιας ρουτίνας DataDumper"
+
+#: pg_backup_archiver.c:1279
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "η έξοδος μεγάλου αντικειμένου δεν υποστηρίζεται στην επιλεγμένη μορφή"
+
+#: pg_backup_archiver.c:1337
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "επανέφερε %d μεγάλο αντικείμενο"
+msgstr[1] "επανέφερε %d μεγάλα αντικείμενα"
+
+#: pg_backup_archiver.c:1358 pg_backup_tar.c:669
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "επαναφορά μεγάλου αντικειμένου με OID %u"
+
+#: pg_backup_archiver.c:1370
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "δεν ήταν δυνατή η δημιουργία μεγάλου αντικειμένου %u: %s"
+
+#: pg_backup_archiver.c:1375 pg_dump.c:3607
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "δεν ήταν δυνατό το άνοιγμα μεγάλου αντικειμένου %u: %s"
+
+#: pg_backup_archiver.c:1431
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου TOC «%s»: %m"
+
+#: pg_backup_archiver.c:1459
+#, c-format
+msgid "line ignored: %s"
+msgstr "παραβλέπεται γραμμή: %s"
+
+#: pg_backup_archiver.c:1466
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "δεν ήταν δυνατή η εύρεση καταχώρησης για ID %d"
+
+#: pg_backup_archiver.c:1489 pg_backup_directory.c:222
+#: pg_backup_directory.c:599
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου TOC %m"
+
+#: pg_backup_archiver.c:1603 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:586 pg_backup_directory.c:649
+#: pg_backup_directory.c:668 pg_dumpall.c:476
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου εξόδου «%s»: %m"
+
+#: pg_backup_archiver.c:1605 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου εξόδου %m"
+
+#: pg_backup_archiver.c:1699
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "έγραψε %zu byte δεδομένων μεγάλου αντικειμένου (αποτέλεσμα = %d)"
+msgstr[1] "έγραψε %zu bytes δεδομένων μεγάλου αντικειμένου (αποτέλεσμα = %d)"
+
+#: pg_backup_archiver.c:1705
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "δεν ήταν δυνατή η εγγραφή σε μεγάλο αντικείμενο: %s"
+
+#: pg_backup_archiver.c:1795
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "ενόσω INITIALIZING:"
+
+#: pg_backup_archiver.c:1800
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "ενόσω PROCESSING TOC:"
+
+#: pg_backup_archiver.c:1805
+#, c-format
+msgid "while FINALIZING:"
+msgstr "ενόσω FINALIZING:"
+
+#: pg_backup_archiver.c:1810
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "από καταχώρηση TOC %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1886
+#, c-format
+msgid "bad dumpId"
+msgstr "εσφαλμένο dumpId"
+
+#: pg_backup_archiver.c:1907
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "εσφαλμένος πίνακας dumpId για στοιχείο TABLE DATA"
+
+#: pg_backup_archiver.c:1999
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "μη αναμενόμενη σημαία όφσετ δεδομένων %d"
+
+#: pg_backup_archiver.c:2012
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "το όφσετ αρχείου στο αρχείο απόθεσης είναι πολύ μεγάλο"
+
+#: pg_backup_archiver.c:2150 pg_backup_archiver.c:2160
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "πολύ μακρύ όνομα καταλόγου: «%s»"
+
+#: pg_backup_archiver.c:2168
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "ο κατάλογος «%s» δεν φαίνεται να είναι έγκυρη αρχειοθήκη (το «toc.dat» δεν υπάρχει)"
+
+#: pg_backup_archiver.c:2176 pg_backup_custom.c:173 pg_backup_custom.c:807
+#: pg_backup_directory.c:207 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου εισόδου «%s»: %m"
+
+#: pg_backup_archiver.c:2183 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου εισόδου %m"
+
+#: pg_backup_archiver.c:2189
+#, c-format
+msgid "could not read input file: %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση αρχείου εισόδου: %m"
+
+#: pg_backup_archiver.c:2191
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "το αρχείο εισόδου είναι πολύ σύντομο (διάβασε %lu, ανάμενε 5)"
+
+#: pg_backup_archiver.c:2223
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "το αρχείο εισαγωγής φαίνεται να είναι απόθεση μορφής κειμένου. Παρακαλώ χρησιμοποιήστε το psql."
+
+#: pg_backup_archiver.c:2229
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "το αρχείο εισόδου δεν φαίνεται να είναι έγκυρη αρχειοθήκη (πολύ σύντομο;)"
+
+#: pg_backup_archiver.c:2235
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "το αρχείο εισόδου δεν φαίνεται να είναι έγκυρη αρχειοθήκη"
+
+#: pg_backup_archiver.c:2244
+#, c-format
+msgid "could not close input file: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο αρχείου εισόδου: %m"
+
+#: pg_backup_archiver.c:2361
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "μη αναγνωρίσιμη μορφή αρχείου «%d»"
+
+#: pg_backup_archiver.c:2443 pg_backup_archiver.c:4505
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "τερματισμός στοιχείου %d %s %s"
+
+#: pg_backup_archiver.c:2447 pg_backup_archiver.c:4518
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "διεργασία εργάτη απέτυχε: κωδικός εξόδου %d"
+
+#: pg_backup_archiver.c:2568
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "καταχώρηση με ID %d εκτός εύρους τιμών -- ίσως αλλοιωμένο TOC"
+
+#: pg_backup_archiver.c:2648
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "η επαναφορά πινάκων WITH OIDS δεν υποστηρίζεται πλέον"
+
+#: pg_backup_archiver.c:2730
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "μη αναγνωρίσιμη κωδικοποίηση «%s»"
+
+#: pg_backup_archiver.c:2735
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "μη έγκυρο στοιχείο ENCODING: %s"
+
+#: pg_backup_archiver.c:2753
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "μη έγκυρο στοιχείο STDSTRINGS: %s"
+
+#: pg_backup_archiver.c:2778
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "το σχήμα «%s» δεν βρέθηκε"
+
+#: pg_backup_archiver.c:2785
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "ο πίνακας «%s» δεν βρέθηκε"
+
+#: pg_backup_archiver.c:2792
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "το ευρετήριο «%s» δεν βρέθηκε"
+
+#: pg_backup_archiver.c:2799
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "η συνάρτηση «%s» δεν βρέθηκε"
+
+#: pg_backup_archiver.c:2806
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "η ενεργοποίηση «%s» δεν βρέθηκε"
+
+#: pg_backup_archiver.c:3203
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "δεν ήταν δυνατός ο ορισμός του χρήστη συνεδρίας σε «%s»: %s"
+
+#: pg_backup_archiver.c:3340
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "δεν ήταν δυνατός ο ορισμός του search_path σε «%s»: %s"
+
+#: pg_backup_archiver.c:3402
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "δεν ήταν δυνατός ο ορισμός του default_tablespace σε «%s»: %s"
+
+#: pg_backup_archiver.c:3452
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "δεν ήταν δυνατός ο ορισμός του default_table_access_method: %s"
+
+#: pg_backup_archiver.c:3546 pg_backup_archiver.c:3711
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "δεν γνωρίζω πώς να οριστεί κάτοχος για τύπο αντικειμένου «%s»"
+
+#: pg_backup_archiver.c:3814
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "δεν βρέθηκε μαγική συμβολοσειρά στην κεφαλίδα αρχείου"
+
+#: pg_backup_archiver.c:3828
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "μη υποστηριζόμενη έκδοση (%d.%d) στην κεφαλίδα αρχείου"
+
+#: pg_backup_archiver.c:3833
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "απέτυχε έλεγχος ακεραιότητας για μέγεθος ακεραίου (%lu)"
+
+#: pg_backup_archiver.c:3837
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "το αρχείο δημιουργήθηκε σε έναν υπολογιστή με μεγαλύτερους ακέραιους, ορισμένες λειτουργίες ενδέχεται να αποτύχουν"
+
+#: pg_backup_archiver.c:3847
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "η αναμενόμενη μορφή (%d) διαφέρει από τη μορφή που βρίσκεται στο αρχείο (%d)"
+
+#: pg_backup_archiver.c:3862
+#, c-format
+msgid "archive is compressed, but this installation does not support compression -- no data will be available"
+msgstr "το αρχείο είναι συμπιεσμένο, αλλά αυτή η εγκατάσταση δεν υποστηρίζει συμπίεση -- δεν θα υπάρχουν διαθέσιμα δεδομένα"
+
+#: pg_backup_archiver.c:3896
+#, c-format
+msgid "invalid creation date in header"
+msgstr "μη έγκυρη ημερομηνία δημιουργίας στην κεφαλίδα"
+
+#: pg_backup_archiver.c:4030
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "επεξεργασία στοιχείου %d %s %s"
+
+#: pg_backup_archiver.c:4109
+#, c-format
+msgid "entering main parallel loop"
+msgstr "εισέρχεται στο κύριο παράλληλο βρόχο"
+
+#: pg_backup_archiver.c:4120
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "παράβλεψη στοιχείου %d %s %s"
+
+#: pg_backup_archiver.c:4129
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "εκκίνηση στοιχείου %d %s %s"
+
+#: pg_backup_archiver.c:4183
+#, c-format
+msgid "finished main parallel loop"
+msgstr "εξέρχεται από το κύριο παράλληλο βρόχο"
+
+#: pg_backup_archiver.c:4219
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "επεξεργασία παραβλεπόμενου στοιχείου %d %s %s"
+
+#: pg_backup_archiver.c:4824
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "δεν ήταν δυνατή η δημιουργία του πίνακα «%s», δεν θα επαναφερθούν τα δεδομένα του"
+
+#: pg_backup_custom.c:376 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "μη έγκυρο OID για μεγάλο αντικειμένο"
+
+#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629
+#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021
+#, c-format
+msgid "error during file seek: %m"
+msgstr "σφάλμα κατά τη διάρκεια αναζήτησης σε αρχείο: %m"
+
+#: pg_backup_custom.c:478
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "%d μπλοκ δεδομένων έχει εσφαλμένη θέση αναζήτησης"
+
+#: pg_backup_custom.c:495
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "τύπος μπλοκ δεδομένων (%d) που δεν αναγνωρίζεται κατά την αναζήτηση αρχειοθέτησης"
+
+#: pg_backup_custom.c:517
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "δεν ήταν δυνατή η εύρεση μπλοκ ID %d στο αρχείο -- πιθανώς λόγω αίτησης επαναφοράς εκτός σειράς, η οποία δεν είναι δυνατό να αντιμετωπιστεί λόγω μη αναζητήσιμου αρχείου εισόδου"
+
+#: pg_backup_custom.c:522
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "δεν ήταν δυνατή η εύρεση μπλοκ ID %d στην αρχειοθήκη -- πιθανώς αλλοιωμένη αρχειοθήκη"
+
+#: pg_backup_custom.c:529
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "βρέθηκε μη αναμενόμενο μπλοκ ID (%d) κατά την ανάγνωση δεδομένων -- αναμενόμενο %d"
+
+#: pg_backup_custom.c:543
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "μη αναγνωρίσιμος τύπος μπλοκ δεδομένων %d κατά την επαναφορά της αρχειοθήκης"
+
+#: pg_backup_custom.c:645
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση από αρχείο: %m"
+
+#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943
+#: pg_backup_tar.c:1019
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "δεν ήταν δυνατός ο προσδιορισμός της θέσης αναζήτησης στην αρχειοθήκη: %m"
+
+#: pg_backup_custom.c:762 pg_backup_custom.c:802
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο της αρχειοθήκης: %m"
+
+#: pg_backup_custom.c:785
+#, c-format
+msgid "can only reopen input archives"
+msgstr "μπορεί να επα-ανοίξει μόνο αρχειοθήκες εισόδου"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "η επαναφορά από τυπική είσοδο δεν υποστηρίζεται"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "η παράλληλη επαναφορά από μη αναζητήσιμο αρχείο δεν υποστηρίζεται"
+
+#: pg_backup_custom.c:810
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "δεν ήταν δυνατή η αναζήτηση θέσης στο αρχείο αρχειοθέτησης: %m"
+
+#: pg_backup_custom.c:889
+#, c-format
+msgid "compressor active"
+msgstr "συμπιεστής ενεργός"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "δεν ήταν δυνατή η απόκτηση server_version από libpq"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1646
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "ματαίωση λόγω ασυμφωνίας έκδοσης διακομιστή"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1647
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "έκδοση διακομιστή: %s; %s έκδοση: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "ήδη συνδεδεμένος σε βάση δεδομένων"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595
+msgid "Password: "
+msgstr "Κωδικός πρόσβασης: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "δεν ήταν δυνατή η σύνδεση σε βάση δεδομένων"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "επανασύνδεση απέτυχε: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dumpall.c:1520 pg_dumpall.c:1604
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732
+#, c-format
+msgid "query failed: %s"
+msgstr "το ερώτημα απέτυχε: %s"
+
+#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733
+#, c-format
+msgid "Query was: %s"
+msgstr "Το ερώτημα ήταν: %s"
+
+#: pg_backup_db.c:316
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "το ερώτημα επέστρεψε %d σειρά αντί μίας: %s"
+msgstr[1] "το ερώτημα επέστρεψε %d σειρές αντί μίας: %s"
+
+#: pg_backup_db.c:352
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %s η εντολή ήταν: %s"
+
+#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489
+msgid "could not execute query"
+msgstr "δεν ήταν δυνατή η εκτέλεση ερωτήματος"
+
+#: pg_backup_db.c:461
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "επιστράφηκε σφάλμα από PQputCopyData: %s"
+
+#: pg_backup_db.c:510
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "επιστράφηκε σφάλμα από PQputCopyEnd: %s"
+
+#: pg_backup_db.c:516
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY απέτυχε για πίνακα «%s»: %s"
+
+#: pg_backup_db.c:522 pg_dump.c:2106
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "μη αναμενόμενα αποτελέσματα κατά τη διάρκεια COPY του πίνακα «%s»"
+
+#: pg_backup_db.c:534
+msgid "could not start database transaction"
+msgstr "δεν ήταν δυνατή η εκκίνηση συναλλαγής βάσης δεδομένων"
+
+#: pg_backup_db.c:542
+msgid "could not commit database transaction"
+msgstr "δεν ήταν δυνατή η ολοκλήρωση της συναλλαγής βάσης δεδομένων"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "δεν ορίστηκε κατάλογος δεδομένων εξόδου"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουργία του καταλόγου «%s»: %m"
+
+#: pg_backup_directory.c:355 pg_backup_directory.c:497
+#: pg_backup_directory.c:533
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "δεν ήταν δυνατή η εγγραφή εξόδου στο αρχείο: %s"
+
+#: pg_backup_directory.c:373
+#, c-format
+msgid "could not close data file: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου δεδομένων: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου δεδομένων «%s»: %m"
+
+#: pg_backup_directory.c:447
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου TOC μεγάλου αντικειμένου «%s» για είσοδο: %m"
+
+#: pg_backup_directory.c:458
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "μη έγκυρη γραμμή σε αρχείο TOC μεγάλου αντικειμένου «%s»: «%s»"
+
+#: pg_backup_directory.c:467
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "σφάλμα κατά την ανάγνωση αρχείου TOC μεγάλου αντικειμένου «%s»"
+
+#: pg_backup_directory.c:471
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο αρχείου TOC μεγάλου αντικειμένου «%s»: %m"
+
+#: pg_backup_directory.c:685
+#, c-format
+msgid "could not close blob data file: %m"
+msgstr "δεν μπόρεσε να κλείσει το αρχείο δεδομένων μεγάλων αντικειμένων: %m"
+
+#: pg_backup_directory.c:691
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "δεν ήταν δυνατή η εγγραφή σε αρχείο TOC blobs"
+
+#: pg_backup_directory.c:705
+#, c-format
+msgid "could not close blobs TOC file: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο αρχείου TOC μεγάλων αντικειμένων: %m"
+
+#: pg_backup_directory.c:724
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "πολύ μακρύ όνομα αρχείου: «%s»"
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "δεν είναι δυνατή η ανάγνωση αυτής της μορφής"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου TOC «%s» για έξοδο: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου TOC για έξοδο: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:893
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "δεν υποστηρίζεται συμπίεση από τη μορφή αρχειοθέτησης tar"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου TOC «%s» για είσοδο: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου TOC για είσοδο: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "δεν ήταν δυνατή η εύρεση του αρχείου «%s» στην αρχειοθήκη"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "δεν ήταν δυνατή η δημιουργία ονόματος προσωρινού αρχείου: %m"
+
+#: pg_backup_tar.c:624
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "μη αναμενόμενη σύνταξη πρότασης COPY: «%s»"
+
+#: pg_backup_tar.c:890
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "μη έγκυρο OID για μεγάλο αντικείμενο (%u)"
+
+#: pg_backup_tar.c:1035
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο προσωρινού αρχείου: %m"
+
+#: pg_backup_tar.c:1038
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "το πραγματικό μήκος του αρχείου (%lld) δεν αντιστοιχεί στο αναμενόμενο (%lld)"
+
+#: pg_backup_tar.c:1084 pg_backup_tar.c:1115
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "δεν ήταν δυνατή η εύρεση κεφαλίδας για το αρχείο «%s» στο αρχείο tar"
+
+#: pg_backup_tar.c:1102
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "η επαναφορά δεδομένων εκτός σειράς δεν υποστηρίζεται σε αυτήν τη μορφή αρχειοθέτησης: απαιτείται «%s», αλλά προηγείται της «%s» στο αρχείο αρχειοθέτησης."
+
+#: pg_backup_tar.c:1149
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "βρέθηκε ατελής κεφαλίδα tar (%lu byte)"
+msgstr[1] "βρέθηκε ατελής κεφαλίδα tar (%lu bytes)"
+
+#: pg_backup_tar.c:1188
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "αλλοιωμένη κεφαλίδα tar βρέθηκε σε %s (αναμενόμενη %d, υπολογισμένη %d) θέση αρχείου %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "μη αναγνωρισμένο όνομα τμήματος: «%s»"
+
+#: pg_backup_utils.c:55 pg_dump.c:628 pg_dump.c:645 pg_dumpall.c:340
+#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373
+#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "έλλειψη υποδοχών on_exit_nicely"
+
+#: pg_dump.c:643 pg_dumpall.c:348 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)"
+
+#: pg_dump.c:662 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "οι επιλογές -s/--schema-only και -a/--data-only δεν είναι δυνατό να χρησιμοποιηθούν μαζί"
+
+#: pg_dump.c:665
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "οι επιλογές -s/--schema-only και --include-foreign-data δεν είναι δυνατό να χρησιμοποιηθούν μαζί"
+
+#: pg_dump.c:668
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "η επιλογή --include-foreign-data δεν υποστηρίζεται με παράλληλη δημιουργία αντιγράφων ασφαλείας"
+
+#: pg_dump.c:671 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "οι επιλογές -c/--clean και -a/--data-only δεν είναι δυνατό να χρησιμοποιηθούν μαζί"
+
+#: pg_dump.c:674 pg_dumpall.c:378 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "η επιλογή --if-exists απαιτεί την επιλογή -c/--clean"
+
+#: pg_dump.c:681
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "η επιλογή --on-conflict-do-nothing απαιτεί την επιλογή --inserts, --rows-per-insert, ή --column-inserts"
+
+#: pg_dump.c:703
+#, c-format
+msgid "requested compression not available in this installation -- archive will be uncompressed"
+msgstr "η συμπίεση που ζητήθηκε δεν είναι διαθέσιμη σε αυτήν την εγκατάσταση -- η αρχειοθήκη θα είναι ασυμπίεστη"
+
+#: pg_dump.c:716
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "παράλληλο αντίγραφο ασφαλείας υποστηρίζεται μόνο από μορφή καταλόγου"
+
+#: pg_dump.c:762
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "το τελευταίο ενσωματωμένο OID είναι %u"
+
+#: pg_dump.c:771
+#, c-format
+msgid "no matching schemas were found"
+msgstr "δεν βρέθηκαν σχήματα που να ταιριάζουν"
+
+#: pg_dump.c:785
+#, c-format
+msgid "no matching tables were found"
+msgstr "δεν βρέθηκαν πίνακες που να ταιριάζουν"
+
+#: pg_dump.c:807
+#, c-format
+msgid "no matching extensions were found"
+msgstr "δεν βρέθηκαν επεκτάσεις που να ταιριάζουν"
+
+#: pg_dump.c:990
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s αποθέτει μια βάση δεδομένων ως αρχείο κειμένου ή σε άλλες μορφές.\n"
+"\n"
+
+#: pg_dump.c:991 pg_dumpall.c:605 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "Χρήση:\n"
+
+#: pg_dump.c:992
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME]\n"
+
+#: pg_dump.c:994 pg_dumpall.c:608 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Γενικές επιλογές:\n"
+
+#: pg_dump.c:995
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=FILENAME αρχείο εξόδου ή όνομα καταλόγου\n"
+
+#: pg_dump.c:996
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p μορφή αρχείου εξόδου (προσαρμοσμένη, κατάλογος, tar,\n"
+" απλό κείμενο (προεπιλογή))\n"
+
+#: pg_dump.c:998
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM χρησιμοποιήστε τόσες πολλές παράλληλες εργασίες για απόθεση\n"
+
+#: pg_dump.c:999 pg_dumpall.c:610
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose περιφραστική λειτουργία\n"
+
+#: pg_dump.c:1000 pg_dumpall.c:611
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης και, στη συνέχεια, έξοδος\n"
+
+#: pg_dump.c:1001
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 επίπεδο συμπίεσης για συμπιεσμένες μορφές\n"
+
+#: pg_dump.c:1002 pg_dumpall.c:612
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=TIMEOUT αποτυγχάνει μετά την αναμονή TIMEOUT για το κλείδωμα πίνακα\n"
+
+#: pg_dump.c:1003 pg_dumpall.c:639
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync να μην αναμένει την ασφαλή εγγραφή αλλαγών στον δίσκο\n"
+
+#: pg_dump.c:1004 pg_dumpall.c:613
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, και μετά έξοδος\n"
+
+#: pg_dump.c:1006 pg_dumpall.c:614
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Επιλογές που ελέγχουν το περιεχόμενο εξόδου:\n"
+
+#: pg_dump.c:1007 pg_dumpall.c:615
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only αποθέτει μόνο τα δεδομένα, όχι το σχήμα\n"
+
+#: pg_dump.c:1008
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs περιέλαβε μεγάλα αντικείμενα στην απόθεση\n"
+
+#: pg_dump.c:1009
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs εξαίρεσε μεγάλα αντικείμενα στην απόθεση\n"
+
+#: pg_dump.c:1010 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean καθάρισε (εγκατάληψε) αντικείμενα βάσης δεδομένων πριν από την αναδημιουργία\n"
+
+#: pg_dump.c:1011
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create συμπεριέλαβε εντολές για τη δημιουργία βάσης δεδομένων στην απόθεση\n"
+
+#: pg_dump.c:1012
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATTERN απόριψε μόνο τις καθορισμένες επεκτάσεις\n"
+
+#: pg_dump.c:1013 pg_dumpall.c:617
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=ENCODING απόθεσε τα δεδομένα στην κωδικοποίηση ENCODING\n"
+
+#: pg_dump.c:1014
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=PATTERN απόθεση μόνο για τα καθορισμένα σχήματα\n"
+
+#: pg_dump.c:1015
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATTERN να ΜΗΝ αποθέσει τα καθορισμένα σχήματα\n"
+
+#: pg_dump.c:1016
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner παράλειπε την αποκατάσταση της κυριότητας των αντικειμένων στη\n"
+" μορφή απλού κειμένου\n"
+
+#: pg_dump.c:1018 pg_dumpall.c:621
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only απόθεση μόνο το σχήμα, χωρίς δεδομένα\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAME όνομα χρήστη υπερ-χρήστη που θα χρησιμοποιηθεί σε μορφή απλού κειμένου\n"
+
+#: pg_dump.c:1020
+#, c-format
+msgid " -t, --table=PATTERN dump the specified table(s) only\n"
+msgstr " -t, --table=PATTERN απόθεση μόνο των καθορισμένων πινάκων\n"
+
+#: pg_dump.c:1021
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATTERN να ΜΗΝ αποθέτει τους καθορισμένους πίνακες\n"
+
+#: pg_dump.c:1022 pg_dumpall.c:624
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges να ΜΗΝ αποθέτει δικαιώματα (εκχώρηση/ανάκληση)\n"
+
+#: pg_dump.c:1023 pg_dumpall.c:625
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade μόνο για χρήση μόνο από βοηθητικά προγράμματα αναβάθμισης\n"
+
+#: pg_dump.c:1024 pg_dumpall.c:626
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts αποθέτει δεδομένα ως εντολές INSERT με ονόματα στηλών\n"
+
+#: pg_dump.c:1025 pg_dumpall.c:627
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr " --disable-dollar-quoting απενεργοποίησε την παράθεση δολαρίου, χρήση τυποποιημένης παράθεσης SQL\n"
+
+#: pg_dump.c:1026 pg_dumpall.c:628 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers απενεργοποίησε τα εναύσματα κατά την επαναφορά δεδομένων-μόνο\n"
+
+#: pg_dump.c:1027
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security ενεργοποιήστε την ασφάλεια σειρών (απόθεση μόνο του περιεχομένου που ο χρήστης έχει\n"
+" πρόσβαση)\n"
+
+#: pg_dump.c:1029
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=PATTERN να ΜΗΝ αποθέσει δεδομένα για τους καθορισμένους πίνακες\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:630
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM παράκαμψε την προεπιλεγμένη ρύθμιση για extra_float_digits\n"
+
+#: pg_dump.c:1031 pg_dumpall.c:631 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists χρησιμοποίησε το IF EXISTS κατά την εγκαταλήψη αντικειμένων\n"
+
+#: pg_dump.c:1032
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=PATTERN\n"
+" περιέλαβε δεδομένα ξένων πινάκων για\n"
+" διακομιστές που ταιριάζουν με PATTERN\n"
+
+#: pg_dump.c:1035 pg_dumpall.c:632
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts απόθεσε δεδομένα ως εντολές INSERT, αντί για COPY\n"
+
+#: pg_dump.c:1036 pg_dumpall.c:633
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root φόρτωσε διαχωρίσματα μέσω του βασικού πίνακα\n"
+
+#: pg_dump.c:1037 pg_dumpall.c:634
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments να μην αποθέσεις σχόλια\n"
+
+#: pg_dump.c:1038 pg_dumpall.c:635
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications να μην αποθέσεις δημοσιεύσεις\n"
+
+#: pg_dump.c:1039 pg_dumpall.c:637
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels να μην αποθέσεις αντιστοιχίσεις ετικετών ασφαλείας\n"
+
+#: pg_dump.c:1040 pg_dumpall.c:638
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-publications να μην αποθέσεις συνδρομές\n"
+
+#: pg_dump.c:1041 pg_dumpall.c:640
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method να μην αποθέσει μεθόδους πρόσβασης πινάκων\n"
+
+#: pg_dump.c:1042 pg_dumpall.c:641
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces να μην αποθέσει αναθέσεις πινακοχώρος\n"
+
+#: pg_dump.c:1043 pg_dumpall.c:642
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression να μην αποθέσει τις μεθόδους συμπίεσης TOAST\n"
+
+#: pg_dump.c:1044 pg_dumpall.c:643
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data να μην αποθέσει μη δεδομένα μη-καταγραμένου πίνακα\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:644
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing προσθέστε ON CONFLICT DO NOTHING στις εντολές INSERT\n"
+
+#: pg_dump.c:1046 pg_dumpall.c:645
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr " --quote-all-identifiers παράθεσε όλα τα αναγνωριστικά, ακόμα και αν δεν είναι λέξεις κλειδιά\n"
+
+#: pg_dump.c:1047 pg_dumpall.c:646
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS αριθμός γραμμών ανά INSERT; υπονοεί --inserts\n"
+
+#: pg_dump.c:1048
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION απόθεσε ονομασμένες ενότητες (προ-δεδομένα, δεδομένα, ή μετα-δεδομένα)\n"
+
+#: pg_dump.c:1049
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable ανάμενε έως ότου η απόθεση να μπορεί να τρέξει χωρίς ανωμαλίες\n"
+
+#: pg_dump.c:1050
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT χρησιμοποίησε το δοσμένο στιγμιότυπο για την απόθεση\n"
+
+#: pg_dump.c:1051 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names απαίτησε τα μοτίβα περίληψης πίνακα ή/και σχήματος να\n"
+" αντιστοιχήσουν τουλάχιστον μία οντότητα το καθένα\n"
+
+#: pg_dump.c:1053 pg_dumpall.c:647 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" χρησιμοποιήσε τις εντολές SET SESSION AUTHORIZATION αντί των\n"
+" ALTER OWNER για τον ορισμό ιδιοκτησίας\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:651 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Επιλογές σύνδεσης:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=DBNAME βάση δεδομένων για απόθεση\n"
+
+#: pg_dump.c:1059 pg_dumpall.c:653 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:655 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT θύρα διακομιστή βάσης δεδομένων\n"
+
+#: pg_dump.c:1061 pg_dumpall.c:656 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME σύνδεση ως ο ορισμένος χρήστης βάσης δεδομένων\n"
+
+#: pg_dump.c:1062 pg_dumpall.c:657 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός πρόσβασης\n"
+
+#: pg_dump.c:1063 pg_dumpall.c:658 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password αναγκαστική προτροπή κωδικού πρόσβασης (πρέπει να συμβεί αυτόματα)\n"
+
+#: pg_dump.c:1064 pg_dumpall.c:659
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLENAME κάνε SET ROLE πριν την απόθεση\n"
+
+#: pg_dump.c:1066
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Εάν δεν παρέχεται όνομα βάσης δεδομένων, τότε χρησιμοποιείται η μεταβλητή\n"
+"περιβάλλοντος PGDATABASE.\n"
+"\n"
+
+#: pg_dump.c:1068 pg_dumpall.c:663 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Υποβάλετε αναφορές σφάλματων σε <%s>.\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:664 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αρχική σελίδα: <%s>\n"
+
+#: pg_dump.c:1088 pg_dumpall.c:488
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "καθορίστηκε μη έγκυρη κωδικοποίηση προγράμματος-πελάτη «%s»"
+
+#: pg_dump.c:1226
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "οι παράλληλες αποθέσεις δεν υποστηρίζονται από αυτήν την έκδοση διακομιστή"
+
+#: pg_dump.c:1291
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "ορίστηκε μη έγκυρη μορφή εξόδου «%s»"
+
+#: pg_dump.c:1332 pg_dump.c:1388 pg_dump.c:1441 pg_dumpall.c:1282
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "ακατάλληλο αναγνωρισμένο όνομα (πάρα πολλά διάστικτα ονόματα): %s"
+
+#: pg_dump.c:1340
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "δεν βρέθηκαν σχήματα που να ταιριάζουν με το μοτίβο «%s»"
+
+#: pg_dump.c:1393
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "δεν βρέθηκαν επεκτάσεις που ταιριάζουν με το μοτίβο «%s»"
+
+#: pg_dump.c:1446
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "δεν βρέθηκαν ξένοι διακομιστές που να ταιριάζουν με το μοτίβο «%s»"
+
+#: pg_dump.c:1509
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "ακατάλληλο όνομα σχέσης (πολλά διάστικτα ονόματα): %s"
+
+#: pg_dump.c:1520
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "δεν βρέθηκαν πίνακες που να ταιριάζουν για το μοτίβο «%s»"
+
+#: pg_dump.c:1547
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Αυτή τη στιγμή δεν είστε συνδεδεμένοι σε μία βάση δεδομένων."
+
+#: pg_dump.c:1550
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "οι παραπομπές μεταξύ βάσεων δεδομένων δεν είναι υλοποιημένες: %s"
+
+#: pg_dump.c:1981
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "αποθέτει τα δεδομένα του πίνακα «%s.%s»"
+
+#: pg_dump.c:2087
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Η απόθεση των περιεχομένων του πίνακα «%s» απέτυχε: PQgetCopyData() απέτυχε."
+
+#: pg_dump.c:2088 pg_dump.c:2098
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Μήνυμα σφάλματος από διακομιστή: %s"
+
+#: pg_dump.c:2089 pg_dump.c:2099
+#, c-format
+msgid "Command was: %s"
+msgstr "Η εντολή ήταν: %s"
+
+#: pg_dump.c:2097
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Η απόθεση των περιεχομένων του πίνακα «%s» απέτυχε: PQgetResult() απέτυχε."
+
+#: pg_dump.c:2179
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "λανθασμένος αριθμός πεδίων που ανακτήθηκαν από τον πίνακα «%s»"
+
+#: pg_dump.c:2875
+#, c-format
+msgid "saving database definition"
+msgstr "αποθήκευση ορισμού βάσης δεδομένων"
+
+#: pg_dump.c:2971
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "μη αναγνωρίσιμος πάροχος εντοπιότητας: %s"
+
+#: pg_dump.c:3317
+#, c-format
+msgid "saving encoding = %s"
+msgstr "αποθηκεύει encoding = %s"
+
+#: pg_dump.c:3342
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "αποθηκεύει standard_conforming_strings = %s"
+
+#: pg_dump.c:3381
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "δεν ήταν δυνατή η ανάλυση του αποτελέσματος της current_schemas()"
+
+#: pg_dump.c:3400
+#, c-format
+msgid "saving search_path = %s"
+msgstr "αποθηκεύει search_path = %s"
+
+#: pg_dump.c:3438
+#, c-format
+msgid "reading large objects"
+msgstr "ανάγνωση μεγάλων αντικειμένων"
+
+#: pg_dump.c:3576
+#, c-format
+msgid "saving large objects"
+msgstr "αποθηκεύει μεγάλων αντικειμένων"
+
+#: pg_dump.c:3617
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "σφάλμα κατά την ανάγνωση %u μεγάλου αντικειμένου: %s"
+
+#: pg_dump.c:3723
+#, c-format
+msgid "reading row-level security policies"
+msgstr "διαβάζει πολιτικές ασφαλείας επιπέδου σειράς"
+
+#: pg_dump.c:3864
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "μη αναμενόμενος τύπος εντολής πολιτικής: %c"
+
+#: pg_dump.c:4314 pg_dump.c:4632 pg_dump.c:11833 pg_dump.c:17684
+#: pg_dump.c:17686 pg_dump.c:18307
+#, c-format
+msgid "could not parse %s array"
+msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας %s"
+
+#: pg_dump.c:4500
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "οι συνδρομές δεν απορρίπτονται, επειδή ο τρέχων χρήστης δεν είναι υπερχρήστης"
+
+#: pg_dump.c:5014
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "δεν ήταν δυνατή η εύρεση γονικής επέκτασης για %s %s"
+
+#: pg_dump.c:5159
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "το σχήμα με %u OID δεν υπάρχει"
+
+#: pg_dump.c:6613 pg_dump.c:16948
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "απέτυχε ο έλεγχος ακεραιότητας, ο γονικός πίνακας με OID %u της ακολουθίας με OID %u δεν βρέθηκε"
+
+#: pg_dump.c:6756
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "απέτυχε ο έλεγχος ακεραιότηταςς, το OID %u πίνακα που εμφανίζεται στο pg_partitioned_table δεν βρέθηκε"
+
+#: pg_dump.c:6987 pg_dump.c:7254 pg_dump.c:7725 pg_dump.c:8392 pg_dump.c:8513
+#: pg_dump.c:8667
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "μη αναγνωρίσιμο OID %u πίνακα"
+
+#: pg_dump.c:6991
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "μη έγκυρα δεδομένα ευρετηρίου για τον πίνακα «%s»"
+
+#: pg_dump.c:7486
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "απέτυχε ο έλεγχος ακεραιότητας, ο γονικός πίνακας με OID %u της καταχώρησης pg_rewrite με OID %u δεν βρέθηκε"
+
+#: pg_dump.c:7777
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "το ερώτημα παρήγαγε null πίνακα αναφοράς για το έναυσμα ξένου κλειδιού «%s» στον πίνακα «%s» (OID του πίνακα: %u)"
+
+#: pg_dump.c:8396
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "μη έγκυρα δεδομένα στηλών στον πίνακα «%s»"
+
+#: pg_dump.c:8426
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "μη έγκυρη αρίθμηση στηλών στον πίνακα «%s»"
+
+#: pg_dump.c:8475
+#, c-format
+msgid "finding table default expressions"
+msgstr "εύρεση προεπιλεγμένων εκφράσεων πίνακα"
+
+#: pg_dump.c:8517
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "μη έγκυρη τιμή adnum %d για τον πίνακα «%s»"
+
+#: pg_dump.c:8617
+#, c-format
+msgid "finding table check constraints"
+msgstr "εύρεση περιορισμών ελέγχου για τον πίνακα"
+
+#: pg_dump.c:8671
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "αναμενόμενος %d περιορισμός ελέγχου στον πίνακα «%s», αλλά βρήκε %d"
+msgstr[1] "αναμενόμενοι %d περιορισμοί ελέγχου στον πίνακα «%s», αλλά βρήκε %d"
+
+#: pg_dump.c:8675
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "Οι κατάλογοι συστήματος ενδέχεται να είναι αλλοιωμένοι."
+
+#: pg_dump.c:9365
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "το σχήμα με OID %u δεν υπάρχει"
+
+#: pg_dump.c:9477 pg_dump.c:9506
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "μη υποστηριζόμενα pg_init_privs entry: %u %u %d"
+
+#: pg_dump.c:10327
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "typtype του τύπου δεδομένων «%s» φαίνεται να μην είναι έγκυρο"
+
+#: pg_dump.c:11902
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "μη αναγνωρίσιμη τιμή provolatile για τη συνάρτηση «%s»"
+
+#: pg_dump.c:11952 pg_dump.c:13777
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "μη αναγνωρίσιμη τιμή proparallel για τη συνάρτηση «%s»"
+
+#: pg_dump.c:12083 pg_dump.c:12189 pg_dump.c:12196
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "δεν ήταν δυνατή η εύρεση ορισμού συνάντησης για την συνάρτηση με OID %u"
+
+#: pg_dump.c:12122
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "πλαστή τιμή στο πεδίο pg_cast.castfunc ή pg_cast.castmethod"
+
+#: pg_dump.c:12125
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "πλαστή τιμή στο πεδίο pg_cast.castmethod"
+
+#: pg_dump.c:12215
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "πλαστός ορισμός μετασχηματισμού, τουλάχιστον μία από trffromsql και trftosql θα πρέπει να είναι μη μηδενική"
+
+#: pg_dump.c:12232
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "πλαστή τιμή στο πεδίο pg_transform.trffromsql"
+
+#: pg_dump.c:12253
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "πλαστή τιμή στο πεδίοpg_transform.trftosql"
+
+#: pg_dump.c:12398
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "χειριστές postfix δεν υποστηρίζεται πλέον (χειριστής «%s»)"
+
+#: pg_dump.c:12568
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "δεν ήταν δυνατή η εύρεση χειριστή με OID %s"
+
+#: pg_dump.c:12636
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "μη έγκυρος τύπος «%c» για την μεθόδο πρόσβασης «%s»"
+
+#: pg_dump.c:13278
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "μη αναγνωρίσιμος πάροχος συρραφής: %s"
+
+#: pg_dump.c:13696
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "μη αναγνωρίσιμη τιμή aggfinalmodify για το συγκεντρωτικό «%s»"
+
+#: pg_dump.c:13752
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "μη αναγνωρίσιμη τιμή aggmfinalmodify για το συγκεντρωτικό «%s»"
+
+#: pg_dump.c:14470
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "μη αναγνωρίσιμος τύπος αντικειμένου σε προεπιλεγμένα δικαιώματα: %d"
+
+#: pg_dump.c:14486
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "δεν ήταν δυνατή η ανάλυση της προεπιλεγμένης λίστας ACL (%s)"
+
+#: pg_dump.c:14568
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "δεν μπόρεσε να αναλύσει την αρχική λίστα ACL (%s) ή την προεπιλεγμένη (%s) για το αντικείμενο «%s» (%s)"
+
+#: pg_dump.c:14593
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "δεν μπόρεσε να αναλύσει τη λίστα ACL (%s) ή την προεπιλογή (%s) για το αντικείμενο «%s» (%s)"
+
+#: pg_dump.c:15131
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "το ερώτημα για τη λήψη ορισμού της όψης «%s» δεν επέστρεψε δεδομένα"
+
+#: pg_dump.c:15134
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "το ερώτημα για τη λήψη ορισμού της όψης «%s» επέστρεψε περισσότερους από έναν ορισμούς"
+
+#: pg_dump.c:15141
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "ο ορισμός της όψης «%s» φαίνεται να είναι κενός (μηδενικό μήκος)"
+
+#: pg_dump.c:15225
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS δεν υποστηρίζεται πλέον (πίνακας «%s»)"
+
+#: pg_dump.c:16154
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "μη έγκυρος αριθμός στήλης %d για τον πίνακα «%s»"
+
+#: pg_dump.c:16232
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "δεν ήταν δυνατή η ανάλυση στηλών στατιστικής ευρετηρίου"
+
+#: pg_dump.c:16234
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "δεν ήταν δυνατή η ανάλυση ευρετηρίου στατιστικών τιμών"
+
+#: pg_dump.c:16236
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "ασυμφωνία αριθμού στηλών και τιμών για στατιστικά στοιχεία ευρετηρίου"
+
+#: pg_dump.c:16454
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "λείπει ευρετήριο για τον περιορισμό «%s»"
+
+#: pg_dump.c:16682
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "μη αναγνωρίσιμος τύπος περιορισμού: %c"
+
+#: pg_dump.c:16783 pg_dump.c:17012
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "ερώτημα για τη λήψη δεδομένων ακολουθίας «%s» επέστρεψε %d γραμμή (αναμένεται 1)"
+msgstr[1] "ερώτημα για τη λήψη δεδομένων ακολουθίας «%s» επέστρεψε %d γραμμές (αναμένεται 1)"
+
+#: pg_dump.c:16815
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "μη αναγνωρίσιμος τύπος ακολουθίας: %s"
+
+#: pg_dump.c:17104
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "μη αναγνωρίσιμος τύπος tgtype: %d"
+
+#: pg_dump.c:17176
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "μη έγκυρη συμβολοσειρά παραμέτρου (%s) για το έναυσμα «%s» στον πίνακα «%s»"
+
+#: pg_dump.c:17445
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "ερώτημα για τη λήψη κανόνα «%s» για τον πίνακα «%s» απέτυχε: επιστράφηκε εσφαλμένος αριθμός γραμμών"
+
+#: pg_dump.c:17598
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "δεν ήταν δυνατή η εύρεση της αναφερόμενης επέκτασης %u"
+
+#: pg_dump.c:17688
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "ασυμφωνία αριθμού διαμορφώσεων και συνθηκών για επέκταση"
+
+#: pg_dump.c:17820
+#, c-format
+msgid "reading dependency data"
+msgstr "ανάγνωση δεδομένων εξάρτησης"
+
+#: pg_dump.c:17906
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "δεν αναφέρεται αντικείμενο %u %u"
+
+#: pg_dump.c:17917
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "μη αναφερόμενο αντικείμενο %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "μη έγκυρο dumpId %d"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "μη έγκυρη εξάρτηση %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "δεν ήταν δυνατός ο προσδιορισμός βρόχου εξάρτησης"
+
+#: pg_dump_sort.c:1232
+#, c-format
+msgid "there are circular foreign-key constraints on this table:"
+msgid_plural "there are circular foreign-key constraints among these tables:"
+msgstr[0] "υπάρχουν κυκλικοί περιορισμοί ξένου κλειδιού σε αυτόν τον πίνακα:"
+msgstr[1] "υπάρχουν κυκλικοί περιορισμοί ξένου κλειδιού σε αυτούς τους πίνακες:"
+
+#: pg_dump_sort.c:1236 pg_dump_sort.c:1256
+#, c-format
+msgid " %s"
+msgstr " %s"
+
+#: pg_dump_sort.c:1237
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "Ενδέχεται να μην μπορείτε να επαναφέρετε την ένδειξη χωρίς να χρησιμοποιήσετε --disable-triggers ή να εγκαταλήψετε προσωρινά τους περιορισμούς."
+
+#: pg_dump_sort.c:1238
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "Εξετάστε το ενδεχόμενο να χρησιμοποιήσετε μια πλήρη απόθεση αντί για μια --data-only απόθεση για να αποφύγετε αυτό το πρόβλημα."
+
+#: pg_dump_sort.c:1250
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "δεν ήταν δυνατή η επίλυση του βρόχου εξάρτησης μεταξύ αυτών των στοιχείων:"
+
+#: pg_dumpall.c:205
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "το πρόγραμμα «%s» απαιτείται από %s αλλά δεν βρέθηκε στον ίδιο κατάλογο με το «%s»"
+
+#: pg_dumpall.c:208
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "το πρόγραμμα «%s» βρέθηκε από το «%s» αλλά δεν ήταν η ίδια έκδοση με το %s"
+
+#: pg_dumpall.c:357
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "επιλογή --exclude-database δεν μπορεί να χρησιμοποιηθεί μαζί με -g/--globals-only, -r/--roles-only, ή -t/--tablespaces-only"
+
+#: pg_dumpall.c:365
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "οι επιλογές -g/--globals-only και -r/--roles-only δεν μπορούν να χρησιμοποιηθούν μαζί"
+
+#: pg_dumpall.c:372
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "οι επιλογές -g/--globals-only μόνο και -t/--tablespaces-only δεν είναι δυνατό να χρησιμοποιηθούν μαζί"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "οι επιλογές -r/--roles-only και -t/--tablespaces-only δεν μπορούν να χρησιμοποιηθούν μαζί"
+
+#: pg_dumpall.c:444 pg_dumpall.c:1587
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "δεν ήταν δυνατή η σύνδεση στη βάση δεδομένων «%s»"
+
+#: pg_dumpall.c:456
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"δεν ήταν δυνατή η σύνδεση με τις βάσεις δεδομένων \"postgres\" ή \"Template1\"\n"
+"Παρακαλώ καθορίστε μία εναλλακτική βάση δεδομένων."
+
+#: pg_dumpall.c:604
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s εξάγει μία συστάδα βάσεων δεδομένων PostgreSQL σε ένα αρχείο σεναρίου SQL.\n"
+"\n"
+
+#: pg_dumpall.c:606
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]...\n"
+
+#: pg_dumpall.c:609
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=FILENAME όνομα αρχείου εξόδου\n"
+
+#: pg_dumpall.c:616
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean καθάρισε (εγκατάληψε) βάσεις δεδομένων πριν από την αναδημιουργία\n"
+
+#: pg_dumpall.c:618
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only απόθεσε μόνο καθολικά αντικείμενα, όχι βάσεις δεδομένων\n"
+
+#: pg_dumpall.c:619 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner παράλειψε την αποκατάσταση της κυριότητας αντικειμένων\n"
+
+#: pg_dumpall.c:620
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only απόθεσε μόνο ρόλους, όχι βάσεις δεδομένων ή πινακοχώρους\n"
+
+#: pg_dumpall.c:622
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NAME όνομα υπερχρήστη για να χρησιμοποιηθεί στην απόθεση\n"
+
+#: pg_dumpall.c:623
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only απόθεσε μόνο πινακοχώρους, όχι βάσεις δεδομένων ή ρόλους\n"
+
+#: pg_dumpall.c:629
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=PATTERN εξαίρεσε βάσεις δεδομένων των οποίων το όνομα ταιριάζει με PATTERN\n"
+
+#: pg_dumpall.c:636
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords να μην αποθέσει κωδικούς πρόσβασης για ρόλους\n"
+
+#: pg_dumpall.c:652
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONNSTR σύνδεση με χρήση συμβολοσειράς σύνδεσης\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr ""
+" -l, --database=DBNAME εναλλακτική προεπιλεγμένη βάση δεδομένων\n"
+"\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Εάν δεν χρησιμοποιηθεί -f/--file , τότε η δέσμη ενεργειών SQL θα εγγραφεί στη τυπική\n"
+"έξοδο.\n"
+"\n"
+
+#: pg_dumpall.c:803
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "όνομα ρόλου που αρχίζει «pg_» παραλείπεται (%s)"
+
+#: pg_dumpall.c:1018
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση της λίστας ACL (%s) για την παράμετρο «%s»"
+
+#: pg_dumpall.c:1136
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση της λίστας ACL (%s) για τον πινακοχώρο «%s»"
+
+#: pg_dumpall.c:1343
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "εξαιρεί τη βάση δεδομένων «%s»"
+
+#: pg_dumpall.c:1347
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "αποθέτει τη βάση δεδομένων «%s»"
+
+#: pg_dumpall.c:1378
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump απέτυχε στη βάση δεδομένων «%s», εξέρχεται"
+
+#: pg_dumpall.c:1384
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το εκ νέου άνοιγμα του αρχείου εξόδου «%s»: %m"
+
+#: pg_dumpall.c:1425
+#, c-format
+msgid "running \"%s\""
+msgstr "εκτελείται «%s»"
+
+#: pg_dumpall.c:1630
+#, c-format
+msgid "could not get server version"
+msgstr "δεν ήταν δυνατή η απόκτηση έκδοσης διακομιστή"
+
+#: pg_dumpall.c:1633
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση έκδοσης διακομιστή «%s»"
+
+#: pg_dumpall.c:1703 pg_dumpall.c:1726
+#, c-format
+msgid "executing %s"
+msgstr "εκτελείται %s"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "ένα από τα -d/--dbname και -f/--file πρέπει να καθοριστεί"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "οι επιλογές -d/--dbname και -f/--file δεν μπορούν να χρησιμοποιηθούν μαζί"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "οι επιλογές -C/--create και -1/--single-transaction δεν μπορούν να χρησιμοποιηθούν μαζί"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "δεν είναι δυνατό να οριστούν μαζί --single-transaction και multiple jobs"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "μη αναγνωρισμένη μορφή αρχειοθέτησης «%s»· παρακαλώ καθορίστε «c», «d» ή «t»"
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "σφάλματα που παραβλέφθηκαν κατά την επαναφορά: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s επαναφέρει μια βάση δεδομένων PostgreSQL από μια αρχειοθήκη που δημιουργήθηκε από τη pg_dump.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [ΑΡΧΕΙΟ]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NAME σύνδεση με τη βάσης δεδομένων με όνομα\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FILENAME όνομα αρχείου εξόδου (- για stdout)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t μορφή αρχείου αντιγράφου ασφαλείας (θα πρέπει να είναι αυτόματη)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list εκτύπωσε συνοπτικό TOC της αρχειοθήκης\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose περιφραστική λειτουργία\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Επιλογές που ελέγχουν την επαναφορά:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only επαναφέρε μόνο τα δεδομένα, όχι το σχήμα\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create δημιούργησε τη βάσης δεδομένων προορισμού\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error να εξέλθει σε σφάλμα, η προεπιλογή είναι να συνεχίσει\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAME επανάφερε το ευρετήριο με όνομα\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM χρησιμοποίησε τόσες πολλές παράλληλες εργασίες για την επαναφορά\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=FILENAME χρησιμοποίησε τον πίνακα περιεχομένων από αυτό το αρχείο για\n"
+" επιλογή/ταξινόμηση εξόδου\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME επανάφερε μόνο αντικείμενα σε αυτό το σχήμα\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME να μην επαναφέρει αντικείμενα από αυτό το σχήμα\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAME(args) επανάφερε την καθορισμένη συνάρτηση\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only επανάφερε μόνο το σχήμα, χωρίς δεδομένα\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NAME όνομα υπερχρήστη για χρήση κατά την απενεργοποίηση εναυσμάτων\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NAME επανάφερε την καθορισμένη σχέση (πίνακας, προβολή κ.λπ.)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr ""
+" -T, --trigger=NAME επανάφερε το καθορισμένο έναυσμα\n"
+"\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges παράλειπε την επαναφορά των δικαιωμάτων πρόσβασης (εκχώρηση/ανάκληση)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction επανάφερε ως μεμονωμένη συναλλαγή\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security ενεργοποίησε ασφαλεία σειράς\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments να μην επαναφέρεις σχόλια\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables να μην επαναφέρεις δεδομένα πινάκων που δεν ήταν\n"
+" δυνατό να δημιουργήθουν\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications να μην επαναφέρεις δημοσιεύσεις\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels να μην επαναφέρεις ετικέτες ασφαλείας\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-publications να μην επαναφέρεις συνδρομές\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method να μην επαναφέρει μεθόδους πρόσβασης πινάκων\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces να μην επαναφέρεις αναθέσεις πινακοχώρων\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION επανάφερε ονομασμένες ενότητες (προ-δεδομένα, δεδομένα, ή μετα-δεδομένα)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME κάνε SET ROLE πριν την επαναφορά\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Οι επιλογές -I, -n, -N, -P, -t, -T και --section μπορούν να συνδυαστούν και να καθοριστούν\n"
+"πολλές φορές για την επιλογή πολλών αντικειμένων.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Εάν δεν παρέχεται όνομα αρχείου εισόδου, τότε χρησιμοποιείται η τυπική είσοδος.\n"
+"\n"
+
+#~ msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"
+#~ msgstr " --no-synchronized-snapshots να μην χρησιμοποιήσει συγχρονισμένα στιγμιότυπα σε παράλληλες εργασίες\n"
+
+#~ msgid ""
+#~ "Synchronized snapshots are not supported by this server version.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots."
+#~ msgstr ""
+#~ "Τα συγχρονισμένα στιγμιότυπα δεν υποστηρίζονται από αυτήν την έκδοση διακομιστή.\n"
+#~ "Εκτελέστε με --no-synchronized-snapshots, εάν δεν χρειάζεστε\n"
+#~ "συγχρονισμένα στιγμιότυπα."
+
+#~ msgid ""
+#~ "Synchronized snapshots on standby servers are not supported by this server version.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots."
+#~ msgstr ""
+#~ "Τα συγχρονισμένα στιγμιότυπα σε διακομιστές αναμονής δεν υποστηρίζονται από αυτήν την έκδοση διακομιστή.\n"
+#~ "Εκτελέστε με --no-synchronized-snapshots, εάν δεν χρειάζεστε\n"
+#~ "συγχρονισμένα στιγμιότυπα."
+
+#~ msgid "The command was: %s"
+#~ msgstr "Η εντολή ήταν: %s"
+
+#~ msgid "WSAStartup failed: %d"
+#~ msgstr "WSAStartup απέτυχε: %d"
+
+#~ msgid "aggregate function %s could not be dumped correctly for this database version; ignored"
+#~ msgstr "δεν ήταν δυνατή η σωστή απόθεση της συνάρτησης συγκεντρωτικών αποτελεσμάτων %s για αυτήν την έκδοση της βάσης δεδομένων· παραβλέπεται"
+
+#~ msgid "bogus value in proargmodes array"
+#~ msgstr "πλαστή τιμή στη συστοιχία proargmodes"
+
+#~ msgid "compression level must be in range 0..9"
+#~ msgstr "το επίπεδο συμπίεσης πρέπει να βρίσκεται στο εύρος 0..9"
+
+#~ msgid "connection to database \"%s\" failed: %s"
+#~ msgstr "σύνδεση στη βάση δεδομένων «%s» απέτυχε: %s"
+
+#~ msgid "could not close tar member"
+#~ msgstr "δεν ήταν δυνατό το κλείσιμο μέλους tar"
+
+#~ msgid "could not connect to database \"%s\": %s"
+#~ msgstr "δεν ήταν δυνατή η σύνδεση στη βάση δεδομένων «%s»: %s"
+
+#~ msgid "could not open temporary file"
+#~ msgstr "δεν ήταν δυνατό το άνοιγμα του προσωρινού αρχείου"
+
+#~ msgid "could not parse extension condition array"
+#~ msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας προϋποθέσεων επέκτασης"
+
+#~ msgid "could not parse extension configuration array"
+#~ msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας ρύθμισεων επέκτασης"
+
+#~ msgid "could not parse proallargtypes array"
+#~ msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας proallargtypes"
+
+#~ msgid "could not parse proargmodes array"
+#~ msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας proargmodes"
+
+#~ msgid "could not parse proargnames array"
+#~ msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας proargnames"
+
+#~ msgid "could not parse proconfig array"
+#~ msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας proconfig"
+
+#~ msgid "could not parse subpublications array"
+#~ msgstr "δεν ήταν δυνατή η ανάλυση της συστοιχίας υποδημοσιεύσεων"
+
+#~ msgid "could not write to large object (result: %lu, expected: %lu)"
+#~ msgstr "δεν ήταν δυνατή η εγγραφή σε μεγάλο αντικείμενο (αποτέλεσμα: %lu, αναμένεται: %lu)"
+
+#~ msgid "extra_float_digits must be in range -15..3"
+#~ msgstr "extra_float_digits πρέπει να βρίσκονται στο εύρος -15..3"
+
+#~ msgid "fatal: "
+#~ msgstr "κρίσιμο: "
+
+#~ msgid "finding check constraints for table \"%s.%s\""
+#~ msgstr "εύρεση περιορισμών ελέγχου για τον πίνακα «%s.%s»"
+
+#~ msgid "finding the columns and types of table \"%s.%s\""
+#~ msgstr "εύρεση των στηλών και των τύπων του πίνακα «%s.%s»"
+
+#~ msgid "invalid number of parallel jobs"
+#~ msgstr "μη έγκυρος αριθμός παράλληλων εργασιών"
+
+#~ msgid "maximum number of parallel jobs is %d"
+#~ msgstr "ο μέγιστος αριθμός παράλληλων εργασιών είναι %d"
+
+#~ msgid "owner of aggregate function \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος της συνάρτησης συγκεντρωτικών αποτελεσμάτων «%s» φαίνεται να μην είναι έγκυρος"
+
+#~ msgid "owner of data type \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος του τύπου δεδομένων «%s» φαίνεται να μην είναι έγκυρος"
+
+#~ msgid "owner of function \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος της συνάρτησης «%s» φαίνεται να μην είναι έγκυρος"
+
+#~ msgid "owner of operator \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος του χειριστή «%s» φαίνεται να μην είναι έγκυρος"
+
+#~ msgid "owner of operator class \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος της κλάσης χειριστή «%s» φαίνεται να μην είναι έγκυρος"
+
+#~ msgid "owner of operator family \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος της οικογένειας χειριστών «%s» φαίνεται να μην είναι έγκυρος"
+
+#~ msgid "owner of publication \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος της δημοσίευσης «%s» φαίνεται να μην είναι έγκυρος"
+
+#~ msgid "owner of schema \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος του σχήματος «%s» φαίνεται να μην είναι έγκυρος"
+
+#~ msgid "owner of subscription \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος της συνδρομής «%s» φαίνεται να μην είναι έγκυρος"
+
+#~ msgid "owner of table \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος του πίνακα «%s» φαίνεται να μην είναι έγκυρος"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "απέτυχε η εντολή pclose: %m"
+
+#~ msgid "reading foreign key constraints for table \"%s.%s\""
+#~ msgstr "ανάγνωση περιορισμών ξένου κλειδιού για τον πίνακα «%s.%s»"
+
+#~ msgid "reading indexes for table \"%s.%s\""
+#~ msgstr "ανάγνωση ευρετηρίων για τον πίνακα «%s.%s»"
+
+#~ msgid "reading policies for table \"%s.%s\""
+#~ msgstr "ανάγνωση πολιτικών για τον πίνακα «%s.%s»"
+
+#~ msgid "reading row security enabled for table \"%s.%s\""
+#~ msgstr "ανάγνωση ενεργοποιημένης ασφάλειας γραμμής για τον πίνακα «%s.%s»"
+
+#~ msgid "reading triggers for table \"%s.%s\""
+#~ msgstr "ανάγνωση εναυσμάτων για τον πίνακα «%s.%s»"
+
+#~ msgid "rows-per-insert must be in range %d..%d"
+#~ msgstr "rows-per-insert πρέπει να βρίσκονται στο εύρος %d..%d"
+
+#~ msgid "select() failed: %m"
+#~ msgstr "απέτυχε το select(): %m"
diff --git a/src/bin/pg_dump/po/es.po b/src/bin/pg_dump/po/es.po
new file mode 100644
index 0000000..237b44f
--- /dev/null
+++ b/src/bin/pg_dump/po/es.po
@@ -0,0 +1,2651 @@
+# Spanish message translation file for pg_dump
+#
+# Copyright (c) 2003-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Manuel Sugawara <masm@fciencias.unam.mx>, 2003.
+# Alvaro Herrera <alvherre@alvh.no-ip.org>, 2004-2007, 2009-2013
+# Carlos Chapi <carloswaldo@babelruins.org>, 2014, 2017, 2021
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:49+0000\n"
+"PO-Revision-Date: 2023-05-08 11:16+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "no se pudo identificar el directorio actual: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "el binario «%s» no es válido"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "no se pudo leer el binario «%s»"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "no se pudo encontrar un «%s» para ejecutar"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "no se pudo cambiar al directorio «%s»: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "no se pudo leer el enlace simbólico «%s»: %m"
+
+#: ../../common/exec.c:422 parallel.c:1611
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falló: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "no se puede duplicar un puntero nulo (error interno)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "la orden no es ejecutable"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "orden no encontrada"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "el proceso hijo terminó con código de salida %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "el proceso hijo fue terminado por una excepción 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "el proceso hijo fue terminado por una señal %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "el proceso hijo terminó con código no reconocido %d"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "el valor «%s» no es válido para la opción %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s debe estar en el rango %d..%d"
+
+#: common.c:134
+#, c-format
+msgid "reading extensions"
+msgstr "leyendo las extensiones"
+
+#: common.c:137
+#, c-format
+msgid "identifying extension members"
+msgstr "identificando miembros de extensión"
+
+#: common.c:140
+#, c-format
+msgid "reading schemas"
+msgstr "leyendo esquemas"
+
+#: common.c:149
+#, c-format
+msgid "reading user-defined tables"
+msgstr "leyendo las tablas definidas por el usuario"
+
+#: common.c:154
+#, c-format
+msgid "reading user-defined functions"
+msgstr "leyendo las funciones definidas por el usuario"
+
+#: common.c:158
+#, c-format
+msgid "reading user-defined types"
+msgstr "leyendo los tipos definidos por el usuario"
+
+#: common.c:162
+#, c-format
+msgid "reading procedural languages"
+msgstr "leyendo los lenguajes procedurales"
+
+#: common.c:165
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "leyendo las funciones de agregación definidas por el usuario"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined operators"
+msgstr "leyendo los operadores definidos por el usuario"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "leyendo los métodos de acceso definidos por el usuario"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "leyendo las clases de operadores definidos por el usuario"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "leyendo las familias de operadores definidas por el usuario"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "leyendo los procesadores (parsers) de búsqueda en texto definidos por el usuario"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "leyendo las plantillas de búsqueda en texto definidas por el usuario"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "leyendo los diccionarios de búsqueda en texto definidos por el usuario"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "leyendo las configuraciones de búsqueda en texto definidas por el usuario"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "leyendo los conectores de datos externos definidos por el usuario"
+
+#: common.c:195
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "leyendo los servidores foráneos definidas por el usuario"
+
+#: common.c:198
+#, c-format
+msgid "reading default privileges"
+msgstr "leyendo los privilegios por omisión"
+
+#: common.c:201
+#, c-format
+msgid "reading user-defined collations"
+msgstr "leyendo los ordenamientos definidos por el usuario"
+
+#: common.c:204
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "leyendo las conversiones definidas por el usuario"
+
+#: common.c:207
+#, c-format
+msgid "reading type casts"
+msgstr "leyendo conversiones de tipo"
+
+#: common.c:210
+#, c-format
+msgid "reading transforms"
+msgstr "leyendo las transformaciones"
+
+#: common.c:213
+#, c-format
+msgid "reading table inheritance information"
+msgstr "leyendo la información de herencia de las tablas"
+
+#: common.c:216
+#, c-format
+msgid "reading event triggers"
+msgstr "leyendo los disparadores por eventos"
+
+#: common.c:220
+#, c-format
+msgid "finding extension tables"
+msgstr "buscando tablas de extensión"
+
+#: common.c:224
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "buscando relaciones de herencia"
+
+#: common.c:227
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "leyendo la información de columnas para las tablas interesantes"
+
+#: common.c:230
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "marcando las columnas heredadas en las subtablas"
+
+#: common.c:233
+#, c-format
+msgid "reading partitioning data"
+msgstr "leyendo datos de particionamiento"
+
+#: common.c:236
+#, c-format
+msgid "reading indexes"
+msgstr "leyendo los índices"
+
+#: common.c:239
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "marcando índices en las tablas particionadas"
+
+#: common.c:242
+#, c-format
+msgid "reading extended statistics"
+msgstr "leyendo estadísticas extendidas"
+
+#: common.c:245
+#, c-format
+msgid "reading constraints"
+msgstr "leyendo las restricciones"
+
+#: common.c:248
+#, c-format
+msgid "reading triggers"
+msgstr "leyendo los disparadores (triggers)"
+
+#: common.c:251
+#, c-format
+msgid "reading rewrite rules"
+msgstr "leyendo las reglas de reescritura"
+
+#: common.c:254
+#, c-format
+msgid "reading policies"
+msgstr "leyendo políticas"
+
+#: common.c:257
+#, c-format
+msgid "reading publications"
+msgstr "leyendo publicaciones"
+
+#: common.c:260
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "leyendo membresía de tablas en publicaciones"
+
+#: common.c:263
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "leyendo membresía de esquemas en publicaciones"
+
+#: common.c:266
+#, c-format
+msgid "reading subscriptions"
+msgstr "leyendo las suscripciones"
+
+#: common.c:345
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "número de padres %d para la tabla «%s» no es válido"
+
+#: common.c:1006
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "falló la revisión de integridad, el OID %u del padre de la tabla «%s» (OID %u) no se encontró"
+
+#: common.c:1045
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "no se pudo interpretar el arreglo numérico «%s»: demasiados números"
+
+#: common.c:1057
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "no se pudo interpretar el arreglo numérico «%s»: carácter no válido en número"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "código de compresión no válido: %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504
+#: compress_io.c:547
+#, c-format
+msgid "not built with zlib support"
+msgstr "no contiene soporte zlib"
+
+#: compress_io.c:236 compress_io.c:333
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "no se pudo inicializar la biblioteca de compresión: %s"
+
+#: compress_io.c:256
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "no se pudo cerrar el flujo comprimido: %s"
+
+#: compress_io.c:273
+#, c-format
+msgid "could not compress data: %s"
+msgstr "no se pudo comprimir datos: %s"
+
+#: compress_io.c:349 compress_io.c:364
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "no se pudo descomprimir datos: %s"
+
+#: compress_io.c:371
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "no se pudo cerrar la biblioteca de compresión: %s"
+
+#: compress_io.c:584 compress_io.c:621
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "no se pudo leer el archivo de entrada: %s"
+
+#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553
+#: pg_backup_tar.c:726 pg_backup_tar.c:749
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "no se pudo leer desde el archivo de entrada: fin de archivo"
+
+#: parallel.c:253
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() falló: código de error %d"
+
+#: parallel.c:961
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "no se pudo crear los canales de comunicación: %m"
+
+#: parallel.c:1018
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "no se pudo crear el proceso hijo: %m"
+
+#: parallel.c:1148
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "orden no reconocida recibida del servidor principal: «%s»"
+
+#: parallel.c:1191 parallel.c:1429
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "mensaje no válido recibido del proceso hijo: «%s»"
+
+#: parallel.c:1323
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"no se pudo obtener un lock en la relación «%s»\n"
+"Esto normalmente significa que alguien solicitó un lock ACCESS EXCLUSIVE en la tabla después de que el proceso pg_dump padre había obtenido el lock ACCESS SHARE en la tabla."
+
+#: parallel.c:1412
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "un proceso hijo murió inesperadamente"
+
+#: parallel.c:1534 parallel.c:1652
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "no se pudo escribir al canal de comunicación: %m"
+
+#: parallel.c:1736
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: no se pudo crear el socket: código de error %d"
+
+#: parallel.c:1747
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: no se pudo enlazar: código de error %d"
+
+#: parallel.c:1754
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: no se pudo escuchar: código de error %d"
+
+#: parallel.c:1761
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s() falló: código de error %d"
+
+#: parallel.c:1772
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: no se pudo crear el segundo socket: código de error %d"
+
+#: parallel.c:1781
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: no se pudo conectar el socket: código de error %d"
+
+#: parallel.c:1790
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: no se pudo aceptar la conexión: código de error %d"
+
+#: pg_backup_archiver.c:280 pg_backup_archiver.c:1632
+#, c-format
+msgid "could not close output file: %m"
+msgstr "no se pudo cerrar el archivo de salida: %m"
+
+#: pg_backup_archiver.c:324 pg_backup_archiver.c:328
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "elementos del archivo no están en el orden correcto de secciones"
+
+#: pg_backup_archiver.c:334
+#, c-format
+msgid "unexpected section code %d"
+msgstr "código de sección %d inesperado"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "la restauración en paralelo no está soportada con este formato de archivo"
+
+#: pg_backup_archiver.c:375
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "la restauración en paralelo no está soportada con archivos construidos con pg_dump anterior a 8.0"
+
+#: pg_backup_archiver.c:393
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)"
+msgstr "no se puede reestablecer desde un archivo comprimido (la compresión no está soportada en esta instalación)"
+
+#: pg_backup_archiver.c:410
+#, c-format
+msgid "connecting to database for restore"
+msgstr "conectando a la base de datos para reestablecimiento"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "las conexiones directas a la base de datos no están soportadas en archivadores pre-1.3"
+
+#: pg_backup_archiver.c:455
+#, c-format
+msgid "implied data-only restore"
+msgstr "asumiendo reestablecimiento de sólo datos"
+
+#: pg_backup_archiver.c:521
+#, c-format
+msgid "dropping %s %s"
+msgstr "eliminando %s %s"
+
+#: pg_backup_archiver.c:621
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "no se pudo encontrar dónde insertar IF EXISTS en la sentencia «%s»"
+
+#: pg_backup_archiver.c:777 pg_backup_archiver.c:779
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "precaución desde el archivo original: %s"
+
+#: pg_backup_archiver.c:794
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "creando %s «%s.%s»"
+
+#: pg_backup_archiver.c:797
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "creando %s «%s»"
+
+#: pg_backup_archiver.c:847
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "conectando a nueva base de datos «%s»"
+
+#: pg_backup_archiver.c:874
+#, c-format
+msgid "processing %s"
+msgstr "procesando %s"
+
+#: pg_backup_archiver.c:896
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "procesando datos de la tabla «%s.%s»"
+
+#: pg_backup_archiver.c:966
+#, c-format
+msgid "executing %s %s"
+msgstr "ejecutando %s %s"
+
+#: pg_backup_archiver.c:1005
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "deshabilitando disparadores (triggers) para %s"
+
+#: pg_backup_archiver.c:1031
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "habilitando disparadores (triggers) para %s"
+
+#: pg_backup_archiver.c:1096
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "error interno -- WriteData no puede ser llamada fuera del contexto de una rutina DataDumper"
+
+#: pg_backup_archiver.c:1279
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "la extracción de objetos grandes no está soportada en el formato seleccionado"
+
+#: pg_backup_archiver.c:1337
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "se reestableció %d objeto grande"
+msgstr[1] "se reestablecieron %d objetos grandes"
+
+#: pg_backup_archiver.c:1358 pg_backup_tar.c:669
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "reestableciendo objeto grande con OID %u"
+
+#: pg_backup_archiver.c:1370
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "no se pudo crear el objeto grande %u: %s"
+
+#: pg_backup_archiver.c:1375 pg_dump.c:3607
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "no se pudo abrir el objeto grande %u: %s"
+
+#: pg_backup_archiver.c:1431
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "no se pudo abrir el archivo TOC «%s»: %m"
+
+#: pg_backup_archiver.c:1459
+#, c-format
+msgid "line ignored: %s"
+msgstr "línea ignorada: %s"
+
+#: pg_backup_archiver.c:1466
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "no se pudo encontrar una entrada para el ID %d"
+
+#: pg_backup_archiver.c:1489 pg_backup_directory.c:222
+#: pg_backup_directory.c:599
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "no se pudo cerrar el archivo TOC: %m"
+
+#: pg_backup_archiver.c:1603 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:586 pg_backup_directory.c:649
+#: pg_backup_directory.c:668 pg_dumpall.c:476
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "no se pudo abrir el archivo de salida «%s»: %m"
+
+#: pg_backup_archiver.c:1605 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "no se pudo abrir el archivo de salida: %m"
+
+#: pg_backup_archiver.c:1699
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "se escribió %zu byte de los datos del objeto grande (resultado = %d)"
+msgstr[1] "se escribieron %zu bytes de los datos del objeto grande (resultado = %d)"
+
+#: pg_backup_archiver.c:1705
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "no se pudo escribir en objeto grande: %s"
+
+#: pg_backup_archiver.c:1795
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "durante INICIALIZACIÓN:"
+
+#: pg_backup_archiver.c:1800
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "durante PROCESAMIENTO DE TABLA DE CONTENIDOS:"
+
+#: pg_backup_archiver.c:1805
+#, c-format
+msgid "while FINALIZING:"
+msgstr "durante FINALIZACIÓN:"
+
+#: pg_backup_archiver.c:1810
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "en entrada de la tabla de contenidos %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1886
+#, c-format
+msgid "bad dumpId"
+msgstr "dumpId incorrecto"
+
+#: pg_backup_archiver.c:1907
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "dumpId de tabla incorrecto para elemento TABLE DATA"
+
+#: pg_backup_archiver.c:1999
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "bandera de posición inesperada %d"
+
+#: pg_backup_archiver.c:2012
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "el posición en el archivo es demasiado grande"
+
+#: pg_backup_archiver.c:2150 pg_backup_archiver.c:2160
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "nombre de directorio demasiado largo: «%s»"
+
+#: pg_backup_archiver.c:2168
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "el directorio «%s» no parece ser un archivador válido (no existe «toc.dat»)"
+
+#: pg_backup_archiver.c:2176 pg_backup_custom.c:173 pg_backup_custom.c:807
+#: pg_backup_directory.c:207 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "no se pudo abrir el archivo de entrada «%s»: %m"
+
+#: pg_backup_archiver.c:2183 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "no se pudo abrir el archivo de entrada: %m"
+
+#: pg_backup_archiver.c:2189
+#, c-format
+msgid "could not read input file: %m"
+msgstr "no se pudo leer el archivo de entrada: %m"
+
+#: pg_backup_archiver.c:2191
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "el archivo de entrada es demasiado corto (leidos %lu, esperados 5)"
+
+#: pg_backup_archiver.c:2223
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "el archivo de entrada parece ser un volcado de texto. Por favor use psql."
+
+#: pg_backup_archiver.c:2229
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "el archivo de entrada no parece ser un archivador válido (¿demasiado corto?)"
+
+#: pg_backup_archiver.c:2235
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "el archivo de entrada no parece ser un archivador válido"
+
+#: pg_backup_archiver.c:2244
+#, c-format
+msgid "could not close input file: %m"
+msgstr "no se pudo cerrar el archivo de entrada: %m"
+
+#: pg_backup_archiver.c:2361
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "formato de archivo no reconocido «%d»"
+
+#: pg_backup_archiver.c:2443 pg_backup_archiver.c:4505
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "terminó el elemento %d %s %s"
+
+#: pg_backup_archiver.c:2447 pg_backup_archiver.c:4518
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "el proceso hijo falló: código de salida %d"
+
+#: pg_backup_archiver.c:2568
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "la entrada con ID %d está fuera de rango -- tal vez la tabla de contenido está corrupta"
+
+#: pg_backup_archiver.c:2648
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "restaurar tablas WITH OIDS ya no está soportado"
+
+#: pg_backup_archiver.c:2730
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "no se reconoce la codificación: «%s»"
+
+#: pg_backup_archiver.c:2735
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "elemento ENCODING no válido: %s"
+
+#: pg_backup_archiver.c:2753
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "elemento STDSTRINGS no válido: %s"
+
+#: pg_backup_archiver.c:2778
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "esquema «%s» no encontrado"
+
+#: pg_backup_archiver.c:2785
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "tabla «%s» no encontrada"
+
+#: pg_backup_archiver.c:2792
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "índice «%s» no encontrado"
+
+#: pg_backup_archiver.c:2799
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "función «%s» no encontrada"
+
+#: pg_backup_archiver.c:2806
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "disparador «%s» no encontrado"
+
+#: pg_backup_archiver.c:3203
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "no se pudo establecer el usuario de sesión a «%s»: %s"
+
+#: pg_backup_archiver.c:3340
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "no se pudo definir search_path a «%s»: %s"
+
+#: pg_backup_archiver.c:3402
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "no se pudo definir default_tablespace a %s: %s"
+
+#: pg_backup_archiver.c:3452
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "no se pudo definir default_table_access_method: %s"
+
+#: pg_backup_archiver.c:3546 pg_backup_archiver.c:3711
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "no se sabe cómo establecer el dueño para el objeto de tipo «%s»"
+
+#: pg_backup_archiver.c:3814
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "no se encontró la cadena mágica en el encabezado del archivo"
+
+#: pg_backup_archiver.c:3828
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "versión no soportada (%d.%d) en el encabezado del archivo"
+
+#: pg_backup_archiver.c:3833
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "revisión de integridad en el tamaño del entero (%lu) falló"
+
+#: pg_backup_archiver.c:3837
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "el archivador fue hecho en una máquina con enteros más grandes, algunas operaciones podrían fallar"
+
+#: pg_backup_archiver.c:3847
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "el formato esperado (%d) difiere del formato encontrado en el archivo (%d)"
+
+#: pg_backup_archiver.c:3862
+#, c-format
+msgid "archive is compressed, but this installation does not support compression -- no data will be available"
+msgstr "el archivador está comprimido, pero esta instalación no soporta compresión -- no habrá datos disponibles"
+
+#: pg_backup_archiver.c:3896
+#, c-format
+msgid "invalid creation date in header"
+msgstr "la fecha de creación en el encabezado no es válida"
+
+#: pg_backup_archiver.c:4030
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "procesando el elemento %d %s %s"
+
+#: pg_backup_archiver.c:4109
+#, c-format
+msgid "entering main parallel loop"
+msgstr "ingresando al bucle paralelo principal"
+
+#: pg_backup_archiver.c:4120
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "saltando el elemento %d %s %s"
+
+#: pg_backup_archiver.c:4129
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "lanzando el elemento %d %s %s"
+
+#: pg_backup_archiver.c:4183
+#, c-format
+msgid "finished main parallel loop"
+msgstr "terminó el bucle paralelo principal"
+
+#: pg_backup_archiver.c:4219
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "procesando el elemento saltado %d %s %s"
+
+#: pg_backup_archiver.c:4824
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "la tabla «%s» no pudo ser creada, no se recuperarán sus datos"
+
+#: pg_backup_custom.c:376 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "OID no válido para objeto grande"
+
+#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629
+#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021
+#, c-format
+msgid "error during file seek: %m"
+msgstr "error durante el posicionamiento (seek) en el archivo: %m"
+
+#: pg_backup_custom.c:478
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "el bloque de datos %d tiene una posición de búsqueda incorrecta"
+
+#: pg_backup_custom.c:495
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "tipo de bloque de datos (%d) no conocido al buscar en el archivador"
+
+#: pg_backup_custom.c:517
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "no se pudo encontrar el bloque con ID %d en archivo -- posiblemente debido a una petición de restauración fuera de orden, la que no puede ser completada debido a que en el archivo de entrada no es reposicionable (seekable)"
+
+#: pg_backup_custom.c:522
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "no se pudo encontrar el bloque con ID %d en archivo -- posiblemente el archivo está corrupto"
+
+#: pg_backup_custom.c:529
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "se encontró un bloque no esperado ID (%d) mientras se leían los datos -- se esperaba %d"
+
+#: pg_backup_custom.c:543
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "se encontró un bloque tipo %d no reconocido al restablecer el archivador"
+
+#: pg_backup_custom.c:645
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "no se pudo leer el archivo de entrada: %m"
+
+#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943
+#: pg_backup_tar.c:1019
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "no se pudo determinar la posición (seek) en el archivo del archivador: %m"
+
+#: pg_backup_custom.c:762 pg_backup_custom.c:802
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "no se pudo cerrar el archivo del archivador: %m"
+
+#: pg_backup_custom.c:785
+#, c-format
+msgid "can only reopen input archives"
+msgstr "sólo se pueden reabrir archivos de entrada"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "la restauración en paralelo desde entrada estándar (stdin) no está soportada"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "la restauración en paralelo desde un archivo no posicionable no está soportada"
+
+#: pg_backup_custom.c:810
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "no se pudo posicionar (seek) en el archivo del archivador: %m"
+
+#: pg_backup_custom.c:889
+#, c-format
+msgid "compressor active"
+msgstr "compresor activo"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "no se pudo obtener server_version desde libpq"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1646
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "abortando debido a que no coincide la versión del servidor"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1647
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "versión del servidor: %s; versión de %s: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "ya está conectado a una base de datos"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595
+msgid "Password: "
+msgstr "Contraseña: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "no se pudo hacer la conexión a la base de datos"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "falló la reconexión: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dumpall.c:1520 pg_dumpall.c:1604
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732
+#, c-format
+msgid "query failed: %s"
+msgstr "la consulta falló: %s"
+
+#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733
+#, c-format
+msgid "Query was: %s"
+msgstr "La consulta era: %s"
+
+#: pg_backup_db.c:316
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "la consulta regresó %d fila en lugar de una: %s"
+msgstr[1] "la consulta regresó %d filas en lugar de una: %s"
+
+#: pg_backup_db.c:352
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sLa orden era: %s"
+
+#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489
+msgid "could not execute query"
+msgstr "no se pudo ejecutar la consulta"
+
+#: pg_backup_db.c:461
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "PQputCopyData regresó un error: %s"
+
+#: pg_backup_db.c:510
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "PQputCopyEnd regresó un error: %s"
+
+#: pg_backup_db.c:516
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY falló para la tabla «%s»: %s"
+
+#: pg_backup_db.c:522 pg_dump.c:2106
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "resultados extra inesperados durante el COPY de la tabla «%s»"
+
+#: pg_backup_db.c:534
+msgid "could not start database transaction"
+msgstr "no se pudo iniciar la transacción en la base de datos"
+
+#: pg_backup_db.c:542
+msgid "could not commit database transaction"
+msgstr "no se pudo terminar la transacción a la base de datos"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "no se especificó un directorio de salida"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "no se pudo leer el directorio «%s»: %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "no se pudo crear el directorio «%s»: %m"
+
+#: pg_backup_directory.c:355 pg_backup_directory.c:497
+#: pg_backup_directory.c:533
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "no se pudo escribir al archivo de salida: %s"
+
+#: pg_backup_directory.c:373
+#, c-format
+msgid "could not close data file: %m"
+msgstr "no se pudo cerrar el archivo de datos: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo de datos «%s»: %m"
+
+#: pg_backup_directory.c:447
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "no se pudo abrir el archivo de la tabla de contenidos de objetos grandes «%s» para su lectura: %m"
+
+#: pg_backup_directory.c:458
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "línea no válida en el archivo de la tabla de contenido de objetos grandes «%s»: «%s»"
+
+#: pg_backup_directory.c:467
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "error al leer el archivo de la tabla de contenidos de objetos grandes «%s»"
+
+#: pg_backup_directory.c:471
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo de la tabla de contenido de los objetos grandes «%s»: %m"
+
+#: pg_backup_directory.c:685
+#, c-format
+msgid "could not close blob data file: %m"
+msgstr "no se pudo cerrar el archivo de datos de objetos grandes: %m"
+
+#: pg_backup_directory.c:691
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "no se pudo escribir al archivo de la tabla de contenidos de objetos grandes"
+
+#: pg_backup_directory.c:705
+#, c-format
+msgid "could not close blobs TOC file: %m"
+msgstr "no se pudo cerrar el archivo de la tabla de contenidos de objetos grandes: %m"
+
+#: pg_backup_directory.c:724
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "nombre de archivo demasiado largo: «%s»"
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "no se puede leer este formato"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "no se pudo abrir el archivo de tabla de contenido «%s» para escribir: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "no se pudo abrir la tabla de contenido para escribir: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:893
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "la compresión no está soportada por el formato de salida tar"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "no se pudo abrir el archivo de tabla de contenido «%s» para leer: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "no se pudo abrir la tabla de contenido para leer: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "no se pudo encontrar el archivo «%s» en el archivador"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "no se pudo generar el nombre de archivo temporal: %m"
+
+#: pg_backup_tar.c:624
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "sintaxis de sentencia COPY inesperada: «%s»"
+
+#: pg_backup_tar.c:890
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "el OID del objeto grande no es válido (%u)"
+
+#: pg_backup_tar.c:1035
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "no se pudo abrir archivo temporal: %m"
+
+#: pg_backup_tar.c:1038
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "el tamaño real del archivo (%lld) no coincide con el esperado (%lld)"
+
+#: pg_backup_tar.c:1084 pg_backup_tar.c:1115
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "no se pudo encontrar el encabezado para el archivo «%s» en el archivo tar"
+
+#: pg_backup_tar.c:1102
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "la extracción de datos fuera de orden no está soportada en este formato: se requiere «%s», pero viene antes de «%s» en el archivador."
+
+#: pg_backup_tar.c:1149
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "se encontró un encabezado incompleto (%lu byte)"
+msgstr[1] "se encontró un encabezado incompleto (%lu bytes)"
+
+#: pg_backup_tar.c:1188
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "se encontró un encabezado corrupto en %s (esperado %d, calculado %d) en la posición %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "nombre de sección «%s» no reconocido"
+
+#: pg_backup_utils.c:55 pg_dump.c:628 pg_dump.c:645 pg_dumpall.c:340
+#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373
+#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "elementos on_exit_nicely agotados"
+
+#: pg_dump.c:643 pg_dumpall.c:348 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_dump.c:662 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "las opciones -s/--schema-only y -a/--data-only no pueden usarse juntas"
+
+#: pg_dump.c:665
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "las opciones -s/--schema-only y --include-foreign-data no pueden usarse juntas"
+
+#: pg_dump.c:668
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "la opción --include-foreign-data no está soportado con respaldo en paralelo"
+
+#: pg_dump.c:671 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "las opciones -c/--clean y -a/--data-only no pueden usarse juntas"
+
+#: pg_dump.c:674 pg_dumpall.c:378 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "la opción --if-exists requiere la opción -c/--clean"
+
+#: pg_dump.c:681
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "la opción --on-conflict-do-nothing requiere la opción --inserts, --rows-per-insert o --column-inserts"
+
+#: pg_dump.c:703
+#, c-format
+msgid "requested compression not available in this installation -- archive will be uncompressed"
+msgstr "la compresión solicitada no está soportada en esta instalación -- el archivador será sin compresión"
+
+#: pg_dump.c:716
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "el volcado en paralelo sólo está soportado por el formato «directory»"
+
+#: pg_dump.c:762
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "el último OID interno es %u"
+
+#: pg_dump.c:771
+#, c-format
+msgid "no matching schemas were found"
+msgstr "no se encontraron esquemas coincidentes"
+
+#: pg_dump.c:785
+#, c-format
+msgid "no matching tables were found"
+msgstr "no se encontraron tablas coincidentes"
+
+#: pg_dump.c:807
+#, c-format
+msgid "no matching extensions were found"
+msgstr "no se encontraron extensiones coincidentes"
+
+#: pg_dump.c:990
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s extrae una base de datos en formato de texto o en otros formatos.\n"
+"\n"
+
+#: pg_dump.c:991 pg_dumpall.c:605 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_dump.c:992
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPCIÓN]... [NOMBREDB]\n"
+
+#: pg_dump.c:994 pg_dumpall.c:608 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Opciones generales:\n"
+
+#: pg_dump.c:995
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=ARCHIVO nombre del archivo o directorio de salida\n"
+
+#: pg_dump.c:996
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p Formato del archivo de salida (c=personalizado, \n"
+" d=directorio, t=tar, p=texto (por omisión))\n"
+
+#: pg_dump.c:998
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM máximo de procesos paralelos para volcar\n"
+
+#: pg_dump.c:999 pg_dumpall.c:610
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose modo verboso\n"
+
+#: pg_dump.c:1000 pg_dumpall.c:611
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de version y salir\n"
+
+#: pg_dump.c:1001
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 nivel de compresión para formatos comprimidos\n"
+
+#: pg_dump.c:1002 pg_dumpall.c:612
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=SEGS espera a lo más SEGS segundos obtener un lock\n"
+
+#: pg_dump.c:1003 pg_dumpall.c:639
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync no esperar que los cambios se sincronicen a disco\n"
+
+#: pg_dump.c:1004 pg_dumpall.c:613
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: pg_dump.c:1006 pg_dumpall.c:614
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Opciones que controlan el contenido de la salida:\n"
+
+#: pg_dump.c:1007 pg_dumpall.c:615
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only extrae sólo los datos, no el esquema\n"
+
+#: pg_dump.c:1008
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs incluye objetos grandes en la extracción\n"
+
+#: pg_dump.c:1009
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs excluye objetos grandes en la extracción\n"
+
+#: pg_dump.c:1010 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean tira (drop) la base de datos antes de crearla\n"
+
+#: pg_dump.c:1011
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr ""
+" -C, --create incluye órdenes para crear la base de datos\n"
+" en la extracción\n"
+
+#: pg_dump.c:1012
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATRÓN extrae sólo la o las extensiones nombradas\n"
+
+#: pg_dump.c:1013 pg_dumpall.c:617
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=CODIF extrae los datos con la codificación CODIF\n"
+
+#: pg_dump.c:1014
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=PATRÓN extrae sólo el o los esquemas nombrados\n"
+
+#: pg_dump.c:1015
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATRÓN NO extrae el o los esquemas nombrados\n"
+
+#: pg_dump.c:1016
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner en formato de sólo texto, no reestablece\n"
+" los dueños de los objetos\n"
+
+#: pg_dump.c:1018 pg_dumpall.c:621
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only extrae sólo el esquema, no los datos\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAME superusuario a utilizar en el volcado de texto\n"
+
+#: pg_dump.c:1020
+#, c-format
+msgid " -t, --table=PATTERN dump the specified table(s) only\n"
+msgstr " -t, --table=PATRÓN extrae sólo la o las tablas nombradas\n"
+
+#: pg_dump.c:1021
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATRÓN NO extrae la o las tablas nombradas\n"
+
+#: pg_dump.c:1022 pg_dumpall.c:624
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges no extrae los privilegios (grant/revoke)\n"
+
+#: pg_dump.c:1023 pg_dumpall.c:625
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade sólo para uso de utilidades de upgrade\n"
+
+#: pg_dump.c:1024 pg_dumpall.c:626
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr ""
+" --column-inserts extrae los datos usando INSERT con nombres\n"
+" de columnas\n"
+
+#: pg_dump.c:1025 pg_dumpall.c:627
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr ""
+" --disable-dollar-quoting deshabilita el uso de «delimitadores de dólar»,\n"
+" usa delimitadores de cadena estándares\n"
+
+#: pg_dump.c:1026 pg_dumpall.c:628 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr ""
+" --disable-triggers deshabilita los disparadores (triggers) durante el\n"
+" restablecimiento de la extracción de sólo-datos\n"
+
+#: pg_dump.c:1027
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security activa seguridad de filas (volcar sólo el\n"
+" contenido al que el usuario tiene acceso)\n"
+
+#: pg_dump.c:1029
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=PATRÓN NO extrae los datos de la(s) tablas nombradas\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:630
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM usa este valor para extra_float_digits\n"
+
+#: pg_dump.c:1031 pg_dumpall.c:631 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists usa IF EXISTS al eliminar objetos\n"
+
+#: pg_dump.c:1032
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=PATRÓN\n"
+" incluye datos de tablas foráneas en servidores\n"
+" que coinciden con PATRÓN\n"
+
+#: pg_dump.c:1035 pg_dumpall.c:632
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts extrae los datos usando INSERT, en vez de COPY\n"
+
+#: pg_dump.c:1036 pg_dumpall.c:633
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root cargar particiones a través de tabla raíz\n"
+
+#: pg_dump.c:1037 pg_dumpall.c:634
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments no volcar los comentarios\n"
+
+#: pg_dump.c:1038 pg_dumpall.c:635
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications no volcar las publicaciones\n"
+
+#: pg_dump.c:1039 pg_dumpall.c:637
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels no volcar asignaciones de etiquetas de seguridad\n"
+
+#: pg_dump.c:1040 pg_dumpall.c:638
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions no volcar las suscripciones\n"
+
+#: pg_dump.c:1041 pg_dumpall.c:640
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-tablespaces no volcar métodos de acceso de tablas\n"
+
+#: pg_dump.c:1042 pg_dumpall.c:641
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces no volcar asignaciones de tablespace\n"
+
+#: pg_dump.c:1043 pg_dumpall.c:642
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression no volcar métodos de compresión TOAST\n"
+
+#: pg_dump.c:1044 pg_dumpall.c:643
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data no volcar datos de tablas unlogged\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:644
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing agregar ON CONFLICT DO NOTHING a órdenes INSERT\n"
+
+#: pg_dump.c:1046 pg_dumpall.c:645
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr ""
+" --quote-all-identifiers entrecomilla todos los identificadores, incluso\n"
+" si no son palabras clave\n"
+
+#: pg_dump.c:1047 pg_dumpall.c:646
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NUMFILAS número de filas por INSERT; implica --inserts\n"
+
+#: pg_dump.c:1048
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=SECCIÓN volcar la sección nombrada (pre-data, data,\n"
+" post-data)\n"
+
+#: pg_dump.c:1049
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr ""
+" --serializable-deferrable espera hasta que el respaldo pueda completarse\n"
+" sin anomalías\n"
+
+#: pg_dump.c:1050
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT use el snapshot dado para la extracción\n"
+
+#: pg_dump.c:1051 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names requerir al menos una coincidencia para cada patrón\n"
+" de nombre de tablas y esquemas\n"
+
+#: pg_dump.c:1053 pg_dumpall.c:647 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" usa órdenes SESSION AUTHORIZATION en lugar de\n"
+" ALTER OWNER para cambiar los dueño de los objetos\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:651 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opciones de conexión:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=NOMBRE nombre de la base de datos que volcar\n"
+
+#: pg_dump.c:1059 pg_dumpall.c:653 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=ANFITRIÓN anfitrión de la base de datos o\n"
+" directorio del enchufe (socket)\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:655 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PUERTO número del puerto de la base de datos\n"
+
+#: pg_dump.c:1061 pg_dumpall.c:656 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=USUARIO nombre de usuario con el cual conectarse\n"
+
+#: pg_dump.c:1062 pg_dumpall.c:657 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pedir una contraseña\n"
+
+#: pg_dump.c:1063 pg_dumpall.c:658 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password fuerza un prompt para la contraseña\n"
+" (debería ser automático)\n"
+
+#: pg_dump.c:1064 pg_dumpall.c:659
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROL ejecuta SET ROLE antes del volcado\n"
+
+#: pg_dump.c:1066
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si no se especifica un nombre de base de datos, se utiliza el valor\n"
+"de la variable de ambiente PGDATABASE.\n"
+"\n"
+
+#: pg_dump.c:1068 pg_dumpall.c:663 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Reporte errores a <%s>.\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:664 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_dump.c:1088 pg_dumpall.c:488
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "la codificación de cliente especificada «%s» no es válida"
+
+#: pg_dump.c:1226
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "Los volcados en paralelo desde servidores standby no están soportados por esta versión de servidor."
+
+#: pg_dump.c:1291
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "el formato de salida especificado «%s» no es válido"
+
+#: pg_dump.c:1332 pg_dump.c:1388 pg_dump.c:1441 pg_dumpall.c:1282
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "el nombre no es válido (demasiados puntos): %s"
+
+#: pg_dump.c:1340
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "no se encontraron esquemas coincidentes para el patrón «%s»"
+
+#: pg_dump.c:1393
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "no se encontraron extensiones coincidentes para el patrón «%s»"
+
+#: pg_dump.c:1446
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "no se encontraron servidores foráneos coincidentes para el patrón «%s»"
+
+#: pg_dump.c:1509
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "el nombre de relación no es válido (demasiados puntos): %s"
+
+#: pg_dump.c:1520
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "no se encontraron tablas coincidentes para el patrón «%s»"
+
+#: pg_dump.c:1547
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "No está conectado a una base de datos."
+
+#: pg_dump.c:1550
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "no están implementadas las referencias entre bases de datos: %s"
+
+#: pg_dump.c:1981
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "extrayendo el contenido de la tabla «%s.%s»"
+
+#: pg_dump.c:2087
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Falló la extracción del contenido de la tabla «%s»: PQgetCopyData() falló."
+
+#: pg_dump.c:2088 pg_dump.c:2098
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Mensaje de error del servidor: %s"
+
+#: pg_dump.c:2089 pg_dump.c:2099
+#, c-format
+msgid "Command was: %s"
+msgstr "La orden era: % s"
+
+#: pg_dump.c:2097
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Falló la extracción del contenido de la tabla «%s»: PQgetResult() falló."
+
+#: pg_dump.c:2179
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "se obtuvo un número incorrecto de campos de la tabla «%s»"
+
+#: pg_dump.c:2875
+#, c-format
+msgid "saving database definition"
+msgstr "salvando las definiciones de la base de datos"
+
+#: pg_dump.c:2971
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "proveedor de configuración regional no reconocido: %s"
+
+#: pg_dump.c:3317
+#, c-format
+msgid "saving encoding = %s"
+msgstr "salvando codificaciones = %s"
+
+#: pg_dump.c:3342
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "salvando standard_conforming_strings = %s"
+
+#: pg_dump.c:3381
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "no se pudo interpretar la salida de current_schemas()"
+
+#: pg_dump.c:3400
+#, c-format
+msgid "saving search_path = %s"
+msgstr "salvando search_path = %s"
+
+#: pg_dump.c:3438
+#, c-format
+msgid "reading large objects"
+msgstr "leyendo objetos grandes"
+
+#: pg_dump.c:3576
+#, c-format
+msgid "saving large objects"
+msgstr "salvando objetos grandes"
+
+#: pg_dump.c:3617
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "error al leer el objeto grande %u: %s"
+
+#: pg_dump.c:3723
+#, c-format
+msgid "reading row-level security policies"
+msgstr "leyendo políticas de seguridad a nivel de registros"
+
+#: pg_dump.c:3864
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "tipo de orden inesperada en política: %c"
+
+#: pg_dump.c:4314 pg_dump.c:4632 pg_dump.c:11833 pg_dump.c:17684
+#: pg_dump.c:17686 pg_dump.c:18307
+#, c-format
+msgid "could not parse %s array"
+msgstr "no se pudo interpretar el arreglo %s"
+
+#: pg_dump.c:4500
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "no se volcaron las suscripciones porque el usuario actual no es un superusuario"
+
+#: pg_dump.c:5014
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "no se pudo encontrar la extensión padre para %s %s"
+
+#: pg_dump.c:5159
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "no existe el esquema con OID %u"
+
+#: pg_dump.c:6613 pg_dump.c:16948
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "falló la revisión de integridad, no se encontró la tabla padre con OID %u de la secuencia con OID %u"
+
+#: pg_dump.c:6756
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "falló la revisión de integridad, el OID %u que aparece en pg_partitioned_table no fue encontrado"
+
+#: pg_dump.c:6987 pg_dump.c:7254 pg_dump.c:7725 pg_dump.c:8392 pg_dump.c:8513
+#: pg_dump.c:8667
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "OID de tabla %u no reconocido"
+
+#: pg_dump.c:6991
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "datos de índice inesperados para la tabla «%s»"
+
+#: pg_dump.c:7486
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "falló la revisión de integridad, no se encontró la tabla padre con OID %u del elemento con OID %u de pg_rewrite"
+
+#: pg_dump.c:7777
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "la consulta produjo un nombre de tabla nulo para la llave foránea del disparador \"%s\" en la tabla «%s» (OID de la tabla: %u)"
+
+#: pg_dump.c:8396
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "información de columnas para la tabla «%s» inesperada"
+
+#: pg_dump.c:8426
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "numeración de columnas no válida en la tabla «%s»"
+
+#: pg_dump.c:8475
+#, c-format
+msgid "finding table default expressions"
+msgstr "encontrando expresiones default de tablas"
+
+#: pg_dump.c:8517
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "el valor de adnum %d para la tabla «%s» no es válido"
+
+#: pg_dump.c:8617
+#, c-format
+msgid "finding table check constraints"
+msgstr "encontrando restricciones CHECK de tablas"
+
+#: pg_dump.c:8671
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "se esperaban %d restricciones CHECK en la tabla «%s» pero se encontraron %d"
+msgstr[1] "se esperaban %d restricciones CHECK en la tabla «%s» pero se encontraron %d"
+
+#: pg_dump.c:8675
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "Los catálogos del sistema podrían estar corruptos."
+
+#: pg_dump.c:9365
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "no existe el rol con OID %u"
+
+#: pg_dump.c:9477 pg_dump.c:9506
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "entrada en pg_init_privs no soportada: %u %u %d"
+
+#: pg_dump.c:10327
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "el typtype del tipo «%s» parece no ser válido"
+
+#: pg_dump.c:11902
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "el valor del atributo «provolatile» para la función «%s» es desconocido"
+
+#: pg_dump.c:11952 pg_dump.c:13777
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "el valor del atributo «proparallel» para la función «%s» es desconocido"
+
+#: pg_dump.c:12083 pg_dump.c:12189 pg_dump.c:12196
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "no se encontró la definición de la función con OID %u"
+
+#: pg_dump.c:12122
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "valor no válido en los campos pg_cast.castfunc o pg_cast.castmethod"
+
+#: pg_dump.c:12125
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "valor no válido en el campo pg_cast.castmethod"
+
+#: pg_dump.c:12215
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "definición errónea de transformación; al menos uno de trffromsql y trftosql debe ser distinto de cero"
+
+#: pg_dump.c:12232
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "valor erróneo en el campo pg_transform.trffromsql"
+
+#: pg_dump.c:12253
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "valor erróneo en el campo pg_transform.trftosql"
+
+#: pg_dump.c:12398
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "los operadores postfix ya no están soportados (operador «%s»)"
+
+#: pg_dump.c:12568
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "no se pudo encontrar el operador con OID %s"
+
+#: pg_dump.c:12636
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "el tipo «%c» para el método de acceso «%s» no es válido"
+
+#: pg_dump.c:13278
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "proveedor de ordenamiento no reconocido: %s"
+
+#: pg_dump.c:13696
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "valor de aggfinalmodify no reconocido para la agregación «%s»"
+
+#: pg_dump.c:13752
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "valor de aggmfinalmodify no reconocido para la agregación «%s»"
+
+#: pg_dump.c:14470
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "tipo de objeto desconocido en privilegios por omisión: %d"
+
+#: pg_dump.c:14486
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "no se pudo interpretar la lista de ACL (%s)"
+
+#: pg_dump.c:14568
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "no se pudo interpretar la lista ACL inicial (%s) o por defecto (%s) para el objeto «%s» (%s)"
+
+#: pg_dump.c:14593
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "no se pudo interpretar la lista de ACL (%s) o por defecto (%s) para el objeto «%s» (%s)"
+
+#: pg_dump.c:15131
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "la consulta para obtener la definición de la vista «%s» no regresó datos"
+
+#: pg_dump.c:15134
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "la consulta para obtener la definición de la vista «%s» regresó más de una definición"
+
+#: pg_dump.c:15141
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "la definición de la vista «%s» parece estar vacía (tamaño cero)"
+
+#: pg_dump.c:15225
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS ya no está soportado (tabla «%s»)"
+
+#: pg_dump.c:16154
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "el número de columna %d no es válido para la tabla «%s»"
+
+#: pg_dump.c:16232
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "no se pudieron interpretar columnas de estadísticas de índices"
+
+#: pg_dump.c:16234
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "no se pudieron interpretar valores de estadísticas de índices"
+
+#: pg_dump.c:16236
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "no coincide el número de columnas con el de valores para estadísticas de índices"
+
+#: pg_dump.c:16454
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "falta un índice para restricción «%s»"
+
+#: pg_dump.c:16682
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "tipo de restricción inesperado: %c"
+
+#: pg_dump.c:16783 pg_dump.c:17012
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "la consulta para obtener los datos de la secuencia «%s» regresó %d entrada, pero se esperaba 1"
+msgstr[1] "la consulta para obtener los datos de la secuencia «%s» regresó %d entradas, pero se esperaba 1"
+
+#: pg_dump.c:16815
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "tipo no reconocido de secuencia: %s"
+
+#: pg_dump.c:17104
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "tgtype no esperado: %d"
+
+#: pg_dump.c:17176
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "argumento de cadena (%s) no válido para el disparador (trigger) «%s» en la tabla «%s»"
+
+#: pg_dump.c:17445
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "la consulta para obtener la regla «%s» asociada con la tabla «%s» falló: retornó un número incorrecto de renglones"
+
+#: pg_dump.c:17598
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "no se pudo encontrar la extensión referenciada %u"
+
+#: pg_dump.c:17688
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "no coincide el número de configuraciones con el de condiciones para extensión"
+
+#: pg_dump.c:17820
+#, c-format
+msgid "reading dependency data"
+msgstr "obteniendo datos de dependencias"
+
+#: pg_dump.c:17906
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "no existe el objeto referenciante %u %u"
+
+#: pg_dump.c:17917
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "no existe el objeto referenciado %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "dumpId %d no válido"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "dependencia %d no válida"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "no se pudo identificar bucle de dependencia"
+
+#: pg_dump_sort.c:1232
+#, c-format
+msgid "there are circular foreign-key constraints on this table:"
+msgid_plural "there are circular foreign-key constraints among these tables:"
+msgstr[0] "hay restricciones de llave foránea circulares en la siguiente tabla:"
+msgstr[1] "hay restricciones de llave foránea circulares entre las siguientes tablas:"
+
+#: pg_dump_sort.c:1236 pg_dump_sort.c:1256
+#, c-format
+msgid " %s"
+msgstr " %s"
+
+#: pg_dump_sort.c:1237
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "Puede no ser capaz de restaurar el respaldo sin usar --disable-triggers o temporalmente eliminar las restricciones."
+
+#: pg_dump_sort.c:1238
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "Considere usar un volcado completo en lugar de --data-only para evitar este problema."
+
+#: pg_dump_sort.c:1250
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "no se pudo resolver el bucle de dependencias entre los siguientes elementos:"
+
+#: pg_dumpall.c:205
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "el programa «%s» es requerido por %s, pero no fue encontrado en el mismo directorio que «%s»"
+
+#: pg_dumpall.c:208
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "el programa «%s» fue encontrado por «%s», pero no es de la misma versión que %s"
+
+#: pg_dumpall.c:357
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "la opción --exclude-database no puede ser usada junto con -g/--globals-only, -r/--roles-only o -t/--tablespaces-only"
+
+#: pg_dumpall.c:365
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "las opciones -g/--globals-only y -r/--roles-only no pueden usarse juntas"
+
+#: pg_dumpall.c:372
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "las opciones -g/--globals-only y -t/--tablespaces-only no pueden usarse juntas"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "las opciones -r/--roles-only y -t/--tablespaces-only no pueden usarse juntas"
+
+#: pg_dumpall.c:444 pg_dumpall.c:1587
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "no se pudo establecer la conexión a la base de datos «%s»"
+
+#: pg_dumpall.c:456
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"no se pudo establecer la conexión a las bases de datos «postgres» o\n"
+"«template1». Por favor especifique una base de datos para conectarse."
+
+#: pg_dumpall.c:604
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s extrae un cluster de bases de datos de PostgreSQL en un archivo\n"
+"guión (script) SQL.\n"
+"\n"
+
+#: pg_dumpall.c:606
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPCIÓN]...\n"
+
+#: pg_dumpall.c:609
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=ARCHIVO nombre del archivo de salida\n"
+
+#: pg_dumpall.c:616
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean tira (drop) la base de datos antes de crearla\n"
+
+#: pg_dumpall.c:618
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only extrae sólo los objetos globales, no bases de datos\n"
+
+#: pg_dumpall.c:619 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner no reestablece los dueños de los objetos\n"
+
+#: pg_dumpall.c:620
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr ""
+" -r, --roles-only extrae sólo los roles, no bases de datos\n"
+" ni tablespaces\n"
+
+#: pg_dumpall.c:622
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr ""
+" -S, --superuser=NAME especifica el nombre del superusuario a usar en\n"
+" el volcado\n"
+
+#: pg_dumpall.c:623
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr ""
+" -t, --tablespaces-only extrae sólo los tablespaces, no bases de datos\n"
+" ni roles\n"
+
+#: pg_dumpall.c:629
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=PATRÓN excluir bases de datos cuyos nombres coinciden con el patrón\n"
+
+#: pg_dumpall.c:636
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords no extraer contraseñas para roles\n"
+
+#: pg_dumpall.c:652
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONNSTR conectar usando la cadena de conexión\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=NOMBRE especifica la base de datos a la cual conectarse\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Si no se usa -f/--file, el volcado de SQL será escrito a la salida estándar.\n"
+"\n"
+
+#: pg_dumpall.c:803
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "omitido nombre de rol que empieza con «pg_» (%s)"
+
+#: pg_dumpall.c:1018
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "no se pudo interpretar la lista de control de acceso (%s) del parámetro «%s»"
+
+#: pg_dumpall.c:1136
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "no se pudo interpretar la lista de control de acceso (%s) del tablespace «%s»"
+
+#: pg_dumpall.c:1343
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "excluyendo base de datos «%s»"
+
+#: pg_dumpall.c:1347
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "extrayendo base de datos «%s»"
+
+#: pg_dumpall.c:1378
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump falló en la base de datos «%s», saliendo"
+
+#: pg_dumpall.c:1384
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "no se pudo reabrir el archivo de salida «%s»: %m"
+
+#: pg_dumpall.c:1425
+#, c-format
+msgid "running \"%s\""
+msgstr "ejecutando «%s»"
+
+#: pg_dumpall.c:1630
+#, c-format
+msgid "could not get server version"
+msgstr "no se pudo obtener la versión del servidor"
+
+#: pg_dumpall.c:1633
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "no se pudo interpretar la versión del servidor «%s»"
+
+#: pg_dumpall.c:1703 pg_dumpall.c:1726
+#, c-format
+msgid "executing %s"
+msgstr "ejecutando %s"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "una de las opciones -d/--dbname y -f/--file debe especificarse"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "las opciones -d/--dbname y -f/--file no pueden usarse juntas"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "las opciones -c/--clean y -1/--single-transaction no pueden usarse juntas"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "no se puede especificar --single-transaction junto con múltiples tareas"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "formato de archivo «%s» no reconocido; por favor especifique «c», «d» o «t»"
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "errores ignorados durante la recuperación: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s reestablece una base de datos de PostgreSQL usando un archivo\n"
+"creado por pg_dump.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [OPCIÓN]... [ARCHIVO]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NOMBRE nombre de la base de datos a la que conectarse\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=ARCHIVO nombre del archivo de salida (- para stdout)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t formato del volcado (debería ser automático)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr ""
+" -l, --list imprime una tabla resumida de contenidos\n"
+" del archivador\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose modo verboso\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Opciones que controlan la recuperación:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only reestablece sólo los datos, no el esquema\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create crea la base de datos de destino\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr ""
+" -e, --exit-on-error abandonar al encontrar un error\n"
+" por omisión, se continúa la restauración\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NOMBRE reestablece el índice nombrado\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM máximo de procesos paralelos para restaurar\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=ARCHIVO usa la tabla de contenido especificada para ordenar\n"
+" la salida de este archivo\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME reestablece sólo los objetos en este esquema\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME no reestablecer los objetos en este esquema\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NOMBRE(args) reestablece la función nombrada\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only reestablece el esquema únicamente, no los datos\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr ""
+" -S, --superuser=NOMBRE especifica el nombre del superusuario que se usa\n"
+" para deshabilitar los disparadores (triggers)\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NOMBRE reestablece la relación (tabla, vista, etc.) nombrada\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NOMBRE reestablece el disparador (trigger) nombrado\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges no reestablece los privilegios (grant/revoke)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction reestablece en una única transacción\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security activa seguridad de filas\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments no restaurar comentarios\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables no reestablece datos de tablas que no pudieron\n"
+" ser creadas\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications no restaurar publicaciones\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels no restaura etiquetas de seguridad\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions no restaurar suscripciones\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method no restaura métodos de acceso de tablas\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces no restaura asignaciones de tablespace\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=SECCIÓN reestablece la sección nombrada (pre-data, data\n"
+" post-data)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME hace SET ROLE antes de restaurar\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Las opciones -I, -n, -N, -P, -t, -T, y --section pueden ser combinadas y especificadas\n"
+"varias veces para seleccionar varios objetos.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si no se especifica un archivo de entrada, se usa la entrada estándar.\n"
+"\n"
diff --git a/src/bin/pg_dump/po/fr.po b/src/bin/pg_dump/po/fr.po
new file mode 100644
index 0000000..bf0fb08
--- /dev/null
+++ b/src/bin/pg_dump/po/fr.po
@@ -0,0 +1,3404 @@
+# LANGUAGE message translation file for pg_dump
+# Copyright (C) 2004-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_dump (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2004-2009.
+# Stéphane Schildknecht <stephane.schildknecht@dalibo.com>, 2009.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2010-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-05 17:36+0000\n"
+"PO-Revision-Date: 2023-09-05 22:02+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "n'a pas pu identifier le répertoire courant : %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binaire « %s » invalide"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "n'a pas pu lire le binaire « %s »"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "n'a pas pu trouver un « %s » à exécuter"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "n'a pas pu modifier le répertoire par « %s » : %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "n'a pas pu lire le lien symbolique « %s » : %m"
+
+#: ../../common/exec.c:422 parallel.c:1611
+#, c-format
+msgid "%s() failed: %m"
+msgstr "échec de %s() : %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "commande non exécutable"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "commande introuvable"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "le processus fils a quitté avec le code de sortie %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "le processus fils a été terminé par l'exception 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "le processus fils a été terminé par le signal %d : %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "le processus fils a quitté avec un statut %d non reconnu"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valeur « %s » invalide pour l'option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s doit être compris entre %d et %d"
+
+#: common.c:134
+#, c-format
+msgid "reading extensions"
+msgstr "lecture des extensions"
+
+#: common.c:137
+#, c-format
+msgid "identifying extension members"
+msgstr "identification des membres d'extension"
+
+#: common.c:140
+#, c-format
+msgid "reading schemas"
+msgstr "lecture des schémas"
+
+#: common.c:149
+#, c-format
+msgid "reading user-defined tables"
+msgstr "lecture des tables utilisateur"
+
+#: common.c:154
+#, c-format
+msgid "reading user-defined functions"
+msgstr "lecture des fonctions utilisateur"
+
+#: common.c:158
+#, c-format
+msgid "reading user-defined types"
+msgstr "lecture des types utilisateur"
+
+#: common.c:162
+#, c-format
+msgid "reading procedural languages"
+msgstr "lecture des langages procéduraux"
+
+#: common.c:165
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "lecture des fonctions d'agrégats utilisateur"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined operators"
+msgstr "lecture des opérateurs utilisateur"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "lecture des méthodes d'accès définis par les utilisateurs"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "lecture des classes d'opérateurs utilisateur"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "lecture des familles d'opérateurs utilisateur"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "lecture des analyseurs utilisateur pour la recherche plein texte"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "lecture des modèles utilisateur pour la recherche plein texte"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "lecture des dictionnaires utilisateur pour la recherche plein texte"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "lecture des configurations utilisateur pour la recherche plein texte"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "lecture des wrappers de données distantes utilisateur"
+
+#: common.c:195
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "lecture des serveurs distants utilisateur"
+
+#: common.c:198
+#, c-format
+msgid "reading default privileges"
+msgstr "lecture des droits par défaut"
+
+#: common.c:201
+#, c-format
+msgid "reading user-defined collations"
+msgstr "lecture des collationnements utilisateurs"
+
+#: common.c:204
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "lecture des conversions utilisateur"
+
+#: common.c:207
+#, c-format
+msgid "reading type casts"
+msgstr "lecture des conversions de type"
+
+#: common.c:210
+#, c-format
+msgid "reading transforms"
+msgstr "lecture des transformations"
+
+#: common.c:213
+#, c-format
+msgid "reading table inheritance information"
+msgstr "lecture des informations d'héritage des tables"
+
+#: common.c:216
+#, c-format
+msgid "reading event triggers"
+msgstr "lecture des triggers sur évènement"
+
+#: common.c:220
+#, c-format
+msgid "finding extension tables"
+msgstr "recherche des tables d'extension"
+
+#: common.c:224
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "recherche des relations d'héritage"
+
+#: common.c:227
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "lecture des informations de colonnes des tables intéressantes"
+
+#: common.c:230
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "marquage des colonnes héritées dans les sous-tables"
+
+#: common.c:233
+#, c-format
+msgid "reading partitioning data"
+msgstr "lecture des données de partitionnement"
+
+#: common.c:236
+#, c-format
+msgid "reading indexes"
+msgstr "lecture des index"
+
+#: common.c:239
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "décrit les index des tables partitionnées"
+
+#: common.c:242
+#, c-format
+msgid "reading extended statistics"
+msgstr "lecture des statistiques étendues"
+
+#: common.c:245
+#, c-format
+msgid "reading constraints"
+msgstr "lecture des contraintes"
+
+#: common.c:248
+#, c-format
+msgid "reading triggers"
+msgstr "lecture des triggers"
+
+#: common.c:251
+#, c-format
+msgid "reading rewrite rules"
+msgstr "lecture des règles de réécriture"
+
+#: common.c:254
+#, c-format
+msgid "reading policies"
+msgstr "lecture des politiques"
+
+#: common.c:257
+#, c-format
+msgid "reading publications"
+msgstr "lecture des publications"
+
+#: common.c:260
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "lecture des appartenances aux publications des tables"
+
+#: common.c:263
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "lecture des appartenances aux publications des schémas"
+
+#: common.c:266
+#, c-format
+msgid "reading subscriptions"
+msgstr "lecture des souscriptions"
+
+#: common.c:345
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "nombre de parents invalide (%d) pour la table « %s »"
+
+#: common.c:1006
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "vérification échouée, OID %u parent de la table « %s » (OID %u) introuvable"
+
+#: common.c:1045
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "n'a pas pu analyser le tableau numérique « %s » : trop de nombres"
+
+#: common.c:1057
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "n'a pas pu analyser le tableau numérique « %s » : caractère invalide dans le nombre"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "code de compression invalide : %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504
+#: compress_io.c:547
+#, c-format
+msgid "not built with zlib support"
+msgstr "pas construit avec le support de zlib"
+
+#: compress_io.c:236 compress_io.c:333
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "n'a pas pu initialiser la bibliothèque de compression : %s"
+
+#: compress_io.c:256
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "n'a pas pu fermer le flux de compression : %s"
+
+#: compress_io.c:273
+#, c-format
+msgid "could not compress data: %s"
+msgstr "n'a pas pu compresser les données : %s"
+
+#: compress_io.c:349 compress_io.c:364
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "n'a pas pu décompresser les données : %s"
+
+#: compress_io.c:371
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "n'a pas pu fermer la bibliothèque de compression : %s"
+
+#: compress_io.c:584 compress_io.c:621
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "n'a pas pu lire à partir du fichier en entrée : %s"
+
+#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553
+#: pg_backup_tar.c:726 pg_backup_tar.c:749
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "n'a pas pu lire à partir du fichier en entrée : fin du fichier"
+
+#: parallel.c:253
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "échec de %s() : code d'erreur %d"
+
+#: parallel.c:961
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "n'a pas pu créer le canal de communication : %m"
+
+#: parallel.c:1018
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "n'a pas pu créer le processus worker : %m"
+
+#: parallel.c:1148
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "commande non reconnue reçue du leader : « %s »"
+
+#: parallel.c:1191 parallel.c:1429
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "message invalide reçu du worker: « %s »"
+
+#: parallel.c:1323
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"impossible d'obtenir un verrou sur la relation « %s »\n"
+"Cela signifie en général que quelqu'un a demandé un verrou ACCESS EXCLUSIVE sur la table après que pg_dump ait obtenu son verrou ACCESS SHARE initial sur la table."
+
+#: parallel.c:1412
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "un processus worker a subi un arrêt brutal inattendu"
+
+#: parallel.c:1534 parallel.c:1652
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "n'a pas pu écrire dans le canal de communication: %m"
+
+#: parallel.c:1736
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: n'a pas pu créer le socket: code d'erreur %d"
+
+#: parallel.c:1747
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: n'a pas pu se lier: code d'erreur %d"
+
+#: parallel.c:1754
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe : n'a pas pu se mettre en écoute: code d'erreur %d"
+
+#: parallel.c:1761
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: échec de %s() : code d'erreur %d"
+
+#: parallel.c:1772
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: n'a pas pu créer un deuxième socket: code d'erreur %d"
+
+#: parallel.c:1781
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: n'a pas pu se connecter au socket: code d'erreur %d"
+
+#: parallel.c:1790
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: n'a pas pu accepter de connexion: code d'erreur %d"
+
+#: pg_backup_archiver.c:280 pg_backup_archiver.c:1632
+#, c-format
+msgid "could not close output file: %m"
+msgstr "n'a pas pu fermer le fichier en sortie : %m"
+
+#: pg_backup_archiver.c:324 pg_backup_archiver.c:328
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "les éléments de l'archive ne sont pas dans l'ordre correct de la section"
+
+#: pg_backup_archiver.c:334
+#, c-format
+msgid "unexpected section code %d"
+msgstr "code de section inattendu %d"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "la restauration parallélisée n'est pas supportée avec ce format de fichier d'archive"
+
+#: pg_backup_archiver.c:375
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "la restauration parallélisée n'est pas supportée avec les archives réalisées par un pg_dump antérieur à la 8.0"
+
+#: pg_backup_archiver.c:393
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)"
+msgstr "ne peut pas restaurer à partir de l'archive compressée (compression indisponible dans cette installation)"
+
+#: pg_backup_archiver.c:410
+#, c-format
+msgid "connecting to database for restore"
+msgstr "connexion à la base de données pour la restauration"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "les connexions directes à la base de données ne sont pas supportées dans les archives pre-1.3"
+
+#: pg_backup_archiver.c:455
+#, c-format
+msgid "implied data-only restore"
+msgstr "a impliqué une restauration des données uniquement"
+
+#: pg_backup_archiver.c:521
+#, c-format
+msgid "dropping %s %s"
+msgstr "suppression de %s %s"
+
+#: pg_backup_archiver.c:621
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "n'a pas pu trouver où insérer IF EXISTS dans l'instruction « %s »"
+
+#: pg_backup_archiver.c:777 pg_backup_archiver.c:779
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "message d'avertissement du fichier de sauvegarde original : %s"
+
+#: pg_backup_archiver.c:794
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "création de %s « %s.%s »"
+
+#: pg_backup_archiver.c:797
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "création de %s « %s »"
+
+#: pg_backup_archiver.c:847
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "connexion à la nouvelle base de données « %s »"
+
+#: pg_backup_archiver.c:874
+#, c-format
+msgid "processing %s"
+msgstr "traitement de %s"
+
+#: pg_backup_archiver.c:896
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "traitement des données de la table « %s.%s »"
+
+#: pg_backup_archiver.c:966
+#, c-format
+msgid "executing %s %s"
+msgstr "exécution de %s %s"
+
+#: pg_backup_archiver.c:1005
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "désactivation des triggers pour %s"
+
+#: pg_backup_archiver.c:1031
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "activation des triggers pour %s"
+
+#: pg_backup_archiver.c:1096
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "erreur interne -- WriteData ne peut pas être appelé en dehors du contexte de la routine DataDumper"
+
+#: pg_backup_archiver.c:1279
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "la sauvegarde des « Large Objects » n'est pas supportée dans le format choisi"
+
+#: pg_backup_archiver.c:1337
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "restauration de %d « Large Object »"
+msgstr[1] "restauration de %d « Large Objects »"
+
+#: pg_backup_archiver.c:1358 pg_backup_tar.c:669
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "restauration du « Large Object » d'OID %u"
+
+#: pg_backup_archiver.c:1370
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "n'a pas pu créer le « Large Object » %u : %s"
+
+#: pg_backup_archiver.c:1375 pg_dump.c:3607
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "n'a pas pu ouvrir le « Large Object » %u : %s"
+
+#: pg_backup_archiver.c:1431
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier TOC « %s » : %m"
+
+#: pg_backup_archiver.c:1459
+#, c-format
+msgid "line ignored: %s"
+msgstr "ligne ignorée : %s"
+
+#: pg_backup_archiver.c:1466
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "n'a pas pu trouver l'entrée pour l'ID %d"
+
+#: pg_backup_archiver.c:1489 pg_backup_directory.c:222
+#: pg_backup_directory.c:599
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "n'a pas pu fermer le fichier TOC : %m"
+
+#: pg_backup_archiver.c:1603 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:586 pg_backup_directory.c:649
+#: pg_backup_directory.c:668 pg_dumpall.c:476
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier de sauvegarde « %s » : %m"
+
+#: pg_backup_archiver.c:1605 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "n'a pas pu ouvrir le fichier de sauvegarde : %m"
+
+#: pg_backup_archiver.c:1699
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "a écrit %zu octet de données d'un « Large Object » (résultat = %d)"
+msgstr[1] "a écrit %zu octets de données d'un « Large Object » (résultat = %d)"
+
+#: pg_backup_archiver.c:1705
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "n'a pas pu écrire dans le « Large Object » : %s"
+
+#: pg_backup_archiver.c:1795
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "pendant l'initialisation (« INITIALIZING ») :"
+
+#: pg_backup_archiver.c:1800
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "pendant le traitement de la TOC (« PROCESSING TOC ») :"
+
+#: pg_backup_archiver.c:1805
+#, c-format
+msgid "while FINALIZING:"
+msgstr "pendant la finalisation (« FINALIZING ») :"
+
+#: pg_backup_archiver.c:1810
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "de l'entrée TOC %d ; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1886
+#, c-format
+msgid "bad dumpId"
+msgstr "mauvais dumpId"
+
+#: pg_backup_archiver.c:1907
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "mauvais dumpId de table pour l'élément TABLE DATA"
+
+#: pg_backup_archiver.c:1999
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "drapeau de décalage de données inattendu %d"
+
+#: pg_backup_archiver.c:2012
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "le décalage dans le fichier de sauvegarde est trop important"
+
+#: pg_backup_archiver.c:2150 pg_backup_archiver.c:2160
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "nom du répertoire trop long : « %s »"
+
+#: pg_backup_archiver.c:2168
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "le répertoire « %s » ne semble pas être une archive valide (« toc.dat » n'existe pas)"
+
+#: pg_backup_archiver.c:2176 pg_backup_custom.c:173 pg_backup_custom.c:807
+#: pg_backup_directory.c:207 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier en entrée « %s » : %m"
+
+#: pg_backup_archiver.c:2183 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "n'a pas pu ouvrir le fichier en entrée : %m"
+
+#: pg_backup_archiver.c:2189
+#, c-format
+msgid "could not read input file: %m"
+msgstr "n'a pas pu lire le fichier en entrée : %m"
+
+#: pg_backup_archiver.c:2191
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "le fichier en entrée est trop petit (%lu lus, 5 attendus)"
+
+#: pg_backup_archiver.c:2223
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "Le fichier en entrée semble être une sauvegarde au format texte. Merci d'utiliser psql."
+
+#: pg_backup_archiver.c:2229
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "le fichier en entrée ne semble pas être une archive valide (trop petit ?)"
+
+#: pg_backup_archiver.c:2235
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "le fichier en entrée ne semble pas être une archive valide"
+
+#: pg_backup_archiver.c:2244
+#, c-format
+msgid "could not close input file: %m"
+msgstr "n'a pas pu fermer le fichier en entrée : %m"
+
+#: pg_backup_archiver.c:2361
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "format de fichier « %d » non reconnu"
+
+#: pg_backup_archiver.c:2443 pg_backup_archiver.c:4505
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "élément terminé %d %s %s"
+
+#: pg_backup_archiver.c:2447 pg_backup_archiver.c:4518
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "échec du processus worker : code de sortie %d"
+
+#: pg_backup_archiver.c:2568
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "ID %d de l'entrée en dehors de la plage -- peut-être un TOC corrompu"
+
+#: pg_backup_archiver.c:2648
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "la restauration des tables avec WITH OIDS n'est plus supportée"
+
+#: pg_backup_archiver.c:2730
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "encodage « %s » non reconnu"
+
+#: pg_backup_archiver.c:2735
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "élément ENCODING invalide : %s"
+
+#: pg_backup_archiver.c:2753
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "élément STDSTRINGS invalide : %s"
+
+#: pg_backup_archiver.c:2778
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "schéma « %s » non trouvé"
+
+#: pg_backup_archiver.c:2785
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "table « %s » non trouvée"
+
+#: pg_backup_archiver.c:2792
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "index « %s » non trouvé"
+
+#: pg_backup_archiver.c:2799
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "fonction « %s » non trouvée"
+
+#: pg_backup_archiver.c:2806
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "trigger « %s » non trouvé"
+
+#: pg_backup_archiver.c:3203
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "n'a pas pu initialiser la session utilisateur à « %s »: %s"
+
+#: pg_backup_archiver.c:3340
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "n'a pas pu configurer search_path à « %s » : %s"
+
+#: pg_backup_archiver.c:3402
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "n'a pas pu configurer default_tablespace à %s : %s"
+
+#: pg_backup_archiver.c:3452
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "n'a pas pu configurer la méthode default_table_access_method à %s"
+
+#: pg_backup_archiver.c:3546 pg_backup_archiver.c:3711
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "ne sait pas comment initialiser le propriétaire du type d'objet « %s »"
+
+#: pg_backup_archiver.c:3814
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "n'a pas trouver la chaîne magique dans le fichier d'en-tête"
+
+#: pg_backup_archiver.c:3828
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "version non supportée (%d.%d) dans le fichier d'en-tête"
+
+#: pg_backup_archiver.c:3833
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "échec de la vérification sur la taille de l'entier (%lu)"
+
+#: pg_backup_archiver.c:3837
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "l'archive a été créée sur une machine disposant d'entiers plus larges, certaines opérations peuvent échouer"
+
+#: pg_backup_archiver.c:3847
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "le format attendu (%d) diffère du format du fichier (%d)"
+
+#: pg_backup_archiver.c:3862
+#, c-format
+msgid "archive is compressed, but this installation does not support compression -- no data will be available"
+msgstr "l'archive est compressée mais cette installation ne supporte pas la compression -- aucune donnée ne sera disponible"
+
+#: pg_backup_archiver.c:3896
+#, c-format
+msgid "invalid creation date in header"
+msgstr "date de création invalide dans l'en-tête"
+
+#: pg_backup_archiver.c:4030
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "traitement de l'élément %d %s %s"
+
+#: pg_backup_archiver.c:4109
+#, c-format
+msgid "entering main parallel loop"
+msgstr "entrée dans la boucle parallèle principale"
+
+#: pg_backup_archiver.c:4120
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "omission de l'élément %d %s %s"
+
+#: pg_backup_archiver.c:4129
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "lancement de l'élément %d %s %s"
+
+#: pg_backup_archiver.c:4183
+#, c-format
+msgid "finished main parallel loop"
+msgstr "fin de la boucle parallèle principale"
+
+#: pg_backup_archiver.c:4219
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "traitement de l'élément manquant %d %s %s"
+
+#: pg_backup_archiver.c:4824
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "la table « %s » n'a pas pu être créée, ses données ne seront pas restaurées"
+
+#: pg_backup_custom.c:376 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "OID invalide pour le « Large Object »"
+
+#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629
+#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021
+#, c-format
+msgid "error during file seek: %m"
+msgstr "erreur lors de la recherche dans le fichier : %m"
+
+#: pg_backup_custom.c:478
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "le bloc de données %d a une mauvaise position de recherche"
+
+#: pg_backup_custom.c:495
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "type de bloc de données non reconnu (%d) lors de la recherche dans l'archive"
+
+#: pg_backup_custom.c:517
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr ""
+"n'a pas pu trouver l'identifiant de bloc %d dans l'archive --\n"
+"il est possible que cela soit dû à une demande de restauration dans un ordre\n"
+"différent, ce qui ne peut pas être géré à cause d'un fichier non gérable en\n"
+"recherche"
+
+#: pg_backup_custom.c:522
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "n'a pas pu trouver l'identifiant de bloc %d dans l'archive -- possible corruption de l'archive"
+
+#: pg_backup_custom.c:529
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "ID de bloc inattendu (%d) lors de la lecture des données -- %d attendu"
+
+#: pg_backup_custom.c:543
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "type de bloc de données %d non reconnu lors de la restauration de l'archive"
+
+#: pg_backup_custom.c:645
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "n'a pas pu lire à partir du fichier en entrée : %m"
+
+#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943
+#: pg_backup_tar.c:1019
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "n'a pas pu déterminer la position de recherche dans le fichier d'archive : %m"
+
+#: pg_backup_custom.c:762 pg_backup_custom.c:802
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "n'a pas pu fermer le fichier d'archive : %m"
+
+#: pg_backup_custom.c:785
+#, c-format
+msgid "can only reopen input archives"
+msgstr "peut seulement rouvrir l'archive en entrée"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "la restauration parallélisée n'est pas supportée à partir de stdin"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "la restauration parallélisée n'est pas supportée à partir de fichiers sans table de matière"
+
+#: pg_backup_custom.c:810
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "n'a pas pu initialiser la recherche de position dans le fichier d'archive : %m"
+
+#: pg_backup_custom.c:889
+#, c-format
+msgid "compressor active"
+msgstr "compression activée"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "n'a pas pu obtenir server_version de libpq"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1646
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "annulation à cause de la différence des versions"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1647
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "version du serveur : %s ; %s version : %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "déjà connecté à une base de données"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595
+msgid "Password: "
+msgstr "Mot de passe : "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "n'a pas pu se connecter à la base de données"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "échec de la reconnexion : %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1520 pg_dumpall.c:1604
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732
+#, c-format
+msgid "query failed: %s"
+msgstr "échec de la requête : %s"
+
+#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733
+#, c-format
+msgid "Query was: %s"
+msgstr "La requête était : %s"
+
+#: pg_backup_db.c:316
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "la requête a renvoyé %d ligne au lieu d'une seule : %s"
+msgstr[1] "la requête a renvoyé %d lignes au lieu d'une seule : %s"
+
+#: pg_backup_db.c:352
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sLa commande était : %s"
+
+#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489
+msgid "could not execute query"
+msgstr "n'a pas pu exécuter la requête"
+
+#: pg_backup_db.c:461
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "erreur renvoyée par PQputCopyData : %s"
+
+#: pg_backup_db.c:510
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "erreur renvoyée par PQputCopyEnd : %s"
+
+#: pg_backup_db.c:516
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY échoué pour la table « %s » : %s"
+
+#: pg_backup_db.c:522 pg_dump.c:2106
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "résultats supplémentaires non attendus durant l'exécution de COPY sur la table « %s »"
+
+#: pg_backup_db.c:534
+msgid "could not start database transaction"
+msgstr "n'a pas pu démarrer la transaction de la base de données"
+
+#: pg_backup_db.c:542
+msgid "could not commit database transaction"
+msgstr "n'a pas pu valider la transaction de la base de données"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "aucun répertoire cible indiqué"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "n'a pas pu lire le répertoire « %s » : %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "n'a pas pu fermer le répertoire « %s » : %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "n'a pas pu créer le répertoire « %s » : %m"
+
+#: pg_backup_directory.c:355 pg_backup_directory.c:497
+#: pg_backup_directory.c:533
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "n'a pas pu écrire dans le fichier en sortie : %s"
+
+#: pg_backup_directory.c:373
+#, c-format
+msgid "could not close data file: %m"
+msgstr "n'a pas pu fermer le fichier de données : %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier de données « %s » : %m"
+
+#: pg_backup_directory.c:447
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "n'a pas pu ouvrir le fichier TOC « %s » du Large Object en entrée : %m"
+
+#: pg_backup_directory.c:458
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "ligne invalide dans le fichier TOC du Large Object « %s » : « %s »"
+
+#: pg_backup_directory.c:467
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "erreur lors de la lecture du TOC du fichier Large Object « %s »"
+
+#: pg_backup_directory.c:471
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "n'a pas pu fermer le TOC du Large Object « %s » : %m"
+
+#: pg_backup_directory.c:685
+#, c-format
+msgid "could not close blob data file: %m"
+msgstr "n'a pas pu fermer le fichier de données blob : %m"
+
+#: pg_backup_directory.c:691
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "n'a pas pu écrire dans le fichier TOC des Large Objects"
+
+#: pg_backup_directory.c:705
+#, c-format
+msgid "could not close blobs TOC file: %m"
+msgstr "n'a pas pu fermer le fichier TOC des blobs : %m"
+
+#: pg_backup_directory.c:724
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "nom du fichier trop long : « %s »"
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "ce format ne peut pas être lu"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "n'a pas pu ouvrir le fichier TOC « %s » en sortie : %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "n'a pas pu ouvrir le fichier TOC en sortie : %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:893
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "compression non supportée par le format des archives tar"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "n'a pas pu ouvrir le fichier TOC « %s » en entrée : %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "n'a pas pu ouvrir le fichier TOC en entrée : %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "n'a pas pu trouver le fichier « %s » dans l'archive"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "impossible de créer le nom du fichier temporaire : %m"
+
+#: pg_backup_tar.c:624
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "syntaxe inattendue de l'instruction COPY : « %s »"
+
+#: pg_backup_tar.c:890
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "OID invalide pour le « Large Object » (%u)"
+
+#: pg_backup_tar.c:1035
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "n'a pas pu fermer le fichier temporaire : m"
+
+#: pg_backup_tar.c:1038
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "la longueur réelle du fichier (%lld) ne correspond pas à ce qui était attendu (%lld)"
+
+#: pg_backup_tar.c:1084 pg_backup_tar.c:1115
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "n'a pas pu trouver l'en-tête du fichier « %s » dans l'archive tar"
+
+#: pg_backup_tar.c:1102
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "la restauration désordonnée de données n'est pas supportée avec ce format d'archive : « %s » est requis mais vient avant « %s » dans le fichier d'archive."
+
+#: pg_backup_tar.c:1149
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "en-tête incomplet du fichier tar (%lu octet)"
+msgstr[1] "en-tête incomplet du fichier tar (%lu octets)"
+
+#: pg_backup_tar.c:1188
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "en-tête tar corrompu trouvé dans %s (%d attendu, %d calculé ) à la position %llu du fichier"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "nom de section non reconnu : « %s »"
+
+#: pg_backup_utils.c:55 pg_dump.c:628 pg_dump.c:645 pg_dumpall.c:340
+#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373
+#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "plus d'emplacements on_exit_nicely"
+
+#: pg_dump.c:643 pg_dumpall.c:348 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_dump.c:662 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "les options « -s/--schema-only » et « -a/--data-only » ne peuvent pas être utilisées ensemble"
+
+#: pg_dump.c:665
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "les options « -s/--schema-only » et « --include-foreign-data » ne peuvent pas être utilisées ensemble"
+
+#: pg_dump.c:668
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "l'option --include-foreign-data n'est pas supportée avec une sauvegarde parallélisée"
+
+#: pg_dump.c:671 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "les options « -c/--clean » et « -a/--data-only » ne peuvent pas être utilisées ensemble"
+
+#: pg_dump.c:674 pg_dumpall.c:378 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "l'option --if-exists nécessite l'option -c/--clean"
+
+#: pg_dump.c:681
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "l'option --on-conflict-do-nothing requiert l'option --inserts, --rows-per-insert, ou --column-inserts"
+
+#: pg_dump.c:703
+#, c-format
+msgid "requested compression not available in this installation -- archive will be uncompressed"
+msgstr "la compression requise n'est pas disponible avec cette installation -- l'archive ne sera pas compressée"
+
+#: pg_dump.c:716
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "la sauvegarde parallélisée n'est supportée qu'avec le format directory"
+
+#: pg_dump.c:762
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "le dernier OID interne est %u"
+
+#: pg_dump.c:771
+#, c-format
+msgid "no matching schemas were found"
+msgstr "aucun schéma correspondant n'a été trouvé"
+
+#: pg_dump.c:785
+#, c-format
+msgid "no matching tables were found"
+msgstr "aucune table correspondante n'a été trouvée"
+
+#: pg_dump.c:807
+#, c-format
+msgid "no matching extensions were found"
+msgstr "aucune extension correspondante n'a été trouvée"
+
+#: pg_dump.c:990
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s exporte une base de données dans un fichier texte ou dans d'autres\n"
+"formats.\n"
+"\n"
+
+#: pg_dump.c:991 pg_dumpall.c:605 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_dump.c:992
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [BASE]\n"
+
+#: pg_dump.c:994 pg_dumpall.c:608 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Options générales :\n"
+
+#: pg_dump.c:995
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=FICHIER nom du fichier ou du répertoire en sortie\n"
+
+#: pg_dump.c:996
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p format du fichier de sortie (personnalisé,\n"
+" répertoire, tar, texte (par défaut))\n"
+
+#: pg_dump.c:998
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr ""
+" -j, --jobs=NOMBRE utilise ce nombre de jobs en parallèle pour la\n"
+" sauvegarde\n"
+
+#: pg_dump.c:999 pg_dumpall.c:610
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose mode verbeux\n"
+
+#: pg_dump.c:1000 pg_dumpall.c:611
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_dump.c:1001
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr ""
+" -Z, --compress=0-9 niveau de compression pour les formats\n"
+" compressés\n"
+
+#: pg_dump.c:1002 pg_dumpall.c:612
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr ""
+" --lock-wait-timeout=DÉLAI échec après l'attente du DÉLAI pour un verrou de\n"
+" table\n"
+
+#: pg_dump.c:1003 pg_dumpall.c:639
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" --no-sync n'attend pas que les modifications soient\n"
+" proprement écrites sur disque\n"
+
+#: pg_dump.c:1004 pg_dumpall.c:613
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_dump.c:1006 pg_dumpall.c:614
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Options contrôlant le contenu en sortie :\n"
+
+#: pg_dump.c:1007 pg_dumpall.c:615
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only sauvegarde uniquement les données, pas le schéma\n"
+
+#: pg_dump.c:1008
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs inclut les « Large Objects » dans la sauvegarde\n"
+
+#: pg_dump.c:1009
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs exclut les « Large Objects » de la sauvegarde\n"
+
+#: pg_dump.c:1010 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr ""
+" -c, --clean nettoie/supprime les objets de la base de données\n"
+" avant de les créer\n"
+
+#: pg_dump.c:1011
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr ""
+" -C, --create inclut les commandes de création de la base\n"
+" dans la sauvegarde\n"
+
+#: pg_dump.c:1012
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=MOTIF sauvegarde uniquement les extensions indiquées\n"
+
+#: pg_dump.c:1013 pg_dumpall.c:617
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=ENCODAGE sauvegarde les données dans l'encodage ENCODAGE\n"
+
+#: pg_dump.c:1014
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=MOTIF sauvegarde uniquement les schémas indiqués\n"
+
+#: pg_dump.c:1015
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=MOTIF ne sauvegarde pas les schémas indiqués\n"
+
+#: pg_dump.c:1016
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner ne sauvegarde pas les propriétaires des objets\n"
+" lors de l'utilisation du format texte\n"
+
+#: pg_dump.c:1018 pg_dumpall.c:621
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr ""
+" -s, --schema-only sauvegarde uniquement la structure, pas les\n"
+" données\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr ""
+" -S, --superuser=NOM indique le nom du super-utilisateur à utiliser\n"
+" avec le format texte\n"
+
+#: pg_dump.c:1020
+#, c-format
+msgid " -t, --table=PATTERN dump the specified table(s) only\n"
+msgstr " -t, --table=MOTIF sauvegarde uniquement les tables indiquées\n"
+
+#: pg_dump.c:1021
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=MOTIF ne sauvegarde pas les tables indiquées\n"
+
+#: pg_dump.c:1022 pg_dumpall.c:624
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges ne sauvegarde pas les droits sur les objets\n"
+
+#: pg_dump.c:1023 pg_dumpall.c:625
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr ""
+" --binary-upgrade à n'utiliser que par les outils de mise à jour\n"
+" seulement\n"
+
+#: pg_dump.c:1024 pg_dumpall.c:626
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr ""
+" --column-inserts sauvegarde les données avec des commandes INSERT\n"
+" en précisant les noms des colonnes\n"
+
+#: pg_dump.c:1025 pg_dumpall.c:627
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr ""
+" --disable-dollar-quoting désactive l'utilisation des guillemets dollars\n"
+" dans le but de respecter le standard SQL en\n"
+" matière de guillemets\n"
+
+#: pg_dump.c:1026 pg_dumpall.c:628 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr ""
+" --disable-triggers désactive les triggers en mode de restauration\n"
+" des données seules\n"
+
+#: pg_dump.c:1027
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security active la sécurité niveau ligne (et donc\n"
+" sauvegarde uniquement le contenu visible par cet\n"
+" utilisateur)\n"
+
+#: pg_dump.c:1029
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=MOTIF ne sauvegarde pas les tables indiquées\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:630
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr ""
+" --extra-float-digits=NUM surcharge la configuration par défaut de\n"
+" extra_float_digits\n"
+
+#: pg_dump.c:1031 pg_dumpall.c:631 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr ""
+" --if-exists utilise IF EXISTS lors de la suppression des\n"
+" objets\n"
+
+#: pg_dump.c:1032
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=MOTIF inclut les données des tables externes pour les\n"
+" serveurs distants correspondant au motif MOTIF\n"
+
+#: pg_dump.c:1035 pg_dumpall.c:632
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr ""
+" --inserts sauvegarde les données avec des instructions\n"
+" INSERT plutôt que COPY\n"
+
+#: pg_dump.c:1036 pg_dumpall.c:633
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root charger les partitions via la table racine\n"
+
+#: pg_dump.c:1037 pg_dumpall.c:634
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments ne sauvegarde pas les commentaires\n"
+
+#: pg_dump.c:1038 pg_dumpall.c:635
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications ne sauvegarde pas les publications\n"
+
+#: pg_dump.c:1039 pg_dumpall.c:637
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr ""
+" --no-security-labels ne sauvegarde pas les affectations de labels de\n"
+" sécurité\n"
+
+#: pg_dump.c:1040 pg_dumpall.c:638
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions ne sauvegarde pas les souscriptions\n"
+
+#: pg_dump.c:1041 pg_dumpall.c:640
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method ne sauvegarde pas les méthodes d'accès aux tables\n"
+
+#: pg_dump.c:1042 pg_dumpall.c:641
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces ne sauvegarde pas les affectations de tablespaces\n"
+
+#: pg_dump.c:1043 pg_dumpall.c:642
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr ""
+" --no-toast-compression ne sauvegarde pas les méthodes de compression de\n"
+" TOAST\n"
+
+#: pg_dump.c:1044 pg_dumpall.c:643
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr ""
+" --no-unlogged-table-data ne sauvegarde pas les données des tables non\n"
+" journalisées\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:644
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr ""
+" --on-conflict-do-nothing ajoute ON CONFLICT DO NOTHING aux commandes\n"
+" INSERT\n"
+
+#: pg_dump.c:1046 pg_dumpall.c:645
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr ""
+" --quote-all-identifiers met entre guillemets tous les identifiants même\n"
+" s'il ne s'agit pas de mots clés\n"
+
+#: pg_dump.c:1047 pg_dumpall.c:646
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS nombre de lignes par INSERT ; implique --inserts\n"
+
+#: pg_dump.c:1048
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=SECTION sauvegarde la section indiquée (pre-data, data\n"
+" ou post-data)\n"
+
+#: pg_dump.c:1049
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr ""
+" --serializable-deferrable attend jusqu'à ce que la sauvegarde puisse\n"
+" s'exécuter sans anomalies\n"
+
+#: pg_dump.c:1050
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT utilise l'image donnée pour la sauvegarde\n"
+
+#: pg_dump.c:1051 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names requiert que les motifs des tables et/ou schémas\n"
+" correspondent à au moins une entité de chaque\n"
+
+#: pg_dump.c:1053 pg_dumpall.c:647 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" utilise les commandes SET SESSION AUTHORIZATION\n"
+" au lieu des commandes ALTER OWNER pour modifier\n"
+" les propriétaires\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:651 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Options de connexion :\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=BASE base de données à sauvegarder\n"
+
+#: pg_dump.c:1059 pg_dumpall.c:653 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HÔTE hôte du serveur de bases de données ou\n"
+" répertoire des sockets\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:655 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT numéro de port du serveur de bases de données\n"
+
+#: pg_dump.c:1061 pg_dumpall.c:656 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NOM se connecter avec cet utilisateur\n"
+
+#: pg_dump.c:1062 pg_dumpall.c:657 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ne demande jamais un mot de passe\n"
+
+#: pg_dump.c:1063 pg_dumpall.c:658 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password force la demande du mot de passe (devrait\n"
+" survenir automatiquement)\n"
+
+#: pg_dump.c:1064 pg_dumpall.c:659
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=NOMROLE exécute SET ROLE avant la sauvegarde\n"
+
+#: pg_dump.c:1066
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si aucune base de données n'est indiquée, la valeur de la variable\n"
+"d'environnement PGDATABASE est alors utilisée.\n"
+"\n"
+
+#: pg_dump.c:1068 pg_dumpall.c:663 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapporter les bogues à <%s>.\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:664 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_dump.c:1088 pg_dumpall.c:488
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "encodage client indiqué (« %s ») invalide"
+
+#: pg_dump.c:1226
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "les sauvegardes parallélisées sur un serveur standby ne sont pas supportées par cette version du serveur"
+
+#: pg_dump.c:1291
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "format de sortie « %s » invalide"
+
+#: pg_dump.c:1332 pg_dump.c:1388 pg_dump.c:1441 pg_dumpall.c:1282
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "mauvaise qualification du nom (trop de points entre les noms) : %s"
+
+#: pg_dump.c:1340
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "aucun schéma correspondant n'a été trouvé avec le motif « %s »"
+
+#: pg_dump.c:1393
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "aucune extension correspondante n'a été trouvée avec le motif « %s »"
+
+#: pg_dump.c:1446
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "aucun serveur distant correspondant n'a été trouvé avec le motif « %s »"
+
+#: pg_dump.c:1509
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "nom de relation incorrecte (trop de points entre les noms) : %s"
+
+#: pg_dump.c:1520
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "aucune table correspondante n'a été trouvée avec le motif « %s »"
+
+#: pg_dump.c:1547
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Vous n'êtes pas connecté à une base de données."
+
+#: pg_dump.c:1550
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "les références entre bases de données ne sont pas implémentées : %s"
+
+#: pg_dump.c:1981
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "sauvegarde du contenu de la table « %s.%s »"
+
+#: pg_dump.c:2087
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Sauvegarde du contenu de la table « %s » échouée : échec de PQgetCopyData()."
+
+#: pg_dump.c:2088 pg_dump.c:2098
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Message d'erreur du serveur : %s"
+
+#: pg_dump.c:2089 pg_dump.c:2099
+#, c-format
+msgid "Command was: %s"
+msgstr "La commande était : %s"
+
+#: pg_dump.c:2097
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Sauvegarde du contenu de la table « %s » échouée : échec de PQgetResult()."
+
+#: pg_dump.c:2179
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "mauvais nombre de champs récupérés à partir de la table « %s »"
+
+#: pg_dump.c:2875
+#, c-format
+msgid "saving database definition"
+msgstr "sauvegarde de la définition de la base de données"
+
+#: pg_dump.c:2971
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "fournisseur de locale non reconnu : %s"
+
+#: pg_dump.c:3317
+#, c-format
+msgid "saving encoding = %s"
+msgstr "encodage de la sauvegarde = %s"
+
+#: pg_dump.c:3342
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "sauvegarde de standard_conforming_strings = %s"
+
+#: pg_dump.c:3381
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "n'a pas pu analyser le résultat de current_schema()"
+
+#: pg_dump.c:3400
+#, c-format
+msgid "saving search_path = %s"
+msgstr "sauvegarde de search_path = %s"
+
+#: pg_dump.c:3438
+#, c-format
+msgid "reading large objects"
+msgstr "lecture des « Large Objects »"
+
+#: pg_dump.c:3576
+#, c-format
+msgid "saving large objects"
+msgstr "sauvegarde des « Large Objects »"
+
+#: pg_dump.c:3617
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "erreur lors de la lecture du « Large Object » %u : %s"
+
+#: pg_dump.c:3723
+#, c-format
+msgid "reading row-level security policies"
+msgstr "lecture des politiques de sécurité au niveau ligne"
+
+#: pg_dump.c:3864
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "type de commande inattendu pour la politique : %c"
+
+#: pg_dump.c:4314 pg_dump.c:4632 pg_dump.c:11835 pg_dump.c:17724
+#: pg_dump.c:17726 pg_dump.c:18347
+#, c-format
+msgid "could not parse %s array"
+msgstr "n'a pas pu analyser le tableau %s"
+
+#: pg_dump.c:4500
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "les souscriptions ne sont pas sauvegardées parce que l'utilisateur courant n'est pas un superutilisateur"
+
+#: pg_dump.c:5014
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "n'a pas pu trouver l'extension parent pour %s %s"
+
+#: pg_dump.c:5159
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "le schéma d'OID %u n'existe pas"
+
+#: pg_dump.c:6615 pg_dump.c:16988
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "vérification échouée, OID %u de la table parent de l'OID %u de la séquence introuvable"
+
+#: pg_dump.c:6758
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "vérification échouée, OID de table %u apparaissant dans pg_partitioned_table introuvable"
+
+#: pg_dump.c:6989 pg_dump.c:7256 pg_dump.c:7727 pg_dump.c:8394 pg_dump.c:8515
+#: pg_dump.c:8669
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "OID de table %u non reconnu"
+
+#: pg_dump.c:6993
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "données d'index inattendu pour la table « %s »"
+
+#: pg_dump.c:7488
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "vérification échouée, OID %u de la table parent de l'OID %u de l'entrée de pg_rewrite introuvable"
+
+#: pg_dump.c:7779
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "la requête a produit une réference de nom de table null pour le trigger de la clé étrangère « %s » sur la table « %s » (OID de la table : %u)"
+
+#: pg_dump.c:8398
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "données de colonne inattendues pour la table « %s »"
+
+#: pg_dump.c:8428
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "numérotation des colonnes invalide pour la table « %s »"
+
+#: pg_dump.c:8477
+#, c-format
+msgid "finding table default expressions"
+msgstr "recherche des expressions par défaut de la table"
+
+#: pg_dump.c:8519
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "valeur adnum %d invalide pour la table « %s »"
+
+#: pg_dump.c:8619
+#, c-format
+msgid "finding table check constraints"
+msgstr "recherche des contraintes CHECK de la table"
+
+#: pg_dump.c:8673
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "%d contrainte de vérification attendue pour la table « %s » mais %d trouvée"
+msgstr[1] "%d contraintes de vérification attendues pour la table « %s » mais %d trouvée"
+
+#: pg_dump.c:8677
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "Les catalogues système pourraient être corrompus."
+
+#: pg_dump.c:9367
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "le rôle d'OID %u n'existe pas"
+
+#: pg_dump.c:9479 pg_dump.c:9508
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "entrée pg_init_privs non supportée : %u %u %d"
+
+#: pg_dump.c:10329
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "la colonne typtype du type de données « %s » semble être invalide"
+
+#: pg_dump.c:11904
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "valeur provolatile non reconnue pour la fonction « %s »"
+
+#: pg_dump.c:11954 pg_dump.c:13817
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "valeur proparallel non reconnue pour la fonction « %s »"
+
+#: pg_dump.c:12086 pg_dump.c:12192 pg_dump.c:12199
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "n'a pas pu trouver la définition de la fonction d'OID %u"
+
+#: pg_dump.c:12125
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "valeur erronée dans le champ pg_cast.castfunc ou pg_cast.castmethod"
+
+#: pg_dump.c:12128
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "valeur erronée dans pg_cast.castmethod"
+
+#: pg_dump.c:12218
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "définition de transformation invalide, au moins un de trffromsql et trftosql ne doit pas valoir 0"
+
+#: pg_dump.c:12235
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "valeur erronée dans pg_transform.trffromsql"
+
+#: pg_dump.c:12256
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "valeur erronée dans pg_transform.trftosql"
+
+#: pg_dump.c:12401
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "les opérateurs postfixes ne sont plus supportés (opérateur « %s »)"
+
+#: pg_dump.c:12571
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "n'a pas pu trouver l'opérateur d'OID %s"
+
+#: pg_dump.c:12639
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "type « %c » invalide de la méthode d'accès « %s »"
+
+#: pg_dump.c:13293 pg_dump.c:13346
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "fournisseur de collationnement non reconnu : %s"
+
+#: pg_dump.c:13302 pg_dump.c:13311 pg_dump.c:13321 pg_dump.c:13330
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "collation « %s » invalide"
+
+#: pg_dump.c:13736
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "valeur non reconnue de aggfinalmodify pour l'agrégat « %s »"
+
+#: pg_dump.c:13792
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "valeur non reconnue de aggmfinalmodify pour l'agrégat « %s »"
+
+#: pg_dump.c:14510
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "type d'objet inconnu dans les droits par défaut : %d"
+
+#: pg_dump.c:14526
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "n'a pas pu analyser la liste ACL par défaut (%s)"
+
+#: pg_dump.c:14608
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "n'a pas pu analyser la liste ACL initiale (%s) ou par défaut (%s) pour l'objet « %s » (%s)"
+
+#: pg_dump.c:14633
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "n'a pas pu analyser la liste ACL (%s) ou par défaut (%s) pour l'objet « %s » (%s)"
+
+#: pg_dump.c:15171
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "la requête permettant d'obtenir la définition de la vue « %s » n'a renvoyé aucune donnée"
+
+#: pg_dump.c:15174
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "la requête permettant d'obtenir la définition de la vue « %s » a renvoyé plusieurs définitions"
+
+#: pg_dump.c:15181
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "la définition de la vue « %s » semble être vide (longueur nulle)"
+
+#: pg_dump.c:15265
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS n'est plus supporté (table « %s »)"
+
+#: pg_dump.c:16194
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "numéro de colonne %d invalide pour la table « %s »"
+
+#: pg_dump.c:16272
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "n'a pas pu analyser les colonnes statistiques de l'index"
+
+#: pg_dump.c:16274
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "n'a pas pu analyser les valeurs statistiques de l'index"
+
+#: pg_dump.c:16276
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "nombre de colonnes et de valeurs différentes pour les statistiques des index"
+
+#: pg_dump.c:16494
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "index manquant pour la contrainte « %s »"
+
+#: pg_dump.c:16722
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "type de contrainte inconnu : %c"
+
+#: pg_dump.c:16823 pg_dump.c:17052
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "la requête permettant d'obtenir les données de la séquence « %s » a renvoyé %d ligne (une seule attendue)"
+msgstr[1] "la requête permettant d'obtenir les données de la séquence « %s » a renvoyé %d ligne (une seule attendue)"
+
+#: pg_dump.c:16855
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "type de séquence non reconnu : « %s »"
+
+#: pg_dump.c:17144
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "valeur tgtype inattendue : %d"
+
+#: pg_dump.c:17216
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "chaîne argument invalide (%s) pour le trigger « %s » sur la table « %s »"
+
+#: pg_dump.c:17485
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "la requête permettant d'obtenir la règle « %s » associée à la table « %s » a échoué : mauvais nombre de lignes renvoyées"
+
+#: pg_dump.c:17638
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "n'a pas pu trouver l'extension référencée %u"
+
+#: pg_dump.c:17728
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "nombre différent de configurations et de conditions pour l'extension"
+
+#: pg_dump.c:17860
+#, c-format
+msgid "reading dependency data"
+msgstr "lecture des données de dépendance"
+
+#: pg_dump.c:17946
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "pas d'objet référant %u %u"
+
+#: pg_dump.c:17957
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "pas d'objet référencé %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "dumpId %d invalide"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "dépendance invalide %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "n'a pas pu identifier la boucle de dépendance"
+
+#: pg_dump_sort.c:1276
+#, c-format
+msgid "there are circular foreign-key constraints on this table:"
+msgid_plural "there are circular foreign-key constraints among these tables:"
+msgstr[0] "NOTE : il existe des constraintes de clés étrangères circulaires sur cette table :"
+msgstr[1] "NOTE : il existe des constraintes de clés étrangères circulaires sur ces tables :"
+
+#: pg_dump_sort.c:1281
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "Il est possible de restaurer la sauvegarde sans utiliser --disable-triggers ou sans supprimer temporairement les constraintes."
+
+#: pg_dump_sort.c:1282
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "Considérez l'utilisation d'une sauvegarde complète au lieu d'une sauvegarde des données seulement pour éviter ce problème."
+
+#: pg_dump_sort.c:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "n'a pas pu résoudre la boucle de dépendances parmi ces éléments :"
+
+#: pg_dumpall.c:205
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »"
+
+#: pg_dumpall.c:208
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s"
+
+#: pg_dumpall.c:357
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "l'option --exclude-database ne peut pas être utilisée avec -g/--globals-only, -r/--roles-only ou -t/--tablespaces-only"
+
+#: pg_dumpall.c:365
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "les options « -g/--globals-only » et « -r/--roles-only » ne peuvent pas être utilisées ensemble"
+
+#: pg_dumpall.c:372
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "les options « -g/--globals-only » et « -t/--tablespaces-only » ne peuvent pas être utilisées ensemble"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "les options « -r/--roles-only » et « -t/--tablespaces-only » ne peuvent pas être utilisées ensemble"
+
+#: pg_dumpall.c:444 pg_dumpall.c:1587
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "n'a pas pu se connecter à la base de données « %s »"
+
+#: pg_dumpall.c:456
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"n'a pas pu se connecter aux bases « postgres » et « template1 ».\n"
+"Merci de préciser une autre base de données."
+
+#: pg_dumpall.c:604
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s extrait un cluster de bases de données PostgreSQL dans un fichier de\n"
+"commandes SQL.\n"
+"\n"
+
+#: pg_dumpall.c:606
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_dumpall.c:609
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=FICHIER nom du fichier de sortie\n"
+
+#: pg_dumpall.c:616
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr ""
+" -c, --clean nettoie (supprime) les bases de données avant de\n"
+" les créer\n"
+
+#: pg_dumpall.c:618
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr ""
+" -g, --globals-only sauvegarde uniquement les objets système, pas\n"
+" le contenu des bases de données\n"
+
+#: pg_dumpall.c:619 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner omet la restauration des propriétaires des objets\n"
+
+#: pg_dumpall.c:620
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr ""
+" -r, --roles-only sauvegarde uniquement les rôles, pas les bases\n"
+" de données ni les tablespaces\n"
+
+#: pg_dumpall.c:622
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr ""
+" -S, --superuser=NOM indique le nom du super-utilisateur à utiliser\n"
+" avec le format texte\n"
+
+#: pg_dumpall.c:623
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr ""
+" -t, --tablespaces-only sauvegarde uniquement les tablespaces, pas les\n"
+" bases de données ni les rôles\n"
+
+#: pg_dumpall.c:629
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr ""
+" --exclude-database=MOTIF exclut les bases de données dont le nom\n"
+" correspond au motif\n"
+
+#: pg_dumpall.c:636
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords ne sauvegarde pas les mots de passe des rôles\n"
+
+#: pg_dumpall.c:652
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CHAINE_CONNEX connexion à l'aide de la chaîne de connexion\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=BASE indique une autre base par défaut\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Si -f/--file n'est pas utilisé, le script SQL sera envoyé sur la sortie\n"
+"standard.\n"
+"\n"
+
+#: pg_dumpall.c:803
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "nom de rôle commençant par « pg_ » ignoré (« %s »)"
+
+#: pg_dumpall.c:1018
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "n'a pas pu analyser la liste d'ACL (%s) pour le paramètre « %s »"
+
+#: pg_dumpall.c:1136
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "n'a pas pu analyser la liste d'ACL (%s) pour le tablespace « %s »"
+
+#: pg_dumpall.c:1343
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "exclusion de la base de données « %s »"
+
+#: pg_dumpall.c:1347
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "sauvegarde de la base de données « %s »"
+
+#: pg_dumpall.c:1378
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "échec de pg_dump sur la base de données « %s », quitte"
+
+#: pg_dumpall.c:1384
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "n'a pas pu ré-ouvrir le fichier de sortie « %s » : %m"
+
+#: pg_dumpall.c:1425
+#, c-format
+msgid "running \"%s\""
+msgstr "exécute « %s »"
+
+#: pg_dumpall.c:1630
+#, c-format
+msgid "could not get server version"
+msgstr "n'a pas pu obtenir la version du serveur"
+
+#: pg_dumpall.c:1633
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "n'a pas pu analyser la version du serveur « %s »"
+
+#: pg_dumpall.c:1703 pg_dumpall.c:1726
+#, c-format
+msgid "executing %s"
+msgstr "exécution %s"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "une seule des options -d/--dbname and -f/--file peut être indiquée"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "les options « -d/--dbname » et « -f/--file » ne peuvent pas être utilisées ensemble"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "les options « -C/--create » et « -1/--single-transaction » ne peuvent pas être utilisées ensemble"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "ne peut pas spécifier à la fois l'option --single-transaction et demander plusieurs jobs"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "format d'archive « %s » non reconnu ; merci d'indiquer « c », « d » ou « t »"
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "erreurs ignorées lors de la restauration : %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s restaure une base de données PostgreSQL à partir d'une archive créée\n"
+"par pg_dump.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [OPTION]... [FICHIER]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr ""
+" -d, --dbname=NOM nom de la base de données utilisée pour la\n"
+" connexion\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FICHIER nom du fichier de sortie (- pour stdout)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr ""
+" -F, --format=c|d|t format du fichier de sauvegarde (devrait être\n"
+" automatique)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list affiche la table des matières de l'archive (TOC)\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose mode verbeux\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Options contrôlant la restauration :\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only restaure uniquement les données, pas la structure\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create crée la base de données cible\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error quitte en cas d'erreur, continue par défaut\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NOM restaure l'index indiqué\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr ""
+" -j, --jobs=NOMBRE utilise ce nombre de jobs en parallèle pour la\n"
+" restauration\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=FICHIER utilise la table des matières à partir de ce\n"
+" fichier pour sélectionner/trier la sortie\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NOM restaure uniquement les objets de ce schéma\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NOM ne restaure pas les objets de ce schéma\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NOM(args) restaure la fonction indiquée\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only restaure uniquement la structure, pas les données\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr ""
+" -S, --superuser=NOM indique le nom du super-utilisateur à utiliser\n"
+" pour désactiver les triggers\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NOM restaure la relation indiquée (table, vue, etc)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NOM restaure le trigger indiqué\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr ""
+" -x, --no-privileges omet la restauration des droits sur les objets\n"
+" (grant/revoke)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction restaure dans une seule transaction\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security active la sécurité niveau ligne\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments ne restaure pas les commentaires\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables ne restaure pas les données des tables qui n'ont\n"
+" pas pu être créées\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications ne restaure pas les publications\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels ne restaure pas les labels de sécurité\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions ne restaure pas les souscriptions\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method ne restaure pas les méthodes d'accès aux tables\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces ne restaure pas les affectations de tablespaces\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=SECTION restaure la section indiquée (pre-data, data ou\n"
+" post-data)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=RÔLE exécute SET ROLE avant la restauration\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Les options -I, -n, -N, -P, -t, -T et --section peuvent être combinées et\n"
+"indiquées plusieurs fois pour sélectionner plusieurs objets.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si aucun nom de fichier n'est fourni en entrée, alors l'entrée standard est\n"
+"utilisée.\n"
+"\n"
+
+#, c-format
+#~ msgid " %s"
+#~ msgstr " %s"
+
+#~ msgid " --disable-triggers disable triggers during data-only restore\n"
+#~ msgstr ""
+#~ " --disable-triggers désactiver les déclencheurs lors de la\n"
+#~ " restauration des données seules\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide puis quitte\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide et quitte\n"
+
+#, c-format
+#~ msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"
+#~ msgstr ""
+#~ " --no-synchronized-snapshots n'utilise pas de snapshots synchronisés pour les\n"
+#~ " jobs en parallèle\n"
+
+#~ msgid ""
+#~ " --use-set-session-authorization\n"
+#~ " use SET SESSION AUTHORIZATION commands instead of\n"
+#~ " ALTER OWNER commands to set ownership\n"
+#~ msgstr ""
+#~ " --use-set-session-authorization\n"
+#~ " utilise les commandes SET SESSION AUTHORIZATION\n"
+#~ " au lieu des commandes ALTER OWNER pour les\n"
+#~ " modifier les propriétaires\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version affiche la version puis quitte\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version affiche la version et quitte\n"
+
+#~ msgid " -O, --no-owner skip restoration of object ownership\n"
+#~ msgstr ""
+#~ " -O, --no-owner omettre la restauration des possessions des\n"
+#~ " objets\n"
+
+#~ msgid " -c, --clean clean (drop) database objects before recreating\n"
+#~ msgstr ""
+#~ " -c, --clean nettoie/supprime les bases de données avant de\n"
+#~ " les créer\n"
+
+#~ msgid " -o, --oids include OIDs in dump\n"
+#~ msgstr " -o, --oids inclut les OID dans la sauvegarde\n"
+
+#~ msgid "%s: could not connect to database \"%s\": %s"
+#~ msgstr "%s : n'a pas pu se connecter à la base de données « %s » : %s"
+
+#~ msgid "%s: could not open the output file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier de sauvegarde « %s » : %s\n"
+
+#~ msgid "%s: could not parse ACL list (%s) for database \"%s\"\n"
+#~ msgstr "%s : n'a pas pu analyser la liste d'ACL (%s) pour la base de données « %s »\n"
+
+#~ msgid "%s: could not parse version \"%s\"\n"
+#~ msgstr "%s : n'a pas pu analyser la version « %s »\n"
+
+#~ msgid "%s: executing %s\n"
+#~ msgstr "%s : exécute %s\n"
+
+#~ msgid "%s: invalid -X option -- %s\n"
+#~ msgstr "%s : option -X invalide -- %s\n"
+
+#~ msgid "%s: invalid client encoding \"%s\" specified\n"
+#~ msgstr "%s : encodage client indiqué (« %s ») invalide\n"
+
+#~ msgid "%s: invalid number of parallel jobs\n"
+#~ msgstr "%s : nombre de jobs en parallèle invalide\n"
+
+#~ msgid "%s: option --if-exists requires option -c/--clean\n"
+#~ msgstr "%s : l'option --if-exists nécessite l'option -c/--clean\n"
+
+#~ msgid "%s: options -c/--clean and -a/--data-only cannot be used together\n"
+#~ msgstr ""
+#~ "%s : les options « -c/--clean » et « -a/--data-only » ne peuvent pas être\n"
+#~ "utilisées conjointement\n"
+
+#~ msgid "%s: options -s/--schema-only and -a/--data-only cannot be used together\n"
+#~ msgstr ""
+#~ "%s : les options « -s/--schema-only » et « -a/--data-only » ne peuvent pas être\n"
+#~ "utilisées conjointement\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s : mémoire épuisée\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s : échec de la requête : %s"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s : la requête était : %s\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#~ msgid "(The INSERT command cannot set OIDs.)\n"
+#~ msgstr "(La commande INSERT ne peut pas positionner les OID.)\n"
+
+#~ msgid "*** aborted because of error\n"
+#~ msgstr "*** interrompu du fait d'erreurs\n"
+
+#~ msgid "-C and -1 are incompatible options\n"
+#~ msgstr "-C et -1 sont des options incompatibles\n"
+
+#~ msgid "-C and -c are incompatible options\n"
+#~ msgstr "-C et -c sont des options incompatibles\n"
+
+#~ msgid "LOCK TABLE failed for \"%s\": %s"
+#~ msgstr "LOCK TABLE échoué pour la table « %s » : %s"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+#~ msgstr "Rapporter les bogues à <pgsql-bugs@postgresql.org>.\n"
+
+#~ msgid "SQL command failed\n"
+#~ msgstr "la commande SQL a échoué\n"
+
+#, c-format
+#~ msgid ""
+#~ "Synchronized snapshots are not supported by this server version.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots."
+#~ msgstr ""
+#~ "Les snapshots synchronisés ne sont pas supportés par cette version serveur.\n"
+#~ "Lancez avec --no-synchronized-snapshots à la place si vous n'avez pas besoin\n"
+#~ "de snapshots synchronisés."
+
+#~ msgid ""
+#~ "Synchronized snapshots are not supported on standby servers.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots.\n"
+#~ msgstr ""
+#~ "Les snapshots synchronisés ne sont pas supportés sur les serveurs de stadby.\n"
+#~ "Lancez avec --no-synchronized-snapshots à la place si vous n'avez pas besoin\n"
+#~ "de snapshots synchronisés.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Synchronized snapshots on standby servers are not supported by this server version.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots."
+#~ msgstr ""
+#~ "Les snapshots synchronisés sur les serveurs standbys ne sont pas supportés par cette version serveur.\n"
+#~ "Lancez avec --no-synchronized-snapshots à la place si vous n'avez pas besoin\n"
+#~ "de snapshots synchronisés."
+
+#~ msgid "TOC Entry %s at %s (length %s, checksum %d)\n"
+#~ msgstr "entrée TOC %s à %s (longueur %s, somme de contrôle %d)\n"
+
+#, c-format
+#~ msgid "The command was: %s"
+#~ msgstr "La commande était : %s"
+
+#~ msgid ""
+#~ "The program \"pg_dump\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Le programme « pg_dump » est nécessaire à %s mais n'a pas été trouvé dans le\n"
+#~ "même répertoire que « %s ».\n"
+#~ "Vérifiez votre installation."
+
+#~ msgid ""
+#~ "The program \"pg_dump\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Le programme « pg_dump » a été trouvé par « %s »\n"
+#~ "mais n'a pas la même version que %s.\n"
+#~ "Vérifiez votre installation."
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayer « %s --help » pour plus d'informations.\n"
+
+#~ msgid ""
+#~ "WARNING:\n"
+#~ " This format is for demonstration purposes; it is not intended for\n"
+#~ " normal use. Files will be written in the current working directory.\n"
+#~ msgstr ""
+#~ "ATTENTION :\n"
+#~ " Ce format est présent dans un but de démonstration ; il n'est pas prévu\n"
+#~ " pour une utilisation normale. Les fichiers seront écrits dans le\n"
+#~ " répertoire actuel.\n"
+
+#~ msgid "WARNING: could not parse reloptions array\n"
+#~ msgstr "ATTENTION : n'a pas pu analyser le tableau reloptions\n"
+
+#~ msgid "WSAStartup failed: %d"
+#~ msgstr "WSAStartup a échoué : %d"
+
+#~ msgid "aggregate function %s could not be dumped correctly for this database version; ignored"
+#~ msgstr "la fonction d'aggrégat %s n'a pas pu être sauvegardée correctement avec cette version de la base de données ; ignorée"
+
+#~ msgid "allocating AH for %s, format %d\n"
+#~ msgstr "allocation d'AH pour %s, format %d\n"
+
+#~ msgid "archive member too large for tar format\n"
+#~ msgstr "membre de l'archive trop volumineux pour le format tar\n"
+
+#~ msgid "archiver"
+#~ msgstr "archiveur"
+
+#~ msgid "archiver (db)"
+#~ msgstr "programme d'archivage (db)"
+
+#~ msgid "attempting to ascertain archive format\n"
+#~ msgstr "tentative d'identification du format de l'archive\n"
+
+#, c-format
+#~ msgid "bogus value in proargmodes array"
+#~ msgstr "valeur erronée dans le tableau proargmodes"
+
+#~ msgid "cannot duplicate null pointer\n"
+#~ msgstr "ne peut pas dupliquer un pointeur nul\n"
+
+#~ msgid "cannot reopen non-seekable file\n"
+#~ msgstr "ne peut pas rouvrir le fichier non cherchable\n"
+
+#~ msgid "cannot reopen stdin\n"
+#~ msgstr "ne peut pas rouvrir stdin\n"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "le processus fils a été terminé par le signal %d"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "le processus fils a été terminé par le signal %s"
+
+#~ msgid "compress_io"
+#~ msgstr "compression_io"
+
+#, c-format
+#~ msgid "compression level must be in range 0..9"
+#~ msgstr "le niveau de compression doit être compris entre 0 et 9"
+
+#~ msgid "compression support is disabled in this format\n"
+#~ msgstr "le support de la compression est désactivé avec ce format\n"
+
+#~ msgid "connecting to database \"%s\" as user \"%s\""
+#~ msgstr "connexion à la base de données « %s » en tant qu'utilisateur « %s »"
+
+#~ msgid "connection needs password"
+#~ msgstr "la connexion nécessite un mot de passe"
+
+#~ msgid "connection to database \"%s\" failed: %s"
+#~ msgstr "la connexion à la base de données « %s » a échoué : %s"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "n'a pas pu accéder au répertoire « %s »"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "n'a pas pu changer le répertoire par « %s » : %s"
+
+#~ msgid "could not close data file after reading\n"
+#~ msgstr "n'a pas pu fermer le fichier de données après lecture\n"
+
+#~ msgid "could not close directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu fermer le répertoire « %s » : %s\n"
+
+#~ msgid "could not close large object file\n"
+#~ msgstr "n'a pas pu fermer le fichier du « Large Object »\n"
+
+#, c-format
+#~ msgid "could not close tar member: %m"
+#~ msgstr "n'a pas pu fermer le membre de tar : %m"
+
+#~ msgid "could not connect to database \"%s\": %s"
+#~ msgstr "n'a pas pu se connecter à la base de données « %s » : %s"
+
+#~ msgid "could not create directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu créer le répertoire « %s » : %s\n"
+
+#~ msgid "could not create worker thread: %s\n"
+#~ msgstr "n'a pas pu créer le fil de travail: %s\n"
+
+#~ msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive"
+#~ msgstr ""
+#~ "n'a pas pu trouver l'identifiant de bloc %d dans l'archive --\n"
+#~ "il est possible que cela soit dû à une demande de restauration dans un ordre\n"
+#~ "différent, qui n'a pas pu être géré à cause d'un manque d'information de\n"
+#~ "position dans l'archive"
+
+#~ msgid "could not find entry for pg_indexes in pg_class\n"
+#~ msgstr "n'a pas pu trouver l'entrée de pg_indexes dans pg_class\n"
+
+#~ msgid "could not find slot of finished worker\n"
+#~ msgstr "n'a pas pu trouver l'emplacement du worker qui vient de terminer\n"
+
+#~ msgid "could not get relation name for OID %u: %s\n"
+#~ msgstr "n'a pas pu obtenir le nom de la relation pour l'OID %u: %s\n"
+
+#~ msgid "could not identify current directory: %s"
+#~ msgstr "n'a pas pu identifier le répertoire courant : %s"
+
+#~ msgid "could not open large object TOC for input: %s\n"
+#~ msgstr "n'a pas pu ouvrir la TOC du « Large Object » en entrée : %s\n"
+
+#~ msgid "could not open large object TOC for output: %s\n"
+#~ msgstr "n'a pas pu ouvrir la TOC du « Large Object » en sortie : %s\n"
+
+#~ msgid "could not open output file \"%s\" for writing\n"
+#~ msgstr "n'a pas pu ouvrir le fichier de sauvegarde « %s » en écriture\n"
+
+#, c-format
+#~ msgid "could not open temporary file"
+#~ msgstr "n'a pas pu ouvrir le fichier temporaire"
+
+#~ msgid "could not output padding at end of tar member\n"
+#~ msgstr "n'a pas pu remplir la fin du membre de tar\n"
+
+#~ msgid "could not parse ACL (%s) for large object %u"
+#~ msgstr "n'a pas pu analyser la liste ACL (%s) du « Large Object » %u"
+
+#, c-format
+#~ msgid "could not parse extension condition array"
+#~ msgstr "n'a pas pu analyser le tableau de condition de l'extension"
+
+#, c-format
+#~ msgid "could not parse extension configuration array"
+#~ msgstr "n'a pas pu analyser le tableau de configuration des extensions"
+
+#~ msgid "could not parse index collation name array"
+#~ msgstr "n'a pas pu analyser le tableau des noms de collation de l'index"
+
+#~ msgid "could not parse index collation version array"
+#~ msgstr "n'a pas pu analyser le tableau des versions de collation de l'index"
+
+#, c-format
+#~ msgid "could not parse proallargtypes array"
+#~ msgstr "n'a pas pu analyser le tableau proallargtypes"
+
+#, c-format
+#~ msgid "could not parse proargmodes array"
+#~ msgstr "n'a pas pu analyser le tableau proargmodes"
+
+#, c-format
+#~ msgid "could not parse proargnames array"
+#~ msgstr "n'a pas pu analyser le tableau proargnames"
+
+#, c-format
+#~ msgid "could not parse proconfig array"
+#~ msgstr "n'a pas pu analyser le tableau proconfig"
+
+#, c-format
+#~ msgid "could not parse subpublications array"
+#~ msgstr "n'a pas pu analyser le tableau de sous-publications"
+
+#~ msgid "could not parse version string \"%s\"\n"
+#~ msgstr "n'a pas pu analyser la chaîne de version « %s »\n"
+
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "n'a pas pu lire le lien symbolique « %s »"
+
+#~ msgid "could not reconnect to database"
+#~ msgstr "n'a pas pu se reconnecter à la base de données"
+
+#~ msgid "could not reconnect to database: %s"
+#~ msgstr "n'a pas pu se reconnecter à la base de données : %s"
+
+#~ msgid "could not set default_with_oids: %s"
+#~ msgstr "n'a pas pu configurer default_with_oids : %s"
+
+#~ msgid "could not write byte\n"
+#~ msgstr "n'a pas pu écrire l'octet\n"
+
+#~ msgid "could not write byte: %s\n"
+#~ msgstr "n'a pas pu écrire un octet : %s\n"
+
+#~ msgid "could not write null block at end of tar archive\n"
+#~ msgstr "n'a pas pu écrire le bloc nul à la fin de l'archive tar\n"
+
+#~ msgid "could not write to custom output routine\n"
+#~ msgstr "n'a pas pu écrire vers la routine de sauvegarde personnalisée\n"
+
+#~ msgid "could not write to large object (result: %lu, expected: %lu)"
+#~ msgstr "n'a pas pu écrire le « Large Object » (résultat : %lu, attendu : %lu)"
+
+#~ msgid "custom archiver"
+#~ msgstr "programme d'archivage personnalisé"
+
+#~ msgid "directory archiver"
+#~ msgstr "archiveur répertoire"
+
+#~ msgid "dumpBlobs(): could not open large object %u: %s"
+#~ msgstr "dumpBlobs() : n'a pas pu ouvrir le « Large Object » %u : %s"
+
+#~ msgid "dumpDatabase(): could not find pg_largeobject.relfrozenxid\n"
+#~ msgstr "dumpDatabase() : n'a pas pu trouver pg_largeobject.relfrozenxid\n"
+
+#~ msgid "dumpDatabase(): could not find pg_largeobject_metadata.relfrozenxid\n"
+#~ msgstr "dumpDatabase() : n'a pas pu trouver pg_largeobject_metadata.relfrozenxid\n"
+
+#~ msgid "dumping a specific TOC data block out of order is not supported without ID on this input stream (fseek required)\n"
+#~ msgstr ""
+#~ "la sauvegarde d'un bloc de données spécifique du TOC dans le désordre n'est\n"
+#~ "pas supporté sans identifiant sur ce flux d'entrée (fseek requis)\n"
+
+#~ msgid "entering restore_toc_entries_parallel\n"
+#~ msgstr "entrée dans restore_toc_entries_parallel\n"
+
+#~ msgid "entering restore_toc_entries_postfork\n"
+#~ msgstr "entrée dans restore_toc_entries_prefork\n"
+
+#~ msgid "entering restore_toc_entries_prefork\n"
+#~ msgstr "entrée dans restore_toc_entries_prefork\n"
+
+#~ msgid "error during backup\n"
+#~ msgstr "erreur lors de la sauvegarde\n"
+
+#~ msgid "error in ListenToWorkers(): %s\n"
+#~ msgstr "erreur dans ListenToWorkers(): %s\n"
+
+#~ msgid "error processing a parallel work item\n"
+#~ msgstr "erreur durant le traitement en parallèle d'un item\n"
+
+#, c-format
+#~ msgid "extra_float_digits must be in range -15..3"
+#~ msgstr "extra_float_digits doit être dans l'intervalle -15 à 3"
+
+#~ msgid "failed to connect to database\n"
+#~ msgstr "n'a pas pu se connecter à la base de données\n"
+
+#~ msgid "failed to reconnect to database\n"
+#~ msgstr "la reconnexion à la base de données a échoué\n"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#~ msgid "file archiver"
+#~ msgstr "programme d'archivage de fichiers"
+
+#, c-format
+#~ msgid "finding check constraints for table \"%s.%s\""
+#~ msgstr "recherche des contraintes de vérification pour la table « %s.%s »"
+
+#, c-format
+#~ msgid "finding default expressions of table \"%s.%s\""
+#~ msgstr "recherche des expressions par défaut de la table « %s.%s »"
+
+#, c-format
+#~ msgid "finding the columns and types of table \"%s.%s\""
+#~ msgstr "recherche des colonnes et types de la table « %s.%s »"
+
+#~ msgid "found more than one entry for pg_indexes in pg_class\n"
+#~ msgstr "a trouvé plusieurs entrées pour pg_indexes dans la table pg_class\n"
+
+#~ msgid "found more than one pg_database entry for this database\n"
+#~ msgstr "a trouvé plusieurs entrées dans pg_database pour cette base de données\n"
+
+#~ msgid "ftell mismatch with expected position -- ftell used"
+#~ msgstr "ftell ne correspond pas à la position attendue -- ftell utilisé"
+
+#~ msgid "internal error -- neither th nor fh specified in _tarReadRaw()"
+#~ msgstr "erreur interne -- ni th ni fh ne sont précisés dans _tarReadRaw()"
+
+#~ msgid "invalid COPY statement -- could not find \"copy\" in string \"%s\"\n"
+#~ msgstr "instruction COPY invalide -- n'a pas pu trouver « copy » dans la chaîne « %s »\n"
+
+#~ msgid "invalid COPY statement -- could not find \"from stdin\" in string \"%s\" starting at position %lu\n"
+#~ msgstr ""
+#~ "instruction COPY invalide -- n'a pas pu trouver « from stdin » dans la\n"
+#~ "chaîne « %s » à partir de la position %lu\n"
+
+#~ msgid "invalid TOASTCOMPRESSION item: %s"
+#~ msgstr "élément TOASTCOMPRESSION invalide : %s"
+
+#, c-format
+#~ msgid "invalid number of parallel jobs"
+#~ msgstr "nombre de jobs parallèles invalide"
+
+#, c-format
+#~ msgid "maximum number of parallel jobs is %d"
+#~ msgstr "le nombre maximum de jobs en parallèle est %d"
+
+#~ msgid "mismatch in actual vs. predicted file position (%s vs. %s)\n"
+#~ msgstr ""
+#~ "pas de correspondance entre la position réelle et celle prévue du fichier\n"
+#~ "(%s vs. %s)\n"
+
+#~ msgid "mismatched number of collation names and versions for index"
+#~ msgstr "nombre différent de noms et versions de collation pour l'index"
+
+#~ msgid "missing pg_database entry for database \"%s\"\n"
+#~ msgstr "entrée manquante dans pg_database pour la base de données « %s »\n"
+
+#~ msgid "missing pg_database entry for this database\n"
+#~ msgstr "entrée pg_database manquante pour cette base de données\n"
+
+#~ msgid "moving from position %s to next member at file position %s\n"
+#~ msgstr "déplacement de la position %s vers le prochain membre à la position %s du fichier\n"
+
+#~ msgid "no item ready\n"
+#~ msgstr "aucun élément prêt\n"
+
+#~ msgid "no label definitions found for enum ID %u\n"
+#~ msgstr "aucune définition de label trouvée pour l'ID enum %u\n"
+
+#~ msgid "now at file position %s\n"
+#~ msgstr "maintenant en position %s du fichier\n"
+
+#~ msgid "option --index-collation-versions-unknown only works in binary upgrade mode"
+#~ msgstr "l'option --index-collation-versions-unknown fonctionne seulement dans le mode de mise à jour binaire"
+
+#~ msgid "options --inserts/--column-inserts and -o/--oids cannot be used together\n"
+#~ msgstr ""
+#~ "les options « --inserts/--column-inserts » et « -o/--oids » ne\n"
+#~ "peuvent pas être utilisées conjointement\n"
+
+#, c-format
+#~ msgid "owner of aggregate function \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire de la fonction d'agrégat « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of data type \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire du type de données « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of function \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire de la fonction « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of operator \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire de l'opérateur « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of operator class \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire de la classe d'opérateur « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of operator family \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire de la famille d'opérateur « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of publication \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire de la publication « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of schema \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire du schéma « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of subscription \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire de la souscription « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of table \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire de la table « %s » semble être invalide"
+
+#~ msgid "parallel archiver"
+#~ msgstr "archiveur en parallèle"
+
+#~ msgid "parallel_restore should not return\n"
+#~ msgstr "parallel_restore ne devrait pas retourner\n"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "échec de pclose : %m"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "échec de pclose : %s"
+
+#~ msgid "query returned %d foreign server entry for foreign table \"%s\"\n"
+#~ msgid_plural "query returned %d foreign server entries for foreign table \"%s\"\n"
+#~ msgstr[0] "la requête a renvoyé %d entrée de serveur distant pour la table distante « %s »\n"
+#~ msgstr[1] "la requête a renvoyé %d entrées de serveurs distants pour la table distante « %s »\n"
+
+#~ msgid "query returned %d row instead of one: %s\n"
+#~ msgid_plural "query returned %d rows instead of one: %s\n"
+#~ msgstr[0] "la requête a renvoyé %d ligne au lieu d'une seule : %s\n"
+#~ msgstr[1] "la requête a renvoyé %d lignes au lieu d'une seule : %s\n"
+
+#~ msgid "query returned %d rows instead of one: %s\n"
+#~ msgstr "la requête a renvoyé %d lignes au lieu d'une seule : %s\n"
+
+#~ msgid "query returned more than one (%d) pg_database entry for database \"%s\"\n"
+#~ msgstr ""
+#~ "la requête a renvoyé plusieurs (%d) entrées pg_database pour la base de\n"
+#~ "données « %s »\n"
+
+#~ msgid "query returned no rows: %s\n"
+#~ msgstr "la requête n'a renvoyé aucune ligne : %s\n"
+
+#~ msgid "query to get data of sequence \"%s\" returned name \"%s\"\n"
+#~ msgstr ""
+#~ "la requête permettant d'obtenir les données de la séquence « %s » a renvoyé\n"
+#~ "le nom « %s »\n"
+
+#~ msgid "query was: %s\n"
+#~ msgstr "la requête était : %s\n"
+
+#~ msgid "read %lu byte into lookahead buffer\n"
+#~ msgid_plural "read %lu bytes into lookahead buffer\n"
+#~ msgstr[0] "lecture de %lu octet dans le tampon prévisionnel\n"
+#~ msgstr[1] "lecture de %lu octets dans le tampon prévisionnel\n"
+
+#~ msgid "read TOC entry %d (ID %d) for %s %s\n"
+#~ msgstr "lecture de l'entrée %d de la TOC (ID %d) pour %s %s\n"
+
+#~ msgid "reading extended statistics for table \"%s.%s\"\n"
+#~ msgstr "lecture des statistiques étendues pour la table « %s.%s »\n"
+
+#, c-format
+#~ msgid "reading foreign key constraints for table \"%s.%s\""
+#~ msgstr "lecture des contraintes de clés étrangères pour la table « %s.%s »"
+
+#, c-format
+#~ msgid "reading indexes for table \"%s.%s\""
+#~ msgstr "lecture des index de la table « %s.%s »"
+
+#~ msgid "reading policies for table \"%s.%s\""
+#~ msgstr "lecture des politiques pour la table « %s.%s »"
+
+#~ msgid "reading row security enabled for table \"%s.%s\""
+#~ msgstr "lecture de l'activation de la sécurité niveau ligne pour la table « %s.%s »"
+
+#, c-format
+#~ msgid "reading triggers for table \"%s.%s\""
+#~ msgstr "lecture des triggers pour la table « %s.%s »"
+
+#~ msgid "reconnection to database \"%s\" failed: %s"
+#~ msgstr "reconnexion à la base de données « %s » échouée : %s"
+
+#~ msgid "reducing dependencies for %d\n"
+#~ msgstr "réduction des dépendances pour %d\n"
+
+#~ msgid "requested %d byte, got %d from lookahead and %d from file\n"
+#~ msgid_plural "requested %d bytes, got %d from lookahead and %d from file\n"
+#~ msgstr[0] "%d octet requis, %d obtenu de « lookahead » et %d du fichier\n"
+#~ msgstr[1] "%d octets requis, %d obtenus de « lookahead » et %d du fichier\n"
+
+#~ msgid "restoring large object OID %u\n"
+#~ msgstr "restauration du « Large Object » d'OID %u\n"
+
+#, c-format
+#~ msgid "rows-per-insert must be in range %d..%d"
+#~ msgstr "le nombre de lignes par insertion doit être compris entre %d et %d"
+
+#~ msgid "saving default_toast_compression = %s"
+#~ msgstr "sauvegarde de default_toast_compression = %s"
+
+#~ msgid "saving large object properties\n"
+#~ msgstr "sauvegarde des propriétés des « Large Objects »\n"
+
+#~ msgid "schema with OID %u does not exist\n"
+#~ msgstr "le schéma d'OID %u n'existe pas\n"
+
+#~ msgid "select() failed: %m"
+#~ msgstr "échec de select() : %m"
+
+#~ msgid "select() failed: %s\n"
+#~ msgstr "échec de select() : %s\n"
+
+#~ msgid "server version must be at least 7.3 to use schema selection switches\n"
+#~ msgstr ""
+#~ "le serveur doit être de version 7.3 ou supérieure pour utiliser les options\n"
+#~ "de sélection du schéma\n"
+
+#~ msgid "setting owner and privileges for %s \"%s\"\n"
+#~ msgstr "réglage du propriétaire et des droits pour %s « %s »\n"
+
+#~ msgid "setting owner and privileges for %s \"%s.%s\"\n"
+#~ msgstr "réglage du propriétaire et des droits pour %s « %s.%s»\n"
+
+#~ msgid "skipping tar member %s\n"
+#~ msgstr "omission du membre %s du tar\n"
+
+#~ msgid "sorter"
+#~ msgstr "tri"
+
+#~ msgid "tar archiver"
+#~ msgstr "archiveur tar"
+
+#~ msgid "terminated by user\n"
+#~ msgstr "terminé par l'utilisateur\n"
+
+#~ msgid "transferring dependency %d -> %d to %d\n"
+#~ msgstr "transfert de la dépendance %d -> %d vers %d\n"
+
+#~ msgid "unexpected end of file\n"
+#~ msgstr "fin de fichier inattendu\n"
+
+#~ msgid "unrecognized collation provider: %s\n"
+#~ msgstr "fournisseur de collationnement non reconnu : %s\n"
+
+#~ msgid "unrecognized command on communication channel: %s\n"
+#~ msgstr "commande inconnue sur le canal de communucation: %s\n"
+
+#~ msgid "worker is terminating\n"
+#~ msgstr "le worker est en cours d'arrêt\n"
+
+#~ msgid "worker process crashed: status %d\n"
+#~ msgstr "crash du processus worker : statut %d\n"
diff --git a/src/bin/pg_dump/po/it.po b/src/bin/pg_dump/po/it.po
new file mode 100644
index 0000000..0df365b
--- /dev/null
+++ b/src/bin/pg_dump/po/it.po
@@ -0,0 +1,2939 @@
+#
+# pg_dump.po
+# Italian message translation file for pg_dump
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+# Copyright (C) 2010, Associazione Culturale ITPUG
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017.
+# Cosimo D'Arcangelo <cosimo.darcangelo@itpug.org>, 2010.
+# Mirko Tebaldi <mirko.tebaldi@libero.it>, 2004.
+# Fabrizio Mazzoni <veramente@libero.it>, 2003.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (Postgresql) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:19+0000\n"
+"PO-Revision-Date: 2022-10-06 08:57+0200\n"
+"Last-Translator: Domenico Sgarbossa <sgarbossa.domenico@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 2.3\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "impossibile identificare la directory corrente: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binario non valido \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "lettura del binario \"%s\" fallita"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "programma \"%s\" da eseguire non trovato"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "spostamento nella directory \"%s\" fallito: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "lettura del link simbolico \"%s\" fallita: %m"
+
+#: ../../common/exec.c:422 parallel.c:1611
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() non riuscito: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "memoria esaurita"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "impossibile duplicare il puntatore nullo (errore interno)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "comando non eseguibile"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "comando non trovato"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "processo figlio uscito con codice di uscita %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "processo figlio terminato da eccezione 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "processo figlio terminato da segnale %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "processo figlio uscito con stato non riconosciuto %d"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valore \"%s\" per opzione \"%s\" non valido"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s deve essere compreso nell'intervallo %d..%d"
+
+#: common.c:134
+#, c-format
+msgid "reading extensions"
+msgstr "lettura delle estensioni"
+
+#: common.c:137
+#, c-format
+msgid "identifying extension members"
+msgstr "identificazione dei membri delle estensioni"
+
+#: common.c:140
+#, c-format
+msgid "reading schemas"
+msgstr "lettura schemi"
+
+#: common.c:149
+#, c-format
+msgid "reading user-defined tables"
+msgstr "lettura delle tabelle definite dall'utente"
+
+#: common.c:154
+#, c-format
+msgid "reading user-defined functions"
+msgstr "lettura funzioni definite dall'utente"
+
+#: common.c:158
+#, c-format
+msgid "reading user-defined types"
+msgstr "lettura tipi definiti dall'utente"
+
+#: common.c:162
+#, c-format
+msgid "reading procedural languages"
+msgstr "lettura linguaggi procedurali"
+
+#: common.c:165
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "lettura funzioni di aggregazione definite dall'utente"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined operators"
+msgstr "lettura operatori definiti dall'utente"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "lettura dei metodi di accesso definiti dall'utente"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "lettura classi operatore definite dall'utente"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "lettura delle famiglie di operatori definiti dall'utente"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "lettura dei parser di ricerca testo definiti dall'utente"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "lettura dei modelli di ricerca testo definiti dall'utente"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "lettura dei dizionari di ricerca testo definiti dall'utente"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "lettura delle configurazioni di ricerca testo definite dall'utente"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "lettura dei wrapper di dati esterni definiti dall'utente"
+
+#: common.c:195
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "lettura dei server esterni definiti dall'utente"
+
+#: common.c:198
+#, c-format
+msgid "reading default privileges"
+msgstr "lettura dei privilegi predefiniti"
+
+#: common.c:201
+#, c-format
+msgid "reading user-defined collations"
+msgstr "lettura delle collations definite dall'utente"
+
+#: common.c:204
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "lettura delle conversioni definite dall'utente"
+
+#: common.c:207
+#, c-format
+msgid "reading type casts"
+msgstr "lettura delle conversioni dei tipi"
+
+#: common.c:210
+#, c-format
+msgid "reading transforms"
+msgstr "lettura delle trasformazioni"
+
+#: common.c:213
+#, c-format
+msgid "reading table inheritance information"
+msgstr "lettura informazioni di ereditarietà delle tabelle"
+
+#: common.c:216
+#, c-format
+msgid "reading event triggers"
+msgstr "lettura dei trigger di evento"
+
+#: common.c:220
+#, c-format
+msgid "finding extension tables"
+msgstr "ricerca delle tabelle delle estensioni"
+
+#: common.c:224
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "ricerca delle relazioni di ereditarietà"
+
+#: common.c:227
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "lettura informazioni di colonna per le tabelle interessate"
+
+#: common.c:230
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "marcatura colonne ereditate nelle sottotabelle"
+
+#: common.c:233
+#, c-format
+msgid "reading indexes"
+msgstr "lettura degli indici"
+
+#: common.c:236
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "marcatura indici nelle tabelle partizionate"
+
+#: common.c:239
+#, c-format
+msgid "reading extended statistics"
+msgstr "lettura delle statistiche estese"
+
+#: common.c:242
+#, c-format
+msgid "reading constraints"
+msgstr "lettura dei vincoli"
+
+#: common.c:245
+#, c-format
+msgid "reading triggers"
+msgstr "lettura dei trigger"
+
+#: common.c:248
+#, c-format
+msgid "reading rewrite rules"
+msgstr "lettura regole di riscrittura"
+
+#: common.c:251
+#, c-format
+msgid "reading policies"
+msgstr "lettura delle regole di sicurezza"
+
+#: common.c:254
+#, c-format
+msgid "reading publications"
+msgstr "lettura delle pubblicazioni"
+
+#: common.c:257
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "lettura pubblicazione appartenenza a tabelle"
+
+#: common.c:260
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "lettura dei membri della pubblicazione"
+
+#: common.c:263
+#, c-format
+msgid "reading subscriptions"
+msgstr "lettura delle sottoscrizioni"
+
+#: common.c:343
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "numero di genitori %d non valido per la tabella \"%s\""
+
+#: common.c:1004
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "controllo di integrità fallito, OID padre %u della tabella \"%s\" (OID %u) non trovato"
+
+#: common.c:1043
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "non è stato possibile interpretare l'array numerico \"%s\": troppi numeri"
+
+#: common.c:1055
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "non è stato possibile interpretare l'array numerico \"%s\": caratteri non validi nel numero"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "codice di compressione non valido: %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504
+#: compress_io.c:547
+#, c-format
+msgid "not built with zlib support"
+msgstr "compilato senza il supporto a zlib"
+
+#: compress_io.c:236 compress_io.c:333
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "inizializzazione della libreria di compressione fallita: %s"
+
+#: compress_io.c:256
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "chiusura dello stream di compressione fallita: %s"
+
+#: compress_io.c:273
+#, c-format
+msgid "could not compress data: %s"
+msgstr "compressione dei dati fallita: %s"
+
+#: compress_io.c:349 compress_io.c:364
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "decompressione dei dati fallita: %s"
+
+#: compress_io.c:371
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "chiusura della libreria di compressione fallita: %s"
+
+#: compress_io.c:584 compress_io.c:621
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "lettura dal file di input fallita: %s"
+
+#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553
+#: pg_backup_tar.c:726 pg_backup_tar.c:749
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "lettura dal file di input fallita: fine del file"
+
+#: parallel.c:253
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() non riuscito: codice di errore %d"
+
+#: parallel.c:961
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "creazione dei canali di comunicazione fallita: %m"
+
+#: parallel.c:1018
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "creazione del processo worker fallita: %m"
+
+#: parallel.c:1148
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "comando sconosciuto ricevuto dal master: \"%s\""
+
+#: parallel.c:1191 parallel.c:1429
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "messaggio non valido ricevuto dal worker: \"%s\""
+
+#: parallel.c:1323
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"errore nell'ottenere un lock sulla relazione \"%s\"\n"
+"Questo di solito vuol dire che qualcuno ha richiesto un lock ACCESS EXCLUSIVE sulla tabella dopo che il processo padre di pg_dump aveva ottenuto il lock ACCESS SHARE iniziale sulla tabella."
+
+#: parallel.c:1412
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "un processo worker è morto inaspettatamente"
+
+#: parallel.c:1534 parallel.c:1652
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "impossibile scrivere sul canale di comunicazione: %m"
+
+#: parallel.c:1736
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: errore nella creazione del socket: codice di errore %d"
+
+#: parallel.c:1747
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: bind fallito: codice di errore %d"
+
+#: parallel.c:1754
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: listen fallito: codice di errore %d"
+
+#: parallel.c:1761
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s() non riuscito: codice di errore %d"
+
+#: parallel.c:1772
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: creazione del secondo socket fallita: codice di errore %d"
+
+#: parallel.c:1781
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: connessione del socket fallita: codice di errore %d"
+
+#: parallel.c:1790
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: accept della connessione fallito: codice di errore %d"
+
+#: pg_backup_archiver.c:279 pg_backup_archiver.c:1576
+#, c-format
+msgid "could not close output file: %m"
+msgstr "chiusura del file di output fallita: %m"
+
+#: pg_backup_archiver.c:323 pg_backup_archiver.c:327
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "archiviare gli elementi non nell'ordine delle sezioni corretto"
+
+#: pg_backup_archiver.c:333
+#, c-format
+msgid "unexpected section code %d"
+msgstr "codice di sezione non prevista %d"
+
+#: pg_backup_archiver.c:370
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "il ripristino parallelo non è supportato con questo formato di archivio"
+
+#: pg_backup_archiver.c:374
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "il ripristino parallelo non è supportato con archivi eseguiti da pg_dump precedenti la versione 8.0"
+
+#: pg_backup_archiver.c:392
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)"
+msgstr "non è possibile ripristinare da archivio compresso (compressione non supportata in questa installazione)"
+
+#: pg_backup_archiver.c:409
+#, c-format
+msgid "connecting to database for restore"
+msgstr "connessione al database per il ripristino"
+
+#: pg_backup_archiver.c:411
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "le connessioni dirette al database non sono supportate negli archivi pre-1.3"
+
+#: pg_backup_archiver.c:454
+#, c-format
+msgid "implied data-only restore"
+msgstr "ripristino implicito dei soli dati"
+
+#: pg_backup_archiver.c:520
+#, c-format
+msgid "dropping %s %s"
+msgstr "cancellazione di %s %s"
+
+#: pg_backup_archiver.c:615
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "impossibile trovare dove inserire IF EXISTS nell'istruzione \"%s\""
+
+#: pg_backup_archiver.c:771 pg_backup_archiver.c:773
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "avvertimento dal file originale scaricato: %s"
+
+#: pg_backup_archiver.c:788
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "creazione %s \"%s.%s\""
+
+#: pg_backup_archiver.c:791
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "creazione di %s \"%s\""
+
+#: pg_backup_archiver.c:841
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "connessione al nuovo database \"%s\""
+
+#: pg_backup_archiver.c:868
+#, c-format
+msgid "processing %s"
+msgstr "elaborazione di %s"
+
+#: pg_backup_archiver.c:888
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "elaborazione dati per la tabella \"%s.%s\"."
+
+#: pg_backup_archiver.c:947
+#, c-format
+msgid "executing %s %s"
+msgstr "esecuzione di %s %s"
+
+#: pg_backup_archiver.c:986
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "disabilitazione trigger per %s"
+
+#: pg_backup_archiver.c:1012
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "abilitazione trigger per %s"
+
+#: pg_backup_archiver.c:1040
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "errore interno -- WriteData non può essere chiamata al di fuori del contesto di una routine DataDumper"
+
+#: pg_backup_archiver.c:1223
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "emissione dei large object non supportata nel formato scelto"
+
+#: pg_backup_archiver.c:1281
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "ripristinato %d large object"
+msgstr[1] "ripristinati %d large object"
+
+#: pg_backup_archiver.c:1302 pg_backup_tar.c:669
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "ripristino del large object con OID %u"
+
+#: pg_backup_archiver.c:1314
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "creazione il large object %u fallita: %s"
+
+#: pg_backup_archiver.c:1319 pg_dump.c:3568
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "apertura del large object %u fallita: %s"
+
+#: pg_backup_archiver.c:1375
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "apertura del file TOC \"%s\" fallita: %m"
+
+#: pg_backup_archiver.c:1403
+#, c-format
+msgid "line ignored: %s"
+msgstr "riga ignorata: %s"
+
+#: pg_backup_archiver.c:1410
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "non sono state trovate voci per l'ID %d"
+
+#: pg_backup_archiver.c:1433 pg_backup_directory.c:222
+#: pg_backup_directory.c:599
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "chiusura del file TOC fallita: %m"
+
+#: pg_backup_archiver.c:1547 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:586 pg_backup_directory.c:649
+#: pg_backup_directory.c:668 pg_dumpall.c:476
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "apertura del file di output \"%s\" fallita: %m"
+
+#: pg_backup_archiver.c:1549 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "apertura del file di output fallita: %m"
+
+#: pg_backup_archiver.c:1643
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "scritto %zu byte di dati large object (risultato = %d)"
+msgstr[1] "scritto %zu bytes di dati large object (risultato = %d)"
+
+#: pg_backup_archiver.c:1649
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "impossibile scrivere su un oggetto di grandi dimensioni: %s"
+
+#: pg_backup_archiver.c:1739
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "Errore durante INIZIALIZZAZIONE:"
+
+#: pg_backup_archiver.c:1744
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "Errore durante ELABORAZIONE TOC:"
+
+#: pg_backup_archiver.c:1749
+#, c-format
+msgid "while FINALIZING:"
+msgstr "Errore durante FINALIZZAZIONE:"
+
+#: pg_backup_archiver.c:1754
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "Errore nella voce TOC %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1830
+#, c-format
+msgid "bad dumpId"
+msgstr "dumpId errato"
+
+#: pg_backup_archiver.c:1851
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "dumpId di tabella errato per elemento TABLE DATA"
+
+#: pg_backup_archiver.c:1943
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "flag di offset dati non previsto %d"
+
+#: pg_backup_archiver.c:1956
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "l'offset del file scaricato è troppo grande"
+
+#: pg_backup_archiver.c:2094 pg_backup_archiver.c:2104
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "nome della directory troppo lungo: \"%s\""
+
+#: pg_backup_archiver.c:2112
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "la directory \"%s\" non sembra un archivio valido (\"toc.dat\" non esiste)"
+
+#: pg_backup_archiver.c:2120 pg_backup_custom.c:173 pg_backup_custom.c:807
+#: pg_backup_directory.c:207 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "impossibile aprire il file di input \"%s\": %m"
+
+#: pg_backup_archiver.c:2127 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "apertura del file di input fallita: %m"
+
+#: pg_backup_archiver.c:2133
+#, c-format
+msgid "could not read input file: %m"
+msgstr "lettura del file di input fallita: %m"
+
+#: pg_backup_archiver.c:2135
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "il file di input è troppo corto (letti %lu, previsti 5)"
+
+#: pg_backup_archiver.c:2167
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "il file di input sembra un dump in formato testo. Prego usare psql."
+
+#: pg_backup_archiver.c:2173
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "il file di input non sembra essere un archivio valido (è troppo corto?)"
+
+#: pg_backup_archiver.c:2179
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "il file di input non sembra essere un archivio valido"
+
+#: pg_backup_archiver.c:2188
+#, c-format
+msgid "could not close input file: %m"
+msgstr "chiusura del file di input fallita: %m"
+
+#: pg_backup_archiver.c:2305
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "formato di file \"%d\" sconosciuto"
+
+#: pg_backup_archiver.c:2387 pg_backup_archiver.c:4445
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "elemento %d %s %s terminato"
+
+#: pg_backup_archiver.c:2391 pg_backup_archiver.c:4458
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "processo worker fallito: codice di uscita %d"
+
+#: pg_backup_archiver.c:2512
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "la voce ID %d è fuori dall'intervallo consentito -- possibile corruzione della TOC"
+
+#: pg_backup_archiver.c:2592
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "il ripristino delle tabelle CON OIDS non è più supportato"
+
+#: pg_backup_archiver.c:2674
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "codifica sconosciuta \"%s\""
+
+#: pg_backup_archiver.c:2679
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "elemento ENCODING non valido: %s"
+
+#: pg_backup_archiver.c:2697
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "elemento STDSTRINGS non valido: %s"
+
+#: pg_backup_archiver.c:2722
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "schema \"%s\" non trovato"
+
+#: pg_backup_archiver.c:2729
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "tabella \"%s\" non trovata"
+
+#: pg_backup_archiver.c:2736
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "indice \"%s\" non trovato"
+
+#: pg_backup_archiver.c:2743
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "funzione \"%s\" non trovata"
+
+#: pg_backup_archiver.c:2750
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "trigger \"%s\" non trovato"
+
+#: pg_backup_archiver.c:3143
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "impostazione della sessione utente a \"%s\" fallita: %s"
+
+#: pg_backup_archiver.c:3280
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "impostazione di search_path a \"%s\" fallita: %s"
+
+#: pg_backup_archiver.c:3342
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "impostazione di default_tablespace a %s fallita: %s"
+
+#: pg_backup_archiver.c:3392
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "impossibile impostare default_table_access_method: %s"
+
+#: pg_backup_archiver.c:3486 pg_backup_archiver.c:3651
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "non so come impostare il proprietario per il tipo di oggetto \"%s\""
+
+#: pg_backup_archiver.c:3754
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "magic string non trovata nell'intestazione del file"
+
+#: pg_backup_archiver.c:3768
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "versione (%d.%d) non supportata nell'intestazione del file"
+
+#: pg_backup_archiver.c:3773
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "verifica sulla dimensione degli interi (%lu) fallita"
+
+#: pg_backup_archiver.c:3777
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "l'archivio è stato creato su una macchina con numeri interi più grandi, alcune operazioni potrebbero non riuscire"
+
+#: pg_backup_archiver.c:3787
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "il formato previsto (%d) differisce dal formato trovato nel file (%d)"
+
+#: pg_backup_archiver.c:3802
+#, c-format
+msgid "archive is compressed, but this installation does not support compression -- no data will be available"
+msgstr "l'archivio è compresso, ma questa installazione non supporta la compressione: non saranno disponibili dati"
+
+#: pg_backup_archiver.c:3836
+#, c-format
+msgid "invalid creation date in header"
+msgstr "data di creazione non valida nell'intestazione"
+
+#: pg_backup_archiver.c:3970
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "elaborazione elemento %d %s %s"
+
+#: pg_backup_archiver.c:4049
+#, c-format
+msgid "entering main parallel loop"
+msgstr "inizio del loop principale parallelo"
+
+#: pg_backup_archiver.c:4060
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "saltato l'elemento %d %s %s"
+
+#: pg_backup_archiver.c:4069
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "avvio dell'elemento %d %s %s-"
+
+#: pg_backup_archiver.c:4123
+#, c-format
+msgid "finished main parallel loop"
+msgstr "loop principale parallelo terminato"
+
+#: pg_backup_archiver.c:4159
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "elaborazione dell'elemento perduto %d %s %s"
+
+#: pg_backup_archiver.c:4764
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "creazione della tabella \"%s\" fallita, i suoi dati non verranno ripristinati"
+
+#: pg_backup_custom.c:376 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "OID non valido per large object"
+
+#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629
+#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021
+#, c-format
+msgid "error during file seek: %m"
+msgstr "errore durante lo spostamento nel file: %m"
+
+#: pg_backup_custom.c:478
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "il blocco dati %d ha una posizione di ricerca errata"
+
+#: pg_backup_custom.c:495
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "tipo di blocco dati sconosciuto (%d) durante la ricerca in archivio"
+
+#: pg_backup_custom.c:517
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "blocco ID %d non trovato nell'archivio -- forse per una richiesta di ripristino fuori ordine, che non può essere eseguita perché il file di input non supporta il seek"
+
+#: pg_backup_custom.c:522
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "blocco ID %d non trovato nell'archivio -- forse l'archivio è corrotto"
+
+#: pg_backup_custom.c:529
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "trovato il blocco ID (%d) inatteso leggendo i dati -- previsto %d"
+
+#: pg_backup_custom.c:543
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "tipo di blocco dati sconosciuto %d durante il ripristino dell'archivio"
+
+#: pg_backup_custom.c:645
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "lettura dal file di input fallita: %m"
+
+#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943
+#: pg_backup_tar.c:1019
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "non è stato possibile determinare la posizione per il seek nel file d'archivio: %m"
+
+#: pg_backup_custom.c:762 pg_backup_custom.c:802
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "chiusura del file di archivio fallita: %m"
+
+#: pg_backup_custom.c:785
+#, c-format
+msgid "can only reopen input archives"
+msgstr "solo gli archivi in input possono essere riaperti"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "il ripristino in parallelo da standard input non è supportato"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "il ripristino in parallelo da un file che non supporta il seek non è supportato"
+
+#: pg_backup_custom.c:810
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "impossibile impostare la posizione di ricerca nel file di archivio: %m"
+
+#: pg_backup_custom.c:889
+#, c-format
+msgid "compressor active"
+msgstr "compressione attiva"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "non è stato possibile ottenere server_version da libpq"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1646
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "abortito perché la versione del server non corrisponde"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1647
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "versione del server: %s; %s versione: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "già connesso ad un database"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595
+msgid "Password: "
+msgstr "Password: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "riconnessione al database fallita"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "riconnessione non riuscita: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dumpall.c:1520 pg_dumpall.c:1604
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732
+#, c-format
+msgid "query failed: %s"
+msgstr "query fallita: %s"
+
+#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733
+#, c-format
+msgid "Query was: %s"
+msgstr "La richiesta era: %s"
+
+#: pg_backup_db.c:316
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "la query ha restituito %d riga invece di una: %s"
+msgstr[1] "la query ha restituito %d righe invece di una: %s"
+
+#: pg_backup_db.c:352
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %s Il comando era: %s"
+
+#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489
+msgid "could not execute query"
+msgstr "esecuzione della query fallita"
+
+#: pg_backup_db.c:461
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "errore restituito da PQputCopyData: %s"
+
+#: pg_backup_db.c:510
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "errore restituito da PQputCopyEnd: %s"
+
+#: pg_backup_db.c:516
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY fallito per la tabella \"%s\": %s"
+
+#: pg_backup_db.c:522 pg_dump.c:2105
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "risultati extra imprevisti durante la COPIA della tabella \"%s\""
+
+#: pg_backup_db.c:534
+msgid "could not start database transaction"
+msgstr "avvio della transazione database fallito"
+
+#: pg_backup_db.c:542
+msgid "could not commit database transaction"
+msgstr "commit della transazione database fallito"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "directory di output non specificata"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "lettura della directory \"%s\" fallita: %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "impossibile chiudere la directory \"%s\": %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "creazione della directory \"%s\" fallita: %m"
+
+#: pg_backup_directory.c:355 pg_backup_directory.c:497
+#: pg_backup_directory.c:533
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "scrittura nel file di output fallita: %s"
+
+#: pg_backup_directory.c:373
+#, c-format
+msgid "could not close data file: %m"
+msgstr "chiusura del file di dati fallita: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "chiusura del file \"%s\" fallita: %m"
+
+#: pg_backup_directory.c:447
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "apertura del file TOC dei large object \"%s\" per l'input fallita: %m"
+
+#: pg_backup_directory.c:458
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "riga non valida nel file TOC dei large object \"%s\": \"%s\""
+
+#: pg_backup_directory.c:467
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "errore in lettura del file TOC dei large object \"%s\""
+
+#: pg_backup_directory.c:471
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "chiusura del file TOC dei large object \"%s\" fallita: %m"
+
+#: pg_backup_directory.c:685
+#, c-format
+msgid "could not close blob data file: %m"
+msgstr "chiusura del file di dati fallita: %m"
+
+#: pg_backup_directory.c:691
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "scrittura nel file TOC dei blob fallita"
+
+#: pg_backup_directory.c:705
+#, c-format
+msgid "could not close blobs TOC file: %m"
+msgstr "impossibile chiudere il file TOC BLOB: %m"
+
+#: pg_backup_directory.c:724
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "nome del file troppo lungo: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "questo formato non può essere letto"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "apertura del file TOC \"%s\" per l'output fallita: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "apertura del file TOC per l'output fallita: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:893
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "compressione non supportata dal formato di archivio tar"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "apertura del file TOC \"%s\" per l'input fallita: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "apertura del file TOC per l'input fallita: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "file \"%s\" non trovato nell'archivio"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "generazione del nome del file temporaneo fallita: %m"
+
+#: pg_backup_tar.c:624
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "sintassi dell'istruzione COPY imprevista: \"%s\""
+
+#: pg_backup_tar.c:890
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "OID non valida per il large object (%u)"
+
+#: pg_backup_tar.c:1035
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "chiusura del file temporaneo fallita: %m"
+
+#: pg_backup_tar.c:1038
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "la lunghezza effettiva del file (%lld) non corrisponde al previsto (%lld)"
+
+#: pg_backup_tar.c:1084 pg_backup_tar.c:1115
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "intestazione per il file \"%s\" nell'archivio tar non trovata"
+
+#: pg_backup_tar.c:1102
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "il ripristino dei dati fuori ordine non è supportato in questo formato di archivio: è richiesto \"%s\", ma nel file d'archivio viene prima di \"%s\"."
+
+#: pg_backup_tar.c:1149
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "intestazione del file tar incompleta (%lu byte)"
+msgstr[1] "intestazione del file tar incompleta (%lu byte)"
+
+#: pg_backup_tar.c:1188
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "intestazione tar corrotta in %s (previsti %d, calcolati %d) alla posizione file %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "nome della sezione non riconosciuta: \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:627 pg_dump.c:644 pg_dumpall.c:340
+#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373
+#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "slot on_exit_nicely terminati"
+
+#: pg_dump.c:642 pg_dumpall.c:348 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_dump.c:661 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "le opzioni -s/--solo schema e -a/--solo dati non possono essere utilizzate insieme"
+
+#: pg_dump.c:664
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "le opzioni -s/--schema-only e -a/--data-only non possono essere usate insieme"
+
+#: pg_dump.c:667
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "l'opzione --include-foreign-data non è supportata con il backup parallelo"
+
+#: pg_dump.c:670 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "le opzioni -c/--clean e -a/--data-only non possono essere usate insieme"
+
+#: pg_dump.c:673 pg_dumpall.c:378 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "l'opzione --if-exists richiede l'opzione -c/--clean"
+
+#: pg_dump.c:680
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "opzione --on-conflict-do-nothing richiede l'opzione --inserts, --rows-per-insert o --column-inserts"
+
+#: pg_dump.c:702
+#, c-format
+msgid "requested compression not available in this installation -- archive will be uncompressed"
+msgstr "compressione richiesta non disponibile in questa installazione -- l'archivio verrà decompresso"
+
+#: pg_dump.c:715
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "il backup parallelo è supportato solo con il formato directory"
+
+#: pg_dump.c:761
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "l'ultimo OID predefinito è %u"
+
+#: pg_dump.c:770
+#, c-format
+msgid "no matching schemas were found"
+msgstr "non è stato trovato nessuno schema corrispondente"
+
+#: pg_dump.c:784
+#, c-format
+msgid "no matching tables were found"
+msgstr "non è stata trovata nessuna tabella corrispondente"
+
+#: pg_dump.c:806
+#, c-format
+msgid "no matching extensions were found"
+msgstr "non è stata trovata nessuna tabella corrispondente"
+
+#: pg_dump.c:989
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s scarica un database in formato testo o in altri formati.\n"
+"\n"
+
+#: pg_dump.c:990 pg_dumpall.c:605 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_dump.c:991
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPZIONE]... [NOMEDB]\n"
+
+#: pg_dump.c:993 pg_dumpall.c:608 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Opzioni generali:\n"
+
+#: pg_dump.c:994
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=NOMEFILE nome del file o directory di output\n"
+
+#: pg_dump.c:995
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p formato del file di output (custom, directory,\n"
+" tar, testo in chiaro (predefinito))\n"
+
+#: pg_dump.c:997
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM usa NUM job paralleli per il dump\n"
+
+#: pg_dump.c:998 pg_dumpall.c:610
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose stampa più informazioni\n"
+
+#: pg_dump.c:999 pg_dumpall.c:611
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_dump.c:1000
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 livello di compressione per formati compressi\n"
+
+#: pg_dump.c:1001 pg_dumpall.c:612
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr ""
+" --lock-wait-timeout=TIMEOUT termina con errore dopo un'attesa di TIMEOUT\n"
+" per un lock di tabella\n"
+
+#: pg_dump.c:1002 pg_dumpall.c:639
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync non aspettare che i cambiamenti vengano scritti in sicurezza sul disco\n"
+
+#: pg_dump.c:1003 pg_dumpall.c:613
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_dump.c:1005 pg_dumpall.c:614
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Opzioni per il controllo del contenuto dell'output:\n"
+
+#: pg_dump.c:1006 pg_dumpall.c:615
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only scarica solamente i dati, non lo schema\n"
+
+#: pg_dump.c:1007
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs includi nell'archivio i large object\n"
+
+#: pg_dump.c:1008
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs non scaricare i large object\n"
+
+#: pg_dump.c:1009 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr ""
+" -c, --clean svuota (drop) gli oggetti del database prima di\n"
+" ricrearli\n"
+
+#: pg_dump.c:1010
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr ""
+" -C, --create include nell'archivio i comandi per creare\n"
+" i database\n"
+
+#: pg_dump.c:1011
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATTERN esegue il dump solo delle estensioni specificate\n"
+
+#: pg_dump.c:1012 pg_dumpall.c:617
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=CODIFICA scarica i dati nella CODIFICA indicata\n"
+
+#: pg_dump.c:1013
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=PATTERN esegue il dump solo degli schemi specificati\n"
+
+#: pg_dump.c:1014
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATTERN non esegue il dump degli schemi specificati\n"
+
+#: pg_dump.c:1015
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner salta il ripristino del proprietario degli\n"
+" oggetti nel formato testo in chiaro\n"
+
+#: pg_dump.c:1017 pg_dumpall.c:621
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only scarica solo lo schema, non i dati\n"
+
+#: pg_dump.c:1018
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr ""
+" -S, --superuser=NOME nome del superutente da usare nel formato testo\n"
+" in chiaro\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid " -t, --table=PATTERN dump the specified table(s) only\n"
+msgstr "-t, --table=PATTERN esegue il dump solo delle tabelle specificate\n"
+
+#: pg_dump.c:1020
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATTERN non esegue il dump delle tabelle specificate\n"
+
+#: pg_dump.c:1021 pg_dumpall.c:624
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges non scaricare i privilegi (grant/revoke)\n"
+
+#: pg_dump.c:1022 pg_dumpall.c:625
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade da utilizzare solo dall'utilità di aggiornamento\n"
+
+#: pg_dump.c:1023 pg_dumpall.c:626
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr ""
+" --column-inserts scarica dati come comandi INSERT con nomi\n"
+" di colonna\n"
+
+#: pg_dump.c:1024 pg_dumpall.c:627
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr ""
+" --disable-dollar-quoting disabilita la quotazione con dollari, usa la\n"
+" quotazione standard SQL\n"
+
+#: pg_dump.c:1025 pg_dumpall.c:628 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr ""
+" --disable-triggers disabilita i trigger durante il ripristino\n"
+" dei soli dati\n"
+
+#: pg_dump.c:1026
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security abilita la sicurezza per riga (salva solo i dati\n"
+" a cui l'utente ha accesso)\n"
+
+#: pg_dump.c:1028
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=PATTERN non esegue il dump dei dati per le tabelle specificate\n"
+
+#: pg_dump.c:1029 pg_dumpall.c:630
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM sovrascrive l'impostazione predefinita per extra_float_digits\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:631 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists usa IF EXISTS nell'eliminare gli oggetti\n"
+
+#: pg_dump.c:1031
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=MODELLO\n"
+" includere i dati delle tabelle estere su estero\n"
+" server corrispondenti a PATTERN\n"
+
+#: pg_dump.c:1034 pg_dumpall.c:632
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts scarica i dati come comandi INSERT anziché COPY\n"
+
+#: pg_dump.c:1035 pg_dumpall.c:633
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root carica le partizioni attraverso la tabella radice\n"
+
+#: pg_dump.c:1036 pg_dumpall.c:634
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments non scaricare i commenti\n"
+
+#: pg_dump.c:1037 pg_dumpall.c:635
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications non scaricare le pubblicazioni\n"
+
+#: pg_dump.c:1038 pg_dumpall.c:637
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels non scaricare le assegnazioni di sicurezza\n"
+
+#: pg_dump.c:1039 pg_dumpall.c:638
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions non scaricare le sottoscrizioni\n"
+
+#: pg_dump.c:1040 pg_dumpall.c:640
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method non esegue il dump dei metodi di accesso alle tabelle\n"
+
+#: pg_dump.c:1041 pg_dumpall.c:641
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces non scarica le assegnazioni di tablespace\n"
+
+#: pg_dump.c:1042 pg_dumpall.c:642
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression non esegue il dump dei metodi di compressione TOAST\n"
+
+#: pg_dump.c:1043 pg_dumpall.c:643
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data non scaricare i dati delle tabelle non loggate\n"
+
+#: pg_dump.c:1044 pg_dumpall.c:644
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing add ON CONFLICT DO NOTHING ai comandi INSERT\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:645
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr ""
+" --quote-all-identifiers metti tutti gli identificatori tra virgolette,\n"
+" anche se non sono parole chiave\n"
+
+#: pg_dump.c:1046 pg_dumpall.c:646
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS numero di righe per INSERT; implica --inserts\n"
+
+#: pg_dump.c:1047
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=SECTION scarica la sezione con questo nome (pre-data,\n"
+" data o post-data)\n"
+
+#: pg_dump.c:1048
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr ""
+" --serializable-deferrable attendi prima che lo scaricamento possa essere\n"
+" eseguito senza anomalie\n"
+
+#: pg_dump.c:1049
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT usa questo snapshot per il salvataggio\n"
+
+#: pg_dump.c:1050 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names richiede che le tabelle/schemi includano pattern\n"
+" che combacino con almeno un'entità\n"
+
+#: pg_dump.c:1052 pg_dumpall.c:647 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" usa i comandi SET SESSION AUTHORIZATION invece\n"
+" di ALTER OWNER per impostare il proprietario\n"
+
+#: pg_dump.c:1056 pg_dumpall.c:651 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opzioni di connessione:\n"
+
+#: pg_dump.c:1057
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=NOMEDB database da scaricare\n"
+
+#: pg_dump.c:1058 pg_dumpall.c:653 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=NOMEHOST host server del database o directory socket\n"
+
+#: pg_dump.c:1059 pg_dumpall.c:655 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORTA numero porta del server di database\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:656 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NOME connessione con l'utente di database specificato\n"
+
+#: pg_dump.c:1061 pg_dumpall.c:657 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password non chiedere mai le password\n"
+
+#: pg_dump.c:1062 pg_dumpall.c:658 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password forza la richiesta di una password (dovrebbe essere\n"
+" automatico)\n"
+
+#: pg_dump.c:1063 pg_dumpall.c:659
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=NOMERUOLO esegui SET ROLE prima di scaricare\n"
+
+#: pg_dump.c:1065
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Se non è stato fornito il nome del database, viene utilizzato il valore\n"
+"della variabile di ambiente PGDATABASE.\n"
+"\n"
+
+#: pg_dump.c:1067 pg_dumpall.c:663 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Segnala i bug a <%s>.\n"
+
+#: pg_dump.c:1068 pg_dumpall.c:664 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_dump.c:1087 pg_dumpall.c:488
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "codifica client specificata \"%s\" non valida"
+
+#: pg_dump.c:1225
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "i dump paralleli dai server di standby non sono supportati da questa versione del server"
+
+#: pg_dump.c:1290
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "formato di output \"%s\" non valido specificato"
+
+#: pg_dump.c:1331 pg_dump.c:1387 pg_dump.c:1440 pg_dumpall.c:1282
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "nome qualificato improprio (troppi nomi puntati): %s"
+
+#: pg_dump.c:1339
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "nessuno schema trovato per il pattern \"%s\""
+
+#: pg_dump.c:1392
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "non sono state trovate estensioni corrispondenti per il pattern \"%s\""
+
+#: pg_dump.c:1445
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "non sono stati trovati server esterni corrispondenti per il modello \"%s\""
+
+#: pg_dump.c:1508
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "nome di relazione improprio (troppi nomi puntati): %s"
+
+#: pg_dump.c:1519
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "non sono state trovate tabelle corrispondenti per il modello \"%s\""
+
+#: pg_dump.c:1546
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Al momento non sei connesso a un database."
+
+#: pg_dump.c:1549
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "i riferimenti tra database diversi non sono implementati: %s"
+
+#: pg_dump.c:1980
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "salvataggio del contenuto della tabella \"%s.%s\""
+
+#: pg_dump.c:2086
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Lo scarico dei contenuti della tabella \"%s\" è fallito: PQgetCopyData() fallito."
+
+#: pg_dump.c:2087 pg_dump.c:2097
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Messaggio di errore dal server: %s"
+
+#: pg_dump.c:2088 pg_dump.c:2098
+#, c-format
+msgid "Command was: %s"
+msgstr "Il comando era: %s"
+
+#: pg_dump.c:2096
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Scarico dei contenuti della tabella \"%s\" fallito: PQgetResult() fallito."
+
+#: pg_dump.c:2178
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "numero errato di campi recuperati dalla tabella \"%s\""
+
+#: pg_dump.c:2836
+#, c-format
+msgid "saving database definition"
+msgstr "salvataggio definizione del database"
+
+#: pg_dump.c:2932
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "fornitore di ordinamenti non riconosciuto: %s"
+
+#: pg_dump.c:3278
+#, c-format
+msgid "saving encoding = %s"
+msgstr "salvataggio codifica = %s"
+
+#: pg_dump.c:3303
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "salvataggio standard_conforming_strings = %s"
+
+#: pg_dump.c:3342
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "errore nel parsing di current_schemas()"
+
+#: pg_dump.c:3361
+#, c-format
+msgid "saving search_path = %s"
+msgstr "salvataggio del search_path = %s"
+
+#: pg_dump.c:3399
+#, c-format
+msgid "reading large objects"
+msgstr "lettura dei large object"
+
+#: pg_dump.c:3537
+#, c-format
+msgid "saving large objects"
+msgstr "salvataggio dei large object"
+
+#: pg_dump.c:3578
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "errore di lettura del large object %u: %s"
+
+#: pg_dump.c:3684
+#, c-format
+msgid "reading row-level security policies"
+msgstr "rimuovi una regola di sicurezza per riga da una tabella"
+
+#: pg_dump.c:3825
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "tipo di comando di regola di sicurezza imprevisto: %c"
+
+#: pg_dump.c:4275 pg_dump.c:4593 pg_dump.c:11724 pg_dump.c:17575
+#: pg_dump.c:17577 pg_dump.c:18198
+#, c-format
+msgid "could not parse %s array"
+msgstr "impossibile analizzare l'array %s"
+
+#: pg_dump.c:4461
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "abbonamenti non scaricati perché l'utente corrente non è un superutente"
+
+#: pg_dump.c:4975
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "estensione genitore di %s %s non trovata"
+
+#: pg_dump.c:5120
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "lo schema con OID %u non esiste"
+
+#: pg_dump.c:6574 pg_dump.c:16839
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "controllo di integrità fallito, tabella padre con OID %u della sequenza con OID %u non trovata"
+
+#: pg_dump.c:6878 pg_dump.c:7145 pg_dump.c:7616 pg_dump.c:8283 pg_dump.c:8404
+#: pg_dump.c:8558
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "tabella non riconosciuta OID %u"
+
+#: pg_dump.c:6882
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "dati di indice imprevisti per la tabella \"%s\""
+
+#: pg_dump.c:7377
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "controllo di integrità fallito, tabella padre con OID %u della voce pg_rewrite con OID %u non trovata"
+
+#: pg_dump.c:7668
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "query prodotta nome tabella con riferimento nullo per il trigger di chiave esterna \"%s\" sulla tabella \"%s\" (OID della tabella: %u)"
+
+#: pg_dump.c:8287
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "dati di colonna imprevisti per la tabella \"%s\""
+
+#: pg_dump.c:8317
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "numerazione delle colonne non valida nella tabella \"%s\""
+
+#: pg_dump.c:8366
+#, c-format
+msgid "finding table default expressions"
+msgstr "trovare le espressioni di default della tabella"
+
+#: pg_dump.c:8408
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "valore adnum %d non valido per la tabella \"%s\""
+
+#: pg_dump.c:8508
+#, c-format
+msgid "finding table check constraints"
+msgstr "trovare i vincoli di controllo della tabella"
+
+#: pg_dump.c:8562
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "previsto %d vincolo di controllo sulla tabella \"%s\" ma trovato %d"
+msgstr[1] "previsti %d vincoli di controllo sulla tabella \"%s\" ma trovati %d"
+
+#: pg_dump.c:8566
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "I cataloghi di sistema potrebbero essere danneggiati."
+
+#: pg_dump.c:9256
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "il ruolo con OID %u non esiste"
+
+#: pg_dump.c:9368 pg_dump.c:9397
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "voce pg_init_privs non supportata: %u %u %d"
+
+#: pg_dump.c:10218
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "il tipo di tipo di dati \"%s\" sembra non essere valido"
+
+#: pg_dump.c:11793
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "valore provolatile sconosciuto per la funzione \"%s\""
+
+#: pg_dump.c:11843 pg_dump.c:13668
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "valore proparallel non riconosciuto per la funzione \"%s\""
+
+#: pg_dump.c:11974 pg_dump.c:12080 pg_dump.c:12087
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "definizione della funzione con OID %u non trovata"
+
+#: pg_dump.c:12013
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "valore falso nel campo pg_cast.castfunc o pg_cast.castmethod"
+
+#: pg_dump.c:12016
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "valore fasullo nel campo pg_cast.castmethod"
+
+#: pg_dump.c:12106
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "definizione di trasformazione fasulla, almeno uno di trffromsql e trftosql dovrebbe essere diverso da zero"
+
+#: pg_dump.c:12123
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "valore fasullo nel campo pg_transform.trffromsql"
+
+#: pg_dump.c:12144
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "valore fasullo nel campo pg_transform.trftosql"
+
+#: pg_dump.c:12289
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "Gli operatori postfix non sono più supportati (operatore \"%s\")"
+
+#: pg_dump.c:12459
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "impossibile trovare l'operatore con OID %s"
+
+#: pg_dump.c:12527
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "tipo \"%c\" non valido del metodo di accesso \"%s\""
+
+#: pg_dump.c:13169
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "fornitore di ordinamenti non riconosciuto: %s"
+
+#: pg_dump.c:13587
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "valore aggfinalmodify non riconosciuto per l'aggregato \"%s\""
+
+#: pg_dump.c:13643
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "valore aggmfinalmodify non riconosciuto per l'aggregato \"%s\""
+
+#: pg_dump.c:14361
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "tipo di oggetto sconosciuto nei privilegi predefiniti: %d"
+
+#: pg_dump.c:14377
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "impossibile analizzare l'elenco ACL predefinito (%s)"
+
+#: pg_dump.c:14459
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "impossibile analizzare l'elenco ACL iniziale (%s) o predefinito (%s) per l'oggetto \"%s\" (%s)"
+
+#: pg_dump.c:14484
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "impossibile analizzare l'elenco ACL (%s) o il valore predefinito (%s) per l'oggetto \"%s\" (%s)"
+
+#: pg_dump.c:15022
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "la query per ottenere la definizione della vista \"%s\" non ha restituito dati"
+
+#: pg_dump.c:15025
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "la query per ottenere la definizione della vista \"%s\" ha restituito più di una definizione"
+
+#: pg_dump.c:15032
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "la definizione della vista \"%s\" sembra essere vuota (lunghezza zero)"
+
+#: pg_dump.c:15116
+#, c-format
+#| msgid "LOCATION is not supported anymore"
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS non è più supportato (tabella \"%s\")"
+
+#: pg_dump.c:16045
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "numero di colonna %d non valido per la tabella \"%s\""
+
+#: pg_dump.c:16123
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "impossibile analizzare le colonne delle statistiche dell'indice"
+
+#: pg_dump.c:16125
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "impossibile analizzare i valori delle statistiche dell'indice"
+
+#: pg_dump.c:16127
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "numero di colonne e valori non corrispondenti per le statistiche dell'indice"
+
+#: pg_dump.c:16345
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "omesso indice per vincolo \"%s\""
+
+#: pg_dump.c:16573
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "tipo di vincolo non riconosciuto: %c"
+
+#: pg_dump.c:16674 pg_dump.c:16903
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgstr[1] "query to get data of sequence \"%s\" returned %d row (expected 1)"
+
+#: pg_dump.c:16706
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "tipo di sequenza non riconosciuto: %s"
+
+#: pg_dump.c:16995
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "valore tgtype imprevisto: %d"
+
+#: pg_dump.c:17067
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "stringa argomento non valida (%s) per il trigger \"%s\" nella tabella \"%s\""
+
+#: pg_dump.c:17336
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "query per ottenere la regola \"%s\" per la tabella \"%s\" non riuscita: numero di righe restituito errato"
+
+#: pg_dump.c:17489
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "impossibile trovare l'estensione di riferimento %u"
+
+#: pg_dump.c:17579
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "numero di configurazioni e condizioni per l'estensione non corrispondenti"
+
+#: pg_dump.c:17711
+#, c-format
+msgid "reading dependency data"
+msgstr "lettura dei dati di dipendenza"
+
+#: pg_dump.c:17797
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "nessun oggetto di riferimento %u %u"
+
+#: pg_dump.c:17808
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "nessun oggetto di riferimento %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "dumpid %d non valido"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "dipendenza non valida %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "identificazione del ciclo di dipendenze fallito"
+
+#: pg_dump_sort.c:1232
+#, c-format
+msgid "there are circular foreign-key constraints on this table:"
+msgid_plural "there are circular foreign-key constraints among these tables:"
+msgstr[0] "ci sono vincoli di chiave esterna circolari su questa tabella:"
+msgstr[1] "ci sono vincoli di chiave esterna circolari su queste tabelle:"
+
+#: pg_dump_sort.c:1236 pg_dump_sort.c:1256
+#, c-format
+msgid " %s"
+msgstr " %s"
+
+#: pg_dump_sort.c:1237
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "Potrebbe non essere possibile ripristinare il dump senza utilizzare --disable-triggers o eliminare temporaneamente i vincoli."
+
+#: pg_dump_sort.c:1238
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "Prendi in considerazione l'utilizzo di un dump completo invece di un --data-only dump per evitare questo problema."
+
+#: pg_dump_sort.c:1250
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "non è stato possibile risolvere il ciclo di dipendenza tra questi elementi:"
+
+#: pg_dumpall.c:205
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "il programma \"%s\" è necessario per %s ma non è stato trovato nella stessa directory di \"%s\""
+
+#: pg_dumpall.c:208
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "il programma \"%s\" è stato trovato da \"%s\" ma non era della stessa versione di %s"
+
+#: pg_dumpall.c:357
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "opzione --exclude-database non può essere utilizzata insieme a -g/--solo-globals, -r/--solo-ruoli o -t/--solo spazi tabelle"
+
+#: pg_dumpall.c:365
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "le opzioni -g/--globals-only e -r/--roles-only non possono essere utilizzate insieme"
+
+#: pg_dumpall.c:372
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "le opzioni -g/--globals-only e -t/--tablespaces-only non possono essere utilizzate insieme"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "le opzioni -r/--solo ruoli e -t/--solo tablespace non possono essere utilizzate insieme"
+
+#: pg_dumpall.c:444 pg_dumpall.c:1587
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "impossibile connettersi al database \"%s\""
+
+#: pg_dumpall.c:456
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"impossibile connettersi ai database \"postgres\" o \"template1\"\n"
+"Specificare un database alternativo."
+
+#: pg_dumpall.c:604
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s estrae un cluster di database PostgreSQL in un file script SQL.\n"
+"\n"
+
+#: pg_dumpall.c:606
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPZIONE]...\n"
+
+#: pg_dumpall.c:609
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=NOMEFILE nome file di output\n"
+
+#: pg_dumpall.c:616
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean pulisci (drop) i database prima di ricrearli\n"
+
+#: pg_dumpall.c:618
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only scarica solo gli oggetti globali e non i database\n"
+
+#: pg_dumpall.c:619 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner salta il ripristino del proprietario degli oggetti\n"
+
+#: pg_dumpall.c:620
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only scarica solo i ruoli e non i database o i tablespace\n"
+
+#: pg_dumpall.c:622
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NOME nome del superutente da usare nel dump\n"
+
+#: pg_dumpall.c:623
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only scarica solo i tablespace e non i database o i ruoli\n"
+
+#: pg_dumpall.c:629
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=PATTERN esclude i database il cui nome corrisponde a PATTERN\n"
+
+#: pg_dumpall.c:636
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords non scaricare le password dei ruoli\n"
+
+#: pg_dumpall.c:652
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=STRCONN connettiti usando la stringa di connessione\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=NOMEDB database predefinito alternativo\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Se -f/--file non viene usato, lo script SQL verrà scritto nello standard\n"
+"output.\n"
+"\n"
+
+#: pg_dumpall.c:803
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "nome del ruolo che inizia con \"pg_\" ignorato (%s)"
+
+#: pg_dumpall.c:1018
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "impossibile analizzare l'elenco ACL (%s) per il parametro \"%s\""
+
+#: pg_dumpall.c:1136
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "impossibile analizzare l'elenco ACL (%s) per il tablespace \"%s\""
+
+#: pg_dumpall.c:1343
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "escluso il database \"%s\""
+
+#: pg_dumpall.c:1347
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "database di dumping \"%s\""
+
+#: pg_dumpall.c:1378
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump non riuscito sul database \"%s\", in uscita"
+
+#: pg_dumpall.c:1384
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "impossibile riaprire il file di output \"%s\": %m"
+
+#: pg_dumpall.c:1425
+#, c-format
+msgid "running \"%s\""
+msgstr "in esecuzione \"%s\""
+
+#: pg_dumpall.c:1630
+#, c-format
+msgid "could not get server version"
+msgstr "impossibile ottenere la versione del server"
+
+#: pg_dumpall.c:1633
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "impossibile analizzare la versione del server \"%s\""
+
+#: pg_dumpall.c:1703 pg_dumpall.c:1726
+#, c-format
+msgid "executing %s"
+msgstr "esecuzione di %s"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "uno tra -d/--dbname e -f/--file deve essere specificato"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "le opzioni -d/--dbname e -f/--file non possono essere utilizzate insieme"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "le opzioni -C/--create e -1/--single-transaction non possono essere utilizzate insieme"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "non è possibile specificare sia --single-transaction che più lavori"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "formato archivio non riconosciuto \"%s\"; si prega di specificare \"c\", \"d\" o \"t\""
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "errori ignorati durante il ripristino: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s ripristino di un database PostgreSQL da un archivio creato con pg_dump.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [OPZIONE]... [FILE]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NOME nome del database a cui connettersi\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FILENAME nome del file di output (- per stdout)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t formato del file di backup (dovrebbe essere automatico)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list stampa un riassunto della TOC dell'archivio\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose stampa più informazioni\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Opzioni per il controllo del ripristino:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only ripristina solo i dati, non gli schemi\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create crea il database in oggetto\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error esci in caso di errore, il comportamento predefinito è continuare\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NOME ripristina l'indice indicato\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM per il ripristino usa questo numero di job paralleli\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=NOMEFILE utilizza la tabella dei contenuti di questo file per\n"
+" selezionare/ordinare l'output\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NOME ripristina solo gli oggetti in questo schema\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME non ripristinare gli oggetti in questo schema\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NOME(arg) ripristina la funzione indicata\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only ripristina solo lo schema e non i dati\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NOME nome del superutente da usare per disabilitare i trigger\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NOME ripristina la relazione indicata (tabella, vista, ecc.)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NOME ripristina il trigger indicato\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges salta il ripristino dei privilegi di accesso (grant/revoke)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction ripristina in un'unica transazione\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security abilita la sicurezza per riga\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments non ripristinare i commenti\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables non ripristinare i dati delle tabelle che non\n"
+" è stato possibile creare\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications non ripristinare le pubblicazioni\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels non ripristinare le etichette di sicurezza\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions non ripristinare le sottoscrizioni\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method non ripristina i metodi di accesso alle tabelle\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces non ripristina le assegnazioni dei tablespace\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=SEZIONE ripristina la sezione indicata (pre-data, data o post-data)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=NOMERUOLO esegui SET ROLE prima del ripristino\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Le opzioni -I, -n, -N, -P, -t, -T e --section possono essere combinate e specificate\n"
+"più volte per selezionare più oggetti.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Se non è stato fornito un nome in input, viene utilizzato lo standard input.\n"
+"\n"
+
+#~ msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"
+#~ msgstr " --no-synchronized-snapshots non usare snapshot sincronizzati nei job paralleli\n"
+
+#~ msgid " -o, --oids include OIDs in dump\n"
+#~ msgstr " -o, --oids includi gli OID nel dump\n"
+
+#~ msgid "%s: WSAStartup failed: %d\n"
+#~ msgstr "%s: WSAStartup fallita: %d\n"
+
+#~ msgid "%s: could not connect to database \"%s\": %s"
+#~ msgstr "%s: connessione al database \"%s\" fallita: %s"
+
+#~ msgid "%s: could not open the output file \"%s\": %s\n"
+#~ msgstr "%s: apertura del file di output \"%s\" fallita: %s\n"
+
+#~ msgid "%s: executing %s\n"
+#~ msgstr "%s: esecuzione di %s\n"
+
+#~ msgid "%s: invalid client encoding \"%s\" specified\n"
+#~ msgstr "%s: codifica client specificata \"%s\" non valida\n"
+
+#~ msgid "%s: invalid number of parallel jobs\n"
+#~ msgstr "%s: numero di job paralleli non valido\n"
+
+#~ msgid "%s: maximum number of parallel jobs is %d\n"
+#~ msgstr "%s: il numero massimo di job paralleli è %d\n"
+
+#~ msgid "%s: option --if-exists requires option -c/--clean\n"
+#~ msgstr "%s: l'opzione --if-exists richiede l'opzione -c/--clean\n"
+
+#~ msgid "%s: options -c/--clean and -a/--data-only cannot be used together\n"
+#~ msgstr "%s: le opzioni -c/--clean e -a/--data-only non possono essere usate insieme\n"
+
+#~ msgid "%s: options -s/--schema-only and -a/--data-only cannot be used together\n"
+#~ msgstr "%s: le opzioni -s/--schema-only e -a/--data-only non possono essere usate insieme\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s: query fallita: %s"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s: la query era: %s\n"
+
+#~ msgid "(The INSERT command cannot set OIDs.)\n"
+#~ msgstr "(Il comando INSERT non può impostare OID.)\n"
+
+#~ msgid "-C and -1 are incompatible options\n"
+#~ msgstr "-C e -1 sono opzioni incompatibili\n"
+
+#~ msgid ""
+#~ "Synchronized snapshots are not supported by this server version.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots.\n"
+#~ msgstr ""
+#~ "Gli snapshot sincronizzati non sono supportati da questa versione\n"
+#~ "del server. Puoi usare --no-synchronized-snapshots invece se non hai\n"
+#~ "bisogno di snapshot sincronizzati.\n"
+
+#~ msgid ""
+#~ "Synchronized snapshots on standby servers are not supported by this server version.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots.\n"
+#~ msgstr ""
+#~ "Gli snapshot sincronizzati sui server di standby non sono supportati da questa versione.\n"
+#~ "Usa --no-synchronized-snapshots se non ti servono snapshot\n"
+#~ "sincronizzati.\n"
+
+#~ msgid "TOC Entry %s at %s (length %s, checksum %d)\n"
+#~ msgstr "Voce TOC %s a %s (lunghezza %s, checksum %d)\n"
+
+#~ msgid ""
+#~ "The program \"pg_dump\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Il programma \"pg_dump\" è richiesto da %s ma non è stato trovato nella\n"
+#~ "stessa directory di \"%s\".\n"
+#~ "Verifica che l'installazione sia corretta.\n"
+
+#~ msgid ""
+#~ "The program \"pg_dump\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Il programma \"pg_dump\" è stato trovato da \"%s\"\n"
+#~ "ma non è la stessa versione di %s.\n"
+#~ "Controllate la vostra installazione.\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
+
+#~ msgid "WARNING: aggregate function %s could not be dumped correctly for this database version; ignored\n"
+#~ msgstr "ATTENZIONE: la funzione di aggregazione %s non può essere scaricata correttamente per questa versione database; ignorata\n"
+
+#~ msgid "WARNING: bogus value in proargmodes array\n"
+#~ msgstr "ATTENZIONE: valore errato nell'array proargmode\n"
+
+#~ msgid "WARNING: could not parse proallargtypes array\n"
+#~ msgstr "ATTENZIONE: non è stato possibile analizzare l'array proallargtype\n"
+
+#~ msgid "WARNING: could not parse proargmodes array\n"
+#~ msgstr "ATTENZIONE: non è stato possibile analizzare l'array proargmode\n"
+
+#~ msgid "WARNING: could not parse proargnames array\n"
+#~ msgstr "ATTENZIONE: non è stato possibile analizzare l'array proargname\n"
+
+#~ msgid "WARNING: could not parse proconfig array\n"
+#~ msgstr "ATTENZIONE: non è stato possibile analizzare l'array preconfig\n"
+
+#~ msgid "WARNING: could not parse reloptions array\n"
+#~ msgstr "ATTENZIONE: errore di lettura dell'array reloptions\n"
+
+#~ msgid "WARNING: could not parse subpublications array\n"
+#~ msgstr "ATTENZIONE: errore nella lettura delle sotto-pubblicazioni\n"
+
+#~ msgid "WARNING: ftell mismatch with expected position -- ftell used\n"
+#~ msgstr "ATTENZIONE: ftell non corrisponde alla posizione prevista -- verrà usato il valore restituito da ftell\n"
+
+#~ msgid "WARNING: owner of aggregate function \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario della funzione di aggregazione \"%s\" non sembra essere valido\n"
+
+#~ msgid "WARNING: owner of data type \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario del tipo dato \"%s\" non sembra essere valido\n"
+
+#~ msgid "WARNING: owner of function \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario della funzione \"%s\" non sembra essere valido\n"
+
+#~ msgid "WARNING: owner of operator \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario dell'operatore \"%s\" non sembra essere valido\n"
+
+#~ msgid "WARNING: owner of operator class \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario della classe operatore \"%s\" non sembra essere valido\n"
+
+#~ msgid "WARNING: owner of operator family \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario della famiglia di operatori \"%s\" non sembra essere valido\n"
+
+#~ msgid "WARNING: owner of publication \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario della pubblicazione \"%s\" non sembra valido\n"
+
+#~ msgid "WARNING: owner of schema \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario dello schema \"%s\" sembra non essere valido\n"
+
+#~ msgid "WARNING: owner of subscription \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario della sottoscrizione \"%s\" non sembra valido\n"
+
+#~ msgid "WARNING: owner of table \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario della tabella \"%s\" non sembra essere valido\n"
+
+#~ msgid "allocating AH for %s, format %d\n"
+#~ msgstr "allocazione AH per %s, formato %d\n"
+
+#~ msgid "archiver"
+#~ msgstr "archiviatore"
+
+#~ msgid "archiver (db)"
+#~ msgstr "archiviatore (db)"
+
+#~ msgid "attempting to ascertain archive format\n"
+#~ msgstr "tentativo di accertamento del formato dell'archivio\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "processo figlio terminato da segnale %s"
+
+#~ msgid "compress_io"
+#~ msgstr "compress_io"
+
+#~ msgid "compression level must be in range 0..9\n"
+#~ msgstr "il livello di compressione dev'essere tra 0 e 9\n"
+
+#~ msgid "connecting to database \"%s\" as user \"%s\"\n"
+#~ msgstr "connessione al database \"%s\" come utente \"%s\"\n"
+
+#~ msgid "connection needs password\n"
+#~ msgstr "la connessione richiede la password\n"
+
+#~ msgid "connection to database \"%s\" failed: %s"
+#~ msgstr "connessione al database \"%s\" fallita: %s"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "spostamento nella directory \"%s\" fallito: %s"
+
+#~ msgid "could not close tar member\n"
+#~ msgstr "chiusura del membro tar fallita\n"
+
+#~ msgid "could not create directory \"%s\": %s\n"
+#~ msgstr "creazione della directory \"%s\" fallita: %s\n"
+
+#~ msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive\n"
+#~ msgstr "blocco ID %d non trovato nell'archivio -- forse per una richiesta di ripristino fuori ordine, che non può essere eseguita per la mancanza di offset dati nell'archivio\n"
+
+#~ msgid "could not open temporary file\n"
+#~ msgstr "apertura del file temporaneo fallita\n"
+
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "lettura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "lettura del link simbolico \"%s\" fallita"
+
+#~ msgid "could not set default_with_oids: %s"
+#~ msgstr "impostazione di default_with_oids fallita: %s"
+
+#~ msgid "could not write to large object (result: %lu, expected: %lu)\n"
+#~ msgstr "scrittura del large object fallita (risultato: %lu, previsto: %lu)\n"
+
+#~ msgid "custom archiver"
+#~ msgstr "archiviatore personalizzato"
+
+#~ msgid "directory archiver"
+#~ msgstr "archiviatore di directory"
+
+#~ msgid "entering restore_toc_entries_parallel\n"
+#~ msgstr "immissione restore_toc_entries_parallel\n"
+
+#~ msgid "entering restore_toc_entries_postfork\n"
+#~ msgstr "inizio di restore_toc_entries_postfork\n"
+
+#~ msgid "entering restore_toc_entries_prefork\n"
+#~ msgstr "inizio di restore_toc_entries_prefork\n"
+
+#~ msgid "failed to connect to database\n"
+#~ msgstr "connessione al database fallita\n"
+
+#~ msgid "failed to reconnect to database\n"
+#~ msgstr "riconnessione al database fallita\n"
+
+#~ msgid "finding check constraints for table \"%s.%s\"\n"
+#~ msgstr "ricerca dei vincoli di controllo della tabella \"%s.%s\"\n"
+
+#~ msgid "finding default expressions of table \"%s.%s\"\n"
+#~ msgstr "lettura delle espressioni di default della tabella \"%s.%s\"\n"
+
+#~ msgid "finding the columns and types of table \"%s.%s\"\n"
+#~ msgstr "lettura delle colonne e dei tipi della tabella \"%s.%s\"\n"
+
+#~ msgid "internal error -- neither th nor fh specified in tarReadRaw()\n"
+#~ msgstr "errore interno -- né th né fh specificato in tarReadRaw()\n"
+
+#~ msgid "invalid number of parallel jobs\n"
+#~ msgstr "numero di job paralleli non valido\n"
+
+#~ msgid "moving from position %s to next member at file position %s\n"
+#~ msgstr "spostamento dalla posizione %s al membro successivo alla posizione nel file %s\n"
+
+#~ msgid "no item ready\n"
+#~ msgstr "nessun elemento pronto\n"
+
+#~ msgid "now at file position %s\n"
+#~ msgstr "attuale posizione nel file %s\n"
+
+#~ msgid "options --inserts/--column-inserts and -o/--oids cannot be used together\n"
+#~ msgstr "le opzioni --inserts/--column-inserts e -o/--oids non possono essere usate insieme\n"
+
+#~ msgid "parallel archiver"
+#~ msgstr "archiviatore parallelo"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "pclose fallita: %s"
+
+#~ msgid "read TOC entry %d (ID %d) for %s %s\n"
+#~ msgstr "letta voce TOC %d (ID %d) per %s %s\n"
+
+#~ msgid "reading foreign key constraints for table \"%s.%s\"\n"
+#~ msgstr "lettura dei vincoli di chiave esterna della tabella \"%s.%s\"\n"
+
+#~ msgid "reading indexes for table \"%s.%s\"\n"
+#~ msgstr "lettura degli indici della tabella \"%s.%s\"\n"
+
+#~ msgid "reading policies for table \"%s.%s\"\n"
+#~ msgstr "lettura delle regole di sicurezza per la tabella \"%s.%s\"\n"
+
+#~ msgid "reading row security enabled for table \"%s.%s\"\n"
+#~ msgstr "letture delle regole di sicurezza per riga abilitata per la tabella \"%s.%s\"\n"
+
+#~ msgid "reading triggers for table \"%s.%s\"\n"
+#~ msgstr "lettura dei trigger della tabella \"%s.%s\"\n"
+
+#~ msgid "reducing dependencies for %d\n"
+#~ msgstr "riduzione dipendenze per %d\n"
+
+#~ msgid "schema with OID %u does not exist\n"
+#~ msgstr "lo schema con OID %u non esiste\n"
+
+#~ msgid "select() failed: %s\n"
+#~ msgstr "select() fallita: %s\n"
+
+#~ msgid "skipping tar member %s\n"
+#~ msgstr "salto del membro tar %s\n"
+
+#~ msgid "sorter"
+#~ msgstr "operatore_di_ordinamento"
+
+#~ msgid "tar archiver"
+#~ msgstr "archiviatore tar"
+
+#~ msgid "transferring dependency %d -> %d to %d\n"
+#~ msgstr "trasferimento di dipendenza %d -> %d a %d\n"
+
+#~ msgid "unrecognized collation provider: %s\n"
+#~ msgstr "fornitore di ordinamenti non riconosciuto: %s\n"
diff --git a/src/bin/pg_dump/po/ja.po b/src/bin/pg_dump/po/ja.po
new file mode 100644
index 0000000..f09a008
--- /dev/null
+++ b/src/bin/pg_dump/po/ja.po
@@ -0,0 +1,2639 @@
+# pg_dump.po
+# Japanese message translation file for pg_dump
+#
+# Copyright (C) 2011-2022 PostgreSQL Global Development Group
+#
+# Shigehiro Honda <fwif0083@mb.infoweb.ne.jp>, 2005.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-23 09:36+0900\n"
+"PO-Revision-Date: 2023-08-23 10:26+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "カレントディレクトリを識別できませんでした: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "不正なバイナリ\"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "バイナリ\"%s\"を読み取れませんでした"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "実行する\"%s\"がありませんでした"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "ディレクトリ\"%s\"に移動できませんでした: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "シンボリックリンク\"%s\"を読めませんでした: %m"
+
+#: ../../common/exec.c:422 parallel.c:1611
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() が失敗しました: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "メモリ不足です"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリ不足です\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null ポインタを複製できません(内部エラー)。\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "コマンドは実行可能形式ではありません"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "コマンドが見つかりません"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "子プロセスが終了コード%dで終了しました"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "子プロセスが例外0x%Xで終了しました"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "子プロセスはシグナル%dにより終了しました: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "子プロセスが未知のステータス%dで終了しました"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "オプション\"%2$s\"に対する不正な値\"%1$s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%sは%d..%dの範囲でなければなりません"
+
+#: common.c:134
+#, c-format
+msgid "reading extensions"
+msgstr "機能拡張を読み込んでいます"
+
+#: common.c:137
+#, c-format
+msgid "identifying extension members"
+msgstr "機能拡張の構成要素を特定しています"
+
+#: common.c:140
+#, c-format
+msgid "reading schemas"
+msgstr "スキーマを読み込んでいます"
+
+#: common.c:149
+#, c-format
+msgid "reading user-defined tables"
+msgstr "ユーザー定義テーブルを読み込んでいます"
+
+#: common.c:154
+#, c-format
+msgid "reading user-defined functions"
+msgstr "ユーザー定義関数を読み込んでいます"
+
+#: common.c:158
+#, c-format
+msgid "reading user-defined types"
+msgstr "ユーザー定義型を読み込んでいます"
+
+#: common.c:162
+#, c-format
+msgid "reading procedural languages"
+msgstr "手続き言語を読み込んでいます"
+
+#: common.c:165
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "ユーザー定義集約関数を読み込んでいます"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined operators"
+msgstr "ユーザー定義演算子を読み込んでいます"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "ユーザー定義アクセスメソッドを読み込んでいます"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "ユーザー定義演算子クラスを読み込んでいます"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "ユーザー定義演算子族を読み込んでいます"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "ユーザー定義のテキスト検索パーサを読み込んでいます"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "ユーザー定義のテキスト検索テンプレートを読み込んでいます"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "ユーザー定義のテキスト検索辞書を読み込んでいます"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "ユーザー定義のテキスト検索設定を読み込んでいます"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "ユーザー定義の外部データラッパーを読み込んでいます"
+
+#: common.c:195
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "ユーザー定義の外部サーバーを読み込んでいます"
+
+#: common.c:198
+#, c-format
+msgid "reading default privileges"
+msgstr "デフォルト権限設定を読み込んでいます"
+
+#: common.c:201
+#, c-format
+msgid "reading user-defined collations"
+msgstr "ユーザー定義の照合順序を読み込んでいます"
+
+#: common.c:204
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "ユーザー定義の変換を読み込んでいます"
+
+#: common.c:207
+#, c-format
+msgid "reading type casts"
+msgstr "型キャストを読み込んでいます"
+
+#: common.c:210
+#, c-format
+msgid "reading transforms"
+msgstr "変換を読み込んでいます"
+
+#: common.c:213
+#, c-format
+msgid "reading table inheritance information"
+msgstr "テーブル継承情報を読み込んでいます"
+
+#: common.c:216
+#, c-format
+msgid "reading event triggers"
+msgstr "イベントトリガを読み込んでいます"
+
+#: common.c:220
+#, c-format
+msgid "finding extension tables"
+msgstr "機能拡張構成テーブルを探しています"
+
+#: common.c:224
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "継承関係を検索しています"
+
+#: common.c:227
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "対象テーブルの列情報を読み込んでいます"
+
+#: common.c:230
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "子テーブルの継承列にフラグを設定しています"
+
+#: common.c:233
+#, c-format
+msgid "reading partitioning data"
+msgstr "パーティション情報を読み込んでいます"
+
+#: common.c:236
+#, c-format
+msgid "reading indexes"
+msgstr "インデックスを読み込んでいます"
+
+#: common.c:239
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "パーティション親テーブルのインデックスにフラグを設定しています"
+
+#: common.c:242
+#, c-format
+msgid "reading extended statistics"
+msgstr "拡張統計情報を読み込んでいます"
+
+#: common.c:245
+#, c-format
+msgid "reading constraints"
+msgstr "制約を読み込んでいます"
+
+#: common.c:248
+#, c-format
+msgid "reading triggers"
+msgstr "トリガを読み込んでいます"
+
+#: common.c:251
+#, c-format
+msgid "reading rewrite rules"
+msgstr "書き換えルールを読み込んでいます"
+
+#: common.c:254
+#, c-format
+msgid "reading policies"
+msgstr "ポリシを読み込んでいます"
+
+#: common.c:257
+#, c-format
+msgid "reading publications"
+msgstr "パブリケーションを読み込んでいます"
+
+#: common.c:260
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "テーブルのパブリケーションへの所属を読み取っています"
+
+#: common.c:263
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "スキーマのパブリケーションへの所属を読み取っています"
+
+#: common.c:266
+#, c-format
+msgid "reading subscriptions"
+msgstr "サブスクリプションを読み込んでいます"
+
+#: common.c:345
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "テーブル\"%2$s\"用の親テーブルの数%1$dが不正です"
+
+#: common.c:1006
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "健全性検査に失敗しました、テーブル\"%2$s\"(OID %3$u)の親のOID %1$uがありません"
+
+#: common.c:1045
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "数値配列\"%s\"のパースに失敗しました: 要素が多すぎます"
+
+#: common.c:1057
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "数値配列\"%s\"のパースに失敗しました: 数値に不正な文字が含まれています"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "不正な圧縮コード: %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504
+#: compress_io.c:547
+#, c-format
+msgid "not built with zlib support"
+msgstr "zlibサポートなしでビルドされています"
+
+#: compress_io.c:236 compress_io.c:333
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "圧縮ライブラリを初期化できませんでした: %s"
+
+#: compress_io.c:256
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "圧縮ストリームをクローズできませんでした: %s"
+
+#: compress_io.c:273
+#, c-format
+msgid "could not compress data: %s"
+msgstr "データを圧縮できませんでした: %s"
+
+#: compress_io.c:349 compress_io.c:364
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "データを伸長できませんでした: %s"
+
+#: compress_io.c:371
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "圧縮ライブラリをクローズできませんでした: %s"
+
+#: compress_io.c:584 compress_io.c:621
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "入力ファイルから読み込めませんでした: %s"
+
+#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553
+#: pg_backup_tar.c:726 pg_backup_tar.c:749
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "入力ファイルから読み込めませんでした: ファイルの終端"
+
+#: parallel.c:253
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s()が失敗しました: エラーコード %d"
+
+#: parallel.c:961
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "通信チャンネルを作成できませんでした: %m"
+
+#: parallel.c:1018
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "ワーカープロセスを作成できませんでした: %m"
+
+#: parallel.c:1148
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "リーダーから認識不能のコマンドを受信しました: \"%s\""
+
+#: parallel.c:1191 parallel.c:1429
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "ワーカーから不正なメッセージを受信しました: \"%s\""
+
+#: parallel.c:1323
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"リレーション\"%s\"のロックを獲得できませんでした。\n"
+"通常これは、pg_dumpの親プロセスが初期のACCESS SHAREロックを獲得した後にだれかがテーブルに対してACCESS EXCLUSIVEロックを要求したことを意味しています。"
+
+#: parallel.c:1412
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "ワーカープロセスが突然終了しました"
+
+#: parallel.c:1534 parallel.c:1652
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "通信チャンネルに書き込めませんでした: %m"
+
+#: parallel.c:1736
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: ソケットを作成できませんでした: エラーコード %d"
+
+#: parallel.c:1747
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: バインドできませんでした: エラーコード %d"
+
+#: parallel.c:1754
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: リッスンできませんでした: エラーコード %d"
+
+#: parallel.c:1761
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s()が失敗しました: エラーコード %d"
+
+#: parallel.c:1772
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: 第二ソケットを作成できませんでした: エラーコード %d"
+
+#: parallel.c:1781
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: ソケットを接続できませんでした: エラーコード %d"
+
+#: parallel.c:1790
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: 接続を受け付けられませんでした: エラーコード %d"
+
+#: pg_backup_archiver.c:280 pg_backup_archiver.c:1632
+#, c-format
+msgid "could not close output file: %m"
+msgstr "出力ファイルをクローズできませんでした: %m"
+
+#: pg_backup_archiver.c:324 pg_backup_archiver.c:328
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "アーカイブ項目が正しいセクション順ではありません"
+
+#: pg_backup_archiver.c:334
+#, c-format
+msgid "unexpected section code %d"
+msgstr "想定外のセクションコード %d"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "このアーカイブファイル形式での並列リストアはサポートしていません"
+
+#: pg_backup_archiver.c:375
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "8.0 より古い pg_dump で作られたアーカイブでの並列リストアはサポートしていません"
+
+#: pg_backup_archiver.c:393
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)"
+msgstr "圧縮アーカイブからのリストアができません(このインストールは圧縮をサポートしていません)"
+
+#: pg_backup_archiver.c:410
+#, c-format
+msgid "connecting to database for restore"
+msgstr "リストアのためデータベースに接続しています"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "1.3より古いアーカイブではデータベースへの直接接続はサポートされていません"
+
+#: pg_backup_archiver.c:455
+#, c-format
+msgid "implied data-only restore"
+msgstr "暗黙的にデータのみのリストアを行います"
+
+#: pg_backup_archiver.c:521
+#, c-format
+msgid "dropping %s %s"
+msgstr "%s %sを削除しています"
+
+#: pg_backup_archiver.c:621
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "文\"%s\"中に IF EXISTS を挿入すべき場所が見つかりませでした"
+
+#: pg_backup_archiver.c:777 pg_backup_archiver.c:779
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "オリジナルのダンプファイルからの警告: %s"
+
+#: pg_backup_archiver.c:794
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "%s \"%s.%s\"を作成しています"
+
+#: pg_backup_archiver.c:797
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "%s \"%s\"を作成しています"
+
+#: pg_backup_archiver.c:847
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "新しいデータベース\"%s\"に接続しています"
+
+#: pg_backup_archiver.c:874
+#, c-format
+msgid "processing %s"
+msgstr "%sを処理しています"
+
+#: pg_backup_archiver.c:896
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "テーブル\"%s.%s\"のデータを処理しています"
+
+#: pg_backup_archiver.c:966
+#, c-format
+msgid "executing %s %s"
+msgstr "%s %sを実行しています"
+
+#: pg_backup_archiver.c:1005
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "%sのトリガを無効にしています"
+
+#: pg_backup_archiver.c:1031
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "%sのトリガを有効にしています"
+
+#: pg_backup_archiver.c:1096
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "内部エラー -- WriteDataはDataDumperルーチンのコンテクスト外では呼び出せません"
+
+#: pg_backup_archiver.c:1279
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "選択した形式ではラージオブジェクト出力をサポートしていません"
+
+#: pg_backup_archiver.c:1337
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "%d個のラージオブジェクトをリストアしました"
+
+#: pg_backup_archiver.c:1358 pg_backup_tar.c:669
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "OID %uのラージオブジェクトをリストアしています"
+
+#: pg_backup_archiver.c:1370
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "ラージオブジェクト %u を作成できませんでした: %s"
+
+#: pg_backup_archiver.c:1375 pg_dump.c:3607
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "ラージオブジェクト %u をオープンできませんでした: %s"
+
+#: pg_backup_archiver.c:1431
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "TOCファイル\"%s\"をオープンできませんでした: %m"
+
+#: pg_backup_archiver.c:1459
+#, c-format
+msgid "line ignored: %s"
+msgstr "行を無視しました: %s"
+
+#: pg_backup_archiver.c:1466
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "ID %dのエントリがありませんでした"
+
+#: pg_backup_archiver.c:1489 pg_backup_directory.c:222
+#: pg_backup_directory.c:599
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "TOCファイルをクローズできませんでした: %m"
+
+#: pg_backup_archiver.c:1603 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:586 pg_backup_directory.c:649
+#: pg_backup_directory.c:668 pg_dumpall.c:476
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "出力ファイル\"%s\"をオープンできませんでした: %m"
+
+#: pg_backup_archiver.c:1605 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "出力ファイルをオープンできませんでした: %m"
+
+#: pg_backup_archiver.c:1699
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "ラージオブジェクトデータを%zuバイト書き出しました(結果は%d)"
+
+#: pg_backup_archiver.c:1705
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "ラージオブジェクトに書き込めませんでした: %s"
+
+#: pg_backup_archiver.c:1795
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "初期化中:"
+
+#: pg_backup_archiver.c:1800
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "TOC処理中:"
+
+#: pg_backup_archiver.c:1805
+#, c-format
+msgid "while FINALIZING:"
+msgstr "終了処理中:"
+
+#: pg_backup_archiver.c:1810
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "TOCエントリ%d; %u %u %s %s %s から"
+
+#: pg_backup_archiver.c:1886
+#, c-format
+msgid "bad dumpId"
+msgstr "不正なdumpId"
+
+#: pg_backup_archiver.c:1907
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "TABLE DATA項目に対する不正なテーブルdumpId"
+
+#: pg_backup_archiver.c:1999
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "想定外のデータオフセットフラグ %d"
+
+#: pg_backup_archiver.c:2012
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "ダンプファイルのファイルオフセットが大きすぎます"
+
+#: pg_backup_archiver.c:2150 pg_backup_archiver.c:2160
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "ディレクトリ名が長すぎます: \"%s\""
+
+#: pg_backup_archiver.c:2168
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "ディレクトリ\"%s\"は有効なアーカイブではないようです(\"toc.dat\"がありません)"
+
+#: pg_backup_archiver.c:2176 pg_backup_custom.c:173 pg_backup_custom.c:807
+#: pg_backup_directory.c:207 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "入力ファイル\"%s\"をオープンできませんでした: %m"
+
+#: pg_backup_archiver.c:2183 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "入力ファイルをオープンできませんでした: %m"
+
+#: pg_backup_archiver.c:2189
+#, c-format
+msgid "could not read input file: %m"
+msgstr "入力ファイルを読み込めませんでした: %m"
+
+#: pg_backup_archiver.c:2191
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "入力ファイルが小さすぎます(読み取り%lu、想定は 5)"
+
+#: pg_backup_archiver.c:2223
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "入力ファイルがテキスト形式のダンプのようです。psqlを使用してください。"
+
+#: pg_backup_archiver.c:2229
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "入力ファイルが有効なアーカイブではないようです(小さすぎる?)"
+
+#: pg_backup_archiver.c:2235
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "入力ファイルが有効なアーカイブではないようです"
+
+#: pg_backup_archiver.c:2244
+#, c-format
+msgid "could not close input file: %m"
+msgstr "入力ファイルをクローズできませんでした: %m"
+
+#: pg_backup_archiver.c:2361
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "認識不能のファイル形式\"%d\""
+
+#: pg_backup_archiver.c:2443 pg_backup_archiver.c:4505
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "項目 %d %s %s の処理が完了"
+
+#: pg_backup_archiver.c:2447 pg_backup_archiver.c:4518
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "ワーカープロセスの処理失敗: 終了コード %d"
+
+#: pg_backup_archiver.c:2568
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "エントリID%dは範囲外です -- おそらくTOCの破損です"
+
+#: pg_backup_archiver.c:2648
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "WITH OIDSと定義されたテーブルのリストアは今後サポートされません"
+
+#: pg_backup_archiver.c:2730
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "認識不能のエンコーディング\"%s\""
+
+#: pg_backup_archiver.c:2735
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "不正なENCODING項目: %s"
+
+#: pg_backup_archiver.c:2753
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "不正なSTDSTRINGS項目: %s"
+
+#: pg_backup_archiver.c:2778
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "スキーマ \"%s\"が見つかりません"
+
+#: pg_backup_archiver.c:2785
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "テーブル\"%s\"が見つかりません"
+
+#: pg_backup_archiver.c:2792
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "インデックス\"%s\"が見つかりません"
+
+#: pg_backup_archiver.c:2799
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "関数\"%s\"が見つかりません"
+
+#: pg_backup_archiver.c:2806
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "トリガ\"%s\"が見つかりません"
+
+#: pg_backup_archiver.c:3203
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "セッションユーザーを\"%s\"に設定できませんでした: %s"
+
+#: pg_backup_archiver.c:3340
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "search_pathを\"%s\"に設定できませんでした: %s"
+
+#: pg_backup_archiver.c:3402
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "default_tablespaceを\"%s\"に設定できませんでした: %s"
+
+#: pg_backup_archiver.c:3452
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "default_table_access_methodを設定できませんでした: %s"
+
+#: pg_backup_archiver.c:3546 pg_backup_archiver.c:3711
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "オブジェクトタイプ%sに対する所有者の設定方法がわかりません"
+
+#: pg_backup_archiver.c:3814
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "ファイルヘッダにマジック文字列がありませんでした"
+
+#: pg_backup_archiver.c:3828
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "ファイルヘッダ内のバージョン(%d.%d)はサポートされていません"
+
+#: pg_backup_archiver.c:3833
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "整数のサイズ(%lu)に関する健全性検査が失敗しました"
+
+#: pg_backup_archiver.c:3837
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "アーカイブはより大きなサイズの整数を持つマシンで作成されました、一部の操作が失敗する可能性があります"
+
+#: pg_backup_archiver.c:3847
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "想定した形式(%d)はファイル内にある形式(%d)と異なります"
+
+#: pg_backup_archiver.c:3862
+#, c-format
+msgid "archive is compressed, but this installation does not support compression -- no data will be available"
+msgstr "アーカイブは圧縮されていますが、このインストールでは圧縮をサポートしていません -- 利用できるデータはありません"
+
+#: pg_backup_archiver.c:3896
+#, c-format
+msgid "invalid creation date in header"
+msgstr "ヘッダ内の作成日付が不正です"
+
+#: pg_backup_archiver.c:4030
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "項目 %d %s %s を処理しています"
+
+#: pg_backup_archiver.c:4109
+#, c-format
+msgid "entering main parallel loop"
+msgstr "メインの並列ループに入ります"
+
+#: pg_backup_archiver.c:4120
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "項目 %d %s %s をスキップしています"
+
+#: pg_backup_archiver.c:4129
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "項目 %d %s %s に着手します"
+
+#: pg_backup_archiver.c:4183
+#, c-format
+msgid "finished main parallel loop"
+msgstr "メインの並列ループが終了しました"
+
+#: pg_backup_archiver.c:4219
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "やり残し項目 %d %s %s を処理しています"
+
+#: pg_backup_archiver.c:4824
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "テーブル\"%s\"を作成できませんでした、このテーブルのデータは復元されません"
+
+#: pg_backup_custom.c:376 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "ラージオブジェクトのOIDが不正です"
+
+#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629
+#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021
+#, c-format
+msgid "error during file seek: %m"
+msgstr "ファイルシーク中にエラーがありました: %m"
+
+#: pg_backup_custom.c:478
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "データブロック%dのシーク位置が間違っています"
+
+#: pg_backup_custom.c:495
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "アーカイブの探索中に認識不能のデータブロックタイプ(%d)がありました"
+
+#: pg_backup_custom.c:517
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "アーカイブ中にブロックID %d がありません -- おそらくリストア要求が順不同だったためですが、入力ファイルがシーク不可なため処理できません"
+
+#: pg_backup_custom.c:522
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "アーカイブ内にブロック ID %d がありませんでした -- おそらくアーカイブが壊れています"
+
+#: pg_backup_custom.c:529
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "データ読み込み時に想定外のブロックID(%d)がありました --想定は%d"
+
+#: pg_backup_custom.c:543
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "アーカイブのりストア中に認識不可のデータブロックタイプ%dがありました"
+
+#: pg_backup_custom.c:645
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "入力ファイルから読み込めませんでした: %m"
+
+#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943
+#: pg_backup_tar.c:1019
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "アーカイブファイルのシーク位置を決定できませんでした: %m"
+
+#: pg_backup_custom.c:762 pg_backup_custom.c:802
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "アーカイブファイルをクローズできませんでした: %m"
+
+#: pg_backup_custom.c:785
+#, c-format
+msgid "can only reopen input archives"
+msgstr "入力アーカイブだけが再オープン可能です"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "標準入力からの並列リストアはサポートされていません"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "シーク不可のファイルからの並列リストアはサポートされていません"
+
+#: pg_backup_custom.c:810
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "アーカイブファイルのシークができませんでした: %m"
+
+#: pg_backup_custom.c:889
+#, c-format
+msgid "compressor active"
+msgstr "圧縮処理が有効です"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "libpqからserver_versionを取得できませんでした"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1646
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "サーバーバージョンの不一致のため処理を中断します"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1647
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "サーバーバージョン: %s、%s バージョン: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "データベースはすでに接続済みです"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595
+msgid "Password: "
+msgstr "パスワード: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "データベースへの接続ができませんでした"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "再接続に失敗しました: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1520 pg_dumpall.c:1604
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732
+#, c-format
+msgid "query failed: %s"
+msgstr "問い合わせが失敗しました: %s"
+
+#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733
+#, c-format
+msgid "Query was: %s"
+msgstr "問い合わせ: %s"
+
+#: pg_backup_db.c:316
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "問い合わせが1行ではなく%d行返しました: %s"
+
+#: pg_backup_db.c:352
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sコマンド: %s"
+
+#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489
+msgid "could not execute query"
+msgstr "問い合わせを実行できませんでした"
+
+#: pg_backup_db.c:461
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "PQputCopyData からエラーが返されました: %s"
+
+#: pg_backup_db.c:510
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "PQputCopyEnd からエラーが返されました: %s"
+
+#: pg_backup_db.c:516
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "テーブル\"%s\"へのコピーに失敗しました: %s"
+
+#: pg_backup_db.c:522 pg_dump.c:2106
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "ファイル\"%s\"をCOPY中に想定していない余分な結果がありました"
+
+#: pg_backup_db.c:534
+msgid "could not start database transaction"
+msgstr "データベーストランザクションを開始できませんでした"
+
+#: pg_backup_db.c:542
+msgid "could not commit database transaction"
+msgstr "データベーストランザクションをコミットできませんでした"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "出力ディレクトリが指定されていません"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をクローズできませんでした: %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を作成できませんでした: %m"
+
+#: pg_backup_directory.c:355 pg_backup_directory.c:497
+#: pg_backup_directory.c:533
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "出力ファイルに書き込めませんでした: %s"
+
+#: pg_backup_directory.c:373
+#, c-format
+msgid "could not close data file: %m"
+msgstr "データファイルをクローズできませんでした: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "データファイル\"%s\"をクローズできませんでした: %m"
+
+#: pg_backup_directory.c:447
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "ラージオブジェクトTOCファイル\"%s\"を入力用としてオープンできませんでした: %m"
+
+#: pg_backup_directory.c:458
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "ラージオブジェクトTOCファイル\"%s\"の中に不正な行がありました: \"%s\""
+
+#: pg_backup_directory.c:467
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "ラージオブジェクトTOCファイル\"%s\"の読み取り中にエラーがありました"
+
+#: pg_backup_directory.c:471
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "ラージオブジェクトTOCファイル\"%s\"をクローズできませんでした: %m"
+
+#: pg_backup_directory.c:685
+#, c-format
+msgid "could not close blob data file: %m"
+msgstr "blobデータファイルをクローズできませんでした: %m"
+
+#: pg_backup_directory.c:691
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "blobのTOCファイルに書き出せませんでした"
+
+#: pg_backup_directory.c:705
+#, c-format
+msgid "could not close blobs TOC file: %m"
+msgstr "blobのTOCファイルをクローズできませんでした: %m"
+
+#: pg_backup_directory.c:724
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "ファイル名が長すぎます: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "この形式は読み込めません"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "TOCファイル\"%s\"を出力用にオープンできませんでした: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "TOCファイルを出力用にオープンできませんでした: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:893
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "tar アーカイブ形式では圧縮をサポートしていません"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "TOCファイル\"%s\"を入力用にオープンできませんでした: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "TOCファイルを入力用にオープンできませんでした: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "アーカイブ内にファイル\"%s\"がありませんでした"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "一時ファイル名を生成できませんでした: %m"
+
+#: pg_backup_tar.c:624
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "想定外のCOPY文の構文: \"%s\""
+
+#: pg_backup_tar.c:890
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "ラージオブジェクトの不正なOID(%u)"
+
+#: pg_backup_tar.c:1035
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "一時ファイルを開けませんでした: %m"
+
+#: pg_backup_tar.c:1038
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "実際のファイル長(%lld)が想定(%lld)と一致しません"
+
+#: pg_backup_tar.c:1084 pg_backup_tar.c:1115
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "tar アーカイブ内でファイル\"%s\"のヘッダがありませんでした"
+
+#: pg_backup_tar.c:1102
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "このアーカイブ形式では、順不同でのデータのリストアはサポートされていません: \"%s\"は必要ですが、アーカイブファイル内で\"%s\"より前に来ました。"
+
+#: pg_backup_tar.c:1149
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "不完全なtarヘッダがありました(%luバイト)"
+
+#: pg_backup_tar.c:1188
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "破損したtarヘッダが%sにありました(想定 %d、算出結果 %d) ファイル位置 %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "認識不可のセクション名: \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:628 pg_dump.c:645 pg_dumpall.c:340
+#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373
+#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細は\"%s --help\"を実行してください。"
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "on_exit_nicelyスロットが足りません"
+
+#: pg_dump.c:643 pg_dumpall.c:348 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数が多すぎます(先頭は\"%s\")"
+
+#: pg_dump.c:662 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "-s/--schema-only と -a/--data-only オプションは同時には使用できません"
+
+#: pg_dump.c:665
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "-s/--schema-only と --include-foreign-data オプションは同時には使用できません"
+
+#: pg_dump.c:668
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "オプション --include-foreign-data はパラレルバックアップではサポートされません"
+
+#: pg_dump.c:671 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "-c/--clean と -a/--data-only オプションは同時には使用できません"
+
+#: pg_dump.c:674 pg_dumpall.c:378 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "--if-existsは -c/--clean の指定が必要です"
+
+#: pg_dump.c:681
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "--on-conflict-do-nothingオプションは--inserts、--rows-per-insert または --column-insertsを必要とします"
+
+#: pg_dump.c:703
+#, c-format
+msgid "requested compression not available in this installation -- archive will be uncompressed"
+msgstr "圧縮が要求されましたがこのインストールでは利用できません -- アーカイブは圧縮されません"
+
+#: pg_dump.c:716
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "並列バックアップはディレクトリ形式でのみサポートされます"
+
+#: pg_dump.c:762
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "最後の組み込みOIDは%u"
+
+#: pg_dump.c:771
+#, c-format
+msgid "no matching schemas were found"
+msgstr "マッチするスキーマが見つかりません"
+
+#: pg_dump.c:785
+#, c-format
+msgid "no matching tables were found"
+msgstr "マッチするテーブルが見つかりません"
+
+#: pg_dump.c:807
+#, c-format
+msgid "no matching extensions were found"
+msgstr "合致する機能拡張が見つかりません"
+
+#: pg_dump.c:990
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%sはデータベースをテキストファイルまたはその他の形式でダンプします。\n"
+"\n"
+
+#: pg_dump.c:991 pg_dumpall.c:605 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_dump.c:992
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [DBNAME]\n"
+
+#: pg_dump.c:994 pg_dumpall.c:608 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"一般的なオプション;\n"
+
+#: pg_dump.c:995
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=ファイル名 出力ファイルまたはディレクトリの名前\n"
+
+#: pg_dump.c:996
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p 出力ファイルの形式(custom, directory, tar, \n"
+" plain text(デフォルト))\n"
+
+#: pg_dump.c:998
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM ダンプ時に指定した数の並列ジョブを使用\n"
+
+#: pg_dump.c:999 pg_dumpall.c:610
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose 冗長モード\n"
+
+#: pg_dump.c:1000 pg_dumpall.c:611
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: pg_dump.c:1001
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 圧縮形式における圧縮レベル\n"
+
+#: pg_dump.c:1002 pg_dumpall.c:612
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=TIMEOUT テーブルロックをTIMEOUT待ってから失敗\n"
+
+#: pg_dump.c:1003 pg_dumpall.c:639
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync 変更のディスクへの安全な書き出しを待機しない\n"
+
+#: pg_dump.c:1004 pg_dumpall.c:613
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: pg_dump.c:1006 pg_dumpall.c:614
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"出力内容を制御するためのオプション:\n"
+
+#: pg_dump.c:1007 pg_dumpall.c:615
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only データのみをダンプし、スキーマをダンプしない\n"
+
+#: pg_dump.c:1008
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs ダンプにラージオブジェクトを含める\n"
+
+#: pg_dump.c:1009
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs ダンプにラージオブジェクトを含めない\n"
+
+#: pg_dump.c:1010 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean 再作成前にデータベースオブジェクトを整理(削除)\n"
+
+#: pg_dump.c:1011
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create ダンプにデータベース生成用コマンドを含める\n"
+
+#: pg_dump.c:1012
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATTERN 指定した機能拡張のみをダンプ\n"
+
+#: pg_dump.c:1013 pg_dumpall.c:617
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=ENCODING ENCODING符号化方式でデータをダンプ\n"
+
+#: pg_dump.c:1014
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=SCHEMA 指定したスキーマのみをダンプ\n"
+
+#: pg_dump.c:1015
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=SCHEMA 指定したスキーマをダンプしない\n"
+
+#: pg_dump.c:1016
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner プレインテキスト形式で、オブジェクト所有権の\n"
+" 復元を行わない\n"
+
+#: pg_dump.c:1018 pg_dumpall.c:621
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only スキーマのみをダンプし、データはダンプしない\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAME プレインテキスト形式で使用するスーパーユーザーの名前\n"
+
+#: pg_dump.c:1020
+#, c-format
+msgid " -t, --table=PATTERN dump the specified table(s) only\n"
+msgstr " -t, --table=PATTERN 指定したテーブルのみをダンプ\n"
+
+#: pg_dump.c:1021
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATTERN 指定したテーブルをダンプしない\n"
+
+#: pg_dump.c:1022 pg_dumpall.c:624
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges 権限(grant/revoke)をダンプしない\n"
+
+#: pg_dump.c:1023 pg_dumpall.c:625
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade アップグレードユーティリティ専用\n"
+
+#: pg_dump.c:1024 pg_dumpall.c:626
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts 列名指定のINSERTコマンドでデータをダンプ\n"
+
+#: pg_dump.c:1025 pg_dumpall.c:627
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr ""
+" --disable-dollar-quoting ドル記号による引用符付けを禁止、SQL標準の引用符\n"
+" 付けを使用\n"
+
+#: pg_dump.c:1026 pg_dumpall.c:628 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers データのみのリストアの際にトリガを無効化\n"
+
+#: pg_dump.c:1027
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security 行セキュリティを有効化(ユーザーがアクセス可能な\n"
+" 内容のみをダンプ)\n"
+
+#: pg_dump.c:1029
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=PATTERN 指定したテーブルのデータをダンプしない\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:630
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM extra_float_digitsの設定を上書きする\n"
+
+#: pg_dump.c:1031 pg_dumpall.c:631 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists オブジェクト削除の際に IF EXISTS を使用\n"
+
+#: pg_dump.c:1032
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=PATTERN\n"
+" PATTERNに合致する外部サーバー上の外部テーブルの\n"
+" データを含める\n"
+
+#: pg_dump.c:1035 pg_dumpall.c:632
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts COPYではなくINSERTコマンドでデータをダンプ\n"
+
+#: pg_dump.c:1036 pg_dumpall.c:633
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root 子テーブルをルートテーブル経由でロードする\n"
+
+#: pg_dump.c:1037 pg_dumpall.c:634
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments コメントをダンプしない\n"
+
+#: pg_dump.c:1038 pg_dumpall.c:635
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications パブリケーションをダンプしない\n"
+
+#: pg_dump.c:1039 pg_dumpall.c:637
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels セキュリティラベルの割り当てをダンプしない\n"
+
+#: pg_dump.c:1040 pg_dumpall.c:638
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions サブスクリプションをダンプしない\n"
+
+#: pg_dump.c:1041 pg_dumpall.c:640
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method テーブルアクセスメソッドをダンプしない\n"
+
+#: pg_dump.c:1042 pg_dumpall.c:641
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces テーブルスペースの割り当てをダンプしない\n"
+
+#: pg_dump.c:1043 pg_dumpall.c:642
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression TOAST圧縮方式をダンプしない\n"
+
+#: pg_dump.c:1044 pg_dumpall.c:643
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data 非ログテーブルのデータをダンプしない\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:644
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing INSERTコマンドにON CONFLICT DO NOTHINGを付加する\n"
+
+#: pg_dump.c:1046 pg_dumpall.c:645
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr ""
+" --quote-all-identifiers すべての識別子をキーワードでなかったとしても\n"
+" 引用符で囲む\n"
+
+#: pg_dump.c:1047 pg_dumpall.c:646
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS INSERT毎の行数; --insertsを暗黙的に指定する\n"
+
+#: pg_dump.c:1048
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=SECTION 指定したセクション(pre-data、data または\n"
+" post-data)をダンプする\n"
+
+#: pg_dump.c:1049
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable ダンプを異常なく実行できるようになるまで待機\n"
+
+#: pg_dump.c:1050
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT ダンプに指定のスナップショットを使用する\n"
+
+#: pg_dump.c:1051 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names テーブル/スキーマの対象パターンが最低でも\n"
+" 一つの実体にマッチすることを必須とする\n"
+
+#: pg_dump.c:1053 pg_dumpall.c:647 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" 所有者をセットする際、ALTER OWNERコマンドの代わり\n"
+" にSET SESSION AUTHORIZATIONコマンドを使用する\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:651 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"接続オプション:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=DBNAME ダンプするデータベース\n"
+
+#: pg_dump.c:1059 pg_dumpall.c:653 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME データベースサーバーのホストまたはソケット\n"
+" ディレクトリ\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:655 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT データベースサーバーのポート番号\n"
+
+#: pg_dump.c:1061 pg_dumpall.c:656 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME 指定したデータベースユーザーで接続\n"
+
+#: pg_dump.c:1062 pg_dumpall.c:657 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password パスワード入力を要求しない\n"
+
+#: pg_dump.c:1063 pg_dumpall.c:658 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password パスワードプロンプトを強制表示します\n"
+" (自動的に表示されるはず)\n"
+
+#: pg_dump.c:1064 pg_dumpall.c:659
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLENAME ダンプの前に SET ROLE を行う\n"
+
+#: pg_dump.c:1066
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"データベース名が指定されなかった場合、環境変数PGDATABASEが使用されます\n"
+"\n"
+
+#: pg_dump.c:1068 pg_dumpall.c:663 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "バグは<%s>に報告してください。\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:664 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_dump.c:1088 pg_dumpall.c:488
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "不正なクライアントエンコーディング\"%s\"が指定されました"
+
+#: pg_dump.c:1226
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "スタンバイサーバーからの並列ダンプはこのサーバーバージョンではサポートされません"
+
+#: pg_dump.c:1291
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "不正な出力形式\"%s\"が指定されました"
+
+#: pg_dump.c:1332 pg_dump.c:1388 pg_dump.c:1441 pg_dumpall.c:1282
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "修飾名が不適切です(ドット区切りの名前が多すぎます): %s"
+
+#: pg_dump.c:1340
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "パターン\"%s\"にマッチするスキーマが見つかりません"
+
+#: pg_dump.c:1393
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "パターン\"%s\"に合致する機能拡張が見つかりません"
+
+#: pg_dump.c:1446
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "パターン\"%s\"にマッチする外部サーバーが見つかりません"
+
+#: pg_dump.c:1509
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "リレーション名が不適切です(ドット区切りの名前が多すぎます): %s"
+
+#: pg_dump.c:1520
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "パターン \"%s\"にマッチするテーブルが見つかりません"
+
+#: pg_dump.c:1547
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "現在データベースに接続していません。"
+
+#: pg_dump.c:1550
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "データベース間の参照は実装されていません: %s"
+
+#: pg_dump.c:1981
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "テーブル \"%s.%s\"の内容をダンプしています"
+
+#: pg_dump.c:2087
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "テーブル\"%s\"の内容のダンプに失敗: PQgetCopyData()が失敗しました。"
+
+#: pg_dump.c:2088 pg_dump.c:2098
+#, c-format
+msgid "Error message from server: %s"
+msgstr "サーバーのエラーメッセージ: %s"
+
+#: pg_dump.c:2089 pg_dump.c:2099
+#, c-format
+msgid "Command was: %s"
+msgstr "コマンド: %s"
+
+#: pg_dump.c:2097
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "テーブル\"%s\"の内容のダンプに失敗: PQgetResult()が失敗しました。"
+
+#: pg_dump.c:2179
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "テーブル\"%s\"から取得したフィールドの数が間違っています"
+
+#: pg_dump.c:2875
+#, c-format
+msgid "saving database definition"
+msgstr "データベース定義を保存しています"
+
+#: pg_dump.c:2971
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "認識できない照合順序プロバイダ: %s"
+
+#: pg_dump.c:3317
+#, c-format
+msgid "saving encoding = %s"
+msgstr "encoding = %s を保存しています"
+
+#: pg_dump.c:3342
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "standard_conforming_strings = %s を保存しています"
+
+#: pg_dump.c:3381
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "current_schemas()の結果をパースできませんでした"
+
+#: pg_dump.c:3400
+#, c-format
+msgid "saving search_path = %s"
+msgstr "search_path = %s を保存しています"
+
+#: pg_dump.c:3438
+#, c-format
+msgid "reading large objects"
+msgstr "ラージオブジェクトを読み込んでいます"
+
+#: pg_dump.c:3576
+#, c-format
+msgid "saving large objects"
+msgstr "ラージオブジェクトを保存しています"
+
+#: pg_dump.c:3617
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "ラージオブジェクト %u を読み取り中にエラーがありました: %s"
+
+#: pg_dump.c:3723
+#, c-format
+msgid "reading row-level security policies"
+msgstr "行レベルセキュリティポリシーを読み取ります"
+
+#: pg_dump.c:3864
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "想定外のポリシコマンドタイプ: \"%c\""
+
+#: pg_dump.c:4314 pg_dump.c:4632 pg_dump.c:11835 pg_dump.c:17724
+#: pg_dump.c:17726 pg_dump.c:18347
+#, c-format
+msgid "could not parse %s array"
+msgstr "%s配列をパースできませんでした"
+
+#: pg_dump.c:4500
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "現在のユーザーがスーパーユーザーではないため、サブスクリプションはダンプされません"
+
+#: pg_dump.c:5014
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "%s %sの親となる機能拡張がありませんでした"
+
+#: pg_dump.c:5159
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "OID %uのスキーマは存在しません"
+
+#: pg_dump.c:6615 pg_dump.c:16988
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "健全性検査に失敗しました、OID %2$u であるシーケンスの OID %1$u である親テーブルがありません"
+
+#: pg_dump.c:6758
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "健全性検査に失敗しました、pg_partitioned_tableにあるテーブルOID %u が見つかりません"
+
+#: pg_dump.c:6989 pg_dump.c:7256 pg_dump.c:7727 pg_dump.c:8394 pg_dump.c:8515
+#: pg_dump.c:8669
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "認識できないテーブルOID %u"
+
+#: pg_dump.c:6993
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "テーブル\"%s\"に対する想定外のインデックスデータ"
+
+#: pg_dump.c:7488
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "健全性検査に失敗しました、OID %2$u であるpg_rewriteエントリのOID %1$u である親テーブルが見つかりません"
+
+#: pg_dump.c:7779
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "問い合わせがテーブル\"%2$s\"上の外部キートリガ\"%1$s\"の参照テーブル名としてNULLを返しました(テーブルのOID: %3$u)"
+
+#: pg_dump.c:8398
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "テーブル\"%s\"に対する想定外の列データ"
+
+#: pg_dump.c:8428
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "テーブル\"%s\"の列番号が不正です"
+
+#: pg_dump.c:8477
+#, c-format
+msgid "finding table default expressions"
+msgstr "テーブルのデフォルト式を探しています"
+
+#: pg_dump.c:8519
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "テーブル\"%2$s\"用のadnumの値%1$dが不正です"
+
+#: pg_dump.c:8619
+#, c-format
+msgid "finding table check constraints"
+msgstr "テーブルのチェック制約を探しています"
+
+#: pg_dump.c:8673
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "テーブル\"%2$s\"で想定する検査制約は%1$d個でしたが、%3$dありました"
+
+#: pg_dump.c:8677
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "システムカタログが破損している可能性があります。"
+
+#: pg_dump.c:9367
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "OID が %u であるロールは存在しません"
+
+#: pg_dump.c:9479 pg_dump.c:9508
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "非サポートのpg_init_privsエントリ: %u %u %d"
+
+#: pg_dump.c:10329
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "データ型\"%s\"のtyptypeが不正なようです"
+
+#: pg_dump.c:11904
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "関数\"%s\"のprovolatileの値が認識できません"
+
+#: pg_dump.c:11954 pg_dump.c:13817
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "関数\"%s\"のproparallel値が認識できません"
+
+#: pg_dump.c:12086 pg_dump.c:12192 pg_dump.c:12199
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "OID %uの関数の関数定義が見つかりませんでした"
+
+#: pg_dump.c:12125
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "pg_cast.castfuncまたはpg_cast.castmethodフィールドの値がおかしいです"
+
+#: pg_dump.c:12128
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "pg_cast.castmethod フィールドの値がおかしいです"
+
+#: pg_dump.c:12218
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "おかしな変換定義、trffromsql か trftosql の少なくとも一方は非ゼロであるはずです"
+
+#: pg_dump.c:12235
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "pg_cast.castmethod フィールドの値がおかしいです"
+
+#: pg_dump.c:12256
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "pg_cast.castmethod フィールドの値がおかしいです"
+
+#: pg_dump.c:12401
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "後置演算子は今後サポートされません(演算子\"%s\")"
+
+#: pg_dump.c:12571
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "OID %sの演算子がありませんでした"
+
+#: pg_dump.c:12639
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "アクセスメソッド\"%2$s\"の不正なタイプ\"%1$c\""
+
+#: pg_dump.c:13293
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "認識できないの照合順序プロバイダ: %s"
+
+#: pg_dump.c:13302 pg_dump.c:13311 pg_dump.c:13321 pg_dump.c:13330
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "不正な照合順序\"%s\""
+
+#: pg_dump.c:13346
+#, c-format
+msgid "unrecognized collation provider '%c'"
+msgstr "認識できないの照合順序プロバイダ '%c'"
+
+#: pg_dump.c:13736
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "集約\"%s\"のaggfinalmodifyの値が識別できません"
+
+#: pg_dump.c:13792
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "集約\"%s\"のaggmfinalmodifyの値が識別できません"
+
+#: pg_dump.c:14510
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "デフォルト権限設定中の認識できないオブジェクト型: %d"
+
+#: pg_dump.c:14526
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "デフォルトの ACL リスト(%s)をパースできませんでした"
+
+#: pg_dump.c:14608
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "オブジェクト\"%3$s\"(%4$s)の初期ACLリスト(%1$s)またはデフォルト値(%2$s)をパースできませんでした"
+
+#: pg_dump.c:14633
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "オブジェクト\"%3$s\"(%4$s)のACLリスト(%1$s)またはデフォルト値(%2$s)をパースできませんでした"
+
+#: pg_dump.c:15171
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "ビュー\"%s\"の定義を取り出すための問い合わせがデータを返却しませんでした"
+
+#: pg_dump.c:15174
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "ビュー\"%s\"の定義を取り出すための問い合わせが2つ以上の定義を返却しました"
+
+#: pg_dump.c:15181
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "ビュー\"%s\"の定義が空のようです(長さが0)"
+
+#: pg_dump.c:15265
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDSは今後サポートされません(テーブル\"%s\")"
+
+#: pg_dump.c:16194
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "テーブル\"%2$s\"の列番号%1$dは不正です"
+
+#: pg_dump.c:16272
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "インデックス統計列をパースできませんでした"
+
+#: pg_dump.c:16274
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "インデックス統計値をパースできませんでした"
+
+#: pg_dump.c:16276
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "インデックス統計に対して列と値の数が合致しません"
+
+#: pg_dump.c:16494
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "制約\"%s\"のインデックスが見つかりません"
+
+#: pg_dump.c:16722
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "制約のタイプが識別できません: %c"
+
+#: pg_dump.c:16823 pg_dump.c:17052
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "シーケンス\"%s\"のデータを得るための問い合わせが%d行返却しました(想定は1)"
+
+#: pg_dump.c:16855
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "認識されないシーケンスの型\"%s\""
+
+#: pg_dump.c:17144
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "想定外のtgtype値: %d"
+
+#: pg_dump.c:17216
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "テーブル\"%3$s\"上のトリガ\"%2$s\"の引数文字列(%1$s)が不正です"
+
+#: pg_dump.c:17485
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "テーブル\"%2$s\"のルール\"%1$s\"を得るための問い合わせが失敗しました: 間違った行数が返却されました"
+
+#: pg_dump.c:17638
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "親の機能拡張%uが見つかりません"
+
+#: pg_dump.c:17728
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "機能拡張に対して設定と条件の数が一致しません"
+
+#: pg_dump.c:17860
+#, c-format
+msgid "reading dependency data"
+msgstr "データの依存データを読み込んでいます"
+
+#: pg_dump.c:17946
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "参照元オブジェクト%u %uがありません"
+
+#: pg_dump.c:17957
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "参照先オブジェクト%u %uがありません"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "不正なdumpId %d"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "不正な依存関係 %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "依存関係のループが見つかりませんでした"
+
+#: pg_dump_sort.c:1276
+#, c-format
+msgid "there are circular foreign-key constraints on this table:"
+msgid_plural "there are circular foreign-key constraints among these tables:"
+msgstr[0] "次のテーブルの中で外部キー制約の循環があります: "
+
+#: pg_dump_sort.c:1281
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "--disable-triggersの使用または一時的な制約の削除を行わずにこのダンプをリストアすることはできないかもしれません。"
+
+#: pg_dump_sort.c:1282
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "この問題を回避するために--data-onlyダンプの代わりに完全なダンプを使用することを検討してください。"
+
+#: pg_dump_sort.c:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "以下の項目の間の依存関係のループを解決できませんでした:"
+
+#: pg_dumpall.c:205
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "%2$sには\"%1$s\"プログラムが必要ですが、\"%3$s\"と同じディレクトリにありませんでした。"
+
+#: pg_dumpall.c:208
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じバージョンではありませんでした。"
+
+#: pg_dumpall.c:357
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "--exclude-database オプションは -g/--globals-only、-r/--roles-only もしくは -t/--tablespaces-only と一緒には使用できません"
+
+#: pg_dumpall.c:365
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "-g/--globals-onlyと-r/--roles-onlyオプションは同時に使用できません"
+
+#: pg_dumpall.c:372
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "-g/--globals-onlyと-t/--tablespaces-onlyオプションは同時に使用できません"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "-r/--roles-onlyと-t/--tablespaces-onlyオプションは同時に使用できません"
+
+#: pg_dumpall.c:444 pg_dumpall.c:1587
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "データベース\"%s\"へ接続できませんでした"
+
+#: pg_dumpall.c:456
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"\"postgres\"または\"template1\"データベースに接続できませんでした\n"
+"代わりのデータベースを指定してください。"
+
+#: pg_dumpall.c:604
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%sはPostgreSQLデータベースクラスタをSQLスクリプトファイルに展開します。\n"
+"\n"
+
+#: pg_dumpall.c:606
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_dumpall.c:609
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=ファイル名 出力ファイル名\n"
+
+#: pg_dumpall.c:616
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean 再作成前にデータベースを整理(削除)\n"
+
+#: pg_dumpall.c:618
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr ""
+" -g, --globals-only グローバルオブジェクトのみをダンプし、\n"
+" データベースをダンプしない\n"
+
+#: pg_dumpall.c:619 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner オブジェクトの所有権の復元を省略\n"
+
+#: pg_dumpall.c:620
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr ""
+" -r, --roles-only ロールのみをダンプ。\n"
+" データベースとテーブル空間をダンプしません\n"
+
+#: pg_dumpall.c:622
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr ""
+" -S, --superuser=NAME ダンプで使用するスーパーユーザーのユーザー名を\n"
+" 指定\n"
+
+#: pg_dumpall.c:623
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr ""
+" -t, --tablespaces-only テーブル空間のみをダンプ。データベースとロールを\n"
+" ダンプしません\n"
+
+#: pg_dumpall.c:629
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=PATTERN PATTERNに合致する名前のデータベースを除外\n"
+
+#: pg_dumpall.c:636
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords ロールのパスワードをダンプしない\n"
+
+#: pg_dumpall.c:652
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONSTR 接続文字列を用いた接続\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=DBNAME 代替のデフォルトデータベースを指定\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"-f/--file が指定されない場合、SQLスクリプトは標準出力に書き出されます。\n"
+"\n"
+
+#: pg_dumpall.c:803
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "\"pg_\"で始まるロール名はスキップされました(%s)"
+
+#: pg_dumpall.c:1018
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "パラメータ\"%2$s\"のACLリスト(%1$s)をパースできませんでした"
+
+#: pg_dumpall.c:1136
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "テーブル空間\"%2$s\"のACLリスト(%1$s)をパースできませんでした"
+
+#: pg_dumpall.c:1343
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "データベース\"%s\"を除外します"
+
+#: pg_dumpall.c:1347
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "データベース\"%s\"をダンプしています"
+
+#: pg_dumpall.c:1378
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "データベース\"%s\"のダンプが失敗しました、終了します"
+
+#: pg_dumpall.c:1384
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "出力ファイル\"%s\"を再オープンできませんでした: %m"
+
+#: pg_dumpall.c:1425
+#, c-format
+msgid "running \"%s\""
+msgstr "\"%s\"を実行しています"
+
+#: pg_dumpall.c:1630
+#, c-format
+msgid "could not get server version"
+msgstr "サーバーバージョンを取得できませんでした"
+
+#: pg_dumpall.c:1633
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "サーバーバージョン\"%s\"をパースできませんでした"
+
+#: pg_dumpall.c:1703 pg_dumpall.c:1726
+#, c-format
+msgid "executing %s"
+msgstr "%s を実行しています"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "-d/--dbnameと-f/--fileのどちらか一方が指定されていなければなりません"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "オプション-d/--dbnameと-f/--fileは同時に使用できません"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "オプション-C/--createと-1/--single-transactionとは同時には使用できません"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "--single-transaction と複数ジョブは同時には指定できません"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "アーカイブ形式\"%s\"が認識できません; \"c\"、\"d\"または\"t\"を指定してください"
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "リストア中に無視されたエラー数: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%sはpg_dumpで作成したアーカイブからPostgreSQLデータベースをリストアします。\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [OPTION]... [FILE]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NAME 接続するデータベース名\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FILENAME 出力ファイル名(- で標準出力)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr ""
+" -F, --format=c|d|t バックアップファイルの形式\n"
+" (自動的に設定されるはず)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list アーカイブのTOCの要約を表示\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose 冗長モード\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"リストア制御用のオプション:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only データのみをリストア。スキーマをリストアしない\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create 対象のデータベースを作成\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error エラー時に終了。デフォルトは継続\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAME 指名したインデックスをリストア\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM リストア時に指定した数の並列ジョブを使用\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=FILENAME このファイルの内容に従って SELECT や\n"
+" 出力のソートを行う\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME 指定したスキーマのオブジェクトのみをリストア\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME 指定したスキーマのオブジェクトはリストアしない\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAME(args) 指名された関数をリストア\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only スキーマのみをリストア。データをリストアしない\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NAME トリガを無効にするためのスーパーユーザーの名前\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr ""
+" -t, --table=NAME 指名したリレーション(テーブル、ビューなど)を\n"
+" リストア\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NAME 指名したトリガをリストア\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges アクセス権限(grant/revoke)の復元を省略\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction 単一のトランザクションとしてリストア\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security 行セキュリティを有効にする\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments コメントをリストアしない\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables 作成できなかったテーブルのデータは\n"
+" リストアしない\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications パブリケーションをリストアしない\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels セキュリティラベルをリストアしない\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions サブスクリプションをリストアしない\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method テーブルアクセスメソッドをリストアしない\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces テーブル空間の割り当てをリストアしない\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=SECTION 指定されたセクション(pre-data、data、または\n"
+" post-data)をリストア\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME リストアに先立って SET ROLE します\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+" -I, -n, -N, -P, -t, -T および --section オプションは組み合わせて複数回\n"
+"指定することで複数のオブジェクトを指定できます。\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"入力ファイル名が指定されない場合、標準入力が使用されます。\n"
+"\n"
diff --git a/src/bin/pg_dump/po/ka.po b/src/bin/pg_dump/po/ka.po
new file mode 100644
index 0000000..ee3793f
--- /dev/null
+++ b/src/bin/pg_dump/po/ka.po
@@ -0,0 +1,2624 @@
+# Georgian message translation file for pg_dump
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_dump (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-23 23:06+0000\n"
+"PO-Revision-Date: 2023-08-24 11:49+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდომა: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტალები: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნება: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "მიმდინარე საქაღალდის იდენტიფიკაციის პრობლემა: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "არასწორი ბინარული ფაილი \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "ბინარული ფაილის (%s) წაკითხვის შეცდოა"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "გასაშვებად ფაილის \"%s\" პოვნა შეუძლებელია"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "საქაღალდის %s-ზე შეცვლის შეცდომა: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "სიმბოლური ბმის \"%s\" წაკითხვის შეცდომა: %m"
+
+#: ../../common/exec.c:422 parallel.c:1611
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s()-ის შეცდომა: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "არასაკმარისი მეხსიერება"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "არასაკმარისი მეხსიერება\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ნულოვანი მაჩვენებლის დუბლირება შეუძლებელია (შიდა შეცდომა)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "ბრძანება გაშვებადი არაა"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "ბრძანება ვერ ვიპოვე"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "შვილეული პროცესი დასრულდა სტატუსით %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "შვილეული პროცესი დასრულდა გამონაკლისით 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "პროცესი გაჩერდა სიგნალით: %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "შვილეული პროცესი დასრულდა უცნობი სტატუსით %d"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "არასწორი მნიშვნელობა \"%s\" პარამეტრისთვის %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s არაა საზღვრებში %d-დან %d-მდე"
+
+#: common.c:134
+#, c-format
+msgid "reading extensions"
+msgstr "გაფართოებების წაკითხვა"
+
+#: common.c:137
+#, c-format
+msgid "identifying extension members"
+msgstr "გაფართოების ნომრების იდენტიფიკაცია"
+
+#: common.c:140
+#, c-format
+msgid "reading schemas"
+msgstr "სქემების კითხვა"
+
+#: common.c:149
+#, c-format
+msgid "reading user-defined tables"
+msgstr "მომხმარებლის მიერ განსაზღვრული ცხრილების კითხვა"
+
+#: common.c:154
+#, c-format
+msgid "reading user-defined functions"
+msgstr "მომხმარებლის მიერ განსაზღვრული ფუნქციების კითხვა"
+
+#: common.c:158
+#, c-format
+msgid "reading user-defined types"
+msgstr "მომხმარებლის მიერ განსაზღვრული ტიპების კითხვა"
+
+#: common.c:162
+#, c-format
+msgid "reading procedural languages"
+msgstr "პროცედურული ენების კითხვა"
+
+#: common.c:165
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "მომხმარებლის მიერ განსაზღვრული აგრეგატული ფუნქციების კითხვა"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined operators"
+msgstr "მომხმარებლის მიერ განსაზღვრული ოპერატორების კითხვა"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "მომხმარებლის მიერ განსაზღვრული წვდომის მეთოდების კითხვა"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "მომხმარებლის მიერ განსაზღვრული ოპერატორის კლასების კითხვა"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "მომხმარებლის მიერ განსაზღვრული ოპერატორის ოჯახების კითხვა"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "მომხმარებლის მიერ განსაზღვრული ტექსტის ძებნის დამმუშავებლების კითხვა"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "მომხმარებლის მიერ განსაზღვრული ტექსტის ძებნის შაბლონების კითხვა"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "მომხმარებლის მიერ განსაზღვრული ტექსტის ძებნის ლექსიკონების კითხვა"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "მომხმარებლის მიერ განსაზღვრული ტექსტის ძებნის კონფიგურაციების კითხვა"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "მომხმარებლის მიერ განსაზღვრული გარე მონაცემების გადამტანების კითხვა"
+
+#: common.c:195
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "მომხმარებლის მიერ განსაზღვრული გარე სერვერების კითხვა"
+
+#: common.c:198
+#, c-format
+msgid "reading default privileges"
+msgstr "ნაგულისხმები წვდომების კითხვა"
+
+#: common.c:201
+#, c-format
+msgid "reading user-defined collations"
+msgstr "მომხმარებლის მიერ განსაზღვრული კოლაციების კითხვა"
+
+#: common.c:204
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "მომხმარებლის მიერ განსაზღვრული გადაყვანების კითხვა"
+
+#: common.c:207
+#, c-format
+msgid "reading type casts"
+msgstr "ტიპის კასტების კითხვა"
+
+#: common.c:210
+#, c-format
+msgid "reading transforms"
+msgstr "გარდაქმნების კითხვა"
+
+#: common.c:213
+#, c-format
+msgid "reading table inheritance information"
+msgstr "ცხრილების მეკვიდრეობითობის ინფორმაციის კითხვა"
+
+#: common.c:216
+#, c-format
+msgid "reading event triggers"
+msgstr "მოვლენების ტრიგერების კითხვა"
+
+#: common.c:220
+#, c-format
+msgid "finding extension tables"
+msgstr "გაფართოების ცხრილების მოძებნა"
+
+#: common.c:224
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "მემკვიდრეობითი ურთიერთობების მოძებნა"
+
+#: common.c:227
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "საინტერესო ცხრილების სვეტების ინფორმაციის კითხვა"
+
+#: common.c:230
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "ქვეცხრილებში მემკვიდრეობით სვეტებზე ალმის დასმა"
+
+#: common.c:233
+#, c-format
+msgid "reading partitioning data"
+msgstr "დანაყოფების მონაცემების კითხვა"
+
+#: common.c:236
+#, c-format
+msgid "reading indexes"
+msgstr "ინდექსების კითხვა"
+
+#: common.c:239
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "დაყოფილ ცხრილებში ინდექსებზე ალმის დასმა"
+
+#: common.c:242
+#, c-format
+msgid "reading extended statistics"
+msgstr "გაფართოებული სტატისტიკის კითხვა"
+
+#: common.c:245
+#, c-format
+msgid "reading constraints"
+msgstr "შეზღუდვების კითხვა"
+
+#: common.c:248
+#, c-format
+msgid "reading triggers"
+msgstr "ტრიგერების კითხვა"
+
+#: common.c:251
+#, c-format
+msgid "reading rewrite rules"
+msgstr "გადაწერის წესების კითხვა"
+
+#: common.c:254
+#, c-format
+msgid "reading policies"
+msgstr "წესების კითხვა"
+
+#: common.c:257
+#, c-format
+msgid "reading publications"
+msgstr "გამოცემების კითხვა"
+
+#: common.c:260
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "ცხრილების გამოცემის წევრობის კითხვა"
+
+#: common.c:263
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "სქემების გამოცემის წევრობის კითხვა"
+
+#: common.c:266
+#, c-format
+msgid "reading subscriptions"
+msgstr "გამოწერების კითხვა"
+
+#: common.c:345
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "მშობლების არასწორი რაოდენობა %d ცხრილისთვის \"%s\""
+
+#: common.c:1006
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "სისწორის შემოწმების შეცდომა. ცხრილის (\"%2$s\", OID %3$u) მშობელი OID (%1$u) არ არსებობს"
+
+#: common.c:1045
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "რიცხვითი მასივის \"%s\" დამუშავების შეცდომა: მეტისმეტად ბევრი რიცხვი"
+
+#: common.c:1057
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "რიცხვითი მასივის \"%s\" დამუშავების შეცდომა: რიცხვში არასწორის სიმბოლოებია"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "შეკუმშვის არასწორი კოდი: %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504
+#: compress_io.c:547
+#, c-format
+msgid "not built with zlib support"
+msgstr "არ არის აგებული zlib მხარდაჭერით"
+
+#: compress_io.c:236 compress_io.c:333
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "შეკუმშვის ბიბლიოთეკის ინიციალიზება ვერ მოხერხდა: %s"
+
+#: compress_io.c:256
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "შეკუმშვის ნაკადის დახურვის შეცდომა: %s"
+
+#: compress_io.c:273
+#, c-format
+msgid "could not compress data: %s"
+msgstr "მონაცემების შეკუმშვა შეუძლებელია: %s"
+
+#: compress_io.c:349 compress_io.c:364
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "მონაცემების განშლის შეცდომა: %s"
+
+#: compress_io.c:371
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "შეკუმშვის ბიბლიოთეკის დახურვის შეცდომა: %s"
+
+#: compress_io.c:584 compress_io.c:621
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "შეყვანის ფაილების წაკითხვის შეცდომა: %s"
+
+#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553
+#: pg_backup_tar.c:726 pg_backup_tar.c:749
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "შეყვანის ფაილების წაკითხვის შეცდომა: ფაილის დასასრული"
+
+#: parallel.c:253
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() -ის შეცდომა: შეცდომის კოდი: %d"
+
+#: parallel.c:961
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "საკომუნიკაციო არხების შექმნა ვერ მოხერხდა: %m"
+
+#: parallel.c:1018
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "დამხმარე პროცესის შექმნა შეუძლებელია: %m"
+
+#: parallel.c:1148
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "თავსართიდან მიღებული ბრძანება უცნობია: %s"
+
+#: parallel.c:1191 parallel.c:1429
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "დამხმარე პროცესისგან მიღებულია არასწორი შეტყობინება: %s"
+
+#: parallel.c:1323
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"ურთიერთობის (\"%s\") დაბლოკვის შეცდომა\n"
+"ეს ჩვეულებრივ ნიშნავს, რომ ვინმემ მოითხოვა ACCESS EXCLUSIVE ბლოკი ცხრილზე მას შემდეგ, რაც pg_dump-ის მშობელმა პროცესმა საწყისი ACCESS SHARE ბლოკი ცხრილზე უკვე მიიღო."
+
+#: parallel.c:1412
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "დამხმარე პროტოკოლის პროცესი მოულოდნელად მოკვდა"
+
+#: parallel.c:1534 parallel.c:1652
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "საკომუნიკაციო არხში ჩაწერის შეცდომა: %m"
+
+#: parallel.c:1736
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: სოკეტის შექმნის შეცდომა. შეცდომის კოდი: %d"
+
+#: parallel.c:1747
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: მიბმის შეცდომა: შეცდომის კოდი: %d"
+
+#: parallel.c:1754
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: მოსმენის შეცდომა: შეცდომის კოდი: %d"
+
+#: parallel.c:1761
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s() -ის შეცდომა: შეცდომის კოდი %d"
+
+#: parallel.c:1772
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: მეორე სოკეტის შექნა შეუძლებელია: შეცდომის კოდი: %d"
+
+#: parallel.c:1781
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: სოკეტთან მიერთების შეცდომა: შეცდომის კოდი %d"
+
+#: parallel.c:1790
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: შეერთების დადასტურება შეუძლებელია: შეცდომის კოდი %d"
+
+#: pg_backup_archiver.c:280 pg_backup_archiver.c:1632
+#, c-format
+msgid "could not close output file: %m"
+msgstr "გამოტანის ფაილის დახურვის შეცდომა: %m"
+
+#: pg_backup_archiver.c:324 pg_backup_archiver.c:328
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "არქივის ჩანაწერების მიმდევრობა არასწორია"
+
+#: pg_backup_archiver.c:334
+#, c-format
+msgid "unexpected section code %d"
+msgstr "სექციის მოულოდნელი კოდი %d"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "არქივის ფაილის ამ ფორმატზე პარალელური აღდგენა მხარდაჭერილი არაა"
+
+#: pg_backup_archiver.c:375
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "არქივის ფაილზე, რომელიც 8.0 pg_dump-ით ან უფრო ძველით შეიქმნა, პარალელური აღდგენა მხარდაჭერილი არაა"
+
+#: pg_backup_archiver.c:393
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)"
+msgstr "შეკუმშული არქივიდან აღდგენა შეუძლებელია (ამ აგებაში შეკუმშვა მხარდაჭერილი არაა)"
+
+#: pg_backup_archiver.c:410
+#, c-format
+msgid "connecting to database for restore"
+msgstr "მონაცემთა ბაზასთან დაკავშირება აღდგენისთვის"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "ბაზასთან პირდაპირი შეერთება 1.3 ან უფრო ძველ არქივებში მხარდაჭერილი არაა"
+
+#: pg_backup_archiver.c:455
+#, c-format
+msgid "implied data-only restore"
+msgstr "მხოლოდ მონაცემთა აღდგენა"
+
+#: pg_backup_archiver.c:521
+#, c-format
+msgid "dropping %s %s"
+msgstr "მოცილება %s %s"
+
+#: pg_backup_archiver.c:621
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "ვერ ვიპოვე, ოპერაციაში \"%s\" IF EXISTS სად უნდა ჩავსვა"
+
+#: pg_backup_archiver.c:777 pg_backup_archiver.c:779
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "გაფრთხილება საწყისი გამოტანილი ფაილიდან: %s"
+
+#: pg_backup_archiver.c:794
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "იქმნება %s \"%s.%s\""
+
+#: pg_backup_archiver.c:797
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "იქმნება %s \"%s\""
+
+#: pg_backup_archiver.c:847
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "ახალ ბაზასთან მიერთება \"%s\""
+
+#: pg_backup_archiver.c:874
+#, c-format
+msgid "processing %s"
+msgstr "დამუშავება %s"
+
+#: pg_backup_archiver.c:896
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "მონაცემების დამუშავება ცხრილისთვის \"%s.%s\""
+
+#: pg_backup_archiver.c:966
+#, c-format
+msgid "executing %s %s"
+msgstr "შესრულება %s %s"
+
+#: pg_backup_archiver.c:1005
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "%s-სთვის ტრიგერების გამორთვა"
+
+#: pg_backup_archiver.c:1031
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "%s-სთვის ტრიგერების ჩართვა"
+
+#: pg_backup_archiver.c:1096
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "შიდა შეცდომა -- WriteData-ს DataDumper-ის ქვეპროგრამის კონტექსტის გარეთ ვერ გამოიძახებთ"
+
+#: pg_backup_archiver.c:1279
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "არჩეულ ფორმატს დიდი ობიექტების გამოტანის საშუალება არ გააჩნია"
+
+#: pg_backup_archiver.c:1337
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "აღდგენილია %d დიდი ობიექტი"
+msgstr[1] "აღდგენილია %d დიდი ობიექტი"
+
+#: pg_backup_archiver.c:1358 pg_backup_tar.c:669
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "მიმდინარეობს დიდი ობიექტის აღდგენა OID-ით: %u"
+
+#: pg_backup_archiver.c:1370
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "დიდი ობიექტის (%u) შექმნის შეცდომა: %s"
+
+#: pg_backup_archiver.c:1375 pg_dump.c:3607
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "დიდი ობიექტის (%u) გახსნის შეცდომა: %s"
+
+#: pg_backup_archiver.c:1431
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "\"TOC\" ფაილის (%s) გახსნის შეცდომა: %m"
+
+#: pg_backup_archiver.c:1459
+#, c-format
+msgid "line ignored: %s"
+msgstr "ხაზი იგნორირებულია: %s"
+
+#: pg_backup_archiver.c:1466
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "ჩანაწერი ID-ით %d არ არსებობს"
+
+#: pg_backup_archiver.c:1489 pg_backup_directory.c:222
+#: pg_backup_directory.c:599
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "\"TOC\" ფაილის დახურვის შეცდომა: %m"
+
+#: pg_backup_archiver.c:1603 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:586 pg_backup_directory.c:649
+#: pg_backup_directory.c:668 pg_dumpall.c:476
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "გამოტანის ფაილის (\"%s\") გახსნის შეცდომა: %m"
+
+#: pg_backup_archiver.c:1605 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "გამოტანის ფაილის გახსნის შეცდომა: %m"
+
+#: pg_backup_archiver.c:1699
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "ჩაწერილია დიდი ობიექტის მონაცემების %zu ბაიტი (შედეგი = %d)"
+msgstr[1] "ჩაწერილია დიდი ობიექტის მონაცემების %zu ბაიტი (შედეგი = %d)"
+
+#: pg_backup_archiver.c:1705
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "დიდი ობიექტის ჩაწერის შეცდომა: %s"
+
+#: pg_backup_archiver.c:1795
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "\"INITIALIZING\"-ის დროს:"
+
+#: pg_backup_archiver.c:1800
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "\"PROCESSING TOC\"-ის დროს:"
+
+#: pg_backup_archiver.c:1805
+#, c-format
+msgid "while FINALIZING:"
+msgstr "\"FINALIZING\"-ის დროს:"
+
+#: pg_backup_archiver.c:1810
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "შინაარსის ჩანაწერიდან %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1886
+#, c-format
+msgid "bad dumpId"
+msgstr "არასწორი dumpId"
+
+#: pg_backup_archiver.c:1907
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "ცხრილის არასწორი dumpId-ი TABLE DATA ელემენტისთვის"
+
+#: pg_backup_archiver.c:1999
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "მონაცემების წანაცვლების მოულოდნელი ალამი: %d"
+
+#: pg_backup_archiver.c:2012
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "გამოტანილ ფაილში ფაილის წანაცვლება ძალიან დიდია"
+
+#: pg_backup_archiver.c:2150 pg_backup_archiver.c:2160
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "საქაღალდის სახელი ძალიან გრძელია : \"%s\""
+
+#: pg_backup_archiver.c:2168
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "საქაღალდე \"%s\" სწორ არქივს არ ჰგავს (\"toc.dat\" არ არსებობს)"
+
+#: pg_backup_archiver.c:2176 pg_backup_custom.c:173 pg_backup_custom.c:807
+#: pg_backup_directory.c:207 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "შეყვანის ფაილის (\"%s\") გახსნის შეცდომა: %m"
+
+#: pg_backup_archiver.c:2183 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "შეყვანის ფაილის გახსნის შეცდომა: %m"
+
+#: pg_backup_archiver.c:2189
+#, c-format
+msgid "could not read input file: %m"
+msgstr "შემოსატანი ფაილის წაკითხვის შეცდომა: %m"
+
+#: pg_backup_archiver.c:2191
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "შეყვანის ფაილი ძალიან მოკლეა (წავიკითხე %lu, მოსალოდნელია 5)"
+
+#: pg_backup_archiver.c:2223
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "შეყვანის ფაილი, როგორც ჩანს, არის ტექსტის ფორმატის დამპია. გთხოვთ გამოიყენოთ psql."
+
+#: pg_backup_archiver.c:2229
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "შეყვანილი ფაილი სწორ არქივს არ ჰგავს (ძალიან მოკლეა)"
+
+#: pg_backup_archiver.c:2235
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "შეყვანის ფაილი სწორ არქივს არ ჰგავს"
+
+#: pg_backup_archiver.c:2244
+#, c-format
+msgid "could not close input file: %m"
+msgstr "შეყვანის ფაილის დახურვის შეცდომა: %m"
+
+#: pg_backup_archiver.c:2361
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "ფაილის უცნობი ფორმატი \"%d\""
+
+#: pg_backup_archiver.c:2443 pg_backup_archiver.c:4505
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "დასრულებული ელემენტი %d %s %s"
+
+#: pg_backup_archiver.c:2447 pg_backup_archiver.c:4518
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "დამხმარე პროცესის შეცდომა: გამოსვლის კოდი %d"
+
+#: pg_backup_archiver.c:2568
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "ელემენტის ID %d დიაპაზონს გარეთაა -- შეიძლება სარჩევი დაზიანებულია"
+
+#: pg_backup_archiver.c:2648
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "ცხრილების, აღწერილი WITH OIDS -ით, აღდგენა მხარდაჭერილი აღარაა"
+
+#: pg_backup_archiver.c:2730
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "უცნობი კოდირება \"%s\""
+
+#: pg_backup_archiver.c:2735
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "არასწორი ჩანაწერი \"ENCODING\": %s"
+
+#: pg_backup_archiver.c:2753
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "არასწორი ჩანაწერი \"STDSTRINGS\": %s"
+
+#: pg_backup_archiver.c:2778
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "სქემა \"%s\" არ არსებობს"
+
+#: pg_backup_archiver.c:2785
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "ცხრილი %s არ არსებობს"
+
+#: pg_backup_archiver.c:2792
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "ინდექსი %s არ არსებობს"
+
+#: pg_backup_archiver.c:2799
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "ფუნქცია %s არ არსებობს"
+
+#: pg_backup_archiver.c:2806
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "ტრიგერი %s არ არსებობს"
+
+#: pg_backup_archiver.c:3203
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "სესიის მომხმარებლის %s-ზე დაყენების შეცდომა: %s"
+
+#: pg_backup_archiver.c:3340
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "session_path-ის %s-ზე დაყენების შეცდომა: %s"
+
+#: pg_backup_archiver.c:3402
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "default_tablespace-ის %s-ზე დაყენების შეცდომა: %s"
+
+#: pg_backup_archiver.c:3452
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "default_table_access_method-ის დაყენების შეცდომა: %s"
+
+#: pg_backup_archiver.c:3546 pg_backup_archiver.c:3711
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "არ ვიცი, როგორ დავაყენო ობიექტის მოცემული ტიპის (%s) მფლობელი"
+
+#: pg_backup_archiver.c:3814
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "ფაილის თავსართში მაგიური სტრიქონი ნაპოვნი არაა"
+
+#: pg_backup_archiver.c:3828
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "ფაილის თავსართში არსებული ვერსია (%d.%d) მხარდაუჭერელია"
+
+#: pg_backup_archiver.c:3833
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "მთელი რიცხვის ზომის (%lu) სისწორის შემოწმების შეცდომა"
+
+#: pg_backup_archiver.c:3837
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "არქივი შეიქმნა მანქანაზე, სადაც მთელი რიცხვი უფრო დიდია. ზოგიერთი ოპერაცია შეიძლება შეცდომით დასრულდეს"
+
+#: pg_backup_archiver.c:3847
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "მოსალოდნელი ფორმატი (%d) განსხვავდება ფაილის ფორმატისგან (%d)"
+
+#: pg_backup_archiver.c:3862
+#, c-format
+msgid "archive is compressed, but this installation does not support compression -- no data will be available"
+msgstr "არქივი შეკუმშულია, მაგრამ ამ ვერსიას შეკუმშვის მხარდაჭერა არ გააჩნია -- მონაცემები მიუწვდომელი იქნება"
+
+#: pg_backup_archiver.c:3896
+#, c-format
+msgid "invalid creation date in header"
+msgstr "თავსართში არსებული შექმნის დრო არასწორია"
+
+#: pg_backup_archiver.c:4030
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "მუშავდება ელემენტი %d %s %s"
+
+#: pg_backup_archiver.c:4109
+#, c-format
+msgid "entering main parallel loop"
+msgstr "მთავარი პარალელური მარყუჟის დასაწყისი"
+
+#: pg_backup_archiver.c:4120
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "ელემენტის გამოტოვება %d %s %s"
+
+#: pg_backup_archiver.c:4129
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "ელემენტის გაშვება %d %s %s"
+
+#: pg_backup_archiver.c:4183
+#, c-format
+msgid "finished main parallel loop"
+msgstr "მთავარი პარალელური მარყუჟის დასასრული"
+
+#: pg_backup_archiver.c:4219
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "გამორჩენილი ჩანაწერის დამუშავება %d %s %s"
+
+#: pg_backup_archiver.c:4824
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "ცხრილის (%s) შექმნა შეუძლებელია. მონაცემების აღდგენა არ მოხდება"
+
+#: pg_backup_custom.c:376 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "დიდი ობიექტის არასწორი OID"
+
+#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629
+#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021
+#, c-format
+msgid "error during file seek: %m"
+msgstr "ფაილში გადახვევის პრობლემა: %m"
+
+#: pg_backup_custom.c:478
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "მონაცემების ბლოკს (%d) არასწორი გადახვევის მდებარეობა გააჩნია"
+
+#: pg_backup_custom.c:495
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "არქივის ძებნისას მონაცემების ბლოკის ტიპი (%d) არასწორია"
+
+#: pg_backup_custom.c:517
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "არქივში ბლოკის ID-ის (%d) პოვნა შეუძლებელია -- შეიძლება დაულაგებელი აღდგენის მოთხოვნის გამო, რომელიც არ შეიძლება დამუშავდეს გადაუხვევადი შეტანის ფაილის გამო"
+
+#: pg_backup_custom.c:522
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "არქივში ბლოკის ID -ის (%d) პოვნის შეცდომა -- შეიძლება არქივი დაზიანებულია"
+
+#: pg_backup_custom.c:529
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "მონაცემების კითხვისას ვიპოვე მოულოდნელი ბლოკის ID (%d) -- მოველოდი: %d"
+
+#: pg_backup_custom.c:543
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "უცნობი მონაცემის ბლოკის ტიპი %d არქივის აღდგენისას"
+
+#: pg_backup_custom.c:645
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "შემოსატანი ფაილის წაკითხვის შეცდომა: %m"
+
+#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943
+#: pg_backup_tar.c:1019
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "არქივის ფაილში გადახვევის მდებარეობის დადგენის შეცდომა: %m"
+
+#: pg_backup_custom.c:762 pg_backup_custom.c:802
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "არქივის ფაილის დახურვის შეცდომა: %m"
+
+#: pg_backup_custom.c:785
+#, c-format
+msgid "can only reopen input archives"
+msgstr "შეყვანილი არქივების თავიდან გახსნის შეცდომა"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "სტანდარტული შეტანიდან პარალელური აღდგენის მხარდაჭერა არ არსებობს"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "გადაუხვევადი ფაილიდან პარალელური აღდგენის მხარდაჭერა არ არსებობს"
+
+#: pg_backup_custom.c:810
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "არქივის ფაილში გადახვევის შეცდომა:%m"
+
+#: pg_backup_custom.c:889
+#, c-format
+msgid "compressor active"
+msgstr "შემკუმშველი აქტიურია"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "libpq-დან server_version-ის მიღების შეცდომა"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1646
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "ოპერაცია გაუქმდა სერვერის ვერსიის შეუთავსებლობის გამო"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1647
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "სერვერის ვერსია: %s; %s ვერსია: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "ბაზასთან მიერთება უკვე არსებობს"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595
+msgid "Password: "
+msgstr "პაროლი: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "ბაზასთან მიერთების შეცდომა"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "თავიდან მიერთების შეცდომა: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1520 pg_dumpall.c:1604
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732
+#, c-format
+msgid "query failed: %s"
+msgstr "მოთხოვნის შეცდომა: %s"
+
+#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733
+#, c-format
+msgid "Query was: %s"
+msgstr "მოთხოვნის შინაარსი: %s"
+
+#: pg_backup_db.c:316
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "მოთხოვნამ %d მწკრივი დააბრუნა, ერთის მაგიერ: %s"
+msgstr[1] "მოთხოვნამ %d მწკრივი დააბრუნა, ერთის მაგიერ: %s"
+
+#: pg_backup_db.c:352
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sბრძანება იყო: %s"
+
+#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489
+msgid "could not execute query"
+msgstr "მოთხოვნის შესრულების შეცდომა"
+
+#: pg_backup_db.c:461
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "\"PQputCopyData\"-ის მიერ დაბრუნებული შეცდომა: %s"
+
+#: pg_backup_db.c:510
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "\"PQputCopyEnd\"-ის მიერ დაბრუნებული შეცდომა: %s"
+
+#: pg_backup_db.c:516
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY-ის შეცდომა ცხრილისთვის \"%s\": %s"
+
+#: pg_backup_db.c:522 pg_dump.c:2106
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "მოულოდნელი დამატებითი შედეგები COPY-ის დროს ცხრილისთვის \"%s\""
+
+#: pg_backup_db.c:534
+msgid "could not start database transaction"
+msgstr "ბაზის ტრანზაქციის დაწყების შეცდომა"
+
+#: pg_backup_db.c:542
+msgid "could not commit database transaction"
+msgstr "ბაზის ტრანზაქციის გადაცემის შეცდომა"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "გამოტანის საქაღალდე მითითებული არაა"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "საქაღალდის (%s) წაკითხვის შეცდომა: %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "საქაღალდის %s-ზე დახურვის შეცდომა: %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "საქაღალდის (%s) შექმნის შეცდომა: %m"
+
+#: pg_backup_directory.c:355 pg_backup_directory.c:497
+#: pg_backup_directory.c:533
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "გამოსატან ფაილში ჩაწერის შეცდომა: %s"
+
+#: pg_backup_directory.c:373
+#, c-format
+msgid "could not close data file: %m"
+msgstr "მონაცემების ფაილის დახურვის შეცდომა: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "მონაცემების ფაილის (%s) დახურვის შეცდომა: %m"
+
+#: pg_backup_directory.c:447
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "დიდი ობიექტის სარჩევის ფაილის %s წასაკითხად გახსნის შეცდომა: %m"
+
+#: pg_backup_directory.c:458
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "არასწორი ხაზი დიდი ობიექტის ცხრილის ფაილში \"%s\": %s"
+
+#: pg_backup_directory.c:467
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "დიდი ობიექტის სარჩევის ფაილის წაკითხვის შეცდომა: %s"
+
+#: pg_backup_directory.c:471
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "დიდი ობიექტის სარჩევის ფაილის (%s) დახურვის შეცდომა: %m"
+
+#: pg_backup_directory.c:685
+#, c-format
+msgid "could not close blob data file: %m"
+msgstr "ბლობის ფაილის დახურვის შეცდომა: %m"
+
+#: pg_backup_directory.c:691
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "ბლობების შინაარსის ფაილის ჩაწერის შეცდომა"
+
+#: pg_backup_directory.c:705
+#, c-format
+msgid "could not close blobs TOC file: %m"
+msgstr "ბლობების შინაარსის ფაილის დახურვის შეცდომა: %m"
+
+#: pg_backup_directory.c:724
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "%s: ფაილის სახელი ძალიან გრძელია"
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "ფორმატის წაკითხვის შეცდომა"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "შინაარსის ფაილის (%s) გახსნის შეცდომა გამოტანისთვის: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "შინაარსის ფაილის გახსნის შეცდომა გამოტანისთვის: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:893
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "tar ფაილის ფორმატს შეკუმშვის მხარდაჭერა არ გააჩნია"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "შინაარსის ფაილის (\"%s\") შესაყვანად გახსნის პრობლემა: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "შინაარსის ფაილის გახსნის შეცდომა: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "არქივში ფაილის პოვნა შეუძლებელია: %s"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "დროებითი ფაილის სახელის გენერაციის პრობლემა: %m"
+
+#: pg_backup_tar.c:624
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "\"COPY ოპერატორის მოულოდნელი სინტაქსი: %s"
+
+#: pg_backup_tar.c:890
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "დიდი ობიექტის არასწორი OID: %u"
+
+#: pg_backup_tar.c:1035
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "დროებითი ფაილის დახურვის პრობლემა: %m"
+
+#: pg_backup_tar.c:1038
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "ფაილის რეალური სიგრძე (%lld) არ ემთხვევა მოსალოდნელს (%lld)"
+
+#: pg_backup_tar.c:1084 pg_backup_tar.c:1115
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "არქივში თავსართი ფაილისთვის \"%s\" ვერ ვიპოვე"
+
+#: pg_backup_tar.c:1102
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "დაულაგებელი მონაცემების აღდგენა მხარდაჭერელია არქივის ამ ფორმატში: \"%s\" აუცილებელია, მაგრამ ის არქივის ფაილში \"%s\"-მდეა."
+
+#: pg_backup_tar.c:1149
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "tar ფაილის თავსართი არასრულია (%lu ბაიტი)"
+msgstr[1] "tar ფაილის თავსართი არასრულია (%lu ბაიტი)"
+
+#: pg_backup_tar.c:1188
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "%s-ში ნაპოვნია დაზიანებული თავსართი (მოველოდი %d, გამოთვლილია %d) ფაილის პოზიციაზე %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "სექციის უცნობი სახელი: %s"
+
+#: pg_backup_utils.c:55 pg_dump.c:628 pg_dump.c:645 pg_dumpall.c:340
+#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373
+#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "on_exit_nicely ტიპის სლოტები აღარ დარჩა"
+
+#: pg_dump.c:643 pg_dumpall.c:348 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")"
+
+#: pg_dump.c:662 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "პარამეტრები -s/--schema-only და -a/--data-only ერთად ვერ გამოიყენება"
+
+#: pg_dump.c:665
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "პარამეტრები -s/--schema-only და --include-foreign-data ერთად ვერ გამოიყენება"
+
+#: pg_dump.c:668
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "პარამეტრი --include-foreign-data მხარდაუჭერელია პარალელური მარქაფისას"
+
+#: pg_dump.c:671 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "პარამეტრები -c/--clean და -a/--data-only ერთად ვერ გამოიყენება"
+
+#: pg_dump.c:674 pg_dumpall.c:378 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "--if-exists -ს -c/--clean პარამეტრი ესაჭიროება"
+
+#: pg_dump.c:681
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "--on-conflict-do-nothing -ს --inserts, --rows-per-insert ან --column-inserts ესაჭიროება"
+
+#: pg_dump.c:703
+#, c-format
+msgid "requested compression not available in this installation -- archive will be uncompressed"
+msgstr "მოთხოვნილი შეკუმშვა ამ აგებაში მხარდაუჭერელია. -- არქივი შეუკუმშავი იქნება"
+
+#: pg_dump.c:716
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "პარალელური მარქაფი მხოლოდ საქაღალდის რეჟიმშია მხარდაჭერილი"
+
+#: pg_dump.c:762
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "ბოლო ჩაშენებული OID %u"
+
+#: pg_dump.c:771
+#, c-format
+msgid "no matching schemas were found"
+msgstr "შესაბამისი სქემები ნაპოვნი არაა"
+
+#: pg_dump.c:785
+#, c-format
+msgid "no matching tables were found"
+msgstr "შესაბამისი ცხრილები ნაპოვნი არაა"
+
+#: pg_dump.c:807
+#, c-format
+msgid "no matching extensions were found"
+msgstr "შესაბამისი გაფართოებები ნაპოვნი არაა"
+
+#: pg_dump.c:990
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s მონაცემთა ბაზას გამოიტანს, როგორც ტექსტურ ფაილს ან სხვა ფორმატებს.\n"
+"\n"
+
+#: pg_dump.c:991 pg_dumpall.c:605 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "გამოყენება:\n"
+
+#: pg_dump.c:992
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [პარამეტრი]... [ბაზისსახელი]\n"
+
+#: pg_dump.c:994 pg_dumpall.c:608 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"ზოგადი პარამეტრები:\n"
+
+#: pg_dump.c:995
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=FILENAME გამოტანის ფაილის სახელი\n"
+
+#: pg_dump.c:996
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p გამოტანის ფაილის ფორმატი (custom, directory, tar\n"
+" უბრალო ტექსტი (ნაგულისხმები))\n"
+
+#: pg_dump.c:998
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM მითითებული რაოდენობის პარალელური დავალების გაშვება\n"
+
+#: pg_dump.c:999 pg_dumpall.c:610
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose დამატებითი ინფორმაციის გამოტანა\n"
+
+#: pg_dump.c:1000 pg_dumpall.c:611
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: pg_dump.c:1001
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 შეკუმშვის დონე\n"
+
+#: pg_dump.c:1002 pg_dumpall.c:612
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=TIMEOUT ცხრილის დაბლოკვისას TIMEOUT ის შემდეგ შეცდომის გამოგდება\n"
+
+#: pg_dump.c:1003 pg_dumpall.c:639
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync არ დაველოდო ცვლილებების დისკზე უსაფრთხოდ ჩაწერას\n"
+
+#: pg_dump.c:1004 pg_dumpall.c:613
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: pg_dump.c:1006 pg_dumpall.c:614
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"პარამეტრები, რომლებიც აკონტროლებენ გამოტანას:\n"
+
+#: pg_dump.c:1007 pg_dumpall.c:615
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only გამოტანილი იქნება მხოლოდ მონაცემები, სქემის გარეშე\n"
+
+#: pg_dump.c:1008
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs გამოტანილი იქნება დიდი ობიექტებიც\n"
+
+#: pg_dump.c:1009
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs დიდი ობიექტები გამოტანილი არ იქნება\n"
+
+#: pg_dump.c:1010 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean ბაზის ობიექტების წაშლა თავიდან შექმნამდე\n"
+
+#: pg_dump.c:1011
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create გამოტანილში ბაზის შექმნის ბრძანებების მიყოლება\n"
+
+#: pg_dump.c:1012
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATTERN მხოლოდ მითითებული გაფართოებების გამოტანა\n"
+
+#: pg_dump.c:1013 pg_dumpall.c:617
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=ENCODING მხოლოდ მითითებული კოდირების მქონე მონაცემების გამოტანა\n"
+
+#: pg_dump.c:1014
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=PATTERN მხოლოდ მითითებული სქემების გამოტანა\n"
+
+#: pg_dump.c:1015
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATTERN მითითებული სქემები გამოტანილი არ იქნება\n"
+
+#: pg_dump.c:1016
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner უბრალო ტექსტურ ფორმატში ობიექტების მფლობელობის \n"
+" აღდგენის გამოტოვება\n"
+
+#: pg_dump.c:1018 pg_dumpall.c:621
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only აღდგება მხოლოდ სქემები, მონაცემები კი არა\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAME უბრალო ტექსტურ ფაილში გამოტანისას გამოყენებული ზემომხმარებლის სახელი\n"
+
+#: pg_dump.c:1020
+#, c-format
+msgid " -t, --table=PATTERN dump the specified table(s) only\n"
+msgstr " -t, --table=PATTERN მხოლოდ მითითებული ცხრილების გამოტანა\n"
+
+#: pg_dump.c:1021
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATTERN მითითებული ცხრილები გამოტანილი არ იქნება\n"
+
+#: pg_dump.c:1022 pg_dumpall.c:624
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges პრივილეგიები (dump/revoke) გამოტანილი არ იქნება\n"
+
+#: pg_dump.c:1023 pg_dumpall.c:625
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade გამოიყენება მხოლოდ განახლების პროგრამების მიერ\n"
+
+#: pg_dump.c:1024 pg_dumpall.c:626
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts მონაცემების დამპი ისე, როგორც ბრძანება INSERT, სვეტების სახელებით\n"
+
+#: pg_dump.c:1025 pg_dumpall.c:627
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr " --disable-dollar-quoting დოლარით ციტირების გამორთვა. სტანდარტული SQL ციტირების გამოყენება\n"
+
+#: pg_dump.c:1026 pg_dumpall.c:628 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers მხოლოდ მონაცემების აღდგენისას ტრიგერების გამორთვა\n"
+
+#: pg_dump.c:1027
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security მწკრივების უსაფრთხოების ჩართვა (მხოლოდ იმ მონაცემების დამპი, \n"
+" რაზეც მომხმარებელს წვდომა გააჩნია)\n"
+
+#: pg_dump.c:1029
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " -T, --exclude-table=შაბლონი შაბლონით მითითებული ცხრილები\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:630
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM extra_float_digits-ის ნაგულისხმები პარამეტრის გადაფარვა\n"
+
+#: pg_dump.c:1031 pg_dumpall.c:631 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists ობიექტების გადაყრისას IF EXISTS -ის გამოყენება\n"
+
+#: pg_dump.c:1032
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=შაბლონი\n"
+" მონაცემების ჩასმა უცხო სერვერებზე მდებარე , უცხო ცხრილებიდან, რომლებიც\n"
+" შაბლონს ემთხვევა\n"
+
+#: pg_dump.c:1035 pg_dumpall.c:632
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts მონაცემების დამპი INSERT ბრძანებების მსგავსად, COPY-ის მაგიერ\n"
+
+#: pg_dump.c:1036 pg_dumpall.c:633
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root დანაყოფების root ცხრილს გავლით ჩატვირთვა\n"
+
+#: pg_dump.c:1037 pg_dumpall.c:634
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments კომენტარების გარეშე\n"
+
+#: pg_dump.c:1038 pg_dumpall.c:635
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications გამოცემების გარეშე\n"
+
+#: pg_dump.c:1039 pg_dumpall.c:637
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels უსაფრთხოების ჭდეების მინიჭებების გარეშე\n"
+
+#: pg_dump.c:1040 pg_dumpall.c:638
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions გამოწერების გარეშე\n"
+
+#: pg_dump.c:1041 pg_dumpall.c:640
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method ცხრილის წვდომის მეთოდები\n"
+
+#: pg_dump.c:1042 pg_dumpall.c:641
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces ცხრილის სივრცის მინიჭებები\n"
+
+#: pg_dump.c:1043 pg_dumpall.c:642
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression TOAST-ის შეკუმშვის მეთოდები დამპში არ ჩაიწერება\n"
+
+#: pg_dump.c:1044 pg_dumpall.c:643
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data ის ცხრილები, რომლებსაც ჟურნალი არ აქვთ, დამპში არ ჩაიწერება\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:644
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing INSERT ბრძანებებისთვის ON CONFLICT DO NOTHING -ის დამატება\n"
+
+#: pg_dump.c:1046 pg_dumpall.c:645
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr " --quote-all-identifiers ყველა იდენტიფიკატორის ციტირება. მაშინაც კი, თუ ისინი საკვანძო სიტყვები არაა\n"
+
+#: pg_dump.c:1047 pg_dumpall.c:646
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS მწკრივების რიცხვი თითოეული INSERT-ისთვის ; ასევე მიუთითებს --inserts\n"
+
+#: pg_dump.c:1048
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=სექცია მითითებული სექცია (pre-data, data, ან post-data)\n"
+
+#: pg_dump.c:1049
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable მოცდა, სანამ დამპის გაშვება ანომალიების გარეშე იქნება შესაძლებელი\n"
+
+#: pg_dump.c:1050
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT დამპისთვის მითითებული სწრაფი ასლის გამოყენება\n"
+
+#: pg_dump.c:1051 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names მოთხოვნა, რომ ცხრილი ან/და სქემა შეიცავდეს შაბლონებს, რომლებიც\n"
+" ერთ ელემენტს მაინც ემთხვევა\n"
+
+#: pg_dump.c:1053 pg_dumpall.c:647 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" მფლობელობის დასაყენებლად ALTER OWNER ბრძანებების მაგიერ\n"
+" SET SESSION AUTHORIZATION -ის გამოყენება\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:651 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"შეერთების პარამეტრები:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=ბაზისსახელი მონაცემთა ბაზის სახელი\n"
+
+#: pg_dump.c:1059 pg_dumpall.c:653 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME მონაცემთა ბაზის სერვერის ჰოსტის ან სოკეტის საქაღალდე\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:655 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT მონაცემთა ბაზის სერვერის პორტი\n"
+
+#: pg_dump.c:1061 pg_dumpall.c:656 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=მომხმარებელი ბაზის მომხმარებლის სახელი\n"
+
+#: pg_dump.c:1062 pg_dumpall.c:657 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password არასოდეს მკითხო პაროლი\n"
+
+#: pg_dump.c:1063 pg_dumpall.c:658 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password პაროლის ყოველთვის კითხვა (ავტომატურად უნდა ხდებოდეს)\n"
+
+#: pg_dump.c:1064 pg_dumpall.c:659
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLENAME აღდგენამდე SET ROLE -ის გაშვება\n"
+
+#: pg_dump.c:1066
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"თუ ბაზისსახელი მითითებული არაა, მაშინ PGDATABASE გარემოს\n"
+"ცვლადი გამოიყენება.\n"
+"\n"
+
+#: pg_dump.c:1068 pg_dumpall.c:663 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "შეცდომების შესახებ მიწერეთ: <%s>\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:664 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
+
+#: pg_dump.c:1088 pg_dumpall.c:488
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "კლიენტის მითითებული კოდირება არასწორია: %s"
+
+#: pg_dump.c:1226
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "სერვერის ამ ვერსიაში უქმე სერვერებიდან პარალელური დამპი მხარდაჭერილი არაა"
+
+#: pg_dump.c:1291
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "გამოტანის მითითებული ფორმატი არასწორია: %s"
+
+#: pg_dump.c:1332 pg_dump.c:1388 pg_dump.c:1441 pg_dumpall.c:1282
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "არასწორი სრული სახელი (ძალიან ბევრი წერტილიანი სახელი): %s"
+
+#: pg_dump.c:1340
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "შესაბამისი სქემა შაბლონისთვის \"%s\" ვერ ვიპოვე"
+
+#: pg_dump.c:1393
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "შესაბამისი გაფართოება შაბლონისთვის \"%s\" ვერ ვიპოვე"
+
+#: pg_dump.c:1446
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "შესაბამისი უცხო სერვერი შაბლონისთვის \"%s\" ვერ ვიპოვე"
+
+#: pg_dump.c:1509
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "ურთიერთობის არასწორი სახელი (ძალიან ბევრი წერტილიანი სახელი): %s"
+
+#: pg_dump.c:1520
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "შესაბამისი ცხრილი შაბლონისთვის \"%s\" ვერ ვიპოვე"
+
+#: pg_dump.c:1547
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "ამჟამად მონაცემთა ბაზასთან მიერთებული არ ბრძანდებით."
+
+#: pg_dump.c:1550
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "ბაზებს შორის ბმულები განხორციელებული არაა: %s"
+
+#: pg_dump.c:1981
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "ცხრილის შემცველობის გამოტანა: \"%s.%s\""
+
+#: pg_dump.c:2087
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "ცხრილის (\"%s\") დამპის შეცდომა: PQgetCopyData() failed."
+
+#: pg_dump.c:2088 pg_dump.c:2098
+#, c-format
+msgid "Error message from server: %s"
+msgstr "შეცდომა სერვერიდან: %s"
+
+#: pg_dump.c:2089 pg_dump.c:2099
+#, c-format
+msgid "Command was: %s"
+msgstr "ბრძანება იყო: %s"
+
+#: pg_dump.c:2097
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "ცხრილის (\"%s\") დამპის შეცდომა: PQgetResult() failed."
+
+#: pg_dump.c:2179
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "ცხრილიდან \"%s\" მიღებულია ველების არასწორი რაოდენობა"
+
+#: pg_dump.c:2875
+#, c-format
+msgid "saving database definition"
+msgstr "ბაზის აღწერის შენახვა"
+
+#: pg_dump.c:2971
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "ენის უცნობი მომწოდებელი: %s"
+
+#: pg_dump.c:3317
+#, c-format
+msgid "saving encoding = %s"
+msgstr "კოდირების შენახვა = %s"
+
+#: pg_dump.c:3342
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "შენახვა: standard_conforming_strings = %s"
+
+#: pg_dump.c:3381
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "current_schemas() -ის შედეგის დამუშავების შეცდომა"
+
+#: pg_dump.c:3400
+#, c-format
+msgid "saving search_path = %s"
+msgstr "შენახვა: search_path = %s"
+
+#: pg_dump.c:3438
+#, c-format
+msgid "reading large objects"
+msgstr "დიდი ობიექტების კითხვა"
+
+#: pg_dump.c:3576
+#, c-format
+msgid "saving large objects"
+msgstr "დიდი ობიექტების შენახვა"
+
+#: pg_dump.c:3617
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "დიდი ობიექტის (%u) წაკითხვის შეცდომა: %s"
+
+#: pg_dump.c:3723
+#, c-format
+msgid "reading row-level security policies"
+msgstr "მწკრივის დონის უსაფრთხოების წესების წაკითხვა"
+
+#: pg_dump.c:3864
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "წესების ბრძანების მოულოდნელი ტიპი: %c"
+
+#: pg_dump.c:4314 pg_dump.c:4632 pg_dump.c:11835 pg_dump.c:17724
+#: pg_dump.c:17726 pg_dump.c:18347
+#, c-format
+msgid "could not parse %s array"
+msgstr "მასივის დამუშავების შეცდომა: %s"
+
+#: pg_dump.c:4500
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "გამოწერები დამპში არ ჩაწერილა. მიმდინარე მომხმარებელი ზემომხმარებელი არაა"
+
+#: pg_dump.c:5014
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "%s-სთვის მშობელი გაფართოება ვერ ვიპოვე %s"
+
+#: pg_dump.c:5159
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "სქემა OID-ით %u არ არსებობს"
+
+#: pg_dump.c:6615 pg_dump.c:16988
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "სისწორის შემოწმების შეცდომა. მშობელი ცხრილი OID-ით %u მიმდევრობიდან OID-ით %u არ არსებობს"
+
+#: pg_dump.c:6758
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "სისწორის შემოწმების შეცდომა. pg_parttioned_table-ში მოხსენიებული ცხრილი OID-ით %u ვერ ვიპოვე"
+
+#: pg_dump.c:6989 pg_dump.c:7256 pg_dump.c:7727 pg_dump.c:8394 pg_dump.c:8515
+#: pg_dump.c:8669
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "ცხრილის უცნობი OID: %u"
+
+#: pg_dump.c:6993
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "მოულოდნელი ინდექსის მონაცემები ცხრილისთვის \"%s\""
+
+#: pg_dump.c:7488
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "სისწორის შემოწმების შეცდომა. მშობელი ცხრილი OID-ით %u pg_rewrite-ის ელემენტიდან OID-ით %u ვერ ვიპოვე"
+
+#: pg_dump.c:7779
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "მოთხოვნის შედეგია ნულოვანი ბმის ცხრილის სახელის უცხო გასაღების ტრიგერი \"%s\" ცხრილზე \"%s\" (ცხრილის OID: %u)"
+
+#: pg_dump.c:8398
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "სვეტის მოულოდნელი მონაცემები ცხრილისთვის %s"
+
+#: pg_dump.c:8428
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "ცხრილში \"%s\" სვეტები არასწორადაა დანომრილი"
+
+#: pg_dump.c:8477
+#, c-format
+msgid "finding table default expressions"
+msgstr "ვეძებ ცხრილის ნაგულისხმებ გამოსახულებებს"
+
+#: pg_dump.c:8519
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "adnum -ის არასწორი მნიშვნელობა %d ცხრილისთვის \"%s\""
+
+#: pg_dump.c:8619
+#, c-format
+msgid "finding table check constraints"
+msgstr "ვეძებ ცხრილის შემოწმების შეზღუდვებს"
+
+#: pg_dump.c:8673
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "მოველოდი %d შემოწმების შეზღუდვას ცხრილზე \"%s\", მაგრამ %d"
+msgstr[1] "მოველოდი %d შემოწმების შეზღუდვას ცხრილზე \"%s\", მაგრამ %d"
+
+#: pg_dump.c:8677
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "სისტემის კატალოგი შეიძლება დაზიანებულია."
+
+#: pg_dump.c:9367
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "როლი OID-ით %u არ არსებობს"
+
+#: pg_dump.c:9479 pg_dump.c:9508
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "pg_init_privs -ის არასწორი ჩანაწერი: %u %u %d"
+
+#: pg_dump.c:10329
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "მონაცემის ტიპი %s-ის typetype თურმე არასორია"
+
+#: pg_dump.c:11904
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "უცნობი provolatile მნიშვნელობა ფუნქციისთვის \"%s\""
+
+#: pg_dump.c:11954 pg_dump.c:13817
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "უცნობი proparallel მნიშვნელობა ფუნქციისთვის \"%s\""
+
+#: pg_dump.c:12086 pg_dump.c:12192 pg_dump.c:12199
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "ფუნქციის აღწერა ფუნქციისთვის OID-ით %u ვერ ვიპოვე"
+
+#: pg_dump.c:12125
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "pg_cast.castfunc ან pg_cast.castmethod ველების არასწორი მნიშვნელობა"
+
+#: pg_dump.c:12128
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "pg_cast.castmethod ველის არასწორი მნიშვნელობა"
+
+#: pg_dump.c:12218
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "არასწორი გარდაქმნის აღწერა. ერთ-ერთი, trffromsql ან trftosql ნულს არ უნდა უდრიდეს"
+
+#: pg_dump.c:12235
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "pg_transform.trffromsql ველის არასწორი მნიშვნელობა"
+
+#: pg_dump.c:12256
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "pg_transform.trftosql ველის არასწორი მნიშვნელობა"
+
+#: pg_dump.c:12401
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "postfix ოპერატორები მხარდაჭერილი აღარაა (ოპერატორი \"%s\")"
+
+#: pg_dump.c:12571
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "ოპერატორი OID-ით %s არ არსებობს"
+
+#: pg_dump.c:12639
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "წვდომის მეთოდის (%2$s) არასწორი ტიპი: %1$c"
+
+#: pg_dump.c:13293
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "კოლაციის უცნობი მომწოდებელი: %s"
+
+#: pg_dump.c:13302 pg_dump.c:13311 pg_dump.c:13321 pg_dump.c:13330
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "არასწორი კოლაცია \"%s\""
+
+#: pg_dump.c:13346
+#, c-format
+msgid "unrecognized collation provider '%c'"
+msgstr "კოლაციის უცნობი მომწოდებელი '%c'"
+
+#: pg_dump.c:13736
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "აგრეგატის (%s) aggfinalmodify -ის უცნობი ტიპი"
+
+#: pg_dump.c:13792
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "აგრეგატის (%s) aggmfinalmodify -ის უცნობი ტიპი"
+
+#: pg_dump.c:14510
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "ნაგულისხმებ პრივილეგიებში არსებული ობიექტის უცნობი ტიპი: %d"
+
+#: pg_dump.c:14526
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "ნაგულიხმები ACL სიის ანალიზი შეუძლებელია: %s"
+
+#: pg_dump.c:14608
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "საწყისი ACL სიის (%s) დამუშავების შეცდომა ან ნაგულისხმები (%s) ობიექტისთვის \"%s\" (%s)"
+
+#: pg_dump.c:14633
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "შეცდომა ACL სიის (%s) დამუშავებისას ან ნაგულისხმები (%s) ობიექტისთვის \"%s\" (%s)"
+
+#: pg_dump.c:15171
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "ხედის (%s) აღწერის გამოთხოვამ მონაცემები არ დააბრუნა"
+
+#: pg_dump.c:15174
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "ხედის (%s) აღწერის გამოთხოვამ ერთზე მეტი აღწერა დააბრუნა"
+
+#: pg_dump.c:15181
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "ხედის (%s) აღწერა, როგორც ჩანს, ცარიელია (ნულოვანი სიგრძე)"
+
+#: pg_dump.c:15265
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS-ები უკვე მხარდაუჭერელია (ცხრილი \"%s\")"
+
+#: pg_dump.c:16194
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "სვეტების არასწორი რიცხვი %d ცხრილისთვის %s"
+
+#: pg_dump.c:16272
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "ინდექსის სტატისტიკის სვეტების დამუშავების შეცდომა"
+
+#: pg_dump.c:16274
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "ინდექსის სტატისტიკის მნიშვნელობების დამუშავების შეცდომა"
+
+#: pg_dump.c:16276
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "ინდექსის სტატისტიკისთვის სვეტებისა და მნიშვნელობების რაოდენობა არ ემთხვევა"
+
+#: pg_dump.c:16494
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "შეზღუდვას ინდექსი აკლია: \"%s\""
+
+#: pg_dump.c:16722
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "შეზღუდვის უცნობი ტიპი: %c"
+
+#: pg_dump.c:16823 pg_dump.c:17052
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "მოთხოვნამ, რომელსაც მონაცემები მიმდევრობიდან (%s) უნდა მიეღო, %d მწკრივი დააბრუნა. (მოველოდი: 1)"
+msgstr[1] "მოთხოვნამ, რომელსაც მონაცემები მიმდევრობიდან (%s) უნდა მიეღო, %d მწკრივი დააბრუნა. (მოველოდი: 1)"
+
+#: pg_dump.c:16855
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "მიმდევრობის უცნობი ტიპი: %s"
+
+#: pg_dump.c:17144
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "tgtype -ის არასწორი მნიშვნელობა: %d"
+
+#: pg_dump.c:17216
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "არასწორი არგუმენტის სტრიქონი (%s) ტრიგერისთვის \"%s\" ცხრილზე \"%s\""
+
+#: pg_dump.c:17485
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "მოთხოვნის შეცდომა, რომელსაც ცხრილისთვის \"%2$s\" წესი \"%1$s\" უნდა მიეღო: დაბრუნებულია მწკრივების არასწორი რაოდენობა"
+
+#: pg_dump.c:17638
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "მიბმული გაფართოება (%u) ვერ ვიპოვე"
+
+#: pg_dump.c:17728
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "კონფიგურაციებისა და პირობების რაოდენობა გაფართოებისთვის არ ემთხვევა"
+
+#: pg_dump.c:17860
+#, c-format
+msgid "reading dependency data"
+msgstr "დამოკიდებულების მონაცემების კითხვა"
+
+#: pg_dump.c:17946
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "მიბმადი ობიექტის გარეშე %u %u"
+
+#: pg_dump.c:17957
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "მიბმული ობიექტის გარეშე %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "არასწორი dumpId %d"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "არასწორი დამოკიდებულება %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "დამოკიდებულებების მარყუჟები ნაპოვნი არაა"
+
+#: pg_dump_sort.c:1276
+#, c-format
+msgid "there are circular foreign-key constraints on this table:"
+msgid_plural "there are circular foreign-key constraints among these tables:"
+msgstr[0] "ცხრილები, რომლებშიც აღმოჩენილია წრიული გარე-გასაღების შეზღუდვები:"
+msgstr[1] "ცხრილები, რომლებშიც აღმოჩენილია წრიული გარე-გასაღების შეზღუდვები:"
+
+#: pg_dump_sort.c:1281
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "შეიძლება დამპის აღდგენა --disable-trigger-ების გამორთვის ან დროებით შეზღუდვების გადაყრის გარეშე ვერ შეძლოთ."
+
+#: pg_dump_sort.c:1282
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "ამ პრობლემის ასარიდებლად უმჯობესია --data-only -ის მაგიერ სრული დამპი აიღოთ."
+
+#: pg_dump_sort.c:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "ამ ელემენტებს შორის დამოკიდებულებების მარყუჟის ამოხსნა შეუძლებელია:"
+
+#: pg_dumpall.c:205
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "პროგრამა \"%s\" სჭირდება \"%s\"-ს, მაგრამ იგივე საქაღალდეში, სადაც \"%s\", ნაპოვნი არაა"
+
+#: pg_dumpall.c:208
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "პროგრამა „%s“ ნაპოვნია „%s“-ის მიერ, მაგრამ ვერსია, იგივეა არაა, რაც %s"
+
+#: pg_dumpall.c:357
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "პარამეტრი --exclude-database არ შეიძლება -g/--globals-only, -r/--roles-only, და -t/--tablespaces-only -სთან ერთად იყოს გამოყენებული"
+
+#: pg_dumpall.c:365
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "პარამეტრები -g/--globals-only და -r/--roles-only ერთად ვერ გამოიყენება"
+
+#: pg_dumpall.c:372
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "პარამეტრები -g/--globals-only და -t/--tablespaces-only ერთად ვერ გამოიყენება"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "პარამეტრები -r/--roles-only და -t/--tablespaces-only ერთად ვერ გამოიყენება"
+
+#: pg_dumpall.c:444 pg_dumpall.c:1587
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "მონაცემთა ბაზასთან დაკავშირება ვერ მოხერხდა \"%s\""
+
+#: pg_dumpall.c:456
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"ვერ დაუკავშირდა მონაცემთა ბაზებს \"postgres\" ან \"template1\"\n"
+"გთხოვთ მიუთითოთ ალტერნატიული მონაცემთა ბაზა."
+
+#: pg_dumpall.c:604
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s-ი PostgreSQL-ის ბაზის კლასტერს SQL სკრიპტის ფაილში გამოიტანს.\n"
+"\n"
+
+#: pg_dumpall.c:606
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [პარამეტრი]...\n"
+
+#: pg_dumpall.c:609
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=FILENAME გამოტანის ფაილის სახელი\n"
+
+#: pg_dumpall.c:616
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean ბაზის წაშლა თავიდან შექმნამდე\n"
+
+#: pg_dumpall.c:618
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only წაიშლება მხოლოდ გლობალური ობიექტები და არა ბაზები\n"
+
+#: pg_dumpall.c:619 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner ობიექტების მფლობელობის აღდგენის გამოტოვება\n"
+
+#: pg_dumpall.c:620
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only გამოიტანს მხოლოდ როლებს და არც ბაზებს და არც ცხრილების სივრცეებს\n"
+
+#: pg_dumpall.c:622
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NAME გამოსაყენებელი ზემომხმარებლის სახელი\n"
+
+#: pg_dumpall.c:623
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only გამოიტანს მხლოდ ცხრილების სივრცეებს და არც ბაზებს და არც როლებს\n"
+
+#: pg_dumpall.c:629
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=PATTERN გამორიცხავს ბაზებს, რომლებიც PATTERN-ს ემთხვევა\n"
+
+#: pg_dumpall.c:636
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords როლების პაროლები გამოტანილ არ იქნება\n"
+
+#: pg_dumpall.c:652
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONNSTR კავშირის სტრიქონი\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=ბაზისსახელი ალტერნატიული ბაზის სახელი)\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"თუ -f/--file არ გამოიყენება, SQL სკრიპტი \n"
+"სტანდარტულ გამოტანაზე იქნება გამოტანილი.\n"
+"\n"
+
+#: pg_dumpall.c:803
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "როლის სახელი, რომელიც \"pg_\"-ით იწყება, გამოტოვებულია (%s)"
+
+#: pg_dumpall.c:1018
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "ვერ გაანალიზდა ACL სია (%s) პარამეტრისთვის \"%s\""
+
+#: pg_dumpall.c:1136
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "შეცდომა ACL-ის სიის (%s) დამუშავებისთვის ცხრილის სივრცისთვის \"%s\""
+
+#: pg_dumpall.c:1343
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "გამოირიცხა ბაზა \"%s\""
+
+#: pg_dumpall.c:1347
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "დამპის გამოტანა ბაზისთვის \"%s\""
+
+#: pg_dumpall.c:1378
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump -ის შეცდომა ბაზაზე \"%s\". დასასრული"
+
+#: pg_dumpall.c:1384
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "გამოსატანი ფაილის თავიდან გახსნის შეცდომა \"%s\": %m"
+
+#: pg_dumpall.c:1425
+#, c-format
+msgid "running \"%s\""
+msgstr "%s -ის გაშვება"
+
+#: pg_dumpall.c:1630
+#, c-format
+msgid "could not get server version"
+msgstr "სერვერის ვერსიის მღების შეცდომა"
+
+#: pg_dumpall.c:1633
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "შერვერის ვერსიის დამუშავების შეცდომა: %s"
+
+#: pg_dumpall.c:1703 pg_dumpall.c:1726
+#, c-format
+msgid "executing %s"
+msgstr "%s -ის შესრულება"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "-d/--dbname და-f/--file -დან მხოლოდ ერთ-ერთის მითითება შეგიძლიათ"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "-d/--dbname და-f/--file ერთად არ გამოიყენება"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "-C/--create და -1/--single-transaction ერთად არ გამოიყენება"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "--single-transaction -ის მითითება ბევრ დავალებასთან ერთად შეუძლებელია"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "არქივის უცნობი ფორმატი \"%s\"; გთხოვთ მიუთითოთ \"გ\", \"დ\", ან \"t\""
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "აღდგენისას იგნორირებული შეცდომების რაოდენობა: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s აღადგენს PostgreSQL მონაცემთა ბაზას pg_dump მიერ შექმნილი არქივიდან.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [პარამეტრი]... [ფაილი]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=ბაზისსახელი მონაცემთა ბაზის სახელი\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FILENAME გამოტანის ფაილის სახელი(stdout-ზე გამოსატანად გამოიყენეთ \"-\")\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t მარქაფის ფაილის ფორმატი (ავტომატური უნდა იყოს)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list არქივის სარჩევის მიმოხილვის გამოტანა\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose დამატებითი ინფორმაციის გამოტანა\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"პარამეტრები, რომლებიც აკონტროლებენ გამოტანას:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only აღდგება მხოლოდ მონაცემები, სქემის გარეშე\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create სამიზნე ბაზის შექმნა\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error დაუყოვნებლივი გამოსვლა შეცდომის შემთხვევაში\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAME მითითებული სახელის მქონე ინდექსის აღდგენა\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM აღდგენისას მითითებული რაოდენობის პარალელური დავალების გაშვება\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=FILENAME გამოტანის ასარჩევად/დასალაგებლად მითითებული\n"
+" ფაილის შემცველობის გამოყენება\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME მხოლოდ მითითებული სქემის ობიექტების აღდგენა\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=სახელი მითითებული სახელის მქონე სქემაში ობიექტები არ აღდგება\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=სახელი(არგები) მითითებული სახელის მქონე ფუნქციის აღდგენა\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only აღდგება მხოლოდ სქემები, მონაცემები კი არა\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NAME ტრიგერების გამოსართავად გამოყენებული ზემომხმარებლის სახელი\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NAME მითითებული ურთიერთობის აღდგენა (ცხრილი, ხედი, და ა.შ.)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NAME მითითებული ტრიგერის აღდგენა \n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges წვდომის პრივილეგიების აღდგენის გამოტოვება (grant/revoke)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction აღდგენის ერთ ტრანზაქციად გაშვება\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security მწკრივების უსაფრთხოების ჩართვა\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments კომენტარები არ აღდგება\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables ცხრილების, რომლის შექმნა შეუძლებელია,\n"
+" მონაცემები არ აღდგება\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications გამოცემები არ აღდგება\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels უსაფრთხოების ჭდეები არ აღდგება\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions გამოწერები არ აღდგება\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method ცხრილის წვდომის მეთოდები არ აღდგება\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces ცხრილის სივრცის მინიჭებები არ აღდგება\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=სექცია მითითებული სექციის აღდგენა (pre-data, data, ან post-data)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME აღდგენამდე SET ROLE -ის გაშვება\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"შესაძლებელია პარამეტრების -I, -n, -N, -P, -t, -T, და --section ერთად და მრავალჯერ მითითება, მრავალი\n"
+"ობიექტის ამოსაღებად.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"თუ ფაილის სახელი მითითებული არაა, გამოყენებული იქნება სტანდარტული შეტანა.\n"
+"\n"
+
+#, c-format
+#~ msgid " %s"
+#~ msgstr " %s"
diff --git a/src/bin/pg_dump/po/ko.po b/src/bin/pg_dump/po/ko.po
new file mode 100644
index 0000000..51858f0
--- /dev/null
+++ b/src/bin/pg_dump/po/ko.po
@@ -0,0 +1,2773 @@
+# Korean message translation file for PostgreSQL pg_dump
+# Ioseph Kim <ioseph@uri.sarang.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:49+0000\n"
+"PO-Revision-Date: 2023-04-06 17:43+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean Team <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "상세정보: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "현재 디렉터리를 알 수 없음: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "잘못된 바이너리 파일 \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "\"%s\" 바이너리 파일을 읽을 수 없음"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "실행 할 \"%s\" 파일을 찾을 수 없음"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "\"%s\" 이름의 디렉터리로 이동할 수 없습니다: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "\"%s\" 심볼릭 링크 파일을 읽을 수 없음: %m"
+
+#: ../../common/exec.c:422 parallel.c:1611
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 실패: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "메모리 부족"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null 포인터를 중복할 수 없음 (내부 오류)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "명령을 실행할 수 없음"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "해당 명령어 없음"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "하위 프로세스가 종료되었음, 종료 코드 %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "0x%X 예외처리로 하위 프로세스가 종료되었음"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "하위 프로세스가 종료되었음, 시그널 %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "하위 프로세스가 종료되었음, 알수 없는 상태 %d"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "\"%s\" 값은 %s 옵션 값으로 유효하지 않음"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s 값은 %d부터 %d까지 지정할 수 있습니다."
+
+#: common.c:134
+#, c-format
+msgid "reading extensions"
+msgstr "확장 기능 읽는 중"
+
+#: common.c:137
+#, c-format
+msgid "identifying extension members"
+msgstr "확장 멤버를 식별 중"
+
+#: common.c:140
+#, c-format
+msgid "reading schemas"
+msgstr "스키마들을 읽는 중"
+
+#: common.c:149
+#, c-format
+msgid "reading user-defined tables"
+msgstr "사용자 정의 테이블들을 읽는 중"
+
+#: common.c:154
+#, c-format
+msgid "reading user-defined functions"
+msgstr "사용자 정의 함수들 읽는 중"
+
+#: common.c:158
+#, c-format
+msgid "reading user-defined types"
+msgstr "사용자 정의 자료형을 읽는 중"
+
+#: common.c:162
+#, c-format
+msgid "reading procedural languages"
+msgstr "프로시쥬얼 언어를 읽는 중"
+
+#: common.c:165
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "사용자 정의 집계 함수를 읽는 중"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined operators"
+msgstr "사용자 정의 연산자를 읽는 중"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "사용자 정의 접근 방법을 읽는 중"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "사용자 정의 연산자 클래스를 읽는 중"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "사용자 정의 연산자 부류들 읽는 중"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "사용자 정의 텍스트 검색 파서를 읽는 중"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "사용자 정의 텍스트 검색 템플릿을 읽는 중"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "사용자 정의 텍스트 검색 사전을 읽는 중"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "사용자 정의 텍스트 검색 구성을 읽는 중"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "사용자 정의 외부 데이터 래퍼를 읽는 중"
+
+#: common.c:195
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "사용자 정의 외부 서버를 읽는 중"
+
+#: common.c:198
+#, c-format
+msgid "reading default privileges"
+msgstr "기본 접근 권한 읽는 중"
+
+#: common.c:201
+#, c-format
+msgid "reading user-defined collations"
+msgstr "사용자 정의 글자 정렬(collation) 읽는 중"
+
+#: common.c:204
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "사용자 정의 인코딩 변환규칙을 읽는 중"
+
+#: common.c:207
+#, c-format
+msgid "reading type casts"
+msgstr "형변환자(type cast)들을 읽는 중"
+
+#: common.c:210
+#, c-format
+msgid "reading transforms"
+msgstr "변환자(transform) 읽는 중"
+
+#: common.c:213
+#, c-format
+msgid "reading table inheritance information"
+msgstr "테이블 상속 정보를 읽는 중"
+
+#: common.c:216
+#, c-format
+msgid "reading event triggers"
+msgstr "이벤트 트리거들을 읽는 중"
+
+#: common.c:220
+#, c-format
+msgid "finding extension tables"
+msgstr "확장 테이블을 찾는 중"
+
+#: common.c:224
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "상속 관계를 조사중"
+
+#: common.c:227
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "재미난 테이블들(interesting tables)을 위해 열 정보를 읽는 중"
+
+#: common.c:230
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "하위 테이블에서 상속된 열 구분중"
+
+#: common.c:233
+#, c-format
+msgid "reading partitioning data"
+msgstr "파티션 자료 읽는 중"
+
+#: common.c:236
+#, c-format
+msgid "reading indexes"
+msgstr "인덱스들을 읽는 중"
+
+#: common.c:239
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "하위 파티션 테이블에서 인덱스를 플래그 처리하는 중"
+
+#: common.c:242
+#, c-format
+msgid "reading extended statistics"
+msgstr "확장 통계들을 읽는 중"
+
+#: common.c:245
+#, c-format
+msgid "reading constraints"
+msgstr "제약 조건들을 읽는 중"
+
+#: common.c:248
+#, c-format
+msgid "reading triggers"
+msgstr "트리거들을 읽는 중"
+
+#: common.c:251
+#, c-format
+msgid "reading rewrite rules"
+msgstr "룰(rule) 읽는 중"
+
+#: common.c:254
+#, c-format
+msgid "reading policies"
+msgstr "정책 읽는 중"
+
+#: common.c:257
+#, c-format
+msgid "reading publications"
+msgstr "발행 정보를 읽는 중"
+
+#: common.c:260
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "테이블의 발행 맵버쉽을 읽는 중"
+
+#: common.c:263
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "스키마의 발행 맵버쉽을 읽을 중"
+
+#: common.c:266
+#, c-format
+msgid "reading subscriptions"
+msgstr "구독정보를 읽는 중"
+
+#: common.c:345
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "잘못된 부모 수: %d, 해당 테이블 \"%s\""
+
+#: common.c:1006
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "안전 검사 실패, OID %u인 부모 개체가 없음. 해당 테이블 \"%s\" (OID %u)"
+
+#: common.c:1045
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "\"%s\" 숫자 배열을 분석할 수 없음: 너무 많은 숫자들이 있음"
+
+#: common.c:1057
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "\"%s\" 숫자 배열을 분석할 수 없음: 숫자안에 이상한 글자가 있음"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "잘못된 압축 수위: %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504
+#: compress_io.c:547
+#, c-format
+msgid "not built with zlib support"
+msgstr "zlib 지원 기능이 없음"
+
+#: compress_io.c:236 compress_io.c:333
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "압축 라이브러리를 초기화 할 수 없음: %s"
+
+#: compress_io.c:256
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "압축 스트림을 닫을 수 없음: %s"
+
+#: compress_io.c:273
+#, c-format
+msgid "could not compress data: %s"
+msgstr "자료를 압축할 수 없음: %s"
+
+#: compress_io.c:349 compress_io.c:364
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "자료 압축을 풀 수 없습니다: %s"
+
+#: compress_io.c:371
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "압축 라이브러리를 닫을 수 없음: %s"
+
+#: compress_io.c:584 compress_io.c:621
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "입력 파일을 읽을 수 없음: %s"
+
+#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553
+#: pg_backup_tar.c:726 pg_backup_tar.c:749
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "입력 파일을 읽을 수 없음: 파일 끝"
+
+#: parallel.c:253
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() 실패: 오류 코드 %d"
+
+#: parallel.c:961
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "통신 체널을 만들 수 없음: %m"
+
+#: parallel.c:1018
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "작업자 프로세스를 만들 수 없음: %m"
+
+#: parallel.c:1148
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "리더로부터 알 수 없는 명령을 수신함: \"%s\""
+
+#: parallel.c:1191 parallel.c:1429
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "작업 프로세스로부터 잘못된 메시지를 받음: \"%s\""
+
+#: parallel.c:1323
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the "
+"table after the pg_dump parent process had gotten the initial ACCESS SHARE "
+"lock on the table."
+msgstr ""
+"\"%s\" 릴레이션을 선점할 수 없음\n"
+"이 상황은 일반적으로 다른 세션에서 해당 테이블을 이미 덤프하고 있거나 기타 다"
+"른 이유로 다른 세션에 의해서 선점 된 경우입니다."
+
+#: parallel.c:1412
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "작업 프로세스가 예상치 않게 종료됨"
+
+#: parallel.c:1534 parallel.c:1652
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "통신 체널에에 쓸 수 없음: %m"
+
+#: parallel.c:1736
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: 소켓을 만들 수 없음: 오류 코드 %d"
+
+#: parallel.c:1747
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: 바인딩 할 수 없음: 오류 코드 %d"
+
+#: parallel.c:1754
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: 리슨 할 수 없음: 오류 코드 %d"
+
+#: parallel.c:1761
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s() 실패: 오류 코드 %d"
+
+#: parallel.c:1772
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: 두번째 소켓을 만들 수 없음: 오류 코드 %d"
+
+#: parallel.c:1781
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: 소켓 접속 실패: 오류 코드 %d"
+
+#: parallel.c:1790
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: 접속을 승인할 수 없음: 오류 코드 %d"
+
+#: pg_backup_archiver.c:280 pg_backup_archiver.c:1632
+#, c-format
+msgid "could not close output file: %m"
+msgstr "출력 파일을 닫을 수 없음: %m"
+
+#: pg_backup_archiver.c:324 pg_backup_archiver.c:328
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "아카이브 아이템의 순서가 섹션에서 비정상적임"
+
+#: pg_backup_archiver.c:334
+#, c-format
+msgid "unexpected section code %d"
+msgstr "예상치 못한 섹션 코드 %d"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "이 아카이브 파일 형식에서는 병렬 복원이 지원되지 않음"
+
+#: pg_backup_archiver.c:375
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "8.0 이전 pg_dump로 만든 아카이브에서는 병렬 복원이 지원되지 않음"
+
+#: pg_backup_archiver.c:393
+#, c-format
+msgid ""
+"cannot restore from compressed archive (compression not supported in this "
+"installation)"
+msgstr ""
+"압축된 자료파일을 복원용으로 사용할 수 없습니다(압축기능을 지원하지 않고 컴파"
+"일되었음)"
+
+#: pg_backup_archiver.c:410
+#, c-format
+msgid "connecting to database for restore"
+msgstr "복원 작업을 위해 데이터베이스에 접속 중"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "pre-1.3 archive에서 직통 데이터베이스 접속은 지원되지 않음"
+
+#: pg_backup_archiver.c:455
+#, c-format
+msgid "implied data-only restore"
+msgstr "암묵적으로 자료만 복원"
+
+#: pg_backup_archiver.c:521
+#, c-format
+msgid "dropping %s %s"
+msgstr "%s %s 삭제 중"
+
+#: pg_backup_archiver.c:621
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "\"%s\" 구문에서 insert IF EXISTS 부분을 찾을 수 없음"
+
+#: pg_backup_archiver.c:777 pg_backup_archiver.c:779
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "원본 덤프 파일에서 발생한 경고: %s"
+
+#: pg_backup_archiver.c:794
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "%s \"%s.%s\" 만드는 중"
+
+#: pg_backup_archiver.c:797
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "%s \"%s\" 만드는 중"
+
+#: pg_backup_archiver.c:847
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "\"%s\" 새 데이터베이스에 접속중"
+
+#: pg_backup_archiver.c:874
+#, c-format
+msgid "processing %s"
+msgstr "%s 처리 중"
+
+#: pg_backup_archiver.c:896
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "\"%s.%s\" 테이블의 자료를 처리 중"
+
+#: pg_backup_archiver.c:966
+#, c-format
+msgid "executing %s %s"
+msgstr "실행중: %s %s"
+
+#: pg_backup_archiver.c:1005
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "%s 트리거 작동을 비활성화 하는 중"
+
+#: pg_backup_archiver.c:1031
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "%s 트리거 작동을 활성화 하는 중"
+
+#: pg_backup_archiver.c:1096
+#, c-format
+msgid ""
+"internal error -- WriteData cannot be called outside the context of a "
+"DataDumper routine"
+msgstr "내부 오류 -- WriteData는 DataDumper 루틴 영역 밖에서 호출 될 수 없음"
+
+#: pg_backup_archiver.c:1279
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "선택한 파일 양식으로는 large-object를 덤프할 수 없음"
+
+#: pg_backup_archiver.c:1337
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "%d개의 큰 개체가 복원됨"
+
+#: pg_backup_archiver.c:1358 pg_backup_tar.c:669
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "%u OID large object를 복원중"
+
+#: pg_backup_archiver.c:1370
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "%u large object를 만들 수 없음: %s"
+
+#: pg_backup_archiver.c:1375 pg_dump.c:3607
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "%u large object를 열 수 없음: %s"
+
+#: pg_backup_archiver.c:1431
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "TOC 파일 \"%s\"을(를) 열 수 없음: %m"
+
+#: pg_backup_archiver.c:1459
+#, c-format
+msgid "line ignored: %s"
+msgstr "줄 무시됨: %s"
+
+#: pg_backup_archiver.c:1466
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "%d ID에 대한 항목을 찾지 못했음"
+
+#: pg_backup_archiver.c:1489 pg_backup_directory.c:222
+#: pg_backup_directory.c:599
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "TOC 파일을 닫을 수 없음: %m"
+
+#: pg_backup_archiver.c:1603 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:586 pg_backup_directory.c:649
+#: pg_backup_directory.c:668 pg_dumpall.c:476
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "\"%s\" 출력 파일을 열 수 없음: %m"
+
+#: pg_backup_archiver.c:1605 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "출력 파일을 열 수 없음: %m"
+
+#: pg_backup_archiver.c:1699
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "%zu 바이트의 큰 객체 데이터를 씀(결과 = %d)"
+
+#: pg_backup_archiver.c:1705
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "큰 객체를 쓸 수 없음: %s"
+
+#: pg_backup_archiver.c:1795
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "초기화 작업 중:"
+
+#: pg_backup_archiver.c:1800
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "TOC 처리하는 중:"
+
+#: pg_backup_archiver.c:1805
+#, c-format
+msgid "while FINALIZING:"
+msgstr "뒷 마무리 작업 중:"
+
+#: pg_backup_archiver.c:1810
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "%d TOC 항목에서; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1886
+#, c-format
+msgid "bad dumpId"
+msgstr "잘못된 dumpID"
+
+#: pg_backup_archiver.c:1907
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "TABLE DATA 아이템에 대한 잘못된 테이블 dumpId"
+
+#: pg_backup_archiver.c:1999
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "예상치 못한 자료 옵셋 플래그 %d"
+
+#: pg_backup_archiver.c:2012
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "덤프 파일에서 파일 옵셋 값이 너무 큽니다"
+
+#: pg_backup_archiver.c:2150 pg_backup_archiver.c:2160
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "디렉터리 이름이 너무 긺: \"%s\""
+
+#: pg_backup_archiver.c:2168
+#, c-format
+msgid ""
+"directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not "
+"exist)"
+msgstr "\"%s\" 디렉터리가 알맞은 아카이브용이 아님 (\"toc.dat\" 파일이 없음)"
+
+#: pg_backup_archiver.c:2176 pg_backup_custom.c:173 pg_backup_custom.c:807
+#: pg_backup_directory.c:207 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "\"%s\" 입력 파일을 열 수 없음: %m"
+
+#: pg_backup_archiver.c:2183 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "입력 파일을 열 수 없음: %m"
+
+#: pg_backup_archiver.c:2189
+#, c-format
+msgid "could not read input file: %m"
+msgstr "입력 파일을 읽을 수 없음: %m"
+
+#: pg_backup_archiver.c:2191
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "입력 파일이 너무 짧습니다 (%lu 읽었음, 예상치 5)"
+
+#: pg_backup_archiver.c:2223
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "입력 파일은 일반 텍스트 덤프 파일입니다. psql 명령을 사용하세요."
+
+#: pg_backup_archiver.c:2229
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "입력 파일에서 타당한 아카이브를 찾을 수 없습니다(너무 짧은지?)"
+
+#: pg_backup_archiver.c:2235
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "입력 파일에서 타당한 아카이브를 찾을 수 없음"
+
+#: pg_backup_archiver.c:2244
+#, c-format
+msgid "could not close input file: %m"
+msgstr "입력 파일을 닫을 수 없음: %m"
+
+#: pg_backup_archiver.c:2361
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "알 수 없는 파일 포멧: \"%d\""
+
+#: pg_backup_archiver.c:2443 pg_backup_archiver.c:4505
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "%d %s %s 항목 마침"
+
+#: pg_backup_archiver.c:2447 pg_backup_archiver.c:4518
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "작업자 프로세스 실패: 종료 코드 %d"
+
+#: pg_backup_archiver.c:2568
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "%d ID 항목은 범위를 벗어났음 -- TOC 정보가 손상된 듯 합니다"
+
+#: pg_backup_archiver.c:2648
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "WITH OIDS 옵션이 있는 테이블의 복원은 이제 지원하지 않습니다"
+
+#: pg_backup_archiver.c:2730
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "알 수 없는 인코딩: \"%s\""
+
+#: pg_backup_archiver.c:2735
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "잘못된 ENCODING 항목: %s"
+
+#: pg_backup_archiver.c:2753
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "잘못된 STDSTRINGS 항목: %s"
+
+#: pg_backup_archiver.c:2778
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "\"%s\" 스키마를 찾을 수 없음"
+
+#: pg_backup_archiver.c:2785
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "\"%s\" 테이블을 찾을 수 없음"
+
+#: pg_backup_archiver.c:2792
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "\"%s\" 인덱스를 찾을 수 없음"
+
+#: pg_backup_archiver.c:2799
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "\"%s\" 함수를 찾을 수 없음"
+
+#: pg_backup_archiver.c:2806
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "\"%s\" 트리거를 찾을 수 없음"
+
+#: pg_backup_archiver.c:3203
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "\"%s\" 사용자로 세션 사용자를 지정할 수 없음: %s"
+
+#: pg_backup_archiver.c:3340
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "search_path를 \"%s\"(으)로 지정할 수 없음: %s"
+
+#: pg_backup_archiver.c:3402
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "default_tablespace로 %s(으)로 지정할 수 없음: %s"
+
+#: pg_backup_archiver.c:3452
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "default_table_access_method를 지정할 수 없음: %s"
+
+#: pg_backup_archiver.c:3546 pg_backup_archiver.c:3711
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "\"%s\" 개체의 소유주를 지정할 수 없습니다"
+
+#: pg_backup_archiver.c:3814
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "파일 헤더에서 매직 문자열을 찾지 못했습니다"
+
+#: pg_backup_archiver.c:3828
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "파일 헤더에 있는 %d.%d 버전은 지원되지 않습니다"
+
+#: pg_backup_archiver.c:3833
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "정수 크기 (%lu) 안전성 검사 실패"
+
+#: pg_backup_archiver.c:3837
+#, c-format
+msgid ""
+"archive was made on a machine with larger integers, some operations might "
+"fail"
+msgstr ""
+"이 아카이브는 큰 정수를 지원하는 시스템에서 만들어졌습니다. 그래서 몇 동작이 "
+"실패할 수도 있습니다."
+
+#: pg_backup_archiver.c:3847
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "예상되는 포멧 (%d)와 발견된 파일 포멧 (%d)이 서로 다름"
+
+#: pg_backup_archiver.c:3862
+#, c-format
+msgid ""
+"archive is compressed, but this installation does not support compression -- "
+"no data will be available"
+msgstr ""
+"아카이브는 압축되어있지만, 이 프로그램에서는 압축기능을 지원하지 못합니다 -- "
+"이 안에 있는 자료를 모두 사용할 수 없습니다."
+
+#: pg_backup_archiver.c:3896
+#, c-format
+msgid "invalid creation date in header"
+msgstr "헤더에 잘못된 생성 날짜가 있음"
+
+#: pg_backup_archiver.c:4030
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "%d %s %s 항목을 처리하는 중"
+
+#: pg_backup_archiver.c:4109
+#, c-format
+msgid "entering main parallel loop"
+msgstr "기본 병렬 루프로 시작 중"
+
+#: pg_backup_archiver.c:4120
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "%d %s %s 항목을 건너뛰는 중"
+
+#: pg_backup_archiver.c:4129
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "%d %s %s 항목을 시작하는 중"
+
+#: pg_backup_archiver.c:4183
+#, c-format
+msgid "finished main parallel loop"
+msgstr "기본 병렬 루프 마침"
+
+#: pg_backup_archiver.c:4219
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "누락된 %d %s %s 항목 처리 중"
+
+#: pg_backup_archiver.c:4824
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "\"%s\" 테이블을 만들 수 없어, 해당 자료는 복원되지 않을 것입니다."
+
+#: pg_backup_custom.c:376 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "잘못된 large object용 OID"
+
+#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629
+#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021
+#, c-format
+msgid "error during file seek: %m"
+msgstr "파일 seek 작업하는 도중 오류가 발생했습니다: %m"
+
+#: pg_backup_custom.c:478
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "%d 자료 블록에 잘못된 접근 위치가 있음"
+
+#: pg_backup_custom.c:495
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "아카이브 검색하는 동안 알 수 없는 자료 블럭 형태(%d)를 발견함"
+
+#: pg_backup_custom.c:517
+#, c-format
+msgid ""
+"could not find block ID %d in archive -- possibly due to out-of-order "
+"restore request, which cannot be handled due to non-seekable input file"
+msgstr ""
+"아카이브에서 블록 ID %d을(를) 찾지 못했습니다. 복원 요청이 잘못된 것 같습니"
+"다. 입력 파일을 검색할 수 없으므로 요청을 처리할 수 없습니다."
+
+#: pg_backup_custom.c:522
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr ""
+"아카이브에서 블록 ID %d을(를) 찾을 수 없습니다. 아카이브가 손상된 것 같습니"
+"다."
+
+#: pg_backup_custom.c:529
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "자료를 읽는 동안 예상치 못한 ID (%d) 발견됨 -- 예상값 %d"
+
+#: pg_backup_custom.c:543
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "아카이브 복원하는 중에, 알 수 없는 자료 블럭 형태 %d 를 발견함"
+
+#: pg_backup_custom.c:645
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "입력 파일을 읽을 수 없음: %m"
+
+#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943
+#: pg_backup_tar.c:1019
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "아카이브 파일에서 검색 위치를 확인할 수 없음: %m"
+
+#: pg_backup_custom.c:762 pg_backup_custom.c:802
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "자료 파일을 닫을 수 없음: %m"
+
+#: pg_backup_custom.c:785
+#, c-format
+msgid "can only reopen input archives"
+msgstr "입력 아카이브만 다시 열 수 있음"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "표준 입력을 이용한 병렬 복원 작업은 지원하지 않습니다"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr ""
+"시작 위치를 임의로 지정할 수 없는 파일로는 병렬 복원 작업을 할 수 없습니다."
+
+#: pg_backup_custom.c:810
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "아카이브 파일에서 검색 위치를 설정할 수 없음: %m"
+
+#: pg_backup_custom.c:889
+#, c-format
+msgid "compressor active"
+msgstr "압축기 사용"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "libpq에서 server_verion 값을 구할 수 없음"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1646
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "서버 버전이 일치하지 않아 중단하는 중"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1647
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "서버 버전: %s; %s 버전: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "데이터베이스에 이미 접속해 있음"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595
+msgid "Password: "
+msgstr "암호: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "데이터베이스 접속을 할 수 없음"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "재연결 실패: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dumpall.c:1520 pg_dumpall.c:1604
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732
+#, c-format
+msgid "query failed: %s"
+msgstr "쿼리 실패: %s"
+
+#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733
+#, c-format
+msgid "Query was: %s"
+msgstr "사용한 쿼리: %s"
+
+#: pg_backup_db.c:316
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "쿼리에서 한 개가 아닌 %d개의 행을 반환: %s"
+
+#: pg_backup_db.c:352
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %s사용된 명령: %s"
+
+#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489
+msgid "could not execute query"
+msgstr "쿼리를 실행 할 수 없음"
+
+#: pg_backup_db.c:461
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "PQputCopyData에 의해서 오류가 반환되었음: %s"
+
+#: pg_backup_db.c:510
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "PQputCopyEnd에 의해서 오류가 반환되었음: %s"
+
+#: pg_backup_db.c:516
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "\"%s\" 테이블을 위한 COPY 실패: %s"
+
+#: pg_backup_db.c:522 pg_dump.c:2106
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "\"%s\" 테이블 COPY 작업 중 잘못된 부가 결과가 있음"
+
+#: pg_backup_db.c:534
+msgid "could not start database transaction"
+msgstr "데이터베이스 트랜잭션을 시작할 수 없음"
+
+#: pg_backup_db.c:542
+msgid "could not commit database transaction"
+msgstr "데이터베이스 트랜잭션을 commit 할 수 없음"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "자료가 저장될 디렉터리를 지정하지 않았음"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 읽을 수 없음: %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 닫을 수 없음: %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 만들 수 없음: %m"
+
+#: pg_backup_directory.c:355 pg_backup_directory.c:497
+#: pg_backup_directory.c:533
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "출력 파일을 쓸 수 없음: %s"
+
+#: pg_backup_directory.c:373
+#, c-format
+msgid "could not close data file: %m"
+msgstr "자료 파일을 닫을 수 없음: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "\"%s\" 자료 파일을 닫을 수 없음: %m"
+
+#: pg_backup_directory.c:447
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "입력용 large object TOC 파일(\"%s\")을 열 수 없음: %m"
+
+#: pg_backup_directory.c:458
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "large object TOC 파일(\"%s\")을 닫을 수 없음: \"%s\""
+
+#: pg_backup_directory.c:467
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "large object TOC 파일(\"%s\")을 닫을 수 없음"
+
+#: pg_backup_directory.c:471
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "large object TOC 파일(\"%s\")을 닫을 수 없음: %m"
+
+#: pg_backup_directory.c:685
+#, c-format
+msgid "could not close blob data file: %m"
+msgstr "blob 자료 파일을 닫을 수 없음: %m"
+
+#: pg_backup_directory.c:691
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "blob TOC 파일에 쓸 수 없음"
+
+#: pg_backup_directory.c:705
+#, c-format
+msgid "could not close blobs TOC file: %m"
+msgstr "blob TOC 파일을 닫을 수 없음: %m"
+
+#: pg_backup_directory.c:724
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "파일 이름이 너무 긺: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "이 파일 형태는 읽을 수 없음"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "출력용 TOC 파일 \"%s\"을(를) 열 수 없음: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "출력용 TOC 파일을 열 수 없음: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:893
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "tar 출력 포멧에서 압축 기능을 지원하지 않음"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "입력용 TOC 파일(\"%s\")을 열 수 없음: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "입력용 TOC 파일을 열 수 없음: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "아카이브에서 \"%s\" 파일을 찾을 수 없음"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "임시 파일 이름을 짓지 못했습니다: %m"
+
+#: pg_backup_tar.c:624
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "COPY 구문 오류: \"%s\""
+
+#: pg_backup_tar.c:890
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "잘못된 large object OID: %u"
+
+#: pg_backup_tar.c:1035
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "임시 파일을 열 수 없음: %m"
+
+#: pg_backup_tar.c:1038
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "실재 파일 길이(%lld)와 예상되는 값(%lld)이 다릅니다"
+
+#: pg_backup_tar.c:1084 pg_backup_tar.c:1115
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "tar 아카이브에서 \"%s\" 파일을 위한 헤더를 찾을 수 없음"
+
+#: pg_backup_tar.c:1102
+#, c-format
+msgid ""
+"restoring data out of order is not supported in this archive format: \"%s\" "
+"is required, but comes before \"%s\" in the archive file."
+msgstr ""
+"순서를 넘어서는 자료 덤프 작업은 이 아카이브 포멧에서는 지원하지 않습니다: "
+"\"%s\" 요구되었지만, 이 아카이브 파일에서는 \"%s\" 전에 옵니다."
+
+#: pg_backup_tar.c:1149
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "불완전한 tar 헤더가 있음(%lu 바이트)"
+
+#: pg_backup_tar.c:1188
+#, c-format
+msgid ""
+"corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "%s 안에 손상된 tar 헤더 발견 (예상치 %d, 계산된 값 %d), 파일 위치 %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "알 수 없는 섹션 이름: \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:628 pg_dump.c:645 pg_dumpall.c:340
+#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373
+#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "자세한 사항은 \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "on_exit_nicely 슬롯 범위 벗어남"
+
+#: pg_dump.c:643 pg_dumpall.c:348 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 많은 명령행 인자를 지정했음 (시작: \"%s\")"
+
+#: pg_dump.c:662 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "-s/--schema-only 옵션과 -a/--data-only 옵션은 함께 사용할 수 없음"
+
+#: pg_dump.c:665
+#, c-format
+msgid ""
+"options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr ""
+"-s/--schema-only 옵션과 --include-foreign-data 옵션은 함께 사용할 수 없음"
+
+#: pg_dump.c:668
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "--include-foreign-data 옵션은 병렬 백업 작업에서 지원하지 않음"
+
+#: pg_dump.c:671 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "-c/--clean 옵션과 -a/--data-only 옵션은 함께 사용할 수 없음"
+
+#: pg_dump.c:674 pg_dumpall.c:378 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "--if-exists 옵션은 -c/--clean 옵션과 함께 사용해야 함"
+
+#: pg_dump.c:681
+#, c-format
+msgid ""
+"option --on-conflict-do-nothing requires option --inserts, --rows-per-"
+"insert, or --column-inserts"
+msgstr ""
+"--on-conflict-do-nothing 옵션은 --inserts, --rows-per-insert 또는 --column-"
+"inserts 옵션과 함께 사용해야 함"
+
+#: pg_dump.c:703
+#, c-format
+msgid ""
+"requested compression not available in this installation -- archive will be "
+"uncompressed"
+msgstr ""
+"요청한 압축 기능은 이 설치판에서는 사용할 수 없습니다 -- 자료 파일은 압축 없"
+"이 만들어질 것입니다"
+
+#: pg_dump.c:716
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "병렬 백업은 디렉터리 기반 출력일 때만 사용할 수 있습니다."
+
+#: pg_dump.c:762
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "마지막 내장 OID는 %u"
+
+#: pg_dump.c:771
+#, c-format
+msgid "no matching schemas were found"
+msgstr "조건에 맞는 스키마가 없습니다"
+
+#: pg_dump.c:785
+#, c-format
+msgid "no matching tables were found"
+msgstr "조건에 맞는 테이블이 없습니다"
+
+#: pg_dump.c:807
+#, c-format
+msgid "no matching extensions were found"
+msgstr "조건에 맞는 확장 모듈이 없습니다"
+
+#: pg_dump.c:990
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 데이터베이스를 텍스트 파일 또는 기타\n"
+"다른 형태의 파일로 덤프합니다.\n"
+"\n"
+
+#: pg_dump.c:991 pg_dumpall.c:605 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_dump.c:992
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [옵션]... [DB이름]\n"
+
+#: pg_dump.c:994 pg_dumpall.c:608 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"일반 옵션들:\n"
+
+#: pg_dump.c:995
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=파일이름 출력 파일 또는 디렉터리 이름\n"
+
+#: pg_dump.c:996
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p 출력 파일 형식(사용자 지정, 디렉터리, tar,\n"
+" 일반 텍스트(초기값))\n"
+
+#: pg_dump.c:998
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=개수 덤프 작업을 병렬 처리 함\n"
+
+#: pg_dump.c:999 pg_dumpall.c:610
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose 작업 내역을 자세히 봄\n"
+
+#: pg_dump.c:1000 pg_dumpall.c:611
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_dump.c:1001
+#, c-format
+msgid ""
+" -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 출력 자료 압축 수위\n"
+
+#: pg_dump.c:1002 pg_dumpall.c:612
+#, c-format
+msgid ""
+" --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr ""
+" --lock-wait-timeout=초 테이블 잠금 시 지정한 초만큼 기다린 후 실패\n"
+
+#: pg_dump.c:1003 pg_dumpall.c:639
+#, c-format
+msgid ""
+" --no-sync do not wait for changes to be written safely "
+"to disk\n"
+msgstr " --no-sync fsync 작업 생략\n"
+
+#: pg_dump.c:1004 pg_dumpall.c:613
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: pg_dump.c:1006 pg_dumpall.c:614
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"출력 내용을 다루는 옵션들:\n"
+
+#: pg_dump.c:1007 pg_dumpall.c:615
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only 스키마 빼고 자료만 덤프\n"
+
+#: pg_dump.c:1008
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs Large Object들도 함께 덤프함\n"
+
+#: pg_dump.c:1009
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs Large Object들을 제외하고 덤프함\n"
+
+#: pg_dump.c:1010 pg_restore.c:447
+#, c-format
+msgid ""
+" -c, --clean clean (drop) database objects before "
+"recreating\n"
+msgstr ""
+" -c, --clean 다시 만들기 전에 데이터베이스 개체 지우기(삭"
+"제)\n"
+
+#: pg_dump.c:1011
+#, c-format
+msgid ""
+" -C, --create include commands to create database in dump\n"
+msgstr ""
+" -C, --create 데이터베이스 만드는 명령구문도 포함시킴\n"
+
+#: pg_dump.c:1012
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATTERN 지정한 확장 모듈들만 덤프 함\n"
+
+#: pg_dump.c:1013 pg_dumpall.c:617
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=인코딩 지정한 인코딩으로 자료를 덤프 함\n"
+
+#: pg_dump.c:1014
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=PATTERN 지정한 SCHEMA들 자료만 덤프\n"
+
+#: pg_dump.c:1015
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATTERN 지정한 SCHEMA들만 빼고 모두 덤프\n"
+
+#: pg_dump.c:1016
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner 일반 텍스트 형식에서\n"
+" 개체 소유권 복원 건너뛰기\n"
+
+#: pg_dump.c:1018 pg_dumpall.c:621
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only 자료구조(스키마)만 덤프\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid ""
+" -S, --superuser=NAME superuser user name to use in plain-text "
+"format\n"
+msgstr ""
+" -S, --superuser=NAME 일반 텍스트 형식에서 사용할 슈퍼유저 사용자 이"
+"름\n"
+
+#: pg_dump.c:1020
+#, c-format
+msgid " -t, --table=PATTERN dump the specified table(s) only\n"
+msgstr " -t, --table=PATTERN 지정한 이름의 테이블들만 덤프\n"
+
+#: pg_dump.c:1021
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATTERN 지정한 테이블들만 빼고 덤프\n"
+
+#: pg_dump.c:1022 pg_dumpall.c:624
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr ""
+" -x, --no-privileges 접근 권한 (grant/revoke) 정보는 덤프 안 함\n"
+
+#: pg_dump.c:1023 pg_dumpall.c:625
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade 업그레이드 유틸리티 전용\n"
+
+#: pg_dump.c:1024 pg_dumpall.c:626
+#, c-format
+msgid ""
+" --column-inserts dump data as INSERT commands with column "
+"names\n"
+msgstr ""
+" --column-inserts 칼럼 이름과 함께 INSERT 명령으로 자료 덤프\n"
+
+#: pg_dump.c:1025 pg_dumpall.c:627
+#, c-format
+msgid ""
+" --disable-dollar-quoting disable dollar quoting, use SQL standard "
+"quoting\n"
+msgstr ""
+" --disable-dollar-quoting $ 인용 구문 사용안함, SQL 표준 따옴표 사용\n"
+
+#: pg_dump.c:1026 pg_dumpall.c:628 pg_restore.c:464
+#, c-format
+msgid ""
+" --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers 자료만 복원할 때 트리거 사용을 안함\n"
+
+#: pg_dump.c:1027
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user "
+"has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security 로우 보안 활성화 (현재 작업자가 접근할 수\n"
+" 있는 자료만 덤프 함)\n"
+
+#: pg_dump.c:1029
+#, c-format
+msgid ""
+" --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=PATTERN 해당 테이블 자료는 덤프 안함\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:630
+#, c-format
+msgid ""
+" --extra-float-digits=NUM override default setting for "
+"extra_float_digits\n"
+msgstr " --extra-float-digits=NUM 기본 extra_float_digits 값 바꿈\n"
+
+#: pg_dump.c:1031 pg_dumpall.c:631 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists 객체 삭제 시 IF EXISTS 구문 사용\n"
+
+#: pg_dump.c:1032
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=패턴\n"
+" 지정한 패턴과 일치하는 외부 서버의 외부\n"
+" 테이블 자료를 포함\n"
+
+#: pg_dump.c:1035 pg_dumpall.c:632
+#, c-format
+msgid ""
+" --inserts dump data as INSERT commands, rather than "
+"COPY\n"
+msgstr " --inserts COPY 대신 INSERT 명령으로 자료 덤프\n"
+
+#: pg_dump.c:1036 pg_dumpall.c:633
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr ""
+" --load-via-partition-root 상위 테이블을 통해 하위 테이블을 로드함\n"
+
+#: pg_dump.c:1037 pg_dumpall.c:634
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments 코멘트는 덤프 안함\n"
+
+#: pg_dump.c:1038 pg_dumpall.c:635
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications 발행 정보는 덤프하지 않음\n"
+
+#: pg_dump.c:1039 pg_dumpall.c:637
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels 보안 라벨 할당을 덤프 하지 않음\n"
+
+#: pg_dump.c:1040 pg_dumpall.c:638
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions 구독 정보는 덤프하지 않음\n"
+
+#: pg_dump.c:1041 pg_dumpall.c:640
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method 테이블 접근 방법은 덤프하지 않음\n"
+
+#: pg_dump.c:1042 pg_dumpall.c:641
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces 테이블스페이스 할당을 덤프하지 않음\n"
+
+#: pg_dump.c:1043 pg_dumpall.c:642
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression TOAST 압축 방법은 덤프하지 않음\n"
+
+#: pg_dump.c:1044 pg_dumpall.c:643
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data 언로그드 테이블 자료는 덤프하지 않음\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:644
+#, c-format
+msgid ""
+" --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT "
+"commands\n"
+msgstr ""
+" --on-conflict-do-nothing INSERT 구문에 ON CONFLICT DO NOTHING 옵션 추"
+"가\n"
+
+#: pg_dump.c:1046 pg_dumpall.c:645
+#, c-format
+msgid ""
+" --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr ""
+" --quote-all-identifiers 예약어가 아니여도 모든 식별자는 따옴표를 씀\n"
+
+#: pg_dump.c:1047 pg_dumpall.c:646
+#, c-format
+msgid ""
+" --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr ""
+" --rows-per-insert=NROWS 한 INSERT 명령으로 입력할 로우 수; --inserts\n"
+" 옵션을 사용한 것으로 가정 함\n"
+
+#: pg_dump.c:1048
+#, c-format
+msgid ""
+" --section=SECTION dump named section (pre-data, data, or post-"
+"data)\n"
+msgstr ""
+" --section=SECTION 해당 섹션(pre-data, data, post-data)만 덤프\n"
+
+#: pg_dump.c:1049
+#, c-format
+msgid ""
+" --serializable-deferrable wait until the dump can run without "
+"anomalies\n"
+msgstr ""
+" --serializable-deferrable 자료 정합성을 보장하기 위해 덤프 작업을\n"
+" 직렬화 가능한 트랜잭션으로 처리 함\n"
+
+#: pg_dump.c:1050
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT 지정한 스냅샷을 덤프 함\n"
+
+#: pg_dump.c:1051 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns "
+"to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names 테이블이나 스키마를 지정했을 때 그 패턴에 맞"
+"는\n"
+" 객체가 적어도 하나 이상 있어야 함\n"
+
+#: pg_dump.c:1053 pg_dumpall.c:647 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands "
+"instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" SET SESSION AUTHORIZATION 명령을 ALTER OWNER "
+"명령\n"
+" 대신 사용하여 소유권 설정\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:651 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"연결 옵션들:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=DBNAME 덤프할 데이터베이스\n"
+
+#: pg_dump.c:1059 pg_dumpall.c:653 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME 접속할 데이터베이스 서버 또는 소켓 디렉터리\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:655 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT 데이터베이스 서버의 포트 번호\n"
+
+#: pg_dump.c:1061 pg_dumpall.c:656 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME 연결할 데이터베이스 사용자\n"
+
+#: pg_dump.c:1062 pg_dumpall.c:657 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 암호 프롬프트 표시 안 함\n"
+
+#: pg_dump.c:1063 pg_dumpall.c:658 pg_restore.c:487
+#, c-format
+msgid ""
+" -W, --password force password prompt (should happen "
+"automatically)\n"
+msgstr " -W, --password 암호 입력 프롬프트 보임(자동으로 처리함)\n"
+
+#: pg_dump.c:1064 pg_dumpall.c:659
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLENAME 덤프 전에 SET ROLE 수행\n"
+
+#: pg_dump.c:1066
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"데이터베이스 이름을 지정하지 않았다면, PGDATABASE 환경변수값을\n"
+"사용합니다.\n"
+"\n"
+
+#: pg_dump.c:1068 pg_dumpall.c:663 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "문제점 보고 주소 <%s>\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:664 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: pg_dump.c:1088 pg_dumpall.c:488
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "클라이언트 인코딩 값이 잘못되었습니다: \"%s\""
+
+#: pg_dump.c:1226
+#, c-format
+msgid ""
+"parallel dumps from standby servers are not supported by this server version"
+msgstr "대기 서버에서 병렬 덤프는 이 서버 버전에서 지원하지 않음"
+
+#: pg_dump.c:1291
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "\"%s\" 값은 잘못된 출력 파일 형태입니다."
+
+#: pg_dump.c:1332 pg_dump.c:1388 pg_dump.c:1441 pg_dumpall.c:1282
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "적당하지 않은 qualified 이름 입니다 (너무 많은 점이 있네요): %s"
+
+#: pg_dump.c:1340
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "\"%s\" 검색 조건에 만족하는 스키마가 없습니다"
+
+#: pg_dump.c:1393
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "\"%s\" 검색 조건에 만족하는 확장 모듈이 없습니다"
+
+#: pg_dump.c:1446
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "\"%s\" 검색 조건에 만족하는 외부 서버가 없습니다"
+
+#: pg_dump.c:1509
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr ""
+"적당하지 않은 릴레이션(relation) 이름 입니다 (너무 많은 점이 있네요): %s"
+
+#: pg_dump.c:1520
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "\"%s\" 검색 조건에 만족하는 테이블이 없습니다"
+
+#: pg_dump.c:1547
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "현재 데이터베이스에 연결되어있지 않습니다."
+
+#: pg_dump.c:1550
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "서로 다른 데이터베이스간의 참조는 구현되어있지 않습니다: %s"
+
+#: pg_dump.c:1981
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "\"%s.%s\" 테이블의 내용 덤프 중"
+
+#: pg_dump.c:2087
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "\"%s\" 테이블 내용을 덤프하면서 오류 발생: PQgetCopyData() 실패."
+
+#: pg_dump.c:2088 pg_dump.c:2098
+#, c-format
+msgid "Error message from server: %s"
+msgstr "서버에서 보낸 오류 메시지: %s"
+
+#: pg_dump.c:2089 pg_dump.c:2099
+#, c-format
+msgid "Command was: %s"
+msgstr "사용된 명령: %s"
+
+#: pg_dump.c:2097
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "\"%s\" 테이블 내용을 덤프하면서 오류 발생: PQgetResult() 실패."
+
+#: pg_dump.c:2179
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "\"%s\" 테이블에서 잘못된 필드 수"
+
+#: pg_dump.c:2875
+#, c-format
+msgid "saving database definition"
+msgstr "데이터베이스 구성정보를 저장 중"
+
+#: pg_dump.c:2971
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "알 수 없는 로케일 제공자 이름: %s"
+
+#: pg_dump.c:3317
+#, c-format
+msgid "saving encoding = %s"
+msgstr "인코딩 = %s 저장 중"
+
+#: pg_dump.c:3342
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "standard_conforming_strings = %s 저장 중"
+
+#: pg_dump.c:3381
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "current_schemas() 결과를 분석할 수 없음"
+
+#: pg_dump.c:3400
+#, c-format
+msgid "saving search_path = %s"
+msgstr "search_path = %s 저장 중"
+
+#: pg_dump.c:3438
+#, c-format
+msgid "reading large objects"
+msgstr "large object 읽는 중"
+
+#: pg_dump.c:3576
+#, c-format
+msgid "saving large objects"
+msgstr "large object들을 저장 중"
+
+#: pg_dump.c:3617
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "%u large object 읽는 중 오류: %s"
+
+#: pg_dump.c:3723
+#, c-format
+msgid "reading row-level security policies"
+msgstr "로우 단위 보안 정책 읽는 중"
+
+#: pg_dump.c:3864
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "예상치 못한 정책 명령 형태: %c"
+
+#: pg_dump.c:4314 pg_dump.c:4632 pg_dump.c:11833 pg_dump.c:17684
+#: pg_dump.c:17686 pg_dump.c:18307
+#, c-format
+msgid "could not parse %s array"
+msgstr "%s 배열을 분석할 수 없음"
+
+#: pg_dump.c:4500
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr ""
+"현재 사용자가 슈퍼유저가 아니기 때문에 서브스크립션들은 덤프하지 못했음"
+
+#: pg_dump.c:5014
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "%s %s 객체와 관련된 상위 확장 기능을 찾을 수 없음"
+
+#: pg_dump.c:5159
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "OID %u 스키마 없음"
+
+#: pg_dump.c:6613 pg_dump.c:16948
+#, c-format
+msgid ""
+"failed sanity check, parent table with OID %u of sequence with OID %u not "
+"found"
+msgstr "의존성 검사 실패, 부모 테이블 OID %u 없음. 해당 시퀀스 개체 OID %u"
+
+#: pg_dump.c:6756
+#, c-format
+msgid ""
+"failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "완전성 검사 실패, OID %u인 객체가 pg_partitioned_table에 없음"
+
+#: pg_dump.c:6987 pg_dump.c:7254 pg_dump.c:7725 pg_dump.c:8392 pg_dump.c:8513
+#: pg_dump.c:8667
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "알 수 없는 테이블 OID %u"
+
+#: pg_dump.c:6991
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "\"%s\" 테이블의 인덱스 자료를 알 수 없음"
+
+#: pg_dump.c:7486
+#, c-format
+msgid ""
+"failed sanity check, parent table with OID %u of pg_rewrite entry with OID "
+"%u not found"
+msgstr "의존성 검사 실패, 부모 테이블 OID %u 없음. 해당 pg_rewrite 개체 OID %u"
+
+#: pg_dump.c:7777
+#, c-format
+msgid ""
+"query produced null referenced table name for foreign key trigger \"%s\" on "
+"table \"%s\" (OID of table: %u)"
+msgstr ""
+"쿼리가 참조테이블 정보가 없는 \"%s\" 참조키 트리거를 \"%s\" (해당 OID: %u) 테"
+"이블에서 만들었습니다."
+
+#: pg_dump.c:8396
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "\"%s\" 테이블의 알 수 없는 칼럼 자료"
+
+#: pg_dump.c:8426
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "\"%s\" 테이블에 매겨져 있는 열 번호가 잘못되었습니다"
+
+#: pg_dump.c:8475
+#, c-format
+msgid "finding table default expressions"
+msgstr "default 표현식 찾는 중"
+
+#: pg_dump.c:8517
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "적당하지 않는 adnum 값: %d, 해당 테이블 \"%s\""
+
+#: pg_dump.c:8617
+#, c-format
+msgid "finding table check constraints"
+msgstr "테이블 체크 제약조건 찾는 중"
+
+#: pg_dump.c:8671
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] ""
+"%d개의 제약 조건이 \"%s\" 테이블에 있을 것으로 예상했으나 %d개를 찾음"
+
+#: pg_dump.c:8675
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "시스템 카탈로그가 손상되었는 것 같습니다."
+
+#: pg_dump.c:9365
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "%u OID 롤이 없음"
+
+#: pg_dump.c:9477 pg_dump.c:9506
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "지원하지 않는 pg_init_privs 항목: %u %u %d"
+
+#: pg_dump.c:10327
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "\"%s\" 자료형의 typtype가 잘못 되어 있음"
+
+#: pg_dump.c:11902
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "\"%s\" 함수의 provolatile 값이 잘못 되었습니다"
+
+#: pg_dump.c:11952 pg_dump.c:13777
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "\"%s\" 함수의 proparallel 값이 잘못 되었습니다"
+
+#: pg_dump.c:12083 pg_dump.c:12189 pg_dump.c:12196
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "%u OID 함수에 대한 함수 정의를 찾을 수 없음"
+
+#: pg_dump.c:12122
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "pg_cast.castfunc 또는 pg_cast.castmethod 필드에 잘못된 값이 있음"
+
+#: pg_dump.c:12125
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "pg_cast.castmethod 필드에 잘못된 값이 있음"
+
+#: pg_dump.c:12215
+#, c-format
+msgid ""
+"bogus transform definition, at least one of trffromsql and trftosql should "
+"be nonzero"
+msgstr "잘못된 전송 정의, trffromsql 또는 trftosql 중 하나는 비어 있으면 안됨"
+
+#: pg_dump.c:12232
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "pg_transform.trffromsql 필드에 잘못된 값이 있음"
+
+#: pg_dump.c:12253
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "pg_transform.trftosql 필드에 잘못된 값이 있음"
+
+#: pg_dump.c:12398
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "postfix 연산자는 더이상 지원하지 않습니다.(\"%s\" 연산자)"
+
+#: pg_dump.c:12568
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "%s OID의 연산자를 찾을 수 없음"
+
+#: pg_dump.c:12636
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "\"%c\" 잘못된 자료형, 해당 접근 방법: \"%s\""
+
+#: pg_dump.c:13278
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "알 수 없는 정렬규칙 제공자 이름: %s"
+
+#: pg_dump.c:13696
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "\"%s\" 집계 함수용 aggfinalmodify 값이 이상함"
+
+#: pg_dump.c:13752
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "\"%s\" 집계 함수용 aggmfinalmodify 값이 이상함"
+
+#: pg_dump.c:14470
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "기본 접근 권한에서 알 수 없는 객체형이 있음: %d"
+
+#: pg_dump.c:14486
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "기본 ACL 목록 (%s)을 분석할 수 없음"
+
+#: pg_dump.c:14568
+#, c-format
+msgid ""
+"could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr ""
+"초기 ACL 목록 (%s) 또는 default (%s) 분석할 수 없음, 해당 객체: \"%s\" (%s)"
+
+#: pg_dump.c:14593
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "ACL 목록 (%s) 또는 default (%s) 분석할 수 없음, 해당 객체: \"%s\" (%s)"
+
+#: pg_dump.c:15131
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "\"%s\" 뷰 정의 정보가 없습니다."
+
+#: pg_dump.c:15134
+#, c-format
+msgid ""
+"query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "\"%s\" 뷰 정의 정보가 하나 이상 있습니다."
+
+#: pg_dump.c:15141
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "\"%s\" 뷰의 정의 내용이 비어있습니다."
+
+#: pg_dump.c:15225
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS 옵션은 더이상 지원하지 않음 (\"%s\" 테이블)"
+
+#: pg_dump.c:16154
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "잘못된 열 번호 %d, 해당 테이블 \"%s\""
+
+#: pg_dump.c:16232
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "인덱스 통계정보 칼럼 분석 실패"
+
+#: pg_dump.c:16234
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "인덱스 통계정보 값 분석 실패"
+
+#: pg_dump.c:16236
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "인덱스 통계정보용 칼럼수와 값수가 일치하지 않음"
+
+#: pg_dump.c:16454
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "\"%s\" 제약 조건을 위한 인덱스가 빠졌습니다"
+
+#: pg_dump.c:16682
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "알 수 없는 제약 조건 종류: %c"
+
+#: pg_dump.c:16783 pg_dump.c:17012
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural ""
+"query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] ""
+"\"%s\" 시퀀스의 데이터를 가져오기 위한 쿼리에서 %d개의 행 반환(1개 필요)"
+
+#: pg_dump.c:16815
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "알 수 없는 시퀀스 형태: %s"
+
+#: pg_dump.c:17104
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "기대되지 않은 tgtype 값: %d"
+
+#: pg_dump.c:17176
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "잘못된 인수 문자열 (%s), 해당 트리거 \"%s\", 사용되는 테이블 \"%s\""
+
+#: pg_dump.c:17445
+#, c-format
+msgid ""
+"query to get rule \"%s\" for table \"%s\" failed: wrong number of rows "
+"returned"
+msgstr ""
+"\"%s\" 규칙(\"%s\" 테이블)을 가져오기 위한 쿼리 실패: 잘못된 행 수 반환"
+
+#: pg_dump.c:17598
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "%u 확장기능과 관련된 상위 확장 기능을 찾을 수 없음"
+
+#: pg_dump.c:17688
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "확장 모듈용 환경설정 매개변수 수와 조건 수가 일치 하지 않음"
+
+#: pg_dump.c:17820
+#, c-format
+msgid "reading dependency data"
+msgstr "의존 관계 자료 읽는 중"
+
+#: pg_dump.c:17906
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "%u %u 개체의 하위 관련 개체가 없음"
+
+#: pg_dump.c:17917
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "%u %u 개체의 상위 관련 개체가 없음"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "잘못된 dumpId %d"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "잘못된 의존성 %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "의존 관계를 식별 할 수 없음"
+
+#: pg_dump_sort.c:1232
+#, c-format
+msgid "there are circular foreign-key constraints on this table:"
+msgid_plural "there are circular foreign-key constraints among these tables:"
+msgstr[0] "다음 데이블 간 참조키가 서로 교차하고 있음:"
+
+#: pg_dump_sort.c:1236 pg_dump_sort.c:1256
+#, c-format
+msgid " %s"
+msgstr " %s"
+
+#: pg_dump_sort.c:1237
+#, c-format
+msgid ""
+"You might not be able to restore the dump without using --disable-triggers "
+"or temporarily dropping the constraints."
+msgstr ""
+"--disable-triggers 옵션으로 복원할 수 있습니다. 또는 임시로 제약 조건을 삭제"
+"하고 복원하세요."
+
+#: pg_dump_sort.c:1238
+#, c-format
+msgid ""
+"Consider using a full dump instead of a --data-only dump to avoid this "
+"problem."
+msgstr ""
+"이 문제를 피하려면, --data-only 덤프 대신에 모든 덤프를 사용하길 권합니다."
+
+#: pg_dump_sort.c:1250
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "다음 항목 간 의존 관계를 분석할 수 없음:"
+
+#: pg_dumpall.c:205
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr ""
+"\"%s\" 프로그램이 %s 작업에서 필요로 하지만, \"%s\" 디렉터리 안에 함께 있지 "
+"않습니다"
+
+#: pg_dumpall.c:208
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"\"%s\" 프로그램을 \"%s\" 작업 때문에 찾았지만, %s 버전과 같지 않습니다."
+
+#: pg_dumpall.c:357
+#, c-format
+msgid ""
+"option --exclude-database cannot be used together with -g/--globals-only, -"
+"r/--roles-only, or -t/--tablespaces-only"
+msgstr ""
+"--exclude-database 옵션은 -g/--globals-only, -r/--roles-only, 또는 -t/--"
+"tablespaces-only 옵션과 함께 쓸 수 없음"
+
+#: pg_dumpall.c:365
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "-g/--globals-only 옵션과 -r/--roles-only 옵션은 함께 사용할 수 없음"
+
+#: pg_dumpall.c:372
+#, c-format
+msgid ""
+"options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr ""
+"-g/--globals-only 옵션과 -t/--tablespaces-only 옵션은 함께 사용할 수 없음"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid ""
+"options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr ""
+"-r/--roles-only 옵션과 -t/--tablespaces-only 옵션은 함께 사용할 수 없음"
+
+#: pg_dumpall.c:444 pg_dumpall.c:1587
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "\"%s\" 데이터베이스에 접속할 수 없음"
+
+#: pg_dumpall.c:456
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"\"postgres\" 또는 \"template1\" 데이터베이스에 연결할 수 없습니다.\n"
+"다른 데이터베이스를 지정하십시오."
+
+#: pg_dumpall.c:604
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 PostgreSQL 데이터베이스 클러스터를 SQL 스크립트 파일로\n"
+"추출하는 프로그램입니다.\n"
+"\n"
+
+#: pg_dumpall.c:606
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [옵션]...\n"
+
+#: pg_dumpall.c:609
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=파일이름 출력 파일 이름\n"
+
+#: pg_dumpall.c:616
+#, c-format
+msgid ""
+" -c, --clean clean (drop) databases before recreating\n"
+msgstr ""
+" -c, --clean 다시 만들기 전에 데이터베이스 지우기(삭제)\n"
+
+#: pg_dumpall.c:618
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr ""
+" -g, --globals-only 데이터베이스는 제외하고 글로벌 개체만 덤프\n"
+
+#: pg_dumpall.c:619 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner 개체 소유권 복원 건너뛰기\n"
+
+#: pg_dumpall.c:620
+#, c-format
+msgid ""
+" -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr ""
+" -r, --roles-only 데이터베이스나 테이블스페이스는 제외하고 역할"
+"만 덤프\n"
+
+#: pg_dumpall.c:622
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NAME 덤프에 사용할 슈퍼유저 사용자 이름\n"
+
+#: pg_dumpall.c:623
+#, c-format
+msgid ""
+" -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr ""
+" -t, --tablespaces-only 데이터베이스나 역할은 제외하고 테이블스페이스"
+"만 덤프\n"
+
+#: pg_dumpall.c:629
+#, c-format
+msgid ""
+" --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr ""
+" --exclude-database=PATTERN 해당 PATTERN에 일치하는 데이터베이스 제외\n"
+
+#: pg_dumpall.c:636
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords 롤용 비밀번호를 덤프하지 않음\n"
+
+#: pg_dumpall.c:652
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=접속문자열 서버 접속 문자열\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=DBNAME 대체용 기본 데이터베이스\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the "
+"standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"-f/--file을 사용하지 않으면 SQL 스크립트가 표준\n"
+"출력에 쓰여집니다.\n"
+"\n"
+
+#: pg_dumpall.c:803
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "롤 이름이 \"pg_\"로 시작함, 무시함: (%s)"
+
+#: pg_dumpall.c:1018
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "ACL 목록 (%s)을 분석할 수 없음, 해당 매개변수 \"%s\""
+
+#: pg_dumpall.c:1136
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "테이블스페이스 용 ACL 목록 (%s)을 분석할 수 없음, 해당개체 \"%s\""
+
+#: pg_dumpall.c:1343
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "\"%s\" 데이터베이스를 제외하는 중"
+
+#: pg_dumpall.c:1347
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "\"%s\" 데이터베이스 덤프 중"
+
+#: pg_dumpall.c:1378
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "\"%s\" 데이터베이스에서 pg_dump 작업 중에 오류가 발생, 끝냅니다."
+
+#: pg_dumpall.c:1384
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "\"%s\" 출력 파일을 다시 열 수 없음: %m"
+
+#: pg_dumpall.c:1425
+#, c-format
+msgid "running \"%s\""
+msgstr "\"%s\" 가동중"
+
+#: pg_dumpall.c:1630
+#, c-format
+msgid "could not get server version"
+msgstr "서버 버전을 알 수 없음"
+
+#: pg_dumpall.c:1633
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "\"%s\" 서버 버전을 분석할 수 없음"
+
+#: pg_dumpall.c:1703 pg_dumpall.c:1726
+#, c-format
+msgid "executing %s"
+msgstr "실행중: %s"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "-d/--dbname 옵션 또는 -f/--file 옵션 중 하나를 지정해야 함"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "-d/--dbname 옵션과 -f/--file 옵션은 함께 사용할 수 없음"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "-C/--clean 옵션과 -1/--single-transaction 옵션은 함께 사용할 수 없음"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "--single-transaction 및 병렬 작업을 함께 지정할 수는 없음"
+
+#: pg_restore.c:380
+#, c-format
+msgid ""
+"unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr ""
+"알 수 없는 아카이브 형식: \"%s\"; 사용할 수 있는 값: \"c\", \"d\", \"t\""
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "복원작업에서의 오류들이 무시되었음: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 pg_dump로 만들어진 자료파일로 PostgreSQL 데이터베이스에\n"
+"그 자료를 일괄 입력합니다.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [옵션]... [파일]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NAME 접속할 데이터베이스 이름\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FILENAME 출력 파일 이름 (표준 출력: -)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t 백업 파일 형식 (지정하지 않으면 자동분석)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list 자료의 요약된 목차를 보여줌\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose 자세한 정보 보여줌\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"리스토어 처리를 위한 옵션들:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only 스키마는 빼고 자료만 입력함\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create 작업 대상 데이터베이스를 만듦\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr ""
+" -e, --exit-on-error 오류가 생기면 끝냄, 기본은 계속 진행함\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAME 지정한 인덱스 만듦\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM 여러 병렬 작업을 사용하여 복원\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=FILENAME 출력을 선택하고 해당 순서를 지정하기 위해\n"
+" 이 파일의 목차 사용\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME 해당 스키마의 개체들만 복원함\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME 해당 스키마의 개체들은 복원 안함\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAME(args) 지정한 함수 만듦\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only 자료구조(스키마)만 만듦\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid ""
+" -S, --superuser=NAME superuser user name to use for disabling "
+"triggers\n"
+msgstr ""
+" -S, --superuser=NAME 트리거를 사용하지 않기 위해 사용할 슈퍼유저\n"
+" 사용자 이름\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid ""
+" -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NAME 복원할 객체 이름 (테이블, 뷰, 기타)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NAME 지정한 트리거 만듦\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid ""
+" -x, --no-privileges skip restoration of access privileges (grant/"
+"revoke)\n"
+msgstr " -x, --no-privileges 접근 권한(grant/revoke) 지정 안함\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction 하나의 트랜잭션 작업으로 복원함\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security 로우 보안 활성화\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments 코멘트는 복원하지 않음\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not "
+"be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables 만들 수 없는 테이블에 대해서는 자료를 덤프하"
+"지 않음\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications 발행 정보는 복원 안함\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels 보안 라벨을 복원하지 않음\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions 구독 정보는 복원 안함\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method 테이블 접근 방법 복원 안함\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces 테이블스페이스 할당을 복원하지 않음\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid ""
+" --section=SECTION restore named section (pre-data, data, or "
+"post-data)\n"
+msgstr ""
+" --section=SECTION 지정한 섹션만 복원함\n"
+" 섹션 종류: pre-data, data, post-data\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME 복원 전에 SET ROLE 수행\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and "
+"specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"-I, -n, -N, -P, -t, -T, --section 옵션은 그 대상이 되는 객체를 복수로 지정하"
+"기\n"
+"위해서 여러번 사용할 수 있습니다.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"사용할 입력 파일을 지정하지 않았다면, 표준 입력(stdin)을 사용합니다.\n"
+"\n"
diff --git a/src/bin/pg_dump/po/ru.po b/src/bin/pg_dump/po/ru.po
new file mode 100644
index 0000000..0738e01
--- /dev/null
+++ b/src/bin/pg_dump/po/ru.po
@@ -0,0 +1,3452 @@
+# Russian message translation file for pg_dump
+# Copyright (C) 2001-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Serguei A. Mokhov <mokhov@cs.concordia.ca>, 2001-2005.
+# Oleg Bartunov <oleg@sai.msu.su>, 2004.
+# Sergey Burladyan <eshkinkot@gmail.com>, 2012.
+# Dmitriy Olshevskiy <olshevskiy87@bk.ru>, 2014.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 09:09+0300\n"
+"PO-Revision-Date: 2023-08-30 14:18+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробности: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подсказка: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "не удалось определить текущий каталог: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "неверный исполняемый файл \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "не удалось прочитать исполняемый файл \"%s\""
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "не удалось найти запускаемый файл \"%s\""
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "не удалось перейти в каталог \"%s\": %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "не удалось прочитать символическую ссылку \"%s\": %m"
+
+#: ../../common/exec.c:422 parallel.c:1611
+#, c-format
+msgid "%s() failed: %m"
+msgstr "ошибка в %s(): %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "нехватка памяти"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памяти\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "неисполняемая команда"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "команда не найдена"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "дочерний процесс завершился с кодом возврата %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "дочерний процесс прерван исключением 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "дочерний процесс завершён по сигналу %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "дочерний процесс завершился с нераспознанным состоянием %d"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неверное значение \"%s\" для параметра %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "значение %s должно быть в диапазоне %d..%d"
+
+#: common.c:134
+#, c-format
+msgid "reading extensions"
+msgstr "чтение расширений"
+
+#: common.c:137
+#, c-format
+msgid "identifying extension members"
+msgstr "выявление членов расширений"
+
+#: common.c:140
+#, c-format
+msgid "reading schemas"
+msgstr "чтение схем"
+
+#: common.c:149
+#, c-format
+msgid "reading user-defined tables"
+msgstr "чтение пользовательских таблиц"
+
+#: common.c:154
+#, c-format
+msgid "reading user-defined functions"
+msgstr "чтение пользовательских функций"
+
+#: common.c:158
+#, c-format
+msgid "reading user-defined types"
+msgstr "чтение пользовательских типов"
+
+#: common.c:162
+#, c-format
+msgid "reading procedural languages"
+msgstr "чтение процедурных языков"
+
+#: common.c:165
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "чтение пользовательских агрегатных функций"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined operators"
+msgstr "чтение пользовательских операторов"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "чтение пользовательских методов доступа"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "чтение пользовательских классов операторов"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "чтение пользовательских семейств операторов"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "чтение пользовательских анализаторов текстового поиска"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "чтение пользовательских шаблонов текстового поиска"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "чтение пользовательских словарей текстового поиска"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "чтение пользовательских конфигураций текстового поиска"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "чтение пользовательских оболочек сторонних данных"
+
+#: common.c:195
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "чтение пользовательских сторонних серверов"
+
+#: common.c:198
+#, c-format
+msgid "reading default privileges"
+msgstr "чтение прав по умолчанию"
+
+#: common.c:201
+#, c-format
+msgid "reading user-defined collations"
+msgstr "чтение пользовательских правил сортировки"
+
+#: common.c:204
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "чтение пользовательских преобразований"
+
+#: common.c:207
+#, c-format
+msgid "reading type casts"
+msgstr "чтение приведений типов"
+
+#: common.c:210
+#, c-format
+msgid "reading transforms"
+msgstr "чтение преобразований"
+
+#: common.c:213
+#, c-format
+msgid "reading table inheritance information"
+msgstr "чтение информации о наследовании таблиц"
+
+#: common.c:216
+#, c-format
+msgid "reading event triggers"
+msgstr "чтение событийных триггеров"
+
+#: common.c:220
+#, c-format
+msgid "finding extension tables"
+msgstr "поиск таблиц расширений"
+
+#: common.c:224
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "поиск связей наследования"
+
+#: common.c:227
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "чтение информации о столбцах интересующих таблиц"
+
+#: common.c:230
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "пометка наследованных столбцов в подтаблицах"
+
+#: common.c:233
+#, c-format
+msgid "reading partitioning data"
+msgstr "чтение информации о секционировании"
+
+#: common.c:236
+#, c-format
+msgid "reading indexes"
+msgstr "чтение индексов"
+
+#: common.c:239
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "пометка индексов в секционированных таблицах"
+
+#: common.c:242
+#, c-format
+msgid "reading extended statistics"
+msgstr "чтение расширенной статистики"
+
+#: common.c:245
+#, c-format
+msgid "reading constraints"
+msgstr "чтение ограничений"
+
+#: common.c:248
+#, c-format
+msgid "reading triggers"
+msgstr "чтение триггеров"
+
+#: common.c:251
+#, c-format
+msgid "reading rewrite rules"
+msgstr "чтение правил перезаписи"
+
+#: common.c:254
+#, c-format
+msgid "reading policies"
+msgstr "чтение политик"
+
+#: common.c:257
+#, c-format
+msgid "reading publications"
+msgstr "чтение публикаций"
+
+#: common.c:260
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "чтение информации о таблицах, включённых в публикации"
+
+#: common.c:263
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "чтение информации о схемах, включённых в публикации"
+
+#: common.c:266
+#, c-format
+msgid "reading subscriptions"
+msgstr "чтение подписок"
+
+#: common.c:345
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "неверное число родителей (%d) для таблицы \"%s\""
+
+#: common.c:1006
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr ""
+"нарушение целостности: родительская таблица с OID %u для таблицы \"%s\" (OID "
+"%u) не найдена"
+
+#: common.c:1045
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "не удалось разобрать числовой массив \"%s\": слишком много чисел"
+
+#: common.c:1057
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "не удалось разобрать числовой массив \"%s\": неверный символ в числе"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "неверный код сжатия: %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504
+#: compress_io.c:547
+#, c-format
+msgid "not built with zlib support"
+msgstr "программа собрана без поддержки zlib"
+
+#: compress_io.c:236 compress_io.c:333
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "не удалось инициализировать библиотеку сжатия: %s"
+
+#: compress_io.c:256
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "не удалось закрыть поток сжатых данных: %s"
+
+#: compress_io.c:273
+#, c-format
+msgid "could not compress data: %s"
+msgstr "не удалось сжать данные: %s"
+
+#: compress_io.c:349 compress_io.c:364
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "не удалось распаковать данные: %s"
+
+#: compress_io.c:371
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "не удалось закрыть библиотеку сжатия: %s"
+
+#: compress_io.c:584 compress_io.c:621
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "не удалось прочитать входной файл: %s"
+
+#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553
+#: pg_backup_tar.c:726 pg_backup_tar.c:749
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "не удалось прочитать входной файл: конец файла"
+
+#: parallel.c:253
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "ошибка в %s() (код ошибки: %d)"
+
+#: parallel.c:961
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "не удалось создать каналы межпроцессного взаимодействия: %m"
+
+#: parallel.c:1018
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "не удалось создать рабочий процесс: %m"
+
+#: parallel.c:1148
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "от ведущего процесса получена нераспознанная команда: \"%s\""
+
+#: parallel.c:1191 parallel.c:1429
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "от рабочего процесса получено ошибочное сообщение: \"%s\""
+
+#: parallel.c:1323
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the "
+"table after the pg_dump parent process had gotten the initial ACCESS SHARE "
+"lock on the table."
+msgstr ""
+"не удалось получить блокировку отношения \"%s\".\n"
+"Обычно это означает, что кто-то запросил блокировку ACCESS EXCLUSIVE для "
+"этой таблицы после того, как родительский процесс pg_dump получил для неё "
+"начальную блокировку ACCESS SHARE."
+
+#: parallel.c:1412
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "рабочий процесс неожиданно прервался"
+
+#: parallel.c:1534 parallel.c:1652
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "не удалось записать в канал взаимодействия: %m"
+
+#: parallel.c:1736
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: не удалось создать сокет (код ошибки: %d)"
+
+#: parallel.c:1747
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: не удалось привязаться к сокету (код ошибки: %d)"
+
+#: parallel.c:1754
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: не удалось начать приём (код ошибки: %d)"
+
+#: parallel.c:1761
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: ошибка в %s() (код ошибки: %d)"
+
+#: parallel.c:1772
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: не удалось создать второй сокет (код ошибки: %d)"
+
+#: parallel.c:1781
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: не удалось подключить сокет (код ошибки: %d)"
+
+#: parallel.c:1790
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: не удалось принять соединение (код ошибки: %d)"
+
+#: pg_backup_archiver.c:280 pg_backup_archiver.c:1632
+#, c-format
+msgid "could not close output file: %m"
+msgstr "не удалось закрыть выходной файл: %m"
+
+#: pg_backup_archiver.c:324 pg_backup_archiver.c:328
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "в последовательности элементов архива нарушен порядок разделов"
+
+#: pg_backup_archiver.c:334
+#, c-format
+msgid "unexpected section code %d"
+msgstr "неожиданный код раздела %d"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr ""
+"параллельное восстановление не поддерживается с выбранным форматом архивного "
+"файла"
+
+#: pg_backup_archiver.c:375
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr ""
+"параллельное восстановление возможно только для архивов, созданных pg_dump "
+"версии 8.0 и новее"
+
+#: pg_backup_archiver.c:393
+#, c-format
+msgid ""
+"cannot restore from compressed archive (compression not supported in this "
+"installation)"
+msgstr ""
+"восстановить данные из сжатого архива нельзя (установленная версия не "
+"поддерживает сжатие)"
+
+#: pg_backup_archiver.c:410
+#, c-format
+msgid "connecting to database for restore"
+msgstr "подключение к базе данных для восстановления"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr ""
+"прямые подключения к базе данных не поддерживаются в архивах до версии 1.3"
+
+#: pg_backup_archiver.c:455
+#, c-format
+msgid "implied data-only restore"
+msgstr "подразумевается восстановление только данных"
+
+#: pg_backup_archiver.c:521
+#, c-format
+msgid "dropping %s %s"
+msgstr "удаляется %s %s"
+
+#: pg_backup_archiver.c:621
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "не удалось определить, куда добавить IF EXISTS в оператор \"%s\""
+
+#: pg_backup_archiver.c:777 pg_backup_archiver.c:779
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "предупреждение из исходного файла: %s"
+
+#: pg_backup_archiver.c:794
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "создаётся %s \"%s.%s\""
+
+#: pg_backup_archiver.c:797
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "создаётся %s \"%s\""
+
+#: pg_backup_archiver.c:847
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "подключение к новой базе данных \"%s\""
+
+#: pg_backup_archiver.c:874
+#, c-format
+msgid "processing %s"
+msgstr "обрабатывается %s"
+
+#: pg_backup_archiver.c:896
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "обрабатываются данные таблицы \"%s.%s\""
+
+#: pg_backup_archiver.c:966
+#, c-format
+msgid "executing %s %s"
+msgstr "выполняется %s %s"
+
+#: pg_backup_archiver.c:1005
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "отключаются триггеры таблицы %s"
+
+#: pg_backup_archiver.c:1031
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "включаются триггеры таблицы %s"
+
+#: pg_backup_archiver.c:1096
+#, c-format
+msgid ""
+"internal error -- WriteData cannot be called outside the context of a "
+"DataDumper routine"
+msgstr ""
+"внутренняя ошибка -- WriteData нельзя вызывать вне контекста процедуры "
+"DataDumper"
+
+#: pg_backup_archiver.c:1279
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "выбранный формат не поддерживает выгрузку больших объектов"
+
+#: pg_backup_archiver.c:1337
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "восстановлен %d большой объект"
+msgstr[1] "восстановлено %d больших объекта"
+msgstr[2] "восстановлено %d больших объектов"
+
+#: pg_backup_archiver.c:1358 pg_backup_tar.c:669
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "восстановление большого объекта с OID %u"
+
+#: pg_backup_archiver.c:1370
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "не удалось создать большой объект %u: %s"
+
+#: pg_backup_archiver.c:1375 pg_dump.c:3607
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "не удалось открыть большой объект %u: %s"
+
+#: pg_backup_archiver.c:1431
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "не удалось открыть файл оглавления \"%s\": %m"
+
+#: pg_backup_archiver.c:1459
+#, c-format
+msgid "line ignored: %s"
+msgstr "строка проигнорирована: %s"
+
+#: pg_backup_archiver.c:1466
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "не найдена запись для ID %d"
+
+#: pg_backup_archiver.c:1489 pg_backup_directory.c:222
+#: pg_backup_directory.c:599
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "не удалось закрыть файл оглавления: %m"
+
+#: pg_backup_archiver.c:1603 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:586 pg_backup_directory.c:649
+#: pg_backup_directory.c:668 pg_dumpall.c:476
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "не удалось открыть выходной файл \"%s\": %m"
+
+#: pg_backup_archiver.c:1605 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "не удалось открыть выходной файл: %m"
+
+#: pg_backup_archiver.c:1699
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "записан %zu байт данных большого объекта (результат = %d)"
+msgstr[1] "записано %zu байта данных большого объекта (результат = %d)"
+msgstr[2] "записано %zu байт данных большого объекта (результат = %d)"
+
+#: pg_backup_archiver.c:1705
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "не удалось записать данные в большой объект: %s"
+
+#: pg_backup_archiver.c:1795
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "при инициализации:"
+
+#: pg_backup_archiver.c:1800
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "при обработке оглавления:"
+
+#: pg_backup_archiver.c:1805
+#, c-format
+msgid "while FINALIZING:"
+msgstr "при завершении:"
+
+#: pg_backup_archiver.c:1810
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "из записи оглавления %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1886
+#, c-format
+msgid "bad dumpId"
+msgstr "неверный dumpId"
+
+#: pg_backup_archiver.c:1907
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "неверный dumpId таблицы в элементе TABLE DATA"
+
+#: pg_backup_archiver.c:1999
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "неожиданный флаг смещения данных: %d"
+
+#: pg_backup_archiver.c:2012
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "слишком большое смещение в файле выгрузки"
+
+#: pg_backup_archiver.c:2150 pg_backup_archiver.c:2160
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "слишком длинное имя каталога: \"%s\""
+
+#: pg_backup_archiver.c:2168
+#, c-format
+msgid ""
+"directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not "
+"exist)"
+msgstr "каталог \"%s\" не похож на архивный (в нём отсутствует \"toc.dat\")"
+
+#: pg_backup_archiver.c:2176 pg_backup_custom.c:173 pg_backup_custom.c:807
+#: pg_backup_directory.c:207 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "не удалось открыть входной файл \"%s\": %m"
+
+#: pg_backup_archiver.c:2183 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "не удалось открыть входной файл: %m"
+
+#: pg_backup_archiver.c:2189
+#, c-format
+msgid "could not read input file: %m"
+msgstr "не удалось прочитать входной файл: %m"
+
+#: pg_backup_archiver.c:2191
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "входной файл слишком короткий (прочитано байт: %lu, ожидалось: 5)"
+
+#: pg_backup_archiver.c:2223
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr ""
+"входной файл, видимо, имеет текстовый формат. Загрузите его с помощью psql."
+
+#: pg_backup_archiver.c:2229
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "входной файл не похож на архив (возможно, слишком мал?)"
+
+#: pg_backup_archiver.c:2235
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "входной файл не похож на архив"
+
+#: pg_backup_archiver.c:2244
+#, c-format
+msgid "could not close input file: %m"
+msgstr "не удалось закрыть входной файл: %m"
+
+#: pg_backup_archiver.c:2361
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "неопознанный формат файла: \"%d\""
+
+#: pg_backup_archiver.c:2443 pg_backup_archiver.c:4523
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "закончен объект %d %s %s"
+
+#: pg_backup_archiver.c:2447 pg_backup_archiver.c:4536
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "рабочий процесс завершился с кодом возврата %d"
+
+#: pg_backup_archiver.c:2568
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "ID записи %d вне диапазона - возможно повреждено оглавление"
+
+#: pg_backup_archiver.c:2648
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "восстановление таблиц со свойством WITH OIDS больше не поддерживается"
+
+#: pg_backup_archiver.c:2730
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "нераспознанная кодировка \"%s\""
+
+#: pg_backup_archiver.c:2735
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "неверный элемент ENCODING: %s"
+
+#: pg_backup_archiver.c:2753
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "неверный элемент STDSTRINGS: %s"
+
+#: pg_backup_archiver.c:2778
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "схема \"%s\" не найдена"
+
+#: pg_backup_archiver.c:2785
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "таблица \"%s\" не найдена"
+
+#: pg_backup_archiver.c:2792
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "индекс \"%s\" не найден"
+
+#: pg_backup_archiver.c:2799
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "функция \"%s\" не найдена"
+
+#: pg_backup_archiver.c:2806
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "триггер \"%s\" не найден"
+
+#: pg_backup_archiver.c:3221
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "не удалось переключить пользователя сеанса на \"%s\": %s"
+
+#: pg_backup_archiver.c:3358
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "не удалось присвоить search_path значение \"%s\": %s"
+
+#: pg_backup_archiver.c:3420
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "не удалось задать для default_tablespace значение %s: %s"
+
+#: pg_backup_archiver.c:3470
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "не удалось задать default_table_access_method: %s"
+
+#: pg_backup_archiver.c:3564 pg_backup_archiver.c:3729
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "неизвестно, как назначить владельца для объекта типа \"%s\""
+
+#: pg_backup_archiver.c:3832
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "в заголовке файла не найдена нужная сигнатура"
+
+#: pg_backup_archiver.c:3846
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "неподдерживаемая версия (%d.%d) в заголовке файла"
+
+#: pg_backup_archiver.c:3851
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "несоответствие размера integer (%lu)"
+
+#: pg_backup_archiver.c:3855
+#, c-format
+msgid ""
+"archive was made on a machine with larger integers, some operations might "
+"fail"
+msgstr ""
+"архив был сделан на компьютере большей разрядности -- возможен сбой "
+"некоторых операций"
+
+#: pg_backup_archiver.c:3865
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "ожидаемый формат (%d) отличается от формата, указанного в файле (%d)"
+
+#: pg_backup_archiver.c:3880
+#, c-format
+msgid ""
+"archive is compressed, but this installation does not support compression -- "
+"no data will be available"
+msgstr ""
+"архив сжат, но установленная версия не поддерживает сжатие -- данные "
+"недоступны"
+
+#: pg_backup_archiver.c:3914
+#, c-format
+msgid "invalid creation date in header"
+msgstr "неверная дата создания в заголовке"
+
+#: pg_backup_archiver.c:4048
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "обработка объекта %d %s %s"
+
+#: pg_backup_archiver.c:4127
+#, c-format
+msgid "entering main parallel loop"
+msgstr "вход в основной параллельный цикл"
+
+#: pg_backup_archiver.c:4138
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "объект %d %s %s пропускается"
+
+#: pg_backup_archiver.c:4147
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "объект %d %s %s запускается"
+
+#: pg_backup_archiver.c:4201
+#, c-format
+msgid "finished main parallel loop"
+msgstr "основной параллельный цикл закончен"
+
+#: pg_backup_archiver.c:4237
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "обработка пропущенного объекта %d %s %s"
+
+#: pg_backup_archiver.c:4842
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "создать таблицу \"%s\" не удалось, её данные не будут восстановлены"
+
+#: pg_backup_custom.c:376 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "неверный OID большого объекта"
+
+#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629
+#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021
+#, c-format
+msgid "error during file seek: %m"
+msgstr "ошибка при перемещении в файле: %m"
+
+#: pg_backup_custom.c:478
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "в блоке данных %d задана неверная позиция"
+
+#: pg_backup_custom.c:495
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "нераспознанный тип блока данных (%d) при поиске архива"
+
+#: pg_backup_custom.c:517
+#, c-format
+msgid ""
+"could not find block ID %d in archive -- possibly due to out-of-order "
+"restore request, which cannot be handled due to non-seekable input file"
+msgstr ""
+"не удалось найти в архиве блок с ID %d -- возможно, по причине не "
+"последовательного запроса восстановления, который нельзя обработать с "
+"файлом, не допускающим произвольный доступ"
+
+#: pg_backup_custom.c:522
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "не удалось найти в архиве блок с ID %d -- возможно, архив испорчен"
+
+#: pg_backup_custom.c:529
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "при чтении данных получен неожиданный ID блока (%d) -- ожидался: %d"
+
+#: pg_backup_custom.c:543
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "нераспознанный тип блока данных %d при восстановлении архива"
+
+#: pg_backup_custom.c:645
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "не удалось прочитать входной файл: %m"
+
+#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943
+#: pg_backup_tar.c:1019
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "не удалось определить позицию в файле архива: %m"
+
+#: pg_backup_custom.c:762 pg_backup_custom.c:802
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "не удалось закрыть файл архива: %m"
+
+#: pg_backup_custom.c:785
+#, c-format
+msgid "can only reopen input archives"
+msgstr "повторно открыть можно только входные файлы"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "параллельное восстановление из стандартного ввода не поддерживается"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr ""
+"параллельное восстановление возможно только с файлом произвольного доступа"
+
+#: pg_backup_custom.c:810
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "не удалось задать текущую позицию в файле архива: %m"
+
+#: pg_backup_custom.c:889
+#, c-format
+msgid "compressor active"
+msgstr "сжатие активно"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "не удалось получить версию сервера из libpq"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1646
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "продолжение работы с другой версией сервера невозможно"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1647
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "версия сервера: %s; версия %s: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "подключение к базе данных уже установлено"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595
+msgid "Password: "
+msgstr "Пароль: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "не удалось переподключиться к базе"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "переподключиться не удалось: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1520 pg_dumpall.c:1604
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732
+#, c-format
+msgid "query failed: %s"
+msgstr "ошибка при выполнении запроса: %s"
+
+#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733
+#, c-format
+msgid "Query was: %s"
+msgstr "Выполнялся запрос: %s"
+
+#: pg_backup_db.c:316
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "запрос вернул %d строку вместо одной: %s"
+msgstr[1] "запрос вернул %d строки вместо одной: %s"
+msgstr[2] "запрос вернул %d строк вместо одной: %s"
+
+# skip-rule: language-mix
+#: pg_backup_db.c:352
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sВыполнялась команда: %s"
+
+#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489
+msgid "could not execute query"
+msgstr "не удалось выполнить запрос"
+
+#: pg_backup_db.c:461
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "ошибка в PQputCopyData: %s"
+
+#: pg_backup_db.c:510
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "ошибка в PQputCopyEnd: %s"
+
+#: pg_backup_db.c:516
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "сбой команды COPY для таблицы \"%s\": %s"
+
+#: pg_backup_db.c:522 pg_dump.c:2106
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "неожиданные лишние результаты получены при COPY для таблицы \"%s\""
+
+#: pg_backup_db.c:534
+msgid "could not start database transaction"
+msgstr "не удаётся начать транзакцию"
+
+#: pg_backup_db.c:542
+msgid "could not commit database transaction"
+msgstr "не удалось зафиксировать транзакцию"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "выходной каталог не указан"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не удалось прочитать каталог \"%s\": %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не удалось закрыть каталог \"%s\": %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не удалось создать каталог \"%s\": %m"
+
+#: pg_backup_directory.c:355 pg_backup_directory.c:497
+#: pg_backup_directory.c:533
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "не удалось записать в выходной файл: %s"
+
+#: pg_backup_directory.c:373
+#, c-format
+msgid "could not close data file: %m"
+msgstr "не удалось закрыть файл данных: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "не удалось закрыть файл данных \"%s\": %m"
+
+#: pg_backup_directory.c:447
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr ""
+"не удалось открыть для чтения файл оглавления больших объектов \"%s\": %m"
+
+#: pg_backup_directory.c:458
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "неверная строка в файле оглавления больших объектов \"%s\": \"%s\""
+
+#: pg_backup_directory.c:467
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "ошибка чтения файла оглавления больших объектов \"%s\""
+
+#: pg_backup_directory.c:471
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "не удалось закрыть файл оглавления больших объектов \"%s\": %m"
+
+#: pg_backup_directory.c:685
+#, c-format
+msgid "could not close blob data file: %m"
+msgstr "не удалось закрыть файл данных BLOB: %m"
+
+#: pg_backup_directory.c:691
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "не удалось записать в файл оглавления больших объектов"
+
+#: pg_backup_directory.c:705
+#, c-format
+msgid "could not close blobs TOC file: %m"
+msgstr "не удалось закрыть файл оглавления BLOB: %m"
+
+#: pg_backup_directory.c:724
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "слишком длинное имя файла: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "этот формат нельзя прочитать"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "не удалось открыть для записи файл оглавления \"%s\": %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "не удалось открыть для записи файл оглавления: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:893
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "формат архива tar не поддерживает сжатие"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "не удалось открыть для чтения файл оглавления \"%s\": %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "не удалось открыть для чтения файл оглавления: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "не удалось найти файл \"%s\" в архиве"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "не удалось получить имя для временного файла: %m"
+
+#: pg_backup_tar.c:624
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "недопустимый синтаксис оператора COPY: \"%s\""
+
+#: pg_backup_tar.c:890
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "неверный OID для большого объекта (%u)"
+
+#: pg_backup_tar.c:1035
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "не удалось закрыть временный файл: %m"
+
+#: pg_backup_tar.c:1038
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "действительная длина файла (%lld) не равна ожидаемой (%lld)"
+
+#: pg_backup_tar.c:1084 pg_backup_tar.c:1115
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "в архиве tar не найден заголовок для файла \"%s\""
+
+#: pg_backup_tar.c:1102
+#, c-format
+msgid ""
+"restoring data out of order is not supported in this archive format: \"%s\" "
+"is required, but comes before \"%s\" in the archive file."
+msgstr ""
+"непоследовательное восстановление данных для данного формата архива не "
+"поддерживается: требуется компонент \"%s\", но в файле архива прежде идёт "
+"\"%s\"."
+
+#: pg_backup_tar.c:1149
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "найден неполный заголовок tar (размер %lu байт)"
+msgstr[1] "найден неполный заголовок tar (размер %lu байта)"
+msgstr[2] "найден неполный заголовок tar (размер %lu байт)"
+
+#: pg_backup_tar.c:1188
+#, c-format
+msgid ""
+"corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr ""
+"заголовок tar в %s повреждён (ожидалось: %d, получено: %d), позиция в файле: "
+"%llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "нераспознанное имя раздела: \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:628 pg_dump.c:645 pg_dumpall.c:340
+#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373
+#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Для дополнительной информации попробуйте \"%s --help\"."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "превышен предел обработчиков штатного выхода"
+
+#: pg_dump.c:643 pg_dumpall.c:348 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "слишком много аргументов командной строки (первый: \"%s\")"
+
+#: pg_dump.c:662 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "параметры -s/--schema-only и -a/--data-only исключают друг друга"
+
+#: pg_dump.c:665
+#, c-format
+msgid ""
+"options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr ""
+"параметры -s/--schema-only и --include-foreign-data исключают друг друга"
+
+#: pg_dump.c:668
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr ""
+"параметр --include-foreign-data не поддерживается при копировании в "
+"параллельном режиме"
+
+#: pg_dump.c:671 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "параметры -c/--clean и -a/--data-only исключают друг друга"
+
+#: pg_dump.c:674 pg_dumpall.c:378 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "параметр --if-exists требует указания -c/--clean"
+
+#: pg_dump.c:681
+#, c-format
+msgid ""
+"option --on-conflict-do-nothing requires option --inserts, --rows-per-"
+"insert, or --column-inserts"
+msgstr ""
+"параметр --on-conflict-do-nothing требует указания --inserts, --rows-per-"
+"insert или --column-inserts"
+
+#: pg_dump.c:703
+#, c-format
+msgid ""
+"requested compression not available in this installation -- archive will be "
+"uncompressed"
+msgstr ""
+"установленная версия программы не поддерживает сжатие -- архив не будет "
+"сжиматься"
+
+#: pg_dump.c:716
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr ""
+"параллельное резервное копирование поддерживается только с форматом "
+"\"каталог\""
+
+#: pg_dump.c:762
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "последний системный OID: %u"
+
+#: pg_dump.c:771
+#, c-format
+msgid "no matching schemas were found"
+msgstr "соответствующие схемы не найдены"
+
+#: pg_dump.c:785
+#, c-format
+msgid "no matching tables were found"
+msgstr "соответствующие таблицы не найдены"
+
+#: pg_dump.c:807
+#, c-format
+msgid "no matching extensions were found"
+msgstr "соответствующие расширения не найдены"
+
+#: pg_dump.c:990
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s сохраняет резервную копию БД в текстовом файле или другом виде.\n"
+"\n"
+
+#: pg_dump.c:991 pg_dumpall.c:605 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "Использование:\n"
+
+#: pg_dump.c:992
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [ПАРАМЕТР]... [ИМЯ_БД]\n"
+
+#: pg_dump.c:994 pg_dumpall.c:608 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Общие параметры:\n"
+
+#: pg_dump.c:995
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=ИМЯ имя выходного файла или каталога\n"
+
+#: pg_dump.c:996
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p формат выводимых данных\n"
+" (пользовательский | каталог | tar |\n"
+" текстовый (по умолчанию))\n"
+
+#: pg_dump.c:998
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr ""
+" -j, --jobs=ЧИСЛО распараллелить копирование на указанное "
+"число\n"
+" заданий\n"
+
+#: pg_dump.c:999 pg_dumpall.c:610
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose режим подробных сообщений\n"
+
+#: pg_dump.c:1000 pg_dumpall.c:611
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: pg_dump.c:1001
+#, c-format
+msgid ""
+" -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 уровень сжатия при архивации\n"
+
+#: pg_dump.c:1002 pg_dumpall.c:612
+#, c-format
+msgid ""
+" --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr ""
+" --lock-wait-timeout=ТАЙМ-АУТ прервать операцию при тайм-ауте блокировки "
+"таблицы\n"
+
+#: pg_dump.c:1003 pg_dumpall.c:639
+#, c-format
+msgid ""
+" --no-sync do not wait for changes to be written safely "
+"to disk\n"
+msgstr ""
+" --no-sync не ждать надёжного сохранения изменений на "
+"диске\n"
+
+#: pg_dump.c:1004 pg_dumpall.c:613
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: pg_dump.c:1006 pg_dumpall.c:614
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Параметры, управляющие выводом:\n"
+
+#: pg_dump.c:1007 pg_dumpall.c:615
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only выгрузить только данные, без схемы\n"
+
+#: pg_dump.c:1008
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs выгрузить также большие объекты\n"
+
+#: pg_dump.c:1009
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs исключить из выгрузки большие объекты\n"
+
+#: pg_dump.c:1010 pg_restore.c:447
+#, c-format
+msgid ""
+" -c, --clean clean (drop) database objects before "
+"recreating\n"
+msgstr ""
+" -c, --clean очистить (удалить) объекты БД при "
+"восстановлении\n"
+
+#: pg_dump.c:1011
+#, c-format
+msgid ""
+" -C, --create include commands to create database in dump\n"
+msgstr ""
+" -C, --create добавить в копию команды создания базы "
+"данных\n"
+
+#: pg_dump.c:1012
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr ""
+" -e, --extension=ШАБЛОН выгрузить только указанное расширение(я)\n"
+
+#: pg_dump.c:1013 pg_dumpall.c:617
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=КОДИРОВКА выгружать данные в заданной кодировке\n"
+
+#: pg_dump.c:1014
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=ШАБЛОН выгрузить только указанную схему(ы)\n"
+
+#: pg_dump.c:1015
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=ШАБЛОН НЕ выгружать указанную схему(ы)\n"
+
+#: pg_dump.c:1016
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner не восстанавливать владение объектами\n"
+" при использовании текстового формата\n"
+
+#: pg_dump.c:1018 pg_dumpall.c:621
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only выгрузить только схему, без данных\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid ""
+" -S, --superuser=NAME superuser user name to use in plain-text "
+"format\n"
+msgstr ""
+" -S, --superuser=ИМЯ имя пользователя, который будет задействован\n"
+" при восстановлении из текстового формата\n"
+
+#: pg_dump.c:1020
+#, c-format
+msgid " -t, --table=PATTERN dump the specified table(s) only\n"
+msgstr " -t, --table=ШАБЛОН выгрузить только указанную таблицу(ы)\n"
+
+#: pg_dump.c:1021
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=ШАБЛОН НЕ выгружать указанную таблицу(ы)\n"
+
+#: pg_dump.c:1022 pg_dumpall.c:624
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges не выгружать права (назначение/отзыв)\n"
+
+#: pg_dump.c:1023 pg_dumpall.c:625
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade только для утилит обновления БД\n"
+
+#: pg_dump.c:1024 pg_dumpall.c:626
+#, c-format
+msgid ""
+" --column-inserts dump data as INSERT commands with column "
+"names\n"
+msgstr ""
+" --column-inserts выгружать данные в виде INSERT с именами "
+"столбцов\n"
+
+#: pg_dump.c:1025 pg_dumpall.c:627
+#, c-format
+msgid ""
+" --disable-dollar-quoting disable dollar quoting, use SQL standard "
+"quoting\n"
+msgstr ""
+" --disable-dollar-quoting отключить спецстроки с $, выводить строки\n"
+" по стандарту SQL\n"
+
+#: pg_dump.c:1026 pg_dumpall.c:628 pg_restore.c:464
+#, c-format
+msgid ""
+" --disable-triggers disable triggers during data-only restore\n"
+msgstr ""
+" --disable-triggers отключить триггеры при восстановлении\n"
+" только данных, без схемы\n"
+
+#: pg_dump.c:1027
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user "
+"has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security включить защиту на уровне строк (выгружать "
+"только\n"
+" те данные, которые доступны пользователю)\n"
+
+#: pg_dump.c:1029
+#, c-format
+msgid ""
+" --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr ""
+" --exclude-table-data=ШАБЛОН НЕ выгружать данные указанной таблицы "
+"(таблиц)\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:630
+#, c-format
+msgid ""
+" --extra-float-digits=NUM override default setting for "
+"extra_float_digits\n"
+msgstr ""
+" --extra-float-digits=ЧИСЛО переопределить значение extra_float_digits\n"
+
+#: pg_dump.c:1031 pg_dumpall.c:631 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr ""
+" --if-exists применять IF EXISTS при удалении объектов\n"
+
+#: pg_dump.c:1032
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=ШАБЛОН\n"
+" включать в копию данные сторонних таблиц с\n"
+" серверов с именами, подпадающими под ШАБЛОН\n"
+
+#: pg_dump.c:1035 pg_dumpall.c:632
+#, c-format
+msgid ""
+" --inserts dump data as INSERT commands, rather than "
+"COPY\n"
+msgstr ""
+" --inserts выгрузить данные в виде команд INSERT, не "
+"COPY\n"
+
+#: pg_dump.c:1036 pg_dumpall.c:633
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr ""
+" --load-via-partition-root загружать секции через главную таблицу\n"
+
+#: pg_dump.c:1037 pg_dumpall.c:634
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments не выгружать комментарии\n"
+
+#: pg_dump.c:1038 pg_dumpall.c:635
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications не выгружать публикации\n"
+
+#: pg_dump.c:1039 pg_dumpall.c:637
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr ""
+" --no-security-labels не выгружать назначения меток безопасности\n"
+
+#: pg_dump.c:1040 pg_dumpall.c:638
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions не выгружать подписки\n"
+
+#: pg_dump.c:1041 pg_dumpall.c:640
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method не выгружать табличные методы доступа\n"
+
+#: pg_dump.c:1042 pg_dumpall.c:641
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr ""
+" --no-tablespaces не выгружать назначения табличных "
+"пространств\n"
+
+#: pg_dump.c:1043 pg_dumpall.c:642
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression не выгружать методы сжатия TOAST\n"
+
+#: pg_dump.c:1044 pg_dumpall.c:643
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr ""
+" --no-unlogged-table-data не выгружать данные нежурналируемых таблиц\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:644
+#, c-format
+msgid ""
+" --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT "
+"commands\n"
+msgstr ""
+" --on-conflict-do-nothing добавлять ON CONFLICT DO NOTHING в команды "
+"INSERT\n"
+
+#: pg_dump.c:1046 pg_dumpall.c:645
+#, c-format
+msgid ""
+" --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr ""
+" --quote-all-identifiers заключать в кавычки все идентификаторы,\n"
+" а не только ключевые слова\n"
+
+#: pg_dump.c:1047 pg_dumpall.c:646
+#, c-format
+msgid ""
+" --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr ""
+" --rows-per-insert=ЧИСЛО число строк в одном INSERT; подразумевает --"
+"inserts\n"
+
+#: pg_dump.c:1048
+#, c-format
+msgid ""
+" --section=SECTION dump named section (pre-data, data, or post-"
+"data)\n"
+msgstr ""
+" --section=РАЗДЕЛ выгрузить заданный раздел\n"
+" (pre-data, data или post-data)\n"
+
+#: pg_dump.c:1049
+#, c-format
+msgid ""
+" --serializable-deferrable wait until the dump can run without "
+"anomalies\n"
+msgstr ""
+" --serializable-deferrable дождаться момента для выгрузки данных без "
+"аномалий\n"
+
+#: pg_dump.c:1050
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr ""
+" --snapshot=СНИМОК использовать при выгрузке заданный снимок\n"
+
+#: pg_dump.c:1051 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns "
+"to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names требовать, чтобы при указании шаблона "
+"включения\n"
+" таблицы и/или схемы ему соответствовал "
+"минимум\n"
+" один объект\n"
+
+#: pg_dump.c:1053 pg_dumpall.c:647 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands "
+"instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" устанавливать владельца, используя команды\n"
+" SET SESSION AUTHORIZATION вместо ALTER OWNER\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:651 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Параметры подключения:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=БД имя базы данных для выгрузки\n"
+
+#: pg_dump.c:1059 pg_dumpall.c:653 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=ИМЯ имя сервера баз данных или каталог сокетов\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:655 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=ПОРТ номер порта сервера БД\n"
+
+#: pg_dump.c:1061 pg_dumpall.c:656 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=ИМЯ имя пользователя баз данных\n"
+
+#: pg_dump.c:1062 pg_dumpall.c:657 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password не запрашивать пароль\n"
+
+#: pg_dump.c:1063 pg_dumpall.c:658 pg_restore.c:487
+#, c-format
+msgid ""
+" -W, --password force password prompt (should happen "
+"automatically)\n"
+msgstr ""
+" -W, --password запрашивать пароль всегда (обычно не требуется)\n"
+
+#: pg_dump.c:1064 pg_dumpall.c:659
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ИМЯ_РОЛИ выполнить SET ROLE перед выгрузкой\n"
+
+#: pg_dump.c:1066
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Если имя базы данных не указано, используется переменная окружения "
+"PGDATABASE.\n"
+"\n"
+
+#: pg_dump.c:1068 pg_dumpall.c:663 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Об ошибках сообщайте по адресу <%s>.\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:664 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: pg_dump.c:1088 pg_dumpall.c:488
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "указана неверная клиентская кодировка \"%s\""
+
+#: pg_dump.c:1226
+#, c-format
+msgid ""
+"parallel dumps from standby servers are not supported by this server version"
+msgstr ""
+"выгрузка дампа в параллельном режиме с ведомых серверов не поддерживается "
+"данной версией сервера"
+
+#: pg_dump.c:1291
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "указан неверный формат вывода: \"%s\""
+
+#: pg_dump.c:1332 pg_dump.c:1388 pg_dump.c:1441 pg_dumpall.c:1282
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "неверное полное имя (слишком много компонентов): %s"
+
+#: pg_dump.c:1340
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "схемы, соответствующие шаблону \"%s\", не найдены"
+
+#: pg_dump.c:1393
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "расширения, соответствующие шаблону \"%s\", не найдены"
+
+#: pg_dump.c:1446
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "сторонние серверы, соответствующие шаблону \"%s\", не найдены"
+
+#: pg_dump.c:1509
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "неверное имя отношения (слишком много компонентов): %s"
+
+#: pg_dump.c:1520
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "таблицы, соответствующие шаблону \"%s\", не найдены"
+
+#: pg_dump.c:1547
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "В данный момент вы не подключены к базе данных."
+
+#: pg_dump.c:1550
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "ссылки между базами не реализованы: %s"
+
+#: pg_dump.c:1981
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "выгрузка содержимого таблицы \"%s.%s\""
+
+#: pg_dump.c:2087
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Ошибка выгрузки таблицы \"%s\": сбой в PQgetCopyData()."
+
+#: pg_dump.c:2088 pg_dump.c:2098
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Сообщение об ошибке с сервера: %s"
+
+# skip-rule: language-mix
+#: pg_dump.c:2089 pg_dump.c:2099
+#, c-format
+msgid "Command was: %s"
+msgstr "Выполнялась команда: %s"
+
+#: pg_dump.c:2097
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Ошибка выгрузки таблицы \"%s\": сбой в PQgetResult()."
+
+#: pg_dump.c:2179
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "из таблицы \"%s\" получено неверное количество полей"
+
+#: pg_dump.c:2875
+#, c-format
+msgid "saving database definition"
+msgstr "сохранение определения базы данных"
+
+#: pg_dump.c:2971
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "нераспознанный провайдер локали: %s"
+
+#: pg_dump.c:3317
+#, c-format
+msgid "saving encoding = %s"
+msgstr "сохранение кодировки (%s)"
+
+#: pg_dump.c:3342
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "сохранение standard_conforming_strings (%s)"
+
+#: pg_dump.c:3381
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "не удалось разобрать результат current_schemas()"
+
+#: pg_dump.c:3400
+#, c-format
+msgid "saving search_path = %s"
+msgstr "сохранение search_path = %s"
+
+#: pg_dump.c:3438
+#, c-format
+msgid "reading large objects"
+msgstr "чтение больших объектов"
+
+#: pg_dump.c:3576
+#, c-format
+msgid "saving large objects"
+msgstr "сохранение больших объектов"
+
+#: pg_dump.c:3617
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "ошибка чтения большого объекта %u: %s"
+
+#: pg_dump.c:3723
+#, c-format
+msgid "reading row-level security policies"
+msgstr "чтение политик защиты на уровне строк"
+
+#: pg_dump.c:3864
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "нераспознанный тип команды в политике: %c"
+
+#: pg_dump.c:4314 pg_dump.c:4632 pg_dump.c:11835 pg_dump.c:17724
+#: pg_dump.c:17726 pg_dump.c:18347
+#, c-format
+msgid "could not parse %s array"
+msgstr "не удалось разобрать массив %s"
+
+#: pg_dump.c:4500
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr ""
+"подписки не выгружены, так как текущий пользователь не суперпользователь"
+
+#: pg_dump.c:5014
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "не удалось найти родительское расширение для %s %s"
+
+#: pg_dump.c:5159
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "схема с OID %u не существует"
+
+#: pg_dump.c:6615 pg_dump.c:16988
+#, c-format
+msgid ""
+"failed sanity check, parent table with OID %u of sequence with OID %u not "
+"found"
+msgstr ""
+"нарушение целостности: по OID %u не удалось найти родительскую таблицу "
+"последовательности с OID %u"
+
+#: pg_dump.c:6758
+#, c-format
+msgid ""
+"failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr ""
+"нарушение целостности: таблица с OID %u, фигурирующим в "
+"pg_partitioned_table, не найдена"
+
+#: pg_dump.c:6989 pg_dump.c:7256 pg_dump.c:7727 pg_dump.c:8394 pg_dump.c:8515
+#: pg_dump.c:8669
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "нераспознанный OID таблицы %u"
+
+#: pg_dump.c:6993
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "неожиданно получены данные индекса для таблицы \"%s\""
+
+#: pg_dump.c:7488
+#, c-format
+msgid ""
+"failed sanity check, parent table with OID %u of pg_rewrite entry with OID "
+"%u not found"
+msgstr ""
+"нарушение целостности: по OID %u не удалось найти родительскую таблицу для "
+"записи pg_rewrite с OID %u"
+
+#: pg_dump.c:7779
+#, c-format
+msgid ""
+"query produced null referenced table name for foreign key trigger \"%s\" on "
+"table \"%s\" (OID of table: %u)"
+msgstr ""
+"запрос выдал NULL вместо имени целевой таблицы для триггера внешнего ключа "
+"\"%s\" в таблице \"%s\" (OID целевой таблицы: %u)"
+
+#: pg_dump.c:8398
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "неожиданно получены данные столбцов для таблицы \"%s\""
+
+#: pg_dump.c:8428
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "неверная нумерация столбцов в таблице \"%s\""
+
+#: pg_dump.c:8477
+#, c-format
+msgid "finding table default expressions"
+msgstr "поиск выражений по умолчанию для таблиц"
+
+#: pg_dump.c:8519
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "неверное значение adnum (%d) в таблице \"%s\""
+
+#: pg_dump.c:8619
+#, c-format
+msgid "finding table check constraints"
+msgstr "поиск ограничений-проверок для таблиц"
+
+#: pg_dump.c:8673
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] ""
+"ожидалось %d ограничение-проверка для таблицы \"%s\", но найдено: %d"
+msgstr[1] ""
+"ожидалось %d ограничения-проверки для таблицы \"%s\", но найдено: %d"
+msgstr[2] ""
+"ожидалось %d ограничений-проверок для таблицы \"%s\", но найдено: %d"
+
+#: pg_dump.c:8677
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "Возможно, повреждены системные каталоги."
+
+#: pg_dump.c:9367
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "роль с OID %u не существует"
+
+#: pg_dump.c:9479 pg_dump.c:9508
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "неподдерживаемая запись в pg_init_privs: %u %u %d"
+
+#: pg_dump.c:10329
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "у типа данных \"%s\" по-видимому неправильный тип типа"
+
+# TO REVEIW
+#: pg_dump.c:11904
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "недопустимое значение provolatile для функции \"%s\""
+
+# TO REVEIW
+#: pg_dump.c:11954 pg_dump.c:13817
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "недопустимое значение proparallel для функции \"%s\""
+
+#: pg_dump.c:12086 pg_dump.c:12192 pg_dump.c:12199
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "не удалось найти определение функции для функции с OID %u"
+
+#: pg_dump.c:12125
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "неприемлемое значение в поле pg_cast.castfunc или pg_cast.castmethod"
+
+#: pg_dump.c:12128
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "неприемлемое значение в поле pg_cast.castmethod"
+
+#: pg_dump.c:12218
+#, c-format
+msgid ""
+"bogus transform definition, at least one of trffromsql and trftosql should "
+"be nonzero"
+msgstr ""
+"неприемлемое определение преобразования (trffromsql или trftosql должно быть "
+"ненулевым)"
+
+#: pg_dump.c:12235
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "неприемлемое значение в поле pg_transform.trffromsql"
+
+#: pg_dump.c:12256
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "неприемлемое значение в поле pg_transform.trftosql"
+
+#: pg_dump.c:12401
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "постфиксные операторы больше не поддерживаются (оператор \"%s\")"
+
+#: pg_dump.c:12571
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "оператор с OID %s не найден"
+
+#: pg_dump.c:12639
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "неверный тип \"%c\" метода доступа \"%s\""
+
+#: pg_dump.c:13293 pg_dump.c:13346
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "нераспознанный провайдер правил сортировки: %s"
+
+#: pg_dump.c:13302 pg_dump.c:13311 pg_dump.c:13321 pg_dump.c:13330
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "неверное правило сортировки \"%s\""
+
+#: pg_dump.c:13736
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "нераспознанное значение aggfinalmodify для агрегата \"%s\""
+
+#: pg_dump.c:13792
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "нераспознанное значение aggmfinalmodify для агрегата \"%s\""
+
+#: pg_dump.c:14510
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "нераспознанный тип объекта в определении прав по умолчанию: %d"
+
+#: pg_dump.c:14526
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "не удалось разобрать список прав по умолчанию (%s)"
+
+#: pg_dump.c:14608
+#, c-format
+msgid ""
+"could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr ""
+"не удалось разобрать изначальный список ACL (%s) или ACL по умолчанию (%s) "
+"для объекта \"%s\" (%s)"
+
+#: pg_dump.c:14633
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr ""
+"не удалось разобрать список ACL (%s) или ACL по умолчанию (%s) для объекта "
+"\"%s\" (%s)"
+
+#: pg_dump.c:15171
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr ""
+"запрос на получение определения представления \"%s\" не возвратил данные"
+
+#: pg_dump.c:15174
+#, c-format
+msgid ""
+"query to obtain definition of view \"%s\" returned more than one definition"
+msgstr ""
+"запрос на получение определения представления \"%s\" возвратил несколько "
+"определений"
+
+#: pg_dump.c:15181
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "определение представления \"%s\" пустое (длина равна нулю)"
+
+#: pg_dump.c:15265
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "свойство WITH OIDS больше не поддерживается (таблица \"%s\")"
+
+#: pg_dump.c:16194
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "неверный номер столбца %d для таблицы \"%s\""
+
+#: pg_dump.c:16272
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "не удалось разобрать столбцы статистики в индексе"
+
+#: pg_dump.c:16274
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "не удалось разобрать значения статистики в индексе"
+
+#: pg_dump.c:16276
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr ""
+"столбцы, задающие статистику индекса, не соответствуют значениям по "
+"количеству"
+
+#: pg_dump.c:16494
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "отсутствует индекс для ограничения \"%s\""
+
+#: pg_dump.c:16722
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "нераспознанный тип ограничения: %c"
+
+#: pg_dump.c:16823 pg_dump.c:17052
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural ""
+"query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] ""
+"запрос на получение данных последовательности \"%s\" вернул %d строку "
+"(ожидалась 1)"
+msgstr[1] ""
+"запрос на получение данных последовательности \"%s\" вернул %d строки "
+"(ожидалась 1)"
+msgstr[2] ""
+"запрос на получение данных последовательности \"%s\" вернул %d строк "
+"(ожидалась 1)"
+
+#: pg_dump.c:16855
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "нераспознанный тип последовательности: %s"
+
+#: pg_dump.c:17144
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "неожиданное значение tgtype: %d"
+
+#: pg_dump.c:17216
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "неверная строка аргументов (%s) для триггера \"%s\" таблицы \"%s\""
+
+#: pg_dump.c:17485
+#, c-format
+msgid ""
+"query to get rule \"%s\" for table \"%s\" failed: wrong number of rows "
+"returned"
+msgstr ""
+"запрос на получение правила \"%s\" для таблицы \"%s\" возвратил неверное "
+"число строк"
+
+#: pg_dump.c:17638
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "не удалось найти упомянутое расширение %u"
+
+#: pg_dump.c:17728
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "конфигурации расширения не соответствуют условиям по количеству"
+
+#: pg_dump.c:17860
+#, c-format
+msgid "reading dependency data"
+msgstr "чтение информации о зависимостях"
+
+#: pg_dump.c:17946
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "нет подчинённого объекта %u %u"
+
+#: pg_dump.c:17957
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "нет вышестоящего объекта %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "неверный dumpId %d"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "неверная зависимость %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "не удалось определить цикл зависимостей"
+
+#: pg_dump_sort.c:1276
+#, c-format
+msgid "there are circular foreign-key constraints on this table:"
+msgid_plural "there are circular foreign-key constraints among these tables:"
+msgstr[0] "в следующей таблице зациклены ограничения внешних ключей:"
+msgstr[1] "в следующих таблицах зациклены ограничения внешних ключей:"
+msgstr[2] "в следующих таблицах зациклены ограничения внешних ключей:"
+
+#: pg_dump_sort.c:1281
+#, c-format
+msgid ""
+"You might not be able to restore the dump without using --disable-triggers "
+"or temporarily dropping the constraints."
+msgstr ""
+"Возможно, для восстановления базы потребуется использовать --disable-"
+"triggers или временно удалить ограничения."
+
+#: pg_dump_sort.c:1282
+#, c-format
+msgid ""
+"Consider using a full dump instead of a --data-only dump to avoid this "
+"problem."
+msgstr ""
+"Во избежание этой проблемы, вероятно, стоит выгружать всю базу данных, а не "
+"только данные (--data-only)."
+
+#: pg_dump_sort.c:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "не удалось разрешить цикл зависимостей для следующих объектов:"
+
+#: pg_dumpall.c:205
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr "программа \"%s\" нужна для %s, но она не найдена в каталоге \"%s\""
+
+#: pg_dumpall.c:208
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"программа \"%s\" найдена программой \"%s\", но её версия отличается от "
+"версии %s"
+
+#: pg_dumpall.c:357
+#, c-format
+msgid ""
+"option --exclude-database cannot be used together with -g/--globals-only, -"
+"r/--roles-only, or -t/--tablespaces-only"
+msgstr ""
+"параметр --exclude-database несовместим с -g/--globals-only, -r/--roles-only "
+"и -t/--tablespaces-only"
+
+#: pg_dumpall.c:365
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "параметры -g/--globals-only и -r/--roles-only исключают друг друга"
+
+#: pg_dumpall.c:372
+#, c-format
+msgid ""
+"options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr ""
+"параметры -g/--globals-only и -t/--tablespaces-only исключают друг друга"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid ""
+"options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "параметры -r/--roles-only и -t/--tablespaces-only исключают друг друга"
+
+#: pg_dumpall.c:444 pg_dumpall.c:1587
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "не удалось подключиться к базе данных: \"%s\""
+
+#: pg_dumpall.c:456
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"не удалось подключиться к базе данных \"postgres\" или \"template1\"\n"
+"Укажите другую базу данных."
+
+#: pg_dumpall.c:604
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s экспортирует всё содержимое кластера баз данных PostgreSQL в SQL-скрипт.\n"
+"\n"
+
+#: pg_dumpall.c:606
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [ПАРАМЕТР]...\n"
+
+#: pg_dumpall.c:609
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=ИМЯ_ФАЙЛА имя выходного файла\n"
+
+#: pg_dumpall.c:616
+#, c-format
+msgid ""
+" -c, --clean clean (drop) databases before recreating\n"
+msgstr ""
+" -c, --clean очистить (удалить) базы данных перед\n"
+" восстановлением\n"
+
+#: pg_dumpall.c:618
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr ""
+" -g, --globals-only выгрузить только глобальные объекты, без баз\n"
+
+#: pg_dumpall.c:619 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner не восстанавливать владение объектами\n"
+
+#: pg_dumpall.c:620
+#, c-format
+msgid ""
+" -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr ""
+" -r, --roles-only выгрузить только роли, без баз данных\n"
+" и табличных пространств\n"
+
+#: pg_dumpall.c:622
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr ""
+" -S, --superuser=ИМЯ имя пользователя для выполнения выгрузки\n"
+
+#: pg_dumpall.c:623
+#, c-format
+msgid ""
+" -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr ""
+" -t, --tablespaces-only выгружать только табличные пространства,\n"
+" без баз данных и ролей\n"
+
+#: pg_dumpall.c:629
+#, c-format
+msgid ""
+" --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr ""
+" --exclude-database=ШАБЛОН исключить базы с именами, подпадающими под "
+"шаблон\n"
+
+#: pg_dumpall.c:636
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords не выгружать пароли ролей\n"
+
+#: pg_dumpall.c:652
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=СТРОКА подключиться с данной строкой подключения\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=ИМЯ_БД выбор другой базы данных по умолчанию\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the "
+"standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Если не указан параметр -f/--file, SQL-скрипт записывается в стандартный "
+"вывод.\n"
+"\n"
+
+#: pg_dumpall.c:803
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "имя роли, начинающееся с \"pg_\", пропущено (%s)"
+
+#: pg_dumpall.c:1018
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "не удалось разобрать список ACL (%s) для параметра \"%s\""
+
+#: pg_dumpall.c:1136
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr ""
+"не удалось разобрать список управления доступом (%s) для табл. пространства "
+"\"%s\""
+
+#: pg_dumpall.c:1343
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "база данных \"%s\" исключается"
+
+#: pg_dumpall.c:1347
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "выгрузка базы данных \"%s\""
+
+#: pg_dumpall.c:1378
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "ошибка при обработке базы \"%s\", pg_dump завершается"
+
+#: pg_dumpall.c:1384
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "не удалось повторно открыть выходной файл \"%s\": %m"
+
+#: pg_dumpall.c:1425
+#, c-format
+msgid "running \"%s\""
+msgstr "выполняется \"%s\""
+
+#: pg_dumpall.c:1630
+#, c-format
+msgid "could not get server version"
+msgstr "не удалось узнать версию сервера"
+
+#: pg_dumpall.c:1633
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "не удалось разобрать строку версии сервера \"%s\""
+
+#: pg_dumpall.c:1703 pg_dumpall.c:1726
+#, c-format
+msgid "executing %s"
+msgstr "выполняется %s"
+
+# TO REVEIW
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "необходимо указать -d/--dbname или -f/--file"
+
+# TO REVEIW
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "параметры -d/--dbname и -f/--file исключают друг друга"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "параметры -C/--create и -1/--single-transaction исключают друг друга"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "параметр --single-transaction допускается только с одним заданием"
+
+#: pg_restore.c:380
+#, c-format
+msgid ""
+"unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "нераспознанный формат архива \"%s\"; укажите \"c\", \"d\" или \"t\""
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "при восстановлении проигнорировано ошибок: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s восстанавливает базу данных PostgreSQL из архива, созданного командой "
+"pg_dump.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [ПАРАМЕТР]... [ФАЙЛ]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=БД подключиться к указанной базе данных\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr ""
+" -f, --file=ИМЯ_ФАЙЛА имя выходного файла (или - для вывода в stdout)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr ""
+" -F, --format=c|d|t формат файла (должен определяться автоматически)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list вывести краткое оглавление архива\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose выводить подробные сообщения\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Параметры, управляющие восстановлением:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only восстановить только данные, без схемы\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create создать целевую базу данных\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr ""
+" -e, --exit-on-error выйти при ошибке (по умолчанию - продолжать)\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=ИМЯ восстановить указанный индекс\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr ""
+" -j, --jobs=ЧИСЛО распараллелить восстановление на указанное "
+"число заданий\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=ИМЯ_ФАЙЛА использовать оглавление из этого файла для\n"
+" чтения/упорядочивания данных\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr ""
+" -n, --schema=ИМЯ восстановить объекты только в этой схеме\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr ""
+" -N, --exclude-schema=ИМЯ не восстанавливать объекты в этой схеме\n"
+
+# skip-rule: no-space-before-parentheses
+# well-spelled: арг
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=ИМЯ(арг-ты) восстановить заданную функцию\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only восстановить только схему, без данных\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid ""
+" -S, --superuser=NAME superuser user name to use for disabling "
+"triggers\n"
+msgstr ""
+" -S, --superuser=ИМЯ имя суперпользователя для отключения "
+"триггеров\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid ""
+" -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr ""
+" -t, --table=ИМЯ восстановить заданное отношение (таблицу, "
+"представление и т. п.)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=ИМЯ восстановить заданный триггер\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid ""
+" -x, --no-privileges skip restoration of access privileges (grant/"
+"revoke)\n"
+msgstr ""
+" -x, --no-privileges не восстанавливать права доступа\n"
+" (назначение/отзыв)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr ""
+" -1, --single-transaction выполнить восстановление в одной транзакции\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security включить защиту на уровне строк\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments не восстанавливать комментарии\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not "
+"be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables не восстанавливать данные таблиц, которые\n"
+" не удалось создать\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications не восстанавливать публикации\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels не восстанавливать метки безопасности\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions не восстанавливать подписки\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr ""
+" --no-table-access-method не восстанавливать табличные методы доступа\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr ""
+" --no-tablespaces не восстанавливать назначения табл. "
+"пространств\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid ""
+" --section=SECTION restore named section (pre-data, data, or "
+"post-data)\n"
+msgstr ""
+" --section=РАЗДЕЛ восстановить заданный раздел\n"
+" (pre-data, data или post-data)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ИМЯ_РОЛИ выполнить SET ROLE перед восстановлением\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and "
+"specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Параметры -I, -n, -N, -P, -t, -T и --section можно комбинировать и "
+"указывать\n"
+"несколько раз для выбора нескольких объектов.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Если имя входного файла не указано, используется стандартное устройство "
+"ввода.\n"
+"\n"
+
+#, c-format
+#~ msgid "unrecognized collation provider '%c'"
+#~ msgstr "нераспознанный провайдер правил сортировки '%c'"
+
+#, c-format
+#~ msgid " %s"
+#~ msgstr " %s"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "could not open temporary file"
+#~ msgstr "не удалось открыть временный файл"
+
+#~ msgid "could not close tar member: %m"
+#~ msgstr "не удалось закрыть компонент tar-архива: %m"
+
+#~ msgid "compression level must be in range 0..9"
+#~ msgstr "уровень сжатия должен быть в диапазоне 0..9"
+
+#~ msgid "extra_float_digits must be in range -15..3"
+#~ msgstr "значение extra_float_digits должно быть в диапазоне -15..3"
+
+#~ msgid "invalid number of parallel jobs"
+#~ msgstr "неверное число параллельных заданий"
+
+#~ msgid ""
+#~ "Synchronized snapshots are not supported by this server version.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots."
+#~ msgstr ""
+#~ "В этой версии сервера синхронизированные снимки не поддерживаются.\n"
+#~ "Если они вам не нужны, укажите при запуске ключ\n"
+#~ "--no-synchronized-snapshots."
+
+#~ msgid ""
+#~ " --no-synchronized-snapshots do not use synchronized snapshots in "
+#~ "parallel jobs\n"
+#~ msgstr ""
+#~ " --no-synchronized-snapshots не использовать синхронизированные снимки\n"
+#~ " в параллельных заданиях\n"
+
+#~ msgid ""
+#~ "Synchronized snapshots on standby servers are not supported by this "
+#~ "server version.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots."
+#~ msgstr ""
+#~ "В этой версии сервера синхронизированные снимки на ведомых серверах не "
+#~ "поддерживаются.\n"
+#~ "Если они вам не нужны, укажите при запуске ключ\n"
+#~ "--no-synchronized-snapshots."
+
+#~ msgid "The command was: %s"
+#~ msgstr "Выполнялась команда: %s"
+
+#~ msgid "owner of publication \"%s\" appears to be invalid"
+#~ msgstr "у публикации \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "owner of subscription \"%s\" appears to be invalid"
+#~ msgstr "у подписки \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "could not parse subpublications array"
+#~ msgstr "не удалось разобрать массив subpublications"
+
+# TO REVIEW
+#~ msgid "owner of schema \"%s\" appears to be invalid"
+#~ msgstr "у схемы \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "owner of data type \"%s\" appears to be invalid"
+#~ msgstr "у типа данных \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "owner of operator \"%s\" appears to be invalid"
+#~ msgstr "у оператора \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "owner of operator class \"%s\" appears to be invalid"
+#~ msgstr "у класса операторов \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "owner of operator family \"%s\" appears to be invalid"
+#~ msgstr "у семейства операторов \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "owner of aggregate function \"%s\" appears to be invalid"
+#~ msgstr "у агрегатной функции \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "owner of function \"%s\" appears to be invalid"
+#~ msgstr "у функции \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "owner of table \"%s\" appears to be invalid"
+#~ msgstr "у таблицы \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "reading indexes for table \"%s.%s\""
+#~ msgstr "чтение индексов таблицы \"%s.%s\""
+
+#~ msgid "reading foreign key constraints for table \"%s.%s\""
+#~ msgstr "чтение ограничений внешних ключей таблицы \"%s.%s\""
+
+#~ msgid "reading triggers for table \"%s.%s\""
+#~ msgstr "чтение триггеров таблицы \"%s.%s\""
+
+#~ msgid "finding the columns and types of table \"%s.%s\""
+#~ msgstr "поиск столбцов и типов таблицы \"%s.%s\""
+
+#~ msgid "bogus value in proargmodes array"
+#~ msgstr "неприемлемое значение в массиве proargmodes"
+
+#~ msgid "could not parse proallargtypes array"
+#~ msgstr "не удалось разобрать массив proallargtypes"
+
+#~ msgid "could not parse proargmodes array"
+#~ msgstr "не удалось разобрать массив proargmodes"
+
+#~ msgid "could not parse proargnames array"
+#~ msgstr "не удалось разобрать массив proargnames"
+
+#~ msgid "could not parse proconfig array"
+#~ msgstr "не удалось разобрать массив proconfig"
+
+#~ msgid "could not parse extension configuration array"
+#~ msgstr "не удалось разобрать массив конфигураций расширения"
+
+#~ msgid "could not parse extension condition array"
+#~ msgstr "не удалось разобрать массив условий расширения"
+
+#~ msgid "maximum number of parallel jobs is %d"
+#~ msgstr "максимальное число параллельных заданий равно %d"
+
+#~ msgid "reading row security enabled for table \"%s.%s\""
+#~ msgstr "чтение информации о защите строк для таблицы \"%s.%s\""
+
+#~ msgid "reading policies for table \"%s.%s\""
+#~ msgstr "чтение политик таблицы \"%s.%s\""
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "ошибка pclose: %m"
+
+#~ msgid "WSAStartup failed: %d"
+#~ msgstr "ошибка WSAStartup: %d"
+
+#~ msgid "could not write to large object (result: %lu, expected: %lu)"
+#~ msgstr "не удалось записать большой объект (результат: %lu, ожидалось: %lu)"
+
+#~ msgid "connection to database \"%s\" failed: %s"
+#~ msgstr "не удалось подключиться к базе \"%s\": %s"
+
+#~ msgid ""
+#~ "aggregate function %s could not be dumped correctly for this database "
+#~ "version; ignored"
+#~ msgstr ""
+#~ "агрегатная функция %s не может быть правильно выгружена для этой версии "
+#~ "базы данных; функция проигнорирована"
+
+#~ msgid "could not connect to database \"%s\": %s"
+#~ msgstr "не удалось подключиться к базе \"%s\": %s"
+
+#~ msgid "connecting to database \"%s\" as user \"%s\""
+#~ msgstr "подключение к базе \"%s\" с именем пользователя \"%s\""
+
+#~ msgid "could not reconnect to database"
+#~ msgstr "не удалось переподключиться к базе"
+
+#~ msgid "could not reconnect to database: %s"
+#~ msgstr "не удалось переподключиться к базе: %s"
+
+#~ msgid "connection needs password"
+#~ msgstr "для подключения необходим пароль"
+
+#~ msgid ""
+#~ "could not find block ID %d in archive -- possibly due to out-of-order "
+#~ "restore request, which cannot be handled due to lack of data offsets in "
+#~ "archive"
+#~ msgstr ""
+#~ "не удалось найти в архиве блок с ID %d -- возможно, по причине не "
+#~ "последовательного запроса восстановления, который нельзя обработать из-за "
+#~ "отсутствия смещений данных в архиве"
+
+#~ msgid "ftell mismatch with expected position -- ftell used"
+#~ msgstr "позиция ftell не соответствует ожидаемой -- используется ftell"
+
+#~ msgid "internal error -- neither th nor fh specified in tarReadRaw()"
+#~ msgstr "внутренняя ошибка -- в tarReadRaw() не указан ни th, ни fh"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "дочерний процесс завершён по сигналу %s"
+
+#~ msgid "compress_io"
+#~ msgstr "compress_io"
+
+#~ msgid "parallel archiver"
+#~ msgstr "параллельный архиватор"
+
+#~ msgid "archiver"
+#~ msgstr "архиватор"
+
+#~ msgid "-C and -1 are incompatible options\n"
+#~ msgstr "Параметры -C и -1 несовместимы\n"
+
+#~ msgid "attempting to ascertain archive format\n"
+#~ msgstr "попытка выяснить формат архива\n"
+
+#~ msgid "allocating AH for %s, format %d\n"
+#~ msgstr "выделение структуры AH для %s, формат %d\n"
+
+#~ msgid "read TOC entry %d (ID %d) for %s %s\n"
+#~ msgstr "прочитана запись оглавления %d (ID %d): %s %s\n"
+
+#~ msgid "could not set default_with_oids: %s"
+#~ msgstr "не удалось установить параметр default_with_oids: %s"
+
+#~ msgid "entering restore_toc_entries_prefork\n"
+#~ msgstr "вход в restore_toc_entries_prefork\n"
+
+#~ msgid "entering restore_toc_entries_parallel\n"
+#~ msgstr "вход в restore_toc_entries_parallel\n"
+
+#~ msgid "entering restore_toc_entries_postfork\n"
+#~ msgstr "вход в restore_toc_entries_postfork\n"
+
+#~ msgid "no item ready\n"
+#~ msgstr "элемент не готов\n"
+
+#~ msgid "transferring dependency %d -> %d to %d\n"
+#~ msgstr "переключение зависимости %d -> %d на %d\n"
+
+#~ msgid "reducing dependencies for %d\n"
+#~ msgstr "уменьшение зависимостей для %d\n"
+
+#~ msgid "custom archiver"
+#~ msgstr "внешний архиватор"
+
+#~ msgid "archiver (db)"
+#~ msgstr "архиватор (БД)"
+
+#~ msgid "failed to reconnect to database\n"
+#~ msgstr "ошибка переподключения к базе данных\n"
+
+#~ msgid "failed to connect to database\n"
+#~ msgstr "ошибка подключения к базе данных\n"
+
+#~ msgid "directory archiver"
+#~ msgstr "каталоговый архиватор"
+
+#~ msgid "tar archiver"
+#~ msgstr "архиватор tar"
+
+#~ msgid "moving from position %s to next member at file position %s\n"
+#~ msgstr "переход от позиции %s к следующему компоненту в позиции %s\n"
+
+#~ msgid "now at file position %s\n"
+#~ msgstr "текущая позиция в файле %s\n"
+
+#~ msgid "skipping tar member %s\n"
+#~ msgstr "пропускается компонент tar %s\n"
+
+# skip-rule: capital-letter-first
+#~ msgid "TOC Entry %s at %s (length %s, checksum %d)\n"
+#~ msgstr "Запись оглавления %s в %s (длина: %s, контр. сумма: %d)\n"
+
+#~ msgid ""
+#~ "options --inserts/--column-inserts and -o/--oids cannot be used together\n"
+#~ msgstr ""
+#~ "параметры --inserts/--column-inserts и -o/--oids исключают друг друга\n"
+
+#~ msgid "(The INSERT command cannot set OIDs.)\n"
+#~ msgstr "(В INSERT нельзя определять OID.)\n"
+
+#~ msgid " -o, --oids include OIDs in dump\n"
+#~ msgstr " -o, --oids выгружать данные с OID\n"
+
+#~ msgid "sorter"
+#~ msgstr "sorter"
+
+#~ msgid "%s: option --if-exists requires option -c/--clean\n"
+#~ msgstr "%s: параметр --if-exists требует указания -c/--clean\n"
+
+#~ msgid "%s: could not open the output file \"%s\": %s\n"
+#~ msgstr "%s: не удалось открыть выходной файл \"%s\": %s\n"
+
+#~ msgid "%s: invalid client encoding \"%s\" specified\n"
+#~ msgstr "%s: указана неверная клиентская кодировка \"%s\"\n"
+
+#~ msgid "%s: executing %s\n"
+#~ msgstr "%s: выполняется %s\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s: ошибка при выполнении запроса: %s"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s: запрос: %s\n"
+
+#~ msgid ""
+#~ "%s: options -s/--schema-only and -a/--data-only cannot be used together\n"
+#~ msgstr ""
+#~ "%s: параметры -s/--schema-only и -a/--data-only исключают друг друга\n"
+
+#~ msgid "%s: options -c/--clean and -a/--data-only cannot be used together\n"
+#~ msgstr "%s: параметры -c/--clean and -a/--data-only исключают друг друга\n"
+
+#~ msgid "%s: invalid number of parallel jobs\n"
+#~ msgstr "%s: неверное число параллельных заданий\n"
+
+#~ msgid "%s: could not parse ACL list (%s) for database \"%s\"\n"
+#~ msgstr ""
+#~ "%s: не удалось разобрать список управления доступом (%s) для базы данных "
+#~ "\"%s\"\n"
+
+#~ msgid "reading extended statistics for table \"%s.%s\"\n"
+#~ msgstr "чтение расширенной статистики для таблицы \"%s.%s\"\n"
+
+#~ msgid "setting owner and privileges for %s \"%s.%s\"\n"
+#~ msgstr "установка владельца и прав: %s \"%s.%s\"\n"
+
+#~ msgid "setting owner and privileges for %s \"%s\"\n"
+#~ msgstr "установка владельца и прав: %s \"%s\"\n"
+
+#~ msgid ""
+#~ "Synchronized snapshots are not supported on standby servers.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots.\n"
+#~ msgstr ""
+#~ "На резервных серверах синхронизированные снимки не поддерживаются.\n"
+#~ "Если они вам не нужны, укажите при запуске ключ\n"
+#~ "--no-synchronized-snapshots.\n"
+
+#~ msgid "finding partition relationships\n"
+#~ msgstr "обнаружение взаимосвязей секций\n"
+
+#~ msgid "reading partition key information for interesting tables\n"
+#~ msgstr "чтение информации о ключах разбиения для интересующих таблиц\n"
+
+#~ msgid ""
+#~ " --no-subscription-connect dump subscriptions so they don't connect "
+#~ "on restore\n"
+#~ msgstr ""
+#~ " --no-subscription-connect выгружать подписки так, чтобы они не "
+#~ "подключались\n"
+#~ " при восстановлении\n"
+
+#~ msgid ""
+#~ "%s: options --no-role-passwords and --binary-upgrade cannot be used "
+#~ "together\n"
+#~ msgstr ""
+#~ "%s: параметры --no-role-passwords и --binary-upgrade исключают друг "
+#~ "друга\n"
+
+#~ msgid "error processing a parallel work item\n"
+#~ msgstr "ошибка выполнения части параллельной работы\n"
+
+#~ msgid "could not find slot of finished worker\n"
+#~ msgstr "не удалось найти слот законченного рабочего объекта\n"
+
+#~ msgid "error during backup\n"
+#~ msgstr "ошибка в процессе резервного копирования\n"
+
+#~ msgid ""
+#~ "server version must be at least 7.3 to use schema selection switches\n"
+#~ msgstr ""
+#~ "для использования параметров выбора схемы нужен сервер версии 7.3 или "
+#~ "новее\n"
+
+#~ msgid "query to get data of sequence \"%s\" returned name \"%s\"\n"
+#~ msgstr ""
+#~ "запрос на получение данных последовательности \"%s\" вернул имя \"%s\"\n"
+
+#~ msgid "could not get relation name for OID %u: %s\n"
+#~ msgstr "не удалось получить имя отношения с OID %u: %s\n"
+
+#~ msgid "terminated by user\n"
+#~ msgstr "прервано пользователем\n"
+
+#~ msgid "error in ListenToWorkers(): %s\n"
+#~ msgstr "ошибка в ListenToWorkers(): %s\n"
+
+#~ msgid "worker is terminating\n"
+#~ msgstr "рабочий процесс прерывается\n"
+
+#~ msgid "could not open output file \"%s\" for writing\n"
+#~ msgstr "не удалось открыть выходной файл \"%s\" для записи\n"
+
+#~ msgid " -t, --table=NAME restore named table\n"
+#~ msgstr " -t, --table=ИМЯ восстановить заданную таблицу\n"
+
+#~ msgid "archive member too large for tar format\n"
+#~ msgstr "компонент архива слишком велик для формата tar\n"
+
+#~ msgid "could not write to custom output routine\n"
+#~ msgstr "не удалось вывести данную в пользовательскую процедуру\n"
+
+#~ msgid "unexpected end of file\n"
+#~ msgstr "неожиданный конец файла\n"
+
+#~ msgid "could not write byte: %s\n"
+#~ msgstr "не удалось записать байт: %s\n"
+
+#~ msgid "could not write byte\n"
+#~ msgstr "не удалось записать байт\n"
+
+#~ msgid "could not write null block at end of tar archive\n"
+#~ msgstr "не удалось записать нулевой блок в конец tar-архива\n"
+
+#~ msgid "could not output padding at end of tar member\n"
+#~ msgstr "не удалось записать выравнивание для компонента tar\n"
+
+#~ msgid "mismatch in actual vs. predicted file position (%s vs. %s)\n"
+#~ msgstr "реальная позиция в файле отличается от предсказанной (%s и %s)\n"
+
+#~ msgid "could not determine seek position in file: %s\n"
+#~ msgstr "не удалось определить позицию в файле: %s\n"
+
+#~ msgid "Error processing a parallel work item.\n"
+#~ msgstr "Ошибка выполнения части параллельной работы.\n"
+
+#~ msgid "pgpipe could not getsockname: %ui"
+#~ msgstr "функция pgpipe не смогла получить имя сокета: %ui"
+
+#~ msgid "pgpipe could not create socket 2: %ui"
+#~ msgstr "функция pgpipe не смогла создать сокет 2: %ui"
+
+#~ msgid "worker process crashed: status %d\n"
+#~ msgstr "крах рабочего процесса: состояние %d\n"
+
+#~ msgid "parallel_restore should not return\n"
+#~ msgstr "неожиданный выход из parallel_restore\n"
+
+#~ msgid "could not parse version string \"%s\"\n"
+#~ msgstr "не удалось разобрать строку версии \"%s\"\n"
+
+#~ msgid "%s: could not parse version \"%s\"\n"
+#~ msgstr "%s: не удалось разобрать строку версии \"%s\"\n"
+
+#~ msgid "-C and -c are incompatible options\n"
+#~ msgstr "Параметры -C и -c несовместимы\n"
+
+#~ msgid "invalid COPY statement -- could not find \"copy\" in string \"%s\"\n"
+#~ msgstr ""
+#~ "неверный оператор COPY -- слово \"copy\" не найдено в строке \"%s\"\n"
+
+#~ msgid ""
+#~ "invalid COPY statement -- could not find \"from stdin\" in string \"%s\" "
+#~ "starting at position %lu\n"
+#~ msgstr ""
+#~ "неверный оператор COPY -- указание \"from stdin\" не найдено в строке "
+#~ "\"%s\", начиная с позиции %lu\n"
+
+#~ msgid "cannot create directory %s, it exists already\n"
+#~ msgstr "создать каталог %s не удалось, он уже существует\n"
+
+#~ msgid "cannot create directory %s, a file with this name exists already\n"
+#~ msgstr "создать каталог %s не удалось, так как есть файл с таким именем\n"
+
+#~ msgid "restoring large object OID %u\n"
+#~ msgstr "восстановление большого объекта с OID %u\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help показать эту справку и выйти\n"
+
+#~ msgid ""
+#~ " --version output version information, then exit\n"
+#~ msgstr " --version показать версию и выйти\n"
+
+#~ msgid "*** aborted because of error\n"
+#~ msgstr "*** аварийное завершение из-за ошибки\n"
+
+#~ msgid "missing pg_database entry for database \"%s\"\n"
+#~ msgstr "для базы данных \"%s\" отсутствует запись в pg_database\n"
+
+#~ msgid ""
+#~ "query returned more than one (%d) pg_database entry for database \"%s\"\n"
+#~ msgstr ""
+#~ "в pg_database нашлось несколько записей (%d) для базы данных \"%s\"\n"
+
+#~ msgid "dumpDatabase(): could not find pg_largeobject.relfrozenxid\n"
+#~ msgstr "dumpDatabase(): не удалось найти pg_largeobject.relfrozenxid\n"
+
+#~ msgid ""
+#~ "dumpDatabase(): could not find pg_largeobject_metadata.relfrozenxid\n"
+#~ msgstr ""
+#~ "dumpDatabase(): не удалось найти pg_largeobject_metadata.relfrozenxid\n"
+
+#~ msgid "query returned %d foreign server entry for foreign table \"%s\"\n"
+#~ msgid_plural ""
+#~ "query returned %d foreign server entries for foreign table \"%s\"\n"
+#~ msgstr[0] ""
+#~ "запрос вернул %d запись о стороннем сервере для сторонней таблицы \"%s\"\n"
+#~ msgstr[1] ""
+#~ "запрос вернул %d записи о стороннем сервере для сторонней таблицы \"%s\"\n"
+#~ msgstr[2] ""
+#~ "запрос вернул %d записей о стороннем сервере для сторонней таблицы "
+#~ "\"%s\"\n"
+
+#~ msgid "missing pg_database entry for this database\n"
+#~ msgstr "для этой базы данных отсутствует запись в pg_database\n"
+
+#~ msgid "found more than one pg_database entry for this database\n"
+#~ msgstr "для этой базы данных найдено несколько записей в pg_database\n"
+
+#~ msgid "could not find entry for pg_indexes in pg_class\n"
+#~ msgstr "для pg_indexes не найдена запись в pg_class\n"
+
+#~ msgid "found more than one entry for pg_indexes in pg_class\n"
+#~ msgstr "для pg_indexes найдено несколько записей в pg_class\n"
+
+#~ msgid "SQL command failed\n"
+#~ msgstr "ошибка SQL-команды\n"
+
+#~ msgid "file archiver"
+#~ msgstr "файловый архиватор"
+
+#~ msgid ""
+#~ "WARNING:\n"
+#~ " This format is for demonstration purposes; it is not intended for\n"
+#~ " normal use. Files will be written in the current working directory.\n"
+#~ msgstr ""
+#~ "ПРЕДУПРЖДЕНИЕ:\n"
+#~ " Этот формат предназначен только для целей демонстрации, но не для\n"
+#~ " повседневного использования. Файлы сохраняются в текущий рабочий "
+#~ "каталог.\n"
+
+#~ msgid "could not close data file after reading\n"
+#~ msgstr "не удалось закрыть файл данных после чтения\n"
+
+#~ msgid "could not open large object TOC for input: %s\n"
+#~ msgstr ""
+#~ "не удалось открыть для чтения файл оглавления больших объектов: %s\n"
+
+#~ msgid "could not open large object TOC for output: %s\n"
+#~ msgstr ""
+#~ "не удалось открыть для записи файл оглавления больших объектов: %s\n"
+
+#~ msgid "could not close large object file\n"
+#~ msgstr "не удалось закрыть файл большого объекта\n"
+
+#~ msgid ""
+#~ " -c, --clean clean (drop) database objects before "
+#~ "recreating\n"
+#~ msgstr ""
+#~ " -c, --clean очистить (удалить) объекты БД при "
+#~ "восстановлении\n"
+
+#~ msgid " -O, --no-owner skip restoration of object ownership\n"
+#~ msgstr " -O, --no-owner не восстанавливать владение объектами\n"
+
+#~ msgid ""
+#~ " --disable-triggers disable triggers during data-only restore\n"
+#~ msgstr ""
+#~ " --disable-triggers отключить триггеры при восстановлении только "
+#~ "данных\n"
+
+#~ msgid ""
+#~ " --use-set-session-authorization\n"
+#~ " use SET SESSION AUTHORIZATION commands instead "
+#~ "of\n"
+#~ " ALTER OWNER commands to set ownership\n"
+#~ msgstr ""
+#~ " --use-set-session-authorization\n"
+#~ " устанавливать владельца, используя команды\n"
+#~ " SET SESSION AUTHORIZATION вместо ALTER OWNER\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: нехватка памяти\n"
diff --git a/src/bin/pg_dump/po/sv.po b/src/bin/pg_dump/po/sv.po
new file mode 100644
index 0000000..72138cd
--- /dev/null
+++ b/src/bin/pg_dump/po/sv.po
@@ -0,0 +1,2618 @@
+# Swedish message translation file for pg_dump
+# Peter Eisentraut <peter_e@gmx.net>, 2001, 2009, 2010.
+# Dennis Björklund <db@zigo.dhs.org>, 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-23 13:06+0000\n"
+"PO-Revision-Date: 2023-08-23 15:31+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "kunde inte identifiera aktuell katalog: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "ogiltig binär \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "kunde inte läsa binär \"%s\""
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "kunde inte hitta en \"%s\" att köra"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "kunde inte byta katalog till \"%s\": %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "kan inte läsa symbolisk länk \"%s\": %m"
+
+#: ../../common/exec.c:422 parallel.c:1611
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() misslyckades: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kan inte duplicera null-pekare (internt fel)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "kommandot är inte körbart"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "kommandot kan ej hittas"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "barnprocess avslutade med kod %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "barnprocess terminerades med avbrott 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "barnprocess terminerades av signal %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "barnprocess avslutade med okänd statuskod %d"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ogiltigt värde \"%s\" för flaggan \"%s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s måste vara i intervallet %d..%d"
+
+#: common.c:134
+#, c-format
+msgid "reading extensions"
+msgstr "läser utökningar"
+
+#: common.c:137
+#, c-format
+msgid "identifying extension members"
+msgstr "identifierar utökningsmedlemmar"
+
+#: common.c:140
+#, c-format
+msgid "reading schemas"
+msgstr "läser scheman"
+
+#: common.c:149
+#, c-format
+msgid "reading user-defined tables"
+msgstr "läser användardefinierade tabeller"
+
+#: common.c:154
+#, c-format
+msgid "reading user-defined functions"
+msgstr "läser användardefinierade funktioner"
+
+#: common.c:158
+#, c-format
+msgid "reading user-defined types"
+msgstr "läser användardefinierade typer"
+
+#: common.c:162
+#, c-format
+msgid "reading procedural languages"
+msgstr "läser procedurspråk"
+
+#: common.c:165
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "läser användardefinierade aggregatfunktioner"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined operators"
+msgstr "läser användardefinierade operatorer"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "läser användardefinierade accessmetoder"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "läser användardefinierade operatorklasser"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "läser användardefinierade operator-familjer"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "läser användardefinierade textsöktolkare"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "läser användardefinierade textsökmallar"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "läser användardefinierade textsökordlistor"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "läser användardefinierade textsökkonfigurationer"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "läser användardefinierade främmande data-omvandlare"
+
+#: common.c:195
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "läser användardefinierade främmande servrar"
+
+#: common.c:198
+#, c-format
+msgid "reading default privileges"
+msgstr "läser standardrättigheter"
+
+#: common.c:201
+#, c-format
+msgid "reading user-defined collations"
+msgstr "läser användardefinierade jämförelser"
+
+#: common.c:204
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "läser användardefinierade konverteringar"
+
+#: common.c:207
+#, c-format
+msgid "reading type casts"
+msgstr "läser typomvandlingar"
+
+#: common.c:210
+#, c-format
+msgid "reading transforms"
+msgstr "läser transformer"
+
+#: common.c:213
+#, c-format
+msgid "reading table inheritance information"
+msgstr "läser information om arv av tabeller"
+
+#: common.c:216
+#, c-format
+msgid "reading event triggers"
+msgstr "läser händelsetriggrar"
+
+#: common.c:220
+#, c-format
+msgid "finding extension tables"
+msgstr "hittar utökningstabeller"
+
+#: common.c:224
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "hittar arvrelationer"
+
+#: common.c:227
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "läser kolumninfo flr intressanta tabeller"
+
+#: common.c:230
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "markerar ärvda kolumner i undertabeller"
+
+#: common.c:233
+#, c-format
+msgid "reading partitioning data"
+msgstr "läser partitioneringsdata"
+
+#: common.c:236
+#, c-format
+msgid "reading indexes"
+msgstr "läser index"
+
+#: common.c:239
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "flaggar index i partitionerade tabeller"
+
+#: common.c:242
+#, c-format
+msgid "reading extended statistics"
+msgstr "läser utökad statistik"
+
+#: common.c:245
+#, c-format
+msgid "reading constraints"
+msgstr "läser integritetsvillkor"
+
+#: common.c:248
+#, c-format
+msgid "reading triggers"
+msgstr "läser triggrar"
+
+#: common.c:251
+#, c-format
+msgid "reading rewrite rules"
+msgstr "läser omskrivningsregler"
+
+#: common.c:254
+#, c-format
+msgid "reading policies"
+msgstr "läser policys"
+
+#: common.c:257
+#, c-format
+msgid "reading publications"
+msgstr "läser publiceringar"
+
+#: common.c:260
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "läser publiceringsmedlemskap för tabeller"
+
+#: common.c:263
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "läser publiceringsmedlemskap för scheman"
+
+#: common.c:266
+#, c-format
+msgid "reading subscriptions"
+msgstr "läser prenumerationer"
+
+#: common.c:345
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "ogiltigt antal (%d) föräldrar för tabell \"%s\""
+
+#: common.c:1006
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "misslyckades med riktighetskontroll, hittade inte förälder-OID %u för tabell \"%s\" (OID %u)"
+
+#: common.c:1045
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "kunde inte tolka numerisk array \"%s\": för många nummer"
+
+#: common.c:1057
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "kunde inte tolka numerisk array \"%s\": ogiltigt tecken i nummer"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "ogiltig komprimeringskod: %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504
+#: compress_io.c:547
+#, c-format
+msgid "not built with zlib support"
+msgstr "ej byggt med zlib-stöd"
+
+#: compress_io.c:236 compress_io.c:333
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "kunde inte initiera komprimeringsbibliotek: %s"
+
+#: compress_io.c:256
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "kunde inte stänga komprimeringsströmmen: %s"
+
+#: compress_io.c:273
+#, c-format
+msgid "could not compress data: %s"
+msgstr "kunde inte komprimera data: %s"
+
+#: compress_io.c:349 compress_io.c:364
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "kunde inte packa upp data: %s"
+
+#: compress_io.c:371
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "kunde inte stänga komprimeringsbiblioteket: %s"
+
+#: compress_io.c:584 compress_io.c:621
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "kunde inte läsa från infilen: %s"
+
+#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553
+#: pg_backup_tar.c:726 pg_backup_tar.c:749
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "kunde inte läsa från infilen: slut på filen"
+
+#: parallel.c:253
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() misslyckades: felkod %d"
+
+#: parallel.c:961
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "kunde inte skapa kommunikationskanaler: %m"
+
+#: parallel.c:1018
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "kunde inte skapa arbetsprocess: %m"
+
+#: parallel.c:1148
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "okänt kommando mottaget från ledare: \"%s\""
+
+#: parallel.c:1191 parallel.c:1429
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "ogiltigt meddelande mottaget från arbetare: \"%s\""
+
+#: parallel.c:1323
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"kunde inte låsa relationen \"%s\"\n"
+"Dette beror oftast på att någon tagit ett ACCESS EXCLUSIVE-lås på tabellen\n"
+"efter att pg_dumps föräldraprocess tagit ett ACCESS SHARE-lås på tabellen."
+
+#: parallel.c:1412
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "en arbetsprocess dog oväntat"
+
+#: parallel.c:1534 parallel.c:1652
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "kunde inte skriva till kommunikationskanal: %m"
+
+#: parallel.c:1736
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: kunde inte skapa uttag (socket): felkod %d"
+
+#: parallel.c:1747
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: kunde inte göra \"bind\": felkod %d"
+
+#: parallel.c:1754
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: kunde inte göra \"listen\": felkod %d"
+
+#: parallel.c:1761
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s() misslyckades: felkod %d"
+
+#: parallel.c:1772
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: kunde inte skapa ett andra uttag (socket): felkod %d"
+
+#: parallel.c:1781
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: kunde itne ansluta till uttag (socket): felkod %d"
+
+#: parallel.c:1790
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: kunde inte acceptera anslutning: felkod %d"
+
+#: pg_backup_archiver.c:280 pg_backup_archiver.c:1632
+#, c-format
+msgid "could not close output file: %m"
+msgstr "kunde inte stänga utdatafilen: %m"
+
+#: pg_backup_archiver.c:324 pg_backup_archiver.c:328
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "arkivobjekten är inte i korrekt sektionsordning"
+
+#: pg_backup_archiver.c:334
+#, c-format
+msgid "unexpected section code %d"
+msgstr "oväntad sektionskod %d"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "parallell återställning stöds inte med detta arkivformat"
+
+#: pg_backup_archiver.c:375
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "parallell återställning stöds inte med arkiv som skapats av en pre-8.0 pg_dump"
+
+#: pg_backup_archiver.c:393
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)"
+msgstr "kan inte återställa från komprimerat arkiv (inte konfigurerad med stöd för komprimering)"
+
+#: pg_backup_archiver.c:410
+#, c-format
+msgid "connecting to database for restore"
+msgstr "kopplar upp mot databas för återställning"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "direkta databasuppkopplingar stöds inte i arkiv från före version 1.3"
+
+#: pg_backup_archiver.c:455
+#, c-format
+msgid "implied data-only restore"
+msgstr "implicerad återställning av enbart data"
+
+#: pg_backup_archiver.c:521
+#, c-format
+msgid "dropping %s %s"
+msgstr "tar bort %s %s"
+
+#: pg_backup_archiver.c:621
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "kunde inte hitta var IF EXISTS skulle stoppas in i sats \"%s\""
+
+#: pg_backup_archiver.c:777 pg_backup_archiver.c:779
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "varning från orginaldumpfilen: %s"
+
+#: pg_backup_archiver.c:794
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "skapar %s \"%s.%s\""
+
+#: pg_backup_archiver.c:797
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "skapar %s \"%s\""
+
+#: pg_backup_archiver.c:847
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "kopplar upp mot ny databas \"%s\""
+
+#: pg_backup_archiver.c:874
+#, c-format
+msgid "processing %s"
+msgstr "processar %s"
+
+#: pg_backup_archiver.c:896
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "processar data för tabell \"%s.%s\""
+
+#: pg_backup_archiver.c:966
+#, c-format
+msgid "executing %s %s"
+msgstr "kör %s %s"
+
+#: pg_backup_archiver.c:1005
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "stänger av trigger för %s"
+
+#: pg_backup_archiver.c:1031
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "slår på trigger för %s"
+
+#: pg_backup_archiver.c:1096
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "internt fel -- WriteData kan inte anropas utanför kontexten av en DataDumper-rutin"
+
+#: pg_backup_archiver.c:1279
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "utmatning av stora objekt stöds inte i det valda formatet"
+
+#: pg_backup_archiver.c:1337
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "återställde %d stor objekt"
+msgstr[1] "återställde %d stora objekt"
+
+#: pg_backup_archiver.c:1358 pg_backup_tar.c:669
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "återställer stort objekt med OID %u"
+
+#: pg_backup_archiver.c:1370
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "kunde inte skapa stort objekt %u: %s"
+
+#: pg_backup_archiver.c:1375 pg_dump.c:3607
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "kunde inte öppna stort objekt %u: %s"
+
+#: pg_backup_archiver.c:1431
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "kunde inte öppna TOC-filen \"%s\": %m"
+
+#: pg_backup_archiver.c:1459
+#, c-format
+msgid "line ignored: %s"
+msgstr "rad ignorerad: %s"
+
+#: pg_backup_archiver.c:1466
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "kunde inte hitta en post för ID %d"
+
+#: pg_backup_archiver.c:1489 pg_backup_directory.c:222
+#: pg_backup_directory.c:599
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "kunde inte stänga TOC-filen: %m"
+
+#: pg_backup_archiver.c:1603 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:586 pg_backup_directory.c:649
+#: pg_backup_directory.c:668 pg_dumpall.c:476
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "kunde inte öppna utdatafilen \"%s\": %m"
+
+#: pg_backup_archiver.c:1605 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "kunde inte öppna utdatafilen: %m"
+
+#: pg_backup_archiver.c:1699
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "skrev %zu byte data av stort objekt (resultat = %d)"
+msgstr[1] "skrev %zu bytes data av stort objekt (resultat = %d)"
+
+#: pg_backup_archiver.c:1705
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "kunde inte skriva till stort objekt: %s"
+
+#: pg_backup_archiver.c:1795
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "vid INITIERING:"
+
+#: pg_backup_archiver.c:1800
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "vid HANTERING AV TOC:"
+
+#: pg_backup_archiver.c:1805
+#, c-format
+msgid "while FINALIZING:"
+msgstr "vid SLUTFÖRANDE:"
+
+#: pg_backup_archiver.c:1810
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "från TOC-post %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1886
+#, c-format
+msgid "bad dumpId"
+msgstr "felaktigt dumpId"
+
+#: pg_backup_archiver.c:1907
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "felaktig tabell-dumpId för TABLE DATA-objekt"
+
+#: pg_backup_archiver.c:1999
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "oväntad data-offset-flagga %d"
+
+#: pg_backup_archiver.c:2012
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "fil-offset i dumpfilen är för stort"
+
+#: pg_backup_archiver.c:2150 pg_backup_archiver.c:2160
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "katalognamn för långt: \"%s\""
+
+#: pg_backup_archiver.c:2168
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "katalogen \"%s\" verkar inte vara ett giltigt arkiv (\"toc.dat\" finns inte)"
+
+#: pg_backup_archiver.c:2176 pg_backup_custom.c:173 pg_backup_custom.c:807
+#: pg_backup_directory.c:207 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "kunde inte öppna indatafilen \"%s\": %m"
+
+#: pg_backup_archiver.c:2183 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "kan inte öppna infil: %m"
+
+#: pg_backup_archiver.c:2189
+#, c-format
+msgid "could not read input file: %m"
+msgstr "kan inte läsa infilen: %m"
+
+#: pg_backup_archiver.c:2191
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "indatafilen är för kort (läste %lu, förväntade 5)"
+
+#: pg_backup_archiver.c:2223
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "indatafilen verkar vara en dump i textformat. Använd psql."
+
+#: pg_backup_archiver.c:2229
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "indatafilen verkar inte vara ett korrekt arkiv (för kort?)"
+
+#: pg_backup_archiver.c:2235
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "indatafilen verkar inte vara ett korrekt arkiv"
+
+#: pg_backup_archiver.c:2244
+#, c-format
+msgid "could not close input file: %m"
+msgstr "kunde inte stänga indatafilen: %m"
+
+#: pg_backup_archiver.c:2361
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "känner inte igen filformat \"%d\""
+
+#: pg_backup_archiver.c:2443 pg_backup_archiver.c:4505
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "klar med objekt %d %s %s"
+
+#: pg_backup_archiver.c:2447 pg_backup_archiver.c:4518
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "arbetsprocess misslyckades: felkod %d"
+
+#: pg_backup_archiver.c:2568
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "post-ID %d utanför sitt intervall -- kanske en trasig TOC"
+
+#: pg_backup_archiver.c:2648
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "återeställa tabeller med WITH OIDS stöds inte längre"
+
+#: pg_backup_archiver.c:2730
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "okänd teckenkodning \"%s\""
+
+#: pg_backup_archiver.c:2735
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "ogiltigt ENCODING-val: %s"
+
+#: pg_backup_archiver.c:2753
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "ogiltigt STDSTRINGS-val: %s"
+
+#: pg_backup_archiver.c:2778
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "schema \"%s\" hittades inte"
+
+#: pg_backup_archiver.c:2785
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "tabell \"%s\" hittades inte"
+
+#: pg_backup_archiver.c:2792
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "index \"%s\" hittades inte"
+
+#: pg_backup_archiver.c:2799
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "funktion \"%s\" hittades inte"
+
+#: pg_backup_archiver.c:2806
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "trigger \"%s\" hittades inte"
+
+#: pg_backup_archiver.c:3203
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "kunde inte sätta sessionsanvändare till \"%s\": %s"
+
+#: pg_backup_archiver.c:3340
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "kunde inte sätta search_path till \"%s\": %s"
+
+#: pg_backup_archiver.c:3402
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "kunde inte sätta default_tablespace till %s: %s"
+
+#: pg_backup_archiver.c:3452
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "kunde inte sätta default_table_access_method: %s"
+
+#: pg_backup_archiver.c:3546 pg_backup_archiver.c:3711
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "vet inte hur man sätter ägare för objekttyp \"%s\""
+
+#: pg_backup_archiver.c:3814
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "kunde inte hitta den magiska strängen i filhuvudet"
+
+#: pg_backup_archiver.c:3828
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "ej supportad version (%d.%d) i filhuvudet"
+
+#: pg_backup_archiver.c:3833
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "riktighetskontroll på heltalsstorlek (%lu) misslyckades"
+
+#: pg_backup_archiver.c:3837
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "arkivet skapades på en maskin med större heltal, en del operationer kan misslyckas"
+
+#: pg_backup_archiver.c:3847
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "förväntat format (%d) skiljer sig från formatet som fanns i filen (%d)"
+
+#: pg_backup_archiver.c:3862
+#, c-format
+msgid "archive is compressed, but this installation does not support compression -- no data will be available"
+msgstr "arkivet är komprimerat, men denna installation stödjer inte komprimering -- ingen data kommer kunna läsas"
+
+#: pg_backup_archiver.c:3896
+#, c-format
+msgid "invalid creation date in header"
+msgstr "ogiltig skapandedatum i huvud"
+
+#: pg_backup_archiver.c:4030
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "processar objekt %d %s %s"
+
+#: pg_backup_archiver.c:4109
+#, c-format
+msgid "entering main parallel loop"
+msgstr "går in i parallella huvudloopen"
+
+#: pg_backup_archiver.c:4120
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "hoppar över objekt %d %s %s"
+
+#: pg_backup_archiver.c:4129
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "startar objekt %d %s %s"
+
+#: pg_backup_archiver.c:4183
+#, c-format
+msgid "finished main parallel loop"
+msgstr "klar med parallella huvudloopen"
+
+#: pg_backup_archiver.c:4219
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "processar saknat objekt %d %s %s"
+
+#: pg_backup_archiver.c:4824
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "tabell \"%s\" kunde inte skapas, dess data kommer ej återställas"
+
+#: pg_backup_custom.c:376 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "ogiltig OID för stort objekt"
+
+#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629
+#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021
+#, c-format
+msgid "error during file seek: %m"
+msgstr "fel vid sökning: %m"
+
+#: pg_backup_custom.c:478
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "datablock %d har fel sökposition"
+
+#: pg_backup_custom.c:495
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "känner inte igen datablocktyp (%d) vid genomsökning av arkiv"
+
+#: pg_backup_custom.c:517
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "kunde inte hitta block ID %d i arkiv -- kanske på grund av en återställningbegäran i oordning vilket inte kan hanteras då inputfilen inte är sökbar"
+
+#: pg_backup_custom.c:522
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "kunde inte hitta block ID %d i arkiv -- möjligen ett trasigt arkiv"
+
+#: pg_backup_custom.c:529
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "hittade oväntat block-ID (%d) vid läsning av data -- förväntade %d"
+
+#: pg_backup_custom.c:543
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "ej igenkänd datablockstyp %d vid återställande av arkiv"
+
+#: pg_backup_custom.c:645
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "kunde inte läsa från infilen: %m"
+
+#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943
+#: pg_backup_tar.c:1019
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "kunde inte bestämma sökposition i arkivfil: %m"
+
+#: pg_backup_custom.c:762 pg_backup_custom.c:802
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "kan inte stänga arkivfilen: %m"
+
+#: pg_backup_custom.c:785
+#, c-format
+msgid "can only reopen input archives"
+msgstr "kan inte återöppna indataarkiven"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "parallell återställning från standard in stöds inte"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "parallell återställning för en icke sökbar fil stöds inte"
+
+#: pg_backup_custom.c:810
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "kunde inte söka till rätt position i arkivfilen: %m"
+
+#: pg_backup_custom.c:889
+#, c-format
+msgid "compressor active"
+msgstr "komprimerare aktiv"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "kunde inte hämta serverversionen från libpq"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1646
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "avbryter då serverversionerna i matchar"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1647
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "server version: %s; %s version: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "är redan uppkopplad mot en databas"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595
+msgid "Password: "
+msgstr "Lösenord: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "kunde inte ansluta till databasen"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "återanslutning misslyckades: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1520 pg_dumpall.c:1604
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732
+#, c-format
+msgid "query failed: %s"
+msgstr "fråga misslyckades: %s"
+
+#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733
+#, c-format
+msgid "Query was: %s"
+msgstr "Frågan var: %s"
+
+#: pg_backup_db.c:316
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "fråga gav %d rad istället för en: %s"
+msgstr[1] "fråga gav %d rader istället för en: %s"
+
+#: pg_backup_db.c:352
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sKommandot var: %s"
+
+#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489
+msgid "could not execute query"
+msgstr "kunde inte utföra fråga"
+
+#: pg_backup_db.c:461
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "fel returnerat av PQputCopyData: %s"
+
+#: pg_backup_db.c:510
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "fel returnerat av PQputCopyEnd: %s"
+
+#: pg_backup_db.c:516
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY misslyckades för tabell \"%s\": %s"
+
+#: pg_backup_db.c:522 pg_dump.c:2106
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "oväntade extraresultat under kopiering (COPY) av tabell \"%s\""
+
+#: pg_backup_db.c:534
+msgid "could not start database transaction"
+msgstr "kunde inte starta databastransaktionen"
+
+#: pg_backup_db.c:542
+msgid "could not commit database transaction"
+msgstr "kunde inte genomföra databastransaktionen"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "ingen utdatakatalog angiven"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "kunde inte läsa katalog \"%s\": %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "kunde inte stänga katalog \"%s\": %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "kunde inte skapa katalog \"%s\": %m"
+
+#: pg_backup_directory.c:355 pg_backup_directory.c:497
+#: pg_backup_directory.c:533
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "kunde inte skriva till utdatafil: %s"
+
+#: pg_backup_directory.c:373
+#, c-format
+msgid "could not close data file: %m"
+msgstr "kan inte stänga datafil: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "kan inte stänga datafil \"%s\": %m"
+
+#: pg_backup_directory.c:447
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "kunde inte öppna stora objekts TOC-fil \"%s\" för läsning: %m"
+
+#: pg_backup_directory.c:458
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "ogiltig rad i stora objekts TOC-fil \"%s\": \"%s\""
+
+#: pg_backup_directory.c:467
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "fel vid lösning av stora objekts TOC-fil \"%s\""
+
+#: pg_backup_directory.c:471
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "kunde inte stänga stora objekts TOC-fil \"%s\": %m"
+
+#: pg_backup_directory.c:685
+#, c-format
+msgid "could not close blob data file: %m"
+msgstr "kan inte stänga blobbars datafil: %m"
+
+#: pg_backup_directory.c:691
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "kunde inte skriva till blobbars TOC-fil"
+
+#: pg_backup_directory.c:705
+#, c-format
+msgid "could not close blobs TOC file: %m"
+msgstr "kunde inte stänga blobbars TOC-fil: %m"
+
+#: pg_backup_directory.c:724
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "filnamnet är för långt: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "detta format kan inte läsas"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "kunde inte öppna TOC-filen \"%s\" för utmatning: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "kunde inte öppna TOC-filen för utmatning: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:893
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "komprimering är stödjs inte av arkivformatet tar"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "kunde inte öppna TOC-fil \"%s\" för läsning: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "kunde inte öppna TOC-fil för läsning: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "kunde inte hitta fil \"%s\" i arkiv"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "kunde inte generera temporärt filnamn: %m"
+
+#: pg_backup_tar.c:624
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "oväntad COPY-satssyntax: \"%s\""
+
+#: pg_backup_tar.c:890
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "ogiltig OID för stort objekt (%u)"
+
+#: pg_backup_tar.c:1035
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "kunde inte stänga temporär fil: %m"
+
+#: pg_backup_tar.c:1038
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "verklig fillängd (%lld) matchar inte det förväntade (%lld)"
+
+#: pg_backup_tar.c:1084 pg_backup_tar.c:1115
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "kunde inte hitta filhuvud för fil \"%s\" i tar-arkiv"
+
+#: pg_backup_tar.c:1102
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "dumpa data i oordning stöds inte av detta arkivformat: \"%s\" krävs, men kommer före \"%s\" i denna arkivfil."
+
+#: pg_backup_tar.c:1149
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "inkomplett tar-huvud hittat (%lu byte)"
+msgstr[1] "inkomplett tar-huvud hittat (%lu bytes)"
+
+#: pg_backup_tar.c:1188
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "trasigt tar-huvud hittat i %s (förväntade %d, beräknad %d) filposition %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "okänt sektionsnamn: \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:628 pg_dump.c:645 pg_dumpall.c:340
+#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373
+#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "slut på on_exit_nicely-slottar"
+
+#: pg_dump.c:643 pg_dumpall.c:348 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_dump.c:662 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "flaggorna \"bara schema\" (-s) och \"bara data\" (-a) kan inte användas tillsammans"
+
+#: pg_dump.c:665
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "flaggorna -s/--schema-only och --include-foreign-data kan inte användas tillsammans"
+
+#: pg_dump.c:668
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "flaggan --include-foreign-data stöds inte med parallell backup"
+
+#: pg_dump.c:671 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "flaggorna \"nollställ\" (-c) och \"bara data\" (-a) kan inte användas tillsammans"
+
+#: pg_dump.c:674 pg_dumpall.c:378 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "flaggan --if-exists kräver flaggan -c/--clean"
+
+#: pg_dump.c:681
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "flagga --on-conflict-do-nothing kräver --inserts, --rows-per-insert eller --column-inserts"
+
+#: pg_dump.c:703
+#, c-format
+msgid "requested compression not available in this installation -- archive will be uncompressed"
+msgstr "efterfrågad komprimering finns inte i denna installation -- arkivet kommer sparas okomprimerat"
+
+#: pg_dump.c:716
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "parallell backup stöds bara med katalogformat"
+
+#: pg_dump.c:762
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "sista inbyggda OID är %u"
+
+#: pg_dump.c:771
+#, c-format
+msgid "no matching schemas were found"
+msgstr "hittade inga matchande scheman"
+
+#: pg_dump.c:785
+#, c-format
+msgid "no matching tables were found"
+msgstr "hittade inga matchande tabeller"
+
+#: pg_dump.c:807
+#, c-format
+msgid "no matching extensions were found"
+msgstr "hittade inga matchande utökningar"
+
+#: pg_dump.c:990
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s dumpar en databas som en textfil eller i andra format.\n"
+"\n"
+
+#: pg_dump.c:991 pg_dumpall.c:605 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_dump.c:992
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [FLAGGA]... [DBNAMN]\n"
+
+#: pg_dump.c:994 pg_dumpall.c:608 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Allmänna flaggor:\n"
+
+#: pg_dump.c:995
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=FILENAME fil eller katalognamn för utdata\n"
+
+#: pg_dump.c:996
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p utdatans filformat (egen (c), katalog (d), tar (t),\n"
+" ren text (p) (standard))\n"
+
+#: pg_dump.c:998
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM använd så här många parellella job för att dumpa\n"
+
+#: pg_dump.c:999 pg_dumpall.c:610
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose visa mer information\n"
+
+#: pg_dump.c:1000 pg_dumpall.c:611
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_dump.c:1001
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 komprimeringsnivå för komprimerade format\n"
+
+#: pg_dump.c:1002 pg_dumpall.c:612
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=TIMEOUT misslyckas efter att ha väntat i TIMEOUT på tabellås\n"
+
+#: pg_dump.c:1003 pg_dumpall.c:639
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync vänta inte på att ändingar säkert skrivits till disk\n"
+
+#: pg_dump.c:1004 pg_dumpall.c:613
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_dump.c:1006 pg_dumpall.c:614
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Flaggor som styr utmatning:\n"
+
+#: pg_dump.c:1007 pg_dumpall.c:615
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only dumpa bara data, inte schema\n"
+
+#: pg_dump.c:1008
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs inkludera stora objekt i dumpen\n"
+
+#: pg_dump.c:1009
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs exkludera stora objekt i dumpen\n"
+
+#: pg_dump.c:1010 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean nollställ (drop) databasobjekt innan återskapande\n"
+
+#: pg_dump.c:1011
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create inkludera kommandon för att skapa databasen i dumpen\n"
+
+#: pg_dump.c:1012
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=MALL dumpa bara de angivna utökningarna\n"
+
+#: pg_dump.c:1013 pg_dumpall.c:617
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=KODNING dumpa data i teckenkodning KODNING\n"
+
+#: pg_dump.c:1014
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=MALL dumpa bara de angivna scheman\n"
+
+#: pg_dump.c:1015
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=MALL dumpa INTE de angivna scheman\n"
+
+#: pg_dump.c:1016
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner hoppa över återställande av objektägare i\n"
+" textformatdumpar\n"
+
+#: pg_dump.c:1018 pg_dumpall.c:621
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only dumpa bara scheman, inte data\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAME namn på superuser för textformatdumpar\n"
+
+#: pg_dump.c:1020
+#, c-format
+msgid " -t, --table=PATTERN dump the specified table(s) only\n"
+msgstr " -t, --table=MALL dumpa bara de angivna tabellerna\n"
+
+#: pg_dump.c:1021
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=MALL dumpa INTE de angivna tabellerna\n"
+
+#: pg_dump.c:1022 pg_dumpall.c:624
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges dumpa inte rättigheter (grant/revoke)\n"
+
+#: pg_dump.c:1023 pg_dumpall.c:625
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade används bara av uppgraderingsverktyg\n"
+
+#: pg_dump.c:1024 pg_dumpall.c:626
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts dumpa data som INSERT med kolumnnamn\n"
+
+#: pg_dump.c:1025 pg_dumpall.c:627
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr " --disable-dollar-quoting slå av dollar-citering, använd standard SQL-citering\n"
+
+#: pg_dump.c:1026 pg_dumpall.c:628 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers slå av triggrar vid återställning av enbart data\n"
+
+#: pg_dump.c:1027
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security slå på radsäkerhet (dumpa bara data användaren\n"
+" har rätt till)\n"
+
+#: pg_dump.c:1029
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=MALL dumpa INTE data för de angivna tabellerna\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:630
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM övertrumfa standardinställningen för extra_float_digits\n"
+
+#: pg_dump.c:1031 pg_dumpall.c:631 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists använd IF EXISTS när objekt droppas\n"
+
+#: pg_dump.c:1032
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=MALL\n"
+" inkludera data i främmande tabeller från\n"
+" främmande servrar som matchar MALL\n"
+
+#: pg_dump.c:1035 pg_dumpall.c:632
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts dumpa data som INSERT, istället för COPY\n"
+
+#: pg_dump.c:1036 pg_dumpall.c:633
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root ladda partitioner via root-tabellen\n"
+
+#: pg_dump.c:1037 pg_dumpall.c:634
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments dumpa inte kommentarer\n"
+
+#: pg_dump.c:1038 pg_dumpall.c:635
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications dumpa inte publiceringar\n"
+
+#: pg_dump.c:1039 pg_dumpall.c:637
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels dumpa inte tilldelning av säkerhetsetiketter\n"
+
+#: pg_dump.c:1040 pg_dumpall.c:638
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions dumpa inte prenumereringar\n"
+
+#: pg_dump.c:1041 pg_dumpall.c:640
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method dumpa inte tabellaccessmetoder\n"
+
+#: pg_dump.c:1042 pg_dumpall.c:641
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces dumpa inte användning av tabellutymmen\n"
+
+#: pg_dump.c:1043 pg_dumpall.c:642
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression dumpa inte komprimeringsmetoder för TOAST\n"
+
+#: pg_dump.c:1044 pg_dumpall.c:643
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data dumpa inte ologgad tabelldata\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:644
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing addera ON CONFLICT DO NOTHING till INSERT-kommandon\n"
+
+#: pg_dump.c:1046 pg_dumpall.c:645
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr " --quote-all-identifiers citera alla identifierar, även om de inte är nyckelord\n"
+
+#: pg_dump.c:1047 pg_dumpall.c:646
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NRADER antal rader per INSERT; implicerar --inserts\n"
+
+#: pg_dump.c:1048
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=SEKTION dumpa namngiven sektion (pre-data, data eller post-data)\n"
+
+#: pg_dump.c:1049
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable wait until the dump can run without anomalies\n"
+
+#: pg_dump.c:1050
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT använda namngivet snapshot för att dumpa\n"
+
+#: pg_dump.c:1051 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names kräv att mallar för tabeller och/eller scheman matchar\n"
+" minst en sak var\n"
+
+#: pg_dump.c:1053 pg_dumpall.c:647 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" använd kommandot SET SESSION AUTHORIZATION istället för\n"
+" kommandot ALTER OWNER för att sätta ägare\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:651 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Flaggor för anslutning:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=DBNAMN databasens som skall dumpas\n"
+
+#: pg_dump.c:1059 pg_dumpall.c:653 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:655 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT databasens värdport\n"
+
+#: pg_dump.c:1061 pg_dumpall.c:656 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAMN anslut med datta användarnamn mot databasen\n"
+
+#: pg_dump.c:1062 pg_dumpall.c:657 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password fråga aldrig efter lösenord\n"
+
+#: pg_dump.c:1063 pg_dumpall.c:658 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password fråga om lösenord (borde ske automatiskt)\n"
+
+#: pg_dump.c:1064 pg_dumpall.c:659
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLLNAMN gör SET ROLE innan dumpen\n"
+
+#: pg_dump.c:1066
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Om inget databasnamn anges, då kommer värdet i omgivningsvariabel\n"
+"PGDATABASE att användas.\n"
+"\n"
+
+#: pg_dump.c:1068 pg_dumpall.c:663 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapportera fel till <%s>.\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:664 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_dump.c:1088 pg_dumpall.c:488
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "ogiltig klientteckenkodning \"%s\" angiven"
+
+#: pg_dump.c:1226
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "parallella dumpar från standby-server stöds inte av denna serverversion"
+
+#: pg_dump.c:1291
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "ogiltigt utdataformat \"%s\" angivet"
+
+#: pg_dump.c:1332 pg_dump.c:1388 pg_dump.c:1441 pg_dumpall.c:1282
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "ej korrekt kvalificerat namn (för många namn med punkt): %s"
+
+#: pg_dump.c:1340
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "hittade inga matchande scheman för mallen \"%s\""
+
+#: pg_dump.c:1393
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "hittade inga matchande utökningar för mallen \"%s\""
+
+#: pg_dump.c:1446
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "hittade inga matchande främmande servrar för mallen \"%s\""
+
+#: pg_dump.c:1509
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "ej korrekt relationsnamn (för många namn med punkt): %s"
+
+#: pg_dump.c:1520
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "hittade inga matchande tabeller för mallen \"%s\""
+
+#: pg_dump.c:1547
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Du är för närvarande inte uppkopplad mot en databas."
+
+#: pg_dump.c:1550
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "referenser till andra databaser är inte implementerat: %s"
+
+#: pg_dump.c:1981
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "dumpar innehållet i tabell \"%s.%s\""
+
+#: pg_dump.c:2087
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Dumpning av innehållet i tabellen \"%s\" misslyckades: PQendcopy() misslyckades."
+
+#: pg_dump.c:2088 pg_dump.c:2098
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Felmeddelandet från servern: %s"
+
+#: pg_dump.c:2089 pg_dump.c:2099
+#, c-format
+msgid "Command was: %s"
+msgstr "Kommandot var: %s"
+
+#: pg_dump.c:2097
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Dumpning av innehållet i tabellen \"%s\" misslyckades: PQgetResult() misslyckades."
+
+#: pg_dump.c:2179
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "fel antal fält hämtades för tabell \"%s\""
+
+#: pg_dump.c:2875
+#, c-format
+msgid "saving database definition"
+msgstr "sparar databasdefinition"
+
+#: pg_dump.c:2971
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "okänd lokalleverantör: %s"
+
+#: pg_dump.c:3317
+#, c-format
+msgid "saving encoding = %s"
+msgstr "sparar kodning = %s"
+
+#: pg_dump.c:3342
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "sparar standard_conforming_strings = %s"
+
+#: pg_dump.c:3381
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "kunde inte parsa resultat från current_schemas()"
+
+#: pg_dump.c:3400
+#, c-format
+msgid "saving search_path = %s"
+msgstr "sparar search_path = %s"
+
+#: pg_dump.c:3438
+#, c-format
+msgid "reading large objects"
+msgstr "läser stora objekt"
+
+#: pg_dump.c:3576
+#, c-format
+msgid "saving large objects"
+msgstr "sparar stora objekt"
+
+#: pg_dump.c:3617
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "fel vid läsning av stort objekt %u: %s"
+
+#: pg_dump.c:3723
+#, c-format
+msgid "reading row-level security policies"
+msgstr "läser säkerhetspolicy på radnivå"
+
+#: pg_dump.c:3864
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "oväntad kommandotyp för policy: %c"
+
+#: pg_dump.c:4314 pg_dump.c:4632 pg_dump.c:11835 pg_dump.c:17724
+#: pg_dump.c:17726 pg_dump.c:18347
+#, c-format
+msgid "could not parse %s array"
+msgstr "kunde inte parsa arrayen %s"
+
+#: pg_dump.c:4500
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "prenumerationer har inte dumpats få aktuell användare inte är en superuser"
+
+#: pg_dump.c:5014
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "kunde inte hitta föräldrautökning för %s %s"
+
+#: pg_dump.c:5159
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "schema med OID %u existerar inte"
+
+#: pg_dump.c:6615 pg_dump.c:16988
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "misslyckades med riktighetskontroll, föräldratabell med OID %u för sekvens med OID %u hittas inte"
+
+#: pg_dump.c:6758
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "misslyckades med riktighetskontroll, hittade inte tabell med OID %u i pg_partitioned_table"
+
+#: pg_dump.c:6989 pg_dump.c:7256 pg_dump.c:7727 pg_dump.c:8394 pg_dump.c:8515
+#: pg_dump.c:8669
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "okänt tabell-OID %u"
+
+#: pg_dump.c:6993
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "oväntat indexdata för tabell \"%s\""
+
+#: pg_dump.c:7488
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "misslyckades med riktighetskontroll, föräldratabell med OID %u för pg_rewrite-rad med OID %u hittades inte"
+
+#: pg_dump.c:7779
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "fråga producerade null som refererad tabell för främmande nyckel-trigger \"%s\" i tabell \"%s\" (OID för tabell : %u)"
+
+#: pg_dump.c:8398
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "oväntad kolumndata för tabell \"%s\""
+
+#: pg_dump.c:8428
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "ogiltigt kolumnnumrering i tabell \"%s\""
+
+#: pg_dump.c:8477
+#, c-format
+msgid "finding table default expressions"
+msgstr "hittar tabellers default-uttryck"
+
+#: pg_dump.c:8519
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "felaktigt adnum-värde %d för tabell \"%s\""
+
+#: pg_dump.c:8619
+#, c-format
+msgid "finding table check constraints"
+msgstr "hittar tabellers check-villkor"
+
+#: pg_dump.c:8673
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "förväntade %d check-villkor för tabell \"%s\" men hittade %d"
+msgstr[1] "förväntade %d check-villkor för tabell \"%s\" men hittade %d"
+
+#: pg_dump.c:8677
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "Systemkatalogerna kan vara trasiga."
+
+#: pg_dump.c:9367
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "roll med OID %u existerar inte"
+
+#: pg_dump.c:9479 pg_dump.c:9508
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "ogiltig pg_init_privs-post: %u %u %d"
+
+#: pg_dump.c:10329
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "typtype för datatyp \"%s\" verkar vara ogiltig"
+
+#: pg_dump.c:11904
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "okänt provolatile-värde för funktion \"%s\""
+
+#: pg_dump.c:11954 pg_dump.c:13817
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "okänt proparallel-värde för funktion \"%s\""
+
+#: pg_dump.c:12086 pg_dump.c:12192 pg_dump.c:12199
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "kunde inte hitta funktionsdefinitionen för funktion med OID %u"
+
+#: pg_dump.c:12125
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "felaktigt värde i fältet pg_cast.castfunc eller pg_cast.castmethod"
+
+#: pg_dump.c:12128
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "felaktigt värde i fältet pg_cast.castmethod"
+
+#: pg_dump.c:12218
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "felaktig transform-definition, minst en av trffromsql och trftosql måste vara ickenoll"
+
+#: pg_dump.c:12235
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "felaktigt värde i fältet pg_transform.trffromsql"
+
+#: pg_dump.c:12256
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "felaktigt värde i fältet pg_transform.trftosql"
+
+#: pg_dump.c:12401
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "postfix-operatorer stöds inte längre (operator \"%s\")"
+
+#: pg_dump.c:12571
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "kunde inte hitta en operator med OID %s."
+
+#: pg_dump.c:12639
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "ogiltig typ \"%c\" för accessmetod \"%s\""
+
+#: pg_dump.c:13293
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "okänd jämförelseleverantör: %s"
+
+#: pg_dump.c:13302 pg_dump.c:13311 pg_dump.c:13321 pg_dump.c:13330
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "ogiltig jämförelse \"%s\""
+
+#: pg_dump.c:13346
+#, c-format
+msgid "unrecognized collation provider '%c'"
+msgstr "okänd jämförelseleverantör: '%c'"
+
+#: pg_dump.c:13736
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "okänt aggfinalmodify-värde för aggregat \"%s\""
+
+#: pg_dump.c:13792
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "okänt aggmfinalmodify-värde för aggregat \"%s\""
+
+#: pg_dump.c:14510
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "okänd objekttyp i standardrättigheter: %d"
+
+#: pg_dump.c:14526
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "kunde inte parsa standard-ACL-lista (%s)"
+
+#: pg_dump.c:14608
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "kunde inte parsa initial ACL-lista (%s) eller default (%s) för objekt \"%s\" (%s)"
+
+#: pg_dump.c:14633
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "kunde inte parsa ACL-lista (%s) eller default (%s) för objekt \"%s\" (%s)"
+
+#: pg_dump.c:15171
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "fråga för att hämta definition av vy \"%s\" returnerade ingen data"
+
+#: pg_dump.c:15174
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "fråga för att hämta definition av vy \"%s\" returnerade mer än en definition"
+
+#: pg_dump.c:15181
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "definition av vy \"%s\" verkar vara tom (längd noll)"
+
+#: pg_dump.c:15265
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS stöds inte längre (tabell \"%s\")"
+
+#: pg_dump.c:16194
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "ogiltigt kolumnnummer %d för tabell \"%s\""
+
+#: pg_dump.c:16272
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "kunde inte parsa kolumn i indexstatistik"
+
+#: pg_dump.c:16274
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "kunde inte parsa värden i indexstatistik"
+
+#: pg_dump.c:16276
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "antal kolumner och värden stämmer inte i indexstatistik"
+
+#: pg_dump.c:16494
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "saknar index för integritetsvillkor \"%s\""
+
+#: pg_dump.c:16722
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "oväntad integritetsvillkorstyp: %c"
+
+#: pg_dump.c:16823 pg_dump.c:17052
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "fråga för att hämta data för sekvens \"%s\" returnerade %d rad (förväntade 1)"
+msgstr[1] "fråga för att hämta data för sekvens \"%s\" returnerade %d rader (förväntade 1)"
+
+#: pg_dump.c:16855
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "okänd sekvenstyp: %s"
+
+#: pg_dump.c:17144
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "oväntat tgtype-värde: %d"
+
+#: pg_dump.c:17216
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "felaktig argumentsträng (%s) för trigger \"%s\" i tabell \"%s\""
+
+#: pg_dump.c:17485
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "fråga för att hämta regel \"%s\" för tabell \"%s\" misslyckades: fel antal rader returnerades"
+
+#: pg_dump.c:17638
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "kunde inte hitta refererad utökning %u"
+
+#: pg_dump.c:17728
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "antal konfigurationer och villkor stämmer inte för utökning"
+
+#: pg_dump.c:17860
+#, c-format
+msgid "reading dependency data"
+msgstr "läser beroendedata"
+
+#: pg_dump.c:17946
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "inget refererande objekt %u %u"
+
+#: pg_dump.c:17957
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "inget refererat objekt %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "ogiltigt dumpId %d"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "ogiltigt beroende %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "kunde inte fastställa beroendeloop"
+
+#: pg_dump_sort.c:1276
+#, c-format
+msgid "there are circular foreign-key constraints on this table:"
+msgid_plural "there are circular foreign-key constraints among these tables:"
+msgstr[0] "det finns cirkulära främmande nyckelberoenden för denna tabell:"
+msgstr[1] "det finns cirkulära främmande nyckelberoenden för dessa tabeller:"
+
+#: pg_dump_sort.c:1281
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "Du kan eventiellt inte återställa dumpen utan att använda --disable-triggers eller temporärt droppa vilkoren."
+
+#: pg_dump_sort.c:1282
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "Överväg att göra en full dump istället för --data-only för att undvika detta problem."
+
+#: pg_dump_sort.c:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "kunde inte räta ut beroendeloopen för dessa saker:"
+
+#: pg_dumpall.c:205
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\""
+
+#: pg_dumpall.c:208
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s"
+
+#: pg_dumpall.c:357
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "flaggan --exclude-database kan inte användas tillsammans med -g/--globals-only, -r/--roles-only eller -t/--tablespaces-only"
+
+#: pg_dumpall.c:365
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "flaggorna \"bara gobala\" (-g) och \"bara roller\" (-r) kan inte användas tillsammans"
+
+#: pg_dumpall.c:372
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "flaggorna \"bara globala\" (-g) och \"bara tabellutrymmen\" (-t) kan inte användas tillsammans"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "flaggorna \"bara roller\" (-r) och \"bara tabellutrymmen\" (-t) kan inte användas tillsammans"
+
+#: pg_dumpall.c:444 pg_dumpall.c:1587
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "kunde inte ansluta till databasen \"%s\""
+
+#: pg_dumpall.c:456
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"kunde inte ansluta till databasen \"postgres\" eller \"template1\"\n"
+"Ange en annan databas."
+
+#: pg_dumpall.c:604
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s extraherar ett PostgreSQL databaskluster till en SQL-scriptfil.\n"
+"\n"
+
+#: pg_dumpall.c:606
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [FLAGGA]...\n"
+
+#: pg_dumpall.c:609
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=FILENAME utdatafilnamn\n"
+
+#: pg_dumpall.c:616
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean nollställ (drop) databaser innan återskapning\n"
+
+#: pg_dumpall.c:618
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only dumpa bara globala objekt, inte databaser\n"
+
+#: pg_dumpall.c:619 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner återställ inte objektägare\n"
+
+#: pg_dumpall.c:620
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only dumpa endast roller, inte databaser eller tabellutrymmen\n"
+
+#: pg_dumpall.c:622
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NAMN namn på superuser för användning i dumpen\n"
+
+#: pg_dumpall.c:623
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only dumpa endasdt tabellutrymmen, inte databaser eller roller\n"
+
+#: pg_dumpall.c:629
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=MALL uteslut databaser vars namn matchar MALL\n"
+
+#: pg_dumpall.c:636
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords dumpa inte lösenord för roller\n"
+
+#: pg_dumpall.c:652
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=ANSLSTR anslut med anslutningssträng\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=DBNAMN alternativ standarddatabas\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Om -f/--file inte används så kommer SQL-skriptet skriva till standard ut.\n"
+"\n"
+
+#: pg_dumpall.c:803
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "rollnamn som startar med \"pg_\" hoppas över (%s)"
+
+#: pg_dumpall.c:1018
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "kunde inte parsa ACL-listan (%s) för parameter \"%s\""
+
+#: pg_dumpall.c:1136
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "kunde inte tolka ACL-listan (%s) för tabellutrymme \"%s\""
+
+#: pg_dumpall.c:1343
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "utesluter databas \"%s\""
+
+#: pg_dumpall.c:1347
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "dumpar databas \"%s\""
+
+#: pg_dumpall.c:1378
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump misslyckades med databas \"%s\", avslutar"
+
+#: pg_dumpall.c:1384
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "kunde inte öppna om utdatafilen \"%s\": %m"
+
+#: pg_dumpall.c:1425
+#, c-format
+msgid "running \"%s\""
+msgstr "kör \"%s\""
+
+#: pg_dumpall.c:1630
+#, c-format
+msgid "could not get server version"
+msgstr "kunde inte hämta serverversionen"
+
+#: pg_dumpall.c:1633
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "kunde inte tolka versionsträngen \"%s\""
+
+#: pg_dumpall.c:1703 pg_dumpall.c:1726
+#, c-format
+msgid "executing %s"
+msgstr "kör: %s"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "en av flaggorna -d/--dbname och -f/--file måste anges"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "flaggorna -d/--dbname och -f/--file kan inte användas ihop"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "flaggorna -C/--create och -1/--single-transaction kan inte användas tillsammans"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "kan inte ange både --single-transaction och multipla job"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "okänt arkivformat \"%s\"; vänligen ange \"c\", \"d\" eller \"t\""
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "fel ignorerade vid återställande: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s återställer en PostgreSQL-databas från ett arkiv skapat av pg_dump.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [FLAGGA]... [FIL]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NAMN koppla upp med databasnamn\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FILNAMN utdatafilnamn (- för stdout)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t backupens filformat (bör ske automatiskt)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list skriv ut summerad TOC för arkivet\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose visa mer information\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Flaggor som styr återställning:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only återställ bara data, inte scheman\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create skapa måldatabasen\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error avsluta vid fel, standard är att fortsätta\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAMN återställ namngivet index\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM använda så här många parallella job för återställning\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=FILNAMN använd innehållsförteckning från denna fil för\n"
+" att välja/sortera utdata\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAMN återställ enbart objekt i detta schema\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAMN återställ inte objekt i detta schema\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAMN(arg) återställ namngiven funktion\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only återställ bara scheman, inte data\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NAMN namn på superuser för att slå av triggrar\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NAMN återställ namngiven relation (tabell, vy, osv.)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NAMN återställ namngiven trigger\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges återställ inte åtkomsträttigheter (grant/revoke)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction återställ i en enda transaktion\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security aktivera radsäkerhet\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments återställ inte kommentarer\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables återställ inte data för tabeller som\n"
+" inte kunde skapas\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications återställ inte publiceringar\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels återställ inte säkerhetsetiketter\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions återställ inte prenumerationer\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method återställ inte tabellaccessmetoder\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces återställ inte användning av tabellutymmen\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=SEKTION återställ namngiven sektion (pre-data, data eller post-data)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME gör SET ROLE innan återställning\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Flaggorna -I, -n, -N, -P, -t, -T och --section kan kombineras och anges\n"
+"många gånger för att välja flera objekt.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Om inget indatafilnamn är angivet, så kommer standard in att användas.\n"
+"\n"
diff --git a/src/bin/pg_dump/po/tr.po b/src/bin/pg_dump/po/tr.po
new file mode 100644
index 0000000..7ec7f5d
--- /dev/null
+++ b/src/bin/pg_dump/po/tr.po
@@ -0,0 +1,3070 @@
+# translation of pg_dump-tr.po to Turkish
+# Devrim GUNDUZ <devrim@CommandPrompt.com>, 2004, 2006, 2007.
+# Nicolai TUFAR <ntufar@gmail.com> 2004, 2005, 2006, 2007.
+# Abdullah Gülner <agulner@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump-tr\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2019-04-26 13:47+0000\n"
+"PO-Revision-Date: 2019-05-31 15:16+0300\n"
+"Last-Translator: Abdullah Gülner\n"
+"Language-Team: Turkish <ceviri@postgresql.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.8.7.1\n"
+"X-Poedit-Basepath: /home/ntufar/pg/pgsql/src/bin/pg_dump\n"
+"X-Poedit-SearchPath-0: C:/pgsql/src/bin/pg_dump\n"
+"X-Poedit-SearchPath-1: /home/ntufar/pg/pgsql/src/backend\n"
+"X-Poedit-SearchPath-2: c:/pgsql/src/backend\n"
+
+#: ../../../src/fe_utils/logging.c:182
+#, c-format
+msgid "fatal: "
+msgstr "ölümcül (fatal): "
+
+#: ../../../src/fe_utils/logging.c:189
+#, c-format
+msgid "error: "
+msgstr "hata: "
+
+#: ../../../src/fe_utils/logging.c:196
+#, c-format
+msgid "warning: "
+msgstr "uyarı: "
+
+#: ../../common/exec.c:138 ../../common/exec.c:255 ../../common/exec.c:301
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "geçerli dizin tespit edilemedi: %m"
+
+#: ../../common/exec.c:157
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "geçersiz ikili (binary) \"%s\""
+
+#: ../../common/exec.c:207
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "\"%s\" ikili (binary) dosyası okunamadı"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "\"%s\" çalıştırmak için bulunamadı"
+
+#: ../../common/exec.c:271 ../../common/exec.c:310
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "çalışma dizini \"%s\" olarak değiştirilemedi: %m"
+
+#: ../../common/exec.c:288
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "symbolic link \"%s\" okuma hatası: %m"
+
+#: ../../common/exec.c:541
+#, c-format
+msgid "pclose failed: %m"
+msgstr "pclose başarısız oldu: %m"
+
+#: ../../common/exec.c:670 ../../common/exec.c:715 ../../common/exec.c:807
+msgid "out of memory"
+msgstr "yetersiz bellek"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "yetersiz bellek\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null pointer çoğaltılamıyor (duplicate) (iç hata)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "komut çalıştırılabilir değil"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "komut bulunamadı"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "alt süreç %d çıkış koduyla sonuçlandırılmıştır"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "alt süreç 0x%X exception tarafından sonlandırılmıştır"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "alt süreç %d sinyali tarafından sonlandırılmıştır :%s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "alt süreç %d bilinmeyen durumu ile sonlandırılmıştır"
+
+#: common.c:124
+#, c-format
+msgid "reading extensions"
+msgstr "uzantılar okunuyor"
+
+#: common.c:128
+#, c-format
+msgid "identifying extension members"
+msgstr "uzantı üyeleri belirleniyor"
+
+#: common.c:131
+#, c-format
+msgid "reading schemas"
+msgstr "şemalar okunuyor"
+
+#: common.c:141
+#, c-format
+msgid "reading user-defined tables"
+msgstr "kullanıcı tanımlı tablolar okunuyor"
+
+#: common.c:148
+#, c-format
+msgid "reading user-defined functions"
+msgstr "kullanıcı tanımlı fonksiyonlar okunuyor"
+
+#: common.c:153
+#, c-format
+msgid "reading user-defined types"
+msgstr "kullanıcı tanımlı tipler okunuyor"
+
+#: common.c:158
+#, c-format
+msgid "reading procedural languages"
+msgstr "yordamsal diller okunuyor"
+
+#: common.c:161
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "kullanıcı-tanımlı aggregate fonksiyonlar okunuyor"
+
+#: common.c:164
+#, c-format
+msgid "reading user-defined operators"
+msgstr "kullanıcı tanımlı operatörler okunuyor"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "kullanıcı tanımlı erişim yöntemleri okunuyor"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "kullanıcı-tanımlı operatör sınıfları okunuyor"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "kullanıcı tanımlı operatör aileleri okunuyor"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "kullanıcı tanımlı metin arama ayrıştırıcıları okunuyor"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "kullanıcı tanımlı metin arama şablonları okunuyor"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "kullanıcı-tanımlı metin arama sözlükleri okunuyor"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "kullanıcı-tanımlı metin arama yapılandırmaları okunuyor"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "kullanıcı tanımlı foreign-data wrapperlar okunuyor"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "kullanıcı tanımlı foreign sunucular okunuyor"
+
+#: common.c:195
+#, c-format
+msgid "reading default privileges"
+msgstr "öntanımlı yetkiler okunuyor"
+
+#: common.c:198
+#, c-format
+msgid "reading user-defined collations"
+msgstr "kullanıcı tanımlı collation'lar okunuyor"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "kullanıcı tanımlı dönüşümler (conversion) okunuyor"
+
+#: common.c:205
+#, c-format
+msgid "reading type casts"
+msgstr "type cast'lar okunuyor"
+
+#: common.c:208
+#, c-format
+msgid "reading transforms"
+msgstr "dönüşümler (transform) okunuyor"
+
+#: common.c:211
+#, c-format
+msgid "reading table inheritance information"
+msgstr "tablo kalıtım (inheritance) bilgisi okunuyor"
+
+#: common.c:214
+#, c-format
+msgid "reading event triggers"
+msgstr "olay tetikleyicileri okunuyor"
+
+#: common.c:218
+#, c-format
+msgid "finding extension tables"
+msgstr "uzantı tabloları bulunuyor"
+
+#: common.c:222
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "kalıtım (inheritance) ilişkileri bulunuyor"
+
+#: common.c:225
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "ilgili tabloların sütun bilgisi okunuyor"
+
+#: common.c:228
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "alt tablolarda inherited sütunlar işaretleniyor"
+
+#: common.c:231
+#, c-format
+msgid "reading indexes"
+msgstr "indeksler okunuyor"
+
+#: common.c:234
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "bölümlenmiş tablolardaki indeksler işaretleniyor"
+
+#: common.c:237
+#, c-format
+msgid "reading extended statistics"
+msgstr "genişletilmiş istatistikler okunuyor"
+
+#: common.c:240
+#, c-format
+msgid "reading constraints"
+msgstr "bütünlük kısıtlamaları okunuyor"
+
+#: common.c:243
+#, c-format
+msgid "reading triggers"
+msgstr "tetikleyiciler okunuyor"
+
+#: common.c:246
+#, c-format
+msgid "reading rewrite rules"
+msgstr "rewrite kuralları okunuyor"
+
+#: common.c:249
+#, c-format
+msgid "reading policies"
+msgstr "ilkeler (policy) okunuyor"
+
+#: common.c:252
+#, c-format
+msgid "reading publications"
+msgstr "yayınlar (publication) okunuyor"
+
+#: common.c:255
+#, c-format
+msgid "reading publication membership"
+msgstr "yayın üyeliği okunuyor"
+
+#: common.c:258
+#, c-format
+msgid "reading subscriptions"
+msgstr "abonelikler okunuyor"
+
+#: common.c:1024
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "tutarlılık kontrolü başarısız, \"%2$s\" tablosunun (OID %3$u) üst OIDsi %1$u bulunamadı"
+
+#: common.c:1066
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "\"%s\" numerik dizisi ayrıştırılamadı: çok fazla sayı"
+
+#: common.c:1081
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "\"%s\" numerik dizisi ayrıştırılamadı: sayıda geçersiz karakter"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "geçersiz sıkıştırma kodu: %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:508
+#: compress_io.c:551
+#, c-format
+msgid "not built with zlib support"
+msgstr "zlib desteğiyle oluşturulmamış"
+
+#: compress_io.c:237 compress_io.c:336
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "sıkıştırma kütüphanesi ilklendirilemedi: %s"
+
+#: compress_io.c:257
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "sıkıştırma akımı kapatılamadı: %s"
+
+#: compress_io.c:274
+#, c-format
+msgid "could not compress data: %s"
+msgstr "veri sıkıştırılamadı: %s"
+
+#: compress_io.c:352 compress_io.c:367
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "sıkıştırılmış veri açılamadı: %s"
+
+#: compress_io.c:374
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "sıkıştırma kütüphanesi kapatılamadı: %s"
+
+#: compress_io.c:588 compress_io.c:625 pg_backup_tar.c:555 pg_backup_tar.c:558
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "girdi dosyası okuma hatası: %s"
+
+#: compress_io.c:627 pg_backup_custom.c:578 pg_backup_directory.c:539
+#: pg_backup_tar.c:795 pg_backup_tar.c:818
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "girdi dosyası okuma hatası: dosya sonu"
+
+#: parallel.c:263
+#, c-format
+msgid "WSAStartup failed: %d"
+msgstr "WSAStartup başarısız: %d"
+
+#: parallel.c:968
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "iletişim kanalları oluşturulamadı: %m"
+
+#: parallel.c:1031
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "işçi süreci yaratılamadı: %m"
+
+#: parallel.c:1160
+#, c-format
+msgid "unrecognized command received from master: \"%s\""
+msgstr "ana sunucudan (master) bilinmeyen komut alındı: \"%s\""
+
+#: parallel.c:1203 parallel.c:1441
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "alt süreçten (worker) geçersiz mesaj alındı: \"%s\""
+
+#: parallel.c:1335
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"\"%s\" nesnesi üzerinde kilit alınamadı\n"
+"Bu genellikle pg_dump ana süreci tablo üzerinde başta ACCESS SHARE kilidi aldıktan sonra başka birinin tablo üzerinde ACCESS EXCLUSIVE kilidi talep ettiği anlamına gelir."
+
+#: parallel.c:1424
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "alt süreç beklenmeyen biçimde sonlandı"
+
+#: parallel.c:1546 parallel.c:1662
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "iletişim kanalına yazma başarısız: %m"
+
+#: parallel.c:1623
+#, c-format
+msgid "select() failed: %m"
+msgstr "select() başarısız oldu: %m"
+
+#: parallel.c:1746
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: soket oluşturulamadı: hata kodu %d"
+
+#: parallel.c:1757
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: bağlanamadı (bind): hata kodu %d"
+
+#: parallel.c:1764
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: dinleyemedi: hata kodu %d"
+
+#: parallel.c:1771
+#, c-format
+msgid "pgpipe: getsockname() failed: error code %d"
+msgstr "pgpipe: getsockname() başarısız oldu: hata kodu %d"
+
+#: parallel.c:1782
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: ikinci soket oluşturulamadı: hata kodu %d"
+
+#: parallel.c:1791
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: soket bağlanamadı: hata kodu %d"
+
+#: parallel.c:1800
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: bağlantı kabul edemedi: hata kodu %d"
+
+#: pg_backup_archiver.c:273 pg_backup_archiver.c:1596
+#, c-format
+msgid "could not close output file: %m"
+msgstr "çıktı dosyası kapatılamadı: %m"
+
+#: pg_backup_archiver.c:317 pg_backup_archiver.c:321
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "arşiv kalemleri doğru bölüm sırasında değil"
+
+#: pg_backup_archiver.c:327
+#, c-format
+msgid "unexpected section code %d"
+msgstr "beklenmeyen bölüm kodu %d"
+
+#: pg_backup_archiver.c:364
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "paralel geri yükleme bu arşiv dosya biçimiyle desteklenmiyor"
+
+#: pg_backup_archiver.c:368
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "paralel geri yükleme özelliği 8.0 öncesi pg_dump ile yapılan arşivlerle desteklenmemektedir"
+
+#: pg_backup_archiver.c:386
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)"
+msgstr "sıkıştırılmış arşivden yükleme başarısız (bu kurulumda sıkıştırma desteklenmiyor)"
+
+#: pg_backup_archiver.c:403
+#, c-format
+msgid "connecting to database for restore"
+msgstr "geri yükleme için veritabanına bağlanılıyor"
+
+#: pg_backup_archiver.c:405
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "1.3 sürüm öncesi arşivlerinde doğrudan veritabanı bağlantıları desteklenmemektedir"
+
+#: pg_backup_archiver.c:450
+#, c-format
+msgid "implied data-only restore"
+msgstr "örtük salt veri geri yükleme"
+
+#: pg_backup_archiver.c:516
+#, c-format
+msgid "dropping %s %s"
+msgstr "%s %s kaldırılıyor"
+
+#: pg_backup_archiver.c:611
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "\"%s\" ifadesinde nereye IF EXISTS ekleneceği bulunamadı"
+
+#: pg_backup_archiver.c:767 pg_backup_archiver.c:769
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "asıl dump dosyasından uyarı: %s"
+
+#: pg_backup_archiver.c:784
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "%s oluşturuluyor \"%s.%s\""
+
+#: pg_backup_archiver.c:787
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "%s oluşturuluyor \"%s\""
+
+#: pg_backup_archiver.c:844
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "yeni \"%s\" veritabanına bağlanılıyor"
+
+#: pg_backup_archiver.c:872
+#, c-format
+msgid "processing %s"
+msgstr "%s işleniyor"
+
+#: pg_backup_archiver.c:892
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosu için veri işleniyor"
+
+#: pg_backup_archiver.c:954
+#, c-format
+msgid "executing %s %s"
+msgstr "%s %s yürütülüyor"
+
+#: pg_backup_archiver.c:993
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "%s için tetikleyiciler etkisiz hale getiriliyor"
+
+#: pg_backup_archiver.c:1019
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "%s için tetikleyiciler etkinleştiriliyor"
+
+#: pg_backup_archiver.c:1047
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "iç hata -- WriteData, DataDumper yordamının bağlamı dışında çağrılamaz"
+
+#: pg_backup_archiver.c:1232
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "seçilen biçimde large-object çıktısı desteklenmemektedir"
+
+#: pg_backup_archiver.c:1290
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "%d large object geri yüklendi"
+msgstr[1] "%d large object geri yüklendi"
+
+#: pg_backup_archiver.c:1311 pg_backup_tar.c:738
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "%u OID'li large-object geri yükleniyor"
+
+#: pg_backup_archiver.c:1323
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "%u large object oluşturulamadı: %s"
+
+#: pg_backup_archiver.c:1328 pg_dump.c:3463
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "%u large object açılamadı: %s"
+
+#: pg_backup_archiver.c:1385
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "\"%s\" TOC dosyası açılamadı: %m"
+
+#: pg_backup_archiver.c:1425
+#, c-format
+msgid "line ignored: %s"
+msgstr "satır yoksayıldı: %s"
+
+#: pg_backup_archiver.c:1432
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "ID %d için bir girdi bulunamıyor"
+
+#: pg_backup_archiver.c:1453 pg_backup_directory.c:222
+#: pg_backup_directory.c:587
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "TOC dosyası kapatılamıyor: %m"
+
+#: pg_backup_archiver.c:1568 pg_backup_custom.c:159 pg_backup_directory.c:332
+#: pg_backup_directory.c:574 pg_backup_directory.c:637
+#: pg_backup_directory.c:656
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "\"%s\" çıktı dosyası açılamadı: %m"
+
+#: pg_backup_archiver.c:1570 pg_backup_custom.c:165
+#, c-format
+msgid "could not open output file: %m"
+msgstr "çıktı dosyası açılamadı: %m"
+
+#: pg_backup_archiver.c:1663
+#, c-format
+msgid "wrote %lu byte of large object data (result = %lu)"
+msgid_plural "wrote %lu bytes of large object data (result = %lu)"
+msgstr[0] "large object verisinin %lu baytı yazıldı (sonuç = %lu)"
+msgstr[1] "large object verisinin %lu baytı yazıldı (sonuç = %lu)"
+
+#: pg_backup_archiver.c:1668
+#, c-format
+msgid "could not write to large object (result: %lu, expected: %lu)"
+msgstr "large-object yazılamıyor (sonuç: %lu, beklenen: %lu)"
+
+#: pg_backup_archiver.c:1760
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "INITIALIZING sırasında:"
+
+#: pg_backup_archiver.c:1765
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "PROCESSING TOC sırasında:"
+
+#: pg_backup_archiver.c:1770
+#, c-format
+msgid "while FINALIZING:"
+msgstr "FINALIZING sırasında:"
+
+#: pg_backup_archiver.c:1775
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "TOC girişte hata %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1851
+#, c-format
+msgid "bad dumpId"
+msgstr "kötü dumpId"
+
+#: pg_backup_archiver.c:1872
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "TABLE DATA öğesi için kötü tablo dumpId değeri"
+
+#: pg_backup_archiver.c:1964
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "beklenmeyen veri konum bayrağı %d"
+
+#: pg_backup_archiver.c:1977
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "dump dosyasında dosya göstergesi çok büyük"
+
+#: pg_backup_archiver.c:2114 pg_backup_archiver.c:2124
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "dizin adı çok uzun: \"%s\""
+
+#: pg_backup_archiver.c:2132
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "\"%s\" dizini geçerli bir arşiv olarak görünmüyor (\"toc.dat\" bulunamadı)"
+
+#: pg_backup_archiver.c:2140 pg_backup_custom.c:176 pg_backup_custom.c:760
+#: pg_backup_directory.c:207 pg_backup_directory.c:391
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "\"%s\" girdi dosyası açılamadı: %m"
+
+#: pg_backup_archiver.c:2147 pg_backup_custom.c:182
+#, c-format
+msgid "could not open input file: %m"
+msgstr "girdi dosyası açılamadı: %m"
+
+#: pg_backup_archiver.c:2153
+#, c-format
+msgid "could not read input file: %m"
+msgstr "girdi dosyası okuma hatası: %m"
+
+#: pg_backup_archiver.c:2155
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "girdi dosyası fazla kısa (okunan: %lu, beklenen: 5)"
+
+#: pg_backup_archiver.c:2240
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "girdi dosyası metin biçiminde bir döküm (dump) gibi görünüyor. Lütfen psql kullanın."
+
+#: pg_backup_archiver.c:2246
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "girdi dosyası geçerli bir arşiv gibi görünmüyor (çok kısa?)"
+
+#: pg_backup_archiver.c:2252
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "girdi dosyası geçerli bir arşiv gibi görünmüyor"
+
+#: pg_backup_archiver.c:2272
+#, c-format
+msgid "could not close input file: %m"
+msgstr "çıktı dosyası kapatılamadı: %m"
+
+#: pg_backup_archiver.c:2386
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "tanınmayan dosya biçimi: \"%d\""
+
+#: pg_backup_archiver.c:2468 pg_backup_archiver.c:4474
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "%d %s %s öğesi bitirildi"
+
+#: pg_backup_archiver.c:2472 pg_backup_archiver.c:4487
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "alt süreç başarısız oldu: çıkış kodu %d"
+
+#: pg_backup_archiver.c:2592
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "ID %d olan giriş kapsam dışıdır -- bozuk bir TOC olabilir"
+
+#: pg_backup_archiver.c:2659
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "WITH OIDS ile tanımlanmış tabloların geri yüklenmesi (restore) artık desteklenmemektedir"
+
+#: pg_backup_archiver.c:2741
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "tanınmayan dil kodlaması \"%s\""
+
+#: pg_backup_archiver.c:2746
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "geçersiz ENCODING öğesi: %s"
+
+#: pg_backup_archiver.c:2764
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "geçersiz STDSTRINGS öğesi: %s"
+
+#: pg_backup_archiver.c:2789
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "\"%s\" şeması bulunamadı"
+
+#: pg_backup_archiver.c:2796
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "\"%s\" tablosu bulunamadı"
+
+#: pg_backup_archiver.c:2803
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "\"%s\" indeksi bulunamadı"
+
+#: pg_backup_archiver.c:2810
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "\"%s\" fonksiyonu bulunamadı"
+
+#: pg_backup_archiver.c:2817
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "\"%s\" tetikleyicisi bulunamadı"
+
+#: pg_backup_archiver.c:3196
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "oturum kullanıcısı \"%s\" olarak değiştirilemedi: %s"
+
+#: pg_backup_archiver.c:3533 pg_backup_archiver.c:3690
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "\"%s\" nesne tipi için sahip bilgisinin nasıl ayarlanacağı bilinmiyor"
+
+#: pg_backup_archiver.c:3794
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "dosya başlığında magic string bulunamadı"
+
+#: pg_backup_archiver.c:3807
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "dosya başlığında desteklenmeyen sürüm (%d.%d)"
+
+#: pg_backup_archiver.c:3812
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "tamsayı (integer) boyutunda (%lu) tutarlılık kontrolü başarısız"
+
+#: pg_backup_archiver.c:3816
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "arşiv daha büyük tam sayılara (integer) sahip platformda oluşturulmuş, bazı işlemler başarısız olabilir"
+
+#: pg_backup_archiver.c:3826
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "dosyada bulunan biçim (%2$d) beklenen biçimden (%1$d) farklıdır"
+
+#: pg_backup_archiver.c:3842
+#, c-format
+msgid "archive is compressed, but this installation does not support compression -- no data will be available"
+msgstr "arşiv sıkıştırılmış, ancak bu kurulum sıkıştırmayı desteklemiyor -- uygun veri olmayacak"
+
+#: pg_backup_archiver.c:3860
+#, c-format
+msgid "invalid creation date in header"
+msgstr "veri başlığında geçersiz tarih"
+
+#: pg_backup_archiver.c:3997
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "%d %s %s öğesi işleniyor"
+
+#: pg_backup_archiver.c:4076
+#, c-format
+msgid "entering main parallel loop"
+msgstr "ana paralel döngüye giriliyor"
+
+#: pg_backup_archiver.c:4087
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "%d %s %s öğesi atlanıyor"
+
+#: pg_backup_archiver.c:4096
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "%d %s %s öğesi başlatılıyor"
+
+#: pg_backup_archiver.c:4150
+#, c-format
+msgid "finished main parallel loop"
+msgstr "ana paralel döngü bitti"
+
+#: pg_backup_archiver.c:4188
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "atlanan %d %s %s öğesi işleniyor"
+
+#: pg_backup_archiver.c:4793
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "\"%s\" tablosu oluşturulamadı, onun verileri yüklenmeyecektir"
+
+#: pg_backup_custom.c:377 pg_backup_null.c:150
+#, c-format
+msgid "invalid OID for large object"
+msgstr "large object için geçersiz OID"
+
+#: pg_backup_custom.c:447
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "arşivde ararken tanınmayan veri blok tipine (%d) rastlandı"
+
+#: pg_backup_custom.c:458 pg_backup_custom.c:818
+#, c-format
+msgid "error during file seek: %m"
+msgstr "dosya içerisinde gösterge ilerleme hatası: %m"
+
+#: pg_backup_custom.c:467
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive"
+msgstr "arşivde %d block ID'si bulunamadı -- arşivdeki eksik veri konumu nedeniyle işlenemeyen geçersiz yükleme isteği nedeniyle olabilir"
+
+#: pg_backup_custom.c:472
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "arşivde %d block ID'si bulunamadı -- aranamayan girdi dosyası nedeniyle işlenemeyen geçersiz yükleme isteği nedeniyle olabilir"
+
+#: pg_backup_custom.c:477
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "%d blok ID'si arşivde bulunamadı -- arşiv bozulmuş olabilir"
+
+#: pg_backup_custom.c:484
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "veriyi okurken beklenmeyen blok ID (%d) bulundu -- beklenen: %d"
+
+#: pg_backup_custom.c:498
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "arşivi yüklerken bilinmeyen veri blok tipi %d bulundu"
+
+#: pg_backup_custom.c:580
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "girdi dosyası okuma hatası: %m"
+
+#: pg_backup_custom.c:698 pg_backup_custom.c:751 pg_backup_custom.c:891
+#: pg_backup_tar.c:1091
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "arşiv dosyasında arama pozisyonu belirlenemedi: %m"
+
+#: pg_backup_custom.c:715 pg_backup_custom.c:755
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "arşiv dosyası kapatma hatası: %m"
+
+#: pg_backup_custom.c:738
+#, c-format
+msgid "can only reopen input archives"
+msgstr "sadece girdi arşivleri tekrar açılabilir"
+
+#: pg_backup_custom.c:745
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "standart girdiden paralel geri yükleme desteklenmiyor"
+
+#: pg_backup_custom.c:747
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "taranamayan dosyadan paralel geri yükleme desteklenmiyor"
+
+#: pg_backup_custom.c:763
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "arşiv dosyasında arama pozisyonu ayarlanamadı: %m"
+
+#: pg_backup_custom.c:839
+#, c-format
+msgid "compressor active"
+msgstr "sıkıştırma etkin"
+
+#: pg_backup_custom.c:894
+#, c-format
+msgid "ftell mismatch with expected position -- ftell used"
+msgstr "ftell fonksiyonun bidirdiği pozisyonu ile beklenen pozisyon uyumsuz -- ftell kullanıldı"
+
+#: pg_backup_db.c:44
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "libpq kütüphanesinden server_version alınamadı"
+
+#: pg_backup_db.c:55 pg_dumpall.c:1806
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "sunucu sürümü: %s; %s sürümü: %s"
+
+#: pg_backup_db.c:57 pg_dumpall.c:1808
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "sunucu sürümü uyuşmazlığı nedeniyle iptal ediliyor (abort)"
+
+#: pg_backup_db.c:140
+#, c-format
+msgid "connecting to database \"%s\" as user \"%s\""
+msgstr "\"%2$s\" kullanıcısı olarak \"%1$s\" veritabanına bağlanılıyor"
+
+#: pg_backup_db.c:147 pg_backup_db.c:196 pg_backup_db.c:257 pg_backup_db.c:298
+#: pg_dumpall.c:1631 pg_dumpall.c:1744
+msgid "Password: "
+msgstr "Parola: "
+
+#: pg_backup_db.c:179
+#, c-format
+msgid "failed to reconnect to database"
+msgstr "veritabanına yeniden bağlanma hatası"
+
+#: pg_backup_db.c:184
+#, c-format
+msgid "could not reconnect to database: %s"
+msgstr "%s veritabanına yeniden bağlanılamadı"
+
+#: pg_backup_db.c:200
+#, c-format
+msgid "connection needs password"
+msgstr "bağlantı parola gerektiriyor"
+
+#: pg_backup_db.c:251
+#, c-format
+msgid "already connected to a database"
+msgstr "bir veritabanına zaten bağlı"
+
+#: pg_backup_db.c:290
+#, c-format
+msgid "failed to connect to database"
+msgstr "veritabanına bağlantı başarısız oldu"
+
+#: pg_backup_db.c:306
+#, c-format
+msgid "connection to database \"%s\" failed: %s"
+msgstr "\"%s\" veritabanına bağlantı başarısız oldu: %s"
+
+#: pg_backup_db.c:378 pg_dumpall.c:1664
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:385 pg_dumpall.c:1869 pg_dumpall.c:1892
+#, c-format
+msgid "query failed: %s"
+msgstr "sorgu başarısız oldu: %s"
+
+#: pg_backup_db.c:387 pg_dumpall.c:1870 pg_dumpall.c:1893
+#, c-format
+msgid "query was: %s"
+msgstr "sorgu şu idi: %s"
+
+#: pg_backup_db.c:428
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "sorgu 1 yerine %d satır döndürdü: %s"
+msgstr[1] "sorgu 1 yerine %d satır döndürdü: %s"
+
+#: pg_backup_db.c:520 pg_backup_db.c:594 pg_backup_db.c:601
+msgid "could not execute query"
+msgstr "sorgu çalıştırılamadı"
+
+#: pg_backup_db.c:573
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "PQputCopyData'nın döndürdüğü hata: %s"
+
+#: pg_backup_db.c:622
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "PQputCopyEnd'in döndürdüğü hata: %s"
+
+#: pg_backup_db.c:634 pg_dump.c:1924
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "\"%s\" tablosunun COPY işlemi sırasında beklenmeyen ilave sonuçlar"
+
+#: pg_backup_db.c:646
+msgid "could not start database transaction"
+msgstr "veritabanı transaction'u başlatılamadı"
+
+#: pg_backup_db.c:654
+msgid "could not commit database transaction"
+msgstr "veritabanı işlemi (transaction) commit edilemedi"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "herhangi bir çıktı dizini belirtilmedi"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "\"%s\" dizini okunamıyor: %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" dizini kapatılamadı: %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "\"%s\" dizini oluşturulamadı: %m"
+
+#: pg_backup_directory.c:350 pg_backup_directory.c:488
+#: pg_backup_directory.c:518
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "çıktı dosyasına yazma başarısız: %s"
+
+#: pg_backup_directory.c:403
+#, c-format
+msgid "could not close data file: %m"
+msgstr "veri dosyası kapatılamadı: %m"
+
+#: pg_backup_directory.c:443
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "girdi için \"%s\" large object TOC dosyası açılamadı: %m"
+
+#: pg_backup_directory.c:454
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "\"%s\" large object TOC dosyasında geçersiz satır: \"%s\""
+
+#: pg_backup_directory.c:463
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "\"%s\" large object TOC dosyası okuma hatası"
+
+#: pg_backup_directory.c:467
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "\"%s\" large object TOC dosyası kapatılamadı: %m"
+
+#: pg_backup_directory.c:678
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "blobs TOC dosyası yazma hatası"
+
+#: pg_backup_directory.c:710
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "dosya adı çok uzun: \"%s\""
+
+#: pg_backup_null.c:75
+#, c-format
+msgid "this format cannot be read"
+msgstr "bu biçim okunamıyor"
+
+#: pg_backup_tar.c:177
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "çıktı için \"%s\" TOC dosyası açılamadı: %m"
+
+#: pg_backup_tar.c:184
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "çıktı için TOC dosyası açılamadı: %m"
+
+#: pg_backup_tar.c:203 pg_backup_tar.c:358
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "sıkıştırma, tar çıktı formatı tarafından desteklenmiyor"
+
+#: pg_backup_tar.c:211
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "\"%s\" TOC dosyası girdi için açılamadı: %m"
+
+#: pg_backup_tar.c:218
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "girdi için TOC dosyası açılamadı: %m"
+
+#: pg_backup_tar.c:344
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "\"%s\" dosyası arşivde bulunamadı"
+
+#: pg_backup_tar.c:410
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "geçici dosya adı oluşturulamadı: %m"
+
+#: pg_backup_tar.c:421
+#, c-format
+msgid "could not open temporary file"
+msgstr "geçici dosya açılamadı"
+
+#: pg_backup_tar.c:448
+#, c-format
+msgid "could not close tar member"
+msgstr "tar öğesi kapatılamadı"
+
+#: pg_backup_tar.c:571
+#, c-format
+msgid "internal error -- neither th nor fh specified in tarReadRaw()\n"
+msgstr "iç hata - th ya da fh, tarReadRaw() içinde belirtilmedi\n"
+
+#: pg_backup_tar.c:693
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "beklenmeyen COPY ifadesi söz dizimi: \"%s\""
+
+#: pg_backup_tar.c:961
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "(%u) large object'i için geçersiz OID"
+
+#: pg_backup_tar.c:1106
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "geçici dosya kapatma hatası: %m"
+
+#: pg_backup_tar.c:1115
+#, c-format
+msgid "actual file length (%s) does not match expected (%s)"
+msgstr "gerçek dosya uzunluğu (%s) beklenen uzunluğu (%s) ile uyuşmamaktadır"
+
+#: pg_backup_tar.c:1172 pg_backup_tar.c:1202
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "tar arşivinde \"%s\" dosyası için başlık bulunamadı"
+
+#: pg_backup_tar.c:1190
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "bu arşiv biçiminde veriyi sıra dışı geri yükleme desteklenmemektedir: \"%s\" bekleniyor ancak arşiv dosyasında %s ondan önce gelmektedir."
+
+#: pg_backup_tar.c:1235
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "eksik tar başlığı bulundu (%lu bayt)"
+msgstr[1] "eksik tar başlığı bulundu (%lu bayt)"
+
+#: pg_backup_tar.c:1286
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %s"
+msgstr "%s dosyasında bozuk tar başlığı (beklenen: %d, hesaplanan: %d) dosya pozisyonu %s"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "bilinmeyen bölüm adı: \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:612 pg_dump.c:629 pg_dumpall.c:338
+#: pg_dumpall.c:348 pg_dumpall.c:357 pg_dumpall.c:366 pg_dumpall.c:374
+#: pg_dumpall.c:388 pg_dumpall.c:464 pg_restore.c:290 pg_restore.c:306
+#: pg_restore.c:324
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" yazabilirsiniz.\n"
+
+#: pg_backup_utils.c:68
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "on_exit_nicely slotları yetersiz"
+
+#: pg_dump.c:543
+#, c-format
+msgid "compression level must be in range 0..9"
+msgstr "sıkıştırma seviyesi 0..9 aralığında olmalı"
+
+#: pg_dump.c:581
+#, c-format
+msgid "extra_float_digits must be in range -15..3"
+msgstr "extra_float_digits -15..3 aralığında olmalı"
+
+#: pg_dump.c:604
+#, c-format
+msgid "rows-per-insert must be in range %d..%d"
+msgstr "rows-per-insert %d..%d aralığında olmalı"
+
+#: pg_dump.c:627 pg_dumpall.c:346 pg_restore.c:304
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "çok fazla komut satırı argümanı (ilki \"%s\")"
+
+#: pg_dump.c:648 pg_restore.c:333
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "-s/--schema-only ve -a/--data-only seçenekleri aynı anda kullanılamazlar"
+
+#: pg_dump.c:654 pg_restore.c:339
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "-c/--clean ve -a/--data-only seçenekleri aynı anda kullanılamazlar"
+
+#: pg_dump.c:659 pg_dumpall.c:381 pg_restore.c:388
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "--if-exists seçeneği -c/--clean seçeneğini gerektirir"
+
+#: pg_dump.c:666
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert or --column-inserts"
+msgstr "--on-conflict-do-nothing seçeneği --inserts, --rows-per-insert veya --column-inserts seçeneğini gerektirir"
+
+#: pg_dump.c:688
+#, c-format
+msgid "requested compression not available in this installation -- archive will be uncompressed"
+msgstr "istenen sıkıştırma bu kurulumda desteklenmemektedir -- arşiv sıkıştırılmayacak"
+
+#: pg_dump.c:709 pg_restore.c:355
+#, c-format
+msgid "invalid number of parallel jobs"
+msgstr "geçersiz sayıda parallel iş"
+
+#: pg_dump.c:713
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "paralel yedek sadece dizin biçimi tarafından destekleniyor"
+
+#: pg_dump.c:768
+#, c-format
+msgid ""
+"Synchronized snapshots are not supported by this server version.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots."
+msgstr ""
+"Senkronize anlık görüntüler (snapshot) bu sunucu sürümü tarafından desteklenmiyor.\n"
+"Senkronize anlık görüntülere ihtiyaç yoksa bunun yerine --no-synchronized-snapshots \n"
+"ile çalıştırın."
+
+#: pg_dump.c:774
+#, c-format
+msgid "Exported snapshots are not supported by this server version."
+msgstr "Bu sunucu sürümünde dışa aktarılmış anlık görüntü (exported snapshot) desteklenmemektedir."
+
+#: pg_dump.c:786
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "son gömülü OID : %u"
+
+#: pg_dump.c:795
+#, c-format
+msgid "no matching schemas were found"
+msgstr "uygun şema bulunamadı"
+
+#: pg_dump.c:809
+#, c-format
+msgid "no matching tables were found"
+msgstr "uygun tablo bulunamadı"
+
+#: pg_dump.c:981
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s veritabanını metin dosyası ya da diğer biçimlerde dump eder.\n"
+"\n"
+
+#: pg_dump.c:982 pg_dumpall.c:617 pg_restore.c:468
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: pg_dump.c:983
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [SEÇENEK]... [VERİTABANI_ADI]\n"
+
+#: pg_dump.c:985 pg_dumpall.c:620 pg_restore.c:471
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Genel seçenekler:\n"
+
+#: pg_dump.c:986
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=DOSYAADI çıktı dosya adı ya da dizin adı\n"
+
+#: pg_dump.c:987
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p çıktı dosya biçimi (c:özel, d:dizin, t:tar,\n"
+" p: düz metin (varsayılan))\n"
+"\n"
+
+#: pg_dump.c:989
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=SAYI döküm (dump) için belirtilen sayı kadar paralel süreç kullan\n"
+
+#: pg_dump.c:990 pg_dumpall.c:622
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose detaylı açıklamalı mod\n"
+
+#: pg_dump.c:991 pg_dumpall.c:623
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#: pg_dump.c:992
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 sıkıştırılmış biçimler için sıkıştırma seviyesi\n"
+
+#: pg_dump.c:993 pg_dumpall.c:624
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=ZAMANAŞIMI tablo kilitlemesi için ZAMANAŞIMI kadar bekledikten sonra hata ver\n"
+
+#: pg_dump.c:994 pg_dumpall.c:652
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" --no-sync değişikliklerin diske yazılması için bekleme\n"
+"\n"
+
+#: pg_dump.c:995 pg_dumpall.c:625
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı gösterir ve sonra çıkar\n"
+
+#: pg_dump.c:997 pg_dumpall.c:626
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Çıktı içeriğini kontrol eden seçenekler:\n"
+
+#: pg_dump.c:998 pg_dumpall.c:627
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only sadece veriyi yedekle (dump); şemayı yedekleme\n"
+
+#: pg_dump.c:999
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs yedeğin (dump) içine büyük nesneleri dahil et\n"
+
+#: pg_dump.c:1000
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs büyük nesneleri yedeğin içine dahil etme\n"
+
+#: pg_dump.c:1001 pg_restore.c:482
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean veritabanı nesnelerini yeniden oluşturmadan önce temizle (kaldır)\n"
+
+#: pg_dump.c:1002
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create yedeğin (dump) içine veritabanını oluşturacak komutları da ekle\n"
+
+#: pg_dump.c:1003 pg_dumpall.c:629
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=DİLKODLAMASI veriyi DİLKODLAMASI dil kodlamasıyla yedekle\n"
+
+#: pg_dump.c:1004
+#, c-format
+msgid " -n, --schema=SCHEMA dump the named schema(s) only\n"
+msgstr " -n, --schema=ŞEMA sadece belirtilen şema veya şemaları yedekle\n"
+
+#: pg_dump.c:1005
+#, c-format
+msgid " -N, --exclude-schema=SCHEMA do NOT dump the named schema(s)\n"
+msgstr " -N, --exclude-schema=ŞEMA bu şema veya şemaları yedekleme\n"
+
+#: pg_dump.c:1006
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner düz metin biçiminde nesne \n"
+" sahipliğinin yüklenmesini atla\n"
+
+#: pg_dump.c:1008 pg_dumpall.c:634
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only sadece şemayı yedekle (dump), veriyi değil\n"
+
+#: pg_dump.c:1009
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=İSİM düz metin formatında kullanılacak superuser kullanıcı adı\n"
+
+#: pg_dump.c:1010
+#, c-format
+msgid " -t, --table=TABLE dump the named table(s) only\n"
+msgstr " -t, --table=TABLO sadece ismi geçen tablo veya tabloları yedekle\n"
+
+#: pg_dump.c:1011
+#, c-format
+msgid " -T, --exclude-table=TABLE do NOT dump the named table(s)\n"
+msgstr " -T, --exclude-table=TABLO ismi geçen tablo veya tabloları yedekleme\n"
+
+#: pg_dump.c:1012 pg_dumpall.c:637
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges yetkileri yedekleme (grant/revoke)\n"
+
+#: pg_dump.c:1013 pg_dumpall.c:638
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade sadece yükseltme araçlarının kullanımı için\n"
+
+#: pg_dump.c:1014 pg_dumpall.c:639
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts veriyi kolon adları ile INSERT komutları olarak yedekle\n"
+
+#: pg_dump.c:1015 pg_dumpall.c:640
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr " --disable-dollar-quoting dollar quoting kullanmayı engelle, standart SQL quoting kullan\n"
+
+#: pg_dump.c:1016 pg_dumpall.c:641 pg_restore.c:499
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers salt-veri geri yüklemesi sırasında tetikleyicileri devre dışı bırak\n"
+
+#: pg_dump.c:1017
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security satır güvenliğini etkinleştir (sadece kullanıcının erişimi\n"
+" olan içeriği yedekle)\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid " --exclude-table-data=TABLE do NOT dump data for the named table(s)\n"
+msgstr " --exclude-table-data=TABLO bu tablo veya tabloları yedekleme\n"
+
+#: pg_dump.c:1020 pg_dumpall.c:643
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM extra_float_digits için varayılan ayarı geçersiz kıl\n"
+
+#: pg_dump.c:1021 pg_dumpall.c:644 pg_restore.c:501
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists nesneleri silerken IF EXISTS kullan\n"
+
+#: pg_dump.c:1022 pg_dumpall.c:645
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr ""
+" --inserts veriyi COPY'den ziyade INSERT komutları olarak yedekle\n"
+"\n"
+
+#: pg_dump.c:1023 pg_dumpall.c:646
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root bölümleri (partition) kök tablo üzerinden yükle\n"
+
+#: pg_dump.c:1024 pg_dumpall.c:647
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr ""
+" --no-comments açıklamaları (comments) yedekleme\n"
+"\n"
+
+#: pg_dump.c:1025 pg_dumpall.c:648
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications yayınları yedekleme\n"
+
+#: pg_dump.c:1026 pg_dumpall.c:650
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels güvenlik etiketi atamalarını yedekleme\n"
+
+#: pg_dump.c:1027 pg_dumpall.c:651
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions abonelikleri yedekleme\n"
+
+#: pg_dump.c:1028
+#, c-format
+msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"
+msgstr " --no-synchronized-snapshots paralel işlerde senkronize anlık görüntüleri yedekleme\n"
+
+#: pg_dump.c:1029 pg_dumpall.c:653
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces tablespace atamalarını yedekleme\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:654
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data loglanmayan tablo verisini yedekleme\n"
+
+#: pg_dump.c:1031 pg_dumpall.c:655
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing INSERT komutlarına ON CONFLICT DO NOTHING ekle\n"
+
+#: pg_dump.c:1032 pg_dumpall.c:656
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr " --quote-all-identifiers anahtar sözcükler olmasa bile tüm belirteçleri çift tırnak içine al\n"
+
+#: pg_dump.c:1033
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS INSERT başına satır sayısı; --inserts seçeneğiyle kullanılır\n"
+
+#: pg_dump.c:1034
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=BÖLÜM belirtilen bölümü yedekle (pre-data, data, veya post-data)\n"
+
+#: pg_dump.c:1035
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable yedeğin bir anormallik olmadan biteceği ana kadar bekle\n"
+
+#: pg_dump.c:1036
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT yedek için verilen anlık görüntüyü (snapshot) kullan\n"
+
+#: pg_dump.c:1037 pg_restore.c:510
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names tablo ve/veya şema her biri en az bir varlıkla (entity)\n"
+" eşleşecek desenler (pattern) bulundurmalıdır\n"
+
+#: pg_dump.c:1039 pg_dumpall.c:657 pg_restore.c:512
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" Sahipliği ayarlamak için ALTER OWNER komutları yerine\n"
+" SET SESSION AUTHORIZATION komutlarını kullan\n"
+
+#: pg_dump.c:1043 pg_dumpall.c:661 pg_restore.c:516
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Bağlantı Seçenekleri:\n"
+
+#: pg_dump.c:1044
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=VERİTABANI_ADI yedeklenecek veritabanı adı\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:663 pg_restore.c:517
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME veritabanı sunucusu adresi ya da soket dizini\n"
+
+#: pg_dump.c:1046 pg_dumpall.c:665 pg_restore.c:518
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p PORT veritabanı sunucusunun port numarası\n"
+
+#: pg_dump.c:1047 pg_dumpall.c:666 pg_restore.c:519
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=KULLANICI_ADI bağlanılacak kullanıcı adı\n"
+
+#: pg_dump.c:1048 pg_dumpall.c:667 pg_restore.c:520
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password bağlanmak için kesinlikle parola sorma\n"
+
+#: pg_dump.c:1049 pg_dumpall.c:668 pg_restore.c:521
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W şifre sor (otomatik olarak her zaman açık)\n"
+
+#: pg_dump.c:1050 pg_dumpall.c:669
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROL ADI yedek işleminden önce SET ROLE çalıştır\n"
+
+#: pg_dump.c:1052
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Veritabanı adı verilmemişse PGDATABASE çevre değişkeni\n"
+"kullanılacaktır.\n"
+"\n"
+
+#: pg_dump.c:1054 pg_dumpall.c:673 pg_restore.c:528
+#, c-format
+msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+msgstr "Hataları <pgsql-bugs@lists.postgresql.org> adresine bildirin.\n"
+
+#: pg_dump.c:1073 pg_dumpall.c:499
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "belirtilen \"%s\" istemci dil kodlaması geçersiz"
+
+#: pg_dump.c:1218
+#, c-format
+msgid ""
+"Synchronized snapshots on standby servers are not supported by this server version.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots."
+msgstr ""
+"Yedek (standby) sunucularda anlık görüntüler (snapshot) bu sunucu sürümünde desteklenmiyor.\n"
+"Senkronize anlık görüntülere ihtiyaç yoksa bunun yerine --no-synchronized-snapshots\n"
+"ile çalıştırın."
+
+#: pg_dump.c:1287
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "geçersiz çıktı biçimi \"%s\" belirtildi"
+
+#: pg_dump.c:1325
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "\"%s\" şablonu (pattern) için eşleşen şema bulunamadı"
+
+#: pg_dump.c:1390
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "\"%s\" şablonu (pattern) için eşleşen tablo bulunamadı"
+
+#: pg_dump.c:1804
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "\"%s.%s\" tablosunun içeriği yedekleniyor"
+
+#: pg_dump.c:1905
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "\"%s\" tablosunu içeriğinin yedeklenmesi başarısız: PQgetCopyData() başarısız."
+
+#: pg_dump.c:1906 pg_dump.c:1916
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Sunucudan hata mesajı alındı: %s"
+
+#: pg_dump.c:1907 pg_dump.c:1917
+#, c-format
+msgid "The command was: %s"
+msgstr "O sırada yürütülen komut: %s"
+
+#: pg_dump.c:1915
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "\"%s\" tablosunun içeriğinin yedeklenmesi başarısız: PQgetResult() başarısız."
+
+#: pg_dump.c:2669
+#, c-format
+msgid "saving database definition"
+msgstr "veritabanın tanımı kaydediliyor"
+
+#: pg_dump.c:3116
+#, c-format
+msgid "saving encoding = %s"
+msgstr "dil kodlaması kaydediliyor = %s"
+
+#: pg_dump.c:3143
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "standard_conforming_strings kaydediliyor = %s "
+
+#: pg_dump.c:3184
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "current_schemas() sonucu ayrıştırılamadı"
+
+#: pg_dump.c:3203
+#, c-format
+msgid "saving search_path = %s"
+msgstr "search_path = %s olarak kaydediliyor"
+
+#: pg_dump.c:3245
+#, c-format
+msgid "reading large objects"
+msgstr "large object'ler okunuyor"
+
+#: pg_dump.c:3427
+#, c-format
+msgid "saving large objects"
+msgstr "large object'ler kaydediliyor"
+
+#: pg_dump.c:3473
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "%u large object okurken hata oldu: %s"
+
+#: pg_dump.c:3525
+#, c-format
+msgid "reading row security enabled for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosu için etkinleştirilen satır güvenliği (row security) okunuyor"
+
+#: pg_dump.c:3556
+#, c-format
+msgid "reading policies for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosu için ilkeler (policy) okunuyor"
+
+#: pg_dump.c:3707
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "beklenmeyen ilke (policy) komut türü: %c"
+
+#: pg_dump.c:3834
+#, c-format
+msgid "owner of publication \"%s\" appears to be invalid"
+msgstr "\"%s\" fonksiyonunun sahibi geçersiz görünüyor"
+
+#: pg_dump.c:3971
+#, c-format
+msgid "reading publication membership for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosunun yayın (publication) üyeliği okunuyor"
+
+#: pg_dump.c:4116
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "abonelikler yedeklenmedi çünkü geçerli kullanıcı superuser değil"
+
+#: pg_dump.c:4170
+#, c-format
+msgid "owner of subscription \"%s\" appears to be invalid"
+msgstr "\"%s\" aboneliğinin sahibi geçersiz görünüyor"
+
+#: pg_dump.c:4214
+#, c-format
+msgid "could not parse subpublications array"
+msgstr "alt-yayınlar dizisi ayrıştırılamadı"
+
+#: pg_dump.c:4486
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "%s için üst uzantı bulunamadı %s"
+
+#: pg_dump.c:4618
+#, c-format
+msgid "owner of schema \"%s\" appears to be invalid"
+msgstr "\"%s\" şemasının sahibi geçersiz görünüyor"
+
+#: pg_dump.c:4641
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "%u OID'li şema mevcut değil"
+
+#: pg_dump.c:4966
+#, c-format
+msgid "owner of data type \"%s\" appears to be invalid"
+msgstr "\"%s\" veri tipinin sahibi geçersiz görünüyor"
+
+#: pg_dump.c:5051
+#, c-format
+msgid "owner of operator \"%s\" appears to be invalid"
+msgstr "\"%s\" operatörünün sahibi geçersiz görünüyor"
+
+#: pg_dump.c:5353
+#, c-format
+msgid "owner of operator class \"%s\" appears to be invalid"
+msgstr "\"%s\" operatör sınıfının sahibi geçersiz görünüyor"
+
+#: pg_dump.c:5437
+#, c-format
+msgid "owner of operator family \"%s\" appears to be invalid"
+msgstr "\"%s\" operatör ailesinin sahibi geçersiz görünüyor"
+
+#: pg_dump.c:5606
+#, c-format
+msgid "owner of aggregate function \"%s\" appears to be invalid"
+msgstr "\"%s\" aggregate fonksiyonun sahibi geçersiz görünüyor"
+
+#: pg_dump.c:5866
+#, c-format
+msgid "owner of function \"%s\" appears to be invalid"
+msgstr "\"%s\" fonksiyonunun sahibi geçersiz görünüyor"
+
+#: pg_dump.c:6662
+#, c-format
+msgid "owner of table \"%s\" appears to be invalid"
+msgstr "\"%s\" tablosunun sahibi geçersiz görünüyor"
+
+#: pg_dump.c:6704 pg_dump.c:17053
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "tutarlılık kontrolü başarısız, %2$u OID'li dizinin (sequence) %1$u OID'li üst tablosu bulunamadı"
+
+#: pg_dump.c:6848
+#, c-format
+msgid "reading indexes for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosunun indeksleri okunuyor"
+
+#: pg_dump.c:7249
+#, c-format
+msgid "reading foreign key constraints for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosunun foreign key bütünlük kısıtlamaları okunuyor"
+
+#: pg_dump.c:7468
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "tutarlılık kontrolü başarısız, %2$u OID'li pg_rewrite girdisinin %1$u OID'li üst tablosu bulunamadı"
+
+#: pg_dump.c:7551
+#, c-format
+msgid "reading triggers for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosunun tetikleyicileri okunuyor"
+
+#: pg_dump.c:7684
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "sorgu, \"%2$s\" tablosu (tablo OID: %3$u) üzerindeki \"%1$s\" foreign key tetikleyici için null referans edilen tablo adı getirdi"
+
+#: pg_dump.c:8239
+#, c-format
+msgid "finding the columns and types of table \"%s.%s\""
+msgstr "\"%s.%s\" tablosunun sütunları ve tipleri bulunuyor"
+
+#: pg_dump.c:8375
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "\"%s\" tablosunda geçersiz sütun numaralandırması"
+
+#: pg_dump.c:8412
+#, c-format
+msgid "finding default expressions of table \"%s.%s\""
+msgstr "\"%s.%s\" tablosu için varsayılan ifadeler bulunuyor"
+
+#: pg_dump.c:8434
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "\"%2$s\" tablosu için geçersiz adnum değeri %1$d"
+
+#: pg_dump.c:8499
+#, c-format
+msgid "finding check constraints for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosu için kontrol kısıtlamaları bulunuyor"
+
+#: pg_dump.c:8548
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "%d check kısıtlamasının \"%s\" tablosunda bulunması beklendi; ancak %d bulundu"
+msgstr[1] "%d check kısıtlamasının \"%s\" tablosunda bulunması beklendi; ancak %d bulundu"
+
+#: pg_dump.c:8552
+#, c-format
+msgid "(The system catalogs might be corrupted.)"
+msgstr "(Sistem kataloğu bozulmuş olabilir.)"
+
+#: pg_dump.c:10140
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "\"%s\" veri tipinin typtype'i geçersiz görünüyor"
+
+#: pg_dump.c:11496
+#, c-format
+msgid "bogus value in proargmodes array"
+msgstr "proargnames dizisi içinde belirsiz değer"
+
+#: pg_dump.c:11868
+#, c-format
+msgid "could not parse proallargtypes array"
+msgstr "proallargtypes dizisi ayrıştırılamadı"
+
+#: pg_dump.c:11884
+#, c-format
+msgid "could not parse proargmodes array"
+msgstr "proargmodes dizisi ayrıştırılamadı"
+
+#: pg_dump.c:11898
+#, c-format
+msgid "could not parse proargnames array"
+msgstr "proargnames dizisi ayrıştırılamadı"
+
+#: pg_dump.c:11909
+#, c-format
+msgid "could not parse proconfig array"
+msgstr "proconfig dizisi ayrıştırılamadı"
+
+#: pg_dump.c:11989
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "\"%s\" fonksiyonu için bilinmeyen provolatile değeri"
+
+#: pg_dump.c:12039 pg_dump.c:14094
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "unrecognized proparallel value for function \"%s\""
+
+#: pg_dump.c:12172 pg_dump.c:12282 pg_dump.c:12289
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "%u OID'li fonksiyon için fonksiyon tanımı bulunamadı"
+
+#: pg_dump.c:12211
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "pg_cast.castfunc veya pg_cast.castmethod field alanı içinde belirsiz değer"
+
+#: pg_dump.c:12214
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "pg_cast.castmethod field alanı içinde belirsiz değer"
+
+#: pg_dump.c:12308
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "belirsiz dönüşüm tanımı, trffromsql ve trftosql'in en azından biri sıfırdan farklı olmalı"
+
+#: pg_dump.c:12325
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "pg_transform.trffromsql alanı içinde belirsiz değer"
+
+#: pg_dump.c:12346
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "pg_transform.trftosql alanı içinde belirsiz değer"
+
+#: pg_dump.c:12663
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "%s OID'li olan operatör bulunamadı"
+
+#: pg_dump.c:12731
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "\"%2$s\" erişim yöntemi için geçersiz tip \"%1$c\""
+
+#: pg_dump.c:13486
+#, c-format
+msgid "unrecognized collation provider: %s\n"
+msgstr "bilinmeyen karşılaştırma (collation) sağlayıcısı: %s\n"
+
+#: pg_dump.c:13958
+#, c-format
+msgid "aggregate function %s could not be dumped correctly for this database version; ignored"
+msgstr "%s aggregate fonksiyonu veritabanının bu sürümünde düzgün dump edilemiyor; atlanıyor"
+
+#: pg_dump.c:14013
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "\"%s\" toplamı (aggregate) için tanınmayan aggfinalmodify değeri"
+
+#: pg_dump.c:14069
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "\"%s\" toplamı (aggregate) için tanınmayan aggmfinalmodify değeri"
+
+#: pg_dump.c:14793
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "öntanımlı yetkilerde bilinmeyen nesne tipi: %d"
+
+#: pg_dump.c:14811
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "öntanımlı ACL listesi ayrıştırılamıyor (%s)"
+
+#: pg_dump.c:14892
+#, c-format
+msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)"
+msgstr "\"%3$s\" nesnesinin ilk GRANT ACL listesi (%1$s) veya ilk REVOKE ACL listesi (%2$s) ayrıştırılamıyor (%4$s)"
+
+#: pg_dump.c:14900
+#, c-format
+msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)"
+msgstr "\"%3$s\" nesnesinin GRANT ACL listesi (%1$s) veya REVOKE ACL listesi (%2$s) ayrıştırılamıyor (%4$s)"
+
+#: pg_dump.c:15402
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "\"%s\" view tanımını getirecek sorgu hiçbir veri getirmedi"
+
+#: pg_dump.c:15405
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "\"%s\" view tanımını getirecek sorgu birden çok tanım getirdi"
+
+#: pg_dump.c:15412
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "\"%s\" view tanımı boş görünüyor (uzunluğu sıfır)"
+
+#: pg_dump.c:15494
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS artık desteklenmiyor (\"%s\" tablosu)"
+
+#: pg_dump.c:15945
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "\"%2$s\" tablosu için geçersiz üst nesne sayısı %1$d"
+
+#: pg_dump.c:16282
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "\"%2$s\" tablosu için geçersiz sütun sayısı %1$d"
+
+#: pg_dump.c:16546
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "\"%s\" bütünlük kısıtlamasının indeksi eksik"
+
+#: pg_dump.c:16766
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "bilinmeyen bütünlük kısıtlama türü: %c"
+
+#: pg_dump.c:16898 pg_dump.c:17119
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "\"%s\" sequence verisini getirecek sorgu %d satır döndürdü (bir satır bekleniyordu)"
+msgstr[1] "\"%s\" sequence verisini getirecek sorgu %d satır döndürdü (bir satır bekleniyordu)"
+
+#: pg_dump.c:16932
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "tanınmayan sequence tipi \"%s\""
+
+#: pg_dump.c:17216
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "beklenmeyen tgtype değeri: %d"
+
+#: pg_dump.c:17290
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "\"%3$s\" tablosunun \"%2$s\" tetikleyicisi için geçersiz argüman dizesi (%1$s)"
+
+#: pg_dump.c:17519
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "\"%s\" tablosundan \"%s\" rule'unu getiren sorgu başarısız: dönen satır sayısı yanlış"
+
+#: pg_dump.c:17681
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "referans verilen uzantı bulunamadı %u"
+
+#: pg_dump.c:17893
+#, c-format
+msgid "reading dependency data"
+msgstr "bağımlılık verileri okunuyor"
+
+#: pg_dump.c:17948
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "referans veren nesne yok %u %u"
+
+#: pg_dump.c:17959
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "referans verilen nesne yok %u %u"
+
+#: pg_dump.c:18327
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "reloptions dizisi (array) ayrıştırılamadı"
+
+#: pg_dump_sort.c:328
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "geçersiz dumpId %d"
+
+#: pg_dump_sort.c:334
+#, c-format
+msgid "invalid dependency %d"
+msgstr "geçersiz bağımlılık %d"
+
+#: pg_dump_sort.c:567
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "bağımlılık döngüsü tespit edilemedi"
+
+#: pg_dump_sort.c:1130
+#, c-format
+msgid "there are circular foreign-key constraints on this table:"
+msgid_plural "there are circular foreign-key constraints among these tables:"
+msgstr[0] "DİKKAT: Bu tablo üzerinde dairesel (circular) foreign-key kısıtlamaları bulunmaktadır:"
+msgstr[1] "DİKKAT: Bu tablolar arasında dairesel (circular) foreign-key kısıtlamaları bulunmaktadır:"
+
+#: pg_dump_sort.c:1134 pg_dump_sort.c:1154
+#, c-format
+msgid " %s"
+msgstr " %s"
+
+#: pg_dump_sort.c:1135
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "--disable-triggers kullanmadan veya kısıtlamaları (constraint) geçici olarak kaldırmadan yedeği (dump) geri yükleyemebilirsiniz."
+
+#: pg_dump_sort.c:1136
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "Bu sorunla karşılaşmamak için --data-only yedek yerine tam yedek (full dump) almayı düşünün."
+
+#: pg_dump_sort.c:1148
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "bu öğeler arasındaki bağımlılık döngüsü çözülemedi"
+
+#: pg_dumpall.c:200
+#, c-format
+msgid ""
+"The program \"pg_dump\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation."
+msgstr ""
+"\"pg_dump\" uygulaması %s için gerekmektedir ancak\n"
+"\"%s\" ile aynı dizinde bulunamadı.\n"
+"Kurulumunuzu kontrol edin."
+
+#: pg_dumpall.c:205
+#, c-format
+msgid ""
+"The program \"pg_dump\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation."
+msgstr ""
+"\"pg_dump\" uygulaması \"%s\" tarafından bulundu\n"
+"ancak %s ile aynı sürüm değildir.\n"
+"Kurulumunuzu kontrol edin."
+
+#: pg_dumpall.c:356
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only or -t/--tablespaces-only"
+msgstr "--exclude-database seçeneği -g/--globals-only, -r/--roles-only veya -t/--tablespaces-only ile birlikte kullanılamaz"
+
+#: pg_dumpall.c:365
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "-g/--globals-only ve -r/--roles-only seçenekleri beraber kullanılamaz"
+
+#: pg_dumpall.c:373
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "-g/--globals-only ve -t/--tablespaces-only seçenekleri beraber kullanılamaz"
+
+#: pg_dumpall.c:387
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "-r/--roles-only ve -t/--tablespaces-only seçenekleri birlikte kullanılamaz"
+
+#: pg_dumpall.c:448 pg_dumpall.c:1734
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "\"%s\" veritabanına bağlanılamadı"
+
+#: pg_dumpall.c:462
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"\"postgres\" veya \"template1\" veritabanına bağlanılamadı\n"
+"Lütfen alternatif bir veritabanı belirtin"
+
+#: pg_dumpall.c:484
+#, c-format
+msgid "could not open the output file \"%s\": %m"
+msgstr "\"%s\" çıktı dosyası açılamadı: %m"
+
+#: pg_dumpall.c:616
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s, PostgreSQL veritabanı clusteri SQL betik dosyasına aktarıyor.\n"
+"\n"
+
+#: pg_dumpall.c:618
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [SEÇENEK]...\n"
+
+#: pg_dumpall.c:621
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=DOSYA_ADI çıktı dosya adı\n"
+
+#: pg_dumpall.c:628
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean yeniden oluşturmadan önce veritabanlarını temizle (drop)\n"
+
+#: pg_dumpall.c:630
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only Sadece global nesneleri yedekle, veritabanlarını yedekleme\n"
+
+#: pg_dumpall.c:631
+#, c-format
+msgid " -o, --oids include OIDs in dump\n"
+msgstr " -o, --oids yedeğin içine OID'leri de ekle\n"
+
+#: pg_dumpall.c:632 pg_restore.c:491
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner veri sahipliği ile ilgili bilgileri geri yükleme\n"
+
+#: pg_dumpall.c:633
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only sadece rolleri yedekle, veritabanlarını ya da tablespace'leri değil\n"
+
+#: pg_dumpall.c:635
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=AD yedeklerde kullanılacak superuser kullanıcı adı\n"
+
+#: pg_dumpall.c:636
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only sadece tablespaceleri yedekle, veritabanlarını ya da rolleri değil\n"
+
+#: pg_dumpall.c:642
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=DESEN isimleri DESEN ile eşleşen veritabanlarını hariç tut\n"
+
+#: pg_dumpall.c:649
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " -W, --password rollerin parolalarını yedekleme\n"
+
+#: pg_dumpall.c:662
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONNSTR bağlantı cümleciğini kullanarak bağlan\n"
+
+#: pg_dumpall.c:664
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=VERİTABANI ADI varsayılan alternatif veritabanı\n"
+
+#: pg_dumpall.c:671
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Eğer -f/--file kullanılmazsa, SQL betiği standart çıktıya\n"
+"yazılacaktır.\n"
+"\n"
+
+#: pg_dumpall.c:876
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "\"pg_\" ile başlayan rol adı atlandı (%s)"
+
+#: pg_dumpall.c:1258
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "\"%2$s\" tablespace için ACL (%1$s) listesi ayrıştırılamadı"
+
+#: pg_dumpall.c:1475
+#, c-format
+msgid "excluding database \"%s\"..."
+msgstr "\"%s\" veritabanı hariç tutuluyor..."
+
+#: pg_dumpall.c:1479
+#, c-format
+msgid "dumping database \"%s\"..."
+msgstr "\"%s\" veritabanı dökümü alınıyor(dump)..."
+
+#: pg_dumpall.c:1511
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump \"%s\" veritabanında başarısız oldu, çıkılıyor"
+
+#: pg_dumpall.c:1520
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "\"%s\" çıktı dosyası yeniden açılamadı: %m"
+
+#: pg_dumpall.c:1564
+#, c-format
+msgid "running \"%s\""
+msgstr "\"%s\" yürütülüyor"
+
+#: pg_dumpall.c:1755
+#, c-format
+msgid "could not connect to database \"%s\": %s"
+msgstr "\"%s\" veritabanına bağlanılamadı: %s"
+
+#: pg_dumpall.c:1785
+#, c-format
+msgid "could not get server version"
+msgstr "sunucu sürüm bilgisi alınamadı"
+
+#: pg_dumpall.c:1791
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "\"%s\" sürüm bilgisi ayrıştırılamadı"
+
+#: pg_dumpall.c:1863 pg_dumpall.c:1886
+#, c-format
+msgid "executing %s"
+msgstr "çalıştırılıyor: %s"
+
+#: pg_restore.c:314
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "-d/--dbname ve -f/--file seçeneklerinden biri belirtilmeli"
+
+#: pg_restore.c:323
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "-d/--dbname ve -f/--file seçenekleri birlikte kullanılamaz"
+
+#: pg_restore.c:349
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "-C/--create ve -1/--single-transaction seçenekleri birlikte kullanılamaz"
+
+#: pg_restore.c:363
+#, c-format
+msgid "maximum number of parallel jobs is %d"
+msgstr "azami paralel iş sayısı %d"
+
+#: pg_restore.c:372
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "hem --single-transaction hem de çoklu iş (multiple jobs) aynı anda belirtilemez"
+
+#: pg_restore.c:414
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "tanımlanamayan arşiv formatı \"%s\"; lütfen \"c\", \"d\", ya da \"t\" seçeneğini belirtin"
+
+#: pg_restore.c:454
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "geri yükleme sırasında es geçilen hatalar: %d"
+
+#: pg_restore.c:467
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s, pg_dump tarafından oluşturulan PostgreSQL arşivinden veritabanı geri yükleniyor.\n"
+"\n"
+
+#: pg_restore.c:469
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [SEÇENEK]... [DOSYA]\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NAME bağlanacak veritabanının adı\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=DOSYA_ADI çıktı dosya adı (stdout için -)\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t yedek dosya biçimi (otomatik olmalı)\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list arşivin kısa içeriğini yaz\n"
+
+#: pg_restore.c:476
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose verbose modu\n"
+
+#: pg_restore.c:477
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini gösterir ve sonra çıkar\n"
+
+#: pg_restore.c:478
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı gösterir ve sonra çıkar\n"
+
+#: pg_restore.c:480
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Geri güklemeyi kontrol eden seçenekler:\n"
+
+#: pg_restore.c:481
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only sadece veriyi geri yükle, şemaları değil\n"
+
+#: pg_restore.c:483
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create hedef veritabanını oluştur\n"
+
+#: pg_restore.c:484
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error hata durumunda çık, varsayılan seçenek ise devam et\n"
+
+#: pg_restore.c:485
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=AD adı geçen indeksi geri yükle\n"
+
+#: pg_restore.c:486
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=SAYI geri yükleme için belirtilen sayı kadar paralel süreç kullan\n"
+
+#: pg_restore.c:487
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=DOSYAADI çıktıyı seçmek/sıralamak için\n"
+" bu dosyadaki içindekiler tablosunu kullan\n"
+
+#: pg_restore.c:489
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=AD sadece bu şemaya ait nesneleri geri yükle\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=AD bu şemadaki nesneleri geri yükleme\n"
+
+#: pg_restore.c:492
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAME(args) adı geçen fonksiyonu geri yükle\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only sadece şemayı geri yükle, veriyi değil\n"
+
+#: pg_restore.c:494
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=AD tetikleyicileri (trigger) devre dışı bırakmak için kullanılacak superuser kullanıcı adı\n"
+
+#: pg_restore.c:495
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=AD adı geçen nesneyi (tablo, görünüm, vb.) geri yükle\n"
+
+#: pg_restore.c:496
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=AD adı geçen tetikleyiciyi geri yükle\n"
+
+#: pg_restore.c:497
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges erişim haklarının geri yüklemesini atla (grant/revoke)\n"
+
+#: pg_restore.c:498
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction tek bir transaction olarak geri yükle\n"
+
+#: pg_restore.c:500
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security satır güvenliğini etkinleştir\n"
+
+#: pg_restore.c:502
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments açıklamaları (comments) yedekleme\n"
+
+#: pg_restore.c:503
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables oluşturulamayan tabloların verilerini geri\n"
+" yükleme\n"
+
+#: pg_restore.c:505
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications yayınları geri yükleme\n"
+
+#: pg_restore.c:506
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels güvenlik etiketlerini geri yükleme\n"
+
+#: pg_restore.c:507
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions abonelikleri geri yükleme\n"
+
+#: pg_restore.c:508
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces tablespace atamalarını geri yükleme\n"
+
+#: pg_restore.c:509
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=BÖLÜM belirtilen bölümü yedekle (pre-data, data, veya post-data)\n"
+
+#: pg_restore.c:522
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROL ADI geri yüklemeden önce SET ROLE işlemini gerçekleştir\n"
+
+#: pg_restore.c:524
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"-I, -n, -N, -P, -t, -T, ve --section seçenekleri, çoklu nesnelerin seçilmesi için\n"
+"birden fazla kez kullanılabilir ve belirtilebilir\n"
+"\n"
+
+#: pg_restore.c:527
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Eğer giriş dosya adı verilmemişse, standart giriş akımı (stdin) kulanılacaktır.\n"
+"\n"
+
+#~ msgid "reading extended statistics for table \"%s.%s\"\n"
+#~ msgstr "\"%s.%s\" tablosunun genişletilmiş istatistikleri okunuyor\n"
+
+#~ msgid "%s: could not parse ACL list (%s) for database \"%s\"\n"
+#~ msgstr "%1$s: \"%3$s\" veritabanı için ACL (%2$s) listesi ayrıştırılamadı\n"
+
+#~ msgid "Got %d rows instead of one from: %s"
+#~ msgstr "%2$s sorgusundan bir yerine %1$d satır alındı"
+
+#~ msgid "No rows found for enum"
+#~ msgstr "Enum için veri bulunamadı"
+
+#~ msgid "INSERT (-d, -D) and OID (-o) options cannot be used together\n"
+#~ msgstr "INSERT (-d, -D) ve OID (-o)seçenekleri beraber kullanılamaz\n"
+
+#~ msgid ""
+#~ " --disable-dollar-quoting\n"
+#~ " disable dollar quoting, use SQL standard quoting\n"
+#~ msgstr ""
+#~ " --disable-dollar-quoting\n"
+#~ " dollar quoting kullanmayı engelle, standart SQL quoting kullan\n"
+
+#~ msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+#~ msgstr " -x, --no-privileges yetkileri aktarmayı engelle (grant/revoke)\n"
+
+#~ msgid " -s, --schema-only dump only the schema, no data\n"
+#~ msgstr " -s, --schema-only sadece şemayı dump et, veriyi etme\n"
+
+#~ msgid " -o, --oids include OIDs in dump\n"
+#~ msgstr " -o, --oids dump içinde OIDleri de içer\n"
+
+#~ msgid " -D, --column-inserts dump data as INSERT commands with column names\n"
+#~ msgstr " -D, --column-inserts veriyi kolon adları ile insert komutu olarak dump et.\n"
+
+#~ msgid " -d, --inserts dump data as INSERT, rather than COPY, commands\n"
+#~ msgstr " -d, --inserts verileri COPYkomutları yerine INSERT olarak dump et\n"
+
+#~ msgid " -a, --data-only dump only the data, not the schema\n"
+#~ msgstr " -a, --data-only sadece veriyi dump eder, şemayı etmez\n"
+
+#~ msgid ""
+#~ " -i, --ignore-version proceed even when server version mismatches\n"
+#~ " pg_dumpall version\n"
+#~ msgstr ""
+#~ " -i, --ignore-version sunucunun sürümü uyuşmadığı durumda\n"
+#~ " bile devam et\n"
+
+#~ msgid ""
+#~ " --use-set-session-authorization\n"
+#~ " use SESSION AUTHORIZATION commands instead of\n"
+#~ " OWNER TO commands\n"
+#~ msgstr ""
+#~ " --use-set-session-authorization\n"
+#~ " OWNER TO komutun yerine\n"
+#~ " SESSION AUTHORIZATION komutunu kullan\n"
+
+#~ msgid " -c, --clean clean (drop) schema prior to create\n"
+#~ msgstr " -c, --clean şemayı yaratmadan önce onu temizle (kaldır)\n"
+
+#~ msgid " -i, --ignore-version proceed even when server version mismatches\n"
+#~ msgstr " -i, --ignore-version sunucunun sürümü uyuşmadığında bile devam et\n"
+
+#~ msgid "%s: no result from server\n"
+#~ msgstr "%s: sunucudan sonuç gelmedi\n"
+
+#~ msgid "aborting because of version mismatch (Use the -i option to proceed anyway.)\n"
+#~ msgstr "sürüm uyuşmazlığı yüzünden işlem duruduruldu (Buna rağmen devam etmek için -i seçeneği kullanın).\n"
+
+#~ msgid "archive format is %d\n"
+#~ msgstr "%d arşiv biçimi\n"
+
+#~ msgid "expected %d triggers on table \"%s\" but found %d\n"
+#~ msgstr "\"%2$s\" tablosu zerinde %1$d tetikleyici beklenirken %3$d bulundu\n"
+
+#~ msgid ""
+#~ " -S, --superuser=NAME specify the superuser user name to use in\n"
+#~ " plain text format\n"
+#~ msgstr ""
+#~ " -S, --superuser=NAME düz metin biçiminde kullanılacak superuser\n"
+#~ " kullanıcısının adı\n"
+
+#~ msgid " -c, --clean clean (drop) schema prior to create\n"
+#~ msgstr " -c, --clean şemayı oluşturmadan önce onu temizle (kaldır)\n"
+
+#~ msgid ""
+#~ " -i, --ignore-version proceed even when server version mismatches\n"
+#~ " pg_dump version\n"
+#~ msgstr ""
+#~ " -i, --ignore-version sunucunun sürümü ile pg_dump'ın sürümü eşleşmezse\n"
+#~ " bile devam et\n"
+
+#~ msgid "User name: "
+#~ msgstr "Kullanıcı adı: "
+
+#~ msgid "requested %d byte, got %d from lookahead and %d from file\n"
+#~ msgid_plural "requested %d bytes, got %d from lookahead and %d from file\n"
+#~ msgstr[0] "%d bayt istenildi, lookahead'denn %d, dosyadan ise %d alındı\n"
+#~ msgstr[1] "%d bayt istenildi, lookahead'denn %d, dosyadan ise %d alındı\n"
+
+#~ msgid "read %lu byte into lookahead buffer\n"
+#~ msgid_plural "read %lu bytes into lookahead buffer\n"
+#~ msgstr[0] "lookahead artalanına %lu bayt okundu\n"
+#~ msgstr[1] "lookahead artalanına %lu bayt okundu\n"
+
+#~ msgid "query returned %d rows instead of one: %s\n"
+#~ msgstr "sorgu bir yerine %d satır döndirdi: %s\n"
+
+#~ msgid "compression support is disabled in this format\n"
+#~ msgstr "bu formatta sıkıştırma desteği devre dışı bırakılmıştır\n"
+
+#~ msgid "dumping a specific TOC data block out of order is not supported without ID on this input stream (fseek required)\n"
+#~ msgstr "sıra dışı TOC veri blokun aktarılması, giriş akımında ID olmadan desteklenmemektedir (fseek() gerekir)\n"
+
+#~ msgid "no label definitions found for enum ID %u\n"
+#~ msgstr "%u enum ID'si için etiket tanımları bulunamadı \n"
+
+#~ msgid "saving large object comments\n"
+#~ msgstr "large object açıklamaları kaydediliyor\n"
+
+#~ msgid "dumpBlobs(): could not open large object: %s"
+#~ msgstr "dumpBlobs(): large object açılamadı: %s"
+
+#~ msgid "cannot reopen non-seekable file\n"
+#~ msgstr "aranamayan dosya yeniden açılamadı\n"
+
+#~ msgid "cannot reopen stdin\n"
+#~ msgstr "stdin açılamıyor\n"
+
+#~ msgid "query returned no rows: %s\n"
+#~ msgstr "sorgu hiçbir satır döndürmedi: %s\n"
+
+#~ msgid "%s: invalid -X option -- %s\n"
+#~ msgstr "%s: geçersiz -X seçeneği -- %s\n"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "çalışma dizini \"%s\" olarak değiştirilemedi"
+
+#~ msgid "%s: could not parse version \"%s\"\n"
+#~ msgstr "%s: \"%s\" sürüm bilgisi ayrıştırılamadı\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: yetersiz bellek\n"
+
+#~ msgid ""
+#~ " --use-set-session-authorization\n"
+#~ " use SET SESSION AUTHORIZATION commands instead of\n"
+#~ " ALTER OWNER commands to set ownership\n"
+#~ msgstr ""
+#~ " --use-set-session-authorization\n"
+#~ " Sahipliği ayarlamak için ALTER OWNER komutunun yerine\n"
+#~ " SET SESSION AUTHORIZATION komutunu kullan\n"
+
+#~ msgid " --disable-triggers disable triggers during data-only restore\n"
+#~ msgstr " --disable-triggers sadece veri geri yüklemede tetikleyicileri devre dışı bırak\n"
+
+#~ msgid " -O, --no-owner skip restoration of object ownership\n"
+#~ msgstr " -O, --no-owner nesne sahipliğini ayarlayan komutlarının oluşturmasını engelle\n"
+
+#~ msgid " -c, --clean clean (drop) database objects before recreating\n"
+#~ msgstr " -c, --clean veritabanı nesnelerini yeniden yaratmadan önce onları kaldır (sil)\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version sürüm bilgisini gösterir ve çıkar\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help bu yardımı gösterir ve çıkar\n"
+
+#~ msgid "mismatch in actual vs. predicted file position (%s vs. %s)\n"
+#~ msgstr "gerçek ile beklenilen dosya pozisyonunda uyumsuzluk (%s ile %s)\n"
+
+#~ msgid "could not output padding at end of tar member\n"
+#~ msgstr "tar öğesinin arkasına doldurma alanı eklenemedi\n"
+
+#~ msgid "archive member too large for tar format\n"
+#~ msgstr "tar biçimi için arşiv öğesi çok büyük\n"
+
+#~ msgid "could not write null block at end of tar archive\n"
+#~ msgstr "arşivin sonunda null blok yazılamadı\n"
+
+#~ msgid "restoring large object OID %u\n"
+#~ msgstr "large-object %u geri yükleniyor\n"
+
+#~ msgid "invalid COPY statement -- could not find \"from stdin\" in string \"%s\" starting at position %lu\n"
+#~ msgstr "geçersiz COPY komutu -- \"%s\" satırında %lu pozisyonunda \"from stdin\" bulunamadı\n"
+
+#~ msgid "invalid COPY statement -- could not find \"copy\" in string \"%s\"\n"
+#~ msgstr "geçersiz COPY komutu -- \"%s\" satırında \"copy\" bulunamadı\n"
+
+#~ msgid "could not close large object file\n"
+#~ msgstr "large object dosyası kapatılamadı\n"
+
+#~ msgid "could not open large object TOC for output: %s\n"
+#~ msgstr "çıktı için large object TOC açılamadı: %s\n"
+
+#~ msgid "could not write byte\n"
+#~ msgstr "byte yazılamadı\n"
+
+#~ msgid "could not open large object TOC for input: %s\n"
+#~ msgstr "girdi için large object TOC açılamadı: %s\n"
+
+#~ msgid "could not close data file after reading\n"
+#~ msgstr "veri dosyası okunduktan sonra kapatılamadı\n"
+
+#~ msgid ""
+#~ "WARNING:\n"
+#~ " This format is for demonstration purposes; it is not intended for\n"
+#~ " normal use. Files will be written in the current working directory.\n"
+#~ msgstr ""
+#~ "UYARI:\n"
+#~ " Bu biçim sadece demo amaçlıdır. Normal kullanım için\n"
+#~ " denenmemelidir. Dosyalar mecvut çalışma dizinine yazılacaktır.\n"
+
+#~ msgid "file archiver"
+#~ msgstr "dosya arşivleyicisi"
+
+#~ msgid "could not write byte: %s\n"
+#~ msgstr "bayt yazılamadı: %s\n"
+
+#~ msgid "could not find slot of finished worker\n"
+#~ msgstr "bitmiş sürecin yuvasu bulunamadı\n"
+
+#~ msgid "could not create worker thread: %s\n"
+#~ msgstr "işçi threadi yaratılamadı: %s\n"
+
+#~ msgid "parallel_restore should not return\n"
+#~ msgstr "parallel_restore dönmemeli\n"
+
+#~ msgid "worker process crashed: status %d\n"
+#~ msgstr "worker sürecii çöktü: Durum %d\n"
+
+#~ msgid "could not write to custom output routine\n"
+#~ msgstr "kullanıcı tanımlı çıktı yordamına yazma hatası\n"
+
+#~ msgid "setting owner and privileges for %s %s\n"
+#~ msgstr "%s %s için sahiplik ve izinler ayarlanıyor\n"
+
+#~ msgid "-C and -c are incompatible options\n"
+#~ msgstr "-C ve -c seçenekler bir arada kullanılamaz\n"
+
+#~ msgid "cannot duplicate null pointer\n"
+#~ msgstr "null pointer dump edilemez\n"
+
+#~ msgid "SQL command failed\n"
+#~ msgstr "SQL komutu başarısız\n"
+
+#~ msgid "query to get data of sequence \"%s\" returned name \"%s\"\n"
+#~ msgstr "\"%s\" sequence verisini getirecek sorgu \"%s\" adını getirdi\n"
+
+#~ msgid "found more than one entry for pg_indexes in pg_class\n"
+#~ msgstr "pg_class içinde pg_indexes için birden çok kayıt bulundu\n"
+
+#~ msgid "could not find entry for pg_indexes in pg_class\n"
+#~ msgstr "pg_class içinde pg_indexes için kayıt bulunamadı\n"
+
+#~ msgid "found more than one pg_database entry for this database\n"
+#~ msgstr "bu veritabanı için birden fazla pg_database kaydı bulundu\n"
+
+#~ msgid "missing pg_database entry for this database\n"
+#~ msgstr "bu veritabanı için pg_database kaydı bulunamadı\n"
+
+#~ msgid "dumpDatabase(): could not find pg_largeobject_metadata.relfrozenxid\n"
+#~ msgstr "dumpDatabase(): pg_largeobject_metadata.relfrozenxid bulunamadı\n"
+
+#~ msgid "dumpDatabase(): could not find pg_largeobject.relfrozenxid\n"
+#~ msgstr "dumpDatabase(): pg_largeobject.relfrozenxid bulunamadı\n"
+
+#~ msgid "query returned more than one (%d) pg_database entry for database \"%s\"\n"
+#~ msgstr "Sorgu, birden fazla (%d) sonucu \"%s\" veritabanının pg_database kaydı için döndürdü\n"
+
+#~ msgid "missing pg_database entry for database \"%s\"\n"
+#~ msgstr "\"%s\" veritabanı için pg_database kaydı bulunamadı\n"
+
+#~ msgid "server version must be at least 7.3 to use schema selection switches\n"
+#~ msgstr "şema seçim anahtarlarını kullanmak için sunucu sürümü 7.3 ya da daha yüksek olmalıdır\n"
+
+#~ msgid "*** aborted because of error\n"
+#~ msgstr "*** hata nedeniyle durduruldu\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version sürüm bilgisini ver ve çık\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help bu yardımı göster ve sonra çık\n"
+
+#~ msgid "could not parse version string \"%s\"\n"
+#~ msgstr "\"%s\" sürüm bilgisi ayrıştırılamadı\n"
+
+#~ msgid "could not open output file \"%s\" for writing\n"
+#~ msgstr "\"%s\" çıktı dosyası yazmak için açılamadı\n"
+
+#~ msgid "%s: invalid number of parallel jobs\n"
+#~ msgstr "%s: parallel iş sayısı geçersiz\n"
+
+#~ msgid "%s: options -c/--clean and -a/--data-only cannot be used together\n"
+#~ msgstr "%s: -c/--clean ve -a/--data-only seçenekleri aynı anda kullanılamaz\n"
+
+#~ msgid "%s: options -s/--schema-only and -a/--data-only cannot be used together\n"
+#~ msgstr "%s: -s/--schema-only ve -a/--data-only seçenekleri aynı anda kullanılamaz\n"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s: sorgu şu idi: %s\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s: sorgu başarısız oldu: %s"
+
+#~ msgid "%s: executing %s\n"
+#~ msgstr "%s: %s yürütülüyor\n"
+
+#~ msgid "%s: invalid client encoding \"%s\" specified\n"
+#~ msgstr "%s: belirtilen \"%s\" istemci dil kodlaması geçersiz\n"
+
+#~ msgid "%s: option --if-exists requires option -c/--clean\n"
+#~ msgstr "%s: --if-exists seçeneği -c/--clean seçeneğini gerektirir\n"
+
+#~ msgid "sorter"
+#~ msgstr "sorter"
+
+#~ msgid "WARNING: could not parse reloptions array\n"
+#~ msgstr "UYARI: reloptions dizisi ayrıştırılamadı\n"
+
+#~ msgid "schema with OID %u does not exist\n"
+#~ msgstr "OID %u olan şema mevcut değil\n"
+
+#~ msgid "(The INSERT command cannot set OIDs.)\n"
+#~ msgstr "(INSERT komutu OIDleri ayarlayamaz.)\n"
+
+#~ msgid "options --inserts/--column-inserts and -o/--oids cannot be used together\n"
+#~ msgstr "--inserts/--column-inserts ve -o/--oids beraber kullanılamazlar\n"
+
+#~ msgid "TOC Entry %s at %s (length %s, checksum %d)\n"
+#~ msgstr "%2$s adresinde %1$s TOC Girişi (uzunluk %3$s, checksum %4$d)\n"
+
+#~ msgid "skipping tar member %s\n"
+#~ msgstr "%s tar öğesi atlandı\n"
+
+#~ msgid "now at file position %s\n"
+#~ msgstr "şu an dosyanın %s yerinde\n"
+
+#~ msgid "moving from position %s to next member at file position %s\n"
+#~ msgstr "dosya içerisinde %s yerinden bir sonraki %s yerine geçiş yapılamıyor\n"
+
+#~ msgid "tar archiver"
+#~ msgstr "tar archiver"
+
+#~ msgid "could not create directory \"%s\": %s\n"
+#~ msgstr "\"%s\" dizini oluşturulamadı: %s\n"
+
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "\"%s\" dizini okunamıyor: %s\n"
+
+#~ msgid "directory archiver"
+#~ msgstr "directory archiver"
+
+#~ msgid "COPY failed for table \"%s\": %s"
+#~ msgstr "COPY \"%s\" tablosu için başarısız oldu: %s"
+
+#~ msgid "%s: %s Command was: %s\n"
+#~ msgstr ""
+#~ "%s: %s Komut şuydu: %s\n"
+#~ "\n"
+
+#~ msgid "archiver (db)"
+#~ msgstr "archiver (db)"
+
+#~ msgid "custom archiver"
+#~ msgstr "custom archiver"
+
+#~ msgid "reducing dependencies for %d\n"
+#~ msgstr "%d için bağımlılıklar azaltılıyor\n"
+
+#~ msgid "transferring dependency %d -> %d to %d\n"
+#~ msgstr "%d -> %d bağımlılığı %d olarak aktarılıyor\n"
+
+#~ msgid "no item ready\n"
+#~ msgstr "hiç bir öğe hazır değil\n"
+
+#~ msgid "entering restore_toc_entries_postfork\n"
+#~ msgstr "restore_toc_entries_postfork'a giriliyor\n"
+
+#~ msgid "entering restore_toc_entries_parallel\n"
+#~ msgstr "restore_toc_entries_parallel'e giriliyor\n"
+
+#~ msgid "entering restore_toc_entries_prefork\n"
+#~ msgstr "restore_toc_entries_prefork'a giriliyor\n"
+
+#~ msgid "could not set default_tablespace to %s: %s"
+#~ msgstr "default_tablespace %s olarak değiştirilemedi: %s"
+
+#~ msgid "could not set search_path to \"%s\": %s"
+#~ msgstr "search_path \"%s\" olarak değiştirilemedi: %s"
+
+#~ msgid "could not set default_with_oids: %s"
+#~ msgstr "default_with_oids ayarlanamıyor: %s"
+
+#~ msgid "read TOC entry %d (ID %d) for %s %s\n"
+#~ msgstr "%3$s %4$s için TOC öğe %1$d (ID %2$d) okunuyor\n"
+
+#~ msgid "allocating AH for %s, format %d\n"
+#~ msgstr "%s için AH ayırılıyor, biçim %d\n"
+
+#~ msgid "attempting to ascertain archive format\n"
+#~ msgstr "arşiv formatı doğrulanmaya çalışılıyor\n"
+
+#~ msgid "-C and -1 are incompatible options\n"
+#~ msgstr "-C ve -1 uyumsuz seçeneklerdir\n"
+
+#~ msgid "archiver"
+#~ msgstr "archiver"
+
+#~ msgid "parallel archiver"
+#~ msgstr "paralel arşivleyici"
+
+#~ msgid "compress_io"
+#~ msgstr "compress_io"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "alt süreç %s sinyali tarafından sonlandırılmıştır"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "symbolic link \"%s\" okuma hatası"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "çalışma dizini \"%s\" olarak değiştirilemedi: %s"
diff --git a/src/bin/pg_dump/po/uk.po b/src/bin/pg_dump/po/uk.po
new file mode 100644
index 0000000..ad6ac26
--- /dev/null
+++ b/src/bin/pg_dump/po/uk.po
@@ -0,0 +1,2577 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-27 18:36+0000\n"
+"PO-Revision-Date: 2023-08-28 15:54\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_dump.pot\n"
+"X-Crowdin-File-ID: 918\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередження: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "не вдалося визначити поточний каталог: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "невірний бінарний файл \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "неможливо прочитати бінарний файл \"%s\""
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "неможливо знайти \"%s\" для виконання"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "не вдалося змінити каталог на \"%s\": %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "не можливо прочитати символічне послання \"%s\": %m"
+
+#: ../../common/exec.c:422 parallel.c:1611
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() помилка: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "недостатньо пам'яті"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "недостатньо пам'яті\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "неможливо дублювати нульовий покажчик (внутрішня помилка)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "неможливо виконати команду"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "команду не знайдено"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "дочірній процес завершився з кодом виходу %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "дочірній процес перервано через помилку 0х%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "дочірній процес перервано через сигнал %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "дочірній процес завершився з невизнаним статусом %d"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неприпустиме значення \"%s\" для параметра %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s має бути в діапазоні %d..%d"
+
+#: common.c:134
+#, c-format
+msgid "reading extensions"
+msgstr "читання розширень"
+
+#: common.c:137
+#, c-format
+msgid "identifying extension members"
+msgstr "ідентифікація членів розширення"
+
+#: common.c:140
+#, c-format
+msgid "reading schemas"
+msgstr "читання схемів"
+
+#: common.c:149
+#, c-format
+msgid "reading user-defined tables"
+msgstr "читання користувацьких таблиць"
+
+#: common.c:154
+#, c-format
+msgid "reading user-defined functions"
+msgstr "читання користувацьких функцій"
+
+#: common.c:158
+#, c-format
+msgid "reading user-defined types"
+msgstr "читання користувацьких типів"
+
+#: common.c:162
+#, c-format
+msgid "reading procedural languages"
+msgstr "читання процедурних мов"
+
+#: common.c:165
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "читання користувацьких агрегатних функцій"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined operators"
+msgstr "читання користувацьких операторів"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "читання користувацьких методів доступу"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "читання користувацьких класів операторів"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "читання користувацьких сімейств операторів"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "читання користувацьких парсерів текстового пошуку"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "читання користувацьких шаблонів текстового пошуку"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "читання користувацьких словників текстового пошуку"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "читання користувацьких конфігурацій текстового пошуку"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "читання користувацьких джерел сторонніх даних"
+
+#: common.c:195
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "читання користувацьких сторонніх серверів"
+
+#: common.c:198
+#, c-format
+msgid "reading default privileges"
+msgstr "читання прав за замовчуванням"
+
+#: common.c:201
+#, c-format
+msgid "reading user-defined collations"
+msgstr "читання користувацьких сортувань"
+
+#: common.c:204
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "читання користувацьких перетворень"
+
+#: common.c:207
+#, c-format
+msgid "reading type casts"
+msgstr "читання типу приведення"
+
+#: common.c:210
+#, c-format
+msgid "reading transforms"
+msgstr "читання перетворень"
+
+#: common.c:213
+#, c-format
+msgid "reading table inheritance information"
+msgstr "читання інформації про успадкування таблиці"
+
+#: common.c:216
+#, c-format
+msgid "reading event triggers"
+msgstr "читання тригерів подій"
+
+#: common.c:220
+#, c-format
+msgid "finding extension tables"
+msgstr "пошук таблиць розширень"
+
+#: common.c:224
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "пошук відносин успадкування"
+
+#: common.c:227
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "читання інформації про стовпці цікавлячої таблиці"
+
+#: common.c:230
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "помітка успадкованих стовпців в підтаблицях"
+
+#: common.c:233
+#, c-format
+msgid "reading partitioning data"
+msgstr "читання даних секції"
+
+#: common.c:236
+#, c-format
+msgid "reading indexes"
+msgstr "читання індексів"
+
+#: common.c:239
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "помітка індексів в секційних таблицях"
+
+#: common.c:242
+#, c-format
+msgid "reading extended statistics"
+msgstr "читання розширеної статистики"
+
+#: common.c:245
+#, c-format
+msgid "reading constraints"
+msgstr "читання обмежень"
+
+#: common.c:248
+#, c-format
+msgid "reading triggers"
+msgstr "читання тригерів"
+
+#: common.c:251
+#, c-format
+msgid "reading rewrite rules"
+msgstr "читання правил перезаписування"
+
+#: common.c:254
+#, c-format
+msgid "reading policies"
+msgstr "читання політик"
+
+#: common.c:257
+#, c-format
+msgid "reading publications"
+msgstr "читання публікацій"
+
+#: common.c:260
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "читання членства публікації для таблиць"
+
+#: common.c:263
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "читання членства публікації для схем"
+
+#: common.c:266
+#, c-format
+msgid "reading subscriptions"
+msgstr "читання підписок"
+
+#: common.c:345
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "неприпустиме число батьківських елементів %d для таблиці \"%s\""
+
+#: common.c:1006
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "помилка перевірки, батьківський елемент ідентифікатора OID %u для таблиці \"%s\" (ідентифікатор OID %u) не знайдено"
+
+#: common.c:1045
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "не вдалося проаналізувати числовий масив \"%s\": забагато чисел"
+
+#: common.c:1057
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "не вдалося проаналізувати числовий масив \"%s\": неприпустимий характер числа"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "невірний код стиснення: %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504
+#: compress_io.c:547
+#, c-format
+msgid "not built with zlib support"
+msgstr "зібрано без підтримки zlib"
+
+#: compress_io.c:236 compress_io.c:333
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "не вдалося ініціалізувати бібліотеку стиснення: %s"
+
+#: compress_io.c:256
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "не вдалося закрити потік стиснення: %s"
+
+#: compress_io.c:273
+#, c-format
+msgid "could not compress data: %s"
+msgstr "не вдалося стиснути дані: %s"
+
+#: compress_io.c:349 compress_io.c:364
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "не вдалося розпакувати дані: %s"
+
+#: compress_io.c:371
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "не вдалося закрити бібліотеку стиснення: %s"
+
+#: compress_io.c:584 compress_io.c:621
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "не вдалося прочитати з вхідного файлу: %s"
+
+#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553
+#: pg_backup_tar.c:726 pg_backup_tar.c:749
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "не вдалося прочитати з вхідного файлу: кінець файлу"
+
+#: parallel.c:253
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() помилка: код помилки %d"
+
+#: parallel.c:961
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "не вдалося створити канали зв'язку: %m"
+
+#: parallel.c:1018
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "не вдалося створити робочий процес: %m"
+
+#: parallel.c:1148
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "нерозпізнана команда отримана від лідера: \"%s\""
+
+#: parallel.c:1191 parallel.c:1429
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "отримане невірне повідомлення від робочого процесу: \"%s\""
+
+#: parallel.c:1323
+#, c-format
+msgid "could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr "не вдалося отримати блокування відношення \"%s\"\n"
+"Це, зазвичай, означає, що хтось зробив запит на монопольне блокування таблиці після того, як батьківський процес pg_dump отримав початкове блокування спільного доступу для таблиці."
+
+#: parallel.c:1412
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "робочий процес завершився несподівано"
+
+#: parallel.c:1534 parallel.c:1652
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "не вдалося записати до каналу зв'язку: %m"
+
+#: parallel.c:1736
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: не вдалося створити сокет: код помилки %d"
+
+#: parallel.c:1747
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: не вдалося прив'язати: код помилки %d"
+
+#: parallel.c:1754
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: не вдалося прослухати: код помилки %d"
+
+#: parallel.c:1761
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s() помилка: код помилки %d"
+
+#: parallel.c:1772
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: не вдалося створити другий сокет: код помилки %d"
+
+#: parallel.c:1781
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: не вдалося зв'язатися з сокетом: код помилки %d"
+
+#: parallel.c:1790
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: не вдалося прийняти зв'язок: код помилки %d"
+
+#: pg_backup_archiver.c:280 pg_backup_archiver.c:1632
+#, c-format
+msgid "could not close output file: %m"
+msgstr "не вдалося закрити вихідний файл: %m"
+
+#: pg_backup_archiver.c:324 pg_backup_archiver.c:328
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "елементи архіву в неправильному порядку"
+
+#: pg_backup_archiver.c:334
+#, c-format
+msgid "unexpected section code %d"
+msgstr "неочікуваний код розділу %d"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "паралельне відновлення не підтримується з цим файлом архівного формату"
+
+#: pg_backup_archiver.c:375
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "паралельне відновлення не підтримується з архівами, зробленими pre-8.0 pg_dump"
+
+#: pg_backup_archiver.c:393
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)"
+msgstr "не вдалося відновити зі стиснутого архіву (встановлена версія не підтримує стискання)"
+
+#: pg_backup_archiver.c:410
+#, c-format
+msgid "connecting to database for restore"
+msgstr "підключення до бази даних для відновлення"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "прямі з'днання з базою даних не підтримуються в архівах у версіях до 1.3"
+
+#: pg_backup_archiver.c:455
+#, c-format
+msgid "implied data-only restore"
+msgstr "мається на увазі відновлення лише даних"
+
+#: pg_backup_archiver.c:521
+#, c-format
+msgid "dropping %s %s"
+msgstr "видалення %s %s"
+
+#: pg_backup_archiver.c:621
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "не вдалося знайти, куди вставити IF EXISTS в інструкції \"%s\""
+
+#: pg_backup_archiver.c:777 pg_backup_archiver.c:779
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "попередження з оригінального файлу дамп: %s"
+
+#: pg_backup_archiver.c:794
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "створення %s \"%s.%s\""
+
+#: pg_backup_archiver.c:797
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "створення %s \" \"%s\""
+
+#: pg_backup_archiver.c:847
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "підключення до нової бази даних \"%s\""
+
+#: pg_backup_archiver.c:874
+#, c-format
+msgid "processing %s"
+msgstr "обробка %s"
+
+#: pg_backup_archiver.c:896
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "обробка даних для таблиці \"%s.%s\""
+
+#: pg_backup_archiver.c:966
+#, c-format
+msgid "executing %s %s"
+msgstr "виконання %s %s"
+
+#: pg_backup_archiver.c:1005
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "вимкнення тригерів для %s"
+
+#: pg_backup_archiver.c:1031
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "увімкнення тригерів для %s"
+
+#: pg_backup_archiver.c:1096
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "внутрішня помилка - WriteData не може бути викликана поза контекстом підпрограми DataDumper "
+
+#: pg_backup_archiver.c:1279
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "вивід великих об'єктів не підтримується у вибраному форматі"
+
+#: pg_backup_archiver.c:1337
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "відновлено %d великий об'єкт"
+msgstr[1] "відновлено %d великих об'єкти"
+msgstr[2] "відновлено %d великих об'єктів"
+msgstr[3] "відновлено %d великих об'єктів"
+
+#: pg_backup_archiver.c:1358 pg_backup_tar.c:669
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "відновлення великого об'єкту з OID %u"
+
+#: pg_backup_archiver.c:1370
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "не вдалося створити великий об'єкт %u: %s"
+
+#: pg_backup_archiver.c:1375 pg_dump.c:3607
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "не вдалося відкрити великий об'єкт %u: %s"
+
+#: pg_backup_archiver.c:1431
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "не вдалося відкрити файл TOC \"%s\": %m"
+
+#: pg_backup_archiver.c:1459
+#, c-format
+msgid "line ignored: %s"
+msgstr "рядок проігноровано: %s"
+
+#: pg_backup_archiver.c:1466
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "не вдалося знайти введення для ID %d"
+
+#: pg_backup_archiver.c:1489 pg_backup_directory.c:222
+#: pg_backup_directory.c:599
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "не вдалося закрити файл TOC: %m"
+
+#: pg_backup_archiver.c:1603 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:586 pg_backup_directory.c:649
+#: pg_backup_directory.c:668 pg_dumpall.c:476
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "не вдалося відкрити вихідний файл \"%s\": %m"
+
+#: pg_backup_archiver.c:1605 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "не вдалося відкрити вихідний файл: %m"
+
+#: pg_backup_archiver.c:1699
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "записано %zu байт даних великого об'єкта (результат = %d)"
+msgstr[1] "записано %zu байти даних великого об'єкта (результат = %d)"
+msgstr[2] "записано %zu байтів даних великого об'єкта (результат = %d)"
+msgstr[3] "записано %zu байтів даних великого об'єкта (результат = %d)"
+
+#: pg_backup_archiver.c:1705
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "не вдалося записати до великого об'єкту: %s"
+
+#: pg_backup_archiver.c:1795
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "при ІНІЦІАЛІЗАЦІЇ:"
+
+#: pg_backup_archiver.c:1800
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "при ОБРОБЦІ TOC:"
+
+#: pg_backup_archiver.c:1805
+#, c-format
+msgid "while FINALIZING:"
+msgstr "при ЗАВЕРШЕННІ:"
+
+#: pg_backup_archiver.c:1810
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "зі входження до TOC %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1886
+#, c-format
+msgid "bad dumpId"
+msgstr "невірний dumpId"
+
+#: pg_backup_archiver.c:1907
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "невірна таблиця dumpId для елементу даних таблиці"
+
+#: pg_backup_archiver.c:1999
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "неочікувана позначка зсуву даних %d"
+
+#: pg_backup_archiver.c:2012
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "зсув файлу у файлі дампу завеликий"
+
+#: pg_backup_archiver.c:2150 pg_backup_archiver.c:2160
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "ім'я каталогу задовге: \"%s\""
+
+#: pg_backup_archiver.c:2168
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "каталог \"%s\" не схожий на архівний (\"toc.dat\" не існує)"
+
+#: pg_backup_archiver.c:2176 pg_backup_custom.c:173 pg_backup_custom.c:807
+#: pg_backup_directory.c:207 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "не вдалося відкрити вхідний файл \"%s\": %m"
+
+#: pg_backup_archiver.c:2183 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "не вдалося відкрити вхідний файл: %m"
+
+#: pg_backup_archiver.c:2189
+#, c-format
+msgid "could not read input file: %m"
+msgstr "не вдалося прочитати вхідний файл: %m"
+
+#: pg_backup_archiver.c:2191
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "вхідний файл закороткий (прочитано %lu, очікувалось 5)"
+
+#: pg_backup_archiver.c:2223
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "вхідний файл схожий на дамп текстового формату. Будь ласка, використайте psql."
+
+#: pg_backup_archiver.c:2229
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "вхідний файл не схожий на архівний (закороткий?)"
+
+#: pg_backup_archiver.c:2235
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "вхідний файл не схожий на архівний"
+
+#: pg_backup_archiver.c:2244
+#, c-format
+msgid "could not close input file: %m"
+msgstr "не вдалося закрити вхідний файл: %m"
+
+#: pg_backup_archiver.c:2361
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "нерозпізнаний формат файлу \"%d\""
+
+#: pg_backup_archiver.c:2443 pg_backup_archiver.c:4505
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "завершений об'єкт %d %s %s"
+
+#: pg_backup_archiver.c:2447 pg_backup_archiver.c:4518
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "помилка при робочому процесі: код виходу %d"
+
+#: pg_backup_archiver.c:2568
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "введення ідентифікатора %d поза діапазоном -- можливо, зміст пошкоджений"
+
+#: pg_backup_archiver.c:2648
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "відновлення таблиць WITH OIDS більше не підтримується"
+
+#: pg_backup_archiver.c:2730
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "нерозпізнане кодування \"%s\""
+
+#: pg_backup_archiver.c:2735
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "невірний об'єкт КОДУВАННЯ: %s"
+
+#: pg_backup_archiver.c:2753
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "невірний об'єкт STDSTRINGS: %s"
+
+#: pg_backup_archiver.c:2778
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "схему \"%s\" не знайдено"
+
+#: pg_backup_archiver.c:2785
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "таблицю \"%s\" не знайдено"
+
+#: pg_backup_archiver.c:2792
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "індекс \"%s\" не знайдено"
+
+#: pg_backup_archiver.c:2799
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "функцію \"%s\" не знайдено"
+
+#: pg_backup_archiver.c:2806
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "тригер \"%s\" не знайдено"
+
+#: pg_backup_archiver.c:3203
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "не вдалося встановити користувача сеансу для \"%s\": %s"
+
+#: pg_backup_archiver.c:3340
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "не вдалося встановити search_path для \"%s\": %s"
+
+#: pg_backup_archiver.c:3402
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "не вдалося встановити default_tablespace для %s: %s"
+
+#: pg_backup_archiver.c:3452
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "не вдалося встановити default_table_access_method для : %s"
+
+#: pg_backup_archiver.c:3546 pg_backup_archiver.c:3711
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "невідомо, як встановити власника об'єкту типу \"%s\""
+
+#: pg_backup_archiver.c:3814
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "в заголовку файлу не знайдено магічного рядка"
+
+#: pg_backup_archiver.c:3828
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "в заголовку непідтримувана версія (%d.%d)"
+
+#: pg_backup_archiver.c:3833
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "перевірка на розмір цілого числа (%lu) не вдалася"
+
+#: pg_backup_archiver.c:3837
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "архів зроблено на архітектурі з більшими цілими числами, деякі операції можуть не виконуватися"
+
+#: pg_backup_archiver.c:3847
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "очікуваний формат (%d) відрізняється від знайденого формату у файлі (%d)"
+
+#: pg_backup_archiver.c:3862
+#, c-format
+msgid "archive is compressed, but this installation does not support compression -- no data will be available"
+msgstr "архів стиснено, але ця інсталяція не підтримує стискання -- дані не будуть доступними "
+
+#: pg_backup_archiver.c:3896
+#, c-format
+msgid "invalid creation date in header"
+msgstr "неприпустима дата створення у заголовку"
+
+#: pg_backup_archiver.c:4030
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "обробка елементу %d %s %s"
+
+#: pg_backup_archiver.c:4109
+#, c-format
+msgid "entering main parallel loop"
+msgstr "введення головного паралельного циклу"
+
+#: pg_backup_archiver.c:4120
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "пропускається елемент %d %s %s "
+
+#: pg_backup_archiver.c:4129
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "запуск елементу %d %s %s "
+
+#: pg_backup_archiver.c:4183
+#, c-format
+msgid "finished main parallel loop"
+msgstr "головний паралельний цикл завершився"
+
+#: pg_backup_archiver.c:4219
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "обробка втраченого елементу %d %s %s"
+
+#: pg_backup_archiver.c:4824
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "не вдалося створити таблицю \"%s\", дані не будуть відновлені"
+
+#: pg_backup_custom.c:376 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "неприпустимий ідентифікатор OID для великого об’єкту"
+
+#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629
+#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021
+#, c-format
+msgid "error during file seek: %m"
+msgstr "помилка під час пошуку файлу oobe. xml: %m"
+
+#: pg_backup_custom.c:478
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "блок даних %d має неправильну позицію пошуку"
+
+#: pg_backup_custom.c:495
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "нерозпізнаний тип блоку даних (%d) під час пошуку архіву"
+
+#: pg_backup_custom.c:517
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "не вдалося зайти в архіві блок з ідентифікатором %d -- можливо, через непослідовність запиту відновлення, який не можна обробити через файл, що не допускає довільний вхід"
+
+#: pg_backup_custom.c:522
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "не вдалося знайти в архіві блок з ідентифікатором %d -- можливо, архів пошкоджений"
+
+#: pg_backup_custom.c:529
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "знайдено неочікуваний блок з ідентифікатором (%d) під час читання даних -- очікувалося %d"
+
+#: pg_backup_custom.c:543
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "нерозпізнаний тип блоку даних %d при відновленні архіву"
+
+#: pg_backup_custom.c:645
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "не вдалося прочитати з вхідного файлу: %m"
+
+#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943
+#: pg_backup_tar.c:1019
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "не вдалося визначити позицію пошуку у файлі архіву: %m"
+
+#: pg_backup_custom.c:762 pg_backup_custom.c:802
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "не вдалося закрити архівний файл: %m"
+
+#: pg_backup_custom.c:785
+#, c-format
+msgid "can only reopen input archives"
+msgstr "можливо повторно відкрити лише вхідні архіви"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "паралельне відновлення зі стандартного вводу не підтримується"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "паралельне відновлення з файлу без вільного доступу не підтримується"
+
+#: pg_backup_custom.c:810
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "не вдалося набрати позицію пошуку у файлі архіву: %m"
+
+#: pg_backup_custom.c:889
+#, c-format
+msgid "compressor active"
+msgstr "ущільнювач активний"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "не вдалося отримати версію серверу з libpq"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1646
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "переривання через невідповідність версії серверу"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1647
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "версія серверу: %s; версія %s: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "вже під'єднано до бази даних"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595
+msgid "Password: "
+msgstr "Пароль: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "не вдалося зв'язатися з базою даних"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "помилка повторного підключення: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1520 pg_dumpall.c:1604
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732
+#, c-format
+msgid "query failed: %s"
+msgstr "запит не вдався: %s"
+
+#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733
+#, c-format
+msgid "Query was: %s"
+msgstr "Запит був: %s"
+
+#: pg_backup_db.c:316
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "запит повернув %d рядок замість одного: %s"
+msgstr[1] "запит повернув %d рядки замість одного: %s"
+msgstr[2] "запит повернув %d рядків замість одного: %s"
+msgstr[3] "запит повернув %d рядків замість одного: %s"
+
+#: pg_backup_db.c:352
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s:%sКоманда була: %s"
+
+#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489
+msgid "could not execute query"
+msgstr "не вдалося виконати запит"
+
+#: pg_backup_db.c:461
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "помилка повернулася від PQputCopyData: %s"
+
+#: pg_backup_db.c:510
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "помилка повернулася від PQputCopyEnd: %s"
+
+#: pg_backup_db.c:516
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "КОПІЮВАННЯ для таблиці \"%s\" не вдалося: %s"
+
+#: pg_backup_db.c:522 pg_dump.c:2106
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "неочікувані зайві результати під час копіювання таблиці \"%s\""
+
+#: pg_backup_db.c:534
+msgid "could not start database transaction"
+msgstr "не вдалося почати транзакцію бази даних"
+
+#: pg_backup_db.c:542
+msgid "could not commit database transaction"
+msgstr "не вдалося затвердити транзакцію бази даних"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "вихідний каталог не вказано"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не вдалося прочитати каталог \"%s\": %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не вдалося закрити каталог \"%s\": %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не вдалося створити каталог \"%s\": %m"
+
+#: pg_backup_directory.c:355 pg_backup_directory.c:497
+#: pg_backup_directory.c:533
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "не можливо записати у вихідний файл: %s"
+
+#: pg_backup_directory.c:373
+#, c-format
+msgid "could not close data file: %m"
+msgstr "не вдалося закрити файл даних: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "не вдалося закрити файл даних \"%s\": %m"
+
+#: pg_backup_directory.c:447
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "не вдалося відкрити великий об'єкт файлу TOC \"%s\" для вводу: %m"
+
+#: pg_backup_directory.c:458
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "невірна лінія у великому об'єкті файлу TOC \"%s\": \"%s\""
+
+#: pg_backup_directory.c:467
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "помилка читання великого об'єкту файлу TOC \"%s\""
+
+#: pg_backup_directory.c:471
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "не вдалося закрити великий об'єкт файлу TOC \"%s\" %m"
+
+#: pg_backup_directory.c:685
+#, c-format
+msgid "could not close blob data file: %m"
+msgstr "не вдалося закрити файл бінарних даних: %m"
+
+#: pg_backup_directory.c:691
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "не вдалося записати зміст у файл oobe. xml"
+
+#: pg_backup_directory.c:705
+#, c-format
+msgid "could not close blobs TOC file: %m"
+msgstr "не вдалося закрити файл TOC бінарних даних: %m"
+
+#: pg_backup_directory.c:724
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "ім'я файлу задовге: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "цей формат не може бути прочитаним"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "не вдалося відкрити файл TOC \"%s\" для виводу: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "не вдалося відкрити файл TOC для виводу: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:893
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "стиснення не підтримується форматом архіватора tar"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "не вдалося відкрити файл TOC \"%s\" для вводу: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "не вдалося відкрити файл TOC для вводу: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "не вдалося знайти файл \"%s\" в архіві"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "не вдалося згенерувати тимчасове ім'я файлу: %m"
+
+#: pg_backup_tar.c:624
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "неочікуваний синтаксис інструкції копіювання: \"%s\""
+
+#: pg_backup_tar.c:890
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "неприпустимий ідентифікатор OID для великих об’єктів (%u)"
+
+#: pg_backup_tar.c:1035
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "не вдалося закрити тимчасовий файл oobe. xml: %m"
+
+#: pg_backup_tar.c:1038
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "фактична довжина файлу (%lld) не відповідає очікуваній (%lld)"
+
+#: pg_backup_tar.c:1084 pg_backup_tar.c:1115
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "не вдалося знайти верхній колонтитул для файлу oobe. xml \"%s\" в архіві tar"
+
+#: pg_backup_tar.c:1102
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "відновлення даних поза замовленням не підтримується у цьому форматі архіву: вимагаєтсья \"%s\", але перед цим іде \"%s\" у файлі архіву."
+
+#: pg_backup_tar.c:1149
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "знайдено незавершений tar-заголовок (%lu байт)"
+msgstr[1] "знайдено незавершений tar-заголовок (%lu байт)"
+msgstr[2] "знайдено незавершений tar-заголовок (%lu байт)"
+msgstr[3] "знайдено незавершений tar-заголовок (%lu байт)"
+
+#: pg_backup_tar.c:1188
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "знайдено пошкоджений заголовок tar у %s (очікувалося %d, обчислено %d) позиції файлу %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "нерозпізнане ім’я розділу: \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:628 pg_dump.c:645 pg_dumpall.c:340
+#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373
+#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" для додаткової інформації."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "перевищено межу on_exit_nicely слотів"
+
+#: pg_dump.c:643 pg_dumpall.c:348 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному рядку (перший \"%s\")"
+
+#: pg_dump.c:662 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "параметри -s/--schema-only і -a/--data-only не можуть використовуватись разом"
+
+#: pg_dump.c:665
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "параметри -s/--schema-only і --include-foreign-data не можуть використовуватись разом"
+
+#: pg_dump.c:668
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "параметр --include-foreign-data не підтримується з паралельним резервним копіюванням"
+
+#: pg_dump.c:671 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "параметри -c/--clean і -a/--data-only не можна використовувати разом"
+
+#: pg_dump.c:674 pg_dumpall.c:378 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "параметр --if-exists потребує параметр -c/--clean"
+
+#: pg_dump.c:681
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "параметр --on-conflict-do-nothing вимагає опції --inserts, --rows-per-insert або --column-inserts"
+
+#: pg_dump.c:703
+#, c-format
+msgid "requested compression not available in this installation -- archive will be uncompressed"
+msgstr "затребуване стискання недоступне на цій системі -- архів не буде стискатися"
+
+#: pg_dump.c:716
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "паралельне резервне копіювання підтримується лише з форматом \"каталог\""
+
+#: pg_dump.c:762
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "останній вбудований OID %u"
+
+#: pg_dump.c:771
+#, c-format
+msgid "no matching schemas were found"
+msgstr "відповідних схем не знайдено"
+
+#: pg_dump.c:785
+#, c-format
+msgid "no matching tables were found"
+msgstr "відповідних таблиць не знайдено"
+
+#: pg_dump.c:807
+#, c-format
+msgid "no matching extensions were found"
+msgstr "не знайдено відповідних розширень"
+
+#: pg_dump.c:990
+#, c-format
+msgid "%s dumps a database as a text file or to other formats.\n\n"
+msgstr "%s зберігає резервну копію бази даних в текстовому файлі або в інших форматах.\n\n"
+
+#: pg_dump.c:991 pg_dumpall.c:605 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "Використання:\n"
+
+#: pg_dump.c:992
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [DBNAME]\n"
+
+#: pg_dump.c:994 pg_dumpall.c:608 pg_restore.c:436
+#, c-format
+msgid "\n"
+"General options:\n"
+msgstr "\n"
+"Основні налаштування:\n"
+
+#: pg_dump.c:995
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=FILENAME ім'я файлу виводу або каталогу\n"
+
+#: pg_dump.c:996
+#, c-format
+msgid " -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr " -F, --format=c|d|t|p формат файлу виводу (спеціальний, каталог, tar,\n"
+" звичайний текст (за замовчуванням))\n"
+
+#: pg_dump.c:998
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM використовувати ці паралельні завдання для вивантаження\n"
+
+#: pg_dump.c:999 pg_dumpall.c:610
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose детальний режим\n"
+
+#: pg_dump.c:1000 pg_dumpall.c:611
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію, потім вийти\n"
+
+#: pg_dump.c:1001
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 рівень стискання для стиснутих форматів\n"
+
+#: pg_dump.c:1002 pg_dumpall.c:612
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=TIMEOUT помилка після очікування TIMEOUT для блокування таблиці\n"
+
+#: pg_dump.c:1003 pg_dumpall.c:639
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync не чекати безпечного збереження змін на диск\n"
+
+#: pg_dump.c:1004 pg_dumpall.c:613
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: pg_dump.c:1006 pg_dumpall.c:614
+#, c-format
+msgid "\n"
+"Options controlling the output content:\n"
+msgstr "\n"
+"Параметри, що керують вихідним вмістом:\n"
+
+#: pg_dump.c:1007 pg_dumpall.c:615
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only вивантажити лише дані, без схеми\n"
+
+#: pg_dump.c:1008
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs включити у вивантаження великі об'єкти\n"
+
+#: pg_dump.c:1009
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs виключити з вивантаження великі об'єкти\n"
+
+#: pg_dump.c:1010 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean видалити об'єкти бази даних перед перед повторним створенням\n"
+
+#: pg_dump.c:1011
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create включити у вивантаження команди для створення бази даних\n"
+
+#: pg_dump.c:1012
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATTERN вивантажити лише вказане(і) розширення\n"
+
+#: pg_dump.c:1013 pg_dumpall.c:617
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=ENCODING вивантажити дані в кодуванні ENCODING\n"
+
+#: pg_dump.c:1014
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=PATTERN вивантажити лише вказану схему(и)\n"
+
+#: pg_dump.c:1015
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATTERN НЕ вивантажувати вказану схему(и)\n"
+
+#: pg_dump.c:1016
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr " -O, --no-owner пропускати відновлення володіння об'єктами\n"
+" при використанні текстового формату\n"
+
+#: pg_dump.c:1018 pg_dumpall.c:621
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only вивантажити лише схему, без даних\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAME ім'я користувача, яке буде використовуватись у звичайних текстових форматах\n"
+
+#: pg_dump.c:1020
+#, c-format
+msgid " -t, --table=PATTERN dump the specified table(s) only\n"
+msgstr " -t, --table=PATTERN вивантажити лише вказані таблиці\n"
+
+#: pg_dump.c:1021
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATTERN НЕ вивантажувати вказані таблиці\n"
+
+#: pg_dump.c:1022 pg_dumpall.c:624
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges не вивантажувати права (надання/відкликання)\n"
+
+#: pg_dump.c:1023 pg_dumpall.c:625
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade для використання лише утилітами оновлення\n"
+
+#: pg_dump.c:1024 pg_dumpall.c:626
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts вивантажити дані у вигляді команд INSERT з іменами стовпців\n"
+
+#: pg_dump.c:1025 pg_dumpall.c:627
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr " --disable-dollar-quoting вимкнути цінову пропозицію $, використовувати SQL стандартну цінову пропозицію\n"
+
+#: pg_dump.c:1026 pg_dumpall.c:628 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers вимкнути тригери лише під час відновлення даних\n"
+
+#: pg_dump.c:1027
+#, c-format
+msgid " --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr " --enable-row-security активувати захист на рівні рядків (вивантажити лише той вміст, до якого\n"
+" користувач має доступ)\n"
+
+#: pg_dump.c:1029
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=PATTERN НЕ вивантажувати дані вказаних таблиць\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:630
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM змінити параметр за замовчуванням для extra_float_digits\n"
+
+#: pg_dump.c:1031 pg_dumpall.c:631 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists використовувати IF EXISTS під час видалення об'єктів\n"
+
+#: pg_dump.c:1032
+#, c-format
+msgid " --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr " --include-foreign-data=ШАБЛОН\n"
+" включають дані підлеглих таблиць на підлеглих\n"
+" сервери, що відповідають ШАБЛОНУ\n"
+
+#: pg_dump.c:1035 pg_dumpall.c:632
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts вивантажити дані у вигляді команд INSERT, не COPY\n"
+
+#: pg_dump.c:1036 pg_dumpall.c:633
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root завантажувати секції через головну таблицю\n"
+
+#: pg_dump.c:1037 pg_dumpall.c:634
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments не вивантажувати коментарі\n"
+
+#: pg_dump.c:1038 pg_dumpall.c:635
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications не вивантажувати публікації\n"
+
+#: pg_dump.c:1039 pg_dumpall.c:637
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels не вивантажувати завдання міток безпеки\n"
+
+#: pg_dump.c:1040 pg_dumpall.c:638
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions не вивантажувати підписки\n"
+
+#: pg_dump.c:1041 pg_dumpall.c:640
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method не вивантажувати табличні методи доступу\n"
+
+#: pg_dump.c:1042 pg_dumpall.c:641
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces не вивантажувати призначення табличних просторів\n"
+
+#: pg_dump.c:1043 pg_dumpall.c:642
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression не вивантажувати методи стиснення TOAST\n"
+
+#: pg_dump.c:1044 pg_dumpall.c:643
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data не вивантажувати дані таблиць, які не журналюються\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:644
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing додавати ON CONFLICT DO NOTHING до команди INSERT\n"
+
+#: pg_dump.c:1046 pg_dumpall.c:645
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr " --quote-all-identifiers укладати в лапки всі ідентифікатори, а не тільки ключові слова\n"
+
+#: pg_dump.c:1047 pg_dumpall.c:646
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS кількість рядків для INSERT; вимагає параметру --inserts\n"
+
+#: pg_dump.c:1048
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION вивантажити вказану секцію (pre-data, data або post-data)\n"
+
+#: pg_dump.c:1049
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable чекати коли вивантаження можна буде виконати без аномалій\n"
+
+#: pg_dump.c:1050
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT використовувати під час вивантаження вказаний знімок\n"
+
+#: pg_dump.c:1051 pg_restore.c:476
+#, c-format
+msgid " --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr " --strict-names потребувати, щоб при вказівці шаблону включення\n"
+" таблиці і/або схеми йому відповідав мінімум один об'єкт\n"
+
+#: pg_dump.c:1053 pg_dumpall.c:647 pg_restore.c:478
+#, c-format
+msgid " --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr " --use-set-session-authorization\n"
+" щоб встановити власника, використати команди SET SESSION AUTHORIZATION,\n"
+" замість команд ALTER OWNER\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:651 pg_restore.c:482
+#, c-format
+msgid "\n"
+"Connection options:\n"
+msgstr "\n"
+"Налаштування з'єднання:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=DBNAME ім'я бази даних для вивантаження\n"
+
+#: pg_dump.c:1059 pg_dumpall.c:653 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME хост серверу баз даних або каталог сокетів\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:655 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT номер порту сервера бази даних\n"
+
+#: pg_dump.c:1061 pg_dumpall.c:656 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME підключатись як вказаний користувач бази даних\n"
+
+#: pg_dump.c:1062 pg_dumpall.c:657 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ніколи не запитувати пароль\n"
+
+#: pg_dump.c:1063 pg_dumpall.c:658 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password запитувати пароль завжди (повинно траплятись автоматично)\n"
+
+#: pg_dump.c:1064 pg_dumpall.c:659
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLENAME виконати SET ROLE до вивантаження\n"
+
+#: pg_dump.c:1066
+#, c-format
+msgid "\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n\n"
+msgstr "\n"
+"Якщо ім'я бази даних не вказано, тоді використовується значення змінної середовища PGDATABASE.\n\n"
+
+#: pg_dump.c:1068 pg_dumpall.c:663 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Повідомляти про помилки на <%s>.\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:664 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: pg_dump.c:1088 pg_dumpall.c:488
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "вказано неприпустиме клієнтське кодування \"%s\""
+
+#: pg_dump.c:1226
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "паралельні вивантаження для резервних серверів не підтримуються цією версію сервера"
+
+#: pg_dump.c:1291
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "вказано неприпустимий формат виводу \"%s\""
+
+#: pg_dump.c:1332 pg_dump.c:1388 pg_dump.c:1441 pg_dumpall.c:1282
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "неправильне повне ім'я (забагато компонентів): %s"
+
+#: pg_dump.c:1340
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "не знайдено відповідних схем для візерунку \"%s\""
+
+#: pg_dump.c:1393
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "не знайдено відповідних розширень для шаблону \"%s\""
+
+#: pg_dump.c:1446
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "не знайдено відповідних підлеглих серверів для шаблону \"%s\""
+
+#: pg_dump.c:1509
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "неправильне ім'я зв'язку (забагато компонентів): %s"
+
+#: pg_dump.c:1520
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "не знайдено відповідних таблиць для візерунку\"%s\""
+
+#: pg_dump.c:1547
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "На даний момент ви від'єднанні від бази даних."
+
+#: pg_dump.c:1550
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "міжбазові посилання не реалізовані: %s"
+
+#: pg_dump.c:1981
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "вивантажування змісту таблиці \"%s.%s\""
+
+#: pg_dump.c:2087
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Помилка вивантажування змісту таблиці \"%s\": помилка в PQgetCopyData()."
+
+#: pg_dump.c:2088 pg_dump.c:2098
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Повідомлення про помилку від сервера: %s"
+
+#: pg_dump.c:2089 pg_dump.c:2099
+#, c-format
+msgid "Command was: %s"
+msgstr "Команда була: %s"
+
+#: pg_dump.c:2097
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Помилка вивантажування змісту таблиці \"%s\": помилка в PQgetResult(). "
+
+#: pg_dump.c:2179
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "неправильна кількість полів отриманих з таблиці \"%s\""
+
+#: pg_dump.c:2875
+#, c-format
+msgid "saving database definition"
+msgstr "збереження визначення бази даних"
+
+#: pg_dump.c:2971
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "нерозпізнаний постачальник локалів: %s"
+
+#: pg_dump.c:3317
+#, c-format
+msgid "saving encoding = %s"
+msgstr "збереження кодування = %s"
+
+#: pg_dump.c:3342
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "збереження standard_conforming_strings = %s"
+
+#: pg_dump.c:3381
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "не вдалося проаналізувати результат current_schemas()"
+
+#: pg_dump.c:3400
+#, c-format
+msgid "saving search_path = %s"
+msgstr "збереження search_path = %s"
+
+#: pg_dump.c:3438
+#, c-format
+msgid "reading large objects"
+msgstr "читання великих об’єктів"
+
+#: pg_dump.c:3576
+#, c-format
+msgid "saving large objects"
+msgstr "збереження великих об’єктів"
+
+#: pg_dump.c:3617
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "помилка читання великих об’єктів %u: %s"
+
+#: pg_dump.c:3723
+#, c-format
+msgid "reading row-level security policies"
+msgstr "читання політик безпеки на рівні рядків"
+
+#: pg_dump.c:3864
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "неочікуваний тип команди в політиці: %c"
+
+#: pg_dump.c:4314 pg_dump.c:4632 pg_dump.c:11835 pg_dump.c:17724
+#: pg_dump.c:17726 pg_dump.c:18347
+#, c-format
+msgid "could not parse %s array"
+msgstr "не вдалося аналізувати масив %s"
+
+#: pg_dump.c:4500
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "підписки не вивантажені через те, що чинний користувач не є суперкористувачем"
+
+#: pg_dump.c:5014
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "не вдалося знайти батьківський елемент для %s %s"
+
+#: pg_dump.c:5159
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "схема з OID %u не існує"
+
+#: pg_dump.c:6615 pg_dump.c:16988
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "помилка цілісності, за OID %u не вдалося знайти батьківську таблицю послідовності з OID %u"
+
+#: pg_dump.c:6758
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "помилка цілісності, OID %u не знайдено в таблиці pg_partitioned_table"
+
+#: pg_dump.c:6989 pg_dump.c:7256 pg_dump.c:7727 pg_dump.c:8394 pg_dump.c:8515
+#: pg_dump.c:8669
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "нерозпізнаний OID таблиці %u"
+
+#: pg_dump.c:6993
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "неочікувані дані індексу для таблиці \"%s\""
+
+#: pg_dump.c:7488
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "помилка цілісності, за OID %u не вдалося знайти батьківську таблицю для запису pg_rewrite з OID %u"
+
+#: pg_dump.c:7779
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "запит не повернув ім'я цільової таблиці для тригера зовнішнього ключа \"%s\" в таблиці \"%s\" (OID цільової таблиці: %u)"
+
+#: pg_dump.c:8398
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "неочікувані дані стовпця для таблиці \"%s\""
+
+#: pg_dump.c:8428
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "неприпустима нумерація стовпців у таблиці \"%s\""
+
+#: pg_dump.c:8477
+#, c-format
+msgid "finding table default expressions"
+msgstr "пошук виразів за замовчуванням для таблиці"
+
+#: pg_dump.c:8519
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "неприпустиме значення adnum %d для таблиці \"%s\""
+
+#: pg_dump.c:8619
+#, c-format
+msgid "finding table check constraints"
+msgstr "пошук перевірочних обмежень таблиці"
+
+#: pg_dump.c:8673
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "очікувалось %d обмеження-перевірка для таблиці \"%s\", але знайдено %d"
+msgstr[1] "очікувалось %d обмеження-перевірки для таблиці \"%s\", але знайдено %d"
+msgstr[2] "очікувалось %d обмежень-перевірок для таблиці \"%s\", але знайдено %d"
+msgstr[3] "очікувалось %d обмежень-перевірок для таблиці \"%s\", але знайдено %d"
+
+#: pg_dump.c:8677
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "Системні каталоги можуть бути пошкоджені."
+
+#: pg_dump.c:9367
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "роль з OID %u не існує"
+
+#: pg_dump.c:9479 pg_dump.c:9508
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "непідтримуваний запис в pg_init_privs: %u %u %d"
+
+#: pg_dump.c:10329
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "typtype типу даних \"%s\" має неприпустимий вигляд"
+
+#: pg_dump.c:11904
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "нерозпізнане значення provolatile для функції \"%s\""
+
+#: pg_dump.c:11954 pg_dump.c:13817
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "нерозпізнане значення proparallel для функції \"%s\""
+
+#: pg_dump.c:12086 pg_dump.c:12192 pg_dump.c:12199
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "не вдалося знайти визначення функції для функції з OID %u"
+
+#: pg_dump.c:12125
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "неприпустиме значення в полі pg_cast.castfunc або pg_cast.castmethod"
+
+#: pg_dump.c:12128
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "неприпустиме значення в полі pg_cast.castmethod"
+
+#: pg_dump.c:12218
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "неприпустиме визначення перетворення, як мінімум одне з trffromsql і trftosql повинно бути ненульовим"
+
+#: pg_dump.c:12235
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "неприпустиме значення в полі pg_transform.trffromsql"
+
+#: pg_dump.c:12256
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "неприпустиме значення в полі pg_transform.trftosql"
+
+#: pg_dump.c:12401
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "постфіксні оператори більше не підтримуються (оператор \"%s\")"
+
+#: pg_dump.c:12571
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "не вдалося знайти оператора з OID %s"
+
+#: pg_dump.c:12639
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "неприпустимий тип \"%c\" методу доступу \"%s\""
+
+#: pg_dump.c:13293
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "нерозпізнаний постачальник правил сортування: %s"
+
+#: pg_dump.c:13302 pg_dump.c:13311 pg_dump.c:13321 pg_dump.c:13330
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "неприпустиме правило сортування \"%s\""
+
+#: pg_dump.c:13346
+#, c-format
+msgid "unrecognized collation provider '%c'"
+msgstr "нерозпізнаний провайдер параметрів сортування '%c'"
+
+#: pg_dump.c:13736
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "нерозпізнане значення aggfinalmodify для агрегату \"%s\""
+
+#: pg_dump.c:13792
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "нерозпізнане значення aggmfinalmodify для агрегату \"%s\""
+
+#: pg_dump.c:14510
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "нерозпізнаний тип об’єкта у стандартному праві: %d"
+
+#: pg_dump.c:14526
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "не вдалося проаналізувати стандартний ACL список (%s)"
+
+#: pg_dump.c:14608
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "не вдалося аналізувати початковий список ACL (%s) або за замовченням (%s) для об'єкта \"%s\" (%s)"
+
+#: pg_dump.c:14633
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "не вдалося аналізувати список ACL (%s) або за замовчуванням (%s) для об'єкту \"%s\" (%s)"
+
+#: pg_dump.c:15171
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "запит на отримання визначення перегляду \"%s\" не повернув дані"
+
+#: pg_dump.c:15174
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "запит на отримання визначення перегляду \"%s\" повернув більше, ніж одне визначення"
+
+#: pg_dump.c:15181
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "визначення перегляду \"%s\" пусте (довжина нуль)"
+
+#: pg_dump.c:15265
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS більше не підтримується (таблиця\"%s\")"
+
+#: pg_dump.c:16194
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "неприпустиме число стовпців %d для таблиці \"%s\""
+
+#: pg_dump.c:16272
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "не вдалося проаналізувати стовпці статистики індексів"
+
+#: pg_dump.c:16274
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "не вдалося проаналізувати значення статистики індексів"
+
+#: pg_dump.c:16276
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "невідповідна кількість стовпців і значень для статистики індексів"
+
+#: pg_dump.c:16494
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "пропущено індекс для обмеження \"%s\""
+
+#: pg_dump.c:16722
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "нерозпізнаний тип обмеження: %c"
+
+#: pg_dump.c:16823 pg_dump.c:17052
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "запит на отримання даних послідовності \"%s\" повернув %d рядки (очікувалося 1)"
+msgstr[1] "запит на отримання даних послідовності \"%s\" повернув %d рядки (очікувалося 1)"
+msgstr[2] "запит на отримання даних послідовності \"%s\" повернув %d рядків (очікувалося 1)"
+msgstr[3] "запит на отримання даних послідовності \"%s\" повернув %d рядків (очікувалося 1)"
+
+#: pg_dump.c:16855
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "нерозпізнаний тип послідовності: %s"
+
+#: pg_dump.c:17144
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "неочікуване значення tgtype: %d"
+
+#: pg_dump.c:17216
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "неприпустимий рядок аргументу (%s) для тригера \"%s\" у таблиці \"%s\""
+
+#: pg_dump.c:17485
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "помилка запиту на отримання правила \"%s\" для таблиці \"%s\": повернено неправильне число рядків "
+
+#: pg_dump.c:17638
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "не вдалося знайти згадане розширення %u"
+
+#: pg_dump.c:17728
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "невідповідна кількість конфігурацій і умов для розширення"
+
+#: pg_dump.c:17860
+#, c-format
+msgid "reading dependency data"
+msgstr "читання даних залежності"
+
+#: pg_dump.c:17946
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "немає об’єкту посилання %u %u"
+
+#: pg_dump.c:17957
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "немає посилання на об'єкт %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "неприпустимий dumpId %d"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "неприпустима залежність %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "не вдалося ідентифікувати цикл залежності"
+
+#: pg_dump_sort.c:1276
+#, c-format
+msgid "there are circular foreign-key constraints on this table:"
+msgid_plural "there are circular foreign-key constraints among these tables:"
+msgstr[0] "у наступній таблиці зациклені зовнішні ключі:"
+msgstr[1] "у наступних таблицях зациклені зовнішні ключі:"
+msgstr[2] "у наступних таблицях зациклені зовнішні ключі:"
+msgstr[3] "у наступних таблицях зациклені зовнішні ключі:"
+
+#: pg_dump_sort.c:1281
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "Ви не зможете відновити дамп без використання --disable-triggers або тимчасово розірвати обмеження."
+
+#: pg_dump_sort.c:1282
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "Можливо, використання повного вивантажування замість --data-only вивантажування допоможе уникнути цієї проблеми."
+
+#: pg_dump_sort.c:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "не вдалося вирішити цикл залежності серед цих елементів:"
+
+#: pg_dumpall.c:205
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "програма \"%s\" потрібна для %s, але не знайдена в тому ж каталозі, що й \"%s\""
+
+#: pg_dumpall.c:208
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "програма \"%s\" знайдена для \"%s\", але має відмінну версію від %s"
+
+#: pg_dumpall.c:357
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "параметр --exclude-database не можна використовувати разом з -g/--globals-only, -r/--roles-only або -t/--tablespaces-only"
+
+#: pg_dumpall.c:365
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "параметри -g/--globals-only і -r/--roles-only не можна використовувати разом"
+
+#: pg_dumpall.c:372
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "параметри -g/--globals-only і -t/--tablespaces-only не можна використовувати разом"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "параметри -r/--roles-only і -t/--tablespaces-only не можна використовувати разом"
+
+#: pg_dumpall.c:444 pg_dumpall.c:1587
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "не вдалося зв'язатися з базою даних \"%s\""
+
+#: pg_dumpall.c:456
+#, c-format
+msgid "could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr "не вдалося зв'язатися з базами даних \"postgres\" або \"template1\"\n"
+"Будь ласка, вкажіть альтернативну базу даних."
+
+#: pg_dumpall.c:604
+#, c-format
+msgid "%s extracts a PostgreSQL database cluster into an SQL script file.\n\n"
+msgstr "%s експортує кластер баз даних PostgreSQL до SQL-скрипту.\n\n"
+
+#: pg_dumpall.c:606
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s: [OPTION]...\n"
+
+#: pg_dumpall.c:609
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=FILENAME ім'я вихідного файлу\n"
+
+#: pg_dumpall.c:616
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean очистити (видалити) бази даних перед відтворенням\n"
+
+#: pg_dumpall.c:618
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only вивантажувати лише глобальні об’єкти, не бази даних\n"
+
+#: pg_dumpall.c:619 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner пропускається відновлення форми власності об’єктом\n"
+
+#: pg_dumpall.c:620
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only вивантажувати лише ролі, не бази даних або табличні простори\n"
+
+#: pg_dumpall.c:622
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NAME ім'я суперкористувача для використання при вивантажуванні\n"
+
+#: pg_dumpall.c:623
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only вивантажувати лише табличні простори, не бази даних або ролі\n"
+
+#: pg_dumpall.c:629
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=PATTERN виключити бази даних, ім'я яких відповідає PATTERN\n"
+
+#: pg_dumpall.c:636
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords не вивантажувати паролі для ролей\n"
+
+#: pg_dumpall.c:652
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONNSTR підключення з використанням рядку підключення \n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=DBNAME альтернативна база даних за замовчуванням\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid "\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n\n"
+msgstr "\n"
+"Якщо -f/--file не використовується, тоді SQL- сценарій буде записаний до стандартного виводу.\n\n"
+
+#: pg_dumpall.c:803
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "пропущено ім’я ролі, що починається з \"pg_\" (%s)"
+
+#: pg_dumpall.c:1018
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "не вдалося аналізувати список ACL (%s) для параметра \"%s\""
+
+#: pg_dumpall.c:1136
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "не вдалося аналізувати список ACL (%s) для табличного простору \"%s\""
+
+#: pg_dumpall.c:1343
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "виключаємо базу даних \"%s\""
+
+#: pg_dumpall.c:1347
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "вивантажуємо базу даних \"%s\""
+
+#: pg_dumpall.c:1378
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "помилка pg_dump для бази даних \"%s\", завершення роботи"
+
+#: pg_dumpall.c:1384
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "не вдалося повторно відкрити файл виводу \"%s\": %m"
+
+#: pg_dumpall.c:1425
+#, c-format
+msgid "running \"%s\""
+msgstr "виконується \"%s\""
+
+#: pg_dumpall.c:1630
+#, c-format
+msgid "could not get server version"
+msgstr "не вдалося отримати версію серверу"
+
+#: pg_dumpall.c:1633
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "не вдалося аналізувати версію серверу \"%s\""
+
+#: pg_dumpall.c:1703 pg_dumpall.c:1726
+#, c-format
+msgid "executing %s"
+msgstr "виконується %s"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "необхідно вказати один з -d/--dbname або -f/--file"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "параметри -d/--dbname і -f/--file не можуть використовуватись разом"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "параметри -C/--create і -1/--single-transaction не можуть використовуватись разом"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "параметр --single-transaction допускається лише з одним завданням"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "нерозпізнаний формат архіву \"%s\"; будь ласка, вкажіть \"c\", \"d\" або \"t\""
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "при відновленні проігноровано помилок: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid "%s restores a PostgreSQL database from an archive created by pg_dump.\n\n"
+msgstr "%s відновлює базу даних PostgreSQL з архіву, створеного командою pg_dump.\n\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [OPTION]... [FILE]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NAME підключитись до вказаної бази даних\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FILENAME ім'я файлу виводу (- для stdout)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t формат файлу резервної копії (розпізнається автоматично)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list вивести короткий зміст архіву\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose детальний режим\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію, потім вийти\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid "\n"
+"Options controlling the restore:\n"
+msgstr "\n"
+"Параметри, що керують відновленням:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only відновити лише дані, без схеми\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create створити цільову базу даних\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error вийти при помилці, продовжувати за замовчуванням\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAME відновити вказаний індекс\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM щоб виконати відновлення, використайте ці паралельні завдання\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid " -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr " -L, --use-list=FILENAME використовувати зміст з цього файлу для \n"
+" вибору/упорядкування даних\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME відновити об'єкти лише в цій схемі\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME не відновлювати об'єкти в цій схемі\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAME(args) відновити вказану функцію\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only відновити лише схему, без даних\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NAME ім'я суперкористувача для вимкнення тригерів\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NAME відновити вказане відношення (таблицю, подання і т. д.)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NAME відновити вказаний тригер\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges пропустити відновлення прав доступу (grant/revoke)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction відновити в одній транзакції\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security активувати захист на рівні рядків\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments не відновлювати коментарі\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid " --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr " --no-data-for-failed-tables не відновлювати дані таблиць, які не вдалося створити\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications не відновлювати публікації \n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels не відновлювати мітки безпеки \n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions не відновлювати підписки\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method не відновлювати табличний метод доступу\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces не відновлювати завдання табличного простору\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION відновлювати названий розділ (pre-data, data або post-data)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME виконати SET ROLE перед відновленням\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid "\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr "\n"
+"Параметри -I, -n, -N, -P, -t, -T, і --section можна групувати і вказувати\n"
+"декілька разів для вибору декількох об'єктів.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid "\n"
+"If no input file name is supplied, then standard input is used.\n\n"
+msgstr "\n"
+"Якщо ім'я файлу введеня не вказано, тоді використовується стандартне введення.\n\n"
+
diff --git a/src/bin/pg_dump/po/zh_CN.po b/src/bin/pg_dump/po/zh_CN.po
new file mode 100644
index 0000000..a580c50
--- /dev/null
+++ b/src/bin/pg_dump/po/zh_CN.po
@@ -0,0 +1,2643 @@
+# simplified Chinese translation file for pg_dump and friends
+# Weiping He <laser@zhengmai.com.cn>, 2001.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:48+0000\n"
+"PO-Revision-Date: 2021-08-15 18:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.5.7\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的: "
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "无法确认当前目录: %m"
+
+#: ../../common/exec.c:155
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "无效的二进制码 \"%s\""
+
+#: ../../common/exec.c:205
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "无法读取二进制码 \"%s\""
+
+#: ../../common/exec.c:213
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "未能找到一个 \"%s\" 来执行"
+
+#: ../../common/exec.c:269 ../../common/exec.c:308
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "无法跳转到目录 \"%s\" 中: %m"
+
+#: ../../common/exec.c:286
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "无法读取符号链接 \"%s\": %m"
+
+#: ../../common/exec.c:409 parallel.c:1614
+msgid "%s() failed: %m"
+msgstr "%s()失败: %m"
+
+#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659
+msgid "out of memory"
+msgstr "内存不足"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "内存不足\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "无法复制空指针 (内部错误)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "命令无法执行"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "命令没有找到"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "子进程已退出, 退出码为 %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "子进程被例外(exception) 0x%X 终止"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "子进程被信号 %d 终止: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "子进程已退出, 未知状态 %d"
+
+#: common.c:124
+#, c-format
+msgid "reading extensions"
+msgstr "读扩展"
+
+#: common.c:128
+#, c-format
+msgid "identifying extension members"
+msgstr "识别扩展成员"
+
+#: common.c:131
+#, c-format
+msgid "reading schemas"
+msgstr "读取模式"
+
+#: common.c:141
+#, c-format
+msgid "reading user-defined tables"
+msgstr "读取用户定义表"
+
+#: common.c:148
+#, c-format
+msgid "reading user-defined functions"
+msgstr "读取用户定义函数"
+
+#: common.c:153
+#, c-format
+msgid "reading user-defined types"
+msgstr "读取用户定义类型"
+
+#: common.c:158
+#, c-format
+msgid "reading procedural languages"
+msgstr "读取过程语言"
+
+#: common.c:161
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "读取用户定义聚集函数"
+
+#: common.c:164
+#, c-format
+msgid "reading user-defined operators"
+msgstr "读取用户定义操作符"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "读取用户定义的访问方法"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "读取用户定义操作符集"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "读取用户定义操作符"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "读取用户定义的文本搜索解析器"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "读取用户定义的文本搜索模板"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "读取用户定义的文本搜索字典"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "读取用户定义的文本搜索配置"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "读取用户定义外部数据封装器"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "读取用户定义的外部服务器"
+
+#: common.c:195
+#, c-format
+msgid "reading default privileges"
+msgstr "正在读取缺省权限"
+
+#: common.c:198
+#, c-format
+msgid "reading user-defined collations"
+msgstr "读取用户定义的校对函数"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "读取用户定义的字符集转换"
+
+#: common.c:205
+#, c-format
+msgid "reading type casts"
+msgstr "读取类型转换"
+
+#: common.c:208
+#, c-format
+msgid "reading transforms"
+msgstr "读取转换"
+
+#: common.c:211
+#, c-format
+msgid "reading table inheritance information"
+msgstr "读取表继承信息"
+
+#: common.c:214
+#, c-format
+msgid "reading event triggers"
+msgstr "读取事件触发器"
+
+#: common.c:218
+#, c-format
+msgid "finding extension tables"
+msgstr "查找扩展表"
+
+#: common.c:222
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "正在查找关系继承"
+
+#: common.c:225
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "正在读取感兴趣表的列信息"
+
+#: common.c:228
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "在子表里标记继承字段"
+
+#: common.c:231
+#, c-format
+msgid "reading indexes"
+msgstr "读取索引"
+
+#: common.c:234
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "在分区表中标记索引"
+
+#: common.c:237
+#, c-format
+msgid "reading extended statistics"
+msgstr "读取扩展统计信息"
+
+#: common.c:240
+#, c-format
+msgid "reading constraints"
+msgstr "读取约束"
+
+#: common.c:243
+#, c-format
+msgid "reading triggers"
+msgstr "读取触发器"
+
+#: common.c:246
+#, c-format
+msgid "reading rewrite rules"
+msgstr "读取重写规则"
+
+#: common.c:249
+#, c-format
+msgid "reading policies"
+msgstr "读取策略"
+
+#: common.c:252
+#, c-format
+msgid "reading publications"
+msgstr "读取发布"
+
+#: common.c:257
+#, c-format
+msgid "reading publication membership"
+msgstr "读取发布成员资格"
+
+#: common.c:260
+#, c-format
+msgid "reading subscriptions"
+msgstr "读取订阅"
+
+#: common.c:338
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "表 \"%2$s\" 的无效parents值 %1$d"
+
+#: common.c:1100
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "健全检查失败, 未找到表 \"%2$s\" (OID %3$u) 的 OID 为 %1$u 的父辈"
+
+#: common.c:1142
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "无法分析数值数组\"%s\": 数字太多"
+
+#: common.c:1157
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "无法分析数值数组\"%s\": 出现无效字符"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "无效的压缩码: %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504
+#: compress_io.c:547
+#, c-format
+msgid "not built with zlib support"
+msgstr "没有编译成带有zlib库支持的版本"
+
+#: compress_io.c:236 compress_io.c:333
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "无法初始化压缩库: %s"
+
+#: compress_io.c:256
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "无法关闭压缩流: %s"
+
+#: compress_io.c:273
+#, c-format
+msgid "could not compress data: %s"
+msgstr "无法压缩数据: %s"
+
+#: compress_io.c:349 compress_io.c:364
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "无法解压缩数据: %s"
+
+#: compress_io.c:371
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "无法关闭压缩库: %s"
+
+#: compress_io.c:584 compress_io.c:621 pg_backup_tar.c:551 pg_backup_tar.c:554
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "无法从输入档案读取:%s"
+
+#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:552
+#: pg_backup_tar.c:787 pg_backup_tar.c:810
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "无法从输入文件中读取:文件的结尾"
+
+#: parallel.c:254
+msgid "%s() failed: error code %d"
+msgstr "%s()失败: 错误码为 %d"
+
+#: parallel.c:964
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "无法创建通信通道: %m"
+
+#: parallel.c:1021
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "无法创建工作进程: %m"
+
+#: parallel.c:1151
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "从主机接收到无法识别的命令: \"%s\""
+
+#: parallel.c:1194 parallel.c:1432
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "接收到来自工作者进程的无效消息: \"%s\""
+
+#: parallel.c:1326
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"无法获取关系 \"%s\"上的锁\n"
+"这通常意味着在父进程pg_dump已经得到表的共享访问锁之后,仍有人请求该表的排它访问锁."
+
+#: parallel.c:1415
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "一工作者进程意外退出"
+
+#: parallel.c:1537 parallel.c:1655
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "无法写入通信通道: %m"
+
+#: parallel.c:1739
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: 无法创建套接字: 错误码为 %d"
+
+#: parallel.c:1750
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: 无法绑定: 错误码为%d"
+
+#: parallel.c:1757
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: 无法监听: 错误码为 %d"
+
+#: parallel.c:1764
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s()失败: 错误码为 %d"
+
+#: parallel.c:1775
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: 无法创建继承套接字: 错误码为 %d"
+
+#: parallel.c:1784
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: 无法连接套接字: 错误码为 %d"
+
+#: parallel.c:1793
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: 无法接受连接: 错误码为 %d"
+
+#: pg_backup_archiver.c:277 pg_backup_archiver.c:1576
+#, c-format
+msgid "could not close output file: %m"
+msgstr "无法关闭输出文件: %m"
+
+#: pg_backup_archiver.c:321 pg_backup_archiver.c:325
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "归档项的序号不正确"
+
+#: pg_backup_archiver.c:331
+#, c-format
+msgid "unexpected section code %d"
+msgstr "意外的节码 %d"
+
+#: pg_backup_archiver.c:368
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "不支持以这种归档文件格式进行并行恢复"
+
+#: pg_backup_archiver.c:372
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "不支持使用8.0版本以前的pg_dump命令产生的存档文件进行并行恢复"
+
+#: pg_backup_archiver.c:390
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)"
+msgstr "无法从压缩的归档中恢复 (未配置压缩支持)"
+
+#: pg_backup_archiver.c:407
+#, c-format
+msgid "connecting to database for restore"
+msgstr "为恢复数据库与数据库联接"
+
+#: pg_backup_archiver.c:409
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "1.3 以前的归档里不支持直接数据库联接"
+
+#: pg_backup_archiver.c:452
+#, c-format
+msgid "implied data-only restore"
+msgstr "隐含的只恢复数据"
+
+#: pg_backup_archiver.c:518
+#, c-format
+msgid "dropping %s %s"
+msgstr "删除 %s %s"
+
+#: pg_backup_archiver.c:613
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "找不到要插入的位置,由于IF EXISTS在 \"%s\"状态"
+
+#: pg_backup_archiver.c:769 pg_backup_archiver.c:771
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "来自原始转储文件的警告: %s"
+
+#: pg_backup_archiver.c:786
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "创建%s \"%s.%s\""
+
+#: pg_backup_archiver.c:789
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "创建%s \"%s\""
+
+#: pg_backup_archiver.c:839
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "联接到新数据库 \"%s\""
+
+#: pg_backup_archiver.c:866
+#, c-format
+msgid "processing %s"
+msgstr "正在处理 %s"
+
+#: pg_backup_archiver.c:886
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "为表\"%s.%s\"处理数据"
+
+#: pg_backup_archiver.c:948
+#, c-format
+msgid "executing %s %s"
+msgstr "执行 %s %s"
+
+#: pg_backup_archiver.c:987
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "为%s禁用触发器"
+
+#: pg_backup_archiver.c:1013
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "为%s启用触发器"
+
+#: pg_backup_archiver.c:1041
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "内部错误 -- WriteData 不能在 DataDumper 过程的环境之外调用"
+
+#: pg_backup_archiver.c:1224
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "选定的格式不支持大对象输出"
+
+#: pg_backup_archiver.c:1282
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "恢复%d个大对象"
+msgstr[1] "恢复%d个大对象"
+
+#: pg_backup_archiver.c:1303 pg_backup_tar.c:730
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "恢复带有OID %u 的大对象"
+
+#: pg_backup_archiver.c:1315
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "无法创建大对象%u: %s"
+
+#: pg_backup_archiver.c:1320 pg_dump.c:3638
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "无法打开大对象%u: %s"
+
+#: pg_backup_archiver.c:1376
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "无法打开TOC文件 \"%s\": %m"
+
+#: pg_backup_archiver.c:1404
+#, c-format
+msgid "line ignored: %s"
+msgstr "忽略的行: %s"
+
+#: pg_backup_archiver.c:1411
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "无法为 ID %d 找到记录"
+
+#: pg_backup_archiver.c:1434 pg_backup_directory.c:222
+#: pg_backup_directory.c:598
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "无法关闭 TOC 文件: %m"
+
+#: pg_backup_archiver.c:1548 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:585 pg_backup_directory.c:648
+#: pg_backup_directory.c:667 pg_dumpall.c:489
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "无法打开输出文件\"%s\": %m"
+
+#: pg_backup_archiver.c:1550 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "无法打开输出文件: %m"
+
+#: pg_backup_archiver.c:1643
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "已经写入了大对象的%zu字节(结果 = %d)"
+msgstr[1] "已经写入了大对象的%zu字节(结果 = %d)"
+
+#: pg_backup_archiver.c:1649
+msgid "could not write to large object: %s"
+msgstr "无法写入大型对象: %s"
+
+#: pg_backup_archiver.c:1739
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "INITIALIZING 时:"
+
+#: pg_backup_archiver.c:1744
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "PROCESSING TOC 时:"
+
+#: pg_backup_archiver.c:1749
+#, c-format
+msgid "while FINALIZING:"
+msgstr "FINALIZING 时:"
+
+#: pg_backup_archiver.c:1754
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "来自 TOC 记录 %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1830
+#, c-format
+msgid "bad dumpId"
+msgstr "错误的dumpId号"
+
+#: pg_backup_archiver.c:1851
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "TABLE DATA 项的表dumpId错误"
+
+#: pg_backup_archiver.c:1943
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "意外的数据偏移标志 %d"
+
+#: pg_backup_archiver.c:1956
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "在转储文件中的文件偏移量太大"
+
+#: pg_backup_archiver.c:2094 pg_backup_archiver.c:2104
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "字典名字太长: \"%s\""
+
+#: pg_backup_archiver.c:2112
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "目录 \"%s\" 看上去不像一个有效的归档 (\"toc.dat\" 不存在)"
+
+#: pg_backup_archiver.c:2120 pg_backup_custom.c:173 pg_backup_custom.c:807
+#: pg_backup_directory.c:207 pg_backup_directory.c:394
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "无法打开输入文件 \"%s\": %m"
+
+#: pg_backup_archiver.c:2127 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "无法打开输入文件: %m"
+
+#: pg_backup_archiver.c:2133
+#, c-format
+msgid "could not read input file: %m"
+msgstr "无法读取输入文件: %m"
+
+#: pg_backup_archiver.c:2135
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "输入文件太短 (读了 %lu, 预期 5)"
+
+#: pg_backup_archiver.c:2167
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "输入文件看起来像是文本格式的dump. 请使用psql."
+
+#: pg_backup_archiver.c:2173
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "输入文件看上去不象有效的归档 (太短?)"
+
+#: pg_backup_archiver.c:2179
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "输入文件看上去不象有效的归档"
+
+#: pg_backup_archiver.c:2188
+#, c-format
+msgid "could not close input file: %m"
+msgstr "无法关闭输入文件: %m"
+
+#: pg_backup_archiver.c:2305
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "不可识别的文件格式 \"%d\""
+
+#: pg_backup_archiver.c:2387 pg_backup_archiver.c:4411
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "已完成的成员%d %s %s"
+
+#: pg_backup_archiver.c:2391 pg_backup_archiver.c:4424
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "子进程已退出, 退出码为 %d"
+
+#: pg_backup_archiver.c:2511
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "记录 ID %d 超出范围 - 可能是损坏了的 TOC"
+
+#: pg_backup_archiver.c:2578
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "不再支持使用OID还原表"
+
+#: pg_backup_archiver.c:2660
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "未知编码: \"%s\""
+
+#: pg_backup_archiver.c:2665
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "无效的ENCODING成员:%s"
+
+#: pg_backup_archiver.c:2683
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "无效的STDSTRINGS成员:%s"
+
+#: pg_backup_archiver.c:2708
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "模式\"%s\"没有找到"
+
+#: pg_backup_archiver.c:2715
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "表\"%s\"没有找到"
+
+#: pg_backup_archiver.c:2722
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "索引\"%s\"没有找到"
+
+#: pg_backup_archiver.c:2729
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "函数\"%s\"没有找到"
+
+#: pg_backup_archiver.c:2736
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "触发器\"%s\"没有找到"
+
+#: pg_backup_archiver.c:3128
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "无法设置会话用户为 \"%s\": %s"
+
+#: pg_backup_archiver.c:3260
+msgid "could not set search_path to \"%s\": %s"
+msgstr "无法将search_path设置为\"%s\": %s"
+
+#: pg_backup_archiver.c:3322
+msgid "could not set default_tablespace to %s: %s"
+msgstr "无法将default_tablespace设置为%s: %s"
+
+#: pg_backup_archiver.c:3367
+msgid "could not set default_table_access_method: %s"
+msgstr "无法统设置default_table_access_method: %s"
+
+#: pg_backup_archiver.c:3459 pg_backup_archiver.c:3617
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "不知道如何为对象类型\"%s\"设置属主"
+
+#: pg_backup_archiver.c:3720
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "在文件头中没有找到魔术字串"
+
+#: pg_backup_archiver.c:3734
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "在文件头中有不支持的版本 (%d.%d)"
+
+#: pg_backup_archiver.c:3739
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "整数尺寸 (%lu) 的健全检查失败"
+
+#: pg_backup_archiver.c:3743
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "归档不是在支持更大范围整数的主机上产生的, 有些操作可能失败"
+
+#: pg_backup_archiver.c:3753
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "预期的格式 (%d) 和在文件里找到的格式 (%d) 不同"
+
+#: pg_backup_archiver.c:3768
+#, c-format
+msgid "archive is compressed, but this installation does not support compression -- no data will be available"
+msgstr "归档是压缩过的, 但是当前安装不支持压缩 -- 数据将不可使用"
+
+#: pg_backup_archiver.c:3802
+#, c-format
+msgid "invalid creation date in header"
+msgstr "在头中的创建日期无效"
+
+#: pg_backup_archiver.c:3936
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "正在处理成员%d %s %s"
+
+#: pg_backup_archiver.c:4015
+#, c-format
+msgid "entering main parallel loop"
+msgstr "正在进入主并行循环"
+
+#: pg_backup_archiver.c:4026
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "忽略成员%d %s %s"
+
+#: pg_backup_archiver.c:4035
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "正在启动成员%d %s %s"
+
+#: pg_backup_archiver.c:4089
+#, c-format
+msgid "finished main parallel loop"
+msgstr "已完成主并行循环"
+
+#: pg_backup_archiver.c:4125
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "正在处理丢失的成员%d %s %s"
+
+#: pg_backup_archiver.c:4730
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "无法创建表\"%s\" , 这样无法恢复它的数据"
+
+#: pg_backup_custom.c:376 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "大对象的无效 OID"
+
+#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629
+#: pg_backup_custom.c:865 pg_backup_tar.c:1080 pg_backup_tar.c:1085
+#, c-format
+msgid "error during file seek: %m"
+msgstr "在文件内定位时出错: %m"
+
+#: pg_backup_custom.c:478
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "数据块%d的寻道位置错误"
+
+#: pg_backup_custom.c:495
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "搜索归档是碰到不识别的数据块类型 (%d)"
+
+#: pg_backup_custom.c:517
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "在归档中无法找到数据块ID %d -- 这可能是由于不正常的恢复引起的,这种不正常的恢复通常因为缺少的输入文件而无法处理"
+
+#: pg_backup_custom.c:522
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "无法在归档中找到ID为%d的数据块--这可能是因为归档文件损坏"
+
+#: pg_backup_custom.c:529
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "读取数据时发现意外块 ID (%d) - 预期是 %d"
+
+#: pg_backup_custom.c:543
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "恢复归档时碰到不识别的数据块类型 %d"
+
+#: pg_backup_custom.c:645
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "无法从输入档案读取:%m"
+
+#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943
+#: pg_backup_tar.c:1083
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "无法在归档文件中确定查找位置: %m"
+
+#: pg_backup_custom.c:762 pg_backup_custom.c:802
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "无法关闭归档文件: %m"
+
+#: pg_backup_custom.c:785
+#, c-format
+msgid "can only reopen input archives"
+msgstr "只能重新打开输入归档"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "不支持从标准输入进行并行恢复"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "不支持从不可随机寻址的文件里并行恢复"
+
+#: pg_backup_custom.c:810
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "无法在归档文件中设置查找位置: %m"
+
+#: pg_backup_custom.c:889
+#, c-format
+msgid "compressor active"
+msgstr "压缩程序已激活"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "无法从 libpq 获取服务器版本"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1826
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "服务器版本: %s; %s 版本: %s"
+
+#: pg_backup_db.c:55 pg_dumpall.c:1828
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "因为服务器版本不匹配而终止"
+
+#: pg_backup_db.c:124
+#, c-format
+msgid "already connected to a database"
+msgstr "已经与一个数据库联接"
+
+#: pg_backup_db.c:132 pg_backup_db.c:182 pg_dumpall.c:1655 pg_dumpall.c:1766
+msgid "Password: "
+msgstr "口令: "
+
+#: pg_backup_db.c:174
+msgid "could not connect to database"
+msgstr "无法与数据库联接"
+
+#: pg_backup_db.c:191
+msgid "reconnection failed: %s"
+msgstr "重新连接失败: %s"
+
+#: pg_backup_db.c:194 pg_backup_db.c:269 pg_dumpall.c:1686 pg_dumpall.c:1776
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:276 pg_dumpall.c:1889 pg_dumpall.c:1912
+#, c-format
+msgid "query failed: %s"
+msgstr "查询失败: %s"
+
+#: pg_backup_db.c:278 pg_dumpall.c:1890 pg_dumpall.c:1913
+#, c-format
+msgid "query was: %s"
+msgstr "查询是: %s"
+
+#: pg_backup_db.c:319
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "查询返回了%d条记录,而不是一条记录: %s"
+msgstr[1] "查询返回了%d条记录,而不是一条记录: %s"
+
+#: pg_backup_db.c:355
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %s命令是: %s"
+
+#: pg_backup_db.c:411 pg_backup_db.c:485 pg_backup_db.c:492
+msgid "could not execute query"
+msgstr "无法执行查询"
+
+#: pg_backup_db.c:464
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "PQputCopyData返回错误: %s"
+
+#: pg_backup_db.c:513
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "PQputCopyEnd返回错误: %s"
+
+#: pg_backup_db.c:519
+msgid "COPY failed for table \"%s\": %s"
+msgstr "复制表\"%s\"失败: %s"
+
+#: pg_backup_db.c:525 pg_dump.c:2074
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "复制表\"%s\"时出现意外的额外结果"
+
+#: pg_backup_db.c:537
+msgid "could not start database transaction"
+msgstr "无法开始数据库事务"
+
+#: pg_backup_db.c:545
+msgid "could not commit database transaction"
+msgstr "无法提交数据库事务"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "没有指定输出目录"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "无法读取目录 \"%s\": %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "无法关闭目录 \"%s\": %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "无法创建目录 \"%s\": %m"
+
+#: pg_backup_directory.c:355 pg_backup_directory.c:496
+#: pg_backup_directory.c:532
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "无法写到输出文件: %s"
+
+#: pg_backup_directory.c:406
+msgid "could not close data file \"%s\": %m"
+msgstr "无法关闭数据文件\"%s\": %m"
+
+#: pg_backup_directory.c:446
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "无法为输入: %2$m打开大对象文件\"%1$s\""
+
+#: pg_backup_directory.c:457
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "无效行存在于大对象文件\"%s\": \"%s\""
+
+#: pg_backup_directory.c:466
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "在读取大对象文件\"%s\"时发生错误"
+
+#: pg_backup_directory.c:470
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "无法关闭大对象 TOC 文件\"%s\": %m"
+
+#: pg_backup_directory.c:689
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "无法写入BLOB到大对象TOC文件"
+
+#: pg_backup_directory.c:721
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "文件名超长: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "无法读取这个格式"
+
+#: pg_backup_tar.c:177
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "无法为输出打开TOC文件\"%s\": %m"
+
+#: pg_backup_tar.c:184
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "无法为输出打开 TOC 文件: %m"
+
+#: pg_backup_tar.c:203 pg_backup_tar.c:352
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "不支持tar归档格式的压缩"
+
+#: pg_backup_tar.c:211
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "无法为输入打开TOC文件\"%s\": %m"
+
+#: pg_backup_tar.c:218
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "无法为输入打开 TOC 文件: %m"
+
+#: pg_backup_tar.c:338
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "无法在归档中找到文件\"%s\""
+
+#: pg_backup_tar.c:404
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "无法生成临时文件名: %m"
+
+#: pg_backup_tar.c:415
+#, c-format
+msgid "could not open temporary file"
+msgstr "无法打开临时文件"
+
+#: pg_backup_tar.c:442
+#, c-format
+msgid "could not close tar member"
+msgstr "无法关闭 tar 成员"
+
+#: pg_backup_tar.c:685
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "意外的COPY语句语法: \"%s\""
+
+#: pg_backup_tar.c:952
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "用于大对象的非法 OID (%u)"
+
+#: pg_backup_tar.c:1099
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "无法关闭临时文件: %m"
+
+#: pg_backup_tar.c:1108
+#, c-format
+msgid "actual file length (%s) does not match expected (%s)"
+msgstr "实际文件长度 (%s) 不匹配预期的长度 (%s)"
+
+#: pg_backup_tar.c:1165 pg_backup_tar.c:1196
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "无法在tar归档中为文件\"%s\"找到标题头"
+
+#: pg_backup_tar.c:1183
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "这个归档格式里不支持不按照顺序转储数据: 要求\"%s\" ,但它在归档文件里位于\"%s\"前面."
+
+#: pg_backup_tar.c:1230
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "找到未完成的tar文件头(%lu个字节)"
+msgstr[1] "找到未完成的tar文件头(%lu个字节)"
+
+#: pg_backup_tar.c:1281
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %s"
+msgstr "在文件 %1$s 的位置 %4$s 发现崩溃的 tar 头(预计在 %2$d, 计算出来在 %3$d)"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "无法识别的节名称: \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:622 pg_dump.c:639 pg_dumpall.c:341
+#: pg_dumpall.c:351 pg_dumpall.c:360 pg_dumpall.c:369 pg_dumpall.c:377
+#: pg_dumpall.c:391 pg_dumpall.c:469 pg_restore.c:284 pg_restore.c:300
+#: pg_restore.c:318
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获取更多的信息.\n"
+
+#: pg_backup_utils.c:68
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "超出on_exit_nicely槽"
+
+#: pg_dump.c:548
+#, c-format
+msgid "compression level must be in range 0..9"
+msgstr "压缩级别必须位于0..9的范围内"
+
+#: pg_dump.c:586
+#, c-format
+msgid "extra_float_digits must be in range -15..3"
+msgstr "extra_float_digits必须在-15到3之间"
+
+#: pg_dump.c:609
+#, c-format
+msgid "rows-per-insert must be in range %d..%d"
+msgstr "rows-per-insert必须位于%d..%d的范围内"
+
+#: pg_dump.c:637 pg_dumpall.c:349 pg_restore.c:298
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行参数太多 (第一个是 \"%s\")"
+
+#: pg_dump.c:658 pg_restore.c:327
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "选项 -s/--schema-only和-a/--data-only 不能同时使用"
+
+#: pg_dump.c:663
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "选项 -s/--schema-only和--include-foreign-data不能同时使用"
+
+#: pg_dump.c:666
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "并行备份不支持选项--include-foreign-data"
+
+#: pg_dump.c:670 pg_restore.c:333
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "选项 -c/--clean和 -a/--data-only不能同时使用"
+
+#: pg_dump.c:675 pg_dumpall.c:384 pg_restore.c:382
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "选项 --if-exists 需要选项 -c/ --clean"
+
+#: pg_dump.c:682
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "选项---on-conflict-do-nothing需要选项--inserts, --rows-per-insert 或者 --column-inserts"
+
+#: pg_dump.c:704
+#, c-format
+msgid "requested compression not available in this installation -- archive will be uncompressed"
+msgstr "所要求的压缩无法在本次安装中获取 -- 归档将不被压缩"
+
+#: pg_dump.c:725 pg_restore.c:349
+#, c-format
+msgid "invalid number of parallel jobs"
+msgstr "无效的并行工作数"
+
+#: pg_dump.c:729
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "并行备份只被目录格式支持"
+
+#: pg_dump.c:784
+#, c-format
+msgid ""
+"Synchronized snapshots are not supported by this server version.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots."
+msgstr ""
+"当前服务器版本不支持同步快照.\n"
+"如果不需要同步快照功能,\n"
+"可以带参数 --no-synchronized-snapshots运行"
+
+#: pg_dump.c:790
+#, c-format
+msgid "Exported snapshots are not supported by this server version."
+msgstr "在这个版本的服务器中不支持导出的快照."
+
+#: pg_dump.c:802
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "最后的内置 OID 是 %u"
+
+#: pg_dump.c:811
+#, c-format
+msgid "no matching schemas were found"
+msgstr "没有找到符合的模式"
+
+#: pg_dump.c:825
+#, c-format
+msgid "no matching tables were found"
+msgstr "没有找到符合的表"
+
+#: pg_dump.c:847
+msgid "no matching extensions were found"
+msgstr "没有找到符合的扩展名"
+
+#: pg_dump.c:1017
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s 把一个数据库转储为纯文本文件或者是其它格式.\n"
+"\n"
+
+#: pg_dump.c:1018 pg_dumpall.c:622 pg_restore.c:462
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [选项]... [数据库名字]\n"
+
+#: pg_dump.c:1021 pg_dumpall.c:625 pg_restore.c:465
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"一般选项:\n"
+
+#: pg_dump.c:1022
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=FILENAME 输出文件或目录名\n"
+
+#: pg_dump.c:1023
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p 输出文件格式 (定制, 目录, tar\n"
+" 明文 (默认值))\n"
+
+#: pg_dump.c:1025
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM 执行多个并行任务进行备份转储工作\n"
+
+#: pg_dump.c:1026 pg_dumpall.c:627
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose 详细模式\n"
+
+#: pg_dump.c:1027 pg_dumpall.c:628
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信息, 然后退出\n"
+
+#: pg_dump.c:1028
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 被压缩格式的压缩级别\n"
+
+#: pg_dump.c:1029 pg_dumpall.c:629
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=TIMEOUT 在等待表锁超时后操作失败\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:656
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync 不用等待变化安全写入磁盘\n"
+
+#: pg_dump.c:1031 pg_dumpall.c:630
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然后退出\n"
+
+#: pg_dump.c:1033 pg_dumpall.c:631
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"控制输出内容选项:\n"
+
+#: pg_dump.c:1034 pg_dumpall.c:632
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only 只转储数据,不包括模式\n"
+
+#: pg_dump.c:1035
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs 在转储中包括大对象\n"
+
+#: pg_dump.c:1036
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs 排除转储中的大型对象\n"
+
+#: pg_dump.c:1037 pg_restore.c:476
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean 在重新创建之前,先清除(删除)数据库对象\n"
+
+#: pg_dump.c:1038
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create 在转储中包括命令,以便创建数据库\n"
+
+#: pg_dump.c:1039
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATTERN 仅转储指定的扩展名\n"
+
+#: pg_dump.c:1040 pg_dumpall.c:634
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=ENCODING 转储以ENCODING形式编码的数据\n"
+
+#: pg_dump.c:1041
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=PATTERN 只转储指定的模式\n"
+
+#: pg_dump.c:1042
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATTERN 不转储指定的模式\n"
+
+#: pg_dump.c:1043
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr " -O, --no-owner 在明文格式中, 忽略恢复对象所属者\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:638
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only 只转储模式, 不包括数据\n"
+
+#: pg_dump.c:1046
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAME 在明文格式中使用指定的超级用户名\n"
+
+#: pg_dump.c:1047
+msgid " -t, --table=PATTERN dump the specified table(s) only\n"
+msgstr " -t, --table=PATTERN 只转储指定的表\n"
+
+#: pg_dump.c:1048
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATTERN 不转储指定的表\n"
+
+#: pg_dump.c:1049 pg_dumpall.c:641
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges 不要转储权限 (grant/revoke)\n"
+
+#: pg_dump.c:1050 pg_dumpall.c:642
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade 只能由升级工具使用\n"
+
+#: pg_dump.c:1051 pg_dumpall.c:643
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts 以带有列名的INSERT命令形式转储数据\n"
+
+#: pg_dump.c:1052 pg_dumpall.c:644
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr " --disable-dollar-quoting 取消美元 (符号) 引号, 使用 SQL 标准引号\n"
+
+#: pg_dump.c:1053 pg_dumpall.c:645 pg_restore.c:493
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers 在只恢复数据的过程中禁用触发器\n"
+
+#: pg_dump.c:1054
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr " --enable-row-security 启用行安全性(只转储用户能够访问的内容)\n"
+
+#: pg_dump.c:1056
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=PATTERN 不转储指定的表中的数据\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:647
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM 覆盖extra_float_digits的默认设置\n"
+
+#: pg_dump.c:1058 pg_dumpall.c:648 pg_restore.c:495
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists 当删除对象时使用IF EXISTS\n"
+
+#: pg_dump.c:1059
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=PATTERN\n"
+" 包含外部服务器上与模式匹配的\n"
+" 外部表的数据\n"
+
+#: pg_dump.c:1062 pg_dumpall.c:649
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts 以INSERT命令,而不是COPY命令的形式转储数据\n"
+
+#: pg_dump.c:1063 pg_dumpall.c:650
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root 通过根表加载分区\n"
+
+#: pg_dump.c:1064 pg_dumpall.c:651
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments 不转储注释\n"
+
+#: pg_dump.c:1065 pg_dumpall.c:652
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications 不转储发布\n"
+
+#: pg_dump.c:1066 pg_dumpall.c:654
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels 不转储安全标签的分配\n"
+
+#: pg_dump.c:1067 pg_dumpall.c:655
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions 不转储订阅\n"
+
+#: pg_dump.c:1068
+#, c-format
+msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"
+msgstr " --no-synchronized-snapshots 在并行工作集中不使用同步快照\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:657
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces 不转储表空间分配信息\n"
+
+#: pg_dump.c:1070 pg_dumpall.c:658
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression 不转储TOAST压缩方法\n"
+
+#: pg_dump.c:1071 pg_dumpall.c:659
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data 不转储没有日志的表数据\n"
+
+#: pg_dump.c:1072 pg_dumpall.c:660
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing 将ON CONFLICT DO NOTHING添加到INSERT命令\n"
+
+#: pg_dump.c:1073 pg_dumpall.c:661
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr " --quote-all-identifiers 所有标识符加引号,即使不是关键字\n"
+
+#: pg_dump.c:1074 pg_dumpall.c:662
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS 每个插入的行数;意味着--inserts\n"
+
+#: pg_dump.c:1075
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION 备份命名的节 (数据前, 数据, 及 数据后)\n"
+
+#: pg_dump.c:1076
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable 等到备份可以无异常运行\n"
+
+#: pg_dump.c:1077
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT 为转储使用给定的快照\n"
+
+#: pg_dump.c:1078 pg_restore.c:504
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr " --strict-names 要求每个表和(或)schema包括模式以匹配至少一个实体\n"
+
+#: pg_dump.c:1080 pg_dumpall.c:663 pg_restore.c:506
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" 使用 SESSION AUTHORIZATION 命令代替\n"
+" ALTER OWNER 命令来设置所有权\n"
+
+#: pg_dump.c:1084 pg_dumpall.c:667 pg_restore.c:510
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"联接选项:\n"
+
+#: pg_dump.c:1085
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=DBNAME 对数据库 DBNAME备份\n"
+
+#: pg_dump.c:1086 pg_dumpall.c:669 pg_restore.c:511
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=主机名 数据库服务器的主机名或套接字目录\n"
+
+#: pg_dump.c:1087 pg_dumpall.c:671 pg_restore.c:512
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=端口号 数据库服务器的端口号\n"
+
+#: pg_dump.c:1088 pg_dumpall.c:672 pg_restore.c:513
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=名字 以指定的数据库用户联接\n"
+
+#: pg_dump.c:1089 pg_dumpall.c:673 pg_restore.c:514
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 永远不提示输入口令\n"
+
+#: pg_dump.c:1090 pg_dumpall.c:674 pg_restore.c:515
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password 强制口令提示 (自动)\n"
+
+#: pg_dump.c:1091 pg_dumpall.c:675
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLENAME 在转储前运行SET ROLE\n"
+
+#: pg_dump.c:1093
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"如果没有提供数据库名字, 那么使用 PGDATABASE 环境变量\n"
+"的数值.\n"
+"\n"
+
+#: pg_dump.c:1095 pg_dumpall.c:679 pg_restore.c:522
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "臭虫报告至<%s>.\n"
+
+#: pg_dump.c:1096 pg_dumpall.c:680 pg_restore.c:523
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: pg_dump.c:1115 pg_dumpall.c:504
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "声明了无效的输出格式 \"%s\""
+
+#: pg_dump.c:1261
+#, c-format
+msgid ""
+"Synchronized snapshots on standby servers are not supported by this server version.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots."
+msgstr ""
+"当前服务器版本不支持备用服务器上的同步快照.\n"
+"如果不需要同步快照功能,\n"
+"可以带参数 --no-synchronized-snapshots运行."
+
+#: pg_dump.c:1330
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "声明了非法的输出格式 \"%s\""
+
+#: pg_dump.c:1368
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "没有为\"%s\"模式找到匹配的schemas"
+
+#: pg_dump.c:1415
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "没有为\"%s\"模式找到匹配的扩展"
+
+#: pg_dump.c:1462
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "没有为\"%s\"模式找到匹配的外部服务器"
+
+#: pg_dump.c:1525
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "没有为\"%s\"模式找到匹配的表"
+
+#: pg_dump.c:1948
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "正在转储表\"%s.%s\"的内容"
+
+#: pg_dump.c:2055
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "转储表 \"%s\" 的内容的 SQL 命令失败: PQendcopy() 失败."
+
+#: pg_dump.c:2056 pg_dump.c:2066
+#, c-format
+msgid "Error message from server: %s"
+msgstr "来自服务器的错误信息: %s"
+
+#: pg_dump.c:2057 pg_dump.c:2067
+#, c-format
+msgid "The command was: %s"
+msgstr "命令是: %s"
+
+#: pg_dump.c:2065
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "转储表 \"%s\" 的内容失败: PQgetResult() 失败."
+
+#: pg_dump.c:2825
+#, c-format
+msgid "saving database definition"
+msgstr "保存数据库定义"
+
+#: pg_dump.c:3297
+#, c-format
+msgid "saving encoding = %s"
+msgstr "正在保存encoding = %s"
+
+#: pg_dump.c:3322
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "正在保存standard_conforming_strings = %s"
+
+#: pg_dump.c:3361
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "无法解析current_schemas()的结果"
+
+#: pg_dump.c:3380
+#, c-format
+msgid "saving search_path = %s"
+msgstr "正在保存search_path = %s"
+
+#: pg_dump.c:3420
+#, c-format
+msgid "reading large objects"
+msgstr "正在读取大对象"
+
+#: pg_dump.c:3602
+#, c-format
+msgid "saving large objects"
+msgstr "保存大对象"
+
+#: pg_dump.c:3648
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "在读取大对象时发生错误%u: %s"
+
+#: pg_dump.c:3700
+#, c-format
+msgid "reading row security enabled for table \"%s.%s\""
+msgstr "为表\"%s.%s\"读取行安全性启用状态"
+
+#: pg_dump.c:3731
+#, c-format
+msgid "reading policies for table \"%s.%s\""
+msgstr "为表\"%s.%s\"读取策略"
+
+#: pg_dump.c:3883
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "意外的策略命令类型:%c"
+
+#: pg_dump.c:4037
+#, c-format
+msgid "owner of publication \"%s\" appears to be invalid"
+msgstr "发行 \"%s\" 的所有者非法"
+
+#: pg_dump.c:4329
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "订阅未转储,因为当前用户不是超级用户"
+
+#: pg_dump.c:4400
+#, c-format
+msgid "owner of subscription \"%s\" appears to be invalid"
+msgstr "函数订阅\"%s\" 的所有者非法"
+
+#: pg_dump.c:4443
+#, c-format
+msgid "could not parse subpublications array"
+msgstr "无法解析子发行数组"
+
+#: pg_dump.c:4801
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "无法找到父扩展%s %s"
+
+#: pg_dump.c:4933
+#, c-format
+msgid "owner of schema \"%s\" appears to be invalid"
+msgstr "模式 \"%s\" 的所有者非法"
+
+#: pg_dump.c:4956
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "OID 为 %u 的模式不存在"
+
+#: pg_dump.c:5285
+#, c-format
+msgid "owner of data type \"%s\" appears to be invalid"
+msgstr "数据类型 \"%s\" 的所有者非法"
+
+#: pg_dump.c:5369
+#, c-format
+msgid "owner of operator \"%s\" appears to be invalid"
+msgstr "操作符 \"%s\" 的所有者非法"
+
+#: pg_dump.c:5668
+#, c-format
+msgid "owner of operator class \"%s\" appears to be invalid"
+msgstr "操作符表 \"%s\" 无效"
+
+#: pg_dump.c:5751
+#, c-format
+msgid "owner of operator family \"%s\" appears to be invalid"
+msgstr "操作符 \"%s\" 的所有者无效"
+
+#: pg_dump.c:5919
+#, c-format
+msgid "owner of aggregate function \"%s\" appears to be invalid"
+msgstr "聚集函数 \"%s\" 的所有者非法"
+
+#: pg_dump.c:6178
+#, c-format
+msgid "owner of function \"%s\" appears to be invalid"
+msgstr "函数 \"%s\" 的所有者非法"
+
+#: pg_dump.c:7005
+#, c-format
+msgid "owner of table \"%s\" appears to be invalid"
+msgstr "数据表 \"%s\" 的所有者非法"
+
+#: pg_dump.c:7047 pg_dump.c:17485
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "健全检查失败,序列OID %2$u 的源表 OID%1$u 未找到"
+
+#: pg_dump.c:7186
+#, c-format
+msgid "reading indexes for table \"%s.%s\""
+msgstr "为表\"%s.%s\"读取索引"
+
+#: pg_dump.c:7600
+#, c-format
+msgid "reading foreign key constraints for table \"%s.%s\""
+msgstr "为表\"%s.%s\"读取外键约束"
+
+#: pg_dump.c:7879
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "健全检查失败,pg_rewrite项OID %2$u 的源表 OID%1$u 未找到"
+
+#: pg_dump.c:7963
+#, c-format
+msgid "reading triggers for table \"%s.%s\""
+msgstr "为表\"%s.%s\"读取触发器"
+
+#: pg_dump.c:8144
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "对在表 \"%2$s\" 上的外键触发器 \"%1$s\" 上的查询生成了 NULL 个引用表(表的 OID 是: %3$u)"
+
+#: pg_dump.c:8694
+#, c-format
+msgid "finding the columns and types of table \"%s.%s\""
+msgstr "正在查找表\"%s.%s\"的列和类型"
+
+#: pg_dump.c:8818
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "在表 \"%s\" 中的字段个数是无效的"
+
+#: pg_dump.c:8857
+#, c-format
+msgid "finding default expressions of table \"%s.%s\""
+msgstr "正在查找表\"%s.%s\"的默认表达式"
+
+#: pg_dump.c:8879
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "表 \"%2$s\" 的无效 adnum 值 %1$d"
+
+#: pg_dump.c:8972
+#, c-format
+msgid "finding check constraints for table \"%s.%s\""
+msgstr "正在查找表\"%s.%s\"的检查约束"
+
+#: pg_dump.c:9021
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "在表\"%2$s\"上期望有%1$d个检查约束,但是找到了%3$d个"
+msgstr[1] "在表\"%2$s\"上期望有%1$d个检查约束,但是找到了%3$d个"
+
+#: pg_dump.c:9025
+#, c-format
+msgid "(The system catalogs might be corrupted.)"
+msgstr "(系统表可能损坏了.)"
+
+#: pg_dump.c:10610
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "数据类型 \"%s\" 的所有者看起来无效"
+
+#: pg_dump.c:11962
+#, c-format
+msgid "bogus value in proargmodes array"
+msgstr "无法分析 proargmodes 数组"
+
+#: pg_dump.c:12269
+#, c-format
+msgid "could not parse proallargtypes array"
+msgstr "无法分析 proallargtypes 数组"
+
+#: pg_dump.c:12285
+#, c-format
+msgid "could not parse proargmodes array"
+msgstr "无法分析 proargmodes 数组"
+
+#: pg_dump.c:12299
+#, c-format
+msgid "could not parse proargnames array"
+msgstr "无法分析 proargnames 数组"
+
+#: pg_dump.c:12309
+#, c-format
+msgid "could not parse proconfig array"
+msgstr "无法解析 proconfig 数组"
+
+#: pg_dump.c:12389
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "函数 \"%s\" 的意外正向易失值"
+
+#: pg_dump.c:12439 pg_dump.c:14390
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "函数\"%s\"的proparallel值无法识别"
+
+#: pg_dump.c:12578 pg_dump.c:12687 pg_dump.c:12694
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "找不到带有OID %u的函数的函数定义"
+
+#: pg_dump.c:12617
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "在pg_cast.castfunc或者pg_cast.castmethod字段中的是假值"
+
+#: pg_dump.c:12620
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "在pg_cast.castmethod字段中的是假值"
+
+#: pg_dump.c:12713
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "臆造的转换定义,至少trffromsql和trftosql之一应该为非零"
+
+#: pg_dump.c:12730
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "在pg_transform.trffromsql域中的是臆造值"
+
+#: pg_dump.c:12751
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "在pg_transform.trftosql域中的是臆造值"
+
+#: pg_dump.c:12903
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "运不再支持后缀运算符(运算符\"%s\")"
+
+#: pg_dump.c:13073
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "未找到 OID 为 %s 的操作符"
+
+#: pg_dump.c:13141
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "访问方法\"%2$s\"的类型\"%1$c\"无效"
+
+#: pg_dump.c:13895
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "无法识别的排序规则提供程序: %s"
+
+#: pg_dump.c:14309
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "无法识别的aggfinalmodify聚合值 \"%s\""
+
+#: pg_dump.c:14365
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "无法识别的aggmfinalmodify聚合值 \"%s\""
+
+#: pg_dump.c:15087
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "缺省权限中存在未知对象类型: %d"
+
+#: pg_dump.c:15105
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "无法解析缺省ACL列表(%s)"
+
+#: pg_dump.c:15190
+#, c-format
+msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)"
+msgstr "无法为对象\"%3$s\" (%4$s)解析初始GRANT ACL列表 (%1$s) 或者初始REVOKE ACL列表 (%2$s) "
+
+#: pg_dump.c:15198
+#, c-format
+msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)"
+msgstr "无法为对象\"%3$s\" (%4$s)解析GRANT ACL列表 (%1$s) 或者REVOKE ACL列表 (%2$s)"
+
+#: pg_dump.c:15713
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "获取视图 \"%s\" 定义的查询没有返回数据"
+
+#: pg_dump.c:15716
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "获取视图 \"%s\" 定义的查询返回超过一个定义"
+
+#: pg_dump.c:15723
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "视图 \"%s\" 的定义是空的(零长)"
+
+#: pg_dump.c:15807
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "不再支持 WITH OIDS (表\"%s\")"
+
+#: pg_dump.c:16672
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "对于表 \"%2$s\" 字段个数 %1$d 是无效的"
+
+#: pg_dump.c:16749
+msgid "could not parse index statistic columns"
+msgstr "无法解析索引统计列"
+
+#: pg_dump.c:16751
+msgid "could not parse index statistic values"
+msgstr "无法解析索引统计值"
+
+#: pg_dump.c:16753
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr ""
+
+#: pg_dump.c:16970
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "对于约束 \"%s\" 缺少索引"
+
+#: pg_dump.c:17195
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "未知的约束类型: %c"
+
+#: pg_dump.c:17327 pg_dump.c:17550
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "查询得到了序列\"%s\"的数据,返回了%d条记录(期望一条)"
+msgstr[1] "查询得到了序列\"%s\"的数据,返回了%d条记录(期望一条)"
+
+#: pg_dump.c:17361
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "无法识别的序列类型: %s"
+
+#: pg_dump.c:17648
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "意外的tgtype值: %d"
+
+#: pg_dump.c:17722
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "给表 \"%3$s\" 上的触发器 \"%2$s\" 的错误参数 (%1$s)"
+
+#: pg_dump.c:17991
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "获取表 \"%2$s\" 的规则 \"%1$s\" 查询失败: 返回了错误的行数"
+
+#: pg_dump.c:18153
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "找不到引用的扩展名%u"
+
+#: pg_dump.c:18244
+msgid "could not parse extension configuration array"
+msgstr "无法解析扩展配置数组"
+
+#: pg_dump.c:18246
+msgid "could not parse extension condition array"
+msgstr "无法解析扩展条件数组"
+
+#: pg_dump.c:18248
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "扩展的配置和条件数量不匹配"
+
+#: pg_dump.c:18380
+#, c-format
+msgid "reading dependency data"
+msgstr "读取从属数据"
+
+#: pg_dump.c:18473
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "没有引用对象%u %u"
+
+#: pg_dump.c:18484
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "没有引用的对象 %u %u"
+
+#: pg_dump.c:18858
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "无法解析 reloptions 数组"
+
+#: pg_dump_sort.c:411
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "无效的dumpId %d"
+
+#: pg_dump_sort.c:417
+#, c-format
+msgid "invalid dependency %d"
+msgstr "无效的依赖 %d"
+
+#: pg_dump_sort.c:650
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "无法标识循环依赖"
+
+#: pg_dump_sort.c:1221
+#, c-format
+msgid "there are circular foreign-key constraints on this table:"
+msgid_plural "there are circular foreign-key constraints among these tables:"
+msgstr[0] "表上存在循环外键约束:"
+msgstr[1] "表上存在循环外键约束:"
+
+#: pg_dump_sort.c:1225 pg_dump_sort.c:1245
+#, c-format
+msgid " %s"
+msgstr " %s"
+
+#: pg_dump_sort.c:1226
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "不使用 --disable-triggers 选项或者临时删除约束,你将不能对备份进行恢复."
+
+#: pg_dump_sort.c:1227
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "考虑使用完全备份代替 --data-only选项进行备份以避免此问题."
+
+#: pg_dump_sort.c:1239
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "无法解析这些项的循环依赖:"
+
+#: pg_dumpall.c:202
+#, c-format
+msgid ""
+"The program \"%s\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation."
+msgstr ""
+"%2$s需要程序\"%1$s\"\n"
+"但在与\"%3$s\"相同的目录中找不到该程序.\n"
+"检查您的安装."
+
+#: pg_dumpall.c:207
+#, c-format
+msgid ""
+"The program \"%s\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation."
+msgstr ""
+"程序\"%s\"是由\"%s\"找到的\n"
+"但与%s的版本不同.\n"
+"检查您的安装."
+
+#: pg_dumpall.c:359
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "选项--exclude-database不能与-g/--globals-only、-r/--roles-only或-t/--tablespaces-only一起使用"
+
+#: pg_dumpall.c:368
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "选项-g/--globals-only和-r/--roles-only不能同时使用"
+
+#: pg_dumpall.c:376
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "选项 -g/--globals-only和-t/--tablespaces-only不能同时使用"
+
+#: pg_dumpall.c:390
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "选项 -r/--roles-only和 -t/--tablespaces-only不能同时使用"
+
+#: pg_dumpall.c:453 pg_dumpall.c:1756
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "无法与数据库 \"%s\" 联接"
+
+#: pg_dumpall.c:467
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"无法连接到数据库 \"postgres\"或\"template1\"\n"
+"请指定另外一个数据库."
+
+#: pg_dumpall.c:621
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s 抽取一个 PostgreSQL 数据库簇进一个 SQL 脚本文件.\n"
+"\n"
+
+#: pg_dumpall.c:623
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [选项]...\n"
+
+#: pg_dumpall.c:626
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=FILENAME 输出文件名\n"
+
+#: pg_dumpall.c:633
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean 在重新创建数据库前先清除(删除)数据库\n"
+
+#: pg_dumpall.c:635
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only 只转储全局对象, 不包括数据库\n"
+
+#: pg_dumpall.c:636 pg_restore.c:485
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner 不恢复对象所属者\n"
+
+#: pg_dumpall.c:637
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only 只转储角色,不包括数据库或表空间\n"
+
+#: pg_dumpall.c:639
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NAME 在转储中, 指定的超级用户名\n"
+
+#: pg_dumpall.c:640
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only 只转储表空间,而不转储数据库或角色\n"
+
+#: pg_dumpall.c:646
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=PATTERN 排除名称与PATTERN匹配的数据库\n"
+
+#: pg_dumpall.c:653
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords 不转储角色的密码\n"
+
+#: pg_dumpall.c:668
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONNSTR 连接数据库使用的连接串\n"
+
+#: pg_dumpall.c:670
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=DBNAME 另一个缺省数据库\n"
+
+#: pg_dumpall.c:677
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"如果没有使用 -f/--file,那么将把SQL脚本写到标准输出.\n"
+"\n"
+
+#: pg_dumpall.c:883
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "以\"pg_\"开始的角色名称已被跳过 (%s)"
+
+#: pg_dumpall.c:1284
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "无法为表空间 \"%2$s\" 分析 ACL 列表 (%1$s)"
+
+#: pg_dumpall.c:1501
+msgid "excluding database \"%s\""
+msgstr "正在排除数据库 \"%s\""
+
+#: pg_dumpall.c:1505
+msgid "dumping database \"%s\""
+msgstr "正在转储数据库 \"%s\""
+
+#: pg_dumpall.c:1537
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump 失败在数据库 \"%s\", 正在退出"
+
+#: pg_dumpall.c:1546
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "无法重新打开输出文件 \"%s\":%m"
+
+#: pg_dumpall.c:1590
+#, c-format
+msgid "running \"%s\""
+msgstr "正在运行 \"%s\""
+
+#: pg_dumpall.c:1805
+#, c-format
+msgid "could not get server version"
+msgstr "无法从服务器获取版本"
+
+#: pg_dumpall.c:1811
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "无法分析版本字串 \"%s\""
+
+#: pg_dumpall.c:1883 pg_dumpall.c:1906
+#, c-format
+msgid "executing %s"
+msgstr "正在执行: %s"
+
+#: pg_restore.c:308
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "必须指定-d/--dbname和-f/--file之一"
+
+#: pg_restore.c:317
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "选项 -d/--dbname和-f/--file不能同时使用"
+
+#: pg_restore.c:343
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "选项 -C/--create和 -1/--single-transaction不能同时使用"
+
+#: pg_restore.c:357
+#, c-format
+msgid "maximum number of parallel jobs is %d"
+msgstr "已经达到并行工作集的最大数 %d"
+
+#: pg_restore.c:366
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "不能同时指定选项--single-transaction和多个任务"
+
+#: pg_restore.c:408
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "不可识别的归档格式\"%s\"; 请指定 \"c\", \"d\", 或 \"t\""
+
+#: pg_restore.c:448
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "恢复中忽略错误: %d"
+
+#: pg_restore.c:461
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s 从一个归档中恢复一个由 pg_dump 创建的 PostgreSQL 数据库.\n"
+"\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [选项]... [文件名]\n"
+
+#: pg_restore.c:466
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=名字 连接数据库名字\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=文件名 输出文件名(- 对于stdout)\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t 备份文件格式(应该自动进行)\n"
+
+#: pg_restore.c:469
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list 打印归档文件的 TOC 概述\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose 详细模式\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信息, 然后退出\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然后退出\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"恢复控制选项:\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only 只恢复数据, 不包括模式\n"
+
+#: pg_restore.c:477
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create 创建目标数据库\n"
+
+#: pg_restore.c:478
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error 发生错误退出, 默认为继续\n"
+
+#: pg_restore.c:479
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAME 恢复指定名称的索引\n"
+
+#: pg_restore.c:480
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM 执行多个并行任务进行恢复工作\n"
+
+#: pg_restore.c:481
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=FILENAME 从这个文件中使用指定的内容表排序\n"
+" 输出\n"
+
+#: pg_restore.c:483
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME 在这个模式中只恢复对象\n"
+
+#: pg_restore.c:484
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME 不恢复此模式中的对象\n"
+
+#: pg_restore.c:486
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAME(args) 恢复指定名字的函数\n"
+
+#: pg_restore.c:487
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only 只恢复模式, 不包括数据\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NAME 使用指定的超级用户来禁用触发器\n"
+
+#: pg_restore.c:489
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NAME 恢复命名关系(表、视图等)\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NAME 恢复指定名字的触发器\n"
+
+#: pg_restore.c:491
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges 跳过处理权限的恢复 (grant/revoke)\n"
+
+#: pg_restore.c:492
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction 作为单个事务恢复\n"
+
+#: pg_restore.c:494
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security 启用行安全性\n"
+
+#: pg_restore.c:496
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments 不恢复注释\n"
+
+#: pg_restore.c:497
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables 对那些无法创建的表不进行\n"
+" 数据恢复\n"
+
+#: pg_restore.c:499
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications 不恢复发行\n"
+
+#: pg_restore.c:500
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels 不恢复安全标签信息\n"
+
+#: pg_restore.c:501
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions 不恢复订阅\n"
+
+#: pg_restore.c:502
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces 不恢复表空间的分配信息\n"
+
+#: pg_restore.c:503
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION 恢复命名节 (数据前、数据及数据后)\n"
+
+#: pg_restore.c:516
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME 在恢复前执行SET ROLE操作\n"
+
+#: pg_restore.c:518
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"选项 -I, -n, -N, -P, -t, -T, 以及 --section 可以组合使用和指定\n"
+"多次用于选择多个对象.\n"
+
+#: pg_restore.c:521
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"如果没有提供输入文件名, 则使用标准输入.\n"
+"\n"
+
diff --git a/src/bin/pg_dump/t/001_basic.pl b/src/bin/pg_dump/t/001_basic.pl
new file mode 100644
index 0000000..a583c8a
--- /dev/null
+++ b/src/bin/pg_dump/t/001_basic.pl
@@ -0,0 +1,207 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+#########################################
+# Basic checks
+
+program_help_ok('pg_dump');
+program_version_ok('pg_dump');
+program_options_handling_ok('pg_dump');
+
+program_help_ok('pg_restore');
+program_version_ok('pg_restore');
+program_options_handling_ok('pg_restore');
+
+program_help_ok('pg_dumpall');
+program_version_ok('pg_dumpall');
+program_options_handling_ok('pg_dumpall');
+
+#########################################
+# Test various invalid options and disallowed combinations
+# Doesn't require a PG instance to be set up, so do this first.
+
+command_fails_like(
+ [ 'pg_dump', 'qqq', 'abc' ],
+ qr/\Qpg_dump: error: too many command-line arguments (first is "abc")\E/,
+ 'pg_dump: too many command-line arguments');
+
+command_fails_like(
+ [ 'pg_restore', 'qqq', 'abc' ],
+ qr/\Qpg_restore: error: too many command-line arguments (first is "abc")\E/,
+ 'pg_restore: too many command-line arguments');
+
+command_fails_like(
+ [ 'pg_dumpall', 'qqq', 'abc' ],
+ qr/\Qpg_dumpall: error: too many command-line arguments (first is "qqq")\E/,
+ 'pg_dumpall: too many command-line arguments');
+
+command_fails_like(
+ [ 'pg_dump', '-s', '-a' ],
+ qr/\Qpg_dump: error: options -s\/--schema-only and -a\/--data-only cannot be used together\E/,
+ 'pg_dump: options -s/--schema-only and -a/--data-only cannot be used together'
+);
+
+command_fails_like(
+ [ 'pg_dump', '-s', '--include-foreign-data=xxx' ],
+ qr/\Qpg_dump: error: options -s\/--schema-only and --include-foreign-data cannot be used together\E/,
+ 'pg_dump: options -s/--schema-only and --include-foreign-data cannot be used together'
+);
+
+command_fails_like(
+ [ 'pg_dump', '-j2', '--include-foreign-data=xxx' ],
+ qr/\Qpg_dump: error: option --include-foreign-data is not supported with parallel backup\E/,
+ 'pg_dump: option --include-foreign-data is not supported with parallel backup'
+);
+
+command_fails_like(
+ ['pg_restore'],
+ qr{\Qpg_restore: error: one of -d/--dbname and -f/--file must be specified\E},
+ 'pg_restore: error: one of -d/--dbname and -f/--file must be specified');
+
+command_fails_like(
+ [ 'pg_restore', '-s', '-a', '-f -' ],
+ qr/\Qpg_restore: error: options -s\/--schema-only and -a\/--data-only cannot be used together\E/,
+ 'pg_restore: options -s/--schema-only and -a/--data-only cannot be used together'
+);
+
+command_fails_like(
+ [ 'pg_restore', '-d', 'xxx', '-f', 'xxx' ],
+ qr/\Qpg_restore: error: options -d\/--dbname and -f\/--file cannot be used together\E/,
+ 'pg_restore: options -d/--dbname and -f/--file cannot be used together');
+
+command_fails_like(
+ [ 'pg_dump', '-c', '-a' ],
+ qr/\Qpg_dump: error: options -c\/--clean and -a\/--data-only cannot be used together\E/,
+ 'pg_dump: options -c/--clean and -a/--data-only cannot be used together');
+
+command_fails_like(
+ [ 'pg_restore', '-c', '-a', '-f -' ],
+ qr/\Qpg_restore: error: options -c\/--clean and -a\/--data-only cannot be used together\E/,
+ 'pg_restore: options -c/--clean and -a/--data-only cannot be used together'
+);
+
+command_fails_like(
+ [ 'pg_dump', '--if-exists' ],
+ qr/\Qpg_dump: error: option --if-exists requires option -c\/--clean\E/,
+ 'pg_dump: option --if-exists requires option -c/--clean');
+
+command_fails_like(
+ [ 'pg_dump', '-j3' ],
+ qr/\Qpg_dump: error: parallel backup only supported by the directory format\E/,
+ 'pg_dump: parallel backup only supported by the directory format');
+
+# Note the trailing whitespace for the value of --jobs, that is valid.
+command_fails_like(
+ [ 'pg_dump', '-j', '-1 ' ],
+ qr/\Qpg_dump: error: -j\/--jobs must be in range\E/,
+ 'pg_dump: -j/--jobs must be in range');
+
+command_fails_like(
+ [ 'pg_dump', '-F', 'garbage' ],
+ qr/\Qpg_dump: error: invalid output format\E/,
+ 'pg_dump: invalid output format');
+
+command_fails_like(
+ [ 'pg_restore', '-j', '-1', '-f -' ],
+ qr/\Qpg_restore: error: -j\/--jobs must be in range\E/,
+ 'pg_restore: -j/--jobs must be in range');
+
+command_fails_like(
+ [ 'pg_restore', '--single-transaction', '-j3', '-f -' ],
+ qr/\Qpg_restore: error: cannot specify both --single-transaction and multiple jobs\E/,
+ 'pg_restore: cannot specify both --single-transaction and multiple jobs');
+
+command_fails_like(
+ [ 'pg_dump', '-Z', '-1' ],
+ qr/\Qpg_dump: error: -Z\/--compress must be in range 0..9\E/,
+ 'pg_dump: -Z/--compress must be in range');
+
+if (check_pg_config("#define HAVE_LIBZ 1"))
+{
+ command_fails_like(
+ [ 'pg_dump', '--compress', '1', '--format', 'tar' ],
+ qr/\Qpg_dump: error: compression is not supported by tar archive format\E/,
+ 'pg_dump: compression is not supported by tar archive format');
+}
+else
+{
+ # --jobs > 1 forces an error with tar format.
+ command_fails_like(
+ [ 'pg_dump', '--compress', '1', '--format', 'tar', '-j3' ],
+ qr/\Qpg_dump: warning: requested compression not available in this installation -- archive will be uncompressed\E/,
+ 'pg_dump: warning: compression not available in this installation');
+}
+
+command_fails_like(
+ [ 'pg_dump', '--extra-float-digits', '-16' ],
+ qr/\Qpg_dump: error: --extra-float-digits must be in range\E/,
+ 'pg_dump: --extra-float-digits must be in range');
+
+command_fails_like(
+ [ 'pg_dump', '--rows-per-insert', '0' ],
+ qr/\Qpg_dump: error: --rows-per-insert must be in range\E/,
+ 'pg_dump: --rows-per-insert must be in range');
+
+command_fails_like(
+ [ 'pg_restore', '--if-exists', '-f -' ],
+ qr/\Qpg_restore: error: option --if-exists requires option -c\/--clean\E/,
+ 'pg_restore: option --if-exists requires option -c/--clean');
+
+command_fails_like(
+ [ 'pg_restore', '-f -', '-F', 'garbage' ],
+ qr/\Qpg_restore: error: unrecognized archive format "garbage";\E/,
+ 'pg_dump: unrecognized archive format');
+
+command_fails_like(
+ [ 'pg_dump', '--on-conflict-do-nothing' ],
+ qr/pg_dump: error: option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts/,
+ 'pg_dump: --on-conflict-do-nothing requires --inserts, --rows-per-insert, --column-inserts'
+);
+
+# pg_dumpall command-line argument checks
+command_fails_like(
+ [ 'pg_dumpall', '-g', '-r' ],
+ qr/\Qpg_dumpall: error: options -g\/--globals-only and -r\/--roles-only cannot be used together\E/,
+ 'pg_dumpall: options -g/--globals-only and -r/--roles-only cannot be used together'
+);
+
+command_fails_like(
+ [ 'pg_dumpall', '-g', '-t' ],
+ qr/\Qpg_dumpall: error: options -g\/--globals-only and -t\/--tablespaces-only cannot be used together\E/,
+ 'pg_dumpall: options -g/--globals-only and -t/--tablespaces-only cannot be used together'
+);
+
+command_fails_like(
+ [ 'pg_dumpall', '-r', '-t' ],
+ qr/\Qpg_dumpall: error: options -r\/--roles-only and -t\/--tablespaces-only cannot be used together\E/,
+ 'pg_dumpall: options -r/--roles-only and -t/--tablespaces-only cannot be used together'
+);
+
+command_fails_like(
+ [ 'pg_dumpall', '--if-exists' ],
+ qr/\Qpg_dumpall: error: option --if-exists requires option -c\/--clean\E/,
+ 'pg_dumpall: option --if-exists requires option -c/--clean');
+
+command_fails_like(
+ [ 'pg_restore', '-C', '-1', '-f -' ],
+ qr/\Qpg_restore: error: options -C\/--create and -1\/--single-transaction cannot be used together\E/,
+ 'pg_restore: options -C\/--create and -1\/--single-transaction cannot be used together'
+);
+
+# also fails for -r and -t, but it seems pointless to add more tests for those.
+command_fails_like(
+ [ 'pg_dumpall', '--exclude-database=foo', '--globals-only' ],
+ qr/\Qpg_dumpall: error: option --exclude-database cannot be used together with -g\/--globals-only\E/,
+ 'pg_dumpall: option --exclude-database cannot be used together with -g/--globals-only'
+);
+
+done_testing();
diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl
new file mode 100644
index 0000000..6006276
--- /dev/null
+++ b/src/bin/pg_dump/t/002_pg_dump.pl
@@ -0,0 +1,4280 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+###############################################################
+# Definition of the pg_dump runs to make.
+#
+# Each of these runs are named and those names are used below
+# to define how each test should (or shouldn't) treat a result
+# from a given run.
+#
+# test_key indicates that a given run should simply use the same
+# set of like/unlike tests as another run, and which run that is.
+#
+# compile_option indicates if the commands run depend on a compilation
+# option, if any. This can be used to control if tests should be
+# skipped when a build dependency is not satisfied.
+#
+# dump_cmd is the pg_dump command to run, which is an array of
+# the full command and arguments to run. Note that this is run
+# using $node->command_ok(), so the port does not need to be
+# specified and is pulled from $PGPORT, which is set by the
+# PostgreSQL::Test::Cluster system.
+#
+# compress_cmd is the utility command for (de)compression, if any.
+# Note that this should generally be used on pg_dump's output
+# either to generate a text file to run the through the tests, or
+# to test pg_restore's ability to parse manually compressed files
+# that otherwise pg_dump does not compress on its own (e.g. *.toc).
+#
+# restore_cmd is the pg_restore command to run, if any. Note
+# that this should generally be used when the pg_dump goes to
+# a non-text file and that the restore can then be used to
+# generate a text file to run through the tests from the
+# non-text file generated by pg_dump.
+#
+# TODO: Have pg_restore actually restore to an independent
+# database and then pg_dump *that* database (or something along
+# those lines) to validate that part of the process.
+
+my %pgdump_runs = (
+ binary_upgrade => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ '--format=custom',
+ "--file=$tempdir/binary_upgrade.dump",
+ '-w',
+ '--schema-only',
+ '--binary-upgrade',
+ '-d', 'postgres', # alternative way to specify database
+ ],
+ restore_cmd => [
+ 'pg_restore', '-Fc', '--verbose',
+ "--file=$tempdir/binary_upgrade.sql",
+ "$tempdir/binary_upgrade.dump",
+ ],
+ },
+
+ # Do not use --no-sync to give test coverage for data sync.
+ compression_gzip_custom => {
+ test_key => 'compression',
+ compile_option => 'gzip',
+ dump_cmd => [
+ 'pg_dump', '--format=custom',
+ '--compress=1', "--file=$tempdir/compression_gzip_custom.dump",
+ 'postgres',
+ ],
+ restore_cmd => [
+ 'pg_restore',
+ "--file=$tempdir/compression_gzip_custom.sql",
+ "$tempdir/compression_gzip_custom.dump",
+ ],
+ },
+
+ # Do not use --no-sync to give test coverage for data sync.
+ compression_gzip_dir => {
+ test_key => 'compression',
+ compile_option => 'gzip',
+ dump_cmd => [
+ 'pg_dump', '--jobs=2',
+ '--format=directory', '--compress=1',
+ "--file=$tempdir/compression_gzip_dir", 'postgres',
+ ],
+ # Give coverage for manually compressed blob.toc files during
+ # restore.
+ compress_cmd => {
+ program => $ENV{'GZIP_PROGRAM'},
+ args => [ '-f', "$tempdir/compression_gzip_dir/blobs.toc", ],
+ },
+ restore_cmd => [
+ 'pg_restore', '--jobs=2',
+ "--file=$tempdir/compression_gzip_dir.sql",
+ "$tempdir/compression_gzip_dir",
+ ],
+ },
+
+ compression_gzip_plain => {
+ test_key => 'compression',
+ compile_option => 'gzip',
+ dump_cmd => [
+ 'pg_dump', '--format=plain', '-Z1',
+ "--file=$tempdir/compression_gzip_plain.sql.gz", 'postgres',
+ ],
+ # Decompress the generated file to run through the tests.
+ compress_cmd => {
+ program => $ENV{'GZIP_PROGRAM'},
+ args => [ '-d', "$tempdir/compression_gzip_plain.sql.gz", ],
+ },
+ },
+ clean => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/clean.sql",
+ '-c',
+ '-d', 'postgres', # alternative way to specify database
+ ],
+ },
+ clean_if_exists => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/clean_if_exists.sql",
+ '-c',
+ '--if-exists',
+ '--encoding=UTF8', # no-op, just tests that option is accepted
+ 'postgres',
+ ],
+ },
+ column_inserts => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/column_inserts.sql", '-a',
+ '--column-inserts', 'postgres',
+ ],
+ },
+ createdb => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/createdb.sql",
+ '-C',
+ '-R', # no-op, just for testing
+ '-v',
+ 'postgres',
+ ],
+ },
+ data_only => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/data_only.sql",
+ '-a',
+ '--superuser=test_superuser',
+ '--disable-triggers',
+ '-v', # no-op, just make sure it works
+ 'postgres',
+ ],
+ },
+ defaults => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ '-f', "$tempdir/defaults.sql",
+ 'postgres',
+ ],
+ },
+ defaults_no_public => {
+ database => 'regress_pg_dump_test',
+ dump_cmd => [
+ 'pg_dump', '--no-sync', '-f', "$tempdir/defaults_no_public.sql",
+ 'regress_pg_dump_test',
+ ],
+ },
+ defaults_no_public_clean => {
+ database => 'regress_pg_dump_test',
+ dump_cmd => [
+ 'pg_dump', '--no-sync', '-c', '-f',
+ "$tempdir/defaults_no_public_clean.sql",
+ 'regress_pg_dump_test',
+ ],
+ },
+ defaults_public_owner => {
+ database => 'regress_public_owner',
+ dump_cmd => [
+ 'pg_dump', '--no-sync', '-f',
+ "$tempdir/defaults_public_owner.sql",
+ 'regress_public_owner',
+ ],
+ },
+
+ # Do not use --no-sync to give test coverage for data sync.
+ defaults_custom_format => {
+ test_key => 'defaults',
+ dump_cmd => [
+ 'pg_dump', '-Fc', '-Z6',
+ "--file=$tempdir/defaults_custom_format.dump", 'postgres',
+ ],
+ restore_cmd => [
+ 'pg_restore', '-Fc',
+ "--file=$tempdir/defaults_custom_format.sql",
+ "$tempdir/defaults_custom_format.dump",
+ ],
+ },
+
+ # Do not use --no-sync to give test coverage for data sync.
+ defaults_dir_format => {
+ test_key => 'defaults',
+ dump_cmd => [
+ 'pg_dump', '-Fd',
+ "--file=$tempdir/defaults_dir_format", 'postgres',
+ ],
+ restore_cmd => [
+ 'pg_restore', '-Fd',
+ "--file=$tempdir/defaults_dir_format.sql",
+ "$tempdir/defaults_dir_format",
+ ],
+ },
+
+ # Do not use --no-sync to give test coverage for data sync.
+ defaults_parallel => {
+ test_key => 'defaults',
+ dump_cmd => [
+ 'pg_dump', '-Fd', '-j2', "--file=$tempdir/defaults_parallel",
+ 'postgres',
+ ],
+ restore_cmd => [
+ 'pg_restore',
+ "--file=$tempdir/defaults_parallel.sql",
+ "$tempdir/defaults_parallel",
+ ],
+ },
+
+ # Do not use --no-sync to give test coverage for data sync.
+ defaults_tar_format => {
+ test_key => 'defaults',
+ dump_cmd => [
+ 'pg_dump', '-Ft',
+ "--file=$tempdir/defaults_tar_format.tar", 'postgres',
+ ],
+ restore_cmd => [
+ 'pg_restore',
+ '--format=tar',
+ "--file=$tempdir/defaults_tar_format.sql",
+ "$tempdir/defaults_tar_format.tar",
+ ],
+ },
+ exclude_dump_test_schema => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/exclude_dump_test_schema.sql",
+ '--exclude-schema=dump_test', 'postgres',
+ ],
+ },
+ exclude_test_table => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/exclude_test_table.sql",
+ '--exclude-table=dump_test.test_table', 'postgres',
+ ],
+ },
+ exclude_test_table_data => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/exclude_test_table_data.sql",
+ '--exclude-table-data=dump_test.test_table',
+ '--no-unlogged-table-data',
+ 'postgres',
+ ],
+ },
+ inserts => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/inserts.sql", '-a',
+ '--inserts', 'postgres',
+ ],
+ },
+ pg_dumpall_globals => {
+ dump_cmd => [
+ 'pg_dumpall', '-v', "--file=$tempdir/pg_dumpall_globals.sql",
+ '-g', '--no-sync',
+ ],
+ },
+ pg_dumpall_globals_clean => {
+ dump_cmd => [
+ 'pg_dumpall', "--file=$tempdir/pg_dumpall_globals_clean.sql",
+ '-g', '-c', '--no-sync',
+ ],
+ },
+ pg_dumpall_dbprivs => {
+ dump_cmd => [
+ 'pg_dumpall', '--no-sync',
+ "--file=$tempdir/pg_dumpall_dbprivs.sql",
+ ],
+ },
+ pg_dumpall_exclude => {
+ dump_cmd => [
+ 'pg_dumpall', '-v', "--file=$tempdir/pg_dumpall_exclude.sql",
+ '--exclude-database', '*dump_test*', '--no-sync',
+ ],
+ },
+ no_toast_compression => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/no_toast_compression.sql",
+ '--no-toast-compression', 'postgres',
+ ],
+ },
+ no_blobs => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/no_blobs.sql", '-B',
+ 'postgres',
+ ],
+ },
+ no_privs => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/no_privs.sql", '-x',
+ 'postgres',
+ ],
+ },
+ no_owner => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/no_owner.sql", '-O',
+ 'postgres',
+ ],
+ },
+ no_table_access_method => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/no_table_access_method.sql",
+ '--no-table-access-method', 'postgres',
+ ],
+ },
+ only_dump_test_schema => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/only_dump_test_schema.sql",
+ '--schema=dump_test', 'postgres',
+ ],
+ },
+ only_dump_test_table => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/only_dump_test_table.sql",
+ '--table=dump_test.test_table',
+ '--lock-wait-timeout='
+ . (1000 * $PostgreSQL::Test::Utils::timeout_default),
+ 'postgres',
+ ],
+ },
+ role => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/role.sql",
+ '--role=regress_dump_test_role',
+ '--schema=dump_test_second_schema',
+ 'postgres',
+ ],
+ },
+ role_parallel => {
+ test_key => 'role',
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ '--format=directory',
+ '--jobs=2',
+ "--file=$tempdir/role_parallel",
+ '--role=regress_dump_test_role',
+ '--schema=dump_test_second_schema',
+ 'postgres',
+ ],
+ restore_cmd => [
+ 'pg_restore', "--file=$tempdir/role_parallel.sql",
+ "$tempdir/role_parallel",
+ ],
+ },
+ rows_per_insert => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/rows_per_insert.sql",
+ '-a',
+ '--rows-per-insert=4',
+ '--table=dump_test.test_table',
+ '--table=dump_test.test_fourth_table',
+ 'postgres',
+ ],
+ },
+ schema_only => {
+ dump_cmd => [
+ 'pg_dump', '--format=plain',
+ "--file=$tempdir/schema_only.sql", '--no-sync',
+ '-s', 'postgres',
+ ],
+ },
+ section_pre_data => {
+ dump_cmd => [
+ 'pg_dump', "--file=$tempdir/section_pre_data.sql",
+ '--section=pre-data', '--no-sync',
+ 'postgres',
+ ],
+ },
+ section_data => {
+ dump_cmd => [
+ 'pg_dump', "--file=$tempdir/section_data.sql",
+ '--section=data', '--no-sync',
+ 'postgres',
+ ],
+ },
+ section_post_data => {
+ dump_cmd => [
+ 'pg_dump', "--file=$tempdir/section_post_data.sql",
+ '--section=post-data', '--no-sync', 'postgres',
+ ],
+ },
+ test_schema_plus_blobs => {
+ dump_cmd => [
+ 'pg_dump', "--file=$tempdir/test_schema_plus_blobs.sql",
+
+ '--schema=dump_test', '-b', '-B', '--no-sync', 'postgres',
+ ],
+ },);
+
+###############################################################
+# Definition of the tests to run.
+#
+# Each test is defined using the log message that will be used.
+#
+# A regexp should be defined for each test which provides the
+# basis for the test. That regexp will be run against the output
+# file of each of the runs which the test is to be run against
+# and the success of the result will depend on if the regexp
+# result matches the expected 'like' or 'unlike' case.
+#
+# The runs listed as 'like' will be checked if they match the
+# regexp and, if so, the test passes. All runs which are not
+# listed as 'like' will be checked to ensure they don't match
+# the regexp; if they do, the test will fail.
+#
+# The below hashes provide convenience sets of runs. Individual
+# runs can be excluded from a general hash by placing that run
+# into the 'unlike' section.
+#
+# For example, there is an 'exclude_test_table' run which runs a
+# full pg_dump but with an exclude flag to not include the test
+# table. The CREATE TABLE test which creates the test table is
+# defined with %full_runs but then has 'exclude_test_table' in
+# its 'unlike' list, excluding that test.
+#
+# There can then be a 'create_sql' and 'create_order' for a
+# given test. The 'create_sql' commands are collected up in
+# 'create_order' and then run against the database prior to any
+# of the pg_dump runs happening. This is what "seeds" the
+# system with objects to be dumped out.
+#
+# There can be a flag called 'lz4', which can be set if the test
+# case depends on LZ4. Tests marked with this flag are skipped if
+# the build used does not support LZ4.
+#
+# Building of this hash takes a bit of time as all of the regexps
+# included in it are compiled. This greatly improves performance
+# as the regexps are used for each run the test applies to.
+
+# Tests which target the 'dump_test' schema, specifically.
+my %dump_test_schema_runs = (
+ only_dump_test_schema => 1,
+ test_schema_plus_blobs => 1,);
+
+# Tests which are considered 'full' dumps by pg_dump, but there
+# are flags used to exclude specific items (ACLs, blobs, etc).
+my %full_runs = (
+ binary_upgrade => 1,
+ clean => 1,
+ clean_if_exists => 1,
+ compression => 1,
+ createdb => 1,
+ defaults => 1,
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ exclude_test_table_data => 1,
+ no_toast_compression => 1,
+ no_blobs => 1,
+ no_owner => 1,
+ no_privs => 1,
+ no_table_access_method => 1,
+ pg_dumpall_dbprivs => 1,
+ pg_dumpall_exclude => 1,
+ schema_only => 1,);
+
+# This is where the actual tests are defined.
+my %tests = (
+ 'ALTER DEFAULT PRIVILEGES FOR ROLE regress_dump_test_role GRANT' => {
+ create_order => 14,
+ create_sql => 'ALTER DEFAULT PRIVILEGES
+ FOR ROLE regress_dump_test_role IN SCHEMA dump_test
+ GRANT SELECT ON TABLES TO regress_dump_test_role;',
+ regexp => qr/^
+ \QALTER DEFAULT PRIVILEGES \E
+ \QFOR ROLE regress_dump_test_role IN SCHEMA dump_test \E
+ \QGRANT SELECT ON TABLES TO regress_dump_test_role;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_privs => 1,
+ },
+ },
+
+ 'ALTER DEFAULT PRIVILEGES FOR ROLE regress_dump_test_role GRANT EXECUTE ON FUNCTIONS'
+ => {
+ create_order => 15,
+ create_sql => 'ALTER DEFAULT PRIVILEGES
+ FOR ROLE regress_dump_test_role IN SCHEMA dump_test
+ GRANT EXECUTE ON FUNCTIONS TO regress_dump_test_role;',
+ regexp => qr/^
+ \QALTER DEFAULT PRIVILEGES \E
+ \QFOR ROLE regress_dump_test_role IN SCHEMA dump_test \E
+ \QGRANT ALL ON FUNCTIONS TO regress_dump_test_role;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_privs => 1,
+ },
+ },
+
+ 'ALTER DEFAULT PRIVILEGES FOR ROLE regress_dump_test_role REVOKE' => {
+ create_order => 55,
+ create_sql => 'ALTER DEFAULT PRIVILEGES
+ FOR ROLE regress_dump_test_role
+ REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;',
+ regexp => qr/^
+ \QALTER DEFAULT PRIVILEGES \E
+ \QFOR ROLE regress_dump_test_role \E
+ \QREVOKE ALL ON FUNCTIONS FROM PUBLIC;\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ 'ALTER DEFAULT PRIVILEGES FOR ROLE regress_dump_test_role REVOKE SELECT'
+ => {
+ create_order => 56,
+ create_sql => 'ALTER DEFAULT PRIVILEGES
+ FOR ROLE regress_dump_test_role
+ REVOKE SELECT ON TABLES FROM regress_dump_test_role;',
+ regexp => qr/^
+ \QALTER DEFAULT PRIVILEGES \E
+ \QFOR ROLE regress_dump_test_role \E
+ \QREVOKE ALL ON TABLES FROM regress_dump_test_role;\E\n
+ \QALTER DEFAULT PRIVILEGES \E
+ \QFOR ROLE regress_dump_test_role \E
+ \QGRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLES TO regress_dump_test_role;\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ 'ALTER ROLE regress_dump_test_role' => {
+ regexp => qr/^
+ \QALTER ROLE regress_dump_test_role WITH \E
+ \QNOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB NOLOGIN \E
+ \QNOREPLICATION NOBYPASSRLS;\E
+ /xm,
+ like => {
+ pg_dumpall_dbprivs => 1,
+ pg_dumpall_globals => 1,
+ pg_dumpall_globals_clean => 1,
+ pg_dumpall_exclude => 1,
+ },
+ },
+
+ 'ALTER COLLATION test0 OWNER TO' => {
+ regexp => qr/^\QALTER COLLATION public.test0 OWNER TO \E.+;/m,
+ collation => 1,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { %dump_test_schema_runs, no_owner => 1, },
+ },
+
+ 'ALTER FOREIGN DATA WRAPPER dummy OWNER TO' => {
+ regexp => qr/^ALTER FOREIGN DATA WRAPPER dummy OWNER TO .+;/m,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_owner => 1, },
+ },
+
+ 'ALTER SERVER s1 OWNER TO' => {
+ regexp => qr/^ALTER SERVER s1 OWNER TO .+;/m,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_owner => 1, },
+ },
+
+ 'ALTER FUNCTION dump_test.pltestlang_call_handler() OWNER TO' => {
+ regexp => qr/^
+ \QALTER FUNCTION dump_test.pltestlang_call_handler() \E
+ \QOWNER TO \E
+ .+;/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_owner => 1,
+ },
+ },
+
+ 'ALTER OPERATOR FAMILY dump_test.op_family OWNER TO' => {
+ regexp => qr/^
+ \QALTER OPERATOR FAMILY dump_test.op_family USING btree \E
+ \QOWNER TO \E
+ .+;/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_owner => 1,
+ },
+ },
+
+ 'ALTER OPERATOR FAMILY dump_test.op_family USING btree' => {
+ create_order => 75,
+ create_sql =>
+ 'ALTER OPERATOR FAMILY dump_test.op_family USING btree ADD
+ OPERATOR 1 <(bigint,int4),
+ OPERATOR 2 <=(bigint,int4),
+ OPERATOR 3 =(bigint,int4),
+ OPERATOR 4 >=(bigint,int4),
+ OPERATOR 5 >(bigint,int4),
+ FUNCTION 1 (int4, int4) btint4cmp(int4,int4),
+ FUNCTION 2 (int4, int4) btint4sortsupport(internal),
+ FUNCTION 4 (int4, int4) btequalimage(oid);',
+ # note: it's correct that btint8sortsupport and bigint btequalimage
+ # are included here:
+ regexp => qr/^
+ \QALTER OPERATOR FAMILY dump_test.op_family USING btree ADD\E\n\s+
+ \QOPERATOR 1 <(bigint,integer) ,\E\n\s+
+ \QOPERATOR 2 <=(bigint,integer) ,\E\n\s+
+ \QOPERATOR 3 =(bigint,integer) ,\E\n\s+
+ \QOPERATOR 4 >=(bigint,integer) ,\E\n\s+
+ \QOPERATOR 5 >(bigint,integer) ,\E\n\s+
+ \QFUNCTION 1 (integer, integer) btint4cmp(integer,integer) ,\E\n\s+
+ \QFUNCTION 2 (bigint, bigint) btint8sortsupport(internal) ,\E\n\s+
+ \QFUNCTION 2 (integer, integer) btint4sortsupport(internal) ,\E\n\s+
+ \QFUNCTION 4 (bigint, bigint) btequalimage(oid) ,\E\n\s+
+ \QFUNCTION 4 (integer, integer) btequalimage(oid);\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'ALTER OPERATOR CLASS dump_test.op_class OWNER TO' => {
+ regexp => qr/^
+ \QALTER OPERATOR CLASS dump_test.op_class USING btree \E
+ \QOWNER TO \E
+ .+;/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_owner => 1,
+ },
+ },
+
+ 'ALTER PUBLICATION pub1 OWNER TO' => {
+ regexp => qr/^ALTER PUBLICATION pub1 OWNER TO .+;/m,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => { no_owner => 1, },
+ },
+
+ 'ALTER LARGE OBJECT ... OWNER TO' => {
+ regexp => qr/^ALTER LARGE OBJECT \d+ OWNER TO .+;/m,
+ like => {
+ %full_runs,
+ column_inserts => 1,
+ data_only => 1,
+ inserts => 1,
+ section_pre_data => 1,
+ test_schema_plus_blobs => 1,
+ },
+ unlike => {
+ no_blobs => 1,
+ no_owner => 1,
+ schema_only => 1,
+ },
+ },
+
+ 'ALTER PROCEDURAL LANGUAGE pltestlang OWNER TO' => {
+ regexp => qr/^ALTER PROCEDURAL LANGUAGE pltestlang OWNER TO .+;/m,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_owner => 1, },
+ },
+
+ 'ALTER SCHEMA dump_test OWNER TO' => {
+ regexp => qr/^ALTER SCHEMA dump_test OWNER TO .+;/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_owner => 1,
+ },
+ },
+
+ 'ALTER SCHEMA dump_test_second_schema OWNER TO' => {
+ regexp => qr/^ALTER SCHEMA dump_test_second_schema OWNER TO .+;/m,
+ like => {
+ %full_runs,
+ role => 1,
+ section_pre_data => 1,
+ },
+ unlike => { no_owner => 1, },
+ },
+
+ 'ALTER SCHEMA public OWNER TO' => {
+ create_order => 15,
+ create_sql =>
+ 'ALTER SCHEMA public OWNER TO "regress_quoted \"" role";',
+ regexp => qr/^ALTER SCHEMA public OWNER TO .+;/m,
+ like => {
+ %full_runs, section_pre_data => 1,
+ },
+ unlike => { no_owner => 1, },
+ },
+
+ 'ALTER SCHEMA public OWNER TO (w/o ACL changes)' => {
+ database => 'regress_public_owner',
+ create_order => 100,
+ create_sql =>
+ 'ALTER SCHEMA public OWNER TO "regress_quoted \"" role";',
+ regexp => qr/^(GRANT|REVOKE)/m,
+ unlike => { defaults_public_owner => 1 },
+ },
+
+ 'ALTER SEQUENCE test_table_col1_seq' => {
+ regexp => qr/^
+ \QALTER SEQUENCE dump_test.test_table_col1_seq OWNED BY dump_test.test_table.col1;\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'ALTER TABLE ONLY test_table ADD CONSTRAINT ... PRIMARY KEY' => {
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.test_table\E \n^\s+
+ \QADD CONSTRAINT test_table_pkey PRIMARY KEY (col1);\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'ALTER TABLE (partitioned) ADD CONSTRAINT ... FOREIGN KEY' => {
+ create_order => 4,
+ create_sql => 'CREATE TABLE dump_test.test_table_fk (
+ col1 int references dump_test.test_table)
+ PARTITION BY RANGE (col1);
+ CREATE TABLE dump_test.test_table_fk_1
+ PARTITION OF dump_test.test_table_fk
+ FOR VALUES FROM (0) TO (10);',
+ regexp => qr/
+ \QADD CONSTRAINT test_table_fk_col1_fkey FOREIGN KEY (col1) REFERENCES dump_test.test_table\E
+ /xm,
+ like => {
+ %full_runs, %dump_test_schema_runs, section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ },
+ },
+
+ 'ALTER TABLE ONLY test_table ALTER COLUMN col1 SET STATISTICS 90' => {
+ create_order => 93,
+ create_sql =>
+ 'ALTER TABLE dump_test.test_table ALTER COLUMN col1 SET STATISTICS 90;',
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.test_table ALTER COLUMN col1 SET STATISTICS 90;\E\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'ALTER TABLE ONLY test_table ALTER COLUMN col2 SET STORAGE' => {
+ create_order => 94,
+ create_sql =>
+ 'ALTER TABLE dump_test.test_table ALTER COLUMN col2 SET STORAGE EXTERNAL;',
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.test_table ALTER COLUMN col2 SET STORAGE EXTERNAL;\E\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'ALTER TABLE ONLY test_table ALTER COLUMN col3 SET STORAGE' => {
+ create_order => 95,
+ create_sql =>
+ 'ALTER TABLE dump_test.test_table ALTER COLUMN col3 SET STORAGE MAIN;',
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.test_table ALTER COLUMN col3 SET STORAGE MAIN;\E\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'ALTER TABLE ONLY test_table ALTER COLUMN col4 SET n_distinct' => {
+ create_order => 95,
+ create_sql =>
+ 'ALTER TABLE dump_test.test_table ALTER COLUMN col4 SET (n_distinct = 10);',
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.test_table ALTER COLUMN col4 SET (n_distinct=10);\E\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'ALTER TABLE ONLY dump_test.measurement ATTACH PARTITION measurement_y2006m2'
+ => {
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.measurement ATTACH PARTITION dump_test_second_schema.measurement_y2006m2 \E
+ \QFOR VALUES FROM ('2006-02-01') TO ('2006-03-01');\E\n
+ /xm,
+ like => {
+ %full_runs,
+ role => 1,
+ section_pre_data => 1,
+ binary_upgrade => 1,
+ },
+ },
+
+ 'ALTER TABLE test_table CLUSTER ON test_table_pkey' => {
+ create_order => 96,
+ create_sql =>
+ 'ALTER TABLE dump_test.test_table CLUSTER ON test_table_pkey',
+ regexp => qr/^
+ \QALTER TABLE dump_test.test_table CLUSTER ON test_table_pkey;\E\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'ALTER TABLE test_table DISABLE TRIGGER ALL' => {
+ regexp => qr/^
+ \QSET SESSION AUTHORIZATION 'test_superuser';\E\n\n
+ \QALTER TABLE dump_test.test_table DISABLE TRIGGER ALL;\E\n\n
+ \QCOPY dump_test.test_table (col1, col2, col3, col4) FROM stdin;\E
+ \n(?:\d\t\\N\t\\N\t\\N\n){9}\\\.\n\n\n
+ \QALTER TABLE dump_test.test_table ENABLE TRIGGER ALL;\E/xm,
+ like => { data_only => 1, },
+ },
+
+ 'ALTER FOREIGN TABLE foreign_table ALTER COLUMN c1 OPTIONS' => {
+ regexp => qr/^
+ \QALTER FOREIGN TABLE dump_test.foreign_table ALTER COLUMN c1 OPTIONS (\E\n
+ \s+\Qcolumn_name 'col1'\E\n
+ \Q);\E\n
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'ALTER TABLE test_table OWNER TO' => {
+ regexp => qr/^\QALTER TABLE dump_test.test_table OWNER TO \E.+;/m,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ no_owner => 1,
+ },
+ },
+
+ 'ALTER TABLE test_table ENABLE ROW LEVEL SECURITY' => {
+ create_order => 23,
+ create_sql => 'ALTER TABLE dump_test.test_table
+ ENABLE ROW LEVEL SECURITY;',
+ regexp =>
+ qr/^\QALTER TABLE dump_test.test_table ENABLE ROW LEVEL SECURITY;\E/m,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'ALTER TABLE test_second_table OWNER TO' => {
+ regexp =>
+ qr/^\QALTER TABLE dump_test.test_second_table OWNER TO \E.+;/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_owner => 1,
+ },
+ },
+
+ 'ALTER TABLE measurement OWNER TO' => {
+ regexp => qr/^\QALTER TABLE dump_test.measurement OWNER TO \E.+;/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_owner => 1,
+ },
+ },
+
+ 'ALTER TABLE measurement_y2006m2 OWNER TO' => {
+ regexp =>
+ qr/^\QALTER TABLE dump_test_second_schema.measurement_y2006m2 OWNER TO \E.+;/m,
+ like => {
+ %full_runs,
+ role => 1,
+ section_pre_data => 1,
+ },
+ unlike => { no_owner => 1, },
+ },
+
+ 'ALTER FOREIGN TABLE foreign_table OWNER TO' => {
+ regexp =>
+ qr/^\QALTER FOREIGN TABLE dump_test.foreign_table OWNER TO \E.+;/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_owner => 1,
+ },
+ },
+
+ 'ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 OWNER TO' => {
+ regexp =>
+ qr/^\QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1 OWNER TO \E.+;/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_owner => 1,
+ },
+ },
+
+ 'ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 OWNER TO' => {
+ regexp =>
+ qr/^\QALTER TEXT SEARCH DICTIONARY dump_test.alt_ts_dict1 OWNER TO \E.+;/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_test_table => 1,
+ no_owner => 1,
+ role => 1,
+ },
+ },
+
+ 'BLOB create (using lo_from_bytea)' => {
+ create_order => 50,
+ create_sql =>
+ 'SELECT pg_catalog.lo_from_bytea(0, \'\\x310a320a330a340a350a360a370a380a390a\');',
+ regexp => qr/^SELECT pg_catalog\.lo_create\('\d+'\);/m,
+ like => {
+ %full_runs,
+ column_inserts => 1,
+ data_only => 1,
+ inserts => 1,
+ section_pre_data => 1,
+ test_schema_plus_blobs => 1,
+ },
+ unlike => {
+ schema_only => 1,
+ no_blobs => 1,
+ },
+ },
+
+ 'BLOB load (using lo_from_bytea)' => {
+ regexp => qr/^
+ \QSELECT pg_catalog.lo_open\E \('\d+',\ \d+\);\n
+ \QSELECT pg_catalog.lowrite(0, \E
+ \Q'\x310a320a330a340a350a360a370a380a390a');\E\n
+ \QSELECT pg_catalog.lo_close(0);\E
+ /xm,
+ like => {
+ %full_runs,
+ column_inserts => 1,
+ data_only => 1,
+ inserts => 1,
+ section_data => 1,
+ test_schema_plus_blobs => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ no_blobs => 1,
+ schema_only => 1,
+ },
+ },
+
+ 'COMMENT ON DATABASE postgres' => {
+ regexp => qr/^COMMENT ON DATABASE postgres IS .+;/m,
+
+ # Should appear in the same tests as "CREATE DATABASE postgres"
+ like => { createdb => 1, },
+ },
+
+ 'COMMENT ON EXTENSION plpgsql' => {
+ regexp => qr/^COMMENT ON EXTENSION plpgsql IS .+;/m,
+
+ # this shouldn't ever get emitted anymore
+ like => {},
+ },
+
+ 'COMMENT ON SCHEMA public' => {
+ regexp => qr/^COMMENT ON SCHEMA public IS .+;/m,
+ # regress_public_owner emits this, due to create_sql of next test
+ like => {
+ pg_dumpall_dbprivs => 1,
+ pg_dumpall_exclude => 1,
+ },
+ },
+
+ 'COMMENT ON SCHEMA public IS NULL' => {
+ database => 'regress_public_owner',
+ create_order => 100,
+ create_sql => 'COMMENT ON SCHEMA public IS NULL;',
+ regexp => qr/^COMMENT ON SCHEMA public IS '';/m,
+ like => { defaults_public_owner => 1 },
+ },
+
+ 'COMMENT ON TABLE dump_test.test_table' => {
+ create_order => 36,
+ create_sql => 'COMMENT ON TABLE dump_test.test_table
+ IS \'comment on table\';',
+ regexp =>
+ qr/^\QCOMMENT ON TABLE dump_test.test_table IS 'comment on table';\E/m,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'COMMENT ON COLUMN dump_test.test_table.col1' => {
+ create_order => 36,
+ create_sql => 'COMMENT ON COLUMN dump_test.test_table.col1
+ IS \'comment on column\';',
+ regexp => qr/^
+ \QCOMMENT ON COLUMN dump_test.test_table.col1 IS 'comment on column';\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'COMMENT ON COLUMN dump_test.composite.f1' => {
+ create_order => 44,
+ create_sql => 'COMMENT ON COLUMN dump_test.composite.f1
+ IS \'comment on column of type\';',
+ regexp => qr/^
+ \QCOMMENT ON COLUMN dump_test.composite.f1 IS 'comment on column of type';\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'COMMENT ON COLUMN dump_test.test_second_table.col1' => {
+ create_order => 63,
+ create_sql => 'COMMENT ON COLUMN dump_test.test_second_table.col1
+ IS \'comment on column col1\';',
+ regexp => qr/^
+ \QCOMMENT ON COLUMN dump_test.test_second_table.col1 IS 'comment on column col1';\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'COMMENT ON COLUMN dump_test.test_second_table.col2' => {
+ create_order => 64,
+ create_sql => 'COMMENT ON COLUMN dump_test.test_second_table.col2
+ IS \'comment on column col2\';',
+ regexp => qr/^
+ \QCOMMENT ON COLUMN dump_test.test_second_table.col2 IS 'comment on column col2';\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'COMMENT ON CONVERSION dump_test.test_conversion' => {
+ create_order => 79,
+ create_sql => 'COMMENT ON CONVERSION dump_test.test_conversion
+ IS \'comment on test conversion\';',
+ regexp =>
+ qr/^\QCOMMENT ON CONVERSION dump_test.test_conversion IS 'comment on test conversion';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'COMMENT ON COLLATION test0' => {
+ create_order => 77,
+ create_sql => 'COMMENT ON COLLATION test0
+ IS \'comment on test0 collation\';',
+ regexp =>
+ qr/^\QCOMMENT ON COLLATION public.test0 IS 'comment on test0 collation';\E/m,
+ collation => 1,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'COMMENT ON LARGE OBJECT ...' => {
+ create_order => 65,
+ create_sql => 'DO $$
+ DECLARE myoid oid;
+ BEGIN
+ SELECT loid FROM pg_largeobject INTO myoid;
+ EXECUTE \'COMMENT ON LARGE OBJECT \' || myoid || \' IS \'\'comment on large object\'\';\';
+ END;
+ $$;',
+ regexp => qr/^
+ \QCOMMENT ON LARGE OBJECT \E[0-9]+\Q IS 'comment on large object';\E
+ /xm,
+ like => {
+ %full_runs,
+ column_inserts => 1,
+ data_only => 1,
+ inserts => 1,
+ section_pre_data => 1,
+ test_schema_plus_blobs => 1,
+ },
+ unlike => {
+ no_blobs => 1,
+ schema_only => 1,
+ },
+ },
+
+ 'COMMENT ON PUBLICATION pub1' => {
+ create_order => 55,
+ create_sql => 'COMMENT ON PUBLICATION pub1
+ IS \'comment on publication\';',
+ regexp =>
+ qr/^COMMENT ON PUBLICATION pub1 IS 'comment on publication';/m,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'COMMENT ON SUBSCRIPTION sub1' => {
+ create_order => 55,
+ create_sql => 'COMMENT ON SUBSCRIPTION sub1
+ IS \'comment on subscription\';',
+ regexp =>
+ qr/^COMMENT ON SUBSCRIPTION sub1 IS 'comment on subscription';/m,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'COMMENT ON TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1' => {
+ create_order => 84,
+ create_sql =>
+ 'COMMENT ON TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1
+ IS \'comment on text search configuration\';',
+ regexp =>
+ qr/^\QCOMMENT ON TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1 IS 'comment on text search configuration';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'COMMENT ON TEXT SEARCH DICTIONARY dump_test.alt_ts_dict1' => {
+ create_order => 84,
+ create_sql =>
+ 'COMMENT ON TEXT SEARCH DICTIONARY dump_test.alt_ts_dict1
+ IS \'comment on text search dictionary\';',
+ regexp =>
+ qr/^\QCOMMENT ON TEXT SEARCH DICTIONARY dump_test.alt_ts_dict1 IS 'comment on text search dictionary';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'COMMENT ON TEXT SEARCH PARSER dump_test.alt_ts_prs1' => {
+ create_order => 84,
+ create_sql => 'COMMENT ON TEXT SEARCH PARSER dump_test.alt_ts_prs1
+ IS \'comment on text search parser\';',
+ regexp =>
+ qr/^\QCOMMENT ON TEXT SEARCH PARSER dump_test.alt_ts_prs1 IS 'comment on text search parser';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'COMMENT ON TEXT SEARCH TEMPLATE dump_test.alt_ts_temp1' => {
+ create_order => 84,
+ create_sql => 'COMMENT ON TEXT SEARCH TEMPLATE dump_test.alt_ts_temp1
+ IS \'comment on text search template\';',
+ regexp =>
+ qr/^\QCOMMENT ON TEXT SEARCH TEMPLATE dump_test.alt_ts_temp1 IS 'comment on text search template';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'COMMENT ON TYPE dump_test.planets - ENUM' => {
+ create_order => 68,
+ create_sql => 'COMMENT ON TYPE dump_test.planets
+ IS \'comment on enum type\';',
+ regexp =>
+ qr/^\QCOMMENT ON TYPE dump_test.planets IS 'comment on enum type';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'COMMENT ON TYPE dump_test.textrange - RANGE' => {
+ create_order => 69,
+ create_sql => 'COMMENT ON TYPE dump_test.textrange
+ IS \'comment on range type\';',
+ regexp =>
+ qr/^\QCOMMENT ON TYPE dump_test.textrange IS 'comment on range type';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'COMMENT ON TYPE dump_test.int42 - Regular' => {
+ create_order => 70,
+ create_sql => 'COMMENT ON TYPE dump_test.int42
+ IS \'comment on regular type\';',
+ regexp =>
+ qr/^\QCOMMENT ON TYPE dump_test.int42 IS 'comment on regular type';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'COMMENT ON TYPE dump_test.undefined - Undefined' => {
+ create_order => 71,
+ create_sql => 'COMMENT ON TYPE dump_test.undefined
+ IS \'comment on undefined type\';',
+ regexp =>
+ qr/^\QCOMMENT ON TYPE dump_test.undefined IS 'comment on undefined type';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'COPY test_table' => {
+ create_order => 4,
+ create_sql => 'INSERT INTO dump_test.test_table (col1) '
+ . 'SELECT generate_series FROM generate_series(1,9);',
+ regexp => qr/^
+ \QCOPY dump_test.test_table (col1, col2, col3, col4) FROM stdin;\E
+ \n(?:\d\t\\N\t\\N\t\\N\n){9}\\\.\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ data_only => 1,
+ only_dump_test_table => 1,
+ section_data => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ exclude_test_table_data => 1,
+ schema_only => 1,
+ },
+ },
+
+ 'COPY fk_reference_test_table' => {
+ create_order => 22,
+ create_sql => 'INSERT INTO dump_test.fk_reference_test_table (col1) '
+ . 'SELECT generate_series FROM generate_series(1,5);',
+ regexp => qr/^
+ \QCOPY dump_test.fk_reference_test_table (col1) FROM stdin;\E
+ \n(?:\d\n){5}\\\.\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ data_only => 1,
+ exclude_test_table => 1,
+ exclude_test_table_data => 1,
+ section_data => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ },
+ },
+
+ # In a data-only dump, we try to actually order according to FKs,
+ # so this check is just making sure that the referring table comes after
+ # the referred-to table.
+ 'COPY fk_reference_test_table second' => {
+ regexp => qr/^
+ \QCOPY dump_test.test_table (col1, col2, col3, col4) FROM stdin;\E
+ \n(?:\d\t\\N\t\\N\t\\N\n){9}\\\.\n.*
+ \QCOPY dump_test.fk_reference_test_table (col1) FROM stdin;\E
+ \n(?:\d\n){5}\\\.\n
+ /xms,
+ like => { data_only => 1, },
+ },
+
+ 'COPY test_second_table' => {
+ create_order => 7,
+ create_sql => 'INSERT INTO dump_test.test_second_table (col1, col2) '
+ . 'SELECT generate_series, generate_series::text '
+ . 'FROM generate_series(1,9);',
+ regexp => qr/^
+ \QCOPY dump_test.test_second_table (col1, col2) FROM stdin;\E
+ \n(?:\d\t\d\n){9}\\\.\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ data_only => 1,
+ section_data => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ },
+ },
+
+ 'COPY test_third_table' => {
+ create_order => 7,
+ create_sql =>
+ 'INSERT INTO dump_test.test_third_table VALUES (123, DEFAULT, 456);',
+ regexp => qr/^
+ \QCOPY dump_test.test_third_table (f1, "F3") FROM stdin;\E
+ \n123\t456\n\\\.\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ data_only => 1,
+ section_data => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ },
+ },
+
+ 'COPY test_fourth_table' => {
+ create_order => 7,
+ create_sql =>
+ 'INSERT INTO dump_test.test_fourth_table DEFAULT VALUES;'
+ . 'INSERT INTO dump_test.test_fourth_table DEFAULT VALUES;',
+ regexp => qr/^
+ \QCOPY dump_test.test_fourth_table FROM stdin;\E
+ \n\n\n\\\.\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ data_only => 1,
+ section_data => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ },
+ },
+
+ 'COPY test_fifth_table' => {
+ create_order => 54,
+ create_sql =>
+ 'INSERT INTO dump_test.test_fifth_table VALUES (NULL, true, false, \'11001\'::bit(5), \'NaN\');',
+ regexp => qr/^
+ \QCOPY dump_test.test_fifth_table (col1, col2, col3, col4, col5) FROM stdin;\E
+ \n\\N\tt\tf\t11001\tNaN\n\\\.\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ data_only => 1,
+ section_data => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ },
+ },
+
+ 'COPY test_table_identity' => {
+ create_order => 54,
+ create_sql =>
+ 'INSERT INTO dump_test.test_table_identity (col2) VALUES (\'test\');',
+ regexp => qr/^
+ \QCOPY dump_test.test_table_identity (col1, col2) FROM stdin;\E
+ \n1\ttest\n\\\.\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ data_only => 1,
+ section_data => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ },
+ },
+
+ 'INSERT INTO test_table' => {
+ regexp => qr/^
+ (?:INSERT\ INTO\ dump_test\.test_table\ \(col1,\ col2,\ col3,\ col4\)\ VALUES\ \(\d,\ NULL,\ NULL,\ NULL\);\n){9}
+ /xm,
+ like => { column_inserts => 1, },
+ },
+
+ 'test_table with 4-row INSERTs' => {
+ regexp => qr/^
+ (?:
+ INSERT\ INTO\ dump_test\.test_table\ VALUES\n
+ (?:\t\(\d,\ NULL,\ NULL,\ NULL\),\n){3}
+ \t\(\d,\ NULL,\ NULL,\ NULL\);\n
+ ){2}
+ INSERT\ INTO\ dump_test\.test_table\ VALUES\n
+ \t\(\d,\ NULL,\ NULL,\ NULL\);
+ /xm,
+ like => { rows_per_insert => 1, },
+ },
+
+ 'INSERT INTO test_second_table' => {
+ regexp => qr/^
+ (?:INSERT\ INTO\ dump_test\.test_second_table\ \(col1,\ col2\)
+ \ VALUES\ \(\d,\ '\d'\);\n){9}/xm,
+ like => { column_inserts => 1, },
+ },
+
+ 'INSERT INTO test_third_table (colnames)' => {
+ regexp =>
+ qr/^INSERT INTO dump_test\.test_third_table \(f1, "F3"\) VALUES \(123, 456\);\n/m,
+ like => { column_inserts => 1, },
+ },
+
+ 'INSERT INTO test_third_table' => {
+ regexp =>
+ qr/^INSERT INTO dump_test\.test_third_table VALUES \(123, DEFAULT, 456, DEFAULT\);\n/m,
+ like => { inserts => 1, },
+ },
+
+ 'INSERT INTO test_fourth_table' => {
+ regexp =>
+ qr/^(?:INSERT INTO dump_test\.test_fourth_table DEFAULT VALUES;\n){2}/m,
+ like => { column_inserts => 1, inserts => 1, rows_per_insert => 1, },
+ },
+
+ 'INSERT INTO test_fifth_table' => {
+ regexp =>
+ qr/^\QINSERT INTO dump_test.test_fifth_table (col1, col2, col3, col4, col5) VALUES (NULL, true, false, B'11001', 'NaN');\E/m,
+ like => { column_inserts => 1, },
+ },
+
+ 'INSERT INTO test_table_identity' => {
+ regexp =>
+ qr/^\QINSERT INTO dump_test.test_table_identity (col1, col2) OVERRIDING SYSTEM VALUE VALUES (1, 'test');\E/m,
+ like => { column_inserts => 1, },
+ },
+
+ 'CREATE ROLE regress_dump_test_role' => {
+ create_order => 1,
+ create_sql => 'CREATE ROLE regress_dump_test_role;',
+ regexp => qr/^CREATE ROLE regress_dump_test_role;/m,
+ like => {
+ pg_dumpall_dbprivs => 1,
+ pg_dumpall_exclude => 1,
+ pg_dumpall_globals => 1,
+ pg_dumpall_globals_clean => 1,
+ },
+ },
+
+ 'CREATE ROLE regress_quoted...' => {
+ create_order => 1,
+ create_sql => 'CREATE ROLE "regress_quoted \"" role";',
+ regexp => qr/^CREATE ROLE "regress_quoted \\"" role";/m,
+ like => {
+ pg_dumpall_dbprivs => 1,
+ pg_dumpall_exclude => 1,
+ pg_dumpall_globals => 1,
+ pg_dumpall_globals_clean => 1,
+ },
+ },
+
+ 'CREATE DATABASE regression_invalid...' => {
+ create_order => 1,
+ create_sql => q(
+ CREATE DATABASE regression_invalid;
+ UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid'),
+ regexp => qr/^CREATE DATABASE regression_invalid/m,
+
+ # invalid databases should never be dumped
+ like => {},
+ },
+
+ 'CREATE ACCESS METHOD gist2' => {
+ create_order => 52,
+ create_sql =>
+ 'CREATE ACCESS METHOD gist2 TYPE INDEX HANDLER gisthandler;',
+ regexp =>
+ qr/CREATE ACCESS METHOD gist2 TYPE INDEX HANDLER gisthandler;/m,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'CREATE COLLATION test0 FROM "C"' => {
+ create_order => 76,
+ create_sql => 'CREATE COLLATION test0 FROM "C";',
+ regexp =>
+ qr/CREATE COLLATION public.test0 \(provider = libc, locale = 'C'(, version = '[^']*')?\);/m,
+ collation => 1,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'CREATE COLLATION icu_collation' => {
+ create_order => 76,
+ create_sql => "CREATE COLLATION icu_collation (PROVIDER = icu, LOCALE = 'C');",
+ regexp =>
+ qr/CREATE COLLATION public.icu_collation \(provider = icu, locale = 'C'(, version = '[^']*')?\);/m,
+ icu => 1,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'CREATE CAST FOR timestamptz' => {
+ create_order => 51,
+ create_sql =>
+ 'CREATE CAST (timestamptz AS interval) WITH FUNCTION age(timestamptz) AS ASSIGNMENT;',
+ regexp =>
+ qr/CREATE CAST \(timestamp with time zone AS interval\) WITH FUNCTION pg_catalog\.age\(timestamp with time zone\) AS ASSIGNMENT;/m,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'CREATE DATABASE postgres' => {
+ regexp => qr/^
+ \QCREATE DATABASE postgres WITH TEMPLATE = template0 \E
+ .+;/xm,
+ like => { createdb => 1, },
+ },
+
+ 'CREATE DATABASE dump_test' => {
+ create_order => 47,
+ create_sql => 'CREATE DATABASE dump_test;',
+ regexp => qr/^
+ \QCREATE DATABASE dump_test WITH TEMPLATE = template0 \E
+ .+;/xm,
+ like => { pg_dumpall_dbprivs => 1, },
+ },
+
+ "CREATE DATABASE dump_test2 LOCALE = 'C'" => {
+ create_order => 47,
+ create_sql =>
+ "CREATE DATABASE dump_test2 LOCALE = 'C' TEMPLATE = template0;",
+ regexp => qr/^
+ \QCREATE DATABASE dump_test2 \E.*\QLOCALE = 'C';\E
+ /xm,
+ like => { pg_dumpall_dbprivs => 1, },
+ },
+
+ 'CREATE EXTENSION ... plpgsql' => {
+ regexp => qr/^
+ \QCREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;\E
+ /xm,
+
+ # this shouldn't ever get emitted anymore
+ like => {},
+ },
+
+ 'CREATE AGGREGATE dump_test.newavg' => {
+ create_order => 25,
+ create_sql => 'CREATE AGGREGATE dump_test.newavg (
+ sfunc = int4_avg_accum,
+ basetype = int4,
+ stype = _int8,
+ finalfunc = int8_avg,
+ finalfunc_modify = shareable,
+ initcond1 = \'{0,0}\'
+ );',
+ regexp => qr/^
+ \QCREATE AGGREGATE dump_test.newavg(integer) (\E
+ \n\s+\QSFUNC = int4_avg_accum,\E
+ \n\s+\QSTYPE = bigint[],\E
+ \n\s+\QINITCOND = '{0,0}',\E
+ \n\s+\QFINALFUNC = int8_avg,\E
+ \n\s+\QFINALFUNC_MODIFY = SHAREABLE\E
+ \n\);/xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ exclude_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE CONVERSION dump_test.test_conversion' => {
+ create_order => 78,
+ create_sql =>
+ 'CREATE DEFAULT CONVERSION dump_test.test_conversion FOR \'LATIN1\' TO \'UTF8\' FROM iso8859_1_to_utf8;',
+ regexp =>
+ qr/^\QCREATE DEFAULT CONVERSION dump_test.test_conversion FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8;\E/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE DOMAIN dump_test.us_postal_code' => {
+ create_order => 29,
+ create_sql => 'CREATE DOMAIN dump_test.us_postal_code AS TEXT
+ COLLATE "C"
+ DEFAULT \'10014\'
+ CHECK(VALUE ~ \'^\d{5}$\' OR
+ VALUE ~ \'^\d{5}-\d{4}$\');
+ COMMENT ON CONSTRAINT us_postal_code_check
+ ON DOMAIN dump_test.us_postal_code IS \'check it\';',
+ regexp => qr/^
+ \QCREATE DOMAIN dump_test.us_postal_code AS text COLLATE pg_catalog."C" DEFAULT '10014'::text\E\n\s+
+ \QCONSTRAINT us_postal_code_check CHECK \E
+ \Q(((VALUE ~ '^\d{5}\E
+ \$\Q'::text) OR (VALUE ~ '^\d{5}-\d{4}\E\$
+ \Q'::text)));\E(.|\n)*
+ \QCOMMENT ON CONSTRAINT us_postal_code_check ON DOMAIN dump_test.us_postal_code IS 'check it';\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE FUNCTION dump_test.pltestlang_call_handler' => {
+ create_order => 17,
+ create_sql => 'CREATE FUNCTION dump_test.pltestlang_call_handler()
+ RETURNS LANGUAGE_HANDLER AS \'$libdir/plpgsql\',
+ \'plpgsql_call_handler\' LANGUAGE C;',
+ regexp => qr/^
+ \QCREATE FUNCTION dump_test.pltestlang_call_handler() \E
+ \QRETURNS language_handler\E
+ \n\s+\QLANGUAGE c\E
+ \n\s+AS\ \'\$
+ \Qlibdir\/plpgsql', 'plpgsql_call_handler';\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE FUNCTION dump_test.trigger_func' => {
+ create_order => 30,
+ create_sql => 'CREATE FUNCTION dump_test.trigger_func()
+ RETURNS trigger LANGUAGE plpgsql
+ AS $$ BEGIN RETURN NULL; END;$$;',
+ regexp => qr/^
+ \QCREATE FUNCTION dump_test.trigger_func() RETURNS trigger\E
+ \n\s+\QLANGUAGE plpgsql\E
+ \n\s+AS\ \$\$
+ \Q BEGIN RETURN NULL; END;\E
+ \$\$;/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE FUNCTION dump_test.event_trigger_func' => {
+ create_order => 32,
+ create_sql => 'CREATE FUNCTION dump_test.event_trigger_func()
+ RETURNS event_trigger LANGUAGE plpgsql
+ AS $$ BEGIN RETURN; END;$$;',
+ regexp => qr/^
+ \QCREATE FUNCTION dump_test.event_trigger_func() RETURNS event_trigger\E
+ \n\s+\QLANGUAGE plpgsql\E
+ \n\s+AS\ \$\$
+ \Q BEGIN RETURN; END;\E
+ \$\$;/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE OPERATOR FAMILY dump_test.op_family' => {
+ create_order => 73,
+ create_sql =>
+ 'CREATE OPERATOR FAMILY dump_test.op_family USING btree;',
+ regexp => qr/^
+ \QCREATE OPERATOR FAMILY dump_test.op_family USING btree;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE OPERATOR CLASS dump_test.op_class' => {
+ create_order => 74,
+ create_sql => 'CREATE OPERATOR CLASS dump_test.op_class
+ FOR TYPE bigint USING btree FAMILY dump_test.op_family
+ AS STORAGE bigint,
+ OPERATOR 1 <(bigint,bigint),
+ OPERATOR 2 <=(bigint,bigint),
+ OPERATOR 3 =(bigint,bigint),
+ OPERATOR 4 >=(bigint,bigint),
+ OPERATOR 5 >(bigint,bigint),
+ FUNCTION 1 btint8cmp(bigint,bigint),
+ FUNCTION 2 btint8sortsupport(internal),
+ FUNCTION 4 btequalimage(oid);',
+ # note: it's correct that btint8sortsupport and btequalimage
+ # are NOT included here (they're optional support functions):
+ regexp => qr/^
+ \QCREATE OPERATOR CLASS dump_test.op_class\E\n\s+
+ \QFOR TYPE bigint USING btree FAMILY dump_test.op_family AS\E\n\s+
+ \QOPERATOR 1 <(bigint,bigint) ,\E\n\s+
+ \QOPERATOR 2 <=(bigint,bigint) ,\E\n\s+
+ \QOPERATOR 3 =(bigint,bigint) ,\E\n\s+
+ \QOPERATOR 4 >=(bigint,bigint) ,\E\n\s+
+ \QOPERATOR 5 >(bigint,bigint) ,\E\n\s+
+ \QFUNCTION 1 (bigint, bigint) btint8cmp(bigint,bigint);\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ # verify that a custom operator/opclass/range type is dumped in right order
+ 'CREATE OPERATOR CLASS dump_test.op_class_custom' => {
+ create_order => 74,
+ create_sql => 'CREATE OPERATOR dump_test.~~ (
+ PROCEDURE = int4eq,
+ LEFTARG = int,
+ RIGHTARG = int);
+ CREATE OPERATOR CLASS dump_test.op_class_custom
+ FOR TYPE int USING btree AS
+ OPERATOR 3 dump_test.~~;
+ CREATE TYPE dump_test.range_type_custom AS RANGE (
+ subtype = int,
+ subtype_opclass = dump_test.op_class_custom);',
+ regexp => qr/^
+ \QCREATE OPERATOR dump_test.~~ (\E\n.+
+ \QCREATE OPERATOR FAMILY dump_test.op_class_custom USING btree;\E\n.+
+ \QCREATE OPERATOR CLASS dump_test.op_class_custom\E\n\s+
+ \QFOR TYPE integer USING btree FAMILY dump_test.op_class_custom AS\E\n\s+
+ \QOPERATOR 3 dump_test.~~(integer,integer);\E\n.+
+ \QCREATE TYPE dump_test.range_type_custom AS RANGE (\E\n\s+
+ \Qsubtype = integer,\E\n\s+
+ \Qmultirange_type_name = dump_test.multirange_type_custom,\E\n\s+
+ \Qsubtype_opclass = dump_test.op_class_custom\E\n
+ \Q);\E
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE OPERATOR CLASS dump_test.op_class_empty' => {
+ create_order => 89,
+ create_sql => 'CREATE OPERATOR CLASS dump_test.op_class_empty
+ FOR TYPE bigint USING btree FAMILY dump_test.op_family
+ AS STORAGE bigint;',
+ regexp => qr/^
+ \QCREATE OPERATOR CLASS dump_test.op_class_empty\E\n\s+
+ \QFOR TYPE bigint USING btree FAMILY dump_test.op_family AS\E\n\s+
+ \QSTORAGE bigint;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE EVENT TRIGGER test_event_trigger' => {
+ create_order => 33,
+ create_sql => 'CREATE EVENT TRIGGER test_event_trigger
+ ON ddl_command_start
+ EXECUTE FUNCTION dump_test.event_trigger_func();',
+ regexp => qr/^
+ \QCREATE EVENT TRIGGER test_event_trigger \E
+ \QON ddl_command_start\E
+ \n\s+\QEXECUTE FUNCTION dump_test.event_trigger_func();\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'CREATE TRIGGER test_trigger' => {
+ create_order => 31,
+ create_sql => 'CREATE TRIGGER test_trigger
+ BEFORE INSERT ON dump_test.test_table
+ FOR EACH ROW WHEN (NEW.col1 > 10)
+ EXECUTE FUNCTION dump_test.trigger_func();',
+ regexp => qr/^
+ \QCREATE TRIGGER test_trigger BEFORE INSERT ON dump_test.test_table \E
+ \QFOR EACH ROW WHEN ((new.col1 > 10)) \E
+ \QEXECUTE FUNCTION dump_test.trigger_func();\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_test_table => 1,
+ exclude_dump_test_schema => 1,
+ },
+ },
+
+ 'CREATE TYPE dump_test.planets AS ENUM' => {
+ create_order => 37,
+ create_sql => 'CREATE TYPE dump_test.planets
+ AS ENUM ( \'venus\', \'earth\', \'mars\' );',
+ regexp => qr/^
+ \QCREATE TYPE dump_test.planets AS ENUM (\E
+ \n\s+'venus',
+ \n\s+'earth',
+ \n\s+'mars'
+ \n\);/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ },
+ },
+
+ 'CREATE TYPE dump_test.planets AS ENUM pg_upgrade' => {
+ regexp => qr/^
+ \QCREATE TYPE dump_test.planets AS ENUM (\E
+ \n\);.*^
+ \QALTER TYPE dump_test.planets ADD VALUE 'venus';\E
+ \n.*^
+ \QALTER TYPE dump_test.planets ADD VALUE 'earth';\E
+ \n.*^
+ \QALTER TYPE dump_test.planets ADD VALUE 'mars';\E
+ \n/xms,
+ like => { binary_upgrade => 1, },
+ },
+
+ 'CREATE TYPE dump_test.textrange AS RANGE' => {
+ create_order => 38,
+ create_sql => 'CREATE TYPE dump_test.textrange
+ AS RANGE (subtype=text, collation="C");',
+ regexp => qr/^
+ \QCREATE TYPE dump_test.textrange AS RANGE (\E
+ \n\s+\Qsubtype = text,\E
+ \n\s+\Qmultirange_type_name = dump_test.textmultirange,\E
+ \n\s+\Qcollation = pg_catalog."C"\E
+ \n\);/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TYPE dump_test.int42' => {
+ create_order => 39,
+ create_sql => 'CREATE TYPE dump_test.int42;',
+ regexp => qr/^\QCREATE TYPE dump_test.int42;\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1' => {
+ create_order => 80,
+ create_sql =>
+ 'CREATE TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1 (copy=english);',
+ regexp => qr/^
+ \QCREATE TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1 (\E\n
+ \s+\QPARSER = pg_catalog."default" );\E/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'ALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1 ...' => {
+ regexp => qr/^
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR asciiword WITH english_stem;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR word WITH english_stem;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR numword WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR email WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR url WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR host WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR sfloat WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR version WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR hword_numpart WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR hword_part WITH english_stem;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR hword_asciipart WITH english_stem;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR numhword WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR asciihword WITH english_stem;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR hword WITH english_stem;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR url_path WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR file WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR "float" WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR "int" WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR uint WITH simple;\E\n
+ \n
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TEXT SEARCH TEMPLATE dump_test.alt_ts_temp1' => {
+ create_order => 81,
+ create_sql =>
+ 'CREATE TEXT SEARCH TEMPLATE dump_test.alt_ts_temp1 (lexize=dsimple_lexize);',
+ regexp => qr/^
+ \QCREATE TEXT SEARCH TEMPLATE dump_test.alt_ts_temp1 (\E\n
+ \s+\QLEXIZE = dsimple_lexize );\E/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TEXT SEARCH PARSER dump_test.alt_ts_prs1' => {
+ create_order => 82,
+ create_sql => 'CREATE TEXT SEARCH PARSER dump_test.alt_ts_prs1
+ (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype);',
+ regexp => qr/^
+ \QCREATE TEXT SEARCH PARSER dump_test.alt_ts_prs1 (\E\n
+ \s+\QSTART = prsd_start,\E\n
+ \s+\QGETTOKEN = prsd_nexttoken,\E\n
+ \s+\QEND = prsd_end,\E\n
+ \s+\QLEXTYPES = prsd_lextype );\E\n
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TEXT SEARCH DICTIONARY dump_test.alt_ts_dict1' => {
+ create_order => 83,
+ create_sql =>
+ 'CREATE TEXT SEARCH DICTIONARY dump_test.alt_ts_dict1 (template=simple);',
+ regexp => qr/^
+ \QCREATE TEXT SEARCH DICTIONARY dump_test.alt_ts_dict1 (\E\n
+ \s+\QTEMPLATE = pg_catalog.simple );\E\n
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE FUNCTION dump_test.int42_in' => {
+ create_order => 40,
+ create_sql => 'CREATE FUNCTION dump_test.int42_in(cstring)
+ RETURNS dump_test.int42 AS \'int4in\'
+ LANGUAGE internal STRICT IMMUTABLE;',
+ regexp => qr/^
+ \QCREATE FUNCTION dump_test.int42_in(cstring) RETURNS dump_test.int42\E
+ \n\s+\QLANGUAGE internal IMMUTABLE STRICT\E
+ \n\s+AS\ \$\$int4in\$\$;
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE FUNCTION dump_test.int42_out' => {
+ create_order => 41,
+ create_sql => 'CREATE FUNCTION dump_test.int42_out(dump_test.int42)
+ RETURNS cstring AS \'int4out\'
+ LANGUAGE internal STRICT IMMUTABLE;',
+ regexp => qr/^
+ \QCREATE FUNCTION dump_test.int42_out(dump_test.int42) RETURNS cstring\E
+ \n\s+\QLANGUAGE internal IMMUTABLE STRICT\E
+ \n\s+AS\ \$\$int4out\$\$;
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE FUNCTION ... SUPPORT' => {
+ create_order => 41,
+ create_sql =>
+ 'CREATE FUNCTION dump_test.func_with_support() RETURNS int LANGUAGE sql AS $$ SELECT 1 $$ SUPPORT varchar_support;',
+ regexp => qr/^
+ \QCREATE FUNCTION dump_test.func_with_support() RETURNS integer\E
+ \n\s+\QLANGUAGE sql SUPPORT varchar_support\E
+ \n\s+AS\ \$\$\Q SELECT 1 \E\$\$;
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'Check ordering of a function that depends on a primary key' => {
+ create_order => 41,
+ create_sql => '
+ CREATE TABLE dump_test.ordering_table (id int primary key, data int);
+ CREATE FUNCTION dump_test.ordering_func ()
+ RETURNS SETOF dump_test.ordering_table
+ LANGUAGE sql BEGIN ATOMIC
+ SELECT * FROM dump_test.ordering_table GROUP BY id; END;',
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.ordering_table\E
+ \n\s+\QADD CONSTRAINT ordering_table_pkey PRIMARY KEY (id);\E
+ .*^
+ \QCREATE FUNCTION dump_test.ordering_func\E/xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE PROCEDURE dump_test.ptest1' => {
+ create_order => 41,
+ create_sql => 'CREATE PROCEDURE dump_test.ptest1(a int)
+ LANGUAGE SQL AS $$ INSERT INTO dump_test.test_table (col1) VALUES (a) $$;',
+ regexp => qr/^
+ \QCREATE PROCEDURE dump_test.ptest1(IN a integer)\E
+ \n\s+\QLANGUAGE sql\E
+ \n\s+AS\ \$\$\Q INSERT INTO dump_test.test_table (col1) VALUES (a) \E\$\$;
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TYPE dump_test.int42 populated' => {
+ create_order => 42,
+ create_sql => 'CREATE TYPE dump_test.int42 (
+ internallength = 4,
+ input = dump_test.int42_in,
+ output = dump_test.int42_out,
+ alignment = int4,
+ default = 42,
+ passedbyvalue);',
+ regexp => qr/^
+ \QCREATE TYPE dump_test.int42 (\E
+ \n\s+\QINTERNALLENGTH = 4,\E
+ \n\s+\QINPUT = dump_test.int42_in,\E
+ \n\s+\QOUTPUT = dump_test.int42_out,\E
+ \n\s+\QDEFAULT = '42',\E
+ \n\s+\QALIGNMENT = int4,\E
+ \n\s+\QSTORAGE = plain,\E
+ \n\s+PASSEDBYVALUE\n\);
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TYPE dump_test.composite' => {
+ create_order => 43,
+ create_sql => 'CREATE TYPE dump_test.composite AS (
+ f1 int,
+ f2 dump_test.int42
+ );',
+ regexp => qr/^
+ \QCREATE TYPE dump_test.composite AS (\E
+ \n\s+\Qf1 integer,\E
+ \n\s+\Qf2 dump_test.int42\E
+ \n\);
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TYPE dump_test.undefined' => {
+ create_order => 39,
+ create_sql => 'CREATE TYPE dump_test.undefined;',
+ regexp => qr/^\QCREATE TYPE dump_test.undefined;\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE FOREIGN DATA WRAPPER dummy' => {
+ create_order => 35,
+ create_sql => 'CREATE FOREIGN DATA WRAPPER dummy;',
+ regexp => qr/CREATE FOREIGN DATA WRAPPER dummy;/m,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'CREATE SERVER s1 FOREIGN DATA WRAPPER dummy' => {
+ create_order => 36,
+ create_sql => 'CREATE SERVER s1 FOREIGN DATA WRAPPER dummy;',
+ regexp => qr/CREATE SERVER s1 FOREIGN DATA WRAPPER dummy;/m,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'CREATE FOREIGN TABLE dump_test.foreign_table SERVER s1' => {
+ create_order => 88,
+ create_sql =>
+ 'CREATE FOREIGN TABLE dump_test.foreign_table (c1 int options (column_name \'col1\'))
+ SERVER s1 OPTIONS (schema_name \'x1\');',
+ regexp => qr/
+ \QCREATE FOREIGN TABLE dump_test.foreign_table (\E\n
+ \s+\Qc1 integer\E\n
+ \Q)\E\n
+ \QSERVER s1\E\n
+ \QOPTIONS (\E\n
+ \s+\Qschema_name 'x1'\E\n
+ \Q);\E\n
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE USER MAPPING FOR regress_dump_test_role SERVER s1' => {
+ create_order => 86,
+ create_sql =>
+ 'CREATE USER MAPPING FOR regress_dump_test_role SERVER s1;',
+ regexp =>
+ qr/CREATE USER MAPPING FOR regress_dump_test_role SERVER s1;/m,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'CREATE TRANSFORM FOR int' => {
+ create_order => 34,
+ create_sql =>
+ 'CREATE TRANSFORM FOR int LANGUAGE SQL (FROM SQL WITH FUNCTION prsd_lextype(internal), TO SQL WITH FUNCTION int4recv(internal));',
+ regexp =>
+ qr/CREATE TRANSFORM FOR integer LANGUAGE sql \(FROM SQL WITH FUNCTION pg_catalog\.prsd_lextype\(internal\), TO SQL WITH FUNCTION pg_catalog\.int4recv\(internal\)\);/m,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'CREATE LANGUAGE pltestlang' => {
+ create_order => 18,
+ create_sql => 'CREATE LANGUAGE pltestlang
+ HANDLER dump_test.pltestlang_call_handler;',
+ regexp => qr/^
+ \QCREATE PROCEDURAL LANGUAGE pltestlang \E
+ \QHANDLER dump_test.pltestlang_call_handler;\E
+ /xm,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE MATERIALIZED VIEW matview' => {
+ create_order => 20,
+ create_sql => 'CREATE MATERIALIZED VIEW dump_test.matview (col1) AS
+ SELECT col1 FROM dump_test.test_table;',
+ regexp => qr/^
+ \QCREATE MATERIALIZED VIEW dump_test.matview AS\E
+ \n\s+\QSELECT test_table.col1\E
+ \n\s+\QFROM dump_test.test_table\E
+ \n\s+\QWITH NO DATA;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE MATERIALIZED VIEW matview_second' => {
+ create_order => 21,
+ create_sql => 'CREATE MATERIALIZED VIEW
+ dump_test.matview_second (col1) AS
+ SELECT * FROM dump_test.matview;',
+ regexp => qr/^
+ \QCREATE MATERIALIZED VIEW dump_test.matview_second AS\E
+ \n\s+\QSELECT matview.col1\E
+ \n\s+\QFROM dump_test.matview\E
+ \n\s+\QWITH NO DATA;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE MATERIALIZED VIEW matview_third' => {
+ create_order => 58,
+ create_sql => 'CREATE MATERIALIZED VIEW
+ dump_test.matview_third (col1) AS
+ SELECT * FROM dump_test.matview_second WITH NO DATA;',
+ regexp => qr/^
+ \QCREATE MATERIALIZED VIEW dump_test.matview_third AS\E
+ \n\s+\QSELECT matview_second.col1\E
+ \n\s+\QFROM dump_test.matview_second\E
+ \n\s+\QWITH NO DATA;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE MATERIALIZED VIEW matview_fourth' => {
+ create_order => 59,
+ create_sql => 'CREATE MATERIALIZED VIEW
+ dump_test.matview_fourth (col1) AS
+ SELECT * FROM dump_test.matview_third WITH NO DATA;',
+ regexp => qr/^
+ \QCREATE MATERIALIZED VIEW dump_test.matview_fourth AS\E
+ \n\s+\QSELECT matview_third.col1\E
+ \n\s+\QFROM dump_test.matview_third\E
+ \n\s+\QWITH NO DATA;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE MATERIALIZED VIEW matview_compression' => {
+ create_order => 20,
+ create_sql => 'CREATE MATERIALIZED VIEW
+ dump_test.matview_compression (col2) AS
+ SELECT col2 FROM dump_test.test_table;
+ ALTER MATERIALIZED VIEW dump_test.matview_compression
+ ALTER COLUMN col2 SET COMPRESSION lz4;',
+ regexp => qr/^
+ \QCREATE MATERIALIZED VIEW dump_test.matview_compression AS\E
+ \n\s+\QSELECT test_table.col2\E
+ \n\s+\QFROM dump_test.test_table\E
+ \n\s+\QWITH NO DATA;\E
+ .*
+ \QALTER TABLE ONLY dump_test.matview_compression ALTER COLUMN col2 SET COMPRESSION lz4;\E\n
+ /xms,
+ lz4 => 1,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike =>
+ { exclude_dump_test_schema => 1, no_toast_compression => 1, },
+ },
+
+ 'Check ordering of a matview that depends on a primary key' => {
+ create_order => 42,
+ create_sql => '
+ CREATE MATERIALIZED VIEW dump_test.ordering_view AS
+ SELECT * FROM dump_test.ordering_table GROUP BY id;',
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.ordering_table\E
+ \n\s+\QADD CONSTRAINT ordering_table_pkey PRIMARY KEY (id);\E
+ .*^
+ \QCREATE MATERIALIZED VIEW dump_test.ordering_view AS\E
+ \n\s+\QSELECT ordering_table.id,\E/xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE POLICY p1 ON test_table' => {
+ create_order => 22,
+ create_sql => 'CREATE POLICY p1 ON dump_test.test_table
+ USING (true)
+ WITH CHECK (true);',
+ regexp => qr/^
+ \QCREATE POLICY p1 ON dump_test.test_table \E
+ \QUSING (true) WITH CHECK (true);\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'CREATE POLICY p2 ON test_table FOR SELECT' => {
+ create_order => 24,
+ create_sql => 'CREATE POLICY p2 ON dump_test.test_table
+ FOR SELECT TO regress_dump_test_role USING (true);',
+ regexp => qr/^
+ \QCREATE POLICY p2 ON dump_test.test_table FOR SELECT TO regress_dump_test_role \E
+ \QUSING (true);\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'CREATE POLICY p3 ON test_table FOR INSERT' => {
+ create_order => 25,
+ create_sql => 'CREATE POLICY p3 ON dump_test.test_table
+ FOR INSERT TO regress_dump_test_role WITH CHECK (true);',
+ regexp => qr/^
+ \QCREATE POLICY p3 ON dump_test.test_table FOR INSERT \E
+ \QTO regress_dump_test_role WITH CHECK (true);\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'CREATE POLICY p4 ON test_table FOR UPDATE' => {
+ create_order => 26,
+ create_sql => 'CREATE POLICY p4 ON dump_test.test_table FOR UPDATE
+ TO regress_dump_test_role USING (true) WITH CHECK (true);',
+ regexp => qr/^
+ \QCREATE POLICY p4 ON dump_test.test_table FOR UPDATE TO regress_dump_test_role \E
+ \QUSING (true) WITH CHECK (true);\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'CREATE POLICY p5 ON test_table FOR DELETE' => {
+ create_order => 27,
+ create_sql => 'CREATE POLICY p5 ON dump_test.test_table
+ FOR DELETE TO regress_dump_test_role USING (true);',
+ regexp => qr/^
+ \QCREATE POLICY p5 ON dump_test.test_table FOR DELETE \E
+ \QTO regress_dump_test_role USING (true);\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'CREATE POLICY p6 ON test_table AS RESTRICTIVE' => {
+ create_order => 27,
+ create_sql => 'CREATE POLICY p6 ON dump_test.test_table AS RESTRICTIVE
+ USING (false);',
+ regexp => qr/^
+ \QCREATE POLICY p6 ON dump_test.test_table AS RESTRICTIVE \E
+ \QUSING (false);\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'CREATE PUBLICATION pub1' => {
+ create_order => 50,
+ create_sql => 'CREATE PUBLICATION pub1;',
+ regexp => qr/^
+ \QCREATE PUBLICATION pub1 WITH (publish = 'insert, update, delete, truncate');\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'CREATE PUBLICATION pub2' => {
+ create_order => 50,
+ create_sql => 'CREATE PUBLICATION pub2
+ FOR ALL TABLES
+ WITH (publish = \'\');',
+ regexp => qr/^
+ \QCREATE PUBLICATION pub2 FOR ALL TABLES WITH (publish = '');\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'CREATE PUBLICATION pub3' => {
+ create_order => 50,
+ create_sql => 'CREATE PUBLICATION pub3;',
+ regexp => qr/^
+ \QCREATE PUBLICATION pub3 WITH (publish = 'insert, update, delete, truncate');\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'CREATE PUBLICATION pub4' => {
+ create_order => 50,
+ create_sql => 'CREATE PUBLICATION pub4;',
+ regexp => qr/^
+ \QCREATE PUBLICATION pub4 WITH (publish = 'insert, update, delete, truncate');\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'CREATE SUBSCRIPTION sub1' => {
+ create_order => 50,
+ create_sql => 'CREATE SUBSCRIPTION sub1
+ CONNECTION \'dbname=doesnotexist\' PUBLICATION pub1
+ WITH (connect = false);',
+ regexp => qr/^
+ \QCREATE SUBSCRIPTION sub1 CONNECTION 'dbname=doesnotexist' PUBLICATION pub1 WITH (connect = false, slot_name = 'sub1');\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'ALTER PUBLICATION pub1 ADD TABLE test_table' => {
+ create_order => 51,
+ create_sql =>
+ 'ALTER PUBLICATION pub1 ADD TABLE dump_test.test_table;',
+ regexp => qr/^
+ \QALTER PUBLICATION pub1 ADD TABLE ONLY dump_test.test_table;\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'ALTER PUBLICATION pub1 ADD TABLE test_second_table' => {
+ create_order => 52,
+ create_sql =>
+ 'ALTER PUBLICATION pub1 ADD TABLE dump_test.test_second_table;',
+ regexp => qr/^
+ \QALTER PUBLICATION pub1 ADD TABLE ONLY dump_test.test_second_table;\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'ALTER PUBLICATION pub1 ADD TABLE test_sixth_table (col3, col2)' => {
+ create_order => 52,
+ create_sql =>
+ 'ALTER PUBLICATION pub1 ADD TABLE dump_test.test_sixth_table (col3, col2);',
+ regexp => qr/^
+ \QALTER PUBLICATION pub1 ADD TABLE ONLY dump_test.test_sixth_table (col2, col3);\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'ALTER PUBLICATION pub1 ADD TABLE test_seventh_table (col3, col2) WHERE (col1 = 1)'
+ => {
+ create_order => 52,
+ create_sql =>
+ 'ALTER PUBLICATION pub1 ADD TABLE dump_test.test_seventh_table (col3, col2) WHERE (col1 = 1);',
+ regexp => qr/^
+ \QALTER PUBLICATION pub1 ADD TABLE ONLY dump_test.test_seventh_table (col2, col3) WHERE ((col1 = 1));\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'ALTER PUBLICATION pub3 ADD TABLES IN SCHEMA dump_test' => {
+ create_order => 51,
+ create_sql =>
+ 'ALTER PUBLICATION pub3 ADD TABLES IN SCHEMA dump_test;',
+ regexp => qr/^
+ \QALTER PUBLICATION pub3 ADD TABLES IN SCHEMA dump_test;\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'ALTER PUBLICATION pub3 ADD TABLES IN SCHEMA public' => {
+ create_order => 52,
+ create_sql => 'ALTER PUBLICATION pub3 ADD TABLES IN SCHEMA public;',
+ regexp => qr/^
+ \QALTER PUBLICATION pub3 ADD TABLES IN SCHEMA public;\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'ALTER PUBLICATION pub3 ADD TABLE test_table' => {
+ create_order => 51,
+ create_sql =>
+ 'ALTER PUBLICATION pub3 ADD TABLE dump_test.test_table;',
+ regexp => qr/^
+ \QALTER PUBLICATION pub3 ADD TABLE ONLY dump_test.test_table;\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'ALTER PUBLICATION pub4 ADD TABLE test_table WHERE (col1 > 0);' => {
+ create_order => 51,
+ create_sql =>
+ 'ALTER PUBLICATION pub4 ADD TABLE dump_test.test_table WHERE (col1 > 0);',
+ regexp => qr/^
+ \QALTER PUBLICATION pub4 ADD TABLE ONLY dump_test.test_table WHERE ((col1 > 0));\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'ALTER PUBLICATION pub4 ADD TABLE test_second_table WHERE (col2 = \'test\');'
+ => {
+ create_order => 52,
+ create_sql =>
+ 'ALTER PUBLICATION pub4 ADD TABLE dump_test.test_second_table WHERE (col2 = \'test\');',
+ regexp => qr/^
+ \QALTER PUBLICATION pub4 ADD TABLE ONLY dump_test.test_second_table WHERE ((col2 = 'test'::text));\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE SCHEMA public' => {
+ regexp => qr/^CREATE SCHEMA public;/m,
+
+ # this shouldn't ever get emitted anymore
+ like => {},
+ },
+
+ 'CREATE SCHEMA dump_test' => {
+ create_order => 2,
+ create_sql => 'CREATE SCHEMA dump_test;',
+ regexp => qr/^CREATE SCHEMA dump_test;/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE SCHEMA dump_test_second_schema' => {
+ create_order => 9,
+ create_sql => 'CREATE SCHEMA dump_test_second_schema;',
+ regexp => qr/^CREATE SCHEMA dump_test_second_schema;/m,
+ like => {
+ %full_runs,
+ role => 1,
+ section_pre_data => 1,
+ },
+ },
+
+ 'CREATE TABLE test_table' => {
+ create_order => 3,
+ create_sql => 'CREATE TABLE dump_test.test_table (
+ col1 serial primary key,
+ col2 text COMPRESSION pglz,
+ col3 text,
+ col4 text,
+ CHECK (col1 <= 1000)
+ ) WITH (autovacuum_enabled = false, fillfactor=80);
+ COMMENT ON CONSTRAINT test_table_col1_check
+ ON dump_test.test_table IS \'bounds check\';',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_table (\E\n
+ \s+\Qcol1 integer NOT NULL,\E\n
+ \s+\Qcol2 text,\E\n
+ \s+\Qcol3 text,\E\n
+ \s+\Qcol4 text,\E\n
+ \s+\QCONSTRAINT test_table_col1_check CHECK ((col1 <= 1000))\E\n
+ \Q)\E\n
+ \QWITH (autovacuum_enabled='false', fillfactor='80');\E\n(.|\n)*
+ \QCOMMENT ON CONSTRAINT test_table_col1_check ON dump_test.test_table IS 'bounds check';\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'CREATE TABLE fk_reference_test_table' => {
+ create_order => 21,
+ create_sql => 'CREATE TABLE dump_test.fk_reference_test_table (
+ col1 int primary key references dump_test.test_table
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.fk_reference_test_table (\E
+ \n\s+\Qcol1 integer NOT NULL\E
+ \n\);
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TABLE test_second_table' => {
+ create_order => 6,
+ create_sql => 'CREATE TABLE dump_test.test_second_table (
+ col1 int,
+ col2 text
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_second_table (\E
+ \n\s+\Qcol1 integer,\E
+ \n\s+\Qcol2 text\E
+ \n\);
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TABLE test_compression' => {
+ create_order => 3,
+ create_sql => 'CREATE TABLE dump_test.test_compression (
+ col1 int,
+ col2 text COMPRESSION lz4
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_compression (\E\n
+ \s+\Qcol1 integer,\E\n
+ \s+\Qcol2 text\E\n
+ \);\n
+ .*
+ \QALTER TABLE ONLY dump_test.test_compression ALTER COLUMN col2 SET COMPRESSION lz4;\E\n
+ /xms,
+ lz4 => 1,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike =>
+ { exclude_dump_test_schema => 1, no_toast_compression => 1, },
+ },
+
+ 'CREATE TABLE measurement PARTITIONED BY' => {
+ create_order => 90,
+ create_sql => 'CREATE TABLE dump_test.measurement (
+ city_id serial not null,
+ logdate date not null,
+ peaktemp int CHECK (peaktemp >= -460),
+ unitsales int
+ ) PARTITION BY RANGE (logdate);',
+ regexp => qr/^
+ \Q-- Name: measurement;\E.*\n
+ \Q--\E\n\n
+ \QCREATE TABLE dump_test.measurement (\E\n
+ \s+\Qcity_id integer NOT NULL,\E\n
+ \s+\Qlogdate date NOT NULL,\E\n
+ \s+\Qpeaktemp integer,\E\n
+ \s+\Qunitsales integer,\E\n
+ \s+\QCONSTRAINT measurement_peaktemp_check CHECK ((peaktemp >= '-460'::integer))\E\n
+ \)\n
+ \QPARTITION BY RANGE (logdate);\E\n
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ },
+ },
+
+ 'Partition measurement_y2006m2 creation' => {
+ create_order => 91,
+ create_sql =>
+ 'CREATE TABLE dump_test_second_schema.measurement_y2006m2
+ PARTITION OF dump_test.measurement (
+ unitsales DEFAULT 0 CHECK (unitsales >= 0)
+ )
+ FOR VALUES FROM (\'2006-02-01\') TO (\'2006-03-01\');',
+ regexp => qr/^
+ \QCREATE TABLE dump_test_second_schema.measurement_y2006m2 (\E\n
+ \s+\Qcity_id integer DEFAULT nextval('dump_test.measurement_city_id_seq'::regclass) NOT NULL,\E\n
+ \s+\Qlogdate date NOT NULL,\E\n
+ \s+\Qpeaktemp integer,\E\n
+ \s+\Qunitsales integer DEFAULT 0,\E\n
+ \s+\QCONSTRAINT measurement_peaktemp_check CHECK ((peaktemp >= '-460'::integer)),\E\n
+ \s+\QCONSTRAINT measurement_y2006m2_unitsales_check CHECK ((unitsales >= 0))\E\n
+ \);\n
+ /xm,
+ like => {
+ %full_runs,
+ section_pre_data => 1,
+ role => 1,
+ binary_upgrade => 1,
+ },
+ },
+
+ 'Creation of row-level trigger in partitioned table' => {
+ create_order => 92,
+ create_sql => 'CREATE TRIGGER test_trigger
+ AFTER INSERT ON dump_test.measurement
+ FOR EACH ROW EXECUTE PROCEDURE dump_test.trigger_func()',
+ regexp => qr/^
+ \QCREATE TRIGGER test_trigger AFTER INSERT ON dump_test.measurement \E
+ \QFOR EACH ROW \E
+ \QEXECUTE FUNCTION dump_test.trigger_func();\E
+ /xm,
+ like => {
+ %full_runs, %dump_test_schema_runs, section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ },
+ },
+
+ 'Disabled trigger on partition is altered' => {
+ create_order => 93,
+ create_sql =>
+ 'CREATE TABLE dump_test_second_schema.measurement_y2006m3
+ PARTITION OF dump_test.measurement
+ FOR VALUES FROM (\'2006-03-01\') TO (\'2006-04-01\');
+ ALTER TABLE dump_test_second_schema.measurement_y2006m3 DISABLE TRIGGER test_trigger;
+ CREATE TABLE dump_test_second_schema.measurement_y2006m4
+ PARTITION OF dump_test.measurement
+ FOR VALUES FROM (\'2006-04-01\') TO (\'2006-05-01\');
+ ALTER TABLE dump_test_second_schema.measurement_y2006m4 ENABLE REPLICA TRIGGER test_trigger;
+ CREATE TABLE dump_test_second_schema.measurement_y2006m5
+ PARTITION OF dump_test.measurement
+ FOR VALUES FROM (\'2006-05-01\') TO (\'2006-06-01\');
+ ALTER TABLE dump_test_second_schema.measurement_y2006m5 ENABLE ALWAYS TRIGGER test_trigger;
+ ',
+ regexp => qr/^
+ \QALTER TABLE dump_test_second_schema.measurement_y2006m3 DISABLE TRIGGER test_trigger;\E
+ /xm,
+ like => {
+ %full_runs,
+ section_post_data => 1,
+ role => 1,
+ binary_upgrade => 1,
+ },
+ },
+
+ 'Replica trigger on partition is altered' => {
+ regexp => qr/^
+ \QALTER TABLE dump_test_second_schema.measurement_y2006m4 ENABLE REPLICA TRIGGER test_trigger;\E
+ /xm,
+ like => {
+ %full_runs,
+ section_post_data => 1,
+ role => 1,
+ binary_upgrade => 1,
+ },
+ },
+
+ 'Always trigger on partition is altered' => {
+ regexp => qr/^
+ \QALTER TABLE dump_test_second_schema.measurement_y2006m5 ENABLE ALWAYS TRIGGER test_trigger;\E
+ /xm,
+ like => {
+ %full_runs,
+ section_post_data => 1,
+ role => 1,
+ binary_upgrade => 1,
+ },
+ },
+
+ # We should never see the creation of a trigger on a partition
+ 'Disabled trigger on partition is not created' => {
+ regexp => qr/CREATE TRIGGER test_trigger.*ON dump_test_second_schema/,
+ like => {},
+ unlike => { %full_runs, %dump_test_schema_runs },
+ },
+
+ # Triggers on partitions should not be dropped individually
+ 'Triggers on partitions are not dropped' => {
+ regexp => qr/DROP TRIGGER test_trigger.*ON dump_test_second_schema/,
+ like => {}
+ },
+
+ 'CREATE TABLE test_third_table_generated_cols' => {
+ create_order => 6,
+ create_sql => 'CREATE TABLE dump_test.test_third_table (
+ f1 int, junk int,
+ g1 int generated always as (f1 * 2) stored,
+ "F3" int,
+ g2 int generated always as ("F3" * 3) stored
+ );
+ ALTER TABLE dump_test.test_third_table DROP COLUMN junk;',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_third_table (\E\n
+ \s+\Qf1 integer,\E\n
+ \s+\Qg1 integer GENERATED ALWAYS AS ((f1 * 2)) STORED,\E\n
+ \s+\Q"F3" integer,\E\n
+ \s+\Qg2 integer GENERATED ALWAYS AS (("F3" * 3)) STORED\E\n
+ \);\n
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { binary_upgrade => 1, exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TABLE test_fourth_table_zero_col' => {
+ create_order => 6,
+ create_sql => 'CREATE TABLE dump_test.test_fourth_table (
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_fourth_table (\E
+ \n\);
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TABLE test_fifth_table' => {
+ create_order => 53,
+ create_sql => 'CREATE TABLE dump_test.test_fifth_table (
+ col1 integer,
+ col2 boolean,
+ col3 boolean,
+ col4 bit(5),
+ col5 float8
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_fifth_table (\E
+ \n\s+\Qcol1 integer,\E
+ \n\s+\Qcol2 boolean,\E
+ \n\s+\Qcol3 boolean,\E
+ \n\s+\Qcol4 bit(5),\E
+ \n\s+\Qcol5 double precision\E
+ \n\);
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TABLE test_sixth_table' => {
+ create_order => 6,
+ create_sql => 'CREATE TABLE dump_test.test_sixth_table (
+ col1 int,
+ col2 text,
+ col3 bytea
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_sixth_table (\E
+ \n\s+\Qcol1 integer,\E
+ \n\s+\Qcol2 text,\E
+ \n\s+\Qcol3 bytea\E
+ \n\);
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TABLE test_seventh_table' => {
+ create_order => 6,
+ create_sql => 'CREATE TABLE dump_test.test_seventh_table (
+ col1 int,
+ col2 text,
+ col3 bytea
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_seventh_table (\E
+ \n\s+\Qcol1 integer,\E
+ \n\s+\Qcol2 text,\E
+ \n\s+\Qcol3 bytea\E
+ \n\);
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TABLE test_table_identity' => {
+ create_order => 3,
+ create_sql => 'CREATE TABLE dump_test.test_table_identity (
+ col1 int generated always as identity primary key,
+ col2 text
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_table_identity (\E\n
+ \s+\Qcol1 integer NOT NULL,\E\n
+ \s+\Qcol2 text\E\n
+ \);
+ .*
+ \QALTER TABLE dump_test.test_table_identity ALTER COLUMN col1 ADD GENERATED ALWAYS AS IDENTITY (\E\n
+ \s+\QSEQUENCE NAME dump_test.test_table_identity_col1_seq\E\n
+ \s+\QSTART WITH 1\E\n
+ \s+\QINCREMENT BY 1\E\n
+ \s+\QNO MINVALUE\E\n
+ \s+\QNO MAXVALUE\E\n
+ \s+\QCACHE 1\E\n
+ \);
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TABLE test_table_generated' => {
+ create_order => 3,
+ create_sql => 'CREATE TABLE dump_test.test_table_generated (
+ col1 int primary key,
+ col2 int generated always as (col1 * 2) stored
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_table_generated (\E\n
+ \s+\Qcol1 integer NOT NULL,\E\n
+ \s+\Qcol2 integer GENERATED ALWAYS AS ((col1 * 2)) STORED\E\n
+ \);
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TABLE test_table_generated_child1 (without local columns)' => {
+ create_order => 4,
+ create_sql => 'CREATE TABLE dump_test.test_table_generated_child1 ()
+ INHERITS (dump_test.test_table_generated);',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_table_generated_child1 (\E\n
+ \)\n
+ \QINHERITS (dump_test.test_table_generated);\E\n
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ },
+ },
+
+ 'ALTER TABLE test_table_generated_child1' => {
+ regexp =>
+ qr/^\QALTER TABLE ONLY dump_test.test_table_generated_child1 ALTER COLUMN col2 \E/m,
+
+ # should not get emitted
+ like => {},
+ },
+
+ 'CREATE TABLE test_table_generated_child2 (with local columns)' => {
+ create_order => 4,
+ create_sql => 'CREATE TABLE dump_test.test_table_generated_child2 (
+ col1 int,
+ col2 int
+ ) INHERITS (dump_test.test_table_generated);',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_table_generated_child2 (\E\n
+ \s+\Qcol1 integer,\E\n
+ \s+\Qcol2 integer\E\n
+ \)\n
+ \QINHERITS (dump_test.test_table_generated);\E\n
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ },
+ },
+
+ 'CREATE TABLE table_with_stats' => {
+ create_order => 98,
+ create_sql => 'CREATE TABLE dump_test.table_index_stats (
+ col1 int,
+ col2 int,
+ col3 int);
+ CREATE INDEX index_with_stats
+ ON dump_test.table_index_stats
+ ((col1 + 1), col1, (col2 + 1), (col3 + 1));
+ ALTER INDEX dump_test.index_with_stats
+ ALTER COLUMN 1 SET STATISTICS 400;
+ ALTER INDEX dump_test.index_with_stats
+ ALTER COLUMN 3 SET STATISTICS 500;',
+ regexp => qr/^
+ \QALTER INDEX dump_test.index_with_stats ALTER COLUMN 1 SET STATISTICS 400;\E\n
+ \QALTER INDEX dump_test.index_with_stats ALTER COLUMN 3 SET STATISTICS 500;\E\n
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TABLE test_inheritance_parent' => {
+ create_order => 90,
+ create_sql => 'CREATE TABLE dump_test.test_inheritance_parent (
+ col1 int NOT NULL,
+ col2 int CHECK (col2 >= 42)
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_inheritance_parent (\E\n
+ \s+\Qcol1 integer NOT NULL,\E\n
+ \s+\Qcol2 integer,\E\n
+ \s+\QCONSTRAINT test_inheritance_parent_col2_check CHECK ((col2 >= 42))\E\n
+ \Q);\E\n
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE TABLE test_inheritance_child' => {
+ create_order => 91,
+ create_sql => 'CREATE TABLE dump_test.test_inheritance_child (
+ col1 int NOT NULL,
+ CONSTRAINT test_inheritance_child CHECK (col2 >= 142857)
+ ) INHERITS (dump_test.test_inheritance_parent);',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_inheritance_child (\E\n
+ \s+\Qcol1 integer,\E\n
+ \s+\QCONSTRAINT test_inheritance_child CHECK ((col2 >= 142857))\E\n
+ \)\n
+ \QINHERITS (dump_test.test_inheritance_parent);\E\n
+ /xm,
+ like => {
+ %full_runs, %dump_test_schema_runs, section_pre_data => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ },
+ },
+
+ 'CREATE STATISTICS extended_stats_no_options' => {
+ create_order => 97,
+ create_sql => 'CREATE STATISTICS dump_test.test_ext_stats_no_options
+ ON col1, col2 FROM dump_test.test_fifth_table',
+ regexp => qr/^
+ \QCREATE STATISTICS dump_test.test_ext_stats_no_options ON col1, col2 FROM dump_test.test_fifth_table;\E
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE STATISTICS extended_stats_options' => {
+ create_order => 97,
+ create_sql => 'CREATE STATISTICS dump_test.test_ext_stats_opts
+ (ndistinct) ON col1, col2 FROM dump_test.test_fifth_table',
+ regexp => qr/^
+ \QCREATE STATISTICS dump_test.test_ext_stats_opts (ndistinct) ON col1, col2 FROM dump_test.test_fifth_table;\E
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'ALTER STATISTICS extended_stats_options' => {
+ create_order => 98,
+ create_sql =>
+ 'ALTER STATISTICS dump_test.test_ext_stats_opts SET STATISTICS 1000',
+ regexp => qr/^
+ \QALTER STATISTICS dump_test.test_ext_stats_opts SET STATISTICS 1000;\E
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE STATISTICS extended_stats_expression' => {
+ create_order => 99,
+ create_sql => 'CREATE STATISTICS dump_test.test_ext_stats_expr
+ ON (2 * col1) FROM dump_test.test_fifth_table',
+ regexp => qr/^
+ \QCREATE STATISTICS dump_test.test_ext_stats_expr ON (2 * col1) FROM dump_test.test_fifth_table;\E
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE SEQUENCE test_table_col1_seq' => {
+ regexp => qr/^
+ \QCREATE SEQUENCE dump_test.test_table_col1_seq\E
+ \n\s+\QAS integer\E
+ \n\s+\QSTART WITH 1\E
+ \n\s+\QINCREMENT BY 1\E
+ \n\s+\QNO MINVALUE\E
+ \n\s+\QNO MAXVALUE\E
+ \n\s+\QCACHE 1;\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE INDEX ON ONLY measurement' => {
+ create_order => 92,
+ create_sql =>
+ 'CREATE INDEX ON dump_test.measurement (city_id, logdate);',
+ regexp => qr/^
+ \QCREATE INDEX measurement_city_id_logdate_idx ON ONLY dump_test.measurement USING\E
+ /xm,
+ like => {
+ binary_upgrade => 1,
+ clean => 1,
+ clean_if_exists => 1,
+ compression => 1,
+ createdb => 1,
+ defaults => 1,
+ exclude_test_table => 1,
+ exclude_test_table_data => 1,
+ no_toast_compression => 1,
+ no_blobs => 1,
+ no_privs => 1,
+ no_owner => 1,
+ no_table_access_method => 1,
+ only_dump_test_schema => 1,
+ pg_dumpall_dbprivs => 1,
+ pg_dumpall_exclude => 1,
+ schema_only => 1,
+ section_post_data => 1,
+ test_schema_plus_blobs => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_test_table => 1,
+ pg_dumpall_globals => 1,
+ pg_dumpall_globals_clean => 1,
+ role => 1,
+ section_pre_data => 1,
+ },
+ },
+
+ 'ALTER TABLE measurement PRIMARY KEY' => {
+ all_runs => 1,
+ catch_all => 'CREATE ... commands',
+ create_order => 93,
+ create_sql =>
+ 'ALTER TABLE dump_test.measurement ADD PRIMARY KEY (city_id, logdate);',
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.measurement\E \n^\s+
+ \QADD CONSTRAINT measurement_pkey PRIMARY KEY (city_id, logdate);\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE INDEX ... ON measurement_y2006_m2' => {
+ regexp => qr/^
+ \QCREATE INDEX measurement_y2006m2_city_id_logdate_idx ON dump_test_second_schema.measurement_y2006m2 \E
+ /xm,
+ like => {
+ %full_runs,
+ role => 1,
+ section_post_data => 1,
+ },
+ },
+
+ 'ALTER INDEX ... ATTACH PARTITION' => {
+ regexp => qr/^
+ \QALTER INDEX dump_test.measurement_city_id_logdate_idx ATTACH PARTITION dump_test_second_schema.measurement_y2006m2_city_id_logdate_idx\E
+ /xm,
+ like => {
+ %full_runs,
+ role => 1,
+ section_post_data => 1,
+ },
+ },
+
+ 'ALTER INDEX ... ATTACH PARTITION (primary key)' => {
+ all_runs => 1,
+ catch_all => 'CREATE ... commands',
+ regexp => qr/^
+ \QALTER INDEX dump_test.measurement_pkey ATTACH PARTITION dump_test_second_schema.measurement_y2006m2_pkey\E
+ /xm,
+ like => {
+ binary_upgrade => 1,
+ clean => 1,
+ clean_if_exists => 1,
+ compression => 1,
+ createdb => 1,
+ defaults => 1,
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ exclude_test_table_data => 1,
+ no_toast_compression => 1,
+ no_blobs => 1,
+ no_privs => 1,
+ no_owner => 1,
+ no_table_access_method => 1,
+ pg_dumpall_dbprivs => 1,
+ pg_dumpall_exclude => 1,
+ role => 1,
+ schema_only => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ only_dump_test_schema => 1,
+ only_dump_test_table => 1,
+ pg_dumpall_globals => 1,
+ pg_dumpall_globals_clean => 1,
+ section_pre_data => 1,
+ test_schema_plus_blobs => 1,
+ },
+ },
+
+ 'CREATE VIEW test_view' => {
+ create_order => 61,
+ create_sql => 'CREATE VIEW dump_test.test_view
+ WITH (check_option = \'local\', security_barrier = true) AS
+ SELECT col1 FROM dump_test.test_table;',
+ regexp => qr/^
+ \QCREATE VIEW dump_test.test_view WITH (security_barrier='true') AS\E
+ \n\s+\QSELECT test_table.col1\E
+ \n\s+\QFROM dump_test.test_table\E
+ \n\s+\QWITH LOCAL CHECK OPTION;\E/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'ALTER VIEW test_view SET DEFAULT' => {
+ create_order => 62,
+ create_sql =>
+ 'ALTER VIEW dump_test.test_view ALTER COLUMN col1 SET DEFAULT 1;',
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.test_view ALTER COLUMN col1 SET DEFAULT 1;\E/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ # FIXME
+ 'DROP SCHEMA public (for testing without public schema)' => {
+ database => 'regress_pg_dump_test',
+ create_order => 100,
+ create_sql => 'DROP SCHEMA public;',
+ regexp => qr/^DROP SCHEMA public;/m,
+ like => {},
+ },
+
+ 'DROP SCHEMA public' => {
+ regexp => qr/^DROP SCHEMA public;/m,
+
+ # this shouldn't ever get emitted anymore
+ like => {},
+ },
+
+ 'DROP SCHEMA IF EXISTS public' => {
+ regexp => qr/^DROP SCHEMA IF EXISTS public;/m,
+
+ # this shouldn't ever get emitted anymore
+ like => {},
+ },
+
+ 'DROP EXTENSION plpgsql' => {
+ regexp => qr/^DROP EXTENSION plpgsql;/m,
+
+ # this shouldn't ever get emitted anymore
+ like => {},
+ },
+
+ 'DROP FUNCTION dump_test.pltestlang_call_handler()' => {
+ regexp => qr/^DROP FUNCTION dump_test\.pltestlang_call_handler\(\);/m,
+ like => { clean => 1, },
+ },
+
+ 'DROP LANGUAGE pltestlang' => {
+ regexp => qr/^DROP PROCEDURAL LANGUAGE pltestlang;/m,
+ like => { clean => 1, },
+ },
+
+ 'DROP SCHEMA dump_test' => {
+ regexp => qr/^DROP SCHEMA dump_test;/m,
+ like => { clean => 1, },
+ },
+
+ 'DROP SCHEMA dump_test_second_schema' => {
+ regexp => qr/^DROP SCHEMA dump_test_second_schema;/m,
+ like => { clean => 1, },
+ },
+
+ 'DROP TABLE test_table' => {
+ regexp => qr/^DROP TABLE dump_test\.test_table;/m,
+ like => { clean => 1, },
+ },
+
+ 'DROP TABLE fk_reference_test_table' => {
+ regexp => qr/^DROP TABLE dump_test\.fk_reference_test_table;/m,
+ like => { clean => 1, },
+ },
+
+ 'DROP TABLE test_second_table' => {
+ regexp => qr/^DROP TABLE dump_test\.test_second_table;/m,
+ like => { clean => 1, },
+ },
+
+ 'DROP EXTENSION IF EXISTS plpgsql' => {
+ regexp => qr/^DROP EXTENSION IF EXISTS plpgsql;/m,
+
+ # this shouldn't ever get emitted anymore
+ like => {},
+ },
+
+ 'DROP FUNCTION IF EXISTS dump_test.pltestlang_call_handler()' => {
+ regexp => qr/^
+ \QDROP FUNCTION IF EXISTS dump_test.pltestlang_call_handler();\E
+ /xm,
+ like => { clean_if_exists => 1, },
+ },
+
+ 'DROP LANGUAGE IF EXISTS pltestlang' => {
+ regexp => qr/^DROP PROCEDURAL LANGUAGE IF EXISTS pltestlang;/m,
+ like => { clean_if_exists => 1, },
+ },
+
+ 'DROP SCHEMA IF EXISTS dump_test' => {
+ regexp => qr/^DROP SCHEMA IF EXISTS dump_test;/m,
+ like => { clean_if_exists => 1, },
+ },
+
+ 'DROP SCHEMA IF EXISTS dump_test_second_schema' => {
+ regexp => qr/^DROP SCHEMA IF EXISTS dump_test_second_schema;/m,
+ like => { clean_if_exists => 1, },
+ },
+
+ 'DROP TABLE IF EXISTS test_table' => {
+ regexp => qr/^DROP TABLE IF EXISTS dump_test\.test_table;/m,
+ like => { clean_if_exists => 1, },
+ },
+
+ 'DROP TABLE IF EXISTS test_second_table' => {
+ regexp => qr/^DROP TABLE IF EXISTS dump_test\.test_second_table;/m,
+ like => { clean_if_exists => 1, },
+ },
+
+ 'DROP ROLE regress_dump_test_role' => {
+ regexp => qr/^
+ \QDROP ROLE regress_dump_test_role;\E
+ /xm,
+ like => { pg_dumpall_globals_clean => 1, },
+ },
+
+ 'DROP ROLE pg_' => {
+ regexp => qr/^
+ \QDROP ROLE pg_\E.+;
+ /xm,
+
+ # this shouldn't ever get emitted anywhere
+ like => {},
+ },
+
+ 'GRANT USAGE ON SCHEMA dump_test_second_schema' => {
+ create_order => 10,
+ create_sql => 'GRANT USAGE ON SCHEMA dump_test_second_schema
+ TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT USAGE ON SCHEMA dump_test_second_schema TO regress_dump_test_role;\E
+ /xm,
+ like => {
+ %full_runs,
+ role => 1,
+ section_pre_data => 1,
+ },
+ unlike => { no_privs => 1, },
+ },
+
+ 'GRANT USAGE ON FOREIGN DATA WRAPPER dummy' => {
+ create_order => 85,
+ create_sql => 'GRANT USAGE ON FOREIGN DATA WRAPPER dummy
+ TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT ALL ON FOREIGN DATA WRAPPER dummy TO regress_dump_test_role;\E
+ /xm,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ 'GRANT USAGE ON FOREIGN SERVER s1' => {
+ create_order => 85,
+ create_sql => 'GRANT USAGE ON FOREIGN SERVER s1
+ TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT ALL ON FOREIGN SERVER s1 TO regress_dump_test_role;\E
+ /xm,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ 'GRANT USAGE ON DOMAIN dump_test.us_postal_code' => {
+ create_order => 72,
+ create_sql =>
+ 'GRANT USAGE ON DOMAIN dump_test.us_postal_code TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT ALL ON TYPE dump_test.us_postal_code TO regress_dump_test_role;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_privs => 1,
+ },
+ },
+
+ 'GRANT USAGE ON TYPE dump_test.int42' => {
+ create_order => 87,
+ create_sql =>
+ 'GRANT USAGE ON TYPE dump_test.int42 TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT ALL ON TYPE dump_test.int42 TO regress_dump_test_role;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_privs => 1,
+ },
+ },
+
+ 'GRANT USAGE ON TYPE dump_test.planets - ENUM' => {
+ create_order => 66,
+ create_sql =>
+ 'GRANT USAGE ON TYPE dump_test.planets TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT ALL ON TYPE dump_test.planets TO regress_dump_test_role;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_privs => 1,
+ },
+ },
+
+ 'GRANT USAGE ON TYPE dump_test.textrange - RANGE' => {
+ create_order => 67,
+ create_sql =>
+ 'GRANT USAGE ON TYPE dump_test.textrange TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT ALL ON TYPE dump_test.textrange TO regress_dump_test_role;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_privs => 1,
+ },
+ },
+
+ 'GRANT CREATE ON DATABASE dump_test' => {
+ create_order => 48,
+ create_sql =>
+ 'GRANT CREATE ON DATABASE dump_test TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT CREATE ON DATABASE dump_test TO regress_dump_test_role;\E
+ /xm,
+ like => { pg_dumpall_dbprivs => 1, },
+ },
+
+ 'GRANT SELECT ON TABLE test_table' => {
+ create_order => 5,
+ create_sql => 'GRANT SELECT ON TABLE dump_test.test_table
+ TO regress_dump_test_role;',
+ regexp =>
+ qr/^\QGRANT SELECT ON TABLE dump_test.test_table TO regress_dump_test_role;\E/m,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ no_privs => 1,
+ },
+ },
+
+ 'GRANT SELECT ON TABLE measurement' => {
+ create_order => 91,
+ create_sql => 'GRANT SELECT ON TABLE dump_test.measurement
+ TO regress_dump_test_role;
+ GRANT SELECT(city_id) ON TABLE dump_test.measurement
+ TO "regress_quoted \"" role";',
+ regexp =>
+ qr/^\QGRANT SELECT ON TABLE dump_test.measurement TO regress_dump_test_role;\E\n.*
+ ^\QGRANT SELECT(city_id) ON TABLE dump_test.measurement TO "regress_quoted \"" role";\E/xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_privs => 1,
+ },
+ },
+
+ 'GRANT SELECT ON TABLE measurement_y2006m2' => {
+ create_order => 94,
+ create_sql => 'GRANT SELECT ON TABLE
+ dump_test_second_schema.measurement_y2006m2,
+ dump_test_second_schema.measurement_y2006m3,
+ dump_test_second_schema.measurement_y2006m4,
+ dump_test_second_schema.measurement_y2006m5
+ TO regress_dump_test_role;',
+ regexp =>
+ qr/^\QGRANT SELECT ON TABLE dump_test_second_schema.measurement_y2006m2 TO regress_dump_test_role;\E/m,
+ like => {
+ %full_runs,
+ role => 1,
+ section_pre_data => 1,
+ },
+ unlike => { no_privs => 1, },
+ },
+
+ 'GRANT ALL ON LARGE OBJECT ...' => {
+ create_order => 60,
+ create_sql => 'DO $$
+ DECLARE myoid oid;
+ BEGIN
+ SELECT loid FROM pg_largeobject INTO myoid;
+ EXECUTE \'GRANT ALL ON LARGE OBJECT \' || myoid || \' TO regress_dump_test_role;\';
+ END;
+ $$;',
+ regexp => qr/^
+ \QGRANT ALL ON LARGE OBJECT \E[0-9]+\Q TO regress_dump_test_role;\E
+ /xm,
+ like => {
+ %full_runs,
+ column_inserts => 1,
+ data_only => 1,
+ inserts => 1,
+ section_pre_data => 1,
+ test_schema_plus_blobs => 1,
+ binary_upgrade => 1,
+ },
+ unlike => {
+ no_blobs => 1,
+ no_privs => 1,
+ schema_only => 1,
+ },
+ },
+
+ 'GRANT INSERT(col1) ON TABLE test_second_table' => {
+ create_order => 8,
+ create_sql =>
+ 'GRANT INSERT (col1) ON TABLE dump_test.test_second_table
+ TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT INSERT(col1) ON TABLE dump_test.test_second_table TO regress_dump_test_role;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_privs => 1,
+ },
+ },
+
+ 'GRANT EXECUTE ON FUNCTION pg_sleep() TO regress_dump_test_role' => {
+ create_order => 16,
+ create_sql => 'GRANT EXECUTE ON FUNCTION pg_sleep(float8)
+ TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT ALL ON FUNCTION pg_catalog.pg_sleep(double precision) TO regress_dump_test_role;\E
+ /xm,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ 'GRANT SELECT (proname ...) ON TABLE pg_proc TO public' => {
+ create_order => 46,
+ create_sql => 'GRANT SELECT (
+ tableoid,
+ oid,
+ proname,
+ pronamespace,
+ proowner,
+ prolang,
+ procost,
+ prorows,
+ provariadic,
+ prosupport,
+ prokind,
+ prosecdef,
+ proleakproof,
+ proisstrict,
+ proretset,
+ provolatile,
+ proparallel,
+ pronargs,
+ pronargdefaults,
+ prorettype,
+ proargtypes,
+ proallargtypes,
+ proargmodes,
+ proargnames,
+ proargdefaults,
+ protrftypes,
+ prosrc,
+ probin,
+ proconfig,
+ proacl
+ ) ON TABLE pg_proc TO public;',
+ regexp => qr/
+ \QGRANT SELECT(tableoid) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(oid) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proname) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(pronamespace) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proowner) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(prolang) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(procost) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(prorows) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(provariadic) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(prosupport) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(prokind) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(prosecdef) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proleakproof) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proisstrict) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proretset) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(provolatile) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proparallel) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(pronargs) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(pronargdefaults) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(prorettype) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proargtypes) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proallargtypes) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proargmodes) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proargnames) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proargdefaults) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(protrftypes) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(prosrc) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(probin) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proconfig) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proacl) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E/xms,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ 'GRANT USAGE ON SCHEMA public TO public' => {
+ regexp => qr/^
+ \Q--\E\n\n
+ \QGRANT USAGE ON SCHEMA public TO PUBLIC;\E
+ /xm,
+
+ # this shouldn't ever get emitted anymore
+ like => {},
+ },
+
+ 'REFRESH MATERIALIZED VIEW matview' => {
+ regexp => qr/^\QREFRESH MATERIALIZED VIEW dump_test.matview;\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ },
+ },
+
+ 'REFRESH MATERIALIZED VIEW matview_second' => {
+ regexp => qr/^
+ \QREFRESH MATERIALIZED VIEW dump_test.matview;\E
+ \n.*
+ \QREFRESH MATERIALIZED VIEW dump_test.matview_second;\E
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ },
+ },
+
+ # FIXME
+ 'REFRESH MATERIALIZED VIEW matview_third' => {
+ regexp => qr/^
+ \QREFRESH MATERIALIZED VIEW dump_test.matview_third;\E
+ /xms,
+ like => {},
+ },
+
+ # FIXME
+ 'REFRESH MATERIALIZED VIEW matview_fourth' => {
+ regexp => qr/^
+ \QREFRESH MATERIALIZED VIEW dump_test.matview_fourth;\E
+ /xms,
+ like => {},
+ },
+
+ 'REVOKE CONNECT ON DATABASE dump_test FROM public' => {
+ create_order => 49,
+ create_sql => 'REVOKE CONNECT ON DATABASE dump_test FROM public;',
+ regexp => qr/^
+ \QREVOKE CONNECT,TEMPORARY ON DATABASE dump_test FROM PUBLIC;\E\n
+ \QGRANT TEMPORARY ON DATABASE dump_test TO PUBLIC;\E\n
+ \QGRANT CREATE ON DATABASE dump_test TO regress_dump_test_role;\E
+ /xm,
+ like => { pg_dumpall_dbprivs => 1, },
+ },
+
+ 'REVOKE EXECUTE ON FUNCTION pg_sleep() FROM public' => {
+ create_order => 15,
+ create_sql => 'REVOKE EXECUTE ON FUNCTION pg_sleep(float8)
+ FROM public;',
+ regexp => qr/^
+ \QREVOKE ALL ON FUNCTION pg_catalog.pg_sleep(double precision) FROM PUBLIC;\E
+ /xm,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ # With the exception of the public schema, we don't dump ownership changes
+ # for objects originating at initdb. Hence, any GRANT or REVOKE affecting
+ # owner privileges for those objects should reference the bootstrap
+ # superuser, not the dump-time owner.
+ 'REVOKE EXECUTE ON FUNCTION pg_stat_reset FROM regress_dump_test_role' =>
+ {
+ create_order => 15,
+ create_sql => '
+ ALTER FUNCTION pg_stat_reset OWNER TO regress_dump_test_role;
+ REVOKE EXECUTE ON FUNCTION pg_stat_reset
+ FROM regress_dump_test_role;',
+ regexp => qr/^[^-].*pg_stat_reset.* regress_dump_test_role/m,
+
+ # this shouldn't ever get emitted
+ like => {},
+ },
+
+ 'REVOKE SELECT ON TABLE pg_proc FROM public' => {
+ create_order => 45,
+ create_sql => 'REVOKE SELECT ON TABLE pg_proc FROM public;',
+ regexp =>
+ qr/^\QREVOKE SELECT ON TABLE pg_catalog.pg_proc FROM PUBLIC;\E/m,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ 'REVOKE ALL ON SCHEMA public' => {
+ create_order => 16,
+ create_sql =>
+ 'REVOKE ALL ON SCHEMA public FROM "regress_quoted \"" role";',
+ regexp =>
+ qr/^REVOKE ALL ON SCHEMA public FROM "regress_quoted \\"" role";/m,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ 'REVOKE USAGE ON LANGUAGE plpgsql FROM public' => {
+ create_order => 16,
+ create_sql => 'REVOKE USAGE ON LANGUAGE plpgsql FROM public;',
+ regexp => qr/^REVOKE ALL ON LANGUAGE plpgsql FROM PUBLIC;/m,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ role => 1,
+ section_pre_data => 1,
+ },
+ unlike => { no_privs => 1, },
+ },
+
+
+ 'CREATE ACCESS METHOD regress_test_table_am' => {
+ create_order => 11,
+ create_sql =>
+ 'CREATE ACCESS METHOD regress_table_am TYPE TABLE HANDLER heap_tableam_handler;',
+ regexp => qr/^
+ \QCREATE ACCESS METHOD regress_table_am TYPE TABLE HANDLER heap_tableam_handler;\E
+ \n/xm,
+ like => {
+ %full_runs, section_pre_data => 1,
+ },
+ },
+
+ # It's a bit tricky to ensure that the proper SET of default table
+ # AM occurs. To achieve that we create a table with the standard
+ # AM, test AM, standard AM. That guarantees that there needs to be
+ # a SET interspersed. Then use a regex that prevents interspersed
+ # SET ...; statements, followed by the expected CREATE TABLE. Not
+ # pretty, but seems hard to do better in this framework.
+ 'CREATE TABLE regress_pg_dump_table_am' => {
+ create_order => 12,
+ create_sql => '
+ CREATE TABLE dump_test.regress_pg_dump_table_am_0() USING heap;
+ CREATE TABLE dump_test.regress_pg_dump_table_am_1 (col1 int) USING regress_table_am;
+ CREATE TABLE dump_test.regress_pg_dump_table_am_2() USING heap;',
+ regexp => qr/^
+ \QSET default_table_access_method = regress_table_am;\E
+ (\n(?!SET[^;]+;)[^\n]*)*
+ \n\QCREATE TABLE dump_test.regress_pg_dump_table_am_1 (\E
+ \n\s+\Qcol1 integer\E
+ \n\);/xm,
+ like => {
+ %full_runs, %dump_test_schema_runs, section_pre_data => 1,
+ },
+ unlike =>
+ { exclude_dump_test_schema => 1, no_table_access_method => 1 },
+ },
+
+ 'CREATE MATERIALIZED VIEW regress_pg_dump_matview_am' => {
+ create_order => 13,
+ create_sql => '
+ CREATE MATERIALIZED VIEW dump_test.regress_pg_dump_matview_am_0 USING heap AS SELECT 1;
+ CREATE MATERIALIZED VIEW dump_test.regress_pg_dump_matview_am_1
+ USING regress_table_am AS SELECT count(*) FROM pg_class;
+ CREATE MATERIALIZED VIEW dump_test.regress_pg_dump_matview_am_2 USING heap AS SELECT 1;',
+ regexp => qr/^
+ \QSET default_table_access_method = regress_table_am;\E
+ (\n(?!SET[^;]+;)[^\n]*)*
+ \QCREATE MATERIALIZED VIEW dump_test.regress_pg_dump_matview_am_1 AS\E
+ \n\s+\QSELECT count(*) AS count\E
+ \n\s+\QFROM pg_class\E
+ \n\s+\QWITH NO DATA;\E\n/xm,
+ like => {
+ %full_runs, %dump_test_schema_runs, section_pre_data => 1,
+ },
+ unlike =>
+ { exclude_dump_test_schema => 1, no_table_access_method => 1 },
+ });
+
+#########################################
+# Create a PG instance to test actually dumping from
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+my $port = $node->port;
+
+# We need to see if this system supports CREATE COLLATION or not
+# If it doesn't then we will skip all the COLLATION-related tests.
+my $collation_support = 0;
+my $collation_check_stderr;
+$node->psql(
+ 'postgres',
+ "CREATE COLLATION testing FROM \"C\"; DROP COLLATION testing;",
+ on_error_stop => 0,
+ stderr => \$collation_check_stderr);
+
+if ($collation_check_stderr !~ /ERROR: /)
+{
+ $collation_support = 1;
+}
+
+my $supports_icu = ($ENV{with_icu} eq 'yes');
+my $supports_lz4 = check_pg_config("#define USE_LZ4 1");
+my $supports_gzip = check_pg_config("#define HAVE_LIBZ 1");
+
+# ICU doesn't work with some encodings
+my $encoding = $node->safe_psql('postgres', 'show server_encoding');
+$supports_icu = 0 if $encoding eq 'SQL_ASCII';
+
+# Create additional databases for mutations of schema public
+$node->psql('postgres', 'create database regress_pg_dump_test;');
+$node->psql('postgres', 'create database regress_public_owner;');
+
+#########################################
+# Set up schemas, tables, etc, to be dumped.
+
+# Build up the create statements
+my %create_sql = ();
+
+foreach my $test (
+ sort {
+ if ($tests{$a}->{create_order} and $tests{$b}->{create_order})
+ {
+ $tests{$a}->{create_order} <=> $tests{$b}->{create_order};
+ }
+ elsif ($tests{$a}->{create_order})
+ {
+ -1;
+ }
+ elsif ($tests{$b}->{create_order})
+ {
+ 1;
+ }
+ else
+ {
+ 0;
+ }
+ } keys %tests)
+{
+ my $test_db = 'postgres';
+
+ if (defined($tests{$test}->{database}))
+ {
+ $test_db = $tests{$test}->{database};
+ }
+
+ if (defined($tests{$test}->{icu}))
+ {
+ $tests{$test}->{collation} = 1;
+ }
+
+ if ($tests{$test}->{create_sql})
+ {
+
+ # Skip any collation-related commands if there is no collation support
+ if (!$collation_support && defined($tests{$test}->{collation}))
+ {
+ next;
+ }
+
+ # Skip any icu-related collation commands if build was without icu
+ if (!$supports_icu && defined($tests{$test}->{icu}))
+ {
+ next;
+ }
+
+ # Skip tests specific to LZ4 if this build does not support
+ # this option.
+ if (!$supports_lz4 && defined($tests{$test}->{lz4}))
+ {
+ next;
+ }
+
+ # Add terminating semicolon
+ $create_sql{$test_db} .= $tests{$test}->{create_sql} . ";";
+ }
+}
+
+# Send the combined set of commands to psql
+foreach my $db (sort keys %create_sql)
+{
+ $node->safe_psql($db, $create_sql{$db});
+}
+
+#########################################
+# Test connecting to a non-existent database
+
+command_fails_like(
+ [ 'pg_dump', '-p', "$port", 'qqq' ],
+ qr/pg_dump: error: connection to server .* failed: FATAL: database "qqq" does not exist/,
+ 'connecting to a non-existent database');
+
+#########################################
+# Test connecting to an invalid database
+
+$node->command_fails_like(
+ [ 'pg_dump', '-d', 'regression_invalid' ],
+ qr/pg_dump: error: connection to server .* failed: FATAL: cannot connect to invalid database "regression_invalid"/,
+ 'connecting to an invalid database');
+
+#########################################
+# Test connecting with an unprivileged user
+
+command_fails_like(
+ [ 'pg_dump', '-p', "$port", '--role=regress_dump_test_role' ],
+ qr/\Qpg_dump: error: query failed: ERROR: permission denied for\E/,
+ 'connecting with an unprivileged user');
+
+#########################################
+# Test dumping a non-existent schema, table, and patterns with --strict-names
+
+command_fails_like(
+ [ 'pg_dump', '-p', "$port", '-n', 'nonexistent' ],
+ qr/\Qpg_dump: error: no matching schemas were found\E/,
+ 'dumping a non-existent schema');
+
+command_fails_like(
+ [ 'pg_dump', '-p', "$port", '-t', 'nonexistent' ],
+ qr/\Qpg_dump: error: no matching tables were found\E/,
+ 'dumping a non-existent table');
+
+command_fails_like(
+ [ 'pg_dump', '-p', "$port", '--strict-names', '-n', 'nonexistent*' ],
+ qr/\Qpg_dump: error: no matching schemas were found for pattern\E/,
+ 'no matching schemas');
+
+command_fails_like(
+ [ 'pg_dump', '-p', "$port", '--strict-names', '-t', 'nonexistent*' ],
+ qr/\Qpg_dump: error: no matching tables were found for pattern\E/,
+ 'no matching tables');
+
+#########################################
+# Test invalid multipart database names
+
+$node->command_fails_like(
+ [ 'pg_dumpall', '--exclude-database', '.' ],
+ qr/pg_dumpall: error: improper qualified name \(too many dotted names\): \./,
+ 'pg_dumpall: option --exclude-database rejects multipart pattern "."');
+
+$node->command_fails_like(
+ [ 'pg_dumpall', '--exclude-database', 'myhost.mydb' ],
+ qr/pg_dumpall: error: improper qualified name \(too many dotted names\): myhost\.mydb/,
+ 'pg_dumpall: option --exclude-database rejects multipart database names');
+
+##############################################################
+# Test dumping pg_catalog (for research -- cannot be reloaded)
+
+$node->command_ok(
+ [ 'pg_dump', '-p', "$port", '-n', 'pg_catalog' ],
+ 'pg_dump: option -n pg_catalog'
+);
+
+#########################################
+# Test valid database exclusion patterns
+
+$node->command_ok(
+ [ 'pg_dumpall', '-p', "$port", '--exclude-database', '"myhost.mydb"' ],
+ 'pg_dumpall: option --exclude-database handles database names with embedded dots'
+);
+
+#########################################
+# Test invalid multipart schema names
+
+$node->command_fails_like(
+ [ 'pg_dump', '--schema', 'myhost.mydb.myschema' ],
+ qr/pg_dump: error: improper qualified name \(too many dotted names\): myhost\.mydb\.myschema/,
+ 'pg_dump: option --schema rejects three-part schema names');
+
+$node->command_fails_like(
+ [ 'pg_dump', '--schema', 'otherdb.myschema' ],
+ qr/pg_dump: error: cross-database references are not implemented: otherdb\.myschema/,
+ 'pg_dump: option --schema rejects cross-database multipart schema names');
+
+$node->command_fails_like(
+ [ 'pg_dump', '--schema', '.' ],
+ qr/pg_dump: error: cross-database references are not implemented: \./,
+ 'pg_dump: option --schema rejects degenerate two-part schema name: "."');
+
+$node->command_fails_like(
+ [ 'pg_dump', '--schema', '"some.other.db".myschema' ],
+ qr/pg_dump: error: cross-database references are not implemented: "some\.other\.db"\.myschema/,
+ 'pg_dump: option --schema rejects cross-database multipart schema names with embedded dots'
+);
+
+$node->command_fails_like(
+ [ 'pg_dump', '--schema', '..' ],
+ qr/pg_dump: error: improper qualified name \(too many dotted names\): \.\./,
+ 'pg_dump: option --schema rejects degenerate three-part schema name: ".."'
+);
+
+#########################################
+# Test invalid multipart relation names
+
+$node->command_fails_like(
+ [ 'pg_dump', '--table', 'myhost.mydb.myschema.mytable' ],
+ qr/pg_dump: error: improper relation name \(too many dotted names\): myhost\.mydb\.myschema\.mytable/,
+ 'pg_dump: option --table rejects four-part table names');
+
+$node->command_fails_like(
+ [ 'pg_dump', '--table', 'otherdb.pg_catalog.pg_class' ],
+ qr/pg_dump: error: cross-database references are not implemented: otherdb\.pg_catalog\.pg_class/,
+ 'pg_dump: option --table rejects cross-database three part table names');
+
+command_fails_like(
+ [
+ 'pg_dump', '-p', "$port", '--table',
+ '"some.other.db".pg_catalog.pg_class'
+ ],
+ qr/pg_dump: error: cross-database references are not implemented: "some\.other\.db"\.pg_catalog\.pg_class/,
+ 'pg_dump: option --table rejects cross-database three part table names with embedded dots'
+);
+
+#########################################
+# Run all runs
+
+foreach my $run (sort keys %pgdump_runs)
+{
+ my $test_key = $run;
+ my $run_db = 'postgres';
+
+ # Skip command-level tests for gzip if there is no support for it.
+ if ( defined($pgdump_runs{$run}->{compile_option})
+ && $pgdump_runs{$run}->{compile_option} eq 'gzip'
+ && !$supports_gzip)
+ {
+ note "$run: skipped due to no gzip support";
+ next;
+ }
+
+ $node->command_ok(\@{ $pgdump_runs{$run}->{dump_cmd} },
+ "$run: pg_dump runs");
+
+ if ($pgdump_runs{$run}->{compress_cmd})
+ {
+ my ($compress_cmd) = $pgdump_runs{$run}->{compress_cmd};
+ my $compress_program = $compress_cmd->{program};
+
+ # Skip the rest of the test if the compression program is
+ # not defined.
+ next if (!defined($compress_program) || $compress_program eq '');
+
+ my @full_compress_cmd =
+ ($compress_cmd->{program}, @{ $compress_cmd->{args} });
+ command_ok(\@full_compress_cmd, "$run: compression commands");
+ }
+
+ if ($pgdump_runs{$run}->{restore_cmd})
+ {
+ $node->command_ok(\@{ $pgdump_runs{$run}->{restore_cmd} },
+ "$run: pg_restore runs");
+ }
+
+ if ($pgdump_runs{$run}->{test_key})
+ {
+ $test_key = $pgdump_runs{$run}->{test_key};
+ }
+
+ my $output_file = slurp_file("$tempdir/${run}.sql");
+
+ #########################################
+ # Run all tests where this run is included
+ # as either a 'like' or 'unlike' test.
+
+ foreach my $test (sort keys %tests)
+ {
+ my $test_db = 'postgres';
+
+ if (defined($pgdump_runs{$run}->{database}))
+ {
+ $run_db = $pgdump_runs{$run}->{database};
+ }
+
+ if (defined($tests{$test}->{database}))
+ {
+ $test_db = $tests{$test}->{database};
+ }
+
+ # Skip any collation-related commands if there is no collation support
+ if (!$collation_support && defined($tests{$test}->{collation}))
+ {
+ next;
+ }
+
+ # Skip any icu-related collation commands if build was without icu
+ if (!$supports_icu && defined($tests{$test}->{icu}))
+ {
+ next;
+ }
+
+ # Skip tests specific to LZ4 if this build does not support
+ # this option.
+ if (!$supports_lz4 && defined($tests{$test}->{lz4}))
+ {
+ next;
+ }
+
+ if ($run_db ne $test_db)
+ {
+ next;
+ }
+
+ # Run the test listed as a like, unless it is specifically noted
+ # as an unlike (generally due to an explicit exclusion or similar).
+ if ($tests{$test}->{like}->{$test_key}
+ && !defined($tests{$test}->{unlike}->{$test_key}))
+ {
+ if (!ok($output_file =~ $tests{$test}->{regexp},
+ "$run: should dump $test"))
+ {
+ diag("Review $run results in $tempdir");
+ }
+ }
+ else
+ {
+ if (!ok($output_file !~ $tests{$test}->{regexp},
+ "$run: should not dump $test"))
+ {
+ diag("Review $run results in $tempdir");
+ }
+ }
+ }
+}
+
+#########################################
+# Stop the database instance, which will be removed at the end of the tests.
+
+$node->stop('fast');
+
+done_testing();
diff --git a/src/bin/pg_dump/t/003_pg_dump_with_server.pl b/src/bin/pg_dump/t/003_pg_dump_with_server.pl
new file mode 100644
index 0000000..8cc9da0
--- /dev/null
+++ b/src/bin/pg_dump/t/003_pg_dump_with_server.pl
@@ -0,0 +1,40 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+my $port = $node->port;
+
+$node->init;
+$node->start;
+
+#########################################
+# Verify that dumping foreign data includes only foreign tables of
+# matching servers
+
+$node->safe_psql('postgres', "CREATE FOREIGN DATA WRAPPER dummy");
+$node->safe_psql('postgres', "CREATE SERVER s0 FOREIGN DATA WRAPPER dummy");
+$node->safe_psql('postgres', "CREATE SERVER s1 FOREIGN DATA WRAPPER dummy");
+$node->safe_psql('postgres', "CREATE SERVER s2 FOREIGN DATA WRAPPER dummy");
+$node->safe_psql('postgres', "CREATE FOREIGN TABLE t0 (a int) SERVER s0");
+$node->safe_psql('postgres', "CREATE FOREIGN TABLE t1 (a int) SERVER s1");
+my ($cmd, $stdout, $stderr, $result);
+
+command_fails_like(
+ [ "pg_dump", '-p', $port, '--include-foreign-data=s0', 'postgres' ],
+ qr/foreign-data wrapper \"dummy\" has no handler\r?\npg_dump: detail: Query was: .*t0/,
+ "correctly fails to dump a foreign table from a dummy FDW");
+
+command_ok(
+ [ "pg_dump", '-p', $port, '-a', '--include-foreign-data=s2', 'postgres' ],
+ "dump foreign server with no tables");
+
+done_testing();
diff --git a/src/bin/pg_dump/t/004_pg_dump_parallel.pl b/src/bin/pg_dump/t/004_pg_dump_parallel.pl
new file mode 100644
index 0000000..f41c2fa
--- /dev/null
+++ b/src/bin/pg_dump/t/004_pg_dump_parallel.pl
@@ -0,0 +1,81 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $dbname1 = 'regression_src';
+my $dbname2 = 'regression_dest1';
+my $dbname3 = 'regression_dest2';
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+my $backupdir = $node->backup_dir;
+
+$node->run_log([ 'createdb', $dbname1 ]);
+$node->run_log([ 'createdb', $dbname2 ]);
+$node->run_log([ 'createdb', $dbname3 ]);
+
+$node->safe_psql(
+ $dbname1,
+ qq{
+create type digit as enum ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
+
+-- plain table with index
+create table tplain (en digit, data int unique);
+insert into tplain select (x%10)::text::digit, x from generate_series(1,1000) x;
+
+-- non-troublesome hashed partitioning
+create table ths (mod int, data int, unique(mod, data)) partition by hash(mod);
+create table ths_p1 partition of ths for values with (modulus 3, remainder 0);
+create table ths_p2 partition of ths for values with (modulus 3, remainder 1);
+create table ths_p3 partition of ths for values with (modulus 3, remainder 2);
+insert into ths select (x%10), x from generate_series(1,1000) x;
+
+-- dangerous hashed partitioning
+create table tht (en digit, data int, unique(en, data)) partition by hash(en);
+create table tht_p1 partition of tht for values with (modulus 3, remainder 0);
+create table tht_p2 partition of tht for values with (modulus 3, remainder 1);
+create table tht_p3 partition of tht for values with (modulus 3, remainder 2);
+insert into tht select (x%10)::text::digit, x from generate_series(1,1000) x;
+ });
+
+$node->command_ok(
+ [
+ 'pg_dump', '-Fd', '--no-sync', '-j2', '-f', "$backupdir/dump1",
+ $node->connstr($dbname1)
+ ],
+ 'parallel dump');
+
+$node->command_ok(
+ [
+ 'pg_restore', '-v',
+ '-d', $node->connstr($dbname2),
+ '-j3', "$backupdir/dump1"
+ ],
+ 'parallel restore');
+
+$node->command_ok(
+ [
+ 'pg_dump', '-Fd',
+ '--no-sync', '-j2',
+ '-f', "$backupdir/dump2",
+ '--inserts', $node->connstr($dbname1)
+ ],
+ 'parallel dump as inserts');
+
+$node->command_ok(
+ [
+ 'pg_restore', '-v',
+ '-d', $node->connstr($dbname3),
+ '-j3', "$backupdir/dump2"
+ ],
+ 'parallel restore as inserts');
+
+done_testing();
diff --git a/src/bin/pg_dump/t/010_dump_connstr.pl b/src/bin/pg_dump/t/010_dump_connstr.pl
new file mode 100644
index 0000000..f0e3aaf
--- /dev/null
+++ b/src/bin/pg_dump/t/010_dump_connstr.pl
@@ -0,0 +1,233 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+if ($PostgreSQL::Test::Utils::is_msys2)
+{
+ plan skip_all => 'High bit name tests fail on Msys2';
+}
+
+# We're going to use byte sequences that aren't valid UTF-8 strings. Use
+# LATIN1, which accepts any byte and has a conversion from each byte to UTF-8.
+$ENV{LC_ALL} = 'C';
+$ENV{PGCLIENTENCODING} = 'LATIN1';
+
+# Create database and user names covering the range of LATIN1
+# characters, for use in a connection string by pg_dumpall. Skip ','
+# because of pg_regress --create-role, skip [\n\r] because pg_dumpall
+# does not allow them. We also skip many ASCII letters, to keep the
+# total number of tested characters to what will fit in four names.
+# The odds of finding something interesting by testing all ASCII letters
+# seem too small to justify the cycles of testing a fifth name.
+my $dbname1 =
+ 'regression'
+ . generate_ascii_string(1, 9)
+ . generate_ascii_string(11, 12)
+ . generate_ascii_string(14, 33)
+ . (
+ $PostgreSQL::Test::Utils::windows_os
+ ? ''
+ : '"x"') # IPC::Run mishandles '"' on Windows
+ . generate_ascii_string(35, 43) # skip ','
+ . generate_ascii_string(45, 54);
+my $dbname2 = 'regression' . generate_ascii_string(55, 65) # skip 'B'-'W'
+ . generate_ascii_string(88, 99) # skip 'd'-'w'
+ . generate_ascii_string(120, 149);
+my $dbname3 = 'regression' . generate_ascii_string(150, 202);
+my $dbname4 = 'regression' . generate_ascii_string(203, 255);
+
+(my $username1 = $dbname1) =~ s/^regression/regress_/;
+(my $username2 = $dbname2) =~ s/^regression/regress_/;
+(my $username3 = $dbname3) =~ s/^regression/regress_/;
+(my $username4 = $dbname4) =~ s/^regression/regress_/;
+
+my $src_bootstrap_super = 'regress_postgres';
+my $dst_bootstrap_super = 'boot';
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init(extra =>
+ [ '-U', $src_bootstrap_super, '--locale=C', '--encoding=LATIN1' ]);
+
+# prep pg_hba.conf and pg_ident.conf
+$node->run_log(
+ [
+ $ENV{PG_REGRESS}, '--config-auth',
+ $node->data_dir, '--user',
+ $src_bootstrap_super, '--create-role',
+ "$username1,$username2,$username3,$username4"
+ ]);
+$node->start;
+
+my $backupdir = $node->backup_dir;
+my $discard = "$backupdir/discard.sql";
+my $plain = "$backupdir/plain.sql";
+my $dirfmt = "$backupdir/dirfmt";
+
+$node->run_log([ 'createdb', '-U', $src_bootstrap_super, $dbname1 ]);
+$node->run_log(
+ [ 'createuser', '-U', $src_bootstrap_super, '-s', $username1 ]);
+$node->run_log([ 'createdb', '-U', $src_bootstrap_super, $dbname2 ]);
+$node->run_log(
+ [ 'createuser', '-U', $src_bootstrap_super, '-s', $username2 ]);
+$node->run_log([ 'createdb', '-U', $src_bootstrap_super, $dbname3 ]);
+$node->run_log(
+ [ 'createuser', '-U', $src_bootstrap_super, '-s', $username3 ]);
+$node->run_log([ 'createdb', '-U', $src_bootstrap_super, $dbname4 ]);
+$node->run_log(
+ [ 'createuser', '-U', $src_bootstrap_super, '-s', $username4 ]);
+
+
+# For these tests, pg_dumpall -r is used because it produces a short
+# dump.
+$node->command_ok(
+ [
+ 'pg_dumpall', '-r', '-f', $discard, '--dbname',
+ $node->connstr($dbname1),
+ '-U', $username4
+ ],
+ 'pg_dumpall with long ASCII name 1');
+$node->command_ok(
+ [
+ 'pg_dumpall', '--no-sync', '-r', '-f', $discard, '--dbname',
+ $node->connstr($dbname2),
+ '-U', $username3
+ ],
+ 'pg_dumpall with long ASCII name 2');
+$node->command_ok(
+ [
+ 'pg_dumpall', '--no-sync', '-r', '-f', $discard, '--dbname',
+ $node->connstr($dbname3),
+ '-U', $username2
+ ],
+ 'pg_dumpall with long ASCII name 3');
+$node->command_ok(
+ [
+ 'pg_dumpall', '--no-sync', '-r', '-f', $discard, '--dbname',
+ $node->connstr($dbname4),
+ '-U', $username1
+ ],
+ 'pg_dumpall with long ASCII name 4');
+$node->command_ok(
+ [
+ 'pg_dumpall', '-U',
+ $src_bootstrap_super, '--no-sync',
+ '-r', '-l',
+ 'dbname=template1'
+ ],
+ 'pg_dumpall -l accepts connection string');
+
+$node->run_log([ 'createdb', '-U', $src_bootstrap_super, "foo\n\rbar" ]);
+
+# not sufficient to use -r here
+$node->command_fails(
+ [ 'pg_dumpall', '-U', $src_bootstrap_super, '--no-sync', '-f', $discard ],
+ 'pg_dumpall with \n\r in database name');
+$node->run_log([ 'dropdb', '-U', $src_bootstrap_super, "foo\n\rbar" ]);
+
+
+# make a table, so the parallel worker has something to dump
+$node->safe_psql(
+ $dbname1,
+ 'CREATE TABLE t0()',
+ extra_params => [ '-U', $src_bootstrap_super ]);
+
+# XXX no printed message when this fails, just SIGPIPE termination
+$node->command_ok(
+ [
+ 'pg_dump', '-Fd', '--no-sync', '-j2', '-f', $dirfmt, '-U', $username1,
+ $node->connstr($dbname1)
+ ],
+ 'parallel dump');
+
+# recreate $dbname1 for restore test
+$node->run_log([ 'dropdb', '-U', $src_bootstrap_super, $dbname1 ]);
+$node->run_log([ 'createdb', '-U', $src_bootstrap_super, $dbname1 ]);
+
+$node->command_ok(
+ [
+ 'pg_restore', '-v', '-d', 'template1',
+ '-j2', '-U', $username1, $dirfmt
+ ],
+ 'parallel restore');
+
+$node->run_log([ 'dropdb', '-U', $src_bootstrap_super, $dbname1 ]);
+
+$node->command_ok(
+ [
+ 'pg_restore', '-C', '-v', '-d',
+ 'template1', '-j2', '-U', $username1,
+ $dirfmt
+ ],
+ 'parallel restore with create');
+
+
+$node->command_ok(
+ [ 'pg_dumpall', '--no-sync', '-f', $plain, '-U', $username1 ],
+ 'take full dump');
+system_log('cat', $plain);
+my ($stderr, $result);
+my $restore_super = qq{regress_a'b\\c=d\\ne"f};
+$restore_super =~ s/"//g
+ if
+ $PostgreSQL::Test::Utils::windows_os; # IPC::Run mishandles '"' on Windows
+
+
+# Restore full dump through psql using environment variables for
+# dbname/user connection parameters
+
+my $envar_node = PostgreSQL::Test::Cluster->new('destination_envar');
+$envar_node->init(
+ extra =>
+ [ '-U', $dst_bootstrap_super, '--locale=C', '--encoding=LATIN1' ],
+ auth_extra =>
+ [ '--user', $dst_bootstrap_super, '--create-role', $restore_super ]);
+$envar_node->start;
+
+# make superuser for restore
+$envar_node->run_log(
+ [ 'createuser', '-U', $dst_bootstrap_super, '-s', $restore_super ]);
+
+{
+ local $ENV{PGPORT} = $envar_node->port;
+ local $ENV{PGUSER} = $restore_super;
+ $result = run_log([ 'psql', '-X', '-f', $plain ], '2>', \$stderr);
+}
+ok($result,
+ 'restore full dump using environment variables for connection parameters'
+);
+is($stderr, '', 'no dump errors');
+
+
+# Restore full dump through psql using command-line options for
+# dbname/user connection parameters. "\connect dbname=" forgets
+# user/port from command line.
+
+my $cmdline_node = PostgreSQL::Test::Cluster->new('destination_cmdline');
+$cmdline_node->init(
+ extra =>
+ [ '-U', $dst_bootstrap_super, '--locale=C', '--encoding=LATIN1' ],
+ auth_extra =>
+ [ '--user', $dst_bootstrap_super, '--create-role', $restore_super ]);
+$cmdline_node->start;
+$cmdline_node->run_log(
+ [ 'createuser', '-U', $dst_bootstrap_super, '-s', $restore_super ]);
+{
+ $result = run_log(
+ [
+ 'psql', '-p', $cmdline_node->port, '-U',
+ $restore_super, '-X', '-f', $plain
+ ],
+ '2>',
+ \$stderr);
+}
+ok($result,
+ 'restore full dump with command-line options for connection parameters');
+is($stderr, '', 'no dump errors');
+
+done_testing();
diff --git a/src/bin/pg_resetwal/.gitignore b/src/bin/pg_resetwal/.gitignore
new file mode 100644
index 0000000..56bade5
--- /dev/null
+++ b/src/bin/pg_resetwal/.gitignore
@@ -0,0 +1,2 @@
+/pg_resetwal
+/tmp_check/
diff --git a/src/bin/pg_resetwal/Makefile b/src/bin/pg_resetwal/Makefile
new file mode 100644
index 0000000..222444f
--- /dev/null
+++ b/src/bin/pg_resetwal/Makefile
@@ -0,0 +1,44 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_resetwal
+#
+# Copyright (c) 1998-2022, PostgreSQL Global Development Group
+#
+# src/bin/pg_resetwal/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_resetwal - reset PostgreSQL WAL log"
+PGAPPICON=win32
+
+subdir = src/bin/pg_resetwal
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ pg_resetwal.o
+
+all: pg_resetwal
+
+pg_resetwal: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_resetwal$(X) '$(DESTDIR)$(bindir)/pg_resetwal$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_resetwal$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_resetwal$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_resetwal/nls.mk b/src/bin/pg_resetwal/nls.mk
new file mode 100644
index 0000000..0dd4a25
--- /dev/null
+++ b/src/bin/pg_resetwal/nls.mk
@@ -0,0 +1,6 @@
+# src/bin/pg_resetwal/nls.mk
+CATALOG_NAME = pg_resetwal
+AVAIL_LANGUAGES = cs de el es fr it ja ka ko pt_BR ru sv uk zh_CN
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_resetwal.c ../../common/restricted_token.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS)
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/pg_resetwal/pg_resetwal.c b/src/bin/pg_resetwal/pg_resetwal.c
new file mode 100644
index 0000000..d4772a2
--- /dev/null
+++ b/src/bin/pg_resetwal/pg_resetwal.c
@@ -0,0 +1,1155 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_resetwal.c
+ * A utility to "zero out" the xlog when it's corrupt beyond recovery.
+ * Can also rebuild pg_control if needed.
+ *
+ * The theory of operation is fairly simple:
+ * 1. Read the existing pg_control (which will include the last
+ * checkpoint record). If it is an old format then update to
+ * current format.
+ * 2. If pg_control is corrupt, attempt to intuit reasonable values,
+ * by scanning the old xlog if necessary.
+ * 3. Modify pg_control to reflect a "shutdown" state with a checkpoint
+ * record at the start of xlog.
+ * 4. Flush the existing xlog files and write a new segment with
+ * just a checkpoint record in it. The new segment is positioned
+ * just past the end of the old xlog, so that existing LSNs in
+ * data pages will appear to be "in the past".
+ * This is all pretty straightforward except for the intuition part of
+ * step 2 ...
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_resetwal/pg_resetwal.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * We have to use postgres.h not postgres_fe.h here, because there's so much
+ * backend-only stuff in the XLOG include files we need. But we need a
+ * frontend-ish environment otherwise. Hence this ugly hack.
+ */
+#define FRONTEND 1
+
+#include "postgres.h"
+
+#include <dirent.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "access/heaptoast.h"
+#include "access/multixact.h"
+#include "access/transam.h"
+#include "access/xlog.h"
+#include "access/xlog_internal.h"
+#include "common/controldata_utils.h"
+#include "common/fe_memutils.h"
+#include "common/file_perm.h"
+#include "common/logging.h"
+#include "common/restricted_token.h"
+#include "common/string.h"
+#include "getopt_long.h"
+#include "pg_getopt.h"
+#include "storage/large_object.h"
+
+static ControlFileData ControlFile; /* pg_control values */
+static XLogSegNo newXlogSegNo; /* new XLOG segment # */
+static bool guessed = false; /* T if we had to guess at any values */
+static const char *progname;
+static uint32 set_xid_epoch = (uint32) -1;
+static TransactionId set_oldest_xid = 0;
+static TransactionId set_xid = 0;
+static TransactionId set_oldest_commit_ts_xid = 0;
+static TransactionId set_newest_commit_ts_xid = 0;
+static Oid set_oid = 0;
+static MultiXactId set_mxid = 0;
+static MultiXactOffset set_mxoff = (MultiXactOffset) -1;
+static uint32 minXlogTli = 0;
+static XLogSegNo minXlogSegNo = 0;
+static int WalSegSz;
+static int set_wal_segsize;
+
+static void CheckDataVersion(void);
+static bool read_controlfile(void);
+static void GuessControlValues(void);
+static void PrintControlValues(bool guessed);
+static void PrintNewControlValues(void);
+static void RewriteControlFile(void);
+static void FindEndOfXLOG(void);
+static void KillExistingXLOG(void);
+static void KillExistingArchiveStatus(void);
+static void WriteEmptyXLOG(void);
+static void usage(void);
+
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"commit-timestamp-ids", required_argument, NULL, 'c'},
+ {"pgdata", required_argument, NULL, 'D'},
+ {"epoch", required_argument, NULL, 'e'},
+ {"force", no_argument, NULL, 'f'},
+ {"next-wal-file", required_argument, NULL, 'l'},
+ {"multixact-ids", required_argument, NULL, 'm'},
+ {"dry-run", no_argument, NULL, 'n'},
+ {"next-oid", required_argument, NULL, 'o'},
+ {"multixact-offset", required_argument, NULL, 'O'},
+ {"oldest-transaction-id", required_argument, NULL, 'u'},
+ {"next-transaction-id", required_argument, NULL, 'x'},
+ {"wal-segsize", required_argument, NULL, 1},
+ {NULL, 0, NULL, 0}
+ };
+
+ int c;
+ bool force = false;
+ bool noupdate = false;
+ MultiXactId set_oldestmxid = 0;
+ char *endptr;
+ char *endptr2;
+ char *DataDir = NULL;
+ char *log_fname = NULL;
+ int fd;
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_resetwal"));
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_resetwal (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+
+ while ((c = getopt_long(argc, argv, "c:D:e:fl:m:no:O:u:x:", long_options, NULL)) != -1)
+ {
+ switch (c)
+ {
+ case 'D':
+ DataDir = optarg;
+ break;
+
+ case 'f':
+ force = true;
+ break;
+
+ case 'n':
+ noupdate = true;
+ break;
+
+ case 'e':
+ errno = 0;
+ set_xid_epoch = strtoul(optarg, &endptr, 0);
+ if (endptr == optarg || *endptr != '\0' || errno != 0)
+ {
+ /*------
+ translator: the second %s is a command line argument (-e, etc) */
+ pg_log_error("invalid argument for option %s", "-e");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (set_xid_epoch == -1)
+ pg_fatal("transaction ID epoch (-e) must not be -1");
+ break;
+
+ case 'u':
+ errno = 0;
+ set_oldest_xid = strtoul(optarg, &endptr, 0);
+ if (endptr == optarg || *endptr != '\0' || errno != 0)
+ {
+ pg_log_error("invalid argument for option %s", "-u");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (!TransactionIdIsNormal(set_oldest_xid))
+ pg_fatal("oldest transaction ID (-u) must be greater than or equal to %u", FirstNormalTransactionId);
+ break;
+
+ case 'x':
+ errno = 0;
+ set_xid = strtoul(optarg, &endptr, 0);
+ if (endptr == optarg || *endptr != '\0' || errno != 0)
+ {
+ pg_log_error("invalid argument for option %s", "-x");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (!TransactionIdIsNormal(set_xid))
+ pg_fatal("transaction ID (-x) must be greater than or equal to %u", FirstNormalTransactionId);
+ break;
+
+ case 'c':
+ errno = 0;
+ set_oldest_commit_ts_xid = strtoul(optarg, &endptr, 0);
+ if (endptr == optarg || *endptr != ',' || errno != 0)
+ {
+ pg_log_error("invalid argument for option %s", "-c");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ set_newest_commit_ts_xid = strtoul(endptr + 1, &endptr2, 0);
+ if (endptr2 == endptr + 1 || *endptr2 != '\0' || errno != 0)
+ {
+ pg_log_error("invalid argument for option %s", "-c");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (set_oldest_commit_ts_xid < 2 &&
+ set_oldest_commit_ts_xid != 0)
+ pg_fatal("transaction ID (-c) must be either 0 or greater than or equal to 2");
+
+ if (set_newest_commit_ts_xid < 2 &&
+ set_newest_commit_ts_xid != 0)
+ pg_fatal("transaction ID (-c) must be either 0 or greater than or equal to 2");
+ break;
+
+ case 'o':
+ errno = 0;
+ set_oid = strtoul(optarg, &endptr, 0);
+ if (endptr == optarg || *endptr != '\0' || errno != 0)
+ {
+ pg_log_error("invalid argument for option %s", "-o");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (set_oid == 0)
+ pg_fatal("OID (-o) must not be 0");
+ break;
+
+ case 'm':
+ errno = 0;
+ set_mxid = strtoul(optarg, &endptr, 0);
+ if (endptr == optarg || *endptr != ',' || errno != 0)
+ {
+ pg_log_error("invalid argument for option %s", "-m");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ set_oldestmxid = strtoul(endptr + 1, &endptr2, 0);
+ if (endptr2 == endptr + 1 || *endptr2 != '\0' || errno != 0)
+ {
+ pg_log_error("invalid argument for option %s", "-m");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (set_mxid == 0)
+ pg_fatal("multitransaction ID (-m) must not be 0");
+
+ /*
+ * XXX It'd be nice to have more sanity checks here, e.g. so
+ * that oldest is not wrapped around w.r.t. nextMulti.
+ */
+ if (set_oldestmxid == 0)
+ pg_fatal("oldest multitransaction ID (-m) must not be 0");
+ break;
+
+ case 'O':
+ errno = 0;
+ set_mxoff = strtoul(optarg, &endptr, 0);
+ if (endptr == optarg || *endptr != '\0' || errno != 0)
+ {
+ pg_log_error("invalid argument for option %s", "-O");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (set_mxoff == -1)
+ pg_fatal("multitransaction offset (-O) must not be -1");
+ break;
+
+ case 'l':
+ if (strspn(optarg, "01234567890ABCDEFabcdef") != XLOG_FNAME_LEN)
+ {
+ pg_log_error("invalid argument for option %s", "-l");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * XLogFromFileName requires wal segment size which is not yet
+ * set. Hence wal details are set later on.
+ */
+ log_fname = pg_strdup(optarg);
+ break;
+
+ case 1:
+ errno = 0;
+ set_wal_segsize = strtol(optarg, &endptr, 10) * 1024 * 1024;
+ if (endptr == optarg || *endptr != '\0' || errno != 0)
+ pg_fatal("argument of --wal-segsize must be a number");
+ if (!IsValidWalSegSize(set_wal_segsize))
+ pg_fatal("argument of --wal-segsize must be a power of 2 between 1 and 1024");
+ break;
+
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ if (DataDir == NULL && optind < argc)
+ DataDir = argv[optind++];
+
+ /* Complain if any arguments remain */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (DataDir == NULL)
+ {
+ pg_log_error("no data directory specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Don't allow pg_resetwal to be run as root, to avoid overwriting the
+ * ownership of files in the data directory. We need only check for root
+ * -- any other user won't have sufficient permissions to modify files in
+ * the data directory.
+ */
+#ifndef WIN32
+ if (geteuid() == 0)
+ {
+ pg_log_error("cannot be executed by \"root\"");
+ pg_log_error_hint("You must run %s as the PostgreSQL superuser.",
+ progname);
+ exit(1);
+ }
+#endif
+
+ get_restricted_token();
+
+ /* Set mask based on PGDATA permissions */
+ if (!GetDataDirectoryCreatePerm(DataDir))
+ pg_fatal("could not read permissions of directory \"%s\": %m",
+ DataDir);
+
+ umask(pg_mode_mask);
+
+ if (chdir(DataDir) < 0)
+ pg_fatal("could not change directory to \"%s\": %m",
+ DataDir);
+
+ /* Check that data directory matches our server version */
+ CheckDataVersion();
+
+ /*
+ * Check for a postmaster lock file --- if there is one, refuse to
+ * proceed, on grounds we might be interfering with a live installation.
+ */
+ if ((fd = open("postmaster.pid", O_RDONLY, 0)) < 0)
+ {
+ if (errno != ENOENT)
+ pg_fatal("could not open file \"%s\" for reading: %m",
+ "postmaster.pid");
+ }
+ else
+ {
+ pg_log_error("lock file \"%s\" exists", "postmaster.pid");
+ pg_log_error_hint("Is a server running? If not, delete the lock file and try again.");
+ exit(1);
+ }
+
+ /*
+ * Attempt to read the existing pg_control file
+ */
+ if (!read_controlfile())
+ GuessControlValues();
+
+ /*
+ * If no new WAL segment size was specified, use the control file value.
+ */
+ if (set_wal_segsize != 0)
+ WalSegSz = set_wal_segsize;
+ else
+ WalSegSz = ControlFile.xlog_seg_size;
+
+ if (log_fname != NULL)
+ XLogFromFileName(log_fname, &minXlogTli, &minXlogSegNo, WalSegSz);
+
+ /*
+ * Also look at existing segment files to set up newXlogSegNo
+ */
+ FindEndOfXLOG();
+
+ /*
+ * If we're not going to proceed with the reset, print the current control
+ * file parameters.
+ */
+ if ((guessed && !force) || noupdate)
+ PrintControlValues(guessed);
+
+ /*
+ * Adjust fields if required by switches. (Do this now so that printout,
+ * if any, includes these values.)
+ */
+ if (set_xid_epoch != -1)
+ ControlFile.checkPointCopy.nextXid =
+ FullTransactionIdFromEpochAndXid(set_xid_epoch,
+ XidFromFullTransactionId(ControlFile.checkPointCopy.nextXid));
+
+ if (set_oldest_xid != 0)
+ {
+ ControlFile.checkPointCopy.oldestXid = set_oldest_xid;
+ ControlFile.checkPointCopy.oldestXidDB = InvalidOid;
+ }
+
+ if (set_xid != 0)
+ ControlFile.checkPointCopy.nextXid =
+ FullTransactionIdFromEpochAndXid(EpochFromFullTransactionId(ControlFile.checkPointCopy.nextXid),
+ set_xid);
+
+ if (set_oldest_commit_ts_xid != 0)
+ ControlFile.checkPointCopy.oldestCommitTsXid = set_oldest_commit_ts_xid;
+ if (set_newest_commit_ts_xid != 0)
+ ControlFile.checkPointCopy.newestCommitTsXid = set_newest_commit_ts_xid;
+
+ if (set_oid != 0)
+ ControlFile.checkPointCopy.nextOid = set_oid;
+
+ if (set_mxid != 0)
+ {
+ ControlFile.checkPointCopy.nextMulti = set_mxid;
+
+ ControlFile.checkPointCopy.oldestMulti = set_oldestmxid;
+ if (ControlFile.checkPointCopy.oldestMulti < FirstMultiXactId)
+ ControlFile.checkPointCopy.oldestMulti += FirstMultiXactId;
+ ControlFile.checkPointCopy.oldestMultiDB = InvalidOid;
+ }
+
+ if (set_mxoff != -1)
+ ControlFile.checkPointCopy.nextMultiOffset = set_mxoff;
+
+ if (minXlogTli > ControlFile.checkPointCopy.ThisTimeLineID)
+ {
+ ControlFile.checkPointCopy.ThisTimeLineID = minXlogTli;
+ ControlFile.checkPointCopy.PrevTimeLineID = minXlogTli;
+ }
+
+ if (set_wal_segsize != 0)
+ ControlFile.xlog_seg_size = WalSegSz;
+
+ if (minXlogSegNo > newXlogSegNo)
+ newXlogSegNo = minXlogSegNo;
+
+ /*
+ * If we had to guess anything, and -f was not given, just print the
+ * guessed values and exit. Also print if -n is given.
+ */
+ if ((guessed && !force) || noupdate)
+ {
+ PrintNewControlValues();
+ if (!noupdate)
+ {
+ printf(_("\nIf these values seem acceptable, use -f to force reset.\n"));
+ exit(1);
+ }
+ else
+ exit(0);
+ }
+
+ /*
+ * Don't reset from a dirty pg_control without -f, either.
+ */
+ if (ControlFile.state != DB_SHUTDOWNED && !force)
+ {
+ printf(_("The database server was not shut down cleanly.\n"
+ "Resetting the write-ahead log might cause data to be lost.\n"
+ "If you want to proceed anyway, use -f to force reset.\n"));
+ exit(1);
+ }
+
+ /*
+ * Else, do the dirty deed.
+ */
+ RewriteControlFile();
+ KillExistingXLOG();
+ KillExistingArchiveStatus();
+ WriteEmptyXLOG();
+
+ printf(_("Write-ahead log reset\n"));
+ return 0;
+}
+
+
+/*
+ * Look at the version string stored in PG_VERSION and decide if this utility
+ * can be run safely or not.
+ *
+ * We don't want to inject pg_control and WAL files that are for a different
+ * major version; that can't do anything good. Note that we don't treat
+ * mismatching version info in pg_control as a reason to bail out, because
+ * recovering from a corrupted pg_control is one of the main reasons for this
+ * program to exist at all. However, PG_VERSION is unlikely to get corrupted,
+ * and if it were it would be easy to fix by hand. So let's make this check
+ * to prevent simple user errors.
+ */
+static void
+CheckDataVersion(void)
+{
+ const char *ver_file = "PG_VERSION";
+ FILE *ver_fd;
+ char rawline[64];
+
+ if ((ver_fd = fopen(ver_file, "r")) == NULL)
+ pg_fatal("could not open file \"%s\" for reading: %m",
+ ver_file);
+
+ /* version number has to be the first line read */
+ if (!fgets(rawline, sizeof(rawline), ver_fd))
+ {
+ if (!ferror(ver_fd))
+ pg_fatal("unexpected empty file \"%s\"", ver_file);
+ else
+ pg_fatal("could not read file \"%s\": %m", ver_file);
+ }
+
+ /* strip trailing newline and carriage return */
+ (void) pg_strip_crlf(rawline);
+
+ if (strcmp(rawline, PG_MAJORVERSION) != 0)
+ {
+ pg_log_error("data directory is of wrong version");
+ pg_log_error_detail("File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\".",
+ ver_file, rawline, PG_MAJORVERSION);
+ exit(1);
+ }
+
+ fclose(ver_fd);
+}
+
+
+/*
+ * Try to read the existing pg_control file.
+ *
+ * This routine is also responsible for updating old pg_control versions
+ * to the current format. (Currently we don't do anything of the sort.)
+ */
+static bool
+read_controlfile(void)
+{
+ int fd;
+ int len;
+ char *buffer;
+ pg_crc32c crc;
+
+ if ((fd = open(XLOG_CONTROL_FILE, O_RDONLY | PG_BINARY, 0)) < 0)
+ {
+ /*
+ * If pg_control is not there at all, or we can't read it, the odds
+ * are we've been handed a bad DataDir path, so give up. User can do
+ * "touch pg_control" to force us to proceed.
+ */
+ pg_log_error("could not open file \"%s\" for reading: %m",
+ XLOG_CONTROL_FILE);
+ if (errno == ENOENT)
+ pg_log_error_hint("If you are sure the data directory path is correct, execute\n"
+ " touch %s\n"
+ "and try again.",
+ XLOG_CONTROL_FILE);
+ exit(1);
+ }
+
+ /* Use malloc to ensure we have a maxaligned buffer */
+ buffer = (char *) pg_malloc(PG_CONTROL_FILE_SIZE);
+
+ len = read(fd, buffer, PG_CONTROL_FILE_SIZE);
+ if (len < 0)
+ pg_fatal("could not read file \"%s\": %m", XLOG_CONTROL_FILE);
+ close(fd);
+
+ if (len >= sizeof(ControlFileData) &&
+ ((ControlFileData *) buffer)->pg_control_version == PG_CONTROL_VERSION)
+ {
+ /* Check the CRC. */
+ INIT_CRC32C(crc);
+ COMP_CRC32C(crc,
+ buffer,
+ offsetof(ControlFileData, crc));
+ FIN_CRC32C(crc);
+
+ if (!EQ_CRC32C(crc, ((ControlFileData *) buffer)->crc))
+ {
+ /* We will use the data but treat it as guessed. */
+ pg_log_warning("pg_control exists but has invalid CRC; proceed with caution");
+ guessed = true;
+ }
+
+ memcpy(&ControlFile, buffer, sizeof(ControlFile));
+
+ /* return false if WAL segment size is not valid */
+ if (!IsValidWalSegSize(ControlFile.xlog_seg_size))
+ {
+ pg_log_warning(ngettext("pg_control specifies invalid WAL segment size (%d byte); proceed with caution",
+ "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution",
+ ControlFile.xlog_seg_size),
+ ControlFile.xlog_seg_size);
+ return false;
+ }
+
+ return true;
+ }
+
+ /* Looks like it's a mess. */
+ pg_log_warning("pg_control exists but is broken or wrong version; ignoring it");
+ return false;
+}
+
+
+/*
+ * Guess at pg_control values when we can't read the old ones.
+ */
+static void
+GuessControlValues(void)
+{
+ uint64 sysidentifier;
+ struct timeval tv;
+
+ /*
+ * Set up a completely default set of pg_control values.
+ */
+ guessed = true;
+ memset(&ControlFile, 0, sizeof(ControlFile));
+
+ ControlFile.pg_control_version = PG_CONTROL_VERSION;
+ ControlFile.catalog_version_no = CATALOG_VERSION_NO;
+
+ /*
+ * Create a new unique installation identifier, since we can no longer use
+ * any old XLOG records. See notes in xlog.c about the algorithm.
+ */
+ gettimeofday(&tv, NULL);
+ sysidentifier = ((uint64) tv.tv_sec) << 32;
+ sysidentifier |= ((uint64) tv.tv_usec) << 12;
+ sysidentifier |= getpid() & 0xFFF;
+
+ ControlFile.system_identifier = sysidentifier;
+
+ ControlFile.checkPointCopy.redo = SizeOfXLogLongPHD;
+ ControlFile.checkPointCopy.ThisTimeLineID = 1;
+ ControlFile.checkPointCopy.PrevTimeLineID = 1;
+ ControlFile.checkPointCopy.fullPageWrites = false;
+ ControlFile.checkPointCopy.nextXid =
+ FullTransactionIdFromEpochAndXid(0, FirstNormalTransactionId);
+ ControlFile.checkPointCopy.nextOid = FirstGenbkiObjectId;
+ ControlFile.checkPointCopy.nextMulti = FirstMultiXactId;
+ ControlFile.checkPointCopy.nextMultiOffset = 0;
+ ControlFile.checkPointCopy.oldestXid = FirstNormalTransactionId;
+ ControlFile.checkPointCopy.oldestXidDB = InvalidOid;
+ ControlFile.checkPointCopy.oldestMulti = FirstMultiXactId;
+ ControlFile.checkPointCopy.oldestMultiDB = InvalidOid;
+ ControlFile.checkPointCopy.time = (pg_time_t) time(NULL);
+ ControlFile.checkPointCopy.oldestActiveXid = InvalidTransactionId;
+
+ ControlFile.state = DB_SHUTDOWNED;
+ ControlFile.time = (pg_time_t) time(NULL);
+ ControlFile.checkPoint = ControlFile.checkPointCopy.redo;
+ ControlFile.unloggedLSN = FirstNormalUnloggedLSN;
+
+ /* minRecoveryPoint, backupStartPoint and backupEndPoint can be left zero */
+
+ ControlFile.wal_level = WAL_LEVEL_MINIMAL;
+ ControlFile.wal_log_hints = false;
+ ControlFile.track_commit_timestamp = false;
+ ControlFile.MaxConnections = 100;
+ ControlFile.max_wal_senders = 10;
+ ControlFile.max_worker_processes = 8;
+ ControlFile.max_prepared_xacts = 0;
+ ControlFile.max_locks_per_xact = 64;
+
+ ControlFile.maxAlign = MAXIMUM_ALIGNOF;
+ ControlFile.floatFormat = FLOATFORMAT_VALUE;
+ ControlFile.blcksz = BLCKSZ;
+ ControlFile.relseg_size = RELSEG_SIZE;
+ ControlFile.xlog_blcksz = XLOG_BLCKSZ;
+ ControlFile.xlog_seg_size = DEFAULT_XLOG_SEG_SIZE;
+ ControlFile.nameDataLen = NAMEDATALEN;
+ ControlFile.indexMaxKeys = INDEX_MAX_KEYS;
+ ControlFile.toast_max_chunk_size = TOAST_MAX_CHUNK_SIZE;
+ ControlFile.loblksize = LOBLKSIZE;
+ ControlFile.float8ByVal = FLOAT8PASSBYVAL;
+
+ /*
+ * XXX eventually, should try to grovel through old XLOG to develop more
+ * accurate values for TimeLineID, nextXID, etc.
+ */
+}
+
+
+/*
+ * Print the guessed pg_control values when we had to guess.
+ *
+ * NB: this display should be just those fields that will not be
+ * reset by RewriteControlFile().
+ */
+static void
+PrintControlValues(bool guessed)
+{
+ if (guessed)
+ printf(_("Guessed pg_control values:\n\n"));
+ else
+ printf(_("Current pg_control values:\n\n"));
+
+ printf(_("pg_control version number: %u\n"),
+ ControlFile.pg_control_version);
+ printf(_("Catalog version number: %u\n"),
+ ControlFile.catalog_version_no);
+ printf(_("Database system identifier: %llu\n"),
+ (unsigned long long) ControlFile.system_identifier);
+ printf(_("Latest checkpoint's TimeLineID: %u\n"),
+ ControlFile.checkPointCopy.ThisTimeLineID);
+ printf(_("Latest checkpoint's full_page_writes: %s\n"),
+ ControlFile.checkPointCopy.fullPageWrites ? _("on") : _("off"));
+ printf(_("Latest checkpoint's NextXID: %u:%u\n"),
+ EpochFromFullTransactionId(ControlFile.checkPointCopy.nextXid),
+ XidFromFullTransactionId(ControlFile.checkPointCopy.nextXid));
+ printf(_("Latest checkpoint's NextOID: %u\n"),
+ ControlFile.checkPointCopy.nextOid);
+ printf(_("Latest checkpoint's NextMultiXactId: %u\n"),
+ ControlFile.checkPointCopy.nextMulti);
+ printf(_("Latest checkpoint's NextMultiOffset: %u\n"),
+ ControlFile.checkPointCopy.nextMultiOffset);
+ printf(_("Latest checkpoint's oldestXID: %u\n"),
+ ControlFile.checkPointCopy.oldestXid);
+ printf(_("Latest checkpoint's oldestXID's DB: %u\n"),
+ ControlFile.checkPointCopy.oldestXidDB);
+ printf(_("Latest checkpoint's oldestActiveXID: %u\n"),
+ ControlFile.checkPointCopy.oldestActiveXid);
+ printf(_("Latest checkpoint's oldestMultiXid: %u\n"),
+ ControlFile.checkPointCopy.oldestMulti);
+ printf(_("Latest checkpoint's oldestMulti's DB: %u\n"),
+ ControlFile.checkPointCopy.oldestMultiDB);
+ printf(_("Latest checkpoint's oldestCommitTsXid:%u\n"),
+ ControlFile.checkPointCopy.oldestCommitTsXid);
+ printf(_("Latest checkpoint's newestCommitTsXid:%u\n"),
+ ControlFile.checkPointCopy.newestCommitTsXid);
+ printf(_("Maximum data alignment: %u\n"),
+ ControlFile.maxAlign);
+ /* we don't print floatFormat since can't say much useful about it */
+ printf(_("Database block size: %u\n"),
+ ControlFile.blcksz);
+ printf(_("Blocks per segment of large relation: %u\n"),
+ ControlFile.relseg_size);
+ printf(_("WAL block size: %u\n"),
+ ControlFile.xlog_blcksz);
+ printf(_("Bytes per WAL segment: %u\n"),
+ ControlFile.xlog_seg_size);
+ printf(_("Maximum length of identifiers: %u\n"),
+ ControlFile.nameDataLen);
+ printf(_("Maximum columns in an index: %u\n"),
+ ControlFile.indexMaxKeys);
+ printf(_("Maximum size of a TOAST chunk: %u\n"),
+ ControlFile.toast_max_chunk_size);
+ printf(_("Size of a large-object chunk: %u\n"),
+ ControlFile.loblksize);
+ /* This is no longer configurable, but users may still expect to see it: */
+ printf(_("Date/time type storage: %s\n"),
+ _("64-bit integers"));
+ printf(_("Float8 argument passing: %s\n"),
+ (ControlFile.float8ByVal ? _("by value") : _("by reference")));
+ printf(_("Data page checksum version: %u\n"),
+ ControlFile.data_checksum_version);
+}
+
+
+/*
+ * Print the values to be changed.
+ */
+static void
+PrintNewControlValues(void)
+{
+ char fname[MAXFNAMELEN];
+
+ /* This will be always printed in order to keep format same. */
+ printf(_("\n\nValues to be changed:\n\n"));
+
+ XLogFileName(fname, ControlFile.checkPointCopy.ThisTimeLineID,
+ newXlogSegNo, WalSegSz);
+ printf(_("First log segment after reset: %s\n"), fname);
+
+ if (set_mxid != 0)
+ {
+ printf(_("NextMultiXactId: %u\n"),
+ ControlFile.checkPointCopy.nextMulti);
+ printf(_("OldestMultiXid: %u\n"),
+ ControlFile.checkPointCopy.oldestMulti);
+ printf(_("OldestMulti's DB: %u\n"),
+ ControlFile.checkPointCopy.oldestMultiDB);
+ }
+
+ if (set_mxoff != -1)
+ {
+ printf(_("NextMultiOffset: %u\n"),
+ ControlFile.checkPointCopy.nextMultiOffset);
+ }
+
+ if (set_oid != 0)
+ {
+ printf(_("NextOID: %u\n"),
+ ControlFile.checkPointCopy.nextOid);
+ }
+
+ if (set_xid != 0)
+ {
+ printf(_("NextXID: %u\n"),
+ XidFromFullTransactionId(ControlFile.checkPointCopy.nextXid));
+ printf(_("OldestXID: %u\n"),
+ ControlFile.checkPointCopy.oldestXid);
+ printf(_("OldestXID's DB: %u\n"),
+ ControlFile.checkPointCopy.oldestXidDB);
+ }
+
+ if (set_xid_epoch != -1)
+ {
+ printf(_("NextXID epoch: %u\n"),
+ EpochFromFullTransactionId(ControlFile.checkPointCopy.nextXid));
+ }
+
+ if (set_oldest_commit_ts_xid != 0)
+ {
+ printf(_("oldestCommitTsXid: %u\n"),
+ ControlFile.checkPointCopy.oldestCommitTsXid);
+ }
+ if (set_newest_commit_ts_xid != 0)
+ {
+ printf(_("newestCommitTsXid: %u\n"),
+ ControlFile.checkPointCopy.newestCommitTsXid);
+ }
+
+ if (set_wal_segsize != 0)
+ {
+ printf(_("Bytes per WAL segment: %u\n"),
+ ControlFile.xlog_seg_size);
+ }
+}
+
+
+/*
+ * Write out the new pg_control file.
+ */
+static void
+RewriteControlFile(void)
+{
+ /*
+ * Adjust fields as needed to force an empty XLOG starting at
+ * newXlogSegNo.
+ */
+ XLogSegNoOffsetToRecPtr(newXlogSegNo, SizeOfXLogLongPHD, WalSegSz,
+ ControlFile.checkPointCopy.redo);
+ ControlFile.checkPointCopy.time = (pg_time_t) time(NULL);
+
+ ControlFile.state = DB_SHUTDOWNED;
+ ControlFile.checkPoint = ControlFile.checkPointCopy.redo;
+ ControlFile.minRecoveryPoint = 0;
+ ControlFile.minRecoveryPointTLI = 0;
+ ControlFile.backupStartPoint = 0;
+ ControlFile.backupEndPoint = 0;
+ ControlFile.backupEndRequired = false;
+
+ /*
+ * Force the defaults for max_* settings. The values don't really matter
+ * as long as wal_level='minimal'; the postmaster will reset these fields
+ * anyway at startup.
+ */
+ ControlFile.wal_level = WAL_LEVEL_MINIMAL;
+ ControlFile.wal_log_hints = false;
+ ControlFile.track_commit_timestamp = false;
+ ControlFile.MaxConnections = 100;
+ ControlFile.max_wal_senders = 10;
+ ControlFile.max_worker_processes = 8;
+ ControlFile.max_prepared_xacts = 0;
+ ControlFile.max_locks_per_xact = 64;
+
+ /* The control file gets flushed here. */
+ update_controlfile(".", &ControlFile, true);
+}
+
+
+/*
+ * Scan existing XLOG files and determine the highest existing WAL address
+ *
+ * On entry, ControlFile.checkPointCopy.redo and ControlFile.xlog_seg_size
+ * are assumed valid (note that we allow the old xlog seg size to differ
+ * from what we're using). On exit, newXlogSegNo is set to suitable
+ * value for the beginning of replacement WAL (in our seg size).
+ */
+static void
+FindEndOfXLOG(void)
+{
+ DIR *xldir;
+ struct dirent *xlde;
+ uint64 segs_per_xlogid;
+ uint64 xlogbytepos;
+
+ /*
+ * Initialize the max() computation using the last checkpoint address from
+ * old pg_control. Note that for the moment we are working with segment
+ * numbering according to the old xlog seg size.
+ */
+ segs_per_xlogid = (UINT64CONST(0x0000000100000000) / ControlFile.xlog_seg_size);
+ newXlogSegNo = ControlFile.checkPointCopy.redo / ControlFile.xlog_seg_size;
+
+ /*
+ * Scan the pg_wal directory to find existing WAL segment files. We assume
+ * any present have been used; in most scenarios this should be
+ * conservative, because of xlog.c's attempts to pre-create files.
+ */
+ xldir = opendir(XLOGDIR);
+ if (xldir == NULL)
+ pg_fatal("could not open directory \"%s\": %m", XLOGDIR);
+
+ while (errno = 0, (xlde = readdir(xldir)) != NULL)
+ {
+ if (IsXLogFileName(xlde->d_name) ||
+ IsPartialXLogFileName(xlde->d_name))
+ {
+ unsigned int tli,
+ log,
+ seg;
+ XLogSegNo segno;
+
+ /*
+ * Note: We don't use XLogFromFileName here, because we want to
+ * use the segment size from the control file, not the size the
+ * pg_resetwal binary was compiled with
+ */
+ sscanf(xlde->d_name, "%08X%08X%08X", &tli, &log, &seg);
+ segno = ((uint64) log) * segs_per_xlogid + seg;
+
+ /*
+ * Note: we take the max of all files found, regardless of their
+ * timelines. Another possibility would be to ignore files of
+ * timelines other than the target TLI, but this seems safer.
+ * Better too large a result than too small...
+ */
+ if (segno > newXlogSegNo)
+ newXlogSegNo = segno;
+ }
+ }
+
+ if (errno)
+ pg_fatal("could not read directory \"%s\": %m", XLOGDIR);
+
+ if (closedir(xldir))
+ pg_fatal("could not close directory \"%s\": %m", XLOGDIR);
+
+ /*
+ * Finally, convert to new xlog seg size, and advance by one to ensure we
+ * are in virgin territory.
+ */
+ xlogbytepos = newXlogSegNo * ControlFile.xlog_seg_size;
+ newXlogSegNo = (xlogbytepos + ControlFile.xlog_seg_size - 1) / WalSegSz;
+ newXlogSegNo++;
+}
+
+
+/*
+ * Remove existing XLOG files
+ */
+static void
+KillExistingXLOG(void)
+{
+ DIR *xldir;
+ struct dirent *xlde;
+ char path[MAXPGPATH + sizeof(XLOGDIR)];
+
+ xldir = opendir(XLOGDIR);
+ if (xldir == NULL)
+ pg_fatal("could not open directory \"%s\": %m", XLOGDIR);
+
+ while (errno = 0, (xlde = readdir(xldir)) != NULL)
+ {
+ if (IsXLogFileName(xlde->d_name) ||
+ IsPartialXLogFileName(xlde->d_name))
+ {
+ snprintf(path, sizeof(path), "%s/%s", XLOGDIR, xlde->d_name);
+ if (unlink(path) < 0)
+ pg_fatal("could not delete file \"%s\": %m", path);
+ }
+ }
+
+ if (errno)
+ pg_fatal("could not read directory \"%s\": %m", XLOGDIR);
+
+ if (closedir(xldir))
+ pg_fatal("could not close directory \"%s\": %m", XLOGDIR);
+}
+
+
+/*
+ * Remove existing archive status files
+ */
+static void
+KillExistingArchiveStatus(void)
+{
+#define ARCHSTATDIR XLOGDIR "/archive_status"
+
+ DIR *xldir;
+ struct dirent *xlde;
+ char path[MAXPGPATH + sizeof(ARCHSTATDIR)];
+
+ xldir = opendir(ARCHSTATDIR);
+ if (xldir == NULL)
+ pg_fatal("could not open directory \"%s\": %m", ARCHSTATDIR);
+
+ while (errno = 0, (xlde = readdir(xldir)) != NULL)
+ {
+ if (strspn(xlde->d_name, "0123456789ABCDEF") == XLOG_FNAME_LEN &&
+ (strcmp(xlde->d_name + XLOG_FNAME_LEN, ".ready") == 0 ||
+ strcmp(xlde->d_name + XLOG_FNAME_LEN, ".done") == 0 ||
+ strcmp(xlde->d_name + XLOG_FNAME_LEN, ".partial.ready") == 0 ||
+ strcmp(xlde->d_name + XLOG_FNAME_LEN, ".partial.done") == 0))
+ {
+ snprintf(path, sizeof(path), "%s/%s", ARCHSTATDIR, xlde->d_name);
+ if (unlink(path) < 0)
+ pg_fatal("could not delete file \"%s\": %m", path);
+ }
+ }
+
+ if (errno)
+ pg_fatal("could not read directory \"%s\": %m", ARCHSTATDIR);
+
+ if (closedir(xldir))
+ pg_fatal("could not close directory \"%s\": %m", ARCHSTATDIR);
+}
+
+
+/*
+ * Write an empty XLOG file, containing only the checkpoint record
+ * already set up in ControlFile.
+ */
+static void
+WriteEmptyXLOG(void)
+{
+ PGAlignedXLogBlock buffer;
+ XLogPageHeader page;
+ XLogLongPageHeader longpage;
+ XLogRecord *record;
+ pg_crc32c crc;
+ char path[MAXPGPATH];
+ int fd;
+ int nbytes;
+ char *recptr;
+
+ memset(buffer.data, 0, XLOG_BLCKSZ);
+
+ /* Set up the XLOG page header */
+ page = (XLogPageHeader) buffer.data;
+ page->xlp_magic = XLOG_PAGE_MAGIC;
+ page->xlp_info = XLP_LONG_HEADER;
+ page->xlp_tli = ControlFile.checkPointCopy.ThisTimeLineID;
+ page->xlp_pageaddr = ControlFile.checkPointCopy.redo - SizeOfXLogLongPHD;
+ longpage = (XLogLongPageHeader) page;
+ longpage->xlp_sysid = ControlFile.system_identifier;
+ longpage->xlp_seg_size = WalSegSz;
+ longpage->xlp_xlog_blcksz = XLOG_BLCKSZ;
+
+ /* Insert the initial checkpoint record */
+ recptr = (char *) page + SizeOfXLogLongPHD;
+ record = (XLogRecord *) recptr;
+ record->xl_prev = 0;
+ record->xl_xid = InvalidTransactionId;
+ record->xl_tot_len = SizeOfXLogRecord + SizeOfXLogRecordDataHeaderShort + sizeof(CheckPoint);
+ record->xl_info = XLOG_CHECKPOINT_SHUTDOWN;
+ record->xl_rmid = RM_XLOG_ID;
+
+ recptr += SizeOfXLogRecord;
+ *(recptr++) = (char) XLR_BLOCK_ID_DATA_SHORT;
+ *(recptr++) = sizeof(CheckPoint);
+ memcpy(recptr, &ControlFile.checkPointCopy,
+ sizeof(CheckPoint));
+
+ INIT_CRC32C(crc);
+ COMP_CRC32C(crc, ((char *) record) + SizeOfXLogRecord, record->xl_tot_len - SizeOfXLogRecord);
+ COMP_CRC32C(crc, (char *) record, offsetof(XLogRecord, xl_crc));
+ FIN_CRC32C(crc);
+ record->xl_crc = crc;
+
+ /* Write the first page */
+ XLogFilePath(path, ControlFile.checkPointCopy.ThisTimeLineID,
+ newXlogSegNo, WalSegSz);
+
+ unlink(path);
+
+ fd = open(path, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode);
+ if (fd < 0)
+ pg_fatal("could not open file \"%s\": %m", path);
+
+ errno = 0;
+ if (write(fd, buffer.data, XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write file \"%s\": %m", path);
+ }
+
+ /* Fill the rest of the file with zeroes */
+ memset(buffer.data, 0, XLOG_BLCKSZ);
+ for (nbytes = XLOG_BLCKSZ; nbytes < WalSegSz; nbytes += XLOG_BLCKSZ)
+ {
+ errno = 0;
+ if (write(fd, buffer.data, XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ {
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write file \"%s\": %m", path);
+ }
+ }
+
+ if (fsync(fd) != 0)
+ pg_fatal("fsync error: %m");
+
+ close(fd);
+}
+
+
+static void
+usage(void)
+{
+ printf(_("%s resets the PostgreSQL write-ahead log.\n\n"), progname);
+ printf(_("Usage:\n %s [OPTION]... DATADIR\n\n"), progname);
+ printf(_("Options:\n"));
+ printf(_(" -c, --commit-timestamp-ids=XID,XID\n"
+ " set oldest and newest transactions bearing\n"
+ " commit timestamp (zero means no change)\n"));
+ printf(_(" [-D, --pgdata=]DATADIR data directory\n"));
+ printf(_(" -e, --epoch=XIDEPOCH set next transaction ID epoch\n"));
+ printf(_(" -f, --force force update to be done\n"));
+ printf(_(" -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"));
+ printf(_(" -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"));
+ printf(_(" -n, --dry-run no update, just show what would be done\n"));
+ printf(_(" -o, --next-oid=OID set next OID\n"));
+ printf(_(" -O, --multixact-offset=OFFSET set next multitransaction offset\n"));
+ printf(_(" -u, --oldest-transaction-id=XID set oldest transaction ID\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -x, --next-transaction-id=XID set next transaction ID\n"));
+ printf(_(" --wal-segsize=SIZE size of WAL segments, in megabytes\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/pg_resetwal/po/cs.po b/src/bin/pg_resetwal/po/cs.po
new file mode 100644
index 0000000..f1ec4d9
--- /dev/null
+++ b/src/bin/pg_resetwal/po/cs.po
@@ -0,0 +1,721 @@
+# Czech message translation file for pg_resetxlog
+# Copyright (C) 2012 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Tomas Vondra <tv@fuzzy.cz>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetxlog-cs (PostgreSQL 9.3)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:15+0000\n"
+"PO-Revision-Date: 2020-10-31 21:25+0100\n"
+"Last-Translator: Tomas Vondra <tv@fuzzy.cz>\n"
+"Language-Team: Czech <info@cspug.cx>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "fatal: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "nelze načíst knihovnu \"%s\": kód chyby %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "na této platformě nelze vytvářet vyhrazené tokeny: kód chyby %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "nelze otevřít process token: chybový kód %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "nelze alokovat SIDs: chybový kód %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "nelze vytvořit vyhrazený token: chybový kód %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "nelze spustit proces pro příkaz \"%s\": chybový kód %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "nelze znovu spustit s vyhrazeným tokenem: chybový kód %lu"
+
+#: ../../common/restricted_token.c:194
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "nelze získat návratový kód ze subprocesu: chybový kód %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:160 pg_resetwal.c:175 pg_resetwal.c:190 pg_resetwal.c:197
+#: pg_resetwal.c:221 pg_resetwal.c:236 pg_resetwal.c:244 pg_resetwal.c:269
+#: pg_resetwal.c:283
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "neplatný argument pro volbu %s"
+
+#: pg_resetwal.c:161 pg_resetwal.c:176 pg_resetwal.c:191 pg_resetwal.c:198
+#: pg_resetwal.c:222 pg_resetwal.c:237 pg_resetwal.c:245 pg_resetwal.c:270
+#: pg_resetwal.c:284 pg_resetwal.c:310 pg_resetwal.c:323 pg_resetwal.c:331
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_resetwal.c:166
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "epocha ID transakce (-e) nesmí být -1"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "transaction ID (-x) must not be 0"
+msgstr "ID transakce (-x) nesmí být 0"
+
+#: pg_resetwal.c:205 pg_resetwal.c:212
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "ID transakce (-c) musí být buď 0 nebo větší než nebo rovno 2"
+
+#: pg_resetwal.c:227
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) nesmí být 0"
+
+#: pg_resetwal.c:250
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "ID multitransakce (-m) nesmí být 0"
+
+#: pg_resetwal.c:260
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "ID nejstarší multitransakce (-m) nesmí být 0"
+
+#: pg_resetwal.c:275
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "offset multitransakce (-O) nesmí být -1"
+
+#: pg_resetwal.c:299
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "argument pro --wal-segsize musí být číslo"
+
+#: pg_resetwal.c:304
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "argument pro --wal-segsize musí být mocnina 2 mezi 1 a 1024"
+
+#: pg_resetwal.c:321
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "příliš mnoho parametrů na příkazové řádce (první je \"%s\")"
+
+#: pg_resetwal.c:330
+#, c-format
+msgid "no data directory specified"
+msgstr "není specifikován datový adresář"
+
+#: pg_resetwal.c:344
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "nelze spouštět jako \"root\""
+
+#: pg_resetwal.c:345
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Musíte spustit %s jako PostgreSQL superuživatel."
+
+#: pg_resetwal.c:356
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "nelze zjistit přístupová práva adresáře \"%s\": %m"
+
+#: pg_resetwal.c:365
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "nelze změnit adresář na \"%s\" : %m"
+
+#: pg_resetwal.c:381 pg_resetwal.c:544 pg_resetwal.c:595
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "nelze otevřít soubor \"%s\" pro čtení: %m"
+
+#: pg_resetwal.c:388
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "soubor se zámkem \"%s\" existuje"
+
+#: pg_resetwal.c:389
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "Neběží již server? Jestliže ne, smažte soubor se zámkem a zkuste to znova."
+
+#: pg_resetwal.c:492
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Jestliže tyto hodnoty vypadají akceptovatelně, použijte -f pro vynucený reset.\n"
+
+#: pg_resetwal.c:504
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"Databázový server nebyl ukončen čistě.\n"
+"Resetování transakčního logu může způsobit ztrátu dat.\n"
+"Jestliže i přesto chcete pokračovat, použijte -f pro vynucený reset.\n"
+
+#: pg_resetwal.c:518
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Transakční log resetován\n"
+
+#: pg_resetwal.c:553
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "neočekávaný prázdný soubor \"%s\""
+
+#: pg_resetwal.c:555 pg_resetwal.c:611
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "nelze číst soubor \"%s\": %m"
+
+#: pg_resetwal.c:564
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "datový adresář pochází z nesprávné verze"
+
+#: pg_resetwal.c:565
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "Soubor \"%s\" obsahuje \"%s\", což je nekompatibilní s verzí \"%s\" tohoto programu."
+
+#: pg_resetwal.c:598
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Máte-li jistotu, že je cesta k datovému adresáři správná, proveďte\n"
+" touch %s\n"
+"a zkuste to znovu."
+
+#: pg_resetwal.c:629
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control existuje, ale s neplatným kontrolním součtem CRC; postupujte opatrně"
+
+#: pg_resetwal.c:638
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control obsahuje neplatnou velikost WAL segmentu (%d byte); pokračujte obezřetně"
+msgstr[1] "pg_control obsahuje neplatnou velikost WAL segmentu (%d bytů); pokračujte obezřetně"
+msgstr[2] "pg_control obsahuje neplatnou velikost WAL segmentu (%d bytů); pokračujte obezřetně"
+
+#: pg_resetwal.c:649
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control existuje, ale je poškozen nebo neznámé verze; ignoruji to"
+
+#: pg_resetwal.c:744
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Odhadnuté hodnoty pg_controlu:\n"
+"\n"
+
+#: pg_resetwal.c:746
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Současné pg_control hodnoty:\n"
+"\n"
+
+#: pg_resetwal.c:748
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Číslo verze pg_controlu: %u\n"
+
+#: pg_resetwal.c:750
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Číslo verze katalogu: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr ""
+"Identifikátor databázového systému: %llu\n"
+"\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Poslední full_page_writes checkpointu: %s\n"
+
+#: pg_resetwal.c:757
+msgid "off"
+msgstr "vypnuto"
+
+#: pg_resetwal.c:757
+msgid "on"
+msgstr "zapnuto"
+
+#: pg_resetwal.c:758
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID posledního checkpointu: %u:%u\n"
+
+#: pg_resetwal.c:761
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "Poslední umístění NextOID checkpointu: %u\n"
+
+#: pg_resetwal.c:763
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:765
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:767
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB k oldestXID posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:775
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB k oldestMulti posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:777
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:779
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:781
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Maximální zarovnání dat: %u\n"
+
+#: pg_resetwal.c:784
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Velikost databázového bloku: %u\n"
+
+#: pg_resetwal.c:786
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Bloků v segmentu velké relace: %u\n"
+
+#: pg_resetwal.c:788
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Velikost WAL bloku: %u\n"
+
+#: pg_resetwal.c:790 pg_resetwal.c:876
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytů ve WAL segmentu: %u\n"
+
+#: pg_resetwal.c:792
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Maximální délka identifikátorů: %u\n"
+
+#: pg_resetwal.c:794
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Maximální počet sloupců v indexu: %u\n"
+
+#: pg_resetwal.c:796
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Maximální velikost úseku TOAST: %u\n"
+
+#: pg_resetwal.c:798
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Velikost large-object chunku: %u\n"
+
+#: pg_resetwal.c:801
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Způsob uložení typu date/time: %s\n"
+
+#: pg_resetwal.c:802
+msgid "64-bit integers"
+msgstr "64-bitová čísla"
+
+#: pg_resetwal.c:803
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Způsob předávání float8 hodnot: %s\n"
+
+#: pg_resetwal.c:804
+msgid "by reference"
+msgstr "odkazem"
+
+#: pg_resetwal.c:804
+msgid "by value"
+msgstr "hodnotou"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Verze kontrolních součtů datových stránek: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Hodnoty které se změní:\n"
+"\n"
+
+#: pg_resetwal.c:823
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "První log segment po resetu: %s\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:829
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:831
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "DB k OldestMulti: %u\n"
+
+#: pg_resetwal.c:837
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:843
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:849
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:851
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:853
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "DB k OldestXID: %u\n"
+
+#: pg_resetwal.c:859
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID epoch: %u\n"
+
+#: pg_resetwal.c:865
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:870
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:956 pg_resetwal.c:1024 pg_resetwal.c:1071
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "nelze otevřít adresář \"%s\": %m"
+
+#: pg_resetwal.c:991 pg_resetwal.c:1044 pg_resetwal.c:1094
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "nelze číst z adresáře \"%s\": %m"
+
+#: pg_resetwal.c:997 pg_resetwal.c:1050 pg_resetwal.c:1100
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "nelze zavřít adresář \"%s\": %m"
+
+#: pg_resetwal.c:1036 pg_resetwal.c:1086
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "nelze smazat soubor \"%s\": %m"
+
+#: pg_resetwal.c:1167
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "nelze otevřít soubor \"%s\": %m"
+
+#: pg_resetwal.c:1177 pg_resetwal.c:1190
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "nelze zapsat soubor \"%s\": %m"
+
+#: pg_resetwal.c:1197
+#, c-format
+msgid "fsync error: %m"
+msgstr "fsync error: %m"
+
+#: pg_resetwal.c:1208
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s resetuje PostgreSQL transakční log.\n"
+"\n"
+
+#: pg_resetwal.c:1209
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Použití:\n"
+" %s [VOLBA]... ADRESÁŘ\n"
+"\n"
+
+#: pg_resetwal.c:1210
+#, c-format
+msgid "Options:\n"
+msgstr "Přepínače:\n"
+
+#: pg_resetwal.c:1211
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" nastaví nejstarší a nejnovější s nastaveným\n"
+" commit timestamp (nula znamená beze změny)\n"
+
+#: pg_resetwal.c:1214
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]ADRESÁŘ datový adresář\n"
+
+#: pg_resetwal.c:1215
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH nastaví epochu následujícího ID transakce\n"
+
+#: pg_resetwal.c:1216
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force vynutí provedení update\n"
+
+#: pg_resetwal.c:1217
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFILE vynutí minimální počáteční WAL pozici pro nový transakční log\n"
+
+#: pg_resetwal.c:1218
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID nastav další a nejstarší ID multitransakce\n"
+
+#: pg_resetwal.c:1219
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run bez update, pouze ukáže co by bylo provedeno\n"
+
+#: pg_resetwal.c:1220
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID nastaví následující OID\n"
+
+#: pg_resetwal.c:1221
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET nastaví offset následující multitransakce\n"
+
+#: pg_resetwal.c:1222
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ukáže informace o verzi a skončí\n"
+
+#: pg_resetwal.c:1223
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID nastaví ID následující transakce\n"
+
+#: pg_resetwal.c:1224
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=VELIKOST velikost WAL segmentů, v megabytech\n"
+
+#: pg_resetwal.c:1225
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukáže tuto nápovědu a skončí\n"
+
+#: pg_resetwal.c:1226
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Chyby hlašte na <%s>.\n"
+
+#: pg_resetwal.c:1227
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#~ msgid "%s: cannot be executed by \"root\"\n"
+#~ msgstr "%s: nemůže být spuštěn uživatelem \"root\"\n"
+
+#~ msgid "%s: could not read permissions of directory \"%s\": %s\n"
+#~ msgstr "%s: nelze načíst přístupová práva pro adresář \"%s\": %s\n"
+
+#~ msgid "%s: could not change directory to \"%s\": %s\n"
+#~ msgstr "%s: nelze změnit adresář na \"%s\": %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: nelze otevřít soubor \"%s\" pro čtení: %s\n"
+
+#~ msgid "%s: could not read file \"%s\": %s\n"
+#~ msgstr "%s: nelze číst soubor \"%s\": %s\n"
+
+#~ msgid "%s: could not create pg_control file: %s\n"
+#~ msgstr "%s: nelze vytvořit pg_control soubor: %s\n"
+
+#~ msgid "%s: could not write pg_control file: %s\n"
+#~ msgstr "%s: nelze zapsat pg_control soubor: %s\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s: nelze otevřít adresář \"%s\": %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s: nelze číst z adresáře \"%s\": %s\n"
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s: nelze zavřít adresář \"%s\": %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s: nelze otevřít soubor \"%s\": %s\n"
+
+#~ msgid "%s: could not write file \"%s\": %s\n"
+#~ msgstr "%s: nelze zapsat do souboru \"%s\": %s\n"
+
+#~ msgid "%s: invalid argument for option -x\n"
+#~ msgstr "%s: neplatný argument pro volbu -x\n"
+
+#~ msgid "%s: invalid argument for option -o\n"
+#~ msgstr "%s: neplatný argument pro volbu -o\n"
+
+#~ msgid "%s: invalid argument for option -m\n"
+#~ msgstr "%s: neplatný argument pro volbu -m\n"
+
+#~ msgid "%s: invalid argument for option -O\n"
+#~ msgstr "%s: neplatný argument pro volbu -O\n"
+
+#~ msgid "%s: invalid argument for option -l\n"
+#~ msgstr "%s: neplatný argument pro volbu -l\n"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "čísla s plovoucí řádovou čárkou"
+
+#~ msgid "%s: internal error -- sizeof(ControlFileData) is too large ... fix PG_CONTROL_SIZE\n"
+#~ msgstr "%s: interní chyba -- sizeof(ControlFileData) je příliš velký ... opravte PG_CONTROL_SIZE\n"
+
+#~ msgid "First log file ID after reset: %u\n"
+#~ msgstr "První ID log souboru po resetu: %u\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Způsob předávání float4 hodnot: %s\n"
diff --git a/src/bin/pg_resetwal/po/de.po b/src/bin/pg_resetwal/po/de.po
new file mode 100644
index 0000000..6a7cf3a
--- /dev/null
+++ b/src/bin/pg_resetwal/po/de.po
@@ -0,0 +1,667 @@
+# German message translation file for pg_resetwal
+# Peter Eisentraut <peter@eisentraut.org>, 2002 - 2022.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-08 07:49+0000\n"
+"PO-Revision-Date: 2022-05-08 14:16+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "konnte Bibliothek »%s« nicht laden: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "auf dieser Plattform können keine beschränkten Token erzeugt werden: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "konnte Prozess-Token nicht öffnen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "konnte SIDs nicht erzeugen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "konnte beschränktes Token nicht erzeugen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "konnte Prozess für Befehl »%s« nicht starten: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "konnte Prozess nicht mit beschränktem Token neu starten: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "ungültiges Argument für Option %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "Transaktions-ID-Epoche (-e) darf nicht -1 sein"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "älteste Transaktions-ID (-u) muss größer oder gleich %u sein"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "Transaktions-ID (-x) muss größer oder gleich %u sein"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "Transaktions-ID (-c) muss entweder 0 oder größer oder gleich 2 sein"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) darf nicht 0 sein"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "Multitransaktions-ID (-m) darf nicht 0 sein"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "älteste Multitransaktions-ID (-m) darf nicht 0 sein"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "Multitransaktions-Offset (-O) darf nicht -1 sein"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "Argument von --wal-segsize muss eine Zahl sein"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "Argument von --wal-segsize muss eine Zweierpotenz zwischen 1 und 1024 sein"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "kein Datenverzeichnis angegeben"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "kann nicht von »root« ausgeführt werden"
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Sie müssen %s als PostgreSQL-Superuser ausführen."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "konnte nicht in Verzeichnis »%s« wechseln: %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "Sperrdatei »%s« existiert"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "Läuft der Server? Wenn nicht, dann Sperrdatei löschen und nochmal versuchen."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Wenn diese Werte akzeptabel scheinen, dann benutzen Sie -f um das\n"
+"Zurücksetzen zu erzwingen.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"Der Datenbankserver wurde nicht sauber heruntergefahren.\n"
+"Beim Zurücksetzen des Write-Ahead-Logs können Daten verloren gehen.\n"
+"Wenn Sie trotzdem weiter machen wollen, benutzen Sie -f, um das\n"
+"Zurücksetzen zu erzwingen.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Write-Ahead-Log wurde zurückgesetzt\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "unerwartete leere Datei »%s«"
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht lesen: %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "Datenverzeichnis hat falsche Version"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "Datei »%s« enthält »%s«, was nicht mit der Version dieses Programms »%s« kompatibel ist."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Wenn Sie sicher sind, dass das Datenverzeichnis korrekt ist, führen Sie\n"
+" touch %s\n"
+"aus und versuchen Sie es erneut."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control existiert, aber mit ungültiger CRC; mit Vorsicht fortfahren"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control gibt ungültige WAL-Segmentgröße an (%d Byte); mit Vorsicht fortfahren"
+msgstr[1] "pg_control gibt ungültige WAL-Segmentgröße an (%d Bytes); mit Vorsicht fortfahren"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control existiert, aber ist kaputt oder hat falsche Version; wird ignoriert"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Geschätzte pg_control-Werte:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Aktuelle pg_control-Werte:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control-Versionsnummer: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Katalogversionsnummer: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Datenbanksystemidentifikation: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "full_page_writes des letzten Checkpoints: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "aus"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "an"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID des letzten Checkpoints: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB der oldestXID des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB des oldestMulti des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Maximale Datenausrichtung (Alignment): %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Datenbankblockgröße: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Blöcke pro Segment: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL-Blockgröße: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytes pro WAL-Segment: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Maximale Bezeichnerlänge: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Maximale Spalten in einem Index: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Maximale Größe eines Stücks TOAST: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Größe eines Large-Object-Chunks: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Speicherung von Datum/Zeit-Typen: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "64-Bit-Ganzzahlen"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Übergabe von Float8-Argumenten: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "Referenz"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "Wert"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Datenseitenprüfsummenversion: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Zu ändernde Werte:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Erstes Logdateisegment nach Zurücksetzen: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMulti's DB: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXID's DB: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID-Epoche: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht öffnen: %m"
+
+#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht lesen: %m"
+
+#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht schließen: %m"
+
+#: pg_resetwal.c:990 pg_resetwal.c:1028
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht löschen: %m"
+
+#: pg_resetwal.c:1100
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: pg_resetwal.c:1108 pg_resetwal.c:1120
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schreiben: %m"
+
+#: pg_resetwal.c:1125
+#, c-format
+msgid "fsync error: %m"
+msgstr "fsync-Fehler: %m"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s setzt den PostgreSQL-Write-Ahead-Log zurück.\n"
+"\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Aufruf:\n"
+" %s [OPTION]... DATENVERZEICHNIS\n"
+"\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid "Options:\n"
+msgstr "Optionen:\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" älteste und neuste Transaktion mit Commit-\n"
+" Timestamp setzen (Null bedeutet keine Änderung)\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]VERZ Datenbankverzeichnis\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCHE nächste Transaktions-ID-Epoche setzen\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force Änderung erzwingen\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALDATEI minimale Startposition für neuen WAL setzen\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID nächste und älteste Multitransaktions-ID setzen\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr ""
+" -n, --dry-run keine Änderungen; nur zeigen, was gemacht\n"
+" werden würde\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID nächste OID setzen\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET nächsten Multitransaktions-Offset setzen\n"
+
+#: pg_resetwal.c:1148
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID älteste Transaktions-ID setzen\n"
+
+#: pg_resetwal.c:1149
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_resetwal.c:1150
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID nächste Transaktions-ID setzen\n"
+
+#: pg_resetwal.c:1151
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=ZAHL Größe eines WAL-Segments, in Megabytes\n"
+
+#: pg_resetwal.c:1152
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_resetwal.c:1153
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: pg_resetwal.c:1154
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
diff --git a/src/bin/pg_resetwal/po/el.po b/src/bin/pg_resetwal/po/el.po
new file mode 100644
index 0000000..8850a7e
--- /dev/null
+++ b/src/bin/pg_resetwal/po/el.po
@@ -0,0 +1,679 @@
+# Greek message translation file for pg_resetwal
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_resetwal (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetwal (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-14 09:18+0000\n"
+"PO-Revision-Date: 2023-04-14 13:51+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "προειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέρεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "δεν ήταν δυνατή η φόρτωση της βιβλιοθήκης «%s»: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "δεν ήταν δυνατή η δημιουργία διακριτικών περιορισμού στην παρούσα πλατφόρμα: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "δεν ήταν δυνατό το άνοιγμα διακριτικού διεργασίας: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "δεν ήταν δυνατή η εκχώρηση SID: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "δεν ήταν δυνατή η δημιουργία διακριτικού διεργασίας: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "δεν ήταν δυνατή η εκκίνηση διεργασίας για την εντολή «%s»: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "δεν ήταν δυνατή η επανεκκίνηση με διακριτικό περιορισμού: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "δεν ήταν δυνατή η απόκτηση κωδικού εξόδου από την υποδιεργασία: κωδικός σφάλματος %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "μη έγκυρη παράμετρος για την επιλογή %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "η εποχή αναγνωριστικού συναλλαγής (-e) δεν πρέπει να είναι -1"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "το παλαιότερο αναγνωριστικό συναλλαγής (-u) πρέπει να είναι μεγαλύτερο ή ίσο με %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "το αναγνωριστικό συναλλαγής (-x) πρέπει να είναι μεγαλύτερο ή ίσο με %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "το αναγνωριστικό συναλλαγής (-c) πρέπει να είναι είτε 0 είτε μεγαλύτερο ή ίσο με 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) δεν πρέπει να είναι 0"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "το αναγνωριστικό πολλαπλής συναλλαγής (-m) δεν πρέπει να είναι 0"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "το παλαιότερο αναγνωριστικό πολλαπλής συναλλαγής (-m) δεν πρέπει να είναι 0"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "η μετατόπιση πολλαπλής συναλλαγής (-O) δεν πρέπει να είναι -1"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "η παράμετρος --wal-segsize πρέπει να είναι αριθμός"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "η παράμετρος --wal-segsize πρέπει να έχει τιμή δύναμης 2 μεταξύ 1 και 1024"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "δεν ορίστηκε κατάλογος δεδομένων"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "δεν είναι δυνατή η εκτέλεση από \"root\""
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Πρέπει να εκτελέσετε %s ως υπερχρήστης PostgreSQL."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση δικαιωμάτων του καταλόγου «%s»: %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου «%s» για ανάγνωση: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "το αρχείο κλειδώματος \"%s\" υπάρχει"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "Εκτελείται ο διακομιστής; Εάν όχι, διαγράψτε το αρχείο κλειδώματος και προσπαθήστε ξανά."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Εάν αυτές οι τιμές φαίνονται αποδεκτές, χρησιμοποιήστε το -f για να αναγκάσετε την επαναφορά.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"Ο διακομιστής βάσης δεδομένων δεν τερματίστηκε με καθαρά.\n"
+"Η επαναφορά του write-ahead log ενδέχεται να προκαλέσει απώλεια δεδομένων.\n"
+"Εάν θέλετε να προχωρήσετε ούτως ή άλλως, χρησιμοποιήστε -f για να αναγκάσετε την επαναφορά.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Επαναφορά write-ahead log\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "μη αναμενόμενο κενό αρχείο «%s»"
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "ο κατάλογος δεδομένων είναι εσφαλμένης έκδοσης"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "Το αρχείο «%s» περιέχει «%s», το οποίο δεν είναι συμβατό με την έκδοση «%s» αυτού του προγράμματος."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Εάν είστε βέβαιοι ότι η διαδρομή καταλόγου δεδομένων είναι σωστή, εκτελέστε\n"
+" touch %s\n"
+"και προσπάθησε ξανά."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control υπάρχει αλλά δεν έχει έγκυρο CRC· προχωρήστε με προσοχή"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control καθορίζει το μη έγκυρο μέγεθος τμήματος WAL (%d byte)· προχωρήστε με προσοχή"
+msgstr[1] "pg_control καθορίζει το μη έγκυρο μέγεθος τμήματος WAL (%d bytes)· προχωρήστε με προσοχή"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control υπάρχει, αλλά είναι κατεστραμμένη ή λάθος έκδοση· παραβλέπεται"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Μάντεψε τιμές pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Τρέχουσες τιμές pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr ""
+"pg_control αριθμός έκδοσης: %u\n"
+"\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Αριθμός έκδοσης καταλόγου: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Αναγνωριστικό συστήματος βάσης δεδομένων: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "Πιο πρόσφατο TimeLineID του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Πιο πρόσφατο full_page_writes του σημείου ελέγχου: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "κλειστό"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "ανοικτό"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "Πιο πρόσφατο NextXID του σημείου ελέγχου: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "Πιο πρόσφατο NextOID του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "Πιο πρόσφατο NextMultiXactId του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "Πιο πρόσφατο NextMultiOffset του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "Πιο πρόσφατο oldestXID του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "Πιο πρόσφατο oldestXID’s DB του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "Πιο πρόσφατο oldestActiveXID του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "Πιο πρόσφατο oldestMultiXid του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "Πιο πρόσφατο oldestMulti’s DB του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "Πιο πρόσφατο oldestCommitTsXid του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "Πιο πρόσφατο newestCommitTsXid του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Μέγιστη στοίχιση δεδομένων: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Μέγεθος μπλοκ βάσης δεδομένων: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Μπλοκ ανά τμήμα μεγάλης σχέσης: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Μέγεθος μπλοκ WAL: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytes ανά τμήμα WAL: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Μέγιστο μήκος αναγνωριστικών: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Μέγιστες στήλες σε ένα ευρετήριο: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Μέγιστο μέγεθος ενός τμήματος TOAST: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Μέγεθος τμήματος μεγάλου αντικειμένου: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Τύπος αποθήκευσης ημερομηνίας/ώρας: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "Ακέραιοι 64-bit"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Μεταβλητή Float8 τέθηκε: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "με αναφορά"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "με τιμή"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Έκδοση αθροίσματος ελέγχου σελίδας δεδομένων: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"Τιμές προς αλλαγή:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Πρώτο τμήμα καταγραφής μετά την επαναφορά: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMulti’s DB: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXID’s DB: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID epoch: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m"
+
+#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m"
+
+#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m"
+
+#: pg_resetwal.c:990 pg_resetwal.c:1028
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αφαίρεση του αρχείου \"%s\": %m"
+
+#: pg_resetwal.c:1100
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %m"
+
+#: pg_resetwal.c:1108 pg_resetwal.c:1120
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγραφή αρχείου «%s»: %m"
+
+#: pg_resetwal.c:1125
+#, c-format
+msgid "fsync error: %m"
+msgstr "σφάλμα fsync: %m"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s επαναφέρει το write-ahead log της PostgreSQL.\n"
+"\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Χρήση:\n"
+" %s [ΕΠΙΛΟΓΗ]… DATADIR\n"
+"\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid "Options:\n"
+msgstr "Επιλογές:\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" ορισμός παλαιότερων και νεότερων συναλλαγών που φέρουν\n"
+" χρονική σήμανση ολοκλήρωσης (μηδέν σημαίνει καμία αλλαγή)\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR κατάλογος δεδομένων\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH όρισε την εποχή του επόμενου αναγνωριστικού συναλλαγής\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force επέβαλλε την ενημέρωση\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFILE όρισε την ελάχιστη θέση εκκίνησης του νέου WAL\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID όρισε το επόμενο και παλαιότερο αναγνωριστικό πολλαπλής συναλλαγής\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run καμία ενημέρωση, απλά εμφάνισε τι θα συνέβαινε\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID όρισε το επόμενο OID\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET όρισε την επόμενη μετατόπιση πολλαπλής συναλλαγής\n"
+
+#: pg_resetwal.c:1148
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID όρισε το παλαιότερο ID συναλλαγής\n"
+
+#: pg_resetwal.c:1149
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_resetwal.c:1150
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID όρισε το επόμενο αναγνωριστικό συναλλαγής\n"
+
+#: pg_resetwal.c:1151
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE μέγεθος των τμημάτων WAL, σε megabytes\n"
+
+#: pg_resetwal.c:1152
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_resetwal.c:1153
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφορές σφάλματων σε <%s>.\n"
+
+#: pg_resetwal.c:1154
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αρχική σελίδα: <%s>\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#~ msgid "fatal: "
+#~ msgstr "κρίσιμο: "
+
+#~ msgid "transaction ID (-x) must not be 0"
+#~ msgstr "το αναγνωριστικό συναλλαγής (-x) δεν πρέπει να είναι 0"
diff --git a/src/bin/pg_resetwal/po/es.po b/src/bin/pg_resetwal/po/es.po
new file mode 100644
index 0000000..2b7e782
--- /dev/null
+++ b/src/bin/pg_resetwal/po/es.po
@@ -0,0 +1,681 @@
+# Spanish message translation file for pg_resetwal
+#
+# Copyright (c) 2003-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Ivan Hernandez <ivanx@ciencias.unam.mx>, 2003.
+# Alvaro Herrera <alvherre@alvh.no-ip.org>, 2004-2014
+# Jaime Casanova <systemguards@gmail.com>, 2005
+# Martín Marqués <martin@2ndquadrant.com>, 2013-2014
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetwal (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:48+0000\n"
+"PO-Revision-Date: 2022-10-20 09:06+0200\n"
+"Last-Translator: Carlos Chapi <carlos.chapi@2ndquadrant.com>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "no se pudo cargar la biblioteca «%s»: código de error %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "no se pueden crear tokens restrigidos en esta plataforma: código de error %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "no se pudo abrir el token de proceso: código de error %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "no se pudo emplazar los SIDs: código de error %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "no se pudo crear el token restringido: código de error %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "no se pudo iniciar el proceso para la orden «%s»: código de error %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "no se pudo re-ejecutar con el token restringido: código de error %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "no se pudo obtener el código de salida del subproceso»: código de error %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argumento no válido para la opción %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "el «epoch» de ID de transacción (-e) no debe ser -1"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "el ID de transacción más antiguo (-u) debe ser mayor o igual a %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "el ID de transacción (-x) debe ser mayor o igual a %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "el ID de transacción (-c) debe ser 0 o bien mayor o igual a 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) no debe ser cero"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "el ID de multitransacción (-m) no debe ser 0"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "el ID de multitransacción más antiguo (-m) no debe ser 0"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "la posición de multitransacción (-O) no debe ser -1"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "el argumento de --wal-segsize debe ser un número"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "el argumento de --wal-segsize debe ser una potencia de 2 entre 1 y 1024"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "directorio de datos no especificado"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "no puede ser ejecutado con el usuario «root»"
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Debe ejecutar %s con el superusuario de PostgreSQL."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "no se pudo obtener los permisos del directorio «%s»: %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "no se pudo cambiar al directorio «%s»: %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "no se pudo abrir archivo «%s» para lectura: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "el archivo candado «%s» existe"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "¿Hay un servidor corriendo? Si no, borre el archivo candado e inténtelo de nuevo."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Si estos valores parecen aceptables, use -f para forzar reinicio.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"El servidor de bases de datos no se apagó limpiamente.\n"
+"Restablecer el WAL puede causar pérdida de datos.\n"
+"Si quiere continuar de todas formas, use -f para forzar el restablecimiento.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "«Write-ahead log» restablecido\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "archivo vacío inesperado «%s»"
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "no se pudo leer el archivo «%s»: %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "el directorio de datos tiene la versión equivocada"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "El archivo «%s» contiene «%s», que no es compatible con la versión «%s» de este programa."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Si está seguro que la ruta al directorio de datos es correcta, ejecute\n"
+" touch %s\n"
+"y pruebe de nuevo."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "existe pg_control pero tiene un CRC no válido, proceda con precaución"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control especifica un tamaño de segmento de WAL no válido (%d byte), proceda con precaución"
+msgstr[1] "pg_control especifica un tamaño de segmento de WAL no válido (%d bytes), proceda con precaución"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "existe pg_control pero está roto o tiene la versión equivocada; ignorándolo"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Valores de pg_control asumidos:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Valores actuales de pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Número de versión de pg_control: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Número de versión de catálogo: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identificador de sistema: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID del checkpoint más reciente: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "full_page_writes del checkpoint más reciente: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "desactivado"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "activado"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID del checkpoint más reciente: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID del checkpoint más reciente: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId del checkpoint más reciente: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset del checkpoint más reciente: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID del checkpoint más reciente: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "BD del oldestXID del checkpoint más reciente: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID del checkpoint más reciente: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid del checkpoint más reciente: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "BD del oldestMultiXid del checkpt. más reciente: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid del último checkpoint: %u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid del último checkpoint: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Máximo alineamiento de datos: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Tamaño del bloque de la base de datos: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Bloques por segmento de relación grande: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Tamaño del bloque de WAL: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytes por segmento WAL: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Longitud máxima de identificadores: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Máximo número de columnas en un índice: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Longitud máxima de un trozo TOAST: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Longitud máxima de un trozo de objeto grande: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Tipo de almacenamiento hora/fecha: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "enteros de 64 bits"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Paso de parámetros float8: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "por referencia"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "por valor"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Versión de suma de verificación de datos: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Valores a cambiar:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Primer segmento de log después de reiniciar: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "Base de datos del OldestMulti: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "Base de datos del OldestXID: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "Epoch del NextXID: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "no se pudo leer el directorio «%s»: %m"
+
+#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_resetwal.c:990 pg_resetwal.c:1028
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "no se pudo borrar el archivo «%s»: %m"
+
+#: pg_resetwal.c:1100
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: pg_resetwal.c:1108 pg_resetwal.c:1120
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "no se pudo escribir el archivo «%s»: %m"
+
+#: pg_resetwal.c:1125
+#, c-format
+msgid "fsync error: %m"
+msgstr "error de fsync: %m"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s restablece el WAL («write-ahead log») de PostgreSQL.\n"
+"\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Uso:\n"
+" %s [OPCIÓN]... DATADIR\n"
+"\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid "Options:\n"
+msgstr "Opciones:\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" definir la más antigua y la más nueva transacciones\n"
+" que llevan timestamp de commit (cero significa no\n"
+" cambiar)\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR directorio de datos\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH asigna el siguiente «epoch» de ID de transacción\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force fuerza que la actualización sea hecha\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr ""
+" -l, --next-wal-file=ARCHIVOWAL\n"
+" fuerza una ubicación inicial mínima para nuevo WAL\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr ""
+" -m, --multixact-ids=MXID,MXID\n"
+" asigna el siguiente ID de multitransacción y\n"
+" el más antiguo\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run no actualiza, sólo muestra lo que se haría\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID asigna el siguiente OID\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr ""
+" -O, --multixact-offset=OFFSET\n"
+" asigna la siguiente posición de multitransacción\n"
+
+#: pg_resetwal.c:1148
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr ""
+" -u, --oldest-transaction-id=XID\n"
+" asigna el ID de transacción más antiguo\n"
+
+#: pg_resetwal.c:1149
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: pg_resetwal.c:1150
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr ""
+" -x, --next-transaction-id=XID\n"
+" asigna el siguiente ID de transacción\n"
+
+#: pg_resetwal.c:1151
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=TAMAÑO tamaño de segmentos de WAL, en megabytes\n"
+
+#: pg_resetwal.c:1152
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: pg_resetwal.c:1153
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: pg_resetwal.c:1154
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
diff --git a/src/bin/pg_resetwal/po/fr.po b/src/bin/pg_resetwal/po/fr.po
new file mode 100644
index 0000000..39296bd
--- /dev/null
+++ b/src/bin/pg_resetwal/po/fr.po
@@ -0,0 +1,839 @@
+# LANGUAGE message translation file for pg_resetwal
+# Copyright (C) 2003-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_resetwal (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2003-2009.
+# Stéphane Schildknecht <stephane.schildknecht@dalibo.com>, 2009.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2010-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-12 05:16+0000\n"
+"PO-Revision-Date: 2022-04-12 17:29+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:280
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:291
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:298
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "n'a pas pu charger la bibliothèque « %s » : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "ne peut pas créer les jetons restreints sur cette plateforme : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "n'a pas pu ouvrir le jeton du processus : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "n'a pas pu allouer les SID : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "n'a pas pu créer le jeton restreint : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argument invalide pour l'option %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "la valeur epoch de l'identifiant de transaction (-e) ne doit pas être -1"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "l'identifiant de transaction le plus ancien (-u) doit être supérieur ou égal à %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "l'identifiant de transaction (-x) doit être supérieur ou égal à %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "l'identifiant de transaction (-c) doit être 0 ou supérieur ou égal à 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "l'OID (-o) ne doit pas être 0"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "l'identifiant de multi-transaction (-m) ne doit pas être 0"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "l'identifiant de multi-transaction le plus ancien (-m) ne doit pas être 0"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "le décalage de multi-transaction (-O) ne doit pas être -1"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "l'argument de --wal-segsize doit être un nombre"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "l'argument de --wal-segsize doit être une puissance de 2 comprise entre 1 et 1024"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "aucun répertoire de données indiqué"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "ne peut pas être exécuté par « root »"
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Vous devez exécuter %s en tant que super-utilisateur PostgreSQL."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "n'a pas pu lire les droits du répertoire « %s » : %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "n'a pas pu modifier le répertoire par « %s » : %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "le fichier verrou « %s » existe"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "Le serveur est-il démarré ? Sinon, supprimer le fichier verrou et réessayer."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Si ces valeurs semblent acceptables, utiliser -f pour forcer la\n"
+"réinitialisation.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"Le serveur de bases de données n'a pas été arrêté proprement.\n"
+"Ré-initialiser le journal des transactions peut occasionner des pertes de\n"
+"données.\n"
+"Pour continuer malgré tout, utiliser -f pour forcer la\n"
+"réinitialisation.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Réinitialisation des journaux de transactions\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "fichier vide inattendu « %s »"
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "n'a pas pu lire le fichier « %s » : %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "le répertoire des données a une mauvaise version"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "Le fichier « %s » contient « %s », qui n'est pas compatible avec la version « %s » de ce programme."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Si vous êtes certain que le chemin du répertoire de données est correct, exécuter\n"
+" touch %s\n"
+"et réessayer."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control existe mais son CRC est invalide ; agir avec précaution"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control spécifie une taille invalide de segment WAL (%d octet) ; agir avec précaution"
+msgstr[1] "pg_control spécifie une taille invalide de segment WAL (%d octets) ; agir avec précaution"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control existe mais est corrompu ou de mauvaise version ; ignoré"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Valeurs de pg_control devinées :\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Valeurs actuelles de pg_control :\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Numéro de version de pg_control : %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Numéro de version du catalogue : %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identifiant du système de base de données : %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "Dernier TimeLineID du point de contrôle : %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Dernier full_page_writes du point de contrôle : %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "désactivé"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "activé"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "Dernier NextXID du point de contrôle : %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "Dernier NextOID du point de contrôle : %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "Dernier NextMultiXactId du point de contrôle : %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "Dernier NextMultiOffset du point de contrôle : %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "Dernier oldestXID du point de contrôle : %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "Dernier oldestXID du point de contrôle de la base : %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "Dernier oldestActiveXID du point de contrôle : %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "Dernier oldestMultiXid du point de contrôle : %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "Dernier oldestMulti du point de contrôle de la base : %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "Dernier oldestCommitTsXid du point de contrôle : %u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "Dernier newestCommitTsXid du point de contrôle : %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Alignement maximal des données : %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Taille du bloc de la base de données : %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Blocs par segment des relations volumineuses : %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Taille de bloc du journal de transaction : %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Octets par segment du journal de transaction : %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Longueur maximale des identifiants : %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Nombre maximum de colonnes d'un index: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Longueur maximale d'un morceau TOAST : %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Taille d'un morceau de Large Object : %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Stockage du type date/heure : %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "entiers 64-bits"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Passage d'argument float8 : %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "par référence"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "par valeur"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Version des sommes de contrôle des pages de données : %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Valeurs à changer :\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Premier segment du journal après réinitialisation : %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMulti's DB: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXID's DB: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID Epoch: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "n'a pas pu ouvrir le répertoire « %s » : %m"
+
+#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "n'a pas pu lire le répertoire « %s » : %m"
+
+#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "n'a pas pu fermer le répertoire « %s » : %m"
+
+#: pg_resetwal.c:990 pg_resetwal.c:1028
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "n'a pas pu supprimer le fichier « %s » : %m"
+
+#: pg_resetwal.c:1100
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: pg_resetwal.c:1108 pg_resetwal.c:1120
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "impossible d'écrire le fichier « %s » : %m"
+
+#: pg_resetwal.c:1125
+#, c-format
+msgid "fsync error: %m"
+msgstr "erreur fsync : %m"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s réinitialise le journal des transactions PostgreSQL.\n"
+"\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Usage :\n"
+" %s [OPTION]... RÉP_DONNÉES\n"
+"\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid "Options:\n"
+msgstr "Options :\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" configure les transactions la plus ancienne\n"
+" et la plus récente contenant les dates/heures\n"
+" de validation (zéro signifie aucun changement)\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]RÉP_DONNEES répertoire de la base de données\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr ""
+" -e, --epoch=XIDEPOCH configure la valeur epoch du prochain\n"
+" identifiant de transaction\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force force la mise à jour\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr ""
+" -l, --next-wal-file=FICHIERWAL configure l'emplacement minimal de début\n"
+" des WAL du nouveau journal de transactions\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr ""
+" -m, --multixact-ids=MXID,MXID configure le prochain et le plus ancien\n"
+" identifiants multi-transactions\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr ""
+" -n, --dry-run pas de mise à jour, affiche\n"
+" simplement ce qui sera fait\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID configure le prochain OID\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr ""
+" -O, --multixact-offset=DÉCALAGE configure le prochain décalage\n"
+" multitransaction\n"
+
+#: pg_resetwal.c:1148
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr ""
+" -u, --oldest-transaction-id=XID configure l'identifiant de transaction le\n"
+" plus ancien\n"
+
+#: pg_resetwal.c:1149
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_resetwal.c:1150
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr ""
+" -x, --next-transaction-id=XID configure le prochain identifiant de\n"
+" transaction\n"
+
+#: pg_resetwal.c:1151
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=TAILLE configure la taille des segments WAL, en Mo\n"
+
+#: pg_resetwal.c:1152
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_resetwal.c:1153
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: pg_resetwal.c:1154
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid " (zero in either value means no change)\n"
+#~ msgstr " (zéro dans l'une des deux valeurs signifie aucun changement)\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide et quitte\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version afficherla version et quitte\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help affiche cette aide, puis quitte\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help affiche cette aide et quitte\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version affiche la version, puis quitte\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version affiche la version et quitte\n"
+
+#~ msgid " -c XID,XID set oldest and newest transactions bearing commit timestamp\n"
+#~ msgstr " -c XID,XID configure la plus ancienne et la plus récente transaction\n"
+
+#~ msgid " -x XID set next transaction ID\n"
+#~ msgstr " -x XID fixe le prochain identifiant de transaction\n"
+
+#~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+#~ msgstr "%s : ATTENTION : ne peut pas créer les jetons restreints sur cette plateforme\n"
+
+#~ msgid "%s: argument of --wal-segsize must be a number\n"
+#~ msgstr "%s : l'argument de --wal-segsize doit être un nombre\n"
+
+#~ msgid "%s: argument of --wal-segsize must be a power of 2 between 1 and 1024\n"
+#~ msgstr "%s : l'argument de --wal-segsize doit être une puissance de 2 entre 1 et 1024\n"
+
+#~ msgid "%s: cannot be executed by \"root\"\n"
+#~ msgstr "%s : ne peut pas être exécuté par « root »\n"
+
+#~ msgid "%s: could not allocate SIDs: error code %lu\n"
+#~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n"
+
+#~ msgid "%s: could not change directory to \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu fermer le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not create pg_control file: %s\n"
+#~ msgstr "%s : n'a pas pu créer le fichier pg_control : %s\n"
+
+#~ msgid "%s: could not create restricted token: error code %lu\n"
+#~ msgstr "%s : n'a pas pu créer le jeton restreint : code d'erreur %lu\n"
+
+#~ msgid "%s: could not delete file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu supprimer le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not get exit code from subprocess: error code %lu\n"
+#~ msgstr "%s : n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en lecture : %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not open process token: error code %lu\n"
+#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n"
+
+#~ msgid "%s: could not re-execute with restricted token: error code %lu\n"
+#~ msgstr "%s : n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not read file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu lire le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not read from directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not read permissions of directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu lire les droits sur le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not start process for command \"%s\": error code %lu\n"
+#~ msgstr "%s : n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu\n"
+
+#~ msgid "%s: could not write file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu écrire le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not write pg_control file: %s\n"
+#~ msgstr "%s : n'a pas pu écrire le fichier pg_control : %s\n"
+
+#~ msgid "%s: internal error -- sizeof(ControlFileData) is too large ... fix PG_CONTROL_SIZE\n"
+#~ msgstr ""
+#~ "%s : erreur interne -- sizeof(ControlFileData) est trop important...\n"
+#~ "corrigez PG_CONTROL_SIZE\n"
+
+#~ msgid "%s: invalid argument for option -O\n"
+#~ msgstr "%s : argument invalide pour l'option -O\n"
+
+#~ msgid "%s: invalid argument for option -l\n"
+#~ msgstr "%s : argument invalide pour l'option -l\n"
+
+#~ msgid "%s: invalid argument for option -m\n"
+#~ msgstr "%s : argument invalide pour l'option -m\n"
+
+#~ msgid "%s: invalid argument for option -o\n"
+#~ msgstr "%s : argument invalide pour l'option -o\n"
+
+#~ msgid "%s: invalid argument for option -x\n"
+#~ msgstr "%s : argument invalide pour l'option -x\n"
+
+#~ msgid "%s: no data directory specified\n"
+#~ msgstr "%s : aucun répertoire de données indiqué\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#~ msgid "First log file ID after reset: %u\n"
+#~ msgstr "Premier identifiant du journal après réinitialisation : %u\n"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Passage d'argument float4 : %s\n"
+
+#~ msgid "Transaction log reset\n"
+#~ msgstr "Réinitialisation du journal des transactions\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayer « %s --help » pour plus d'informations.\n"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#~ msgid "floating-point numbers"
+#~ msgstr "nombres à virgule flottante"
+
+#~ msgid "transaction ID (-x) must not be 0"
+#~ msgstr "l'identifiant de la transaction (-x) ne doit pas être 0"
diff --git a/src/bin/pg_resetwal/po/it.po b/src/bin/pg_resetwal/po/it.po
new file mode 100644
index 0000000..55ed8f8
--- /dev/null
+++ b/src/bin/pg_resetwal/po/it.po
@@ -0,0 +1,666 @@
+# Italian message translation file for pg_resetwal
+# Domenico Sgarbossa <sgarbossa.domenico@gmail.com>, 2022 - 2022.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:18+0000\n"
+"PO-Revision-Date: 2022-10-02 19:06+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "impossibile caricare la libreria \"%s\": codice di errore %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "impossibile creare token con restrizioni su questa piattaforma: codice di errore %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "impossibile aprire il token di processo: codice di errore %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "impossibile allocare i SID: codice di errore %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "impossibile creare token limitato: codice di errore %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "impossibile avviare il processo per il comando \"%s\": codice di errore %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "impossibile rieseguire con token limitato: codice di errore %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "impossibile ottenere il codice di uscita dal processo secondario: codice di errore %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argomento non valido per l'opzione %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per ulteriori informazioni."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "l'ID transazione epoch (-e) non deve essere -1"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "l'ID transazione più vecchio (-u) deve essere maggiore o uguale a %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "l'ID transazione (-x) deve essere maggiore o uguale a %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "l'ID transazione (-c) deve essere 0 o maggiore o uguale a 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) non deve essere 0"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "l'ID multitransazione (-m) non deve essere 0"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "l'ID multitransazione più vecchio (-m) non deve essere 0"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "l'offset multitransazione (-O) non deve essere -1"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "l'argomento di --wal-segsize deve essere un numero"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "argomento di --wal-segsize deve essere una potenza di 2 tra 1 e 1024"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "nessuna directory di dati specificata"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "non può essere eseguito da \"root\""
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Devi eseguire %s come superutente di PostgreSQL."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "impossibile leggere i permessi della directory \"%s\": %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "impossibile cambiare la directory in \"%s\": %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "impossibile aprire il file \"%s\" per la lettura: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "il file di blocco \"%s\" esiste già"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "Un server è in esecuzione? In caso contrario, eliminare il file di blocco e riprovare."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Se questi valori sembrano accettabili, utilizzare -f per forzare il ripristino.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"Il server del database non è stato arrestato correttamente.\n"
+"La reimpostazione del registro write-ahead potrebbe causare la perdita di dati.\n"
+"Se vuoi procedere comunque, usa -f per forzare il reset.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Ripristino del registro write-ahead\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "file vuoto imprevisto \"%s\""
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "impossibile leggere il file \"%s\": %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "la directory dei dati è di versione errata"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "Il file \"%s\" contiene \"%s\", che non è compatibile con la versione \"%s\" di questo programma."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Se sei sicuro che il percorso della directory dei dati sia corretto, esegui\n"
+" tocca %s\n"
+"e riprova."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control esiste ma ha un CRC non valido; procedi con cautela"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control specifica la dimensione del segmento WAL non valida (%d byte); procedi con cautela"
+msgstr[1] "pg_control specifica la dimensione dei segmenti WAL non valida (%d byte); procedi con cautela"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control esiste ma è una versione non funzionante o errata; ignorandolo"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Valori pg_control ipotizzati:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Valori correnti di pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control numero di versione: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Numero di versione del catalogo: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identificatore di sistema del database: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Full_page_writes dell'ultimo checkpoint: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "spento"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "acceso"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID dell'ultimo checkpoint: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "XID più vecchio dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB dell'XID più vecchio dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "L'ActiveXID più vecchio dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "Il più vecchio MultiXid dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "Il più vecchio DB dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "Il più vecchio CommitTsXid dell'ultimo checkpoint:%u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "Il più recenteCommitTsXid dell'ultimo checkpoint:%u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Allineamento massimo dei dati: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Dimensione blocco database: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Blocchi per segmento di relazione grande: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Dimensione blocco WAL: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Byte per segmento WAL: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Lunghezza massima degli identificatori: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Numero massimo di colonne in un indice: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Dimensione massima di un blocco TOAST: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Dimensione di un blocco di oggetti di grandi dimensioni: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Tipo di archiviazione data/ora: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "Interi a 64 bit"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Passaggio argomento float8: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "come riferimento"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "per valore"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr ""
+"Versione checksum pagina dati: %u\n"
+" \n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Valori da modificare:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Primo segmento di registro dopo il ripristino: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "DB di OldestMulti: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "XID più vecchio: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "DB di OldestXID: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "Epoca NextXID: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "impossibile aprire la directory \"%s\": %m"
+
+#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "impossibile leggere la directory \"%s\": %m"
+
+#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "impossibile chiudere la directory \"%s\": %m"
+
+#: pg_resetwal.c:990 pg_resetwal.c:1028
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "impossibile eliminare il file \"%s\": %m"
+
+#: pg_resetwal.c:1100
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "impossibile aprire il file \"%s\": %m"
+
+#: pg_resetwal.c:1108 pg_resetwal.c:1120
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "impossibile scrivere il file \"%s\": %m"
+
+#: pg_resetwal.c:1125
+#, c-format
+msgid "fsync error: %m"
+msgstr "errore fsync: %m"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s reimposta il registro write-ahead di PostgreSQL.\n"
+"\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Utilizzo:\n"
+" %s [OPZIONE]... DATADIR\n"
+"\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid "Options:\n"
+msgstr "Opzioni\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" impostare il rilevamento delle transazioni più vecchie e più recenti\n"
+" timestamp di commit (zero significa nessuna modifica)\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR directory dei dati\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH imposta l'epoca dell'ID transazione successiva\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force forza l'aggiornamento da eseguire\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFILE imposta la posizione iniziale minima per il nuovo WAL\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID imposta l'ID multitransazione successivo e meno recente\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run nessun aggiornamento, mostra solo cosa sarebbe stato fatto\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID imposta l'OID successivo\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET imposta l'offset multitransazione successivo\n"
+
+#: pg_resetwal.c:1148
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID imposta l'ID transazione più vecchio\n"
+
+#: pg_resetwal.c:1149
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version restituisce le informazioni sulla versione, quindi esci\n"
+
+#: pg_resetwal.c:1150
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID imposta l'ID transazione successiva\n"
+
+#: pg_resetwal.c:1151
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE dimensione dei segmenti WAL, in megabyte \n"
+
+#: pg_resetwal.c:1152
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto, quindi esci\n"
+
+#: pg_resetwal.c:1153
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: pg_resetwal.c:1154
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
diff --git a/src/bin/pg_resetwal/po/ja.po b/src/bin/pg_resetwal/po/ja.po
new file mode 100644
index 0000000..58a8ef5
--- /dev/null
+++ b/src/bin/pg_resetwal/po/ja.po
@@ -0,0 +1,775 @@
+# pg_resetwal.po
+# Japanese message translation file for pg_resetwal
+#
+# Copyright (C) 2005-2022 PostgreSQL Global Development Group
+#
+# Shigehiro Honda <fwif0083@mb.infoweb.ne.jp>, 2005.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetwal (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-09 12:01+0900\n"
+"PO-Revision-Date: 2022-05-10 14:36+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "ライブラリ\"%s\"をロードできませんでした: エラーコード %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "このプラットフォームでは制限付きトークンを生成できません: エラーコード %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "プロセストークンをオープンできませんでした: エラーコード %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "SIDを割り当てられませんでした: エラーコード %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "制限付きトークンを作成できませんでした: エラーコード %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "\"%s\"コマンドのプロセスを起動できませんでした: エラーコード %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "制限付きトークンで再実行できませんでした: %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "サブプロセスの終了コードを入手できませんでした。: エラーコード %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "オプション%sの引数が不正です"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細は\"%s --help\"を実行してください。"
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "トランザクションIDの基点(-e)は-1にはできません"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "最古のトランザクションID(-u)は%uもしくはそれ以上でなければなりません"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "トランザクションID(-x)は%uもしくはそれ以上でなければなりません"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "トランザクションID(-c)は0もしくは2以上でなければなりません"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID(-o)は0にはできません"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "マルチトランザクションID(-m)は0にはできません"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "最古のマルチトランザクションID(-m)は0にはできません"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "マルチトランザクションオフセット(-O)は-1にはできません"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segsizの引数は数値でなければなりません"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "--wal-segsizeの引数は1から1024の間の2のべき乗でなければなりません"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "データディレクトリが指定されていません"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "\"root\"では実行できません"
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "PostgreSQLのスーパーユーザーで%sを実行しなければなりません"
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"の権限を読み取れませんでした: %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "ディレクトリ\"%s\"に移動できませんでした: %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "ファイル\"%s\"を読み取り用にオープンできませんでした: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "ロックファイル\"%s\"が存在します"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "サーバーが稼動していませんか? そうでなければロックファイルを削除し再実行してください。"
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"この値が適切だと思われるのであれば、-fを使用して強制リセットしてください。\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"データベースサーバーが正しくシャットダウンされていませんでした。\n"
+"先行書き込みログのリセットにはデータ損失の恐れがあります。\n"
+"とにかく処理したいのであれば、-fでリセットを強制してください。\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "先行書き込みログがリセットされました\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "想定外の空のファイル\"%s\""
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ファイル\"%s\"の読み取りに失敗しました: %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "データディレクトリのバージョンが違います"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "ファイル\"%s\"では\"%s\"となっています、これはこのプログラムのバージョン\"%s\"と互換性がありません"
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"確実にデータディレクトリのパスが正しければ、\n"
+" touch %s\n"
+"の後に再実行してください。"
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_controlがありましたが、CRCが不正でした; 注意して進めてください"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_controlにあるWALセグメントサイズ(%dバイト)は不正です; 注意して進めてください"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_controlがありましたが、破損あるいは間違ったバージョンです; 無視します"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"pg_controlの推測値:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"現在のpg_controlの値:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_controlバージョン番号: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "カタログバージョン番号: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "データベースシステム識別子: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "最終チェックポイントの時系列ID: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "最終チェックポイントのfull_page_writes: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "オフ"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "オン"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "最終チェックポイントのNextXID: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "最終チェックポイントのNextOID: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "最終チェックポイントのNextMultiXactId: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "最終チェックポイントのNextMultiOffset: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "最終チェックポイントのoldestXID: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "最終チェックポイントのoldestXIDのDB: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "最終チェックポイントのoldestActiveXID: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "最終チェックポイントのoldestMultiXid: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "最終チェックポイントのoldestMultiのDB: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "最終チェックポイントのoldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "最終チェックポイントのnewestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "最大データアラインメント: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "データベースのブロックサイズ: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "大きなリレーションのセグメント毎のブロック数:%u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WALのブロックサイズ: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "WALセグメント当たりのバイト数: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "識別子の最大長: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "インデックス内の最大列数: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOASTチャンクの最大サイズ: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "ラージオブジェクトチャンクのサイズ: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "日付/時刻型の格納方式: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "64ビット整数"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8引数の渡し方: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "参照渡し"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "値渡し"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "データベージチェックサムのバージョン: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"変更される値:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "リセット後最初のログセグメント: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMultiのDB: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXIDのDB: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID基点: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m"
+
+#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m"
+
+#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をクローズできませんでした: %m"
+
+#: pg_resetwal.c:990 pg_resetwal.c:1028
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "ファイル\"%s\"を削除できませんでした: %m"
+
+#: pg_resetwal.c:1100
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンできませんでした: %m"
+
+#: pg_resetwal.c:1108 pg_resetwal.c:1120
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ファイル\"%s\"を書き出せませんでした: %m"
+
+#: pg_resetwal.c:1125
+#, c-format
+msgid "fsync error: %m"
+msgstr "fsyncエラー: %m"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%sはPostgreSQLの先行書き込みログをリセットします。\n"
+"\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"使用方法:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid "Options:\n"
+msgstr "オプション:\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" コミットタイムスタンプを持つ最古と最新の\n"
+" トランザクション(0は変更しないことを意味する)\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR データディレクトリ\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH 次のトランザクションIDの基点を設定\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force 強制的に更新を実施\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFILE 新しいWALの最小開始ポイントを設定\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID 次および最古のマルチトランザクションIDを設定\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run 更新をせず、単に何が行なわれるかを表示\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID 次のOIDを設定\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET 次のマルチトランザクションオフセットを設定\n"
+
+#: pg_resetwal.c:1148
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID 最古のトランザクションIDを設定\n"
+
+#: pg_resetwal.c:1149
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: pg_resetwal.c:1150
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID 次のトランザクションIDを設定\n"
+
+#: pg_resetwal.c:1151
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE WALセグメントのサイズ、単位はメガバイト\n"
+
+#: pg_resetwal.c:1152
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: pg_resetwal.c:1153
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"バグは<%s>に報告してください。\n"
+
+#: pg_resetwal.c:1154
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#~ msgid "fatal: "
+#~ msgstr "致命的エラー: "
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "詳細は\"%s --help\"を実行してください。\n"
+
+#~ msgid "transaction ID (-x) must not be 0"
+#~ msgstr "トランザクションID(-x)は0にはできません"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help このヘルプを表示して終了\n"
+
+#~ msgid "%s: cannot be executed by \"root\"\n"
+#~ msgstr "%s: \"root\"では実行できません\n"
+
+#~ msgid "%s: could not change directory to \"%s\": %s\n"
+#~ msgstr "%s: ディレクトリ\"%s\"に移動できませんでした: %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: 読み取り用のファイル\"%s\"をオープンできませんでした: %s\n"
+
+#~ msgid "Transaction log reset\n"
+#~ msgstr "トランザクションログをリセットします。\n"
+
+#~ msgid "%s: could not read file \"%s\": %s\n"
+#~ msgstr "%s: ファイル\"%s\"を読み込めませんでした: %s\n"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "浮動小数点数"
+
+#~ msgid "%s: internal error -- sizeof(ControlFileData) is too large ... fix PG_CONTROL_SIZE\n"
+#~ msgstr "%s: 内部エラー -- sizeof(ControlFileData)が大きすぎます ... PG_CONTROL_SIZEを修正してください\n"
+
+#~ msgid "%s: could not create pg_control file: %s\n"
+#~ msgstr "%s: pg_controlファイルを作成できませんでした: %s\n"
+
+#~ msgid "%s: could not write pg_control file: %s\n"
+#~ msgstr "%s: pg_controlファイルを書き込めませんでした: %s\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s: ディレクトリ\"%s\"をオープンできませんでした: %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s: ディレクトリ\"%s\"を読み取ることができませんでした。: %s\n"
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s: ディレクトリ \"%s\" をクローズできませんでした: %s\n"
+
+#~ msgid "%s: could not delete file \"%s\": %s\n"
+#~ msgstr "%s: ファイル\"%s\"を削除できませんでした: %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s: ファイル\"%s\"をオープンできませんでした: %s\n"
+
+#~ msgid "%s: could not write file \"%s\": %s\n"
+#~ msgstr "%s: ファイル\"%s\"を書き込めませんでした: %s\n"
+
+#~ msgid " -c XID,XID set oldest and newest transactions bearing commit timestamp\n"
+#~ msgstr " -c XID,XID コミットタイムスタンプを作成する最も古いトランザクションと最も新しいトランザクションを設定します\n"
+
+#~ msgid " (zero in either value means no change)\n"
+#~ msgstr " (いずれかの値での0は変更がないことを意味します)\n"
+
+#~ msgid " [-D] DATADIR data directory\n"
+#~ msgstr " [-D] DATADIR データベースディレクトリ\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version バージョン情報を出力、終了します\n"
+
+#~ msgid " -x XID set next transaction ID\n"
+#~ msgstr " -x XID 次のトランザクションIDを設定します\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help このヘルプを表示し、終了します\n"
+
+#~ msgid "First log file ID after reset: %u\n"
+#~ msgstr "リセット後、現在のログファイルID: %u\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help ヘルプを表示し、終了します\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version バージョン情報を表示し、終了します\n"
+
+#~ msgid "%s: could not read from directory \"%s\": %s\n"
+#~ msgstr "%s: ディレクトリ\"%s\"から読み込めませんでした: %s\n"
+
+#~ msgid "%s: invalid argument for option -l\n"
+#~ msgstr "%s: オプション-lの引数が無効です\n"
+
+#~ msgid "%s: invalid argument for option -O\n"
+#~ msgstr "%s: オプション-Oの引数が無効です\n"
+
+#~ msgid "%s: invalid argument for option -m\n"
+#~ msgstr "%s: オプション-mの引数が無効です\n"
+
+#~ msgid "%s: invalid argument for option -o\n"
+#~ msgstr "%s: オプション-oの引数が無効です\n"
+
+#~ msgid "%s: invalid argument for option -x\n"
+#~ msgstr "%s: オプション-xの引数が無効です\n"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Float4引数の渡し方: %s\n"
diff --git a/src/bin/pg_resetwal/po/ka.po b/src/bin/pg_resetwal/po/ka.po
new file mode 100644
index 0000000..ae1c302
--- /dev/null
+++ b/src/bin/pg_resetwal/po/ka.po
@@ -0,0 +1,697 @@
+# Georgian message translation file for pg_resetwal
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_resetwal (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetwal (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:49+0000\n"
+"PO-Revision-Date: 2022-07-04 18:29+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდომა: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გაფრთხილება: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტალები: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნება: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "ბიბლიოთეკის (\"%s\") ჩატვირთვის შეცდომა: შეცდომის კოდი: %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "ამ პლატფორმაზე შეზღუდული კოდების შექმნა შეუძლებელია: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "პროცესის კოდის გახსნა შეუძლებელია: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "შეცდომა SSID-ების გამოყოფისას: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "შეზღუდული კოდის შექმნა ვერ მოხერხდა: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "„%s“ ბრძანების პროცესის დაწყება ვერ მოხერხდა: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "შეზღუდულ კოდის ხელახლა შესრულება ვერ მოხერხდა: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "ქვეპროცესიდან გასასვლელი კოდი ვერ მივიღე: შეცდომის კოდი %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "არასწორი არგუმენტი პარამეტრისთვის: %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "ტრანზაქციის ID-ის ეპოქა (-e) -1 არ უნდა იყოს"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "ძველი ტრანზაქციის ID (-u) %u-ზე მეტი ან ტოლი უნდა იყოს"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "ტრანზაქციის ID (-x) %u_ზე მეტი ან ტოლი უნდა იყოს"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "ტრანზაქციის ID (-c) ან 0 უნდა იყოს, ან 2-ზე მეტი ან ტოლი"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) 0 არ უნდა იყოს"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "მულტიტრანზაქციის ID (-m) 0 არ უნდა იყო"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "უძველესი მულტრანზაქციის ID (-m) 0 არ უნდა იყოს"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "მულიტრანზაქციის წანაცვლება (-O) -1 არ უნდა იყოს"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segisze -ის არგუმენტი რიცხვი უნდა იყოს"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "--wal-segsize -ის არგუმენტი 2-ის ხარისხი უნდა იყოს 1-1024 დიაპაზონიდან"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "მონაცემების საქაღალდე მითითებული არაა"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "root-ით ვერ გაეშვება"
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "%s PostgreSQL-ის ზემომხმარებლით უნდა გაუშვათ."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "საქაღალდის წვდომების წაკითხვა შეუძლებელია \"%s\": %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "საქაღალდის %s-ზე შეცვლის შეცდომა: %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "ფაილის (%s) გახსნის შეცდომა: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "ბლოკის ფაილი არსებობს: %s"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "სერვერი გაშვებულია? თუ არა, წაშალეთ ბლოკის ფაილი და თავიდან სცადეთ."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"თუ ეს მნიშვნელობები მისაღებია, ძალით დასაბრუნებლად -f გამოიყენეთ.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"მონაცემთა ბაზის სერვერი სუფთად არ გამორთულა.\n"
+"წინასწარ-ჩაწერადი ჟურნალის საწყის მნიშვნელობაზე დაბრუნებამ შეიძლება "
+"მონაცემების დაკარგვა გამოიწვიოს.\n"
+"თუ გაგრძელება მაინც გნებავთ, გამოიყენეთ -f.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "წინასწარ-ჩაწერი ჟურნალის საწყის მნიშვნელობაზე დაბრუნება\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "მოულოდნელად ფაილი ცარიელია: \"%s\""
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ფაილის (%s) წაკითხვის შეცდომა: %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "მონაცემების საქაღალდე არასწორ ვერსიას ეკუთვნის"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid ""
+"File \"%s\" contains \"%s\", which is not compatible with this program's "
+"version \"%s\"."
+msgstr ""
+"ფაილი \"%s\" შეიცავს \"%s\"-ს, რომელიც ამ პროგრამის ვერსიასთან (%s) "
+"შეუთავსებელია."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"თუ დარწმუნებული ბრძანდებით, რომ მონაცემების საქაღალდის ბილიკი სწორია, "
+"გაუშვით\n"
+" touch %s\n"
+"და თავიდან სცადეთ."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control არსებობს, მაგრამ გააჩნია არასწორი CRC; ფრთხილად"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid ""
+"pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural ""
+"pg_control specifies invalid WAL segment size (%d bytes); proceed with "
+"caution"
+msgstr[0] ""
+"pg_control WAL-ის არასწორი სეგმენტის ზომას (%d ბაიტი) მიუთითებს; ფრთხილად"
+msgstr[1] ""
+"pg_control WAL-ის არასწორი სეგმენტის ზომას (%d ბაიტი) მიუთითებს; ფრთხილად"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr ""
+"pg_control არსებობს, მაგრამ ან გაფუჭებულია, ან ძველი ვერსია; იგნორირებულია"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Pg_control გამოცნობილი მნიშვნელობები:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Pg_control მიმდინარე მნიშვნელობები:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control ვერსიის ნომერი: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "კატალოგის ვერსიის ნომერი: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "ბაზის სისტემური იდენტიფიკატორი: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "უახლესი საკონტროლო წერტილისTimeLineID: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "უახლესი უკანასკნელი საკონტროლო წერტილის full_page_writes: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "გამორთული"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "ჩართ"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "უახლესი საკონტროლო წერტილის NextXID: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის NextOID: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის oldestXID: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის oldestXID's DB: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის oldestActiveXID: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის oldestMultiXid: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "უახლესი საკონტროლო წერტილის oldestMulti's DB: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "უახლესი საკონტროლო წერტილის oldestCommitTsXid:%u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "უახლესი საკონტროლო წერტილის newestCommitTsXid:%u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "მონაცემების სწორების მაქსიმუმი: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "ბაზის ბლოკის ზომა: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "დიდი ურთიერთობის სეგმენტები თითოეულ ბლოკში: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL ბლოკის ზომა: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "ბაიტები თითოეულ WAL სეგმენტში: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "იდენტიფიკატორების მაქსიმალური სიგრძე: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "ინდექსში სვეტების მაქსიმალური რაოდენობა: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST ნაგლეჯის მაქსიმალური ზომა: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "დიდი ობიექტის ნაგლეჯის ზომა: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "თარიღის ტიპის საცავი: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "64-ბიტიანი მთელ რიცხვები"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8 არგუმენტის გადაცემა: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "ბმით"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "მნიშვნელობით"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "მონაცემების გვერდის საკონტროლო ჯამის ვერსია: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"შესაცვლელი მნიშვნელობები:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr ""
+"საწყის მნიშვნელობაზე დაბრუნების შემდეგ ჟურნალის პირველი სეგმენტი: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMulti's DB: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXID's DB: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID epoch: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "საქაღალდის (%s) გახსნის შეცდომა: %m"
+
+#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "საქაღალდის (%s) წაკითხვის შეცდომა: %m"
+
+#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "საქაღალდის %s-ზე დახურვის შეცდომა: %m"
+
+#: pg_resetwal.c:990 pg_resetwal.c:1028
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "ფაილის (\"%s\") წაშლის შეცდომა: %m"
+
+#: pg_resetwal.c:1100
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფაილის (%s) გახსნის შეცდომა: %m"
+
+#: pg_resetwal.c:1108 pg_resetwal.c:1120
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ფაილში (%s) ჩაწერის შეცდომა: %m"
+
+#: pg_resetwal.c:1125
+#, c-format
+msgid "fsync error: %m"
+msgstr "fsync error: %m"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL-ის წინასწარ-ჩაწერად ჟურნალს საწყის მნიშვნელობაზე აბრუნებს.\n"
+"\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"გამოყენება: \n"
+" %s [პარამეტრი]... [მონაცემებისსაქაღალდე]\n"
+"\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid "Options:\n"
+msgstr "პარამეტრები:\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions "
+"bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" უახლესი და უძველესი ტრანზაქციების "
+"მითითება,\n"
+" დროის შტამპის მატარებლით(0 ნიშნავს, რომ "
+"არ შეიცვლება)\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR მონაცემების საქაღალდე\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr ""
+" -e, --epoch=XIDEPOCH შემდეგი ტრანზაქციის ID-ის ეპოქსი "
+"დაყენება\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force ნაძალადევი განახლება\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid ""
+" -l, --next-wal-file=WALFILE set minimum starting location for new "
+"WAL\n"
+msgstr ""
+" -l, --next-wal-file=WALFILE ახალი WAL-ის მინიმალური საწყისი "
+"მდებარეობის დაყენება\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid ""
+" -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr ""
+" -m, --multixact-ids=MXID,MXID შემდეგი და უძველესი მულტრანზაქციის ID-"
+"ების დაყენება\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid ""
+" -n, --dry-run no update, just show what would be done\n"
+msgstr ""
+" -n, --dry-run განახლების გარეშე. უბრალოდ ნაჩვენები "
+"იქნება, რა მოხდებოდა\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID შემდეგი OID-ის დაყენება\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr ""
+" -O, --multixact-offset=წანაცვლება შემდეგი მულტიტრანზაქციის წანაცვლების "
+"დაყენება\n"
+
+#: pg_resetwal.c:1148
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr ""
+" -u, --oldest-transaction-id=XID უძველესი ტრანზაქციის ID-ის დაყენება\n"
+
+#: pg_resetwal.c:1149
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: pg_resetwal.c:1150
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr ""
+" -x, --next-transaction-id=XID შემდეგი ტრანზაქციის ID-ის დაყენება\n"
+
+#: pg_resetwal.c:1151
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=ზომა WAL სეგმენტების ზომა, მეგაბაიტებში\n"
+
+#: pg_resetwal.c:1152
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: pg_resetwal.c:1153
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდომების შესახებ მიწერეთ: %s\n"
+
+#: pg_resetwal.c:1154
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
diff --git a/src/bin/pg_resetwal/po/ko.po b/src/bin/pg_resetwal/po/ko.po
new file mode 100644
index 0000000..2cf02f2
--- /dev/null
+++ b/src/bin/pg_resetwal/po/ko.po
@@ -0,0 +1,680 @@
+# Korean message translation file for PostgreSQL pg_resetxlog
+# Ioseph Kim <ioseph@uri.sarang.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetwal (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:48+0000\n"
+"PO-Revision-Date: 2023-04-05 18:07+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean Team <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "상세정보: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "\"%s\" 라이브러리를 로드할 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "이 운영체제에서 restricted token을 만들 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "프로세스 토큰을 열 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "SID를 할당할 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "상속된 토큰을 만들 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "\"%s\" 명령용 프로세스를 시작할 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "상속된 토큰으로 재실행할 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "하위 프로세스의 종료 코드를 구할 수 없음: 오류 코드 %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "%s 옵션의 잘못된 인자"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "자세한 사항은 \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "트랜잭션 ID epoch (-e) 값은 -1이 아니여야함"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "제일 오래된 트랜잭션 ID (-u)는 %u 보다 크거나 같아야 함"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "트랜잭션 ID (-x)는 %u 보다 크거나 같아야 함"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "-c 옵션으로 지정한 트랜잭션 ID는 0이거나 2이상이어야 함"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) 값은 0이 아니여야함"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "멀티트랜잭션 ID (-m) 값은 0이 아니여야함"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "제일 오래된 멀티트랜잭션 ID (-m) 값은 0이 아니여야함"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "멀티트랜잭션 옵셋 (-O) 값은 -1이 아니여야함"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segsize 값은 숫자여야 합니다"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "--wal-segsize 값은 1부터 1024사이 2^n 값이어야 합니다"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 많은 명령행 인수를 지정했습니다. (처음 \"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "데이터 디렉터리를 지정하지 않았음"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "\"root\" 계정으로는 실행 할 수 없음"
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "PostgreSQL superuser로 %s 프로그램을 실행하십시오."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 읽기 권한 없음: %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "\"%s\" 이름의 디렉터리로 이동할 수 없습니다: %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "\"%s\" 파일 일기 모드로 열기 실패: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "\"%s\" 잠금 파일이 있음"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr ""
+"서버가 가동중인가요? 그렇지 않다면, 이 파일을 지우고 다시 시도하십시오."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"이 설정값들이 타당하다고 판단되면, 강제로 갱신하려면, -f 옵션을 쓰세요.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"이 데이터베이스 서버는 정상적으로 중지되지 못했습니다.\n"
+"트랜잭션 로그를 다시 설정하는 것은 자료 손실을 야기할 수 있습니다.\n"
+"그럼에도 불구하고 진행하려면, -f 옵션을 사용해서 강제 설정을 하십시오.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "트랜잭션 로그 재설정\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "\"%s\" 파일은 예상치 않게 비었음"
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "\"%s\" 파일을 읽을 수 없음: %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "잘못된 버전의 데이터 디렉터리입니다."
+
+#: pg_resetwal.c:536
+#, c-format
+msgid ""
+"File \"%s\" contains \"%s\", which is not compatible with this program's "
+"version \"%s\"."
+msgstr "\"%s\" 파일 버전은 \"%s\", 이 프로그램 버전은 \"%s\"."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"지정한 데이터 디렉터리가 맞다면, 다음 명령을 실행하고, 다시 시도해\n"
+"보십시오.\n"
+" touch %s"
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control 파일이 있지만, CRC값이 잘못되었습니다; 경고와 함께 진행함"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid ""
+"pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural ""
+"pg_control specifies invalid WAL segment size (%d bytes); proceed with "
+"caution"
+msgstr[0] ""
+"pg_control 파일에 잘못된 WAL 조각 파일 크기(%d 바이트)가 지정됨; 경고와 함께 "
+"진행함"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control 파일이 있지만, 손상되었거나 버전을 알 수 없음; 무시함"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"추측된 pg_control 설정값들:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"현재 pg_control 설정값들:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control 버전 번호: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "카탈로그 버전 번호: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "데이터베이스 시스템 식별자: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "마지막 체크포인트 TimeLineID: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "마지막 체크포인트 full_page_writes: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "off"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "on"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "마지막 체크포인트 NextXID: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "마지막 체크포인트 NextOID: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "마지막 체크포인트 NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "마지막 체크포인트 NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "마지막 체크포인트 제일 오래된 XID: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "마지막 체크포인트 제일 오래된 XID의 DB:%u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "마지막 체크포인트 제일 오래된 ActiveXID:%u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "마지막 체크포인트 제일 오래된 MultiXid:%u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "마지막 체크포인트 제일 오래된 MultiXid의 DB:%u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "마지막 체크포인트 제일 오래된 CommitTsXid:%u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "마지막 체크포인트 최신 CommitTsXid: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "최대 자료 정렬: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "데이터베이스 블록 크기: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "대형 릴레이션의 세그먼트당 블럭 갯수: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL 블록 크기: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "WAL 세그먼트의 크기(byte): %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "식별자 최대 길이: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "인덱스에서 사용하는 최대 열 수: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST 청크의 최대 크기: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "대형객체 청크의 최대 크기: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "날짜/시간형 자료의 저장방식: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "64-비트 정수"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8 인수 전달: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "참조별"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "값별"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "데이터 페이지 체크섬 버전: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"변경될 값:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "리셋 뒤 첫 로그 세그먼트: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMultiXid의 DB: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXID의 DB: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID epoch: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "제일 오래된 CommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "최근 CommitTsXid: %u\n"
+
+#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 열 수 없음: %m"
+
+#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 읽을 수 없음: %m"
+
+#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 닫을 수 없음: %m"
+
+#: pg_resetwal.c:990 pg_resetwal.c:1028
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "\"%s\" 파일을 지울 수 없음: %m"
+
+#: pg_resetwal.c:1100
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파일을 열 수 없음: %m"
+
+#: pg_resetwal.c:1108 pg_resetwal.c:1120
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "\"%s\" 파일 쓰기 실패: %m"
+
+#: pg_resetwal.c:1125
+#, c-format
+msgid "fsync error: %m"
+msgstr "fsync 오류: %m"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 PostgreSQL 트랜잭션 로그를 다시 설정합니다.\n"
+"\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"사용법:\n"
+" %s [옵션]... DATADIR\n"
+"\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid "Options:\n"
+msgstr "옵션들:\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions "
+"bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" 커밋 타임스탬프를 사용할 최소,최대 트랜잭"
+"션\n"
+" ID 값 (0이면 바꾸지 않음)\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR 데이터 디렉터리\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH 다음 트랙잭션 ID epoch 지정\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force 강제로 갱신함\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid ""
+" -l, --next-wal-file=WALFILE set minimum starting location for new "
+"WAL\n"
+msgstr ""
+" -l, --next-wal-file=WALFILE 새 트랜잭션 로그를 위한 WAL 최소 시작 위치"
+"를 강제로 지정\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid ""
+" -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr ""
+" -m, --multixact-ids=MXID,MXID 다음 제일 오래된 멀티트랜잭션 ID 지정\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid ""
+" -n, --dry-run no update, just show what would be done\n"
+msgstr ""
+" -n, --dry-run 갱신하지 않음, 컨트롤 값들을 보여주기만 "
+"함\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID 다음 OID 지정\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET 다음 멀티트랜잭션 옵셋 지정\n"
+
+#: pg_resetwal.c:1148
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID 제일 오래된 트랜잭션 ID 지정\n"
+
+#: pg_resetwal.c:1149
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_resetwal.c:1150
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID 다음 트랜잭션 ID 지정\n"
+
+#: pg_resetwal.c:1151
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE WAL 조각 파일 크기, MB 단위\n"
+
+#: pg_resetwal.c:1152
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 표시하고 종료\n"
+
+#: pg_resetwal.c:1153
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"문제점 보고 주소: <%s>\n"
+
+#: pg_resetwal.c:1154
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
diff --git a/src/bin/pg_resetwal/po/pt_BR.po b/src/bin/pg_resetwal/po/pt_BR.po
new file mode 100644
index 0000000..952b83e
--- /dev/null
+++ b/src/bin/pg_resetwal/po/pt_BR.po
@@ -0,0 +1,667 @@
+# Brazilian Portuguese message translation file for pg_resetwal
+#
+# Copyright (C) 2002-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Cesar Suga <sartre@linuxbr.com>, 2002.
+# Roberto Mello <rmello@fslc.usu.edu>, 2002.
+# Euler Taveira <euler@eulerto.com>, 2003-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-27 13:15-0300\n"
+"PO-Revision-Date: 2022-09-27 20:17-0300\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n>1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erro: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "aviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalhe: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "dica: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "não pôde carregar biblioteca \"%s\": código de erro %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "não pode criar informações restritas nessa plataforma: código de erro %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "não pôde abrir informação sobre processo: código de erro %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "não pôde alocar SIDs: código de erro %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "não pôde criar informação restrita: código de erro %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "não pôde iniciar processo para comando \"%s\": código de erro %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "não pôde executar novamente com informação restrita: código de erro %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "não pôde obter código de saída de subprocesso: código de erro %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argumento inválido para opção %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Tente \"%s --help\" para obter informações adicionais."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "época do ID da transação (-e) não deve ser -1"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "ID de transação mais antigo (-u) deve ser maior ou igual a %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "ID de transação (-x) deve ser maior ou igual a %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "ID de transação (-c) deve ser 0 ou maior ou igual a 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) não deve ser 0"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "ID de transação múltipla (-m) não deve ser 0"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "ID de transação múltipla mais antigo (-m) não deve ser 0"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "posição da transação múltipla (-O) não deve ser -1"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "argumento de --wal-segsize deve ser um número"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "argumento de --wal-segsize deve ser uma potência de 2 entre 1 e 1024"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "muitos argumentos de linha de comando (primeiro é \"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "nenhum diretório de dados foi especificado"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "não pode ser executado como \"root\""
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Você deve executar %s como um super-usuário do PostgreSQL."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "não pôde ler permissões do diretório \"%s\": %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "não pôde mudar diretório para \"%s\": %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "não pôde abrir arquivo \"%s\" para leitura: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "arquivo de bloqueio \"%s\" existe"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "O servidor está executando? Se não, remova o arquivo de bloqueio e tente novamente."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Se estes valores lhe parecem aceitáveis, use -f para forçar o reinício.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"O servidor de banco de dados não foi desligado corretamente.\n"
+"Reiniciar o log de transação pode causar perda de dados.\n"
+"Se você quer continuar mesmo assim, use -f para forçar o reinício.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Reinício do log de transação\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "arquivo vazio \"%s\" inesperado"
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "não pôde ler arquivo \"%s\": %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "diretório de dados é de versão incorreta"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "Arquivo \"%s\" contém \"%s\", que não é compatível com esta versão do programa \"%s\"."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Se você tem certeza que o caminho do diretório de dados está correto, execute\n"
+" touch %s\n"
+"e tente novamente."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control existe mas tem CRC inválido; prossiga com cuidado"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control especifica tamanho de segmento do WAL inválido (%d byte); prossiga com cuidado"
+msgstr[1] "pg_control especifica tamanho de segmento do WAL inválido (%d bytes); prossiga com cuidado"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control existe mas não funciona ou sua versão é desconhecida; ignorando-o"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Valores supostos do pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Valores atuais do pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "número da versão do pg_control: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Número da versão do catálogo: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identificador do sistema de banco de dados: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "full_page_writes do último ponto de controle: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "desabilitado"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "habilitado"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID do último ponto de controle: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "BD do oldestXID do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "BD do oldestMulti do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Máximo alinhamento de dado: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Tamanho do bloco do banco de dados: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Blocos por segmento da relação grande: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Tamanho do bloco do WAL: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytes por segmento do WAL: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Tamanho máximo de identificadores: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Máximo de colunas em um índice: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Tamanho máximo do bloco TOAST: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Tamanho máximo do bloco de objeto grande: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Tipo de data/hora do repositório: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "inteiros de 64 bits"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Passagem de argumento float8: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "por referência"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "por valor"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Versão da verificação de páginas de dados: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Valores a serem alterados:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Primeiro segmento do arquivo de log após reinício: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "BD do OldestMulti: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "BD do OldestXID: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "época do NextXID: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "não pôde abrir diretório \"%s\": %m"
+
+#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "não pôde ler diretório \"%s\": %m"
+
+#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "não pôde fechar diretório \"%s\": %m"
+
+#: pg_resetwal.c:990 pg_resetwal.c:1028
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "não pôde excluir arquivo \"%s\": %m"
+
+#: pg_resetwal.c:1100
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "não pôde abrir arquivo \"%s\": %m"
+
+#: pg_resetwal.c:1108 pg_resetwal.c:1120
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "não pôde escrever no arquivo \"%s\": %m"
+
+#: pg_resetwal.c:1125
+#, c-format
+msgid "fsync error: %m"
+msgstr "erro ao executar fsync: %m"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s reinicia o log de transação do PostgreSQL.\n"
+"\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Uso:\n"
+" %s [OPÇÃO]... DIRDADOS\n"
+"\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid "Options:\n"
+msgstr "Opções:\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" define as transações mais antiga e mais nova\n"
+" timestamp de efetivação (zero significa nenhuma mudança)\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DIRDADOS diretório de dados\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=ÉPOCA_XID define próxima época do ID de transação\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force força atualização ser feita\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=ARQUIVOWAL define local inicial mínimo do WAL para novo log de transação\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID define próximo e mais velho ID de multitransação\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run sem atualização, mostra o que seria feito\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID define próximo OID\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=POSIÇÃO define próxima posição de multitransação\n"
+
+#: pg_resetwal.c:1148
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID define ID de transação mais antigo\n"
+
+#: pg_resetwal.c:1149
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_resetwal.c:1150
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID define próximo ID de transação\n"
+
+#: pg_resetwal.c:1151
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=TAMANHO tamanho dos segmentos do WAL, em megabytes\n"
+
+#: pg_resetwal.c:1152
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_resetwal.c:1153
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Relate erros a <%s>.\n"
+
+#: pg_resetwal.c:1154
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "página web do %s: <%s>\n"
diff --git a/src/bin/pg_resetwal/po/ru.po b/src/bin/pg_resetwal/po/ru.po
new file mode 100644
index 0000000..727b267
--- /dev/null
+++ b/src/bin/pg_resetwal/po/ru.po
@@ -0,0 +1,788 @@
+# Russian message translation file for pg_resetxlog
+# Copyright (C) 2002-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Serguei A. Mokhov <mokhov@cs.concordia.ca>, 2002-2005.
+# Oleg Bartunov <oleg@sai.msu.su>, 2004.
+# Sergey Burladyan <eshkinkot@gmail.com>, 2009.
+# Dmitriy Olshevskiy <olshevskiy87@bk.ru>, 2014.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetxlog (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-27 14:52+0300\n"
+"PO-Revision-Date: 2022-09-05 13:36+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробности: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подсказка: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "не удалось загрузить библиотеку \"%s\" (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "в этой ОС нельзя создавать ограниченные маркеры (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "не удалось открыть маркер процесса (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "не удалось подготовить структуры SID (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "не удалось создать ограниченный маркер (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "не удалось запустить процесс для команды \"%s\" (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "не удалось перезапуститься с ограниченным маркером (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "не удалось получить код выхода от подпроцесса (код ошибки: %lu)"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "недопустимый аргумент параметра %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Для дополнительной информации попробуйте \"%s --help\"."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "эпоха ID транзакции (-e) не должна быть равна -1"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "ID старейшей транзакции (-u) должен быть больше или равен %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "ID транзакции (-x) должен быть больше или равен %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "ID транзакции (-c) должен быть равен 0, либо больше или равен 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) не должен быть равен 0"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "ID мультитранзакции (-m) не должен быть равен 0"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "ID старейшей мультитранзакции (-m) не должен быть равен 0"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "смещение мультитранзакции (-O) не должно быть равно -1"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "аргументом --wal-segsize должно быть число"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "аргументом --wal-segsize должна быть степень 2 от 1 до 1024"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "слишком много аргументов командной строки (первый: \"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог данных не указан"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "программу не должен запускать root"
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Запускать %s нужно от имени суперпользователя PostgreSQL."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "не удалось считать права на каталог \"%s\": %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "не удалось перейти в каталог \"%s\": %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "не удалось открыть файл \"%s\" для чтения: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "файл блокировки \"%s\" существует"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr ""
+"Возможно, сервер запущен? Если нет, удалите этот файл и попробуйте снова."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Если эти значения приемлемы, выполните сброс принудительно, добавив ключ -"
+"f.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"Сервер баз данных был остановлен некорректно.\n"
+"Сброс журнала предзаписи может привести к потере данных.\n"
+"Если вы хотите сбросить его, несмотря на это, добавьте ключ -f.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Журнал предзаписи сброшен\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "файл \"%s\" оказался пустым"
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не удалось прочитать файл \"%s\": %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "каталог данных имеет неверную версию"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid ""
+"File \"%s\" contains \"%s\", which is not compatible with this program's "
+"version \"%s\"."
+msgstr ""
+"Файл \"%s\" содержит строку \"%s\", а ожидается версия программы \"%s\"."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Если вы уверены, что путь к каталогу данных правильный, выполните\n"
+" touch %s\n"
+"и повторите попытку."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr ""
+"pg_control существует, но его контрольная сумма неверна; продолжайте с "
+"осторожностью"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid ""
+"pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural ""
+"pg_control specifies invalid WAL segment size (%d bytes); proceed with "
+"caution"
+msgstr[0] ""
+"в pg_control указан некорректный размер сегмента WAL (%d Б); продолжайте с "
+"осторожностью"
+msgstr[1] ""
+"в pg_control указан некорректный размер сегмента WAL (%d Б); продолжайте с "
+"осторожностью"
+msgstr[2] ""
+"в pg_control указан некорректный размер сегмента WAL (%d Б); продолжайте с "
+"осторожностью"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr ""
+"pg_control испорчен или имеет неизвестную либо недопустимую версию; "
+"игнорируется..."
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Предполагаемые значения pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Текущие значения pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Номер версии pg_control: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Номер версии каталога: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Идентификатор системы баз данных: %llu\n"
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "Линия времени последней конт. точки: %u\n"
+
+# skip-rule: no-space-after-period
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Режим full_page_writes последней к.т: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "выкл."
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "вкл."
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID последней конт. точки: %u:%u\n"
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID последней конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId послед. конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset послед. конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID последней конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "БД с oldestXID последней конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID последней к. т.: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid последней конт. точки: %u\n"
+
+# skip-rule: capital-letter-first, double-space
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "БД с oldestMulti последней к. т.: %u\n"
+
+# skip-rule: capital-letter-first, double-space
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid последней к. т.: %u\n"
+
+# skip-rule: capital-letter-first, double-space
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid последней к. т.: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Макс. предел выравнивания данных: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Размер блока БД: %u\n"
+
+# skip-rule: double-space
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Блоков в макс. сегменте отношений: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Размер блока WAL: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Байт в сегменте WAL: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Максимальная длина идентификаторов: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Макс. число столбцов в индексе: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Максимальный размер порции TOAST: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Размер порции большого объекта: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Формат хранения даты/времени: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "64-битные целые"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Передача аргумента float8: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "по ссылке"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "по значению"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Версия контрольных сумм страниц: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Значения, которые будут изменены:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Первый сегмент журнала после сброса: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "БД с oldestMultiXid: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "БД с oldestXID: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "Эпоха NextXID: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не удалось открыть каталог \"%s\": %m"
+
+#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не удалось прочитать каталог \"%s\": %m"
+
+#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не удалось закрыть каталог \"%s\": %m"
+
+#: pg_resetwal.c:990 pg_resetwal.c:1028
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "ошибка удаления файла \"%s\": %m"
+
+#: pg_resetwal.c:1100
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалось открыть файл \"%s\": %m"
+
+#: pg_resetwal.c:1108 pg_resetwal.c:1120
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не удалось записать файл \"%s\": %m"
+
+#: pg_resetwal.c:1125
+#, c-format
+msgid "fsync error: %m"
+msgstr "ошибка синхронизации с ФС: %m"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s сбрасывает журнал предзаписи PostgreSQL.\n"
+"\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Использование:\n"
+" %s [ПАРАМЕТР]... КАТ_ДАННЫХ\n"
+"\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid "Options:\n"
+msgstr "Параметры:\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions "
+"bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" задать старейшую и новейшую транзакции,\n"
+" несущие метки времени (0 — не менять)\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]КАТ_ДАННЫХ каталог данных\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr ""
+" -e, --epoch=XIDEPOCH задать эпоху для ID следующей транзакции\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr ""
+" -f, --force принудительное выполнение операции\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid ""
+" -l, --next-wal-file=WALFILE set minimum starting location for new "
+"WAL\n"
+msgstr ""
+" -l, --next-wal-file=ФАЙЛ_WAL задать минимальное начальное положение\n"
+" для нового WAL\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid ""
+" -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr ""
+" -m, --multixact-ids=MXID,MXID задать ID следующей и старейшей\n"
+" мультитранзакции\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid ""
+" -n, --dry-run no update, just show what would be done\n"
+msgstr ""
+" -n, --dry-run показать, какие действия будут "
+"выполнены,\n"
+" но не выполнять их\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID задать следующий OID\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr ""
+" -O, --multixact-offset=СМЕЩЕНИЕ задать смещение следующей "
+"мультитранзакции\n"
+
+#: pg_resetwal.c:1148
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID задать ID старейшей ID\n"
+
+#: pg_resetwal.c:1149
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: pg_resetwal.c:1150
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID задать ID следующей транзакции\n"
+
+#: pg_resetwal.c:1151
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr ""
+" --wal-segsize=РАЗМЕР размер сегментов WAL (в мегабайтах)\n"
+
+#: pg_resetwal.c:1152
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: pg_resetwal.c:1153
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках сообщайте по адресу <%s>.\n"
+
+#: pg_resetwal.c:1154
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "transaction ID (-x) must not be 0"
+#~ msgstr "ID транзакции (-x) не должен быть равен 0"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Передача аргумента Float4: %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "%s: could not create pg_control file: %s\n"
+#~ msgstr "%s: не удалось создать файл pg_control: %s\n"
+
+#~ msgid "%s: could not write pg_control file: %s\n"
+#~ msgstr "%s: не удалось записать файл pg_control: %s\n"
+
+#~ msgid ""
+#~ " -c XID,XID set oldest and newest transactions bearing commit "
+#~ "timestamp\n"
+#~ msgstr ""
+#~ " -c XID,XID задать старейшую и новейшую транзакции, несущие метку "
+#~ "времени фиксации\n"
+
+#~ msgid " (zero in either value means no change)\n"
+#~ msgstr " (0 в любом из аргументов игнорируется)\n"
+
+#~ msgid ""
+#~ "%s: internal error -- sizeof(ControlFileData) is too large ... fix "
+#~ "PG_CONTROL_SIZE\n"
+#~ msgstr ""
+#~ "%s: внутренняя ошибка -- размер ControlFileData слишком велик -- "
+#~ "исправьте PG_CONTROL_SIZE\n"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "числа с плавающей точкой"
+
+#~ msgid "%s: invalid argument for option -x\n"
+#~ msgstr "%s: недопустимый аргумент параметра -x\n"
+
+#~ msgid "%s: invalid argument for option -o\n"
+#~ msgstr "%s: недопустимый аргумент параметра -o\n"
+
+#~ msgid "%s: invalid argument for option -m\n"
+#~ msgstr "%s: недопустимый аргумент параметра -m\n"
+
+#~ msgid "%s: invalid argument for option -O\n"
+#~ msgstr "%s: недопустимый аргумент параметра -O\n"
+
+#~ msgid "%s: invalid argument for option -l\n"
+#~ msgstr "%s: недопустимый аргумент параметра -l\n"
+
+#~ msgid " -m XID,OLDEST set next multitransaction ID and oldest value\n"
+#~ msgstr ""
+#~ " -m XID,СТАРЕЙШАЯ задать ID следующей мультитранзакции и ID старейшей\n"
+
+#~ msgid "disabled"
+#~ msgstr "отключен"
+
+#~ msgid "enabled"
+#~ msgstr "включен"
+
+#~ msgid "First log file ID after reset: %u\n"
+#~ msgstr "ID первого журнала после сброса: %u\n"
diff --git a/src/bin/pg_resetwal/po/sv.po b/src/bin/pg_resetwal/po/sv.po
new file mode 100644
index 0000000..0cdd2f2
--- /dev/null
+++ b/src/bin/pg_resetwal/po/sv.po
@@ -0,0 +1,670 @@
+# Swedish message translation file for resetxlog.
+# Dennis Björklund <db@zigo.dhs.org>, 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022.
+# Peter Eisentraut <peter_e@gmx.net>, 2010.
+# Mats Erik Andersson <bsd@gisladisker.se>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-11 19:48+0000\n"
+"PO-Revision-Date: 2022-04-11 22:01+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:280
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:291
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:298
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "kunde inte ladda länkbibliotek \"%s\": felkod %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "kan inte skapa token för begränsad åtkomst på denna plattorm: felkod %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "kunde inte öppna process-token: felkod %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "kunde inte allokera SID: felkod %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "kunde inte skapa token för begränsad åtkomst: felkod %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "kunde inte starta process för kommando \"%s\": felkod %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "kunde inte köra igen med token för begränsad åtkomst: felkod %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "kunde inte hämta statuskod för underprocess: felkod %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "ogiltigt argument för flaggan %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "Epoch (-e) för transaktions-ID får inte vara -1."
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "äldsta transaktions-ID (-u) måste vara större än eller lika med %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "transaktions-ID (-x) måste vara större än eller lika med %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "transaktions-ID (-c) måste antingen vara 0 eller större än eller lika med 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) får inte vara 0."
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "Multitransaktions-ID (-m) får inte vara 0."
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "Äldsta multitransaktions-ID (-m) får inte vara 0."
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "Multitransaktionsoffset (-O) får inte vara -1."
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "argumentet till --wal-segsize måste vara ett tal"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "argumentet till --wal-segsize måste vara en tvåpotens mellan 1 och 1024"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "ingen datakatalog angiven"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "kan inte köras av \"root\""
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Du måste köra %s som PostgreSQL:s superuser."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "kunde inte läsa rättigheter på katalog \"%s\": %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "kunde inte byta katalog till \"%s\": %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "kunde inte öppna filen \"%s\" för läsning: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "låsfil med namn \"%s\" finns redan"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "Kör servern redan? Om inte, radera låsfilen och försök igen."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Om dessa värden verkar godtagbara, använd då -f för att\n"
+"framtvinga återställning.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"Databasservern stängdes inte av ordentligt. Att återställa\n"
+"write-ahead-loggen kan medföra att data förloras. Om du ändå\n"
+"vill fortsätta, använd -f för att framtvinga återställning.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Återställning av write-ahead-log\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "oväntad tom fil \"%s\""
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "kunde inte läsa fil \"%s\": %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "datakatalogen har fel version"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "Filen \"%s\" innehåller \"%s\", vilket inte är kompatibelt med detta programmets version \"%s\"."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Om du är säker på att sökvägen till datakatalogen är riktig,\n"
+"utför då \"touch %s\" och försök sedan igen."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control existerar men har ogiltig CRC. Fortsätt med varsamhet."
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control anger ogiltig WAL-segmentstorlek (%d byte); fortsätt med varsamhet."
+msgstr[1] "pg_control anger ogiltig WAL-segmentstorlek (%d byte); fortsätt med varsamhet."
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control existerar men är trasig eller har fel version. Den ignoreras."
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Gissade värden för pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Nuvarande värden för pg_control:\n"
+"\n"
+
+# November 26th, 2014: Insert six additional space characters
+# for best alignment with Swedish translation.
+# Translations should be checked against those of pg_controldata.
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Versionsnummer för pg_control: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Katalogversion: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Databasens systemidentifierare: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID vid senaste kontrollpunkt: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Senaste kontrollpunktens full_page_writes: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "av"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "på"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID vid senaste kontrollpunkt: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID vid senaste kontrollpunkt: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId vid senaste kontrollpunkt: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset vid senaste kontrollpunkt: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID vid senaste kontrollpunkt: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB för oldestXID vid senaste kontrollpunkt: %u\n"
+
+# FIXME: too wide
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID vid senaste kontrollpunkt: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid vid senaste kontrollpunkt: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB för oldestMulti vid senaste kontrollpkt: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid vid senaste kontrollpunkt:%u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid vid senaste kontrollpunkt:%u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Maximal jämkning av data (alignment): %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Databasens blockstorlek: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Block per segment i en stor relation: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Blockstorlek i transaktionsloggen: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Segmentstorlek i transaktionsloggen: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Maximal längd för identifierare: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Maximalt antal kolonner i ett index: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Maximal storlek för en TOAST-enhet: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Storlek för large-object-enheter: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Representation av dag och tid: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "64-bitars heltal"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Åtkomst till float8-argument: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "referens"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "värdeåtkomst"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Checksummaversion för datasidor: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Värden att förändra:\n"
+"\n"
+
+# November 26th, 2014: Insert additional spacing to fit
+# with the first translated text, which uses most characters.
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Första loggsegment efter återställning: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "DB för OldestMulti: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "DB för OldestXID: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "Epoch för NextXID: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "kunde inte öppna katalog \"%s\": %m"
+
+#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "kunde inte läsa katalog \"%s\": %m"
+
+#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "kunde inte stänga katalog \"%s\": %m"
+
+#: pg_resetwal.c:990 pg_resetwal.c:1028
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "kunde inte radera fil \"%s\": %m"
+
+#: pg_resetwal.c:1100
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: pg_resetwal.c:1108 pg_resetwal.c:1120
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "kunde inte skriva fil \"%s\": %m"
+
+#: pg_resetwal.c:1125
+#, c-format
+msgid "fsync error: %m"
+msgstr "misslyckad fsync: %m"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s återställer write-ahead-log för PostgreSQL.\n"
+"\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Användning:\n"
+" %s [FLAGGA]... DATAKATALOG\n"
+"\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid "Options:\n"
+msgstr "Flaggor:\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" sätt äldsta och nyaste transaktionerna som\n"
+" kan ha commit-tidstämpel (noll betyder\n"
+" ingen ändring)\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR datakatalog\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH sätter epoch för nästa transaktions-ID\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force framtvinga uppdatering\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFIL sätt minsta startposition för ny WAL\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID sätt nästa och äldsta multitransaktions-ID\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run ingen updatering; visa bara planerade åtgärder\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID sätt nästa OID\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET sätt nästa multitransaktionsoffset\n"
+
+#: pg_resetwal.c:1148
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID sätt äldsta transaktions-ID\n"
+
+#: pg_resetwal.c:1149
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_resetwal.c:1150
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID sätt nästa transaktions-ID\n"
+
+#: pg_resetwal.c:1151
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=STORLEK storlek på WAL-segment i megabyte\n"
+
+#: pg_resetwal.c:1152
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_resetwal.c:1153
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: pg_resetwal.c:1154
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
diff --git a/src/bin/pg_resetwal/po/uk.po b/src/bin/pg_resetwal/po/uk.po
new file mode 100644
index 0000000..be45873
--- /dev/null
+++ b/src/bin/pg_resetwal/po/uk.po
@@ -0,0 +1,634 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:49+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_resetwal.pot\n"
+"X-Crowdin-File-ID: 880\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередження: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "не вдалося завантажити бібліотеку \"%s\": код помилки %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "не вдалося створити обмежені токени на цій платформі: код помилки %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "не вдалося відкрити токен процесу: код помилки %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "не вдалося виділити SID: код помилки %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "не вдалося створити обмежений токен: код помилки %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "не вдалося запустити процес для команди \"%s\": код помилки %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "не вдалося перезапустити з обмеженим токеном: код помилки %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "не вдалося отримати код завершення підпроцесу: код помилки %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "неприпустимий аргумент для параметру %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" для додаткової інформації."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "епоха ID транзакції (-e) не повинна бути -1"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "найстаріший ID транзакції (-u) має бути більший або рівним %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "ID транзакції (-x) має бути більшим чи рівним %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "ID транзакції (-c) повинен дорівнювати 0, бути більшим за або дорівнювати 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) не може бути 0"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "ID мультитранзакції (-m) не повинен бути 0"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "найстарший ID мультитранзакції (-m) не повинен бути 0"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "зсув мультитранзакції (-O) не повинен бути -1"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "аргумент --wal-segsize повинен бути числом"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "аргумент --wal-segsize повинен бути ступенем 2 між 1 і 1024"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному рядку (перший \"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог даних не вказано"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "\"root\" не може це виконувати"
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Запускати %s треба від суперкористувача PostgreSQL."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "не вдалося прочитати дозволи на каталог \"%s\": %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "не вдалося змінити каталог на \"%s\": %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "не вдалося відкрити файл \"%s\" для читання: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "файл блокування \"%s\" вже існує"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "Чи запущений сервер? Якщо ні, видаліть файл блокування і спробуйте знову."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid "\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr "\n"
+"Якщо ці значення виглядають допустимими, використайте -f, щоб провести перевстановлення.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid "The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr "Сервер баз даних був зупинений некоректно.\n"
+"Очищення журналу передзапису може привести до втрати даних.\n"
+"Якщо ви все одно хочете продовжити, використайте параметр -f.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Журнал передзапису скинуто\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "неочікуваний порожній файл \"%s\""
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не вдалося прочитати файл \"%s\": %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "каталог даних неправильної версії"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "Файл \"%s\" містить \"%s\", який не сумісний з версією цієї програми \"%s\"."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid "If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr "Якщо Ви впевнені, що шлях каталогу даних є правильним, виконайте \n"
+" touch %s\n"
+"і спробуйте знову."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control існує, але має недопустимий CRC; продовжуйте з обережністю"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control вказує неприпустимий розмір сегмента WAL (%d байт); продовжуйте з обережністю"
+msgstr[1] "pg_control вказує неприпустимий розмір сегмента WAL (%d байти); продовжуйте з обережністю"
+msgstr[2] "pg_control вказує неприпустимий розмір сегмента WAL (%d байтів); продовжуйте з обережністю"
+msgstr[3] "pg_control вказує неприпустимий розмір сегмента WAL (%d байтів); продовжуйте з обережністю"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control існує, але зламаний або неправильної версії; ігнорується"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid "Guessed pg_control values:\n\n"
+msgstr "Припустимі значення pg_control:\n\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid "Current pg_control values:\n\n"
+msgstr "Поточні значення pg_control:\n\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control номер версії: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Номер версії каталогу: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Системний ідентифікатор бази даних: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "Останній TimeLineID контрольної точки: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Останній full_page_writes контрольної точки: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "вимк"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "увімк"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "Останній NextXID контрольної точки: %u%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "Останній NextOID контрольної точки: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "Останній NextMultiXactId контрольної точки: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "Останній NextMultiOffset контрольної точки: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "Останній oldestXID контрольної точки: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "Остання DB останнього oldestXID контрольної точки: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "Останній oldestActiveXID контрольної точки: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "Останній oldestMultiXid контрольної точки: %u \n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "Остання DB останньої oldestMulti контрольної точки: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "Останній oldestCommitTsXid контрольної точки:%u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "Останній newestCommitTsXid контрольної точки: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Максимальне вирівнювання даних: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Розмір блоку бази даних: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Блоків на сегмент великого відношення: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Pозмір блоку WAL: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Байтів на сегмент WAL: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Максимальна довжина ідентифікаторів: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Максимальна кількість стовпців в індексі: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Максимальний розмір сегменту TOAST: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Розмір сегменту великих обїєктів: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Дата/час типу сховища: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "64-бітні цілі"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Передача аргументу Float8: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "за посиланням"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "за значенням"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Версія контрольних сум сторінок даних: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid "\n\n"
+"Values to be changed:\n\n"
+msgstr "\n\n"
+"Значення, що потребують зміни:\n\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Перший сегмент журналу після скидання: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMulti's DB: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXID's DB: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "Епоха NextXID: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не вдалося відкрити каталог \"%s\": %m"
+
+#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не вдалося прочитати каталог \"%s\": %m"
+
+#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не вдалося закрити каталог \"%s\": %m"
+
+#: pg_resetwal.c:990 pg_resetwal.c:1028
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "не вдалося видалити файл \"%s\": %m"
+
+#: pg_resetwal.c:1100
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: pg_resetwal.c:1108 pg_resetwal.c:1120
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не вдалося записати файл \"%s\": %m"
+
+#: pg_resetwal.c:1125
+#, c-format
+msgid "fsync error: %m"
+msgstr "помилка fsync: %m"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid "%s resets the PostgreSQL write-ahead log.\n\n"
+msgstr "%s скидає журнал передзапису PostgreSQL.\n\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid "Usage:\n"
+" %s [OPTION]... DATADIR\n\n"
+msgstr "Використання:\n"
+" %s [OPTION]... КАТАЛОГ_ДАНИХ\n\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid "Options:\n"
+msgstr "Параметри:\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid " -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr " -c, --commit-timestamp-ids=XID,XID\n"
+" встановити найстарішу та найновішу транзакції\n"
+" затвердити позначку часу (нуль означає залишити без змін)\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR каталог даних\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH встановити наступну епоху ID транзакцій\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force примусово виконати оновлення\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFILE задати мінімальне початкове розташування для нового WAL\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID задати ID наступної і найстарішої мультитранзакції\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run без оновлень, просто показати, що буде зроблено\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID задати наступний OID\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET задати зсув наступної мультитранзакції\n"
+
+#: pg_resetwal.c:1148
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID задати ID найстарішої транзакції\n"
+
+#: pg_resetwal.c:1149
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію і вийти\n"
+
+#: pg_resetwal.c:1150
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID задати ID наступної транзакції\n"
+
+#: pg_resetwal.c:1151
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE розмір сегментів WAL, у мегабайтах\n"
+
+#: pg_resetwal.c:1152
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку і вийти\n"
+
+#: pg_resetwal.c:1153
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"Повідомляти про помилки на <%s>.\n"
+
+#: pg_resetwal.c:1154
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
diff --git a/src/bin/pg_resetwal/po/zh_CN.po b/src/bin/pg_resetwal/po/zh_CN.po
new file mode 100644
index 0000000..5a401d1
--- /dev/null
+++ b/src/bin/pg_resetwal/po/zh_CN.po
@@ -0,0 +1,638 @@
+# LANGUAGE message translation file for pg_resetwal
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_resetwal (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetwal (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:47+0000\n"
+"PO-Revision-Date: 2021-08-15 17:30+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的: "
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "无法加载库 \"%s\": 错误码 %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "无法为该平台创建受限制的令牌:错误码 %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "无法打开进程令牌 (token): 错误码 %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "无法分配SID: 错误码 %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "无法创建受限令牌: 错误码为 %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "无法为命令 \"%s\"创建进程: 错误码 %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "无法使用受限令牌再次执行: 错误码 %lu"
+
+#: ../../common/restricted_token.c:194
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "无法从子进程得到退出码: 错误码 %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:162 pg_resetwal.c:177 pg_resetwal.c:192 pg_resetwal.c:207
+#: pg_resetwal.c:214 pg_resetwal.c:238 pg_resetwal.c:253 pg_resetwal.c:261
+#: pg_resetwal.c:286 pg_resetwal.c:300
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "选项%s的参数无效"
+
+#: pg_resetwal.c:163 pg_resetwal.c:178 pg_resetwal.c:193 pg_resetwal.c:208
+#: pg_resetwal.c:215 pg_resetwal.c:239 pg_resetwal.c:254 pg_resetwal.c:262
+#: pg_resetwal.c:287 pg_resetwal.c:301 pg_resetwal.c:327 pg_resetwal.c:340
+#: pg_resetwal.c:348
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获取更多的信息.\n"
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "事务ID epoch(-e)不能为-1"
+
+#: pg_resetwal.c:183
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "最旧的事务ID(-c)必须大于或等于%u"
+
+#: pg_resetwal.c:198
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "事务ID(-x)必须大于或等于%u"
+
+#: pg_resetwal.c:222 pg_resetwal.c:229
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "事务ID(-c)必须为0或大于或等于2"
+
+#: pg_resetwal.c:244
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o)不能为0"
+
+#: pg_resetwal.c:267
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "多事务ID(-m)不能为0"
+
+#: pg_resetwal.c:277
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "最早的多事务ID(-m)不能为0"
+
+#: pg_resetwal.c:292
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "多事务偏移量(-O)不能为-1"
+
+#: pg_resetwal.c:316
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segsize的参数必须是一个数字"
+
+#: pg_resetwal.c:321
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "--wal-segsize的参数必须是2的幂次方(在1和1024之间)"
+
+#: pg_resetwal.c:338
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行参数太多 (第一个是 \"%s\")"
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "no data directory specified"
+msgstr "没有指定数据目录"
+
+#: pg_resetwal.c:361
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "不能由\"root\"执行"
+
+#: pg_resetwal.c:362
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "您现在作为PostgreSQL超级用户运行%s."
+
+#: pg_resetwal.c:373
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "没有读取目录 \"%s\" 的权限: %m"
+
+#: pg_resetwal.c:382
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "无法跳转到目录 \"%s\" 中: %m"
+
+#: pg_resetwal.c:398 pg_resetwal.c:553 pg_resetwal.c:604
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "为了读取, 无法打开文件 \"%s\": %m"
+
+#: pg_resetwal.c:405
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "锁文件 \"%s\" 存在"
+
+#: pg_resetwal.c:406
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "服务器是否正在运行?如果没有,请删除锁文件并重试."
+
+#: pg_resetwal.c:501
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"如果这些值似乎可以接受,则使用-f强制重置.\n"
+
+#: pg_resetwal.c:513
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"数据库服务器未完全关闭 .\n"
+"重置预写日志可能会导致数据丢失.\n"
+"如果仍要继续,请使用-f强制重置.\n"
+
+#: pg_resetwal.c:527
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "重置预写日志\n"
+
+#: pg_resetwal.c:562
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "意外的空文件\"%s\""
+
+#: pg_resetwal.c:564 pg_resetwal.c:620
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "无法读取文件 \"%s\": %m"
+
+#: pg_resetwal.c:573
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "数据目录版本错误"
+
+#: pg_resetwal.c:574
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "文件\"%s\"包含\"%s\",与此程序的版本\"%s\"不兼容."
+
+#: pg_resetwal.c:607
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"如果确定数据目录路径正确,请执行\n"
+" touch %s\n"
+"请再试一次"
+
+#: pg_resetwal.c:638
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control存在,但具有无效的CRC;请小心继续"
+
+#: pg_resetwal.c:647
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control指定的WAL段大小(%d 字节)无效; 请小心继续"
+msgstr[1] "pg_control指定的WAL段大小(%d 字节)无效; 请小心继续"
+
+#: pg_resetwal.c:658
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control存在,但已损坏或版本错误;忽略它"
+
+#: pg_resetwal.c:753
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"猜测的pg_control的值:\n"
+"\n"
+
+#: pg_resetwal.c:755
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"当前的pg_control的值:\n"
+"\n"
+
+#: pg_resetwal.c:757
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control 版本: %u\n"
+
+#: pg_resetwal.c:759
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Catalog 版本: %u\n"
+
+#: pg_resetwal.c:761
+msgid "Database system identifier: %llu\n"
+msgstr "数据库系统标识符: %llu\n"
+
+#: pg_resetwal.c:763
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "最新检查点的 TimeLineID: %u\n"
+
+#: pg_resetwal.c:765
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "最新检查点的full_page_writes: %s\n"
+
+#: pg_resetwal.c:766
+msgid "off"
+msgstr "关闭"
+
+#: pg_resetwal.c:766
+msgid "on"
+msgstr "开启"
+
+#: pg_resetwal.c:767
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "最新检查点的NextXID: %u:%u\n"
+
+#: pg_resetwal.c:770
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "最新检查点的 NextOID: %u\n"
+
+#: pg_resetwal.c:772
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "最新检查点的NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:774
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "最新检查点的NextMultiOffsetD: %u\n"
+
+#: pg_resetwal.c:776
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "最新检查点的oldestXID: %u\n"
+
+#: pg_resetwal.c:778
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "最新检查点的oldestXID所在的数据库:%u\n"
+
+#: pg_resetwal.c:780
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "最新检查点的oldestActiveXID: %u\n"
+
+#: pg_resetwal.c:782
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "最新检查点的oldestMultiXid: %u\n"
+
+#: pg_resetwal.c:784
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "最新检查点的oldestMulti所在的数据库:%u\n"
+
+#: pg_resetwal.c:786
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "最新检查点的oldestCommitTsXid:%u\n"
+
+#: pg_resetwal.c:788
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "最新检查点的newestCommitTsXid:%u\n"
+
+#: pg_resetwal.c:790
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "最大数据校准: %u\n"
+
+#: pg_resetwal.c:793
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "数据库块大小: %u\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "大关系的每段块数: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL的块大小: %u\n"
+
+#: pg_resetwal.c:799 pg_resetwal.c:885
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "每一个 WAL 段字节数: %u\n"
+
+#: pg_resetwal.c:801
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "标识符的最大长度: %u\n"
+
+#: pg_resetwal.c:803
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "在索引中可允许使用最大的列数: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST区块的最大长度: %u\n"
+
+#: pg_resetwal.c:807
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "大对象区块的大小: %u\n"
+
+#: pg_resetwal.c:810
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "日期/时间 类型存储: %s\n"
+
+#: pg_resetwal.c:811
+msgid "64-bit integers"
+msgstr "64位整数"
+
+#: pg_resetwal.c:812
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "正在传递Flloat8类型的参数: %s\n"
+
+#: pg_resetwal.c:813
+msgid "by reference"
+msgstr "由引用"
+
+#: pg_resetwal.c:813
+msgid "by value"
+msgstr "由值"
+
+#: pg_resetwal.c:814
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "数据页校验和版本: %u\n"
+
+#: pg_resetwal.c:828
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"要更改的值:\n"
+
+#: pg_resetwal.c:832
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "First log segment after reset: %s\n"
+
+#: pg_resetwal.c:836
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:840
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMulti's DB: %u\n"
+
+#: pg_resetwal.c:846
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:852
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:858
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:860
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:862
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXID's DB: %u\n"
+
+#: pg_resetwal.c:868
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID epoch: %u\n"
+
+#: pg_resetwal.c:874
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:879
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:965 pg_resetwal.c:1033 pg_resetwal.c:1080
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "无法打开目录 \"%s\": %m"
+
+#: pg_resetwal.c:1000 pg_resetwal.c:1053 pg_resetwal.c:1103
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "无法读取目录 \"%s\": %m"
+
+#: pg_resetwal.c:1006 pg_resetwal.c:1059 pg_resetwal.c:1109
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "无法关闭目录 \"%s\": %m"
+
+#: pg_resetwal.c:1045 pg_resetwal.c:1095
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "无法删除文件 \"%s\": %m"
+
+#: pg_resetwal.c:1176
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "无法打开文件 \"%s\": %m"
+
+#: pg_resetwal.c:1186 pg_resetwal.c:1199
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "无法写入文件 \"%s\": %m"
+
+#: pg_resetwal.c:1206
+#, c-format
+msgid "fsync error: %m"
+msgstr "fsync 错误: %m"
+
+#: pg_resetwal.c:1217
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr "%s 重置一个PostgreSQL数据库集簇的预写式日志.\n"
+
+#: pg_resetwal.c:1218
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"用法:\n"
+" %s [选项]... 数据目录\n"
+
+#: pg_resetwal.c:1219
+#, c-format
+msgid "Options:\n"
+msgstr "选项:\n"
+
+#: pg_resetwal.c:1220
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" 设置提交时间可以检索到的最老的和最新的事务ID\n"
+" (0意味着没有变化)\n"
+
+#: pg_resetwal.c:1223
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR 数据目录\n"
+
+#: pg_resetwal.c:1224
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH 设置下一个事务ID的epoch\n"
+
+#: pg_resetwal.c:1225
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force 强制更新完成\n"
+
+#: pg_resetwal.c:1226
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFILE 设置新的WAL最小起始位置\n"
+
+#: pg_resetwal.c:1227
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID 设置下一个和最旧的多事务ID\n"
+
+#: pg_resetwal.c:1228
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run 不更新,只显示将要执行的操作\n"
+
+#: pg_resetwal.c:1229
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID 设置下一个OID\n"
+
+#: pg_resetwal.c:1230
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET 设置下一个多事务偏移量\n"
+
+#: pg_resetwal.c:1231
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID 设置最旧的事务ID\n"
+
+#: pg_resetwal.c:1232
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信息, 然后退出\n"
+
+#: pg_resetwal.c:1233
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID 设置下一个事务ID\n"
+
+#: pg_resetwal.c:1234
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE WAL段的大小(兆字节)\n"
+
+#: pg_resetwal.c:1235
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助信息, 然后退出\n"
+
+#: pg_resetwal.c:1236
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: pg_resetwal.c:1237
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
diff --git a/src/bin/pg_resetwal/t/001_basic.pl b/src/bin/pg_resetwal/t/001_basic.pl
new file mode 100644
index 0000000..b4b192c
--- /dev/null
+++ b/src/bin/pg_resetwal/t/001_basic.pl
@@ -0,0 +1,32 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_resetwal');
+program_version_ok('pg_resetwal');
+program_options_handling_ok('pg_resetwal');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+
+command_like([ 'pg_resetwal', '-n', $node->data_dir ],
+ qr/checkpoint/, 'pg_resetwal -n produces output');
+
+
+# Permissions on PGDATA should be default
+SKIP:
+{
+ skip "unix-style permissions not supported on Windows", 1
+ if ($windows_os);
+
+ ok(check_mode_recursive($node->data_dir, 0700, 0600),
+ 'check PGDATA permissions');
+}
+
+done_testing();
diff --git a/src/bin/pg_resetwal/t/002_corrupted.pl b/src/bin/pg_resetwal/t/002_corrupted.pl
new file mode 100644
index 0000000..cb4f451
--- /dev/null
+++ b/src/bin/pg_resetwal/t/002_corrupted.pl
@@ -0,0 +1,58 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+# Tests for handling a corrupted pg_control
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+
+my $pg_control = $node->data_dir . '/global/pg_control';
+my $size = (stat($pg_control))[7];
+
+# Read out the head of the file to get PG_CONTROL_VERSION in
+# particular.
+my $data;
+open my $fh, '<', $pg_control or BAIL_OUT($!);
+binmode $fh;
+read $fh, $data, 16;
+close $fh;
+
+# Fill pg_control with zeros
+open $fh, '>', $pg_control or BAIL_OUT($!);
+binmode $fh;
+print $fh pack("x[$size]");
+close $fh;
+
+command_checks_all(
+ [ 'pg_resetwal', '-n', $node->data_dir ],
+ 0,
+ [qr/pg_control version number/],
+ [
+ qr/pg_resetwal: warning: pg_control exists but is broken or wrong version; ignoring it/
+ ],
+ 'processes corrupted pg_control all zeroes');
+
+# Put in the previously saved header data. This uses a different code
+# path internally, allowing us to process a zero WAL segment size.
+open $fh, '>', $pg_control or BAIL_OUT($!);
+binmode $fh;
+print $fh $data, pack("x[" . ($size - 16) . "]");
+close $fh;
+
+command_checks_all(
+ [ 'pg_resetwal', '-n', $node->data_dir ],
+ 0,
+ [qr/pg_control version number/],
+ [
+ qr/\Qpg_resetwal: warning: pg_control specifies invalid WAL segment size (0 bytes); proceed with caution\E/
+ ],
+ 'processes zero WAL segment size');
+
+done_testing();
diff --git a/src/bin/pg_rewind/.gitignore b/src/bin/pg_rewind/.gitignore
new file mode 100644
index 0000000..79ddca3
--- /dev/null
+++ b/src/bin/pg_rewind/.gitignore
@@ -0,0 +1,6 @@
+# Files generated during build
+/xlogreader.c
+/pg_rewind
+
+# Generated by test suite
+/tmp_check/
diff --git a/src/bin/pg_rewind/Makefile b/src/bin/pg_rewind/Makefile
new file mode 100644
index 0000000..e8a4713
--- /dev/null
+++ b/src/bin/pg_rewind/Makefile
@@ -0,0 +1,60 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_rewind
+#
+# Portions Copyright (c) 2013-2022, PostgreSQL Global Development Group
+#
+# src/bin/pg_rewind/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_rewind - synchronize a data directory with another one forked from"
+PGAPPICON = win32
+
+subdir = src/bin/pg_rewind
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+override CPPFLAGS := -I$(libpq_srcdir) -DFRONTEND $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+OBJS = \
+ $(WIN32RES) \
+ datapagemap.o \
+ file_ops.o \
+ filemap.o \
+ libpq_source.o \
+ local_source.o \
+ parsexlog.o \
+ pg_rewind.o \
+ timeline.o \
+ xlogreader.o
+
+EXTRA_CLEAN = xlogreader.c
+
+all: pg_rewind
+
+pg_rewind: $(OBJS) | submake-libpq submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+xlogreader.c: % : $(top_srcdir)/src/backend/access/transam/%
+ rm -f $@ && $(LN_S) $< .
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_rewind$(X) '$(DESTDIR)$(bindir)/pg_rewind$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_rewind$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_rewind$(X) $(OBJS) xlogreader.c
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_rewind/datapagemap.c b/src/bin/pg_rewind/datapagemap.c
new file mode 100644
index 0000000..cbc3bc5
--- /dev/null
+++ b/src/bin/pg_rewind/datapagemap.c
@@ -0,0 +1,127 @@
+/*-------------------------------------------------------------------------
+ *
+ * datapagemap.c
+ * A data structure for keeping track of data pages that have changed.
+ *
+ * This is a fairly simple bitmap.
+ *
+ * Copyright (c) 2013-2022, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include "common/logging.h"
+#include "datapagemap.h"
+
+struct datapagemap_iterator
+{
+ datapagemap_t *map;
+ BlockNumber nextblkno;
+};
+
+/*****
+ * Public functions
+ */
+
+/*
+ * Add a block to the bitmap.
+ */
+void
+datapagemap_add(datapagemap_t *map, BlockNumber blkno)
+{
+ int offset;
+ int bitno;
+
+ offset = blkno / 8;
+ bitno = blkno % 8;
+
+ /* enlarge or create bitmap if needed */
+ if (map->bitmapsize <= offset)
+ {
+ int oldsize = map->bitmapsize;
+ int newsize;
+
+ /*
+ * The minimum to hold the new bit is offset + 1. But add some
+ * headroom, so that we don't need to repeatedly enlarge the bitmap in
+ * the common case that blocks are modified in order, from beginning
+ * of a relation to the end.
+ */
+ newsize = offset + 1;
+ newsize += 10;
+
+ map->bitmap = pg_realloc(map->bitmap, newsize);
+
+ /* zero out the newly allocated region */
+ memset(&map->bitmap[oldsize], 0, newsize - oldsize);
+
+ map->bitmapsize = newsize;
+ }
+
+ /* Set the bit */
+ map->bitmap[offset] |= (1 << bitno);
+}
+
+/*
+ * Start iterating through all entries in the page map.
+ *
+ * After datapagemap_iterate, call datapagemap_next to return the entries,
+ * until it returns false. After you're done, use pg_free() to destroy the
+ * iterator.
+ */
+datapagemap_iterator_t *
+datapagemap_iterate(datapagemap_t *map)
+{
+ datapagemap_iterator_t *iter;
+
+ iter = pg_malloc(sizeof(datapagemap_iterator_t));
+ iter->map = map;
+ iter->nextblkno = 0;
+
+ return iter;
+}
+
+bool
+datapagemap_next(datapagemap_iterator_t *iter, BlockNumber *blkno)
+{
+ datapagemap_t *map = iter->map;
+
+ for (;;)
+ {
+ BlockNumber blk = iter->nextblkno;
+ int nextoff = blk / 8;
+ int bitno = blk % 8;
+
+ if (nextoff >= map->bitmapsize)
+ break;
+
+ iter->nextblkno++;
+
+ if (map->bitmap[nextoff] & (1 << bitno))
+ {
+ *blkno = blk;
+ return true;
+ }
+ }
+
+ /* no more set bits in this bitmap. */
+ return false;
+}
+
+/*
+ * A debugging aid. Prints out the contents of the page map.
+ */
+void
+datapagemap_print(datapagemap_t *map)
+{
+ datapagemap_iterator_t *iter;
+ BlockNumber blocknum;
+
+ iter = datapagemap_iterate(map);
+ while (datapagemap_next(iter, &blocknum))
+ pg_log_debug("block %u", blocknum);
+
+ pg_free(iter);
+}
diff --git a/src/bin/pg_rewind/datapagemap.h b/src/bin/pg_rewind/datapagemap.h
new file mode 100644
index 0000000..ae4965f
--- /dev/null
+++ b/src/bin/pg_rewind/datapagemap.h
@@ -0,0 +1,29 @@
+/*-------------------------------------------------------------------------
+ *
+ * datapagemap.h
+ *
+ * Copyright (c) 2013-2022, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef DATAPAGEMAP_H
+#define DATAPAGEMAP_H
+
+#include "storage/block.h"
+#include "storage/relfilenode.h"
+
+struct datapagemap
+{
+ char *bitmap;
+ int bitmapsize;
+};
+
+typedef struct datapagemap datapagemap_t;
+typedef struct datapagemap_iterator datapagemap_iterator_t;
+
+extern void datapagemap_add(datapagemap_t *map, BlockNumber blkno);
+extern datapagemap_iterator_t *datapagemap_iterate(datapagemap_t *map);
+extern bool datapagemap_next(datapagemap_iterator_t *iter, BlockNumber *blkno);
+extern void datapagemap_print(datapagemap_t *map);
+
+#endif /* DATAPAGEMAP_H */
diff --git a/src/bin/pg_rewind/file_ops.c b/src/bin/pg_rewind/file_ops.c
new file mode 100644
index 0000000..6cb288f
--- /dev/null
+++ b/src/bin/pg_rewind/file_ops.c
@@ -0,0 +1,477 @@
+/*-------------------------------------------------------------------------
+ *
+ * file_ops.c
+ * Helper functions for operating on files.
+ *
+ * Most of the functions in this file are helper functions for writing to
+ * the target data directory. The functions check the --dry-run flag, and
+ * do nothing if it's enabled. You should avoid accessing the target files
+ * directly but if you do, make sure you honor the --dry-run mode!
+ *
+ * Portions Copyright (c) 2013-2022, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "common/file_perm.h"
+#include "common/file_utils.h"
+#include "file_ops.h"
+#include "filemap.h"
+#include "pg_rewind.h"
+
+/*
+ * Currently open target file.
+ */
+static int dstfd = -1;
+static char dstpath[MAXPGPATH] = "";
+
+static void create_target_dir(const char *path);
+static void remove_target_dir(const char *path);
+static void create_target_symlink(const char *path, const char *link);
+static void remove_target_symlink(const char *path);
+
+static void recurse_dir(const char *datadir, const char *parentpath,
+ process_file_callback_t callback);
+
+/*
+ * Open a target file for writing. If 'trunc' is true and the file already
+ * exists, it will be truncated.
+ */
+void
+open_target_file(const char *path, bool trunc)
+{
+ int mode;
+
+ if (dry_run)
+ return;
+
+ if (dstfd != -1 && !trunc &&
+ strcmp(path, &dstpath[strlen(datadir_target) + 1]) == 0)
+ return; /* already open */
+
+ close_target_file();
+
+ snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
+
+ mode = O_WRONLY | O_CREAT | PG_BINARY;
+ if (trunc)
+ mode |= O_TRUNC;
+ dstfd = open(dstpath, mode, pg_file_create_mode);
+ if (dstfd < 0)
+ pg_fatal("could not open target file \"%s\": %m",
+ dstpath);
+}
+
+/*
+ * Close target file, if it's open.
+ */
+void
+close_target_file(void)
+{
+ if (dstfd == -1)
+ return;
+
+ if (close(dstfd) != 0)
+ pg_fatal("could not close target file \"%s\": %m",
+ dstpath);
+
+ dstfd = -1;
+}
+
+void
+write_target_range(char *buf, off_t begin, size_t size)
+{
+ size_t writeleft;
+ char *p;
+
+ /* update progress report */
+ fetch_done += size;
+ progress_report(false);
+
+ if (dry_run)
+ return;
+
+ if (lseek(dstfd, begin, SEEK_SET) == -1)
+ pg_fatal("could not seek in target file \"%s\": %m",
+ dstpath);
+
+ writeleft = size;
+ p = buf;
+ while (writeleft > 0)
+ {
+ ssize_t writelen;
+
+ errno = 0;
+ writelen = write(dstfd, p, writeleft);
+ if (writelen < 0)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write file \"%s\": %m",
+ dstpath);
+ }
+
+ p += writelen;
+ writeleft -= writelen;
+ }
+
+ /* keep the file open, in case we need to copy more blocks in it */
+}
+
+
+void
+remove_target(file_entry_t *entry)
+{
+ Assert(entry->action == FILE_ACTION_REMOVE);
+ Assert(entry->target_exists);
+
+ switch (entry->target_type)
+ {
+ case FILE_TYPE_DIRECTORY:
+ remove_target_dir(entry->path);
+ break;
+
+ case FILE_TYPE_REGULAR:
+ remove_target_file(entry->path, false);
+ break;
+
+ case FILE_TYPE_SYMLINK:
+ remove_target_symlink(entry->path);
+ break;
+
+ case FILE_TYPE_UNDEFINED:
+ pg_fatal("undefined file type for \"%s\"", entry->path);
+ break;
+ }
+}
+
+void
+create_target(file_entry_t *entry)
+{
+ Assert(entry->action == FILE_ACTION_CREATE);
+ Assert(!entry->target_exists);
+
+ switch (entry->source_type)
+ {
+ case FILE_TYPE_DIRECTORY:
+ create_target_dir(entry->path);
+ break;
+
+ case FILE_TYPE_SYMLINK:
+ create_target_symlink(entry->path, entry->source_link_target);
+ break;
+
+ case FILE_TYPE_REGULAR:
+ /* can't happen. Regular files are created with open_target_file. */
+ pg_fatal("invalid action (CREATE) for regular file");
+ break;
+
+ case FILE_TYPE_UNDEFINED:
+ pg_fatal("undefined file type for \"%s\"", entry->path);
+ break;
+ }
+}
+
+/*
+ * Remove a file from target data directory. If missing_ok is true, it
+ * is fine for the target file to not exist.
+ */
+void
+remove_target_file(const char *path, bool missing_ok)
+{
+ char dstpath[MAXPGPATH];
+
+ if (dry_run)
+ return;
+
+ snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
+ if (unlink(dstpath) != 0)
+ {
+ if (errno == ENOENT && missing_ok)
+ return;
+
+ pg_fatal("could not remove file \"%s\": %m",
+ dstpath);
+ }
+}
+
+void
+truncate_target_file(const char *path, off_t newsize)
+{
+ char dstpath[MAXPGPATH];
+ int fd;
+
+ if (dry_run)
+ return;
+
+ snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
+
+ fd = open(dstpath, O_WRONLY, pg_file_create_mode);
+ if (fd < 0)
+ pg_fatal("could not open file \"%s\" for truncation: %m",
+ dstpath);
+
+ if (ftruncate(fd, newsize) != 0)
+ pg_fatal("could not truncate file \"%s\" to %u: %m",
+ dstpath, (unsigned int) newsize);
+
+ close(fd);
+}
+
+static void
+create_target_dir(const char *path)
+{
+ char dstpath[MAXPGPATH];
+
+ if (dry_run)
+ return;
+
+ snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
+ if (mkdir(dstpath, pg_dir_create_mode) != 0)
+ pg_fatal("could not create directory \"%s\": %m",
+ dstpath);
+}
+
+static void
+remove_target_dir(const char *path)
+{
+ char dstpath[MAXPGPATH];
+
+ if (dry_run)
+ return;
+
+ snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
+ if (rmdir(dstpath) != 0)
+ pg_fatal("could not remove directory \"%s\": %m",
+ dstpath);
+}
+
+static void
+create_target_symlink(const char *path, const char *link)
+{
+ char dstpath[MAXPGPATH];
+
+ if (dry_run)
+ return;
+
+ snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
+ if (symlink(link, dstpath) != 0)
+ pg_fatal("could not create symbolic link at \"%s\": %m",
+ dstpath);
+}
+
+static void
+remove_target_symlink(const char *path)
+{
+ char dstpath[MAXPGPATH];
+
+ if (dry_run)
+ return;
+
+ snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
+ if (unlink(dstpath) != 0)
+ pg_fatal("could not remove symbolic link \"%s\": %m",
+ dstpath);
+}
+
+/*
+ * Sync target data directory to ensure that modifications are safely on disk.
+ *
+ * We do this once, for the whole data directory, for performance reasons. At
+ * the end of pg_rewind's run, the kernel is likely to already have flushed
+ * most dirty buffers to disk. Additionally fsync_pgdata uses a two-pass
+ * approach (only initiating writeback in the first pass), which often reduces
+ * the overall amount of IO noticeably.
+ */
+void
+sync_target_dir(void)
+{
+ if (!do_sync || dry_run)
+ return;
+
+ fsync_pgdata(datadir_target, PG_VERSION_NUM);
+}
+
+
+/*
+ * Read a file into memory. The file to be read is <datadir>/<path>.
+ * The file contents are returned in a malloc'd buffer, and *filesize
+ * is set to the length of the file.
+ *
+ * The returned buffer is always zero-terminated; the size of the returned
+ * buffer is actually *filesize + 1. That's handy when reading a text file.
+ * This function can be used to read binary files as well, you can just
+ * ignore the zero-terminator in that case.
+ */
+char *
+slurpFile(const char *datadir, const char *path, size_t *filesize)
+{
+ int fd;
+ char *buffer;
+ struct stat statbuf;
+ char fullpath[MAXPGPATH];
+ int len;
+ int r;
+
+ snprintf(fullpath, sizeof(fullpath), "%s/%s", datadir, path);
+
+ if ((fd = open(fullpath, O_RDONLY | PG_BINARY, 0)) == -1)
+ pg_fatal("could not open file \"%s\" for reading: %m",
+ fullpath);
+
+ if (fstat(fd, &statbuf) < 0)
+ pg_fatal("could not open file \"%s\" for reading: %m",
+ fullpath);
+
+ len = statbuf.st_size;
+
+ buffer = pg_malloc(len + 1);
+
+ r = read(fd, buffer, len);
+ if (r != len)
+ {
+ if (r < 0)
+ pg_fatal("could not read file \"%s\": %m",
+ fullpath);
+ else
+ pg_fatal("could not read file \"%s\": read %d of %zu",
+ fullpath, r, (Size) len);
+ }
+ close(fd);
+
+ /* Zero-terminate the buffer. */
+ buffer[len] = '\0';
+
+ if (filesize)
+ *filesize = len;
+ return buffer;
+}
+
+/*
+ * Traverse through all files in a data directory, calling 'callback'
+ * for each file.
+ */
+void
+traverse_datadir(const char *datadir, process_file_callback_t callback)
+{
+ recurse_dir(datadir, NULL, callback);
+}
+
+/*
+ * recursive part of traverse_datadir
+ *
+ * parentpath is the current subdirectory's path relative to datadir,
+ * or NULL at the top level.
+ */
+static void
+recurse_dir(const char *datadir, const char *parentpath,
+ process_file_callback_t callback)
+{
+ DIR *xldir;
+ struct dirent *xlde;
+ char fullparentpath[MAXPGPATH];
+
+ if (parentpath)
+ snprintf(fullparentpath, MAXPGPATH, "%s/%s", datadir, parentpath);
+ else
+ snprintf(fullparentpath, MAXPGPATH, "%s", datadir);
+
+ xldir = opendir(fullparentpath);
+ if (xldir == NULL)
+ pg_fatal("could not open directory \"%s\": %m",
+ fullparentpath);
+
+ while (errno = 0, (xlde = readdir(xldir)) != NULL)
+ {
+ struct stat fst;
+ char fullpath[MAXPGPATH * 2];
+ char path[MAXPGPATH * 2];
+
+ if (strcmp(xlde->d_name, ".") == 0 ||
+ strcmp(xlde->d_name, "..") == 0)
+ continue;
+
+ snprintf(fullpath, sizeof(fullpath), "%s/%s", fullparentpath, xlde->d_name);
+
+ if (lstat(fullpath, &fst) < 0)
+ {
+ if (errno == ENOENT)
+ {
+ /*
+ * File doesn't exist anymore. This is ok, if the new primary
+ * is running and the file was just removed. If it was a data
+ * file, there should be a WAL record of the removal. If it
+ * was something else, it couldn't have been anyway.
+ *
+ * TODO: But complain if we're processing the target dir!
+ */
+ }
+ else
+ pg_fatal("could not stat file \"%s\": %m",
+ fullpath);
+ }
+
+ if (parentpath)
+ snprintf(path, sizeof(path), "%s/%s", parentpath, xlde->d_name);
+ else
+ snprintf(path, sizeof(path), "%s", xlde->d_name);
+
+ if (S_ISREG(fst.st_mode))
+ callback(path, FILE_TYPE_REGULAR, fst.st_size, NULL);
+ else if (S_ISDIR(fst.st_mode))
+ {
+ callback(path, FILE_TYPE_DIRECTORY, 0, NULL);
+ /* recurse to handle subdirectories */
+ recurse_dir(datadir, path, callback);
+ }
+#ifndef WIN32
+ else if (S_ISLNK(fst.st_mode))
+#else
+ else if (pgwin32_is_junction(fullpath))
+#endif
+ {
+#if defined(HAVE_READLINK) || defined(WIN32)
+ char link_target[MAXPGPATH];
+ int len;
+
+ len = readlink(fullpath, link_target, sizeof(link_target));
+ if (len < 0)
+ pg_fatal("could not read symbolic link \"%s\": %m",
+ fullpath);
+ if (len >= sizeof(link_target))
+ pg_fatal("symbolic link \"%s\" target is too long",
+ fullpath);
+ link_target[len] = '\0';
+
+ callback(path, FILE_TYPE_SYMLINK, 0, link_target);
+
+ /*
+ * If it's a symlink within pg_tblspc, we need to recurse into it,
+ * to process all the tablespaces. We also follow a symlink if
+ * it's for pg_wal. Symlinks elsewhere are ignored.
+ */
+ if ((parentpath && strcmp(parentpath, "pg_tblspc") == 0) ||
+ strcmp(path, "pg_wal") == 0)
+ recurse_dir(datadir, path, callback);
+#else
+ pg_fatal("\"%s\" is a symbolic link, but symbolic links are not supported on this platform",
+ fullpath);
+#endif /* HAVE_READLINK */
+ }
+ }
+
+ if (errno)
+ pg_fatal("could not read directory \"%s\": %m",
+ fullparentpath);
+
+ if (closedir(xldir))
+ pg_fatal("could not close directory \"%s\": %m",
+ fullparentpath);
+}
diff --git a/src/bin/pg_rewind/file_ops.h b/src/bin/pg_rewind/file_ops.h
new file mode 100644
index 0000000..54a853b
--- /dev/null
+++ b/src/bin/pg_rewind/file_ops.h
@@ -0,0 +1,29 @@
+/*-------------------------------------------------------------------------
+ *
+ * file_ops.h
+ * Helper functions for operating on files
+ *
+ * Copyright (c) 2013-2022, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef FILE_OPS_H
+#define FILE_OPS_H
+
+#include "filemap.h"
+
+extern void open_target_file(const char *path, bool trunc);
+extern void write_target_range(char *buf, off_t begin, size_t size);
+extern void close_target_file(void);
+extern void remove_target_file(const char *path, bool missing_ok);
+extern void truncate_target_file(const char *path, off_t newsize);
+extern void create_target(file_entry_t *t);
+extern void remove_target(file_entry_t *t);
+extern void sync_target_dir(void);
+
+extern char *slurpFile(const char *datadir, const char *path, size_t *filesize);
+
+typedef void (*process_file_callback_t) (const char *path, file_type_t type, size_t size, const char *link_target);
+extern void traverse_datadir(const char *datadir, process_file_callback_t callback);
+
+#endif /* FILE_OPS_H */
diff --git a/src/bin/pg_rewind/filemap.c b/src/bin/pg_rewind/filemap.c
new file mode 100644
index 0000000..6252931
--- /dev/null
+++ b/src/bin/pg_rewind/filemap.c
@@ -0,0 +1,831 @@
+/*-------------------------------------------------------------------------
+ *
+ * filemap.c
+ * A data structure for keeping track of files that have changed.
+ *
+ * This source file contains the logic to decide what to do with different
+ * kinds of files, and the data structure to support it. Before modifying
+ * anything, pg_rewind collects information about all the files and their
+ * attributes in the target and source data directories. It also scans the
+ * WAL log in the target, and collects information about data blocks that
+ * were changed. All this information is stored in a hash table, using the
+ * file path relative to the root of the data directory as the key.
+ *
+ * After collecting all the information required, the decide_file_actions()
+ * function scans the hash table and decides what action needs to be taken
+ * for each file. Finally, it sorts the array to the final order that the
+ * actions should be executed in.
+ *
+ * Copyright (c) 2013-2022, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "catalog/pg_tablespace_d.h"
+#include "common/hashfn.h"
+#include "common/string.h"
+#include "datapagemap.h"
+#include "filemap.h"
+#include "pg_rewind.h"
+#include "storage/fd.h"
+
+/*
+ * Define a hash table which we can use to store information about the files
+ * appearing in source and target systems.
+ */
+static uint32 hash_string_pointer(const char *s);
+#define SH_PREFIX filehash
+#define SH_ELEMENT_TYPE file_entry_t
+#define SH_KEY_TYPE const char *
+#define SH_KEY path
+#define SH_HASH_KEY(tb, key) hash_string_pointer(key)
+#define SH_EQUAL(tb, a, b) (strcmp(a, b) == 0)
+#define SH_SCOPE static inline
+#define SH_RAW_ALLOCATOR pg_malloc0
+#define SH_DECLARE
+#define SH_DEFINE
+#include "lib/simplehash.h"
+
+#define FILEHASH_INITIAL_SIZE 1000
+
+static filehash_hash *filehash;
+
+static bool isRelDataFile(const char *path);
+static char *datasegpath(RelFileNode rnode, ForkNumber forknum,
+ BlockNumber segno);
+
+static file_entry_t *insert_filehash_entry(const char *path);
+static file_entry_t *lookup_filehash_entry(const char *path);
+static int final_filemap_cmp(const void *a, const void *b);
+static bool check_file_excluded(const char *path, bool is_source);
+
+/*
+ * Definition of one element part of an exclusion list, used to exclude
+ * contents when rewinding. "name" is the name of the file or path to
+ * check for exclusion. If "match_prefix" is true, any items matching
+ * the name as prefix are excluded.
+ */
+struct exclude_list_item
+{
+ const char *name;
+ bool match_prefix;
+};
+
+/*
+ * The contents of these directories are removed or recreated during server
+ * start so they are not included in data processed by pg_rewind.
+ *
+ * Note: those lists should be kept in sync with what basebackup.c provides.
+ * Some of the values, contrary to what basebackup.c uses, are hardcoded as
+ * they are defined in backend-only headers. So this list is maintained
+ * with a best effort in mind.
+ */
+static const char *excludeDirContents[] =
+{
+ /*
+ * Skip temporary statistics files. PG_STAT_TMP_DIR must be skipped
+ * because extensions like pg_stat_statements store data there.
+ */
+ "pg_stat_tmp", /* defined as PG_STAT_TMP_DIR */
+
+ /*
+ * It is generally not useful to backup the contents of this directory
+ * even if the intention is to restore to another primary. See backup.sgml
+ * for a more detailed description.
+ */
+ "pg_replslot",
+
+ /* Contents removed on startup, see dsm_cleanup_for_mmap(). */
+ "pg_dynshmem", /* defined as PG_DYNSHMEM_DIR */
+
+ /* Contents removed on startup, see AsyncShmemInit(). */
+ "pg_notify",
+
+ /*
+ * Old contents are loaded for possible debugging but are not required for
+ * normal operation, see SerialInit().
+ */
+ "pg_serial",
+
+ /* Contents removed on startup, see DeleteAllExportedSnapshotFiles(). */
+ "pg_snapshots",
+
+ /* Contents zeroed on startup, see StartupSUBTRANS(). */
+ "pg_subtrans",
+
+ /* end of list */
+ NULL
+};
+
+/*
+ * List of files excluded from filemap processing. Files are excluded
+ * if their prefix match.
+ */
+static const struct exclude_list_item excludeFiles[] =
+{
+ /* Skip auto conf temporary file. */
+ {"postgresql.auto.conf.tmp", false}, /* defined as PG_AUTOCONF_FILENAME */
+
+ /* Skip current log file temporary file */
+ {"current_logfiles.tmp", false}, /* defined as
+ * LOG_METAINFO_DATAFILE_TMP */
+
+ /* Skip relation cache because it is rebuilt on startup */
+ {"pg_internal.init", true}, /* defined as RELCACHE_INIT_FILENAME */
+
+ /*
+ * If there is a backup_label or tablespace_map file, it indicates that a
+ * recovery failed and this cluster probably can't be rewound, but exclude
+ * them anyway if they are found.
+ */
+ {"backup_label", false}, /* defined as BACKUP_LABEL_FILE */
+ {"tablespace_map", false}, /* defined as TABLESPACE_MAP */
+
+ /*
+ * If there's a backup_manifest, it belongs to a backup that was used to
+ * start this server. It is *not* correct for this backup. Our
+ * backup_manifest is injected into the backup separately if users want
+ * it.
+ */
+ {"backup_manifest", false},
+
+ {"postmaster.pid", false},
+ {"postmaster.opts", false},
+
+ /* end of list */
+ {NULL, false}
+};
+
+/*
+ * Initialize the hash table for the file map.
+ */
+void
+filehash_init(void)
+{
+ filehash = filehash_create(FILEHASH_INITIAL_SIZE, NULL);
+}
+
+/* Look up entry for 'path', creating a new one if it doesn't exist */
+static file_entry_t *
+insert_filehash_entry(const char *path)
+{
+ file_entry_t *entry;
+ bool found;
+
+ entry = filehash_insert(filehash, path, &found);
+ if (!found)
+ {
+ entry->path = pg_strdup(path);
+ entry->isrelfile = isRelDataFile(path);
+
+ entry->target_exists = false;
+ entry->target_type = FILE_TYPE_UNDEFINED;
+ entry->target_size = 0;
+ entry->target_link_target = NULL;
+ entry->target_pages_to_overwrite.bitmap = NULL;
+ entry->target_pages_to_overwrite.bitmapsize = 0;
+
+ entry->source_exists = false;
+ entry->source_type = FILE_TYPE_UNDEFINED;
+ entry->source_size = 0;
+ entry->source_link_target = NULL;
+
+ entry->action = FILE_ACTION_UNDECIDED;
+ }
+
+ return entry;
+}
+
+static file_entry_t *
+lookup_filehash_entry(const char *path)
+{
+ return filehash_lookup(filehash, path);
+}
+
+/*
+ * Callback for processing source file list.
+ *
+ * This is called once for every file in the source server. We record the
+ * type and size of the file, so that decide_file_action() can later decide what
+ * to do with it.
+ */
+void
+process_source_file(const char *path, file_type_t type, size_t size,
+ const char *link_target)
+{
+ file_entry_t *entry;
+
+ /*
+ * Pretend that pg_wal is a directory, even if it's really a symlink. We
+ * don't want to mess with the symlink itself, nor complain if it's a
+ * symlink in source but not in target or vice versa.
+ */
+ if (strcmp(path, "pg_wal") == 0 && type == FILE_TYPE_SYMLINK)
+ type = FILE_TYPE_DIRECTORY;
+
+ /*
+ * sanity check: a filename that looks like a data file better be a
+ * regular file
+ */
+ if (type != FILE_TYPE_REGULAR && isRelDataFile(path))
+ pg_fatal("data file \"%s\" in source is not a regular file", path);
+
+ /* Remember this source file */
+ entry = insert_filehash_entry(path);
+ if (entry->source_exists)
+ pg_fatal("duplicate source file \"%s\"", path);
+ entry->source_exists = true;
+ entry->source_type = type;
+ entry->source_size = size;
+ entry->source_link_target = link_target ? pg_strdup(link_target) : NULL;
+}
+
+/*
+ * Callback for processing target file list.
+ *
+ * Record the type and size of the file, like process_source_file() does.
+ */
+void
+process_target_file(const char *path, file_type_t type, size_t size,
+ const char *link_target)
+{
+ file_entry_t *entry;
+
+ /*
+ * Do not apply any exclusion filters here. This has advantage to remove
+ * from the target data folder all paths which have been filtered out from
+ * the source data folder when processing the source files.
+ */
+
+ /*
+ * Like in process_source_file, pretend that pg_wal is always a directory.
+ */
+ if (strcmp(path, "pg_wal") == 0 && type == FILE_TYPE_SYMLINK)
+ type = FILE_TYPE_DIRECTORY;
+
+ /* Remember this target file */
+ entry = insert_filehash_entry(path);
+ if (entry->target_exists)
+ pg_fatal("duplicate source file \"%s\"", path);
+ entry->target_exists = true;
+ entry->target_type = type;
+ entry->target_size = size;
+ entry->target_link_target = link_target ? pg_strdup(link_target) : NULL;
+}
+
+/*
+ * This callback gets called while we read the WAL in the target, for every
+ * block that has changed in the target system. It decides if the given
+ * 'blkno' in the target relfile needs to be overwritten from the source, and
+ * if so, records it in 'target_pages_to_overwrite' bitmap.
+ *
+ * NOTE: All the files on both systems must have already been added to the
+ * hash table!
+ */
+void
+process_target_wal_block_change(ForkNumber forknum, RelFileNode rnode,
+ BlockNumber blkno)
+{
+ char *path;
+ file_entry_t *entry;
+ BlockNumber blkno_inseg;
+ int segno;
+
+ segno = blkno / RELSEG_SIZE;
+ blkno_inseg = blkno % RELSEG_SIZE;
+
+ path = datasegpath(rnode, forknum, segno);
+ entry = lookup_filehash_entry(path);
+ pfree(path);
+
+ /*
+ * If the block still exists in both systems, remember it. Otherwise we
+ * can safely ignore it.
+ *
+ * If the block is beyond the EOF in the source system, or the file
+ * doesn't exist in the source at all, we're going to truncate/remove it
+ * away from the target anyway. Likewise, if it doesn't exist in the
+ * target anymore, we will copy it over with the "tail" from the source
+ * system, anyway.
+ *
+ * It is possible to find WAL for a file that doesn't exist on either
+ * system anymore. It means that the relation was dropped later in the
+ * target system, and independently on the source system too, or that it
+ * was created and dropped in the target system and it never existed in
+ * the source. Either way, we can safely ignore it.
+ */
+ if (entry)
+ {
+ Assert(entry->isrelfile);
+
+ if (entry->target_exists)
+ {
+ if (entry->target_type != FILE_TYPE_REGULAR)
+ pg_fatal("unexpected page modification for non-regular file \"%s\"",
+ entry->path);
+
+ if (entry->source_exists)
+ {
+ off_t end_offset;
+
+ end_offset = (blkno_inseg + 1) * BLCKSZ;
+ if (end_offset <= entry->source_size && end_offset <= entry->target_size)
+ datapagemap_add(&entry->target_pages_to_overwrite, blkno_inseg);
+ }
+ }
+ }
+}
+
+/*
+ * Is this the path of file that pg_rewind can skip copying?
+ */
+static bool
+check_file_excluded(const char *path, bool is_source)
+{
+ char localpath[MAXPGPATH];
+ int excludeIdx;
+ const char *filename;
+
+ /*
+ * Skip all temporary files, .../pgsql_tmp/... and .../pgsql_tmp.*
+ */
+ if (strstr(path, "/" PG_TEMP_FILE_PREFIX) != NULL ||
+ strstr(path, "/" PG_TEMP_FILES_DIR "/") != NULL)
+ {
+ return true;
+ }
+
+ /* check individual files... */
+ for (excludeIdx = 0; excludeFiles[excludeIdx].name != NULL; excludeIdx++)
+ {
+ int cmplen = strlen(excludeFiles[excludeIdx].name);
+
+ filename = last_dir_separator(path);
+ if (filename == NULL)
+ filename = path;
+ else
+ filename++;
+
+ if (!excludeFiles[excludeIdx].match_prefix)
+ cmplen++;
+ if (strncmp(filename, excludeFiles[excludeIdx].name, cmplen) == 0)
+ {
+ if (is_source)
+ pg_log_debug("entry \"%s\" excluded from source file list",
+ path);
+ else
+ pg_log_debug("entry \"%s\" excluded from target file list",
+ path);
+ return true;
+ }
+ }
+
+ /*
+ * ... And check some directories. Note that this includes any contents
+ * within the directories themselves.
+ */
+ for (excludeIdx = 0; excludeDirContents[excludeIdx] != NULL; excludeIdx++)
+ {
+ snprintf(localpath, sizeof(localpath), "%s/",
+ excludeDirContents[excludeIdx]);
+ if (strstr(path, localpath) == path)
+ {
+ if (is_source)
+ pg_log_debug("entry \"%s\" excluded from source file list",
+ path);
+ else
+ pg_log_debug("entry \"%s\" excluded from target file list",
+ path);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+static const char *
+action_to_str(file_action_t action)
+{
+ switch (action)
+ {
+ case FILE_ACTION_NONE:
+ return "NONE";
+ case FILE_ACTION_COPY:
+ return "COPY";
+ case FILE_ACTION_TRUNCATE:
+ return "TRUNCATE";
+ case FILE_ACTION_COPY_TAIL:
+ return "COPY_TAIL";
+ case FILE_ACTION_CREATE:
+ return "CREATE";
+ case FILE_ACTION_REMOVE:
+ return "REMOVE";
+
+ default:
+ return "unknown";
+ }
+}
+
+/*
+ * Calculate the totals needed for progress reports.
+ */
+void
+calculate_totals(filemap_t *filemap)
+{
+ file_entry_t *entry;
+ int i;
+
+ filemap->total_size = 0;
+ filemap->fetch_size = 0;
+
+ for (i = 0; i < filemap->nentries; i++)
+ {
+ entry = filemap->entries[i];
+
+ if (entry->source_type != FILE_TYPE_REGULAR)
+ continue;
+
+ filemap->total_size += entry->source_size;
+
+ if (entry->action == FILE_ACTION_COPY)
+ {
+ filemap->fetch_size += entry->source_size;
+ continue;
+ }
+
+ if (entry->action == FILE_ACTION_COPY_TAIL)
+ filemap->fetch_size += (entry->source_size - entry->target_size);
+
+ if (entry->target_pages_to_overwrite.bitmapsize > 0)
+ {
+ datapagemap_iterator_t *iter;
+ BlockNumber blk;
+
+ iter = datapagemap_iterate(&entry->target_pages_to_overwrite);
+ while (datapagemap_next(iter, &blk))
+ filemap->fetch_size += BLCKSZ;
+
+ pg_free(iter);
+ }
+ }
+}
+
+void
+print_filemap(filemap_t *filemap)
+{
+ file_entry_t *entry;
+ int i;
+
+ for (i = 0; i < filemap->nentries; i++)
+ {
+ entry = filemap->entries[i];
+ if (entry->action != FILE_ACTION_NONE ||
+ entry->target_pages_to_overwrite.bitmapsize > 0)
+ {
+ pg_log_debug("%s (%s)", entry->path,
+ action_to_str(entry->action));
+
+ if (entry->target_pages_to_overwrite.bitmapsize > 0)
+ datapagemap_print(&entry->target_pages_to_overwrite);
+ }
+ }
+ fflush(stdout);
+}
+
+/*
+ * Does it look like a relation data file?
+ *
+ * For our purposes, only files belonging to the main fork are considered
+ * relation files. Other forks are always copied in toto, because we cannot
+ * reliably track changes to them, because WAL only contains block references
+ * for the main fork.
+ */
+static bool
+isRelDataFile(const char *path)
+{
+ RelFileNode rnode;
+ unsigned int segNo;
+ int nmatch;
+ bool matched;
+
+ /*----
+ * Relation data files can be in one of the following directories:
+ *
+ * global/
+ * shared relations
+ *
+ * base/<db oid>/
+ * regular relations, default tablespace
+ *
+ * pg_tblspc/<tblspc oid>/<tblspc version>/
+ * within a non-default tablespace (the name of the directory
+ * depends on version)
+ *
+ * And the relation data files themselves have a filename like:
+ *
+ * <oid>.<segment number>
+ *
+ *----
+ */
+ rnode.spcNode = InvalidOid;
+ rnode.dbNode = InvalidOid;
+ rnode.relNode = InvalidOid;
+ segNo = 0;
+ matched = false;
+
+ nmatch = sscanf(path, "global/%u.%u", &rnode.relNode, &segNo);
+ if (nmatch == 1 || nmatch == 2)
+ {
+ rnode.spcNode = GLOBALTABLESPACE_OID;
+ rnode.dbNode = 0;
+ matched = true;
+ }
+ else
+ {
+ nmatch = sscanf(path, "base/%u/%u.%u",
+ &rnode.dbNode, &rnode.relNode, &segNo);
+ if (nmatch == 2 || nmatch == 3)
+ {
+ rnode.spcNode = DEFAULTTABLESPACE_OID;
+ matched = true;
+ }
+ else
+ {
+ nmatch = sscanf(path, "pg_tblspc/%u/" TABLESPACE_VERSION_DIRECTORY "/%u/%u.%u",
+ &rnode.spcNode, &rnode.dbNode, &rnode.relNode,
+ &segNo);
+ if (nmatch == 3 || nmatch == 4)
+ matched = true;
+ }
+ }
+
+ /*
+ * The sscanf tests above can match files that have extra characters at
+ * the end. To eliminate such cases, cross-check that GetRelationPath
+ * creates the exact same filename, when passed the RelFileNode
+ * information we extracted from the filename.
+ */
+ if (matched)
+ {
+ char *check_path = datasegpath(rnode, MAIN_FORKNUM, segNo);
+
+ if (strcmp(check_path, path) != 0)
+ matched = false;
+
+ pfree(check_path);
+ }
+
+ return matched;
+}
+
+/*
+ * A helper function to create the path of a relation file and segment.
+ *
+ * The returned path is palloc'd
+ */
+static char *
+datasegpath(RelFileNode rnode, ForkNumber forknum, BlockNumber segno)
+{
+ char *path;
+ char *segpath;
+
+ path = relpathperm(rnode, forknum);
+ if (segno > 0)
+ {
+ segpath = psprintf("%s.%u", path, segno);
+ pfree(path);
+ return segpath;
+ }
+ else
+ return path;
+}
+
+/*
+ * In the final stage, the filemap is sorted so that removals come last.
+ * From disk space usage point of view, it would be better to do removals
+ * first, but for now, safety first. If a whole directory is deleted, all
+ * files and subdirectories inside it need to removed first. On creation,
+ * parent directory needs to be created before files and directories inside
+ * it. To achieve that, the file_action_t enum is ordered so that we can
+ * just sort on that first. Furthermore, sort REMOVE entries in reverse
+ * path order, so that "foo/bar" subdirectory is removed before "foo".
+ */
+static int
+final_filemap_cmp(const void *a, const void *b)
+{
+ file_entry_t *fa = *((file_entry_t **) a);
+ file_entry_t *fb = *((file_entry_t **) b);
+
+ if (fa->action > fb->action)
+ return 1;
+ if (fa->action < fb->action)
+ return -1;
+
+ if (fa->action == FILE_ACTION_REMOVE)
+ return strcmp(fb->path, fa->path);
+ else
+ return strcmp(fa->path, fb->path);
+}
+
+/*
+ * Decide what action to perform to a file.
+ */
+static file_action_t
+decide_file_action(file_entry_t *entry)
+{
+ const char *path = entry->path;
+
+ /*
+ * Don't touch the control file. It is handled specially, after copying
+ * all the other files.
+ */
+ if (strcmp(path, "global/pg_control") == 0)
+ return FILE_ACTION_NONE;
+
+ /*
+ * Remove all files matching the exclusion filters in the target.
+ */
+ if (check_file_excluded(path, true))
+ {
+ if (entry->target_exists)
+ return FILE_ACTION_REMOVE;
+ else
+ return FILE_ACTION_NONE;
+ }
+
+ /*
+ * Handle cases where the file is missing from one of the systems.
+ */
+ if (!entry->target_exists && entry->source_exists)
+ {
+ /*
+ * File exists in source, but not in target. Copy it in toto. (If it's
+ * a relation data file, WAL replay after rewinding should re-create
+ * it anyway. But there's no harm in copying it now.)
+ */
+ switch (entry->source_type)
+ {
+ case FILE_TYPE_DIRECTORY:
+ case FILE_TYPE_SYMLINK:
+ return FILE_ACTION_CREATE;
+ case FILE_TYPE_REGULAR:
+ return FILE_ACTION_COPY;
+ case FILE_TYPE_UNDEFINED:
+ pg_fatal("unknown file type for \"%s\"", entry->path);
+ break;
+ }
+ }
+ else if (entry->target_exists && !entry->source_exists)
+ {
+ /* File exists in target, but not source. Remove it. */
+ return FILE_ACTION_REMOVE;
+ }
+ else if (!entry->target_exists && !entry->source_exists)
+ {
+ /*
+ * Doesn't exist in either server. Why does it have an entry in the
+ * first place??
+ */
+ Assert(false);
+ return FILE_ACTION_NONE;
+ }
+
+ /*
+ * Otherwise, the file exists on both systems
+ */
+ Assert(entry->target_exists && entry->source_exists);
+
+ if (entry->source_type != entry->target_type)
+ {
+ /* But it's a different kind of object. Strange.. */
+ pg_fatal("file \"%s\" is of different type in source and target", entry->path);
+ }
+
+ /*
+ * PG_VERSION files should be identical on both systems, but avoid
+ * overwriting them for paranoia.
+ */
+ if (pg_str_endswith(entry->path, "PG_VERSION"))
+ return FILE_ACTION_NONE;
+
+ switch (entry->source_type)
+ {
+ case FILE_TYPE_DIRECTORY:
+ return FILE_ACTION_NONE;
+
+ case FILE_TYPE_SYMLINK:
+
+ /*
+ * XXX: Should we check if it points to the same target?
+ */
+ return FILE_ACTION_NONE;
+
+ case FILE_TYPE_REGULAR:
+ if (!entry->isrelfile)
+ {
+ /*
+ * It's a non-data file that we have no special processing
+ * for. Copy it in toto.
+ */
+ return FILE_ACTION_COPY;
+ }
+ else
+ {
+ /*
+ * It's a data file that exists in both systems.
+ *
+ * If it's larger in target, we can truncate it. There will
+ * also be a WAL record of the truncation in the source
+ * system, so WAL replay would eventually truncate the target
+ * too, but we might as well do it now.
+ *
+ * If it's smaller in the target, it means that it has been
+ * truncated in the target, or enlarged in the source, or
+ * both. If it was truncated in the target, we need to copy
+ * the missing tail from the source system. If it was enlarged
+ * in the source system, there will be WAL records in the
+ * source system for the new blocks, so we wouldn't need to
+ * copy them here. But we don't know which scenario we're
+ * dealing with, and there's no harm in copying the missing
+ * blocks now, so do it now.
+ *
+ * If it's the same size, do nothing here. Any blocks modified
+ * in the target will be copied based on parsing the target
+ * system's WAL, and any blocks modified in the source will be
+ * updated after rewinding, when the source system's WAL is
+ * replayed.
+ */
+ if (entry->target_size < entry->source_size)
+ return FILE_ACTION_COPY_TAIL;
+ else if (entry->target_size > entry->source_size)
+ return FILE_ACTION_TRUNCATE;
+ else
+ return FILE_ACTION_NONE;
+ }
+ break;
+
+ case FILE_TYPE_UNDEFINED:
+ pg_fatal("unknown file type for \"%s\"", path);
+ break;
+ }
+
+ /* unreachable */
+ pg_fatal("could not decide what to do with file \"%s\"", path);
+}
+
+/*
+ * Decide what to do with each file.
+ *
+ * Returns a 'filemap' with the entries in the order that their actions
+ * should be executed.
+ */
+filemap_t *
+decide_file_actions(void)
+{
+ int i;
+ filehash_iterator it;
+ file_entry_t *entry;
+ filemap_t *filemap;
+
+ filehash_start_iterate(filehash, &it);
+ while ((entry = filehash_iterate(filehash, &it)) != NULL)
+ {
+ entry->action = decide_file_action(entry);
+ }
+
+ /*
+ * Turn the hash table into an array, and sort in the order that the
+ * actions should be performed.
+ */
+ filemap = pg_malloc(offsetof(filemap_t, entries) +
+ filehash->members * sizeof(file_entry_t *));
+ filemap->nentries = filehash->members;
+ filehash_start_iterate(filehash, &it);
+ i = 0;
+ while ((entry = filehash_iterate(filehash, &it)) != NULL)
+ {
+ filemap->entries[i++] = entry;
+ }
+
+ qsort(&filemap->entries, filemap->nentries, sizeof(file_entry_t *),
+ final_filemap_cmp);
+
+ return filemap;
+}
+
+
+/*
+ * Helper function for filemap hash table.
+ */
+static uint32
+hash_string_pointer(const char *s)
+{
+ unsigned char *ss = (unsigned char *) s;
+
+ return hash_bytes(ss, strlen(s));
+}
diff --git a/src/bin/pg_rewind/filemap.h b/src/bin/pg_rewind/filemap.h
new file mode 100644
index 0000000..096f57a
--- /dev/null
+++ b/src/bin/pg_rewind/filemap.h
@@ -0,0 +1,113 @@
+/*-------------------------------------------------------------------------
+ *
+ * filemap.h
+ *
+ * Copyright (c) 2013-2022, PostgreSQL Global Development Group
+ *-------------------------------------------------------------------------
+ */
+#ifndef FILEMAP_H
+#define FILEMAP_H
+
+#include "datapagemap.h"
+#include "storage/block.h"
+#include "storage/relfilenode.h"
+
+/* these enum values are sorted in the order we want actions to be processed */
+typedef enum
+{
+ FILE_ACTION_UNDECIDED = 0, /* not decided yet */
+
+ FILE_ACTION_CREATE, /* create local directory or symbolic link */
+ FILE_ACTION_COPY, /* copy whole file, overwriting if exists */
+ FILE_ACTION_COPY_TAIL, /* copy tail from 'source_size' to
+ * 'target_size' */
+ FILE_ACTION_NONE, /* no action (we might still copy modified
+ * blocks based on the parsed WAL) */
+ FILE_ACTION_TRUNCATE, /* truncate local file to 'newsize' bytes */
+ FILE_ACTION_REMOVE /* remove local file / directory / symlink */
+} file_action_t;
+
+typedef enum
+{
+ FILE_TYPE_UNDEFINED = 0,
+
+ FILE_TYPE_REGULAR,
+ FILE_TYPE_DIRECTORY,
+ FILE_TYPE_SYMLINK
+} file_type_t;
+
+/*
+ * For every file found in the local or remote system, we have a file entry
+ * that contains information about the file on both systems. For relation
+ * files, there is also a page map that marks pages in the file that were
+ * changed in the target after the last common checkpoint.
+ *
+ * When gathering information, these are kept in a hash table, private to
+ * filemap.c. decide_file_actions() fills in the 'action' field, sorts all
+ * the entries, and returns them in an array, ready for executing the actions.
+ */
+typedef struct file_entry_t
+{
+ uint32 status; /* hash status */
+
+ const char *path;
+ bool isrelfile; /* is it a relation data file? */
+
+ /*
+ * Status of the file in the target.
+ */
+ bool target_exists;
+ file_type_t target_type;
+ size_t target_size; /* for a regular file */
+ char *target_link_target; /* for a symlink */
+
+ /*
+ * Pages that were modified in the target and need to be replaced from the
+ * source.
+ */
+ datapagemap_t target_pages_to_overwrite;
+
+ /*
+ * Status of the file in the source.
+ */
+ bool source_exists;
+ file_type_t source_type;
+ size_t source_size;
+ char *source_link_target; /* for a symlink */
+
+ /*
+ * What will we do to the file?
+ */
+ file_action_t action;
+} file_entry_t;
+
+/*
+ * This contains the final decisions on what to do with each file.
+ * 'entries' array contains an entry for each file, sorted in the order
+ * that their actions should executed.
+ */
+typedef struct filemap_t
+{
+ /* Summary information, filled by calculate_totals() */
+ uint64 total_size; /* total size of the source cluster */
+ uint64 fetch_size; /* number of bytes that needs to be copied */
+
+ int nentries; /* size of 'entries' array */
+ file_entry_t *entries[FLEXIBLE_ARRAY_MEMBER];
+} filemap_t;
+
+/* Functions for populating the filemap */
+extern void filehash_init(void);
+extern void process_source_file(const char *path, file_type_t type,
+ size_t size, const char *link_target);
+extern void process_target_file(const char *path, file_type_t type,
+ size_t size, const char *link_target);
+extern void process_target_wal_block_change(ForkNumber forknum,
+ RelFileNode rnode,
+ BlockNumber blkno);
+
+extern filemap_t *decide_file_actions(void);
+extern void calculate_totals(filemap_t *filemap);
+extern void print_filemap(filemap_t *filemap);
+
+#endif /* FILEMAP_H */
diff --git a/src/bin/pg_rewind/libpq_source.c b/src/bin/pg_rewind/libpq_source.c
new file mode 100644
index 0000000..011c9cc
--- /dev/null
+++ b/src/bin/pg_rewind/libpq_source.c
@@ -0,0 +1,675 @@
+/*-------------------------------------------------------------------------
+ *
+ * libpq_source.c
+ * Functions for fetching files from a remote server via libpq.
+ *
+ * Copyright (c) 2013-2022, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "catalog/pg_type_d.h"
+#include "common/connect.h"
+#include "datapagemap.h"
+#include "file_ops.h"
+#include "filemap.h"
+#include "lib/stringinfo.h"
+#include "pg_rewind.h"
+#include "port/pg_bswap.h"
+#include "rewind_source.h"
+
+/*
+ * Files are fetched MAX_CHUNK_SIZE bytes at a time, and with a
+ * maximum of MAX_CHUNKS_PER_QUERY chunks in a single query.
+ */
+#define MAX_CHUNK_SIZE (1024 * 1024)
+#define MAX_CHUNKS_PER_QUERY 1000
+
+/* represents a request to fetch a piece of a file from the source */
+typedef struct
+{
+ const char *path; /* path relative to data directory root */
+ off_t offset;
+ size_t length;
+} fetch_range_request;
+
+typedef struct
+{
+ rewind_source common; /* common interface functions */
+
+ PGconn *conn;
+
+ /*
+ * Queue of chunks that have been requested with the queue_fetch_range()
+ * function, but have not been fetched from the remote server yet.
+ */
+ int num_requests;
+ fetch_range_request request_queue[MAX_CHUNKS_PER_QUERY];
+
+ /* temporary space for process_queued_fetch_requests() */
+ StringInfoData paths;
+ StringInfoData offsets;
+ StringInfoData lengths;
+} libpq_source;
+
+static void init_libpq_conn(PGconn *conn);
+static char *run_simple_query(PGconn *conn, const char *sql);
+static void run_simple_command(PGconn *conn, const char *sql);
+static void appendArrayEscapedString(StringInfo buf, const char *str);
+
+static void process_queued_fetch_requests(libpq_source *src);
+
+/* public interface functions */
+static void libpq_traverse_files(rewind_source *source,
+ process_file_callback_t callback);
+static void libpq_queue_fetch_file(rewind_source *source, const char *path, size_t len);
+static void libpq_queue_fetch_range(rewind_source *source, const char *path,
+ off_t off, size_t len);
+static void libpq_finish_fetch(rewind_source *source);
+static char *libpq_fetch_file(rewind_source *source, const char *path,
+ size_t *filesize);
+static XLogRecPtr libpq_get_current_wal_insert_lsn(rewind_source *source);
+static void libpq_destroy(rewind_source *source);
+
+/*
+ * Create a new libpq source.
+ *
+ * The caller has already established the connection, but should not try
+ * to use it while the source is active.
+ */
+rewind_source *
+init_libpq_source(PGconn *conn)
+{
+ libpq_source *src;
+
+ init_libpq_conn(conn);
+
+ src = pg_malloc0(sizeof(libpq_source));
+
+ src->common.traverse_files = libpq_traverse_files;
+ src->common.fetch_file = libpq_fetch_file;
+ src->common.queue_fetch_file = libpq_queue_fetch_file;
+ src->common.queue_fetch_range = libpq_queue_fetch_range;
+ src->common.finish_fetch = libpq_finish_fetch;
+ src->common.get_current_wal_insert_lsn = libpq_get_current_wal_insert_lsn;
+ src->common.destroy = libpq_destroy;
+
+ src->conn = conn;
+
+ initStringInfo(&src->paths);
+ initStringInfo(&src->offsets);
+ initStringInfo(&src->lengths);
+
+ return &src->common;
+}
+
+/*
+ * Initialize a libpq connection for use.
+ */
+static void
+init_libpq_conn(PGconn *conn)
+{
+ PGresult *res;
+ char *str;
+
+ /* disable all types of timeouts */
+ run_simple_command(conn, "SET statement_timeout = 0");
+ run_simple_command(conn, "SET lock_timeout = 0");
+ run_simple_command(conn, "SET idle_in_transaction_session_timeout = 0");
+
+ /*
+ * we don't intend to do any updates, put the connection in read-only mode
+ * to keep us honest
+ */
+ run_simple_command(conn, "SET default_transaction_read_only = on");
+
+ /* secure search_path */
+ res = PQexec(conn, ALWAYS_SECURE_SEARCH_PATH_SQL);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ pg_fatal("could not clear search_path: %s",
+ PQresultErrorMessage(res));
+ PQclear(res);
+
+ /*
+ * Also check that full_page_writes is enabled. We can get torn pages if
+ * a page is modified while we read it with pg_read_binary_file(), and we
+ * rely on full page images to fix them.
+ */
+ str = run_simple_query(conn, "SHOW full_page_writes");
+ if (strcmp(str, "on") != 0)
+ pg_fatal("full_page_writes must be enabled in the source server");
+ pg_free(str);
+
+ /* Prepare a statement we'll use to fetch files */
+ res = PQprepare(conn, "fetch_chunks_stmt",
+ "SELECT path, begin,\n"
+ " pg_read_binary_file(path, begin, len, true) AS chunk\n"
+ "FROM unnest ($1::text[], $2::int8[], $3::int4[]) as x(path, begin, len)",
+ 3, NULL);
+
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ pg_fatal("could not prepare statement to fetch file contents: %s",
+ PQresultErrorMessage(res));
+ PQclear(res);
+}
+
+/*
+ * Run a query that returns a single value.
+ *
+ * The result should be pg_free'd after use.
+ */
+static char *
+run_simple_query(PGconn *conn, const char *sql)
+{
+ PGresult *res;
+ char *result;
+
+ res = PQexec(conn, sql);
+
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ pg_fatal("error running query (%s) on source server: %s",
+ sql, PQresultErrorMessage(res));
+
+ /* sanity check the result set */
+ if (PQnfields(res) != 1 || PQntuples(res) != 1 || PQgetisnull(res, 0, 0))
+ pg_fatal("unexpected result set from query");
+
+ result = pg_strdup(PQgetvalue(res, 0, 0));
+
+ PQclear(res);
+
+ return result;
+}
+
+/*
+ * Run a command.
+ *
+ * In the event of a failure, exit immediately.
+ */
+static void
+run_simple_command(PGconn *conn, const char *sql)
+{
+ PGresult *res;
+
+ res = PQexec(conn, sql);
+
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ pg_fatal("error running query (%s) in source server: %s",
+ sql, PQresultErrorMessage(res));
+
+ PQclear(res);
+}
+
+/*
+ * Call the pg_current_wal_insert_lsn() function in the remote system.
+ */
+static XLogRecPtr
+libpq_get_current_wal_insert_lsn(rewind_source *source)
+{
+ PGconn *conn = ((libpq_source *) source)->conn;
+ XLogRecPtr result;
+ uint32 hi;
+ uint32 lo;
+ char *val;
+
+ val = run_simple_query(conn, "SELECT pg_current_wal_insert_lsn()");
+
+ if (sscanf(val, "%X/%X", &hi, &lo) != 2)
+ pg_fatal("unrecognized result \"%s\" for current WAL insert location", val);
+
+ result = ((uint64) hi) << 32 | lo;
+
+ pg_free(val);
+
+ return result;
+}
+
+/*
+ * Get a list of all files in the data directory.
+ */
+static void
+libpq_traverse_files(rewind_source *source, process_file_callback_t callback)
+{
+ PGconn *conn = ((libpq_source *) source)->conn;
+ PGresult *res;
+ const char *sql;
+ int i;
+
+ /*
+ * Create a recursive directory listing of the whole data directory.
+ *
+ * The WITH RECURSIVE part does most of the work. The second part gets the
+ * targets of the symlinks in pg_tblspc directory.
+ *
+ * XXX: There is no backend function to get a symbolic link's target in
+ * general, so if the admin has put any custom symbolic links in the data
+ * directory, they won't be copied correctly.
+ */
+ sql =
+ "WITH RECURSIVE files (path, filename, size, isdir) AS (\n"
+ " SELECT '' AS path, filename, size, isdir FROM\n"
+ " (SELECT pg_ls_dir('.', true, false) AS filename) AS fn,\n"
+ " pg_stat_file(fn.filename, true) AS this\n"
+ " UNION ALL\n"
+ " SELECT parent.path || parent.filename || '/' AS path,\n"
+ " fn, this.size, this.isdir\n"
+ " FROM files AS parent,\n"
+ " pg_ls_dir(parent.path || parent.filename, true, false) AS fn,\n"
+ " pg_stat_file(parent.path || parent.filename || '/' || fn, true) AS this\n"
+ " WHERE parent.isdir = 't'\n"
+ ")\n"
+ "SELECT path || filename, size, isdir,\n"
+ " pg_tablespace_location(pg_tablespace.oid) AS link_target\n"
+ "FROM files\n"
+ "LEFT OUTER JOIN pg_tablespace ON files.path = 'pg_tblspc/'\n"
+ " AND oid::text = files.filename\n";
+ res = PQexec(conn, sql);
+
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ pg_fatal("could not fetch file list: %s",
+ PQresultErrorMessage(res));
+
+ /* sanity check the result set */
+ if (PQnfields(res) != 4)
+ pg_fatal("unexpected result set while fetching file list");
+
+ /* Read result to local variables */
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ char *path;
+ int64 filesize;
+ bool isdir;
+ char *link_target;
+ file_type_t type;
+
+ if (PQgetisnull(res, i, 1))
+ {
+ /*
+ * The file was removed from the server while the query was
+ * running. Ignore it.
+ */
+ continue;
+ }
+
+ path = PQgetvalue(res, i, 0);
+ filesize = atol(PQgetvalue(res, i, 1));
+ isdir = (strcmp(PQgetvalue(res, i, 2), "t") == 0);
+ link_target = PQgetvalue(res, i, 3);
+
+ if (link_target[0])
+ type = FILE_TYPE_SYMLINK;
+ else if (isdir)
+ type = FILE_TYPE_DIRECTORY;
+ else
+ type = FILE_TYPE_REGULAR;
+
+ process_source_file(path, type, filesize, link_target);
+ }
+ PQclear(res);
+}
+
+/*
+ * Queue up a request to fetch a file from remote system.
+ */
+static void
+libpq_queue_fetch_file(rewind_source *source, const char *path, size_t len)
+{
+ /*
+ * Truncate the target file immediately, and queue a request to fetch it
+ * from the source. If the file is small, smaller than MAX_CHUNK_SIZE,
+ * request fetching a full-sized chunk anyway, so that if the file has
+ * become larger in the source system, after we scanned the source
+ * directory, we still fetch the whole file. This only works for files up
+ * to MAX_CHUNK_SIZE, but that's good enough for small configuration files
+ * and such that are changed every now and then, but not WAL-logged. For
+ * larger files, we fetch up to the original size.
+ *
+ * Even with that mechanism, there is an inherent race condition if the
+ * file is modified at the same instant that we're copying it, so that we
+ * might copy a torn version of the file with one half from the old
+ * version and another half from the new. But pg_basebackup has the same
+ * problem, and it hasn't been a problem in practice.
+ *
+ * It might seem more natural to truncate the file later, when we receive
+ * it from the source server, but then we'd need to track which
+ * fetch-requests are for a whole file.
+ */
+ open_target_file(path, true);
+ libpq_queue_fetch_range(source, path, 0, Max(len, MAX_CHUNK_SIZE));
+}
+
+/*
+ * Queue up a request to fetch a piece of a file from remote system.
+ */
+static void
+libpq_queue_fetch_range(rewind_source *source, const char *path, off_t off,
+ size_t len)
+{
+ libpq_source *src = (libpq_source *) source;
+
+ /*
+ * Does this request happen to be a continuation of the previous chunk? If
+ * so, merge it with the previous one.
+ *
+ * XXX: We use pointer equality to compare the path. That's good enough
+ * for our purposes; the caller always passes the same pointer for the
+ * same filename. If it didn't, we would fail to merge requests, but it
+ * wouldn't affect correctness.
+ */
+ if (src->num_requests > 0)
+ {
+ fetch_range_request *prev = &src->request_queue[src->num_requests - 1];
+
+ if (prev->offset + prev->length == off &&
+ prev->length < MAX_CHUNK_SIZE &&
+ prev->path == path)
+ {
+ /*
+ * Extend the previous request to cover as much of this new
+ * request as possible, without exceeding MAX_CHUNK_SIZE.
+ */
+ size_t thislen;
+
+ thislen = Min(len, MAX_CHUNK_SIZE - prev->length);
+ prev->length += thislen;
+
+ off += thislen;
+ len -= thislen;
+
+ /*
+ * Fall through to create new requests for any remaining 'len'
+ * that didn't fit in the previous chunk.
+ */
+ }
+ }
+
+ /* Divide the request into pieces of MAX_CHUNK_SIZE bytes each */
+ while (len > 0)
+ {
+ int32 thislen;
+
+ /* if the queue is full, perform all the work queued up so far */
+ if (src->num_requests == MAX_CHUNKS_PER_QUERY)
+ process_queued_fetch_requests(src);
+
+ thislen = Min(len, MAX_CHUNK_SIZE);
+ src->request_queue[src->num_requests].path = path;
+ src->request_queue[src->num_requests].offset = off;
+ src->request_queue[src->num_requests].length = thislen;
+ src->num_requests++;
+
+ off += thislen;
+ len -= thislen;
+ }
+}
+
+/*
+ * Fetch all the queued chunks and write them to the target data directory.
+ */
+static void
+libpq_finish_fetch(rewind_source *source)
+{
+ process_queued_fetch_requests((libpq_source *) source);
+}
+
+static void
+process_queued_fetch_requests(libpq_source *src)
+{
+ const char *params[3];
+ PGresult *res;
+ int chunkno;
+
+ if (src->num_requests == 0)
+ return;
+
+ pg_log_debug("getting %d file chunks", src->num_requests);
+
+ /*
+ * The prepared statement, 'fetch_chunks_stmt', takes three arrays with
+ * the same length as parameters: paths, offsets and lengths. Construct
+ * the string representations of them.
+ */
+ resetStringInfo(&src->paths);
+ resetStringInfo(&src->offsets);
+ resetStringInfo(&src->lengths);
+
+ appendStringInfoChar(&src->paths, '{');
+ appendStringInfoChar(&src->offsets, '{');
+ appendStringInfoChar(&src->lengths, '{');
+ for (int i = 0; i < src->num_requests; i++)
+ {
+ fetch_range_request *rq = &src->request_queue[i];
+
+ if (i > 0)
+ {
+ appendStringInfoChar(&src->paths, ',');
+ appendStringInfoChar(&src->offsets, ',');
+ appendStringInfoChar(&src->lengths, ',');
+ }
+
+ appendArrayEscapedString(&src->paths, rq->path);
+ appendStringInfo(&src->offsets, INT64_FORMAT, (int64) rq->offset);
+ appendStringInfo(&src->lengths, INT64_FORMAT, (int64) rq->length);
+ }
+ appendStringInfoChar(&src->paths, '}');
+ appendStringInfoChar(&src->offsets, '}');
+ appendStringInfoChar(&src->lengths, '}');
+
+ /*
+ * Execute the prepared statement.
+ */
+ params[0] = src->paths.data;
+ params[1] = src->offsets.data;
+ params[2] = src->lengths.data;
+
+ if (PQsendQueryPrepared(src->conn, "fetch_chunks_stmt", 3, params, NULL, NULL, 1) != 1)
+ pg_fatal("could not send query: %s", PQerrorMessage(src->conn));
+
+ if (PQsetSingleRowMode(src->conn) != 1)
+ pg_fatal("could not set libpq connection to single row mode");
+
+ /*----
+ * The result set is of format:
+ *
+ * path text -- path in the data directory, e.g "base/1/123"
+ * begin int8 -- offset within the file
+ * chunk bytea -- file content
+ *----
+ */
+ chunkno = 0;
+ while ((res = PQgetResult(src->conn)) != NULL)
+ {
+ fetch_range_request *rq = &src->request_queue[chunkno];
+ char *filename;
+ int filenamelen;
+ int64 chunkoff;
+ int chunksize;
+ char *chunk;
+
+ switch (PQresultStatus(res))
+ {
+ case PGRES_SINGLE_TUPLE:
+ break;
+
+ case PGRES_TUPLES_OK:
+ PQclear(res);
+ continue; /* final zero-row result */
+
+ default:
+ pg_fatal("unexpected result while fetching remote files: %s",
+ PQresultErrorMessage(res));
+ }
+
+ if (chunkno > src->num_requests)
+ pg_fatal("received more data chunks than requested");
+
+ /* sanity check the result set */
+ if (PQnfields(res) != 3 || PQntuples(res) != 1)
+ pg_fatal("unexpected result set size while fetching remote files");
+
+ if (PQftype(res, 0) != TEXTOID ||
+ PQftype(res, 1) != INT8OID ||
+ PQftype(res, 2) != BYTEAOID)
+ {
+ pg_fatal("unexpected data types in result set while fetching remote files: %u %u %u",
+ PQftype(res, 0), PQftype(res, 1), PQftype(res, 2));
+ }
+
+ if (PQfformat(res, 0) != 1 &&
+ PQfformat(res, 1) != 1 &&
+ PQfformat(res, 2) != 1)
+ {
+ pg_fatal("unexpected result format while fetching remote files");
+ }
+
+ if (PQgetisnull(res, 0, 0) ||
+ PQgetisnull(res, 0, 1))
+ {
+ pg_fatal("unexpected null values in result while fetching remote files");
+ }
+
+ if (PQgetlength(res, 0, 1) != sizeof(int64))
+ pg_fatal("unexpected result length while fetching remote files");
+
+ /* Read result set to local variables */
+ memcpy(&chunkoff, PQgetvalue(res, 0, 1), sizeof(int64));
+ chunkoff = pg_ntoh64(chunkoff);
+ chunksize = PQgetlength(res, 0, 2);
+
+ filenamelen = PQgetlength(res, 0, 0);
+ filename = pg_malloc(filenamelen + 1);
+ memcpy(filename, PQgetvalue(res, 0, 0), filenamelen);
+ filename[filenamelen] = '\0';
+
+ chunk = PQgetvalue(res, 0, 2);
+
+ /*
+ * If a file has been deleted on the source, remove it on the target
+ * as well. Note that multiple unlink() calls may happen on the same
+ * file if multiple data chunks are associated with it, hence ignore
+ * unconditionally anything missing.
+ */
+ if (PQgetisnull(res, 0, 2))
+ {
+ pg_log_debug("received null value for chunk for file \"%s\", file has been deleted",
+ filename);
+ remove_target_file(filename, true);
+ }
+ else
+ {
+ pg_log_debug("received chunk for file \"%s\", offset %lld, size %d",
+ filename, (long long int) chunkoff, chunksize);
+
+ if (strcmp(filename, rq->path) != 0)
+ {
+ pg_fatal("received data for file \"%s\", when requested for \"%s\"",
+ filename, rq->path);
+ }
+ if (chunkoff != rq->offset)
+ pg_fatal("received data at offset %lld of file \"%s\", when requested for offset %lld",
+ (long long int) chunkoff, rq->path, (long long int) rq->offset);
+
+ /*
+ * We should not receive more data than we requested, or
+ * pg_read_binary_file() messed up. We could receive less,
+ * though, if the file was truncated in the source after we
+ * checked its size. That's OK, there should be a WAL record of
+ * the truncation, which will get replayed when you start the
+ * target system for the first time after pg_rewind has completed.
+ */
+ if (chunksize > rq->length)
+ pg_fatal("received more than requested for file \"%s\"", rq->path);
+
+ open_target_file(filename, false);
+
+ write_target_range(chunk, chunkoff, chunksize);
+ }
+
+ pg_free(filename);
+
+ PQclear(res);
+ chunkno++;
+ }
+ if (chunkno != src->num_requests)
+ pg_fatal("unexpected number of data chunks received");
+
+ src->num_requests = 0;
+}
+
+/*
+ * Escape a string to be used as element in a text array constant
+ */
+static void
+appendArrayEscapedString(StringInfo buf, const char *str)
+{
+ appendStringInfoCharMacro(buf, '\"');
+ while (*str)
+ {
+ char ch = *str;
+
+ if (ch == '"' || ch == '\\')
+ appendStringInfoCharMacro(buf, '\\');
+
+ appendStringInfoCharMacro(buf, ch);
+
+ str++;
+ }
+ appendStringInfoCharMacro(buf, '\"');
+}
+
+/*
+ * Fetch a single file as a malloc'd buffer.
+ */
+static char *
+libpq_fetch_file(rewind_source *source, const char *path, size_t *filesize)
+{
+ PGconn *conn = ((libpq_source *) source)->conn;
+ PGresult *res;
+ char *result;
+ int len;
+ const char *paramValues[1];
+
+ paramValues[0] = path;
+ res = PQexecParams(conn, "SELECT pg_read_binary_file($1)",
+ 1, NULL, paramValues, NULL, NULL, 1);
+
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ pg_fatal("could not fetch remote file \"%s\": %s",
+ path, PQresultErrorMessage(res));
+
+ /* sanity check the result set */
+ if (PQntuples(res) != 1 || PQgetisnull(res, 0, 0))
+ pg_fatal("unexpected result set while fetching remote file \"%s\"",
+ path);
+
+ /* Read result to local variables */
+ len = PQgetlength(res, 0, 0);
+ result = pg_malloc(len + 1);
+ memcpy(result, PQgetvalue(res, 0, 0), len);
+ result[len] = '\0';
+
+ PQclear(res);
+
+ pg_log_debug("fetched file \"%s\", length %d", path, len);
+
+ if (filesize)
+ *filesize = len;
+ return result;
+}
+
+/*
+ * Close a libpq source.
+ */
+static void
+libpq_destroy(rewind_source *source)
+{
+ libpq_source *src = (libpq_source *) source;
+
+ pfree(src->paths.data);
+ pfree(src->offsets.data);
+ pfree(src->lengths.data);
+ pfree(src);
+
+ /* NOTE: we don't close the connection here, as it was not opened by us. */
+}
diff --git a/src/bin/pg_rewind/local_source.c b/src/bin/pg_rewind/local_source.c
new file mode 100644
index 0000000..2e50485
--- /dev/null
+++ b/src/bin/pg_rewind/local_source.c
@@ -0,0 +1,187 @@
+/*-------------------------------------------------------------------------
+ *
+ * local_source.c
+ * Functions for using a local data directory as the source.
+ *
+ * Portions Copyright (c) 2013-2022, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "datapagemap.h"
+#include "file_ops.h"
+#include "filemap.h"
+#include "pg_rewind.h"
+#include "rewind_source.h"
+
+typedef struct
+{
+ rewind_source common; /* common interface functions */
+
+ const char *datadir; /* path to the source data directory */
+} local_source;
+
+static void local_traverse_files(rewind_source *source,
+ process_file_callback_t callback);
+static char *local_fetch_file(rewind_source *source, const char *path,
+ size_t *filesize);
+static void local_queue_fetch_file(rewind_source *source, const char *path,
+ size_t len);
+static void local_queue_fetch_range(rewind_source *source, const char *path,
+ off_t off, size_t len);
+static void local_finish_fetch(rewind_source *source);
+static void local_destroy(rewind_source *source);
+
+rewind_source *
+init_local_source(const char *datadir)
+{
+ local_source *src;
+
+ src = pg_malloc0(sizeof(local_source));
+
+ src->common.traverse_files = local_traverse_files;
+ src->common.fetch_file = local_fetch_file;
+ src->common.queue_fetch_file = local_queue_fetch_file;
+ src->common.queue_fetch_range = local_queue_fetch_range;
+ src->common.finish_fetch = local_finish_fetch;
+ src->common.get_current_wal_insert_lsn = NULL;
+ src->common.destroy = local_destroy;
+
+ src->datadir = datadir;
+
+ return &src->common;
+}
+
+static void
+local_traverse_files(rewind_source *source, process_file_callback_t callback)
+{
+ traverse_datadir(((local_source *) source)->datadir, &process_source_file);
+}
+
+static char *
+local_fetch_file(rewind_source *source, const char *path, size_t *filesize)
+{
+ return slurpFile(((local_source *) source)->datadir, path, filesize);
+}
+
+/*
+ * Copy a file from source to target.
+ *
+ * 'len' is the expected length of the file.
+ */
+static void
+local_queue_fetch_file(rewind_source *source, const char *path, size_t len)
+{
+ const char *datadir = ((local_source *) source)->datadir;
+ PGAlignedBlock buf;
+ char srcpath[MAXPGPATH];
+ int srcfd;
+ size_t written_len;
+
+ snprintf(srcpath, sizeof(srcpath), "%s/%s", datadir, path);
+
+ /* Open source file for reading */
+ srcfd = open(srcpath, O_RDONLY | PG_BINARY, 0);
+ if (srcfd < 0)
+ pg_fatal("could not open source file \"%s\": %m",
+ srcpath);
+
+ /* Truncate and open the target file for writing */
+ open_target_file(path, true);
+
+ written_len = 0;
+ for (;;)
+ {
+ ssize_t read_len;
+
+ read_len = read(srcfd, buf.data, sizeof(buf));
+
+ if (read_len < 0)
+ pg_fatal("could not read file \"%s\": %m", srcpath);
+ else if (read_len == 0)
+ break; /* EOF reached */
+
+ write_target_range(buf.data, written_len, read_len);
+ written_len += read_len;
+ }
+
+ /*
+ * A local source is not expected to change while we're rewinding, so
+ * check that the size of the file matches our earlier expectation.
+ */
+ if (written_len != len)
+ pg_fatal("size of source file \"%s\" changed concurrently: %d bytes expected, %d copied",
+ srcpath, (int) len, (int) written_len);
+
+ if (close(srcfd) != 0)
+ pg_fatal("could not close file \"%s\": %m", srcpath);
+}
+
+/*
+ * Copy a file from source to target, starting at 'off', for 'len' bytes.
+ */
+static void
+local_queue_fetch_range(rewind_source *source, const char *path, off_t off,
+ size_t len)
+{
+ const char *datadir = ((local_source *) source)->datadir;
+ PGAlignedBlock buf;
+ char srcpath[MAXPGPATH];
+ int srcfd;
+ off_t begin = off;
+ off_t end = off + len;
+
+ snprintf(srcpath, sizeof(srcpath), "%s/%s", datadir, path);
+
+ srcfd = open(srcpath, O_RDONLY | PG_BINARY, 0);
+ if (srcfd < 0)
+ pg_fatal("could not open source file \"%s\": %m",
+ srcpath);
+
+ if (lseek(srcfd, begin, SEEK_SET) == -1)
+ pg_fatal("could not seek in source file: %m");
+
+ open_target_file(path, false);
+
+ while (end - begin > 0)
+ {
+ ssize_t readlen;
+ size_t thislen;
+
+ if (end - begin > sizeof(buf))
+ thislen = sizeof(buf);
+ else
+ thislen = end - begin;
+
+ readlen = read(srcfd, buf.data, thislen);
+
+ if (readlen < 0)
+ pg_fatal("could not read file \"%s\": %m", srcpath);
+ else if (readlen == 0)
+ pg_fatal("unexpected EOF while reading file \"%s\"", srcpath);
+
+ write_target_range(buf.data, begin, readlen);
+ begin += readlen;
+ }
+
+ if (close(srcfd) != 0)
+ pg_fatal("could not close file \"%s\": %m", srcpath);
+}
+
+static void
+local_finish_fetch(rewind_source *source)
+{
+ /*
+ * Nothing to do, local_queue_fetch_range() copies the ranges immediately.
+ */
+}
+
+static void
+local_destroy(rewind_source *source)
+{
+ pfree(source);
+}
diff --git a/src/bin/pg_rewind/nls.mk b/src/bin/pg_rewind/nls.mk
new file mode 100644
index 0000000..31123b9
--- /dev/null
+++ b/src/bin/pg_rewind/nls.mk
@@ -0,0 +1,7 @@
+# src/bin/pg_rewind/nls.mk
+CATALOG_NAME = pg_rewind
+AVAIL_LANGUAGES = de el es fr it ja ka ko ru sv uk zh_CN
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) datapagemap.c file_ops.c filemap.c libpq_source.c local_source.c parsexlog.c pg_rewind.c timeline.c xlogreader.c ../../common/fe_memutils.c ../../common/restricted_token.c ../../fe_utils/archive.c ../../fe_utils/recovery_gen.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) report_invalid_record:2
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \
+ report_invalid_record:2:c-format
diff --git a/src/bin/pg_rewind/parsexlog.c b/src/bin/pg_rewind/parsexlog.c
new file mode 100644
index 0000000..c6792da
--- /dev/null
+++ b/src/bin/pg_rewind/parsexlog.c
@@ -0,0 +1,462 @@
+/*-------------------------------------------------------------------------
+ *
+ * parsexlog.c
+ * Functions for reading Write-Ahead-Log
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <unistd.h>
+
+#include "access/rmgr.h"
+#include "access/xact.h"
+#include "access/xlog_internal.h"
+#include "access/xlogreader.h"
+#include "catalog/pg_control.h"
+#include "catalog/storage_xlog.h"
+#include "commands/dbcommands_xlog.h"
+#include "fe_utils/archive.h"
+#include "filemap.h"
+#include "pg_rewind.h"
+
+/*
+ * RmgrNames is an array of the built-in resource manager names, to make error
+ * messages a bit nicer.
+ */
+#define PG_RMGR(symname,name,redo,desc,identify,startup,cleanup,mask,decode) \
+ name,
+
+static const char *RmgrNames[RM_MAX_ID + 1] = {
+#include "access/rmgrlist.h"
+};
+
+#define RmgrName(rmid) (((rmid) <= RM_MAX_BUILTIN_ID) ? \
+ RmgrNames[rmid] : "custom")
+
+static void extractPageInfo(XLogReaderState *record);
+
+static int xlogreadfd = -1;
+static XLogSegNo xlogreadsegno = 0;
+static char xlogfpath[MAXPGPATH];
+
+typedef struct XLogPageReadPrivate
+{
+ const char *restoreCommand;
+ int tliIndex;
+} XLogPageReadPrivate;
+
+static int SimpleXLogPageRead(XLogReaderState *xlogreader,
+ XLogRecPtr targetPagePtr,
+ int reqLen, XLogRecPtr targetRecPtr, char *readBuf);
+
+/*
+ * Read WAL from the datadir/pg_wal, starting from 'startpoint' on timeline
+ * index 'tliIndex' in target timeline history, until 'endpoint'. Make note of
+ * the data blocks touched by the WAL records, and return them in a page map.
+ *
+ * 'endpoint' is the end of the last record to read. The record starting at
+ * 'endpoint' is the first one that is not read.
+ */
+void
+extractPageMap(const char *datadir, XLogRecPtr startpoint, int tliIndex,
+ XLogRecPtr endpoint, const char *restoreCommand)
+{
+ XLogRecord *record;
+ XLogReaderState *xlogreader;
+ char *errormsg;
+ XLogPageReadPrivate private;
+
+ private.tliIndex = tliIndex;
+ private.restoreCommand = restoreCommand;
+ xlogreader = XLogReaderAllocate(WalSegSz, datadir,
+ XL_ROUTINE(.page_read = &SimpleXLogPageRead),
+ &private);
+ if (xlogreader == NULL)
+ pg_fatal("out of memory while allocating a WAL reading processor");
+
+ XLogBeginRead(xlogreader, startpoint);
+ do
+ {
+ record = XLogReadRecord(xlogreader, &errormsg);
+
+ if (record == NULL)
+ {
+ XLogRecPtr errptr = xlogreader->EndRecPtr;
+
+ if (errormsg)
+ pg_fatal("could not read WAL record at %X/%X: %s",
+ LSN_FORMAT_ARGS(errptr),
+ errormsg);
+ else
+ pg_fatal("could not read WAL record at %X/%X",
+ LSN_FORMAT_ARGS(errptr));
+ }
+
+ extractPageInfo(xlogreader);
+ } while (xlogreader->EndRecPtr < endpoint);
+
+ /*
+ * If 'endpoint' didn't point exactly at a record boundary, the caller
+ * messed up.
+ */
+ if (xlogreader->EndRecPtr != endpoint)
+ pg_fatal("end pointer %X/%X is not a valid end point; expected %X/%X",
+ LSN_FORMAT_ARGS(endpoint), LSN_FORMAT_ARGS(xlogreader->EndRecPtr));
+
+ XLogReaderFree(xlogreader);
+ if (xlogreadfd != -1)
+ {
+ close(xlogreadfd);
+ xlogreadfd = -1;
+ }
+}
+
+/*
+ * Reads one WAL record. Returns the end position of the record, without
+ * doing anything with the record itself.
+ */
+XLogRecPtr
+readOneRecord(const char *datadir, XLogRecPtr ptr, int tliIndex,
+ const char *restoreCommand)
+{
+ XLogRecord *record;
+ XLogReaderState *xlogreader;
+ char *errormsg;
+ XLogPageReadPrivate private;
+ XLogRecPtr endptr;
+
+ private.tliIndex = tliIndex;
+ private.restoreCommand = restoreCommand;
+ xlogreader = XLogReaderAllocate(WalSegSz, datadir,
+ XL_ROUTINE(.page_read = &SimpleXLogPageRead),
+ &private);
+ if (xlogreader == NULL)
+ pg_fatal("out of memory while allocating a WAL reading processor");
+
+ XLogBeginRead(xlogreader, ptr);
+ record = XLogReadRecord(xlogreader, &errormsg);
+ if (record == NULL)
+ {
+ if (errormsg)
+ pg_fatal("could not read WAL record at %X/%X: %s",
+ LSN_FORMAT_ARGS(ptr), errormsg);
+ else
+ pg_fatal("could not read WAL record at %X/%X",
+ LSN_FORMAT_ARGS(ptr));
+ }
+ endptr = xlogreader->EndRecPtr;
+
+ XLogReaderFree(xlogreader);
+ if (xlogreadfd != -1)
+ {
+ close(xlogreadfd);
+ xlogreadfd = -1;
+ }
+
+ return endptr;
+}
+
+/*
+ * Find the previous checkpoint preceding given WAL location.
+ */
+void
+findLastCheckpoint(const char *datadir, XLogRecPtr forkptr, int tliIndex,
+ XLogRecPtr *lastchkptrec, TimeLineID *lastchkpttli,
+ XLogRecPtr *lastchkptredo, const char *restoreCommand)
+{
+ /* Walk backwards, starting from the given record */
+ XLogRecord *record;
+ XLogRecPtr searchptr;
+ XLogReaderState *xlogreader;
+ char *errormsg;
+ XLogPageReadPrivate private;
+
+ /*
+ * The given fork pointer points to the end of the last common record,
+ * which is not necessarily the beginning of the next record, if the
+ * previous record happens to end at a page boundary. Skip over the page
+ * header in that case to find the next record.
+ */
+ if (forkptr % XLOG_BLCKSZ == 0)
+ {
+ if (XLogSegmentOffset(forkptr, WalSegSz) == 0)
+ forkptr += SizeOfXLogLongPHD;
+ else
+ forkptr += SizeOfXLogShortPHD;
+ }
+
+ private.tliIndex = tliIndex;
+ private.restoreCommand = restoreCommand;
+ xlogreader = XLogReaderAllocate(WalSegSz, datadir,
+ XL_ROUTINE(.page_read = &SimpleXLogPageRead),
+ &private);
+ if (xlogreader == NULL)
+ pg_fatal("out of memory while allocating a WAL reading processor");
+
+ searchptr = forkptr;
+ for (;;)
+ {
+ uint8 info;
+
+ XLogBeginRead(xlogreader, searchptr);
+ record = XLogReadRecord(xlogreader, &errormsg);
+
+ if (record == NULL)
+ {
+ if (errormsg)
+ pg_fatal("could not find previous WAL record at %X/%X: %s",
+ LSN_FORMAT_ARGS(searchptr),
+ errormsg);
+ else
+ pg_fatal("could not find previous WAL record at %X/%X",
+ LSN_FORMAT_ARGS(searchptr));
+ }
+
+ /*
+ * Check if it is a checkpoint record. This checkpoint record needs to
+ * be the latest checkpoint before WAL forked and not the checkpoint
+ * where the primary has been stopped to be rewound.
+ */
+ info = XLogRecGetInfo(xlogreader) & ~XLR_INFO_MASK;
+ if (searchptr < forkptr &&
+ XLogRecGetRmid(xlogreader) == RM_XLOG_ID &&
+ (info == XLOG_CHECKPOINT_SHUTDOWN ||
+ info == XLOG_CHECKPOINT_ONLINE))
+ {
+ CheckPoint checkPoint;
+
+ memcpy(&checkPoint, XLogRecGetData(xlogreader), sizeof(CheckPoint));
+ *lastchkptrec = searchptr;
+ *lastchkpttli = checkPoint.ThisTimeLineID;
+ *lastchkptredo = checkPoint.redo;
+ break;
+ }
+
+ /* Walk backwards to previous record. */
+ searchptr = record->xl_prev;
+ }
+
+ XLogReaderFree(xlogreader);
+ if (xlogreadfd != -1)
+ {
+ close(xlogreadfd);
+ xlogreadfd = -1;
+ }
+}
+
+/* XLogReader callback function, to read a WAL page */
+static int
+SimpleXLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr,
+ int reqLen, XLogRecPtr targetRecPtr, char *readBuf)
+{
+ XLogPageReadPrivate *private = (XLogPageReadPrivate *) xlogreader->private_data;
+ uint32 targetPageOff;
+ XLogRecPtr targetSegEnd;
+ XLogSegNo targetSegNo;
+ int r;
+
+ XLByteToSeg(targetPagePtr, targetSegNo, WalSegSz);
+ XLogSegNoOffsetToRecPtr(targetSegNo + 1, 0, WalSegSz, targetSegEnd);
+ targetPageOff = XLogSegmentOffset(targetPagePtr, WalSegSz);
+
+ /*
+ * See if we need to switch to a new segment because the requested record
+ * is not in the currently open one.
+ */
+ if (xlogreadfd >= 0 &&
+ !XLByteInSeg(targetPagePtr, xlogreadsegno, WalSegSz))
+ {
+ close(xlogreadfd);
+ xlogreadfd = -1;
+ }
+
+ XLByteToSeg(targetPagePtr, xlogreadsegno, WalSegSz);
+
+ if (xlogreadfd < 0)
+ {
+ char xlogfname[MAXFNAMELEN];
+
+ /*
+ * Since incomplete segments are copied into next timelines, switch to
+ * the timeline holding the required segment. Assuming this scan can
+ * be done both forward and backward, consider also switching timeline
+ * accordingly.
+ */
+ while (private->tliIndex < targetNentries - 1 &&
+ targetHistory[private->tliIndex].end < targetSegEnd)
+ private->tliIndex++;
+ while (private->tliIndex > 0 &&
+ targetHistory[private->tliIndex].begin >= targetSegEnd)
+ private->tliIndex--;
+
+ XLogFileName(xlogfname, targetHistory[private->tliIndex].tli,
+ xlogreadsegno, WalSegSz);
+
+ snprintf(xlogfpath, MAXPGPATH, "%s/" XLOGDIR "/%s",
+ xlogreader->segcxt.ws_dir, xlogfname);
+
+ xlogreadfd = open(xlogfpath, O_RDONLY | PG_BINARY, 0);
+
+ if (xlogreadfd < 0)
+ {
+ /*
+ * If we have no restore_command to execute, then exit.
+ */
+ if (private->restoreCommand == NULL)
+ {
+ pg_log_error("could not open file \"%s\": %m", xlogfpath);
+ return -1;
+ }
+
+ /*
+ * Since we have restore_command, then try to retrieve missing WAL
+ * file from the archive.
+ */
+ xlogreadfd = RestoreArchivedFile(xlogreader->segcxt.ws_dir,
+ xlogfname,
+ WalSegSz,
+ private->restoreCommand);
+
+ if (xlogreadfd < 0)
+ return -1;
+ else
+ pg_log_debug("using file \"%s\" restored from archive",
+ xlogfpath);
+ }
+ }
+
+ /*
+ * At this point, we have the right segment open.
+ */
+ Assert(xlogreadfd != -1);
+
+ /* Read the requested page */
+ if (lseek(xlogreadfd, (off_t) targetPageOff, SEEK_SET) < 0)
+ {
+ pg_log_error("could not seek in file \"%s\": %m", xlogfpath);
+ return -1;
+ }
+
+
+ r = read(xlogreadfd, readBuf, XLOG_BLCKSZ);
+ if (r != XLOG_BLCKSZ)
+ {
+ if (r < 0)
+ pg_log_error("could not read file \"%s\": %m", xlogfpath);
+ else
+ pg_log_error("could not read file \"%s\": read %d of %zu",
+ xlogfpath, r, (Size) XLOG_BLCKSZ);
+
+ return -1;
+ }
+
+ Assert(targetSegNo == xlogreadsegno);
+
+ xlogreader->seg.ws_tli = targetHistory[private->tliIndex].tli;
+ return XLOG_BLCKSZ;
+}
+
+/*
+ * Extract information on which blocks the current record modifies.
+ */
+static void
+extractPageInfo(XLogReaderState *record)
+{
+ int block_id;
+ RmgrId rmid = XLogRecGetRmid(record);
+ uint8 info = XLogRecGetInfo(record);
+ uint8 rminfo = info & ~XLR_INFO_MASK;
+
+ /* Is this a special record type that I recognize? */
+
+ if (rmid == RM_DBASE_ID && rminfo == XLOG_DBASE_CREATE_FILE_COPY)
+ {
+ /*
+ * New databases can be safely ignored. It won't be present in the
+ * source system, so it will be deleted. There's one corner-case,
+ * though: if a new, different, database is also created in the source
+ * system, we'll see that the files already exist and not copy them.
+ * That's OK, though; WAL replay of creating the new database, from
+ * the source systems's WAL, will re-copy the new database,
+ * overwriting the database created in the target system.
+ */
+ }
+ else if (rmid == RM_DBASE_ID && rminfo == XLOG_DBASE_CREATE_WAL_LOG)
+ {
+ /*
+ * New databases can be safely ignored. It won't be present in the
+ * source system, so it will be deleted.
+ */
+ }
+ else if (rmid == RM_DBASE_ID && rminfo == XLOG_DBASE_DROP)
+ {
+ /*
+ * An existing database was dropped. We'll see that the files don't
+ * exist in the target data dir, and copy them in toto from the source
+ * system. No need to do anything special here.
+ */
+ }
+ else if (rmid == RM_SMGR_ID && rminfo == XLOG_SMGR_CREATE)
+ {
+ /*
+ * We can safely ignore these. The file will be removed from the
+ * target, if it doesn't exist in source system. If a file with same
+ * name is created in source system, too, there will be WAL records
+ * for all the blocks in it.
+ */
+ }
+ else if (rmid == RM_SMGR_ID && rminfo == XLOG_SMGR_TRUNCATE)
+ {
+ /*
+ * We can safely ignore these. When we compare the sizes later on,
+ * we'll notice that they differ, and copy the missing tail from
+ * source system.
+ */
+ }
+ else if (rmid == RM_XACT_ID &&
+ ((rminfo & XLOG_XACT_OPMASK) == XLOG_XACT_COMMIT ||
+ (rminfo & XLOG_XACT_OPMASK) == XLOG_XACT_COMMIT_PREPARED ||
+ (rminfo & XLOG_XACT_OPMASK) == XLOG_XACT_ABORT ||
+ (rminfo & XLOG_XACT_OPMASK) == XLOG_XACT_ABORT_PREPARED))
+ {
+ /*
+ * These records can include "dropped rels". We can safely ignore
+ * them, we will see that they are missing and copy them from the
+ * source.
+ */
+ }
+ else if (info & XLR_SPECIAL_REL_UPDATE)
+ {
+ /*
+ * This record type modifies a relation file in some special way, but
+ * we don't recognize the type. That's bad - we don't know how to
+ * track that change.
+ */
+ pg_fatal("WAL record modifies a relation, but record type is not recognized: "
+ "lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X",
+ LSN_FORMAT_ARGS(record->ReadRecPtr),
+ rmid, RmgrName(rmid), info);
+ }
+
+ for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++)
+ {
+ RelFileNode rnode;
+ ForkNumber forknum;
+ BlockNumber blkno;
+
+ if (!XLogRecGetBlockTagExtended(record, block_id,
+ &rnode, &forknum, &blkno, NULL))
+ continue;
+
+ /* We only care about the main fork; others are copied in toto */
+ if (forknum != MAIN_FORKNUM)
+ continue;
+
+ process_target_wal_block_change(forknum, rnode, blkno);
+ }
+}
diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c
new file mode 100644
index 0000000..1ff8da1
--- /dev/null
+++ b/src/bin/pg_rewind/pg_rewind.c
@@ -0,0 +1,1169 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_rewind.c
+ * Synchronizes a PostgreSQL data directory to a new timeline
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "access/timeline.h"
+#include "access/xlog_internal.h"
+#include "catalog/catversion.h"
+#include "catalog/pg_control.h"
+#include "common/controldata_utils.h"
+#include "common/file_perm.h"
+#include "common/restricted_token.h"
+#include "common/string.h"
+#include "fe_utils/recovery_gen.h"
+#include "fe_utils/string_utils.h"
+#include "file_ops.h"
+#include "filemap.h"
+#include "getopt_long.h"
+#include "pg_rewind.h"
+#include "rewind_source.h"
+#include "storage/bufpage.h"
+
+static void usage(const char *progname);
+
+static void perform_rewind(filemap_t *filemap, rewind_source *source,
+ XLogRecPtr chkptrec,
+ TimeLineID chkpttli,
+ XLogRecPtr chkptredo);
+
+static void createBackupLabel(XLogRecPtr startpoint, TimeLineID starttli,
+ XLogRecPtr checkpointloc);
+
+static void digestControlFile(ControlFileData *ControlFile,
+ const char *content, size_t size);
+static void getRestoreCommand(const char *argv0);
+static void sanityChecks(void);
+static void findCommonAncestorTimeline(XLogRecPtr *recptr, int *tliIndex);
+static void ensureCleanShutdown(const char *argv0);
+static void disconnect_atexit(void);
+
+static ControlFileData ControlFile_target;
+static ControlFileData ControlFile_source;
+static ControlFileData ControlFile_source_after;
+
+const char *progname;
+int WalSegSz;
+
+/* Configuration options */
+char *datadir_target = NULL;
+char *datadir_source = NULL;
+char *connstr_source = NULL;
+char *restore_command = NULL;
+char *config_file = NULL;
+
+static bool debug = false;
+bool showprogress = false;
+bool dry_run = false;
+bool do_sync = true;
+bool restore_wal = false;
+
+/* Target history */
+TimeLineHistoryEntry *targetHistory;
+int targetNentries;
+
+/* Progress counters */
+uint64 fetch_size;
+uint64 fetch_done;
+
+static PGconn *conn;
+static rewind_source *source;
+
+static void
+usage(const char *progname)
+{
+ printf(_("%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n\n"), progname);
+ printf(_("Usage:\n %s [OPTION]...\n\n"), progname);
+ printf(_("Options:\n"));
+ printf(_(" -c, --restore-target-wal use restore_command in target configuration to\n"
+ " retrieve WAL files from archives\n"));
+ printf(_(" -D, --target-pgdata=DIRECTORY existing data directory to modify\n"));
+ printf(_(" --source-pgdata=DIRECTORY source data directory to synchronize with\n"));
+ printf(_(" --source-server=CONNSTR source server to synchronize with\n"));
+ printf(_(" -n, --dry-run stop before modifying anything\n"));
+ printf(_(" -N, --no-sync do not wait for changes to be written\n"
+ " safely to disk\n"));
+ printf(_(" -P, --progress write progress messages\n"));
+ printf(_(" -R, --write-recovery-conf write configuration for replication\n"
+ " (requires --source-server)\n"));
+ printf(_(" --config-file=FILENAME use specified main server configuration\n"
+ " file when running target cluster\n"));
+ printf(_(" --debug write a lot of debug messages\n"));
+ printf(_(" --no-ensure-shutdown do not automatically fix unclean shutdown\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+
+int
+main(int argc, char **argv)
+{
+ static struct option long_options[] = {
+ {"help", no_argument, NULL, '?'},
+ {"target-pgdata", required_argument, NULL, 'D'},
+ {"write-recovery-conf", no_argument, NULL, 'R'},
+ {"source-pgdata", required_argument, NULL, 1},
+ {"source-server", required_argument, NULL, 2},
+ {"no-ensure-shutdown", no_argument, NULL, 4},
+ {"config-file", required_argument, NULL, 5},
+ {"version", no_argument, NULL, 'V'},
+ {"restore-target-wal", no_argument, NULL, 'c'},
+ {"dry-run", no_argument, NULL, 'n'},
+ {"no-sync", no_argument, NULL, 'N'},
+ {"progress", no_argument, NULL, 'P'},
+ {"debug", no_argument, NULL, 3},
+ {NULL, 0, NULL, 0}
+ };
+ int option_index;
+ int c;
+ XLogRecPtr divergerec;
+ int lastcommontliIndex;
+ XLogRecPtr chkptrec;
+ TimeLineID chkpttli;
+ XLogRecPtr chkptredo;
+ XLogRecPtr target_wal_endrec;
+ size_t size;
+ char *buffer;
+ bool no_ensure_shutdown = false;
+ bool rewind_needed;
+ bool writerecoveryconf = false;
+ filemap_t *filemap;
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_rewind"));
+ progname = get_progname(argv[0]);
+
+ /* Process command-line arguments */
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage(progname);
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_rewind (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((c = getopt_long(argc, argv, "cD:nNPR", long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+ case 'c':
+ restore_wal = true;
+ break;
+
+ case 'P':
+ showprogress = true;
+ break;
+
+ case 'n':
+ dry_run = true;
+ break;
+
+ case 'N':
+ do_sync = false;
+ break;
+
+ case 'R':
+ writerecoveryconf = true;
+ break;
+
+ case 3:
+ debug = true;
+ pg_logging_increase_verbosity();
+ break;
+
+ case 'D': /* -D or --target-pgdata */
+ datadir_target = pg_strdup(optarg);
+ break;
+
+ case 1: /* --source-pgdata */
+ datadir_source = pg_strdup(optarg);
+ break;
+
+ case 2: /* --source-server */
+ connstr_source = pg_strdup(optarg);
+ break;
+
+ case 4:
+ no_ensure_shutdown = true;
+ break;
+
+ case 5:
+ config_file = pg_strdup(optarg);
+ break;
+
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ if (datadir_source == NULL && connstr_source == NULL)
+ {
+ pg_log_error("no source specified (--source-pgdata or --source-server)");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (datadir_source != NULL && connstr_source != NULL)
+ {
+ pg_log_error("only one of --source-pgdata or --source-server can be specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (datadir_target == NULL)
+ {
+ pg_log_error("no target data directory specified (--target-pgdata)");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (writerecoveryconf && connstr_source == NULL)
+ {
+ pg_log_error("no source server information (--source-server) specified for --write-recovery-conf");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Don't allow pg_rewind to be run as root, to avoid overwriting the
+ * ownership of files in the data directory. We need only check for root
+ * -- any other user won't have sufficient permissions to modify files in
+ * the data directory.
+ */
+#ifndef WIN32
+ if (geteuid() == 0)
+ {
+ pg_log_error("cannot be executed by \"root\"");
+ pg_log_error_hint("You must run %s as the PostgreSQL superuser.",
+ progname);
+ exit(1);
+ }
+#endif
+
+ get_restricted_token();
+
+ /* Set mask based on PGDATA permissions */
+ if (!GetDataDirectoryCreatePerm(datadir_target))
+ pg_fatal("could not read permissions of directory \"%s\": %m",
+ datadir_target);
+
+ umask(pg_mode_mask);
+
+ getRestoreCommand(argv[0]);
+
+ atexit(disconnect_atexit);
+
+ /*
+ * Ok, we have all the options and we're ready to start. First, connect to
+ * remote server.
+ */
+ if (connstr_source)
+ {
+ conn = PQconnectdb(connstr_source);
+
+ if (PQstatus(conn) == CONNECTION_BAD)
+ pg_fatal("%s", PQerrorMessage(conn));
+
+ if (showprogress)
+ pg_log_info("connected to server");
+
+ source = init_libpq_source(conn);
+ }
+ else
+ source = init_local_source(datadir_source);
+
+ /*
+ * Check the status of the target instance.
+ *
+ * If the target instance was not cleanly shut down, start and stop the
+ * target cluster once in single-user mode to enforce recovery to finish,
+ * ensuring that the cluster can be used by pg_rewind. Note that if
+ * no_ensure_shutdown is specified, pg_rewind ignores this step, and users
+ * need to make sure by themselves that the target cluster is in a clean
+ * state.
+ */
+ buffer = slurpFile(datadir_target, "global/pg_control", &size);
+ digestControlFile(&ControlFile_target, buffer, size);
+ pg_free(buffer);
+
+ if (!no_ensure_shutdown &&
+ ControlFile_target.state != DB_SHUTDOWNED &&
+ ControlFile_target.state != DB_SHUTDOWNED_IN_RECOVERY)
+ {
+ ensureCleanShutdown(argv[0]);
+
+ buffer = slurpFile(datadir_target, "global/pg_control", &size);
+ digestControlFile(&ControlFile_target, buffer, size);
+ pg_free(buffer);
+ }
+
+ buffer = source->fetch_file(source, "global/pg_control", &size);
+ digestControlFile(&ControlFile_source, buffer, size);
+ pg_free(buffer);
+
+ sanityChecks();
+
+ /*
+ * Find the common ancestor timeline between the clusters.
+ *
+ * If both clusters are already on the same timeline, there's nothing to
+ * do.
+ */
+ if (ControlFile_target.checkPointCopy.ThisTimeLineID ==
+ ControlFile_source.checkPointCopy.ThisTimeLineID)
+ {
+ pg_log_info("source and target cluster are on the same timeline");
+ rewind_needed = false;
+ target_wal_endrec = 0;
+ }
+ else
+ {
+ XLogRecPtr chkptendrec;
+
+ findCommonAncestorTimeline(&divergerec, &lastcommontliIndex);
+ pg_log_info("servers diverged at WAL location %X/%X on timeline %u",
+ LSN_FORMAT_ARGS(divergerec),
+ targetHistory[lastcommontliIndex].tli);
+
+ /*
+ * Determine the end-of-WAL on the target.
+ *
+ * The WAL ends at the last shutdown checkpoint, or at
+ * minRecoveryPoint if it was a standby. (If we supported rewinding a
+ * server that was not shut down cleanly, we would need to replay
+ * until we reach the first invalid record, like crash recovery does.)
+ */
+
+ /* read the checkpoint record on the target to see where it ends. */
+ chkptendrec = readOneRecord(datadir_target,
+ ControlFile_target.checkPoint,
+ targetNentries - 1,
+ restore_command);
+
+ if (ControlFile_target.minRecoveryPoint > chkptendrec)
+ {
+ target_wal_endrec = ControlFile_target.minRecoveryPoint;
+ }
+ else
+ {
+ target_wal_endrec = chkptendrec;
+ }
+
+ /*
+ * Check for the possibility that the target is in fact a direct
+ * ancestor of the source. In that case, there is no divergent history
+ * in the target that needs rewinding.
+ */
+ if (target_wal_endrec > divergerec)
+ {
+ rewind_needed = true;
+ }
+ else
+ {
+ /* the last common checkpoint record must be part of target WAL */
+ Assert(target_wal_endrec == divergerec);
+
+ rewind_needed = false;
+ }
+ }
+
+ if (!rewind_needed)
+ {
+ pg_log_info("no rewind required");
+ if (writerecoveryconf && !dry_run)
+ WriteRecoveryConfig(conn, datadir_target,
+ GenerateRecoveryConfig(conn, NULL));
+ exit(0);
+ }
+
+ findLastCheckpoint(datadir_target, divergerec, lastcommontliIndex,
+ &chkptrec, &chkpttli, &chkptredo, restore_command);
+ pg_log_info("rewinding from last common checkpoint at %X/%X on timeline %u",
+ LSN_FORMAT_ARGS(chkptrec), chkpttli);
+
+ /* Initialize the hash table to track the status of each file */
+ filehash_init();
+
+ /*
+ * Collect information about all files in the both data directories.
+ */
+ if (showprogress)
+ pg_log_info("reading source file list");
+ source->traverse_files(source, &process_source_file);
+
+ if (showprogress)
+ pg_log_info("reading target file list");
+ traverse_datadir(datadir_target, &process_target_file);
+
+ /*
+ * Read the target WAL from last checkpoint before the point of fork, to
+ * extract all the pages that were modified on the target cluster after
+ * the fork.
+ */
+ if (showprogress)
+ pg_log_info("reading WAL in target");
+ extractPageMap(datadir_target, chkptrec, lastcommontliIndex,
+ target_wal_endrec, restore_command);
+
+ /*
+ * We have collected all information we need from both systems. Decide
+ * what to do with each file.
+ */
+ filemap = decide_file_actions();
+ if (showprogress)
+ calculate_totals(filemap);
+
+ /* this is too verbose even for verbose mode */
+ if (debug)
+ print_filemap(filemap);
+
+ /*
+ * Ok, we're ready to start copying things over.
+ */
+ if (showprogress)
+ {
+ pg_log_info("need to copy %lu MB (total source directory size is %lu MB)",
+ (unsigned long) (filemap->fetch_size / (1024 * 1024)),
+ (unsigned long) (filemap->total_size / (1024 * 1024)));
+
+ fetch_size = filemap->fetch_size;
+ fetch_done = 0;
+ }
+
+ /*
+ * We have now collected all the information we need from both systems,
+ * and we are ready to start modifying the target directory.
+ *
+ * This is the point of no return. Once we start copying things, there is
+ * no turning back!
+ */
+ perform_rewind(filemap, source, chkptrec, chkpttli, chkptredo);
+
+ if (showprogress)
+ pg_log_info("syncing target data directory");
+ sync_target_dir();
+
+ /* Also update the standby configuration, if requested. */
+ if (writerecoveryconf && !dry_run)
+ WriteRecoveryConfig(conn, datadir_target,
+ GenerateRecoveryConfig(conn, NULL));
+
+ /* don't need the source connection anymore */
+ source->destroy(source);
+ if (conn)
+ {
+ PQfinish(conn);
+ conn = NULL;
+ }
+
+ pg_log_info("Done!");
+
+ return 0;
+}
+
+/*
+ * Perform the rewind.
+ *
+ * We have already collected all the information we need from the
+ * target and the source.
+ */
+static void
+perform_rewind(filemap_t *filemap, rewind_source *source,
+ XLogRecPtr chkptrec,
+ TimeLineID chkpttli,
+ XLogRecPtr chkptredo)
+{
+ XLogRecPtr endrec;
+ TimeLineID endtli;
+ ControlFileData ControlFile_new;
+ size_t size;
+ char *buffer;
+
+ /*
+ * Execute the actions in the file map, fetching data from the source
+ * system as needed.
+ */
+ for (int i = 0; i < filemap->nentries; i++)
+ {
+ file_entry_t *entry = filemap->entries[i];
+
+ /*
+ * If this is a relation file, copy the modified blocks.
+ *
+ * This is in addition to any other changes.
+ */
+ if (entry->target_pages_to_overwrite.bitmapsize > 0)
+ {
+ datapagemap_iterator_t *iter;
+ BlockNumber blkno;
+ off_t offset;
+
+ iter = datapagemap_iterate(&entry->target_pages_to_overwrite);
+ while (datapagemap_next(iter, &blkno))
+ {
+ offset = blkno * BLCKSZ;
+ source->queue_fetch_range(source, entry->path, offset, BLCKSZ);
+ }
+ pg_free(iter);
+ }
+
+ switch (entry->action)
+ {
+ case FILE_ACTION_NONE:
+ /* nothing else to do */
+ break;
+
+ case FILE_ACTION_COPY:
+ source->queue_fetch_file(source, entry->path, entry->source_size);
+ break;
+
+ case FILE_ACTION_TRUNCATE:
+ truncate_target_file(entry->path, entry->source_size);
+ break;
+
+ case FILE_ACTION_COPY_TAIL:
+ source->queue_fetch_range(source, entry->path,
+ entry->target_size,
+ entry->source_size - entry->target_size);
+ break;
+
+ case FILE_ACTION_REMOVE:
+ remove_target(entry);
+ break;
+
+ case FILE_ACTION_CREATE:
+ create_target(entry);
+ break;
+
+ case FILE_ACTION_UNDECIDED:
+ pg_fatal("no action decided for file \"%s\"", entry->path);
+ break;
+ }
+ }
+
+ /* Complete any remaining range-fetches that we queued up above. */
+ source->finish_fetch(source);
+
+ close_target_file();
+
+ progress_report(true);
+
+ /*
+ * Fetch the control file from the source last. This ensures that the
+ * minRecoveryPoint is up-to-date.
+ */
+ buffer = source->fetch_file(source, "global/pg_control", &size);
+ digestControlFile(&ControlFile_source_after, buffer, size);
+ pg_free(buffer);
+
+ /*
+ * Sanity check: If the source is a local system, the control file should
+ * not have changed since we started.
+ *
+ * XXX: We assume it hasn't been modified, but actually, what could go
+ * wrong? The logic handles a libpq source that's modified concurrently,
+ * why not a local datadir?
+ */
+ if (datadir_source &&
+ memcmp(&ControlFile_source, &ControlFile_source_after,
+ sizeof(ControlFileData)) != 0)
+ {
+ pg_fatal("source system was modified while pg_rewind was running");
+ }
+
+ if (showprogress)
+ pg_log_info("creating backup label and updating control file");
+
+ /*
+ * Create a backup label file, to tell the target where to begin the WAL
+ * replay. Normally, from the last common checkpoint between the source
+ * and the target. But if the source is a standby server, it's possible
+ * that the last common checkpoint is *after* the standby's restartpoint.
+ * That implies that the source server has applied the checkpoint record,
+ * but hasn't performed a corresponding restartpoint yet. Make sure we
+ * start at the restartpoint's redo point in that case.
+ *
+ * Use the old version of the source's control file for this. The server
+ * might have finished the restartpoint after we started copying files,
+ * but we must begin from the redo point at the time that started copying.
+ */
+ if (ControlFile_source.checkPointCopy.redo < chkptredo)
+ {
+ chkptredo = ControlFile_source.checkPointCopy.redo;
+ chkpttli = ControlFile_source.checkPointCopy.ThisTimeLineID;
+ chkptrec = ControlFile_source.checkPoint;
+ }
+ createBackupLabel(chkptredo, chkpttli, chkptrec);
+
+ /*
+ * Update control file of target, to tell the target how far it must
+ * replay the WAL (minRecoveryPoint).
+ */
+ if (connstr_source)
+ {
+ /*
+ * The source is a live server. Like in an online backup, it's
+ * important that we recover all the WAL that was generated while we
+ * were copying files.
+ */
+ if (ControlFile_source_after.state == DB_IN_ARCHIVE_RECOVERY)
+ {
+ /*
+ * Source is a standby server. We must replay to its
+ * minRecoveryPoint.
+ */
+ endrec = ControlFile_source_after.minRecoveryPoint;
+ endtli = ControlFile_source_after.minRecoveryPointTLI;
+ }
+ else
+ {
+ /*
+ * Source is a production, non-standby, server. We must replay to
+ * the last WAL insert location.
+ */
+ if (ControlFile_source_after.state != DB_IN_PRODUCTION)
+ pg_fatal("source system was in unexpected state at end of rewind");
+
+ endrec = source->get_current_wal_insert_lsn(source);
+ endtli = ControlFile_source_after.checkPointCopy.ThisTimeLineID;
+ }
+ }
+ else
+ {
+ /*
+ * Source is a local data directory. It should've shut down cleanly,
+ * and we must replay to the latest shutdown checkpoint.
+ */
+ endrec = ControlFile_source_after.checkPoint;
+ endtli = ControlFile_source_after.checkPointCopy.ThisTimeLineID;
+ }
+
+ memcpy(&ControlFile_new, &ControlFile_source_after, sizeof(ControlFileData));
+ ControlFile_new.minRecoveryPoint = endrec;
+ ControlFile_new.minRecoveryPointTLI = endtli;
+ ControlFile_new.state = DB_IN_ARCHIVE_RECOVERY;
+ if (!dry_run)
+ update_controlfile(datadir_target, &ControlFile_new, do_sync);
+}
+
+static void
+sanityChecks(void)
+{
+ /* TODO Check that there's no backup_label in either cluster */
+
+ /* Check system_identifier match */
+ if (ControlFile_target.system_identifier != ControlFile_source.system_identifier)
+ pg_fatal("source and target clusters are from different systems");
+
+ /* check version */
+ if (ControlFile_target.pg_control_version != PG_CONTROL_VERSION ||
+ ControlFile_source.pg_control_version != PG_CONTROL_VERSION ||
+ ControlFile_target.catalog_version_no != CATALOG_VERSION_NO ||
+ ControlFile_source.catalog_version_no != CATALOG_VERSION_NO)
+ {
+ pg_fatal("clusters are not compatible with this version of pg_rewind");
+ }
+
+ /*
+ * Target cluster need to use checksums or hint bit wal-logging, this to
+ * prevent from data corruption that could occur because of hint bits.
+ */
+ if (ControlFile_target.data_checksum_version != PG_DATA_CHECKSUM_VERSION &&
+ !ControlFile_target.wal_log_hints)
+ {
+ pg_fatal("target server needs to use either data checksums or \"wal_log_hints = on\"");
+ }
+
+ /*
+ * Target cluster better not be running. This doesn't guard against
+ * someone starting the cluster concurrently. Also, this is probably more
+ * strict than necessary; it's OK if the target node was not shut down
+ * cleanly, as long as it isn't running at the moment.
+ */
+ if (ControlFile_target.state != DB_SHUTDOWNED &&
+ ControlFile_target.state != DB_SHUTDOWNED_IN_RECOVERY)
+ pg_fatal("target server must be shut down cleanly");
+
+ /*
+ * When the source is a data directory, also require that the source
+ * server is shut down. There isn't any very strong reason for this
+ * limitation, but better safe than sorry.
+ */
+ if (datadir_source &&
+ ControlFile_source.state != DB_SHUTDOWNED &&
+ ControlFile_source.state != DB_SHUTDOWNED_IN_RECOVERY)
+ pg_fatal("source data directory must be shut down cleanly");
+}
+
+/*
+ * Print a progress report based on the fetch_size and fetch_done variables.
+ *
+ * Progress report is written at maximum once per second, except that the
+ * last progress report is always printed.
+ *
+ * If finished is set to true, this is the last progress report. The cursor
+ * is moved to the next line.
+ */
+void
+progress_report(bool finished)
+{
+ static pg_time_t last_progress_report = 0;
+ int percent;
+ char fetch_done_str[32];
+ char fetch_size_str[32];
+ pg_time_t now;
+
+ if (!showprogress)
+ return;
+
+ now = time(NULL);
+ if (now == last_progress_report && !finished)
+ return; /* Max once per second */
+
+ last_progress_report = now;
+ percent = fetch_size ? (int) ((fetch_done) * 100 / fetch_size) : 0;
+
+ /*
+ * Avoid overflowing past 100% or the full size. This may make the total
+ * size number change as we approach the end of the backup (the estimate
+ * will always be wrong if WAL is included), but that's better than having
+ * the done column be bigger than the total.
+ */
+ if (percent > 100)
+ percent = 100;
+ if (fetch_done > fetch_size)
+ fetch_size = fetch_done;
+
+ snprintf(fetch_done_str, sizeof(fetch_done_str), UINT64_FORMAT,
+ fetch_done / 1024);
+ snprintf(fetch_size_str, sizeof(fetch_size_str), UINT64_FORMAT,
+ fetch_size / 1024);
+
+ fprintf(stderr, _("%*s/%s kB (%d%%) copied"),
+ (int) strlen(fetch_size_str), fetch_done_str, fetch_size_str,
+ percent);
+
+ /*
+ * Stay on the same line if reporting to a terminal and we're not done
+ * yet.
+ */
+ fputc((!finished && isatty(fileno(stderr))) ? '\r' : '\n', stderr);
+}
+
+/*
+ * Find minimum from two WAL locations assuming InvalidXLogRecPtr means
+ * infinity as src/include/access/timeline.h states. This routine should
+ * be used only when comparing WAL locations related to history files.
+ */
+static XLogRecPtr
+MinXLogRecPtr(XLogRecPtr a, XLogRecPtr b)
+{
+ if (XLogRecPtrIsInvalid(a))
+ return b;
+ else if (XLogRecPtrIsInvalid(b))
+ return a;
+ else
+ return Min(a, b);
+}
+
+/*
+ * Retrieve timeline history for given control file which should behold
+ * either source or target.
+ */
+static TimeLineHistoryEntry *
+getTimelineHistory(ControlFileData *controlFile, int *nentries)
+{
+ TimeLineHistoryEntry *history;
+ TimeLineID tli;
+
+ tli = controlFile->checkPointCopy.ThisTimeLineID;
+
+ /*
+ * Timeline 1 does not have a history file, so there is no need to check
+ * and fake an entry with infinite start and end positions.
+ */
+ if (tli == 1)
+ {
+ history = (TimeLineHistoryEntry *) pg_malloc(sizeof(TimeLineHistoryEntry));
+ history->tli = tli;
+ history->begin = history->end = InvalidXLogRecPtr;
+ *nentries = 1;
+ }
+ else
+ {
+ char path[MAXPGPATH];
+ char *histfile;
+
+ TLHistoryFilePath(path, tli);
+
+ /* Get history file from appropriate source */
+ if (controlFile == &ControlFile_source)
+ histfile = source->fetch_file(source, path, NULL);
+ else if (controlFile == &ControlFile_target)
+ histfile = slurpFile(datadir_target, path, NULL);
+ else
+ pg_fatal("invalid control file");
+
+ history = rewind_parseTimeLineHistory(histfile, tli, nentries);
+ pg_free(histfile);
+ }
+
+ if (debug)
+ {
+ int i;
+
+ if (controlFile == &ControlFile_source)
+ pg_log_debug("Source timeline history:");
+ else if (controlFile == &ControlFile_target)
+ pg_log_debug("Target timeline history:");
+ else
+ Assert(false);
+
+ /*
+ * Print the target timeline history.
+ */
+ for (i = 0; i < targetNentries; i++)
+ {
+ TimeLineHistoryEntry *entry;
+
+ entry = &history[i];
+ pg_log_debug("%u: %X/%X - %X/%X", entry->tli,
+ LSN_FORMAT_ARGS(entry->begin),
+ LSN_FORMAT_ARGS(entry->end));
+ }
+ }
+
+ return history;
+}
+
+/*
+ * Determine the TLI of the last common timeline in the timeline history of the
+ * two clusters. targetHistory is filled with target timeline history and
+ * targetNentries is number of items in targetHistory. *tliIndex is set to the
+ * index of last common timeline in targetHistory array, and *recptr is set to
+ * the position where the timeline history diverged (ie. the first WAL record
+ * that's not the same in both clusters).
+ *
+ * Control files of both clusters must be read into ControlFile_target/source
+ * before calling this routine.
+ */
+static void
+findCommonAncestorTimeline(XLogRecPtr *recptr, int *tliIndex)
+{
+ TimeLineHistoryEntry *sourceHistory;
+ int sourceNentries;
+ int i,
+ n;
+
+ /* Retrieve timelines for both source and target */
+ sourceHistory = getTimelineHistory(&ControlFile_source, &sourceNentries);
+ targetHistory = getTimelineHistory(&ControlFile_target, &targetNentries);
+
+ /*
+ * Trace the history forward, until we hit the timeline diverge. It may
+ * still be possible that the source and target nodes used the same
+ * timeline number in their history but with different start position
+ * depending on the history files that each node has fetched in previous
+ * recovery processes. Hence check the start position of the new timeline
+ * as well and move down by one extra timeline entry if they do not match.
+ */
+ n = Min(sourceNentries, targetNentries);
+ for (i = 0; i < n; i++)
+ {
+ if (sourceHistory[i].tli != targetHistory[i].tli ||
+ sourceHistory[i].begin != targetHistory[i].begin)
+ break;
+ }
+
+ if (i > 0)
+ {
+ i--;
+ *recptr = MinXLogRecPtr(sourceHistory[i].end, targetHistory[i].end);
+ *tliIndex = i;
+
+ pg_free(sourceHistory);
+ return;
+ }
+ else
+ {
+ pg_fatal("could not find common ancestor of the source and target cluster's timelines");
+ }
+}
+
+
+/*
+ * Create a backup_label file that forces recovery to begin at the last common
+ * checkpoint.
+ */
+static void
+createBackupLabel(XLogRecPtr startpoint, TimeLineID starttli, XLogRecPtr checkpointloc)
+{
+ XLogSegNo startsegno;
+ time_t stamp_time;
+ char strfbuf[128];
+ char xlogfilename[MAXFNAMELEN];
+ struct tm *tmp;
+ char buf[1000];
+ int len;
+
+ XLByteToSeg(startpoint, startsegno, WalSegSz);
+ XLogFileName(xlogfilename, starttli, startsegno, WalSegSz);
+
+ /*
+ * Construct backup label file
+ */
+ stamp_time = time(NULL);
+ tmp = localtime(&stamp_time);
+ strftime(strfbuf, sizeof(strfbuf), "%Y-%m-%d %H:%M:%S %Z", tmp);
+
+ len = snprintf(buf, sizeof(buf),
+ "START WAL LOCATION: %X/%X (file %s)\n"
+ "CHECKPOINT LOCATION: %X/%X\n"
+ "BACKUP METHOD: pg_rewind\n"
+ "BACKUP FROM: standby\n"
+ "START TIME: %s\n",
+ /* omit LABEL: line */
+ LSN_FORMAT_ARGS(startpoint), xlogfilename,
+ LSN_FORMAT_ARGS(checkpointloc),
+ strfbuf);
+ if (len >= sizeof(buf))
+ pg_fatal("backup label buffer too small"); /* shouldn't happen */
+
+ /* TODO: move old file out of the way, if any. */
+ open_target_file("backup_label", true); /* BACKUP_LABEL_FILE */
+ write_target_range(buf, 0, len);
+ close_target_file();
+}
+
+/*
+ * Check CRC of control file
+ */
+static void
+checkControlFile(ControlFileData *ControlFile)
+{
+ pg_crc32c crc;
+
+ /* Calculate CRC */
+ INIT_CRC32C(crc);
+ COMP_CRC32C(crc, (char *) ControlFile, offsetof(ControlFileData, crc));
+ FIN_CRC32C(crc);
+
+ /* And simply compare it */
+ if (!EQ_CRC32C(crc, ControlFile->crc))
+ pg_fatal("unexpected control file CRC");
+}
+
+/*
+ * Verify control file contents in the buffer 'content', and copy it to
+ * *ControlFile.
+ */
+static void
+digestControlFile(ControlFileData *ControlFile, const char *content,
+ size_t size)
+{
+ if (size != PG_CONTROL_FILE_SIZE)
+ pg_fatal("unexpected control file size %d, expected %d",
+ (int) size, PG_CONTROL_FILE_SIZE);
+
+ memcpy(ControlFile, content, sizeof(ControlFileData));
+
+ /* set and validate WalSegSz */
+ WalSegSz = ControlFile->xlog_seg_size;
+
+ if (!IsValidWalSegSize(WalSegSz))
+ pg_fatal(ngettext("WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte",
+ "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes",
+ WalSegSz),
+ WalSegSz);
+
+ /* Additional checks on control file */
+ checkControlFile(ControlFile);
+}
+
+/*
+ * Get value of GUC parameter restore_command from the target cluster.
+ *
+ * This uses a logic based on "postgres -C" to get the value from the
+ * cluster.
+ */
+static void
+getRestoreCommand(const char *argv0)
+{
+ int rc;
+ char postgres_exec_path[MAXPGPATH],
+ cmd_output[MAXPGPATH];
+ PQExpBuffer postgres_cmd;
+
+ if (!restore_wal)
+ return;
+
+ /* find postgres executable */
+ rc = find_other_exec(argv0, "postgres",
+ PG_BACKEND_VERSIONSTR,
+ postgres_exec_path);
+
+ if (rc < 0)
+ {
+ char full_path[MAXPGPATH];
+
+ if (find_my_exec(argv0, full_path) < 0)
+ strlcpy(full_path, progname, sizeof(full_path));
+
+ if (rc == -1)
+ pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"",
+ "postgres", progname, full_path);
+ else
+ pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s",
+ "postgres", full_path, progname);
+ }
+
+ /*
+ * Build a command able to retrieve the value of GUC parameter
+ * restore_command, if set.
+ */
+ postgres_cmd = createPQExpBuffer();
+
+ /* path to postgres, properly quoted */
+ appendShellString(postgres_cmd, postgres_exec_path);
+
+ /* add -D switch, with properly quoted data directory */
+ appendPQExpBufferStr(postgres_cmd, " -D ");
+ appendShellString(postgres_cmd, datadir_target);
+
+ /* add custom configuration file only if requested */
+ if (config_file != NULL)
+ {
+ appendPQExpBufferStr(postgres_cmd, " -c config_file=");
+ appendShellString(postgres_cmd, config_file);
+ }
+
+ /* add -C switch, for restore_command */
+ appendPQExpBufferStr(postgres_cmd, " -C restore_command");
+
+ if (!pipe_read_line(postgres_cmd->data, cmd_output, sizeof(cmd_output)))
+ exit(1);
+
+ (void) pg_strip_crlf(cmd_output);
+
+ if (strcmp(cmd_output, "") == 0)
+ pg_fatal("restore_command is not set in the target cluster");
+
+ restore_command = pg_strdup(cmd_output);
+
+ pg_log_debug("using for rewind restore_command = \'%s\'",
+ restore_command);
+
+ destroyPQExpBuffer(postgres_cmd);
+}
+
+
+/*
+ * Ensure clean shutdown of target instance by launching single-user mode
+ * postgres to do crash recovery.
+ */
+static void
+ensureCleanShutdown(const char *argv0)
+{
+ int ret;
+#define MAXCMDLEN (2 * MAXPGPATH)
+ char exec_path[MAXPGPATH];
+ PQExpBuffer postgres_cmd;
+
+ /* locate postgres binary */
+ if ((ret = find_other_exec(argv0, "postgres",
+ PG_BACKEND_VERSIONSTR,
+ exec_path)) < 0)
+ {
+ char full_path[MAXPGPATH];
+
+ if (find_my_exec(argv0, full_path) < 0)
+ strlcpy(full_path, progname, sizeof(full_path));
+
+ if (ret == -1)
+ pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"",
+ "postgres", progname, full_path);
+ else
+ pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s",
+ "postgres", full_path, progname);
+ }
+
+ pg_log_info("executing \"%s\" for target server to complete crash recovery",
+ exec_path);
+
+ /*
+ * Skip processing if requested, but only after ensuring presence of
+ * postgres.
+ */
+ if (dry_run)
+ return;
+
+ /*
+ * Finally run postgres in single-user mode. There is no need to use
+ * fsync here. This makes the recovery faster, and the target data folder
+ * is synced at the end anyway.
+ */
+ postgres_cmd = createPQExpBuffer();
+
+ /* path to postgres, properly quoted */
+ appendShellString(postgres_cmd, exec_path);
+
+ /* add set of options with properly quoted data directory */
+ appendPQExpBufferStr(postgres_cmd, " --single -F -D ");
+ appendShellString(postgres_cmd, datadir_target);
+
+ /* add custom configuration file only if requested */
+ if (config_file != NULL)
+ {
+ appendPQExpBufferStr(postgres_cmd, " -c config_file=");
+ appendShellString(postgres_cmd, config_file);
+ }
+
+ /* finish with the database name, and a properly quoted redirection */
+ appendPQExpBufferStr(postgres_cmd, " template1 < ");
+ appendShellString(postgres_cmd, DEVNULL);
+
+ if (system(postgres_cmd->data) != 0)
+ {
+ pg_log_error("postgres single-user mode in target cluster failed");
+ pg_log_error_detail("Command was: %s", postgres_cmd->data);
+ exit(1);
+ }
+
+ destroyPQExpBuffer(postgres_cmd);
+}
+
+static void
+disconnect_atexit(void)
+{
+ if (conn != NULL)
+ PQfinish(conn);
+}
diff --git a/src/bin/pg_rewind/pg_rewind.h b/src/bin/pg_rewind/pg_rewind.h
new file mode 100644
index 0000000..393182f
--- /dev/null
+++ b/src/bin/pg_rewind/pg_rewind.h
@@ -0,0 +1,56 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_rewind.h
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef PG_REWIND_H
+#define PG_REWIND_H
+
+#include "access/timeline.h"
+#include "common/logging.h"
+#include "datapagemap.h"
+#include "libpq-fe.h"
+#include "storage/block.h"
+#include "storage/relfilenode.h"
+
+/* Configuration options */
+extern char *datadir_target;
+extern bool showprogress;
+extern bool dry_run;
+extern bool do_sync;
+extern int WalSegSz;
+
+/* Target history */
+extern TimeLineHistoryEntry *targetHistory;
+extern int targetNentries;
+
+/* Progress counters */
+extern uint64 fetch_size;
+extern uint64 fetch_done;
+
+/* in parsexlog.c */
+extern void extractPageMap(const char *datadir, XLogRecPtr startpoint,
+ int tliIndex, XLogRecPtr endpoint,
+ const char *restoreCommand);
+extern void findLastCheckpoint(const char *datadir, XLogRecPtr searchptr,
+ int tliIndex,
+ XLogRecPtr *lastchkptrec, TimeLineID *lastchkpttli,
+ XLogRecPtr *lastchkptredo,
+ const char *restoreCommand);
+extern XLogRecPtr readOneRecord(const char *datadir, XLogRecPtr ptr,
+ int tliIndex, const char *restoreCommand);
+
+/* in pg_rewind.c */
+extern void progress_report(bool finished);
+
+/* in timeline.c */
+extern TimeLineHistoryEntry *rewind_parseTimeLineHistory(char *buffer,
+ TimeLineID targetTLI,
+ int *nentries);
+
+#endif /* PG_REWIND_H */
diff --git a/src/bin/pg_rewind/po/de.po b/src/bin/pg_rewind/po/de.po
new file mode 100644
index 0000000..07a32f5
--- /dev/null
+++ b/src/bin/pg_rewind/po/de.po
@@ -0,0 +1,1010 @@
+# German message translation file for pg_rewind
+# Copyright (C) 2015-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-24 23:21+0000\n"
+"PO-Revision-Date: 2022-09-25 10:37+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "konnte Bibliothek »%s« nicht laden: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "auf dieser Plattform können keine beschränkten Token erzeugt werden: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "konnte Prozess-Token nicht öffnen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "konnte SIDs nicht erzeugen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "konnte beschränktes Token nicht erzeugen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "konnte Prozess für Befehl »%s« nicht starten: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "konnte Prozess nicht mit beschränktem Token neu starten: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu"
+
+#: ../../fe_utils/archive.c:52
+#, c-format
+msgid "cannot use restore_command with %%r placeholder"
+msgstr "kann restore_command mit Platzhalter %%r nicht verwenden"
+
+#: ../../fe_utils/archive.c:70
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "unerwartete Dateigröße für »%s«: %lld statt %lld"
+
+#: ../../fe_utils/archive.c:78
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "konnte aus dem Archiv wiederhergestellte Datei »%s« nicht öffnen: %m"
+
+#: ../../fe_utils/archive.c:87 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m"
+
+#: ../../fe_utils/archive.c:99
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_command fehlgeschlagen: %s"
+
+#: ../../fe_utils/archive.c:106
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "konnte Datei »%s« nicht aus Archiv wiederherstellen"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "Speicher aufgebraucht"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "konnte nicht in Datei »%s« schreiben: %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht erstellen: %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "konnte Zieldatei »%s« nicht öffnen: %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "konnte Zieldatei »%s« nicht schließen: %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "konnte Positionszeiger in Zieldatei »%s« nicht setzen: %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schreiben: %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "undefinierter Dateityp für »%s«"
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "ungültige Aktion (CREATE) für normale Datei"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht löschen: %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "konnte Datei »%s« nicht zum Kürzen öffnen: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "konnte Datei »%s« nicht auf %u kürzen: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht löschen: %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "konnte symbolische Verknüpfung »%s« nicht löschen: %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht lesen: %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht öffnen: %m"
+
+#: file_ops.c:446
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m"
+
+#: file_ops.c:449
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "Ziel für symbolische Verknüpfung »%s« ist zu lang"
+
+#: file_ops.c:464
+#, c-format
+msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+msgstr "»%s« ist eine symbolische Verknüpfung, aber symbolische Verknüpfungen werden auf dieser Plattform nicht unterstützt"
+
+#: file_ops.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht lesen: %m"
+
+#: file_ops.c:475
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht schließen: %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "Datendatei »%s« in der Quelle ist keine normale Datei"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "doppelte Quelldatei »%s«"
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "unerwartete Seitenänderung für nicht normale Datei »%s«"
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "unbekannter Dateityp für »%s«"
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "Datei »%s« hat unterschiedlichen Typ in Quelle und Ziel"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "konnte nicht entscheiden, was mit Datei »%s« zu tun ist"
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "konnte search_path nicht auf leer setzen: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "full_page_writes muss im Quell-Server eingeschaltet sein"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "konnte Anfrage zum Holen des Dateiinhalts nicht vorbereiten: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "Fehler beim Ausführen einer Anfrage (%s) auf dem Quellserver: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "Anfrage ergab unerwartete Ergebnismenge"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "Fehler beim Ausführen einer Anfrage (%s) im Quellserver: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "unbekanntes Ergebnis »%s« für aktuelle WAL-Einfügeposition"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "konnte Dateiliste nicht holen: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "unerwartete Ergebnismenge beim Holen der Dateiliste"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "konnte Anfrage nicht senden: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "konnte libpq-Verbindung nicht in den Einzelzeilenmodus setzen"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "unerwartetes Ergebnis beim Holen von fernen Dateien: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "mehr Daten-Chunks erhalten als verlangt"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "unerwartete Ergebnismengengröße beim Holen von fernen Dateien"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "unerwartete Datentypen in Ergebnismenge beim Holen von fernen Dateien: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "unerwartetes Ergebnisformat beim Holen von fernen Dateien"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "unerwartete NULL-Werte im Ergebnis beim Holen von fernen Dateien"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "unerwartete Ergebnislänge beim Holen von fernen Dateien"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "Daten für Datei »%s« erhalten, aber »%s« wurde verlangt"
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "Daten für Offset %lld von Datei »%s« erhalten, aber Offset %lld wurde verlangt"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "mehr als verlangt erhalten für Datei »%s«"
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "unerwartete Anzahl Daten-Chunks erhalten"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "konnte ferne Datei »%s« nicht holen: %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "unerwartete Ergebnismenge beim Holen der fernen Datei »%s«"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "konnte Quelldatei »%s« nicht öffnen: %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "Größe der Quelldatei »%s« nebenläufig verändert: %d Bytes erwartet, %d kopiert"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schließen: %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "konnte Positionszeiger in Quelldatei nicht setzen: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "unerwartetes EOF beim Lesen der Datei »%s«"
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "Speicher aufgebraucht beim Anlegen eines WAL-Leseprozessors"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "konnte WAL-Eintrag bei %X/%X nicht lesen: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "konnte WAL-Eintrag bei %X/%X nicht lesen"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "Endpunkt %X/%X ist kein gültiger Endpunkt; %X/%X erwartet"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "konnte vorangegangenen WAL-Eintrag bei %X/%X nicht finden: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "konnte vorangegangenen WAL-Eintrag bei %X/%X nicht finden"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "konnte Positionszeiger in Datei »%s« nicht setzen: %m"
+
+#: parsexlog.c:440
+#, c-format
+msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+msgstr "WAL-Eintrag modifiziert eine Relation, aber Typ des Eintrags wurde nicht erkannt: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:86
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s resynchronisiert einen PostgreSQL-Cluster mit einer Kopie des Clusters.\n"
+"\n"
+
+#: pg_rewind.c:87
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"Aufruf:\n"
+" %s [OPTION]...\n"
+"\n"
+
+#: pg_rewind.c:88
+#, c-format
+msgid "Options:\n"
+msgstr "Optionen:\n"
+
+#: pg_rewind.c:89
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal restore_command in der Zielkonfiguration zum\n"
+" Laden von WAL-Dateien aus Archiv verwenden\n"
+
+#: pg_rewind.c:91
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=VERZ bestehendes zu modifizierendes Datenverzeichnis\n"
+
+#: pg_rewind.c:92
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr ""
+" --source-pgdata=VERZ Quelldatenverzeichnis, mit dem synchronisiert\n"
+" werden soll\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=VERB Quellserver, mit dem synchronisiert werden soll\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run anhalten, bevor etwas geändert wird\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --no-sync nicht warten, bis Änderungen sicher auf\n"
+" Festplatte geschrieben sind\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress Fortschrittsmeldungen ausgeben\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf Konfiguration für Replikation schreiben\n"
+" (benötigt --source-server)\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=DATEINAME angegebene Serverkonfigurationsdatei zum\n"
+" Starten des Ziel-Clusters verwenden\n"
+
+#: pg_rewind.c:102
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug viele Debug-Meldungen ausgeben\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr " --no-ensure-shutdown unsauberen Shutdown nicht automatisch reparieren\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_rewind.c:105
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: pg_rewind.c:107
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237
+#: pg_rewind.c:244 pg_rewind.c:252
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_rewind.c:222
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "keine Quelle angegeben (--source-pgdata oder --source-server)"
+
+#: pg_rewind.c:229
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "--source-pgdata und --source-server können nicht zusammen angegeben werden"
+
+#: pg_rewind.c:236
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "kein Zielverzeichnis angegeben (--target-pgdata)"
+
+#: pg_rewind.c:243
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "kein Quellserver (--source-server) angegeben für --write-recovery-conf"
+
+#: pg_rewind.c:250
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_rewind.c:265
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "kann nicht von »root« ausgeführt werden"
+
+#: pg_rewind.c:266
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Sie müssen %s als PostgreSQL-Superuser ausführen."
+
+#: pg_rewind.c:276
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %m"
+
+#: pg_rewind.c:294
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:297
+#, c-format
+msgid "connected to server"
+msgstr "mit Server verbunden"
+
+#: pg_rewind.c:344
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "Quell- und Ziel-Cluster sind auf der gleichen Zeitleiste"
+
+#: pg_rewind.c:353
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "Server divergierten bei WAL-Position %X/%X auf Zeitleiste %u"
+
+#: pg_rewind.c:401
+#, c-format
+msgid "no rewind required"
+msgstr "kein Rückspulen nötig"
+
+#: pg_rewind.c:410
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "Rückspulen ab letztem gemeinsamen Checkpoint bei %X/%X auf Zeitleiste %u"
+
+#: pg_rewind.c:420
+#, c-format
+msgid "reading source file list"
+msgstr "lese Quelldateiliste"
+
+#: pg_rewind.c:424
+#, c-format
+msgid "reading target file list"
+msgstr "lese Zieldateiliste"
+
+#: pg_rewind.c:433
+#, c-format
+msgid "reading WAL in target"
+msgstr "lese WAL im Ziel-Cluster"
+
+#: pg_rewind.c:454
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "%lu MB müssen kopiert werden (Gesamtgröße des Quellverzeichnisses ist %lu MB)"
+
+#: pg_rewind.c:472
+#, c-format
+msgid "syncing target data directory"
+msgstr "synchronisiere Zieldatenverzeichnis"
+
+#: pg_rewind.c:488
+#, c-format
+msgid "Done!"
+msgstr "Fertig!"
+
+#: pg_rewind.c:568
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "keine Aktion bestimmt für Datei »%s«"
+
+#: pg_rewind.c:600
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "Quellsystem wurde verändert, während pg_rewind lief"
+
+#: pg_rewind.c:604
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "erzeuge Backup-Label und aktualisiere Kontrolldatei"
+
+#: pg_rewind.c:654
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "Quellsystem war in einem unerwarteten Zustand am Ende des Rückspulens"
+
+#: pg_rewind.c:685
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "Quell- und Ziel-Cluster sind von verschiedenen Systemen"
+
+#: pg_rewind.c:693
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "die Cluster sind nicht mit dieser Version von pg_rewind kompatibel"
+
+#: pg_rewind.c:703
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "Zielserver muss entweder Datenprüfsummen oder »wal_log_hints = on« verwenden"
+
+#: pg_rewind.c:714
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "Zielserver muss sauber heruntergefahren worden sein"
+
+#: pg_rewind.c:724
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "Quelldatenverzeichnis muss sauber heruntergefahren worden sein"
+
+#: pg_rewind.c:771
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) kopiert"
+
+#: pg_rewind.c:834
+#, c-format
+msgid "invalid control file"
+msgstr "ungültige Kontrolldatei"
+
+#: pg_rewind.c:918
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "konnte keinen gemeinsamen Anfangspunkt in den Zeitleisten von Quell- und Ziel-Cluster finden"
+
+#: pg_rewind.c:959
+#, c-format
+msgid "backup label buffer too small"
+msgstr "Puffer für Backup-Label ist zu klein"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "unerwartete CRC in Kontrolldatei"
+
+#: pg_rewind.c:994
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "unerwartete Kontrolldateigröße %d, erwartet wurde %d"
+
+#: pg_rewind.c:1003
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber die Kontrolldatei gibt %d Byte an"
+msgstr[1] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber die Kontrolldatei gibt %d Bytes an"
+
+#: pg_rewind.c:1042 pg_rewind.c:1112
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden"
+
+#: pg_rewind.c:1045 pg_rewind.c:1115
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s"
+
+#: pg_rewind.c:1078
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "restore_command ist im Ziel-Cluster nicht gesetzt"
+
+#: pg_rewind.c:1119
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "führe »%s« für Zielserver aus, um Wiederherstellung abzuschließen"
+
+#: pg_rewind.c:1156
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "postgres im Einzelbenutzermodus im Ziel-Cluster fehlgeschlagen"
+
+#: pg_rewind.c:1157
+#, c-format
+msgid "Command was: %s"
+msgstr "Die Anweisung war: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "Syntaxfehler in History-Datei: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "Eine numerische Zeitleisten-ID wurde erwartet."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "Eine Write-Ahead-Log-Switchpoint-Position wurde erwartet."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "ungültige Daten in History-Datei: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "Zeitleisten-IDs müssen in aufsteigender Folge sein."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "ungültige Daten in History-Datei"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "Zeitleisten-IDs müssen kleiner als die Zeitleisten-ID des Kindes sein."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "ungültiger Datensatz-Offset bei %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "Contrecord angefordert von %X/%X"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "ungültige Datensatzlänge bei %X/%X: %u erwartet, %u erhalten"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "Speicher aufgebraucht beim Versuch einen Datensatz mit Länge %u zu dekodieren"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "Datensatzlänge %u bei %X/%X ist zu lang"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "keine Contrecord-Flag bei %X/%X"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "ungültige Contrecord-Länge %u (erwartet %lld) bei %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "Contrecord fehlt bei %X/%X"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ungültige Resource-Manager-ID %u bei %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "Datensatz mit falschem Prev-Link %X/%X bei %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "ungültige Resource-Manager-Datenprüfsumme in Datensatz bei %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "ungültige magische Zahl %04X in Logsegment %s, Offset %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "ungültige Info-Bits %04X in Logsegment %s, Offset %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "WAL-Datei ist von einem anderen Datenbanksystem: Datenbanksystemidentifikator in WAL-Datei ist %llu, Datenbanksystemidentifikator in pg_control ist %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche Segmentgröße im Seitenkopf"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche XLOG_BLCKSZ im Seitenkopf"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "unerwartete Pageaddr %X/%X in Logsegment %s, Offset %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "Zeitleisten-ID %u außer der Reihe (nach %u) in Logsegment %s, Offset %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id %u außer der Reihe bei %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA gesetzt, aber keine Daten enthalten bei %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA nicht gesetzt, aber Datenlänge ist %u bei %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE gesetzt, aber Loch Offset %u Länge %u Block-Abbild-Länge %u bei %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE nicht gesetzt, aber Loch Offset %u Länge %u bei %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge %u bei %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "weder BKPIMAGE_HAS_HOLE noch BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge ist %u bei %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL gesetzt, aber keine vorangehende Relation bei %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "ungültige block_id %u bei %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "Datensatz mit ungültiger Länge bei %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "konnte Backup-Block mit ID %d nicht im WAL-Eintrag finden"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "konnte Abbild bei %X/%X mit ungültigem angegebenen Block %d nicht wiederherstellen"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "konnte Abbild mit ungültigem Zustand bei %X/%X nicht wiederherstellen, Block %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit %s, nicht unterstützt von dieser Installation, Block %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit unbekannter Methode, Block %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "konnte Abbild bei %X/%X nicht dekomprimieren, Block %d"
diff --git a/src/bin/pg_rewind/po/el.po b/src/bin/pg_rewind/po/el.po
new file mode 100644
index 0000000..44cfc69
--- /dev/null
+++ b/src/bin/pg_rewind/po/el.po
@@ -0,0 +1,1016 @@
+# Greek message translation file for pg_rewind
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_rewind (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-14 09:20+0000\n"
+"PO-Revision-Date: 2023-04-14 14:32+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "προειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέρεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "έλλειψη μνήμης\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "δεν ήταν δυνατή η αντιγραφή δείκτη null (εσωτερικό σφάλμα)\n"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "δεν ήταν δυνατή η φόρτωση της βιβλιοθήκης «%s»: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "δεν ήταν δυνατή η δημιουργία διακριτικών περιορισμού στην παρούσα πλατφόρμα: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "δεν ήταν δυνατό το άνοιγμα διακριτικού διεργασίας: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "δεν ήταν δυνατή η εκχώρηση SID: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "δεν ήταν δυνατή η δημιουργία διακριτικού διεργασίας: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "δεν ήταν δυνατή η εκκίνηση διεργασίας για την εντολή «%s»: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "δεν ήταν δυνατή η επανεκκίνηση με διακριτικό περιορισμού: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "δεν ήταν δυνατή η απόκτηση κωδικού εξόδου από την υποδιεργασία: κωδικός σφάλματος %lu"
+
+#: ../../fe_utils/archive.c:52
+#, c-format
+msgid "cannot use restore_command with %%r placeholder"
+msgstr "δεν είναι δυνατή η χρήση restore_command μαζί με %%r placeholder"
+
+#: ../../fe_utils/archive.c:70
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "μη αναμενόμενο μέγεθος αρχείου για «%s»: %lld αντί για %lld"
+
+#: ../../fe_utils/archive.c:78
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s» που έχει επαναφερθεί από την αρχειοθήκη: %m"
+
+#: ../../fe_utils/archive.c:87 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο «%s»: %m"
+
+#: ../../fe_utils/archive.c:99
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_command απέτυχε: %s"
+
+#: ../../fe_utils/archive.c:106
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "δεν ήταν δυνατή η επαναφορά του αρχείου «%s» από την αρχειοθήκη"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "έλλειψη μνήμης"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγραφή στο αρχείο «%s»: %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουργία αρχείου «%s»: %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου προορισμού «%s»: %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου προορισμού «%s»: %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αναζήτηση στο αρχείο προορισμού «%s»: %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγραφή αρχείου «%s»: %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "απροσδιόριστος τύπος αρχείου για το «%s»"
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "μη έγκυρη ενέργεια (CREATE) για κανονικό αρχείο"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αφαίρεση του αρχείου «%s»: %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s» για περικοπή: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "δεν ήταν δυνατή η περικοπή του αρχείου «%s» σε %u: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουργία του καταλόγου «%s»: %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αφαίρεση του καταλόγου «%s»: %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουργία του συμβολικού συνδέσμου «%s»: %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αφαίρεση της συμβολικής σύνδεσης «%s»: %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου «%s» για ανάγνωση: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: ανέγνωσε %d από %zu"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m"
+
+#: file_ops.c:446
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου «%s»: %m"
+
+#: file_ops.c:449
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "ο συμβολικός σύνδεσμος «%s» είναι πολύ μακρύς"
+
+#: file_ops.c:464
+#, c-format
+msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+msgstr "«%s» είναι ένας συμβολικός σύνδεσμος, αλλά οι συμβολικοί σύνδεσμοι δεν υποστηρίζονται σε αυτήν την πλατφόρμα"
+
+#: file_ops.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m"
+
+#: file_ops.c:475
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "το αρχείο «%s» δεν είναι ένα κανονικό αρχείο"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "διπλότυπο αρχείο προέλευσης «%s»"
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "μη αναμενόμενη τροποποίηση σελίδας για μη κανονικό αρχείο «%s»"
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "άγνωστος τύπος αρχείου για το «%s»"
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "το αρχείο «%s» είναι διαφορετικού τύπου στην προέλευση και τον προορισμό"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "δεν ήταν δυνατή η λήψη του αρχείου «%s»"
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "δεν ήταν δυνατή η εκκαθάριση του search_path: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "full_page_writes πρέπει να είναι ενεργοποιημένο στο διακομιστή προέλευσης"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "δεν ήταν δυνατή η προετοιμασία της δήλωσης για τη λήψη περιεχομένων αρχείου: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "σφάλμα κατά την εκτέλεση ερωτήματος (%s) στο διακομιστή προέλευσης: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "μη αναμενόμενο σύνολο αποτελεσμάτων από ερώτημα"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "σφάλμα κατά την εκτέλεση ερωτήματος (%s) στο διακομιστή προέλευσης: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "μη αναγνωρίσιμο αποτέλεσμα «%s» για την τρέχουσα θέση εισαγωγής WAL"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "δεν ήταν δυνατή η λήψη λίστας αρχείων: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "μη αναμενόμενο σύνολο αποτελεσμάτων κατά τη λήψη λίστας αρχείων"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "δεν ήταν δυνατή η αποστολή ερωτήματος: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "δεν ήταν δυνατή η ρύθμιση της σύνδεσης libpq σε λειτουργία μονής σειράς"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "μη αναμενόμενο αποτέλεσμα κατά τη λήψη απομακρυσμένων αρχείων: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "έλαβε περισσότερα τμήματα δεδομένων από όσα ζητήθηκαν"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "μη αναμενόμενο μέγεθος συνόλου αποτελεσμάτων κατά τη λήψη απομακρυσμένων αρχείων"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "μη αναμενόμενοι τύποι δεδομένων στο σύνολο αποτελεσμάτων κατά τη λήψη απομακρυσμένων αρχείων: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "μη αναμενόμενη μορφή αποτελέσματος κατά τη λήψη απομακρυσμένων αρχείων"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "μη αναμενόμενες τιμές null κατά τη λήψη απομακρυσμένων αρχείων"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "μη αναμενόμενο μήκος αποτελέσματος κατά τη λήψη απομακρυσμένων αρχείων"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "έλαβε δεδομένα για το αρχείο «%s», όταν ζητήθηκε το «%s»"
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "έλαβε δεδομένα σε μετατόπιση %lld του αρχείου «%s», όταν ζητήθηκε μετατόπιση %lld"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "έλαβε περισσότερα από όσα ζήτησε για το αρχείο «%s»"
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "έλαβε μη αναμενόμενο αριθμό τμημάτων δεδομένων"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η λήψη απομακρυσμένου αρχείου «%s»: %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "μη αναμενόμενο σύνολο αποτελεσμάτων κατά τη λήψη απομακρυσμένου αρχείου «%s»"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου προέλευσης «%s»: %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "το μέγεθος αρχείου πηγής «%s» άλλαξε σύγχρονα: αναμένονταν %d bytes, αντιγράφηκαν %d"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου «%s»: %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "δεν ήταν δυνατή η αναζήτηση στο αρχείο προέλευσης: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "μη αναμενόμενο EOF κατά την ανάγνωση αρχείου «%s»"
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "η μνήμη δεν επαρκεί για την εκχώρηση επεξεργαστή ανάγνωσης WAL"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "δεν ήταν δυνατή η ανάγνωση WAL εγγραφής στο %X/%X: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "δεν ήταν δυνατή η ανάγνωση WAL εγγραφής στο %X/%X"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "ο δείκτης τέλους %X/%X δεν είναι έγκυρο σημείο τέλους- αναμενόταν %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "δεν ήταν δυνατή η εύρεση προηγούμενης WAL εγγραφής σε %X/%X: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "δεν ήταν δυνατή η εύρεση προηγούμενης WAL εγγραφής σε %X/%X"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αναζήτηση στο αρχείο «%s»: %m"
+
+#: parsexlog.c:440
+#, c-format
+msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+msgstr "Η εγγραφή WAL τροποποιεί μια σχέση, αλλά ο τύπος εγγραφής δεν αναγνωρίζεται: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:86
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s επανασυγχρονίζει μία συστάδα PostgreSQL με ένα άλλο αντίγραφο της συστάδας.\n"
+"\n"
+
+#: pg_rewind.c:87
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"Χρήση:\n"
+" %s [ΕΠΙΛΟΓΗ]...\n"
+"\n"
+
+#: pg_rewind.c:88
+#, c-format
+msgid "Options:\n"
+msgstr "Επιλογές:\n"
+
+#: pg_rewind.c:89
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal χρησιμοποίησε restore_command στη ρύθμιση προορισμού για την\n"
+" ανάκτηση αρχείων WAL από αρχειοθήκες\n"
+
+#: pg_rewind.c:91
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=DIRECTORY υπάρχον κατάλογος δεδομένων προς τροποποιήση\n"
+
+#: pg_rewind.c:92
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=DIRECTORY κατάλογος δεδομένων προέλευσης για συγχρονισμό\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONNSTR διακομιστής προέλευσης για συγχρονισμό\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run τερματισμός πριν να τροποποιηθεί οτιδήποτε\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr " -N, --no-sync να μην αναμένει την ασφαλή εγγραφή αλλαγών στον δίσκο\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress εμφάνισε πληροφορίες προόδου\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf εγγραφή των ρυθμίσεων αναπαραγωγής\n"
+" (απαιτεί --source-server)\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=FILENAME χρησιμοποίησε το ορισμένο αρχείο ρυθμίσεων του βασικού διακομιστή\n"
+" κατά την εκτέλεση συστάδας προορισμού\n"
+
+#: pg_rewind.c:102
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug εγγραφή πολλών μηνύματων εντοπισμού σφαλμάτων\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr " --no-ensure-shutdown να μην διορθώνει αυτόματα ακάθαρτο τερματισμό\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_rewind.c:105
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφορές σφάλματων σε <%s>.\n"
+
+#: pg_rewind.c:107
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αρχική σελίδα: <%s>\n"
+
+#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237
+#: pg_rewind.c:244 pg_rewind.c:252
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες."
+
+#: pg_rewind.c:222
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "δεν καθορίστηκε προέλευση (--source-pgdata ή --source-server)"
+
+#: pg_rewind.c:229
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "μόνο ένα από τα --source-pgdata ή --source-server μπορεί να καθοριστεί"
+
+#: pg_rewind.c:236
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "δεν καθορίστηκε κατάλογος δεδομένων προορισμού (--target-pgdata)"
+
+#: pg_rewind.c:243
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "δεν καθορίστηκαν πληροφορίες διακομιστή προέλευσης (--source-server) για --write-recovery-conf"
+
+#: pg_rewind.c:250
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)"
+
+#: pg_rewind.c:265
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "δεν είναι δυνατή η εκτέλεση από «root»"
+
+#: pg_rewind.c:266
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Πρέπει να εκτελέσετε %s ως υπερχρήστης PostgreSQL."
+
+#: pg_rewind.c:276
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση δικαιωμάτων του καταλόγου «%s»: %m"
+
+#: pg_rewind.c:294
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:297
+#, c-format
+msgid "connected to server"
+msgstr "συνδεδεμένος στον διακομιστή"
+
+#: pg_rewind.c:344
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "συστάδες προορισμού και προέλευσης βρίσκονται στην ίδια χρονογραμμή"
+
+#: pg_rewind.c:353
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "οι διακομιστές αποκλίνουν στην τοποθεσία WAL %X/%X στη χρονογραμμή %u"
+
+#: pg_rewind.c:401
+#, c-format
+msgid "no rewind required"
+msgstr "δεν απαιτείται επαναφορά"
+
+#: pg_rewind.c:410
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "επαναφορά από το τελευταίο κοινό σημείο ελέγχου στο %X/%X στη χρονογραμμή %u"
+
+#: pg_rewind.c:420
+#, c-format
+msgid "reading source file list"
+msgstr "ανάγνωση λίστας αρχείων προέλευσης"
+
+#: pg_rewind.c:424
+#, c-format
+msgid "reading target file list"
+msgstr "ανάγνωση λίστας αρχείων προορισμού"
+
+#: pg_rewind.c:433
+#, c-format
+msgid "reading WAL in target"
+msgstr "ανάγνωση WAL στον προορισμό"
+
+#: pg_rewind.c:454
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "πρέπει να αντιγραφούν %lu MB (το συνολικό μέγεθος καταλόγου προέλευσης είναι %lu MB)"
+
+#: pg_rewind.c:472
+#, c-format
+msgid "syncing target data directory"
+msgstr "συγχρονισμός καταλόγου δεδομένων προορισμού"
+
+#: pg_rewind.c:488
+#, c-format
+msgid "Done!"
+msgstr "Ολοκληρώθηκε!"
+
+#: pg_rewind.c:568
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "καμία ενέργεια δεν αποφασίστηκε για το αρχείο «%s»"
+
+#: pg_rewind.c:600
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "το σύστημα προέλευσης τροποποιήθηκε κατά την εκτέλεση του pg_rewind"
+
+#: pg_rewind.c:604
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "δημιουργία ετικέτας αντιγράφων ασφαλείας και ενημέρωση αρχείου ελέγχου"
+
+#: pg_rewind.c:654
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "το σύστημα προέλευσης βρισκόταν σε μη αναμενόμενη κατάσταση στο τέλος της επαναφοράς"
+
+#: pg_rewind.c:685
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "οι συστάδες προέλευσης και προορισμού προέρχονται από διαφορετικά συστήματα"
+
+#: pg_rewind.c:693
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "η συστάδα δεν είναι συμβατή με αυτήν την έκδοση pg_rewind"
+
+#: pg_rewind.c:703
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "ο διακομιστής προορισμού πρέπει να χρησιμοποιεί είτε άθροισμα ελέγχου δεδομένων είτε «wal_log_hints = on»"
+
+#: pg_rewind.c:714
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "ο διακομιστής προορισμού πρέπει να τερματιστεί καθαρά"
+
+#: pg_rewind.c:724
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "ο κατάλογος δεδομένων προέλευσης πρέπει να τερματιστεί καθαρά"
+
+#: pg_rewind.c:771
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) αντιγράφηκαν"
+
+#: pg_rewind.c:834
+#, c-format
+msgid "invalid control file"
+msgstr "μη έγκυρο αρχείο ελέγχου"
+
+#: pg_rewind.c:918
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "δεν ήταν δυνατή η εύρεση κοινού προγόνου των χρονογραμμών των συστάδων προέλευσης και προορισμού"
+
+#: pg_rewind.c:959
+#, c-format
+msgid "backup label buffer too small"
+msgstr "ενδιάμεση μνήμη ετικέτας αντιγράφων ασφαλείας πολύ μικρή"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "μη αναμενόμενο αρχείο ελέγχου CRC"
+
+#: pg_rewind.c:994
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "μη αναμενόμενο μέγεθος αρχείου ελέγχου %d, αναμένεται %d"
+
+#: pg_rewind.c:1003
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "η τιμή του μεγέθους τμήματος WAL πρέπει να ανήκει σε δύναμη του δύο μεταξύ 1 MB και 1 GB, αλλά το αρχείο ελέγχου καθορίζει %d byte"
+msgstr[1] "η τιμή του μεγέθους τμήματος WAL πρέπει να ανήκει σε δύναμη του δύο μεταξύ 1 MB και 1 GB, αλλά το αρχείο ελέγχου καθορίζει %d bytes"
+
+#: pg_rewind.c:1042 pg_rewind.c:1112
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "το πρόγραμμα «%s» απαιτείται από %s αλλά δεν βρέθηκε στον ίδιο κατάλογο με το «%s»"
+
+#: pg_rewind.c:1045 pg_rewind.c:1115
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "το πρόγραμμα «%s» βρέθηκε από το «%s» αλλά δεν ήταν η ίδια έκδοση με το %s"
+
+#: pg_rewind.c:1078
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "η εντολή restore_command δεν έχει οριστεί στη συστάδα προορισμού"
+
+#: pg_rewind.c:1119
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "εκτέλεση «%s» για την ολοκλήρωση της αποκατάστασης σφαλμάτων του διακομιστή προορισμού"
+
+#: pg_rewind.c:1156
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "λειτουργία μοναδικού-χρήστη postgres στο σύμπλεγμα προορισμού απέτυχε"
+
+#: pg_rewind.c:1157
+#, c-format
+msgid "Command was: %s"
+msgstr "Η εντολή ήταν: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "συντακτικό σφάλμα στο αρχείο ιστορικού: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "Αναμένεται αριθμητικό ID χρονογραμμής."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "Αναμένεται μια θέση write-ahead log switchpoint."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "μη έγκυρα δεδομένα στο αρχείο ιστορικού: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "Τα IDs χρονογραμμής πρέπει να βρίσκονται σε αυξάνουσα σειρά."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "μη έγκυρα δεδομένα στο αρχείο ιστορικού"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "Τα ID χρονογραμμής πρέπει να είναι λιγότερα από τα ID της χρονογραμμής απογόνου."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "μη έγκυρη μετατόπιση εγγραφών σε %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord ζητείται από %X/%X"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "μη έγκυρο μήκος εγγραφής σε %X/%X: χρειαζόταν %u, έλαβε %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "έλλειψη μνήμης κατά την προσπάθεια αποκωδικοποίησης εγγραφής με μήκος %u"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "μήκος εγγραφής %u σε %X/%X πολύ μακρύ"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "δεν υπάρχει σημαία contrecord στο %X/%X"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "μη έγκυρο μήκος contrecord %u (αναμένεται %lld) σε %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "λείπει contrecord στο %X/%X"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "μη έγκυρο ID %u διαχειριστή πόρων στο %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "εγγραφή με εσφαλμένο prev-link %X/%X σε %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "εσφαλμένο άθροισμα ελέγχου δεδομένων διαχειριστή πόρων σε εγγραφή στο %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "μη έγκυρος μαγικός αριθμός %04X στο τμήμα καταγραφής %s, μετατόπιση %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "μη έγκυρα info bits %04X στο τμήμα καταγραφής %s, μετατόπιση %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "WAL αρχείο προέρχεται από διαφορετικό σύστημα βάσης δεδομένων: το WAL αναγνωριστικό συστήματος βάσης δεδομένων αρχείων είναι %llu, το pg_control αναγνωριστικό συστήματος βάσης δεδομένων είναι %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL αρχείο προέρχεται από διαφορετικό σύστημα βάσης δεδομένων: εσφαλμένο μέγεθος τμήματος στην κεφαλίδα σελίδας"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL αρχείο προέρχεται από διαφορετικό σύστημα βάσης δεδομένων: εσφαλμένο XLOG_BLCKSZ στην κεφαλίδα σελίδας"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "μη αναμενόμενο pageaddr %X/%X στο τμήμα καταγραφής %s, μετατόπιση %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "εκτός ακολουθίας ID χρονογραμμής %u (μετά %u) στο τμήμα καταγραφής %s, μετατόπιση %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "εκτός ακολουθίας block_id %u στο %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA έχει οριστεί, αλλά δεν περιλαμβάνονται δεδομένα σε %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA δεν έχει οριστεί, αλλά το μήκος των δεδομένων είναι %u σε %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE έχει οριστεί, αλλά οπή με μετατόπιση %u μήκος %u μήκος μπλοκ εικόνας %u σε %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE δεν έχει οριστεί, αλλά οπή με μετατόπιση %u μήκος %u σε %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_IS_COMPRESSED έχει οριστεί, αλλά μέγεθος μπλοκ εικόνας %u σε %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "ούτε BKPIMAGE_HAS_HOLE ούτε BKPIMAGE_IS_COMPRESSED είναι ορισμένα, αλλά το μήκος της εικόνας μπλοκ είναι %u στο %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL είναι ορισμένο, αλλά καμία προηγούμενη rel στο %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "μη έγκυρο block_id %u στο %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "εγγραφή με μη έγκυρο μήκος στο %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "δεν ήταν δυνατή η εύρεση μπλοκ αντιγράφου με ID %d στην εγγραφή WAL"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "δεν ήταν δυνατή η επαναφορά εικόνας στο %X/%X με ορισμένο άκυρο μπλοκ %d"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "δεν ήταν δυνατή η επαναφορά εικόνας στο %X/%X με άκυρη κατάσταση, μπλοκ %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "δεν ήταν δυνατή η επαναφορά εικόνας σε %X/%X συμπιεσμένη με %s που δεν υποστηρίζεται από την υλοποίηση, μπλοκ %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "δεν ήταν δυνατή η επαναφορά εικόνας σε %X/%X συμπιεσμένη με άγνωστη μέθοδο, μπλοκ %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "δεν ήταν δυνατή η αποσυμπιέση εικόνας στο %X/%X, μπλοκ %d"
+
+#~ msgid "You must run %s as the PostgreSQL superuser.\n"
+#~ msgstr "Πρέπει να εκτελέσετε %s ως υπερχρήστης PostgreSQL.\n"
+
+#~ msgid "fatal: "
+#~ msgstr "κρίσιμο: "
diff --git a/src/bin/pg_rewind/po/es.po b/src/bin/pg_rewind/po/es.po
new file mode 100644
index 0000000..06923db
--- /dev/null
+++ b/src/bin/pg_rewind/po/es.po
@@ -0,0 +1,1013 @@
+# Spanish message translation file for pg_rewind
+#
+# Copyright (c) 2015-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Álvaro Herrera <alvherre@alvh.no-ip.org>, 2015.
+# Carlos Chapi <carloswaldo@babelruins.org>, 2017, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:50+0000\n"
+"PO-Revision-Date: 2022-10-20 09:06+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.3\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "no se puede duplicar un puntero nulo (error interno)\n"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "no se pudo cargar la biblioteca «%s»: código de error %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "no se pueden crear tokens restrigidos en esta plataforma: código de error %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "no se pudo abrir el token de proceso: código de error %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "no se pudo emplazar los SIDs: código de error %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "no se pudo crear el token restringido: código de error %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "no se pudo iniciar el proceso para la orden «%s»: código de error %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "no se pudo re-ejecutar con el token restringido: código de error %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "no se pudo obtener el código de salida del subproceso»: código de error %lu"
+
+#: ../../fe_utils/archive.c:52
+#, c-format
+msgid "cannot use restore_command with %%r placeholder"
+msgstr "no se puede usar restore_command con el marcador %%r"
+
+#: ../../fe_utils/archive.c:70
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "el archivo «%s» tiene tamaño inesperado: %lld en lugar de %lld"
+
+#: ../../fe_utils/archive.c:78
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "no se pudo abrir el archivo «%s» restaurado del archivo: %m"
+
+#: ../../fe_utils/archive.c:87 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "no se pudo hacer stat al archivo «%s»: %m"
+
+#: ../../fe_utils/archive.c:99
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_command falló: %s"
+
+#: ../../fe_utils/archive.c:106
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "no se pudo recuperar el archivo «%s» del archivo"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "no se pudo escribir a archivo «%s»: %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "no se pudo crear archivo «%s»: %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "no se pudo abrir el archivo de destino «%s»: %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo de destino «%s»: %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "no se pudo posicionar en archivo de destino «%s»: %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "no se pudo escribir el archivo «%s»: %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "tipo de archivo no definido para «%s»"
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "acción no válida (CREATE) para archivo regular"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "no se pudo eliminar el archivo «%s»: %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "no se pudo abrir el archivo «%s» para truncarlo: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "no se pudo truncar el archivo «%s» a %u: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "no se pudo crear el directorio «%s»: %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "no se pudo eliminar el directorio «%s»: %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "no se pudo crear el link simbólico en «%s»: %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "no se pudo eliminar el enlace simbólico «%s»: %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "no se pudo abrir archivo «%s» para lectura: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "no se pudo leer el archivo «%s»: %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "no se pudo leer el archivo «%s»: leídos %d de %zu"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: file_ops.c:446
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "no se pudo leer el enlace simbólico «%s»: %m"
+
+#: file_ops.c:449
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "la ruta «%s» del enlace simbólico es demasiado larga"
+
+#: file_ops.c:464
+#, c-format
+msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+msgstr "«%s» es un link simbólico, pero los links simbólicos no están soportados en esta plataforma"
+
+#: file_ops.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "no se pudo leer el directorio «%s»: %m"
+
+#: file_ops.c:475
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "el archivo de datos «%s» en el origen no es un archivo regular"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "archivo origen duplicado «%s»"
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "modificación de página inesperada para el archivo no regular «%s»"
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "tipo de archivo desconocido para «%s»"
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "el archivo «%s» tiene un tipo diferente en el origen y en el destino"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "no se pudo decidir qué hacer con el archivo «%s»"
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "no se pudo limpiar search_path: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "full_page_writes debe estar activado en el servidor de origen"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "no se pudo preparar sentencia para obtener el contenido del archivo: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "error ejecutando consulta (%s) en el servidor de origen: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "conjunto de resultados inesperados de la consulta"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "error ejecutando consulta (%s) en el servidor de origen: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "resultado «%s» no reconocido para la ubicación de inserción WAL actual"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "no se pudo obtener el listado de archivos: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "conjunto de resultados inesperado mientras se obtenía el listado de archivos"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "no se pudo enviar la consulta: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "no se pudo establecer la coneción libpq a modo «single row»"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "resultados inesperados mientras se obtenían archivos remotos: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "se recibieron más trozos de datos que los solicitados"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "tamaño del conjunto de resultados inesperado mientras se obtenían archivos remotos"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "tipos de dato inesperados en el conjunto de resultados mientras se obtenían archivos remotos: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "formato de resultados inesperado mientras se obtenían archivos remotos"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "valores nulos inesperados en el resultado mientras se obtenían archivos remotos"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "largo del resultado inesperado mientras se obtenían los archivos remotos"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "se recibieron datos para el archivo «%s», cuando se solicitó para «%s»"
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "se recibieron datos en la posición %lld del archivo «%s», cuando se solicitó para la posición %lld"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "se recibió más de lo solicitado para el archivo «%s»"
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "se recibió un número inesperado de trozos de datos"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "no se pudo obtener el archivo remoto «%s»: %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "conjunto de resultados inesperado mientras se obtenía el archivo remoto «%s»"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "no se pudo abrir el archivo de origen «%s»: %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "el tamaño del archivo de origen «%s» cambió concurrentemente: se esperaban %d bytes, se copiaron %d"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo «%s»: %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "no se pudo posicionar en archivo de origen: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "EOF inesperado mientras se leía el archivo «%s»"
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "memoria agotada mientras se emplazaba un procesador de lectura de WAL"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "no se pudo leer el registro WAL en %X/%X: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "no se pudo leer el registro WAL en %X/%X"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "el puntero de término %X/%X no es un punto válido; se esperaba %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "no se pudo encontrar el registro WAL anterior en %X/%X: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "no se pudo encontrar el registro WAL anterior en %X/%X"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "no se pudo posicionar (seek) el archivo «%s»: %m"
+
+#: parsexlog.c:440
+#, c-format
+msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+msgstr "el registro WAL modifica una relación, pero el tipo de registro no es reconocido: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:86
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s resincroniza un cluster PostgreSQL con otra copia del cluster.\n"
+"\n"
+
+#: pg_rewind.c:87
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"Empleo:\n"
+" %s [OPCION]...\n"
+"\n"
+
+#: pg_rewind.c:88
+#, c-format
+msgid "Options:\n"
+msgstr "Opciones:\n"
+
+#: pg_rewind.c:89
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal utilizar restore_command de la configuración\n"
+" de destino para obtener archivos WAL\n"
+
+#: pg_rewind.c:91
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=DIRECTORIO directorio de datos existente a modificar\n"
+
+#: pg_rewind.c:92
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=DIRECTORIO directorio de datos de origen a sincronizar\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONN servidor de origen a sincronizar\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run detener antes de modificar nada\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress escribir mensajes de progreso\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf escribe configuración para replicación\n"
+" (requiere --source-server)\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=ARCHIVO utilizar el archivo de configuración del servidor\n"
+" principal especificado al ejecutar el clúster de destino\n"
+
+#: pg_rewind.c:102
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug escribir muchos mensajes de depuración\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr ""
+" --no-ensure-shutdown no corregir automáticamente un apagado\n"
+" no-limpio\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: pg_rewind.c:105
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: pg_rewind.c:107
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237
+#: pg_rewind.c:244 pg_rewind.c:252
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_rewind.c:222
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "no se especificó origen (--source-pgdata o --source-server)"
+
+#: pg_rewind.c:229
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "sólo uno de --source-pgdata o --source-server puede ser especificado"
+
+#: pg_rewind.c:236
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "no se especificó directorio de datos de destino (--target-pgdata)"
+
+#: pg_rewind.c:243
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "no se especificó información de servidor de origen (--source-server) para --write-recovery-conf"
+
+#: pg_rewind.c:250
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_rewind.c:265
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "no puede ser ejecutado por «root»"
+
+#: pg_rewind.c:266
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Debe ejecutar %s con el superusuario de PostgreSQL."
+
+#: pg_rewind.c:276
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "no se pudo obtener los permisos del directorio «%s»: %m"
+
+#: pg_rewind.c:294
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:297
+#, c-format
+msgid "connected to server"
+msgstr "conectado al servidor"
+
+#: pg_rewind.c:344
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "el cluster de origen y destino están en el mismo timeline"
+
+#: pg_rewind.c:353
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "servidores divergieron en la posición de WAL %X/%X en el timeline %u"
+
+#: pg_rewind.c:401
+#, c-format
+msgid "no rewind required"
+msgstr "no se requiere rebobinar"
+
+#: pg_rewind.c:410
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "rebobinando desde el último checkpoint común en %X/%X en el timeline %u"
+
+#: pg_rewind.c:420
+#, c-format
+msgid "reading source file list"
+msgstr "leyendo la lista de archivos de origen"
+
+#: pg_rewind.c:424
+#, c-format
+msgid "reading target file list"
+msgstr "leyendo la lista de archivos de destino"
+
+#: pg_rewind.c:433
+#, c-format
+msgid "reading WAL in target"
+msgstr "leyendo WAL en destino"
+
+#: pg_rewind.c:454
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "se necesitan copiar %lu MB (tamaño total de directorio de origen es %lu MB)"
+
+#: pg_rewind.c:472
+#, c-format
+msgid "syncing target data directory"
+msgstr "sincronizando directorio de datos de destino"
+
+#: pg_rewind.c:488
+#, c-format
+msgid "Done!"
+msgstr "¡Listo!"
+
+#: pg_rewind.c:568
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "no se decidió una acción para el archivo «%s»"
+
+#: pg_rewind.c:600
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "el sistema origen fue modificado mientras pg_rewind estaba en ejecución"
+
+#: pg_rewind.c:604
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "creando etiqueta de respaldo y actualizando archivo de control"
+
+#: pg_rewind.c:654
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "el sistema origen estaba en un estado inesperado al final del rebobinado"
+
+#: pg_rewind.c:685
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "clusters de origen y destino son de sistemas diferentes"
+
+#: pg_rewind.c:693
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "los clusters no son compatibles con esta versión de pg_rewind"
+
+#: pg_rewind.c:703
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "el servidor de destino necesita tener sumas de verificación de datos o «wal_log_hints» activados"
+
+#: pg_rewind.c:714
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "el directorio de destino debe estar apagado limpiamente"
+
+#: pg_rewind.c:724
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "el directorio de origen debe estar apagado limpiamente"
+
+#: pg_rewind.c:771
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) copiados"
+
+#: pg_rewind.c:834
+#, c-format
+msgid "invalid control file"
+msgstr "archivo de control no válido"
+
+#: pg_rewind.c:918
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "no se pudo encontrar un ancestro común en el timeline de los clusters de origen y destino"
+
+#: pg_rewind.c:959
+#, c-format
+msgid "backup label buffer too small"
+msgstr "el búfer del backup label es demasiado pequeño"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "CRC de archivo de control inesperado"
+
+#: pg_rewind.c:994
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "tamaño del archivo de control %d inesperado, se esperaba %d"
+
+#: pg_rewind.c:1003
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "El tamaño del segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero el archivo de control especifica %d byte"
+msgstr[1] "El tamaño del segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero el archivo de control especifica %d bytes"
+
+#: pg_rewind.c:1042 pg_rewind.c:1112
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "el programa «%s» es requerido por %s, pero no se encontró en el mismo directorio que «%s»"
+
+#: pg_rewind.c:1045 pg_rewind.c:1115
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "el programa «%s» fue encontrado por «%s» pero no es de la misma versión que %s"
+
+#: pg_rewind.c:1078
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "restore_command no está definido en el clúster de destino"
+
+#: pg_rewind.c:1119
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "ejecutando «%s» en el servidor de destino para completar la recuperación de caídas"
+
+#: pg_rewind.c:1156
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "el modo «single-user» en el servidor de destino falló"
+
+#: pg_rewind.c:1157
+#, c-format
+msgid "Command was: %s"
+msgstr "La orden era: % s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "error de sintaxis en archivo de historia: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "Se esperaba un ID numérico de timeline."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "Se esperaba una ubicación de punto de cambio del «write-ahead log»."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "datos no válidos en archivo de historia: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "IDs de timeline deben ser una secuencia creciente."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "datos no válidos en archivo de historia"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "IDs de timeline deben ser menores que el ID de timeline del hijo."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "posición de registro no válida en %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord solicitado por %X/%X"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "largo de registro no válido en %X/%X: se esperaba %u, se obtuvo %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "memoria agotada mientras se intentaba decodificar un registro de largo %u"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "largo de registro %u en %X/%X demasiado largo"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "no hay bandera de contrecord en %X/%X"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "largo de contrecord %u no válido (se esperaba %lld) en %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "falta un contrecord en %X/%X"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ID de gestor de recursos %u no válido en %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "registro con prev-link %X/%X incorrecto en %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "suma de verificación de los datos del gestor de recursos incorrecta en el registro en %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "número mágico %04X no válido en archivo %s, posición %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "info bits %04X no válidos en archivo %s, posición %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "archivo WAL es de un sistema de bases de datos distinto: identificador de sistema en archivo WAL es %llu, identificador en pg_control es %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "archivo WAL es de un sistema de bases de datos distinto: tamaño de segmento incorrecto en cabecera de paǵina"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "archivo WAL es de un sistema de bases de datos distinto: XLOG_BLCKSZ incorrecto en cabecera de paǵina"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "pageaddr %X/%X inesperado en archivo %s, posición %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "ID de timeline %u fuera de secuencia (después de %u) en archivo %s, posición %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id %u fuera de orden en %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA está definido, pero no hay datos en %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA no está definido, pero el largo de los datos es %u en %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE está definido, pero posición del agujero es %u largo %u largo de imagen %u en %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE no está definido, pero posición del agujero es %u largo %u en %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED definido, pero largo de imagen de bloque es %u en %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_COMPRESSED están definidos, pero el largo de imagen de bloque es %u en %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL está definido, pero no hay «rel» anterior en %X/%X "
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "block_id %u no válido en %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "registro con largo no válido en %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "no se pudo localizar un bloque de respaldo con ID %d en el registro WAL"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "no se pudo restaurar la imagen en %X/%X con bloque especificado %d no válido"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "no se pudo restaurar la imagen en %X/%X con estado no válido, bloque %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "no se pudo restaurar la imagen en %X/%X comprimida con %s que no está soportado por esta instalación, bloque %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "no se pudo restaurar la imagen en %X/%X comprimida con un método desconocido, bloque %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "no se pudo descomprimir la imagen en %X/%X, bloque %d"
diff --git a/src/bin/pg_rewind/po/fr.po b/src/bin/pg_rewind/po/fr.po
new file mode 100644
index 0000000..d931607
--- /dev/null
+++ b/src/bin/pg_rewind/po/fr.po
@@ -0,0 +1,1300 @@
+# LANGUAGE message translation file for pg_rewind
+# Copyright (C) 2016-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_rewind (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2016-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:20+0000\n"
+"PO-Revision-Date: 2022-09-26 14:16+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "n'a pas pu charger la bibliothèque « %s » : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "ne peut pas créer les jetons restreints sur cette plateforme : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "n'a pas pu ouvrir le jeton du processus : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "n'a pas pu allouer les SID : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "n'a pas pu créer le jeton restreint : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu"
+
+#: ../../fe_utils/archive.c:52
+#, c-format
+msgid "cannot use restore_command with %%r placeholder"
+msgstr "ne peut pas utiliser restore_command avec le joker %%r"
+
+#: ../../fe_utils/archive.c:70
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "taille de fichier inattendu pour « %s » : %lld au lieu de %lld"
+
+#: ../../fe_utils/archive.c:78
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » à partir de l'archive : %m"
+
+#: ../../fe_utils/archive.c:87 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "n'a pas pu tester le fichier « %s » : %m"
+
+#: ../../fe_utils/archive.c:99
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "échec de la restore_command : %s"
+
+#: ../../fe_utils/archive.c:106
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "n'a pas pu restaurer le fichier « %s » à partir de l'archive"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "n'a pas pu écrire dans le fichier « %s » : %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "n'a pas pu créer le fichier « %s » : %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier cible « %s » : %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier cible « %s » : %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "n'a pas pu chercher dans le fichier cible « %s » : %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "impossible d'écrire le fichier « %s » : %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "type de fichier non défini pour « %s »"
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "action (CREATE) invalide pour le fichier régulier"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "n'a pas pu supprimer le fichier « %s » : %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » pour le troncage : %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "n'a pas pu tronquer le fichier « %s » en %u : %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "n'a pas pu créer le répertoire « %s » : %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "n'a pas pu supprimer le répertoire « %s » : %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "n'a pas pu créer le lien symbolique à « %s » : %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "n'a pas pu supprimer le lien symbolique « %s » : %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "n'a pas pu lire le fichier « %s » : %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "n'a pas pu ouvrir le répertoire « %s » : %m"
+
+#: file_ops.c:446
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "n'a pas pu lire le lien symbolique « %s » : %m"
+
+#: file_ops.c:449
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "la cible du lien symbolique « %s » est trop longue"
+
+#: file_ops.c:464
+#, c-format
+msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+msgstr "« %s » est un lien symbolique mais les liens symboliques ne sont pas supportés sur cette plateforme"
+
+#: file_ops.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "n'a pas pu lire le répertoire « %s » : %m"
+
+#: file_ops.c:475
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "n'a pas pu fermer le répertoire « %s » : %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "le fichier de données « %s » en source n'est pas un fichier standard"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "fichier source « %s » dupliqué"
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "modification inattendue de page pour le fichier non standard « %s »"
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "type de fichier inconnu pour « %s »"
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "le fichier « %s » a un type différent pour la source et la cible"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "n'a pas pu décider que faire avec le fichier « %s » : %m"
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "n'a pas pu effacer search_path : %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "full_page_writes doit être activé sur le serveur source"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "n'a pas pu préparer l'instruction pour récupérer le contenu du fichier : %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "erreur lors de l'exécution de la requête (%s) sur le serveur source : %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "ensemble de résultats inattendu provenant de la requête"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "erreur lors de l'exécution de la requête (%s) dans le serveur source : %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "résultat non reconnu « %s » pour l'emplacement d'insertion actuel dans les WAL"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "n'a pas pu récupérer la liste des fichiers : %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "ensemble de résultats inattendu lors de la récupération de la liste des fichiers"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "n'a pas pu envoyer la requête : %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "n'a pas pu configurer la connexion libpq en mode ligne seule"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "résultat inattendu lors de la récupération des fichiers cibles : %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "a reçu plus de morceaux de données que demandé"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "taille inattendue de l'ensemble de résultats lors de la récupération des fichiers distants"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "types de données inattendus dans l'ensemble de résultats lors de la récupération des fichiers distants : %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "format de résultat inattendu lors de la récupération des fichiers distants"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "valeurs NULL inattendues dans le résultat lors de la récupération des fichiers distants"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "longueur de résultats inattendu lors de la récupération des fichiers distants"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "a reçu des données du fichier « %s » alors que « %s » était demandé"
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "a reçu des données au décalage %lld du fichier « %s » alors que le décalage %lld était demandé"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "a reçu plus que demandé pour le fichier « %s »"
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "nombre de morceaux de données reçus inattendu"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "n'a pas pu récupérer le fichier distant « %s » : %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "ensemble de résultats inattendu lors de la récupération du fichier distant « %s »"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier source « %s » : %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "la taille du fichier source « %s » a changé : %d octets attendus, %d copiés"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier « %s » : %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "n'a pas pu chercher dans le fichier source : %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "EOF inattendu lors de la lecture du fichier « %s »"
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "manque mémoire lors de l'allocation d'un processeur de lecture de journaux de transactions"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "n'a pas pu lire l'enregistrement WAL précédent à %X/%X : %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "n'a pas pu lire l'enregistrement WAL précédent à %X/%X"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "le pointeur de fin %X/%X n'est pas un pointeur de fin valide ; %X/%X attendu"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "n'a pas pu trouver l'enregistrement WAL précédent à %X/%X : %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "n'a pas pu trouver l'enregistrement WAL précédent à %X/%X"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "n'a pas pu parcourir le fichier « %s » : %m"
+
+#: parsexlog.c:440
+#, c-format
+msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+msgstr "l'enregistrement WAL modifie une relation mais le type d'enregistrement n'est pas reconnu : lsn : %X/%X, rmid : %d, rmgr : %s, info : %02X"
+
+#: pg_rewind.c:86
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s resynchronise une instance PostgreSQL avec une autre copie de\n"
+"l'instance.\n"
+"\n"
+
+#: pg_rewind.c:87
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"Usage :\n"
+" %s [OPTION]...\n"
+"\n"
+
+#: pg_rewind.c:88
+#, c-format
+msgid "Options:\n"
+msgstr "Options :\n"
+
+#: pg_rewind.c:89
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal utilise restore_command pour la configuration\n"
+" cible de récupération des fichiers WAL des\n"
+" archives\n"
+
+#: pg_rewind.c:91
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=RÉPERTOIRE répertoire de données existant à modifier\n"
+
+#: pg_rewind.c:92
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=RÉPERTOIRE répertoire des données source\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CHAÎNE serveur source pour la synchronisation\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run arrête avant de modifier quoi que ce soit\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --nosync n'attend pas que les modifications soient\n"
+" proprement écrites sur disque\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress écrit les messages de progression\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf écrit la configuration pour la réplication\n"
+" (requiert --source-server)\n"
+"\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=NOMFICHIER utilise le fichier de configuration indiqué\n"
+" du serveur principal lors de l'exécution de\n"
+" l'instance cible\n"
+
+#: pg_rewind.c:102
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug écrit beaucoup de messages de débogage\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr ""
+" --no-ensure-shutdown ne corrige pas automatiquement l'arrêt non\n"
+" propre\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version, puis quitte\n"
+
+#: pg_rewind.c:105
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide, puis quitte\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: pg_rewind.c:107
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237
+#: pg_rewind.c:244 pg_rewind.c:252
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_rewind.c:222
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "aucune source indiquée (--source-pgdata ou --source-server)"
+
+#: pg_rewind.c:229
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "une seule des options --source-pgdata et --source-server peut être indiquée"
+
+#: pg_rewind.c:236
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "aucun répertoire de données cible indiqué (--target-pgdata)"
+
+#: pg_rewind.c:243
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "aucune information sur le serveur source (--source-server) indiquée pour --write-recovery-conf"
+
+#: pg_rewind.c:250
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_rewind.c:265
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "ne peut pas être exécuté par « root »"
+
+#: pg_rewind.c:266
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Vous devez exécuter %s en tant que super-utilisateur PostgreSQL."
+
+#: pg_rewind.c:276
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "n'a pas pu lire les droits du répertoire « %s » : %m"
+
+#: pg_rewind.c:294
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:297
+#, c-format
+msgid "connected to server"
+msgstr "connecté au serveur"
+
+#: pg_rewind.c:344
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "les instances source et cible sont sur la même ligne de temps"
+
+#: pg_rewind.c:353
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "les serveurs ont divergé à la position %X/%X des WAL sur la timeline %u"
+
+#: pg_rewind.c:401
+#, c-format
+msgid "no rewind required"
+msgstr "pas de retour en arrière requis"
+
+#: pg_rewind.c:410
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "retour en arrière depuis le dernier checkpoint commun à %X/%X sur la ligne de temps %u"
+
+#: pg_rewind.c:420
+#, c-format
+msgid "reading source file list"
+msgstr "lecture de la liste des fichiers sources"
+
+#: pg_rewind.c:424
+#, c-format
+msgid "reading target file list"
+msgstr "lecture de la liste des fichiers cibles"
+
+#: pg_rewind.c:433
+#, c-format
+msgid "reading WAL in target"
+msgstr "lecture du WAL dans la cible"
+
+#: pg_rewind.c:454
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "a besoin de copier %lu Mo (la taille totale du répertoire source est %lu Mo)"
+
+#: pg_rewind.c:472
+#, c-format
+msgid "syncing target data directory"
+msgstr "synchronisation du répertoire des données cible"
+
+#: pg_rewind.c:488
+#, c-format
+msgid "Done!"
+msgstr "Terminé !"
+
+#: pg_rewind.c:568
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "aucune action décidée pour le fichier « %s »"
+
+#: pg_rewind.c:600
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "le système source a été modifié alors que pg_rewind était en cours d'exécution"
+
+#: pg_rewind.c:604
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "création du fichier backup_label et mise à jour du fichier contrôle"
+
+#: pg_rewind.c:654
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "le système source était dans un état inattendu en fin de rewind"
+
+#: pg_rewind.c:685
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "les instances source et cible proviennent de systèmes différents"
+
+#: pg_rewind.c:693
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "les instances ne sont pas compatibles avec cette version de pg_rewind"
+
+#: pg_rewind.c:703
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "le serveur cible doit soit utiliser les sommes de contrôle sur les données soit avoir wal_log_hints configuré à on"
+
+#: pg_rewind.c:714
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "le serveur cible doit être arrêté proprement"
+
+#: pg_rewind.c:724
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "le répertoire de données source doit être arrêté proprement"
+
+#: pg_rewind.c:771
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s Ko (%d%%) copiés"
+
+#: pg_rewind.c:834
+#, c-format
+msgid "invalid control file"
+msgstr "fichier de contrôle invalide"
+
+#: pg_rewind.c:918
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "n'a pas pu trouver l'ancêtre commun des lignes de temps des instances source et cible"
+
+#: pg_rewind.c:959
+#, c-format
+msgid "backup label buffer too small"
+msgstr "tampon du label de sauvegarde trop petit"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "CRC inattendu pour le fichier de contrôle"
+
+#: pg_rewind.c:994
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "taille %d inattendue du fichier de contrôle, %d attendu"
+
+#: pg_rewind.c:1003
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octet"
+msgstr[1] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octets"
+
+#: pg_rewind.c:1042 pg_rewind.c:1112
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »"
+
+#: pg_rewind.c:1045 pg_rewind.c:1115
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s"
+
+#: pg_rewind.c:1078
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "restore_command n'est pas configuré sur l'instance cible"
+
+#: pg_rewind.c:1119
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "exécution de « %s » pour terminer la restauration après crash du serveur cible"
+
+#: pg_rewind.c:1156
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "le mot simple-utilisateur de postgres a échoué pour l'instance cible"
+
+#: pg_rewind.c:1157
+#, c-format
+msgid "Command was: %s"
+msgstr "La commande était : %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "erreur de syntaxe dans le fichier historique : %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "Attendait un identifiant timeline numérique."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "Attendait un emplacement de bascule de journal de transactions."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "données invalides dans le fichier historique : %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "Les identifiants timeline doivent être en ordre croissant."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "données invalides dans le fichier historique"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr ""
+"Les identifiants timeline doivent être plus petits que les enfants des\n"
+"identifiants timeline."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "décalage invalide de l'enregistrement %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "« contrecord » est requis par %X/%X"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "longueur invalide de l'enregistrement à %X/%X : voulait %u, a eu %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "manque mémoire lors de la tentative de décodage d'un enregistrement de longueur %u"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "longueur trop importante de l'enregistrement %u à %X/%X"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "il n'existe pas de drapeau contrecord à %X/%X"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "longueur %u invalide du contrecord (%lld attendu) à %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "contrecord manquant à %X/%X"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "identifiant du gestionnaire de ressources invalide %u à %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "enregistrement avec prev-link %X/%X incorrect à %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr ""
+"somme de contrôle des données du gestionnaire de ressources incorrecte à\n"
+"l'enregistrement %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "numéro magique invalide %04X dans le segment %s, décalage %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "bits d'information %04X invalides dans le segment %s, décalage %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "Le fichier WAL provient d'une instance différente : l'identifiant système de la base dans le fichier WAL est %llu, alors que l'identifiant système de la base dans pg_control est %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "Le fichier WAL provient d'une instance différente : taille invalide du segment dans l'en-tête de page"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "Le fichier WAL provient d'une instance différente : XLOG_BLCKSZ incorrect dans l'en-tête de page"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "pageaddr %X/%X inattendue dans le journal de transactions %s, segment %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "identifiant timeline %u hors de la séquence (après %u) dans le segment %s, décalage %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id %u désordonné à %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA configuré, mais aucune donnée inclus à %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA non configuré, mais la longueur des données est %u à %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE activé, mais décalage trou %u longueur %u longueur image bloc %u à %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE désactivé, mais décalage trou %u longueur %u à %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL configuré, mais pas de relation précédente à %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "block_id %u invalide à %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "enregistrement de longueur invalide à %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "n'a pas pu localiser le bloc de sauvegarde d'ID %d dans l'enregistrement WAL"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "n'a pas pu restaurer l'image à %X/%X avec le bloc invalide %d indiqué"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "n'a pas pu restaurer l'image à %X/%X avec un état invalide, bloc %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec %s, qui est non supporté par le serveur, bloc %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec une méthode inconnue, bloc %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "n'a pas pu décompresser l'image à %X/%X, bloc %d"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid " block %u\n"
+#~ msgstr " bloc %u\n"
+
+#~ msgid "\"%s\" is not a directory"
+#~ msgstr "« %s » n'est pas un répertoire"
+
+#~ msgid "\"%s\" is not a regular file"
+#~ msgstr "« %s » n'est pas un fichier standard"
+
+#~ msgid "\"%s\" is not a symbolic link"
+#~ msgstr "« %s » n'est pas un lien symbolique"
+
+#~ msgid "%d: %X/%X - %X/%X\n"
+#~ msgstr "%d : %X/%X - %X/%X\n"
+
+#~ msgid "%s (%s)\n"
+#~ msgstr "%s (%s)\n"
+
+#~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+#~ msgstr "%s : ATTENTION : ne peut pas créer les jetons restreints sur cette plateforme\n"
+
+#~ msgid "%s: could not allocate SIDs: error code %lu\n"
+#~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n"
+
+#~ msgid "%s: could not create restricted token: error code %lu\n"
+#~ msgstr "%s : n'a pas pu créer le jeton restreint : code d'erreur %lu\n"
+
+#~ msgid "%s: could not get exit code from subprocess: error code %lu\n"
+#~ msgstr "%s : n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu\n"
+
+#~ msgid "%s: could not open process token: error code %lu\n"
+#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n"
+
+#~ msgid "%s: could not re-execute with restricted token: error code %lu\n"
+#~ msgstr "%s : n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu\n"
+
+#~ msgid "%s: could not read permissions of directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu lire les droits sur le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not start process for command \"%s\": error code %lu\n"
+#~ msgstr "%s : n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#~ msgid "Expected a numeric timeline ID.\n"
+#~ msgstr "Attendait un identifiant numérique de ligne de temps.\n"
+
+#~ msgid "Expected a write-ahead log switchpoint location.\n"
+#~ msgstr "Attendait un emplacement de bascule de journal de transactions.\n"
+
+#~ msgid "Failure, exiting\n"
+#~ msgstr "Échec, sortie\n"
+
+#~ msgid "Source timeline history:\n"
+#~ msgstr "Historique de la ligne de temps source :\n"
+
+#~ msgid "Target timeline history:\n"
+#~ msgstr "Historique de la ligne de temps cible :\n"
+
+#~ msgid ""
+#~ "The program \"%s\" is needed by %s but was\n"
+#~ "not found in the same directory as \"%s\".\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé\n"
+#~ "dans le même répertoire que « %s ».\n"
+#~ "Vérifiez votre installation."
+
+#~ msgid ""
+#~ "The program \"%s\" was found by \"%s\" but was\n"
+#~ "not the same version as %s.\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Le programme « %s » a été trouvé par « %s » mais n'était pas de la même version\n"
+#~ "que %s.\n"
+#~ "Vérifiez votre installation."
+
+#~ msgid ""
+#~ "The program \"initdb\" is needed by %s but was\n"
+#~ "not found in the same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Le programme « initdb » est nécessaire pour %s, mais n'a pas été trouvé\n"
+#~ "dans le même répertoire que « %s ».\n"
+#~ "Vérifiez votre installation.\n"
+
+#~ msgid ""
+#~ "The program \"initdb\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Le programme « initdb » a été trouvé par « %s », mais n'est pas de la même version\n"
+#~ "que %s.\n"
+#~ "Vérifiez votre installation.\n"
+
+#~ msgid ""
+#~ "The program \"postgres\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Le programme « postgres » est nécessaire à %s mais n'a pas été trouvé dans\n"
+#~ "le même répertoire que « %s ».\n"
+#~ "Vérifiez votre installation."
+
+#~ msgid ""
+#~ "The program \"postgres\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Le programme « postgres » a été trouvé par « %s » mais n'est pas de la même\n"
+#~ "version que « %s ».\n"
+#~ "Vérifiez votre installation."
+
+#~ msgid "Timeline IDs must be in increasing sequence.\n"
+#~ msgstr "Les identifiants de ligne de temps doivent être dans une séquence croissante.\n"
+
+#~ msgid "Timeline IDs must be less than child timeline's ID.\n"
+#~ msgstr "Les identifiants de ligne de temps doivent être inférieurs à l'identifiant de la ligne de temps enfant.\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#~ msgid "WAL file is from different database system: incorrect XLOG_SEG_SIZE in page header"
+#~ msgstr "le fichier WAL provient d'un système différent : XLOG_SEG_SIZE invalide dans l'en-tête de page"
+
+#~ msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte\n"
+#~ msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes\n"
+#~ msgstr[0] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octet\n"
+#~ msgstr[1] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octets\n"
+
+#, c-format
+#~ msgid "You must run %s as the PostgreSQL superuser.\n"
+#~ msgstr "Vous devez exécuter %s en tant que super-utilisateur PostgreSQL.\n"
+
+#~ msgid "could not close directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu fermer le répertoire « %s » : %s\n"
+
+#~ msgid "could not close file \"%s\": %s\n"
+#~ msgstr "n'a pas pu fermer le fichier « %s » : %s\n"
+
+#~ msgid "could not connect to server: %s"
+#~ msgstr "n'a pas pu se connecter au serveur : %s"
+
+#~ msgid "could not create directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu créer le répertoire « %s » : %s\n"
+
+#~ msgid "could not create temporary table: %s"
+#~ msgstr "n'a pas pu créer la table temporaire : %s"
+
+#~ msgid "could not open directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s\n"
+
+#~ msgid "could not open file \"%s\" for reading: %s\n"
+#~ msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %s\n"
+
+#~ msgid "could not open file \"%s\": %s\n"
+#~ msgstr "n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n"
+
+#~ msgid "could not read file \"%s\": %s\n"
+#~ msgstr "n'a pas pu lire le fichier « %s » : %s\n"
+
+#~ msgid "could not read from file \"%s\": %s\n"
+#~ msgstr "n'a pas pu lire le fichier « %s » : %s\n"
+
+#~ msgid "could not read symbolic link \"%s\": %s\n"
+#~ msgstr "n'a pas pu lire le lien symbolique « %s » : %s\n"
+
+#~ msgid "could not remove directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu supprimer le répertoire « %s » : %s\n"
+
+#~ msgid "could not remove file \"%s\": %s\n"
+#~ msgstr "n'a pas pu supprimer le fichier « %s » : %s\n"
+
+#~ msgid "could not remove symbolic link \"%s\": %s\n"
+#~ msgstr "n'a pas pu supprimer le lien symbolique « %s » : %s\n"
+
+#~ msgid "could not seek in file \"%s\": %s\n"
+#~ msgstr "n'a pas pu chercher dans le fichier « %s » : %s\n"
+
+#~ msgid "could not send COPY data: %s"
+#~ msgstr "n'a pas pu envoyer les données COPY : %s"
+
+#~ msgid "could not send end-of-COPY: %s"
+#~ msgstr "n'a pas pu envoyer end-of-COPY : %s"
+
+#~ msgid "could not send file list: %s"
+#~ msgstr "n'a pas pu envoyer la liste de fichiers : %s"
+
+#~ msgid "could not set up connection context: %s"
+#~ msgstr "n'a pas pu initialiser le contexte de connexion : « %s »"
+
+#~ msgid "could not stat file \"%s\": %s\n"
+#~ msgstr "n'a pas pu tester le fichier « %s » : %s\n"
+
+#~ msgid "could not truncate file \"%s\" to %u: %s\n"
+#~ msgstr "n'a pas pu tronquer le fichier « %s » à %u : %s\n"
+
+#~ msgid "could not write file \"%s\": %s\n"
+#~ msgstr "n'a pas pu écrire le fichier « %s » : %s\n"
+
+#~ msgid "entry \"%s\" excluded from source file list\n"
+#~ msgstr "enregistrement « %s » exclus de la liste des fichiers sources\n"
+
+#~ msgid "entry \"%s\" excluded from target file list\n"
+#~ msgstr "enregistrement « %s » exclus de la liste des fichiers cibles\n"
+
+#, c-format
+#~ msgid "failed to locate backup block with ID %d in WAL record"
+#~ msgstr "échec de localisation du bloc de sauvegarde d'ID %d dans l'enregistrement WAL"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#~ msgid "fetched file \"%s\", length %d\n"
+#~ msgstr "fichier récupéré « %s », longueur %d\n"
+
+#~ msgid "getting file chunks\n"
+#~ msgstr "récupération des parties de fichier\n"
+
+#, c-format
+#~ msgid "image at %X/%X compressed with %s not supported by build, block %d"
+#~ msgstr "image à %X/%X compressé avec %s, non supporté, bloc %d"
+
+#, c-format
+#~ msgid "image at %X/%X compressed with unknown method, block %d"
+#~ msgstr "image à %X/%X compressé avec une méthode inconnue, bloc %d"
+
+#, c-format
+#~ msgid "invalid compressed image at %X/%X, block %d"
+#~ msgstr "image compressée invalide à %X/%X, bloc %d"
+
+#~ msgid "invalid contrecord length %u at %X/%X reading %X/%X, expected %u"
+#~ msgstr "longueur %u invalide du contrecord à %X/%X en lisant %X/%X, attendait %u"
+
+#~ msgid "invalid data in history file: %s\n"
+#~ msgstr "données invalides dans le fichier historique : %s\n"
+
+#~ msgid "received data at offset "
+#~ msgstr "a reçu des données au décalage "
+
+#~ msgid "received null value for chunk for file \"%s\", file has been deleted\n"
+#~ msgstr "a reçu une valeur NULL pour une partie du fichier « %s », le fichier a été supprimé\n"
+
+#~ msgid "source file list is empty"
+#~ msgstr "la liste de fichiers sources est vide"
+
+#~ msgid "source server must not be in recovery mode"
+#~ msgstr "le serveur source ne doit pas être en mode restauration"
+
+#~ msgid "symbolic link \"%s\" target is too long\n"
+#~ msgstr "la cible du lien symbolique « %s » est trop long\n"
+
+#~ msgid "sync of target directory failed\n"
+#~ msgstr "échec de la synchronisation du répertoire cible\n"
+
+#~ msgid "syntax error in history file: %s\n"
+#~ msgstr "erreur de syntaxe dans le fichier historique : %s\n"
+
+#~ msgid "there is no contrecord flag at %X/%X reading %X/%X"
+#~ msgstr "il n'existe pas de drapeau contrecord à %X/%X en lisant %X/%X"
+
+#~ msgid "unexpected result while sending file list: %s"
+#~ msgstr "résultat inattendu lors de l'envoi de la liste de fichiers : %s"
diff --git a/src/bin/pg_rewind/po/it.po b/src/bin/pg_rewind/po/it.po
new file mode 100644
index 0000000..b0d4190
--- /dev/null
+++ b/src/bin/pg_rewind/po/it.po
@@ -0,0 +1,1190 @@
+#
+# pg_rewind.po
+# Italian message translation file for pg_rewind
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+# Copyright (C) 2010, Associazione Culturale ITPUG
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:20+0000\n"
+"PO-Revision-Date: 2022-10-05 13:58+0200\n"
+"Last-Translator: Domenico Sgarbossa <sgarbossa.domenico@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 2.3\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "impossibile duplicare il puntatore nullo (errore interno)\n"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "impossibile caricare la libreria \"%s\": codice di errore %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "impossibile creare token con restrizioni su questa piattaforma: codice di errore %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "impossibile aprire il token di processo: codice di errore %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "impossibile allocare i SID: codice di errore %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "impossibile creare token limitato: codice di errore %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "impossibile avviare il processo per il comando \"%s\": codice di errore %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "impossibile rieseguire con token limitato: codice di errore %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "impossibile ottenere il codice di uscita dal processo secondario: codice di errore %lu"
+
+#: ../../fe_utils/archive.c:52
+#, c-format
+msgid "cannot use restore_command with %%r placeholder"
+msgstr "impossibile utilizzare restore_command con %%r segnaposto"
+
+#: ../../fe_utils/archive.c:70
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "dimensione file imprevista per \"%s\": %lld invece di %lld"
+
+#: ../../fe_utils/archive.c:78
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "impossibile aprire il file \"%s\" ripristinato dall'archivio: %m"
+
+#: ../../fe_utils/archive.c:87 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file \"%s\": %m"
+
+#: ../../fe_utils/archive.c:99
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_command non riuscito: %s"
+
+#: ../../fe_utils/archive.c:106
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "impossibile ripristinare il file \"%s\" dall'archivio"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "memoria esaurita"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "apertura del file \"%s\" fallita: %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "scrittura nel file \"%s\" fallita: %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "creazione del file \"%s\" fallita: %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "impossibile aprire il file di destinazione \"%s\": %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "impossibile chiudere il file di destinazione \"%s\": %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "impossibile cercare nel file di destinazione \"%s\": %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "scrittura nel file \"%s\" fallita: %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "tipo di file non definito per \"%s\""
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "azione non valida (CREA) per il file normale"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "rimozione del file \"%s\" fallita: %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "impossibile aprire il file \"%s\" per il troncamento: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "troncamento del file \"%s\" a %u fallito: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "creazione della directory \"%s\" fallita: %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "rimozione della directory \"%s\" fallita: %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "impossibile creare un collegamento simbolico in \"%s\": %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "rimozione del link simbolico \"%s\" fallita: %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "apertura del file \"%s\" in lettura fallita: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "lettura del file \"%s\" fallita: %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "lettura del file \"%s\" fallita: letti %d di %zu"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "apertura della directory \"%s\" fallita: %m"
+
+#: file_ops.c:446
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "lettura del link simbolico \"%s\" fallita: %m"
+
+#: file_ops.c:449
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "la destinazione del link simbolico \"%s\" è troppo lunga"
+
+#: file_ops.c:464
+#, c-format
+msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+msgstr "\"%s\" è un collegamento simbolico, ma i collegamenti simbolici non sono supportati su questa piattaforma"
+
+#: file_ops.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "lettura della directory \"%s\" fallita: %m"
+
+#: file_ops.c:475
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "impossibile chiudere la directory \"%s\": %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "il file di dati \"%s\" nel codice sorgente non è un file normale"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "file di origine duplicato \"%s\""
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "modifica imprevista della pagina per il file non regolare \"%s\""
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "tipo di file sconosciuto per \"%s\""
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "il file \"%s\" è di tipo diverso in origine e destinazione"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "non riuscivo a decidere cosa fare con il file \"%s\""
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "pulizia del search_path fallita: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "full_page_writes dev'essere abilitato nel server di origine"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "non è possibile analizzare il contenuto del file \"%s\""
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "errore nell'esecuzione della query (%s) nel server di origine: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "risultato imprevisto dalla query"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "errore nell'esecuzione della query (%s) nel server di origine: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "risultato non riconosciuto \"%s\" per la posizione di inserimento WAL corrente"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "ricezione della lista dei file fallita: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "risultato imprevisto ricevendo la lista dei file"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "invio della query non riuscito: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "impossibile impostare la connessione libpq in modalità riga singola"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "risultato imprevisto ricevendo i file remoti: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "richiesta di arresto immediate ricevuta"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "dimensione del risultato imprevisto ricevendo i file remoti"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "tipo di dati imprevisto nel risultato ricevendo i file remoti: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "formato del risultato imprevisto ricevendo i file remoti"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "valori null non previsti nel risultato ricevendo i file remoti"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "lunghezza del risultato non prevista ricevendo i file remoti"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "dati ricevuti per il file \"%s\", quando richiesto per \"%s\""
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "dati ricevuti all'offset %lld del file \"%s\", quando richiesto per l'offset %lld"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "ricevuto più di quanto richiesto per il file \"%s\""
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "numero imprevisto di blocchi di dati ricevuti"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "ricezione del file remoto \"%s\" fallita: %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "set di risultati imprevisti durante il recupero del file remoto \"%s\""
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "impossibile aprire il file sorgente \"%s\": %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "dimensione del file di origine \"%s\" modificata contemporaneamente: %d byte previsti, %d copiati"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "chiusura del file \"%s\" fallita: %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "impossibile cercare nel file di origine: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "EOF imprevisto durante la lettura del file \"%s\""
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "Errore nell'allocazione di un processore di lettura del WAL."
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "lettura del record WAL a %X/%X fallita: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "lettura del record WAL a %X/%X fallita"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "il puntatore finale %X/%X non è un punto finale valido; previsto %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "impossibile trovare il record WAL precedente a %X/%X: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "impossibile trovare il record WAL precedente a %X/%X"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "spostamento nel file \"%s\" fallito: %m"
+
+#: parsexlog.c:440
+#, c-format
+msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+msgstr "Il record WAL modifica una relazione, ma il tipo di record non viene riconosciuto: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:86
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s risincronizza un cluster PostgreSQL con un'altra copia del cluster.\n"
+"\n"
+
+#: pg_rewind.c:87
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"Utilizzo:\n"
+" %s [OPZIONE]...\n"
+"\n"
+
+#: pg_rewind.c:88
+#, c-format
+msgid "Options:\n"
+msgstr "Opzioni:\n"
+
+#: pg_rewind.c:89
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal usa restore_command nella configurazione di destinazione in\n"
+" recuperare i file WAL dagli archivi\n"
+
+#: pg_rewind.c:91
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=DIRECTORY directory dati esistente da modificare\n"
+
+#: pg_rewind.c:92
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=DIRECTORY directory dati di partenza con cui sincronizzare\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONNSTR server di origine con cui sincronizzare\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run fermati prima di modificare qualunque cosa\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --no-sync non aspettare che i dati siano scritti con sicurezza\n"
+" sul disco\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress stampa messaggi di avanzamento\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf configurazione di scrittura per la replica\n"
+" (richiede --source-server)\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=FILENAME utilizza la configurazione del server principale specificata\n"
+" file durante l'esecuzione del cluster di destinazione\n"
+
+#: pg_rewind.c:102
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug stampa una gran quantità di messaggi di debug\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr " --no-ensure-shutdown non corregge automaticamente l'arresto non pulito\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version stampa informazioni sulla versione ed esci\n"
+
+#: pg_rewind.c:105
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: pg_rewind.c:107
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237
+#: pg_rewind.c:244 pg_rewind.c:252
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_rewind.c:222
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "nessuna fonte specificata (--source-pgdata o --source-server)"
+
+#: pg_rewind.c:229
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "può essere specificato solo uno tra --source-pgdata o --source-server"
+
+#: pg_rewind.c:236
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "nessuna directory dei dati di destinazione specificata (--target-pgdata)"
+
+#: pg_rewind.c:243
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "nessuna informazione sul server di origine (--source-server) specificata per --write-recovery-conf"
+
+#: pg_rewind.c:250
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_rewind.c:265
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "non può essere eseguito da \"root\""
+
+#: pg_rewind.c:266
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "È obbligatorio eseguire %s come superutente di PostgreSQL."
+
+#: pg_rewind.c:276
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "lettura dei permessi della directory \"%s\" fallita: %m"
+
+#: pg_rewind.c:294
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:297
+#, c-format
+msgid "connected to server"
+msgstr "connesso al server"
+
+#: pg_rewind.c:344
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "i cluster di origine e di destinazione sono sulla stessa linea temporale"
+
+#: pg_rewind.c:353
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "i server sono andati a divergere alla posizione WAL %X/%X sulla timeline %u"
+
+#: pg_rewind.c:401
+#, c-format
+msgid "no rewind required"
+msgstr "rewind non richiesto"
+
+#: pg_rewind.c:410
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "riavvolgimento dall'ultimo checkpoint comune a %X/%X sulla timeline %u"
+
+#: pg_rewind.c:420
+#, c-format
+msgid "reading source file list"
+msgstr "lettura della lista dei file di origine"
+
+#: pg_rewind.c:424
+#, c-format
+msgid "reading target file list"
+msgstr "lettura della lista dei file di destinazione"
+
+#: pg_rewind.c:433
+#, c-format
+msgid "reading WAL in target"
+msgstr "lettura del WAL nella destinazione"
+
+#: pg_rewind.c:454
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "è necessario copiare %lu MB (la dimensione totale della directory di origine è di %lu MB)"
+
+#: pg_rewind.c:472
+#, c-format
+msgid "syncing target data directory"
+msgstr "sincronizzazione della directory dati di destinazione"
+
+#: pg_rewind.c:488
+#, c-format
+msgid "Done!"
+msgstr "Fatto!"
+
+#: pg_rewind.c:568
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "nessuna azione decisa per il file \"%s\""
+
+#: pg_rewind.c:600
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "il sistema sorgente è stato modificato mentre pg_rewind era in esecuzione"
+
+#: pg_rewind.c:604
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "creazione dell'etichetta di backup e aggiornamento del file di controllo"
+
+#: pg_rewind.c:654
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "il sistema di origine era in uno stato imprevisto al termine del riavvolgimento"
+
+#: pg_rewind.c:685
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "i cluster di origine e di destinazione sono di sistemi diversi"
+
+#: pg_rewind.c:693
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "i cluster non sono compatibili con questa versione di pg_rewind"
+
+#: pg_rewind.c:703
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "il server di destinazione deve utilizzare i checksum dei dati o \"wal_log_hints = on\""
+
+#: pg_rewind.c:714
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "il server di destinazione deve essere spento in modo pulito"
+
+#: pg_rewind.c:724
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "la directory dei dati di origine deve essere chiusa in modo pulito"
+
+#: pg_rewind.c:771
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) copiati"
+
+#: pg_rewind.c:834
+#, c-format
+msgid "invalid control file"
+msgstr "file di controllo non valido"
+
+#: pg_rewind.c:918
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "non è stato possibile trovare l'antenato comune delle linee temporali del cluster di origine e di destinazione"
+
+#: pg_rewind.c:959
+#, c-format
+msgid "backup label buffer too small"
+msgstr "buffer dell'etichetta di backup troppo piccolo"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "file di controllo imprevisto CRC"
+
+#: pg_rewind.c:994
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "dimensione del file di controllo imprevista %d, prevista %d"
+
+#: pg_rewind.c:1003
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "la dimensione del segmento WAL dev'essere una potenza di due tra 1 MB e 1 GB, ma il file di controllo specifica %d byte"
+msgstr[1] "la dimensione del segmento WAL dev'essere una potenza di due tra 1 MB e 1 GB, ma il file di controllo specifica %d byte"
+
+#: pg_rewind.c:1042 pg_rewind.c:1112
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "il programma \"%s\" è necessario per %s ma non è stato trovato nella stessa directory di \"%s\""
+
+#: pg_rewind.c:1045 pg_rewind.c:1115
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "il programma \"%s\" è stato trovato da \"%s\" ma non era della stessa versione di %s"
+
+#: pg_rewind.c:1078
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "restore_command non è impostato nel cluster di destinazione"
+
+#: pg_rewind.c:1119
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "eseguendo \"%s\" per il server di destinazione per completare il ripristino del crash"
+
+#: pg_rewind.c:1156
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "modalità utente singolo postgres nel cluster di destinazione non riuscita"
+
+#: pg_rewind.c:1157
+#, c-format
+msgid "Command was: %s"
+msgstr "Il comando era: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "errore di sintassi nel file dello storico: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "L'ID della timeline deve essere numerico."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "Attesa una locazione di switchpoint del log write-ahead."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "dati non validi nel file dello storico: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "Gli ID della timeline devono essere in ordine crescente."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "dati non validi nel file della cronologia"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "Gli ID della timeline devono avere valori inferiori degli ID della timeline figlia."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "offset del record non valido a %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord richiesto da %X/%X"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "lunghezza del record a %X/%X non valida: attesa %u, ricevuta %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "memoria insufficiente durante il tentativo di decodificare un record di lunghezza %u"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "lunghezza del record %u a %X/%X eccessiva"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "non c'è un flag di contrecord a %X/%X"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "lunghezza contrada non valida %u (prevista %lld) a %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "record mancante a %X/%X"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ID di gestione risorse %u non valido a %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "record con link-precedente %X/%X non corretto a %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "checksum dei dati del manager di risorse non corretto nel record a %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "numero magico %04X non valido nel segmento di log %s, offset %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "bit di info %04X non validi nel segmento di log %s, offset %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "Il file WAL proviene da un sistema di database diverso: l'identificatore del sistema del database del file WAL è %llu, l'identificatore del sistema del database pg_control è %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "il file WAL è di un database diverso: dimensione del segmento errata nell'header della pagina"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "il file WAL è di un database diverso: XLOG_BLCKSZ non corretto nell'header di pagina"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "pageaddr inaspettato %X/%X nel segmento di log %s, offset %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "ID della timeline %u (dopo %u) fuori sequenza nel segmento di log %s, offset %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id fuori sequenza %u a %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA impostato, ma dati non inclusi a %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA non impostato, ma la lunghezza dei dati è %u a %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE impostato, ma offset buco %u lunghezza %u lunghezza dell'immagine del blocco %u a %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE non impostato, ma offset buco %u lunghezza %u a %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED impostato, ma blocca la lunghezza dell'immagine %u a %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "né BKPIMAGE_HAS_HOLE né BKPIMAGE_COMPRESSED impostati, ma la lunghezza dell'immagine del blocco è %u a %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL impostato ma non c'è un rel precedente a %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "block_id %u non valido a %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "record con lunghezza non valida a %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "impossibile individuare il blocco di backup con ID %d nel record WAL"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "impossibile ripristinare l'immagine in %X/%X con il blocco %d non valido specificato"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "impossibile ripristinare l'immagine in %X/%X con stato non valido, blocco %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "impossibile ripristinare l'immagine in %X/%X compressa con %s non supportata da build, blocco %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "impossibile ripristinare l'immagine in %X/%X compressa con metodo sconosciuto, blocco %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "impossibile decomprimere l'immagine in %X/%X, blocco %d"
+
+#~ msgid " block %u\n"
+#~ msgstr " blocco %u\n"
+
+#~ msgid "\"%s\" is not a directory\n"
+#~ msgstr "\"%s\" non è una directory\n"
+
+#~ msgid "\"%s\" is not a regular file\n"
+#~ msgstr "\"%s\" non è un file regolare\n"
+
+#~ msgid "\"%s\" is not a symbolic link\n"
+#~ msgstr "\"%s\" non è un link simbolico\n"
+
+#~ msgid "%d: %X/%X - %X/%X\n"
+#~ msgstr "%d: %X/%X - %X/%X\n"
+
+#~ msgid "%s (%s)\n"
+#~ msgstr "%s (%s)\n"
+
+#~ msgid "%s: could not read permissions of directory \"%s\": %s\n"
+#~ msgstr "%s: lettura dei permessi della directory \"%s\" fallita: %s\n"
+
+#~ msgid "Expected a numeric timeline ID.\n"
+#~ msgstr "Atteso un ID numerico di timeline.\n"
+
+#~ msgid "Expected a write-ahead log switchpoint location.\n"
+#~ msgstr "Attesa una locazione di switchpoint del log write-ahead.\n"
+
+#~ msgid "Failure, exiting\n"
+#~ msgstr "Errore, uscita\n"
+
+#~ msgid "Source timeline history:\n"
+#~ msgstr "Storia della timeline di origine:\n"
+
+#~ msgid "Target timeline history:\n"
+#~ msgstr "Storia della timeline di destinazione:\n"
+
+#~ msgid ""
+#~ "The program \"initdb\" is needed by %s but was\n"
+#~ "not found in the same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Il programma \"initdb\" è richiesto da %s ma non è\n"
+#~ "stato tro vato nella stessa directory di \"%s\".\n"
+#~ "Controlla la tua installazione.\n"
+
+#~ msgid ""
+#~ "The program \"initdb\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Il programma \"initdb\" è stato trovato da \"%s\"\n"
+#~ "ma non è la stessa versione di %s.\n"
+#~ "Controlla la tua installazione.\n"
+
+#~ msgid "Timeline IDs must be in increasing sequence.\n"
+#~ msgstr "Gli ID di timeline devono essere in sequenza crescente.\n"
+
+#~ msgid "Timeline IDs must be less than child timeline's ID.\n"
+#~ msgstr "Gli ID della timeline devono essere meno dell'ID della timeline del figlio.\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
+
+#~ msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte\n"
+#~ msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes\n"
+#~ msgstr[0] "la dimensione del semgento WAL deve essere una potenza di due tra 1 MB e 1 GB, ma il file di controllo specifica %d byte\n"
+#~ msgstr[1] "la dimensione del semgento WAL deve essere una potenza di due tra 1 MB e 1 GB, ma il file di controllo specifica %d byte\n"
+
+#~ msgid "could not close file \"%s\": %s\n"
+#~ msgstr "chiusura del file \"%s\" fallita: %s\n"
+
+#~ msgid "could not connect to server: %s"
+#~ msgstr "connessione al server fallita: %s"
+
+#~ msgid "could not create directory \"%s\": %s\n"
+#~ msgstr "creazione della directory \"%s\" fallita: %s\n"
+
+#~ msgid "could not create temporary table: %s"
+#~ msgstr "creazione della tabella temporanea fallita: %s"
+
+#~ msgid "could not open directory \"%s\": %s\n"
+#~ msgstr "apertura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "could not open file \"%s\" for reading: %s\n"
+#~ msgstr "apertura del file \"%s\" in lettura fallita: %s\n"
+
+#~ msgid "could not open file \"%s\": %s\n"
+#~ msgstr "apertura del file \"%s\" fallita: %s\n"
+
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "lettura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "could not read file \"%s\": %s\n"
+#~ msgstr "lettura del file \"%s\" fallita: %s\n"
+
+#~ msgid "could not read from file \"%s\": %s\n"
+#~ msgstr "lettura dal file \"%s\" fallita: %s\n"
+
+#~ msgid "could not read symbolic link \"%s\": %s\n"
+#~ msgstr "lettura del link simbolico \"%s\" fallita: %s\n"
+
+#~ msgid "could not remove directory \"%s\": %s\n"
+#~ msgstr "rimozione della directory \"%s\" fallita: %s\n"
+
+#~ msgid "could not remove file \"%s\": %s\n"
+#~ msgstr "rimozione del file \"%s\" fallita: %s\n"
+
+#~ msgid "could not remove symbolic link \"%s\": %s\n"
+#~ msgstr "rimozione del link simbolico \"%s\" fallita: %s\n"
+
+#~ msgid "could not seek in file \"%s\": %s\n"
+#~ msgstr "spostamento nel file \"%s\" fallito: %s\n"
+
+#~ msgid "could not send COPY data: %s"
+#~ msgstr "invio dei dati di COPY fallito: %s"
+
+#~ msgid "could not send end-of-COPY: %s"
+#~ msgstr "invio del fine-COPY fallito: %s"
+
+#~ msgid "could not send file list: %s"
+#~ msgstr "invio della lista dei file fallito: %s"
+
+#~ msgid "could not set up connection context: %s"
+#~ msgstr "preparazione del contesto di connessione fallita: %s"
+
+#~ msgid "could not stat file \"%s\": %s\n"
+#~ msgstr "richiesta informazioni sul file \"%s\" fallita: %s\n"
+
+#~ msgid "could not truncate file \"%s\" to %u: %s\n"
+#~ msgstr "troncamento del file \"%s\" a %u fallito: %s\n"
+
+#~ msgid "could not write file \"%s\": %s\n"
+#~ msgstr "scrittura nel file \"%s\" fallita: %s\n"
+
+#~ msgid "entry \"%s\" excluded from source file list\n"
+#~ msgstr "voce \"%s\" esclusa dalla lista di file sorgenti\n"
+
+#~ msgid "entry \"%s\" excluded from target file list\n"
+#~ msgstr "voce \"%s\" esclusa dalla lista di file di destinazione\n"
+
+#~ msgid "fetched file \"%s\", length %d\n"
+#~ msgstr "ricevuto il file \"%s\", lunghezza %d\n"
+
+#~ msgid "getting file chunks\n"
+#~ msgstr "ricezione blocchi del file\n"
+
+#~ msgid "invalid data in history file: %s\n"
+#~ msgstr "dati non validi nel file di storia: %s\n"
+
+#~ msgid "received null value for chunk for file \"%s\", file has been deleted\n"
+#~ msgstr "ricevuto valore null per il blocco del file \"%s\", il file è stato cancellato\n"
+
+#~ msgid "source file list is empty\n"
+#~ msgstr "la lista dei file di origine è vuota\n"
+
+#~ msgid "source server must not be in recovery mode\n"
+#~ msgstr "il server di origine non dev'essere in modalità di recupero\n"
+
+#~ msgid "symbolic link \"%s\" target is too long\n"
+#~ msgstr "destinazione del link simbolico \"%s\" troppo lunga\n"
+
+#~ msgid "sync of target directory failed\n"
+#~ msgstr "sincronizzazione della directory di destinazione fallita\n"
+
+#~ msgid "syntax error in history file: %s\n"
+#~ msgstr "errore di sintassi nel file di storia: %s\n"
+
+#~ msgid "unexpected result while sending file list: %s"
+#~ msgstr "risultato imprevisto inviando la lista dei file: %s"
diff --git a/src/bin/pg_rewind/po/ja.po b/src/bin/pg_rewind/po/ja.po
new file mode 100644
index 0000000..2dbbf29
--- /dev/null
+++ b/src/bin/pg_rewind/po/ja.po
@@ -0,0 +1,1009 @@
+# pg_rewind.po
+# Japanese message translation file for pg_rewind
+#
+# Copyright (C) 2016-2022 PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 11:14+0900\n"
+"PO-Revision-Date: 2022-09-26 14:53+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.13\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリ不足です\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null ポインタを複製できません(内部エラー)\n"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "ライブラリ\"%s\"をロードできませんでした: エラーコード %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "このプラットフォームでは制限付きトークンを生成できません: エラーコード %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "プロセストークンをオープンできませんでした: エラーコード %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "SIDを割り当てられませんでした: エラーコード %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "制限付きトークンを作成できませんでした: エラーコード %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "\"%s\"コマンドのプロセスを起動できませんでした: エラーコード %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "制限付きトークンで再実行できませんでした: %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "サブプロセスの終了コードを取得できませんでした。: エラーコード %lu"
+
+#: ../../fe_utils/archive.c:52
+#, c-format
+msgid "cannot use restore_command with %%r placeholder"
+msgstr "%%r置換を含むrestore_commandは使用できません"
+
+#: ../../fe_utils/archive.c:70
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "想定外の\"%1$s\"のファイルサイズ: %3$lld ではなく %2$lld"
+
+#: ../../fe_utils/archive.c:78
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "アーカイブからリストアされたファイル\"%s\"のオープンに失敗しました: %m"
+
+#: ../../fe_utils/archive.c:87 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ファイル\"%s\"のstatに失敗しました: %m"
+
+#: ../../fe_utils/archive.c:99
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_commandが失敗しました: %s"
+
+#: ../../fe_utils/archive.c:106
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "ファイル\"%s\"をアーカイブからリストアできませんでした"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "メモリ不足です"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンできませんでした: %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "ファイル\"%s\"を書き出せませんでした: %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "ファイル\"%s\"を作成できませんでした: %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "ターゲットファイル\"%s\"をオープンできませんでした: %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "ターゲットファイル\"%s\"をクローズできませんでした: %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "ターゲットファイル\"%s\"をシークできませんでした: %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ファイル\"%s\"を書き出せませんでした: %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "\"%s\"に対する未定義のファイルタイプ"
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "通常のファイルに対する不正なアクション(CREATE)です"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "ファイル\"%s\"を削除できませんでした: %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "ファイル\"%s\"を切り詰めのためにオープンできませんでした: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "ファイル\"%s\"を%uバイトに切り詰められませんでした: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を作成できませんでした: %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を削除できませんでした: %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "\"%s\"にシンボリックリンクを作成できませんでした: %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "シンボリックリンク\"%s\"を削除できませんでした: %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "ファイル\"%s\"を読み取り用にオープンできませんでした: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ファイル\"%s\"の読み取りに失敗しました: %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込みました"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m"
+
+#: file_ops.c:446
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "シンボリックリンク\"%s\"を読めませんでした: %m"
+
+#: file_ops.c:449
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "シンボリックリンク\"%s\"の参照先が長すぎます"
+
+#: file_ops.c:464
+#, c-format
+msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+msgstr "\"%s\"はシンボリックリンクですが、このプラットフォームではシンボリックリンクをサポートしていません"
+
+#: file_ops.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m"
+
+#: file_ops.c:475
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をクローズできませんでした: %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "ソースのデータファイル\"%s\"は通常のファイルではありません"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "ソースファイル\"%s\"が重複しています"
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "非通常ファイル\"%s\"に対する想定外のページの書き換えです"
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "\"%s\"に対する未知のファイルタイプ"
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "ファイル\"%s\"はソースとターゲットとで異なるタイプです"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "ファイル\"%s\"の処理を決定できませんでした"
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "search_pathを消去できませんでした: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "ソースサーバーではfull_pate_writesは有効でなければなりません"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "ファイル内容を取得するための文を準備できませんでした: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "ソースサーバーで実行中のクエリ(%s)でエラー: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "クエリから想定外の結果セット"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "ソースサーバーの実行中のクエリ(%s)でエラー: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "現在のWAL挿入位置として認識不可の結果\"%s\""
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "ファイルリストをフェッチできませんでした: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "ファイルリストのフェッチ中に想定外の結果セット"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "クエリを送信できませんでした: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "libpq接続を単一行モードに設定できませんでした"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "リモートファイルをフェッチ中に想定外の結果: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "要求よりも多くのデータチャンクが到着しました"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "リモートファイルのフェッチ中に想定外の結果セットサイズ"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "リモートファイルのフェッチ中の結果セットに想定外のデータ型: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "リモートファイルのフェッチ中に想定外の結果形式"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "リモートファイルのフェッチ中の結果に想定外のNULL値"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "リモートファイルのフェッチ中に想定外の結果の長さ"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "ファイル\"%s\"への要求に対してファイル\"%s\"のデータを受信しました"
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "ファイル\"%2$s\"のオフセット%3$lldへの要求に対してオフセット%1$lldのデータを受信しました"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "ファイル”%s\"に対して要求よりも多量のデータを受信しました"
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "想定外の数のデータチャンクを受信しました"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "リモートファイル\"%s\"をフェッチできませんでした: %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "リモートファイル\"%s\"のフェッチ中に想定外の結果セット"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "ソースファイル\"%s\"をオープンすることができませんでした: %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "ファイル\"%s\"のサイズが同時に変更されました。%dバイトを期待していましたが、%dバイトコピーされました"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ファイル\"%s\"をクローズできませんでした: %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "ソースファイルをシークすることができませんでした: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "ファイル\"%s\"を読み込み中に想定外のEOF"
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "WAL読み取り機構のメモリ割り当て中にメモリ不足"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "%X/%XのWALレコードを読み取れませんでした: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "%X/%XのWALレコードを読み取れませんでした"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "終了点%X/%Xは妥当な終了点ではありません; %X/%Xを期待していました"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "%X/%Xの前のWALレコードが見つかりませんでした: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "%X/%Xの前のWALレコードが見つかりませんでした"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "ファイル\"%s\"をシークできませんでした: %m"
+
+#: parsexlog.c:440
+#, c-format
+msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+msgstr "WALレコードはリレーションを更新しますが、レコードの型を認識できません: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:86
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s はPostgreSQLクラスタをそのクラスタのコピーで再同期します。\n"
+"\n"
+
+#: pg_rewind.c:87
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"使用方法:\n"
+" %s [オプション]...\n"
+"\n"
+
+#: pg_rewind.c:88
+#, c-format
+msgid "Options:\n"
+msgstr "オプション:\n"
+
+#: pg_rewind.c:89
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal ターゲットの設定の中のrestore_commandを使用して\n"
+" アーカイブからWALファイルを取得する\n"
+
+#: pg_rewind.c:91
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=DIRECTORY 修正を行う既存データディレクトリ\n"
+
+#: pg_rewind.c:92
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=DIRECTORY 同期元とするデータディレクトリ\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONNSTR 同期元とするサーバー\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run 修正を始める前に停止する\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr " -N, --no-sync 変更のディスクへの安全な書き出しを待機しない\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress 進捗メッセージを出力\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf レプリケーションのための設定を書き込む\n"
+" (--source-server が必要となります)\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=FILENAME ターゲットのクラスタの実行時に指定した\n"
+" 主サーバー設定ファイルを使用する\n"
+
+#: pg_rewind.c:102
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug 多量のデバッグメッセージを出力\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr " --no-ensure-shutdown 非クリーンシャットダウン後の修正を自動で行わない\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: pg_rewind.c:105
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"バグは<%s>に報告してください。\n"
+
+#: pg_rewind.c:107
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237
+#: pg_rewind.c:244 pg_rewind.c:252
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細は\"%s --help\"を実行してください。"
+
+#: pg_rewind.c:222
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "ソースが指定されていません(--source-pgdata または --source-server)"
+
+#: pg_rewind.c:229
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "--source-pgdataか--source-server はいずれか一方のみ指定可能です"
+
+#: pg_rewind.c:236
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "ターゲットデータディレクトリが指定されていません(--target-pgdata)"
+
+#: pg_rewind.c:243
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "--write-recovery-confにソースサーバー情報(--source-server)が指定されていません"
+
+#: pg_rewind.c:250
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr " コマンドライン引数が多すぎます(先頭は\"%s\")"
+
+#: pg_rewind.c:265
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "\"root\"では実行できません"
+
+#: pg_rewind.c:266
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "PostgreSQLのスーパーユーザーで%sを実行しなければなりません"
+
+#: pg_rewind.c:276
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"の権限を読み取れませんでした: %m"
+
+#: pg_rewind.c:294
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:297
+#, c-format
+msgid "connected to server"
+msgstr "サーバーへ接続しました"
+
+#: pg_rewind.c:344
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "ソースとターゲットのクラスタが同一タイムライン上にあります"
+
+#: pg_rewind.c:353
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "タイムライン%3$uのWAL位置%1$X/%2$Xで両サーバーが分岐しています"
+
+#: pg_rewind.c:401
+#, c-format
+msgid "no rewind required"
+msgstr "巻き戻しは必要ありません"
+
+#: pg_rewind.c:410
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "タイムライン%3$uの%1$X/%2$Xにある最新の共通チェックポイントから巻き戻しています"
+
+#: pg_rewind.c:420
+#, c-format
+msgid "reading source file list"
+msgstr "ソースファイルリストを読み込んでいます"
+
+#: pg_rewind.c:424
+#, c-format
+msgid "reading target file list"
+msgstr "ターゲットファイルリストを読み込んでいます"
+
+#: pg_rewind.c:433
+#, c-format
+msgid "reading WAL in target"
+msgstr "ターゲットでWALを読み込んでいます"
+
+#: pg_rewind.c:454
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "%lu MBコピーする必要があります(ソースディレクトリの合計サイズは%lu MBです)"
+
+#: pg_rewind.c:472
+#, c-format
+msgid "syncing target data directory"
+msgstr "ターゲットデータディレクトリを同期しています"
+
+#: pg_rewind.c:488
+#, c-format
+msgid "Done!"
+msgstr "完了!"
+
+#: pg_rewind.c:568
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "ファイル\"%s\"に対するアクションが決定されていません"
+
+#: pg_rewind.c:600
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "pg_rewindの実行中にソースシス7テムが更新されました"
+
+#: pg_rewind.c:604
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "backup labelを作成して制御ファイルを更新しています"
+
+#: pg_rewind.c:654
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "巻き戻し完了時点のソースシステムが想定外の状態でした"
+
+#: pg_rewind.c:685
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "ソースクラスタとターゲットクラスタは異なるシステムのものです"
+
+#: pg_rewind.c:693
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "クラスタは、このバージョンのpg_rewindとの互換性がありません"
+
+#: pg_rewind.c:703
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "ターゲットサーバーはデータチェックサムを利用している、または\"wal_log_hints = on\"である必要があります"
+
+#: pg_rewind.c:714
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "ターゲットサーバーはきれいにシャットダウンされていなければなりません"
+
+#: pg_rewind.c:724
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "ソースデータディレクトリはきれいにシャットダウンされていなければなりません"
+
+#: pg_rewind.c:771
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) コピーしました"
+
+#: pg_rewind.c:834
+#, c-format
+msgid "invalid control file"
+msgstr "不正な制御ファイル"
+
+#: pg_rewind.c:918
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "ソースクラスタとターゲットクラスタのタイムラインの共通の祖先を見つけられません"
+
+#: pg_rewind.c:959
+#, c-format
+msgid "backup label buffer too small"
+msgstr "バックアップラベルのバッファが小さすぎます"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "想定外の制御ファイルCRCです"
+
+#: pg_rewind.c:994
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "想定外の制御ファイルのサイズ%d、想定は%d"
+
+#: pg_rewind.c:1003
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "WALセグメントのサイズ指定は1MBと1GBの間の2の累乗でなければなりません、しかしコントロールファイルでは%dバイトとなっています"
+
+#: pg_rewind.c:1042 pg_rewind.c:1112
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "%2$sには\"%1$s\"プログラムが必要ですが、\"%3$s\"と同じディレクトリにありませんでした。"
+
+#: pg_rewind.c:1045 pg_rewind.c:1115
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じバージョンではありませんでした。"
+
+#: pg_rewind.c:1078
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "ターゲットクラスタでrestore_commandが設定されていません"
+
+#: pg_rewind.c:1119
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "ターゲットサーバーに対して\"%s\"を実行してクラッシュリカバリを完了させます"
+
+#: pg_rewind.c:1156
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "ターゲットクラスタでのpostgresコマンドのシングルユーザーモード実行に失敗しました"
+
+#: pg_rewind.c:1157
+#, c-format
+msgid "Command was: %s"
+msgstr "コマンド: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "履歴ファイル内の構文エラー: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "数字のタイムラインIDを想定しました。"
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "先行書き込みログの切り替え点の場所があるはずでした。"
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "履歴ファイル内の不正なデータ: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "タイムラインIDは昇順でなければなりません"
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "履歴ファイル内の無効なデータ"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "タイムラインIDは子のタイムラインIDより小さくなければなりません。"
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "%X/%Xのレコードオフセットが無効です"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "%X/%Xではcontrecordが必要です"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "%X/%Xのレコード長が無効です:長さは%uである必要がありますが、長さは%uでした"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "長さ%uのレコードのデコード中のメモリ不足"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "%2$X/%3$Xのレコード長%1$uが大きすぎます"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "%X/%Xで contrecord フラグがありません"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "%3$X/%4$Xの継続レコードの長さ%1$u(正しくは%2$lld)は不正です"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "%X/%Xに継続レコードがありません"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "%2$X/%3$XのリソースマネージャID %1$uが無効です"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "直前のリンク%1$X/%2$Xが不正なレコードが%3$X/%4$Xにあります"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "%X/%Xのレコード内のリソースマネージャデータのチェックサムが不正です"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "ログセグメント%2$s、オフセット%3$uのマジックナンバー%1$04Xは無効です"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "ログセグメント %2$s、オフセット %3$u の情報ビット %1$04X は無効です"
+
+#: xlogreader.c:1260
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "WALファイルは異なるデータベースシステム由来のものです: WALファイルのデータベースシステム識別子は %lluで、pg_control におけるデータベースシステム識別子は %lluです"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのセグメントサイズが正しくありません"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのXLOG_BLCKSZが正しくありません"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "ログセグメント%3$s、オフセット%4$uのページアドレス%1$X/%2$Xは想定外です"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "ログセグメント%3$s、オフセット%4$uの時系列ID %1$u(%2$uの後)は順序に従っていません"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id %uが%X/%Xで無効です"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATAが設定されていますが、%X/%Xにデータがありません"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATAが設定されていませんが、%2$X/%3$Xのデータ長は%1$u"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLEが設定されていますが、%4$X/%5$Xでホールオフセット%1$u、長さ%2$u、ブロックイメージ長%3$u"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLEが設定されていませんが、%3$X/%4$Xにホールオフセット%1$u、長さ%2$u"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSEDが設定されていますが、%2$X/%3$Xにおいてブロックイメージ長が%1$uです"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLEもBKPIMAGE_COMPRESSEDも設定されていませんが、%2$X/%3$Xにおいてブロックイメージ長が%1$uです"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_RELが設定されていますが、%X/%Xにおいて以前のリレーションがありません"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "%2$X/%3$Xにおけるblock_id %1$uが無効です"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "%X/%Xのレコードのサイズが無効です"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "WALレコード中のID %dのバックアップブロックを特定できませんでした"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "%X/%Xで不正なブロック%dが指定されているためイメージが復元できませんでした"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "%X/%Xでブロック%dのイメージが不正な状態であるため復元できませんでした"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "%1$X/%2$Xで、ブロック%4$dがこのビルドでサポートされない圧縮方式%3$sで圧縮されているため復元できませんでした"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "%X/%Xでブロック%dのイメージが不明な方式で圧縮されているため復元できませんでした"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "%X/%Xのブロック%dが伸張できませんでした"
diff --git a/src/bin/pg_rewind/po/ka.po b/src/bin/pg_rewind/po/ka.po
new file mode 100644
index 0000000..51cbc16
--- /dev/null
+++ b/src/bin/pg_rewind/po/ka.po
@@ -0,0 +1,1101 @@
+# Georgian message translation file for pg_rewind
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_rewind (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-25 19:51+0000\n"
+"PO-Revision-Date: 2022-09-25 22:11+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდომა: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გაფრთხილება: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტალები: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნება: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "არასაკმარისი მეხსიერება\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ნულოვანი მაჩვენებლის დუბლირება შეუძლებელია (შიდა შეცდომა)\n"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "ბიბლიოთეკის (\"%s\") ჩატვირთვის შეცდომა: შეცდომის კოდი: %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "ამ პლატფორმაზე შეზღუდული კოდების შექმნა შეუძლებელია: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "პროცესის კოდის გახსნა შეუძლებელია: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "შეცდომა SSID-ების გამოყოფისას: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "შეზღუდული კოდის შექმნა ვერ მოხერხდა: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "„%s“ ბრძანების პროცესის დაწყება ვერ მოხერხდა: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "შეზღუდულ კოდის ხელახლა შესრულება ვერ მოხერხდა: შეცდომის კოდი %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "ქვეპროცესიდან გასასვლელი კოდი ვერ მივიღე: შეცდომის კოდი %lu"
+
+#: ../../fe_utils/archive.c:52
+#, c-format
+msgid "cannot use restore_command with %%r placeholder"
+msgstr ""
+"restore_command-ის გამოყენება %%r ადგილმჭერის გარეშე გამოყენება შეუძლებელია"
+
+#: ../../fe_utils/archive.c:70
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "\"%s\"-ის მოულოდნელი ზომა: %lld %lld-ის მაგიერ"
+
+#: ../../fe_utils/archive.c:78
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "არქივიდან აღდგენილი ფაილის (\"%s\") გახსნის შეცდომა: %m"
+
+#: ../../fe_utils/archive.c:87 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ფაილი \"%s\" არ არსებობს: %m"
+
+#: ../../fe_utils/archive.c:99
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "აღდგენის_ბრძანების შეცდომა: %s"
+
+#: ../../fe_utils/archive.c:106
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "\"%s\"-ის არქივიდან აღდგენის შეცდომა"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "არასაკმარისი მეხსიერება"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფაილის (%s) გახსნის შეცდომა: %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "ფაილში (%s) ჩაწერის შეცდომა: %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "ფაილის (%s) შექმნის შეცდომა: %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "სამიზნე ფაილის (%s) გახსნის შეცდომა: %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "სამიზნე ფაილის (%s) დახურვის შეცდომა: %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "სამიზნე ფაილში (%s) გადახვევის შეცდომა: %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ფაილში (%s) ჩაწერის შეცდომა: %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "%s: ფაილის არასწორი ტიპი"
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "არასწორი ქმედება (CREATE) ჩვეულებრივი ფაილისთვის"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "ფაილის წაშლის შეცდომა \"%s\": %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "წასაკვეთი ფაილის (%s) გახსნის შეცდომა: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "ფაილის (%s) %u-მდე მოკვეთის შეცდომა: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "საქაღალდის (%s) შექმნის შეცდომა: %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "საქაღალდის (\"%s\") წაშლის შეცდომა: %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "სიმბმულის შექმნის შეცდომა %s: %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "სიმბმულის წაშლის შეცდომა %s: %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "ფაილის (%s) გახსნის შეცდომა: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ფაილის (%s) წაკითხვის შეცდომა: %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "\"%s\"-ის წაკითხვის შეცდომა: წაკითხულია %d %zu-დან"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "საქაღალდის (%s) გახსნის შეცდომა: %m"
+
+#: file_ops.c:446
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "სიმბოლური ბმის \"%s\" წაკითხვის შეცდომა: %m"
+
+#: file_ops.c:449
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "%s: სიმბმული ძალიან გრძელია"
+
+#: file_ops.c:464
+#, c-format
+msgid ""
+"\"%s\" is a symbolic link, but symbolic links are not supported on this "
+"platform"
+msgstr ""
+"%s სიმბმულია, მაგრამ სიმბოლური ბმულები ამ პლატფორმაზე მხარდაჭერილი არაა"
+
+#: file_ops.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "საქაღალდის (%s) წაკითხვის შეცდომა: %m"
+
+#: file_ops.c:475
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "საქაღალდის %s-ზე დახურვის შეცდომა: %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "წყაროში არსებული მონაცემების ფალი \"%s\" ჩვეულებრივი ფაილი არაა"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "დუბლირებული საწყისი ფაილი : \"%s\""
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "არაჩვეულებრივი ფაილის (%s) გვერდების მოულოდნელი ცვლილება"
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "ფაილის უცნობი ტიპი \"%s\"."
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "ფაილი %s წყაროში და სამიზნეში სხვადასხვა ტიპისაა"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "ვერ გადავწყვიტე, ფაილს რა ვუყო: %s"
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "search_path-ის გასუფთავების პრობლემა: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "საწყის სერვერზე full_page_writes-ის ჩართვა აუცილებელია"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "შეცდომა ფაილის შემცველობის გამოსათხოველი ოპერაციების მომზადებისას: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "შეცდომა სერვერზე (%2$s) მოთხოვნის (%1$s) შესრულებისას"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "მოთხოვნის მოულოდნელი სედეგი"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "შეცდომა სერვერში (%2$s) მოთხოვნის (%1$s) შესრულებისას"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "უცნობი პასუხი მიმდინარე WAL ჩასმის მდებარეობისთვის: %s"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "ფაილების სიის მიღების პრობლემა: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "მოულოდნელი პასუხი ფაილების სიის მიღებისას"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "მოთხოვნის გაგზავნის პრობლემა: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "ერთმწკრივიან რეჟიმში libpq შეერთების დაყენება შეუძლებელია"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "დაშორებული ფაილების მიღების მოულოდნელი შედეგი: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "მიღებულია მეტი ნაგლეჯი, ვიდრე მოვითხოვე"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "ფაილების გამოთხოვისას მიღებული შედეგების სეტის მოულოდნელი ზომა"
+
+#: libpq_source.c:515
+#, c-format
+msgid ""
+"unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr ""
+"მონაცემების მოულოდნელი ტიპები დაშორებული ფაილების გამოთხოვისას შედეგების "
+"სეტში: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "დაშორებული ფაილების მიღებისას მიღებული ფორმატი მოულოდნელია"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr ""
+"დაშორებული ფაილების მიღების შედეგი მოულოდნელ ნულოვან მნიშვნელობებს შეიცავს"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "დაშორებული ფაილის მიღებისას მიღებული შედეგის სიგრძე არასწორია"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "მიღებულია მონაცემები ფაილისთვის \"%s\", მაშინ, როცა მოვითხოვე \"%s\""
+
+#: libpq_source.c:570
+#, c-format
+msgid ""
+"received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr ""
+"მონაცემები მიღებულია წანაცვლებისთვის %lld ფაილში %s მაშინ, როცა მოთხოვნილი "
+"იყო წანაცვლებისთვის %lld"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "მიღებულია მეტი, ვიდრე მოთხოვნილია ფაილისთვის: %s"
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "მონაცემების მიღებული ნაწილების რიცხვი არასწორია"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "დაშორებული ფაილის (%s) მიღების შეცდომა: %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "მოულოდნელი პასუხი დაშორებული ფაილის (%s) მიღებისას"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "წყაროს ფაილის \"%s\" გახსნის შეცდომა: %m"
+
+#: local_source.c:117
+#, c-format
+msgid ""
+"size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "ფაილის (%s) ზომა პარალელურად შეიცვალა: მოველოდი %d ბაიტს. დაკოპირდა %d"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ფაილის (%s) დახურვის შეცდომა: %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "საწყის ფაილში გადახვევის პრობლემა: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "მოულოდნელი EOF ფაილის კითხვისას: %s"
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "არასაკმარისი მეხსიერება WAL-ის წამკითხავი პროცესორისთვის"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "შეცდომა WAL ჩანაწერის კითხვისას: %X/%X: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "შეცდომა WAL ჩანაწერის კითხვისას: %X/%X"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "ბოლოს მაჩვენებელი %X/%X არასწორი ბოლოს მაჩვენებელია. მოველოდი %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "წინა WAL ჩანაწერის პოვნა შეუძლებელია მისამართზე %X/%X: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "წინა WAL ჩანაწერის პოვნა შეუძლებელია მისამართზე %X/%X"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "ფაილში (%s) გადახვევის პრობლემა: %m"
+
+#: parsexlog.c:440
+#, c-format
+msgid ""
+"WAL record modifies a relation, but record type is not recognized: lsn: %X/"
+"%X, rmid: %d, rmgr: %s, info: %02X"
+msgstr ""
+"WAL ჩანაწერი ცვლის ურთიერთობას, მაგრამ ჩანაწერის ტიპი უცნობია: lsn: %X/%X, "
+"rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:86
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL კლასტერის მის ასლთან სინქრონიზაციას ახდენს.\n"
+"\n"
+
+#: pg_rewind.c:87
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"გამოყენება:\n"
+" %s [პარამეტრი]..\n"
+"\n"
+
+#: pg_rewind.c:88
+#, c-format
+msgid "Options:\n"
+msgstr "პარამეტრები:\n"
+
+#: pg_rewind.c:89
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration "
+"to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal არქივიდან WAL ფაილების მისაღებად სამიზნე "
+"კონფიგურაციაში \n"
+" restore_command -ის გამოყენება\n"
+
+#: pg_rewind.c:91
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=საქაღალდე მონაცემების საქაღალდე ჩასასწორებლად\n"
+
+#: pg_rewind.c:92
+#, c-format
+msgid ""
+" --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=საქაღალდედასასინქრონებელი საწყისი საქაღალდე\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONNSTR დასასინქრონებელი საწყისი სერვერი\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run გაჩერება, სანამ რამე შეიცვლება\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --no-sync არ დაველოდო ცვლილებების\n"
+" დისკზე უსაფრთხოდ ჩაწერას\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress მიმდინარეობის ინფორმაციის ჩვენება\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf რეპლიკაციის კონფიგურაციის ჩაწერა\n"
+" (მოითხოვს --source-server)\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=FILENAME სამიზნეკ ლასტერის გაშვებისას მთავარი \n"
+" სერვერის მითითებული კონფიგურაციის ფაილსი გამოყენება\n"
+"\n"
+
+#: pg_rewind.c:102
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr ""
+" --debug პროგრამის გასამართი შეტყობინებების "
+"გამოტანა\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid ""
+" --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr ""
+" --no-ensure-shutdown არ სცადო არასწორად გამორთვის შედეგების "
+"გასწორება\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: pg_rewind.c:105
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდომების შესახებ მიწერეთ: %s\n"
+
+#: pg_rewind.c:107
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
+
+#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237
+#: pg_rewind.c:244 pg_rewind.c:252
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'."
+
+#: pg_rewind.c:222
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "წყარო მითითებული არაა (--source-pgdata ან --source-server)"
+
+#: pg_rewind.c:229
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "შეიძლება მხოლოდ ერთის, --source-pgdata ან --source-server -ის მითითება"
+
+#: pg_rewind.c:236
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "სამიზნე საქაღალდე მითითებული არაა (--target-pgdata)"
+
+#: pg_rewind.c:243
+#, c-format
+msgid ""
+"no source server information (--source-server) specified for --write-"
+"recovery-conf"
+msgstr ""
+"საწყისი სერვერის ინფორმაცია (--source-server) პარამეტრსთვის --write-recovery-"
+"conf მითითებული არაა"
+
+#: pg_rewind.c:250
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")"
+
+#: pg_rewind.c:265
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "root-ით ვერ გაეშვება"
+
+#: pg_rewind.c:266
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "%s PostgreSQL-ის ზემომხმარებლით უნდა გაუშვათ."
+
+#: pg_rewind.c:276
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "საქაღალდის წვდომების წაკითხვა შეუძლებელია \"%s\": %m"
+
+#: pg_rewind.c:294
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:297
+#, c-format
+msgid "connected to server"
+msgstr "სერვერთან მიერთება წარმატებულია"
+
+#: pg_rewind.c:344
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "საწყისი და სამიზნე კლასტერები იგივე დროის ხაზზეა"
+
+#: pg_rewind.c:353
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "სერვერი დაშორდა WAL-ს მდებარეობაზე %X/%X დროის ხაზზე %u"
+
+#: pg_rewind.c:401
+#, c-format
+msgid "no rewind required"
+msgstr "გადახვევა საჭირო არაა"
+
+#: pg_rewind.c:410
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr ""
+"გადახვევა ბოლო საერთო საკონტროლო წერტილიდან მისამართზე %X/%X დროის ხაზზე %u"
+
+#: pg_rewind.c:420
+#, c-format
+msgid "reading source file list"
+msgstr "ფაილების წყაროს სიის კითხვა"
+
+#: pg_rewind.c:424
+#, c-format
+msgid "reading target file list"
+msgstr "სამიზნის ფაილების სიის კითხვა"
+
+#: pg_rewind.c:433
+#, c-format
+msgid "reading WAL in target"
+msgstr "სამიზნეში მყოფი WAL-ის კითხვა"
+
+#: pg_rewind.c:454
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "საჭიროა %lu მბ-ის კოპირება (საწყის საქაღალდის სრული ზომაა %lu მბ)"
+
+#: pg_rewind.c:472
+#, c-format
+msgid "syncing target data directory"
+msgstr "მონაცემების სამიზე საქაღალდის სინქრონიზაცია"
+
+#: pg_rewind.c:488
+#, c-format
+msgid "Done!"
+msgstr "შესრულებულია!"
+
+#: pg_rewind.c:568
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "ფაილისთვის %s ქმედება არჩეული არაა"
+
+#: pg_rewind.c:600
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "საწყისი ფაილი შეიცვალა, სანამ pg_rewind იყო გაშვებული"
+
+#: pg_rewind.c:604
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "მარქაფის ჭდის შექმნა და საკონტროლო ფაილის განახლება"
+
+#: pg_rewind.c:654
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "საწყისი სისტემა გადახვევისას გაურკვეველ მდგომარეობაში აღმოჩნდა"
+
+#: pg_rewind.c:685
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "საწყისი და სამიზნე კლასტერები სხვადასახვა სისტემებიდანაა"
+
+#: pg_rewind.c:693
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "კლასტერები pg_rewind-ის ამ ვერსიასთან შეუთავსებელია"
+
+#: pg_rewind.c:703
+#, c-format
+msgid ""
+"target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr ""
+"სამზნე სერვერზე საჭიროა ან მონაცემების საკონტროლო ჯამების გამოყენება, ან "
+"\"wal_log_hints = on\""
+
+#: pg_rewind.c:714
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "სამიზნე ბაზა წესების დაცვით უნდა იყოს გამორთული"
+
+#: pg_rewind.c:724
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "საწყისი ბაზა წესების დაცვით უნდა იყოს გამორთული"
+
+#: pg_rewind.c:771
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s კბ (%d%%) დაკოპირდა"
+
+#: pg_rewind.c:834
+#, c-format
+msgid "invalid control file"
+msgstr "არასწორი კონტროლის ფაილი"
+
+#: pg_rewind.c:918
+#, c-format
+msgid ""
+"could not find common ancestor of the source and target cluster's timelines"
+msgstr ""
+"საწყისი და სამიზნე კლასტერების დროის ხაზის საერთო წინაპრის პოვნა შეუძლებელია"
+
+#: pg_rewind.c:959
+#, c-format
+msgid "backup label buffer too small"
+msgstr "მარქაფის ჭდის ბაფერი ძალიან პატარაა"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "კონტროლის ფაილის მოულოდნელი CRC"
+
+#: pg_rewind.c:994
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "საკონტროლო ფაილის არასწორი სიგრძე: %d. უნდა იყოს: %d"
+
+#: pg_rewind.c:1003
+#, c-format
+msgid ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"control file specifies %d byte"
+msgid_plural ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"control file specifies %d bytes"
+msgstr[0] ""
+"WAL სეგმენტის ზომა ორის ხარისხი უნდა იყოს, 1 მბ-სა და 1გბ-ს შორის, მაგრამ "
+"კონტროლის ფაილში მითითებულია %d ბაიტი"
+msgstr[1] ""
+"WAL სეგმენტის ზომა ორის ხარისხი უნდა იყოს, 1 მბ-სა და 1გბ-ს შორის, მაგრამ "
+"კონტროლის ფაილში მითითებულია %d ბაიტი"
+
+#: pg_rewind.c:1042 pg_rewind.c:1112
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr ""
+"პროგრამა \"%s\" სჭირდება \"%s\"-ს, მაგრამ იგივე საქაღალდეში, სადაც \"%s\", "
+"ნაპოვნი არაა"
+
+#: pg_rewind.c:1045 pg_rewind.c:1115
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"პროგრამა „%s“ ნაპოვნია „%s“-ის მიერ, მაგრამ ვერსია, იგივეა არაა, რაც %s"
+
+#: pg_rewind.c:1078
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "სამიზნე კლასერში restore_command დაყენებული არაა"
+
+#: pg_rewind.c:1119
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "ავარიიდან სრულად აღდგენისთვის სამიზნე სერვერზე %s-ის შესრულდება"
+
+#: pg_rewind.c:1156
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "სამიზნე კლასტერში postgres-ის ერთმომხმარებლიანი რეჟიმის შეცდომა"
+
+#: pg_rewind.c:1157
+#, c-format
+msgid "Command was: %s"
+msgstr "ბრძანება იყო: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "სინტაქსის შეცდომა ისტორიის ფაილში: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "მოველოდი დროის ხაზის რიცხვობრივ ID-ს."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "მოველოდი წინასწარ-ჩაწერადი ჟურნალის გადართვის წერტილის მდებარეობას."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "არასწორი მონაცემები ისტორიის ფაილში \"%s\""
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "დროის ხაზის ID-ები ზრდადობით უნდა იყოს დალაგებული."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "არასწორი მონაცემები ისტორიის ფაილში"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "დროის ხაზის ID-ები შვილეული დროის ხაზის ID-ზე ნაკლები უნდა იყოს."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "ჩანაწერის არასწორი წანაცვლება მისამართზე %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord მოთხოვნილია %X/%X-ის მიერ"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "ჩანაწერის არასწორი სიგრძე მისამართზე %X/%X: მინდოდა %u, მივიღე %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "%u სიგრძის მქონე ჩანაწერის დეკოდირებისთვის მეხსიერება საკმარისი არაა"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "ჩანაწერის სიგრძე %u მისამართზე %X/%X ძალიან გრძელია"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "contrecord ალამი მისამართზე %X/%X არ არსებობს"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "contrecord -ის არასწორი სიგრძე %u (მოველოდი %lld) მისამართზე %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "contrecord მისამართზე %X/%X არ არსებობს"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "რესურსის მმართველის არასწორი ID %u მისამართზე %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "ჩანაწერი არასწორი წინა ბმულით %X/%X მისამართზე %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr ""
+"რესურსის მმართველის მონაცემების არასწორი საკონტროლო რიცხვი ჩანაწერში "
+"მისამართზე %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "არასწორი მაგიური რიცხვი %04X ჟურნალის სეგმენტში %s, წანაცვლება %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "არასწორი საინფორმაციო ბიტები %04X ჟურნალის სეგმენტში %s, წანაცვლება %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid ""
+"WAL file is from different database system: WAL file database system "
+"identifier is %llu, pg_control database system identifier is %llu"
+msgstr ""
+"WAL ფაილი სხვა ბაზიდანაა: WAL ფაილის ბაზის იდენტიფიკატორია %llu, pg_control-"
+"ის ბაზის სისტემის იდენტიფიკატორი კი %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect segment size in page "
+"header"
+msgstr ""
+"WAL ფაილი სხვა ბაზის სიტემიდანაა: სეგმანტის არასწორი ზომა გვერდის თავსართში"
+
+#: xlogreader.c:1274
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect XLOG_BLCKSZ in page "
+"header"
+msgstr ""
+"WAL ფაილი სხვა მონაცემთა ბაზის სისტემიდანაა: გვერდის თავსართში მითითებული "
+"XLOG_BLKSZ არასწორია"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "მოულოდნელი pageaddr %X/%X ჟურნალის სეგმენტში %s, წანაცვლება %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr ""
+"მიმდევრობის-გარე დროის ხაზის ID %u (%u-ის შემდეგ) ჟურნალის სეგმენტში %s, "
+"წანაცვლება %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "ურიგო block_id %u მისამართზე %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr ""
+"BKPBLOCK_HAS_DATA დაყენებულია, მაგრამ მონაცემები მისამართზე %X/%X არ არსებობს"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr ""
+"BKPBLOCK_HAS_DATA დაყენებულია, მაგრამ არსებობს მონაცემები სიგრძით %u "
+"მისამართზე %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid ""
+"BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at "
+"%X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE დაყენებულია, მაგრამ ნახვრეტის წანაცვლება %u სიგრძე %u "
+"ბლოკის ასლის სიგრძე %u მისამართზე %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE დაყენებული არაა, მაგრამ ნახვრეტის წანაცვლება %u სიგრძე %u "
+"მისანართზე %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_COMPRESSED დაყენებულია, მაგრამ ბლოკის ასლის სიგრძეა %u მისამართზე "
+"%X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid ""
+"neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image "
+"length is %u at %X/%X"
+msgstr ""
+"არც BKPIMAGE_HAS_HOLE და არც BKPIMAGE_COMPRESSED დაყენებული არაა, მაგრამ "
+"ბლოკის ასლის სიგრძე %u-ა, მისამართზე %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr ""
+"BKPBLOCK_SAME_REL დაყენებულია, მაგრამ წინა მნიშვნელობა მითითებული არაა "
+"მისამართზე %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "არასწორი block_id %u %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "ჩანაწერი არასწორი სიგრძით მისამართზე %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "შეცდომა WAL ჩანაწერში მარქაფი ბლოკის, ID-ით %d, მოძებნისას"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr ""
+"შეუძლებელია ასლის აღდგენა მისამართზე %X/%X, როცა მითითებულია არასწორი ბლოკი "
+"%d"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr ""
+"შეუძლებელია ასლის აღდგენა მისამართზე %X/%X არასწორი მდგომარეობით, ბლოკი %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with %s not supported by build, "
+"block %d"
+msgstr ""
+"%3$s მეთოდით შეკუმშული ასლის აღდგენა მისამართზე %1$X/%2$X, ბლოკი %4$d "
+"შეუძლებელია. მხარდაუჭერელია ამ აგების მიერ"
+
+#: xlogreader.c:2111
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr ""
+"შეუძლებელია ასლის აღდგენა მისამართზე %X/%X, შეკუმშულია უცნობი მეთოდით, ბლოკი "
+"%d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "შეუძლებელია ასლის გაშლა მისამართზე %X/%X, ბლოკი %d"
diff --git a/src/bin/pg_rewind/po/ko.po b/src/bin/pg_rewind/po/ko.po
new file mode 100644
index 0000000..d8ce7f0
--- /dev/null
+++ b/src/bin/pg_rewind/po/ko.po
@@ -0,0 +1,1073 @@
+# LANGUAGE message translation file for pg_rewind
+# Copyright (C) 2015 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2015.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:50+0000\n"
+"PO-Revision-Date: 2023-04-05 18:07+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "상세정보: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null 포인터를 복제할 수 없음(내부 오류)\n"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "\"%s\" 라이브러리를 불러 올 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "이 운영체제에서 restricted 토큰을 만들 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "프로세스 토큰을 열 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "SID를 할당할 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "restricted token을 만들 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "\"%s\" 명령을 위한 프로세스를 시작할 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "restricted token을 재실행 할 수 없음: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "하위 프로세스의 종료 코드를 구할 수 없음: 오류 코드 %lu"
+
+#: ../../fe_utils/archive.c:52
+#, c-format
+msgid "cannot use restore_command with %%r placeholder"
+msgstr "%%r 치환문자열로 restore_command 사용할 수 없음"
+
+#: ../../fe_utils/archive.c:70
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "\"%s\" 파일 크기가 이상함: %lld 로 비정상, 정상값 %lld"
+
+#: ../../fe_utils/archive.c:78
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "아카이브에서 \"%s\" 파일 복원 실패: %m"
+
+#: ../../fe_utils/archive.c:87 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" 파일의 상태값을 알 수 없음: %m"
+
+#: ../../fe_utils/archive.c:99
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_command 실패: %s"
+
+#: ../../fe_utils/archive.c:106
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "아카이브에서 \"%s\" 파일 복원 실패"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "메모리 부족"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파일을 열 수 없음: %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "\"%s\" 파일 쓰기 실패: %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "\"%s\" 파일을 만들 수 없음: %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "\"%s\" 대상 파일을 열 수 없음: %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "\"%s\" 대상 파일을 닫을 수 없음: %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "\"%s\" 대상 파일에서 seek 작업을 할 수 없음: %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "\"%s\" 파일 쓰기 실패: %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "알 수 없는 파일 포멧: \"%s\""
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "일반 파일에 대한 잘못 된 작업 (CREATE)"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "\"%s\" 파일을 삭제할 수 없음: %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "트랙잭션을 위한 \"%s\" 파일을 열 수 없음: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "\"%s\" 파일을 %u 크기로 정리할 수 없음: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 만들 수 없음: %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 삭제할 수 없음: %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "\"%s\"에 대한 심볼릭 링크를 만들 수 없음: %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "\"%s\" 심벌릭 링크를 삭제할 수 없음: %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "\"%s\" 파일 일기 모드로 열기 실패: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "\"%s\" 파일을 읽을 수 없음: %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "\"%s\" 파일을 읽을 수 없음: %d 읽음, 전체 %zu"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 열 수 없음: %m"
+
+#: file_ops.c:446
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "\"%s\" 심볼릭 링크 파일을 읽을 수 없음: %m"
+
+#: file_ops.c:449
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "\"%s\" 심볼릭 링크의 대상이 너무 긺"
+
+#: file_ops.c:464
+#, c-format
+msgid ""
+"\"%s\" is a symbolic link, but symbolic links are not supported on this "
+"platform"
+msgstr ""
+"\"%s\" 파일은 심볼릭 링크 파일이지만 이 운영체제는 심볼릭 링크 파일을 지원하"
+"지 않음"
+
+#: file_ops.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 읽을 수 없음: %m"
+
+#: file_ops.c:475
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 닫을 수 없음: %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "\"%s\" 자료 파일은 일반 파일이 아님"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "\"%s\" 소스 파일을 두 번 지정했습니다"
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "\"%s\" 비일반 파일의 페이지 변경 정보가 잘못됨"
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "\"%s\" 파일 형식을 알 수 없음"
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "\"%s\" 파일 형식이 소스와 타켓이 서로 다름"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "\"%s\" 파일로 뭘 해야할지 결정할 수 없음"
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "search_path를 지울 수 없음: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "원본 서버는 full_page_writes 옵션으로 운영되어야 함"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "파일 내용을 뽑기 위한 구문을 준비할 수 없음: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "원본 서버에서 쿼리 (%s) 실행 오류: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "쿼리 결과가 바르지 않음"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "원본에서에서 쿼리(%s) 실행 오류: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "현재 WAL 삽입 위치를 위한 결과가 잘못됨 : \"%s\""
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "파일 목록을 가져올 수 없음: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "파일 목록을 가져온 결과가 잘못 됨"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "쿼리를 보낼 수 없음: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "libpq 연결을 단일 로우 모드로 지정할 수 없음"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "원격 파일을 가져오는 도중 결과가 잘못됨: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "용천 된 것보다 많은 데이터 청크를 받았음"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "원격 파일을 가져오는 도중 결과 집합의 크기가 잘못 됨"
+
+#: libpq_source.c:515
+#, c-format
+msgid ""
+"unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "원격 파일을 가져오는 도중 결과 집합의 자료형이 잘못 됨: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "원격 파일을 가져오는 중 예상치 못한 결과 형식 발견"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "원격 파일을 가져오는 도중 결과안에 null 값이 잘못됨"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "원격 파일을 가져오는 도중 결과 길이가 잘못됨"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "\"%s\" 파일용 데이터를 받았음, \"%s\" 요청 처리용"
+
+#: libpq_source.c:570
+#, c-format
+msgid ""
+"received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr ""
+"%lld 오프셋(해당파일: \"%s\")에 데이터를 받았음, %lld 오프셋 요청 처리용"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "\"%s\" 파일을 위한 보다 많은 요청을 받았음"
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "데이터 청크 수신 숫자가 이상함"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "\"%s\" 원격 파일을 가져올 수 없음: %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "\"%s\" 원격파일을 가져오는 도중 결과 집합이 잘못 됨"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "\"%s\" 원본 파일을 열 수 없음: %m"
+
+#: local_source.c:117
+#, c-format
+msgid ""
+"size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "\"%s\" 소스 파일 크기가 현재 변경 되었음: 기대값: %d, 실재값 %d"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "\"%s\" 파일을 닫을 수 없음: %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "원본 파일에서 seek 작업을 할 수 없음: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "\"%s\" 파일을 읽는 중 예상치 못한 EOF"
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "WAL 읽기 프로세서를 할당하는 중 메모리 부족"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "%X/%X 위치에서 WAL 레코드를 읽을 수 없음: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "%X/%X 위치에서 WAL 레코드를 읽을 수 없음"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "%X/%X 끝 포인터는 바른값이 아님; 기대값: %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "%X/%X 위치에서 이전 WAL 레코드를 찾을 수 없음: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "%X/%X 위치에서 이전 WAL 레코드를 찾을 수 없음"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "\"%s\" 파일에서 seek 작업을 할 수 없음: %m"
+
+#: parsexlog.c:440
+#, c-format
+msgid ""
+"WAL record modifies a relation, but record type is not recognized: lsn: %X/"
+"%X, rmid: %d, rmgr: %s, info: %02X"
+msgstr ""
+"WAL 레코드가 릴레이션을 변경하려고 하지만, 레코드 형태가 바르지 않음: lsn: "
+"%X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:86
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 PostgreSQL 한 클러스터에서 다른 클러스터로 재동기화 하는 도구입"
+"니다.\n"
+"\n"
+
+#: pg_rewind.c:87
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"사용법:\n"
+" %s [옵션]...\n"
+"\n"
+
+#: pg_rewind.c:88
+#, c-format
+msgid "Options:\n"
+msgstr "옵션들:\n"
+
+#: pg_rewind.c:89
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration "
+"to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal 아카이브에서 WAL 파일을 가져오기 위해\n"
+" 대상 환경 설정 restore_command 사용\n"
+
+#: pg_rewind.c:91
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=디렉터리 변경하려는 데이터 디렉터리\n"
+
+#: pg_rewind.c:92
+#, c-format
+msgid ""
+" --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=디렉터리 동기화 원본이 되는 데이터 디렉터리\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=연결문자열 원본 서버 접속 정보\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run 변경 작업 전에 멈춤(검사, 확인용)\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --no-sync 작업 완료 뒤 디스크 동기화 작업을 하지 않"
+"음\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress 진행 과정 메시지를 보여줌\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf 복제를 위한 환경 설정 함\n"
+" (--source-server 설정 필요함)\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=파일이름 대상 클러스터를 실행할 때 사용할\n"
+" 서버 환경 설정 파일 지정\n"
+
+#: pg_rewind.c:102
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug 디버그 메시지를 보여줌\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid ""
+" --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr ""
+" --no-ensure-shutdown 비정상 종료 시 자동 뒷정리 작업 안함\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_rewind.c:105
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"문제점 보고 주소: <%s>\n"
+
+#: pg_rewind.c:107
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237
+#: pg_rewind.c:244 pg_rewind.c:252
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "자세한 사항은 \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_rewind.c:222
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr ""
+"원본을 지정하지 않았음 (--source-pgdata 또는 --source-server 옵션을 지정 해"
+"야 함)"
+
+#: pg_rewind.c:229
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "--source-pgdata 또는 --source-server 옵션 중 하나만 지정해야 함"
+
+#: pg_rewind.c:236
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "대상 데이터 디렉토리가 지정되지 않았음 (--target-pgdata 옵션 사용)"
+
+#: pg_rewind.c:243
+#, c-format
+msgid ""
+"no source server information (--source-server) specified for --write-"
+"recovery-conf"
+msgstr "--write-recovery-conf 용 원보 서버 정보(--source-server) 없음"
+
+#: pg_rewind.c:250
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 많은 명령행 인수를 지정했습니다. (처음 \"%s\")"
+
+#: pg_rewind.c:265
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "\"root\" 계정으로는 실행 할 수 없음"
+
+#: pg_rewind.c:266
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "PostgreSQL superuser로 %s 프로그램을 실행하십시오."
+
+#: pg_rewind.c:276
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 읽기 권한 없음: %m"
+
+#: pg_rewind.c:294
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:297
+#, c-format
+msgid "connected to server"
+msgstr "서버 접속 완료"
+
+#: pg_rewind.c:344
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "원본과 대상 클러스터의 타임라인이 같음"
+
+#: pg_rewind.c:353
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "서버 분기 WAL 위치: %X/%X, 타임라인 %u"
+
+#: pg_rewind.c:401
+#, c-format
+msgid "no rewind required"
+msgstr "되감을 필요 없음"
+
+#: pg_rewind.c:410
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "재동기화 시작함, 마지막 체크포인트 위치 %X/%X, 타임라인 %u"
+
+#: pg_rewind.c:420
+#, c-format
+msgid "reading source file list"
+msgstr "원본 파일 목록 읽는 중"
+
+#: pg_rewind.c:424
+#, c-format
+msgid "reading target file list"
+msgstr "대상 파일 목록 읽는 중"
+
+#: pg_rewind.c:433
+#, c-format
+msgid "reading WAL in target"
+msgstr "대상 서버에서 WAL 읽는 중"
+
+#: pg_rewind.c:454
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "복사를 위해서 %lu MB 필요함 (원본 디렉토리 전체 크기는 %lu MB)"
+
+#: pg_rewind.c:472
+#, c-format
+msgid "syncing target data directory"
+msgstr "대상 데이터 디렉터리 동기화 중"
+
+#: pg_rewind.c:488
+#, c-format
+msgid "Done!"
+msgstr "완료!"
+
+#: pg_rewind.c:568
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "%s 외부 테이블 접근 권한 없음"
+
+#: pg_rewind.c:600
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "pg_rewind 실행 되고 있는 중에 원본 시스템이 변경 되었음"
+
+#: pg_rewind.c:604
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "백업 라벨을 만들고, 컨트롤 파일을 갱신 중"
+
+#: pg_rewind.c:654
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "rewind 끝에 원본 시스템의 상태가 예상값과 다름"
+
+#: pg_rewind.c:685
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "원본과 대상 클러스터가 서로 다른 시스템임"
+
+#: pg_rewind.c:693
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "해당 클러스터는 이 pg_rewind 버전으로 작업할 수 없음"
+
+#: pg_rewind.c:703
+#, c-format
+msgid ""
+"target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr ""
+"대상 서버의 데이터 클러스터가 데이터 체크섬 기능을 켰거나, \"wal_log_hints "
+"= on\" 설정이 되어야 함"
+
+#: pg_rewind.c:714
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "대상 서버는 정상 종료되어야 함"
+
+#: pg_rewind.c:724
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "원본 데이터 디렉토리는 정상적으로 종료되어야 함"
+
+#: pg_rewind.c:771
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) 복사됨"
+
+#: pg_rewind.c:834
+#, c-format
+msgid "invalid control file"
+msgstr "잘못된 컨트롤 파일"
+
+#: pg_rewind.c:918
+#, c-format
+msgid ""
+"could not find common ancestor of the source and target cluster's timelines"
+msgstr "원본과 대상 서버의 공통된 상위 타임라인을 찾을 수 없음"
+
+#: pg_rewind.c:959
+#, c-format
+msgid "backup label buffer too small"
+msgstr "백업 라벨 버퍼가 너무 작음"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "컨트롤 파일 CRC 오류"
+
+#: pg_rewind.c:994
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "컨트롤 파일의 크기가 %d 로 비정상, 정상값 %d"
+
+#: pg_rewind.c:1003
+#, c-format
+msgid ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"control file specifies %d byte"
+msgid_plural ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"control file specifies %d bytes"
+msgstr[0] ""
+"WAL 조각 파일은 1MB부터 1GB 사이 2^n 크기여야 하지만, 컨트롤 파일에는 %d 바이"
+"트로 지정되었음"
+
+#: pg_rewind.c:1042 pg_rewind.c:1112
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr ""
+"\"%s\" 프로그램이 %s 작업에서 필요합니다. 그런데, 이 파일이 \"%s\" 파일이 있"
+"는 디렉터리안에 없습니다."
+
+#: pg_rewind.c:1045 pg_rewind.c:1115
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"\"%s\" 프로그램을 \"%s\" 작업 때문에 찾았지만 이 파일은 %s 프로그램의 버전과 "
+"다릅니다."
+
+#: pg_rewind.c:1078
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "대상 클러스터에 restore_command 설정이 없음"
+
+#: pg_rewind.c:1119
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "대상 서버에서 비정상 종료 후 복구 작업을 위해 \"%s\" 실행 중"
+
+#: pg_rewind.c:1156
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "대상 클러스터를 단일 사용자 모드로 postgres 실행 실패"
+
+#: pg_rewind.c:1157
+#, c-format
+msgid "Command was: %s"
+msgstr "사용된 명령: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "히스토리 파일에서 문법오류: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "숫자 타임라인 ID가 필요합니다."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "트랜잭션 로그 전환 위치 값이 있어야 함"
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "작업내역 파일에 잘못된 자료가 있음: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "타임라인 ID 값은 그 값이 증가하는 순번값이어야합니다."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "내역 파일에 잘못된 자료가 있음"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "타임라인 ID는 하위 타임라인 ID보다 작아야 합니다."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "잘못된 레코드 위치: %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "%X/%X에서 contrecord를 필요로 함"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "잘못된 레코드 길이: %X/%X, 기대값 %u, 실재값 %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "%u 길이의 레코드를 디코딩 하는 중 메모리 부족"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "너무 긴 길이(%u)의 레코드가 %X/%X에 있음"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "%X/%X 위치에 contrecord 플래그가 없음"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "잘못된 contrecord 길이 %u (기대값: %lld), 위치 %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "%X/%X 위치에 contrecord 없음"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "잘못된 자원 관리 ID %u, 위치: %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "레코드의 잘못된 프리링크 %X/%X, 해당 레코드 %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "잘못된 자원관리자 데이터 체크섬, 위치: %X/%X 레코드"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "%04X 매직 번호가 잘못됨, 로그 파일 %s, 위치 %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "잘못된 정보 비트 %04X, 로그 파일 %s, 위치 %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid ""
+"WAL file is from different database system: WAL file database system "
+"identifier is %llu, pg_control database system identifier is %llu"
+msgstr ""
+"WAL 파일이 다른 시스템의 것입니다. WAL 파일의 시스템 식별자는 %llu, "
+"pg_control 의 식별자는 %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect segment size in page "
+"header"
+msgstr ""
+"WAL 파일이 다른 데이터베이스 시스템의 것입니다: 페이지 헤더에 지정된 값이 잘"
+"못된 조각 크기임"
+
+#: xlogreader.c:1274
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect XLOG_BLCKSZ in page "
+"header"
+msgstr ""
+"WAL 파일이 다른 데이터베이스 시스템의 것입니다: 페이지 헤더의 XLOG_BLCKSZ 값"
+"이 바르지 않음"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "잘못된 페이지 주소 %X/%X, 로그 파일 %s, 위치 %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "타임라인 범위 벗어남 %u (이전 번호 %u), 로그 파일 %s, 위치 %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "%u block_id는 범위를 벗어남, 위치 %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA 지정했지만, %X/%X 에 자료가 없음"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA 지정 않았지만, %u 길이의 자료가 있음, 위치 %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid ""
+"BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at "
+"%X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE 설정이 되어 있지만, 옵셋: %u, 길이: %u, 블록 이미지 길이: "
+"%u, 대상: %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE 설정이 안되어 있지만, 옵셋: %u, 길이: %u, 대상: %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_COMPRESSED 설정이 되어 있지만, 블록 이미지 길이: %u, 대상: %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid ""
+"neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image "
+"length is %u at %X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE, BKPIMAGE_COMPRESSED 지정 안되어 있으나, 블록 이미지 길이"
+"는 %u, 대상: %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL 설정이 되어 있지만, %X/%X 에 이전 릴레이션 없음"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "잘못된 block_id %u, 위치 %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "잘못된 레코드 길이, 위치 %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "WAL 레코드에 %d ID 백업 블록이 없음"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "%X/%X 위치에 이미지 복원 실패(%d 블록이 바르지 않음)"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "%X/%X 에 잘못된 상태값으로 이미지 복원 실패, 블록 %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with %s not supported by build, "
+"block %d"
+msgstr ""
+"%X/%X 위치에 %s 압축된 이미지 복원 실패, 해당 엔진이 지원하지 않음, 해당블"
+"록: %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "%X/%X 위치에 알수 없는 압축 방식의 이미지 복원 실패, 해당블록: %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "%X/%X 에서 이미 압축 풀기 실패, 블록 %d"
diff --git a/src/bin/pg_rewind/po/ru.po b/src/bin/pg_rewind/po/ru.po
new file mode 100644
index 0000000..f41d400
--- /dev/null
+++ b/src/bin/pg_rewind/po/ru.po
@@ -0,0 +1,1208 @@
+# Russian message translation file for pg_rewind
+# Copyright (C) 2015-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Alexander Lakhin <exclusion@gmail.com>, 2015-2017, 2018, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 09:09+0300\n"
+"PO-Revision-Date: 2023-08-30 15:22+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробности: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подсказка: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памяти\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "не удалось загрузить библиотеку \"%s\" (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "в этой ОС нельзя создавать ограниченные маркеры (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "не удалось открыть маркер процесса (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "не удалось подготовить структуры SID (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "не удалось создать ограниченный маркер (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "не удалось запустить процесс для команды \"%s\" (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "не удалось перезапуститься с ограниченным маркером (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "не удалось получить код выхода от подпроцесса (код ошибки: %lu)"
+
+#: ../../fe_utils/archive.c:52
+#, c-format
+msgid "cannot use restore_command with %%r placeholder"
+msgstr "нельзя использовать restore_command со знаком подстановки %%r"
+
+#: ../../fe_utils/archive.c:70
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "неподходящий размер файла \"%s\": %lld вместо %lld байт"
+
+#: ../../fe_utils/archive.c:78
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "не удалось открыть файл \"%s\", восстановленный из архива: %m"
+
+#: ../../fe_utils/archive.c:87 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не удалось получить информацию о файле \"%s\": %m"
+
+#: ../../fe_utils/archive.c:99
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "ошибка при выполнении restore_command: %s"
+
+#: ../../fe_utils/archive.c:106
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "восстановить файл \"%s\" из архива не удалось"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "нехватка памяти"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалось открыть файл \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "не удалось записать в файл \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "не удалось создать файл \"%s\": %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "не удалось открыть целевой файл \"%s\": %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "не удалось закрыть целевой файл \"%s\": %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "не удалось переместиться в целевом файле \"%s\": %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не удалось записать файл \"%s\": %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "неопределённый тип файла \"%s\""
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "неверное действие (CREATE) для обычного файла"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "не удалось стереть файл \"%s\": %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "не удалось открыть файл \"%s\" для усечения: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "не удалось обрезать файл \"%s\" до нужного размера (%u): %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не удалось создать каталог \"%s\": %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "ошибка при удалении каталога \"%s\": %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "не удалось создать символическую ссылку \"%s\": %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "ошибка при удалении символической ссылки \"%s\": %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "не удалось открыть файл \"%s\" для чтения: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не удалось прочитать файл \"%s\": %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %zu)"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не удалось открыть каталог \"%s\": %m"
+
+#: file_ops.c:446
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "не удалось прочитать символическую ссылку \"%s\": %m"
+
+#: file_ops.c:449
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "целевой путь символической ссылки \"%s\" слишком длинный"
+
+#: file_ops.c:464
+#, c-format
+msgid ""
+"\"%s\" is a symbolic link, but symbolic links are not supported on this "
+"platform"
+msgstr ""
+"\"%s\" — символическая ссылка, но в этой ОС символические ссылки не "
+"поддерживаются"
+
+#: file_ops.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не удалось прочитать каталог \"%s\": %m"
+
+#: file_ops.c:475
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не удалось закрыть каталог \"%s\": %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "файл данных \"%s\" в источнике не является обычным файлом"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "повторный исходный файл \"%s\""
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "неожиданная модификация страницы для файла особого вида \"%s\""
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "неизвестный тип файла \"%s\""
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "файл \"%s\" имеет разный тип в исходном и целевом кластере"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "не удалось определить, что делать с файлом \"%s\""
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "не удалось очистить search_path: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "на исходном сервере должен быть включён режим full_page_writes"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "не удалось подготовить оператор для извлечения содержимого файла: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "ошибка выполнения запроса (%s) на исходном сервере: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "неожиданный результат запроса"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "ошибка выполнения запроса (%s) на исходном сервере: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr ""
+"нераспознанный результат \"%s\" вместо текущей позиции добавления в WAL"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "не удалось получить список файлов: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "неожиданный результат при получении списка файлов"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "не удалось отправить запрос: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "не удалось перевести подключение libpq в однострочный режим"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "неожиданный результат при получении файлов с сервера: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "получено больше сегментов данных, чем запрошено"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "неожиданный размер набора результатов при получении файлов с сервера"
+
+#: libpq_source.c:515
+#, c-format
+msgid ""
+"unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr ""
+"неожиданные типы данных в наборе результатов при получении файлов с сервера: "
+"%u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "неожиданный формат результата при получении файлов с сервера"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "неожиданные значения NULL в результате при получении файлов с сервера"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "неожиданная длина результата при получении файлов с сервера"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "получены данные для файла \"%s\", а запрашивались данные для \"%s\""
+
+#: libpq_source.c:570
+#, c-format
+msgid ""
+"received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr ""
+"получены данные по смещению %lld в файле \"%s\", а запрашивались по смещению "
+"%lld"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "получено больше данных, чем запрошено для файла \"%s\""
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "получено неожиданное количество сегментов данных"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "не удалось получить с сервера файл \"%s\": %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "неожиданный набор результатов при получении файла \"%s\" с сервера"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "не удалось открыть исходный файл \"%s\": %m"
+
+#: local_source.c:117
+#, c-format
+msgid ""
+"size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr ""
+"размер исходного файла \"%s\" изменился, ожидалось байт: %d, скопировано: %d"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "не удалось закрыть файл \"%s\": %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "не удалось переместиться в исходном файле: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "неожиданный конец файла при чтении \"%s\""
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "не удалось выделить память для чтения WAL"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "не удалось прочитать запись WAL в позиции %X/%X: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "не удалось прочитать запись WAL в позиции %X/%X"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr ""
+"конечный указатель %X/%X неверно задаёт конечную точку; ожидается %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "не удалось найти предыдущую запись WAL в позиции %X/%X: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "не удалось найти предыдущую запись WAL в позиции %X/%X"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "не удалось переместиться в файле \"%s\": %m"
+
+#: parsexlog.c:440
+#, c-format
+msgid ""
+"WAL record modifies a relation, but record type is not recognized: lsn: %X/"
+"%X, rmid: %d, rmgr: %s, info: %02X"
+msgstr ""
+"Запись WAL модифицирует отношение, но тип записи не распознан: lsn: %X/%X, "
+"rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:86
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s синхронизирует кластер PostgreSQL с другой копией кластера.\n"
+"\n"
+
+#: pg_rewind.c:87
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"Использование:\n"
+" %s [ПАРАМЕТР]...\n"
+"\n"
+
+#: pg_rewind.c:88
+#, c-format
+msgid "Options:\n"
+msgstr "Параметры:\n"
+
+#: pg_rewind.c:89
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration "
+"to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal использовать для получения файлов WAL из\n"
+" архива команду restore_command из целевой\n"
+" конфигурации\n"
+
+#: pg_rewind.c:91
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr ""
+" -D, --target-pgdata=КАТАЛОГ существующий каталог, куда будут записаны "
+"данные\n"
+
+#: pg_rewind.c:92
+#, c-format
+msgid ""
+" --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr ""
+" --source-pgdata=КАТАЛОГ исходный каталог, с которым будет проведена "
+"синхронизация\n"
+
+# well-spelled: ПОДКЛ
+#: pg_rewind.c:93
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr ""
+" --source-server=СТР_ПОДКЛ сервер, с которым будет проведена "
+"синхронизация\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr ""
+" -n, --dry-run остановиться до внесения каких-либо "
+"изменений\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --no-sync не ждать завершения сохранения данных на "
+"диске\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress выводить сообщения о ходе процесса\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf записать конфигурацию для репликации\n"
+" (требуется указание --source-server)\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=ИМЯ_ФАЙЛА использовать указанный основной файл\n"
+" конфигурации сервера при запуске целевого\n"
+" кластера\n"
+
+#: pg_rewind.c:102
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr ""
+" --debug выдавать множество отладочных сообщений\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid ""
+" --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr ""
+" --no-ensure-shutdown не исправлять автоматически состояние,\n"
+" возникающее при нештатном отключении\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: pg_rewind.c:105
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках сообщайте по адресу <%s>.\n"
+
+#: pg_rewind.c:107
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237
+#: pg_rewind.c:244 pg_rewind.c:252
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Для дополнительной информации попробуйте \"%s --help\"."
+
+#: pg_rewind.c:222
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "источник не указан (требуется --source-pgdata или --source-server)"
+
+#: pg_rewind.c:229
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "указать можно только --source-pgdata либо --source-server"
+
+#: pg_rewind.c:236
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "целевой каталог данных не указан (--target-pgdata)"
+
+#: pg_rewind.c:243
+#, c-format
+msgid ""
+"no source server information (--source-server) specified for --write-"
+"recovery-conf"
+msgstr ""
+"отсутствует информация об исходном сервере (--source-server) для --write-"
+"recovery-conf"
+
+#: pg_rewind.c:250
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "слишком много аргументов командной строки (первый: \"%s\")"
+
+#: pg_rewind.c:265
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "программу не должен запускать root"
+
+#: pg_rewind.c:266
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Запускать %s нужно от имени суперпользователя PostgreSQL."
+
+#: pg_rewind.c:276
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "не удалось считать права на каталог \"%s\": %m"
+
+#: pg_rewind.c:294
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:297
+#, c-format
+msgid "connected to server"
+msgstr "подключение к серверу установлено"
+
+#: pg_rewind.c:344
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "исходный и целевой кластер уже на одной линии времени"
+
+#: pg_rewind.c:353
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "серверы разошлись в позиции WAL %X/%X на линии времени %u"
+
+#: pg_rewind.c:401
+#, c-format
+msgid "no rewind required"
+msgstr "перемотка не требуется"
+
+#: pg_rewind.c:410
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr ""
+"перемотка от последней общей контрольной точки в позиции %X/%X на линии "
+"времени %u"
+
+#: pg_rewind.c:420
+#, c-format
+msgid "reading source file list"
+msgstr "чтение списка исходных файлов"
+
+#: pg_rewind.c:424
+#, c-format
+msgid "reading target file list"
+msgstr "чтение списка целевых файлов"
+
+#: pg_rewind.c:433
+#, c-format
+msgid "reading WAL in target"
+msgstr "чтение WAL в целевом кластере"
+
+#: pg_rewind.c:454
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "требуется скопировать %lu МБ (общий размер исходного каталога: %lu МБ)"
+
+#: pg_rewind.c:472
+#, c-format
+msgid "syncing target data directory"
+msgstr "синхронизация целевого каталога данных"
+
+#: pg_rewind.c:488
+#, c-format
+msgid "Done!"
+msgstr "Готово!"
+
+#: pg_rewind.c:568
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "действие не определено для файла \"%s\""
+
+#: pg_rewind.c:600
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "в исходной системе произошли изменения в процессе работы pg_rewind"
+
+#: pg_rewind.c:604
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "создание метки копии и модификация управляющего файла"
+
+#: pg_rewind.c:654
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "исходная система оказалась в неожиданном состоянии после перемотки"
+
+#: pg_rewind.c:685
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "исходный и целевой кластеры относятся к разным системам"
+
+#: pg_rewind.c:693
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "кластеры несовместимы с этой версией pg_rewind"
+
+#: pg_rewind.c:703
+#, c-format
+msgid ""
+"target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr ""
+"на целевом сервере должны быть контрольные суммы данных или \"wal_log_hints "
+"= on\""
+
+#: pg_rewind.c:714
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "целевой сервер должен быть выключен штатно"
+
+#: pg_rewind.c:724
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "работа с исходным каталогом данных должна быть завершена штатно"
+
+#: pg_rewind.c:771
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s КБ (%d%%) скопировано"
+
+#: pg_rewind.c:834
+#, c-format
+msgid "invalid control file"
+msgstr "неверный управляющий файл"
+
+#: pg_rewind.c:918
+#, c-format
+msgid ""
+"could not find common ancestor of the source and target cluster's timelines"
+msgstr ""
+"не удалось найти общего предка линий времени исходного и целевого кластеров"
+
+#: pg_rewind.c:959
+#, c-format
+msgid "backup label buffer too small"
+msgstr "буфер для метки копии слишком мал"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "неверная контрольная сумма управляющего файла"
+
+#: pg_rewind.c:994
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "неверный размер управляющего файла (%d), ожидалось: %d"
+
+#: pg_rewind.c:1003
+#, c-format
+msgid ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"control file specifies %d byte"
+msgid_plural ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"control file specifies %d bytes"
+msgstr[0] ""
+"размер сегмента WAL должен задаваться степенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но в управляющем файле указано значение: %d"
+msgstr[1] ""
+"Размер сегмента WAL должен задаваться степенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но в управляющем файле указано значение: %d"
+msgstr[2] ""
+"Размер сегмента WAL должен задаваться степенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но в управляющем файле указано значение: %d"
+
+#: pg_rewind.c:1042 pg_rewind.c:1112
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr "программа \"%s\" нужна для %s, но она не найдена в каталоге \"%s\""
+
+#: pg_rewind.c:1045 pg_rewind.c:1115
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"программа \"%s\" найдена программой \"%s\", но её версия отличается от "
+"версии %s"
+
+#: pg_rewind.c:1078
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "команда restore_command в целевом кластере не определена"
+
+#: pg_rewind.c:1119
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr ""
+"выполнение \"%s\" для восстановления согласованности на целевом сервере"
+
+#: pg_rewind.c:1156
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr ""
+"не удалось запустить postgres в целевом кластере в однопользовательском "
+"режиме"
+
+#: pg_rewind.c:1157
+#, c-format
+msgid "Command was: %s"
+msgstr "Выполнялась команда: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "синтаксическая ошибка в файле истории: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "Ожидается числовой идентификатор линии времени."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "Ожидается положение точки переключения журнала предзаписи."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "неверные данные в файле истории: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "Идентификаторы линий времени должны возрастать."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "неверные данные в файле истории"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr ""
+"Идентификаторы линий времени должны быть меньше идентификатора линии-потомка."
+
+#: xlogreader.c:592
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "неверное смещение записи в позиции %X/%X"
+
+#: xlogreader.c:600
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "в позиции %X/%X запрошено продолжение записи"
+
+#: xlogreader.c:641 xlogreader.c:1106
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "неверная длина записи в позиции %X/%X: ожидалось %u, получено %u"
+
+#: xlogreader.c:730
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "нет флага contrecord в позиции %X/%X"
+
+#: xlogreader.c:743
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "неверная длина contrecord: %u (ожидалась %lld) в позиции %X/%X"
+
+#: xlogreader.c:1114
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "неверный ID менеджера ресурсов %u в позиции %X/%X"
+
+#: xlogreader.c:1127 xlogreader.c:1143
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "запись с неверной ссылкой назад %X/%X в позиции %X/%X"
+
+#: xlogreader.c:1181
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr ""
+"некорректная контрольная сумма данных менеджера ресурсов в записи в позиции "
+"%X/%X"
+
+#: xlogreader.c:1218
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "неверное магическое число %04X в сегменте журнала %s, смещение %u"
+
+#: xlogreader.c:1232 xlogreader.c:1273
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "неверные информационные биты %04X в сегменте журнала %s, смещение %u"
+
+#: xlogreader.c:1247
+#, c-format
+msgid ""
+"WAL file is from different database system: WAL file database system "
+"identifier is %llu, pg_control database system identifier is %llu"
+msgstr ""
+"файл WAL принадлежит другой СУБД: в нём указан идентификатор системы БД "
+"%llu, а идентификатор системы pg_control: %llu"
+
+#: xlogreader.c:1255
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect segment size in page "
+"header"
+msgstr ""
+"файл WAL принадлежит другой СУБД: некорректный размер сегмента в заголовке "
+"страницы"
+
+#: xlogreader.c:1261
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect XLOG_BLCKSZ in page "
+"header"
+msgstr ""
+"файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке "
+"страницы"
+
+#: xlogreader.c:1292
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "неожиданный pageaddr %X/%X в сегменте журнала %s, смещение %u"
+
+#: xlogreader.c:1317
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr ""
+"нарушение последовательности ID линии времени %u (после %u) в сегменте "
+"журнала %s, смещение %u"
+
+#: xlogreader.c:1722
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "идентификатор блока %u идёт не по порядку в позиции %X/%X"
+
+#: xlogreader.c:1746
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA установлен, но данных в позиции %X/%X нет"
+
+#: xlogreader.c:1753
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr ""
+"BKPBLOCK_HAS_DATA не установлен, но длина данных равна %u в позиции %X/%X"
+
+#: xlogreader.c:1789
+#, c-format
+msgid ""
+"BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at "
+"%X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE установлен, но для пропуска заданы смещение %u и длина %u "
+"при длине образа блока %u в позиции %X/%X"
+
+#: xlogreader.c:1805
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE не установлен, но для пропуска заданы смещение %u и длина "
+"%u в позиции %X/%X"
+
+#: xlogreader.c:1819
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_COMPRESSED установлен, но длина образа блока равна %u в позиции %X/"
+"%X"
+
+#: xlogreader.c:1834
+#, c-format
+msgid ""
+"neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image "
+"length is %u at %X/%X"
+msgstr ""
+"ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_COMPRESSED не установлены, но длина образа "
+"блока равна %u в позиции %X/%X"
+
+#: xlogreader.c:1850
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr ""
+"BKPBLOCK_SAME_REL установлен, но предыдущее значение не задано в позиции %X/"
+"%X"
+
+#: xlogreader.c:1862
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "неверный идентификатор блока %u в позиции %X/%X"
+
+#: xlogreader.c:1929
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "запись с неверной длиной в позиции %X/%X"
+
+#: xlogreader.c:1954
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "не удалось найти копию блока с ID %d в записи журнала WAL"
+
+#: xlogreader.c:2038
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr ""
+"не удалось восстановить образ в позиции %X/%X с указанным неверным блоком %d"
+
+#: xlogreader.c:2045
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr ""
+"не удалось восстановить образ в позиции %X/%X с неверным состоянием, блок %d"
+
+#: xlogreader.c:2072 xlogreader.c:2089
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with %s not supported by build, "
+"block %d"
+msgstr ""
+"не удалось восстановить образ в позиции %X/%X, сжатый методом %s, который не "
+"поддерживается этой сборкой, блок %d"
+
+#: xlogreader.c:2098
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr ""
+"не удалось восстановить образ в позиции %X/%X, сжатый неизвестным методом, "
+"блок %d"
+
+#: xlogreader.c:2106
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "не удалось развернуть образ в позиции %X/%X, блок %d"
+
+#, c-format
+#~ msgid "out of memory while trying to decode a record of length %u"
+#~ msgstr "не удалось выделить память для декодирования записи длины %u"
+
+#, c-format
+#~ msgid "record length %u at %X/%X too long"
+#~ msgstr "длина записи %u в позиции %X/%X слишком велика"
+
+#, c-format
+#~ msgid "missing contrecord at %X/%X"
+#~ msgstr "нет записи contrecord в %X/%X"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "\"%s\" is not a directory"
+#~ msgstr "\"%s\" не является каталогом"
+
+#~ msgid "\"%s\" is not a symbolic link"
+#~ msgstr "\"%s\" не является символической ссылкой"
+
+#~ msgid "\"%s\" is not a regular file"
+#~ msgstr "\"%s\" не является обычным файлом"
+
+#~ msgid "source file list is empty"
+#~ msgstr "список файлов в источнике пуст"
+
+#~ msgid "source server must not be in recovery mode"
+#~ msgstr "исходный сервер должен выйти из режима восстановления"
+
+#~ msgid "could not send COPY data: %s"
+#~ msgstr "не удалось отправить данные COPY: %s"
+
+#~ msgid "could not send file list: %s"
+#~ msgstr "не удалось отправить список файлов: %s"
+
+#~ msgid "could not send end-of-COPY: %s"
+#~ msgstr "не удалось отправить сообщение о завершении копирования: %s"
+
+#~ msgid "unexpected result while sending file list: %s"
+#~ msgstr "неожиданный результат при передаче списка: %s"
+
+#~ msgid "could not connect to server: %s"
+#~ msgstr "не удалось подключиться к серверу: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid " block %u\n"
+#~ msgstr " блок %u\n"
+
+#~ msgid "entry \"%s\" excluded from source file list\n"
+#~ msgstr "\"%s\" исключён из списка исходных файлов\n"
+
+#~ msgid "entry \"%s\" excluded from target file list\n"
+#~ msgstr "\"%s\" исключён из списка целевых файлов\n"
+
+#~ msgid "%s (%s)\n"
+#~ msgstr "%s (%s)\n"
+
+#, fuzzy
+#~ msgid "could not set up connection context: %s"
+#~ msgstr "не удалось настроить контекст подключения: %s"
+
+#~ msgid "getting file chunks\n"
+#~ msgstr "получение сегментов файлов\n"
+
+#~ msgid ""
+#~ "received null value for chunk for file \"%s\", file has been deleted\n"
+#~ msgstr ""
+#~ "для файла \"%s\" вместо сегмента получено NULL-значение, файл удалён\n"
+
+#~ msgid "fetched file \"%s\", length %d\n"
+#~ msgstr "получен файл \"%s\", длина %d\n"
+
+#, fuzzy
+#~ msgid "could not create temporary table: %s"
+#~ msgstr "не удалось создать временную таблицу: %s"
+
+#~ msgid "Failure, exiting\n"
+#~ msgstr "Ошибка, выполняется выход\n"
+
+#~ msgid "could not read from file \"%s\": %s\n"
+#~ msgstr "не удалось прочитать файл \"%s\": %s\n"
+
+#~ msgid "Source timeline history:\n"
+#~ msgstr "История линии времени источника:\n"
+
+#~ msgid "Target timeline history:\n"
+#~ msgstr "История линии времени получателя:\n"
+
+#~ msgid "%d: %X/%X - %X/%X\n"
+#~ msgstr "%d: %X/%X - %X/%X\n"
+
+#~ msgid "sync of target directory failed\n"
+#~ msgstr "сбой синхронизации целевого каталога\n"
+
+#~ msgid ""
+#~ "WAL file is from different database system: incorrect XLOG_SEG_SIZE in "
+#~ "page header"
+#~ msgstr ""
+#~ "файл WAL принадлежит другой СУБД: некорректный XLOG_SEG_SIZE в заголовке "
+#~ "страницы"
diff --git a/src/bin/pg_rewind/po/sv.po b/src/bin/pg_rewind/po/sv.po
new file mode 100644
index 0000000..d283f81
--- /dev/null
+++ b/src/bin/pg_rewind/po/sv.po
@@ -0,0 +1,1010 @@
+# Swedish message translation file for pg_rewind
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Dennis Björklund <db@zigo.dhs.org>, 2017, 2018, 2019, 2020, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-29 11:51+0000\n"
+"PO-Revision-Date: 2022-09-29 21:42+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kan inte duplicera null-pekare (internt fel)\n"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "kunde inte ladda länkbibliotek \"%s\": felkod %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "kan inte skapa token för begränsad åtkomst på denna plattorm: felkod %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "kunde inte öppna process-token: felkod %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "kunde inte allokera SID: felkod %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "kunde inte skapa token för begränsad åtkomst: felkod %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "kunde inte starta process för kommando \"%s\": felkod %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "kunde inte köra igen med token för begränsad åtkomst: felkod %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "kunde inte hämta statuskod för underprocess: felkod %lu"
+
+#: ../../fe_utils/archive.c:52
+#, c-format
+msgid "cannot use restore_command with %%r placeholder"
+msgstr "kan inte använda restore_command med %%r-platshållare"
+
+#: ../../fe_utils/archive.c:70
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "oväntad filstorlek på \"%s\": %lld istället för %lld"
+
+#: ../../fe_utils/archive.c:78
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "kunde inte öppna fil \"%s\" återställd från arkiv: %m"
+
+#: ../../fe_utils/archive.c:87 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "kunde inte göra stat() på fil \"%s\": %m"
+
+#: ../../fe_utils/archive.c:99
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_command misslyckades: %s"
+
+#: ../../fe_utils/archive.c:106
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "kunde inte återställa fil \"%s\" från arkiv"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "kunde inte skriva till fil \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "kan inte skapa fil \"%s\": %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "kunde inte öppna målfil \"%s\": %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "kunde inte stänga målfil \"%s\": %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "kunde inte söka i målfil \"%s\": %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "kunde inte skriva fil \"%s\": %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "odefinierad filtyp på \"%s\""
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "ogiltig aktion (CREATE) för vanlig fil"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "kunde inte ta bort fil \"%s\": %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "kunde inte öppna fil \"%s\" för trunkering: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "kunde inte trunkera fil \"%s\" till %u: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "kunde inte skapa katalog \"%s\": %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "kunde inte ta bort katalog \"%s\": %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "kunde inte skapa en symnbolisk länk vid \"%s\": %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "kan inte ta bort symbolisk länk \"%s\": %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "kunde inte öppna filen \"%s\" för läsning: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "kunde inte läsa fil \"%s\": %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "kunde inte läsa fil \"%s\": läste %d av %zu"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "kunde inte öppna katalog \"%s\": %m"
+
+#: file_ops.c:446
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "kan inte läsa symbolisk länk \"%s\": %m"
+
+#: file_ops.c:449
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "mål för symbolisk länk \"%s\" är för lång"
+
+#: file_ops.c:464
+#, c-format
+msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+msgstr "\"%s\" är en symbolisk länk men symboliska länkar stöds inte på denna plattform"
+
+#: file_ops.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "kunde inte läsa katalog \"%s\": %m"
+
+#: file_ops.c:475
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "kunde inte stänga katalog \"%s\": %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "datafil \"%s\" i källan är inte en vanlig fil"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "duplicerad källflagga \"%s\""
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "oväntad sidmodifiering för icke-regulär fil \"%s\""
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "okänd filtyp på \"%s\""
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "filen \"%s\" har olika typ i källa och mål"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "kunde inte bestämma vad som skulle göras med filen \"%s\""
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "kunde inte nollställa search_path: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "full_page_writes måste vara påslagen i källservern"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "kunde inte förbereda satsen för att hämta filinnehåll: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "fel vid körande av fråga (%s) på källserver: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "oväntad resultatmängd från fråga"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "fel vid körande av fråga (%s) i källserver: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "oväntat resultat \"%s\" för nuvarande WAL-insättningsposition"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "kunde inte hämta fillista: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "oväntad resultatmängd vid hämtning av fillista"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "kunde inte skicka fråga: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "kunde inte sätta libpq-anslutning till enradsläge"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "oväntat resultat vid hämtning av extern fil: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "tog emot fler datastycken än efterfrågat"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "oväntad resultatmängdstorlek vid hämtning av externa filer"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "oväntade datayper i resultatmängd vid hämtning av externa filer: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "oväntat resultatformat vid hämtning av externa filer"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "oväntade null-värden i resultat vid hämtning av externa filer"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "oväntad resultatlängd vid hämtning av externa filer"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "fick data för filen \"%s\", men efterfrågade för \"%s\""
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "fick data från offset %lld i fil \"%s\", men efterfrågade offset %lld"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "tog emot mer än efterfrågat för filen \"%s\""
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "oväntat antal datastycken togs emot"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "kunde inte hämta extern fil \"%s\": %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "oväntat resultatmängd vid hämtning av extern fil \"%s\""
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "kunde inte öppna källfil \"%s\": %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "storleken på källfilen \"%s\" ändrades under körning: %d byte förväntades, %d kopierades"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "kunde inte stänga fil \"%s\": %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "kunde inte söka i källfil: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "oväntad EOF under läsning av fil \"%s\""
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "slut på minne vid allokering av en WAL-läs-processor"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "kunde inte läsa WAL-post vid %X/%X: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "kunde inte läsa WAL-post vid %X/%X"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "slutpekare %X/%X är inte en giltig slutposition; förväntade %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "kunde inte hitta föregående WAL-post vid %X/%X: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "kunde inte hitta förgående WAL-post vid %X/%X"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "kunde inte söka (seek) i fil \"%s\": %m"
+
+#: parsexlog.c:440
+#, c-format
+msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+msgstr "WAL-post modifierar en relation, men posttypen känns inte igen: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:86
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s resynkroniserar ett PostgreSQL-kluster med en annan kopia av klustret.\n"
+"\n"
+
+#: pg_rewind.c:87
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"Användning:\n"
+" %s [FLAGGA]...\n"
+"\n"
+
+#: pg_rewind.c:88
+#, c-format
+msgid "Options:\n"
+msgstr "Flaggor:\n"
+
+#: pg_rewind.c:89
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal använd restore_command i målkonfigurationen\n"
+" för att hämta WAL-filer från arkiv\n"
+
+#: pg_rewind.c:91
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=KATALOG existerande datakatalog att modifiera\n"
+
+#: pg_rewind.c:92
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=KATALOG källdatakatalog att synkronisera med\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=ANSLSTR källserver att synkronisera med\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run stoppa innan något modifieras\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --no-sync vänta inte på att ändingar säkert\n"
+" skrivits till disk\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress skriv ut förloppmeddelanden\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" skriv konfiguration för replikering\n"
+" (kräver --source-server)\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=FILNAMN använd angiven serverkonfiguration när\n"
+" målklustret körs\n"
+
+#: pg_rewind.c:102
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug skriv ut en massa debugmeddelanden\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr " --no-ensure-shutdown ingen automatisk hantering av trasig nedstängning\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version skriv ut versioninformation och avsluta sedan\n"
+
+#: pg_rewind.c:105
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp och avsluta sedan\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: pg_rewind.c:107
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237
+#: pg_rewind.c:244 pg_rewind.c:252
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_rewind.c:222
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "ingen källa angavs (--source-pgdata eller --source-server)"
+
+#: pg_rewind.c:229
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "bara en av --source-pgdata och --source-server får anges"
+
+#: pg_rewind.c:236
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "ingen måldatakatalog angiven (--target-pgdata)"
+
+#: pg_rewind.c:243
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "ingen källserverinformation (--source-server) angiven för --write-recovery-conf"
+
+#: pg_rewind.c:250
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_rewind.c:265
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "kan inte köras av \"root\""
+
+#: pg_rewind.c:266
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Du måste köra %s som PostgreSQL:s superuser."
+
+#: pg_rewind.c:276
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "kunde inte läsa rättigheter på katalog \"%s\": %m"
+
+#: pg_rewind.c:294
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:297
+#, c-format
+msgid "connected to server"
+msgstr "ansluten till server"
+
+#: pg_rewind.c:344
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "källa och målkluster är på samma tidslinje"
+
+#: pg_rewind.c:353
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "servrarna divergerade vid WAL-position %X/%X på tidslinje %u"
+
+#: pg_rewind.c:401
+#, c-format
+msgid "no rewind required"
+msgstr "ingen rewind krävs"
+
+#: pg_rewind.c:410
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "rewind från senaste gemensamma checkpoint vid %X/%X på tidslinje %u"
+
+#: pg_rewind.c:420
+#, c-format
+msgid "reading source file list"
+msgstr "läser källfillista"
+
+#: pg_rewind.c:424
+#, c-format
+msgid "reading target file list"
+msgstr "läser målfillista"
+
+#: pg_rewind.c:433
+#, c-format
+msgid "reading WAL in target"
+msgstr "läser WAL i målet"
+
+#: pg_rewind.c:454
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "behöver kopiera %lu MB (total källkatalogstorlek är %lu MB)"
+
+#: pg_rewind.c:472
+#, c-format
+msgid "syncing target data directory"
+msgstr "synkar måldatakatalog"
+
+#: pg_rewind.c:488
+#, c-format
+msgid "Done!"
+msgstr "Klar!"
+
+#: pg_rewind.c:568
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "ingen åtgärd beslutades för filen \"%s\""
+
+#: pg_rewind.c:600
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "källsystemet ändrades samtidigt som pg_rewind kördes"
+
+#: pg_rewind.c:604
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "skapar backupetikett och uppdaterar kontrollfil"
+
+#: pg_rewind.c:654
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "källsystemet var i ett oväntat tillstånd vid slutet av återspolningen"
+
+#: pg_rewind.c:685
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "källa och målkluster är från olika system"
+
+#: pg_rewind.c:693
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "klustren är inte kompatibla med denna version av pg_rewind"
+
+#: pg_rewind.c:703
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "målservern behöver använda antingen datachecksums eller \"wal_log_hints = on\""
+
+#: pg_rewind.c:714
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "målserver måste stängas ner utan fel"
+
+#: pg_rewind.c:724
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "måldatakatalog måste stängas ner utan fel"
+
+#: pg_rewind.c:771
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) kopierad"
+
+#: pg_rewind.c:834
+#, c-format
+msgid "invalid control file"
+msgstr "ogiltig kontrollfil"
+
+#: pg_rewind.c:918
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "kunde inte finna en gemensam anfader av källa och målklusterets tidslinjer"
+
+#: pg_rewind.c:959
+#, c-format
+msgid "backup label buffer too small"
+msgstr "backupetikett-buffer för liten"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "oväntad kontrollfil-CRC"
+
+#: pg_rewind.c:994
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "oväntad kontrollfilstorlek %d, förväntade %d"
+
+#: pg_rewind.c:1003
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men kontrollfilen anger %d byte"
+msgstr[1] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men kontrollfilen anger %d byte"
+
+#: pg_rewind.c:1042 pg_rewind.c:1112
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\""
+
+#: pg_rewind.c:1045 pg_rewind.c:1115
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s"
+
+#: pg_rewind.c:1078
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "restore_command är inte satt i målklustret"
+
+#: pg_rewind.c:1119
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "kör \"%s\" för målservern för att slutföra krashåterställning"
+
+#: pg_rewind.c:1156
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "postgres enanvändarläge misslyckades i målklustret"
+
+#: pg_rewind.c:1157
+#, c-format
+msgid "Command was: %s"
+msgstr "Kommandot var: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "syntaxfel i history-fil: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "Förväntade ett numeriskt tidslinje-ID."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "Förväntade en write-ahead-logg:s switchpoint-position."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "felaktig data i history-fil: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "Tidslinje-ID måste komma i en stigande sekvens."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "ogiltig data i historikfil"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "Tidslinje-ID:er måste vara mindre än barnens tidslinje-ID:er."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "ogiltig postoffset vid %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord är begärd vid %X/%X"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "ogiltig postlängd vid %X/%X: förväntade %u, fick %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "slut på minne vid avkodning av post med längden %u"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "postlängd %u vid %X/%X är för lång"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "det finns ingen contrecord-flagga vid %X/%X"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "ogiltig contrecord-längd %u (förväntade %lld) vid %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "det finns ingen contrecord vid %X/%X"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ogiltigt resurshanterar-ID %u vid %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "post med inkorrekt prev-link %X/%X vid %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "felaktig resurshanterardatakontrollsumma i post vid %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "felaktigt magiskt nummer %04X i loggsegment %s, offset %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "ogiltiga infobitar %04X i loggsegment %s, offset %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "WAL-fil är från ett annat databassystem: WAL-filens databassystemidentifierare är %llu, pg_control databassystemidentifierare är %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL-fil är från ett annat databassystem: inkorrekt segmentstorlek i sidhuvud"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL-fil är från ett annat databassystem: inkorrekt XLOG_BLCKSZ i sidhuvud"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "oväntad sidadress %X/%X i loggsegment %s, offset %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "ej-i-sekvens för tidslinje-ID %u (efter %u) i loggsegment %s, offset %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "ej-i-sekvens block_id %u vid %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA satt, men ingen data inkluderad vid %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA ej satt, men datalängd är %u vid %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE satt, men håloffset %u längd %u block-image-längd %u vid %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE ej satt, men håloffset %u längd %u vid %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED satt, men blockavbildlängd %u vid %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "varken BKPIMAGE_HAS_HOLE eller BKPIMAGE_COMPRESSED satt, men blockavbildlängd är %u vid %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL satt men ingen tidigare rel vid %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "ogiltig block_id %u vid %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "post med ogiltig längd vid %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "kunde inte hitta backup-block med ID %d i WAL-post"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "kunde inte återställa avbild vid %X/%X med ogiltigt block %d angivet"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "kunde inte återställa avbild vid %X/%X med ogiltigt state, block %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "kunde inte återställa avbild vid %X/%X komprimerade med %s stöds inte av bygget, block %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "kunde inte återställa avbild vid %X/%X komprimerad med okänd metod, block %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "kunde inte packa upp avbild vid %X/%X, block %d"
diff --git a/src/bin/pg_rewind/po/uk.po b/src/bin/pg_rewind/po/uk.po
new file mode 100644
index 0000000..4c0357f
--- /dev/null
+++ b/src/bin/pg_rewind/po/uk.po
@@ -0,0 +1,993 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-01-31 23:20+0000\n"
+"PO-Revision-Date: 2023-04-19 15:06\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_rewind.pot\n"
+"X-Crowdin-File-ID: 908\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередження: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "недостатньо пам'яті\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "неможливо дублювати нульовий покажчик (внутрішня помилка)\n"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "не вдалося завантажити бібліотеку \"%s\": код помилки %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "не вдалося створити обмежені токени на цій платформі: код помилки %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "не вдалося відкрити токен процесу: код помилки %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "не вдалося виділити SID: код помилки %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "не вдалося створити обмежений токен: код помилки %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "не вдалося запустити процес для команди \"%s\": код помилки %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "не вдалося перезапустити з обмеженим токеном: код помилки %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "не вдалося отримати код завершення підпроцесу: код помилки %lu"
+
+#: ../../fe_utils/archive.c:52
+#, c-format
+msgid "cannot use restore_command with %%r placeholder"
+msgstr "не вдалося використати restore_command із заповнювачем %%r"
+
+#: ../../fe_utils/archive.c:70
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "неочікуваний розмір файлу для \"%s\": %lld замість %lld"
+
+#: ../../fe_utils/archive.c:78
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "не вдалося відкрити файл \"%s\" відновлений з архіву: %m"
+
+#: ../../fe_utils/archive.c:87 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не вдалося отримати інформацію від файлу \"%s\": %m"
+
+#: ../../fe_utils/archive.c:99
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "помилка restore_command: %s"
+
+#: ../../fe_utils/archive.c:106
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "не вдалося відновити файл \"%s\" з архіву"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "недостатньо пам'яті"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "неможливо записати до файлу \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "неможливо створити файл \"%s\": %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "не вдалося відкрити цільовий файл \"%s\": %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "не вдалося закрити цільовий файл \"%s\": %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "не вдалося знайти в цільовому файлі \"%s\": %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не вдалося записати файл \"%s\": %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "невизначений тип файлу для \"%s\""
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "неприпустима дія (CREATE) для звичайного файлу"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "не можливо видалити файл \"%s\": %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "не вдалося відкрити файл \"%s\" для скорочення: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "не вдалося скоротити файл \"%s\" до потрібного розміру %u: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не вдалося створити каталог \"%s\": %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "не вдалося видалити каталог \"%s\": %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "неможливо створити символічне послання на \"%s\": %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "не вдалося видалити символьне посилання \"%s\": %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "не вдалося відкрити файл \"%s\" для читання: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не вдалося прочитати файл \"%s\": %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "не вдалося прочитати файл \"%s\": прочитано %d з %zu"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не вдалося відкрити каталог \"%s\": %m"
+
+#: file_ops.c:446
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "не можливо прочитати символічне послання \"%s\": %m"
+
+#: file_ops.c:449
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "таргет символічного посилання \"%s\" задовгий"
+
+#: file_ops.c:464
+#, c-format
+msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+msgstr "\"%s\"є символічним посиланням, але символічні посилання не підтримуються на даній платформі"
+
+#: file_ops.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не вдалося прочитати каталог \"%s\": %m"
+
+#: file_ops.c:475
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не вдалося закрити каталог \"%s\": %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "файл даних \"%s\" в джерелі не є регулярним файлом"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "дублікат вихідного файлу \"%s\""
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "неочікувана модифікація сторінки для нерегулярного файлу \"%s\""
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "невідомий тип файлу для \"%s\""
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "файл \"%s\" має різні типи у джерелі та цілі"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "не вдалося вирішити, що робити з файлом \"%s\""
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "не вдалося очистити search_path: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "на початковому сервері повинно бути увімкнено full_page_writes"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "не вдалося підготувати інструкцію щоб отримати вміст файлу: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "помилка при виконанні запиту (%s) на вихідному сервері: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "неочікуваний результат запиту"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "помилка при виконанні запиту (%s) на початковому сервері: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "нерозпізнаний результат \"%s\" замість поточної добавленої позиції WAL"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "не вдалося отримати список файлів: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "неочікуваний результат при отриманні списку файлів"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "не вдалося надіслати запит: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "не вдалося встановити libpq з'єднання для однорядкового режиму"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "неочікуваний результат при отриманні віддалених файлів: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "отримано більше фрагментів даних, ніж запитувалось"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "неочікуваний розмір набору результатів при отриманні віддалених файлів"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "неочікувані типи даних в результаті при отриманні віддалених файлів: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "неочікуваний формат результату при отриманні віддалених файлів"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "неочікувані нульові значення в результаті при отриманні віддалених файлів"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "неочікувана довжина результату при отриманні віддалених файлів"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "отримані дані для файлу \"%s\", коли запитувалось для \"%s\""
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "отримано дані по зсуву %lld файлу \"%s\", коли запитувалось про зсув %lld"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "отримано більше, ніж запитувалось для файлу \"%s\""
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "отримано неочікувану кількість фрагментів даних"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "не вдалося отримати віддалений файл \"%s\": %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "неочікуваний набір результатів при отриманні віддаленого файлу \"%s\""
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "не вдалося відкрити вихідний файл \"%s\": %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "розмір вихідного файлу \"%s\" паралельно змінився: очікувалося %d байт, %d скопійовано"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "неможливо закрити файл \"%s\": %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "не вдалося знайти у вихідному файлі: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "неочікуваний кінець при читанні файлу \"%s\""
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "недостатньо пам'яті під час виділення обробника читання WAL"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "не вдалося прочитати запис WAL на %X/%X: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "не вдалося прочитати запис WAL на %X/%X"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "кінцевий покажчик %X/%X не є допустимою кінцевою точкою; очікувалось %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "не вдалося знайти попередній запис WAL на %X/%X: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "не вдалося знайти попередній запис WAL на %X/%X"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "не вдалося знайти в файлі \"%s\": %m"
+
+#: parsexlog.c:440
+#, c-format
+msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+msgstr "WAL модифікує відношення, але тип запису не розпізнано: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:86
+#, c-format
+msgid "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n\n"
+msgstr "%s синхронізує кластер PostgreSQL з іншою копією кластеру.\n\n"
+
+#: pg_rewind.c:87
+#, c-format
+msgid "Usage:\n"
+" %s [OPTION]...\n\n"
+msgstr "Використання:\n"
+" %s [OPTION]...\n\n"
+
+#: pg_rewind.c:88
+#, c-format
+msgid "Options:\n"
+msgstr "Параметри:\n"
+
+#: pg_rewind.c:89
+#, c-format
+msgid " -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr " -c, --restore-target-wal використовує restore_command в цільовій конфігурації, щоб\n"
+" отримати файли WAL з архівів\n"
+
+#: pg_rewind.c:91
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=DIRECTORY існуючий каталог для змін\n"
+
+#: pg_rewind.c:92
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=DIRECTORY початковий каталог даних для синхронізації\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONNSTR початковий сервер для синхронізації\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run зупинитися до внесення будь-яких змін\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr " -N, --no-sync не чекати поки зміни будуть записані на диск\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress повідомляти про хід процесу\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid " -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr " -R, --write-recovery-conf записує конфігурацію для реплікації \n"
+" (потребує --source-server)\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid " --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr " --config-file=FILENAME використовувати заданий основний файл конфігурації сервера\n"
+" при запуску цільового кластера\n"
+
+#: pg_rewind.c:102
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug виводити багато налагоджувальних повідомлень\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr " --no-ensure-shutdown не виправляти автоматично неочищене завершення роботи\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію і вийти\n"
+
+#: pg_rewind.c:105
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати довідку, потім вийти\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"Повідомляти про помилки на <%s>.\n"
+
+#: pg_rewind.c:107
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237
+#: pg_rewind.c:244 pg_rewind.c:252
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" для додаткової інформації."
+
+#: pg_rewind.c:222
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "джерело не вказано (--source-pgdata чи --source-server)"
+
+#: pg_rewind.c:229
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "може бути вказано лише --source-pgdata чи --source-server"
+
+#: pg_rewind.c:236
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "не вказано жодного каталогу цільових даних (--target-pgdata)"
+
+#: pg_rewind.c:243
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "немає інформації про вихідний сервер (--source-server) вказаної для --write-recovery-conf"
+
+#: pg_rewind.c:250
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному рядку (перший \"%s\")"
+
+#: pg_rewind.c:265
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "\"root\" не може це виконувати"
+
+#: pg_rewind.c:266
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Запускати %s треба від суперкористувача PostgreSQL."
+
+#: pg_rewind.c:276
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "не вдалося прочитати дозволи на каталог \"%s\": %m"
+
+#: pg_rewind.c:294
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:297
+#, c-format
+msgid "connected to server"
+msgstr "під'єднано до серверу"
+
+#: pg_rewind.c:344
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "початковий і цільовий кластери знаходяться на одній лінії часу"
+
+#: pg_rewind.c:353
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "сервери розійшлись в позиції WAL %X/%X на лінії часу %u"
+
+#: pg_rewind.c:401
+#, c-format
+msgid "no rewind required"
+msgstr "перемотування не потрібне"
+
+#: pg_rewind.c:410
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "перемотування від останньої спільної контрольної точки на %X/%X на лінії часу %u"
+
+#: pg_rewind.c:420
+#, c-format
+msgid "reading source file list"
+msgstr "читання списку файлів із джерела"
+
+#: pg_rewind.c:424
+#, c-format
+msgid "reading target file list"
+msgstr "читання списку цільових файлів"
+
+#: pg_rewind.c:433
+#, c-format
+msgid "reading WAL in target"
+msgstr "читання WAL у цілі"
+
+#: pg_rewind.c:454
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "треба скопіювати %lu МБ (загальний розмір каталогу джерела становить %lu МБ)"
+
+#: pg_rewind.c:472
+#, c-format
+msgid "syncing target data directory"
+msgstr "синхронізація цільового каталогу даних"
+
+#: pg_rewind.c:488
+#, c-format
+msgid "Done!"
+msgstr "Готово!"
+
+#: pg_rewind.c:568
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "жодних дій щодо файлу \"%s\" не прийнято"
+
+#: pg_rewind.c:600
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "вихідну систему було змінено під час роботи pg_rewind"
+
+#: pg_rewind.c:604
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "створення мітки резервного копіювання і оновлення контрольного файлу"
+
+#: pg_rewind.c:654
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "вихідна система була в неочікуваному стані наприкінці перемотування"
+
+#: pg_rewind.c:685
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "початковий і цільовий кластер належать до різних систем"
+
+#: pg_rewind.c:693
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "кластери не сумісні з даною версією pg_rewind"
+
+#: pg_rewind.c:703
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "цільовий сервер потребує використання контрольної суми даних або \"wal_log_hints = on\""
+
+#: pg_rewind.c:714
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "цільовий сервер повинен бути вимкненим штатно"
+
+#: pg_rewind.c:724
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "робота з початковим каталогом даних повинна бути завершена штатно"
+
+#: pg_rewind.c:771
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "скопійовано %*s/%s кБ (%d%%)"
+
+#: pg_rewind.c:834
+#, c-format
+msgid "invalid control file"
+msgstr "неприпустимий контрольний файл"
+
+#: pg_rewind.c:918
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "не вдалося знайти спільного предка ліній часу початкового та цільового кластерів"
+
+#: pg_rewind.c:959
+#, c-format
+msgid "backup label buffer too small"
+msgstr "буфер для мітки резервного копіювання замалий"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "неочікуваний контрольний файл CRC"
+
+#: pg_rewind.c:994
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "неочікуваний розмір контрольного файлу %d, очікувалося %d"
+
+#: pg_rewind.c:1003
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "Розмір сегменту WAL повинен задаватись ступенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано значення %d"
+msgstr[1] "Розмір сегменту WAL повинен задаватись ступенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано значення %d"
+msgstr[2] "Розмір сегменту WAL повинен задаватись ступенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано значення %d"
+msgstr[3] "Розмір сегменту WAL повинен задаватись ступенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано значення %d"
+
+#: pg_rewind.c:1042 pg_rewind.c:1112
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "програма \"%s\" потрібна для %s, але не знайдена в тому ж каталозі, що й \"%s\""
+
+#: pg_rewind.c:1045 pg_rewind.c:1115
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "програма \"%s\" знайдена для \"%s\", але має відмінну версію від %s"
+
+#: pg_rewind.c:1078
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "команда restore_command не встановлена в цільовому кластері"
+
+#: pg_rewind.c:1119
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "виконання \"%s\" для цільового серверу, щоб завершити відновлення після аварійного завершення роботи"
+
+#: pg_rewind.c:1156
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "не вдалося ввімкнути однокористувацький режим postgres в цільовому кластері"
+
+#: pg_rewind.c:1157
+#, c-format
+msgid "Command was: %s"
+msgstr "Команда була: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "синтаксична помилка у файлі історії: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "Очікується числовий ідентифікатор лінії часу."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "Очікується положення точки випереджувального журналювання."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "неприпустимі дані у файлу історії: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "Ідентифікатори ліній часу повинні збільшуватись."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "неприпустимі дані у файлі історії"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "Ідентифікатори ліній часу повинні бути меншими від ідентифікатора дочірньої лінії."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "невірний зсув запису: %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "по зсуву %X/%X запитано продовження запису"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "невірна довжина запису по зсуву %X/%X: очікувалось %u, отримано %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "не вистачило пам'яті під час спроби закодування запису довжиною %u"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "довжина запису %u на %X/%X є задовгою"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "немає прапорця contrecord в позиції %X/%X"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "неприпустима довжина contrecord %u (очікувалось %lld) на %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "відсутній contrecord в %X/%X"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "невірний ID менеджера ресурсів %u в %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "запис з неправильним попереднім посиланням %X/%X на %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "некоректна контрольна сума даних менеджера ресурсів у запису по зсуву %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "невірне магічне число %04X в сегменті журналу %s, зсув %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "невірні інформаційні біти %04X в сегменті журналу %s, зсув %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "WAL файл належить іншій системі баз даних: ідентифікатор системи баз даних де міститься WAL файл - %llu, а ідентифікатор системи баз даних pg_control - %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "Файл WAL належить іншій системі баз даних: некоректний розмір сегменту в заголовку сторінки"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "Файл WAL належить іншій системі баз даних: некоректний XLOG_BLCKSZ в заголовку сторінки"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "неочікуваний pageaddr %X/%X в сегменті журналу %s, зсув %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "порушення послідовності ID лінії часу %u (після %u) в сегменті журналу %s, зсув %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "ідентифікатор блока %u out-of-order в позиції %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA встановлений, але немає даних в позиції %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA встановлений, але довжина даних дорівнює %u в позиції %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE встановлений, але для пропуску задані: зсув %u, довжина %u, при довжині образу блока %u в позиції %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE не встановлений, але для пропуску задані: зсув %u, довжина %u в позиції %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED встановлений, але довжина образу блока дорівнює %u в позиції %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "ні BKPIMAGE_HAS_HOLE, ні BKPIMAGE_COMPRESSED не встановлені, але довжина образу блока дорівнює %u в позиції %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL встановлений, але попереднє значення не задано в позиції %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "невірний ідентифікатор блоку %u в позиції %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "запис з невірною довжиною на %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "не вдалося знайти блок резервної копії з ID %d у записі WAL"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "не вдалося відновити зображення %X/%X з недійсним вказаним блоком %d"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "не вдалося відновити зображення %X/%X з недійсним станом, блок %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "не вдалося відновити зображення в %X/%X, стиснуте %s, не підтримується збіркою, блок %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "не вдалося відновити зображення %X/%X стиснуте з невідомим методом, блок %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "не вдалося розпакувати зображення на %X/%X, блок %d"
+
diff --git a/src/bin/pg_rewind/po/zh_CN.po b/src/bin/pg_rewind/po/zh_CN.po
new file mode 100644
index 0000000..28d76c3
--- /dev/null
+++ b/src/bin/pg_rewind/po/zh_CN.po
@@ -0,0 +1,959 @@
+# LANGUAGE message translation file for pg_rewind
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2015.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:48+0000\n"
+"PO-Revision-Date: 2021-08-15 10:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.5.7\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的: "
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "内存不足\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "无法复制空指针 (内部错误)\n"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "无法加载库 \"%s\": 错误码 %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "无法为该平台创建受限制的令牌:错误码 %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "无法打开进程令牌 (token): 错误码 %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "无法分配SID: 错误码 %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "无法创建受限令牌: 错误码为 %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "无法为命令 \"%s\"创建进程: 错误码 %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "无法使用受限令牌再次执行: 错误码 %lu"
+
+#: ../../common/restricted_token.c:194
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "无法从子进程得到退出码: 错误码 %lu"
+
+#: ../../fe_utils/archive.c:53
+#, c-format
+msgid "cannot use restore_command with %%r placeholder"
+msgstr "无法对%%r占位符使用restore_command"
+
+#: ../../fe_utils/archive.c:74
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "\"%s\"的意外文件大小:%lld而不是%lld"
+
+#: ../../fe_utils/archive.c:85
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "无法打开从存档还原的文件\"%s\": %m"
+
+#: ../../fe_utils/archive.c:97 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "无法取文件 \"%s\" 的状态: %m"
+
+#: ../../fe_utils/archive.c:112
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_command失败: %s"
+
+#: ../../fe_utils/archive.c:121
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "无法从存档还原文件\"%s\""
+
+#: ../../fe_utils/recovery_gen.c:35 ../../fe_utils/recovery_gen.c:49
+#: ../../fe_utils/recovery_gen.c:77 ../../fe_utils/recovery_gen.c:100
+#: ../../fe_utils/recovery_gen.c:171 parsexlog.c:77 parsexlog.c:135
+#: parsexlog.c:195
+#, c-format
+msgid "out of memory"
+msgstr "内存不足"
+
+#: ../../fe_utils/recovery_gen.c:134 parsexlog.c:308
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "无法打开文件 \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:140
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "无法写入文件 \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:152
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "无法创建文件 \"%s\": %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "无法打开目标文件\"%s\": %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "无法关闭目标文件\"%s\": %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "无法在目标文件\"%s\"中定位(seek): %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "无法写入文件 \"%s\": %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "不可识别的文件格式 \"%s\""
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "对常规文件无效的动作(CREATE)"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "无法删除文件 \"%s\": %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "无法打开文件\"%s\"用于截断:%m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "无法将文件\"%s\"截断为%u:%m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "无法创建目录 \"%s\": %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "无法删除目录 \"%s\": %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "无法在\"%s\"创建符号链接: %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "无法删除符号链接 \"%s\": %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "为了读取, 无法打开文件 \"%s\": %m"
+
+#: file_ops.c:341 local_source.c:107 parsexlog.c:346
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "无法读取文件 \"%s\": %m"
+
+#: file_ops.c:344 parsexlog.c:348
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "无法读取文件\"%1$s\":读取了%3$zu中的%2$d"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "无法打开目录 \"%s\": %m"
+
+#: file_ops.c:446
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "无法读取符号链接 \"%s\": %m"
+
+#: file_ops.c:449
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "符号链接 \"%s\" 目标超长"
+
+#: file_ops.c:464
+#, c-format
+msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+msgstr "\"%s\"是一个符号链接,但是这个平台上不支持平台链接"
+
+#: file_ops.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "无法读取目录 \"%s\": %m"
+
+#: file_ops.c:475
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "无法关闭目录 \"%s\": %m"
+
+#: filemap.c:237
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "源头的数据文件\"%s\"不是一个常规文件"
+
+#: filemap.c:242 filemap.c:275
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "复制源文件\"%s\""
+
+#: filemap.c:330
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "非常规文件\"%s\"的意外页面修改"
+
+#: filemap.c:680 filemap.c:774
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "\"%s\"的未知文件类型"
+
+#: filemap.c:707
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "文件 \"%s\"在源和目标中的类型不同"
+
+#: filemap.c:779
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "无法决定如何处理文件\"%s\""
+
+#: libpq_source.c:128
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "无法清除search_path: %s"
+
+#: libpq_source.c:139
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "源服务器中的full_page_writes必须被启用"
+
+#: libpq_source.c:150
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "无法准备语句以获取文件内容: %s"
+
+#: libpq_source.c:169
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "源服务器中有错误运行的查询(%s):%s"
+
+#: libpq_source.c:174
+#, c-format
+msgid "unexpected result set from query"
+msgstr "从查询得到意料之外的结果集"
+
+#: libpq_source.c:196
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "源服务器中有错误运行的查询(%s):%s"
+
+#: libpq_source.c:217
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "当前WAL插入位置的未识别结果\"%s\""
+
+#: libpq_source.c:268
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "无法取得文件列表:%s"
+
+#: libpq_source.c:273
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "在取得文件列表时得到意料之外的结果集"
+
+#: libpq_source.c:435
+#, c-format
+msgid "could not send query: %s"
+msgstr "无法发送查询:%s"
+
+#: libpq_source.c:438
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "无法设置libpq连接为单行模式"
+
+#: libpq_source.c:468
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "在取得远程文件时得到意料之外的结果:%s"
+
+#: libpq_source.c:473
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "收到的数据块比请求的多"
+
+#: libpq_source.c:477
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "在取得远程文件时得到意料之外的结果集大小"
+
+#: libpq_source.c:483
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "在取得远程文件时结果集中有意料之外的数据类型:%u %u %u"
+
+#: libpq_source.c:491
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "在取得远程文件时得到意料之外的结果格式"
+
+#: libpq_source.c:497
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "在取得远程文件时结果中有意料之外的空值"
+
+#: libpq_source.c:501
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "在取得远程文件时得到意料之外的结果长度"
+
+#: libpq_source.c:534
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "当为文件\"%2$s\"请求时,接收到文件\"%1$s\"的数据"
+
+#: libpq_source.c:538
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "当请求偏移量%3$lld时,在文件\"%2$s\"的偏移量%1$lld处接收到数据"
+
+#: libpq_source.c:550
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "收到的文件\"%s\"比要求的多"
+
+#: libpq_source.c:563
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "接收到意外的数据块数"
+
+#: libpq_source.c:606
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "无法取得远程文件\"%s\": %s"
+
+#: libpq_source.c:611
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "在取得远程文件\"%s\"时得到意料之外的结果集"
+
+#: local_source.c:86
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "无法打开源文件\"%s\": %m"
+
+#: local_source.c:90
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "无法在源文件中定位(seek):%m"
+
+#: local_source.c:109
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "读取文件\"%s\"时遇到意料之外的EOF"
+
+#: local_source.c:116
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "无法关闭文件 \"%s\": %m"
+
+#: parsexlog.c:89 parsexlog.c:142
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "无法读取%X/%X处的WAL记录:%s"
+
+#: parsexlog.c:93 parsexlog.c:145
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "无法读取%X/%X处的WAL记录"
+
+#: parsexlog.c:208
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "无法在%X/%X找到前一个WAL记录:%s"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "无法在%X/%X找到前一个WAL记录"
+
+#: parsexlog.c:337
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "无法在文件\"%s\"进行查找: %m"
+
+#: parsexlog.c:429
+#, c-format
+msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmgr: %s, info: %02X"
+msgstr "WAL记录修改了一个关系,但是记录类型无法识别: lsn: %X/%X, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:84
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s用一个PostgreSQL集簇的另一个拷贝重新同步了该集簇。\n"
+"\n"
+
+#: pg_rewind.c:85
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"用法:\n"
+" %s [选项]...\n"
+"\n"
+
+#: pg_rewind.c:86
+#, c-format
+msgid "Options:\n"
+msgstr "选项:\n"
+
+#: pg_rewind.c:87
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal 在目标配置中使用restore_command\n"
+" 从存档中检索WAL文件\n"
+
+#: pg_rewind.c:89
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=DIRECTORY 已有的要修改的数据目录\n"
+
+#: pg_rewind.c:90
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=DIRECTORY 要与之同步的源数据目录\n"
+
+#: pg_rewind.c:91
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONNSTR 要与之同步的源服务器\n"
+
+#: pg_rewind.c:92
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run 在修改任何东西之前停止\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --no-sync 不用等待变化安全\n"
+" 写入磁盘\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress 写出进度消息\n"
+
+#: pg_rewind.c:96
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf 为复制写配置文\n"
+" (requires --source-server)\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug 写出很多调试消息\n"
+
+#: pg_rewind.c:99
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr " --no-ensure-shutdown 不要自动修复不干净的关机\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信息,然后退出\n"
+
+#: pg_rewind.c:101
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示本帮助,然后退出\n"
+
+#: pg_rewind.c:102
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: pg_rewind.c:164 pg_rewind.c:213 pg_rewind.c:220 pg_rewind.c:227
+#: pg_rewind.c:234 pg_rewind.c:242
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获取更多的信息.\n"
+
+#: pg_rewind.c:212
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "没有指定源 (--source-pgdata 或者 --source-server)"
+
+#: pg_rewind.c:219
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "只能指定--source-pgdata和--source-server这两个选项之一"
+
+#: pg_rewind.c:226
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "没有指定目标数据目录 (--target-pgdata)"
+
+#: pg_rewind.c:233
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "没有为--write-recovery-conf指定源服务器信息(--source-server)"
+
+#: pg_rewind.c:240
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行参数太多 (第一个是 \"%s\")"
+
+#: pg_rewind.c:255
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "不能由\"root\"执行"
+
+#: pg_rewind.c:256
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser.\n"
+msgstr "您现在作为PostgreSQL超级用户运行%s.\n"
+
+#: pg_rewind.c:267
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "没有读取目录 \"%s\" 的权限: %m"
+
+#: pg_rewind.c:287
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:290
+#, c-format
+msgid "connected to server"
+msgstr "已连接服务器"
+
+#: pg_rewind.c:337
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "源集簇和目标集簇处于同一时间线"
+
+#: pg_rewind.c:346
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "服务器在时间线%3$u上的WAL位置%1$X/%2$X处发生了分歧"
+
+#: pg_rewind.c:394
+#, c-format
+msgid "no rewind required"
+msgstr "不需要倒带(rewind)"
+
+#: pg_rewind.c:403
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "从时间线%3$u上%1$X/%2$X处的最后一个普通检查点倒带"
+
+#: pg_rewind.c:413
+#, c-format
+msgid "reading source file list"
+msgstr "读取源文件列表"
+
+#: pg_rewind.c:417
+#, c-format
+msgid "reading target file list"
+msgstr "读取目标文件列表"
+
+#: pg_rewind.c:426
+#, c-format
+msgid "reading WAL in target"
+msgstr "读取目标中的WAL"
+
+#: pg_rewind.c:447
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "需要复制 %lu MB(整个源目录的大小是 %lu MB)"
+
+#: pg_rewind.c:465
+#, c-format
+msgid "syncing target data directory"
+msgstr "正在同步目标数据目录"
+
+#: pg_rewind.c:481
+#, c-format
+msgid "Done!"
+msgstr "完成!"
+
+#: pg_rewind.c:564
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "未决定对文件\"%s\"执行任何操作"
+
+#: pg_rewind.c:596
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "pg_rewind运行时修改了源系统"
+
+#: pg_rewind.c:600
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "正在创建备份标签并且更新控制文件"
+
+#: pg_rewind.c:650
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "源系统在rewind结束时处于意外状态"
+
+#: pg_rewind.c:681
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "源集簇和目标集簇来自不同的系统"
+
+#: pg_rewind.c:689
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "集簇与这个pg_rewind的版本不兼容"
+
+#: pg_rewind.c:699
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "目标服务器需要使用数据校验和或者让\"wal_log_hints = on\""
+
+#: pg_rewind.c:710
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "目标服务器必须被干净地关闭"
+
+#: pg_rewind.c:720
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "源数据目录必须被干净地关闭"
+
+#: pg_rewind.c:772
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "已复制%*s/%s kB (%d%%)"
+
+#: pg_rewind.c:835
+#, c-format
+msgid "invalid control file"
+msgstr "无效的控制文件"
+
+#: pg_rewind.c:919
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "无法找到源集簇和目标集簇的时间线的共同祖先"
+
+#: pg_rewind.c:960
+#, c-format
+msgid "backup label buffer too small"
+msgstr "备份标签缓冲太小"
+
+#: pg_rewind.c:983
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "意料之外的控制文件CRC"
+
+#: pg_rewind.c:995
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "意料之外的控制文件大小%d,应该是%d"
+
+#: pg_rewind.c:1004
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "WAL段大小必须是1 MB到1 GB之间的2的幂,但控制文件指定了%d字节"
+msgstr[1] "WAL段大小必须是1 MB到1 GB之间的2的幂,但控制文件指定了%d字节"
+
+#: pg_rewind.c:1043 pg_rewind.c:1101
+#, c-format
+msgid ""
+"The program \"%s\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation."
+msgstr ""
+"%2$s需要程序\"%1$s\"\n"
+"但在与\"%3$s\"相同的目录中找不到该程序.\n"
+"检查您的安装."
+
+#: pg_rewind.c:1048 pg_rewind.c:1106
+#, c-format
+msgid ""
+"The program \"%s\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation."
+msgstr ""
+"程序\"%s\"是由\"%s\"找到的\n"
+"但与%s的版本不同.\n"
+"检查您的安装."
+
+#: pg_rewind.c:1069
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "目标群集中未设置restore_command"
+
+#: pg_rewind.c:1112
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "对目标服务器执行\"%s\"以完成崩溃恢复"
+
+#: pg_rewind.c:1132
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "目标群集中的postgres单用户模式失败"
+
+#: pg_rewind.c:1133
+#, c-format
+msgid "Command was: %s"
+msgstr "命令是: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "历史文件中的语法错误: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "期望一个数字 timeline ID."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "期望一个预写日志切换点位置."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "历史文件中的无效数据: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "TimeLine ID 必须为递增序列."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "历史文件中有无效数据"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "Timeline ID 必须小于子 timeline 的 ID."
+
+#: xlogreader.c:349
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "%X/%X处有无效的记录偏移量"
+
+#: xlogreader.c:357
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "%X/%X位置处要求继续记录"
+
+#: xlogreader.c:398 xlogreader.c:695
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "%X/%X处有无效记录长度: 应该是%u, 但实际是%u"
+
+#: xlogreader.c:422
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "%2$X/%3$X处的记录长度%1$u太长"
+
+#: xlogreader.c:453
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "在%X/%X处没有继续记录标志"
+
+#: xlogreader.c:466
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "%3$X/%4$X处有无效的继续记录长度%1$u(应为 %2$lld)"
+
+#: xlogreader.c:703
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "%2$X/%3$X处有无效的资源管理器 ID %1$u"
+
+#: xlogreader.c:716 xlogreader.c:732
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "具有不正确向前链接%X/%X的记录出现在%X/%X"
+
+#: xlogreader.c:768
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "在%X/%X处的记录中的资源管理器数据校验和不正确"
+
+#: xlogreader.c:805
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "在日志段%2$s的偏移量%3$u处有无效的magic号%1$04X"
+
+#: xlogreader.c:819 xlogreader.c:860
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "在日志段%2$s的偏移量%3$u处有无效的info位%1$04X"
+
+#: xlogreader.c:834
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "WAL文件来自于不同的数据库系统:WAL文件数据库系统标识符是%llu,pg_control数据库系统标识符是%llu"
+
+#: xlogreader.c:842
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL文件来自于不同的数据库系统:页头部中有不正确的段大小"
+
+#: xlogreader.c:848
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL文件来自于不同的数据库系统:页头部中有不正确的XLOG_BLCKSZ"
+
+#: xlogreader.c:879
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "在日志段%3$s的偏移量%4$u处有意料之外的pageaddr %1$X/%2$X"
+
+#: xlogreader.c:904
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "在日志段%3$s的偏移量%4$u处有失序的时间线 ID %1$u(在%2$u之后)"
+
+#: xlogreader.c:1249
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "在%2$X/%3$X处有无序的block_id %1$u"
+
+#: xlogreader.c:1271
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA已被设置,但是在%X/%X处没有包括数据"
+
+#: xlogreader.c:1278
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA没有被设置,但是在%2$X/%3$X处的数据长度为%1$u"
+
+#: xlogreader.c:1314
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE已被设置,但是%4$X/%5$X处记录了洞偏移量为%1$u、长度为%2$u、块映像长度为%3$u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE没有被设置,但是%3$X/%4$X处记录了洞偏移量为%1$u、长度为%2$u"
+
+#: xlogreader.c:1345
+#, c-format
+msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_IS_COMPRESSED已被设置,但是%2$X/%3$X处记录的块映像长度为%1$u"
+
+#: xlogreader.c:1360
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE和BKPIMAGE_IS_COMPRESSED都没有被设置,但是%2$X/%3$X处记录的块映像长度为%1$u"
+
+#: xlogreader.c:1376
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "设置了BKPBLOCK_SAME_REL,但是在%X/%X位置没有记录先前的关系"
+
+#: xlogreader.c:1388
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "%2$X/%3$X处的block_id %1$u无效"
+
+#: xlogreader.c:1475
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "在%X/%X处的记录的长度无效"
+
+#: xlogreader.c:1564
+#, c-format
+msgid "invalid compressed image at %X/%X, block %d"
+msgstr "%X/%X处是块%d的无效压缩映像"
diff --git a/src/bin/pg_rewind/rewind_source.h b/src/bin/pg_rewind/rewind_source.h
new file mode 100644
index 0000000..1310e86
--- /dev/null
+++ b/src/bin/pg_rewind/rewind_source.h
@@ -0,0 +1,86 @@
+/*-------------------------------------------------------------------------
+ *
+ * rewind_source.h
+ * Abstraction for fetching from source server.
+ *
+ * The source server can be either a libpq connection to a live system,
+ * or a local data directory. The 'rewind_source' struct abstracts the
+ * operations to fetch data from the source system, so that the rest of
+ * the code doesn't need to care what kind of a source its dealing with.
+ *
+ * Copyright (c) 2013-2022, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef REWIND_SOURCE_H
+#define REWIND_SOURCE_H
+
+#include "access/xlogdefs.h"
+#include "file_ops.h"
+#include "filemap.h"
+#include "libpq-fe.h"
+
+typedef struct rewind_source
+{
+ /*
+ * Traverse all files in the source data directory, and call 'callback' on
+ * each file.
+ */
+ void (*traverse_files) (struct rewind_source *,
+ process_file_callback_t callback);
+
+ /*
+ * Fetch a single file into a malloc'd buffer. The file size is returned
+ * in *filesize. The returned buffer is always zero-terminated, which is
+ * handy for text files.
+ */
+ char *(*fetch_file) (struct rewind_source *, const char *path,
+ size_t *filesize);
+
+ /*
+ * Request to fetch (part of) a file in the source system, specified by an
+ * offset and length, and write it to the same offset in the corresponding
+ * target file. The source implementation may queue up the request and
+ * execute it later when convenient. Call finish_fetch() to flush the
+ * queue and execute all requests.
+ */
+ void (*queue_fetch_range) (struct rewind_source *, const char *path,
+ off_t offset, size_t len);
+
+ /*
+ * Like queue_fetch_range(), but requests replacing the whole local file
+ * from the source system. 'len' is the expected length of the file,
+ * although when the source is a live server, the file may change
+ * concurrently. The implementation is not obliged to copy more than 'len'
+ * bytes, even if the file is larger. However, to avoid copying a
+ * truncated version of the file, which can cause trouble if e.g. a
+ * configuration file is modified concurrently, the implementation should
+ * try to copy the whole file, even if it's larger than expected.
+ */
+ void (*queue_fetch_file) (struct rewind_source *, const char *path,
+ size_t len);
+
+ /*
+ * Execute all requests queued up with queue_fetch_range().
+ */
+ void (*finish_fetch) (struct rewind_source *);
+
+ /*
+ * Get the current WAL insert position in the source system.
+ */
+ XLogRecPtr (*get_current_wal_insert_lsn) (struct rewind_source *);
+
+ /*
+ * Free this rewind_source object.
+ */
+ void (*destroy) (struct rewind_source *);
+
+} rewind_source;
+
+/* in libpq_source.c */
+extern rewind_source *init_libpq_source(PGconn *conn);
+
+/* in local_source.c */
+extern rewind_source *init_local_source(const char *datadir);
+
+#endif /* FETCH_H */
diff --git a/src/bin/pg_rewind/t/001_basic.pl b/src/bin/pg_rewind/t/001_basic.pl
new file mode 100644
index 0000000..db9201f
--- /dev/null
+++ b/src/bin/pg_rewind/t/001_basic.pl
@@ -0,0 +1,194 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+use FindBin;
+use lib $FindBin::RealBin;
+
+use RewindTest;
+
+sub run_test
+{
+ my $test_mode = shift;
+
+ RewindTest::setup_cluster($test_mode);
+ RewindTest::start_primary();
+
+ # Create a test table and insert a row in primary.
+ primary_psql("CREATE TABLE tbl1 (d text)");
+ primary_psql("INSERT INTO tbl1 VALUES ('in primary')");
+
+ # This test table will be used to test truncation, i.e. the table
+ # is extended in the old primary after promotion
+ primary_psql("CREATE TABLE trunc_tbl (d text)");
+ primary_psql("INSERT INTO trunc_tbl VALUES ('in primary')");
+
+ # This test table will be used to test the "copy-tail" case, i.e. the
+ # table is truncated in the old primary after promotion
+ primary_psql("CREATE TABLE tail_tbl (id integer, d text)");
+ primary_psql("INSERT INTO tail_tbl VALUES (0, 'in primary')");
+
+ # This test table is dropped in the old primary after promotion.
+ primary_psql("CREATE TABLE drop_tbl (d text)");
+ primary_psql("INSERT INTO drop_tbl VALUES ('in primary')");
+
+ primary_psql("CHECKPOINT");
+
+ RewindTest::create_standby($test_mode);
+
+ # Insert additional data on primary that will be replicated to standby
+ primary_psql("INSERT INTO tbl1 values ('in primary, before promotion')");
+ primary_psql(
+ "INSERT INTO trunc_tbl values ('in primary, before promotion')");
+ primary_psql(
+ "INSERT INTO tail_tbl SELECT g, 'in primary, before promotion: ' || g FROM generate_series(1, 10000) g"
+ );
+
+ primary_psql('CHECKPOINT');
+
+ RewindTest::promote_standby();
+
+ # Insert a row in the old primary. This causes the primary and standby
+ # to have "diverged", it's no longer possible to just apply the
+ # standy's logs over primary directory - you need to rewind.
+ primary_psql("INSERT INTO tbl1 VALUES ('in primary, after promotion')");
+
+ # Also insert a new row in the standby, which won't be present in the
+ # old primary.
+ standby_psql("INSERT INTO tbl1 VALUES ('in standby, after promotion')");
+
+ # Insert enough rows to trunc_tbl to extend the file. pg_rewind should
+ # truncate it back to the old size.
+ primary_psql(
+ "INSERT INTO trunc_tbl SELECT 'in primary, after promotion: ' || g FROM generate_series(1, 10000) g"
+ );
+
+ # Truncate tail_tbl. pg_rewind should copy back the truncated part
+ # (We cannot use an actual TRUNCATE command here, as that creates a
+ # whole new relfilenode)
+ primary_psql("DELETE FROM tail_tbl WHERE id > 10");
+ primary_psql("VACUUM tail_tbl");
+
+ # Drop drop_tbl. pg_rewind should copy it back.
+ primary_psql(
+ "insert into drop_tbl values ('in primary, after promotion')");
+ primary_psql("DROP TABLE drop_tbl");
+
+ # Before running pg_rewind, do a couple of extra tests with several
+ # option combinations. As the code paths taken by those tests
+ # do not change for the "local" and "remote" modes, just run them
+ # in "local" mode for simplicity's sake.
+ if ($test_mode eq 'local')
+ {
+ my $primary_pgdata = $node_primary->data_dir;
+ my $standby_pgdata = $node_standby->data_dir;
+
+ # First check that pg_rewind fails if the target cluster is
+ # not stopped as it fails to start up for the forced recovery
+ # step.
+ command_fails(
+ [
+ 'pg_rewind', '--debug',
+ '--source-pgdata', $standby_pgdata,
+ '--target-pgdata', $primary_pgdata,
+ '--no-sync'
+ ],
+ 'pg_rewind with running target');
+
+ # Again with --no-ensure-shutdown, which should equally fail.
+ # This time pg_rewind complains without attempting to perform
+ # recovery once.
+ command_fails(
+ [
+ 'pg_rewind', '--debug',
+ '--source-pgdata', $standby_pgdata,
+ '--target-pgdata', $primary_pgdata,
+ '--no-sync', '--no-ensure-shutdown'
+ ],
+ 'pg_rewind --no-ensure-shutdown with running target');
+
+ # Stop the target, and attempt to run with a local source
+ # still running. This fails as pg_rewind requires to have
+ # a source cleanly stopped.
+ $node_primary->stop;
+ command_fails(
+ [
+ 'pg_rewind', '--debug',
+ '--source-pgdata', $standby_pgdata,
+ '--target-pgdata', $primary_pgdata,
+ '--no-sync', '--no-ensure-shutdown'
+ ],
+ 'pg_rewind with unexpected running source');
+
+ # Stop the target cluster cleanly, and run again pg_rewind
+ # with --dry-run mode. If anything gets generated in the data
+ # folder, the follow-up run of pg_rewind will most likely fail,
+ # so keep this test as the last one of this subset.
+ $node_standby->stop;
+ command_ok(
+ [
+ 'pg_rewind', '--debug',
+ '--source-pgdata', $standby_pgdata,
+ '--target-pgdata', $primary_pgdata,
+ '--no-sync', '--dry-run'
+ ],
+ 'pg_rewind --dry-run');
+
+ # Both clusters need to be alive moving forward.
+ $node_standby->start;
+ $node_primary->start;
+ }
+
+ RewindTest::run_pg_rewind($test_mode);
+
+ check_query(
+ 'SELECT * FROM tbl1',
+ qq(in primary
+in primary, before promotion
+in standby, after promotion
+),
+ 'table content');
+
+ check_query(
+ 'SELECT * FROM trunc_tbl',
+ qq(in primary
+in primary, before promotion
+),
+ 'truncation');
+
+ check_query(
+ 'SELECT count(*) FROM tail_tbl',
+ qq(10001
+),
+ 'tail-copy');
+
+ check_query(
+ 'SELECT * FROM drop_tbl',
+ qq(in primary
+),
+ 'drop');
+
+ # Permissions on PGDATA should be default
+ SKIP:
+ {
+ skip "unix-style permissions not supported on Windows", 1
+ if ($windows_os);
+
+ ok(check_mode_recursive($node_primary->data_dir(), 0700, 0600),
+ 'check PGDATA permissions');
+ }
+
+ RewindTest::clean_rewind_test();
+ return;
+}
+
+# Run the test in both modes
+run_test('local');
+run_test('remote');
+run_test('archive');
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/002_databases.pl b/src/bin/pg_rewind/t/002_databases.pl
new file mode 100644
index 0000000..8d6c0c0
--- /dev/null
+++ b/src/bin/pg_rewind/t/002_databases.pl
@@ -0,0 +1,77 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+use FindBin;
+use lib $FindBin::RealBin;
+
+use RewindTest;
+
+sub run_test
+{
+ my $test_mode = shift;
+
+ RewindTest::setup_cluster($test_mode, ['-g']);
+ RewindTest::start_primary();
+
+ # Create a database in primary with a table.
+ primary_psql('CREATE DATABASE inprimary');
+ primary_psql('CREATE TABLE inprimary_tab (a int)', 'inprimary');
+
+ RewindTest::create_standby($test_mode);
+
+ # Create another database with another table, the creation is
+ # replicated to the standby.
+ primary_psql('CREATE DATABASE beforepromotion');
+ primary_psql('CREATE TABLE beforepromotion_tab (a int)',
+ 'beforepromotion');
+
+ RewindTest::promote_standby();
+
+ # Create databases in the old primary and the new promoted standby.
+ primary_psql('CREATE DATABASE primary_afterpromotion');
+ primary_psql('CREATE TABLE primary_promotion_tab (a int)',
+ 'primary_afterpromotion');
+ standby_psql('CREATE DATABASE standby_afterpromotion');
+ standby_psql('CREATE TABLE standby_promotion_tab (a int)',
+ 'standby_afterpromotion');
+
+ # The clusters are now diverged.
+
+ RewindTest::run_pg_rewind($test_mode);
+
+ # Check that the correct databases are present after pg_rewind.
+ check_query(
+ 'SELECT datname FROM pg_database ORDER BY 1',
+ qq(beforepromotion
+inprimary
+postgres
+standby_afterpromotion
+template0
+template1
+),
+ 'database names');
+
+ # Permissions on PGDATA should have group permissions
+ SKIP:
+ {
+ skip "unix-style permissions not supported on Windows", 1
+ if ($windows_os);
+
+ ok(check_mode_recursive($node_primary->data_dir(), 0750, 0640),
+ 'check PGDATA permissions');
+ }
+
+ RewindTest::clean_rewind_test();
+ return;
+}
+
+# Run the test in both modes.
+run_test('local');
+run_test('remote');
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/003_extrafiles.pl b/src/bin/pg_rewind/t/003_extrafiles.pl
new file mode 100644
index 0000000..b1c47ea
--- /dev/null
+++ b/src/bin/pg_rewind/t/003_extrafiles.pl
@@ -0,0 +1,106 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+# Test how pg_rewind reacts to extra files and directories in the data dirs.
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+use File::Find;
+
+use FindBin;
+use lib $FindBin::RealBin;
+
+use RewindTest;
+
+
+sub run_test
+{
+ my $test_mode = shift;
+
+ RewindTest::setup_cluster($test_mode);
+ RewindTest::start_primary();
+
+ my $test_primary_datadir = $node_primary->data_dir;
+
+ # Create a subdir and files that will be present in both
+ mkdir "$test_primary_datadir/tst_both_dir";
+ append_to_file "$test_primary_datadir/tst_both_dir/both_file1",
+ "in both1";
+ append_to_file "$test_primary_datadir/tst_both_dir/both_file2",
+ "in both2";
+ mkdir "$test_primary_datadir/tst_both_dir/both_subdir/";
+ append_to_file
+ "$test_primary_datadir/tst_both_dir/both_subdir/both_file3",
+ "in both3";
+
+ RewindTest::create_standby($test_mode);
+
+ # Create different subdirs and files in primary and standby
+ my $test_standby_datadir = $node_standby->data_dir;
+
+ mkdir "$test_standby_datadir/tst_standby_dir";
+ append_to_file "$test_standby_datadir/tst_standby_dir/standby_file1",
+ "in standby1";
+ append_to_file "$test_standby_datadir/tst_standby_dir/standby_file2",
+ "in standby2";
+ append_to_file
+ "$test_standby_datadir/tst_standby_dir/standby_file3 with 'quotes'",
+ "in standby3";
+ mkdir "$test_standby_datadir/tst_standby_dir/standby_subdir/";
+ append_to_file
+ "$test_standby_datadir/tst_standby_dir/standby_subdir/standby_file4",
+ "in standby4";
+
+ mkdir "$test_primary_datadir/tst_primary_dir";
+ append_to_file "$test_primary_datadir/tst_primary_dir/primary_file1",
+ "in primary1";
+ append_to_file "$test_primary_datadir/tst_primary_dir/primary_file2",
+ "in primary2";
+ mkdir "$test_primary_datadir/tst_primary_dir/primary_subdir/";
+ append_to_file
+ "$test_primary_datadir/tst_primary_dir/primary_subdir/primary_file3",
+ "in primary3";
+
+ RewindTest::promote_standby();
+ RewindTest::run_pg_rewind($test_mode);
+
+ # List files in the data directory after rewind. All the files that
+ # were present in the standby should be present after rewind, and
+ # all the files that were added on the primary should be removed.
+ my @paths;
+ find(
+ sub {
+ push @paths, $File::Find::name
+ if $File::Find::name =~ m/.*tst_.*/;
+ },
+ $test_primary_datadir);
+ @paths = sort @paths;
+ is_deeply(
+ \@paths,
+ [
+ "$test_primary_datadir/tst_both_dir",
+ "$test_primary_datadir/tst_both_dir/both_file1",
+ "$test_primary_datadir/tst_both_dir/both_file2",
+ "$test_primary_datadir/tst_both_dir/both_subdir",
+ "$test_primary_datadir/tst_both_dir/both_subdir/both_file3",
+ "$test_primary_datadir/tst_standby_dir",
+ "$test_primary_datadir/tst_standby_dir/standby_file1",
+ "$test_primary_datadir/tst_standby_dir/standby_file2",
+ "$test_primary_datadir/tst_standby_dir/standby_file3 with 'quotes'",
+ "$test_primary_datadir/tst_standby_dir/standby_subdir",
+ "$test_primary_datadir/tst_standby_dir/standby_subdir/standby_file4"
+ ],
+ "file lists match");
+
+ RewindTest::clean_rewind_test();
+ return;
+}
+
+# Run the test in both modes.
+run_test('local');
+run_test('remote');
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/004_pg_xlog_symlink.pl b/src/bin/pg_rewind/t/004_pg_xlog_symlink.pl
new file mode 100644
index 0000000..5aafe58
--- /dev/null
+++ b/src/bin/pg_rewind/t/004_pg_xlog_symlink.pl
@@ -0,0 +1,80 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+#
+# Test pg_rewind when the target's pg_wal directory is a symlink.
+#
+use strict;
+use warnings;
+use File::Copy;
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+use FindBin;
+use lib $FindBin::RealBin;
+
+use RewindTest;
+
+sub run_test
+{
+ my $test_mode = shift;
+
+ my $primary_xlogdir =
+ "${PostgreSQL::Test::Utils::tmp_check}/xlog_primary";
+
+ rmtree($primary_xlogdir);
+ RewindTest::setup_cluster($test_mode);
+
+ my $test_primary_datadir = $node_primary->data_dir;
+
+ # turn pg_wal into a symlink
+ print("moving $test_primary_datadir/pg_wal to $primary_xlogdir\n");
+ move("$test_primary_datadir/pg_wal", $primary_xlogdir) or die;
+ dir_symlink($primary_xlogdir, "$test_primary_datadir/pg_wal") or die;
+
+ RewindTest::start_primary();
+
+ # Create a test table and insert a row in primary.
+ primary_psql("CREATE TABLE tbl1 (d text)");
+ primary_psql("INSERT INTO tbl1 VALUES ('in primary')");
+
+ primary_psql("CHECKPOINT");
+
+ RewindTest::create_standby($test_mode);
+
+ # Insert additional data on primary that will be replicated to standby
+ primary_psql("INSERT INTO tbl1 values ('in primary, before promotion')");
+
+ primary_psql('CHECKPOINT');
+
+ RewindTest::promote_standby();
+
+ # Insert a row in the old primary. This causes the primary and standby
+ # to have "diverged", it's no longer possible to just apply the
+ # standy's logs over primary directory - you need to rewind.
+ primary_psql("INSERT INTO tbl1 VALUES ('in primary, after promotion')");
+
+ # Also insert a new row in the standby, which won't be present in the
+ # old primary.
+ standby_psql("INSERT INTO tbl1 VALUES ('in standby, after promotion')");
+
+ RewindTest::run_pg_rewind($test_mode);
+
+ check_query(
+ 'SELECT * FROM tbl1',
+ qq(in primary
+in primary, before promotion
+in standby, after promotion
+),
+ 'table content');
+
+ RewindTest::clean_rewind_test();
+ return;
+}
+
+# Run the test in both modes
+run_test('local');
+run_test('remote');
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/005_same_timeline.pl b/src/bin/pg_rewind/t/005_same_timeline.pl
new file mode 100644
index 0000000..ffb62f9
--- /dev/null
+++ b/src/bin/pg_rewind/t/005_same_timeline.pl
@@ -0,0 +1,24 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+#
+# Test that running pg_rewind with the source and target clusters
+# on the same timeline runs successfully.
+#
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+use FindBin;
+use lib $FindBin::RealBin;
+
+use RewindTest;
+
+RewindTest::setup_cluster();
+RewindTest::start_primary();
+RewindTest::create_standby();
+RewindTest::run_pg_rewind('local');
+RewindTest::clean_rewind_test();
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/006_options.pl b/src/bin/pg_rewind/t/006_options.pl
new file mode 100644
index 0000000..c3c27e9
--- /dev/null
+++ b/src/bin/pg_rewind/t/006_options.pl
@@ -0,0 +1,45 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+#
+# Test checking options of pg_rewind.
+#
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_rewind');
+program_version_ok('pg_rewind');
+program_options_handling_ok('pg_rewind');
+
+my $primary_pgdata = PostgreSQL::Test::Utils::tempdir;
+my $standby_pgdata = PostgreSQL::Test::Utils::tempdir;
+command_fails(
+ [
+ 'pg_rewind', '--debug',
+ '--target-pgdata', $primary_pgdata,
+ '--source-pgdata', $standby_pgdata,
+ 'extra_arg1'
+ ],
+ 'too many arguments');
+command_fails([ 'pg_rewind', '--target-pgdata', $primary_pgdata ],
+ 'no source specified');
+command_fails(
+ [
+ 'pg_rewind', '--debug',
+ '--target-pgdata', $primary_pgdata,
+ '--source-pgdata', $standby_pgdata,
+ '--source-server', 'incorrect_source'
+ ],
+ 'both remote and local sources specified');
+command_fails(
+ [
+ 'pg_rewind', '--debug',
+ '--target-pgdata', $primary_pgdata,
+ '--source-pgdata', $standby_pgdata,
+ '--write-recovery-conf'
+ ],
+ 'no local source with --write-recovery-conf');
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/007_standby_source.pl b/src/bin/pg_rewind/t/007_standby_source.pl
new file mode 100644
index 0000000..f89a4df
--- /dev/null
+++ b/src/bin/pg_rewind/t/007_standby_source.pl
@@ -0,0 +1,179 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+#
+# Test using a standby server as the source.
+#
+# This sets up three nodes: A, B and C. First, A is the primary,
+# B follows A, and C follows B:
+#
+# A (primary) <--- B (standby) <--- C (standby)
+#
+#
+# Then we promote C, and insert some divergent rows in A and C:
+#
+# A (primary) <--- B (standby) C (primary)
+#
+#
+# Finally, we run pg_rewind on C, to re-point it at B again:
+#
+# A (primary) <--- B (standby) <--- C (standby)
+#
+#
+# The test is similar to the basic tests, but since we're dealing with
+# three nodes, not two, we cannot use most of the RewindTest functions
+# as is.
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+use FindBin;
+use lib $FindBin::RealBin;
+use File::Copy;
+use PostgreSQL::Test::Cluster;
+use RewindTest;
+
+my $tmp_folder = PostgreSQL::Test::Utils::tempdir;
+
+my $node_a;
+my $node_b;
+my $node_c;
+
+# Set up node A, as primary
+#
+# A (primary)
+
+setup_cluster('a');
+start_primary();
+$node_a = $node_primary;
+
+# Create a test table and insert a row in primary.
+$node_a->safe_psql('postgres', "CREATE TABLE tbl1 (d text)");
+$node_a->safe_psql('postgres', "INSERT INTO tbl1 VALUES ('in A')");
+primary_psql("CHECKPOINT");
+
+# Set up node B and C, as cascaded standbys
+#
+# A (primary) <--- B (standby) <--- C (standby)
+$node_a->backup('my_backup');
+$node_b = PostgreSQL::Test::Cluster->new('node_b');
+$node_b->init_from_backup($node_a, 'my_backup', has_streaming => 1);
+$node_b->set_standby_mode();
+$node_b->start;
+
+$node_b->backup('my_backup');
+$node_c = PostgreSQL::Test::Cluster->new('node_c');
+$node_c->init_from_backup($node_b, 'my_backup', has_streaming => 1);
+$node_c->set_standby_mode();
+$node_c->start;
+
+# Insert additional data on A, and wait for both standbys to catch up.
+$node_a->safe_psql('postgres',
+ "INSERT INTO tbl1 values ('in A, before promotion')");
+$node_a->safe_psql('postgres', 'CHECKPOINT');
+
+my $lsn = $node_a->lsn('write');
+$node_a->wait_for_catchup('node_b', 'write', $lsn);
+$node_b->wait_for_catchup('node_c', 'write', $lsn);
+
+# Promote C
+#
+# A (primary) <--- B (standby) C (primary)
+
+$node_c->promote;
+$node_c->safe_psql('postgres', "checkpoint");
+
+
+# Insert a row in A. This causes A/B and C to have "diverged", so that it's
+# no longer possible to just apply the standy's logs over primary directory
+# - you need to rewind.
+$node_a->safe_psql('postgres',
+ "INSERT INTO tbl1 VALUES ('in A, after C was promoted')");
+
+# make sure it's replicated to B before we continue
+$node_a->wait_for_catchup('node_b');
+
+# Also insert a new row in the standby, which won't be present in the
+# old primary.
+$node_c->safe_psql('postgres',
+ "INSERT INTO tbl1 VALUES ('in C, after C was promoted')");
+
+
+#
+# All set up. We're ready to run pg_rewind.
+#
+my $node_c_pgdata = $node_c->data_dir;
+
+# Stop the node and be ready to perform the rewind.
+$node_c->stop('fast');
+
+# Keep a temporary postgresql.conf or it would be overwritten during the rewind.
+copy(
+ "$node_c_pgdata/postgresql.conf",
+ "$tmp_folder/node_c-postgresql.conf.tmp");
+
+{
+ # Temporarily unset PGAPPNAME so that the server doesn't
+ # inherit it. Otherwise this could affect libpqwalreceiver
+ # connections in confusing ways.
+ local %ENV = %ENV;
+ delete $ENV{PGAPPNAME};
+
+ # Do rewind using a remote connection as source, generating
+ # recovery configuration automatically.
+ command_ok(
+ [
+ 'pg_rewind', "--debug",
+ "--source-server", $node_b->connstr('postgres'),
+ "--target-pgdata=$node_c_pgdata", "--no-sync",
+ "--write-recovery-conf"
+ ],
+ 'pg_rewind remote');
+}
+
+# Now move back postgresql.conf with old settings
+move(
+ "$tmp_folder/node_c-postgresql.conf.tmp",
+ "$node_c_pgdata/postgresql.conf");
+
+# Restart the node.
+$node_c->start;
+
+# set RewindTest::node_primary to point to the rewound node, so that we can
+# use check_query()
+$node_primary = $node_c;
+
+# Run some checks to verify that C has been successfully rewound,
+# and connected back to follow B.
+
+check_query(
+ 'SELECT * FROM tbl1',
+ qq(in A
+in A, before promotion
+in A, after C was promoted
+),
+ 'table content after rewind');
+
+# Insert another row, and observe that it's cascaded from A to B to C.
+$node_a->safe_psql('postgres',
+ "INSERT INTO tbl1 values ('in A, after rewind')");
+
+$node_b->wait_for_catchup('node_c', 'replay', $node_a->lsn('write'));
+
+check_query(
+ 'SELECT * FROM tbl1',
+ qq(in A
+in A, before promotion
+in A, after C was promoted
+in A, after rewind
+),
+ 'table content after rewind and insert');
+
+# clean up
+$node_a->teardown_node;
+$node_b->teardown_node;
+$node_c->teardown_node;
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/008_min_recovery_point.pl b/src/bin/pg_rewind/t/008_min_recovery_point.pl
new file mode 100644
index 0000000..e6a7177
--- /dev/null
+++ b/src/bin/pg_rewind/t/008_min_recovery_point.pl
@@ -0,0 +1,177 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+#
+# Test situation where a target data directory contains
+# WAL records beyond both the last checkpoint and the divergence
+# point:
+#
+# Target WAL (TLI 2):
+#
+# backup ... Checkpoint A ... INSERT 'rewind this'
+# (TLI 1 -> 2)
+#
+# ^ last common ^ minRecoveryPoint
+# checkpoint
+#
+# Source WAL (TLI 3):
+#
+# backup ... Checkpoint A ... Checkpoint B ... INSERT 'keep this'
+# (TLI 1 -> 2) (TLI 2 -> 3)
+#
+#
+# The last common checkpoint is Checkpoint A. But there is WAL on TLI 2
+# after the last common checkpoint that needs to be rewound. We used to
+# have a bug where minRecoveryPoint was ignored, and pg_rewind concluded
+# that the target doesn't need rewinding in this scenario, because the
+# last checkpoint on the target TLI was an ancestor of the source TLI.
+#
+#
+# This test does not make use of RewindTest as it requires three
+# nodes.
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+use File::Copy;
+
+my $tmp_folder = PostgreSQL::Test::Utils::tempdir;
+
+my $node_1 = PostgreSQL::Test::Cluster->new('node_1');
+$node_1->init(allows_streaming => 1);
+$node_1->append_conf(
+ 'postgresql.conf', qq(
+wal_keep_size='100 MB'
+));
+
+$node_1->start;
+
+# Create a couple of test tables
+$node_1->safe_psql('postgres', 'CREATE TABLE public.foo (t TEXT)');
+$node_1->safe_psql('postgres', 'CREATE TABLE public.bar (t TEXT)');
+$node_1->safe_psql('postgres', "INSERT INTO public.bar VALUES ('in both')");
+
+#
+# Create node_2 and node_3 as standbys following node_1
+#
+my $backup_name = 'my_backup';
+$node_1->backup($backup_name);
+
+my $node_2 = PostgreSQL::Test::Cluster->new('node_2');
+$node_2->init_from_backup($node_1, $backup_name, has_streaming => 1);
+$node_2->start;
+
+my $node_3 = PostgreSQL::Test::Cluster->new('node_3');
+$node_3->init_from_backup($node_1, $backup_name, has_streaming => 1);
+$node_3->start;
+
+# Wait until node 3 has connected and caught up
+$node_1->wait_for_catchup('node_3');
+
+#
+# Swap the roles of node_1 and node_3, so that node_1 follows node_3.
+#
+$node_1->stop('fast');
+$node_3->promote;
+# Force a checkpoint after the promotion. pg_rewind looks at the control
+# file to determine what timeline the server is on, and that isn't updated
+# immediately at promotion, but only at the next checkpoint. When running
+# pg_rewind in remote mode, it's possible that we complete the test steps
+# after promotion so quickly that when pg_rewind runs, the standby has not
+# performed a checkpoint after promotion yet.
+$node_3->safe_psql('postgres', "checkpoint");
+
+# reconfigure node_1 as a standby following node_3
+my $node_3_connstr = $node_3->connstr;
+$node_1->append_conf(
+ 'postgresql.conf', qq(
+primary_conninfo='$node_3_connstr'
+));
+$node_1->set_standby_mode();
+$node_1->start();
+
+# also reconfigure node_2 to follow node_3
+$node_2->append_conf(
+ 'postgresql.conf', qq(
+primary_conninfo='$node_3_connstr'
+));
+$node_2->restart();
+
+#
+# Promote node_1, to create a split-brain scenario.
+#
+
+# make sure node_1 is full caught up with node_3 first
+$node_3->wait_for_catchup('node_1');
+
+$node_1->promote;
+# Force a checkpoint after promotion, like earlier.
+$node_1->safe_psql('postgres', "checkpoint");
+
+#
+# We now have a split-brain with two primaries. Insert a row on both to
+# demonstratively create a split brain. After the rewind, we should only
+# see the insert on 1, as the insert on node 3 is rewound away.
+#
+$node_1->safe_psql('postgres',
+ "INSERT INTO public.foo (t) VALUES ('keep this')");
+# 'bar' is unmodified in node 1, so it won't be overwritten by replaying the
+# WAL from node 1.
+$node_3->safe_psql('postgres',
+ "INSERT INTO public.bar (t) VALUES ('rewind this')");
+
+# Insert more rows in node 1, to bump up the XID counter. Otherwise, if
+# rewind doesn't correctly rewind the changes made on the other node,
+# we might fail to notice if the inserts are invisible because the XIDs
+# are not marked as committed.
+$node_1->safe_psql('postgres',
+ "INSERT INTO public.foo (t) VALUES ('and this')");
+$node_1->safe_psql('postgres',
+ "INSERT INTO public.foo (t) VALUES ('and this too')");
+
+# Wait for node 2 to catch up
+$node_2->poll_query_until('postgres',
+ q|SELECT COUNT(*) > 1 FROM public.bar|, 't');
+
+# At this point node_2 will shut down without a shutdown checkpoint,
+# but with WAL entries beyond the preceding shutdown checkpoint.
+$node_2->stop('fast');
+$node_3->stop('fast');
+
+my $node_2_pgdata = $node_2->data_dir;
+my $node_1_connstr = $node_1->connstr;
+
+# Keep a temporary postgresql.conf or it would be overwritten during the rewind.
+copy(
+ "$node_2_pgdata/postgresql.conf",
+ "$tmp_folder/node_2-postgresql.conf.tmp");
+
+command_ok(
+ [
+ 'pg_rewind', "--source-server=$node_1_connstr",
+ "--target-pgdata=$node_2_pgdata", "--debug"
+ ],
+ 'run pg_rewind');
+
+# Now move back postgresql.conf with old settings
+move(
+ "$tmp_folder/node_2-postgresql.conf.tmp",
+ "$node_2_pgdata/postgresql.conf");
+
+$node_2->start;
+
+# Check contents of the test tables after rewind. The rows inserted in node 3
+# before rewind should've been overwritten with the data from node 1.
+my $result;
+$result = $node_2->safe_psql('postgres', 'SELECT * FROM public.foo');
+is( $result, qq(keep this
+and this
+and this too), 'table foo after rewind');
+
+$result = $node_2->safe_psql('postgres', 'SELECT * FROM public.bar');
+is($result, qq(in both), 'table bar after rewind');
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/009_growing_files.pl b/src/bin/pg_rewind/t/009_growing_files.pl
new file mode 100644
index 0000000..9422828
--- /dev/null
+++ b/src/bin/pg_rewind/t/009_growing_files.pl
@@ -0,0 +1,77 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+use FindBin;
+use lib $FindBin::RealBin;
+
+use RewindTest;
+
+RewindTest::setup_cluster("local");
+RewindTest::start_primary();
+
+# Create a test table and insert a row in primary.
+primary_psql("CREATE TABLE tbl1 (d text)");
+primary_psql("INSERT INTO tbl1 VALUES ('in primary')");
+primary_psql("CHECKPOINT");
+
+RewindTest::create_standby("local");
+
+# Insert additional data on primary that will be replicated to standby
+primary_psql("INSERT INTO tbl1 values ('in primary, before promotion')");
+primary_psql('CHECKPOINT');
+
+RewindTest::promote_standby();
+
+# Insert a row in the old primary. This causes the primary and standby to have
+# "diverged", it's no longer possible to just apply the standy's logs over
+# primary directory - you need to rewind. Also insert a new row in the
+# standby, which won't be present in the old primary.
+primary_psql("INSERT INTO tbl1 VALUES ('in primary, after promotion')");
+standby_psql("INSERT INTO tbl1 VALUES ('in standby, after promotion')");
+
+# Stop the nodes before running pg_rewind
+$node_standby->stop;
+$node_primary->stop;
+
+my $primary_pgdata = $node_primary->data_dir;
+my $standby_pgdata = $node_standby->data_dir;
+
+# Add an extra file that we can tamper with without interfering with the data
+# directory data files.
+mkdir "$standby_pgdata/tst_both_dir";
+append_to_file "$standby_pgdata/tst_both_dir/file1", 'a';
+
+# Run pg_rewind and pipe the output from the run into the extra file we want
+# to copy. This will ensure that the file is continuously growing during the
+# copy operation and the result will be an error.
+my $ret = run_log(
+ [
+ 'pg_rewind', '--debug',
+ '--source-pgdata', $standby_pgdata,
+ '--target-pgdata', $primary_pgdata,
+ '--no-sync',
+ ],
+ '2>>',
+ "$standby_pgdata/tst_both_dir/file1");
+ok(!$ret, 'Error out on copying growing file');
+
+# Ensure that the files are of different size, the final error message should
+# only be in one of them making them guaranteed to be different
+my $primary_size = -s "$primary_pgdata/tst_both_dir/file1";
+my $standby_size = -s "$standby_pgdata/tst_both_dir/file1";
+isnt($standby_size, $primary_size, "File sizes should differ");
+
+# Extract the last line from the verbose output as that should have the error
+# message for the unexpected file size
+my $last;
+open my $f, '<', "$standby_pgdata/tst_both_dir/file1";
+$last = $_ while (<$f>);
+close $f;
+like($last, qr/error: size of source file/, "Check error message");
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/RewindTest.pm b/src/bin/pg_rewind/t/RewindTest.pm
new file mode 100644
index 0000000..98b66b0
--- /dev/null
+++ b/src/bin/pg_rewind/t/RewindTest.pm
@@ -0,0 +1,393 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+package RewindTest;
+
+# Test driver for pg_rewind. Each test consists of a cycle where a new cluster
+# is first created with initdb, and a streaming replication standby is set up
+# to follow the primary. Then the primary is shut down and the standby is
+# promoted, and finally pg_rewind is used to rewind the old primary, using the
+# standby as the source.
+#
+# To run a test, the test script (in t/ subdirectory) calls the functions
+# in this module. These functions should be called in this sequence:
+#
+# 1. setup_cluster - creates a PostgreSQL cluster that runs as the primary
+#
+# 2. start_primary - starts the primary server
+#
+# 3. create_standby - runs pg_basebackup to initialize a standby server, and
+# sets it up to follow the primary.
+#
+# 4. promote_standby - runs "pg_ctl promote" to promote the standby server.
+# The old primary keeps running.
+#
+# 5. run_pg_rewind - stops the old primary (if it's still running) and runs
+# pg_rewind to synchronize it with the now-promoted standby server.
+#
+# 6. clean_rewind_test - stops both servers used in the test, if they're
+# still running.
+#
+# The test script can use the helper functions primary_psql and standby_psql
+# to run psql against the primary and standby servers, respectively.
+
+use strict;
+use warnings;
+
+use Carp;
+use Exporter 'import';
+use File::Copy;
+use File::Path qw(rmtree);
+use IPC::Run qw(run);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::RecursiveCopy;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+our @EXPORT = qw(
+ $node_primary
+ $node_standby
+
+ primary_psql
+ standby_psql
+ check_query
+
+ setup_cluster
+ start_primary
+ create_standby
+ promote_standby
+ run_pg_rewind
+ clean_rewind_test
+);
+
+# Our nodes.
+our $node_primary;
+our $node_standby;
+
+sub primary_psql
+{
+ my $cmd = shift;
+ my $dbname = shift || 'postgres';
+
+ system_or_bail 'psql', '-q', '--no-psqlrc', '-d',
+ $node_primary->connstr($dbname), '-c', "$cmd";
+ return;
+}
+
+sub standby_psql
+{
+ my $cmd = shift;
+ my $dbname = shift || 'postgres';
+
+ system_or_bail 'psql', '-q', '--no-psqlrc', '-d',
+ $node_standby->connstr($dbname), '-c', "$cmd";
+ return;
+}
+
+# Run a query against the primary, and check that the output matches what's
+# expected
+sub check_query
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($query, $expected_stdout, $test_name) = @_;
+ my ($stdout, $stderr);
+
+ # we want just the output, no formatting
+ my $result = run [
+ 'psql', '-q', '-A', '-t', '--no-psqlrc', '-d',
+ $node_primary->connstr('postgres'),
+ '-c', $query
+ ],
+ '>', \$stdout, '2>', \$stderr;
+
+ is($result, 1, "$test_name: psql exit code");
+ is($stderr, '', "$test_name: psql no stderr");
+ is($stdout, $expected_stdout, "$test_name: query result matches");
+
+ return;
+}
+
+sub setup_cluster
+{
+ my $extra_name = shift; # Used to differentiate clusters
+ my $extra = shift; # Extra params for initdb
+
+ # Initialize primary, data checksums are mandatory
+ $node_primary =
+ PostgreSQL::Test::Cluster->new(
+ 'primary' . ($extra_name ? "_${extra_name}" : ''));
+
+ # Set up pg_hba.conf and pg_ident.conf for the role running
+ # pg_rewind. This role is used for all the tests, and has
+ # minimal permissions enough to rewind from an online source.
+ $node_primary->init(
+ allows_streaming => 1,
+ extra => $extra,
+ auth_extra => [ '--create-role', 'rewind_user' ]);
+
+ # Set wal_keep_size to prevent WAL segment recycling after enforced
+ # checkpoints in the tests.
+ $node_primary->append_conf(
+ 'postgresql.conf', qq(
+wal_keep_size = 320MB
+));
+ return;
+}
+
+sub start_primary
+{
+ $node_primary->start;
+
+ # Create custom role which is used to run pg_rewind, and adjust its
+ # permissions to the minimum necessary.
+ $node_primary->safe_psql(
+ 'postgres', "
+ CREATE ROLE rewind_user LOGIN;
+ GRANT EXECUTE ON function pg_catalog.pg_ls_dir(text, boolean, boolean)
+ TO rewind_user;
+ GRANT EXECUTE ON function pg_catalog.pg_stat_file(text, boolean)
+ TO rewind_user;
+ GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text)
+ TO rewind_user;
+ GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text, bigint, bigint, boolean)
+ TO rewind_user;");
+
+ #### Now run the test-specific parts to initialize the primary before setting
+ # up standby
+
+ return;
+}
+
+sub create_standby
+{
+ my $extra_name = shift;
+
+ $node_standby =
+ PostgreSQL::Test::Cluster->new(
+ 'standby' . ($extra_name ? "_${extra_name}" : ''));
+ $node_primary->backup('my_backup');
+ $node_standby->init_from_backup($node_primary, 'my_backup');
+ my $connstr_primary = $node_primary->connstr();
+
+ $node_standby->append_conf(
+ "postgresql.conf", qq(
+primary_conninfo='$connstr_primary'
+));
+
+ $node_standby->set_standby_mode();
+
+ # Start standby
+ $node_standby->start;
+
+ # The standby may have WAL to apply before it matches the primary. That
+ # is fine, because no test examines the standby before promotion.
+
+ return;
+}
+
+sub promote_standby
+{
+ #### Now run the test-specific parts to run after standby has been started
+ # up standby
+
+ # Wait for the standby to receive and write all WAL.
+ $node_primary->wait_for_catchup($node_standby, 'write');
+
+ # Now promote standby and insert some new data on primary, this will put
+ # the primary out-of-sync with the standby.
+ $node_standby->promote;
+
+ # Force a checkpoint after the promotion. pg_rewind looks at the control
+ # file to determine what timeline the server is on, and that isn't updated
+ # immediately at promotion, but only at the next checkpoint. When running
+ # pg_rewind in remote mode, it's possible that we complete the test steps
+ # after promotion so quickly that when pg_rewind runs, the standby has not
+ # performed a checkpoint after promotion yet.
+ standby_psql("checkpoint");
+
+ return;
+}
+
+sub run_pg_rewind
+{
+ my $test_mode = shift;
+ my $primary_pgdata = $node_primary->data_dir;
+ my $standby_pgdata = $node_standby->data_dir;
+ my $standby_connstr = $node_standby->connstr('postgres');
+ my $tmp_folder = PostgreSQL::Test::Utils::tempdir;
+
+ # Append the rewind-specific role to the connection string.
+ $standby_connstr = "$standby_connstr user=rewind_user";
+
+ if ($test_mode eq 'archive')
+ {
+ # pg_rewind is tested with --restore-target-wal by moving all
+ # WAL files to a secondary location. Note that this leads to
+ # a failure in ensureCleanShutdown(), forcing to the use of
+ # --no-ensure-shutdown in this mode as the initial set of WAL
+ # files needed to ensure a clean restart is gone. This could
+ # be improved by keeping around only a minimum set of WAL
+ # segments but that would just make the test more costly,
+ # without improving the coverage. Hence, instead, stop
+ # gracefully the primary here.
+ $node_primary->stop;
+ }
+ else
+ {
+ # Stop the primary and be ready to perform the rewind. The cluster
+ # needs recovery to finish once, and pg_rewind makes sure that it
+ # happens automatically.
+ $node_primary->stop('immediate');
+ }
+
+ # At this point, the rewind processing is ready to run.
+ # We now have a very simple scenario with a few diverged WAL record.
+ # The real testing begins really now with a bifurcation of the possible
+ # scenarios that pg_rewind supports.
+
+ # Keep a temporary postgresql.conf for primary node or it would be
+ # overwritten during the rewind.
+ copy(
+ "$primary_pgdata/postgresql.conf",
+ "$tmp_folder/primary-postgresql.conf.tmp");
+
+ # Now run pg_rewind
+ if ($test_mode eq "local")
+ {
+
+ # Do rewind using a local pgdata as source
+ # Stop the primary and be ready to perform the rewind
+ $node_standby->stop;
+ command_ok(
+ [
+ 'pg_rewind',
+ "--debug",
+ "--source-pgdata=$standby_pgdata",
+ "--target-pgdata=$primary_pgdata",
+ "--no-sync",
+ "--config-file",
+ "$tmp_folder/primary-postgresql.conf.tmp"
+ ],
+ 'pg_rewind local');
+ }
+ elsif ($test_mode eq "remote")
+ {
+ # Do rewind using a remote connection as source, generating
+ # recovery configuration automatically.
+ command_ok(
+ [
+ 'pg_rewind', "--debug",
+ "--source-server", $standby_connstr,
+ "--target-pgdata=$primary_pgdata", "--no-sync",
+ "--write-recovery-conf", "--config-file",
+ "$tmp_folder/primary-postgresql.conf.tmp"
+ ],
+ 'pg_rewind remote');
+
+ # Check that standby.signal is here as recovery configuration
+ # was requested.
+ ok( -e "$primary_pgdata/standby.signal",
+ 'standby.signal created after pg_rewind');
+
+ # Now, when pg_rewind apparently succeeded with minimal permissions,
+ # add REPLICATION privilege. So we could test that new standby
+ # is able to connect to the new primary with generated config.
+ $node_standby->safe_psql('postgres',
+ "ALTER ROLE rewind_user WITH REPLICATION;");
+ }
+ elsif ($test_mode eq "archive")
+ {
+
+ # Do rewind using a local pgdata as source and specified
+ # directory with target WAL archive. The old primary has
+ # to be stopped at this point.
+
+ # Remove the existing archive directory and move all WAL
+ # segments from the old primary to the archives. These
+ # will be used by pg_rewind.
+ rmtree($node_primary->archive_dir);
+ PostgreSQL::Test::RecursiveCopy::copypath(
+ $node_primary->data_dir . "/pg_wal",
+ $node_primary->archive_dir);
+
+ # Fast way to remove entire directory content
+ rmtree($node_primary->data_dir . "/pg_wal");
+ mkdir($node_primary->data_dir . "/pg_wal");
+
+ # Make sure that directories have the right umask as this is
+ # required by a follow-up check on permissions, and better
+ # safe than sorry.
+ chmod(0700, $node_primary->archive_dir);
+ chmod(0700, $node_primary->data_dir . "/pg_wal");
+
+ # Add appropriate restore_command to the target cluster
+ $node_primary->enable_restoring($node_primary, 0);
+
+ # Stop the new primary and be ready to perform the rewind.
+ $node_standby->stop;
+
+ # Note the use of --no-ensure-shutdown here. WAL files are
+ # gone in this mode and the primary has been stopped
+ # gracefully already. --config-file reuses the original
+ # postgresql.conf as restore_command has been enabled above.
+ command_ok(
+ [
+ 'pg_rewind',
+ "--debug",
+ "--source-pgdata=$standby_pgdata",
+ "--target-pgdata=$primary_pgdata",
+ "--no-sync",
+ "--no-ensure-shutdown",
+ "--restore-target-wal",
+ "--config-file",
+ "$primary_pgdata/postgresql.conf"
+ ],
+ 'pg_rewind archive');
+ }
+ else
+ {
+
+ # Cannot come here normally
+ croak("Incorrect test mode specified");
+ }
+
+ # Now move back postgresql.conf with old settings
+ move(
+ "$tmp_folder/primary-postgresql.conf.tmp",
+ "$primary_pgdata/postgresql.conf");
+
+ chmod(
+ $node_primary->group_access() ? 0640 : 0600,
+ "$primary_pgdata/postgresql.conf")
+ or BAIL_OUT(
+ "unable to set permissions for $primary_pgdata/postgresql.conf");
+
+ # Plug-in rewound node to the now-promoted standby node
+ if ($test_mode ne "remote")
+ {
+ my $port_standby = $node_standby->port;
+ $node_primary->append_conf(
+ 'postgresql.conf', qq(
+primary_conninfo='port=$port_standby'));
+
+ $node_primary->set_standby_mode();
+ }
+
+ # Restart the primary to check that rewind went correctly
+ $node_primary->start;
+
+ #### Now run the test-specific parts to check the result
+
+ return;
+}
+
+# Clean up after the test. Stop both servers, if they're still running.
+sub clean_rewind_test
+{
+ $node_primary->teardown_node if defined $node_primary;
+ $node_standby->teardown_node if defined $node_standby;
+ return;
+}
+
+1;
diff --git a/src/bin/pg_rewind/timeline.c b/src/bin/pg_rewind/timeline.c
new file mode 100644
index 0000000..983388c
--- /dev/null
+++ b/src/bin/pg_rewind/timeline.c
@@ -0,0 +1,130 @@
+/*-------------------------------------------------------------------------
+ *
+ * timeline.c
+ * timeline-related functions.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "access/timeline.h"
+#include "access/xlog_internal.h"
+#include "pg_rewind.h"
+
+/*
+ * This is copy-pasted from the backend readTimeLineHistory, modified to
+ * return a malloc'd array and to work without backend functions.
+ */
+/*
+ * Try to read a timeline's history file.
+ *
+ * If successful, return the list of component TLIs (the given TLI followed by
+ * its ancestor TLIs). If we can't find the history file, assume that the
+ * timeline has no parents, and return a list of just the specified timeline
+ * ID.
+ */
+TimeLineHistoryEntry *
+rewind_parseTimeLineHistory(char *buffer, TimeLineID targetTLI, int *nentries)
+{
+ char *fline;
+ TimeLineHistoryEntry *entry;
+ TimeLineHistoryEntry *entries = NULL;
+ int nlines = 0;
+ TimeLineID lasttli = 0;
+ XLogRecPtr prevend;
+ char *bufptr;
+ bool lastline = false;
+
+ /*
+ * Parse the file...
+ */
+ prevend = InvalidXLogRecPtr;
+ bufptr = buffer;
+ while (!lastline)
+ {
+ char *ptr;
+ TimeLineID tli;
+ uint32 switchpoint_hi;
+ uint32 switchpoint_lo;
+ int nfields;
+
+ fline = bufptr;
+ while (*bufptr && *bufptr != '\n')
+ bufptr++;
+ if (!(*bufptr))
+ lastline = true;
+ else
+ *bufptr++ = '\0';
+
+ /* skip leading whitespace and check for # comment */
+ for (ptr = fline; *ptr; ptr++)
+ {
+ if (!isspace((unsigned char) *ptr))
+ break;
+ }
+ if (*ptr == '\0' || *ptr == '#')
+ continue;
+
+ nfields = sscanf(fline, "%u\t%X/%X", &tli, &switchpoint_hi, &switchpoint_lo);
+
+ if (nfields < 1)
+ {
+ /* expect a numeric timeline ID as first field of line */
+ pg_log_error("syntax error in history file: %s", fline);
+ pg_log_error_detail("Expected a numeric timeline ID.");
+ exit(1);
+ }
+ if (nfields != 3)
+ {
+ pg_log_error("syntax error in history file: %s", fline);
+ pg_log_error_detail("Expected a write-ahead log switchpoint location.");
+ exit(1);
+ }
+ if (entries && tli <= lasttli)
+ {
+ pg_log_error("invalid data in history file: %s", fline);
+ pg_log_error_detail("Timeline IDs must be in increasing sequence.");
+ exit(1);
+ }
+
+ lasttli = tli;
+
+ nlines++;
+ entries = pg_realloc(entries, nlines * sizeof(TimeLineHistoryEntry));
+
+ entry = &entries[nlines - 1];
+ entry->tli = tli;
+ entry->begin = prevend;
+ entry->end = ((uint64) (switchpoint_hi)) << 32 | (uint64) switchpoint_lo;
+ prevend = entry->end;
+
+ /* we ignore the remainder of each line */
+ }
+
+ if (entries && targetTLI <= lasttli)
+ {
+ pg_log_error("invalid data in history file");
+ pg_log_error_detail("Timeline IDs must be less than child timeline's ID.");
+ exit(1);
+ }
+
+ /*
+ * Create one more entry for the "tip" of the timeline, which has no entry
+ * in the history file.
+ */
+ nlines++;
+ if (entries)
+ entries = pg_realloc(entries, nlines * sizeof(TimeLineHistoryEntry));
+ else
+ entries = pg_malloc(1 * sizeof(TimeLineHistoryEntry));
+
+ entry = &entries[nlines - 1];
+ entry->tli = targetTLI;
+ entry->begin = prevend;
+ entry->end = InvalidXLogRecPtr;
+
+ *nentries = nlines;
+ return entries;
+}
diff --git a/src/bin/pg_test_fsync/.gitignore b/src/bin/pg_test_fsync/.gitignore
new file mode 100644
index 0000000..5eb5085
--- /dev/null
+++ b/src/bin/pg_test_fsync/.gitignore
@@ -0,0 +1,3 @@
+/pg_test_fsync
+
+/tmp_check/
diff --git a/src/bin/pg_test_fsync/Makefile b/src/bin/pg_test_fsync/Makefile
new file mode 100644
index 0000000..631d0f3
--- /dev/null
+++ b/src/bin/pg_test_fsync/Makefile
@@ -0,0 +1,36 @@
+# src/bin/pg_test_fsync/Makefile
+
+PGFILEDESC = "pg_test_fsync - test various disk sync methods"
+PGAPPICON = win32
+
+subdir = src/bin/pg_test_fsync
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ pg_test_fsync.o
+
+all: pg_test_fsync
+
+pg_test_fsync: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_test_fsync$(X) '$(DESTDIR)$(bindir)/pg_test_fsync$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_test_fsync$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_test_fsync$(X) $(OBJS)
+ rm -rf tmp_check
diff --git a/src/bin/pg_test_fsync/nls.mk b/src/bin/pg_test_fsync/nls.mk
new file mode 100644
index 0000000..0062983
--- /dev/null
+++ b/src/bin/pg_test_fsync/nls.mk
@@ -0,0 +1,6 @@
+# src/bin/pg_test_fsync/nls.mk
+CATALOG_NAME = pg_test_fsync
+AVAIL_LANGUAGES = de el es fr it ja ka ko pt_BR ru sv uk
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_test_fsync.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) die
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/pg_test_fsync/pg_test_fsync.c b/src/bin/pg_test_fsync/pg_test_fsync.c
new file mode 100644
index 0000000..f7bc199
--- /dev/null
+++ b/src/bin/pg_test_fsync/pg_test_fsync.c
@@ -0,0 +1,652 @@
+/*
+ * pg_test_fsync.c
+ * tests all supported fsync() methods
+ */
+
+#include "postgres_fe.h"
+
+#include <limits.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <fcntl.h>
+#include <time.h>
+#include <unistd.h>
+#include <signal.h>
+
+#include "access/xlogdefs.h"
+#include "common/logging.h"
+#include "common/pg_prng.h"
+#include "getopt_long.h"
+
+/*
+ * put the temp files in the local directory
+ * unless the user specifies otherwise
+ */
+#define FSYNC_FILENAME "./pg_test_fsync.out"
+
+#define XLOG_BLCKSZ_K (XLOG_BLCKSZ / 1024)
+
+#define LABEL_FORMAT " %-30s"
+#define NA_FORMAT "%21s\n"
+/* translator: maintain alignment with NA_FORMAT */
+#define OPS_FORMAT gettext_noop("%13.3f ops/sec %6.0f usecs/op\n")
+#define USECS_SEC 1000000
+
+/* These are macros to avoid timing the function call overhead. */
+#ifndef WIN32
+#define START_TIMER \
+do { \
+ alarm_triggered = false; \
+ alarm(secs_per_test); \
+ gettimeofday(&start_t, NULL); \
+} while (0)
+#else
+/* WIN32 doesn't support alarm, so we create a thread and sleep there */
+#define START_TIMER \
+do { \
+ alarm_triggered = false; \
+ if (CreateThread(NULL, 0, process_alarm, NULL, 0, NULL) == \
+ INVALID_HANDLE_VALUE) \
+ pg_fatal("could not create thread for alarm"); \
+ gettimeofday(&start_t, NULL); \
+} while (0)
+#endif
+
+#define STOP_TIMER \
+do { \
+ gettimeofday(&stop_t, NULL); \
+ print_elapse(start_t, stop_t, ops); \
+} while (0)
+
+
+static const char *progname;
+
+static unsigned int secs_per_test = 5;
+static int needs_unlink = 0;
+static char full_buf[DEFAULT_XLOG_SEG_SIZE],
+ *buf,
+ *filename = FSYNC_FILENAME;
+static struct timeval start_t,
+ stop_t;
+static bool alarm_triggered = false;
+
+
+static void handle_args(int argc, char *argv[]);
+static void prepare_buf(void);
+static void test_open(void);
+static void test_non_sync(void);
+static void test_sync(int writes_per_op);
+static void test_open_syncs(void);
+static void test_open_sync(const char *msg, int writes_size);
+static void test_file_descriptor_sync(void);
+
+#ifndef WIN32
+static void process_alarm(int sig);
+#else
+static DWORD WINAPI process_alarm(LPVOID param);
+#endif
+static void signal_cleanup(int sig);
+
+#ifdef HAVE_FSYNC_WRITETHROUGH
+static int pg_fsync_writethrough(int fd);
+#endif
+static void print_elapse(struct timeval start_t, struct timeval stop_t, int ops);
+
+#define die(msg) pg_fatal("%s: %m", _(msg))
+
+
+int
+main(int argc, char *argv[])
+{
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_test_fsync"));
+ progname = get_progname(argv[0]);
+
+ handle_args(argc, argv);
+
+ /* Prevent leaving behind the test file */
+ pqsignal(SIGINT, signal_cleanup);
+ pqsignal(SIGTERM, signal_cleanup);
+#ifndef WIN32
+ pqsignal(SIGALRM, process_alarm);
+#endif
+#ifdef SIGHUP
+ /* Not defined on win32 */
+ pqsignal(SIGHUP, signal_cleanup);
+#endif
+
+ pg_prng_seed(&pg_global_prng_state, (uint64) time(NULL));
+
+ prepare_buf();
+
+ test_open();
+
+ /* Test using 1 XLOG_BLCKSZ write */
+ test_sync(1);
+
+ /* Test using 2 XLOG_BLCKSZ writes */
+ test_sync(2);
+
+ test_open_syncs();
+
+ test_file_descriptor_sync();
+
+ test_non_sync();
+
+ unlink(filename);
+
+ return 0;
+}
+
+static void
+handle_args(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"filename", required_argument, NULL, 'f'},
+ {"secs-per-test", required_argument, NULL, 's'},
+ {NULL, 0, NULL, 0}
+ };
+
+ int option; /* Command line option */
+ int optindex = 0; /* used by getopt_long */
+ unsigned long optval; /* used for option parsing */
+ char *endptr;
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ printf(_("Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"), progname);
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_test_fsync (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((option = getopt_long(argc, argv, "f:s:",
+ long_options, &optindex)) != -1)
+ {
+ switch (option)
+ {
+ case 'f':
+ filename = pg_strdup(optarg);
+ break;
+
+ case 's':
+ errno = 0;
+ optval = strtoul(optarg, &endptr, 10);
+
+ if (endptr == optarg || *endptr != '\0' ||
+ errno != 0 || optval != (unsigned int) optval)
+ {
+ pg_log_error("invalid argument for option %s", "--secs-per-test");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ secs_per_test = (unsigned int) optval;
+ if (secs_per_test == 0)
+ pg_fatal("%s must be in range %u..%u",
+ "--secs-per-test", 1, UINT_MAX);
+ break;
+
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ if (argc > optind)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ printf(ngettext("%u second per test\n",
+ "%u seconds per test\n",
+ secs_per_test),
+ secs_per_test);
+#if defined(O_DIRECT)
+ printf(_("O_DIRECT supported on this platform for open_datasync and open_sync.\n"));
+#elif defined(F_NOCACHE)
+ printf(_("F_NOCACHE supported on this platform for open_datasync and open_sync.\n"));
+#else
+ printf(_("Direct I/O is not supported on this platform.\n"));
+#endif
+}
+
+static void
+prepare_buf(void)
+{
+ int ops;
+
+ /* write random data into buffer */
+ for (ops = 0; ops < DEFAULT_XLOG_SEG_SIZE; ops++)
+ full_buf[ops] = (char) pg_prng_int32(&pg_global_prng_state);
+
+ buf = (char *) TYPEALIGN(XLOG_BLCKSZ, full_buf);
+}
+
+static void
+test_open(void)
+{
+ int tmpfile;
+
+ /*
+ * test if we can open the target file
+ */
+ if ((tmpfile = open(filename, O_RDWR | O_CREAT | PG_BINARY, S_IRUSR | S_IWUSR)) == -1)
+ die("could not open output file");
+ needs_unlink = 1;
+ if (write(tmpfile, full_buf, DEFAULT_XLOG_SEG_SIZE) !=
+ DEFAULT_XLOG_SEG_SIZE)
+ die("write failed");
+
+ /* fsync now so that dirty buffers don't skew later tests */
+ if (fsync(tmpfile) != 0)
+ die("fsync failed");
+
+ close(tmpfile);
+}
+
+static int
+open_direct(const char *path, int flags, mode_t mode)
+{
+ int fd;
+
+#ifdef O_DIRECT
+ flags |= O_DIRECT;
+#endif
+
+ fd = open(path, flags, mode);
+
+#if !defined(O_DIRECT) && defined(F_NOCACHE)
+ if (fd >= 0 && fcntl(fd, F_NOCACHE, 1) < 0)
+ {
+ int save_errno = errno;
+
+ close(fd);
+ errno = save_errno;
+ return -1;
+ }
+#endif
+
+ return fd;
+}
+
+static void
+test_sync(int writes_per_op)
+{
+ int tmpfile,
+ ops,
+ writes;
+ bool fs_warning = false;
+
+ if (writes_per_op == 1)
+ printf(_("\nCompare file sync methods using one %dkB write:\n"), XLOG_BLCKSZ_K);
+ else
+ printf(_("\nCompare file sync methods using two %dkB writes:\n"), XLOG_BLCKSZ_K);
+ printf(_("(in wal_sync_method preference order, except fdatasync is Linux's default)\n"));
+
+ /*
+ * Test open_datasync if available
+ */
+ printf(LABEL_FORMAT, "open_datasync");
+ fflush(stdout);
+
+#ifdef OPEN_DATASYNC_FLAG
+ if ((tmpfile = open_direct(filename, O_RDWR | O_DSYNC | PG_BINARY, 0)) == -1)
+ {
+ printf(NA_FORMAT, _("n/a*"));
+ fs_warning = true;
+ }
+ else
+ {
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ for (writes = 0; writes < writes_per_op; writes++)
+ if (pg_pwrite(tmpfile,
+ buf,
+ XLOG_BLCKSZ,
+ writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ die("write failed");
+ }
+ STOP_TIMER;
+ close(tmpfile);
+ }
+#else
+ printf(NA_FORMAT, _("n/a"));
+#endif
+
+/*
+ * Test fdatasync if available
+ */
+ printf(LABEL_FORMAT, "fdatasync");
+ fflush(stdout);
+
+#ifdef HAVE_FDATASYNC
+ if ((tmpfile = open(filename, O_RDWR | PG_BINARY, 0)) == -1)
+ die("could not open output file");
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ for (writes = 0; writes < writes_per_op; writes++)
+ if (pg_pwrite(tmpfile,
+ buf,
+ XLOG_BLCKSZ,
+ writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ die("write failed");
+ fdatasync(tmpfile);
+ }
+ STOP_TIMER;
+ close(tmpfile);
+#else
+ printf(NA_FORMAT, _("n/a"));
+#endif
+
+/*
+ * Test fsync
+ */
+ printf(LABEL_FORMAT, "fsync");
+ fflush(stdout);
+
+ if ((tmpfile = open(filename, O_RDWR | PG_BINARY, 0)) == -1)
+ die("could not open output file");
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ for (writes = 0; writes < writes_per_op; writes++)
+ if (pg_pwrite(tmpfile,
+ buf,
+ XLOG_BLCKSZ,
+ writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ die("write failed");
+ if (fsync(tmpfile) != 0)
+ die("fsync failed");
+ }
+ STOP_TIMER;
+ close(tmpfile);
+
+/*
+ * If fsync_writethrough is available, test as well
+ */
+ printf(LABEL_FORMAT, "fsync_writethrough");
+ fflush(stdout);
+
+#ifdef HAVE_FSYNC_WRITETHROUGH
+ if ((tmpfile = open(filename, O_RDWR | PG_BINARY, 0)) == -1)
+ die("could not open output file");
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ for (writes = 0; writes < writes_per_op; writes++)
+ if (pg_pwrite(tmpfile,
+ buf,
+ XLOG_BLCKSZ,
+ writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ die("write failed");
+ if (pg_fsync_writethrough(tmpfile) != 0)
+ die("fsync failed");
+ }
+ STOP_TIMER;
+ close(tmpfile);
+#else
+ printf(NA_FORMAT, _("n/a"));
+#endif
+
+/*
+ * Test open_sync if available
+ */
+ printf(LABEL_FORMAT, "open_sync");
+ fflush(stdout);
+
+#ifdef OPEN_SYNC_FLAG
+ if ((tmpfile = open_direct(filename, O_RDWR | OPEN_SYNC_FLAG | PG_BINARY, 0)) == -1)
+ {
+ printf(NA_FORMAT, _("n/a*"));
+ fs_warning = true;
+ }
+ else
+ {
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ for (writes = 0; writes < writes_per_op; writes++)
+ if (pg_pwrite(tmpfile,
+ buf,
+ XLOG_BLCKSZ,
+ writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
+
+ /*
+ * This can generate write failures if the filesystem has
+ * a large block size, e.g. 4k, and there is no support
+ * for O_DIRECT writes smaller than the file system block
+ * size, e.g. XFS.
+ */
+ die("write failed");
+ }
+ STOP_TIMER;
+ close(tmpfile);
+ }
+#else
+ printf(NA_FORMAT, _("n/a"));
+#endif
+
+ if (fs_warning)
+ {
+ printf(_("* This file system and its mount options do not support direct\n"
+ " I/O, e.g. ext4 in journaled mode.\n"));
+ }
+}
+
+static void
+test_open_syncs(void)
+{
+ printf(_("\nCompare open_sync with different write sizes:\n"));
+ printf(_("(This is designed to compare the cost of writing 16kB in different write\n"
+ "open_sync sizes.)\n"));
+
+ test_open_sync(_(" 1 * 16kB open_sync write"), 16);
+ test_open_sync(_(" 2 * 8kB open_sync writes"), 8);
+ test_open_sync(_(" 4 * 4kB open_sync writes"), 4);
+ test_open_sync(_(" 8 * 2kB open_sync writes"), 2);
+ test_open_sync(_("16 * 1kB open_sync writes"), 1);
+}
+
+/*
+ * Test open_sync with different size files
+ */
+static void
+test_open_sync(const char *msg, int writes_size)
+{
+#ifdef OPEN_SYNC_FLAG
+ int tmpfile,
+ ops,
+ writes;
+#endif
+
+ printf(LABEL_FORMAT, msg);
+ fflush(stdout);
+
+#ifdef OPEN_SYNC_FLAG
+ if ((tmpfile = open_direct(filename, O_RDWR | OPEN_SYNC_FLAG | PG_BINARY, 0)) == -1)
+ printf(NA_FORMAT, _("n/a*"));
+ else
+ {
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ for (writes = 0; writes < 16 / writes_size; writes++)
+ if (pg_pwrite(tmpfile,
+ buf,
+ writes_size * 1024,
+ writes * writes_size * 1024) !=
+ writes_size * 1024)
+ die("write failed");
+ }
+ STOP_TIMER;
+ close(tmpfile);
+ }
+#else
+ printf(NA_FORMAT, _("n/a"));
+#endif
+}
+
+static void
+test_file_descriptor_sync(void)
+{
+ int tmpfile,
+ ops;
+
+ /*
+ * Test whether fsync can sync data written on a different descriptor for
+ * the same file. This checks the efficiency of multi-process fsyncs
+ * against the same file. Possibly this should be done with writethrough
+ * on platforms which support it.
+ */
+ printf(_("\nTest if fsync on non-write file descriptor is honored:\n"));
+ printf(_("(If the times are similar, fsync() can sync data written on a different\n"
+ "descriptor.)\n"));
+
+ /*
+ * first write, fsync and close, which is the normal behavior without
+ * multiple descriptors
+ */
+ printf(LABEL_FORMAT, "write, fsync, close");
+ fflush(stdout);
+
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ if ((tmpfile = open(filename, O_RDWR | PG_BINARY, 0)) == -1)
+ die("could not open output file");
+ if (write(tmpfile, buf, XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ die("write failed");
+ if (fsync(tmpfile) != 0)
+ die("fsync failed");
+ close(tmpfile);
+
+ /*
+ * open and close the file again to be consistent with the following
+ * test
+ */
+ if ((tmpfile = open(filename, O_RDWR | PG_BINARY, 0)) == -1)
+ die("could not open output file");
+ close(tmpfile);
+ }
+ STOP_TIMER;
+
+ /*
+ * Now open, write, close, open again and fsync This simulates processes
+ * fsyncing each other's writes.
+ */
+ printf(LABEL_FORMAT, "write, close, fsync");
+ fflush(stdout);
+
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ if ((tmpfile = open(filename, O_RDWR | PG_BINARY, 0)) == -1)
+ die("could not open output file");
+ if (write(tmpfile, buf, XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ die("write failed");
+ close(tmpfile);
+ /* reopen file */
+ if ((tmpfile = open(filename, O_RDWR | PG_BINARY, 0)) == -1)
+ die("could not open output file");
+ if (fsync(tmpfile) != 0)
+ die("fsync failed");
+ close(tmpfile);
+ }
+ STOP_TIMER;
+}
+
+static void
+test_non_sync(void)
+{
+ int tmpfile,
+ ops;
+
+ /*
+ * Test a simple write without fsync
+ */
+ printf(_("\nNon-sync'ed %dkB writes:\n"), XLOG_BLCKSZ_K);
+ printf(LABEL_FORMAT, "write");
+ fflush(stdout);
+
+ if ((tmpfile = open(filename, O_RDWR | PG_BINARY, 0)) == -1)
+ die("could not open output file");
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ if (pg_pwrite(tmpfile, buf, XLOG_BLCKSZ, 0) != XLOG_BLCKSZ)
+ die("write failed");
+ }
+ STOP_TIMER;
+ close(tmpfile);
+}
+
+static void
+signal_cleanup(int signum)
+{
+ /* Delete the file if it exists. Ignore errors */
+ if (needs_unlink)
+ unlink(filename);
+ /* Finish incomplete line on stdout */
+ puts("");
+ exit(signum);
+}
+
+#ifdef HAVE_FSYNC_WRITETHROUGH
+
+static int
+pg_fsync_writethrough(int fd)
+{
+#ifdef WIN32
+ return _commit(fd);
+#elif defined(F_FULLFSYNC)
+ return (fcntl(fd, F_FULLFSYNC, 0) == -1) ? -1 : 0;
+#else
+ errno = ENOSYS;
+ return -1;
+#endif
+}
+#endif
+
+/*
+ * print out the writes per second for tests
+ */
+static void
+print_elapse(struct timeval start_t, struct timeval stop_t, int ops)
+{
+ double total_time = (stop_t.tv_sec - start_t.tv_sec) +
+ (stop_t.tv_usec - start_t.tv_usec) * 0.000001;
+ double per_second = ops / total_time;
+ double avg_op_time_us = (total_time / ops) * USECS_SEC;
+
+ printf(_(OPS_FORMAT), per_second, avg_op_time_us);
+}
+
+#ifndef WIN32
+static void
+process_alarm(int sig)
+{
+ alarm_triggered = true;
+}
+#else
+static DWORD WINAPI
+process_alarm(LPVOID param)
+{
+ /* WIN32 doesn't support alarm, so we create a thread and sleep here */
+ Sleep(secs_per_test * 1000);
+ alarm_triggered = true;
+ ExitThread(0);
+}
+#endif
diff --git a/src/bin/pg_test_fsync/po/de.po b/src/bin/pg_test_fsync/po/de.po
new file mode 100644
index 0000000..906080e
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/de.po
@@ -0,0 +1,224 @@
+# German message translation file for pg_test_fsync
+# Copyright (C) 2017-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-11 15:51+0000\n"
+"PO-Revision-Date: 2022-05-11 22:41+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr " %13.3f Op./s %6.0f µs/Op.\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "konnte Thread für Alarm nicht erzeugen"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Aufruf: %s [-f DATEINAME] [-s SEK-PRO-TEST]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "ungültiges Argument für Option %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s muss im Bereich %u..%u sein"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u Sekunde pro Test\n"
+msgstr[1] "%u Sekunden pro Test\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT wird auf dieser Plattform für open_datasync und open_sync unterstützt.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "F_NOCACHE wird auf dieser Plattform für open_datasync und open_sync unterstützt.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "Direct-I/O wird auf dieser Plattform nicht unterstützt.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "konnte Ausgabedatei nicht öffnen"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "Schreiben fehlgeschlagen"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "fsync fehlgeschlagen"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Vergleich von Datei-Sync-Methoden bei einem Schreibvorgang aus %dkB:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Vergleich von Datei-Sync-Methoden bei zwei Schreibvorgängen aus je %dkB:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(in Rangordnung von wal_sync_method, außer dass fdatasync auf Linux Standard ist)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "entf.*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "entf."
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Dieses Dateisystem und die Mount-Optionen unterstützen kein Direct-I/O,\n"
+" z.B. ext4 im Journaled-Modus.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Vergleich von open_sync mit verschiedenen Schreibgrößen:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Damit werden die Kosten für das Schreiben von 16kB in verschieden Größen mit\n"
+"open_sync verglichen.)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB open_sync schreiben"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB open_sync schreiben"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB open_sync schreiben"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB open_sync schreiben"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB open_sync schreiben"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Probe ob fsync auf einem anderen Dateideskriptor funktioniert:\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Wenn die Zeiten ähnlich sind, dann kann fsync() auf einem anderen Deskriptor\n"
+"geschriebene Daten syncen.)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"Nicht gesynctes Schreiben von %dkB:\n"
diff --git a/src/bin/pg_test_fsync/po/el.po b/src/bin/pg_test_fsync/po/el.po
new file mode 100644
index 0000000..4cd3771
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/el.po
@@ -0,0 +1,228 @@
+# Greek message translation file for pg_test_fsync
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-14 09:21+0000\n"
+"PO-Revision-Date: 2023-04-14 14:41+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "προειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέρεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ops/sec %6.0f usecs/op\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "δεν ήταν δυνατή η δημιουργία νήματος για ειδοποίηση"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Χρήση: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "μη έγκυρη παράμετρος για την επιλογή %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s πρέπει να βρίσκεται εντός εύρους %u..%u"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u δευτερόλεπτο ανά τεστ\n"
+msgstr[1] "%u δευτερόλεπτα ανά τεστ\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT υποστηρίζεται σε αυτήν την πλατφόρμα για open_datasync και open_sync.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "F_NOCACHE υποστηρίζεται σε αυτήν την πλατφόρμα για open_datasync και open_sync.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "Άμεσο I/O δεν υποστηρίζεται σε αυτήν την πλατφόρμα.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "δεν ήταν δυνατό το άνοιγμα αρχείου εξόδου"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "απέτυχε η εγγραφή"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "fsync απέτυχε"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Συγκρίνετε τις μεθόδους συγχρονισμού αρχείων χρησιμοποιώντας μία εγγραφή %dkB:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Συγκρίνετε τις μεθόδους συγχρονισμού αρχείων χρησιμοποιώντας δύο εγγραφές %dkB:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(με wal_sync_method σειρά προτίμησης, εκτός από fdatasync είναι η προεπιλογή σε Linux)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Αυτό το σύστημα αρχείων και οι επιλογές προσάρτησής του δεν υποστηρίζουν\n"
+" άμεσο I/O, π.χ. ext4 σε λειτουργία journal.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Συγκρίνετε open_sync με διαφορετικά μεγέθη εγγραφής:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Αυτό έχει σχεδιαστεί για να συγκρίνει το κόστος της γραφής 16kB σε διαφορετικά\n"
+"μεγέθη open_sync.)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB open_sync εγγραφή"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB open_sync εγγραφές"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB open_sync εγγραφές"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB open_sync εγγραφές"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB open_sync εγγραφές"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Ελέγξτε εάν τηρείται το fsync σε μη-εγγράψιμο περιγραφέα αρχείων:\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Εάν οι χρόνοι είναι παρόμοιοι, το fsync() μπορεί να συγχρονίσει δεδομένα εγγεγραμμένα\n"
+"σε διαφορετικό περιγραφέα.)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"Μη-συγχρονισμένες %dkB εγγραφές:\n"
diff --git a/src/bin/pg_test_fsync/po/es.po b/src/bin/pg_test_fsync/po/es.po
new file mode 100644
index 0000000..44505fd
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/es.po
@@ -0,0 +1,228 @@
+# Spanish message translation file for pg_test_fsync
+#
+# Copyright (c) 2017-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Carlos Chapi <carloswaldo@babelruins.org>, 2017, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:51+0000\n"
+"PO-Revision-Date: 2022-10-20 09:06+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 2.4.3\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ops/seg %6.0f usegs/op\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "no se pudo crear el thread para la alarma"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Empleo: %s [-f ARCHIVO] [-s SEG-POR-PRUEBA]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argumento no válido para la opción %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s debe estar en el rango %u..%u"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u segundo por prueba\n"
+msgstr[1] "%u segundos por prueba\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT tiene soporte en esta plataforma para open_datasync y open_sync.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "F_NOCACHE tiene soporte en esta plataforma para open_datasync y open_sync.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "Direct I/O no está soportado en esta plataforma.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "no se pudo abrir el archivo de salida"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "escritura falló"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "fsync falló"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Comparar métodos de sincronización de archivos usando una escritura de %dkB:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Comparar métodos de sincronización de archivos usando dos escrituras de %dkB:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(en orden de preferencia de wal_sync_method, excepto en Linux donde fdatasync es el predeterminado)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Este sistema de archivos con sus opciones de montaje no soportan\n"
+" Direct I/O, e.g. ext4 en modo journal.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Comparar open_sync con diferentes tamaños de escritura:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Esto está diseñado para comparar el costo de escribir 16kB en diferentes\n"
+"tamaños de escrituras open_sync.)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB escritura open_sync"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB escrituras open_sync"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB escrituras open_sync"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB escrituras open_sync"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB escrituras open_sync"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Probar si se respeta fsync en un descriptor de archivo que no es de escritura:\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Si los tiempos son similares, fsync() puede sincronizar datos escritos\n"
+"en un descriptor diferente.)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"Escrituras de %dkB no sincronizadas:\n"
diff --git a/src/bin/pg_test_fsync/po/fr.po b/src/bin/pg_test_fsync/po/fr.po
new file mode 100644
index 0000000..dfedfe8
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/fr.po
@@ -0,0 +1,242 @@
+# LANGUAGE message translation file for pg_test_fsync
+# Copyright (C) 2017-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2017-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-14 10:20+0000\n"
+"PO-Revision-Date: 2022-05-14 17:17+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ops/sec %6.0f usecs/op\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "n'a pas pu créer un thread pour l'alarme"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s : %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Usage: %s [-f NOMFICHIER] [-s SECS-PAR-TEST]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argument invalide pour l'option %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s doit être compris entre %u et %u"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u seconde par test\n"
+msgstr[1] "%u secondes par test\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT supporté sur cette plateforme pour open_datasync et open_sync.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "F_NOCACHE supporté sur cette plateforme pour open_datasync et open_sync.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "Direct I/O n'est pas supporté sur cette plateforme.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "n'a pas pu ouvrir le fichier en sortie"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "échec en écriture"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "échec de la synchronisation (fsync)"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Comparer les méthodes de synchronisation de fichier en utilisant une écriture de %d Ko :\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Comparer les méthodes de synchronisation de fichier sur disque en utilisant deux écritures de %d Ko :\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(dans l'ordre de préférence de wal_sync_method, sauf fdatasync qui est la valeur par défaut sous Linux)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Ce système de fichiers et ses options de montage ne supportent pas les\n"
+" I/O directes, par exemple ext4 en journalisé.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Comparer open_sync avec différentes tailles d'écriture :\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Ceci est conçu pour comparer le coût d'écriture de 16 Ko dans différentes tailles\n"
+"d'écritures open_sync.)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16 Ko, écriture avec open_sync"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8 Ko, écriture avec open_sync"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4 Ko, écriture avec open_sync"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2 Ko, écriture avec open_sync"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr " 16 * 1 Ko, écriture avec open_sync"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Teste si fsync est honoré sur un descripteur de fichiers sans écriture :\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Si les temps sont similaires, fsync() peut synchroniser sur disque les données écrites sur\n"
+"un descripteur différent.)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"%d Ko d'écritures non synchronisées :\n"
+
+#~ msgid "%s: %s\n"
+#~ msgstr "%s : %s\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#~ msgid "seek failed"
+#~ msgstr "seek échoué"
diff --git a/src/bin/pg_test_fsync/po/it.po b/src/bin/pg_test_fsync/po/it.po
new file mode 100644
index 0000000..c381e27
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/it.po
@@ -0,0 +1,226 @@
+# LANGUAGE message translation file for pg_test_fsync
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:21+0000\n"
+"PO-Revision-Date: 2022-09-30 14:56+0200\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"Last-Translator: Domenico Sgarbossa <sgarbossa.domenico@gmail.com>\n"
+"Language-Team: \n"
+"X-Generator: Poedit 2.3\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore:"
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f operazioni/sec %6.0f operazioni/sec\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "non è stato possibile creare thread per l'allarme"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Utilizzo: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argomento non valido per l'opzione %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s deve essere compreso nell'intervallo %u..%u"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u secondo per test\n"
+msgstr[1] "%u secondi per test\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT supportato su questa piattaforma per open_datasync e open_sync.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "F_NOCACHE supportato su questa piattaforma per open_datasync e open_sync.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "L'I/O diretto non è supportato su questa piattaforma.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "impossibile aprire il file di output"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "scrittura fallita"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "fsync non è riuscito"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Confronta i metodi di sincronizzazione dei file utilizzando una scrittura di %dkB:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Confronta i metodi di sincronizzazione dei file utilizzando due scritture %dkB:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(nell'ordine di preferenza wal_sync_method, tranne che fdatasync è l'impostazione predefinita di Linux)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Questo file system e le sue opzioni di montaggio non supportano Direct\n"
+" I/O, ad es. ext4 in modalità journal.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Confronta open_sync con diverse dimensioni di scrittura:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Questo è progettato per confrontare il costo di scrittura di 16kB in diverse scritture\n"
+"dimensioni open_sync.)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16 kB di scrittura open_sync"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8 kB di scritture open_sync"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB di scrittura open_sync"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB di scritture open_sync"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB di scrittura open_sync"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Verifica se fsync sul descrittore di file non di scrittura è rispettato:\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Se i tempi sono simili, fsync() può sincronizzare i dati scritti su un altro\n"
+"descrittore.)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"%dkB non sincronizzato scrive:\n"
diff --git a/src/bin/pg_test_fsync/po/ja.po b/src/bin/pg_test_fsync/po/ja.po
new file mode 100644
index 0000000..59d3caa
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/ja.po
@@ -0,0 +1,237 @@
+# LANGUAGE message translation file for pg_test_fsync
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-09 12:01+0900\n"
+"PO-Revision-Date: 2022-05-10 15:25+0900\n"
+"Last-Translator: Michihide Hotta <hotta@net-newbie.com>\n"
+"Language-Team: \n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f 操作/秒 %6.0f マイクロ秒/操作\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "アラーム用のスレッドを生成できませんでした"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "使用法: %s [-f ファイル名] [-s テストあたりの秒数]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "オプション%sの引数が不正です"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細は\"%s --help\"を実行してください。"
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%sは%u..%uの範囲でなければなりません"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "テスト1件あたり %u秒\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "このプラットフォームでは open_datasync と open_sync について O_DIRECT がサポートされています。\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "このプラットフォームでは open_datasync と open_sync について F_NOCACHE がサポートされています。\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "このプラットフォームではダイレクト I/O がサポートされていません。\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "出力ファイルをオープンできませんでした"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "書き込みに失敗"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "fsync に失敗"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"1個の %dkB write を使ってファイル同期メソッドを比較します:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"2個の %dkB write を使ってファイル同期メソッドを比較します:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(wal_sync_method の指定順の中で、Linux のデフォルトである fdatasync は除きます)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "利用不可*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "利用不可"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* このファイルシステムとそのマウントオプションではダイレクト I/O をサポート\n"
+" していません。例)ジャーナルモードの ext4。\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"open_sync を異なった write サイズで比較します:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(これは open_sync の write サイズを変えながら、16kB write のコストを\n"
+"比較するよう指定されています。)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB open_sync write"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB open_sync writes"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB open_sync writes"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB open_sync writes"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB open_sync writes"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"書き込みなしのファイルディスクリプタ上の fsync の方が優れているかをテストします:\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(もし実行時間が同等であれば、fsync() は異なったファイルディスクリプタ上で\n"
+"データを sync できることになります。)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"%dkB の sync なし write:\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "\"%s --help\" で詳細を確認してください。\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s: コマンドライン引数が多すぎます(先頭は \"%s\")\n"
+
+#~ msgid "seek failed"
+#~ msgstr "seek 失敗"
+
+#~ msgid "%s: %s\n"
+#~ msgstr "%s: %s\n"
diff --git a/src/bin/pg_test_fsync/po/ka.po b/src/bin/pg_test_fsync/po/ka.po
new file mode 100644
index 0000000..b151f70
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/ka.po
@@ -0,0 +1,226 @@
+# Georgian message translation file for pg_test_fsync
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:51+0000\n"
+"PO-Revision-Date: 2022-07-05 05:20+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდომა: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გაფრთხილება: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტალები: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნება: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ოპ/წმ %6.0f მკწმ/ოპ\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "გაფრთხილების ძაფის შექმნა შეუძლებელია"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "გამოყენება: %s [-f ფაილისსახელი] [-s წამიტესტი]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "არასწორი არგუმენტი პარამეტრისთვის: %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s- %u-დან %u-მდე დიაპაზონში უნდა იყოს"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u second per test\n"
+msgstr[1] "%u seconds per test\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "ამ პლატფორმაზე O_DIRECT მხარდაჭერილია open_datasync და open_sync-სთვის.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "ამ პლატფორმაზე F_NOCACHE მხარდაჭერილია open_datasync და open_sync-სთვის.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "DIRECT I/O ამ პლატფორმაზე მხარდაჭერილი არაა.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "გამოტანის ფაილის გახსნის შეცდომა"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "ჩაწერის შეცდომა"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "fsync-ის შეცდომა"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"სინქრნიზაციის მეთოდების შედარება ერთი %dკბ ჩაწერით:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"სინქრნიზაციის მეთოდების შედარება ორი %dკბ ჩაწერით:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(wal_sync_method -ის რჩეული მიმდევრობით, fdatasync-ის გარდა, რომელიც ლინუქსზე ნაგულისხმებია)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* ამ ფაილურ სისტემას და მის მიმაგრების პარამეტრებს პირდაპირი შეტანა/გამოტანის\n"
+"მხარდაჭერა არ გააჩნიათ. მაგ: ext4 ჟურნალის მხარდაჭერით.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"open_sync-ის შედარება ჩაწერის სხვაფასხვა ზომებით:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(განკუთვნილია 16კბ-ის ჩაწერის ფასის გასარკვევად \n"
+"open_sync-ის სხვადსხვა ზომების დროს.)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16კბ open_sync ჩაწერა"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8კბ open_sync ჩაწერა"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4კბ open_sync ჩაწერა"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2კბ open_sync ჩაწერა"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1კბ open_sync ჩაწერა"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"შემოწმება, ხდება თუ არა fsync ფაილის მითითებით, რომელიც კთხვისთვისაა გახსნილი.\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(თუ დროები ჰგვანან, fsync()-ს შეუძლია მონაცემების სინქრონიზაცია,\n"
+"რომელიც სხვა დესკრიპტორით ჩაიწერა)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"არასინქრონიზებული %dკბ ჩაწერები:\n"
diff --git a/src/bin/pg_test_fsync/po/ko.po b/src/bin/pg_test_fsync/po/ko.po
new file mode 100644
index 0000000..bed484d
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/ko.po
@@ -0,0 +1,241 @@
+# LANGUAGE message translation file for pg_test_fsync
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:51+0000\n"
+"PO-Revision-Date: 2023-04-05 18:08+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "상세정보: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ops/sec %6.0f usecs/op\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "알람용 쓰레드를 만들 수 없음"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "사용법: %s [-f 파일이름] [-s 검사초]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "%s 옵션의 잘못된 인자"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "자세한 사항은 \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s 값은 %u부터 %u까지 지정할 수 있습니다."
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 많은 명령행 인자를 지정했습니다. (처음 \"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "검사 간격: %u초\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr ""
+"이 플랫폼에서는 open_datasync, open_sync 에서 O_DIRECT 옵션을 지원함.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr ""
+"이 플랫폼에서는 open_datasync, open_sync 에서 F_NOCACHE 옵션을 지원함.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "이 플랫폼은 direct I/O 기능을 지원하지 않음.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "출력 파일을 열 수 없음"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "쓰기 실패"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "fsync 실패"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"하나의 %dkB 쓰기에 대한 파일 싱크 방법 비교:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"두개의 %dkB 쓰기에 대한 파일 싱크 방법 비교:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid ""
+"(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr ""
+"(fdatasync가 리눅스 기본값이기에 제외하고, wal_sync_method 우선으로 처리 "
+"함)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* 이 파일 시스템과 마운트 옵션이 direct I/O 기능을 지원하지 않음\n"
+" 예: journaled mode에서 ext4\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"서로 다른 쓰기량으로 open_sync 비교:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(서로 다른 크기로 16kB를 쓰는데, open_sync 옵션을 사용할 때의 비용 비교)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB open_sync 쓰기"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB open_sync 쓰기"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB open_sync 쓰기"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB open_sync 쓰기"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB open_sync 쓰기"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"쓰기 방지 파일에서 fsync 작동 여부 검사:\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(이 값이 비슷하다면, fsync() 호출로 여러 파일 상태에 대해서 sync를 사용\n"
+"할 수 있음.)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"Non-sync %dkB 쓰기:\n"
+
+#~ msgid "%s: %s\n"
+#~ msgstr "%s: %s\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s: 너무 많은 명령행 인자를 지정했음 (시작은 \"%s\")\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "자세한 사용법은 \"%s --help\" 명령을 이용하세요.\n"
+
+#~ msgid "seek failed"
+#~ msgstr "찾기 실패"
diff --git a/src/bin/pg_test_fsync/po/pt_BR.po b/src/bin/pg_test_fsync/po/pt_BR.po
new file mode 100644
index 0000000..f809766
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/pt_BR.po
@@ -0,0 +1,227 @@
+# Brazilian Portuguese message translation file for pg_test_fsync
+#
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Euler Taveira <euler@eulerto.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-27 13:15-0300\n"
+"PO-Revision-Date: 2022-09-27 18:50-0300\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n>1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erro: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "aviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalhe: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "dica: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ops/seg %6.0f usecs/op\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "não pôde criar thread para alarme"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Uso: %s [-f ARQUIVO] [-s SEGS-POR-TESTE]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argumento inválido para opção %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Tente \"%s --help\" para obter informações adicionais."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s deve estar no intervalo de %u..%u"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "muitos argumentos de linha de comando (primeiro é \"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u segundo por teste\n"
+msgstr[1] "%u segundos por teste\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT suportado nesta plataforma para open_datasync e open_sync.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "F_NOCACHE suportado nesta plataforma para open_datasync e open_sync.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "Direct I/O não é suportado nesta plataforma.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "não pôde abrir arquivo de saída"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "escrita falhou"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "fsync falhou"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Compara métodos de sincronização de arquivos utilizando uma escrita de %dkB:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Compara métodos de sincronização de arquivos utilizando duas escritas de %dkB:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(em ordem de preferência do wal_sync_method, exceto fdatasync que é o padrão do Linux)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Este sistema de arquivos e suas opções de montagem não suportam\n"
+" direct I/O, e.g. ext4 em modo journal.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Compara open_sync com diferentes tamanhos de escrita:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Isso é projetado para comparar o custo de escrita de 16jB em diferentes tamanhos\n"
+"de escrita com open_sync.)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * escrita de 16kB open_sync"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * escritas de 8kB open_sync"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * escritas de 4kB open_sync"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * escritas de 2kB open_sync"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * escritas de 1kB open_sync"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Testar se o fsync em um descritor de arquivo sem escrita é respeitado:\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Se os tempos são similares, fsync() pode sincronizar dados escritos em um\n"
+"descritor diferente.)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"Escritas de %dkB não sincronizadas:\n"
diff --git a/src/bin/pg_test_fsync/po/ru.po b/src/bin/pg_test_fsync/po/ru.po
new file mode 100644
index 0000000..5ba3586
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/ru.po
@@ -0,0 +1,238 @@
+# Russian message translation file for pg_test_fsync
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2017, 2021, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-27 14:52+0300\n"
+"PO-Revision-Date: 2022-09-05 13:36+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробности: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подсказка: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f оп/с %6.0f мкс/оп\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "не удалось создать поток для обработки сигналов"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Использование: %s [-f ИМЯ_ФАЙЛА ] [-s ТЕСТ_СЕК]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "недопустимый аргумент параметра %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Для дополнительной информации попробуйте \"%s --help\"."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "значение %s должно быть в диапазоне %u..%u"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "слишком много аргументов командной строки (первый: \"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "на тест отводится %u сек.\n"
+msgstr[1] "на тест отводится %u сек.\n"
+msgstr[2] "на тест отводится %u сек.\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr ""
+"O_DIRECT на этой платформе не поддерживается для open_datasync и open_sync.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr ""
+"F_NOCACHE на этой платформе поддерживается для open_datasync и open_sync.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "Прямой ввод/вывод не поддерживается на этой платформе.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "не удалось открыть выходной файл"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "ошибка записи"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "ошибка синхронизации с ФС"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Сравнение методов синхронизации файлов при однократной записи %d КБ:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Сравнение методов синхронизации файлов при двухкратной записи %d КБ:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid ""
+"(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr ""
+"(в порядке предпочтения для wal_sync_method, без учёта наибольшего "
+"предпочтения fdatasync в Linux)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "н/д*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "н/д"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Эта файловая система с текущими параметрами монтирования не поддерживает\n"
+" прямой ввод/вывод, как например, ext4 в режиме журналирования.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Сравнение open_sync при различных объёмах записываемых данных:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Этот тест предназначен для сравнения стоимости записи 16 КБ при разных "
+"размерах\n"
+"записи с open_sync.)\n"
+
+# skip-rule: double-space
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr "запись с open_sync 1 * 16 КБ"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr "запись с open_sync 2 * 8 КБ"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr "запись с open_sync 4 * 4 КБ"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr "запись с open_sync 8 * 2 КБ"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "запись с open_sync 16 * 1 КБ"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Проверка, производится ли fsync с указателем файла, открытого не для "
+"записи:\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Если длительность примерно одинаковая, fsync() может синхронизировать "
+"данные,\n"
+"записанные через другой дескриптор.)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"Несинхронизированная запись %d КБ:\n"
+
+#~ msgid "seek failed"
+#~ msgstr "ошибка позиционирования"
diff --git a/src/bin/pg_test_fsync/po/sv.po b/src/bin/pg_test_fsync/po/sv.po
new file mode 100644
index 0000000..45f059e
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/sv.po
@@ -0,0 +1,229 @@
+# Swedish message translation file for pg_test_fsync
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Dennis Björklund <db@zigo.dhs.org>, 2017, 2018, 2019, 2020, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-09 18:51+0000\n"
+"PO-Revision-Date: 2022-05-09 21:44+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ops/sek %6.0f useks/op\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "kunde inte skapa alarmtråd"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Användning: %s [-f FILENAMN] [-s SEK-PER-TEST]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "ogiltigt argument för flaggan %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s måste vara i intervallet %u..%u"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u sekund per test\n"
+msgstr[1] "%u sekunder per test\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT stöds på denna plattform för open_datasync och open_sync.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "F_NOCACHE stöds på denna plattform för open_datasync och open_sync.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "Direkt I/O stöds inte på denna plattform.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "kunde inte öppna utdatafil"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "skrivning misslyckades"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "fsync misslyckades"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Jämför filsynkningsmetoder genom att använda en %dkB-skrivning:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Jämför filsynkningsmetoder genom att använda två %dkB-skrivningar:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(i wal_sync_method inställningsordning, förutom att fdatasync är standard i Linux)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "ej tillämpbar*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "ej tillämpbar"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Detta filsystem och dess monteringsflaffor stöder inte\n"
+" direkt I/O, t.ex. ext4 i journalläge.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Jämför open_sync med olika skrivstorlekar:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Detta är gjort för att jämföra kostnaden att skriva 16kB med olika\n"
+"open_sync skrivstorlekar.)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB open_sync skrivning"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB open_sync skrivningar"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB open_sync skrivningar"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB open_sync skrivningar"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB open_sync skrivningar"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Testa om fsync på en icke skrivbar fildeskriptor respekteras:\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Om tiderna är liknande, så kan fsync() synka data skriven på\n"
+"olika deskriptorer.)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"Icke-synkade %dkB-skrivningar:\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Försök med \"%s --help\" för mer information.\n"
diff --git a/src/bin/pg_test_fsync/po/uk.po b/src/bin/pg_test_fsync/po/uk.po
new file mode 100644
index 0000000..00a789b
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/uk.po
@@ -0,0 +1,211 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:51+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_test_fsync.pot\n"
+"X-Crowdin-File-ID: 886\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередження: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f оп/с %6.0f мкс/оп\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "не вдалося створити потік для сигналізації"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Використання: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "неприпустимий аргумент для параметру %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" для додаткової інформації."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s має бути в діапазоні %u..%u"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному рядку (перший \"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u секунда на тест\n"
+msgstr[1] "%u секунди на тест\n"
+msgstr[2] "%u секунд на тест\n"
+msgstr[3] "%u секунд на тест\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT на цій платформі підтримується для open_datasync і open_sync.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "F_NOCACHE підтримується на цій платформі для open_datasync і open_sync.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "Пряме введення/виведення не підтримується на цій платформі.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "неможливо відкрити файл виводу"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "записування не вдалося"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "помилка fsync"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid "\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr "\n"
+"Порівнювання методів синхронізації файлу, використовуючи один запис %dkB:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid "\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr "\n"
+"Порівнювання методів синхронізації файлу, використовуючи два записи %dkB: \n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(в порядку переваги для wal_sync_method, окрім переваги fdatasync в Linux)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "н/д*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "н/д"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid "* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr "* Ця файлова система з поточними параметрами монтування не підтримує\n"
+" пряме введення/виведення, наприклад, ext4 в режимі журналювання.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid "\n"
+"Compare open_sync with different write sizes:\n"
+msgstr "\n"
+"Порівняння open_sync з різними розмірами записування:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid "(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr "(Це створено для порівняння вартості запису 16 КБ з різними розмірами\n"
+"записування open_sync.)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " запис з open_sync 1 * 16 КБ"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " запис з open_sync 2 * 8 КБ"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " запис з open_sync 4 * 4 КБ"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " запис з open_sync 8 * 2 КБ"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "запис з open_sync 16 * 1 КБ"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid "\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr "\n"
+"Перевірка, чи здійснюється fsync з дескриптором файлу, відкритого не для запису:\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid "(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr "(Якщо час однаковий, fsync() може синхронізувати дані, записані іншим дескриптором.)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid "\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr "\n"
+"Несинхронізований запис %d КБ:\n"
+
diff --git a/src/bin/pg_test_fsync/t/001_basic.pl b/src/bin/pg_test_fsync/t/001_basic.pl
new file mode 100644
index 0000000..8c5c0e7
--- /dev/null
+++ b/src/bin/pg_test_fsync/t/001_basic.pl
@@ -0,0 +1,29 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+#########################################
+# Basic checks
+
+program_help_ok('pg_test_fsync');
+program_version_ok('pg_test_fsync');
+program_options_handling_ok('pg_test_fsync');
+
+#########################################
+# Test invalid option combinations
+
+command_fails_like(
+ [ 'pg_test_fsync', '--secs-per-test', 'a' ],
+ qr/\Qpg_test_fsync: error: invalid argument for option --secs-per-test\E/,
+ 'pg_test_fsync: invalid argument for option --secs-per-test');
+command_fails_like(
+ [ 'pg_test_fsync', '--secs-per-test', '0' ],
+ qr/\Qpg_test_fsync: error: --secs-per-test must be in range 1..4294967295\E/,
+ 'pg_test_fsync: --secs-per-test must be in range');
+
+done_testing();
diff --git a/src/bin/pg_test_timing/.gitignore b/src/bin/pg_test_timing/.gitignore
new file mode 100644
index 0000000..e5aac2a
--- /dev/null
+++ b/src/bin/pg_test_timing/.gitignore
@@ -0,0 +1,3 @@
+/pg_test_timing
+
+/tmp_check/
diff --git a/src/bin/pg_test_timing/Makefile b/src/bin/pg_test_timing/Makefile
new file mode 100644
index 0000000..84d84c3
--- /dev/null
+++ b/src/bin/pg_test_timing/Makefile
@@ -0,0 +1,36 @@
+# src/bin/pg_test_timing/Makefile
+
+PGFILEDESC = "pg_test_timing - test timing overhead"
+PGAPPICON = win32
+
+subdir = src/bin/pg_test_timing
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ pg_test_timing.o
+
+all: pg_test_timing
+
+pg_test_timing: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_test_timing$(X) '$(DESTDIR)$(bindir)/pg_test_timing$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_test_timing$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_test_timing$(X) $(OBJS)
+ rm -rf tmp_check
diff --git a/src/bin/pg_test_timing/nls.mk b/src/bin/pg_test_timing/nls.mk
new file mode 100644
index 0000000..3ffdeb7
--- /dev/null
+++ b/src/bin/pg_test_timing/nls.mk
@@ -0,0 +1,4 @@
+# src/bin/pg_test_timing/nls.mk
+CATALOG_NAME = pg_test_timing
+AVAIL_LANGUAGES = de el es fr it ja ka ko pt_BR ru sv uk zh_CN
+GETTEXT_FILES = pg_test_timing.c
diff --git a/src/bin/pg_test_timing/pg_test_timing.c b/src/bin/pg_test_timing/pg_test_timing.c
new file mode 100644
index 0000000..c29d6f8
--- /dev/null
+++ b/src/bin/pg_test_timing/pg_test_timing.c
@@ -0,0 +1,208 @@
+/*
+ * pg_test_timing.c
+ * tests overhead of timing calls and their monotonicity: that
+ * they always move forward
+ */
+
+#include "postgres_fe.h"
+
+#include <limits.h>
+
+#include "getopt_long.h"
+#include "portability/instr_time.h"
+
+static const char *progname;
+
+static unsigned int test_duration = 3;
+
+static void handle_args(int argc, char *argv[]);
+static uint64 test_timing(unsigned int duration);
+static void output(uint64 loop_count);
+
+/* record duration in powers of 2 microseconds */
+long long int histogram[32];
+
+int
+main(int argc, char *argv[])
+{
+ uint64 loop_count;
+
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_test_timing"));
+ progname = get_progname(argv[0]);
+
+ handle_args(argc, argv);
+
+ loop_count = test_timing(test_duration);
+
+ output(loop_count);
+
+ return 0;
+}
+
+static void
+handle_args(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"duration", required_argument, NULL, 'd'},
+ {NULL, 0, NULL, 0}
+ };
+
+ int option; /* Command line option */
+ int optindex = 0; /* used by getopt_long */
+ unsigned long optval; /* used for option parsing */
+ char *endptr;
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ printf(_("Usage: %s [-d DURATION]\n"), progname);
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_test_timing (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((option = getopt_long(argc, argv, "d:",
+ long_options, &optindex)) != -1)
+ {
+ switch (option)
+ {
+ case 'd':
+ errno = 0;
+ optval = strtoul(optarg, &endptr, 10);
+
+ if (endptr == optarg || *endptr != '\0' ||
+ errno != 0 || optval != (unsigned int) optval)
+ {
+ fprintf(stderr, _("%s: invalid argument for option %s\n"),
+ progname, "--duration");
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
+ exit(1);
+ }
+
+ test_duration = (unsigned int) optval;
+ if (test_duration == 0)
+ {
+ fprintf(stderr, _("%s: %s must be in range %u..%u\n"),
+ progname, "--duration", 1, UINT_MAX);
+ exit(1);
+ }
+ break;
+
+ default:
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+ progname);
+ exit(1);
+ break;
+ }
+ }
+
+ if (argc > optind)
+ {
+ fprintf(stderr,
+ _("%s: too many command-line arguments (first is \"%s\")\n"),
+ progname, argv[optind]);
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+ progname);
+ exit(1);
+ }
+
+
+ printf(ngettext("Testing timing overhead for %u second.\n",
+ "Testing timing overhead for %u seconds.\n",
+ test_duration),
+ test_duration);
+}
+
+static uint64
+test_timing(unsigned int duration)
+{
+ uint64 total_time;
+ int64 time_elapsed = 0;
+ uint64 loop_count = 0;
+ uint64 prev,
+ cur;
+ instr_time start_time,
+ end_time,
+ temp;
+
+ total_time = duration > 0 ? duration * INT64CONST(1000000) : 0;
+
+ INSTR_TIME_SET_CURRENT(start_time);
+ cur = INSTR_TIME_GET_MICROSEC(start_time);
+
+ while (time_elapsed < total_time)
+ {
+ int32 diff,
+ bits = 0;
+
+ prev = cur;
+ INSTR_TIME_SET_CURRENT(temp);
+ cur = INSTR_TIME_GET_MICROSEC(temp);
+ diff = cur - prev;
+
+ /* Did time go backwards? */
+ if (diff < 0)
+ {
+ fprintf(stderr, _("Detected clock going backwards in time.\n"));
+ fprintf(stderr, _("Time warp: %d ms\n"), diff);
+ exit(1);
+ }
+
+ /* What is the highest bit in the time diff? */
+ while (diff)
+ {
+ diff >>= 1;
+ bits++;
+ }
+
+ /* Update appropriate duration bucket */
+ histogram[bits]++;
+
+ loop_count++;
+ INSTR_TIME_SUBTRACT(temp, start_time);
+ time_elapsed = INSTR_TIME_GET_MICROSEC(temp);
+ }
+
+ INSTR_TIME_SET_CURRENT(end_time);
+
+ INSTR_TIME_SUBTRACT(end_time, start_time);
+
+ printf(_("Per loop time including overhead: %0.2f ns\n"),
+ INSTR_TIME_GET_DOUBLE(end_time) * 1e9 / loop_count);
+
+ return loop_count;
+}
+
+static void
+output(uint64 loop_count)
+{
+ int64 max_bit = 31,
+ i;
+ char *header1 = _("< us");
+ char *header2 = /* xgettext:no-c-format */ _("% of total");
+ char *header3 = _("count");
+ int len1 = strlen(header1);
+ int len2 = strlen(header2);
+ int len3 = strlen(header3);
+
+ /* find highest bit value */
+ while (max_bit > 0 && histogram[max_bit] == 0)
+ max_bit--;
+
+ printf(_("Histogram of timing durations:\n"));
+ printf("%*s %*s %*s\n",
+ Max(6, len1), header1,
+ Max(10, len2), header2,
+ Max(10, len3), header3);
+
+ for (i = 0; i <= max_bit; i++)
+ printf("%*ld %*.5f %*lld\n",
+ Max(6, len1), 1l << i,
+ Max(10, len2) - 1, (double) histogram[i] * 100 / loop_count,
+ Max(10, len3), histogram[i]);
+}
diff --git a/src/bin/pg_test_timing/po/de.po b/src/bin/pg_test_timing/po/de.po
new file mode 100644
index 0000000..6bcbc73
--- /dev/null
+++ b/src/bin/pg_test_timing/po/de.po
@@ -0,0 +1,84 @@
+# German message translation file for pg_test_timing
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 13\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-04-12 14:17+0000\n"
+"PO-Revision-Date: 2021-04-12 16:37+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Aufruf: %s [-d DAUER]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: ungültiges Argument für Option %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s muss im Bereich %u..%u sein\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: zu viele Kommandozeilenargumente (das erste ist »%s«)\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Testen des Overheads der Zeitmessung für %u Sekunde\n"
+msgstr[1] "Testen des Overheads der Zeitmessung für %u Sekunden\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Rückwärts gehende Uhr festgestellt.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Zeitdifferenz: %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Zeit pro Durchlauf einschließlich Overhead: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< µs"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% von gesamt"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "Anzahl"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Histogramm der Dauern der Zeitmessungen:\n"
diff --git a/src/bin/pg_test_timing/po/el.po b/src/bin/pg_test_timing/po/el.po
new file mode 100644
index 0000000..3d1ba0b
--- /dev/null
+++ b/src/bin/pg_test_timing/po/el.po
@@ -0,0 +1,86 @@
+# Greek message translation file for pg_test_timing
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_timing (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-07-20 03:46+0000\n"
+"PO-Revision-Date: 2021-07-20 10:42+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.0\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Χρήση: %s [-d DURATION]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: μη έγκυρη παράμετρος για την επιλογή %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s πρέπει να βρίσκεται εντός εύρους %u..%u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: πάρα πολλοί παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Έλεγχος επίφορτου χρονισμού για %u δευτερόλεπτο.\n"
+msgstr[1] "Έλεγχος επίφορτου χρονισμού για %u δευτερόλεπτα.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Εντοπίστηκε ρολόι που πηγαίνει προς τα πίσω στο χρόνο.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Χρονική στρέβλωση: %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Χρόνος ανά βρόχο συμπεριλαμβανομένου επίφορτου: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% του συνόλου"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "μετρητής"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Ιστόγραμμα διαρκειών χρονισμού:\n"
diff --git a/src/bin/pg_test_timing/po/es.po b/src/bin/pg_test_timing/po/es.po
new file mode 100644
index 0000000..3122205
--- /dev/null
+++ b/src/bin/pg_test_timing/po/es.po
@@ -0,0 +1,86 @@
+# Spanish message translation file for pg_test_timing
+#
+# Copyright (c) 2017-2019, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Carlos Chapi <carloswaldo@babelruins.org>, 2017-2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:48+0000\n"
+"PO-Revision-Date: 2022-10-20 09:06+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 2.4.2\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Empleo: %s [-d DURACIÓN]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: argumento no válido para la opción %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Pruebe «%s --help» para mayor información.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s debe estar en el rango %u..%u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: demasiados argumentos de línea de órdenes (el primero es «%s»)\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Midiendo sobrecosto de lectura de reloj durante %u segundo.\n"
+msgstr[1] "Midiendo sobrecosto de lectura de reloj durante %u segundos.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Se detectó que el reloj retrocede en el tiempo.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Desfase de tiempo: %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Tiempo por lectura incluyendo sobrecosto: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% del total"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "cantidad"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Histograma de duraciones de lectura de reloj:\n"
diff --git a/src/bin/pg_test_timing/po/fr.po b/src/bin/pg_test_timing/po/fr.po
new file mode 100644
index 0000000..f97ebee
--- /dev/null
+++ b/src/bin/pg_test_timing/po/fr.po
@@ -0,0 +1,90 @@
+# LANGUAGE message translation file for pg_test_timing
+# Copyright (C) 2017-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2017-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-12 05:16+0000\n"
+"PO-Revision-Date: 2022-04-12 17:29+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Usage: %s [-d DURÉE]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s : argument invalide pour l'option %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s : %s doit être compris entre %u et %u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Test du coût du chronométrage pour %u seconde.\n"
+msgstr[1] "Test du coût du chronométrage pour %u secondes.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Détection d'une horloge partant à rebours.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Décalage de temps : %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Durée par boucle incluant le coût : %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% du total"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "nombre"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Histogramme des durées de chronométrage\n"
+
+#~ msgid "%s: duration must be a positive integer (duration is \"%d\")\n"
+#~ msgstr "%s : la durée doit être un entier positif (la durée est « %d »)\n"
diff --git a/src/bin/pg_test_timing/po/it.po b/src/bin/pg_test_timing/po/it.po
new file mode 100644
index 0000000..fc0cfe9
--- /dev/null
+++ b/src/bin/pg_test_timing/po/it.po
@@ -0,0 +1,84 @@
+# LANGUAGE message translation file for pg_test_timing
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_timing (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:18+0000\n"
+"PO-Revision-Date: 2022-09-26 15:13+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Utilizzo: %s [-d DURATA]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: argomento non valido per l'opzione %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s deve essere compreso nell'intervallo %u..%u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: troppi argomenti nella riga di comando (il primo è \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Testare l'overhead di temporizzazione per %u secondo.\n"
+msgstr[1] "Testare l'overhead di temporizzazione per %u secondi.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Rilevato orologio che va indietro nel tempo.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Distorsione temporale: %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Tempo per ciclo incluso sovraccarico: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< noi"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% del totale"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "conteggio"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Istogramma delle durate temporali:\n"
diff --git a/src/bin/pg_test_timing/po/ja.po b/src/bin/pg_test_timing/po/ja.po
new file mode 100644
index 0000000..077f81b
--- /dev/null
+++ b/src/bin/pg_test_timing/po/ja.po
@@ -0,0 +1,86 @@
+# LANGUAGE message translation file for pg_test_timing
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_timing (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-09 12:01+0900\n"
+"PO-Revision-Date: 2022-05-10 15:27+0900\n"
+"Last-Translator: Michihide Hotta <hotta@net-newbie.com>\n"
+"Language-Team: \n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "使用方法: %s [-d 期間]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: オプション%sの引数が無効です\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "\"%s --help\" で詳細を確認してください。\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %sは%u..%uの範囲でなければなりません\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: コマンドライン引数が多すぎます(先頭は \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "%u秒に対するタイミングのオーバーヘッドをテストしています。\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "クロックの時刻が逆行していることを検出しました。\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "逆行した時間: %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "オーバーヘッド込みのループ時間毎: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "全体の%"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "個数"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "タイミング持続時間のヒストグラム:\n"
+
+#~ msgid "%s: duration must be a positive integer (duration is \"%d\")\n"
+#~ msgstr "%s: 持続時間は正の整数にする必要があります (持続時間は\"%d\")\n"
diff --git a/src/bin/pg_test_timing/po/ka.po b/src/bin/pg_test_timing/po/ka.po
new file mode 100644
index 0000000..a472b6c
--- /dev/null
+++ b/src/bin/pg_test_timing/po/ka.po
@@ -0,0 +1,84 @@
+# Georgian message translation file for pg_test_timing
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_timing (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:48+0000\n"
+"PO-Revision-Date: 2022-07-04 11:40+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "გამოყენება: %s [-d ხარნგრძლივობა]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: არასწორი არგუმენტი პარამეტრისთვის%s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s-ის დიაპაზონია %u..%u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "დროის აღრიცხვის ზედნადების გამოცდა %u წამით.\n"
+msgstr[1] "დროის აღრიცხვის ზედნადების გამოცდა %u წამით.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "ნაპოვნია, რომ საათი უკან მიდის\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "დროის ნახტომი: %d მწმ\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "თითოეული მარყუჟის დრო ზედნადების ჩათვლით: %0.2f ნწმ\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< მკწმ"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "ჯამის %"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "რაოდენობა"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "დროის ათვლის ხანგრძლივობის ჰისტოგრამა:\n"
diff --git a/src/bin/pg_test_timing/po/ko.po b/src/bin/pg_test_timing/po/ko.po
new file mode 100644
index 0000000..8fe6749
--- /dev/null
+++ b/src/bin/pg_test_timing/po/ko.po
@@ -0,0 +1,86 @@
+# LANGUAGE message translation file for pg_test_timing
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:48+0000\n"
+"PO-Revision-Date: 2023-04-05 18:08+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "사용법: %s [-d 간격]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: %s 옵션의 잘못된 인자\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "더 자세한 정보는 \"%s --help\" 명령을 이용하세요.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s 값은 %u부터 %u까지 지정할 수 있습니다.\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: 너무 많은 명령행 인자를 사용했습니다 (시작은 \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "%u초 동안 타이밍 오버해더 검사.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "거꾸로 흐른 감지된 클럭.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "간격: %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "오버헤더를 포함한 루프 시간: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% of total"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "회"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "타이밍 간견 히스토그램:\n"
+
+#, c-format
+#~ msgid "%s: duration must be a positive integer (duration is \"%d\")\n"
+#~ msgstr "%s: 간격은 양수여야 합니다. (간격: \"%d\")\n"
diff --git a/src/bin/pg_test_timing/po/pt_BR.po b/src/bin/pg_test_timing/po/pt_BR.po
new file mode 100644
index 0000000..9cd9ded
--- /dev/null
+++ b/src/bin/pg_test_timing/po/pt_BR.po
@@ -0,0 +1,85 @@
+# Brazilian Portuguese message translation file for pg_test_timing
+#
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Euler Taveira <euler@eulerto.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-27 13:15-0300\n"
+"PO-Revision-Date: 2022-09-27 18:43-0300\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n>1);\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Uso: %s [-d DURAÇÃO]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: argumento inválido para opção %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Tente \"%s --help\" para obter informações adicionais.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s deve estar no intervalo de %u..%u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: muitos argumentos de linha de comando (primeiro é \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Teste de sobrecusto de tempo por %u segundo.\n"
+msgstr[1] "Teste de sobrecusto de tempo por %u segundos.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Relógio detectado retrocedendo no tempo.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Distorção do tempo: %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Tempo por laço incluindo sobrecusto: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% do total"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "contador"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Histograma de durações de tempo:\n"
diff --git a/src/bin/pg_test_timing/po/ru.po b/src/bin/pg_test_timing/po/ru.po
new file mode 100644
index 0000000..c24e78d
--- /dev/null
+++ b/src/bin/pg_test_timing/po/ru.po
@@ -0,0 +1,88 @@
+# Russian message translation file for pg_test_timing
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2017, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 06:29+0300\n"
+"PO-Revision-Date: 2021-09-04 12:18+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Использование: %s [-d ДЛИТЕЛЬНОСТЬ]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: недопустимый аргумент параметра %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Для дополнительной информации попробуйте \"%s --help\".\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: параметр %s должен быть в диапазоне %u..%u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: слишком много аргументов командной строки (первый: \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Оценка издержек замеров времени в течение %u сек.\n"
+msgstr[1] "Оценка издержек замеров времени в течение %u сек.\n"
+msgstr[2] "Оценка издержек замеров времени в течение %u сек.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Обнаружен обратный ход часов.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Сдвиг времени: %d мс\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Время одного цикла, включая издержки: %0.2f нс\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< мкс"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% от общего"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "число"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Гистограмма длительности замеров времени:\n"
+
+#~ msgid "%s: duration must be a positive integer (duration is \"%d\")\n"
+#~ msgstr ""
+#~ "%s: длительность должна задаваться положительным целым (указано: \"%d\")\n"
diff --git a/src/bin/pg_test_timing/po/sv.po b/src/bin/pg_test_timing/po/sv.po
new file mode 100644
index 0000000..92c130d
--- /dev/null
+++ b/src/bin/pg_test_timing/po/sv.po
@@ -0,0 +1,83 @@
+# Swedish message translation file for pg_test_timing
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Dennis Björklund <db@zigo.dhs.org>, 2017, 2018, 2019, 2020, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-11-06 17:16+0000\n"
+"PO-Revision-Date: 2021-11-06 21:59+0100\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Användning: %s [-d TID]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: ogiltigt argument för flaggan %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Försök med \"%s --help\" för mer information.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s måste vara i intervallet %u..%u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: för många kommandoradsargument (första är \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Testar timingoverhead under %u sekund.\n"
+msgstr[1] "Testar timingoverhead under %u sekunder.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Upptäckte att klockan gått bakåt i tiden.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Tidsförskjutning: %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Tid per varv inklusive overhead: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% av totalt"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "antal"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Histogram över tider:\n"
diff --git a/src/bin/pg_test_timing/po/uk.po b/src/bin/pg_test_timing/po/uk.po
new file mode 100644
index 0000000..5313593
--- /dev/null
+++ b/src/bin/pg_test_timing/po/uk.po
@@ -0,0 +1,86 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:49+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_test_timing.pot\n"
+"X-Crowdin-File-ID: 912\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Використання: %s [-d ТРИВАЛІСТЬ]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: неприпустимий аргумент для параметру %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s має бути в діапазоні %u..%u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: забагато аргументів у командному рядку (перший \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Тестування накладних витрат часу на %u секунду.\n"
+msgstr[1] "Тестування накладних витрат часу на %u секунди.\n"
+msgstr[2] "Тестування накладних витрат часу на %u секунд.\n"
+msgstr[3] "Тестування накладних витрат часу на %u секунд.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Годинник іде в зворотньому напряму у минуле.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Зсув часу: %d мс\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Час одного цикла, у тому числі накладні витрати: %0.2f нс\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< мкс"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% від загалу"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "кількість"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Гістограмма тривалості замірів часу:\n"
+
diff --git a/src/bin/pg_test_timing/po/zh_CN.po b/src/bin/pg_test_timing/po/zh_CN.po
new file mode 100644
index 0000000..10b5efc
--- /dev/null
+++ b/src/bin/pg_test_timing/po/zh_CN.po
@@ -0,0 +1,83 @@
+# LANGUAGE message translation file for pg_test_timing
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_timing (PostgreSQL) package.
+# FIRST AUTHOR <zhangjie2@fujitsu.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:47+0000\n"
+"PO-Revision-Date: 2021-06-10 10:50+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "用法: %s [-d 持续时间]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: 选项%s的参数无效\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获取更多的信息.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s必须位于%u..%u的范围内\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: 命令行参数太多 (第一个是 \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "测试%u秒的计时开销.\n"
+msgstr[1] "测试%u秒的计时开销.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "检测到时钟时间倒转.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "时间错位: %d 毫秒\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "每次循环的平均开销: %0.2f 纳秒\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< 微秒"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "总计的 %"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "计数"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "持续时间的柱状图:\n"
diff --git a/src/bin/pg_test_timing/t/001_basic.pl b/src/bin/pg_test_timing/t/001_basic.pl
new file mode 100644
index 0000000..51bf68b
--- /dev/null
+++ b/src/bin/pg_test_timing/t/001_basic.pl
@@ -0,0 +1,29 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+#########################################
+# Basic checks
+
+program_help_ok('pg_test_timing');
+program_version_ok('pg_test_timing');
+program_options_handling_ok('pg_test_timing');
+
+#########################################
+# Test invalid option combinations
+
+command_fails_like(
+ [ 'pg_test_timing', '--duration', 'a' ],
+ qr/\Qpg_test_timing: invalid argument for option --duration\E/,
+ 'pg_test_timing: invalid argument for option --duration');
+command_fails_like(
+ [ 'pg_test_timing', '--duration', '0' ],
+ qr/\Qpg_test_timing: --duration must be in range 1..4294967295\E/,
+ 'pg_test_timing: --duration must be in range');
+
+done_testing();
diff --git a/src/bin/pg_upgrade/.gitignore b/src/bin/pg_upgrade/.gitignore
new file mode 100644
index 0000000..a66166e
--- /dev/null
+++ b/src/bin/pg_upgrade/.gitignore
@@ -0,0 +1,8 @@
+/pg_upgrade
+# Generated by manual invocation
+/delete_old_cluster.sh
+/delete_old_cluster.bat
+/reindex_hash.sql
+# Generated by test suite
+/log/
+/tmp_check/
diff --git a/src/bin/pg_upgrade/IMPLEMENTATION b/src/bin/pg_upgrade/IMPLEMENTATION
new file mode 100644
index 0000000..229399a
--- /dev/null
+++ b/src/bin/pg_upgrade/IMPLEMENTATION
@@ -0,0 +1,98 @@
+------------------------------------------------------------------------------
+PG_UPGRADE: IN-PLACE UPGRADES FOR POSTGRESQL
+------------------------------------------------------------------------------
+
+Upgrading a PostgreSQL database from one major release to another can be
+an expensive process. For minor upgrades, you can simply install new
+executables and forget about upgrading existing data. But for major
+upgrades, you have to export all of your data using pg_dump, install the
+new release, run initdb to create a new cluster, and then import your
+old data. If you have a lot of data, that can take a considerable amount
+of time. If you have too much data, you may have to buy more storage
+since you need enough room to hold the original data plus the exported
+data. pg_upgrade can reduce the amount of time and disk space required
+for many upgrades.
+
+The URL http://momjian.us/main/writings/pgsql/pg_upgrade.pdf contains a
+presentation about pg_upgrade internals that mirrors the text
+description below.
+
+------------------------------------------------------------------------------
+WHAT IT DOES
+------------------------------------------------------------------------------
+
+pg_upgrade is a tool that performs an in-place upgrade of existing
+data. Some upgrades change the on-disk representation of data;
+pg_upgrade cannot help in those upgrades. However, many upgrades do
+not change the on-disk representation of a user-defined table. In those
+cases, pg_upgrade can move existing user-defined tables from the old
+database cluster into the new cluster.
+
+There are two factors that determine whether an in-place upgrade is
+practical.
+
+Every table in a cluster shares the same on-disk representation of the
+table headers and trailers and the on-disk representation of tuple
+headers. If this changes between the old version of PostgreSQL and the
+new version, pg_upgrade cannot move existing tables to the new cluster;
+you will have to pg_dump the old data and then import that data into the
+new cluster.
+
+Second, all data types should have the same binary representation
+between the two major PostgreSQL versions.
+
+------------------------------------------------------------------------------
+HOW IT WORKS
+------------------------------------------------------------------------------
+
+To use pg_upgrade during an upgrade, start by installing a fresh
+cluster using the newest version in a new directory. When you've
+finished installation, the new cluster will contain the new executables
+and the usual template0, template1, and postgres, but no user-defined
+tables. At this point, you can shut down the old and new postmasters and
+invoke pg_upgrade.
+
+When pg_upgrade starts, it ensures that all required executables are
+present and contain the expected version numbers. The verification
+process also checks the old and new $PGDATA directories to ensure that
+the expected files and subdirectories are in place. If the verification
+process succeeds, pg_upgrade starts the old postmaster and runs
+pg_dumpall --schema-only to capture the metadata contained in the old
+cluster. The script produced by pg_dumpall will be used in a later step
+to recreate all user-defined objects in the new cluster.
+
+Note that the script produced by pg_dumpall will only recreate
+user-defined objects, not system-defined objects. The new cluster will
+contain the system-defined objects created by the latest version of
+PostgreSQL.
+
+Once pg_upgrade has extracted the metadata from the old cluster, it
+performs a number of bookkeeping tasks required to 'sync up' the new
+cluster with the existing data.
+
+First, pg_upgrade copies the commit status information and 'next
+transaction ID' from the old cluster to the new cluster. This step
+ensures that the proper tuples are visible from the new cluster.
+Remember, pg_upgrade does not export/import the content of user-defined
+tables so the transaction IDs in the new cluster must match the
+transaction IDs in the old data. pg_upgrade also copies the starting
+address for write-ahead logs from the old cluster to the new cluster.
+
+Now pg_upgrade begins reconstructing the metadata obtained from the old
+cluster using the first part of the pg_dumpall output.
+
+Next, pg_upgrade executes the remainder of the script produced earlier
+by pg_dumpall --- this script effectively creates the complete
+user-defined metadata from the old cluster to the new cluster. It
+preserves the relfilenode numbers so TOAST and other references
+to relfilenodes in user data is preserved. (See binary-upgrade usage
+in pg_dump). We choose to preserve tablespace and database OIDs as well.
+
+Finally, pg_upgrade links or copies each user-defined table and its
+supporting indexes and toast tables from the old cluster to the new
+cluster.
+
+An important feature of the pg_upgrade design is that it leaves the
+original cluster intact --- if a problem occurs during the upgrade, you
+can still run the previous version, after renaming the tablespaces back
+to the original names.
diff --git a/src/bin/pg_upgrade/Makefile b/src/bin/pg_upgrade/Makefile
new file mode 100644
index 0000000..587793e
--- /dev/null
+++ b/src/bin/pg_upgrade/Makefile
@@ -0,0 +1,58 @@
+# src/bin/pg_upgrade/Makefile
+
+PGFILEDESC = "pg_upgrade - an in-place binary upgrade utility"
+PGAPPICON = win32
+
+subdir = src/bin/pg_upgrade
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ check.o \
+ controldata.o \
+ dump.o \
+ exec.o \
+ file.o \
+ function.o \
+ info.o \
+ option.o \
+ parallel.o \
+ pg_upgrade.o \
+ relfilenode.o \
+ server.o \
+ tablespace.o \
+ util.o \
+ version.o
+
+override CPPFLAGS := -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+# required for 002_pg_upgrade.pl
+REGRESS_SHLIB=$(abs_top_builddir)/src/test/regress/regress$(DLSUFFIX)
+export REGRESS_SHLIB
+
+all: pg_upgrade
+
+pg_upgrade: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_upgrade$(X) '$(DESTDIR)$(bindir)/pg_upgrade$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_upgrade$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_upgrade$(X) $(OBJS)
+ rm -rf delete_old_cluster.sh log/ tmp_check/ \
+ reindex_hash.sql
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_upgrade/TESTING b/src/bin/pg_upgrade/TESTING
new file mode 100644
index 0000000..564b1ec
--- /dev/null
+++ b/src/bin/pg_upgrade/TESTING
@@ -0,0 +1,57 @@
+THE SHORT VERSION
+-----------------
+
+On non-Windows machines, you can execute the testing process
+described below by running the following command in this directory:
+
+ make check
+
+This will run the TAP tests to run pg_upgrade, performing an upgrade
+from the version in this source tree to a new instance of the same
+version.
+
+Testing an upgrade from a different PG version is also possible, and
+provides a more thorough test that pg_upgrade does what it's meant for.
+This requires both a source tree and an installed tree for the old
+version, as well as a dump file to set up the instance to be upgraded.
+The following environment variables must be set to enable this testing:
+export olddump=...somewhere/dump.sql (old version's dump)
+export oldinstall=...otherversion/ (old version's install base path)
+See DETAILS below for more information about creation of the dump.
+
+DETAILS
+-------
+
+The most effective way to test pg_upgrade, aside from testing on user
+data, is by upgrading the PostgreSQL regression database.
+
+This testing process first requires the creation of a valid regression
+database dump that can then be used for $olddump. Such files contain
+most database features and are specific to each major version of Postgres.
+
+Here are the steps needed to create a dump file:
+
+1) Create and populate the regression database in the old cluster.
+ This database can be created by running 'make installcheck' from
+ src/test/regress in the old version's source code tree.
+
+ If you like, you can also populate regression databases for one or
+ more contrib modules by running 'make installcheck USE_MODULE_DB=1'
+ in their directories. (USE_MODULE_DB is essential so that the
+ pg_upgrade test script will understand which database is which.)
+
+2) Use pg_dumpall to dump out the contents of the instance, including the
+ regression database(s), into a SQL file. Use the *old* version's
+ pg_dumpall so that the dump created is compatible with that version.
+
+Once the dump file is created, it can be used repeatedly. Set $olddump
+to point to the dump file and run 'make check' or 'make installcheck'
+in the new version's src/bin/pg_upgrade directory. (If you included any
+contrib databases in the old dump, you must use 'make installcheck' and
+ensure that the corresponding contrib modules have been installed in
+the new version's installation tree.) This will build a temporary cluster
+using the old installation's executables, populate it from the dump file,
+and then try to pg_upgrade it to the new version. Success is reported
+if pg_dumpall output matches between the pre-upgrade and post-upgrade
+databases. In case of trouble, manually comparing those dump files may
+help to isolate the problem.
diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c
new file mode 100644
index 0000000..2f3a673
--- /dev/null
+++ b/src/bin/pg_upgrade/check.c
@@ -0,0 +1,1571 @@
+/*
+ * check.c
+ *
+ * server checks and output routines
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/check.c
+ */
+
+#include "postgres_fe.h"
+
+#include "catalog/pg_authid_d.h"
+#include "catalog/pg_collation.h"
+#include "fe_utils/string_utils.h"
+#include "mb/pg_wchar.h"
+#include "pg_upgrade.h"
+
+static void check_new_cluster_is_empty(void);
+static void check_databases_are_compatible(void);
+static void check_locale_and_encoding(DbInfo *olddb, DbInfo *newdb);
+static bool equivalent_locale(int category, const char *loca, const char *locb);
+static void check_is_install_user(ClusterInfo *cluster);
+static void check_proper_datallowconn(ClusterInfo *cluster);
+static void check_for_prepared_transactions(ClusterInfo *cluster);
+static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster);
+static void check_for_user_defined_postfix_ops(ClusterInfo *cluster);
+static void check_for_incompatible_polymorphics(ClusterInfo *cluster);
+static void check_for_tables_with_oids(ClusterInfo *cluster);
+static void check_for_composite_data_type_usage(ClusterInfo *cluster);
+static void check_for_reg_data_type_usage(ClusterInfo *cluster);
+static void check_for_removed_data_type_usage(ClusterInfo *cluster,
+ const char *version,
+ const char *datatype);
+static void check_for_jsonb_9_4_usage(ClusterInfo *cluster);
+static void check_for_pg_role_prefix(ClusterInfo *cluster);
+static void check_for_new_tablespace_dir(ClusterInfo *new_cluster);
+static void check_for_user_defined_encoding_conversions(ClusterInfo *cluster);
+static char *get_canonical_locale_name(int category, const char *locale);
+
+
+/*
+ * fix_path_separator
+ * For non-Windows, just return the argument.
+ * For Windows convert any forward slash to a backslash
+ * such as is suitable for arguments to builtin commands
+ * like RMDIR and DEL.
+ */
+static char *
+fix_path_separator(char *path)
+{
+#ifdef WIN32
+
+ char *result;
+ char *c;
+
+ result = pg_strdup(path);
+
+ for (c = result; *c != '\0'; c++)
+ if (*c == '/')
+ *c = '\\';
+
+ return result;
+#else
+
+ return path;
+#endif
+}
+
+void
+output_check_banner(bool live_check)
+{
+ if (user_opts.check && live_check)
+ {
+ pg_log(PG_REPORT,
+ "Performing Consistency Checks on Old Live Server\n"
+ "------------------------------------------------\n");
+ }
+ else
+ {
+ pg_log(PG_REPORT,
+ "Performing Consistency Checks\n"
+ "-----------------------------\n");
+ }
+}
+
+
+void
+check_and_dump_old_cluster(bool live_check)
+{
+ /* -- OLD -- */
+
+ if (!live_check)
+ start_postmaster(&old_cluster, true);
+
+ /* Extract a list of databases and tables from the old cluster */
+ get_db_and_rel_infos(&old_cluster);
+
+ init_tablespaces();
+
+ get_loadable_libraries();
+
+
+ /*
+ * Check for various failure cases
+ */
+ check_is_install_user(&old_cluster);
+ check_proper_datallowconn(&old_cluster);
+ check_for_prepared_transactions(&old_cluster);
+ check_for_composite_data_type_usage(&old_cluster);
+ check_for_reg_data_type_usage(&old_cluster);
+ check_for_isn_and_int8_passing_mismatch(&old_cluster);
+
+ /*
+ * PG 12 removed types abstime, reltime, tinterval.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1100)
+ {
+ check_for_removed_data_type_usage(&old_cluster, "12", "abstime");
+ check_for_removed_data_type_usage(&old_cluster, "12", "reltime");
+ check_for_removed_data_type_usage(&old_cluster, "12", "tinterval");
+ }
+
+ /*
+ * PG 14 changed the function signature of encoding conversion functions.
+ * Conversions from older versions cannot be upgraded automatically
+ * because the user-defined functions used by the encoding conversions
+ * need to be changed to match the new signature.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1300)
+ check_for_user_defined_encoding_conversions(&old_cluster);
+
+ /*
+ * Pre-PG 14 allowed user defined postfix operators, which are not
+ * supported anymore. Verify there are none, iff applicable.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1300)
+ check_for_user_defined_postfix_ops(&old_cluster);
+
+ /*
+ * PG 14 changed polymorphic functions from anyarray to
+ * anycompatiblearray.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1300)
+ check_for_incompatible_polymorphics(&old_cluster);
+
+ /*
+ * Pre-PG 12 allowed tables to be declared WITH OIDS, which is not
+ * supported anymore. Verify there are none, iff applicable.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1100)
+ check_for_tables_with_oids(&old_cluster);
+
+ /*
+ * PG 12 changed the 'sql_identifier' type storage to be based on name,
+ * not varchar, which breaks on-disk format for existing data. So we need
+ * to prevent upgrade when used in user objects (tables, indexes, ...).
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1100)
+ old_11_check_for_sql_identifier_data_type_usage(&old_cluster);
+
+ /*
+ * Pre-PG 10 allowed tables with 'unknown' type columns and non WAL logged
+ * hash indexes
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 906)
+ {
+ old_9_6_check_for_unknown_data_type_usage(&old_cluster);
+ if (user_opts.check)
+ old_9_6_invalidate_hash_indexes(&old_cluster, true);
+ }
+
+ /* 9.5 and below should not have roles starting with pg_ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 905)
+ check_for_pg_role_prefix(&old_cluster);
+
+ if (GET_MAJOR_VERSION(old_cluster.major_version) == 904 &&
+ old_cluster.controldata.cat_ver < JSONB_FORMAT_CHANGE_CAT_VER)
+ check_for_jsonb_9_4_usage(&old_cluster);
+
+ /* Pre-PG 9.4 had a different 'line' data type internal format */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 903)
+ old_9_3_check_for_line_data_type_usage(&old_cluster);
+
+ /*
+ * While not a check option, we do this now because this is the only time
+ * the old server is running.
+ */
+ if (!user_opts.check)
+ generate_old_dump();
+
+ if (!live_check)
+ stop_postmaster(false);
+}
+
+
+void
+check_new_cluster(void)
+{
+ get_db_and_rel_infos(&new_cluster);
+
+ check_new_cluster_is_empty();
+ check_databases_are_compatible();
+
+ check_loadable_libraries();
+
+ switch (user_opts.transfer_mode)
+ {
+ case TRANSFER_MODE_CLONE:
+ check_file_clone();
+ break;
+ case TRANSFER_MODE_COPY:
+ break;
+ case TRANSFER_MODE_LINK:
+ check_hard_link();
+ break;
+ }
+
+ check_is_install_user(&new_cluster);
+
+ check_for_prepared_transactions(&new_cluster);
+
+ check_for_new_tablespace_dir(&new_cluster);
+}
+
+
+void
+report_clusters_compatible(void)
+{
+ if (user_opts.check)
+ {
+ pg_log(PG_REPORT, "\n*Clusters are compatible*\n");
+ /* stops new cluster */
+ stop_postmaster(false);
+
+ cleanup_output_dirs();
+ exit(0);
+ }
+
+ pg_log(PG_REPORT, "\n"
+ "If pg_upgrade fails after this point, you must re-initdb the\n"
+ "new cluster before continuing.\n");
+}
+
+
+void
+issue_warnings_and_set_wal_level(void)
+{
+ /*
+ * We unconditionally start/stop the new server because pg_resetwal -o set
+ * wal_level to 'minimum'. If the user is upgrading standby servers using
+ * the rsync instructions, they will need pg_upgrade to write its final
+ * WAL record showing wal_level as 'replica'.
+ */
+ start_postmaster(&new_cluster, true);
+
+ /* Reindex hash indexes for old < 10.0 */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 906)
+ old_9_6_invalidate_hash_indexes(&new_cluster, false);
+
+ report_extension_updates(&new_cluster);
+
+ stop_postmaster(false);
+}
+
+
+void
+output_completion_banner(char *deletion_script_file_name)
+{
+ PQExpBufferData user_specification;
+
+ initPQExpBuffer(&user_specification);
+ if (os_info.user_specified)
+ {
+ appendPQExpBufferStr(&user_specification, "-U ");
+ appendShellString(&user_specification, os_info.user);
+ appendPQExpBufferChar(&user_specification, ' ');
+ }
+
+ pg_log(PG_REPORT,
+ "Optimizer statistics are not transferred by pg_upgrade.\n"
+ "Once you start the new server, consider running:\n"
+ " %s/vacuumdb %s--all --analyze-in-stages\n\n", new_cluster.bindir, user_specification.data);
+
+ if (deletion_script_file_name)
+ pg_log(PG_REPORT,
+ "Running this script will delete the old cluster's data files:\n"
+ " %s\n",
+ deletion_script_file_name);
+ else
+ pg_log(PG_REPORT,
+ "Could not create a script to delete the old cluster's data files\n"
+ "because user-defined tablespaces or the new cluster's data directory\n"
+ "exist in the old cluster directory. The old cluster's contents must\n"
+ "be deleted manually.\n");
+
+ termPQExpBuffer(&user_specification);
+}
+
+
+void
+check_cluster_versions(void)
+{
+ prep_status("Checking cluster versions");
+
+ /* cluster versions should already have been obtained */
+ Assert(old_cluster.major_version != 0);
+ Assert(new_cluster.major_version != 0);
+
+ /*
+ * We allow upgrades from/to the same major version for alpha/beta
+ * upgrades
+ */
+
+ if (GET_MAJOR_VERSION(old_cluster.major_version) < 902)
+ pg_fatal("This utility can only upgrade from PostgreSQL version %s and later.\n",
+ "9.2");
+
+ /* Only current PG version is supported as a target */
+ if (GET_MAJOR_VERSION(new_cluster.major_version) != GET_MAJOR_VERSION(PG_VERSION_NUM))
+ pg_fatal("This utility can only upgrade to PostgreSQL version %s.\n",
+ PG_MAJORVERSION);
+
+ /*
+ * We can't allow downgrading because we use the target pg_dump, and
+ * pg_dump cannot operate on newer database versions, only current and
+ * older versions.
+ */
+ if (old_cluster.major_version > new_cluster.major_version)
+ pg_fatal("This utility cannot be used to downgrade to older major PostgreSQL versions.\n");
+
+ /* Ensure binaries match the designated data directories */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) !=
+ GET_MAJOR_VERSION(old_cluster.bin_version))
+ pg_fatal("Old cluster data and binary directories are from different major versions.\n");
+ if (GET_MAJOR_VERSION(new_cluster.major_version) !=
+ GET_MAJOR_VERSION(new_cluster.bin_version))
+ pg_fatal("New cluster data and binary directories are from different major versions.\n");
+
+ check_ok();
+}
+
+
+void
+check_cluster_compatibility(bool live_check)
+{
+ /* get/check pg_control data of servers */
+ get_control_data(&old_cluster, live_check);
+ get_control_data(&new_cluster, false);
+ check_control_data(&old_cluster.controldata, &new_cluster.controldata);
+
+ if (live_check && old_cluster.port == new_cluster.port)
+ pg_fatal("When checking a live server, "
+ "the old and new port numbers must be different.\n");
+}
+
+
+/*
+ * check_locale_and_encoding()
+ *
+ * Check that locale and encoding of a database in the old and new clusters
+ * are compatible.
+ */
+static void
+check_locale_and_encoding(DbInfo *olddb, DbInfo *newdb)
+{
+ if (olddb->db_encoding != newdb->db_encoding)
+ pg_fatal("encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n",
+ olddb->db_name,
+ pg_encoding_to_char(olddb->db_encoding),
+ pg_encoding_to_char(newdb->db_encoding));
+ if (!equivalent_locale(LC_COLLATE, olddb->db_collate, newdb->db_collate))
+ pg_fatal("lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n",
+ olddb->db_name, olddb->db_collate, newdb->db_collate);
+ if (!equivalent_locale(LC_CTYPE, olddb->db_ctype, newdb->db_ctype))
+ pg_fatal("lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n",
+ olddb->db_name, olddb->db_ctype, newdb->db_ctype);
+ if (olddb->db_collprovider != newdb->db_collprovider)
+ pg_fatal("locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n",
+ olddb->db_name,
+ collprovider_name(olddb->db_collprovider),
+ collprovider_name(newdb->db_collprovider));
+ if ((olddb->db_iculocale == NULL && newdb->db_iculocale != NULL) ||
+ (olddb->db_iculocale != NULL && newdb->db_iculocale == NULL) ||
+ (olddb->db_iculocale != NULL && newdb->db_iculocale != NULL && strcmp(olddb->db_iculocale, newdb->db_iculocale) != 0))
+ pg_fatal("ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n",
+ olddb->db_name,
+ olddb->db_iculocale ? olddb->db_iculocale : "(null)",
+ newdb->db_iculocale ? newdb->db_iculocale : "(null)");
+}
+
+/*
+ * equivalent_locale()
+ *
+ * Best effort locale-name comparison. Return false if we are not 100% sure
+ * the locales are equivalent.
+ *
+ * Note: The encoding parts of the names are ignored. This function is
+ * currently used to compare locale names stored in pg_database, and
+ * pg_database contains a separate encoding field. That's compared directly
+ * in check_locale_and_encoding().
+ */
+static bool
+equivalent_locale(int category, const char *loca, const char *locb)
+{
+ const char *chara;
+ const char *charb;
+ char *canona;
+ char *canonb;
+ int lena;
+ int lenb;
+
+ /*
+ * If the names are equal, the locales are equivalent. Checking this first
+ * avoids calling setlocale() in the common case that the names are equal.
+ * That's a good thing, if setlocale() is buggy, for example.
+ */
+ if (pg_strcasecmp(loca, locb) == 0)
+ return true;
+
+ /*
+ * Not identical. Canonicalize both names, remove the encoding parts, and
+ * try again.
+ */
+ canona = get_canonical_locale_name(category, loca);
+ chara = strrchr(canona, '.');
+ lena = chara ? (chara - canona) : strlen(canona);
+
+ canonb = get_canonical_locale_name(category, locb);
+ charb = strrchr(canonb, '.');
+ lenb = charb ? (charb - canonb) : strlen(canonb);
+
+ if (lena == lenb && pg_strncasecmp(canona, canonb, lena) == 0)
+ {
+ pg_free(canona);
+ pg_free(canonb);
+ return true;
+ }
+
+ pg_free(canona);
+ pg_free(canonb);
+ return false;
+}
+
+
+static void
+check_new_cluster_is_empty(void)
+{
+ int dbnum;
+
+ for (dbnum = 0; dbnum < new_cluster.dbarr.ndbs; dbnum++)
+ {
+ int relnum;
+ RelInfoArr *rel_arr = &new_cluster.dbarr.dbs[dbnum].rel_arr;
+
+ for (relnum = 0; relnum < rel_arr->nrels;
+ relnum++)
+ {
+ /* pg_largeobject and its index should be skipped */
+ if (strcmp(rel_arr->rels[relnum].nspname, "pg_catalog") != 0)
+ pg_fatal("New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n",
+ new_cluster.dbarr.dbs[dbnum].db_name,
+ rel_arr->rels[relnum].nspname,
+ rel_arr->rels[relnum].relname);
+ }
+ }
+}
+
+/*
+ * Check that every database that already exists in the new cluster is
+ * compatible with the corresponding database in the old one.
+ */
+static void
+check_databases_are_compatible(void)
+{
+ int newdbnum;
+ int olddbnum;
+ DbInfo *newdbinfo;
+ DbInfo *olddbinfo;
+
+ for (newdbnum = 0; newdbnum < new_cluster.dbarr.ndbs; newdbnum++)
+ {
+ newdbinfo = &new_cluster.dbarr.dbs[newdbnum];
+
+ /* Find the corresponding database in the old cluster */
+ for (olddbnum = 0; olddbnum < old_cluster.dbarr.ndbs; olddbnum++)
+ {
+ olddbinfo = &old_cluster.dbarr.dbs[olddbnum];
+ if (strcmp(newdbinfo->db_name, olddbinfo->db_name) == 0)
+ {
+ check_locale_and_encoding(olddbinfo, newdbinfo);
+ break;
+ }
+ }
+ }
+}
+
+/*
+ * A previous run of pg_upgrade might have failed and the new cluster
+ * directory recreated, but they might have forgotten to remove
+ * the new cluster's tablespace directories. Therefore, check that
+ * new cluster tablespace directories do not already exist. If
+ * they do, it would cause an error while restoring global objects.
+ * This allows the failure to be detected at check time, rather than
+ * during schema restore.
+ */
+static void
+check_for_new_tablespace_dir(ClusterInfo *new_cluster)
+{
+ int tblnum;
+ char new_tablespace_dir[MAXPGPATH];
+
+ prep_status("Checking for new cluster tablespace directories");
+
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ {
+ struct stat statbuf;
+
+ snprintf(new_tablespace_dir, MAXPGPATH, "%s%s",
+ os_info.old_tablespaces[tblnum],
+ new_cluster->tablespace_suffix);
+
+ if (stat(new_tablespace_dir, &statbuf) == 0 || errno != ENOENT)
+ pg_fatal("new cluster tablespace directory already exists: \"%s\"\n",
+ new_tablespace_dir);
+ }
+
+ check_ok();
+}
+
+/*
+ * create_script_for_old_cluster_deletion()
+ *
+ * This is particularly useful for tablespace deletion.
+ */
+void
+create_script_for_old_cluster_deletion(char **deletion_script_file_name)
+{
+ FILE *script = NULL;
+ int tblnum;
+ char old_cluster_pgdata[MAXPGPATH],
+ new_cluster_pgdata[MAXPGPATH];
+
+ *deletion_script_file_name = psprintf("%sdelete_old_cluster.%s",
+ SCRIPT_PREFIX, SCRIPT_EXT);
+
+ strlcpy(old_cluster_pgdata, old_cluster.pgdata, MAXPGPATH);
+ canonicalize_path(old_cluster_pgdata);
+
+ strlcpy(new_cluster_pgdata, new_cluster.pgdata, MAXPGPATH);
+ canonicalize_path(new_cluster_pgdata);
+
+ /* Some people put the new data directory inside the old one. */
+ if (path_is_prefix_of_path(old_cluster_pgdata, new_cluster_pgdata))
+ {
+ pg_log(PG_WARNING,
+ "\nWARNING: new data directory should not be inside the old data directory, i.e. %s\n", old_cluster_pgdata);
+
+ /* Unlink file in case it is left over from a previous run. */
+ unlink(*deletion_script_file_name);
+ pg_free(*deletion_script_file_name);
+ *deletion_script_file_name = NULL;
+ return;
+ }
+
+ /*
+ * Some users (oddly) create tablespaces inside the cluster data
+ * directory. We can't create a proper old cluster delete script in that
+ * case.
+ */
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ {
+ char old_tablespace_dir[MAXPGPATH];
+
+ strlcpy(old_tablespace_dir, os_info.old_tablespaces[tblnum], MAXPGPATH);
+ canonicalize_path(old_tablespace_dir);
+ if (path_is_prefix_of_path(old_cluster_pgdata, old_tablespace_dir))
+ {
+ /* reproduce warning from CREATE TABLESPACE that is in the log */
+ pg_log(PG_WARNING,
+ "\nWARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s\n", old_tablespace_dir);
+
+ /* Unlink file in case it is left over from a previous run. */
+ unlink(*deletion_script_file_name);
+ pg_free(*deletion_script_file_name);
+ *deletion_script_file_name = NULL;
+ return;
+ }
+ }
+
+ prep_status("Creating script to delete old cluster");
+
+ if ((script = fopen_priv(*deletion_script_file_name, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ *deletion_script_file_name, strerror(errno));
+
+#ifndef WIN32
+ /* add shebang header */
+ fprintf(script, "#!/bin/sh\n\n");
+#endif
+
+ /* delete old cluster's default tablespace */
+ fprintf(script, RMDIR_CMD " %c%s%c\n", PATH_QUOTE,
+ fix_path_separator(old_cluster.pgdata), PATH_QUOTE);
+
+ /* delete old cluster's alternate tablespaces */
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ {
+ /*
+ * Do the old cluster's per-database directories share a directory
+ * with a new version-specific tablespace?
+ */
+ if (strlen(old_cluster.tablespace_suffix) == 0)
+ {
+ /* delete per-database directories */
+ int dbnum;
+
+ fprintf(script, "\n");
+
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ fprintf(script, RMDIR_CMD " %c%s%c%u%c\n", PATH_QUOTE,
+ fix_path_separator(os_info.old_tablespaces[tblnum]),
+ PATH_SEPARATOR, old_cluster.dbarr.dbs[dbnum].db_oid,
+ PATH_QUOTE);
+ }
+ else
+ {
+ char *suffix_path = pg_strdup(old_cluster.tablespace_suffix);
+
+ /*
+ * Simply delete the tablespace directory, which might be ".old"
+ * or a version-specific subdirectory.
+ */
+ fprintf(script, RMDIR_CMD " %c%s%s%c\n", PATH_QUOTE,
+ fix_path_separator(os_info.old_tablespaces[tblnum]),
+ fix_path_separator(suffix_path), PATH_QUOTE);
+ pfree(suffix_path);
+ }
+ }
+
+ fclose(script);
+
+#ifndef WIN32
+ if (chmod(*deletion_script_file_name, S_IRWXU) != 0)
+ pg_fatal("could not add execute permission to file \"%s\": %s\n",
+ *deletion_script_file_name, strerror(errno));
+#endif
+
+ check_ok();
+}
+
+
+/*
+ * check_is_install_user()
+ *
+ * Check we are the install user, and that the new cluster
+ * has no other users.
+ */
+static void
+check_is_install_user(ClusterInfo *cluster)
+{
+ PGresult *res;
+ PGconn *conn = connectToServer(cluster, "template1");
+
+ prep_status("Checking database user is the install user");
+
+ /* Can't use pg_authid because only superusers can view it. */
+ res = executeQueryOrDie(conn,
+ "SELECT rolsuper, oid "
+ "FROM pg_catalog.pg_roles "
+ "WHERE rolname = current_user "
+ "AND rolname !~ '^pg_'");
+
+ /*
+ * We only allow the install user in the new cluster (see comment below)
+ * and we preserve pg_authid.oid, so this must be the install user in the
+ * old cluster too.
+ */
+ if (PQntuples(res) != 1 ||
+ atooid(PQgetvalue(res, 0, 1)) != BOOTSTRAP_SUPERUSERID)
+ pg_fatal("database user \"%s\" is not the install user\n",
+ os_info.user);
+
+ PQclear(res);
+
+ res = executeQueryOrDie(conn,
+ "SELECT COUNT(*) "
+ "FROM pg_catalog.pg_roles "
+ "WHERE rolname !~ '^pg_'");
+
+ if (PQntuples(res) != 1)
+ pg_fatal("could not determine the number of users\n");
+
+ /*
+ * We only allow the install user in the new cluster because other defined
+ * users might match users defined in the old cluster and generate an
+ * error during pg_dump restore.
+ */
+ if (cluster == &new_cluster && atooid(PQgetvalue(res, 0, 0)) != 1)
+ pg_fatal("Only the install user can be defined in the new cluster.\n");
+
+ PQclear(res);
+
+ PQfinish(conn);
+
+ check_ok();
+}
+
+
+/*
+ * check_proper_datallowconn
+ *
+ * Ensure that all non-template0 databases allow connections since they
+ * otherwise won't be restored; and that template0 explicitly doesn't allow
+ * connections since it would make pg_dumpall --globals restore fail.
+ */
+static void
+check_proper_datallowconn(ClusterInfo *cluster)
+{
+ int dbnum;
+ PGconn *conn_template1;
+ PGresult *dbres;
+ int ntups;
+ int i_datname;
+ int i_datallowconn;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+ bool found = false;
+
+ prep_status("Checking database connection settings");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "databases_with_datallowconn_false.txt");
+
+ conn_template1 = connectToServer(cluster, "template1");
+
+ /* get database names */
+ dbres = executeQueryOrDie(conn_template1,
+ "SELECT datname, datallowconn "
+ "FROM pg_catalog.pg_database");
+
+ i_datname = PQfnumber(dbres, "datname");
+ i_datallowconn = PQfnumber(dbres, "datallowconn");
+
+ ntups = PQntuples(dbres);
+ for (dbnum = 0; dbnum < ntups; dbnum++)
+ {
+ char *datname = PQgetvalue(dbres, dbnum, i_datname);
+ char *datallowconn = PQgetvalue(dbres, dbnum, i_datallowconn);
+
+ if (strcmp(datname, "template0") == 0)
+ {
+ /* avoid restore failure when pg_dumpall tries to create template0 */
+ if (strcmp(datallowconn, "t") == 0)
+ pg_fatal("template0 must not allow connections, "
+ "i.e. its pg_database.datallowconn must be false\n");
+ }
+ else
+ {
+ /*
+ * avoid datallowconn == false databases from being skipped on
+ * restore
+ */
+ if (strcmp(datallowconn, "f") == 0)
+ {
+ found = true;
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ output_path, strerror(errno));
+
+ fprintf(script, "%s\n", datname);
+ }
+ }
+ }
+
+ PQclear(dbres);
+
+ PQfinish(conn_template1);
+
+ if (script)
+ fclose(script);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("All non-template0 databases must allow connections, i.e. their\n"
+ "pg_database.datallowconn must be true. Your installation contains\n"
+ "non-template0 databases with their pg_database.datallowconn set to\n"
+ "false. Consider allowing connection for all non-template0 databases\n"
+ "or drop the databases which do not allow connections. A list of\n"
+ "databases with the problem is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * check_for_prepared_transactions()
+ *
+ * Make sure there are no prepared transactions because the storage format
+ * might have changed.
+ */
+static void
+check_for_prepared_transactions(ClusterInfo *cluster)
+{
+ PGresult *res;
+ PGconn *conn = connectToServer(cluster, "template1");
+
+ prep_status("Checking for prepared transactions");
+
+ res = executeQueryOrDie(conn,
+ "SELECT * "
+ "FROM pg_catalog.pg_prepared_xacts");
+
+ if (PQntuples(res) != 0)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster contains prepared transactions\n");
+ else
+ pg_fatal("The target cluster contains prepared transactions\n");
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+
+ check_ok();
+}
+
+
+/*
+ * check_for_isn_and_int8_passing_mismatch()
+ *
+ * contrib/isn relies on data type int8, and in 8.4 int8 can now be passed
+ * by value. The schema dumps the CREATE TYPE PASSEDBYVALUE setting so
+ * it must match for the old and new servers.
+ */
+static void
+check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ bool found = false;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for contrib/isn with bigint-passing mismatch");
+
+ if (old_cluster.controldata.float8_pass_by_value ==
+ new_cluster.controldata.float8_pass_by_value)
+ {
+ /* no mismatch */
+ check_ok();
+ return;
+ }
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "contrib_isn_and_int8_pass_by_value.txt");
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_nspname,
+ i_proname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /* Find any functions coming from contrib/isn */
+ res = executeQueryOrDie(conn,
+ "SELECT n.nspname, p.proname "
+ "FROM pg_catalog.pg_proc p, "
+ " pg_catalog.pg_namespace n "
+ "WHERE p.pronamespace = n.oid AND "
+ " p.probin = '$libdir/isn'");
+
+ ntups = PQntuples(res);
+ i_nspname = PQfnumber(res, "nspname");
+ i_proname = PQfnumber(res, "proname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " %s.%s\n",
+ PQgetvalue(res, rowno, i_nspname),
+ PQgetvalue(res, rowno, i_proname));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains \"contrib/isn\" functions which rely on the\n"
+ "bigint data type. Your old and new clusters pass bigint values\n"
+ "differently so this cluster cannot currently be upgraded. You can\n"
+ "manually dump databases in the old cluster that use \"contrib/isn\"\n"
+ "facilities, drop them, perform the upgrade, and then restore them. A\n"
+ "list of the problem functions is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * Verify that no user defined postfix operators exist.
+ */
+static void
+check_for_user_defined_postfix_ops(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ bool found = false;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for user-defined postfix operators");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "postfix_ops.txt");
+
+ /* Find any user defined postfix operators */
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_oproid,
+ i_oprnsp,
+ i_oprname,
+ i_typnsp,
+ i_typname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /*
+ * The query below hardcodes FirstNormalObjectId as 16384 rather than
+ * interpolating that C #define into the query because, if that
+ * #define is ever changed, the cutoff we want to use is the value
+ * used by pre-version 14 servers, not that of some future version.
+ */
+ res = executeQueryOrDie(conn,
+ "SELECT o.oid AS oproid, "
+ " n.nspname AS oprnsp, "
+ " o.oprname, "
+ " tn.nspname AS typnsp, "
+ " t.typname "
+ "FROM pg_catalog.pg_operator o, "
+ " pg_catalog.pg_namespace n, "
+ " pg_catalog.pg_type t, "
+ " pg_catalog.pg_namespace tn "
+ "WHERE o.oprnamespace = n.oid AND "
+ " o.oprleft = t.oid AND "
+ " t.typnamespace = tn.oid AND "
+ " o.oprright = 0 AND "
+ " o.oid >= 16384");
+ ntups = PQntuples(res);
+ i_oproid = PQfnumber(res, "oproid");
+ i_oprnsp = PQfnumber(res, "oprnsp");
+ i_oprname = PQfnumber(res, "oprname");
+ i_typnsp = PQfnumber(res, "typnsp");
+ i_typname = PQfnumber(res, "typname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+ if (script == NULL &&
+ (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " (oid=%s) %s.%s (%s.%s, NONE)\n",
+ PQgetvalue(res, rowno, i_oproid),
+ PQgetvalue(res, rowno, i_oprnsp),
+ PQgetvalue(res, rowno, i_oprname),
+ PQgetvalue(res, rowno, i_typnsp),
+ PQgetvalue(res, rowno, i_typname));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains user-defined postfix operators, which are not\n"
+ "supported anymore. Consider dropping the postfix operators and replacing\n"
+ "them with prefix operators or function calls.\n"
+ "A list of user-defined postfix operators is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_incompatible_polymorphics()
+ *
+ * Make sure nothing is using old polymorphic functions with
+ * anyarray/anyelement rather than the new anycompatible variants.
+ */
+static void
+check_for_incompatible_polymorphics(ClusterInfo *cluster)
+{
+ PGresult *res;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+ PQExpBufferData old_polymorphics;
+
+ prep_status("Checking for incompatible polymorphic functions");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "incompatible_polymorphics.txt");
+
+ /* The set of problematic functions varies a bit in different versions */
+ initPQExpBuffer(&old_polymorphics);
+
+ appendPQExpBufferStr(&old_polymorphics,
+ "'array_append(anyarray,anyelement)'"
+ ", 'array_cat(anyarray,anyarray)'"
+ ", 'array_prepend(anyelement,anyarray)'");
+
+ if (GET_MAJOR_VERSION(cluster->major_version) >= 903)
+ appendPQExpBufferStr(&old_polymorphics,
+ ", 'array_remove(anyarray,anyelement)'"
+ ", 'array_replace(anyarray,anyelement,anyelement)'");
+
+ if (GET_MAJOR_VERSION(cluster->major_version) >= 905)
+ appendPQExpBufferStr(&old_polymorphics,
+ ", 'array_position(anyarray,anyelement)'"
+ ", 'array_position(anyarray,anyelement,integer)'"
+ ", 'array_positions(anyarray,anyelement)'"
+ ", 'width_bucket(anyelement,anyarray)'");
+
+ for (int dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ bool db_used = false;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+ int ntups;
+ int i_objkind,
+ i_objname;
+
+ /*
+ * The query below hardcodes FirstNormalObjectId as 16384 rather than
+ * interpolating that C #define into the query because, if that
+ * #define is ever changed, the cutoff we want to use is the value
+ * used by pre-version 14 servers, not that of some future version.
+ */
+ res = executeQueryOrDie(conn,
+ /* Aggregate transition functions */
+ "SELECT 'aggregate' AS objkind, p.oid::regprocedure::text AS objname "
+ "FROM pg_proc AS p "
+ "JOIN pg_aggregate AS a ON a.aggfnoid=p.oid "
+ "JOIN pg_proc AS transfn ON transfn.oid=a.aggtransfn "
+ "WHERE p.oid >= 16384 "
+ "AND a.aggtransfn = ANY(ARRAY[%s]::regprocedure[]) "
+ "AND a.aggtranstype = ANY(ARRAY['anyarray', 'anyelement']::regtype[]) "
+
+ /* Aggregate final functions */
+ "UNION ALL "
+ "SELECT 'aggregate' AS objkind, p.oid::regprocedure::text AS objname "
+ "FROM pg_proc AS p "
+ "JOIN pg_aggregate AS a ON a.aggfnoid=p.oid "
+ "JOIN pg_proc AS finalfn ON finalfn.oid=a.aggfinalfn "
+ "WHERE p.oid >= 16384 "
+ "AND a.aggfinalfn = ANY(ARRAY[%s]::regprocedure[]) "
+ "AND a.aggtranstype = ANY(ARRAY['anyarray', 'anyelement']::regtype[]) "
+
+ /* Operators */
+ "UNION ALL "
+ "SELECT 'operator' AS objkind, op.oid::regoperator::text AS objname "
+ "FROM pg_operator AS op "
+ "WHERE op.oid >= 16384 "
+ "AND oprcode = ANY(ARRAY[%s]::regprocedure[]) "
+ "AND oprleft = ANY(ARRAY['anyarray', 'anyelement']::regtype[]);",
+ old_polymorphics.data,
+ old_polymorphics.data,
+ old_polymorphics.data);
+
+ ntups = PQntuples(res);
+
+ i_objkind = PQfnumber(res, "objkind");
+ i_objname = PQfnumber(res, "objname");
+
+ for (int rowno = 0; rowno < ntups; rowno++)
+ {
+ if (script == NULL &&
+ (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+
+ fprintf(script, " %s: %s\n",
+ PQgetvalue(res, rowno, i_objkind),
+ PQgetvalue(res, rowno, i_objname));
+ }
+
+ PQclear(res);
+ PQfinish(conn);
+ }
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains user-defined objects that refer to internal\n"
+ "polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+ "These user-defined objects must be dropped before upgrading and restored\n"
+ "afterwards, changing them to refer to the new corresponding functions with\n"
+ "arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+ "A list of the problematic objects is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+
+ termPQExpBuffer(&old_polymorphics);
+}
+
+/*
+ * Verify that no tables are declared WITH OIDS.
+ */
+static void
+check_for_tables_with_oids(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ bool found = false;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for tables WITH OIDS");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_with_oids.txt");
+
+ /* Find any tables declared WITH OIDS */
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_nspname,
+ i_relname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ res = executeQueryOrDie(conn,
+ "SELECT n.nspname, c.relname "
+ "FROM pg_catalog.pg_class c, "
+ " pg_catalog.pg_namespace n "
+ "WHERE c.relnamespace = n.oid AND "
+ " c.relhasoids AND"
+ " n.nspname NOT IN ('pg_catalog')");
+
+ ntups = PQntuples(res);
+ i_nspname = PQfnumber(res, "nspname");
+ i_relname = PQfnumber(res, "relname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " %s.%s\n",
+ PQgetvalue(res, rowno, i_nspname),
+ PQgetvalue(res, rowno, i_relname));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains tables declared WITH OIDS, which is not\n"
+ "supported anymore. Consider removing the oid column using\n"
+ " ALTER TABLE ... SET WITHOUT OIDS;\n"
+ "A list of tables with the problem is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * check_for_composite_data_type_usage()
+ * Check for system-defined composite types used in user tables.
+ *
+ * The OIDs of rowtypes of system catalogs and information_schema views
+ * can change across major versions; unlike user-defined types, we have
+ * no mechanism for forcing them to be the same in the new cluster.
+ * Hence, if any user table uses one, that's problematic for pg_upgrade.
+ */
+static void
+check_for_composite_data_type_usage(ClusterInfo *cluster)
+{
+ bool found;
+ Oid firstUserOid;
+ char output_path[MAXPGPATH];
+ char *base_query;
+
+ prep_status("Checking for system-defined composite types in user tables");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_composite.txt");
+
+ /*
+ * Look for composite types that were made during initdb *or* belong to
+ * information_schema; that's important in case information_schema was
+ * dropped and reloaded.
+ *
+ * The cutoff OID here should match the source cluster's value of
+ * FirstNormalObjectId. We hardcode it rather than using that C #define
+ * because, if that #define is ever changed, our own version's value is
+ * NOT what to use. Eventually we may need a test on the source cluster's
+ * version to select the correct value.
+ */
+ firstUserOid = 16384;
+
+ base_query = psprintf("SELECT t.oid FROM pg_catalog.pg_type t "
+ "LEFT JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid "
+ " WHERE typtype = 'c' AND (t.oid < %u OR nspname = 'information_schema')",
+ firstUserOid);
+
+ found = check_for_data_types_usage(cluster, base_query, output_path);
+
+ free(base_query);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains system-defined composite type(s) in user tables.\n"
+ "These type OIDs are not stable across PostgreSQL versions,\n"
+ "so this cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_reg_data_type_usage()
+ * pg_upgrade only preserves these system values:
+ * pg_class.oid
+ * pg_type.oid
+ * pg_enum.oid
+ *
+ * Many of the reg* data types reference system catalog info that is
+ * not preserved, and hence these data types cannot be used in user
+ * tables upgraded by pg_upgrade.
+ */
+static void
+check_for_reg_data_type_usage(ClusterInfo *cluster)
+{
+ bool found;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for reg* data types in user tables");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_reg.txt");
+
+ /*
+ * Note: older servers will not have all of these reg* types, so we have
+ * to write the query like this rather than depending on casts to regtype.
+ */
+ found = check_for_data_types_usage(cluster,
+ "SELECT oid FROM pg_catalog.pg_type t "
+ "WHERE t.typnamespace = "
+ " (SELECT oid FROM pg_catalog.pg_namespace "
+ " WHERE nspname = 'pg_catalog') "
+ " AND t.typname IN ( "
+ /* pg_class.oid is preserved, so 'regclass' is OK */
+ " 'regcollation', "
+ " 'regconfig', "
+ " 'regdictionary', "
+ " 'regnamespace', "
+ " 'regoper', "
+ " 'regoperator', "
+ " 'regproc', "
+ " 'regprocedure' "
+ /* pg_authid.oid is preserved, so 'regrole' is OK */
+ /* pg_type.oid is (mostly) preserved, so 'regtype' is OK */
+ " )",
+ output_path);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains one of the reg* data types in user tables.\n"
+ "These data types reference system OIDs that are not preserved by\n"
+ "pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_removed_data_type_usage
+ *
+ * Check for in-core data types that have been removed. Callers know
+ * the exact list.
+ */
+static void
+check_for_removed_data_type_usage(ClusterInfo *cluster, const char *version,
+ const char *datatype)
+{
+ char output_path[MAXPGPATH];
+ char typename[NAMEDATALEN];
+
+ prep_status("Checking for removed \"%s\" data type in user tables",
+ datatype);
+
+ snprintf(output_path, sizeof(output_path), "tables_using_%s.txt",
+ datatype);
+ snprintf(typename, sizeof(typename), "pg_catalog.%s", datatype);
+
+ if (check_for_data_type_usage(cluster, typename, output_path))
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains the \"%s\" data type in user tables.\n"
+ "The \"%s\" type has been removed in PostgreSQL version %s,\n"
+ "so this cluster cannot currently be upgraded. You can drop the\n"
+ "problem columns, or change them to another data type, and restart\n"
+ "the upgrade. A list of the problem columns is in the file:\n"
+ " %s\n\n", datatype, datatype, version, output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * check_for_jsonb_9_4_usage()
+ *
+ * JSONB changed its storage format during 9.4 beta, so check for it.
+ */
+static void
+check_for_jsonb_9_4_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for incompatible \"jsonb\" data type");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_jsonb.txt");
+
+ if (check_for_data_type_usage(cluster, "pg_catalog.jsonb", output_path))
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains the \"jsonb\" data type in user tables.\n"
+ "The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+ "cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_pg_role_prefix()
+ *
+ * Versions older than 9.6 should not have any pg_* roles
+ */
+static void
+check_for_pg_role_prefix(ClusterInfo *cluster)
+{
+ PGresult *res;
+ PGconn *conn = connectToServer(cluster, "template1");
+
+ prep_status("Checking for roles starting with \"pg_\"");
+
+ res = executeQueryOrDie(conn,
+ "SELECT * "
+ "FROM pg_catalog.pg_roles "
+ "WHERE rolname ~ '^pg_'");
+
+ if (PQntuples(res) != 0)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster contains roles starting with \"pg_\"\n");
+ else
+ pg_fatal("The target cluster contains roles starting with \"pg_\"\n");
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+
+ check_ok();
+}
+
+/*
+ * Verify that no user-defined encoding conversions exist.
+ */
+static void
+check_for_user_defined_encoding_conversions(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ bool found = false;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for user-defined encoding conversions");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "encoding_conversions.txt");
+
+ /* Find any user defined encoding conversions */
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_conoid,
+ i_conname,
+ i_nspname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /*
+ * The query below hardcodes FirstNormalObjectId as 16384 rather than
+ * interpolating that C #define into the query because, if that
+ * #define is ever changed, the cutoff we want to use is the value
+ * used by pre-version 14 servers, not that of some future version.
+ */
+ res = executeQueryOrDie(conn,
+ "SELECT c.oid as conoid, c.conname, n.nspname "
+ "FROM pg_catalog.pg_conversion c, "
+ " pg_catalog.pg_namespace n "
+ "WHERE c.connamespace = n.oid AND "
+ " c.oid >= 16384");
+ ntups = PQntuples(res);
+ i_conoid = PQfnumber(res, "conoid");
+ i_conname = PQfnumber(res, "conname");
+ i_nspname = PQfnumber(res, "nspname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+ if (script == NULL &&
+ (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " (oid=%s) %s.%s\n",
+ PQgetvalue(res, rowno, i_conoid),
+ PQgetvalue(res, rowno, i_nspname),
+ PQgetvalue(res, rowno, i_conname));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains user-defined encoding conversions.\n"
+ "The conversion function parameters changed in PostgreSQL version 14\n"
+ "so this cluster cannot currently be upgraded. You can remove the\n"
+ "encoding conversions in the old cluster and restart the upgrade.\n"
+ "A list of user-defined encoding conversions is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * get_canonical_locale_name
+ *
+ * Send the locale name to the system, and hope we get back a canonical
+ * version. This should match the backend's check_locale() function.
+ */
+static char *
+get_canonical_locale_name(int category, const char *locale)
+{
+ char *save;
+ char *res;
+
+ /* get the current setting, so we can restore it. */
+ save = setlocale(category, NULL);
+ if (!save)
+ pg_fatal("failed to get the current locale\n");
+
+ /* 'save' may be pointing at a modifiable scratch variable, so copy it. */
+ save = pg_strdup(save);
+
+ /* set the locale with setlocale, to see if it accepts it. */
+ res = setlocale(category, locale);
+
+ if (!res)
+ pg_fatal("failed to get system locale name for \"%s\"\n", locale);
+
+ res = pg_strdup(res);
+
+ /* restore old value. */
+ if (!setlocale(category, save))
+ pg_fatal("failed to restore old locale \"%s\"\n", save);
+
+ pg_free(save);
+
+ return res;
+}
diff --git a/src/bin/pg_upgrade/controldata.c b/src/bin/pg_upgrade/controldata.c
new file mode 100644
index 0000000..0ee138a
--- /dev/null
+++ b/src/bin/pg_upgrade/controldata.c
@@ -0,0 +1,723 @@
+/*
+ * controldata.c
+ *
+ * controldata functions
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/controldata.c
+ */
+
+#include "postgres_fe.h"
+
+#include <ctype.h>
+
+#include "pg_upgrade.h"
+
+/*
+ * get_control_data()
+ *
+ * gets pg_control information in "ctrl". Assumes that bindir and
+ * datadir are valid absolute paths to postgresql bin and pgdata
+ * directories respectively *and* pg_resetwal is version compatible
+ * with datadir. The main purpose of this function is to get pg_control
+ * data in a version independent manner.
+ *
+ * The approach taken here is to invoke pg_resetwal with -n option
+ * and then pipe its output. With little string parsing we get the
+ * pg_control data. pg_resetwal cannot be run while the server is running
+ * so we use pg_controldata; pg_controldata doesn't provide all the fields
+ * we need to actually perform the upgrade, but it provides enough for
+ * check mode. We do not implement pg_resetwal -n because it is hard to
+ * return valid xid data for a running server.
+ */
+void
+get_control_data(ClusterInfo *cluster, bool live_check)
+{
+ char cmd[MAXPGPATH];
+ char bufin[MAX_STRING];
+ FILE *output;
+ char *p;
+ bool got_tli = false;
+ bool got_log_id = false;
+ bool got_log_seg = false;
+ bool got_xid = false;
+ bool got_oid = false;
+ bool got_multi = false;
+ bool got_oldestmulti = false;
+ bool got_oldestxid = false;
+ bool got_mxoff = false;
+ bool got_nextxlogfile = false;
+ bool got_float8_pass_by_value = false;
+ bool got_align = false;
+ bool got_blocksz = false;
+ bool got_largesz = false;
+ bool got_walsz = false;
+ bool got_walseg = false;
+ bool got_ident = false;
+ bool got_index = false;
+ bool got_toast = false;
+ bool got_large_object = false;
+ bool got_date_is_int = false;
+ bool got_data_checksum_version = false;
+ bool got_cluster_state = false;
+ char *lc_collate = NULL;
+ char *lc_ctype = NULL;
+ char *lc_monetary = NULL;
+ char *lc_numeric = NULL;
+ char *lc_time = NULL;
+ char *lang = NULL;
+ char *language = NULL;
+ char *lc_all = NULL;
+ char *lc_messages = NULL;
+ uint32 tli = 0;
+ uint32 logid = 0;
+ uint32 segno = 0;
+ char *resetwal_bin;
+
+
+ /*
+ * Because we test the pg_resetwal output as strings, it has to be in
+ * English. Copied from pg_regress.c.
+ */
+ if (getenv("LC_COLLATE"))
+ lc_collate = pg_strdup(getenv("LC_COLLATE"));
+ if (getenv("LC_CTYPE"))
+ lc_ctype = pg_strdup(getenv("LC_CTYPE"));
+ if (getenv("LC_MONETARY"))
+ lc_monetary = pg_strdup(getenv("LC_MONETARY"));
+ if (getenv("LC_NUMERIC"))
+ lc_numeric = pg_strdup(getenv("LC_NUMERIC"));
+ if (getenv("LC_TIME"))
+ lc_time = pg_strdup(getenv("LC_TIME"));
+ if (getenv("LANG"))
+ lang = pg_strdup(getenv("LANG"));
+ if (getenv("LANGUAGE"))
+ language = pg_strdup(getenv("LANGUAGE"));
+ if (getenv("LC_ALL"))
+ lc_all = pg_strdup(getenv("LC_ALL"));
+ if (getenv("LC_MESSAGES"))
+ lc_messages = pg_strdup(getenv("LC_MESSAGES"));
+
+ unsetenv("LC_COLLATE");
+ unsetenv("LC_CTYPE");
+ unsetenv("LC_MONETARY");
+ unsetenv("LC_NUMERIC");
+ unsetenv("LC_TIME");
+#ifndef WIN32
+ unsetenv("LANG");
+#else
+ /* On Windows the default locale may not be English, so force it */
+ setenv("LANG", "en", 1);
+#endif
+ unsetenv("LANGUAGE");
+ unsetenv("LC_ALL");
+ setenv("LC_MESSAGES", "C", 1);
+
+ /*
+ * Check for clean shutdown
+ */
+ if (!live_check || cluster == &new_cluster)
+ {
+ /* only pg_controldata outputs the cluster state */
+ snprintf(cmd, sizeof(cmd), "\"%s/pg_controldata\" \"%s\"",
+ cluster->bindir, cluster->pgdata);
+ fflush(stdout);
+ fflush(stderr);
+
+ if ((output = popen(cmd, "r")) == NULL)
+ pg_fatal("could not get control data using %s: %s\n",
+ cmd, strerror(errno));
+
+ /* we have the result of cmd in "output". so parse it line by line now */
+ while (fgets(bufin, sizeof(bufin), output))
+ {
+ if ((p = strstr(bufin, "Database cluster state:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: database cluster state problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+
+ /*
+ * We checked earlier for a postmaster lock file, and if we
+ * found one, we tried to start/stop the server to replay the
+ * WAL. However, pg_ctl -m immediate doesn't leave a lock
+ * file, but does require WAL replay, so we check here that
+ * the server was shut down cleanly, from the controldata
+ * perspective.
+ */
+ /* remove leading spaces */
+ while (*p == ' ')
+ p++;
+ if (strcmp(p, "shut down in recovery\n") == 0)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n");
+ else
+ pg_fatal("The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n");
+ }
+ else if (strcmp(p, "shut down\n") != 0)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster was not shut down cleanly.\n");
+ else
+ pg_fatal("The target cluster was not shut down cleanly.\n");
+ }
+ got_cluster_state = true;
+ }
+ }
+
+ pclose(output);
+
+ if (!got_cluster_state)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster lacks cluster state information:\n");
+ else
+ pg_fatal("The target cluster lacks cluster state information:\n");
+ }
+ }
+
+ /* pg_resetxlog has been renamed to pg_resetwal in version 10 */
+ if (GET_MAJOR_VERSION(cluster->bin_version) <= 906)
+ resetwal_bin = "pg_resetxlog\" -n";
+ else
+ resetwal_bin = "pg_resetwal\" -n";
+ snprintf(cmd, sizeof(cmd), "\"%s/%s \"%s\"",
+ cluster->bindir,
+ live_check ? "pg_controldata\"" : resetwal_bin,
+ cluster->pgdata);
+ fflush(stdout);
+ fflush(stderr);
+
+ if ((output = popen(cmd, "r")) == NULL)
+ pg_fatal("could not get control data using %s: %s\n",
+ cmd, strerror(errno));
+
+ /* Only in <= 9.2 */
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 902)
+ {
+ cluster->controldata.data_checksum_version = 0;
+ got_data_checksum_version = true;
+ }
+
+ /* we have the result of cmd in "output". so parse it line by line now */
+ while (fgets(bufin, sizeof(bufin), output))
+ {
+ pg_log(PG_VERBOSE, "%s", bufin);
+
+ if ((p = strstr(bufin, "pg_control version number:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: pg_resetwal problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.ctrl_ver = str2uint(p);
+ }
+ else if ((p = strstr(bufin, "Catalog version number:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.cat_ver = str2uint(p);
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's TimeLineID:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ tli = str2uint(p);
+ got_tli = true;
+ }
+ else if ((p = strstr(bufin, "First log file ID after reset:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ logid = str2uint(p);
+ got_log_id = true;
+ }
+ else if ((p = strstr(bufin, "First log file segment after reset:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ segno = str2uint(p);
+ got_log_seg = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's NextXID:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_nxtepoch = str2uint(p);
+
+ /*
+ * Delimiter changed from '/' to ':' in 9.6. We don't test for
+ * the catalog version of the change because the catalog version
+ * is pulled from pg_controldata too, and it isn't worth adding an
+ * order dependency for this --- we just check the string.
+ */
+ if (strchr(p, '/') != NULL)
+ p = strchr(p, '/');
+ else if (GET_MAJOR_VERSION(cluster->major_version) >= 906)
+ p = strchr(p, ':');
+ else
+ p = NULL;
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove '/' or ':' char */
+ cluster->controldata.chkpnt_nxtxid = str2uint(p);
+ got_xid = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's NextOID:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_nxtoid = str2uint(p);
+ got_oid = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's NextMultiXactId:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_nxtmulti = str2uint(p);
+ got_multi = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's oldestXID:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_oldstxid = str2uint(p);
+ got_oldestxid = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's oldestMultiXid:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_oldstMulti = str2uint(p);
+ got_oldestmulti = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's NextMultiOffset:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_nxtmxoff = str2uint(p);
+ got_mxoff = true;
+ }
+ else if ((p = strstr(bufin, "First log segment after reset:")) != NULL)
+ {
+ /* Skip the colon and any whitespace after it */
+ p = strchr(p, ':');
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+ p = strpbrk(p, "01234567890ABCDEF");
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ /* Make sure it looks like a valid WAL file name */
+ if (strspn(p, "0123456789ABCDEF") != 24)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ strlcpy(cluster->controldata.nextxlogfile, p, 25);
+ got_nextxlogfile = true;
+ }
+ else if ((p = strstr(bufin, "Float8 argument passing:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ /* used later for contrib check */
+ cluster->controldata.float8_pass_by_value = strstr(p, "by value") != NULL;
+ got_float8_pass_by_value = true;
+ }
+ else if ((p = strstr(bufin, "Maximum data alignment:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.align = str2uint(p);
+ got_align = true;
+ }
+ else if ((p = strstr(bufin, "Database block size:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.blocksz = str2uint(p);
+ got_blocksz = true;
+ }
+ else if ((p = strstr(bufin, "Blocks per segment of large relation:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.largesz = str2uint(p);
+ got_largesz = true;
+ }
+ else if ((p = strstr(bufin, "WAL block size:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.walsz = str2uint(p);
+ got_walsz = true;
+ }
+ else if ((p = strstr(bufin, "Bytes per WAL segment:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.walseg = str2uint(p);
+ got_walseg = true;
+ }
+ else if ((p = strstr(bufin, "Maximum length of identifiers:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.ident = str2uint(p);
+ got_ident = true;
+ }
+ else if ((p = strstr(bufin, "Maximum columns in an index:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.index = str2uint(p);
+ got_index = true;
+ }
+ else if ((p = strstr(bufin, "Maximum size of a TOAST chunk:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.toast = str2uint(p);
+ got_toast = true;
+ }
+ else if ((p = strstr(bufin, "Size of a large-object chunk:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.large_object = str2uint(p);
+ got_large_object = true;
+ }
+ else if ((p = strstr(bufin, "Date/time type storage:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.date_is_int = strstr(p, "64-bit integers") != NULL;
+ got_date_is_int = true;
+ }
+ else if ((p = strstr(bufin, "checksum")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem\n", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.data_checksum_version = str2uint(p);
+ got_data_checksum_version = true;
+ }
+ }
+
+ pclose(output);
+
+ /*
+ * Restore environment variables. Note all but LANG and LC_MESSAGES were
+ * unset above.
+ */
+ if (lc_collate)
+ setenv("LC_COLLATE", lc_collate, 1);
+ if (lc_ctype)
+ setenv("LC_CTYPE", lc_ctype, 1);
+ if (lc_monetary)
+ setenv("LC_MONETARY", lc_monetary, 1);
+ if (lc_numeric)
+ setenv("LC_NUMERIC", lc_numeric, 1);
+ if (lc_time)
+ setenv("LC_TIME", lc_time, 1);
+ if (lang)
+ setenv("LANG", lang, 1);
+ else
+ unsetenv("LANG");
+ if (language)
+ setenv("LANGUAGE", language, 1);
+ if (lc_all)
+ setenv("LC_ALL", lc_all, 1);
+ if (lc_messages)
+ setenv("LC_MESSAGES", lc_messages, 1);
+ else
+ unsetenv("LC_MESSAGES");
+
+ pg_free(lc_collate);
+ pg_free(lc_ctype);
+ pg_free(lc_monetary);
+ pg_free(lc_numeric);
+ pg_free(lc_time);
+ pg_free(lang);
+ pg_free(language);
+ pg_free(lc_all);
+ pg_free(lc_messages);
+
+ /*
+ * Before 9.3, pg_resetwal reported the xlogid and segno of the first log
+ * file after reset as separate lines. Starting with 9.3, it reports the
+ * WAL file name. If the old cluster is older than 9.3, we construct the
+ * WAL file name from the xlogid and segno.
+ */
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 902)
+ {
+ if (got_tli && got_log_id && got_log_seg)
+ {
+ snprintf(cluster->controldata.nextxlogfile, 25, "%08X%08X%08X",
+ tli, logid, segno);
+ got_nextxlogfile = true;
+ }
+ }
+
+ /* verify that we got all the mandatory pg_control data */
+ if (!got_xid || !got_oid ||
+ !got_multi || !got_oldestxid ||
+ (!got_oldestmulti &&
+ cluster->controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER) ||
+ !got_mxoff || (!live_check && !got_nextxlogfile) ||
+ !got_float8_pass_by_value || !got_align || !got_blocksz ||
+ !got_largesz || !got_walsz || !got_walseg || !got_ident ||
+ !got_index || !got_toast ||
+ (!got_large_object &&
+ cluster->controldata.ctrl_ver >= LARGE_OBJECT_SIZE_PG_CONTROL_VER) ||
+ !got_date_is_int || !got_data_checksum_version)
+ {
+ if (cluster == &old_cluster)
+ pg_log(PG_REPORT,
+ "The source cluster lacks some required control information:\n");
+ else
+ pg_log(PG_REPORT,
+ "The target cluster lacks some required control information:\n");
+
+ if (!got_xid)
+ pg_log(PG_REPORT, " checkpoint next XID\n");
+
+ if (!got_oid)
+ pg_log(PG_REPORT, " latest checkpoint next OID\n");
+
+ if (!got_multi)
+ pg_log(PG_REPORT, " latest checkpoint next MultiXactId\n");
+
+ if (!got_oldestmulti &&
+ cluster->controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
+ pg_log(PG_REPORT, " latest checkpoint oldest MultiXactId\n");
+
+ if (!got_oldestxid)
+ pg_log(PG_REPORT, " latest checkpoint oldestXID\n");
+
+ if (!got_mxoff)
+ pg_log(PG_REPORT, " latest checkpoint next MultiXactOffset\n");
+
+ if (!live_check && !got_nextxlogfile)
+ pg_log(PG_REPORT, " first WAL segment after reset\n");
+
+ if (!got_float8_pass_by_value)
+ pg_log(PG_REPORT, " float8 argument passing method\n");
+
+ if (!got_align)
+ pg_log(PG_REPORT, " maximum alignment\n");
+
+ if (!got_blocksz)
+ pg_log(PG_REPORT, " block size\n");
+
+ if (!got_largesz)
+ pg_log(PG_REPORT, " large relation segment size\n");
+
+ if (!got_walsz)
+ pg_log(PG_REPORT, " WAL block size\n");
+
+ if (!got_walseg)
+ pg_log(PG_REPORT, " WAL segment size\n");
+
+ if (!got_ident)
+ pg_log(PG_REPORT, " maximum identifier length\n");
+
+ if (!got_index)
+ pg_log(PG_REPORT, " maximum number of indexed columns\n");
+
+ if (!got_toast)
+ pg_log(PG_REPORT, " maximum TOAST chunk size\n");
+
+ if (!got_large_object &&
+ cluster->controldata.ctrl_ver >= LARGE_OBJECT_SIZE_PG_CONTROL_VER)
+ pg_log(PG_REPORT, " large-object chunk size\n");
+
+ if (!got_date_is_int)
+ pg_log(PG_REPORT, " dates/times are integers?\n");
+
+ /* value added in Postgres 9.3 */
+ if (!got_data_checksum_version)
+ pg_log(PG_REPORT, " data checksum version\n");
+
+ pg_fatal("Cannot continue without required control information, terminating\n");
+ }
+}
+
+
+/*
+ * check_control_data()
+ *
+ * check to make sure the control data settings are compatible
+ */
+void
+check_control_data(ControlData *oldctrl,
+ ControlData *newctrl)
+{
+ if (oldctrl->align == 0 || oldctrl->align != newctrl->align)
+ pg_fatal("old and new pg_controldata alignments are invalid or do not match\n"
+ "Likely one cluster is a 32-bit install, the other 64-bit\n");
+
+ if (oldctrl->blocksz == 0 || oldctrl->blocksz != newctrl->blocksz)
+ pg_fatal("old and new pg_controldata block sizes are invalid or do not match\n");
+
+ if (oldctrl->largesz == 0 || oldctrl->largesz != newctrl->largesz)
+ pg_fatal("old and new pg_controldata maximum relation segment sizes are invalid or do not match\n");
+
+ if (oldctrl->walsz == 0 || oldctrl->walsz != newctrl->walsz)
+ pg_fatal("old and new pg_controldata WAL block sizes are invalid or do not match\n");
+
+ if (oldctrl->walseg == 0 || oldctrl->walseg != newctrl->walseg)
+ pg_fatal("old and new pg_controldata WAL segment sizes are invalid or do not match\n");
+
+ if (oldctrl->ident == 0 || oldctrl->ident != newctrl->ident)
+ pg_fatal("old and new pg_controldata maximum identifier lengths are invalid or do not match\n");
+
+ if (oldctrl->index == 0 || oldctrl->index != newctrl->index)
+ pg_fatal("old and new pg_controldata maximum indexed columns are invalid or do not match\n");
+
+ if (oldctrl->toast == 0 || oldctrl->toast != newctrl->toast)
+ pg_fatal("old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n");
+
+ /* large_object added in 9.5, so it might not exist in the old cluster */
+ if (oldctrl->large_object != 0 &&
+ oldctrl->large_object != newctrl->large_object)
+ pg_fatal("old and new pg_controldata large-object chunk sizes are invalid or do not match\n");
+
+ if (oldctrl->date_is_int != newctrl->date_is_int)
+ pg_fatal("old and new pg_controldata date/time storage types do not match\n");
+
+ /*
+ * float8_pass_by_value does not need to match, but is used in
+ * check_for_isn_and_int8_passing_mismatch().
+ */
+
+ /*
+ * We might eventually allow upgrades from checksum to no-checksum
+ * clusters.
+ */
+ if (oldctrl->data_checksum_version == 0 &&
+ newctrl->data_checksum_version != 0)
+ pg_fatal("old cluster does not use data checksums but the new one does\n");
+ else if (oldctrl->data_checksum_version != 0 &&
+ newctrl->data_checksum_version == 0)
+ pg_fatal("old cluster uses data checksums but the new one does not\n");
+ else if (oldctrl->data_checksum_version != newctrl->data_checksum_version)
+ pg_fatal("old and new cluster pg_controldata checksum versions do not match\n");
+}
+
+
+void
+disable_old_cluster(void)
+{
+ char old_path[MAXPGPATH],
+ new_path[MAXPGPATH];
+
+ /* rename pg_control so old server cannot be accidentally started */
+ prep_status("Adding \".old\" suffix to old global/pg_control");
+
+ snprintf(old_path, sizeof(old_path), "%s/global/pg_control", old_cluster.pgdata);
+ snprintf(new_path, sizeof(new_path), "%s/global/pg_control.old", old_cluster.pgdata);
+ if (pg_mv_file(old_path, new_path) != 0)
+ pg_fatal("Unable to rename %s to %s.\n", old_path, new_path);
+ check_ok();
+
+ pg_log(PG_REPORT, "\n"
+ "If you want to start the old cluster, you will need to remove\n"
+ "the \".old\" suffix from %s/global/pg_control.old.\n"
+ "Because \"link\" mode was used, the old cluster cannot be safely\n"
+ "started once the new cluster has been started.\n\n", old_cluster.pgdata);
+}
diff --git a/src/bin/pg_upgrade/dump.c b/src/bin/pg_upgrade/dump.c
new file mode 100644
index 0000000..29b9e44
--- /dev/null
+++ b/src/bin/pg_upgrade/dump.c
@@ -0,0 +1,71 @@
+/*
+ * dump.c
+ *
+ * dump functions
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/dump.c
+ */
+
+#include "postgres_fe.h"
+
+#include "fe_utils/string_utils.h"
+#include "pg_upgrade.h"
+
+void
+generate_old_dump(void)
+{
+ int dbnum;
+
+ prep_status("Creating dump of global objects");
+
+ /* run new pg_dumpall binary for globals */
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_dumpall\" %s --globals-only --quote-all-identifiers "
+ "--binary-upgrade %s -f \"%s/%s\"",
+ new_cluster.bindir, cluster_conn_opts(&old_cluster),
+ log_opts.verbose ? "--verbose" : "",
+ log_opts.dumpdir,
+ GLOBALS_DUMP_FILE);
+ check_ok();
+
+ prep_status_progress("Creating dump of database schemas");
+
+ /* create per-db dump files */
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ char sql_file_name[MAXPGPATH],
+ log_file_name[MAXPGPATH];
+ DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum];
+ PQExpBufferData connstr,
+ escaped_connstr;
+
+ initPQExpBuffer(&connstr);
+ appendPQExpBufferStr(&connstr, "dbname=");
+ appendConnStrVal(&connstr, old_db->db_name);
+ initPQExpBuffer(&escaped_connstr);
+ appendShellString(&escaped_connstr, connstr.data);
+ termPQExpBuffer(&connstr);
+
+ pg_log(PG_STATUS, "%s", old_db->db_name);
+ snprintf(sql_file_name, sizeof(sql_file_name), DB_DUMP_FILE_MASK, old_db->db_oid);
+ snprintf(log_file_name, sizeof(log_file_name), DB_DUMP_LOG_FILE_MASK, old_db->db_oid);
+
+ parallel_exec_prog(log_file_name, NULL,
+ "\"%s/pg_dump\" %s --schema-only --quote-all-identifiers "
+ "--binary-upgrade --format=custom %s --file=\"%s/%s\" %s",
+ new_cluster.bindir, cluster_conn_opts(&old_cluster),
+ log_opts.verbose ? "--verbose" : "",
+ log_opts.dumpdir,
+ sql_file_name, escaped_connstr.data);
+
+ termPQExpBuffer(&escaped_connstr);
+ }
+
+ /* reap all children */
+ while (reap_child(true) == true)
+ ;
+
+ end_progress_output();
+ check_ok();
+}
diff --git a/src/bin/pg_upgrade/exec.c b/src/bin/pg_upgrade/exec.c
new file mode 100644
index 0000000..fadeea1
--- /dev/null
+++ b/src/bin/pg_upgrade/exec.c
@@ -0,0 +1,455 @@
+/*
+ * exec.c
+ *
+ * execution functions
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/exec.c
+ */
+
+#include "postgres_fe.h"
+
+#include <fcntl.h>
+
+#include "common/string.h"
+#include "pg_upgrade.h"
+
+static void check_data_dir(ClusterInfo *cluster);
+static void check_bin_dir(ClusterInfo *cluster, bool check_versions);
+static void get_bin_version(ClusterInfo *cluster);
+static void check_exec(const char *dir, const char *program, bool check_version);
+
+#ifdef WIN32
+static int win32_check_directory_write_permissions(void);
+#endif
+
+
+/*
+ * get_bin_version
+ *
+ * Fetch major version of binaries for cluster.
+ */
+static void
+get_bin_version(ClusterInfo *cluster)
+{
+ char cmd[MAXPGPATH],
+ cmd_output[MAX_STRING];
+ FILE *output;
+ int v1 = 0,
+ v2 = 0;
+
+ snprintf(cmd, sizeof(cmd), "\"%s/pg_ctl\" --version", cluster->bindir);
+
+ if ((output = popen(cmd, "r")) == NULL ||
+ fgets(cmd_output, sizeof(cmd_output), output) == NULL)
+ pg_fatal("could not get pg_ctl version data using %s: %s\n",
+ cmd, strerror(errno));
+
+ pclose(output);
+
+ if (sscanf(cmd_output, "%*s %*s %d.%d", &v1, &v2) < 1)
+ pg_fatal("could not get pg_ctl version output from %s\n", cmd);
+
+ if (v1 < 10)
+ {
+ /* old style, e.g. 9.6.1 */
+ cluster->bin_version = v1 * 10000 + v2 * 100;
+ }
+ else
+ {
+ /* new style, e.g. 10.1 */
+ cluster->bin_version = v1 * 10000;
+ }
+}
+
+
+/*
+ * exec_prog()
+ * Execute an external program with stdout/stderr redirected, and report
+ * errors
+ *
+ * Formats a command from the given argument list, logs it to the log file,
+ * and attempts to execute that command. If the command executes
+ * successfully, exec_prog() returns true.
+ *
+ * If the command fails, an error message is optionally written to the specified
+ * log_file, and the program optionally exits.
+ *
+ * The code requires it be called first from the primary thread on Windows.
+ */
+bool
+exec_prog(const char *log_filename, const char *opt_log_file,
+ bool report_error, bool exit_on_error, const char *fmt,...)
+{
+ int result = 0;
+ int written;
+ char log_file[MAXPGPATH];
+
+#define MAXCMDLEN (2 * MAXPGPATH)
+ char cmd[MAXCMDLEN];
+ FILE *log;
+ va_list ap;
+
+#ifdef WIN32
+ static DWORD mainThreadId = 0;
+
+ /* We assume we are called from the primary thread first */
+ if (mainThreadId == 0)
+ mainThreadId = GetCurrentThreadId();
+#endif
+
+ snprintf(log_file, MAXPGPATH, "%s/%s", log_opts.logdir, log_filename);
+
+ written = 0;
+ va_start(ap, fmt);
+ written += vsnprintf(cmd + written, MAXCMDLEN - written, fmt, ap);
+ va_end(ap);
+ if (written >= MAXCMDLEN)
+ pg_fatal("command too long\n");
+ written += snprintf(cmd + written, MAXCMDLEN - written,
+ " >> \"%s\" 2>&1", log_file);
+ if (written >= MAXCMDLEN)
+ pg_fatal("command too long\n");
+
+ pg_log(PG_VERBOSE, "%s\n", cmd);
+
+#ifdef WIN32
+
+ /*
+ * For some reason, Windows issues a file-in-use error if we write data to
+ * the log file from a non-primary thread just before we create a
+ * subprocess that also writes to the same log file. One fix is to sleep
+ * for 100ms. A cleaner fix is to write to the log file _after_ the
+ * subprocess has completed, so we do this only when writing from a
+ * non-primary thread. fflush(), running system() twice, and pre-creating
+ * the file do not see to help.
+ */
+ if (mainThreadId != GetCurrentThreadId())
+ result = system(cmd);
+#endif
+
+ log = fopen(log_file, "a");
+
+#ifdef WIN32
+ {
+ /*
+ * "pg_ctl -w stop" might have reported that the server has stopped
+ * because the postmaster.pid file has been removed, but "pg_ctl -w
+ * start" might still be in the process of closing and might still be
+ * holding its stdout and -l log file descriptors open. Therefore,
+ * try to open the log file a few more times.
+ */
+ int iter;
+
+ for (iter = 0; iter < 4 && log == NULL; iter++)
+ {
+ pg_usleep(1000000); /* 1 sec */
+ log = fopen(log_file, "a");
+ }
+ }
+#endif
+
+ if (log == NULL)
+ pg_fatal("could not open log file \"%s\": %m\n", log_file);
+
+#ifdef WIN32
+ /* Are we printing "command:" before its output? */
+ if (mainThreadId == GetCurrentThreadId())
+ fprintf(log, "\n\n");
+#endif
+ fprintf(log, "command: %s\n", cmd);
+#ifdef WIN32
+ /* Are we printing "command:" after its output? */
+ if (mainThreadId != GetCurrentThreadId())
+ fprintf(log, "\n\n");
+#endif
+
+ /*
+ * In Windows, we must close the log file at this point so the file is not
+ * open while the command is running, or we get a share violation.
+ */
+ fclose(log);
+
+#ifdef WIN32
+ /* see comment above */
+ if (mainThreadId == GetCurrentThreadId())
+#endif
+ result = system(cmd);
+
+ if (result != 0 && report_error)
+ {
+ /* we might be in on a progress status line, so go to the next line */
+ report_status(PG_REPORT, "\n*failure*");
+ fflush(stdout);
+
+ pg_log(PG_VERBOSE, "There were problems executing \"%s\"\n", cmd);
+ if (opt_log_file)
+ pg_log(exit_on_error ? PG_FATAL : PG_REPORT,
+ "Consult the last few lines of \"%s\" or \"%s\" for\n"
+ "the probable cause of the failure.\n",
+ log_file, opt_log_file);
+ else
+ pg_log(exit_on_error ? PG_FATAL : PG_REPORT,
+ "Consult the last few lines of \"%s\" for\n"
+ "the probable cause of the failure.\n",
+ log_file);
+ }
+
+#ifndef WIN32
+
+ /*
+ * We can't do this on Windows because it will keep the "pg_ctl start"
+ * output filename open until the server stops, so we do the \n\n above on
+ * that platform. We use a unique filename for "pg_ctl start" that is
+ * never reused while the server is running, so it works fine. We could
+ * log these commands to a third file, but that just adds complexity.
+ */
+ if ((log = fopen(log_file, "a")) == NULL)
+ pg_fatal("could not write to log file \"%s\": %m\n", log_file);
+ fprintf(log, "\n\n");
+ fclose(log);
+#endif
+
+ return result == 0;
+}
+
+
+/*
+ * pid_lock_file_exists()
+ *
+ * Checks whether the postmaster.pid file exists.
+ */
+bool
+pid_lock_file_exists(const char *datadir)
+{
+ char path[MAXPGPATH];
+ int fd;
+
+ snprintf(path, sizeof(path), "%s/postmaster.pid", datadir);
+
+ if ((fd = open(path, O_RDONLY, 0)) < 0)
+ {
+ /* ENOTDIR means we will throw a more useful error later */
+ if (errno != ENOENT && errno != ENOTDIR)
+ pg_fatal("could not open file \"%s\" for reading: %s\n",
+ path, strerror(errno));
+
+ return false;
+ }
+
+ close(fd);
+ return true;
+}
+
+
+/*
+ * verify_directories()
+ *
+ * does all the hectic work of verifying directories and executables
+ * of old and new server.
+ *
+ * NOTE: May update the values of all parameters
+ */
+void
+verify_directories(void)
+{
+#ifndef WIN32
+ if (access(".", R_OK | W_OK | X_OK) != 0)
+#else
+ if (win32_check_directory_write_permissions() != 0)
+#endif
+ pg_fatal("You must have read and write access in the current directory.\n");
+
+ check_bin_dir(&old_cluster, false);
+ check_data_dir(&old_cluster);
+ check_bin_dir(&new_cluster, true);
+ check_data_dir(&new_cluster);
+}
+
+
+#ifdef WIN32
+/*
+ * win32_check_directory_write_permissions()
+ *
+ * access() on WIN32 can't check directory permissions, so we have to
+ * optionally create, then delete a file to check.
+ * http://msdn.microsoft.com/en-us/library/1w06ktdy%28v=vs.80%29.aspx
+ */
+static int
+win32_check_directory_write_permissions(void)
+{
+ int fd;
+
+ /*
+ * We open a file we would normally create anyway. We do this even in
+ * 'check' mode, which isn't ideal, but this is the best we can do.
+ */
+ if ((fd = open(GLOBALS_DUMP_FILE, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) < 0)
+ return -1;
+ close(fd);
+
+ return unlink(GLOBALS_DUMP_FILE);
+}
+#endif
+
+
+/*
+ * check_single_dir()
+ *
+ * Check for the presence of a single directory in PGDATA, and fail if
+ * is it missing or not accessible.
+ */
+static void
+check_single_dir(const char *pg_data, const char *subdir)
+{
+ struct stat statBuf;
+ char subDirName[MAXPGPATH];
+
+ snprintf(subDirName, sizeof(subDirName), "%s%s%s", pg_data,
+ /* Win32 can't stat() a directory with a trailing slash. */
+ *subdir ? "/" : "",
+ subdir);
+
+ if (stat(subDirName, &statBuf) != 0)
+ report_status(PG_FATAL, "check for \"%s\" failed: %s\n",
+ subDirName, strerror(errno));
+ else if (!S_ISDIR(statBuf.st_mode))
+ report_status(PG_FATAL, "\"%s\" is not a directory\n",
+ subDirName);
+}
+
+
+/*
+ * check_data_dir()
+ *
+ * This function validates the given cluster directory - we search for a
+ * small set of subdirectories that we expect to find in a valid $PGDATA
+ * directory. If any of the subdirectories are missing (or secured against
+ * us) we display an error message and exit()
+ *
+ */
+static void
+check_data_dir(ClusterInfo *cluster)
+{
+ const char *pg_data = cluster->pgdata;
+
+ /* get the cluster version */
+ cluster->major_version = get_major_server_version(cluster);
+
+ check_single_dir(pg_data, "");
+ check_single_dir(pg_data, "base");
+ check_single_dir(pg_data, "global");
+ check_single_dir(pg_data, "pg_multixact");
+ check_single_dir(pg_data, "pg_subtrans");
+ check_single_dir(pg_data, "pg_tblspc");
+ check_single_dir(pg_data, "pg_twophase");
+
+ /* pg_xlog has been renamed to pg_wal in v10 */
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 906)
+ check_single_dir(pg_data, "pg_xlog");
+ else
+ check_single_dir(pg_data, "pg_wal");
+
+ /* pg_clog has been renamed to pg_xact in v10 */
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 906)
+ check_single_dir(pg_data, "pg_clog");
+ else
+ check_single_dir(pg_data, "pg_xact");
+}
+
+
+/*
+ * check_bin_dir()
+ *
+ * This function searches for the executables that we expect to find
+ * in the binaries directory. If we find that a required executable
+ * is missing (or secured against us), we display an error message and
+ * exit().
+ *
+ * If check_versions is true, then the versions of the binaries are checked
+ * against the version of this pg_upgrade. This is for checking the target
+ * bindir.
+ */
+static void
+check_bin_dir(ClusterInfo *cluster, bool check_versions)
+{
+ struct stat statBuf;
+
+ /* check bindir */
+ if (stat(cluster->bindir, &statBuf) != 0)
+ report_status(PG_FATAL, "check for \"%s\" failed: %s\n",
+ cluster->bindir, strerror(errno));
+ else if (!S_ISDIR(statBuf.st_mode))
+ report_status(PG_FATAL, "\"%s\" is not a directory\n",
+ cluster->bindir);
+
+ check_exec(cluster->bindir, "postgres", check_versions);
+ check_exec(cluster->bindir, "pg_controldata", check_versions);
+ check_exec(cluster->bindir, "pg_ctl", check_versions);
+
+ /*
+ * Fetch the binary version after checking for the existence of pg_ctl.
+ * This way we report a useful error if the pg_ctl binary used for version
+ * fetching is missing/broken.
+ */
+ get_bin_version(cluster);
+
+ /* pg_resetxlog has been renamed to pg_resetwal in version 10 */
+ if (GET_MAJOR_VERSION(cluster->bin_version) <= 906)
+ check_exec(cluster->bindir, "pg_resetxlog", check_versions);
+ else
+ check_exec(cluster->bindir, "pg_resetwal", check_versions);
+
+ if (cluster == &new_cluster)
+ {
+ /*
+ * These binaries are only needed for the target version. pg_dump and
+ * pg_dumpall are used to dump the old cluster, but must be of the
+ * target version.
+ */
+ check_exec(cluster->bindir, "initdb", check_versions);
+ check_exec(cluster->bindir, "pg_dump", check_versions);
+ check_exec(cluster->bindir, "pg_dumpall", check_versions);
+ check_exec(cluster->bindir, "pg_restore", check_versions);
+ check_exec(cluster->bindir, "psql", check_versions);
+ check_exec(cluster->bindir, "vacuumdb", check_versions);
+ }
+}
+
+static void
+check_exec(const char *dir, const char *program, bool check_version)
+{
+ char path[MAXPGPATH];
+ char line[MAXPGPATH];
+ char cmd[MAXPGPATH];
+ char versionstr[128];
+ int ret;
+
+ snprintf(path, sizeof(path), "%s/%s", dir, program);
+
+ ret = validate_exec(path);
+
+ if (ret == -1)
+ pg_fatal("check for \"%s\" failed: not a regular file\n",
+ path);
+ else if (ret == -2)
+ pg_fatal("check for \"%s\" failed: cannot execute (permission denied)\n",
+ path);
+
+ snprintf(cmd, sizeof(cmd), "\"%s\" -V", path);
+
+ if (!pipe_read_line(cmd, line, sizeof(line)))
+ pg_fatal("check for \"%s\" failed: cannot execute\n",
+ path);
+
+ if (check_version)
+ {
+ pg_strip_crlf(line);
+
+ snprintf(versionstr, sizeof(versionstr), "%s (PostgreSQL) " PG_VERSION, program);
+
+ if (strcmp(line, versionstr) != 0)
+ pg_fatal("check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n",
+ path, line, versionstr);
+ }
+}
diff --git a/src/bin/pg_upgrade/file.c b/src/bin/pg_upgrade/file.c
new file mode 100644
index 0000000..e16c2e0
--- /dev/null
+++ b/src/bin/pg_upgrade/file.c
@@ -0,0 +1,376 @@
+/*
+ * file.c
+ *
+ * file system operations
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/file.c
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#ifdef HAVE_COPYFILE_H
+#include <copyfile.h>
+#endif
+#ifdef __linux__
+#include <sys/ioctl.h>
+#include <linux/fs.h>
+#endif
+
+#include "access/visibilitymapdefs.h"
+#include "common/file_perm.h"
+#include "pg_upgrade.h"
+#include "storage/bufpage.h"
+#include "storage/checksum.h"
+#include "storage/checksum_impl.h"
+
+
+/*
+ * cloneFile()
+ *
+ * Clones/reflinks a relation file from src to dst.
+ *
+ * schemaName/relName are relation's SQL name (used for error messages only).
+ */
+void
+cloneFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName)
+{
+#if defined(HAVE_COPYFILE) && defined(COPYFILE_CLONE_FORCE)
+ if (copyfile(src, dst, NULL, COPYFILE_CLONE_FORCE) < 0)
+ pg_fatal("error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n",
+ schemaName, relName, src, dst, strerror(errno));
+#elif defined(__linux__) && defined(FICLONE)
+ int src_fd;
+ int dest_fd;
+
+ if ((src_fd = open(src, O_RDONLY | PG_BINARY, 0)) < 0)
+ pg_fatal("error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n",
+ schemaName, relName, src, strerror(errno));
+
+ if ((dest_fd = open(dst, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode)) < 0)
+ pg_fatal("error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n",
+ schemaName, relName, dst, strerror(errno));
+
+ if (ioctl(dest_fd, FICLONE, src_fd) < 0)
+ {
+ int save_errno = errno;
+
+ unlink(dst);
+ pg_fatal("error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n",
+ schemaName, relName, src, dst, strerror(save_errno));
+ }
+
+ close(src_fd);
+ close(dest_fd);
+#endif
+}
+
+
+/*
+ * copyFile()
+ *
+ * Copies a relation file from src to dst.
+ * schemaName/relName are relation's SQL name (used for error messages only).
+ */
+void
+copyFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName)
+{
+#ifndef WIN32
+ int src_fd;
+ int dest_fd;
+ char *buffer;
+
+ if ((src_fd = open(src, O_RDONLY | PG_BINARY, 0)) < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not open file \"%s\": %s\n",
+ schemaName, relName, src, strerror(errno));
+
+ if ((dest_fd = open(dst, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode)) < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not create file \"%s\": %s\n",
+ schemaName, relName, dst, strerror(errno));
+
+ /* copy in fairly large chunks for best efficiency */
+#define COPY_BUF_SIZE (50 * BLCKSZ)
+
+ buffer = (char *) pg_malloc(COPY_BUF_SIZE);
+
+ /* perform data copying i.e read src source, write to destination */
+ while (true)
+ {
+ ssize_t nbytes = read(src_fd, buffer, COPY_BUF_SIZE);
+
+ if (nbytes < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not read file \"%s\": %s\n",
+ schemaName, relName, src, strerror(errno));
+
+ if (nbytes == 0)
+ break;
+
+ errno = 0;
+ if (write(dest_fd, buffer, nbytes) != nbytes)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("error while copying relation \"%s.%s\": could not write file \"%s\": %s\n",
+ schemaName, relName, dst, strerror(errno));
+ }
+ }
+
+ pg_free(buffer);
+ close(src_fd);
+ close(dest_fd);
+
+#else /* WIN32 */
+
+ if (CopyFile(src, dst, true) == 0)
+ {
+ _dosmaperr(GetLastError());
+ pg_fatal("error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n",
+ schemaName, relName, src, dst, strerror(errno));
+ }
+
+#endif /* WIN32 */
+}
+
+
+/*
+ * linkFile()
+ *
+ * Hard-links a relation file from src to dst.
+ * schemaName/relName are relation's SQL name (used for error messages only).
+ */
+void
+linkFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName)
+{
+ if (link(src, dst) < 0)
+ pg_fatal("error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n",
+ schemaName, relName, src, dst, strerror(errno));
+}
+
+
+/*
+ * rewriteVisibilityMap()
+ *
+ * Transform a visibility map file, copying from src to dst.
+ * schemaName/relName are relation's SQL name (used for error messages only).
+ *
+ * In versions of PostgreSQL prior to catversion 201603011, PostgreSQL's
+ * visibility map included one bit per heap page; it now includes two.
+ * When upgrading a cluster from before that time to a current PostgreSQL
+ * version, we could refuse to copy visibility maps from the old cluster
+ * to the new cluster; the next VACUUM would recreate them, but at the
+ * price of scanning the entire table. So, instead, we rewrite the old
+ * visibility maps in the new format. That way, the all-visible bits
+ * remain set for the pages for which they were set previously. The
+ * all-frozen bits are never set by this conversion; we leave that to VACUUM.
+ */
+void
+rewriteVisibilityMap(const char *fromfile, const char *tofile,
+ const char *schemaName, const char *relName)
+{
+ int src_fd;
+ int dst_fd;
+ PGAlignedBlock buffer;
+ PGAlignedBlock new_vmbuf;
+ ssize_t totalBytesRead = 0;
+ ssize_t src_filesize;
+ int rewriteVmBytesPerPage;
+ BlockNumber new_blkno = 0;
+ struct stat statbuf;
+
+ /* Compute number of old-format bytes per new page */
+ rewriteVmBytesPerPage = (BLCKSZ - SizeOfPageHeaderData) / 2;
+
+ if ((src_fd = open(fromfile, O_RDONLY | PG_BINARY, 0)) < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not open file \"%s\": %s\n",
+ schemaName, relName, fromfile, strerror(errno));
+
+ if (fstat(src_fd, &statbuf) != 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n",
+ schemaName, relName, fromfile, strerror(errno));
+
+ if ((dst_fd = open(tofile, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode)) < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not create file \"%s\": %s\n",
+ schemaName, relName, tofile, strerror(errno));
+
+ /* Save old file size */
+ src_filesize = statbuf.st_size;
+
+ /*
+ * Turn each visibility map page into 2 pages one by one. Each new page
+ * has the same page header as the old one. If the last section of the
+ * last page is empty, we skip it, mostly to avoid turning one-page
+ * visibility maps for small relations into two pages needlessly.
+ */
+ while (totalBytesRead < src_filesize)
+ {
+ ssize_t bytesRead;
+ char *old_cur;
+ char *old_break;
+ char *old_blkend;
+ PageHeaderData pageheader;
+ bool old_lastblk;
+
+ if ((bytesRead = read(src_fd, buffer.data, BLCKSZ)) != BLCKSZ)
+ {
+ if (bytesRead < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not read file \"%s\": %s\n",
+ schemaName, relName, fromfile, strerror(errno));
+ else
+ pg_fatal("error while copying relation \"%s.%s\": partial page found in file \"%s\"\n",
+ schemaName, relName, fromfile);
+ }
+
+ totalBytesRead += BLCKSZ;
+ old_lastblk = (totalBytesRead == src_filesize);
+
+ /* Save the page header data */
+ memcpy(&pageheader, buffer.data, SizeOfPageHeaderData);
+
+ /*
+ * These old_* variables point to old visibility map page. old_cur
+ * points to current position on old page. old_blkend points to end of
+ * old block. old_break is the end+1 position on the old page for the
+ * data that will be transferred to the current new page.
+ */
+ old_cur = buffer.data + SizeOfPageHeaderData;
+ old_blkend = buffer.data + bytesRead;
+ old_break = old_cur + rewriteVmBytesPerPage;
+
+ while (old_break <= old_blkend)
+ {
+ char *new_cur;
+ bool empty = true;
+ bool old_lastpart;
+
+ /* First, copy old page header to new page */
+ memcpy(new_vmbuf.data, &pageheader, SizeOfPageHeaderData);
+
+ /* Rewriting the last part of the last old page? */
+ old_lastpart = old_lastblk && (old_break == old_blkend);
+
+ new_cur = new_vmbuf.data + SizeOfPageHeaderData;
+
+ /* Process old page bytes one by one, and turn it into new page. */
+ while (old_cur < old_break)
+ {
+ uint8 byte = *(uint8 *) old_cur;
+ uint16 new_vmbits = 0;
+ int i;
+
+ /* Generate new format bits while keeping old information */
+ for (i = 0; i < BITS_PER_BYTE; i++)
+ {
+ if (byte & (1 << i))
+ {
+ empty = false;
+ new_vmbits |=
+ VISIBILITYMAP_ALL_VISIBLE << (BITS_PER_HEAPBLOCK * i);
+ }
+ }
+
+ /* Copy new visibility map bytes to new-format page */
+ new_cur[0] = (char) (new_vmbits & 0xFF);
+ new_cur[1] = (char) (new_vmbits >> 8);
+
+ old_cur++;
+ new_cur += BITS_PER_HEAPBLOCK;
+ }
+
+ /* If the last part of the last page is empty, skip writing it */
+ if (old_lastpart && empty)
+ break;
+
+ /* Set new checksum for visibility map page, if enabled */
+ if (new_cluster.controldata.data_checksum_version != 0)
+ ((PageHeader) new_vmbuf.data)->pd_checksum =
+ pg_checksum_page(new_vmbuf.data, new_blkno);
+
+ errno = 0;
+ if (write(dst_fd, new_vmbuf.data, BLCKSZ) != BLCKSZ)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("error while copying relation \"%s.%s\": could not write file \"%s\": %s\n",
+ schemaName, relName, tofile, strerror(errno));
+ }
+
+ /* Advance for next new page */
+ old_break += rewriteVmBytesPerPage;
+ new_blkno++;
+ }
+ }
+
+ /* Clean up */
+ close(dst_fd);
+ close(src_fd);
+}
+
+void
+check_file_clone(void)
+{
+ char existing_file[MAXPGPATH];
+ char new_link_file[MAXPGPATH];
+
+ snprintf(existing_file, sizeof(existing_file), "%s/PG_VERSION", old_cluster.pgdata);
+ snprintf(new_link_file, sizeof(new_link_file), "%s/PG_VERSION.clonetest", new_cluster.pgdata);
+ unlink(new_link_file); /* might fail */
+
+#if defined(HAVE_COPYFILE) && defined(COPYFILE_CLONE_FORCE)
+ if (copyfile(existing_file, new_link_file, NULL, COPYFILE_CLONE_FORCE) < 0)
+ pg_fatal("could not clone file between old and new data directories: %s\n",
+ strerror(errno));
+#elif defined(__linux__) && defined(FICLONE)
+ {
+ int src_fd;
+ int dest_fd;
+
+ if ((src_fd = open(existing_file, O_RDONLY | PG_BINARY, 0)) < 0)
+ pg_fatal("could not open file \"%s\": %s\n",
+ existing_file, strerror(errno));
+
+ if ((dest_fd = open(new_link_file, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode)) < 0)
+ pg_fatal("could not create file \"%s\": %s\n",
+ new_link_file, strerror(errno));
+
+ if (ioctl(dest_fd, FICLONE, src_fd) < 0)
+ pg_fatal("could not clone file between old and new data directories: %s\n",
+ strerror(errno));
+
+ close(src_fd);
+ close(dest_fd);
+ }
+#else
+ pg_fatal("file cloning not supported on this platform\n");
+#endif
+
+ unlink(new_link_file);
+}
+
+void
+check_hard_link(void)
+{
+ char existing_file[MAXPGPATH];
+ char new_link_file[MAXPGPATH];
+
+ snprintf(existing_file, sizeof(existing_file), "%s/PG_VERSION", old_cluster.pgdata);
+ snprintf(new_link_file, sizeof(new_link_file), "%s/PG_VERSION.linktest", new_cluster.pgdata);
+ unlink(new_link_file); /* might fail */
+
+ if (link(existing_file, new_link_file) < 0)
+ pg_fatal("could not create hard link between old and new data directories: %s\n"
+ "In link mode the old and new data directories must be on the same file system.\n",
+ strerror(errno));
+
+ unlink(new_link_file);
+}
diff --git a/src/bin/pg_upgrade/function.c b/src/bin/pg_upgrade/function.c
new file mode 100644
index 0000000..ea785df
--- /dev/null
+++ b/src/bin/pg_upgrade/function.c
@@ -0,0 +1,196 @@
+/*
+ * function.c
+ *
+ * server-side function support
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/function.c
+ */
+
+#include "postgres_fe.h"
+
+#include "access/transam.h"
+#include "catalog/pg_language_d.h"
+#include "pg_upgrade.h"
+
+/*
+ * qsort comparator for pointers to library names
+ *
+ * We sort first by name length, then alphabetically for names of the
+ * same length, then database array index. This is to ensure that, eg,
+ * "hstore_plpython" sorts after both "hstore" and "plpython"; otherwise
+ * transform modules will probably fail their LOAD tests. (The backend
+ * ought to cope with that consideration, but it doesn't yet, and even
+ * when it does it'll still be a good idea to have a predictable order of
+ * probing here.)
+ */
+static int
+library_name_compare(const void *p1, const void *p2)
+{
+ const char *str1 = ((const LibraryInfo *) p1)->name;
+ const char *str2 = ((const LibraryInfo *) p2)->name;
+ int slen1 = strlen(str1);
+ int slen2 = strlen(str2);
+ int cmp = strcmp(str1, str2);
+
+ if (slen1 != slen2)
+ return slen1 - slen2;
+ if (cmp != 0)
+ return cmp;
+ else
+ return ((const LibraryInfo *) p1)->dbnum -
+ ((const LibraryInfo *) p2)->dbnum;
+}
+
+
+/*
+ * get_loadable_libraries()
+ *
+ * Fetch the names of all old libraries containing C-language functions.
+ * We will later check that they all exist in the new installation.
+ */
+void
+get_loadable_libraries(void)
+{
+ PGresult **ress;
+ int totaltups;
+ int dbnum;
+
+ ress = (PGresult **) pg_malloc(old_cluster.dbarr.ndbs * sizeof(PGresult *));
+ totaltups = 0;
+
+ /* Fetch all library names, removing duplicates within each DB */
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ DbInfo *active_db = &old_cluster.dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(&old_cluster, active_db->db_name);
+
+ /*
+ * Fetch all libraries containing non-built-in C functions in this DB.
+ */
+ ress[dbnum] = executeQueryOrDie(conn,
+ "SELECT DISTINCT probin "
+ "FROM pg_catalog.pg_proc "
+ "WHERE prolang = %u AND "
+ "probin IS NOT NULL AND "
+ "oid >= %u;",
+ ClanguageId,
+ FirstNormalObjectId);
+ totaltups += PQntuples(ress[dbnum]);
+
+ PQfinish(conn);
+ }
+
+ os_info.libraries = (LibraryInfo *) pg_malloc(totaltups * sizeof(LibraryInfo));
+ totaltups = 0;
+
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ PGresult *res = ress[dbnum];
+ int ntups;
+ int rowno;
+
+ ntups = PQntuples(res);
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ char *lib = PQgetvalue(res, rowno, 0);
+
+ os_info.libraries[totaltups].name = pg_strdup(lib);
+ os_info.libraries[totaltups].dbnum = dbnum;
+
+ totaltups++;
+ }
+ PQclear(res);
+ }
+
+ pg_free(ress);
+
+ os_info.num_libraries = totaltups;
+}
+
+
+/*
+ * check_loadable_libraries()
+ *
+ * Check that the new cluster contains all required libraries.
+ * We do this by actually trying to LOAD each one, thereby testing
+ * compatibility as well as presence.
+ */
+void
+check_loadable_libraries(void)
+{
+ PGconn *conn = connectToServer(&new_cluster, "template1");
+ int libnum;
+ int was_load_failure = false;
+ FILE *script = NULL;
+ bool found = false;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for presence of required libraries");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir, "loadable_libraries.txt");
+
+ /*
+ * Now we want to sort the library names into order. This avoids multiple
+ * probes of the same library, and ensures that libraries are probed in a
+ * consistent order, which is important for reproducible behavior if one
+ * library depends on another.
+ */
+ qsort((void *) os_info.libraries, os_info.num_libraries,
+ sizeof(LibraryInfo), library_name_compare);
+
+ for (libnum = 0; libnum < os_info.num_libraries; libnum++)
+ {
+ char *lib = os_info.libraries[libnum].name;
+ int llen = strlen(lib);
+ char cmd[7 + 2 * MAXPGPATH + 1];
+ PGresult *res;
+
+ /* Did the library name change? Probe it. */
+ if (libnum == 0 || strcmp(lib, os_info.libraries[libnum - 1].name) != 0)
+ {
+ strcpy(cmd, "LOAD '");
+ PQescapeStringConn(conn, cmd + strlen(cmd), lib, llen, NULL);
+ strcat(cmd, "'");
+
+ res = PQexec(conn, cmd);
+
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ found = true;
+ was_load_failure = true;
+
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ output_path, strerror(errno));
+ fprintf(script, _("could not load library \"%s\": %s"),
+ lib,
+ PQerrorMessage(conn));
+ }
+ else
+ was_load_failure = false;
+
+ PQclear(res);
+ }
+
+ if (was_load_failure)
+ fprintf(script, _("In database: %s\n"),
+ old_cluster.dbarr.dbs[os_info.libraries[libnum].dbnum].db_name);
+ }
+
+ PQfinish(conn);
+
+ if (found)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation references loadable libraries that are missing from the\n"
+ "new installation. You can add these libraries to the new installation,\n"
+ "or remove the functions using them from the old installation. A list of\n"
+ "problem libraries is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
diff --git a/src/bin/pg_upgrade/info.c b/src/bin/pg_upgrade/info.c
new file mode 100644
index 0000000..a9ce740
--- /dev/null
+++ b/src/bin/pg_upgrade/info.c
@@ -0,0 +1,622 @@
+/*
+ * info.c
+ *
+ * information support functions
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/info.c
+ */
+
+#include "postgres_fe.h"
+
+#include "access/transam.h"
+#include "catalog/pg_class_d.h"
+#include "pg_upgrade.h"
+
+static void create_rel_filename_map(const char *old_data, const char *new_data,
+ const DbInfo *old_db, const DbInfo *new_db,
+ const RelInfo *old_rel, const RelInfo *new_rel,
+ FileNameMap *map);
+static void report_unmatched_relation(const RelInfo *rel, const DbInfo *db,
+ bool is_new_db);
+static void free_db_and_rel_infos(DbInfoArr *db_arr);
+static void get_db_infos(ClusterInfo *cluster);
+static void get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo);
+static void free_rel_infos(RelInfoArr *rel_arr);
+static void print_db_infos(DbInfoArr *dbinfo);
+static void print_rel_infos(RelInfoArr *rel_arr);
+
+
+/*
+ * gen_db_file_maps()
+ *
+ * generates a database mapping from "old_db" to "new_db".
+ *
+ * Returns a malloc'ed array of mappings. The length of the array
+ * is returned into *nmaps.
+ */
+FileNameMap *
+gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
+ int *nmaps,
+ const char *old_pgdata, const char *new_pgdata)
+{
+ FileNameMap *maps;
+ int old_relnum,
+ new_relnum;
+ int num_maps = 0;
+ bool all_matched = true;
+
+ /* There will certainly not be more mappings than there are old rels */
+ maps = (FileNameMap *) pg_malloc(sizeof(FileNameMap) *
+ old_db->rel_arr.nrels);
+
+ /*
+ * Each of the RelInfo arrays should be sorted by OID. Scan through them
+ * and match them up. If we fail to match everything, we'll abort, but
+ * first print as much info as we can about mismatches.
+ */
+ old_relnum = new_relnum = 0;
+ while (old_relnum < old_db->rel_arr.nrels ||
+ new_relnum < new_db->rel_arr.nrels)
+ {
+ RelInfo *old_rel = (old_relnum < old_db->rel_arr.nrels) ?
+ &old_db->rel_arr.rels[old_relnum] : NULL;
+ RelInfo *new_rel = (new_relnum < new_db->rel_arr.nrels) ?
+ &new_db->rel_arr.rels[new_relnum] : NULL;
+
+ /* handle running off one array before the other */
+ if (!new_rel)
+ {
+ /*
+ * old_rel is unmatched. This should never happen, because we
+ * force new rels to have TOAST tables if the old one did.
+ */
+ report_unmatched_relation(old_rel, old_db, false);
+ all_matched = false;
+ old_relnum++;
+ continue;
+ }
+ if (!old_rel)
+ {
+ /*
+ * new_rel is unmatched. This shouldn't really happen either, but
+ * if it's a TOAST table, we can ignore it and continue
+ * processing, assuming that the new server made a TOAST table
+ * that wasn't needed.
+ */
+ if (strcmp(new_rel->nspname, "pg_toast") != 0)
+ {
+ report_unmatched_relation(new_rel, new_db, true);
+ all_matched = false;
+ }
+ new_relnum++;
+ continue;
+ }
+
+ /* check for mismatched OID */
+ if (old_rel->reloid < new_rel->reloid)
+ {
+ /* old_rel is unmatched, see comment above */
+ report_unmatched_relation(old_rel, old_db, false);
+ all_matched = false;
+ old_relnum++;
+ continue;
+ }
+ else if (old_rel->reloid > new_rel->reloid)
+ {
+ /* new_rel is unmatched, see comment above */
+ if (strcmp(new_rel->nspname, "pg_toast") != 0)
+ {
+ report_unmatched_relation(new_rel, new_db, true);
+ all_matched = false;
+ }
+ new_relnum++;
+ continue;
+ }
+
+ /*
+ * Verify that rels of same OID have same name. The namespace name
+ * should always match, but the relname might not match for TOAST
+ * tables (and, therefore, their indexes).
+ */
+ if (strcmp(old_rel->nspname, new_rel->nspname) != 0 ||
+ strcmp(old_rel->relname, new_rel->relname) != 0)
+ {
+ pg_log(PG_WARNING, "Relation names for OID %u in database \"%s\" do not match: "
+ "old name \"%s.%s\", new name \"%s.%s\"\n",
+ old_rel->reloid, old_db->db_name,
+ old_rel->nspname, old_rel->relname,
+ new_rel->nspname, new_rel->relname);
+ all_matched = false;
+ old_relnum++;
+ new_relnum++;
+ continue;
+ }
+
+ /* OK, create a mapping entry */
+ create_rel_filename_map(old_pgdata, new_pgdata, old_db, new_db,
+ old_rel, new_rel, maps + num_maps);
+ num_maps++;
+ old_relnum++;
+ new_relnum++;
+ }
+
+ if (!all_matched)
+ pg_fatal("Failed to match up old and new tables in database \"%s\"\n",
+ old_db->db_name);
+
+ *nmaps = num_maps;
+ return maps;
+}
+
+
+/*
+ * create_rel_filename_map()
+ *
+ * fills a file node map structure and returns it in "map".
+ */
+static void
+create_rel_filename_map(const char *old_data, const char *new_data,
+ const DbInfo *old_db, const DbInfo *new_db,
+ const RelInfo *old_rel, const RelInfo *new_rel,
+ FileNameMap *map)
+{
+ /* In case old/new tablespaces don't match, do them separately. */
+ if (strlen(old_rel->tablespace) == 0)
+ {
+ /*
+ * relation belongs to the default tablespace, hence relfiles should
+ * exist in the data directories.
+ */
+ map->old_tablespace = old_data;
+ map->old_tablespace_suffix = "/base";
+ }
+ else
+ {
+ /* relation belongs to a tablespace, so use the tablespace location */
+ map->old_tablespace = old_rel->tablespace;
+ map->old_tablespace_suffix = old_cluster.tablespace_suffix;
+ }
+
+ /* Do the same for new tablespaces */
+ if (strlen(new_rel->tablespace) == 0)
+ {
+ map->new_tablespace = new_data;
+ map->new_tablespace_suffix = "/base";
+ }
+ else
+ {
+ map->new_tablespace = new_rel->tablespace;
+ map->new_tablespace_suffix = new_cluster.tablespace_suffix;
+ }
+
+ /* DB oid and relfilenodes are preserved between old and new cluster */
+ map->db_oid = old_db->db_oid;
+ map->relfilenode = old_rel->relfilenode;
+
+ /* used only for logging and error reporting, old/new are identical */
+ map->nspname = old_rel->nspname;
+ map->relname = old_rel->relname;
+}
+
+
+/*
+ * Complain about a relation we couldn't match to the other database,
+ * identifying it as best we can.
+ */
+static void
+report_unmatched_relation(const RelInfo *rel, const DbInfo *db, bool is_new_db)
+{
+ Oid reloid = rel->reloid; /* we might change rel below */
+ char reldesc[1000];
+ int i;
+
+ snprintf(reldesc, sizeof(reldesc), "\"%s.%s\"",
+ rel->nspname, rel->relname);
+ if (rel->indtable)
+ {
+ for (i = 0; i < db->rel_arr.nrels; i++)
+ {
+ const RelInfo *hrel = &db->rel_arr.rels[i];
+
+ if (hrel->reloid == rel->indtable)
+ {
+ snprintf(reldesc + strlen(reldesc),
+ sizeof(reldesc) - strlen(reldesc),
+ _(" which is an index on \"%s.%s\""),
+ hrel->nspname, hrel->relname);
+ /* Shift attention to index's table for toast check */
+ rel = hrel;
+ break;
+ }
+ }
+ if (i >= db->rel_arr.nrels)
+ snprintf(reldesc + strlen(reldesc),
+ sizeof(reldesc) - strlen(reldesc),
+ _(" which is an index on OID %u"), rel->indtable);
+ }
+ if (rel->toastheap)
+ {
+ for (i = 0; i < db->rel_arr.nrels; i++)
+ {
+ const RelInfo *brel = &db->rel_arr.rels[i];
+
+ if (brel->reloid == rel->toastheap)
+ {
+ snprintf(reldesc + strlen(reldesc),
+ sizeof(reldesc) - strlen(reldesc),
+ _(" which is the TOAST table for \"%s.%s\""),
+ brel->nspname, brel->relname);
+ break;
+ }
+ }
+ if (i >= db->rel_arr.nrels)
+ snprintf(reldesc + strlen(reldesc),
+ sizeof(reldesc) - strlen(reldesc),
+ _(" which is the TOAST table for OID %u"), rel->toastheap);
+ }
+
+ if (is_new_db)
+ pg_log(PG_WARNING, "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n",
+ reloid, db->db_name, reldesc);
+ else
+ pg_log(PG_WARNING, "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n",
+ reloid, db->db_name, reldesc);
+}
+
+/*
+ * get_db_and_rel_infos()
+ *
+ * higher level routine to generate dbinfos for the database running
+ * on the given "port". Assumes that server is already running.
+ */
+void
+get_db_and_rel_infos(ClusterInfo *cluster)
+{
+ int dbnum;
+
+ if (cluster->dbarr.dbs != NULL)
+ free_db_and_rel_infos(&cluster->dbarr);
+
+ get_db_infos(cluster);
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ get_rel_infos(cluster, &cluster->dbarr.dbs[dbnum]);
+
+ if (cluster == &old_cluster)
+ pg_log(PG_VERBOSE, "\nsource databases:\n");
+ else
+ pg_log(PG_VERBOSE, "\ntarget databases:\n");
+
+ if (log_opts.verbose)
+ print_db_infos(&cluster->dbarr);
+}
+
+
+/*
+ * get_db_infos()
+ *
+ * Scans pg_database system catalog and populates all user
+ * databases.
+ */
+static void
+get_db_infos(ClusterInfo *cluster)
+{
+ PGconn *conn = connectToServer(cluster, "template1");
+ PGresult *res;
+ int ntups;
+ int tupnum;
+ DbInfo *dbinfos;
+ int i_datname,
+ i_oid,
+ i_encoding,
+ i_datcollate,
+ i_datctype,
+ i_datlocprovider,
+ i_daticulocale,
+ i_spclocation;
+ char query[QUERY_ALLOC];
+
+ snprintf(query, sizeof(query),
+ "SELECT d.oid, d.datname, d.encoding, d.datcollate, d.datctype, ");
+ if (GET_MAJOR_VERSION(cluster->major_version) < 1500)
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "'c' AS datlocprovider, NULL AS daticulocale, ");
+ else
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "datlocprovider, daticulocale, ");
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "pg_catalog.pg_tablespace_location(t.oid) AS spclocation "
+ "FROM pg_catalog.pg_database d "
+ " LEFT OUTER JOIN pg_catalog.pg_tablespace t "
+ " ON d.dattablespace = t.oid "
+ "WHERE d.datallowconn = true "
+ "ORDER BY 1");
+
+ res = executeQueryOrDie(conn, "%s", query);
+
+ i_oid = PQfnumber(res, "oid");
+ i_datname = PQfnumber(res, "datname");
+ i_encoding = PQfnumber(res, "encoding");
+ i_datcollate = PQfnumber(res, "datcollate");
+ i_datctype = PQfnumber(res, "datctype");
+ i_datlocprovider = PQfnumber(res, "datlocprovider");
+ i_daticulocale = PQfnumber(res, "daticulocale");
+ i_spclocation = PQfnumber(res, "spclocation");
+
+ ntups = PQntuples(res);
+ dbinfos = (DbInfo *) pg_malloc(sizeof(DbInfo) * ntups);
+
+ for (tupnum = 0; tupnum < ntups; tupnum++)
+ {
+ dbinfos[tupnum].db_oid = atooid(PQgetvalue(res, tupnum, i_oid));
+ dbinfos[tupnum].db_name = pg_strdup(PQgetvalue(res, tupnum, i_datname));
+ dbinfos[tupnum].db_encoding = atoi(PQgetvalue(res, tupnum, i_encoding));
+ dbinfos[tupnum].db_collate = pg_strdup(PQgetvalue(res, tupnum, i_datcollate));
+ dbinfos[tupnum].db_ctype = pg_strdup(PQgetvalue(res, tupnum, i_datctype));
+ dbinfos[tupnum].db_collprovider = PQgetvalue(res, tupnum, i_datlocprovider)[0];
+ if (PQgetisnull(res, tupnum, i_daticulocale))
+ dbinfos[tupnum].db_iculocale = NULL;
+ else
+ dbinfos[tupnum].db_iculocale = pg_strdup(PQgetvalue(res, tupnum, i_daticulocale));
+ snprintf(dbinfos[tupnum].db_tablespace, sizeof(dbinfos[tupnum].db_tablespace), "%s",
+ PQgetvalue(res, tupnum, i_spclocation));
+ }
+ PQclear(res);
+
+ PQfinish(conn);
+
+ cluster->dbarr.dbs = dbinfos;
+ cluster->dbarr.ndbs = ntups;
+}
+
+
+/*
+ * get_rel_infos()
+ *
+ * gets the relinfos for all the user tables and indexes of the database
+ * referred to by "dbinfo".
+ *
+ * Note: the resulting RelInfo array is assumed to be sorted by OID.
+ * This allows later processing to match up old and new databases efficiently.
+ */
+static void
+get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo)
+{
+ PGconn *conn = connectToServer(cluster,
+ dbinfo->db_name);
+ PGresult *res;
+ RelInfo *relinfos;
+ int ntups;
+ int relnum;
+ int num_rels = 0;
+ char *nspname = NULL;
+ char *relname = NULL;
+ char *tablespace = NULL;
+ int i_spclocation,
+ i_nspname,
+ i_relname,
+ i_reloid,
+ i_indtable,
+ i_toastheap,
+ i_relfilenode,
+ i_reltablespace;
+ char query[QUERY_ALLOC];
+ char *last_namespace = NULL,
+ *last_tablespace = NULL;
+
+ query[0] = '\0'; /* initialize query string to empty */
+
+ /*
+ * Create a CTE that collects OIDs of regular user tables and matviews,
+ * but excluding toast tables and indexes. We assume that relations with
+ * OIDs >= FirstNormalObjectId belong to the user. (That's probably
+ * redundant with the namespace-name exclusions, but let's be safe.)
+ *
+ * pg_largeobject contains user data that does not appear in pg_dump
+ * output, so we have to copy that system table. It's easiest to do that
+ * by treating it as a user table.
+ */
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "WITH regular_heap (reloid, indtable, toastheap) AS ( "
+ " SELECT c.oid, 0::oid, 0::oid "
+ " FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n "
+ " ON c.relnamespace = n.oid "
+ " WHERE relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ") AND "
+ /* exclude possible orphaned temp tables */
+ " ((n.nspname !~ '^pg_temp_' AND "
+ " n.nspname !~ '^pg_toast_temp_' AND "
+ " n.nspname NOT IN ('pg_catalog', 'information_schema', "
+ " 'binary_upgrade', 'pg_toast') AND "
+ " c.oid >= %u::pg_catalog.oid) OR "
+ " (n.nspname = 'pg_catalog' AND "
+ " relname IN ('pg_largeobject') ))), ",
+ FirstNormalObjectId);
+
+ /*
+ * Add a CTE that collects OIDs of toast tables belonging to the tables
+ * selected by the regular_heap CTE. (We have to do this separately
+ * because the namespace-name rules above don't work for toast tables.)
+ */
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ " toast_heap (reloid, indtable, toastheap) AS ( "
+ " SELECT c.reltoastrelid, 0::oid, c.oid "
+ " FROM regular_heap JOIN pg_catalog.pg_class c "
+ " ON regular_heap.reloid = c.oid "
+ " WHERE c.reltoastrelid != 0), ");
+
+ /*
+ * Add a CTE that collects OIDs of all valid indexes on the previously
+ * selected tables. We can ignore invalid indexes since pg_dump does.
+ * Testing indisready is necessary in 9.2, and harmless in earlier/later
+ * versions.
+ */
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ " all_index (reloid, indtable, toastheap) AS ( "
+ " SELECT indexrelid, indrelid, 0::oid "
+ " FROM pg_catalog.pg_index "
+ " WHERE indisvalid AND indisready "
+ " AND indrelid IN "
+ " (SELECT reloid FROM regular_heap "
+ " UNION ALL "
+ " SELECT reloid FROM toast_heap)) ");
+
+ /*
+ * And now we can write the query that retrieves the data we want for each
+ * heap and index relation. Make sure result is sorted by OID.
+ */
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "SELECT all_rels.*, n.nspname, c.relname, "
+ " c.relfilenode, c.reltablespace, "
+ " pg_catalog.pg_tablespace_location(t.oid) AS spclocation "
+ "FROM (SELECT * FROM regular_heap "
+ " UNION ALL "
+ " SELECT * FROM toast_heap "
+ " UNION ALL "
+ " SELECT * FROM all_index) all_rels "
+ " JOIN pg_catalog.pg_class c "
+ " ON all_rels.reloid = c.oid "
+ " JOIN pg_catalog.pg_namespace n "
+ " ON c.relnamespace = n.oid "
+ " LEFT OUTER JOIN pg_catalog.pg_tablespace t "
+ " ON c.reltablespace = t.oid "
+ "ORDER BY 1;");
+
+ res = executeQueryOrDie(conn, "%s", query);
+
+ ntups = PQntuples(res);
+
+ relinfos = (RelInfo *) pg_malloc(sizeof(RelInfo) * ntups);
+
+ i_reloid = PQfnumber(res, "reloid");
+ i_indtable = PQfnumber(res, "indtable");
+ i_toastheap = PQfnumber(res, "toastheap");
+ i_nspname = PQfnumber(res, "nspname");
+ i_relname = PQfnumber(res, "relname");
+ i_relfilenode = PQfnumber(res, "relfilenode");
+ i_reltablespace = PQfnumber(res, "reltablespace");
+ i_spclocation = PQfnumber(res, "spclocation");
+
+ for (relnum = 0; relnum < ntups; relnum++)
+ {
+ RelInfo *curr = &relinfos[num_rels++];
+
+ curr->reloid = atooid(PQgetvalue(res, relnum, i_reloid));
+ curr->indtable = atooid(PQgetvalue(res, relnum, i_indtable));
+ curr->toastheap = atooid(PQgetvalue(res, relnum, i_toastheap));
+
+ nspname = PQgetvalue(res, relnum, i_nspname);
+ curr->nsp_alloc = false;
+
+ /*
+ * Many of the namespace and tablespace strings are identical, so we
+ * try to reuse the allocated string pointers where possible to reduce
+ * memory consumption.
+ */
+ /* Can we reuse the previous string allocation? */
+ if (last_namespace && strcmp(nspname, last_namespace) == 0)
+ curr->nspname = last_namespace;
+ else
+ {
+ last_namespace = curr->nspname = pg_strdup(nspname);
+ curr->nsp_alloc = true;
+ }
+
+ relname = PQgetvalue(res, relnum, i_relname);
+ curr->relname = pg_strdup(relname);
+
+ curr->relfilenode = atooid(PQgetvalue(res, relnum, i_relfilenode));
+ curr->tblsp_alloc = false;
+
+ /* Is the tablespace oid non-default? */
+ if (atooid(PQgetvalue(res, relnum, i_reltablespace)) != 0)
+ {
+ /*
+ * The tablespace location might be "", meaning the cluster
+ * default location, i.e. pg_default or pg_global.
+ */
+ tablespace = PQgetvalue(res, relnum, i_spclocation);
+
+ /* Can we reuse the previous string allocation? */
+ if (last_tablespace && strcmp(tablespace, last_tablespace) == 0)
+ curr->tablespace = last_tablespace;
+ else
+ {
+ last_tablespace = curr->tablespace = pg_strdup(tablespace);
+ curr->tblsp_alloc = true;
+ }
+ }
+ else
+ /* A zero reltablespace oid indicates the database tablespace. */
+ curr->tablespace = dbinfo->db_tablespace;
+ }
+ PQclear(res);
+
+ PQfinish(conn);
+
+ dbinfo->rel_arr.rels = relinfos;
+ dbinfo->rel_arr.nrels = num_rels;
+}
+
+
+static void
+free_db_and_rel_infos(DbInfoArr *db_arr)
+{
+ int dbnum;
+
+ for (dbnum = 0; dbnum < db_arr->ndbs; dbnum++)
+ {
+ free_rel_infos(&db_arr->dbs[dbnum].rel_arr);
+ pg_free(db_arr->dbs[dbnum].db_name);
+ }
+ pg_free(db_arr->dbs);
+ db_arr->dbs = NULL;
+ db_arr->ndbs = 0;
+}
+
+
+static void
+free_rel_infos(RelInfoArr *rel_arr)
+{
+ int relnum;
+
+ for (relnum = 0; relnum < rel_arr->nrels; relnum++)
+ {
+ if (rel_arr->rels[relnum].nsp_alloc)
+ pg_free(rel_arr->rels[relnum].nspname);
+ pg_free(rel_arr->rels[relnum].relname);
+ if (rel_arr->rels[relnum].tblsp_alloc)
+ pg_free(rel_arr->rels[relnum].tablespace);
+ }
+ pg_free(rel_arr->rels);
+ rel_arr->nrels = 0;
+}
+
+
+static void
+print_db_infos(DbInfoArr *db_arr)
+{
+ int dbnum;
+
+ for (dbnum = 0; dbnum < db_arr->ndbs; dbnum++)
+ {
+ pg_log(PG_VERBOSE, "Database: %s\n", db_arr->dbs[dbnum].db_name);
+ print_rel_infos(&db_arr->dbs[dbnum].rel_arr);
+ pg_log(PG_VERBOSE, "\n\n");
+ }
+}
+
+
+static void
+print_rel_infos(RelInfoArr *rel_arr)
+{
+ int relnum;
+
+ for (relnum = 0; relnum < rel_arr->nrels; relnum++)
+ pg_log(PG_VERBOSE, "relname: %s.%s: reloid: %u reltblspace: %s\n",
+ rel_arr->rels[relnum].nspname,
+ rel_arr->rels[relnum].relname,
+ rel_arr->rels[relnum].reloid,
+ rel_arr->rels[relnum].tablespace);
+}
diff --git a/src/bin/pg_upgrade/nls.mk b/src/bin/pg_upgrade/nls.mk
new file mode 100644
index 0000000..7bd5fe7
--- /dev/null
+++ b/src/bin/pg_upgrade/nls.mk
@@ -0,0 +1,13 @@
+# src/bin/pg_upgrade/nls.mk
+CATALOG_NAME = pg_upgrade
+AVAIL_LANGUAGES = cs de es fr it ja ka ko ru sv uk zh_CN
+GETTEXT_FILES = check.c controldata.c dump.c exec.c file.c function.c \
+ info.c option.c parallel.c pg_upgrade.c relfilenode.c \
+ server.c tablespace.c util.c version.c
+GETTEXT_TRIGGERS = pg_fatal pg_log:2 prep_status prep_status_progress report_status:2
+GETTEXT_FLAGS = \
+ pg_fatal:1:c-format \
+ pg_log:2:c-format \
+ prep_status:1:c-format \
+ prep_status_progress:1:c-format \
+ report_status:2:c-format
diff --git a/src/bin/pg_upgrade/option.c b/src/bin/pg_upgrade/option.c
new file mode 100644
index 0000000..e75be2c
--- /dev/null
+++ b/src/bin/pg_upgrade/option.c
@@ -0,0 +1,496 @@
+/*
+ * option.c
+ *
+ * options functions
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/option.c
+ */
+
+#include "postgres_fe.h"
+
+#ifdef WIN32
+#include <io.h>
+#endif
+
+#include "common/string.h"
+#include "getopt_long.h"
+#include "pg_upgrade.h"
+#include "utils/pidfile.h"
+
+static void usage(void);
+static void check_required_directory(char **dirpath,
+ const char *envVarName, bool useCwd,
+ const char *cmdLineOption, const char *description,
+ bool missingOk);
+#define FIX_DEFAULT_READ_ONLY "-c default_transaction_read_only=false"
+
+
+UserOpts user_opts;
+
+
+/*
+ * parseCommandLine()
+ *
+ * Parses the command line (argc, argv[]) and loads structures
+ */
+void
+parseCommandLine(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"old-datadir", required_argument, NULL, 'd'},
+ {"new-datadir", required_argument, NULL, 'D'},
+ {"old-bindir", required_argument, NULL, 'b'},
+ {"new-bindir", required_argument, NULL, 'B'},
+ {"no-sync", no_argument, NULL, 'N'},
+ {"old-options", required_argument, NULL, 'o'},
+ {"new-options", required_argument, NULL, 'O'},
+ {"old-port", required_argument, NULL, 'p'},
+ {"new-port", required_argument, NULL, 'P'},
+
+ {"username", required_argument, NULL, 'U'},
+ {"check", no_argument, NULL, 'c'},
+ {"link", no_argument, NULL, 'k'},
+ {"retain", no_argument, NULL, 'r'},
+ {"jobs", required_argument, NULL, 'j'},
+ {"socketdir", required_argument, NULL, 's'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"clone", no_argument, NULL, 1},
+
+ {NULL, 0, NULL, 0}
+ };
+ int option; /* Command line option */
+ int optindex = 0; /* used by getopt_long */
+ int os_user_effective_id;
+
+ user_opts.do_sync = true;
+ user_opts.transfer_mode = TRANSFER_MODE_COPY;
+
+ os_info.progname = get_progname(argv[0]);
+
+ /* Process libpq env. variables; load values here for usage() output */
+ old_cluster.port = getenv("PGPORTOLD") ? atoi(getenv("PGPORTOLD")) : DEF_PGUPORT;
+ new_cluster.port = getenv("PGPORTNEW") ? atoi(getenv("PGPORTNEW")) : DEF_PGUPORT;
+
+ os_user_effective_id = get_user_info(&os_info.user);
+ /* we override just the database user name; we got the OS id above */
+ if (getenv("PGUSER"))
+ {
+ pg_free(os_info.user);
+ /* must save value, getenv()'s pointer is not stable */
+ os_info.user = pg_strdup(getenv("PGUSER"));
+ }
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_upgrade (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ /* Allow help and version to be run as root, so do the test here. */
+ if (os_user_effective_id == 0)
+ pg_fatal("%s: cannot be run as root\n", os_info.progname);
+
+ while ((option = getopt_long(argc, argv, "d:D:b:B:cj:kNo:O:p:P:rs:U:v",
+ long_options, &optindex)) != -1)
+ {
+ switch (option)
+ {
+ case 'b':
+ old_cluster.bindir = pg_strdup(optarg);
+ break;
+
+ case 'B':
+ new_cluster.bindir = pg_strdup(optarg);
+ break;
+
+ case 'c':
+ user_opts.check = true;
+ break;
+
+ case 'd':
+ old_cluster.pgdata = pg_strdup(optarg);
+ break;
+
+ case 'D':
+ new_cluster.pgdata = pg_strdup(optarg);
+ break;
+
+ case 'j':
+ user_opts.jobs = atoi(optarg);
+ break;
+
+ case 'k':
+ user_opts.transfer_mode = TRANSFER_MODE_LINK;
+ break;
+
+ case 'N':
+ user_opts.do_sync = false;
+ break;
+
+ case 'o':
+ /* append option? */
+ if (!old_cluster.pgopts)
+ old_cluster.pgopts = pg_strdup(optarg);
+ else
+ {
+ char *old_pgopts = old_cluster.pgopts;
+
+ old_cluster.pgopts = psprintf("%s %s", old_pgopts, optarg);
+ free(old_pgopts);
+ }
+ break;
+
+ case 'O':
+ /* append option? */
+ if (!new_cluster.pgopts)
+ new_cluster.pgopts = pg_strdup(optarg);
+ else
+ {
+ char *new_pgopts = new_cluster.pgopts;
+
+ new_cluster.pgopts = psprintf("%s %s", new_pgopts, optarg);
+ free(new_pgopts);
+ }
+ break;
+
+ case 'p':
+ if ((old_cluster.port = atoi(optarg)) <= 0)
+ pg_fatal("invalid old port number\n");
+ break;
+
+ case 'P':
+ if ((new_cluster.port = atoi(optarg)) <= 0)
+ pg_fatal("invalid new port number\n");
+ break;
+
+ case 'r':
+ log_opts.retain = true;
+ break;
+
+ case 's':
+ user_opts.socketdir = pg_strdup(optarg);
+ break;
+
+ case 'U':
+ pg_free(os_info.user);
+ os_info.user = pg_strdup(optarg);
+ os_info.user_specified = true;
+ break;
+
+ case 'v':
+ log_opts.verbose = true;
+ break;
+
+ case 1:
+ user_opts.transfer_mode = TRANSFER_MODE_CLONE;
+ break;
+
+ default:
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+ os_info.progname);
+ exit(1);
+ }
+ }
+
+ if (optind < argc)
+ pg_fatal("too many command-line arguments (first is \"%s\")\n", argv[optind]);
+
+ if (log_opts.verbose)
+ pg_log(PG_REPORT, "Running in verbose mode\n");
+
+ log_opts.isatty = isatty(fileno(stdout));
+
+ /* Turn off read-only mode; add prefix to PGOPTIONS? */
+ if (getenv("PGOPTIONS"))
+ {
+ char *pgoptions = psprintf("%s %s", FIX_DEFAULT_READ_ONLY,
+ getenv("PGOPTIONS"));
+
+ setenv("PGOPTIONS", pgoptions, 1);
+ pfree(pgoptions);
+ }
+ else
+ setenv("PGOPTIONS", FIX_DEFAULT_READ_ONLY, 1);
+
+ /* Get values from env if not already set */
+ check_required_directory(&old_cluster.bindir, "PGBINOLD", false,
+ "-b", _("old cluster binaries reside"), false);
+ check_required_directory(&new_cluster.bindir, "PGBINNEW", false,
+ "-B", _("new cluster binaries reside"), true);
+ check_required_directory(&old_cluster.pgdata, "PGDATAOLD", false,
+ "-d", _("old cluster data resides"), false);
+ check_required_directory(&new_cluster.pgdata, "PGDATANEW", false,
+ "-D", _("new cluster data resides"), false);
+ check_required_directory(&user_opts.socketdir, "PGSOCKETDIR", true,
+ "-s", _("sockets will be created"), false);
+
+#ifdef WIN32
+
+ /*
+ * On Windows, initdb --sync-only will fail with a "Permission denied"
+ * error on file pg_upgrade_utility.log if pg_upgrade is run inside the
+ * new cluster directory, so we do a check here.
+ */
+ {
+ char cwd[MAXPGPATH],
+ new_cluster_pgdata[MAXPGPATH];
+
+ strlcpy(new_cluster_pgdata, new_cluster.pgdata, MAXPGPATH);
+ canonicalize_path(new_cluster_pgdata);
+
+ if (!getcwd(cwd, MAXPGPATH))
+ pg_fatal("could not determine current directory\n");
+ canonicalize_path(cwd);
+ if (path_is_prefix_of_path(new_cluster_pgdata, cwd))
+ pg_fatal("cannot run pg_upgrade from inside the new cluster data directory on Windows\n");
+ }
+#endif
+}
+
+
+static void
+usage(void)
+{
+ printf(_("pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n\n"));
+ printf(_("Usage:\n"));
+ printf(_(" pg_upgrade [OPTION]...\n\n"));
+ printf(_("Options:\n"));
+ printf(_(" -b, --old-bindir=BINDIR old cluster executable directory\n"));
+ printf(_(" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+ " same directory as pg_upgrade)\n"));
+ printf(_(" -c, --check check clusters only, don't change any data\n"));
+ printf(_(" -d, --old-datadir=DATADIR old cluster data directory\n"));
+ printf(_(" -D, --new-datadir=DATADIR new cluster data directory\n"));
+ printf(_(" -j, --jobs=NUM number of simultaneous processes or threads to use\n"));
+ printf(_(" -k, --link link instead of copying files to new cluster\n"));
+ printf(_(" -N, --no-sync do not wait for changes to be written safely to disk\n"));
+ printf(_(" -o, --old-options=OPTIONS old cluster options to pass to the server\n"));
+ printf(_(" -O, --new-options=OPTIONS new cluster options to pass to the server\n"));
+ printf(_(" -p, --old-port=PORT old cluster port number (default %d)\n"), old_cluster.port);
+ printf(_(" -P, --new-port=PORT new cluster port number (default %d)\n"), new_cluster.port);
+ printf(_(" -r, --retain retain SQL and log files after success\n"));
+ printf(_(" -s, --socketdir=DIR socket directory to use (default current dir.)\n"));
+ printf(_(" -U, --username=NAME cluster superuser (default \"%s\")\n"), os_info.user);
+ printf(_(" -v, --verbose enable verbose internal logging\n"));
+ printf(_(" -V, --version display version information, then exit\n"));
+ printf(_(" --clone clone instead of copying files to new cluster\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\n"
+ "Before running pg_upgrade you must:\n"
+ " create a new database cluster (using the new version of initdb)\n"
+ " shutdown the postmaster servicing the old cluster\n"
+ " shutdown the postmaster servicing the new cluster\n"));
+ printf(_("\n"
+ "When you run pg_upgrade, you must provide the following information:\n"
+ " the data directory for the old cluster (-d DATADIR)\n"
+ " the data directory for the new cluster (-D DATADIR)\n"
+ " the \"bin\" directory for the old version (-b BINDIR)\n"
+ " the \"bin\" directory for the new version (-B BINDIR)\n"));
+ printf(_("\n"
+ "For example:\n"
+ " pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+ "or\n"));
+#ifndef WIN32
+ printf(_(" $ export PGDATAOLD=oldCluster/data\n"
+ " $ export PGDATANEW=newCluster/data\n"
+ " $ export PGBINOLD=oldCluster/bin\n"
+ " $ export PGBINNEW=newCluster/bin\n"
+ " $ pg_upgrade\n"));
+#else
+ printf(_(" C:\\> set PGDATAOLD=oldCluster/data\n"
+ " C:\\> set PGDATANEW=newCluster/data\n"
+ " C:\\> set PGBINOLD=oldCluster/bin\n"
+ " C:\\> set PGBINNEW=newCluster/bin\n"
+ " C:\\> pg_upgrade\n"));
+#endif
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+
+/*
+ * check_required_directory()
+ *
+ * Checks a directory option.
+ * dirpath - the directory name supplied on the command line, or NULL
+ * envVarName - the name of an environment variable to get if dirpath is NULL
+ * useCwd - true if OK to default to CWD
+ * cmdLineOption - the command line option for this directory
+ * description - a description of this directory option
+ * missingOk - true if OK that both dirpath and envVarName are not existing
+ *
+ * We use the last two arguments to construct a meaningful error message if the
+ * user hasn't provided the required directory name.
+ */
+static void
+check_required_directory(char **dirpath, const char *envVarName, bool useCwd,
+ const char *cmdLineOption, const char *description,
+ bool missingOk)
+{
+ if (*dirpath == NULL || strlen(*dirpath) == 0)
+ {
+ const char *envVar;
+
+ if ((envVar = getenv(envVarName)) && strlen(envVar))
+ *dirpath = pg_strdup(envVar);
+ else if (useCwd)
+ {
+ char cwd[MAXPGPATH];
+
+ if (!getcwd(cwd, MAXPGPATH))
+ pg_fatal("could not determine current directory\n");
+ *dirpath = pg_strdup(cwd);
+ }
+ else if (missingOk)
+ return;
+ else
+ pg_fatal("You must identify the directory where the %s.\n"
+ "Please use the %s command-line option or the %s environment variable.\n",
+ description, cmdLineOption, envVarName);
+ }
+
+ /*
+ * Clean up the path, in particular trimming any trailing path separators,
+ * because we construct paths by appending to this path.
+ */
+ canonicalize_path(*dirpath);
+}
+
+/*
+ * adjust_data_dir
+ *
+ * If a configuration-only directory was specified, find the real data dir
+ * by querying the running server. This has limited checking because we
+ * can't check for a running server because we can't find postmaster.pid.
+ *
+ * On entry, cluster->pgdata has been set from command line or env variable,
+ * but cluster->pgconfig isn't set. We fill both variables with corrected
+ * values.
+ */
+void
+adjust_data_dir(ClusterInfo *cluster)
+{
+ char filename[MAXPGPATH];
+ char cmd[MAXPGPATH],
+ cmd_output[MAX_STRING];
+ FILE *fp,
+ *output;
+
+ /* Initially assume config dir and data dir are the same */
+ cluster->pgconfig = pg_strdup(cluster->pgdata);
+
+ /* If there is no postgresql.conf, it can't be a config-only dir */
+ snprintf(filename, sizeof(filename), "%s/postgresql.conf", cluster->pgconfig);
+ if ((fp = fopen(filename, "r")) == NULL)
+ return;
+ fclose(fp);
+
+ /* If PG_VERSION exists, it can't be a config-only dir */
+ snprintf(filename, sizeof(filename), "%s/PG_VERSION", cluster->pgconfig);
+ if ((fp = fopen(filename, "r")) != NULL)
+ {
+ fclose(fp);
+ return;
+ }
+
+ /* Must be a configuration directory, so find the real data directory. */
+
+ if (cluster == &old_cluster)
+ prep_status("Finding the real data directory for the source cluster");
+ else
+ prep_status("Finding the real data directory for the target cluster");
+
+ /*
+ * We don't have a data directory yet, so we can't check the PG version,
+ * so this might fail --- only works for PG 9.2+. If this fails,
+ * pg_upgrade will fail anyway because the data files will not be found.
+ */
+ snprintf(cmd, sizeof(cmd), "\"%s/postgres\" -D \"%s\" -C data_directory",
+ cluster->bindir, cluster->pgconfig);
+
+ if ((output = popen(cmd, "r")) == NULL ||
+ fgets(cmd_output, sizeof(cmd_output), output) == NULL)
+ pg_fatal("could not get data directory using %s: %s\n",
+ cmd, strerror(errno));
+
+ pclose(output);
+
+ /* strip trailing newline and carriage return */
+ (void) pg_strip_crlf(cmd_output);
+
+ cluster->pgdata = pg_strdup(cmd_output);
+
+ check_ok();
+}
+
+
+/*
+ * get_sock_dir
+ *
+ * Identify the socket directory to use for this cluster. If we're doing
+ * a live check (old cluster only), we need to find out where the postmaster
+ * is listening. Otherwise, we're going to put the socket into the current
+ * directory.
+ */
+void
+get_sock_dir(ClusterInfo *cluster, bool live_check)
+{
+#if defined(HAVE_UNIX_SOCKETS) && !defined(WIN32)
+ if (!live_check)
+ cluster->sockdir = user_opts.socketdir;
+ else
+ {
+ /*
+ * If we are doing a live check, we will use the old cluster's Unix
+ * domain socket directory so we can connect to the live server.
+ */
+ unsigned short orig_port = cluster->port;
+ char filename[MAXPGPATH],
+ line[MAXPGPATH];
+ FILE *fp;
+ int lineno;
+
+ snprintf(filename, sizeof(filename), "%s/postmaster.pid",
+ cluster->pgdata);
+ if ((fp = fopen(filename, "r")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n",
+ filename, strerror(errno));
+
+ for (lineno = 1;
+ lineno <= Max(LOCK_FILE_LINE_PORT, LOCK_FILE_LINE_SOCKET_DIR);
+ lineno++)
+ {
+ if (fgets(line, sizeof(line), fp) == NULL)
+ pg_fatal("could not read line %d from file \"%s\": %s\n",
+ lineno, filename, strerror(errno));
+
+ /* potentially overwrite user-supplied value */
+ if (lineno == LOCK_FILE_LINE_PORT)
+ sscanf(line, "%hu", &old_cluster.port);
+ if (lineno == LOCK_FILE_LINE_SOCKET_DIR)
+ {
+ /* strip trailing newline and carriage return */
+ cluster->sockdir = pg_strdup(line);
+ (void) pg_strip_crlf(cluster->sockdir);
+ }
+ }
+ fclose(fp);
+
+ /* warn of port number correction */
+ if (orig_port != DEF_PGUPORT && old_cluster.port != orig_port)
+ pg_log(PG_WARNING, "user-supplied old port number %hu corrected to %hu\n",
+ orig_port, cluster->port);
+ }
+#else /* !HAVE_UNIX_SOCKETS || WIN32 */
+ cluster->sockdir = NULL;
+#endif
+}
diff --git a/src/bin/pg_upgrade/parallel.c b/src/bin/pg_upgrade/parallel.c
new file mode 100644
index 0000000..ca40df7
--- /dev/null
+++ b/src/bin/pg_upgrade/parallel.c
@@ -0,0 +1,347 @@
+/*
+ * parallel.c
+ *
+ * multi-process support
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/parallel.c
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/wait.h>
+#ifdef WIN32
+#include <io.h>
+#endif
+
+#include "pg_upgrade.h"
+
+static int parallel_jobs;
+
+#ifdef WIN32
+/*
+ * Array holding all active threads. There can't be any gaps/zeros so
+ * it can be passed to WaitForMultipleObjects(). We use two arrays
+ * so the thread_handles array can be passed to WaitForMultipleObjects().
+ */
+HANDLE *thread_handles;
+
+typedef struct
+{
+ char *log_file;
+ char *opt_log_file;
+ char *cmd;
+} exec_thread_arg;
+
+typedef struct
+{
+ DbInfoArr *old_db_arr;
+ DbInfoArr *new_db_arr;
+ char *old_pgdata;
+ char *new_pgdata;
+ char *old_tablespace;
+} transfer_thread_arg;
+
+exec_thread_arg **exec_thread_args;
+transfer_thread_arg **transfer_thread_args;
+
+/* track current thread_args struct so reap_child() can be used for all cases */
+void **cur_thread_args;
+
+DWORD win32_exec_prog(exec_thread_arg *args);
+DWORD win32_transfer_all_new_dbs(transfer_thread_arg *args);
+#endif
+
+/*
+ * parallel_exec_prog
+ *
+ * This has the same API as exec_prog, except it does parallel execution,
+ * and therefore must throw errors and doesn't return an error status.
+ */
+void
+parallel_exec_prog(const char *log_file, const char *opt_log_file,
+ const char *fmt,...)
+{
+ va_list args;
+ char cmd[MAX_STRING];
+
+#ifndef WIN32
+ pid_t child;
+#else
+ HANDLE child;
+ exec_thread_arg *new_arg;
+#endif
+
+ va_start(args, fmt);
+ vsnprintf(cmd, sizeof(cmd), fmt, args);
+ va_end(args);
+
+ if (user_opts.jobs <= 1)
+ /* exit_on_error must be true to allow jobs */
+ exec_prog(log_file, opt_log_file, true, true, "%s", cmd);
+ else
+ {
+ /* parallel */
+#ifdef WIN32
+ if (thread_handles == NULL)
+ thread_handles = pg_malloc(user_opts.jobs * sizeof(HANDLE));
+
+ if (exec_thread_args == NULL)
+ {
+ int i;
+
+ exec_thread_args = pg_malloc(user_opts.jobs * sizeof(exec_thread_arg *));
+
+ /*
+ * For safety and performance, we keep the args allocated during
+ * the entire life of the process, and we don't free the args in a
+ * thread different from the one that allocated it.
+ */
+ for (i = 0; i < user_opts.jobs; i++)
+ exec_thread_args[i] = pg_malloc0(sizeof(exec_thread_arg));
+ }
+
+ cur_thread_args = (void **) exec_thread_args;
+#endif
+ /* harvest any dead children */
+ while (reap_child(false) == true)
+ ;
+
+ /* must we wait for a dead child? */
+ if (parallel_jobs >= user_opts.jobs)
+ reap_child(true);
+
+ /* set this before we start the job */
+ parallel_jobs++;
+
+ /* Ensure stdio state is quiesced before forking */
+ fflush(NULL);
+
+#ifndef WIN32
+ child = fork();
+ if (child == 0)
+ /* use _exit to skip atexit() functions */
+ _exit(!exec_prog(log_file, opt_log_file, true, true, "%s", cmd));
+ else if (child < 0)
+ /* fork failed */
+ pg_fatal("could not create worker process: %s\n", strerror(errno));
+#else
+ /* empty array element are always at the end */
+ new_arg = exec_thread_args[parallel_jobs - 1];
+
+ /* Can only pass one pointer into the function, so use a struct */
+ if (new_arg->log_file)
+ pg_free(new_arg->log_file);
+ new_arg->log_file = pg_strdup(log_file);
+ if (new_arg->opt_log_file)
+ pg_free(new_arg->opt_log_file);
+ new_arg->opt_log_file = opt_log_file ? pg_strdup(opt_log_file) : NULL;
+ if (new_arg->cmd)
+ pg_free(new_arg->cmd);
+ new_arg->cmd = pg_strdup(cmd);
+
+ child = (HANDLE) _beginthreadex(NULL, 0, (void *) win32_exec_prog,
+ new_arg, 0, NULL);
+ if (child == 0)
+ pg_fatal("could not create worker thread: %s\n", strerror(errno));
+
+ thread_handles[parallel_jobs - 1] = child;
+#endif
+ }
+}
+
+
+#ifdef WIN32
+DWORD
+win32_exec_prog(exec_thread_arg *args)
+{
+ int ret;
+
+ ret = !exec_prog(args->log_file, args->opt_log_file, true, true, "%s", args->cmd);
+
+ /* terminates thread */
+ return ret;
+}
+#endif
+
+
+/*
+ * parallel_transfer_all_new_dbs
+ *
+ * This has the same API as transfer_all_new_dbs, except it does parallel execution
+ * by transferring multiple tablespaces in parallel
+ */
+void
+parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
+ char *old_pgdata, char *new_pgdata,
+ char *old_tablespace)
+{
+#ifndef WIN32
+ pid_t child;
+#else
+ HANDLE child;
+ transfer_thread_arg *new_arg;
+#endif
+
+ if (user_opts.jobs <= 1)
+ transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata, new_pgdata, NULL);
+ else
+ {
+ /* parallel */
+#ifdef WIN32
+ if (thread_handles == NULL)
+ thread_handles = pg_malloc(user_opts.jobs * sizeof(HANDLE));
+
+ if (transfer_thread_args == NULL)
+ {
+ int i;
+
+ transfer_thread_args = pg_malloc(user_opts.jobs * sizeof(transfer_thread_arg *));
+
+ /*
+ * For safety and performance, we keep the args allocated during
+ * the entire life of the process, and we don't free the args in a
+ * thread different from the one that allocated it.
+ */
+ for (i = 0; i < user_opts.jobs; i++)
+ transfer_thread_args[i] = pg_malloc0(sizeof(transfer_thread_arg));
+ }
+
+ cur_thread_args = (void **) transfer_thread_args;
+#endif
+ /* harvest any dead children */
+ while (reap_child(false) == true)
+ ;
+
+ /* must we wait for a dead child? */
+ if (parallel_jobs >= user_opts.jobs)
+ reap_child(true);
+
+ /* set this before we start the job */
+ parallel_jobs++;
+
+ /* Ensure stdio state is quiesced before forking */
+ fflush(NULL);
+
+#ifndef WIN32
+ child = fork();
+ if (child == 0)
+ {
+ transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata, new_pgdata,
+ old_tablespace);
+ /* if we take another exit path, it will be non-zero */
+ /* use _exit to skip atexit() functions */
+ _exit(0);
+ }
+ else if (child < 0)
+ /* fork failed */
+ pg_fatal("could not create worker process: %s\n", strerror(errno));
+#else
+ /* empty array element are always at the end */
+ new_arg = transfer_thread_args[parallel_jobs - 1];
+
+ /* Can only pass one pointer into the function, so use a struct */
+ new_arg->old_db_arr = old_db_arr;
+ new_arg->new_db_arr = new_db_arr;
+ if (new_arg->old_pgdata)
+ pg_free(new_arg->old_pgdata);
+ new_arg->old_pgdata = pg_strdup(old_pgdata);
+ if (new_arg->new_pgdata)
+ pg_free(new_arg->new_pgdata);
+ new_arg->new_pgdata = pg_strdup(new_pgdata);
+ if (new_arg->old_tablespace)
+ pg_free(new_arg->old_tablespace);
+ new_arg->old_tablespace = old_tablespace ? pg_strdup(old_tablespace) : NULL;
+
+ child = (HANDLE) _beginthreadex(NULL, 0, (void *) win32_transfer_all_new_dbs,
+ new_arg, 0, NULL);
+ if (child == 0)
+ pg_fatal("could not create worker thread: %s\n", strerror(errno));
+
+ thread_handles[parallel_jobs - 1] = child;
+#endif
+ }
+}
+
+
+#ifdef WIN32
+DWORD
+win32_transfer_all_new_dbs(transfer_thread_arg *args)
+{
+ transfer_all_new_dbs(args->old_db_arr, args->new_db_arr, args->old_pgdata,
+ args->new_pgdata, args->old_tablespace);
+
+ /* terminates thread */
+ return 0;
+}
+#endif
+
+
+/*
+ * collect status from a completed worker child
+ */
+bool
+reap_child(bool wait_for_child)
+{
+#ifndef WIN32
+ int work_status;
+ pid_t child;
+#else
+ int thread_num;
+ DWORD res;
+#endif
+
+ if (user_opts.jobs <= 1 || parallel_jobs == 0)
+ return false;
+
+#ifndef WIN32
+ child = waitpid(-1, &work_status, wait_for_child ? 0 : WNOHANG);
+ if (child == (pid_t) -1)
+ pg_fatal("%s() failed: %s\n", "waitpid", strerror(errno));
+ if (child == 0)
+ return false; /* no children, or no dead children */
+ if (work_status != 0)
+ pg_fatal("child process exited abnormally: status %d\n", work_status);
+#else
+ /* wait for one to finish */
+ thread_num = WaitForMultipleObjects(parallel_jobs, thread_handles,
+ false, wait_for_child ? INFINITE : 0);
+
+ if (thread_num == WAIT_TIMEOUT || thread_num == WAIT_FAILED)
+ return false;
+
+ /* compute thread index in active_threads */
+ thread_num -= WAIT_OBJECT_0;
+
+ /* get the result */
+ GetExitCodeThread(thread_handles[thread_num], &res);
+ if (res != 0)
+ pg_fatal("child worker exited abnormally: %s\n", strerror(errno));
+
+ /* dispose of handle to stop leaks */
+ CloseHandle(thread_handles[thread_num]);
+
+ /* Move last slot into dead child's position */
+ if (thread_num != parallel_jobs - 1)
+ {
+ void *tmp_args;
+
+ thread_handles[thread_num] = thread_handles[parallel_jobs - 1];
+
+ /*
+ * Move last active thread arg struct into the now-dead slot, and the
+ * now-dead slot to the end for reuse by the next thread. Though the
+ * thread struct is in use by another thread, we can safely swap the
+ * struct pointers within the array.
+ */
+ tmp_args = cur_thread_args[thread_num];
+ cur_thread_args[thread_num] = cur_thread_args[parallel_jobs - 1];
+ cur_thread_args[parallel_jobs - 1] = tmp_args;
+ }
+#endif
+
+ /* do this after job has been removed */
+ parallel_jobs--;
+
+ return true;
+}
diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c
new file mode 100644
index 0000000..265d829
--- /dev/null
+++ b/src/bin/pg_upgrade/pg_upgrade.c
@@ -0,0 +1,785 @@
+/*
+ * pg_upgrade.c
+ *
+ * main source file
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/pg_upgrade.c
+ */
+
+/*
+ * To simplify the upgrade process, we force certain system values to be
+ * identical between old and new clusters:
+ *
+ * We control all assignments of pg_class.oid (and relfilenode) so toast
+ * oids are the same between old and new clusters. This is important
+ * because toast oids are stored as toast pointers in user tables.
+ *
+ * While pg_class.oid and pg_class.relfilenode are initially the same in a
+ * cluster, they can diverge due to CLUSTER, REINDEX, or VACUUM FULL. We
+ * control assignments of pg_class.relfilenode because we want the filenames
+ * to match between the old and new cluster.
+ *
+ * We control assignment of pg_tablespace.oid because we want the oid to match
+ * between the old and new cluster.
+ *
+ * We control all assignments of pg_type.oid because these oids are stored
+ * in user composite type values.
+ *
+ * We control all assignments of pg_enum.oid because these oids are stored
+ * in user tables as enum values.
+ *
+ * We control all assignments of pg_authid.oid for historical reasons (the
+ * oids used to be stored in pg_largeobject_metadata, which is now copied via
+ * SQL commands), that might change at some point in the future.
+ */
+
+
+
+#include "postgres_fe.h"
+
+#include <time.h>
+
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
+#endif
+
+#include "catalog/pg_class_d.h"
+#include "common/file_perm.h"
+#include "common/logging.h"
+#include "common/restricted_token.h"
+#include "fe_utils/string_utils.h"
+#include "pg_upgrade.h"
+
+static void prepare_new_cluster(void);
+static void prepare_new_globals(void);
+static void create_new_objects(void);
+static void copy_xact_xlog_xid(void);
+static void set_frozenxids(bool minmxid_only);
+static void make_outputdirs(char *pgdata);
+static void setup(char *argv0, bool *live_check);
+
+ClusterInfo old_cluster,
+ new_cluster;
+OSInfo os_info;
+
+char *output_files[] = {
+ SERVER_LOG_FILE,
+#ifdef WIN32
+ /* unique file for pg_ctl start */
+ SERVER_START_LOG_FILE,
+#endif
+ UTILITY_LOG_FILE,
+ INTERNAL_LOG_FILE,
+ NULL
+};
+
+
+int
+main(int argc, char **argv)
+{
+ char *deletion_script_file_name = NULL;
+ bool live_check = false;
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_upgrade"));
+
+ /* Set default restrictive mask until new cluster permissions are read */
+ umask(PG_MODE_MASK_OWNER);
+
+ parseCommandLine(argc, argv);
+
+ get_restricted_token();
+
+ adjust_data_dir(&old_cluster);
+ adjust_data_dir(&new_cluster);
+
+ /*
+ * Set mask based on PGDATA permissions, needed for the creation of the
+ * output directories with correct permissions.
+ */
+ if (!GetDataDirectoryCreatePerm(new_cluster.pgdata))
+ pg_fatal("could not read permissions of directory \"%s\": %s\n",
+ new_cluster.pgdata, strerror(errno));
+
+ umask(pg_mode_mask);
+
+ /*
+ * This needs to happen after adjusting the data directory of the new
+ * cluster in adjust_data_dir().
+ */
+ make_outputdirs(new_cluster.pgdata);
+
+ setup(argv[0], &live_check);
+
+ output_check_banner(live_check);
+
+ check_cluster_versions();
+
+ get_sock_dir(&old_cluster, live_check);
+ get_sock_dir(&new_cluster, false);
+
+ check_cluster_compatibility(live_check);
+
+ check_and_dump_old_cluster(live_check);
+
+
+ /* -- NEW -- */
+ start_postmaster(&new_cluster, true);
+
+ check_new_cluster();
+ report_clusters_compatible();
+
+ pg_log(PG_REPORT,
+ "\n"
+ "Performing Upgrade\n"
+ "------------------\n");
+
+ prepare_new_cluster();
+
+ stop_postmaster(false);
+
+ /*
+ * Destructive Changes to New Cluster
+ */
+
+ copy_xact_xlog_xid();
+
+ /* New now using xids of the old system */
+
+ /* -- NEW -- */
+ start_postmaster(&new_cluster, true);
+
+ prepare_new_globals();
+
+ create_new_objects();
+
+ stop_postmaster(false);
+
+ /*
+ * Most failures happen in create_new_objects(), which has completed at
+ * this point. We do this here because it is just before linking, which
+ * will link the old and new cluster data files, preventing the old
+ * cluster from being safely started once the new cluster is started.
+ */
+ if (user_opts.transfer_mode == TRANSFER_MODE_LINK)
+ disable_old_cluster();
+
+ transfer_all_new_tablespaces(&old_cluster.dbarr, &new_cluster.dbarr,
+ old_cluster.pgdata, new_cluster.pgdata);
+
+ /*
+ * Assuming OIDs are only used in system tables, there is no need to
+ * restore the OID counter because we have not transferred any OIDs from
+ * the old system, but we do it anyway just in case. We do it late here
+ * because there is no need to have the schema load use new oids.
+ */
+ prep_status("Setting next OID for new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -o %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_nxtoid,
+ new_cluster.pgdata);
+ check_ok();
+
+ if (user_opts.do_sync)
+ {
+ prep_status("Sync data directory to disk");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/initdb\" --sync-only \"%s\"", new_cluster.bindir,
+ new_cluster.pgdata);
+ check_ok();
+ }
+
+ create_script_for_old_cluster_deletion(&deletion_script_file_name);
+
+ issue_warnings_and_set_wal_level();
+
+ pg_log(PG_REPORT,
+ "\n"
+ "Upgrade Complete\n"
+ "----------------\n");
+
+ output_completion_banner(deletion_script_file_name);
+
+ pg_free(deletion_script_file_name);
+
+ cleanup_output_dirs();
+
+ return 0;
+}
+
+/*
+ * Create and assign proper permissions to the set of output directories
+ * used to store any data generated internally, filling in log_opts in
+ * the process.
+ */
+static void
+make_outputdirs(char *pgdata)
+{
+ FILE *fp;
+ char **filename;
+ time_t run_time = time(NULL);
+ char filename_path[MAXPGPATH];
+ char timebuf[128];
+ struct timeval time;
+ time_t tt;
+ int len;
+
+ log_opts.rootdir = (char *) pg_malloc0(MAXPGPATH);
+ len = snprintf(log_opts.rootdir, MAXPGPATH, "%s/%s", pgdata, BASE_OUTPUTDIR);
+ if (len >= MAXPGPATH)
+ pg_fatal("directory path for new cluster is too long\n");
+
+ /* BASE_OUTPUTDIR/$timestamp/ */
+ gettimeofday(&time, NULL);
+ tt = (time_t) time.tv_sec;
+ strftime(timebuf, sizeof(timebuf), "%Y%m%dT%H%M%S", localtime(&tt));
+ /* append milliseconds */
+ snprintf(timebuf + strlen(timebuf), sizeof(timebuf) - strlen(timebuf),
+ ".%03d", (int) (time.tv_usec / 1000));
+ log_opts.basedir = (char *) pg_malloc0(MAXPGPATH);
+ len = snprintf(log_opts.basedir, MAXPGPATH, "%s/%s", log_opts.rootdir,
+ timebuf);
+ if (len >= MAXPGPATH)
+ pg_fatal("directory path for new cluster is too long\n");
+
+ /* BASE_OUTPUTDIR/$timestamp/dump/ */
+ log_opts.dumpdir = (char *) pg_malloc0(MAXPGPATH);
+ len = snprintf(log_opts.dumpdir, MAXPGPATH, "%s/%s/%s", log_opts.rootdir,
+ timebuf, DUMP_OUTPUTDIR);
+ if (len >= MAXPGPATH)
+ pg_fatal("directory path for new cluster is too long\n");
+
+ /* BASE_OUTPUTDIR/$timestamp/log/ */
+ log_opts.logdir = (char *) pg_malloc0(MAXPGPATH);
+ len = snprintf(log_opts.logdir, MAXPGPATH, "%s/%s/%s", log_opts.rootdir,
+ timebuf, LOG_OUTPUTDIR);
+ if (len >= MAXPGPATH)
+ pg_fatal("directory path for new cluster is too long\n");
+
+ /*
+ * Ignore the error case where the root path exists, as it is kept the
+ * same across runs.
+ */
+ if (mkdir(log_opts.rootdir, pg_dir_create_mode) < 0 && errno != EEXIST)
+ pg_fatal("could not create directory \"%s\": %m\n", log_opts.rootdir);
+ if (mkdir(log_opts.basedir, pg_dir_create_mode) < 0)
+ pg_fatal("could not create directory \"%s\": %m\n", log_opts.basedir);
+ if (mkdir(log_opts.dumpdir, pg_dir_create_mode) < 0)
+ pg_fatal("could not create directory \"%s\": %m\n", log_opts.dumpdir);
+ if (mkdir(log_opts.logdir, pg_dir_create_mode) < 0)
+ pg_fatal("could not create directory \"%s\": %m\n", log_opts.logdir);
+
+ len = snprintf(filename_path, sizeof(filename_path), "%s/%s",
+ log_opts.logdir, INTERNAL_LOG_FILE);
+ if (len >= sizeof(filename_path))
+ pg_fatal("directory path for new cluster is too long\n");
+
+ if ((log_opts.internal = fopen_priv(filename_path, "a")) == NULL)
+ pg_fatal("could not open log file \"%s\": %m\n", filename_path);
+
+ /* label start of upgrade in logfiles */
+ for (filename = output_files; *filename != NULL; filename++)
+ {
+ len = snprintf(filename_path, sizeof(filename_path), "%s/%s",
+ log_opts.logdir, *filename);
+ if (len >= sizeof(filename_path))
+ pg_fatal("directory path for new cluster is too long\n");
+ if ((fp = fopen_priv(filename_path, "a")) == NULL)
+ pg_fatal("could not write to log file \"%s\": %m\n", filename_path);
+
+ fprintf(fp,
+ "-----------------------------------------------------------------\n"
+ " pg_upgrade run on %s"
+ "-----------------------------------------------------------------\n\n",
+ ctime(&run_time));
+ fclose(fp);
+ }
+}
+
+
+static void
+setup(char *argv0, bool *live_check)
+{
+ /*
+ * make sure the user has a clean environment, otherwise, we may confuse
+ * libpq when we connect to one (or both) of the servers.
+ */
+ check_pghost_envvar();
+
+ /*
+ * In case the user hasn't specified the directory for the new binaries
+ * with -B, default to using the path of the currently executed pg_upgrade
+ * binary.
+ */
+ if (!new_cluster.bindir)
+ {
+ char exec_path[MAXPGPATH];
+
+ if (find_my_exec(argv0, exec_path) < 0)
+ pg_fatal("%s: could not find own program executable\n", argv0);
+ /* Trim off program name and keep just path */
+ *last_dir_separator(exec_path) = '\0';
+ canonicalize_path(exec_path);
+ new_cluster.bindir = pg_strdup(exec_path);
+ }
+
+ verify_directories();
+
+ /* no postmasters should be running, except for a live check */
+ if (pid_lock_file_exists(old_cluster.pgdata))
+ {
+ /*
+ * If we have a postmaster.pid file, try to start the server. If it
+ * starts, the pid file was stale, so stop the server. If it doesn't
+ * start, assume the server is running. If the pid file is left over
+ * from a server crash, this also allows any committed transactions
+ * stored in the WAL to be replayed so they are not lost, because WAL
+ * files are not transferred from old to new servers. We later check
+ * for a clean shutdown.
+ */
+ if (start_postmaster(&old_cluster, false))
+ stop_postmaster(false);
+ else
+ {
+ if (!user_opts.check)
+ pg_fatal("There seems to be a postmaster servicing the old cluster.\n"
+ "Please shutdown that postmaster and try again.\n");
+ else
+ *live_check = true;
+ }
+ }
+
+ /* same goes for the new postmaster */
+ if (pid_lock_file_exists(new_cluster.pgdata))
+ {
+ if (start_postmaster(&new_cluster, false))
+ stop_postmaster(false);
+ else
+ pg_fatal("There seems to be a postmaster servicing the new cluster.\n"
+ "Please shutdown that postmaster and try again.\n");
+ }
+}
+
+
+static void
+prepare_new_cluster(void)
+{
+ /*
+ * It would make more sense to freeze after loading the schema, but that
+ * would cause us to lose the frozenxids restored by the load. We use
+ * --analyze so autovacuum doesn't update statistics later
+ */
+ prep_status("Analyzing all rows in the new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/vacuumdb\" %s --all --analyze %s",
+ new_cluster.bindir, cluster_conn_opts(&new_cluster),
+ log_opts.verbose ? "--verbose" : "");
+ check_ok();
+
+ /*
+ * We do freeze after analyze so pg_statistic is also frozen. template0 is
+ * not frozen here, but data rows were frozen by initdb, and we set its
+ * datfrozenxid, relfrozenxids, and relminmxid later to match the new xid
+ * counter later.
+ */
+ prep_status("Freezing all rows in the new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/vacuumdb\" %s --all --freeze %s",
+ new_cluster.bindir, cluster_conn_opts(&new_cluster),
+ log_opts.verbose ? "--verbose" : "");
+ check_ok();
+}
+
+
+static void
+prepare_new_globals(void)
+{
+ /*
+ * Before we restore anything, set frozenxids of initdb-created tables.
+ */
+ set_frozenxids(false);
+
+ /*
+ * Now restore global objects (roles and tablespaces).
+ */
+ prep_status("Restoring global objects in the new cluster");
+
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/psql\" " EXEC_PSQL_ARGS " %s -f \"%s/%s\"",
+ new_cluster.bindir, cluster_conn_opts(&new_cluster),
+ log_opts.dumpdir,
+ GLOBALS_DUMP_FILE);
+ check_ok();
+}
+
+
+static void
+create_new_objects(void)
+{
+ int dbnum;
+
+ prep_status_progress("Restoring database schemas in the new cluster");
+
+ /*
+ * We cannot process the template1 database concurrently with others,
+ * because when it's transiently dropped, connection attempts would fail.
+ * So handle it in a separate non-parallelized pass.
+ */
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ char sql_file_name[MAXPGPATH],
+ log_file_name[MAXPGPATH];
+ DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum];
+ const char *create_opts;
+
+ /* Process only template1 in this pass */
+ if (strcmp(old_db->db_name, "template1") != 0)
+ continue;
+
+ pg_log(PG_STATUS, "%s", old_db->db_name);
+ snprintf(sql_file_name, sizeof(sql_file_name), DB_DUMP_FILE_MASK, old_db->db_oid);
+ snprintf(log_file_name, sizeof(log_file_name), DB_DUMP_LOG_FILE_MASK, old_db->db_oid);
+
+ /*
+ * template1 database will already exist in the target installation,
+ * so tell pg_restore to drop and recreate it; otherwise we would fail
+ * to propagate its database-level properties.
+ */
+ create_opts = "--clean --create";
+
+ exec_prog(log_file_name,
+ NULL,
+ true,
+ true,
+ "\"%s/pg_restore\" %s %s --exit-on-error --verbose "
+ "--dbname postgres \"%s/%s\"",
+ new_cluster.bindir,
+ cluster_conn_opts(&new_cluster),
+ create_opts,
+ log_opts.dumpdir,
+ sql_file_name);
+
+ break; /* done once we've processed template1 */
+ }
+
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ char sql_file_name[MAXPGPATH],
+ log_file_name[MAXPGPATH];
+ DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum];
+ const char *create_opts;
+
+ /* Skip template1 in this pass */
+ if (strcmp(old_db->db_name, "template1") == 0)
+ continue;
+
+ pg_log(PG_STATUS, "%s", old_db->db_name);
+ snprintf(sql_file_name, sizeof(sql_file_name), DB_DUMP_FILE_MASK, old_db->db_oid);
+ snprintf(log_file_name, sizeof(log_file_name), DB_DUMP_LOG_FILE_MASK, old_db->db_oid);
+
+ /*
+ * postgres database will already exist in the target installation, so
+ * tell pg_restore to drop and recreate it; otherwise we would fail to
+ * propagate its database-level properties.
+ */
+ if (strcmp(old_db->db_name, "postgres") == 0)
+ create_opts = "--clean --create";
+ else
+ create_opts = "--create";
+
+ parallel_exec_prog(log_file_name,
+ NULL,
+ "\"%s/pg_restore\" %s %s --exit-on-error --verbose "
+ "--dbname template1 \"%s/%s\"",
+ new_cluster.bindir,
+ cluster_conn_opts(&new_cluster),
+ create_opts,
+ log_opts.dumpdir,
+ sql_file_name);
+ }
+
+ /* reap all children */
+ while (reap_child(true) == true)
+ ;
+
+ end_progress_output();
+ check_ok();
+
+ /*
+ * We don't have minmxids for databases or relations in pre-9.3 clusters,
+ * so set those after we have restored the schema.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 902)
+ set_frozenxids(true);
+
+ /* update new_cluster info now that we have objects in the databases */
+ get_db_and_rel_infos(&new_cluster);
+}
+
+/*
+ * Delete the given subdirectory contents from the new cluster
+ */
+static void
+remove_new_subdir(const char *subdir, bool rmtopdir)
+{
+ char new_path[MAXPGPATH];
+
+ prep_status("Deleting files from new %s", subdir);
+
+ snprintf(new_path, sizeof(new_path), "%s/%s", new_cluster.pgdata, subdir);
+ if (!rmtree(new_path, rmtopdir))
+ pg_fatal("could not delete directory \"%s\"\n", new_path);
+
+ check_ok();
+}
+
+/*
+ * Copy the files from the old cluster into it
+ */
+static void
+copy_subdir_files(const char *old_subdir, const char *new_subdir)
+{
+ char old_path[MAXPGPATH];
+ char new_path[MAXPGPATH];
+
+ remove_new_subdir(new_subdir, true);
+
+ snprintf(old_path, sizeof(old_path), "%s/%s", old_cluster.pgdata, old_subdir);
+ snprintf(new_path, sizeof(new_path), "%s/%s", new_cluster.pgdata, new_subdir);
+
+ prep_status("Copying old %s to new server", old_subdir);
+
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+#ifndef WIN32
+ "cp -Rf \"%s\" \"%s\"",
+#else
+ /* flags: everything, no confirm, quiet, overwrite read-only */
+ "xcopy /e /y /q /r \"%s\" \"%s\\\"",
+#endif
+ old_path, new_path);
+
+ check_ok();
+}
+
+static void
+copy_xact_xlog_xid(void)
+{
+ /*
+ * Copy old commit logs to new data dir. pg_clog has been renamed to
+ * pg_xact in post-10 clusters.
+ */
+ copy_subdir_files(GET_MAJOR_VERSION(old_cluster.major_version) <= 906 ?
+ "pg_clog" : "pg_xact",
+ GET_MAJOR_VERSION(new_cluster.major_version) <= 906 ?
+ "pg_clog" : "pg_xact");
+
+ prep_status("Setting oldest XID for new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -f -u %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_oldstxid,
+ new_cluster.pgdata);
+ check_ok();
+
+ /* set the next transaction id and epoch of the new cluster */
+ prep_status("Setting next transaction ID and epoch for new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -f -x %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_nxtxid,
+ new_cluster.pgdata);
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -f -e %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_nxtepoch,
+ new_cluster.pgdata);
+ /* must reset commit timestamp limits also */
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -f -c %u,%u \"%s\"",
+ new_cluster.bindir,
+ old_cluster.controldata.chkpnt_nxtxid,
+ old_cluster.controldata.chkpnt_nxtxid,
+ new_cluster.pgdata);
+ check_ok();
+
+ /*
+ * If the old server is before the MULTIXACT_FORMATCHANGE_CAT_VER change
+ * (see pg_upgrade.h) and the new server is after, then we don't copy
+ * pg_multixact files, but we need to reset pg_control so that the new
+ * server doesn't attempt to read multis older than the cutoff value.
+ */
+ if (old_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER &&
+ new_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
+ {
+ copy_subdir_files("pg_multixact/offsets", "pg_multixact/offsets");
+ copy_subdir_files("pg_multixact/members", "pg_multixact/members");
+
+ prep_status("Setting next multixact ID and offset for new cluster");
+
+ /*
+ * we preserve all files and contents, so we must preserve both "next"
+ * counters here and the oldest multi present on system.
+ */
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -O %u -m %u,%u \"%s\"",
+ new_cluster.bindir,
+ old_cluster.controldata.chkpnt_nxtmxoff,
+ old_cluster.controldata.chkpnt_nxtmulti,
+ old_cluster.controldata.chkpnt_oldstMulti,
+ new_cluster.pgdata);
+ check_ok();
+ }
+ else if (new_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
+ {
+ /*
+ * Remove offsets/0000 file created by initdb that no longer matches
+ * the new multi-xid value. "members" starts at zero so no need to
+ * remove it.
+ */
+ remove_new_subdir("pg_multixact/offsets", false);
+
+ prep_status("Setting oldest multixact ID in new cluster");
+
+ /*
+ * We don't preserve files in this case, but it's important that the
+ * oldest multi is set to the latest value used by the old system, so
+ * that multixact.c returns the empty set for multis that might be
+ * present on disk. We set next multi to the value following that; it
+ * might end up wrapped around (i.e. 0) if the old cluster had
+ * next=MaxMultiXactId, but multixact.c can cope with that just fine.
+ */
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -m %u,%u \"%s\"",
+ new_cluster.bindir,
+ old_cluster.controldata.chkpnt_nxtmulti + 1,
+ old_cluster.controldata.chkpnt_nxtmulti,
+ new_cluster.pgdata);
+ check_ok();
+ }
+
+ /* now reset the wal archives in the new cluster */
+ prep_status("Resetting WAL archives");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ /* use timeline 1 to match controldata and no WAL history file */
+ "\"%s/pg_resetwal\" -l 00000001%s \"%s\"", new_cluster.bindir,
+ old_cluster.controldata.nextxlogfile + 8,
+ new_cluster.pgdata);
+ check_ok();
+}
+
+
+/*
+ * set_frozenxids()
+ *
+ * This is called on the new cluster before we restore anything, with
+ * minmxid_only = false. Its purpose is to ensure that all initdb-created
+ * vacuumable tables have relfrozenxid/relminmxid matching the old cluster's
+ * xid/mxid counters. We also initialize the datfrozenxid/datminmxid of the
+ * built-in databases to match.
+ *
+ * As we create user tables later, their relfrozenxid/relminmxid fields will
+ * be restored properly by the binary-upgrade restore script. Likewise for
+ * user-database datfrozenxid/datminmxid. However, if we're upgrading from a
+ * pre-9.3 database, which does not store per-table or per-DB minmxid, then
+ * the relminmxid/datminmxid values filled in by the restore script will just
+ * be zeroes.
+ *
+ * Hence, with a pre-9.3 source database, a second call occurs after
+ * everything is restored, with minmxid_only = true. This pass will
+ * initialize all tables and databases, both those made by initdb and user
+ * objects, with the desired minmxid value. frozenxid values are left alone.
+ */
+static void
+set_frozenxids(bool minmxid_only)
+{
+ int dbnum;
+ PGconn *conn,
+ *conn_template1;
+ PGresult *dbres;
+ int ntups;
+ int i_datname;
+ int i_datallowconn;
+
+ if (!minmxid_only)
+ prep_status("Setting frozenxid and minmxid counters in new cluster");
+ else
+ prep_status("Setting minmxid counter in new cluster");
+
+ conn_template1 = connectToServer(&new_cluster, "template1");
+
+ if (!minmxid_only)
+ /* set pg_database.datfrozenxid */
+ PQclear(executeQueryOrDie(conn_template1,
+ "UPDATE pg_catalog.pg_database "
+ "SET datfrozenxid = '%u'",
+ old_cluster.controldata.chkpnt_nxtxid));
+
+ /* set pg_database.datminmxid */
+ PQclear(executeQueryOrDie(conn_template1,
+ "UPDATE pg_catalog.pg_database "
+ "SET datminmxid = '%u'",
+ old_cluster.controldata.chkpnt_nxtmulti));
+
+ /* get database names */
+ dbres = executeQueryOrDie(conn_template1,
+ "SELECT datname, datallowconn "
+ "FROM pg_catalog.pg_database");
+
+ i_datname = PQfnumber(dbres, "datname");
+ i_datallowconn = PQfnumber(dbres, "datallowconn");
+
+ ntups = PQntuples(dbres);
+ for (dbnum = 0; dbnum < ntups; dbnum++)
+ {
+ char *datname = PQgetvalue(dbres, dbnum, i_datname);
+ char *datallowconn = PQgetvalue(dbres, dbnum, i_datallowconn);
+
+ /*
+ * We must update databases where datallowconn = false, e.g.
+ * template0, because autovacuum increments their datfrozenxids,
+ * relfrozenxids, and relminmxid even if autovacuum is turned off, and
+ * even though all the data rows are already frozen. To enable this,
+ * we temporarily change datallowconn.
+ */
+ if (strcmp(datallowconn, "f") == 0)
+ PQclear(executeQueryOrDie(conn_template1,
+ "ALTER DATABASE %s ALLOW_CONNECTIONS = true",
+ quote_identifier(datname)));
+
+ conn = connectToServer(&new_cluster, datname);
+
+ if (!minmxid_only)
+ /* set pg_class.relfrozenxid */
+ PQclear(executeQueryOrDie(conn,
+ "UPDATE pg_catalog.pg_class "
+ "SET relfrozenxid = '%u' "
+ /* only heap, materialized view, and TOAST are vacuumed */
+ "WHERE relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_TOASTVALUE) ")",
+ old_cluster.controldata.chkpnt_nxtxid));
+
+ /* set pg_class.relminmxid */
+ PQclear(executeQueryOrDie(conn,
+ "UPDATE pg_catalog.pg_class "
+ "SET relminmxid = '%u' "
+ /* only heap, materialized view, and TOAST are vacuumed */
+ "WHERE relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_TOASTVALUE) ")",
+ old_cluster.controldata.chkpnt_nxtmulti));
+ PQfinish(conn);
+
+ /* Reset datallowconn flag */
+ if (strcmp(datallowconn, "f") == 0)
+ PQclear(executeQueryOrDie(conn_template1,
+ "ALTER DATABASE %s ALLOW_CONNECTIONS = false",
+ quote_identifier(datname)));
+ }
+
+ PQclear(dbres);
+
+ PQfinish(conn_template1);
+
+ check_ok();
+}
diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h
new file mode 100644
index 0000000..19ca68e
--- /dev/null
+++ b/src/bin/pg_upgrade/pg_upgrade.h
@@ -0,0 +1,466 @@
+/*
+ * pg_upgrade.h
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/pg_upgrade.h
+ */
+
+#include <unistd.h>
+#include <assert.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+
+#include "libpq-fe.h"
+
+/* For now, pg_upgrade does not use common/logging.c; use our own pg_fatal */
+#undef pg_fatal
+
+/* Use port in the private/dynamic port number range */
+#define DEF_PGUPORT 50432
+
+#define MAX_STRING 1024
+#define QUERY_ALLOC 8192
+
+#define MESSAGE_WIDTH 60
+
+#define GET_MAJOR_VERSION(v) ((v) / 100)
+
+/* contains both global db information and CREATE DATABASE commands */
+#define GLOBALS_DUMP_FILE "pg_upgrade_dump_globals.sql"
+#define DB_DUMP_FILE_MASK "pg_upgrade_dump_%u.custom"
+
+/*
+ * Base directories that include all the files generated internally, from the
+ * root path of the new cluster. The paths are dynamically built as of
+ * BASE_OUTPUTDIR/$timestamp/{LOG_OUTPUTDIR,DUMP_OUTPUTDIR} to ensure their
+ * uniqueness in each run.
+ */
+#define BASE_OUTPUTDIR "pg_upgrade_output.d"
+#define LOG_OUTPUTDIR "log"
+#define DUMP_OUTPUTDIR "dump"
+
+#define DB_DUMP_LOG_FILE_MASK "pg_upgrade_dump_%u.log"
+#define SERVER_LOG_FILE "pg_upgrade_server.log"
+#define UTILITY_LOG_FILE "pg_upgrade_utility.log"
+#define INTERNAL_LOG_FILE "pg_upgrade_internal.log"
+
+extern char *output_files[];
+
+/*
+ * WIN32 files do not accept writes from multiple processes
+ *
+ * On Win32, we can't send both pg_upgrade output and command output to the
+ * same file because we get the error: "The process cannot access the file
+ * because it is being used by another process." so send the pg_ctl
+ * command-line output to a new file, rather than into the server log file.
+ * Ideally we could use UTILITY_LOG_FILE for this, but some Windows platforms
+ * keep the pg_ctl output file open by the running postmaster, even after
+ * pg_ctl exits.
+ *
+ * We could use the Windows pgwin32_open() flags to allow shared file
+ * writes but is unclear how all other tools would use those flags, so
+ * we just avoid it and log a little differently on Windows; we adjust
+ * the error message appropriately.
+ */
+#ifndef WIN32
+#define SERVER_START_LOG_FILE SERVER_LOG_FILE
+#define SERVER_STOP_LOG_FILE SERVER_LOG_FILE
+#else
+#define SERVER_START_LOG_FILE "pg_upgrade_server_start.log"
+/*
+ * "pg_ctl start" keeps SERVER_START_LOG_FILE and SERVER_LOG_FILE open
+ * while the server is running, so we use UTILITY_LOG_FILE for "pg_ctl
+ * stop".
+ */
+#define SERVER_STOP_LOG_FILE UTILITY_LOG_FILE
+#endif
+
+
+#ifndef WIN32
+#define pg_mv_file rename
+#define PATH_SEPARATOR '/'
+#define PATH_QUOTE '\''
+#define RM_CMD "rm -f"
+#define RMDIR_CMD "rm -rf"
+#define SCRIPT_PREFIX "./"
+#define SCRIPT_EXT "sh"
+#define ECHO_QUOTE "'"
+#define ECHO_BLANK ""
+#else
+#define pg_mv_file pgrename
+#define PATH_SEPARATOR '\\'
+#define PATH_QUOTE '"'
+/* @ prefix disables command echo in .bat files */
+#define RM_CMD "@DEL /q"
+#define RMDIR_CMD "@RMDIR /s/q"
+#define SCRIPT_PREFIX ""
+#define SCRIPT_EXT "bat"
+#define EXE_EXT ".exe"
+#define ECHO_QUOTE ""
+#define ECHO_BLANK "."
+#endif
+
+
+/*
+ * The format of visibility map was changed with this 9.6 commit.
+ */
+#define VISIBILITY_MAP_FROZEN_BIT_CAT_VER 201603011
+
+/*
+ * pg_multixact format changed in 9.3 commit 0ac5ad5134f2769ccbaefec73844f85,
+ * ("Improve concurrency of foreign key locking") which also updated catalog
+ * version to this value. pg_upgrade behavior depends on whether old and new
+ * server versions are both newer than this, or only the new one is.
+ */
+#define MULTIXACT_FORMATCHANGE_CAT_VER 201301231
+
+/*
+ * large object chunk size added to pg_controldata,
+ * commit 5f93c37805e7485488480916b4585e098d3cc883
+ */
+#define LARGE_OBJECT_SIZE_PG_CONTROL_VER 942
+
+/*
+ * change in JSONB format during 9.4 beta
+ */
+#define JSONB_FORMAT_CHANGE_CAT_VER 201409291
+
+
+/*
+ * Each relation is represented by a relinfo structure.
+ */
+typedef struct
+{
+ /* Can't use NAMEDATALEN; not guaranteed to be same on client */
+ char *nspname; /* namespace name */
+ char *relname; /* relation name */
+ Oid reloid; /* relation OID */
+ Oid relfilenode; /* relation file node */
+ Oid indtable; /* if index, OID of its table, else 0 */
+ Oid toastheap; /* if toast table, OID of base table, else 0 */
+ char *tablespace; /* tablespace path; "" for cluster default */
+ bool nsp_alloc; /* should nspname be freed? */
+ bool tblsp_alloc; /* should tablespace be freed? */
+} RelInfo;
+
+typedef struct
+{
+ RelInfo *rels;
+ int nrels;
+} RelInfoArr;
+
+/*
+ * The following structure represents a relation mapping.
+ */
+typedef struct
+{
+ const char *old_tablespace;
+ const char *new_tablespace;
+ const char *old_tablespace_suffix;
+ const char *new_tablespace_suffix;
+ Oid db_oid;
+ Oid relfilenode;
+ /* the rest are used only for logging and error reporting */
+ char *nspname; /* namespaces */
+ char *relname;
+} FileNameMap;
+
+/*
+ * Structure to store database information
+ */
+typedef struct
+{
+ Oid db_oid; /* oid of the database */
+ char *db_name; /* database name */
+ char db_tablespace[MAXPGPATH]; /* database default tablespace
+ * path */
+ char *db_collate;
+ char *db_ctype;
+ char db_collprovider;
+ char *db_iculocale;
+ int db_encoding;
+ RelInfoArr rel_arr; /* array of all user relinfos */
+} DbInfo;
+
+typedef struct
+{
+ DbInfo *dbs; /* array of db infos */
+ int ndbs; /* number of db infos */
+} DbInfoArr;
+
+/*
+ * The following structure is used to hold pg_control information.
+ * Rather than using the backend's control structure we use our own
+ * structure to avoid pg_control version issues between releases.
+ */
+typedef struct
+{
+ uint32 ctrl_ver;
+ uint32 cat_ver;
+ char nextxlogfile[25];
+ uint32 chkpnt_nxtxid;
+ uint32 chkpnt_nxtepoch;
+ uint32 chkpnt_nxtoid;
+ uint32 chkpnt_nxtmulti;
+ uint32 chkpnt_nxtmxoff;
+ uint32 chkpnt_oldstMulti;
+ uint32 chkpnt_oldstxid;
+ uint32 align;
+ uint32 blocksz;
+ uint32 largesz;
+ uint32 walsz;
+ uint32 walseg;
+ uint32 ident;
+ uint32 index;
+ uint32 toast;
+ uint32 large_object;
+ bool date_is_int;
+ bool float8_pass_by_value;
+ uint32 data_checksum_version;
+} ControlData;
+
+/*
+ * Enumeration to denote transfer modes
+ */
+typedef enum
+{
+ TRANSFER_MODE_CLONE,
+ TRANSFER_MODE_COPY,
+ TRANSFER_MODE_LINK
+} transferMode;
+
+/*
+ * Enumeration to denote pg_log modes
+ */
+typedef enum
+{
+ PG_VERBOSE,
+ PG_STATUS,
+ PG_REPORT,
+ PG_WARNING,
+ PG_FATAL
+} eLogType;
+
+
+typedef long pgpid_t;
+
+
+/*
+ * cluster
+ *
+ * information about each cluster
+ */
+typedef struct
+{
+ ControlData controldata; /* pg_control information */
+ DbInfoArr dbarr; /* dbinfos array */
+ char *pgdata; /* pathname for cluster's $PGDATA directory */
+ char *pgconfig; /* pathname for cluster's config file
+ * directory */
+ char *bindir; /* pathname for cluster's executable directory */
+ char *pgopts; /* options to pass to the server, like pg_ctl
+ * -o */
+ char *sockdir; /* directory for Unix Domain socket, if any */
+ unsigned short port; /* port number where postmaster is waiting */
+ uint32 major_version; /* PG_VERSION of cluster */
+ char major_version_str[64]; /* string PG_VERSION of cluster */
+ uint32 bin_version; /* version returned from pg_ctl */
+ const char *tablespace_suffix; /* directory specification */
+} ClusterInfo;
+
+
+/*
+ * LogOpts
+*/
+typedef struct
+{
+ FILE *internal; /* internal log FILE */
+ bool verbose; /* true -> be verbose in messages */
+ bool retain; /* retain log files on success */
+ /* Set of internal directories for output files */
+ char *rootdir; /* Root directory, aka pg_upgrade_output.d */
+ char *basedir; /* Base output directory, with timestamp */
+ char *dumpdir; /* Dumps */
+ char *logdir; /* Log files */
+ bool isatty; /* is stdout a tty */
+} LogOpts;
+
+
+/*
+ * UserOpts
+*/
+typedef struct
+{
+ bool check; /* true -> ask user for permission to make
+ * changes */
+ bool do_sync; /* flush changes to disk */
+ transferMode transfer_mode; /* copy files or link them? */
+ int jobs; /* number of processes/threads to use */
+ char *socketdir; /* directory to use for Unix sockets */
+} UserOpts;
+
+typedef struct
+{
+ char *name;
+ int dbnum;
+} LibraryInfo;
+
+/*
+ * OSInfo
+ */
+typedef struct
+{
+ const char *progname; /* complete pathname for this program */
+ char *user; /* username for clusters */
+ bool user_specified; /* user specified on command-line */
+ char **old_tablespaces; /* tablespaces */
+ int num_old_tablespaces;
+ LibraryInfo *libraries; /* loadable libraries */
+ int num_libraries;
+ ClusterInfo *running_cluster;
+} OSInfo;
+
+
+/*
+ * Global variables
+ */
+extern LogOpts log_opts;
+extern UserOpts user_opts;
+extern ClusterInfo old_cluster,
+ new_cluster;
+extern OSInfo os_info;
+
+
+/* check.c */
+
+void output_check_banner(bool live_check);
+void check_and_dump_old_cluster(bool live_check);
+void check_new_cluster(void);
+void report_clusters_compatible(void);
+void issue_warnings_and_set_wal_level(void);
+void output_completion_banner(char *deletion_script_file_name);
+void check_cluster_versions(void);
+void check_cluster_compatibility(bool live_check);
+void create_script_for_old_cluster_deletion(char **deletion_script_file_name);
+
+
+/* controldata.c */
+
+void get_control_data(ClusterInfo *cluster, bool live_check);
+void check_control_data(ControlData *oldctrl, ControlData *newctrl);
+void disable_old_cluster(void);
+
+
+/* dump.c */
+
+void generate_old_dump(void);
+
+
+/* exec.c */
+
+#define EXEC_PSQL_ARGS "--echo-queries --set ON_ERROR_STOP=on --no-psqlrc --dbname=template1"
+
+bool exec_prog(const char *log_file, const char *opt_log_file,
+ bool report_error, bool exit_on_error, const char *fmt,...) pg_attribute_printf(5, 6);
+void verify_directories(void);
+bool pid_lock_file_exists(const char *datadir);
+
+
+/* file.c */
+
+void cloneFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName);
+void copyFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName);
+void linkFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName);
+void rewriteVisibilityMap(const char *fromfile, const char *tofile,
+ const char *schemaName, const char *relName);
+void check_file_clone(void);
+void check_hard_link(void);
+
+/* fopen_priv() is no longer different from fopen() */
+#define fopen_priv(path, mode) fopen(path, mode)
+
+/* function.c */
+
+void get_loadable_libraries(void);
+void check_loadable_libraries(void);
+
+/* info.c */
+
+FileNameMap *gen_db_file_maps(DbInfo *old_db,
+ DbInfo *new_db, int *nmaps, const char *old_pgdata,
+ const char *new_pgdata);
+void get_db_and_rel_infos(ClusterInfo *cluster);
+
+/* option.c */
+
+void parseCommandLine(int argc, char *argv[]);
+void adjust_data_dir(ClusterInfo *cluster);
+void get_sock_dir(ClusterInfo *cluster, bool live_check);
+
+/* relfilenode.c */
+
+void transfer_all_new_tablespaces(DbInfoArr *old_db_arr,
+ DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata);
+void transfer_all_new_dbs(DbInfoArr *old_db_arr,
+ DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata,
+ char *old_tablespace);
+
+/* tablespace.c */
+
+void init_tablespaces(void);
+
+
+/* server.c */
+
+PGconn *connectToServer(ClusterInfo *cluster, const char *db_name);
+PGresult *executeQueryOrDie(PGconn *conn, const char *fmt,...) pg_attribute_printf(2, 3);
+
+char *cluster_conn_opts(ClusterInfo *cluster);
+
+bool start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error);
+void stop_postmaster(bool in_atexit);
+uint32 get_major_server_version(ClusterInfo *cluster);
+void check_pghost_envvar(void);
+
+
+/* util.c */
+
+char *quote_identifier(const char *s);
+int get_user_info(char **user_name_p);
+void check_ok(void);
+void report_status(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
+void pg_log(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
+void pg_fatal(const char *fmt,...) pg_attribute_printf(1, 2) pg_attribute_noreturn();
+void end_progress_output(void);
+void cleanup_output_dirs(void);
+void prep_status(const char *fmt,...) pg_attribute_printf(1, 2);
+void prep_status_progress(const char *fmt,...) pg_attribute_printf(1, 2);
+unsigned int str2uint(const char *str);
+
+
+/* version.c */
+
+bool check_for_data_types_usage(ClusterInfo *cluster,
+ const char *base_query,
+ const char *output_path);
+bool check_for_data_type_usage(ClusterInfo *cluster,
+ const char *type_name,
+ const char *output_path);
+void old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster);
+void old_9_6_check_for_unknown_data_type_usage(ClusterInfo *cluster);
+void old_9_6_invalidate_hash_indexes(ClusterInfo *cluster,
+ bool check_mode);
+
+void old_11_check_for_sql_identifier_data_type_usage(ClusterInfo *cluster);
+void report_extension_updates(ClusterInfo *cluster);
+
+/* parallel.c */
+void parallel_exec_prog(const char *log_file, const char *opt_log_file,
+ const char *fmt,...) pg_attribute_printf(3, 4);
+void parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
+ char *old_pgdata, char *new_pgdata,
+ char *old_tablespace);
+bool reap_child(bool wait_for_child);
diff --git a/src/bin/pg_upgrade/po/cs.po b/src/bin/pg_upgrade/po/cs.po
new file mode 100644
index 0000000..06698c5
--- /dev/null
+++ b/src/bin/pg_upgrade/po/cs.po
@@ -0,0 +1,1804 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:15+0000\n"
+"PO-Revision-Date: 2021-09-16 09:14+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: check.c:67
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Provádím Kontrolu Konzistence na Starém Live Serveru\n"
+"----------------------------------------------------\n"
+
+#: check.c:73
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Provádím Kontrolu Konzistence\n"
+"-----------------------------\n"
+
+#: check.c:193
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Clustery jsou kompatibilní*\n"
+
+#: check.c:199
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Pokud pg_upgrade selže po tomto místě, musíte reinicializovat\n"
+"(initdb) nový cluster než budete pokračovat.\n"
+
+#: check.c:233
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade so,\n"
+"once you start the new server, consider running:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Statistiky optimalizéru nejsou zachovány při pg_upgrade,\n"
+"takže po nastartování nového serveru zvažte spuštění:\n"
+" %s\n"
+"\n"
+
+#: check.c:239
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"Spuštění tohoto skriptu smaže datové soubory starého clusteru:\n"
+" %s\n"
+
+#: check.c:244
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"Nelze vytvořit skript pro smazání datových souborů starého cluster\n"
+"protože uživatelem definované tablespaces nebo datový adresář nového\n"
+"clusteru jsou v adresáři starého clusteru. Obsah starého clusteru musí\n"
+"být smazán manuálně.\n"
+
+#: check.c:254
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Kontroluji verze clusterů"
+
+#: check.c:266
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "Tato utilita může upgradovat pouze z PostgreSQL verze 8.4 a novějších.\n"
+
+#: check.c:270
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Tato utilita může upgradovat pouze na PostgreSQL verze %s.\n"
+
+#: check.c:279
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "Tato utilita nemůže být použita pro downgrade na starší major PostgreSQL verze.\n"
+
+#: check.c:284
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "Data a binární adresáře starého clusteru jsou z jiných major verzí.\n"
+
+#: check.c:287
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "Data a binární adresáře nového clusteru jsou z různých minárních verzí.\n"
+
+#: check.c:304
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "Při kontrole pre-PG 9.1 živého starého serveru, musíte zadat číslo portu starého serveru.\n"
+
+#: check.c:308
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Při kontrole živého serveru, staré a nové číslo portu musí být různá.\n"
+
+#: check.c:323
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "kódování databáze \"%s\" neodpovídají: stará \"%s\", nová \"%s\"\n"
+
+#: check.c:328
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "lc_collate hodnoty pro databázi \"%s\" neodpovídají: stará \"%s\", nová \"%s\"\n"
+
+#: check.c:331
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "lc_ctype hodnoty pro databázi \"%s\" neodpovídají: stará \"%s\", nová \"%s\"\n"
+
+#: check.c:404
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "Databáze \"%s\" na novém clusteru není prázdná: nalezena relace \"%s.%s\"\n"
+
+#: check.c:453
+#, c-format
+msgid "Creating script to analyze new cluster"
+msgstr "Vytvářím skript pro analyze nového clusteru"
+
+#: check.c:467 check.c:626 check.c:890 check.c:969 check.c:1079 check.c:1170
+#: file.c:336 function.c:240 option.c:497 version.c:54 version.c:199
+#: version.c:341
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "nelze otevřít soubor \"%s\": %s\n"
+
+#: check.c:515 check.c:682
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "nelze přidat právo na spuštění pro soubor \"%s\": %s\n"
+
+#: check.c:545
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Kontroluji tablespace adresáře v novém clusteru"
+
+#: check.c:556
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "tablespace adresář v novém clusteru již existuje \"%s\"\n"
+
+#: check.c:589
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"VAROVÁNÍ: nový datový adresář by neměl být ve starém datovém adresáři, e.g. %s\n"
+
+#: check.c:613
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"VAROVÁNÍ: umístění uživatelem definovaných tablespaces by neměly být v datovém adresáři, e.g. %s\n"
+
+#: check.c:623
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Vytvářím skript pro smazání starého clusteru"
+
+#: check.c:702
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Kontroluji že databázový uživatel je použit pro instalaci"
+
+#: check.c:718
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "databázový uživatel \"%s\" nebyl použit pro instalaci\n"
+
+#: check.c:729
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "nelže určit počet uživatelů\n"
+
+#: check.c:737
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "Pouze instalační uživatel může být definován pro nový cluster.\n"
+
+#: check.c:757
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Kontroluji nastavení databázového spojení"
+
+#: check.c:779
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 nesmí povolovat spojení, i.e. příslušná hodnota pg_database.datallowconn musí být false\n"
+
+#: check.c:789
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "Všechny non-template0 databáze musí povolovat spojení, i.e. jejich pg_database.datallowconn musí být true\n"
+
+#: check.c:814
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Kontroluji prepared transakce"
+
+#: check.c:823
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "Zdrojový cluster obsahuje prepared transakce\n"
+
+#: check.c:825
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "Cílový cluster obsahuje prepared transakce\n"
+
+#: check.c:851
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Kontroluji contrib/isn s bigint-passing rozdílem"
+
+#: check.c:912 check.c:991 check.c:1102 check.c:1193 function.c:262
+#: version.c:245 version.c:282 version.c:425
+#, c-format
+msgid "fatal\n"
+msgstr "fatal\n"
+
+#: check.c:913
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje \"contrib/isn\" funkce které spoléhají na\n"
+"bigint datový typ. Váš starý a nový cluster předávají bigint hodnoty\n"
+"rozdílně takže tento cluster aktuálně nelze upgradovat. Můžete manuálně\n"
+"upgradovat databáze které používají \"contrib/isn\" prostředky a odstranit\n"
+"\"contrib/isn\" ze starého clusteru a znovu spustit upgrade. Seznam\n"
+"problematických funkcí je v souboru:\n"
+" %s\n"
+"\n"
+
+#: check.c:937
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Kontrola tabulek s WITH OIDS"
+
+#: check.c:992
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje tabulky deklarované s WITH OIDS, což již nadále není podporováno.\n"
+"Zvažte odstranění oid sloupce pomocí\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Seznam tabulek s tímto problémem je v souboru:\n"
+" %s\n"
+"\n"
+
+#: check.c:1022
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Kontroluji reg* datové typy v uživatelských tabulkách"
+
+#: check.c:1103
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"remove the problem tables and restart the upgrade. A list of the\n"
+"problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje některý z reg* datových typů v uživatelských\n"
+"tabulkách. Tyto datové typy odkazují na systémové OID hodnoty které\n"
+"nejsou zachovány při pg_upgrade, takže tento cluster aktuálně nelze\n"
+"upgradovat. Můžete odstranit problematické tabulky a znovu spustit\n"
+"upgrade. Seznam problematických sloupců je v souboru:\n"
+" %s\n"
+"\n"
+
+#: check.c:1128
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Kontroluji nekompatibilní \"jsonb\" datový typ"
+
+#: check.c:1194
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can remove the problem\n"
+"tables and restart the upgrade. A list of the problem columns is\n"
+"in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje \"jsonb\" datový typ v uživatelských tabulkách.\n"
+"Interní formát \"jsonb\" se změnil v 9.4 beta takže tento cluster aktuálně nelze\n"
+"upgradovat. Můžete odstranit problematické tabulky a znovu spustit upgrade.\n"
+"Seznam problematických sloupců je v souboru:\n"
+" %s\n"
+"\n"
+
+#: check.c:1216
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Kontroluji existenci rolí začínajících na \"pg_\""
+
+#: check.c:1226
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "Zdrojový cluster obsahuje role začínající na \"pg_\"\n"
+
+#: check.c:1228
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "Cílový cluster obsahuje role začínající na \"pg_\"\n"
+
+#: check.c:1254
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "selhalo získání aktuální hodnoty locale\n"
+
+#: check.c:1263
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "selhalo získání jména systémové locale pro \"%s\"\n"
+
+#: check.c:1269
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "selhala obnova staré locale \"%s\"\n"
+
+#: controldata.c:127 controldata.c:195
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "nelze získat control data pomocí %s: %s\n"
+
+#: controldata.c:138
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: problém se stavem databázového clusteru\n"
+
+#: controldata.c:156
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Zdrojový cluster byl vypnut v recovery módu. Pro upgrade použijte \"rsync\" jak je uvedeno v dokumentaci nebo ho vypněte jako primary.\n"
+
+#: controldata.c:158
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Cílový cluster byl vypnut v recovery módu. Pro upgrade použijte \"rsync\" jak je uvedeno v dokumentaci nebo ho vypněte jako primary.\n"
+
+#: controldata.c:163
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "Zdrojový cluster nebyl zastaven čistě.\n"
+
+#: controldata.c:165
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "Cílový cluster nebyl zastaven čistě.\n"
+
+#: controldata.c:176
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "Zdrojový cluster postrádá některé nutné informace o stavu:\n"
+
+#: controldata.c:178
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "Cílový cluster postrádá některé nutné informace o stavu:\n"
+
+#: controldata.c:208 dump.c:49 pg_upgrade.c:339 pg_upgrade.c:375
+#: relfilenode.c:243 util.c:79
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:215
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal problem\n"
+
+#: controldata.c:225 controldata.c:235 controldata.c:246 controldata.c:257
+#: controldata.c:268 controldata.c:287 controldata.c:298 controldata.c:309
+#: controldata.c:320 controldata.c:331 controldata.c:342 controldata.c:345
+#: controldata.c:349 controldata.c:359 controldata.c:371 controldata.c:382
+#: controldata.c:393 controldata.c:404 controldata.c:415 controldata.c:426
+#: controldata.c:437 controldata.c:448 controldata.c:459 controldata.c:470
+#: controldata.c:481
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: controldata retrieval problem\n"
+
+#: controldata.c:546
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "Zdrojový cluster postrádá některé nutné control informace:\n"
+
+#: controldata.c:549
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "Cílový cluster postrádá některé nutné control informace:\n"
+
+#: controldata.c:552
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " další XID checkpointu\n"
+
+#: controldata.c:555
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " další OID posledního checkpointu\n"
+
+#: controldata.c:558
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " další MultiXactId posledního checkpointu\n"
+
+#: controldata.c:562
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " nejstarší MultiXactId posledního checkpointu\n"
+
+#: controldata.c:565
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " MultiXactOffset posledního checkpointu\n"
+
+#: controldata.c:568
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " první WAL segment po resets\n"
+
+#: controldata.c:571
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " metoda předávání float8 argumentů\n"
+
+#: controldata.c:574
+#, c-format
+msgid " maximum alignment\n"
+msgstr " maximální alignment\n"
+
+#: controldata.c:577
+#, c-format
+msgid " block size\n"
+msgstr " velikost bloku\n"
+
+#: controldata.c:580
+#, c-format
+msgid " large relation segment size\n"
+msgstr " velikost segmentu velkých relací\n"
+
+#: controldata.c:583
+#, c-format
+msgid " WAL block size\n"
+msgstr " velikost WAL bloku\n"
+
+#: controldata.c:586
+#, c-format
+msgid " WAL segment size\n"
+msgstr " velikost WAL segmentu\n"
+
+#: controldata.c:589
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " maximální délka identifikátoru\n"
+
+#: controldata.c:592
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " maximální počet indexovaných sloupců\n"
+
+#: controldata.c:595
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " maximální velikost TOAST chunku\n"
+
+#: controldata.c:599
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " velikost large-object chunku\n"
+
+#: controldata.c:602
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " datum/čas jsou integery?\n"
+
+#: controldata.c:606
+#, c-format
+msgid " data checksum version\n"
+msgstr " verze datových kontrolních součtů\n"
+
+#: controldata.c:608
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "Nelze pokračovat bez kontrolních informací, končím\n"
+
+#: controldata.c:623
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"stará a nová hodnota pg_controldata alignmentu jsou neplatné nebo se neshodují\n"
+"Pravděpodobně jeden z clusterů je 32-bitový a druhý je 64-bitový\n"
+
+#: controldata.c:627
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata velikosti bloku jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:630
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata maximální velikosti segmentu relace jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:633
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata velikost WAL bloku jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:636
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata velikost WAL segmentu jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:639
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata maximální délky identifikátoru jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:642
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata maximálního počtu indexovaných sloupců jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:645
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata maximální velikosti TOAST chunku jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:650
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata velikosti large-object chunku jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:653
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "stará a nová hodnota pg_controldata typu pro datum/čas jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:666
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "starý cluster nepoužívá data chechsums ale nový ano\n"
+
+#: controldata.c:669
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "starý cluster používá data chechsums ale nový nikoliv\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "verze kontrolních součtů na starém a novém clusteru se neshodují\n"
+
+#: controldata.c:682
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Přidávám \".old\" příponu ke starému global/pg_control souboru"
+
+#: controldata.c:687
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "Nelze přejmenovat %s na %s.\n"
+
+#: controldata.c:690
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Pokud budete chtít nastartovat starý cluster, budete muset odstranit\n"
+"příponu \".old\" z %s/global/pg_control.old.\n"
+"Protože byl použit \"link\" mód, starý cluster nemůže být bezpečně\n"
+"spuštěn jakmile bude nastartován nový cluster.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Vytvářím dump globálních objektů"
+
+#: dump.c:31
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "Vytvářím dump databázových schémat\n"
+
+#: exec.c:44
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "nelze získat verzi pg_ctl pomocí %s: %s\n"
+
+#: exec.c:50
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "nelze získat výstup s pg_ctl verzí z %s\n"
+
+#: exec.c:104 exec.c:108
+#, c-format
+msgid "command too long\n"
+msgstr "příkaz je příliš dlouhý\n"
+
+#: exec.c:110 util.c:37 util.c:225
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:149 option.c:217
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "nelze otevřít logovací soubor \"%s\": %m\n"
+
+#: exec.c:178
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*failure*"
+
+#: exec.c:181
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "Došlo k problémům při spuštění \"%s\"\n"
+
+#: exec.c:184
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Pro pravděpodobnou příčinu selhání prozkoumejte posledních pár\n"
+"řádek z \"%s\" nebo \"%s\".\n"
+
+#: exec.c:189
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Pro pravděpodobnou příčinu selhání prozkoumejte posledních pár\n"
+"řádek z \"%s\".\n"
+
+#: exec.c:204 option.c:226
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "nelze zapsat do log souboru \"%s\": %m\n"
+
+#: exec.c:230
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "nelze otevřít soubor \"%s\" pro čtení: %s\n"
+
+#: exec.c:257
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Musíte mít práva na čtení a zápis v aktuálním adresáři.\n"
+
+#: exec.c:310 exec.c:372 exec.c:436
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "kontrola pro \"%s\" selhala: %s\n"
+
+#: exec.c:313 exec.c:375
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" není adresář\n"
+
+#: exec.c:439
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "check for \"%s\" failed: not a regular file\n"
+
+#: exec.c:451
+#, c-format
+msgid "check for \"%s\" failed: cannot read file (permission denied)\n"
+msgstr "kontrola \"%s\" selhala: nelze číst soubor (přístup odepřen)\n"
+
+#: exec.c:459
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "kontrola \"%s\" selhala: nelze spustit soubor (přístup odepřen)\n"
+
+#: file.c:43 file.c:61
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "chyba při klonování relace \"%s.%s\" (\"%s\" na \"%s\"): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "chyba při klonování relace \"%s.%s\": nelze otevřít soubor \"%s\": %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "chyba při klonování relace \"%s.%s\": nelze vytvořit soubor \"%s\": %s\n"
+
+#: file.c:87 file.c:190
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze otevřít soubor \"%s\": %s\n"
+
+#: file.c:92 file.c:199
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze vytvořit soubor \"%s\": %s\n"
+
+#: file.c:106 file.c:223
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze číst ze souboru \"%s\": %s\n"
+
+#: file.c:118 file.c:301
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze zapsat do souboru \"%s\": %s\n"
+
+#: file.c:132
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\" (\"%s\" na \"%s\"): %s\n"
+
+#: file.c:151
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "chyba při vytváření odkazů pro relaci \"%s.%s\" (\"%s\" na \"%s\"): %s\n"
+
+#: file.c:194
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze získat informace o souboru \"%s\": %s\n"
+
+#: file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "chyba při kopírování relace \"%s.%s\": částečně zapsaná stránka nalezena v souboru \"%s\"\n"
+
+#: file.c:328 file.c:345
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "nelze klonovat soubory mezi starým a novým datovým adresářem: %s\n"
+
+#: file.c:341
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "nelze vytvořit soubor \"%s\": %s\n"
+
+#: file.c:352
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "klonování souborů na této platformě není podporováno\n"
+
+#: file.c:369
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"nelze vytvořit hard link mezi starým a novým datovým adresářem: %s\n"
+"V link módu musí být starý a nový datový adresář na stejném souborovém systému.\n"
+
+#: function.c:114
+#, c-format
+msgid ""
+"\n"
+"The old cluster has a \"plpython_call_handler\" function defined\n"
+"in the \"public\" schema which is a duplicate of the one defined\n"
+"in the \"pg_catalog\" schema. You can confirm this by executing\n"
+"in psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"The \"public\" schema version of this function was created by a\n"
+"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+"to complete because it references a now-obsolete \"plpython\"\n"
+"shared object file. You can remove the \"public\" schema version\n"
+"of this function by running the following command:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"in each affected database:\n"
+"\n"
+msgstr ""
+"\n"
+"Starý cluster má \"plpython_call_handler\" funkci definovanou\n"
+"v \"public\" schématu což je duplicitní s tou definovanou v \"pg_catalog\"\n"
+"schématu. Ověřit to můžete spuštěním tohoto v psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"Veze z \"public\" schématu byla vytvořena instalací plpython před 8.1,\n"
+"a musí být odstraněna aby pg_upgrade mohlo fungovat protože\n"
+"odkazuje na nyní zastaralý \"plpython\" sdílený objekt. Verzi z \"public\"\n"
+"schématu můžete odstranit spuštěním následujícího příkazu:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"v každé postižené databázi:\n"
+"\n"
+
+#: function.c:132
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:142
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "Pro pokračování ze starého clusteru odstraňte problematické funkce.\n"
+
+#: function.c:189
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Kontroluji dostupnost potřebných knihoven"
+
+#: function.c:242
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "nelze načíst knihovnu \"%s\": %s"
+
+#: function.c:253
+#, c-format
+msgid "In database: %s\n"
+msgstr "Databáze: %s\n"
+
+#: function.c:263
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace odkazuje na knihovny které chybí v nové instalaci. Můtete\n"
+"je buď přidat do nové instalace, nebo odstranit funkce které je vyžadují ze\n"
+"staré instalace. Seznam problematických knihoven je v souboru:\n"
+" %s\n"
+"\n"
+
+#: info.c:131
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "Názvy relace pro OID %u v databázi \"%s\" neodpovídají: staré jméno \"%s.%s\", nové jméno \"%s.%s\"\n"
+
+#: info.c:151
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "Chyba při párování starých a nových tabulek v databázi \"%s\"\n"
+
+#: info.c:240
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " což je index na \"%s.%s\""
+
+#: info.c:250
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " což je index na OID %u"
+
+#: info.c:262
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " což je TOAST tabulka pro \"%s.%s\""
+
+#: info.c:270
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " což je TOAST tabulka pro OID %u"
+
+#: info.c:274
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "Ve starém clusteru nebyl nalezen odpovídající záznam pro novou relaci s OID %u v databázi \"%s\": %s\n"
+
+#: info.c:277
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "V novém clusteru nebyl nalezen odpovídající záznam pro relaci s OID %u v databázi \"%s\": %s\n"
+
+#: info.c:289
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "mapování pro databázi \"%s\":\n"
+
+#: info.c:292
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u na %u\n"
+
+#: info.c:297 info.c:633
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:322
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"zdrojové databáze:\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"cílové databáze:\n"
+
+#: info.c:631
+#, c-format
+msgid "Database: %s\n"
+msgstr "Databáze: %s\n"
+
+#: info.c:644
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:102
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: nelze spouštět jako root\n"
+
+#: option.c:170
+#, c-format
+msgid "invalid old port number\n"
+msgstr "neplatné staré číslo portu\n"
+
+#: option.c:175
+#, c-format
+msgid "invalid new port number\n"
+msgstr "neplatné nové číslo portu\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: option.c:214
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "příliš mnoho argumentů v příkazové řádce (první je \"%s\")\n"
+
+#: option.c:220
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Běží v módu s detailním (verbose) logováním.\n"
+
+#: option.c:251
+msgid "old cluster binaries reside"
+msgstr "binárky starého clusteru jsou umístěny"
+
+#: option.c:253
+msgid "new cluster binaries reside"
+msgstr "binárky nového clusteru jsou umístěny"
+
+#: option.c:255
+msgid "old cluster data resides"
+msgstr "data starého clusteru jsou umístěna"
+
+#: option.c:257
+msgid "new cluster data resides"
+msgstr "data nového clusteru jsou umístěna"
+
+#: option.c:259
+msgid "sockets will be created"
+msgstr "sockety budou vytvořeny"
+
+#: option.c:276 option.c:374
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "nelze určit aktuální adresář\n"
+
+#: option.c:279
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "na Windows nelze spouštět pg_upgrade z datového adresáře nového clusteru\n"
+
+#: option.c:288
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade upgraduje PostgreSQL cluster na jinou major verzi.\n"
+"\n"
+
+#: option.c:289
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [VOLBA]...\n"
+"\n"
+
+#: option.c:291
+#, c-format
+msgid "Options:\n"
+msgstr "Přepínače:\n"
+
+#: option.c:292
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR adresář se spustitelnými soubory starého clusteru\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR adresář se spustitelnými soubory nového clusteru\n"
+" (výchozí hodnota je stejný adresář jako pg_upgrade)\n"
+
+#: option.c:295
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check pouze kontroluje clustery, nemění žádná data\n"
+
+#: option.c:296
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR datový adresář starého clusteru\n"
+
+#: option.c:297
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR datový adresář nového clusteru\n"
+
+#: option.c:298
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM počet paralelních procesů nebo threadů\n"
+
+#: option.c:299
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link vytváří odkazy namísto kopírování souborů do nového clusteru\n"
+
+#: option.c:300
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=VOLBY volby pro starý cluster které se mají předat serveru\n"
+
+#: option.c:301
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=VOLBY volby pro nový cluster které se mají předat serveru\n"
+
+#: option.c:302
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT číslo portu pro starý cluster (implicitně %d)\n"
+
+#: option.c:303
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT číslo portu pro nový cluster (implicitně %d)\n"
+
+#: option.c:304
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain v případě úspěchu zachovat SQL a log soubory\n"
+
+#: option.c:305
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr ""
+" -s, --socketdir=DIR adresář pro sockety (implicitně současný adresář)\n"
+"\n"
+
+#: option.c:306
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=JMÉNO superuživatel pro cluster (implicitně \"%s\")\n"
+
+#: option.c:307
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose zapné podrobné interní logování\n"
+
+#: option.c:308
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version zobrazí informaci o verzi, poté skončí\n"
+
+#: option.c:309
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr ""
+" --clone klonuje namísto kopírování souborů do nového clusteru\n"
+"\n"
+
+#: option.c:310
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help zobrazí tuto nápovědu, poté skončí\n"
+
+#: option.c:311
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Před spuštěním pg_upgrade musíte:\n"
+" vytvořit nový databázový cluster (pomocí nové verze initdb)\n"
+" zastavit postmaster proces běžící nad starým clusterem\n"
+" zastavit postmaster proces běžízí nad novým clusterem\n"
+
+#: option.c:316
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Při spuštění pg_upgrade musíte zadat následující informace:\n"
+" datový adresář pro starý cluster (-d DATADIR)\n"
+" datový adresář pro nový cluster (-D DATADIR)\n"
+" \"bin\" adresář pro starou verzi (-b BINDIR)\n"
+" \"bin\" adresář pro novou verzi (-B BINDIR)\n"
+
+#: option.c:322
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Například:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"nebo\n"
+
+#: option.c:327
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:333
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:339
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Chyby hlašte na <%s>.\n"
+
+#: option.c:340
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: option.c:380
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"Musíte zadat adresář kde %s.\n"
+"Použijte prosím volbu %s na příkazové řádce nebo proměnnou prostředí %s.\n"
+
+#: option.c:432
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Vyhledávám skutečný datový adresář pro zdrojový cluster"
+
+#: option.c:434
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Vyhledávám skutečný datový adresář pro cílový cluster"
+
+#: option.c:446
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "nelze získat datový adresář pomocí %s: %s\n"
+
+#: option.c:505
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "nelze načíst řádek %d ze souboru \"%s\": %s\n"
+
+#: option.c:522
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "uživatelem-zadané číslo starého portu %hu opraveno na %hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "nelze vytvořit worker proces: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "nelze vytvořit worker thread: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "waitpid() failed: %s\n"
+msgstr "volání waitpid() selhalo: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "podřízený proces abnormálně skončil: status %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "podřízený proces neočekávaně skončil: %s\n"
+
+#: pg_upgrade.c:108
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "nelze zjistit přístupová práva adresáře \"%s\": %s\n"
+
+#: pg_upgrade.c:123
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Provádím Upgrade\n"
+"----------------\n"
+
+#: pg_upgrade.c:166
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Nastavuji další OID pro nový cluster"
+
+#: pg_upgrade.c:173
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Synchronizuji datový adresář na disk"
+
+#: pg_upgrade.c:185
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Upgrade Dokončen\n"
+"----------------\n"
+
+#: pg_upgrade.c:220
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: nelze najít vlastní spustitelný soubor\n"
+
+#: pg_upgrade.c:246
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Zdá se že postmaster nad starým clusterem stále běží.\n"
+"Prosím zastavte příslušný postmaster proces a zkuste to znovu.\n"
+
+#: pg_upgrade.c:259
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Zdá se že postmaster nad novým clusterem stále běží.\n"
+"Prosím zastavte příslušný postmaster proces a zkuste to znovu.\n"
+
+#: pg_upgrade.c:273
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analyzuji všechny řádky v novém clusteru"
+
+#: pg_upgrade.c:286
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Provádím freeze na všech řádcích v novém clusteru"
+
+#: pg_upgrade.c:306
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Obnovuji globální objekty v novém clusteru"
+
+#: pg_upgrade.c:321
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "Obnovuji databázová schémata v novém clusteru\n"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Mažu soubory z nového %s"
+
+#: pg_upgrade.c:429
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "nelze smazat adresář \"%s\"\n"
+
+#: pg_upgrade.c:448
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Kopíruji starý %s do nového serveru"
+
+#: pg_upgrade.c:475
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Nastavuij následující transaction ID a epochu pro nový cluster"
+
+#: pg_upgrade.c:505
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Nastavuji následující multixact ID a offset pro nový cluster"
+
+#: pg_upgrade.c:529
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Nastavuji nejstarší multixact ID v novém clusteru"
+
+#: pg_upgrade.c:549
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Resetuji WAL archivy"
+
+#: pg_upgrade.c:592
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Nastavuji frozenxid a minmxid v novém clusteru"
+
+#: pg_upgrade.c:594
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Nastavuji minmxid v novém clustreru"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files\n"
+msgstr "Klonuji soubory pro uživatelské relace\n"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "Kopíruji soubory pro uživatelské relace\n"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "Linkuji soubory pro uživatelské relace\n"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "stará databáze \"%s\" nenalezena v novém clusteru\n"
+
+#: relfilenode.c:230
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "chyba při kontrole existence souboru \"%s.%s\" (\"%s\" na \"%s\"): %s\n"
+
+#: relfilenode.c:248
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "přepisuji \"%s\" na \"%s\"\n"
+
+#: relfilenode.c:256
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "klonuji \"%s\" do \"%s\"\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "kopíruji \"%s\" do \"%s\"\n"
+
+#: relfilenode.c:266
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "linkuji \"%s\" na \"%s\"\n"
+
+#: server.c:33
+#, c-format
+msgid "connection to database failed: %s"
+msgstr "spojení do databáze selhalo: %s"
+
+#: server.c:39 server.c:141 util.c:135 util.c:165
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Chyba, končím\n"
+
+#: server.c:131
+#, c-format
+msgid "executing: %s\n"
+msgstr "spouštím: %s\n"
+
+#: server.c:137
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL příkaz selhal\n"
+"%s\n"
+"%s"
+
+#: server.c:167
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "nelze otevřít soubor s verzí: \"%s\": %m\n"
+
+#: server.c:171
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "neplatný formát řetězce s verzí \"%s\"\n"
+
+#: server.c:297
+#, c-format
+msgid ""
+"\n"
+"connection to database failed: %s"
+msgstr ""
+"\n"
+"spojení na databázi selhalo: %s"
+
+#: server.c:302
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"nelze se připojit ke zdrojovému postmaster procesu příkazem:\n"
+"%s\n"
+
+#: server.c:306
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"nelze se připojit k cílovému postmaster procesu příkazem:\n"
+"%s\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl selhal při pokusu nastartovat zdrojový server, nebo selhal pokus o spojení\n"
+
+#: server.c:322
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl selhal při pokusu nastartovat cílový server, nebo selhal pokus o spojení\n"
+
+#: server.c:367
+#, c-format
+msgid "out of memory\n"
+msgstr "nedostatek paměti\n"
+
+#: server.c:380
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "libpq proměnná prostředí %s má hodnotu odkazující na nelokální server: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"Při použití tablespaces nelze provádět upgrade na/ze stejné verze\n"
+"systémových katalogů.\n"
+
+#: tablespace.c:86
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "adresář pro tablespace \"%s\" neexistuje\n"
+
+#: tablespace.c:90
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "nelze přistoupit k tablespace adresáři \"%s\": %s\n"
+
+#: tablespace.c:95
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "cesta k tabespace \"%s\" není adresář\n"
+
+#: util.c:49
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:82
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:174
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:29
+#, c-format
+msgid "Checking for large objects"
+msgstr "Kontrola velkých objektů"
+
+#: version.c:77 version.c:384
+#, c-format
+msgid "warning"
+msgstr "varování"
+
+#: version.c:79
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Vaše instalace obsahuje velké objekty. Nová databáze má další tabulku\n"
+"s právy k velkým objektům. Po upgrade vám bude poskytnut příkaz pro\n"
+"naplnění tabulky pg_largeobject_metadata s výchozími právy.\n"
+"\n"
+
+#: version.c:85
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Vaše instalace obsahuje velké objekty. Nová databáze má další tabulku\n"
+"s právy k velkým objektům, takže pro všechny velké objekty musí být\n"
+"definována výchozí práva. Soubor\n"
+" %s\n"
+"po spuštění z psql pod superuživatelským účtem tato výchozí práva nastaví.\n"
+"\n"
+
+#: version.c:239
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Kontrola nekompatibilního \"line\" datového typu"
+
+#: version.c:246
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables. This\n"
+"data type changed its internal and input/output format between your old\n"
+"and new clusters so this cluster cannot currently be upgraded. You can\n"
+"remove the problem tables and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje datový typ \"line\" v uživatelských tabulkách. Tento\n"
+"datový typ změnil interní a vstupní/výstupní formát mezi vaším starým a novým\n"
+"clusterem takže tento cluster nemůže být aktuálně upgradován. Můžete odstranit\n"
+"problematické tabulky a znovu spustit upgrade. Seznam problematických sloupců\n"
+"je v souboru:\n"
+" %s\n"
+"\n"
+
+#: version.c:276
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Kontrola pro neplatné \"unknown\" uživatelské sloupce"
+
+#: version.c:283
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables. This\n"
+"data type is no longer allowed in tables, so this cluster cannot currently\n"
+"be upgraded. You can remove the problem tables and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje \"unknown\" datový typ v uživatelských tabulkách. Tento\n"
+"datový typ není v uživatelských tabulkách nadále povolen, takže tento cluster nelze\n"
+"aktuálně upgradovat. Můžete problematické tabulky odstranit a znovu spustit upgrade.\n"
+"Seznam problematických sloupců je v souboru:\n"
+" %s\n"
+"\n"
+
+#: version.c:306
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Kontrola hash indexů"
+
+#: version.c:386
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"Vaše instalace obsahuje hash indexy. Tyto indexy mají rozdílný interní\n"
+"formát mezi vaším starým a novým clusterem, takže musí být reindexovány\n"
+"příkazem REINDEX. Po skončení upgrade vám budou poskytnuty instrukce\n"
+"jak REINDEX provést.\n"
+"\n"
+
+#: version.c:392
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"Vaše instalace obsahuje hash indexy. Tyto indexy mají rozdílný interní\n"
+"formát mezi vaším starým a novým clusterem, takže musí být reindexovány\n"
+"příkazem REINDEX. Soubor\n"
+" %s\n"
+"po spuštění z psql pod superuživatelským účtem znovu vytvoří všechny\n"
+"neplatné indexy; dokud k tomu nedojde tyto indexy nebudou používány.\n"
+"\n"
+
+#: version.c:418
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Kontrola pro neplatné \"sql_identifier\" uživatelské sloupce"
+
+#: version.c:426
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables\n"
+"and/or indexes. The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can remove the problem tables or\n"
+"change the data type to \"name\" and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje \"sql_identifier\" datový typ v uživatelských tabulkách\n"
+"a/nebo indexech. Formát uložení na disku pro tento datový typ se změnil, takže\n"
+"tento cluster nelze aktuálně upgradovat. Můžete problematické tabulky\n"
+"odstranit nebo datový typ změnit na \"name\" a znovu spustit upgrade.\n"
+"Seznam problematických sloupců je v souboru:\n"
+" %s\n"
+"\n"
+
+#~ msgid "could not parse PG_VERSION file from %s\n"
+#~ msgstr "nelze naparsovat PG_VERSION soubor z %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
+
+#~ msgid ""
+#~ "Optimizer statistics and free space information are not transferred\n"
+#~ "by pg_upgrade so, once you start the new server, consider running:\n"
+#~ " %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Statistiky optimalizéru a informace o volném místě nejsou zachovány\n"
+#~ "při pg_upgrade, takže po nastartování nového serveru zvažte spuštění:\n"
+#~ " %s\n"
+#~ "\n"
diff --git a/src/bin/pg_upgrade/po/de.po b/src/bin/pg_upgrade/po/de.po
new file mode 100644
index 0000000..5e3c2b1
--- /dev/null
+++ b/src/bin/pg_upgrade/po/de.po
@@ -0,0 +1,1892 @@
+# German message translation file for pg_upgrade
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 15:03+0000\n"
+"PO-Revision-Date: 2023-11-04 06:17+0100\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: check.c:75
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Führe Konsistenzprüfungen am alten laufenden Server durch\n"
+"---------------------------------------------------------\n"
+
+#: check.c:81
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Führe Konsistenzprüfungen durch\n"
+"-------------------------------\n"
+
+#: check.c:231
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Cluster sind kompatibel*\n"
+
+#: check.c:239
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Wenn pg_upgrade ab diesem Punkt fehlschlägt, dann müssen Sie den\n"
+"neuen Cluster neu mit initdb initialisieren, bevor fortgesetzt\n"
+"werden kann.\n"
+
+#: check.c:280
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"Optimizer-Statistiken werden von pg_upgrade nicht übertragen. Wenn Sie\n"
+"den neuen Server starten, sollte Sie diesen Befehl ausführen:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:286
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"Mit diesem Skript können die Dateien des alten Clusters gelöscht werden:\n"
+" %s\n"
+
+#: check.c:291
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"Ein Skript zum Löschen der Dateien des alten Clusters konnte nicht\n"
+"erzeugt werden, weil benutzerdefinierte Tablespaces oder das\n"
+"Datenverzeichnis des neuen Clusters im alten Cluster-Verzeichnis\n"
+"liegen. Der Inhalt des alten Clusters muss von Hand gelöscht werden.\n"
+
+#: check.c:303
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Prüfe Cluster-Versionen"
+
+#: check.c:315
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later.\n"
+msgstr "Dieses Programm kann nur Upgrades von PostgreSQL Version %s oder später durchführen.\n"
+
+#: check.c:320
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Dieses Programm kann nur Upgrades auf PostgreSQL Version %s durchführen.\n"
+
+#: check.c:329
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "Dieses Programm kann keine Downgrades auf ältere Hauptversionen von PostgreSQL durchführen.\n"
+
+#: check.c:334
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "Die Daten- und Programmverzeichnisse des alten Clusters stammen von verschiedenen Hauptversionen.\n"
+
+#: check.c:337
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "Die Daten- und Programmverzeichnisse des neuen Clusters stammen von verschiedenen Hauptversionen.\n"
+
+#: check.c:352
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Wenn ein laufender Server geprüft wird, müssen die alte und die neue Portnummer verschieden sein.\n"
+
+#: check.c:367
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "Kodierungen für Datenbank »%s« stimmen nicht überein: alt »%s«, neu »%s«\n"
+
+#: check.c:372
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "lc_collate-Werte für Datenbank »%s« stimmen nicht überein: alt »%s«, neu »%s«\n"
+
+#: check.c:375
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "lc_ctype-Werte für Datenbank »%s« stimmen nicht überein: alt »%s«, neu »%s«\n"
+
+#: check.c:378
+#, c-format
+msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "Locale-Provider für Datenbank »%s« stimmen nicht überein: alt »%s«, neu »%s«\n"
+
+#: check.c:385
+#, c-format
+msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "ICU-Locale-Werte für Datenbank »%s« stimmen nicht überein: alt »%s«, neu »%s«\n"
+
+#: check.c:460
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "Datenbank »%s« im neuen Cluster ist nicht leer: Relation »%s.%s« gefunden\n"
+
+#: check.c:512
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Prüfe Tablespace-Verzeichnisse des neuen Clusters"
+
+#: check.c:523
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "Tablespace-Verzeichnis für neuen Cluster existiert bereits: »%s«\n"
+
+#: check.c:556
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s\n"
+msgstr ""
+"\n"
+"WARNUNG: das neue Datenverzeichnis sollte nicht im alten Datenverzeichnis, d.h. %s, liegen\n"
+
+#: check.c:580
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s\n"
+msgstr ""
+"\n"
+"WARNUNG: benutzerdefinierte Tablespace-Pfade sollten nicht im Datenverzeichnis, d.h. %s, liegen\n"
+
+#: check.c:590
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Erzeuge Skript zum Löschen des alten Clusters"
+
+#: check.c:593 check.c:768 check.c:888 check.c:987 check.c:1118 check.c:1197
+#: check.c:1500 file.c:338 function.c:165 option.c:465 version.c:116
+#: version.c:292 version.c:429
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "konnte Datei »%s« nicht öffnen: %s\n"
+
+#: check.c:644
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "konnte Datei »%s« nicht ausführbar machen: %s\n"
+
+#: check.c:664
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Prüfe ob der Datenbankbenutzer der Installationsbenutzer ist"
+
+#: check.c:680
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "Datenbankbenutzer »%s« ist nicht der Installationsbenutzer\n"
+
+#: check.c:691
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "konnte die Anzahl der Benutzer nicht ermitteln\n"
+
+#: check.c:699
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "Nur der Installationsbenutzer darf im neuen Cluster definiert sein.\n"
+
+#: check.c:729
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Prüfe Verbindungseinstellungen der Datenbank"
+
+#: check.c:755
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 darf keine Verbindungen erlauben, d.h. ihr pg_database.datallowconn muss falsch sein\n"
+
+#: check.c:785 check.c:910 check.c:1012 check.c:1138 check.c:1219 check.c:1278
+#: check.c:1339 check.c:1404 check.c:1523 function.c:187 version.c:192
+#: version.c:232 version.c:378
+#, c-format
+msgid "fatal\n"
+msgstr "fatal\n"
+
+#: check.c:786
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Alle Datenbanken außer template0 müssen Verbindungen erlauben,\n"
+"d.h. ihr pg_database.datallowconn muss wahr sein. Ihre Installation\n"
+"enthält Datenbanken außer template0, deren pg_database.datallowconn\n"
+"auf falsch gesetzt ist. Sie sollten Verbindungen für alle Datenbanken\n"
+"außer template0 erlauben oder die Datenbanken, die keine Verbindungen\n"
+"erlauben, löschen. Eine Liste der Datenbanken mit diesem Problem ist\n"
+"in der Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:811
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Prüfe auf vorbereitete Transaktionen"
+
+#: check.c:820
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "Der alte Cluster enthält vorbereitete Transaktionen\n"
+
+#: check.c:822
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "Der neue Cluster enthält vorbereitete Transaktionen\n"
+
+#: check.c:848
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Prüfe auf contrib/isn mit unpassender bigint-Übergabe"
+
+#: check.c:911
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält Funktionen aus »contrib/isn«, welche den\n"
+"Datentyp bigint verwenden. Der alte und der neue Cluster übergeben\n"
+"bigint auf andere Weise und daher kann dieser Cluster gegenwärtig\n"
+"nicht aktualisiert werden. Sie können Datenbanken im alten Cluster,\n"
+"die »contrib/isn« verwenden, manuell dumpen, löschen, dann das\n"
+"Upgrade durchführen und sie dann wiederherstellen. Eine Liste\n"
+"der problematischen Funktionen ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:934
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Prüfe auf benutzerdefinierte Postfix-Operatoren"
+
+#: check.c:1013
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält benutzerdefinierte Postfixoperatoren, was\n"
+"nicht mehr unterstützt wird. Entfernen Sie die Postfixoperatoren und\n"
+"ersetzten Sie sie durch Präfixoperatoren oder Funktionsaufrufe. Eine\n"
+"Liste der benutzerdefinierten Postfixoperatoren ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Prüfe auf inkompatible polymorphische Funktionen"
+
+#: check.c:1139
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält benutzerdefinierte Objekte, die auf interne\n"
+"polymorphische Funktionen mit Argumenten vom Typ »anyarray« und\n"
+"»anyelement« verweisen. Diese benutzerdefinierten Objekte müsen vor\n"
+"dem Upgrade gelöscht werden und danach wiederhergestellt werden,\n"
+"nachdem sie so geändert wurden, dass sie auf die entsprechenden\n"
+"Funktionen mit Argumenten vom Typ »anycompatiblearray« und\n"
+"»anycompatible« verweisen.\n"
+"Eine Liste der problematischen Objekte ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:1164
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Prüfe auf Tabellen mit WITH OIDS"
+
+#: check.c:1220
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält Tabellen, die mit WITH OIDS deklariert sind,\n"
+"was nicht mehr unterstützt wird. Entfernen Sie die oid-Spalte mit\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Eine Liste der Tabellen mit dem Problem ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:1248
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Prüfe auf systemdefinierte zusammengesetzte Typen in Benutzertabellen"
+
+#: check.c:1279
+#, c-format
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält systemdefinierte zusammengesetzte Typen in\n"
+"Benutzertabellen. Die OIDs dieser Typen sind nicht über\n"
+"PostgreSQL-Versionen stabil und daher kann dieser Cluster gegenwärtig\n"
+"nicht aktualisiert werden. Sie können die Problemspalten löschen\n"
+"und das Upgrade neu starten. Eine Liste der Problemspalten ist in der\n"
+"Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:1307
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Prüfe auf reg*-Datentypen in Benutzertabellen"
+
+#: check.c:1340
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält einen der reg*-Datentypen in\n"
+"Benutzertabellen. Diese Datentypen verweisen auf System-OIDs, die von\n"
+"pg_upgrade nicht erhalten werden. Daher kann dieser Cluster\n"
+"gegenwärtig nicht aktualiert werden. Sie können die Problemspalten\n"
+"löschen und das Upgrade neu starten. Eine Liste der Problemspalten\n"
+"ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:1364
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "Prüfe auf entfernten Datentyp »%s« in Benutzertabellen"
+
+#: check.c:1374
+#, c-format
+msgid ""
+"Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält den Datentyp »%s« in Benutzertabellen. Der\n"
+"Typ »%s« wurde in PostgreSQL %s entfernt. Daher kann dieser Cluster\n"
+"gegenwärtig nicht aktualisiert werden. Sie können die Problemspalten\n"
+"löschen oder in einen anderen Datentyp ändern und das Upgrade neu\n"
+"starten. Eine Liste der Problemspalten ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:1396
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Prüfe auf inkompatiblen Datentyp »jsonb«"
+
+#: check.c:1405
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält den Datentyp »jsonb« in\n"
+"Benutzertabellen. Das interne Format von »jsonb« wurde während 9.4\n"
+"Beta geändert. Daher kann dieser Cluster gegenwärtig nicht\n"
+"aktualisiert werden. Sie können die Problemspalten löschen und das\n"
+"Upgrade neu starten. Eine Liste der Problemspalten ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:1427
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Prüfe auf Rollen, die mit »pg_« anfangen"
+
+#: check.c:1437
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "Der alte Cluster enthält Rollen, die mit »pg_« anfangen\n"
+
+#: check.c:1439
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "Der neue Cluster enthält Rollen, die mit »pg_« anfangen\n"
+
+#: check.c:1460
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Prüfe auf benutzerdefinierte Kodierungsumwandlungen"
+
+#: check.c:1524
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält benutzerdefinierte\n"
+"Kodierungsumwandlungen. Die Parameter von Umwandlungsfunktionen wurden\n"
+"in PostgreSQL Version 14 geändert. Daher kann dieser Cluster\n"
+"gegenwärtig nicht aktualisiert werden. Sie können die\n"
+"Kodierungsumwandlungen im alten Cluster entfernen und das Upgrade neu\n"
+"starten. Eine Liste der benutzerdefinierten Kodierungsumwandlungen ist\n"
+"in der Datei:\n"
+" %s\n"
+"\n"
+
+#: check.c:1551
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "konnte aktuelle Locale nicht ermitteln\n"
+
+#: check.c:1560
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "konnte System-Locale-Namen für »%s« nicht ermitteln\n"
+
+#: check.c:1566
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "konnte alte Locale »%s« nicht wiederherstellen\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "konnte Kontrolldaten mit %s nicht ermitteln: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: Problem mit dem Zustand des Clusters\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Der alte Cluster wurde im Wiederherstellungsmodus heruntergefahren. Um ihn zu aktualisieren, verwenden Sie »rsync« wie in der Dokumentation beschrieben oder fahren Sie ihn im Primärmodus herunter.\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Der neue Cluster wurde im Wiederherstellungsmodus heruntergefahren. Um ihn zu aktualisieren, verwenden Sie »rsync« wie in der Dokumentation beschrieben oder fahren Sie ihn im Primärmodus herunter.\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "Der alte Cluster wurde nicht sauber heruntergefahren.\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "Der neue Cluster wurde nicht sauber heruntergefahren.\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "Im alten Cluster fehlen Cluster-Zustandsinformationen:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "Im neuen Cluster fehlen Cluster-Zustandsinformationen:\n"
+
+#: controldata.c:209 dump.c:50 pg_upgrade.c:440 pg_upgrade.c:477
+#: relfilenode.c:231 server.c:34
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: Problem mit pg_resetwal\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: Problem beim Ermitteln der Kontrolldaten\n"
+
+#: controldata.c:571
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "Im alten Cluster fehlen einige notwendige Kontrollinformationen:\n"
+
+#: controldata.c:574
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "Im neuen Cluster fehlen einige notwendige Kontrollinformationen:\n"
+
+#: controldata.c:577
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " Checkpoint nächste XID\n"
+
+#: controldata.c:580
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " NextOID des letzten Checkpoints\n"
+
+#: controldata.c:583
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " NextMultiXactId des letzten Checkpoints\n"
+
+#: controldata.c:587
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " oldestMultiXid des letzten Checkpoints\n"
+
+#: controldata.c:590
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " oldestXID des letzten Checkpoints\n"
+
+#: controldata.c:593
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " NextMultiOffset des letzten Checkpoints\n"
+
+#: controldata.c:596
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " erstes WAL-Segment nach dem Reset\n"
+
+#: controldata.c:599
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " Übergabe von Float8-Argumenten\n"
+
+#: controldata.c:602
+#, c-format
+msgid " maximum alignment\n"
+msgstr " maximale Ausrichtung (Alignment)\n"
+
+#: controldata.c:605
+#, c-format
+msgid " block size\n"
+msgstr " Blockgröße\n"
+
+#: controldata.c:608
+#, c-format
+msgid " large relation segment size\n"
+msgstr " Segmentgröße für große Relationen\n"
+
+#: controldata.c:611
+#, c-format
+msgid " WAL block size\n"
+msgstr " WAL-Blockgröße\n"
+
+#: controldata.c:614
+#, c-format
+msgid " WAL segment size\n"
+msgstr " WAL-Segmentgröße\n"
+
+#: controldata.c:617
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " maximale Bezeichnerlänge\n"
+
+#: controldata.c:620
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " maximale Anzahl indizierter Spalten\n"
+
+#: controldata.c:623
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " maximale TOAST-Chunk-Größe\n"
+
+#: controldata.c:627
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " Large-Object-Chunk-Größe\n"
+
+#: controldata.c:630
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " Datum/Zeit sind Ganzzahlen?\n"
+
+#: controldata.c:634
+#, c-format
+msgid " data checksum version\n"
+msgstr " Datenprüfsummenversion\n"
+
+#: controldata.c:636
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "Kann ohne die benötigten Kontrollinformationen nicht fortsetzen, Programm wird beendet\n"
+
+#: controldata.c:651
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"altes und neues Alignment in pg_controldata ist ungültig oder stimmt nicht überein\n"
+"Wahrscheinlich ist ein Cluster eine 32-Bit-Installation und der andere 64-Bit\n"
+
+#: controldata.c:655
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "alte und neue Blockgrößen von pg_controldata sind ungültig oder stimmen nicht überein\n"
+
+#: controldata.c:658
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "alte und neue maximale Relationssegmentgrößen von pg_controldata sind ungültig oder stimmen nicht überein\n"
+
+#: controldata.c:661
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "alte und neue WAL-Blockgrößen von pg_controldata sind ungültig oder stimmen nicht überein\n"
+
+#: controldata.c:664
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "alte und neue WAL-Segmentgrößen von pg_controldata sind ungültig oder stimmen nicht überein\n"
+
+#: controldata.c:667
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "alte und neue maximale Bezeichnerlängen von pg_controldata sind ungültig oder stimmen nicht überein\n"
+
+#: controldata.c:670
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "alte und neue Maximalzahlen indizierter Spalten von pg_controldata sind ungültig oder stimmen nicht überein\n"
+
+#: controldata.c:673
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "alte und neue maximale TOAST-Chunk-Größen von pg_controldata sind ungültig oder stimmen nicht überein\n"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "alte und neue Large-Object-Chunk-Größen von pg_controldata sind ungültig oder stimmen nicht überein\n"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "alte und neue Speicherung von Datums- und Zeittypen von pg_controldata ist ungültig oder stimmt nicht überein\n"
+
+#: controldata.c:694
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "der alte Cluster verwendet keine Datenprüfsummen, aber der neue verwendet sie\n"
+
+#: controldata.c:697
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "die alte Cluster verwendet Datenprüfsummen, aber der neue nicht\n"
+
+#: controldata.c:699
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "Prüfsummenversionen im alten und neuen Cluster stimmen nicht überein\n"
+
+#: controldata.c:710
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Füge Endung ».old« an altes global/pg_control an"
+
+#: controldata.c:715
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "Konnte %s nicht in %s umbenennen.\n"
+
+#: controldata.c:718
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Wenn Sie den alten Cluster starten wollen, müssen Sie die Endung\n"
+"».old« von %s/global/pg_control.old entfernen. Da der »link«-Modus\n"
+"verwendet wurde, kann der alte Cluster nicht gefahrlos gestartet\n"
+"werden, nachdem der neue Cluster gestartet worden ist.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Erzeuge Dump der globalen Objekte"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Erzeuge Dump der Datenbankschemas"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "konnte pg_ctl-Versionsdaten mit %s nicht ermitteln: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "konnte pg_ctl-Version nicht ermitteln von %s\n"
+
+#: exec.c:108 exec.c:112
+#, c-format
+msgid "command too long\n"
+msgstr "Befehl zu lang\n"
+
+#: exec.c:114 util.c:37 util.c:310
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:153 pg_upgrade.c:279
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "konnte Logdatei »%s« nicht öffnen: %m\n"
+
+#: exec.c:182
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*fehlgeschlagen*"
+
+#: exec.c:185
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "Probleme beim Ausführen von »%s«\n"
+
+#: exec.c:188
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Prüfen Sie die letzten Zeilen von »%s« oder »%s« für den\n"
+"wahrscheinlichen Grund für das Scheitern.\n"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Prüfen Sie die letzten Zeilen von »%s« für den\n"
+"wahrscheinlichen Grund für das Scheitern.\n"
+
+#: exec.c:208 pg_upgrade.c:289
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "konnte nicht in Logdatei »%s «schreiben: %m\n"
+
+#: exec.c:234
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %s\n"
+
+#: exec.c:261
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Sie müssen Lese- und Schreibzugriff im aktuellen Verzeichnis haben.\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "Prüfen von »%s« fehlgeschlagen: %s\n"
+
+#: exec.c:317 exec.c:383
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "»%s« ist kein Verzeichnis\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "Prüfen von »%s« fehlgeschlagen: keine reguläre Datei\n"
+
+#: exec.c:436
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "Prüfen von »%s« fehlgeschlagen: kann nicht ausgeführt werden (keine Berechtigung)\n"
+
+#: exec.c:442
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "Prüfen von »%s« fehlgeschlagen: kann nicht ausgeführt werden\n"
+
+#: exec.c:452
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr "Prüfen von »%s« fehlgeschlagen: falsche Version: gefunden »%s«, erwartet »%s«\n"
+
+#: file.c:43 file.c:63
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "Fehler beim Klonen von Relation »%s.%s« (»%s« nach »%s«): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "Fehler beim Klonen von Relation »%s.%s«: konnte Datei »%s« nicht öffnen: %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "Fehler beim Klonen von Relation »%s.%s«: konnte Datei »%s« nicht erzeugen: %s\n"
+
+#: file.c:89 file.c:192
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht öffnen: %s\n"
+
+#: file.c:94 file.c:201
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht erzeugen: %s\n"
+
+#: file.c:108 file.c:225
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht lesen: %s\n"
+
+#: file.c:120 file.c:303
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht schreiben: %s\n"
+
+#: file.c:134
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "Fehler beim Kopieren von Relation »%s.%s« (»%s« nach »%s«): %s\n"
+
+#: file.c:153
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "Fehler beim Erzeugen einer Verknüpfung für Relation »%s.%s« (»%s« nach »%s«): %s\n"
+
+#: file.c:196
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte »stat« für Datei »%s« nicht ausführen: %s\n"
+
+#: file.c:228
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: unvollständige Seite gefunden in Datei »%s«\n"
+
+#: file.c:330 file.c:347
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "konnte Datei nicht vom alten in das neue Datenverzeichnis klonen: %s\n"
+
+#: file.c:343
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "konnte Datei »%s« nicht erstellen: %s\n"
+
+#: file.c:354
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "Klonen von Dateien wird auf dieser Plattform nicht unterstützt\n"
+
+#: file.c:371
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"konnte Hard-Link-Verknüpfung zwischen altem und neuen Datenverzeichnis nicht erzeugen: %s\n"
+"Im Link-Modus müssen das alte und das neue Datenverzeichnis im selben Dateisystem liegen.\n"
+
+#: function.c:129
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Prüfe das Vorhandensein benötigter Bibliotheken"
+
+#: function.c:167
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "konnte Bibliothek »%s« nicht laden: %s"
+
+#: function.c:178
+#, c-format
+msgid "In database: %s\n"
+msgstr "In Datenbank: %s\n"
+
+#: function.c:188
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation verweist auf ladbare Bibliotheken, die in der neuen\n"
+"Installation fehlen. Sie können diese Bibliotheken zur neuen\n"
+"Installation hinzufügen oder die Funktionen in der alten Installation\n"
+"entfernen. Eine Liste der problematischen Bibliotheken ist in der\n"
+"Datei:\n"
+" %s\n"
+"\n"
+
+#: info.c:125
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "Relationsnamen für OID %u in Datenbank »%s« stimmen nicht überein: alten Name »%s.%s«, neuer Name »%s.%s«\n"
+
+#: info.c:145
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "Alte und neue Tabellen in Datenbank »%s« konnten nicht gepaart werden\n"
+
+#: info.c:226
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr ", ein Index für »%s.%s«"
+
+#: info.c:236
+#, c-format
+msgid " which is an index on OID %u"
+msgstr ", ein Index für OID %u"
+
+#: info.c:248
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr ", eine TOAST-Tabelle für »%s.%s«"
+
+#: info.c:256
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr ", eine TOAST-Tabelle für OID %u"
+
+#: info.c:260
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "Keine Übereinstimmung gefunden im alten Cluster für neue Relation mit OID %u in Datenbank »%s«: %s\n"
+
+#: info.c:263
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "Keine Übereinstimmung gefunden im neuen Cluster für alte Relation mit OID %u in Datenbank »%s«: %s\n"
+
+#: info.c:287
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"Quelldatenbanken:\n"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"Zieldatenbanken:\n"
+
+#: info.c:604
+#, c-format
+msgid "Database: %s\n"
+msgstr "Datenbank: %s\n"
+
+#: info.c:606
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:617
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:100
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: kann nicht als root ausgeführt werden\n"
+
+#: option.c:167
+#, c-format
+msgid "invalid old port number\n"
+msgstr "ungültige alte Portnummer\n"
+
+#: option.c:172
+#, c-format
+msgid "invalid new port number\n"
+msgstr "ungültige neue Portnummer\n"
+
+#: option.c:198
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n"
+
+#: option.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)\n"
+
+#: option.c:208
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Ausführung im Verbose-Modus\n"
+
+#: option.c:226
+msgid "old cluster binaries reside"
+msgstr "die Programmdateien des alten Clusters liegen"
+
+#: option.c:228
+msgid "new cluster binaries reside"
+msgstr "die Programmdateien des neuen Clusters liegen"
+
+#: option.c:230
+msgid "old cluster data resides"
+msgstr "die Daten das alten Clusters liegen"
+
+#: option.c:232
+msgid "new cluster data resides"
+msgstr "die Daten des neuen Clusters liegen"
+
+#: option.c:234
+msgid "sockets will be created"
+msgstr "die Sockets erzeugt werden sollen"
+
+#: option.c:251 option.c:350
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "konnte aktuelles Verzeichnis nicht ermitteln\n"
+
+#: option.c:254
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "auf Windows kann pg_upgrade nicht von innerhalb des Cluster-Datenverzeichnisses ausgeführt werden\n"
+
+#: option.c:263
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade aktualisiert einen PostgreSQL-Cluster auf eine neue Hauptversion.\n"
+"\n"
+
+#: option.c:264
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: option.c:265
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+
+#: option.c:266
+#, c-format
+msgid "Options:\n"
+msgstr "Optionen:\n"
+
+#: option.c:267
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINVERZ Programmverzeichnis des alten Clusters\n"
+
+#: option.c:268
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINVERZ Programmverzeichnis des neuen Clusters\n"
+" (Standard: gleiches Verzeichnis wie pg_upgrade)\n"
+
+#: option.c:270
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check nur Cluster prüfen, keine Daten ändern\n"
+
+#: option.c:271
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATENVERZ Datenverzeichnis des alten Clusters\n"
+
+#: option.c:272
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATENVERZ Datenverzeichnis des neuen Clusters\n"
+
+#: option.c:273
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM Anzahl paralleler Prozesse oder Threads\n"
+
+#: option.c:274
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link Dateien in den neuen Cluster verknüpfen statt kopieren\n"
+
+#: option.c:275
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n"
+" geschrieben sind\n"
+
+#: option.c:276
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONEN Serveroptionen für den alten Cluster\n"
+
+#: option.c:277
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONEN Serveroptionen für den neuen Cluster\n"
+
+#: option.c:278
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT Portnummer für den alten Cluster (Standard: %d)\n"
+
+#: option.c:279
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT Portnummer für den neuen Cluster (Standard: %d)\n"
+
+#: option.c:280
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain SQL- und Logdateien bei Erfolg aufheben\n"
+
+#: option.c:281
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=VERZ Verzeichnis für Socket (Standard: aktuelles Verz.)\n"
+
+#: option.c:282
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME Cluster-Superuser (Standard: »%s«)\n"
+
+#: option.c:283
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose »Verbose«-Modus einschalten\n"
+
+#: option.c:284
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: option.c:285
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone Dateien in den neuen Cluster klonen statt kopieren\n"
+
+#: option.c:286
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: option.c:287
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Vor dem Aufruf von pg_upgrade müssen Sie:\n"
+" den neuen Datenbankcluster anlegen (mit der neuen Version von initdb)\n"
+" den Postmaster für den alten Cluster anhalten\n"
+" den Postmaster für den neuen Cluster anhalten\n"
+
+#: option.c:292
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Beim Aufruf von pg_upgrade müssen die folgenden Informationen angegeben werden:\n"
+" das Datenverzeichnis des alten Clusters (-d DATENVERZ)\n"
+" das Datenverzeichnis des neuen Clusters (-D DATENVERZ)\n"
+" das »bin«-Verzeichnis der alten Version (-b BINVERZ)\n"
+" das »bin«-Verzeichnis der neuen Version (-B BINVERZ)\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Zum Beispiel:\n"
+" pg_upgrade -d alterCluster/data -D neuerCluster/data -b alterCluster/bin -B neuerCluster/bin\n"
+"oder\n"
+
+#: option.c:303
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=alterCluster/data\n"
+" $ export PGDATANEW=neuerCluster/data\n"
+" $ export PGBINOLD=alterCluster/bin\n"
+" $ export PGBINNEW=neuerCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=alterCluster/data\n"
+" C:\\> set PGDATANEW=neuerCluster/data\n"
+" C:\\> set PGBINOLD=alterCluster/bin\n"
+" C:\\> set PGBINNEW=neuerCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: option.c:316
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: option.c:356
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"Sie müssen das Verzeichnis angeben, wo %s.\n"
+"Bitte verwenden Sie die Kommandzeilenoption %s oder die Umgebungsvariable %s.\n"
+
+#: option.c:408
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Suche das tatsächliche Datenverzeichnis des alten Clusters"
+
+#: option.c:410
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Suche das tatsächliche Datenverzeichnis des neuen Clusters"
+
+#: option.c:422
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "konnte Datenverzeichnis mit %s nicht ermitteln: %s\n"
+
+#: option.c:473
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "konnte Zeile %d aus Datei »%s« nicht lesen: %s\n"
+
+#: option.c:490
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "vom Benutzer angegebene Portnummer %hu wurde auf %hu korrigiert\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "konnte Arbeitsprozess nicht erzeugen: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "konnte Arbeits-Thread nicht erzeugen: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "%s() fehlgeschlagen: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "Kindprozess wurde abnormal beendet: Status %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "Kindprozess wurde abnormal beendet: %s\n"
+
+#: pg_upgrade.c:102
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %s\n"
+
+#: pg_upgrade.c:134
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Führe Upgrade durch\n"
+"-------------------\n"
+
+#: pg_upgrade.c:177
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Setze nächste OID im neuen Cluster"
+
+#: pg_upgrade.c:186
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Synchronisiere Datenverzeichnis auf Festplatte"
+
+#: pg_upgrade.c:198
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Upgrade abgeschlossen\n"
+"---------------------\n"
+
+#: pg_upgrade.c:231 pg_upgrade.c:244 pg_upgrade.c:251 pg_upgrade.c:258
+#: pg_upgrade.c:276 pg_upgrade.c:287
+#, c-format
+msgid "directory path for new cluster is too long\n"
+msgstr "Verzeichnispfad für neuen Cluster ist zu lang\n"
+
+#: pg_upgrade.c:265 pg_upgrade.c:267 pg_upgrade.c:269 pg_upgrade.c:271
+#, c-format
+msgid "could not create directory \"%s\": %m\n"
+msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m\n"
+
+#: pg_upgrade.c:320
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: konnte eigene Programmdatei nicht finden\n"
+
+#: pg_upgrade.c:346
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Es läuft scheinbar ein Postmaster für den alten Cluster.\n"
+"Bitte beenden Sie diesen Postmaster und versuchen Sie es erneut.\n"
+
+#: pg_upgrade.c:359
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Es läuft scheinbar ein Postmaster für den neuen Cluster.\n"
+"Bitte beenden Sie diesen Postmaster und versuchen Sie es erneut.\n"
+
+#: pg_upgrade.c:373
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analysiere alle Zeilen im neuen Cluster"
+
+#: pg_upgrade.c:386
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Friere alle Zeilen im neuen Cluster ein"
+
+#: pg_upgrade.c:406
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Stelle globale Objekte im neuen Cluster wieder her"
+
+#: pg_upgrade.c:422
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Stelle Datenbankschemas im neuen Cluster wieder her"
+
+#: pg_upgrade.c:528
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Lösche Dateien aus neuem %s"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "konnte Verzeichnis »%s« nicht löschen\n"
+
+#: pg_upgrade.c:551
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Kopiere altes %s zum neuen Server"
+
+#: pg_upgrade.c:577
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Setze älteste XID im neuen Cluster"
+
+#: pg_upgrade.c:585
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Setze nächste Transaktions-ID und -epoche im neuen Cluster"
+
+#: pg_upgrade.c:615
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Setze nächste Multixact-ID und nächstes Offset im neuen Cluster"
+
+#: pg_upgrade.c:639
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Setze älteste Multixact-ID im neuen Cluster"
+
+#: pg_upgrade.c:659
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Setze WAL-Archive zurück"
+
+#: pg_upgrade.c:702
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Setze frozenxid und minmxid im neuen Cluster"
+
+#: pg_upgrade.c:704
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Setze minmxid im neuen Cluster"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Klone Benutzertabellendateien"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Kopiere Benutzertabellendateien"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Verknüpfe Benutzertabellendateien"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "alte Datenbank »%s« nicht im neuen Cluster gefunden\n"
+
+#: relfilenode.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "Fehler beim Prüfen auf Existenz der Datei für »%s.%s« (»%s« nach »%s«): %s\n"
+
+#: relfilenode.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "konvertiere »%s« nach »%s«\n"
+
+#: relfilenode.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "klone »%s« nach »%s«\n"
+
+#: relfilenode.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "kopiere »%s« nach »%s«\n"
+
+#: relfilenode.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "verknüpfe »%s« nach »%s«\n"
+
+#: server.c:39 server.c:143 util.c:220 util.c:250
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Fehlgeschlagen, Programm wird beendet\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s\n"
+msgstr "führe aus: %s\n"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL-Befehl fehlgeschlagen\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "konnte Versionsdatei »%s« nicht öffnen: %m\n"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "konnte Versionsdatei »%s« nicht interpretieren\n"
+
+#: server.c:291
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:295
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"konnte nicht mit dem Postmaster für den alten Cluster verbinden, gestartet mit dem Befehl:\n"
+"%s\n"
+
+#: server.c:299
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"konnte nicht mit dem Postmaster für den neuen Cluster verbinden, gestartet mit dem Befehl:\n"
+"%s\n"
+
+#: server.c:313
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl konnte den Quellserver nicht starten, oder Verbindung fehlgeschlagen\n"
+
+#: server.c:315
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl konnte den Zielserver nicht starten, oder Verbindung fehlgeschlagen\n"
+
+#: server.c:360
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: server.c:373
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "libpq-Umgebungsvariable %s hat einen nicht lokalen Serverwert: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"Kann nicht auf gleiche Systemkatalogversion aktualisieren, wenn\n"
+"Tablespaces verwendet werden.\n"
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "Tablespace-Verzeichnis »%s« existiert nicht\n"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "konnte »stat« für Tablespace-Verzeichnis »%s« nicht ausführen: %s\n"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "Tablespace-Pfad »%s« ist kein Verzeichnis\n"
+
+#: util.c:52 util.c:55 util.c:127 util.c:160
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:95
+#, c-format
+msgid "could not access directory \"%s\": %m\n"
+msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m\n"
+
+#: util.c:158
+#, c-format
+msgid "%-*s\n"
+msgstr "%-*s\n"
+
+#: util.c:259
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Prüfe auf inkompatiblen Datentyp »line«"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält den Datentyp »line« in Benutzertabellen. Das\n"
+"interne Format und das Eingabe-/Ausgabeformat dieses Datentyps wurden\n"
+"zwischen Ihrem alten und neuen Cluster geändert und daher kann dieser\n"
+"Cluster gegenwärtig nicht aktualisiert werden. Sie können die\n"
+"Problemspalten löschen und das Upgrade neu starten. Eine Liste der\n"
+"Problemspalten ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Prüfe auf ungültige Benutzerspalten mit Typ »unknown«"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält den Datentyp »unknown« in\n"
+"Benutzertabellen. Dieser Datentyp ist nicht mehr in Tabellen erlaubt\n"
+"und daher kann dieser Cluster gegenwärtig nicht aktualisiert\n"
+"werden. Sie können die Problemspalten löschen und das Upgrade neu\n"
+"starten. Eine Liste der Problemspalten ist in der Datei:\n"
+" %s\n"
+"\n"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Prüfe auf Hash-Indexe"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "Warnung"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"Ihre Installation enthält Hash-Indexe. Diese Indexe haben\n"
+"unterschiedliche interne Formate im alten und neuen Cluster und müssen\n"
+"daher mit dem Befehl REINDEX reindiziert werden. Nach dem Upgrade\n"
+"werden Sie Anweisungen zum REINDEX erhalten.\n"
+"\n"
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"Ihre Installation enthält Hash-Indexe. Diese Indexe haben\n"
+"unterschiedliche interne Formate im alten und neuen Cluster und müssen\n"
+"daher mit dem Befehl REINDEX reindiziert werden. Die Datei\n"
+" %s\n"
+"kann mit psql als Datenbank-Superuser ausgeführt werden, um alle\n"
+"ungültigen Indexe neu zu erzeugen. Bis dahin werden diese Indexe nicht\n"
+"verwendet werden.\n"
+"\n"
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Prüfe auf ungültige Benutzerspalten mit Typ »sql_identifier«"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Ihre Installation enthält den Datentyp »sql_identifier« in\n"
+"Benutzertabellen. Das Speicherformat dieses Datentyps wurde geändert\n"
+"und daher kann dieser Cluster gegenwärtig nicht aktualisiert\n"
+"werden. Sie können die Problemspalten löschen und das Upgrade neu\n"
+"starten. Eine Liste der Problemspalten ist in der Datei: %s\n"
+"\n"
+
+#: version.c:403
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Prüfe auf Aktualisierungen von Erweiterungen"
+
+#: version.c:455
+#, c-format
+msgid "notice"
+msgstr "Hinweis"
+
+#: version.c:456
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"Ihre Installation enthält Erweiterungen, die mit dem Befehl ALTER\n"
+"EXTENSION aktualisiert werden sollten. Die Datei\n"
+" %s\n"
+"kann mit psql als Datenbank-Superuser ausgeführt werden, um die\n"
+"Erweiterungen zu aktualisieren.\n"
+"\n"
diff --git a/src/bin/pg_upgrade/po/es.po b/src/bin/pg_upgrade/po/es.po
new file mode 100644
index 0000000..78c8359
--- /dev/null
+++ b/src/bin/pg_upgrade/po/es.po
@@ -0,0 +1,1872 @@
+# spanish message translation file for pg_upgrade
+#
+# Copyright (c) 2017-2021, PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the PostgreSQL package.
+# Álvaro Herrera <alvherre@alvh.no-ip.org>, 2017.
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:48+0000\n"
+"PO-Revision-Date: 2022-10-20 09:06+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Verificando Consistencia en Vivo en el Servidor Antiguo\n"
+"-------------------------------------------------------\n"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Verificando Consistencia\n"
+"------------------------\n"
+
+#: check.c:218
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Los clústers son compatibles*\n"
+
+#: check.c:226
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Si pg_upgrade falla a partir de este punto, deberá re-ejecutar initdb\n"
+"en el clúster nuevo antes de continuar.\n"
+
+#: check.c:267
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"Las estadísticas para el optimizador no son transferidas por pg_upgrade.\n"
+"Una vez que inicie el servidor nuevo, considere ejecutar:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:273
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"Ejecutando este script se borrarán los archivos de datos del servidor antiguo:\n"
+" %s\n"
+
+#: check.c:278
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"No se pudo crear un script para borrar los archivos de datos del servidor\n"
+"antiguo, porque el directorio del clúster antiguo contiene tablespaces\n"
+"o el directorio de datos del servidor nuevo. El contenido del servidor\n"
+"antiguo debe ser borrado manualmente.\n"
+
+#: check.c:290
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Verificando las versiones de los clústers"
+
+#: check.c:302
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later.\n"
+msgstr "Este programa sólo puede actualizar desde PostgreSQL versión %s y posterior.\n"
+
+#: check.c:307
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Este programa sólo puede actualizar a PostgreSQL versión %s.\n"
+
+#: check.c:316
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "Este programa no puede usarse para volver a versiones anteriores de PostgreSQL.\n"
+
+#: check.c:321
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr ""
+"El directorio de datos antiguo y el directorio de binarios antiguo son de\n"
+"versiones diferentes.\n"
+
+#: check.c:324
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr ""
+"El directorio de datos nuevo y el directorio de binarios nuevo son de\n"
+"versiones diferentes.\n"
+
+#: check.c:339
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Al verificar servidores en caliente, los números de port antiguo y nuevo deben ser diferentes.\n"
+
+#: check.c:354
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "las codificaciones de la base de datos «%s» no coinciden: antigua «%s», nueva «%s»\n"
+
+#: check.c:359
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "valores lc_collate de la base de datos «%s» no coinciden: antigua «%s», nueva «%s»\n"
+
+#: check.c:362
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "valores lc_ctype de la base de datos «%s» no coinciden: antigua «%s», nueva «%s»\n"
+
+#: check.c:365
+#, c-format
+msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "proveedores de configuración regional de la base de datos «%s» no coinciden: antigua «%s», nueva «%s»\n"
+
+#: check.c:372
+#, c-format
+msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "valores de configuración regional ICU de la base de datos «%s» no coinciden: antigua «%s», nueva «%s»\n"
+
+#: check.c:447
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "La base de datos «%s» del clúster nuevo no está vacía: se encontró la relación «%s.%s»\n"
+
+#: check.c:499
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Verificando los directorios de tablespaces para el nuevo clúster"
+
+#: check.c:510
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "directorio de tablespace para el nuevo clúster ya existe: «%s»\n"
+
+#: check.c:543
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s\n"
+msgstr ""
+"\n"
+"ADVERTENCIA: el directorio de datos nuevo no debería estar dentro del directorio antiguo,\n"
+"esto es, %s\n"
+
+#: check.c:567
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s\n"
+msgstr ""
+"\n"
+"ADVERTENCIA: las ubicaciones de tablespaces definidos por el usuario\n"
+"no deberían estar dentro del directorio de datos,\n"
+"esto es, %s\n"
+
+#: check.c:577
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Creando un script para borrar el clúster antiguo"
+
+#: check.c:580 check.c:755 check.c:875 check.c:974 check.c:1105 check.c:1184
+#: check.c:1453 file.c:338 function.c:165 option.c:465 version.c:116
+#: version.c:292 version.c:429
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "no se pudo abrir el archivo «%s»: %s\n"
+
+#: check.c:631
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "no se pudo agregar permisos de ejecución al archivo «%s»: %s\n"
+
+#: check.c:651
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Verificando que el usuario de base de datos es el usuario de instalación"
+
+#: check.c:667
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "el usuario de base de datos «%s» no es el usuario de instalación\n"
+
+#: check.c:678
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "no se pudo determinar el número de usuarios\n"
+
+#: check.c:686
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "Sólo el usuario de instalación puede estar definido en el nuevo clúster.\n"
+
+#: check.c:716
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Verificando los parámetros de conexión de bases de datos"
+
+#: check.c:742
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 no debe permitir conexiones, es decir su pg_database.datallowconn debe ser «false»\n"
+
+#: check.c:772 check.c:897 check.c:999 check.c:1125 check.c:1206 check.c:1265
+#: check.c:1326 check.c:1357 check.c:1476 function.c:187 version.c:192
+#: version.c:232 version.c:378
+#, c-format
+msgid "fatal\n"
+msgstr "fatal\n"
+
+#: check.c:773
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Todas las bases de datos que no son template0 deben permitir conexiones,\n"
+"es decir, pg_database.datallowconn debe ser true. Su instalación contiene\n"
+"bases de datos que no son template0 que tienen pg_database.datallowconn\n"
+"definido a false. Considere permitir conexiones para todas las bases de\n"
+"datos que no son template0 o eliminar las bases de datos que no permiten\n"
+"conexión. Un listado de las bases de datos con el problema se encuentra en:\n"
+" %s\n"
+"\n"
+
+#: check.c:798
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Verificando transacciones preparadas"
+
+#: check.c:807
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "El clúster de origen contiene transacciones preparadas\n"
+
+#: check.c:809
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "El clúster de destino contiene transacciones preparadas\n"
+
+#: check.c:835
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Verificando contrib/isn con discordancia en mecanismo de paso de bigint"
+
+#: check.c:898
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene funciones de «contrib/isn» que usan el tip de dato\n"
+"bigint. Sus clústers nuevo y antiguo pasar el tipo bigint de distinta forma,\n"
+"por lo que este clúster no puede ser actualizado.\n"
+"Puede hacer un volcado (dump) de las bases de datos que usan «contrib/isn»,\n"
+"eliminarlas, hacer el upgrade, y luego restaurarlas.\n"
+"Un listado de funciones problemáticas está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: check.c:921
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Verificando operadores postfix definidos por el usuario"
+
+#: check.c:1000
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene operadores postfix definidos por el usuario, los\n"
+"cuales ya no están soportados. Considere eliminar los operadores postfix\n"
+"y reemplazarlos con operadores de prefijo o llamadas a funciones.\n"
+"Una lista de operadores postfix definidos por el usuario aparece en el archivo:\n"
+" %s\n"
+"\n"
+
+#: check.c:1024
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Verificando funciones polimórficas incompatibles"
+
+#: check.c:1126
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene objetos definidos por el usuario que hacen referencia\n"
+"a funciones polimórficas con argumentos de tipo «anyarray» o «anyelement».\n"
+"Esos objetos definidos por el usuario deben eliminarse antes de actualizar\n"
+"y se pueden restaurar después, cambiándolos para que hagan referencia a las nuevas\n"
+"funciones correspondientes con argumentos de tipo «anycompatiblearray» y\n"
+"«anycompatible». Una lista de los objetos problemáticos está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: check.c:1151
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Verificando tablas WITH OIDS"
+
+#: check.c:1207
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene tablas declaradas WITH OIDS, que ya no está\n"
+"soportado. Considere eliminar la columna oid usando\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Una lista de tablas con este problema aparece en el archivo:\n"
+" %s\n"
+"\n"
+
+#: check.c:1235
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Verificando tipos compuestos definidos por el sistema en tablas de usuario"
+
+#: check.c:1266
+#, c-format
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene uno o varios tipos compuestos definidos por el sistema en\n"
+"tablas de usuario. Los OIDs de estos tipos no son estables entre diferentes\n"
+"versiones de PostgreSQL, por lo que este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: check.c:1294
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Verificando tipos de datos reg* en datos de usuario"
+
+#: check.c:1327
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene uno de los tipos reg* en tablas de usuario. Estos tipos\n"
+"de dato hacen referencia a OIDs de sistema que no son preservados por pg_upgrade,\n"
+"por lo que este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: check.c:1349
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Verificando datos de usuario en tipo «jsonb» incompatible"
+
+#: check.c:1358
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene el tipo «jsonb» en tablas de usuario.\n"
+"El formato interno de «jsonb» cambió durante 9.4 beta,\n"
+"por lo que este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: check.c:1380
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Verificando roles que empiecen con «pg_»"
+
+#: check.c:1390
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "El clúster de origen contiene roles que empiezan con «pg_»\n"
+
+#: check.c:1392
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "El clúster de destino contiene roles que empiezan con «pg_»\n"
+
+#: check.c:1413
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Verificando conversiones de codificación definidas por el usuario"
+
+#: check.c:1477
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene conversiones de codificación definidas por el usuario.\n"
+"Los parámetros de la función de conversión cambiaron en PostgreSQL 14\n"
+"por lo que este clúster no puede ser actualizado. Puede eliminar\n"
+"las conversiones de codificación en el clúster antiguo y reiniciar la actualización.\n"
+"Un listado de las conversiones de codificación definidas por el usuario está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: check.c:1504
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "no se pudo obtener el «locale» actual\n"
+
+#: check.c:1513
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "no se pudo obtener el nombre del «locale» para «%s»\n"
+
+#: check.c:1519
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "no se pudo restaurar el locale antiguo «%s»\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "no se pudo obtener datos de control usando %s: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: problema de estado del clúster\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "El clúster de origen fue apagado mientras estaba en modo de recuperación. Para actualizarlo, use «rsync» como está documentado, o apáguelo siendo primario.\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "El clúster de destino fue apagado mientras estaba en modo de recuperación. Para actualizarlo, use «rsync» como está documentado, o apáguelo siendo primario.\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "El clúster de origen no fue apagado limpiamente.\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "El clúster de destino no fue apagado limpiamente.\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "Al clúster de origen le falta información de estado:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "Al cluster de destino le falta información de estado:\n"
+
+#: controldata.c:209 dump.c:50 pg_upgrade.c:440 pg_upgrade.c:477
+#: relfilenode.c:231 server.c:34
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: problema en pg_resetwal\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: problema de extracción de controldata\n"
+
+#: controldata.c:571
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "Al clúster de origen le falta información de control requerida:\n"
+
+#: controldata.c:574
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "Al clúster de destino le falta información de control requerida:\n"
+
+#: controldata.c:577
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " siguiente XID del último checkpoint\n"
+
+#: controldata.c:580
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " siguiente OID del último checkpoint\n"
+
+#: controldata.c:583
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " siguiente MultiXactId del último checkpoint\n"
+
+#: controldata.c:587
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " MultiXactId más antiguo del último checkpoint\n"
+
+#: controldata.c:590
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " XID más antiguo del último checkpoint\n"
+
+#: controldata.c:593
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " siguiente MultiXactOffset del siguiente checkpoint\n"
+
+#: controldata.c:596
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " primer segmento de WAL después del reinicio\n"
+
+#: controldata.c:599
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " método de paso de argumentos float8\n"
+
+#: controldata.c:602
+#, c-format
+msgid " maximum alignment\n"
+msgstr " alineamiento máximo\n"
+
+#: controldata.c:605
+#, c-format
+msgid " block size\n"
+msgstr " tamaño de bloques\n"
+
+#: controldata.c:608
+#, c-format
+msgid " large relation segment size\n"
+msgstr " tamaño de segmento de relación grande\n"
+
+#: controldata.c:611
+#, c-format
+msgid " WAL block size\n"
+msgstr " tamaño de bloque de WAL\n"
+
+#: controldata.c:614
+#, c-format
+msgid " WAL segment size\n"
+msgstr " tamaño de segmento de WAL\n"
+
+#: controldata.c:617
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " máximo largo de identificadores\n"
+
+#: controldata.c:620
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " máximo número de columnas indexadas\n"
+
+#: controldata.c:623
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " tamaño máximo de trozos TOAST\n"
+
+#: controldata.c:627
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " tamaño de trozos de objetos grandes\n"
+
+#: controldata.c:630
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " fechas/horas son enteros?\n"
+
+#: controldata.c:634
+#, c-format
+msgid " data checksum version\n"
+msgstr " versión del checksum de datos\n"
+
+#: controldata.c:636
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "No se puede continuar sin la información de control requerida. Terminando\n"
+
+#: controldata.c:651
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"Alineamientos de pg_controldata antiguo y nuevo no son válidos o no coinciden\n"
+"Seguramente un clúster es 32-bit y el otro es 64-bit\n"
+
+#: controldata.c:655
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "Los tamaños de bloque antiguo y nuevo no son válidos o no coinciden\n"
+
+#: controldata.c:658
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "El tamaño máximo de segmento de relación antiguo y nuevo no son válidos o no coinciden\n"
+
+#: controldata.c:661
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "El tamaño de bloques de WAL antiguo y nuevo no son válidos o no coinciden\n"
+
+#: controldata.c:664
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "El tamaño de segmentos de WAL antiguo y nuevo no son válidos o no coinciden\n"
+
+#: controldata.c:667
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "Los máximos largos de identificador antiguo y nuevo no son válidos o no coinciden\n"
+
+#: controldata.c:670
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "La cantidad máxima de columnas indexadas antigua y nueva no son válidos o no coinciden\n"
+
+#: controldata.c:673
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "Los máximos de trozos TOAST antiguo y nuevo no son válidos o no coinciden\n"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "Los tamaños de trozos de objetos grandes antiguo y nuevo no son válidos o no coinciden\n"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "Los tipos de almacenamiento de fecha/hora antiguo y nuevo no coinciden\n"
+
+#: controldata.c:694
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "El clúster antiguo no usa checksums de datos pero el nuevo sí\n"
+
+#: controldata.c:697
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "El clúster antiguo usa checksums de datos pero el nuevo no\n"
+
+#: controldata.c:699
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "Las versiones de checksum de datos antigua y nueva no coinciden\n"
+
+#: controldata.c:710
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Agregando el sufijo «.old» a global/pg_control"
+
+#: controldata.c:715
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "No se pudo renombrar %s a %s.\n"
+
+#: controldata.c:718
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Si desea iniciar el clúster antiguo, necesitará eliminar el sufijo\n"
+"«.old» de %s/global/pg_control.old.\n"
+"Puesto que se usó el modo «link», el clúster antiguo no puede usarse\n"
+"en forma segura después de que el clúster nuevo haya sido iniciado.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Creando el volcado de objetos globales"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Creando el volcado de esquemas de bases de datos"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "no se pudo obtener datos de versión de pg_ctl usando %s: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "no se pudo obtener la salida de versión de pg_ctl de %s\n"
+
+#: exec.c:108 exec.c:112
+#, c-format
+msgid "command too long\n"
+msgstr "orden demasiado larga\n"
+
+#: exec.c:114 util.c:37 util.c:310
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:153 pg_upgrade.c:279
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "no se pudo abrir el archivo de registro «%s»: %m\n"
+
+#: exec.c:182
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*falló*"
+
+#: exec.c:185
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "Hubo problemas ejecutando «%s»\n"
+
+#: exec.c:188
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Consulte las últimas línea de «%s» o «%s» para\n"
+"saber la causa probable de la falla.\n"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Consulte las últimas líneas de «%s» para saber\n"
+"la causa probable de la falla.\n"
+
+#: exec.c:208 pg_upgrade.c:289
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "no se pudo escribir al archivo de log «%s»\n"
+
+#: exec.c:234
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "no se pudo abrir el archivo «%s» para lectura: %s\n"
+
+#: exec.c:261
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Debe tener privilegios de lectura y escritura en el directorio actual.\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "la comprobación de «%s» falló: %s\n"
+
+#: exec.c:317 exec.c:383
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "«%s» no es un directorio\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "La comprobación de «%s» falló: no es un archivo regular\n"
+
+#: exec.c:436
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "La comprobación de «%s» falló: no se puede ejecutar (permiso denegado)\n"
+
+#: exec.c:442
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "La comprobación de «%s» falló: no se puede ejecutar\n"
+
+#: exec.c:452
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr "La comprobación de «%s» falló: versión incorrecta: se encontró «%s», se esperaba «%s»\n"
+
+#: file.c:43 file.c:63
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "error mientras se clonaba la relación «%s.%s» («%s» a «%s»): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "error mientras se clonaba la relación «%s.%s»: no se pudo abrir el archivo «%s»: %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "error mientras se clonaba la relación «%s.%s»: no se pudo crear el archivo «%s»: %s\n"
+
+#: file.c:89 file.c:192
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo leer el archivo «%s»: %s\n"
+
+#: file.c:94 file.c:201
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo crear el archivo «%s»: %s\n"
+
+#: file.c:108 file.c:225
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo leer el archivo «%s»: %s\n"
+
+#: file.c:120 file.c:303
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo escribir el archivo «%s»: %s\n"
+
+#: file.c:134
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "error mientras se copiaba la relación «%s.%s» («%s» a «%s»): %s\n"
+
+#: file.c:153
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "error mientras se creaba el link para la relación «%s.%s» («%s» a «%s»): %s\n"
+
+#: file.c:196
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo hacer stat a «%s»: %s\n"
+
+#: file.c:228
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "error mientras se copiaba la relación «%s.%s»: se encontró una página parcial en el archivo «%s»\n"
+
+#: file.c:330 file.c:347
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "no se pudo clonar el archivo entre los directorios viejo y nuevo: %s\n"
+
+#: file.c:343
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "no se pudo crear el archivo «%s»: %s\n"
+
+#: file.c:354
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "el clonado de archivos no está soportado en esta plataforma\n"
+
+#: file.c:371
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"No se pudo crear un link duro entre los directorios de datos nuevo y antiguo: %s\n"
+"En modo link los directorios de dato nuevo y antiguo deben estar en el mismo sistema de archivos.\n"
+
+#: function.c:129
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Verificando la presencia de las bibliotecas requeridas"
+
+#: function.c:167
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "no se pudo cargar la biblioteca «%s»: %s"
+
+#: function.c:178
+#, c-format
+msgid "In database: %s\n"
+msgstr "En la base de datos: %s\n"
+
+#: function.c:188
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación hace referencia a bibliotecas que no están en la nueva\n"
+"instalación. Puede agregar estar bibliotecas la instalación nueva, o\n"
+"eliminar las funciones que las utilizan de la versión antigua. Un listado\n"
+"de las bibliotecas problemáticas está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: info.c:125
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "Los nombres de relación para OID %u en la base de datos «%s» no coinciden: nombre antiguo «%s.%s», nombre nuevo «%s.%s»\n"
+
+#: info.c:145
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "No hubo coincidencia en las tablas nueva y antigua en la base de datos «%s»\n"
+
+#: info.c:226
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " que es un índice en «%s.%s»"
+
+#: info.c:236
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " que es un índice en el OID %u"
+
+#: info.c:248
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " que es la tabla TOAST para «%s.%s»"
+
+#: info.c:256
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " que es la tabla TOAST para el OID %u"
+
+#: info.c:260
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr ""
+"No se encontró equivalente en el clúster antiguo para la relación con OID %u\n"
+"en la base de datos «%s» en el clúster nuevo: %s\n"
+
+#: info.c:263
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr ""
+"No se encontró equivalente en el clúster nuevo para la relación con OID %u\n"
+"en la base de datos «%s» en el clúster antiguo: %s\n"
+
+#: info.c:287
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"bases de datos de origen:\n"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"bases de datos de destino:\n"
+
+#: info.c:604
+#, c-format
+msgid "Database: %s\n"
+msgstr "Base de datos: %s\n"
+
+#: info.c:606
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:617
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:100
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: no puede ejecutarse como root\n"
+
+#: option.c:167
+#, c-format
+msgid "invalid old port number\n"
+msgstr "número de puerto antiguo no válido\n"
+
+#: option.c:172
+#, c-format
+msgid "invalid new port number\n"
+msgstr "número de puerto nuevo no válido\n"
+
+#: option.c:198
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Pruebe «%s --help» para mayor información.\n"
+
+#: option.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)\n"
+
+#: option.c:208
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Ejecutando en modo verboso\n"
+
+#: option.c:226
+msgid "old cluster binaries reside"
+msgstr "residen los binarios del clúster antiguo"
+
+#: option.c:228
+msgid "new cluster binaries reside"
+msgstr "residen los binarios del clúster nuevo"
+
+#: option.c:230
+msgid "old cluster data resides"
+msgstr "residen los datos del clúster antiguo"
+
+#: option.c:232
+msgid "new cluster data resides"
+msgstr "residen los datos del clúster nuevo"
+
+#: option.c:234
+msgid "sockets will be created"
+msgstr "se crearán los sockets"
+
+#: option.c:251 option.c:350
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "no se pudo identificar el directorio actual\n"
+
+#: option.c:254
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr ""
+"no se puede ejecutar pg_upgrade desde dentro del directorio de datos\n"
+"del clúster nuevo en Windows\n"
+
+#: option.c:263
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr "pg_upgrade actualiza un clúster PostgreSQL a una versión «mayor» diferente.\n"
+
+#: option.c:264
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: option.c:265
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [OPCIÓN]...\n"
+"\n"
+
+#: option.c:266
+#, c-format
+msgid "Options:\n"
+msgstr "Opciones:\n"
+
+#: option.c:267
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR directorio de ejecutables del clúster antiguo\n"
+
+#: option.c:268
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR directorio de ejecutables del clúster nuevo\n"
+" (por omisión el mismo directorio que pg_upgrade)\n"
+
+#: option.c:270
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check sólo verificar clústers, no cambiar datos\n"
+
+#: option.c:271
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR directorio de datos del clúster antiguo\n"
+
+#: option.c:272
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR directorio de datos del clúster nuevo\n"
+
+#: option.c:273
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM máximo de procesos paralelos para restaurar\n"
+
+#: option.c:274
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link enlazar (link) archivos en vez de copiarlos\n"
+
+#: option.c:275
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n"
+
+#: option.c:276
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPCIONES opciones a pasar al servidor antiguo\n"
+
+#: option.c:277
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPCIONES opciones a pasar al servidor nuevo\n"
+
+#: option.c:278
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PUERTO número de puerto del clúster antiguo (def. %d)\n"
+
+#: option.c:279
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PUERTO número de puerto del clúster nuevo (def. %d)\n"
+
+#: option.c:280
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain preservar archivos SQL y logs en caso de éxito\n"
+
+#: option.c:281
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR directorio de sockets a usar (omisión: dir. actual)\n"
+
+#: option.c:282
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NOMBRE superusuario del clúster (def. «%s»)\n"
+
+#: option.c:283
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose activar registro interno verboso\n"
+
+#: option.c:284
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: option.c:285
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone clonar los archivos en vez de copiarlos\n"
+
+#: option.c:286
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: option.c:287
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Antes de ejecutar pg_upgrade, debe:\n"
+" crear el nuevo clúster de la base de datos (usando la nueva versión de initdb)\n"
+" apagar el postmaster que atiende al clúster antiguo\n"
+" apagar el postmaster que atiende al clúster nuevo\n"
+
+#: option.c:292
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Cuando ejecute pg_ugpade, debe proveer la siguiente información:\n"
+" el directorio de datos del clúster antiguo (-d DATADIR)\n"
+" el directorio de datos del clúster nuevo (-D DATADIR)\n"
+" el directorio «bin» para la versión antigua (-b BINDIR)\n"
+" el directorio «bin» para la versión nueva (-B BINDIR)\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Por ejemplo:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"o\n"
+
+#: option.c:303
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=clusterAntiguo/data\n"
+" $ export PGDATANEW=clusterNuevo/data\n"
+" $ export PGBINOLD=clusterAntiguo/bin\n"
+" $ export PGBINNEW=clusterNuevo/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=clusterAntiguo/data\n"
+" C:\\> set PGDATANEW=clusterNuevo/data\n"
+" C:\\> set PGBINOLD=clusterAntiguo/bin\n"
+" C:\\> set PGBINNEW=clusterNuevo/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: option.c:316
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: option.c:356
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"Debe identificar el directorio donde %s.\n"
+"Por favor use la opción %s o la variable de ambiente %s.\n"
+
+#: option.c:408
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Buscando el directorio de datos real para el clúster de origen"
+
+#: option.c:410
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Buscando el directorio de datos real para el clúster de destino"
+
+#: option.c:422
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "no se pudo obtener el directorio de datos usando %s: %s\n"
+
+#: option.c:473
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "no se pudo leer la línea %d del archivo «%s»: %s\n"
+
+#: option.c:490
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "número de port entregado por el usuario %hu corregido a %hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "no se pudo crear el proceso hijo: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "no se pudo crear el thread: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "%s() falló: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "el proceso hijo terminó anormalmente: estado %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "el thread terminó anormalmente: %s\n"
+
+#: pg_upgrade.c:102
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "no se pudo obtener los permisos del directorio «%s»: %s\n"
+
+#: pg_upgrade.c:134
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Llevando a cabo el Upgrade\n"
+"--------------------------\n"
+
+#: pg_upgrade.c:177
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Seteando siguiente OID para el nuevo clúster"
+
+#: pg_upgrade.c:186
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Sincronizando directorio de datos a disco"
+
+#: pg_upgrade.c:198
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Actualización Completa\n"
+"----------------------\n"
+
+#: pg_upgrade.c:231 pg_upgrade.c:244 pg_upgrade.c:251 pg_upgrade.c:258
+#: pg_upgrade.c:276 pg_upgrade.c:287
+#, c-format
+msgid "directory path for new cluster is too long\n"
+msgstr "nombre de directorio para el nuevo clúster es demasiado largo\n"
+
+#: pg_upgrade.c:265 pg_upgrade.c:267 pg_upgrade.c:269 pg_upgrade.c:271
+#, c-format
+msgid "could not create directory \"%s\": %m\n"
+msgstr "no se pudo crear el directorio «%s»: %m\n"
+
+#: pg_upgrade.c:320
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: no se pudo encontrar el ejecutable propio\n"
+
+#: pg_upgrade.c:346
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Parece haber un postmaster sirviendo el clúster antiguo.\n"
+"Por favor detenga ese postmaster e inténtelo nuevamente.\n"
+
+#: pg_upgrade.c:359
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Parece haber un postmaster sirviendo el clúster nuevo.\n"
+"Por favor detenga ese postmaster e inténtelo nuevamente.\n"
+
+#: pg_upgrade.c:373
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analizando todas las filas en el clúster nuevo"
+
+#: pg_upgrade.c:386
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Congelando todas las filas en el nuevo clúster"
+
+#: pg_upgrade.c:406
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Restaurando objetos globales en el nuevo clúster"
+
+#: pg_upgrade.c:422
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Restaurando esquemas de bases de datos en el clúster nuevo"
+
+#: pg_upgrade.c:528
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Eliminando archivos del nuevo %s"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "no se pudo eliminar directorio «%s»\n"
+
+#: pg_upgrade.c:551
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Copiando el %s antiguo al nuevo servidor"
+
+#: pg_upgrade.c:577
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Estableciendo XID más antiguo para el nuevo clúster"
+
+#: pg_upgrade.c:585
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Seteando el ID de transacción y «época» siguientes en el nuevo clúster"
+
+#: pg_upgrade.c:615
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Seteando el multixact ID y offset siguientes en el nuevo clúster"
+
+#: pg_upgrade.c:639
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Seteando el multixact ID más antiguo en el nuevo clúster"
+
+#: pg_upgrade.c:659
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Reseteando los archivos de WAL"
+
+#: pg_upgrade.c:702
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Seteando contadores frozenxid y minmxid en el clúster nuevo"
+
+#: pg_upgrade.c:704
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Seteando contador minmxid en el clúster nuevo"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Clonando archivos de relaciones de usuario"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Copiando archivos de relaciones de usuario"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Enlazando archivos de relaciones de usuario"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "la base de datos «%s» no se encontró en el clúster nuevo\n"
+
+#: relfilenode.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "error mientras se comprobaba la existencia del archivo «%s.%s» («%s» a «%s»); %s\n"
+
+#: relfilenode.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "reescribiendo «%s» a «%s»\n"
+
+#: relfilenode.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "clonando «%s» a «%s»\n"
+
+#: relfilenode.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "copiando «%s» a «%s»\n"
+
+#: relfilenode.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "enlazando «%s» a «%s»\n"
+
+#: server.c:39 server.c:143 util.c:220 util.c:250
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Falló, saliendo\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s\n"
+msgstr "ejecutando: %s\n"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"Orden SQL falló\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "no se pudo abrir el archivo de versión «%s»: %m\n"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "no se pudo interpretar el archivo de versión «%s»\n"
+
+#: server.c:291
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:295
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"no se pudo conectar al postmaster de origen iniciado con la orden:\n"
+"%s\n"
+
+#: server.c:299
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"no se pudo conectar al postmaster de destino iniciado con la orden:\n"
+"%s\n"
+
+#: server.c:313
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl no pudo iniciar el servidor de origen, o la conexión falló\n"
+
+#: server.c:315
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl no pudo iniciar el servidor de destino, o la conexión falló\n"
+
+#: server.c:360
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: server.c:373
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "la variable de ambiente libpq %s tiene un valor de servidor no-local: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"No se puede actualizar desde el mismo número de versión del catálogo\n"
+"cuando se están usando tablespaces.\n"
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "el directorio de tablespace «%s» no existe\n"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "no se pudo hace stat al directorio de tablespace «%s»: %s\n"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "la ruta de tablespace «%s» no es un directorio\n"
+
+#: util.c:52 util.c:55 util.c:127 util.c:160
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:95
+#, c-format
+msgid "could not access directory \"%s\": %m\n"
+msgstr "no se pudo acceder al directorio «%s»: %m\n"
+
+#: util.c:158
+#, c-format
+msgid "%-*s\n"
+msgstr "%-*s\n"
+
+#: util.c:259
+#, c-format
+msgid "ok"
+msgstr "éxito"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Verificando datos de usuario de tipo «line» incompatible"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene el tipo de dato «line» en tablas de usuario. Este\n"
+"tipo de dato cambió su formato interno y de entrada/salida entre las\n"
+"versiones de sus clústers antiguo y nuevo, por lo que este clúster no puede\n"
+"actualmente ser actualizado. Puede eliminar las columnas problemáticas y\n"
+"reiniciar la actualización. Un listado de las columnas problemáticas está\n"
+"en el archivo:\n"
+" %s\n"
+"\n"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Verificando columnas de usuario del tipo no válido «unknown»"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene el tipo «unknown» en tablas de usuario.\n"
+"Este tipo ya no es permitido en tablas,\n"
+"por lo que este clúster no puede ser actualizado. Puede\n"
+"eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Verificando índices hash"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "atención"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"Su instalación contiene índices hash. Estos índices tienen formato interno\n"
+"distinto entre su versión nueva y antigua, por lo que deben ser reindexados\n"
+"con la orden REINDEX. Después de la actualización, se le entregarán\n"
+"instrucciones de REINDEX.\n"
+"\n"
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"Su instalación contiene índices hash. Estos índices tienen formato interno\n"
+"distinto entre su versión nueva y antigua, por lo que deben ser reindexados\n"
+"con la orden REINDEX. El archivo\n"
+" %s\n"
+"cuando se ejecute en psql con el superusuario de la base de datos recreará\n"
+"los índices no válidos; hasta entonces, ninguno de esos índices será usado.\n"
+"\n"
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Verificando columnas de usuario del tipo «sql_identifier»"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Su instalación contiene el tipo de dato «sql_identifier» en tablas de usuario.\n"
+"El formato en disco para este tipo de dato ha cambiado, por lo que\n"
+"este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s\n"
+"\n"
+
+#: version.c:403
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Verificando actualizaciones para extensiones"
+
+#: version.c:455
+#, c-format
+msgid "notice"
+msgstr "aviso"
+
+#: version.c:456
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"Su instalación tiene extensiones que deben ser actualizadas\n"
+"con la sentencia ALTER EXTENSION. El archivo\n"
+" %s\n"
+"cuando se ejecute en psql con el superusuario de la base de datos\n"
+"actualizará estas extensiones.\n"
+"\n"
diff --git a/src/bin/pg_upgrade/po/fr.po b/src/bin/pg_upgrade/po/fr.po
new file mode 100644
index 0000000..ba9519c
--- /dev/null
+++ b/src/bin/pg_upgrade/po/fr.po
@@ -0,0 +1,2111 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2017-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2017-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-10-29 12:03+0000\n"
+"PO-Revision-Date: 2023-10-30 13:43+0100\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.4\n"
+
+#: check.c:75
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Exécution de tests de cohérence sur l'ancien serveur\n"
+"----------------------------------------------------\n"
+
+#: check.c:81
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Exécution de tests de cohérence\n"
+"-------------------------------\n"
+
+#: check.c:231
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Les instances sont compatibles*\n"
+
+#: check.c:239
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Si pg_upgrade échoue après cela, vous devez ré-exécuter initdb\n"
+"sur la nouvelle instance avant de continuer.\n"
+
+#: check.c:280
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"Les statistiques de l'optimiseur ne sont pas transférées par pg_upgrade.\n"
+"Une fois le nouveau serveur démarré, pensez à exécuter :\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:286
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"Exécuter ce script supprimera les fichiers de données de l'ancienne\n"
+"instance :\n"
+" %s\n"
+
+#: check.c:291
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"N'a pas pu créer un script pour supprimer les fichiers de données\n"
+"de l'ancienne instance parce que les tablespaces définis par l'utilisateur\n"
+"ou le répertoire de données de la nouvelle instance existent dans le répertoire\n"
+"de l'ancienne instance. Le contenu de l'ancienne instance doit être supprimé\n"
+"manuellement.\n"
+
+#: check.c:303
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Vérification des versions des instances"
+
+#: check.c:315
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later.\n"
+msgstr "Cet outil peut seulement mettre à jour les versions %s et ultérieures de PostgreSQL.\n"
+
+#: check.c:320
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Cet outil peut seulement mettre à jour vers la version %s de PostgreSQL.\n"
+
+#: check.c:329
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "Cet outil ne peut pas être utilisé pour mettre à jour vers des versions majeures plus anciennes de PostgreSQL.\n"
+
+#: check.c:334
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "Les répertoires des données de l'ancienne instance et des binaires sont de versions majeures différentes.\n"
+
+#: check.c:337
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "Les répertoires des données de la nouvelle instance et des binaires sont de versions majeures différentes.\n"
+
+#: check.c:352
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Lors de la vérification d'un serveur en production, l'ancien numéro de port doit être différent du nouveau.\n"
+
+#: check.c:367
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "les encodages de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#: check.c:372
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "les valeurs de lc_collate de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#: check.c:375
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "les valeurs de lc_ctype de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#: check.c:378
+#, c-format
+msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "les fournisseurs de locale pour la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#: check.c:385
+#, c-format
+msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "les valeurs de la locale ICU de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#: check.c:460
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "La nouvelle instance « %s » n'est pas vide : relation « %s.%s » trouvée\n"
+
+#: check.c:512
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Vérification des répertoires de tablespace de la nouvelle instance"
+
+#: check.c:523
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "le répertoire du tablespace de la nouvelle instance existe déjà : « %s »\n"
+
+#: check.c:556
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s\n"
+msgstr ""
+"\n"
+"AVERTISSEMENT : le nouveau répertoire de données ne doit pas être à l'intérieur de l'ancien répertoire de données, %s\n"
+
+#: check.c:580
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s\n"
+msgstr ""
+"\n"
+"AVERTISSEMENT : les emplacements des tablespaces utilisateurs ne doivent pas être à l'intérieur du répertoire de données, %s\n"
+
+#: check.c:590
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Création du script pour supprimer l'ancienne instance"
+
+#: check.c:593 check.c:768 check.c:888 check.c:987 check.c:1118 check.c:1197
+#: check.c:1500 file.c:338 function.c:165 option.c:465 version.c:116
+#: version.c:292 version.c:429
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#: check.c:644
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "n'a pas pu ajouter les droits d'exécution pour le fichier « %s » : %s\n"
+
+#: check.c:664
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Vérification que l'utilisateur de la base de données est l'utilisateur d'installation"
+
+#: check.c:680
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "l'utilisateur de la base de données « %s » n'est pas l'utilisateur d'installation\n"
+
+#: check.c:691
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "n'a pas pu déterminer le nombre d'utilisateurs\n"
+
+#: check.c:699
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "Seul l'utilisateur d'installation peut être défini dans la nouvelle instance.\n"
+
+#: check.c:729
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Vérification des paramètres de connexion de la base de données"
+
+#: check.c:755
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 ne doit pas autoriser les connexions, ie pg_database.datallowconn doit valoir false\n"
+
+#: check.c:785 check.c:910 check.c:1012 check.c:1138 check.c:1219 check.c:1278
+#: check.c:1339 check.c:1404 check.c:1523 function.c:187 version.c:192
+#: version.c:232 version.c:378
+#, c-format
+msgid "fatal\n"
+msgstr "fatal\n"
+
+#: check.c:786
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Tous les bases de données, en dehors de template0, doivent autoriser les connexions,\n"
+"autrement dit leur pg_database.datallowconn doit être à true. Votre installation contient\n"
+"des bases, hors template0, dont le pg_database.datallowconn est configuré à false.\n"
+"Autorisez les connections aux bases, hors template0, ou supprimez les bases qui\n"
+"n'autorisent pas les connexions. Une liste des bases problématiques se trouve dans\n"
+"le fichier :\n"
+" %s\n"
+"\n"
+
+#: check.c:811
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Vérification des transactions préparées"
+
+#: check.c:820
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "L'instance source contient des transactions préparées\n"
+
+#: check.c:822
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "L'instance cible contient des transactions préparées\n"
+
+#: check.c:848
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Vérification de contrib/isn avec une différence sur le passage des bigint"
+
+#: check.c:911
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient les fonctions « contrib/isn » qui se basent sur le\n"
+"type de données bigint. Vos ancienne et nouvelle instances passent les valeurs\n"
+"bigint différemment, donc cette instance ne peut pas être mise à jour\n"
+"actuellement. Vous pouvez mettre à jour manuellement vos bases de données\n"
+"qui utilisent « contrib/isn », les supprimer de l'ancienne instance,\n"
+"relancer la mise à jour, puis les restaurer. Une liste des fonctions\n"
+"problématiques est disponible\n"
+"dans le fichier :\n"
+" %s\n"
+"\n"
+
+#: check.c:934
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Vérification des opérateurs postfixes définis par les utilisateurs"
+
+#: check.c:1013
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient des opérateurs postfixes définis par des utilisateurs,\n"
+"qui ne sont plus supportés. Supprimez les opérateurs postfixes et remplacez-les\n"
+"avec des opérateurs préfixes ou des appels de fonctions.\n"
+"Une liste des opérateurs postfixes définis par les utilisateurs se trouve dans le fichier :\n"
+" %s\n"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Vérification des fonctions polymorphiques incompatibles"
+
+#: check.c:1139
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient des objets définis par les utilisateurs qui font référence à des fonctions polymorphiques internes avec des arguments de type « anyarray » ou « anyelement ». Ces objets doivent être supprimés avant de mettre à jour, puis ils pourront être restaurés, en les changeant pour faire référence aux nouvelles fonctions correspondantes avec des arguments de type « anycompatiblearray » et « anycompatible ». Une liste des objets problématiques se trouve dans le fichier\n"
+" %s\n"
+"\n"
+
+#: check.c:1164
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Vérification des tables WITH OIDS"
+
+#: check.c:1220
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient des tables déclarées avec WITH OIDS, ce qui n'est plus supporté.\n"
+"Pensez à supprimer la colonne oid en utilisant\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Une liste des tables ayant ce problème se trouve dans le fichier :\n"
+" %s\n"
+
+#: check.c:1248
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Vérification des types composites définis par le système dans les tables utilisateurs"
+
+#: check.c:1279
+#, c-format
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient des types composites définis par le système dans vos tables\n"
+"utilisateurs. Les OID de ces types ne sont pas stables entre différentes versions majeures\n"
+"de PostgreSQL, donc cette instance ne peut pas être mise à jour actuellement. Vous pouvez\n"
+"supprimer les colonnes problématiques, puis relancer la mise à jour. Vous trouverez\n"
+"une liste des colonnes problématiques dans le fichier :\n"
+" %s\n"
+"\n"
+
+#: check.c:1307
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Vérification des types de données reg* dans les tables utilisateurs"
+
+#: check.c:1340
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient un des types de données reg* dans vos tables\n"
+"utilisateurs. Ces types de données référencent des OID système qui ne sont\n"
+"pas préservés par pg_upgrade, donc cette instance ne peut pas être mise à\n"
+"jour actuellement. Vous pouvez supprimer les colonnes problématiques et relancer\n"
+"la mise à jour. Une liste des colonnes problématiques est disponible dans le\n"
+"fichier :\n"
+" %s\n"
+"\n"
+
+#: check.c:1364
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "Vérification du type de données « %s » supprimé dans les tables utilisateurs"
+
+#: check.c:1373
+#, c-format
+msgid "fatal"
+msgstr "fatal"
+
+#: check.c:1374
+#, c-format
+msgid ""
+"Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient le type de données « %s » dans les tables utilisateurs.\n"
+"Le type «%s » a été supprimé dans PostgreSQL version %s.,\n"
+"donc cette instance ne peut pas être mise à jour pour l'instant. Vous pouvez\n"
+"supprimer les colonnes problématiques ou les convertir en un autre type de données,\n"
+"et relancer la mise à jour. Vous trouverez une liste des colonnes problématiques dans\n"
+"le fichier :\n"
+" %s\n"
+"\n"
+
+#: check.c:1396
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Vérification des types de données « jsonb » incompatibles"
+
+#: check.c:1405
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient un type de données « jsonb » dans vos tables utilisateurs.\n"
+"Le format interne de « jsonb » a changé lors du développement de la version 9.4 beta, donc\n"
+"cette instance ne peut pas être mise à jour actuellement. Vous pouvez supprimer les\n"
+"colonnes problématiques et relancer la mise à jour. Une liste des colonnes problématiques\n"
+"est disponible dans le fichier :\n"
+" %s\n"
+"\n"
+
+#: check.c:1427
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Vérification des rôles commençant avec « pg_ »"
+
+#: check.c:1437
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "L'instance source contient des rôles commençant avec « pg_ »\n"
+
+#: check.c:1439
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "L'instance cible contient des rôles commençant avec « pg_ »\n"
+
+#: check.c:1460
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Vérification des conversions d'encodage définies par les utilisateurs"
+
+#: check.c:1524
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient des conversions définies par un utilisateur.\n"
+"Les paramètres des fonctions de conversion ont changé dans PostgreSQL version 14\n"
+"donc cette instance ne peut pas être mise à jour actuellement. Vous devez supprimer\n"
+"les conversions d'encodage de l'ancienne instance puis relancer la mise à jour.\n"
+"Une liste des conversions d'encodage définies par l'utilisateur se trouve dans le fichier :\n"
+" %s\n"
+"\n"
+
+#: check.c:1551
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "a échoué pour obtenir la locale courante\n"
+
+#: check.c:1560
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "a échoué pour obtenir le nom de la locale système « %s »\n"
+
+#: check.c:1566
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "a échoué pour restaurer l'ancienne locale « %s »\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr ""
+"n'a pas pu obtenir les données de contrôle en utilisant %s : %s\n"
+"\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d : problème sur l'état de l'instance de la base de données\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "L'instance source a été arrêté alors qu'elle était en mode restauration. Pour mettre à jour, utilisez « rsync » comme documenté ou arrêtez-la en tant que serveur primaire.\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "L'instance cible a été arrêté alors qu'elle était en mode restauration. Pour mettre à jour, utilisez « rsync » comme documenté ou arrêtez-la en tant que serveur primaire.\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "L'instance source n'a pas été arrêtée proprement.\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "L'instance cible n'a pas été arrêtée proprement.\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "Il manque certaines informations d'état requises sur l'instance source :\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "Il manque certaines informations d'état requises sur l'instance cible :\n"
+
+#: controldata.c:209 dump.c:50 pg_upgrade.c:440 pg_upgrade.c:477
+#: relfilenode.c:231 server.c:34
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d : problème avec pg_resetwal\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d : problème de récupération des controldata\n"
+
+#: controldata.c:571
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "Il manque certaines informations de contrôle requises sur l'instance source :\n"
+
+#: controldata.c:574
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "Il manque certaines informations de contrôle requises sur l'instance cible :\n"
+
+#: controldata.c:577
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " XID du prochain checkpoint\n"
+
+#: controldata.c:580
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " prochain OID du dernier checkpoint\n"
+
+#: controldata.c:583
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " prochain MultiXactId du dernier checkpoint\n"
+
+#: controldata.c:587
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " plus ancien MultiXactId du dernier checkpoint\n"
+
+#: controldata.c:590
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " oldestXID du dernier checkpoint\n"
+
+#: controldata.c:593
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " prochain MultiXactOffset du dernier checkpoint\n"
+
+#: controldata.c:596
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " premier segment WAL après réinitialisation\n"
+
+#: controldata.c:599
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " méthode de passage de arguments float8\n"
+
+#: controldata.c:602
+#, c-format
+msgid " maximum alignment\n"
+msgstr " alignement maximale\n"
+
+#: controldata.c:605
+#, c-format
+msgid " block size\n"
+msgstr " taille de bloc\n"
+
+#: controldata.c:608
+#, c-format
+msgid " large relation segment size\n"
+msgstr " taille de segment des relations\n"
+
+#: controldata.c:611
+#, c-format
+msgid " WAL block size\n"
+msgstr " taille de bloc d'un WAL\n"
+
+#: controldata.c:614
+#, c-format
+msgid " WAL segment size\n"
+msgstr " taille d'un segment WAL\n"
+
+#: controldata.c:617
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " longueur maximum d'un identifiant\n"
+
+#: controldata.c:620
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " nombre maximum de colonnes indexées\n"
+
+#: controldata.c:623
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " taille maximale d'un morceau de TOAST\n"
+
+#: controldata.c:627
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " taille d'un morceau Large-Object\n"
+
+#: controldata.c:630
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " les dates/heures sont-ils des integers?\n"
+
+#: controldata.c:634
+#, c-format
+msgid " data checksum version\n"
+msgstr " version des sommes de contrôle des données\n"
+
+#: controldata.c:636
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "Ne peut pas continuer sans les informations de contrôle requises, en arrêt\n"
+
+#: controldata.c:651
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"les alignements sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+"Il est probable qu'une installation soit en 32 bits et l'autre en 64 bits.\n"
+
+#: controldata.c:655
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "les tailles de bloc sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:658
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "les tailles maximales de segment de relation sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:661
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "les tailles de bloc des WAL sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:664
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "les tailles de segment de WAL sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:667
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "les longueurs maximales des identifiants sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:670
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "les nombres maximums de colonnes indexées sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:673
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "les tailles maximales de morceaux des TOAST sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "les tailles des morceaux de Large Objects sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "les types de stockage date/heure ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:694
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "l'ancienne instance n'utilise pas les sommes de contrôle alors que la nouvelle les utilise\n"
+
+#: controldata.c:697
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "l'ancienne instance utilise les sommes de contrôle alors que la nouvelle ne les utilise pas\n"
+
+#: controldata.c:699
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "les versions des sommes de contrôle ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+
+#: controldata.c:710
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Ajout du suffixe « .old » à l'ancien global/pg_control"
+
+#: controldata.c:715
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "Incapable de renommer %s à %s.\n"
+
+#: controldata.c:718
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Si vous voulez démarrer l'ancienne instance, vous devez supprimer le suffixe « .old » du fichier %s/global/pg_control.old.\n"
+"\n"
+"Comme le mode lien était utilisé, l'ancienne instance ne peut pas être démarré proprement une fois que la nouvelle instance a été démarrée.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Création de la sauvegarde des objets globaux"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Création de la sauvegarde des schémas des bases"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "n'a pas pu obtenir la version de pg_ctl en utilisant %s : %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "n'a pas pu obtenir la version de pg_ctl à partir de %s\n"
+
+#: exec.c:108 exec.c:112
+#, c-format
+msgid "command too long\n"
+msgstr "commande trop longue\n"
+
+#: exec.c:114 util.c:37 util.c:310
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:153 pg_upgrade.c:279
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m\n"
+
+#: exec.c:182
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*échec*"
+
+#: exec.c:185
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "Il y a eu des problèmes lors de l'exécution de « %s »\n"
+
+#: exec.c:188
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr "Consultez les dernières lignes de « %s » ou « %s » pour trouver la cause probable de l'échec.\n"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr "Consultez les dernières lignes de « %s » pour trouver la cause probable de l'échec.\n"
+
+#: exec.c:208 pg_upgrade.c:289
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "n'a pas pu écrire dans le fichier de traces « %s »\n"
+
+#: exec.c:234
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %s\n"
+
+#: exec.c:261
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Vous devez avoir les droits de lecture et d'écriture dans le répertoire actuel.\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "échec de la vérification de « %s » : %s\n"
+
+#: exec.c:317 exec.c:383
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "« %s » n'est pas un répertoire\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "échec de la vérification de « %s » : pas un fichier régulier\n"
+
+#: exec.c:436
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "échec de la vérification de « %s » : ne peut pas exécuter (droit refusé)\n"
+
+#: exec.c:442
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "échec de la vérification de « %s » : ne peut pas exécuter\n"
+
+#: exec.c:452
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr ""
+"échec de la vérification de « %s » : version incorrect : « %s » trouvée, « %s » attendue\n"
+"\n"
+
+#: file.c:43 file.c:63
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "erreur lors du clonage de la relation « %s.%s » (« %s » à « %s ») : %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "erreur lors du clonage de la relation « %s.%s » : n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "erreur lors du clonage de la relation « %s.%s » : n'a pas pu créer le fichier « %s » : %s\n"
+
+#: file.c:89 file.c:192
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#: file.c:94 file.c:201
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu créer le fichier « %s » : %s\n"
+
+#: file.c:108 file.c:225
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu lire le fichier « %s » : %s\n"
+
+#: file.c:120 file.c:303
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu écrire le fichier « %s » : %s\n"
+
+#: file.c:134
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "erreur lors de la copie de la relation « %s.%s » (« %s » à « %s ») : %s\n"
+
+#: file.c:153
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "erreur lors de la création du lien pour la relation « %s.%s » (« %s » à « %s ») : %s\n"
+
+#: file.c:196
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu tester le fichier « %s » : %s\n"
+
+#: file.c:228
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "erreur lors de la copie de la relation « %s.%s » : page partielle trouvée dans le fichier « %s »\n"
+
+#: file.c:330 file.c:347
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "n'a pas pu cloner le fichier entre l'ancien et le nouveau répertoires : %s\n"
+
+#: file.c:343
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "n'a pas pu créer le fichier « %s » : %s\n"
+
+#: file.c:354
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "clonage de fichiers non supporté sur cette plateforme\n"
+
+#: file.c:371
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"n'a pas pu créer le lien physique entre l'ancien et le nouveau répertoires de données : %s\n"
+"Dans le mode lien, les ancien et nouveau répertoires de données doivent être sur le même système de fichiers.\n"
+
+#: function.c:129
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Vérification de la présence des bibliothèques requises"
+
+#: function.c:167
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "n'a pas pu charger la bibliothèque « %s » : %s"
+
+#: function.c:178
+#, c-format
+msgid "In database: %s\n"
+msgstr "Dans la base de données : %s\n"
+
+#: function.c:188
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation référence des bibliothèques chargeables, mais manquantes sur\n"
+"la nouvelle installation. Vous pouvez ajouter ces bibliothèques à la nouvelle\n"
+"installation ou supprimer les fonctions les utilisant dans l'ancienne installation.\n"
+"Une liste des biblioth_ques problématiques est disponible dans le fichier :\n"
+" %s\n"
+"\n"
+
+#: info.c:125
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "Les noms de relation pour l'OID %u dans la base de données « %s » ne correspondent pas : ancien nom « %s.%s », nouveau nom « %s.%s »\n"
+
+#: info.c:145
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "Échec de correspondance des anciennes et nouvelles tables dans la base de données « %s »\n"
+
+#: info.c:226
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " qui est un index sur \"%s.%s\""
+
+#: info.c:236
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " qui est un index sur l'OID %u"
+
+#: info.c:248
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " qui est la table TOAST pour « %s.%s »"
+
+#: info.c:256
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " qui est la table TOAST pour l'OID %u"
+
+#: info.c:260
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "Aucune correspondance trouvée dans l'ancienne instance pour la nouvelle relation d'OID %u dans la base de données « %s » : %s\n"
+
+#: info.c:263
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "Aucune correspondance trouvée dans la nouvelle instance pour la nouvelle relation d'OID %u dans la base de données « %s » : %s\n"
+
+#: info.c:287
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"bases de données sources :\n"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"bases de données cibles :\n"
+
+#: info.c:604
+#, c-format
+msgid "Database: %s\n"
+msgstr "Base de données : %s\n"
+
+#: info.c:606
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:617
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname : %s.%s : reloid : %u reltblspace : %s\n"
+
+#: option.c:100
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s : ne peut pas être exécuté en tant que root\n"
+
+#: option.c:167
+#, c-format
+msgid "invalid old port number\n"
+msgstr "ancien numéro de port invalide\n"
+
+#: option.c:172
+#, c-format
+msgid "invalid new port number\n"
+msgstr "nouveau numéro de port invalide\n"
+
+#: option.c:198
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#: option.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#: option.c:208
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Exécution en mode verbeux\n"
+
+#: option.c:226
+msgid "old cluster binaries reside"
+msgstr "les binaires de l'ancienne instance résident"
+
+#: option.c:228
+msgid "new cluster binaries reside"
+msgstr "les binaires de la nouvelle instance résident"
+
+#: option.c:230
+msgid "old cluster data resides"
+msgstr "les données de l'ancienne instance résident"
+
+#: option.c:232
+msgid "new cluster data resides"
+msgstr "les données de la nouvelle instance résident"
+
+#: option.c:234
+msgid "sockets will be created"
+msgstr "les sockets seront créés"
+
+#: option.c:251 option.c:350
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "n'a pas pu déterminer le répertoire courant\n"
+
+#: option.c:254
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "ne peut pas exécuter pg_upgrade depuis le répertoire de données de la nouvelle instance sur Windows\n"
+
+#: option.c:263
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade met à jour une instance PostgreSQL vers une version majeure\n"
+"différente.\n"
+
+#: option.c:264
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: option.c:265
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+
+#: option.c:266
+#, c-format
+msgid "Options:\n"
+msgstr "Options :\n"
+
+#: option.c:267
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr ""
+" -b, --old-bindir=RÉP_BIN répertoire des exécutables de l'ancienne\n"
+" instance\n"
+
+#: option.c:268
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=RÉP_BIN répertoire des exécutables de la nouvelle\n"
+" instance (par défaut, le même répertoire que\n"
+" pg_upgrade)\n"
+
+#: option.c:270
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr ""
+" -c, --check vérifie seulement les instances, pas de\n"
+" modifications\n"
+
+#: option.c:271
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=RÉP_DONNÉES répertoire des données de l'ancienne instance\n"
+
+#: option.c:272
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=RÉP_DONNÉES répertoire des données de la nouvelle instance\n"
+
+#: option.c:273
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr ""
+" -j, --jobs=NUM nombre de processus ou threads simultanés à\n"
+" utiliser\n"
+
+#: option.c:274
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr ""
+" -k, --link lie les fichiers au lieu de les copier vers la\n"
+" nouvelle instance\n"
+
+#: option.c:275
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --nosync n'attend pas que les modifications soient proprement\n"
+" écrites sur disque\n"
+
+#: option.c:276
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr ""
+" -o, --old-options=OPTIONS options à passer au serveur de l'ancienne\n"
+" instance\n"
+
+#: option.c:277
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr ""
+" -O, --new-options=OPTIONS options à passer au serveur de la nouvelle\n"
+" instance\n"
+
+#: option.c:278
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr ""
+" -p, --old-port=PORT numéro de port de l'ancienne instance (par\n"
+" défaut %d)\n"
+
+#: option.c:279
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr ""
+" -P, --new-port=PORT numéro de port de la nouvelle instance (par\n"
+" défaut %d)\n"
+
+#: option.c:280
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr ""
+" -r, --retain conserve les fichiers SQL et de traces en cas\n"
+" de succès\n"
+
+#: option.c:281
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr ""
+" -s, --socketdir=RÉP_SOCKET répertoire de la socket à utiliser (par défaut\n"
+" le répertoire courant)\n"
+
+#: option.c:282
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr ""
+" -U, --username=NOM super-utilisateur de l'instance (par défaut\n"
+" « %s »)\n"
+
+#: option.c:283
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose active des traces internes verbeuses\n"
+
+#: option.c:284
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version affiche la version, puis quitte\n"
+
+#: option.c:285
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr ""
+" --clone clone au lieu de copier les fichiers vers la\n"
+" nouvelle instance\n"
+
+#: option.c:286
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide, puis quitte\n"
+
+#: option.c:287
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Avant d'exécuter pg_upgrade, vous devez :\n"
+" créer une nouvelle instance (en utilisant la nouvelle version d'initdb)\n"
+" arrêter le postmaster de l'ancienne instance\n"
+" arrêter le postmaster de la nouvelle instance\n"
+"\n"
+
+#: option.c:292
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Quand vous exécutez pg_upgrade, vous devez fournir les informations suivantes :\n"
+" le répertoire de données pour l'ancienne instance (-d RÉP_DONNÉES)\n"
+" le répertoire de données pour la nouvelle instance (-D RÉP_DONNÉES)\n"
+" le répertoire « bin » pour l'ancienne version (-b RÉP_BIN)\n"
+" le répertoire « bin » pour la nouvelle version (-B RÉP_BIN)\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Par exemple :\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"ou\n"
+
+#: option.c:303
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: option.c:316
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: option.c:356
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"Vous devez identifier le répertoire où le %s.\n"
+"Merci d'utiliser l'option en ligne de commande %s ou la variable d'environnement %s.\n"
+
+#: option.c:408
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Recherche du vrai répertoire des données pour l'instance source"
+
+#: option.c:410
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Recherche du vrai répertoire des données pour l'instance cible"
+
+#: option.c:422
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "n'a pas pu obtenir le répertoire des données en utilisant %s : %s\n"
+
+#: option.c:473
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "n'a pas pu lire la ligne %d du fichier « %s » : %s\n"
+
+#: option.c:490
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "ancien numéro de port %hu fourni par l'utilisateur corrigé en %hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "n'a pas pu créer le processus de travail : %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "n'a pas pu créer le fil de travail: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "échec de %s() : %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "le processus fils a quitté anormalement : statut %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "le processus fils a quitté anormalement : %s\n"
+
+#: pg_upgrade.c:102
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "n'a pas pu lire les droits du répertoire « %s » : %s\n"
+
+#: pg_upgrade.c:134
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Réalisation de la mise à jour\n"
+"-----------------------------\n"
+
+#: pg_upgrade.c:177
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Configuration du prochain OID sur la nouvelle instance"
+
+#: pg_upgrade.c:186
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Synchronisation du répertoire des données sur disque"
+
+#: pg_upgrade.c:198
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Mise à jour terminée\n"
+"--------------------\n"
+
+#: pg_upgrade.c:231 pg_upgrade.c:244 pg_upgrade.c:251 pg_upgrade.c:258
+#: pg_upgrade.c:276 pg_upgrade.c:287
+#, c-format
+msgid "directory path for new cluster is too long\n"
+msgstr "le chemin du répertoire pour la nouvelle instance est trop long\n"
+
+#: pg_upgrade.c:265 pg_upgrade.c:267 pg_upgrade.c:269 pg_upgrade.c:271
+#, c-format
+msgid "could not create directory \"%s\": %m\n"
+msgstr "n'a pas pu créer le répertoire « %s » : %m\n"
+
+#: pg_upgrade.c:320
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s : n'a pas pu trouver l'exécutable du programme\n"
+
+#: pg_upgrade.c:346
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Il semble qu'un postmaster est démarré sur l'ancienne instance.\n"
+"Merci d'arrêter ce postmaster et d'essayer de nouveau.\n"
+
+#: pg_upgrade.c:359
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Il semble qu'un postmaster est démarré sur la nouvelle instance.\n"
+"Merci d'arrêter ce postmaster et d'essayer de nouveau.\n"
+
+#: pg_upgrade.c:373
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analyse de toutes les lignes dans la nouvelle instance"
+
+#: pg_upgrade.c:386
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Gel de toutes les lignes dans la nouvelle instance"
+
+#: pg_upgrade.c:406
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Restauration des objets globaux dans la nouvelle instance"
+
+#: pg_upgrade.c:422
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Restauration des schémas des bases de données dans la nouvelle instance"
+
+#: pg_upgrade.c:528
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Suppression des fichiers à partir du nouveau %s"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "n'a pas pu supprimer le répertoire « %s »\n"
+
+#: pg_upgrade.c:551
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Copie de l'ancien %s vers le nouveau serveur"
+
+#: pg_upgrade.c:577
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Configuration du plus ancien XID sur la nouvelle instance"
+
+#: pg_upgrade.c:585
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Configuration du prochain identifiant de transaction et de l'epoch pour la nouvelle instance"
+
+#: pg_upgrade.c:615
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Configuration du prochain MultiXactId et décalage pour la nouvelle instance"
+
+#: pg_upgrade.c:639
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Configuration du plus ancien identifiant multixact sur la nouvelle instance"
+
+#: pg_upgrade.c:659
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Réinitialisation des archives WAL"
+
+#: pg_upgrade.c:702
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Configuration des compteurs frozenxid et minmxid dans la nouvelle instance"
+
+#: pg_upgrade.c:704
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Configuration du compteur minmxid dans la nouvelle instance"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Clonage des fichiers des relations utilisateurs"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Copie des fichiers des relations utilisateurs"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Création des liens pour les fichiers des relations utilisateurs"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "ancienne base de données « %s » introuvable dans la nouvelle instance\n"
+
+#: relfilenode.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "erreur lors de la vérification de l'existence du fichier « %s.%s » (« %s » vers « %s ») : %s\n"
+
+#: relfilenode.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "réécriture de « %s » en « %s »\n"
+
+#: relfilenode.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "clonage de « %s » en « %s »\n"
+
+#: relfilenode.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "copie de « %s » en « %s »\n"
+
+#: relfilenode.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "lien de « %s » vers « %s »\n"
+
+#: server.c:39 server.c:143 util.c:220 util.c:250
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Échec, sortie\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s\n"
+msgstr "exécution : %s\n"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"La commande SQL a échoué\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "n'a pas pu ouvrir le fichier de version « %s » : %m\n"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "n'a pas pu analyser le fichier de version « %s »\n"
+
+#: server.c:291
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:295
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"n'a pas pu se connecter au postmaster source lancé avec la commande :\n"
+"%s\n"
+
+#: server.c:299
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"n'a pas pu se connecter au postmaster cible lancé avec la commande :\n"
+"%s\n"
+
+#: server.c:313
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl a échoué à démarrer le serveur source ou connexion échouée\n"
+
+#: server.c:315
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl a échoué à démarrer le serveur cible ou connexion échouée\n"
+
+#: server.c:360
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: server.c:373
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "la variable d'environnement libpq %s a une valeur serveur non locale : %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr "Ne peut pas mettre à jour vers ou à partir de la même version de catalogue système quand des tablespaces sont utilisés.\n"
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "le répertoire « %s » du tablespace n'existe pas\n"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "n'a pas pu tester le répertoire « %s » du tablespace : %s\n"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "le chemin « %s » du tablespace n'est pas un répertoire\n"
+
+#: util.c:52 util.c:55 util.c:127 util.c:160
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:95
+#, c-format
+msgid "could not access directory \"%s\": %m\n"
+msgstr "n'a pas pu accéder au répertoire « %s » : %m\n"
+
+#: util.c:158
+#, c-format
+msgid "%-*s\n"
+msgstr "%-*s\n"
+
+#: util.c:259
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Vérification des types de données line incompatibles"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient le type de données « line » dans vos tables utilisateurs.\n"
+"Ce type de données a changé de format interne et en entrée/sortie entre vos ancienne\n"
+"et nouvelle versions, donc cette instance ne peut pas être mise à jour\n"
+"actuellement. Vous pouvez supprimer les colonnes problématiques et relancer la mise à jour.\n"
+"Une liste des colonnes problématiques se trouve dans le fichier :\n"
+" %s\n"
+"\n"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Vérification des colonnes utilisateurs « unknown » invalides"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient le type de données « unknown » dans vos tables\n"
+"utilisateurs. Ce type de données n'est plus autorisé dans les tables, donc\n"
+"cette instance ne peut pas être mise à jour pour l'instant. Vous pouvez\n"
+"supprimer les colonnes problématiques, puis relancer la mise à jour. Vous trouverez\n"
+"une liste des colonnes problématiques dans le fichier :\n"
+" %s\n"
+"\n"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Vérification des index hash"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "attention"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"Votre installation contient des index hashs. Ces index ont des formats\n"
+"internes différents entre l'ancienne et la nouvelle instance, dont ils doivent\n"
+"être recréés avec la commande REINDEX. Après la mise à jour, les instructions\n"
+"REINDEX vous seront données.\n"
+"\n"
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"Votre installation contient des index hashs. Ces index ont des formats\n"
+"internes différents entre l'ancienne et la nouvelle instance, donc ils doivent\n"
+"être recréés avec la commande REINDEX. Le fichier :\n"
+" %s\n"
+"une fois exécuté par psql en tant que superutilisateur va recréer tous les\n"
+"index invalides. Avant cela, aucun de ces index ne sera utilisé.\n"
+"\n"
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Vérification des colonnes utilisateurs « sql_identifier » invalides"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Votre installation contient le type de données « sql_identifier » dans les tables\n"
+"utilisateurs. Le format sur disque pour ce type de données a changé,\n"
+"donc cette instance ne peut pas être mise à jour actuellement. Vous pouvez supprimer\n"
+"les colonnes problématiques, puis relancer la mise à jour.\n"
+"\n"
+"Une liste des colonnes problématiques se trouve dans le fichier :\n"
+" %s\n"
+"\n"
+
+#: version.c:403
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Vérification des mises à jour d'extension"
+
+#: version.c:455
+#, c-format
+msgid "notice"
+msgstr "notice"
+
+#: version.c:456
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "The old cluster has a \"plpython_call_handler\" function defined\n"
+#~ "in the \"public\" schema which is a duplicate of the one defined\n"
+#~ "in the \"pg_catalog\" schema. You can confirm this by executing\n"
+#~ "in psql:\n"
+#~ "\n"
+#~ " \\df *.plpython_call_handler\n"
+#~ "\n"
+#~ "The \"public\" schema version of this function was created by a\n"
+#~ "pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+#~ "to complete because it references a now-obsolete \"plpython\"\n"
+#~ "shared object file. You can remove the \"public\" schema version\n"
+#~ "of this function by running the following command:\n"
+#~ "\n"
+#~ " DROP FUNCTION public.plpython_call_handler()\n"
+#~ "\n"
+#~ "in each affected database:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "L'ancienne instance comprend une fonction « plpython_call_handler »\n"
+#~ "définie dans le schéma « public » qui est un duplicat de celle définie\n"
+#~ "dans le schéma « pg_catalog ». Vous pouvez confirmer cela en\n"
+#~ "exécutant dans psql :\n"
+#~ "\n"
+#~ " \\df *.plpython_call_handler\n"
+#~ "\n"
+#~ "La version de cette fonction dans le schéma « public » a été créée\n"
+#~ "par une installation de plpython antérieure à la version 8.1 et doit\n"
+#~ "être supprimée pour que pg_upgrade puisse termine parce qu'elle\n"
+#~ "référence un fichier objet partagé « plpython » maintenant obsolète.\n"
+#~ "Vous pouvez supprimer la version de cette fonction dans le schéma\n"
+#~ "« public » en exécutant la commande suivante :\n"
+#~ "\n"
+#~ " DROP FUNCTION public.plpython_call_handler()\n"
+#~ "\n"
+#~ "dans chaque base de données affectée :\n"
+#~ "\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Your installation contains large objects. The new database has an\n"
+#~ "additional large object permission table, so default permissions must be\n"
+#~ "defined for all large objects. The file\n"
+#~ " %s\n"
+#~ "when executed by psql by the database superuser will set the default\n"
+#~ "permissions.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Votre installation contient des Large Objects. La nouvelle base de données\n"
+#~ "a une table de droit supplémentaire pour les Large Objects, donc les droits\n"
+#~ "par défaut doivent être définies pour tous les Large Objects. Le fichier\n"
+#~ " %s\n"
+#~ "une fois exécuté par psql avec un superutilisateur définira les droits par\n"
+#~ "défaut.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Your installation contains large objects. The new database has an\n"
+#~ "additional large object permission table. After upgrading, you will be\n"
+#~ "given a command to populate the pg_largeobject_metadata table with\n"
+#~ "default permissions.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Votre installation contient des Large Objects. La nouvelle base de données a une table de droit supplémentaire sur les Large Objects.\n"
+#~ "Après la mise à jour, vous disposerez d'une commande pour peupler la table pg_largeobject_metadata avec les droits par défaut.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "connection to database failed: %s"
+#~ msgstr ""
+#~ "\n"
+#~ "échec de la connexion à la base de données : %s"
+
+#, c-format
+#~ msgid " "
+#~ msgstr " "
+
+#, c-format
+#~ msgid " %s\n"
+#~ msgstr " %s\n"
+
+#~ msgid ""
+#~ " --index-collation-versions-unknown\n"
+#~ " mark text indexes as needing to be rebuilt\n"
+#~ msgstr ""
+#~ " --index-collation-versions-unknown\n"
+#~ " marque les index de colonnes de type text comme nécessitant une reconstruction\n"
+
+#~ msgid "%s is not a directory\n"
+#~ msgstr "%s n'est pas un répertoire\n"
+
+#, c-format
+#~ msgid "%s.%s: %u to %u\n"
+#~ msgstr "%s.%s : %u vers %u\n"
+
+#~ msgid "----------------\n"
+#~ msgstr "----------------\n"
+
+#~ msgid "------------------\n"
+#~ msgstr "------------------\n"
+
+#~ msgid "-----------------------------\n"
+#~ msgstr "-----------------------------\n"
+
+#~ msgid "------------------------------------------------\n"
+#~ msgstr "------------------------------------------------\n"
+
+#, c-format
+#~ msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+#~ msgstr "Toutes les bases de données, autre que template0, doivent autoriser les connexions, ie pg_database.datallowconn doit valoir true\n"
+
+#~ msgid "Cannot open file %s: %m\n"
+#~ msgstr "Ne peut pas ouvrir le fichier %s : %m\n"
+
+#~ msgid "Cannot read line %d from %s: %m\n"
+#~ msgstr "Ne peut pas lire la ligne %d à partir de %s : %m\n"
+
+#, c-format
+#~ msgid "Checking for large objects"
+#~ msgstr "Vérification des Large Objects"
+
+#~ msgid "Creating script to analyze new cluster"
+#~ msgstr "Création d'un script pour analyser la nouvelle instance"
+
+#~ msgid ""
+#~ "Optimizer statistics and free space information are not transferred\n"
+#~ "by pg_upgrade so, once you start the new server, consider running:\n"
+#~ " %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Les statistiques de l'optimiseur et les informations sur l'espace libre\n"
+#~ "ne sont pas transférées par pg_upgrade, donc une fois le nouveau\n"
+#~ "serveur démarré, pensez à exécuter :\n"
+#~ " %s\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Remove the problem functions from the old cluster to continue.\n"
+#~ msgstr "Supprimez les fonctions problématiques de l'ancienne instance pour continuer.\n"
+
+#~ msgid ""
+#~ "This utility can only upgrade to PostgreSQL version 9.0 after 2010-01-11\n"
+#~ "because of backend API changes made during development.\n"
+#~ msgstr ""
+#~ "Cet outil peut seulement mettre à jour à partir de la version 9.0 de PostgreSQL (après le 11 janvier 2010)\n"
+#~ "à cause de changements dans l'API du moteur fait lors du développement.\n"
+
+#, c-format
+#~ msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+#~ msgstr "Lors de la vérification d'un serveur antérieur à la 9.1, vous devez spécifier le numéro de port de l'ancien serveur.\n"
+
+#~ msgid "cannot find current directory\n"
+#~ msgstr "ne peut pas trouver le répertoire courant\n"
+
+#~ msgid "cannot write to log file %s\n"
+#~ msgstr "ne peut pas écrire dans le fichier de traces %s\n"
+
+#~ msgid "check for \"%s\" failed: cannot read file (permission denied)\n"
+#~ msgstr "échec de la vérification de « %s » : ne peut pas lire le fichier (droit refusé)\n"
+
+#~ msgid "connection to database failed: %s"
+#~ msgstr "échec de la connexion à la base de données : %s"
+
+#~ msgid ""
+#~ "could not load library \"%s\":\n"
+#~ "%s\n"
+#~ msgstr ""
+#~ "n'a pas pu charger la biblothèque « %s »:\n"
+#~ "%s\n"
+
+#~ msgid "could not parse PG_VERSION file from %s\n"
+#~ msgstr "n'a pas pu analyser le fichier PG_VERSION à partir de %s\n"
+
+#, c-format
+#~ msgid "mappings for database \"%s\":\n"
+#~ msgstr "correspondances pour la base de données « %s » :\n"
+
+#~ msgid "waitpid() failed: %s\n"
+#~ msgstr "échec de waitpid() : %s\n"
diff --git a/src/bin/pg_upgrade/po/it.po b/src/bin/pg_upgrade/po/it.po
new file mode 100644
index 0000000..12da2d5
--- /dev/null
+++ b/src/bin/pg_upgrade/po/it.po
@@ -0,0 +1,1852 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:18+0000\n"
+"PO-Revision-Date: 2022-10-05 17:39+0200\n"
+"Last-Translator: Domenico Sgarbossa <sgarbossa.domenico@gmail.com>\n"
+"Language-Team: \n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.3\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Esecuzione di controlli di coerenza sul vecchio server live\n"
+"------------------------------------------------\n"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Esecuzione di controlli di coerenza\n"
+"-----------------------------\n"
+
+#: check.c:218
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*I cluster sono compatibili*\n"
+
+#: check.c:226
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Se pg_upgrade fallisce dopo questo punto, devi re-initdb il file\n"
+"nuovo cluster prima di continuare.\n"
+
+#: check.c:267
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"Le statistiche dell'ottimizzatore non vengono trasferite da pg_upgrade.\n"
+"Una volta avviato il nuovo server, considera di eseguire:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:273
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"L'esecuzione di questo script eliminerà i file di dati del vecchio cluster:\n"
+" %s\n"
+
+#: check.c:278
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"Impossibile creare uno script per eliminare i file di dati del vecchio cluster\n"
+"perché i tablespace definiti dall'utente o la directory dei dati del nuovo cluster\n"
+"esiste nella vecchia directory del cluster. Il contenuto del vecchio cluster deve\n"
+"essere cancellato manualmente.\n"
+
+#: check.c:290
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Controllo delle versioni del cluster"
+
+#: check.c:302
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later.\n"
+msgstr "Questa utilità può eseguire l'aggiornamento solo da PostgreSQL versione %s e successive.\n"
+
+#: check.c:307
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Questa utilità può eseguire l'aggiornamento solo alla versione %s di PostgreSQL.\n"
+
+#: check.c:316
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "Questa utilità non può essere utilizzata per il downgrade alle versioni principali precedenti di PostgreSQL.\n"
+
+#: check.c:321
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "I vecchi dati del cluster e le directory binarie provengono da diverse versioni principali.\n"
+
+#: check.c:324
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "I nuovi dati del cluster e le directory binarie provengono da diverse versioni principali.\n"
+
+#: check.c:339
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Quando si controlla un server live, i numeri di porta vecchio e nuovo devono essere diversi.\n"
+
+#: check.c:354
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "le codifiche per il database \"%s\" non corrispondono: vecchio \"%s\", nuovo \"%s\"\n"
+
+#: check.c:359
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "i valori lc_collate per il database \"%s\" non corrispondono: vecchio \"%s\", nuovo \"%s\"\n"
+
+#: check.c:362
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "i valori lc_ctype per il database \"%s\" non corrispondono: vecchio \"%s\", nuovo \"%s\"\n"
+
+#: check.c:365
+#, c-format
+msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "i provider delle impostazioni locali per il database \"%s\" non corrispondono: vecchio \"%s\", nuovo \"%s\"\n"
+
+#: check.c:372
+#, c-format
+msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "I valori delle impostazioni locali dell'ICU per il database \"%s\" non corrispondono: vecchio \"%s\", nuovo \"%s\"\n"
+
+#: check.c:447
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "Il nuovo database del cluster \"%s\" non è vuoto: trovata la relazione \"%s.%s\"\n"
+
+#: check.c:499
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Verifica della presenza di nuove directory del tablespace del cluster"
+
+#: check.c:510
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "esiste già una nuova directory del tablespace del cluster: \"%s\"\n"
+
+#: check.c:543
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s\n"
+msgstr ""
+"\n"
+"ATTENZIONE: la nuova directory dei dati non dovrebbe trovarsi all'interno della vecchia directory dei dati, ovvero %s\n"
+
+#: check.c:567
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s\n"
+msgstr ""
+"\n"
+"ATTENZIONE: le posizioni dei tablespace definite dall'utente non devono trovarsi all'interno della directory dei dati, ovvero %s\n"
+
+#: check.c:577
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Creazione di uno script per eliminare il vecchio cluster"
+
+#: check.c:580 check.c:755 check.c:875 check.c:974 check.c:1105 check.c:1184
+#: check.c:1453 file.c:338 function.c:165 option.c:465 version.c:116
+#: version.c:292 version.c:429
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "apertura del file \"%s\" fallita: %s\n"
+
+#: check.c:631
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "impossibile aggiungere l'autorizzazione di esecuzione al file \"%s\": %s\n"
+
+#: check.c:651
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "L'utente del database di controllo è l'utente di installazione"
+
+#: check.c:667
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "l'utente del database \"%s\" non è l'utente di installazione\n"
+
+#: check.c:678
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "non è stato possibile determinare il numero di utenti\n"
+
+#: check.c:686
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "Solo l'utente di installazione può essere definito nel nuovo cluster.\n"
+
+#: check.c:716
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Verifica delle impostazioni di connessione al database"
+
+#: check.c:742
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 non deve consentire connessioni, ovvero il suo pg_database.datallowconn deve essere falso\n"
+
+#: check.c:772 check.c:897 check.c:999 check.c:1125 check.c:1206 check.c:1265
+#: check.c:1326 check.c:1357 check.c:1476 function.c:187 version.c:192
+#: version.c:232 version.c:378
+#, c-format
+msgid "fatal\n"
+msgstr "fatale\n"
+
+#: check.c:773
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Tutti i database non template0 devono consentire le connessioni, ovvero il loro\n"
+"pg_database.datallowconn deve essere vero. La tua installazione contiene\n"
+"database non template0 con il relativo pg_database.datallowconn impostato su\n"
+"falso. Considerare di consentire la connessione per tutti i database non template0\n"
+"oppure eliminare i database che non consentono connessioni. Una lista di\n"
+"database con il problema è nel file:\n"
+" %s\n"
+
+#: check.c:798
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Verifica delle transazioni preparate"
+
+#: check.c:807
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "Il cluster di origine contiene transazioni preparate\n"
+
+#: check.c:809
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "Il cluster di destinazione contiene transazioni preparate\n"
+
+#: check.c:835
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Verifica di contrib/isn con mancata corrispondenza di passaggio di bigint"
+
+#: check.c:898
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"La tua installazione contiene funzioni \"contrib/isn\" che si basano su\n"
+"tipo di dati bigint. I tuoi vecchi e nuovi cluster superano i valori bigint\n"
+"diversamente, quindi questo cluster non può essere attualmente aggiornato. Puoi\n"
+"eseguire il dump manuale dei database nel vecchio cluster che utilizza \"contrib/isn\"\n"
+"strutture, rilasciarli, eseguire l'aggiornamento e quindi ripristinarli. UN\n"
+"l'elenco delle funzioni problematiche è nel file:\n"
+" %s\n"
+
+#: check.c:921
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Controllo degli operatori suffisso definiti dall'utente"
+
+#: check.c:1000
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"L'installazione contiene operatori suffisso definiti dall'utente, che non lo sono\n"
+"supportato più. Prendi in considerazione l'eliminazione degli operatori suffisso e la sostituzione\n"
+"con operatori di prefisso o chiamate di funzione.\n"
+"Nel file è presente un elenco di operatori suffisso definiti dall'utente:\n"
+" %s\n"
+
+#: check.c:1024
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Verifica di funzioni polimorfiche incompatibili"
+
+#: check.c:1126
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"L'installazione contiene oggetti definiti dall'utente che fanno riferimento a internal\n"
+"funzioni polimorfiche con argomenti di tipo \"anyarray\" o \"qualsiasielemento\".\n"
+"Questi oggetti definiti dall'utente devono essere eliminati prima dell'aggiornamento e del ripristino\n"
+"successivamente, modificandoli per riferirsi alle nuove funzioni corrispondenti con\n"
+"argomenti di tipo \"anycompatiblearray\" e \"anycompatible\".\n"
+"Un elenco degli oggetti problematici è nel file:\n"
+" %s\n"
+
+#: check.c:1151
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Controllo delle tabelle CON OID"
+
+#: check.c:1207
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"L'installazione contiene tabelle dichiarate WITH OIDS, che non lo è\n"
+"supportato più. Prendi in considerazione la rimozione della colonna oid usando\n"
+" ALTER TAVOLA ... IMPOSTATA SENZA OIDI;\n"
+"Un elenco di tabelle con il problema è nel file:\n"
+" %s\n"
+
+#: check.c:1235
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Verifica dei tipi compositi definiti dal sistema nelle tabelle utente"
+
+#: check.c:1266
+#, c-format
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"L'installazione contiene tipi compositi definiti dal sistema nelle tabelle utente.\n"
+"Questi tipi di OID non sono stabili tra le versioni di PostgreSQL,\n"
+"quindi questo cluster non può essere attualmente aggiornato. Puoi\n"
+"eliminare le colonne del problema e riavviare l'aggiornamento.\n"
+"Un elenco delle colonne del problema è nel file:\n"
+" %s\n"
+
+#: check.c:1294
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Verifica dei tipi di dati reg* nelle tabelle utente"
+
+#: check.c:1327
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"L'installazione contiene uno dei tipi di dati reg* nelle tabelle utente.\n"
+"Questi tipi di dati fanno riferimento a OID di sistema che non vengono conservati da\n"
+"pg_upgrade, quindi questo cluster non può essere attualmente aggiornato. Puoi\n"
+"eliminare le colonne del problema e riavviare l'aggiornamento.\n"
+"Un elenco delle colonne del problema è nel file:\n"
+" %s\n"
+
+#: check.c:1349
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Checking for incompatible \"jsonb\" data type"
+
+#: check.c:1358
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"L'installazione contiene il tipo di dati \"jsonb\" nelle tabelle utente.\n"
+"Il formato interno di \"jsonb\" è cambiato durante la versione beta 9.4, quindi questo\n"
+"al momento non è possibile aggiornare il cluster. Puoi\n"
+"eliminare le colonne del problema e riavviare l'aggiornamento.\n"
+"Un elenco delle colonne del problema è nel file:\n"
+" %s\n"
+
+#: check.c:1380
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Verifica dei ruoli che iniziano con \"pg_\""
+
+#: check.c:1390
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "Il cluster di origine contiene ruoli che iniziano con \"pg_\"\n"
+
+#: check.c:1392
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "Il cluster di destinazione contiene ruoli che iniziano con \"pg_\"\n"
+
+#: check.c:1413
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Verifica delle conversioni di codifica definite dall'utente"
+
+#: check.c:1477
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"L'installazione contiene conversioni di codifica definite dall'utente.\n"
+"I parametri della funzione di conversione sono stati modificati in PostgreSQL versione 14\n"
+"quindi questo cluster non può essere attualmente aggiornato. Puoi rimuovere il\n"
+"codificare le conversioni nel vecchio cluster e riavviare l'aggiornamento.\n"
+"Nel file è presente un elenco di conversioni di codifica definite dall'utente:\n"
+" %s\n"
+"\n"
+"\n"
+
+#: check.c:1504
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "non è riuscito a ottenere la locale corrente\n"
+
+#: check.c:1513
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "impossibile ottenere il nome della locale di sistema per \"%s\"\n"
+
+#: check.c:1519
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "impossibile ripristinare la vecchia lingua \"%s\"\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "impossibile ottenere i dati di controllo utilizzando %s: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: problema con lo stato del cluster di database\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Il cluster di origine è stato arrestato mentre era in modalità di ripristino. Per eseguire l'aggiornamento, usa \"rsync\" come documentato o spegnilo come principale.\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Il cluster di destinazione è stato arrestato mentre era in modalità di ripristino. Per eseguire l'aggiornamento, usa \"rsync\" come documentato o spegnilo come principale.\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "Il cluster di origine non è stato chiuso correttamente.\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "Il cluster di destinazione non è stato arrestato correttamente.\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "Il cluster di origine non dispone di informazioni sullo stato del cluster:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "Il cluster di destinazione non dispone di informazioni sullo stato del cluster:\n"
+
+#: controldata.c:209 dump.c:50 pg_upgrade.c:440 pg_upgrade.c:477
+#: relfilenode.c:231 server.c:34
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal problema\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: problema di recupero dei dati di controllo\n"
+
+#: controldata.c:571
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "Il cluster di origine non dispone di alcune informazioni di controllo richieste:\n"
+
+#: controldata.c:574
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "Il cluster di destinazione non dispone di alcune informazioni di controllo richieste:\n"
+
+#: controldata.c:577
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " checkpoint successivo XID\n"
+
+#: controldata.c:580
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " ultimo checkpoint successivo OID\n"
+
+#: controldata.c:583
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " ultimo checkpoint successivo MultiXactId\n"
+
+#: controldata.c:587
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " ultimo checkpoint più vecchio MultiXactId\n"
+
+#: controldata.c:590
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " ultimo checkpoint più vecchioXID\n"
+
+#: controldata.c:593
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " ultimo checkpoint successivo MultiXactOffset\n"
+
+#: controldata.c:596
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " primo segmento WAL dopo il ripristino\n"
+
+#: controldata.c:599
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " metodo di passaggio degli argomenti float8\n"
+
+#: controldata.c:602
+#, c-format
+msgid " maximum alignment\n"
+msgstr "massimo allineamento\n"
+
+#: controldata.c:605
+#, c-format
+msgid " block size\n"
+msgstr " misura del blocco\n"
+
+#: controldata.c:608
+#, c-format
+msgid " large relation segment size\n"
+msgstr " grande dimensione del segmento di relazione\n"
+
+#: controldata.c:611
+#, c-format
+msgid " WAL block size\n"
+msgstr " Dimensione blocco WAL\n"
+
+#: controldata.c:614
+#, c-format
+msgid " WAL segment size\n"
+msgstr " Dimensione del segmento WAL\n"
+
+#: controldata.c:617
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " lunghezza massima dell'identificatore\n"
+
+#: controldata.c:620
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " numero massimo di colonne indicizzate\n"
+
+#: controldata.c:623
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " dimensione massima del pezzo TOAST\n"
+
+#: controldata.c:627
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " dimensione del blocco di oggetti di grandi dimensioni\n"
+
+#: controldata.c:630
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " le date/ora sono numeri interi?\n"
+
+#: controldata.c:634
+#, c-format
+msgid " data checksum version\n"
+msgstr " versione del checksum dei dati\n"
+
+#: controldata.c:636
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "Impossibile continuare senza le informazioni di controllo richieste, terminando\n"
+
+#: controldata.c:651
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"vecchi e nuovi allineamenti pg_controldata non sono validi o non corrispondono\n"
+"Probabilmente un cluster è un'installazione a 32 bit, l'altro a 64 bit\n"
+
+#: controldata.c:655
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "vecchie e nuove dimensioni dei blocchi pg_controldata non sono valide o non corrispondono\n"
+
+#: controldata.c:658
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "vecchio e nuovo pg_controldata le dimensioni massime dei segmenti di relazione non sono valide o non corrispondono\n"
+
+#: controldata.c:661
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "vecchio e nuovo pg_controldata le dimensioni del blocco WAL non sono valide o non corrispondono\n"
+
+#: controldata.c:664
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "vecchio e nuovo pg_controldata le dimensioni del segmento WAL non sono valide o non corrispondono\n"
+
+#: controldata.c:667
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "vecchio e nuovo pg_controldata le lunghezze massime degli identificatori non sono valide o non corrispondono\n"
+
+#: controldata.c:670
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "vecchie e nuove colonne indicizzate pg_controldata non sono valide o non corrispondono\n"
+
+#: controldata.c:673
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "vecchio e nuovo pg_controldata le dimensioni massime dei blocchi TOAST non sono valide o non corrispondono\n"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "vecchio e nuovo pg_controldata le dimensioni dei blocchi di oggetti di grandi dimensioni non sono valide o non corrispondono\n"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "vecchi e nuovi tipi di archiviazione data/ora pg_controldata non corrispondono\n"
+
+#: controldata.c:694
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "il vecchio cluster non usa i checksum dei dati ma quello nuovo lo fa\n"
+
+#: controldata.c:697
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "il vecchio cluster utilizza i checksum dei dati ma quello nuovo no\n"
+
+#: controldata.c:699
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "vecchie e nuove versioni di checksum del cluster pg_controldata non corrispondono\n"
+
+#: controldata.c:710
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Aggiunta del suffisso \".old\" al vecchio global/pg_control"
+
+#: controldata.c:715
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "Impossibile rinominare %s in %s.\n"
+
+#: controldata.c:718
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Se vuoi avviare il vecchio cluster, dovrai rimuoverlo\n"
+"il suffisso \".old\" da %s/global/pg_control.old.\n"
+"Poiché è stata utilizzata la modalità \"collegamento\", il vecchio cluster non può essere sicuro\n"
+"avviato una volta avviato il nuovo cluster.\n"
+"\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Creazione di dump di oggetti globali"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Creazione di dump di schemi di database"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "impossibile ottenere i dati sulla versione di pg_ctl utilizzando %s: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "impossibile ottenere l'output della versione di pg_ctl da %s\n"
+
+#: exec.c:108 exec.c:112
+#, c-format
+msgid "command too long\n"
+msgstr "comando troppo a lungo\n"
+
+#: exec.c:114 util.c:37 util.c:310
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:153 pg_upgrade.c:279
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "impossibile aprire il file di registro \"%s\": %m\n"
+
+#: exec.c:182
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*fallimento*"
+
+#: exec.c:185
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "Si sono verificati problemi durante l'esecuzione di \"%s\"\n"
+
+#: exec.c:188
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Consulta le ultime righe di \"%s\" o \"%s\" per\n"
+"la probabile causa del fallimento.\n"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Consulta le ultime righe di \"%s\" per\n"
+"la probabile causa del fallimento.\n"
+
+#: exec.c:208 pg_upgrade.c:289
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "impossibile scrivere nel file di registro \"%s\": %m\n"
+
+#: exec.c:234
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "apertura del file \"%s\" in lettura fallita: %s\n"
+
+#: exec.c:261
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "È necessario disporre dell'accesso in lettura e scrittura nella directory corrente.\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "verifica \"%s\" non riuscita: %s\n"
+
+#: exec.c:317 exec.c:383
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" non è una directory\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "verifica \"%s\" non riuscita: file non regolare\n"
+
+#: exec.c:436
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "verifica \"%s\" non riuscita: impossibile eseguire (autorizzazione negata)\n"
+
+#: exec.c:442
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "verifica \"%s\" non riuscita: impossibile eseguire\n"
+
+#: exec.c:452
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr "verifica \"%s\" non riuscita: versione errata: trovato \"%s\", previsto \"%s\"\n"
+
+#: file.c:43 file.c:63
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "errore durante la clonazione della relazione \"%s.%s\" (da \"%s\" a \"%s\"): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "errore durante la clonazione della relazione \"%s.%s\": impossibile aprire il file \"%s\": %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "errore durante la clonazione della relazione \"%s.%s\": impossibile creare il file \"%s\": %s\n"
+
+#: file.c:89 file.c:192
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "errore durante la copia della relazione \"%s.%s\": impossibile aprire il file \"%s\": %s\n"
+
+#: file.c:94 file.c:201
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "errore durante la copia della relazione \"%s.%s\": impossibile creare il file \"%s\": %s\n"
+
+#: file.c:108 file.c:225
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "errore durante la copia della relazione \"%s.%s\": impossibile leggere il file \"%s\": %s\n"
+
+#: file.c:120 file.c:303
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "errore durante la copia della relazione \"%s.%s\": impossibile scrivere il file \"%s\": %s\n"
+
+#: file.c:134
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "errore durante la copia della relazione \"%s.%s\" (\"%s\" in \"%s\"): %s\n"
+
+#: file.c:153
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "errore durante la creazione del collegamento per la relazione \"%s.%s\" (\"da %s\" a \"%s\"): %s\n"
+
+#: file.c:196
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "errore durante la copia della relazione \"%s.%s\": impossibile stat file \"%s\": %s\n"
+
+#: file.c:228
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "errore durante la copia della relazione \"%s.%s\": pagina parziale trovata nel file \"%s\"\n"
+
+#: file.c:330 file.c:347
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "impossibile clonare il file tra la vecchia e la nuova directory di dati: %s\n"
+
+#: file.c:343
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "impossibile creare il file \"%s\": %s\n"
+
+#: file.c:354
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "clonazione di file non supportata su questa piattaforma\n"
+
+#: file.c:371
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"impossibile creare un collegamento reale tra le directory di dati vecchie e nuove: %s\n"
+"In modalità collegamento, la vecchia e la nuova directory di dati devono trovarsi sullo stesso file system.\n"
+
+#: function.c:129
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Verifica della presenza delle librerie richieste"
+
+#: function.c:167
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "caricamento della libreria \"%s\" fallito: %s"
+
+#: function.c:178
+#, c-format
+msgid "In database: %s\n"
+msgstr "Nel database: %s\n"
+
+#: function.c:188
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"L'installazione fa riferimento a librerie caricabili che mancano dal file\n"
+"nuova installazione. È possibile aggiungere queste librerie alla nuova installazione,\n"
+"oppure rimuovere le funzioni che le utilizzano dalla vecchia installazione. Una lista di\n"
+"librerie di problemi è nel file:\n"
+" %s\n"
+"\n"
+
+#: info.c:125
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "I nomi delle relazioni per l'OID %u nel database \"%s\" non corrispondono: vecchio nome \"%s.%s\", nuovo nome \"%s.%s\"\n"
+
+#: info.c:145
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "Impossibile abbinare la vecchia e la nuova tabella nel database \"%s\"\n"
+
+#: info.c:226
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " che è un indice su \"%s.%s\""
+
+#: info.c:236
+#, c-format
+msgid " which is an index on OID %u"
+msgstr "che è un indice su OID %u"
+
+#: info.c:248
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr "che è la tabella TOAST per \"%s.%s\""
+
+#: info.c:256
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr "che è la tabella TOAST per OID %u"
+
+#: info.c:260
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+
+#: info.c:263
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "Nessuna corrispondenza trovata nel nuovo cluster per la vecchia relazione con OID %u nel database \"%s\": %s\n"
+
+#: info.c:287
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"database di origine:\n"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"database di destinazione:\n"
+
+#: info.c:605
+#, c-format
+msgid "Database: %s\n"
+msgstr "Database: %s\n"
+
+#: info.c:607
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:618
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:100
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: impossibile eseguire come root\n"
+
+#: option.c:167
+#, c-format
+msgid "invalid old port number\n"
+msgstr "numero di porta precedente non valido\n"
+
+#: option.c:172
+#, c-format
+msgid "invalid new port number\n"
+msgstr "nuovo numero di porta non valido\n"
+
+#: option.c:198
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
+
+#: option.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")\n"
+
+#: option.c:208
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Esecuzione in modalità dettagliata\n"
+
+#: option.c:226
+msgid "old cluster binaries reside"
+msgstr "risiedono i vecchi binari del cluster"
+
+#: option.c:228
+msgid "new cluster binaries reside"
+msgstr "risiedono nuovi file binari del cluster"
+
+#: option.c:230
+msgid "old cluster data resides"
+msgstr "risiedono i vecchi dati del cluster"
+
+#: option.c:232
+msgid "new cluster data resides"
+msgstr "risiedono nuovi dati del cluster"
+
+#: option.c:234
+msgid "sockets will be created"
+msgstr "verranno create le prese"
+
+#: option.c:251 option.c:350
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "non è stato possibile determinare la directory corrente\n"
+
+#: option.c:254
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "impossibile eseguire pg_upgrade dall'interno della nuova directory dei dati del cluster su Windows\n"
+
+#: option.c:263
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade aggiorna un cluster PostgreSQL a una versione principale diversa.\n"
+"\n"
+
+#: option.c:264
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: option.c:265
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [OPZIONE]...\n"
+"\n"
+
+#: option.c:266
+#, c-format
+msgid "Options:\n"
+msgstr "Opzioni:\n"
+
+#: option.c:267
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR vecchia directory eseguibile del cluster\n"
+
+#: option.c:268
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR nuova directory eseguibile del cluster (impostazione predefinita\n"
+" stessa directory di pg_upgrade)\n"
+
+#: option.c:270
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check controlla solo i cluster, non modifica i dati\n"
+
+#: option.c:271
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR vecchia directory dei dati del cluster\n"
+
+#: option.c:272
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR nuova directory dei dati del cluster\n"
+
+#: option.c:273
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM numero di processi o thread simultanei da utilizzare\n"
+
+#: option.c:274
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link link invece di copiare i file nel nuovo cluster\n"
+
+#: option.c:275
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync non attende che le modifiche vengano scritte in modo sicuro sul disco\n"
+
+#: option.c:276
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS vecchie opzioni del cluster da passare al server\n"
+
+#: option.c:277
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPZIONI nuove opzioni del cluster da passare al server\n"
+
+#: option.c:278
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT vecchio numero di porta del cluster (predefinito %d)\n"
+
+#: option.c:279
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT nuovo numero di porta del cluster (predefinito %d)\n"
+
+#: option.c:280
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain conserva i file SQL e di registro dopo l'esito positivo\n"
+
+#: option.c:281
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR socket DIR da usare (dir. corrente predefinita)\n"
+
+#: option.c:282
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME superutente del cluster (predefinito \"%s\")\n"
+
+#: option.c:283
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose abilita la registrazione interna dettagliata\n"
+
+#: option.c:284
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version visualizza le informazioni sulla versione, quindi esce\n"
+
+#: option.c:285
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone clona invece di copiare i file nel nuovo cluster\n"
+
+#: option.c:286
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto, quindi esci\n"
+
+#: option.c:287
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+" Prima di eseguire pg_upgrade devi:\n"
+" creare un nuovo cluster di database (usando la nuova versione di initdb)\n"
+" spegni il postmaster che serve il vecchio cluster\n"
+" spegnere il postmaster che serve il nuovo cluster\n"
+
+#: option.c:292
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Quando esegui pg_upgrade, devi fornire le seguenti informazioni:\n"
+" la directory dei dati per il vecchio cluster (-d DATADIR)\n"
+" la directory dei dati per il nuovo cluster (-D DATADIR)\n"
+" la directory \"bin\" per la vecchia versione (-b BINDIR)\n"
+" la directory \"bin\" per la nuova versione (-B BINDIR)\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Per esempio:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"o\n"
+
+#: option.c:303
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/dati\n"
+" $ export PGDATANEW=nuovoCluster/dati\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=nuovoCluster/bin\n"
+" $ pg_aggiornamento\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> imposta PGDATAOLD=oldCluster/data\n"
+" C:\\> imposta PGDATANEW=nuovoCluster/dati\n"
+" C:\\> imposta PGBINOLD=oldCluster/bin\n"
+" C:\\> imposta PGBINNEW=nuovoCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: option.c:316
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: option.c:356
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"Devi identificare la directory in cui %s.\n"
+"Utilizza l'opzione della riga di comando %s o la variabile di ambiente %s.\n"
+
+#: option.c:408
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Trovare la directory dei dati reali per il cluster di origine"
+
+#: option.c:410
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Trovare la directory dei dati reali per il cluster di destinazione"
+
+#: option.c:422
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "impossibile ottenere la directory dei dati utilizzando %s: %s\n"
+
+#: option.c:473
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "impossibile leggere la riga %d dal file \"%s\": %s\n"
+
+#: option.c:490
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "vecchio numero di porta fornito dall'utente %hu corretto in %hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "creazione del processo worker fallita: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "impossibile creare thread di lavoro: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "%s() fallito: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "processo figlio terminato in modo anomalo: stato %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "bambino lavoratore è uscito in modo anomalo: %s\n"
+
+#: pg_upgrade.c:102
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "impossibile leggere i permessi della directory \"%s\": %s\n"
+
+#: pg_upgrade.c:134
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Esecuzione dell'aggiornamento\n"
+"------------------\n"
+
+#: pg_upgrade.c:177
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Impostazione dell'OID successivo per il nuovo cluster"
+
+#: pg_upgrade.c:186
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Sincronizza la directory dei dati su disco"
+
+#: pg_upgrade.c:198
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Aggiornamento completato\n"
+"----------------\n"
+
+#: pg_upgrade.c:231 pg_upgrade.c:244 pg_upgrade.c:251 pg_upgrade.c:258
+#: pg_upgrade.c:276 pg_upgrade.c:287
+#, c-format
+msgid "directory path for new cluster is too long\n"
+msgstr "il percorso della directory per il nuovo cluster è troppo lungo\n"
+
+#: pg_upgrade.c:265 pg_upgrade.c:267 pg_upgrade.c:269 pg_upgrade.c:271
+#, c-format
+msgid "could not create directory \"%s\": %m\n"
+msgstr "impossibile creare la directory \"%s\": %m\n"
+
+#: pg_upgrade.c:320
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: il proprio programma eseguibile non è stato trovato\n"
+
+#: pg_upgrade.c:346
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Sembra che ci sia un postmaster che serve il vecchio cluster.\n"
+"Spegni il postmaster e riprova.\n"
+
+#: pg_upgrade.c:359
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Sembra che ci sia un postmaster che serve il nuovo cluster.\n"
+"Spegni il postmaster e riprova.\n"
+
+#: pg_upgrade.c:373
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analisi di tutte le righe nel nuovo cluster"
+
+#: pg_upgrade.c:386
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Blocco di tutte le righe nel nuovo cluster"
+
+#: pg_upgrade.c:406
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Ripristino di oggetti globali nel nuovo cluster"
+
+#: pg_upgrade.c:422
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Ripristino degli schemi di database nel nuovo cluster"
+
+#: pg_upgrade.c:528
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Eliminazione di file dal nuovo %s"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "impossibile eliminare la directory \"%s\"\n"
+
+#: pg_upgrade.c:551
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Copiando il vecchio %s sul nuovo server"
+
+#: pg_upgrade.c:577
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Impostazione dell'XID più vecchio per il nuovo cluster"
+
+#: pg_upgrade.c:585
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Impostazione dell'ID transazione e dell'epoca successivi per il nuovo cluster"
+
+#: pg_upgrade.c:615
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Impostazione dell'ID multixact successivo e dell'offset per il nuovo cluster"
+
+#: pg_upgrade.c:639
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Impostazione dell'ID multixact più vecchio nel nuovo cluster"
+
+#: pg_upgrade.c:659
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Ripristino archivi WAL"
+
+#: pg_upgrade.c:702
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Impostazione dei contatori frozenxid e minmxid nel nuovo cluster"
+
+#: pg_upgrade.c:704
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Impostazione del contatore minmxid nel nuovo cluster"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Clonazione dei file delle relazioni utente"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Copiare i file delle relazioni utente"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Collegamento dei file di relazione dell'utente"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "vecchio database \"%s\" non trovato nel nuovo cluster\n"
+
+#: relfilenode.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "errore durante il controllo dell'esistenza del file \"%s.%s\" (\"da %s\" a \"%s\"): %s\n"
+
+#: relfilenode.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "riscrivendo \"%s\" in \"%s\"\n"
+
+#: relfilenode.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "clonazione da \"%s\" a \"%s\"\n"
+
+#: relfilenode.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "copiando \"%s\" in \"%s\"\n"
+
+#: relfilenode.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "collegamento di \"%s\" a \"%s\"\n"
+
+#: server.c:39 server.c:143 util.c:220 util.c:250
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Errore, uscita\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s\n"
+msgstr "in esecuzione: %s\n"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"Comando SQL non riuscito\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "could not open version file \"%s\": %m\n"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "impossibile analizzare il file di versione \"%s\"\n"
+
+#: server.c:291
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:295
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"impossibile connettersi al postmaster di origine avviato con il comando:\n"
+"%s\n"
+
+#: server.c:299
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"impossibile connettersi al postmaster di destinazione avviato con il comando:\n"
+"%s\n"
+
+#: server.c:313
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl non è riuscito ad avviare il server di origine o la connessione non è riuscita\n"
+
+#: server.c:315
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl non è riuscito ad avviare il server di destinazione o la connessione non è riuscita\n"
+
+#: server.c:360
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: server.c:373
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "La variabile di ambiente libpq %s ha un valore del server non locale: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"Impossibile eseguire l'aggiornamento a/dalla stessa versione del catalogo di sistema quando\n"
+"utilizzando tablespace.\n"
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "la directory tablespace \"%s\" non esiste\n"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "impossibile stat directory tablespace \"%s\": %s\n"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "il percorso del tablespace \"%s\" non è una directory\n"
+
+#: util.c:52 util.c:55 util.c:127 util.c:160
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:95
+#, c-format
+msgid "could not access directory \"%s\": %m\n"
+msgstr "impossibile accedere alla directory \"%s\": %m\n"
+
+#: util.c:158
+#, c-format
+msgid "%-*s\n"
+msgstr "%-*s\n"
+
+#: util.c:259
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Controllo del tipo di dati \"linea\" incompatibile"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"L'installazione contiene il tipo di dati \"line\" nelle tabelle utente.\n"
+"Questo tipo di dati ha modificato il formato interno e di input/output\n"
+"tra la tua vecchia e la nuova versione quindi questo\n"
+"al momento non è possibile aggiornare il cluster. Puoi\n"
+"eliminare le colonne del problema e riavviare l'aggiornamento.\n"
+"Un elenco delle colonne del problema è nel file:\n"
+" %s\n"
+"\n"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Verifica di colonne utente \"sconosciute\" non valide"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"L'installazione contiene il tipo di dati \"sconosciuto\" nelle tabelle utente.\n"
+"Questo tipo di dati non è più consentito nelle tabelle, quindi questo\n"
+"al momento non è possibile aggiornare il cluster. Puoi\n"
+"eliminare le colonne del problema e riavviare l'aggiornamento.\n"
+"Un elenco delle colonne del problema è nel file:\n"
+" %s\n"
+"\n"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Controllo degli indici hash"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "warning"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"La tua installazione contiene indici hash. Questi indici sono diversi\n"
+"formati interni tra il vecchio e il nuovo cluster, quindi devono essere\n"
+"reindicizzato con il comando REINDEX. Dopo l'aggiornamento, ti verrà dato\n"
+"Istruzioni REINDEX.\n"
+"\n"
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"La tua installazione contiene indici hash. Questi indici sono diversi\n"
+"formati interni tra il vecchio e il nuovo cluster, quindi devono essere\n"
+"reindicizzato con il comando REINDEX. Il file\n"
+" %s\n"
+"quando eseguito da psql dal superutente del database ricreerà tutto non valido\n"
+"indici; fino ad allora, nessuno di questi indici verrà utilizzato.\n"
+"\n"
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Verifica di colonne utente \"sql_identifier\" non valide"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"L'installazione contiene il tipo di dati \"sql_identifier\" nelle tabelle utente.\n"
+"Il formato su disco per questo tipo di dati è cambiato, quindi questo\n"
+"al momento non è possibile aggiornare il cluster. Puoi\n"
+"eliminare le colonne del problema e riavviare l'aggiornamento.\n"
+"Un elenco delle colonne del problema è nel file:\n"
+" %s\n"
+"\n"
+
+#: version.c:403
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Verifica degli aggiornamenti delle estensioni"
+
+#: version.c:455
+#, c-format
+msgid "notice"
+msgstr "Avviso"
+
+#: version.c:456
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"L'installazione contiene estensioni che devono essere aggiornate\n"
+"con il comando ALTER EXTENSION. Il file\n"
+" %s\n"
+"quando eseguito da psql dal superutente del database si aggiornerà\n"
+"queste estensioni.\n"
+"\n"
diff --git a/src/bin/pg_upgrade/po/ja.po b/src/bin/pg_upgrade/po/ja.po
new file mode 100644
index 0000000..dd431c1
--- /dev/null
+++ b/src/bin/pg_upgrade/po/ja.po
@@ -0,0 +1,1896 @@
+# pg_upgrade.po
+# Japanese message translation file for pg_upgrade
+#
+# Copyright (C) 2011-2022 PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-26 10:20+0900\n"
+"PO-Revision-Date: 2023-09-26 11:35+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.13\n"
+"Plural-Forms: nplural=1; plural=0;\n"
+
+#: check.c:75
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"元の実行中サーバーの一貫性チェックを実行しています。\n"
+"--------------------------------------------------\n"
+
+#: check.c:81
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"整合性チェックを実行しています。\n"
+"-----------------------------\n"
+
+#: check.c:231
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"* クラスタは互換性があります *\n"
+
+#: check.c:239
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"この後pg_upgradeが失敗した場合は、続ける前に新しいクラスタを\n"
+"initdbで再作成する必要があります。\n"
+
+#: check.c:280
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"オプティマイザーの統計は、pg_upgrade では転送されません。そのため\n"
+"新サーバーを起動した後、以下を行うことを検討してください。\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:286
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"このスクリプトを実行すると、旧クラスタのデータファイル %sが削除されます:\n"
+"\n"
+
+#: check.c:291
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"ユーザー定義のテーブル空間もしくは新クラスタのデータディレクトリが\n"
+"旧クラスタのディレクトリ内に存在するため、旧クラスタのデータ\n"
+"ファイルを削除するためのスクリプトを作成できませんでした。 古い\n"
+"クラスタの内容は手動で削除する必要があります。\n"
+
+#: check.c:303
+#, c-format
+msgid "Checking cluster versions"
+msgstr "クラスタのバージョンを確認しています"
+
+#: check.c:315
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later.\n"
+msgstr "このユーティリティではPostgreSQLバージョン%s 以降のバージョンからのみアップグレードできます。\n"
+
+#: check.c:320
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "このユーティリティは、PostgreSQL バージョン %s にのみアップグレードできます。\n"
+
+#: check.c:329
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "このユーティリティは PostgreSQL の過去のメジャーバージョンにダウングレードする用途では使用できません。\n"
+
+#: check.c:334
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "旧クラスタのデータとバイナリのディレクトリは異なるメジャーバージョンのものです。\n"
+
+#: check.c:337
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "新クラスタのデータとバイナリのディレクトリは異なるメジャーバージョンのものです。\n"
+
+#: check.c:352
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "稼働中のサーバーをチェックする場合、新旧のポート番号が異なっている必要があります。\n"
+
+#: check.c:367
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "データベース\"%s\"のエンコーディングが一致しません: 旧 \"%s\"、新 \"%s\"\n"
+
+#: check.c:372
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "データベース\"%s\"の lc_collate 値が一致しません:旧 \"%s\"、新 \"%s\"\n"
+
+#: check.c:375
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "データベース\"%s\"の lc_ctype 値が一致しません:旧 \"%s\"、新 \"%s\"\n"
+
+#: check.c:378
+#, c-format
+msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "データベース\"%s\"のロケールプロバイダが一致しません:旧 \"%s\"、新 \"%s\"\n"
+
+#: check.c:385
+#, c-format
+msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "データベース\"%s\"のICUロケールが一致しません:旧 \"%s\"、新 \"%s\"\n"
+
+#: check.c:460
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "新クラスタのデータベース\"%s\"が空ではありません: リレーション\"%s.%s\"が見つかりました\n"
+
+#: check.c:512
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "新しいクラスタのテーブル空間ディレクトリを確認しています"
+
+#: check.c:523
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "新しいクラスタのテーブル空間ディレクトリはすでに存在します: \"%s\"\n"
+
+#: check.c:556
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s\n"
+msgstr ""
+"\n"
+"警告: 新データディレクトリが旧データディレクトリの中にあってはなりません、つまり %s\n"
+
+#: check.c:580
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s\n"
+msgstr ""
+"\n"
+"警告: ユーザー定義テーブル空間の場所がデータディレクトリ、つまり %s の中にあってはなりません。\n"
+
+#: check.c:590
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "旧クラスタを削除するスクリプトを作成しています"
+
+#: check.c:593 check.c:768 check.c:888 check.c:987 check.c:1118 check.c:1197
+#: check.c:1500 file.c:338 function.c:165 option.c:465 version.c:116
+#: version.c:292 version.c:429
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "ファイル \"%s\" をオープンできませんでした: %s\n"
+
+#: check.c:644
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "ファイル\"%s\"に実行権限を追加できませんでした: %s\n"
+
+#: check.c:664
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "データベースユーザーがインストールユーザーかどうかをチェックしています"
+
+#: check.c:680
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "データベースユーザー\"%s\"がインストールユーザーではありません\n"
+
+#: check.c:691
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "ユーザー数を特定できませんでした\n"
+
+#: check.c:699
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "新クラスタ内で定義できるのはインストールユーザーのみです。\n"
+
+#: check.c:729
+#, c-format
+msgid "Checking database connection settings"
+msgstr "データベース接続の設定を確認しています"
+
+#: check.c:755
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 には接続を許可してはなりません。すなわち、pg_database.datallowconn は false である必要があります。\n"
+
+#: check.c:785 check.c:910 check.c:1012 check.c:1138 check.c:1219 check.c:1278
+#: check.c:1339 check.c:1404 check.c:1523 function.c:187 version.c:192
+#: version.c:232 version.c:378
+#, c-format
+msgid "fatal\n"
+msgstr "致命的\n"
+
+#: check.c:786
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"template0ではないすべてのデータベースは接続を許可しなければなりません、つまり\n"
+"pg_database.datallowconnがtrueでなければなりません。このクラスタには\n"
+"pg_database.datallowconnがfalseとなっているtemplate0以外のデータベースが\n"
+"存在しています。template0以外のすべてのデータベースへの接続を許可するか、接続が\n"
+"許可されないデータベースをすべて削除することを検討してください。問題のあるデータベースの\n"
+"一覧が以下のファイルにあります:\n"
+" %s\n"
+"\n"
+
+#: check.c:811
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "準備済みトランザクションをチェックしています"
+
+#: check.c:820
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "移行元クラスタに準備済みトランザクションがあります\n"
+
+#: check.c:822
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "移行先クラスタに準備済みトランザクションがあります\n"
+
+#: check.c:848
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "bigint を渡す際にミスマッチが発生する contrib/isn をチェックしています"
+
+#: check.c:911
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このクラスタには、bigint データ型に依存する「contrib/isn」の関数が\n"
+"含まれています。新旧のクラスタ間でのbigint値の受け渡し方法が異なるため、\n"
+"現時点ではこのクラスタをアップグレードすることはできません。\n"
+"旧クラスタ中の「contrib/isn」の関数等を使うデータベースを手動でダンプして、\n"
+"それらを削除してからアップグレードを実行し、その後削除したデータベースを\n"
+"リストアすることができます。 \n"
+"問題のある関数の一覧は以下のファイルにあります:\n"
+" %s\n"
+"\n"
+
+#: check.c:934
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "ユーザー定義の後置演算子を確認しています"
+
+#: check.c:1013
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このクラスタにはユーザー定義の後置演算子が存在しますが、これは今後\n"
+"サポートされません。後置演算子を削除するか、前置演算子あるいは関数\n"
+"呼び出しで置き換えることを検討してください:\n"
+"以下のファイルにユーザー定義後置演算子の一覧があります:\n"
+" %s\n"
+"\n"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "非互換の多態関数を確認しています"
+
+#: check.c:1139
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このクラスタには、\"anyarray\"または\"anyelement\"型の引数を持つ内部多態関数を\n"
+"参照するユーザー定義のオブジェクトが含まれています。これらのユーザー定義オブジェクトは\n"
+"アップグレード前に削除して、のちに\"anycompatiblearray\"および\"anycompatible\"を\n"
+"引数とする対応する新しい関数を参照するように変更して復元する必要があります。\n"
+"問題となるオブジェクトの一覧は以下のファイルにあります:\n"
+" %s\n"
+"\n"
+
+#: check.c:1164
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "WITH OIDS宣言されたテーブルをチェックしています"
+
+#: check.c:1220
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このクラスタにはWITH OIDS宣言されたテーブルが存在しますが、これは今後\n"
+"サポートされません。以下のコマンドでoidカラムを削除することを検討してください:\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"以下のファイルにこの問題を抱えるテーブルの一覧があります:\n"
+" %s\n"
+"\n"
+
+#: check.c:1248
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "ユーザーテーブル内のシステム定義複合型を確認しています"
+
+#: check.c:1279
+#, c-format
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このクラスタ内のユーザーテーブルには、システム定義の複合データ型が含まれています。\n"
+"これらのデータ型のOIDはPostgreSQLのバージョン間にわたって不変ではないため、\n"
+"このクラスタは現時点ではアップグレードできません。問題の列を削除したのちに\n"
+"アップグレードを再実行することができます。\n"
+"問題のある列の一覧は、以下のファイルにあります: \n"
+" %s\n"
+"\n"
+
+#: check.c:1307
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "ユーザーテーブル内の reg * データ型をチェックしています"
+
+#: check.c:1340
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このクラスタではユーザーテーブルにreg*データ型のひとつが含まれています。\n"
+"これらのデータ型はシステムOIDを参照しますが、これは pg_upgradeでは\n"
+"保存されないため、現時点ではこのクラスタをアップグレードすることはできません。\n"
+"問題の列を削除したのち、アップグレードを再実行できます。\n"
+"問題のある列の一覧は以下のファイルにあります:\n"
+" %s\n"
+"\n"
+
+#: check.c:1364
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "ユーザーテーブル中で使用されている削除された\"%s\"データ型をチェックしています"
+
+#: check.c:1373
+#, c-format
+msgid "fatal"
+msgstr "致命的"
+
+#: check.c:1374
+#, c-format
+msgid ""
+"Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このクラスタではユーザーテーブルにデータ型\"%s\"が含まれています。\n"
+"この\"%s\"型はPostgreSQLバージョン%sでは削除されています、そのためこのクラスタは\n"
+"現時点ではアップグレードできません。問題の列を削除するか、他のデータ型に変更した後に\n"
+"アップグレードを再実行できます。問題のある列の一覧は、以下のファイルにあります: \n"
+" %s\n"
+"\n"
+
+#: check.c:1396
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "互換性のない\"jsonb\"データ型をチェックしています"
+
+#: check.c:1405
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このクラスタではユーザーテーブルに\"jsonb\"データ型が含まれています。\n"
+"この型の内部フォーマットは9.4ベータの間に変更されているため、現時点ではこの\n"
+"クラスタをアップグレードすることはできません。\n"
+"問題の列を削除したのち、アップグレードを再実行できます。\n"
+"問題のある列の一覧は以下のファイルにあります:\n"
+" %s\n"
+"\n"
+
+#: check.c:1427
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "'pg_' で始まるロールをチェックしています"
+
+#: check.c:1437
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "移行元クラスタに 'pg_' で始まるロールが含まれています\n"
+
+#: check.c:1439
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "移行先クラスタに \"pg_\" で始まるロールが含まれています\n"
+
+#: check.c:1460
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "ユーザー定義のエンコーディング変換を確認しています"
+
+#: check.c:1524
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このクラスタにはユーザー定義のエンコーディング変換が含まれています。\n"
+"変換関数のパラメータがPostgreSQLバージョン14で変更されているため、\n"
+"現時点ではこのクラスタをアップグレードすることはできません。\n"
+"旧クラスタ内のそれらのエンコーディング変換を削除したのち、アップグレードを\n"
+"再実行できます。\n"
+"ユーザー定義のエンコーディング変換の一覧は以下のファイルにあります:\n"
+" %s\n"
+"\n"
+
+#: check.c:1551
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "現在のロケールを取得できませんでした。\n"
+
+#: check.c:1560
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "\"%s\"のシステムロケール名を取得できませんでした。\n"
+
+#: check.c:1566
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "古いロケール\"%s\"を復元できませんでした。\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "%s を使った制御情報が取得できませんでした。: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: データベースクラスタの状態異常\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "ソースクラスタはリカバリモード中にシャットダウンされています。アップグレードをするにはドキュメントの通りに \"rsync\" を実行するか、プライマリとしてシャットダウンしてください。\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "ターゲットクラスタはリカバリモード中にシャットダウンされています。アップグレードをするにはドキュメントの通りに \"rsync\" を実行するか、プライマリとしてシャットダウンしてください。\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "移行元クラスタはクリーンにシャットダウンされていません。\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "移行先クラスタはクリーンにシャットダウンされていません。\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "移行元クラスタにクラスタ状態情報がありません:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "移行先クラスタにクラスタ状態情報がありません:\n"
+
+#: controldata.c:209 dump.c:50 pg_upgrade.c:440 pg_upgrade.c:477
+#: relfilenode.c:231 server.c:34
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal で問題発生\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: 制御情報の取得で問題発生\n"
+
+#: controldata.c:571
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "移行元クラスタに必要な制御情報の一部がありません:\n"
+
+#: controldata.c:574
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "移行先クラスタに必要な制御情報の一部がありません:\n"
+
+#: controldata.c:577
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " チェックポイントにおける次の XID\n"
+
+#: controldata.c:580
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " 最新のチェックポイントにおける次の OID\n"
+
+#: controldata.c:583
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " 最新のチェックポイントにおける次の MultiXactId\n"
+
+#: controldata.c:587
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " 最新のチェックポイントにおける最古の MultiXactId\n"
+
+#: controldata.c:590
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " 最新のチェックポイントにおける最古のXID\n"
+
+#: controldata.c:593
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " 最新のチェックポイントにおける次の MultiXactOffset\n"
+
+#: controldata.c:596
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " リセット後の最初の WAL セグメント\n"
+
+#: controldata.c:599
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " float8引数の引き渡し方法\n"
+
+#: controldata.c:602
+#, c-format
+msgid " maximum alignment\n"
+msgstr " 最大アラインメント\n"
+
+#: controldata.c:605
+#, c-format
+msgid " block size\n"
+msgstr " ブロックサイズ\n"
+
+#: controldata.c:608
+#, c-format
+msgid " large relation segment size\n"
+msgstr " リレーションセグメントのサイズ\n"
+
+#: controldata.c:611
+#, c-format
+msgid " WAL block size\n"
+msgstr " WAL のブロックサイズ\n"
+
+#: controldata.c:614
+#, c-format
+msgid " WAL segment size\n"
+msgstr " WAL のセグメント サイズ\n"
+
+#: controldata.c:617
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " 識別子の最大長\n"
+
+#: controldata.c:620
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " インデックス対象カラムの最大数\n"
+
+#: controldata.c:623
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " 最大の TOAST チャンクサイズ\n"
+
+#: controldata.c:627
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " ラージオブジェクトのチャンクサイズ\n"
+
+#: controldata.c:630
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " 日付/時間が整数?\n"
+
+#: controldata.c:634
+#, c-format
+msgid " data checksum version\n"
+msgstr " データチェックサムのバージョン\n"
+
+#: controldata.c:636
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "必要な制御情報がないので続行できません。終了しています\n"
+
+#: controldata.c:651
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"新旧のpg_controldataのアラインメントが不正であるかかまたは一致しません\n"
+"一方のクラスタが32ビットで、他方が64ビットである可能性が高いです\n"
+
+#: controldata.c:655
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "新旧の pg_controldata におけるブロックサイズが有効でないかまたは一致しません\n"
+
+#: controldata.c:658
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "新旧の pg_controldata におけるリレーションの最大セグメントサイズが有効でないか一致しません\n"
+
+#: controldata.c:661
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "新旧の pg_controldata における WAL ブロックサイズが有効でないか一致しません\n"
+
+#: controldata.c:664
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "新旧の pg_controldata における WAL セグメントサイズが有効でないか一致しません\n"
+
+#: controldata.c:667
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "新旧の pg_controldata における識別子の最大長が有効でないか一致しません\n"
+
+#: controldata.c:670
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "新旧の pg_controldata におけるインデックス付き列の最大数が有効でないか一致しません\n"
+
+#: controldata.c:673
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "新旧の pg_controldata における TOAST チャンクサイズの最大値が有効でないか一致しません\n"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "新旧の pg_controldata におけるラージオブジェクトのチャンクサイズが有効でないかまたは一致しません\n"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "新旧の pg_controldata における日付/時刻型データの保存バイト数が一致しません\n"
+
+#: controldata.c:694
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "旧クラスタではデータチェックサムを使用していませんが、新クラスタでは使用しています\n"
+
+#: controldata.c:697
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "旧クラスタではデータチェックサムを使用していますが、新クラスタでは使用していません\n"
+
+#: controldata.c:699
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "新旧の pg_controldata 間でチェックサムのバージョンが一致しません\n"
+
+#: controldata.c:710
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "旧の global/pg_control に \".old\" サフィックスを追加しています"
+
+#: controldata.c:715
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "%s の名前を %s に変更できません。\n"
+
+#: controldata.c:718
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"旧クラスタを起動する場合、%s/global/pg_control.oldから\n"
+"\".old\"拡張子を削除する必要があります。「リンク」モードが使われて\n"
+"いるため、一度新クラスタを起動してしまうと旧クラスタは安全に起動\n"
+"することができなくなります。\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "グローバルオブジェクトのダンプを作成しています"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "データベーススキーマのダンプを作成しています。"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "%s を使って pg_ctl のバージョンデータを取得できませんでした。: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "pg_ctl のバージョン出力を %s から取得できませんでした。\n"
+
+#: exec.c:108 exec.c:112
+#, c-format
+msgid "command too long\n"
+msgstr "コマンドが長すぎます\n"
+
+#: exec.c:114 util.c:37 util.c:310
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:153 pg_upgrade.c:279
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "ログファイル\"%s\"をオープンできませんでした: %m\n"
+
+#: exec.c:182
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*失敗*"
+
+#: exec.c:185
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "\"%s\"を実行していて問題が発生しました\n"
+
+#: exec.c:188
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"失敗の原因については\"%s\"または\"%s\"の最後の数行を参照してください。\n"
+"\n"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"失敗の原因については、\"%s\"の最後の数行を参照してください。\n"
+"\n"
+
+#: exec.c:208 pg_upgrade.c:289
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "ログファイル\"%s\"に書き込めませんでした: %m\n"
+
+#: exec.c:234
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "ファイル\"%s\"を読み取り用としてオープンできませんでした:%s\n"
+
+#: exec.c:261
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "カレントディレクトリに対して読み書き可能なアクセス権が必要です。\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "\"%s\"のチェックに失敗しました: %s\n"
+
+#: exec.c:317 exec.c:383
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\"はディレクトリではありません\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "\"%s\"のチェックに失敗しました:通常ファイルではありません\n"
+
+#: exec.c:436
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "\"%s\"のチェックに失敗しました:実行できません(権限が拒否されました)\n"
+
+#: exec.c:442
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "\"%s\"の確認に失敗しました:実行できません\n"
+
+#: exec.c:452
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr ""
+"\"%s\"の確認に失敗しました: 間違ったバージョン: 検出\"%s\"、想定\"%s\"\n"
+"\n"
+
+#: file.c:43 file.c:63
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "リレーション\"%s.%s\"の(\"%s\"から\"%s\"への)クローン中にエラー: %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "リレーション\"%s.%s\"のクローン中にエラー: ファイル\"%s\"を開けませんでした: %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "リレーション\"%s.%s\"のクローン中にエラー: ファイル\"%s\"を作成できませんでした: %s\n"
+
+#: file.c:89 file.c:192
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"を開けませんでした: %s\n"
+
+#: file.c:94 file.c:201
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"を作成できませんでした: %s\n"
+
+#: file.c:108 file.c:225
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"を読めませんでした: %s\n"
+
+#: file.c:120 file.c:303
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"に書けませんでした: %s\n"
+
+#: file.c:134
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "リレーション\"%s.%s\"のコピー(\"%s\" -> \"%s\")中にエラー:%s\n"
+
+#: file.c:153
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "リレーション\"%s.%s\"へのリンク(\"%s\" -> \"%s\")作成中にエラー:%s\n"
+
+#: file.c:196
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"を stat できませんでした: %s\n"
+
+#: file.c:228
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"中に不完全なページがありました\n"
+
+#: file.c:330 file.c:347
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "新旧ディレクトリ間のファイルのクローンができませんでした: %s\n"
+
+#: file.c:343
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "ファイル\"%s\"を作成できませんでした: %s\n"
+
+#: file.c:354
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "このプラットフォームではファイルのクローニングはサポートされません\n"
+
+#: file.c:371
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"新旧のデータディレクトリ間でハードリンクを作成できませんでした: %s\n"
+"リンクモードでは、新旧のデータディレクトリが同じファイルシステム上に存在しなければなりません。\n"
+
+#: function.c:129
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "必要なライブラリの有無を確認しています"
+
+#: function.c:167
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "ライブラリ\"%s\"をロードできませんでした: %s"
+
+#: function.c:178
+#, c-format
+msgid "In database: %s\n"
+msgstr "データベース: %s\n"
+
+#: function.c:188
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このクラスタでは、移行先の環境にはないロード可能ライブラリを参照しています。\n"
+"これらのライブラリを移行先の環境に追加するか、もしくは移行元の環境から\n"
+"それらを使っている関数を削除してください。 問題のライブラリの一覧は、\n"
+"以下のファイルに入っています:\n"
+" %s\n"
+"\n"
+
+#: info.c:125
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "データベース\"%2$s\"で OID %1$u のリレーション名が一致しません: 元の名前 \"%3$s.%4$s\"、新しい名前 \"%5$s.%6$s\"\n"
+
+#: info.c:145
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "データベース\"%s\"で新旧のテーブルの照合に失敗しました\n"
+
+#: info.c:226
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " これは \"%s.%s\" 上のインデックスです"
+
+#: info.c:236
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " これは OID %u 上のインデックスです"
+
+#: info.c:248
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " これは \"%s.%s\" の TOAST テーブルです"
+
+#: info.c:256
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " これは OID %u の TOAST テーブルです"
+
+#: info.c:260
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "データベース\"%2$s\"でOID%1$uを持つ新リレーションに対応するものが旧クラスタ内にありません: %3$s\n"
+
+#: info.c:263
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "データベース\"%2$s\"でOID %1$uを持つ旧リレーションに対応するものが新クラスタ内にありません: %3$s\n"
+
+#: info.c:287
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"移行元データベース:\n"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"移行先データベース:\n"
+
+#: info.c:604
+#, c-format
+msgid "Database: %s\n"
+msgstr "データベース: %s\n"
+
+#: info.c:606
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:617
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:100
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: root では実行できません\n"
+
+#: option.c:167
+#, c-format
+msgid "invalid old port number\n"
+msgstr "旧ポート番号が無効です\n"
+
+#: option.c:172
+#, c-format
+msgid "invalid new port number\n"
+msgstr "新ポート番号が無効です\n"
+
+#: option.c:198
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "詳細は\"%s --help\"を参照してください。\n"
+
+#: option.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")\n"
+
+#: option.c:208
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "冗長モードで実行しています\n"
+
+#: option.c:226
+msgid "old cluster binaries reside"
+msgstr "旧クラスタのバイナリが置かれている"
+
+#: option.c:228
+msgid "new cluster binaries reside"
+msgstr "新クラスタのバイナリが置かれている"
+
+#: option.c:230
+msgid "old cluster data resides"
+msgstr "旧クラスタのデータが置かれている"
+
+#: option.c:232
+msgid "new cluster data resides"
+msgstr "新クラスタのデータが置かれている"
+
+#: option.c:234
+msgid "sockets will be created"
+msgstr "ソケットが作成される"
+
+#: option.c:251 option.c:350
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "カレントディレクトリを特定できませんでした\n"
+
+#: option.c:254
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "Windowsでは、新クラスタのデータディレクトリの中でpg_upgradeを実行することはできません\n"
+
+#: option.c:263
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgradeは、PostgreSQLのクラスタを別のメジャーバージョンにアップグレードします。\n"
+"\n"
+
+#: option.c:264
+#, c-format
+msgid "Usage:\n"
+msgstr "使い方:\n"
+
+#: option.c:265
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [オプション]...\n"
+"\n"
+
+#: option.c:266
+#, c-format
+msgid "Options:\n"
+msgstr "オプション:\n"
+
+#: option.c:267
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR 旧クラスタの実行ファイルディレクトリ\n"
+
+#: option.c:268
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR 新クラスタの実行ファイルディレクトリ(デフォルト\n"
+" はpg_upgradeと同じディレクトリ)\n"
+
+#: option.c:270
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check クラスタのチェックのみ、データを一切変更しない\n"
+
+#: option.c:271
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR 旧クラスタのデータディレクトリ\n"
+
+#: option.c:272
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR 新クラスタのデータディレクトリ\n"
+
+#: option.c:273
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs 使用する同時実行プロセスまたはスレッドの数\n"
+
+#: option.c:274
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr ""
+" -k, --link 新クラスタにファイルをコピーする代わりに\n"
+" リンクする\n"
+
+#: option.c:275
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync 変更のディスクへの確実な書き出しを待機しない\n"
+
+#: option.c:276
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS サーバーに渡す旧クラスタのオプション\n"
+
+#: option.c:277
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONS サーバーに渡す新クラスタのオプション\n"
+
+#: option.c:278
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT 旧クラスタのポート番号(デフォルト %d)\n"
+
+#: option.c:279
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT 新クラスタのポート番号(デフォルト %d)\n"
+
+#: option.c:280
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain SQLとログファイルを、成功後も消さずに残す\n"
+
+#: option.c:281
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr ""
+" -s, --socketdir=DIR 使用するソケットディレクトリ(デフォルトは\n"
+" カレントディレクトリ)\n"
+
+#: option.c:282
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME クラスタのスーパーユーザー(デフォルト\"%s\")\n"
+
+#: option.c:283
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose 詳細な内部ログを有効化\n"
+
+#: option.c:284
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: option.c:285
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr ""
+" --clone 新クラスタにファイルをコピーする代わりに\n"
+" クローンする\n"
+
+#: option.c:286
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: option.c:287
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"pg_upgrade を実行する前に、以下のことを行ってください:\n"
+" (新バージョンのinitdbを使って)新しいデータベースクラスタを作成する\n"
+" 旧クラスタのpostmasterをシャットダウンする\n"
+" 新クラスタのpostmasterをシャットダウンする\n"
+
+#: option.c:292
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"pg_upgrade を動かす場合、次の情報を指定する必要があります: \n"
+" 旧クラスタのデータディレクトリ (-d DATADIR)\n"
+" 新クラスタのデータディレクトリ (-D DATADIR) \n"
+" 旧バージョンの\"bin\"ディレクトリ (-b BINDIR)\n"
+" 新バージョンの\"bin\"ディレクトリ(-B BINDIR)\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"実行例:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"または\n"
+
+#: option.c:303
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"バグは<%s>に報告してください。\n"
+
+#: option.c:316
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: option.c:356
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"%sディレクトリを指定する必要があります。\n"
+"コマンドラインオプション %s または環境変数 %s を使用してください。\n"
+
+#: option.c:408
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "移行元クラスタの実際のデータディレクトリを探しています"
+
+#: option.c:410
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "移行先クラスタの実際のデータディレクトリを探しています"
+
+#: option.c:422
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "%s を使ってデータディレクトリを取得できませんでした。: %s\n"
+
+#: option.c:473
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "ファイル\"%2$s\"の%1$d行目を読み取れませんでした: %3$s\n"
+
+#: option.c:490
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "ユーザー指定の旧ポート番号 %hu は %hu に訂正されました\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "ワーカープロセスを作成できませんでした: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "ワーカースレッドを作成できませんでした: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "%s() が失敗しました: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "子プロセスが異常終了しました: ステータス %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "子ワーカーが異常終了しました: %s\n"
+
+#: pg_upgrade.c:102
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "ディレクトリ\"%s\"の権限を読み取れませんでした: %s\n"
+
+#: pg_upgrade.c:134
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"アップグレードを実行しています。\n"
+"------------------\n"
+
+#: pg_upgrade.c:177
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "新クラスタの、次の OID を設定しています"
+
+#: pg_upgrade.c:186
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "データディレクトリをディスクに同期します"
+
+#: pg_upgrade.c:198
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"アップグレードが完了しました\n"
+"----------------\n"
+
+#: pg_upgrade.c:231 pg_upgrade.c:244 pg_upgrade.c:251 pg_upgrade.c:258
+#: pg_upgrade.c:276 pg_upgrade.c:287
+#, c-format
+msgid "directory path for new cluster is too long\n"
+msgstr "新クラスタのディレクトリ・パスが長すぎます\n"
+
+#: pg_upgrade.c:265 pg_upgrade.c:267 pg_upgrade.c:269 pg_upgrade.c:271
+#, c-format
+msgid "could not create directory \"%s\": %m\n"
+msgstr "ディレクトリ\"%s\"を作成できませんでした: %m\n"
+
+#: pg_upgrade.c:320
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 自身のための実行ファイルが見つかりませんでした\n"
+
+#: pg_upgrade.c:346
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"旧クラスタで稼働中のpostmasterがあるようです。\n"
+"そのpostmasterをシャットダウンしたのちにやり直してください。\n"
+
+#: pg_upgrade.c:359
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"新クラスタで稼働中のpostmasterがあるようです。\n"
+"そのpostmasterをシャットダウンしたのちやり直してください。\n"
+
+#: pg_upgrade.c:373
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "新クラスタ内のすべての行を分析しています"
+
+#: pg_upgrade.c:386
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "新クラスタ内のすべての行を凍結しています"
+
+#: pg_upgrade.c:406
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "新クラスタ内のグローバルオブジェクトを復元しています"
+
+#: pg_upgrade.c:422
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "新クラスタ内にデータベーススキーマを復元しています"
+
+#: pg_upgrade.c:528
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "新しい %s からファイルを削除しています"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "ディレクトリ\"%s\"を削除できませんでした\n"
+
+#: pg_upgrade.c:551
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "旧の %s を新サーバーにコピーしています"
+
+#: pg_upgrade.c:577
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "新クラスタの、最古のXIDを設定しています"
+
+#: pg_upgrade.c:585
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "新クラスタの、次のトランザクションIDと基点を設定しています"
+
+#: pg_upgrade.c:615
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "新クラスタの、次のmultixact IDとオフセットを設定しています"
+
+#: pg_upgrade.c:639
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "新クラスタの最古のmultixact IDを設定しています"
+
+#: pg_upgrade.c:659
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "WAL アーカイブをリセットしています"
+
+#: pg_upgrade.c:702
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "新クラスタのfrozenxidとminmxidカウンタを設定しています"
+
+#: pg_upgrade.c:704
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "新クラスタのminmxidカウンタを設定しています"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "ユーザーリレーションファイルをクローニングしています"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "ユーザーリレーションのファイルをコピーしています"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "ユーザーリレーションのファイルをリンクしています"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "新クラスタ内に旧データベース\"%s\"が見つかりません\n"
+
+#: relfilenode.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "\"%s.%s\"ファイル (\"%s\" -> \"%s\")の存在を確認中にエラー: %s\n"
+
+#: relfilenode.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "\"%s\"を\"%s\"に書き換えています\n"
+
+#: relfilenode.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "\"%s\"から\"%s\"へクローニングしています\n"
+
+#: relfilenode.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "\"%s\"を\"%s\"にコピーしています\n"
+
+#: relfilenode.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "\"%s\"から\"%s\"へリンクを作成しています\n"
+
+#: server.c:39 server.c:143 util.c:220 util.c:250
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "失敗しました、終了しています\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s\n"
+msgstr "実行中: %s\n"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL コマンドが失敗しました\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "バージョンファイル\"%s\"をオープンできませんでした: %m\n"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "バージョンファイル\"%s\"をパースできませんでした\n"
+
+#: server.c:291
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:295
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"以下のコマンドで起動した移行元postmasterに接続できませんでした:\n"
+"%s\n"
+
+#: server.c:299
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"以下のコマンドで起動した移行先postmasterに接続できませんでした:\n"
+"%s\n"
+
+#: server.c:313
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl が移行元サーバーの起動に失敗した、あるいは接続に失敗しました\n"
+
+#: server.c:315
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl が移行先サーバーの起動に失敗した、あるいは接続に失敗しました\n"
+
+#: server.c:360
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリ不足です\n"
+
+#: server.c:373
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "libpq の環境変数 %s で、ローカルでないサーバー値が設定されています: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"テーブル空間を使用している場合、同じシステムカタログバージョン間での\n"
+"アップグレードはできません。\n"
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "テーブル空間のディレクトリ\"%s\"が存在しません\n"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "テーブル空間のディレクトリ\"%s\"を stat できませんでした: %s\n"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "テーブル空間のパス\"%s\"がディレクトリではありません\n"
+
+#: util.c:52 util.c:55 util.c:127 util.c:160
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:95
+#, c-format
+msgid "could not access directory \"%s\": %m\n"
+msgstr "ディレクトリ\"%s\"にアクセスできませんでした: %m\n"
+
+#: util.c:158
+#, c-format
+msgid "%-*s\n"
+msgstr "%-*s\n"
+
+#: util.c:259
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "非互換の \"line\" データ型を確認しています"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このクラスタではユーザーテーブルに\"line\"データ型が含まれています。\n"
+"このデータ型は新旧のクラスタ間で内部形式および入出力フォーマットが\n"
+"変更されているため、このクラスタは現時点ではアップグレードできません。\n"
+"問題の列を削除したのちにアップグレードを再実行できます。\n"
+"問題のある列の一覧は、以下のファイルにあります: \n"
+" %s\n"
+"\n"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "無効な\"unknown\"ユーザー列をチェックしています"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このクラスタではユーザーテーブルに \"unknown\" データ型が含まれています。\n"
+"このデータ型はもはやテーブル内では利用できないため、このクラスタは現時点\n"
+"ではアップグレードできません。問題の列を削除したのち、アップグレードを\n"
+"再実行できます。\n"
+"問題のある列の一覧は、以下のファイルにあります: \n"
+" %s\n"
+"\n"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "ハッシュインデックスをチェックしています"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "警告"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"このクラスタにはハッシュインデックスがあります。このインデックスは新旧のクラスタ間で\n"
+"内部フォーマットが異なるため、REINDEX コマンドを使って再構築する必要があります。\n"
+"アップグレードが終わったら、REINDEX を使った操作方法が指示されます。\n"
+"\n"
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"このクラスタにはハッシュインデックスがあります。このインデックスは新旧のクラスタ間で\n"
+"内部フォーマットが異なるため、REINDEX コマンドを使って再構築する必要があります。\n"
+"以下のファイル\n"
+" %s\n"
+"を、psqlを使用してデータベースのスーパーユーザーとして実行することで、無効になった\n"
+"インデックスを再構築できます。\n"
+"それまでは、これらのインデックスは使用されません。\n"
+"\n"
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "無効な\"sql_identifier\"ユーザー列を確認しています"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"このクラスタではでは”sql_identifier”データ型がユーザーテーブルに含まれています。\n"
+"このデータ型のディスク上での形式は変更されているため、このクラスタは現時点では\n"
+"アップグレードできません。問題のある列を削除した後にアップグレードを再実行する\n"
+"ことができます。\n"
+"問題のある列の一覧は、以下のファイルにあります: \n"
+" %s\n"
+"\n"
+
+#: version.c:403
+#, c-format
+msgid "Checking for extension updates"
+msgstr "機能拡張のアップデートを確認しています"
+
+#: version.c:455
+#, c-format
+msgid "notice"
+msgstr "注意"
+
+#: version.c:456
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"このクラスタにはALTER EXTENSIONコマンドによるアップデートが必要な機能拡張が\n"
+"あります。以下のファイルをpsqlを使ってデータベースのスーパーユーザーとして実行することで\n"
+"これらの機能拡張をアップデートできます。\n"
+" %s\n"
+"\n"
diff --git a/src/bin/pg_upgrade/po/ka.po b/src/bin/pg_upgrade/po/ka.po
new file mode 100644
index 0000000..7ba1864
--- /dev/null
+++ b/src/bin/pg_upgrade/po/ka.po
@@ -0,0 +1,1851 @@
+# Georgian message translation file for pg_upgrade
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-03-26 18:18+0000\n"
+"PO-Revision-Date: 2023-03-27 07:19+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"თანმიმდევრულობის შემოწმების შესრულება ძველ ცოცხალ სერვერზე\n"
+"------------------------------------------------\n"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"თანმიმდევრულობის შემოწმების ჩატარება\n"
+"-----------------------------\n"
+
+#: check.c:218
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*კლასტერები თავსებადია *\n"
+
+#: check.c:226
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"თუ ამ წერტილის შემდეგ pg_upgrade ავარიულად დასრულდება, გაგრძელებამდე\n"
+"ახალი კლასტერის init-db-ის გაკეთება შეიძლება თავიდან მოგიწიოთ.\n"
+
+#: check.c:267
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"ოპტიმიზატორის სტატისტიკ-ის გადატანა pg_upgrade-ის მიერ არ ხდება.\n"
+"როცა ახალ სერვერს გაუშვებთ, შეასრულეთ ბრძანება:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:273
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"ამ სკრიპტის გაშვება ძველი კლასტერის მონაცემების ფაილებს წაშლის:\n"
+" %s\n"
+
+#: check.c:278
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"მომხმარებლის მიერ აღწერილი ცხრილის სივრცეების ან ახალი კლასტერის \n"
+"მონაცემების საქაღალდის ძველი კლასტერის საქაღადლდეში არსებობის გამო\n"
+"ძველი კლასტერის მონაცემების წაშლის სკრიპტის შექმნა შეუძლებელია. ძველი კლასტერის\n"
+" შემცველობა ხელით უნდა წაშალოთ.\n"
+
+#: check.c:290
+#, c-format
+msgid "Checking cluster versions"
+msgstr "კლასტერის ვერსიების შემოწმება"
+
+#: check.c:302
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later.\n"
+msgstr "ამ პროგრამას განახლება PostgreSQL-ის ვერსიის %s-დან და ზემოთ შეუძლია.\n"
+
+#: check.c:307
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "ამ პროგრამას შეუძლია მხოლოდ PostgreSQL ვერსიაზე გადასვლა %s.\n"
+
+#: check.c:316
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "ეს პროგრამა არ შეიძლება გამოყენებულ იქნას უფრო ძველი ძირითადი PostgreSQL ვერსიების ჩამოსაწევად.\n"
+
+#: check.c:321
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "ძველი კლასტერის მონაცემები და გამშვები ფაილის საქაღალდეები სხვადასხვა ძირითადი ვერსიიდანაა.\n"
+
+#: check.c:324
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "ახალი კლასტერის მონაცემებისა და გამშვები ფაილების საქაღალდეები სხვადასხვა ძირითად ვერსიებს მიეკუთვნება.\n"
+
+#: check.c:339
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "ცოცხალი სერვერის შემოწმებისას ძველი და ახალი პორტის ნომრები სხვადასხვა უნდა იყოს.\n"
+
+#: check.c:354
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "მონაცემთა ბაზის კოდირება \"%s\" არ ემთხვევა: ძველი \"%s\", ახალი \"%s\"\n"
+
+#: check.c:359
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "მონაცემთა ბაზის lc_collate მნიშვნელობები \"%s\" არ ემთხვევა: ძველი \"%s\", ახალი \"%s\"\n"
+
+#: check.c:362
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "მონაცემთა ბაზის lc_ctype მნიშვნელობები \"%s\" არ ემთხვევა: ძველი \"%s\", ახალი \"%s\"\n"
+
+#: check.c:365
+#, c-format
+msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "მონაცემთა ბაზის \"%s\" ენის მომწოდებლები არ ემთხვევა: ძველი \"%s\", ახალი \"%s\"\n"
+
+#: check.c:372
+#, c-format
+msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "ICU-ს ენის მნიშვნელობები მონაცემთა ბაზისთვის \"%s\" არ ემთხვევა: ძველი \"%s\", ახალი \"%s\"\n"
+
+#: check.c:447
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "ახალი კლასტერული მონაცემთა ბაზა \"%s\" ცარიელი არაა: ნაპოვნია ურთიერთობა \"%s.%s\"\n"
+
+#: check.c:499
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "ახალი კლასტერის ცხრილების სივრცის საქაღალდეების შემოწმება"
+
+#: check.c:510
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "ახალი კლასტერის ცხრილების სივრცის საქაღალდე უკვე არსებობს: \"%s\"\n"
+
+#: check.c:543
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s\n"
+msgstr ""
+"\n"
+"გაფრთხილება: ახალი მონაცემების საქაღალდე ძველი მონაცემების საქაღალდის შიგნით არ უნდა იყოს. მაგ: %s\n"
+
+#: check.c:567
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s\n"
+msgstr ""
+"\n"
+"გაფრთხილება: მომხმარებლის მიერ აღწერილი ცხრილის სივრცეების მდებარეობები მონაცემების საქაღალდის შიგნით არ უნდა იყოს. მაგ: %s\n"
+
+#: check.c:577
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "ძველი კლასტერის წასაშლელად სკრიპტის შექმნა"
+
+#: check.c:580 check.c:755 check.c:875 check.c:974 check.c:1105 check.c:1184
+#: check.c:1453 file.c:338 function.c:165 option.c:465 version.c:116
+#: version.c:292 version.c:429
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "ფაილის გახსნის შეცდომა \"%s\": %s\n"
+
+#: check.c:631
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "ფაილზე \"%s\" გაშვების წვდომის დამატების შეცდომა: %s\n"
+
+#: check.c:651
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "შემოწმება, დამყენებელი მომხმარებელი დაყენების მომხმარებელს თუ უდრის"
+
+#: check.c:667
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "მონაცემთა ბაზის მომხმარებელი \"%s\" არ არის დაყენების მომხმარებელი\n"
+
+#: check.c:678
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "ვერ დადგინდა მომხმარებელთა რაოდენობა\n"
+
+#: check.c:686
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "ახალი კლასტერისთვის მხოლოდ დაყენების მომხმარებლის მითითებაა შესაძლებელი.\n"
+
+#: check.c:716
+#, c-format
+msgid "Checking database connection settings"
+msgstr "მონაცემთა ბაზის კავშირის პარამეტრების შემოწმება"
+
+#: check.c:742
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0-თან დაკავშირება შეუძლებელი უნდა იყოს. ანუ, მისი pg_database.datallowconn პარამეტრი false უნდა იყოს\n"
+
+#: check.c:772 check.c:897 check.c:999 check.c:1125 check.c:1206 check.c:1265
+#: check.c:1326 check.c:1357 check.c:1476 function.c:187 version.c:192
+#: version.c:232 version.c:378
+#, c-format
+msgid "fatal\n"
+msgstr "ფატალური\n"
+
+#: check.c:773
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"ყველა არა-template0 ბაზაზე მიერთება შესაძლებელი უნდა იყოს, ანუ მათი\n"
+"pg_database.datallowconn -ი true-ს უნდა უნდოდეს. თქვენი ვერსია შეიცავს\n"
+"არა-template0 ბაზებს, რომლების pg_database.datallowconn -ი false-ზეა დაყენებული.\n"
+"სასურველია დაუშვათ მიერთება ყველა არა-template0 ბაზაზე, ან\n"
+"წაშალოთ ბაზები, რომლებზეც წვდომა არ არსებობს.\n"
+"პრობლემური ბაზების სიის ნახვა შეგიძლიათ ფაილში:\n"
+" %s\n"
+"\n"
+
+#: check.c:798
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "მომზადებული ტრანზაქციების შემოწმება"
+
+#: check.c:807
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "საწყისი კლასტერი მომზადებულ ტრანზაქციებს შეიცავს \n"
+
+#: check.c:809
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "სამიზნე კლასტერი მომზადებულ ტრანზაქციებს შეიცავს \n"
+
+#: check.c:835
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "\"contrib/isn\"-ის bgint-passing-ის არ-დამთხვევაზე შემოწმება"
+
+#: check.c:898
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"პროგრამის თქვენი ვერსისა შეიცავს \"contrib/isn\" ფუნქციებს, რომლებიც bigint მონაცემების ტიპს ეყრდნობა. თქვენი ძველი \n"
+"და ახალი კლასტერები bigint მნიშვნელობებს სხვადასხვანაირად ამუშავებენ, ამიტომ თქვენი კლასტერის განახლება ამჟამად \n"
+"შეუძლებელია. შეგიძლიათ, თქვენს ძველ კლასტერში, ბაზები, რომლებიც \"contrib/isn\" ფუნქციებს იყენებს, წაშალოთ\n"
+", განაახლოთ ბაზა და აღადგინოთ ფუნქციები. პრობლემური ფუნქციების სია შეგიძლიათ იხილოთ ფაილში:\n"
+" %s\n"
+"\n"
+
+#: check.c:921
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "მომხმარებლის მიერ აღწერილი postfix ოპერატორების არსებობის შემოწმება"
+
+#: check.c:1000
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"პროგრამის თქვენი ვერსია შეიცავს მომხმარებლის მიერ აღწერილ postfix ოპერატორებს,\n"
+"რომლებიც მხარდაჭერილი აღარაა. საჭირო იქნება postfix ოპერატორების წაშლა და მათი \n"
+"prefix ოპერატორებით ან ფუნქციების გამოძახებებით ჩანაცვლება.\n"
+"მომხმარებლის მიერ აღწერილი postfix ოპერატორების სიის ნახვა შეგიძლიათ ფაილში:\n"
+" %s\n"
+"\n"
+
+#: check.c:1024
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "შეუთავსებელი პოლიმორფული ფუნქციების არსებობის შემოწმება"
+
+#: check.c:1126
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"პროგრამის თქვენი ვერსია შეიცავს მომხმარებლის მიერ აღწერილ ობიექტებს, რომლებიც\n"
+"შიდა პოლიმორფულ ფუნქციებს იძახებენ არგუმენტების ტიპით \"anyarray\" ან \"anyelement\".\n"
+"ეს მომხმარებლის მერ აღწერილი ობიექტები უნდა მოაცილოთ ვერსიის აწევამდე და\n"
+"შემდეგ აღადგინოთ, რათა მათ ახალ შესაბამის ფუნქციებს მიმართონ, არგუმენტების ტიპით\n"
+"\"anycompatiblearray\" და \"anycompatible\".\n"
+"ფაილში არსებული პრობლემური ობიექტები:\n"
+" %s\n"
+"\n"
+
+#: check.c:1151
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "WITH OIDS ცხრილების შემოწმება"
+
+#: check.c:1207
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"პროგრამის თქვენი ვერსია შეიცავს ცხრილებს, რომლებიც WITH OIDS-ითაა\n"
+"აღწერილი, რაც მხარდაჭერილი აღარაა. საჭიროა წაშალოთ oid ცხრილები ბრძანებით\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"ცხრილების სია, რომელსაც ეს პრობლემა გააჩნიათ, შეგიძლიათ იხილოთ ფაილში:\n"
+" %s\n"
+"\n"
+
+#: check.c:1235
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "მომხმარებლის ცხრილებში სისტემის მიერ განსაზღვრული კომპოზიტური ტიპების შემოწმება"
+
+#: check.c:1266
+#, c-format
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"პროგრამის თქვენი ვერსია მომხმარებლის ცხრილებში სისტემის მიერ აღწერილ კომპოზიტურ ტიპებს შეიცავს.\n"
+"ამ ტიპის OID-ები PostgreSQL-ის ვერსიებს შორის მუდმივი არაა, ამიტომ ამ კლასტერის განახლება ამჟამად შეუძლებელია შეგიძლიათ\n"
+"წაშალოთ პრობლემური სვეტები და განახლება თავიდან გაუშვათ.\n"
+"პრობლემური სვეტების სიის ხილვა შეგიძლიათ ფაილში:\n"
+" %s\n"
+"\n"
+
+#: check.c:1294
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "მომხმარებლის ცხრილებში reg* მონაცემის ტიპების შემოწმება"
+
+#: check.c:1327
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"პროგრამის თქვენი ვერსია მომხმარებლის ცხრილებში reg* მონაცემების ტიპს შეიცავს\n"
+"ამ მონაცემების ტიპის სისტემური OID-ები pg_upgrade-ის იერ არ ნარჩუნდება, ამიტომ კლასტერის\n"
+"განახლება შეუძლებელია. პრობლემის მოსაგვარებლად შეგიძლიათ წაშალოთ შესაბამისის სვეტები\n"
+"და განახლება თავიდან გაუშვათ.\n"
+"პრობლემური სვეტების სიის ნახვა შეგიძლიათ ფაილში:\n"
+" %s\n"
+"\n"
+
+#: check.c:1349
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "შეუთავსებელი \"jsonb\" მონაცემთა ტიპის შემოწმება"
+
+#: check.c:1358
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"პროგრამის თქვენი ვერსია მოხმარებლის ცხრილებში მონაცემების \"jsonb\" ტიპს შეიცავს.\n"
+"\"jsonb\"-ის შიდა ფორმატი შეიცვალა 9.4 ბეტას დროს, ასე, რომ ამ კლასტერის განახლება ამჟამად\n"
+"შეუძლებელია შეგიძლიათ წაშალოთ პრობლემული სვეტები და განახლება თავიდან გაუშვათ.\n"
+"პრობლემური სვეტების ნახვა შეგიძლიათ ფაილში:\n"
+" %s\n"
+"\n"
+
+#: check.c:1380
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "როლების შემოწმება, რომლებიც \"pg_\"-ით იწყება"
+
+#: check.c:1390
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "საწყისი კლასტერი შეიცავს როლებს, რომლებიც \"pg_\"-ით იწყება\n"
+
+#: check.c:1392
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "სამიზნე კლასტერი შეიცავს როლებს, რომლებიც \"pg_\"-ით იწყება\n"
+
+#: check.c:1413
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "მომხმარებლის მიერ განსაზღვრული კოდირების კონვერტაციის შემოწმება"
+
+#: check.c:1477
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"პროგრამის თქვენი ვერსია მოხმარებლის მიერ აღწერილ გადაყვანებს შეიცავს.\n"
+"\"jsonb\"-ის შიდა ფორმატი შეიცვალა 14-ე ვერსიაში, ასე, რომ ამ კლასტერის განახლება ამჟამად\n"
+"შეუძლებელია შეგიძლიათ წაშალოთ პრობლემული სვეტები და განახლება თავიდან გაუშვათ.\n"
+"მომხმარებლის მიერ აღწერილი გადაყვანების ნახვა შეგიძლიათ ფაილში:\n"
+" %s\n"
+"\n"
+
+#: check.c:1504
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "მიმდინარე ენის მიღების პრობლემა\n"
+
+#: check.c:1513
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "%s-სთვის სისტემური ენის მიღების შეცდომა\n"
+
+#: check.c:1519
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "ძველი ენის (\"%s\") აღდგენის პრობლემა\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "%s-სთვის საკონტროლო მონაცემების მიღების შეცდომა: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: ბაზის კლასტერის მდგომარეობის პრობლემა\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "საწყისი კლასტერი აღდგენის რეჟიმში იყო, როცა გაითიშა. განსაახლებლად გამოიყენეთ \"rsync\", როგორც ეს დოკუმენტაციაშია, ან გამორთეთ, როგორც ძირითადი.\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "სამიზნე კლასტერი აღდგენის რეჟიმში იყო, როცა გაითიშა. განსაახლებლად, გამოიყენეთ \"rsync\", როგორც ეს დოკუმენტაციაშია, ან გამორთეთ, როგორც ძირითადი.\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "საწყისი ბაზა წესების დაცვით არ გამორთულა\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "სამიზნე ბაზა წესების დაცვით არ გამორთულა\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "საწყის კლასტერს მდგომარეობის ინფორმაცია არ გააჩნია:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "სამიზნე კლასტერს მდგომარეობის ინფორმაცია არ გააჩნია:\n"
+
+#: controldata.c:209 dump.c:50 pg_upgrade.c:440 pg_upgrade.c:477
+#: relfilenode.c:231 server.c:34
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal -ის პრობლემა\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: controldata -ის მიღების შეცდომა\n"
+
+#: controldata.c:571
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "საწყის კლასტერს ზოგიერთი საჭირო კონტროლის ინფორმაცია არ გააჩნია:\n"
+
+#: controldata.c:574
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "სამიზნე კლასტერს ზოგიერთი საჭირო კონტროლის ინფორმაცია არ გააჩნია:\n"
+
+#: controldata.c:577
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " საკონტროლო წერტილის შემდეგი XID\n"
+
+#: controldata.c:580
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " უახლესი საკონტროლო წერტილის შემდეგი OID\n"
+
+#: controldata.c:583
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " უახლესი საკონტროლო წერტილის შემდეგი MultiXactId\n"
+
+#: controldata.c:587
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " უახლესი საკონტროლო წერტილის უძველესი MultiXactId\n"
+
+#: controldata.c:590
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " უახლესი საკონტროლო წერტილის უძველესი XID\n"
+
+#: controldata.c:593
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " უახლესი საკონტროლო წერტილის შემდეგი MultiXactOffset\n"
+
+#: controldata.c:596
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " პირველი WAL სეგმენტი გადატვირთვის შემდეგ\n"
+
+#: controldata.c:599
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " float8 არგუმენტი გავლის მეთოდი\n"
+
+#: controldata.c:602
+#, c-format
+msgid " maximum alignment\n"
+msgstr " მაქსიმალური სწორება\n"
+
+#: controldata.c:605
+#, c-format
+msgid " block size\n"
+msgstr " ბლოკის ზომა\n"
+
+#: controldata.c:608
+#, c-format
+msgid " large relation segment size\n"
+msgstr " დიდი ურთიერთობის სეგმენტის ზომა\n"
+
+#: controldata.c:611
+#, c-format
+msgid " WAL block size\n"
+msgstr " WAL ბლოკის ზომა\n"
+
+#: controldata.c:614
+#, c-format
+msgid " WAL segment size\n"
+msgstr " WAL-ის სეგმენტის ზომა\n"
+
+#: controldata.c:617
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " იდენტიფიკატორის მაქსიმალური სიგრძე\n"
+
+#: controldata.c:620
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " ინდექსირებული სვეტების მაქსიმალური რაოდენობა\n"
+
+#: controldata.c:623
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " TOAST ნაგლეჯის მაქსიმალური ზომა\n"
+
+#: controldata.c:627
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " დიდი ობიექტის ნაგლეჯის ზომა\n"
+
+#: controldata.c:630
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " დროები და თარიღები მთელი რიცხვებია?\n"
+
+#: controldata.c:634
+#, c-format
+msgid " data checksum version\n"
+msgstr " მონაცემების საკონტროლო ჯამის ვერსია\n"
+
+#: controldata.c:636
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "ვერ გაგრძელდება საჭირო კონტროლის ინფორმაციის გარეშე, დასრულება\n"
+
+#: controldata.c:651
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"ძველი და ახალი pg_controldata სწორებები ბათილია ან არ ემთხვევა\n"
+"სავარაუდოდ, ერთი კლასტერი 32-ბიტიანია, დანარჩენი კი 64\n"
+
+#: controldata.c:655
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "ძველი და ახალი pg_controldata ბლოკის ზომები ბათილია ან არ ემთხვევა\n"
+
+#: controldata.c:658
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "ძველი და ახალი pg_controldata მაქსიმალური ურთიერთობის სეგმენტის ზომები ბათილია ან არ ემთხვევა\n"
+
+#: controldata.c:661
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "ძველი და ახალი pg_controldata-ის WAL-ის ბლოკის ზომები არასწორია ან არ ემთხვევა\n"
+
+#: controldata.c:664
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "ძველი და ახალი pg_controldata-ის WAL-ის სეგმენტის ზომები არასწორია ან არ ემთხვევა\n"
+
+#: controldata.c:667
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "ძველი და ახალი pg_controldata-ის იდენტიფიკატორის მაქსიმალური სიგრძეები არასწორია ან არ ემთხვევა\n"
+
+#: controldata.c:670
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "ძველი და ახალი pg_controldata-ის მაქსიმალური ინდექსირებული სვეტები არასწორია ან არ ემთხვევა\n"
+
+#: controldata.c:673
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "ძველი და ახალი pg_controldata-ის TOAST-ის მაქსიმალური ნაგლეჯის ზომები არასწორია ან არ ემთხვევა\n"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "ძველი და ახალი pg_controldata-ის დიდი ობიექტის ნაგლეჯის ზომები არასწორია ან არ ემთხვევა\n"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "ძველი და ახალი pg_controldata-ის თარიღი/დროის შენახვის ტიპები არ ემთხვევა\n"
+
+#: controldata.c:694
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "ძველი კლასტერი არ იყენებს მონაცემთა შემოწმებას, მაგრამ ახალი აკეთებს\n"
+
+#: controldata.c:697
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "ძველი კლასტერი იყენებს მონაცემთა შემოწმებას, ახალი კი არა\n"
+
+#: controldata.c:699
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "ძველი და ახალი კლასტერების pg_controldata -ის საკონტროლო ჯამის ვერსიები არ ემთხვევა\n"
+
+#: controldata.c:710
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "ძველ გლობალურ/pg_control-ზე \".old\" სუფიქსის დამატება"
+
+#: controldata.c:715
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "%s-ის %s-ად გადარქმევის შეცდომა.\n"
+
+#: controldata.c:718
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"თუ გნებავთ, გაუშვათ ძველი კლასტერი, საჭიროა\n"
+"წაშალოთ .old სუფიქსი %s/global/pg_control.old-დან.\n"
+"იმის გამო, რომ გამოყენებული იყო \"ბმულის\" რეჟიმი, ძველი კლასტერის გაშვება მას შემდეგ, რაც\n"
+"ახალი სერვერი გაეშვა, ძველის გაშვება უსაფრთხო აღარაა.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "გლობალური ობიექტების დამპის შექმნა"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "მონაცემთა ბაზის სქემების დამპის შექმნა"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "%s გამოყენებით pg_ctl ვერსიის მონაცემები ვერ მივიღე: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "%s გამოყენებით pg_ctl ვერსია ვერ მივიღე\n"
+
+#: exec.c:108 exec.c:112
+#, c-format
+msgid "command too long\n"
+msgstr "ბრძანება ძალიან გრძელია\n"
+
+#: exec.c:114 util.c:37 util.c:310
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:153 pg_upgrade.c:279
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "ჟურნალის ფაილის გახსნის შეცდომა \"%s\": %m\n"
+
+#: exec.c:182
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*შეცდომა"
+
+#: exec.c:185
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "%s-ის შესრულების პრობლემა\n"
+
+#: exec.c:188
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"ავარიის მიზეზის გამოსავლენად გადაავლეთ თვალი \n"
+"\"%s\"-ის ან \"%s\"-ის ბოლო რამდენიმე ფაილს.\n"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"ავარიის მიზეზის გამოსავლენად გადაავლეთ თვალი\n"
+"\"%s\"-ის ბოლო რამდენიმე ხაზს.\n"
+
+#: exec.c:208 pg_upgrade.c:289
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "ჟურნალის ფაილში (%s) ჩაწერის შეცდომა: %m \n"
+
+#: exec.c:234
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "შეცდომა %s-ის წასაკითხად გახსნისას: %s\n"
+
+#: exec.c:261
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "მიმდინარე საქაღალდეში ჩაწერა/წაკითხვის წვდომები აუცილებელია.\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "\"%s\" შემოწმების შეცდომა: %s\n"
+
+#: exec.c:317 exec.c:383
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "%s საქაღალდეს არ წარმოადგენს\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "\"%s\" შემოწმება ვერ მოხერხდა: რეგულარული ფაილი არაა\n"
+
+#: exec.c:436
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "\"%s\" შემოწმების შეცდომა: გაშვების შეცდომა (წვდომა აკრძალულია)\n"
+
+#: exec.c:442
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "\"%s\" შემოწმების შეცდომა: გაშვების შეცდომა\n"
+
+#: exec.c:452
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr "\"%s\" შემოწმების შეცდომა: არასწორი ვერსია: ვიპოვე \"%s\" მოველოდი \"%s\"\n"
+
+#: file.c:43 file.c:63
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კლონირებისას (\"%s\"-დან \"%s\"-მდე): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კლონირებისას: ფაილის (\"%s\") გახსნის შეცდომა: %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კლონირებისას: ფაილის (\"%s\") შექმნის შეცდომა: %s\n"
+
+#: file.c:89 file.c:192
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კოპირებისას : ფაილის (\"%s\") გახსნის შეცდომა: %s\n"
+
+#: file.c:94 file.c:201
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კოპირებისას: ფაილის (\"%s\") შექმნის შეცდომა: %s\n"
+
+#: file.c:108 file.c:225
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კოპირებისას: ფაილის (\"%s\") წაკითხვის შეცდომა: %s\n"
+
+#: file.c:120 file.c:303
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კოპირებისას: ფაილში (\"%s\") ჩაწერის შეცდომა: %s\n"
+
+#: file.c:134
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კოპირებისას (\"%s\"-დან \"%s\"-მდე): %s\n"
+
+#: file.c:153
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "შეცდომა ურთიერთობის (%s.%s) ბმულის შექმნისას (\"%s\"-დან \"%s\"-მდე): %s\n"
+
+#: file.c:196
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კოპირებისას: ფაილის (\"%s\") აღმოჩენის შეცდომა: %s\n"
+
+#: file.c:228
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "შეცდომა ურთიერთობის \"%s.%s\" კოპირებისას: ფაილში \"%s\" ნაპოვნია ნაწილობრივი გვერდი\n"
+
+#: file.c:330 file.c:347
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "მონაცემების ძველ და ახალ საქაღალდეებს შორის ფაილის კლონირების შეცდომა: %s\n"
+
+#: file.c:343
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "ფაილის (%s) შექმნის შეცდომა: %s\n"
+
+#: file.c:354
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "ამ პლატფორმაზე კლონირება მხარდაჭერილი არაა\n"
+
+#: file.c:371
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"ძველი და ახალი მონაცემების საქაღალდეებს შუა მყარი ბმულის შექმნა შეუძლებელია: %s\n"
+"ბმულის რეჟიმში ძველი და ახალი მონაცემების საქაღალდეები ერთი და იგივე ფაილურ სისტემაზე უნდა იყოს.\n"
+
+#: function.c:129
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "საჭირო ბიბლიოთეკების არსებობის შემოწმება"
+
+#: function.c:167
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "ბიბლიოთეკის (\"%s\") ჩატვირთვის შეცდომა: %s"
+
+#: function.c:178
+#, c-format
+msgid "In database: %s\n"
+msgstr "მონაცემთა ბაზაში: %s\n"
+
+#: function.c:188
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"პროგრამის თქვენი ვერსია მიმართავს ჩატვირთვად ბიბლიოთეკები, რომლებიც თქვენს სისტემაში\n"
+"აღმოჩენილი არაა. შეგიძლიათ დაამატოთ ეს ბიბლიოთეკები ახალ ვარიანტში,\n"
+"ან წაშალოთ ფუნქციები, რომლებიც მათ იყენებენ, ძველი ვერსიიდან.\n"
+"პრობლემური ბიბლიოთეკების სიის ნახვა შეგიძლიათ ფაილში:\n"
+" %s\n"
+"\n"
+
+#: info.c:125
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "ურთიერთობის სახელები OID-ით %u ბაზაში \"%s\" არ ემთხვევა: ძველი სახელი \"%s.%s.\", ახალი კი \"%s.%s\"\n"
+
+#: info.c:145
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "შეცდომა ძველ და ახალ ცხრილებს შორის დამთხვევისას ბაზაში \"%s\"\n"
+
+#: info.c:226
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " რომელიც ინდექსია \"%s.%s\""
+
+#: info.c:236
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " რაც არის ინდექსი OID-ზე %u"
+
+#: info.c:248
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " რომელიც TOAST ცხრილია \"%s.%s\"-სთვის"
+
+#: info.c:256
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " რომელიც TOAST ცხრილია %u-ე OID-სთვის"
+
+#: info.c:260
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "ძველ კლასტერში ახალი ურთიერთობისთვის OID -ით %u ბაზაში \"%s\" დამთხვევა ვერ ვიპოვე: %s\n"
+
+#: info.c:263
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "ახალ კლასტერში ძველი ურთიერთობისთვის OID -ით %u ბაზაში \"%s\" დამთხვევა ვერ ვიპოვე: %s\n"
+
+#: info.c:287
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"საწყისი ბაზები:\n"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"სამიზნე ბაზები:\n"
+
+#: info.c:604
+#, c-format
+msgid "Database: %s\n"
+msgstr "ბაზა: %s\n"
+
+#: info.c:606
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:617
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:100
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: root-ით ვერ გაუშვებთ\n"
+
+#: option.c:167
+#, c-format
+msgid "invalid old port number\n"
+msgstr "არასწორი ძველი პორტის ნომერი\n"
+
+#: option.c:172
+#, c-format
+msgid "invalid new port number\n"
+msgstr "ახალი პორტის არასწორი ნომერი\n"
+
+#: option.c:198
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'.\n"
+
+#: option.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")\n"
+
+#: option.c:208
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "დამატებითი შეტყობინებების ჩართვა\n"
+
+#: option.c:226
+msgid "old cluster binaries reside"
+msgstr "ძველი კლასტერის გამშვები ფაილები მდებარეობს"
+
+#: option.c:228
+msgid "new cluster binaries reside"
+msgstr "ახალი კლასტერის გამშვები ფაილები მდებარეობს"
+
+#: option.c:230
+msgid "old cluster data resides"
+msgstr "ძველი კლასტერის მონაცემები მდებარეობს"
+
+#: option.c:232
+msgid "new cluster data resides"
+msgstr "ახალი კლასტერის მონაცემები მდებარეობს"
+
+#: option.c:234
+msgid "sockets will be created"
+msgstr "სოკეტები შეიქმნება"
+
+#: option.c:251 option.c:350
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "მიმდინარე საქაღალდის იდენტიფიკაციის პრობლემა\n"
+
+#: option.c:254
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "pg_upgrade-ის გაშვება Windows-ზე ახალი კლასტერის მონაცემების საქაღალდიდან შეუძლებელია\n"
+
+#: option.c:263
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade -ი PostgreSQL კლასტერს სხვა მთავარ ვერსიაზე განაახლებს.\n"
+"\n"
+
+#: option.c:264
+#, c-format
+msgid "Usage:\n"
+msgstr "გამოყენება:\n"
+
+#: option.c:265
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [პარამეტრი]...\n"
+"\n"
+
+#: option.c:266
+#, c-format
+msgid "Options:\n"
+msgstr "პარამერები:\n"
+
+#: option.c:267
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR ძველი კლასტერის გამშვები ფაილების საქაღალდე\n"
+
+#: option.c:268
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR ახალი კლასტერის გამშვები ფაილების საქაღალდე (ნაგულისხმები\n"
+" იგივე საქაღლდე, რაც pg_upgrade)\n"
+
+#: option.c:270
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check კლასტერების მხოლოდ შემოწმება. მონაცემები არ შეიცვლება\n"
+
+#: option.c:271
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR ძველი კლასტერის მონაცემთა საქაღალდე\n"
+
+#: option.c:272
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR ახალი კლასტერის მონაცემთა საქაღალდე\n"
+
+#: option.c:273
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM ერთდროულად გასაშვები პროცესების ან ნაკადების რიცხვი\n"
+
+#: option.c:274
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link ახალ კლასტერში ფაილების გადაბმა, კოპირების ნაცვლად\n"
+
+#: option.c:275
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync არ დაველოდო ცვლილებების დისკზე უსაფრთხოდ ჩაწერას\n"
+
+#: option.c:276
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, -old-options=OPTIONS სერვერზე გადასაცემი ძველი კლასტერის პარამეტრები\n"
+
+#: option.c:277
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, -new-options=OPTIONS სერვერზე გადასაცემი ახალი კლასტერის პარამეტრები\n"
+
+#: option.c:278
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, -old-port=PORT ძველი კლასტერის პორტის ნომერი (ნაგულისხმები %d)\n"
+
+#: option.c:279
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT ახალი კლასტერის პორტის ნომერი (ნაგულისხმები %d)\n"
+
+#: option.c:280
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain SQL და ჟურნალის ფაილებს დატოვება წარმატების შემდეგ \n"
+
+#: option.c:281
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR სოკეტის საქაღალდე (ნაგულისხმებია მიმდინარე.)\n"
+
+#: option.c:282
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=მომხმარებელი კლასტერის ზემომხმარებლის სახელი (ნაგულისხმები: \"%s\")\n"
+
+#: option.c:283
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose შიდა დამატებითი ჟურნალის ჩართვა\n"
+
+#: option.c:284
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის ჩვენება და გასვლა\n"
+
+#: option.c:285
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone ახალ კლასტერში ფაილების კლონირება კოპირების ნაცვლად \n"
+
+#: option.c:286
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: option.c:287
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"pg_upgrade-ის გაშვებამდე აუცილებელია:\n"
+" შექმნათ ახალი ბაზის კლასტერი (initdb-ის ახალი ვერსიით)\n"
+" გამორთოთ postmaster სერვისი ძველ კლასტერზე\n"
+" გამორთოთ postmaster სერვისი ახალ კლასტერზე\n"
+
+#: option.c:292
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"pg_upgrade-ის გაშვებისას საჭიროა შემდეგი ინფორმაციის გადაცემა:\n"
+" ძველი კლასტერის მონაცემების საქაღალდე (-d DATADIR)\n"
+" ახალი კლასტერის მონაცემების საქაღალდე (-D DATADIR)\n"
+" ძველი ვერსიის \"bin\" საქაღალდე (-b BINDIR)\n"
+" ახალი ვერსიის \"bin\" საქაღალდე (-B BINDIR)\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"მაგალითად:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"ან\n"
+
+#: option.c:303
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდომების შესახებ მიწერეთ: %s\n"
+
+#: option.c:316
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
+
+#: option.c:356
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"%s-ის საქაღალდის იდენტიფიკაცია აუცილებელია.\n"
+"გამოიყენეთ ბრძანების სტრიქონის %s პარამეტრი ან გარემოს ცვლადი %s.\n"
+
+#: option.c:408
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "საწყისი კლასტერის რეალური მონაცემთა საქაღალდის პოვნა"
+
+#: option.c:410
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "სამიზნე კლასტერის რეალური მონაცემთა საქაღალდის პოვნა"
+
+#: option.c:422
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "ვერ მივიღე მონაცემთა საქაღალდე %s გამოყენებით: %s\n"
+
+#: option.c:473
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "ფაილიდან (%2$s) %1$d-ე ხაზის წაკითხვა შეუძლებელია: %3$s\n"
+
+#: option.c:490
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "მომხმარებლის მიერ მოწოდებული ძველი პორტის ნომერი %hu შესწორებულია %hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "დამხმარე პროცესის შექმნა შეუძლებელია: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "დამხმარე ნაკადის შექმნა შეუძლებელია: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "%s()-ის შეცდომა: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "შვილი პროცესი არანორმალურად დასრულდა სტატუსით %d.\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "შვილი დამხმარე არანორმალურად დასრულდა სტატუსით %s.\n"
+
+#: pg_upgrade.c:102
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "საქაღალდის წვდომების წაკითხვა შეუძლებელია \"%s\": %s\n"
+
+#: pg_upgrade.c:134
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"განახლების შესრულება\n"
+"------------------\n"
+
+#: pg_upgrade.c:177
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "ახალი კლასტერისთვის შემდეგი OID დაყენება"
+
+#: pg_upgrade.c:186
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "მონაცემების საქაღალდის დისკთან სინქრონიზაცია"
+
+#: pg_upgrade.c:198
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"განახლება დასრულებულია\n"
+"----------------\n"
+
+#: pg_upgrade.c:231 pg_upgrade.c:244 pg_upgrade.c:251 pg_upgrade.c:258
+#: pg_upgrade.c:276 pg_upgrade.c:287
+#, c-format
+msgid "directory path for new cluster is too long\n"
+msgstr "ახალი კლასტერის საქაღალდის ბილიკი ძალიან გრძელია\n"
+
+#: pg_upgrade.c:265 pg_upgrade.c:267 pg_upgrade.c:269 pg_upgrade.c:271
+#, c-format
+msgid "could not create directory \"%s\": %m\n"
+msgstr "საქაღალდის (%s) შექმნის შეცდომა: %m\n"
+
+#: pg_upgrade.c:320
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: საკუთარი პროგრამის გამშვები ფაილის პოვნა შეუძლებელია\n"
+
+#: pg_upgrade.c:346
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"როგორც ჩანს, ძველ კლასტერს postmaster ჯერ კიდევ ემსახურება.\n"
+"გამორთეთ postmaster და თავიდან სცადეთ.\n"
+
+#: pg_upgrade.c:359
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"როგორც ჩანს, ახალ კლასტერს postmaster ემსახურება.\n"
+"გამორთეთ postmaster და თავიდან სცადეთ.\n"
+
+#: pg_upgrade.c:373
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "ახალ კლასტერში ყველა მწკრივის ანალიზი"
+
+#: pg_upgrade.c:386
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "ახალ კლასტერში ყველა მწკრივის გაყინვა"
+
+#: pg_upgrade.c:406
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "ახალი კლასტერში გლობალური ობიექტების აღდგენა"
+
+#: pg_upgrade.c:422
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "ახალ კლასტერში ბაზის სქემების აღდგენა"
+
+#: pg_upgrade.c:528
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "ფაილების წაშლა ახალი %s-დან"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "საქაღალდის (\"%s\") წაშლის შეცდომა\n"
+
+#: pg_upgrade.c:551
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "ძველი %s -ის კოპირება ახალ სერვერზე"
+
+#: pg_upgrade.c:577
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "უძველესი XID დაყენება ახალი კლასტერისთვის"
+
+#: pg_upgrade.c:585
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "ახალი კლასტერისთვის შემდეგი ტრანზაქციის ეპოქისა და ID-ის დაყენება"
+
+#: pg_upgrade.c:615
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "ახალი კლასტერისთვის შემდეგი მულტიტრანზაქციის წანაცვლებისა და ID-ის დაყენება"
+
+#: pg_upgrade.c:639
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "ახალ კლასტერში უძველესი მულტიტრანზაქციის ID-ის დაყენება"
+
+#: pg_upgrade.c:659
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "WAL არქივების გადატვირთვა"
+
+#: pg_upgrade.c:702
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "ახალ კლასტერში frozenxid და minmxid მთვლელების დაყენება"
+
+#: pg_upgrade.c:704
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "ახალ კლასტერში minmxid მთვლელის დაყენება"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "მომხმარებლის ურთიერთობის ფაილების კლონირება"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "მომხმარებლის ურთიერთობის ფაილების კოპირება"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "მომხმარებლის ურთიერთობის ფაილების გადაბმა"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "ძველი მონაცემთა ბაზა \"%s\" ახალ კლასტერში არ არის ნაპოვნი\n"
+
+#: relfilenode.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "შეცდომა ფაილის არსებობის შემოწმებისას \"%s.%s\" (\"%s\" \"%s\"): %s\n"
+
+#: relfilenode.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "გადაწერა \"%s\"-დან \"%s\"-მდე\n"
+
+#: relfilenode.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "კლონირება \"%s\"-დან \"%s\"-მდე\n"
+
+#: relfilenode.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "კოპირება \"%s\"-დან \"%s\"-მდე\n"
+
+#: relfilenode.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "ბმა \"%s\"-დან \"%s\"-მდე\n"
+
+#: server.c:39 server.c:143 util.c:220 util.c:250
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "შეცდომა. დასრულება\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s\n"
+msgstr "გაშვება: %s\n"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL ბრძანებსი შეცდომა\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "ვერსიის ფაილის გახსნის შეცდომა \"%s\": %m\n"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "ვერსიის ფაილის დამუშავების შეცდომა \"%s\"\n"
+
+#: server.c:291
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:295
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"ვერ ვუკავშირდები საწყის postmaster-ს, რომელიც შემდეგი ბრძანებით გაეშვა:\n"
+"%s\n"
+
+#: server.c:299
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"ვერ ვუკავშირდები სამიზნე postmaster-ს, რომელიც შემდეგი ბრძანებით გაეშვა:\n"
+"%s\n"
+
+#: server.c:313
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl-ის შეცდომა საწყისი სერვერის გაშვებისას ან შეერთების შეცდომა\n"
+
+#: server.c:315
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl-ის შეცდომა სამიზნე სერვერის გაშვებისას ან შეერთების შეცდომა\n"
+
+#: server.c:360
+#, c-format
+msgid "out of memory\n"
+msgstr "არასაკმარისი მეხსიერება\n"
+
+#: server.c:373
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "libpq-ის გარემოს ცვლად %s-ს არალოკალური სერვერის მნიშვნელობა: %s გააჩნია\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"ცხრილის სივრცეების გამოყენებისას იგივე სისტემური კატალოგის \n"
+"ვერსიის მქონეზე/მქონემდე განახლება შეუძლებელია.\n"
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "ცხრილების სივრცის საქაღალდე \"%s\" არ არსებობს\n"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "ცხრილების სივრცის საქაღალდის \"%s\" აღმოჩენის შეცდომა: %s\n"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "ცხრილების სივრცის ბილიკი %s საქაღალდეს არ წარმოადგენს\n"
+
+#: util.c:52 util.c:55 util.c:127 util.c:160
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:95
+#, c-format
+msgid "could not access directory \"%s\": %m\n"
+msgstr "საქაღალდის (%s) წვდომის შეცდომა: %m\n"
+
+#: util.c:158
+#, c-format
+msgid "%-*s\n"
+msgstr "%-*s\n"
+
+#: util.c:259
+#, c-format
+msgid "ok"
+msgstr "დიახ"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "შეუთავსებელი \"line\" მონაცემთა ტიპის შემოწმება"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"თქვენი პაკეტი მომხმარებლის ცხრილებში \"line\" მონაცემის ტიპს შეიცავს.\n"
+"ეს მონაცემის ტიპი შეიცვალა შიგნიდან. ასევე შეცვალა მისი შეყვანა/გამოყვანის ფორმატი. ამიტომ თქვენი\n"
+"კლასტერის ძველი ვერსიის განახლება ამჟამად შეუძლებელია. შეგიძლიათ\n"
+"წაშალოთ ეს სვეტები და თავიდან გაუშვათ განახლება.\n"
+"პრობლენული სვეტების სია შეგიძლიათ იხილოთ ფაილში:\n"
+" %s\n"
+"\n"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "არასწორი \"unknown\" მომხმარებლის სვეტების შემოწმება"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"პროგრამის თქვენი ვერსია მოხმარებლის ცხრილებში მონაცემების \"unknown\" ტიპს შეიცავს.\n"
+"ეს მონაცემის ტიპი ცხრილებში დაშვებული აღარაა, ასე, რომ ამ კლასტერის განახლება ამჟამად\n"
+"შეუძლებელია შეგიძლიათ წაშალოთ პრობლემული სვეტები და განახლება თავიდან გაუშვათ.\n"
+"პრობლემური სვეტების ნახვა შეგიძლიათ ფაილში:\n"
+" %s\n"
+"\n"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "ჰეშის ინდექსების შემოწმება"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "გაფრთხილება"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"პროგრამის თქვენი ვერსია ჰეშ ინდექსებს შეიცავს ამ ინდექსებს განსხვავებული\n"
+"შიდა ფორმატები გააჩნიათ ძველ და ახალ კლასტერებს შორის, ასე რომ, საჭიროა მათი\n"
+"რეინდექსი REINDEX ბრძანების საშუალებით. განახლების შემდეგ\n"
+"REINDEX-ის ინსტრუქციებიც გადმოგეცემათ.\n"
+"\n"
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"პროგრამის თქვენი ვერსია ჰეშ ინდექსებშ შეიცავს. ამ ინდექსებს თქვენს ძველ\n"
+"და ახალ კლასტერებში განსხვავებული შიდა ფორმატი გააჩნია, ასე რომ, საჭიროა მათი\n"
+"რეინდექსი REINDEX ბრძანების საშუალებით. ფაილი\n"
+" %s\n"
+", შესრულებული psql-ით მონაცემთა ბაზის ზემომხმარებლის მიერ, თავიდან შექნის ყველა\n"
+"არასწორ ინდექსს. მანამდე კი, ამ ინდექსებიდან არც ერთი გამოყენებული არ იქნება.\n"
+"\n"
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "არასწორი \"sql_identifier\" მომხმარებლის სვეტების შემოწმება"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"პროგრამის თქვენი ვერსია მომხმარებლის ცხრილებში \"sql_identifier\" მონაცემების ტიპს შეიცავს.\n"
+"მონაცემის ამ ტიპის დისკზე შენახვის ფორმატი შეიცვალა, ასე რომ, ამჟამად ამ კლასტერის განახლება შეუძლებელია.\n"
+"შეგიძლიათ წაშალოთ პრობლემური სვეტები და თავიდან გაუშვათ განახლება.\n"
+"პრობლემური ცხრილების სიის ხილვა შეგიძლიათ ფაილში:\n"
+" %s\n"
+"\n"
+
+#: version.c:403
+#, c-format
+msgid "Checking for extension updates"
+msgstr "გაფართოების განახლებების შემოწმება"
+
+#: version.c:455
+#, c-format
+msgid "notice"
+msgstr "გაფრთხილება"
+
+#: version.c:456
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"პროგრამის თქვენი ვერსია შეიცავს გაფართოებას, რომელიც უნდა განახლდეს\n"
+"ALTER EXTENSION ბრძანებით. ფაილი\n"
+" %s\n"
+", როცა ის შესრულდება psql-ით ზემომხმარებლის მიერ, განაახლებს ამ\n"
+"გაფართოებებს.\n"
+"\n"
diff --git a/src/bin/pg_upgrade/po/ko.po b/src/bin/pg_upgrade/po/ko.po
new file mode 100644
index 0000000..9e5c59e
--- /dev/null
+++ b/src/bin/pg_upgrade/po/ko.po
@@ -0,0 +1,1964 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:48+0000\n"
+"PO-Revision-Date: 2023-04-05 16:15+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"옛 운영 서버에서 일관성 검사를 진행합니다.\n"
+"------------------------------------------\n"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"일관성 검사 수행중\n"
+"------------------\n"
+
+#: check.c:218
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*클러스터 호환성*\n"
+
+#: check.c:226
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"여기서 pg_upgrade 작업을 실패한다면, 재시도 하기 전에 먼저\n"
+"새 클러스터를 처음부터 다시 만들어 진행해야 합니다.\n"
+
+#: check.c:267
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"pg_upgrade 작업에서는 최적화기를 위한 통계 정보까지 업그레이드\n"
+"하지는 않습니다. 새 서버가 실행 될 때, 다음 명령을 수행하길 권합니다:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:273
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"아래 스크립트를 실행하면, 옛 클러스터 자료를 지울 것입니다:\n"
+" %s\n"
+
+#: check.c:278
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"옛 클러스터 자료 파일을 지우는 스크립트를 만들지 못했습니다.\n"
+"사용자 정의 테이블스페이스나, 새 클러스터가 옛 클러스터 안에\n"
+"있기 때문입니다. 옛 클러스터 자료는 직접 찾아서 지우세요.\n"
+
+#: check.c:290
+#, c-format
+msgid "Checking cluster versions"
+msgstr "클러스터 버전 검사 중"
+
+#: check.c:302
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later.\n"
+msgstr "이 도구는 PostgreSQL %s 과 그 이상 버전에서 사용할 수 있습니다.\n"
+
+#: check.c:307
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "이 도구는 PostgreSQL %s 버전으로만 업그레이드 할 수 있습니다.\n"
+
+#: check.c:316
+#, c-format
+msgid ""
+"This utility cannot be used to downgrade to older major PostgreSQL "
+"versions.\n"
+msgstr ""
+"이 도구는 더 낮은 메이져 PostgreSQL 버전으로 다운그레이드하는데 사용할 수 없"
+"습니다.\n"
+
+#: check.c:321
+#, c-format
+msgid ""
+"Old cluster data and binary directories are from different major versions.\n"
+msgstr "옛 클러스터 자료와 실행파일 디렉터리가 서로 메이져 버전이 다릅니다.\n"
+
+#: check.c:324
+#, c-format
+msgid ""
+"New cluster data and binary directories are from different major versions.\n"
+msgstr "새 클러스터 자료와 실행파일 디렉터리가 서로 메이져 버전이 다릅니다.\n"
+
+#: check.c:339
+#, c-format
+msgid ""
+"When checking a live server, the old and new port numbers must be "
+"different.\n"
+msgstr ""
+"운영 서버 검사를 할 때는, 옛 서버, 새 서버의 포트를 다르게 지정해야 합니다.\n"
+
+#: check.c:354
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr ""
+"\"%s\" 데이터베이스의 인코딩이 서로 다릅니다: 옛 서버 \"%s\", 새 서버 \"%s"
+"\"\n"
+
+#: check.c:359
+#, c-format
+msgid ""
+"lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr ""
+"\"%s\" 데이터베이스의 lc_collate 값이 서로 다릅니다: 옛 서버 \"%s\", 새 서버 "
+"\"%s\"\n"
+
+#: check.c:362
+#, c-format
+msgid ""
+"lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr ""
+"\"%s\" 데이터베이스의 lc_ctype 값이 서로 다릅니다: 옛 서버 \"%s\", 새 서버 "
+"\"%s\"\n"
+
+#: check.c:365
+#, c-format
+msgid ""
+"locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr ""
+"\"%s\" 데이터베이스의 로케일 제공자가 서로 다릅니다: 옛 서버 \"%s\", 새 서버 "
+"\"%s\"\n"
+
+#: check.c:372
+#, c-format
+msgid ""
+"ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr ""
+"\"%s\" 데이터베이스의 ICU 로케일 값이 서로 다릅니다: 옛 서버 \"%s\", 새 서버 "
+"\"%s\"\n"
+
+#: check.c:447
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr ""
+"\"%s\" 새 데이터베이스 클러스터가 비어있지 않습니다.\n"
+" -- \"%s.%s\" 릴레이션을 찾았음\n"
+
+#: check.c:499
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "새 클러스터 테이블스페이스 디렉터리 검사 중"
+
+#: check.c:510
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "새 클러스터 테이블스페이스 디렉터리가 이미 있음: \"%s\"\n"
+
+#: check.c:543
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i."
+"e. %s\n"
+msgstr ""
+"\n"
+"경고: 새 데이터 디렉터리는 옛 데이터 디렉터리 안에 둘 수 없습니다, 예: %s\n"
+
+#: check.c:567
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data "
+"directory, i.e. %s\n"
+msgstr ""
+"\n"
+"경고: 사용자 정의 테이블스페이스 위치를 데이터 디렉터리 안에 둘 수 없습니다, "
+"예: %s\n"
+
+#: check.c:577
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "옛 클러스터를 지우는 스크립트를 만듭니다"
+
+#: check.c:580 check.c:755 check.c:875 check.c:974 check.c:1105 check.c:1184
+#: check.c:1453 file.c:338 function.c:165 option.c:465 version.c:116
+#: version.c:292 version.c:429
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "\"%s\" 파일을 열 수 없음: %s\n"
+
+#: check.c:631
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "\"%s\" 파일에 실행 권한을 추가 할 수 없음: %s\n"
+
+#: check.c:651
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "데이터베이스 사용자가 설치 작업을 한 사용자인지 확인합니다"
+
+#: check.c:667
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "\"%s\" 데이터베이스 사용자는 설치 작업을 한 사용자가 아닙니다\n"
+
+#: check.c:678
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "사용자 수를 확인할 수 없음\n"
+
+#: check.c:686
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "새 클러스터에서만 설치 사용 사용자가 정의될 수 있음\n"
+
+#: check.c:716
+#, c-format
+msgid "Checking database connection settings"
+msgstr "데이터베이스 연결 설정을 확인 중"
+
+#: check.c:742
+#, c-format
+msgid ""
+"template0 must not allow connections, i.e. its pg_database.datallowconn must "
+"be false\n"
+msgstr ""
+"template0 데이터베이스 접속을 금지해야 합니다. 예: 해당 데이터베이스의 "
+"pg_database.datallowconn 값이 false여야 합니다.\n"
+
+#: check.c:772 check.c:897 check.c:999 check.c:1125 check.c:1206 check.c:1265
+#: check.c:1326 check.c:1357 check.c:1476 function.c:187 version.c:192
+#: version.c:232 version.c:378
+#, c-format
+msgid "fatal\n"
+msgstr "치명적 오류\n"
+
+#: check.c:773
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"template0이 아닌 모든 데이터베이스는 연결을 허용해야하며, 즉 \n"
+"pg_database.datallowconn 값이 true여야합니다. 설치된 데이터베이스\n"
+"중 pg_database.datallowconn 값이 false로 설정된 template0이 아닌\n"
+"데이터베이스가 있습니다. template0이 아닌 데이터베이스의 모든 연결을\n"
+"허용하거나 연결을 허용하지 않는 데이터베이스를 삭제하는 것이 좋습니다.\n"
+"문제가 있는 데이터베이스 목록은 다음 파일에 기록해 두었습니다:\n"
+" %s\n"
+"\n"
+
+#: check.c:798
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "미리 준비된 트랜잭션을 확인 중"
+
+#: check.c:807
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "옛 클러스터에 미리 준비된 트랜잭션이 있음\n"
+
+#: check.c:809
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "새 클러스터에 미리 준비된 트랜잭션이 있음\n"
+
+#: check.c:835
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "contrib/isn 모듈의 bigint 처리가 서로 같은지 확인 중"
+
+#: check.c:898
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"설치되어 있는 \"contrib/isn\" 모듈은 bigint 자료형을 사용합니다.\n"
+"이 bigint 자료형의 처리 방식이 새 버전과 옛 버전 사이 호환성이 없어,\n"
+"이 클러스터 업그레이드를 할 수 없습니다. 먼저 수동으로 데이터베이스를 \n"
+"덤프하고, 해당 모듈을 삭제하고, 업그레이드 한 뒤 다시 덤프 파일을 이용해\n"
+"복원할 수 있습니다. 문제가 있는 함수는 아래 파일 안에 있습니다:\n"
+" %s\n"
+"\n"
+
+#: check.c:921
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "사용자 정의 postfix 연산자를 검사 중"
+
+#: check.c:1000
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"더 이상 사용자 정의 postfix 연산자를 지원하지 않습니다.\n"
+"해당 연산자를 지우고, prefix 연산자로 바꾸거나, 함수 호출\n"
+"방식으로 바꾸는 것을 고려해 보십시오.\n"
+"관련 사용자 정의 postfix 연산자 목록은 아래 파일 안에 있습니다:\n"
+" %s\n"
+"\n"
+
+#: check.c:1024
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "불완전한 다형 함수를 확인합니다"
+
+#: check.c:1126
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement"
+"\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"이 서버에는 \"anyarray\" 또는 \"anyelement\" 유형의 인수를 사용하는 \n"
+"내부 다형 함수를 참조하는 사용자 정의 객체가 있습니다. \n"
+"이러한 사용자 정의 객체는 업그레이드하기 전에 삭제하고, \n"
+"\"anycompatiblearray\" 또는 \"anycompatible\" 유형의 새로운 대응 함수를\n"
+"참조하도록 변경한 후 다시 복원해야합니다. 문제가 있는 객체 목록은\n"
+"다음 파일 안에 있습니다:\n"
+" %s\n"
+"\n"
+
+#: check.c:1151
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "WITH OIDS 옵션 있는 테이블 확인 중"
+
+#: check.c:1207
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"더 이상 WITH OIDS 옵션을 사용하는 테이블을 지원하지 않습니다.\n"
+"먼저 oid 칼럼이 있는 기존 테이블을 대상으로 다음 명령을 실행해서\n"
+"이 옵션을 뺄 것을 고려해 보십시오.\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"관련 테이블 목록은 아래 파일 안에 있습니다:\n"
+" %s\n"
+"\n"
+
+#: check.c:1235
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "사용자가 만든 테이블에 내장 복합 자료형을 쓰는지 확인 중"
+
+#: check.c:1266
+#, c-format
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"해당 데이터베이스 사용자가 만든 테이블에서 내장 복합 자료형을 사용하고 있습니"
+"다.\n"
+"이 자료형의 OID 값이 PostgreSQL 버전별로 다를 수 있어,\n"
+"업그레이드 할 수 없습니다. 해당 칼럼을 삭제한 뒤 다시 업그레이드하세요.\n"
+"해당 칼럼이 있는 테이블 목록은 다음 파일 안에 있습니다:\n"
+" %s\n"
+"\n"
+
+#: check.c:1294
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "사용자가 만든 테이블에 reg* 자료형을 쓰는지 확인 중"
+
+#: check.c:1327
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"옛 서버에서 사용자가 만든 테이블에서 reg* 자료형을 사용하고 있습니다.\n"
+"이 자료형들은 pg_upgrade 명령으로 내정된 시스템 OID를 사용하지 못할 수\n"
+"있습니다. 그래서 업그레이드 작업을 진행할 수 없습니다.\n"
+"사용하고 있는 칼럼을 지우고 업그레이드 작업을 다시 시도하세요.\n"
+"이런 자료형을 사용하는 칼럼들은 아래 파일 안에 있습니다:\n"
+" %s\n"
+"\n"
+
+#: check.c:1349
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "\"jsonb\" 자료형 호환성 확인 중"
+
+#: check.c:1358
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"사용자 테이블에서 \"jsonb\" 자료형을 사용하고 있습니다.\n"
+"9.4 베타 비전 이후 \"jsonb\" 내부 자료 구조가 바뀌었습니다.\n"
+"그래서, 업그레이드 작업이 불가능합니다.\n"
+"해당 칼럼들을 지우고 업그레이드 작업을 진행하세요\n"
+"해당 자료형을 사용하는 칼럼들은 아래 파일 안에 있습니다:\n"
+" %s\n"
+"\n"
+
+#: check.c:1380
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "\"pg_\"로 시작하는 롤 확인 중"
+
+#: check.c:1390
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "옛 클러스터에 \"pg_\" 시작하는 롤이 있습니다.\n"
+
+#: check.c:1392
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "새 클러스터에 \"pg_\"로 시작하는 롤이 있습니다.\n"
+
+#: check.c:1413
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "사용자 정의 인코딩 변환규칙을 검사 중"
+
+#: check.c:1477
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"사용자 정의 인코딩 변환 규칙용 변환 함수 매개 변수가\n"
+"PostgreSQL 14 비전 이후 바뀌었습니다.\n"
+"그래서, 업그레이드 작업이 불가능합니다.\n"
+"먼저 이런 변환 규칙을 옛 서버에서 지우고 다시 시도하세요.\n"
+"해당 변환 규칙 목록은 아래 파일 안에 있습니다:\n"
+" %s\n"
+"\n"
+
+#: check.c:1504
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "현재 로케일을 확인 할 수 없음\n"
+
+#: check.c:1513
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "\"%s\"용 시스템 로케일 이름을 알 수 없음\n"
+
+#: check.c:1519
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "\"%s\" 옛 로케일을 복원할 수 없음\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "%s 사용하는 컨트롤 자료를 구할 수 없음: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: 데이터베이스 클러스터 상태 문제\n"
+
+#: controldata.c:157
+#, c-format
+msgid ""
+"The source cluster was shut down while in recovery mode. To upgrade, use "
+"\"rsync\" as documented or shut it down as a primary.\n"
+msgstr ""
+"원본 클러스터는 복구 모드(대기 서버 모드나, 복구 중) 상태에서 중지 되었습니"
+"다. 업그레이드 하려면, 문서에 언급한 것 처럼 \"rsync\"를 사용하든가, 그 서버"
+"를 운영 서버 모드로 바꾼 뒤 중지하고 작업하십시오.\n"
+
+#: controldata.c:159
+#, c-format
+msgid ""
+"The target cluster was shut down while in recovery mode. To upgrade, use "
+"\"rsync\" as documented or shut it down as a primary.\n"
+msgstr ""
+"대상 클러스터는 복구 모드(대기 서버 모드나, 복구 중) 상태에서 중지 되었습니"
+"다. 업그레이드 하려면, 문서에 언급한 것 처럼 \"rsync\"를 사용하든가, 그 서버"
+"를 운영 서버 모드로 바꾼 뒤 중지하고 작업하십시오.\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "원본 클러스터는 정상적으로 종료되어야 함\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "대상 클러스터는 정상 종료되어야 함\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "원본 클러스터에 클러스터 상태 정보가 없음:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "대상 클러스터에 클러스터 상태 정보가 없음:\n"
+
+#: controldata.c:209 dump.c:50 pg_upgrade.c:440 pg_upgrade.c:477
+#: relfilenode.c:231 server.c:34
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal 문제\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: controldata 복원 문제\n"
+
+#: controldata.c:571
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "옛 클러스터에 필요한 컨트롤 정보가 몇몇 빠져있음:\n"
+
+#: controldata.c:574
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "새 클러스터에 필요한 컨트롤 정보가 몇몇 빠져있음:\n"
+
+#: controldata.c:577
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " 체크포인트 다음 XID\n"
+
+#: controldata.c:580
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " 마지막 체크포인트 다음 OID\n"
+
+#: controldata.c:583
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " 마지막 체크포인트 다음 MultiXactId\n"
+
+#: controldata.c:587
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " 마지막 체크포인트 제일 오래된 MultiXactId\n"
+
+#: controldata.c:590
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " 마지막 체크포인트 제일 오래된 XID\n"
+
+#: controldata.c:593
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " 마지막 체크포인트 다음 MultiXactOffset\n"
+
+#: controldata.c:596
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " 리셋 뒤 첫 WAL 조각\n"
+
+#: controldata.c:599
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " float8 인자 처리 방식\n"
+
+#: controldata.c:602
+#, c-format
+msgid " maximum alignment\n"
+msgstr " 최대 정렬\n"
+
+#: controldata.c:605
+#, c-format
+msgid " block size\n"
+msgstr " 블록 크기\n"
+
+#: controldata.c:608
+#, c-format
+msgid " large relation segment size\n"
+msgstr " 대형 릴레이션 조각 크기\n"
+
+#: controldata.c:611
+#, c-format
+msgid " WAL block size\n"
+msgstr " WAL 블록 크기\n"
+
+#: controldata.c:614
+#, c-format
+msgid " WAL segment size\n"
+msgstr " WAL 조각 크기\n"
+
+#: controldata.c:617
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " 최대 식별자 길이\n"
+
+#: controldata.c:620
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " 최대 인덱스 칼럼 수\n"
+
+#: controldata.c:623
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " 최대 토스트 조각 크기\n"
+
+#: controldata.c:627
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " 대형 객체 조각 크기\n"
+
+#: controldata.c:630
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " date/time 자료형을 정수로?\n"
+
+#: controldata.c:634
+#, c-format
+msgid " data checksum version\n"
+msgstr " 자료 체크섬 버전\n"
+
+#: controldata.c:636
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "필요한 컨트롤 정보 없이는 진행할 수 없음, 중지 함\n"
+
+#: controldata.c:651
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"클러스터간 pg_controldata 정렬이 서로 다릅니다.\n"
+"하나는 32비트고, 하나는 64비트인 경우 같습니다\n"
+
+#: controldata.c:655
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "클러스터간 pg_controldata 블록 크기가 서로 다릅니다.\n"
+
+#: controldata.c:658
+#, c-format
+msgid ""
+"old and new pg_controldata maximum relation segment sizes are invalid or do "
+"not match\n"
+msgstr "클러스터간 pg_controldata 최대 릴레이션 조각 크가가 서로 다릅니다.\n"
+
+#: controldata.c:661
+#, c-format
+msgid ""
+"old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "클러스터간 pg_controldata WAL 블록 크기가 서로 다릅니다.\n"
+
+#: controldata.c:664
+#, c-format
+msgid ""
+"old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "클러스터간 pg_controldata WAL 조각 크기가 서로 다릅니다.\n"
+
+#: controldata.c:667
+#, c-format
+msgid ""
+"old and new pg_controldata maximum identifier lengths are invalid or do not "
+"match\n"
+msgstr "클러스터간 pg_controldata 최대 식별자 길이가 서로 다릅니다.\n"
+
+#: controldata.c:670
+#, c-format
+msgid ""
+"old and new pg_controldata maximum indexed columns are invalid or do not "
+"match\n"
+msgstr "클러스터간 pg_controldata 최대 인덱스 칼럼수가 서로 다릅니다.\n"
+
+#: controldata.c:673
+#, c-format
+msgid ""
+"old and new pg_controldata maximum TOAST chunk sizes are invalid or do not "
+"match\n"
+msgstr "클러스터간 pg_controldata 최대 토스트 조각 크기가 서로 다릅니다.\n"
+
+#: controldata.c:678
+#, c-format
+msgid ""
+"old and new pg_controldata large-object chunk sizes are invalid or do not "
+"match\n"
+msgstr "클러스터간 pg_controldata 대형 객체 조각 크기가 서로 다릅니다.\n"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "클러스터간 pg_controldata date/time 저장 크기가 서로 다릅니다.\n"
+
+#: controldata.c:694
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr ""
+"옛 클러스터는 데이터 체크섬 기능을 사용하지 않고, 새 클러스터는 사용하고 있습"
+"니다.\n"
+
+#: controldata.c:697
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr ""
+"옛 클러스터는 데이터 체크섬 기능을 사용하고, 새 클러스터는 사용하고 있지 않습"
+"니다.\n"
+
+#: controldata.c:699
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "클러스터간 pg_controldata 체크섬 버전이 서로 다릅니다.\n"
+
+#: controldata.c:710
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "옛 global/pg_control 파일에 \".old\" 이름을 덧붙입니다."
+
+#: controldata.c:715
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "%s 이름을 %s 이름으로 바꿀 수 없음.\n"
+
+#: controldata.c:718
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"옛 버전으로 옛 클러스터를 사용해서 서버를 실행하려면,\n"
+"%s/global/pg_control.old 파일의 이름을 \".old\" 빼고 바꾸어\n"
+"사용해야합니다. 업그레이드를 \"link\" 모드로 했기 때문에,\n"
+"한번이라도 새 버전의 서버가 이 클러스터를 이용해서 실행되었다면,\n"
+"이 파일이 더 이상 안전하지 않기 때문입니다.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "전역 객체 덤프를 만듭니다"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "데이터베이스 스키마 덤프를 만듭니다"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "%s 명령을 사용해서 pg_ctl 버전 자료를 구할 수 없음: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "%s에서 pg_ctl 버전을 알 수 없음\n"
+
+#: exec.c:108 exec.c:112
+#, c-format
+msgid "command too long\n"
+msgstr "명령이 너무 긺\n"
+
+#: exec.c:114 util.c:37 util.c:310
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:153 pg_upgrade.c:279
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "\"%s\" 로그 파일을 열 수 없음: %m\n"
+
+#: exec.c:182
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*실패*"
+
+#: exec.c:185
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "\"%s\" 실행에서 문제 발생\n"
+
+#: exec.c:188
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"\"%s\" 또는 \"%s\" 파일의 마지막 부분을 살펴보면\n"
+"이 문제를 풀 실마리가 보일 것입니다.\n"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"\"%s\" 파일의 마지막 부분을 살펴보면\n"
+"이 문제를 풀 실마리가 보일 것입니다.\n"
+
+#: exec.c:208 pg_upgrade.c:289
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "\"%s\" 로그 파일을 쓸 수 없음: %m\n"
+
+#: exec.c:234
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "\"%s\" 파일을 읽기 위해 열 수 없습니다: %s\n"
+
+#: exec.c:261
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "현재 디렉터리의 읽기 쓰기 권한을 부여하세요.\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "\"%s\" 검사 실패: %s\n"
+
+#: exec.c:317 exec.c:383
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" 파일은 디렉터리가 아닙니다.\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "\"%s\" 검사 실패: 일반 파일이 아닙니다\n"
+
+#: exec.c:436
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "\"%s\" 검사 실패: 실행할 수 없음 (접근 권한 없음)\n"
+
+#: exec.c:442
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "\"%s\" 검사 실패: 실행할 수 없음\n"
+
+#: exec.c:452
+#, c-format
+msgid ""
+"check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr "\"%s\" 검사 실패: 잘못된 버전: 현재 \"%s\", 기대값 \"%s\"\n"
+
+#: file.c:43 file.c:63
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레이션 클론 중 오류: %s\n"
+
+#: file.c:50
+#, c-format
+msgid ""
+"error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "\"%s.%s\" 릴레이션 클론 중 오류: \"%s\" 파일을 열 수 없음: %s\n"
+
+#: file.c:55
+#, c-format
+msgid ""
+"error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "\"%s.%s\" 릴레이션 클론 중 오류: \"%s\" 파일을 만들 수 없음: %s\n"
+
+#: file.c:89 file.c:192
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일을 열 수 없음: %s\n"
+
+#: file.c:94 file.c:201
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일을 만들 수 없음: %s\n"
+
+#: file.c:108 file.c:225
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일을 읽을 수 없음: %s\n"
+
+#: file.c:120 file.c:303
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일을 쓸 수 없음: %s\n"
+
+#: file.c:134
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레이션 복사 중 오류: %s\n"
+
+#: file.c:153
+#, c-format
+msgid ""
+"error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레이션 링크 만드는 중 오류: %s\n"
+
+#: file.c:196
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr ""
+"\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일 상태 정보를 알 수 없음: %s\n"
+
+#: file.c:228
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일에 페이지가 손상되었음\n"
+
+#: file.c:330 file.c:347
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "옛 데이터 디렉터리와 새 데이터 디렉터리 사이 파일 클론 실패: %s\n"
+
+#: file.c:343
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "\"%s\" 파일을 만들 수 없음: %s\n"
+
+#: file.c:354
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "이 운영체제는 파일 클론 기능을 제공하지 않습니다.\n"
+
+#: file.c:371
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file "
+"system.\n"
+msgstr ""
+"데이터 디렉터리간 하드 링크를 만들 수 없음: %s\n"
+"하드 링크를 사용하려면, 두 디렉터리가 같은 시스템 볼륨 안에 있어야 합니다.\n"
+
+#: function.c:129
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "필요한 라이브러리 확인 중"
+
+#: function.c:167
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "\"%s\" 라이브러리 로드 실패: %s"
+
+#: function.c:178
+#, c-format
+msgid "In database: %s\n"
+msgstr "데이터베이스: %s\n"
+
+#: function.c:188
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"옛 버전에는 있고, 새 버전에는 없는 라이브러리들이 있습니다. 새 버전에\n"
+"해당 라이브러리들을 설치하거나, 옛 버전에서 해당 라이브러리를 삭제하고,\n"
+"업그레이드 작업을 해야합니다. 문제가 있는 라이브러리들은 다음과 같습니다:\n"
+" %s\n"
+"\n"
+
+#: info.c:125
+#, c-format
+msgid ""
+"Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s"
+"\", new name \"%s.%s\"\n"
+msgstr ""
+"%u OID에 대한 \"%s\" 데이터베이스 이름이 서로 다릅니다: 옛 이름: \"%s.%s\", "
+"새 이름: \"%s.%s\"\n"
+
+#: info.c:145
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "\"%s\" 데이터베이스 내 테이블 이름이 서로 다릅니다:\n"
+
+#: info.c:226
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " 해당 인덱스: \"%s.%s\""
+
+#: info.c:236
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " 해당 인덱스의 OID: %u"
+
+#: info.c:248
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " \"%s.%s\" 객체의 토스트 테이블"
+
+#: info.c:256
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " 해당 토스트 베이블의 OID: %u"
+
+#: info.c:260
+#, c-format
+msgid ""
+"No match found in old cluster for new relation with OID %u in database \"%s"
+"\": %s\n"
+msgstr ""
+"새 클러스터의 %u OID (해당 데이터베이스: \"%s\")가 옛 클러스터에 없음: %s\n"
+
+#: info.c:263
+#, c-format
+msgid ""
+"No match found in new cluster for old relation with OID %u in database \"%s"
+"\": %s\n"
+msgstr ""
+"옛 클러스터의 %u OID (해당 데이터베이스: \"%s\")가 새 클러스터에 없음: %s\n"
+
+#: info.c:287
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"원본 데이터베이스:\n"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"대상 데이터베이스:\n"
+
+#: info.c:604
+#, c-format
+msgid "Database: %s\n"
+msgstr "데이터베이스: %s\n"
+
+#: info.c:606
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:617
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:100
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: root 권한으로 실행할 수 없음\n"
+
+#: option.c:167
+#, c-format
+msgid "invalid old port number\n"
+msgstr "잘못된 옛 포트 번호\n"
+
+#: option.c:172
+#, c-format
+msgid "invalid new port number\n"
+msgstr "잘못된 새 포트 번호\n"
+
+#: option.c:198
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "보다 자세한 사용법은 \"%s --help\" 명령을 이용하세요.\n"
+
+#: option.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "너무 많은 명령행 인자를 지정 했음 (시작: \"%s\")\n"
+
+#: option.c:208
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "작업 내역을 자세히 봄\n"
+
+#: option.c:226
+msgid "old cluster binaries reside"
+msgstr "옛 클러스터 실행파일 위치"
+
+#: option.c:228
+msgid "new cluster binaries reside"
+msgstr "새 클러스터 실팽파일 위치"
+
+#: option.c:230
+msgid "old cluster data resides"
+msgstr "옛 클러스터 자료 위치"
+
+#: option.c:232
+msgid "new cluster data resides"
+msgstr "새 클러스터 자료 위치"
+
+#: option.c:234
+msgid "sockets will be created"
+msgstr "소켓 파일 만들 위치"
+
+#: option.c:251 option.c:350
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "현재 디렉터리 위치를 알 수 없음\n"
+
+#: option.c:254
+#, c-format
+msgid ""
+"cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr ""
+"윈도우즈 환경에서는 pg_upgrade 명령은 새 클러스터 데이터 디렉터리 안에서는 실"
+"행할 수 없음\n"
+
+#: option.c:263
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"새 데이터 클러스터 버전과 pg_upgrade 버전의 메이저 버전이 서로 다릅니다.\n"
+"\n"
+
+#: option.c:264
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: option.c:265
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [옵션]...\n"
+"\n"
+
+#: option.c:266
+#, c-format
+msgid "Options:\n"
+msgstr "옵션:\n"
+
+#: option.c:267
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR 옛 클러스터 실행 파일의 디렉터리\n"
+
+#: option.c:268
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR 새 클러스터 실행 파일의 디렉터리 (기본값:\n"
+" pg_upgrade가 있는 디렉터리)\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check 실 작업 없이, 그냥 검사만\n"
+
+#: option.c:271
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR 옛 클러스터 데이터 디렉터리\n"
+
+#: option.c:272
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR 새 클러스터 데이터 디렉터리\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -j, --jobs=NUM number of simultaneous processes or threads "
+"to use\n"
+msgstr ""
+" -j, --jobs=NUM 동시에 작업할 프로세스 또는 쓰레드 수\n"
+
+#: option.c:274
+#, c-format
+msgid ""
+" -k, --link link instead of copying files to new "
+"cluster\n"
+msgstr ""
+" -k, --link 새 클러스터 구축을 복사 대신 링크 사용\n"
+
+#: option.c:275
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely "
+"to disk\n"
+msgstr ""
+" -N, --no-sync 작업 완료 뒤 디스크 동기화 작업을 하지 않음\n"
+
+#: option.c:276
+#, c-format
+msgid ""
+" -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=옵션 옛 서버에서 사용할 서버 옵션들\n"
+
+#: option.c:277
+#, c-format
+msgid ""
+" -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=옵션 새 서버에서 사용할 서버 옵션들\n"
+
+#: option.c:278
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT 옛 클러스터 포트 번호 (기본값 %d)\n"
+
+#: option.c:279
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT 새 클러스터 포트 번호 (기본값 %d)\n"
+
+#: option.c:280
+#, c-format
+msgid ""
+" -r, --retain retain SQL and log files after success\n"
+msgstr ""
+" -r, --retain 작업 완료 후 사용했던 SQL과 로그 파일 남김\n"
+
+#: option.c:281
+#, c-format
+msgid ""
+" -s, --socketdir=DIR socket directory to use (default current "
+"dir.)\n"
+msgstr ""
+" -s, --socketdir=DIR 사용할 소켓 디렉터리 (기본값: 현재 디렉터"
+"리)\n"
+
+#: option.c:282
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=이름 클러스터 슈퍼유저 (기본값 \"%s\")\n"
+
+#: option.c:283
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose 작업 내역을 자세히 남김\n"
+
+#: option.c:284
+#, c-format
+msgid ""
+" -V, --version display version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: option.c:285
+#, c-format
+msgid ""
+" --clone clone instead of copying files to new "
+"cluster\n"
+msgstr ""
+" --clone 새 클러스터 구축을 복사 대신 클론 사용\n"
+
+#: option.c:286
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: option.c:287
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"pg_upgrade 작업 전에 먼저 해야 할 것들:\n"
+" 새 버전의 initdb 명령으로 새 데이터베이스 클러스터를 만들고\n"
+" 옛 서버를 중지하고\n"
+" 새 서버도 중지하세요.\n"
+
+#: option.c:292
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"pg_upgrade 작업은 다음 네개의 옵션 값은 반드시 지정해야 함:\n"
+" 옛 데이터 클러스터 디렉터리 (-d DATADIR)\n"
+" 새 데이터 클러스터 디렉터리 (-D DATADIR)\n"
+" 옛 버전의 \"bin\" 디렉터리 (-b BINDIR)\n"
+" 새 버전의 \"bin\" 디렉터리 (-B BINDIR)\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B "
+"newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"사용예:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B "
+"newCluster/bin\n"
+"or\n"
+
+#: option.c:303
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"문제점 보고 주소: <%s>\n"
+
+#: option.c:316
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: option.c:356
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"%s 위치의 디렉터리를 알고 있어야 함.\n"
+"%s 명령행 옵션이나, %s 환경 변수를 사용하세요.\n"
+
+#: option.c:408
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "원본 클러스터용 실 데이터 디렉터리를 찾는 중"
+
+#: option.c:410
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "대상 클러스터용 실 데이터 디렉터리를 찾는 중"
+
+#: option.c:422
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "%s 지정한 데이터 디렉터리를 찾을 수 없음: %s\n"
+
+#: option.c:473
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "%d 번째 줄을 \"%s\" 파일에서 읽을 수 없음: %s\n"
+
+#: option.c:490
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "지정한 %hu 옛 포트 번호를 %hu 번호로 바꿈\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "작업용 프로세스를 만들 수 없음: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "작업용 쓰레드를 만들 수 없음: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "%s() 실패: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "하위 작업자가 비정상 종료됨: 상태값 %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "하위 작업자가 비정상 종료됨: %s\n"
+
+#: pg_upgrade.c:102
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "\"%s\" 디렉터리 읽기 권한 없음: %s\n"
+
+#: pg_upgrade.c:134
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"업그레이드 진행 중\n"
+"------------------\n"
+
+#: pg_upgrade.c:177
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "새 클러스터용 다음 OID 설정 중"
+
+#: pg_upgrade.c:186
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "데이터 디렉터리 fsync 작업 중"
+
+#: pg_upgrade.c:198
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"업그레이드 완료\n"
+"---------------\n"
+
+#: pg_upgrade.c:231 pg_upgrade.c:244 pg_upgrade.c:251 pg_upgrade.c:258
+#: pg_upgrade.c:276 pg_upgrade.c:287
+#, c-format
+msgid "directory path for new cluster is too long\n"
+msgstr "새 클러스터용 디렉터리 이름이 너무 김\n"
+
+#: pg_upgrade.c:265 pg_upgrade.c:267 pg_upgrade.c:269 pg_upgrade.c:271
+#, c-format
+msgid "could not create directory \"%s\": %m\n"
+msgstr "\"%s\" 디렉터리를 만들 수 없음: %m\n"
+
+#: pg_upgrade.c:320
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 실행할 프로그램을 찾을 수 없습니다.\n"
+
+#: pg_upgrade.c:346
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"옛 서버가 현재 운영 되고 있습니다.\n"
+"먼저 서버를 중지하고 진행하세요.\n"
+
+#: pg_upgrade.c:359
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"새 서버가 현재 운영 되고 있습니다.\n"
+"먼저 서버를 중지하고 진행하세요.\n"
+
+#: pg_upgrade.c:373
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "새 클러스터의 모든 로우에 대해서 통계 정보 수집 중"
+
+#: pg_upgrade.c:386
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "새 클러스터의 모든 로우에 대해서 영구 격리(freeze) 중"
+
+#: pg_upgrade.c:406
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "새 클러스터에 전역 객체를 복원 중"
+
+#: pg_upgrade.c:422
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "새 클러스터에 데이터베이스 스키마 복원 중"
+
+#: pg_upgrade.c:528
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "새 %s에서 파일 지우는 중"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "\"%s\" 디렉터리를 삭제 할 수 없음\n"
+
+#: pg_upgrade.c:551
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "옛 %s 객체를 새 서버로 복사 중"
+
+#: pg_upgrade.c:577
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "새 클러스터용 제일 오래된 XID 설정 중"
+
+#: pg_upgrade.c:585
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "새 클러스터용 다음 트랜잭션 ID와 epoch 값 설정 중"
+
+#: pg_upgrade.c:615
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "새 클러스터용 다음 멀티 트랜잭션 ID와 위치 값 설정 중"
+
+#: pg_upgrade.c:639
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "새 클러스터용 제일 오래된 멀티 트랜잭션 ID 설정 중"
+
+#: pg_upgrade.c:659
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "WAL 아카이브 재설정 중"
+
+#: pg_upgrade.c:702
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "새 클러스터에서 frozenxid, minmxid 값 설정 중"
+
+#: pg_upgrade.c:704
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "새 클러스터에서 minmxid 값 설정 중"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "사용자 릴레이션 파일 클론 중"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "사용자 릴레이션 파일 복사 중"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "사용자 릴레이션 파일 링크 중"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "\"%s\" 이름의 옛 데이터베이스를 새 클러스터에서 찾을 수 없음\n"
+
+#: relfilenode.c:218
+#, c-format
+msgid ""
+"error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "\"%s.%s\" (\"%s\" / \"%s\") 파일이 있는지 확인 도중 오류 발생: %s\n"
+
+#: relfilenode.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "\"%s\" 객체를 \"%s\" 객체로 다시 쓰는 중\n"
+
+#: relfilenode.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "\"%s\" 객체를 \"%s\" 객체로 클론 중\n"
+
+#: relfilenode.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "\"%s\" 객체를 \"%s\" 객체로 복사 중\n"
+
+#: relfilenode.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "\"%s\" 객체를 \"%s\" 객체로 링크 중\n"
+
+#: server.c:39 server.c:143 util.c:220 util.c:250
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "실패, 종료함\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s\n"
+msgstr "실행중: %s\n"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL 명령 실패\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "\"%s\" 버전 파일 열기 실패: %m\n"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "\"%s\" 버전 파일 구문 분석 실패\n"
+
+#: server.c:291
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:295
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"다음 명령으로 실행된 원본 서버로 접속할 수 없음:\n"
+"%s\n"
+
+#: server.c:299
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"다음 명령으로 실행된 대상 서버로 접속할 수 없음:\n"
+"%s\n"
+
+#: server.c:313
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "원본 서버를 실행하는 pg_ctl 작업 실패, 또는 연결 실패\n"
+
+#: server.c:315
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "대상 서버를 실행하는 pg_ctl 작업 실패, 또는 연결 실패\n"
+
+#: server.c:360
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: server.c:373
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "%s libpq 환경 변수가 로컬 서버 값이 아님: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"사용자 정의 테이블스페이스를 사용하는 경우 같은 시스템 카탈로그 버전으로\n"
+"업그레이드 작업을 진행할 수 없습니다.\n"
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "\"%s\" 이름의 테이블스페이스 디렉터리가 없음\n"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "\"%s\" 테이블스페이스 디렉터리의 상태 정보를 구할 수 없음: %s\n"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "\"%s\" 테이블스페이스 경로는 디렉터리가 아님\n"
+
+#: util.c:52 util.c:55 util.c:127 util.c:160
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:95
+#, c-format
+msgid "could not access directory \"%s\": %m\n"
+msgstr "\"%s\" 디렉터리를 액세스할 수 없습니다: %m\n"
+
+#: util.c:158
+#, c-format
+msgid "%-*s\n"
+msgstr "%-*s\n"
+
+#: util.c:259
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "\"line\" 자료형 호환성 확인 중"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"해당 데이터베이스에서 \"line\" 자료형을 사용하는 테이블이 있습니다.\n"
+"이 자료형의 입출력 방식이 옛 버전과 새 버전에서 서로 호환하지 않습니다.\n"
+"먼저 이 자료형을 사용하는 테이블을 삭제 후 업그레이드 작업을 하고,\n"
+"수동으로 복원 작업을 해야 합니다.\n"
+"작업 대상 테이블 목록을 다음 파일 안에 있습니다:\n"
+" %s\n"
+"\n"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "잘못된 \"unknown\" 사용자 칼럼을 확인 중"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"해당 데이터베이스에서 사용자 테이블에서 \"unknown\" 자료형을 사용하고 있습니"
+"다.\n"
+"이 자료형은 더 이상 사용할 수 없습니다. 이 문제를 옛 버전에서 먼저 정리하고\n"
+"업그레이드 작업을 진행하세요.\n"
+"해당 테이블 목록은 다음 파일 안에 있습니다:\n"
+" %s\n"
+"\n"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "해쉬 인덱스 확인 중"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "경고"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"해당 데이터베이스에서 해쉬 인덱스를 사용하고 있습니다. 해쉬 인덱스 자료구조"
+"가\n"
+"새 버전에서 호환되지 않습니다. 업그레이드 후에 해당 인덱스들을\n"
+"REINDEX 명령으로 다시 만들어야 합니다.\n"
+"\n"
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"해당 데이터베이스에서 해쉬 인덱스를 사용하고 있습니다. 해쉬 인덱스 자료구조"
+"가\n"
+"새 버전에서 호환되지 않습니다. 업그레이드 후 다음 파일을\n"
+"슈퍼유저 권한으로 실행한 psql에서 실행해서, REINDEX 작업을 진행하세요:\n"
+" %s\n"
+"이 작업이 있기 전까지는 해당 인덱스는 invalid 상태로 사용할 수 없게 됩니다.\n"
+"\n"
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "잘못된 \"sql_identifier\" 사용자 칼럼을 확인 중"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"사용자 테이블 또는 인덱스에 \"sql_identifier\" 자료형을 사용하고\n"
+"있습니다. 이 자료형의 저장 양식이 바뀌었기에, 업그레이드 할 수\n"
+"없습니다. 해당 테이블의 칼럼을 지우고 다시 업그레이드 하십시오.\n"
+"문제의 칼럼이 있는 목록은 다음 파일 안에 있습니다:\n"
+" %s\n"
+"\n"
+
+#: version.c:403
+#, c-format
+msgid "Checking for extension updates"
+msgstr "확장 모듈 업데이트 확인 중"
+
+#: version.c:455
+#, c-format
+msgid "notice"
+msgstr "알림"
+
+#: version.c:456
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"해당 서버에는 업데이트 해야하는 확장 모듈이 있습니다.\n"
+"이 작업은 ALTER EXTENSION 명령으로 할 수 있으며, 작업 명령은\n"
+" %s\n"
+"파일 안에 있습니다. 데이터베이스 슈퍼유저로 psql로 접속해서\n"
+"이 파일 안에 있는 명령을 수행하면 확장 모듈을 업데이트 할 수 있습니다.\n"
+"\n"
diff --git a/src/bin/pg_upgrade/po/ru.po b/src/bin/pg_upgrade/po/ru.po
new file mode 100644
index 0000000..4eeef71
--- /dev/null
+++ b/src/bin/pg_upgrade/po/ru.po
@@ -0,0 +1,2273 @@
+# Russian message translation file for pg_upgrade
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+# Maxim Yablokov <m.yablokov@postgrespro.ru>, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 09:09+0300\n"
+"PO-Revision-Date: 2023-11-03 09:24+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: check.c:75
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Проверка целостности на старом работающем сервере\n"
+"-------------------------------------------------\n"
+
+#: check.c:81
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Проведение проверок целостности\n"
+"-------------------------------\n"
+
+#: check.c:231
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Кластеры совместимы*\n"
+
+#: check.c:239
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Если работа pg_upgrade после этого прервётся, вы должны заново выполнить "
+"initdb\n"
+"для нового кластера, чтобы продолжить.\n"
+
+#: check.c:280
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"Статистика оптимизатора утилитой pg_upgrade не переносится.\n"
+"Запустив новый сервер, имеет смысл выполнить:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:286
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"При запуске этого скрипта будут удалены файлы данных старого кластера:\n"
+" %s\n"
+
+#: check.c:291
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"Не удалось создать скрипт для удаления файлов данных старого кластера,\n"
+"так как каталог старого кластера содержит пользовательские табличные\n"
+"пространства или каталог данных нового кластера.\n"
+"Содержимое старого кластера нужно будет удалить вручную.\n"
+
+#: check.c:303
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Проверка версий кластеров"
+
+#: check.c:315
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later.\n"
+msgstr ""
+"Эта утилита может производить обновление только с версии PostgreSQL %s и "
+"новее.\n"
+
+#: check.c:320
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Эта утилита может повышать версию PostgreSQL только до %s.\n"
+
+#: check.c:329
+#, c-format
+msgid ""
+"This utility cannot be used to downgrade to older major PostgreSQL "
+"versions.\n"
+msgstr ""
+"Эта утилита не может понижать версию до более старой основной версии "
+"PostgreSQL.\n"
+
+#: check.c:334
+#, c-format
+msgid ""
+"Old cluster data and binary directories are from different major versions.\n"
+msgstr ""
+"Каталоги данных и исполняемых файлов старого кластера относятся к разным "
+"основным версиям.\n"
+
+#: check.c:337
+#, c-format
+msgid ""
+"New cluster data and binary directories are from different major versions.\n"
+msgstr ""
+"Каталоги данных и исполняемых файлов нового кластера относятся к разным "
+"основным версиям.\n"
+
+#: check.c:352
+#, c-format
+msgid ""
+"When checking a live server, the old and new port numbers must be "
+"different.\n"
+msgstr ""
+"Для проверки работающего сервера новый номер порта должен отличаться от "
+"старого.\n"
+
+#: check.c:367
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr ""
+"кодировки в базе данных \"%s\" различаются: старая - \"%s\", новая - "
+"\"%s\"\n"
+
+#: check.c:372
+#, c-format
+msgid ""
+"lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr ""
+"значения lc_collate в базе данных \"%s\" различаются: старое - \"%s\", "
+"новое - \"%s\"\n"
+
+#: check.c:375
+#, c-format
+msgid ""
+"lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr ""
+"значения lc_ctype в базе данных \"%s\" различаются: старое - \"%s\", новое "
+"- \"%s\"\n"
+
+#: check.c:378
+#, c-format
+msgid ""
+"locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr ""
+"провайдеры локали в базе данных \"%s\" различаются: старый - \"%s\", новый "
+"- \"%s\"\n"
+
+#: check.c:385
+#, c-format
+msgid ""
+"ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr ""
+"значения локали ICU для базы данных \"%s\" различаются: старое - \"%s\", "
+"новое - \"%s\"\n"
+
+#: check.c:460
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr ""
+"Новая база данных кластера \"%s\" не пустая: найдено отношение \"%s.%s\"\n"
+
+#: check.c:512
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Проверка каталогов табличных пространств в новом кластере"
+
+#: check.c:523
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr ""
+"каталог табличного пространства в новом кластере уже существует: \"%s\"\n"
+
+#: check.c:556
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i."
+"e. %s\n"
+msgstr ""
+"\n"
+"ПРЕДУПРЕЖДЕНИЕ: новый каталог данных не должен располагаться внутри старого "
+"каталога данных, то есть, в %s\n"
+
+#: check.c:580
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data "
+"directory, i.e. %s\n"
+msgstr ""
+"\n"
+"ПРЕДУПРЕЖДЕНИЕ: пользовательские табличные пространства не должны "
+"располагаться внутри каталога данных, то есть, в %s\n"
+
+#: check.c:590
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Создание скрипта для удаления старого кластера"
+
+#: check.c:593 check.c:768 check.c:888 check.c:987 check.c:1118 check.c:1197
+#: check.c:1500 file.c:338 function.c:165 option.c:465 version.c:116
+#: version.c:292 version.c:429
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "не удалось открыть файл \"%s\": %s\n"
+
+#: check.c:644
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "не удалось добавить право выполнения для файла \"%s\": %s\n"
+
+#: check.c:664
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Проверка, является ли пользователь БД стартовым пользователем"
+
+#: check.c:680
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "пользователь БД \"%s\" не является стартовым пользователем\n"
+
+#: check.c:691
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "не удалось определить количество пользователей\n"
+
+#: check.c:699
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "В новом кластере может быть определён только стартовый пользователь.\n"
+
+#: check.c:729
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Проверка параметров подключения к базе данных"
+
+#: check.c:755
+#, c-format
+msgid ""
+"template0 must not allow connections, i.e. its pg_database.datallowconn must "
+"be false\n"
+msgstr ""
+"база template0 не должна допускать подключения, то есть её свойство "
+"pg_database.datallowconn должно быть false\n"
+
+#: check.c:785 check.c:910 check.c:1012 check.c:1138 check.c:1219 check.c:1278
+#: check.c:1339 check.c:1404 check.c:1523 function.c:187 version.c:192
+#: version.c:232 version.c:378
+#, c-format
+msgid "fatal\n"
+msgstr "сбой\n"
+
+#: check.c:786
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Все базы, кроме template0, должны допускать подключения, то есть их свойство "
+"pg_database.datallowconn должно быть true. В вашей инсталляции содержатся\n"
+"базы (не считая template0), у которых pg_database.datallowconn — false.\n"
+"Имеет смысл разрешить подключения для всех баз данных, кроме template0,\n"
+"или удалить базы, к которым нельзя подключаться. Список баз данных\n"
+"с этой проблемой содержится в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:811
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Проверка наличия подготовленных транзакций"
+
+#: check.c:820
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "Исходный кластер содержит подготовленные транзакции\n"
+
+#: check.c:822
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "Целевой кластер содержит подготовленные транзакции\n"
+
+#: check.c:848
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Проверка несоответствия при передаче bigint в contrib/isn"
+
+#: check.c:911
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции имеются функции \"contrib/isn\", задействующие тип "
+"biging.\n"
+"Однако в новом кластере значения bigint передаётся не так, как в старом,\n"
+"так что обновление кластера в текущем состоянии невозможно. Вы можете\n"
+"вручную выгрузить базы данных, где используется функциональность \"contrib/"
+"isn\",\n"
+"или удалить \"contrib/isn\" из старого кластера и перезапустить обновление. "
+"Список\n"
+"проблемных функций приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:934
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Проверка пользовательских постфиксных операторов"
+
+#: check.c:1013
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции содержатся пользовательские постфиксные операторы, "
+"которые\n"
+"теперь не поддерживаются. Их следует удалить и использовать вместо них\n"
+"префиксные операторы или функции.\n"
+"Список пользовательских постфиксных операторов приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Проверка несовместимых полиморфных функций"
+
+#: check.c:1139
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or "
+"\"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции содержатся пользовательские объекты, обращающиеся\n"
+"к внутренним полиморфным функциям с аргументами типа \"anyarray\" или "
+"\"anyelement\".\n"
+"Такие объекты необходимо удалить перед процедурой обновления и восстановить\n"
+"после, изменив их так, чтобы они обращались к новым аналогичным функциям\n"
+"с аргументами типа \"anycompatiblearray\" и \"anycompatible\".\n"
+"Список проблемных объектов приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:1164
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Проверка таблиц со свойством WITH OIDS"
+
+#: check.c:1220
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции содержатся таблицы со свойством WITH OIDS, которое "
+"теперь\n"
+"не поддерживается. Отказаться от использования столбцов oid можно так:\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Список проблемных таблиц приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:1248
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Проверка системных составных типов в пользовательских таблицах"
+
+#: check.c:1279
+#, c-format
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы используют системные составные "
+"типы.\n"
+"OID таких типов могут различаться в разных версиях PostgreSQL, в настоящем\n"
+"состоянии обновить кластер невозможно. Вы можете удалить проблемные столбцы\n"
+"и перезапустить обновление. Список проблемных столбцов приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:1307
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Проверка типов данных reg* в пользовательских таблицах"
+
+#: check.c:1340
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы содержат один из типов reg*.\n"
+"Эти типы данных ссылаются на системные OID, которые не сохраняются утилитой\n"
+"pg_upgrade, так что обновление кластера в текущем состоянии невозможно. Вы\n"
+"можете удалить проблемные столбцы и перезапустить обновление. Список "
+"проблемных\n"
+"столбцов приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:1364
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "Проверка удалённого типа данных \"%s\" в пользовательских таблицах"
+
+#: check.c:1373
+#, c-format
+msgid "fatal"
+msgstr "сбой"
+
+#: check.c:1374
+#, c-format
+msgid ""
+"Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы используют тип данных \"%s\".\n"
+"Тип \"%s\" был удалён в PostgreSQL версии %s, поэтому обновить\n"
+"кластер в текущем состоянии невозможно. Вы можете удалить проблемные столбцы "
+"и\n"
+"перезапустить обновление. Список проблемных столбцов приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:1396
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Проверка несовместимого типа данных \"jsonb\""
+
+#: check.c:1405
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции таблицы используют тип данных jsonb.\n"
+"Внутренний формат \"jsonb\" изменился в версии 9.4 beta, поэтому обновить "
+"кластер\n"
+"в текущем состоянии невозможно. Вы можете удалить проблемные столбцы и\n"
+"перезапустить обновление. Список проблемных столбцов приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:1427
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Проверка ролей с именами, начинающимися с \"pg_\""
+
+#: check.c:1437
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "В исходном кластере есть роли, имена которых начинаются с \"pg_\"\n"
+
+#: check.c:1439
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "В целевом кластере есть роли, имена которых начинаются с \"pg_\"\n"
+
+#: check.c:1460
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Проверка пользовательских перекодировок"
+
+#: check.c:1524
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции имеются пользовательские перекодировки.\n"
+"У функций перекодировок в PostgreSQL 14 поменялись параметры, поэтому\n"
+"в настоящем состоянии обновить кластер невозможно. Вы можете удалить\n"
+"перекодировки в старом кластере и перезапустить обновление.\n"
+"Список пользовательских перекодировок приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: check.c:1551
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "не удалось получить текущую локаль\n"
+
+#: check.c:1560
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "не удалось получить системное имя локали для \"%s\"\n"
+
+#: check.c:1566
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "не удалось восстановить старую локаль \"%s\"\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "не удалось получить управляющие данные, выполнив %s: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: недопустимое состояние кластера баз данных\n"
+
+#: controldata.c:157
+#, c-format
+msgid ""
+"The source cluster was shut down while in recovery mode. To upgrade, use "
+"\"rsync\" as documented or shut it down as a primary.\n"
+msgstr ""
+"Исходный кластер был отключён в режиме восстановления. Чтобы произвести "
+"обновление, используйте документированный способ с rsync или отключите его в "
+"режиме главного сервера.\n"
+
+#: controldata.c:159
+#, c-format
+msgid ""
+"The target cluster was shut down while in recovery mode. To upgrade, use "
+"\"rsync\" as documented or shut it down as a primary.\n"
+msgstr ""
+"Целевой кластер был отключён в режиме восстановления. Чтобы произвести "
+"обновление, используйте документированный способ с rsync или отключите его в "
+"режиме главного сервера.\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "Исходный кластер не был отключён штатным образом.\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "Целевой кластер не был отключён штатным образом.\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "В исходном кластере не хватает информации о состоянии кластера:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "В целевом кластере не хватает информации о состоянии кластера:\n"
+
+#: controldata.c:209 dump.c:50 pg_upgrade.c:440 pg_upgrade.c:477
+#: relfilenode.c:231 server.c:34
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: проблема с выводом pg_resetwal\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: проблема с получением управляющих данных\n"
+
+#: controldata.c:571
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "В исходном кластере не хватает необходимой управляющей информации:\n"
+
+#: controldata.c:574
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "В целевом кластере не хватает необходимой управляющей информации:\n"
+
+# skip-rule: capital-letter-first
+#: controldata.c:577
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " следующий XID конт. точки\n"
+
+# skip-rule: capital-letter-first
+#: controldata.c:580
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " следующий OID последней конт. точки\n"
+
+# skip-rule: capital-letter-first
+#: controldata.c:583
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " следующий MultiXactId последней конт. точки\n"
+
+# skip-rule: capital-letter-first
+#: controldata.c:587
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " старейший MultiXactId последней конт. точки\n"
+
+# skip-rule: capital-letter-first
+#: controldata.c:590
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " oldestXID последней конт. точки\n"
+
+# skip-rule: capital-letter-first
+#: controldata.c:593
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " следующий MultiXactOffset последней конт. точки\n"
+
+#: controldata.c:596
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " первый сегмент WAL после сброса\n"
+
+#: controldata.c:599
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " метод передачи аргумента float8\n"
+
+#: controldata.c:602
+#, c-format
+msgid " maximum alignment\n"
+msgstr " максимальное выравнивание\n"
+
+#: controldata.c:605
+#, c-format
+msgid " block size\n"
+msgstr " размер блока\n"
+
+#: controldata.c:608
+#, c-format
+msgid " large relation segment size\n"
+msgstr " размер сегмента большого отношения\n"
+
+#: controldata.c:611
+#, c-format
+msgid " WAL block size\n"
+msgstr " размер блока WAL\n"
+
+#: controldata.c:614
+#, c-format
+msgid " WAL segment size\n"
+msgstr " размер сегмента WAL\n"
+
+#: controldata.c:617
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " максимальная длина идентификатора\n"
+
+#: controldata.c:620
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " максимальное число столбцов в индексе\n"
+
+#: controldata.c:623
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " максимальный размер порции TOAST\n"
+
+#: controldata.c:627
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " размер порции большого объекта\n"
+
+#: controldata.c:630
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " дата/время представлены целыми числами?\n"
+
+#: controldata.c:634
+#, c-format
+msgid " data checksum version\n"
+msgstr " версия контрольных сумм данных\n"
+
+#: controldata.c:636
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr ""
+"Нет необходимой управляющей информации для продолжения, работа прерывается\n"
+
+#: controldata.c:651
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"старое и новое выравнивание в pg_controldata различаются или некорректны\n"
+"Вероятно, один кластер установлен в 32-битной системе, а другой ~ в 64-"
+"битной\n"
+
+#: controldata.c:655
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr ""
+"старый и новый размер блоков в pg_controldata различаются или некорректны\n"
+
+#: controldata.c:658
+#, c-format
+msgid ""
+"old and new pg_controldata maximum relation segment sizes are invalid or do "
+"not match\n"
+msgstr ""
+"старый и новый максимальный размер сегментов отношений в pg_controldata "
+"различаются или некорректны\n"
+
+#: controldata.c:661
+#, c-format
+msgid ""
+"old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr ""
+"старый и новый размер блоков WAL в pg_controldata различаются или "
+"некорректны\n"
+
+#: controldata.c:664
+#, c-format
+msgid ""
+"old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr ""
+"старый и новый размер сегментов WAL в pg_controldata различаются или "
+"некорректны\n"
+
+#: controldata.c:667
+#, c-format
+msgid ""
+"old and new pg_controldata maximum identifier lengths are invalid or do not "
+"match\n"
+msgstr ""
+"старая и новая максимальная длина идентификаторов в pg_controldata "
+"различаются или некорректны\n"
+
+#: controldata.c:670
+#, c-format
+msgid ""
+"old and new pg_controldata maximum indexed columns are invalid or do not "
+"match\n"
+msgstr ""
+"старый и новый максимум числа столбцов, составляющих индексы, в "
+"pg_controldata различаются или некорректны\n"
+
+#: controldata.c:673
+#, c-format
+msgid ""
+"old and new pg_controldata maximum TOAST chunk sizes are invalid or do not "
+"match\n"
+msgstr ""
+"старый и новый максимальный размер порции TOAST в pg_controldata различаются "
+"или некорректны\n"
+
+#: controldata.c:678
+#, c-format
+msgid ""
+"old and new pg_controldata large-object chunk sizes are invalid or do not "
+"match\n"
+msgstr ""
+"старый и новый размер порции большого объекта различаются или некорректны\n"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr ""
+"старый и новый тип хранения даты/времени в pg_controldata различаются или "
+"некорректны\n"
+
+#: controldata.c:694
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr ""
+"в старом кластере не применялись контрольные суммы данных, но в новом они "
+"есть\n"
+
+#: controldata.c:697
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr ""
+"в старом кластере применялись контрольные суммы данных, но в новом их нет\n"
+
+#: controldata.c:699
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr ""
+"старая и новая версия контрольных сумм кластера в pg_controldata "
+"различаются\n"
+
+#: controldata.c:710
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Добавление расширения \".old\" к старому файлу global/pg_control"
+
+#: controldata.c:715
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "Не удалось переименовать %s в %s.\n"
+
+#: controldata.c:718
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Если вы захотите запустить старый кластер, вам нужно будет убрать\n"
+"расширение \".old\" у файла %s/global/pg_control.old.\n"
+"Так как применялся режим \"ссылок\", работа старого кластера\n"
+"после того, как будет запущен новый, не гарантируется.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Формирование выгрузки глобальных объектов"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Формирование выгрузки схем базы данных"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "не удалось получить данные версии pg_ctl, выполнив %s: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "не удалось получить версию pg_ctl из результата %s\n"
+
+#: exec.c:108 exec.c:112
+#, c-format
+msgid "command too long\n"
+msgstr "команда слишком длинная\n"
+
+#: exec.c:114 util.c:37 util.c:310
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:153 pg_upgrade.c:279
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "не удалось открыть файл протокола \"%s\": %m\n"
+
+#: exec.c:182
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*ошибка*"
+
+#: exec.c:185
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "При выполнении \"%s\" возникли проблемы\n"
+
+#: exec.c:188
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Чтобы понять причину ошибки, просмотрите последние несколько строк\n"
+"файла \"%s\" или \"%s\".\n"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Чтобы понять причину ошибки, просмотрите последние несколько строк\n"
+"файла \"%s\".\n"
+
+#: exec.c:208 pg_upgrade.c:289
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "не удалось записать в файл протокола \"%s\": %m\n"
+
+#: exec.c:234
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "не удалось открыть файл \"%s\" для чтения: %s\n"
+
+#: exec.c:261
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "У вас должны быть права на чтение и запись в текущем каталоге.\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "проверка существования \"%s\" не пройдена: %s\n"
+
+#: exec.c:317 exec.c:383
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" не является каталогом\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "программа \"%s\" не прошла проверку: это не обычный файл\n"
+
+#: exec.c:436
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "программа \"%s\" не прошла проверку: ошибка выполнения (нет доступа)\n"
+
+#: exec.c:442
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "программа \"%s\" не прошла проверку: ошибка выполнения\n"
+
+#: exec.c:452
+#, c-format
+msgid ""
+"check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr ""
+"программа \"%s\" не прошла проверку: получена некорректная версия \"%s\", "
+"ожидалась \"%s\"\n"
+
+#: file.c:43 file.c:63
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "ошибка при клонировании отношения \"%s.%s\" (из \"%s\" в \"%s\"): %s\n"
+
+#: file.c:50
+#, c-format
+msgid ""
+"error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr ""
+"ошибка при клонировании отношения \"%s.%s\": не удалось открыть файл \"%s\": "
+"%s\n"
+
+#: file.c:55
+#, c-format
+msgid ""
+"error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr ""
+"ошибка при клонировании отношения \"%s.%s\": не удалось создать файл \"%s\": "
+"%s\n"
+
+#: file.c:89 file.c:192
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": не удалось открыть файл \"%s\": "
+"%s\n"
+
+#: file.c:94 file.c:201
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": не удалось создать файл \"%s\": "
+"%s\n"
+
+#: file.c:108 file.c:225
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": не удалось прочитать файл "
+"\"%s\": %s\n"
+
+#: file.c:120 file.c:303
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": не удалось записать в файл "
+"\"%s\": %s\n"
+
+#: file.c:134
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "ошибка при копировании отношения \"%s.%s\" (из \"%s\" в \"%s\"): %s\n"
+
+#: file.c:153
+#, c-format
+msgid ""
+"error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr ""
+"ошибка при создании ссылки для отношения \"%s.%s\" (из \"%s\" в \"%s\"): %s\n"
+
+#: file.c:196
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": не удалось получить информацию о "
+"файле \"%s\": %s\n"
+
+#: file.c:228
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": в файле \"%s\" обнаружена "
+"неполная страница\n"
+
+#: file.c:330 file.c:347
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "не удалось клонировать файл из старого каталога данных в новый: %s\n"
+
+#: file.c:343
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "не удалось создать файл \"%s\": %s\n"
+
+#: file.c:354
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "клонирование файлов не поддерживается в этой ОС\n"
+
+#: file.c:371
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file "
+"system.\n"
+msgstr ""
+"не удалось создать жёсткую ссылку между старым и новым каталогами данных: "
+"%s\n"
+"В режиме \"ссылок\" старый и новый каталоги данных должны находиться в одной "
+"файловой системе.\n"
+
+#: function.c:129
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Проверка наличия требуемых библиотек"
+
+#: function.c:167
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "загрузить библиотеку \"%s\" не удалось: %s"
+
+#: function.c:178
+#, c-format
+msgid "In database: %s\n"
+msgstr "В базе данных: %s\n"
+
+#: function.c:188
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции есть ссылки на загружаемые библиотеки, отсутствующие\n"
+"в новой инсталляции. Вы можете добавить эти библиотеки в новую инсталляцию\n"
+"или удалить функции, использующие их, из старой. Список проблемных\n"
+"библиотек приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: info.c:125
+#, c-format
+msgid ""
+"Relation names for OID %u in database \"%s\" do not match: old name \"%s."
+"%s\", new name \"%s.%s\"\n"
+msgstr ""
+"Имена отношения с OID %u в базе данных \"%s\" различаются: старое имя - \"%s."
+"%s\", новое - \"%s.%s\"\n"
+
+#: info.c:145
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "Не удалось сопоставить старые таблицы с новыми в базе данных \"%s\"\n"
+
+#: info.c:226
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " это индекс в \"%s.%s\""
+
+#: info.c:236
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " это индекс в отношении с OID %u"
+
+#: info.c:248
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " это TOAST-таблица для \"%s.%s\""
+
+#: info.c:256
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " это TOAST-таблица для отношения с OID %u"
+
+#: info.c:260
+#, c-format
+msgid ""
+"No match found in old cluster for new relation with OID %u in database "
+"\"%s\": %s\n"
+msgstr ""
+"В старом кластере не нашлось соответствия для нового отношения с OID %u в "
+"базе данных \"%s\": %s\n"
+
+#: info.c:263
+#, c-format
+msgid ""
+"No match found in new cluster for old relation with OID %u in database "
+"\"%s\": %s\n"
+msgstr ""
+"В новом кластере не нашлось соответствия для старого отношения с OID %u в "
+"базе данных \"%s\": %s\n"
+
+#: info.c:287
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"исходные базы данных:\n"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"целевые базы данных:\n"
+
+#: info.c:604
+#, c-format
+msgid "Database: %s\n"
+msgstr "База данных: %s\n"
+
+#: info.c:606
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:617
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "имя_отношения: %s.%s: oid_отношения: %u табл_пространство: %s\n"
+
+#: option.c:100
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: программу не должен запускать root\n"
+
+#: option.c:167
+#, c-format
+msgid "invalid old port number\n"
+msgstr "неверный старый номер порта\n"
+
+#: option.c:172
+#, c-format
+msgid "invalid new port number\n"
+msgstr "неверный новый номер порта\n"
+
+#: option.c:198
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Для дополнительной информации попробуйте \"%s --help\".\n"
+
+#: option.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "слишком много аргументов командной строки (первый: \"%s\")\n"
+
+#: option.c:208
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Программа запущена в режиме подробных сообщений\n"
+
+#: option.c:226
+msgid "old cluster binaries reside"
+msgstr "расположение исполняемых файлов старого кластера"
+
+#: option.c:228
+msgid "new cluster binaries reside"
+msgstr "расположение исполняемых файлов нового кластера"
+
+#: option.c:230
+msgid "old cluster data resides"
+msgstr "расположение данных старого кластера"
+
+#: option.c:232
+msgid "new cluster data resides"
+msgstr "расположение данных нового кластера"
+
+#: option.c:234
+msgid "sockets will be created"
+msgstr "расположение сокетов"
+
+#: option.c:251 option.c:350
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "не удалось определить текущий каталог\n"
+
+#: option.c:254
+#, c-format
+msgid ""
+"cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr ""
+"в Windows нельзя запустить pg_upgrade внутри каталога данных нового "
+"кластера\n"
+
+#: option.c:263
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade обновляет кластер PostgreSQL до другой основной версии.\n"
+"\n"
+
+#: option.c:264
+#, c-format
+msgid "Usage:\n"
+msgstr "Использование:\n"
+
+#: option.c:265
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [ПАРАМЕТР]...\n"
+"\n"
+
+#: option.c:266
+#, c-format
+msgid "Options:\n"
+msgstr "Параметры:\n"
+
+#: option.c:267
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr ""
+" -b, --old-bindir=КАТ_BIN каталог исполняемых файлов старого кластера\n"
+
+#: option.c:268
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=КАТ_BIN каталог исполняемых файлов нового кластера\n"
+" (по умолчанию каталог программы pg_upgrade)\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" -c, --check check clusters only, don't change any data\n"
+msgstr ""
+" -c, --check только проверить кластеры, не меняя никакие "
+"данные\n"
+
+#: option.c:271
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=КАТ_DATA каталог данных старого кластера\n"
+
+#: option.c:272
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=КАТ_DATA каталог данных нового кластера\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -j, --jobs=NUM number of simultaneous processes or threads "
+"to use\n"
+msgstr ""
+" -j, --jobs=ЧИСЛО число одновременно используемых процессов "
+"или\n"
+" потоков\n"
+
+#: option.c:274
+#, c-format
+msgid ""
+" -k, --link link instead of copying files to new "
+"cluster\n"
+msgstr ""
+" -k, --link устанавливать ссылки вместо копирования "
+"файлов\n"
+" в новый кластер\n"
+
+#: option.c:275
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely "
+"to disk\n"
+msgstr ""
+" -N, --no-sync не ждать завершения сохранения данных на "
+"диске\n"
+
+#: option.c:276
+#, c-format
+msgid ""
+" -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr ""
+" -o, --old-options=ПАРАМЕТРЫ параметры старого кластера, передаваемые "
+"серверу\n"
+
+#: option.c:277
+#, c-format
+msgid ""
+" -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr ""
+" -O, --new-options=ПАРАМЕТРЫ параметры нового кластера, передаваемые "
+"серверу\n"
+
+#: option.c:278
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr ""
+" -p, --old-port=ПОРТ номер порта старого кластера (по умолчанию "
+"%d)\n"
+
+#: option.c:279
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr ""
+" -P, --new-port=ПОРТ номер порта нового кластера (по умолчанию "
+"%d)\n"
+
+#: option.c:280
+#, c-format
+msgid ""
+" -r, --retain retain SQL and log files after success\n"
+msgstr ""
+" -r, --retain сохранить файлы журналов и SQL в случае "
+"успеха\n"
+
+#: option.c:281
+#, c-format
+msgid ""
+" -s, --socketdir=DIR socket directory to use (default current "
+"dir.)\n"
+msgstr ""
+" -s, --socketdir=КАТАЛОГ каталог сокетов (по умолчанию текущий)\n"
+
+#: option.c:282
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr ""
+" -U, --username=ИМЯ суперпользователь кластера (по умолчанию "
+"\"%s\")\n"
+
+#: option.c:283
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr ""
+" -v, --verbose включить вывод подробных внутренних "
+"сообщений\n"
+
+#: option.c:284
+#, c-format
+msgid ""
+" -V, --version display version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: option.c:285
+#, c-format
+msgid ""
+" --clone clone instead of copying files to new "
+"cluster\n"
+msgstr ""
+" --clone клонировать, а не копировать файлы в новый "
+"кластер\n"
+
+#: option.c:286
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: option.c:287
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"До запуска pg_upgrade вы должны:\n"
+" создать новый кластер баз данных (используя новую версию initdb)\n"
+" остановить процесс postmaster, обслуживающий старый кластер\n"
+" остановить процесс postmaster, обслуживающий новый кластер\n"
+
+#: option.c:292
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Запуская pg_upgrade, вы должны указать:\n"
+" путь к каталогу данных старого кластера (-d КАТ_ДАННЫХ)\n"
+" путь к каталогу данных нового кластера (-D КАТ_ДАННЫХ)\n"
+" путь к каталогу \"bin\" старой версии (-b КАТ_BIN)\n"
+" путь к каталогу \"bin\" новой версии (-B КАТ_BIN)\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B "
+"newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Например:\n"
+" pg_upgrade -d старый_кластер/data -D новый_кластер/data -b старый_кластер/"
+"bin -B новый_кластер/bin\n"
+"или\n"
+
+#: option.c:303
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=старый_кластер/data\n"
+" $ export PGDATANEW=новый_кластер/data\n"
+" $ export PGBINOLD=старый_кластер/bin\n"
+" $ export PGBINNEW=новый_кластер/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=старый_кластер/data\n"
+" C:\\> set PGDATANEW=новый_кластер/data\n"
+" C:\\> set PGBINOLD=старый_кластер/bin\n"
+" C:\\> set PGBINNEW=новый_кластер/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках сообщайте по адресу <%s>.\n"
+
+#: option.c:316
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: option.c:356
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"Вы должны указать каталог, где находится %s.\n"
+"Воспользуйтесь для этого ключом командной строки %s или переменной окружения "
+"%s.\n"
+
+#: option.c:408
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Поиск фактического каталога данных для исходного кластера"
+
+#: option.c:410
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Поиск фактического каталога данных для целевого кластера"
+
+#: option.c:422
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "не удалось получить каталог данных, выполнив %s: %s\n"
+
+#: option.c:473
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "не удалось прочитать строку %d из файла \"%s\": %s\n"
+
+#: option.c:490
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "заданный пользователем старый номер порта %hu изменён на %hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "не удалось создать рабочий процесс: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "не удалось создать рабочий поток: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "ошибка в %s(): %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "дочерний процесс завершился нештатно с ошибкой %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "дочерний процесс завершился аварийно: %s\n"
+
+#: pg_upgrade.c:102
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "не удалось считать права на каталог \"%s\": %s\n"
+
+#: pg_upgrade.c:134
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Выполнение обновления\n"
+"---------------------\n"
+
+#: pg_upgrade.c:177
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Установка следующего OID для нового кластера"
+
+#: pg_upgrade.c:186
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Синхронизация каталога данных с ФС"
+
+#: pg_upgrade.c:198
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Обновление завершено\n"
+"--------------------\n"
+
+#: pg_upgrade.c:231 pg_upgrade.c:244 pg_upgrade.c:251 pg_upgrade.c:258
+#: pg_upgrade.c:276 pg_upgrade.c:287
+#, c-format
+msgid "directory path for new cluster is too long\n"
+msgstr "путь к каталогу данных нового кластера слишком длинный\n"
+
+#: pg_upgrade.c:265 pg_upgrade.c:267 pg_upgrade.c:269 pg_upgrade.c:271
+#, c-format
+msgid "could not create directory \"%s\": %m\n"
+msgstr "не удалось создать каталог \"%s\": %m\n"
+
+#: pg_upgrade.c:320
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: не удалось найти свой исполняемый файл\n"
+
+#: pg_upgrade.c:346
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Видимо, запущен процесс postmaster, обслуживающий старый кластер.\n"
+"Остановите его и попробуйте ещё раз.\n"
+
+#: pg_upgrade.c:359
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Видимо, запущен процесс postmaster, обслуживающий новый кластер.\n"
+"Остановите его и попробуйте ещё раз.\n"
+
+#: pg_upgrade.c:373
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Анализ всех строк в новом кластере"
+
+#: pg_upgrade.c:386
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Замораживание всех строк в новом кластере"
+
+#: pg_upgrade.c:406
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Восстановление глобальных объектов в новом кластере"
+
+#: pg_upgrade.c:422
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Восстановление схем баз данных в новом кластере"
+
+#: pg_upgrade.c:528
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Удаление файлов из нового каталога %s"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "ошибка при удалении каталога \"%s\"\n"
+
+#: pg_upgrade.c:551
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Копирование старого каталога %s на новый сервер"
+
+#: pg_upgrade.c:577
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Установка старейшего OID для нового кластера"
+
+#: pg_upgrade.c:585
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr ""
+"Установка следующего идентификатора транзакции и эпохи для нового кластера"
+
+#: pg_upgrade.c:615
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr ""
+"Установка следующего идентификатора и смещения мультитранзакции для нового "
+"кластера"
+
+#: pg_upgrade.c:639
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Установка старейшего идентификатора мультитранзакции в новом кластере"
+
+#: pg_upgrade.c:659
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Сброс архивов WAL"
+
+#: pg_upgrade.c:702
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Установка счётчиков frozenxid и minmxid в новом кластере"
+
+#: pg_upgrade.c:704
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Установка счётчика minmxid в новом кластере"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Клонирование файлов пользовательских отношений"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Копирование файлов пользовательских отношений"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Подключение файлов пользовательских отношений ссылками"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "старая база данных \"%s\" не найдена в новом кластере\n"
+
+#: relfilenode.c:218
+#, c-format
+msgid ""
+"error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr ""
+"ошибка при проверке существования файла отношения \"%s.%s\" (перенос \"%s\" "
+"в \"%s\"): %s\n"
+
+#: relfilenode.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "переписывание \"%s\" в \"%s\"\n"
+
+#: relfilenode.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "клонирование \"%s\" в \"%s\"\n"
+
+#: relfilenode.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "копирование \"%s\" в \"%s\"\n"
+
+#: relfilenode.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "создание ссылки на \"%s\" в \"%s\"\n"
+
+#: server.c:39 server.c:143 util.c:220 util.c:250
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Ошибка, выполняется выход\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s\n"
+msgstr "выполняется: %s\n"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"Ошибка SQL-команды\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "не удалось открыть файл с версией \"%s\": %m\n"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "не удалось разобрать файл с версией \"%s\"\n"
+
+#: server.c:291
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:295
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"не удалось подключиться к главному процессу исходного сервера, запущенному "
+"командой:\n"
+"%s\n"
+
+#: server.c:299
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"не удалось подключиться к главному процессу целевого сервера, запущенному "
+"командой:\n"
+"%s\n"
+
+#: server.c:313
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr ""
+"программа pg_ctl не смогла запустить исходный сервер, либо к нему не удалось "
+"подключиться\n"
+
+#: server.c:315
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr ""
+"программа pg_ctl не смогла запустить целевой сервер, либо к нему не удалось "
+"подключиться\n"
+
+#: server.c:360
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памяти\n"
+
+#: server.c:373
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr ""
+"в переменной окружения %s для libpq указан адрес не локального сервера: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"Обновление в рамках одной версии системного каталога невозможно,\n"
+"если используются табличные пространства.\n"
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "каталог табличного пространства \"%s\" не существует\n"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr ""
+"не удалось получить информацию о каталоге табличного пространства \"%s\": "
+"%s\n"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "путь табличного пространства \"%s\" не указывает на каталог\n"
+
+#: util.c:52 util.c:55 util.c:127 util.c:160
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:95
+#, c-format
+msgid "could not access directory \"%s\": %m\n"
+msgstr "ошибка доступа к каталогу \"%s\": %m\n"
+
+#: util.c:158
+#, c-format
+msgid "%-*s\n"
+msgstr "%-*s\n"
+
+#: util.c:259
+#, c-format
+msgid "ok"
+msgstr "ок"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Проверка несовместимого типа данных \"line\""
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы используют тип данных "
+"\"line\".\n"
+"В старом кластере внутренний формат и формат ввода/вывода этого типа "
+"отличается\n"
+"от нового, поэтому в настоящем состоянии обновить кластер невозможно. Вы "
+"можете\n"
+"удалить проблемные столбцы и перезапустить обновление. Список проблемных\n"
+"столбцов приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Проверка неправильных пользовательских столбцов типа \"unknown\""
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы используют тип данных "
+"\"unknown\".\n"
+"Теперь использование этого типа данных в таблицах не допускается, поэтому\n"
+"в настоящем состоянии обновить кластер невозможно. Вы можете удалить "
+"проблемные\n"
+"столбцы и перезапустить обновление. Список проблемных столбцов приведён в "
+"файле:\n"
+" %s\n"
+"\n"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Проверка хеш-индексов"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "предупреждение"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"В вашей инсталляции используются хеш-индексы. Эти индексы имеют разные\n"
+"внутренние форматы в старом и новом кластерах, поэтому их необходимо\n"
+"перестроить с помощью команды REINDEX. По завершении обновления вы получите\n"
+"инструкции по выполнению REINDEX.\n"
+"\n"
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"В вашей инсталляции используются хеш-индексы. Эти индексы имеют разные\n"
+"внутренние форматы в старом и новом кластерах, поэтому их необходимо\n"
+"перестроить с помощью команды REINDEX. Скрипт\n"
+" %s\n"
+"будучи выполненным администратором БД в psql, пересоздаст все неправильные\n"
+"индексы; до этого никакие хеш-индексы не будут использоваться.\n"
+"\n"
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr ""
+"Проверка неправильных пользовательских столбцов типа \"sql_identifier\""
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы используют тип данных\n"
+"\"sql_identifier\". Формат хранения таких данных на диске поменялся,\n"
+"поэтому обновить данный кластер невозможно. Вы можете удалить проблемные\n"
+"столбцы и перезапустить обновление.\n"
+"Список проблемных столбцов приведён в файле:\n"
+" %s\n"
+"\n"
+
+#: version.c:403
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Проверка обновлённых расширений"
+
+#: version.c:455
+#, c-format
+msgid "notice"
+msgstr "замечание"
+
+#: version.c:456
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"В вашей инсталляции есть расширения, которые надо обновить\n"
+"командой ALTER EXTENSION. Скрипт\n"
+" %s\n"
+"будучи выполненным администратором БД в psql, обновит все\n"
+"эти расширения.\n"
+"\n"
+
+#~ msgid ""
+#~ "When checking a pre-PG 9.1 live old server, you must specify the old "
+#~ "server's port number.\n"
+#~ msgstr ""
+#~ "Для проверки старого работающего сервера версии до 9.1 необходимо указать "
+#~ "номер порта этого сервера.\n"
+
+#~ msgid ""
+#~ "All non-template0 databases must allow connections, i.e. their "
+#~ "pg_database.datallowconn must be true\n"
+#~ msgstr ""
+#~ "Все базы, кроме template0, должны допускать подключения, то есть их "
+#~ "свойство pg_database.datallowconn должно быть true\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "The old cluster has a \"plpython_call_handler\" function defined\n"
+#~ "in the \"public\" schema which is a duplicate of the one defined\n"
+#~ "in the \"pg_catalog\" schema. You can confirm this by executing\n"
+#~ "in psql:\n"
+#~ "\n"
+#~ " \\df *.plpython_call_handler\n"
+#~ "\n"
+#~ "The \"public\" schema version of this function was created by a\n"
+#~ "pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+#~ "to complete because it references a now-obsolete \"plpython\"\n"
+#~ "shared object file. You can remove the \"public\" schema version\n"
+#~ "of this function by running the following command:\n"
+#~ "\n"
+#~ " DROP FUNCTION public.plpython_call_handler()\n"
+#~ "\n"
+#~ "in each affected database:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "В старом кластере имеется функция \"plpython_call_handler\",\n"
+#~ "определённая в схеме \"public\", представляющая собой копию функции,\n"
+#~ "определённой в схеме \"pg_catalog\". Вы можете убедиться в этом,\n"
+#~ "выполнив в psql:\n"
+#~ "\n"
+#~ " \\df *.plpython_call_handler\n"
+#~ "\n"
+#~ "Версия этой функции в схеме \"public\" была создана инсталляцией\n"
+#~ "plpython версии до 8.1 и должна быть удалена для завершения процедуры\n"
+#~ "pg_upgrade, так как она ссылается на ставший устаревшим\n"
+#~ "разделяемый объектный файл \"plpython\". Вы можете удалить версию этой "
+#~ "функции\n"
+#~ "из схемы \"public\", выполнив следующую команду:\n"
+#~ "\n"
+#~ " DROP FUNCTION public.plpython_call_handler()\n"
+#~ "\n"
+#~ "в каждой затронутой базе данных:\n"
+#~ "\n"
+
+#~ msgid " %s\n"
+#~ msgstr " %s\n"
+
+#~ msgid "Remove the problem functions from the old cluster to continue.\n"
+#~ msgstr "Удалите проблемные функции из старого кластера для продолжения.\n"
+
+#~ msgid "mappings for database \"%s\":\n"
+#~ msgstr "отображения для базы данных \"%s\":\n"
+
+#~ msgid "%s.%s: %u to %u\n"
+#~ msgstr "%s.%s: %u в %u\n"
+
+#~ msgid " "
+#~ msgstr " "
+
+#~ msgid "Checking for large objects"
+#~ msgstr "Проверка больших объектов"
+
+#~ msgid ""
+#~ "\n"
+#~ "Your installation contains large objects. The new database has an\n"
+#~ "additional large object permission table. After upgrading, you will be\n"
+#~ "given a command to populate the pg_largeobject_metadata table with\n"
+#~ "default permissions.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "В вашей инсталляции используются большие объекты. В новой базе данных\n"
+#~ "имеется дополнительная таблица с правами для больших объектов. После "
+#~ "обновления\n"
+#~ "вам будет представлена команда для наполнения таблицы прав\n"
+#~ "pg_largeobject_metadata правами по умолчанию.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Your installation contains large objects. The new database has an\n"
+#~ "additional large object permission table, so default permissions must be\n"
+#~ "defined for all large objects. The file\n"
+#~ " %s\n"
+#~ "when executed by psql by the database superuser will set the default\n"
+#~ "permissions.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "В вашей инсталляции используются большие объекты. В новой базе данных\n"
+#~ "имеется дополнительная таблица с правами для больших объектов, поэтому\n"
+#~ "для всех больших объектов должны определяться права по умолчанию. Скрипт\n"
+#~ " %s\n"
+#~ "будучи выполненным администратором БД в psql, установит нужные права\n"
+#~ "по умолчанию.\n"
+#~ "\n"
+
+#~ msgid "Creating script to analyze new cluster"
+#~ msgstr "Создание скрипта для анализа нового кластера"
+
+#~ msgid "check for \"%s\" failed: cannot read file (permission denied)\n"
+#~ msgstr ""
+#~ "проверка файла \"%s\" не пройдена: не удаётся прочитать файл (нет "
+#~ "доступа)\n"
+
+#~ msgid "connection to database failed: %s"
+#~ msgstr "не удалось подключиться к базе: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "connection to database failed: %s"
+#~ msgstr ""
+#~ "\n"
+#~ "не удалось подключиться к базе: %s"
+
+#~ msgid ""
+#~ "Optimizer statistics and free space information are not transferred\n"
+#~ "by pg_upgrade so, once you start the new server, consider running:\n"
+#~ " %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Статистика оптимизатора и сведения о свободном месте утилитой pg_upgrade\n"
+#~ "не переносятся, поэтому, запустив новый сервер, имеет смысл выполнить:\n"
+#~ " %s\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "could not parse PG_VERSION file from %s\n"
+#~ msgstr "не удалось разобрать файл PG_VERSION из %s\n"
+
+#~ msgid ""
+#~ "This utility can only upgrade to PostgreSQL version 9.0 after 2010-01-11\n"
+#~ "because of backend API changes made during development.\n"
+#~ msgstr ""
+#~ "Эта утилита поддерживает обновление только до версии 9.0 после "
+#~ "2010-01-11,\n"
+#~ "так как в API серверной части были внесены изменения.\n"
+
+#~ msgid "Cannot open file %s: %m\n"
+#~ msgstr "Не удаётся открыть файл %s: %m\n"
+
+#~ msgid "Cannot read line %d from %s: %m\n"
+#~ msgstr "Не удалось прочитать строку %d из %s: %m\n"
+
+#~ msgid "------------------------------------------------\n"
+#~ msgstr "------------------------------------------------\n"
+
+#~ msgid "-----------------------------\n"
+#~ msgstr "-----------------------------\n"
+
+#~ msgid "------------------\n"
+#~ msgstr "------------------\n"
+
+#~ msgid "----------------\n"
+#~ msgstr "----------------\n"
diff --git a/src/bin/pg_upgrade/po/sv.po b/src/bin/pg_upgrade/po/sv.po
new file mode 100644
index 0000000..feead9c
--- /dev/null
+++ b/src/bin/pg_upgrade/po/sv.po
@@ -0,0 +1,1861 @@
+# Swedish message translation file for pg_upgrade
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Dennis Björklund <db@zigo.dhs.org>, 2017, 2018, 2019, 2020, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-04 09:19+0000\n"
+"PO-Revision-Date: 2022-08-04 12:29+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Utför konsistenskontroller på gamla live-servern\n"
+"------------------------------------------------\n"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Utför konsistenskontroller\n"
+"--------------------------\n"
+
+#: check.c:218
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Klustren är kompatibla*\n"
+
+#: check.c:226
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Om pg_upgrade misslyckas efter denna punkt så måste du\n"
+"köra om initdb på nya klustret innan du fortsätter.\n"
+
+#: check.c:267
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"Optimeringsstatistik överförs inte av pg_upgrade.\n"
+"När du startar nya servern så vill du nog köra:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:273
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"När detta skript körs så raderas gamla klustrets datafiler:\n"
+" %s\n"
+
+#: check.c:278
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"Kunde inte skapa ett script som raderar gamla klustrets datafiler\n"
+"då användardefinierade tabellutrymmen eller nya klustrets datakatalog\n"
+"ligger i gamla klusterkatalogen. Det gamla klustrets innehåll\n"
+"måste raderas för hand.\n"
+
+#: check.c:290
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Kontrollerar klustrets versioner"
+
+#: check.c:302
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later.\n"
+msgstr "Detta verktyg kan bara uppgradera från PostgreSQL version %s eller senare.\n"
+
+#: check.c:307
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Detta verktyg kan bara uppgradera till PostgreSQL version %s.\n"
+
+#: check.c:316
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "Detta verktyg kan inte användas för att nergradera till äldre major-versioner av PostgreSQL.\n"
+
+#: check.c:321
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "Gammal klusterdata och binära kataloger är från olika major-versioner.\n"
+
+#: check.c:324
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "Nya klusterdata och binära kataloger är från olika major-versioner.\n"
+
+#: check.c:339
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Vid kontroll av en live-server så måste gamla och nya portnumren vara olika.\n"
+
+#: check.c:354
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "kodning för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#: check.c:359
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "lc_collate-värden för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#: check.c:362
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "lc_ctype-värden för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#: check.c:365
+#, c-format
+msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "localleverantörer för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#: check.c:372
+#, c-format
+msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "inställning av ICU-lokal för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#: check.c:447
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "Nya databasklustret \"%s\" är inte tomt: hittade relation \"%s.%s\"\n"
+
+#: check.c:499
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Letar efter nya tablespace-kataloger i klustret"
+
+#: check.c:510
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "i klustret finns redan ny tablespace-katalog: \"%s\"\n"
+
+#: check.c:543
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s\n"
+msgstr ""
+"\n"
+"VARNING: nya datakatalogen skall inte ligga inuti den gamla datakatalogen, dvs. %s\n"
+
+#: check.c:567
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s\n"
+msgstr "\nVARNING: användardefinierade tabellutrymmens plats skall inte vara i datakatalogen, dvs. %s\n"
+
+#: check.c:577
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Skapar skript för att radera gamla klustret"
+
+#: check.c:580 check.c:755 check.c:875 check.c:974 check.c:1105 check.c:1184
+#: check.c:1447 file.c:338 function.c:165 option.c:465 version.c:116
+#: version.c:288 version.c:423
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "kan inte öppna fil \"%s\": %s\n"
+
+#: check.c:631
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "kan inte sätta rättigheten \"körbar\" på filen \"%s\": %s\n"
+
+#: check.c:651
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Kontrollerar att databasanvändaren är installationsanvändaren"
+
+#: check.c:667
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "databasanvändare \"%s\" är inte installationsanvändaren\n"
+
+#: check.c:678
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "kunde inte bestämma antalet användare\n"
+
+#: check.c:686
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "Bara installationsanvändaren får finnas i nya klustret.\n"
+
+#: check.c:716
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Kontrollerar databasens anslutningsinställningar"
+
+#: check.c:742
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 får inte tillåta anslutningar, dvs dess pg_database.datallowconn måste vara false\n"
+
+#: check.c:772 check.c:897 check.c:999 check.c:1125 check.c:1206 check.c:1263
+#: check.c:1322 check.c:1351 check.c:1470 function.c:187 version.c:190
+#: version.c:228 version.c:372
+#, c-format
+msgid "fatal\n"
+msgstr "fatalt\n"
+
+#: check.c:773
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Alla databaser förutom template0 måste tillåta anslutningar, dvs deras\n"
+"pg_database.datallowconn måste vara true. Din installation har andra\n"
+"databaser än template0 som har pg_database.datallowconn sat till false\n"
+"Överväg att tillåta anslutningar för alla databaser förutom template0\n"
+"eller släng de databaser som inte tillåter anslutningar. En lista med\n"
+"problemdatabaser finns i filen:\n"
+" %s\n"
+"\n"
+
+#: check.c:798
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Letar efter förberedda transaktioner"
+
+#: check.c:807
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "Källklustret innehåller förberedda transaktioner\n"
+
+#: check.c:809
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "Målklustret innehåller förberedda transaktioner\n"
+
+#: check.c:835
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Letar efter contrib/isn med bigint-anropsfel"
+
+#: check.c:898
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller \"contrib/isn\"-funktioner son beror på\n"
+"datatypen bigint. Ditt gamla och nya kluster skickar bigint-värden\n"
+"på olika sätt så detta kluster kan för närvarande inte uppgraderas. Du\n"
+"kan manuellt dumpa databaser i gamla klustret som använder \"contrib/isn\"-finesser,\n"
+"radera dessa databaser, utföra uppgraderingen och sedan återställa databaserna.\n"
+"En lista med problemfunktionerna finns i filen:\n"
+" %s\n"
+"\n"
+
+#: check.c:921
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Letar efter användardefinierade postfix-operatorer"
+
+#: check.c:1000
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller användardefinierade postfix-operatorer, vilket\n"
+"inte stöds längre. Överväg att ta bort postfix-operatorer och ersätt dem\n"
+"med prefix-operatorer eller funktionsanrrop.\n"
+"En lista med användardefinierade postfix-operatorer finns i filen:\n"
+" %s\n"
+"\n"
+
+#: check.c:1024
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Letar efter inkompatibla polymorfa funktioner"
+
+#: check.c:1126
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller användardefinierade objekt som\n"
+"refererar till interna polymorfa funktioner med argument av\n"
+"typen \"anyarray\" eller \"anyelement\".\n"
+"Dessa användardefinierade objekt måste slängas innan uppgradering\n"
+"och kan återskapas efteråt efter att de ändrats till att referera till\n"
+"motsvarande nya funktioner med argument av typerna \"anycompatiblearray\"\n"
+"and \"anycompatible\".\n"
+"En lista med problemobjekten finns i filen:\n"
+" %s\n"
+"\n"
+
+#: check.c:1151
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Letar efter tabeller med WITH OIDS"
+
+#: check.c:1207
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller tabeller deklarerade med WITH OIDS som inte\n"
+"stöds längre. Överväg att ta bort oid-kolumnen med\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"En lista över tabeller med detta problem finns i filen:\n"
+" %s\n"
+"\n"
+
+# FIXME: is this msgid correct?
+#: check.c:1235
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Letar i användartabeller efter systemdefinierade typer av sorten \"composite\""
+
+#: check.c:1264
+#, c-format
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller användartabeller med systemdefinierade typer\n"
+"av sorten \"composite\". OID:er för dessa typer är inte stabila över\n"
+"PostgreSQL-versioner så detta kluster kan inte uppgraderas för tillfället.\n"
+"Du kan slänga problemkolumnerna och återstarta uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s\n"
+"\n"
+
+# FIXME: is this msgid correct?
+#: check.c:1292
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Letar efter reg*-datatyper i användartabeller"
+
+#: check.c:1323
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation använder en av reg*-datatyperna i en användartabell.\n"
+"Dessa datatyper refererar system-OID:er som inte bevaras av pg_upgrade\n"
+"så detta kluster kan för närvarande inte uppgraderas. Du kan ta bort\n"
+"problemkolumnerna och starta om uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s\n"
+"\n"
+
+# FIXME: is this msgid correct?
+#: check.c:1345
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Letar efter inkompatibel \"jsonb\"-datatyp"
+
+#: check.c:1352
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller \"jsonb\"-datatypen i användartabeller.\n"
+"Interna formatet för \"jsonb\" ändrades under 9.4-betan så detta kluster kan\n"
+"för närvarande inte uppgraderas. Du kan ta bort problemkolumnerna och\n"
+"starta om uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s\n"
+"\n"
+
+#: check.c:1374
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Letar efter roller som startar med \"pg_\""
+
+#: check.c:1384
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "Källklustret innehåller roller som startar med \"pg_\"\n"
+
+#: check.c:1386
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "Målklustret innehåller roller som startar med \"pg_\"\n"
+
+#: check.c:1407
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Letar efter användardefinierade teckenkodkonverteringar"
+
+#: check.c:1471
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller användardefinierade teckenkodkonverteringar.\n"
+"Parametrar till konverteringsfunktioner ändrades i PostgreSQL 14 så\n"
+"detta kluster kan för närvarande inte uppgraderas. Du kan ta bort\n"
+"teckenkodkonverteringarna i gamla klustret och starta om uppgraderingen.\n"
+"En lista med användardefinierade teckenkodkonverteringar finns i filen:\n"
+" %s\n"
+"\n"
+
+#: check.c:1498
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "misslyckades med att hämta aktuell lokal\n"
+
+#: check.c:1507
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "misslyckades med att hämta systemlokalnamn för \"%s\"\n"
+
+#: check.c:1513
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "misslyckades med att återställa gamla lokalen \"%s\"\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "kunde inte hämta kontrolldata med %s: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: state-problem för databaskluster\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Källklustret stängdes ner när det var i återställningsläge. För att uppgradera så använd \"rsync\" enligt dokumentation eller stäng ner den som en primär.\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Målklustret stängdes ner när det var i återställningsläge. För att uppgradera så använd \"rsync\" enligt dokumentation eller stäng ner den som en primär.\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "Källklustret har inte stängts ner på ett korrekt sätt.\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "Målklustret har inte stängts ner på ett korrekt sätt.\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "Källklustret saknar information om kluster-state:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "Målklustret saknar information om kluster-state:\n"
+
+#: controldata.c:209 dump.c:50 pg_upgrade.c:440 pg_upgrade.c:477
+#: relfilenode.c:231 server.c:34
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal-problem\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: problem vid hämtning av kontrolldata\n"
+
+#: controldata.c:572
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "Källklustret saknar lite kontrolldata som krävs:\n"
+
+#: controldata.c:575
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "Målklustret saknar lite kontrolldata som krävs:\n"
+
+#: controldata.c:578
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " checkpoint nästa-XID\n"
+
+#: controldata.c:581
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " senaste checkpoint nästa-OID\n"
+
+#: controldata.c:584
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " senaster checkpoint nästa-MultiXactId\n"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " senaste checkpoint äldsta-MultiXactId\n"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " senaste checkpoint äldsta-XID\n"
+
+#: controldata.c:594
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " senaste checkpoint nästa-MultiXactOffset\n"
+
+#: controldata.c:597
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " första WAL-segmentet efter reset\n"
+
+#: controldata.c:600
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " float8 argumentöverföringsmetod\n"
+
+#: controldata.c:603
+#, c-format
+msgid " maximum alignment\n"
+msgstr " maximal alignment\n"
+
+#: controldata.c:606
+#, c-format
+msgid " block size\n"
+msgstr " blockstorlek\n"
+
+#: controldata.c:609
+#, c-format
+msgid " large relation segment size\n"
+msgstr " stora relationers segmentstorlek\n"
+
+#: controldata.c:612
+#, c-format
+msgid " WAL block size\n"
+msgstr " WAL-blockstorlek\n"
+
+#: controldata.c:615
+#, c-format
+msgid " WAL segment size\n"
+msgstr " WAL-segmentstorlek\n"
+
+#: controldata.c:618
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " maximal identifierarlängd\n"
+
+#: controldata.c:621
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " maximalt antal indexerade kolumner\n"
+
+#: controldata.c:624
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " maximal TOAST-chunkstorlek\n"
+
+#: controldata.c:628
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " stora-objekt chunkstorlek\n"
+
+#: controldata.c:631
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " datum/tid är heltal?\n"
+
+#: controldata.c:635
+#, c-format
+msgid " data checksum version\n"
+msgstr " datachecksumversion\n"
+
+#: controldata.c:637
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "Kan inte fortsätta utan kontrollinformation som krävs, avslutar\n"
+
+#: controldata.c:652
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"gamla och nya pg_controldata-alignments är ogiltiga eller matchar inte.\n"
+"Troligen är ett kluster en 32-bitars-installation och den andra 64-bitars\n"
+
+#: controldata.c:656
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "gamla och nya pg_controldata-blockstorlekar är ogiltiga eller matchar inte\n"
+
+#: controldata.c:659
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "gamla och nya pg_controldata maximala relationssegmentstorlekar är ogiltiga eller matchar inte\n"
+
+#: controldata.c:662
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "gamla och nya pg_controldata WAL-blockstorlekar är ogiltiga eller matchar inte\n"
+
+#: controldata.c:665
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "gamla och nya pg_controldata WAL-segmentstorlekar är ogiltiga eller matchar inte\n"
+
+#: controldata.c:668
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "gamla och nya pg_controldata maximal identifierarlängder är ogiltiga eller matchar inte\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "gamla och nya pg_controldata maxilmalt indexerade kolumner ogiltiga eller matchar inte\n"
+
+#: controldata.c:674
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "gamla och nya pg_controldata maximal TOAST-chunkstorlek ogiltiga eller matchar inte\n"
+
+#: controldata.c:679
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "gamla och nya pg_controldata stora-objekt-chunkstorlekar är ogiltiga eller matchar inte\n"
+
+#: controldata.c:682
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "gamla och nya pg_controldata datum/tid-lagringstyper matchar inte\n"
+
+#: controldata.c:695
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "gamla klustret använder inte datachecksummor men nya gör det\n"
+
+#: controldata.c:698
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "gamla klustret använder datachecksummor men nya gör inte det\n"
+
+#: controldata.c:700
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "gamla och nya klustrets pg_controldata checksumversioner matchar inte\n"
+
+#: controldata.c:711
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Lägger till \".old\"-suffix till gamla global/pg_control"
+
+#: controldata.c:716
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "Kan inte byta namn på %s till %s.\n"
+
+#: controldata.c:719
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Om du vill starta gamla klustret så måste du ta bort\n"
+"\".old\"-suffixet från %s/global/pg_control.old.\n"
+"Detta då \"link\"-läge användes och gamla klustret kan inte\n"
+"startas på ett säkert sätt efter att nya klustret startats.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Skapar dump med globala objekt"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Skapar dump innehållande databasscheman"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "kunde inte hämta pg_ctl versionsdata med %s: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "kunde inte läsa versionutdata för pg_ctl från %s\n"
+
+#: exec.c:108 exec.c:112
+#, c-format
+msgid "command too long\n"
+msgstr "kommandot för långt\n"
+
+#: exec.c:114 util.c:37 util.c:310
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:153 pg_upgrade.c:279
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "kunde inte öppna loggfil \"%s\": %m\n"
+
+#: exec.c:182
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*misslyckande*"
+
+#: exec.c:185
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "Det var problem med att köra \"%s\"\n"
+
+#: exec.c:188
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Se de sista raderna i \"%s\" eller \"%s\" för\n"
+"en trolig orsak till misslyckandet.\n"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Se de sista raderna i \"%s\" för\n"
+"en trolig orsak till misslyckandet.\n"
+
+#: exec.c:208 pg_upgrade.c:289
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "kunde inte skriva till loggfil \"%s\": %m\n"
+
+#: exec.c:234
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "kunde inte öppna fil \"%s\" för läsning: %s\n"
+
+#: exec.c:261
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Du måste ha läs och skrivrättigheter till den aktuella katalogen.\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "kontroll av \"%s\" misslyckades: %s\n"
+
+#: exec.c:317 exec.c:383
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" är inte en katalog\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "kontroll av \"%s\" misslyckades: inte en vanlig fil\n"
+
+#: exec.c:436
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "kontroll av \"%s\" misslyckades: kan inte exekvera (rättighet saknas)\n"
+
+#: exec.c:442
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "kontroll av \"%s\" misslyckades: kan inte exekvera\n"
+
+#: exec.c:452
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr "kontroll av \"%s\" misslyckades: hittade felaktig version \"%s\", förväntade \"%s\"\n"
+
+#: file.c:43 file.c:63
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "fel vid kloning av relation \"%s.%s\" (\"%s\" till \"%s\"): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "fel vid kloning av relation \"%s.%s\": kunde inte öppna filen \"%s\": %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "fel vid kloning av relation \"%s.%s\": kunde inte skapa filen \"%s\": %s\n"
+
+#: file.c:89 file.c:192
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte öppna filen \"%s\": %s\n"
+
+#: file.c:94 file.c:201
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte skapa filen \"%s\": %s\n"
+
+#: file.c:108 file.c:225
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte läsa filen \"%s\": %s\n"
+
+#: file.c:120 file.c:303
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte skriva filen \"%s\": %s\n"
+
+#: file.c:134
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "fel vid kopiering av relation \"%s.%s\" (\"%s\" till \"%s\"): %s\n"
+
+#: file.c:153
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "fel vid skapande av länk för relation \"%s.%s\" (\"%s\" till \"%s\"): %s\n"
+
+#: file.c:196
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte göra stat på file \"%s\": %s\n"
+
+#: file.c:228
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "fel vid kopiering av relation \"%s.%s\": partiell sida hittad i fil \"%s\"\n"
+
+#: file.c:330 file.c:347
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "kunde inte klona fil mellan gamla och nya datakatalogen: %s\n"
+
+#: file.c:343
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "kan inte skapa fil \"%s\": %s\n"
+
+#: file.c:354
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "filkloning stöds inte på denna plattform\n"
+
+#: file.c:371
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"kunde inte skapa hård länk mellan gamla och nya datakatalogerna: %s\n"
+"I länk-läge måste gamla och nya datakatalogerna vara i samma filsystem.\n"
+
+#: function.c:129
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Kontrollerar att krävda länkbibliotek finns"
+
+#: function.c:167
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "kunde inte ladda länkbibliotek \"%s\": %s"
+
+#: function.c:178
+#, c-format
+msgid "In database: %s\n"
+msgstr "I databas: %s\n"
+
+#: function.c:188
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation refererar till laddbara bibliotek som saknas i nya\n"
+"installationen. Du kan lägga till dessa itll nya installationen eller\n"
+"ta bort funktionerna som använder dem i gamla installationen. En lista\n"
+"med problembiblioteken finns i filen:\n"
+" %s\n"
+"\n"
+
+#: info.c:125
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "Relationsname för OID %u i databas \"%s\" matchar inte: gammalt namn \"%s.%s\", nytt namn \"%s.%s\"\n"
+
+#: info.c:145
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "Misslyckades med att matcha ihop gamla och nya tabeller i databas \"%s\"\n"
+
+#: info.c:226
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " vilket är ett index för \"%s.%s\""
+
+#: info.c:236
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " vilket är ett index för OID %u"
+
+#: info.c:248
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " vilket är TOAST-tabellen för \"%s.%s\""
+
+#: info.c:256
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " vilket är TOAST-tabellen för OID %u"
+
+#: info.c:260
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "Ingen träff hittad i gamla klustret för ny relation med OID %u i databas \"%s\": %s\n"
+
+#: info.c:263
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "Ingen träff hittad i nya klustret för gammal relation med OID %u i databas \"%s\": %s\n"
+
+#: info.c:287
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"källdatabaser:\n"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"måldatabaser:\n"
+
+#: info.c:605
+#, c-format
+msgid "Database: %s\n"
+msgstr "Databas: %s\n"
+
+#: info.c:607
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:618
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relnamn: %s.%s: reloid: %u reltblutrymme: %s\n"
+
+#: option.c:100
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: kan inte köras som root\n"
+
+#: option.c:167
+#, c-format
+msgid "invalid old port number\n"
+msgstr "ogiltigt gammalt portnummer\n"
+
+#: option.c:172
+#, c-format
+msgid "invalid new port number\n"
+msgstr "ogiltigt nytt portnummer\n"
+
+#: option.c:198
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Försök med \"%s --help\" för mer information.\n"
+
+#: option.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "för många kommandoradsargument (första är \"%s\")\n"
+
+#: option.c:208
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Kör i utförligt läge\n"
+
+# FIXME: the source code need to be fixed here. it paste words together
+#: option.c:226
+msgid "old cluster binaries reside"
+msgstr "gamla klusterbinärer är i"
+
+#: option.c:228
+msgid "new cluster binaries reside"
+msgstr "nya klusterbinärer är i"
+
+#: option.c:230
+msgid "old cluster data resides"
+msgstr "gamla klusterdatan är i"
+
+#: option.c:232
+msgid "new cluster data resides"
+msgstr "nya klusterdatan är i"
+
+#: option.c:234
+msgid "sockets will be created"
+msgstr "uttag kommer skapas"
+
+#: option.c:251 option.c:350
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "kunde inte bestämma aktuell katalog\n"
+
+#: option.c:254
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "kan inte köra pg_upgrade inifrån nya klusterdatakatalogen i Windows\n"
+
+#: option.c:263
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade uppgraderar ett PostgreSQL-kluster till en annan major-version.\n"
+"\n"
+
+#: option.c:264
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: option.c:265
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [FLAGGA]...\n"
+"\n"
+
+#: option.c:266
+#, c-format
+msgid "Options:\n"
+msgstr "Flaggor:\n"
+
+#: option.c:267
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINKAT gamla klustrets katalog för körbara filer\n"
+
+#: option.c:268
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINKAT nya klustrets katalog för körbara filer\n"
+" (standard är samma som för pg_upgrade)\n"
+
+#: option.c:270
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check testa klustren bara, ändra ingen data\n"
+
+#: option.c:271
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATAKAT gamla klustrets datakatalog\n"
+
+#: option.c:272
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATAKAT nya klustrets datakatalog\n"
+
+#: option.c:273
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM antal samtidiga processer eller trådar att använda\n"
+
+#: option.c:274
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link länka istället för att kopiera filer till nya klustret\n"
+
+#: option.c:275
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync vänta inte på att ändingar säkert skrivits till disk\n"
+
+#: option.c:276
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=FLAGGOR serverflaggor för gamla klustret\n"
+
+#: option.c:277
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=FLAGGOR serverflaggor för nya klustret\n"
+
+#: option.c:278
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT gamla klustrets portnummer (standard %d)\n"
+
+#: option.c:279
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT nya klustrets portnummer (standard %d)\n"
+
+#: option.c:280
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain behåll SQL och loggfiler efter lyckad uppgradering\n"
+
+#: option.c:281
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=KAT uttagskatalog (standard är aktuell katalog.)\n"
+
+#: option.c:282
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAMN klustrets superuser (standard \"%s\")\n"
+
+#: option.c:283
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose slå på utförligt intern loggning\n"
+
+#: option.c:284
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: option.c:285
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " -clone klona istället för att kopiera filer till nya klustret\n"
+
+#: option.c:286
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denns hjälp, avsluta sedan\n"
+
+#: option.c:287
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Innan du kör pg_upgrade måste du:\n"
+" skapa ett nytt databaskluster (med nya versionens initdb)\n"
+" stänga ner den postmaster som hanterar gamla klustret\n"
+" stänga ner den postmaster som hanterar nya klustret\n"
+
+#: option.c:292
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"När du kör pg_upgrade måste du ange följande information:\n"
+" datakatalogen för gamla klustret (-d DATAKAT)\n"
+" datakatalogen för nya klustret (-D DATAKAT)\n"
+" \"bin\"-katalogen för gamla versionen (-b BINKAT)\n"
+" \"bin\"-katalogen för nya versionen (-B BINKAT)\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Till exempel:\n"
+" pg_upgrade -d gammaltKluster/data -D nyttKluster/data -b gammaltKluster/bin -B nyttKluster/bin\n"
+"eller\n"
+
+#: option.c:303
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=gammaltKluster/data\n"
+" $ export PGDATANEW=nyttKluster/data\n"
+" $ export PGBINOLD=gammaltKluster/bin\n"
+" $ export PGBINNEW=nyttKluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=gammaltKluster/data\n"
+" C:\\> set PGDATANEW=nyttKluster/data\n"
+" C:\\> set PGBINOLD=gammaltKluster/bin\n"
+" C:\\> set PGBINNEW=nyttKluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: option.c:316
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: option.c:356
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"Du måste identifiera katalogen där %s.\n"
+"Använd kommandoradsflaggan %s eller omgivningsvariabeln %s.\n"
+
+#: option.c:408
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Letar efter den riktiga datakatalogen i källklustret"
+
+#: option.c:410
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Letar efter den riktiga datakatalogen för målklustret"
+
+#: option.c:422
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "kunde inte hämta datakatalogen med %s: %s\n"
+
+#: option.c:473
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "kunde inte läsa rad %d från fil \"%s\": %s\n"
+
+#: option.c:490
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "användarangivet gammalt portnummer %hu korrigerat till %hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "kunde inte skapa arbetsprocess: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "kunde inte skapa arbetstråd: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "%s() misslyckades: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "barnprocess avslutade felaktigt: status %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "barnprocess avslutade felaktigt: %s\n"
+
+#: pg_upgrade.c:102
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "kunde inte läsa rättigheter på katalog \"%s\": %s\n"
+
+#: pg_upgrade.c:134
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Utför uppgradering\n"
+"------------------\n"
+
+#: pg_upgrade.c:177
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Sätter nästa OID för nya klustret"
+
+#: pg_upgrade.c:186
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Synkar datakatalog till disk"
+
+#: pg_upgrade.c:198
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Uppgradering klar\n"
+"-----------------\n"
+
+#: pg_upgrade.c:231 pg_upgrade.c:244 pg_upgrade.c:251 pg_upgrade.c:258
+#: pg_upgrade.c:276 pg_upgrade.c:287
+#, c-format
+msgid "directory path for new cluster is too long\n"
+msgstr "katalogsökväg för nytt kluster är för lång\n"
+
+#: pg_upgrade.c:265 pg_upgrade.c:267 pg_upgrade.c:269 pg_upgrade.c:271
+#, c-format
+msgid "could not create directory \"%s\": %m\n"
+msgstr "kunde inte skapa katalog \"%s\": %m\n"
+
+#: pg_upgrade.c:320
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: kunde inte hitta det egna programmets körbara fil\n"
+
+#: pg_upgrade.c:346
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Det verkar vara en postmaster igång som hanterar gamla klustret.\n"
+"Stänga ner den postmastern och försök igen.\n"
+
+#: pg_upgrade.c:359
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Det verkar vara en postmaster igång som hanterar nya klustret.\n"
+"Stänga ner den postmastern och försök igen.\n"
+
+#: pg_upgrade.c:373
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analyserar alla rader i nya klustret"
+
+#: pg_upgrade.c:386
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Fryser alla rader i nya klustret"
+
+#: pg_upgrade.c:406
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Återställer globala objekt i nya klustret"
+
+#: pg_upgrade.c:422
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Återställer databasscheman i nya klustret"
+
+#: pg_upgrade.c:528
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Raderar filer från ny %s"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "kunde inte ta bort katalog \"%s\"\n"
+
+#: pg_upgrade.c:551
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Kopierar gammal %s till ny server"
+
+#: pg_upgrade.c:577
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Sätter äldsta XID för nya klustret"
+
+#: pg_upgrade.c:585
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Sätter nästa transaktions-ID och epoch för nytt kluster"
+
+#: pg_upgrade.c:615
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Sätter nästa multixact-ID och offset för nytt kluster"
+
+#: pg_upgrade.c:639
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Sätter äldsta multixact-ID i nytt kluster"
+
+#: pg_upgrade.c:659
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Resettar WAL-arkiv"
+
+#: pg_upgrade.c:702
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Sätter räknarna frozenxid och minmxid för nytt kluster"
+
+#: pg_upgrade.c:704
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Sätter räknarenm minmxid för nytt kluster"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Klonar användarens relationsfiler"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Kopierar användarens relationsfiler"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Länkar användarens relationsfiler"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "gamla databasen \"%s\" kan inte hittas i nya klustret\n"
+
+#: relfilenode.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "fel vid kontroll av filexistens \"%s.%s\" (\"%s\" till \"%s\"): %s\n"
+
+#: relfilenode.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "skriver om \"%s\" till \"%s\"\n"
+
+#: relfilenode.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "klonar \"%s\" till \"%s\"\n"
+
+#: relfilenode.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "kopierar \"%s\" till \"%s\"\n"
+
+#: relfilenode.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "länkar \"%s\" till \"%s\"\n"
+
+#: server.c:39 server.c:143 util.c:220 util.c:250
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Misslyckades, avslutar\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s\n"
+msgstr "kör: %s\n"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL-kommando misslyckades\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "kunde inte öppna versionsfil \"%s\": %m\n"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "kunde inte tolka versionsfil \"%s\"\n"
+
+#: server.c:291
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:295
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"kunde inte ansluta till käll-postmaster som startats med kommandot:\n"
+"%s\n"
+
+#: server.c:299
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"kunde inte ansluta till mål-postmaster som startats med kommandot:\n"
+"%s\n"
+
+#: server.c:313
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl misslyckades att start källservern eller så misslyckades anslutningen\n"
+
+#: server.c:315
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl misslyckades att start målservern eller så misslyckades anslutningen\n"
+
+#: server.c:360
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: server.c:373
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "libpq:s omgivningsvariabel %s har ett icke-lokalt servervärde: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"Kan inte uppgradera till/från samma systemkatalogversion när\n"
+"man använder tablespace.\n"
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "tablespace-katalogen \"%s\" finns inte\n"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "kunde inte göra stat på tablespace-katalog \"%s\": %s\n"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "tablespace-sökväg \"%s\" är inte en katalog\n"
+
+#: util.c:52 util.c:55 util.c:127 util.c:160
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:95
+#, c-format
+msgid "could not access directory \"%s\": %m\n"
+msgstr "kunde inte komma åt katalog \"%s\": %m\n"
+
+#: util.c:158
+#, c-format
+msgid "%-*s\n"
+msgstr "%-*s\n"
+
+#: util.c:259
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+# FIXME: is this msgid correct?
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Letar efter inkompatibel \"line\"-datatyp"
+
+#: version.c:191
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller datatypen \"line\" i användartabeller. Denna\n"
+"datatype har ändrat sitt interna format samt sitt in/ut-format mellan din\n"
+"gamla och nya version så detta kluster kan för närvarande inte uppgraderas.\n"
+"Du kan radera problemkolumnerna och återstarta uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s\n"
+"\n"
+
+#: version.c:222
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Letar efter ogiltiga användarkolumner av typen \"unknown\""
+
+#: version.c:229
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller datatypen \"unknown\" i användartabeller.\n"
+"Denna datatyp tillåts inte längre i tabeller så detta kluster kan\n"
+"för närvarande inte uppgraderas. Du kan radera problemkolumnerna och\n"
+"återstarta uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s\n"
+"\n"
+
+#: version.c:253
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Letar efter hash-index"
+
+#: version.c:331
+#, c-format
+msgid "warning"
+msgstr "varning"
+
+#: version.c:333
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"Din installation innehåller hash-index. Dessa index har olika internt\n"
+"format i ditt gamla och nya kluster så de måste omindexeras med\n"
+"kommandot REINDEX. Efter uppgraderingen så kommer du få\n"
+"REINDEX-instruktioner.\n"
+"\n"
+
+#: version.c:339
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"Din installation innehåller hash-index. Dessa index har olika internt\n"
+"format i ditt gamla och nya kluster så de måste omindexeras med\n"
+"kommandot REINDEX. Filen\n"
+" %s\n"
+"kan köras med psql av databasens superuser och kommer återskapa alla\n"
+"ogiltiga index; innan dess så kommer inget av dess index användas.\n"
+"\n"
+
+#: version.c:365
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Letar efter ogiltiga användarkolumner av typen \"sql_identifier\""
+
+#: version.c:373
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Din installation innehåller datatypen \"sql_identifier\" i användartabeller.\n"
+"Formatet på disk för denna datatyp har ändrats så detta kluster kan för\n"
+"närvarande inte uppgraderas. Du kan radera problemkolumnerna och\n"
+"återstarta uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s\n"
+"\n"
+
+#: version.c:397
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Letar efter uppdatering av utökningar"
+
+#: version.c:449
+#, c-format
+msgid "notice"
+msgstr "notis"
+
+#: version.c:450
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"Din installation innehåller utökningar som skall updateras med kommandot\n"
+"ALTER EXTENSION. Filen\n"
+" %s\n"
+"kan köras med psql av databasens superuser och kommer uppdatera\n"
+"dessa utökningar.\n"
diff --git a/src/bin/pg_upgrade/po/uk.po b/src/bin/pg_upgrade/po/uk.po
new file mode 100644
index 0000000..8710602
--- /dev/null
+++ b/src/bin/pg_upgrade/po/uk.po
@@ -0,0 +1,1700 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:49+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_upgrade.pot\n"
+"X-Crowdin-File-ID: 916\n"
+
+#: check.c:72
+#, c-format
+msgid "Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr "Перевірка цілістності на старому працюючому сервері\n"
+"------------------------------------------------\n"
+
+#: check.c:78
+#, c-format
+msgid "Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr "Проведення перевірок цілістності\n"
+"-----------------------------\n"
+
+#: check.c:218
+#, c-format
+msgid "\n"
+"*Clusters are compatible*\n"
+msgstr "\n"
+"*Кластери сумісні*\n"
+
+#: check.c:226
+#, c-format
+msgid "\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr "\n"
+"Якщо робота pg_upgrade після цієї точки перерветься, вам потрібно буде заново виконати initdb \n"
+"для нового кластера, перед продовженням.\n"
+
+#: check.c:267
+#, c-format
+msgid "Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n\n"
+msgstr "Статистика оптимізатора не передається за допомогою pg_upgrade.\n"
+"Після запуску нового серверу, розгляньте можливість запуску:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n\n"
+
+#: check.c:273
+#, c-format
+msgid "Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr "При запуску цього скрипту файли даних старого кластера будуть видалені:\n"
+" %s\n"
+
+#: check.c:278
+#, c-format
+msgid "Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr "Не вдалося створити скрипт для видалення файлів даних старого кластеру,\n"
+"тому що каталог даних старого кластера містить користувацькі табличні\n"
+"простори або каталог даних нового кластера. Вміст старого кластера\n"
+"треба буде видалити вручну.\n"
+
+#: check.c:290
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Перевірка версій кластерів"
+
+#: check.c:302
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later.\n"
+msgstr "Ця утиліта може виконувати оновлення тільки з версії PostgreSQL %s і новіше.\n"
+
+#: check.c:307
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Ця утиліта може тільки підвищувати версію PostgreSQL до %s.\n"
+
+#: check.c:316
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "Ця утиліта не може не може використовуватись щоб понижувати версію до більш старих основних версій PostgreSQL.\n"
+
+#: check.c:321
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "Каталог даних і двійковий каталог старого кластера з різних основних версій.\n"
+
+#: check.c:324
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "Каталог даних і двійковий каталог нового кластера з різних основних версій.\n"
+
+#: check.c:339
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Для перевірки працюючого сервера, старий і новий номер порта повинні бути різними.\n"
+
+#: check.c:354
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "кодування для бази даних \"%s\" не збігаються: старе \"%s\", нове \"%s\"\n"
+
+#: check.c:359
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "значення lc_collate для бази даних \"%s\" не збігаються: старе \"%s\", нове \"%s\"\n"
+
+#: check.c:362
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "значення lc_ctype для бази даних \"%s\" не збігаються: старе \"%s\", нове \"%s\"\n"
+
+#: check.c:365
+#, c-format
+msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "постачальники локалей для бази даних \"%s\" не збігаються: старий \"%s\", новий \"%s\"\n"
+
+#: check.c:372
+#, c-format
+msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "значення локалі ICU для бази даних \"%s\" не збігаються: старий \"%s\", новий \"%s\n"
+
+#: check.c:447
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "Новий кластер бази даних \"%s\" не порожній: знайдено відношення \"%s.%s\"\n"
+
+#: check.c:499
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Перевірка каталогів табличних просторів кластера"
+
+#: check.c:510
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "каталог нового кластерного табличного простору вже існує: \"%s\"\n"
+
+#: check.c:543
+#, c-format
+msgid "\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s\n"
+msgstr "\n"
+"ПОПЕРЕДЖЕННЯ: новий каталог даних не повинен бути всередині старого каталогу даних, наприклад %s\n"
+
+#: check.c:567
+#, c-format
+msgid "\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s\n"
+msgstr "\n"
+"ПОПЕРЕДЖЕННЯ: користувацькі розташування табличних просторів не повинні бути всередині каталогу даних, наприклад %s\n"
+
+#: check.c:577
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Створення скрипту для видалення старого кластеру"
+
+#: check.c:580 check.c:755 check.c:875 check.c:974 check.c:1105 check.c:1184
+#: check.c:1447 file.c:338 function.c:165 option.c:465 version.c:116
+#: version.c:288 version.c:423
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "не вдалося відкрити файл \"%s\": %s\n"
+
+#: check.c:631
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "не вдалося додати право виконання для файлу \"%s\": %s\n"
+
+#: check.c:651
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Перевірка, чи є користувач бази даних стартовим користувачем"
+
+#: check.c:667
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "користувач бази даних \"%s\" не є стартовим користувачем\n"
+
+#: check.c:678
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "не вдалося визначити кількість користувачів\n"
+
+#: check.c:686
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "В новому кластері може бути визначеним тільки стартовий користувач.\n"
+
+#: check.c:716
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Перевірка параметрів підключення до бази даних"
+
+#: check.c:742
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 не повинна дозволяти підключення, тобто pg_database.datallowconn повинно бути false\n"
+
+#: check.c:772 check.c:897 check.c:999 check.c:1125 check.c:1206 check.c:1263
+#: check.c:1322 check.c:1351 check.c:1470 function.c:187 version.c:190
+#: version.c:228 version.c:372
+#, c-format
+msgid "fatal\n"
+msgstr "збій\n"
+
+#: check.c:773
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s\n\n"
+msgstr "Всі бази даних, окрім template0, повинні дозволяти підключення, тобто\n"
+"pg_database.datallowconn повинно бути true. Ваша інсталяція містить\n"
+"бази даних окрім template0 значення pg_database.datallowconn яких дорівнює \n"
+"false. Розгляньте можливість надати дозвіл на з’єднання для всіх баз даних, \n"
+"які не є шаблоном, або видалити баз даних, які не дозволяють з’єднання. \n"
+"Список баз даних з проблемою знаходиться у файлі:\n"
+" %s\n\n"
+
+#: check.c:798
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Перевірка підготовлених транзакцій"
+
+#: check.c:807
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "Початковий кластер містить підготовлені транзакції\n"
+
+#: check.c:809
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "Цільовий кластер містить підготовлені транзакції\n"
+
+#: check.c:835
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Перевірка невідповідності при передаванні bigint в contrib/isn"
+
+#: check.c:898
+#, c-format
+msgid "Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить функції \"contrib/isn\", що використовують тип даних bigint. Старі та нові кластери передають значення bigint по-різному, тому цей кластер наразі неможливо оновити. Ви можете вручну вивантажити бази даних зі старого кластеру, що використовує засоби \"contrib/isn\", видалити їх, виконати оновлення, а потім відновити їх. Список проблемних функцій подано у файлі:\n"
+" %s\n\n"
+
+#: check.c:921
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Перевірка постфіксних операторів визначених користувачем"
+
+#: check.c:1000
+#, c-format
+msgid "Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить користувацькі постфіксні оператори, що більше не підтримуються.\n"
+"Розгляньте можливість видалення постфіксних операторів та заміни їх на префіксні оператори або виклики функцій.\n"
+"Список користувацьких постфіксних операторів знаходиться у файлі:\n"
+" %s\n\n"
+
+#: check.c:1024
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Перевірка несумісних поліморфних функцій"
+
+#: check.c:1126
+#, c-format
+msgid "Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s\n\n"
+msgstr "У вашій інсталяції містяться користувацькі об'єкти, які посилаються на внутрішні\n"
+"поліморфні функції з аргументами типу \"anyarray\" або \"anyelement\".\n"
+"Ці користувацькі об'єкти повинні бути видалені перед оновленням і відновлені\n"
+"після цього, змінивши їх посилання на нові відповідні функції з\n"
+"аргументами типу \"anycompatiblearray\" і \"anycompatible\".\n"
+"Список проблемних об'єктів знаходиться у файлі:\n"
+" %s\n\n"
+
+#: check.c:1151
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Перевірка таблиць WITH OIDS"
+
+#: check.c:1207
+#, c-format
+msgid "Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить таблиці, створені як WITH OIDS, що більше не підтримуються. Розгляньте видалення стовпців, що містять oid за допомогою\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Список проблемних таблиць подано у файлі:\n"
+" %s\n\n"
+
+#: check.c:1235
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Перевірка складених типів визначених системою у таблицях користувача"
+
+#: check.c:1264
+#, c-format
+msgid "Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить складені типи визначені системою у таблицях користувача.\n"
+"Ці типи OID не стабільні між версіями PostgreSQL, тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s\n\n"
+
+#: check.c:1292
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Перевірка типів даних reg* в користувацьких таблицях"
+
+#: check.c:1323
+#, c-format
+msgid "Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить один з типів даних reg* у таблицях користувача.\n"
+"Ці типи даних посилаються на OID системи, які не зберігаються за допомогою pg_upgrade, тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s\n\n"
+
+#: check.c:1345
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Перевірка несумісного типу даних \"jsonb\""
+
+#: check.c:1352
+#, c-format
+msgid "Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить тип даних \"jsonb\" у таблицях користувача.\n"
+"Внутрішній формат \"jsonb\" змінено під час версії 9.4 beta,\n"
+"тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s\n\n"
+
+#: check.c:1374
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Перевірка ролей, які починаються з \"pg_\""
+
+#: check.c:1384
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "Початковий кластер містить ролі, які починаються з \"pg_\"\n"
+
+#: check.c:1386
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "Цільовий кластер містить ролі, які починаються з \"pg_\"\n"
+
+#: check.c:1407
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Перевірка користувацьких перетворення кодувань"
+
+#: check.c:1471
+#, c-format
+msgid "Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить користувацькі перетворення кодувань.\n"
+"Параметри функції перетворення змінено у версії PostgreSQL 14,\n"
+"тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити перетворення кодувань в старому кластері та перезапустити оновлення.\n"
+"Список перетворень кодувань знаходиться у файлі:\n"
+" %s\n\n"
+
+#: check.c:1498
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "не вдалося отримати поточну локаль\n"
+
+#: check.c:1507
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "не вдалося отримати системне ім'я локалі для \"%s\"\n"
+
+#: check.c:1513
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "не вдалося відновити стару локаль \"%s\"\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "не вдалося отримати контрольні дані за допомогою %s: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: неприпустимий стан кластера баз даних\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Початковий кластер завершив роботу в режимі відновлення. Щоб виконати оновлення, використайте документований спосіб з \"rsync\" або вимкніть його в режимі головного сервера.\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Цільовий кластер завершив роботу в режимі відновлення. Щоб виконати оновлення, використайте документований спосіб з \"rsync\" або вимкніть його в режимі головного сервера.\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "Початковий кластер завершив роботу некоректно.\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "Цільовий кластер завершив роботу некоректно.\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "В початковому кластері відсутня інформація про стан кластеру:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "В цільовому кластері відсутня інформація про стан кластеру:\n"
+
+#: controldata.c:209 dump.c:50 pg_upgrade.c:440 pg_upgrade.c:477
+#: relfilenode.c:231 server.c:34
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: проблема pg_resetwal\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: проблема з отриманням контрольних даних\n"
+
+#: controldata.c:572
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "У початковому кластері відсутня необхідна контрольна інформація:\n"
+
+#: controldata.c:575
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "У цільовому кластері відсутня необхідна контрольна інформація:\n"
+
+#: controldata.c:578
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " наступний XID контрольної точки\n"
+
+#: controldata.c:581
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " наступний OID останньої контрольної точки\n"
+
+#: controldata.c:584
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " наступний MultiXactId останньої контрольної точки\n"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " найстарший MultiXactId останньої контрольної точки\n"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint oldestXID\n"
+msgstr " найстарший oldestXID останньої контрольної точки\n"
+
+#: controldata.c:594
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " наступний MultiXactOffset останньої контрольної точки\n"
+
+#: controldata.c:597
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " перший сегмет WAL після скидання\n"
+
+#: controldata.c:600
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " метод передачі аргументу float8\n"
+
+#: controldata.c:603
+#, c-format
+msgid " maximum alignment\n"
+msgstr " максимальне вирівнювання\n"
+
+#: controldata.c:606
+#, c-format
+msgid " block size\n"
+msgstr " розмір блоку\n"
+
+#: controldata.c:609
+#, c-format
+msgid " large relation segment size\n"
+msgstr " розмір сегменту великого відношення\n"
+
+#: controldata.c:612
+#, c-format
+msgid " WAL block size\n"
+msgstr " розмір блоку WAL\n"
+
+#: controldata.c:615
+#, c-format
+msgid " WAL segment size\n"
+msgstr " розмір сегменту WAL\n"
+
+#: controldata.c:618
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " максимальна довжина ідентифікатора\n"
+
+#: controldata.c:621
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " максимальна кількість індексованих стовпців\n"
+
+#: controldata.c:624
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " максимальний розмір порції TOAST\n"
+
+#: controldata.c:628
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " розмір порції великого об'єкту\n"
+
+#: controldata.c:631
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " дата/час представлені цілими числами?\n"
+
+#: controldata.c:635
+#, c-format
+msgid " data checksum version\n"
+msgstr " версія контрольних сум даних\n"
+
+#: controldata.c:637
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "Не можна продовжити без необхідної контрольної інформації, завершення\n"
+
+#: controldata.c:652
+#, c-format
+msgid "old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr "старе і нове вирівнювання в pg_controldata неприпустимі або не збігаються\n"
+"Ймовірно, один кластер встановлений у 32-бітній системі, а інший - у 64-бітній\n"
+
+#: controldata.c:656
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "старий і новий розмір блоків в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:659
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "старий і новий максимальний розмір сегментів відношень в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:662
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "старий і новий розмір блоків WAL в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:665
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "старий і новий розмір сегментів WAL в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:668
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "стара і нова максимальна довжина ідентифікаторів в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "стара і нова максимальна кількість індексованих стовпців в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:674
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "старий і новий максимальний розмір порції TOAST в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:679
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "старий і новий розмір порції великого об'єкту в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:682
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "старий і новий тип сховища дати/часу в pg_controldata неприпустимі або не збігаються\n"
+
+#: controldata.c:695
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "старий кластер не використовує контрольні суми даних, але новий використовує\n"
+
+#: controldata.c:698
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "старий кластер використовує контрольні суми даних, але новий не використовує\n"
+
+#: controldata.c:700
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "стара і нова версія контрольних сум кластера в pg_controldata не збігаються\n"
+
+#: controldata.c:711
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Додавання суфікса \".old\" до старого файла global/pg_control"
+
+#: controldata.c:716
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "Не вдалося перейменувати %s на %s.\n"
+
+#: controldata.c:719
+#, c-format
+msgid "\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n\n"
+msgstr "\n"
+"Якщо ви хочете запустити старий кластер, вам необхідно видалити\n"
+"суфікс \".old\" з файлу %s/global/pg_control.old. Через використання\n"
+"режиму \"link\" робота старого кластера після запуску нового може бути\n"
+"небезпечна.\n\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Створення вивантаження глобальних об'єктів"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Створення дампу схем бази даних"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "не вдалося отримати дані версії pg_ctl, виконавши %s: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "не вдалося отримати версію pg_ctl з результату %s\n"
+
+#: exec.c:108 exec.c:112
+#, c-format
+msgid "command too long\n"
+msgstr "команда занадто довга\n"
+
+#: exec.c:114 util.c:37 util.c:310
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:153 pg_upgrade.c:279
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "не вдалося відкрити файл журналу \"%s\": %m\n"
+
+#: exec.c:182
+#, c-format
+msgid "\n"
+"*failure*"
+msgstr "\n"
+"*неполадка*"
+
+#: exec.c:185
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "Під час виконання \"%s\" виникли проблеми\n"
+
+#: exec.c:188
+#, c-format
+msgid "Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr "Щоб зрозуміти причину неполадки, зверніться до декількох останніх рядків\n"
+"файлу \"%s\" або \"%s\".\n"
+
+#: exec.c:193
+#, c-format
+msgid "Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr "Щоб зрозуміти причину неполадки, зверніться до декількох останніх рядків\n"
+"файлу \"%s\".\n"
+
+#: exec.c:208 pg_upgrade.c:289
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "не вдалося записати до файлу журналу \"%s\": %m\n"
+
+#: exec.c:234
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "не вдалося відкрити файл \"%s\" для читання: %s\n"
+
+#: exec.c:261
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Ви повинні мати права на читання і запис в поточному каталозі.\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "перевірка \"%s\" провалена: %s\n"
+
+#: exec.c:317 exec.c:383
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" не є каталогом\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "перевірка \"%s\" провалена: це не звичайний файл\n"
+
+#: exec.c:436
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "перевірка \"%s\" провалена: виконання неможливе (немає доступу)\n"
+
+#: exec.c:442
+#, c-format
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "помилка перевірки \"%s\": не можна виконати\n"
+
+#: exec.c:452
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr "помилка перевірки \"%s\": неправильна версія: знайдено \"%s\", очікувалось \"%s\"\n"
+
+#: file.c:43 file.c:63
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "помилка при клонуванні відношення \"%s.%s\" (\"%s\" до \"%s\"): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "помилка при клонуванні відношення \"%s.%s\": не вдалося відкрити файл \"%s\": %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "помилка при клонуванні відношення \"%s.%s\": не вдалося створити файл \"%s\": %s\n"
+
+#: file.c:89 file.c:192
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "помилка під час копіювання відношення \"%s.%s\": не вдалося відкрити файл \"%s\": %s\n"
+
+#: file.c:94 file.c:201
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "помилка під час копіювання відношення \"%s.%s\": не вдалося створити файл \"%s\": %s\n"
+
+#: file.c:108 file.c:225
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "помилка під час копіювання відношення \"%s.%s\": не вдалося прочитати файл \"%s\": %s\n"
+
+#: file.c:120 file.c:303
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "помилка під час копіювання відношення \"%s.%s\": не вдалося записати до файлу \"%s\": %s\n"
+
+#: file.c:134
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "помилка під час копіювання відношення \"%s.%s\" ( з \"%s\" в \"%s\"): %s\n"
+
+#: file.c:153
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "помилка під час створення посилання для відношення \"%s.%s\" ( з \"%s\" в \"%s\"): %s\n"
+
+#: file.c:196
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "помилка під час копіювання відношення \"%s.%s\": не вдалося отримати стан файлу \"%s\": %s\n"
+
+#: file.c:228
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "помилка під час копіювання відношення \"%s.%s\": у файлі \"%s\" знайдена часткова сторінка\n"
+
+#: file.c:330 file.c:347
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "не вдалося клонувати файл між старим і новим каталогами даних: %s\n"
+
+#: file.c:343
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "не можливо створити файл \"%s\": %s\n"
+
+#: file.c:354
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "клонування файлів не підтримується на цій платформі\n"
+
+#: file.c:371
+#, c-format
+msgid "could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr "не вдалося створити жорстке посилання між старим і новим каталогами даних: %s\n"
+"В режимі посилань старий і новий каталоги даних повинні знаходитись в одній файловій системі.\n"
+
+#: function.c:129
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Перевірка наявності необхідних бібліотек"
+
+#: function.c:167
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "не вдалося завантажити бібліотеку \"%s\": %s"
+
+#: function.c:178
+#, c-format
+msgid "In database: %s\n"
+msgstr "У базі даних: %s\n"
+
+#: function.c:188
+#, c-format
+msgid "Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n\n"
+msgstr "У вашій інсталяції є посилання на завантажувані бібліотеки, що \n"
+"відсутні в новій інсталяції. Ви можете додати ці бібліотеки до нової інсталяції\n"
+"або видалити функції, які використовують їх зі старої інсталяції. Список\n"
+"проблемних бібліотек подано у файлі:\n"
+" %s\n\n"
+
+#: info.c:125
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "Імена відношень з OID %u в базі даних \"%s\" не збігаються: старе ім'я \"%s.%s\", нове ім'я \"%s.%s\"\n"
+
+#: info.c:145
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "Не вдалося зіставити старі таблиці з новими в базі даних \"%s\"\n"
+
+#: info.c:226
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " це індекс в \"%s.%s\""
+
+#: info.c:236
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " це індекс у відношенні з OID %u"
+
+#: info.c:248
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " це TOAST-таблиця для \"%s.%s\""
+
+#: info.c:256
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " це TOAST-таблиця для відношення з OID %u"
+
+#: info.c:260
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "У старому кластері не знайдено відповідності для нового відношення з OID %u в базі даних %s\": %s\n"
+
+#: info.c:263
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "У новому кластері не знайдено відповідності для старого відношення з OID %u в базі даних \"%s\": %s\n"
+
+#: info.c:287
+#, c-format
+msgid "\n"
+"source databases:\n"
+msgstr "\n"
+"вихідні бази даних:\n"
+
+#: info.c:289
+#, c-format
+msgid "\n"
+"target databases:\n"
+msgstr "\n"
+"цільові бази даних:\n"
+
+#: info.c:605
+#, c-format
+msgid "Database: %s\n"
+msgstr "База даних: %s\n"
+
+#: info.c:607
+#, c-format
+msgid "\n\n"
+msgstr "\n\n"
+
+#: info.c:618
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "ім'я_відношення: %s.%s: oid_відношення: %u табл_простір: %s\n"
+
+#: option.c:100
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: не може виконуватись як root\n"
+
+#: option.c:167
+#, c-format
+msgid "invalid old port number\n"
+msgstr "неприпустимий старий номер порту\n"
+
+#: option.c:172
+#, c-format
+msgid "invalid new port number\n"
+msgstr "неприпустимий новий номер порту\n"
+
+#: option.c:198
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n"
+
+#: option.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "забагато аргументів у командному рядку (перший \"%s\")\n"
+
+#: option.c:208
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Виконується в детальному режимі\n"
+
+#: option.c:226
+msgid "old cluster binaries reside"
+msgstr "розташування двійкових даних старого кластера"
+
+#: option.c:228
+msgid "new cluster binaries reside"
+msgstr "розташування двійкових даних нового кластера"
+
+#: option.c:230
+msgid "old cluster data resides"
+msgstr "розташування даних старого кластера"
+
+#: option.c:232
+msgid "new cluster data resides"
+msgstr "розташування даних нового кластера"
+
+#: option.c:234
+msgid "sockets will be created"
+msgstr "сокети будуть створені"
+
+#: option.c:251 option.c:350
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "не вдалося визначити поточний каталог\n"
+
+#: option.c:254
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "у Windows не можна виконати pg_upgrade всередині каталогу даних нового кластера\n"
+
+#: option.c:263
+#, c-format
+msgid "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n\n"
+msgstr "pg_upgrade оновлює кластер PostgreSQL до іншої основної версії.\n\n"
+
+#: option.c:264
+#, c-format
+msgid "Usage:\n"
+msgstr "Використання:\n"
+
+#: option.c:265
+#, c-format
+msgid " pg_upgrade [OPTION]...\n\n"
+msgstr " pg_upgrade [OPTION]...\n\n"
+
+#: option.c:266
+#, c-format
+msgid "Options:\n"
+msgstr "Параметри:\n"
+
+#: option.c:267
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR каталог виконуваних файлів старого кластера\n"
+
+#: option.c:268
+#, c-format
+msgid " -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr " -B, --new-bindir=BINDIR каталог виконуваних файлів нового кластера (за замовчуванням\n"
+" той самий каталог, що і pg_upgrade)\n"
+
+#: option.c:270
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check тільки перевірити кластери, не змінювати ніякі дані\n"
+
+#: option.c:271
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR каталог даних старого кластера\n"
+
+#: option.c:272
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR каталог даних нового кластера\n"
+
+#: option.c:273
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM число одночасних процесів або потоків для використання\n"
+
+#: option.c:274
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link встановлювати посилання замість копіювання файлів до нового кластера\n"
+
+#: option.c:275
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync не чекати завершення збереження змін на диску\n"
+
+#: option.c:276
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS параметри старого кластера, які передаються серверу\n"
+
+#: option.c:277
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONS параметри нового кластера, які передаються серверу\n"
+
+#: option.c:278
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT номер порту старого кластера (за замовчуванням %d)\n"
+
+#: option.c:279
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT номер порту нового кластера (за замовчуванням %d)\n"
+
+#: option.c:280
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain зберегти файли журналів і SQL після успішного завершення\n"
+
+#: option.c:281
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR директорія сокету для використання (за замовчування поточна директорія)\n"
+
+#: option.c:282
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME суперкористувач кластера (за замовчуванням \"%s\")\n"
+
+#: option.c:283
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose активувати виведення детальних внутрішніх повідомлень\n"
+
+#: option.c:284
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version відобразити інформацію про версію, потім вийти\n"
+
+#: option.c:285
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone клонувати замість копіювання файлів до нового кластера\n"
+
+#: option.c:286
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: option.c:287
+#, c-format
+msgid "\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr "\n"
+"До виконання pg_upgrade ви повинні:\n"
+" створити новий кластер баз даних (використовуючи нову версію initdb)\n"
+" завершити процес postmaster, який обслуговує старий кластер\n"
+" завершити процес postmaster, який обслуговує новий кластер\n"
+
+#: option.c:292
+#, c-format
+msgid "\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr "\n"
+"Коли ви виконуєте pg_upgrade, ви повинні надати наступну інформацію:\n"
+" каталог даних старого кластера (-d DATADIR)\n"
+" каталог даних нового кластера (-D DATADIR)\n"
+" каталог \"bin\" старого кластера (-b BINDIR)\n"
+" каталог \"bin\" нового кластера (-B BINDIR)\n"
+
+#: option.c:298
+#, c-format
+msgid "\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr "\n"
+"Наприклад:\n"
+" pg_upgrade -d старий_кластер/data -D новий_кластер/data -b старий_кластер/bin -B новий_кластер/bin\n"
+"або\n"
+
+#: option.c:303
+#, c-format
+msgid " $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr " $ export PGDATAOLD=старий_кластер/data\n"
+" $ export PGDATANEW=новий_кластер/data\n"
+" $ export PGBINOLD=старий_кластер/bin\n"
+" $ export PGBINNEW=новий_кластер/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:309
+#, c-format
+msgid " C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr " C:\\> set PGDATAOLD=старий_кластер/data\n"
+" C:\\> set PGDATANEW=новий_кластер/data\n"
+" C:\\> set PGBINOLD=старий_кластер/bin\n"
+" C:\\> set PGBINNEW=новий_кластер/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"Повідомляти про помилки на <%s>.\n"
+
+#: option.c:316
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: option.c:356
+#, c-format
+msgid "You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr "Ви повинні визначити каталог, де знаходиться %s.\n"
+"Будь ласка, використайте параметр командного рядка %s або змінну середовища %s.\n"
+
+#: option.c:408
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Пошук дійсного каталогу даних для початкового кластера"
+
+#: option.c:410
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Пошук дійсного каталогу даних для цільового кластера"
+
+#: option.c:422
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "не вдалося отримати каталог даних, виконавши %s: %s\n"
+
+#: option.c:473
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "не вдалося прочитати рядок %d з файлу \"%s\": %s\n"
+
+#: option.c:490
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "вказаний користувачем старий номер порту %hu змінений на %hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "не вдалося створити робочий процес: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "не вдалося створити робочий потік: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "%s() failed: %s\n"
+msgstr "%s() помилка: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "дочірній процес завершився ненормально: статус %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "дочірній процес завершився аварійно: %s\n"
+
+#: pg_upgrade.c:102
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "не вдалося прочитати права на каталог \"%s\": %s\n"
+
+#: pg_upgrade.c:134
+#, c-format
+msgid "\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr "\n"
+"Виконання оновлення\n"
+"------------------\n"
+
+#: pg_upgrade.c:177
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Встановлення наступного OID для нового кластера"
+
+#: pg_upgrade.c:186
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Синхронізація каталогу даних на диск"
+
+#: pg_upgrade.c:198
+#, c-format
+msgid "\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr "\n"
+"Оновлення завершено\n"
+"----------------\n"
+
+#: pg_upgrade.c:231 pg_upgrade.c:244 pg_upgrade.c:251 pg_upgrade.c:258
+#: pg_upgrade.c:276 pg_upgrade.c:287
+#, c-format
+msgid "directory path for new cluster is too long\n"
+msgstr "шлях каталогу для нового кластеру занадто довгий\n"
+
+#: pg_upgrade.c:265 pg_upgrade.c:267 pg_upgrade.c:269 pg_upgrade.c:271
+#, c-format
+msgid "could not create directory \"%s\": %m\n"
+msgstr "не вдалося створити каталог \"%s\": %m\n"
+
+#: pg_upgrade.c:320
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: не вдалося знайти ехе файл власної програми\n"
+
+#: pg_upgrade.c:346
+#, c-format
+msgid "There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr "Мабуть, запущений процес postmaster, який обслуговує старий кластер.\n"
+"Будь ласка, завершіть роботу процесу і спробуйте знову.\n"
+
+#: pg_upgrade.c:359
+#, c-format
+msgid "There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr "Мабуть, запущений процес postmaster, який обслуговує новий кластер.\n"
+"Будь ласка, завершіть роботу процесу і спробуйте знову.\n"
+
+#: pg_upgrade.c:373
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Аналіз всіх рядків у новому кластері"
+
+#: pg_upgrade.c:386
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Закріплення всіх рядків у новому кластері"
+
+#: pg_upgrade.c:406
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Відновлення глобальних об'єктів у новому кластері"
+
+#: pg_upgrade.c:422
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Відновлення схем баз даних у новому кластері"
+
+#: pg_upgrade.c:528
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Видалення файлів з нового %s"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "не вдалося видалити каталог \"%s\"\n"
+
+#: pg_upgrade.c:551
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Копіювання старого %s до нового серверу"
+
+#: pg_upgrade.c:577
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Встановлення найстарішого XID для нового кластеру"
+
+#: pg_upgrade.c:585
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Установка наступного ID транзакції й епохи для нового кластера"
+
+#: pg_upgrade.c:615
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Установка наступного ID і зсуву мультитранзакції для нового кластера"
+
+#: pg_upgrade.c:639
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Установка найстаршого ID мультитранзакції в новому кластері"
+
+#: pg_upgrade.c:659
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Скидання архівів WAL"
+
+#: pg_upgrade.c:702
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Установка лічильників frozenxid і minmxid у новому кластері"
+
+#: pg_upgrade.c:704
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Установка лічильника minmxid у новому кластері"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Клонування файлів користувацьких відношень"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Копіювання файлів користувацьких відношень"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Приєднання файлів користувацьких відношень"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "стара база даних \"%s\" не знайдена в новому кластері\n"
+
+#: relfilenode.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "помилка під час перевірки існування файлу \"%s.%s\" (з \"%s\" в \"%s\"): %s\n"
+
+#: relfilenode.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "перезаписування \"%s\" в \"%s\"\n"
+
+#: relfilenode.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "клонування \"%s\" до \"%s\"\n"
+
+#: relfilenode.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "копіювання \"%s\" в \"%s\"\n"
+
+#: relfilenode.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "створення посилання на \"%s\" в \"%s\"\n"
+
+#: server.c:39 server.c:143 util.c:220 util.c:250
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Помилка, вихід\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s\n"
+msgstr "виконується: %s\n"
+
+#: server.c:139
+#, c-format
+msgid "SQL command failed\n"
+"%s\n"
+"%s"
+msgstr "Помилка SQL-команди\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "не вдалося відкрити файл версії \"%s\": %m\n"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "не вдалося проаналізувати файл версії \"%s\"\n"
+
+#: server.c:291
+#, c-format
+msgid "\n"
+"%s"
+msgstr "\n"
+"%s"
+
+#: server.c:295
+#, c-format
+msgid "could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr "не вдалося підключитися до початкового процесу postmaster, запущеного командою:\n"
+"%s\n"
+
+#: server.c:299
+#, c-format
+msgid "could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr "не вдалося підключитися до цільового процесу postmaster, запущеного командою:\n"
+"%s\n"
+
+#: server.c:313
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl не зміг запустити початковий сервер або сталася помилка підключення\n"
+
+#: server.c:315
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl не зміг запустити цільовий сервер або сталася помилка підключення\n"
+
+#: server.c:360
+#, c-format
+msgid "out of memory\n"
+msgstr "недостатньо пам'яті\n"
+
+#: server.c:373
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "у змінній середовища для libpq %s задано не локальне значення: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid "Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr "Оновлення в межах однієї версії системного каталогу неможливе,\n"
+"якщо використовуються табличні простори.\n"
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "каталог табличного простору \"%s\" не існує\n"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "не вдалося отримати стан каталогу табличного простору \"%s\": %s\n"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "шлях табличного простору \"%s\" не вказує на каталог\n"
+
+#: util.c:52 util.c:55 util.c:127 util.c:160
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:95
+#, c-format
+msgid "could not access directory \"%s\": %m\n"
+msgstr "не вдалося отримати доступ до каталогу \"%s\": %m\n"
+
+#: util.c:158
+#, c-format
+msgid "%-*s\n"
+msgstr "%-*s\n"
+
+#: util.c:259
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Перевірка несумісного типу даних \"line\""
+
+#: version.c:191
+#, c-format
+msgid "Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить тип даних \"line\" в таблицях користувача.\n"
+"Внутрішній формат та формат вводу/виводу цього типу даних змінено між вашою старою та новими версіями,\n"
+"тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s\n\n"
+
+#: version.c:222
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Перевірка неприпустимих користувацьких стовпців \"unknown\""
+
+#: version.c:229
+#, c-format
+msgid "Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить \"unknown\" тип даних у таблицях користувача.\n"
+"Цей тип даних більше не допускається в таблицях,\n"
+"тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s\n\n"
+
+#: version.c:253
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Перевірка геш-індексів"
+
+#: version.c:331
+#, c-format
+msgid "warning"
+msgstr "попередження"
+
+#: version.c:333
+#, c-format
+msgid "\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n\n"
+msgstr "\n"
+"Ваша інсталяція містить геш-індекси. Ці індекси мають різні внутрішні\n"
+"формати в старому і новому кластерах, тож їх потрібно повторно індексувати\n"
+"за допомогою команди REINDEX. Після оновлення вам буде надано інструкції REINDEX.\n\n"
+
+#: version.c:339
+#, c-format
+msgid "\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n\n"
+msgstr "\n"
+"Ваша інсталяція містить геш-індекси. Ці індекси мають різні внутрішні\n"
+"формати в старому і новому кластерах, тож їх потрібно повторно індексувати\n"
+"за допомогою команди REINDEX. Файл\n"
+" %s\n"
+"після виконання суперкористувачем бази даних в psql, повторно створить\n"
+"всі неприпустимі індекси; до цього ніякі геш-індекси не будуть використовуватись.\n\n"
+
+#: version.c:365
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Перевірка неприпустимих користувацьких стовпців \"sql_identifier\""
+
+#: version.c:373
+#, c-format
+msgid "Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n\n"
+msgstr "Ваша інсталяція містить \"sql_identifier\" тип даних у таблицях користувача.\n"
+"Формат зберігання для цього типу даних змінено,\n"
+"тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s\n\n"
+
+#: version.c:397
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Перевірка оновлень розширення"
+
+#: version.c:449
+#, c-format
+msgid "notice"
+msgstr "повідомлення"
+
+#: version.c:450
+#, c-format
+msgid "\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n\n"
+msgstr "\n"
+"Ваша інсталяція містить розширення, які потрібно оновити\n"
+"командою ALTER EXTENSION . Файл\n"
+" %s,\n"
+"коли виконується суперкористувачем бази даних за допомогою\n"
+"psql, оновить ці розширення.\n\n"
+
diff --git a/src/bin/pg_upgrade/po/zh_CN.po b/src/bin/pg_upgrade/po/zh_CN.po
new file mode 100644
index 0000000..4ab61a5
--- /dev/null
+++ b/src/bin/pg_upgrade/po/zh_CN.po
@@ -0,0 +1,1850 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+# FIRST AUTHOR <zhangjie2@fujitsu.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:46+0000\n"
+"PO-Revision-Date: 2021-08-15 18:40+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: check.c:70
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"在旧的活动的服务器上执行一致性检查\n"
+"------------------------------------------------\n"
+
+#: check.c:76
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"正在执行一致性检查\n"
+"-----------------------------\n"
+
+#: check.c:213
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*群集是兼容的*\n"
+
+#: check.c:219
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"如果pg_upgrade在这一点之后失败,在继续之前必须重新初始化新集群.\n"
+
+#: check.c:264
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"优化器统计数据不会通过pg_upgrade传输。\n"
+"启动新服务器后,考虑运行:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:270
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"运行此脚本将删除旧群集的数据文件:\n"
+" %s\n"
+
+#: check.c:275
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"无法创建删除旧群集数据文件的脚本.\n"
+"因为用户定义的表空间或新集群的数据目录存在于旧集群目录中.\n"
+"必须手动删除旧群集的内容.\n"
+
+#: check.c:287
+#, c-format
+msgid "Checking cluster versions"
+msgstr "正在检查群集版本"
+
+#: check.c:299
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "此实用程序只能从PostgreSQL 8.4及更高版本升级.\n"
+
+#: check.c:303
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "此实用程序只能升级到PostgreSQL版本%s.\n"
+
+#: check.c:312
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "此实用程序不能用于降级到旧的主PostgreSQL版本.\n"
+
+#: check.c:317
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "旧的集群数据和二进制目录来自不同的主版本.\n"
+
+#: check.c:320
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "新的集群数据和二进制目录来自不同的主版本.\n"
+
+#: check.c:337
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "在检查pre-PG 9.1之前的活动旧服务器时,必须指定旧服务器的端口号.\n"
+
+#: check.c:341
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "检查活动服务器时,新端口号和旧端口号必须不同.\n"
+
+#: check.c:356
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "数据库\"%s\"的编码不匹配: 旧的 \"%s\", 新的 \"%s\"\n"
+
+#: check.c:361
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "数据库\"%s\"的lc_collate不匹配: 旧的 \"%s\", 新的 \"%s\"\n"
+
+#: check.c:364
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "数据库\"%s\"的lc_ctype不匹配: 旧的 \"%s\", 新的 \"%s\"\n"
+
+#: check.c:437
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "新群集数据库\"%s\"不是空的:找到关系\"%s.%s\"\n"
+
+#: check.c:494
+msgid "Checking for new cluster tablespace directories"
+msgstr "正在检查新的群集表空间目录"
+
+#: check.c:505
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "新的群集表空间目录已存在: \"%s\"\n"
+
+#: check.c:538
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"警告:新数据目录不应位于旧数据目录中,例如 %s\n"
+
+#: check.c:562
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"警告:用户定义的表空间位置不应在数据目录中,例如 %s\n"
+
+#: check.c:572
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "正在创建删除旧群集的脚本"
+
+#: check.c:575 check.c:839 check.c:937 check.c:1016 check.c:1278 file.c:336
+#: function.c:240 option.c:497 version.c:54 version.c:204 version.c:376
+#: version.c:511
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "无法打开文件 \"%s\": %s\n"
+
+#: check.c:631
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "无法向文件\"%s\"添加执行权限: %s\n"
+
+#: check.c:651
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "正在检查数据库用户是否为安装用户"
+
+#: check.c:667
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "数据库用户\"%s\"不是安装用户\n"
+
+#: check.c:678
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "无法确定用户数\n"
+
+#: check.c:686
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "只能在新群集中定义安装用户.\n"
+
+#: check.c:706
+#, c-format
+msgid "Checking database connection settings"
+msgstr "正在检查数据库连接设置"
+
+#: check.c:728
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0不能允许连接,即,其pg_database.datallowconn必须为false\n"
+
+#: check.c:738
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "所有非template0数据库必须允许连接,即,它们的pg_database.dataallowconn必须为true\n"
+
+#: check.c:763
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "正在检查准备的交易记录"
+
+#: check.c:772
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "源群集包含准备好的事务\n"
+
+#: check.c:774
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "目标集群包含准备好的事务\n"
+
+#: check.c:800
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "正在检查contrib/isn和bigint-passing是否不匹配"
+
+#: check.c:861 check.c:962 check.c:1038 check.c:1095 check.c:1154 check.c:1183
+#: check.c:1301 function.c:262 version.c:278 version.c:316 version.c:460
+#, c-format
+msgid "fatal\n"
+msgstr "致命的\n"
+
+#: check.c:862
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含\"contrib/isn\"函数,这些函数依赖于bigint数据类型\n"
+"旧群集和新群集传递的bigint值不同,因此当前无法升级此群集\n"
+"您可以手动的在旧集群中转储数据库,\n"
+"使用 \"contrib/isn\"\n"
+"删除它们,执行升级,然后恢复它们。\n"
+"文件中有问题函数的列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:885
+msgid "Checking for user-defined postfix operators"
+msgstr "正在检查用户定义的后缀运算符"
+
+#: check.c:963
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户定义的后缀运算符,它们\n"
+"不再支持了。考虑删除后缀运算符并用前缀运算符或函数调用替换它们\n"
+"函数调用替换它们.\n"
+"以下的文件中有用户定义的后缀运算符列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:984
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "正在检查带有OIDS的表"
+
+#: check.c:1039
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用OID声明的表,这不再受支持\n"
+"考虑使用以下的SQL移除OID列\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"有问题的表在以下的文件中:\n"
+" %s\n"
+"\n"
+
+#: check.c:1067
+msgid "Checking for system-defined composite types in user tables"
+msgstr "在用户表中检查系统定义的复合类型"
+
+#: check.c:1096
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的系统定义的复合类型。\n"
+"这些类型OID在PostgreSQL版本中不稳定。\n"
+"因此,当前无法升级此群集。\n"
+"你可以删除有问题的列并重新启动升级。\n"
+"以下的文件中有问题列的列表\n"
+" %s\n"
+"\n"
+
+#: check.c:1124
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "正在检查用户表中的reg*数据类型"
+
+#: check.c:1155
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的某个reg*数据类型.\n"
+"这些数据类型引用了pg_upgrade不保留的系统OID, \n"
+"因此当前无法升级此群集 . You can\n"
+"您可以删除问题表并重新启动升级.\n"
+"文件中有问题列的列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "正在检查不兼容的\"jsonb\"数据类型"
+
+#: check.c:1184
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的\"jsonb\"数据类型.\n"
+"\"jsonb\"的内部格式在9.4测试版期间发生了更改,\n"
+"因此当前无法升级该集群。\n"
+"您可以删除问题表并重新启动升级. \n"
+"文件中有问题列的列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:1206
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "正在检查以\"pg_\"开头的角色"
+
+#: check.c:1216
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "源集群包含以\"pg_\"开头的角色\n"
+
+#: check.c:1218
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "目标集群包含以\"pg_\"开头的角色\n"
+
+#: check.c:1239
+msgid "Checking for user-defined encoding conversions"
+msgstr "正在检查用户定义的编码转换"
+
+#: check.c:1302
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户定义的编码转换。\n"
+"转换函数参数在PostgreSQL版本14中已更改。\n"
+"因此当前无法升级此群集。\n"
+"您可以删除问题表并重新启动升级. \n"
+"文件中有问题列的列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:1329
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "无法获取当前区域设置\n"
+
+#: check.c:1338
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "无法获取\"%s\"的系统区域设置名称\n"
+
+#: check.c:1344
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "还原旧区域\"%s\"失败\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "无法使用%s获取控制数据:%s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: 数据库集群状态问题\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "在恢复模式下,源群集已关闭。要升级,请使用文档中的\"rsync\",或将其作为主服务器关闭。\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "目标群集在恢复模式下关闭。要升级,请使用文档中的\"rsync\",或将其作为主服务器关闭。\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "源群集未完全关闭。\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "目标群集未完全关闭。\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "源集群缺少集群状态信息:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "目标集群缺少集群状态信息:\n"
+
+#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371
+#: relfilenode.c:243 server.c:33 util.c:79
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal问题\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: 控制数据检索问题\n"
+
+#: controldata.c:572
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "源集群缺少一些必需的控制信息:\n"
+
+#: controldata.c:575
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "目标集群缺少一些必需的控制信息:\n"
+
+#: controldata.c:578
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " 下一个XID检查点\n"
+
+#: controldata.c:581
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " 最新检查点下一个OID\n"
+
+#: controldata.c:584
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " 最新检查点下一个MultiXactId\n"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " 最新检查点最旧的MultiXactId\n"
+
+#: controldata.c:591
+msgid " latest checkpoint oldestXID\n"
+msgstr " 最新检查点的最旧XID\n"
+
+#: controldata.c:594
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " 最新检查点下一个MultiXactOffset\n"
+
+#: controldata.c:597
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " 重置后的第一个WAL段\n"
+
+#: controldata.c:600
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " float8参数传递方法\n"
+
+#: controldata.c:603
+#, c-format
+msgid " maximum alignment\n"
+msgstr " 最大对齐方式\n"
+
+#: controldata.c:606
+#, c-format
+msgid " block size\n"
+msgstr " 块大小\n"
+
+#: controldata.c:609
+#, c-format
+msgid " large relation segment size\n"
+msgstr " 大关系段大小\n"
+
+#: controldata.c:612
+#, c-format
+msgid " WAL block size\n"
+msgstr " WAL块大小\n"
+
+#: controldata.c:615
+#, c-format
+msgid " WAL segment size\n"
+msgstr " WAL段大小\n"
+
+#: controldata.c:618
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " 最大标识符长度\n"
+
+#: controldata.c:621
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " 最大索引列数\n"
+
+#: controldata.c:624
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " 最大TOAST块大小\n"
+
+#: controldata.c:628
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " 大对象块大小\n"
+
+#: controldata.c:631
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " 日期/时间是整数?\n"
+
+#: controldata.c:635
+#, c-format
+msgid " data checksum version\n"
+msgstr " 数据校验和版本\n"
+
+#: controldata.c:637
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "没有所需的控制信息,无法继续,正在终止\n"
+
+#: controldata.c:652
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"新旧pg_controldata对齐无效或不匹配\n"
+"可能一个集群是32位安装,另一个是64位安装\n"
+
+#: controldata.c:656
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "新旧pg_controldata块大小无效或不匹配\n"
+
+#: controldata.c:659
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "新旧pg controldata最大关系段大小无效或不匹配\n"
+
+#: controldata.c:662
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "新旧pg_controldata WAL块大小无效或不匹配\n"
+
+#: controldata.c:665
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "新旧pg_controldata WAL段大小无效或不匹配\n"
+
+#: controldata.c:668
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "新旧pg_controldata最大标识符长度无效或不匹配\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "新旧pg_controldata最大索引列无效或不匹配\n"
+
+#: controldata.c:674
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "新旧pg_controldata最大TOAST块大小无效或不匹配\n"
+
+#: controldata.c:679
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "旧的和新的pg_controldata大对象块大小无效或不匹配\n"
+
+#: controldata.c:682
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "新的和旧的pg_controldata日期/时间存储类型不匹配\n"
+
+#: controldata.c:695
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "旧群集不使用数据校验和,但新群集使用数据校验和\n"
+
+#: controldata.c:698
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "旧群集使用数据校验和,但新群集不使用\n"
+
+#: controldata.c:700
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "旧群集和新群集pg_controldata校验和版本不匹配\n"
+
+#: controldata.c:711
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "向旧的global/pg_control添加\".old\"后缀"
+
+#: controldata.c:716
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "无法将%s重命名为%s。\n"
+
+#: controldata.c:719
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"如果要启动旧群集,则需要从%s/global/pg_control.old中\n"
+"删除\".old\"后缀。\n"
+"由于使用了\"link\"模式,一旦新群集启动,\n"
+"旧群集就无法安全启动。\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "正在创建全局对象的转储"
+
+#: dump.c:31
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "正在创建数据库schemas的转储\n"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "无法使用using %s获取pg_ctl的版本数据: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "无法从%s获取pg_ctl版本输出\n"
+
+#: exec.c:105 exec.c:109
+#, c-format
+msgid "command too long\n"
+msgstr "命令太长了\n"
+
+#: exec.c:111 util.c:37 util.c:225
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:150 option.c:217
+msgid "could not open log file \"%s\": %m\n"
+msgstr "无法打开日志文件\"%s\": %m\n"
+
+#: exec.c:179
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*失败*"
+
+#: exec.c:182
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "执行\"%s\"时出现问题\n"
+
+#: exec.c:185
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr "有关故障的可能原因,请查阅\"%s\"或 \"%s\"的最后几行。\n"
+
+#: exec.c:190
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr "有关故障的可能原因,请查阅\"%s\"的最后几行。\n"
+
+#: exec.c:205 option.c:226
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "不能写到日志文件\"%s\": %m\n"
+
+#: exec.c:231
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "无法打开文件\"%s\"用于读取: %s\n"
+
+#: exec.c:258
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "您必须具有当前目录中的读写权限。\n"
+
+#: exec.c:311 exec.c:377
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "检查\"%s\"失败: %s\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\"不是一个目录\n"
+
+#: exec.c:430
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "检查\"%s\"失败:不是常规文件\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "检查\"%s\"失败:无法执行(权限被拒绝)\n"
+
+#: exec.c:439
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "检查\"%s\"失败:无法执行\n"
+
+#: exec.c:449
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr "检查\"%s\"失败:版本不正确:找到\"%s\",应为\"%s\"\n"
+
+#: file.c:43 file.c:61
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "克隆关系\"%s.%s\"时出错(从\"%s\"到\"%s\"): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "克隆关系\"%s.%s\"时出错:无法打开文件\"%s\": %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "克隆关系\"%s.%s\"时出错:无法创建文件\"%s\": %s\n"
+
+#: file.c:87 file.c:190
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "复制关系\"%s.%s\"时出错:无法打开文件\"%s\": %s\n"
+
+#: file.c:92 file.c:199
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "复制关系\"%s.%s\"时出错:无法创建文件\"%s\": %s\n"
+
+#: file.c:106 file.c:223
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "复制关系\"%s.%s\"时出错:无法读取文件\"%s\": %s\n"
+
+#: file.c:118 file.c:301
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "复制关系\"%s.%s\"时出错:无法写入文件 \"%s\": %s\n"
+
+#: file.c:132
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "将关系\"%s.%s\"(\"%s\"复制到\"%s\")时出错: %s\n"
+
+#: file.c:151
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "为关系\"%s.%s\"创建链接时出错(从\"%s\"到\"%s\"): %s\n"
+
+#: file.c:194
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "复制关系\"%s.%s\"时出错:无法统计文件\"%s\": %s\n"
+
+#: file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "复制关系\"%s.%s\"时出错:在文件\"%s\"中找到部分页\n"
+
+#: file.c:328 file.c:345
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "无法在新旧数据目录之间克隆文件: %s\n"
+
+#: file.c:341
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "无法创建文件 \"%s\": %s\n"
+
+#: file.c:352
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "此平台不支持文件克隆\n"
+
+#: file.c:369
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"无法在新旧数据目录之间创建硬链接: %s\n"
+"在链接模式下,旧的和新的数据目录必须在同一文件系统上。\n"
+
+#: function.c:114
+#, c-format
+msgid ""
+"\n"
+"The old cluster has a \"plpython_call_handler\" function defined\n"
+"in the \"public\" schema which is a duplicate of the one defined\n"
+"in the \"pg_catalog\" schema. You can confirm this by executing\n"
+"in psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"The \"public\" schema version of this function was created by a\n"
+"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+"to complete because it references a now-obsolete \"plpython\"\n"
+"shared object file. You can remove the \"public\" schema version\n"
+"of this function by running the following command:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"in each affected database:\n"
+"\n"
+msgstr ""
+"\n"
+"旧集群在\"public\"模式中定义了一个\"plpython_call_handler\"函数,\n"
+"这是\"pg_catalog\"模式中定义的函数的副本。\n"
+" 您可以通过执行\n"
+"在 psql中:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"这个函数的\"public\"模式版本是由plpython的8.1之前的安装创建的, \n"
+"必须删除才能完成pg_upgrade\n"
+"因为它引用了一个现在已经过时的\"plpython\"共享对象文件。\n"
+"通过运行以下命令,可以删除此函数的\"public\"模式版本:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"在每个受影响的数据库中:\n"
+"\n"
+
+#: function.c:132
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:142
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "从旧群集中删除问题函数以继续。\n"
+
+#: function.c:189
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "正在检查是否存在所需的库"
+
+#: function.c:242
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "无法加载库 \"%s\": %s"
+
+#: function.c:253
+msgid "In database: %s\n"
+msgstr "在数据库: %s\n"
+
+#: function.c:263
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装引用了新安装中缺少的可加载库。\n"
+"您可以将这些库添加到新安装中,或者从旧安装中删除使用它们的函数。\n"
+"文件中有问题库列表:\n"
+" %s\n"
+"\n"
+
+#: info.c:131
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "数据库\"%2$s\"中OID %1$u的关系名称不匹配:旧名称 \"%3$s.%4$s\",新名称\"%5$s.%6$s\"\n"
+
+#: info.c:151
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "未能匹配数据库\"%s\"中的新旧表\n"
+
+#: info.c:240
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " 这是\"%s.%s\"上的索引"
+
+#: info.c:250
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " 哪一个OID %u上的索引"
+
+#: info.c:262
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " 哪一个是\"%s.%s\"的TOAST表"
+
+#: info.c:270
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " 哪一个是OID %u的TOAST表"
+
+#: info.c:274
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "在旧群集中找不到与数据库\"%2$s\"中OID %1$u的新关系的匹配项: %3$s\n"
+
+#: info.c:277
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "在新群集中找不到与数据库\"%2$s\"中OID %1$u的旧关系的匹配项:%3$s\n"
+
+#: info.c:289
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "映射为数据库\"%s\":\n"
+
+#: info.c:292
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u到%u\n"
+
+#: info.c:297 info.c:633
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:322
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"源数据库:\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"目标数据库:\n"
+
+#: info.c:631
+#, c-format
+msgid "Database: %s\n"
+msgstr "数据库: %s\n"
+
+#: info.c:644
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:102
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: 不能使用root用户运行\n"
+
+#: option.c:170
+#, c-format
+msgid "invalid old port number\n"
+msgstr "旧端口号无效\n"
+
+#: option.c:175
+#, c-format
+msgid "invalid new port number\n"
+msgstr "新端口号无效\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获取更多的信息.\n"
+
+#: option.c:214
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "命令行参数太多 (第一个是 \"%s\")\n"
+
+#: option.c:220
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "以详细模式运行\n"
+
+#: option.c:251
+msgid "old cluster binaries reside"
+msgstr "旧群集二进制文件驻留"
+
+#: option.c:253
+msgid "new cluster binaries reside"
+msgstr "新群集二进制文件驻留"
+
+#: option.c:255
+msgid "old cluster data resides"
+msgstr "旧群集数据驻留"
+
+#: option.c:257
+msgid "new cluster data resides"
+msgstr "新群集数据驻留"
+
+#: option.c:259
+msgid "sockets will be created"
+msgstr "将创建套接字"
+
+#: option.c:276 option.c:374
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "无法确定当前目录\n"
+
+#: option.c:279
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "无法从Windows上的新群集数据目录内运行pg_upgrade\n"
+
+#: option.c:288
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade将PostgreSQL集群升级到其他主版本。\n"
+"\n"
+
+#: option.c:289
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [选项]...\n"
+"\n"
+
+#: option.c:291
+#, c-format
+msgid "Options:\n"
+msgstr "选项:\n"
+
+#: option.c:292
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR 旧群集可执行目录\n"
+
+#: option.c:293
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR 新群集可执行目录\n"
+" (默认目录与pg_upgrade相同)\n"
+
+#: option.c:295
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check 仅检查群集,不更改任何数据\n"
+
+#: option.c:296
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR 旧群集数据目录\n"
+
+#: option.c:297
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR 新群集数据目录\n"
+
+#: option.c:298
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM 要同时使用的进程或线程数\n"
+
+#: option.c:299
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link 使用硬链接来代替将文件拷贝到新群集\n"
+
+#: option.c:300
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS 要传递到服务器的旧群集选项\n"
+
+#: option.c:301
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONS 要传递到服务器的新群集选项\n"
+
+#: option.c:302
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT 旧群集端口号(默认值为%d)\n"
+
+#: option.c:303
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT 新群集端口号(默认值为%d)\n"
+
+#: option.c:304
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain 成功后保留SQL和日志文件\n"
+
+#: option.c:305
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR 要使用的套接字目录(默认值为当前路径)\n"
+
+#: option.c:306
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME 集群超级用户(默认值为\"%s\")\n"
+
+#: option.c:307
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose 启用详细的内部日志\n"
+
+#: option.c:308
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version 显示版本信息,然后退出\n"
+
+#: option.c:309
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone 克隆而不是将文件复制到新群集\n"
+
+#: option.c:310
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助,然后退出\n"
+
+#: option.c:311
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"在运行pg_upgrade之前,您必须 :\n"
+" 创建一个新的数据库群集 (使用新版本的initdb)\n"
+" 关闭旧群集的postmaster服务\n"
+" 关闭新群集的postmaster服务\n"
+
+#: option.c:316
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"运行pg_upgrade时,必须提供以下信息:\n"
+" 旧群集的数据目录 (-d DATADIR)\n"
+" 新群集的数据目录 (-D DATADIR)\n"
+" 旧版本的\"bin\"目录 (-b BINDIR)\n"
+" 新版本的\"bin\"目录 (-B BINDIR)\n"
+
+#: option.c:322
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"例如:\n"
+" pg_upgrade -d 旧集群/data -D 新集群/data -b 旧集群/bin -B 新集群/bin\n"
+"或者\n"
+
+#: option.c:327
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=旧集群/data\n"
+" $ export PGDATANEW=新集群/data\n"
+" $ export PGBINOLD=旧集群/bin\n"
+" $ export PGBINNEW=新集群/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:333
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=旧集群/data\n"
+" C:\\> set PGDATANEW=新集群/data\n"
+" C:\\> set PGBINOLD=旧集群/bin\n"
+" C:\\> set PGBINNEW=新集群/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:339
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: option.c:340
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: option.c:380
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"必须标识%s所在的目录。\n"
+"请使用%s命令行选项或%s环境变量。\n"
+
+#: option.c:432
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "正在查找源群集的实际数据目录"
+
+#: option.c:434
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "正在查找目标群集的实际数据目录"
+
+#: option.c:446
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "无法使用%s获取数据目录: %s\n"
+
+#: option.c:505
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "无法从文件\"%2$s\"读取第%1$d行: %3$s\n"
+
+#: option.c:522
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "用户提供的旧端口号%hu已更正为%hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "无法创建工作进程: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "无法创建工作线程: %s\n"
+
+#: parallel.c:300
+msgid "%s() failed: %s\n"
+msgstr "%s()失败: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "子进程异常退出:状态 %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "子工作线程异常退出: %s\n"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "无法读取目录\"%s\"的权限: %s\n"
+
+#: pg_upgrade.c:122
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"正在执行升级\n"
+"------------------\n"
+
+#: pg_upgrade.c:165
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "为新群集设置下一个OID"
+
+#: pg_upgrade.c:172
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "将数据目录同步到磁盘"
+
+#: pg_upgrade.c:183
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"升级完成\n"
+"----------------\n"
+
+#: pg_upgrade.c:216
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 无法找到执行文件\n"
+
+#: pg_upgrade.c:242
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"好像有一个postmaster正在为旧群集服务。\n"
+"请关闭那个postmaster,然后再试一次。\n"
+
+#: pg_upgrade.c:255
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"好像有一个postmaster正在为新群集服务。\n"
+"请关闭那个postmaster,然后再试一次。\n"
+
+#: pg_upgrade.c:269
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "正在分析新群集中的所有行"
+
+#: pg_upgrade.c:282
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "正在冻结新群集中的所有行"
+
+#: pg_upgrade.c:302
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "正在在新群集中还原全局对象"
+
+#: pg_upgrade.c:317
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "在新群集中还原数据库schemas\n"
+
+#: pg_upgrade.c:421
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "正在从新%s中删除文件"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "无法删除目录\"%s\"\n"
+
+#: pg_upgrade.c:444
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "正在将旧的 %s复制到新服务中"
+
+#: pg_upgrade.c:470
+msgid "Setting oldest XID for new cluster"
+msgstr "为新群集设置最旧的XID"
+
+#: pg_upgrade.c:478
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "正在为新集群设置下一个事务ID和epoch"
+
+#: pg_upgrade.c:508
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "正在为新集群设置下一个多事务ID和偏移量"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "在新集群中设置最旧的多事务ID"
+
+#: pg_upgrade.c:552
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "正在重置WAL归档"
+
+#: pg_upgrade.c:595
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "正在在新集群中设置frozenxid和minmxid计数器"
+
+#: pg_upgrade.c:597
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "正在在新群集中设置minmxid计数器"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files\n"
+msgstr "正在克隆用户关系文件\n"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "正在复制用户关系文件\n"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "正在链接用户关系文件\n"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "在新群集中找不到旧数据库\"%s\"\n"
+
+#: relfilenode.c:230
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "检查文件是否存在\"%s.%s\"时出错 (\"%s\" 到 \"%s\"): %s\n"
+
+#: relfilenode.c:248
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "正在将 \"%s\"重写为\"%s\"\n"
+
+#: relfilenode.c:256
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "正在将 \"%s\"克隆到\"%s\"\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "正在将 \"%s\"复制到\"%s\"\n"
+
+#: relfilenode.c:266
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "正在将\"%s\"链接到\"%s\"\n"
+
+#: server.c:38 server.c:142 util.c:135 util.c:165
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "故障,退出\n"
+
+#: server.c:132
+#, c-format
+msgid "executing: %s\n"
+msgstr "正在执行: %s\n"
+
+#: server.c:138
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL命令失败 \n"
+"%s\n"
+"%s"
+
+#: server.c:168
+msgid "could not open version file \"%s\": %m\n"
+msgstr "无法打开版本文件\"%s\": %m\n"
+
+#: server.c:172
+msgid "could not parse version file \"%s\"\n"
+msgstr "无法解析版本文件\"%s\"\n"
+
+#: server.c:298
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:302
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"无法连接到用命令启动的源postmaster :\n"
+"%s\n"
+
+#: server.c:306
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"无法连接到用命令启动的目标postmaster :\n"
+"%s\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl无法启动源服务器,或者连接失败\n"
+
+#: server.c:322
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl无法启动目标服务器,或连接失败\n"
+
+#: server.c:367
+#, c-format
+msgid "out of memory\n"
+msgstr "内存不足\n"
+
+#: server.c:380
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "libpq环境变量%s具有非本地服务器值: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"使用表空间时无法升级到相同的系统目录版本。\n"
+"或者,使用表空间时无法从同一系统目录版本升级。\n"
+
+#: tablespace.c:86
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "表空间目录\"%s\"不存在\n"
+
+#: tablespace.c:90
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "无法统计表空间目录\"%s\": %s\n"
+
+#: tablespace.c:95
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "表空间路径\"%s\"不是目录\n"
+
+#: util.c:49
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:82
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:174
+#, c-format
+msgid "ok"
+msgstr "成功"
+
+#: version.c:29
+#, c-format
+msgid "Checking for large objects"
+msgstr "正在检查大对象"
+
+#: version.c:77 version.c:419
+#, c-format
+msgid "warning"
+msgstr "警告"
+
+#: version.c:79
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包含大对象。新数据库有一个附加的大对象权限表。\n"
+"升级后,将向您提供一个命令,以使用默认权限填充\n"
+"pg_largeobject_metadata表。\n"
+"\n"
+
+#: version.c:85
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包含大对象。 新数据库有一个附加的大对象权限表,\n"
+"因此必须为所有大对象定义默认权限。文件\n"
+" %s\n"
+"当数据库由psql执行时,超级用户将设置默认权限。\n"
+"\n"
+
+#: version.c:272
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "正在检查不兼容的\"line\"数据类型"
+
+#: version.c:279
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的\"line\"数据类型。\n"
+"此数据类型更改了旧群集和新群集之间的\n"
+"内部格式和输入/输出格式,\n"
+"因此当前无法升级此群集。\n"
+"您可以删除问题表并重新启动升级。\n"
+"文件中有问题列的列表:\n"
+" %s\n"
+"\n"
+
+#: version.c:310
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "正在检查无效的\"unknown\"用户列"
+
+#: version.c:317
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的\"unknown\"数据类型。\n"
+"表中不再允许此数据类型,\n"
+"因此当前无法升级此群集。\n"
+"您可以删除问题表并重新启动升级。\n"
+"文件中有问题列的列表 :\n"
+" %s\n"
+"\n"
+
+#: version.c:341
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "正在检查哈希索引"
+
+#: version.c:421
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包含哈希索引。\n"
+"这些索引在旧集群和新集群之间具有不同的内部格式,因此必须\n"
+"使用REINDEX命令重新索引它们。\n"
+"升级后,您将得到REINDEX指令。\n"
+"\n"
+
+#: version.c:427
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包含哈希索引. These indexes have different\n"
+"这些索引在旧集群和新集群之间具有不同的内部格式,\n"
+"因此必须使用REINDEX命令重新索引它们。 文件\n"
+" %s\n"
+"当数据库超级用户通过psql执行时,将重新创建所有无效的索引;\n"
+"在此之前,不会使用这些索引。\n"
+"\n"
+
+#: version.c:453
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "正在检查无效的\"sql_identifier\"用户列"
+
+#: version.c:461
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的\"sql_identifier\"数据类型。\n"
+"此数据类型的磁盘格式已更改。\n"
+"因此当前无法升级此群集。\n"
+"您可以删除问题表并重新启动升级。\n"
+"文件中有问题列的列表 :\n"
+" %s\n"
+"\n"
+
+#: version.c:485
+msgid "Checking for extension updates"
+msgstr "正在检查扩展更新"
+
+#: version.c:537
+#, c-format
+msgid "notice"
+msgstr "通知"
+
+#: version.c:538
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包含应使用\n"
+"ALTER EXTENSION命令更新的扩展。 文件\n"
+" %s\n"
+"当数据库超级用户通过psql执行时,\n"
+"将更新这些扩展。\n"
+"\n"
+
diff --git a/src/bin/pg_upgrade/relfilenode.c b/src/bin/pg_upgrade/relfilenode.c
new file mode 100644
index 0000000..d23ac88
--- /dev/null
+++ b/src/bin/pg_upgrade/relfilenode.c
@@ -0,0 +1,259 @@
+/*
+ * relfilenode.c
+ *
+ * relfilenode functions
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/relfilenode.c
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+
+#include "access/transam.h"
+#include "catalog/pg_class_d.h"
+#include "pg_upgrade.h"
+
+static void transfer_single_new_db(FileNameMap *maps, int size, char *old_tablespace);
+static void transfer_relfile(FileNameMap *map, const char *suffix, bool vm_must_add_frozenbit);
+
+
+/*
+ * transfer_all_new_tablespaces()
+ *
+ * Responsible for upgrading all database. invokes routines to generate mappings and then
+ * physically link the databases.
+ */
+void
+transfer_all_new_tablespaces(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
+ char *old_pgdata, char *new_pgdata)
+{
+ switch (user_opts.transfer_mode)
+ {
+ case TRANSFER_MODE_CLONE:
+ prep_status_progress("Cloning user relation files");
+ break;
+ case TRANSFER_MODE_COPY:
+ prep_status_progress("Copying user relation files");
+ break;
+ case TRANSFER_MODE_LINK:
+ prep_status_progress("Linking user relation files");
+ break;
+ }
+
+ /*
+ * Transferring files by tablespace is tricky because a single database
+ * can use multiple tablespaces. For non-parallel mode, we just pass a
+ * NULL tablespace path, which matches all tablespaces. In parallel mode,
+ * we pass the default tablespace and all user-created tablespaces and let
+ * those operations happen in parallel.
+ */
+ if (user_opts.jobs <= 1)
+ parallel_transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata,
+ new_pgdata, NULL);
+ else
+ {
+ int tblnum;
+
+ /* transfer default tablespace */
+ parallel_transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata,
+ new_pgdata, old_pgdata);
+
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ parallel_transfer_all_new_dbs(old_db_arr,
+ new_db_arr,
+ old_pgdata,
+ new_pgdata,
+ os_info.old_tablespaces[tblnum]);
+ /* reap all children */
+ while (reap_child(true) == true)
+ ;
+ }
+
+ end_progress_output();
+ check_ok();
+}
+
+
+/*
+ * transfer_all_new_dbs()
+ *
+ * Responsible for upgrading all database. invokes routines to generate mappings and then
+ * physically link the databases.
+ */
+void
+transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
+ char *old_pgdata, char *new_pgdata, char *old_tablespace)
+{
+ int old_dbnum,
+ new_dbnum;
+
+ /* Scan the old cluster databases and transfer their files */
+ for (old_dbnum = new_dbnum = 0;
+ old_dbnum < old_db_arr->ndbs;
+ old_dbnum++, new_dbnum++)
+ {
+ DbInfo *old_db = &old_db_arr->dbs[old_dbnum],
+ *new_db = NULL;
+ FileNameMap *mappings;
+ int n_maps;
+
+ /*
+ * Advance past any databases that exist in the new cluster but not in
+ * the old, e.g. "postgres". (The user might have removed the
+ * 'postgres' database from the old cluster.)
+ */
+ for (; new_dbnum < new_db_arr->ndbs; new_dbnum++)
+ {
+ new_db = &new_db_arr->dbs[new_dbnum];
+ if (strcmp(old_db->db_name, new_db->db_name) == 0)
+ break;
+ }
+
+ if (new_dbnum >= new_db_arr->ndbs)
+ pg_fatal("old database \"%s\" not found in the new cluster\n",
+ old_db->db_name);
+
+ mappings = gen_db_file_maps(old_db, new_db, &n_maps, old_pgdata,
+ new_pgdata);
+ if (n_maps)
+ {
+ transfer_single_new_db(mappings, n_maps, old_tablespace);
+ }
+ /* We allocate something even for n_maps == 0 */
+ pg_free(mappings);
+ }
+}
+
+/*
+ * transfer_single_new_db()
+ *
+ * create links for mappings stored in "maps" array.
+ */
+static void
+transfer_single_new_db(FileNameMap *maps, int size, char *old_tablespace)
+{
+ int mapnum;
+ bool vm_must_add_frozenbit = false;
+
+ /*
+ * Do we need to rewrite visibilitymap?
+ */
+ if (old_cluster.controldata.cat_ver < VISIBILITY_MAP_FROZEN_BIT_CAT_VER &&
+ new_cluster.controldata.cat_ver >= VISIBILITY_MAP_FROZEN_BIT_CAT_VER)
+ vm_must_add_frozenbit = true;
+
+ for (mapnum = 0; mapnum < size; mapnum++)
+ {
+ if (old_tablespace == NULL ||
+ strcmp(maps[mapnum].old_tablespace, old_tablespace) == 0)
+ {
+ /* transfer primary file */
+ transfer_relfile(&maps[mapnum], "", vm_must_add_frozenbit);
+
+ /*
+ * Copy/link any fsm and vm files, if they exist
+ */
+ transfer_relfile(&maps[mapnum], "_fsm", vm_must_add_frozenbit);
+ transfer_relfile(&maps[mapnum], "_vm", vm_must_add_frozenbit);
+ }
+ }
+}
+
+
+/*
+ * transfer_relfile()
+ *
+ * Copy or link file from old cluster to new one. If vm_must_add_frozenbit
+ * is true, visibility map forks are converted and rewritten, even in link
+ * mode.
+ */
+static void
+transfer_relfile(FileNameMap *map, const char *type_suffix, bool vm_must_add_frozenbit)
+{
+ char old_file[MAXPGPATH];
+ char new_file[MAXPGPATH];
+ int segno;
+ char extent_suffix[65];
+ struct stat statbuf;
+
+ /*
+ * Now copy/link any related segments as well. Remember, PG breaks large
+ * files into 1GB segments, the first segment has no extension, subsequent
+ * segments are named relfilenode.1, relfilenode.2, relfilenode.3.
+ */
+ for (segno = 0;; segno++)
+ {
+ if (segno == 0)
+ extent_suffix[0] = '\0';
+ else
+ snprintf(extent_suffix, sizeof(extent_suffix), ".%d", segno);
+
+ snprintf(old_file, sizeof(old_file), "%s%s/%u/%u%s%s",
+ map->old_tablespace,
+ map->old_tablespace_suffix,
+ map->db_oid,
+ map->relfilenode,
+ type_suffix,
+ extent_suffix);
+ snprintf(new_file, sizeof(new_file), "%s%s/%u/%u%s%s",
+ map->new_tablespace,
+ map->new_tablespace_suffix,
+ map->db_oid,
+ map->relfilenode,
+ type_suffix,
+ extent_suffix);
+
+ /* Is it an extent, fsm, or vm file? */
+ if (type_suffix[0] != '\0' || segno != 0)
+ {
+ /* Did file open fail? */
+ if (stat(old_file, &statbuf) != 0)
+ {
+ /* File does not exist? That's OK, just return */
+ if (errno == ENOENT)
+ return;
+ else
+ pg_fatal("error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n",
+ map->nspname, map->relname, old_file, new_file,
+ strerror(errno));
+ }
+
+ /* If file is empty, just return */
+ if (statbuf.st_size == 0)
+ return;
+ }
+
+ unlink(new_file);
+
+ /* Copying files might take some time, so give feedback. */
+ pg_log(PG_STATUS, "%s", old_file);
+
+ if (vm_must_add_frozenbit && strcmp(type_suffix, "_vm") == 0)
+ {
+ /* Need to rewrite visibility map format */
+ pg_log(PG_VERBOSE, "rewriting \"%s\" to \"%s\"\n",
+ old_file, new_file);
+ rewriteVisibilityMap(old_file, new_file, map->nspname, map->relname);
+ }
+ else
+ switch (user_opts.transfer_mode)
+ {
+ case TRANSFER_MODE_CLONE:
+ pg_log(PG_VERBOSE, "cloning \"%s\" to \"%s\"\n",
+ old_file, new_file);
+ cloneFile(old_file, new_file, map->nspname, map->relname);
+ break;
+ case TRANSFER_MODE_COPY:
+ pg_log(PG_VERBOSE, "copying \"%s\" to \"%s\"\n",
+ old_file, new_file);
+ copyFile(old_file, new_file, map->nspname, map->relname);
+ break;
+ case TRANSFER_MODE_LINK:
+ pg_log(PG_VERBOSE, "linking \"%s\" to \"%s\"\n",
+ old_file, new_file);
+ linkFile(old_file, new_file, map->nspname, map->relname);
+ }
+ }
+}
diff --git a/src/bin/pg_upgrade/server.c b/src/bin/pg_upgrade/server.c
new file mode 100644
index 0000000..265137e
--- /dev/null
+++ b/src/bin/pg_upgrade/server.c
@@ -0,0 +1,380 @@
+/*
+ * server.c
+ *
+ * database server functions
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/server.c
+ */
+
+#include "postgres_fe.h"
+
+#include "common/connect.h"
+#include "fe_utils/string_utils.h"
+#include "libpq/pqcomm.h"
+#include "pg_upgrade.h"
+
+static PGconn *get_db_conn(ClusterInfo *cluster, const char *db_name);
+
+
+/*
+ * connectToServer()
+ *
+ * Connects to the desired database on the designated server.
+ * If the connection attempt fails, this function logs an error
+ * message and calls exit() to kill the program.
+ */
+PGconn *
+connectToServer(ClusterInfo *cluster, const char *db_name)
+{
+ PGconn *conn = get_db_conn(cluster, db_name);
+
+ if (conn == NULL || PQstatus(conn) != CONNECTION_OK)
+ {
+ pg_log(PG_REPORT, "%s", PQerrorMessage(conn));
+
+ if (conn)
+ PQfinish(conn);
+
+ printf(_("Failure, exiting\n"));
+ exit(1);
+ }
+
+ PQclear(executeQueryOrDie(conn, ALWAYS_SECURE_SEARCH_PATH_SQL));
+
+ return conn;
+}
+
+
+/*
+ * get_db_conn()
+ *
+ * get database connection, using named database + standard params for cluster
+ *
+ * Caller must check for connection failure!
+ */
+static PGconn *
+get_db_conn(ClusterInfo *cluster, const char *db_name)
+{
+ PQExpBufferData conn_opts;
+ PGconn *conn;
+
+ /* Build connection string with proper quoting */
+ initPQExpBuffer(&conn_opts);
+ appendPQExpBufferStr(&conn_opts, "dbname=");
+ appendConnStrVal(&conn_opts, db_name);
+ appendPQExpBufferStr(&conn_opts, " user=");
+ appendConnStrVal(&conn_opts, os_info.user);
+ appendPQExpBuffer(&conn_opts, " port=%d", cluster->port);
+ if (cluster->sockdir)
+ {
+ appendPQExpBufferStr(&conn_opts, " host=");
+ appendConnStrVal(&conn_opts, cluster->sockdir);
+ }
+
+ conn = PQconnectdb(conn_opts.data);
+ termPQExpBuffer(&conn_opts);
+ return conn;
+}
+
+
+/*
+ * cluster_conn_opts()
+ *
+ * Return standard command-line options for connecting to this cluster when
+ * using psql, pg_dump, etc. Ideally this would match what get_db_conn()
+ * sets, but the utilities we need aren't very consistent about the treatment
+ * of database name options, so we leave that out.
+ *
+ * Result is valid until the next call to this function.
+ */
+char *
+cluster_conn_opts(ClusterInfo *cluster)
+{
+ static PQExpBuffer buf;
+
+ if (buf == NULL)
+ buf = createPQExpBuffer();
+ else
+ resetPQExpBuffer(buf);
+
+ if (cluster->sockdir)
+ {
+ appendPQExpBufferStr(buf, "--host ");
+ appendShellString(buf, cluster->sockdir);
+ appendPQExpBufferChar(buf, ' ');
+ }
+ appendPQExpBuffer(buf, "--port %d --username ", cluster->port);
+ appendShellString(buf, os_info.user);
+
+ return buf->data;
+}
+
+
+/*
+ * executeQueryOrDie()
+ *
+ * Formats a query string from the given arguments and executes the
+ * resulting query. If the query fails, this function logs an error
+ * message and calls exit() to kill the program.
+ */
+PGresult *
+executeQueryOrDie(PGconn *conn, const char *fmt,...)
+{
+ static char query[QUERY_ALLOC];
+ va_list args;
+ PGresult *result;
+ ExecStatusType status;
+
+ va_start(args, fmt);
+ vsnprintf(query, sizeof(query), fmt, args);
+ va_end(args);
+
+ pg_log(PG_VERBOSE, "executing: %s\n", query);
+ result = PQexec(conn, query);
+ status = PQresultStatus(result);
+
+ if ((status != PGRES_TUPLES_OK) && (status != PGRES_COMMAND_OK))
+ {
+ pg_log(PG_REPORT, "SQL command failed\n%s\n%s", query,
+ PQerrorMessage(conn));
+ PQclear(result);
+ PQfinish(conn);
+ printf(_("Failure, exiting\n"));
+ exit(1);
+ }
+ else
+ return result;
+}
+
+
+/*
+ * get_major_server_version()
+ *
+ * gets the version (in unsigned int form) for the given datadir. Assumes
+ * that datadir is an absolute path to a valid pgdata directory. The version
+ * is retrieved by reading the PG_VERSION file.
+ */
+uint32
+get_major_server_version(ClusterInfo *cluster)
+{
+ FILE *version_fd;
+ char ver_filename[MAXPGPATH];
+ int v1 = 0,
+ v2 = 0;
+
+ snprintf(ver_filename, sizeof(ver_filename), "%s/PG_VERSION",
+ cluster->pgdata);
+ if ((version_fd = fopen(ver_filename, "r")) == NULL)
+ pg_fatal("could not open version file \"%s\": %m\n", ver_filename);
+
+ if (fscanf(version_fd, "%63s", cluster->major_version_str) == 0 ||
+ sscanf(cluster->major_version_str, "%d.%d", &v1, &v2) < 1)
+ pg_fatal("could not parse version file \"%s\"\n", ver_filename);
+
+ fclose(version_fd);
+
+ if (v1 < 10)
+ {
+ /* old style, e.g. 9.6.1 */
+ return v1 * 10000 + v2 * 100;
+ }
+ else
+ {
+ /* new style, e.g. 10.1 */
+ return v1 * 10000;
+ }
+}
+
+
+static void
+stop_postmaster_atexit(void)
+{
+ stop_postmaster(true);
+}
+
+
+bool
+start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error)
+{
+ char cmd[MAXPGPATH * 4 + 1000];
+ PGconn *conn;
+ bool pg_ctl_return = false;
+ char socket_string[MAXPGPATH + 200];
+
+ static bool exit_hook_registered = false;
+
+ if (!exit_hook_registered)
+ {
+ atexit(stop_postmaster_atexit);
+ exit_hook_registered = true;
+ }
+
+ socket_string[0] = '\0';
+
+#if defined(HAVE_UNIX_SOCKETS) && !defined(WIN32)
+ /* prevent TCP/IP connections, restrict socket access */
+ strcat(socket_string,
+ " -c listen_addresses='' -c unix_socket_permissions=0700");
+
+ /* Have a sockdir? Tell the postmaster. */
+ if (cluster->sockdir)
+ snprintf(socket_string + strlen(socket_string),
+ sizeof(socket_string) - strlen(socket_string),
+ " -c %s='%s'",
+ (GET_MAJOR_VERSION(cluster->major_version) <= 902) ?
+ "unix_socket_directory" : "unix_socket_directories",
+ cluster->sockdir);
+#endif
+
+ /*
+ * Use -b to disable autovacuum.
+ *
+ * Turn off durability requirements to improve object creation speed, and
+ * we only modify the new cluster, so only use it there. If there is a
+ * crash, the new cluster has to be recreated anyway. fsync=off is a big
+ * win on ext4.
+ *
+ * Force vacuum_defer_cleanup_age to 0 on the new cluster, so that
+ * vacuumdb --freeze actually freezes the tuples.
+ */
+ snprintf(cmd, sizeof(cmd),
+ "\"%s/pg_ctl\" -w -l \"%s/%s\" -D \"%s\" -o \"-p %d -b%s %s%s\" start",
+ cluster->bindir,
+ log_opts.logdir,
+ SERVER_LOG_FILE, cluster->pgconfig, cluster->port,
+ (cluster == &new_cluster) ?
+ " -c synchronous_commit=off -c fsync=off -c full_page_writes=off -c vacuum_defer_cleanup_age=0" : "",
+ cluster->pgopts ? cluster->pgopts : "", socket_string);
+
+ /*
+ * Don't throw an error right away, let connecting throw the error because
+ * it might supply a reason for the failure.
+ */
+ pg_ctl_return = exec_prog(SERVER_START_LOG_FILE,
+ /* pass both file names if they differ */
+ (strcmp(SERVER_LOG_FILE,
+ SERVER_START_LOG_FILE) != 0) ?
+ SERVER_LOG_FILE : NULL,
+ report_and_exit_on_error, false,
+ "%s", cmd);
+
+ /* Did it fail and we are just testing if the server could be started? */
+ if (!pg_ctl_return && !report_and_exit_on_error)
+ return false;
+
+ /*
+ * We set this here to make sure atexit() shuts down the server, but only
+ * if we started the server successfully. We do it before checking for
+ * connectivity in case the server started but there is a connectivity
+ * failure. If pg_ctl did not return success, we will exit below.
+ *
+ * Pre-9.1 servers do not have PQping(), so we could be leaving the server
+ * running if authentication was misconfigured, so someday we might went
+ * to be more aggressive about doing server shutdowns even if pg_ctl
+ * fails, but now (2013-08-14) it seems prudent to be cautious. We don't
+ * want to shutdown a server that might have been accidentally started
+ * during the upgrade.
+ */
+ if (pg_ctl_return)
+ os_info.running_cluster = cluster;
+
+ /*
+ * pg_ctl -w might have failed because the server couldn't be started, or
+ * there might have been a connection problem in _checking_ if the server
+ * has started. Therefore, even if pg_ctl failed, we continue and test
+ * for connectivity in case we get a connection reason for the failure.
+ */
+ if ((conn = get_db_conn(cluster, "template1")) == NULL ||
+ PQstatus(conn) != CONNECTION_OK)
+ {
+ pg_log(PG_REPORT, "\n%s", PQerrorMessage(conn));
+ if (conn)
+ PQfinish(conn);
+ if (cluster == &old_cluster)
+ pg_fatal("could not connect to source postmaster started with the command:\n"
+ "%s\n",
+ cmd);
+ else
+ pg_fatal("could not connect to target postmaster started with the command:\n"
+ "%s\n",
+ cmd);
+ }
+ PQfinish(conn);
+
+ /*
+ * If pg_ctl failed, and the connection didn't fail, and
+ * report_and_exit_on_error is enabled, fail now. This could happen if
+ * the server was already running.
+ */
+ if (!pg_ctl_return)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("pg_ctl failed to start the source server, or connection failed\n");
+ else
+ pg_fatal("pg_ctl failed to start the target server, or connection failed\n");
+ }
+
+ return true;
+}
+
+
+void
+stop_postmaster(bool in_atexit)
+{
+ ClusterInfo *cluster;
+
+ if (os_info.running_cluster == &old_cluster)
+ cluster = &old_cluster;
+ else if (os_info.running_cluster == &new_cluster)
+ cluster = &new_cluster;
+ else
+ return; /* no cluster running */
+
+ exec_prog(SERVER_STOP_LOG_FILE, NULL, !in_atexit, !in_atexit,
+ "\"%s/pg_ctl\" -w -D \"%s\" -o \"%s\" %s stop",
+ cluster->bindir, cluster->pgconfig,
+ cluster->pgopts ? cluster->pgopts : "",
+ in_atexit ? "-m fast" : "-m smart");
+
+ os_info.running_cluster = NULL;
+}
+
+
+/*
+ * check_pghost_envvar()
+ *
+ * Tests that PGHOST does not point to a non-local server
+ */
+void
+check_pghost_envvar(void)
+{
+ PQconninfoOption *option;
+ PQconninfoOption *start;
+
+ /* Get valid libpq env vars from the PQconndefaults function */
+
+ start = PQconndefaults();
+
+ if (!start)
+ pg_fatal("out of memory\n");
+
+ for (option = start; option->keyword != NULL; option++)
+ {
+ if (option->envvar && (strcmp(option->envvar, "PGHOST") == 0 ||
+ strcmp(option->envvar, "PGHOSTADDR") == 0))
+ {
+ const char *value = getenv(option->envvar);
+
+ if (value && strlen(value) > 0 &&
+ /* check for 'local' host values */
+ (strcmp(value, "localhost") != 0 && strcmp(value, "127.0.0.1") != 0 &&
+ strcmp(value, "::1") != 0 && !is_unixsock_path(value)))
+ pg_fatal("libpq environment variable %s has a non-local server value: %s\n",
+ option->envvar, value);
+ }
+ }
+
+ /* Free the memory that libpq allocated on our behalf */
+ PQconninfoFree(start);
+}
diff --git a/src/bin/pg_upgrade/t/001_basic.pl b/src/bin/pg_upgrade/t/001_basic.pl
new file mode 100644
index 0000000..40458f1
--- /dev/null
+++ b/src/bin/pg_upgrade/t/001_basic.pl
@@ -0,0 +1,11 @@
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_upgrade');
+program_version_ok('pg_upgrade');
+program_options_handling_ok('pg_upgrade');
+
+done_testing();
diff --git a/src/bin/pg_upgrade/t/002_pg_upgrade.pl b/src/bin/pg_upgrade/t/002_pg_upgrade.pl
new file mode 100644
index 0000000..6b0f42c
--- /dev/null
+++ b/src/bin/pg_upgrade/t/002_pg_upgrade.pl
@@ -0,0 +1,394 @@
+# Set of tests for pg_upgrade, including cross-version checks.
+use strict;
+use warnings;
+
+use Cwd qw(abs_path);
+use File::Basename qw(dirname);
+use File::Compare;
+use File::Find qw(find);
+use File::Path qw(rmtree);
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use PostgreSQL::Test::AdjustUpgrade;
+use Test::More;
+
+# Generate a database with a name made of a range of ASCII characters.
+sub generate_db
+{
+ my ($node, $prefix, $from_char, $to_char, $suffix) = @_;
+
+ my $dbname = $prefix;
+ for my $i ($from_char .. $to_char)
+ {
+ next if $i == 7 || $i == 10 || $i == 13; # skip BEL, LF, and CR
+ $dbname = $dbname . sprintf('%c', $i);
+ }
+
+ $dbname .= $suffix;
+ $node->command_ok(
+ [ 'createdb', $dbname ],
+ "created database with ASCII characters from $from_char to $to_char");
+}
+
+# Filter the contents of a dump before its use in a content comparison.
+# This returns the path to the filtered dump.
+sub filter_dump
+{
+ my ($is_old, $old_version, $dump_file) = @_;
+ my $dump_contents = slurp_file($dump_file);
+
+ if ($is_old)
+ {
+ $dump_contents = adjust_old_dumpfile($old_version, $dump_contents);
+ }
+ else
+ {
+ $dump_contents = adjust_new_dumpfile($old_version, $dump_contents);
+ }
+
+ my $dump_file_filtered = "${dump_file}_filtered";
+ open(my $dh, '>', $dump_file_filtered)
+ || die "opening $dump_file_filtered";
+ print $dh $dump_contents;
+ close($dh);
+
+ return $dump_file_filtered;
+}
+
+# The test of pg_upgrade requires two clusters, an old one and a new one
+# that gets upgraded. Before running the upgrade, a logical dump of the
+# old cluster is taken, and a second logical dump of the new one is taken
+# after the upgrade. The upgrade test passes if there are no differences
+# (after filtering) in these two dumps.
+
+# Testing upgrades with an older version of PostgreSQL requires setting up
+# two environment variables, as of:
+# - "olddump", to point to a dump file that will be used to set up the old
+# instance to upgrade from.
+# - "oldinstall", to point to the installation path of the old cluster.
+if ( (defined($ENV{olddump}) && !defined($ENV{oldinstall}))
+ || (!defined($ENV{olddump}) && defined($ENV{oldinstall})))
+{
+ # Not all variables are defined, so leave and die if test is
+ # done with an older installation.
+ die "olddump or oldinstall is undefined";
+}
+
+# Paths to the dumps taken during the tests.
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+my $dump1_file = "$tempdir/dump1.sql";
+my $dump2_file = "$tempdir/dump2.sql";
+
+# Initialize node to upgrade
+my $oldnode =
+ PostgreSQL::Test::Cluster->new('old_node',
+ install_path => $ENV{oldinstall});
+
+# To increase coverage of non-standard segment size and group access without
+# increasing test runtime, run these tests with a custom setting.
+# --allow-group-access and --wal-segsize have been added in v11.
+my %node_params = ();
+$node_params{extra} = [ '--wal-segsize', '1', '--allow-group-access' ]
+ if $oldnode->pg_version >= 11;
+$oldnode->init(%node_params);
+$oldnode->start;
+
+# The default location of the source code is the root of this directory.
+my $srcdir = abs_path("../../..");
+
+# Set up the data of the old instance with a dump or pg_regress.
+if (defined($ENV{olddump}))
+{
+ # Use the dump specified.
+ my $olddumpfile = $ENV{olddump};
+ die "no dump file found!" unless -e $olddumpfile;
+
+ # Load the dump using the "postgres" database as "regression" does
+ # not exist yet, and we are done here.
+ $oldnode->command_ok([ 'psql', '-X', '-f', $olddumpfile, 'postgres' ],
+ 'loaded old dump file');
+}
+else
+{
+ # Default is to use pg_regress to set up the old instance.
+
+ # Create databases with names covering most ASCII bytes. The
+ # first name exercises backslashes adjacent to double quotes, a
+ # Windows special case.
+ generate_db($oldnode, 'regression\\"\\', 1, 45, '\\\\"\\\\\\');
+ generate_db($oldnode, 'regression', 46, 90, '');
+ generate_db($oldnode, 'regression', 91, 127, '');
+
+ # Grab any regression options that may be passed down by caller.
+ my $extra_opts = $ENV{EXTRA_REGRESS_OPTS} || "";
+
+ # --dlpath is needed to be able to find the location of regress.so
+ # and any libraries the regression tests require.
+ my $dlpath = dirname($ENV{REGRESS_SHLIB});
+
+ # --outputdir points to the path where to place the output files.
+ my $outputdir = $PostgreSQL::Test::Utils::tmp_check;
+
+ # --inputdir points to the path of the input files.
+ my $inputdir = "$srcdir/src/test/regress";
+
+ my $rc =
+ system($ENV{PG_REGRESS}
+ . " $extra_opts "
+ . "--dlpath=\"$dlpath\" "
+ . "--bindir= "
+ . "--host="
+ . $oldnode->host . " "
+ . "--port="
+ . $oldnode->port . " "
+ . "--schedule=$srcdir/src/test/regress/parallel_schedule "
+ . "--max-concurrent-tests=20 "
+ . "--inputdir=\"$inputdir\" "
+ . "--outputdir=\"$outputdir\"");
+ if ($rc != 0)
+ {
+ # Dump out the regression diffs file, if there is one
+ my $diffs = "$outputdir/regression.diffs";
+ if (-e $diffs)
+ {
+ print "=== dumping $diffs ===\n";
+ print slurp_file($diffs);
+ print "=== EOF ===\n";
+ }
+ }
+ is($rc, 0, 'regression tests pass');
+}
+
+# Initialize a new node for the upgrade.
+my $newnode = PostgreSQL::Test::Cluster->new('new_node');
+$newnode->init(%node_params);
+
+my $newbindir = $newnode->config_data('--bindir');
+my $oldbindir = $oldnode->config_data('--bindir');
+
+# Before dumping, get rid of objects not existing or not supported in later
+# versions. This depends on the version of the old server used, and matters
+# only if different major versions are used for the dump.
+if (defined($ENV{oldinstall}))
+{
+ # Consult AdjustUpgrade to find out what we need to do.
+ my $dbnames =
+ $oldnode->safe_psql('postgres', qq(SELECT datname FROM pg_database));
+ my %dbnames;
+ do { $dbnames{$_} = 1; }
+ foreach split /\s+/s, $dbnames;
+ my $adjust_cmds =
+ adjust_database_contents($oldnode->pg_version, %dbnames);
+
+ foreach my $updb (keys %$adjust_cmds)
+ {
+ my $upcmds = join(";\n", @{ $adjust_cmds->{$updb} });
+
+ # For simplicity, use the newer version's psql to issue the commands.
+ $newnode->command_ok(
+ [
+ 'psql', '-X',
+ '-v', 'ON_ERROR_STOP=1',
+ '-c', $upcmds,
+ '-d', $oldnode->connstr($updb),
+ ],
+ "ran version adaptation commands for database $updb");
+ }
+}
+
+# Take a dump before performing the upgrade as a base comparison. Note
+# that we need to use pg_dumpall from the new node here.
+my @dump_command = (
+ 'pg_dumpall', '--no-sync', '-d', $oldnode->connstr('postgres'),
+ '-f', $dump1_file);
+# --extra-float-digits is needed when upgrading from a version older than 11.
+push(@dump_command, '--extra-float-digits', '0')
+ if ($oldnode->pg_version < 12);
+$newnode->command_ok(\@dump_command, 'dump before running pg_upgrade');
+
+# After dumping, update references to the old source tree's regress.so
+# to point to the new tree.
+if (defined($ENV{oldinstall}))
+{
+ # First, fetch all the references to libraries that are not part
+ # of the default path $libdir.
+ my $output = $oldnode->safe_psql('regression',
+ "SELECT DISTINCT probin::text FROM pg_proc WHERE probin NOT LIKE '\$libdir%';"
+ );
+ chomp($output);
+ my @libpaths = split("\n", $output);
+
+ my $dump_data = slurp_file($dump1_file);
+
+ my $newregresssrc = "$srcdir/src/test/regress";
+ foreach (@libpaths)
+ {
+ my $libpath = $_;
+ $libpath = dirname($libpath);
+ $dump_data =~ s/$libpath/$newregresssrc/g;
+ }
+
+ open my $fh, ">", $dump1_file or die "could not open dump file";
+ print $fh $dump_data;
+ close $fh;
+
+ # This replaces any references to the old tree's regress.so
+ # the new tree's regress.so. Any references that do *not*
+ # match $libdir are switched so as this request does not
+ # depend on the path of the old source tree. This is useful
+ # when using an old dump. Do the operation on all the databases
+ # that allow connections so as this includes the regression
+ # database and anything the user has set up.
+ $output = $oldnode->safe_psql('postgres',
+ "SELECT datname FROM pg_database WHERE datallowconn;");
+ chomp($output);
+ my @datnames = split("\n", $output);
+ foreach (@datnames)
+ {
+ my $datname = $_;
+ $oldnode->safe_psql(
+ $datname, "UPDATE pg_proc SET probin =
+ regexp_replace(probin, '.*/', '$newregresssrc/')
+ WHERE probin NOT LIKE '\$libdir/%'");
+ }
+}
+
+# Create an invalid database, will be deleted below
+$oldnode->safe_psql('postgres', qq(
+ CREATE DATABASE regression_invalid;
+ UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid';
+));
+
+# In a VPATH build, we'll be started in the source directory, but we want
+# to run pg_upgrade in the build directory so that any files generated finish
+# in it, like delete_old_cluster.{sh,bat}.
+chdir ${PostgreSQL::Test::Utils::tmp_check};
+
+# Upgrade the instance.
+$oldnode->stop;
+
+# Cause a failure at the start of pg_upgrade, this should create the logging
+# directory pg_upgrade_output.d but leave it around. Keep --check for an
+# early exit.
+command_fails(
+ [
+ 'pg_upgrade', '--no-sync',
+ '-d', $oldnode->data_dir,
+ '-D', $newnode->data_dir,
+ '-b', $oldbindir . '/does/not/exist/',
+ '-B', $newbindir,
+ '-s', $newnode->host,
+ '-p', $oldnode->port,
+ '-P', $newnode->port,
+ '--check'
+ ],
+ 'run of pg_upgrade --check for new instance with incorrect binary path');
+ok(-d $newnode->data_dir . "/pg_upgrade_output.d",
+ "pg_upgrade_output.d/ not removed after pg_upgrade failure");
+rmtree($newnode->data_dir . "/pg_upgrade_output.d");
+
+# Check that pg_upgrade aborts when encountering an invalid database
+command_checks_all(
+ [
+ 'pg_upgrade', '--no-sync', '-d', $oldnode->data_dir,
+ '-D', $newnode->data_dir, '-b', $oldbindir,
+ '-B', $newbindir, '-s', $newnode->host,
+ '-p', $oldnode->port, '-P', $newnode->port,
+ '--check',
+ ],
+ 1,
+ [qr/invalid/], # pg_upgrade prints errors on stdout :(
+ [qr//],
+ 'invalid database causes failure');
+rmtree($newnode->data_dir . "/pg_upgrade_output.d");
+
+# And drop it, so we can continue
+$oldnode->start;
+$oldnode->safe_psql('postgres', 'DROP DATABASE regression_invalid');
+$oldnode->stop;
+
+# --check command works here, cleans up pg_upgrade_output.d.
+command_ok(
+ [
+ 'pg_upgrade', '--no-sync', '-d', $oldnode->data_dir,
+ '-D', $newnode->data_dir, '-b', $oldbindir,
+ '-B', $newbindir, '-s', $newnode->host,
+ '-p', $oldnode->port, '-P', $newnode->port,
+ '--check'
+ ],
+ 'run of pg_upgrade --check for new instance');
+ok(!-d $newnode->data_dir . "/pg_upgrade_output.d",
+ "pg_upgrade_output.d/ removed after pg_upgrade --check success");
+
+# Actual run, pg_upgrade_output.d is removed at the end.
+command_ok(
+ [
+ 'pg_upgrade', '--no-sync', '-d', $oldnode->data_dir,
+ '-D', $newnode->data_dir, '-b', $oldbindir,
+ '-B', $newbindir, '-s', $newnode->host,
+ '-p', $oldnode->port, '-P', $newnode->port
+ ],
+ 'run of pg_upgrade for new instance');
+ok( !-d $newnode->data_dir . "/pg_upgrade_output.d",
+ "pg_upgrade_output.d/ removed after pg_upgrade success");
+
+$newnode->start;
+
+# Check if there are any logs coming from pg_upgrade, that would only be
+# retained on failure.
+my $log_path = $newnode->data_dir . "/pg_upgrade_output.d";
+if (-d $log_path)
+{
+ my @log_files;
+ find(
+ sub {
+ push @log_files, $File::Find::name
+ if $File::Find::name =~ m/.*\.log/;
+ },
+ $newnode->data_dir . "/pg_upgrade_output.d");
+ foreach my $log (@log_files)
+ {
+ note "=== contents of $log ===\n";
+ print slurp_file($log);
+ print "=== EOF ===\n";
+ }
+}
+
+# Second dump from the upgraded instance.
+@dump_command = (
+ 'pg_dumpall', '--no-sync', '-d', $newnode->connstr('postgres'),
+ '-f', $dump2_file);
+# --extra-float-digits is needed when upgrading from a version older than 11.
+push(@dump_command, '--extra-float-digits', '0')
+ if ($oldnode->pg_version < 12);
+$newnode->command_ok(\@dump_command, 'dump after running pg_upgrade');
+
+# No need to apply filters on the dumps if working on the same version
+# for the old and new nodes.
+my $dump1_filtered = $dump1_file;
+my $dump2_filtered = $dump2_file;
+if ($oldnode->pg_version != $newnode->pg_version)
+{
+ $dump1_filtered = filter_dump(1, $oldnode->pg_version, $dump1_file);
+ $dump2_filtered = filter_dump(0, $oldnode->pg_version, $dump2_file);
+}
+
+# Compare the two dumps, there should be no differences.
+my $compare_res = compare($dump1_filtered, $dump2_filtered);
+is($compare_res, 0, 'old and new dumps match after pg_upgrade');
+
+# Provide more context if the dumps do not match.
+if ($compare_res != 0)
+{
+ my ($stdout, $stderr) =
+ run_command([ 'diff', '-u', $dump1_filtered, $dump2_filtered ]);
+ print "=== diff of $dump1_filtered and $dump2_filtered\n";
+ print "=== stdout ===\n";
+ print $stdout;
+ print "=== stderr ===\n";
+ print $stderr;
+ print "=== EOF ===\n";
+}
+
+done_testing();
diff --git a/src/bin/pg_upgrade/tablespace.c b/src/bin/pg_upgrade/tablespace.c
new file mode 100644
index 0000000..90a6b52
--- /dev/null
+++ b/src/bin/pg_upgrade/tablespace.c
@@ -0,0 +1,111 @@
+/*
+ * tablespace.c
+ *
+ * tablespace functions
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/tablespace.c
+ */
+
+#include "postgres_fe.h"
+
+#include "pg_upgrade.h"
+
+static void get_tablespace_paths(void);
+static void set_tablespace_directory_suffix(ClusterInfo *cluster);
+
+
+void
+init_tablespaces(void)
+{
+ get_tablespace_paths();
+
+ set_tablespace_directory_suffix(&old_cluster);
+ set_tablespace_directory_suffix(&new_cluster);
+
+ if (os_info.num_old_tablespaces > 0 &&
+ strcmp(old_cluster.tablespace_suffix, new_cluster.tablespace_suffix) == 0)
+ pg_fatal("Cannot upgrade to/from the same system catalog version when\n"
+ "using tablespaces.\n");
+}
+
+
+/*
+ * get_tablespace_paths()
+ *
+ * Scans pg_tablespace and returns a malloc'ed array of all tablespace
+ * paths. It's the caller's responsibility to free the array.
+ */
+static void
+get_tablespace_paths(void)
+{
+ PGconn *conn = connectToServer(&old_cluster, "template1");
+ PGresult *res;
+ int tblnum;
+ int i_spclocation;
+ char query[QUERY_ALLOC];
+
+ snprintf(query, sizeof(query),
+ "SELECT pg_catalog.pg_tablespace_location(oid) AS spclocation "
+ "FROM pg_catalog.pg_tablespace "
+ "WHERE spcname != 'pg_default' AND "
+ " spcname != 'pg_global'");
+
+ res = executeQueryOrDie(conn, "%s", query);
+
+ if ((os_info.num_old_tablespaces = PQntuples(res)) != 0)
+ os_info.old_tablespaces =
+ (char **) pg_malloc(os_info.num_old_tablespaces * sizeof(char *));
+ else
+ os_info.old_tablespaces = NULL;
+
+ i_spclocation = PQfnumber(res, "spclocation");
+
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ {
+ struct stat statBuf;
+
+ os_info.old_tablespaces[tblnum] = pg_strdup(PQgetvalue(res, tblnum, i_spclocation));
+
+ /*
+ * Check that the tablespace path exists and is a directory.
+ * Effectively, this is checking only for tables/indexes in
+ * non-existent tablespace directories. Databases located in
+ * non-existent tablespaces already throw a backend error.
+ * Non-existent tablespace directories can occur when a data directory
+ * that contains user tablespaces is moved as part of pg_upgrade
+ * preparation and the symbolic links are not updated.
+ */
+ if (stat(os_info.old_tablespaces[tblnum], &statBuf) != 0)
+ {
+ if (errno == ENOENT)
+ report_status(PG_FATAL,
+ "tablespace directory \"%s\" does not exist\n",
+ os_info.old_tablespaces[tblnum]);
+ else
+ report_status(PG_FATAL,
+ "could not stat tablespace directory \"%s\": %s\n",
+ os_info.old_tablespaces[tblnum], strerror(errno));
+ }
+ if (!S_ISDIR(statBuf.st_mode))
+ report_status(PG_FATAL,
+ "tablespace path \"%s\" is not a directory\n",
+ os_info.old_tablespaces[tblnum]);
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+}
+
+
+static void
+set_tablespace_directory_suffix(ClusterInfo *cluster)
+{
+ /* This cluster has a version-specific subdirectory */
+
+ /* The leading slash is needed to start a new directory. */
+ cluster->tablespace_suffix = psprintf("/PG_%s_%d",
+ cluster->major_version_str,
+ cluster->controldata.cat_ver);
+}
diff --git a/src/bin/pg_upgrade/util.c b/src/bin/pg_upgrade/util.c
new file mode 100644
index 0000000..d0c4bd1
--- /dev/null
+++ b/src/bin/pg_upgrade/util.c
@@ -0,0 +1,328 @@
+/*
+ * util.c
+ *
+ * utility functions
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/util.c
+ */
+
+#include "postgres_fe.h"
+
+#include <signal.h>
+
+#include "common/username.h"
+#include "pg_upgrade.h"
+
+LogOpts log_opts;
+
+static void pg_log_v(eLogType type, const char *fmt, va_list ap) pg_attribute_printf(2, 0);
+
+
+/*
+ * report_status()
+ *
+ * Displays the result of an operation (ok, failed, error message,...)
+ */
+void
+report_status(eLogType type, const char *fmt,...)
+{
+ va_list args;
+ char message[MAX_STRING];
+
+ va_start(args, fmt);
+ vsnprintf(message, sizeof(message), fmt, args);
+ va_end(args);
+
+ pg_log(type, "%s\n", message);
+}
+
+
+void
+end_progress_output(void)
+{
+ /*
+ * For output to a tty, erase prior contents of progress line. When either
+ * tty or verbose, indent so that report_status() output will align
+ * nicely.
+ */
+ if (log_opts.isatty)
+ {
+ printf("\r");
+ pg_log(PG_REPORT, "%-*s", MESSAGE_WIDTH, "");
+ }
+ else if (log_opts.verbose)
+ pg_log(PG_REPORT, "%-*s", MESSAGE_WIDTH, "");
+}
+
+/*
+ * Remove any logs generated internally. To be used once when exiting.
+ */
+void
+cleanup_output_dirs(void)
+{
+ fclose(log_opts.internal);
+
+ /* Remove dump and log files? */
+ if (log_opts.retain)
+ return;
+
+ (void) rmtree(log_opts.basedir, true);
+
+ /* Remove pg_upgrade_output.d only if empty */
+ switch (pg_check_dir(log_opts.rootdir))
+ {
+ case 0: /* non-existent */
+ case 3: /* exists and contains a mount point */
+ Assert(false);
+ break;
+
+ case 1: /* exists and empty */
+ case 2: /* exists and contains only dot files */
+ (void) rmtree(log_opts.rootdir, true);
+ break;
+
+ case 4: /* exists */
+
+ /*
+ * Keep the root directory as this includes some past log
+ * activity.
+ */
+ break;
+
+ default:
+ /* different failure, just report it */
+ pg_log(PG_WARNING, "could not access directory \"%s\": %m\n",
+ log_opts.rootdir);
+ break;
+ }
+}
+
+/*
+ * prep_status
+ *
+ * Displays a message that describes an operation we are about to begin.
+ * We pad the message out to MESSAGE_WIDTH characters so that all of the "ok" and
+ * "failed" indicators line up nicely.
+ *
+ * A typical sequence would look like this:
+ * prep_status("about to flarb the next %d files", fileCount );
+ *
+ * if(( message = flarbFiles(fileCount)) == NULL)
+ * report_status(PG_REPORT, "ok" );
+ * else
+ * pg_log(PG_FATAL, "failed - %s\n", message );
+ */
+void
+prep_status(const char *fmt,...)
+{
+ va_list args;
+ char message[MAX_STRING];
+
+ va_start(args, fmt);
+ vsnprintf(message, sizeof(message), fmt, args);
+ va_end(args);
+
+ /* trim strings */
+ pg_log(PG_REPORT, "%-*s", MESSAGE_WIDTH, message);
+}
+
+/*
+ * prep_status_progress
+ *
+ * Like prep_status(), but for potentially longer running operations.
+ * Details about what item is currently being processed can be displayed
+ * with pg_log(PG_STATUS, ...). A typical sequence would look like this:
+ *
+ * prep_status_progress("copying files");
+ * for (...)
+ * pg_log(PG_STATUS, "%s", filename);
+ * end_progress_output();
+ * report_status(PG_REPORT, "ok");
+ */
+void
+prep_status_progress(const char *fmt,...)
+{
+ va_list args;
+ char message[MAX_STRING];
+
+ va_start(args, fmt);
+ vsnprintf(message, sizeof(message), fmt, args);
+ va_end(args);
+
+ /*
+ * If outputting to a tty or in verbose, append newline. pg_log_v() will
+ * put the individual progress items onto the next line.
+ */
+ if (log_opts.isatty || log_opts.verbose)
+ pg_log(PG_REPORT, "%-*s\n", MESSAGE_WIDTH, message);
+ else
+ pg_log(PG_REPORT, "%-*s", MESSAGE_WIDTH, message);
+}
+
+static void
+pg_log_v(eLogType type, const char *fmt, va_list ap)
+{
+ char message[QUERY_ALLOC];
+
+ vsnprintf(message, sizeof(message), _(fmt), ap);
+
+ /* PG_VERBOSE and PG_STATUS are only output in verbose mode */
+ /* fopen() on log_opts.internal might have failed, so check it */
+ if (((type != PG_VERBOSE && type != PG_STATUS) || log_opts.verbose) &&
+ log_opts.internal != NULL)
+ {
+ if (type == PG_STATUS)
+ /* status messages need two leading spaces and a newline */
+ fprintf(log_opts.internal, " %s\n", message);
+ else
+ fprintf(log_opts.internal, "%s", message);
+ fflush(log_opts.internal);
+ }
+
+ switch (type)
+ {
+ case PG_VERBOSE:
+ if (log_opts.verbose)
+ printf("%s", message);
+ break;
+
+ case PG_STATUS:
+
+ /*
+ * For output to a display, do leading truncation. Append \r so
+ * that the next message is output at the start of the line.
+ *
+ * If going to non-interactive output, only display progress if
+ * verbose is enabled. Otherwise the output gets unreasonably
+ * large by default.
+ */
+ if (log_opts.isatty)
+ /* -2 because we use a 2-space indent */
+ printf(" %s%-*.*s\r",
+ /* prefix with "..." if we do leading truncation */
+ strlen(message) <= MESSAGE_WIDTH - 2 ? "" : "...",
+ MESSAGE_WIDTH - 2, MESSAGE_WIDTH - 2,
+ /* optional leading truncation */
+ strlen(message) <= MESSAGE_WIDTH - 2 ? message :
+ message + strlen(message) - MESSAGE_WIDTH + 3 + 2);
+ else if (log_opts.verbose)
+ printf(" %s\n", message);
+ break;
+
+ case PG_REPORT:
+ case PG_WARNING:
+ printf("%s", message);
+ break;
+
+ case PG_FATAL:
+ printf("\n%s", message);
+ printf(_("Failure, exiting\n"));
+ exit(1);
+ break;
+
+ default:
+ break;
+ }
+ fflush(stdout);
+}
+
+
+void
+pg_log(eLogType type, const char *fmt,...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ pg_log_v(type, fmt, args);
+ va_end(args);
+}
+
+
+void
+pg_fatal(const char *fmt,...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ pg_log_v(PG_FATAL, fmt, args);
+ va_end(args);
+ printf(_("Failure, exiting\n"));
+ exit(1);
+}
+
+
+void
+check_ok(void)
+{
+ /* all seems well */
+ report_status(PG_REPORT, "ok");
+ fflush(stdout);
+}
+
+
+/*
+ * quote_identifier()
+ * Properly double-quote a SQL identifier.
+ *
+ * The result should be pg_free'd, but most callers don't bother because
+ * memory leakage is not a big deal in this program.
+ */
+char *
+quote_identifier(const char *s)
+{
+ char *result = pg_malloc(strlen(s) * 2 + 3);
+ char *r = result;
+
+ *r++ = '"';
+ while (*s)
+ {
+ if (*s == '"')
+ *r++ = *s;
+ *r++ = *s;
+ s++;
+ }
+ *r++ = '"';
+ *r++ = '\0';
+
+ return result;
+}
+
+
+/*
+ * get_user_info()
+ */
+int
+get_user_info(char **user_name_p)
+{
+ int user_id;
+ const char *user_name;
+ char *errstr;
+
+#ifndef WIN32
+ user_id = geteuid();
+#else
+ user_id = 1;
+#endif
+
+ user_name = get_user_name(&errstr);
+ if (!user_name)
+ pg_fatal("%s\n", errstr);
+
+ /* make a copy */
+ *user_name_p = pg_strdup(user_name);
+
+ return user_id;
+}
+
+
+/*
+ * str2uint()
+ *
+ * convert string to oid
+ */
+unsigned int
+str2uint(const char *str)
+{
+ return strtoul(str, NULL, 10);
+}
diff --git a/src/bin/pg_upgrade/version.c b/src/bin/pg_upgrade/version.c
new file mode 100644
index 0000000..20c6107
--- /dev/null
+++ b/src/bin/pg_upgrade/version.c
@@ -0,0 +1,466 @@
+/*
+ * version.c
+ *
+ * Postgres-version-specific routines
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/version.c
+ */
+
+#include "postgres_fe.h"
+
+#include "catalog/pg_class_d.h"
+#include "fe_utils/string_utils.h"
+#include "pg_upgrade.h"
+
+
+/*
+ * check_for_data_types_usage()
+ * Detect whether there are any stored columns depending on given type(s)
+ *
+ * If so, write a report to the given file name, and return true.
+ *
+ * base_query should be a SELECT yielding a single column named "oid",
+ * containing the pg_type OIDs of one or more types that are known to have
+ * inconsistent on-disk representations across server versions.
+ *
+ * We check for the type(s) in tables, matviews, and indexes, but not views;
+ * there's no storage involved in a view.
+ */
+bool
+check_for_data_types_usage(ClusterInfo *cluster,
+ const char *base_query,
+ const char *output_path)
+{
+ bool found = false;
+ FILE *script = NULL;
+ int dbnum;
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+ PQExpBufferData querybuf;
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_nspname,
+ i_relname,
+ i_attname;
+
+ /*
+ * The type(s) of interest might be wrapped in a domain, array,
+ * composite, or range, and these container types can be nested (to
+ * varying extents depending on server version, but that's not of
+ * concern here). To handle all these cases we need a recursive CTE.
+ */
+ initPQExpBuffer(&querybuf);
+ appendPQExpBuffer(&querybuf,
+ "WITH RECURSIVE oids AS ( "
+ /* start with the type(s) returned by base_query */
+ " %s "
+ " UNION ALL "
+ " SELECT * FROM ( "
+ /* inner WITH because we can only reference the CTE once */
+ " WITH x AS (SELECT oid FROM oids) "
+ /* domains on any type selected so far */
+ " SELECT t.oid FROM pg_catalog.pg_type t, x WHERE typbasetype = x.oid AND typtype = 'd' "
+ " UNION ALL "
+ /* arrays over any type selected so far */
+ " SELECT t.oid FROM pg_catalog.pg_type t, x WHERE typelem = x.oid AND typtype = 'b' "
+ " UNION ALL "
+ /* composite types containing any type selected so far */
+ " SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_class c, pg_catalog.pg_attribute a, x "
+ " WHERE t.typtype = 'c' AND "
+ " t.oid = c.reltype AND "
+ " c.oid = a.attrelid AND "
+ " NOT a.attisdropped AND "
+ " a.atttypid = x.oid "
+ " UNION ALL "
+ /* ranges containing any type selected so far */
+ " SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_range r, x "
+ " WHERE t.typtype = 'r' AND r.rngtypid = t.oid AND r.rngsubtype = x.oid"
+ " ) foo "
+ ") "
+ /* now look for stored columns of any such type */
+ "SELECT n.nspname, c.relname, a.attname "
+ "FROM pg_catalog.pg_class c, "
+ " pg_catalog.pg_namespace n, "
+ " pg_catalog.pg_attribute a "
+ "WHERE c.oid = a.attrelid AND "
+ " NOT a.attisdropped AND "
+ " a.atttypid IN (SELECT oid FROM oids) AND "
+ " c.relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_INDEX) ") AND "
+ " c.relnamespace = n.oid AND "
+ /* exclude possible orphaned temp tables */
+ " n.nspname !~ '^pg_temp_' AND "
+ " n.nspname !~ '^pg_toast_temp_' AND "
+ /* exclude system catalogs, too */
+ " n.nspname NOT IN ('pg_catalog', 'information_schema')",
+ base_query);
+
+ res = executeQueryOrDie(conn, "%s", querybuf.data);
+
+ ntups = PQntuples(res);
+ i_nspname = PQfnumber(res, "nspname");
+ i_relname = PQfnumber(res, "relname");
+ i_attname = PQfnumber(res, "attname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n", output_path,
+ strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " %s.%s.%s\n",
+ PQgetvalue(res, rowno, i_nspname),
+ PQgetvalue(res, rowno, i_relname),
+ PQgetvalue(res, rowno, i_attname));
+ }
+
+ PQclear(res);
+
+ termPQExpBuffer(&querybuf);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ return found;
+}
+
+/*
+ * check_for_data_type_usage()
+ * Detect whether there are any stored columns depending on the given type
+ *
+ * If so, write a report to the given file name, and return true.
+ *
+ * type_name should be a fully qualified type name. This is just a
+ * trivial wrapper around check_for_data_types_usage() to convert a
+ * type name into a base query.
+ */
+bool
+check_for_data_type_usage(ClusterInfo *cluster,
+ const char *type_name,
+ const char *output_path)
+{
+ bool found;
+ char *base_query;
+
+ base_query = psprintf("SELECT '%s'::pg_catalog.regtype AS oid",
+ type_name);
+
+ found = check_for_data_types_usage(cluster, base_query, output_path);
+
+ free(base_query);
+
+ return found;
+}
+
+
+/*
+ * old_9_3_check_for_line_data_type_usage()
+ * 9.3 -> 9.4
+ * Fully implement the 'line' data type in 9.4, which previously returned
+ * "not enabled" by default and was only functionally enabled with a
+ * compile-time switch; as of 9.4 "line" has a different on-disk
+ * representation format.
+ */
+void
+old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for incompatible \"line\" data type");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_line.txt");
+
+ if (check_for_data_type_usage(cluster, "pg_catalog.line", output_path))
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains the \"line\" data type in user tables.\n"
+ "This data type changed its internal and input/output format\n"
+ "between your old and new versions so this\n"
+ "cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * old_9_6_check_for_unknown_data_type_usage()
+ * 9.6 -> 10
+ * It's no longer allowed to create tables or views with "unknown"-type
+ * columns. We do not complain about views with such columns, because
+ * they should get silently converted to "text" columns during the DDL
+ * dump and reload; it seems unlikely to be worth making users do that
+ * by hand. However, if there's a table with such a column, the DDL
+ * reload will fail, so we should pre-detect that rather than failing
+ * mid-upgrade. Worse, if there's a matview with such a column, the
+ * DDL reload will silently change it to "text" which won't match the
+ * on-disk storage (which is like "cstring"). So we *must* reject that.
+ */
+void
+old_9_6_check_for_unknown_data_type_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for invalid \"unknown\" user columns");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_unknown.txt");
+
+ if (check_for_data_type_usage(cluster, "pg_catalog.unknown", output_path))
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains the \"unknown\" data type in user tables.\n"
+ "This data type is no longer allowed in tables, so this\n"
+ "cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * old_9_6_invalidate_hash_indexes()
+ * 9.6 -> 10
+ * Hash index binary format has changed from 9.6->10.0
+ */
+void
+old_9_6_invalidate_hash_indexes(ClusterInfo *cluster, bool check_mode)
+{
+ int dbnum;
+ FILE *script = NULL;
+ bool found = false;
+ char *output_path = "reindex_hash.sql";
+
+ prep_status("Checking for hash indexes");
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_nspname,
+ i_relname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /* find hash indexes */
+ res = executeQueryOrDie(conn,
+ "SELECT n.nspname, c.relname "
+ "FROM pg_catalog.pg_class c, "
+ " pg_catalog.pg_index i, "
+ " pg_catalog.pg_am a, "
+ " pg_catalog.pg_namespace n "
+ "WHERE i.indexrelid = c.oid AND "
+ " c.relam = a.oid AND "
+ " c.relnamespace = n.oid AND "
+ " a.amname = 'hash'"
+ );
+
+ ntups = PQntuples(res);
+ i_nspname = PQfnumber(res, "nspname");
+ i_relname = PQfnumber(res, "relname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+ if (!check_mode)
+ {
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n", output_path,
+ strerror(errno));
+ if (!db_used)
+ {
+ PQExpBufferData connectbuf;
+
+ initPQExpBuffer(&connectbuf);
+ appendPsqlMetaConnect(&connectbuf, active_db->db_name);
+ fputs(connectbuf.data, script);
+ termPQExpBuffer(&connectbuf);
+ db_used = true;
+ }
+ fprintf(script, "REINDEX INDEX %s.%s;\n",
+ quote_identifier(PQgetvalue(res, rowno, i_nspname)),
+ quote_identifier(PQgetvalue(res, rowno, i_relname)));
+ }
+ }
+
+ PQclear(res);
+
+ if (!check_mode && db_used)
+ {
+ /* mark hash indexes as invalid */
+ PQclear(executeQueryOrDie(conn,
+ "UPDATE pg_catalog.pg_index i "
+ "SET indisvalid = false "
+ "FROM pg_catalog.pg_class c, "
+ " pg_catalog.pg_am a, "
+ " pg_catalog.pg_namespace n "
+ "WHERE i.indexrelid = c.oid AND "
+ " c.relam = a.oid AND "
+ " c.relnamespace = n.oid AND "
+ " a.amname = 'hash'"));
+ }
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ if (found)
+ {
+ report_status(PG_WARNING, "warning");
+ if (check_mode)
+ pg_log(PG_WARNING, "\n"
+ "Your installation contains hash indexes. These indexes have different\n"
+ "internal formats between your old and new clusters, so they must be\n"
+ "reindexed with the REINDEX command. After upgrading, you will be given\n"
+ "REINDEX instructions.\n\n");
+ else
+ pg_log(PG_WARNING, "\n"
+ "Your installation contains hash indexes. These indexes have different\n"
+ "internal formats between your old and new clusters, so they must be\n"
+ "reindexed with the REINDEX command. The file\n"
+ " %s\n"
+ "when executed by psql by the database superuser will recreate all invalid\n"
+ "indexes; until then, none of these indexes will be used.\n\n",
+ output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * old_11_check_for_sql_identifier_data_type_usage()
+ * 11 -> 12
+ * In 12, the sql_identifier data type was switched from name to varchar,
+ * which does affect the storage (name is by-ref, but not varlena). This
+ * means user tables using sql_identifier for columns are broken because
+ * the on-disk format is different.
+ */
+void
+old_11_check_for_sql_identifier_data_type_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for invalid \"sql_identifier\" user columns");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_sql_identifier.txt");
+
+ if (check_for_data_type_usage(cluster, "information_schema.sql_identifier",
+ output_path))
+ {
+ pg_log(PG_REPORT, "fatal\n");
+ pg_fatal("Your installation contains the \"sql_identifier\" data type in user tables.\n"
+ "The on-disk format for this data type has changed, so this\n"
+ "cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s\n\n", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * report_extension_updates()
+ * Report extensions that should be updated.
+ */
+void
+report_extension_updates(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ bool found = false;
+ char *output_path = "update_extensions.sql";
+
+ prep_status("Checking for extension updates");
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_name;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /* find extensions needing updates */
+ res = executeQueryOrDie(conn,
+ "SELECT name "
+ "FROM pg_available_extensions "
+ "WHERE installed_version != default_version"
+ );
+
+ ntups = PQntuples(res);
+ i_name = PQfnumber(res, "name");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s\n", output_path,
+ strerror(errno));
+ if (!db_used)
+ {
+ PQExpBufferData connectbuf;
+
+ initPQExpBuffer(&connectbuf);
+ appendPsqlMetaConnect(&connectbuf, active_db->db_name);
+ fputs(connectbuf.data, script);
+ termPQExpBuffer(&connectbuf);
+ db_used = true;
+ }
+ fprintf(script, "ALTER EXTENSION %s UPDATE;\n",
+ quote_identifier(PQgetvalue(res, rowno, i_name)));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ if (found)
+ {
+ report_status(PG_REPORT, "notice");
+ pg_log(PG_REPORT, "\n"
+ "Your installation contains extensions that should be updated\n"
+ "with the ALTER EXTENSION command. The file\n"
+ " %s\n"
+ "when executed by psql by the database superuser will update\n"
+ "these extensions.\n\n",
+ output_path);
+ }
+ else
+ check_ok();
+}
diff --git a/src/bin/pg_verifybackup/.gitignore b/src/bin/pg_verifybackup/.gitignore
new file mode 100644
index 0000000..910b227
--- /dev/null
+++ b/src/bin/pg_verifybackup/.gitignore
@@ -0,0 +1,2 @@
+/pg_verifybackup
+/tmp_check/
diff --git a/src/bin/pg_verifybackup/Makefile b/src/bin/pg_verifybackup/Makefile
new file mode 100644
index 0000000..596df15
--- /dev/null
+++ b/src/bin/pg_verifybackup/Makefile
@@ -0,0 +1,49 @@
+# src/bin/pg_verifybackup/Makefile
+
+PGFILEDESC = "pg_verifybackup - verify a backup against using a backup manifest"
+PGAPPICON = win32
+
+# make these available to TAP test scripts
+export TAR
+# Note that GZIP cannot be used directly as this environment variable is
+# used by the command "gzip" to pass down options, so stick with a different
+# name.
+export GZIP_PROGRAM=$(GZIP)
+export LZ4=$(LZ4)
+export ZSTD=$(ZSTD)
+
+subdir = src/bin/pg_verifybackup
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+# We need libpq only because fe_utils does.
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+OBJS = \
+ $(WIN32RES) \
+ parse_manifest.o \
+ pg_verifybackup.o
+
+all: pg_verifybackup
+
+pg_verifybackup: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_verifybackup$(X) '$(DESTDIR)$(bindir)/pg_verifybackup$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_verifybackup$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_verifybackup$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_verifybackup/nls.mk b/src/bin/pg_verifybackup/nls.mk
new file mode 100644
index 0000000..c8020a5
--- /dev/null
+++ b/src/bin/pg_verifybackup/nls.mk
@@ -0,0 +1,17 @@
+# src/bin/pg_verifybackup/nls.mk
+CATALOG_NAME = pg_verifybackup
+AVAIL_LANGUAGES = de el es fr it ja ka ko ru sv uk zh_CN
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ parse_manifest.c \
+ pg_verifybackup.c \
+ ../../common/fe_memutils.c \
+ ../../common/jsonapi.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \
+ json_manifest_parse_failure:2 \
+ error_cb:2 \
+ report_backup_error:2 \
+ report_fatal_error
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \
+ error_cb:2:c-format \
+ report_backup_error:2:c-format \
+ report_fatal_error:1:c-format
diff --git a/src/bin/pg_verifybackup/parse_manifest.c b/src/bin/pg_verifybackup/parse_manifest.c
new file mode 100644
index 0000000..6364b01
--- /dev/null
+++ b/src/bin/pg_verifybackup/parse_manifest.c
@@ -0,0 +1,748 @@
+/*-------------------------------------------------------------------------
+ *
+ * parse_manifest.c
+ * Parse a backup manifest in JSON format.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_verifybackup/parse_manifest.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include "parse_manifest.h"
+#include "common/jsonapi.h"
+
+/*
+ * Semantic states for JSON manifest parsing.
+ */
+typedef enum
+{
+ JM_EXPECT_TOPLEVEL_START,
+ JM_EXPECT_TOPLEVEL_END,
+ JM_EXPECT_TOPLEVEL_FIELD,
+ JM_EXPECT_VERSION_VALUE,
+ JM_EXPECT_FILES_START,
+ JM_EXPECT_FILES_NEXT,
+ JM_EXPECT_THIS_FILE_FIELD,
+ JM_EXPECT_THIS_FILE_VALUE,
+ JM_EXPECT_WAL_RANGES_START,
+ JM_EXPECT_WAL_RANGES_NEXT,
+ JM_EXPECT_THIS_WAL_RANGE_FIELD,
+ JM_EXPECT_THIS_WAL_RANGE_VALUE,
+ JM_EXPECT_MANIFEST_CHECKSUM_VALUE,
+ JM_EXPECT_EOF
+} JsonManifestSemanticState;
+
+/*
+ * Possible fields for one file as described by the manifest.
+ */
+typedef enum
+{
+ JMFF_PATH,
+ JMFF_ENCODED_PATH,
+ JMFF_SIZE,
+ JMFF_LAST_MODIFIED,
+ JMFF_CHECKSUM_ALGORITHM,
+ JMFF_CHECKSUM
+} JsonManifestFileField;
+
+/*
+ * Possible fields for one file as described by the manifest.
+ */
+typedef enum
+{
+ JMWRF_TIMELINE,
+ JMWRF_START_LSN,
+ JMWRF_END_LSN
+} JsonManifestWALRangeField;
+
+/*
+ * Internal state used while decoding the JSON-format backup manifest.
+ */
+typedef struct
+{
+ JsonManifestParseContext *context;
+ JsonManifestSemanticState state;
+
+ /* These fields are used for parsing objects in the list of files. */
+ JsonManifestFileField file_field;
+ char *pathname;
+ char *encoded_pathname;
+ char *size;
+ char *algorithm;
+ pg_checksum_type checksum_algorithm;
+ char *checksum;
+
+ /* These fields are used for parsing objects in the list of WAL ranges. */
+ JsonManifestWALRangeField wal_range_field;
+ char *timeline;
+ char *start_lsn;
+ char *end_lsn;
+
+ /* Miscellaneous other stuff. */
+ bool saw_version_field;
+ char *manifest_checksum;
+} JsonManifestParseState;
+
+static void json_manifest_object_start(void *state);
+static void json_manifest_object_end(void *state);
+static void json_manifest_array_start(void *state);
+static void json_manifest_array_end(void *state);
+static void json_manifest_object_field_start(void *state, char *fname,
+ bool isnull);
+static void json_manifest_scalar(void *state, char *token,
+ JsonTokenType tokentype);
+static void json_manifest_finalize_file(JsonManifestParseState *parse);
+static void json_manifest_finalize_wal_range(JsonManifestParseState *parse);
+static void verify_manifest_checksum(JsonManifestParseState *parse,
+ char *buffer, size_t size);
+static void json_manifest_parse_failure(JsonManifestParseContext *context,
+ char *msg);
+
+static int hexdecode_char(char c);
+static bool hexdecode_string(uint8 *result, char *input, int nbytes);
+static bool parse_xlogrecptr(XLogRecPtr *result, char *input);
+
+/*
+ * Main entrypoint to parse a JSON-format backup manifest.
+ *
+ * Caller should set up the parsing context and then invoke this function.
+ * For each file whose information is extracted from the manifest,
+ * context->perfile_cb is invoked. In case of trouble, context->error_cb is
+ * invoked and is expected not to return.
+ */
+void
+json_parse_manifest(JsonManifestParseContext *context, char *buffer,
+ size_t size)
+{
+ JsonLexContext *lex;
+ JsonParseErrorType json_error;
+ JsonSemAction sem;
+ JsonManifestParseState parse;
+
+ /* Set up our private parsing context. */
+ parse.context = context;
+ parse.state = JM_EXPECT_TOPLEVEL_START;
+ parse.saw_version_field = false;
+
+ /* Create a JSON lexing context. */
+ lex = makeJsonLexContextCstringLen(buffer, size, PG_UTF8, true);
+
+ /* Set up semantic actions. */
+ sem.semstate = &parse;
+ sem.object_start = json_manifest_object_start;
+ sem.object_end = json_manifest_object_end;
+ sem.array_start = json_manifest_array_start;
+ sem.array_end = json_manifest_array_end;
+ sem.object_field_start = json_manifest_object_field_start;
+ sem.object_field_end = NULL;
+ sem.array_element_start = NULL;
+ sem.array_element_end = NULL;
+ sem.scalar = json_manifest_scalar;
+
+ /* Run the actual JSON parser. */
+ json_error = pg_parse_json(lex, &sem);
+ if (json_error != JSON_SUCCESS)
+ json_manifest_parse_failure(context, "parsing failed");
+ if (parse.state != JM_EXPECT_EOF)
+ json_manifest_parse_failure(context, "manifest ended unexpectedly");
+
+ /* Verify the manifest checksum. */
+ verify_manifest_checksum(&parse, buffer, size);
+}
+
+/*
+ * Invoked at the start of each object in the JSON document.
+ *
+ * The document as a whole is expected to be an object; each file and each
+ * WAL range is also expected to be an object. If we're anywhere else in the
+ * document, it's an error.
+ */
+static void
+json_manifest_object_start(void *state)
+{
+ JsonManifestParseState *parse = state;
+
+ switch (parse->state)
+ {
+ case JM_EXPECT_TOPLEVEL_START:
+ parse->state = JM_EXPECT_TOPLEVEL_FIELD;
+ break;
+ case JM_EXPECT_FILES_NEXT:
+ parse->state = JM_EXPECT_THIS_FILE_FIELD;
+ parse->pathname = NULL;
+ parse->encoded_pathname = NULL;
+ parse->size = NULL;
+ parse->algorithm = NULL;
+ parse->checksum = NULL;
+ break;
+ case JM_EXPECT_WAL_RANGES_NEXT:
+ parse->state = JM_EXPECT_THIS_WAL_RANGE_FIELD;
+ parse->timeline = NULL;
+ parse->start_lsn = NULL;
+ parse->end_lsn = NULL;
+ break;
+ default:
+ json_manifest_parse_failure(parse->context,
+ "unexpected object start");
+ break;
+ }
+}
+
+/*
+ * Invoked at the end of each object in the JSON document.
+ *
+ * The possible cases here are the same as for json_manifest_object_start.
+ * There's nothing special to do at the end of the document, but when we
+ * reach the end of an object representing a particular file or WAL range,
+ * we must call json_manifest_finalize_file() to save the associated details.
+ */
+static void
+json_manifest_object_end(void *state)
+{
+ JsonManifestParseState *parse = state;
+
+ switch (parse->state)
+ {
+ case JM_EXPECT_TOPLEVEL_END:
+ parse->state = JM_EXPECT_EOF;
+ break;
+ case JM_EXPECT_THIS_FILE_FIELD:
+ json_manifest_finalize_file(parse);
+ parse->state = JM_EXPECT_FILES_NEXT;
+ break;
+ case JM_EXPECT_THIS_WAL_RANGE_FIELD:
+ json_manifest_finalize_wal_range(parse);
+ parse->state = JM_EXPECT_WAL_RANGES_NEXT;
+ break;
+ default:
+ json_manifest_parse_failure(parse->context,
+ "unexpected object end");
+ break;
+ }
+}
+
+/*
+ * Invoked at the start of each array in the JSON document.
+ *
+ * Within the toplevel object, the value associated with the "Files" key
+ * should be an array. Similarly for the "WAL-Ranges" key. No other arrays
+ * are expected.
+ */
+static void
+json_manifest_array_start(void *state)
+{
+ JsonManifestParseState *parse = state;
+
+ switch (parse->state)
+ {
+ case JM_EXPECT_FILES_START:
+ parse->state = JM_EXPECT_FILES_NEXT;
+ break;
+ case JM_EXPECT_WAL_RANGES_START:
+ parse->state = JM_EXPECT_WAL_RANGES_NEXT;
+ break;
+ default:
+ json_manifest_parse_failure(parse->context,
+ "unexpected array start");
+ break;
+ }
+}
+
+/*
+ * Invoked at the end of each array in the JSON document.
+ *
+ * The cases here are analogous to those in json_manifest_array_start.
+ */
+static void
+json_manifest_array_end(void *state)
+{
+ JsonManifestParseState *parse = state;
+
+ switch (parse->state)
+ {
+ case JM_EXPECT_FILES_NEXT:
+ case JM_EXPECT_WAL_RANGES_NEXT:
+ parse->state = JM_EXPECT_TOPLEVEL_FIELD;
+ break;
+ default:
+ json_manifest_parse_failure(parse->context,
+ "unexpected array end");
+ break;
+ }
+}
+
+/*
+ * Invoked at the start of each object field in the JSON document.
+ */
+static void
+json_manifest_object_field_start(void *state, char *fname, bool isnull)
+{
+ JsonManifestParseState *parse = state;
+
+ switch (parse->state)
+ {
+ case JM_EXPECT_TOPLEVEL_FIELD:
+
+ /*
+ * Inside toplevel object. The version indicator should always be
+ * the first field.
+ */
+ if (!parse->saw_version_field)
+ {
+ if (strcmp(fname, "PostgreSQL-Backup-Manifest-Version") != 0)
+ json_manifest_parse_failure(parse->context,
+ "expected version indicator");
+ parse->state = JM_EXPECT_VERSION_VALUE;
+ parse->saw_version_field = true;
+ break;
+ }
+
+ /* Is this the list of files? */
+ if (strcmp(fname, "Files") == 0)
+ {
+ parse->state = JM_EXPECT_FILES_START;
+ break;
+ }
+
+ /* Is this the list of WAL ranges? */
+ if (strcmp(fname, "WAL-Ranges") == 0)
+ {
+ parse->state = JM_EXPECT_WAL_RANGES_START;
+ break;
+ }
+
+ /* Is this the manifest checksum? */
+ if (strcmp(fname, "Manifest-Checksum") == 0)
+ {
+ parse->state = JM_EXPECT_MANIFEST_CHECKSUM_VALUE;
+ break;
+ }
+
+ /* It's not a field we recognize. */
+ json_manifest_parse_failure(parse->context,
+ "unrecognized top-level field");
+ break;
+
+ case JM_EXPECT_THIS_FILE_FIELD:
+ /* Inside object for one file; which key have we got? */
+ if (strcmp(fname, "Path") == 0)
+ parse->file_field = JMFF_PATH;
+ else if (strcmp(fname, "Encoded-Path") == 0)
+ parse->file_field = JMFF_ENCODED_PATH;
+ else if (strcmp(fname, "Size") == 0)
+ parse->file_field = JMFF_SIZE;
+ else if (strcmp(fname, "Last-Modified") == 0)
+ parse->file_field = JMFF_LAST_MODIFIED;
+ else if (strcmp(fname, "Checksum-Algorithm") == 0)
+ parse->file_field = JMFF_CHECKSUM_ALGORITHM;
+ else if (strcmp(fname, "Checksum") == 0)
+ parse->file_field = JMFF_CHECKSUM;
+ else
+ json_manifest_parse_failure(parse->context,
+ "unexpected file field");
+ parse->state = JM_EXPECT_THIS_FILE_VALUE;
+ break;
+
+ case JM_EXPECT_THIS_WAL_RANGE_FIELD:
+ /* Inside object for one file; which key have we got? */
+ if (strcmp(fname, "Timeline") == 0)
+ parse->wal_range_field = JMWRF_TIMELINE;
+ else if (strcmp(fname, "Start-LSN") == 0)
+ parse->wal_range_field = JMWRF_START_LSN;
+ else if (strcmp(fname, "End-LSN") == 0)
+ parse->wal_range_field = JMWRF_END_LSN;
+ else
+ json_manifest_parse_failure(parse->context,
+ "unexpected WAL range field");
+ parse->state = JM_EXPECT_THIS_WAL_RANGE_VALUE;
+ break;
+
+ default:
+ json_manifest_parse_failure(parse->context,
+ "unexpected object field");
+ break;
+ }
+}
+
+/*
+ * Invoked at the start of each scalar in the JSON document.
+ *
+ * Object field names don't reach this code; those are handled by
+ * json_manifest_object_field_start. When we're inside of the object for
+ * a particular file or WAL range, that function will have noticed the name
+ * of the field, and we'll get the corresponding value here. When we're in
+ * the toplevel object, the parse state itself tells us which field this is.
+ *
+ * In all cases except for PostgreSQL-Backup-Manifest-Version, which we
+ * can just check on the spot, the goal here is just to save the value in
+ * the parse state for later use. We don't actually do anything until we
+ * reach either the end of the object representing this file, or the end
+ * of the manifest, as the case may be.
+ */
+static void
+json_manifest_scalar(void *state, char *token, JsonTokenType tokentype)
+{
+ JsonManifestParseState *parse = state;
+
+ switch (parse->state)
+ {
+ case JM_EXPECT_VERSION_VALUE:
+ if (strcmp(token, "1") != 0)
+ json_manifest_parse_failure(parse->context,
+ "unexpected manifest version");
+ parse->state = JM_EXPECT_TOPLEVEL_FIELD;
+ break;
+
+ case JM_EXPECT_THIS_FILE_VALUE:
+ switch (parse->file_field)
+ {
+ case JMFF_PATH:
+ parse->pathname = token;
+ break;
+ case JMFF_ENCODED_PATH:
+ parse->encoded_pathname = token;
+ break;
+ case JMFF_SIZE:
+ parse->size = token;
+ break;
+ case JMFF_LAST_MODIFIED:
+ pfree(token); /* unused */
+ break;
+ case JMFF_CHECKSUM_ALGORITHM:
+ parse->algorithm = token;
+ break;
+ case JMFF_CHECKSUM:
+ parse->checksum = token;
+ break;
+ }
+ parse->state = JM_EXPECT_THIS_FILE_FIELD;
+ break;
+
+ case JM_EXPECT_THIS_WAL_RANGE_VALUE:
+ switch (parse->wal_range_field)
+ {
+ case JMWRF_TIMELINE:
+ parse->timeline = token;
+ break;
+ case JMWRF_START_LSN:
+ parse->start_lsn = token;
+ break;
+ case JMWRF_END_LSN:
+ parse->end_lsn = token;
+ break;
+ }
+ parse->state = JM_EXPECT_THIS_WAL_RANGE_FIELD;
+ break;
+
+ case JM_EXPECT_MANIFEST_CHECKSUM_VALUE:
+ parse->state = JM_EXPECT_TOPLEVEL_END;
+ parse->manifest_checksum = token;
+ break;
+
+ default:
+ json_manifest_parse_failure(parse->context, "unexpected scalar");
+ break;
+ }
+}
+
+/*
+ * Do additional parsing and sanity-checking of the details gathered for one
+ * file, and invoke the per-file callback so that the caller gets those
+ * details. This happens for each file when the corresponding JSON object is
+ * completely parsed.
+ */
+static void
+json_manifest_finalize_file(JsonManifestParseState *parse)
+{
+ JsonManifestParseContext *context = parse->context;
+ size_t size;
+ char *ep;
+ int checksum_string_length;
+ pg_checksum_type checksum_type;
+ int checksum_length;
+ uint8 *checksum_payload;
+
+ /* Pathname and size are required. */
+ if (parse->pathname == NULL && parse->encoded_pathname == NULL)
+ json_manifest_parse_failure(parse->context, "missing path name");
+ if (parse->pathname != NULL && parse->encoded_pathname != NULL)
+ json_manifest_parse_failure(parse->context,
+ "both path name and encoded path name");
+ if (parse->size == NULL)
+ json_manifest_parse_failure(parse->context, "missing size");
+ if (parse->algorithm == NULL && parse->checksum != NULL)
+ json_manifest_parse_failure(parse->context,
+ "checksum without algorithm");
+
+ /* Decode encoded pathname, if that's what we have. */
+ if (parse->encoded_pathname != NULL)
+ {
+ int encoded_length = strlen(parse->encoded_pathname);
+ int raw_length = encoded_length / 2;
+
+ parse->pathname = palloc(raw_length + 1);
+ if (encoded_length % 2 != 0 ||
+ !hexdecode_string((uint8 *) parse->pathname,
+ parse->encoded_pathname,
+ raw_length))
+ json_manifest_parse_failure(parse->context,
+ "could not decode file name");
+ parse->pathname[raw_length] = '\0';
+ pfree(parse->encoded_pathname);
+ parse->encoded_pathname = NULL;
+ }
+
+ /* Parse size. */
+ size = strtoul(parse->size, &ep, 10);
+ if (*ep)
+ json_manifest_parse_failure(parse->context,
+ "file size is not an integer");
+
+ /* Parse the checksum algorithm, if it's present. */
+ if (parse->algorithm == NULL)
+ checksum_type = CHECKSUM_TYPE_NONE;
+ else if (!pg_checksum_parse_type(parse->algorithm, &checksum_type))
+ context->error_cb(context, "unrecognized checksum algorithm: \"%s\"",
+ parse->algorithm);
+
+ /* Parse the checksum payload, if it's present. */
+ checksum_string_length = parse->checksum == NULL ? 0
+ : strlen(parse->checksum);
+ if (checksum_string_length == 0)
+ {
+ checksum_length = 0;
+ checksum_payload = NULL;
+ }
+ else
+ {
+ checksum_length = checksum_string_length / 2;
+ checksum_payload = palloc(checksum_length);
+ if (checksum_string_length % 2 != 0 ||
+ !hexdecode_string(checksum_payload, parse->checksum,
+ checksum_length))
+ context->error_cb(context,
+ "invalid checksum for file \"%s\": \"%s\"",
+ parse->pathname, parse->checksum);
+ }
+
+ /* Invoke the callback with the details we've gathered. */
+ context->perfile_cb(context, parse->pathname, size,
+ checksum_type, checksum_length, checksum_payload);
+
+ /* Free memory we no longer need. */
+ if (parse->size != NULL)
+ {
+ pfree(parse->size);
+ parse->size = NULL;
+ }
+ if (parse->algorithm != NULL)
+ {
+ pfree(parse->algorithm);
+ parse->algorithm = NULL;
+ }
+ if (parse->checksum != NULL)
+ {
+ pfree(parse->checksum);
+ parse->checksum = NULL;
+ }
+}
+
+/*
+ * Do additional parsing and sanity-checking of the details gathered for one
+ * WAL range, and invoke the per-WAL-range callback so that the caller gets
+ * those details. This happens for each WAL range when the corresponding JSON
+ * object is completely parsed.
+ */
+static void
+json_manifest_finalize_wal_range(JsonManifestParseState *parse)
+{
+ JsonManifestParseContext *context = parse->context;
+ TimeLineID tli;
+ XLogRecPtr start_lsn,
+ end_lsn;
+ char *ep;
+
+ /* Make sure all fields are present. */
+ if (parse->timeline == NULL)
+ json_manifest_parse_failure(parse->context, "missing timeline");
+ if (parse->start_lsn == NULL)
+ json_manifest_parse_failure(parse->context, "missing start LSN");
+ if (parse->end_lsn == NULL)
+ json_manifest_parse_failure(parse->context, "missing end LSN");
+
+ /* Parse timeline. */
+ tli = strtoul(parse->timeline, &ep, 10);
+ if (*ep)
+ json_manifest_parse_failure(parse->context,
+ "timeline is not an integer");
+ if (!parse_xlogrecptr(&start_lsn, parse->start_lsn))
+ json_manifest_parse_failure(parse->context,
+ "could not parse start LSN");
+ if (!parse_xlogrecptr(&end_lsn, parse->end_lsn))
+ json_manifest_parse_failure(parse->context,
+ "could not parse end LSN");
+
+ /* Invoke the callback with the details we've gathered. */
+ context->perwalrange_cb(context, tli, start_lsn, end_lsn);
+
+ /* Free memory we no longer need. */
+ if (parse->timeline != NULL)
+ {
+ pfree(parse->timeline);
+ parse->timeline = NULL;
+ }
+ if (parse->start_lsn != NULL)
+ {
+ pfree(parse->start_lsn);
+ parse->start_lsn = NULL;
+ }
+ if (parse->end_lsn != NULL)
+ {
+ pfree(parse->end_lsn);
+ parse->end_lsn = NULL;
+ }
+}
+
+/*
+ * Verify that the manifest checksum is correct.
+ *
+ * The last line of the manifest file is excluded from the manifest checksum,
+ * because the last line is expected to contain the checksum that covers
+ * the rest of the file.
+ */
+static void
+verify_manifest_checksum(JsonManifestParseState *parse, char *buffer,
+ size_t size)
+{
+ JsonManifestParseContext *context = parse->context;
+ size_t i;
+ size_t number_of_newlines = 0;
+ size_t ultimate_newline = 0;
+ size_t penultimate_newline = 0;
+ pg_cryptohash_ctx *manifest_ctx;
+ uint8 manifest_checksum_actual[PG_SHA256_DIGEST_LENGTH];
+ uint8 manifest_checksum_expected[PG_SHA256_DIGEST_LENGTH];
+
+ /* Find the last two newlines in the file. */
+ for (i = 0; i < size; ++i)
+ {
+ if (buffer[i] == '\n')
+ {
+ ++number_of_newlines;
+ penultimate_newline = ultimate_newline;
+ ultimate_newline = i;
+ }
+ }
+
+ /*
+ * Make sure that the last newline is right at the end, and that there are
+ * at least two lines total. We need this to be true in order for the
+ * following code, which computes the manifest checksum, to work properly.
+ */
+ if (number_of_newlines < 2)
+ json_manifest_parse_failure(parse->context,
+ "expected at least 2 lines");
+ if (ultimate_newline != size - 1)
+ json_manifest_parse_failure(parse->context,
+ "last line not newline-terminated");
+
+ /* Checksum the rest. */
+ manifest_ctx = pg_cryptohash_create(PG_SHA256);
+ if (manifest_ctx == NULL)
+ context->error_cb(context, "out of memory");
+ if (pg_cryptohash_init(manifest_ctx) < 0)
+ context->error_cb(context, "could not initialize checksum of manifest");
+ if (pg_cryptohash_update(manifest_ctx, (uint8 *) buffer, penultimate_newline + 1) < 0)
+ context->error_cb(context, "could not update checksum of manifest");
+ if (pg_cryptohash_final(manifest_ctx, manifest_checksum_actual,
+ sizeof(manifest_checksum_actual)) < 0)
+ context->error_cb(context, "could not finalize checksum of manifest");
+
+ /* Now verify it. */
+ if (parse->manifest_checksum == NULL)
+ context->error_cb(parse->context, "manifest has no checksum");
+ if (strlen(parse->manifest_checksum) != PG_SHA256_DIGEST_LENGTH * 2 ||
+ !hexdecode_string(manifest_checksum_expected, parse->manifest_checksum,
+ PG_SHA256_DIGEST_LENGTH))
+ context->error_cb(context, "invalid manifest checksum: \"%s\"",
+ parse->manifest_checksum);
+ if (memcmp(manifest_checksum_actual, manifest_checksum_expected,
+ PG_SHA256_DIGEST_LENGTH) != 0)
+ context->error_cb(context, "manifest checksum mismatch");
+ pg_cryptohash_free(manifest_ctx);
+}
+
+/*
+ * Report a parse error.
+ *
+ * This is intended to be used for fairly low-level failures that probably
+ * shouldn't occur unless somebody has deliberately constructed a bad manifest,
+ * or unless the server is generating bad manifests due to some bug. msg should
+ * be a short string giving some hint as to what the problem is.
+ */
+static void
+json_manifest_parse_failure(JsonManifestParseContext *context, char *msg)
+{
+ context->error_cb(context, "could not parse backup manifest: %s", msg);
+}
+
+/*
+ * Convert a character which represents a hexadecimal digit to an integer.
+ *
+ * Returns -1 if the character is not a hexadecimal digit.
+ */
+static int
+hexdecode_char(char c)
+{
+ if (c >= '0' && c <= '9')
+ return c - '0';
+ if (c >= 'a' && c <= 'f')
+ return c - 'a' + 10;
+ if (c >= 'A' && c <= 'F')
+ return c - 'A' + 10;
+
+ return -1;
+}
+
+/*
+ * Decode a hex string into a byte string, 2 hex chars per byte.
+ *
+ * Returns false if invalid characters are encountered; otherwise true.
+ */
+static bool
+hexdecode_string(uint8 *result, char *input, int nbytes)
+{
+ int i;
+
+ for (i = 0; i < nbytes; ++i)
+ {
+ int n1 = hexdecode_char(input[i * 2]);
+ int n2 = hexdecode_char(input[i * 2 + 1]);
+
+ if (n1 < 0 || n2 < 0)
+ return false;
+ result[i] = n1 * 16 + n2;
+ }
+
+ return true;
+}
+
+/*
+ * Parse an XLogRecPtr expressed using the usual string format.
+ */
+static bool
+parse_xlogrecptr(XLogRecPtr *result, char *input)
+{
+ uint32 hi;
+ uint32 lo;
+
+ if (sscanf(input, "%X/%X", &hi, &lo) != 2)
+ return false;
+ *result = ((uint64) hi) << 32 | lo;
+ return true;
+}
diff --git a/src/bin/pg_verifybackup/parse_manifest.h b/src/bin/pg_verifybackup/parse_manifest.h
new file mode 100644
index 0000000..ee6f67d
--- /dev/null
+++ b/src/bin/pg_verifybackup/parse_manifest.h
@@ -0,0 +1,46 @@
+/*-------------------------------------------------------------------------
+ *
+ * parse_manifest.h
+ * Parse a backup manifest in JSON format.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_verifybackup/parse_manifest.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef PARSE_MANIFEST_H
+#define PARSE_MANIFEST_H
+
+#include "access/xlogdefs.h"
+#include "common/checksum_helper.h"
+#include "mb/pg_wchar.h"
+
+struct JsonManifestParseContext;
+typedef struct JsonManifestParseContext JsonManifestParseContext;
+
+typedef void (*json_manifest_perfile_callback) (JsonManifestParseContext *,
+ char *pathname,
+ size_t size, pg_checksum_type checksum_type,
+ int checksum_length, uint8 *checksum_payload);
+typedef void (*json_manifest_perwalrange_callback) (JsonManifestParseContext *,
+ TimeLineID tli,
+ XLogRecPtr start_lsn, XLogRecPtr end_lsn);
+typedef void (*json_manifest_error_callback) (JsonManifestParseContext *,
+ const char *fmt,...) pg_attribute_printf(2, 3)
+ pg_attribute_noreturn();
+
+struct JsonManifestParseContext
+{
+ void *private_data;
+ json_manifest_perfile_callback perfile_cb;
+ json_manifest_perwalrange_callback perwalrange_cb;
+ json_manifest_error_callback error_cb;
+};
+
+extern void json_parse_manifest(JsonManifestParseContext *context,
+ char *buffer, size_t size);
+
+#endif
diff --git a/src/bin/pg_verifybackup/pg_verifybackup.c b/src/bin/pg_verifybackup/pg_verifybackup.c
new file mode 100644
index 0000000..bd18b44
--- /dev/null
+++ b/src/bin/pg_verifybackup/pg_verifybackup.c
@@ -0,0 +1,916 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_verifybackup.c
+ * Verify a backup against a backup manifest.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_verifybackup/pg_verifybackup.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <dirent.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+#include "common/hashfn.h"
+#include "common/logging.h"
+#include "fe_utils/simple_list.h"
+#include "getopt_long.h"
+#include "parse_manifest.h"
+
+/*
+ * For efficiency, we'd like our hash table containing information about the
+ * manifest to start out with approximately the correct number of entries.
+ * There's no way to know the exact number of entries without reading the whole
+ * file, but we can get an estimate by dividing the file size by the estimated
+ * number of bytes per line.
+ *
+ * This could be off by about a factor of two in either direction, because the
+ * checksum algorithm has a big impact on the line lengths; e.g. a SHA512
+ * checksum is 128 hex bytes, whereas a CRC-32C value is only 8, and there
+ * might be no checksum at all.
+ */
+#define ESTIMATED_BYTES_PER_MANIFEST_LINE 100
+
+/*
+ * How many bytes should we try to read from a file at once?
+ */
+#define READ_CHUNK_SIZE 4096
+
+/*
+ * Each file described by the manifest file is parsed to produce an object
+ * like this.
+ */
+typedef struct manifest_file
+{
+ uint32 status; /* hash status */
+ char *pathname;
+ size_t size;
+ pg_checksum_type checksum_type;
+ int checksum_length;
+ uint8 *checksum_payload;
+ bool matched;
+ bool bad;
+} manifest_file;
+
+/*
+ * Define a hash table which we can use to store information about the files
+ * mentioned in the backup manifest.
+ */
+static uint32 hash_string_pointer(char *s);
+#define SH_PREFIX manifest_files
+#define SH_ELEMENT_TYPE manifest_file
+#define SH_KEY_TYPE char *
+#define SH_KEY pathname
+#define SH_HASH_KEY(tb, key) hash_string_pointer(key)
+#define SH_EQUAL(tb, a, b) (strcmp(a, b) == 0)
+#define SH_SCOPE static inline
+#define SH_RAW_ALLOCATOR pg_malloc0
+#define SH_DECLARE
+#define SH_DEFINE
+#include "lib/simplehash.h"
+
+/*
+ * Each WAL range described by the manifest file is parsed to produce an
+ * object like this.
+ */
+typedef struct manifest_wal_range
+{
+ TimeLineID tli;
+ XLogRecPtr start_lsn;
+ XLogRecPtr end_lsn;
+ struct manifest_wal_range *next;
+ struct manifest_wal_range *prev;
+} manifest_wal_range;
+
+/*
+ * Details we need in callbacks that occur while parsing a backup manifest.
+ */
+typedef struct parser_context
+{
+ manifest_files_hash *ht;
+ manifest_wal_range *first_wal_range;
+ manifest_wal_range *last_wal_range;
+} parser_context;
+
+/*
+ * All of the context information we need while checking a backup manifest.
+ */
+typedef struct verifier_context
+{
+ manifest_files_hash *ht;
+ char *backup_directory;
+ SimpleStringList ignore_list;
+ bool exit_on_error;
+ bool saw_any_error;
+} verifier_context;
+
+static void parse_manifest_file(char *manifest_path,
+ manifest_files_hash **ht_p,
+ manifest_wal_range **first_wal_range_p);
+
+static void record_manifest_details_for_file(JsonManifestParseContext *context,
+ char *pathname, size_t size,
+ pg_checksum_type checksum_type,
+ int checksum_length,
+ uint8 *checksum_payload);
+static void record_manifest_details_for_wal_range(JsonManifestParseContext *context,
+ TimeLineID tli,
+ XLogRecPtr start_lsn,
+ XLogRecPtr end_lsn);
+static void report_manifest_error(JsonManifestParseContext *context,
+ const char *fmt,...)
+ pg_attribute_printf(2, 3) pg_attribute_noreturn();
+
+static void verify_backup_directory(verifier_context *context,
+ char *relpath, char *fullpath);
+static void verify_backup_file(verifier_context *context,
+ char *relpath, char *fullpath);
+static void report_extra_backup_files(verifier_context *context);
+static void verify_backup_checksums(verifier_context *context);
+static void verify_file_checksum(verifier_context *context,
+ manifest_file *m, char *pathname);
+static void parse_required_wal(verifier_context *context,
+ char *pg_waldump_path,
+ char *wal_directory,
+ manifest_wal_range *first_wal_range);
+
+static void report_backup_error(verifier_context *context,
+ const char *pg_restrict fmt,...)
+ pg_attribute_printf(2, 3);
+static void report_fatal_error(const char *pg_restrict fmt,...)
+ pg_attribute_printf(1, 2) pg_attribute_noreturn();
+static bool should_ignore_relpath(verifier_context *context, char *relpath);
+
+static void usage(void);
+
+static const char *progname;
+
+/*
+ * Main entry point.
+ */
+int
+main(int argc, char **argv)
+{
+ static struct option long_options[] = {
+ {"exit-on-error", no_argument, NULL, 'e'},
+ {"ignore", required_argument, NULL, 'i'},
+ {"manifest-path", required_argument, NULL, 'm'},
+ {"no-parse-wal", no_argument, NULL, 'n'},
+ {"quiet", no_argument, NULL, 'q'},
+ {"skip-checksums", no_argument, NULL, 's'},
+ {"wal-directory", required_argument, NULL, 'w'},
+ {NULL, 0, NULL, 0}
+ };
+
+ int c;
+ verifier_context context;
+ manifest_wal_range *first_wal_range;
+ char *manifest_path = NULL;
+ bool no_parse_wal = false;
+ bool quiet = false;
+ bool skip_checksums = false;
+ char *wal_directory = NULL;
+ char *pg_waldump_path = NULL;
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_verifybackup"));
+ progname = get_progname(argv[0]);
+
+ memset(&context, 0, sizeof(context));
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_verifybackup (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ /*
+ * Skip certain files in the toplevel directory.
+ *
+ * Ignore the backup_manifest file, because it's not included in the
+ * backup manifest.
+ *
+ * Ignore the pg_wal directory, because those files are not included in
+ * the backup manifest either, since they are fetched separately from the
+ * backup itself, and verified via a separate mechanism.
+ *
+ * Ignore postgresql.auto.conf, recovery.signal, and standby.signal,
+ * because we expect that those files may sometimes be created or changed
+ * as part of the backup process. For example, pg_basebackup -R will
+ * modify postgresql.auto.conf and create standby.signal.
+ */
+ simple_string_list_append(&context.ignore_list, "backup_manifest");
+ simple_string_list_append(&context.ignore_list, "pg_wal");
+ simple_string_list_append(&context.ignore_list, "postgresql.auto.conf");
+ simple_string_list_append(&context.ignore_list, "recovery.signal");
+ simple_string_list_append(&context.ignore_list, "standby.signal");
+
+ while ((c = getopt_long(argc, argv, "ei:m:nqsw:", long_options, NULL)) != -1)
+ {
+ switch (c)
+ {
+ case 'e':
+ context.exit_on_error = true;
+ break;
+ case 'i':
+ {
+ char *arg = pstrdup(optarg);
+
+ canonicalize_path(arg);
+ simple_string_list_append(&context.ignore_list, arg);
+ break;
+ }
+ case 'm':
+ manifest_path = pstrdup(optarg);
+ canonicalize_path(manifest_path);
+ break;
+ case 'n':
+ no_parse_wal = true;
+ break;
+ case 'q':
+ quiet = true;
+ break;
+ case 's':
+ skip_checksums = true;
+ break;
+ case 'w':
+ wal_directory = pstrdup(optarg);
+ canonicalize_path(wal_directory);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /* Get backup directory name */
+ if (optind >= argc)
+ {
+ pg_log_error("no backup directory specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ context.backup_directory = pstrdup(argv[optind++]);
+ canonicalize_path(context.backup_directory);
+
+ /* Complain if any arguments remain */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* Unless --no-parse-wal was specified, we will need pg_waldump. */
+ if (!no_parse_wal)
+ {
+ int ret;
+
+ pg_waldump_path = pg_malloc(MAXPGPATH);
+ ret = find_other_exec(argv[0], "pg_waldump",
+ "pg_waldump (PostgreSQL) " PG_VERSION "\n",
+ pg_waldump_path);
+ if (ret < 0)
+ {
+ char full_path[MAXPGPATH];
+
+ if (find_my_exec(argv[0], full_path) < 0)
+ strlcpy(full_path, progname, sizeof(full_path));
+
+ if (ret == -1)
+ pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"",
+ "pg_waldump", "pg_verifybackup", full_path);
+ else
+ pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s",
+ "pg_waldump", full_path, "pg_verifybackup");
+ }
+ }
+
+ /* By default, look for the manifest in the backup directory. */
+ if (manifest_path == NULL)
+ manifest_path = psprintf("%s/backup_manifest",
+ context.backup_directory);
+
+ /* By default, look for the WAL in the backup directory, too. */
+ if (wal_directory == NULL)
+ wal_directory = psprintf("%s/pg_wal", context.backup_directory);
+
+ /*
+ * Try to read the manifest. We treat any errors encountered while parsing
+ * the manifest as fatal; there doesn't seem to be much point in trying to
+ * verify the backup directory against a corrupted manifest.
+ */
+ parse_manifest_file(manifest_path, &context.ht, &first_wal_range);
+
+ /*
+ * Now scan the files in the backup directory. At this stage, we verify
+ * that every file on disk is present in the manifest and that the sizes
+ * match. We also set the "matched" flag on every manifest entry that
+ * corresponds to a file on disk.
+ */
+ verify_backup_directory(&context, NULL, context.backup_directory);
+
+ /*
+ * The "matched" flag should now be set on every entry in the hash table.
+ * Any entries for which the bit is not set are files mentioned in the
+ * manifest that don't exist on disk.
+ */
+ report_extra_backup_files(&context);
+
+ /*
+ * Now do the expensive work of verifying file checksums, unless we were
+ * told to skip it.
+ */
+ if (!skip_checksums)
+ verify_backup_checksums(&context);
+
+ /*
+ * Try to parse the required ranges of WAL records, unless we were told
+ * not to do so.
+ */
+ if (!no_parse_wal)
+ parse_required_wal(&context, pg_waldump_path,
+ wal_directory, first_wal_range);
+
+ /*
+ * If everything looks OK, tell the user this, unless we were asked to
+ * work quietly.
+ */
+ if (!context.saw_any_error && !quiet)
+ printf(_("backup successfully verified\n"));
+
+ return context.saw_any_error ? 1 : 0;
+}
+
+/*
+ * Parse a manifest file. Construct a hash table with information about
+ * all the files it mentions, and a linked list of all the WAL ranges it
+ * mentions.
+ */
+static void
+parse_manifest_file(char *manifest_path, manifest_files_hash **ht_p,
+ manifest_wal_range **first_wal_range_p)
+{
+ int fd;
+ struct stat statbuf;
+ off_t estimate;
+ uint32 initial_size;
+ manifest_files_hash *ht;
+ char *buffer;
+ int rc;
+ parser_context private_context;
+ JsonManifestParseContext context;
+
+ /* Open the manifest file. */
+ if ((fd = open(manifest_path, O_RDONLY | PG_BINARY, 0)) < 0)
+ report_fatal_error("could not open file \"%s\": %m", manifest_path);
+
+ /* Figure out how big the manifest is. */
+ if (fstat(fd, &statbuf) != 0)
+ report_fatal_error("could not stat file \"%s\": %m", manifest_path);
+
+ /* Guess how large to make the hash table based on the manifest size. */
+ estimate = statbuf.st_size / ESTIMATED_BYTES_PER_MANIFEST_LINE;
+ initial_size = Min(PG_UINT32_MAX, Max(estimate, 256));
+
+ /* Create the hash table. */
+ ht = manifest_files_create(initial_size, NULL);
+
+ /*
+ * Slurp in the whole file.
+ *
+ * This is not ideal, but there's currently no easy way to get
+ * pg_parse_json() to perform incremental parsing.
+ */
+ buffer = pg_malloc(statbuf.st_size);
+ rc = read(fd, buffer, statbuf.st_size);
+ if (rc != statbuf.st_size)
+ {
+ if (rc < 0)
+ report_fatal_error("could not read file \"%s\": %m",
+ manifest_path);
+ else
+ report_fatal_error("could not read file \"%s\": read %d of %lld",
+ manifest_path, rc, (long long int) statbuf.st_size);
+ }
+
+ /* Close the manifest file. */
+ close(fd);
+
+ /* Parse the manifest. */
+ private_context.ht = ht;
+ private_context.first_wal_range = NULL;
+ private_context.last_wal_range = NULL;
+ context.private_data = &private_context;
+ context.perfile_cb = record_manifest_details_for_file;
+ context.perwalrange_cb = record_manifest_details_for_wal_range;
+ context.error_cb = report_manifest_error;
+ json_parse_manifest(&context, buffer, statbuf.st_size);
+
+ /* Done with the buffer. */
+ pfree(buffer);
+
+ /* Return the file hash table and WAL range list we constructed. */
+ *ht_p = ht;
+ *first_wal_range_p = private_context.first_wal_range;
+}
+
+/*
+ * Report an error while parsing the manifest.
+ *
+ * We consider all such errors to be fatal errors. The manifest parser
+ * expects this function not to return.
+ */
+static void
+report_manifest_error(JsonManifestParseContext *context, const char *fmt,...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ pg_log_generic_v(PG_LOG_ERROR, PG_LOG_PRIMARY, gettext(fmt), ap);
+ va_end(ap);
+
+ exit(1);
+}
+
+/*
+ * Record details extracted from the backup manifest for one file.
+ */
+static void
+record_manifest_details_for_file(JsonManifestParseContext *context,
+ char *pathname, size_t size,
+ pg_checksum_type checksum_type,
+ int checksum_length, uint8 *checksum_payload)
+{
+ parser_context *pcxt = context->private_data;
+ manifest_files_hash *ht = pcxt->ht;
+ manifest_file *m;
+ bool found;
+
+ /* Make a new entry in the hash table for this file. */
+ m = manifest_files_insert(ht, pathname, &found);
+ if (found)
+ report_fatal_error("duplicate path name in backup manifest: \"%s\"",
+ pathname);
+
+ /* Initialize the entry. */
+ m->size = size;
+ m->checksum_type = checksum_type;
+ m->checksum_length = checksum_length;
+ m->checksum_payload = checksum_payload;
+ m->matched = false;
+ m->bad = false;
+}
+
+/*
+ * Record details extracted from the backup manifest for one WAL range.
+ */
+static void
+record_manifest_details_for_wal_range(JsonManifestParseContext *context,
+ TimeLineID tli,
+ XLogRecPtr start_lsn, XLogRecPtr end_lsn)
+{
+ parser_context *pcxt = context->private_data;
+ manifest_wal_range *range;
+
+ /* Allocate and initialize a struct describing this WAL range. */
+ range = palloc(sizeof(manifest_wal_range));
+ range->tli = tli;
+ range->start_lsn = start_lsn;
+ range->end_lsn = end_lsn;
+ range->prev = pcxt->last_wal_range;
+ range->next = NULL;
+
+ /* Add it to the end of the list. */
+ if (pcxt->first_wal_range == NULL)
+ pcxt->first_wal_range = range;
+ else
+ pcxt->last_wal_range->next = range;
+ pcxt->last_wal_range = range;
+}
+
+/*
+ * Verify one directory.
+ *
+ * 'relpath' is NULL if we are to verify the top-level backup directory,
+ * and otherwise the relative path to the directory that is to be verified.
+ *
+ * 'fullpath' is the backup directory with 'relpath' appended; i.e. the actual
+ * filesystem path at which it can be found.
+ */
+static void
+verify_backup_directory(verifier_context *context, char *relpath,
+ char *fullpath)
+{
+ DIR *dir;
+ struct dirent *dirent;
+
+ dir = opendir(fullpath);
+ if (dir == NULL)
+ {
+ /*
+ * If even the toplevel backup directory cannot be found, treat this
+ * as a fatal error.
+ */
+ if (relpath == NULL)
+ report_fatal_error("could not open directory \"%s\": %m", fullpath);
+
+ /*
+ * Otherwise, treat this as a non-fatal error, but ignore any further
+ * errors related to this path and anything beneath it.
+ */
+ report_backup_error(context,
+ "could not open directory \"%s\": %m", fullpath);
+ simple_string_list_append(&context->ignore_list, relpath);
+
+ return;
+ }
+
+ while (errno = 0, (dirent = readdir(dir)) != NULL)
+ {
+ char *filename = dirent->d_name;
+ char *newfullpath = psprintf("%s/%s", fullpath, filename);
+ char *newrelpath;
+
+ /* Skip "." and ".." */
+ if (filename[0] == '.' && (filename[1] == '\0'
+ || strcmp(filename, "..") == 0))
+ continue;
+
+ if (relpath == NULL)
+ newrelpath = pstrdup(filename);
+ else
+ newrelpath = psprintf("%s/%s", relpath, filename);
+
+ if (!should_ignore_relpath(context, newrelpath))
+ verify_backup_file(context, newrelpath, newfullpath);
+
+ pfree(newfullpath);
+ pfree(newrelpath);
+ }
+
+ if (closedir(dir))
+ {
+ report_backup_error(context,
+ "could not close directory \"%s\": %m", fullpath);
+ return;
+ }
+}
+
+/*
+ * Verify one file (which might actually be a directory or a symlink).
+ *
+ * The arguments to this function have the same meaning as the arguments to
+ * verify_backup_directory.
+ */
+static void
+verify_backup_file(verifier_context *context, char *relpath, char *fullpath)
+{
+ struct stat sb;
+ manifest_file *m;
+
+ if (stat(fullpath, &sb) != 0)
+ {
+ report_backup_error(context,
+ "could not stat file or directory \"%s\": %m",
+ relpath);
+
+ /*
+ * Suppress further errors related to this path name and, if it's a
+ * directory, anything underneath it.
+ */
+ simple_string_list_append(&context->ignore_list, relpath);
+
+ return;
+ }
+
+ /* If it's a directory, just recurse. */
+ if (S_ISDIR(sb.st_mode))
+ {
+ verify_backup_directory(context, relpath, fullpath);
+ return;
+ }
+
+ /* If it's not a directory, it should be a plain file. */
+ if (!S_ISREG(sb.st_mode))
+ {
+ report_backup_error(context,
+ "\"%s\" is not a file or directory",
+ relpath);
+ return;
+ }
+
+ /* Check whether there's an entry in the manifest hash. */
+ m = manifest_files_lookup(context->ht, relpath);
+ if (m == NULL)
+ {
+ report_backup_error(context,
+ "\"%s\" is present on disk but not in the manifest",
+ relpath);
+ return;
+ }
+
+ /* Flag this entry as having been encountered in the filesystem. */
+ m->matched = true;
+
+ /* Check that the size matches. */
+ if (m->size != sb.st_size)
+ {
+ report_backup_error(context,
+ "\"%s\" has size %lld on disk but size %zu in the manifest",
+ relpath, (long long int) sb.st_size, m->size);
+ m->bad = true;
+ }
+
+ /*
+ * We don't verify checksums at this stage. We first finish verifying that
+ * we have the expected set of files with the expected sizes, and only
+ * afterwards verify the checksums. That's because computing checksums may
+ * take a while, and we'd like to report more obvious problems quickly.
+ */
+}
+
+/*
+ * Scan the hash table for entries where the 'matched' flag is not set; report
+ * that such files are present in the manifest but not on disk.
+ */
+static void
+report_extra_backup_files(verifier_context *context)
+{
+ manifest_files_iterator it;
+ manifest_file *m;
+
+ manifest_files_start_iterate(context->ht, &it);
+ while ((m = manifest_files_iterate(context->ht, &it)) != NULL)
+ if (!m->matched && !should_ignore_relpath(context, m->pathname))
+ report_backup_error(context,
+ "\"%s\" is present in the manifest but not on disk",
+ m->pathname);
+}
+
+/*
+ * Verify checksums for hash table entries that are otherwise unproblematic.
+ * If we've already reported some problem related to a hash table entry, or
+ * if it has no checksum, just skip it.
+ */
+static void
+verify_backup_checksums(verifier_context *context)
+{
+ manifest_files_iterator it;
+ manifest_file *m;
+
+ manifest_files_start_iterate(context->ht, &it);
+ while ((m = manifest_files_iterate(context->ht, &it)) != NULL)
+ {
+ if (m->matched && !m->bad && m->checksum_type != CHECKSUM_TYPE_NONE &&
+ !should_ignore_relpath(context, m->pathname))
+ {
+ char *fullpath;
+
+ /* Compute the full pathname to the target file. */
+ fullpath = psprintf("%s/%s", context->backup_directory,
+ m->pathname);
+
+ /* Do the actual checksum verification. */
+ verify_file_checksum(context, m, fullpath);
+
+ /* Avoid leaking memory. */
+ pfree(fullpath);
+ }
+ }
+}
+
+/*
+ * Verify the checksum of a single file.
+ */
+static void
+verify_file_checksum(verifier_context *context, manifest_file *m,
+ char *fullpath)
+{
+ pg_checksum_context checksum_ctx;
+ char *relpath = m->pathname;
+ int fd;
+ int rc;
+ size_t bytes_read = 0;
+ uint8 buffer[READ_CHUNK_SIZE];
+ uint8 checksumbuf[PG_CHECKSUM_MAX_LENGTH];
+ int checksumlen;
+
+ /* Open the target file. */
+ if ((fd = open(fullpath, O_RDONLY | PG_BINARY, 0)) < 0)
+ {
+ report_backup_error(context, "could not open file \"%s\": %m",
+ relpath);
+ return;
+ }
+
+ /* Initialize checksum context. */
+ if (pg_checksum_init(&checksum_ctx, m->checksum_type) < 0)
+ {
+ report_backup_error(context, "could not initialize checksum of file \"%s\"",
+ relpath);
+ close(fd);
+ return;
+ }
+
+ /* Read the file chunk by chunk, updating the checksum as we go. */
+ while ((rc = read(fd, buffer, READ_CHUNK_SIZE)) > 0)
+ {
+ bytes_read += rc;
+ if (pg_checksum_update(&checksum_ctx, buffer, rc) < 0)
+ {
+ report_backup_error(context, "could not update checksum of file \"%s\"",
+ relpath);
+ close(fd);
+ return;
+ }
+ }
+ if (rc < 0)
+ report_backup_error(context, "could not read file \"%s\": %m",
+ relpath);
+
+ /* Close the file. */
+ if (close(fd) != 0)
+ {
+ report_backup_error(context, "could not close file \"%s\": %m",
+ relpath);
+ return;
+ }
+
+ /* If we didn't manage to read the whole file, bail out now. */
+ if (rc < 0)
+ return;
+
+ /*
+ * Double-check that we read the expected number of bytes from the file.
+ * Normally, a file size mismatch would be caught in verify_backup_file
+ * and this check would never be reached, but this provides additional
+ * safety and clarity in the event of concurrent modifications or
+ * filesystem misbehavior.
+ */
+ if (bytes_read != m->size)
+ {
+ report_backup_error(context,
+ "file \"%s\" should contain %zu bytes, but read %zu bytes",
+ relpath, m->size, bytes_read);
+ return;
+ }
+
+ /* Get the final checksum. */
+ checksumlen = pg_checksum_final(&checksum_ctx, checksumbuf);
+ if (checksumlen < 0)
+ {
+ report_backup_error(context,
+ "could not finalize checksum of file \"%s\"",
+ relpath);
+ return;
+ }
+
+ /* And check it against the manifest. */
+ if (checksumlen != m->checksum_length)
+ report_backup_error(context,
+ "file \"%s\" has checksum of length %d, but expected %d",
+ relpath, m->checksum_length, checksumlen);
+ else if (memcmp(checksumbuf, m->checksum_payload, checksumlen) != 0)
+ report_backup_error(context,
+ "checksum mismatch for file \"%s\"",
+ relpath);
+}
+
+/*
+ * Attempt to parse the WAL files required to restore from backup using
+ * pg_waldump.
+ */
+static void
+parse_required_wal(verifier_context *context, char *pg_waldump_path,
+ char *wal_directory, manifest_wal_range *first_wal_range)
+{
+ manifest_wal_range *this_wal_range = first_wal_range;
+
+ while (this_wal_range != NULL)
+ {
+ char *pg_waldump_cmd;
+
+ pg_waldump_cmd = psprintf("\"%s\" --quiet --path=\"%s\" --timeline=%u --start=%X/%X --end=%X/%X\n",
+ pg_waldump_path, wal_directory, this_wal_range->tli,
+ LSN_FORMAT_ARGS(this_wal_range->start_lsn),
+ LSN_FORMAT_ARGS(this_wal_range->end_lsn));
+ if (system(pg_waldump_cmd) != 0)
+ report_backup_error(context,
+ "WAL parsing failed for timeline %u",
+ this_wal_range->tli);
+
+ this_wal_range = this_wal_range->next;
+ }
+}
+
+/*
+ * Report a problem with the backup.
+ *
+ * Update the context to indicate that we saw an error, and exit if the
+ * context says we should.
+ */
+static void
+report_backup_error(verifier_context *context, const char *pg_restrict fmt,...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ pg_log_generic_v(PG_LOG_ERROR, PG_LOG_PRIMARY, gettext(fmt), ap);
+ va_end(ap);
+
+ context->saw_any_error = true;
+ if (context->exit_on_error)
+ exit(1);
+}
+
+/*
+ * Report a fatal error and exit
+ */
+static void
+report_fatal_error(const char *pg_restrict fmt,...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ pg_log_generic_v(PG_LOG_ERROR, PG_LOG_PRIMARY, gettext(fmt), ap);
+ va_end(ap);
+
+ exit(1);
+}
+
+/*
+ * Is the specified relative path, or some prefix of it, listed in the set
+ * of paths to ignore?
+ *
+ * Note that by "prefix" we mean a parent directory; for this purpose,
+ * "aa/bb" is not a prefix of "aa/bbb", but it is a prefix of "aa/bb/cc".
+ */
+static bool
+should_ignore_relpath(verifier_context *context, char *relpath)
+{
+ SimpleStringListCell *cell;
+
+ for (cell = context->ignore_list.head; cell != NULL; cell = cell->next)
+ {
+ char *r = relpath;
+ char *v = cell->val;
+
+ while (*v != '\0' && *r == *v)
+ ++r, ++v;
+
+ if (*v == '\0' && (*r == '\0' || *r == '/'))
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * Helper function for manifest_files hash table.
+ */
+static uint32
+hash_string_pointer(char *s)
+{
+ unsigned char *ss = (unsigned char *) s;
+
+ return hash_bytes(ss, strlen(s));
+}
+
+/*
+ * Print out usage information and exit.
+ */
+static void
+usage(void)
+{
+ printf(_("%s verifies a backup against the backup manifest.\n\n"), progname);
+ printf(_("Usage:\n %s [OPTION]... BACKUPDIR\n\n"), progname);
+ printf(_("Options:\n"));
+ printf(_(" -e, --exit-on-error exit immediately on error\n"));
+ printf(_(" -i, --ignore=RELATIVE_PATH ignore indicated path\n"));
+ printf(_(" -m, --manifest-path=PATH use specified path for manifest\n"));
+ printf(_(" -n, --no-parse-wal do not try to parse WAL files\n"));
+ printf(_(" -q, --quiet do not print any output, except for errors\n"));
+ printf(_(" -s, --skip-checksums skip checksum verification\n"));
+ printf(_(" -w, --wal-directory=PATH use specified path for WAL files\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/pg_verifybackup/po/de.po b/src/bin/pg_verifybackup/po/de.po
new file mode 100644
index 0000000..cde30cc
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/de.po
@@ -0,0 +1,498 @@
+# German message translation file for pg_verifybackup
+# Copyright (C) 2020-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-10 15:46+0000\n"
+"PO-Revision-Date: 2022-05-10 18:16+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n"
+
+#: ../../common/jsonapi.c:1075
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "Escape-Sequenz »\\%s« ist nicht gültig."
+
+#: ../../common/jsonapi.c:1078
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "Zeichen mit Wert 0x%02x muss escapt werden."
+
+#: ../../common/jsonapi.c:1081
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "Ende der Eingabe erwartet, aber »%s« gefunden."
+
+#: ../../common/jsonapi.c:1084
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "Array-Element oder »]« erwartet, aber »%s« gefunden."
+
+#: ../../common/jsonapi.c:1087
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "»,« oder »]« erwartet, aber »%s« gefunden."
+
+#: ../../common/jsonapi.c:1090
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "»:« erwartet, aber »%s« gefunden."
+
+#: ../../common/jsonapi.c:1093
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "JSON-Wert erwartet, aber »%s« gefunden."
+
+#: ../../common/jsonapi.c:1096
+msgid "The input string ended unexpectedly."
+msgstr "Die Eingabezeichenkette endete unerwartet."
+
+#: ../../common/jsonapi.c:1098
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "Zeichenkette oder »}« erwartet, aber »%s« gefunden."
+
+#: ../../common/jsonapi.c:1101
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "»,« oder »}« erwartet, aber »%s« gefunden."
+
+#: ../../common/jsonapi.c:1104
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "Zeichenkette erwartet, aber »%s« gefunden."
+
+#: ../../common/jsonapi.c:1107
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "Token »%s« ist ungültig."
+
+#: ../../common/jsonapi.c:1110
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 kann nicht in »text« umgewandelt werden."
+
+#: ../../common/jsonapi.c:1112
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "Nach »\\u« müssen vier Hexadezimalziffern folgen."
+
+#: ../../common/jsonapi.c:1115
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "Unicode-Escape-Werte können nicht für Code-Punkt-Werte über 007F verwendet werden, wenn die Kodierung nicht UTF8 ist."
+
+#: ../../common/jsonapi.c:1117
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Unicode-High-Surrogate darf nicht auf ein High-Surrogate folgen."
+
+#: ../../common/jsonapi.c:1119
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Unicode-Low-Surrogate muss auf ein High-Surrogate folgen."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "Parsen fehlgeschlagen"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "Manifest endete unerwartet"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "unerwarteter Objektstart"
+
+#: parse_manifest.c:224
+msgid "unexpected object end"
+msgstr "unerwartetes Objektende"
+
+#: parse_manifest.c:251
+msgid "unexpected array start"
+msgstr "unerwarteter Array-Start"
+
+#: parse_manifest.c:274
+msgid "unexpected array end"
+msgstr "unerwartetes Array-Ende"
+
+#: parse_manifest.c:299
+msgid "expected version indicator"
+msgstr "unerwartete Versionskennzeichnung"
+
+#: parse_manifest.c:328
+msgid "unrecognized top-level field"
+msgstr "unbekanntes Feld auf oberster Ebene"
+
+#: parse_manifest.c:347
+msgid "unexpected file field"
+msgstr "unerwartetes Feld für Datei"
+
+#: parse_manifest.c:361
+msgid "unexpected WAL range field"
+msgstr "unerwartetes Feld für WAL-Bereich"
+
+#: parse_manifest.c:367
+msgid "unexpected object field"
+msgstr "unbekanntes Feld für Objekt"
+
+#: parse_manifest.c:397
+msgid "unexpected manifest version"
+msgstr "unerwartete Manifestversion"
+
+#: parse_manifest.c:448
+msgid "unexpected scalar"
+msgstr "unerwarteter Skalar"
+
+#: parse_manifest.c:472
+msgid "missing path name"
+msgstr "fehlender Pfadname"
+
+#: parse_manifest.c:475
+msgid "both path name and encoded path name"
+msgstr "sowohl Pfadname als auch kodierter Pfadname angegeben"
+
+#: parse_manifest.c:477
+msgid "missing size"
+msgstr "Größenangabe fehlt"
+
+#: parse_manifest.c:480
+msgid "checksum without algorithm"
+msgstr "Prüfsumme ohne Algorithmus"
+
+#: parse_manifest.c:494
+msgid "could not decode file name"
+msgstr "konnte Dateinamen nicht dekodieren"
+
+#: parse_manifest.c:504
+msgid "file size is not an integer"
+msgstr "Dateigröße ist keine ganze Zahl"
+
+#: parse_manifest.c:510
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "unbekannter Prüfsummenalgorithmus: »%s«"
+
+#: parse_manifest.c:529
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "ungültige Prüfsumme für Datei »%s«: »%s«"
+
+#: parse_manifest.c:572
+msgid "missing timeline"
+msgstr "Zeitleiste fehlt"
+
+#: parse_manifest.c:574
+msgid "missing start LSN"
+msgstr "Start-LSN fehlt"
+
+#: parse_manifest.c:576
+msgid "missing end LSN"
+msgstr "End-LSN fehlt"
+
+#: parse_manifest.c:582
+msgid "timeline is not an integer"
+msgstr "Zeitleiste ist keine ganze Zahl"
+
+#: parse_manifest.c:585
+msgid "could not parse start LSN"
+msgstr "konnte Start-LSN nicht parsen"
+
+#: parse_manifest.c:588
+msgid "could not parse end LSN"
+msgstr "konnte End-LSN nicht parsen"
+
+#: parse_manifest.c:649
+msgid "expected at least 2 lines"
+msgstr "mindestens 2 Zeilen erwartet"
+
+#: parse_manifest.c:652
+msgid "last line not newline-terminated"
+msgstr "letzte Zeile nicht durch Newline abgeschlossen"
+
+#: parse_manifest.c:657
+#, c-format
+msgid "out of memory"
+msgstr "Speicher aufgebraucht"
+
+#: parse_manifest.c:659
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "konnte Prüfsumme des Manifests nicht initialisieren"
+
+#: parse_manifest.c:661
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "konnte Prüfsumme des Manifests nicht aktualisieren"
+
+#: parse_manifest.c:664
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "konnte Prüfsumme des Manifests nicht abschließen"
+
+#: parse_manifest.c:668
+#, c-format
+msgid "manifest has no checksum"
+msgstr "Manifest hat keine Prüfsumme"
+
+#: parse_manifest.c:672
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "ungültige Manifestprüfsumme: »%s«"
+
+#: parse_manifest.c:676
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "Manifestprüfsumme stimmt nicht überein"
+
+#: parse_manifest.c:691
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "konnte Backup-Manifest nicht parsen: %s"
+
+#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_verifybackup.c:264
+#, c-format
+msgid "no backup directory specified"
+msgstr "kein Backup-Verzeichnis angegeben"
+
+#: pg_verifybackup.c:274
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_verifybackup.c:297
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden"
+
+#: pg_verifybackup.c:300
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s"
+
+#: pg_verifybackup.c:356
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "Backup erfolgreich überprüft\n"
+
+#: pg_verifybackup.c:382 pg_verifybackup.c:718
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: pg_verifybackup.c:386
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m"
+
+#: pg_verifybackup.c:406 pg_verifybackup.c:745
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht lesen: %m"
+
+#: pg_verifybackup.c:409
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "konnte Datei »%s« nicht lesen: %d von %lld gelesen"
+
+#: pg_verifybackup.c:469
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "doppelter Pfadname im Backup-Manifest: »%s«"
+
+#: pg_verifybackup.c:532 pg_verifybackup.c:539
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht öffnen: %m"
+
+#: pg_verifybackup.c:571
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht schließen: %m"
+
+#: pg_verifybackup.c:591
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "konnte »stat« für Datei oder Verzeichnis »%s« nicht ausführen: %m"
+
+#: pg_verifybackup.c:614
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "»%s« ist keine Datei und kein Verzeichnis"
+
+#: pg_verifybackup.c:624
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "»%s« ist auf der Festplatte vorhanden, aber nicht im Manifest"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "»%s« hat Größe %lld auf Festplatte aber Größe %zu im Manifest"
+
+#: pg_verifybackup.c:663
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "»%s« steht im Manifest, ist aber nicht auf der Festplatte vorhanden"
+
+#: pg_verifybackup.c:726
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "konnte Prüfsumme der Datei »%s« nicht initialisieren"
+
+#: pg_verifybackup.c:738
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "konnte Prüfsumme der Datei »%s« nicht aktualisieren"
+
+#: pg_verifybackup.c:751
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schließen: %m"
+
+#: pg_verifybackup.c:770
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "Datei »%s« sollte %zu Bytes enthalten, aber %zu Bytes wurden gelesen"
+
+#: pg_verifybackup.c:780
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "konnte Prüfsumme der Datei »%s« nicht abschließen"
+
+#: pg_verifybackup.c:788
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "Datei »%s« hat Prüfsumme mit Länge %d, aber %d wurde erwartet"
+
+#: pg_verifybackup.c:792
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "Prüfsumme stimmt nicht überein für Datei »%s«"
+
+#: pg_verifybackup.c:816
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "Parsen des WAL fehlgeschlagen für Zeitleiste %u"
+
+#: pg_verifybackup.c:902
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s überprüft ein Backup anhand eines Backup-Manifests.\n"
+"\n"
+
+#: pg_verifybackup.c:903
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"Aufruf:\n"
+" %s [OPTION]... BACKUPVERZ\n"
+"\n"
+
+#: pg_verifybackup.c:904
+#, c-format
+msgid "Options:\n"
+msgstr "Optionen:\n"
+
+#: pg_verifybackup.c:905
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error bei Fehler sofort beenden\n"
+
+#: pg_verifybackup.c:906
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=REL-PFAD angegebenen Pfad ignorieren\n"
+
+#: pg_verifybackup.c:907
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=PFAD angegebenen Pfad für Manifest verwenden\n"
+
+#: pg_verifybackup.c:908
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal nicht versuchen WAL-Dateien zu parsen\n"
+
+#: pg_verifybackup.c:909
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet keine Ausgabe, außer Fehler\n"
+
+#: pg_verifybackup.c:910
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums Überprüfung der Prüfsummen überspringen\n"
+
+#: pg_verifybackup.c:911
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=PFAD angegebenen Pfad für WAL-Dateien verwenden\n"
+
+#: pg_verifybackup.c:912
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_verifybackup.c:913
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_verifybackup.c:914
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: pg_verifybackup.c:915
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
diff --git a/src/bin/pg_verifybackup/po/el.po b/src/bin/pg_verifybackup/po/el.po
new file mode 100644
index 0000000..2ec9396
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/el.po
@@ -0,0 +1,505 @@
+# Greek message translation file for pg_verifybackup
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-14 09:16+0000\n"
+"PO-Revision-Date: 2023-04-14 14:44+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "προειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέρεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "έλλειψη μνήμης\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "δεν ήταν δυνατή η αντιγραφή δείκτη null (εσωτερικό σφάλμα)\n"
+
+#: ../../common/jsonapi.c:1092
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "Η ακολουθία διαφυγής «\\%s» δεν είναι έγκυρη."
+
+#: ../../common/jsonapi.c:1095
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "Ο χαρακτήρας με τιμή 0x%02x πρέπει να διαφύγει."
+
+#: ../../common/jsonapi.c:1098
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "Ανέμενε τέλος εισόδου, αλλά βρήκε «%s»."
+
+#: ../../common/jsonapi.c:1101
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "Ανέμενε στοιχείο συστυχίας ή «]», αλλά βρέθηκε «%s»."
+
+#: ../../common/jsonapi.c:1104
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "Ανέμενε «,» ή «]», αλλά βρήκε «%s»."
+
+#: ../../common/jsonapi.c:1107
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "Ανέμενε «:», αλλά βρήκε «%s»."
+
+#: ../../common/jsonapi.c:1110
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "Ανέμενε τιμή JSON, αλλά βρήκε «%s»."
+
+#: ../../common/jsonapi.c:1113
+msgid "The input string ended unexpectedly."
+msgstr "Η συμβολοσειρά εισόδου τερματίστηκε αναπάντεχα."
+
+#: ../../common/jsonapi.c:1115
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "Ανέμενε συμβολοσειρά ή «}», αλλά βρήκε «%s»."
+
+#: ../../common/jsonapi.c:1118
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "Ανέμενε «,» ή «}», αλλά βρήκε «%s»."
+
+#: ../../common/jsonapi.c:1121
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "Ανέμενε συμβολοσειρά, αλλά βρήκε «%s»."
+
+#: ../../common/jsonapi.c:1124
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "Το διακριτικό «%s» δεν είναι έγκυρο."
+
+#: ../../common/jsonapi.c:1127
+msgid "\\u0000 cannot be converted to text."
+msgstr "Δεν είναι δυνατή η μετατροπή του \\u0000 σε κείμενο."
+
+#: ../../common/jsonapi.c:1129
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "Το «\\u» πρέπει να ακολουθείται από τέσσερα δεκαεξαδικά ψηφία."
+
+#: ../../common/jsonapi.c:1132
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "Δεν μπορούν να χρησιμοποιηθούν τιμές διαφυγής Unicode για τιμές σημείου κώδικα άνω του 007F όταν η κωδικοποίηση δεν είναι UTF8."
+
+#: ../../common/jsonapi.c:1134
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Υψηλό διακριτικό Unicode δεν πρέπει να ακολουθεί υψηλό διακριτικό."
+
+#: ../../common/jsonapi.c:1136
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Χαμηλό διακριτικό Unicode πρέπει να ακολουθεί υψηλό διακριτικό."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "απέτυχε η ανάλυση"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "η διακήρυξη έληξε απροσδόκητα"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "μη αναμενόμενη αρχή αντικειμένου"
+
+#: parse_manifest.c:224
+msgid "unexpected object end"
+msgstr "μη αναμενόμενο τέλος αντικειμένου"
+
+#: parse_manifest.c:251
+msgid "unexpected array start"
+msgstr "μη αναμενόμενη αρχή συστοιχίας"
+
+#: parse_manifest.c:274
+msgid "unexpected array end"
+msgstr "μη αναμενόμενο τέλος συστοιχίας"
+
+#: parse_manifest.c:299
+msgid "expected version indicator"
+msgstr "ανέμενε ένδειξη έκδοσης"
+
+#: parse_manifest.c:328
+msgid "unrecognized top-level field"
+msgstr "μη αναγνωρίσιμο πεδίο ανώτατου επιπέδου"
+
+#: parse_manifest.c:347
+msgid "unexpected file field"
+msgstr "μη αναμενόμενο πεδίο αρχείου"
+
+#: parse_manifest.c:361
+msgid "unexpected WAL range field"
+msgstr "μη αναμενόμενο πεδίο περιοχής WAL"
+
+#: parse_manifest.c:367
+msgid "unexpected object field"
+msgstr "μη αναμενόμενο πεδίο αντικειμένου"
+
+#: parse_manifest.c:397
+msgid "unexpected manifest version"
+msgstr "μη αναμενόμενη έκδοση διακήρυξης"
+
+#: parse_manifest.c:448
+msgid "unexpected scalar"
+msgstr "μη αναμενόμενο scalar"
+
+#: parse_manifest.c:472
+msgid "missing path name"
+msgstr "λείπει όνομα διαδρομής"
+
+#: parse_manifest.c:475
+msgid "both path name and encoded path name"
+msgstr "και όνομα διαδρομής και κωδικοποιημένο όνομα διαδρομής"
+
+#: parse_manifest.c:477
+msgid "missing size"
+msgstr "λείπει το μέγεθος"
+
+#: parse_manifest.c:480
+msgid "checksum without algorithm"
+msgstr "άθροισμα ελέγχου χωρίς αλγόριθμο"
+
+#: parse_manifest.c:494
+msgid "could not decode file name"
+msgstr "δεν ήταν δυνατή η αποκωδικοποίηση του ονόματος αρχείου"
+
+#: parse_manifest.c:504
+msgid "file size is not an integer"
+msgstr "το μέγεθος αρχείου δεν είναι ακέραιος"
+
+#: parse_manifest.c:510
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "μη αναγνωρίσιμος αλγόριθμος αθροίσματος ελέγχου: «%s»"
+
+#: parse_manifest.c:529
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "μη έγκυρο άθροισμα ελέγχου για το αρχείο «%s»: «%s»"
+
+#: parse_manifest.c:572
+msgid "missing timeline"
+msgstr "λείπει η χρονογραμμή"
+
+#: parse_manifest.c:574
+msgid "missing start LSN"
+msgstr "λείπει αρχικό LSN"
+
+#: parse_manifest.c:576
+msgid "missing end LSN"
+msgstr "λείπει τελικό LSN"
+
+#: parse_manifest.c:582
+msgid "timeline is not an integer"
+msgstr "η χρονογραμμή δεν είναι ακέραιος"
+
+#: parse_manifest.c:585
+msgid "could not parse start LSN"
+msgstr "δεν ήταν δυνατή η ανάλυση του αρχικού LSN"
+
+#: parse_manifest.c:588
+msgid "could not parse end LSN"
+msgstr "δεν ήταν δυνατή η ανάλυση του τελικού LSN"
+
+#: parse_manifest.c:649
+msgid "expected at least 2 lines"
+msgstr "αναμένονταν τουλάχιστον 2 γραμμές"
+
+#: parse_manifest.c:652
+msgid "last line not newline-terminated"
+msgstr "η τελευταία γραμμή δεν τερματίστηκε με newline"
+
+#: parse_manifest.c:657
+#, c-format
+msgid "out of memory"
+msgstr "έλλειψη μνήμης"
+
+#: parse_manifest.c:659
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "δεν ήταν δυνατή η αρχικοποίηση του αθροίσματος ελέγχου της διακήρυξης"
+
+#: parse_manifest.c:661
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "δεν ήταν δυνατή η ενημέρωση του αθροίσματος ελέγχου της διακήρυξης"
+
+#: parse_manifest.c:664
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "δεν ήταν δυνατή η ολοκλήρωση του αθροίσματος ελέγχου της διακήρυξης"
+
+#: parse_manifest.c:668
+#, c-format
+msgid "manifest has no checksum"
+msgstr "η διακήρυξη δεν έχει άθροισμα ελέγχου"
+
+#: parse_manifest.c:672
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "μη έγκυρο άθροισμα ελέγχου διακήρυξης: «%s»"
+
+#: parse_manifest.c:676
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "αναντιστοιχία ελέγχου αθροίσματος διακήρυξης"
+
+#: parse_manifest.c:691
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "δεν ήταν δυνατή η ανάλυση του αντιγράφου ασφαλείας της διακήρυξης: %s"
+
+#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες."
+
+#: pg_verifybackup.c:264
+#, c-format
+msgid "no backup directory specified"
+msgstr "δεν ορίστηκε κατάλογος αντιγράφου ασφαλείας"
+
+#: pg_verifybackup.c:274
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)"
+
+#: pg_verifybackup.c:297
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "το πρόγραμμα «%s» απαιτείται από %s αλλά δεν βρέθηκε στον ίδιο κατάλογο με το «%s»"
+
+#: pg_verifybackup.c:300
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "το πρόγραμμα «%s» βρέθηκε από το «%s» αλλά δεν ήταν η ίδια έκδοση με το %s"
+
+#: pg_verifybackup.c:356
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "το αντίγραφο ασφαλείας επαληθεύτηκε με επιτυχία\n"
+
+#: pg_verifybackup.c:382 pg_verifybackup.c:718
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %m"
+
+#: pg_verifybackup.c:386
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο «%s»: %m"
+
+#: pg_verifybackup.c:406 pg_verifybackup.c:745
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: %m"
+
+#: pg_verifybackup.c:409
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: ανέγνωσε %d από %lld"
+
+#: pg_verifybackup.c:469
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "διπλότυπο όνομα διαδρομής στη διακήρυξη αντιγράφου ασφαλείας: «%s»"
+
+#: pg_verifybackup.c:532 pg_verifybackup.c:539
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m"
+
+#: pg_verifybackup.c:571
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m"
+
+#: pg_verifybackup.c:591
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο ή κατάλογο «%s»: %m"
+
+#: pg_verifybackup.c:614
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "«%s» δεν είναι αρχείο ή κατάλογος"
+
+#: pg_verifybackup.c:624
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "«%s» βρίσκεται στο δίσκο, αλλά όχι στη διακήρυξη"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "«%s» έχει μέγεθος %lld στο δίσκο, αλλά μέγεθος %zu στη διακήρυξη"
+
+#: pg_verifybackup.c:663
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "«%s» βρίσκεται στη διακήρυξη αλλά όχι στο δίσκο"
+
+#: pg_verifybackup.c:726
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "δεν ήταν δυνατή η αρχικοποίηση του αθροίσματος ελέγχου του αρχείου «%s»"
+
+#: pg_verifybackup.c:738
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "δεν ήταν δυνατή η ενημέρωση αθροίσματος ελέγχου του αρχείου «%s»"
+
+#: pg_verifybackup.c:751
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αρχείου «%s»: %m"
+
+#: pg_verifybackup.c:770
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "το αρχείο «%s» έπρεπε να περιέχει %zu bytes, αλλά να αναγνώστηκαν %zu bytes"
+
+#: pg_verifybackup.c:780
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "δεν ήταν δυνατή η ολοκλήρωση του αθροίσματος ελέγχου του αρχείου «%s»"
+
+#: pg_verifybackup.c:788
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "το αρχείο «%s» έχει άθροισμα ελέγχου μήκους %d, αλλά αναμένεται %d"
+
+#: pg_verifybackup.c:792
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "αναντιστοιχία αθροίσματος ελέγχου για το αρχείο «%s»"
+
+#: pg_verifybackup.c:816
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "απέτυχε η ανάλυση WAL για την χρονογραμμή %u"
+
+#: pg_verifybackup.c:902
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s επαληθεύει ένα αντίγραφο ασφαλείας έναντι της διακήρυξης αντιγράφων ασφαλείας.\n"
+"\n"
+
+#: pg_verifybackup.c:903
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"Χρήση:\n"
+" %s [ΕΠΙΛΟΓΗ]... BACKUPDIR\n"
+"\n"
+
+#: pg_verifybackup.c:904
+#, c-format
+msgid "Options:\n"
+msgstr "Επιλογές:\n"
+
+#: pg_verifybackup.c:905
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error να εξέλθει άμεσα σε σφάλμα\n"
+
+#: pg_verifybackup.c:906
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=RELATIVE_PATH αγνόησε την υποδεικνυόμενη διαδρομή\n"
+
+#: pg_verifybackup.c:907
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=PATH χρησιμοποίησε την καθορισμένη διαδρομή για την διακήρυξη\n"
+
+#: pg_verifybackup.c:908
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal μην δοκιμάσεις να αναλύσεις αρχεία WAL\n"
+
+#: pg_verifybackup.c:909
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet να μην εκτυπώσεις καμία έξοδο, εκτός από σφάλματα\n"
+
+#: pg_verifybackup.c:910
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums παράκαμψε την επαλήθευση αθροισμάτων ελέγχου\n"
+
+#: pg_verifybackup.c:911
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=PATH χρησιμοποίησε την καθορισμένη διαδρομή για αρχεία WAL\n"
+
+#: pg_verifybackup.c:912
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_verifybackup.c:913
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_verifybackup.c:914
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφορές σφάλματων σε <%s>.\n"
+
+#: pg_verifybackup.c:915
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αρχική σελίδα: <%s>\n"
+
+#~ msgid "fatal: "
+#~ msgstr "κρίσιμο: "
diff --git a/src/bin/pg_verifybackup/po/es.po b/src/bin/pg_verifybackup/po/es.po
new file mode 100644
index 0000000..5a728e3
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/es.po
@@ -0,0 +1,503 @@
+# Spanish message translation file for pg_verifybackup
+# Copyright (C) 2020-2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# Álvaro Herrera <alvherre@alvh.no-ip.org>, 2020.
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:46+0000\n"
+"PO-Revision-Date: 2022-10-20 09:06+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 2.4.3\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "no se puede duplicar un puntero nulo (error interno)\n"
+
+#: ../../common/jsonapi.c:1092
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "La secuencia de escape «%s» no es válida."
+
+#: ../../common/jsonapi.c:1095
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "Los caracteres con valor 0x%02x deben ser escapados."
+
+#: ../../common/jsonapi.c:1098
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "Se esperaba el fin de la entrada, se encontró «%s»."
+
+#: ../../common/jsonapi.c:1101
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "Se esperaba un elemento de array o «]», se encontró «%s»."
+
+#: ../../common/jsonapi.c:1104
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "Se esperaba «,» o «]», se encontró «%s»."
+
+#: ../../common/jsonapi.c:1107
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "Se esperaba «:», se encontró «%s»."
+
+#: ../../common/jsonapi.c:1110
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "Se esperaba un valor JSON, se encontró «%s»."
+
+#: ../../common/jsonapi.c:1113
+msgid "The input string ended unexpectedly."
+msgstr "La cadena de entrada terminó inesperadamente."
+
+#: ../../common/jsonapi.c:1115
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "Se esperaba una cadena o «}», se encontró «%s»."
+
+#: ../../common/jsonapi.c:1118
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "Se esperaba «,» o «}», se encontró «%s»."
+
+#: ../../common/jsonapi.c:1121
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "Se esperaba una cadena, se encontró «%s»."
+
+#: ../../common/jsonapi.c:1124
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "El elemento «%s» no es válido."
+
+#: ../../common/jsonapi.c:1127
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 no puede ser convertido a text."
+
+#: ../../common/jsonapi.c:1129
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "«\\u» debe ser seguido por cuatro dígitos hexadecimales."
+
+#: ../../common/jsonapi.c:1132
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "Los valores de escape Unicode no se pueden utilizar para valores de código superiores a 007F cuando la codificación no es UTF8."
+
+#: ../../common/jsonapi.c:1134
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Un «high-surrogate» Unicode no puede venir después de un «high-surrogate»."
+
+#: ../../common/jsonapi.c:1136
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Un «low-surrogate» Unicode debe seguir a un «high-surrogate»."
+
+# XXX change upstream message
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "procesamiento falló"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "el manifiesto terminó inesperadamente"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "inicio de objeto inesperado"
+
+#: parse_manifest.c:224
+msgid "unexpected object end"
+msgstr "fin de objeto inesperado"
+
+#: parse_manifest.c:251
+msgid "unexpected array start"
+msgstr "inicio de array inesperado"
+
+#: parse_manifest.c:274
+msgid "unexpected array end"
+msgstr "fin de array inesperado"
+
+#: parse_manifest.c:299
+msgid "expected version indicator"
+msgstr "se esperaba indicador de versión"
+
+#: parse_manifest.c:328
+msgid "unrecognized top-level field"
+msgstr "campo de nivel superior no reconocido"
+
+#: parse_manifest.c:347
+msgid "unexpected file field"
+msgstr "campo de archivo inesperado"
+
+#: parse_manifest.c:361
+msgid "unexpected WAL range field"
+msgstr "campo de rango de WAL inesperado"
+
+#: parse_manifest.c:367
+msgid "unexpected object field"
+msgstr "campo de objeto inesperado"
+
+#: parse_manifest.c:397
+msgid "unexpected manifest version"
+msgstr "versión de manifiesto inesperada"
+
+#: parse_manifest.c:448
+msgid "unexpected scalar"
+msgstr "escalar inesperado"
+
+#: parse_manifest.c:472
+msgid "missing path name"
+msgstr "ruta de archivo faltante"
+
+#: parse_manifest.c:475
+msgid "both path name and encoded path name"
+msgstr "hay ambos ruta de archivo (path name) y ruta codificada (encoded path name)"
+
+#: parse_manifest.c:477
+msgid "missing size"
+msgstr "tamaño faltante"
+
+#: parse_manifest.c:480
+msgid "checksum without algorithm"
+msgstr "suma de comprobación sin algoritmo"
+
+#: parse_manifest.c:494
+msgid "could not decode file name"
+msgstr "no se pudo decodificar el nombre del archivo"
+
+#: parse_manifest.c:504
+msgid "file size is not an integer"
+msgstr "el tamaño del archivo no es un número entero"
+
+#: parse_manifest.c:510
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "algoritmo de suma de comprobación no reconocido: \"%s\""
+
+#: parse_manifest.c:529
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "suma de comprobación no válida para el archivo \"%s\": \"%s\""
+
+#: parse_manifest.c:572
+msgid "missing timeline"
+msgstr "falta el timeline"
+
+#: parse_manifest.c:574
+msgid "missing start LSN"
+msgstr "falta el LSN de inicio"
+
+#: parse_manifest.c:576
+msgid "missing end LSN"
+msgstr "falta el LSN de término"
+
+#: parse_manifest.c:582
+msgid "timeline is not an integer"
+msgstr "el timeline no es un número entero"
+
+#: parse_manifest.c:585
+msgid "could not parse start LSN"
+msgstr "no se pudo interpretar el LSN de inicio"
+
+#: parse_manifest.c:588
+msgid "could not parse end LSN"
+msgstr "no se pudo interpretar el LSN de término"
+
+#: parse_manifest.c:649
+msgid "expected at least 2 lines"
+msgstr "esperado al menos 2 líneas"
+
+#: parse_manifest.c:652
+msgid "last line not newline-terminated"
+msgstr "última línea no termina en nueva línea"
+
+#: parse_manifest.c:657
+#, c-format
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: parse_manifest.c:659
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "no se pudo inicializar la suma de verificación del manifiesto"
+
+#: parse_manifest.c:661
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "no se pudo actualizar la suma de verificación del manifiesto"
+
+#: parse_manifest.c:664
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "no se pudo finalizar la suma de verificación del manifiesto"
+
+#: parse_manifest.c:668
+#, c-format
+msgid "manifest has no checksum"
+msgstr "el manifiesto no tiene suma de comprobación"
+
+#: parse_manifest.c:672
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "suma de comprobación de manifiesto no válida: \"%s\""
+
+#: parse_manifest.c:676
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "discordancia en la suma de comprobación del manifiesto"
+
+#: parse_manifest.c:691
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "no se pudo analizar el manifiesto de la copia de seguridad: %s"
+
+#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_verifybackup.c:264
+#, c-format
+msgid "no backup directory specified"
+msgstr "no fue especificado el directorio de respaldo"
+
+#: pg_verifybackup.c:274
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_verifybackup.c:297
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "el programa «%s» es requerido por %s, pero no pudo encontrarlo en el mismo directorio que «%s»"
+
+#: pg_verifybackup.c:300
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "el programa «%s» fue encontrado por «%s», pero no es de la misma versión que %s"
+
+#: pg_verifybackup.c:356
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "copia de seguridad verificada correctamente\n"
+
+#: pg_verifybackup.c:382 pg_verifybackup.c:718
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: pg_verifybackup.c:386
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "no se pudo hacer stat al archivo «%s»: %m"
+
+#: pg_verifybackup.c:406 pg_verifybackup.c:745
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "no se pudo leer el archivo «%s»: %m"
+
+#: pg_verifybackup.c:409
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "no se pudo leer el archivo «%s»: leídos %d de %lld"
+
+#: pg_verifybackup.c:469
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "nombre de ruta duplicado en el manifiesto de la copia de seguridad: \"%s\""
+
+#: pg_verifybackup.c:532 pg_verifybackup.c:539
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_verifybackup.c:571
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_verifybackup.c:591
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "no se pudo hacer stat al archivo o directorio «%s»: %m"
+
+#: pg_verifybackup.c:614
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\" no es un archivo o directorio"
+
+#: pg_verifybackup.c:624
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "\"%s\" está presente en el disco pero no en el manifiesto"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "\"%s\" tiene un tamaño %lld en el disco pero un tamaño %zu en el manifiesto"
+
+#: pg_verifybackup.c:663
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "\"%s\" está presente en el manifiesto pero no en el disco"
+
+#: pg_verifybackup.c:726
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "no se pudo inicializar la suma de verificación para el archivo «%s»"
+
+#: pg_verifybackup.c:738
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "no se pudo actualizar la suma de verificación para el archivo «%s»"
+
+#: pg_verifybackup.c:751
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo «%s»: %m"
+
+#: pg_verifybackup.c:770
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "el archivo \"%s\" debe contener %zu bytes, pero se leyeron %zu bytes"
+
+#: pg_verifybackup.c:780
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "no se pudo finalizar la suma de verificación para el archivo «%s»"
+
+#: pg_verifybackup.c:788
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "el archivo \"%s\" tiene una suma de comprobación de longitud %d, pero se esperaba %d"
+
+#: pg_verifybackup.c:792
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "no coincide la suma de comprobación para el archivo \"%s\""
+
+#: pg_verifybackup.c:816
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "Error al interpretar el WAL para el timeline %u"
+
+#: pg_verifybackup.c:902
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s verifica una copia de seguridad con el fichero de manifiesto de la copia de seguridad.\n"
+"\n"
+
+#: pg_verifybackup.c:903
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"Uso:\n"
+" %s [OPCIÓN]... BACKUPDIR\n"
+"\n"
+
+#: pg_verifybackup.c:904
+#, c-format
+msgid "Options:\n"
+msgstr "Opciones:\n"
+
+#: pg_verifybackup.c:905
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error salir inmediatamente en caso de error\n"
+
+#: pg_verifybackup.c:906
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=RELATIVE_PATH ignorar la ruta indicada\n"
+
+#: pg_verifybackup.c:907
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=PATH usar la ruta especificada para el manifiesto\n"
+
+#: pg_verifybackup.c:908
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal no intentar analizar archivos WAL\n"
+
+#: pg_verifybackup.c:909
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet no escribir ningún mensaje, excepto errores\n"
+
+#: pg_verifybackup.c:910
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums omitir la verificación de la suma de comprobación\n"
+
+#: pg_verifybackup.c:911
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=PATH utilizar la ruta especificada para los archivos WAL\n"
+
+#: pg_verifybackup.c:912
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar la información de la versión, luego salir\n"
+
+#: pg_verifybackup.c:913
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help muestra esta ayuda, luego salir\n"
+
+#: pg_verifybackup.c:914
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: pg_verifybackup.c:915
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
diff --git a/src/bin/pg_verifybackup/po/fr.po b/src/bin/pg_verifybackup/po/fr.po
new file mode 100644
index 0000000..68784c9
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/fr.po
@@ -0,0 +1,517 @@
+# LANGUAGE message translation file for pg_verifybackup
+# Copyright (C) 2020-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2020-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-12 05:16+0000\n"
+"PO-Revision-Date: 2022-04-12 17:29+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:280
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:291
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:298
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#: ../../common/jsonapi.c:1078
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "La séquence d'échappement « \\%s » est invalide."
+
+#: ../../common/jsonapi.c:1081
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "Le caractère de valeur 0x%02x doit être échappé."
+
+#: ../../common/jsonapi.c:1084
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "Attendait une fin de l'entrée, mais a trouvé « %s »."
+
+#: ../../common/jsonapi.c:1087
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "Élément de tableau ou « ] » attendu, mais trouvé « %s »."
+
+#: ../../common/jsonapi.c:1090
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "« , » ou « ] » attendu, mais trouvé « %s »."
+
+#: ../../common/jsonapi.c:1093
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "« : » attendu, mais trouvé « %s »."
+
+#: ../../common/jsonapi.c:1096
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "Valeur JSON attendue, mais « %s » trouvé."
+
+#: ../../common/jsonapi.c:1099
+msgid "The input string ended unexpectedly."
+msgstr "La chaîne en entrée se ferme de manière inattendue."
+
+#: ../../common/jsonapi.c:1101
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "Chaîne ou « } » attendu, mais « %s » trouvé."
+
+#: ../../common/jsonapi.c:1104
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "« , » ou « } » attendu, mais trouvé « %s »."
+
+#: ../../common/jsonapi.c:1107
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "Chaîne attendue, mais « %s » trouvé."
+
+#: ../../common/jsonapi.c:1110
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "Le jeton « %s » n'est pas valide."
+
+#: ../../common/jsonapi.c:1113
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 ne peut pas être converti en texte."
+
+#: ../../common/jsonapi.c:1115
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "« \\u » doit être suivi par quatre chiffres hexadécimaux."
+
+#: ../../common/jsonapi.c:1118
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "Les valeurs d'échappement Unicode ne peuvent pas être utilisées pour des valeurs de point code au-dessus de 007F quand l'encodage n'est pas UTF8."
+
+#: ../../common/jsonapi.c:1120
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Une substitution unicode haute ne doit pas suivre une substitution haute."
+
+#: ../../common/jsonapi.c:1122
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Une substitution unicode basse ne doit pas suivre une substitution haute."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "échec de l'analyse"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "le manifeste se termine de façon inattendue"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "début d'objet inattendu"
+
+#: parse_manifest.c:224
+msgid "unexpected object end"
+msgstr "fin d'objet inattendue"
+
+#: parse_manifest.c:251
+msgid "unexpected array start"
+msgstr "début de tableau inattendu"
+
+#: parse_manifest.c:274
+msgid "unexpected array end"
+msgstr "fin de tableau inattendue"
+
+#: parse_manifest.c:299
+msgid "expected version indicator"
+msgstr "indicateur de version inattendu"
+
+#: parse_manifest.c:328
+msgid "unrecognized top-level field"
+msgstr "champ haut niveau inconnu"
+
+#: parse_manifest.c:347
+msgid "unexpected file field"
+msgstr "champ de fichier inattendu"
+
+#: parse_manifest.c:361
+msgid "unexpected WAL range field"
+msgstr "champ d'intervalle de WAL inattendu"
+
+#: parse_manifest.c:367
+msgid "unexpected object field"
+msgstr "champ d'objet inattendu"
+
+#: parse_manifest.c:397
+msgid "unexpected manifest version"
+msgstr "version du manifeste inattendue"
+
+#: parse_manifest.c:448
+msgid "unexpected scalar"
+msgstr "scalaire inattendu"
+
+#: parse_manifest.c:472
+msgid "missing path name"
+msgstr "nom de chemin manquant"
+
+#: parse_manifest.c:475
+msgid "both path name and encoded path name"
+msgstr "le nom du chemin et le nom du chemin encodé"
+
+#: parse_manifest.c:477
+msgid "missing size"
+msgstr "taille manquante"
+
+#: parse_manifest.c:480
+msgid "checksum without algorithm"
+msgstr "somme de contrôle sans algorithme"
+
+#: parse_manifest.c:494
+msgid "could not decode file name"
+msgstr "n'a pas pu décoder le nom du fichier"
+
+#: parse_manifest.c:504
+msgid "file size is not an integer"
+msgstr "la taille du fichier n'est pas un entier"
+
+#: parse_manifest.c:510
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "algorithme de somme de contrôle inconnu : « %s »"
+
+#: parse_manifest.c:529
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "somme de contrôle invalide pour le fichier « %s » : « %s »"
+
+#: parse_manifest.c:572
+msgid "missing timeline"
+msgstr "timeline manquante"
+
+#: parse_manifest.c:574
+msgid "missing start LSN"
+msgstr "LSN de début manquante"
+
+#: parse_manifest.c:576
+msgid "missing end LSN"
+msgstr "LSN de fin manquante"
+
+#: parse_manifest.c:582
+msgid "timeline is not an integer"
+msgstr "la timeline n'est pas un entier"
+
+#: parse_manifest.c:585
+msgid "could not parse start LSN"
+msgstr "n'a pas pu analyser le LSN de début"
+
+#: parse_manifest.c:588
+msgid "could not parse end LSN"
+msgstr "n'a pas pu analyser le LSN de fin"
+
+#: parse_manifest.c:649
+msgid "expected at least 2 lines"
+msgstr "attendait au moins deux lignes"
+
+#: parse_manifest.c:652
+msgid "last line not newline-terminated"
+msgstr "dernière ligne non terminée avec un caractère newline"
+
+#: parse_manifest.c:657
+#, c-format
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: parse_manifest.c:659
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "n'a pas pu initialiser la somme de contrôle du manifeste"
+
+#: parse_manifest.c:661
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "n'a pas pu mettre à jour la somme de contrôle du manifeste"
+
+#: parse_manifest.c:664
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "n'a pas pu finaliser la somme de contrôle du manifeste"
+
+#: parse_manifest.c:668
+#, c-format
+msgid "manifest has no checksum"
+msgstr "le manifeste n'a pas de somme de contrôle"
+
+#: parse_manifest.c:672
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "somme de contrôle du manifeste invalide : « %s »"
+
+#: parse_manifest.c:676
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "différence de somme de contrôle pour le manifeste"
+
+#: parse_manifest.c:691
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "n'a pas pu analyser le manifeste de sauvegarde : %s"
+
+#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_verifybackup.c:264
+#, c-format
+msgid "no backup directory specified"
+msgstr "pas de répertoire de sauvegarde spécifié"
+
+#: pg_verifybackup.c:274
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_verifybackup.c:297
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »"
+
+#: pg_verifybackup.c:300
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s"
+
+#: pg_verifybackup.c:356
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "sauvegarde vérifiée avec succès\n"
+
+#: pg_verifybackup.c:382 pg_verifybackup.c:718
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: pg_verifybackup.c:386
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "n'a pas pu tester le fichier « %s » : %m"
+
+#: pg_verifybackup.c:406 pg_verifybackup.c:747
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "n'a pas pu lire le fichier « %s » : %m"
+
+#: pg_verifybackup.c:409
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %lld"
+
+#: pg_verifybackup.c:469
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "nom de chemin dupliqué dans le manifeste de sauvegarde : « %s »"
+
+#: pg_verifybackup.c:532 pg_verifybackup.c:539
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "n'a pas pu ouvrir le répertoire « %s » : %m"
+
+#: pg_verifybackup.c:571
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "n'a pas pu fermer le répertoire « %s » : %m"
+
+#: pg_verifybackup.c:591
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr ""
+"n'a pas pu récupérer les informations sur le fichier ou répertoire\n"
+"« %s » : %m"
+
+#: pg_verifybackup.c:614
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "« %s » n'est ni un fichier ni un répertoire"
+
+#: pg_verifybackup.c:624
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "« %s » est présent sur disque mais pas dans le manifeste"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "« %s » a une taille de %lld sur disque mais de %zu dans le manifeste"
+
+#: pg_verifybackup.c:663
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "« %s » est présent dans le manifeste mais pas sur disque"
+
+#: pg_verifybackup.c:726
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "n'a pas pu initialiser la somme de contrôle du fichier « %s »"
+
+#: pg_verifybackup.c:738
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "n'a pas pu mettre à jour la somme de contrôle du fichier « %s »"
+
+#: pg_verifybackup.c:753
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier « %s » : %m"
+
+#: pg_verifybackup.c:772
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "le fichier « %s » devrait contenir %zu octets, mais la lecture produit %zu octets"
+
+#: pg_verifybackup.c:782
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "n'a pas pu finaliser la somme de contrôle du fichier « %s »"
+
+#: pg_verifybackup.c:790
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "le fichier « %s » a une somme de contrôle de taille %d, alors que %d était attendu"
+
+#: pg_verifybackup.c:794
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "différence de somme de contrôle pour le fichier « %s »"
+
+#: pg_verifybackup.c:818
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "analyse du WAL échouée pour la timeline %u"
+
+#: pg_verifybackup.c:904
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s vérifie une sauvegarde à partir du manifeste de sauvegarde.\n"
+"\n"
+
+#: pg_verifybackup.c:905
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"Usage:\n"
+" %s [OPTION]... REP_SAUVEGARDE\n"
+"\n"
+
+#: pg_verifybackup.c:906
+#, c-format
+msgid "Options:\n"
+msgstr "Options :\n"
+
+#: pg_verifybackup.c:907
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error quitte immédiatement en cas d'erreur\n"
+
+#: pg_verifybackup.c:908
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=CHEMIN_RELATIF ignore le chemin indiqué\n"
+
+#: pg_verifybackup.c:909
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=CHEMIN utilise le chemin spécifié pour le manifeste\n"
+
+#: pg_verifybackup.c:910
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal n'essaie pas d'analyse les fichiers WAL\n"
+
+#: pg_verifybackup.c:911
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet n'affiche aucun message sauf pour les erreurs\n"
+
+#: pg_verifybackup.c:912
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums ignore la vérification des sommes de contrôle\n"
+
+#: pg_verifybackup.c:913
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=CHEMIN utilise le chemin spécifié pour les fichiers WAL\n"
+
+#: pg_verifybackup.c:914
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version, puis quitte\n"
+
+#: pg_verifybackup.c:915
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide, puis quitte\n"
+
+#: pg_verifybackup.c:916
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: pg_verifybackup.c:917
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#~ msgid "could not read file \"%s\": read %d of %zu"
+#~ msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
diff --git a/src/bin/pg_verifybackup/po/it.po b/src/bin/pg_verifybackup/po/it.po
new file mode 100644
index 0000000..103d6a0
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/it.po
@@ -0,0 +1,500 @@
+# LANGUAGE message translation file for pg_verifybackup
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:16+0000\n"
+"PO-Revision-Date: 2022-10-04 19:41+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "impossibile duplicare il puntatore nullo (errore interno)\n"
+
+#: ../../common/jsonapi.c:1075
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "La sequenza di escape \"\\%s\" non è valida."
+
+#: ../../common/jsonapi.c:1078
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "Il carattere con valore 0x%02x deve essere sottoposto ad escape."
+
+#: ../../common/jsonapi.c:1081
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "Era prevista la fine dell'input, trovato \"%s\" invece."
+
+#: ../../common/jsonapi.c:1084
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "Era previsto un elemento di array oppure \"]\", trovato \"%s\" invece."
+
+#: ../../common/jsonapi.c:1087
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "Era previsto \",\" oppure \"]\", trovato \"%s\" invece."
+
+#: ../../common/jsonapi.c:1090
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "Era previsto \":\", trovato \"%s\" invece."
+
+#: ../../common/jsonapi.c:1093
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "Era previsto un valore JSON, trovato \"%s\" invece."
+
+#: ../../common/jsonapi.c:1096
+msgid "The input string ended unexpectedly."
+msgstr "La stringa di input è terminata inaspettatamente."
+
+#: ../../common/jsonapi.c:1098
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "Era prevista una stringa oppure \"}\", trovato \"%s\" invece."
+
+#: ../../common/jsonapi.c:1101
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "Era previsto \",\" oppure \"}\", trovato \"%s\" invece."
+
+#: ../../common/jsonapi.c:1104
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "Era prevista una stringa, trovato \"%s\" invece."
+
+#: ../../common/jsonapi.c:1107
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "Il token \"%s\" non è valido."
+
+#: ../../common/jsonapi.c:1110
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 non può essere convertito in testo."
+
+#: ../../common/jsonapi.c:1112
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "\"\\u\" deve essere seguito da quattro cifre esadecimali."
+
+#: ../../common/jsonapi.c:1115
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "I valori di escape Unicode non possono essere utilizzati per i valori del punto di codice superiori a 007F quando la codifica non è UTF8."
+
+#: ../../common/jsonapi.c:1117
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Il surrogato alto Unicode non deve seguire un surrogato alto."
+
+#: ../../common/jsonapi.c:1119
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Il surrogato basso Unicode deve seguire un surrogato alto."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "analisi non riuscita"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "manifest è terminato in modo imprevisto"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "inizio dell'oggetto imprevisto"
+
+#: parse_manifest.c:224
+msgid "unexpected object end"
+msgstr "fine dell'oggetto inaspettato"
+
+#: parse_manifest.c:251
+msgid "unexpected array start"
+msgstr "avvio imprevisto dell'array"
+
+#: parse_manifest.c:274
+msgid "unexpected array end"
+msgstr "fine imprevista dell'array"
+
+#: parse_manifest.c:299
+msgid "expected version indicator"
+msgstr "indicatore della versione prevista"
+
+#: parse_manifest.c:328
+msgid "unrecognized top-level field"
+msgstr "campo di primo livello non riconosciuto"
+
+#: parse_manifest.c:347
+msgid "unexpected file field"
+msgstr "campo file imprevisto"
+
+#: parse_manifest.c:361
+msgid "unexpected WAL range field"
+msgstr "campo dell'intervallo WAL imprevisto"
+
+#: parse_manifest.c:367
+msgid "unexpected object field"
+msgstr "campo oggetto imprevisto"
+
+#: parse_manifest.c:397
+msgid "unexpected manifest version"
+msgstr "versione manifest imprevista"
+
+#: parse_manifest.c:448
+msgid "unexpected scalar"
+msgstr "scalare inaspettato"
+
+#: parse_manifest.c:472
+msgid "missing path name"
+msgstr "nome del percorso mancante"
+
+#: parse_manifest.c:475
+msgid "both path name and encoded path name"
+msgstr "sia il nome del percorso che il nome del percorso codificato"
+
+#: parse_manifest.c:477
+msgid "missing size"
+msgstr "dimensione mancante"
+
+#: parse_manifest.c:480
+msgid "checksum without algorithm"
+msgstr "checksum senza algoritmo"
+
+#: parse_manifest.c:494
+msgid "could not decode file name"
+msgstr "impossibile decodificare il nome del file"
+
+#: parse_manifest.c:504
+msgid "file size is not an integer"
+msgstr "la dimensione del file non è un numero intero"
+
+#: parse_manifest.c:510
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "algoritmo di checksum non riconosciuto: \"%s\""
+
+#: parse_manifest.c:529
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "checksum non valido per il file \"%s\": \"%s\""
+
+#: parse_manifest.c:572
+msgid "missing timeline"
+msgstr "sequenza temporale mancante"
+
+#: parse_manifest.c:574
+msgid "missing start LSN"
+msgstr "LSN iniziale mancante"
+
+#: parse_manifest.c:576
+msgid "missing end LSN"
+msgstr "LSN finale mancante"
+
+#: parse_manifest.c:582
+msgid "timeline is not an integer"
+msgstr "la sequenza temporale non è un numero intero"
+
+#: parse_manifest.c:585
+msgid "could not parse start LSN"
+msgstr "impossibile analizzare l'LSN di avvio"
+
+#: parse_manifest.c:588
+msgid "could not parse end LSN"
+msgstr "impossibile analizzare l'LSN finale"
+
+#: parse_manifest.c:649
+msgid "expected at least 2 lines"
+msgstr "previsto almeno 2 righe"
+
+#: parse_manifest.c:652
+msgid "last line not newline-terminated"
+msgstr "ultima riga non terminata da una nuova riga"
+
+#: parse_manifest.c:657
+#, c-format
+msgid "out of memory"
+msgstr "memoria esaurita"
+
+#: parse_manifest.c:659
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "impossibile inizializzare il checksum di manifest"
+
+#: parse_manifest.c:661
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "impossibile aggiornare il checksum di manifest"
+
+#: parse_manifest.c:664
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "non è stato possibile finalizzare il checksum di manifest"
+
+#: parse_manifest.c:668
+#, c-format
+msgid "manifest has no checksum"
+msgstr "manifest non ha checksum"
+
+#: parse_manifest.c:672
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "checksum manifest non valido: \"%s\""
+
+#: parse_manifest.c:676
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "mancata corrispondenza del checksum manifesto"
+
+#: parse_manifest.c:691
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "impossibile analizzare il manifest di backup: %s"
+
+#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_verifybackup.c:264
+#, c-format
+msgid "no backup directory specified"
+msgstr "nessuna directory di backup specificata"
+
+#: pg_verifybackup.c:274
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_verifybackup.c:297
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "il programma \"%s\" è necessario per %s ma non è stato trovato nella stessa directory di \"%s\""
+
+#: pg_verifybackup.c:300
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "il programma \"%s\" è stato trovato da \"%s\" ma non era della stessa versione di %s"
+
+#: pg_verifybackup.c:356
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "backup verificato con successo\n"
+
+#: pg_verifybackup.c:382 pg_verifybackup.c:718
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "apertura del file \"%s\" fallita: %m"
+
+#: pg_verifybackup.c:386
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file \"%s\": %m"
+
+#: pg_verifybackup.c:406 pg_verifybackup.c:745
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "lettura del file \"%s\" fallita: %m"
+
+#: pg_verifybackup.c:409
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "impossibile leggere il file \"%s\": leggere %d di %lld"
+
+#: pg_verifybackup.c:469
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "nome del percorso duplicato nel manifest di backup: \"%s\""
+
+#: pg_verifybackup.c:532 pg_verifybackup.c:539
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "apertura della directory \"%s\" fallita: %m"
+
+#: pg_verifybackup.c:571
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "impossibile chiudere la directory \"%s\": %m"
+
+#: pg_verifybackup.c:591
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file o directory \"%s\": %m"
+
+#: pg_verifybackup.c:614
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\" non è un file o una directory"
+
+#: pg_verifybackup.c:624
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "\"%s\" è presente sul disco ma non nel manifest"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "\"%s\" ha la dimensione %lld sul disco ma la dimensione %zu nel manifest"
+
+#: pg_verifybackup.c:663
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "\"%s\" è presente nel manifest ma non sul disco"
+
+#: pg_verifybackup.c:726
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "impossibile inizializzare il checksum del file \"%s\""
+
+#: pg_verifybackup.c:738
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "impossibile aggiornare il checksum del file \"%s\""
+
+#: pg_verifybackup.c:751
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "chiusura del file \"%s\" fallita: %m"
+
+#: pg_verifybackup.c:770
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "il file \"%s\" dovrebbe contenere %zu byte, ma leggere %zu byte"
+
+#: pg_verifybackup.c:780
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "impossibile finalizzare il checksum del file \"%s\""
+
+#: pg_verifybackup.c:788
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "il file \"%s\" ha un checksum di lunghezza %d, ma previsto %d"
+
+#: pg_verifybackup.c:792
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "mancata corrispondenza del checksum per il file \"%s\""
+
+#: pg_verifybackup.c:816
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "Analisi WAL non riuscita per la sequenza temporale %u"
+
+#: pg_verifybackup.c:902
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s verifica un backup rispetto al manifest di backup.\n"
+"\n"
+
+#: pg_verifybackup.c:903
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"Utilizzo:\n"
+" %s [OPZIONE]... DIR.BACKUP\n"
+"\n"
+
+#: pg_verifybackup.c:904
+#, c-format
+msgid "Options:\n"
+msgstr "Opzioni:\n"
+
+#: pg_verifybackup.c:905
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error esce immediatamente in caso di errore\n"
+
+#: pg_verifybackup.c:906
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=RELATIVE_PATH ignora il percorso indicato\n"
+
+#: pg_verifybackup.c:907
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=PATH usa il percorso specificato per manifest\n"
+
+#: pg_verifybackup.c:908
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal non tenta di analizzare i file WAL\n"
+
+#: pg_verifybackup.c:909
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet non stampa alcun output, ad eccezione degli errori\n"
+
+#: pg_verifybackup.c:910
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums salta la verifica del checksum\n"
+
+#: pg_verifybackup.c:911
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=PATH usa il percorso specificato per i file WAL\n"
+
+#: pg_verifybackup.c:912
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version restituisce le informazioni sulla versione, quindi esci\n"
+
+#: pg_verifybackup.c:913
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto, quindi esci\n"
+
+#: pg_verifybackup.c:914
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: pg_verifybackup.c:915
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
diff --git a/src/bin/pg_verifybackup/po/ja.po b/src/bin/pg_verifybackup/po/ja.po
new file mode 100644
index 0000000..e91e1a0
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/ja.po
@@ -0,0 +1,509 @@
+# Japanese message translation file for pg_verifybackup
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# Haiying Tang <tanghy.fnst@cn.fujitsu.com>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-09 12:01+0900\n"
+"PO-Revision-Date: 2022-05-10 16:25+0900\n"
+"Last-Translator: Haiying Tang <tanghy.fnst@cn.fujitsu.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリ不足です\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null ポインタを複製できません (内部エラー)\n"
+
+#: ../../common/jsonapi.c:1075
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "エスケープシーケンス\"\\%s\"は不正です。"
+
+#: ../../common/jsonapi.c:1078
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "0x%02x値を持つ文字はエスケープしなければなりません"
+
+#: ../../common/jsonapi.c:1081
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "入力の終端を想定していましたが、\"%s\"でした。"
+
+#: ../../common/jsonapi.c:1084
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "配列要素または\"]\"を想定していましたが、\"%s\"でした。"
+
+#: ../../common/jsonapi.c:1087
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "\",\"または\"]\"を想定していましたが、\"%s\"でした。"
+
+#: ../../common/jsonapi.c:1090
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "\":\"を想定していましたが、\"%s\"でした。"
+
+#: ../../common/jsonapi.c:1093
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "JSON値を想定していましたが、\"%s\"でした。"
+
+#: ../../common/jsonapi.c:1096
+msgid "The input string ended unexpectedly."
+msgstr "入力文字列が予期せず終了しました。"
+
+#: ../../common/jsonapi.c:1098
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "文字列または\"}\"を想定していましたが、\"%s\"でした。"
+
+#: ../../common/jsonapi.c:1101
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "\",\"または\"}\"を想定していましたが、\"%s\"でした。"
+
+#: ../../common/jsonapi.c:1104
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "文字列を想定していましたが、\"%s\"でした。"
+
+#: ../../common/jsonapi.c:1107
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "トークン\"%s\"は不正です。"
+
+#: ../../common/jsonapi.c:1110
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 はテキストに変換できません。"
+
+#: ../../common/jsonapi.c:1112
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "\"\\u\"の後には16進数の4桁が続かなければなりません。"
+
+#: ../../common/jsonapi.c:1115
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "エンコーディングがUTF-8ではない場合、コードポイントの値が 007F 以上についてはUnicodeエスケープの値は使用できません。"
+
+#: ../../common/jsonapi.c:1117
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Unicodeのハイサロゲートはハイサロゲートに続いてはいけません。"
+
+#: ../../common/jsonapi.c:1119
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Unicodeのローサロゲートはハイサロゲートに続かなければなりません。"
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "パースに失敗しました"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "目録が予期せず終了しました。"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "予期しないオブジェクトの開始"
+
+#: parse_manifest.c:224
+msgid "unexpected object end"
+msgstr "予期しないオブジェクトの終わり"
+
+#: parse_manifest.c:251
+msgid "unexpected array start"
+msgstr "予期しない配列の開始"
+
+#: parse_manifest.c:274
+msgid "unexpected array end"
+msgstr "予期しない配列の終わり"
+
+#: parse_manifest.c:299
+msgid "expected version indicator"
+msgstr "バージョン指示子を想定していました"
+
+#: parse_manifest.c:328
+msgid "unrecognized top-level field"
+msgstr "認識できないトップレベルフィールド"
+
+#: parse_manifest.c:347
+msgid "unexpected file field"
+msgstr "予期しないファイルフィールド"
+
+#: parse_manifest.c:361
+msgid "unexpected WAL range field"
+msgstr "予期しないWAL範囲フィールド"
+
+#: parse_manifest.c:367
+msgid "unexpected object field"
+msgstr "予期しないオブジェクトフィールド"
+
+#: parse_manifest.c:397
+msgid "unexpected manifest version"
+msgstr "予期しない目録バージョン"
+
+#: parse_manifest.c:448
+msgid "unexpected scalar"
+msgstr "予期しないスカラー"
+
+#: parse_manifest.c:472
+msgid "missing path name"
+msgstr "パス名がありません"
+
+#: parse_manifest.c:475
+msgid "both path name and encoded path name"
+msgstr "パス名とエンコードされたパス名の両方"
+
+#: parse_manifest.c:477
+msgid "missing size"
+msgstr "サイズがありません"
+
+#: parse_manifest.c:480
+msgid "checksum without algorithm"
+msgstr "アルゴリズムなしのチェックサム"
+
+#: parse_manifest.c:494
+msgid "could not decode file name"
+msgstr "ファイル名をデコードできませんでした"
+
+#: parse_manifest.c:504
+msgid "file size is not an integer"
+msgstr "ファイルサイズが整数ではありません"
+
+#: parse_manifest.c:510
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "認識できないチェックサムアルゴリズム: \"%s\""
+
+#: parse_manifest.c:529
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "\"%s\" ファイルのチェックサムが無効: \"%s\""
+
+#: parse_manifest.c:572
+msgid "missing timeline"
+msgstr "タイムラインがありません"
+
+#: parse_manifest.c:574
+msgid "missing start LSN"
+msgstr "開始LSNがありません"
+
+#: parse_manifest.c:576
+msgid "missing end LSN"
+msgstr "終了LSNがありません"
+
+#: parse_manifest.c:582
+msgid "timeline is not an integer"
+msgstr "タイムラインが整数ではありません"
+
+#: parse_manifest.c:585
+msgid "could not parse start LSN"
+msgstr "開始LSNをパースできませんでした"
+
+#: parse_manifest.c:588
+msgid "could not parse end LSN"
+msgstr "終了LSNをパースできませんでした"
+
+#: parse_manifest.c:649
+msgid "expected at least 2 lines"
+msgstr "少なくとも2行が必要です"
+
+#: parse_manifest.c:652
+msgid "last line not newline-terminated"
+msgstr "最後の行が改行で終わっていません"
+
+#: parse_manifest.c:657
+#, c-format
+msgid "out of memory"
+msgstr "メモリ不足です"
+
+#: parse_manifest.c:659
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "目録のチェックサムの初期化ができませんでした"
+
+#: parse_manifest.c:661
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "目録のチェックサムの更新ができませんでした"
+
+#: parse_manifest.c:664
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "目録のチェックサムの完了ができませんでした"
+
+#: parse_manifest.c:668
+#, c-format
+msgid "manifest has no checksum"
+msgstr "目録にチェックサムがありません"
+
+#: parse_manifest.c:672
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "無効な目録チェックサム: \"%s\""
+
+#: parse_manifest.c:676
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "目録チェックサムの不一致"
+
+#: parse_manifest.c:691
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "バックアップ目録をパースできませんでした: %s"
+
+#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細は\"%s --help\"を実行してください。"
+
+#: pg_verifybackup.c:264
+#, c-format
+msgid "no backup directory specified"
+msgstr "バックアップディレクトリが指定されていません"
+
+#: pg_verifybackup.c:274
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")"
+
+#: pg_verifybackup.c:297
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "%2$sにはプログラム\"%1$s\"が必要ですが、\"%3$s\"と同じディレクトリにありませんでした"
+
+#: pg_verifybackup.c:300
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じバージョンではありませんでした"
+
+#: pg_verifybackup.c:356
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "バックアップが正常に検証されました\n"
+
+#: pg_verifybackup.c:382 pg_verifybackup.c:718
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンできませんでした: %m"
+
+#: pg_verifybackup.c:386
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ファイル\"%s\"のstatに失敗しました: %m"
+
+#: pg_verifybackup.c:406 pg_verifybackup.c:745
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ファイル\"%s\"の読み取りに失敗しました: %m"
+
+#: pg_verifybackup.c:409
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$lldバイトのうち%2$dバイトを読み込みました"
+
+#: pg_verifybackup.c:469
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "バックアップ目録内の重複パス名: \"%s\""
+
+#: pg_verifybackup.c:532 pg_verifybackup.c:539
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m"
+
+#: pg_verifybackup.c:571
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をクローズできませんでした: %m"
+
+#: pg_verifybackup.c:591
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "\"%s\"というファイルまたはディレクトリの情報を取得できませんでした: %m"
+
+#: pg_verifybackup.c:614
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\"はファイルまたはディレクトリではありません"
+
+#: pg_verifybackup.c:624
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "\"%s\"はディスクに存在しますが、目録には存在しません"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "\"%s\"はディスク上でのサイズは%lldですが、目録上は%zuとなっています"
+
+#: pg_verifybackup.c:663
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "\"%s\"は目録には存在しますが、ディスクには存在しません"
+
+#: pg_verifybackup.c:726
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "ファイル\"%s\"のチェックサムの初期化ができませんでした"
+
+#: pg_verifybackup.c:738
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "ファイル\"%s\"のチェックサムの更新ができませんでした"
+
+#: pg_verifybackup.c:751
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ファイル\"%s\"をクローズできませんでした: %m"
+
+#: pg_verifybackup.c:770
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "file\"%s\"は%zuバイトを含む必要がありますが、%zuバイトが読み込まれました"
+
+#: pg_verifybackup.c:780
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "ファイル\"%s\"のチェックサムの完了ができませんでした"
+
+#: pg_verifybackup.c:788
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "ファイル\"%s\"のチェックサムの長さは%dですが、予期されるのは%dです"
+
+#: pg_verifybackup.c:792
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "ファイル\"%s\"のチェックサムが一致しません"
+
+#: pg_verifybackup.c:816
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "タイムライン%uのWALのパースに失敗しました"
+
+#: pg_verifybackup.c:902
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%sはバックアップ目録に対してバックアップを検証します。\n"
+"\n"
+
+#: pg_verifybackup.c:903
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"使用方法:\n"
+" %s [オプション]... BACKUPDIR\n"
+"\n"
+
+#: pg_verifybackup.c:904
+#, c-format
+msgid "Options:\n"
+msgstr "オプション:\n"
+
+#: pg_verifybackup.c:905
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error エラー時に直ちに終了する\n"
+
+#: pg_verifybackup.c:906
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=RELATIVE_PATH 指示されたパスを無視\n"
+
+#: pg_verifybackup.c:907
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=PATH 目録として指定したパスを使用する\n"
+
+#: pg_verifybackup.c:908
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal WALファイルをパースしようとしない\n"
+
+#: pg_verifybackup.c:909
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet エラー以外何も出力しない\n"
+
+#: pg_verifybackup.c:910
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums チェックサム検証をスキップ\n"
+
+#: pg_verifybackup.c:911
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=PATH WALファイルに指定したパスを使用する\n"
+
+#: pg_verifybackup.c:912
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: pg_verifybackup.c:913
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: pg_verifybackup.c:914
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"バグは<%s>に報告してください。\n"
+
+#: pg_verifybackup.c:915
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#~ msgid "fatal: "
+#~ msgstr "致命的エラー: "
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "詳細は\"%s --help\"で確認してください。\n"
+
+#~ msgid "could not read file \"%s\": read %d of %zu"
+#~ msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込みました"
diff --git a/src/bin/pg_verifybackup/po/ka.po b/src/bin/pg_verifybackup/po/ka.po
new file mode 100644
index 0000000..8ba46d2
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/ka.po
@@ -0,0 +1,516 @@
+# Georgian message translation file for pg_verifybackup
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:46+0000\n"
+"PO-Revision-Date: 2022-07-05 05:38+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდომა: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გაფრთხილება: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტალები: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნება: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "არასაკმარისი მეხსიერება\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ნულოვანი მაჩვენებლის დუბლირება შეუძლებელია (შიდა შეცდომა)\n"
+
+#: ../../common/jsonapi.c:1075
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "სპეციალური მიმდევრობა \"\\%s\" არასწორია."
+
+#: ../../common/jsonapi.c:1078
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "სიმბოლო კოდით 0x%02x აუცილებლად ეკრანირებული უნდა იყოს."
+
+#: ../../common/jsonapi.c:1081
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "მოველოდი შეყვანის დასასრულს, მაგრამ მივიღე \"%s\"."
+
+#: ../../common/jsonapi.c:1084
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "მოველოდი მასივის ელემენტს ან \"]\", მაგრამ მივიღე \"%s\"."
+
+#: ../../common/jsonapi.c:1087
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "მოველოდი \",\" ან \"]\", მაგრამ მივიღე \"%s\"."
+
+#: ../../common/jsonapi.c:1090
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "მოველოდი \":\", მაგრამ მივიღე \"%s\"."
+
+#: ../../common/jsonapi.c:1093
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "მოველოდი JSON მნიშვნელობას. მივიღე \"%s\"."
+
+#: ../../common/jsonapi.c:1096
+msgid "The input string ended unexpectedly."
+msgstr "შეყვანის სტრიქონი მოულოდნელად დასრულდა."
+
+#: ../../common/jsonapi.c:1098
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "მოველოდი სტრიქონს ან \"}\", მაგრამ მივიღე \"%s\"."
+
+#: ../../common/jsonapi.c:1101
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "მოველოდი \",\", ან \"}\", მაგრამ მივიღე \"%s\"."
+
+#: ../../common/jsonapi.c:1104
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "მოველოდი სტრიქონს, მაგრამ მივიღე \"%s\"."
+
+#: ../../common/jsonapi.c:1107
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "კოდი არასწორია: %s."
+
+#: ../../common/jsonapi.c:1110
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 ტექსტად ვერ გარდაიქმნება."
+
+#: ../../common/jsonapi.c:1112
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "\"\\u\" ს თექვსმეტობითი ციფრები უნდა მოჰყვებოდეს."
+
+#: ../../common/jsonapi.c:1115
+msgid ""
+"Unicode escape values cannot be used for code point values above 007F when "
+"the encoding is not UTF8."
+msgstr ""
+"უნიკოდის სპეციალური კოდების გამოყენება კოდის წერტილის მნიშვნელობებად 007F-"
+"ის ზემოთ შეუძლებელია, თუ კოდირება UTF-8 არაა."
+
+#: ../../common/jsonapi.c:1117
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "უნიკოდის მაღალ სუროგატს მაღალი სუროგატი არ უნდა მოსდევდეს."
+
+#: ../../common/jsonapi.c:1119
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "უნიკოდის დაბალი სუროგატი მაღალ სუროგატს უნდა მისდევდეს."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "დამუშავების შეცდომა"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "მანიფესტი მოულოდნელად დასრულდა"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "ობიექტის მოულოდნელი დასაწყისი"
+
+#: parse_manifest.c:224
+msgid "unexpected object end"
+msgstr "ობიექტის მოულოდნელი დასასრული"
+
+#: parse_manifest.c:251
+msgid "unexpected array start"
+msgstr "მასივის მოულოდნელი დასაწყისი"
+
+#: parse_manifest.c:274
+msgid "unexpected array end"
+msgstr "მასივის მოულოდნელი დასასრული"
+
+#: parse_manifest.c:299
+msgid "expected version indicator"
+msgstr "მოსალოდნელი ვერსიის მაჩვენებელი"
+
+#: parse_manifest.c:328
+msgid "unrecognized top-level field"
+msgstr "უცნობი ველი ზედა დონეზე"
+
+#: parse_manifest.c:347
+msgid "unexpected file field"
+msgstr "მოულოდნელი ველი ფაილისთვის"
+
+#: parse_manifest.c:361
+msgid "unexpected WAL range field"
+msgstr "მოულოდნელი ველი WAL-ის დიაპაზონისთვის"
+
+#: parse_manifest.c:367
+msgid "unexpected object field"
+msgstr "ობიექტის მოულოდნელი ველი"
+
+#: parse_manifest.c:397
+msgid "unexpected manifest version"
+msgstr "მანიფესტის მოულოდნელი ვერსია"
+
+#: parse_manifest.c:448
+msgid "unexpected scalar"
+msgstr "მოულოდნელი სკალარი"
+
+#: parse_manifest.c:472
+msgid "missing path name"
+msgstr "აკლია ბილიკის სახელი"
+
+#: parse_manifest.c:475
+msgid "both path name and encoded path name"
+msgstr "ორივე, ბილიკის სახელი და ბილიკის კოდირებული სახელი"
+
+#: parse_manifest.c:477
+msgid "missing size"
+msgstr "ზომა აკლია"
+
+#: parse_manifest.c:480
+msgid "checksum without algorithm"
+msgstr "საკონტროლო ჯამი ალგორითმის გარეშე"
+
+#: parse_manifest.c:494
+msgid "could not decode file name"
+msgstr "ფაილის სახელის გაშიფვრის შეცდომა"
+
+#: parse_manifest.c:504
+msgid "file size is not an integer"
+msgstr "ფაილის ზომა მთელი რიცხვი არაა"
+
+#: parse_manifest.c:510
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "საკონტროლო ჯამის უცნობი ალგორითმი: \"%s\""
+
+#: parse_manifest.c:529
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "არასწორი საკონტროლო ჯამი ფაილისთვის \"%s\": \"%s\""
+
+#: parse_manifest.c:572
+msgid "missing timeline"
+msgstr "აკლია დროის ხაზი"
+
+#: parse_manifest.c:574
+msgid "missing start LSN"
+msgstr "აკლია საწყისი LSN"
+
+#: parse_manifest.c:576
+msgid "missing end LSN"
+msgstr "აკლია დასასრულის LSN"
+
+#: parse_manifest.c:582
+msgid "timeline is not an integer"
+msgstr "დროის ხაზი მთელი რიცხვი არაა"
+
+#: parse_manifest.c:585
+msgid "could not parse start LSN"
+msgstr "საწყისი LSN-ის დამუშავების შეცდომა"
+
+#: parse_manifest.c:588
+msgid "could not parse end LSN"
+msgstr "საბოლოო LSN-ის დამუშავების შეცდომა"
+
+#: parse_manifest.c:649
+msgid "expected at least 2 lines"
+msgstr "ველოდებოდი სულ ცოტა 2 ხაზს"
+
+#: parse_manifest.c:652
+msgid "last line not newline-terminated"
+msgstr "ბოლო ხაზი ხაზის გადატანით არ სრულდება"
+
+#: parse_manifest.c:657
+#, c-format
+msgid "out of memory"
+msgstr "არასაკმარისი მეხსიერება"
+
+#: parse_manifest.c:659
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "მანიფესტის საკონტროლო ჯამის ინიციალიზაციის შეცდომა"
+
+#: parse_manifest.c:661
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "მანიფესტის საკონტროლო ჯამის განახლების შეცდომა"
+
+#: parse_manifest.c:664
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "მანიფესტის საკონტროლო ჯამის დასრულების შეცდომა"
+
+#: parse_manifest.c:668
+#, c-format
+msgid "manifest has no checksum"
+msgstr "მანიფესტის საკონტროლო ჯამი არ გააჩნია"
+
+#: parse_manifest.c:672
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "მანიფესტის საკონტროლო ჯამის არასწორია: %s"
+
+#: parse_manifest.c:676
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "მანიფესტის საკონტროლო ჯამი არ ემთხვევა"
+
+#: parse_manifest.c:691
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "მარქაფის მანიფესტის დამუშავების შეცრომა: %s"
+
+#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'."
+
+#: pg_verifybackup.c:264
+#, c-format
+msgid "no backup directory specified"
+msgstr "მარქაფის საქაღალდე მითითებული არაა"
+
+#: pg_verifybackup.c:274
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")"
+
+#: pg_verifybackup.c:297
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr ""
+"პროგრამა \"%s\" სჭირდება \"%s\"-ს, მაგრამ იგივე საქაღალდეში, სადაც \"%s\", "
+"ნაპოვნი არაა"
+
+#: pg_verifybackup.c:300
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"პროგრამა „%s“ ნაპოვნია „%s“-ის მიერ, მაგრამ ვერსია, იგივეა არაა, რაც %s"
+
+#: pg_verifybackup.c:356
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "მარქაფი წარმატებით შემოწმდა\n"
+
+#: pg_verifybackup.c:382 pg_verifybackup.c:718
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფაილის (%s) გახსნის შეცდომა: %m"
+
+#: pg_verifybackup.c:386
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ფაილი \"%s\" არ არსებობს: %m"
+
+#: pg_verifybackup.c:406 pg_verifybackup.c:745
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ფაილის (%s) წაკითხვის შეცდომა: %m"
+
+#: pg_verifybackup.c:409
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "ფაილის \"%s\" წაკითხვა შეუძლებელია: წაკითხულია %d %lld-დან"
+
+#: pg_verifybackup.c:469
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "მარქაფს მანიფესტში მითითებული ბილიკის სახელი დუბლირებულია: %s"
+
+#: pg_verifybackup.c:532 pg_verifybackup.c:539
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "საქაღალდის (%s) გახსნის შეცდომა: %m"
+
+#: pg_verifybackup.c:571
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "საქაღალდის %s-ზე დახურვის შეცდომა: %m"
+
+#: pg_verifybackup.c:591
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "ფაილის ან საქაღალდის \"%s\" პოვნა შეუძლებელია: %m"
+
+#: pg_verifybackup.c:614
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\" არც ფაილია, არც საქაღალდე"
+
+#: pg_verifybackup.c:624
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "\"%s\" დისკზე არსებობს, მაგრამ არა მანიფესტში"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "დისკზე \"%s\"-ის ზომაა %lld, მაგრამ მანიფესტში მითითებული ზომაა %zu"
+
+#: pg_verifybackup.c:663
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "\"%s\" არსებობს მანიფესტში, მაგრამ არა დისკზე"
+
+#: pg_verifybackup.c:726
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "ფაილის (\"%s\") საკონტროლო ჯამის ინიციალიზაციის შეცდომა"
+
+#: pg_verifybackup.c:738
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "ფაილის (\"%s\") საკონტროლო ჯამის განახლების შეცდომა"
+
+#: pg_verifybackup.c:751
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ფაილის (%s) დახურვის შეცდომა: %m"
+
+#: pg_verifybackup.c:770
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "ფაილი \"%s\" უნდა შეიცავდეს %zu ბაიტს მაგრამ წაკითხულია %zu ბაიტი"
+
+#: pg_verifybackup.c:780
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "ფაილის (\"%s\") საკონტროლო ჯამის დასრულების შეცდომა"
+
+#: pg_verifybackup.c:788
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "ფაილის \"%s\" საკონტროლო ჯამის სიგრძეა %d, მოველოდით %d"
+
+#: pg_verifybackup.c:792
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "არასწორი საკონტროლო ჯამი ფაილისთვის \"%s\""
+
+#: pg_verifybackup.c:816
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "WAL-ის დამუშავების შეცდომა დროის ხაზისთვის %u"
+
+#: pg_verifybackup.c:902
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr "%s მარქაფს მის მანიფესტს შეადარებს\n"
+
+#: pg_verifybackup.c:903
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"გამოყენება:\n"
+" %s [პარამეტრი]... მარქაფისსაქაღალდე\n"
+"\n"
+
+#: pg_verifybackup.c:904
+#, c-format
+msgid "Options:\n"
+msgstr "პარამეტრები:\n"
+
+#: pg_verifybackup.c:905
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr ""
+" -e, --exit-on-error დაუყოვნებლივი გამოსვლა შეცდომის შემთხვევაში\n"
+
+#: pg_verifybackup.c:906
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=შედარებითი_ბილიკ ბითითებული ბილიკის იგნორი\n"
+
+#: pg_verifybackup.c:907
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr ""
+" -m, --manifest-path=ბილიკი მანიფესტისთვის მითითებული ბილიკის "
+"გამოყენება\n"
+
+#: pg_verifybackup.c:908
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal WAL ფაილები არ დამუშავდება\n"
+
+#: pg_verifybackup.c:909
+#, c-format
+msgid ""
+" -q, --quiet do not print any output, except for errors\n"
+msgstr ""
+" -q, --quiet შეცდომების გარდა ეკრანზე არაფერი გამოჩნდება\n"
+
+#: pg_verifybackup.c:910
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr ""
+" -s, --skip-checksums საკონტროლო ჯამების შემოწმების გამოტოვება\n"
+
+#: pg_verifybackup.c:911
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr ""
+" -w, --wal-directory=ბილიკი WAL ფაილებისთვის მითითებული ბილიკის "
+"გამოყენება\n"
+
+#: pg_verifybackup.c:912
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: pg_verifybackup.c:913
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: pg_verifybackup.c:914
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდომების შესახებ მიწერეთ: %s\n"
+
+#: pg_verifybackup.c:915
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
diff --git a/src/bin/pg_verifybackup/po/ko.po b/src/bin/pg_verifybackup/po/ko.po
new file mode 100644
index 0000000..a083b72
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/ko.po
@@ -0,0 +1,516 @@
+# LANGUAGE message translation file for pg_verifybackup
+# Copyright (C) 2020 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:46+0000\n"
+"PO-Revision-Date: 2023-04-06 11:32+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: PostgreSQL Korea <kr@postgresql.org>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "상세정보: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null 포인터를 중복할 수 없음 (내부 오류)\n"
+
+#: ../../common/jsonapi.c:1092
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "잘못된 이스케이프 조합: \"\\%s\""
+
+#: ../../common/jsonapi.c:1095
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "0x%02x 값의 문자는 이스케이프 되어야함."
+
+#: ../../common/jsonapi.c:1098
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "입력 자료의 끝을 기대했는데, \"%s\" 값이 더 있음."
+
+#: ../../common/jsonapi.c:1101
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "\"]\" 가 필요한데 \"%s\"이(가) 있음"
+
+#: ../../common/jsonapi.c:1104
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "\",\" 또는 \"]\"가 필요한데 \"%s\"이(가) 있음"
+
+#: ../../common/jsonapi.c:1107
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "\":\"가 필요한데 \"%s\"이(가) 있음"
+
+#: ../../common/jsonapi.c:1110
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "JSON 값을 기대했는데, \"%s\" 값임"
+
+#: ../../common/jsonapi.c:1113
+msgid "The input string ended unexpectedly."
+msgstr "입력 문자열이 예상치 않게 끝났음."
+
+#: ../../common/jsonapi.c:1115
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "\"}\"가 필요한데 \"%s\"이(가) 있음"
+
+#: ../../common/jsonapi.c:1118
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "\",\" 또는 \"}\"가 필요한데 \"%s\"이(가) 있음"
+
+#: ../../common/jsonapi.c:1121
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "문자열 값을 기대했는데, \"%s\" 값임"
+
+#: ../../common/jsonapi.c:1124
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "잘못된 토큰: \"%s\""
+
+#: ../../common/jsonapi.c:1127
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 값은 text 형으로 변환할 수 없음."
+
+#: ../../common/jsonapi.c:1129
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "\"\\u\" 표기법은 뒤에 4개의 16진수가 와야합니다."
+
+#: ../../common/jsonapi.c:1132
+msgid ""
+"Unicode escape values cannot be used for code point values above 007F when "
+"the encoding is not UTF8."
+msgstr ""
+"인코딩은 UTF8이 아닐 때 유니코드 이스케이프 값은 007F 이상 코드 포인트 값으"
+"로 사용할 수 없음."
+
+#: ../../common/jsonapi.c:1134
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "유니코드 상위 surrogate(딸림 코드)는 상위 딸림 코드 뒤에 오면 안됨."
+
+#: ../../common/jsonapi.c:1136
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "유니코드 상위 surrogate(딸림 코드) 뒤에는 하위 딸림 코드가 있어야 함."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "구문 분석 실패"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "메니페스트가 비정상적으로 끝났음"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "비정상적인 개체 시작"
+
+#: parse_manifest.c:224
+msgid "unexpected object end"
+msgstr "비정상적인 개체 끝"
+
+#: parse_manifest.c:251
+msgid "unexpected array start"
+msgstr "비정상적인 배열 시작"
+
+#: parse_manifest.c:274
+msgid "unexpected array end"
+msgstr "비정상적인 배열 끝"
+
+#: parse_manifest.c:299
+msgid "expected version indicator"
+msgstr "버전 지시자가 있어야 함"
+
+#: parse_manifest.c:328
+msgid "unrecognized top-level field"
+msgstr "최상위 필드를 알 수 없음"
+
+#: parse_manifest.c:347
+msgid "unexpected file field"
+msgstr "예상치 못한 파일 필드"
+
+#: parse_manifest.c:361
+msgid "unexpected WAL range field"
+msgstr "예상치 못한 WAL 범위 필드"
+
+#: parse_manifest.c:367
+msgid "unexpected object field"
+msgstr "예상치 못한 개체 필드"
+
+#: parse_manifest.c:397
+msgid "unexpected manifest version"
+msgstr "예상치 못한 메니페스트 버전"
+
+#: parse_manifest.c:448
+msgid "unexpected scalar"
+msgstr "예상치 못한 스칼라"
+
+#: parse_manifest.c:472
+msgid "missing path name"
+msgstr "패스 이름 빠짐"
+
+#: parse_manifest.c:475
+msgid "both path name and encoded path name"
+msgstr "패스 이름과 인코딩 된 패스 이름이 함께 있음"
+
+#: parse_manifest.c:477
+msgid "missing size"
+msgstr "크기 빠짐"
+
+#: parse_manifest.c:480
+msgid "checksum without algorithm"
+msgstr "알고리즘 없는 체크섬"
+
+#: parse_manifest.c:494
+msgid "could not decode file name"
+msgstr "파일 이름을 디코딩할 수 없음"
+
+#: parse_manifest.c:504
+msgid "file size is not an integer"
+msgstr "파일 크기가 정수가 아님"
+
+#: parse_manifest.c:510
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "알 수 없는 체크섬 알고리즘: \"%s\""
+
+#: parse_manifest.c:529
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "\"%s\" 파일의 체크섬이 잘못됨: \"%s\""
+
+#: parse_manifest.c:572
+msgid "missing timeline"
+msgstr "타임라인 빠짐"
+
+#: parse_manifest.c:574
+msgid "missing start LSN"
+msgstr "시작 LSN 빠짐"
+
+#: parse_manifest.c:576
+msgid "missing end LSN"
+msgstr "끝 LSN 빠짐"
+
+#: parse_manifest.c:582
+msgid "timeline is not an integer"
+msgstr "타임라인이 정수가 아님"
+
+#: parse_manifest.c:585
+msgid "could not parse start LSN"
+msgstr "시작 LSN 값을 분석할 수 없음"
+
+#: parse_manifest.c:588
+msgid "could not parse end LSN"
+msgstr "끝 LSN 값을 분석할 수 없음"
+
+#: parse_manifest.c:649
+msgid "expected at least 2 lines"
+msgstr "적어도 2줄이 더 있어야 함"
+
+#: parse_manifest.c:652
+msgid "last line not newline-terminated"
+msgstr "마지막 줄에 줄바꿈 문자가 없음"
+
+#: parse_manifest.c:657
+#, c-format
+msgid "out of memory"
+msgstr "메모리 부족"
+
+#: parse_manifest.c:659
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "메니페스트 체크섬 초기화를 할 수 없음"
+
+#: parse_manifest.c:661
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "메니페스트 체크섬 갱신 할 수 없음"
+
+#: parse_manifest.c:664
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "메니페스트 체크섬 마무리 작업 할 수 없음"
+
+#: parse_manifest.c:668
+#, c-format
+msgid "manifest has no checksum"
+msgstr "메니페스트에 체크섬 없음"
+
+#: parse_manifest.c:672
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "잘못된 메니페스트 체크섬: \"%s\""
+
+#: parse_manifest.c:676
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "메니페스트 체크섬 불일치"
+
+#: parse_manifest.c:691
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "백업 메니페스트 구문 분석 실패: %s"
+
+#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "자세한 사항은 \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_verifybackup.c:264
+#, c-format
+msgid "no backup directory specified"
+msgstr "백업 디렉터리를 지정하지 않았음"
+
+#: pg_verifybackup.c:274
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 많은 명령행 인자를 지정했습니다. (처음 \"%s\")"
+
+#: pg_verifybackup.c:297
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr ""
+"\"%s\" 프로그램이 %s 작업에서 필요하지만 같은 \"%s\" 디렉터리 내에 없습니다."
+
+#: pg_verifybackup.c:300
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "\"%s\" 프로그램을 \"%s\" 작업을 위해 찾았지만 %s 버전과 같지 않습니다."
+
+#: pg_verifybackup.c:356
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "백업 검사 완료\n"
+
+#: pg_verifybackup.c:382 pg_verifybackup.c:718
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파일을 열 수 없음: %m"
+
+#: pg_verifybackup.c:386
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" 파일의 상태값을 알 수 없음: %m"
+
+#: pg_verifybackup.c:406 pg_verifybackup.c:745
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "\"%s\" 파일을 읽을 수 없음: %m"
+
+#: pg_verifybackup.c:409
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "\"%s\" 파일을 읽을 수 없음: %d 읽음, 전체 %lld"
+
+#: pg_verifybackup.c:469
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "백업 메니페스트 안에 경로 이름이 중복됨: \"%s\""
+
+#: pg_verifybackup.c:532 pg_verifybackup.c:539
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 열 수 없음: %m"
+
+#: pg_verifybackup.c:571
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 닫을 수 없음: %m"
+
+#: pg_verifybackup.c:591
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "파일 또는 디렉터리 \"%s\"의 상태를 확인할 수 없음: %m"
+
+#: pg_verifybackup.c:614
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\" 이름은 파일이나 디렉터리가 아님"
+
+#: pg_verifybackup.c:624
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "디스크에는 \"%s\" 개체가 있으나, 메니페스트 안에는 없음"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "\"%s\" 의 디스크 크기는 %lld 이나 메니페스트 안에는 %zu 입니다."
+
+#: pg_verifybackup.c:663
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "메니페스트 안에는 \"%s\" 개체가 있으나 디스크에는 없음"
+
+#: pg_verifybackup.c:726
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "\"%s\" 파일 체크섬을 초기화 할 수 없음"
+
+#: pg_verifybackup.c:738
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "\"%s\" 파일 체크섬을 갱신할 수 없음"
+
+#: pg_verifybackup.c:751
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "\"%s\" 파일을 닫을 수 없음: %m"
+
+#: pg_verifybackup.c:770
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "\"%s\" 파일은 %zu 바이트이나 %zu 바이트를 읽음"
+
+#: pg_verifybackup.c:780
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "\"%s\" 파일 체크섬을 마무리 할 수 없음"
+
+#: pg_verifybackup.c:788
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "\"%s\" 파일 체크섬 %d, 예상되는 값: %d"
+
+#: pg_verifybackup.c:792
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "\"%s\" 파일의 체크섬이 맞지 않음"
+
+#: pg_verifybackup.c:816
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "타임라인 %u번의 WAL 분석 오류"
+
+#: pg_verifybackup.c:902
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 백업 메니페스트로 백업을 검사합니다.\n"
+"\n"
+
+#: pg_verifybackup.c:903
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"사용법:\n"
+" %s [옵션]... 백업디렉터리\n"
+"\n"
+
+#: pg_verifybackup.c:904
+#, c-format
+msgid "Options:\n"
+msgstr "옵션들:\n"
+
+#: pg_verifybackup.c:905
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error 오류가 있으면 작업 중지\n"
+
+#: pg_verifybackup.c:906
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=상대경로 지정한 경로 건너뜀\n"
+
+#: pg_verifybackup.c:907
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=경로 메니페스트 파일 경로 지정\n"
+
+#: pg_verifybackup.c:908
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal WAL 파일 검사 건너뜀\n"
+
+#: pg_verifybackup.c:909
+#, c-format
+msgid ""
+" -q, --quiet do not print any output, except for errors\n"
+msgstr ""
+" -q, --quiet 오류를 빼고 나머지는 아무 것도 안 보여줌\n"
+
+#: pg_verifybackup.c:910
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums 체크섬 검사 건너뜀\n"
+
+#: pg_verifybackup.c:911
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=경로 WAL 파일이 있는 경로 지정\n"
+
+#: pg_verifybackup.c:912
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_verifybackup.c:913
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: pg_verifybackup.c:914
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"문제점 보고 주소: <%s>\n"
+
+#: pg_verifybackup.c:915
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "자제한 사항은 \"%s --help\" 명령으로 살펴보십시오.\n"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "심각: "
diff --git a/src/bin/pg_verifybackup/po/ru.po b/src/bin/pg_verifybackup/po/ru.po
new file mode 100644
index 0000000..2c599f2
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/ru.po
@@ -0,0 +1,518 @@
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 13\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-03 05:56+0300\n"
+"PO-Revision-Date: 2022-09-05 13:37+0300\n"
+"Last-Translator: Alexander Lakhin <a.lakhin@postgrespro.ru>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Lokalize 19.12.3\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробности: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подсказка: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памяти\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n"
+
+#: ../../common/jsonapi.c:1092
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "Неверная спецпоследовательность: \"\\%s\"."
+
+#: ../../common/jsonapi.c:1095
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "Символ с кодом 0x%02x необходимо экранировать."
+
+#: ../../common/jsonapi.c:1098
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "Ожидался конец текста, но обнаружено продолжение \"%s\"."
+
+#: ../../common/jsonapi.c:1101
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "Ожидался элемент массива или \"]\", но обнаружено \"%s\"."
+
+#: ../../common/jsonapi.c:1104
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "Ожидалась \",\" или \"]\", но обнаружено \"%s\"."
+
+#: ../../common/jsonapi.c:1107
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "Ожидалось \":\", но обнаружено \"%s\"."
+
+#: ../../common/jsonapi.c:1110
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "Ожидалось значение JSON, но обнаружено \"%s\"."
+
+#: ../../common/jsonapi.c:1113
+msgid "The input string ended unexpectedly."
+msgstr "Неожиданный конец входной строки."
+
+#: ../../common/jsonapi.c:1115
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "Ожидалась строка или \"}\", но обнаружено \"%s\"."
+
+#: ../../common/jsonapi.c:1118
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "Ожидалась \",\" или \"}\", но обнаружено \"%s\"."
+
+#: ../../common/jsonapi.c:1121
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "Ожидалась строка, но обнаружено \"%s\"."
+
+#: ../../common/jsonapi.c:1124
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "Ошибочный элемент текста \"%s\"."
+
+#: ../../common/jsonapi.c:1127
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 нельзя преобразовать в текст."
+
+#: ../../common/jsonapi.c:1129
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "За \"\\u\" должны следовать четыре шестнадцатеричные цифры."
+
+#: ../../common/jsonapi.c:1132
+msgid ""
+"Unicode escape values cannot be used for code point values above 007F when "
+"the encoding is not UTF8."
+msgstr ""
+"Спецкоды Unicode для значений выше 007F можно использовать только с "
+"кодировкой UTF8."
+
+#: ../../common/jsonapi.c:1134
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr ""
+"Старшее слово суррогата Unicode не может следовать за другим старшим словом."
+
+#: ../../common/jsonapi.c:1136
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Младшее слово суррогата Unicode должно следовать за старшим словом."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "ошибка при разборе"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "неожиданный конец манифеста"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "неожиданное начало объекта"
+
+#: parse_manifest.c:224
+msgid "unexpected object end"
+msgstr "неожиданный конец объекта"
+
+#: parse_manifest.c:251
+msgid "unexpected array start"
+msgstr "неожиданное начало массива"
+
+#: parse_manifest.c:274
+msgid "unexpected array end"
+msgstr "неожиданный конец массива"
+
+#: parse_manifest.c:299
+msgid "expected version indicator"
+msgstr "ожидалось указание версии"
+
+#: parse_manifest.c:328
+msgid "unrecognized top-level field"
+msgstr "нераспознанное поле на верхнем уровне"
+
+#: parse_manifest.c:347
+msgid "unexpected file field"
+msgstr "неизвестное поле для файла"
+
+#: parse_manifest.c:361
+msgid "unexpected WAL range field"
+msgstr "неизвестное поле в указании диапазона WAL"
+
+#: parse_manifest.c:367
+msgid "unexpected object field"
+msgstr "неожиданное поле объекта"
+
+#: parse_manifest.c:397
+msgid "unexpected manifest version"
+msgstr "неожиданная версия манифеста"
+
+#: parse_manifest.c:448
+msgid "unexpected scalar"
+msgstr "неожиданное скалярное значение"
+
+#: parse_manifest.c:472
+msgid "missing path name"
+msgstr "отсутствует указание пути"
+
+#: parse_manifest.c:475
+msgid "both path name and encoded path name"
+msgstr "указание пути задано в обычном виде и в закодированном"
+
+#: parse_manifest.c:477
+msgid "missing size"
+msgstr "отсутствует указание размера"
+
+#: parse_manifest.c:480
+msgid "checksum without algorithm"
+msgstr "не задан алгоритм расчёта контрольной суммы"
+
+#: parse_manifest.c:494
+msgid "could not decode file name"
+msgstr "не удалось декодировать имя файла"
+
+#: parse_manifest.c:504
+msgid "file size is not an integer"
+msgstr "размер файла не является целочисленным"
+
+#: parse_manifest.c:510
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "нераспознанный алгоритм расчёта контрольных сумм: \"%s\""
+
+#: parse_manifest.c:529
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "неверная контрольная сумма для файла \"%s\": \"%s\""
+
+#: parse_manifest.c:572
+msgid "missing timeline"
+msgstr "отсутствует линия времени"
+
+#: parse_manifest.c:574
+msgid "missing start LSN"
+msgstr "отсутствует начальный LSN"
+
+#: parse_manifest.c:576
+msgid "missing end LSN"
+msgstr "отсутствует конечный LSN"
+
+#: parse_manifest.c:582
+msgid "timeline is not an integer"
+msgstr "линия времени задаётся не целым числом"
+
+#: parse_manifest.c:585
+msgid "could not parse start LSN"
+msgstr "не удалось разобрать начальный LSN"
+
+#: parse_manifest.c:588
+msgid "could not parse end LSN"
+msgstr "не удалось разобрать конечный LSN"
+
+#: parse_manifest.c:649
+msgid "expected at least 2 lines"
+msgstr "ожидалось как минимум 2 строки"
+
+#: parse_manifest.c:652
+msgid "last line not newline-terminated"
+msgstr "последняя строка не оканчивается символом новой строки"
+
+#: parse_manifest.c:657
+#, c-format
+msgid "out of memory"
+msgstr "нехватка памяти"
+
+#: parse_manifest.c:659
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "не удалось подготовить контекст контрольной суммы манифеста"
+
+#: parse_manifest.c:661
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "не удалось изменить контекст контрольной суммы манифеста"
+
+#: parse_manifest.c:664
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "не удалось завершить расчёт контрольной суммы манифеста"
+
+#: parse_manifest.c:668
+#, c-format
+msgid "manifest has no checksum"
+msgstr "в манифесте нет контрольной суммы"
+
+#: parse_manifest.c:672
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "неверная контрольная сумма в манифесте: \"%s\""
+
+#: parse_manifest.c:676
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "ошибка контрольной суммы манифеста"
+
+#: parse_manifest.c:691
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "не удалось разобрать манифест копии: %s"
+
+#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Для дополнительной информации попробуйте \"%s --help\"."
+
+#: pg_verifybackup.c:264
+#, c-format
+msgid "no backup directory specified"
+msgstr "каталог копии не указан"
+
+#: pg_verifybackup.c:274
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "слишком много аргументов командной строки (первый: \"%s\")"
+
+#: pg_verifybackup.c:297
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr "программа \"%s\" нужна для %s, но она не найдена в каталоге \"%s\""
+
+#: pg_verifybackup.c:300
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"программа \"%s\" найдена программой \"%s\", но её версия отличается от "
+"версии %s"
+
+#: pg_verifybackup.c:356
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "копия проверена успешно\n"
+
+#: pg_verifybackup.c:382 pg_verifybackup.c:718
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалось открыть файл \"%s\": %m"
+
+#: pg_verifybackup.c:386
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не удалось получить информацию о файле \"%s\": %m"
+
+#: pg_verifybackup.c:406 pg_verifybackup.c:745
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не удалось прочитать файл \"%s\": %m"
+
+#: pg_verifybackup.c:409
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %lld)"
+
+#: pg_verifybackup.c:469
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "дублирующийся путь в манифесте копии: \"%s\""
+
+#: pg_verifybackup.c:532 pg_verifybackup.c:539
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не удалось открыть каталог \"%s\": %m"
+
+#: pg_verifybackup.c:571
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не удалось закрыть каталог \"%s\": %m"
+
+#: pg_verifybackup.c:591
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "не удалось получить информацию о файле или каталоге \"%s\": %m"
+
+#: pg_verifybackup.c:614
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\" не указывает на файл или каталог"
+
+#: pg_verifybackup.c:624
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "файл \"%s\" присутствует на диске, но отсутствует в манифесте"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr ""
+"файл \"%s\" имеет размер на диске: %lld, тогда как размер в манифесте: %zu"
+
+#: pg_verifybackup.c:663
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "файл \"%s\" присутствует в манифесте, но отсутствует на диске"
+
+#: pg_verifybackup.c:726
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "не удалось подготовить контекст контрольной суммы файла \"%s\""
+
+#: pg_verifybackup.c:738
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "не удалось изменить контекст контрольной суммы файла \"%s\""
+
+#: pg_verifybackup.c:751
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "не удалось закрыть файл \"%s\": %m"
+
+#: pg_verifybackup.c:770
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "файл \"%s\" должен содержать байт: %zu, но фактически прочитано: %zu"
+
+#: pg_verifybackup.c:780
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "не удалось завершить расчёт контрольной суммы файла \"%s\""
+
+#: pg_verifybackup.c:788
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr ""
+"для файла \"%s\" задана контрольная сумма размером %d, но ожидаемый размер: "
+"%d"
+
+#: pg_verifybackup.c:792
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "ошибка контрольной суммы для файла \"%s\""
+
+#: pg_verifybackup.c:816
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "не удалось разобрать WAL для линии времени %u"
+
+#: pg_verifybackup.c:902
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s проверяет резервную копию, используя манифест копии.\n"
+"\n"
+
+#: pg_verifybackup.c:903
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"Использование:\n"
+" %s [ПАРАМЕТР]... КАТАЛОГ_КОПИИ\n"
+"\n"
+
+#: pg_verifybackup.c:904
+#, c-format
+msgid "Options:\n"
+msgstr "Параметры:\n"
+
+#: pg_verifybackup.c:905
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error немедленный выход при ошибке\n"
+
+#: pg_verifybackup.c:906
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr ""
+" -i, --ignore=ОТНОСИТЕЛЬНЫЙ_ПУТЬ\n"
+" игнорировать заданный путь\n"
+
+#: pg_verifybackup.c:907
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=ПУТЬ использовать заданный файл манифеста\n"
+
+#: pg_verifybackup.c:908
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal не пытаться разбирать файлы WAL\n"
+
+#: pg_verifybackup.c:909
+#, c-format
+msgid ""
+" -q, --quiet do not print any output, except for errors\n"
+msgstr ""
+" -q, --quiet не выводить никаких сообщений, кроме ошибок\n"
+
+#: pg_verifybackup.c:910
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums пропустить проверку контрольных сумм\n"
+
+#: pg_verifybackup.c:911
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr ""
+" -w, --wal-directory=ПУТЬ использовать заданный путь к файлам WAL\n"
+
+#: pg_verifybackup.c:912
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: pg_verifybackup.c:913
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: pg_verifybackup.c:914
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках сообщайте по адресу <%s>.\n"
+
+#: pg_verifybackup.c:915
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
diff --git a/src/bin/pg_verifybackup/po/sv.po b/src/bin/pg_verifybackup/po/sv.po
new file mode 100644
index 0000000..c2512f7
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/sv.po
@@ -0,0 +1,528 @@
+# Swedish message translation file for pg_verifybackup
+# Copyright (C) 2020 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# Dennis Björklund <db@zigo.dhs.org>, 2020, 2021, 2022
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-11 13:46+0000\n"
+"PO-Revision-Date: 2022-04-11 16:11+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:268
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:275
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:287
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kan inte duplicera null-pekare (internt fel)\n"
+
+#: ../../common/jsonapi.c:1078
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "Escape-sekvens \"\\%s\" är ogiltig."
+
+#: ../../common/jsonapi.c:1081
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "Tecken med värde 0x%02x måste escape:as."
+
+#: ../../common/jsonapi.c:1084
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "Förväntade slut på indata, men hittade \"%s\"."
+
+#: ../../common/jsonapi.c:1087
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "Färväntade array-element eller \"]\", men hittade \"%s\"."
+
+#: ../../common/jsonapi.c:1090
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "Förväntade \",\" eller \"]\", men hittade \"%s\"."
+
+#: ../../common/jsonapi.c:1093
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "Förväntade sig \":\" men hittade \"%s\"."
+
+#: ../../common/jsonapi.c:1096
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "Förväntade JSON-värde, men hittade \"%s\"."
+
+#: ../../common/jsonapi.c:1099
+msgid "The input string ended unexpectedly."
+msgstr "Indatasträngen avslutades oväntat."
+
+#: ../../common/jsonapi.c:1101
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "Färväntade sträng eller \"}\", men hittade \"%s\"."
+
+#: ../../common/jsonapi.c:1104
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "Förväntade sig \",\" eller \"}\" men hittade \"%s\"."
+
+#: ../../common/jsonapi.c:1107
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "Förväntade sträng, men hittade \"%s\"."
+
+#: ../../common/jsonapi.c:1110
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "Token \"%s\" är ogiltig."
+
+#: ../../common/jsonapi.c:1113
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 kan inte konverteras till text."
+
+#: ../../common/jsonapi.c:1115
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "\"\\u\" måste följas av fyra hexdecimala siffror."
+
+#: ../../common/jsonapi.c:1118
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "Escape-värden för unicode kan inte användas för kodpunkter med värde över 007F när kodningen inte är UTF8."
+
+#: ../../common/jsonapi.c:1120
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Unicodes övre surrogathalva får inte komma efter en övre surrogathalva."
+
+#: ../../common/jsonapi.c:1122
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Unicodes lägre surrogathalva måste följa en övre surrogathalva."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "parsning misslyckades"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "manifestet avslutades oväntat"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "oväntad objektstart"
+
+#: parse_manifest.c:224
+msgid "unexpected object end"
+msgstr "oväntat objektslut"
+
+#: parse_manifest.c:251
+msgid "unexpected array start"
+msgstr "oväntad array-start"
+
+#: parse_manifest.c:274
+msgid "unexpected array end"
+msgstr "oväntat array-slut"
+
+#: parse_manifest.c:299
+msgid "expected version indicator"
+msgstr "förväntade en versionsindikator"
+
+#: parse_manifest.c:328
+msgid "unrecognized top-level field"
+msgstr "okänt toppnivåfält"
+
+#: parse_manifest.c:347
+msgid "unexpected file field"
+msgstr "oväntat filfält"
+
+#: parse_manifest.c:361
+msgid "unexpected WAL range field"
+msgstr "oväntat WAL-intervall-fält"
+
+#: parse_manifest.c:367
+msgid "unexpected object field"
+msgstr "oväntat objektfält"
+
+#: parse_manifest.c:397
+msgid "unexpected manifest version"
+msgstr "oväntad manifestversion"
+
+#: parse_manifest.c:448
+msgid "unexpected scalar"
+msgstr "oväntad skalar"
+
+#: parse_manifest.c:472
+msgid "missing path name"
+msgstr "saknas sökväg"
+
+#: parse_manifest.c:475
+msgid "both path name and encoded path name"
+msgstr "både sökväg och kodad sökväg"
+
+#: parse_manifest.c:477
+msgid "missing size"
+msgstr "saknar storlek"
+
+#: parse_manifest.c:480
+msgid "checksum without algorithm"
+msgstr "kontrollsumma utan algoritm"
+
+#: parse_manifest.c:494
+msgid "could not decode file name"
+msgstr "kunde inte avkoda filnamn"
+
+#: parse_manifest.c:504
+msgid "file size is not an integer"
+msgstr "filstorlek är inte ett haltal"
+
+#: parse_manifest.c:510
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "okänd algoritm för kontrollsumma: \"%s\""
+
+#: parse_manifest.c:529
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "ogiltig kontrollsumma för fil \"%s\": \"%s\""
+
+#: parse_manifest.c:572
+msgid "missing timeline"
+msgstr "saknar tidslinje"
+
+#: parse_manifest.c:574
+msgid "missing start LSN"
+msgstr "saknar start-LSN"
+
+#: parse_manifest.c:576
+msgid "missing end LSN"
+msgstr "saknar slut-LSN"
+
+#: parse_manifest.c:582
+msgid "timeline is not an integer"
+msgstr "tidslinje är inte ett heltal"
+
+#: parse_manifest.c:585
+msgid "could not parse start LSN"
+msgstr "kunde inte parsa start-LSN"
+
+#: parse_manifest.c:588
+msgid "could not parse end LSN"
+msgstr "kunde inte parsa slut-LSN"
+
+#: parse_manifest.c:649
+msgid "expected at least 2 lines"
+msgstr "förväntade minst två rader"
+
+#: parse_manifest.c:652
+msgid "last line not newline-terminated"
+msgstr "sista raden är inte nyradsterminerad"
+
+#: parse_manifest.c:657
+#, c-format
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: parse_manifest.c:659
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "kunde inte initiera kontrollsumma för backup-manifest"
+
+#: parse_manifest.c:661
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "kunde inte uppdatera kontrollsumma för backup-manifest"
+
+#: parse_manifest.c:664
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "kunde inte göra klart kontrollsumma för backup-manifest"
+
+#: parse_manifest.c:668
+#, c-format
+msgid "manifest has no checksum"
+msgstr "manifestet har ingen kontrollsumma"
+
+#: parse_manifest.c:672
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "ogiltig kontrollsumma för manifest: \"%s\""
+
+#: parse_manifest.c:676
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "kontrollsumma för manifest matchar inte"
+
+#: parse_manifest.c:691
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "kunde inte parsa backup-manifest: %s"
+
+#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_verifybackup.c:264
+#, c-format
+msgid "no backup directory specified"
+msgstr "ingen backup-katalog angiven"
+
+#: pg_verifybackup.c:274
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_verifybackup.c:297
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\""
+
+#: pg_verifybackup.c:300
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s"
+
+#: pg_verifybackup.c:356
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "korrekt verifierad backup\n"
+
+#: pg_verifybackup.c:382 pg_verifybackup.c:718
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: pg_verifybackup.c:386
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "kunde inte göra stat() på fil \"%s\": %m"
+
+#: pg_verifybackup.c:406 pg_verifybackup.c:747
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "kunde inte läsa fil \"%s\": %m"
+
+#: pg_verifybackup.c:409
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "kunde inte läsa fil \"%s\": läste %d av %lld"
+
+#: pg_verifybackup.c:469
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "duplicerad sökväg i backup-manifest: \"%s\""
+
+#: pg_verifybackup.c:532 pg_verifybackup.c:539
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "kunde inte öppna katalog \"%s\": %m"
+
+#: pg_verifybackup.c:571
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "kunde inte stänga katalog \"%s\": %m"
+
+#: pg_verifybackup.c:591
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "kunde inte ta status på fil eller katalog \"%s\": %m"
+
+#: pg_verifybackup.c:614
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\" är inte en fil eller katalog"
+
+#: pg_verifybackup.c:624
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "\"%s\" finns på disk men är inte i manifestet"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "\"%s\" har storlek %lld på disk men storlek %zu i manifestet"
+
+#: pg_verifybackup.c:663
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "\"%s\" finns i manifestet men inte på disk"
+
+#: pg_verifybackup.c:726
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "kunde inte initiera kontrollsumma för filen \"%s\""
+
+#: pg_verifybackup.c:738
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "kunde inte uppdatera kontrollsumma för filen \"%s\""
+
+#: pg_verifybackup.c:753
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "kunde inte stänga fil \"%s\": %m"
+
+#: pg_verifybackup.c:772
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "filen \"%s\" skall innehålla %zu byte men vi läste %zu byte"
+
+#: pg_verifybackup.c:782
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "kunde inte göra klart kontrollsumma för filen \"%s\""
+
+#: pg_verifybackup.c:790
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "filen \"%s\" har kontrollsumma med längd %d men förväntade %d"
+
+#: pg_verifybackup.c:794
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "kontrollsumman matchar inte för fil \"%s\""
+
+#: pg_verifybackup.c:818
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "WAL-parsning misslyckades för tidslinje %u"
+
+#: pg_verifybackup.c:904
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s verifierar en backup gentemot backup-manifestet.\n"
+"\n"
+
+#: pg_verifybackup.c:905
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"Användning:\n"
+" %s [FLAGGOR]... BACKUPKAT\n"
+"\n"
+
+#: pg_verifybackup.c:906
+#, c-format
+msgid "Options:\n"
+msgstr "Flaggor:\n"
+
+#: pg_verifybackup.c:907
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error avsluta direkt vid fel\n"
+
+#: pg_verifybackup.c:908
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=RELATIV_SÖKVÄG hoppa över angiven sökväg\n"
+
+#: pg_verifybackup.c:909
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=SÖKVÄG använd denna sökväg till manifestet\n"
+
+#: pg_verifybackup.c:910
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal försök inte parsa WAL-filer\n"
+
+#: pg_verifybackup.c:911
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet skriv inte ut några meddelanden förutom fel\n"
+
+#: pg_verifybackup.c:912
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums hoppa över verifiering av kontrollsummor\n"
+
+#: pg_verifybackup.c:913
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=SÖKVÄG använd denna sökväg till WAL-filer\n"
+
+#: pg_verifybackup.c:914
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_verifybackup.c:915
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_verifybackup.c:916
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: pg_verifybackup.c:917
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#, c-format
+#~ msgid ""
+#~ "The program \"%s\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Programmet \"%s\" behövs av %s men hittades inte i samma\n"
+#~ "katalog som \"%s\".\n"
+#~ "Kontrollera din installation."
+
+#, c-format
+#~ msgid ""
+#~ "The program \"%s\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Programmet \"%s\" hittades av \"%s\"\n"
+#~ "men är inte av samma version som %s.\n"
+#~ "Kontrollera din installation."
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Försök med \"%s --help\" för mer information.\n"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatalt: "
diff --git a/src/bin/pg_verifybackup/po/uk.po b/src/bin/pg_verifybackup/po/uk.po
new file mode 100644
index 0000000..6de85a0
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/uk.po
@@ -0,0 +1,491 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:47+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_verifybackup.pot\n"
+"X-Crowdin-File-ID: 928\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередження: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "недостатньо пам'яті\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "неможливо дублювати нульовий покажчик (внутрішня помилка)\n"
+
+#: ../../common/jsonapi.c:1075
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "Неприпустима спеціальна послідовність \"\\%s\"."
+
+#: ../../common/jsonapi.c:1078
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "Символ зі значенням 0x%02x повинен бути пропущений."
+
+#: ../../common/jsonapi.c:1081
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "Очікувався кінець введення, але знайдено \"%s\"."
+
+#: ../../common/jsonapi.c:1084
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "Очікувався елемент масиву або \"]\", але знайдено \"%s\"."
+
+#: ../../common/jsonapi.c:1087
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "Очікувалось \",\" або \"]\", але знайдено \"%s\"."
+
+#: ../../common/jsonapi.c:1090
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "Очікувалось \":\", але знайдено \"%s\"."
+
+#: ../../common/jsonapi.c:1093
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "Очікувалось значення JSON, але знайдено \"%s\"."
+
+#: ../../common/jsonapi.c:1096
+msgid "The input string ended unexpectedly."
+msgstr "Несподіваний кінець вхідного рядка."
+
+#: ../../common/jsonapi.c:1098
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "Очікувався рядок або \"}\", але знайдено \"%s\"."
+
+#: ../../common/jsonapi.c:1101
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "Очікувалось \",\" або \"}\", але знайдено \"%s\"."
+
+#: ../../common/jsonapi.c:1104
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "Очікувався рядок, але знайдено \"%s\"."
+
+#: ../../common/jsonapi.c:1107
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "Неприпустимий маркер \"%s\"."
+
+#: ../../common/jsonapi.c:1110
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 не можна перетворити в текст."
+
+#: ../../common/jsonapi.c:1112
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "За \"\\u\" повинні прямувати чотири шістнадцяткових числа."
+
+#: ../../common/jsonapi.c:1115
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "Значення виходу Unicode не можна використовувати для значень кодових точок більше 007F, якщо кодування не UTF8."
+
+#: ../../common/jsonapi.c:1117
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Старший сурогат Unicode не повинен прямувати за іншим старшим сурогатом."
+
+#: ../../common/jsonapi.c:1119
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Молодший сурогат Unicode не повинен прямувати за іншим молодшим сурогатом."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "помилка парсингу"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "маніфест закінчився несподівано"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "неочікуваний початок об'єкта"
+
+#: parse_manifest.c:224
+msgid "unexpected object end"
+msgstr "неочікуваний кінець об'єкта"
+
+#: parse_manifest.c:251
+msgid "unexpected array start"
+msgstr "неочікуваний початок масиву"
+
+#: parse_manifest.c:274
+msgid "unexpected array end"
+msgstr "неочікуваний кінець масиву"
+
+#: parse_manifest.c:299
+msgid "expected version indicator"
+msgstr "індикатор очікуваної версії"
+
+#: parse_manifest.c:328
+msgid "unrecognized top-level field"
+msgstr "нерозпізнане поле верхнього рівня"
+
+#: parse_manifest.c:347
+msgid "unexpected file field"
+msgstr "неочікуване поле файлу"
+
+#: parse_manifest.c:361
+msgid "unexpected WAL range field"
+msgstr "неочікуване поле діапазону WAL"
+
+#: parse_manifest.c:367
+msgid "unexpected object field"
+msgstr "неочікуване поле об'єкта"
+
+#: parse_manifest.c:397
+msgid "unexpected manifest version"
+msgstr "неочікувана версія маніфесту"
+
+#: parse_manifest.c:448
+msgid "unexpected scalar"
+msgstr "неочікуваний скаляр"
+
+#: parse_manifest.c:472
+msgid "missing path name"
+msgstr "пропущено шлях"
+
+#: parse_manifest.c:475
+msgid "both path name and encoded path name"
+msgstr "і ім'я шляху, і закодований шлях"
+
+#: parse_manifest.c:477
+msgid "missing size"
+msgstr "відсутній розмір"
+
+#: parse_manifest.c:480
+msgid "checksum without algorithm"
+msgstr "контрольна сума без алгоритму"
+
+#: parse_manifest.c:494
+msgid "could not decode file name"
+msgstr "не вдалося декодувати ім'я файлу"
+
+#: parse_manifest.c:504
+msgid "file size is not an integer"
+msgstr "розмір файлу не є цілим числом"
+
+#: parse_manifest.c:510
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "нерозпізнаний алгоритм контрольної суми: \"%s\""
+
+#: parse_manifest.c:529
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "неприпустима контрольна сума для файлу \"%s\": \"%s\""
+
+#: parse_manifest.c:572
+msgid "missing timeline"
+msgstr "відсутня часова шкала"
+
+#: parse_manifest.c:574
+msgid "missing start LSN"
+msgstr "відсутній LSN початку"
+
+#: parse_manifest.c:576
+msgid "missing end LSN"
+msgstr "відсутній LSN кінця"
+
+#: parse_manifest.c:582
+msgid "timeline is not an integer"
+msgstr "часова лінія не є цілим числом"
+
+#: parse_manifest.c:585
+msgid "could not parse start LSN"
+msgstr "не вдалося проаналізувати початковий LSN"
+
+#: parse_manifest.c:588
+msgid "could not parse end LSN"
+msgstr "не вдалося проаналізувати кінцевий LSN"
+
+#: parse_manifest.c:649
+msgid "expected at least 2 lines"
+msgstr "очікувалося принаймні 2 рядки"
+
+#: parse_manifest.c:652
+msgid "last line not newline-terminated"
+msgstr "останній рядок не завершений новим рядком"
+
+#: parse_manifest.c:657
+#, c-format
+msgid "out of memory"
+msgstr "недостатньо пам'яті"
+
+#: parse_manifest.c:659
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "не вдалося ініціалізувати контрольну суму маніфесту"
+
+#: parse_manifest.c:661
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "не вдалося оновити контрольну суму маніфесту"
+
+#: parse_manifest.c:664
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "не вдалося остаточно завершити контрольну суму маніфесту"
+
+#: parse_manifest.c:668
+#, c-format
+msgid "manifest has no checksum"
+msgstr "у маніфесті немає контрольної суми"
+
+#: parse_manifest.c:672
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "неприпустима контрольна сума маніфесту: \"%s\""
+
+#: parse_manifest.c:676
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "невідповідність контрольної суми маніфесту"
+
+#: parse_manifest.c:691
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "не вдалося проаналізувати маніфест резервної копії: %s"
+
+#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" для додаткової інформації."
+
+#: pg_verifybackup.c:264
+#, c-format
+msgid "no backup directory specified"
+msgstr "не вказано папку резервної копії"
+
+#: pg_verifybackup.c:274
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному рядку (перший \"%s\")"
+
+#: pg_verifybackup.c:297
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "програма \"%s\" потрібна для %s, але не знайдена в тому ж каталозі, що й \"%s\""
+
+#: pg_verifybackup.c:300
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "програма \"%s\" знайдена для \"%s\", але має відмінну версію від %s"
+
+#: pg_verifybackup.c:356
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "резервну копію успішно перевірено\n"
+
+#: pg_verifybackup.c:382 pg_verifybackup.c:718
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: pg_verifybackup.c:386
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не вдалося отримати інформацію від файлу \"%s\": %m"
+
+#: pg_verifybackup.c:406 pg_verifybackup.c:745
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не вдалося прочитати файл \"%s\": %m"
+
+#: pg_verifybackup.c:409
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "не вдалося прочитати файл \"%s\": прочитано %d з %lld"
+
+#: pg_verifybackup.c:469
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "дубльований шлях у маніфесті резервного копіювання: \"%s\""
+
+#: pg_verifybackup.c:532 pg_verifybackup.c:539
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не вдалося відкрити каталог \"%s\": %m"
+
+#: pg_verifybackup.c:571
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не вдалося закрити каталог \"%s\": %m"
+
+#: pg_verifybackup.c:591
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "не вдалося отримати інформацію про файл або каталог \"%s\": %m"
+
+#: pg_verifybackup.c:614
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\" не є файлом або каталогом"
+
+#: pg_verifybackup.c:624
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "\"%s\" присутній на диску, але не у маніфесті"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "\"%s\" має розмір %lld на диску, але розмір %zu у маніфесті"
+
+#: pg_verifybackup.c:663
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "\"%s\" присутній у маніфесті, але не на диску"
+
+#: pg_verifybackup.c:726
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "не вдалося ініціалізувати контрольну суму файлу \"%s\""
+
+#: pg_verifybackup.c:738
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "не вдалося оновити контрольну суму файлу \"%s\""
+
+#: pg_verifybackup.c:751
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "неможливо закрити файл \"%s\": %m"
+
+#: pg_verifybackup.c:770
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "файл \"%s\" мусить містити %zu байтів, але прочитано %zu байтів"
+
+#: pg_verifybackup.c:780
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "не вдалося остаточно завершити контрольну суму файлу \"%s\""
+
+#: pg_verifybackup.c:788
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "файл \"%s\" має контрольну суму довжини %d, але очікувалось %d"
+
+#: pg_verifybackup.c:792
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "невідповідність контрольної суми для файлу \"%s\""
+
+#: pg_verifybackup.c:816
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "не вдалося проаналізувати WAL для часової шкали %u"
+
+#: pg_verifybackup.c:902
+#, c-format
+msgid "%s verifies a backup against the backup manifest.\n\n"
+msgstr "%s перевіряє резервну копію відповідно до маніфесту резервного копіювання.\n\n"
+
+#: pg_verifybackup.c:903
+#, c-format
+msgid "Usage:\n"
+" %s [OPTION]... BACKUPDIR\n\n"
+msgstr "Використання:\n"
+" %s [OPTION]... КАТАЛОГ_КОПІЮВАННЯ\n\n"
+
+#: pg_verifybackup.c:904
+#, c-format
+msgid "Options:\n"
+msgstr "Параметри:\n"
+
+#: pg_verifybackup.c:905
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error вийти при помилці\n"
+
+#: pg_verifybackup.c:906
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=RELATIVE_PATH ігнорувати вказаний шлях\n"
+
+#: pg_verifybackup.c:907
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=PATH використовувати вказаний шлях для маніфесту\n"
+
+#: pg_verifybackup.c:908
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal не намагатися аналізувати файли WAL\n"
+
+#: pg_verifybackup.c:909
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet не друкувати жодного виводу, окрім помилок\n"
+
+#: pg_verifybackup.c:910
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums не перевіряти контрольні суми\n"
+
+#: pg_verifybackup.c:911
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=PATH використовувати вказаний шлях для файлів WAL\n"
+
+#: pg_verifybackup.c:912
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію, потім вийти\n"
+
+#: pg_verifybackup.c:913
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: pg_verifybackup.c:914
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"Повідомляти про помилки на <%s>.\n"
+
+#: pg_verifybackup.c:915
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
diff --git a/src/bin/pg_verifybackup/po/zh_CN.po b/src/bin/pg_verifybackup/po/zh_CN.po
new file mode 100644
index 0000000..b7d97c8
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/zh_CN.po
@@ -0,0 +1,494 @@
+# LANGUAGE message translation file for pg_verifybackup
+# Copyright (C) 2020 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# FIRST AUTHOR <zhangjie2@fujitsu.com>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:45+0000\n"
+"PO-Revision-Date: 2021-08-15 16:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的:"
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "内存不足\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "无法复制空指针 (内部错误)\n"
+
+#: ../../common/jsonapi.c:1066
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "转义序列 \"\\%s\" 无效."
+
+#: ../../common/jsonapi.c:1069
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "值为 0x%02x 的字符必须进行转义处理."
+
+#: ../../common/jsonapi.c:1072
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "期望输入结束,结果发现是\"%s\"."
+
+#: ../../common/jsonapi.c:1075
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "期望为数组元素或者\"]\",但发现结果是\"%s\"."
+
+#: ../../common/jsonapi.c:1078
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "期望是\",\" 或 \"]\",但发现结果是\"%s\"."
+
+#: ../../common/jsonapi.c:1081
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "期望得到 \":\",但发现结果是\"%s\"."
+
+#: ../../common/jsonapi.c:1084
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "期望是JSON值, 但结果发现是\"%s\"."
+
+#: ../../common/jsonapi.c:1087
+msgid "The input string ended unexpectedly."
+msgstr "输入字符串意外终止."
+
+#: ../../common/jsonapi.c:1089
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "期望是字符串或\"}\",但发现结果是\"%s\"."
+
+#: ../../common/jsonapi.c:1092
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "期望是 \",\" 或 \"}\",但发现结果是\"%s\"."
+
+#: ../../common/jsonapi.c:1095
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "期望是字符串, 但发现结果是\"%s\"."
+
+#: ../../common/jsonapi.c:1098
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "令牌 \"%s\" 无效."
+
+#: ../../common/jsonapi.c:1101
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000不能被转换为文本。"
+
+#: ../../common/jsonapi.c:1103
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "\"\\u\" 后必须紧跟有效的十六进制数数字"
+
+#: ../../common/jsonapi.c:1106
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "当编码不是UTF8时,大于007F的码位值不能使用Unicode转义值."
+
+#: ../../common/jsonapi.c:1108
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Unicode 的高位代理项不能紧随另一个高位代理项."
+
+#: ../../common/jsonapi.c:1110
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Unicode 代位代理项必须紧随一个高位代理项."
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "清单意外结束"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "意外的对象开始"
+
+#: parse_manifest.c:224
+msgid "unexpected object end"
+msgstr "意外的对象结束"
+
+#: parse_manifest.c:251
+msgid "unexpected array start"
+msgstr "意外的数组开始"
+
+#: parse_manifest.c:274
+msgid "unexpected array end"
+msgstr "意外的数组结束"
+
+#: parse_manifest.c:299
+msgid "expected version indicator"
+msgstr "预期的版本指示器"
+
+#: parse_manifest.c:328
+msgid "unrecognized top-level field"
+msgstr "无法识别的顶层字段"
+
+#: parse_manifest.c:347
+msgid "unexpected file field"
+msgstr "意外的文件字段"
+
+#: parse_manifest.c:361
+msgid "unexpected WAL range field"
+msgstr "意外的WAL范围字段"
+
+#: parse_manifest.c:367
+msgid "unexpected object field"
+msgstr "意外的对象字段"
+
+#: parse_manifest.c:397
+msgid "unexpected manifest version"
+msgstr "意外的清单版本"
+
+#: parse_manifest.c:448
+msgid "unexpected scalar"
+msgstr "意外的标量"
+
+#: parse_manifest.c:472
+msgid "missing path name"
+msgstr "缺少路径名"
+
+#: parse_manifest.c:475
+msgid "both path name and encoded path name"
+msgstr "路径名和编码路径名"
+
+#: parse_manifest.c:477
+msgid "missing size"
+msgstr "缺少大小"
+
+#: parse_manifest.c:480
+msgid "checksum without algorithm"
+msgstr "校验和没有算法"
+
+#: parse_manifest.c:494
+msgid "could not decode file name"
+msgstr "无法解码文件名"
+
+#: parse_manifest.c:504
+msgid "file size is not an integer"
+msgstr "文件大小不是整数"
+
+#: parse_manifest.c:510
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "无法识别的校验和算法: \"%s\""
+
+#: parse_manifest.c:529
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "文件\"%s\"的校验和无效: \"%s\""
+
+#: parse_manifest.c:572
+msgid "missing timeline"
+msgstr "缺少时间线"
+
+#: parse_manifest.c:574
+msgid "missing start LSN"
+msgstr "缺少起始LSN"
+
+#: parse_manifest.c:576
+msgid "missing end LSN"
+msgstr "缺少结束LSN"
+
+#: parse_manifest.c:582
+msgid "timeline is not an integer"
+msgstr "时间线不是整数"
+
+#: parse_manifest.c:585
+msgid "could not parse start LSN"
+msgstr "无法解析起始LSN"
+
+#: parse_manifest.c:588
+msgid "could not parse end LSN"
+msgstr "无法解析结束LSN"
+
+#: parse_manifest.c:649
+msgid "expected at least 2 lines"
+msgstr "至少需要2行"
+
+#: parse_manifest.c:652
+msgid "last line not newline-terminated"
+msgstr "最后一行未以换行符结尾"
+
+#: parse_manifest.c:657
+#, c-format
+msgid "out of memory"
+msgstr "内存不足"
+
+#: parse_manifest.c:659
+msgid "could not initialize checksum of manifest"
+msgstr "无法初始化清单的校验和"
+
+#: parse_manifest.c:661
+msgid "could not update checksum of manifest"
+msgstr "无法更新清单的校验和"
+
+#: parse_manifest.c:664
+msgid "could not finalize checksum of manifest"
+msgstr "无法完成清单的校验和"
+
+#: parse_manifest.c:668
+#, c-format
+msgid "manifest has no checksum"
+msgstr "清单没有校验和"
+
+#: parse_manifest.c:672
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "清单校验和无效: \"%s\""
+
+#: parse_manifest.c:676
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "清单校验和不匹配"
+
+#: parse_manifest.c:691
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "清单校验和不匹配: %s"
+
+#: pg_verifybackup.c:255 pg_verifybackup.c:265 pg_verifybackup.c:277
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获取更多的信息.\n"
+
+#: pg_verifybackup.c:264
+#, c-format
+msgid "no backup directory specified"
+msgstr "未指定备份目录"
+
+#: pg_verifybackup.c:275
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行参数太多 (第一个是 \"%s\")"
+
+#: pg_verifybackup.c:298
+#, c-format
+msgid ""
+"The program \"%s\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation."
+msgstr ""
+"%2$s需要程序\"%1$s\"\n"
+"但在与\"%3$s\"相同的目录中找不到该程序.\n"
+"检查您的安装."
+
+#: pg_verifybackup.c:303
+#, c-format
+msgid ""
+"The program \"%s\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation."
+msgstr ""
+"程序\"%s\"是由\"%s\"找到的\n"
+"但与%s的版本不同.\n"
+"检查您的安装."
+
+#: pg_verifybackup.c:362
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "备份已成功验证\n"
+
+#: pg_verifybackup.c:388 pg_verifybackup.c:724
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "无法打开文件 \"%s\": %m"
+
+#: pg_verifybackup.c:392
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "无法取文件 \"%s\" 的状态: %m"
+
+#: pg_verifybackup.c:412 pg_verifybackup.c:753
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "无法读取文件 \"%s\": %m"
+
+#: pg_verifybackup.c:415
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "无法读取文件\"%1$s\":读取了%3$lld中的%2$d"
+
+#: pg_verifybackup.c:475
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "备份清单中的路径名重复: \"%s\""
+
+#: pg_verifybackup.c:538 pg_verifybackup.c:545
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "无法打开目录 \"%s\": %m"
+
+#: pg_verifybackup.c:577
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "无法关闭目录 \"%s\": %m"
+
+#: pg_verifybackup.c:597
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "无法统计文件或目录\"%s\": %m"
+
+#: pg_verifybackup.c:620
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\"不是文件或目录"
+
+#: pg_verifybackup.c:630
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "磁盘上有\"%s\",但清单中没有"
+
+#: pg_verifybackup.c:642
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "\"%s\"在磁盘上有大小%lld,但在清单中有大小%zu"
+
+#: pg_verifybackup.c:669
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "清单中有\"%s\",但磁盘上没有"
+
+#: pg_verifybackup.c:732
+msgid "could not initialize checksum of file \"%s\""
+msgstr "无法初始化文件\"%s\"的校验和"
+
+#: pg_verifybackup.c:744
+msgid "could not update checksum of file \"%s\""
+msgstr "无法更新文件\"%s\"的校验和"
+
+#: pg_verifybackup.c:759
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "无法关闭文件 \"%s\": %m"
+
+#: pg_verifybackup.c:778
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "文件\"%s\"应包含%zu到字节,但读取到%zu字节"
+
+#: pg_verifybackup.c:788
+msgid "could not finalize checksum of file \"%s\""
+msgstr "无法完成文件\"%s\"的校验和"
+
+#: pg_verifybackup.c:796
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "文件\"%s\"的校验和长度为%d,但应为%d"
+
+#: pg_verifybackup.c:800
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "文件\"%s\"的校验和不匹配"
+
+#: pg_verifybackup.c:824
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "时间线%u的WAL解析失败"
+
+#: pg_verifybackup.c:910
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s 根据备份清单验证备份.\n"
+"\n"
+
+#: pg_verifybackup.c:911
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"用法:\n"
+" %s [选项]... BACKUPDIR\n"
+"\n"
+
+#: pg_verifybackup.c:912
+#, c-format
+msgid "Options:\n"
+msgstr "选项:\n"
+
+#: pg_verifybackup.c:913
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error 出错时立即退出\n"
+
+#: pg_verifybackup.c:914
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=RELATIVE_PATH 忽略指定的路径\n"
+
+#: pg_verifybackup.c:915
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=PATH 使用清单的指定路径\n"
+
+#: pg_verifybackup.c:916
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal 不试图解析WAL文件\n"
+
+#: pg_verifybackup.c:917
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet 不打印任何输出,错误除外\n"
+
+#: pg_verifybackup.c:918
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums 跳过校验和验证\n"
+
+#: pg_verifybackup.c:919
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=PATH 对WAL文件使用指定路径\n"
+
+#: pg_verifybackup.c:920
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信息,然后退出\n"
+
+#: pg_verifybackup.c:921
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助,然后退出\n"
+
+#: pg_verifybackup.c:922
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: pg_verifybackup.c:923
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
diff --git a/src/bin/pg_verifybackup/t/001_basic.pl b/src/bin/pg_verifybackup/t/001_basic.pl
new file mode 100644
index 0000000..16febf9
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/001_basic.pl
@@ -0,0 +1,38 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+program_help_ok('pg_verifybackup');
+program_version_ok('pg_verifybackup');
+program_options_handling_ok('pg_verifybackup');
+
+command_fails_like(
+ ['pg_verifybackup'],
+ qr/no backup directory specified/,
+ 'target directory must be specified');
+command_fails_like(
+ [ 'pg_verifybackup', $tempdir ],
+ qr/could not open file.*\/backup_manifest\"/,
+ 'pg_verifybackup requires a manifest');
+command_fails_like(
+ [ 'pg_verifybackup', $tempdir, $tempdir ],
+ qr/too many command-line arguments/,
+ 'multiple target directories not allowed');
+
+# create fake manifest file
+open(my $fh, '>', "$tempdir/backup_manifest") || die "open: $!";
+close($fh);
+
+# but then try to use an alternate, nonexisting manifest
+command_fails_like(
+ [ 'pg_verifybackup', '-m', "$tempdir/not_the_manifest", $tempdir ],
+ qr/could not open file.*\/not_the_manifest\"/,
+ 'pg_verifybackup respects -m flag');
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/002_algorithm.pl b/src/bin/pg_verifybackup/t/002_algorithm.pl
new file mode 100644
index 0000000..ca2c0f0
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/002_algorithm.pl
@@ -0,0 +1,61 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+# Verify that we can take and verify backups with various checksum types.
+
+use strict;
+use warnings;
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1);
+$primary->start;
+
+for my $algorithm (qw(bogus none crc32c sha224 sha256 sha384 sha512))
+{
+ my $backup_path = $primary->backup_dir . '/' . $algorithm;
+ my @backup = (
+ 'pg_basebackup', '-D', $backup_path,
+ '--manifest-checksums', $algorithm, '--no-sync', '-cfast');
+ my @verify = ('pg_verifybackup', '-e', $backup_path);
+
+ # A backup with a bogus algorithm should fail.
+ if ($algorithm eq 'bogus')
+ {
+ $primary->command_fails(\@backup,
+ "backup fails with algorithm \"$algorithm\"");
+ next;
+ }
+
+ # A backup with a valid algorithm should work.
+ $primary->command_ok(\@backup, "backup ok with algorithm \"$algorithm\"");
+
+ # We expect each real checksum algorithm to be mentioned on every line of
+ # the backup manifest file except the first and last; for simplicity, we
+ # just check that it shows up lots of times. When the checksum algorithm
+ # is none, we just check that the manifest exists.
+ if ($algorithm eq 'none')
+ {
+ ok(-f "$backup_path/backup_manifest", "backup manifest exists");
+ }
+ else
+ {
+ my $manifest = slurp_file("$backup_path/backup_manifest");
+ my $count_of_algorithm_in_manifest =
+ (() = $manifest =~ /$algorithm/mig);
+ cmp_ok($count_of_algorithm_in_manifest,
+ '>', 100, "$algorithm is mentioned many times in the manifest");
+ }
+
+ # Make sure that it verifies OK.
+ $primary->command_ok(\@verify,
+ "verify backup with algorithm \"$algorithm\"");
+
+ # Remove backup immediately to save disk space.
+ rmtree($backup_path);
+}
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/003_corruption.pl b/src/bin/pg_verifybackup/t/003_corruption.pl
new file mode 100644
index 0000000..3dba7d8
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/003_corruption.pl
@@ -0,0 +1,292 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+# Verify that various forms of corruption are detected by pg_verifybackup.
+
+use strict;
+use warnings;
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1);
+$primary->start;
+
+# Include a user-defined tablespace in the hopes of detecting problems in that
+# area.
+my $source_ts_path = PostgreSQL::Test::Utils::tempdir_short();
+my $source_ts_prefix = $source_ts_path;
+$source_ts_prefix =~ s!(^[A-Z]:/[^/]*)/.*!$1!;
+
+$primary->safe_psql('postgres', <<EOM);
+CREATE TABLE x1 (a int);
+INSERT INTO x1 VALUES (111);
+CREATE TABLESPACE ts1 LOCATION '$source_ts_path';
+CREATE TABLE x2 (a int) TABLESPACE ts1;
+INSERT INTO x1 VALUES (222);
+EOM
+
+my @scenario = (
+ {
+ 'name' => 'extra_file',
+ 'mutilate' => \&mutilate_extra_file,
+ 'fails_like' =>
+ qr/extra_file.*present on disk but not in the manifest/
+ },
+ {
+ 'name' => 'extra_tablespace_file',
+ 'mutilate' => \&mutilate_extra_tablespace_file,
+ 'fails_like' =>
+ qr/extra_ts_file.*present on disk but not in the manifest/
+ },
+ {
+ 'name' => 'missing_file',
+ 'mutilate' => \&mutilate_missing_file,
+ 'fails_like' =>
+ qr/pg_xact\/0000.*present in the manifest but not on disk/
+ },
+ {
+ 'name' => 'missing_tablespace',
+ 'mutilate' => \&mutilate_missing_tablespace,
+ 'fails_like' =>
+ qr/pg_tblspc.*present in the manifest but not on disk/
+ },
+ {
+ 'name' => 'append_to_file',
+ 'mutilate' => \&mutilate_append_to_file,
+ 'fails_like' => qr/has size \d+ on disk but size \d+ in the manifest/
+ },
+ {
+ 'name' => 'truncate_file',
+ 'mutilate' => \&mutilate_truncate_file,
+ 'fails_like' => qr/has size 0 on disk but size \d+ in the manifest/
+ },
+ {
+ 'name' => 'replace_file',
+ 'mutilate' => \&mutilate_replace_file,
+ 'fails_like' => qr/checksum mismatch for file/
+ },
+ {
+ 'name' => 'bad_manifest',
+ 'mutilate' => \&mutilate_bad_manifest,
+ 'fails_like' => qr/manifest checksum mismatch/
+ },
+ {
+ 'name' => 'open_file_fails',
+ 'mutilate' => \&mutilate_open_file_fails,
+ 'fails_like' => qr/could not open file/,
+ 'skip_on_windows' => 1
+ },
+ {
+ 'name' => 'open_directory_fails',
+ 'mutilate' => \&mutilate_open_directory_fails,
+ 'cleanup' => \&cleanup_open_directory_fails,
+ 'fails_like' => qr/could not open directory/,
+ 'skip_on_windows' => 1
+ },
+ {
+ 'name' => 'search_directory_fails',
+ 'mutilate' => \&mutilate_search_directory_fails,
+ 'cleanup' => \&cleanup_search_directory_fails,
+ 'fails_like' => qr/could not stat file or directory/,
+ 'skip_on_windows' => 1
+ });
+
+for my $scenario (@scenario)
+{
+ my $name = $scenario->{'name'};
+
+ SKIP:
+ {
+ skip "unix-style permissions not supported on Windows", 4
+ if $scenario->{'skip_on_windows'} && $windows_os;
+
+ # Take a backup and check that it verifies OK.
+ my $backup_path = $primary->backup_dir . '/' . $name;
+ my $backup_ts_path = PostgreSQL::Test::Utils::tempdir_short();
+ # The tablespace map parameter confuses Msys2, which tries to mangle
+ # it. Tell it not to.
+ # See https://www.msys2.org/wiki/Porting/#filesystem-namespaces
+ local $ENV{MSYS2_ARG_CONV_EXCL} = $source_ts_prefix;
+ $primary->command_ok(
+ [
+ 'pg_basebackup', '-D', $backup_path, '--no-sync', '-cfast',
+ '-T', "${source_ts_path}=${backup_ts_path}"
+ ],
+ "base backup ok");
+ command_ok([ 'pg_verifybackup', $backup_path ],
+ "intact backup verified");
+
+ # Mutilate the backup in some way.
+ $scenario->{'mutilate'}->($backup_path);
+
+ # Now check that the backup no longer verifies.
+ command_fails_like(
+ [ 'pg_verifybackup', $backup_path ],
+ $scenario->{'fails_like'},
+ "corrupt backup fails verification: $name");
+
+ # Run cleanup hook, if provided.
+ $scenario->{'cleanup'}->($backup_path)
+ if exists $scenario->{'cleanup'};
+
+ # Finally, use rmtree to reclaim space.
+ rmtree($backup_path);
+ }
+}
+
+sub create_extra_file
+{
+ my ($backup_path, $relative_path) = @_;
+ my $pathname = "$backup_path/$relative_path";
+ open(my $fh, '>', $pathname) || die "open $pathname: $!";
+ print $fh "This is an extra file.\n";
+ close($fh);
+ return;
+}
+
+# Add a file into the root directory of the backup.
+sub mutilate_extra_file
+{
+ my ($backup_path) = @_;
+ create_extra_file($backup_path, "extra_file");
+ return;
+}
+
+# Add a file inside the user-defined tablespace.
+sub mutilate_extra_tablespace_file
+{
+ my ($backup_path) = @_;
+ my ($tsoid) =
+ grep { $_ ne '.' && $_ ne '..' } slurp_dir("$backup_path/pg_tblspc");
+ my ($catvdir) = grep { $_ ne '.' && $_ ne '..' }
+ slurp_dir("$backup_path/pg_tblspc/$tsoid");
+ my ($tsdboid) = grep { $_ ne '.' && $_ ne '..' }
+ slurp_dir("$backup_path/pg_tblspc/$tsoid/$catvdir");
+ create_extra_file($backup_path,
+ "pg_tblspc/$tsoid/$catvdir/$tsdboid/extra_ts_file");
+ return;
+}
+
+# Remove a file.
+sub mutilate_missing_file
+{
+ my ($backup_path) = @_;
+ my $pathname = "$backup_path/pg_xact/0000";
+ unlink($pathname) || die "$pathname: $!";
+ return;
+}
+
+# Remove the symlink to the user-defined tablespace.
+sub mutilate_missing_tablespace
+{
+ my ($backup_path) = @_;
+ my ($tsoid) =
+ grep { $_ ne '.' && $_ ne '..' } slurp_dir("$backup_path/pg_tblspc");
+ my $pathname = "$backup_path/pg_tblspc/$tsoid";
+ if ($windows_os)
+ {
+ # rmdir works on some windows setups, unlink on others.
+ # Instead of trying to implement precise rules, just try one and then
+ # the other.
+ unless (rmdir($pathname))
+ {
+ my $err = $!;
+ unlink($pathname) || die "$pathname: rmdir: $err, unlink: $!";
+ }
+ }
+ else
+ {
+ unlink($pathname) || die "$pathname: $!";
+ }
+ return;
+}
+
+# Append an additional bytes to a file.
+sub mutilate_append_to_file
+{
+ my ($backup_path) = @_;
+ append_to_file "$backup_path/global/pg_control", 'x';
+ return;
+}
+
+# Truncate a file to zero length.
+sub mutilate_truncate_file
+{
+ my ($backup_path) = @_;
+ my $pathname = "$backup_path/global/pg_control";
+ open(my $fh, '>', $pathname) || die "open $pathname: $!";
+ close($fh);
+ return;
+}
+
+# Replace a file's contents without changing the length of the file. This is
+# not a particularly efficient way to do this, so we pick a file that's
+# expected to be short.
+sub mutilate_replace_file
+{
+ my ($backup_path) = @_;
+ my $pathname = "$backup_path/PG_VERSION";
+ my $contents = slurp_file($pathname);
+ open(my $fh, '>', $pathname) || die "open $pathname: $!";
+ print $fh 'q' x length($contents);
+ close($fh);
+ return;
+}
+
+# Corrupt the backup manifest.
+sub mutilate_bad_manifest
+{
+ my ($backup_path) = @_;
+ append_to_file "$backup_path/backup_manifest", "\n";
+ return;
+}
+
+# Create a file that can't be opened. (This is skipped on Windows.)
+sub mutilate_open_file_fails
+{
+ my ($backup_path) = @_;
+ my $pathname = "$backup_path/PG_VERSION";
+ chmod(0, $pathname) || die "chmod $pathname: $!";
+ return;
+}
+
+# Create a directory that can't be opened. (This is skipped on Windows.)
+sub mutilate_open_directory_fails
+{
+ my ($backup_path) = @_;
+ my $pathname = "$backup_path/pg_subtrans";
+ chmod(0, $pathname) || die "chmod $pathname: $!";
+ return;
+}
+
+# restore permissions on the unreadable directory we created.
+sub cleanup_open_directory_fails
+{
+ my ($backup_path) = @_;
+ my $pathname = "$backup_path/pg_subtrans";
+ chmod(0700, $pathname) || die "chmod $pathname: $!";
+ return;
+}
+
+# Create a directory that can't be searched. (This is skipped on Windows.)
+sub mutilate_search_directory_fails
+{
+ my ($backup_path) = @_;
+ my $pathname = "$backup_path/base";
+ chmod(0400, $pathname) || die "chmod $pathname: $!";
+ return;
+}
+
+# rmtree can't cope with a mode 400 directory, so change back to 700.
+sub cleanup_search_directory_fails
+{
+ my ($backup_path) = @_;
+ my $pathname = "$backup_path/base";
+ chmod(0700, $pathname) || die "chmod $pathname: $!";
+ return;
+}
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/004_options.pl b/src/bin/pg_verifybackup/t/004_options.pl
new file mode 100644
index 0000000..8cda66c
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/004_options.pl
@@ -0,0 +1,108 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+# Verify the behavior of assorted pg_verifybackup options.
+
+use strict;
+use warnings;
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+# Start up the server and take a backup.
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1);
+$primary->start;
+my $backup_path = $primary->backup_dir . '/test_options';
+$primary->command_ok(
+ [ 'pg_basebackup', '-D', $backup_path, '--no-sync', '-cfast' ],
+ "base backup ok");
+
+# Verify that pg_verifybackup -q succeeds and produces no output.
+my $stdout;
+my $stderr;
+my $result = IPC::Run::run [ 'pg_verifybackup', '-q', $backup_path ],
+ '>', \$stdout, '2>', \$stderr;
+ok($result, "-q succeeds: exit code 0");
+is($stdout, '', "-q succeeds: no stdout");
+is($stderr, '', "-q succeeds: no stderr");
+
+# Corrupt the PG_VERSION file.
+my $version_pathname = "$backup_path/PG_VERSION";
+my $version_contents = slurp_file($version_pathname);
+open(my $fh, '>', $version_pathname) || die "open $version_pathname: $!";
+print $fh 'q' x length($version_contents);
+close($fh);
+
+# Verify that pg_verifybackup -q now fails.
+command_fails_like(
+ [ 'pg_verifybackup', '-q', $backup_path ],
+ qr/checksum mismatch for file \"PG_VERSION\"/,
+ '-q checksum mismatch');
+
+# Since we didn't change the length of the file, verification should succeed
+# if we ignore checksums. Check that we get the right message, too.
+command_like(
+ [ 'pg_verifybackup', '-s', $backup_path ],
+ qr/backup successfully verified/,
+ '-s skips checksumming');
+
+# Validation should succeed if we ignore the problem file.
+command_like(
+ [ 'pg_verifybackup', '-i', 'PG_VERSION', $backup_path ],
+ qr/backup successfully verified/,
+ '-i ignores problem file');
+
+# PG_VERSION is already corrupt; let's try also removing all of pg_xact.
+rmtree($backup_path . "/pg_xact");
+
+# We're ignoring the problem with PG_VERSION, but not the problem with
+# pg_xact, so verification should fail here.
+command_fails_like(
+ [ 'pg_verifybackup', '-i', 'PG_VERSION', $backup_path ],
+ qr/pg_xact.*is present in the manifest but not on disk/,
+ '-i does not ignore all problems');
+
+# If we use -i twice, we should be able to ignore all of the problems.
+command_like(
+ [ 'pg_verifybackup', '-i', 'PG_VERSION', '-i', 'pg_xact', $backup_path ],
+ qr/backup successfully verified/,
+ 'multiple -i options work');
+
+# Verify that when -i is not used, both problems are reported.
+$result = IPC::Run::run [ 'pg_verifybackup', $backup_path ],
+ '>', \$stdout, '2>', \$stderr;
+ok(!$result, "multiple problems: fails");
+like(
+ $stderr,
+ qr/pg_xact.*is present in the manifest but not on disk/,
+ "multiple problems: missing files reported");
+like(
+ $stderr,
+ qr/checksum mismatch for file \"PG_VERSION\"/,
+ "multiple problems: checksum mismatch reported");
+
+# Verify that when -e is used, only the problem detected first is reported.
+$result = IPC::Run::run [ 'pg_verifybackup', '-e', $backup_path ],
+ '>', \$stdout, '2>', \$stderr;
+ok(!$result, "-e reports 1 error: fails");
+like(
+ $stderr,
+ qr/pg_xact.*is present in the manifest but not on disk/,
+ "-e reports 1 error: missing files reported");
+unlike(
+ $stderr,
+ qr/checksum mismatch for file \"PG_VERSION\"/,
+ "-e reports 1 error: checksum mismatch not reported");
+
+# Test valid manifest with nonexistent backup directory.
+command_fails_like(
+ [
+ 'pg_verifybackup', '-m',
+ "$backup_path/backup_manifest", "$backup_path/fake"
+ ],
+ qr/could not open directory/,
+ 'nonexistent backup directory');
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/005_bad_manifest.pl b/src/bin/pg_verifybackup/t/005_bad_manifest.pl
new file mode 100644
index 0000000..b9573c5
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/005_bad_manifest.pl
@@ -0,0 +1,209 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+# Test the behavior of pg_verifybackup when the backup manifest has
+# problems.
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+test_bad_manifest('input string ended unexpectedly',
+ qr/could not parse backup manifest: parsing failed/, <<EOM);
+{
+EOM
+
+test_parse_error('unexpected object end', <<EOM);
+{}
+EOM
+
+test_parse_error('unexpected array start', <<EOM);
+[]
+EOM
+
+test_parse_error('expected version indicator', <<EOM);
+{"not-expected": 1}
+EOM
+
+test_parse_error('unexpected manifest version', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": "phooey"}
+EOM
+
+test_parse_error('unexpected scalar', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": true}
+EOM
+
+test_parse_error('unrecognized top-level field', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Oops": 1}
+EOM
+
+test_parse_error('unexpected object start', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": {}}
+EOM
+
+test_parse_error('missing path name', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [{}]}
+EOM
+
+test_parse_error('both path name and encoded path name', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Path": "x", "Encoded-Path": "1234"}
+]}
+EOM
+
+test_parse_error('unexpected file field', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Oops": 1}
+]}
+EOM
+
+test_parse_error('missing size', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Path": "x"}
+]}
+EOM
+
+test_parse_error('file size is not an integer', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Path": "x", "Size": "Oops"}
+]}
+EOM
+
+test_parse_error('could not decode file name', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Encoded-Path": "123", "Size": 0}
+]}
+EOM
+
+test_fatal_error('duplicate path name in backup manifest', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Path": "x", "Size": 0},
+ {"Path": "x", "Size": 0}
+]}
+EOM
+
+test_parse_error('checksum without algorithm', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Path": "x", "Size": 100, "Checksum": "Oops"}
+]}
+EOM
+
+test_fatal_error('unrecognized checksum algorithm', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Path": "x", "Size": 100, "Checksum-Algorithm": "Oops", "Checksum": "00"}
+]}
+EOM
+
+test_fatal_error('invalid checksum for file', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Path": "x", "Size": 100, "Checksum-Algorithm": "CRC32C", "Checksum": "0"}
+]}
+EOM
+
+test_parse_error('missing start LSN', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "WAL-Ranges": [
+ {"Timeline": 1}
+]}
+EOM
+
+test_parse_error('missing end LSN', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "WAL-Ranges": [
+ {"Timeline": 1, "Start-LSN": "0/0"}
+]}
+EOM
+
+test_parse_error('unexpected WAL range field', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "WAL-Ranges": [
+ {"Oops": 1}
+]}
+EOM
+
+test_parse_error('missing timeline', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "WAL-Ranges": [
+ {}
+]}
+EOM
+
+test_parse_error('unexpected object end', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "WAL-Ranges": [
+ {"Timeline": 1, "Start-LSN": "0/0", "End-LSN": "0/0"}
+]}
+EOM
+
+test_parse_error('timeline is not an integer', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "WAL-Ranges": [
+ {"Timeline": true, "Start-LSN": "0/0", "End-LSN": "0/0"}
+]}
+EOM
+
+test_parse_error('could not parse start LSN', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "WAL-Ranges": [
+ {"Timeline": 1, "Start-LSN": "oops", "End-LSN": "0/0"}
+]}
+EOM
+
+test_parse_error('could not parse end LSN', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "WAL-Ranges": [
+ {"Timeline": 1, "Start-LSN": "0/0", "End-LSN": "oops"}
+]}
+EOM
+
+test_parse_error('expected at least 2 lines', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [], "Manifest-Checksum": null}
+EOM
+
+my $manifest_without_newline = <<EOM;
+{"PostgreSQL-Backup-Manifest-Version": 1,
+ "Files": [],
+ "Manifest-Checksum": null}
+EOM
+chomp($manifest_without_newline);
+test_parse_error('last line not newline-terminated',
+ $manifest_without_newline);
+
+test_fatal_error('invalid manifest checksum', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [],
+ "Manifest-Checksum": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890-"}
+EOM
+
+sub test_parse_error
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($test_name, $manifest_contents) = @_;
+
+ test_bad_manifest($test_name,
+ qr/could not parse backup manifest: $test_name/,
+ $manifest_contents);
+ return;
+}
+
+sub test_fatal_error
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($test_name, $manifest_contents) = @_;
+
+ test_bad_manifest($test_name, qr/error: $test_name/, $manifest_contents);
+ return;
+}
+
+sub test_bad_manifest
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($test_name, $regexp, $manifest_contents) = @_;
+
+ open(my $fh, '>', "$tempdir/backup_manifest") || die "open: $!";
+ print $fh $manifest_contents;
+ close($fh);
+
+ command_fails_like([ 'pg_verifybackup', $tempdir ], $regexp, $test_name);
+ return;
+}
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/006_encoding.pl b/src/bin/pg_verifybackup/t/006_encoding.pl
new file mode 100644
index 0000000..210f269
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/006_encoding.pl
@@ -0,0 +1,34 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+# Verify that pg_verifybackup handles hex-encoded filenames correctly.
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1);
+$primary->start;
+my $backup_path = $primary->backup_dir . '/test_encoding';
+$primary->command_ok(
+ [
+ 'pg_basebackup', '-D',
+ $backup_path, '--no-sync',
+ '-cfast', '--manifest-force-encode'
+ ],
+ "backup ok with forced hex encoding");
+
+my $manifest = slurp_file("$backup_path/backup_manifest");
+my $count_of_encoded_path_in_manifest = (() = $manifest =~ /Encoded-Path/mig);
+cmp_ok($count_of_encoded_path_in_manifest,
+ '>', 100, "many paths are encoded in the manifest");
+
+command_like(
+ [ 'pg_verifybackup', '-s', $backup_path ],
+ qr/backup successfully verified/,
+ 'backup with forced encoding verified');
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/007_wal.pl b/src/bin/pg_verifybackup/t/007_wal.pl
new file mode 100644
index 0000000..6e9fafc
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/007_wal.pl
@@ -0,0 +1,80 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+# Test pg_verifybackup's WAL verification.
+
+use strict;
+use warnings;
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+# Start up the server and take a backup.
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1);
+$primary->start;
+my $backup_path = $primary->backup_dir . '/test_wal';
+$primary->command_ok(
+ [ 'pg_basebackup', '-D', $backup_path, '--no-sync', '-cfast' ],
+ "base backup ok");
+
+# Rename pg_wal.
+my $original_pg_wal = $backup_path . '/pg_wal';
+my $relocated_pg_wal = $primary->backup_dir . '/relocated_pg_wal';
+rename($original_pg_wal, $relocated_pg_wal) || die "rename pg_wal: $!";
+
+# WAL verification should fail.
+command_fails_like(
+ [ 'pg_verifybackup', $backup_path ],
+ qr/WAL parsing failed for timeline 1/,
+ 'missing pg_wal causes failure');
+
+# Should work if we skip WAL verification.
+command_ok(
+ [ 'pg_verifybackup', '-n', $backup_path ],
+ 'missing pg_wal OK if not verifying WAL');
+
+# Should also work if we specify the correct WAL location.
+command_ok([ 'pg_verifybackup', '-w', $relocated_pg_wal, $backup_path ],
+ '-w can be used to specify WAL directory');
+
+# Move directory back to original location.
+rename($relocated_pg_wal, $original_pg_wal) || die "rename pg_wal back: $!";
+
+# Get a list of files in that directory that look like WAL files.
+my @walfiles = grep { /^[0-9A-F]{24}$/ } slurp_dir($original_pg_wal);
+
+# Replace the contents of one of the files with garbage of equal length.
+my $wal_corruption_target = $original_pg_wal . '/' . $walfiles[0];
+my $wal_size = -s $wal_corruption_target;
+open(my $fh, '>', $wal_corruption_target)
+ || die "open $wal_corruption_target: $!";
+print $fh 'w' x $wal_size;
+close($fh);
+
+# WAL verification should fail.
+command_fails_like(
+ [ 'pg_verifybackup', $backup_path ],
+ qr/WAL parsing failed for timeline 1/,
+ 'corrupt WAL file causes failure');
+
+# Check that WAL-Ranges has correct values with a history file and
+# a timeline > 1. Rather than plugging in a new standby, do a
+# self-promotion of this node.
+$primary->stop;
+$primary->append_conf('standby.signal', '');
+$primary->start;
+$primary->promote;
+$primary->safe_psql('postgres', 'SELECT pg_switch_wal()');
+my $backup_path2 = $primary->backup_dir . '/test_tli';
+# The base backup run below does a checkpoint, that removes the first segment
+# of the current timeline.
+$primary->command_ok(
+ [ 'pg_basebackup', '-D', $backup_path2, '--no-sync', '-cfast' ],
+ "base backup 2 ok");
+command_ok(
+ [ 'pg_verifybackup', $backup_path2 ],
+ 'valid base backup with timeline > 1');
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/008_untar.pl b/src/bin/pg_verifybackup/t/008_untar.pl
new file mode 100644
index 0000000..4c49595
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/008_untar.pl
@@ -0,0 +1,127 @@
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+# This test case aims to verify that server-side backups and server-side
+# backup compression work properly, and it also aims to verify that
+# pg_verifybackup can verify a base backup that didn't start out in plain
+# format.
+
+use strict;
+use warnings;
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1);
+$primary->start;
+
+my $backup_path = $primary->backup_dir . '/server-backup';
+my $extract_path = $primary->backup_dir . '/extracted-backup';
+
+my @test_configuration = (
+ {
+ 'compression_method' => 'none',
+ 'backup_flags' => [],
+ 'backup_archive' => 'base.tar',
+ 'enabled' => 1
+ },
+ {
+ 'compression_method' => 'gzip',
+ 'backup_flags' => [ '--compress', 'server-gzip' ],
+ 'backup_archive' => 'base.tar.gz',
+ 'decompress_program' => $ENV{'GZIP_PROGRAM'},
+ 'decompress_flags' => ['-d'],
+ 'enabled' => check_pg_config("#define HAVE_LIBZ 1")
+ },
+ {
+ 'compression_method' => 'lz4',
+ 'backup_flags' => [ '--compress', 'server-lz4' ],
+ 'backup_archive' => 'base.tar.lz4',
+ 'decompress_program' => $ENV{'LZ4'},
+ 'decompress_flags' => [ '-d', '-m' ],
+ 'enabled' => check_pg_config("#define USE_LZ4 1")
+ },
+ {
+ 'compression_method' => 'zstd',
+ 'backup_flags' => [ '--compress', 'server-zstd' ],
+ 'backup_archive' => 'base.tar.zst',
+ 'decompress_program' => $ENV{'ZSTD'},
+ 'decompress_flags' => ['-d'],
+ 'enabled' => check_pg_config("#define USE_ZSTD 1")
+ });
+
+for my $tc (@test_configuration)
+{
+ my $method = $tc->{'compression_method'};
+
+ SKIP:
+ {
+ skip "$method compression not supported by this build", 3
+ if !$tc->{'enabled'};
+ skip "no decompressor available for $method", 3
+ if exists $tc->{'decompress_program'}
+ && (!defined $tc->{'decompress_program'}
+ || $tc->{'decompress_program'} eq '');
+
+ # Take a server-side backup.
+ my @backup = (
+ 'pg_basebackup', '--no-sync',
+ '-cfast', '--target',
+ "server:$backup_path", '-Xfetch');
+ push @backup, @{ $tc->{'backup_flags'} };
+ $primary->command_ok(\@backup,
+ "server side backup, compression $method");
+
+
+ # Verify that the we got the files we expected.
+ my $backup_files = join(',',
+ sort grep { $_ ne '.' && $_ ne '..' } slurp_dir($backup_path));
+ my $expected_backup_files =
+ join(',', sort ('backup_manifest', $tc->{'backup_archive'}));
+ is($backup_files, $expected_backup_files,
+ "found expected backup files, compression $method");
+
+ # Decompress.
+ if (exists $tc->{'decompress_program'})
+ {
+ my @decompress = ($tc->{'decompress_program'});
+ push @decompress, @{ $tc->{'decompress_flags'} }
+ if $tc->{'decompress_flags'};
+ push @decompress, $backup_path . '/' . $tc->{'backup_archive'};
+ system_or_bail(@decompress);
+ }
+
+ SKIP:
+ {
+ my $tar = $ENV{TAR};
+ # don't check for a working tar here, to accommodate various odd
+ # cases such as AIX. If tar doesn't work the init_from_backup below
+ # will fail.
+ skip "no tar program available", 1
+ if (!defined $tar || $tar eq '');
+
+ # Untar.
+ mkdir($extract_path);
+ system_or_bail($tar, 'xf', $backup_path . '/base.tar',
+ '-C', $extract_path);
+
+ # Verify.
+ $primary->command_ok(
+ [
+ 'pg_verifybackup', '-n',
+ '-m', "$backup_path/backup_manifest",
+ '-e', $extract_path
+ ],
+ "verify backup, compression $method");
+ }
+
+ # Cleanup.
+ unlink($backup_path . '/backup_manifest');
+ unlink($backup_path . '/base.tar');
+ unlink($backup_path . '/' . $tc->{'backup_archive'});
+ rmtree($extract_path);
+ }
+}
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/009_extract.pl b/src/bin/pg_verifybackup/t/009_extract.pl
new file mode 100644
index 0000000..56889e1
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/009_extract.pl
@@ -0,0 +1,97 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+# This test aims to verify that the client can decompress and extract
+# a backup which was compressed by the server.
+
+use strict;
+use warnings;
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1);
+$primary->start;
+
+my @test_configuration = (
+ {
+ 'compression_method' => 'none',
+ 'backup_flags' => [],
+ 'enabled' => 1
+ },
+ {
+ 'compression_method' => 'gzip',
+ 'backup_flags' => [ '--compress', 'server-gzip:5' ],
+ 'enabled' => check_pg_config("#define HAVE_LIBZ 1")
+ },
+ {
+ 'compression_method' => 'lz4',
+ 'backup_flags' => [ '--compress', 'server-lz4:5' ],
+ 'enabled' => check_pg_config("#define USE_LZ4 1")
+ },
+ {
+ 'compression_method' => 'zstd',
+ 'backup_flags' => [ '--compress', 'server-zstd:5' ],
+ 'enabled' => check_pg_config("#define USE_ZSTD 1")
+ },
+ {
+ 'compression_method' => 'parallel zstd',
+ 'backup_flags' => [ '--compress', 'server-zstd:workers=3' ],
+ 'enabled' => check_pg_config("#define USE_ZSTD 1"),
+ 'possibly_unsupported' =>
+ qr/could not set compression worker count to 3: Unsupported parameter/
+ });
+
+for my $tc (@test_configuration)
+{
+ my $backup_path = $primary->backup_dir . '/' . 'extract_backup';
+ my $method = $tc->{'compression_method'};
+
+ SKIP:
+ {
+ skip "$method compression not supported by this build", 2
+ if !$tc->{'enabled'};
+
+ # Take backup with server compression enabled.
+ my @backup = (
+ 'pg_basebackup', '-D', $backup_path,
+ '-Xfetch', '--no-sync', '-cfast', '-Fp');
+ push @backup, @{ $tc->{'backup_flags'} };
+
+ my @verify = ('pg_verifybackup', '-e', $backup_path);
+
+ # A backup with a valid compression method should work.
+ my $backup_stdout = '';
+ my $backup_stderr = '';
+ my $backup_result = $primary->run_log(\@backup, '>', \$backup_stdout,
+ '2>', \$backup_stderr);
+ if ($backup_stdout ne '')
+ {
+ print "# standard output was:\n$backup_stdout";
+ }
+ if ($backup_stderr ne '')
+ {
+ print "# standard error was:\n$backup_stderr";
+ }
+ if ( !$backup_result
+ && $tc->{'possibly_unsupported'}
+ && $backup_stderr =~ /$tc->{'possibly_unsupported'}/)
+ {
+ skip "compression with $method not supported by this build", 2;
+ }
+ else
+ {
+ ok($backup_result, "backup done, compression $method");
+ }
+
+ # Make sure that it verifies OK.
+ $primary->command_ok(\@verify,
+ "backup verified, compression method \"$method\"");
+ }
+
+ # Remove backup immediately to save disk space.
+ rmtree($backup_path);
+}
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/010_client_untar.pl b/src/bin/pg_verifybackup/t/010_client_untar.pl
new file mode 100644
index 0000000..77cb503
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/010_client_untar.pl
@@ -0,0 +1,155 @@
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+# This test case aims to verify that client-side backup compression work
+# properly, and it also aims to verify that pg_verifybackup can verify a base
+# backup that didn't start out in plain format.
+
+use strict;
+use warnings;
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1);
+$primary->start;
+
+my $backup_path = $primary->backup_dir . '/client-backup';
+my $extract_path = $primary->backup_dir . '/extracted-backup';
+
+my @test_configuration = (
+ {
+ 'compression_method' => 'none',
+ 'backup_flags' => [],
+ 'backup_archive' => 'base.tar',
+ 'enabled' => 1
+ },
+ {
+ 'compression_method' => 'gzip',
+ 'backup_flags' => [ '--compress', 'client-gzip:5' ],
+ 'backup_archive' => 'base.tar.gz',
+ 'decompress_program' => $ENV{'GZIP_PROGRAM'},
+ 'decompress_flags' => ['-d'],
+ 'enabled' => check_pg_config("#define HAVE_LIBZ 1")
+ },
+ {
+ 'compression_method' => 'lz4',
+ 'backup_flags' => [ '--compress', 'client-lz4:5' ],
+ 'backup_archive' => 'base.tar.lz4',
+ 'decompress_program' => $ENV{'LZ4'},
+ 'decompress_flags' => ['-d'],
+ 'output_file' => 'base.tar',
+ 'enabled' => check_pg_config("#define USE_LZ4 1")
+ },
+ {
+ 'compression_method' => 'zstd',
+ 'backup_flags' => [ '--compress', 'client-zstd:5' ],
+ 'backup_archive' => 'base.tar.zst',
+ 'decompress_program' => $ENV{'ZSTD'},
+ 'decompress_flags' => ['-d'],
+ 'enabled' => check_pg_config("#define USE_ZSTD 1")
+ },
+ {
+ 'compression_method' => 'parallel zstd',
+ 'backup_flags' => [ '--compress', 'client-zstd:workers=3' ],
+ 'backup_archive' => 'base.tar.zst',
+ 'decompress_program' => $ENV{'ZSTD'},
+ 'decompress_flags' => ['-d'],
+ 'enabled' => check_pg_config("#define USE_ZSTD 1"),
+ 'possibly_unsupported' =>
+ qr/could not set compression worker count to 3: Unsupported parameter/
+ });
+
+for my $tc (@test_configuration)
+{
+ my $method = $tc->{'compression_method'};
+
+ SKIP:
+ {
+ skip "$method compression not supported by this build", 3
+ if !$tc->{'enabled'};
+ skip "no decompressor available for $method", 3
+ if exists $tc->{'decompress_program'}
+ && (!defined $tc->{'decompress_program'}
+ || $tc->{'decompress_program'} eq '');
+
+ # Take a client-side backup.
+ my @backup = (
+ 'pg_basebackup', '-D', $backup_path,
+ '-Xfetch', '--no-sync', '-cfast', '-Ft');
+ push @backup, @{ $tc->{'backup_flags'} };
+ my $backup_stdout = '';
+ my $backup_stderr = '';
+ my $backup_result = $primary->run_log(\@backup, '>', \$backup_stdout,
+ '2>', \$backup_stderr);
+ if ($backup_stdout ne '')
+ {
+ print "# standard output was:\n$backup_stdout";
+ }
+ if ($backup_stderr ne '')
+ {
+ print "# standard error was:\n$backup_stderr";
+ }
+ if ( !$backup_result
+ && $tc->{'possibly_unsupported'}
+ && $backup_stderr =~ /$tc->{'possibly_unsupported'}/)
+ {
+ skip "compression with $method not supported by this build", 3;
+ }
+ else
+ {
+ ok($backup_result, "client side backup, compression $method");
+ }
+
+ # Verify that the we got the files we expected.
+ my $backup_files = join(',',
+ sort grep { $_ ne '.' && $_ ne '..' } slurp_dir($backup_path));
+ my $expected_backup_files =
+ join(',', sort ('backup_manifest', $tc->{'backup_archive'}));
+ is($backup_files, $expected_backup_files,
+ "found expected backup files, compression $method");
+
+ # Decompress.
+ if (exists $tc->{'decompress_program'})
+ {
+ my @decompress = ($tc->{'decompress_program'});
+ push @decompress, @{ $tc->{'decompress_flags'} }
+ if $tc->{'decompress_flags'};
+ push @decompress, $backup_path . '/' . $tc->{'backup_archive'};
+ push @decompress, $backup_path . '/' . $tc->{'output_file'}
+ if $tc->{'output_file'};
+ system_or_bail(@decompress);
+ }
+
+ SKIP:
+ {
+ my $tar = $ENV{TAR};
+ # don't check for a working tar here, to accommodate various odd
+ # cases such as AIX. If tar doesn't work the init_from_backup below
+ # will fail.
+ skip "no tar program available", 1
+ if (!defined $tar || $tar eq '');
+
+ # Untar.
+ mkdir($extract_path);
+ system_or_bail($tar, 'xf', $backup_path . '/base.tar',
+ '-C', $extract_path);
+
+ # Verify.
+ $primary->command_ok(
+ [
+ 'pg_verifybackup', '-n',
+ '-m', "$backup_path/backup_manifest",
+ '-e', $extract_path
+ ],
+ "verify backup, compression $method");
+ }
+
+ # Cleanup.
+ rmtree($extract_path);
+ rmtree($backup_path);
+ }
+}
+
+done_testing();
diff --git a/src/bin/pg_waldump/.gitignore b/src/bin/pg_waldump/.gitignore
new file mode 100644
index 0000000..dc6705f
--- /dev/null
+++ b/src/bin/pg_waldump/.gitignore
@@ -0,0 +1,31 @@
+/pg_waldump
+
+# Source files copied from src/backend/access/rmgrdesc/
+/brindesc.c
+/clogdesc.c
+/committsdesc.c
+/dbasedesc.c
+/genericdesc.c
+/gindesc.c
+/gistdesc.c
+/hashdesc.c
+/heapdesc.c
+/logicalmsgdesc.c
+/mxactdesc.c
+/nbtdesc.c
+/relmapdesc.c
+/replorigindesc.c
+/seqdesc.c
+/smgrdesc.c
+/spgdesc.c
+/standbydesc.c
+/tblspcdesc.c
+/xactdesc.c
+/xlogdesc.c
+
+# Source files copied from src/backend/access/transam/
+/xlogreader.c
+/xlogstats.c
+
+# Generated by test suite
+/tmp_check/
diff --git a/src/bin/pg_waldump/Makefile b/src/bin/pg_waldump/Makefile
new file mode 100644
index 0000000..d6459e1
--- /dev/null
+++ b/src/bin/pg_waldump/Makefile
@@ -0,0 +1,56 @@
+# src/bin/pg_waldump/Makefile
+
+PGFILEDESC = "pg_waldump - decode and display WAL"
+PGAPPICON=win32
+
+subdir = src/bin/pg_waldump
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(RMGRDESCOBJS) \
+ $(WIN32RES) \
+ compat.o \
+ pg_waldump.o \
+ rmgrdesc.o \
+ xlogreader.o \
+ xlogstats.o
+
+override CPPFLAGS := -DFRONTEND $(CPPFLAGS)
+
+RMGRDESCSOURCES = $(sort $(notdir $(wildcard $(top_srcdir)/src/backend/access/rmgrdesc/*desc.c)))
+RMGRDESCOBJS = $(patsubst %.c,%.o,$(RMGRDESCSOURCES))
+
+
+all: pg_waldump
+
+pg_waldump: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+xlogreader.c: % : $(top_srcdir)/src/backend/access/transam/%
+ rm -f $@ && $(LN_S) $< .
+
+xlogstats.c: % : $(top_srcdir)/src/backend/access/transam/%
+ rm -f $@ && $(LN_S) $< .
+
+$(RMGRDESCSOURCES): % : $(top_srcdir)/src/backend/access/rmgrdesc/%
+ rm -f $@ && $(LN_S) $< .
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_waldump$(X) '$(DESTDIR)$(bindir)/pg_waldump$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_waldump$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_waldump$(X) $(OBJS) $(RMGRDESCSOURCES) xlogreader.c xlogstats.c
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_waldump/compat.c b/src/bin/pg_waldump/compat.c
new file mode 100644
index 0000000..6a3386e
--- /dev/null
+++ b/src/bin/pg_waldump/compat.c
@@ -0,0 +1,64 @@
+/*-------------------------------------------------------------------------
+ *
+ * compat.c
+ * Reimplementations of various backend functions.
+ *
+ * Portions Copyright (c) 2013-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_waldump/compat.c
+ *
+ * This file contains client-side implementations for various backend
+ * functions that the rm_desc functions in *desc.c files rely on.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/* ugly hack, same as in e.g pg_controldata */
+#define FRONTEND 1
+#include "postgres.h"
+
+#include <time.h>
+
+#include "utils/datetime.h"
+
+/* copied from timestamp.c */
+pg_time_t
+timestamptz_to_time_t(TimestampTz t)
+{
+ pg_time_t result;
+
+ result = (pg_time_t) (t / USECS_PER_SEC +
+ ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY));
+ return result;
+}
+
+/*
+ * Stopgap implementation of timestamptz_to_str that doesn't depend on backend
+ * infrastructure. This will work for timestamps that are within the range
+ * of the platform time_t type. (pg_time_t is compatible except for possibly
+ * being wider.)
+ *
+ * XXX the return value points to a static buffer, so beware of using more
+ * than one result value concurrently.
+ *
+ * XXX: The backend timestamp infrastructure should instead be split out and
+ * moved into src/common. That's a large project though.
+ */
+const char *
+timestamptz_to_str(TimestampTz dt)
+{
+ static char buf[MAXDATELEN + 1];
+ char ts[MAXDATELEN + 1];
+ char zone[MAXDATELEN + 1];
+ time_t result = (time_t) timestamptz_to_time_t(dt);
+ struct tm *ltime = localtime(&result);
+
+ strftime(ts, sizeof(ts), "%Y-%m-%d %H:%M:%S", ltime);
+ strftime(zone, sizeof(zone), "%Z", ltime);
+
+ snprintf(buf, sizeof(buf), "%s.%06d %s",
+ ts, (int) (dt % USECS_PER_SEC), zone);
+
+ return buf;
+}
diff --git a/src/bin/pg_waldump/nls.mk b/src/bin/pg_waldump/nls.mk
new file mode 100644
index 0000000..c905a00
--- /dev/null
+++ b/src/bin/pg_waldump/nls.mk
@@ -0,0 +1,7 @@
+# src/bin/pg_waldump/nls.mk
+CATALOG_NAME = pg_waldump
+AVAIL_LANGUAGES = de el es fr it ja ka ko ru sv uk
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_waldump.c xlogreader.c xlogstats.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) report_invalid_record:2
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \
+ report_invalid_record:2:c-format
diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c
new file mode 100644
index 0000000..5dc6010
--- /dev/null
+++ b/src/bin/pg_waldump/pg_waldump.c
@@ -0,0 +1,1182 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_waldump.c - decode and display WAL
+ *
+ * Copyright (c) 2013-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_waldump/pg_waldump.c
+ *-------------------------------------------------------------------------
+ */
+
+#define FRONTEND 1
+#include "postgres.h"
+
+#include <dirent.h>
+#include <signal.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "access/transam.h"
+#include "access/xlog_internal.h"
+#include "access/xlogreader.h"
+#include "access/xlogrecord.h"
+#include "access/xlogstats.h"
+#include "common/fe_memutils.h"
+#include "common/logging.h"
+#include "getopt_long.h"
+#include "rmgrdesc.h"
+
+/*
+ * NOTE: For any code change or issue fix here, it is highly recommended to
+ * give a thought about doing the same in pg_walinspect contrib module as well.
+ */
+
+static const char *progname;
+
+static int WalSegSz;
+static volatile sig_atomic_t time_to_stop = false;
+
+static const RelFileNode emptyRelFileNode = {0, 0, 0};
+
+typedef struct XLogDumpPrivate
+{
+ TimeLineID timeline;
+ XLogRecPtr startptr;
+ XLogRecPtr endptr;
+ bool endptr_reached;
+} XLogDumpPrivate;
+
+typedef struct XLogDumpConfig
+{
+ /* display options */
+ bool quiet;
+ bool bkp_details;
+ int stop_after_records;
+ int already_displayed_records;
+ bool follow;
+ bool stats;
+ bool stats_per_record;
+
+ /* filter options */
+ bool filter_by_rmgr[RM_MAX_ID + 1];
+ bool filter_by_rmgr_enabled;
+ TransactionId filter_by_xid;
+ bool filter_by_xid_enabled;
+ RelFileNode filter_by_relation;
+ bool filter_by_extended;
+ bool filter_by_relation_enabled;
+ BlockNumber filter_by_relation_block;
+ bool filter_by_relation_block_enabled;
+ ForkNumber filter_by_relation_forknum;
+ bool filter_by_fpw;
+} XLogDumpConfig;
+
+
+/*
+ * When sigint is called, just tell the system to exit at the next possible
+ * moment.
+ */
+#ifndef WIN32
+
+static void
+sigint_handler(int signum)
+{
+ time_to_stop = true;
+}
+#endif
+
+static void
+print_rmgr_list(void)
+{
+ int i;
+
+ for (i = 0; i <= RM_MAX_BUILTIN_ID; i++)
+ {
+ printf("%s\n", GetRmgrDesc(i)->rm_name);
+ }
+}
+
+/*
+ * Check whether directory exists and whether we can open it. Keep errno set so
+ * that the caller can report errors somewhat more accurately.
+ */
+static bool
+verify_directory(const char *directory)
+{
+ DIR *dir = opendir(directory);
+
+ if (dir == NULL)
+ return false;
+ closedir(dir);
+ return true;
+}
+
+/*
+ * Split a pathname as dirname(1) and basename(1) would.
+ *
+ * XXX this probably doesn't do very well on Windows. We probably need to
+ * apply canonicalize_path(), at the very least.
+ */
+static void
+split_path(const char *path, char **dir, char **fname)
+{
+ char *sep;
+
+ /* split filepath into directory & filename */
+ sep = strrchr(path, '/');
+
+ /* directory path */
+ if (sep != NULL)
+ {
+ *dir = pnstrdup(path, sep - path);
+ *fname = pg_strdup(sep + 1);
+ }
+ /* local directory */
+ else
+ {
+ *dir = NULL;
+ *fname = pg_strdup(path);
+ }
+}
+
+/*
+ * Open the file in the valid target directory.
+ *
+ * return a read only fd
+ */
+static int
+open_file_in_directory(const char *directory, const char *fname)
+{
+ int fd = -1;
+ char fpath[MAXPGPATH];
+
+ Assert(directory != NULL);
+
+ snprintf(fpath, MAXPGPATH, "%s/%s", directory, fname);
+ fd = open(fpath, O_RDONLY | PG_BINARY, 0);
+
+ if (fd < 0 && errno != ENOENT)
+ pg_fatal("could not open file \"%s\": %m", fname);
+ return fd;
+}
+
+/*
+ * Try to find fname in the given directory. Returns true if it is found,
+ * false otherwise. If fname is NULL, search the complete directory for any
+ * file with a valid WAL file name. If file is successfully opened, set the
+ * wal segment size.
+ */
+static bool
+search_directory(const char *directory, const char *fname)
+{
+ int fd = -1;
+ DIR *xldir;
+
+ /* open file if valid filename is provided */
+ if (fname != NULL)
+ fd = open_file_in_directory(directory, fname);
+
+ /*
+ * A valid file name is not passed, so search the complete directory. If
+ * we find any file whose name is a valid WAL file name then try to open
+ * it. If we cannot open it, bail out.
+ */
+ else if ((xldir = opendir(directory)) != NULL)
+ {
+ struct dirent *xlde;
+
+ while ((xlde = readdir(xldir)) != NULL)
+ {
+ if (IsXLogFileName(xlde->d_name))
+ {
+ fd = open_file_in_directory(directory, xlde->d_name);
+ fname = pg_strdup(xlde->d_name);
+ break;
+ }
+ }
+
+ closedir(xldir);
+ }
+
+ /* set WalSegSz if file is successfully opened */
+ if (fd >= 0)
+ {
+ PGAlignedXLogBlock buf;
+ int r;
+
+ r = read(fd, buf.data, XLOG_BLCKSZ);
+ if (r == XLOG_BLCKSZ)
+ {
+ XLogLongPageHeader longhdr = (XLogLongPageHeader) buf.data;
+
+ WalSegSz = longhdr->xlp_seg_size;
+
+ if (!IsValidWalSegSize(WalSegSz))
+ pg_fatal(ngettext("WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte",
+ "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes",
+ WalSegSz),
+ fname, WalSegSz);
+ }
+ else if (r < 0)
+ pg_fatal("could not read file \"%s\": %m",
+ fname);
+ else
+ pg_fatal("could not read file \"%s\": read %d of %d",
+ fname, r, XLOG_BLCKSZ);
+ close(fd);
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * Identify the target directory.
+ *
+ * Try to find the file in several places:
+ * if directory != NULL:
+ * directory /
+ * directory / XLOGDIR /
+ * else
+ * .
+ * XLOGDIR /
+ * $PGDATA / XLOGDIR /
+ *
+ * The valid target directory is returned.
+ */
+static char *
+identify_target_directory(char *directory, char *fname)
+{
+ char fpath[MAXPGPATH];
+
+ if (directory != NULL)
+ {
+ if (search_directory(directory, fname))
+ return pg_strdup(directory);
+
+ /* directory / XLOGDIR */
+ snprintf(fpath, MAXPGPATH, "%s/%s", directory, XLOGDIR);
+ if (search_directory(fpath, fname))
+ return pg_strdup(fpath);
+ }
+ else
+ {
+ const char *datadir;
+
+ /* current directory */
+ if (search_directory(".", fname))
+ return pg_strdup(".");
+ /* XLOGDIR */
+ if (search_directory(XLOGDIR, fname))
+ return pg_strdup(XLOGDIR);
+
+ datadir = getenv("PGDATA");
+ /* $PGDATA / XLOGDIR */
+ if (datadir != NULL)
+ {
+ snprintf(fpath, MAXPGPATH, "%s/%s", datadir, XLOGDIR);
+ if (search_directory(fpath, fname))
+ return pg_strdup(fpath);
+ }
+ }
+
+ /* could not locate WAL file */
+ if (fname)
+ pg_fatal("could not locate WAL file \"%s\"", fname);
+ else
+ pg_fatal("could not find any WAL file");
+
+ return NULL; /* not reached */
+}
+
+/* pg_waldump's XLogReaderRoutine->segment_open callback */
+static void
+WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo,
+ TimeLineID *tli_p)
+{
+ TimeLineID tli = *tli_p;
+ char fname[MAXPGPATH];
+ int tries;
+
+ XLogFileName(fname, tli, nextSegNo, state->segcxt.ws_segsize);
+
+ /*
+ * In follow mode there is a short period of time after the server has
+ * written the end of the previous file before the new file is available.
+ * So we loop for 5 seconds looking for the file to appear before giving
+ * up.
+ */
+ for (tries = 0; tries < 10; tries++)
+ {
+ state->seg.ws_file = open_file_in_directory(state->segcxt.ws_dir, fname);
+ if (state->seg.ws_file >= 0)
+ return;
+ if (errno == ENOENT)
+ {
+ int save_errno = errno;
+
+ /* File not there yet, try again */
+ pg_usleep(500 * 1000);
+
+ errno = save_errno;
+ continue;
+ }
+ /* Any other error, fall through and fail */
+ break;
+ }
+
+ pg_fatal("could not find file \"%s\": %m", fname);
+}
+
+/*
+ * pg_waldump's XLogReaderRoutine->segment_close callback. Same as
+ * wal_segment_close
+ */
+static void
+WALDumpCloseSegment(XLogReaderState *state)
+{
+ close(state->seg.ws_file);
+ /* need to check errno? */
+ state->seg.ws_file = -1;
+}
+
+/* pg_waldump's XLogReaderRoutine->page_read callback */
+static int
+WALDumpReadPage(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen,
+ XLogRecPtr targetPtr, char *readBuff)
+{
+ XLogDumpPrivate *private = state->private_data;
+ int count = XLOG_BLCKSZ;
+ WALReadError errinfo;
+
+ if (private->endptr != InvalidXLogRecPtr)
+ {
+ if (targetPagePtr + XLOG_BLCKSZ <= private->endptr)
+ count = XLOG_BLCKSZ;
+ else if (targetPagePtr + reqLen <= private->endptr)
+ count = private->endptr - targetPagePtr;
+ else
+ {
+ private->endptr_reached = true;
+ return -1;
+ }
+ }
+
+ if (!WALRead(state, readBuff, targetPagePtr, count, private->timeline,
+ &errinfo))
+ {
+ WALOpenSegment *seg = &errinfo.wre_seg;
+ char fname[MAXPGPATH];
+
+ XLogFileName(fname, seg->ws_tli, seg->ws_segno,
+ state->segcxt.ws_segsize);
+
+ if (errinfo.wre_errno != 0)
+ {
+ errno = errinfo.wre_errno;
+ pg_fatal("could not read from file %s, offset %d: %m",
+ fname, errinfo.wre_off);
+ }
+ else
+ pg_fatal("could not read from file %s, offset %d: read %d of %d",
+ fname, errinfo.wre_off, errinfo.wre_read,
+ errinfo.wre_req);
+ }
+
+ return count;
+}
+
+/*
+ * Boolean to return whether the given WAL record matches a specific relation
+ * and optionally block.
+ */
+static bool
+XLogRecordMatchesRelationBlock(XLogReaderState *record,
+ RelFileNode matchRnode,
+ BlockNumber matchBlock,
+ ForkNumber matchFork)
+{
+ int block_id;
+
+ for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++)
+ {
+ RelFileNode rnode;
+ ForkNumber forknum;
+ BlockNumber blk;
+
+ if (!XLogRecGetBlockTagExtended(record, block_id,
+ &rnode, &forknum, &blk, NULL))
+ continue;
+
+ if ((matchFork == InvalidForkNumber || matchFork == forknum) &&
+ (RelFileNodeEquals(matchRnode, emptyRelFileNode) ||
+ RelFileNodeEquals(matchRnode, rnode)) &&
+ (matchBlock == InvalidBlockNumber || matchBlock == blk))
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * Boolean to return whether the given WAL record contains a full page write.
+ */
+static bool
+XLogRecordHasFPW(XLogReaderState *record)
+{
+ int block_id;
+
+ for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++)
+ {
+ if (!XLogRecHasBlockRef(record, block_id))
+ continue;
+
+ if (XLogRecHasBlockImage(record, block_id))
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * Print a record to stdout
+ */
+static void
+XLogDumpDisplayRecord(XLogDumpConfig *config, XLogReaderState *record)
+{
+ const char *id;
+ const RmgrDescData *desc = GetRmgrDesc(XLogRecGetRmid(record));
+ uint32 rec_len;
+ uint32 fpi_len;
+ uint8 info = XLogRecGetInfo(record);
+ XLogRecPtr xl_prev = XLogRecGetPrev(record);
+ StringInfoData s;
+
+ XLogRecGetLen(record, &rec_len, &fpi_len);
+
+ printf("rmgr: %-11s len (rec/tot): %6u/%6u, tx: %10u, lsn: %X/%08X, prev %X/%08X, ",
+ desc->rm_name,
+ rec_len, XLogRecGetTotalLen(record),
+ XLogRecGetXid(record),
+ LSN_FORMAT_ARGS(record->ReadRecPtr),
+ LSN_FORMAT_ARGS(xl_prev));
+
+ id = desc->rm_identify(info);
+ if (id == NULL)
+ printf("desc: UNKNOWN (%x) ", info & ~XLR_INFO_MASK);
+ else
+ printf("desc: %s ", id);
+
+ initStringInfo(&s);
+ desc->rm_desc(&s, record);
+ printf("%s", s.data);
+
+ resetStringInfo(&s);
+ XLogRecGetBlockRefInfo(record, true, config->bkp_details, &s, NULL);
+ printf("%s", s.data);
+ pfree(s.data);
+}
+
+/*
+ * Display a single row of record counts and sizes for an rmgr or record.
+ */
+static void
+XLogDumpStatsRow(const char *name,
+ uint64 n, uint64 total_count,
+ uint64 rec_len, uint64 total_rec_len,
+ uint64 fpi_len, uint64 total_fpi_len,
+ uint64 tot_len, uint64 total_len)
+{
+ double n_pct,
+ rec_len_pct,
+ fpi_len_pct,
+ tot_len_pct;
+
+ n_pct = 0;
+ if (total_count != 0)
+ n_pct = 100 * (double) n / total_count;
+
+ rec_len_pct = 0;
+ if (total_rec_len != 0)
+ rec_len_pct = 100 * (double) rec_len / total_rec_len;
+
+ fpi_len_pct = 0;
+ if (total_fpi_len != 0)
+ fpi_len_pct = 100 * (double) fpi_len / total_fpi_len;
+
+ tot_len_pct = 0;
+ if (total_len != 0)
+ tot_len_pct = 100 * (double) tot_len / total_len;
+
+ printf("%-27s "
+ "%20" INT64_MODIFIER "u (%6.02f) "
+ "%20" INT64_MODIFIER "u (%6.02f) "
+ "%20" INT64_MODIFIER "u (%6.02f) "
+ "%20" INT64_MODIFIER "u (%6.02f)\n",
+ name, n, n_pct, rec_len, rec_len_pct, fpi_len, fpi_len_pct,
+ tot_len, tot_len_pct);
+}
+
+
+/*
+ * Display summary statistics about the records seen so far.
+ */
+static void
+XLogDumpDisplayStats(XLogDumpConfig *config, XLogStats *stats)
+{
+ int ri,
+ rj;
+ uint64 total_count = 0;
+ uint64 total_rec_len = 0;
+ uint64 total_fpi_len = 0;
+ uint64 total_len = 0;
+ double rec_len_pct,
+ fpi_len_pct;
+
+ /*
+ * Leave if no stats have been computed yet, as tracked by the end LSN.
+ */
+ if (XLogRecPtrIsInvalid(stats->endptr))
+ return;
+
+ /*
+ * Each row shows its percentages of the total, so make a first pass to
+ * calculate column totals.
+ */
+
+ for (ri = 0; ri <= RM_MAX_ID; ri++)
+ {
+ if (!RmgrIdIsValid(ri))
+ continue;
+
+ total_count += stats->rmgr_stats[ri].count;
+ total_rec_len += stats->rmgr_stats[ri].rec_len;
+ total_fpi_len += stats->rmgr_stats[ri].fpi_len;
+ }
+ total_len = total_rec_len + total_fpi_len;
+
+ printf("WAL statistics between %X/%X and %X/%X:\n",
+ LSN_FORMAT_ARGS(stats->startptr), LSN_FORMAT_ARGS(stats->endptr));
+
+ /*
+ * 27 is strlen("Transaction/COMMIT_PREPARED"), 20 is strlen(2^64), 8 is
+ * strlen("(100.00%)")
+ */
+
+ printf("%-27s %20s %8s %20s %8s %20s %8s %20s %8s\n"
+ "%-27s %20s %8s %20s %8s %20s %8s %20s %8s\n",
+ "Type", "N", "(%)", "Record size", "(%)", "FPI size", "(%)", "Combined size", "(%)",
+ "----", "-", "---", "-----------", "---", "--------", "---", "-------------", "---");
+
+ for (ri = 0; ri <= RM_MAX_ID; ri++)
+ {
+ uint64 count,
+ rec_len,
+ fpi_len,
+ tot_len;
+ const RmgrDescData *desc;
+
+ if (!RmgrIdIsValid(ri))
+ continue;
+
+ desc = GetRmgrDesc(ri);
+
+ if (!config->stats_per_record)
+ {
+ count = stats->rmgr_stats[ri].count;
+ rec_len = stats->rmgr_stats[ri].rec_len;
+ fpi_len = stats->rmgr_stats[ri].fpi_len;
+ tot_len = rec_len + fpi_len;
+
+ if (RmgrIdIsCustom(ri) && count == 0)
+ continue;
+
+ XLogDumpStatsRow(desc->rm_name,
+ count, total_count, rec_len, total_rec_len,
+ fpi_len, total_fpi_len, tot_len, total_len);
+ }
+ else
+ {
+ for (rj = 0; rj < MAX_XLINFO_TYPES; rj++)
+ {
+ const char *id;
+
+ count = stats->record_stats[ri][rj].count;
+ rec_len = stats->record_stats[ri][rj].rec_len;
+ fpi_len = stats->record_stats[ri][rj].fpi_len;
+ tot_len = rec_len + fpi_len;
+
+ /* Skip undefined combinations and ones that didn't occur */
+ if (count == 0)
+ continue;
+
+ /* the upper four bits in xl_info are the rmgr's */
+ id = desc->rm_identify(rj << 4);
+ if (id == NULL)
+ id = psprintf("UNKNOWN (%x)", rj << 4);
+
+ XLogDumpStatsRow(psprintf("%s/%s", desc->rm_name, id),
+ count, total_count, rec_len, total_rec_len,
+ fpi_len, total_fpi_len, tot_len, total_len);
+ }
+ }
+ }
+
+ printf("%-27s %20s %8s %20s %8s %20s %8s %20s\n",
+ "", "--------", "", "--------", "", "--------", "", "--------");
+
+ /*
+ * The percentages in earlier rows were calculated against the column
+ * total, but the ones that follow are against the row total. Note that
+ * these are displayed with a % symbol to differentiate them from the
+ * earlier ones, and are thus up to 9 characters long.
+ */
+
+ rec_len_pct = 0;
+ if (total_len != 0)
+ rec_len_pct = 100 * (double) total_rec_len / total_len;
+
+ fpi_len_pct = 0;
+ if (total_len != 0)
+ fpi_len_pct = 100 * (double) total_fpi_len / total_len;
+
+ printf("%-27s "
+ "%20" INT64_MODIFIER "u %-9s"
+ "%20" INT64_MODIFIER "u %-9s"
+ "%20" INT64_MODIFIER "u %-9s"
+ "%20" INT64_MODIFIER "u %-6s\n",
+ "Total", stats->count, "",
+ total_rec_len, psprintf("[%.02f%%]", rec_len_pct),
+ total_fpi_len, psprintf("[%.02f%%]", fpi_len_pct),
+ total_len, "[100%]");
+}
+
+static void
+usage(void)
+{
+ printf(_("%s decodes and displays PostgreSQL write-ahead logs for debugging.\n\n"),
+ progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [STARTSEG [ENDSEG]]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -b, --bkp-details output detailed information about backup blocks\n"));
+ printf(_(" -B, --block=N with --relation, only show records that modify block N\n"));
+ printf(_(" -e, --end=RECPTR stop reading at WAL location RECPTR\n"));
+ printf(_(" -f, --follow keep retrying after reaching end of WAL\n"));
+ printf(_(" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+ " valid names are main, fsm, vm, init\n"));
+ printf(_(" -n, --limit=N number of records to display\n"));
+ printf(_(" -p, --path=PATH directory in which to find log segment files or a\n"
+ " directory with a ./pg_wal that contains such files\n"
+ " (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"));
+ printf(_(" -q, --quiet do not print any output, except for errors\n"));
+ printf(_(" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+ " use --rmgr=list to list valid resource manager names\n"));
+ printf(_(" -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"));
+ printf(_(" -s, --start=RECPTR start reading at WAL location RECPTR\n"));
+ printf(_(" -t, --timeline=TLI timeline from which to read log records\n"
+ " (default: 1 or the value used in STARTSEG)\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -w, --fullpage only show records with a full page write\n"));
+ printf(_(" -x, --xid=XID only show records with transaction ID XID\n"));
+ printf(_(" -z, --stats[=record] show statistics instead of records\n"
+ " (optionally, show per-record statistics)\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+int
+main(int argc, char **argv)
+{
+ uint32 xlogid;
+ uint32 xrecoff;
+ XLogReaderState *xlogreader_state;
+ XLogDumpPrivate private;
+ XLogDumpConfig config;
+ XLogStats stats;
+ XLogRecord *record;
+ XLogRecPtr first_record;
+ char *waldir = NULL;
+ char *errormsg;
+
+ static struct option long_options[] = {
+ {"bkp-details", no_argument, NULL, 'b'},
+ {"block", required_argument, NULL, 'B'},
+ {"end", required_argument, NULL, 'e'},
+ {"follow", no_argument, NULL, 'f'},
+ {"fork", required_argument, NULL, 'F'},
+ {"fullpage", no_argument, NULL, 'w'},
+ {"help", no_argument, NULL, '?'},
+ {"limit", required_argument, NULL, 'n'},
+ {"path", required_argument, NULL, 'p'},
+ {"quiet", no_argument, NULL, 'q'},
+ {"relation", required_argument, NULL, 'R'},
+ {"rmgr", required_argument, NULL, 'r'},
+ {"start", required_argument, NULL, 's'},
+ {"timeline", required_argument, NULL, 't'},
+ {"xid", required_argument, NULL, 'x'},
+ {"version", no_argument, NULL, 'V'},
+ {"stats", optional_argument, NULL, 'z'},
+ {NULL, 0, NULL, 0}
+ };
+
+ int option;
+ int optindex = 0;
+
+#ifndef WIN32
+ pqsignal(SIGINT, sigint_handler);
+#endif
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_waldump"));
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_waldump (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ memset(&private, 0, sizeof(XLogDumpPrivate));
+ memset(&config, 0, sizeof(XLogDumpConfig));
+ memset(&stats, 0, sizeof(XLogStats));
+
+ private.timeline = 1;
+ private.startptr = InvalidXLogRecPtr;
+ private.endptr = InvalidXLogRecPtr;
+ private.endptr_reached = false;
+
+ config.quiet = false;
+ config.bkp_details = false;
+ config.stop_after_records = -1;
+ config.already_displayed_records = 0;
+ config.follow = false;
+ /* filter_by_rmgr array was zeroed by memset above */
+ config.filter_by_rmgr_enabled = false;
+ config.filter_by_xid = InvalidTransactionId;
+ config.filter_by_xid_enabled = false;
+ config.filter_by_extended = false;
+ config.filter_by_relation_enabled = false;
+ config.filter_by_relation_block_enabled = false;
+ config.filter_by_relation_forknum = InvalidForkNumber;
+ config.filter_by_fpw = false;
+ config.stats = false;
+ config.stats_per_record = false;
+
+ stats.startptr = InvalidXLogRecPtr;
+ stats.endptr = InvalidXLogRecPtr;
+
+ if (argc <= 1)
+ {
+ pg_log_error("no arguments specified");
+ goto bad_argument;
+ }
+
+ while ((option = getopt_long(argc, argv, "bB:e:fF:n:p:qr:R:s:t:wx:z",
+ long_options, &optindex)) != -1)
+ {
+ switch (option)
+ {
+ case 'b':
+ config.bkp_details = true;
+ break;
+ case 'B':
+ if (sscanf(optarg, "%u", &config.filter_by_relation_block) != 1 ||
+ !BlockNumberIsValid(config.filter_by_relation_block))
+ {
+ pg_log_error("invalid block number: \"%s\"", optarg);
+ goto bad_argument;
+ }
+ config.filter_by_relation_block_enabled = true;
+ config.filter_by_extended = true;
+ break;
+ case 'e':
+ if (sscanf(optarg, "%X/%X", &xlogid, &xrecoff) != 2)
+ {
+ pg_log_error("invalid WAL location: \"%s\"",
+ optarg);
+ goto bad_argument;
+ }
+ private.endptr = (uint64) xlogid << 32 | xrecoff;
+ break;
+ case 'f':
+ config.follow = true;
+ break;
+ case 'F':
+ config.filter_by_relation_forknum = forkname_to_number(optarg);
+ if (config.filter_by_relation_forknum == InvalidForkNumber)
+ {
+ pg_log_error("invalid fork name: \"%s\"", optarg);
+ goto bad_argument;
+ }
+ config.filter_by_extended = true;
+ break;
+ case 'n':
+ if (sscanf(optarg, "%d", &config.stop_after_records) != 1)
+ {
+ pg_log_error("invalid value \"%s\" for option %s", optarg, "-n/--limit");
+ goto bad_argument;
+ }
+ break;
+ case 'p':
+ waldir = pg_strdup(optarg);
+ break;
+ case 'q':
+ config.quiet = true;
+ break;
+ case 'r':
+ {
+ int rmid;
+
+ if (pg_strcasecmp(optarg, "list") == 0)
+ {
+ print_rmgr_list();
+ exit(EXIT_SUCCESS);
+ }
+
+ /*
+ * First look for the generated name of a custom rmgr, of
+ * the form "custom###". We accept this form, because the
+ * custom rmgr module is not loaded, so there's no way to
+ * know the real name. This convention should be
+ * consistent with that in rmgrdesc.c.
+ */
+ if (sscanf(optarg, "custom%03d", &rmid) == 1)
+ {
+ if (!RmgrIdIsCustom(rmid))
+ {
+ pg_log_error("custom resource manager \"%s\" does not exist",
+ optarg);
+ goto bad_argument;
+ }
+ config.filter_by_rmgr[rmid] = true;
+ config.filter_by_rmgr_enabled = true;
+ }
+ else
+ {
+ /* then look for builtin rmgrs */
+ for (rmid = 0; rmid <= RM_MAX_BUILTIN_ID; rmid++)
+ {
+ if (pg_strcasecmp(optarg, GetRmgrDesc(rmid)->rm_name) == 0)
+ {
+ config.filter_by_rmgr[rmid] = true;
+ config.filter_by_rmgr_enabled = true;
+ break;
+ }
+ }
+ if (rmid > RM_MAX_BUILTIN_ID)
+ {
+ pg_log_error("resource manager \"%s\" does not exist",
+ optarg);
+ goto bad_argument;
+ }
+ }
+ }
+ break;
+ case 'R':
+ if (sscanf(optarg, "%u/%u/%u",
+ &config.filter_by_relation.spcNode,
+ &config.filter_by_relation.dbNode,
+ &config.filter_by_relation.relNode) != 3 ||
+ !OidIsValid(config.filter_by_relation.spcNode) ||
+ !OidIsValid(config.filter_by_relation.relNode))
+ {
+ pg_log_error("invalid relation specification: \"%s\"", optarg);
+ pg_log_error_detail("Expecting \"tablespace OID/database OID/relation filenode\".");
+ goto bad_argument;
+ }
+ config.filter_by_relation_enabled = true;
+ config.filter_by_extended = true;
+ break;
+ case 's':
+ if (sscanf(optarg, "%X/%X", &xlogid, &xrecoff) != 2)
+ {
+ pg_log_error("invalid WAL location: \"%s\"",
+ optarg);
+ goto bad_argument;
+ }
+ else
+ private.startptr = (uint64) xlogid << 32 | xrecoff;
+ break;
+ case 't':
+ if (sscanf(optarg, "%u", &private.timeline) != 1)
+ {
+ pg_log_error("invalid timeline specification: \"%s\"", optarg);
+ goto bad_argument;
+ }
+ break;
+ case 'w':
+ config.filter_by_fpw = true;
+ break;
+ case 'x':
+ if (sscanf(optarg, "%u", &config.filter_by_xid) != 1)
+ {
+ pg_log_error("invalid transaction ID specification: \"%s\"",
+ optarg);
+ goto bad_argument;
+ }
+ config.filter_by_xid_enabled = true;
+ break;
+ case 'z':
+ config.stats = true;
+ config.stats_per_record = false;
+ if (optarg)
+ {
+ if (strcmp(optarg, "record") == 0)
+ config.stats_per_record = true;
+ else if (strcmp(optarg, "rmgr") != 0)
+ {
+ pg_log_error("unrecognized value for option %s: %s",
+ "--stats", optarg);
+ goto bad_argument;
+ }
+ }
+ break;
+ default:
+ goto bad_argument;
+ }
+ }
+
+ if (config.filter_by_relation_block_enabled &&
+ !config.filter_by_relation_enabled)
+ {
+ pg_log_error("option %s requires option %s to be specified",
+ "-B/--block", "-R/--relation");
+ goto bad_argument;
+ }
+
+ if ((optind + 2) < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind + 2]);
+ goto bad_argument;
+ }
+
+ if (waldir != NULL)
+ {
+ /* validate path points to directory */
+ if (!verify_directory(waldir))
+ {
+ pg_log_error("could not open directory \"%s\": %m", waldir);
+ goto bad_argument;
+ }
+ }
+
+ /* parse files as start/end boundaries, extract path if not specified */
+ if (optind < argc)
+ {
+ char *directory = NULL;
+ char *fname = NULL;
+ int fd;
+ XLogSegNo segno;
+
+ split_path(argv[optind], &directory, &fname);
+
+ if (waldir == NULL && directory != NULL)
+ {
+ waldir = directory;
+
+ if (!verify_directory(waldir))
+ pg_fatal("could not open directory \"%s\": %m", waldir);
+ }
+
+ waldir = identify_target_directory(waldir, fname);
+ fd = open_file_in_directory(waldir, fname);
+ if (fd < 0)
+ pg_fatal("could not open file \"%s\"", fname);
+ close(fd);
+
+ /* parse position from file */
+ XLogFromFileName(fname, &private.timeline, &segno, WalSegSz);
+
+ if (XLogRecPtrIsInvalid(private.startptr))
+ XLogSegNoOffsetToRecPtr(segno, 0, WalSegSz, private.startptr);
+ else if (!XLByteInSeg(private.startptr, segno, WalSegSz))
+ {
+ pg_log_error("start WAL location %X/%X is not inside file \"%s\"",
+ LSN_FORMAT_ARGS(private.startptr),
+ fname);
+ goto bad_argument;
+ }
+
+ /* no second file specified, set end position */
+ if (!(optind + 1 < argc) && XLogRecPtrIsInvalid(private.endptr))
+ XLogSegNoOffsetToRecPtr(segno + 1, 0, WalSegSz, private.endptr);
+
+ /* parse ENDSEG if passed */
+ if (optind + 1 < argc)
+ {
+ XLogSegNo endsegno;
+
+ /* ignore directory, already have that */
+ split_path(argv[optind + 1], &directory, &fname);
+
+ fd = open_file_in_directory(waldir, fname);
+ if (fd < 0)
+ pg_fatal("could not open file \"%s\"", fname);
+ close(fd);
+
+ /* parse position from file */
+ XLogFromFileName(fname, &private.timeline, &endsegno, WalSegSz);
+
+ if (endsegno < segno)
+ pg_fatal("ENDSEG %s is before STARTSEG %s",
+ argv[optind + 1], argv[optind]);
+
+ if (XLogRecPtrIsInvalid(private.endptr))
+ XLogSegNoOffsetToRecPtr(endsegno + 1, 0, WalSegSz,
+ private.endptr);
+
+ /* set segno to endsegno for check of --end */
+ segno = endsegno;
+ }
+
+
+ if (!XLByteInSeg(private.endptr, segno, WalSegSz) &&
+ private.endptr != (segno + 1) * WalSegSz)
+ {
+ pg_log_error("end WAL location %X/%X is not inside file \"%s\"",
+ LSN_FORMAT_ARGS(private.endptr),
+ argv[argc - 1]);
+ goto bad_argument;
+ }
+ }
+ else
+ waldir = identify_target_directory(waldir, NULL);
+
+ /* we don't know what to print */
+ if (XLogRecPtrIsInvalid(private.startptr))
+ {
+ pg_log_error("no start WAL location given");
+ goto bad_argument;
+ }
+
+ /* done with argument parsing, do the actual work */
+
+ /* we have everything we need, start reading */
+ xlogreader_state =
+ XLogReaderAllocate(WalSegSz, waldir,
+ XL_ROUTINE(.page_read = WALDumpReadPage,
+ .segment_open = WALDumpOpenSegment,
+ .segment_close = WALDumpCloseSegment),
+ &private);
+ if (!xlogreader_state)
+ pg_fatal("out of memory while allocating a WAL reading processor");
+
+ /* first find a valid recptr to start from */
+ first_record = XLogFindNextRecord(xlogreader_state, private.startptr);
+
+ if (first_record == InvalidXLogRecPtr)
+ pg_fatal("could not find a valid record after %X/%X",
+ LSN_FORMAT_ARGS(private.startptr));
+
+ /*
+ * Display a message that we're skipping data if `from` wasn't a pointer
+ * to the start of a record and also wasn't a pointer to the beginning of
+ * a segment (e.g. we were used in file mode).
+ */
+ if (first_record != private.startptr &&
+ XLogSegmentOffset(private.startptr, WalSegSz) != 0)
+ printf(ngettext("first record is after %X/%X, at %X/%X, skipping over %u byte\n",
+ "first record is after %X/%X, at %X/%X, skipping over %u bytes\n",
+ (first_record - private.startptr)),
+ LSN_FORMAT_ARGS(private.startptr),
+ LSN_FORMAT_ARGS(first_record),
+ (uint32) (first_record - private.startptr));
+
+ if (config.stats == true && !config.quiet)
+ stats.startptr = first_record;
+
+ for (;;)
+ {
+ if (time_to_stop)
+ {
+ /* We've been Ctrl-C'ed, so leave */
+ break;
+ }
+
+ /* try to read the next record */
+ record = XLogReadRecord(xlogreader_state, &errormsg);
+ if (!record)
+ {
+ if (!config.follow || private.endptr_reached)
+ break;
+ else
+ {
+ pg_usleep(1000000L); /* 1 second */
+ continue;
+ }
+ }
+
+ /* apply all specified filters */
+ if (config.filter_by_rmgr_enabled &&
+ !config.filter_by_rmgr[record->xl_rmid])
+ continue;
+
+ if (config.filter_by_xid_enabled &&
+ config.filter_by_xid != record->xl_xid)
+ continue;
+
+ /* check for extended filtering */
+ if (config.filter_by_extended &&
+ !XLogRecordMatchesRelationBlock(xlogreader_state,
+ config.filter_by_relation_enabled ?
+ config.filter_by_relation :
+ emptyRelFileNode,
+ config.filter_by_relation_block_enabled ?
+ config.filter_by_relation_block :
+ InvalidBlockNumber,
+ config.filter_by_relation_forknum))
+ continue;
+
+ if (config.filter_by_fpw && !XLogRecordHasFPW(xlogreader_state))
+ continue;
+
+ /* perform any per-record work */
+ if (!config.quiet)
+ {
+ if (config.stats == true)
+ {
+ XLogRecStoreStats(&stats, xlogreader_state);
+ stats.endptr = xlogreader_state->EndRecPtr;
+ }
+ else
+ XLogDumpDisplayRecord(&config, xlogreader_state);
+ }
+
+ /* check whether we printed enough */
+ config.already_displayed_records++;
+ if (config.stop_after_records > 0 &&
+ config.already_displayed_records >= config.stop_after_records)
+ break;
+ }
+
+ if (config.stats == true && !config.quiet)
+ XLogDumpDisplayStats(&config, &stats);
+
+ if (time_to_stop)
+ exit(0);
+
+ if (errormsg)
+ pg_fatal("error in WAL record at %X/%X: %s",
+ LSN_FORMAT_ARGS(xlogreader_state->ReadRecPtr),
+ errormsg);
+
+ XLogReaderFree(xlogreader_state);
+
+ return EXIT_SUCCESS;
+
+bad_argument:
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ return EXIT_FAILURE;
+}
diff --git a/src/bin/pg_waldump/po/de.po b/src/bin/pg_waldump/po/de.po
new file mode 100644
index 0000000..7e3e141
--- /dev/null
+++ b/src/bin/pg_waldump/po/de.po
@@ -0,0 +1,535 @@
+# German message translation file for pg_waldump
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Peter Eisentraut <peter@eisentraut.org>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 04:48+0000\n"
+"PO-Revision-Date: 2022-05-20 10:51+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: pg_waldump.c:160
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: pg_waldump.c:216
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber der Kopf der WAL-Datei »%s« gibt %d Byte an"
+msgstr[1] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber der Kopf der WAL-Datei »%s« gibt %d Bytes an"
+
+#: pg_waldump.c:222
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht lesen: %m"
+
+#: pg_waldump.c:225
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "konnte Datei »%s« nicht lesen: %d von %d gelesen"
+
+#: pg_waldump.c:286
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "konnte WAL-Datei »%s« nicht finden"
+
+#: pg_waldump.c:288
+#, c-format
+msgid "could not find any WAL file"
+msgstr "konnte keine WAL-Datei finden"
+
+#: pg_waldump.c:329
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht finden: %m"
+
+#: pg_waldump.c:378
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "konnte nicht aus Datei %s, Position %d lesen: %m"
+
+#: pg_waldump.c:382
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "konnte nicht aus Datei %s, Position %d lesen: %d von %d gelesen"
+
+#: pg_waldump.c:658
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s dekodiert und zeigt PostgreSQL-Write-Ahead-Logs zum Debuggen.\n"
+"\n"
+
+#: pg_waldump.c:660
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_waldump.c:661
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+
+#: pg_waldump.c:662
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Optionen:\n"
+
+#: pg_waldump.c:663
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details detaillierte Informationen über Backup-Blöcke ausgeben\n"
+
+#: pg_waldump.c:664
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr ""
+" -B, --block=N mit --relation, nur Datensätze zeigen, die Block N\n"
+" modifizieren\n"
+
+#: pg_waldump.c:665
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR bei WAL-Position RECPTR zu lesen aufhören\n"
+
+#: pg_waldump.c:666
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow am Ende des WAL weiter versuchen\n"
+
+#: pg_waldump.c:667
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=FORK nur Datensätze zeigen, die Blöcke in Fork FORK\n"
+" modifizieren; gültige Werte sind main, fsm, vm, init\n"
+
+#: pg_waldump.c:669
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N Anzahl der anzuzeigenden Datensätze\n"
+
+#: pg_waldump.c:670
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find log segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=PATH Verzeichnis mit den Logsegmentdateien oder Verzeichnis\n"
+" mit ./pg_wal mit solchen Dateien (Vorgabe: aktuelles\n"
+" Verzeichnis, ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:673
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet keine Ausgabe, außer Fehler\n"
+
+#: pg_waldump.c:674
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR nur Datensätze erzeugt von Resource-Manager RMGR zeigen;\n"
+" --rmgr=list zeigt gültige Resource-Manager-Namen\n"
+
+#: pg_waldump.c:676
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr ""
+" -R, --relation=T/D/R nur Datensätze zeigen, die Blöcke in Relation T/D/R\n"
+" modifizieren\n"
+
+#: pg_waldump.c:677
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR bei WAL-Position RECPTR zu lesen anfangen\n"
+
+#: pg_waldump.c:678
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read log records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=ZAHL Zeitleiste aus der Datensätze gelesen werden sollen\n"
+" (Vorgabe: 1 oder der in STARTSEG verwendete Wert)\n"
+
+#: pg_waldump.c:680
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_waldump.c:681
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage nur Datensätze mit einem Full-Page-Write zeigen\n"
+
+#: pg_waldump.c:682
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID nur Datensätze mit Transaktions-ID XID zeigen\n"
+
+#: pg_waldump.c:683
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=record] Statistiken statt Datensätzen anzeigen\n"
+" (optional Statistiken pro Datensatz zeigen)\n"
+
+#: pg_waldump.c:685
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_waldump.c:686
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: pg_waldump.c:687
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid "no arguments specified"
+msgstr "keine Argumente angegeben"
+
+#: pg_waldump.c:797
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "ungültige Blocknummer: »%s«"
+
+#: pg_waldump.c:806 pg_waldump.c:904
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "ungültige WAL-Position: »%s«"
+
+#: pg_waldump.c:819
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "ungültiger Fork-Name: »%s«"
+
+#: pg_waldump.c:827
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ungültiger Wert »%s« für Option %s"
+
+#: pg_waldump.c:858
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "Custom-Resouce-Manager »%s« existiert nicht"
+
+#: pg_waldump.c:879
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "Resouce-Manager »%s« existiert nicht"
+
+#: pg_waldump.c:894
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "ungültige Relationsangabe: »%s«"
+
+#: pg_waldump.c:895
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "Erwartet wurde »Tablespace-OID/Datenbank-OID/Relation-Filenode«."
+
+#: pg_waldump.c:914
+#, c-format
+msgid "invalid timeline specification: \"%s\""
+msgstr "ungültige Zeitleistenangabe: »%s«"
+
+#: pg_waldump.c:924
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "ungültige Transaktions-ID-Angabe: »%s«"
+
+#: pg_waldump.c:939
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "unbekannter Wert für Option %s: %s"
+
+#: pg_waldump.c:953
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "Option %s erfordert, dass Option %s angegeben wird"
+
+#: pg_waldump.c:960
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_waldump.c:970 pg_waldump.c:990
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht öffnen: %m"
+
+#: pg_waldump.c:996 pg_waldump.c:1026
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "konnte Datei »%s« nicht öffnen"
+
+#: pg_waldump.c:1006
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "WAL-Startposition %X/%X ist nicht innerhalb der Datei »%s«"
+
+#: pg_waldump.c:1033
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "ENDSEG %s kommt vor STARTSEG %s"
+
+#: pg_waldump.c:1048
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "WAL-Endposition %X/%X ist nicht innerhalb der Datei »%s«"
+
+#: pg_waldump.c:1060
+#, c-format
+msgid "no start WAL location given"
+msgstr "keine WAL-Startposition angegeben"
+
+#: pg_waldump.c:1074
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "Speicher aufgebraucht beim Anlegen eines WAL-Leseprozessors"
+
+#: pg_waldump.c:1080
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "konnte keinen gültigen Datensatz nach %X/%X finden"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "erster Datensatz kommt nach %X/%X, bei %X/%X, %u Byte wurde übersprungen\n"
+msgstr[1] "erster Datensatz kommt nach %X/%X, bei %X/%X, %u Bytes wurden übersprungen\n"
+
+#: pg_waldump.c:1171
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "Fehler in WAL-Eintrag bei %X/%X: %s"
+
+#: pg_waldump.c:1180
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "ungültiger Datensatz-Offset bei %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "Contrecord angefordert von %X/%X"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "ungültige Datensatzlänge bei %X/%X: %u erwartet, %u erhalten"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "Speicher aufgebraucht beim Versuch einen Datensatz mit Länge %u zu dekodieren"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "Datensatzlänge %u bei %X/%X ist zu lang"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "keine Contrecord-Flag bei %X/%X"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "ungültige Contrecord-Länge %u (erwartet %lld) bei %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "Contrecord fehlt bei %X/%X"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ungültige Resource-Manager-ID %u bei %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "Datensatz mit falschem Prev-Link %X/%X bei %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "ungültige Resource-Manager-Datenprüfsumme in Datensatz bei %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "ungültige magische Zahl %04X in Logsegment %s, Offset %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "ungültige Info-Bits %04X in Logsegment %s, Offset %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "WAL-Datei ist von einem anderen Datenbanksystem: Datenbanksystemidentifikator in WAL-Datei ist %llu, Datenbanksystemidentifikator in pg_control ist %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche Segmentgröße im Seitenkopf"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche XLOG_BLCKSZ im Seitenkopf"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "unerwartete Pageaddr %X/%X in Logsegment %s, Offset %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "Zeitleisten-ID %u außer der Reihe (nach %u) in Logsegment %s, Offset %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id %u außer der Reihe bei %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA gesetzt, aber keine Daten enthalten bei %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA nicht gesetzt, aber Datenlänge ist %u bei %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE gesetzt, aber Loch Offset %u Länge %u Block-Abbild-Länge %u bei %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE nicht gesetzt, aber Loch Offset %u Länge %u bei %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge %u bei %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "weder BKPIMAGE_HAS_HOLE noch BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge ist %u bei %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL gesetzt, aber keine vorangehende Relation bei %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "ungültige block_id %u bei %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "Datensatz mit ungültiger Länge bei %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "konnte Backup-Block mit ID %d nicht im WAL-Eintrag finden"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "konnte Abbild bei %X/%X mit ungültigem angegebenen Block %d nicht wiederherstellen"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "konnte Abbild mit ungültigem Zustand bei %X/%X nicht wiederherstellen, Block %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit %s, nicht unterstützt von dieser Installation, Block %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit unbekannter Methode, Block %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "konnte Abbild bei %X/%X nicht dekomprimieren, Block %d"
diff --git a/src/bin/pg_waldump/po/el.po b/src/bin/pg_waldump/po/el.po
new file mode 100644
index 0000000..622c6f2
--- /dev/null
+++ b/src/bin/pg_waldump/po/el.po
@@ -0,0 +1,564 @@
+# Greek message translation file for pg_waldump
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_waldump (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-16 09:47+0000\n"
+"PO-Revision-Date: 2023-04-17 11:17+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "προειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέρεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: pg_waldump.c:160
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %m"
+
+#: pg_waldump.c:216
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "η τιμή του μεγέθους τμήματος WAL πρέπει να ανήκει σε δύναμη του δύο μεταξύ 1 MB και 1 GB, αλλά η κεφαλίδα «%s» του αρχείου WAL καθορίζει %d byte"
+msgstr[1] "η τιμή του μεγέθους τμήματος WAL πρέπει να ανήκει σε δύναμη του δύο μεταξύ 1 MB και 1 GB, αλλά η κεφαλίδα «%s» του αρχείου WAL καθορίζει %d bytes"
+
+#: pg_waldump.c:222
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: %m"
+
+#: pg_waldump.c:225
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: ανέγνωσε %d από %d"
+
+#: pg_waldump.c:286
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "δεν ήταν δυνατός ο εντοπισμός του αρχείου WAL «%s»"
+
+#: pg_waldump.c:288
+#, c-format
+msgid "could not find any WAL file"
+msgstr "δεν ήταν δυνατή η εύρεση οποιουδήποτε αρχείου WAL"
+
+#: pg_waldump.c:329
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εύρεση του αρχείου «%s»: %m"
+
+#: pg_waldump.c:378
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση από αρχείο %s, μετατόπιση %d: %m"
+
+#: pg_waldump.c:382
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "δεν ήταν δυνατή η ανάγνωση από αρχείο %s, μετατόπιση %d: ανέγνωσε %d από %d"
+
+#: pg_waldump.c:658
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s αποκωδικοποιεί και εμφανίζει αρχεία καταγραφής εμπρόσθιας-εγγραφής PostgreSQL για αποσφαλμάτωση.\n"
+"\n"
+
+#: pg_waldump.c:660
+#, c-format
+msgid "Usage:\n"
+msgstr "Χρήση:\n"
+
+#: pg_waldump.c:661
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [STARTSEG [ENDSEG]]\n"
+
+#: pg_waldump.c:662
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Επιλογές:\n"
+
+#: pg_waldump.c:663
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details πάραγε λεπτομερείς πληροφορίες σχετικά με τα μπλοκ αντιγράφων ασφαλείας\n"
+
+#: pg_waldump.c:664
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr " -B, --block=N μαζί με --relation, εμφάνισε μόνο εγγραφές που τροποποιούν το μπλοκ N\n"
+
+#: pg_waldump.c:665
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR σταμάτησε την ανάγνωση στη τοποθεσία WAL RECPTR\n"
+
+#: pg_waldump.c:666
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow εξακολούθησε την προσπάθεια μετά την επίτευξη του τέλους του WAL\n"
+
+#: pg_waldump.c:667
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=FORK εμφάνισε μόνο εγγραφές που τροποποιούν μπλοκ στο fork FORK,\n"
+" έγκυρες ονομασίες είναι main, fsm, vm, init\n"
+
+#: pg_waldump.c:669
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N αριθμός των εγγραφών για εμφάνιση\n"
+
+#: pg_waldump.c:670
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find log segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=PATH κατάλογος στον οποίο βρίσκονται αρχεία τμήματος καταγραφής ή\n"
+" ένα κατάλογο με ./pg_wal που περιέχει τέτοια αρχεία\n"
+" (προεπιλογή: τρέχων κατάλογος, ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:673
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet να μην εκτυπωθεί καμία έξοδος, εκτός από σφάλματα\n"
+
+#: pg_waldump.c:674
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR εμφάνισε μόνο εγγραφές που δημιουργούνται από τον διαχειριστή πόρων RMGR·\n"
+" χρησιμοποίησε --rmgr=list για την παράθεση έγκυρων ονομάτων διαχειριστών πόρων\n"
+
+#: pg_waldump.c:676
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr " -R, --relation=T/D/R εμφάνισε μόνο εγγραφές που τροποποιούν μπλοκ στη σχέση T/D/R\n"
+
+#: pg_waldump.c:677
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR άρχισε την ανάγνωση WAL από την τοποθεσία RECPTR\n"
+
+#: pg_waldump.c:678
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read log records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI χρονογραμή από την οποία να αναγνωστούν εγγραφές καταγραφής\n"
+" (προεπιλογή: 1 ή η τιμή που χρησιμοποιήθηκε στο STARTSEG)\n"
+
+#: pg_waldump.c:680
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_waldump.c:681
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage εμφάνισε μόνο εγγραφές με εγγραφή πλήρους σελίδας\n"
+
+#: pg_waldump.c:682
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID εμφάνισε μόνο εγγραφές με ID συναλλαγής XID\n"
+
+#: pg_waldump.c:683
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=record] εμφάνισε στατιστικά στοιχεία αντί για εγγραφές\n"
+" (προαιρετικά, εμφάνισε στατιστικά στοιχεία ανά εγγραφή)\n"
+
+#: pg_waldump.c:685
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_waldump.c:686
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφορές σφάλματων σε <%s>.\n"
+
+#: pg_waldump.c:687
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αρχική σελίδα: <%s>\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid "no arguments specified"
+msgstr "δεν καθορίστηκαν παράμετροι"
+
+#: pg_waldump.c:797
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "μη έγκυρος αριθμός μπλοκ: «%s»"
+
+#: pg_waldump.c:806 pg_waldump.c:904
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "άκυρη τοποθεσία WAL: «%s»"
+
+#: pg_waldump.c:819
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "μη έγκυρη ονομασία fork «%s»"
+
+#: pg_waldump.c:827
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "μη έγκυρη τιμή «%s» για την επιλογή %s"
+
+#: pg_waldump.c:858
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "ο προσαρμοσμένος διαχειριστής πόρων «%s» δεν υπάρχει"
+
+#: pg_waldump.c:879
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "ο διαχειριστής πόρων «%s» δεν υπάρχει"
+
+#: pg_waldump.c:894
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "μη έγκυρη προδιαγραφή σχέσης: «%s»"
+
+#: pg_waldump.c:895
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "Αναμένει \"tablespace OID/database OID/relation filenode\"."
+
+#: pg_waldump.c:914
+#, c-format
+msgid "invalid timeline specification: \"%s\""
+msgstr "άκυρη προδιαγραφή χρονοδιαγραμμής: «%s»"
+
+#: pg_waldump.c:924
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "μη έγκυρη προδιαγραφή ID συναλλαγής: «%s»"
+
+#: pg_waldump.c:939
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "μη αναγνωρίσιμη τιμή για την επιλογή %s: %s"
+
+#: pg_waldump.c:953
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "η επιλογή %s απαιτεί να έχει καθοριστεί η επιλογή %s"
+
+#: pg_waldump.c:960
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)"
+
+#: pg_waldump.c:970 pg_waldump.c:990
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m"
+
+#: pg_waldump.c:996 pg_waldump.c:1026
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»"
+
+#: pg_waldump.c:1006
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "τοποθεσία εκκίνησης WAL %X/%X δεν βρίσκεται μέσα στο αρχείο «%s»"
+
+#: pg_waldump.c:1033
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "ENDSEG %s βρίσκεται πριν από STARTSEG %s"
+
+#: pg_waldump.c:1048
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "η τελική τοποθεσία WAL %X/%X δεν βρίσκεται μέσα στο αρχείο «%s»"
+
+#: pg_waldump.c:1060
+#, c-format
+msgid "no start WAL location given"
+msgstr "δεν δόθηκε καμία τοποθεσία έναρξης WAL"
+
+#: pg_waldump.c:1074
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "η μνήμη δεν επαρκεί για την εκχώρηση επεξεργαστή ανάγνωσης WAL"
+
+#: pg_waldump.c:1080
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "δεν ήταν δυνατή η εύρεση έγκυρης εγγραφής μετά %X/%X"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "πρώτη εγγραφή βρίσκεται μετά από %X/%X, σε %X/%X, παρακάμπτοντας %u byte\n"
+msgstr[1] "πρώτη εγγραφή βρίσκεται μετά από %X/%X, σε %X/%X, παρακάμπτοντας %u bytes\n"
+
+#: pg_waldump.c:1171
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "σφάλμα στην εγγραφή WAL στο %X/%X: %s"
+
+#: pg_waldump.c:1180
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "μη έγκυρη μετατόπιση εγγραφών σε %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord ζητείται από %X/%X"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "μη έγκυρο μήκος εγγραφής σε %X/%X: χρειαζόταν %u, έλαβε %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "έλλειψη μνήμης κατά την προσπάθεια αποκωδικοποίησης εγγραφής με μήκος %u"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "μήκος εγγραφής %u σε %X/%X πολύ μακρύ"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "δεν υπάρχει σημαία contrecord στο %X/%X"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "μη έγκυρο μήκος contrecord %u (αναμένεται %lld) σε %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "λείπει contrecord στο %X/%X"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "μη έγκυρο ID %u διαχειριστή πόρων στο %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "εγγραφή με εσφαλμένο prev-link %X/%X σε %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "εσφαλμένο άθροισμα ελέγχου δεδομένων διαχειριστή πόρων σε εγγραφή στο %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "μη έγκυρος μαγικός αριθμός %04X στο τμήμα καταγραφής %s, μετατόπιση %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "μη έγκυρα info bits %04X στο τμήμα καταγραφής %s, μετατόπιση %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "WAL αρχείο προέρχεται από διαφορετικό σύστημα βάσης δεδομένων: το WAL αναγνωριστικό συστήματος βάσης δεδομένων αρχείων είναι %llu, το pg_control αναγνωριστικό συστήματος βάσης δεδομένων είναι %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL αρχείο προέρχεται από διαφορετικό σύστημα βάσης δεδομένων: εσφαλμένο μέγεθος τμήματος στην κεφαλίδα σελίδας"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL αρχείο προέρχεται από διαφορετικό σύστημα βάσης δεδομένων: εσφαλμένο XLOG_BLCKSZ στην κεφαλίδα σελίδας"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "μη αναμενόμενο pageaddr %X/%X στο τμήμα καταγραφής %s, μετατόπιση %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "εκτός ακολουθίας ID χρονογραμμής %u (μετά %u) στο τμήμα καταγραφής %s, μετατόπιση %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "εκτός ακολουθίας block_id %u στο %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA έχει οριστεί, αλλά δεν περιλαμβάνονται δεδομένα σε %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA δεν έχει οριστεί, αλλά το μήκος των δεδομένων είναι %u σε %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE έχει οριστεί, αλλά οπή με μετατόπιση %u μήκος %u μήκος μπλοκ εικόνας %u σε %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE δεν έχει οριστεί, αλλά οπή με μετατόπιση %u μήκος %u σε %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_IS_COMPRESSED έχει οριστεί, αλλά μέγεθος μπλοκ εικόνας %u σε %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "ούτε BKPIMAGE_HAS_HOLE ούτε BKPIMAGE_IS_COMPRESSED είναι ορισμένα, αλλά το μήκος της εικόνας μπλοκ είναι %u στο %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL είναι ορισμένο, αλλά καμία προηγούμενη rel στο %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "μη έγκυρο block_id %u στο %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "εγγραφή με μη έγκυρο μήκος στο %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "δεν ήταν δυνατή η εύρεση μπλοκ αντιγράφου με ID %d στην εγγραφή WAL"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "δεν ήταν δυνατή η επαναφορά εικόνας στο %X/%X με ορισμένο άκυρο μπλοκ %d"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "δεν ήταν δυνατή η επαναφορά εικόνας στο %X/%X με άκυρη κατάσταση, μπλοκ %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "δεν ήταν δυνατή η επαναφορά εικόνας σε %X/%X συμπιεσμένη με %s που δεν υποστηρίζεται από την υλοποίηση, μπλοκ %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "δεν ήταν δυνατή η επαναφορά εικόνας σε %X/%X συμπιεσμένη με άγνωστη μέθοδο, μπλοκ %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "δεν ήταν δυνατή η αποσυμπιέση εικόνας στο %X/%X, μπλοκ %d"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες.\n"
+
+#~ msgid "could not parse \"%s\" as a transaction ID"
+#~ msgstr "δεν ήταν δυνατή η ανάλυση του «%s» ως ID συναλλαγής"
+
+#~ msgid "could not parse end WAL location \"%s\""
+#~ msgstr "δεν ήταν δυνατή η ανάλυση της τελικής τοποθεσίας WAL «%s»"
+
+#~ msgid "could not parse limit \"%s\""
+#~ msgstr "δεν ήταν δυνατή η ανάλυση του ορίου «%s»"
+
+#~ msgid "could not parse start WAL location \"%s\""
+#~ msgstr "δεν ήταν δυνατή η ανάλυση της αρχικής τοποθεσίας WAL «%s»"
+
+#~ msgid "could not parse timeline \"%s\""
+#~ msgstr "δεν ήταν δυνατή η ανάλυση της χρονογραμμής «%s»"
+
+#~ msgid "could not read file \"%s\": read %d of %zu"
+#~ msgstr "δεν ήταν δυνατή η ανάγνωση του αρχείου «%s»: ανέγνωσε %d από %zu"
+
+#~ msgid "fatal: "
+#~ msgstr "κρίσιμο: "
+
+#~ msgid "out of memory"
+#~ msgstr "έλλειψη μνήμης"
+
+#~ msgid "unrecognized argument to --stats: %s"
+#~ msgstr "μη αναγνωρισμένη παράμετρος για --stats: %s"
diff --git a/src/bin/pg_waldump/po/es.po b/src/bin/pg_waldump/po/es.po
new file mode 100644
index 0000000..2667b01
--- /dev/null
+++ b/src/bin/pg_waldump/po/es.po
@@ -0,0 +1,536 @@
+# Spanish message translation file for pg_waldump
+#
+# Copyright (c) 2017-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Carlos Chapi <carlos.chapi@2ndquadrant.com>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:47+0000\n"
+"PO-Revision-Date: 2022-11-04 13:17+0100\n"
+"Last-Translator: Carlos Chapi <carlos.chapi@2ndquadrant.com>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.2\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: pg_waldump.c:160
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: pg_waldump.c:216
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "el tamaño de segmento WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero la cabecera del archivo WAL «%s» especifica %d byte"
+msgstr[1] "el tamaño de segmento WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero la cabecera del archivo WAL «%s» especifica %d bytes"
+
+#: pg_waldump.c:222
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "no se pudo leer el archivo «%s»: %m"
+
+#: pg_waldump.c:225
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "no se pudo leer el archivo «%s»: leídos %d de %d"
+
+#: pg_waldump.c:286
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "no se pudo ubicar el archivo WAL «%s»"
+
+#: pg_waldump.c:288
+#, c-format
+msgid "could not find any WAL file"
+msgstr "no se pudo encontrar ningún archivo WAL"
+
+#: pg_waldump.c:329
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "no se pudo encontrar el archivo «%s»: %m"
+
+#: pg_waldump.c:378
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "no se pudo leer desde el archivo «%s» en la posición %d: %m"
+
+#: pg_waldump.c:382
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "no se pudo leer del archivo %s, posición %d: leídos %d de %d"
+
+#: pg_waldump.c:658
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s decodifica y muestra segmentos de WAL de PostgreSQL para depuración.\n"
+"\n"
+
+#: pg_waldump.c:660
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_waldump.c:661
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [OPCIÓN]... [SEGINICIAL [SEGFINAL]]\n"
+
+#: pg_waldump.c:662
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opciones:\n"
+
+#: pg_waldump.c:663
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details mostrar información detallada sobre bloques de respaldo\n"
+
+#: pg_waldump.c:664
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr ""
+" -B, --block=N con --relation, sólo mostrar registros que modifican\n"
+" el bloque N\n"
+
+#: pg_waldump.c:665
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR detener la lectura del WAL en la posición RECPTR\n"
+
+#: pg_waldump.c:666
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow seguir reintentando después de alcanzar el final del WAL\n"
+
+#: pg_waldump.c:667
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --form=FORK sólo mostrar registros que modifican bloques en el\n"
+" «fork» FORK; nombres válidos son main, fsm, vm, init\n"
+
+#: pg_waldump.c:669
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N número de registros a mostrar\n"
+
+#: pg_waldump.c:670
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find log segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=RUTA directorio donde buscar los archivos de segmento de WAL\n"
+" o un directorio con un ./pg_wal que contenga tales archivos\n"
+" (por omisión: directorio actual, ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:673
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet no escribir ningún mensaje, excepto errores\n"
+
+#: pg_waldump.c:674
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=GREC sólo mostrar registros generados por el gestor de\n"
+" recursos GREC; use --rmgr=list para listar nombres válidos\n"
+
+#: pg_waldump.c:676
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr " -R, --relation=T/D/R sólo mostrar registros que modifican bloques en relación T/D/R\n"
+
+#: pg_waldump.c:677
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR empezar a leer el WAL en la posición RECPTR\n"
+
+#: pg_waldump.c:678
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read log records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI timeline del cual leer los registros de WAL\n"
+" (por omisión: 1 o el valor usado en SEGINICIAL)\n"
+
+#: pg_waldump.c:680
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión, luego salir\n"
+
+#: pg_waldump.c:681
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage sólo mostrar registros con escrituras de página completa\n"
+
+#: pg_waldump.c:682
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID sólo mostrar registros con el id de transacción XID\n"
+
+#: pg_waldump.c:683
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=registro] mostrar estadísticas en lugar de registros\n"
+" (opcionalmente, mostrar estadísticas por registro)\n"
+
+#: pg_waldump.c:685
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda, luego salir\n"
+
+#: pg_waldump.c:686
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: pg_waldump.c:687
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid "no arguments specified"
+msgstr "no se especificó ningún argumento"
+
+#: pg_waldump.c:797
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "número de bloque no válido: «%s»"
+
+#: pg_waldump.c:806 pg_waldump.c:904
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "ubicación de WAL no válida: «%s»"
+
+#: pg_waldump.c:819
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "nombre de «fork» no válido: «%s»"
+
+#: pg_waldump.c:827
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "el valor «%s» no es válido para la opción «%s»"
+
+#: pg_waldump.c:858
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "el gestor de recursos personalizado «%s» no existe"
+
+#: pg_waldump.c:879
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "el gestor de recursos «%s» no existe"
+
+#: pg_waldump.c:894
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "especificación de relación no válida: «%s»"
+
+#: pg_waldump.c:895
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "Se esperaba «OID de tablespace/OID de base de datos/filenode de relación»."
+
+#: pg_waldump.c:914
+#, c-format
+msgid "invalid timeline specification: \"%s\""
+msgstr "especificación de timeline no válida: «%s»"
+
+#: pg_waldump.c:924
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "especificación de ID de transacción no válida: «%s»"
+
+#: pg_waldump.c:939
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "valor no reconocido para la opción %s: %s"
+
+#: pg_waldump.c:953
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "la opción %s requiere que se especifique la opción %s"
+
+#: pg_waldump.c:960
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_waldump.c:970 pg_waldump.c:990
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_waldump.c:996 pg_waldump.c:1026
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "no se pudo abrir el archivo «%s»"
+
+#: pg_waldump.c:1006
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "la posición inicial de WAL %X/%X no está en el archivo «%s»"
+
+#: pg_waldump.c:1033
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "SEGFINAL %s está antes del SEGINICIAL %s"
+
+#: pg_waldump.c:1048
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "la posición final de WAL %X/%X no está en el archivo «%s»"
+
+#: pg_waldump.c:1060
+#, c-format
+msgid "no start WAL location given"
+msgstr "no se especificó posición inicial de WAL"
+
+#: pg_waldump.c:1074
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "se agotó la memoria mientras se emplazaba un procesador de lectura de WAL"
+
+#: pg_waldump.c:1080
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "no se pudo encontrar un registro válido después de %X/%X"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "el primer registro está ubicado después de %X/%X, en %X/%X, saltándose %u byte\n"
+msgstr[1] "el primer registro está ubicado después de %X/%X, en %X/%X, saltándose %u bytes\n"
+
+#: pg_waldump.c:1171
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "error en registro de WAL en %X/%X: %s"
+
+#: pg_waldump.c:1180
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "posición de registro no válida en %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord solicitado por %X/%X"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "largo de registro no válido en %X/%X: se esperaba %u, se obtuvo %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "memoria agotada mientras se intentaba decodificar un registro de largo %u"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "largo de registro %u en %X/%X demasiado largo"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "no hay bandera de contrecord en %X/%X"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "largo de contrecord %u no válido (se esperaba %lld) en %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "falta contrecord en %X/%X"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ID de gestor de recursos %u no válido en %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "registro con prev-link %X/%X incorrecto en %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "suma de verificación de los datos del gestor de recursos incorrecta en el registro en %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "número mágico %04X no válido en archivo %s, posición %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "info bits %04X no válidos en archivo %s, posición %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "archivo WAL es de un sistema de bases de datos distinto: identificador de sistema en archivo WAL es %llu, identificador en pg_control es %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "archivo WAL es de un sistema de bases de datos distinto: tamaño de segmento incorrecto en cabecera de paǵina"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "archivo WAL es de un sistema de bases de datos distinto: XLOG_BLCKSZ incorrecto en cabecera de paǵina"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "pageaddr %X/%X inesperado en archivo %s, posición %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "ID de timeline %u fuera de secuencia (después de %u) en archivo %s, posición %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id %u fuera de orden en %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA está definido, pero no hay datos en %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA no está definido, pero el largo de los datos es %u en %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE está definido, pero posición del agujero es %u largo %u largo de imagen %u en %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE no está definido, pero posición del agujero es %u largo %u en %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED definido, pero largo de imagen de bloque es %u en %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_COMPRESSED están definidos, pero el largo de imagen de bloque es %u en %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL está definido, pero no hay «rel» anterior en %X/%X "
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "block_id %u no válido en %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "registro con largo no válido en %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "no se pudo localizar un bloque de respaldo con ID %d en el registro WAL"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "no se pudo restaurar imagen en %X/%X con bloque especificado %d no válido"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "no se pudo restaurar imagen en %X/%X con estado no válido, bloque %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "no se pudo restaurar imagen en %X/%X comprimida con %s no soportado por esta instalación, bloque %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "no se pudo restaurar imagen en %X/%X comprimida método desconocido, bloque %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "no se pudo descomprimir imagen en %X/%X, bloque %d"
diff --git a/src/bin/pg_waldump/po/fr.po b/src/bin/pg_waldump/po/fr.po
new file mode 100644
index 0000000..7ce5d92
--- /dev/null
+++ b/src/bin/pg_waldump/po/fr.po
@@ -0,0 +1,646 @@
+# LANGUAGE message translation file for pg_waldump
+# Copyright (C) 2017-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_waldump (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2017-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:17+0000\n"
+"PO-Revision-Date: 2022-09-26 14:37+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: pg_waldump.c:160
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: pg_waldump.c:216
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "La taille du segment WAL doit être une puissance de deux entre 1 Mo et 1 Go, mais l'en-tête du fichier WAL « %s » indique %d octet"
+msgstr[1] "La taille du segment WAL doit être une puissance de deux entre 1 Mo et 1 Go, mais l'en-tête du fichier WAL « %s » indique %d octets"
+
+#: pg_waldump.c:222
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "n'a pas pu lire le fichier « %s » : %m"
+
+#: pg_waldump.c:225
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %d"
+
+#: pg_waldump.c:286
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "n'a pas pu trouver le fichier WAL « %s »"
+
+#: pg_waldump.c:288
+#, c-format
+msgid "could not find any WAL file"
+msgstr "n'a pas pu trouver un seul fichier WAL"
+
+#: pg_waldump.c:329
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "n'a pas pu trouver le fichier « %s » : %m"
+
+#: pg_waldump.c:378
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "n'a pas pu lire à partir du fichier %s, décalage %d : %m"
+
+#: pg_waldump.c:382
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "n'a pas pu lire à partir du fichier %s, décalage %d : %d lu sur %d"
+
+#: pg_waldump.c:658
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s décode et affiche les journaux de transactions PostgreSQL pour du\n"
+"débogage.\n"
+"\n"
+
+#: pg_waldump.c:660
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_waldump.c:661
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [OPTION]... [SEG_DEBUT [SEG_FIN]]\n"
+
+#: pg_waldump.c:662
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options :\n"
+
+#: pg_waldump.c:663
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr ""
+" -b, --bkp-details affiche des informations détaillées sur les\n"
+" blocs de sauvegarde\n"
+
+#: pg_waldump.c:664
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr ""
+" -B, --block=N avec --relation, affiche seulement les enregistrements\n"
+" qui modifient le bloc N\n"
+
+#: pg_waldump.c:665
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr ""
+" -e, --end=RECPTR arrête la lecture des journaux de transactions à\n"
+" l'emplacement RECPTR\n"
+
+#: pg_waldump.c:666
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr ""
+" -f, --follow continue après avoir atteint la fin des journaux\n"
+" de transactions\n"
+
+#: pg_waldump.c:667
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=FORK affiche seulement les enregistrements qui modifient\n"
+" des blocs dans le fork FORK ;\n"
+" les noms valides sont main, fsm, vm, init\n"
+
+#: pg_waldump.c:669
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N nombre d'enregistrements à afficher\n"
+
+#: pg_waldump.c:670
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find log segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=CHEMIN répertoire où trouver les fichiers des segments\n"
+" de journaux de transactions ou un répertoire\n"
+" avec ./pg_wal qui contient ces fichiers (par\n"
+" défaut : répertoire courant, ./pg_wal,\n"
+" $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:673
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet n'écrit aucun message, sauf en cas d'erreur\n"
+
+#: pg_waldump.c:674
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR affiche seulement les enregistrements générés\n"
+" par le gestionnaire de ressources RMGR, utilisez\n"
+" --rmgr=list pour avoir une liste des noms valides\n"
+" de gestionnaires de ressources\n"
+
+#: pg_waldump.c:676
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr ""
+" -R, --relation=T/D/R affiche seulement les enregistrements qui modifient\n"
+" les blocs de la relation T/D/R\n"
+
+#: pg_waldump.c:677
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr ""
+" -s, --start=RECPTR commence à lire à l'emplacement RECPTR des\n"
+" journaux de transactions\n"
+
+#: pg_waldump.c:678
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read log records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI timeline à partir de laquelle lire les\n"
+" enregistrements des journaux (par défaut: 1 ou\n"
+" la valeur utilisée dans SEG_DÉBUT)\n"
+
+#: pg_waldump.c:680
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_waldump.c:681
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr ""
+" -w, --fullpage affiche seulement les enregistrements avec\n"
+" un bloc complet (FPW)\n"
+
+#: pg_waldump.c:682
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr ""
+" -x, --xid=XID affiche seulement des enregistrements avec\n"
+" l'identifiant de transaction XID\n"
+
+#: pg_waldump.c:683
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=enregistrement] affiche des statistiques à la place\n"
+" d'enregistrements (en option, affiche des\n"
+" statistiques par enregistrement)\n"
+
+#: pg_waldump.c:685
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_waldump.c:686
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: pg_waldump.c:687
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil %s : <%s>\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid "no arguments specified"
+msgstr "aucun argument spécifié"
+
+#: pg_waldump.c:797
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "numéro de bloc invalide : « %s »"
+
+#: pg_waldump.c:806 pg_waldump.c:904
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "emplacement WAL invalide : « %s »"
+
+#: pg_waldump.c:819
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "nom du fork invalide : « %s »"
+
+#: pg_waldump.c:827
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valeur « %s » invalide pour l'option %s"
+
+#: pg_waldump.c:858
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "le gestionnaire de ressources personnalisé « %s » n'existe pas"
+
+#: pg_waldump.c:879
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "le gestionnaire de ressources « %s » n'existe pas"
+
+#: pg_waldump.c:894
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "spécification de relation invalide : « %s »"
+
+#: pg_waldump.c:895
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "Attendait « OID tablespace/OID base/filenode relation »."
+
+#: pg_waldump.c:914
+#, c-format
+msgid "invalid timeline specification: \"%s\""
+msgstr "spécification de timeline invalide : « %s »"
+
+#: pg_waldump.c:924
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "spécification d'identifiant de transaction invalide : « %s »"
+
+#: pg_waldump.c:939
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "valeur non reconnue pour l'option %s : %s"
+
+#: pg_waldump.c:953
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "l'option %s requiert la spécification de l'option %s"
+
+#: pg_waldump.c:960
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_waldump.c:970 pg_waldump.c:990
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "n'a pas pu ouvrir le répertoire « %s » : %m"
+
+#: pg_waldump.c:996 pg_waldump.c:1026
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "n'a pas pu ouvrir le fichier « %s »"
+
+#: pg_waldump.c:1006
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "l'emplacement de début des journaux de transactions %X/%X n'est pas à l'intérieur du fichier « %s »"
+
+#: pg_waldump.c:1033
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "SEG_FIN %s est avant SEG_DÉBUT %s"
+
+#: pg_waldump.c:1048
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "l'emplacement de fin des journaux de transactions %X/%X n'est pas à l'intérieur du fichier « %s »"
+
+#: pg_waldump.c:1060
+#, c-format
+msgid "no start WAL location given"
+msgstr "pas d'emplacement donné de début du journal de transactions"
+
+#: pg_waldump.c:1074
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "plus de mémoire lors de l'allocation d'un processeur de lecture de journaux de transactions"
+
+#: pg_waldump.c:1080
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "n'a pas pu trouver un enregistrement valide après %X/%X"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "le premier enregistrement se trouve après %X/%X, à %X/%X, ignore %u octet\n"
+msgstr[1] "le premier enregistrement se trouve après %X/%X, à %X/%X, ignore %u octets\n"
+
+#: pg_waldump.c:1171
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "erreur dans l'enregistrement des journaux de transactions à %X/%X : %s"
+
+#: pg_waldump.c:1180
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "décalage invalide de l'enregistrement %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "« contrecord » est requis par %X/%X"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "longueur invalide de l'enregistrement à %X/%X : voulait %u, a eu %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "manque mémoire lors de la tentative de décodage d'un enregistrement de longueur %u"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "longueur trop importante de l'enregistrement %u à %X/%X"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "il n'existe pas de drapeau contrecord à %X/%X"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "longueur %u invalide du contrecord (%lld attendu) à %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "contrecord manquant à %X/%X"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "identifiant du gestionnaire de ressources invalide %u à %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "enregistrement avec prev-link %X/%X incorrect à %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr ""
+"somme de contrôle des données du gestionnaire de ressources incorrecte à\n"
+"l'enregistrement %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "numéro magique invalide %04X dans le segment %s, décalage %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "bits d'information %04X invalides dans le segment %s, décalage %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "Le fichier WAL provient d'une instance différente : l'identifiant système de la base dans le fichier WAL est %llu, alors que l'identifiant système de la base dans pg_control est %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "Le fichier WAL provient d'une instance différente : taille invalide du segment dans l'en-tête de page"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "Le fichier WAL provient d'une instance différente : XLOG_BLCKSZ incorrect dans l'en-tête de page"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "pageaddr %X/%X inattendue dans le journal de transactions %s, segment %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "identifiant timeline %u hors de la séquence (après %u) dans le segment %s, décalage %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id %u désordonné à %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA configuré, mais aucune donnée inclus à %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA non configuré, mais la longueur des données est %u à %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE activé, mais décalage trou %u longueur %u longueur image bloc %u à %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE désactivé, mais décalage trou %u longueur %u à %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL configuré, mais pas de relation précédente à %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "block_id %u invalide à %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "enregistrement de longueur invalide à %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "échec de localisation du bloc de sauvegarde d'ID %d dans l'enregistrement WAL"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "n'a pas pu restaurer l'image à %X/%X avec le bloc invalide %d indiqué"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "n'a pas pu restaurer l'image à %X/%X avec l'état invalide, bloc %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec %s, non supporté par le serveur, bloc %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec une méthode inconnue, bloc %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "n'a pas pu décompresser l'image à %X/%X, bloc %d"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "%s: FATAL: "
+#~ msgstr "%s : FATAL : "
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#~ msgid "cannot open directory \"%s\": %s"
+#~ msgstr "ne peut pas ouvrir le répertoire « %s » : %s"
+
+#~ msgid "could not open directory \"%s\": %s"
+#~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s"
+
+#~ msgid "could not open file \"%s\": %s"
+#~ msgstr "n'a pas pu ouvrir le fichier « %s » : %s"
+
+#, c-format
+#~ msgid "could not parse \"%s\" as a transaction ID"
+#~ msgstr "n'a pas pu analyser « %s » comme un identifiant de transaction"
+
+#, c-format
+#~ msgid "could not parse end WAL location \"%s\""
+#~ msgstr "n'a pas pu analyser l'emplacement de fin du journal de transactions « %s »"
+
+#, c-format
+#~ msgid "could not parse fork \"%s\""
+#~ msgstr "n'a pas pu analyser le fork « %s »"
+
+#, c-format
+#~ msgid "could not parse limit \"%s\""
+#~ msgstr "n'a pas pu analyser la limite « %s »"
+
+#, c-format
+#~ msgid "could not parse start WAL location \"%s\""
+#~ msgstr "n'a pas pu analyser l'emplacement de début du journal de transactions « %s »"
+
+#, c-format
+#~ msgid "could not parse timeline \"%s\""
+#~ msgstr "n'a pas pu analyser la timeline « %s »"
+
+#, c-format
+#~ msgid "could not parse valid block number \"%s\""
+#~ msgstr "n'a pas pu analyser le numéro de bloc valide « %s »"
+
+#~ msgid "could not read file \"%s\": %s"
+#~ msgstr "n'a pas pu lire le fichier « %s » : %s"
+
+#, c-format
+#~ msgid "could not read file \"%s\": read %d of %zu"
+#~ msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu"
+
+#~ msgid "could not read from log file %s, offset %u, length %d: %s"
+#~ msgstr "n'a pas pu lire à partir du segment %s du journal de transactions, décalage %u, longueur %d : %s"
+
+#~ msgid "could not seek in log file %s to offset %u: %s"
+#~ msgstr "n'a pas pu se déplacer dans le fichier de transactions %s au décalage %u : %s"
+
+#~ msgid "could not seek in log segment %s to offset %u: %s"
+#~ msgstr "n'a pas pu rechercher dans le segment %s du journal de transactions au décalage %u : %s"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#~ msgid "not enough data in file \"%s\""
+#~ msgstr "données insuffisantes dans le fichier « %s »"
+
+#, c-format
+#~ msgid "out of memory"
+#~ msgstr "mémoire épuisée"
+
+#~ msgid "path \"%s\" could not be opened: %s"
+#~ msgstr "le chemin « %s » n'a pas pu être ouvert : %s"
+
+#, c-format
+#~ msgid "unrecognized argument to --stats: %s"
+#~ msgstr "argument non reconnu pour --stats : %s"
diff --git a/src/bin/pg_waldump/po/it.po b/src/bin/pg_waldump/po/it.po
new file mode 100644
index 0000000..61d7bda
--- /dev/null
+++ b/src/bin/pg_waldump/po/it.po
@@ -0,0 +1,532 @@
+# LANGUAGE message translation file for pg_waldump
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_waldump (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:17+0000\n"
+"PO-Revision-Date: 2022-10-02 19:21+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: pg_waldump.c:160
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "apertura del file \"%s\" fallita: %m"
+
+#: pg_waldump.c:216
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "La dimensione del segmento WAL deve essere una potenza di due tra 1 MB e 1 GB, ma l'intestazione del file WAL \"%s\" specifica %d byte"
+msgstr[1] "La dimensione dei segmenti WAL deve essere una potenza di due tra 1 MB e 1 GB, ma l'intestazione del file WAL \"%s\" specifica %d byte"
+
+#: pg_waldump.c:222
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "lettura del file \"%s\" fallita: %m"
+
+#: pg_waldump.c:225
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "lettura del file \"%s\" fallita: letti %d di %d"
+
+#: pg_waldump.c:286
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "impossibile individuare il file WAL \"%s\""
+
+#: pg_waldump.c:288
+#, c-format
+msgid "could not find any WAL file"
+msgstr "non è stato possibile trovare alcun file WAL"
+
+#: pg_waldump.c:329
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "impossibile trovare il file \"%s\": %m"
+
+#: pg_waldump.c:378
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "impossibile leggere dal file %s, offset %d: %m"
+
+#: pg_waldump.c:382
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "impossibile leggere dal file %s, offset %d: leggere %d di %d"
+
+#: pg_waldump.c:658
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s decodifica e visualizza i registri write-ahead di PostgreSQL per il debug.\n"
+"\n"
+
+#: pg_waldump.c:660
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_waldump.c:661
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [OPZIONE]... [STARTSEG [ENDSEG]]\n"
+
+#: pg_waldump.c:662
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opzioni:\n"
+
+#: pg_waldump.c:663
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details restituisce informazioni dettagliate sui blocchi di backup\n"
+
+#: pg_waldump.c:664
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr " -B, --block=N con --relation, mostra solo i record che modificano il blocco N\n"
+
+#: pg_waldump.c:665
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR interrompe la lettura nella posizione WAL RECPTR\n"
+
+#: pg_waldump.c:666
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow continua a riprovare dopo aver raggiunto la fine del WAL\n"
+
+#: pg_waldump.c:667
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=FORK mostra solo i record che modificano i blocchi nel fork FORK;\n"
+" i nomi validi sono main, fsm, vm, init\n"
+
+#: pg_waldump.c:669
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N numero di record da visualizzare\n"
+
+#: pg_waldump.c:670
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find log segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=PATH directory in cui trovare i file del segmento di log o a\n"
+" directory con un ./pg_wal che contiene tali file\n"
+" (predefinito: directory corrente, ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:673
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet non stampa alcun output, ad eccezione degli errori\n"
+
+#: pg_waldump.c:674
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR mostra solo i record generati dal gestore risorse RMGR;\n"
+" usa --rmgr=list per elencare i nomi validi del gestore risorse\n"
+
+#: pg_waldump.c:676
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr " -R, --relation=T/D/R mostra solo i record che modificano i blocchi in relazione a T/D/R\n"
+
+#: pg_waldump.c:677
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR inizia a leggere nella posizione WAL RECPTR\n"
+
+#: pg_waldump.c:678
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read log records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=timeline TLI da cui leggere i record di registro\n"
+" (predefinito: 1 o il valore utilizzato in STARTSEG)\n"
+
+#: pg_waldump.c:680
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_waldump.c:681
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage mostra solo i record con una scrittura a pagina intera\n"
+
+#: pg_waldump.c:682
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID mostra solo i record con ID transazione XID\n"
+
+#: pg_waldump.c:683
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=record] mostra le statistiche invece dei record\n"
+" (facoltativamente, mostra le statistiche per record)\n"
+
+#: pg_waldump.c:685
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_waldump.c:686
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: pg_waldump.c:687
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid "no arguments specified"
+msgstr "nessun argomento specificato"
+
+#: pg_waldump.c:797
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "numero di blocco non valido: \"%s\""
+
+#: pg_waldump.c:806 pg_waldump.c:904
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "posizione WAL non valida: \"%s\""
+
+#: pg_waldump.c:819
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "nome fork non valido: \"%s\""
+
+#: pg_waldump.c:827
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valore \"%s\" non valido per l'opzione %s"
+
+#: pg_waldump.c:858
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "il gestore risorse personalizzato \"%s\" non esiste"
+
+#: pg_waldump.c:879
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "il gestore risorse \"%s\" non esiste"
+
+#: pg_waldump.c:894
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "specifica relazione non valida: \"%s\""
+
+#: pg_waldump.c:895
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "In attesa di \"tablespace OID/database OID/relation filenode\"."
+
+#: pg_waldump.c:914
+#, c-format
+msgid "invalid timeline specification: \"%s\""
+msgstr "specifica della sequenza temporale non valida: \"%s\""
+
+#: pg_waldump.c:924
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "specificazione ID transazione non valida: \"%s\""
+
+#: pg_waldump.c:939
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "unrecognized value for option %s: %s"
+
+#: pg_waldump.c:953
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "l'opzione %s richiede che sia specificata l'opzione %s"
+
+#: pg_waldump.c:960
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_waldump.c:970 pg_waldump.c:990
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "apertura della directory \"%s\" fallita: %m"
+
+#: pg_waldump.c:996 pg_waldump.c:1026
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "impossibile aprire il file \"%s\""
+
+#: pg_waldump.c:1006
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "avviare la posizione WAL %X/%X non è all'interno del file \"%s\""
+
+#: pg_waldump.c:1033
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "ENDSEG %s è prima di STARTSEG %s"
+
+#: pg_waldump.c:1048
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "posizione WAL finale %X/%X non è all'interno del file \"%s\""
+
+#: pg_waldump.c:1060
+#, c-format
+msgid "no start WAL location given"
+msgstr "nessuna posizione iniziale WAL fornita"
+
+#: pg_waldump.c:1074
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "memoria insufficiente durante l'allocazione di un processore di lettura WAL"
+
+#: pg_waldump.c:1080
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "impossibile trovare un record valido dopo %X/%X"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "il primo record è dopo %X/%X, a %X/%X, saltando %u byte\n"
+msgstr[1] "i primi records sono dopo %X/%X, a %X/%X, saltando %u byte\n"
+
+#: pg_waldump.c:1171
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "errore nel record WAL a %X/%X: %s"
+
+#: pg_waldump.c:1180
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "offset del record non valido a %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord richiesto da %X/%X"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "lunghezza del record a %X/%X non valida: atteso %u, ricevuto %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "memoria insufficiente durante il tentativo di decodificare un record di lunghezza %u"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "lunghezza del record %u a %X/%X eccessiva"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "non c'è un flag di contrecord a %X/%X"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "lunghezza contrada non valida %u (prevista %lld) a %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "missing contrecord at %X/%X"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "l'ID di gestione risorse %u non è valido a %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "record con link-precedente %X/%X non corretto a %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "checksum dei dati del manager di risorse non corretto nel record a %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "numero magico %04X non valido nel segmento di log %s, offset %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "bit di info %04X non validi nel segmento di log %s, offset %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "Il file WAL proviene da un sistema di database diverso: l'identificatore del sistema del database del file WAL è %llu, l'identificatore del sistema del database pg_control è %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "il file di WAL è di un diverso database: dimensione del segmento sbagliata nell'header di pagina"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "il file di WAL è di un database diverso: XLOG_BLCKSZ non corretto nell'header di pagina"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "pageaddr inaspettato %X/%X nel segmento di log %s, offset %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "l'ID della timeline %u (dopo %u) è fuori sequenza nel segmento di log %s, offset %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id fuori sequenza %u a %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA impostato, ma dati non inclusi a %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA non impostato, ma la lunghezza dei dati è %u a %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE impostato, ma offset buco %u lunghezza %u lunghezza dell'immagine del blocco %u a %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE non impostato, ma offset buco %u lunghezza %u a %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED impostato, ma blocca la lunghezza dell'immagine %u a %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "né BKPIMAGE_HAS_HOLE né BKPIMAGE_COMPRESSED impostati, ma la lunghezza dell'immagine del blocco è %u a %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL impostato ma non c'è un rel precedente a %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "block_id %u non valido a %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "record con lunghezza non valida a %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "impossibile individuare il blocco di backup con ID %d nel record WAL"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "impossibile ripristinare l'immagine in %X/%X con il blocco %d non valido specificato"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "impossibile ripristinare l'immagine in %X/%X con stato non valido, blocco %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "impossibile ripristinare l'immagine in %X/%X compressa con %s non supportata da build, blocco %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "impossibile ripristinare l'immagine in %X/%X compressa con metodo sconosciuto, blocco %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "impossibile decomprimere l'immagine in %X/%X, blocco %d"
diff --git a/src/bin/pg_waldump/po/ja.po b/src/bin/pg_waldump/po/ja.po
new file mode 100644
index 0000000..23043ec
--- /dev/null
+++ b/src/bin/pg_waldump/po/ja.po
@@ -0,0 +1,532 @@
+# Japanese message translation file for pg_waldump
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 11:14+0900\n"
+"PO-Revision-Date: 2022-09-26 14:57+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: pg_waldump.c:160
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンできませんでした: %m"
+
+#: pg_waldump.c:216
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "WALセグメントのサイズは1MBと1GBの間の2の累乗でなければなりません、しかしWALファイル\"%s\"のヘッダでは%dバイトとなっています"
+
+#: pg_waldump.c:222
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ファイル\"%s\"の読み取りに失敗しました: %m"
+
+#: pg_waldump.c:225
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "ファイル\"%1$s\"を読み取れませんでした: %3$d中%2$d"
+
+#: pg_waldump.c:286
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "WALファイル\"%s\"がありませんでした"
+
+#: pg_waldump.c:288
+#, c-format
+msgid "could not find any WAL file"
+msgstr "WALファイルが全くありません"
+
+#: pg_waldump.c:329
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "ファイル\"%s\"が見つかりませんでした: %m"
+
+#: pg_waldump.c:378
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "ファイル %s、オフセット%dから読み取れませんでした: %m"
+
+#: pg_waldump.c:382
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "ファイル%1$s、オフセット%2$dから読み取れませんでした: %4$d中%3$d"
+
+#: pg_waldump.c:658
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%sはデバッグのためにPostgreSQLの先行書き込みログをデコードして表示します。\n"
+"\n"
+
+#: pg_waldump.c:660
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_waldump.c:661
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [オプション] ... [開始セグメント [終了セグメント]]\n"
+
+#: pg_waldump.c:662
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"オプション:\n"
+
+#: pg_waldump.c:663
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details バックアップブロックに関する詳細情報を出力\n"
+
+#: pg_waldump.c:664
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr ""
+" -B, --block=N --relationと共に指定することでこのブロックNを更新する\n"
+" レコードのみを表示\n"
+
+#: pg_waldump.c:665
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR WAL位置RECPTRで読み込みを停止\n"
+
+#: pg_waldump.c:666
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow WALの終端に達してからもリトライを続ける\n"
+
+#: pg_waldump.c:667
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=FORK 指定フォークのブロックを更新するレコードのみ表示;\n"
+" 指定可能な名前はmain, fsm, vm, init\n"
+
+#: pg_waldump.c:669
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N 表示するレコード数\n"
+
+#: pg_waldump.c:670
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find log segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=PATH ログセグメントファイルを探すディレクトリ、または\n"
+" 同様のファイルのある ./pg_walを含むディレクトリ\n"
+" (デフォルト: カレントディレクトリ, ./pg_wal,\n"
+" $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:673
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet エラー以外何も出力しない\n"
+
+#: pg_waldump.c:674
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR 指定のリソースマネージャーで生成されたレコードのみ表示\n"
+" --rmgr=list で有効なリソースマネージャーの一覧を表示\n"
+
+#: pg_waldump.c:676
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr " -R, --relation=T/D/R リレーションT/D/Rのブロックを更新するレコードのみ表示\n"
+
+#: pg_waldump.c:677
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR WAL位置RECPTRから読み込みを開始\n"
+
+#: pg_waldump.c:678
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read log records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI ログレコードを読むべきタイムライン\n"
+" (デフォルト: 1 またはSTARTSEGで使われた値)\n"
+
+#: pg_waldump.c:680
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: pg_waldump.c:681
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage 全ページ書き込みを含むレコードのみを表示\n"
+
+#: pg_waldump.c:682
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID トランザクションIDがXIDのレコードのみを表示する\n"
+
+#: pg_waldump.c:683
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=レコード] レコードの代わりに統計情報を表示する\n"
+" (オプションで、レコードごとの統計を表示する)\n"
+
+#: pg_waldump.c:685
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: pg_waldump.c:686
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"バグは<%s>に報告してください。\n"
+
+#: pg_waldump.c:687
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid "no arguments specified"
+msgstr "引数が指定されていません"
+
+#: pg_waldump.c:797
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "不正なブロック番号: \"%s\""
+
+#: pg_waldump.c:806 pg_waldump.c:904
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "不正なWAL LSN: \"%s\""
+
+#: pg_waldump.c:819
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "不正なフォーク名: \"%s\""
+
+#: pg_waldump.c:827
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "オプション%2$sに対する不正な値\"%1$s\""
+
+#: pg_waldump.c:858
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "独自リソースマネージャー\"%s\"は存在しません"
+
+#: pg_waldump.c:879
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "リソースマネージャー\"%s\"は存在しません"
+
+#: pg_waldump.c:894
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "不正なリレーション指定: \"%s\""
+
+#: pg_waldump.c:895
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "\"テーブル空間OID/データベースOID/リレーション・ファイルノード”を期待しています。"
+
+#: pg_waldump.c:914
+#, c-format
+msgid "invalid timeline specification: \"%s\""
+msgstr "不正なタイムライン指定: \"%s\""
+
+#: pg_waldump.c:924
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "不正なトランザクションID指定: \"%s\""
+
+#: pg_waldump.c:939
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "%sオプションに対する認識できない値: %s"
+
+#: pg_waldump.c:953
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "%sオプション指定時は%sオプションも必要です"
+
+#: pg_waldump.c:960
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数が多すぎます(先頭は\"%s\")"
+
+#: pg_waldump.c:970 pg_waldump.c:990
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m"
+
+#: pg_waldump.c:996 pg_waldump.c:1026
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "ファイル\"%s\"を開くことができませんでした"
+
+#: pg_waldump.c:1006
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "WALの開始位置%X/%Xはファイル\"%s\"の中ではありません"
+
+#: pg_waldump.c:1033
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "ENDSEG%sがSTARTSEG %sより前に現れました"
+
+#: pg_waldump.c:1048
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "WALの終了位置%X/%Xはファイル\"%s\"の中ではありません"
+
+#: pg_waldump.c:1060
+#, c-format
+msgid "no start WAL location given"
+msgstr "WALの開始位置が指定されていません"
+
+#: pg_waldump.c:1074
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "WAL読み取り機構でのメモリ割り当てに中にメモリ不足"
+
+#: pg_waldump.c:1080
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "%X/%Xの後に有効なレコードが見つかりませんでした"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "先頭レコードが%X/%Xの後の%X/%Xの位置にありました。%uバイト分をスキップしています\n"
+
+#: pg_waldump.c:1171
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "WALレコードの%X/%Xでエラー: %s"
+
+#: pg_waldump.c:1180
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細は\"%s --help\"を実行してください。"
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "%X/%Xのレコードオフセットが不正です"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "%X/%Xでは継続レコードが必要です"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "%X/%Xのレコード長が不正です:長さは%uである必要がありますが、実際は%uでした"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "長さ%uのレコードのデコード中のメモリ不足"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "%2$X/%3$Xのレコード長%1$uが大きすぎます"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "%X/%Xでcontrecordフラグがありません"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "%3$X/%4$Xの継続レコードの長さ%1$u(正しくは%2$lld)は不正です"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "%X/%Xに継続レコードがありません"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "%2$X/%3$XのリソースマネージャID %1$uは不正です"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "%3$X/%4$Xのレコードの後方リンク%1$X/%2$Xが不正です"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "%X/%Xのレコード内のリソースマネージャデータのチェックサムが不正です"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "ログセグメント%2$s、オフセット%3$uのマジックナンバー%1$04Xは不正です"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "ログセグメント %2$s、オフセット%3$uの情報ビット%1$04Xは不正です"
+
+#: xlogreader.c:1260
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "WALファイルは異なるデータベースシステム由来のものです: WALファイルのデータベースシステム識別子は %lluで、pg_control におけるデータベースシステム識別子は %lluです"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのセグメントサイズが正しくありません"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのXLOG_BLCKSZが正しくありません"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "ログセグメント%3$s、オフセット%4$uに想定外のページアドレス%1$X/%2$X"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "ログセグメント%3$s、オフセット%4$uのタイムラインID %1$u(%2$uの後)が順序通りではありません"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id %uが%X/%Xで不正です"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATAが設定されていますが、%X/%Xにデータがありません"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATAが設定されていませんが、%2$X/%3$Xのデータ長は%1$uです"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLEが設定されていますが、%4$X/%5$Xでホールオフセット%1$u、長さ%2$u、ブロックイメージ長%3$uです"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLEが設定されていませんが、%3$X/%4$Xにおけるホールオフセット%1$uの長さが%2$uです"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSEDが設定されていますが、%2$X/%3$Xにおいてブロックイメージ長が%1$uです"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLEもBKPIMAGE_COMPRESSEDも設定されていませんが、%2$X/%3$Xにおいてブロックイメージ長が%1$uです"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_RELが設定されていますが、%X/%Xにおいて以前のリレーションがありません"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "%2$X/%3$Xにおけるblock_id %1$uが不正です"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "%X/%Xのレコードのサイズが不正です"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "WALレコード中のID %dのバックアップブロックを特定できませんでした"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "%X/%Xで不正なブロック%dが指定されているためイメージが復元できませんでした"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "%X/%Xでブロック%dのイメージが不正な状態であるため復元できませんでした"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "%1$X/%2$Xで、ブロック%4$dがこのビルドでサポートされない圧縮方式%3$sで圧縮されているため復元できませんでした"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "%X/%Xでブロック%dのイメージが不明な方式で圧縮されているため復元できませんでした"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "%X/%Xのブロック%dが伸張できませんでした"
diff --git a/src/bin/pg_waldump/po/ka.po b/src/bin/pg_waldump/po/ka.po
new file mode 100644
index 0000000..e9dadeb
--- /dev/null
+++ b/src/bin/pg_waldump/po/ka.po
@@ -0,0 +1,615 @@
+# Georgian message translation file for pg_waldump
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_waldump (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-25 19:48+0000\n"
+"PO-Revision-Date: 2022-09-25 22:13+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდომა: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გაფრთხილება: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტალები: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნება: "
+
+#: pg_waldump.c:160
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფაილის (%s) გახსნის შეცდომა: %m"
+
+#: pg_waldump.c:216
+#, c-format
+msgid ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL "
+"file \"%s\" header specifies %d byte"
+msgid_plural ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL "
+"file \"%s\" header specifies %d bytes"
+msgstr[0] ""
+"WAL სეგმენტის ზომა ორის ხარისხი უნდა იყოს, 1 მბ-სა და 1 გბ-ს სორის, მაგრამ "
+"WAL ფაილის \"%s\" თავსართი %d ბაიტზე მიუთითებს"
+msgstr[1] ""
+"WAL სეგმენტის ზომა ორის ხარისხი უნდა იყოს, 1 მბ-სა და 1 გბ-ს სორის, მაგრამ "
+"WAL ფაილის \"%s\" თავსართი %d ბაიტზე მიუთითებს"
+
+#: pg_waldump.c:222
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ფაილის (%s) წაკითხვის შეცდომა: %m"
+
+#: pg_waldump.c:225
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "\"%s\"-ის წაკითხვის შეცდომა: წაკითხულია %d %d-დან"
+
+#: pg_waldump.c:286
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "wal ფაილის (\"%s\") მოძებნა შეუძლებელია"
+
+#: pg_waldump.c:288
+#, c-format
+msgid "could not find any WAL file"
+msgstr "ვერცერთი WAL ფაილი ვერ ვიპოვე"
+
+#: pg_waldump.c:329
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "ფაილი (%s) არ არსებობს: %m"
+
+#: pg_waldump.c:378
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "ფაილიდან (%s)წაკითხვის შეცდომა. წანაცვლება %d: %m"
+
+#: pg_waldump.c:382
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "ფაილიდან (%s)წაკითხვის შეცდომა. წანაცვლება %d: წაკითხულია %d %d-დან"
+
+#: pg_waldump.c:658
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s ახდენს PostgreSQL-ის წინასწარ-ჩაწერადი ჟურნალის გაშიფვრას და ჩვენებას "
+"პროგრამის გამართვისთვის.\n"
+"\n"
+
+#: pg_waldump.c:660
+#, c-format
+msgid "Usage:\n"
+msgstr "გამოყენება:\n"
+
+#: pg_waldump.c:661
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [პარამეტრი]... [STARTSEG [ENDSEG]]\n"
+
+#: pg_waldump.c:662
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+" პარამეტრები\n"
+
+#: pg_waldump.c:663
+#, c-format
+msgid ""
+" -b, --bkp-details output detailed information about backup blocks\n"
+msgstr ""
+" -b, --bkp-details დამარქაფებული ბლოკების დეტალური ინფორმაციის "
+"ჩვენება\n"
+
+#: pg_waldump.c:664
+#, c-format
+msgid ""
+" -B, --block=N with --relation, only show records that modify "
+"block N\n"
+msgstr ""
+" -B, --block=N --relation -სთან ერთად, მხოლოდ იმ ჩანაწერების "
+"ჩვენება, რომელიც N ბლოკს ცვლიან\n"
+
+#: pg_waldump.c:665
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR კითხვის შეწყეტა WAL-ის RECPTR მდებარეობაზე \n"
+
+#: pg_waldump.c:666
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr ""
+" -f, --follow WAL ფაილის ბოლოს მიღწევის შემდეგ ცდები არ "
+"შეწყდება\n"
+
+#: pg_waldump.c:667
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=ფორკი ნაჩვენები იქნება ჩანაწერები, რომლებიც მითითებულ "
+"ფორკში ბლოკებს ცვლიან;\n"
+" დასაშვები სახელებია main, fsm, vm, init\n"
+
+#: pg_waldump.c:669
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N საჩვენებელი ჩანაწერების რაოდენობა\n"
+
+#: pg_waldump.c:670
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find log segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/"
+"pg_wal)\n"
+msgstr ""
+" -p, --path=biliki საქაღალდე, რომელშიც უნდა ვიპოვო ჟურნალის\n"
+" სეგმენტის ფაილები ან საქაღალდე, რომელიც ./pg_wal-ით, "
+"რომელიც ამ \n"
+" ფაილებს შეიცავს (ნაგულისხმები: მიმდინარე საქაღალდე, ./"
+"pg_wal და $PGDATA/pg_wal\n"
+
+#: pg_waldump.c:673
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet შეცდომების გარდა ეკრანზე არაფერი გამოჩნდება\n"
+
+#: pg_waldump.c:674
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager "
+"RMGR;\n"
+" use --rmgr=list to list valid resource manager "
+"names\n"
+msgstr ""
+" -r, --rmgr=RMGR მხოლოდ RMGR რესურსების მმართველის მიერ გენერირებული "
+"ჩანაწერების ჩვენება. ;\n"
+" რესურსების მმართველების სიის მისაღებად გამოიყენეთ --"
+"rmgr=list\n"
+
+#: pg_waldump.c:676
+#, c-format
+msgid ""
+" -R, --relation=T/D/R only show records that modify blocks in relation T/"
+"D/R\n"
+msgstr ""
+" -R, --relation=T/D/R ნაჩვენები იქნება ჩანაწერები, რომლებიც ცვლიან "
+"ბლოკებს ურთიერთობაში T/D/R\n"
+
+#: pg_waldump.c:677
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR კითხვის WAL მდებარეობა RECPTR-სთან დაწყება\n"
+
+#: pg_waldump.c:678
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read log records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI დროის ხაზი, ის შემდეგაც დაიწყება ჟურნალის "
+"ჩანაწერების კითხვა\n"
+" (ნაგულისხმები: 1 ან STARTSEG-ში გამოყენებული "
+"მნიშვნელობა)\n"
+
+#: pg_waldump.c:680
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: pg_waldump.c:681
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr ""
+" -w, --fullpage მხოლოდ სრული გვერდის ჩაწერის მქონე ჩანაწერების "
+"ჩვენება\n"
+
+#: pg_waldump.c:682
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr ""
+" -x, --xid=XID მხოლოდ იმ ჩანაწერების ჩვენება, რომლის ტრანზაქციის "
+"ID XID-ს უდრის\n"
+
+#: pg_waldump.c:683
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=ჩანაწერი] ჩანწერების მაგიერ სტატისტიკის ჩვენება\n"
+" (ასევე შესაძლებელია სათითაოდ ჩანაწერის სტატისტიკის "
+"ჩვენებაც)\n"
+
+#: pg_waldump.c:685
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: pg_waldump.c:686
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდომების შესახებ მიწერეთ: %s\n"
+
+#: pg_waldump.c:687
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid "no arguments specified"
+msgstr "არგუმენტები მითითებული არაა"
+
+#: pg_waldump.c:797
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "ბლოკის არასწორი ნომერი: \"%s\""
+
+#: pg_waldump.c:806 pg_waldump.c:904
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "wal-ის არასწორი მდებარეობა: \"%s\""
+
+#: pg_waldump.c:819
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "ფორკის არასწორი სახელი: \"%s\""
+
+#: pg_waldump.c:827
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "არასწორი მნიშვნელობა \"%s\" პარამეტრისთვის %s"
+
+#: pg_waldump.c:858
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "რესურსების მმართველი \"%s\" არ არსებობს"
+
+#: pg_waldump.c:879
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "რესურსების მმართველი \"%s\" არ არსებობს"
+
+#: pg_waldump.c:894
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "ურთიერთობის არასწორი სპეციფიკაცია: \"%s\""
+
+#: pg_waldump.c:895
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "მოველოდი \"tablespace OID/database OID/relation filenode\"."
+
+#: pg_waldump.c:914
+#, c-format
+msgid "invalid timeline specification: \"%s\""
+msgstr "დროის ხაზის არასწორი სპეციფიკაცია: \"%s\""
+
+#: pg_waldump.c:924
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "ტრანზაქციის ID-ის არასწორი სპეციფიკაცია: \"%s\""
+
+#: pg_waldump.c:939
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "პარამეტრის (%s) უცნობი მნიშვნელობა: %s"
+
+#: pg_waldump.c:953
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "პარამეტრს %s თავის მხრივ სჭირდება პარამეტრის %s მითითება"
+
+#: pg_waldump.c:960
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")"
+
+#: pg_waldump.c:970 pg_waldump.c:990
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "საქაღალდის (%s) გახსნის შეცდომა: %m"
+
+#: pg_waldump.c:996 pg_waldump.c:1026
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "შეუძლებელია ფაილის გახსნა: \"%s\""
+
+#: pg_waldump.c:1006
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "საწყისი WAL მდებარეობა %X/%X ფაილის (\"%s\") შიგნით არაა"
+
+#: pg_waldump.c:1033
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "ENDSEG %s STARTSEG %s -ის წინაა"
+
+#: pg_waldump.c:1048
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "დასასრულის WAL მდებარეობა %X/%X ფაილის (\"%s\") შიგნით არაა"
+
+#: pg_waldump.c:1060
+#, c-format
+msgid "no start WAL location given"
+msgstr "wal-ის საწყისი მდებარეობა მითითებული არაა"
+
+#: pg_waldump.c:1074
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "არასაკმარისი მეხსიერება WAL-ის წამკითხავი პროცესორისთვის"
+
+#: pg_waldump.c:1080
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "%X/%X -ის შემდეგ სწორი ჩანაწერი არ არსებობს"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] ""
+"პირველი ჩანაწერი %X/%X-ის შემდეგაა, %X/%X-სთან. გამოტოვებული იქნება %u "
+"ბაიტი\n"
+msgstr[1] ""
+"პირველი ჩანაწერი %X/%X-ის შემდეგაა, %X/%X-სთან. გამოტოვებული იქნება %u "
+"ბაიტი\n"
+
+#: pg_waldump.c:1171
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "შეცდომა WAL ჩანაწერში %X/%X: %s"
+
+#: pg_waldump.c:1180
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "ჩანაწერის არასწორი წანაცვლება მისამართზე %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord მოთხოვნილია %X/%X-ის მიერ"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "ჩანაწერის არასწორი სიგრძე მისამართზე %X/%X: მინდოდა %u, მივიღე %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "%u სიგრძის მქონე ჩანაწერის დეკოდირებისთვის მეხსიერება საკმარისი არაა"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "ჩანაწერის სიგრძე %u მისამართზე %X/%X ძალიან გრძელია"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "contrecord ალამი მისამართზე %X/%X არ არსებობს"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "contrecord -ის არასწორი სიგრძე %u (მოველოდი %lld) მისამართზე %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "contrecord მისამართზე %X/%X არ არსებობს"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "რესურსის მმართველის არასწორი ID %u მისამართზე %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "ჩანაწერი არასწორი წინა ბმულით %X/%X მისამართზე %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr ""
+"რესურსის მმართველის მონაცემების არასწორი საკონტროლო რიცხვი ჩანაწერში "
+"მისამართზე %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "არასწორი მაგიური რიცხვი %04X ჟურნალის სეგმენტში %s, წანაცვლება %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "არასწორი საინფორმაციო ბიტები %04X ჟურნალის სეგმენტში %s, წანაცვლება %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid ""
+"WAL file is from different database system: WAL file database system "
+"identifier is %llu, pg_control database system identifier is %llu"
+msgstr ""
+"WAL ფაილი სხვა ბაზიდანაა: WAL ფაილის ბაზის იდენტიფიკატორია %llu, pg_control-"
+"ის ბაზის სისტემის იდენტიფიკატორი კი %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect segment size in page "
+"header"
+msgstr ""
+"WAL ფაილი სხვა ბაზის სიტემიდანაა: სეგმანტის არასწორი ზომა გვერდის თავსართში"
+
+#: xlogreader.c:1274
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect XLOG_BLCKSZ in page "
+"header"
+msgstr ""
+"WAL ფაილი სხვა მონაცემთა ბაზის სისტემიდანაა: გვერდის თავსართში მითითებული "
+"XLOG_BLKSZ არასწორია"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "მოულოდნელი pageaddr %X/%X ჟურნალის სეგმენტში %s, წანაცვლება %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr ""
+"მიმდევრობის-გარე დროის ხაზის ID %u (%u-ის შემდეგ) ჟურნალის სეგმენტში %s, "
+"წანაცვლება %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "ურიგო block_id %u მისამართზე %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr ""
+"BKPBLOCK_HAS_DATA დაყენებულია, მაგრამ მონაცემები მისამართზე %X/%X არ არსებობს"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr ""
+"BKPBLOCK_HAS_DATA დაყენებულია, მაგრამ არსებობს მონაცემები სიგრძით %u "
+"მისამართზე %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid ""
+"BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at "
+"%X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE დაყენებულია, მაგრამ ნახვრეტის წანაცვლება %u სიგრძე %u "
+"ბლოკის ასლის სიგრძე %u მისამართზე %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE დაყენებული არაა, მაგრამ ნახვრეტის წანაცვლება %u სიგრძე %u "
+"მისანართზე %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_COMPRESSED დაყენებულია, მაგრამ ბლოკის ასლის სიგრძეა %u მისამართზე "
+"%X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid ""
+"neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image "
+"length is %u at %X/%X"
+msgstr ""
+"არც BKPIMAGE_HAS_HOLE და არც BKPIMAGE_COMPRESSED დაყენებული არაა, მაგრამ "
+"ბლოკის ასლის სიგრძე %u-ა, მისამართზე %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr ""
+"BKPBLOCK_SAME_REL დაყენებულია, მაგრამ წინა მნიშვნელობა მითითებული არაა "
+"მისამართზე %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "არასწორი block_id %u %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "ჩანაწერი არასწორი სიგრძით მისამართზე %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "შეცდომა WAL ჩანაწერში მარქაფი ბლოკის, ID-ით %d, მოძებნისას"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr ""
+"შეუძლებელია ასლის აღდგენა მისამართზე %X/%X, როცა მითითებულია არასწორი ბლოკი "
+"%d"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr ""
+"შეუძლებელია ასლის აღდგენა მისამართზე %X/%X არასწორი მდგომარეობით, ბლოკი %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with %s not supported by build, "
+"block %d"
+msgstr ""
+"%3$s მეთოდით შეკუმშული ასლის აღდგენა მისამართზე %1$X/%2$X, ბლოკი %4$d "
+"შეუძლებელია. მხარდაუჭერელია ამ აგების მიერ"
+
+#: xlogreader.c:2111
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr ""
+"შეუძლებელია ასლის აღდგენა მისამართზე %X/%X, შეკუმშულია უცნობი მეთოდით, ბლოკი "
+"%d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "შეუძლებელია ასლის გაშლა მისამართზე %X/%X, ბლოკი %d"
diff --git a/src/bin/pg_waldump/po/ko.po b/src/bin/pg_waldump/po/ko.po
new file mode 100644
index 0000000..7d2ede8
--- /dev/null
+++ b/src/bin/pg_waldump/po/ko.po
@@ -0,0 +1,572 @@
+# LANGUAGE message translation file for pg_waldump
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:47+0000\n"
+"PO-Revision-Date: 2023-03-22 17:13+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "상세정보: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: pg_waldump.c:160
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파일을 열 수 없음: %m"
+
+#: pg_waldump.c:216
+#, c-format
+msgid ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL "
+"file \"%s\" header specifies %d byte"
+msgid_plural ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL "
+"file \"%s\" header specifies %d bytes"
+msgstr[0] ""
+"WAL 조각 파일 크기는 1MB에서 1GB사이 2^n 이어야하지만, \"%s\" WAL 파일 헤더에"
+"는 %d 바이트로 지정되어있습니다"
+
+#: pg_waldump.c:222
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "\"%s\" 파일을 읽을 수 없음: %m"
+
+#: pg_waldump.c:225
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "\"%s\" 파일을 읽을 수 없음: %d 읽음, 전체 %d"
+
+#: pg_waldump.c:286
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "\"%s\" WAL 파일 찾기 실패"
+
+#: pg_waldump.c:288
+#, c-format
+msgid "could not find any WAL file"
+msgstr "어떤 WAL 파일도 찾을 수 없음"
+
+#: pg_waldump.c:329
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "\"%s\" 파일을 찾을 수 없음: %m"
+
+#: pg_waldump.c:378
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "\"%s\" 파일에서 %d 위치를 읽을 수 없음: %m"
+
+#: pg_waldump.c:382
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "%s 파일에서 %d 위치에서 읽기 실패: %d 읽음, 전체 %d"
+
+#: pg_waldump.c:658
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr "%s 명령은 디버깅을 위해 PostgreSQL 미리 쓰기 로그(WAL)를 분석합니다.\n"
+
+#: pg_waldump.c:660
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_waldump.c:661
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [옵션]... [시작파일 [마침파일]]\n"
+
+#: pg_waldump.c:662
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"옵션들:\n"
+
+#: pg_waldump.c:663
+#, c-format
+msgid ""
+" -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details 백업 블록에 대한 자세한 정보도 출력함\n"
+
+#: pg_waldump.c:664
+#, c-format
+msgid ""
+" -B, --block=N with --relation, only show records that modify "
+"block N\n"
+msgstr ""
+" -B, --block=N --relation 옵션과 함께, 변경된 N번 블록의 레코드만"
+"봄\n"
+
+#: pg_waldump.c:665
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR RECPTR WAL 위치에서 읽기 멈춤\n"
+
+#: pg_waldump.c:666
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow WAL 끝까지 읽은 뒤에도 계속 진행함\n"
+
+#: pg_waldump.c:667
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=FORK 지정한 FORK 종류 포크의 변경 블록의 레코드만\n"
+" 사용가능한 포크: main, fsm, vm, init\n"
+
+#: pg_waldump.c:669
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N 출력할 레코드 수\n"
+
+#: pg_waldump.c:670
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find log segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/"
+"pg_wal)\n"
+msgstr ""
+" -p, --path=PATH 로그 조각 파일이 있는 디렉터리 지정, 또는\n"
+" ./pg_wal 디렉터리가 있는 디렉터리 지정\n"
+" (기본값: 현재 디렉터리, ./pg_wal, PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:673
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet 오류를 빼고 나머지는 아무 것도 안 보여줌\n"
+
+#: pg_waldump.c:674
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager "
+"RMGR;\n"
+" use --rmgr=list to list valid resource manager "
+"names\n"
+msgstr ""
+" -r, --rmgr=RMGR 리소스 관리자 RMGR에서 만든 레코드만 출력함\n"
+" 리소스 관리자 이들을 --rmgr=list 로 봄\n"
+
+#: pg_waldump.c:676
+#, c-format
+msgid ""
+" -R, --relation=T/D/R only show records that modify blocks in relation T/"
+"D/R\n"
+msgstr ""
+" -R, --relation=T/D/R T/D/R 릴레이션에서 변경 블록 레코드만 보여줌\n"
+
+#: pg_waldump.c:677
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR WAL RECPTR 위치에서 읽기 시작\n"
+
+#: pg_waldump.c:678
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read log records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI 읽기 시작할 타임라인 번호\n"
+" (기본값: 1 또는 STARTSEG에 사용된 값)\n"
+
+#: pg_waldump.c:680
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보 보여주고 마침\n"
+
+#: pg_waldump.c:681
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage full page write 레코드만 보여줌\n"
+
+#: pg_waldump.c:682
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID 트랜잭션 XID 레코드만 출력\n"
+
+#: pg_waldump.c:683
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=record] 레크드 통계 정보를 보여줌\n"
+" (추가로, 레코드당 통계정보를 출력)\n"
+
+#: pg_waldump.c:685
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: pg_waldump.c:686
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"문제점 보고 주소: <%s>\n"
+
+#: pg_waldump.c:687
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid "no arguments specified"
+msgstr "인자를 지정하세요"
+
+#: pg_waldump.c:797
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "잘못된 블록 번호: \"%s\""
+
+#: pg_waldump.c:806 pg_waldump.c:904
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "잘못된 WAL 위치: \"%s\""
+
+#: pg_waldump.c:819
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "잘못된 포크 이름: \"%s\""
+
+#: pg_waldump.c:827
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "\"%s\" 값은 %s 옵션 값으로 유효하지 않음"
+
+#: pg_waldump.c:858
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "\"%s\" 이름의 사용자 정의 리소스 관리자가 없음"
+
+#: pg_waldump.c:879
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "\"%s\" 이름의 리소스 관리자가 없음"
+
+#: pg_waldump.c:894
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "잘못된 릴레이션 양식: \"%s\""
+
+#: pg_waldump.c:895
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "\"테이블스페이스OID/데이터베이스OID/릴레이션 filenode\" 양식을 기대함"
+
+#: pg_waldump.c:914
+#, c-format
+msgid "invalid timeline specification: \"%s\""
+msgstr "잘못된 타임라인 양식: \"%s\""
+
+#: pg_waldump.c:924
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "잘못된 트랜잭션 ID 양식: \"%s\""
+
+#: pg_waldump.c:939
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "%s 옵션에 대한 알 수 없는 값: %s"
+
+#: pg_waldump.c:953
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "%s 옵션은 %s 옵션 설정이 필요합니다."
+
+#: pg_waldump.c:960
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 많은 명령행 인수를 지정했습니다. (처음 \"%s\")"
+
+#: pg_waldump.c:970 pg_waldump.c:990
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 열 수 없음: %m"
+
+#: pg_waldump.c:996 pg_waldump.c:1026
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "\"%s\" 파일을 열 수 없음"
+
+#: pg_waldump.c:1006
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "%X/%X WAL 시작 위치가 \"%s\" 파일에 없음"
+
+#: pg_waldump.c:1033
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "%s ENDSEG가 %s STARTSEG 앞에 있음"
+
+#: pg_waldump.c:1048
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "%X/%X WAL 끝 위치가 \"%s\" 파일에 없음"
+
+#: pg_waldump.c:1060
+#, c-format
+msgid "no start WAL location given"
+msgstr "입력한 WAL 위치에서 시작할 수 없음"
+
+#: pg_waldump.c:1074
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "WAL 읽기 프로세서를 할당하는 중에 메모리 부족 발생"
+
+#: pg_waldump.c:1080
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "%X/%X 위치 뒤에 올바른 레코드가 없음"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "첫 레코드가 %X/%X 뒤에 있고, (%X/%X), %u 바이트 건너 뜀\n"
+
+#: pg_waldump.c:1171
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "%X/%X 위치에서 WAL 레코드 오류: %s"
+
+#: pg_waldump.c:1180
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "자세한 사항은 \"%s --help\" 명령으로 살펴보세요."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "잘못된 레코드 위치: %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "%X/%X에서 contrecord를 필요로 함"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "잘못된 레코드 길이: %X/%X, 기대값 %u, 실재값 %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "%u 길이 레코드를 디코드 작업을 위한 메모리가 부족함"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "너무 긴 길이(%u)의 레코드가 %X/%X에 있음"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "%X/%X 위치에 contrecord 플래그가 없음"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "잘못된 contrecord 길이 %u (기대값: %lld), 위치 %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "%X/%X 위치에 contrecord 없음"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "잘못된 자원 관리 ID %u, 위치: %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "레코드의 잘못된 프리링크 %X/%X, 해당 레코드 %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "잘못된 자원관리자 데이터 체크섬, 위치: %X/%X 레코드"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "%04X 매직 번호가 잘못됨, 로그 파일 %s, 위치 %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "잘못된 정보 비트 %04X, 로그 파일 %s, 위치 %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid ""
+"WAL file is from different database system: WAL file database system "
+"identifier is %llu, pg_control database system identifier is %llu"
+msgstr ""
+"WAL 파일이 다른 시스템의 것입니다. WAL 파일의 시스템 식별자는 %llu, "
+"pg_control 의 식별자는 %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect segment size in page "
+"header"
+msgstr ""
+"WAL 파일이 다른 데이터베이스 시스템의 것입니다: 페이지 헤더에 지정된 값이 잘"
+"못된 조각 크기임"
+
+#: xlogreader.c:1274
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect XLOG_BLCKSZ in page "
+"header"
+msgstr ""
+"WAL 파일이 다른 데이터베이스 시스템의 것입니다: 페이지 헤더의 XLOG_BLCKSZ 값"
+"이 바르지 않음"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "잘못된 페이지 주소 %X/%X, 로그 파일 %s, 위치 %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "타임라인 범위 벗어남 %u (이전 번호 %u), 로그 파일 %s, 위치 %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "%u block_id는 범위를 벗어남, 위치 %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA 지정했지만, %X/%X 에 자료가 없음"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA 지정 않았지만, %u 길이의 자료가 있음, 위치 %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid ""
+"BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at "
+"%X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE 설정이 되어 있지만, 옵셋: %u, 길이: %u, 블록 이미지 길이: "
+"%u, 대상: %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE 설정이 안되어 있지만, 옵셋: %u, 길이: %u, 대상: %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_COMPRESSED 설정이 되어 있지만, 블록 이미지 길이: %u, 대상: %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid ""
+"neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image "
+"length is %u at %X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE, BKPIMAGE_COMPRESSED 지정 안되어 있으나, 블록 이미지 길이"
+"는 %u, 대상: %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL 설정이 되어 있지만, %X/%X 에 이전 릴레이션 없음"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "잘못된 block_id %u, 위치 %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "잘못된 레코드 길이, 위치 %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "WAL 레코드에서 %d ID의 백업 블록 위치를 바르게 잡을 수 없음"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "%X/%X 위치에 이미지를 복원할 수 없음, 해당 %d 블록이 깨졌음"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "이미지 복원 실패, 잘못된 상태의 압축 이미지, 위치 %X/%X, 블록 %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with %s not supported by build, "
+"block %d"
+msgstr ""
+"%X/%X 압축 위치에 이미지 복원할 수 없음, %s 압축을 지원하지 않음, 해당 블록: "
+"%d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr ""
+"%X/%X 압축 위치에 이미지 복원할 수 없음, 알 수 없은 방법, 해당 블록: %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "압축 이미지 풀기 실패, 위치 %X/%X, 블록 %d"
diff --git a/src/bin/pg_waldump/po/ru.po b/src/bin/pg_waldump/po/ru.po
new file mode 100644
index 0000000..6d05882
--- /dev/null
+++ b/src/bin/pg_waldump/po/ru.po
@@ -0,0 +1,654 @@
+# Russian message translation file for pg_waldump
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2017, 2018, 2019, 2020, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 09:09+0300\n"
+"PO-Revision-Date: 2023-08-30 15:41+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробности: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подсказка: "
+
+#: pg_waldump.c:160
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалось открыть файл \"%s\": %m"
+
+#: pg_waldump.c:216
+#, c-format
+msgid ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL "
+"file \"%s\" header specifies %d byte"
+msgid_plural ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL "
+"file \"%s\" header specifies %d bytes"
+msgstr[0] ""
+"Размер сегмента WAL должен задаваться степенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но в заголовке файла WAL \"%s\" указано значение: %d"
+msgstr[1] ""
+"Размер сегмента WAL должен задаваться степенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но в заголовке файла WAL \"%s\" указано значение: %d"
+msgstr[2] ""
+"Размер сегмента WAL должен задаваться степенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но в заголовке файла WAL \"%s\" указано значение: %d"
+
+#: pg_waldump.c:222
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не удалось прочитать файл \"%s\": %m"
+
+#: pg_waldump.c:225
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %d)"
+
+#: pg_waldump.c:286
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "не удалось найти файл WAL \"%s\""
+
+#: pg_waldump.c:288
+#, c-format
+msgid "could not find any WAL file"
+msgstr "не удалось найти ни одного файла WAL"
+
+#: pg_waldump.c:329
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "не удалось найти файл \"%s\": %m"
+
+#: pg_waldump.c:378
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "не удалось прочитать из файла %s по смещению %d: %m"
+
+#: pg_waldump.c:382
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr ""
+"не удалось прочитать из файла %s по смещению %d (прочитано байт: %d из %d)"
+
+#: pg_waldump.c:658
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s декодирует и показывает журналы предзаписи PostgreSQL для целей отладки.\n"
+"\n"
+
+#: pg_waldump.c:660
+#, c-format
+msgid "Usage:\n"
+msgstr "Использование:\n"
+
+#: pg_waldump.c:661
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [ПАРАМЕТР]... [НАЧАЛЬНЫЙ_СЕГМЕНТ [КОНЕЧНЫЙ_СЕГМЕНТ]]\n"
+
+#: pg_waldump.c:662
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметры:\n"
+
+#: pg_waldump.c:663
+#, c-format
+msgid ""
+" -b, --bkp-details output detailed information about backup blocks\n"
+msgstr ""
+" -b, --bkp-details вывести подробную информацию о копиях страниц\n"
+
+#: pg_waldump.c:664
+#, c-format
+msgid ""
+" -B, --block=N with --relation, only show records that modify "
+"block N\n"
+msgstr ""
+" -B, --block=N в сочетании с --relation указывает выводить только\n"
+" записи, в которых меняется блок N\n"
+
+# well-spelled: ПОЗЗАП
+#: pg_waldump.c:665
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr ""
+" -e, --end=ПОЗЗАП прекратить чтение в заданной позиции записи в WAL\n"
+
+#: pg_waldump.c:666
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr ""
+" -f, --follow повторять попытки чтения по достижении конца WAL\n"
+
+# well-spelled: МНГР
+#: pg_waldump.c:667
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=СЛОЙ выводить только записи, в которых меняются блоки в "
+"СЛОЕ\n"
+" с именем из списка: main, fsm, vm, init\n"
+
+#: pg_waldump.c:669
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N число выводимых записей\n"
+
+# skip-rule: space-before-period
+#: pg_waldump.c:670
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find log segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/"
+"pg_wal)\n"
+msgstr ""
+" -p, --path=ПУТЬ каталог, где нужно искать файлы сегментов журнала, "
+"или\n"
+" каталог с подкаталогом ./pg_wal, содержащим такие "
+"файлы\n"
+" (по умолчанию: текущий каталог,\n"
+" ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:673
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet не выводить никаких сообщений, кроме ошибок\n"
+
+# well-spelled: МНГР
+#: pg_waldump.c:674
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager "
+"RMGR;\n"
+" use --rmgr=list to list valid resource manager "
+"names\n"
+msgstr ""
+" -r, --rmgr=МНГР выводить записи только менеджера ресурсов МНГР;\n"
+" для просмотра списка доступных менеджеров ресурсов\n"
+" укажите --rmgr=list\n"
+
+#: pg_waldump.c:676
+#, c-format
+msgid ""
+" -R, --relation=T/D/R only show records that modify blocks in relation T/"
+"D/R\n"
+msgstr ""
+" -R, --relation=T/D/R выводить только записи, в которых меняются блоки\n"
+" в отношении T/D/R\n"
+
+# well-spelled: ПОЗЗАП
+#: pg_waldump.c:677
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr ""
+" -s, --start=ПОЗЗАП начать чтение с заданной позиции записи в WAL\n"
+
+# well-spelled: ЛВР
+#: pg_waldump.c:678
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read log records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=ЛВР линия времени, записи которой будут прочитаны\n"
+" (по умолчанию: 1 или линия, определяемая "
+"аргументом\n"
+" НАЧАЛЬНЫЙ_СЕГМЕНТ)\n"
+
+#: pg_waldump.c:680
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: pg_waldump.c:681
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr ""
+" -w, --fullpage выводить только записи, содержащие полные страницы\n"
+
+#: pg_waldump.c:682
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr ""
+" -x, --xid=XID выводить только записи с заданным\n"
+" идентификатором транзакции\n"
+
+#: pg_waldump.c:683
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=record] показывать статистику вместо записей\n"
+" (также возможно получить статистику по записям)\n"
+
+#: pg_waldump.c:685
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: pg_waldump.c:686
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках сообщайте по адресу <%s>.\n"
+
+#: pg_waldump.c:687
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid "no arguments specified"
+msgstr "аргументы не указаны"
+
+#: pg_waldump.c:797
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "неверный номер блока: \"%s\""
+
+#: pg_waldump.c:806 pg_waldump.c:904
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "неверная позиция в WAL: \"%s\""
+
+#: pg_waldump.c:819
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "неверное имя слоя: \"%s\""
+
+#: pg_waldump.c:827
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неверное значение \"%s\" для параметра %s"
+
+#: pg_waldump.c:858
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "пользовательский менеджер ресурсов \"%s\" не существует"
+
+#: pg_waldump.c:879
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "менеджер ресурсов \"%s\" не существует"
+
+#: pg_waldump.c:894
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "неверное указание отношения: \"%s\""
+
+#: pg_waldump.c:895
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr ""
+"Ожидается \"OID табл. пространства/OID базы данных/файловый узел отношения\"."
+
+#: pg_waldump.c:914
+#, c-format
+msgid "invalid timeline specification: \"%s\""
+msgstr "неверное указание линии времени: \"%s\""
+
+#: pg_waldump.c:924
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "неверное указание ID транзакции: \"%s\""
+
+#: pg_waldump.c:939
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "нераспознанное значение параметра %s: %s"
+
+#: pg_waldump.c:953
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "параметр %s требует указания параметра %s"
+
+#: pg_waldump.c:960
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "слишком много аргументов командной строки (первый: \"%s\")"
+
+#: pg_waldump.c:970 pg_waldump.c:990
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не удалось открыть каталог \"%s\": %m"
+
+#: pg_waldump.c:996 pg_waldump.c:1026
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "не удалось открыть файл \"%s\""
+
+#: pg_waldump.c:1006
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "начальная позиция в WAL %X/%X находится не в файле \"%s\""
+
+#: pg_waldump.c:1033
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "КОНЕЧНЫЙ_СЕГМЕНТ %s меньше, чем НАЧАЛЬНЫЙ_СЕГМЕНТ %s"
+
+#: pg_waldump.c:1048
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "конечная позиция в WAL %X/%X находится не в файле \"%s\""
+
+#: pg_waldump.c:1060
+#, c-format
+msgid "no start WAL location given"
+msgstr "начальная позиция в WAL не задана"
+
+#: pg_waldump.c:1074
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "не удалось выделить память для чтения WAL"
+
+#: pg_waldump.c:1080
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "не удалось найти действительную запись после позиции %X/%X"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] ""
+"первая запись обнаружена после %X/%X, в позиции %X/%X, пропускается %u Б\n"
+msgstr[1] ""
+"первая запись обнаружена после %X/%X, в позиции %X/%X, пропускается %u Б\n"
+msgstr[2] ""
+"первая запись обнаружена после %X/%X, в позиции %X/%X, пропускается %u Б\n"
+
+#: pg_waldump.c:1171
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "ошибка в записи WAL в позиции %X/%X: %s"
+
+#: pg_waldump.c:1180
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Для дополнительной информации попробуйте \"%s --help\"."
+
+#: xlogreader.c:592
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "неверное смещение записи в позиции %X/%X"
+
+#: xlogreader.c:600
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "в позиции %X/%X запрошено продолжение записи"
+
+#: xlogreader.c:641 xlogreader.c:1106
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "неверная длина записи в позиции %X/%X: ожидалось %u, получено %u"
+
+#: xlogreader.c:730
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "нет флага contrecord в позиции %X/%X"
+
+#: xlogreader.c:743
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "неверная длина contrecord: %u (ожидалась %lld) в позиции %X/%X"
+
+#: xlogreader.c:1114
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "неверный ID менеджера ресурсов %u в позиции %X/%X"
+
+#: xlogreader.c:1127 xlogreader.c:1143
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "запись с неверной ссылкой назад %X/%X в позиции %X/%X"
+
+#: xlogreader.c:1181
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr ""
+"некорректная контрольная сумма данных менеджера ресурсов в записи в позиции "
+"%X/%X"
+
+#: xlogreader.c:1218
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "неверное магическое число %04X в сегменте журнала %s, смещение %u"
+
+#: xlogreader.c:1232 xlogreader.c:1273
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "неверные информационные биты %04X в сегменте журнала %s, смещение %u"
+
+#: xlogreader.c:1247
+#, c-format
+msgid ""
+"WAL file is from different database system: WAL file database system "
+"identifier is %llu, pg_control database system identifier is %llu"
+msgstr ""
+"файл WAL принадлежит другой СУБД: в нём указан идентификатор системы БД "
+"%llu, а идентификатор системы pg_control: %llu"
+
+#: xlogreader.c:1255
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect segment size in page "
+"header"
+msgstr ""
+"файл WAL принадлежит другой СУБД: некорректный размер сегмента в заголовке "
+"страницы"
+
+#: xlogreader.c:1261
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect XLOG_BLCKSZ in page "
+"header"
+msgstr ""
+"файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке "
+"страницы"
+
+#: xlogreader.c:1292
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "неожиданный pageaddr %X/%X в сегменте журнала %s, смещение %u"
+
+#: xlogreader.c:1317
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr ""
+"нарушение последовательности ID линии времени %u (после %u) в сегменте "
+"журнала %s, смещение %u"
+
+#: xlogreader.c:1722
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "идентификатор блока %u идёт не по порядку в позиции %X/%X"
+
+#: xlogreader.c:1746
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA установлен, но данных в позиции %X/%X нет"
+
+#: xlogreader.c:1753
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr ""
+"BKPBLOCK_HAS_DATA не установлен, но длина данных равна %u в позиции %X/%X"
+
+#: xlogreader.c:1789
+#, c-format
+msgid ""
+"BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at "
+"%X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE установлен, но для пропуска заданы смещение %u и длина %u "
+"при длине образа блока %u в позиции %X/%X"
+
+#: xlogreader.c:1805
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE не установлен, но для пропуска заданы смещение %u и длина "
+"%u в позиции %X/%X"
+
+#: xlogreader.c:1819
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_COMPRESSED установлен, но длина образа блока равна %u в позиции %X/"
+"%X"
+
+#: xlogreader.c:1834
+#, c-format
+msgid ""
+"neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image "
+"length is %u at %X/%X"
+msgstr ""
+"ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_COMPRESSED не установлены, но длина образа "
+"блока равна %u в позиции %X/%X"
+
+#: xlogreader.c:1850
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr ""
+"BKPBLOCK_SAME_REL установлен, но предыдущее значение не задано в позиции %X/"
+"%X"
+
+#: xlogreader.c:1862
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "неверный идентификатор блока %u в позиции %X/%X"
+
+#: xlogreader.c:1929
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "запись с неверной длиной в позиции %X/%X"
+
+#: xlogreader.c:1954
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "не удалось найти копию блока с ID %d в записи журнала WAL"
+
+#: xlogreader.c:2038
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr ""
+"не удалось восстановить образ в позиции %X/%X с указанным неверным блоком %d"
+
+#: xlogreader.c:2045
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr ""
+"не удалось восстановить образ в позиции %X/%X с неверным состоянием, блок %d"
+
+#: xlogreader.c:2072 xlogreader.c:2089
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with %s not supported by build, "
+"block %d"
+msgstr ""
+"не удалось восстановить образ в позиции %X/%X, сжатый методом %s, который не "
+"поддерживается этой сборкой, блок %d"
+
+#: xlogreader.c:2098
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr ""
+"не удалось восстановить образ в позиции %X/%X, сжатый неизвестным методом, "
+"блок %d"
+
+#: xlogreader.c:2106
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "не удалось развернуть образ в позиции %X/%X, блок %d"
+
+#, c-format
+#~ msgid "out of memory while trying to decode a record of length %u"
+#~ msgstr "не удалось выделить память для декодирования записи длины %u"
+
+#, c-format
+#~ msgid "record length %u at %X/%X too long"
+#~ msgstr "длина записи %u в позиции %X/%X слишком велика"
+
+#, c-format
+#~ msgid "missing contrecord at %X/%X"
+#~ msgstr "нет записи contrecord в %X/%X"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "%s: FATAL: "
+#~ msgstr "%s: СБОЙ: "
+
+#~ msgid "could not parse \"%s\" as a transaction ID"
+#~ msgstr "не удалось разобрать в \"%s\" идентификатор транзакции"
+
+#~ msgid "could not parse limit \"%s\""
+#~ msgstr "не удалось разобрать предел в \"%s\""
+
+#~ msgid "could not parse start WAL location \"%s\""
+#~ msgstr "не удалось разобрать начальную позицию в WAL \"%s\""
+
+#~ msgid "could not parse timeline \"%s\""
+#~ msgstr "не удалось разобрать линию времени в \"%s\""
+
+#~ msgid "could not seek in log file %s to offset %u: %s"
+#~ msgstr "не удалось переместиться в файле журнала %s к смещению %u: %s"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "not enough data in file \"%s\""
+#~ msgstr "недостаточно данных в файле \"%s\""
+
+#~ msgid "out of memory"
+#~ msgstr "нехватка памяти"
+
+#~ msgid "path \"%s\" could not be opened: %s"
+#~ msgstr "не удалось открыть путь \"%s\": %s"
diff --git a/src/bin/pg_waldump/po/sv.po b/src/bin/pg_waldump/po/sv.po
new file mode 100644
index 0000000..88bcb98
--- /dev/null
+++ b/src/bin/pg_waldump/po/sv.po
@@ -0,0 +1,534 @@
+# Swedish message translation file for pg_waldump
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Dennis Björklund <db@zigo.dhs.org>, 2017, 2018, 2019, 2020, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-29 11:47+0000\n"
+"PO-Revision-Date: 2022-09-29 21:43+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: pg_waldump.c:160
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: pg_waldump.c:216
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men headern i WAL-filen \"%s\" anger %d byte"
+msgstr[1] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men headern i WAL-filen \"%s\" anger %d byte"
+
+#: pg_waldump.c:222
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "kunde inte läsa fil \"%s\": %m"
+
+#: pg_waldump.c:225
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "kunde inte läsa fil \"%s\": läste %d av %d"
+
+#: pg_waldump.c:286
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "kunde inte lokalisera WAL-fil \"%s\""
+
+#: pg_waldump.c:288
+#, c-format
+msgid "could not find any WAL file"
+msgstr "kunde inte hitta några WAL-filer"
+
+#: pg_waldump.c:329
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "kunde inte hitta filen \"%s\": %m"
+
+#: pg_waldump.c:378
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "Kunde inte läsa från fil %s på offset %d: %m"
+
+#: pg_waldump.c:382
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "kunde inte läsa från fil %s, offset %d, läste %d av %d"
+
+#: pg_waldump.c:658
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr "%s avkodar och visar PostgreSQLs write-ahead-logg för debuggning.\n"
+
+#: pg_waldump.c:660
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_waldump.c:661
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [FLAGGA]... [STARTSEG [SLUTSEG]]\n"
+
+#: pg_waldump.c:662
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Flaggor:\n"
+
+#: pg_waldump.c:663
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details skriv detaljerad information om backupblock\n"
+
+#: pg_waldump.c:664
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr ""
+" -B, --block=N tillsammans med --relation, visa bara poster som\n"
+" modifierar block N\n"
+
+#: pg_waldump.c:665
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR stoppa läsning vid WAL-position RECPTR\n"
+
+#: pg_waldump.c:666
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow fortsätt försök efter att ha nått slutet av WAL\n"
+
+#: pg_waldump.c:667
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=GREN visa bara poster som modifierar block i grenen GREN\n"
+" gilriga namn är main, fsm, vm och init\n"
+
+#: pg_waldump.c:669
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N antal poster att visa\n"
+
+#: pg_waldump.c:670
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find log segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=SÖKVÄG katalog där man hittar loggsegmentfiler eller en\n"
+" katalog med en ./pg_wal som innehåller sådana filer\n"
+" (standard: aktuell katalog, ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:673
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet skriv inte ut några meddelanden förutom fel\n"
+
+#: pg_waldump.c:674
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR visa bara poster skapade av resurshanteraren RMGR;\n"
+" använd --rmgr=list för att lista giltiga resurshanterarnamn\n"
+
+#: pg_waldump.c:676
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr ""
+" -R, --relation=T/D/R visa bara poster som modifierar block i\n"
+" relationen T/D/R\n"
+
+#: pg_waldump.c:677
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR börja läsning vid WAL-position RECPTR\n"
+
+#: pg_waldump.c:678
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read log records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI tidslinje från vilken vi läser loggposter\n"
+" (standard: 1 eller värdet som används i STARTSEG)\n"
+
+#: pg_waldump.c:680
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_waldump.c:681
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage visa bara poster som skrivit hela sidor\n"
+
+#: pg_waldump.c:682
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID visa baras poster med transaktions-ID XID\n"
+
+#: pg_waldump.c:683
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=post] visa statistik istället för poster\n"
+" (alternativt, visa statistik per post)\n"
+
+#: pg_waldump.c:685
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa den här hjälpen, avsluta sedan\n"
+
+#: pg_waldump.c:686
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: pg_waldump.c:687
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid "no arguments specified"
+msgstr "inga argument angivna"
+
+#: pg_waldump.c:797
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "ogiltigt portnummer \"%s\""
+
+#: pg_waldump.c:806 pg_waldump.c:904
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "ogiltig WAL-position: \"%s\""
+
+#: pg_waldump.c:819
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "ogiltigt fork-namn: \"%s\""
+
+#: pg_waldump.c:827
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ogiltigt värde \"%s\" för flaggan \"%s\""
+
+#: pg_waldump.c:858
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "egendefinierad resurshanterare \"%s\" finns inte"
+
+#: pg_waldump.c:879
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "resurshanterare \"%s\" finns inte"
+
+#: pg_waldump.c:894
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "ogiltig inställning av relation: \"%s\""
+
+#: pg_waldump.c:895
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "Skall vara en av \"OID för tabellutrymme/OID för databas/relations filnod\"."
+
+#: pg_waldump.c:914
+#, c-format
+msgid "invalid timeline specification: \"%s\""
+msgstr "ogiltig inställning av tidslinje: %s"
+
+#: pg_waldump.c:924
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "ogiltig inställning av transaktions-ID: %s"
+
+#: pg_waldump.c:939
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "okänt värde för flaggan %s: %s"
+
+#: pg_waldump.c:953
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "flaggan %s kräver att flaggan %s också anges"
+
+#: pg_waldump.c:960
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_waldump.c:970 pg_waldump.c:990
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "kunde inte öppna katalog \"%s\": %m"
+
+#: pg_waldump.c:996 pg_waldump.c:1026
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "kunde inte öppna filen \"%s\""
+
+#: pg_waldump.c:1006
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "start-WAL-position %X/%X är inte i filen \"%s\""
+
+#: pg_waldump.c:1033
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "SLUTSEG %s är före STARTSEG %s"
+
+#: pg_waldump.c:1048
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "slut-WAL-position %X/%X är inte i filen \"%s\""
+
+#: pg_waldump.c:1060
+#, c-format
+msgid "no start WAL location given"
+msgstr "ingen start-WAL-position angiven"
+
+#: pg_waldump.c:1074
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "slut på minne vid allokering av en WAL-läs-processor"
+
+#: pg_waldump.c:1080
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "kunde inte hitta en giltig post efter %X/%X"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "första posten efter %X/%X, vid %X/%X, hoppar över %u byte\n"
+msgstr[1] "första posten efter %X/%X, vid %X/%X, hoppar över %u byte\n"
+
+#: pg_waldump.c:1171
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "fel i WAL-post vid %X/%X: %s"
+
+#: pg_waldump.c:1180
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "ogiltig postoffset vid %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord är begärd vid %X/%X"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "ogiltig postlängd vid %X/%X: förväntade %u, fick %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "slut på minne vid avkodning av post med längden %u"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "postlängd %u vid %X/%X är för lång"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "det finns ingen contrecord-flagga vid %X/%X"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "ogiltig contrecord-längd %u (förväntade %lld) vid %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "det saknas en contrecord vid %X/%X"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ogiltigt resurshanterar-ID %u vid %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "post med inkorrekt prev-link %X/%X vid %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "felaktig resurshanterardatakontrollsumma i post vid %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "felaktigt magiskt nummer %04X i loggsegment %s, offset %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "ogiltiga infobitar %04X i loggsegment %s, offset %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "WAL-fil är från ett annat databassystem: WAL-filens databassystemidentifierare är %llu, pg_control databassystemidentifierare är %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL-fil är från ett annat databassystem: inkorrekt segmentstorlek i sidhuvud"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL-fil är från ett annat databassystem: inkorrekt XLOG_BLCKSZ i sidhuvud"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "oväntad sidadress %X/%X i loggsegment %s, offset %u"
+
+# FIXME
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "\"ej i sekvens\"-fel på tidslinje-ID %u (efter %u) i loggsegment %s, offset %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "\"ej i sekvens\"-block_id %u vid %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA är satt men ingen data inkluderad vid %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA är ej satt men datalängden är %u vid %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE är satt men håloffset %u längd %u block-image-längd %u vid %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE är inte satt men håloffset %u längd %u vid %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED är satt men block-image-längd %u vid %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "varken BKPIMAGE_HAS_HOLE eller BKPIMAGE_COMPRESSED är satt men block-image-längd är %u vid %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL är satt men ingen tidigare rel vid %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "ogiltig block_id %u vid %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "post med ogiltig längd vid %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "kunde inte hitta backup-block med ID %d i WAL-post"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "kunde inte återställa avbild vid %X/%X med ogiltigt block %d angivet"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "kunde inte återställa image vid %X/%X med ogiltigt state, block %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "kunde inte återställa image vid %X/%X, komprimerad med %s stöds inte av bygget, block %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "kunde inte återställa image vid %X/%X, komprimerad med okänd metod, block %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "kunde inte packa upp image vid %X/%X, block %d"
diff --git a/src/bin/pg_waldump/po/uk.po b/src/bin/pg_waldump/po/uk.po
new file mode 100644
index 0000000..bb5b065
--- /dev/null
+++ b/src/bin/pg_waldump/po/uk.po
@@ -0,0 +1,515 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-01-31 23:17+0000\n"
+"PO-Revision-Date: 2023-04-19 15:06\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_waldump.pot\n"
+"X-Crowdin-File-ID: 904\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередження: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: pg_waldump.c:160
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: pg_waldump.c:216
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "Розмір сегмента WAL повинен задаватись ступенем двійки в інтервалі між 1 MB і 1 GB, але у заголовку файлу WAL \"%s\" вказано %d байт"
+msgstr[1] "Розмір сегмента WAL повинен задаватись ступенем двійки в інтервалі між 1 MB і 1 GB, але у заголовку файлу WAL \"%s\" вказано %d байти"
+msgstr[2] "Розмір сегмента WAL повинен задаватись ступенем двійки в інтервалі між 1 MB і 1 GB, але у заголовку файлу WAL \"%s\" вказано %d байтів"
+msgstr[3] "Розмір сегмента WAL повинен задаватись ступенем двійки в інтервалі між 1 MB і 1 GB, але у заголовку файлу WAL \"%s\" вказано %d байтів"
+
+#: pg_waldump.c:222
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не вдалося прочитати файл \"%s\": %m"
+
+#: pg_waldump.c:225
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "не вдалося прочитати файл \"%s\": прочитано %d з %d"
+
+#: pg_waldump.c:286
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "не вдалося знайти WAL файл \"%s\""
+
+#: pg_waldump.c:288
+#, c-format
+msgid "could not find any WAL file"
+msgstr "не вдалося знайти жодного WAL файлу"
+
+#: pg_waldump.c:329
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "не вдалося знайти файл \"%s\": %m"
+
+#: pg_waldump.c:378
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "не вдалося прочитати файл %s, зсув %d: %m"
+
+#: pg_waldump.c:382
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "не вдалося прочитати з файлу %s, зсув %d: прочитано %d з %d"
+
+#: pg_waldump.c:658
+#, c-format
+msgid "%s decodes and displays PostgreSQL write-ahead logs for debugging.\n\n"
+msgstr "%s декодує і відображає журнали попереднього запису PostgreSQL для налагодження.\n\n"
+
+#: pg_waldump.c:660
+#, c-format
+msgid "Usage:\n"
+msgstr "Використання:\n"
+
+#: pg_waldump.c:661
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [OPTION]...[STARTSEG [ENDSEG]]\n"
+
+#: pg_waldump.c:662
+#, c-format
+msgid "\n"
+"Options:\n"
+msgstr "\n"
+"Параметри:\n"
+
+#: pg_waldump.c:663
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details виводити детальну інформацію про блоки резервних копій\n"
+
+#: pg_waldump.c:664
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr " -B, --block=N з --relation, лише показати записи, які змінюють блок N\n"
+
+#: pg_waldump.c:665
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR зупинити читання WAL з місця RECPTR\n"
+
+#: pg_waldump.c:666
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow повторювати спроби після досягнення кінця WAL\n"
+
+#: pg_waldump.c:667
+#, c-format
+msgid " -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr " -F, --fork=FORK показати лише записи, які змінюють блоки в форці FORK;\n"
+" дійсні імена: main, fsm, vm, init\n"
+
+#: pg_waldump.c:669
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N число записів для відображення\n"
+
+#: pg_waldump.c:670
+#, c-format
+msgid " -p, --path=PATH directory in which to find log segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr " -p, --path=PATH каталог, у якому шукати файли сегментів журналу \n"
+"або каталог з ./pg_wal, що містить такі файли (за замовчуванням: чинний каталог, ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:673
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet не друкувати жодного виводу, окрім помилок\n"
+
+#: pg_waldump.c:674
+#, c-format
+msgid " -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr " -r, --rmgr=RMGR відображати записи, згенеровані лише ресурсним менеджером RMGR;\n"
+" використовувати --rmgr=list для перегляду списку припустимих імен ресурсного менеджера\n"
+
+#: pg_waldump.c:676
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr " -R, --relation=T/D/R відобразити тільки записи, які змінюють блоки у відношенні T/D/R\n"
+
+#: pg_waldump.c:677
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR почати читання WAL з місця RECPTR\n"
+
+#: pg_waldump.c:678
+#, c-format
+msgid " -t, --timeline=TLI timeline from which to read log records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr " -t, --timeline=TLI часова шкала, записи якої будуть прочитані (за замовчуванням: 1 або значення, що використовується у STARTSEG)\n"
+
+#: pg_waldump.c:680
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію і вийти\n"
+
+#: pg_waldump.c:681
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage показувати записи лише з повним записом на сторінці\n"
+
+#: pg_waldump.c:682
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID показати записи лише з ідентифікатором транзакцій XID\n"
+
+#: pg_waldump.c:683
+#, c-format
+msgid " -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr " -z, --stats[=record] показати статистику замість записів (необов'язково, відобразити щорядкову статистику)\n"
+
+#: pg_waldump.c:685
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку потім вийти\n"
+
+#: pg_waldump.c:686
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"Повідомляти про помилки на <%s>.\n"
+
+#: pg_waldump.c:687
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid "no arguments specified"
+msgstr "не вказано аргументів"
+
+#: pg_waldump.c:797
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "неприпустимий номер блоку: \"%s\""
+
+#: pg_waldump.c:806 pg_waldump.c:904
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "неприпустиме розташування WAL: \"%s\""
+
+#: pg_waldump.c:819
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "неприпустиме ім'я форку: \"%s\""
+
+#: pg_waldump.c:827
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неприпустиме значення \"%s\" для параметра %s"
+
+#: pg_waldump.c:858
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "користувацький менеджер ресурсів \"%s\" не існує"
+
+#: pg_waldump.c:879
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "менеджер ресурсів \"%s\" не існує"
+
+#: pg_waldump.c:894
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "неприпустима специфікація відношення: \"%s\""
+
+#: pg_waldump.c:895
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "Очікуємо \"tablespace OID/database OID/relation filenode\"."
+
+#: pg_waldump.c:914
+#, c-format
+msgid "invalid timeline specification: \"%s\""
+msgstr "неприпустима специфікація часової лінії: \"%s\""
+
+#: pg_waldump.c:924
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "неприпустима специфікація ідентифікатора транзакції: \"%s\""
+
+#: pg_waldump.c:939
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "нерозпізнане значення параметра %s: %s"
+
+#: pg_waldump.c:953
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "параметр %s вимагає використання параметру %s"
+
+#: pg_waldump.c:960
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному рядку (перший \"%s\")"
+
+#: pg_waldump.c:970 pg_waldump.c:990
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не вдалося відкрити каталог \"%s\": %m"
+
+#: pg_waldump.c:996 pg_waldump.c:1026
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "не вдалося відкрити файл \"%s\""
+
+#: pg_waldump.c:1006
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "початкове розташування WAL %X/%X не всередині файлу \"%s\""
+
+#: pg_waldump.c:1033
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "ENDSEG %s перед STARTSEG %s"
+
+#: pg_waldump.c:1048
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "кінцеве розташування WAL %X/%X не всередині файлу \"%s\""
+
+#: pg_waldump.c:1060
+#, c-format
+msgid "no start WAL location given"
+msgstr "не задано початкове розташування WAL"
+
+#: pg_waldump.c:1074
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "недостатньо пам'яті під час виділення обробника читання WAL"
+
+#: pg_waldump.c:1080
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "не вдалося знайти припустимий запис після %X/%X"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "перший запис після %X/%X, у %X/%X, пропускається %u байт\n"
+msgstr[1] "перший запис після %X/%X, у %X/%X, пропускається %u байти\n"
+msgstr[2] "перший запис після %X/%X, у %X/%X, пропускається %u байтів\n"
+msgstr[3] "перший запис після %X/%X, у %X/%X, пропускається %u байти\n"
+
+#: pg_waldump.c:1171
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "помилка у записі WAL у %X/%X: %s"
+
+#: pg_waldump.c:1180
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" для додаткової інформації."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "невірний зсув запису: %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "по зсуву %X/%X запитано продовження запису"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "невірна довжина запису по зсуву %X/%X: очікувалось %u, отримано %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "не вистачило пам'яті під час спроби закодування запису довжиною %u"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "довжина запису %u на %X/%X є задовгою"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "немає прапорця contrecord в позиції %X/%X"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "неприпустима довжина contrecord %u (очікувалось %lld) на %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "відсутній contrecord в %X/%X"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "невірний ID менеджера ресурсів %u в %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "запис з неправильним попереднім посиланням %X/%X на %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "некоректна контрольна сума даних менеджера ресурсів у запису по зсуву %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "невірне магічне число %04X в сегменті журналу %s, зсув %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "невірні інформаційні біти %04X в сегменті журналу %s, зсув %u"
+
+#: xlogreader.c:1260
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "WAL файл належить іншій системі баз даних: ідентифікатор системи баз даних де міститься WAL файл - %llu, а ідентифікатор системи баз даних pg_control - %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "Файл WAL належить іншій системі баз даних: некоректний розмір сегменту в заголовку сторінки"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "Файл WAL належить іншій системі баз даних: некоректний XLOG_BLCKSZ в заголовку сторінки"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "неочікуваний pageaddr %X/%X в сегменті журналу %s, зсув %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "порушення послідовності ID лінії часу %u (після %u) в сегменті журналу %s, зсув %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "ідентифікатор блока %u out-of-order в позиції %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA встановлений, але немає даних в позиції %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA встановлений, але довжина даних дорівнює %u в позиції %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE встановлений, але для пропуску задані: зсув %u, довжина %u, при довжині образу блока %u в позиції %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE не встановлений, але для пропуску задані: зсув %u, довжина %u в позиції %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED встановлений, але довжина образу блока дорівнює %u в позиції %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "ні BKPIMAGE_HAS_HOLE, ні BKPIMAGE_COMPRESSED не встановлені, але довжина образу блока дорівнює %u в позиції %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL встановлений, але попереднє значення не задано в позиції %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "невірний ідентифікатор блоку %u в позиції %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "запис з невірною довжиною на %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "не вдалося знайти блок резервної копії з ID %d у записі WAL"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "не вдалося відновити зображення %X/%X з недійсним вказаним блоком %d"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "не вдалося відновити зображення %X/%X з недійсним станом, блок %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "не вдалося відновити зображення в %X/%X, стиснуте %s, не підтримується збіркою, блок %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "не вдалося відновити зображення %X/%X стиснуте з невідомим методом, блок %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "не вдалося розпакувати зображення на %X/%X, блок %d"
+
diff --git a/src/bin/pg_waldump/rmgrdesc.c b/src/bin/pg_waldump/rmgrdesc.c
new file mode 100644
index 0000000..6b8c17b
--- /dev/null
+++ b/src/bin/pg_waldump/rmgrdesc.c
@@ -0,0 +1,99 @@
+/*
+ * rmgrdesc.c
+ *
+ * pg_waldump resource managers definition
+ *
+ * src/bin/pg_waldump/rmgrdesc.c
+ */
+#define FRONTEND 1
+#include "postgres.h"
+
+#include "access/brin_xlog.h"
+#include "access/clog.h"
+#include "access/commit_ts.h"
+#include "access/generic_xlog.h"
+#include "access/ginxlog.h"
+#include "access/gistxlog.h"
+#include "access/hash_xlog.h"
+#include "access/heapam_xlog.h"
+#include "access/multixact.h"
+#include "access/nbtxlog.h"
+#include "access/rmgr.h"
+#include "access/spgxlog.h"
+#include "access/xact.h"
+#include "access/xlog_internal.h"
+#include "catalog/storage_xlog.h"
+#include "commands/dbcommands_xlog.h"
+#include "commands/sequence.h"
+#include "commands/tablespace.h"
+#include "replication/message.h"
+#include "replication/origin.h"
+#include "rmgrdesc.h"
+#include "storage/standbydefs.h"
+#include "utils/relmapper.h"
+
+#define PG_RMGR(symname,name,redo,desc,identify,startup,cleanup,mask,decode) \
+ { name, desc, identify},
+
+static const RmgrDescData RmgrDescTable[RM_N_BUILTIN_IDS] = {
+#include "access/rmgrlist.h"
+};
+
+#define CUSTOM_NUMERIC_NAME_LEN sizeof("custom###")
+
+static char CustomNumericNames[RM_N_CUSTOM_IDS][CUSTOM_NUMERIC_NAME_LEN] = {{0}};
+static RmgrDescData CustomRmgrDesc[RM_N_CUSTOM_IDS] = {{0}};
+static bool CustomRmgrDescInitialized = false;
+
+/*
+ * No information on custom resource managers; just print the ID.
+ */
+static void
+default_desc(StringInfo buf, XLogReaderState *record)
+{
+ appendStringInfo(buf, "rmid: %d", XLogRecGetRmid(record));
+}
+
+/*
+ * No information on custom resource managers; just return NULL and let the
+ * caller handle it.
+ */
+static const char *
+default_identify(uint8 info)
+{
+ return NULL;
+}
+
+/*
+ * We are unable to get the real name of a custom rmgr because the module is
+ * not loaded. Generate a table of rmgrs with numeric names of the form
+ * "custom###", where "###" is the 3-digit resource manager ID.
+ */
+static void
+initialize_custom_rmgrs(void)
+{
+ for (int i = 0; i < RM_N_CUSTOM_IDS; i++)
+ {
+ snprintf(CustomNumericNames[i], CUSTOM_NUMERIC_NAME_LEN,
+ "custom%03d", i + RM_MIN_CUSTOM_ID);
+ CustomRmgrDesc[i].rm_name = CustomNumericNames[i];
+ CustomRmgrDesc[i].rm_desc = default_desc;
+ CustomRmgrDesc[i].rm_identify = default_identify;
+ }
+ CustomRmgrDescInitialized = true;
+}
+
+const RmgrDescData *
+GetRmgrDesc(RmgrId rmid)
+{
+ Assert(RmgrIdIsValid(rmid));
+
+ if (RmgrIdIsBuiltin(rmid))
+ return &RmgrDescTable[rmid];
+ else
+ {
+ if (!CustomRmgrDescInitialized)
+ initialize_custom_rmgrs();
+ return &CustomRmgrDesc[rmid - RM_MIN_CUSTOM_ID];
+ }
+}
diff --git a/src/bin/pg_waldump/rmgrdesc.h b/src/bin/pg_waldump/rmgrdesc.h
new file mode 100644
index 0000000..f733cd4
--- /dev/null
+++ b/src/bin/pg_waldump/rmgrdesc.h
@@ -0,0 +1,23 @@
+/*
+ * rmgrdesc.h
+ *
+ * pg_waldump resource managers declaration
+ *
+ * src/bin/pg_waldump/rmgrdesc.h
+ */
+#ifndef RMGRDESC_H
+#define RMGRDESC_H
+
+#include "access/xlogreader.h"
+#include "lib/stringinfo.h"
+
+typedef struct RmgrDescData
+{
+ const char *rm_name;
+ void (*rm_desc) (StringInfo buf, XLogReaderState *record);
+ const char *(*rm_identify) (uint8 info);
+} RmgrDescData;
+
+extern const RmgrDescData *GetRmgrDesc(RmgrId rmid);
+
+#endif /* RMGRDESC_H */
diff --git a/src/bin/pg_waldump/t/001_basic.pl b/src/bin/pg_waldump/t/001_basic.pl
new file mode 100644
index 0000000..883adff
--- /dev/null
+++ b/src/bin/pg_waldump/t/001_basic.pl
@@ -0,0 +1,13 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_waldump');
+program_version_ok('pg_waldump');
+program_options_handling_ok('pg_waldump');
+
+done_testing();
diff --git a/src/bin/pgbench/.gitignore b/src/bin/pgbench/.gitignore
new file mode 100644
index 0000000..983a3cd
--- /dev/null
+++ b/src/bin/pgbench/.gitignore
@@ -0,0 +1,4 @@
+/exprparse.c
+/exprscan.c
+/pgbench
+/tmp_check/
diff --git a/src/bin/pgbench/Makefile b/src/bin/pgbench/Makefile
new file mode 100644
index 0000000..f402fe7
--- /dev/null
+++ b/src/bin/pgbench/Makefile
@@ -0,0 +1,54 @@
+# src/bin/pgbench/Makefile
+
+PGFILEDESC = "pgbench - a simple program for running benchmark tests"
+PGAPPICON = win32
+
+subdir = src/bin/pgbench
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ exprparse.o \
+ pgbench.o
+
+override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+ifneq ($(PORTNAME), win32)
+override CFLAGS += $(PTHREAD_CFLAGS)
+endif
+LIBS += $(PTHREAD_LIBS)
+
+
+all: pgbench
+
+pgbench: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+# exprscan is compiled as part of exprparse
+exprparse.o: exprscan.c
+
+distprep: exprparse.c exprscan.c
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pgbench$(X) '$(DESTDIR)$(bindir)/pgbench$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pgbench$(X)'
+
+clean distclean:
+ rm -f pgbench$(X) $(OBJS)
+ rm -rf tmp_check
+
+maintainer-clean: distclean
+ rm -f exprparse.c exprscan.c
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pgbench/exprparse.c b/src/bin/pgbench/exprparse.c
new file mode 100644
index 0000000..b4e45dd
--- /dev/null
+++ b/src/bin/pgbench/exprparse.c
@@ -0,0 +1,2200 @@
+/* A Bison parser, made by GNU Bison 3.7.5. */
+
+/* Bison implementation for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+ simplifying the original so-called "semantic" parser. */
+
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+ especially those whose name start with YY_ or yy_. They are
+ private implementation details that can be changed or removed. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output, and Bison version. */
+#define YYBISON 30705
+
+/* Bison version string. */
+#define YYBISON_VERSION "3.7.5"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 1
+
+/* Push parsers. */
+#define YYPUSH 0
+
+/* Pull parsers. */
+#define YYPULL 1
+
+
+/* Substitute the variable and function names. */
+#define yyparse expr_yyparse
+#define yylex expr_yylex
+#define yyerror expr_yyerror
+#define yydebug expr_yydebug
+#define yynerrs expr_yynerrs
+
+/* First part of user prologue. */
+#line 1 "exprparse.y"
+
+/*-------------------------------------------------------------------------
+ *
+ * exprparse.y
+ * bison grammar for a simple expression syntax
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pgbench/exprparse.y
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include "pgbench.h"
+
+#define PGBENCH_NARGS_VARIABLE (-1)
+#define PGBENCH_NARGS_CASE (-2)
+#define PGBENCH_NARGS_HASH (-3)
+#define PGBENCH_NARGS_PERMUTE (-4)
+
+PgBenchExpr *expr_parse_result;
+
+static PgBenchExprList *make_elist(PgBenchExpr *exp, PgBenchExprList *list);
+static PgBenchExpr *make_null_constant(void);
+static PgBenchExpr *make_boolean_constant(bool bval);
+static PgBenchExpr *make_integer_constant(int64 ival);
+static PgBenchExpr *make_double_constant(double dval);
+static PgBenchExpr *make_variable(char *varname);
+static PgBenchExpr *make_op(yyscan_t yyscanner, const char *operator,
+ PgBenchExpr *lexpr, PgBenchExpr *rexpr);
+static PgBenchExpr *make_uop(yyscan_t yyscanner, const char *operator, PgBenchExpr *expr);
+static int find_func(yyscan_t yyscanner, const char *fname);
+static PgBenchExpr *make_func(yyscan_t yyscanner, int fnumber, PgBenchExprList *args);
+static PgBenchExpr *make_case(yyscan_t yyscanner, PgBenchExprList *when_then_list, PgBenchExpr *else_part);
+
+
+#line 116 "exprparse.c"
+
+# ifndef YY_CAST
+# ifdef __cplusplus
+# define YY_CAST(Type, Val) static_cast<Type> (Val)
+# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
+# else
+# define YY_CAST(Type, Val) ((Type) (Val))
+# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
+# endif
+# endif
+# ifndef YY_NULLPTR
+# if defined __cplusplus
+# if 201103L <= __cplusplus
+# define YY_NULLPTR nullptr
+# else
+# define YY_NULLPTR 0
+# endif
+# else
+# define YY_NULLPTR ((void*)0)
+# endif
+# endif
+
+
+/* Debug traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int expr_yydebug;
+#endif
+
+/* Token kinds. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ enum yytokentype
+ {
+ YYEMPTY = -2,
+ YYEOF = 0, /* "end of file" */
+ YYerror = 256, /* error */
+ YYUNDEF = 257, /* "invalid token" */
+ NULL_CONST = 258, /* NULL_CONST */
+ INTEGER_CONST = 259, /* INTEGER_CONST */
+ MAXINT_PLUS_ONE_CONST = 260, /* MAXINT_PLUS_ONE_CONST */
+ DOUBLE_CONST = 261, /* DOUBLE_CONST */
+ BOOLEAN_CONST = 262, /* BOOLEAN_CONST */
+ VARIABLE = 263, /* VARIABLE */
+ FUNCTION = 264, /* FUNCTION */
+ AND_OP = 265, /* AND_OP */
+ OR_OP = 266, /* OR_OP */
+ NOT_OP = 267, /* NOT_OP */
+ NE_OP = 268, /* NE_OP */
+ LE_OP = 269, /* LE_OP */
+ GE_OP = 270, /* GE_OP */
+ LS_OP = 271, /* LS_OP */
+ RS_OP = 272, /* RS_OP */
+ IS_OP = 273, /* IS_OP */
+ CASE_KW = 274, /* CASE_KW */
+ WHEN_KW = 275, /* WHEN_KW */
+ THEN_KW = 276, /* THEN_KW */
+ ELSE_KW = 277, /* ELSE_KW */
+ END_KW = 278, /* END_KW */
+ ISNULL_OP = 279, /* ISNULL_OP */
+ NOTNULL_OP = 280, /* NOTNULL_OP */
+ UNARY = 281 /* UNARY */
+ };
+ typedef enum yytokentype yytoken_kind_t;
+#endif
+
+/* Value type. */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+union YYSTYPE
+{
+#line 49 "exprparse.y"
+
+ int64 ival;
+ double dval;
+ bool bval;
+ char *str;
+ PgBenchExpr *expr;
+ PgBenchExprList *elist;
+
+#line 198 "exprparse.c"
+
+};
+typedef union YYSTYPE YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+
+int expr_yyparse (yyscan_t yyscanner);
+
+
+/* Symbol kind. */
+enum yysymbol_kind_t
+{
+ YYSYMBOL_YYEMPTY = -2,
+ YYSYMBOL_YYEOF = 0, /* "end of file" */
+ YYSYMBOL_YYerror = 1, /* error */
+ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */
+ YYSYMBOL_NULL_CONST = 3, /* NULL_CONST */
+ YYSYMBOL_INTEGER_CONST = 4, /* INTEGER_CONST */
+ YYSYMBOL_MAXINT_PLUS_ONE_CONST = 5, /* MAXINT_PLUS_ONE_CONST */
+ YYSYMBOL_DOUBLE_CONST = 6, /* DOUBLE_CONST */
+ YYSYMBOL_BOOLEAN_CONST = 7, /* BOOLEAN_CONST */
+ YYSYMBOL_VARIABLE = 8, /* VARIABLE */
+ YYSYMBOL_FUNCTION = 9, /* FUNCTION */
+ YYSYMBOL_AND_OP = 10, /* AND_OP */
+ YYSYMBOL_OR_OP = 11, /* OR_OP */
+ YYSYMBOL_NOT_OP = 12, /* NOT_OP */
+ YYSYMBOL_NE_OP = 13, /* NE_OP */
+ YYSYMBOL_LE_OP = 14, /* LE_OP */
+ YYSYMBOL_GE_OP = 15, /* GE_OP */
+ YYSYMBOL_LS_OP = 16, /* LS_OP */
+ YYSYMBOL_RS_OP = 17, /* RS_OP */
+ YYSYMBOL_IS_OP = 18, /* IS_OP */
+ YYSYMBOL_CASE_KW = 19, /* CASE_KW */
+ YYSYMBOL_WHEN_KW = 20, /* WHEN_KW */
+ YYSYMBOL_THEN_KW = 21, /* THEN_KW */
+ YYSYMBOL_ELSE_KW = 22, /* ELSE_KW */
+ YYSYMBOL_END_KW = 23, /* END_KW */
+ YYSYMBOL_ISNULL_OP = 24, /* ISNULL_OP */
+ YYSYMBOL_NOTNULL_OP = 25, /* NOTNULL_OP */
+ YYSYMBOL_26_ = 26, /* '<' */
+ YYSYMBOL_27_ = 27, /* '>' */
+ YYSYMBOL_28_ = 28, /* '=' */
+ YYSYMBOL_29_ = 29, /* '|' */
+ YYSYMBOL_30_ = 30, /* '#' */
+ YYSYMBOL_31_ = 31, /* '&' */
+ YYSYMBOL_32_ = 32, /* '~' */
+ YYSYMBOL_33_ = 33, /* '+' */
+ YYSYMBOL_34_ = 34, /* '-' */
+ YYSYMBOL_35_ = 35, /* '*' */
+ YYSYMBOL_36_ = 36, /* '/' */
+ YYSYMBOL_37_ = 37, /* '%' */
+ YYSYMBOL_UNARY = 38, /* UNARY */
+ YYSYMBOL_39_ = 39, /* ',' */
+ YYSYMBOL_40_ = 40, /* '(' */
+ YYSYMBOL_41_ = 41, /* ')' */
+ YYSYMBOL_YYACCEPT = 42, /* $accept */
+ YYSYMBOL_result = 43, /* result */
+ YYSYMBOL_elist = 44, /* elist */
+ YYSYMBOL_expr = 45, /* expr */
+ YYSYMBOL_when_then_list = 46, /* when_then_list */
+ YYSYMBOL_case_control = 47, /* case_control */
+ YYSYMBOL_function = 48 /* function */
+};
+typedef enum yysymbol_kind_t yysymbol_kind_t;
+
+
+
+
+#ifdef short
+# undef short
+#endif
+
+/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
+ <limits.h> and (if available) <stdint.h> are included
+ so that the code can choose integer types of a good width. */
+
+#ifndef __PTRDIFF_MAX__
+# include <limits.h> /* INFRINGES ON USER NAME SPACE */
+# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stdint.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_STDINT_H
+# endif
+#endif
+
+/* Narrow types that promote to a signed type and that can represent a
+ signed or unsigned integer of at least N bits. In tables they can
+ save space and decrease cache pressure. Promoting to a signed type
+ helps avoid bugs in integer arithmetic. */
+
+#ifdef __INT_LEAST8_MAX__
+typedef __INT_LEAST8_TYPE__ yytype_int8;
+#elif defined YY_STDINT_H
+typedef int_least8_t yytype_int8;
+#else
+typedef signed char yytype_int8;
+#endif
+
+#ifdef __INT_LEAST16_MAX__
+typedef __INT_LEAST16_TYPE__ yytype_int16;
+#elif defined YY_STDINT_H
+typedef int_least16_t yytype_int16;
+#else
+typedef short yytype_int16;
+#endif
+
+/* Work around bug in HP-UX 11.23, which defines these macros
+ incorrectly for preprocessor constants. This workaround can likely
+ be removed in 2023, as HPE has promised support for HP-UX 11.23
+ (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
+ <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>. */
+#ifdef __hpux
+# undef UINT_LEAST8_MAX
+# undef UINT_LEAST16_MAX
+# define UINT_LEAST8_MAX 255
+# define UINT_LEAST16_MAX 65535
+#endif
+
+#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST8_TYPE__ yytype_uint8;
+#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST8_MAX <= INT_MAX)
+typedef uint_least8_t yytype_uint8;
+#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
+typedef unsigned char yytype_uint8;
+#else
+typedef short yytype_uint8;
+#endif
+
+#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST16_TYPE__ yytype_uint16;
+#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST16_MAX <= INT_MAX)
+typedef uint_least16_t yytype_uint16;
+#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
+typedef unsigned short yytype_uint16;
+#else
+typedef int yytype_uint16;
+#endif
+
+#ifndef YYPTRDIFF_T
+# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
+# define YYPTRDIFF_T __PTRDIFF_TYPE__
+# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
+# elif defined PTRDIFF_MAX
+# ifndef ptrdiff_t
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# endif
+# define YYPTRDIFF_T ptrdiff_t
+# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
+# else
+# define YYPTRDIFF_T long
+# define YYPTRDIFF_MAXIMUM LONG_MAX
+# endif
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+# define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+# define YYSIZE_T size_t
+# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# else
+# define YYSIZE_T unsigned
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM \
+ YY_CAST (YYPTRDIFF_T, \
+ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \
+ ? YYPTRDIFF_MAXIMUM \
+ : YY_CAST (YYSIZE_T, -1)))
+
+#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
+
+
+/* Stored state numbers (used for stacks). */
+typedef yytype_int8 yy_state_t;
+
+/* State numbers in computations. */
+typedef int yy_state_fast_t;
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+# if ENABLE_NLS
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(Msgid) Msgid
+# endif
+#endif
+
+
+#ifndef YY_ATTRIBUTE_PURE
+# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define YY_ATTRIBUTE_PURE
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+# else
+# define YY_ATTRIBUTE_UNUSED
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E. */
+#if ! defined lint || defined __GNUC__
+# define YY_USE(E) ((void) (E))
+#else
+# define YY_USE(E) /* empty */
+#endif
+
+#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
+/* Suppress an incorrect diagnostic about yylval being uninitialized. */
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \
+ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+ _Pragma ("GCC diagnostic pop")
+#else
+# define YY_INITIAL_VALUE(Value) Value
+#endif
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
+#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
+# define YY_IGNORE_USELESS_CAST_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
+# define YY_IGNORE_USELESS_CAST_END \
+ _Pragma ("GCC diagnostic pop")
+#endif
+#ifndef YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_END
+#endif
+
+
+#define YY_ASSERT(E) ((void) (0 && (E)))
+
+#if !defined yyoverflow
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# elif defined __BUILTIN_VA_ARG_INCR
+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+# elif defined _AIX
+# define YYSTACK_ALLOC __alloca
+# elif defined _MSC_VER
+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+# define alloca _alloca
+# else
+# define YYSTACK_ALLOC alloca
+# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+ /* Use EXIT_SUCCESS as a witness for stdlib.h. */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's 'empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+# endif
+# else
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+# endif
+# if (defined __cplusplus && ! defined EXIT_SUCCESS \
+ && ! ((defined YYMALLOC || defined malloc) \
+ && (defined YYFREE || defined free)))
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if ! defined malloc && ! defined EXIT_SUCCESS
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if ! defined free && ! defined EXIT_SUCCESS
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# endif
+#endif /* !defined yyoverflow */
+
+#if (! defined yyoverflow \
+ && (! defined __cplusplus \
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ yy_state_t yyss_alloc;
+ YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
+ do \
+ { \
+ YYPTRDIFF_T yynewbytes; \
+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+ Stack = &yyptr->Stack_alloc; \
+ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / YYSIZEOF (*yyptr); \
+ } \
+ while (0)
+
+#endif
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from SRC to DST. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined __GNUC__ && 1 < __GNUC__
+# define YYCOPY(Dst, Src, Count) \
+ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))
+# else
+# define YYCOPY(Dst, Src, Count) \
+ do \
+ { \
+ YYPTRDIFF_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (Dst)[yyi] = (Src)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 25
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 320
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 42
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 7
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 47
+/* YYNSTATES -- Number of states. */
+#define YYNSTATES 88
+
+/* YYMAXUTOK -- Last valid token kind. */
+#define YYMAXUTOK 281
+
+
+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex, with out-of-bounds checking. */
+#define YYTRANSLATE(YYX) \
+ (0 <= (YYX) && (YYX) <= YYMAXUTOK \
+ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \
+ : YYSYMBOL_YYUNDEF)
+
+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex. */
+static const yytype_int8 yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 30, 2, 37, 31, 2,
+ 40, 41, 35, 33, 39, 34, 2, 36, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 26, 28, 27, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 29, 2, 32, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 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, 38
+};
+
+#if YYDEBUG
+ /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+static const yytype_uint8 yyrline[] =
+{
+ 0, 83, 83, 88, 89, 90, 93, 94, 96, 99,
+ 102, 104, 105, 106, 107, 108, 109, 110, 111, 112,
+ 113, 114, 115, 116, 117, 118, 119, 120, 121, 122,
+ 124, 125, 129, 130, 135, 139, 145, 146, 147, 148,
+ 150, 151, 152, 156, 157, 160, 161, 163
+};
+#endif
+
+/** Accessing symbol of state STATE. */
+#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
+
+#if YYDEBUG || 0
+/* The user-facing name of the symbol whose (internal) number is
+ YYSYMBOL. No bounds checking. */
+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
+
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "\"end of file\"", "error", "\"invalid token\"", "NULL_CONST",
+ "INTEGER_CONST", "MAXINT_PLUS_ONE_CONST", "DOUBLE_CONST",
+ "BOOLEAN_CONST", "VARIABLE", "FUNCTION", "AND_OP", "OR_OP", "NOT_OP",
+ "NE_OP", "LE_OP", "GE_OP", "LS_OP", "RS_OP", "IS_OP", "CASE_KW",
+ "WHEN_KW", "THEN_KW", "ELSE_KW", "END_KW", "ISNULL_OP", "NOTNULL_OP",
+ "'<'", "'>'", "'='", "'|'", "'#'", "'&'", "'~'", "'+'", "'-'", "'*'",
+ "'/'", "'%'", "UNARY", "','", "'('", "')'", "$accept", "result", "elist",
+ "expr", "when_then_list", "case_control", "function", YY_NULLPTR
+};
+
+static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
+{
+ return yytname[yysymbol];
+}
+#endif
+
+#ifdef YYPRINT
+/* YYTOKNUM[NUM] -- (External) token number corresponding to the
+ (internal) symbol number NUM (which must be that of a token). */
+static const yytype_int16 yytoknum[] =
+{
+ 0, 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, 60, 62, 61, 124,
+ 35, 38, 126, 43, 45, 42, 47, 37, 281, 44,
+ 40, 41
+};
+#endif
+
+#define YYPACT_NINF (-33)
+
+#define yypact_value_is_default(Yyn) \
+ ((Yyn) == YYPACT_NINF)
+
+#define YYTABLE_NINF (-1)
+
+#define yytable_value_is_error(Yyn) \
+ ((Yyn) == YYTABLE_NINF)
+
+ /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+static const yytype_int16 yypact[] =
+{
+ 64, -33, -33, -33, -33, -33, -33, 64, -19, 64,
+ 64, 46, 64, 13, 205, -33, -22, 258, 64, -6,
+ 11, -33, -33, -33, 92, -33, 64, 64, 64, 64,
+ 64, 64, 64, 3, -33, -33, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 121, 64,
+ 64, -33, -33, 258, 233, 283, 283, 283, 11, 11,
+ -33, -33, 5, 283, 283, 283, 11, 11, 11, -9,
+ -9, -33, -33, -33, -32, 205, 64, 149, 177, -33,
+ -33, 64, -33, 205, 64, -33, 205, 205
+};
+
+ /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+ Performed when YYTABLE does not specify something else to do. Zero
+ means the default is an error. */
+static const yytype_int8 yydefact[] =
+{
+ 0, 36, 38, 39, 37, 40, 47, 0, 0, 0,
+ 0, 0, 0, 0, 2, 42, 0, 11, 0, 0,
+ 10, 7, 9, 8, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 30, 31, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
+ 0, 45, 6, 28, 29, 22, 18, 20, 26, 27,
+ 32, 34, 0, 17, 19, 21, 24, 25, 23, 12,
+ 13, 14, 15, 16, 0, 4, 0, 0, 0, 33,
+ 35, 0, 41, 44, 0, 46, 5, 43
+};
+
+ /* YYPGOTO[NTERM-NUM]. */
+static const yytype_int8 yypgoto[] =
+{
+ -33, -33, -33, -7, -33, -33, -33
+};
+
+ /* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_int8 yydefgoto[] =
+{
+ 0, 13, 74, 14, 19, 15, 16
+};
+
+ /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule whose
+ number is the opposite. If YYTABLE_NINF, syntax error. */
+static const yytype_int8 yytable[] =
+{
+ 17, 18, 20, 21, 23, 24, 60, 81, 79, 82,
+ 61, 48, 80, 25, 49, 62, 50, 51, 47, 53,
+ 54, 55, 56, 57, 58, 59, 44, 45, 46, 63,
+ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
+ 75, 0, 77, 78, 42, 43, 44, 45, 46, 1,
+ 2, 22, 3, 4, 5, 6, 0, 0, 7, 0,
+ 0, 0, 0, 0, 0, 8, 0, 1, 2, 83,
+ 3, 4, 5, 6, 86, 0, 7, 87, 9, 10,
+ 11, 0, 0, 8, 0, 0, 12, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 9, 10, 11, 0,
+ 0, 0, 26, 27, 12, 28, 29, 30, 31, 32,
+ 33, 0, 0, 0, 0, 0, 34, 35, 36, 37,
+ 38, 39, 40, 41, 0, 42, 43, 44, 45, 46,
+ 0, 26, 27, 52, 28, 29, 30, 31, 32, 33,
+ 0, 0, 76, 0, 0, 34, 35, 36, 37, 38,
+ 39, 40, 41, 0, 42, 43, 44, 45, 46, 26,
+ 27, 0, 28, 29, 30, 31, 32, 33, 0, 0,
+ 84, 0, 0, 34, 35, 36, 37, 38, 39, 40,
+ 41, 0, 42, 43, 44, 45, 46, 26, 27, 0,
+ 28, 29, 30, 31, 32, 33, 0, 0, 0, 0,
+ 85, 34, 35, 36, 37, 38, 39, 40, 41, 0,
+ 42, 43, 44, 45, 46, 26, 27, 0, 28, 29,
+ 30, 31, 32, 33, 0, 0, 0, 0, 0, 34,
+ 35, 36, 37, 38, 39, 40, 41, 0, 42, 43,
+ 44, 45, 46, 26, 0, 0, 28, 29, 30, 31,
+ 32, 33, 0, 0, 0, 0, 0, 34, 35, 36,
+ 37, 38, 39, 40, 41, 0, 42, 43, 44, 45,
+ 46, 28, 29, 30, 31, 32, 33, 0, 0, 0,
+ 0, 0, 34, 35, 36, 37, 38, 39, 40, 41,
+ 0, 42, 43, 44, 45, 46, -1, -1, -1, 31,
+ 32, 0, 0, 0, 0, 0, 0, 0, 0, -1,
+ -1, -1, 39, 40, 41, 0, 42, 43, 44, 45,
+ 46
+};
+
+static const yytype_int8 yycheck[] =
+{
+ 7, 20, 9, 10, 11, 12, 3, 39, 3, 41,
+ 7, 18, 7, 0, 20, 12, 22, 23, 40, 26,
+ 27, 28, 29, 30, 31, 32, 35, 36, 37, 36,
+ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
+ 47, -1, 49, 50, 33, 34, 35, 36, 37, 3,
+ 4, 5, 6, 7, 8, 9, -1, -1, 12, -1,
+ -1, -1, -1, -1, -1, 19, -1, 3, 4, 76,
+ 6, 7, 8, 9, 81, -1, 12, 84, 32, 33,
+ 34, -1, -1, 19, -1, -1, 40, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 32, 33, 34, -1,
+ -1, -1, 10, 11, 40, 13, 14, 15, 16, 17,
+ 18, -1, -1, -1, -1, -1, 24, 25, 26, 27,
+ 28, 29, 30, 31, -1, 33, 34, 35, 36, 37,
+ -1, 10, 11, 41, 13, 14, 15, 16, 17, 18,
+ -1, -1, 21, -1, -1, 24, 25, 26, 27, 28,
+ 29, 30, 31, -1, 33, 34, 35, 36, 37, 10,
+ 11, -1, 13, 14, 15, 16, 17, 18, -1, -1,
+ 21, -1, -1, 24, 25, 26, 27, 28, 29, 30,
+ 31, -1, 33, 34, 35, 36, 37, 10, 11, -1,
+ 13, 14, 15, 16, 17, 18, -1, -1, -1, -1,
+ 23, 24, 25, 26, 27, 28, 29, 30, 31, -1,
+ 33, 34, 35, 36, 37, 10, 11, -1, 13, 14,
+ 15, 16, 17, 18, -1, -1, -1, -1, -1, 24,
+ 25, 26, 27, 28, 29, 30, 31, -1, 33, 34,
+ 35, 36, 37, 10, -1, -1, 13, 14, 15, 16,
+ 17, 18, -1, -1, -1, -1, -1, 24, 25, 26,
+ 27, 28, 29, 30, 31, -1, 33, 34, 35, 36,
+ 37, 13, 14, 15, 16, 17, 18, -1, -1, -1,
+ -1, -1, 24, 25, 26, 27, 28, 29, 30, 31,
+ -1, 33, 34, 35, 36, 37, 13, 14, 15, 16,
+ 17, -1, -1, -1, -1, -1, -1, -1, -1, 26,
+ 27, 28, 29, 30, 31, -1, 33, 34, 35, 36,
+ 37
+};
+
+ /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+static const yytype_int8 yystos[] =
+{
+ 0, 3, 4, 6, 7, 8, 9, 12, 19, 32,
+ 33, 34, 40, 43, 45, 47, 48, 45, 20, 46,
+ 45, 45, 5, 45, 45, 0, 10, 11, 13, 14,
+ 15, 16, 17, 18, 24, 25, 26, 27, 28, 29,
+ 30, 31, 33, 34, 35, 36, 37, 40, 45, 20,
+ 22, 23, 41, 45, 45, 45, 45, 45, 45, 45,
+ 3, 7, 12, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 44, 45, 21, 45, 45, 3,
+ 7, 39, 41, 45, 21, 23, 45, 45
+};
+
+ /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const yytype_int8 yyr1[] =
+{
+ 0, 42, 43, 44, 44, 44, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 46, 46, 47, 47, 48
+};
+
+ /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
+static const yytype_int8 yyr2[] =
+{
+ 0, 2, 1, 0, 1, 3, 3, 2, 2, 2,
+ 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 2, 2, 3, 4, 3, 4, 1, 1, 1, 1,
+ 1, 4, 1, 5, 4, 3, 5, 1
+};
+
+
+enum { YYENOMEM = -2 };
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+ do \
+ if (yychar == YYEMPTY) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ YYPOPSTACK (yylen); \
+ yystate = *yyssp; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (yyscanner, YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+ while (0)
+
+/* Backward compatibility with an undocumented macro.
+ Use YYerror or YYUNDEF. */
+#define YYERRCODE YYUNDEF
+
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+
+/* This macro is provided for backward compatibility. */
+# ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
+
+
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Kind, Value, yyscanner); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
+
+
+/*-----------------------------------.
+| Print this symbol's value on YYO. |
+`-----------------------------------*/
+
+static void
+yy_symbol_value_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, yyscan_t yyscanner)
+{
+ FILE *yyoutput = yyo;
+ YY_USE (yyoutput);
+ YY_USE (yyscanner);
+ if (!yyvaluep)
+ return;
+# ifdef YYPRINT
+ if (yykind < YYNTOKENS)
+ YYPRINT (yyo, yytoknum[yykind], *yyvaluep);
+# endif
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+/*---------------------------.
+| Print this symbol on YYO. |
+`---------------------------*/
+
+static void
+yy_symbol_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, yyscan_t yyscanner)
+{
+ YYFPRINTF (yyo, "%s %s (",
+ yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
+
+ yy_symbol_value_print (yyo, yykind, yyvaluep, yyscanner);
+ YYFPRINTF (yyo, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+static void
+yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (; yybottom <= yytop; yybottom++)
+ {
+ int yybot = *yybottom;
+ YYFPRINTF (stderr, " %d", yybot);
+ }
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+static void
+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,
+ int yyrule, yyscan_t yyscanner)
+{
+ int yylno = yyrline[yyrule];
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n",
+ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ YYFPRINTF (stderr, " $%d = ", yyi + 1);
+ yy_symbol_print (stderr,
+ YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
+ &yyvsp[(yyi + 1) - (yynrhs)], yyscanner);
+ YYFPRINTF (stderr, "\n");
+ }
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyssp, yyvsp, Rule, yyscanner); \
+} while (0)
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args) ((void) 0)
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+static void
+yydestruct (const char *yymsg,
+ yysymbol_kind_t yykind, YYSTYPE *yyvaluep, yyscan_t yyscanner)
+{
+ YY_USE (yyvaluep);
+ YY_USE (yyscanner);
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+
+
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+int
+yyparse (yyscan_t yyscanner)
+{
+/* Lookahead token kind. */
+int yychar;
+
+
+/* The semantic value of the lookahead symbol. */
+/* Default value used for initialization, for pacifying older GCCs
+ or non-GCC compilers. */
+YY_INITIAL_VALUE (static YYSTYPE yyval_default;)
+YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default);
+
+ /* Number of syntax errors so far. */
+ int yynerrs = 0;
+
+ yy_state_fast_t yystate = 0;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus = 0;
+
+ /* Refer to the stacks through separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* Their size. */
+ YYPTRDIFF_T yystacksize = YYINITDEPTH;
+
+ /* The state stack: array, bottom, top. */
+ yy_state_t yyssa[YYINITDEPTH];
+ yy_state_t *yyss = yyssa;
+ yy_state_t *yyssp = yyss;
+
+ /* The semantic value stack: array, bottom, top. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ YYSTYPE *yyvsp = yyvs;
+
+ int yyn;
+ /* The return value of yyparse. */
+ int yyresult;
+ /* Lookahead symbol kind. */
+ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yychar = YYEMPTY; /* Cause a token to be read. */
+ goto yysetstate;
+
+
+/*------------------------------------------------------------.
+| yynewstate -- push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+
+/*--------------------------------------------------------------------.
+| yysetstate -- set current state (the top of the stack) to yystate. |
+`--------------------------------------------------------------------*/
+yysetstate:
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+ YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
+ YY_IGNORE_USELESS_CAST_BEGIN
+ *yyssp = YY_CAST (yy_state_t, yystate);
+ YY_IGNORE_USELESS_CAST_END
+ YY_STACK_PRINT (yyss, yyssp);
+
+ if (yyss + yystacksize - 1 <= yyssp)
+#if !defined yyoverflow && !defined YYSTACK_RELOCATE
+ goto yyexhaustedlab;
+#else
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYPTRDIFF_T yysize = yyssp - yyss + 1;
+
+# if defined yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ yy_state_t *yyss1 = yyss;
+ YYSTYPE *yyvs1 = yyvs;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * YYSIZEOF (*yyssp),
+ &yyvs1, yysize * YYSIZEOF (*yyvsp),
+ &yystacksize);
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+# else /* defined YYSTACK_RELOCATE */
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyexhaustedlab;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yy_state_t *yyss1 = yyss;
+ union yyalloc *yyptr =
+ YY_CAST (union yyalloc *,
+ YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
+ if (! yyptr)
+ goto yyexhaustedlab;
+ YYSTACK_RELOCATE (yyss_alloc, yyss);
+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+ YY_IGNORE_USELESS_CAST_BEGIN
+ YYDPRINTF ((stderr, "Stack size increased to %ld\n",
+ YY_CAST (long, yystacksize)));
+ YY_IGNORE_USELESS_CAST_END
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
+
+ if (yystate == YYFINAL)
+ YYACCEPT;
+
+ goto yybackup;
+
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+ /* Do appropriate processing given the current state. Read a
+ lookahead token if we need one and don't already have one. */
+
+ /* First try to decide what to do without reference to lookahead token. */
+ yyn = yypact[yystate];
+ if (yypact_value_is_default (yyn))
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token\n"));
+ yychar = yylex (&yylval, yyscanner);
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = YYEOF;
+ yytoken = YYSYMBOL_YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else if (yychar == YYerror)
+ {
+ /* The scanner already issued an error message, process directly
+ to error recovery. But do not keep the error token as
+ lookahead, it is too special and may lead us to an endless
+ loop in error recovery. */
+ yychar = YYUNDEF;
+ yytoken = YYSYMBOL_YYerror;
+ goto yyerrlab1;
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yytable_value_is_error (yyn))
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ /* Shift the lookahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+ yystate = yyn;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+ /* Discard the shifted token. */
+ yychar = YYEMPTY;
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ '$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 2: /* result: expr */
+#line 83 "exprparse.y"
+ {
+ expr_parse_result = (yyvsp[0].expr);
+ (void) yynerrs; /* suppress compiler warning */
+ }
+#line 1339 "exprparse.c"
+ break;
+
+ case 3: /* elist: %empty */
+#line 88 "exprparse.y"
+ { (yyval.elist) = NULL; }
+#line 1345 "exprparse.c"
+ break;
+
+ case 4: /* elist: expr */
+#line 89 "exprparse.y"
+ { (yyval.elist) = make_elist((yyvsp[0].expr), NULL); }
+#line 1351 "exprparse.c"
+ break;
+
+ case 5: /* elist: elist ',' expr */
+#line 90 "exprparse.y"
+ { (yyval.elist) = make_elist((yyvsp[0].expr), (yyvsp[-2].elist)); }
+#line 1357 "exprparse.c"
+ break;
+
+ case 6: /* expr: '(' expr ')' */
+#line 93 "exprparse.y"
+ { (yyval.expr) = (yyvsp[-1].expr); }
+#line 1363 "exprparse.c"
+ break;
+
+ case 7: /* expr: '+' expr */
+#line 94 "exprparse.y"
+ { (yyval.expr) = (yyvsp[0].expr); }
+#line 1369 "exprparse.c"
+ break;
+
+ case 8: /* expr: '-' expr */
+#line 96 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "-",
+ make_integer_constant(0), (yyvsp[0].expr)); }
+#line 1376 "exprparse.c"
+ break;
+
+ case 9: /* expr: '-' MAXINT_PLUS_ONE_CONST */
+#line 100 "exprparse.y"
+ { (yyval.expr) = make_integer_constant(PG_INT64_MIN); }
+#line 1382 "exprparse.c"
+ break;
+
+ case 10: /* expr: '~' expr */
+#line 102 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "#",
+ make_integer_constant(~INT64CONST(0)), (yyvsp[0].expr)); }
+#line 1389 "exprparse.c"
+ break;
+
+ case 11: /* expr: NOT_OP expr */
+#line 104 "exprparse.y"
+ { (yyval.expr) = make_uop(yyscanner, "!not", (yyvsp[0].expr)); }
+#line 1395 "exprparse.c"
+ break;
+
+ case 12: /* expr: expr '+' expr */
+#line 105 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "+", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1401 "exprparse.c"
+ break;
+
+ case 13: /* expr: expr '-' expr */
+#line 106 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "-", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1407 "exprparse.c"
+ break;
+
+ case 14: /* expr: expr '*' expr */
+#line 107 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "*", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1413 "exprparse.c"
+ break;
+
+ case 15: /* expr: expr '/' expr */
+#line 108 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "/", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1419 "exprparse.c"
+ break;
+
+ case 16: /* expr: expr '%' expr */
+#line 109 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "mod", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1425 "exprparse.c"
+ break;
+
+ case 17: /* expr: expr '<' expr */
+#line 110 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "<", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1431 "exprparse.c"
+ break;
+
+ case 18: /* expr: expr LE_OP expr */
+#line 111 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "<=", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1437 "exprparse.c"
+ break;
+
+ case 19: /* expr: expr '>' expr */
+#line 112 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "<", (yyvsp[0].expr), (yyvsp[-2].expr)); }
+#line 1443 "exprparse.c"
+ break;
+
+ case 20: /* expr: expr GE_OP expr */
+#line 113 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "<=", (yyvsp[0].expr), (yyvsp[-2].expr)); }
+#line 1449 "exprparse.c"
+ break;
+
+ case 21: /* expr: expr '=' expr */
+#line 114 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "=", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1455 "exprparse.c"
+ break;
+
+ case 22: /* expr: expr NE_OP expr */
+#line 115 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "<>", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1461 "exprparse.c"
+ break;
+
+ case 23: /* expr: expr '&' expr */
+#line 116 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "&", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1467 "exprparse.c"
+ break;
+
+ case 24: /* expr: expr '|' expr */
+#line 117 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "|", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1473 "exprparse.c"
+ break;
+
+ case 25: /* expr: expr '#' expr */
+#line 118 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "#", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1479 "exprparse.c"
+ break;
+
+ case 26: /* expr: expr LS_OP expr */
+#line 119 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "<<", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1485 "exprparse.c"
+ break;
+
+ case 27: /* expr: expr RS_OP expr */
+#line 120 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, ">>", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1491 "exprparse.c"
+ break;
+
+ case 28: /* expr: expr AND_OP expr */
+#line 121 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "!and", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1497 "exprparse.c"
+ break;
+
+ case 29: /* expr: expr OR_OP expr */
+#line 122 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "!or", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1503 "exprparse.c"
+ break;
+
+ case 30: /* expr: expr ISNULL_OP */
+#line 124 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "!is", (yyvsp[-1].expr), make_null_constant()); }
+#line 1509 "exprparse.c"
+ break;
+
+ case 31: /* expr: expr NOTNULL_OP */
+#line 125 "exprparse.y"
+ {
+ (yyval.expr) = make_uop(yyscanner, "!not",
+ make_op(yyscanner, "!is", (yyvsp[-1].expr), make_null_constant()));
+ }
+#line 1518 "exprparse.c"
+ break;
+
+ case 32: /* expr: expr IS_OP NULL_CONST */
+#line 129 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "!is", (yyvsp[-2].expr), make_null_constant()); }
+#line 1524 "exprparse.c"
+ break;
+
+ case 33: /* expr: expr IS_OP NOT_OP NULL_CONST */
+#line 131 "exprparse.y"
+ {
+ (yyval.expr) = make_uop(yyscanner, "!not",
+ make_op(yyscanner, "!is", (yyvsp[-3].expr), make_null_constant()));
+ }
+#line 1533 "exprparse.c"
+ break;
+
+ case 34: /* expr: expr IS_OP BOOLEAN_CONST */
+#line 136 "exprparse.y"
+ {
+ (yyval.expr) = make_op(yyscanner, "!is", (yyvsp[-2].expr), make_boolean_constant((yyvsp[0].bval)));
+ }
+#line 1541 "exprparse.c"
+ break;
+
+ case 35: /* expr: expr IS_OP NOT_OP BOOLEAN_CONST */
+#line 140 "exprparse.y"
+ {
+ (yyval.expr) = make_uop(yyscanner, "!not",
+ make_op(yyscanner, "!is", (yyvsp[-3].expr), make_boolean_constant((yyvsp[0].bval))));
+ }
+#line 1550 "exprparse.c"
+ break;
+
+ case 36: /* expr: NULL_CONST */
+#line 145 "exprparse.y"
+ { (yyval.expr) = make_null_constant(); }
+#line 1556 "exprparse.c"
+ break;
+
+ case 37: /* expr: BOOLEAN_CONST */
+#line 146 "exprparse.y"
+ { (yyval.expr) = make_boolean_constant((yyvsp[0].bval)); }
+#line 1562 "exprparse.c"
+ break;
+
+ case 38: /* expr: INTEGER_CONST */
+#line 147 "exprparse.y"
+ { (yyval.expr) = make_integer_constant((yyvsp[0].ival)); }
+#line 1568 "exprparse.c"
+ break;
+
+ case 39: /* expr: DOUBLE_CONST */
+#line 148 "exprparse.y"
+ { (yyval.expr) = make_double_constant((yyvsp[0].dval)); }
+#line 1574 "exprparse.c"
+ break;
+
+ case 40: /* expr: VARIABLE */
+#line 150 "exprparse.y"
+ { (yyval.expr) = make_variable((yyvsp[0].str)); }
+#line 1580 "exprparse.c"
+ break;
+
+ case 41: /* expr: function '(' elist ')' */
+#line 151 "exprparse.y"
+ { (yyval.expr) = make_func(yyscanner, (yyvsp[-3].ival), (yyvsp[-1].elist)); }
+#line 1586 "exprparse.c"
+ break;
+
+ case 42: /* expr: case_control */
+#line 152 "exprparse.y"
+ { (yyval.expr) = (yyvsp[0].expr); }
+#line 1592 "exprparse.c"
+ break;
+
+ case 43: /* when_then_list: when_then_list WHEN_KW expr THEN_KW expr */
+#line 156 "exprparse.y"
+ { (yyval.elist) = make_elist((yyvsp[0].expr), make_elist((yyvsp[-2].expr), (yyvsp[-4].elist))); }
+#line 1598 "exprparse.c"
+ break;
+
+ case 44: /* when_then_list: WHEN_KW expr THEN_KW expr */
+#line 157 "exprparse.y"
+ { (yyval.elist) = make_elist((yyvsp[0].expr), make_elist((yyvsp[-2].expr), NULL)); }
+#line 1604 "exprparse.c"
+ break;
+
+ case 45: /* case_control: CASE_KW when_then_list END_KW */
+#line 160 "exprparse.y"
+ { (yyval.expr) = make_case(yyscanner, (yyvsp[-1].elist), make_null_constant()); }
+#line 1610 "exprparse.c"
+ break;
+
+ case 46: /* case_control: CASE_KW when_then_list ELSE_KW expr END_KW */
+#line 161 "exprparse.y"
+ { (yyval.expr) = make_case(yyscanner, (yyvsp[-3].elist), (yyvsp[-1].expr)); }
+#line 1616 "exprparse.c"
+ break;
+
+ case 47: /* function: FUNCTION */
+#line 163 "exprparse.y"
+ { (yyval.ival) = find_func(yyscanner, (yyvsp[0].str)); pg_free((yyvsp[0].str)); }
+#line 1622 "exprparse.c"
+ break;
+
+
+#line 1626 "exprparse.c"
+
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+ that yytoken be updated with the new translation. We take the
+ approach of translating immediately before every use of yytoken.
+ One alternative is translating here after every semantic action,
+ but that translation would be missed if the semantic action invokes
+ YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+ if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
+ incorrect destructor might then be invoked immediately. In the
+ case of YYERROR or YYBACKUP, subsequent parser actions might lead
+ to an incorrect destructor call or verbose syntax error message
+ before the lookahead is translated. */
+ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+
+ *++yyvsp = yyval;
+
+ /* Now 'shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+ {
+ const int yylhs = yyr1[yyn] - YYNTOKENS;
+ const int yyi = yypgoto[yylhs] + *yyssp;
+ yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
+ ? yytable[yyi]
+ : yydefgoto[yylhs]);
+ }
+
+ goto yynewstate;
+
+
+/*--------------------------------------.
+| yyerrlab -- here on detecting error. |
+`--------------------------------------*/
+yyerrlab:
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+ yyerror (yyscanner, YY_("syntax error"));
+ }
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval, yyscanner);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+ /* Pacify compilers when the user code never invokes YYERROR and the
+ label yyerrorlab therefore never appears in user code. */
+ if (0)
+ YYERROR;
+
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ /* Pop stack until we find a state that shifts the error token. */
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (!yypact_value_is_default (yyn))
+ {
+ yyn += YYSYMBOL_YYerror;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ YY_ACCESSING_SYMBOL (yystate), yyvsp, yyscanner);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+
+#if !defined yyoverflow
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here. |
+`-------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (yyscanner, YY_("memory exhausted"));
+ yyresult = 2;
+ goto yyreturn;
+#endif
+
+
+/*-------------------------------------------------------.
+| yyreturn -- parsing is finished, clean up and return. |
+`-------------------------------------------------------*/
+yyreturn:
+ if (yychar != YYEMPTY)
+ {
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = YYTRANSLATE (yychar);
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval, yyscanner);
+ }
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, yyscanner);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+
+ return yyresult;
+}
+
+#line 166 "exprparse.y"
+
+
+static PgBenchExpr *
+make_null_constant(void)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_CONSTANT;
+ expr->u.constant.type = PGBT_NULL;
+ expr->u.constant.u.ival = 0;
+ return expr;
+}
+
+static PgBenchExpr *
+make_integer_constant(int64 ival)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_CONSTANT;
+ expr->u.constant.type = PGBT_INT;
+ expr->u.constant.u.ival = ival;
+ return expr;
+}
+
+static PgBenchExpr *
+make_double_constant(double dval)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_CONSTANT;
+ expr->u.constant.type = PGBT_DOUBLE;
+ expr->u.constant.u.dval = dval;
+ return expr;
+}
+
+static PgBenchExpr *
+make_boolean_constant(bool bval)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_CONSTANT;
+ expr->u.constant.type = PGBT_BOOLEAN;
+ expr->u.constant.u.bval = bval;
+ return expr;
+}
+
+static PgBenchExpr *
+make_variable(char *varname)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_VARIABLE;
+ expr->u.variable.varname = varname;
+ return expr;
+}
+
+/* binary operators */
+static PgBenchExpr *
+make_op(yyscan_t yyscanner, const char *operator,
+ PgBenchExpr *lexpr, PgBenchExpr *rexpr)
+{
+ return make_func(yyscanner, find_func(yyscanner, operator),
+ make_elist(rexpr, make_elist(lexpr, NULL)));
+}
+
+/* unary operator */
+static PgBenchExpr *
+make_uop(yyscan_t yyscanner, const char *operator, PgBenchExpr *expr)
+{
+ return make_func(yyscanner, find_func(yyscanner, operator), make_elist(expr, NULL));
+}
+
+/*
+ * List of available functions:
+ * - fname: function name, "!..." for special internal functions
+ * - nargs: number of arguments. Special cases:
+ * - PGBENCH_NARGS_VARIABLE is a special value for least & greatest
+ * meaning #args >= 1;
+ * - PGBENCH_NARGS_CASE is for the "CASE WHEN ..." function, which
+ * has #args >= 3 and odd;
+ * - PGBENCH_NARGS_HASH is for hash functions, which have one required
+ * and one optional argument;
+ * - tag: function identifier from PgBenchFunction enum
+ */
+static const struct
+{
+ const char *fname;
+ int nargs;
+ PgBenchFunction tag;
+} PGBENCH_FUNCTIONS[] =
+{
+ /* parsed as operators, executed as functions */
+ {
+ "+", 2, PGBENCH_ADD
+ },
+ {
+ "-", 2, PGBENCH_SUB
+ },
+ {
+ "*", 2, PGBENCH_MUL
+ },
+ {
+ "/", 2, PGBENCH_DIV
+ },
+ {
+ "mod", 2, PGBENCH_MOD
+ },
+ /* actual functions */
+ {
+ "abs", 1, PGBENCH_ABS
+ },
+ {
+ "least", PGBENCH_NARGS_VARIABLE, PGBENCH_LEAST
+ },
+ {
+ "greatest", PGBENCH_NARGS_VARIABLE, PGBENCH_GREATEST
+ },
+ {
+ "debug", 1, PGBENCH_DEBUG
+ },
+ {
+ "pi", 0, PGBENCH_PI
+ },
+ {
+ "sqrt", 1, PGBENCH_SQRT
+ },
+ {
+ "ln", 1, PGBENCH_LN
+ },
+ {
+ "exp", 1, PGBENCH_EXP
+ },
+ {
+ "int", 1, PGBENCH_INT
+ },
+ {
+ "double", 1, PGBENCH_DOUBLE
+ },
+ {
+ "random", 2, PGBENCH_RANDOM
+ },
+ {
+ "random_gaussian", 3, PGBENCH_RANDOM_GAUSSIAN
+ },
+ {
+ "random_exponential", 3, PGBENCH_RANDOM_EXPONENTIAL
+ },
+ {
+ "random_zipfian", 3, PGBENCH_RANDOM_ZIPFIAN
+ },
+ {
+ "pow", 2, PGBENCH_POW
+ },
+ {
+ "power", 2, PGBENCH_POW
+ },
+ /* logical operators */
+ {
+ "!and", 2, PGBENCH_AND
+ },
+ {
+ "!or", 2, PGBENCH_OR
+ },
+ {
+ "!not", 1, PGBENCH_NOT
+ },
+ /* bitwise integer operators */
+ {
+ "&", 2, PGBENCH_BITAND
+ },
+ {
+ "|", 2, PGBENCH_BITOR
+ },
+ {
+ "#", 2, PGBENCH_BITXOR
+ },
+ {
+ "<<", 2, PGBENCH_LSHIFT
+ },
+ {
+ ">>", 2, PGBENCH_RSHIFT
+ },
+ /* comparison operators */
+ {
+ "=", 2, PGBENCH_EQ
+ },
+ {
+ "<>", 2, PGBENCH_NE
+ },
+ {
+ "<=", 2, PGBENCH_LE
+ },
+ {
+ "<", 2, PGBENCH_LT
+ },
+ {
+ "!is", 2, PGBENCH_IS
+ },
+ /* "case when ... then ... else ... end" construction */
+ {
+ "!case_end", PGBENCH_NARGS_CASE, PGBENCH_CASE
+ },
+ {
+ "hash", PGBENCH_NARGS_HASH, PGBENCH_HASH_MURMUR2
+ },
+ {
+ "hash_murmur2", PGBENCH_NARGS_HASH, PGBENCH_HASH_MURMUR2
+ },
+ {
+ "hash_fnv1a", PGBENCH_NARGS_HASH, PGBENCH_HASH_FNV1A
+ },
+ {
+ "permute", PGBENCH_NARGS_PERMUTE, PGBENCH_PERMUTE
+ },
+ /* keep as last array element */
+ {
+ NULL, 0, 0
+ }
+};
+
+/*
+ * Find a function from its name
+ *
+ * return the index of the function from the PGBENCH_FUNCTIONS array
+ * or fail if the function is unknown.
+ */
+static int
+find_func(yyscan_t yyscanner, const char *fname)
+{
+ int i = 0;
+
+ while (PGBENCH_FUNCTIONS[i].fname)
+ {
+ if (pg_strcasecmp(fname, PGBENCH_FUNCTIONS[i].fname) == 0)
+ return i;
+ i++;
+ }
+
+ expr_yyerror_more(yyscanner, "unexpected function name", fname);
+
+ /* not reached */
+ return -1;
+}
+
+/* Expression linked list builder */
+static PgBenchExprList *
+make_elist(PgBenchExpr *expr, PgBenchExprList *list)
+{
+ PgBenchExprLink *cons;
+
+ if (list == NULL)
+ {
+ list = pg_malloc(sizeof(PgBenchExprList));
+ list->head = NULL;
+ list->tail = NULL;
+ }
+
+ cons = pg_malloc(sizeof(PgBenchExprLink));
+ cons->expr = expr;
+ cons->next = NULL;
+
+ if (list->head == NULL)
+ list->head = cons;
+ else
+ list->tail->next = cons;
+
+ list->tail = cons;
+
+ return list;
+}
+
+/* Return the length of an expression list */
+static int
+elist_length(PgBenchExprList *list)
+{
+ PgBenchExprLink *link = list != NULL ? list->head : NULL;
+ int len = 0;
+
+ for (; link != NULL; link = link->next)
+ len++;
+
+ return len;
+}
+
+/* Build function call expression */
+static PgBenchExpr *
+make_func(yyscan_t yyscanner, int fnumber, PgBenchExprList *args)
+{
+ int len = elist_length(args);
+
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ Assert(fnumber >= 0);
+
+ /* validate arguments number including few special cases */
+ switch (PGBENCH_FUNCTIONS[fnumber].nargs)
+ {
+ /* check at least one arg for least & greatest */
+ case PGBENCH_NARGS_VARIABLE:
+ if (len == 0)
+ expr_yyerror_more(yyscanner, "at least one argument expected",
+ PGBENCH_FUNCTIONS[fnumber].fname);
+ break;
+
+ /* case (when ... then ...)+ (else ...)? end */
+ case PGBENCH_NARGS_CASE:
+ /* 'else' branch is always present, but could be a NULL-constant */
+ if (len < 3 || len % 2 != 1)
+ expr_yyerror_more(yyscanner,
+ "odd and >= 3 number of arguments expected",
+ "case control structure");
+ break;
+
+ /* hash functions with optional seed argument */
+ case PGBENCH_NARGS_HASH:
+ if (len < 1 || len > 2)
+ expr_yyerror_more(yyscanner, "unexpected number of arguments",
+ PGBENCH_FUNCTIONS[fnumber].fname);
+
+ if (len == 1)
+ {
+ PgBenchExpr *var = make_variable("default_seed");
+ args = make_elist(var, args);
+ }
+ break;
+
+ /* pseudorandom permutation function with optional seed argument */
+ case PGBENCH_NARGS_PERMUTE:
+ if (len < 2 || len > 3)
+ expr_yyerror_more(yyscanner, "unexpected number of arguments",
+ PGBENCH_FUNCTIONS[fnumber].fname);
+
+ if (len == 2)
+ {
+ PgBenchExpr *var = make_variable("default_seed");
+ args = make_elist(var, args);
+ }
+ break;
+
+ /* common case: positive arguments number */
+ default:
+ Assert(PGBENCH_FUNCTIONS[fnumber].nargs >= 0);
+
+ if (PGBENCH_FUNCTIONS[fnumber].nargs != len)
+ expr_yyerror_more(yyscanner, "unexpected number of arguments",
+ PGBENCH_FUNCTIONS[fnumber].fname);
+ }
+
+ expr->etype = ENODE_FUNCTION;
+ expr->u.function.function = PGBENCH_FUNCTIONS[fnumber].tag;
+
+ /* only the link is used, the head/tail is not useful anymore */
+ expr->u.function.args = args != NULL ? args->head : NULL;
+ if (args)
+ pg_free(args);
+
+ return expr;
+}
+
+static PgBenchExpr *
+make_case(yyscan_t yyscanner, PgBenchExprList *when_then_list, PgBenchExpr *else_part)
+{
+ return make_func(yyscanner,
+ find_func(yyscanner, "!case_end"),
+ make_elist(else_part, when_then_list));
+}
+
+/*
+ * exprscan.l is compiled as part of exprparse.y. Currently, this is
+ * unavoidable because exprparse does not create a .h file to export
+ * its token symbols. If these files ever grow large enough to be
+ * worth compiling separately, that could be fixed; but for now it
+ * seems like useless complication.
+ */
+
+/* First, get rid of "#define yyscan_t" from pgbench.h */
+#undef yyscan_t
+/* ... and the yylval macro, which flex will have its own definition for */
+#undef yylval
+
+#include "exprscan.c"
diff --git a/src/bin/pgbench/exprparse.y b/src/bin/pgbench/exprparse.y
new file mode 100644
index 0000000..18da3c6
--- /dev/null
+++ b/src/bin/pgbench/exprparse.y
@@ -0,0 +1,546 @@
+%{
+/*-------------------------------------------------------------------------
+ *
+ * exprparse.y
+ * bison grammar for a simple expression syntax
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pgbench/exprparse.y
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include "pgbench.h"
+
+#define PGBENCH_NARGS_VARIABLE (-1)
+#define PGBENCH_NARGS_CASE (-2)
+#define PGBENCH_NARGS_HASH (-3)
+#define PGBENCH_NARGS_PERMUTE (-4)
+
+PgBenchExpr *expr_parse_result;
+
+static PgBenchExprList *make_elist(PgBenchExpr *exp, PgBenchExprList *list);
+static PgBenchExpr *make_null_constant(void);
+static PgBenchExpr *make_boolean_constant(bool bval);
+static PgBenchExpr *make_integer_constant(int64 ival);
+static PgBenchExpr *make_double_constant(double dval);
+static PgBenchExpr *make_variable(char *varname);
+static PgBenchExpr *make_op(yyscan_t yyscanner, const char *operator,
+ PgBenchExpr *lexpr, PgBenchExpr *rexpr);
+static PgBenchExpr *make_uop(yyscan_t yyscanner, const char *operator, PgBenchExpr *expr);
+static int find_func(yyscan_t yyscanner, const char *fname);
+static PgBenchExpr *make_func(yyscan_t yyscanner, int fnumber, PgBenchExprList *args);
+static PgBenchExpr *make_case(yyscan_t yyscanner, PgBenchExprList *when_then_list, PgBenchExpr *else_part);
+
+%}
+
+%pure-parser
+%expect 0
+%name-prefix="expr_yy"
+
+%parse-param {yyscan_t yyscanner}
+%lex-param {yyscan_t yyscanner}
+
+%union
+{
+ int64 ival;
+ double dval;
+ bool bval;
+ char *str;
+ PgBenchExpr *expr;
+ PgBenchExprList *elist;
+}
+
+%type <elist> elist when_then_list
+%type <expr> expr case_control
+%type <ival> INTEGER_CONST function
+%type <dval> DOUBLE_CONST
+%type <bval> BOOLEAN_CONST
+%type <str> VARIABLE FUNCTION
+
+%token NULL_CONST INTEGER_CONST MAXINT_PLUS_ONE_CONST DOUBLE_CONST
+%token BOOLEAN_CONST VARIABLE FUNCTION
+%token AND_OP OR_OP NOT_OP NE_OP LE_OP GE_OP LS_OP RS_OP IS_OP
+%token CASE_KW WHEN_KW THEN_KW ELSE_KW END_KW
+
+/* Precedence: lowest to highest, taken from postgres SQL parser */
+%left OR_OP
+%left AND_OP
+%right NOT_OP
+%nonassoc IS_OP ISNULL_OP NOTNULL_OP
+%nonassoc '<' '>' '=' LE_OP GE_OP NE_OP
+%left '|' '#' '&' LS_OP RS_OP '~'
+%left '+' '-'
+%left '*' '/' '%'
+%right UNARY
+
+%%
+
+result: expr {
+ expr_parse_result = $1;
+ (void) yynerrs; /* suppress compiler warning */
+ }
+
+elist: { $$ = NULL; }
+ | expr { $$ = make_elist($1, NULL); }
+ | elist ',' expr { $$ = make_elist($3, $1); }
+ ;
+
+expr: '(' expr ')' { $$ = $2; }
+ | '+' expr %prec UNARY { $$ = $2; }
+ /* unary minus "-x" implemented as "0 - x" */
+ | '-' expr %prec UNARY { $$ = make_op(yyscanner, "-",
+ make_integer_constant(0), $2); }
+ /* special PG_INT64_MIN handling, only after a unary minus */
+ | '-' MAXINT_PLUS_ONE_CONST %prec UNARY
+ { $$ = make_integer_constant(PG_INT64_MIN); }
+ /* binary ones complement "~x" implemented as 0xffff... xor x" */
+ | '~' expr { $$ = make_op(yyscanner, "#",
+ make_integer_constant(~INT64CONST(0)), $2); }
+ | NOT_OP expr { $$ = make_uop(yyscanner, "!not", $2); }
+ | expr '+' expr { $$ = make_op(yyscanner, "+", $1, $3); }
+ | expr '-' expr { $$ = make_op(yyscanner, "-", $1, $3); }
+ | expr '*' expr { $$ = make_op(yyscanner, "*", $1, $3); }
+ | expr '/' expr { $$ = make_op(yyscanner, "/", $1, $3); }
+ | expr '%' expr { $$ = make_op(yyscanner, "mod", $1, $3); }
+ | expr '<' expr { $$ = make_op(yyscanner, "<", $1, $3); }
+ | expr LE_OP expr { $$ = make_op(yyscanner, "<=", $1, $3); }
+ | expr '>' expr { $$ = make_op(yyscanner, "<", $3, $1); }
+ | expr GE_OP expr { $$ = make_op(yyscanner, "<=", $3, $1); }
+ | expr '=' expr { $$ = make_op(yyscanner, "=", $1, $3); }
+ | expr NE_OP expr { $$ = make_op(yyscanner, "<>", $1, $3); }
+ | expr '&' expr { $$ = make_op(yyscanner, "&", $1, $3); }
+ | expr '|' expr { $$ = make_op(yyscanner, "|", $1, $3); }
+ | expr '#' expr { $$ = make_op(yyscanner, "#", $1, $3); }
+ | expr LS_OP expr { $$ = make_op(yyscanner, "<<", $1, $3); }
+ | expr RS_OP expr { $$ = make_op(yyscanner, ">>", $1, $3); }
+ | expr AND_OP expr { $$ = make_op(yyscanner, "!and", $1, $3); }
+ | expr OR_OP expr { $$ = make_op(yyscanner, "!or", $1, $3); }
+ /* IS variants */
+ | expr ISNULL_OP { $$ = make_op(yyscanner, "!is", $1, make_null_constant()); }
+ | expr NOTNULL_OP {
+ $$ = make_uop(yyscanner, "!not",
+ make_op(yyscanner, "!is", $1, make_null_constant()));
+ }
+ | expr IS_OP NULL_CONST { $$ = make_op(yyscanner, "!is", $1, make_null_constant()); }
+ | expr IS_OP NOT_OP NULL_CONST
+ {
+ $$ = make_uop(yyscanner, "!not",
+ make_op(yyscanner, "!is", $1, make_null_constant()));
+ }
+ | expr IS_OP BOOLEAN_CONST
+ {
+ $$ = make_op(yyscanner, "!is", $1, make_boolean_constant($3));
+ }
+ | expr IS_OP NOT_OP BOOLEAN_CONST
+ {
+ $$ = make_uop(yyscanner, "!not",
+ make_op(yyscanner, "!is", $1, make_boolean_constant($4)));
+ }
+ /* constants */
+ | NULL_CONST { $$ = make_null_constant(); }
+ | BOOLEAN_CONST { $$ = make_boolean_constant($1); }
+ | INTEGER_CONST { $$ = make_integer_constant($1); }
+ | DOUBLE_CONST { $$ = make_double_constant($1); }
+ /* misc */
+ | VARIABLE { $$ = make_variable($1); }
+ | function '(' elist ')' { $$ = make_func(yyscanner, $1, $3); }
+ | case_control { $$ = $1; }
+ ;
+
+when_then_list:
+ when_then_list WHEN_KW expr THEN_KW expr { $$ = make_elist($5, make_elist($3, $1)); }
+ | WHEN_KW expr THEN_KW expr { $$ = make_elist($4, make_elist($2, NULL)); }
+
+case_control:
+ CASE_KW when_then_list END_KW { $$ = make_case(yyscanner, $2, make_null_constant()); }
+ | CASE_KW when_then_list ELSE_KW expr END_KW { $$ = make_case(yyscanner, $2, $4); }
+
+function: FUNCTION { $$ = find_func(yyscanner, $1); pg_free($1); }
+ ;
+
+%%
+
+static PgBenchExpr *
+make_null_constant(void)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_CONSTANT;
+ expr->u.constant.type = PGBT_NULL;
+ expr->u.constant.u.ival = 0;
+ return expr;
+}
+
+static PgBenchExpr *
+make_integer_constant(int64 ival)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_CONSTANT;
+ expr->u.constant.type = PGBT_INT;
+ expr->u.constant.u.ival = ival;
+ return expr;
+}
+
+static PgBenchExpr *
+make_double_constant(double dval)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_CONSTANT;
+ expr->u.constant.type = PGBT_DOUBLE;
+ expr->u.constant.u.dval = dval;
+ return expr;
+}
+
+static PgBenchExpr *
+make_boolean_constant(bool bval)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_CONSTANT;
+ expr->u.constant.type = PGBT_BOOLEAN;
+ expr->u.constant.u.bval = bval;
+ return expr;
+}
+
+static PgBenchExpr *
+make_variable(char *varname)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_VARIABLE;
+ expr->u.variable.varname = varname;
+ return expr;
+}
+
+/* binary operators */
+static PgBenchExpr *
+make_op(yyscan_t yyscanner, const char *operator,
+ PgBenchExpr *lexpr, PgBenchExpr *rexpr)
+{
+ return make_func(yyscanner, find_func(yyscanner, operator),
+ make_elist(rexpr, make_elist(lexpr, NULL)));
+}
+
+/* unary operator */
+static PgBenchExpr *
+make_uop(yyscan_t yyscanner, const char *operator, PgBenchExpr *expr)
+{
+ return make_func(yyscanner, find_func(yyscanner, operator), make_elist(expr, NULL));
+}
+
+/*
+ * List of available functions:
+ * - fname: function name, "!..." for special internal functions
+ * - nargs: number of arguments. Special cases:
+ * - PGBENCH_NARGS_VARIABLE is a special value for least & greatest
+ * meaning #args >= 1;
+ * - PGBENCH_NARGS_CASE is for the "CASE WHEN ..." function, which
+ * has #args >= 3 and odd;
+ * - PGBENCH_NARGS_HASH is for hash functions, which have one required
+ * and one optional argument;
+ * - tag: function identifier from PgBenchFunction enum
+ */
+static const struct
+{
+ const char *fname;
+ int nargs;
+ PgBenchFunction tag;
+} PGBENCH_FUNCTIONS[] =
+{
+ /* parsed as operators, executed as functions */
+ {
+ "+", 2, PGBENCH_ADD
+ },
+ {
+ "-", 2, PGBENCH_SUB
+ },
+ {
+ "*", 2, PGBENCH_MUL
+ },
+ {
+ "/", 2, PGBENCH_DIV
+ },
+ {
+ "mod", 2, PGBENCH_MOD
+ },
+ /* actual functions */
+ {
+ "abs", 1, PGBENCH_ABS
+ },
+ {
+ "least", PGBENCH_NARGS_VARIABLE, PGBENCH_LEAST
+ },
+ {
+ "greatest", PGBENCH_NARGS_VARIABLE, PGBENCH_GREATEST
+ },
+ {
+ "debug", 1, PGBENCH_DEBUG
+ },
+ {
+ "pi", 0, PGBENCH_PI
+ },
+ {
+ "sqrt", 1, PGBENCH_SQRT
+ },
+ {
+ "ln", 1, PGBENCH_LN
+ },
+ {
+ "exp", 1, PGBENCH_EXP
+ },
+ {
+ "int", 1, PGBENCH_INT
+ },
+ {
+ "double", 1, PGBENCH_DOUBLE
+ },
+ {
+ "random", 2, PGBENCH_RANDOM
+ },
+ {
+ "random_gaussian", 3, PGBENCH_RANDOM_GAUSSIAN
+ },
+ {
+ "random_exponential", 3, PGBENCH_RANDOM_EXPONENTIAL
+ },
+ {
+ "random_zipfian", 3, PGBENCH_RANDOM_ZIPFIAN
+ },
+ {
+ "pow", 2, PGBENCH_POW
+ },
+ {
+ "power", 2, PGBENCH_POW
+ },
+ /* logical operators */
+ {
+ "!and", 2, PGBENCH_AND
+ },
+ {
+ "!or", 2, PGBENCH_OR
+ },
+ {
+ "!not", 1, PGBENCH_NOT
+ },
+ /* bitwise integer operators */
+ {
+ "&", 2, PGBENCH_BITAND
+ },
+ {
+ "|", 2, PGBENCH_BITOR
+ },
+ {
+ "#", 2, PGBENCH_BITXOR
+ },
+ {
+ "<<", 2, PGBENCH_LSHIFT
+ },
+ {
+ ">>", 2, PGBENCH_RSHIFT
+ },
+ /* comparison operators */
+ {
+ "=", 2, PGBENCH_EQ
+ },
+ {
+ "<>", 2, PGBENCH_NE
+ },
+ {
+ "<=", 2, PGBENCH_LE
+ },
+ {
+ "<", 2, PGBENCH_LT
+ },
+ {
+ "!is", 2, PGBENCH_IS
+ },
+ /* "case when ... then ... else ... end" construction */
+ {
+ "!case_end", PGBENCH_NARGS_CASE, PGBENCH_CASE
+ },
+ {
+ "hash", PGBENCH_NARGS_HASH, PGBENCH_HASH_MURMUR2
+ },
+ {
+ "hash_murmur2", PGBENCH_NARGS_HASH, PGBENCH_HASH_MURMUR2
+ },
+ {
+ "hash_fnv1a", PGBENCH_NARGS_HASH, PGBENCH_HASH_FNV1A
+ },
+ {
+ "permute", PGBENCH_NARGS_PERMUTE, PGBENCH_PERMUTE
+ },
+ /* keep as last array element */
+ {
+ NULL, 0, 0
+ }
+};
+
+/*
+ * Find a function from its name
+ *
+ * return the index of the function from the PGBENCH_FUNCTIONS array
+ * or fail if the function is unknown.
+ */
+static int
+find_func(yyscan_t yyscanner, const char *fname)
+{
+ int i = 0;
+
+ while (PGBENCH_FUNCTIONS[i].fname)
+ {
+ if (pg_strcasecmp(fname, PGBENCH_FUNCTIONS[i].fname) == 0)
+ return i;
+ i++;
+ }
+
+ expr_yyerror_more(yyscanner, "unexpected function name", fname);
+
+ /* not reached */
+ return -1;
+}
+
+/* Expression linked list builder */
+static PgBenchExprList *
+make_elist(PgBenchExpr *expr, PgBenchExprList *list)
+{
+ PgBenchExprLink *cons;
+
+ if (list == NULL)
+ {
+ list = pg_malloc(sizeof(PgBenchExprList));
+ list->head = NULL;
+ list->tail = NULL;
+ }
+
+ cons = pg_malloc(sizeof(PgBenchExprLink));
+ cons->expr = expr;
+ cons->next = NULL;
+
+ if (list->head == NULL)
+ list->head = cons;
+ else
+ list->tail->next = cons;
+
+ list->tail = cons;
+
+ return list;
+}
+
+/* Return the length of an expression list */
+static int
+elist_length(PgBenchExprList *list)
+{
+ PgBenchExprLink *link = list != NULL ? list->head : NULL;
+ int len = 0;
+
+ for (; link != NULL; link = link->next)
+ len++;
+
+ return len;
+}
+
+/* Build function call expression */
+static PgBenchExpr *
+make_func(yyscan_t yyscanner, int fnumber, PgBenchExprList *args)
+{
+ int len = elist_length(args);
+
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ Assert(fnumber >= 0);
+
+ /* validate arguments number including few special cases */
+ switch (PGBENCH_FUNCTIONS[fnumber].nargs)
+ {
+ /* check at least one arg for least & greatest */
+ case PGBENCH_NARGS_VARIABLE:
+ if (len == 0)
+ expr_yyerror_more(yyscanner, "at least one argument expected",
+ PGBENCH_FUNCTIONS[fnumber].fname);
+ break;
+
+ /* case (when ... then ...)+ (else ...)? end */
+ case PGBENCH_NARGS_CASE:
+ /* 'else' branch is always present, but could be a NULL-constant */
+ if (len < 3 || len % 2 != 1)
+ expr_yyerror_more(yyscanner,
+ "odd and >= 3 number of arguments expected",
+ "case control structure");
+ break;
+
+ /* hash functions with optional seed argument */
+ case PGBENCH_NARGS_HASH:
+ if (len < 1 || len > 2)
+ expr_yyerror_more(yyscanner, "unexpected number of arguments",
+ PGBENCH_FUNCTIONS[fnumber].fname);
+
+ if (len == 1)
+ {
+ PgBenchExpr *var = make_variable("default_seed");
+ args = make_elist(var, args);
+ }
+ break;
+
+ /* pseudorandom permutation function with optional seed argument */
+ case PGBENCH_NARGS_PERMUTE:
+ if (len < 2 || len > 3)
+ expr_yyerror_more(yyscanner, "unexpected number of arguments",
+ PGBENCH_FUNCTIONS[fnumber].fname);
+
+ if (len == 2)
+ {
+ PgBenchExpr *var = make_variable("default_seed");
+ args = make_elist(var, args);
+ }
+ break;
+
+ /* common case: positive arguments number */
+ default:
+ Assert(PGBENCH_FUNCTIONS[fnumber].nargs >= 0);
+
+ if (PGBENCH_FUNCTIONS[fnumber].nargs != len)
+ expr_yyerror_more(yyscanner, "unexpected number of arguments",
+ PGBENCH_FUNCTIONS[fnumber].fname);
+ }
+
+ expr->etype = ENODE_FUNCTION;
+ expr->u.function.function = PGBENCH_FUNCTIONS[fnumber].tag;
+
+ /* only the link is used, the head/tail is not useful anymore */
+ expr->u.function.args = args != NULL ? args->head : NULL;
+ if (args)
+ pg_free(args);
+
+ return expr;
+}
+
+static PgBenchExpr *
+make_case(yyscan_t yyscanner, PgBenchExprList *when_then_list, PgBenchExpr *else_part)
+{
+ return make_func(yyscanner,
+ find_func(yyscanner, "!case_end"),
+ make_elist(else_part, when_then_list));
+}
+
+/*
+ * exprscan.l is compiled as part of exprparse.y. Currently, this is
+ * unavoidable because exprparse does not create a .h file to export
+ * its token symbols. If these files ever grow large enough to be
+ * worth compiling separately, that could be fixed; but for now it
+ * seems like useless complication.
+ */
+
+/* First, get rid of "#define yyscan_t" from pgbench.h */
+#undef yyscan_t
+/* ... and the yylval macro, which flex will have its own definition for */
+#undef yylval
+
+#include "exprscan.c"
diff --git a/src/bin/pgbench/exprscan.c b/src/bin/pgbench/exprscan.c
new file mode 100644
index 0000000..d69bca0
--- /dev/null
+++ b/src/bin/pgbench/exprscan.c
@@ -0,0 +1,2835 @@
+#line 2 "exprscan.c"
+
+#line 4 "exprscan.c"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 6
+#define YY_FLEX_SUBMINOR_VERSION 4
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+#ifdef yy_create_buffer
+#define expr_yy_create_buffer_ALREADY_DEFINED
+#else
+#define yy_create_buffer expr_yy_create_buffer
+#endif
+
+#ifdef yy_delete_buffer
+#define expr_yy_delete_buffer_ALREADY_DEFINED
+#else
+#define yy_delete_buffer expr_yy_delete_buffer
+#endif
+
+#ifdef yy_scan_buffer
+#define expr_yy_scan_buffer_ALREADY_DEFINED
+#else
+#define yy_scan_buffer expr_yy_scan_buffer
+#endif
+
+#ifdef yy_scan_string
+#define expr_yy_scan_string_ALREADY_DEFINED
+#else
+#define yy_scan_string expr_yy_scan_string
+#endif
+
+#ifdef yy_scan_bytes
+#define expr_yy_scan_bytes_ALREADY_DEFINED
+#else
+#define yy_scan_bytes expr_yy_scan_bytes
+#endif
+
+#ifdef yy_init_buffer
+#define expr_yy_init_buffer_ALREADY_DEFINED
+#else
+#define yy_init_buffer expr_yy_init_buffer
+#endif
+
+#ifdef yy_flush_buffer
+#define expr_yy_flush_buffer_ALREADY_DEFINED
+#else
+#define yy_flush_buffer expr_yy_flush_buffer
+#endif
+
+#ifdef yy_load_buffer_state
+#define expr_yy_load_buffer_state_ALREADY_DEFINED
+#else
+#define yy_load_buffer_state expr_yy_load_buffer_state
+#endif
+
+#ifdef yy_switch_to_buffer
+#define expr_yy_switch_to_buffer_ALREADY_DEFINED
+#else
+#define yy_switch_to_buffer expr_yy_switch_to_buffer
+#endif
+
+#ifdef yypush_buffer_state
+#define expr_yypush_buffer_state_ALREADY_DEFINED
+#else
+#define yypush_buffer_state expr_yypush_buffer_state
+#endif
+
+#ifdef yypop_buffer_state
+#define expr_yypop_buffer_state_ALREADY_DEFINED
+#else
+#define yypop_buffer_state expr_yypop_buffer_state
+#endif
+
+#ifdef yyensure_buffer_stack
+#define expr_yyensure_buffer_stack_ALREADY_DEFINED
+#else
+#define yyensure_buffer_stack expr_yyensure_buffer_stack
+#endif
+
+#ifdef yylex
+#define expr_yylex_ALREADY_DEFINED
+#else
+#define yylex expr_yylex
+#endif
+
+#ifdef yyrestart
+#define expr_yyrestart_ALREADY_DEFINED
+#else
+#define yyrestart expr_yyrestart
+#endif
+
+#ifdef yylex_init
+#define expr_yylex_init_ALREADY_DEFINED
+#else
+#define yylex_init expr_yylex_init
+#endif
+
+#ifdef yylex_init_extra
+#define expr_yylex_init_extra_ALREADY_DEFINED
+#else
+#define yylex_init_extra expr_yylex_init_extra
+#endif
+
+#ifdef yylex_destroy
+#define expr_yylex_destroy_ALREADY_DEFINED
+#else
+#define yylex_destroy expr_yylex_destroy
+#endif
+
+#ifdef yyget_debug
+#define expr_yyget_debug_ALREADY_DEFINED
+#else
+#define yyget_debug expr_yyget_debug
+#endif
+
+#ifdef yyset_debug
+#define expr_yyset_debug_ALREADY_DEFINED
+#else
+#define yyset_debug expr_yyset_debug
+#endif
+
+#ifdef yyget_extra
+#define expr_yyget_extra_ALREADY_DEFINED
+#else
+#define yyget_extra expr_yyget_extra
+#endif
+
+#ifdef yyset_extra
+#define expr_yyset_extra_ALREADY_DEFINED
+#else
+#define yyset_extra expr_yyset_extra
+#endif
+
+#ifdef yyget_in
+#define expr_yyget_in_ALREADY_DEFINED
+#else
+#define yyget_in expr_yyget_in
+#endif
+
+#ifdef yyset_in
+#define expr_yyset_in_ALREADY_DEFINED
+#else
+#define yyset_in expr_yyset_in
+#endif
+
+#ifdef yyget_out
+#define expr_yyget_out_ALREADY_DEFINED
+#else
+#define yyget_out expr_yyget_out
+#endif
+
+#ifdef yyset_out
+#define expr_yyset_out_ALREADY_DEFINED
+#else
+#define yyset_out expr_yyset_out
+#endif
+
+#ifdef yyget_leng
+#define expr_yyget_leng_ALREADY_DEFINED
+#else
+#define yyget_leng expr_yyget_leng
+#endif
+
+#ifdef yyget_text
+#define expr_yyget_text_ALREADY_DEFINED
+#else
+#define yyget_text expr_yyget_text
+#endif
+
+#ifdef yyget_lineno
+#define expr_yyget_lineno_ALREADY_DEFINED
+#else
+#define yyget_lineno expr_yyget_lineno
+#endif
+
+#ifdef yyset_lineno
+#define expr_yyset_lineno_ALREADY_DEFINED
+#else
+#define yyset_lineno expr_yyset_lineno
+#endif
+
+#ifdef yyget_column
+#define expr_yyget_column_ALREADY_DEFINED
+#else
+#define yyget_column expr_yyget_column
+#endif
+
+#ifdef yyset_column
+#define expr_yyset_column_ALREADY_DEFINED
+#else
+#define yyset_column expr_yyset_column
+#endif
+
+#ifdef yywrap
+#define expr_yywrap_ALREADY_DEFINED
+#else
+#define yywrap expr_yywrap
+#endif
+
+#ifdef yyget_lval
+#define expr_yyget_lval_ALREADY_DEFINED
+#else
+#define yyget_lval expr_yyget_lval
+#endif
+
+#ifdef yyset_lval
+#define expr_yyset_lval_ALREADY_DEFINED
+#else
+#define yyset_lval expr_yyset_lval
+#endif
+
+#ifdef yyalloc
+#define expr_yyalloc_ALREADY_DEFINED
+#else
+#define yyalloc expr_yyalloc
+#endif
+
+#ifdef yyrealloc
+#define expr_yyrealloc_ALREADY_DEFINED
+#else
+#define yyrealloc expr_yyrealloc
+#endif
+
+#ifdef yyfree
+#define expr_yyfree_ALREADY_DEFINED
+#else
+#define yyfree expr_yyfree
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#ifndef SIZE_MAX
+#define SIZE_MAX (~(size_t)0)
+#endif
+
+#endif /* ! C99 */
+
+#endif /* ! FLEXINT_H */
+
+/* begin standard C++ headers. */
+
+/* TODO: this is always defined, so inline it */
+#define yyconst const
+
+#if defined(__GNUC__) && __GNUC__ >= 3
+#define yynoreturn __attribute__((__noreturn__))
+#else
+#define yynoreturn
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an
+ * integer in range [0..255] for use as an array index.
+ */
+#define YY_SC_TO_UI(c) ((YY_CHAR) (c))
+
+/* An opaque pointer. */
+#ifndef YY_TYPEDEF_YY_SCANNER_T
+#define YY_TYPEDEF_YY_SCANNER_T
+typedef void* yyscan_t;
+#endif
+
+/* For convenience, these vars (plus the bison vars far below)
+ are macros in the reentrant scanner. */
+#define yyin yyg->yyin_r
+#define yyout yyg->yyout_r
+#define yyextra yyg->yyextra_r
+#define yyleng yyg->yyleng_r
+#define yytext yyg->yytext_r
+#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
+#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
+#define yy_flex_debug yyg->yy_flex_debug_r
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yyg->yy_start = 1 + 2 *
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yyg->yy_start - 1) / 2)
+#define YYSTATE YY_START
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin , yyscanner )
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
+#define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+ #define YY_LINENO_REWIND_TO(ptr)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = yyg->yy_hold_char; \
+ YY_RESTORE_YY_MORE_OFFSET \
+ yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ int yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via yyrestart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \
+ ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \
+ : NULL)
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]
+
+void yyrestart ( FILE *input_file , yyscan_t yyscanner );
+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner );
+void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
+void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
+void yypop_buffer_state ( yyscan_t yyscanner );
+
+static void yyensure_buffer_stack ( yyscan_t yyscanner );
+static void yy_load_buffer_state ( yyscan_t yyscanner );
+static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner );
+#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner)
+
+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner );
+
+void *yyalloc ( yy_size_t , yyscan_t yyscanner );
+void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner );
+void yyfree ( void * , yyscan_t yyscanner );
+
+#define yy_new_buffer yy_create_buffer
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ yyensure_buffer_stack (yyscanner); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ yyensure_buffer_stack (yyscanner); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define expr_yywrap(yyscanner) (/*CONSTCOND*/1)
+#define YY_SKIP_YYWRAP
+typedef flex_uint8_t YY_CHAR;
+
+typedef int yy_state_type;
+
+#define yytext_ptr yytext_r
+
+static yy_state_type yy_get_previous_state ( yyscan_t yyscanner );
+static yy_state_type yy_try_NUL_trans ( yy_state_type current_state , yyscan_t yyscanner);
+static int yy_get_next_buffer ( yyscan_t yyscanner );
+static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ yyg->yytext_ptr = yy_bp; \
+ yyleng = (int) (yy_cp - yy_bp); \
+ yyg->yy_hold_char = *yy_cp; \
+ *yy_cp = '\0'; \
+ yyg->yy_c_buf_p = yy_cp;
+#define YY_NUM_RULES 51
+#define YY_END_OF_BUFFER 52
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static const flex_int16_t yy_accept[129] =
+ { 0,
+ 0, 0, 0, 0, 52, 1, 3, 5, 1, 50,
+ 47, 49, 50, 22, 10, 21, 24, 25, 8, 6,
+ 26, 7, 50, 9, 43, 43, 50, 18, 11, 19,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 50, 20, 23, 1, 1, 3, 4, 0, 47, 13,
+ 45, 44, 43, 0, 43, 38, 16, 14, 12, 15,
+ 17, 46, 46, 46, 46, 46, 46, 30, 46, 46,
+ 28, 46, 46, 46, 48, 0, 2, 0, 0, 44,
+ 0, 44, 43, 27, 46, 46, 37, 46, 46, 29,
+ 46, 46, 46, 46, 0, 45, 43, 33, 36, 46,
+
+ 46, 46, 39, 35, 40, 34, 43, 41, 46, 46,
+ 43, 31, 46, 43, 32, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 42, 0
+ } ;
+
+static const YY_CHAR yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 2, 2, 4, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 5, 1, 6, 1, 7, 8, 1, 9,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 1, 28,
+ 29, 30, 1, 1, 31, 32, 33, 34, 35, 36,
+ 32, 37, 38, 32, 32, 39, 32, 40, 41, 32,
+ 32, 42, 43, 44, 45, 32, 46, 32, 32, 32,
+ 1, 47, 1, 1, 32, 1, 31, 32, 33, 34,
+
+ 35, 36, 32, 37, 38, 32, 32, 39, 32, 40,
+ 41, 32, 32, 42, 43, 44, 45, 32, 46, 32,
+ 32, 32, 1, 48, 1, 49, 1, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32
+ } ;
+
+static const YY_CHAR yy_meta[50] =
+ { 0,
+ 1, 2, 2, 2, 1, 1, 1, 1, 1, 1,
+ 1, 3, 1, 3, 4, 1, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 1, 1, 1, 1,
+ 6, 6, 6, 6, 7, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 1, 1, 1
+ } ;
+
+static const flex_int16_t yy_base[138] =
+ { 0,
+ 0, 3, 50, 0, 204, 156, 6, 205, 97, 205,
+ 7, 205, 173, 205, 205, 205, 205, 205, 205, 205,
+ 205, 205, 0, 205, 0, 1, 0, 0, 205, 2,
+ 161, 0, 169, 0, 168, 155, 0, 155, 0, 159,
+ 9, 205, 205, 148, 99, 15, 205, 191, 19, 205,
+ 158, 157, 172, 10, 171, 0, 205, 205, 205, 205,
+ 205, 0, 155, 145, 144, 152, 146, 144, 139, 143,
+ 0, 146, 135, 143, 205, 172, 205, 169, 13, 128,
+ 32, 0, 14, 0, 120, 110, 0, 100, 97, 101,
+ 101, 99, 103, 97, 92, 0, 29, 0, 0, 101,
+
+ 95, 88, 0, 0, 0, 0, 19, 0, 93, 92,
+ 103, 0, 74, 88, 0, 89, 91, 92, 93, 97,
+ 100, 101, 104, 102, 111, 110, 7, 205, 146, 153,
+ 9, 157, 160, 163, 166, 171, 174
+ } ;
+
+static const flex_int16_t yy_def[138] =
+ { 0,
+ 129, 129, 128, 3, 128, 130, 128, 128, 130, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 131, 128, 132, 132, 133, 128, 128, 128,
+ 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+ 128, 128, 128, 130, 130, 128, 128, 128, 128, 128,
+ 131, 135, 26, 136, 26, 133, 128, 128, 128, 128,
+ 128, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 128, 128, 128, 128, 137, 135,
+ 136, 81, 26, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 137, 95, 26, 134, 134, 134,
+
+ 134, 134, 134, 134, 134, 134, 26, 134, 134, 134,
+ 26, 134, 134, 26, 134, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 0, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128
+ } ;
+
+static const flex_int16_t yy_nxt[255] =
+ { 0,
+ 128, 7, 8, 7, 7, 8, 7, 46, 49, 46,
+ 49, 75, 76, 51, 52, 52, 46, 128, 46, 55,
+ 49, 81, 49, 81, 95, 53, 95, 57, 58, 59,
+ 60, 61, 53, 97, 54, 54, 72, 53, 65, 66,
+ 69, 73, 111, 128, 70, 128, 9, 53, 107, 9,
+ 10, 11, 12, 11, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 26, 27, 28, 29, 30,
+ 31, 32, 33, 32, 34, 35, 32, 36, 32, 37,
+ 38, 32, 32, 39, 32, 40, 41, 42, 43, 47,
+
+ 48, 77, 78, 128, 116, 128, 53, 53, 117, 53,
+ 53, 53, 115, 118, 120, 53, 119, 121, 53, 53,
+ 53, 114, 53, 122, 123, 124, 125, 126, 53, 53,
+ 113, 112, 110, 109, 127, 108, 106, 105, 104, 103,
+ 102, 101, 100, 45, 99, 45, 6, 6, 6, 6,
+ 6, 6, 6, 44, 98, 44, 44, 44, 44, 44,
+ 53, 53, 54, 53, 56, 56, 56, 62, 62, 62,
+ 80, 77, 80, 82, 75, 82, 96, 94, 96, 93,
+ 92, 91, 90, 89, 88, 87, 86, 85, 84, 83,
+ 53, 54, 79, 47, 45, 74, 71, 68, 67, 64,
+
+ 63, 50, 45, 128, 5, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128
+ } ;
+
+static const flex_int16_t yy_chk[255] =
+ { 0,
+ 0, 1, 1, 1, 2, 2, 2, 7, 11, 7,
+ 11, 41, 41, 131, 25, 26, 46, 0, 46, 26,
+ 49, 54, 49, 54, 79, 127, 79, 28, 28, 28,
+ 30, 30, 83, 83, 25, 26, 39, 107, 34, 34,
+ 37, 39, 107, 81, 37, 81, 1, 97, 97, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 9,
+
+ 9, 45, 45, 95, 114, 95, 114, 116, 116, 117,
+ 118, 119, 113, 117, 119, 120, 118, 120, 121, 122,
+ 124, 111, 123, 121, 122, 123, 124, 125, 126, 125,
+ 110, 109, 102, 101, 126, 100, 94, 93, 92, 91,
+ 90, 89, 88, 9, 86, 45, 129, 129, 129, 129,
+ 129, 129, 129, 130, 85, 130, 130, 130, 130, 130,
+ 132, 132, 80, 132, 133, 133, 133, 134, 134, 134,
+ 135, 78, 135, 136, 76, 136, 137, 74, 137, 73,
+ 72, 70, 69, 68, 67, 66, 65, 64, 63, 55,
+ 53, 52, 51, 48, 44, 40, 38, 36, 35, 33,
+
+ 31, 13, 6, 5, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128
+ } ;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+#line 1 "exprscan.l"
+#line 2 "exprscan.l"
+/*-------------------------------------------------------------------------
+ *
+ * exprscan.l
+ * lexical scanner for pgbench backslash commands
+ *
+ * This lexer supports two operating modes:
+ *
+ * In INITIAL state, just parse off whitespace-separated words (this mode
+ * is basically equivalent to strtok(), which is what we used to use).
+ *
+ * In EXPR state, lex for the simple expression syntax of exprparse.y.
+ *
+ * In either mode, stop upon hitting newline or end of string.
+ *
+ * Note that this lexer operates within the framework created by psqlscan.l,
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pgbench/exprscan.l
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "fe_utils/psqlscan_int.h"
+
+/* context information for reporting errors in expressions */
+static const char *expr_source = NULL;
+static int expr_lineno = 0;
+static int expr_start_offset = 0;
+static const char *expr_command = NULL;
+
+/* indicates whether last yylex() call read a newline */
+static bool last_was_newline = false;
+
+/*
+ * Work around a bug in flex 2.5.35: it emits a couple of functions that
+ * it forgets to emit declarations for. Since we use -Wmissing-prototypes,
+ * this would cause warnings. Providing our own declarations should be
+ * harmless even when the bug gets fixed.
+ */
+extern int expr_yyget_column(yyscan_t yyscanner);
+extern void expr_yyset_column(int column_no, yyscan_t yyscanner);
+
+/* LCOV_EXCL_START */
+
+#line 790 "exprscan.c"
+/* Except for the prefix, these options should match psqlscan.l */
+#define YY_NO_INPUT 1
+/* Character classes */
+/* {space} + {nonspace} + {newline} should cover all characters */
+/* Line continuation marker */
+/* case insensitive keywords */
+/* Exclusive states */
+
+#line 799 "exprscan.c"
+
+#define INITIAL 0
+#define EXPR 1
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+/* Holds the entire state of the reentrant scanner. */
+struct yyguts_t
+ {
+
+ /* User-defined. Not touched by flex. */
+ YY_EXTRA_TYPE yyextra_r;
+
+ /* The rest are the same as the globals declared in the non-reentrant scanner. */
+ FILE *yyin_r, *yyout_r;
+ size_t yy_buffer_stack_top; /**< index of top of stack. */
+ size_t yy_buffer_stack_max; /**< capacity of stack. */
+ YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
+ char yy_hold_char;
+ int yy_n_chars;
+ int yyleng_r;
+ char *yy_c_buf_p;
+ int yy_init;
+ int yy_start;
+ int yy_did_buffer_switch_on_eof;
+ int yy_start_stack_ptr;
+ int yy_start_stack_depth;
+ int *yy_start_stack;
+ yy_state_type yy_last_accepting_state;
+ char* yy_last_accepting_cpos;
+
+ int yylineno_r;
+ int yy_flex_debug_r;
+
+ char *yytext_r;
+ int yy_more_flag;
+ int yy_more_len;
+
+ YYSTYPE * yylval_r;
+
+ }; /* end struct yyguts_t */
+
+static int yy_init_globals ( yyscan_t yyscanner );
+
+ /* This must go here because YYSTYPE and YYLTYPE are included
+ * from bison output in section 1.*/
+ # define yylval yyg->yylval_r
+
+int yylex_init (yyscan_t* scanner);
+
+int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner);
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int yylex_destroy ( yyscan_t yyscanner );
+
+int yyget_debug ( yyscan_t yyscanner );
+
+void yyset_debug ( int debug_flag , yyscan_t yyscanner );
+
+YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner );
+
+void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner );
+
+FILE *yyget_in ( yyscan_t yyscanner );
+
+void yyset_in ( FILE * _in_str , yyscan_t yyscanner );
+
+FILE *yyget_out ( yyscan_t yyscanner );
+
+void yyset_out ( FILE * _out_str , yyscan_t yyscanner );
+
+ int yyget_leng ( yyscan_t yyscanner );
+
+char *yyget_text ( yyscan_t yyscanner );
+
+int yyget_lineno ( yyscan_t yyscanner );
+
+void yyset_lineno ( int _line_number , yyscan_t yyscanner );
+
+int yyget_column ( yyscan_t yyscanner );
+
+void yyset_column ( int _column_no , yyscan_t yyscanner );
+
+YYSTYPE * yyget_lval ( yyscan_t yyscanner );
+
+void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap ( yyscan_t yyscanner );
+#else
+extern int yywrap ( yyscan_t yyscanner );
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner);
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen ( const char * , yyscan_t yyscanner);
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput ( yyscan_t yyscanner );
+#else
+static int input ( yyscan_t yyscanner );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
+#define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ int n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner)
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int yylex \
+ (YYSTYPE * yylval_param , yyscan_t yyscanner);
+
+#define YY_DECL int yylex \
+ (YYSTYPE * yylval_param , yyscan_t yyscanner)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK /*LINTED*/break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ yy_state_type yy_current_state;
+ char *yy_cp, *yy_bp;
+ int yy_act;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ yylval = yylval_param;
+
+ if ( !yyg->yy_init )
+ {
+ yyg->yy_init = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! yyg->yy_start )
+ yyg->yy_start = 1; /* first start state */
+
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ yyensure_buffer_stack (yyscanner);
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);
+ }
+
+ yy_load_buffer_state( yyscanner );
+ }
+
+ {
+#line 93 "exprscan.l"
+
+
+
+#line 97 "exprscan.l"
+ /* Declare some local variables inside yylex(), for convenience */
+ PsqlScanState cur_state = yyextra;
+
+ /*
+ * Force flex into the state indicated by start_state. This has a
+ * couple of purposes: it lets some of the functions below set a new
+ * starting state without ugly direct access to flex variables, and it
+ * allows us to transition from one flex lexer to another so that we
+ * can lex different parts of the source string using separate lexers.
+ */
+ BEGIN(cur_state->start_state);
+
+ /* Reset was-newline flag */
+ last_was_newline = false;
+
+
+ /* INITIAL state */
+
+#line 1095 "exprscan.c"
+
+ while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = yyg->yy_c_buf_p;
+
+ /* Support of yytext. */
+ *yy_cp = yyg->yy_hold_char;
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = yyg->yy_start;
+yy_match:
+ do
+ {
+ YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
+ if ( yy_accept[yy_current_state] )
+ {
+ yyg->yy_last_accepting_state = yy_current_state;
+ yyg->yy_last_accepting_cpos = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 129 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ ++yy_cp;
+ }
+ while ( yy_current_state != 128 );
+ yy_cp = yyg->yy_last_accepting_cpos;
+ yy_current_state = yyg->yy_last_accepting_state;
+
+yy_find_action:
+ yy_act = yy_accept[yy_current_state];
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+ case 0: /* must back up */
+ /* undo the effects of YY_DO_BEFORE_ACTION */
+ *yy_cp = yyg->yy_hold_char;
+ yy_cp = yyg->yy_last_accepting_cpos;
+ yy_current_state = yyg->yy_last_accepting_state;
+ goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 115 "exprscan.l"
+{
+ /* Found a word, emit and return it */
+ psqlscan_emit(cur_state, yytext, yyleng);
+ return 1;
+ }
+ YY_BREAK
+/*
+ * We need this rule to avoid returning "word\" instead of recognizing
+ * a continuation marker just after a word:
+ */
+case 2:
+/* rule 2 can match eol */
+YY_RULE_SETUP
+#line 125 "exprscan.l"
+{
+ /* Found "word\\\r?\n", emit and return just "word" */
+ int wordlen = yyleng - 2;
+ if (yytext[wordlen] == '\r')
+ wordlen--;
+ Assert(yytext[wordlen] == '\\');
+ psqlscan_emit(cur_state, yytext, wordlen);
+ return 1;
+ }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 135 "exprscan.l"
+{ /* ignore */ }
+ YY_BREAK
+case 4:
+/* rule 4 can match eol */
+YY_RULE_SETUP
+#line 137 "exprscan.l"
+{ /* ignore */ }
+ YY_BREAK
+case 5:
+/* rule 5 can match eol */
+YY_RULE_SETUP
+#line 139 "exprscan.l"
+{
+ /* report end of command */
+ last_was_newline = true;
+ return 0;
+ }
+ YY_BREAK
+/* EXPR state */
+
+case 6:
+YY_RULE_SETUP
+#line 149 "exprscan.l"
+{ return '+'; }
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 150 "exprscan.l"
+{ return '-'; }
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 151 "exprscan.l"
+{ return '*'; }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 152 "exprscan.l"
+{ return '/'; }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 153 "exprscan.l"
+{ return '%'; } /* C version, also in Pg SQL */
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 154 "exprscan.l"
+{ return '='; }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 155 "exprscan.l"
+{ return NE_OP; }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 156 "exprscan.l"
+{ return NE_OP; } /* C version, also in Pg SQL */
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 157 "exprscan.l"
+{ return LE_OP; }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 158 "exprscan.l"
+{ return GE_OP; }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 159 "exprscan.l"
+{ return LS_OP; }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 160 "exprscan.l"
+{ return RS_OP; }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 161 "exprscan.l"
+{ return '<'; }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 162 "exprscan.l"
+{ return '>'; }
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 163 "exprscan.l"
+{ return '|'; }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 164 "exprscan.l"
+{ return '&'; }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 165 "exprscan.l"
+{ return '#'; }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 166 "exprscan.l"
+{ return '~'; }
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 168 "exprscan.l"
+{ return '('; }
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 169 "exprscan.l"
+{ return ')'; }
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 170 "exprscan.l"
+{ return ','; }
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 172 "exprscan.l"
+{ return AND_OP; }
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 173 "exprscan.l"
+{ return OR_OP; }
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 174 "exprscan.l"
+{ return NOT_OP; }
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 175 "exprscan.l"
+{ return IS_OP; }
+ YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 176 "exprscan.l"
+{ return ISNULL_OP; }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 177 "exprscan.l"
+{ return NOTNULL_OP; }
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 179 "exprscan.l"
+{ return CASE_KW; }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 180 "exprscan.l"
+{ return WHEN_KW; }
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 181 "exprscan.l"
+{ return THEN_KW; }
+ YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 182 "exprscan.l"
+{ return ELSE_KW; }
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 183 "exprscan.l"
+{ return END_KW; }
+ YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 185 "exprscan.l"
+{
+ yylval->str = pg_strdup(yytext + 1);
+ return VARIABLE;
+ }
+ YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 190 "exprscan.l"
+{ return NULL_CONST; }
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 191 "exprscan.l"
+{
+ yylval->bval = true;
+ return BOOLEAN_CONST;
+ }
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 195 "exprscan.l"
+{
+ yylval->bval = false;
+ return BOOLEAN_CONST;
+ }
+ YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 199 "exprscan.l"
+{
+ /*
+ * Special handling for PG_INT64_MIN, which can't
+ * accurately be represented here, as the minus sign is
+ * lexed separately and INT64_MIN can't be represented as
+ * a positive integer.
+ */
+ return MAXINT_PLUS_ONE_CONST;
+ }
+ YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 208 "exprscan.l"
+{
+ if (!strtoint64(yytext, true, &yylval->ival))
+ expr_yyerror_more(yyscanner, "bigint constant overflow",
+ strdup(yytext));
+ return INTEGER_CONST;
+ }
+ YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 214 "exprscan.l"
+{
+ if (!strtodouble(yytext, true, &yylval->dval))
+ expr_yyerror_more(yyscanner, "double constant overflow",
+ strdup(yytext));
+ return DOUBLE_CONST;
+ }
+ YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 220 "exprscan.l"
+{
+ if (!strtodouble(yytext, true, &yylval->dval))
+ expr_yyerror_more(yyscanner, "double constant overflow",
+ strdup(yytext));
+ return DOUBLE_CONST;
+ }
+ YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 226 "exprscan.l"
+{
+ yylval->str = pg_strdup(yytext);
+ return FUNCTION;
+ }
+ YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 231 "exprscan.l"
+{ /* ignore */ }
+ YY_BREAK
+case 48:
+/* rule 48 can match eol */
+YY_RULE_SETUP
+#line 233 "exprscan.l"
+{ /* ignore */ }
+ YY_BREAK
+case 49:
+/* rule 49 can match eol */
+YY_RULE_SETUP
+#line 235 "exprscan.l"
+{
+ /* report end of command */
+ last_was_newline = true;
+ return 0;
+ }
+ YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 241 "exprscan.l"
+{
+ /*
+ * must strdup yytext so that expr_yyerror_more doesn't
+ * change it while finding end of line
+ */
+ expr_yyerror_more(yyscanner, "unexpected character",
+ pg_strdup(yytext));
+ /* NOTREACHED, syntax_error calls exit() */
+ return 0;
+ }
+ YY_BREAK
+
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(EXPR):
+#line 254 "exprscan.l"
+{
+ if (cur_state->buffer_stack == NULL)
+ return 0; /* end of input reached */
+
+ /*
+ * We were expanding a variable, so pop the inclusion
+ * stack and keep lexing
+ */
+ psqlscan_pop_buffer_stack(cur_state);
+ psqlscan_select_top_buffer(cur_state);
+ }
+ YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 266 "exprscan.l"
+YY_FATAL_ERROR( "flex scanner jammed" );
+ YY_BREAK
+#line 1494 "exprscan.c"
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = yyg->yy_hold_char;
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * yylex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner);
+
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++yyg->yy_c_buf_p;
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = yyg->yy_last_accepting_cpos;
+ yy_current_state = yyg->yy_last_accepting_state;
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( yyscanner ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ yyg->yy_did_buffer_switch_on_eof = 0;
+
+ if ( yywrap( yyscanner ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! yyg->yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yyg->yy_c_buf_p =
+ yyg->yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ yy_cp = yyg->yy_c_buf_p;
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ yyg->yy_c_buf_p =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars];
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ yy_cp = yyg->yy_c_buf_p;
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+ } /* end of user's declarations */
+} /* end of yylex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ char *source = yyg->yytext_ptr;
+ int number_to_move, i;
+ int ret_val;
+
+ if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1);
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0;
+
+ else
+ {
+ int num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
+
+ int yy_c_buf_p_offset =
+ (int) (yyg->yy_c_buf_p - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ int new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ yyrealloc( (void *) b->yy_ch_buf,
+ (yy_size_t) (b->yy_buf_size + 2) , yyscanner );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = NULL;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+ number_to_move - 1;
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ yyg->yy_n_chars, num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ if ( yyg->yy_n_chars == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ yyrestart( yyin , yyscanner);
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
+ (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ /* "- 2" to take care of EOB's */
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
+ }
+
+ yyg->yy_n_chars += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+ yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
+{
+ yy_state_type yy_current_state;
+ char *yy_cp;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ yy_current_state = yyg->yy_start;
+
+ for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )
+ {
+ YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ if ( yy_accept[yy_current_state] )
+ {
+ yyg->yy_last_accepting_state = yy_current_state;
+ yyg->yy_last_accepting_cpos = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 129 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner)
+{
+ int yy_is_jam;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
+ char *yy_cp = yyg->yy_c_buf_p;
+
+ YY_CHAR yy_c = 1;
+ if ( yy_accept[yy_current_state] )
+ {
+ yyg->yy_last_accepting_state = yy_current_state;
+ yyg->yy_last_accepting_cpos = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 129 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ yy_is_jam = (yy_current_state == 128);
+
+ (void)yyg;
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (yyscan_t yyscanner)
+#else
+ static int input (yyscan_t yyscanner)
+#endif
+
+{
+ int c;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+
+ if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
+ /* This was really a NUL. */
+ *yyg->yy_c_buf_p = '\0';
+
+ else
+ { /* need more input */
+ int offset = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr);
+ ++yyg->yy_c_buf_p;
+
+ switch ( yy_get_next_buffer( yyscanner ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ yyrestart( yyin , yyscanner);
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( yywrap( yyscanner ) )
+ return 0;
+
+ if ( ! yyg->yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput(yyscanner);
+#else
+ return input(yyscanner);
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yyg->yy_c_buf_p = yyg->yytext_ptr + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */
+ *yyg->yy_c_buf_p = '\0'; /* preserve yytext */
+ yyg->yy_hold_char = *++yyg->yy_c_buf_p;
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * @param yyscanner The scanner object.
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void yyrestart (FILE * input_file , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if ( ! YY_CURRENT_BUFFER ){
+ yyensure_buffer_stack (yyscanner);
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);
+ }
+
+ yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner);
+ yy_load_buffer_state( yyscanner );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * @param yyscanner The scanner object.
+ */
+ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * yypop_buffer_state();
+ * yypush_buffer_state(new_buffer);
+ */
+ yyensure_buffer_stack (yyscanner);
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ yy_load_buffer_state( yyscanner );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (yywrap()) processing, but the only time this flag
+ * is looked at is after yywrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ yyg->yy_did_buffer_switch_on_eof = 1;
+}
+
+static void yy_load_buffer_state (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ yyg->yy_hold_char = *yyg->yy_c_buf_p;
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * @param yyscanner The scanner object.
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ yy_init_buffer( b, file , yyscanner);
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ * @param yyscanner The scanner object.
+ */
+ void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ yyfree( (void *) b->yy_ch_buf , yyscanner );
+
+ yyfree( (void *) b , yyscanner );
+}
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner)
+
+{
+ int oerrno = errno;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ yy_flush_buffer( b , yyscanner);
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then yy_init_buffer was _probably_
+ * called from yyrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * @param yyscanner The scanner object.
+ */
+ void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ yy_load_buffer_state( yyscanner );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ * @param yyscanner The scanner object.
+ */
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if (new_buffer == NULL)
+ return;
+
+ yyensure_buffer_stack(yyscanner);
+
+ /* This block is copied from yy_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ yyg->yy_buffer_stack_top++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from yy_switch_to_buffer. */
+ yy_load_buffer_state( yyscanner );
+ yyg->yy_did_buffer_switch_on_eof = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ * @param yyscanner The scanner object.
+ */
+void yypop_buffer_state (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ yy_delete_buffer(YY_CURRENT_BUFFER , yyscanner);
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if (yyg->yy_buffer_stack_top > 0)
+ --yyg->yy_buffer_stack_top;
+
+ if (YY_CURRENT_BUFFER) {
+ yy_load_buffer_state( yyscanner );
+ yyg->yy_did_buffer_switch_on_eof = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void yyensure_buffer_stack (yyscan_t yyscanner)
+{
+ yy_size_t num_to_alloc;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (!yyg->yy_buffer_stack) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
+ yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ , yyscanner);
+ if ( ! yyg->yy_buffer_stack )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ yyg->yy_buffer_stack_max = num_to_alloc;
+ yyg->yy_buffer_stack_top = 0;
+ return;
+ }
+
+ if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ yy_size_t grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
+ yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc
+ (yyg->yy_buffer_stack,
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ , yyscanner);
+ if ( ! yyg->yy_buffer_stack )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));
+ yyg->yy_buffer_stack_max = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return NULL;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+ b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = NULL;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ yy_switch_to_buffer( b , yyscanner );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner)
+{
+
+ return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner);
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len , yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = (yy_size_t) (_yybytes_len + 2);
+ buf = (char *) yyalloc( n , yyscanner );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = yy_scan_buffer( buf, n , yyscanner);
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+ fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ yytext[yyleng] = yyg->yy_hold_char; \
+ yyg->yy_c_buf_p = yytext + yyless_macro_arg; \
+ yyg->yy_hold_char = *yyg->yy_c_buf_p; \
+ *yyg->yy_c_buf_p = '\0'; \
+ yyleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the user-defined data for this scanner.
+ * @param yyscanner The scanner object.
+ */
+YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyextra;
+}
+
+/** Get the current line number.
+ * @param yyscanner The scanner object.
+ */
+int yyget_lineno (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (! YY_CURRENT_BUFFER)
+ return 0;
+
+ return yylineno;
+}
+
+/** Get the current column number.
+ * @param yyscanner The scanner object.
+ */
+int yyget_column (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (! YY_CURRENT_BUFFER)
+ return 0;
+
+ return yycolumn;
+}
+
+/** Get the input stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *yyget_in (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyin;
+}
+
+/** Get the output stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *yyget_out (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyout;
+}
+
+/** Get the length of the current token.
+ * @param yyscanner The scanner object.
+ */
+int yyget_leng (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyleng;
+}
+
+/** Get the current token.
+ * @param yyscanner The scanner object.
+ */
+
+char *yyget_text (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yytext;
+}
+
+/** Set the user-defined data. This data is never touched by the scanner.
+ * @param user_defined The data to be associated with this scanner.
+ * @param yyscanner The scanner object.
+ */
+void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyextra = user_defined ;
+}
+
+/** Set the current line number.
+ * @param _line_number line number
+ * @param yyscanner The scanner object.
+ */
+void yyset_lineno (int _line_number , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* lineno is only valid if an input buffer exists. */
+ if (! YY_CURRENT_BUFFER )
+ YY_FATAL_ERROR( "yyset_lineno called with no buffer" );
+
+ yylineno = _line_number;
+}
+
+/** Set the current column.
+ * @param _column_no column number
+ * @param yyscanner The scanner object.
+ */
+void yyset_column (int _column_no , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* column is only valid if an input buffer exists. */
+ if (! YY_CURRENT_BUFFER )
+ YY_FATAL_ERROR( "yyset_column called with no buffer" );
+
+ yycolumn = _column_no;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param _in_str A readable stream.
+ * @param yyscanner The scanner object.
+ * @see yy_switch_to_buffer
+ */
+void yyset_in (FILE * _in_str , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyin = _in_str ;
+}
+
+void yyset_out (FILE * _out_str , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyout = _out_str ;
+}
+
+int yyget_debug (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yy_flex_debug;
+}
+
+void yyset_debug (int _bdebug , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yy_flex_debug = _bdebug ;
+}
+
+/* Accessor methods for yylval and yylloc */
+
+YYSTYPE * yyget_lval (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yylval;
+}
+
+void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yylval = yylval_param;
+}
+
+/* User-visible API */
+
+/* yylex_init is special because it creates the scanner itself, so it is
+ * the ONLY reentrant function that doesn't take the scanner as the last argument.
+ * That's why we explicitly handle the declaration, instead of using our macros.
+ */
+int yylex_init(yyscan_t* ptr_yy_globals)
+{
+ if (ptr_yy_globals == NULL){
+ errno = EINVAL;
+ return 1;
+ }
+
+ *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL );
+
+ if (*ptr_yy_globals == NULL){
+ errno = ENOMEM;
+ return 1;
+ }
+
+ /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */
+ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+
+ return yy_init_globals ( *ptr_yy_globals );
+}
+
+/* yylex_init_extra has the same functionality as yylex_init, but follows the
+ * convention of taking the scanner as the last argument. Note however, that
+ * this is a *pointer* to a scanner, as it will be allocated by this call (and
+ * is the reason, too, why this function also must handle its own declaration).
+ * The user defined value in the first argument will be available to yyalloc in
+ * the yyextra field.
+ */
+int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals )
+{
+ struct yyguts_t dummy_yyguts;
+
+ yyset_extra (yy_user_defined, &dummy_yyguts);
+
+ if (ptr_yy_globals == NULL){
+ errno = EINVAL;
+ return 1;
+ }
+
+ *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
+
+ if (*ptr_yy_globals == NULL){
+ errno = ENOMEM;
+ return 1;
+ }
+
+ /* By setting to 0xAA, we expose bugs in
+ yy_init_globals. Leave at 0x00 for releases. */
+ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+
+ yyset_extra (yy_user_defined, *ptr_yy_globals);
+
+ return yy_init_globals ( *ptr_yy_globals );
+}
+
+static int yy_init_globals (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from yylex_destroy(), so don't allocate here.
+ */
+
+ yyg->yy_buffer_stack = NULL;
+ yyg->yy_buffer_stack_top = 0;
+ yyg->yy_buffer_stack_max = 0;
+ yyg->yy_c_buf_p = NULL;
+ yyg->yy_init = 0;
+ yyg->yy_start = 0;
+
+ yyg->yy_start_stack_ptr = 0;
+ yyg->yy_start_stack_depth = 0;
+ yyg->yy_start_stack = NULL;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ yyin = stdin;
+ yyout = stdout;
+#else
+ yyin = NULL;
+ yyout = NULL;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * yylex_init()
+ */
+ return 0;
+}
+
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ yypop_buffer_state(yyscanner);
+ }
+
+ /* Destroy the stack itself. */
+ yyfree(yyg->yy_buffer_stack , yyscanner);
+ yyg->yy_buffer_stack = NULL;
+
+ /* Destroy the start condition stack. */
+ yyfree( yyg->yy_start_stack , yyscanner );
+ yyg->yy_start_stack = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * yylex() is called, initialization will occur. */
+ yy_init_globals( yyscanner);
+
+ /* Destroy the main struct (reentrant only). */
+ yyfree ( yyscanner , yyscanner );
+ yyscanner = NULL;
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+
+ int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (const char * s , yyscan_t yyscanner)
+{
+ int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *yyalloc (yy_size_t size , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+ return malloc(size);
+}
+
+void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return realloc(ptr, size);
+}
+
+void yyfree (void * ptr , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 266 "exprscan.l"
+
+
+/* LCOV_EXCL_STOP */
+
+void
+expr_yyerror_more(yyscan_t yyscanner, const char *message, const char *more)
+{
+ PsqlScanState state = yyget_extra(yyscanner);
+ int error_detection_offset = expr_scanner_offset(state) - 1;
+ YYSTYPE lval;
+ char *full_line;
+
+ /*
+ * While parsing an expression, we may not have collected the whole line
+ * yet from the input source. Lex till EOL so we can report whole line.
+ * (If we're at EOF, it's okay to call yylex() an extra time.)
+ */
+ if (!last_was_newline)
+ {
+ while (yylex(&lval, yyscanner))
+ /* skip */ ;
+ }
+
+ /* Extract the line, trimming trailing newline if any */
+ full_line = expr_scanner_get_substring(state,
+ expr_start_offset,
+ expr_scanner_offset(state),
+ true);
+
+ syntax_error(expr_source, expr_lineno, full_line, expr_command,
+ message, more, error_detection_offset - expr_start_offset);
+}
+
+void
+expr_yyerror(yyscan_t yyscanner, const char *message)
+{
+ expr_yyerror_more(yyscanner, message, NULL);
+}
+
+/*
+ * Collect a space-separated word from a backslash command and return it
+ * in word_buf, along with its starting string offset in *offset.
+ * Returns true if successful, false if at end of command.
+ */
+bool
+expr_lex_one_word(PsqlScanState state, PQExpBuffer word_buf, int *offset)
+{
+ int lexresult;
+ YYSTYPE lval;
+
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ /* Set current output target */
+ state->output_buf = word_buf;
+ resetPQExpBuffer(word_buf);
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /* Set start state */
+ state->start_state = INITIAL;
+
+ /* And lex. */
+ lexresult = yylex(&lval, state->scanner);
+
+ /*
+ * Save start offset of word, if any. We could do this more efficiently,
+ * but for now this seems fine.
+ */
+ if (lexresult)
+ *offset = expr_scanner_offset(state) - word_buf->len;
+ else
+ *offset = -1;
+
+ /*
+ * In case the caller returns to using the regular SQL lexer, reselect the
+ * appropriate initial state.
+ */
+ psql_scan_reselect_sql_lexer(state);
+
+ return (bool) lexresult;
+}
+
+/*
+ * Prepare to lex an expression via expr_yyparse().
+ *
+ * Returns the yyscan_t that is to be passed to expr_yyparse().
+ * (This is just state->scanner, but callers don't need to know that.)
+ */
+yyscan_t
+expr_scanner_init(PsqlScanState state,
+ const char *source, int lineno, int start_offset,
+ const char *command)
+{
+ /* Save error context info */
+ expr_source = source;
+ expr_lineno = lineno;
+ expr_start_offset = start_offset;
+ expr_command = command;
+
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ /* Set current output target */
+ state->output_buf = NULL;
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /* Set start state */
+ state->start_state = EXPR;
+
+ return state->scanner;
+}
+
+/*
+ * Finish lexing an expression.
+ */
+void
+expr_scanner_finish(yyscan_t yyscanner)
+{
+ PsqlScanState state = yyget_extra(yyscanner);
+
+ /*
+ * Reselect appropriate initial state for SQL lexer.
+ */
+ psql_scan_reselect_sql_lexer(state);
+}
+
+/*
+ * Get offset from start of string to end of current lexer token.
+ *
+ * We rely on the knowledge that flex modifies the scan buffer by storing
+ * a NUL at the end of the current token (yytext). Note that this might
+ * not work quite right if we were parsing a sub-buffer, but since pgbench
+ * never invokes that functionality, it doesn't matter.
+ */
+int
+expr_scanner_offset(PsqlScanState state)
+{
+ return strlen(state->scanbuf);
+}
+
+/*
+ * Get a malloc'd copy of the lexer input string from start_offset
+ * to just before end_offset. If chomp is true, drop any trailing
+ * newline(s).
+ */
+char *
+expr_scanner_get_substring(PsqlScanState state,
+ int start_offset, int end_offset,
+ bool chomp)
+{
+ char *result;
+ const char *scanptr = state->scanbuf + start_offset;
+ int slen = end_offset - start_offset;
+
+ Assert(slen >= 0);
+ Assert(end_offset <= strlen(state->scanbuf));
+
+ if (chomp)
+ {
+ while (slen > 0 &&
+ (scanptr[slen - 1] == '\n' || scanptr[slen - 1] == '\r'))
+ slen--;
+ }
+
+ result = (char *) pg_malloc(slen + 1);
+ memcpy(result, scanptr, slen);
+ result[slen] = '\0';
+
+ return result;
+}
+
+/*
+ * Get the line number associated with the given string offset
+ * (which must not be past the end of where we've lexed to).
+ */
+int
+expr_scanner_get_lineno(PsqlScanState state, int offset)
+{
+ int lineno = 1;
+ const char *p = state->scanbuf;
+
+ while (*p && offset > 0)
+ {
+ if (*p == '\n')
+ lineno++;
+ p++, offset--;
+ }
+ return lineno;
+}
+
diff --git a/src/bin/pgbench/exprscan.l b/src/bin/pgbench/exprscan.l
new file mode 100644
index 0000000..4f63818
--- /dev/null
+++ b/src/bin/pgbench/exprscan.l
@@ -0,0 +1,463 @@
+%{
+/*-------------------------------------------------------------------------
+ *
+ * exprscan.l
+ * lexical scanner for pgbench backslash commands
+ *
+ * This lexer supports two operating modes:
+ *
+ * In INITIAL state, just parse off whitespace-separated words (this mode
+ * is basically equivalent to strtok(), which is what we used to use).
+ *
+ * In EXPR state, lex for the simple expression syntax of exprparse.y.
+ *
+ * In either mode, stop upon hitting newline or end of string.
+ *
+ * Note that this lexer operates within the framework created by psqlscan.l,
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pgbench/exprscan.l
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "fe_utils/psqlscan_int.h"
+
+/* context information for reporting errors in expressions */
+static const char *expr_source = NULL;
+static int expr_lineno = 0;
+static int expr_start_offset = 0;
+static const char *expr_command = NULL;
+
+/* indicates whether last yylex() call read a newline */
+static bool last_was_newline = false;
+
+/*
+ * Work around a bug in flex 2.5.35: it emits a couple of functions that
+ * it forgets to emit declarations for. Since we use -Wmissing-prototypes,
+ * this would cause warnings. Providing our own declarations should be
+ * harmless even when the bug gets fixed.
+ */
+extern int expr_yyget_column(yyscan_t yyscanner);
+extern void expr_yyset_column(int column_no, yyscan_t yyscanner);
+
+/* LCOV_EXCL_START */
+
+%}
+
+/* Except for the prefix, these options should match psqlscan.l */
+%option reentrant
+%option bison-bridge
+%option 8bit
+%option never-interactive
+%option nodefault
+%option noinput
+%option nounput
+%option noyywrap
+%option warn
+%option prefix="expr_yy"
+
+/* Character classes */
+alpha [a-zA-Z\200-\377_]
+digit [0-9]
+alnum [A-Za-z\200-\377_0-9]
+/* {space} + {nonspace} + {newline} should cover all characters */
+space [ \t\r\f\v]
+nonspace [^ \t\r\f\v\n]
+newline [\n]
+
+/* Line continuation marker */
+continuation \\\r?{newline}
+
+/* case insensitive keywords */
+and [Aa][Nn][Dd]
+or [Oo][Rr]
+not [Nn][Oo][Tt]
+case [Cc][Aa][Ss][Ee]
+when [Ww][Hh][Ee][Nn]
+then [Tt][Hh][Ee][Nn]
+else [Ee][Ll][Ss][Ee]
+end [Ee][Nn][Dd]
+true [Tt][Rr][Uu][Ee]
+false [Ff][Aa][Ll][Ss][Ee]
+null [Nn][Uu][Ll][Ll]
+is [Ii][Ss]
+isnull [Ii][Ss][Nn][Uu][Ll][Ll]
+notnull [Nn][Oo][Tt][Nn][Uu][Ll][Ll]
+
+/* Exclusive states */
+%x EXPR
+
+%%
+
+%{
+ /* Declare some local variables inside yylex(), for convenience */
+ PsqlScanState cur_state = yyextra;
+
+ /*
+ * Force flex into the state indicated by start_state. This has a
+ * couple of purposes: it lets some of the functions below set a new
+ * starting state without ugly direct access to flex variables, and it
+ * allows us to transition from one flex lexer to another so that we
+ * can lex different parts of the source string using separate lexers.
+ */
+ BEGIN(cur_state->start_state);
+
+ /* Reset was-newline flag */
+ last_was_newline = false;
+%}
+
+ /* INITIAL state */
+
+{nonspace}+ {
+ /* Found a word, emit and return it */
+ psqlscan_emit(cur_state, yytext, yyleng);
+ return 1;
+ }
+
+ /*
+ * We need this rule to avoid returning "word\" instead of recognizing
+ * a continuation marker just after a word:
+ */
+{nonspace}+{continuation} {
+ /* Found "word\\\r?\n", emit and return just "word" */
+ int wordlen = yyleng - 2;
+ if (yytext[wordlen] == '\r')
+ wordlen--;
+ Assert(yytext[wordlen] == '\\');
+ psqlscan_emit(cur_state, yytext, wordlen);
+ return 1;
+ }
+
+{space}+ { /* ignore */ }
+
+{continuation} { /* ignore */ }
+
+{newline} {
+ /* report end of command */
+ last_was_newline = true;
+ return 0;
+ }
+
+ /* EXPR state */
+
+<EXPR>{
+
+"+" { return '+'; }
+"-" { return '-'; }
+"*" { return '*'; }
+"/" { return '/'; }
+"%" { return '%'; } /* C version, also in Pg SQL */
+"=" { return '='; }
+"<>" { return NE_OP; }
+"!=" { return NE_OP; } /* C version, also in Pg SQL */
+"<=" { return LE_OP; }
+">=" { return GE_OP; }
+"<<" { return LS_OP; }
+">>" { return RS_OP; }
+"<" { return '<'; }
+">" { return '>'; }
+"|" { return '|'; }
+"&" { return '&'; }
+"#" { return '#'; }
+"~" { return '~'; }
+
+"(" { return '('; }
+")" { return ')'; }
+"," { return ','; }
+
+{and} { return AND_OP; }
+{or} { return OR_OP; }
+{not} { return NOT_OP; }
+{is} { return IS_OP; }
+{isnull} { return ISNULL_OP; }
+{notnull} { return NOTNULL_OP; }
+
+{case} { return CASE_KW; }
+{when} { return WHEN_KW; }
+{then} { return THEN_KW; }
+{else} { return ELSE_KW; }
+{end} { return END_KW; }
+
+:{alnum}+ {
+ yylval->str = pg_strdup(yytext + 1);
+ return VARIABLE;
+ }
+
+{null} { return NULL_CONST; }
+{true} {
+ yylval->bval = true;
+ return BOOLEAN_CONST;
+ }
+{false} {
+ yylval->bval = false;
+ return BOOLEAN_CONST;
+ }
+"9223372036854775808" {
+ /*
+ * Special handling for PG_INT64_MIN, which can't
+ * accurately be represented here, as the minus sign is
+ * lexed separately and INT64_MIN can't be represented as
+ * a positive integer.
+ */
+ return MAXINT_PLUS_ONE_CONST;
+ }
+{digit}+ {
+ if (!strtoint64(yytext, true, &yylval->ival))
+ expr_yyerror_more(yyscanner, "bigint constant overflow",
+ strdup(yytext));
+ return INTEGER_CONST;
+ }
+{digit}+(\.{digit}*)?([eE][-+]?{digit}+)? {
+ if (!strtodouble(yytext, true, &yylval->dval))
+ expr_yyerror_more(yyscanner, "double constant overflow",
+ strdup(yytext));
+ return DOUBLE_CONST;
+ }
+\.{digit}+([eE][-+]?{digit}+)? {
+ if (!strtodouble(yytext, true, &yylval->dval))
+ expr_yyerror_more(yyscanner, "double constant overflow",
+ strdup(yytext));
+ return DOUBLE_CONST;
+ }
+{alpha}{alnum}* {
+ yylval->str = pg_strdup(yytext);
+ return FUNCTION;
+ }
+
+{space}+ { /* ignore */ }
+
+{continuation} { /* ignore */ }
+
+{newline} {
+ /* report end of command */
+ last_was_newline = true;
+ return 0;
+ }
+
+. {
+ /*
+ * must strdup yytext so that expr_yyerror_more doesn't
+ * change it while finding end of line
+ */
+ expr_yyerror_more(yyscanner, "unexpected character",
+ pg_strdup(yytext));
+ /* NOTREACHED, syntax_error calls exit() */
+ return 0;
+ }
+
+}
+
+<<EOF>> {
+ if (cur_state->buffer_stack == NULL)
+ return 0; /* end of input reached */
+
+ /*
+ * We were expanding a variable, so pop the inclusion
+ * stack and keep lexing
+ */
+ psqlscan_pop_buffer_stack(cur_state);
+ psqlscan_select_top_buffer(cur_state);
+ }
+
+%%
+
+/* LCOV_EXCL_STOP */
+
+void
+expr_yyerror_more(yyscan_t yyscanner, const char *message, const char *more)
+{
+ PsqlScanState state = yyget_extra(yyscanner);
+ int error_detection_offset = expr_scanner_offset(state) - 1;
+ YYSTYPE lval;
+ char *full_line;
+
+ /*
+ * While parsing an expression, we may not have collected the whole line
+ * yet from the input source. Lex till EOL so we can report whole line.
+ * (If we're at EOF, it's okay to call yylex() an extra time.)
+ */
+ if (!last_was_newline)
+ {
+ while (yylex(&lval, yyscanner))
+ /* skip */ ;
+ }
+
+ /* Extract the line, trimming trailing newline if any */
+ full_line = expr_scanner_get_substring(state,
+ expr_start_offset,
+ expr_scanner_offset(state),
+ true);
+
+ syntax_error(expr_source, expr_lineno, full_line, expr_command,
+ message, more, error_detection_offset - expr_start_offset);
+}
+
+void
+expr_yyerror(yyscan_t yyscanner, const char *message)
+{
+ expr_yyerror_more(yyscanner, message, NULL);
+}
+
+/*
+ * Collect a space-separated word from a backslash command and return it
+ * in word_buf, along with its starting string offset in *offset.
+ * Returns true if successful, false if at end of command.
+ */
+bool
+expr_lex_one_word(PsqlScanState state, PQExpBuffer word_buf, int *offset)
+{
+ int lexresult;
+ YYSTYPE lval;
+
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ /* Set current output target */
+ state->output_buf = word_buf;
+ resetPQExpBuffer(word_buf);
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /* Set start state */
+ state->start_state = INITIAL;
+
+ /* And lex. */
+ lexresult = yylex(&lval, state->scanner);
+
+ /*
+ * Save start offset of word, if any. We could do this more efficiently,
+ * but for now this seems fine.
+ */
+ if (lexresult)
+ *offset = expr_scanner_offset(state) - word_buf->len;
+ else
+ *offset = -1;
+
+ /*
+ * In case the caller returns to using the regular SQL lexer, reselect the
+ * appropriate initial state.
+ */
+ psql_scan_reselect_sql_lexer(state);
+
+ return (bool) lexresult;
+}
+
+/*
+ * Prepare to lex an expression via expr_yyparse().
+ *
+ * Returns the yyscan_t that is to be passed to expr_yyparse().
+ * (This is just state->scanner, but callers don't need to know that.)
+ */
+yyscan_t
+expr_scanner_init(PsqlScanState state,
+ const char *source, int lineno, int start_offset,
+ const char *command)
+{
+ /* Save error context info */
+ expr_source = source;
+ expr_lineno = lineno;
+ expr_start_offset = start_offset;
+ expr_command = command;
+
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ /* Set current output target */
+ state->output_buf = NULL;
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /* Set start state */
+ state->start_state = EXPR;
+
+ return state->scanner;
+}
+
+/*
+ * Finish lexing an expression.
+ */
+void
+expr_scanner_finish(yyscan_t yyscanner)
+{
+ PsqlScanState state = yyget_extra(yyscanner);
+
+ /*
+ * Reselect appropriate initial state for SQL lexer.
+ */
+ psql_scan_reselect_sql_lexer(state);
+}
+
+/*
+ * Get offset from start of string to end of current lexer token.
+ *
+ * We rely on the knowledge that flex modifies the scan buffer by storing
+ * a NUL at the end of the current token (yytext). Note that this might
+ * not work quite right if we were parsing a sub-buffer, but since pgbench
+ * never invokes that functionality, it doesn't matter.
+ */
+int
+expr_scanner_offset(PsqlScanState state)
+{
+ return strlen(state->scanbuf);
+}
+
+/*
+ * Get a malloc'd copy of the lexer input string from start_offset
+ * to just before end_offset. If chomp is true, drop any trailing
+ * newline(s).
+ */
+char *
+expr_scanner_get_substring(PsqlScanState state,
+ int start_offset, int end_offset,
+ bool chomp)
+{
+ char *result;
+ const char *scanptr = state->scanbuf + start_offset;
+ int slen = end_offset - start_offset;
+
+ Assert(slen >= 0);
+ Assert(end_offset <= strlen(state->scanbuf));
+
+ if (chomp)
+ {
+ while (slen > 0 &&
+ (scanptr[slen - 1] == '\n' || scanptr[slen - 1] == '\r'))
+ slen--;
+ }
+
+ result = (char *) pg_malloc(slen + 1);
+ memcpy(result, scanptr, slen);
+ result[slen] = '\0';
+
+ return result;
+}
+
+/*
+ * Get the line number associated with the given string offset
+ * (which must not be past the end of where we've lexed to).
+ */
+int
+expr_scanner_get_lineno(PsqlScanState state, int offset)
+{
+ int lineno = 1;
+ const char *p = state->scanbuf;
+
+ while (*p && offset > 0)
+ {
+ if (*p == '\n')
+ lineno++;
+ p++, offset--;
+ }
+ return lineno;
+}
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
new file mode 100644
index 0000000..895afcb
--- /dev/null
+++ b/src/bin/pgbench/pgbench.c
@@ -0,0 +1,7863 @@
+/*
+ * pgbench.c
+ *
+ * A simple benchmark program for PostgreSQL
+ * Originally written by Tatsuo Ishii and enhanced by many contributors.
+ *
+ * src/bin/pgbench/pgbench.c
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ * ALL RIGHTS RESERVED;
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose, without fee, and without a written agreement
+ * is hereby granted, provided that the above copyright notice and this
+ * paragraph and the following two paragraphs appear in all copies.
+ *
+ * IN NO EVENT SHALL THE AUTHOR OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING
+ * LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
+ * DOCUMENTATION, EVEN IF THE AUTHOR OR DISTRIBUTORS HAVE BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * THE AUTHOR AND DISTRIBUTORS SPECIFICALLY DISCLAIMS ANY WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE AUTHOR AND DISTRIBUTORS HAS NO OBLIGATIONS TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ */
+
+#ifdef WIN32
+#define FD_SETSIZE 1024 /* must set before winsock2.h is included */
+#endif
+
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#ifdef HAVE_SYS_RESOURCE_H
+#include <sys/resource.h> /* for getrlimit */
+#endif
+
+/* For testing, PGBENCH_USE_SELECT can be defined to force use of that code */
+#if defined(HAVE_PPOLL) && !defined(PGBENCH_USE_SELECT)
+#define POLL_USING_PPOLL
+#ifdef HAVE_POLL_H
+#include <poll.h>
+#endif
+#else /* no ppoll(), so use select() */
+#define POLL_USING_SELECT
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+#endif
+
+#include "common/int.h"
+#include "common/logging.h"
+#include "common/pg_prng.h"
+#include "common/string.h"
+#include "common/username.h"
+#include "fe_utils/cancel.h"
+#include "fe_utils/conditional.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/string_utils.h"
+#include "getopt_long.h"
+#include "libpq-fe.h"
+#include "pgbench.h"
+#include "port/pg_bitutils.h"
+#include "portability/instr_time.h"
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define ERRCODE_T_R_SERIALIZATION_FAILURE "40001"
+#define ERRCODE_T_R_DEADLOCK_DETECTED "40P01"
+#define ERRCODE_UNDEFINED_TABLE "42P01"
+
+/*
+ * Hashing constants
+ */
+#define FNV_PRIME UINT64CONST(0x100000001b3)
+#define FNV_OFFSET_BASIS UINT64CONST(0xcbf29ce484222325)
+#define MM2_MUL UINT64CONST(0xc6a4a7935bd1e995)
+#define MM2_MUL_TIMES_8 UINT64CONST(0x35253c9ade8f4ca8)
+#define MM2_ROT 47
+
+/*
+ * Multi-platform socket set implementations
+ */
+
+#ifdef POLL_USING_PPOLL
+#define SOCKET_WAIT_METHOD "ppoll"
+
+typedef struct socket_set
+{
+ int maxfds; /* allocated length of pollfds[] array */
+ int curfds; /* number currently in use */
+ struct pollfd pollfds[FLEXIBLE_ARRAY_MEMBER];
+} socket_set;
+
+#endif /* POLL_USING_PPOLL */
+
+#ifdef POLL_USING_SELECT
+#define SOCKET_WAIT_METHOD "select"
+
+typedef struct socket_set
+{
+ int maxfd; /* largest FD currently set in fds */
+ fd_set fds;
+} socket_set;
+
+#endif /* POLL_USING_SELECT */
+
+/*
+ * Multi-platform thread implementations
+ */
+
+#ifdef WIN32
+/* Use Windows threads */
+#include <windows.h>
+#define GETERRNO() (_dosmaperr(GetLastError()), errno)
+#define THREAD_T HANDLE
+#define THREAD_FUNC_RETURN_TYPE unsigned
+#define THREAD_FUNC_RETURN return 0
+#define THREAD_FUNC_CC __stdcall
+#define THREAD_CREATE(handle, function, arg) \
+ ((*(handle) = (HANDLE) _beginthreadex(NULL, 0, (function), (arg), 0, NULL)) == 0 ? errno : 0)
+#define THREAD_JOIN(handle) \
+ (WaitForSingleObject(handle, INFINITE) != WAIT_OBJECT_0 ? \
+ GETERRNO() : CloseHandle(handle) ? 0 : GETERRNO())
+#define THREAD_BARRIER_T SYNCHRONIZATION_BARRIER
+#define THREAD_BARRIER_INIT(barrier, n) \
+ (InitializeSynchronizationBarrier((barrier), (n), 0) ? 0 : GETERRNO())
+#define THREAD_BARRIER_WAIT(barrier) \
+ EnterSynchronizationBarrier((barrier), \
+ SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY)
+#define THREAD_BARRIER_DESTROY(barrier)
+#elif defined(ENABLE_THREAD_SAFETY)
+/* Use POSIX threads */
+#include "port/pg_pthread.h"
+#define THREAD_T pthread_t
+#define THREAD_FUNC_RETURN_TYPE void *
+#define THREAD_FUNC_RETURN return NULL
+#define THREAD_FUNC_CC
+#define THREAD_CREATE(handle, function, arg) \
+ pthread_create((handle), NULL, (function), (arg))
+#define THREAD_JOIN(handle) \
+ pthread_join((handle), NULL)
+#define THREAD_BARRIER_T pthread_barrier_t
+#define THREAD_BARRIER_INIT(barrier, n) \
+ pthread_barrier_init((barrier), NULL, (n))
+#define THREAD_BARRIER_WAIT(barrier) pthread_barrier_wait((barrier))
+#define THREAD_BARRIER_DESTROY(barrier) pthread_barrier_destroy((barrier))
+#else
+/* No threads implementation, use none (-j 1) */
+#define THREAD_T void *
+#define THREAD_FUNC_RETURN_TYPE void *
+#define THREAD_FUNC_RETURN return NULL
+#define THREAD_FUNC_CC
+#define THREAD_BARRIER_T int
+#define THREAD_BARRIER_INIT(barrier, n) (*(barrier) = 0)
+#define THREAD_BARRIER_WAIT(barrier)
+#define THREAD_BARRIER_DESTROY(barrier)
+#endif
+
+
+/********************************************************************
+ * some configurable parameters */
+
+#define DEFAULT_INIT_STEPS "dtgvp" /* default -I setting */
+#define ALL_INIT_STEPS "dtgGvpf" /* all possible steps */
+
+#define LOG_STEP_SECONDS 5 /* seconds between log messages */
+#define DEFAULT_NXACTS 10 /* default nxacts */
+
+#define MIN_GAUSSIAN_PARAM 2.0 /* minimum parameter for gauss */
+
+#define MIN_ZIPFIAN_PARAM 1.001 /* minimum parameter for zipfian */
+#define MAX_ZIPFIAN_PARAM 1000.0 /* maximum parameter for zipfian */
+
+int nxacts = 0; /* number of transactions per client */
+int duration = 0; /* duration in seconds */
+int64 end_time = 0; /* when to stop in micro seconds, under -T */
+
+/*
+ * scaling factor. for example, scale = 10 will make 1000000 tuples in
+ * pgbench_accounts table.
+ */
+int scale = 1;
+
+/*
+ * fillfactor. for example, fillfactor = 90 will use only 90 percent
+ * space during inserts and leave 10 percent free.
+ */
+int fillfactor = 100;
+
+/*
+ * use unlogged tables?
+ */
+bool unlogged_tables = false;
+
+/*
+ * log sampling rate (1.0 = log everything, 0.0 = option not given)
+ */
+double sample_rate = 0.0;
+
+/*
+ * When threads are throttled to a given rate limit, this is the target delay
+ * to reach that rate in usec. 0 is the default and means no throttling.
+ */
+double throttle_delay = 0;
+
+/*
+ * Transactions which take longer than this limit (in usec) are counted as
+ * late, and reported as such, although they are completed anyway. When
+ * throttling is enabled, execution time slots that are more than this late
+ * are skipped altogether, and counted separately.
+ */
+int64 latency_limit = 0;
+
+/*
+ * tablespace selection
+ */
+char *tablespace = NULL;
+char *index_tablespace = NULL;
+
+/*
+ * Number of "pgbench_accounts" partitions. 0 is the default and means no
+ * partitioning.
+ */
+static int partitions = 0;
+
+/* partitioning strategy for "pgbench_accounts" */
+typedef enum
+{
+ PART_NONE, /* no partitioning */
+ PART_RANGE, /* range partitioning */
+ PART_HASH /* hash partitioning */
+} partition_method_t;
+
+static partition_method_t partition_method = PART_NONE;
+static const char *PARTITION_METHOD[] = {"none", "range", "hash"};
+
+/* random seed used to initialize base_random_sequence */
+int64 random_seed = -1;
+
+/*
+ * end of configurable parameters
+ *********************************************************************/
+
+#define nbranches 1 /* Makes little sense to change this. Change
+ * -s instead */
+#define ntellers 10
+#define naccounts 100000
+
+/*
+ * The scale factor at/beyond which 32bit integers are incapable of storing
+ * 64bit values.
+ *
+ * Although the actual threshold is 21474, we use 20000 because it is easier to
+ * document and remember, and isn't that far away from the real threshold.
+ */
+#define SCALE_32BIT_THRESHOLD 20000
+
+bool use_log; /* log transaction latencies to a file */
+bool use_quiet; /* quiet logging onto stderr */
+int agg_interval; /* log aggregates instead of individual
+ * transactions */
+bool per_script_stats = false; /* whether to collect stats per script */
+int progress = 0; /* thread progress report every this seconds */
+bool progress_timestamp = false; /* progress report with Unix time */
+int nclients = 1; /* number of clients */
+int nthreads = 1; /* number of threads */
+bool is_connect; /* establish connection for each transaction */
+bool report_per_command = false; /* report per-command latencies,
+ * retries after errors and failures
+ * (errors without retrying) */
+int main_pid; /* main process id used in log filename */
+
+/*
+ * There are different types of restrictions for deciding that the current
+ * transaction with a serialization/deadlock error can no longer be retried and
+ * should be reported as failed:
+ * - max_tries (--max-tries) can be used to limit the number of tries;
+ * - latency_limit (-L) can be used to limit the total time of tries;
+ * - duration (-T) can be used to limit the total benchmark time.
+ *
+ * They can be combined together, and you need to use at least one of them to
+ * retry the transactions with serialization/deadlock errors. If none of them is
+ * used, the default value of max_tries is 1 and such transactions will not be
+ * retried.
+ */
+
+/*
+ * We cannot retry a transaction after the serialization/deadlock error if its
+ * number of tries reaches this maximum; if its value is zero, it is not used.
+ */
+uint32 max_tries = 1;
+
+bool failures_detailed = false; /* whether to group failures in
+ * reports or logs by basic types */
+
+const char *pghost = NULL;
+const char *pgport = NULL;
+const char *username = NULL;
+const char *dbName = NULL;
+char *logfile_prefix = NULL;
+const char *progname;
+
+#define WSEP '@' /* weight separator */
+
+volatile bool timer_exceeded = false; /* flag from signal handler */
+
+/*
+ * We don't want to allocate variables one by one; for efficiency, add a
+ * constant margin each time it overflows.
+ */
+#define VARIABLES_ALLOC_MARGIN 8
+
+/*
+ * Variable definitions.
+ *
+ * If a variable only has a string value, "svalue" is that value, and value is
+ * "not set". If the value is known, "value" contains the value (in any
+ * variant).
+ *
+ * In this case "svalue" contains the string equivalent of the value, if we've
+ * had occasion to compute that, or NULL if we haven't.
+ */
+typedef struct
+{
+ char *name; /* variable's name */
+ char *svalue; /* its value in string form, if known */
+ PgBenchValue value; /* actual variable's value */
+} Variable;
+
+/*
+ * Data structure for client variables.
+ */
+typedef struct
+{
+ Variable *vars; /* array of variable definitions */
+ int nvars; /* number of variables */
+
+ /*
+ * The maximum number of variables that we can currently store in 'vars'
+ * without having to reallocate more space. We must always have max_vars
+ * >= nvars.
+ */
+ int max_vars;
+
+ bool vars_sorted; /* are variables sorted by name? */
+} Variables;
+
+#define MAX_SCRIPTS 128 /* max number of SQL scripts allowed */
+#define SHELL_COMMAND_SIZE 256 /* maximum size allowed for shell command */
+
+/*
+ * Simple data structure to keep stats about something.
+ *
+ * XXX probably the first value should be kept and used as an offset for
+ * better numerical stability...
+ */
+typedef struct SimpleStats
+{
+ int64 count; /* how many values were encountered */
+ double min; /* the minimum seen */
+ double max; /* the maximum seen */
+ double sum; /* sum of values */
+ double sum2; /* sum of squared values */
+} SimpleStats;
+
+/*
+ * The instr_time type is expensive when dealing with time arithmetic. Define
+ * a type to hold microseconds instead. Type int64 is good enough for about
+ * 584500 years.
+ */
+typedef int64 pg_time_usec_t;
+
+/*
+ * Data structure to hold various statistics: per-thread and per-script stats
+ * are maintained and merged together.
+ */
+typedef struct StatsData
+{
+ pg_time_usec_t start_time; /* interval start time, for aggregates */
+
+ /*----------
+ * Transactions are counted depending on their execution and outcome.
+ * First a transaction may have started or not: skipped transactions occur
+ * under --rate and --latency-limit when the client is too late to execute
+ * them. Secondly, a started transaction may ultimately succeed or fail,
+ * possibly after some retries when --max-tries is not one. Thus
+ *
+ * the number of all transactions =
+ * 'skipped' (it was too late to execute them) +
+ * 'cnt' (the number of successful transactions) +
+ * 'failed' (the number of failed transactions).
+ *
+ * A successful transaction can have several unsuccessful tries before a
+ * successful run. Thus
+ *
+ * 'cnt' (the number of successful transactions) =
+ * successfully retried transactions (they got a serialization or a
+ * deadlock error(s), but were
+ * successfully retried from the very
+ * beginning) +
+ * directly successful transactions (they were successfully completed on
+ * the first try).
+ *
+ * A failed transaction is defined as unsuccessfully retried transactions.
+ * It can be one of two types:
+ *
+ * failed (the number of failed transactions) =
+ * 'serialization_failures' (they got a serialization error and were not
+ * successfully retried) +
+ * 'deadlock_failures' (they got a deadlock error and were not
+ * successfully retried).
+ *
+ * If the transaction was retried after a serialization or a deadlock
+ * error this does not guarantee that this retry was successful. Thus
+ *
+ * 'retries' (number of retries) =
+ * number of retries in all retried transactions =
+ * number of retries in (successfully retried transactions +
+ * failed transactions);
+ *
+ * 'retried' (number of all retried transactions) =
+ * successfully retried transactions +
+ * failed transactions.
+ *----------
+ */
+ int64 cnt; /* number of successful transactions, not
+ * including 'skipped' */
+ int64 skipped; /* number of transactions skipped under --rate
+ * and --latency-limit */
+ int64 retries; /* number of retries after a serialization or
+ * a deadlock error in all the transactions */
+ int64 retried; /* number of all transactions that were
+ * retried after a serialization or a deadlock
+ * error (perhaps the last try was
+ * unsuccessful) */
+ int64 serialization_failures; /* number of transactions that were
+ * not successfully retried after a
+ * serialization error */
+ int64 deadlock_failures; /* number of transactions that were not
+ * successfully retried after a deadlock
+ * error */
+ SimpleStats latency;
+ SimpleStats lag;
+} StatsData;
+
+/*
+ * For displaying Unix epoch timestamps, as some time functions may have
+ * another reference.
+ */
+pg_time_usec_t epoch_shift;
+
+/*
+ * Error status for errors during script execution.
+ */
+typedef enum EStatus
+{
+ ESTATUS_NO_ERROR = 0,
+ ESTATUS_META_COMMAND_ERROR,
+
+ /* SQL errors */
+ ESTATUS_SERIALIZATION_ERROR,
+ ESTATUS_DEADLOCK_ERROR,
+ ESTATUS_OTHER_SQL_ERROR
+} EStatus;
+
+/*
+ * Transaction status at the end of a command.
+ */
+typedef enum TStatus
+{
+ TSTATUS_IDLE,
+ TSTATUS_IN_BLOCK,
+ TSTATUS_CONN_ERROR,
+ TSTATUS_OTHER_ERROR
+} TStatus;
+
+/* Various random sequences are initialized from this one. */
+static pg_prng_state base_random_sequence;
+
+/* Synchronization barrier for start and connection */
+static THREAD_BARRIER_T barrier;
+
+/*
+ * Connection state machine states.
+ */
+typedef enum
+{
+ /*
+ * The client must first choose a script to execute. Once chosen, it can
+ * either be throttled (state CSTATE_PREPARE_THROTTLE under --rate), start
+ * right away (state CSTATE_START_TX) or not start at all if the timer was
+ * exceeded (state CSTATE_FINISHED).
+ */
+ CSTATE_CHOOSE_SCRIPT,
+
+ /*
+ * CSTATE_START_TX performs start-of-transaction processing. Establishes
+ * a new connection for the transaction in --connect mode, records the
+ * transaction start time, and proceed to the first command.
+ *
+ * Note: once a script is started, it will either error or run till its
+ * end, where it may be interrupted. It is not interrupted while running,
+ * so pgbench --time is to be understood as tx are allowed to start in
+ * that time, and will finish when their work is completed.
+ */
+ CSTATE_START_TX,
+
+ /*
+ * In CSTATE_PREPARE_THROTTLE state, we calculate when to begin the next
+ * transaction, and advance to CSTATE_THROTTLE. CSTATE_THROTTLE state
+ * sleeps until that moment, then advances to CSTATE_START_TX, or
+ * CSTATE_FINISHED if the next transaction would start beyond the end of
+ * the run.
+ */
+ CSTATE_PREPARE_THROTTLE,
+ CSTATE_THROTTLE,
+
+ /*
+ * We loop through these states, to process each command in the script:
+ *
+ * CSTATE_START_COMMAND starts the execution of a command. On a SQL
+ * command, the command is sent to the server, and we move to
+ * CSTATE_WAIT_RESULT state unless in pipeline mode. On a \sleep
+ * meta-command, the timer is set, and we enter the CSTATE_SLEEP state to
+ * wait for it to expire. Other meta-commands are executed immediately. If
+ * the command about to start is actually beyond the end of the script,
+ * advance to CSTATE_END_TX.
+ *
+ * CSTATE_WAIT_RESULT waits until we get a result set back from the server
+ * for the current command.
+ *
+ * CSTATE_SLEEP waits until the end of \sleep.
+ *
+ * CSTATE_END_COMMAND records the end-of-command timestamp, increments the
+ * command counter, and loops back to CSTATE_START_COMMAND state.
+ *
+ * CSTATE_SKIP_COMMAND is used by conditional branches which are not
+ * executed. It quickly skip commands that do not need any evaluation.
+ * This state can move forward several commands, till there is something
+ * to do or the end of the script.
+ */
+ CSTATE_START_COMMAND,
+ CSTATE_WAIT_RESULT,
+ CSTATE_SLEEP,
+ CSTATE_END_COMMAND,
+ CSTATE_SKIP_COMMAND,
+
+ /*
+ * States for failed commands.
+ *
+ * If the SQL/meta command fails, in CSTATE_ERROR clean up after an error:
+ * (1) clear the conditional stack; (2) if we have an unterminated
+ * (possibly failed) transaction block, send the rollback command to the
+ * server and wait for the result in CSTATE_WAIT_ROLLBACK_RESULT. If
+ * something goes wrong with rolling back, go to CSTATE_ABORTED.
+ *
+ * But if everything is ok we are ready for future transactions: if this
+ * is a serialization or deadlock error and we can re-execute the
+ * transaction from the very beginning, go to CSTATE_RETRY; otherwise go
+ * to CSTATE_FAILURE.
+ *
+ * In CSTATE_RETRY report an error, set the same parameters for the
+ * transaction execution as in the previous tries and process the first
+ * transaction command in CSTATE_START_COMMAND.
+ *
+ * In CSTATE_FAILURE report a failure, set the parameters for the
+ * transaction execution as they were before the first run of this
+ * transaction (except for a random state) and go to CSTATE_END_TX to
+ * complete this transaction.
+ */
+ CSTATE_ERROR,
+ CSTATE_WAIT_ROLLBACK_RESULT,
+ CSTATE_RETRY,
+ CSTATE_FAILURE,
+
+ /*
+ * CSTATE_END_TX performs end-of-transaction processing. It calculates
+ * latency, and logs the transaction. In --connect mode, it closes the
+ * current connection.
+ *
+ * Then either starts over in CSTATE_CHOOSE_SCRIPT, or enters
+ * CSTATE_FINISHED if we have no more work to do.
+ */
+ CSTATE_END_TX,
+
+ /*
+ * Final states. CSTATE_ABORTED means that the script execution was
+ * aborted because a command failed, CSTATE_FINISHED means success.
+ */
+ CSTATE_ABORTED,
+ CSTATE_FINISHED
+} ConnectionStateEnum;
+
+/*
+ * Connection state.
+ */
+typedef struct
+{
+ PGconn *con; /* connection handle to DB */
+ int id; /* client No. */
+ ConnectionStateEnum state; /* state machine's current state. */
+ ConditionalStack cstack; /* enclosing conditionals state */
+
+ /*
+ * Separate randomness for each client. This is used for random functions
+ * PGBENCH_RANDOM_* during the execution of the script.
+ */
+ pg_prng_state cs_func_rs;
+
+ int use_file; /* index in sql_script for this client */
+ int command; /* command number in script */
+
+ /* client variables */
+ Variables variables;
+
+ /* various times about current transaction in microseconds */
+ pg_time_usec_t txn_scheduled; /* scheduled start time of transaction */
+ pg_time_usec_t sleep_until; /* scheduled start time of next cmd */
+ pg_time_usec_t txn_begin; /* used for measuring schedule lag times */
+ pg_time_usec_t stmt_begin; /* used for measuring statement latencies */
+
+ /* whether client prepared each command of each script */
+ bool **prepared;
+
+ /*
+ * For processing failures and repeating transactions with serialization
+ * or deadlock errors:
+ */
+ EStatus estatus; /* the error status of the current transaction
+ * execution; this is ESTATUS_NO_ERROR if
+ * there were no errors */
+ pg_prng_state random_state; /* random state */
+ uint32 tries; /* how many times have we already tried the
+ * current transaction? */
+
+ /* per client collected stats */
+ int64 cnt; /* client transaction count, for -t; skipped
+ * and failed transactions are also counted
+ * here */
+} CState;
+
+/*
+ * Thread state
+ */
+typedef struct
+{
+ int tid; /* thread id */
+ THREAD_T thread; /* thread handle */
+ CState *state; /* array of CState */
+ int nstate; /* length of state[] */
+
+ /*
+ * Separate randomness for each thread. Each thread option uses its own
+ * random state to make all of them independent of each other and
+ * therefore deterministic at the thread level.
+ */
+ pg_prng_state ts_choose_rs; /* random state for selecting a script */
+ pg_prng_state ts_throttle_rs; /* random state for transaction throttling */
+ pg_prng_state ts_sample_rs; /* random state for log sampling */
+
+ int64 throttle_trigger; /* previous/next throttling (us) */
+ FILE *logfile; /* where to log, or NULL */
+
+ /* per thread collected stats in microseconds */
+ pg_time_usec_t create_time; /* thread creation time */
+ pg_time_usec_t started_time; /* thread is running */
+ pg_time_usec_t bench_start; /* thread is benchmarking */
+ pg_time_usec_t conn_duration; /* cumulated connection and disconnection
+ * delays */
+
+ StatsData stats;
+ int64 latency_late; /* count executed but late transactions */
+} TState;
+
+/*
+ * queries read from files
+ */
+#define SQL_COMMAND 1
+#define META_COMMAND 2
+
+/*
+ * max number of backslash command arguments or SQL variables,
+ * including the command or SQL statement itself
+ */
+#define MAX_ARGS 256
+
+typedef enum MetaCommand
+{
+ META_NONE, /* not a known meta-command */
+ META_SET, /* \set */
+ META_SETSHELL, /* \setshell */
+ META_SHELL, /* \shell */
+ META_SLEEP, /* \sleep */
+ META_GSET, /* \gset */
+ META_ASET, /* \aset */
+ META_IF, /* \if */
+ META_ELIF, /* \elif */
+ META_ELSE, /* \else */
+ META_ENDIF, /* \endif */
+ META_STARTPIPELINE, /* \startpipeline */
+ META_ENDPIPELINE /* \endpipeline */
+} MetaCommand;
+
+typedef enum QueryMode
+{
+ QUERY_SIMPLE, /* simple query */
+ QUERY_EXTENDED, /* extended query */
+ QUERY_PREPARED, /* extended query with prepared statements */
+ NUM_QUERYMODE
+} QueryMode;
+
+static QueryMode querymode = QUERY_SIMPLE;
+static const char *QUERYMODE[] = {"simple", "extended", "prepared"};
+
+/*
+ * struct Command represents one command in a script.
+ *
+ * lines The raw, possibly multi-line command text. Variable substitution
+ * not applied.
+ * first_line A short, single-line extract of 'lines', for error reporting.
+ * type SQL_COMMAND or META_COMMAND
+ * meta The type of meta-command, with META_NONE/GSET/ASET if command
+ * is SQL.
+ * argc Number of arguments of the command, 0 if not yet processed.
+ * argv Command arguments, the first of which is the command or SQL
+ * string itself. For SQL commands, after post-processing
+ * argv[0] is the same as 'lines' with variables substituted.
+ * prepname The name that this command is prepared under, in prepare mode
+ * varprefix SQL commands terminated with \gset or \aset have this set
+ * to a non NULL value. If nonempty, it's used to prefix the
+ * variable name that receives the value.
+ * aset do gset on all possible queries of a combined query (\;).
+ * expr Parsed expression, if needed.
+ * stats Time spent in this command.
+ * retries Number of retries after a serialization or deadlock error in the
+ * current command.
+ * failures Number of errors in the current command that were not retried.
+ */
+typedef struct Command
+{
+ PQExpBufferData lines;
+ char *first_line;
+ int type;
+ MetaCommand meta;
+ int argc;
+ char *argv[MAX_ARGS];
+ char *prepname;
+ char *varprefix;
+ PgBenchExpr *expr;
+ SimpleStats stats;
+ int64 retries;
+ int64 failures;
+} Command;
+
+typedef struct ParsedScript
+{
+ const char *desc; /* script descriptor (eg, file name) */
+ int weight; /* selection weight */
+ Command **commands; /* NULL-terminated array of Commands */
+ StatsData stats; /* total time spent in script */
+} ParsedScript;
+
+static ParsedScript sql_script[MAX_SCRIPTS]; /* SQL script files */
+static int num_scripts; /* number of scripts in sql_script[] */
+static int64 total_weight = 0;
+
+static bool verbose_errors = false; /* print verbose messages of all errors */
+
+/* Builtin test scripts */
+typedef struct BuiltinScript
+{
+ const char *name; /* very short name for -b ... */
+ const char *desc; /* short description */
+ const char *script; /* actual pgbench script */
+} BuiltinScript;
+
+static const BuiltinScript builtin_script[] =
+{
+ {
+ "tpcb-like",
+ "<builtin: TPC-B (sort of)>",
+ "\\set aid random(1, " CppAsString2(naccounts) " * :scale)\n"
+ "\\set bid random(1, " CppAsString2(nbranches) " * :scale)\n"
+ "\\set tid random(1, " CppAsString2(ntellers) " * :scale)\n"
+ "\\set delta random(-5000, 5000)\n"
+ "BEGIN;\n"
+ "UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;\n"
+ "SELECT abalance FROM pgbench_accounts WHERE aid = :aid;\n"
+ "UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;\n"
+ "UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;\n"
+ "INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);\n"
+ "END;\n"
+ },
+ {
+ "simple-update",
+ "<builtin: simple update>",
+ "\\set aid random(1, " CppAsString2(naccounts) " * :scale)\n"
+ "\\set bid random(1, " CppAsString2(nbranches) " * :scale)\n"
+ "\\set tid random(1, " CppAsString2(ntellers) " * :scale)\n"
+ "\\set delta random(-5000, 5000)\n"
+ "BEGIN;\n"
+ "UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;\n"
+ "SELECT abalance FROM pgbench_accounts WHERE aid = :aid;\n"
+ "INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);\n"
+ "END;\n"
+ },
+ {
+ "select-only",
+ "<builtin: select only>",
+ "\\set aid random(1, " CppAsString2(naccounts) " * :scale)\n"
+ "SELECT abalance FROM pgbench_accounts WHERE aid = :aid;\n"
+ }
+};
+
+
+/* Function prototypes */
+static void setNullValue(PgBenchValue *pv);
+static void setBoolValue(PgBenchValue *pv, bool bval);
+static void setIntValue(PgBenchValue *pv, int64 ival);
+static void setDoubleValue(PgBenchValue *pv, double dval);
+static bool evaluateExpr(CState *st, PgBenchExpr *expr,
+ PgBenchValue *retval);
+static ConnectionStateEnum executeMetaCommand(CState *st, pg_time_usec_t *now);
+static void doLog(TState *thread, CState *st,
+ StatsData *agg, bool skipped, double latency, double lag);
+static void processXactStats(TState *thread, CState *st, pg_time_usec_t *now,
+ bool skipped, StatsData *agg);
+static void addScript(const ParsedScript *script);
+static THREAD_FUNC_RETURN_TYPE THREAD_FUNC_CC threadRun(void *arg);
+static void finishCon(CState *st);
+static void setalarm(int seconds);
+static socket_set *alloc_socket_set(int count);
+static void free_socket_set(socket_set *sa);
+static void clear_socket_set(socket_set *sa);
+static void add_socket_to_set(socket_set *sa, int fd, int idx);
+static int wait_on_socket_set(socket_set *sa, int64 usecs);
+static bool socket_has_input(socket_set *sa, int fd, int idx);
+
+
+/* callback functions for our flex lexer */
+static const PsqlScanCallbacks pgbench_callbacks = {
+ NULL, /* don't need get_variable functionality */
+};
+
+static inline pg_time_usec_t
+pg_time_now(void)
+{
+ instr_time now;
+
+ INSTR_TIME_SET_CURRENT(now);
+
+ return (pg_time_usec_t) INSTR_TIME_GET_MICROSEC(now);
+}
+
+static inline void
+pg_time_now_lazy(pg_time_usec_t *now)
+{
+ if ((*now) == 0)
+ (*now) = pg_time_now();
+}
+
+#define PG_TIME_GET_DOUBLE(t) (0.000001 * (t))
+
+static void
+usage(void)
+{
+ printf("%s is a benchmarking tool for PostgreSQL.\n\n"
+ "Usage:\n"
+ " %s [OPTION]... [DBNAME]\n"
+ "\nInitialization options:\n"
+ " -i, --initialize invokes initialization mode\n"
+ " -I, --init-steps=[" ALL_INIT_STEPS "]+ (default \"" DEFAULT_INIT_STEPS "\")\n"
+ " run selected initialization steps\n"
+ " -F, --fillfactor=NUM set fill factor\n"
+ " -n, --no-vacuum do not run VACUUM during initialization\n"
+ " -q, --quiet quiet logging (one message each 5 seconds)\n"
+ " -s, --scale=NUM scaling factor\n"
+ " --foreign-keys create foreign key constraints between tables\n"
+ " --index-tablespace=TABLESPACE\n"
+ " create indexes in the specified tablespace\n"
+ " --partition-method=(range|hash)\n"
+ " partition pgbench_accounts with this method (default: range)\n"
+ " --partitions=NUM partition pgbench_accounts into NUM parts (default: 0)\n"
+ " --tablespace=TABLESPACE create tables in the specified tablespace\n"
+ " --unlogged-tables create tables as unlogged tables\n"
+ "\nOptions to select what to run:\n"
+ " -b, --builtin=NAME[@W] add builtin script NAME weighted at W (default: 1)\n"
+ " (use \"-b list\" to list available scripts)\n"
+ " -f, --file=FILENAME[@W] add script FILENAME weighted at W (default: 1)\n"
+ " -N, --skip-some-updates skip updates of pgbench_tellers and pgbench_branches\n"
+ " (same as \"-b simple-update\")\n"
+ " -S, --select-only perform SELECT-only transactions\n"
+ " (same as \"-b select-only\")\n"
+ "\nBenchmarking options:\n"
+ " -c, --client=NUM number of concurrent database clients (default: 1)\n"
+ " -C, --connect establish new connection for each transaction\n"
+ " -D, --define=VARNAME=VALUE\n"
+ " define variable for use by custom script\n"
+ " -j, --jobs=NUM number of threads (default: 1)\n"
+ " -l, --log write transaction times to log file\n"
+ " -L, --latency-limit=NUM count transactions lasting more than NUM ms as late\n"
+ " -M, --protocol=simple|extended|prepared\n"
+ " protocol for submitting queries (default: simple)\n"
+ " -n, --no-vacuum do not run VACUUM before tests\n"
+ " -P, --progress=NUM show thread progress report every NUM seconds\n"
+ " -r, --report-per-command report latencies, failures, and retries per command\n"
+ " -R, --rate=NUM target rate in transactions per second\n"
+ " -s, --scale=NUM report this scale factor in output\n"
+ " -t, --transactions=NUM number of transactions each client runs (default: 10)\n"
+ " -T, --time=NUM duration of benchmark test in seconds\n"
+ " -v, --vacuum-all vacuum all four standard tables before tests\n"
+ " --aggregate-interval=NUM aggregate data over NUM seconds\n"
+ " --failures-detailed report the failures grouped by basic types\n"
+ " --log-prefix=PREFIX prefix for transaction time log file\n"
+ " (default: \"pgbench_log\")\n"
+ " --max-tries=NUM max number of tries to run transaction (default: 1)\n"
+ " --progress-timestamp use Unix epoch timestamps for progress\n"
+ " --random-seed=SEED set random seed (\"time\", \"rand\", integer)\n"
+ " --sampling-rate=NUM fraction of transactions to log (e.g., 0.01 for 1%%)\n"
+ " --show-script=NAME show builtin script code, then exit\n"
+ " --verbose-errors print messages of all errors\n"
+ "\nCommon options:\n"
+ " -d, --debug print debugging output\n"
+ " -h, --host=HOSTNAME database server host or socket directory\n"
+ " -p, --port=PORT database server port number\n"
+ " -U, --username=USERNAME connect as specified database user\n"
+ " -V, --version output version information, then exit\n"
+ " -?, --help show this help, then exit\n"
+ "\n"
+ "Report bugs to <%s>.\n"
+ "%s home page: <%s>\n",
+ progname, progname, PACKAGE_BUGREPORT, PACKAGE_NAME, PACKAGE_URL);
+}
+
+/* return whether str matches "^\s*[-+]?[0-9]+$" */
+static bool
+is_an_int(const char *str)
+{
+ const char *ptr = str;
+
+ /* skip leading spaces; cast is consistent with strtoint64 */
+ while (*ptr && isspace((unsigned char) *ptr))
+ ptr++;
+
+ /* skip sign */
+ if (*ptr == '+' || *ptr == '-')
+ ptr++;
+
+ /* at least one digit */
+ if (*ptr && !isdigit((unsigned char) *ptr))
+ return false;
+
+ /* eat all digits */
+ while (*ptr && isdigit((unsigned char) *ptr))
+ ptr++;
+
+ /* must have reached end of string */
+ return *ptr == '\0';
+}
+
+
+/*
+ * strtoint64 -- convert a string to 64-bit integer
+ *
+ * This function is a slightly modified version of pg_strtoint64() from
+ * src/backend/utils/adt/numutils.c.
+ *
+ * The function returns whether the conversion worked, and if so
+ * "*result" is set to the result.
+ *
+ * If not errorOK, an error message is also printed out on errors.
+ */
+bool
+strtoint64(const char *str, bool errorOK, int64 *result)
+{
+ const char *ptr = str;
+ int64 tmp = 0;
+ bool neg = false;
+
+ /*
+ * Do our own scan, rather than relying on sscanf which might be broken
+ * for long long.
+ *
+ * As INT64_MIN can't be stored as a positive 64 bit integer, accumulate
+ * value as a negative number.
+ */
+
+ /* skip leading spaces */
+ while (*ptr && isspace((unsigned char) *ptr))
+ ptr++;
+
+ /* handle sign */
+ if (*ptr == '-')
+ {
+ ptr++;
+ neg = true;
+ }
+ else if (*ptr == '+')
+ ptr++;
+
+ /* require at least one digit */
+ if (unlikely(!isdigit((unsigned char) *ptr)))
+ goto invalid_syntax;
+
+ /* process digits */
+ while (*ptr && isdigit((unsigned char) *ptr))
+ {
+ int8 digit = (*ptr++ - '0');
+
+ if (unlikely(pg_mul_s64_overflow(tmp, 10, &tmp)) ||
+ unlikely(pg_sub_s64_overflow(tmp, digit, &tmp)))
+ goto out_of_range;
+ }
+
+ /* allow trailing whitespace, but not other trailing chars */
+ while (*ptr != '\0' && isspace((unsigned char) *ptr))
+ ptr++;
+
+ if (unlikely(*ptr != '\0'))
+ goto invalid_syntax;
+
+ if (!neg)
+ {
+ if (unlikely(tmp == PG_INT64_MIN))
+ goto out_of_range;
+ tmp = -tmp;
+ }
+
+ *result = tmp;
+ return true;
+
+out_of_range:
+ if (!errorOK)
+ pg_log_error("value \"%s\" is out of range for type bigint", str);
+ return false;
+
+invalid_syntax:
+ if (!errorOK)
+ pg_log_error("invalid input syntax for type bigint: \"%s\"", str);
+ return false;
+}
+
+/* convert string to double, detecting overflows/underflows */
+bool
+strtodouble(const char *str, bool errorOK, double *dv)
+{
+ char *end;
+
+ errno = 0;
+ *dv = strtod(str, &end);
+
+ if (unlikely(errno != 0))
+ {
+ if (!errorOK)
+ pg_log_error("value \"%s\" is out of range for type double", str);
+ return false;
+ }
+
+ if (unlikely(end == str || *end != '\0'))
+ {
+ if (!errorOK)
+ pg_log_error("invalid input syntax for type double: \"%s\"", str);
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Initialize a prng state struct.
+ *
+ * We derive the seed from base_random_sequence, which must be set up already.
+ */
+static void
+initRandomState(pg_prng_state *state)
+{
+ pg_prng_seed(state, pg_prng_uint64(&base_random_sequence));
+}
+
+
+/*
+ * random number generator: uniform distribution from min to max inclusive.
+ *
+ * Although the limits are expressed as int64, you can't generate the full
+ * int64 range in one call, because the difference of the limits mustn't
+ * overflow int64. This is not checked.
+ */
+static int64
+getrand(pg_prng_state *state, int64 min, int64 max)
+{
+ return min + (int64) pg_prng_uint64_range(state, 0, max - min);
+}
+
+/*
+ * random number generator: exponential distribution from min to max inclusive.
+ * the parameter is so that the density of probability for the last cut-off max
+ * value is exp(-parameter).
+ */
+static int64
+getExponentialRand(pg_prng_state *state, int64 min, int64 max,
+ double parameter)
+{
+ double cut,
+ uniform,
+ rand;
+
+ /* abort if wrong parameter, but must really be checked beforehand */
+ Assert(parameter > 0.0);
+ cut = exp(-parameter);
+ /* pg_prng_double value in [0, 1), uniform in (0, 1] */
+ uniform = 1.0 - pg_prng_double(state);
+
+ /*
+ * inner expression in (cut, 1] (if parameter > 0), rand in [0, 1)
+ */
+ Assert((1.0 - cut) != 0.0);
+ rand = -log(cut + (1.0 - cut) * uniform) / parameter;
+ /* return int64 random number within between min and max */
+ return min + (int64) ((max - min + 1) * rand);
+}
+
+/* random number generator: gaussian distribution from min to max inclusive */
+static int64
+getGaussianRand(pg_prng_state *state, int64 min, int64 max,
+ double parameter)
+{
+ double stdev;
+ double rand;
+
+ /* abort if parameter is too low, but must really be checked beforehand */
+ Assert(parameter >= MIN_GAUSSIAN_PARAM);
+
+ /*
+ * Get user specified random number from this loop, with -parameter <
+ * stdev <= parameter
+ *
+ * This loop is executed until the number is in the expected range.
+ *
+ * As the minimum parameter is 2.0, the probability of looping is low:
+ * sqrt(-2 ln(r)) <= 2 => r >= e^{-2} ~ 0.135, then when taking the
+ * average sinus multiplier as 2/pi, we have a 8.6% looping probability in
+ * the worst case. For a parameter value of 5.0, the looping probability
+ * is about e^{-5} * 2 / pi ~ 0.43%.
+ */
+ do
+ {
+ /*
+ * pg_prng_double generates [0, 1), but for the basic version of the
+ * Box-Muller transform the two uniformly distributed random numbers
+ * are expected to be in (0, 1] (see
+ * https://en.wikipedia.org/wiki/Box-Muller_transform)
+ */
+ double rand1 = 1.0 - pg_prng_double(state);
+ double rand2 = 1.0 - pg_prng_double(state);
+
+ /* Box-Muller basic form transform */
+ double var_sqrt = sqrt(-2.0 * log(rand1));
+
+ stdev = var_sqrt * sin(2.0 * M_PI * rand2);
+
+ /*
+ * we may try with cos, but there may be a bias induced if the
+ * previous value fails the test. To be on the safe side, let us try
+ * over.
+ */
+ }
+ while (stdev < -parameter || stdev >= parameter);
+
+ /* stdev is in [-parameter, parameter), normalization to [0,1) */
+ rand = (stdev + parameter) / (parameter * 2.0);
+
+ /* return int64 random number within between min and max */
+ return min + (int64) ((max - min + 1) * rand);
+}
+
+/*
+ * random number generator: generate a value, such that the series of values
+ * will approximate a Poisson distribution centered on the given value.
+ *
+ * Individual results are rounded to integers, though the center value need
+ * not be one.
+ */
+static int64
+getPoissonRand(pg_prng_state *state, double center)
+{
+ /*
+ * Use inverse transform sampling to generate a value > 0, such that the
+ * expected (i.e. average) value is the given argument.
+ */
+ double uniform;
+
+ /* pg_prng_double value in [0, 1), uniform in (0, 1] */
+ uniform = 1.0 - pg_prng_double(state);
+
+ return (int64) (-log(uniform) * center + 0.5);
+}
+
+/*
+ * Computing zipfian using rejection method, based on
+ * "Non-Uniform Random Variate Generation",
+ * Luc Devroye, p. 550-551, Springer 1986.
+ *
+ * This works for s > 1.0, but may perform badly for s very close to 1.0.
+ */
+static int64
+computeIterativeZipfian(pg_prng_state *state, int64 n, double s)
+{
+ double b = pow(2.0, s - 1.0);
+ double x,
+ t,
+ u,
+ v;
+
+ /* Ensure n is sane */
+ if (n <= 1)
+ return 1;
+
+ while (true)
+ {
+ /* random variates */
+ u = pg_prng_double(state);
+ v = pg_prng_double(state);
+
+ x = floor(pow(u, -1.0 / (s - 1.0)));
+
+ t = pow(1.0 + 1.0 / x, s - 1.0);
+ /* reject if too large or out of bound */
+ if (v * x * (t - 1.0) / (b - 1.0) <= t / b && x <= n)
+ break;
+ }
+ return (int64) x;
+}
+
+/* random number generator: zipfian distribution from min to max inclusive */
+static int64
+getZipfianRand(pg_prng_state *state, int64 min, int64 max, double s)
+{
+ int64 n = max - min + 1;
+
+ /* abort if parameter is invalid */
+ Assert(MIN_ZIPFIAN_PARAM <= s && s <= MAX_ZIPFIAN_PARAM);
+
+ return min - 1 + computeIterativeZipfian(state, n, s);
+}
+
+/*
+ * FNV-1a hash function
+ */
+static int64
+getHashFnv1a(int64 val, uint64 seed)
+{
+ int64 result;
+ int i;
+
+ result = FNV_OFFSET_BASIS ^ seed;
+ for (i = 0; i < 8; ++i)
+ {
+ int32 octet = val & 0xff;
+
+ val = val >> 8;
+ result = result ^ octet;
+ result = result * FNV_PRIME;
+ }
+
+ return result;
+}
+
+/*
+ * Murmur2 hash function
+ *
+ * Based on original work of Austin Appleby
+ * https://github.com/aappleby/smhasher/blob/master/src/MurmurHash2.cpp
+ */
+static int64
+getHashMurmur2(int64 val, uint64 seed)
+{
+ uint64 result = seed ^ MM2_MUL_TIMES_8; /* sizeof(int64) */
+ uint64 k = (uint64) val;
+
+ k *= MM2_MUL;
+ k ^= k >> MM2_ROT;
+ k *= MM2_MUL;
+
+ result ^= k;
+ result *= MM2_MUL;
+
+ result ^= result >> MM2_ROT;
+ result *= MM2_MUL;
+ result ^= result >> MM2_ROT;
+
+ return (int64) result;
+}
+
+/*
+ * Pseudorandom permutation function
+ *
+ * For small sizes, this generates each of the (size!) possible permutations
+ * of integers in the range [0, size) with roughly equal probability. Once
+ * the size is larger than 20, the number of possible permutations exceeds the
+ * number of distinct states of the internal pseudorandom number generator,
+ * and so not all possible permutations can be generated, but the permutations
+ * chosen should continue to give the appearance of being random.
+ *
+ * THIS FUNCTION IS NOT CRYPTOGRAPHICALLY SECURE.
+ * DO NOT USE FOR SUCH PURPOSE.
+ */
+static int64
+permute(const int64 val, const int64 isize, const int64 seed)
+{
+ /* using a high-end PRNG is probably overkill */
+ pg_prng_state state;
+ uint64 size;
+ uint64 v;
+ int masklen;
+ uint64 mask;
+ int i;
+
+ if (isize < 2)
+ return 0; /* nothing to permute */
+
+ /* Initialize prng state using the seed */
+ pg_prng_seed(&state, (uint64) seed);
+
+ /* Computations are performed on unsigned values */
+ size = (uint64) isize;
+ v = (uint64) val % size;
+
+ /* Mask to work modulo largest power of 2 less than or equal to size */
+ masklen = pg_leftmost_one_pos64(size);
+ mask = (((uint64) 1) << masklen) - 1;
+
+ /*
+ * Permute the input value by applying several rounds of pseudorandom
+ * bijective transformations. The intention here is to distribute each
+ * input uniformly randomly across the range, and separate adjacent inputs
+ * approximately uniformly randomly from each other, leading to a fairly
+ * random overall choice of permutation.
+ *
+ * To separate adjacent inputs, we multiply by a random number modulo
+ * (mask + 1), which is a power of 2. For this to be a bijection, the
+ * multiplier must be odd. Since this is known to lead to less randomness
+ * in the lower bits, we also apply a rotation that shifts the topmost bit
+ * into the least significant bit. In the special cases where size <= 3,
+ * mask = 1 and each of these operations is actually a no-op, so we also
+ * XOR the value with a different random number to inject additional
+ * randomness. Since the size is generally not a power of 2, we apply
+ * this bijection on overlapping upper and lower halves of the input.
+ *
+ * To distribute the inputs uniformly across the range, we then also apply
+ * a random offset modulo the full range.
+ *
+ * Taken together, these operations resemble a modified linear
+ * congruential generator, as is commonly used in pseudorandom number
+ * generators. The number of rounds is fairly arbitrary, but six has been
+ * found empirically to give a fairly good tradeoff between performance
+ * and uniform randomness. For small sizes it selects each of the (size!)
+ * possible permutations with roughly equal probability. For larger
+ * sizes, not all permutations can be generated, but the intended random
+ * spread is still produced.
+ */
+ for (i = 0; i < 6; i++)
+ {
+ uint64 m,
+ r,
+ t;
+
+ /* Random multiply (by an odd number), XOR and rotate of lower half */
+ m = (pg_prng_uint64(&state) & mask) | 1;
+ r = pg_prng_uint64(&state) & mask;
+ if (v <= mask)
+ {
+ v = ((v * m) ^ r) & mask;
+ v = ((v << 1) & mask) | (v >> (masklen - 1));
+ }
+
+ /* Random multiply (by an odd number), XOR and rotate of upper half */
+ m = (pg_prng_uint64(&state) & mask) | 1;
+ r = pg_prng_uint64(&state) & mask;
+ t = size - 1 - v;
+ if (t <= mask)
+ {
+ t = ((t * m) ^ r) & mask;
+ t = ((t << 1) & mask) | (t >> (masklen - 1));
+ v = size - 1 - t;
+ }
+
+ /* Random offset */
+ r = pg_prng_uint64_range(&state, 0, size - 1);
+ v = (v + r) % size;
+ }
+
+ return (int64) v;
+}
+
+/*
+ * Initialize the given SimpleStats struct to all zeroes
+ */
+static void
+initSimpleStats(SimpleStats *ss)
+{
+ memset(ss, 0, sizeof(SimpleStats));
+}
+
+/*
+ * Accumulate one value into a SimpleStats struct.
+ */
+static void
+addToSimpleStats(SimpleStats *ss, double val)
+{
+ if (ss->count == 0 || val < ss->min)
+ ss->min = val;
+ if (ss->count == 0 || val > ss->max)
+ ss->max = val;
+ ss->count++;
+ ss->sum += val;
+ ss->sum2 += val * val;
+}
+
+/*
+ * Merge two SimpleStats objects
+ */
+static void
+mergeSimpleStats(SimpleStats *acc, SimpleStats *ss)
+{
+ if (acc->count == 0 || ss->min < acc->min)
+ acc->min = ss->min;
+ if (acc->count == 0 || ss->max > acc->max)
+ acc->max = ss->max;
+ acc->count += ss->count;
+ acc->sum += ss->sum;
+ acc->sum2 += ss->sum2;
+}
+
+/*
+ * Initialize a StatsData struct to mostly zeroes, with its start time set to
+ * the given value.
+ */
+static void
+initStats(StatsData *sd, pg_time_usec_t start)
+{
+ sd->start_time = start;
+ sd->cnt = 0;
+ sd->skipped = 0;
+ sd->retries = 0;
+ sd->retried = 0;
+ sd->serialization_failures = 0;
+ sd->deadlock_failures = 0;
+ initSimpleStats(&sd->latency);
+ initSimpleStats(&sd->lag);
+}
+
+/*
+ * Accumulate one additional item into the given stats object.
+ */
+static void
+accumStats(StatsData *stats, bool skipped, double lat, double lag,
+ EStatus estatus, int64 tries)
+{
+ /* Record the skipped transaction */
+ if (skipped)
+ {
+ /* no latency to record on skipped transactions */
+ stats->skipped++;
+ return;
+ }
+
+ /*
+ * Record the number of retries regardless of whether the transaction was
+ * successful or failed.
+ */
+ if (tries > 1)
+ {
+ stats->retries += (tries - 1);
+ stats->retried++;
+ }
+
+ switch (estatus)
+ {
+ /* Record the successful transaction */
+ case ESTATUS_NO_ERROR:
+ stats->cnt++;
+
+ addToSimpleStats(&stats->latency, lat);
+
+ /* and possibly the same for schedule lag */
+ if (throttle_delay)
+ addToSimpleStats(&stats->lag, lag);
+ break;
+
+ /* Record the failed transaction */
+ case ESTATUS_SERIALIZATION_ERROR:
+ stats->serialization_failures++;
+ break;
+ case ESTATUS_DEADLOCK_ERROR:
+ stats->deadlock_failures++;
+ break;
+ default:
+ /* internal error which should never occur */
+ pg_fatal("unexpected error status: %d", estatus);
+ }
+}
+
+/* call PQexec() and exit() on failure */
+static void
+executeStatement(PGconn *con, const char *sql)
+{
+ PGresult *res;
+
+ res = PQexec(con, sql);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("query failed: %s", PQerrorMessage(con));
+ pg_log_error_detail("Query was: %s", sql);
+ exit(1);
+ }
+ PQclear(res);
+}
+
+/* call PQexec() and complain, but without exiting, on failure */
+static void
+tryExecuteStatement(PGconn *con, const char *sql)
+{
+ PGresult *res;
+
+ res = PQexec(con, sql);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("%s", PQerrorMessage(con));
+ pg_log_error_detail("(ignoring this error and continuing anyway)");
+ }
+ PQclear(res);
+}
+
+/* set up a connection to the backend */
+static PGconn *
+doConnect(void)
+{
+ PGconn *conn;
+ bool new_pass;
+ static char *password = NULL;
+
+ /*
+ * Start the connection. Loop until we have a password if requested by
+ * backend.
+ */
+ do
+ {
+#define PARAMS_ARRAY_SIZE 7
+
+ const char *keywords[PARAMS_ARRAY_SIZE];
+ const char *values[PARAMS_ARRAY_SIZE];
+
+ keywords[0] = "host";
+ values[0] = pghost;
+ keywords[1] = "port";
+ values[1] = pgport;
+ keywords[2] = "user";
+ values[2] = username;
+ keywords[3] = "password";
+ values[3] = password;
+ keywords[4] = "dbname";
+ values[4] = dbName;
+ keywords[5] = "fallback_application_name";
+ values[5] = progname;
+ keywords[6] = NULL;
+ values[6] = NULL;
+
+ new_pass = false;
+
+ conn = PQconnectdbParams(keywords, values, true);
+
+ if (!conn)
+ {
+ pg_log_error("connection to database \"%s\" failed", dbName);
+ return NULL;
+ }
+
+ if (PQstatus(conn) == CONNECTION_BAD &&
+ PQconnectionNeedsPassword(conn) &&
+ !password)
+ {
+ PQfinish(conn);
+ password = simple_prompt("Password: ", false);
+ new_pass = true;
+ }
+ } while (new_pass);
+
+ /* check to see that the backend connection was successfully made */
+ if (PQstatus(conn) == CONNECTION_BAD)
+ {
+ pg_log_error("%s", PQerrorMessage(conn));
+ PQfinish(conn);
+ return NULL;
+ }
+
+ return conn;
+}
+
+/* qsort comparator for Variable array */
+static int
+compareVariableNames(const void *v1, const void *v2)
+{
+ return strcmp(((const Variable *) v1)->name,
+ ((const Variable *) v2)->name);
+}
+
+/* Locate a variable by name; returns NULL if unknown */
+static Variable *
+lookupVariable(Variables *variables, char *name)
+{
+ Variable key;
+
+ /* On some versions of Solaris, bsearch of zero items dumps core */
+ if (variables->nvars <= 0)
+ return NULL;
+
+ /* Sort if we have to */
+ if (!variables->vars_sorted)
+ {
+ qsort((void *) variables->vars, variables->nvars, sizeof(Variable),
+ compareVariableNames);
+ variables->vars_sorted = true;
+ }
+
+ /* Now we can search */
+ key.name = name;
+ return (Variable *) bsearch((void *) &key,
+ (void *) variables->vars,
+ variables->nvars,
+ sizeof(Variable),
+ compareVariableNames);
+}
+
+/* Get the value of a variable, in string form; returns NULL if unknown */
+static char *
+getVariable(Variables *variables, char *name)
+{
+ Variable *var;
+ char stringform[64];
+
+ var = lookupVariable(variables, name);
+ if (var == NULL)
+ return NULL; /* not found */
+
+ if (var->svalue)
+ return var->svalue; /* we have it in string form */
+
+ /* We need to produce a string equivalent of the value */
+ Assert(var->value.type != PGBT_NO_VALUE);
+ if (var->value.type == PGBT_NULL)
+ snprintf(stringform, sizeof(stringform), "NULL");
+ else if (var->value.type == PGBT_BOOLEAN)
+ snprintf(stringform, sizeof(stringform),
+ "%s", var->value.u.bval ? "true" : "false");
+ else if (var->value.type == PGBT_INT)
+ snprintf(stringform, sizeof(stringform),
+ INT64_FORMAT, var->value.u.ival);
+ else if (var->value.type == PGBT_DOUBLE)
+ snprintf(stringform, sizeof(stringform),
+ "%.*g", DBL_DIG, var->value.u.dval);
+ else /* internal error, unexpected type */
+ Assert(0);
+ var->svalue = pg_strdup(stringform);
+ return var->svalue;
+}
+
+/* Try to convert variable to a value; return false on failure */
+static bool
+makeVariableValue(Variable *var)
+{
+ size_t slen;
+
+ if (var->value.type != PGBT_NO_VALUE)
+ return true; /* no work */
+
+ slen = strlen(var->svalue);
+
+ if (slen == 0)
+ /* what should it do on ""? */
+ return false;
+
+ if (pg_strcasecmp(var->svalue, "null") == 0)
+ {
+ setNullValue(&var->value);
+ }
+
+ /*
+ * accept prefixes such as y, ye, n, no... but not for "o". 0/1 are
+ * recognized later as an int, which is converted to bool if needed.
+ */
+ else if (pg_strncasecmp(var->svalue, "true", slen) == 0 ||
+ pg_strncasecmp(var->svalue, "yes", slen) == 0 ||
+ pg_strcasecmp(var->svalue, "on") == 0)
+ {
+ setBoolValue(&var->value, true);
+ }
+ else if (pg_strncasecmp(var->svalue, "false", slen) == 0 ||
+ pg_strncasecmp(var->svalue, "no", slen) == 0 ||
+ pg_strcasecmp(var->svalue, "off") == 0 ||
+ pg_strcasecmp(var->svalue, "of") == 0)
+ {
+ setBoolValue(&var->value, false);
+ }
+ else if (is_an_int(var->svalue))
+ {
+ /* if it looks like an int, it must be an int without overflow */
+ int64 iv;
+
+ if (!strtoint64(var->svalue, false, &iv))
+ return false;
+
+ setIntValue(&var->value, iv);
+ }
+ else /* type should be double */
+ {
+ double dv;
+
+ if (!strtodouble(var->svalue, true, &dv))
+ {
+ pg_log_error("malformed variable \"%s\" value: \"%s\"",
+ var->name, var->svalue);
+ return false;
+ }
+ setDoubleValue(&var->value, dv);
+ }
+ return true;
+}
+
+/*
+ * Check whether a variable's name is allowed.
+ *
+ * We allow any non-ASCII character, as well as ASCII letters, digits, and
+ * underscore.
+ *
+ * Keep this in sync with the definitions of variable name characters in
+ * "src/fe_utils/psqlscan.l", "src/bin/psql/psqlscanslash.l" and
+ * "src/bin/pgbench/exprscan.l". Also see parseVariable(), below.
+ *
+ * Note: this static function is copied from "src/bin/psql/variables.c"
+ * but changed to disallow variable names starting with a digit.
+ */
+static bool
+valid_variable_name(const char *name)
+{
+ const unsigned char *ptr = (const unsigned char *) name;
+
+ /* Mustn't be zero-length */
+ if (*ptr == '\0')
+ return false;
+
+ /* must not start with [0-9] */
+ if (IS_HIGHBIT_SET(*ptr) ||
+ strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"
+ "_", *ptr) != NULL)
+ ptr++;
+ else
+ return false;
+
+ /* remaining characters can include [0-9] */
+ while (*ptr)
+ {
+ if (IS_HIGHBIT_SET(*ptr) ||
+ strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"
+ "_0123456789", *ptr) != NULL)
+ ptr++;
+ else
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * Make sure there is enough space for 'needed' more variable in the variables
+ * array.
+ */
+static void
+enlargeVariables(Variables *variables, int needed)
+{
+ /* total number of variables required now */
+ needed += variables->nvars;
+
+ if (variables->max_vars < needed)
+ {
+ variables->max_vars = needed + VARIABLES_ALLOC_MARGIN;
+ variables->vars = (Variable *)
+ pg_realloc(variables->vars, variables->max_vars * sizeof(Variable));
+ }
+}
+
+/*
+ * Lookup a variable by name, creating it if need be.
+ * Caller is expected to assign a value to the variable.
+ * Returns NULL on failure (bad name).
+ */
+static Variable *
+lookupCreateVariable(Variables *variables, const char *context, char *name)
+{
+ Variable *var;
+
+ var = lookupVariable(variables, name);
+ if (var == NULL)
+ {
+ /*
+ * Check for the name only when declaring a new variable to avoid
+ * overhead.
+ */
+ if (!valid_variable_name(name))
+ {
+ pg_log_error("%s: invalid variable name: \"%s\"", context, name);
+ return NULL;
+ }
+
+ /* Create variable at the end of the array */
+ enlargeVariables(variables, 1);
+
+ var = &(variables->vars[variables->nvars]);
+
+ var->name = pg_strdup(name);
+ var->svalue = NULL;
+ /* caller is expected to initialize remaining fields */
+
+ variables->nvars++;
+ /* we don't re-sort the array till we have to */
+ variables->vars_sorted = false;
+ }
+
+ return var;
+}
+
+/* Assign a string value to a variable, creating it if need be */
+/* Returns false on failure (bad name) */
+static bool
+putVariable(Variables *variables, const char *context, char *name,
+ const char *value)
+{
+ Variable *var;
+ char *val;
+
+ var = lookupCreateVariable(variables, context, name);
+ if (!var)
+ return false;
+
+ /* dup then free, in case value is pointing at this variable */
+ val = pg_strdup(value);
+
+ if (var->svalue)
+ free(var->svalue);
+ var->svalue = val;
+ var->value.type = PGBT_NO_VALUE;
+
+ return true;
+}
+
+/* Assign a value to a variable, creating it if need be */
+/* Returns false on failure (bad name) */
+static bool
+putVariableValue(Variables *variables, const char *context, char *name,
+ const PgBenchValue *value)
+{
+ Variable *var;
+
+ var = lookupCreateVariable(variables, context, name);
+ if (!var)
+ return false;
+
+ if (var->svalue)
+ free(var->svalue);
+ var->svalue = NULL;
+ var->value = *value;
+
+ return true;
+}
+
+/* Assign an integer value to a variable, creating it if need be */
+/* Returns false on failure (bad name) */
+static bool
+putVariableInt(Variables *variables, const char *context, char *name,
+ int64 value)
+{
+ PgBenchValue val;
+
+ setIntValue(&val, value);
+ return putVariableValue(variables, context, name, &val);
+}
+
+/*
+ * Parse a possible variable reference (:varname).
+ *
+ * "sql" points at a colon. If what follows it looks like a valid
+ * variable name, return a malloc'd string containing the variable name,
+ * and set *eaten to the number of characters consumed (including the colon).
+ * Otherwise, return NULL.
+ */
+static char *
+parseVariable(const char *sql, int *eaten)
+{
+ int i = 1; /* starting at 1 skips the colon */
+ char *name;
+
+ /* keep this logic in sync with valid_variable_name() */
+ if (IS_HIGHBIT_SET(sql[i]) ||
+ strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"
+ "_", sql[i]) != NULL)
+ i++;
+ else
+ return NULL;
+
+ while (IS_HIGHBIT_SET(sql[i]) ||
+ strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"
+ "_0123456789", sql[i]) != NULL)
+ i++;
+
+ name = pg_malloc(i);
+ memcpy(name, &sql[1], i - 1);
+ name[i - 1] = '\0';
+
+ *eaten = i;
+ return name;
+}
+
+static char *
+replaceVariable(char **sql, char *param, int len, char *value)
+{
+ int valueln = strlen(value);
+
+ if (valueln > len)
+ {
+ size_t offset = param - *sql;
+
+ *sql = pg_realloc(*sql, strlen(*sql) - len + valueln + 1);
+ param = *sql + offset;
+ }
+
+ if (valueln != len)
+ memmove(param + valueln, param + len, strlen(param + len) + 1);
+ memcpy(param, value, valueln);
+
+ return param + valueln;
+}
+
+static char *
+assignVariables(Variables *variables, char *sql)
+{
+ char *p,
+ *name,
+ *val;
+
+ p = sql;
+ while ((p = strchr(p, ':')) != NULL)
+ {
+ int eaten;
+
+ name = parseVariable(p, &eaten);
+ if (name == NULL)
+ {
+ while (*p == ':')
+ {
+ p++;
+ }
+ continue;
+ }
+
+ val = getVariable(variables, name);
+ free(name);
+ if (val == NULL)
+ {
+ p++;
+ continue;
+ }
+
+ p = replaceVariable(&sql, p, eaten, val);
+ }
+
+ return sql;
+}
+
+static void
+getQueryParams(Variables *variables, const Command *command,
+ const char **params)
+{
+ int i;
+
+ for (i = 0; i < command->argc - 1; i++)
+ params[i] = getVariable(variables, command->argv[i + 1]);
+}
+
+static char *
+valueTypeName(PgBenchValue *pval)
+{
+ if (pval->type == PGBT_NO_VALUE)
+ return "none";
+ else if (pval->type == PGBT_NULL)
+ return "null";
+ else if (pval->type == PGBT_INT)
+ return "int";
+ else if (pval->type == PGBT_DOUBLE)
+ return "double";
+ else if (pval->type == PGBT_BOOLEAN)
+ return "boolean";
+ else
+ {
+ /* internal error, should never get there */
+ Assert(false);
+ return NULL;
+ }
+}
+
+/* get a value as a boolean, or tell if there is a problem */
+static bool
+coerceToBool(PgBenchValue *pval, bool *bval)
+{
+ if (pval->type == PGBT_BOOLEAN)
+ {
+ *bval = pval->u.bval;
+ return true;
+ }
+ else /* NULL, INT or DOUBLE */
+ {
+ pg_log_error("cannot coerce %s to boolean", valueTypeName(pval));
+ *bval = false; /* suppress uninitialized-variable warnings */
+ return false;
+ }
+}
+
+/*
+ * Return true or false from an expression for conditional purposes.
+ * Non zero numerical values are true, zero and NULL are false.
+ */
+static bool
+valueTruth(PgBenchValue *pval)
+{
+ switch (pval->type)
+ {
+ case PGBT_NULL:
+ return false;
+ case PGBT_BOOLEAN:
+ return pval->u.bval;
+ case PGBT_INT:
+ return pval->u.ival != 0;
+ case PGBT_DOUBLE:
+ return pval->u.dval != 0.0;
+ default:
+ /* internal error, unexpected type */
+ Assert(0);
+ return false;
+ }
+}
+
+/* get a value as an int, tell if there is a problem */
+static bool
+coerceToInt(PgBenchValue *pval, int64 *ival)
+{
+ if (pval->type == PGBT_INT)
+ {
+ *ival = pval->u.ival;
+ return true;
+ }
+ else if (pval->type == PGBT_DOUBLE)
+ {
+ double dval = rint(pval->u.dval);
+
+ if (isnan(dval) || !FLOAT8_FITS_IN_INT64(dval))
+ {
+ pg_log_error("double to int overflow for %f", dval);
+ return false;
+ }
+ *ival = (int64) dval;
+ return true;
+ }
+ else /* BOOLEAN or NULL */
+ {
+ pg_log_error("cannot coerce %s to int", valueTypeName(pval));
+ return false;
+ }
+}
+
+/* get a value as a double, or tell if there is a problem */
+static bool
+coerceToDouble(PgBenchValue *pval, double *dval)
+{
+ if (pval->type == PGBT_DOUBLE)
+ {
+ *dval = pval->u.dval;
+ return true;
+ }
+ else if (pval->type == PGBT_INT)
+ {
+ *dval = (double) pval->u.ival;
+ return true;
+ }
+ else /* BOOLEAN or NULL */
+ {
+ pg_log_error("cannot coerce %s to double", valueTypeName(pval));
+ return false;
+ }
+}
+
+/* assign a null value */
+static void
+setNullValue(PgBenchValue *pv)
+{
+ pv->type = PGBT_NULL;
+ pv->u.ival = 0;
+}
+
+/* assign a boolean value */
+static void
+setBoolValue(PgBenchValue *pv, bool bval)
+{
+ pv->type = PGBT_BOOLEAN;
+ pv->u.bval = bval;
+}
+
+/* assign an integer value */
+static void
+setIntValue(PgBenchValue *pv, int64 ival)
+{
+ pv->type = PGBT_INT;
+ pv->u.ival = ival;
+}
+
+/* assign a double value */
+static void
+setDoubleValue(PgBenchValue *pv, double dval)
+{
+ pv->type = PGBT_DOUBLE;
+ pv->u.dval = dval;
+}
+
+static bool
+isLazyFunc(PgBenchFunction func)
+{
+ return func == PGBENCH_AND || func == PGBENCH_OR || func == PGBENCH_CASE;
+}
+
+/* lazy evaluation of some functions */
+static bool
+evalLazyFunc(CState *st,
+ PgBenchFunction func, PgBenchExprLink *args, PgBenchValue *retval)
+{
+ PgBenchValue a1,
+ a2;
+ bool ba1,
+ ba2;
+
+ Assert(isLazyFunc(func) && args != NULL && args->next != NULL);
+
+ /* args points to first condition */
+ if (!evaluateExpr(st, args->expr, &a1))
+ return false;
+
+ /* second condition for AND/OR and corresponding branch for CASE */
+ args = args->next;
+
+ switch (func)
+ {
+ case PGBENCH_AND:
+ if (a1.type == PGBT_NULL)
+ {
+ setNullValue(retval);
+ return true;
+ }
+
+ if (!coerceToBool(&a1, &ba1))
+ return false;
+
+ if (!ba1)
+ {
+ setBoolValue(retval, false);
+ return true;
+ }
+
+ if (!evaluateExpr(st, args->expr, &a2))
+ return false;
+
+ if (a2.type == PGBT_NULL)
+ {
+ setNullValue(retval);
+ return true;
+ }
+ else if (!coerceToBool(&a2, &ba2))
+ return false;
+ else
+ {
+ setBoolValue(retval, ba2);
+ return true;
+ }
+
+ return true;
+
+ case PGBENCH_OR:
+
+ if (a1.type == PGBT_NULL)
+ {
+ setNullValue(retval);
+ return true;
+ }
+
+ if (!coerceToBool(&a1, &ba1))
+ return false;
+
+ if (ba1)
+ {
+ setBoolValue(retval, true);
+ return true;
+ }
+
+ if (!evaluateExpr(st, args->expr, &a2))
+ return false;
+
+ if (a2.type == PGBT_NULL)
+ {
+ setNullValue(retval);
+ return true;
+ }
+ else if (!coerceToBool(&a2, &ba2))
+ return false;
+ else
+ {
+ setBoolValue(retval, ba2);
+ return true;
+ }
+
+ case PGBENCH_CASE:
+ /* when true, execute branch */
+ if (valueTruth(&a1))
+ return evaluateExpr(st, args->expr, retval);
+
+ /* now args contains next condition or final else expression */
+ args = args->next;
+
+ /* final else case? */
+ if (args->next == NULL)
+ return evaluateExpr(st, args->expr, retval);
+
+ /* no, another when, proceed */
+ return evalLazyFunc(st, PGBENCH_CASE, args, retval);
+
+ default:
+ /* internal error, cannot get here */
+ Assert(0);
+ break;
+ }
+ return false;
+}
+
+/* maximum number of function arguments */
+#define MAX_FARGS 16
+
+/*
+ * Recursive evaluation of standard functions,
+ * which do not require lazy evaluation.
+ */
+static bool
+evalStandardFunc(CState *st,
+ PgBenchFunction func, PgBenchExprLink *args,
+ PgBenchValue *retval)
+{
+ /* evaluate all function arguments */
+ int nargs = 0;
+ PgBenchValue vargs[MAX_FARGS];
+ PgBenchExprLink *l = args;
+ bool has_null = false;
+
+ for (nargs = 0; nargs < MAX_FARGS && l != NULL; nargs++, l = l->next)
+ {
+ if (!evaluateExpr(st, l->expr, &vargs[nargs]))
+ return false;
+ has_null |= vargs[nargs].type == PGBT_NULL;
+ }
+
+ if (l != NULL)
+ {
+ pg_log_error("too many function arguments, maximum is %d", MAX_FARGS);
+ return false;
+ }
+
+ /* NULL arguments */
+ if (has_null && func != PGBENCH_IS && func != PGBENCH_DEBUG)
+ {
+ setNullValue(retval);
+ return true;
+ }
+
+ /* then evaluate function */
+ switch (func)
+ {
+ /* overloaded operators */
+ case PGBENCH_ADD:
+ case PGBENCH_SUB:
+ case PGBENCH_MUL:
+ case PGBENCH_DIV:
+ case PGBENCH_MOD:
+ case PGBENCH_EQ:
+ case PGBENCH_NE:
+ case PGBENCH_LE:
+ case PGBENCH_LT:
+ {
+ PgBenchValue *lval = &vargs[0],
+ *rval = &vargs[1];
+
+ Assert(nargs == 2);
+
+ /* overloaded type management, double if some double */
+ if ((lval->type == PGBT_DOUBLE ||
+ rval->type == PGBT_DOUBLE) && func != PGBENCH_MOD)
+ {
+ double ld,
+ rd;
+
+ if (!coerceToDouble(lval, &ld) ||
+ !coerceToDouble(rval, &rd))
+ return false;
+
+ switch (func)
+ {
+ case PGBENCH_ADD:
+ setDoubleValue(retval, ld + rd);
+ return true;
+
+ case PGBENCH_SUB:
+ setDoubleValue(retval, ld - rd);
+ return true;
+
+ case PGBENCH_MUL:
+ setDoubleValue(retval, ld * rd);
+ return true;
+
+ case PGBENCH_DIV:
+ setDoubleValue(retval, ld / rd);
+ return true;
+
+ case PGBENCH_EQ:
+ setBoolValue(retval, ld == rd);
+ return true;
+
+ case PGBENCH_NE:
+ setBoolValue(retval, ld != rd);
+ return true;
+
+ case PGBENCH_LE:
+ setBoolValue(retval, ld <= rd);
+ return true;
+
+ case PGBENCH_LT:
+ setBoolValue(retval, ld < rd);
+ return true;
+
+ default:
+ /* cannot get here */
+ Assert(0);
+ }
+ }
+ else /* we have integer operands, or % */
+ {
+ int64 li,
+ ri,
+ res;
+
+ if (!coerceToInt(lval, &li) ||
+ !coerceToInt(rval, &ri))
+ return false;
+
+ switch (func)
+ {
+ case PGBENCH_ADD:
+ if (pg_add_s64_overflow(li, ri, &res))
+ {
+ pg_log_error("bigint add out of range");
+ return false;
+ }
+ setIntValue(retval, res);
+ return true;
+
+ case PGBENCH_SUB:
+ if (pg_sub_s64_overflow(li, ri, &res))
+ {
+ pg_log_error("bigint sub out of range");
+ return false;
+ }
+ setIntValue(retval, res);
+ return true;
+
+ case PGBENCH_MUL:
+ if (pg_mul_s64_overflow(li, ri, &res))
+ {
+ pg_log_error("bigint mul out of range");
+ return false;
+ }
+ setIntValue(retval, res);
+ return true;
+
+ case PGBENCH_EQ:
+ setBoolValue(retval, li == ri);
+ return true;
+
+ case PGBENCH_NE:
+ setBoolValue(retval, li != ri);
+ return true;
+
+ case PGBENCH_LE:
+ setBoolValue(retval, li <= ri);
+ return true;
+
+ case PGBENCH_LT:
+ setBoolValue(retval, li < ri);
+ return true;
+
+ case PGBENCH_DIV:
+ case PGBENCH_MOD:
+ if (ri == 0)
+ {
+ pg_log_error("division by zero");
+ return false;
+ }
+ /* special handling of -1 divisor */
+ if (ri == -1)
+ {
+ if (func == PGBENCH_DIV)
+ {
+ /* overflow check (needed for INT64_MIN) */
+ if (li == PG_INT64_MIN)
+ {
+ pg_log_error("bigint div out of range");
+ return false;
+ }
+ else
+ setIntValue(retval, -li);
+ }
+ else
+ setIntValue(retval, 0);
+ return true;
+ }
+ /* else divisor is not -1 */
+ if (func == PGBENCH_DIV)
+ setIntValue(retval, li / ri);
+ else /* func == PGBENCH_MOD */
+ setIntValue(retval, li % ri);
+
+ return true;
+
+ default:
+ /* cannot get here */
+ Assert(0);
+ }
+ }
+
+ Assert(0);
+ return false; /* NOTREACHED */
+ }
+
+ /* integer bitwise operators */
+ case PGBENCH_BITAND:
+ case PGBENCH_BITOR:
+ case PGBENCH_BITXOR:
+ case PGBENCH_LSHIFT:
+ case PGBENCH_RSHIFT:
+ {
+ int64 li,
+ ri;
+
+ if (!coerceToInt(&vargs[0], &li) || !coerceToInt(&vargs[1], &ri))
+ return false;
+
+ if (func == PGBENCH_BITAND)
+ setIntValue(retval, li & ri);
+ else if (func == PGBENCH_BITOR)
+ setIntValue(retval, li | ri);
+ else if (func == PGBENCH_BITXOR)
+ setIntValue(retval, li ^ ri);
+ else if (func == PGBENCH_LSHIFT)
+ setIntValue(retval, li << ri);
+ else if (func == PGBENCH_RSHIFT)
+ setIntValue(retval, li >> ri);
+ else /* cannot get here */
+ Assert(0);
+
+ return true;
+ }
+
+ /* logical operators */
+ case PGBENCH_NOT:
+ {
+ bool b;
+
+ if (!coerceToBool(&vargs[0], &b))
+ return false;
+
+ setBoolValue(retval, !b);
+ return true;
+ }
+
+ /* no arguments */
+ case PGBENCH_PI:
+ setDoubleValue(retval, M_PI);
+ return true;
+
+ /* 1 overloaded argument */
+ case PGBENCH_ABS:
+ {
+ PgBenchValue *varg = &vargs[0];
+
+ Assert(nargs == 1);
+
+ if (varg->type == PGBT_INT)
+ {
+ int64 i = varg->u.ival;
+
+ setIntValue(retval, i < 0 ? -i : i);
+ }
+ else
+ {
+ double d = varg->u.dval;
+
+ Assert(varg->type == PGBT_DOUBLE);
+ setDoubleValue(retval, d < 0.0 ? -d : d);
+ }
+
+ return true;
+ }
+
+ case PGBENCH_DEBUG:
+ {
+ PgBenchValue *varg = &vargs[0];
+
+ Assert(nargs == 1);
+
+ fprintf(stderr, "debug(script=%d,command=%d): ",
+ st->use_file, st->command + 1);
+
+ if (varg->type == PGBT_NULL)
+ fprintf(stderr, "null\n");
+ else if (varg->type == PGBT_BOOLEAN)
+ fprintf(stderr, "boolean %s\n", varg->u.bval ? "true" : "false");
+ else if (varg->type == PGBT_INT)
+ fprintf(stderr, "int " INT64_FORMAT "\n", varg->u.ival);
+ else if (varg->type == PGBT_DOUBLE)
+ fprintf(stderr, "double %.*g\n", DBL_DIG, varg->u.dval);
+ else /* internal error, unexpected type */
+ Assert(0);
+
+ *retval = *varg;
+
+ return true;
+ }
+
+ /* 1 double argument */
+ case PGBENCH_DOUBLE:
+ case PGBENCH_SQRT:
+ case PGBENCH_LN:
+ case PGBENCH_EXP:
+ {
+ double dval;
+
+ Assert(nargs == 1);
+
+ if (!coerceToDouble(&vargs[0], &dval))
+ return false;
+
+ if (func == PGBENCH_SQRT)
+ dval = sqrt(dval);
+ else if (func == PGBENCH_LN)
+ dval = log(dval);
+ else if (func == PGBENCH_EXP)
+ dval = exp(dval);
+ /* else is cast: do nothing */
+
+ setDoubleValue(retval, dval);
+ return true;
+ }
+
+ /* 1 int argument */
+ case PGBENCH_INT:
+ {
+ int64 ival;
+
+ Assert(nargs == 1);
+
+ if (!coerceToInt(&vargs[0], &ival))
+ return false;
+
+ setIntValue(retval, ival);
+ return true;
+ }
+
+ /* variable number of arguments */
+ case PGBENCH_LEAST:
+ case PGBENCH_GREATEST:
+ {
+ bool havedouble;
+ int i;
+
+ Assert(nargs >= 1);
+
+ /* need double result if any input is double */
+ havedouble = false;
+ for (i = 0; i < nargs; i++)
+ {
+ if (vargs[i].type == PGBT_DOUBLE)
+ {
+ havedouble = true;
+ break;
+ }
+ }
+ if (havedouble)
+ {
+ double extremum;
+
+ if (!coerceToDouble(&vargs[0], &extremum))
+ return false;
+ for (i = 1; i < nargs; i++)
+ {
+ double dval;
+
+ if (!coerceToDouble(&vargs[i], &dval))
+ return false;
+ if (func == PGBENCH_LEAST)
+ extremum = Min(extremum, dval);
+ else
+ extremum = Max(extremum, dval);
+ }
+ setDoubleValue(retval, extremum);
+ }
+ else
+ {
+ int64 extremum;
+
+ if (!coerceToInt(&vargs[0], &extremum))
+ return false;
+ for (i = 1; i < nargs; i++)
+ {
+ int64 ival;
+
+ if (!coerceToInt(&vargs[i], &ival))
+ return false;
+ if (func == PGBENCH_LEAST)
+ extremum = Min(extremum, ival);
+ else
+ extremum = Max(extremum, ival);
+ }
+ setIntValue(retval, extremum);
+ }
+ return true;
+ }
+
+ /* random functions */
+ case PGBENCH_RANDOM:
+ case PGBENCH_RANDOM_EXPONENTIAL:
+ case PGBENCH_RANDOM_GAUSSIAN:
+ case PGBENCH_RANDOM_ZIPFIAN:
+ {
+ int64 imin,
+ imax,
+ delta;
+
+ Assert(nargs >= 2);
+
+ if (!coerceToInt(&vargs[0], &imin) ||
+ !coerceToInt(&vargs[1], &imax))
+ return false;
+
+ /* check random range */
+ if (unlikely(imin > imax))
+ {
+ pg_log_error("empty range given to random");
+ return false;
+ }
+ else if (unlikely(pg_sub_s64_overflow(imax, imin, &delta) ||
+ pg_add_s64_overflow(delta, 1, &delta)))
+ {
+ /* prevent int overflows in random functions */
+ pg_log_error("random range is too large");
+ return false;
+ }
+
+ if (func == PGBENCH_RANDOM)
+ {
+ Assert(nargs == 2);
+ setIntValue(retval, getrand(&st->cs_func_rs, imin, imax));
+ }
+ else /* gaussian & exponential */
+ {
+ double param;
+
+ Assert(nargs == 3);
+
+ if (!coerceToDouble(&vargs[2], &param))
+ return false;
+
+ if (func == PGBENCH_RANDOM_GAUSSIAN)
+ {
+ if (param < MIN_GAUSSIAN_PARAM)
+ {
+ pg_log_error("gaussian parameter must be at least %f (not %f)",
+ MIN_GAUSSIAN_PARAM, param);
+ return false;
+ }
+
+ setIntValue(retval,
+ getGaussianRand(&st->cs_func_rs,
+ imin, imax, param));
+ }
+ else if (func == PGBENCH_RANDOM_ZIPFIAN)
+ {
+ if (param < MIN_ZIPFIAN_PARAM || param > MAX_ZIPFIAN_PARAM)
+ {
+ pg_log_error("zipfian parameter must be in range [%.3f, %.0f] (not %f)",
+ MIN_ZIPFIAN_PARAM, MAX_ZIPFIAN_PARAM, param);
+ return false;
+ }
+
+ setIntValue(retval,
+ getZipfianRand(&st->cs_func_rs, imin, imax, param));
+ }
+ else /* exponential */
+ {
+ if (param <= 0.0)
+ {
+ pg_log_error("exponential parameter must be greater than zero (not %f)",
+ param);
+ return false;
+ }
+
+ setIntValue(retval,
+ getExponentialRand(&st->cs_func_rs,
+ imin, imax, param));
+ }
+ }
+
+ return true;
+ }
+
+ case PGBENCH_POW:
+ {
+ PgBenchValue *lval = &vargs[0];
+ PgBenchValue *rval = &vargs[1];
+ double ld,
+ rd;
+
+ Assert(nargs == 2);
+
+ if (!coerceToDouble(lval, &ld) ||
+ !coerceToDouble(rval, &rd))
+ return false;
+
+ setDoubleValue(retval, pow(ld, rd));
+
+ return true;
+ }
+
+ case PGBENCH_IS:
+ {
+ Assert(nargs == 2);
+
+ /*
+ * note: this simple implementation is more permissive than
+ * SQL
+ */
+ setBoolValue(retval,
+ vargs[0].type == vargs[1].type &&
+ vargs[0].u.bval == vargs[1].u.bval);
+ return true;
+ }
+
+ /* hashing */
+ case PGBENCH_HASH_FNV1A:
+ case PGBENCH_HASH_MURMUR2:
+ {
+ int64 val,
+ seed;
+
+ Assert(nargs == 2);
+
+ if (!coerceToInt(&vargs[0], &val) ||
+ !coerceToInt(&vargs[1], &seed))
+ return false;
+
+ if (func == PGBENCH_HASH_MURMUR2)
+ setIntValue(retval, getHashMurmur2(val, seed));
+ else if (func == PGBENCH_HASH_FNV1A)
+ setIntValue(retval, getHashFnv1a(val, seed));
+ else
+ /* cannot get here */
+ Assert(0);
+
+ return true;
+ }
+
+ case PGBENCH_PERMUTE:
+ {
+ int64 val,
+ size,
+ seed;
+
+ Assert(nargs == 3);
+
+ if (!coerceToInt(&vargs[0], &val) ||
+ !coerceToInt(&vargs[1], &size) ||
+ !coerceToInt(&vargs[2], &seed))
+ return false;
+
+ if (size <= 0)
+ {
+ pg_log_error("permute size parameter must be greater than zero");
+ return false;
+ }
+
+ setIntValue(retval, permute(val, size, seed));
+ return true;
+ }
+
+ default:
+ /* cannot get here */
+ Assert(0);
+ /* dead code to avoid a compiler warning */
+ return false;
+ }
+}
+
+/* evaluate some function */
+static bool
+evalFunc(CState *st,
+ PgBenchFunction func, PgBenchExprLink *args, PgBenchValue *retval)
+{
+ if (isLazyFunc(func))
+ return evalLazyFunc(st, func, args, retval);
+ else
+ return evalStandardFunc(st, func, args, retval);
+}
+
+/*
+ * Recursive evaluation of an expression in a pgbench script
+ * using the current state of variables.
+ * Returns whether the evaluation was ok,
+ * the value itself is returned through the retval pointer.
+ */
+static bool
+evaluateExpr(CState *st, PgBenchExpr *expr, PgBenchValue *retval)
+{
+ switch (expr->etype)
+ {
+ case ENODE_CONSTANT:
+ {
+ *retval = expr->u.constant;
+ return true;
+ }
+
+ case ENODE_VARIABLE:
+ {
+ Variable *var;
+
+ if ((var = lookupVariable(&st->variables, expr->u.variable.varname)) == NULL)
+ {
+ pg_log_error("undefined variable \"%s\"", expr->u.variable.varname);
+ return false;
+ }
+
+ if (!makeVariableValue(var))
+ return false;
+
+ *retval = var->value;
+ return true;
+ }
+
+ case ENODE_FUNCTION:
+ return evalFunc(st,
+ expr->u.function.function,
+ expr->u.function.args,
+ retval);
+
+ default:
+ /* internal error which should never occur */
+ pg_fatal("unexpected enode type in evaluation: %d", expr->etype);
+ }
+}
+
+/*
+ * Convert command name to meta-command enum identifier
+ */
+static MetaCommand
+getMetaCommand(const char *cmd)
+{
+ MetaCommand mc;
+
+ if (cmd == NULL)
+ mc = META_NONE;
+ else if (pg_strcasecmp(cmd, "set") == 0)
+ mc = META_SET;
+ else if (pg_strcasecmp(cmd, "setshell") == 0)
+ mc = META_SETSHELL;
+ else if (pg_strcasecmp(cmd, "shell") == 0)
+ mc = META_SHELL;
+ else if (pg_strcasecmp(cmd, "sleep") == 0)
+ mc = META_SLEEP;
+ else if (pg_strcasecmp(cmd, "if") == 0)
+ mc = META_IF;
+ else if (pg_strcasecmp(cmd, "elif") == 0)
+ mc = META_ELIF;
+ else if (pg_strcasecmp(cmd, "else") == 0)
+ mc = META_ELSE;
+ else if (pg_strcasecmp(cmd, "endif") == 0)
+ mc = META_ENDIF;
+ else if (pg_strcasecmp(cmd, "gset") == 0)
+ mc = META_GSET;
+ else if (pg_strcasecmp(cmd, "aset") == 0)
+ mc = META_ASET;
+ else if (pg_strcasecmp(cmd, "startpipeline") == 0)
+ mc = META_STARTPIPELINE;
+ else if (pg_strcasecmp(cmd, "endpipeline") == 0)
+ mc = META_ENDPIPELINE;
+ else
+ mc = META_NONE;
+ return mc;
+}
+
+/*
+ * Run a shell command. The result is assigned to the variable if not NULL.
+ * Return true if succeeded, or false on error.
+ */
+static bool
+runShellCommand(Variables *variables, char *variable, char **argv, int argc)
+{
+ char command[SHELL_COMMAND_SIZE];
+ int i,
+ len = 0;
+ FILE *fp;
+ char res[64];
+ char *endptr;
+ int retval;
+
+ /*----------
+ * Join arguments with whitespace separators. Arguments starting with
+ * exactly one colon are treated as variables:
+ * name - append a string "name"
+ * :var - append a variable named 'var'
+ * ::name - append a string ":name"
+ *----------
+ */
+ for (i = 0; i < argc; i++)
+ {
+ char *arg;
+ int arglen;
+
+ if (argv[i][0] != ':')
+ {
+ arg = argv[i]; /* a string literal */
+ }
+ else if (argv[i][1] == ':')
+ {
+ arg = argv[i] + 1; /* a string literal starting with colons */
+ }
+ else if ((arg = getVariable(variables, argv[i] + 1)) == NULL)
+ {
+ pg_log_error("%s: undefined variable \"%s\"", argv[0], argv[i]);
+ return false;
+ }
+
+ arglen = strlen(arg);
+ if (len + arglen + (i > 0 ? 1 : 0) >= SHELL_COMMAND_SIZE - 1)
+ {
+ pg_log_error("%s: shell command is too long", argv[0]);
+ return false;
+ }
+
+ if (i > 0)
+ command[len++] = ' ';
+ memcpy(command + len, arg, arglen);
+ len += arglen;
+ }
+
+ command[len] = '\0';
+
+ /* Fast path for non-assignment case */
+ if (variable == NULL)
+ {
+ if (system(command))
+ {
+ if (!timer_exceeded)
+ pg_log_error("%s: could not launch shell command", argv[0]);
+ return false;
+ }
+ return true;
+ }
+
+ /* Execute the command with pipe and read the standard output. */
+ if ((fp = popen(command, "r")) == NULL)
+ {
+ pg_log_error("%s: could not launch shell command", argv[0]);
+ return false;
+ }
+ if (fgets(res, sizeof(res), fp) == NULL)
+ {
+ if (!timer_exceeded)
+ pg_log_error("%s: could not read result of shell command", argv[0]);
+ (void) pclose(fp);
+ return false;
+ }
+ if (pclose(fp) < 0)
+ {
+ pg_log_error("%s: could not close shell command", argv[0]);
+ return false;
+ }
+
+ /* Check whether the result is an integer and assign it to the variable */
+ retval = (int) strtol(res, &endptr, 10);
+ while (*endptr != '\0' && isspace((unsigned char) *endptr))
+ endptr++;
+ if (*res == '\0' || *endptr != '\0')
+ {
+ pg_log_error("%s: shell command must return an integer (not \"%s\")", argv[0], res);
+ return false;
+ }
+ if (!putVariableInt(variables, "setshell", variable, retval))
+ return false;
+
+ pg_log_debug("%s: shell parameter name: \"%s\", value: \"%s\"", argv[0], argv[1], res);
+
+ return true;
+}
+
+/*
+ * Report the abortion of the client when processing SQL commands.
+ */
+static void
+commandFailed(CState *st, const char *cmd, const char *message)
+{
+ pg_log_error("client %d aborted in command %d (%s) of script %d; %s",
+ st->id, st->command, cmd, st->use_file, message);
+}
+
+/*
+ * Report the error in the command while the script is executing.
+ */
+static void
+commandError(CState *st, const char *message)
+{
+ Assert(sql_script[st->use_file].commands[st->command]->type == SQL_COMMAND);
+ pg_log_info("client %d got an error in command %d (SQL) of script %d; %s",
+ st->id, st->command, st->use_file, message);
+}
+
+/* return a script number with a weighted choice. */
+static int
+chooseScript(TState *thread)
+{
+ int i = 0;
+ int64 w;
+
+ if (num_scripts == 1)
+ return 0;
+
+ w = getrand(&thread->ts_choose_rs, 0, total_weight - 1);
+ do
+ {
+ w -= sql_script[i++].weight;
+ } while (w >= 0);
+
+ return i - 1;
+}
+
+/*
+ * Allocate space for CState->prepared: we need one boolean for each command
+ * of each script.
+ */
+static void
+allocCStatePrepared(CState *st)
+{
+ Assert(st->prepared == NULL);
+
+ st->prepared = pg_malloc(sizeof(bool *) * num_scripts);
+ for (int i = 0; i < num_scripts; i++)
+ {
+ ParsedScript *script = &sql_script[i];
+ int numcmds;
+
+ for (numcmds = 0; script->commands[numcmds] != NULL; numcmds++)
+ ;
+ st->prepared[i] = pg_malloc0(sizeof(bool) * numcmds);
+ }
+}
+
+/*
+ * Prepare the SQL command from st->use_file at command_num.
+ */
+static void
+prepareCommand(CState *st, int command_num)
+{
+ Command *command = sql_script[st->use_file].commands[command_num];
+
+ /* No prepare for non-SQL commands */
+ if (command->type != SQL_COMMAND)
+ return;
+
+ if (!st->prepared)
+ allocCStatePrepared(st);
+
+ if (!st->prepared[st->use_file][command_num])
+ {
+ PGresult *res;
+
+ pg_log_debug("client %d preparing %s", st->id, command->prepname);
+ res = PQprepare(st->con, command->prepname,
+ command->argv[0], command->argc - 1, NULL);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ pg_log_error("%s", PQerrorMessage(st->con));
+ PQclear(res);
+ st->prepared[st->use_file][command_num] = true;
+ }
+}
+
+/*
+ * Prepare all the commands in the script that come after the \startpipeline
+ * that's at position st->command, and the first \endpipeline we find.
+ *
+ * This sets the ->prepared flag for each relevant command as well as the
+ * \startpipeline itself, but doesn't move the st->command counter.
+ */
+static void
+prepareCommandsInPipeline(CState *st)
+{
+ int j;
+ Command **commands = sql_script[st->use_file].commands;
+
+ Assert(commands[st->command]->type == META_COMMAND &&
+ commands[st->command]->meta == META_STARTPIPELINE);
+
+ if (!st->prepared)
+ allocCStatePrepared(st);
+
+ /*
+ * We set the 'prepared' flag on the \startpipeline itself to flag that we
+ * don't need to do this next time without calling prepareCommand(), even
+ * though we don't actually prepare this command.
+ */
+ if (st->prepared[st->use_file][st->command])
+ return;
+
+ for (j = st->command + 1; commands[j] != NULL; j++)
+ {
+ if (commands[j]->type == META_COMMAND &&
+ commands[j]->meta == META_ENDPIPELINE)
+ break;
+
+ prepareCommand(st, j);
+ }
+
+ st->prepared[st->use_file][st->command] = true;
+}
+
+/* Send a SQL command, using the chosen querymode */
+static bool
+sendCommand(CState *st, Command *command)
+{
+ int r;
+
+ if (querymode == QUERY_SIMPLE)
+ {
+ char *sql;
+
+ sql = pg_strdup(command->argv[0]);
+ sql = assignVariables(&st->variables, sql);
+
+ pg_log_debug("client %d sending %s", st->id, sql);
+ r = PQsendQuery(st->con, sql);
+ free(sql);
+ }
+ else if (querymode == QUERY_EXTENDED)
+ {
+ const char *sql = command->argv[0];
+ const char *params[MAX_ARGS];
+
+ getQueryParams(&st->variables, command, params);
+
+ pg_log_debug("client %d sending %s", st->id, sql);
+ r = PQsendQueryParams(st->con, sql, command->argc - 1,
+ NULL, params, NULL, NULL, 0);
+ }
+ else if (querymode == QUERY_PREPARED)
+ {
+ const char *params[MAX_ARGS];
+
+ prepareCommand(st, st->command);
+ getQueryParams(&st->variables, command, params);
+
+ pg_log_debug("client %d sending %s", st->id, command->prepname);
+ r = PQsendQueryPrepared(st->con, command->prepname, command->argc - 1,
+ params, NULL, NULL, 0);
+ }
+ else /* unknown sql mode */
+ r = 0;
+
+ if (r == 0)
+ {
+ pg_log_debug("client %d could not send %s", st->id, command->argv[0]);
+ return false;
+ }
+ else
+ return true;
+}
+
+/*
+ * Get the error status from the error code.
+ */
+static EStatus
+getSQLErrorStatus(const char *sqlState)
+{
+ if (sqlState != NULL)
+ {
+ if (strcmp(sqlState, ERRCODE_T_R_SERIALIZATION_FAILURE) == 0)
+ return ESTATUS_SERIALIZATION_ERROR;
+ else if (strcmp(sqlState, ERRCODE_T_R_DEADLOCK_DETECTED) == 0)
+ return ESTATUS_DEADLOCK_ERROR;
+ }
+
+ return ESTATUS_OTHER_SQL_ERROR;
+}
+
+/*
+ * Returns true if this type of error can be retried.
+ */
+static bool
+canRetryError(EStatus estatus)
+{
+ return (estatus == ESTATUS_SERIALIZATION_ERROR ||
+ estatus == ESTATUS_DEADLOCK_ERROR);
+}
+
+/*
+ * Process query response from the backend.
+ *
+ * If varprefix is not NULL, it's the variable name prefix where to store
+ * the results of the *last* command (META_GSET) or *all* commands
+ * (META_ASET).
+ *
+ * Returns true if everything is A-OK, false if any error occurs.
+ */
+static bool
+readCommandResponse(CState *st, MetaCommand meta, char *varprefix)
+{
+ PGresult *res;
+ PGresult *next_res;
+ int qrynum = 0;
+
+ /*
+ * varprefix should be set only with \gset or \aset, and \endpipeline and
+ * SQL commands do not need it.
+ */
+ Assert((meta == META_NONE && varprefix == NULL) ||
+ ((meta == META_ENDPIPELINE) && varprefix == NULL) ||
+ ((meta == META_GSET || meta == META_ASET) && varprefix != NULL));
+
+ res = PQgetResult(st->con);
+
+ while (res != NULL)
+ {
+ bool is_last;
+
+ /* peek at the next result to know whether the current is last */
+ next_res = PQgetResult(st->con);
+ is_last = (next_res == NULL);
+
+ switch (PQresultStatus(res))
+ {
+ case PGRES_COMMAND_OK: /* non-SELECT commands */
+ case PGRES_EMPTY_QUERY: /* may be used for testing no-op overhead */
+ if (is_last && meta == META_GSET)
+ {
+ pg_log_error("client %d script %d command %d query %d: expected one row, got %d",
+ st->id, st->use_file, st->command, qrynum, 0);
+ st->estatus = ESTATUS_META_COMMAND_ERROR;
+ goto error;
+ }
+ break;
+
+ case PGRES_TUPLES_OK:
+ if ((is_last && meta == META_GSET) || meta == META_ASET)
+ {
+ int ntuples = PQntuples(res);
+
+ if (meta == META_GSET && ntuples != 1)
+ {
+ /* under \gset, report the error */
+ pg_log_error("client %d script %d command %d query %d: expected one row, got %d",
+ st->id, st->use_file, st->command, qrynum, PQntuples(res));
+ st->estatus = ESTATUS_META_COMMAND_ERROR;
+ goto error;
+ }
+ else if (meta == META_ASET && ntuples <= 0)
+ {
+ /* coldly skip empty result under \aset */
+ break;
+ }
+
+ /* store results into variables */
+ for (int fld = 0; fld < PQnfields(res); fld++)
+ {
+ char *varname = PQfname(res, fld);
+
+ /* allocate varname only if necessary, freed below */
+ if (*varprefix != '\0')
+ varname = psprintf("%s%s", varprefix, varname);
+
+ /* store last row result as a string */
+ if (!putVariable(&st->variables, meta == META_ASET ? "aset" : "gset", varname,
+ PQgetvalue(res, ntuples - 1, fld)))
+ {
+ /* internal error */
+ pg_log_error("client %d script %d command %d query %d: error storing into variable %s",
+ st->id, st->use_file, st->command, qrynum, varname);
+ st->estatus = ESTATUS_META_COMMAND_ERROR;
+ goto error;
+ }
+
+ if (*varprefix != '\0')
+ pg_free(varname);
+ }
+ }
+ /* otherwise the result is simply thrown away by PQclear below */
+ break;
+
+ case PGRES_PIPELINE_SYNC:
+ pg_log_debug("client %d pipeline ending", st->id);
+ if (PQexitPipelineMode(st->con) != 1)
+ pg_log_error("client %d failed to exit pipeline mode: %s", st->id,
+ PQerrorMessage(st->con));
+ break;
+
+ case PGRES_NONFATAL_ERROR:
+ case PGRES_FATAL_ERROR:
+ st->estatus = getSQLErrorStatus(PQresultErrorField(res,
+ PG_DIAG_SQLSTATE));
+ if (canRetryError(st->estatus))
+ {
+ if (verbose_errors)
+ commandError(st, PQerrorMessage(st->con));
+ goto error;
+ }
+ /* fall through */
+
+ default:
+ /* anything else is unexpected */
+ pg_log_error("client %d script %d aborted in command %d query %d: %s",
+ st->id, st->use_file, st->command, qrynum,
+ PQerrorMessage(st->con));
+ goto error;
+ }
+
+ PQclear(res);
+ qrynum++;
+ res = next_res;
+ }
+
+ if (qrynum == 0)
+ {
+ pg_log_error("client %d command %d: no results", st->id, st->command);
+ return false;
+ }
+
+ return true;
+
+error:
+ PQclear(res);
+ PQclear(next_res);
+ do
+ {
+ res = PQgetResult(st->con);
+ PQclear(res);
+ } while (res);
+
+ return false;
+}
+
+/*
+ * Parse the argument to a \sleep command, and return the requested amount
+ * of delay, in microseconds. Returns true on success, false on error.
+ */
+static bool
+evaluateSleep(Variables *variables, int argc, char **argv, int *usecs)
+{
+ char *var;
+ int usec;
+
+ if (*argv[1] == ':')
+ {
+ if ((var = getVariable(variables, argv[1] + 1)) == NULL)
+ {
+ pg_log_error("%s: undefined variable \"%s\"", argv[0], argv[1] + 1);
+ return false;
+ }
+
+ usec = atoi(var);
+
+ /* Raise an error if the value of a variable is not a number */
+ if (usec == 0 && !isdigit((unsigned char) *var))
+ {
+ pg_log_error("%s: invalid sleep time \"%s\" for variable \"%s\"",
+ argv[0], var, argv[1] + 1);
+ return false;
+ }
+ }
+ else
+ usec = atoi(argv[1]);
+
+ if (argc > 2)
+ {
+ if (pg_strcasecmp(argv[2], "ms") == 0)
+ usec *= 1000;
+ else if (pg_strcasecmp(argv[2], "s") == 0)
+ usec *= 1000000;
+ }
+ else
+ usec *= 1000000;
+
+ *usecs = usec;
+ return true;
+}
+
+
+/*
+ * Returns true if the error can be retried.
+ */
+static bool
+doRetry(CState *st, pg_time_usec_t *now)
+{
+ Assert(st->estatus != ESTATUS_NO_ERROR);
+
+ /* We can only retry serialization or deadlock errors. */
+ if (!canRetryError(st->estatus))
+ return false;
+
+ /*
+ * We must have at least one option to limit the retrying of transactions
+ * that got an error.
+ */
+ Assert(max_tries || latency_limit || duration > 0);
+
+ /*
+ * We cannot retry the error if we have reached the maximum number of
+ * tries.
+ */
+ if (max_tries && st->tries >= max_tries)
+ return false;
+
+ /*
+ * We cannot retry the error if we spent too much time on this
+ * transaction.
+ */
+ if (latency_limit)
+ {
+ pg_time_now_lazy(now);
+ if (*now - st->txn_scheduled > latency_limit)
+ return false;
+ }
+
+ /*
+ * We cannot retry the error if the benchmark duration is over.
+ */
+ if (timer_exceeded)
+ return false;
+
+ /* OK */
+ return true;
+}
+
+/*
+ * Read results and discard it until a sync point.
+ */
+static int
+discardUntilSync(CState *st)
+{
+ /* send a sync */
+ if (!PQpipelineSync(st->con))
+ {
+ pg_log_error("client %d aborted: failed to send a pipeline sync",
+ st->id);
+ return 0;
+ }
+
+ /* receive PGRES_PIPELINE_SYNC and null following it */
+ for (;;)
+ {
+ PGresult *res = PQgetResult(st->con);
+
+ if (PQresultStatus(res) == PGRES_PIPELINE_SYNC)
+ {
+ PQclear(res);
+ res = PQgetResult(st->con);
+ Assert(res == NULL);
+ break;
+ }
+ PQclear(res);
+ }
+
+ /* exit pipeline */
+ if (PQexitPipelineMode(st->con) != 1)
+ {
+ pg_log_error("client %d aborted: failed to exit pipeline mode for rolling back the failed transaction",
+ st->id);
+ return 0;
+ }
+ return 1;
+}
+
+/*
+ * Get the transaction status at the end of a command especially for
+ * checking if we are in a (failed) transaction block.
+ */
+static TStatus
+getTransactionStatus(PGconn *con)
+{
+ PGTransactionStatusType tx_status;
+
+ tx_status = PQtransactionStatus(con);
+ switch (tx_status)
+ {
+ case PQTRANS_IDLE:
+ return TSTATUS_IDLE;
+ case PQTRANS_INTRANS:
+ case PQTRANS_INERROR:
+ return TSTATUS_IN_BLOCK;
+ case PQTRANS_UNKNOWN:
+ /* PQTRANS_UNKNOWN is expected given a broken connection */
+ if (PQstatus(con) == CONNECTION_BAD)
+ return TSTATUS_CONN_ERROR;
+ /* fall through */
+ case PQTRANS_ACTIVE:
+ default:
+
+ /*
+ * We cannot find out whether we are in a transaction block or
+ * not. Internal error which should never occur.
+ */
+ pg_log_error("unexpected transaction status %d", tx_status);
+ return TSTATUS_OTHER_ERROR;
+ }
+
+ /* not reached */
+ Assert(false);
+ return TSTATUS_OTHER_ERROR;
+}
+
+/*
+ * Print verbose messages of an error
+ */
+static void
+printVerboseErrorMessages(CState *st, pg_time_usec_t *now, bool is_retry)
+{
+ static PQExpBuffer buf = NULL;
+
+ if (buf == NULL)
+ buf = createPQExpBuffer();
+ else
+ resetPQExpBuffer(buf);
+
+ printfPQExpBuffer(buf, "client %d ", st->id);
+ appendPQExpBuffer(buf, "%s",
+ (is_retry ?
+ "repeats the transaction after the error" :
+ "ends the failed transaction"));
+ appendPQExpBuffer(buf, " (try %u", st->tries);
+
+ /* Print max_tries if it is not unlimitted. */
+ if (max_tries)
+ appendPQExpBuffer(buf, "/%u", max_tries);
+
+ /*
+ * If the latency limit is used, print a percentage of the current
+ * transaction latency from the latency limit.
+ */
+ if (latency_limit)
+ {
+ pg_time_now_lazy(now);
+ appendPQExpBuffer(buf, ", %.3f%% of the maximum time of tries was used",
+ (100.0 * (*now - st->txn_scheduled) / latency_limit));
+ }
+ appendPQExpBuffer(buf, ")\n");
+
+ pg_log_info("%s", buf->data);
+}
+
+/*
+ * Advance the state machine of a connection.
+ */
+static void
+advanceConnectionState(TState *thread, CState *st, StatsData *agg)
+{
+
+ /*
+ * gettimeofday() isn't free, so we get the current timestamp lazily the
+ * first time it's needed, and reuse the same value throughout this
+ * function after that. This also ensures that e.g. the calculated
+ * latency reported in the log file and in the totals are the same. Zero
+ * means "not set yet". Reset "now" when we execute shell commands or
+ * expressions, which might take a non-negligible amount of time, though.
+ */
+ pg_time_usec_t now = 0;
+
+ /*
+ * Loop in the state machine, until we have to wait for a result from the
+ * server or have to sleep for throttling or \sleep.
+ *
+ * Note: In the switch-statement below, 'break' will loop back here,
+ * meaning "continue in the state machine". Return is used to return to
+ * the caller, giving the thread the opportunity to advance another
+ * client.
+ */
+ for (;;)
+ {
+ Command *command;
+
+ switch (st->state)
+ {
+ /* Select transaction (script) to run. */
+ case CSTATE_CHOOSE_SCRIPT:
+ st->use_file = chooseScript(thread);
+ Assert(conditional_stack_empty(st->cstack));
+
+ /* reset transaction variables to default values */
+ st->estatus = ESTATUS_NO_ERROR;
+ st->tries = 1;
+
+ pg_log_debug("client %d executing script \"%s\"",
+ st->id, sql_script[st->use_file].desc);
+
+ /*
+ * If time is over, we're done; otherwise, get ready to start
+ * a new transaction, or to get throttled if that's requested.
+ */
+ st->state = timer_exceeded ? CSTATE_FINISHED :
+ throttle_delay > 0 ? CSTATE_PREPARE_THROTTLE : CSTATE_START_TX;
+ break;
+
+ /* Start new transaction (script) */
+ case CSTATE_START_TX:
+ pg_time_now_lazy(&now);
+
+ /* establish connection if needed, i.e. under --connect */
+ if (st->con == NULL)
+ {
+ pg_time_usec_t start = now;
+
+ if ((st->con = doConnect()) == NULL)
+ {
+ /*
+ * as the bench is already running, we do not abort
+ * the process
+ */
+ pg_log_error("client %d aborted while establishing connection", st->id);
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+
+ /* reset now after connection */
+ now = pg_time_now();
+
+ thread->conn_duration += now - start;
+
+ /* Reset session-local state */
+ pg_free(st->prepared);
+ st->prepared = NULL;
+ }
+
+ /*
+ * It is the first try to run this transaction. Remember the
+ * random state: maybe it will get an error and we will need
+ * to run it again.
+ */
+ st->random_state = st->cs_func_rs;
+
+ /* record transaction start time */
+ st->txn_begin = now;
+
+ /*
+ * When not throttling, this is also the transaction's
+ * scheduled start time.
+ */
+ if (!throttle_delay)
+ st->txn_scheduled = now;
+
+ /* Begin with the first command */
+ st->state = CSTATE_START_COMMAND;
+ st->command = 0;
+ break;
+
+ /*
+ * Handle throttling once per transaction by sleeping.
+ */
+ case CSTATE_PREPARE_THROTTLE:
+
+ /*
+ * Generate a delay such that the series of delays will
+ * approximate a Poisson distribution centered on the
+ * throttle_delay time.
+ *
+ * If transactions are too slow or a given wait is shorter
+ * than a transaction, the next transaction will start right
+ * away.
+ */
+ Assert(throttle_delay > 0);
+
+ thread->throttle_trigger +=
+ getPoissonRand(&thread->ts_throttle_rs, throttle_delay);
+ st->txn_scheduled = thread->throttle_trigger;
+
+ /*
+ * If --latency-limit is used, and this slot is already late
+ * so that the transaction will miss the latency limit even if
+ * it completed immediately, skip this time slot and loop to
+ * reschedule.
+ */
+ if (latency_limit)
+ {
+ pg_time_now_lazy(&now);
+
+ if (thread->throttle_trigger < now - latency_limit)
+ {
+ processXactStats(thread, st, &now, true, agg);
+
+ /*
+ * Finish client if -T or -t was exceeded.
+ *
+ * Stop counting skipped transactions under -T as soon
+ * as the timer is exceeded. Because otherwise it can
+ * take a very long time to count all of them
+ * especially when quite a lot of them happen with
+ * unrealistically high rate setting in -R, which
+ * would prevent pgbench from ending immediately.
+ * Because of this behavior, note that there is no
+ * guarantee that all skipped transactions are counted
+ * under -T though there is under -t. This is OK in
+ * practice because it's very unlikely to happen with
+ * realistic setting.
+ */
+ if (timer_exceeded || (nxacts > 0 && st->cnt >= nxacts))
+ st->state = CSTATE_FINISHED;
+
+ /* Go back to top of loop with CSTATE_PREPARE_THROTTLE */
+ break;
+ }
+ }
+
+ /*
+ * stop client if next transaction is beyond pgbench end of
+ * execution; otherwise, throttle it.
+ */
+ st->state = end_time > 0 && st->txn_scheduled > end_time ?
+ CSTATE_FINISHED : CSTATE_THROTTLE;
+ break;
+
+ /*
+ * Wait until it's time to start next transaction.
+ */
+ case CSTATE_THROTTLE:
+ pg_time_now_lazy(&now);
+
+ if (now < st->txn_scheduled)
+ return; /* still sleeping, nothing to do here */
+
+ /* done sleeping, but don't start transaction if we're done */
+ st->state = timer_exceeded ? CSTATE_FINISHED : CSTATE_START_TX;
+ break;
+
+ /*
+ * Send a command to server (or execute a meta-command)
+ */
+ case CSTATE_START_COMMAND:
+ command = sql_script[st->use_file].commands[st->command];
+
+ /* Transition to script end processing if done */
+ if (command == NULL)
+ {
+ st->state = CSTATE_END_TX;
+ break;
+ }
+
+ /* record begin time of next command, and initiate it */
+ if (report_per_command)
+ {
+ pg_time_now_lazy(&now);
+ st->stmt_begin = now;
+ }
+
+ /* Execute the command */
+ if (command->type == SQL_COMMAND)
+ {
+ /* disallow \aset and \gset in pipeline mode */
+ if (PQpipelineStatus(st->con) != PQ_PIPELINE_OFF)
+ {
+ if (command->meta == META_GSET)
+ {
+ commandFailed(st, "gset", "\\gset is not allowed in pipeline mode");
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+ else if (command->meta == META_ASET)
+ {
+ commandFailed(st, "aset", "\\aset is not allowed in pipeline mode");
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+ }
+
+ if (!sendCommand(st, command))
+ {
+ commandFailed(st, "SQL", "SQL command send failed");
+ st->state = CSTATE_ABORTED;
+ }
+ else
+ {
+ /* Wait for results, unless in pipeline mode */
+ if (PQpipelineStatus(st->con) == PQ_PIPELINE_OFF)
+ st->state = CSTATE_WAIT_RESULT;
+ else
+ st->state = CSTATE_END_COMMAND;
+ }
+ }
+ else if (command->type == META_COMMAND)
+ {
+ /*-----
+ * Possible state changes when executing meta commands:
+ * - on errors CSTATE_ABORTED
+ * - on sleep CSTATE_SLEEP
+ * - else CSTATE_END_COMMAND
+ */
+ st->state = executeMetaCommand(st, &now);
+ if (st->state == CSTATE_ABORTED)
+ st->estatus = ESTATUS_META_COMMAND_ERROR;
+ }
+
+ /*
+ * We're now waiting for an SQL command to complete, or
+ * finished processing a metacommand, or need to sleep, or
+ * something bad happened.
+ */
+ Assert(st->state == CSTATE_WAIT_RESULT ||
+ st->state == CSTATE_END_COMMAND ||
+ st->state == CSTATE_SLEEP ||
+ st->state == CSTATE_ABORTED);
+ break;
+
+ /*
+ * non executed conditional branch
+ */
+ case CSTATE_SKIP_COMMAND:
+ Assert(!conditional_active(st->cstack));
+ /* quickly skip commands until something to do... */
+ while (true)
+ {
+ Command *command;
+
+ command = sql_script[st->use_file].commands[st->command];
+
+ /* cannot reach end of script in that state */
+ Assert(command != NULL);
+
+ /*
+ * if this is conditional related, update conditional
+ * state
+ */
+ if (command->type == META_COMMAND &&
+ (command->meta == META_IF ||
+ command->meta == META_ELIF ||
+ command->meta == META_ELSE ||
+ command->meta == META_ENDIF))
+ {
+ switch (conditional_stack_peek(st->cstack))
+ {
+ case IFSTATE_FALSE:
+ if (command->meta == META_IF ||
+ command->meta == META_ELIF)
+ {
+ /* we must evaluate the condition */
+ st->state = CSTATE_START_COMMAND;
+ }
+ else if (command->meta == META_ELSE)
+ {
+ /* we must execute next command */
+ conditional_stack_poke(st->cstack,
+ IFSTATE_ELSE_TRUE);
+ st->state = CSTATE_START_COMMAND;
+ st->command++;
+ }
+ else if (command->meta == META_ENDIF)
+ {
+ Assert(!conditional_stack_empty(st->cstack));
+ conditional_stack_pop(st->cstack);
+ if (conditional_active(st->cstack))
+ st->state = CSTATE_START_COMMAND;
+
+ /*
+ * else state remains in
+ * CSTATE_SKIP_COMMAND
+ */
+ st->command++;
+ }
+ break;
+
+ case IFSTATE_IGNORED:
+ case IFSTATE_ELSE_FALSE:
+ if (command->meta == META_IF)
+ conditional_stack_push(st->cstack,
+ IFSTATE_IGNORED);
+ else if (command->meta == META_ENDIF)
+ {
+ Assert(!conditional_stack_empty(st->cstack));
+ conditional_stack_pop(st->cstack);
+ if (conditional_active(st->cstack))
+ st->state = CSTATE_START_COMMAND;
+ }
+ /* could detect "else" & "elif" after "else" */
+ st->command++;
+ break;
+
+ case IFSTATE_NONE:
+ case IFSTATE_TRUE:
+ case IFSTATE_ELSE_TRUE:
+ default:
+
+ /*
+ * inconsistent if inactive, unreachable dead
+ * code
+ */
+ Assert(false);
+ }
+ }
+ else
+ {
+ /* skip and consider next */
+ st->command++;
+ }
+
+ if (st->state != CSTATE_SKIP_COMMAND)
+ /* out of quick skip command loop */
+ break;
+ }
+ break;
+
+ /*
+ * Wait for the current SQL command to complete
+ */
+ case CSTATE_WAIT_RESULT:
+ pg_log_debug("client %d receiving", st->id);
+
+ /*
+ * Only check for new network data if we processed all data
+ * fetched prior. Otherwise we end up doing a syscall for each
+ * individual pipelined query, which has a measurable
+ * performance impact.
+ */
+ if (PQisBusy(st->con) && !PQconsumeInput(st->con))
+ {
+ /* there's something wrong */
+ commandFailed(st, "SQL", "perhaps the backend died while processing");
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+ if (PQisBusy(st->con))
+ return; /* don't have the whole result yet */
+
+ /* store or discard the query results */
+ if (readCommandResponse(st,
+ sql_script[st->use_file].commands[st->command]->meta,
+ sql_script[st->use_file].commands[st->command]->varprefix))
+ {
+ /*
+ * outside of pipeline mode: stop reading results.
+ * pipeline mode: continue reading results until an
+ * end-of-pipeline response.
+ */
+ if (PQpipelineStatus(st->con) != PQ_PIPELINE_ON)
+ st->state = CSTATE_END_COMMAND;
+ }
+ else if (canRetryError(st->estatus))
+ st->state = CSTATE_ERROR;
+ else
+ st->state = CSTATE_ABORTED;
+ break;
+
+ /*
+ * Wait until sleep is done. This state is entered after a
+ * \sleep metacommand. The behavior is similar to
+ * CSTATE_THROTTLE, but proceeds to CSTATE_START_COMMAND
+ * instead of CSTATE_START_TX.
+ */
+ case CSTATE_SLEEP:
+ pg_time_now_lazy(&now);
+ if (now < st->sleep_until)
+ return; /* still sleeping, nothing to do here */
+ /* Else done sleeping. */
+ st->state = CSTATE_END_COMMAND;
+ break;
+
+ /*
+ * End of command: record stats and proceed to next command.
+ */
+ case CSTATE_END_COMMAND:
+
+ /*
+ * command completed: accumulate per-command execution times
+ * in thread-local data structure, if per-command latencies
+ * are requested.
+ */
+ if (report_per_command)
+ {
+ Command *command;
+
+ pg_time_now_lazy(&now);
+
+ command = sql_script[st->use_file].commands[st->command];
+ /* XXX could use a mutex here, but we choose not to */
+ addToSimpleStats(&command->stats,
+ PG_TIME_GET_DOUBLE(now - st->stmt_begin));
+ }
+
+ /* Go ahead with next command, to be executed or skipped */
+ st->command++;
+ st->state = conditional_active(st->cstack) ?
+ CSTATE_START_COMMAND : CSTATE_SKIP_COMMAND;
+ break;
+
+ /*
+ * Clean up after an error.
+ */
+ case CSTATE_ERROR:
+ {
+ TStatus tstatus;
+
+ Assert(st->estatus != ESTATUS_NO_ERROR);
+
+ /* Clear the conditional stack */
+ conditional_stack_reset(st->cstack);
+
+ /* Read and discard until a sync point in pipeline mode */
+ if (PQpipelineStatus(st->con) != PQ_PIPELINE_OFF)
+ {
+ if (!discardUntilSync(st))
+ {
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+ }
+
+ /*
+ * Check if we have a (failed) transaction block or not,
+ * and roll it back if any.
+ */
+ tstatus = getTransactionStatus(st->con);
+ if (tstatus == TSTATUS_IN_BLOCK)
+ {
+ /* Try to rollback a (failed) transaction block. */
+ if (!PQsendQuery(st->con, "ROLLBACK"))
+ {
+ pg_log_error("client %d aborted: failed to send sql command for rolling back the failed transaction",
+ st->id);
+ st->state = CSTATE_ABORTED;
+ }
+ else
+ st->state = CSTATE_WAIT_ROLLBACK_RESULT;
+ }
+ else if (tstatus == TSTATUS_IDLE)
+ {
+ /*
+ * If time is over, we're done; otherwise, check if we
+ * can retry the error.
+ */
+ st->state = timer_exceeded ? CSTATE_FINISHED :
+ doRetry(st, &now) ? CSTATE_RETRY : CSTATE_FAILURE;
+ }
+ else
+ {
+ if (tstatus == TSTATUS_CONN_ERROR)
+ pg_log_error("perhaps the backend died while processing");
+
+ pg_log_error("client %d aborted while receiving the transaction status", st->id);
+ st->state = CSTATE_ABORTED;
+ }
+ break;
+ }
+
+ /*
+ * Wait for the rollback command to complete
+ */
+ case CSTATE_WAIT_ROLLBACK_RESULT:
+ {
+ PGresult *res;
+
+ pg_log_debug("client %d receiving", st->id);
+ if (!PQconsumeInput(st->con))
+ {
+ pg_log_error("client %d aborted while rolling back the transaction after an error; perhaps the backend died while processing",
+ st->id);
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+ if (PQisBusy(st->con))
+ return; /* don't have the whole result yet */
+
+ /*
+ * Read and discard the query result;
+ */
+ res = PQgetResult(st->con);
+ switch (PQresultStatus(res))
+ {
+ case PGRES_COMMAND_OK:
+ /* OK */
+ PQclear(res);
+ /* null must be returned */
+ res = PQgetResult(st->con);
+ Assert(res == NULL);
+
+ /*
+ * If time is over, we're done; otherwise, check
+ * if we can retry the error.
+ */
+ st->state = timer_exceeded ? CSTATE_FINISHED :
+ doRetry(st, &now) ? CSTATE_RETRY : CSTATE_FAILURE;
+ break;
+ default:
+ pg_log_error("client %d aborted while rolling back the transaction after an error; %s",
+ st->id, PQerrorMessage(st->con));
+ PQclear(res);
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+ break;
+ }
+
+ /*
+ * Retry the transaction after an error.
+ */
+ case CSTATE_RETRY:
+ command = sql_script[st->use_file].commands[st->command];
+
+ /*
+ * Inform that the transaction will be retried after the
+ * error.
+ */
+ if (verbose_errors)
+ printVerboseErrorMessages(st, &now, true);
+
+ /* Count tries and retries */
+ st->tries++;
+ command->retries++;
+
+ /*
+ * Reset the random state as they were at the beginning of the
+ * transaction.
+ */
+ st->cs_func_rs = st->random_state;
+
+ /* Process the first transaction command. */
+ st->command = 0;
+ st->estatus = ESTATUS_NO_ERROR;
+ st->state = CSTATE_START_COMMAND;
+ break;
+
+ /*
+ * Record a failed transaction.
+ */
+ case CSTATE_FAILURE:
+ command = sql_script[st->use_file].commands[st->command];
+
+ /* Accumulate the failure. */
+ command->failures++;
+
+ /*
+ * Inform that the failed transaction will not be retried.
+ */
+ if (verbose_errors)
+ printVerboseErrorMessages(st, &now, false);
+
+ /* End the failed transaction. */
+ st->state = CSTATE_END_TX;
+ break;
+
+ /*
+ * End of transaction (end of script, really).
+ */
+ case CSTATE_END_TX:
+ {
+ TStatus tstatus;
+
+ /* transaction finished: calculate latency and do log */
+ processXactStats(thread, st, &now, false, agg);
+
+ /*
+ * missing \endif... cannot happen if CheckConditional was
+ * okay
+ */
+ Assert(conditional_stack_empty(st->cstack));
+
+ /*
+ * We must complete all the transaction blocks that were
+ * started in this script.
+ */
+ tstatus = getTransactionStatus(st->con);
+ if (tstatus == TSTATUS_IN_BLOCK)
+ {
+ pg_log_error("client %d aborted: end of script reached without completing the last transaction",
+ st->id);
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+ else if (tstatus != TSTATUS_IDLE)
+ {
+ if (tstatus == TSTATUS_CONN_ERROR)
+ pg_log_error("perhaps the backend died while processing");
+
+ pg_log_error("client %d aborted while receiving the transaction status", st->id);
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+
+ if (is_connect)
+ {
+ pg_time_usec_t start = now;
+
+ pg_time_now_lazy(&start);
+ finishCon(st);
+ now = pg_time_now();
+ thread->conn_duration += now - start;
+ }
+
+ if ((st->cnt >= nxacts && duration <= 0) || timer_exceeded)
+ {
+ /* script completed */
+ st->state = CSTATE_FINISHED;
+ break;
+ }
+
+ /* next transaction (script) */
+ st->state = CSTATE_CHOOSE_SCRIPT;
+
+ /*
+ * Ensure that we always return on this point, so as to
+ * avoid an infinite loop if the script only contains meta
+ * commands.
+ */
+ return;
+ }
+
+ /*
+ * Final states. Close the connection if it's still open.
+ */
+ case CSTATE_ABORTED:
+ case CSTATE_FINISHED:
+
+ /*
+ * Don't measure the disconnection delays here even if in
+ * CSTATE_FINISHED and -C/--connect option is specified.
+ * Because in this case all the connections that this thread
+ * established are closed at the end of transactions and the
+ * disconnection delays should have already been measured at
+ * that moment.
+ *
+ * In CSTATE_ABORTED state, the measurement is no longer
+ * necessary because we cannot report complete results anyways
+ * in this case.
+ */
+ finishCon(st);
+ return;
+ }
+ }
+}
+
+/*
+ * Subroutine for advanceConnectionState -- initiate or execute the current
+ * meta command, and return the next state to set.
+ *
+ * *now is updated to the current time, unless the command is expected to
+ * take no time to execute.
+ */
+static ConnectionStateEnum
+executeMetaCommand(CState *st, pg_time_usec_t *now)
+{
+ Command *command = sql_script[st->use_file].commands[st->command];
+ int argc;
+ char **argv;
+
+ Assert(command != NULL && command->type == META_COMMAND);
+
+ argc = command->argc;
+ argv = command->argv;
+
+ if (unlikely(__pg_log_level <= PG_LOG_DEBUG))
+ {
+ PQExpBufferData buf;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf, "client %d executing \\%s", st->id, argv[0]);
+ for (int i = 1; i < argc; i++)
+ appendPQExpBuffer(&buf, " %s", argv[i]);
+
+ pg_log_debug("%s", buf.data);
+
+ termPQExpBuffer(&buf);
+ }
+
+ if (command->meta == META_SLEEP)
+ {
+ int usec;
+
+ /*
+ * A \sleep doesn't execute anything, we just get the delay from the
+ * argument, and enter the CSTATE_SLEEP state. (The per-command
+ * latency will be recorded in CSTATE_SLEEP state, not here, after the
+ * delay has elapsed.)
+ */
+ if (!evaluateSleep(&st->variables, argc, argv, &usec))
+ {
+ commandFailed(st, "sleep", "execution of meta-command failed");
+ return CSTATE_ABORTED;
+ }
+
+ pg_time_now_lazy(now);
+ st->sleep_until = (*now) + usec;
+ return CSTATE_SLEEP;
+ }
+ else if (command->meta == META_SET)
+ {
+ PgBenchExpr *expr = command->expr;
+ PgBenchValue result;
+
+ if (!evaluateExpr(st, expr, &result))
+ {
+ commandFailed(st, argv[0], "evaluation of meta-command failed");
+ return CSTATE_ABORTED;
+ }
+
+ if (!putVariableValue(&st->variables, argv[0], argv[1], &result))
+ {
+ commandFailed(st, "set", "assignment of meta-command failed");
+ return CSTATE_ABORTED;
+ }
+ }
+ else if (command->meta == META_IF)
+ {
+ /* backslash commands with an expression to evaluate */
+ PgBenchExpr *expr = command->expr;
+ PgBenchValue result;
+ bool cond;
+
+ if (!evaluateExpr(st, expr, &result))
+ {
+ commandFailed(st, argv[0], "evaluation of meta-command failed");
+ return CSTATE_ABORTED;
+ }
+
+ cond = valueTruth(&result);
+ conditional_stack_push(st->cstack, cond ? IFSTATE_TRUE : IFSTATE_FALSE);
+ }
+ else if (command->meta == META_ELIF)
+ {
+ /* backslash commands with an expression to evaluate */
+ PgBenchExpr *expr = command->expr;
+ PgBenchValue result;
+ bool cond;
+
+ if (conditional_stack_peek(st->cstack) == IFSTATE_TRUE)
+ {
+ /* elif after executed block, skip eval and wait for endif. */
+ conditional_stack_poke(st->cstack, IFSTATE_IGNORED);
+ return CSTATE_END_COMMAND;
+ }
+
+ if (!evaluateExpr(st, expr, &result))
+ {
+ commandFailed(st, argv[0], "evaluation of meta-command failed");
+ return CSTATE_ABORTED;
+ }
+
+ cond = valueTruth(&result);
+ Assert(conditional_stack_peek(st->cstack) == IFSTATE_FALSE);
+ conditional_stack_poke(st->cstack, cond ? IFSTATE_TRUE : IFSTATE_FALSE);
+ }
+ else if (command->meta == META_ELSE)
+ {
+ switch (conditional_stack_peek(st->cstack))
+ {
+ case IFSTATE_TRUE:
+ conditional_stack_poke(st->cstack, IFSTATE_ELSE_FALSE);
+ break;
+ case IFSTATE_FALSE: /* inconsistent if active */
+ case IFSTATE_IGNORED: /* inconsistent if active */
+ case IFSTATE_NONE: /* else without if */
+ case IFSTATE_ELSE_TRUE: /* else after else */
+ case IFSTATE_ELSE_FALSE: /* else after else */
+ default:
+ /* dead code if conditional check is ok */
+ Assert(false);
+ }
+ }
+ else if (command->meta == META_ENDIF)
+ {
+ Assert(!conditional_stack_empty(st->cstack));
+ conditional_stack_pop(st->cstack);
+ }
+ else if (command->meta == META_SETSHELL)
+ {
+ if (!runShellCommand(&st->variables, argv[1], argv + 2, argc - 2))
+ {
+ commandFailed(st, "setshell", "execution of meta-command failed");
+ return CSTATE_ABORTED;
+ }
+ }
+ else if (command->meta == META_SHELL)
+ {
+ if (!runShellCommand(&st->variables, NULL, argv + 1, argc - 1))
+ {
+ commandFailed(st, "shell", "execution of meta-command failed");
+ return CSTATE_ABORTED;
+ }
+ }
+ else if (command->meta == META_STARTPIPELINE)
+ {
+ /*
+ * In pipeline mode, we use a workflow based on libpq pipeline
+ * functions.
+ */
+ if (querymode == QUERY_SIMPLE)
+ {
+ commandFailed(st, "startpipeline", "cannot use pipeline mode with the simple query protocol");
+ return CSTATE_ABORTED;
+ }
+
+ /*
+ * If we're in prepared-query mode, we need to prepare all the
+ * commands that are inside the pipeline before we actually start the
+ * pipeline itself. This solves the problem that running BEGIN
+ * ISOLATION LEVEL SERIALIZABLE in a pipeline would fail due to a
+ * snapshot having been acquired by the prepare within the pipeline.
+ */
+ if (querymode == QUERY_PREPARED)
+ prepareCommandsInPipeline(st);
+
+ if (PQpipelineStatus(st->con) != PQ_PIPELINE_OFF)
+ {
+ commandFailed(st, "startpipeline", "already in pipeline mode");
+ return CSTATE_ABORTED;
+ }
+ if (PQenterPipelineMode(st->con) == 0)
+ {
+ commandFailed(st, "startpipeline", "failed to enter pipeline mode");
+ return CSTATE_ABORTED;
+ }
+ }
+ else if (command->meta == META_ENDPIPELINE)
+ {
+ if (PQpipelineStatus(st->con) != PQ_PIPELINE_ON)
+ {
+ commandFailed(st, "endpipeline", "not in pipeline mode");
+ return CSTATE_ABORTED;
+ }
+ if (!PQpipelineSync(st->con))
+ {
+ commandFailed(st, "endpipeline", "failed to send a pipeline sync");
+ return CSTATE_ABORTED;
+ }
+ /* Now wait for the PGRES_PIPELINE_SYNC and exit pipeline mode there */
+ /* collect pending results before getting out of pipeline mode */
+ return CSTATE_WAIT_RESULT;
+ }
+
+ /*
+ * executing the expression or shell command might have taken a
+ * non-negligible amount of time, so reset 'now'
+ */
+ *now = 0;
+
+ return CSTATE_END_COMMAND;
+}
+
+/*
+ * Return the number fo failed transactions.
+ */
+static int64
+getFailures(const StatsData *stats)
+{
+ return (stats->serialization_failures +
+ stats->deadlock_failures);
+}
+
+/*
+ * Return a string constant representing the result of a transaction
+ * that is not successfully processed.
+ */
+static const char *
+getResultString(bool skipped, EStatus estatus)
+{
+ if (skipped)
+ return "skipped";
+ else if (failures_detailed)
+ {
+ switch (estatus)
+ {
+ case ESTATUS_SERIALIZATION_ERROR:
+ return "serialization";
+ case ESTATUS_DEADLOCK_ERROR:
+ return "deadlock";
+ default:
+ /* internal error which should never occur */
+ pg_fatal("unexpected error status: %d", estatus);
+ }
+ }
+ else
+ return "failed";
+}
+
+/*
+ * Print log entry after completing one transaction.
+ *
+ * We print Unix-epoch timestamps in the log, so that entries can be
+ * correlated against other logs.
+ *
+ * XXX We could obtain the time from the caller and just shift it here, to
+ * avoid the cost of an extra call to pg_time_now().
+ */
+static void
+doLog(TState *thread, CState *st,
+ StatsData *agg, bool skipped, double latency, double lag)
+{
+ FILE *logfile = thread->logfile;
+ pg_time_usec_t now = pg_time_now() + epoch_shift;
+
+ Assert(use_log);
+
+ /*
+ * Skip the log entry if sampling is enabled and this row doesn't belong
+ * to the random sample.
+ */
+ if (sample_rate != 0.0 &&
+ pg_prng_double(&thread->ts_sample_rs) > sample_rate)
+ return;
+
+ /* should we aggregate the results or not? */
+ if (agg_interval > 0)
+ {
+ pg_time_usec_t next;
+
+ /*
+ * Loop until we reach the interval of the current moment, and print
+ * any empty intervals in between (this may happen with very low tps,
+ * e.g. --rate=0.1).
+ */
+
+ while ((next = agg->start_time + agg_interval * INT64CONST(1000000)) <= now)
+ {
+ double lag_sum = 0.0;
+ double lag_sum2 = 0.0;
+ double lag_min = 0.0;
+ double lag_max = 0.0;
+ int64 skipped = 0;
+ int64 serialization_failures = 0;
+ int64 deadlock_failures = 0;
+ int64 retried = 0;
+ int64 retries = 0;
+
+ /* print aggregated report to logfile */
+ fprintf(logfile, INT64_FORMAT " " INT64_FORMAT " %.0f %.0f %.0f %.0f",
+ agg->start_time / 1000000, /* seconds since Unix epoch */
+ agg->cnt,
+ agg->latency.sum,
+ agg->latency.sum2,
+ agg->latency.min,
+ agg->latency.max);
+
+ if (throttle_delay)
+ {
+ lag_sum = agg->lag.sum;
+ lag_sum2 = agg->lag.sum2;
+ lag_min = agg->lag.min;
+ lag_max = agg->lag.max;
+ }
+ fprintf(logfile, " %.0f %.0f %.0f %.0f",
+ lag_sum,
+ lag_sum2,
+ lag_min,
+ lag_max);
+
+ if (latency_limit)
+ skipped = agg->skipped;
+ fprintf(logfile, " " INT64_FORMAT, skipped);
+
+ if (max_tries != 1)
+ {
+ retried = agg->retried;
+ retries = agg->retries;
+ }
+ fprintf(logfile, " " INT64_FORMAT " " INT64_FORMAT, retried, retries);
+
+ if (failures_detailed)
+ {
+ serialization_failures = agg->serialization_failures;
+ deadlock_failures = agg->deadlock_failures;
+ }
+ fprintf(logfile, " " INT64_FORMAT " " INT64_FORMAT,
+ serialization_failures,
+ deadlock_failures);
+
+ fputc('\n', logfile);
+
+ /* reset data and move to next interval */
+ initStats(agg, next);
+ }
+
+ /* accumulate the current transaction */
+ accumStats(agg, skipped, latency, lag, st->estatus, st->tries);
+ }
+ else
+ {
+ /* no, print raw transactions */
+ if (!skipped && st->estatus == ESTATUS_NO_ERROR)
+ fprintf(logfile, "%d " INT64_FORMAT " %.0f %d " INT64_FORMAT " "
+ INT64_FORMAT,
+ st->id, st->cnt, latency, st->use_file,
+ now / 1000000, now % 1000000);
+ else
+ fprintf(logfile, "%d " INT64_FORMAT " %s %d " INT64_FORMAT " "
+ INT64_FORMAT,
+ st->id, st->cnt, getResultString(skipped, st->estatus),
+ st->use_file, now / 1000000, now % 1000000);
+
+ if (throttle_delay)
+ fprintf(logfile, " %.0f", lag);
+ if (max_tries != 1)
+ fprintf(logfile, " %u", st->tries - 1);
+ fputc('\n', logfile);
+ }
+}
+
+/*
+ * Accumulate and report statistics at end of a transaction.
+ *
+ * (This is also called when a transaction is late and thus skipped.
+ * Note that even skipped and failed transactions are counted in the CState
+ * "cnt" field.)
+ */
+static void
+processXactStats(TState *thread, CState *st, pg_time_usec_t *now,
+ bool skipped, StatsData *agg)
+{
+ double latency = 0.0,
+ lag = 0.0;
+ bool detailed = progress || throttle_delay || latency_limit ||
+ use_log || per_script_stats;
+
+ if (detailed && !skipped && st->estatus == ESTATUS_NO_ERROR)
+ {
+ pg_time_now_lazy(now);
+
+ /* compute latency & lag */
+ latency = (*now) - st->txn_scheduled;
+ lag = st->txn_begin - st->txn_scheduled;
+ }
+
+ /* keep detailed thread stats */
+ accumStats(&thread->stats, skipped, latency, lag, st->estatus, st->tries);
+
+ /* count transactions over the latency limit, if needed */
+ if (latency_limit && latency > latency_limit)
+ thread->latency_late++;
+
+ /* client stat is just counting */
+ st->cnt++;
+
+ if (use_log)
+ doLog(thread, st, agg, skipped, latency, lag);
+
+ /* XXX could use a mutex here, but we choose not to */
+ if (per_script_stats)
+ accumStats(&sql_script[st->use_file].stats, skipped, latency, lag,
+ st->estatus, st->tries);
+}
+
+
+/* discard connections */
+static void
+disconnect_all(CState *state, int length)
+{
+ int i;
+
+ for (i = 0; i < length; i++)
+ finishCon(&state[i]);
+}
+
+/*
+ * Remove old pgbench tables, if any exist
+ */
+static void
+initDropTables(PGconn *con)
+{
+ fprintf(stderr, "dropping old tables...\n");
+
+ /*
+ * We drop all the tables in one command, so that whether there are
+ * foreign key dependencies or not doesn't matter.
+ */
+ executeStatement(con, "drop table if exists "
+ "pgbench_accounts, "
+ "pgbench_branches, "
+ "pgbench_history, "
+ "pgbench_tellers");
+}
+
+/*
+ * Create "pgbench_accounts" partitions if needed.
+ *
+ * This is the larger table of pgbench default tpc-b like schema
+ * with a known size, so we choose to partition it.
+ */
+static void
+createPartitions(PGconn *con)
+{
+ PQExpBufferData query;
+
+ /* we must have to create some partitions */
+ Assert(partitions > 0);
+
+ fprintf(stderr, "creating %d partitions...\n", partitions);
+
+ initPQExpBuffer(&query);
+
+ for (int p = 1; p <= partitions; p++)
+ {
+ if (partition_method == PART_RANGE)
+ {
+ int64 part_size = (naccounts * (int64) scale + partitions - 1) / partitions;
+
+ printfPQExpBuffer(&query,
+ "create%s table pgbench_accounts_%d\n"
+ " partition of pgbench_accounts\n"
+ " for values from (",
+ unlogged_tables ? " unlogged" : "", p);
+
+ /*
+ * For RANGE, we use open-ended partitions at the beginning and
+ * end to allow any valid value for the primary key. Although the
+ * actual minimum and maximum values can be derived from the
+ * scale, it is more generic and the performance is better.
+ */
+ if (p == 1)
+ appendPQExpBufferStr(&query, "minvalue");
+ else
+ appendPQExpBuffer(&query, INT64_FORMAT, (p - 1) * part_size + 1);
+
+ appendPQExpBufferStr(&query, ") to (");
+
+ if (p < partitions)
+ appendPQExpBuffer(&query, INT64_FORMAT, p * part_size + 1);
+ else
+ appendPQExpBufferStr(&query, "maxvalue");
+
+ appendPQExpBufferChar(&query, ')');
+ }
+ else if (partition_method == PART_HASH)
+ printfPQExpBuffer(&query,
+ "create%s table pgbench_accounts_%d\n"
+ " partition of pgbench_accounts\n"
+ " for values with (modulus %d, remainder %d)",
+ unlogged_tables ? " unlogged" : "", p,
+ partitions, p - 1);
+ else /* cannot get there */
+ Assert(0);
+
+ /*
+ * Per ddlinfo in initCreateTables, fillfactor is needed on table
+ * pgbench_accounts.
+ */
+ appendPQExpBuffer(&query, " with (fillfactor=%d)", fillfactor);
+
+ executeStatement(con, query.data);
+ }
+
+ termPQExpBuffer(&query);
+}
+
+/*
+ * Create pgbench's standard tables
+ */
+static void
+initCreateTables(PGconn *con)
+{
+ /*
+ * Note: TPC-B requires at least 100 bytes per row, and the "filler"
+ * fields in these table declarations were intended to comply with that.
+ * The pgbench_accounts table complies with that because the "filler"
+ * column is set to blank-padded empty string. But for all other tables
+ * the columns default to NULL and so don't actually take any space. We
+ * could fix that by giving them non-null default values. However, that
+ * would completely break comparability of pgbench results with prior
+ * versions. Since pgbench has never pretended to be fully TPC-B compliant
+ * anyway, we stick with the historical behavior.
+ */
+ struct ddlinfo
+ {
+ const char *table; /* table name */
+ const char *smcols; /* column decls if accountIDs are 32 bits */
+ const char *bigcols; /* column decls if accountIDs are 64 bits */
+ int declare_fillfactor;
+ };
+ static const struct ddlinfo DDLs[] = {
+ {
+ "pgbench_history",
+ "tid int,bid int,aid int,delta int,mtime timestamp,filler char(22)",
+ "tid int,bid int,aid bigint,delta int,mtime timestamp,filler char(22)",
+ 0
+ },
+ {
+ "pgbench_tellers",
+ "tid int not null,bid int,tbalance int,filler char(84)",
+ "tid int not null,bid int,tbalance int,filler char(84)",
+ 1
+ },
+ {
+ "pgbench_accounts",
+ "aid int not null,bid int,abalance int,filler char(84)",
+ "aid bigint not null,bid int,abalance int,filler char(84)",
+ 1
+ },
+ {
+ "pgbench_branches",
+ "bid int not null,bbalance int,filler char(88)",
+ "bid int not null,bbalance int,filler char(88)",
+ 1
+ }
+ };
+ int i;
+ PQExpBufferData query;
+
+ fprintf(stderr, "creating tables...\n");
+
+ initPQExpBuffer(&query);
+
+ for (i = 0; i < lengthof(DDLs); i++)
+ {
+ const struct ddlinfo *ddl = &DDLs[i];
+
+ /* Construct new create table statement. */
+ printfPQExpBuffer(&query, "create%s table %s(%s)",
+ unlogged_tables ? " unlogged" : "",
+ ddl->table,
+ (scale >= SCALE_32BIT_THRESHOLD) ? ddl->bigcols : ddl->smcols);
+
+ /* Partition pgbench_accounts table */
+ if (partition_method != PART_NONE && strcmp(ddl->table, "pgbench_accounts") == 0)
+ appendPQExpBuffer(&query,
+ " partition by %s (aid)", PARTITION_METHOD[partition_method]);
+ else if (ddl->declare_fillfactor)
+ {
+ /* fillfactor is only expected on actual tables */
+ appendPQExpBuffer(&query, " with (fillfactor=%d)", fillfactor);
+ }
+
+ if (tablespace != NULL)
+ {
+ char *escape_tablespace;
+
+ escape_tablespace = PQescapeIdentifier(con, tablespace, strlen(tablespace));
+ appendPQExpBuffer(&query, " tablespace %s", escape_tablespace);
+ PQfreemem(escape_tablespace);
+ }
+
+ executeStatement(con, query.data);
+ }
+
+ termPQExpBuffer(&query);
+
+ if (partition_method != PART_NONE)
+ createPartitions(con);
+}
+
+/*
+ * Truncate away any old data, in one command in case there are foreign keys
+ */
+static void
+initTruncateTables(PGconn *con)
+{
+ executeStatement(con, "truncate table "
+ "pgbench_accounts, "
+ "pgbench_branches, "
+ "pgbench_history, "
+ "pgbench_tellers");
+}
+
+/*
+ * Fill the standard tables with some data generated and sent from the client
+ */
+static void
+initGenerateDataClientSide(PGconn *con)
+{
+ PQExpBufferData sql;
+ PGresult *res;
+ int i;
+ int64 k;
+ char *copy_statement;
+
+ /* used to track elapsed time and estimate of the remaining time */
+ pg_time_usec_t start;
+ int log_interval = 1;
+
+ /* Stay on the same line if reporting to a terminal */
+ char eol = isatty(fileno(stderr)) ? '\r' : '\n';
+
+ fprintf(stderr, "generating data (client-side)...\n");
+
+ /*
+ * we do all of this in one transaction to enable the backend's
+ * data-loading optimizations
+ */
+ executeStatement(con, "begin");
+
+ /* truncate away any old data */
+ initTruncateTables(con);
+
+ initPQExpBuffer(&sql);
+
+ /*
+ * fill branches, tellers, accounts in that order in case foreign keys
+ * already exist
+ */
+ for (i = 0; i < nbranches * scale; i++)
+ {
+ /* "filler" column defaults to NULL */
+ printfPQExpBuffer(&sql,
+ "insert into pgbench_branches(bid,bbalance) values(%d,0)",
+ i + 1);
+ executeStatement(con, sql.data);
+ }
+
+ for (i = 0; i < ntellers * scale; i++)
+ {
+ /* "filler" column defaults to NULL */
+ printfPQExpBuffer(&sql,
+ "insert into pgbench_tellers(tid,bid,tbalance) values (%d,%d,0)",
+ i + 1, i / ntellers + 1);
+ executeStatement(con, sql.data);
+ }
+
+ /*
+ * accounts is big enough to be worth using COPY and tracking runtime
+ */
+
+ /* use COPY with FREEZE on v14 and later without partitioning */
+ if (partitions == 0 && PQserverVersion(con) >= 140000)
+ copy_statement = "copy pgbench_accounts from stdin with (freeze on)";
+ else
+ copy_statement = "copy pgbench_accounts from stdin";
+
+ res = PQexec(con, copy_statement);
+
+ if (PQresultStatus(res) != PGRES_COPY_IN)
+ pg_fatal("unexpected copy in result: %s", PQerrorMessage(con));
+ PQclear(res);
+
+ start = pg_time_now();
+
+ for (k = 0; k < (int64) naccounts * scale; k++)
+ {
+ int64 j = k + 1;
+
+ /* "filler" column defaults to blank padded empty string */
+ printfPQExpBuffer(&sql,
+ INT64_FORMAT "\t" INT64_FORMAT "\t%d\t\n",
+ j, k / naccounts + 1, 0);
+ if (PQputline(con, sql.data))
+ pg_fatal("PQputline failed");
+
+ if (CancelRequested)
+ break;
+
+ /*
+ * If we want to stick with the original logging, print a message each
+ * 100k inserted rows.
+ */
+ if ((!use_quiet) && (j % 100000 == 0))
+ {
+ double elapsed_sec = PG_TIME_GET_DOUBLE(pg_time_now() - start);
+ double remaining_sec = ((double) scale * naccounts - j) * elapsed_sec / j;
+
+ fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)%c",
+ j, (int64) naccounts * scale,
+ (int) (((int64) j * 100) / (naccounts * (int64) scale)),
+ elapsed_sec, remaining_sec, eol);
+ }
+ /* let's not call the timing for each row, but only each 100 rows */
+ else if (use_quiet && (j % 100 == 0))
+ {
+ double elapsed_sec = PG_TIME_GET_DOUBLE(pg_time_now() - start);
+ double remaining_sec = ((double) scale * naccounts - j) * elapsed_sec / j;
+
+ /* have we reached the next interval (or end)? */
+ if ((j == scale * naccounts) || (elapsed_sec >= log_interval * LOG_STEP_SECONDS))
+ {
+ fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)%c",
+ j, (int64) naccounts * scale,
+ (int) (((int64) j * 100) / (naccounts * (int64) scale)), elapsed_sec, remaining_sec, eol);
+
+ /* skip to the next interval */
+ log_interval = (int) ceil(elapsed_sec / LOG_STEP_SECONDS);
+ }
+ }
+ }
+
+ if (eol != '\n')
+ fputc('\n', stderr); /* Need to move to next line */
+
+ if (PQputline(con, "\\.\n"))
+ pg_fatal("very last PQputline failed");
+ if (PQendcopy(con))
+ pg_fatal("PQendcopy failed");
+
+ termPQExpBuffer(&sql);
+
+ executeStatement(con, "commit");
+}
+
+/*
+ * Fill the standard tables with some data generated on the server
+ *
+ * As already the case with the client-side data generation, the filler
+ * column defaults to NULL in pgbench_branches and pgbench_tellers,
+ * and is a blank-padded string in pgbench_accounts.
+ */
+static void
+initGenerateDataServerSide(PGconn *con)
+{
+ PQExpBufferData sql;
+
+ fprintf(stderr, "generating data (server-side)...\n");
+
+ /*
+ * we do all of this in one transaction to enable the backend's
+ * data-loading optimizations
+ */
+ executeStatement(con, "begin");
+
+ /* truncate away any old data */
+ initTruncateTables(con);
+
+ initPQExpBuffer(&sql);
+
+ printfPQExpBuffer(&sql,
+ "insert into pgbench_branches(bid,bbalance) "
+ "select bid, 0 "
+ "from generate_series(1, %d) as bid", nbranches * scale);
+ executeStatement(con, sql.data);
+
+ printfPQExpBuffer(&sql,
+ "insert into pgbench_tellers(tid,bid,tbalance) "
+ "select tid, (tid - 1) / %d + 1, 0 "
+ "from generate_series(1, %d) as tid", ntellers, ntellers * scale);
+ executeStatement(con, sql.data);
+
+ printfPQExpBuffer(&sql,
+ "insert into pgbench_accounts(aid,bid,abalance,filler) "
+ "select aid, (aid - 1) / %d + 1, 0, '' "
+ "from generate_series(1, " INT64_FORMAT ") as aid",
+ naccounts, (int64) naccounts * scale);
+ executeStatement(con, sql.data);
+
+ termPQExpBuffer(&sql);
+
+ executeStatement(con, "commit");
+}
+
+/*
+ * Invoke vacuum on the standard tables
+ */
+static void
+initVacuum(PGconn *con)
+{
+ fprintf(stderr, "vacuuming...\n");
+ executeStatement(con, "vacuum analyze pgbench_branches");
+ executeStatement(con, "vacuum analyze pgbench_tellers");
+ executeStatement(con, "vacuum analyze pgbench_accounts");
+ executeStatement(con, "vacuum analyze pgbench_history");
+}
+
+/*
+ * Create primary keys on the standard tables
+ */
+static void
+initCreatePKeys(PGconn *con)
+{
+ static const char *const DDLINDEXes[] = {
+ "alter table pgbench_branches add primary key (bid)",
+ "alter table pgbench_tellers add primary key (tid)",
+ "alter table pgbench_accounts add primary key (aid)"
+ };
+ int i;
+ PQExpBufferData query;
+
+ fprintf(stderr, "creating primary keys...\n");
+ initPQExpBuffer(&query);
+
+ for (i = 0; i < lengthof(DDLINDEXes); i++)
+ {
+ resetPQExpBuffer(&query);
+ appendPQExpBufferStr(&query, DDLINDEXes[i]);
+
+ if (index_tablespace != NULL)
+ {
+ char *escape_tablespace;
+
+ escape_tablespace = PQescapeIdentifier(con, index_tablespace,
+ strlen(index_tablespace));
+ appendPQExpBuffer(&query, " using index tablespace %s", escape_tablespace);
+ PQfreemem(escape_tablespace);
+ }
+
+ executeStatement(con, query.data);
+ }
+
+ termPQExpBuffer(&query);
+}
+
+/*
+ * Create foreign key constraints between the standard tables
+ */
+static void
+initCreateFKeys(PGconn *con)
+{
+ static const char *const DDLKEYs[] = {
+ "alter table pgbench_tellers add constraint pgbench_tellers_bid_fkey foreign key (bid) references pgbench_branches",
+ "alter table pgbench_accounts add constraint pgbench_accounts_bid_fkey foreign key (bid) references pgbench_branches",
+ "alter table pgbench_history add constraint pgbench_history_bid_fkey foreign key (bid) references pgbench_branches",
+ "alter table pgbench_history add constraint pgbench_history_tid_fkey foreign key (tid) references pgbench_tellers",
+ "alter table pgbench_history add constraint pgbench_history_aid_fkey foreign key (aid) references pgbench_accounts"
+ };
+ int i;
+
+ fprintf(stderr, "creating foreign keys...\n");
+ for (i = 0; i < lengthof(DDLKEYs); i++)
+ {
+ executeStatement(con, DDLKEYs[i]);
+ }
+}
+
+/*
+ * Validate an initialization-steps string
+ *
+ * (We could just leave it to runInitSteps() to fail if there are wrong
+ * characters, but since initialization can take awhile, it seems friendlier
+ * to check during option parsing.)
+ */
+static void
+checkInitSteps(const char *initialize_steps)
+{
+ if (initialize_steps[0] == '\0')
+ pg_fatal("no initialization steps specified");
+
+ for (const char *step = initialize_steps; *step != '\0'; step++)
+ {
+ if (strchr(ALL_INIT_STEPS " ", *step) == NULL)
+ {
+ pg_log_error("unrecognized initialization step \"%c\"", *step);
+ pg_log_error_detail("Allowed step characters are: \"" ALL_INIT_STEPS "\".");
+ exit(1);
+ }
+ }
+}
+
+/*
+ * Invoke each initialization step in the given string
+ */
+static void
+runInitSteps(const char *initialize_steps)
+{
+ PQExpBufferData stats;
+ PGconn *con;
+ const char *step;
+ double run_time = 0.0;
+ bool first = true;
+
+ initPQExpBuffer(&stats);
+
+ if ((con = doConnect()) == NULL)
+ pg_fatal("could not create connection for initialization");
+
+ setup_cancel_handler(NULL);
+ SetCancelConn(con);
+
+ for (step = initialize_steps; *step != '\0'; step++)
+ {
+ char *op = NULL;
+ pg_time_usec_t start = pg_time_now();
+
+ switch (*step)
+ {
+ case 'd':
+ op = "drop tables";
+ initDropTables(con);
+ break;
+ case 't':
+ op = "create tables";
+ initCreateTables(con);
+ break;
+ case 'g':
+ op = "client-side generate";
+ initGenerateDataClientSide(con);
+ break;
+ case 'G':
+ op = "server-side generate";
+ initGenerateDataServerSide(con);
+ break;
+ case 'v':
+ op = "vacuum";
+ initVacuum(con);
+ break;
+ case 'p':
+ op = "primary keys";
+ initCreatePKeys(con);
+ break;
+ case 'f':
+ op = "foreign keys";
+ initCreateFKeys(con);
+ break;
+ case ' ':
+ break; /* ignore */
+ default:
+ pg_log_error("unrecognized initialization step \"%c\"", *step);
+ PQfinish(con);
+ exit(1);
+ }
+
+ if (op != NULL)
+ {
+ double elapsed_sec = PG_TIME_GET_DOUBLE(pg_time_now() - start);
+
+ if (!first)
+ appendPQExpBufferStr(&stats, ", ");
+ else
+ first = false;
+
+ appendPQExpBuffer(&stats, "%s %.2f s", op, elapsed_sec);
+
+ run_time += elapsed_sec;
+ }
+ }
+
+ fprintf(stderr, "done in %.2f s (%s).\n", run_time, stats.data);
+ ResetCancelConn();
+ PQfinish(con);
+ termPQExpBuffer(&stats);
+}
+
+/*
+ * Extract pgbench table information into global variables scale,
+ * partition_method and partitions.
+ */
+static void
+GetTableInfo(PGconn *con, bool scale_given)
+{
+ PGresult *res;
+
+ /*
+ * get the scaling factor that should be same as count(*) from
+ * pgbench_branches if this is not a custom query
+ */
+ res = PQexec(con, "select count(*) from pgbench_branches");
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ char *sqlState = PQresultErrorField(res, PG_DIAG_SQLSTATE);
+
+ pg_log_error("could not count number of branches: %s", PQerrorMessage(con));
+
+ if (sqlState && strcmp(sqlState, ERRCODE_UNDEFINED_TABLE) == 0)
+ pg_log_error_hint("Perhaps you need to do initialization (\"pgbench -i\") in database \"%s\".",
+ PQdb(con));
+
+ exit(1);
+ }
+ scale = atoi(PQgetvalue(res, 0, 0));
+ if (scale < 0)
+ pg_fatal("invalid count(*) from pgbench_branches: \"%s\"",
+ PQgetvalue(res, 0, 0));
+ PQclear(res);
+
+ /* warn if we override user-given -s switch */
+ if (scale_given)
+ pg_log_warning("scale option ignored, using count from pgbench_branches table (%d)",
+ scale);
+
+ /*
+ * Get the partition information for the first "pgbench_accounts" table
+ * found in search_path.
+ *
+ * The result is empty if no "pgbench_accounts" is found.
+ *
+ * Otherwise, it always returns one row even if the table is not
+ * partitioned (in which case the partition strategy is NULL).
+ *
+ * The number of partitions can be 0 even for partitioned tables, if no
+ * partition is attached.
+ *
+ * We assume no partitioning on any failure, so as to avoid failing on an
+ * old version without "pg_partitioned_table".
+ */
+ res = PQexec(con,
+ "select o.n, p.partstrat, pg_catalog.count(i.inhparent) "
+ "from pg_catalog.pg_class as c "
+ "join pg_catalog.pg_namespace as n on (n.oid = c.relnamespace) "
+ "cross join lateral (select pg_catalog.array_position(pg_catalog.current_schemas(true), n.nspname)) as o(n) "
+ "left join pg_catalog.pg_partitioned_table as p on (p.partrelid = c.oid) "
+ "left join pg_catalog.pg_inherits as i on (c.oid = i.inhparent) "
+ "where c.relname = 'pgbench_accounts' and o.n is not null "
+ "group by 1, 2 "
+ "order by 1 asc "
+ "limit 1");
+
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ /* probably an older version, coldly assume no partitioning */
+ partition_method = PART_NONE;
+ partitions = 0;
+ }
+ else if (PQntuples(res) == 0)
+ {
+ /*
+ * This case is unlikely as pgbench already found "pgbench_branches"
+ * above to compute the scale.
+ */
+ pg_log_error("no pgbench_accounts table found in search_path");
+ pg_log_error_hint("Perhaps you need to do initialization (\"pgbench -i\") in database \"%s\".", PQdb(con));
+ exit(1);
+ }
+ else /* PQntupes(res) == 1 */
+ {
+ /* normal case, extract partition information */
+ if (PQgetisnull(res, 0, 1))
+ partition_method = PART_NONE;
+ else
+ {
+ char *ps = PQgetvalue(res, 0, 1);
+
+ /* column must be there */
+ Assert(ps != NULL);
+
+ if (strcmp(ps, "r") == 0)
+ partition_method = PART_RANGE;
+ else if (strcmp(ps, "h") == 0)
+ partition_method = PART_HASH;
+ else
+ {
+ /* possibly a newer version with new partition method */
+ pg_fatal("unexpected partition method: \"%s\"", ps);
+ }
+ }
+
+ partitions = atoi(PQgetvalue(res, 0, 2));
+ }
+
+ PQclear(res);
+}
+
+/*
+ * Replace :param with $n throughout the command's SQL text, which
+ * is a modifiable string in cmd->lines.
+ */
+static bool
+parseQuery(Command *cmd)
+{
+ char *sql,
+ *p;
+
+ cmd->argc = 1;
+
+ p = sql = pg_strdup(cmd->lines.data);
+ while ((p = strchr(p, ':')) != NULL)
+ {
+ char var[13];
+ char *name;
+ int eaten;
+
+ name = parseVariable(p, &eaten);
+ if (name == NULL)
+ {
+ while (*p == ':')
+ {
+ p++;
+ }
+ continue;
+ }
+
+ /*
+ * cmd->argv[0] is the SQL statement itself, so the max number of
+ * arguments is one less than MAX_ARGS
+ */
+ if (cmd->argc >= MAX_ARGS)
+ {
+ pg_log_error("statement has too many arguments (maximum is %d): %s",
+ MAX_ARGS - 1, cmd->lines.data);
+ pg_free(name);
+ return false;
+ }
+
+ sprintf(var, "$%d", cmd->argc);
+ p = replaceVariable(&sql, p, eaten, var);
+
+ cmd->argv[cmd->argc] = name;
+ cmd->argc++;
+ }
+
+ Assert(cmd->argv[0] == NULL);
+ cmd->argv[0] = sql;
+ return true;
+}
+
+/*
+ * syntax error while parsing a script (in practice, while parsing a
+ * backslash command, because we don't detect syntax errors in SQL)
+ *
+ * source: source of script (filename or builtin-script ID)
+ * lineno: line number within script (count from 1)
+ * line: whole line of backslash command, if available
+ * command: backslash command name, if available
+ * msg: the actual error message
+ * more: optional extra message
+ * column: zero-based column number, or -1 if unknown
+ */
+void
+syntax_error(const char *source, int lineno,
+ const char *line, const char *command,
+ const char *msg, const char *more, int column)
+{
+ PQExpBufferData buf;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf, "%s:%d: %s", source, lineno, msg);
+ if (more != NULL)
+ appendPQExpBuffer(&buf, " (%s)", more);
+ if (column >= 0 && line == NULL)
+ appendPQExpBuffer(&buf, " at column %d", column + 1);
+ if (command != NULL)
+ appendPQExpBuffer(&buf, " in command \"%s\"", command);
+
+ pg_log_error("%s", buf.data);
+
+ termPQExpBuffer(&buf);
+
+ if (line != NULL)
+ {
+ fprintf(stderr, "%s\n", line);
+ if (column >= 0)
+ fprintf(stderr, "%*c error found here\n", column + 1, '^');
+ }
+
+ exit(1);
+}
+
+/*
+ * Return a pointer to the start of the SQL command, after skipping over
+ * whitespace and "--" comments.
+ * If the end of the string is reached, return NULL.
+ */
+static char *
+skip_sql_comments(char *sql_command)
+{
+ char *p = sql_command;
+
+ /* Skip any leading whitespace, as well as "--" style comments */
+ for (;;)
+ {
+ if (isspace((unsigned char) *p))
+ p++;
+ else if (strncmp(p, "--", 2) == 0)
+ {
+ p = strchr(p, '\n');
+ if (p == NULL)
+ return NULL;
+ p++;
+ }
+ else
+ break;
+ }
+
+ /* NULL if there's nothing but whitespace and comments */
+ if (*p == '\0')
+ return NULL;
+
+ return p;
+}
+
+/*
+ * Parse a SQL command; return a Command struct, or NULL if it's a comment
+ *
+ * On entry, psqlscan.l has collected the command into "buf", so we don't
+ * really need to do much here except check for comments and set up a Command
+ * struct.
+ */
+static Command *
+create_sql_command(PQExpBuffer buf, const char *source)
+{
+ Command *my_command;
+ char *p = skip_sql_comments(buf->data);
+
+ if (p == NULL)
+ return NULL;
+
+ /* Allocate and initialize Command structure */
+ my_command = (Command *) pg_malloc(sizeof(Command));
+ initPQExpBuffer(&my_command->lines);
+ appendPQExpBufferStr(&my_command->lines, p);
+ my_command->first_line = NULL; /* this is set later */
+ my_command->type = SQL_COMMAND;
+ my_command->meta = META_NONE;
+ my_command->argc = 0;
+ my_command->retries = 0;
+ my_command->failures = 0;
+ memset(my_command->argv, 0, sizeof(my_command->argv));
+ my_command->varprefix = NULL; /* allocated later, if needed */
+ my_command->expr = NULL;
+ initSimpleStats(&my_command->stats);
+ my_command->prepname = NULL; /* set later, if needed */
+
+ return my_command;
+}
+
+/* Free a Command structure and associated data */
+static void
+free_command(Command *command)
+{
+ termPQExpBuffer(&command->lines);
+ if (command->first_line)
+ pg_free(command->first_line);
+ for (int i = 0; i < command->argc; i++)
+ pg_free(command->argv[i]);
+ if (command->varprefix)
+ pg_free(command->varprefix);
+
+ /*
+ * It should also free expr recursively, but this is currently not needed
+ * as only gset commands (which do not have an expression) are freed.
+ */
+ pg_free(command);
+}
+
+/*
+ * Once an SQL command is fully parsed, possibly by accumulating several
+ * parts, complete other fields of the Command structure.
+ */
+static void
+postprocess_sql_command(Command *my_command)
+{
+ char buffer[128];
+ static int prepnum = 0;
+
+ Assert(my_command->type == SQL_COMMAND);
+
+ /* Save the first line for error display. */
+ strlcpy(buffer, my_command->lines.data, sizeof(buffer));
+ buffer[strcspn(buffer, "\n\r")] = '\0';
+ my_command->first_line = pg_strdup(buffer);
+
+ /* Parse query and generate prepared statement name, if necessary */
+ switch (querymode)
+ {
+ case QUERY_SIMPLE:
+ my_command->argv[0] = my_command->lines.data;
+ my_command->argc++;
+ break;
+ case QUERY_PREPARED:
+ my_command->prepname = psprintf("P_%d", prepnum++);
+ /* fall through */
+ case QUERY_EXTENDED:
+ if (!parseQuery(my_command))
+ exit(1);
+ break;
+ default:
+ exit(1);
+ }
+}
+
+/*
+ * Parse a backslash command; return a Command struct, or NULL if comment
+ *
+ * At call, we have scanned only the initial backslash.
+ */
+static Command *
+process_backslash_command(PsqlScanState sstate, const char *source)
+{
+ Command *my_command;
+ PQExpBufferData word_buf;
+ int word_offset;
+ int offsets[MAX_ARGS]; /* offsets of argument words */
+ int start_offset;
+ int lineno;
+ int j;
+
+ initPQExpBuffer(&word_buf);
+
+ /* Remember location of the backslash */
+ start_offset = expr_scanner_offset(sstate) - 1;
+ lineno = expr_scanner_get_lineno(sstate, start_offset);
+
+ /* Collect first word of command */
+ if (!expr_lex_one_word(sstate, &word_buf, &word_offset))
+ {
+ termPQExpBuffer(&word_buf);
+ return NULL;
+ }
+
+ /* Allocate and initialize Command structure */
+ my_command = (Command *) pg_malloc0(sizeof(Command));
+ my_command->type = META_COMMAND;
+ my_command->argc = 0;
+ initSimpleStats(&my_command->stats);
+
+ /* Save first word (command name) */
+ j = 0;
+ offsets[j] = word_offset;
+ my_command->argv[j++] = pg_strdup(word_buf.data);
+ my_command->argc++;
+
+ /* ... and convert it to enum form */
+ my_command->meta = getMetaCommand(my_command->argv[0]);
+
+ if (my_command->meta == META_SET ||
+ my_command->meta == META_IF ||
+ my_command->meta == META_ELIF)
+ {
+ yyscan_t yyscanner;
+
+ /* For \set, collect var name */
+ if (my_command->meta == META_SET)
+ {
+ if (!expr_lex_one_word(sstate, &word_buf, &word_offset))
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "missing argument", NULL, -1);
+
+ offsets[j] = word_offset;
+ my_command->argv[j++] = pg_strdup(word_buf.data);
+ my_command->argc++;
+ }
+
+ /* then for all parse the expression */
+ yyscanner = expr_scanner_init(sstate, source, lineno, start_offset,
+ my_command->argv[0]);
+
+ if (expr_yyparse(yyscanner) != 0)
+ {
+ /* dead code: exit done from syntax_error called by yyerror */
+ exit(1);
+ }
+
+ my_command->expr = expr_parse_result;
+
+ /* Save line, trimming any trailing newline */
+ my_command->first_line =
+ expr_scanner_get_substring(sstate,
+ start_offset,
+ expr_scanner_offset(sstate),
+ true);
+
+ expr_scanner_finish(yyscanner);
+
+ termPQExpBuffer(&word_buf);
+
+ return my_command;
+ }
+
+ /* For all other commands, collect remaining words. */
+ while (expr_lex_one_word(sstate, &word_buf, &word_offset))
+ {
+ /*
+ * my_command->argv[0] is the command itself, so the max number of
+ * arguments is one less than MAX_ARGS
+ */
+ if (j >= MAX_ARGS)
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "too many arguments", NULL, -1);
+
+ offsets[j] = word_offset;
+ my_command->argv[j++] = pg_strdup(word_buf.data);
+ my_command->argc++;
+ }
+
+ /* Save line, trimming any trailing newline */
+ my_command->first_line =
+ expr_scanner_get_substring(sstate,
+ start_offset,
+ expr_scanner_offset(sstate),
+ true);
+
+ if (my_command->meta == META_SLEEP)
+ {
+ if (my_command->argc < 2)
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "missing argument", NULL, -1);
+
+ if (my_command->argc > 3)
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "too many arguments", NULL,
+ offsets[3] - start_offset);
+
+ /*
+ * Split argument into number and unit to allow "sleep 1ms" etc. We
+ * don't have to terminate the number argument with null because it
+ * will be parsed with atoi, which ignores trailing non-digit
+ * characters.
+ */
+ if (my_command->argv[1][0] != ':')
+ {
+ char *c = my_command->argv[1];
+ bool have_digit = false;
+
+ /* Skip sign */
+ if (*c == '+' || *c == '-')
+ c++;
+
+ /* Require at least one digit */
+ if (*c && isdigit((unsigned char) *c))
+ have_digit = true;
+
+ /* Eat all digits */
+ while (*c && isdigit((unsigned char) *c))
+ c++;
+
+ if (*c)
+ {
+ if (my_command->argc == 2 && have_digit)
+ {
+ my_command->argv[2] = c;
+ offsets[2] = offsets[1] + (c - my_command->argv[1]);
+ my_command->argc = 3;
+ }
+ else
+ {
+ /*
+ * Raise an error if argument starts with non-digit
+ * character (after sign).
+ */
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "invalid sleep time, must be an integer",
+ my_command->argv[1], offsets[1] - start_offset);
+ }
+ }
+ }
+
+ if (my_command->argc == 3)
+ {
+ if (pg_strcasecmp(my_command->argv[2], "us") != 0 &&
+ pg_strcasecmp(my_command->argv[2], "ms") != 0 &&
+ pg_strcasecmp(my_command->argv[2], "s") != 0)
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "unrecognized time unit, must be us, ms or s",
+ my_command->argv[2], offsets[2] - start_offset);
+ }
+ }
+ else if (my_command->meta == META_SETSHELL)
+ {
+ if (my_command->argc < 3)
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "missing argument", NULL, -1);
+ }
+ else if (my_command->meta == META_SHELL)
+ {
+ if (my_command->argc < 2)
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "missing command", NULL, -1);
+ }
+ else if (my_command->meta == META_ELSE || my_command->meta == META_ENDIF ||
+ my_command->meta == META_STARTPIPELINE ||
+ my_command->meta == META_ENDPIPELINE)
+ {
+ if (my_command->argc != 1)
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "unexpected argument", NULL, -1);
+ }
+ else if (my_command->meta == META_GSET || my_command->meta == META_ASET)
+ {
+ if (my_command->argc > 2)
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "too many arguments", NULL, -1);
+ }
+ else
+ {
+ /* my_command->meta == META_NONE */
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "invalid command", NULL, -1);
+ }
+
+ termPQExpBuffer(&word_buf);
+
+ return my_command;
+}
+
+static void
+ConditionError(const char *desc, int cmdn, const char *msg)
+{
+ pg_fatal("condition error in script \"%s\" command %d: %s",
+ desc, cmdn, msg);
+}
+
+/*
+ * Partial evaluation of conditionals before recording and running the script.
+ */
+static void
+CheckConditional(const ParsedScript *ps)
+{
+ /* statically check conditional structure */
+ ConditionalStack cs = conditional_stack_create();
+ int i;
+
+ for (i = 0; ps->commands[i] != NULL; i++)
+ {
+ Command *cmd = ps->commands[i];
+
+ if (cmd->type == META_COMMAND)
+ {
+ switch (cmd->meta)
+ {
+ case META_IF:
+ conditional_stack_push(cs, IFSTATE_FALSE);
+ break;
+ case META_ELIF:
+ if (conditional_stack_empty(cs))
+ ConditionError(ps->desc, i + 1, "\\elif without matching \\if");
+ if (conditional_stack_peek(cs) == IFSTATE_ELSE_FALSE)
+ ConditionError(ps->desc, i + 1, "\\elif after \\else");
+ break;
+ case META_ELSE:
+ if (conditional_stack_empty(cs))
+ ConditionError(ps->desc, i + 1, "\\else without matching \\if");
+ if (conditional_stack_peek(cs) == IFSTATE_ELSE_FALSE)
+ ConditionError(ps->desc, i + 1, "\\else after \\else");
+ conditional_stack_poke(cs, IFSTATE_ELSE_FALSE);
+ break;
+ case META_ENDIF:
+ if (!conditional_stack_pop(cs))
+ ConditionError(ps->desc, i + 1, "\\endif without matching \\if");
+ break;
+ default:
+ /* ignore anything else... */
+ break;
+ }
+ }
+ }
+ if (!conditional_stack_empty(cs))
+ ConditionError(ps->desc, i + 1, "\\if without matching \\endif");
+ conditional_stack_destroy(cs);
+}
+
+/*
+ * Parse a script (either the contents of a file, or a built-in script)
+ * and add it to the list of scripts.
+ */
+static void
+ParseScript(const char *script, const char *desc, int weight)
+{
+ ParsedScript ps;
+ PsqlScanState sstate;
+ PQExpBufferData line_buf;
+ int alloc_num;
+ int index;
+ int lineno;
+ int start_offset;
+
+#define COMMANDS_ALLOC_NUM 128
+ alloc_num = COMMANDS_ALLOC_NUM;
+
+ /* Initialize all fields of ps */
+ ps.desc = desc;
+ ps.weight = weight;
+ ps.commands = (Command **) pg_malloc(sizeof(Command *) * alloc_num);
+ initStats(&ps.stats, 0);
+
+ /* Prepare to parse script */
+ sstate = psql_scan_create(&pgbench_callbacks);
+
+ /*
+ * Ideally, we'd scan scripts using the encoding and stdstrings settings
+ * we get from a DB connection. However, without major rearrangement of
+ * pgbench's argument parsing, we can't have a DB connection at the time
+ * we parse scripts. Using SQL_ASCII (encoding 0) should work well enough
+ * with any backend-safe encoding, though conceivably we could be fooled
+ * if a script file uses a client-only encoding. We also assume that
+ * stdstrings should be true, which is a bit riskier.
+ */
+ psql_scan_setup(sstate, script, strlen(script), 0, true);
+ start_offset = expr_scanner_offset(sstate) - 1;
+
+ initPQExpBuffer(&line_buf);
+
+ index = 0;
+
+ for (;;)
+ {
+ PsqlScanResult sr;
+ promptStatus_t prompt;
+ Command *command = NULL;
+
+ resetPQExpBuffer(&line_buf);
+ lineno = expr_scanner_get_lineno(sstate, start_offset);
+
+ sr = psql_scan(sstate, &line_buf, &prompt);
+
+ /* If we collected a new SQL command, process that */
+ command = create_sql_command(&line_buf, desc);
+
+ /* store new command */
+ if (command)
+ ps.commands[index++] = command;
+
+ /* If we reached a backslash, process that */
+ if (sr == PSCAN_BACKSLASH)
+ {
+ command = process_backslash_command(sstate, desc);
+
+ if (command)
+ {
+ /*
+ * If this is gset or aset, merge into the preceding command.
+ * (We don't use a command slot in this case).
+ */
+ if (command->meta == META_GSET || command->meta == META_ASET)
+ {
+ Command *cmd;
+
+ if (index == 0)
+ syntax_error(desc, lineno, NULL, NULL,
+ "\\gset must follow an SQL command",
+ NULL, -1);
+
+ cmd = ps.commands[index - 1];
+
+ if (cmd->type != SQL_COMMAND ||
+ cmd->varprefix != NULL)
+ syntax_error(desc, lineno, NULL, NULL,
+ "\\gset must follow an SQL command",
+ cmd->first_line, -1);
+
+ /* get variable prefix */
+ if (command->argc <= 1 || command->argv[1][0] == '\0')
+ cmd->varprefix = pg_strdup("");
+ else
+ cmd->varprefix = pg_strdup(command->argv[1]);
+
+ /* update the sql command meta */
+ cmd->meta = command->meta;
+
+ /* cleanup unused command */
+ free_command(command);
+
+ continue;
+ }
+
+ /* Attach any other backslash command as a new command */
+ ps.commands[index++] = command;
+ }
+ }
+
+ /*
+ * Since we used a command slot, allocate more if needed. Note we
+ * always allocate one more in order to accommodate the NULL
+ * terminator below.
+ */
+ if (index >= alloc_num)
+ {
+ alloc_num += COMMANDS_ALLOC_NUM;
+ ps.commands = (Command **)
+ pg_realloc(ps.commands, sizeof(Command *) * alloc_num);
+ }
+
+ /* Done if we reached EOF */
+ if (sr == PSCAN_INCOMPLETE || sr == PSCAN_EOL)
+ break;
+ }
+
+ ps.commands[index] = NULL;
+
+ addScript(&ps);
+
+ termPQExpBuffer(&line_buf);
+ psql_scan_finish(sstate);
+ psql_scan_destroy(sstate);
+}
+
+/*
+ * Read the entire contents of file fd, and return it in a malloc'd buffer.
+ *
+ * The buffer will typically be larger than necessary, but we don't care
+ * in this program, because we'll free it as soon as we've parsed the script.
+ */
+static char *
+read_file_contents(FILE *fd)
+{
+ char *buf;
+ size_t buflen = BUFSIZ;
+ size_t used = 0;
+
+ buf = (char *) pg_malloc(buflen);
+
+ for (;;)
+ {
+ size_t nread;
+
+ nread = fread(buf + used, 1, BUFSIZ, fd);
+ used += nread;
+ /* If fread() read less than requested, must be EOF or error */
+ if (nread < BUFSIZ)
+ break;
+ /* Enlarge buf so we can read some more */
+ buflen += BUFSIZ;
+ buf = (char *) pg_realloc(buf, buflen);
+ }
+ /* There is surely room for a terminator */
+ buf[used] = '\0';
+
+ return buf;
+}
+
+/*
+ * Given a file name, read it and add its script to the list.
+ * "-" means to read stdin.
+ * NB: filename must be storage that won't disappear.
+ */
+static void
+process_file(const char *filename, int weight)
+{
+ FILE *fd;
+ char *buf;
+
+ /* Slurp the file contents into "buf" */
+ if (strcmp(filename, "-") == 0)
+ fd = stdin;
+ else if ((fd = fopen(filename, "r")) == NULL)
+ pg_fatal("could not open file \"%s\": %m", filename);
+
+ buf = read_file_contents(fd);
+
+ if (ferror(fd))
+ pg_fatal("could not read file \"%s\": %m", filename);
+
+ if (fd != stdin)
+ fclose(fd);
+
+ ParseScript(buf, filename, weight);
+
+ free(buf);
+}
+
+/* Parse the given builtin script and add it to the list. */
+static void
+process_builtin(const BuiltinScript *bi, int weight)
+{
+ ParseScript(bi->script, bi->desc, weight);
+}
+
+/* show available builtin scripts */
+static void
+listAvailableScripts(void)
+{
+ int i;
+
+ fprintf(stderr, "Available builtin scripts:\n");
+ for (i = 0; i < lengthof(builtin_script); i++)
+ fprintf(stderr, " %13s: %s\n", builtin_script[i].name, builtin_script[i].desc);
+ fprintf(stderr, "\n");
+}
+
+/* return builtin script "name" if unambiguous, fails if not found */
+static const BuiltinScript *
+findBuiltin(const char *name)
+{
+ int i,
+ found = 0,
+ len = strlen(name);
+ const BuiltinScript *result = NULL;
+
+ for (i = 0; i < lengthof(builtin_script); i++)
+ {
+ if (strncmp(builtin_script[i].name, name, len) == 0)
+ {
+ result = &builtin_script[i];
+ found++;
+ }
+ }
+
+ /* ok, unambiguous result */
+ if (found == 1)
+ return result;
+
+ /* error cases */
+ if (found == 0)
+ pg_log_error("no builtin script found for name \"%s\"", name);
+ else /* found > 1 */
+ pg_log_error("ambiguous builtin name: %d builtin scripts found for prefix \"%s\"", found, name);
+
+ listAvailableScripts();
+ exit(1);
+}
+
+/*
+ * Determine the weight specification from a script option (-b, -f), if any,
+ * and return it as an integer (1 is returned if there's no weight). The
+ * script name is returned in *script as a malloc'd string.
+ */
+static int
+parseScriptWeight(const char *option, char **script)
+{
+ char *sep;
+ int weight;
+
+ if ((sep = strrchr(option, WSEP)))
+ {
+ int namelen = sep - option;
+ long wtmp;
+ char *badp;
+
+ /* generate the script name */
+ *script = pg_malloc(namelen + 1);
+ strncpy(*script, option, namelen);
+ (*script)[namelen] = '\0';
+
+ /* process digits of the weight spec */
+ errno = 0;
+ wtmp = strtol(sep + 1, &badp, 10);
+ if (errno != 0 || badp == sep + 1 || *badp != '\0')
+ pg_fatal("invalid weight specification: %s", sep);
+ if (wtmp > INT_MAX || wtmp < 0)
+ pg_fatal("weight specification out of range (0 .. %d): %lld",
+ INT_MAX, (long long) wtmp);
+ weight = wtmp;
+ }
+ else
+ {
+ *script = pg_strdup(option);
+ weight = 1;
+ }
+
+ return weight;
+}
+
+/* append a script to the list of scripts to process */
+static void
+addScript(const ParsedScript *script)
+{
+ if (script->commands == NULL || script->commands[0] == NULL)
+ pg_fatal("empty command list for script \"%s\"", script->desc);
+
+ if (num_scripts >= MAX_SCRIPTS)
+ pg_fatal("at most %d SQL scripts are allowed", MAX_SCRIPTS);
+
+ CheckConditional(script);
+
+ sql_script[num_scripts] = *script;
+ num_scripts++;
+}
+
+/*
+ * Print progress report.
+ *
+ * On entry, *last and *last_report contain the statistics and time of last
+ * progress report. On exit, they are updated with the new stats.
+ */
+static void
+printProgressReport(TState *threads, int64 test_start, pg_time_usec_t now,
+ StatsData *last, int64 *last_report)
+{
+ /* generate and show report */
+ pg_time_usec_t run = now - *last_report;
+ int64 cnt,
+ failures,
+ retried;
+ double tps,
+ total_run,
+ latency,
+ sqlat,
+ lag,
+ stdev;
+ char tbuf[315];
+ StatsData cur;
+
+ /*
+ * Add up the statistics of all threads.
+ *
+ * XXX: No locking. There is no guarantee that we get an atomic snapshot
+ * of the transaction count and latencies, so these figures can well be
+ * off by a small amount. The progress report's purpose is to give a
+ * quick overview of how the test is going, so that shouldn't matter too
+ * much. (If a read from a 64-bit integer is not atomic, you might get a
+ * "torn" read and completely bogus latencies though!)
+ */
+ initStats(&cur, 0);
+ for (int i = 0; i < nthreads; i++)
+ {
+ mergeSimpleStats(&cur.latency, &threads[i].stats.latency);
+ mergeSimpleStats(&cur.lag, &threads[i].stats.lag);
+ cur.cnt += threads[i].stats.cnt;
+ cur.skipped += threads[i].stats.skipped;
+ cur.retries += threads[i].stats.retries;
+ cur.retried += threads[i].stats.retried;
+ cur.serialization_failures +=
+ threads[i].stats.serialization_failures;
+ cur.deadlock_failures += threads[i].stats.deadlock_failures;
+ }
+
+ /* we count only actually executed transactions */
+ cnt = cur.cnt - last->cnt;
+ total_run = (now - test_start) / 1000000.0;
+ tps = 1000000.0 * cnt / run;
+ if (cnt > 0)
+ {
+ latency = 0.001 * (cur.latency.sum - last->latency.sum) / cnt;
+ sqlat = 1.0 * (cur.latency.sum2 - last->latency.sum2) / cnt;
+ stdev = 0.001 * sqrt(sqlat - 1000000.0 * latency * latency);
+ lag = 0.001 * (cur.lag.sum - last->lag.sum) / cnt;
+ }
+ else
+ {
+ latency = sqlat = stdev = lag = 0;
+ }
+ failures = getFailures(&cur) - getFailures(last);
+ retried = cur.retried - last->retried;
+
+ if (progress_timestamp)
+ {
+ snprintf(tbuf, sizeof(tbuf), "%.3f s",
+ PG_TIME_GET_DOUBLE(now + epoch_shift));
+ }
+ else
+ {
+ /* round seconds are expected, but the thread may be late */
+ snprintf(tbuf, sizeof(tbuf), "%.1f s", total_run);
+ }
+
+ fprintf(stderr,
+ "progress: %s, %.1f tps, lat %.3f ms stddev %.3f, " INT64_FORMAT " failed",
+ tbuf, tps, latency, stdev, failures);
+
+ if (throttle_delay)
+ {
+ fprintf(stderr, ", lag %.3f ms", lag);
+ if (latency_limit)
+ fprintf(stderr, ", " INT64_FORMAT " skipped",
+ cur.skipped - last->skipped);
+ }
+
+ /* it can be non-zero only if max_tries is not equal to one */
+ if (max_tries != 1)
+ fprintf(stderr,
+ ", " INT64_FORMAT " retried, " INT64_FORMAT " retries",
+ retried, cur.retries - last->retries);
+ fprintf(stderr, "\n");
+
+ *last = cur;
+ *last_report = now;
+}
+
+static void
+printSimpleStats(const char *prefix, SimpleStats *ss)
+{
+ if (ss->count > 0)
+ {
+ double latency = ss->sum / ss->count;
+ double stddev = sqrt(ss->sum2 / ss->count - latency * latency);
+
+ printf("%s average = %.3f ms\n", prefix, 0.001 * latency);
+ printf("%s stddev = %.3f ms\n", prefix, 0.001 * stddev);
+ }
+}
+
+/* print version banner */
+static void
+printVersion(PGconn *con)
+{
+ int server_ver = PQserverVersion(con);
+ int client_ver = PG_VERSION_NUM;
+
+ if (server_ver != client_ver)
+ {
+ const char *server_version;
+ char sverbuf[32];
+
+ /* Try to get full text form, might include "devel" etc */
+ server_version = PQparameterStatus(con, "server_version");
+ /* Otherwise fall back on server_ver */
+ if (!server_version)
+ {
+ formatPGVersionNumber(server_ver, true,
+ sverbuf, sizeof(sverbuf));
+ server_version = sverbuf;
+ }
+
+ printf(_("%s (%s, server %s)\n"),
+ "pgbench", PG_VERSION, server_version);
+ }
+ /* For version match, only print pgbench version */
+ else
+ printf("%s (%s)\n", "pgbench", PG_VERSION);
+ fflush(stdout);
+}
+
+/* print out results */
+static void
+printResults(StatsData *total,
+ pg_time_usec_t total_duration, /* benchmarking time */
+ pg_time_usec_t conn_total_duration, /* is_connect */
+ pg_time_usec_t conn_elapsed_duration, /* !is_connect */
+ int64 latency_late)
+{
+ /* tps is about actually executed transactions during benchmarking */
+ int64 failures = getFailures(total);
+ int64 total_cnt = total->cnt + total->skipped + failures;
+ double bench_duration = PG_TIME_GET_DOUBLE(total_duration);
+ double tps = total->cnt / bench_duration;
+
+ /* Report test parameters. */
+ printf("transaction type: %s\n",
+ num_scripts == 1 ? sql_script[0].desc : "multiple scripts");
+ printf("scaling factor: %d\n", scale);
+ /* only print partitioning information if some partitioning was detected */
+ if (partition_method != PART_NONE)
+ printf("partition method: %s\npartitions: %d\n",
+ PARTITION_METHOD[partition_method], partitions);
+ printf("query mode: %s\n", QUERYMODE[querymode]);
+ printf("number of clients: %d\n", nclients);
+ printf("number of threads: %d\n", nthreads);
+
+ if (max_tries)
+ printf("maximum number of tries: %u\n", max_tries);
+
+ if (duration <= 0)
+ {
+ printf("number of transactions per client: %d\n", nxacts);
+ printf("number of transactions actually processed: " INT64_FORMAT "/%d\n",
+ total->cnt, nxacts * nclients);
+ }
+ else
+ {
+ printf("duration: %d s\n", duration);
+ printf("number of transactions actually processed: " INT64_FORMAT "\n",
+ total->cnt);
+ }
+
+ printf("number of failed transactions: " INT64_FORMAT " (%.3f%%)\n",
+ failures, 100.0 * failures / total_cnt);
+
+ if (failures_detailed)
+ {
+ printf("number of serialization failures: " INT64_FORMAT " (%.3f%%)\n",
+ total->serialization_failures,
+ 100.0 * total->serialization_failures / total_cnt);
+ printf("number of deadlock failures: " INT64_FORMAT " (%.3f%%)\n",
+ total->deadlock_failures,
+ 100.0 * total->deadlock_failures / total_cnt);
+ }
+
+ /* it can be non-zero only if max_tries is not equal to one */
+ if (max_tries != 1)
+ {
+ printf("number of transactions retried: " INT64_FORMAT " (%.3f%%)\n",
+ total->retried, 100.0 * total->retried / total_cnt);
+ printf("total number of retries: " INT64_FORMAT "\n", total->retries);
+ }
+
+ /* Remaining stats are nonsensical if we failed to execute any xacts */
+ if (total->cnt + total->skipped <= 0)
+ return;
+
+ if (throttle_delay && latency_limit)
+ printf("number of transactions skipped: " INT64_FORMAT " (%.3f%%)\n",
+ total->skipped, 100.0 * total->skipped / total_cnt);
+
+ if (latency_limit)
+ printf("number of transactions above the %.1f ms latency limit: " INT64_FORMAT "/" INT64_FORMAT " (%.3f%%)\n",
+ latency_limit / 1000.0, latency_late, total->cnt,
+ (total->cnt > 0) ? 100.0 * latency_late / total->cnt : 0.0);
+
+ if (throttle_delay || progress || latency_limit)
+ printSimpleStats("latency", &total->latency);
+ else
+ {
+ /* no measurement, show average latency computed from run time */
+ printf("latency average = %.3f ms%s\n",
+ 0.001 * total_duration * nclients / total_cnt,
+ failures > 0 ? " (including failures)" : "");
+ }
+
+ if (throttle_delay)
+ {
+ /*
+ * Report average transaction lag under rate limit throttling. This
+ * is the delay between scheduled and actual start times for the
+ * transaction. The measured lag may be caused by thread/client load,
+ * the database load, or the Poisson throttling process.
+ */
+ printf("rate limit schedule lag: avg %.3f (max %.3f) ms\n",
+ 0.001 * total->lag.sum / total->cnt, 0.001 * total->lag.max);
+ }
+
+ /*
+ * Under -C/--connect, each transaction incurs a significant connection
+ * cost, it would not make much sense to ignore it in tps, and it would
+ * not be tps anyway.
+ *
+ * Otherwise connections are made just once at the beginning of the run
+ * and should not impact performance but for very short run, so they are
+ * (right)fully ignored in tps.
+ */
+ if (is_connect)
+ {
+ printf("average connection time = %.3f ms\n", 0.001 * conn_total_duration / (total->cnt + failures));
+ printf("tps = %f (including reconnection times)\n", tps);
+ }
+ else
+ {
+ printf("initial connection time = %.3f ms\n", 0.001 * conn_elapsed_duration);
+ printf("tps = %f (without initial connection time)\n", tps);
+ }
+
+ /* Report per-script/command statistics */
+ if (per_script_stats || report_per_command)
+ {
+ int i;
+
+ for (i = 0; i < num_scripts; i++)
+ {
+ if (per_script_stats)
+ {
+ StatsData *sstats = &sql_script[i].stats;
+ int64 script_failures = getFailures(sstats);
+ int64 script_total_cnt =
+ sstats->cnt + sstats->skipped + script_failures;
+
+ printf("SQL script %d: %s\n"
+ " - weight: %d (targets %.1f%% of total)\n"
+ " - " INT64_FORMAT " transactions (%.1f%% of total, tps = %f)\n",
+ i + 1, sql_script[i].desc,
+ sql_script[i].weight,
+ 100.0 * sql_script[i].weight / total_weight,
+ sstats->cnt,
+ 100.0 * sstats->cnt / total->cnt,
+ sstats->cnt / bench_duration);
+
+ printf(" - number of failed transactions: " INT64_FORMAT " (%.3f%%)\n",
+ script_failures,
+ 100.0 * script_failures / script_total_cnt);
+
+ if (failures_detailed)
+ {
+ printf(" - number of serialization failures: " INT64_FORMAT " (%.3f%%)\n",
+ sstats->serialization_failures,
+ (100.0 * sstats->serialization_failures /
+ script_total_cnt));
+ printf(" - number of deadlock failures: " INT64_FORMAT " (%.3f%%)\n",
+ sstats->deadlock_failures,
+ (100.0 * sstats->deadlock_failures /
+ script_total_cnt));
+ }
+
+ /* it can be non-zero only if max_tries is not equal to one */
+ if (max_tries != 1)
+ {
+ printf(" - number of transactions retried: " INT64_FORMAT " (%.3f%%)\n",
+ sstats->retried,
+ 100.0 * sstats->retried / script_total_cnt);
+ printf(" - total number of retries: " INT64_FORMAT "\n",
+ sstats->retries);
+ }
+
+ if (throttle_delay && latency_limit && script_total_cnt > 0)
+ printf(" - number of transactions skipped: " INT64_FORMAT " (%.3f%%)\n",
+ sstats->skipped,
+ 100.0 * sstats->skipped / script_total_cnt);
+
+ printSimpleStats(" - latency", &sstats->latency);
+ }
+
+ /*
+ * Report per-command statistics: latencies, retries after errors,
+ * failures (errors without retrying).
+ */
+ if (report_per_command)
+ {
+ Command **commands;
+
+ printf("%sstatement latencies in milliseconds%s:\n",
+ per_script_stats ? " - " : "",
+ (max_tries == 1 ?
+ " and failures" :
+ ", failures and retries"));
+
+ for (commands = sql_script[i].commands;
+ *commands != NULL;
+ commands++)
+ {
+ SimpleStats *cstats = &(*commands)->stats;
+
+ if (max_tries == 1)
+ printf(" %11.3f %10" INT64_MODIFIER "d %s\n",
+ (cstats->count > 0) ?
+ 1000.0 * cstats->sum / cstats->count : 0.0,
+ (*commands)->failures,
+ (*commands)->first_line);
+ else
+ printf(" %11.3f %10" INT64_MODIFIER "d %10" INT64_MODIFIER "d %s\n",
+ (cstats->count > 0) ?
+ 1000.0 * cstats->sum / cstats->count : 0.0,
+ (*commands)->failures,
+ (*commands)->retries,
+ (*commands)->first_line);
+ }
+ }
+ }
+ }
+}
+
+/*
+ * Set up a random seed according to seed parameter (NULL means default),
+ * and initialize base_random_sequence for use in initializing other sequences.
+ */
+static bool
+set_random_seed(const char *seed)
+{
+ uint64 iseed;
+
+ if (seed == NULL || strcmp(seed, "time") == 0)
+ {
+ /* rely on current time */
+ iseed = pg_time_now();
+ }
+ else if (strcmp(seed, "rand") == 0)
+ {
+ /* use some "strong" random source */
+ if (!pg_strong_random(&iseed, sizeof(iseed)))
+ {
+ pg_log_error("could not generate random seed");
+ return false;
+ }
+ }
+ else
+ {
+ /* parse unsigned-int seed value */
+ unsigned long ulseed;
+ char garbage;
+
+ /* Don't try to use UINT64_FORMAT here; it might not work for sscanf */
+ if (sscanf(seed, "%lu%c", &ulseed, &garbage) != 1)
+ {
+ pg_log_error("unrecognized random seed option \"%s\"", seed);
+ pg_log_error_detail("Expecting an unsigned integer, \"time\" or \"rand\".");
+ return false;
+ }
+ iseed = (uint64) ulseed;
+ }
+
+ if (seed != NULL)
+ pg_log_info("setting random seed to %llu", (unsigned long long) iseed);
+
+ random_seed = iseed;
+
+ /* Initialize base_random_sequence using seed */
+ pg_prng_seed(&base_random_sequence, (uint64) iseed);
+
+ return true;
+}
+
+int
+main(int argc, char **argv)
+{
+ static struct option long_options[] = {
+ /* systematic long/short named options */
+ {"builtin", required_argument, NULL, 'b'},
+ {"client", required_argument, NULL, 'c'},
+ {"connect", no_argument, NULL, 'C'},
+ {"debug", no_argument, NULL, 'd'},
+ {"define", required_argument, NULL, 'D'},
+ {"file", required_argument, NULL, 'f'},
+ {"fillfactor", required_argument, NULL, 'F'},
+ {"host", required_argument, NULL, 'h'},
+ {"initialize", no_argument, NULL, 'i'},
+ {"init-steps", required_argument, NULL, 'I'},
+ {"jobs", required_argument, NULL, 'j'},
+ {"log", no_argument, NULL, 'l'},
+ {"latency-limit", required_argument, NULL, 'L'},
+ {"no-vacuum", no_argument, NULL, 'n'},
+ {"port", required_argument, NULL, 'p'},
+ {"progress", required_argument, NULL, 'P'},
+ {"protocol", required_argument, NULL, 'M'},
+ {"quiet", no_argument, NULL, 'q'},
+ {"report-per-command", no_argument, NULL, 'r'},
+ {"rate", required_argument, NULL, 'R'},
+ {"scale", required_argument, NULL, 's'},
+ {"select-only", no_argument, NULL, 'S'},
+ {"skip-some-updates", no_argument, NULL, 'N'},
+ {"time", required_argument, NULL, 'T'},
+ {"transactions", required_argument, NULL, 't'},
+ {"username", required_argument, NULL, 'U'},
+ {"vacuum-all", no_argument, NULL, 'v'},
+ /* long-named only options */
+ {"unlogged-tables", no_argument, NULL, 1},
+ {"tablespace", required_argument, NULL, 2},
+ {"index-tablespace", required_argument, NULL, 3},
+ {"sampling-rate", required_argument, NULL, 4},
+ {"aggregate-interval", required_argument, NULL, 5},
+ {"progress-timestamp", no_argument, NULL, 6},
+ {"log-prefix", required_argument, NULL, 7},
+ {"foreign-keys", no_argument, NULL, 8},
+ {"random-seed", required_argument, NULL, 9},
+ {"show-script", required_argument, NULL, 10},
+ {"partitions", required_argument, NULL, 11},
+ {"partition-method", required_argument, NULL, 12},
+ {"failures-detailed", no_argument, NULL, 13},
+ {"max-tries", required_argument, NULL, 14},
+ {"verbose-errors", no_argument, NULL, 15},
+ {NULL, 0, NULL, 0}
+ };
+
+ int c;
+ bool is_init_mode = false; /* initialize mode? */
+ char *initialize_steps = NULL;
+ bool foreign_keys = false;
+ bool is_no_vacuum = false;
+ bool do_vacuum_accounts = false; /* vacuum accounts table? */
+ int optindex;
+ bool scale_given = false;
+
+ bool benchmarking_option_set = false;
+ bool initialization_option_set = false;
+ bool internal_script_used = false;
+
+ CState *state; /* status of clients */
+ TState *threads; /* array of thread */
+
+ pg_time_usec_t
+ start_time, /* start up time */
+ bench_start = 0, /* first recorded benchmarking time */
+ conn_total_duration; /* cumulated connection time in
+ * threads */
+ int64 latency_late = 0;
+ StatsData stats;
+ int weight;
+
+ int i;
+ int nclients_dealt;
+
+#ifdef HAVE_GETRLIMIT
+ struct rlimit rlim;
+#endif
+
+ PGconn *con;
+ char *env;
+
+ int exit_code = 0;
+ struct timeval tv;
+
+ /*
+ * Record difference between Unix time and instr_time time. We'll use
+ * this for logging and aggregation.
+ */
+ gettimeofday(&tv, NULL);
+ epoch_shift = tv.tv_sec * INT64CONST(1000000) + tv.tv_usec - pg_time_now();
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pgbench (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ state = (CState *) pg_malloc0(sizeof(CState));
+
+ /* set random seed early, because it may be used while parsing scripts. */
+ if (!set_random_seed(getenv("PGBENCH_RANDOM_SEED")))
+ pg_fatal("error while setting random seed from PGBENCH_RANDOM_SEED environment variable");
+
+ while ((c = getopt_long(argc, argv, "iI:h:nvp:dqb:SNc:j:Crs:t:T:U:lf:D:F:M:P:R:L:", long_options, &optindex)) != -1)
+ {
+ char *script;
+
+ switch (c)
+ {
+ case 'i':
+ is_init_mode = true;
+ break;
+ case 'I':
+ if (initialize_steps)
+ pg_free(initialize_steps);
+ initialize_steps = pg_strdup(optarg);
+ checkInitSteps(initialize_steps);
+ initialization_option_set = true;
+ break;
+ case 'h':
+ pghost = pg_strdup(optarg);
+ break;
+ case 'n':
+ is_no_vacuum = true;
+ break;
+ case 'v':
+ benchmarking_option_set = true;
+ do_vacuum_accounts = true;
+ break;
+ case 'p':
+ pgport = pg_strdup(optarg);
+ break;
+ case 'd':
+ pg_logging_increase_verbosity();
+ break;
+ case 'c':
+ benchmarking_option_set = true;
+ if (!option_parse_int(optarg, "-c/--clients", 1, INT_MAX,
+ &nclients))
+ {
+ exit(1);
+ }
+#ifdef HAVE_GETRLIMIT
+#ifdef RLIMIT_NOFILE /* most platforms use RLIMIT_NOFILE */
+ if (getrlimit(RLIMIT_NOFILE, &rlim) == -1)
+#else /* but BSD doesn't ... */
+ if (getrlimit(RLIMIT_OFILE, &rlim) == -1)
+#endif /* RLIMIT_NOFILE */
+ pg_fatal("getrlimit failed: %m");
+ if (rlim.rlim_cur < nclients + 3)
+ {
+ pg_log_error("need at least %d open files, but system limit is %ld",
+ nclients + 3, (long) rlim.rlim_cur);
+ pg_log_error_hint("Reduce number of clients, or use limit/ulimit to increase the system limit.");
+ exit(1);
+ }
+#endif /* HAVE_GETRLIMIT */
+ break;
+ case 'j': /* jobs */
+ benchmarking_option_set = true;
+ if (!option_parse_int(optarg, "-j/--jobs", 1, INT_MAX,
+ &nthreads))
+ {
+ exit(1);
+ }
+#ifndef ENABLE_THREAD_SAFETY
+ if (nthreads != 1)
+ pg_fatal("threads are not supported on this platform; use -j1");
+#endif /* !ENABLE_THREAD_SAFETY */
+ break;
+ case 'C':
+ benchmarking_option_set = true;
+ is_connect = true;
+ break;
+ case 'r':
+ benchmarking_option_set = true;
+ report_per_command = true;
+ break;
+ case 's':
+ scale_given = true;
+ if (!option_parse_int(optarg, "-s/--scale", 1, INT_MAX,
+ &scale))
+ exit(1);
+ break;
+ case 't':
+ benchmarking_option_set = true;
+ if (!option_parse_int(optarg, "-t/--transactions", 1, INT_MAX,
+ &nxacts))
+ exit(1);
+ break;
+ case 'T':
+ benchmarking_option_set = true;
+ if (!option_parse_int(optarg, "-T/--time", 1, INT_MAX,
+ &duration))
+ exit(1);
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'l':
+ benchmarking_option_set = true;
+ use_log = true;
+ break;
+ case 'q':
+ initialization_option_set = true;
+ use_quiet = true;
+ break;
+ case 'b':
+ if (strcmp(optarg, "list") == 0)
+ {
+ listAvailableScripts();
+ exit(0);
+ }
+ weight = parseScriptWeight(optarg, &script);
+ process_builtin(findBuiltin(script), weight);
+ benchmarking_option_set = true;
+ internal_script_used = true;
+ break;
+ case 'S':
+ process_builtin(findBuiltin("select-only"), 1);
+ benchmarking_option_set = true;
+ internal_script_used = true;
+ break;
+ case 'N':
+ process_builtin(findBuiltin("simple-update"), 1);
+ benchmarking_option_set = true;
+ internal_script_used = true;
+ break;
+ case 'f':
+ weight = parseScriptWeight(optarg, &script);
+ process_file(script, weight);
+ benchmarking_option_set = true;
+ break;
+ case 'D':
+ {
+ char *p;
+
+ benchmarking_option_set = true;
+
+ if ((p = strchr(optarg, '=')) == NULL || p == optarg || *(p + 1) == '\0')
+ pg_fatal("invalid variable definition: \"%s\"", optarg);
+
+ *p++ = '\0';
+ if (!putVariable(&state[0].variables, "option", optarg, p))
+ exit(1);
+ }
+ break;
+ case 'F':
+ initialization_option_set = true;
+ if (!option_parse_int(optarg, "-F/--fillfactor", 10, 100,
+ &fillfactor))
+ exit(1);
+ break;
+ case 'M':
+ benchmarking_option_set = true;
+ for (querymode = 0; querymode < NUM_QUERYMODE; querymode++)
+ if (strcmp(optarg, QUERYMODE[querymode]) == 0)
+ break;
+ if (querymode >= NUM_QUERYMODE)
+ pg_fatal("invalid query mode (-M): \"%s\"", optarg);
+ break;
+ case 'P':
+ benchmarking_option_set = true;
+ if (!option_parse_int(optarg, "-P/--progress", 1, INT_MAX,
+ &progress))
+ exit(1);
+ break;
+ case 'R':
+ {
+ /* get a double from the beginning of option value */
+ double throttle_value = atof(optarg);
+
+ benchmarking_option_set = true;
+
+ if (throttle_value <= 0.0)
+ pg_fatal("invalid rate limit: \"%s\"", optarg);
+ /* Invert rate limit into per-transaction delay in usec */
+ throttle_delay = 1000000.0 / throttle_value;
+ }
+ break;
+ case 'L':
+ {
+ double limit_ms = atof(optarg);
+
+ if (limit_ms <= 0.0)
+ pg_fatal("invalid latency limit: \"%s\"", optarg);
+ benchmarking_option_set = true;
+ latency_limit = (int64) (limit_ms * 1000);
+ }
+ break;
+ case 1: /* unlogged-tables */
+ initialization_option_set = true;
+ unlogged_tables = true;
+ break;
+ case 2: /* tablespace */
+ initialization_option_set = true;
+ tablespace = pg_strdup(optarg);
+ break;
+ case 3: /* index-tablespace */
+ initialization_option_set = true;
+ index_tablespace = pg_strdup(optarg);
+ break;
+ case 4: /* sampling-rate */
+ benchmarking_option_set = true;
+ sample_rate = atof(optarg);
+ if (sample_rate <= 0.0 || sample_rate > 1.0)
+ pg_fatal("invalid sampling rate: \"%s\"", optarg);
+ break;
+ case 5: /* aggregate-interval */
+ benchmarking_option_set = true;
+ if (!option_parse_int(optarg, "--aggregate-interval", 1, INT_MAX,
+ &agg_interval))
+ exit(1);
+ break;
+ case 6: /* progress-timestamp */
+ progress_timestamp = true;
+ benchmarking_option_set = true;
+ break;
+ case 7: /* log-prefix */
+ benchmarking_option_set = true;
+ logfile_prefix = pg_strdup(optarg);
+ break;
+ case 8: /* foreign-keys */
+ initialization_option_set = true;
+ foreign_keys = true;
+ break;
+ case 9: /* random-seed */
+ benchmarking_option_set = true;
+ if (!set_random_seed(optarg))
+ pg_fatal("error while setting random seed from --random-seed option");
+ break;
+ case 10: /* list */
+ {
+ const BuiltinScript *s = findBuiltin(optarg);
+
+ fprintf(stderr, "-- %s: %s\n%s\n", s->name, s->desc, s->script);
+ exit(0);
+ }
+ break;
+ case 11: /* partitions */
+ initialization_option_set = true;
+ if (!option_parse_int(optarg, "--partitions", 0, INT_MAX,
+ &partitions))
+ exit(1);
+ break;
+ case 12: /* partition-method */
+ initialization_option_set = true;
+ if (pg_strcasecmp(optarg, "range") == 0)
+ partition_method = PART_RANGE;
+ else if (pg_strcasecmp(optarg, "hash") == 0)
+ partition_method = PART_HASH;
+ else
+ pg_fatal("invalid partition method, expecting \"range\" or \"hash\", got: \"%s\"",
+ optarg);
+ break;
+ case 13: /* failures-detailed */
+ benchmarking_option_set = true;
+ failures_detailed = true;
+ break;
+ case 14: /* max-tries */
+ {
+ int32 max_tries_arg = atoi(optarg);
+
+ if (max_tries_arg < 0)
+ pg_fatal("invalid number of maximum tries: \"%s\"", optarg);
+
+ benchmarking_option_set = true;
+ max_tries = (uint32) max_tries_arg;
+ }
+ break;
+ case 15: /* verbose-errors */
+ benchmarking_option_set = true;
+ verbose_errors = true;
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /* set default script if none */
+ if (num_scripts == 0 && !is_init_mode)
+ {
+ process_builtin(findBuiltin("tpcb-like"), 1);
+ benchmarking_option_set = true;
+ internal_script_used = true;
+ }
+
+ /* complete SQL command initialization and compute total weight */
+ for (i = 0; i < num_scripts; i++)
+ {
+ Command **commands = sql_script[i].commands;
+
+ for (int j = 0; commands[j] != NULL; j++)
+ if (commands[j]->type == SQL_COMMAND)
+ postprocess_sql_command(commands[j]);
+
+ /* cannot overflow: weight is 32b, total_weight 64b */
+ total_weight += sql_script[i].weight;
+ }
+
+ if (total_weight == 0 && !is_init_mode)
+ pg_fatal("total script weight must not be zero");
+
+ /* show per script stats if several scripts are used */
+ if (num_scripts > 1)
+ per_script_stats = true;
+
+ /*
+ * Don't need more threads than there are clients. (This is not merely an
+ * optimization; throttle_delay is calculated incorrectly below if some
+ * threads have no clients assigned to them.)
+ */
+ if (nthreads > nclients)
+ nthreads = nclients;
+
+ /*
+ * Convert throttle_delay to a per-thread delay time. Note that this
+ * might be a fractional number of usec, but that's OK, since it's just
+ * the center of a Poisson distribution of delays.
+ */
+ throttle_delay *= nthreads;
+
+ if (argc > optind)
+ dbName = argv[optind++];
+ else
+ {
+ if ((env = getenv("PGDATABASE")) != NULL && *env != '\0')
+ dbName = env;
+ else if ((env = getenv("PGUSER")) != NULL && *env != '\0')
+ dbName = env;
+ else
+ dbName = get_user_name_or_exit(progname);
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (is_init_mode)
+ {
+ if (benchmarking_option_set)
+ pg_fatal("some of the specified options cannot be used in initialization (-i) mode");
+
+ if (partitions == 0 && partition_method != PART_NONE)
+ pg_fatal("--partition-method requires greater than zero --partitions");
+
+ /* set default method */
+ if (partitions > 0 && partition_method == PART_NONE)
+ partition_method = PART_RANGE;
+
+ if (initialize_steps == NULL)
+ initialize_steps = pg_strdup(DEFAULT_INIT_STEPS);
+
+ if (is_no_vacuum)
+ {
+ /* Remove any vacuum step in initialize_steps */
+ char *p;
+
+ while ((p = strchr(initialize_steps, 'v')) != NULL)
+ *p = ' ';
+ }
+
+ if (foreign_keys)
+ {
+ /* Add 'f' to end of initialize_steps, if not already there */
+ if (strchr(initialize_steps, 'f') == NULL)
+ {
+ initialize_steps = (char *)
+ pg_realloc(initialize_steps,
+ strlen(initialize_steps) + 2);
+ strcat(initialize_steps, "f");
+ }
+ }
+
+ runInitSteps(initialize_steps);
+ exit(0);
+ }
+ else
+ {
+ if (initialization_option_set)
+ pg_fatal("some of the specified options cannot be used in benchmarking mode");
+ }
+
+ if (nxacts > 0 && duration > 0)
+ pg_fatal("specify either a number of transactions (-t) or a duration (-T), not both");
+
+ /* Use DEFAULT_NXACTS if neither nxacts nor duration is specified. */
+ if (nxacts <= 0 && duration <= 0)
+ nxacts = DEFAULT_NXACTS;
+
+ /* --sampling-rate may be used only with -l */
+ if (sample_rate > 0.0 && !use_log)
+ pg_fatal("log sampling (--sampling-rate) is allowed only when logging transactions (-l)");
+
+ /* --sampling-rate may not be used with --aggregate-interval */
+ if (sample_rate > 0.0 && agg_interval > 0)
+ pg_fatal("log sampling (--sampling-rate) and aggregation (--aggregate-interval) cannot be used at the same time");
+
+ if (agg_interval > 0 && !use_log)
+ pg_fatal("log aggregation is allowed only when actually logging transactions");
+
+ if (!use_log && logfile_prefix)
+ pg_fatal("log file prefix (--log-prefix) is allowed only when logging transactions (-l)");
+
+ if (duration > 0 && agg_interval > duration)
+ pg_fatal("number of seconds for aggregation (%d) must not be higher than test duration (%d)", agg_interval, duration);
+
+ if (duration > 0 && agg_interval > 0 && duration % agg_interval != 0)
+ pg_fatal("duration (%d) must be a multiple of aggregation interval (%d)", duration, agg_interval);
+
+ if (progress_timestamp && progress == 0)
+ pg_fatal("--progress-timestamp is allowed only under --progress");
+
+ if (!max_tries)
+ {
+ if (!latency_limit && duration <= 0)
+ pg_fatal("an unlimited number of transaction tries can only be used with --latency-limit or a duration (-T)");
+ }
+
+ /*
+ * save main process id in the global variable because process id will be
+ * changed after fork.
+ */
+ main_pid = (int) getpid();
+
+ if (nclients > 1)
+ {
+ state = (CState *) pg_realloc(state, sizeof(CState) * nclients);
+ memset(state + 1, 0, sizeof(CState) * (nclients - 1));
+
+ /* copy any -D switch values to all clients */
+ for (i = 1; i < nclients; i++)
+ {
+ int j;
+
+ state[i].id = i;
+ for (j = 0; j < state[0].variables.nvars; j++)
+ {
+ Variable *var = &state[0].variables.vars[j];
+
+ if (var->value.type != PGBT_NO_VALUE)
+ {
+ if (!putVariableValue(&state[i].variables, "startup",
+ var->name, &var->value))
+ exit(1);
+ }
+ else
+ {
+ if (!putVariable(&state[i].variables, "startup",
+ var->name, var->svalue))
+ exit(1);
+ }
+ }
+ }
+ }
+
+ /* other CState initializations */
+ for (i = 0; i < nclients; i++)
+ {
+ state[i].cstack = conditional_stack_create();
+ initRandomState(&state[i].cs_func_rs);
+ }
+
+ /* opening connection... */
+ con = doConnect();
+ if (con == NULL)
+ pg_fatal("could not create connection for setup");
+
+ /* report pgbench and server versions */
+ printVersion(con);
+
+ pg_log_debug("pghost: %s pgport: %s nclients: %d %s: %d dbName: %s",
+ PQhost(con), PQport(con), nclients,
+ duration <= 0 ? "nxacts" : "duration",
+ duration <= 0 ? nxacts : duration, PQdb(con));
+
+ if (internal_script_used)
+ GetTableInfo(con, scale_given);
+
+ /*
+ * :scale variables normally get -s or database scale, but don't override
+ * an explicit -D switch
+ */
+ if (lookupVariable(&state[0].variables, "scale") == NULL)
+ {
+ for (i = 0; i < nclients; i++)
+ {
+ if (!putVariableInt(&state[i].variables, "startup", "scale", scale))
+ exit(1);
+ }
+ }
+
+ /*
+ * Define a :client_id variable that is unique per connection. But don't
+ * override an explicit -D switch.
+ */
+ if (lookupVariable(&state[0].variables, "client_id") == NULL)
+ {
+ for (i = 0; i < nclients; i++)
+ if (!putVariableInt(&state[i].variables, "startup", "client_id", i))
+ exit(1);
+ }
+
+ /* set default seed for hash functions */
+ if (lookupVariable(&state[0].variables, "default_seed") == NULL)
+ {
+ uint64 seed = pg_prng_uint64(&base_random_sequence);
+
+ for (i = 0; i < nclients; i++)
+ if (!putVariableInt(&state[i].variables, "startup", "default_seed",
+ (int64) seed))
+ exit(1);
+ }
+
+ /* set random seed unless overwritten */
+ if (lookupVariable(&state[0].variables, "random_seed") == NULL)
+ {
+ for (i = 0; i < nclients; i++)
+ if (!putVariableInt(&state[i].variables, "startup", "random_seed",
+ random_seed))
+ exit(1);
+ }
+
+ if (!is_no_vacuum)
+ {
+ fprintf(stderr, "starting vacuum...");
+ tryExecuteStatement(con, "vacuum pgbench_branches");
+ tryExecuteStatement(con, "vacuum pgbench_tellers");
+ tryExecuteStatement(con, "truncate pgbench_history");
+ fprintf(stderr, "end.\n");
+
+ if (do_vacuum_accounts)
+ {
+ fprintf(stderr, "starting vacuum pgbench_accounts...");
+ tryExecuteStatement(con, "vacuum analyze pgbench_accounts");
+ fprintf(stderr, "end.\n");
+ }
+ }
+ PQfinish(con);
+
+ /* set up thread data structures */
+ threads = (TState *) pg_malloc(sizeof(TState) * nthreads);
+ nclients_dealt = 0;
+
+ for (i = 0; i < nthreads; i++)
+ {
+ TState *thread = &threads[i];
+
+ thread->tid = i;
+ thread->state = &state[nclients_dealt];
+ thread->nstate =
+ (nclients - nclients_dealt + nthreads - i - 1) / (nthreads - i);
+ initRandomState(&thread->ts_choose_rs);
+ initRandomState(&thread->ts_throttle_rs);
+ initRandomState(&thread->ts_sample_rs);
+ thread->logfile = NULL; /* filled in later */
+ thread->latency_late = 0;
+ initStats(&thread->stats, 0);
+
+ nclients_dealt += thread->nstate;
+ }
+
+ /* all clients must be assigned to a thread */
+ Assert(nclients_dealt == nclients);
+
+ /* get start up time for the whole computation */
+ start_time = pg_time_now();
+
+ /* set alarm if duration is specified. */
+ if (duration > 0)
+ setalarm(duration);
+
+ errno = THREAD_BARRIER_INIT(&barrier, nthreads);
+ if (errno != 0)
+ pg_fatal("could not initialize barrier: %m");
+
+#ifdef ENABLE_THREAD_SAFETY
+ /* start all threads but thread 0 which is executed directly later */
+ for (i = 1; i < nthreads; i++)
+ {
+ TState *thread = &threads[i];
+
+ thread->create_time = pg_time_now();
+ errno = THREAD_CREATE(&thread->thread, threadRun, thread);
+
+ if (errno != 0)
+ pg_fatal("could not create thread: %m");
+ }
+#else
+ Assert(nthreads == 1);
+#endif /* ENABLE_THREAD_SAFETY */
+
+ /* compute when to stop */
+ threads[0].create_time = pg_time_now();
+ if (duration > 0)
+ end_time = threads[0].create_time + (int64) 1000000 * duration;
+
+ /* run thread 0 directly */
+ (void) threadRun(&threads[0]);
+
+ /* wait for other threads and accumulate results */
+ initStats(&stats, 0);
+ conn_total_duration = 0;
+
+ for (i = 0; i < nthreads; i++)
+ {
+ TState *thread = &threads[i];
+
+#ifdef ENABLE_THREAD_SAFETY
+ if (i > 0)
+ THREAD_JOIN(thread->thread);
+#endif /* ENABLE_THREAD_SAFETY */
+
+ for (int j = 0; j < thread->nstate; j++)
+ if (thread->state[j].state != CSTATE_FINISHED)
+ exit_code = 2;
+
+ /* aggregate thread level stats */
+ mergeSimpleStats(&stats.latency, &thread->stats.latency);
+ mergeSimpleStats(&stats.lag, &thread->stats.lag);
+ stats.cnt += thread->stats.cnt;
+ stats.skipped += thread->stats.skipped;
+ stats.retries += thread->stats.retries;
+ stats.retried += thread->stats.retried;
+ stats.serialization_failures += thread->stats.serialization_failures;
+ stats.deadlock_failures += thread->stats.deadlock_failures;
+ latency_late += thread->latency_late;
+ conn_total_duration += thread->conn_duration;
+
+ /* first recorded benchmarking start time */
+ if (bench_start == 0 || thread->bench_start < bench_start)
+ bench_start = thread->bench_start;
+ }
+
+ /*
+ * All connections should be already closed in threadRun(), so this
+ * disconnect_all() will be a no-op, but clean up the connections just to
+ * be sure. We don't need to measure the disconnection delays here.
+ */
+ disconnect_all(state, nclients);
+
+ /*
+ * Beware that performance of short benchmarks with many threads and
+ * possibly long transactions can be deceptive because threads do not
+ * start and finish at the exact same time. The total duration computed
+ * here encompasses all transactions so that tps shown is somehow slightly
+ * underestimated.
+ */
+ printResults(&stats, pg_time_now() - bench_start, conn_total_duration,
+ bench_start - start_time, latency_late);
+
+ THREAD_BARRIER_DESTROY(&barrier);
+
+ if (exit_code != 0)
+ pg_log_error("Run was aborted; the above results are incomplete.");
+
+ return exit_code;
+}
+
+static THREAD_FUNC_RETURN_TYPE THREAD_FUNC_CC
+threadRun(void *arg)
+{
+ TState *thread = (TState *) arg;
+ CState *state = thread->state;
+ pg_time_usec_t start;
+ int nstate = thread->nstate;
+ int remains = nstate; /* number of remaining clients */
+ socket_set *sockets = alloc_socket_set(nstate);
+ int64 thread_start,
+ last_report,
+ next_report;
+ StatsData last,
+ aggs;
+
+ /* open log file if requested */
+ if (use_log)
+ {
+ char logpath[MAXPGPATH];
+ char *prefix = logfile_prefix ? logfile_prefix : "pgbench_log";
+
+ if (thread->tid == 0)
+ snprintf(logpath, sizeof(logpath), "%s.%d", prefix, main_pid);
+ else
+ snprintf(logpath, sizeof(logpath), "%s.%d.%d", prefix, main_pid, thread->tid);
+
+ thread->logfile = fopen(logpath, "w");
+
+ if (thread->logfile == NULL)
+ pg_fatal("could not open logfile \"%s\": %m", logpath);
+ }
+
+ /* explicitly initialize the state machines */
+ for (int i = 0; i < nstate; i++)
+ state[i].state = CSTATE_CHOOSE_SCRIPT;
+
+ /* READY */
+ THREAD_BARRIER_WAIT(&barrier);
+
+ thread_start = pg_time_now();
+ thread->started_time = thread_start;
+ thread->conn_duration = 0;
+ last_report = thread_start;
+ next_report = last_report + (int64) 1000000 * progress;
+
+ /* STEADY */
+ if (!is_connect)
+ {
+ /* make connections to the database before starting */
+ for (int i = 0; i < nstate; i++)
+ {
+ if ((state[i].con = doConnect()) == NULL)
+ {
+ /* coldly abort on initial connection failure */
+ pg_fatal("could not create connection for client %d",
+ state[i].id);
+ }
+ }
+ }
+
+ /* GO */
+ THREAD_BARRIER_WAIT(&barrier);
+
+ start = pg_time_now();
+ thread->bench_start = start;
+ thread->throttle_trigger = start;
+
+ /*
+ * The log format currently has Unix epoch timestamps with whole numbers
+ * of seconds. Round the first aggregate's start time down to the nearest
+ * Unix epoch second (the very first aggregate might really have started a
+ * fraction of a second later, but later aggregates are measured from the
+ * whole number time that is actually logged).
+ */
+ initStats(&aggs, (start + epoch_shift) / 1000000 * 1000000);
+ last = aggs;
+
+ /* loop till all clients have terminated */
+ while (remains > 0)
+ {
+ int nsocks; /* number of sockets to be waited for */
+ pg_time_usec_t min_usec;
+ pg_time_usec_t now = 0; /* set this only if needed */
+
+ /*
+ * identify which client sockets should be checked for input, and
+ * compute the nearest time (if any) at which we need to wake up.
+ */
+ clear_socket_set(sockets);
+ nsocks = 0;
+ min_usec = PG_INT64_MAX;
+ for (int i = 0; i < nstate; i++)
+ {
+ CState *st = &state[i];
+
+ if (st->state == CSTATE_SLEEP || st->state == CSTATE_THROTTLE)
+ {
+ /* a nap from the script, or under throttling */
+ pg_time_usec_t this_usec;
+
+ /* get current time if needed */
+ pg_time_now_lazy(&now);
+
+ /* min_usec should be the minimum delay across all clients */
+ this_usec = (st->state == CSTATE_SLEEP ?
+ st->sleep_until : st->txn_scheduled) - now;
+ if (min_usec > this_usec)
+ min_usec = this_usec;
+ }
+ else if (st->state == CSTATE_WAIT_RESULT ||
+ st->state == CSTATE_WAIT_ROLLBACK_RESULT)
+ {
+ /*
+ * waiting for result from server - nothing to do unless the
+ * socket is readable
+ */
+ int sock = PQsocket(st->con);
+
+ if (sock < 0)
+ {
+ pg_log_error("invalid socket: %s", PQerrorMessage(st->con));
+ goto done;
+ }
+
+ add_socket_to_set(sockets, sock, nsocks++);
+ }
+ else if (st->state != CSTATE_ABORTED &&
+ st->state != CSTATE_FINISHED)
+ {
+ /*
+ * This client thread is ready to do something, so we don't
+ * want to wait. No need to examine additional clients.
+ */
+ min_usec = 0;
+ break;
+ }
+ }
+
+ /* also wake up to print the next progress report on time */
+ if (progress && min_usec > 0 && thread->tid == 0)
+ {
+ pg_time_now_lazy(&now);
+
+ if (now >= next_report)
+ min_usec = 0;
+ else if ((next_report - now) < min_usec)
+ min_usec = next_report - now;
+ }
+
+ /*
+ * If no clients are ready to execute actions, sleep until we receive
+ * data on some client socket or the timeout (if any) elapses.
+ */
+ if (min_usec > 0)
+ {
+ int rc = 0;
+
+ if (min_usec != PG_INT64_MAX)
+ {
+ if (nsocks > 0)
+ {
+ rc = wait_on_socket_set(sockets, min_usec);
+ }
+ else /* nothing active, simple sleep */
+ {
+ pg_usleep(min_usec);
+ }
+ }
+ else /* no explicit delay, wait without timeout */
+ {
+ rc = wait_on_socket_set(sockets, 0);
+ }
+
+ if (rc < 0)
+ {
+ if (errno == EINTR)
+ {
+ /* On EINTR, go back to top of loop */
+ continue;
+ }
+ /* must be something wrong */
+ pg_log_error("%s() failed: %m", SOCKET_WAIT_METHOD);
+ goto done;
+ }
+ }
+ else
+ {
+ /* min_usec <= 0, i.e. something needs to be executed now */
+
+ /* If we didn't wait, don't try to read any data */
+ clear_socket_set(sockets);
+ }
+
+ /* ok, advance the state machine of each connection */
+ nsocks = 0;
+ for (int i = 0; i < nstate; i++)
+ {
+ CState *st = &state[i];
+
+ if (st->state == CSTATE_WAIT_RESULT ||
+ st->state == CSTATE_WAIT_ROLLBACK_RESULT)
+ {
+ /* don't call advanceConnectionState unless data is available */
+ int sock = PQsocket(st->con);
+
+ if (sock < 0)
+ {
+ pg_log_error("invalid socket: %s", PQerrorMessage(st->con));
+ goto done;
+ }
+
+ if (!socket_has_input(sockets, sock, nsocks++))
+ continue;
+ }
+ else if (st->state == CSTATE_FINISHED ||
+ st->state == CSTATE_ABORTED)
+ {
+ /* this client is done, no need to consider it anymore */
+ continue;
+ }
+
+ advanceConnectionState(thread, st, &aggs);
+
+ /*
+ * If advanceConnectionState changed client to finished state,
+ * that's one fewer client that remains.
+ */
+ if (st->state == CSTATE_FINISHED || st->state == CSTATE_ABORTED)
+ remains--;
+ }
+
+ /* progress report is made by thread 0 for all threads */
+ if (progress && thread->tid == 0)
+ {
+ pg_time_usec_t now = pg_time_now();
+
+ if (now >= next_report)
+ {
+ /*
+ * Horrible hack: this relies on the thread pointer we are
+ * passed to be equivalent to threads[0], that is the first
+ * entry of the threads array. That is why this MUST be done
+ * by thread 0 and not any other.
+ */
+ printProgressReport(thread, thread_start, now,
+ &last, &last_report);
+
+ /*
+ * Ensure that the next report is in the future, in case
+ * pgbench/postgres got stuck somewhere.
+ */
+ do
+ {
+ next_report += (int64) 1000000 * progress;
+ } while (now >= next_report);
+ }
+ }
+ }
+
+done:
+ disconnect_all(state, nstate);
+
+ if (thread->logfile)
+ {
+ if (agg_interval > 0)
+ {
+ /* log aggregated but not yet reported transactions */
+ doLog(thread, state, &aggs, false, 0, 0);
+ }
+ fclose(thread->logfile);
+ thread->logfile = NULL;
+ }
+ free_socket_set(sockets);
+ THREAD_FUNC_RETURN;
+}
+
+static void
+finishCon(CState *st)
+{
+ if (st->con != NULL)
+ {
+ PQfinish(st->con);
+ st->con = NULL;
+ }
+}
+
+/*
+ * Support for duration option: set timer_exceeded after so many seconds.
+ */
+
+#ifndef WIN32
+
+static void
+handle_sig_alarm(SIGNAL_ARGS)
+{
+ timer_exceeded = true;
+}
+
+static void
+setalarm(int seconds)
+{
+ pqsignal(SIGALRM, handle_sig_alarm);
+ alarm(seconds);
+}
+
+#else /* WIN32 */
+
+static VOID CALLBACK
+win32_timer_callback(PVOID lpParameter, BOOLEAN TimerOrWaitFired)
+{
+ timer_exceeded = true;
+}
+
+static void
+setalarm(int seconds)
+{
+ HANDLE queue;
+ HANDLE timer;
+
+ /* This function will be called at most once, so we can cheat a bit. */
+ queue = CreateTimerQueue();
+ if (seconds > ((DWORD) -1) / 1000 ||
+ !CreateTimerQueueTimer(&timer, queue,
+ win32_timer_callback, NULL, seconds * 1000, 0,
+ WT_EXECUTEINTIMERTHREAD | WT_EXECUTEONLYONCE))
+ pg_fatal("failed to set timer");
+}
+
+#endif /* WIN32 */
+
+
+/*
+ * These functions provide an abstraction layer that hides the syscall
+ * we use to wait for input on a set of sockets.
+ *
+ * Currently there are two implementations, based on ppoll(2) and select(2).
+ * ppoll() is preferred where available due to its typically higher ceiling
+ * on the number of usable sockets. We do not use the more-widely-available
+ * poll(2) because it only offers millisecond timeout resolution, which could
+ * be problematic with high --rate settings.
+ *
+ * Function APIs:
+ *
+ * alloc_socket_set: allocate an empty socket set with room for up to
+ * "count" sockets.
+ *
+ * free_socket_set: deallocate a socket set.
+ *
+ * clear_socket_set: reset a socket set to empty.
+ *
+ * add_socket_to_set: add socket with indicated FD to slot "idx" in the
+ * socket set. Slots must be filled in order, starting with 0.
+ *
+ * wait_on_socket_set: wait for input on any socket in set, or for timeout
+ * to expire. timeout is measured in microseconds; 0 means wait forever.
+ * Returns result code of underlying syscall (>=0 if OK, else see errno).
+ *
+ * socket_has_input: after waiting, call this to see if given socket has
+ * input. fd and idx parameters should match some previous call to
+ * add_socket_to_set.
+ *
+ * Note that wait_on_socket_set destructively modifies the state of the
+ * socket set. After checking for input, caller must apply clear_socket_set
+ * and add_socket_to_set again before waiting again.
+ */
+
+#ifdef POLL_USING_PPOLL
+
+static socket_set *
+alloc_socket_set(int count)
+{
+ socket_set *sa;
+
+ sa = (socket_set *) pg_malloc0(offsetof(socket_set, pollfds) +
+ sizeof(struct pollfd) * count);
+ sa->maxfds = count;
+ sa->curfds = 0;
+ return sa;
+}
+
+static void
+free_socket_set(socket_set *sa)
+{
+ pg_free(sa);
+}
+
+static void
+clear_socket_set(socket_set *sa)
+{
+ sa->curfds = 0;
+}
+
+static void
+add_socket_to_set(socket_set *sa, int fd, int idx)
+{
+ Assert(idx < sa->maxfds && idx == sa->curfds);
+ sa->pollfds[idx].fd = fd;
+ sa->pollfds[idx].events = POLLIN;
+ sa->pollfds[idx].revents = 0;
+ sa->curfds++;
+}
+
+static int
+wait_on_socket_set(socket_set *sa, int64 usecs)
+{
+ if (usecs > 0)
+ {
+ struct timespec timeout;
+
+ timeout.tv_sec = usecs / 1000000;
+ timeout.tv_nsec = (usecs % 1000000) * 1000;
+ return ppoll(sa->pollfds, sa->curfds, &timeout, NULL);
+ }
+ else
+ {
+ return ppoll(sa->pollfds, sa->curfds, NULL, NULL);
+ }
+}
+
+static bool
+socket_has_input(socket_set *sa, int fd, int idx)
+{
+ /*
+ * In some cases, threadRun will apply clear_socket_set and then try to
+ * apply socket_has_input anyway with arguments that it used before that,
+ * or might've used before that except that it exited its setup loop
+ * early. Hence, if the socket set is empty, silently return false
+ * regardless of the parameters. If it's not empty, we can Assert that
+ * the parameters match a previous call.
+ */
+ if (sa->curfds == 0)
+ return false;
+
+ Assert(idx < sa->curfds && sa->pollfds[idx].fd == fd);
+ return (sa->pollfds[idx].revents & POLLIN) != 0;
+}
+
+#endif /* POLL_USING_PPOLL */
+
+#ifdef POLL_USING_SELECT
+
+static socket_set *
+alloc_socket_set(int count)
+{
+ return (socket_set *) pg_malloc0(sizeof(socket_set));
+}
+
+static void
+free_socket_set(socket_set *sa)
+{
+ pg_free(sa);
+}
+
+static void
+clear_socket_set(socket_set *sa)
+{
+ FD_ZERO(&sa->fds);
+ sa->maxfd = -1;
+}
+
+static void
+add_socket_to_set(socket_set *sa, int fd, int idx)
+{
+ /* See connect_slot() for background on this code. */
+#ifdef WIN32
+ if (sa->fds.fd_count + 1 >= FD_SETSIZE)
+ {
+ pg_log_error("too many concurrent database clients for this platform: %d",
+ sa->fds.fd_count + 1);
+ exit(1);
+ }
+#else
+ if (fd < 0 || fd >= FD_SETSIZE)
+ {
+ pg_log_error("socket file descriptor out of range for select(): %d",
+ fd);
+ pg_log_error_hint("Try fewer concurrent database clients.");
+ exit(1);
+ }
+#endif
+ FD_SET(fd, &sa->fds);
+ if (fd > sa->maxfd)
+ sa->maxfd = fd;
+}
+
+static int
+wait_on_socket_set(socket_set *sa, int64 usecs)
+{
+ if (usecs > 0)
+ {
+ struct timeval timeout;
+
+ timeout.tv_sec = usecs / 1000000;
+ timeout.tv_usec = usecs % 1000000;
+ return select(sa->maxfd + 1, &sa->fds, NULL, NULL, &timeout);
+ }
+ else
+ {
+ return select(sa->maxfd + 1, &sa->fds, NULL, NULL, NULL);
+ }
+}
+
+static bool
+socket_has_input(socket_set *sa, int fd, int idx)
+{
+ return (FD_ISSET(fd, &sa->fds) != 0);
+}
+
+#endif /* POLL_USING_SELECT */
diff --git a/src/bin/pgbench/pgbench.h b/src/bin/pgbench/pgbench.h
new file mode 100644
index 0000000..abbdc44
--- /dev/null
+++ b/src/bin/pgbench/pgbench.h
@@ -0,0 +1,167 @@
+/*-------------------------------------------------------------------------
+ *
+ * pgbench.h
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef PGBENCH_H
+#define PGBENCH_H
+
+#include "fe_utils/psqlscan.h"
+
+/*
+ * This file is included outside exprscan.l, in places where we can't see
+ * flex's definition of typedef yyscan_t. Fortunately, it's documented as
+ * being "void *", so we can use a macro to keep the function declarations
+ * here looking like the definitions in exprscan.l. exprparse.y and
+ * pgbench.c also use this to be able to declare things as "yyscan_t".
+ */
+#define yyscan_t void *
+
+/*
+ * Likewise, we can't see exprparse.y's definition of union YYSTYPE here,
+ * but for now there's no need to know what the union contents are.
+ */
+union YYSTYPE;
+
+/*
+ * Variable types used in parser.
+ */
+typedef enum
+{
+ PGBT_NO_VALUE,
+ PGBT_NULL,
+ PGBT_INT,
+ PGBT_DOUBLE,
+ PGBT_BOOLEAN
+ /* add other types here */
+} PgBenchValueType;
+
+typedef struct
+{
+ PgBenchValueType type;
+ union
+ {
+ int64 ival;
+ double dval;
+ bool bval;
+ /* add other types here */
+ } u;
+} PgBenchValue;
+
+/* Types of expression nodes */
+typedef enum PgBenchExprType
+{
+ ENODE_CONSTANT,
+ ENODE_VARIABLE,
+ ENODE_FUNCTION
+} PgBenchExprType;
+
+/* List of operators and callable functions */
+typedef enum PgBenchFunction
+{
+ PGBENCH_ADD,
+ PGBENCH_SUB,
+ PGBENCH_MUL,
+ PGBENCH_DIV,
+ PGBENCH_MOD,
+ PGBENCH_DEBUG,
+ PGBENCH_ABS,
+ PGBENCH_LEAST,
+ PGBENCH_GREATEST,
+ PGBENCH_INT,
+ PGBENCH_DOUBLE,
+ PGBENCH_PI,
+ PGBENCH_SQRT,
+ PGBENCH_LN,
+ PGBENCH_EXP,
+ PGBENCH_RANDOM,
+ PGBENCH_RANDOM_GAUSSIAN,
+ PGBENCH_RANDOM_EXPONENTIAL,
+ PGBENCH_RANDOM_ZIPFIAN,
+ PGBENCH_POW,
+ PGBENCH_AND,
+ PGBENCH_OR,
+ PGBENCH_NOT,
+ PGBENCH_BITAND,
+ PGBENCH_BITOR,
+ PGBENCH_BITXOR,
+ PGBENCH_LSHIFT,
+ PGBENCH_RSHIFT,
+ PGBENCH_EQ,
+ PGBENCH_NE,
+ PGBENCH_LE,
+ PGBENCH_LT,
+ PGBENCH_IS,
+ PGBENCH_CASE,
+ PGBENCH_HASH_FNV1A,
+ PGBENCH_HASH_MURMUR2,
+ PGBENCH_PERMUTE
+} PgBenchFunction;
+
+typedef struct PgBenchExpr PgBenchExpr;
+typedef struct PgBenchExprLink PgBenchExprLink;
+typedef struct PgBenchExprList PgBenchExprList;
+
+struct PgBenchExpr
+{
+ PgBenchExprType etype;
+ union
+ {
+ PgBenchValue constant;
+ struct
+ {
+ char *varname;
+ } variable;
+ struct
+ {
+ PgBenchFunction function;
+ PgBenchExprLink *args;
+ } function;
+ } u;
+};
+
+/* List of expression nodes */
+struct PgBenchExprLink
+{
+ PgBenchExpr *expr;
+ PgBenchExprLink *next;
+};
+
+struct PgBenchExprList
+{
+ PgBenchExprLink *head;
+ PgBenchExprLink *tail;
+};
+
+extern PgBenchExpr *expr_parse_result;
+
+extern int expr_yyparse(yyscan_t yyscanner);
+extern int expr_yylex(union YYSTYPE *lvalp, yyscan_t yyscanner);
+extern void expr_yyerror(yyscan_t yyscanner, const char *str) pg_attribute_noreturn();
+extern void expr_yyerror_more(yyscan_t yyscanner, const char *str,
+ const char *more) pg_attribute_noreturn();
+extern bool expr_lex_one_word(PsqlScanState state, PQExpBuffer word_buf,
+ int *offset);
+extern yyscan_t expr_scanner_init(PsqlScanState state,
+ const char *source, int lineno, int start_offset,
+ const char *command);
+extern void expr_scanner_finish(yyscan_t yyscanner);
+extern int expr_scanner_offset(PsqlScanState state);
+extern char *expr_scanner_get_substring(PsqlScanState state,
+ int start_offset, int end_offset,
+ bool chomp);
+extern int expr_scanner_get_lineno(PsqlScanState state, int offset);
+
+extern void syntax_error(const char *source, int lineno, const char *line,
+ const char *cmd, const char *msg,
+ const char *more, int col) pg_attribute_noreturn();
+
+extern bool strtoint64(const char *str, bool errorOK, int64 *pi);
+extern bool strtodouble(const char *str, bool errorOK, double *pd);
+
+#endif /* PGBENCH_H */
diff --git a/src/bin/pgbench/t/001_pgbench_with_server.pl b/src/bin/pgbench/t/001_pgbench_with_server.pl
new file mode 100644
index 0000000..027c513
--- /dev/null
+++ b/src/bin/pgbench/t/001_pgbench_with_server.pl
@@ -0,0 +1,1447 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+# start a pgbench specific server
+my $node = PostgreSQL::Test::Cluster->new('main');
+# Set to untranslated messages, to be able to compare program output with
+# expected strings.
+$node->init(extra => [ '--locale', 'C' ]);
+$node->start;
+
+# tablespace for testing, because partitioned tables cannot use pg_default
+# explicitly and we want to test that table creation with tablespace works
+# for partitioned tables.
+my $ts = $node->basedir . '/regress_pgbench_tap_1_ts_dir';
+mkdir $ts or die "cannot create directory $ts";
+
+# the next commands will issue a syntax error if the path contains a "'"
+$node->safe_psql('postgres',
+ "CREATE TABLESPACE regress_pgbench_tap_1_ts LOCATION '$ts';");
+
+# Test concurrent OID generation via pg_enum_oid_index. This indirectly
+# exercises LWLock and spinlock concurrency.
+my $labels = join ',', map { "'l$_'" } 1 .. 1000;
+$node->pgbench(
+ '--no-vacuum --client=5 --protocol=prepared --transactions=25',
+ 0,
+ [qr{processed: 125/125}],
+ [qr{^$}],
+ 'concurrent OID generation',
+ {
+ '001_pgbench_concurrent_insert' =>
+ "CREATE TYPE pg_temp.e AS ENUM ($labels); DROP TYPE pg_temp.e;"
+ });
+
+# Trigger various connection errors
+$node->pgbench(
+ 'no-such-database',
+ 1,
+ [qr{^$}],
+ [
+ qr{connection to server .* failed},
+ qr{FATAL: database "no-such-database" does not exist}
+ ],
+ 'no such database');
+
+$node->pgbench(
+ '-S -t 1', 1, [],
+ [qr{Perhaps you need to do initialization}],
+ 'run without init');
+
+# Initialize pgbench tables scale 1
+$node->pgbench(
+ '-i', 0,
+ [qr{^$}],
+ [
+ qr{creating tables},
+ qr{vacuuming},
+ qr{creating primary keys},
+ qr{done in \d+\.\d\d s }
+ ],
+ 'pgbench scale 1 initialization',);
+
+# Again, with all possible options
+$node->pgbench(
+ '--initialize --init-steps=dtpvg --scale=1 --unlogged-tables --fillfactor=98 --foreign-keys --quiet --tablespace=regress_pgbench_tap_1_ts --index-tablespace=regress_pgbench_tap_1_ts --partitions=2 --partition-method=hash',
+ 0,
+ [qr{^$}i],
+ [
+ qr{dropping old tables},
+ qr{creating tables},
+ qr{creating 2 partitions},
+ qr{vacuuming},
+ qr{creating primary keys},
+ qr{creating foreign keys},
+ qr{(?!vacuuming)}, # no vacuum
+ qr{done in \d+\.\d\d s }
+ ],
+ 'pgbench scale 1 initialization');
+
+# Test interaction of --init-steps with legacy step-selection options
+$node->pgbench(
+ '--initialize --init-steps=dtpvGvv --no-vacuum --foreign-keys --unlogged-tables --partitions=3',
+ 0,
+ [qr{^$}],
+ [
+ qr{dropping old tables},
+ qr{creating tables},
+ qr{creating 3 partitions},
+ qr{creating primary keys},
+ qr{generating data \(server-side\)},
+ qr{creating foreign keys},
+ qr{(?!vacuuming)}, # no vacuum
+ qr{done in \d+\.\d\d s }
+ ],
+ 'pgbench --init-steps');
+
+# Run all builtin scripts, for a few transactions each
+$node->pgbench(
+ '--transactions=5 -Dfoo=bla --client=2 --protocol=simple --builtin=t'
+ . ' --connect -n -v -n',
+ 0,
+ [
+ qr{builtin: TPC-B},
+ qr{clients: 2\b},
+ qr{processed: 10/10},
+ qr{mode: simple},
+ qr{maximum number of tries: 1}
+ ],
+ [qr{^$}],
+ 'pgbench tpcb-like');
+
+$node->pgbench(
+ '--transactions=20 --client=5 -M extended --builtin=si -C --no-vacuum -s 1',
+ 0,
+ [
+ qr{builtin: simple update},
+ qr{clients: 5\b},
+ qr{threads: 1\b},
+ qr{processed: 100/100},
+ qr{mode: extended}
+ ],
+ [qr{scale option ignored}],
+ 'pgbench simple update');
+
+$node->pgbench(
+ '-t 100 -c 7 -M prepared -b se --debug',
+ 0,
+ [
+ qr{builtin: select only},
+ qr{clients: 7\b},
+ qr{threads: 1\b},
+ qr{processed: 700/700},
+ qr{mode: prepared}
+ ],
+ [
+ qr{vacuum}, qr{client 0}, qr{client 1}, qr{sending},
+ qr{receiving}, qr{executing}
+ ],
+ 'pgbench select only');
+
+# check if threads are supported
+my $nthreads = 2;
+
+{
+ my ($stderr);
+ run_log([ 'pgbench', '-j', '2', '--bad-option' ], '2>', \$stderr);
+ $nthreads = 1 if $stderr =~ m/threads are not supported on this platform/;
+}
+
+# run custom scripts
+$node->pgbench(
+ "-t 100 -c 1 -j $nthreads -M prepared -n",
+ 0,
+ [
+ qr{type: multiple scripts},
+ qr{mode: prepared},
+ qr{script 1: .*/001_pgbench_custom_script_1},
+ qr{weight: 2},
+ qr{script 2: .*/001_pgbench_custom_script_2},
+ qr{weight: 1},
+ qr{processed: 100/100}
+ ],
+ [qr{^$}],
+ 'pgbench custom scripts',
+ {
+ '001_pgbench_custom_script_1@1' => q{-- select only
+\set aid random(1, :scale * 100000)
+SELECT abalance::INTEGER AS balance
+ FROM pgbench_accounts
+ WHERE aid=:aid;
+},
+ '001_pgbench_custom_script_2@2' => q{-- special variables
+BEGIN;
+\set foo 1
+-- cast are needed for typing under -M prepared
+SELECT :foo::INT + :scale::INT * :client_id::INT AS bla;
+COMMIT;
+}
+ });
+
+$node->pgbench(
+ '-n -t 10 -c 1 -M simple',
+ 0,
+ [
+ qr{type: .*/001_pgbench_custom_script_3},
+ qr{processed: 10/10},
+ qr{mode: simple}
+ ],
+ [qr{^$}],
+ 'pgbench custom script',
+ {
+ '001_pgbench_custom_script_3' => q{-- select only variant
+\set aid random(1, :scale * 100000)
+BEGIN;
+SELECT abalance::INTEGER AS balance
+ FROM pgbench_accounts
+ WHERE aid=:aid;
+COMMIT;
+}
+ });
+
+$node->pgbench(
+ '-n -t 10 -c 2 -M extended',
+ 0,
+ [
+ qr{type: .*/001_pgbench_custom_script_4},
+ qr{processed: 20/20},
+ qr{mode: extended}
+ ],
+ [qr{^$}],
+ 'pgbench custom script',
+ {
+ '001_pgbench_custom_script_4' => q{-- select only variant
+\set aid random(1, :scale * 100000)
+BEGIN;
+SELECT abalance::INTEGER AS balance
+ FROM pgbench_accounts
+ WHERE aid=:aid;
+COMMIT;
+}
+ });
+
+# Verify server logging of query parameters.
+# (This doesn't really belong here, but pgbench is a convenient way
+# to issue commands using extended query mode with parameters.)
+
+# 1. Logging neither with errors nor with statements
+$node->append_conf('postgresql.conf',
+ "log_min_duration_statement = 0\n"
+ . "log_parameter_max_length = 0\n"
+ . "log_parameter_max_length_on_error = 0");
+$node->reload;
+$node->pgbench(
+ '-n -t1 -c1 -M prepared',
+ 2,
+ [],
+ [
+ qr{ERROR: invalid input syntax for type json},
+ qr{(?!unnamed portal with parameters)}
+ ],
+ 'server parameter logging',
+ {
+ '001_param_1' => q[select '{ invalid ' as value \gset
+select $$'Valame Dios!' dijo Sancho; 'no le dije yo a vuestra merced que mirase bien lo que hacia?'$$ as long \gset
+select column1::jsonb from (values (:value), (:long)) as q;
+]
+ });
+my $log = PostgreSQL::Test::Utils::slurp_file($node->logfile);
+unlike(
+ $log,
+ qr[DETAIL: parameters: \$1 = '\{ invalid ',],
+ "no parameters logged");
+$log = undef;
+
+# 2. Logging truncated parameters on error, full with statements
+$node->append_conf('postgresql.conf',
+ "log_parameter_max_length = -1\n"
+ . "log_parameter_max_length_on_error = 64");
+$node->reload;
+$node->pgbench(
+ '-n -t1 -c1 -M prepared',
+ 2,
+ [],
+ [
+ qr{ERROR: division by zero},
+ qr{CONTEXT: unnamed portal with parameters: \$1 = '1', \$2 = NULL}
+ ],
+ 'server parameter logging',
+ {
+ '001_param_2' => q{select '1' as one \gset
+SELECT 1 / (random() / 2)::int, :one::int, :two::int;
+}
+ });
+$node->pgbench(
+ '-n -t1 -c1 -M prepared',
+ 2,
+ [],
+ [
+ qr{ERROR: invalid input syntax for type json},
+ qr[CONTEXT: JSON data, line 1: \{ invalid\.\.\.[\r\n]+unnamed portal with parameters: \$1 = '\{ invalid ', \$2 = '''Valame Dios!'' dijo Sancho; ''no le dije yo a vuestra merced que \.\.\.']m
+ ],
+ 'server parameter logging',
+ {
+ '001_param_3' => q[select '{ invalid ' as value \gset
+select $$'Valame Dios!' dijo Sancho; 'no le dije yo a vuestra merced que mirase bien lo que hacia?'$$ as long \gset
+select column1::jsonb from (values (:value), (:long)) as q;
+]
+ });
+$log = PostgreSQL::Test::Utils::slurp_file($node->logfile);
+like(
+ $log,
+ qr[DETAIL: parameters: \$1 = '\{ invalid ', \$2 = '''Valame Dios!'' dijo Sancho; ''no le dije yo a vuestra merced que mirase bien lo que hacia\?'''],
+ "parameter report does not truncate");
+$log = undef;
+
+# 3. Logging full parameters on error, truncated with statements
+$node->append_conf('postgresql.conf',
+ "log_min_duration_statement = -1\n"
+ . "log_parameter_max_length = 7\n"
+ . "log_parameter_max_length_on_error = -1");
+$node->reload;
+$node->pgbench(
+ '-n -t1 -c1 -M prepared',
+ 2,
+ [],
+ [
+ qr{ERROR: division by zero},
+ qr{CONTEXT: unnamed portal with parameters: \$1 = '1', \$2 = NULL}
+ ],
+ 'server parameter logging',
+ {
+ '001_param_4' => q{select '1' as one \gset
+SELECT 1 / (random() / 2)::int, :one::int, :two::int;
+}
+ });
+
+$node->append_conf('postgresql.conf', "log_min_duration_statement = 0");
+$node->reload;
+$node->pgbench(
+ '-n -t1 -c1 -M prepared',
+ 2,
+ [],
+ [
+ qr{ERROR: invalid input syntax for type json},
+ qr[CONTEXT: JSON data, line 1: \{ invalid\.\.\.[\r\n]+unnamed portal with parameters: \$1 = '\{ invalid ', \$2 = '''Valame Dios!'' dijo Sancho; ''no le dije yo a vuestra merced que mirase bien lo que hacia\?']m
+ ],
+ 'server parameter logging',
+ {
+ '001_param_5' => q[select '{ invalid ' as value \gset
+select $$'Valame Dios!' dijo Sancho; 'no le dije yo a vuestra merced que mirase bien lo que hacia?'$$ as long \gset
+select column1::jsonb from (values (:value), (:long)) as q;
+]
+ });
+$log = PostgreSQL::Test::Utils::slurp_file($node->logfile);
+like(
+ $log,
+ qr[DETAIL: parameters: \$1 = '\{ inval\.\.\.', \$2 = '''Valame\.\.\.'],
+ "parameter report truncates");
+$log = undef;
+
+# Check that bad parameters are reported during typinput phase of BIND
+$node->pgbench(
+ '-n -t1 -c1 -M prepared',
+ 2,
+ [],
+ [
+ qr{ERROR: invalid input syntax for type smallint: "1a"},
+ qr{CONTEXT: unnamed portal parameter \$2 = '1a'}
+ ],
+ 'server parameter logging',
+ {
+ '001_param_6' => q{select 42 as value1, '1a' as value2 \gset
+select :value1::smallint, :value2::smallint;
+}
+ });
+
+# Restore default logging config
+$node->append_conf('postgresql.conf',
+ "log_min_duration_statement = -1\n"
+ . "log_parameter_max_length_on_error = 0\n"
+ . "log_parameter_max_length = -1");
+$node->reload;
+
+# test expressions
+$node->pgbench(
+ '--random-seed=5432 -t 1 -Dfoo=-10.1 -Dbla=false -Di=+3 -Dn=null -Dt=t -Df=of -Dd=1.0',
+ 0,
+ [ qr{type: .*/001_pgbench_expressions}, qr{processed: 1/1} ],
+ [
+ qr{setting random seed to 5432\b},
+
+ # After explicit seeding, the four random checks (1-3,20) are
+ # deterministic; but see also magic values in checks 111,113.
+ qr{command=1.: int 17\b}, # uniform random
+ qr{command=2.: int 104\b}, # exponential random
+ qr{command=3.: int 1498\b}, # gaussian random
+ qr{command=4.: int 4\b},
+ qr{command=5.: int 5\b},
+ qr{command=6.: int 6\b},
+ qr{command=7.: int 7\b},
+ qr{command=8.: int 8\b},
+ qr{command=9.: int 9\b},
+ qr{command=10.: int 10\b},
+ qr{command=11.: int 11\b},
+ qr{command=12.: int 12\b},
+ qr{command=15.: double 15\b},
+ qr{command=16.: double 16\b},
+ qr{command=17.: double 17\b},
+ qr{command=20.: int 3\b}, # zipfian random
+ qr{command=21.: double -27\b},
+ qr{command=22.: double 1024\b},
+ qr{command=23.: double 1\b},
+ qr{command=24.: double 1\b},
+ qr{command=25.: double -0.125\b},
+ qr{command=26.: double -0.125\b},
+ qr{command=27.: double -0.00032\b},
+ qr{command=28.: double 8.50705917302346e\+0?37\b},
+ qr{command=29.: double 1e\+0?30\b},
+ qr{command=30.: boolean false\b},
+ qr{command=31.: boolean true\b},
+ qr{command=32.: int 32\b},
+ qr{command=33.: int 33\b},
+ qr{command=34.: double 34\b},
+ qr{command=35.: int 35\b},
+ qr{command=36.: int 36\b},
+ qr{command=37.: double 37\b},
+ qr{command=38.: int 38\b},
+ qr{command=39.: int 39\b},
+ qr{command=40.: boolean true\b},
+ qr{command=41.: null\b},
+ qr{command=42.: null\b},
+ qr{command=43.: boolean true\b},
+ qr{command=44.: boolean true\b},
+ qr{command=45.: boolean true\b},
+ qr{command=46.: int 46\b},
+ qr{command=47.: boolean true\b},
+ qr{command=48.: boolean true\b},
+ qr{command=49.: int -5817877081768721676\b},
+ qr{command=50.: boolean true\b},
+ qr{command=51.: int -7793829335365542153\b},
+ qr{command=52.: int -?\d+\b},
+ qr{command=53.: boolean true\b},
+ qr{command=65.: int 65\b},
+ qr{command=74.: int 74\b},
+ qr{command=83.: int 83\b},
+ qr{command=86.: int 86\b},
+ qr{command=93.: int 93\b},
+ qr{command=95.: int 0\b},
+ qr{command=96.: int 1\b}, # :scale
+ qr{command=97.: int 0\b}, # :client_id
+ qr{command=98.: int 5432\b}, # :random_seed
+ qr{command=99.: int -9223372036854775808\b}, # min int
+ qr{command=100.: int 9223372036854775807\b}, # max int
+ # pseudorandom permutation tests
+ qr{command=101.: boolean true\b},
+ qr{command=102.: boolean true\b},
+ qr{command=103.: boolean true\b},
+ qr{command=104.: boolean true\b},
+ qr{command=105.: boolean true\b},
+ qr{command=109.: boolean true\b},
+ qr{command=110.: boolean true\b},
+ qr{command=111.: boolean true\b},
+ qr{command=113.: boolean true\b},
+ ],
+ 'pgbench expressions',
+ {
+ '001_pgbench_expressions' => q{-- integer functions
+\set i1 debug(random(10, 19))
+\set i2 debug(random_exponential(100, 199, 10.0))
+\set i3 debug(random_gaussian(1000, 1999, 10.0))
+\set i4 debug(abs(-4))
+\set i5 debug(greatest(5, 4, 3, 2))
+\set i6 debug(11 + least(-5, -4, -3, -2))
+\set i7 debug(int(7.3))
+-- integer arithmetic and bit-wise operators
+\set i8 debug(17 / (4|1) + ( 4 + (7 >> 2)))
+\set i9 debug(- (3 * 4 - (-(~ 1) + -(~ 0))) / -1 + 3 % -1)
+\set ia debug(10 + (0 + 0 * 0 - 0 / 1))
+\set ib debug(:ia + :scale)
+\set ic debug(64 % (((2 + 1 * 2 + (1 # 2) | 4 * (2 & 11)) - (1 << 2)) + 2))
+-- double functions and operators
+\set d1 debug(sqrt(+1.5 * 2.0) * abs(-0.8E1))
+\set d2 debug(double(1 + 1) * (-75.0 / :foo))
+\set pi debug(pi() * 4.9)
+\set d4 debug(greatest(4, 2, -1.17) * 4.0 * Ln(Exp(1.0)))
+\set d5 debug(least(-5.18, .0E0, 1.0/0) * -3.3)
+-- reset variables
+\set i1 0
+\set d1 false
+-- yet another integer function
+\set id debug(random_zipfian(1, 9, 1.3))
+--- pow and power
+\set poweri debug(pow(-3,3))
+\set powerd debug(pow(2.0,10))
+\set poweriz debug(pow(0,0))
+\set powerdz debug(pow(0.0,0.0))
+\set powernegi debug(pow(-2,-3))
+\set powernegd debug(pow(-2.0,-3.0))
+\set powernegd2 debug(power(-5.0,-5.0))
+\set powerov debug(pow(9223372036854775807, 2))
+\set powerov2 debug(pow(10,30))
+-- comparisons and logical operations
+\set c0 debug(1.0 = 0.0 and 1.0 != 0.0)
+\set c1 debug(0 = 1 Or 1.0 = 1)
+\set c4 debug(case when 0 < 1 then 32 else 0 end)
+\set c5 debug(case when true then 33 else 0 end)
+\set c6 debug(case when false THEN -1 when 1 = 1 then 13 + 19 + 2.0 end )
+\set c7 debug(case when (1 > 0) and (1 >= 0) and (0 < 1) and (0 <= 1) and (0 != 1) and (0 = 0) and (0 <> 1) then 35 else 0 end)
+\set c8 debug(CASE \
+ WHEN (1.0 > 0.0) AND (1.0 >= 0.0) AND (0.0 < 1.0) AND (0.0 <= 1.0) AND \
+ (0.0 != 1.0) AND (0.0 = 0.0) AND (0.0 <> 1.0) AND (0.0 = 0.0) \
+ THEN 36 \
+ ELSE 0 \
+ END)
+\set c9 debug(CASE WHEN NOT FALSE THEN 3 * 12.3333334 END)
+\set ca debug(case when false then 0 when 1-1 <> 0 then 1 else 38 end)
+\set cb debug(10 + mod(13 * 7 + 12, 13) - mod(-19 * 11 - 17, 19))
+\set cc debug(NOT (0 > 1) AND (1 <= 1) AND NOT (0 >= 1) AND (0 < 1) AND \
+ NOT (false and true) AND (false OR TRUE) AND (NOT :f) AND (NOT FALSE) AND \
+ NOT (NOT TRUE))
+-- NULL value and associated operators
+\set n0 debug(NULL + NULL * exp(NULL))
+\set n1 debug(:n0)
+\set n2 debug(NOT (:n0 IS NOT NULL OR :d1 IS NULL))
+\set n3 debug(:n0 IS NULL AND :d1 IS NOT NULL AND :d1 NOTNULL)
+\set n4 debug(:n0 ISNULL AND NOT :n0 IS TRUE AND :n0 IS NOT FALSE)
+\set n5 debug(CASE WHEN :n IS NULL THEN 46 ELSE NULL END)
+-- use a variables of all types
+\set n6 debug(:n IS NULL AND NOT :f AND :t)
+-- conditional truth
+\set cs debug(CASE WHEN 1 THEN TRUE END AND CASE WHEN 1.0 THEN TRUE END AND CASE WHEN :n THEN NULL ELSE TRUE END)
+-- hash functions
+\set h0 debug(hash(10, 5432))
+\set h1 debug(:h0 = hash_murmur2(10, 5432))
+\set h3 debug(hash_fnv1a(10, 5432))
+\set h4 debug(hash(10))
+\set h5 debug(hash(10) = hash(10, :default_seed))
+-- lazy evaluation
+\set zy 0
+\set yz debug(case when :zy = 0 then -1 else (1 / :zy) end)
+\set yz debug(case when :zy = 0 or (1 / :zy) < 0 then -1 else (1 / :zy) end)
+\set yz debug(case when :zy > 0 and (1 / :zy) < 0 then (1 / :zy) else 1 end)
+-- substitute variables of all possible types
+\set v0 NULL
+\set v1 TRUE
+\set v2 5432
+\set v3 -54.21E-2
+SELECT :v0, :v1, :v2, :v3;
+-- if tests
+\set nope 0
+\if 1 > 0
+\set id debug(65)
+\elif 0
+\set nope 1
+\else
+\set nope 1
+\endif
+\if 1 < 0
+\set nope 1
+\elif 1 > 0
+\set ie debug(74)
+\else
+\set nope 1
+\endif
+\if 1 < 0
+\set nope 1
+\elif 1 < 0
+\set nope 1
+\else
+\set if debug(83)
+\endif
+\if 1 = 1
+\set ig debug(86)
+\elif 0
+\set nope 1
+\endif
+\if 1 = 0
+\set nope 1
+\elif 1 <> 0
+\set ih debug(93)
+\endif
+-- must be zero if false branches where skipped
+\set nope debug(:nope)
+-- check automatic variables
+\set sc debug(:scale)
+\set ci debug(:client_id)
+\set rs debug(:random_seed)
+-- minint constant parsing
+\set min debug(-9223372036854775808)
+\set max debug(-(:min + 1))
+-- parametric pseudorandom permutation function
+\set t debug(permute(0, 2) + permute(1, 2) = 1)
+\set t debug(permute(0, 3) + permute(1, 3) + permute(2, 3) = 3)
+\set t debug(permute(0, 4) + permute(1, 4) + permute(2, 4) + permute(3, 4) = 6)
+\set t debug(permute(0, 5) + permute(1, 5) + permute(2, 5) + permute(3, 5) + permute(4, 5) = 10)
+\set t debug(permute(0, 16) + permute(1, 16) + permute(2, 16) + permute(3, 16) + \
+ permute(4, 16) + permute(5, 16) + permute(6, 16) + permute(7, 16) + \
+ permute(8, 16) + permute(9, 16) + permute(10, 16) + permute(11, 16) + \
+ permute(12, 16) + permute(13, 16) + permute(14, 16) + permute(15, 16) = 120)
+-- random sanity checks
+\set size random(2, 1000)
+\set v random(0, :size - 1)
+\set p permute(:v, :size)
+\set t debug(0 <= :p and :p < :size and :p = permute(:v + :size, :size) and :p <> permute(:v + 1, :size))
+-- actual values
+\set t debug(permute(:v, 1) = 0)
+\set t debug(permute(0, 2, 5431) = 0 and permute(1, 2, 5431) = 1 and \
+ permute(0, 2, 5433) = 1 and permute(1, 2, 5433) = 0)
+-- check permute's portability across architectures
+\set size debug(:max - 10)
+\set t debug(permute(:size-1, :size, 5432) = 520382784483822430 and \
+ permute(:size-2, :size, 5432) = 1143715004660802862 and \
+ permute(:size-3, :size, 5432) = 447293596416496998 and \
+ permute(:size-4, :size, 5432) = 916527772266572956 and \
+ permute(:size-5, :size, 5432) = 2763809008686028849 and \
+ permute(:size-6, :size, 5432) = 8648551549198294572 and \
+ permute(:size-7, :size, 5432) = 4542876852200565125)
+}
+ });
+
+# random determinism when seeded
+$node->safe_psql('postgres',
+ 'CREATE UNLOGGED TABLE seeded_random(seed INT8 NOT NULL, rand TEXT NOT NULL, val INTEGER NOT NULL);'
+);
+
+# same value to check for determinism
+my $seed = int(rand(1000000000));
+for my $i (1, 2)
+{
+ $node->pgbench(
+ "--random-seed=$seed -t 1",
+ 0,
+ [qr{processed: 1/1}],
+ [qr{setting random seed to $seed\b}],
+ "random seeded with $seed",
+ {
+ "001_pgbench_random_seed_$i" => q{-- test random functions
+\set ur random(1000, 1999)
+\set er random_exponential(2000, 2999, 2.0)
+\set gr random_gaussian(3000, 3999, 3.0)
+\set zr random_zipfian(4000, 4999, 1.5)
+INSERT INTO seeded_random(seed, rand, val) VALUES
+ (:random_seed, 'uniform', :ur),
+ (:random_seed, 'exponential', :er),
+ (:random_seed, 'gaussian', :gr),
+ (:random_seed, 'zipfian', :zr);
+}
+ });
+}
+
+# check that all runs generated the same 4 values
+my ($ret, $out, $err) = $node->psql('postgres',
+ 'SELECT seed, rand, val, COUNT(*) FROM seeded_random GROUP BY seed, rand, val'
+);
+
+ok($ret == 0, "psql seeded_random count ok");
+ok($err eq '', "psql seeded_random count stderr is empty");
+ok($out =~ /\b$seed\|uniform\|1\d\d\d\|2/,
+ "psql seeded_random count uniform");
+ok( $out =~ /\b$seed\|exponential\|2\d\d\d\|2/,
+ "psql seeded_random count exponential");
+ok( $out =~ /\b$seed\|gaussian\|3\d\d\d\|2/,
+ "psql seeded_random count gaussian");
+ok($out =~ /\b$seed\|zipfian\|4\d\d\d\|2/,
+ "psql seeded_random count zipfian");
+
+$node->safe_psql('postgres', 'DROP TABLE seeded_random;');
+
+# backslash commands
+$node->pgbench(
+ '-t 1', 0,
+ [
+ qr{type: .*/001_pgbench_backslash_commands},
+ qr{processed: 1/1},
+ qr{shell-echo-output}
+ ],
+ [qr{command=8.: int 1\b}],
+ 'pgbench backslash commands',
+ {
+ '001_pgbench_backslash_commands' => q{-- run set
+\set zero 0
+\set one 1.0
+-- sleep
+\sleep :one ms
+\sleep 100 us
+\sleep 0 s
+\sleep :zero
+-- setshell and continuation
+\setshell another_one\
+ echo \
+ :one
+\set n debug(:another_one)
+-- shell
+\shell echo shell-echo-output
+}
+ });
+
+# working \gset
+$node->pgbench(
+ '-t 1', 0,
+ [ qr{type: .*/001_pgbench_gset}, qr{processed: 1/1} ],
+ [
+ qr{command=3.: int 0\b},
+ qr{command=5.: int 1\b},
+ qr{command=6.: int 2\b},
+ qr{command=8.: int 3\b},
+ qr{command=10.: int 4\b},
+ qr{command=12.: int 5\b}
+ ],
+ 'pgbench gset command',
+ {
+ '001_pgbench_gset' => q{-- test gset
+-- no columns
+SELECT \gset
+-- one value
+SELECT 0 AS i0 \gset
+\set i debug(:i0)
+-- two values
+SELECT 1 AS i1, 2 AS i2 \gset
+\set i debug(:i1)
+\set i debug(:i2)
+-- with prefix
+SELECT 3 AS i3 \gset x_
+\set i debug(:x_i3)
+-- overwrite existing variable
+SELECT 0 AS i4, 4 AS i4 \gset
+\set i debug(:i4)
+-- work on the last SQL command under \;
+\; \; SELECT 0 AS i5 \; SELECT 5 AS i5 \; \; \gset
+\set i debug(:i5)
+}
+ });
+# \gset cannot accept more than one row, causing command to fail.
+$node->pgbench(
+ '-t 1', 2,
+ [ qr{type: .*/001_pgbench_gset_two_rows}, qr{processed: 0/1} ],
+ [qr{expected one row, got 2\b}],
+ 'pgbench gset command with two rows',
+ {
+ '001_pgbench_gset_two_rows' => q{
+SELECT 5432 AS fail UNION SELECT 5433 ORDER BY 1 \gset
+}
+ });
+
+# working \aset
+# Valid cases.
+$node->pgbench(
+ '-t 1', 0,
+ [ qr{type: .*/001_pgbench_aset}, qr{processed: 1/1} ],
+ [ qr{command=3.: int 8\b}, qr{command=4.: int 7\b} ],
+ 'pgbench aset command',
+ {
+ '001_pgbench_aset' => q{
+-- test aset, which applies to a combined query
+\; SELECT 6 AS i6 \; SELECT 7 AS i7 \; \aset
+-- unless it returns more than one row, last is kept
+SELECT 8 AS i6 UNION SELECT 9 ORDER BY 1 DESC \aset
+\set i debug(:i6)
+\set i debug(:i7)
+}
+ });
+# Empty result set with \aset, causing command to fail.
+$node->pgbench(
+ '-t 1', 2,
+ [ qr{type: .*/001_pgbench_aset_empty}, qr{processed: 0/1} ],
+ [
+ qr{undefined variable \"i8\"},
+ qr{evaluation of meta-command failed\b}
+ ],
+ 'pgbench aset command with empty result',
+ {
+ '001_pgbench_aset_empty' => q{
+-- empty result
+\; SELECT 5432 AS i8 WHERE FALSE \; \aset
+\set i debug(:i8)
+}
+ });
+
+# Working \startpipeline
+$node->pgbench(
+ '-t 1 -n -M extended',
+ 0,
+ [ qr{type: .*/001_pgbench_pipeline}, qr{actually processed: 1/1} ],
+ [],
+ 'working \startpipeline',
+ {
+ '001_pgbench_pipeline' => q{
+-- test startpipeline
+\startpipeline
+} . "select 1;\n" x 10 . q{
+\endpipeline
+}
+ });
+
+# Working \startpipeline in prepared query mode
+$node->pgbench(
+ '-t 1 -n -M prepared',
+ 0,
+ [ qr{type: .*/001_pgbench_pipeline_prep}, qr{actually processed: 1/1} ],
+ [],
+ 'working \startpipeline',
+ {
+ '001_pgbench_pipeline_prep' => q{
+-- test startpipeline
+\startpipeline
+\endpipeline
+\startpipeline
+} . "select 1;\n" x 10 . q{
+\endpipeline
+}
+ });
+
+# Try \startpipeline twice
+$node->pgbench(
+ '-t 1 -n -M extended',
+ 2,
+ [],
+ [qr{already in pipeline mode}],
+ 'error: call \startpipeline twice',
+ {
+ '001_pgbench_pipeline_2' => q{
+-- startpipeline twice
+\startpipeline
+\startpipeline
+}
+ });
+
+# Try to end a pipeline that hasn't started
+$node->pgbench(
+ '-t 1 -n -M extended',
+ 2,
+ [],
+ [qr{not in pipeline mode}],
+ 'error: \endpipeline with no start',
+ {
+ '001_pgbench_pipeline_3' => q{
+-- pipeline not started
+\endpipeline
+}
+ });
+
+# Try \gset in pipeline mode
+$node->pgbench(
+ '-t 1 -n -M extended',
+ 2,
+ [],
+ [qr{gset is not allowed in pipeline mode}],
+ 'error: \gset not allowed in pipeline mode',
+ {
+ '001_pgbench_pipeline_4' => q{
+\startpipeline
+select 1 \gset f
+\endpipeline
+}
+ });
+
+# Working \startpipeline in prepared query mode with serializable
+$node->pgbench(
+ '-c4 -j2 -t 10 -n -M prepared',
+ 0,
+ [
+ qr{type: .*/001_pgbench_pipeline_serializable},
+ qr{actually processed: (\d+)/\1}
+ ],
+ [],
+ 'working \startpipeline with serializable',
+ {
+ '001_pgbench_pipeline_serializable' => q{
+-- test startpipeline with serializable
+\startpipeline
+BEGIN ISOLATION LEVEL SERIALIZABLE;
+} . "select 1;\n" x 10 . q{
+END;
+\endpipeline
+}
+ });
+
+# trigger many expression errors
+my @errors = (
+
+ # [ test name, expected status, expected stderr, script ]
+ # SQL
+ [
+ 'sql syntax error',
+ 2,
+ [
+ qr{ERROR: syntax error},
+ qr{prepared statement .* does not exist}
+ ],
+ q{-- SQL syntax error
+ SELECT 1 + ;
+}
+ ],
+ [
+ 'sql too many args', 1,
+ [qr{statement has too many arguments.*\b255\b}],
+ q{-- MAX_ARGS=256 for prepared
+\set i 0
+SELECT LEAST(} . join(', ', (':i') x 256) . q{)}
+ ],
+
+ # SHELL
+ [
+ 'shell bad command', 2,
+ [qr{\(shell\) .* meta-command failed}], q{\shell no-such-command}
+ ],
+ [
+ 'shell undefined variable', 2,
+ [qr{undefined variable ":nosuchvariable"}],
+ q{-- undefined variable in shell
+\shell echo ::foo :nosuchvariable
+}
+ ],
+ [ 'shell missing command', 1, [qr{missing command }], q{\shell} ],
+ [
+ 'shell too many args', 1, [qr{too many arguments in command "shell"}],
+ q{-- 256 arguments to \shell
+\shell echo } . join(' ', ('arg') x 255)
+ ],
+
+ # SET
+ [
+ 'set syntax error', 1,
+ [qr{syntax error in command "set"}], q{\set i 1 +}
+ ],
+ [
+ 'set no such function', 1,
+ [qr{unexpected function name}], q{\set i noSuchFunction()}
+ ],
+ [
+ 'set invalid variable name', 2,
+ [qr{invalid variable name}], q{\set . 1}
+ ],
+ [ 'set division by zero', 2, [qr{division by zero}], q{\set i 1/0} ],
+ [
+ 'set undefined variable',
+ 2,
+ [qr{undefined variable "nosuchvariable"}],
+ q{\set i :nosuchvariable}
+ ],
+ [ 'set unexpected char', 1, [qr{unexpected character .;.}], q{\set i ;} ],
+ [
+ 'set too many args',
+ 2,
+ [qr{too many function arguments}],
+ q{\set i least(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)}
+ ],
+ [
+ 'set empty random range', 2,
+ [qr{empty range given to random}], q{\set i random(5,3)}
+ ],
+ [
+ 'set random range too large', 2,
+ [qr{random range is too large}], q{\set i random(:minint, :maxint)}
+ ],
+ [
+ 'set gaussian param too small',
+ 2,
+ [qr{gaussian param.* at least 2}],
+ q{\set i random_gaussian(0, 10, 1.0)}
+ ],
+ [
+ 'set exponential param greater 0',
+ 2,
+ [qr{exponential parameter must be greater }],
+ q{\set i random_exponential(0, 10, 0.0)}
+ ],
+ [
+ 'set zipfian param to 1',
+ 2,
+ [qr{zipfian parameter must be in range \[1\.001, 1000\]}],
+ q{\set i random_zipfian(0, 10, 1)}
+ ],
+ [
+ 'set zipfian param too large',
+ 2,
+ [qr{zipfian parameter must be in range \[1\.001, 1000\]}],
+ q{\set i random_zipfian(0, 10, 1000000)}
+ ],
+ [
+ 'set non numeric value', 2,
+ [qr{malformed variable "foo" value: "bla"}], q{\set i :foo + 1}
+ ],
+ [ 'set no expression', 1, [qr{syntax error}], q{\set i} ],
+ [ 'set missing argument', 1, [qr{missing argument}i], q{\set} ],
+ [
+ 'set not a bool', 2,
+ [qr{cannot coerce double to boolean}], q{\set b NOT 0.0}
+ ],
+ [
+ 'set not an int', 2,
+ [qr{cannot coerce boolean to int}], q{\set i TRUE + 2}
+ ],
+ [
+ 'set not a double', 2,
+ [qr{cannot coerce boolean to double}], q{\set d ln(TRUE)}
+ ],
+ [
+ 'set case error',
+ 1,
+ [qr{syntax error in command "set"}],
+ q{\set i CASE TRUE THEN 1 ELSE 0 END}
+ ],
+ [
+ 'set random error', 2,
+ [qr{cannot coerce boolean to int}], q{\set b random(FALSE, TRUE)}
+ ],
+ [
+ 'set number of args mismatch', 1,
+ [qr{unexpected number of arguments}], q{\set d ln(1.0, 2.0))}
+ ],
+ [
+ 'set at least one arg', 1,
+ [qr{at least one argument expected}], q{\set i greatest())}
+ ],
+
+ # SET: ARITHMETIC OVERFLOW DETECTION
+ [
+ 'set double to int overflow', 2,
+ [qr{double to int overflow for 100}], q{\set i int(1E32)}
+ ],
+ [
+ 'set bigint add overflow', 2,
+ [qr{int add out}], q{\set i (1<<62) + (1<<62)}
+ ],
+ [
+ 'set bigint sub overflow',
+ 2, [qr{int sub out}], q{\set i 0 - (1<<62) - (1<<62) - (1<<62)}
+ ],
+ [
+ 'set bigint mul overflow', 2,
+ [qr{int mul out}], q{\set i 2 * (1<<62)}
+ ],
+ [
+ 'set bigint div out of range', 2,
+ [qr{bigint div out of range}], q{\set i :minint / -1}
+ ],
+
+ # SETSHELL
+ [
+ 'setshell not an int', 2,
+ [qr{command must return an integer}], q{\setshell i echo -n one}
+ ],
+ [ 'setshell missing arg', 1, [qr{missing argument }], q{\setshell var} ],
+ [
+ 'setshell no such command', 2,
+ [qr{could not read result }], q{\setshell var no-such-command}
+ ],
+
+ # SLEEP
+ [
+ 'sleep undefined variable', 2,
+ [qr{sleep: undefined variable}], q{\sleep :nosuchvariable}
+ ],
+ [
+ 'sleep too many args', 1,
+ [qr{too many arguments}], q{\sleep too many args}
+ ],
+ [
+ 'sleep missing arg', 1,
+ [ qr{missing argument}, qr{\\sleep} ], q{\sleep}
+ ],
+ [
+ 'sleep unknown unit', 1,
+ [qr{unrecognized time unit}], q{\sleep 1 week}
+ ],
+
+ # MISC
+ [
+ 'misc invalid backslash command', 1,
+ [qr{invalid command .* "nosuchcommand"}], q{\nosuchcommand}
+ ],
+ [ 'misc empty script', 1, [qr{empty command list for script}], q{} ],
+ [
+ 'bad boolean', 2,
+ [qr{malformed variable.*trueXXX}], q{\set b :badtrue or true}
+ ],
+ [
+ 'invalid permute size',
+ 2,
+ [qr{permute size parameter must be greater than zero}],
+ q{\set i permute(0, 0)}
+ ],
+
+ # GSET
+ [
+ 'gset no row', 2,
+ [qr{expected one row, got 0\b}], q{SELECT WHERE FALSE \gset}
+ ],
+ [ 'gset alone', 1, [qr{gset must follow an SQL command}], q{\gset} ],
+ [
+ 'gset no SQL', 1,
+ [qr{gset must follow an SQL command}], q{\set i +1
+\gset}
+ ],
+ [
+ 'gset too many arguments', 1,
+ [qr{too many arguments}], q{SELECT 1 \gset a b}
+ ],
+ [
+ 'gset after gset', 1,
+ [qr{gset must follow an SQL command}], q{SELECT 1 AS i \gset
+\gset}
+ ],
+ [
+ 'gset non SELECT',
+ 2,
+ [qr{expected one row, got 0}],
+ q{DROP TABLE IF EXISTS no_such_table \gset}
+ ],
+ [
+ 'gset bad default name', 2,
+ [qr{error storing into variable \?column\?}], q{SELECT 1 \gset}
+ ],
+ [
+ 'gset bad name',
+ 2,
+ [qr{error storing into variable bad name!}],
+ q{SELECT 1 AS "bad name!" \gset}
+ ],);
+
+for my $e (@errors)
+{
+ my ($name, $status, $re, $script, $no_prepare) = @$e;
+ $status != 0 or die "invalid expected status for test \"$name\"";
+ my $n = '001_pgbench_error_' . $name;
+ $n =~ s/ /_/g;
+ $node->pgbench(
+ '-n -t 1 -Dfoo=bla -Dnull=null -Dtrue=true -Done=1 -Dzero=0.0 -Dbadtrue=trueXXX'
+ . ' -Dmaxint=9223372036854775807 -Dminint=-9223372036854775808'
+ . ($no_prepare ? '' : ' -M prepared'),
+ $status,
+ [ $status == 1 ? qr{^$} : qr{processed: 0/1} ],
+ $re,
+ 'pgbench script error: ' . $name,
+ { $n => $script });
+}
+
+# throttling
+$node->pgbench(
+ '-t 100 -S --rate=100000 --latency-limit=1000000 -c 2 -n -r',
+ 0,
+ [ qr{processed: 200/200}, qr{builtin: select only} ],
+ [qr{^$}],
+ 'pgbench throttling');
+
+$node->pgbench(
+
+ # given the expected rate and the 2 ms tx duration, at most one is executed
+ '-t 10 --rate=100000 --latency-limit=1 -n -r',
+ 0,
+ [
+ qr{processed: [01]/10},
+ qr{type: .*/001_pgbench_sleep},
+ qr{above the 1.0 ms latency limit: [01]/}
+ ],
+ [qr{^$}],
+ 'pgbench late throttling',
+ { '001_pgbench_sleep' => q{\sleep 2ms} });
+
+# return a list of files from directory $dir matching regexpr $re
+# this works around glob portability and escaping issues
+sub list_files
+{
+ my ($dir, $re) = @_;
+ opendir my $dh, $dir or die "cannot opendir $dir: $!";
+ my @files = grep /$re/, readdir $dh;
+ closedir $dh or die "cannot closedir $dir: $!";
+ return map { $dir . '/' . $_ } @files;
+}
+
+# Check log contents and clean them up:
+# $dir: directory holding logs
+# $prefix: file prefix for per-thread logs
+# $nb: number of expected files
+# $min/$max: minimum and maximum number of lines in log files
+# $re: regular expression each log line has to match
+sub check_pgbench_logs
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($dir, $prefix, $nb, $min, $max, $re) = @_;
+
+ # $prefix is simple enough, thus does not need escaping
+ my @logs = list_files($dir, qr{^$prefix\..*$});
+ ok(@logs == $nb, "number of log files");
+ ok(grep(/\/$prefix\.\d+(\.\d+)?$/, @logs) == $nb, "file name format");
+
+ my $log_number = 0;
+ for my $log (sort @logs)
+ {
+ # Check the contents of each log file.
+ my $contents_raw = slurp_file($log);
+
+ my @contents = split(/\n/, $contents_raw);
+ my $clen = @contents;
+ ok( $min <= $clen && $clen <= $max,
+ "transaction count for $log ($clen)");
+ my $clen_match = grep(/$re/, @contents);
+ ok($clen_match == $clen, "transaction format for $prefix");
+
+ # Show more information if some logs don't match
+ # to help with debugging.
+ if ($clen_match != $clen)
+ {
+ foreach my $log (@contents)
+ {
+ print "# Log entry not matching: $log\n"
+ unless $log =~ /$re/;
+ }
+ }
+ }
+ return;
+}
+
+my $bdir = $node->basedir;
+
+# Run with sampling rate, 2 clients with 50 transactions each.
+$node->pgbench(
+ "-n -S -t 50 -c 2 --log --sampling-rate=0.5", 0,
+ [ qr{select only}, qr{processed: 100/100} ], [qr{^$}],
+ 'pgbench logs', undef,
+ "--log-prefix=$bdir/001_pgbench_log_2");
+# The IDs of the clients (1st field) in the logs should be either 0 or 1.
+check_pgbench_logs($bdir, '001_pgbench_log_2', 1, 8, 92,
+ qr{^[01] \d{1,2} \d+ \d \d+ \d+$});
+
+# Run with different read-only option pattern, 1 client with 10 transactions.
+$node->pgbench(
+ "-n -b select-only -t 10 -l", 0,
+ [ qr{select only}, qr{processed: 10/10} ], [qr{^$}],
+ 'pgbench logs contents', undef,
+ "--log-prefix=$bdir/001_pgbench_log_3");
+# The ID of a single client (1st field) should match 0.
+check_pgbench_logs($bdir, '001_pgbench_log_3', 1, 10, 10,
+ qr{^0 \d{1,2} \d+ \d \d+ \d+$});
+
+# abortion of the client if the script contains an incomplete transaction block
+$node->pgbench(
+ '--no-vacuum',
+ 2,
+ [qr{processed: 1/10}],
+ [
+ qr{client 0 aborted: end of script reached without completing the last transaction}
+ ],
+ 'incomplete transaction block',
+ { '001_pgbench_incomplete_transaction_block' => q{BEGIN;SELECT 1;} });
+
+# Test the concurrent update in the table row and deadlocks.
+
+$node->safe_psql('postgres',
+ 'CREATE UNLOGGED TABLE first_client_table (value integer); '
+ . 'CREATE UNLOGGED TABLE xy (x integer, y integer); '
+ . 'INSERT INTO xy VALUES (1, 2);');
+
+# Serialization error and retry
+
+local $ENV{PGOPTIONS} = "-c default_transaction_isolation=repeatable\\ read";
+
+# Check that we have a serialization error and the same random value of the
+# delta variable in the next try
+my $err_pattern =
+ "(client (0|1) sending UPDATE xy SET y = y \\+ -?\\d+\\b).*"
+ . "client \\2 got an error in command 3 \\(SQL\\) of script 0; "
+ . "ERROR: could not serialize access due to concurrent update\\b.*"
+ . "\\1";
+
+$node->pgbench(
+ "-n -c 2 -t 1 -d --verbose-errors --max-tries 2",
+ 0,
+ [
+ qr{processed: 2/2\b},
+ qr{number of transactions retried: 1\b},
+ qr{total number of retries: 1\b}
+ ],
+ [qr/$err_pattern/s],
+ 'concurrent update with retrying',
+ {
+ '001_pgbench_serialization' => q{
+-- What's happening:
+-- The first client starts the transaction with the isolation level Repeatable
+-- Read:
+--
+-- BEGIN;
+-- UPDATE xy SET y = ... WHERE x = 1;
+--
+-- The second client starts a similar transaction with the same isolation level:
+--
+-- BEGIN;
+-- UPDATE xy SET y = ... WHERE x = 1;
+-- <waiting for the first client>
+--
+-- The first client commits its transaction, and the second client gets a
+-- serialization error.
+
+\set delta random(-5000, 5000)
+
+-- The second client will stop here
+SELECT pg_advisory_lock(0);
+
+-- Start transaction with concurrent update
+BEGIN;
+UPDATE xy SET y = y + :delta WHERE x = 1 AND pg_advisory_lock(1) IS NOT NULL;
+
+-- Wait for the second client
+DO $$
+DECLARE
+ exists boolean;
+ waiters integer;
+BEGIN
+ -- The second client always comes in second, and the number of rows in the
+ -- table first_client_table reflect this. Here the first client inserts a row,
+ -- so the second client will see a non-empty table when repeating the
+ -- transaction after the serialization error.
+ SELECT EXISTS (SELECT * FROM first_client_table) INTO STRICT exists;
+ IF NOT exists THEN
+ -- Let the second client begin
+ PERFORM pg_advisory_unlock(0);
+ -- And wait until the second client tries to get the same lock
+ LOOP
+ SELECT COUNT(*) INTO STRICT waiters FROM pg_locks WHERE
+ locktype = 'advisory' AND objsubid = 1 AND
+ ((classid::bigint << 32) | objid::bigint = 1::bigint) AND NOT granted;
+ IF waiters = 1 THEN
+ INSERT INTO first_client_table VALUES (1);
+
+ -- Exit loop
+ EXIT;
+ END IF;
+ END LOOP;
+ END IF;
+END$$;
+
+COMMIT;
+SELECT pg_advisory_unlock_all();
+}
+ });
+
+# Clean up
+
+$node->safe_psql('postgres', 'DELETE FROM first_client_table;');
+
+local $ENV{PGOPTIONS} = "-c default_transaction_isolation=read\\ committed";
+
+# Deadlock error and retry
+
+# Check that we have a deadlock error
+$err_pattern =
+ "client (0|1) got an error in command (3|5) \\(SQL\\) of script 0; "
+ . "ERROR: deadlock detected\\b";
+
+$node->pgbench(
+ "-n -c 2 -t 1 --max-tries 2 --verbose-errors",
+ 0,
+ [
+ qr{processed: 2/2\b},
+ qr{number of transactions retried: 1\b},
+ qr{total number of retries: 1\b}
+ ],
+ [qr{$err_pattern}],
+ 'deadlock with retrying',
+ {
+ '001_pgbench_deadlock' => q{
+-- What's happening:
+-- The first client gets the lock 2.
+-- The second client gets the lock 3 and tries to get the lock 2.
+-- The first client tries to get the lock 3 and one of them gets a deadlock
+-- error.
+--
+-- A client that does not get a deadlock error must hold a lock at the
+-- transaction start. Thus in the end it releases all of its locks before the
+-- client with the deadlock error starts a retry (we do not want any errors
+-- again).
+
+-- Since the client with the deadlock error has not released the blocking locks,
+-- let's do this here.
+SELECT pg_advisory_unlock_all();
+
+-- The second client and the client with the deadlock error stop here
+SELECT pg_advisory_lock(0);
+SELECT pg_advisory_lock(1);
+
+-- The second client and the client with the deadlock error always come after
+-- the first and the number of rows in the table first_client_table reflects
+-- this. Here the first client inserts a row, so in the future the table is
+-- always non-empty.
+DO $$
+DECLARE
+ exists boolean;
+BEGIN
+ SELECT EXISTS (SELECT * FROM first_client_table) INTO STRICT exists;
+ IF exists THEN
+ -- We are the second client or the client with the deadlock error
+
+ -- The first client will take care by itself of this lock (see below)
+ PERFORM pg_advisory_unlock(0);
+
+ PERFORM pg_advisory_lock(3);
+
+ -- The second client can get a deadlock here
+ PERFORM pg_advisory_lock(2);
+ ELSE
+ -- We are the first client
+
+ -- This code should not be used in a new transaction after an error
+ INSERT INTO first_client_table VALUES (1);
+
+ PERFORM pg_advisory_lock(2);
+ END IF;
+END$$;
+
+DO $$
+DECLARE
+ num_rows integer;
+ waiters integer;
+BEGIN
+ -- Check if we are the first client
+ SELECT COUNT(*) FROM first_client_table INTO STRICT num_rows;
+ IF num_rows = 1 THEN
+ -- This code should not be used in a new transaction after an error
+ INSERT INTO first_client_table VALUES (2);
+
+ -- Let the second client begin
+ PERFORM pg_advisory_unlock(0);
+ PERFORM pg_advisory_unlock(1);
+
+ -- Make sure the second client is ready for deadlock
+ LOOP
+ SELECT COUNT(*) INTO STRICT waiters FROM pg_locks WHERE
+ locktype = 'advisory' AND
+ objsubid = 1 AND
+ ((classid::bigint << 32) | objid::bigint = 2::bigint) AND
+ NOT granted;
+
+ IF waiters = 1 THEN
+ -- Exit loop
+ EXIT;
+ END IF;
+ END LOOP;
+
+ PERFORM pg_advisory_lock(0);
+ -- And the second client took care by itself of the lock 1
+ END IF;
+END$$;
+
+-- The first client can get a deadlock here
+SELECT pg_advisory_lock(3);
+
+SELECT pg_advisory_unlock_all();
+}
+ });
+
+# Clean up
+$node->safe_psql('postgres', 'DROP TABLE first_client_table, xy;');
+
+
+# done
+$node->safe_psql('postgres', 'DROP TABLESPACE regress_pgbench_tap_1_ts');
+$node->stop;
+done_testing();
diff --git a/src/bin/pgbench/t/002_pgbench_no_server.pl b/src/bin/pgbench/t/002_pgbench_no_server.pl
new file mode 100644
index 0000000..50bde7d
--- /dev/null
+++ b/src/bin/pgbench/t/002_pgbench_no_server.pl
@@ -0,0 +1,387 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+#
+# pgbench tests which do not need a server
+#
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+# create a directory for scripts
+my $testname = $0;
+$testname =~ s,.*/,,;
+$testname =~ s/\.pl$//;
+
+my $testdir = "$PostgreSQL::Test::Utils::tmp_check/t_${testname}_stuff";
+mkdir $testdir
+ or BAIL_OUT("could not create test directory \"${testdir}\": $!");
+
+# invoke pgbench
+sub pgbench
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($opts, $stat, $out, $err, $name) = @_;
+ command_checks_all([ 'pgbench', split(/\s+/, $opts) ],
+ $stat, $out, $err, $name);
+ return;
+}
+
+# invoke pgbench with scripts
+sub pgbench_scripts
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($opts, $stat, $out, $err, $name, $files) = @_;
+ my @cmd = ('pgbench', split /\s+/, $opts);
+ my @filenames = ();
+ if (defined $files)
+ {
+ for my $fn (sort keys %$files)
+ {
+ my $filename = $testdir . '/' . $fn;
+
+ # cleanup file weight if any
+ $filename =~ s/\@\d+$//;
+
+ # cleanup from prior runs
+ unlink $filename;
+ append_to_file($filename, $$files{$fn});
+ push @cmd, '-f', $filename;
+ }
+ }
+ command_checks_all(\@cmd, $stat, $out, $err, $name);
+ return;
+}
+
+#
+# Option various errors
+#
+
+my @options = (
+
+ # name, options, stderr checks
+ [
+ 'bad option',
+ '-h home -p 5432 -U calvin -d --bad-option',
+ [qr{--help.*more information}]
+ ],
+ [
+ 'no file',
+ '-f no-such-file',
+ [qr{could not open file "no-such-file":}]
+ ],
+ [
+ 'no builtin',
+ '-b no-such-builtin',
+ [qr{no builtin script .* "no-such-builtin"}]
+ ],
+ [
+ 'invalid weight',
+ '--builtin=select-only@one',
+ [qr{invalid weight specification: \@one}]
+ ],
+ [
+ 'invalid weight',
+ '-b select-only@-1',
+ [qr{weight spec.* out of range .*: -1}]
+ ],
+ [ 'too many scripts', '-S ' x 129, [qr{at most 128 SQL scripts}] ],
+ [
+ 'bad #clients', '-c three',
+ [qr{invalid value "three" for option -c/--clients}]
+ ],
+ [
+ 'bad #threads', '-j eleven',
+ [qr{invalid value "eleven" for option -j/--jobs}]
+ ],
+ [
+ 'bad scale', '-i -s two',
+ [qr{invalid value "two" for option -s/--scale}]
+ ],
+ [
+ 'invalid #transactions',
+ '-t zil', [qr{invalid value "zil" for option -t/--transactions}]
+ ],
+ [
+ 'invalid duration',
+ '-T ten', [qr{invalid value "ten" for option -T/--time}]
+ ],
+ [
+ '-t XOR -T',
+ '-N -l --aggregate-interval=5 --log-prefix=notused -t 1000 -T 1',
+ [qr{specify either }]
+ ],
+ [
+ '-T XOR -t',
+ '-P 1 --progress-timestamp -l --sampling-rate=0.001 -T 10 -t 1000',
+ [qr{specify either }]
+ ],
+ [ 'bad variable', '--define foobla', [qr{invalid variable definition}] ],
+ [ 'invalid fillfactor', '-F 1', [qr{-F/--fillfactor must be in range}] ],
+ [ 'invalid query mode', '-M no-such-mode', [qr{invalid query mode}] ],
+ [
+ 'invalid progress', '--progress=0',
+ [qr{-P/--progress must be in range}]
+ ],
+ [ 'invalid rate', '--rate=0.0', [qr{invalid rate limit}] ],
+ [ 'invalid latency', '--latency-limit=0.0', [qr{invalid latency limit}] ],
+ [
+ 'invalid sampling rate', '--sampling-rate=0',
+ [qr{invalid sampling rate}]
+ ],
+ [
+ 'invalid aggregate interval',
+ '--aggregate-interval=-3',
+ [qr{--aggregate-interval must be in range}]
+ ],
+ [
+ 'weight zero',
+ '-b se@0 -b si@0 -b tpcb@0',
+ [qr{weight must not be zero}]
+ ],
+ [ 'init vs run', '-i -S', [qr{cannot be used in initialization}] ],
+ [ 'run vs init', '-S -F 90', [qr{cannot be used in benchmarking}] ],
+ [ 'ambiguous builtin', '-b s', [qr{ambiguous}] ],
+ [
+ '--progress-timestamp => --progress', '--progress-timestamp',
+ [qr{allowed only under}]
+ ],
+ [
+ '-I without init option',
+ '-I dtg',
+ [qr{cannot be used in benchmarking mode}]
+ ],
+ [
+ 'invalid init step',
+ '-i -I dta',
+ [
+ qr{unrecognized initialization step},
+ qr{Allowed step characters are}
+ ]
+ ],
+ [
+ 'bad random seed',
+ '--random-seed=one',
+ [
+ qr{unrecognized random seed option "one"},
+ qr{Expecting an unsigned integer, "time" or "rand"},
+ qr{error while setting random seed from --random-seed option}
+ ]
+ ],
+ [
+ 'bad partition method',
+ '-i --partition-method=BAD',
+ [ qr{"range"}, qr{"hash"}, qr{"BAD"} ]
+ ],
+ [
+ 'bad partition number',
+ '-i --partitions -1',
+ [qr{--partitions must be in range}]
+ ],
+ [
+ 'partition method without partitioning',
+ '-i --partition-method=hash',
+ [qr{partition-method requires greater than zero --partitions}]
+ ],
+ [
+ 'bad maximum number of tries',
+ '--max-tries -10',
+ [qr{invalid number of maximum tries: "-10"}]
+ ],
+ [
+ 'an infinite number of tries',
+ '--max-tries 0',
+ [
+ qr{an unlimited number of transaction tries can only be used with --latency-limit or a duration}
+ ]
+ ],
+
+ # logging sub-options
+ [
+ 'sampling => log', '--sampling-rate=0.01',
+ [qr{log sampling .* only when}]
+ ],
+ [
+ 'sampling XOR aggregate',
+ '-l --sampling-rate=0.1 --aggregate-interval=3',
+ [qr{sampling .* aggregation .* cannot be used at the same time}]
+ ],
+ [
+ 'aggregate => log', '--aggregate-interval=3',
+ [qr{aggregation .* only when}]
+ ],
+ [ 'log-prefix => log', '--log-prefix=x', [qr{prefix .* only when}] ],
+ [
+ 'duration & aggregation',
+ '-l -T 1 --aggregate-interval=3',
+ [qr{aggr.* not be higher}]
+ ],
+ [
+ 'duration % aggregation',
+ '-l -T 5 --aggregate-interval=3',
+ [qr{multiple}]
+ ],);
+
+for my $o (@options)
+{
+ my ($name, $opts, $err_checks) = @$o;
+ pgbench($opts, 1, [qr{^$}], $err_checks,
+ 'pgbench option error: ' . $name);
+}
+
+# Help
+pgbench(
+ '--help', 0,
+ [
+ qr{benchmarking tool for PostgreSQL},
+ qr{Usage},
+ qr{Initialization options:},
+ qr{Common options:},
+ qr{Report bugs to}
+ ],
+ [qr{^$}],
+ 'pgbench help');
+
+# Version
+pgbench('-V', 0, [qr{^pgbench .PostgreSQL. }], [qr{^$}], 'pgbench version');
+
+# list of builtins
+pgbench(
+ '-b list',
+ 0,
+ [qr{^$}],
+ [
+ qr{Available builtin scripts:}, qr{tpcb-like},
+ qr{simple-update}, qr{select-only}
+ ],
+ 'pgbench builtin list');
+
+# builtin listing
+pgbench(
+ '--show-script se',
+ 0,
+ [qr{^$}],
+ [
+ qr{select-only: }, qr{SELECT abalance FROM pgbench_accounts WHERE},
+ qr{(?!UPDATE)}, qr{(?!INSERT)}
+ ],
+ 'pgbench builtin listing');
+
+my @script_tests = (
+
+ # name, err, { file => contents }
+ [
+ 'missing endif',
+ [qr{\\if without matching \\endif}],
+ { 'if-noendif.sql' => '\if 1' }
+ ],
+ [
+ 'missing if on elif',
+ [qr{\\elif without matching \\if}],
+ { 'elif-noif.sql' => '\elif 1' }
+ ],
+ [
+ 'missing if on else',
+ [qr{\\else without matching \\if}],
+ { 'else-noif.sql' => '\else' }
+ ],
+ [
+ 'missing if on endif',
+ [qr{\\endif without matching \\if}],
+ { 'endif-noif.sql' => '\endif' }
+ ],
+ [
+ 'elif after else',
+ [qr{\\elif after \\else}],
+ { 'else-elif.sql' => "\\if 1\n\\else\n\\elif 0\n\\endif" }
+ ],
+ [
+ 'else after else',
+ [qr{\\else after \\else}],
+ { 'else-else.sql' => "\\if 1\n\\else\n\\else\n\\endif" }
+ ],
+ [
+ 'if syntax error',
+ [qr{syntax error in command "if"}],
+ { 'if-bad.sql' => "\\if\n\\endif\n" }
+ ],
+ [
+ 'elif syntax error',
+ [qr{syntax error in command "elif"}],
+ { 'elif-bad.sql' => "\\if 0\n\\elif +\n\\endif\n" }
+ ],
+ [
+ 'else syntax error',
+ [qr{unexpected argument in command "else"}],
+ { 'else-bad.sql' => "\\if 0\n\\else BAD\n\\endif\n" }
+ ],
+ [
+ 'endif syntax error',
+ [qr{unexpected argument in command "endif"}],
+ { 'endif-bad.sql' => "\\if 0\n\\endif BAD\n" }
+ ],
+ [
+ 'not enough arguments for least',
+ [qr{at least one argument expected \(least\)}],
+ { 'bad-least.sql' => "\\set i least()\n" }
+ ],
+ [
+ 'not enough arguments for greatest',
+ [qr{at least one argument expected \(greatest\)}],
+ { 'bad-greatest.sql' => "\\set i greatest()\n" }
+ ],
+ [
+ 'not enough arguments for hash',
+ [qr{unexpected number of arguments \(hash\)}],
+ { 'bad-hash-1.sql' => "\\set i hash()\n" }
+ ],
+ [
+ 'too many arguments for hash',
+ [qr{unexpected number of arguments \(hash\)}],
+ { 'bad-hash-2.sql' => "\\set i hash(1,2,3)\n" }
+ ],
+ # overflow
+ [
+ 'bigint overflow 1',
+ [qr{bigint constant overflow}],
+ { 'overflow-1.sql' => "\\set i 100000000000000000000\n" }
+ ],
+ [
+ 'double overflow 2',
+ [qr{double constant overflow}],
+ { 'overflow-2.sql' => "\\set d 1.0E309\n" }
+ ],
+ [
+ 'double overflow 3',
+ [qr{double constant overflow}],
+ { 'overflow-3.sql' => "\\set d .1E310\n" }
+ ],
+ [
+ 'set i',
+ [ qr{set i 1 }, qr{\^ error found here} ],
+ { 'set_i_op' => "\\set i 1 +\n" }
+ ],
+ [
+ 'not enough arguments to permute',
+ [qr{unexpected number of arguments \(permute\)}],
+ { 'bad-permute-1.sql' => "\\set i permute(1)\n" }
+ ],
+ [
+ 'too many arguments to permute',
+ [qr{unexpected number of arguments \(permute\)}],
+ { 'bad-permute-2.sql' => "\\set i permute(1, 2, 3, 4)\n" }
+ ],);
+
+for my $t (@script_tests)
+{
+ my ($name, $err, $files) = @$t;
+ pgbench_scripts('', 1, [qr{^$}], $err, 'pgbench option error: ' . $name,
+ $files);
+}
+
+done_testing();
diff --git a/src/bin/pgevent/MSG00001.bin b/src/bin/pgevent/MSG00001.bin
new file mode 100644
index 0000000..6ac08e5
--- /dev/null
+++ b/src/bin/pgevent/MSG00001.bin
Binary files differ
diff --git a/src/bin/pgevent/Makefile b/src/bin/pgevent/Makefile
new file mode 100644
index 0000000..dea79d3
--- /dev/null
+++ b/src/bin/pgevent/Makefile
@@ -0,0 +1,38 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pgevent
+#
+# Copyright (c) 1996-2022, PostgreSQL Global Development Group
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "Eventlog message formatter"
+PGAPPICON=win32
+
+subdir = src/bin/pgevent
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+ifeq ($(PORTNAME), win32)
+
+OBJS = \
+ pgevent.o \
+ pgmsgevent.o
+NAME=pgevent
+
+SHLIB_LINK =
+SHLIB_EXPORTS = exports.txt
+
+all: all-lib
+
+install: all install-lib
+
+include $(top_srcdir)/src/Makefile.shlib
+
+pgmsgevent.o: pgmsgevent.rc win32ver.rc
+ $(WINDRES) $< -o $@ --include-dir=$(top_builddir)/src/include --include-dir=$(top_srcdir)/src/include --include-dir=$(srcdir) --include-dir=.
+
+clean distclean: clean-lib
+ rm -f $(OBJS) win32ver.rc
+
+endif
diff --git a/src/bin/pgevent/README b/src/bin/pgevent/README
new file mode 100644
index 0000000..10ec8d2
--- /dev/null
+++ b/src/bin/pgevent/README
@@ -0,0 +1,20 @@
+src/bin/pgevent/README
+
+pgevent
+=======
+
+MSG00001.bin is a binary file, result of Microsoft MC compiler. MC compiler
+can be downloaded for free with MS Core SDK but it is not included with MSYS
+tools and I didn't find an alternative way to compile MC file.
+
+To summarize: the command "MC pgmsgevent.mc" generates pgmsgevent.h,
+pgmsgevent.rc, and MSG00001.bin files. In MC file, we declare a string
+with %s format, so we can write anything we want in the future without
+needing to change the definition of this string.
+
+To finish, because DllUnregisterServer and DllRegisterServer are system
+defined entry points, we need to export these two functions with their names
+without "decoration", so we cannot use auto generated .def files without
+handy modifications.
+
+Laurent Ballester
diff --git a/src/bin/pgevent/exports.txt b/src/bin/pgevent/exports.txt
new file mode 100644
index 0000000..8facaed
--- /dev/null
+++ b/src/bin/pgevent/exports.txt
@@ -0,0 +1,3 @@
+ DllUnregisterServer@0 ;
+ DllRegisterServer@0 ;
+ DllInstall ;
diff --git a/src/bin/pgevent/pgevent.c b/src/bin/pgevent/pgevent.c
new file mode 100644
index 0000000..807a2c9
--- /dev/null
+++ b/src/bin/pgevent/pgevent.c
@@ -0,0 +1,160 @@
+/*-------------------------------------------------------------------------
+ *
+ * pgevent.c
+ * Defines the entry point for pgevent dll.
+ * The DLL defines event source for backend
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pgevent/pgevent.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <olectl.h>
+
+/* Global variables */
+HANDLE g_module = NULL; /* hModule of DLL */
+
+/*
+ * The event source is stored as a registry key.
+ * The maximum length of a registry key is 255 characters.
+ * http://msdn.microsoft.com/en-us/library/ms724872(v=vs.85).aspx
+ */
+char event_source[256] = DEFAULT_EVENT_SOURCE;
+
+/* Prototypes */
+HRESULT DllInstall(BOOL bInstall, LPCWSTR pszCmdLine);
+STDAPI DllRegisterServer(void);
+STDAPI DllUnregisterServer(void);
+BOOL WINAPI DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved);
+
+/*
+ * DllInstall --- Passes the command line argument to DLL
+ */
+
+HRESULT
+DllInstall(BOOL bInstall,
+ LPCWSTR pszCmdLine)
+{
+ if (pszCmdLine && *pszCmdLine != '\0')
+ wcstombs(event_source, pszCmdLine, sizeof(event_source));
+
+ /*
+ * This is an ugly hack due to the strange behavior of "regsvr32 /i".
+ *
+ * When installing, regsvr32 calls DllRegisterServer before DllInstall.
+ * When uninstalling (i.e. "regsvr32 /u /i"), on the other hand, regsvr32
+ * calls DllInstall and then DllUnregisterServer as expected.
+ *
+ * This strange behavior forces us to specify -n (i.e. "regsvr32 /n /i").
+ * Without -n, DllRegisterServer called before DllInstall would mistakenly
+ * overwrite the default "PostgreSQL" event source registration.
+ */
+ if (bInstall)
+ DllRegisterServer();
+ return S_OK;
+}
+
+/*
+ * DllRegisterServer --- Instructs DLL to create its registry entries
+ */
+
+STDAPI
+DllRegisterServer(void)
+{
+ HKEY key;
+ DWORD data;
+ char buffer[_MAX_PATH];
+ char key_name[400];
+
+ /* Set the name of DLL full path name. */
+ if (!GetModuleFileName((HMODULE) g_module, buffer, sizeof(buffer)))
+ {
+ MessageBox(NULL, "Could not retrieve DLL filename", "PostgreSQL error", MB_OK | MB_ICONSTOP);
+ return SELFREG_E_TYPELIB;
+ }
+
+ /*
+ * Add PostgreSQL source name as a subkey under the Application key in the
+ * EventLog registry key.
+ */
+ _snprintf(key_name, sizeof(key_name),
+ "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\%s",
+ event_source);
+ if (RegCreateKey(HKEY_LOCAL_MACHINE, key_name, &key))
+ {
+ MessageBox(NULL, "Could not create the registry key.", "PostgreSQL error", MB_OK | MB_ICONSTOP);
+ return SELFREG_E_TYPELIB;
+ }
+
+ /* Add the name to the EventMessageFile subkey. */
+ if (RegSetValueEx(key,
+ "EventMessageFile",
+ 0,
+ REG_EXPAND_SZ,
+ (LPBYTE) buffer,
+ strlen(buffer) + 1))
+ {
+ MessageBox(NULL, "Could not set the event message file.", "PostgreSQL error", MB_OK | MB_ICONSTOP);
+ return SELFREG_E_TYPELIB;
+ }
+
+ /* Set the supported event types in the TypesSupported subkey. */
+ data = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;
+
+ if (RegSetValueEx(key,
+ "TypesSupported",
+ 0,
+ REG_DWORD,
+ (LPBYTE) &data,
+ sizeof(DWORD)))
+ {
+ MessageBox(NULL, "Could not set the supported types.", "PostgreSQL error", MB_OK | MB_ICONSTOP);
+ return SELFREG_E_TYPELIB;
+ }
+
+ RegCloseKey(key);
+ return S_OK;
+}
+
+/*
+ * DllUnregisterServer --- Instructs DLL to remove only those entries created through DllRegisterServer
+ */
+
+STDAPI
+DllUnregisterServer(void)
+{
+ char key_name[400];
+
+ /*
+ * Remove PostgreSQL source name as a subkey under the Application key in
+ * the EventLog registry key.
+ */
+
+ _snprintf(key_name, sizeof(key_name),
+ "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\%s",
+ event_source);
+ if (RegDeleteKey(HKEY_LOCAL_MACHINE, key_name))
+ {
+ MessageBox(NULL, "Could not delete the registry key.", "PostgreSQL error", MB_OK | MB_ICONSTOP);
+ return SELFREG_E_TYPELIB;
+ }
+ return S_OK;
+}
+
+/*
+ * DllMain --- is an optional entry point into a DLL.
+ */
+
+BOOL WINAPI
+DllMain(HANDLE hModule,
+ DWORD ul_reason_for_call,
+ LPVOID lpReserved
+)
+{
+ if (ul_reason_for_call == DLL_PROCESS_ATTACH)
+ g_module = hModule;
+ return TRUE;
+}
diff --git a/src/bin/pgevent/pgevent.def b/src/bin/pgevent/pgevent.def
new file mode 100644
index 0000000..6b4d44a
--- /dev/null
+++ b/src/bin/pgevent/pgevent.def
@@ -0,0 +1,5 @@
+; dlltool --output-def pgevent.def pgevent.o pgmsgevent.o
+EXPORTS
+ DllUnregisterServer ;
+ DllRegisterServer ;
+ DllInstall ;
diff --git a/src/bin/pgevent/pgmsgevent.h b/src/bin/pgevent/pgmsgevent.h
new file mode 100644
index 0000000..aba71e4
--- /dev/null
+++ b/src/bin/pgevent/pgmsgevent.h
@@ -0,0 +1,46 @@
+/* src/bin/pgevent/pgmsgevent.h */
+
+/* */
+/* Values are 32 bit values laid out as follows: */
+/* */
+/* 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 */
+/* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 */
+/* +---+-+-+-----------------------+-------------------------------+ */
+/* |Sev|C|R| Facility | Code | */
+/* +---+-+-+-----------------------+-------------------------------+ */
+/* */
+/* where */
+/* */
+/* Sev - is the severity code */
+/* */
+/* 00 - Success */
+/* 01 - Informational */
+/* 10 - Warning */
+/* 11 - Error */
+/* */
+/* C - is the Customer code flag */
+/* */
+/* R - is a reserved bit */
+/* */
+/* Facility - is the facility code */
+/* */
+/* Code - is the facility's status code */
+/* */
+/* */
+/* Define the facility codes */
+/* */
+
+
+/* */
+/* Define the severity codes */
+/* */
+
+
+/* */
+/* MessageId: PGWIN32_EVENTLOG_MSG */
+/* */
+/* MessageText: */
+/* */
+/* %1 */
+/* */
+#define PGWIN32_EVENTLOG_MSG 0x00000000L
diff --git a/src/bin/pgevent/pgmsgevent.mc b/src/bin/pgevent/pgmsgevent.mc
new file mode 100644
index 0000000..5d16e3e
--- /dev/null
+++ b/src/bin/pgevent/pgmsgevent.mc
@@ -0,0 +1,5 @@
+MessageId=0
+SymbolicName=PGWIN32_EVENTLOG_MSG
+Language=English
+%1
+.
diff --git a/src/bin/pgevent/pgmsgevent.rc b/src/bin/pgevent/pgmsgevent.rc
new file mode 100644
index 0000000..e69862e
--- /dev/null
+++ b/src/bin/pgevent/pgmsgevent.rc
@@ -0,0 +1,4 @@
+LANGUAGE 0x9,0x1
+1 11 MSG00001.bin
+
+#include "win32ver.rc"
diff --git a/src/bin/psql/.gitignore b/src/bin/psql/.gitignore
new file mode 100644
index 0000000..10b6dd3
--- /dev/null
+++ b/src/bin/psql/.gitignore
@@ -0,0 +1,5 @@
+/psqlscanslash.c
+/sql_help.h
+/sql_help.c
+/psql
+/tmp_check/
diff --git a/src/bin/psql/Makefile b/src/bin/psql/Makefile
new file mode 100644
index 0000000..58ec4a8
--- /dev/null
+++ b/src/bin/psql/Makefile
@@ -0,0 +1,90 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/psql
+#
+# Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/bin/psql/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "psql - the PostgreSQL interactive terminal"
+PGAPPICON=win32
+
+subdir = src/bin/psql
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+# make this available to TAP test scripts
+export with_readline
+
+REFDOCDIR= $(top_srcdir)/doc/src/sgml/ref
+
+override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+OBJS = \
+ $(WIN32RES) \
+ command.o \
+ common.o \
+ copy.o \
+ crosstabview.o \
+ describe.o \
+ help.o \
+ input.o \
+ large_obj.o \
+ mainloop.o \
+ prompt.o \
+ psqlscanslash.o \
+ sql_help.o \
+ startup.o \
+ stringutils.o \
+ tab-complete.o \
+ variables.o
+
+
+all: psql
+
+psql: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+help.o: sql_help.h
+
+# See notes in src/backend/parser/Makefile about the following two rules
+sql_help.c: sql_help.h
+ touch $@
+
+sql_help.h: create_help.pl $(wildcard $(REFDOCDIR)/*.sgml)
+ $(PERL) $< $(REFDOCDIR) $*
+
+psqlscanslash.c: FLEXFLAGS = -Cfe -p -p
+psqlscanslash.c: FLEX_NO_BACKUP=yes
+psqlscanslash.c: FLEX_FIX_WARNING=yes
+
+distprep: sql_help.h sql_help.c psqlscanslash.c
+
+install: all installdirs
+ $(INSTALL_PROGRAM) psql$(X) '$(DESTDIR)$(bindir)/psql$(X)'
+ $(INSTALL_DATA) $(srcdir)/psqlrc.sample '$(DESTDIR)$(datadir)/psqlrc.sample'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)' '$(DESTDIR)$(datadir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/psql$(X)' '$(DESTDIR)$(datadir)/psqlrc.sample'
+
+clean distclean:
+ rm -f psql$(X) $(OBJS) lex.backup
+ rm -rf tmp_check
+
+# files removed here are supposed to be in the distribution tarball,
+# so do not clean them in the clean/distclean rules
+maintainer-clean: distclean
+ rm -f sql_help.h sql_help.c psqlscanslash.c
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
new file mode 100644
index 0000000..897fbee
--- /dev/null
+++ b/src/bin/psql/command.c
@@ -0,0 +1,5606 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/command.c
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#include <time.h>
+#include <pwd.h>
+#include <utime.h>
+#ifndef WIN32
+#include <sys/stat.h> /* for stat() */
+#include <sys/time.h> /* for setitimer() */
+#include <fcntl.h> /* open() flags */
+#include <unistd.h> /* for geteuid(), getpid(), stat() */
+#else
+#include <win32.h>
+#include <io.h>
+#include <fcntl.h>
+#include <direct.h>
+#include <sys/stat.h> /* for stat() */
+#endif
+
+#include "catalog/pg_class_d.h"
+#include "command.h"
+#include "common.h"
+#include "common/logging.h"
+#include "common/string.h"
+#include "copy.h"
+#include "crosstabview.h"
+#include "describe.h"
+#include "fe_utils/cancel.h"
+#include "fe_utils/print.h"
+#include "fe_utils/string_utils.h"
+#include "help.h"
+#include "input.h"
+#include "large_obj.h"
+#include "libpq-fe.h"
+#include "libpq/pqcomm.h"
+#include "mainloop.h"
+#include "portability/instr_time.h"
+#include "pqexpbuffer.h"
+#include "psqlscanslash.h"
+#include "settings.h"
+#include "variables.h"
+
+/*
+ * Editable database object types.
+ */
+typedef enum EditableObjectType
+{
+ EditableFunction,
+ EditableView
+} EditableObjectType;
+
+/* local function declarations */
+static backslashResult exec_command(const char *cmd,
+ PsqlScanState scan_state,
+ ConditionalStack cstack,
+ PQExpBuffer query_buf,
+ PQExpBuffer previous_buf);
+static backslashResult exec_command_a(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_C(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_connect(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_cd(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_conninfo(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_copy(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_copyright(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_crosstabview(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_d(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static bool exec_command_dfo(PsqlScanState scan_state, const char *cmd,
+ const char *pattern,
+ bool show_verbose, bool show_system);
+static backslashResult exec_command_edit(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf, PQExpBuffer previous_buf);
+static backslashResult exec_command_ef_ev(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf, bool is_func);
+static backslashResult exec_command_echo(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_elif(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf);
+static backslashResult exec_command_else(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf);
+static backslashResult exec_command_endif(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf);
+static backslashResult exec_command_encoding(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_errverbose(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_f(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_g(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult process_command_g_options(char *first_option,
+ PsqlScanState scan_state,
+ bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_gdesc(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_getenv(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_gexec(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_gset(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_help(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_html(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_include(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_if(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf);
+static backslashResult exec_command_list(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_lo(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_out(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_print(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf, PQExpBuffer previous_buf);
+static backslashResult exec_command_password(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_prompt(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_pset(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_quit(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_reset(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf);
+static backslashResult exec_command_s(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_set(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_setenv(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_sf_sv(PsqlScanState scan_state, bool active_branch,
+ const char *cmd, bool is_func);
+static backslashResult exec_command_t(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_T(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_timing(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_unset(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_write(PsqlScanState scan_state, bool active_branch,
+ const char *cmd,
+ PQExpBuffer query_buf, PQExpBuffer previous_buf);
+static backslashResult exec_command_watch(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf, PQExpBuffer previous_buf);
+static backslashResult exec_command_x(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_z(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_shell_escape(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_slash_command_help(PsqlScanState scan_state, bool active_branch);
+static char *read_connect_arg(PsqlScanState scan_state);
+static PQExpBuffer gather_boolean_expression(PsqlScanState scan_state);
+static bool is_true_boolean_expression(PsqlScanState scan_state, const char *name);
+static void ignore_boolean_expression(PsqlScanState scan_state);
+static void ignore_slash_options(PsqlScanState scan_state);
+static void ignore_slash_filepipe(PsqlScanState scan_state);
+static void ignore_slash_whole_line(PsqlScanState scan_state);
+static bool is_branching_command(const char *cmd);
+static void save_query_text_state(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf);
+static void discard_query_text(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf);
+static bool copy_previous_query(PQExpBuffer query_buf, PQExpBuffer previous_buf);
+static bool do_connect(enum trivalue reuse_previous_specification,
+ char *dbname, char *user, char *host, char *port);
+static bool do_edit(const char *filename_arg, PQExpBuffer query_buf,
+ int lineno, bool discard_on_quit, bool *edited);
+static bool do_shell(const char *command);
+static bool do_watch(PQExpBuffer query_buf, double sleep);
+static bool lookup_object_oid(EditableObjectType obj_type, const char *desc,
+ Oid *obj_oid);
+static bool get_create_object_cmd(EditableObjectType obj_type, Oid oid,
+ PQExpBuffer buf);
+static int strip_lineno_from_objdesc(char *obj);
+static int count_lines_in_buf(PQExpBuffer buf);
+static void print_with_linenumbers(FILE *output, char *lines, bool is_func);
+static void minimal_error_message(PGresult *res);
+
+static void printSSLInfo(void);
+static void printGSSInfo(void);
+static bool printPsetInfo(const char *param, printQueryOpt *popt);
+static char *pset_value_string(const char *param, printQueryOpt *popt);
+
+#ifdef WIN32
+static void checkWin32Codepage(void);
+#endif
+
+
+
+/*----------
+ * HandleSlashCmds:
+ *
+ * Handles all the different commands that start with '\'.
+ * Ordinarily called by MainLoop().
+ *
+ * scan_state is a lexer working state that is set to continue scanning
+ * just after the '\'. The lexer is advanced past the command and all
+ * arguments on return.
+ *
+ * cstack is the current \if stack state. This will be examined, and
+ * possibly modified by conditional commands.
+ *
+ * query_buf contains the query-so-far, which may be modified by
+ * execution of the backslash command (for example, \r clears it).
+ *
+ * previous_buf contains the query most recently sent to the server
+ * (empty if none yet). This should not be modified here, but some
+ * commands copy its content into query_buf.
+ *
+ * query_buf and previous_buf will be NULL when executing a "-c"
+ * command-line option.
+ *
+ * Returns a status code indicating what action is desired, see command.h.
+ *----------
+ */
+
+backslashResult
+HandleSlashCmds(PsqlScanState scan_state,
+ ConditionalStack cstack,
+ PQExpBuffer query_buf,
+ PQExpBuffer previous_buf)
+{
+ backslashResult status;
+ char *cmd;
+ char *arg;
+
+ Assert(scan_state != NULL);
+ Assert(cstack != NULL);
+
+ /* Parse off the command name */
+ cmd = psql_scan_slash_command(scan_state);
+
+ /* And try to execute it */
+ status = exec_command(cmd, scan_state, cstack, query_buf, previous_buf);
+
+ if (status == PSQL_CMD_UNKNOWN)
+ {
+ pg_log_error("invalid command \\%s", cmd);
+ if (pset.cur_cmd_interactive)
+ pg_log_error_hint("Try \\? for help.");
+ status = PSQL_CMD_ERROR;
+ }
+
+ if (status != PSQL_CMD_ERROR)
+ {
+ /*
+ * Eat any remaining arguments after a valid command. We want to
+ * suppress evaluation of backticks in this situation, so transiently
+ * push an inactive conditional-stack entry.
+ */
+ bool active_branch = conditional_active(cstack);
+
+ conditional_stack_push(cstack, IFSTATE_IGNORED);
+ while ((arg = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false)))
+ {
+ if (active_branch)
+ pg_log_warning("\\%s: extra argument \"%s\" ignored", cmd, arg);
+ free(arg);
+ }
+ conditional_stack_pop(cstack);
+ }
+ else
+ {
+ /* silently throw away rest of line after an erroneous command */
+ while ((arg = psql_scan_slash_option(scan_state,
+ OT_WHOLE_LINE, NULL, false)))
+ free(arg);
+ }
+
+ /* if there is a trailing \\, swallow it */
+ psql_scan_slash_command_end(scan_state);
+
+ free(cmd);
+
+ /* some commands write to queryFout, so make sure output is sent */
+ fflush(pset.queryFout);
+
+ return status;
+}
+
+
+/*
+ * Subroutine to actually try to execute a backslash command.
+ *
+ * The typical "success" result code is PSQL_CMD_SKIP_LINE, although some
+ * commands return something else. Failure result code is PSQL_CMD_ERROR,
+ * unless PSQL_CMD_UNKNOWN is more appropriate.
+ */
+static backslashResult
+exec_command(const char *cmd,
+ PsqlScanState scan_state,
+ ConditionalStack cstack,
+ PQExpBuffer query_buf,
+ PQExpBuffer previous_buf)
+{
+ backslashResult status;
+ bool active_branch = conditional_active(cstack);
+
+ /*
+ * In interactive mode, warn when we're ignoring a command within a false
+ * \if-branch. But we continue on, so as to parse and discard the right
+ * amount of parameter text. Each individual backslash command subroutine
+ * is responsible for doing nothing after discarding appropriate
+ * arguments, if !active_branch.
+ */
+ if (pset.cur_cmd_interactive && !active_branch &&
+ !is_branching_command(cmd))
+ {
+ pg_log_warning("\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block",
+ cmd);
+ }
+
+ if (strcmp(cmd, "a") == 0)
+ status = exec_command_a(scan_state, active_branch);
+ else if (strcmp(cmd, "C") == 0)
+ status = exec_command_C(scan_state, active_branch);
+ else if (strcmp(cmd, "c") == 0 || strcmp(cmd, "connect") == 0)
+ status = exec_command_connect(scan_state, active_branch);
+ else if (strcmp(cmd, "cd") == 0)
+ status = exec_command_cd(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "conninfo") == 0)
+ status = exec_command_conninfo(scan_state, active_branch);
+ else if (pg_strcasecmp(cmd, "copy") == 0)
+ status = exec_command_copy(scan_state, active_branch);
+ else if (strcmp(cmd, "copyright") == 0)
+ status = exec_command_copyright(scan_state, active_branch);
+ else if (strcmp(cmd, "crosstabview") == 0)
+ status = exec_command_crosstabview(scan_state, active_branch);
+ else if (cmd[0] == 'd')
+ status = exec_command_d(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "e") == 0 || strcmp(cmd, "edit") == 0)
+ status = exec_command_edit(scan_state, active_branch,
+ query_buf, previous_buf);
+ else if (strcmp(cmd, "ef") == 0)
+ status = exec_command_ef_ev(scan_state, active_branch, query_buf, true);
+ else if (strcmp(cmd, "ev") == 0)
+ status = exec_command_ef_ev(scan_state, active_branch, query_buf, false);
+ else if (strcmp(cmd, "echo") == 0 || strcmp(cmd, "qecho") == 0 ||
+ strcmp(cmd, "warn") == 0)
+ status = exec_command_echo(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "elif") == 0)
+ status = exec_command_elif(scan_state, cstack, query_buf);
+ else if (strcmp(cmd, "else") == 0)
+ status = exec_command_else(scan_state, cstack, query_buf);
+ else if (strcmp(cmd, "endif") == 0)
+ status = exec_command_endif(scan_state, cstack, query_buf);
+ else if (strcmp(cmd, "encoding") == 0)
+ status = exec_command_encoding(scan_state, active_branch);
+ else if (strcmp(cmd, "errverbose") == 0)
+ status = exec_command_errverbose(scan_state, active_branch);
+ else if (strcmp(cmd, "f") == 0)
+ status = exec_command_f(scan_state, active_branch);
+ else if (strcmp(cmd, "g") == 0 || strcmp(cmd, "gx") == 0)
+ status = exec_command_g(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "gdesc") == 0)
+ status = exec_command_gdesc(scan_state, active_branch);
+ else if (strcmp(cmd, "getenv") == 0)
+ status = exec_command_getenv(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "gexec") == 0)
+ status = exec_command_gexec(scan_state, active_branch);
+ else if (strcmp(cmd, "gset") == 0)
+ status = exec_command_gset(scan_state, active_branch);
+ else if (strcmp(cmd, "h") == 0 || strcmp(cmd, "help") == 0)
+ status = exec_command_help(scan_state, active_branch);
+ else if (strcmp(cmd, "H") == 0 || strcmp(cmd, "html") == 0)
+ status = exec_command_html(scan_state, active_branch);
+ else if (strcmp(cmd, "i") == 0 || strcmp(cmd, "include") == 0 ||
+ strcmp(cmd, "ir") == 0 || strcmp(cmd, "include_relative") == 0)
+ status = exec_command_include(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "if") == 0)
+ status = exec_command_if(scan_state, cstack, query_buf);
+ else if (strcmp(cmd, "l") == 0 || strcmp(cmd, "list") == 0 ||
+ strcmp(cmd, "l+") == 0 || strcmp(cmd, "list+") == 0)
+ status = exec_command_list(scan_state, active_branch, cmd);
+ else if (strncmp(cmd, "lo_", 3) == 0)
+ status = exec_command_lo(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "o") == 0 || strcmp(cmd, "out") == 0)
+ status = exec_command_out(scan_state, active_branch);
+ else if (strcmp(cmd, "p") == 0 || strcmp(cmd, "print") == 0)
+ status = exec_command_print(scan_state, active_branch,
+ query_buf, previous_buf);
+ else if (strcmp(cmd, "password") == 0)
+ status = exec_command_password(scan_state, active_branch);
+ else if (strcmp(cmd, "prompt") == 0)
+ status = exec_command_prompt(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "pset") == 0)
+ status = exec_command_pset(scan_state, active_branch);
+ else if (strcmp(cmd, "q") == 0 || strcmp(cmd, "quit") == 0)
+ status = exec_command_quit(scan_state, active_branch);
+ else if (strcmp(cmd, "r") == 0 || strcmp(cmd, "reset") == 0)
+ status = exec_command_reset(scan_state, active_branch, query_buf);
+ else if (strcmp(cmd, "s") == 0)
+ status = exec_command_s(scan_state, active_branch);
+ else if (strcmp(cmd, "set") == 0)
+ status = exec_command_set(scan_state, active_branch);
+ else if (strcmp(cmd, "setenv") == 0)
+ status = exec_command_setenv(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "sf") == 0 || strcmp(cmd, "sf+") == 0)
+ status = exec_command_sf_sv(scan_state, active_branch, cmd, true);
+ else if (strcmp(cmd, "sv") == 0 || strcmp(cmd, "sv+") == 0)
+ status = exec_command_sf_sv(scan_state, active_branch, cmd, false);
+ else if (strcmp(cmd, "t") == 0)
+ status = exec_command_t(scan_state, active_branch);
+ else if (strcmp(cmd, "T") == 0)
+ status = exec_command_T(scan_state, active_branch);
+ else if (strcmp(cmd, "timing") == 0)
+ status = exec_command_timing(scan_state, active_branch);
+ else if (strcmp(cmd, "unset") == 0)
+ status = exec_command_unset(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "w") == 0 || strcmp(cmd, "write") == 0)
+ status = exec_command_write(scan_state, active_branch, cmd,
+ query_buf, previous_buf);
+ else if (strcmp(cmd, "watch") == 0)
+ status = exec_command_watch(scan_state, active_branch,
+ query_buf, previous_buf);
+ else if (strcmp(cmd, "x") == 0)
+ status = exec_command_x(scan_state, active_branch);
+ else if (strcmp(cmd, "z") == 0)
+ status = exec_command_z(scan_state, active_branch);
+ else if (strcmp(cmd, "!") == 0)
+ status = exec_command_shell_escape(scan_state, active_branch);
+ else if (strcmp(cmd, "?") == 0)
+ status = exec_command_slash_command_help(scan_state, active_branch);
+ else
+ status = PSQL_CMD_UNKNOWN;
+
+ /*
+ * All the commands that return PSQL_CMD_SEND want to execute previous_buf
+ * if query_buf is empty. For convenience we implement that here, not in
+ * the individual command subroutines.
+ */
+ if (status == PSQL_CMD_SEND)
+ (void) copy_previous_query(query_buf, previous_buf);
+
+ return status;
+}
+
+
+/*
+ * \a -- toggle field alignment
+ *
+ * This makes little sense but we keep it around.
+ */
+static backslashResult
+exec_command_a(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ if (pset.popt.topt.format != PRINT_ALIGNED)
+ success = do_pset("format", "aligned", &pset.popt, pset.quiet);
+ else
+ success = do_pset("format", "unaligned", &pset.popt, pset.quiet);
+ }
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \C -- override table title (formerly change HTML caption)
+ */
+static backslashResult
+exec_command_C(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ success = do_pset("title", opt, &pset.popt, pset.quiet);
+ free(opt);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \c or \connect -- connect to database using the specified parameters.
+ *
+ * \c [-reuse-previous=BOOL] dbname user host port
+ *
+ * Specifying a parameter as '-' is equivalent to omitting it. Examples:
+ *
+ * \c - - hst Connect to current database on current port of
+ * host "hst" as current user.
+ * \c - usr - prt Connect to current database on port "prt" of current host
+ * as user "usr".
+ * \c dbs Connect to database "dbs" on current port of current host
+ * as current user.
+ */
+static backslashResult
+exec_command_connect(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ static const char prefix[] = "-reuse-previous=";
+ char *opt1,
+ *opt2,
+ *opt3,
+ *opt4;
+ enum trivalue reuse_previous = TRI_DEFAULT;
+
+ opt1 = read_connect_arg(scan_state);
+ if (opt1 != NULL && strncmp(opt1, prefix, sizeof(prefix) - 1) == 0)
+ {
+ bool on_off;
+
+ success = ParseVariableBool(opt1 + sizeof(prefix) - 1,
+ "-reuse-previous",
+ &on_off);
+ if (success)
+ {
+ reuse_previous = on_off ? TRI_YES : TRI_NO;
+ free(opt1);
+ opt1 = read_connect_arg(scan_state);
+ }
+ }
+
+ if (success) /* give up if reuse_previous was invalid */
+ {
+ opt2 = read_connect_arg(scan_state);
+ opt3 = read_connect_arg(scan_state);
+ opt4 = read_connect_arg(scan_state);
+
+ success = do_connect(reuse_previous, opt1, opt2, opt3, opt4);
+
+ free(opt2);
+ free(opt3);
+ free(opt4);
+ }
+ free(opt1);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \cd -- change directory
+ */
+static backslashResult
+exec_command_cd(PsqlScanState scan_state, bool active_branch, const char *cmd)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+ char *dir;
+
+ if (opt)
+ dir = opt;
+ else
+ {
+#ifndef WIN32
+ /* This should match get_home_path() */
+ dir = getenv("HOME");
+ if (dir == NULL || dir[0] == '\0')
+ {
+ uid_t user_id = geteuid();
+ struct passwd *pw;
+
+ errno = 0; /* clear errno before call */
+ pw = getpwuid(user_id);
+ if (pw)
+ dir = pw->pw_dir;
+ else
+ {
+ pg_log_error("could not get home directory for user ID %ld: %s",
+ (long) user_id,
+ errno ? strerror(errno) : _("user does not exist"));
+ success = false;
+ }
+ }
+#else /* WIN32 */
+
+ /*
+ * On Windows, 'cd' without arguments prints the current
+ * directory, so if someone wants to code this here instead...
+ */
+ dir = "/";
+#endif /* WIN32 */
+ }
+
+ if (success &&
+ chdir(dir) < 0)
+ {
+ pg_log_error("\\%s: could not change directory to \"%s\": %m",
+ cmd, dir);
+ success = false;
+ }
+
+ if (opt)
+ free(opt);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \conninfo -- display information about the current connection
+ */
+static backslashResult
+exec_command_conninfo(PsqlScanState scan_state, bool active_branch)
+{
+ if (active_branch)
+ {
+ char *db = PQdb(pset.db);
+
+ if (db == NULL)
+ printf(_("You are currently not connected to a database.\n"));
+ else
+ {
+ char *host = PQhost(pset.db);
+ char *hostaddr = PQhostaddr(pset.db);
+
+ if (is_unixsock_path(host))
+ {
+ /* hostaddr overrides host */
+ if (hostaddr && *hostaddr)
+ printf(_("You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"),
+ db, PQuser(pset.db), hostaddr, PQport(pset.db));
+ else
+ printf(_("You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"),
+ db, PQuser(pset.db), host, PQport(pset.db));
+ }
+ else
+ {
+ if (hostaddr && *hostaddr && strcmp(host, hostaddr) != 0)
+ printf(_("You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"),
+ db, PQuser(pset.db), host, hostaddr, PQport(pset.db));
+ else
+ printf(_("You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"),
+ db, PQuser(pset.db), host, PQport(pset.db));
+ }
+ printSSLInfo();
+ printGSSInfo();
+ }
+ }
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \copy -- run a COPY command
+ */
+static backslashResult
+exec_command_copy(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_WHOLE_LINE, NULL, false);
+
+ success = do_copy(opt);
+ free(opt);
+ }
+ else
+ ignore_slash_whole_line(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \copyright -- print copyright notice
+ */
+static backslashResult
+exec_command_copyright(PsqlScanState scan_state, bool active_branch)
+{
+ if (active_branch)
+ print_copyright();
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \crosstabview -- execute a query and display result in crosstab
+ */
+static backslashResult
+exec_command_crosstabview(PsqlScanState scan_state, bool active_branch)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ int i;
+
+ for (i = 0; i < lengthof(pset.ctv_args); i++)
+ pset.ctv_args[i] = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+ pset.crosstab_flag = true;
+ status = PSQL_CMD_SEND;
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return status;
+}
+
+/*
+ * \d* commands
+ */
+static backslashResult
+exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *pattern;
+ bool show_verbose,
+ show_system;
+
+ /* We don't do SQLID reduction on the pattern yet */
+ pattern = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ show_verbose = strchr(cmd, '+') ? true : false;
+ show_system = strchr(cmd, 'S') ? true : false;
+
+ switch (cmd[1])
+ {
+ case '\0':
+ case '+':
+ case 'S':
+ if (pattern)
+ success = describeTableDetails(pattern, show_verbose, show_system);
+ else
+ /* standard listing of interesting things */
+ success = listTables("tvmsE", NULL, show_verbose, show_system);
+ break;
+ case 'A':
+ {
+ char *pattern2 = NULL;
+
+ if (pattern && cmd[2] != '\0' && cmd[2] != '+')
+ pattern2 = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, true);
+
+ switch (cmd[2])
+ {
+ case '\0':
+ case '+':
+ success = describeAccessMethods(pattern, show_verbose);
+ break;
+ case 'c':
+ success = listOperatorClasses(pattern, pattern2, show_verbose);
+ break;
+ case 'f':
+ success = listOperatorFamilies(pattern, pattern2, show_verbose);
+ break;
+ case 'o':
+ success = listOpFamilyOperators(pattern, pattern2, show_verbose);
+ break;
+ case 'p':
+ success = listOpFamilyFunctions(pattern, pattern2, show_verbose);
+ break;
+ default:
+ status = PSQL_CMD_UNKNOWN;
+ break;
+ }
+
+ if (pattern2)
+ free(pattern2);
+ }
+ break;
+ case 'a':
+ success = describeAggregates(pattern, show_verbose, show_system);
+ break;
+ case 'b':
+ success = describeTablespaces(pattern, show_verbose);
+ break;
+ case 'c':
+ if (strncmp(cmd, "dconfig", 7) == 0)
+ success = describeConfigurationParameters(pattern,
+ show_verbose,
+ show_system);
+ else
+ success = listConversions(pattern,
+ show_verbose,
+ show_system);
+ break;
+ case 'C':
+ success = listCasts(pattern, show_verbose);
+ break;
+ case 'd':
+ if (strncmp(cmd, "ddp", 3) == 0)
+ success = listDefaultACLs(pattern);
+ else
+ success = objectDescription(pattern, show_system);
+ break;
+ case 'D':
+ success = listDomains(pattern, show_verbose, show_system);
+ break;
+ case 'f': /* function subsystem */
+ switch (cmd[2])
+ {
+ case '\0':
+ case '+':
+ case 'S':
+ case 'a':
+ case 'n':
+ case 'p':
+ case 't':
+ case 'w':
+ success = exec_command_dfo(scan_state, cmd, pattern,
+ show_verbose, show_system);
+ break;
+ default:
+ status = PSQL_CMD_UNKNOWN;
+ break;
+ }
+ break;
+ case 'g':
+ /* no longer distinct from \du */
+ success = describeRoles(pattern, show_verbose, show_system);
+ break;
+ case 'l':
+ success = listLargeObjects(show_verbose);
+ break;
+ case 'L':
+ success = listLanguages(pattern, show_verbose, show_system);
+ break;
+ case 'n':
+ success = listSchemas(pattern, show_verbose, show_system);
+ break;
+ case 'o':
+ success = exec_command_dfo(scan_state, cmd, pattern,
+ show_verbose, show_system);
+ break;
+ case 'O':
+ success = listCollations(pattern, show_verbose, show_system);
+ break;
+ case 'p':
+ success = permissionsList(pattern);
+ break;
+ case 'P':
+ {
+ switch (cmd[2])
+ {
+ case '\0':
+ case '+':
+ case 't':
+ case 'i':
+ case 'n':
+ success = listPartitionedTables(&cmd[2], pattern, show_verbose);
+ break;
+ default:
+ status = PSQL_CMD_UNKNOWN;
+ break;
+ }
+ }
+ break;
+ case 'T':
+ success = describeTypes(pattern, show_verbose, show_system);
+ break;
+ case 't':
+ case 'v':
+ case 'm':
+ case 'i':
+ case 's':
+ case 'E':
+ success = listTables(&cmd[1], pattern, show_verbose, show_system);
+ break;
+ case 'r':
+ if (cmd[2] == 'd' && cmd[3] == 's')
+ {
+ char *pattern2 = NULL;
+
+ if (pattern)
+ pattern2 = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+ success = listDbRoleSettings(pattern, pattern2);
+
+ if (pattern2)
+ free(pattern2);
+ }
+ else
+ status = PSQL_CMD_UNKNOWN;
+ break;
+ case 'R':
+ switch (cmd[2])
+ {
+ case 'p':
+ if (show_verbose)
+ success = describePublications(pattern);
+ else
+ success = listPublications(pattern);
+ break;
+ case 's':
+ success = describeSubscriptions(pattern, show_verbose);
+ break;
+ default:
+ status = PSQL_CMD_UNKNOWN;
+ }
+ break;
+ case 'u':
+ success = describeRoles(pattern, show_verbose, show_system);
+ break;
+ case 'F': /* text search subsystem */
+ switch (cmd[2])
+ {
+ case '\0':
+ case '+':
+ success = listTSConfigs(pattern, show_verbose);
+ break;
+ case 'p':
+ success = listTSParsers(pattern, show_verbose);
+ break;
+ case 'd':
+ success = listTSDictionaries(pattern, show_verbose);
+ break;
+ case 't':
+ success = listTSTemplates(pattern, show_verbose);
+ break;
+ default:
+ status = PSQL_CMD_UNKNOWN;
+ break;
+ }
+ break;
+ case 'e': /* SQL/MED subsystem */
+ switch (cmd[2])
+ {
+ case 's':
+ success = listForeignServers(pattern, show_verbose);
+ break;
+ case 'u':
+ success = listUserMappings(pattern, show_verbose);
+ break;
+ case 'w':
+ success = listForeignDataWrappers(pattern, show_verbose);
+ break;
+ case 't':
+ success = listForeignTables(pattern, show_verbose);
+ break;
+ default:
+ status = PSQL_CMD_UNKNOWN;
+ break;
+ }
+ break;
+ case 'x': /* Extensions */
+ if (show_verbose)
+ success = listExtensionContents(pattern);
+ else
+ success = listExtensions(pattern);
+ break;
+ case 'X': /* Extended Statistics */
+ success = listExtendedStats(pattern);
+ break;
+ case 'y': /* Event Triggers */
+ success = listEventTriggers(pattern, show_verbose);
+ break;
+ default:
+ status = PSQL_CMD_UNKNOWN;
+ }
+
+ if (pattern)
+ free(pattern);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ if (!success)
+ status = PSQL_CMD_ERROR;
+
+ return status;
+}
+
+/* \df and \do; messy enough to split out of exec_command_d */
+static bool
+exec_command_dfo(PsqlScanState scan_state, const char *cmd,
+ const char *pattern,
+ bool show_verbose, bool show_system)
+{
+ bool success;
+ char *arg_patterns[FUNC_MAX_ARGS];
+ int num_arg_patterns = 0;
+
+ /* Collect argument-type patterns too */
+ if (pattern) /* otherwise it was just \df or \do */
+ {
+ char *ap;
+
+ while ((ap = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true)) != NULL)
+ {
+ arg_patterns[num_arg_patterns++] = ap;
+ if (num_arg_patterns >= FUNC_MAX_ARGS)
+ break; /* protect limited-size array */
+ }
+ }
+
+ if (cmd[1] == 'f')
+ success = describeFunctions(&cmd[2], pattern,
+ arg_patterns, num_arg_patterns,
+ show_verbose, show_system);
+ else
+ success = describeOperators(pattern,
+ arg_patterns, num_arg_patterns,
+ show_verbose, show_system);
+
+ while (--num_arg_patterns >= 0)
+ free(arg_patterns[num_arg_patterns]);
+
+ return success;
+}
+
+/*
+ * \e or \edit -- edit the current query buffer, or edit a file and
+ * make it the query buffer
+ */
+static backslashResult
+exec_command_edit(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf, PQExpBuffer previous_buf)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ if (!query_buf)
+ {
+ pg_log_error("no query buffer");
+ status = PSQL_CMD_ERROR;
+ }
+ else
+ {
+ char *fname;
+ char *ln = NULL;
+ int lineno = -1;
+
+ fname = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+ if (fname)
+ {
+ /* try to get separate lineno arg */
+ ln = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+ if (ln == NULL)
+ {
+ /* only one arg; maybe it is lineno not fname */
+ if (fname[0] &&
+ strspn(fname, "0123456789") == strlen(fname))
+ {
+ /* all digits, so assume it is lineno */
+ ln = fname;
+ fname = NULL;
+ }
+ }
+ }
+ if (ln)
+ {
+ lineno = atoi(ln);
+ if (lineno < 1)
+ {
+ pg_log_error("invalid line number: %s", ln);
+ status = PSQL_CMD_ERROR;
+ }
+ }
+ if (status != PSQL_CMD_ERROR)
+ {
+ bool discard_on_quit;
+
+ expand_tilde(&fname);
+ if (fname)
+ {
+ canonicalize_path(fname);
+ /* Always clear buffer if the file isn't modified */
+ discard_on_quit = true;
+ }
+ else
+ {
+ /*
+ * If query_buf is empty, recall previous query for
+ * editing. But in that case, the query buffer should be
+ * emptied if editing doesn't modify the file.
+ */
+ discard_on_quit = copy_previous_query(query_buf,
+ previous_buf);
+ }
+
+ if (do_edit(fname, query_buf, lineno, discard_on_quit, NULL))
+ status = PSQL_CMD_NEWEDIT;
+ else
+ status = PSQL_CMD_ERROR;
+ }
+ if (fname)
+ free(fname);
+ if (ln)
+ free(ln);
+ }
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return status;
+}
+
+/*
+ * \ef/\ev -- edit the named function/view, or
+ * present a blank CREATE FUNCTION/VIEW template if no argument is given
+ */
+static backslashResult
+exec_command_ef_ev(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf, bool is_func)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ char *obj_desc = psql_scan_slash_option(scan_state,
+ OT_WHOLE_LINE,
+ NULL, true);
+ int lineno = -1;
+
+ if (!query_buf)
+ {
+ pg_log_error("no query buffer");
+ status = PSQL_CMD_ERROR;
+ }
+ else
+ {
+ Oid obj_oid = InvalidOid;
+ EditableObjectType eot = is_func ? EditableFunction : EditableView;
+
+ lineno = strip_lineno_from_objdesc(obj_desc);
+ if (lineno == 0)
+ {
+ /* error already reported */
+ status = PSQL_CMD_ERROR;
+ }
+ else if (!obj_desc)
+ {
+ /* set up an empty command to fill in */
+ resetPQExpBuffer(query_buf);
+ if (is_func)
+ appendPQExpBufferStr(query_buf,
+ "CREATE FUNCTION ( )\n"
+ " RETURNS \n"
+ " LANGUAGE \n"
+ " -- common options: IMMUTABLE STABLE STRICT SECURITY DEFINER\n"
+ "AS $function$\n"
+ "\n$function$\n");
+ else
+ appendPQExpBufferStr(query_buf,
+ "CREATE VIEW AS\n"
+ " SELECT \n"
+ " -- something...\n");
+ }
+ else if (!lookup_object_oid(eot, obj_desc, &obj_oid))
+ {
+ /* error already reported */
+ status = PSQL_CMD_ERROR;
+ }
+ else if (!get_create_object_cmd(eot, obj_oid, query_buf))
+ {
+ /* error already reported */
+ status = PSQL_CMD_ERROR;
+ }
+ else if (is_func && lineno > 0)
+ {
+ /*
+ * lineno "1" should correspond to the first line of the
+ * function body. We expect that pg_get_functiondef() will
+ * emit that on a line beginning with "AS ", "BEGIN ", or
+ * "RETURN ", and that there can be no such line before the
+ * real start of the function body. Increment lineno by the
+ * number of lines before that line, so that it becomes
+ * relative to the first line of the function definition.
+ */
+ const char *lines = query_buf->data;
+
+ while (*lines != '\0')
+ {
+ if (strncmp(lines, "AS ", 3) == 0 ||
+ strncmp(lines, "BEGIN ", 6) == 0 ||
+ strncmp(lines, "RETURN ", 7) == 0)
+ break;
+ lineno++;
+ /* find start of next line */
+ lines = strchr(lines, '\n');
+ if (!lines)
+ break;
+ lines++;
+ }
+ }
+ }
+
+ if (status != PSQL_CMD_ERROR)
+ {
+ bool edited = false;
+
+ if (!do_edit(NULL, query_buf, lineno, true, &edited))
+ status = PSQL_CMD_ERROR;
+ else if (!edited)
+ puts(_("No changes"));
+ else
+ status = PSQL_CMD_NEWEDIT;
+ }
+
+ if (obj_desc)
+ free(obj_desc);
+ }
+ else
+ ignore_slash_whole_line(scan_state);
+
+ return status;
+}
+
+/*
+ * \echo, \qecho, and \warn -- echo arguments to stdout, query output, or stderr
+ */
+static backslashResult
+exec_command_echo(PsqlScanState scan_state, bool active_branch, const char *cmd)
+{
+ if (active_branch)
+ {
+ char *value;
+ char quoted;
+ bool no_newline = false;
+ bool first = true;
+ FILE *fout;
+
+ if (strcmp(cmd, "qecho") == 0)
+ fout = pset.queryFout;
+ else if (strcmp(cmd, "warn") == 0)
+ fout = stderr;
+ else
+ fout = stdout;
+
+ while ((value = psql_scan_slash_option(scan_state,
+ OT_NORMAL, &quoted, false)))
+ {
+ if (first && !no_newline && !quoted && strcmp(value, "-n") == 0)
+ no_newline = true;
+ else
+ {
+ if (first)
+ first = false;
+ else
+ fputc(' ', fout);
+ fputs(value, fout);
+ }
+ free(value);
+ }
+ if (!no_newline)
+ fputs("\n", fout);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \encoding -- set/show client side encoding
+ */
+static backslashResult
+exec_command_encoding(PsqlScanState scan_state, bool active_branch)
+{
+ if (active_branch)
+ {
+ char *encoding = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (!encoding)
+ {
+ /* show encoding */
+ puts(pg_encoding_to_char(pset.encoding));
+ }
+ else
+ {
+ /* set encoding */
+ if (PQsetClientEncoding(pset.db, encoding) == -1)
+ pg_log_error("%s: invalid encoding name or conversion procedure not found", encoding);
+ else
+ {
+ /* save encoding info into psql internal data */
+ pset.encoding = PQclientEncoding(pset.db);
+ pset.popt.topt.encoding = pset.encoding;
+ SetVariable(pset.vars, "ENCODING",
+ pg_encoding_to_char(pset.encoding));
+ }
+ free(encoding);
+ }
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \errverbose -- display verbose message from last failed query
+ */
+static backslashResult
+exec_command_errverbose(PsqlScanState scan_state, bool active_branch)
+{
+ if (active_branch)
+ {
+ if (pset.last_error_result)
+ {
+ char *msg;
+
+ msg = PQresultVerboseErrorMessage(pset.last_error_result,
+ PQERRORS_VERBOSE,
+ PQSHOW_CONTEXT_ALWAYS);
+ if (msg)
+ {
+ pg_log_error("%s", msg);
+ PQfreemem(msg);
+ }
+ else
+ puts(_("out of memory"));
+ }
+ else
+ puts(_("There is no previous error."));
+ }
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \f -- change field separator
+ */
+static backslashResult
+exec_command_f(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *fname = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ success = do_pset("fieldsep", fname, &pset.popt, pset.quiet);
+ free(fname);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \g [(pset-option[=pset-value] ...)] [filename/shell-command]
+ * \gx [(pset-option[=pset-value] ...)] [filename/shell-command]
+ *
+ * Send the current query. If pset options are specified, they are made
+ * active just for this query. If a filename or pipe command is given,
+ * the query output goes there. \gx implicitly sets "expanded=on" along
+ * with any other pset options that are specified.
+ */
+static backslashResult
+exec_command_g(PsqlScanState scan_state, bool active_branch, const char *cmd)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+ char *fname;
+
+ /*
+ * Because the option processing for this is fairly complicated, we do it
+ * and then decide whether the branch is active.
+ */
+ fname = psql_scan_slash_option(scan_state,
+ OT_FILEPIPE, NULL, false);
+
+ if (fname && fname[0] == '(')
+ {
+ /* Consume pset options through trailing ')' ... */
+ status = process_command_g_options(fname + 1, scan_state,
+ active_branch, cmd);
+ free(fname);
+ /* ... and again attempt to scan the filename. */
+ fname = psql_scan_slash_option(scan_state,
+ OT_FILEPIPE, NULL, false);
+ }
+
+ if (status == PSQL_CMD_SKIP_LINE && active_branch)
+ {
+ if (!fname)
+ pset.gfname = NULL;
+ else
+ {
+ expand_tilde(&fname);
+ pset.gfname = pg_strdup(fname);
+ }
+ if (strcmp(cmd, "gx") == 0)
+ {
+ /* save settings if not done already, then force expanded=on */
+ if (pset.gsavepopt == NULL)
+ pset.gsavepopt = savePsetInfo(&pset.popt);
+ pset.popt.topt.expanded = 1;
+ }
+ status = PSQL_CMD_SEND;
+ }
+
+ free(fname);
+
+ return status;
+}
+
+/*
+ * Process parenthesized pset options for \g
+ *
+ * Note: okay to modify first_option, but not to free it; caller does that
+ */
+static backslashResult
+process_command_g_options(char *first_option, PsqlScanState scan_state,
+ bool active_branch, const char *cmd)
+{
+ bool success = true;
+ bool found_r_paren = false;
+
+ do
+ {
+ char *option;
+ size_t optlen;
+
+ /* If not first time through, collect a new option */
+ if (first_option)
+ option = first_option;
+ else
+ {
+ option = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+ if (!option)
+ {
+ if (active_branch)
+ {
+ pg_log_error("\\%s: missing right parenthesis", cmd);
+ success = false;
+ }
+ break;
+ }
+ }
+
+ /* Check for terminating right paren, and remove it from string */
+ optlen = strlen(option);
+ if (optlen > 0 && option[optlen - 1] == ')')
+ {
+ option[--optlen] = '\0';
+ found_r_paren = true;
+ }
+
+ /* If there was anything besides parentheses, parse/execute it */
+ if (optlen > 0)
+ {
+ /* We can have either "name" or "name=value" */
+ char *valptr = strchr(option, '=');
+
+ if (valptr)
+ *valptr++ = '\0';
+ if (active_branch)
+ {
+ /* save settings if not done already, then apply option */
+ if (pset.gsavepopt == NULL)
+ pset.gsavepopt = savePsetInfo(&pset.popt);
+ success &= do_pset(option, valptr, &pset.popt, true);
+ }
+ }
+
+ /* Clean up after this option. We should not free first_option. */
+ if (first_option)
+ first_option = NULL;
+ else
+ free(option);
+ } while (!found_r_paren);
+
+ /* If we failed after already changing some options, undo side-effects */
+ if (!success && active_branch && pset.gsavepopt)
+ {
+ restorePsetInfo(&pset.popt, pset.gsavepopt);
+ pset.gsavepopt = NULL;
+ }
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \gdesc -- describe query result
+ */
+static backslashResult
+exec_command_gdesc(PsqlScanState scan_state, bool active_branch)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ pset.gdesc_flag = true;
+ status = PSQL_CMD_SEND;
+ }
+
+ return status;
+}
+
+/*
+ * \getenv -- set variable from environment variable
+ */
+static backslashResult
+exec_command_getenv(PsqlScanState scan_state, bool active_branch,
+ const char *cmd)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *myvar = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+ char *envvar = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (!myvar || !envvar)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ success = false;
+ }
+ else
+ {
+ char *envval = getenv(envvar);
+
+ if (envval && !SetVariable(pset.vars, myvar, envval))
+ success = false;
+ }
+ free(myvar);
+ free(envvar);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \gexec -- send query and execute each field of result
+ */
+static backslashResult
+exec_command_gexec(PsqlScanState scan_state, bool active_branch)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ pset.gexec_flag = true;
+ status = PSQL_CMD_SEND;
+ }
+
+ return status;
+}
+
+/*
+ * \gset [prefix] -- send query and store result into variables
+ */
+static backslashResult
+exec_command_gset(PsqlScanState scan_state, bool active_branch)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ char *prefix = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (prefix)
+ pset.gset_prefix = prefix;
+ else
+ {
+ /* we must set a non-NULL prefix to trigger storing */
+ pset.gset_prefix = pg_strdup("");
+ }
+ /* gset_prefix is freed later */
+ status = PSQL_CMD_SEND;
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return status;
+}
+
+/*
+ * \help [topic] -- print help about SQL commands
+ */
+static backslashResult
+exec_command_help(PsqlScanState scan_state, bool active_branch)
+{
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_WHOLE_LINE, NULL, false);
+ size_t len;
+
+ /* strip any trailing spaces and semicolons */
+ if (opt)
+ {
+ len = strlen(opt);
+ while (len > 0 &&
+ (isspace((unsigned char) opt[len - 1])
+ || opt[len - 1] == ';'))
+ opt[--len] = '\0';
+ }
+
+ helpSQL(opt, pset.popt.topt.pager);
+ free(opt);
+ }
+ else
+ ignore_slash_whole_line(scan_state);
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \H and \html -- toggle HTML formatting
+ */
+static backslashResult
+exec_command_html(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ if (pset.popt.topt.format != PRINT_HTML)
+ success = do_pset("format", "html", &pset.popt, pset.quiet);
+ else
+ success = do_pset("format", "aligned", &pset.popt, pset.quiet);
+ }
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \i and \ir -- include a file
+ */
+static backslashResult
+exec_command_include(PsqlScanState scan_state, bool active_branch, const char *cmd)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *fname = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ if (!fname)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ success = false;
+ }
+ else
+ {
+ bool include_relative;
+
+ include_relative = (strcmp(cmd, "ir") == 0
+ || strcmp(cmd, "include_relative") == 0);
+ expand_tilde(&fname);
+ success = (process_file(fname, include_relative) == EXIT_SUCCESS);
+ free(fname);
+ }
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \if <expr> -- beginning of an \if..\endif block
+ *
+ * <expr> is parsed as a boolean expression. Invalid expressions will emit a
+ * warning and be treated as false. Statements that follow a false expression
+ * will be parsed but ignored. Note that in the case where an \if statement
+ * is itself within an inactive section of a block, then the entire inner
+ * \if..\endif block will be parsed but ignored.
+ */
+static backslashResult
+exec_command_if(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf)
+{
+ if (conditional_active(cstack))
+ {
+ /*
+ * First, push a new active stack entry; this ensures that the lexer
+ * will perform variable substitution and backtick evaluation while
+ * scanning the expression. (That should happen anyway, since we know
+ * we're in an active outer branch, but let's be sure.)
+ */
+ conditional_stack_push(cstack, IFSTATE_TRUE);
+
+ /* Remember current query state in case we need to restore later */
+ save_query_text_state(scan_state, cstack, query_buf);
+
+ /*
+ * Evaluate the expression; if it's false, change to inactive state.
+ */
+ if (!is_true_boolean_expression(scan_state, "\\if expression"))
+ conditional_stack_poke(cstack, IFSTATE_FALSE);
+ }
+ else
+ {
+ /*
+ * We're within an inactive outer branch, so this entire \if block
+ * will be ignored. We don't want to evaluate the expression, so push
+ * the "ignored" stack state before scanning it.
+ */
+ conditional_stack_push(cstack, IFSTATE_IGNORED);
+
+ /* Remember current query state in case we need to restore later */
+ save_query_text_state(scan_state, cstack, query_buf);
+
+ ignore_boolean_expression(scan_state);
+ }
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \elif <expr> -- alternative branch in an \if..\endif block
+ *
+ * <expr> is evaluated the same as in \if <expr>.
+ */
+static backslashResult
+exec_command_elif(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf)
+{
+ bool success = true;
+
+ switch (conditional_stack_peek(cstack))
+ {
+ case IFSTATE_TRUE:
+
+ /*
+ * Just finished active branch of this \if block. Update saved
+ * state so we will keep whatever data was put in query_buf by the
+ * active branch.
+ */
+ save_query_text_state(scan_state, cstack, query_buf);
+
+ /*
+ * Discard \elif expression and ignore the rest until \endif.
+ * Switch state before reading expression to ensure proper lexer
+ * behavior.
+ */
+ conditional_stack_poke(cstack, IFSTATE_IGNORED);
+ ignore_boolean_expression(scan_state);
+ break;
+ case IFSTATE_FALSE:
+
+ /*
+ * Discard any query text added by the just-skipped branch.
+ */
+ discard_query_text(scan_state, cstack, query_buf);
+
+ /*
+ * Have not yet found a true expression in this \if block, so this
+ * might be the first. We have to change state before examining
+ * the expression, or the lexer won't do the right thing.
+ */
+ conditional_stack_poke(cstack, IFSTATE_TRUE);
+ if (!is_true_boolean_expression(scan_state, "\\elif expression"))
+ conditional_stack_poke(cstack, IFSTATE_FALSE);
+ break;
+ case IFSTATE_IGNORED:
+
+ /*
+ * Discard any query text added by the just-skipped branch.
+ */
+ discard_query_text(scan_state, cstack, query_buf);
+
+ /*
+ * Skip expression and move on. Either the \if block already had
+ * an active section, or whole block is being skipped.
+ */
+ ignore_boolean_expression(scan_state);
+ break;
+ case IFSTATE_ELSE_TRUE:
+ case IFSTATE_ELSE_FALSE:
+ pg_log_error("\\elif: cannot occur after \\else");
+ success = false;
+ break;
+ case IFSTATE_NONE:
+ /* no \if to elif from */
+ pg_log_error("\\elif: no matching \\if");
+ success = false;
+ break;
+ }
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \else -- final alternative in an \if..\endif block
+ *
+ * Statements within an \else branch will only be executed if
+ * all previous \if and \elif expressions evaluated to false
+ * and the block was not itself being ignored.
+ */
+static backslashResult
+exec_command_else(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf)
+{
+ bool success = true;
+
+ switch (conditional_stack_peek(cstack))
+ {
+ case IFSTATE_TRUE:
+
+ /*
+ * Just finished active branch of this \if block. Update saved
+ * state so we will keep whatever data was put in query_buf by the
+ * active branch.
+ */
+ save_query_text_state(scan_state, cstack, query_buf);
+
+ /* Now skip the \else branch */
+ conditional_stack_poke(cstack, IFSTATE_ELSE_FALSE);
+ break;
+ case IFSTATE_FALSE:
+
+ /*
+ * Discard any query text added by the just-skipped branch.
+ */
+ discard_query_text(scan_state, cstack, query_buf);
+
+ /*
+ * We've not found any true \if or \elif expression, so execute
+ * the \else branch.
+ */
+ conditional_stack_poke(cstack, IFSTATE_ELSE_TRUE);
+ break;
+ case IFSTATE_IGNORED:
+
+ /*
+ * Discard any query text added by the just-skipped branch.
+ */
+ discard_query_text(scan_state, cstack, query_buf);
+
+ /*
+ * Either we previously processed the active branch of this \if,
+ * or the whole \if block is being skipped. Either way, skip the
+ * \else branch.
+ */
+ conditional_stack_poke(cstack, IFSTATE_ELSE_FALSE);
+ break;
+ case IFSTATE_ELSE_TRUE:
+ case IFSTATE_ELSE_FALSE:
+ pg_log_error("\\else: cannot occur after \\else");
+ success = false;
+ break;
+ case IFSTATE_NONE:
+ /* no \if to else from */
+ pg_log_error("\\else: no matching \\if");
+ success = false;
+ break;
+ }
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \endif -- ends an \if...\endif block
+ */
+static backslashResult
+exec_command_endif(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf)
+{
+ bool success = true;
+
+ switch (conditional_stack_peek(cstack))
+ {
+ case IFSTATE_TRUE:
+ case IFSTATE_ELSE_TRUE:
+ /* Close the \if block, keeping the query text */
+ success = conditional_stack_pop(cstack);
+ Assert(success);
+ break;
+ case IFSTATE_FALSE:
+ case IFSTATE_IGNORED:
+ case IFSTATE_ELSE_FALSE:
+
+ /*
+ * Discard any query text added by the just-skipped branch.
+ */
+ discard_query_text(scan_state, cstack, query_buf);
+
+ /* Close the \if block */
+ success = conditional_stack_pop(cstack);
+ Assert(success);
+ break;
+ case IFSTATE_NONE:
+ /* no \if to end */
+ pg_log_error("\\endif: no matching \\if");
+ success = false;
+ break;
+ }
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \l -- list databases
+ */
+static backslashResult
+exec_command_list(PsqlScanState scan_state, bool active_branch, const char *cmd)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *pattern;
+ bool show_verbose;
+
+ pattern = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ show_verbose = strchr(cmd, '+') ? true : false;
+
+ success = listAllDbs(pattern, show_verbose);
+
+ if (pattern)
+ free(pattern);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \lo_* -- large object operations
+ */
+static backslashResult
+exec_command_lo(PsqlScanState scan_state, bool active_branch, const char *cmd)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt1,
+ *opt2;
+
+ opt1 = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+ opt2 = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ if (strcmp(cmd + 3, "export") == 0)
+ {
+ if (!opt2)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ success = false;
+ }
+ else
+ {
+ expand_tilde(&opt2);
+ success = do_lo_export(opt1, opt2);
+ }
+ }
+
+ else if (strcmp(cmd + 3, "import") == 0)
+ {
+ if (!opt1)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ success = false;
+ }
+ else
+ {
+ expand_tilde(&opt1);
+ success = do_lo_import(opt1, opt2);
+ }
+ }
+
+ else if (strcmp(cmd + 3, "list") == 0)
+ success = listLargeObjects(false);
+ else if (strcmp(cmd + 3, "list+") == 0)
+ success = listLargeObjects(true);
+
+ else if (strcmp(cmd + 3, "unlink") == 0)
+ {
+ if (!opt1)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ success = false;
+ }
+ else
+ success = do_lo_unlink(opt1);
+ }
+
+ else
+ status = PSQL_CMD_UNKNOWN;
+
+ free(opt1);
+ free(opt2);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ if (!success)
+ status = PSQL_CMD_ERROR;
+
+ return status;
+}
+
+/*
+ * \o -- set query output
+ */
+static backslashResult
+exec_command_out(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *fname = psql_scan_slash_option(scan_state,
+ OT_FILEPIPE, NULL, true);
+
+ expand_tilde(&fname);
+ success = setQFout(fname);
+ free(fname);
+ }
+ else
+ ignore_slash_filepipe(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \p -- print the current query buffer
+ */
+static backslashResult
+exec_command_print(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf, PQExpBuffer previous_buf)
+{
+ if (active_branch)
+ {
+ /*
+ * We want to print the same thing \g would execute, but not to change
+ * the query buffer state; so we can't use copy_previous_query().
+ * Also, beware of possibility that buffer pointers are NULL.
+ */
+ if (query_buf && query_buf->len > 0)
+ puts(query_buf->data);
+ else if (previous_buf && previous_buf->len > 0)
+ puts(previous_buf->data);
+ else if (!pset.quiet)
+ puts(_("Query buffer is empty."));
+ fflush(stdout);
+ }
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \password -- set user password
+ */
+static backslashResult
+exec_command_password(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *user = psql_scan_slash_option(scan_state,
+ OT_SQLID, NULL, true);
+ char *pw1 = NULL;
+ char *pw2 = NULL;
+ PQExpBufferData buf;
+ PromptInterruptContext prompt_ctx;
+
+ if (user == NULL)
+ {
+ /* By default, the command applies to CURRENT_USER */
+ PGresult *res;
+
+ res = PSQLexec("SELECT CURRENT_USER");
+ if (!res)
+ return PSQL_CMD_ERROR;
+
+ user = pg_strdup(PQgetvalue(res, 0, 0));
+ PQclear(res);
+ }
+
+ /* Set up to let SIGINT cancel simple_prompt_extended() */
+ prompt_ctx.jmpbuf = sigint_interrupt_jmp;
+ prompt_ctx.enabled = &sigint_interrupt_enabled;
+ prompt_ctx.canceled = false;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf, _("Enter new password for user \"%s\": "), user);
+
+ pw1 = simple_prompt_extended(buf.data, false, &prompt_ctx);
+ if (!prompt_ctx.canceled)
+ pw2 = simple_prompt_extended("Enter it again: ", false, &prompt_ctx);
+
+ if (prompt_ctx.canceled)
+ {
+ /* fail silently */
+ success = false;
+ }
+ else if (strcmp(pw1, pw2) != 0)
+ {
+ pg_log_error("Passwords didn't match.");
+ success = false;
+ }
+ else
+ {
+ char *encrypted_password;
+
+ encrypted_password = PQencryptPasswordConn(pset.db, pw1, user, NULL);
+
+ if (!encrypted_password)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ success = false;
+ }
+ else
+ {
+ PGresult *res;
+
+ printfPQExpBuffer(&buf, "ALTER USER %s PASSWORD ",
+ fmtId(user));
+ appendStringLiteralConn(&buf, encrypted_password, pset.db);
+ res = PSQLexec(buf.data);
+ if (!res)
+ success = false;
+ else
+ PQclear(res);
+ PQfreemem(encrypted_password);
+ }
+ }
+
+ free(user);
+ if (pw1)
+ free(pw1);
+ if (pw2)
+ free(pw2);
+ termPQExpBuffer(&buf);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \prompt -- prompt and set variable
+ */
+static backslashResult
+exec_command_prompt(PsqlScanState scan_state, bool active_branch,
+ const char *cmd)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt,
+ *prompt_text = NULL;
+ char *arg1,
+ *arg2;
+
+ arg1 = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, false);
+ arg2 = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, false);
+
+ if (!arg1)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ success = false;
+ }
+ else
+ {
+ char *result;
+ PromptInterruptContext prompt_ctx;
+
+ /* Set up to let SIGINT cancel simple_prompt_extended() */
+ prompt_ctx.jmpbuf = sigint_interrupt_jmp;
+ prompt_ctx.enabled = &sigint_interrupt_enabled;
+ prompt_ctx.canceled = false;
+
+ if (arg2)
+ {
+ prompt_text = arg1;
+ opt = arg2;
+ }
+ else
+ opt = arg1;
+
+ if (!pset.inputfile)
+ {
+ result = simple_prompt_extended(prompt_text, true, &prompt_ctx);
+ }
+ else
+ {
+ if (prompt_text)
+ {
+ fputs(prompt_text, stdout);
+ fflush(stdout);
+ }
+ result = gets_fromFile(stdin);
+ if (!result)
+ {
+ pg_log_error("\\%s: could not read value for variable",
+ cmd);
+ success = false;
+ }
+ }
+
+ if (prompt_ctx.canceled ||
+ (result && !SetVariable(pset.vars, opt, result)))
+ success = false;
+
+ if (result)
+ free(result);
+ if (prompt_text)
+ free(prompt_text);
+ free(opt);
+ }
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \pset -- set printing parameters
+ */
+static backslashResult
+exec_command_pset(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt0 = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+ char *opt1 = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (!opt0)
+ {
+ /* list all variables */
+
+ int i;
+ static const char *const my_list[] = {
+ "border", "columns", "csv_fieldsep", "expanded", "fieldsep",
+ "fieldsep_zero", "footer", "format", "linestyle", "null",
+ "numericlocale", "pager", "pager_min_lines",
+ "recordsep", "recordsep_zero",
+ "tableattr", "title", "tuples_only",
+ "unicode_border_linestyle",
+ "unicode_column_linestyle",
+ "unicode_header_linestyle",
+ NULL
+ };
+
+ for (i = 0; my_list[i] != NULL; i++)
+ {
+ char *val = pset_value_string(my_list[i], &pset.popt);
+
+ printf("%-24s %s\n", my_list[i], val);
+ free(val);
+ }
+
+ success = true;
+ }
+ else
+ success = do_pset(opt0, opt1, &pset.popt, pset.quiet);
+
+ free(opt0);
+ free(opt1);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \q or \quit -- exit psql
+ */
+static backslashResult
+exec_command_quit(PsqlScanState scan_state, bool active_branch)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ status = PSQL_CMD_TERMINATE;
+
+ return status;
+}
+
+/*
+ * \r -- reset (clear) the query buffer
+ */
+static backslashResult
+exec_command_reset(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf)
+{
+ if (active_branch)
+ {
+ resetPQExpBuffer(query_buf);
+ psql_scan_reset(scan_state);
+ if (!pset.quiet)
+ puts(_("Query buffer reset (cleared)."));
+ }
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \s -- save history in a file or show it on the screen
+ */
+static backslashResult
+exec_command_s(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *fname = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ expand_tilde(&fname);
+ success = printHistory(fname, pset.popt.topt.pager);
+ if (success && !pset.quiet && fname)
+ printf(_("Wrote history to file \"%s\".\n"), fname);
+ if (!fname)
+ putchar('\n');
+ free(fname);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \set -- set variable
+ */
+static backslashResult
+exec_command_set(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt0 = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (!opt0)
+ {
+ /* list all variables */
+ PrintVariables(pset.vars);
+ success = true;
+ }
+ else
+ {
+ /*
+ * Set variable to the concatenation of the arguments.
+ */
+ char *newval;
+ char *opt;
+
+ opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+ newval = pg_strdup(opt ? opt : "");
+ free(opt);
+
+ while ((opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false)))
+ {
+ newval = pg_realloc(newval, strlen(newval) + strlen(opt) + 1);
+ strcat(newval, opt);
+ free(opt);
+ }
+
+ if (!SetVariable(pset.vars, opt0, newval))
+ success = false;
+
+ free(newval);
+ }
+ free(opt0);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \setenv -- set environment variable
+ */
+static backslashResult
+exec_command_setenv(PsqlScanState scan_state, bool active_branch,
+ const char *cmd)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *envvar = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+ char *envval = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (!envvar)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ success = false;
+ }
+ else if (strchr(envvar, '=') != NULL)
+ {
+ pg_log_error("\\%s: environment variable name must not contain \"=\"",
+ cmd);
+ success = false;
+ }
+ else if (!envval)
+ {
+ /* No argument - unset the environment variable */
+ unsetenv(envvar);
+ success = true;
+ }
+ else
+ {
+ /* Set variable to the value of the next argument */
+ setenv(envvar, envval, 1);
+ success = true;
+ }
+ free(envvar);
+ free(envval);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \sf/\sv -- show a function/view's source code
+ */
+static backslashResult
+exec_command_sf_sv(PsqlScanState scan_state, bool active_branch,
+ const char *cmd, bool is_func)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ bool show_linenumbers = (strchr(cmd, '+') != NULL);
+ PQExpBuffer buf;
+ char *obj_desc;
+ Oid obj_oid = InvalidOid;
+ EditableObjectType eot = is_func ? EditableFunction : EditableView;
+
+ buf = createPQExpBuffer();
+ obj_desc = psql_scan_slash_option(scan_state,
+ OT_WHOLE_LINE, NULL, true);
+ if (!obj_desc)
+ {
+ if (is_func)
+ pg_log_error("function name is required");
+ else
+ pg_log_error("view name is required");
+ status = PSQL_CMD_ERROR;
+ }
+ else if (!lookup_object_oid(eot, obj_desc, &obj_oid))
+ {
+ /* error already reported */
+ status = PSQL_CMD_ERROR;
+ }
+ else if (!get_create_object_cmd(eot, obj_oid, buf))
+ {
+ /* error already reported */
+ status = PSQL_CMD_ERROR;
+ }
+ else
+ {
+ FILE *output;
+ bool is_pager;
+
+ /* Select output stream: stdout, pager, or file */
+ if (pset.queryFout == stdout)
+ {
+ /* count lines in function to see if pager is needed */
+ int lineno = count_lines_in_buf(buf);
+
+ output = PageOutput(lineno, &(pset.popt.topt));
+ is_pager = true;
+ }
+ else
+ {
+ /* use previously set output file, without pager */
+ output = pset.queryFout;
+ is_pager = false;
+ }
+
+ if (show_linenumbers)
+ {
+ /* add line numbers */
+ print_with_linenumbers(output, buf->data, is_func);
+ }
+ else
+ {
+ /* just send the definition to output */
+ fputs(buf->data, output);
+ }
+
+ if (is_pager)
+ ClosePager(output);
+ }
+
+ if (obj_desc)
+ free(obj_desc);
+ destroyPQExpBuffer(buf);
+ }
+ else
+ ignore_slash_whole_line(scan_state);
+
+ return status;
+}
+
+/*
+ * \t -- turn off table headers and row count
+ */
+static backslashResult
+exec_command_t(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ success = do_pset("tuples_only", opt, &pset.popt, pset.quiet);
+ free(opt);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \T -- define html <table ...> attributes
+ */
+static backslashResult
+exec_command_T(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *value = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ success = do_pset("tableattr", value, &pset.popt, pset.quiet);
+ free(value);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \timing -- enable/disable timing of queries
+ */
+static backslashResult
+exec_command_timing(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (opt)
+ success = ParseVariableBool(opt, "\\timing", &pset.timing);
+ else
+ pset.timing = !pset.timing;
+ if (!pset.quiet)
+ {
+ if (pset.timing)
+ puts(_("Timing is on."));
+ else
+ puts(_("Timing is off."));
+ }
+ free(opt);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \unset -- unset variable
+ */
+static backslashResult
+exec_command_unset(PsqlScanState scan_state, bool active_branch,
+ const char *cmd)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (!opt)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ success = false;
+ }
+ else if (!SetVariable(pset.vars, opt, NULL))
+ success = false;
+
+ free(opt);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \w -- write query buffer to file
+ */
+static backslashResult
+exec_command_write(PsqlScanState scan_state, bool active_branch,
+ const char *cmd,
+ PQExpBuffer query_buf, PQExpBuffer previous_buf)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ char *fname = psql_scan_slash_option(scan_state,
+ OT_FILEPIPE, NULL, true);
+ FILE *fd = NULL;
+ bool is_pipe = false;
+
+ if (!query_buf)
+ {
+ pg_log_error("no query buffer");
+ status = PSQL_CMD_ERROR;
+ }
+ else
+ {
+ if (!fname)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ status = PSQL_CMD_ERROR;
+ }
+ else
+ {
+ expand_tilde(&fname);
+ if (fname[0] == '|')
+ {
+ is_pipe = true;
+ disable_sigpipe_trap();
+ fd = popen(&fname[1], "w");
+ }
+ else
+ {
+ canonicalize_path(fname);
+ fd = fopen(fname, "w");
+ }
+ if (!fd)
+ {
+ pg_log_error("%s: %m", fname);
+ status = PSQL_CMD_ERROR;
+ }
+ }
+ }
+
+ if (fd)
+ {
+ int result;
+
+ /*
+ * We want to print the same thing \g would execute, but not to
+ * change the query buffer state; so we can't use
+ * copy_previous_query(). Also, beware of possibility that buffer
+ * pointers are NULL.
+ */
+ if (query_buf && query_buf->len > 0)
+ fprintf(fd, "%s\n", query_buf->data);
+ else if (previous_buf && previous_buf->len > 0)
+ fprintf(fd, "%s\n", previous_buf->data);
+
+ if (is_pipe)
+ result = pclose(fd);
+ else
+ result = fclose(fd);
+
+ if (result == EOF)
+ {
+ pg_log_error("%s: %m", fname);
+ status = PSQL_CMD_ERROR;
+ }
+ }
+
+ if (is_pipe)
+ restore_sigpipe_trap();
+
+ free(fname);
+ }
+ else
+ ignore_slash_filepipe(scan_state);
+
+ return status;
+}
+
+/*
+ * \watch -- execute a query every N seconds
+ */
+static backslashResult
+exec_command_watch(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf, PQExpBuffer previous_buf)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+ double sleep = 2;
+
+ /* Convert optional sleep-length argument */
+ if (opt)
+ {
+ sleep = strtod(opt, NULL);
+ if (sleep <= 0)
+ sleep = 1;
+ free(opt);
+ }
+
+ /* If query_buf is empty, recall and execute previous query */
+ (void) copy_previous_query(query_buf, previous_buf);
+
+ success = do_watch(query_buf, sleep);
+
+ /* Reset the query buffer as though for \r */
+ resetPQExpBuffer(query_buf);
+ psql_scan_reset(scan_state);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \x -- set or toggle expanded table representation
+ */
+static backslashResult
+exec_command_x(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ success = do_pset("expanded", opt, &pset.popt, pset.quiet);
+ free(opt);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \z -- list table privileges (equivalent to \dp)
+ */
+static backslashResult
+exec_command_z(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *pattern = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ success = permissionsList(pattern);
+ if (pattern)
+ free(pattern);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \! -- execute shell command
+ */
+static backslashResult
+exec_command_shell_escape(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_WHOLE_LINE, NULL, false);
+
+ success = do_shell(opt);
+ free(opt);
+ }
+ else
+ ignore_slash_whole_line(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \? -- print help about backslash commands
+ */
+static backslashResult
+exec_command_slash_command_help(PsqlScanState scan_state, bool active_branch)
+{
+ if (active_branch)
+ {
+ char *opt0 = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (!opt0 || strcmp(opt0, "commands") == 0)
+ slashUsage(pset.popt.topt.pager);
+ else if (strcmp(opt0, "options") == 0)
+ usage(pset.popt.topt.pager);
+ else if (strcmp(opt0, "variables") == 0)
+ helpVariables(pset.popt.topt.pager);
+ else
+ slashUsage(pset.popt.topt.pager);
+
+ if (opt0)
+ free(opt0);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+
+/*
+ * Read and interpret an argument to the \connect slash command.
+ *
+ * Returns a malloc'd string, or NULL if no/empty argument.
+ */
+static char *
+read_connect_arg(PsqlScanState scan_state)
+{
+ char *result;
+ char quote;
+
+ /*
+ * Ideally we should treat the arguments as SQL identifiers. But for
+ * backwards compatibility with 7.2 and older pg_dump files, we have to
+ * take unquoted arguments verbatim (don't downcase them). For now,
+ * double-quoted arguments may be stripped of double quotes (as if SQL
+ * identifiers). By 7.4 or so, pg_dump files can be expected to
+ * double-quote all mixed-case \connect arguments, and then we can get rid
+ * of OT_SQLIDHACK.
+ */
+ result = psql_scan_slash_option(scan_state, OT_SQLIDHACK, &quote, true);
+
+ if (!result)
+ return NULL;
+
+ if (quote)
+ return result;
+
+ if (*result == '\0' || strcmp(result, "-") == 0)
+ {
+ free(result);
+ return NULL;
+ }
+
+ return result;
+}
+
+/*
+ * Read a boolean expression, return it as a PQExpBuffer string.
+ *
+ * Note: anything more or less than one token will certainly fail to be
+ * parsed by ParseVariableBool, so we don't worry about complaining here.
+ * This routine's return data structure will need to be rethought anyway
+ * to support likely future extensions such as "\if defined VARNAME".
+ */
+static PQExpBuffer
+gather_boolean_expression(PsqlScanState scan_state)
+{
+ PQExpBuffer exp_buf = createPQExpBuffer();
+ int num_options = 0;
+ char *value;
+
+ /* collect all arguments for the conditional command into exp_buf */
+ while ((value = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false)) != NULL)
+ {
+ /* add spaces between tokens */
+ if (num_options > 0)
+ appendPQExpBufferChar(exp_buf, ' ');
+ appendPQExpBufferStr(exp_buf, value);
+ num_options++;
+ free(value);
+ }
+
+ return exp_buf;
+}
+
+/*
+ * Read a boolean expression, return true if the expression
+ * was a valid boolean expression that evaluated to true.
+ * Otherwise return false.
+ *
+ * Note: conditional stack's top state must be active, else lexer will
+ * fail to expand variables and backticks.
+ */
+static bool
+is_true_boolean_expression(PsqlScanState scan_state, const char *name)
+{
+ PQExpBuffer buf = gather_boolean_expression(scan_state);
+ bool value = false;
+ bool success = ParseVariableBool(buf->data, name, &value);
+
+ destroyPQExpBuffer(buf);
+ return success && value;
+}
+
+/*
+ * Read a boolean expression, but do nothing with it.
+ *
+ * Note: conditional stack's top state must be INACTIVE, else lexer will
+ * expand variables and backticks, which we do not want here.
+ */
+static void
+ignore_boolean_expression(PsqlScanState scan_state)
+{
+ PQExpBuffer buf = gather_boolean_expression(scan_state);
+
+ destroyPQExpBuffer(buf);
+}
+
+/*
+ * Read and discard "normal" slash command options.
+ *
+ * This should be used for inactive-branch processing of any slash command
+ * that eats one or more OT_NORMAL, OT_SQLID, or OT_SQLIDHACK parameters.
+ * We don't need to worry about exactly how many it would eat, since the
+ * cleanup logic in HandleSlashCmds would silently discard any extras anyway.
+ */
+static void
+ignore_slash_options(PsqlScanState scan_state)
+{
+ char *arg;
+
+ while ((arg = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false)) != NULL)
+ free(arg);
+}
+
+/*
+ * Read and discard FILEPIPE slash command argument.
+ *
+ * This *MUST* be used for inactive-branch processing of any slash command
+ * that takes an OT_FILEPIPE option. Otherwise we might consume a different
+ * amount of option text in active and inactive cases.
+ */
+static void
+ignore_slash_filepipe(PsqlScanState scan_state)
+{
+ char *arg = psql_scan_slash_option(scan_state,
+ OT_FILEPIPE, NULL, false);
+
+ if (arg)
+ free(arg);
+}
+
+/*
+ * Read and discard whole-line slash command argument.
+ *
+ * This *MUST* be used for inactive-branch processing of any slash command
+ * that takes an OT_WHOLE_LINE option. Otherwise we might consume a different
+ * amount of option text in active and inactive cases.
+ */
+static void
+ignore_slash_whole_line(PsqlScanState scan_state)
+{
+ char *arg = psql_scan_slash_option(scan_state,
+ OT_WHOLE_LINE, NULL, false);
+
+ if (arg)
+ free(arg);
+}
+
+/*
+ * Return true if the command given is a branching command.
+ */
+static bool
+is_branching_command(const char *cmd)
+{
+ return (strcmp(cmd, "if") == 0 ||
+ strcmp(cmd, "elif") == 0 ||
+ strcmp(cmd, "else") == 0 ||
+ strcmp(cmd, "endif") == 0);
+}
+
+/*
+ * Prepare to possibly restore query buffer to its current state
+ * (cf. discard_query_text).
+ *
+ * We need to remember the length of the query buffer, and the lexer's
+ * notion of the parenthesis nesting depth.
+ */
+static void
+save_query_text_state(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf)
+{
+ if (query_buf)
+ conditional_stack_set_query_len(cstack, query_buf->len);
+ conditional_stack_set_paren_depth(cstack,
+ psql_scan_get_paren_depth(scan_state));
+}
+
+/*
+ * Discard any query text absorbed during an inactive conditional branch.
+ *
+ * We must discard data that was appended to query_buf during an inactive
+ * \if branch. We don't have to do anything there if there's no query_buf.
+ *
+ * Also, reset the lexer state to the same paren depth there was before.
+ * (The rest of its state doesn't need attention, since we could not be
+ * inside a comment or literal or partial token.)
+ */
+static void
+discard_query_text(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf)
+{
+ if (query_buf)
+ {
+ int new_len = conditional_stack_get_query_len(cstack);
+
+ Assert(new_len >= 0 && new_len <= query_buf->len);
+ query_buf->len = new_len;
+ query_buf->data[new_len] = '\0';
+ }
+ psql_scan_set_paren_depth(scan_state,
+ conditional_stack_get_paren_depth(cstack));
+}
+
+/*
+ * If query_buf is empty, copy previous_buf into it.
+ *
+ * This is used by various slash commands for which re-execution of a
+ * previous query is a common usage. For convenience, we allow the
+ * case of query_buf == NULL (and do nothing).
+ *
+ * Returns "true" if the previous query was copied into the query
+ * buffer, else "false".
+ */
+static bool
+copy_previous_query(PQExpBuffer query_buf, PQExpBuffer previous_buf)
+{
+ if (query_buf && query_buf->len == 0)
+ {
+ appendPQExpBufferStr(query_buf, previous_buf->data);
+ return true;
+ }
+ return false;
+}
+
+/*
+ * Ask the user for a password; 'username' is the username the
+ * password is for, if one has been explicitly specified.
+ * Returns a malloc'd string.
+ * If 'canceled' is provided, *canceled will be set to true if the prompt
+ * is canceled via SIGINT, and to false otherwise.
+ */
+static char *
+prompt_for_password(const char *username, bool *canceled)
+{
+ char *result;
+ PromptInterruptContext prompt_ctx;
+
+ /* Set up to let SIGINT cancel simple_prompt_extended() */
+ prompt_ctx.jmpbuf = sigint_interrupt_jmp;
+ prompt_ctx.enabled = &sigint_interrupt_enabled;
+ prompt_ctx.canceled = false;
+
+ if (username == NULL || username[0] == '\0')
+ result = simple_prompt_extended("Password: ", false, &prompt_ctx);
+ else
+ {
+ char *prompt_text;
+
+ prompt_text = psprintf(_("Password for user %s: "), username);
+ result = simple_prompt_extended(prompt_text, false, &prompt_ctx);
+ free(prompt_text);
+ }
+
+ if (canceled)
+ *canceled = prompt_ctx.canceled;
+
+ return result;
+}
+
+static bool
+param_is_newly_set(const char *old_val, const char *new_val)
+{
+ if (new_val == NULL)
+ return false;
+
+ if (old_val == NULL || strcmp(old_val, new_val) != 0)
+ return true;
+
+ return false;
+}
+
+/*
+ * do_connect -- handler for \connect
+ *
+ * Connects to a database with given parameters. If we are told to re-use
+ * parameters, parameters from the previous connection are used where the
+ * command's own options do not supply a value. Otherwise, libpq defaults
+ * are used.
+ *
+ * In interactive mode, if connection fails with the given parameters,
+ * the old connection will be kept.
+ */
+static bool
+do_connect(enum trivalue reuse_previous_specification,
+ char *dbname, char *user, char *host, char *port)
+{
+ PGconn *o_conn = pset.db,
+ *n_conn = NULL;
+ PQconninfoOption *cinfo;
+ int nconnopts = 0;
+ bool same_host = false;
+ char *password = NULL;
+ char *client_encoding;
+ bool success = true;
+ bool keep_password = true;
+ bool has_connection_string;
+ bool reuse_previous;
+
+ has_connection_string = dbname ?
+ recognized_connection_string(dbname) : false;
+
+ /* Complain if we have additional arguments after a connection string. */
+ if (has_connection_string && (user || host || port))
+ {
+ pg_log_error("Do not give user, host, or port separately when using a connection string");
+ return false;
+ }
+
+ switch (reuse_previous_specification)
+ {
+ case TRI_YES:
+ reuse_previous = true;
+ break;
+ case TRI_NO:
+ reuse_previous = false;
+ break;
+ default:
+ reuse_previous = !has_connection_string;
+ break;
+ }
+
+ /*
+ * If we intend to re-use connection parameters, collect them out of the
+ * old connection, then replace individual values as necessary. (We may
+ * need to resort to looking at pset.dead_conn, if the connection died
+ * previously.) Otherwise, obtain a PQconninfoOption array containing
+ * libpq's defaults, and modify that. Note this function assumes that
+ * PQconninfo, PQconndefaults, and PQconninfoParse will all produce arrays
+ * containing the same options in the same order.
+ */
+ if (reuse_previous)
+ {
+ if (o_conn)
+ cinfo = PQconninfo(o_conn);
+ else if (pset.dead_conn)
+ cinfo = PQconninfo(pset.dead_conn);
+ else
+ {
+ /* This is reachable after a non-interactive \connect failure */
+ pg_log_error("No database connection exists to re-use parameters from");
+ return false;
+ }
+ }
+ else
+ cinfo = PQconndefaults();
+
+ if (cinfo)
+ {
+ if (has_connection_string)
+ {
+ /* Parse the connstring and insert values into cinfo */
+ PQconninfoOption *replcinfo;
+ char *errmsg;
+
+ replcinfo = PQconninfoParse(dbname, &errmsg);
+ if (replcinfo)
+ {
+ PQconninfoOption *ci;
+ PQconninfoOption *replci;
+ bool have_password = false;
+
+ for (ci = cinfo, replci = replcinfo;
+ ci->keyword && replci->keyword;
+ ci++, replci++)
+ {
+ Assert(strcmp(ci->keyword, replci->keyword) == 0);
+ /* Insert value from connstring if one was provided */
+ if (replci->val)
+ {
+ /*
+ * We know that both val strings were allocated by
+ * libpq, so the least messy way to avoid memory leaks
+ * is to swap them.
+ */
+ char *swap = replci->val;
+
+ replci->val = ci->val;
+ ci->val = swap;
+
+ /*
+ * Check whether connstring provides options affecting
+ * password re-use. While any change in user, host,
+ * hostaddr, or port causes us to ignore the old
+ * connection's password, we don't force that for
+ * dbname, since passwords aren't database-specific.
+ */
+ if (replci->val == NULL ||
+ strcmp(ci->val, replci->val) != 0)
+ {
+ if (strcmp(replci->keyword, "user") == 0 ||
+ strcmp(replci->keyword, "host") == 0 ||
+ strcmp(replci->keyword, "hostaddr") == 0 ||
+ strcmp(replci->keyword, "port") == 0)
+ keep_password = false;
+ }
+ /* Also note whether connstring contains a password. */
+ if (strcmp(replci->keyword, "password") == 0)
+ have_password = true;
+ }
+ else if (!reuse_previous)
+ {
+ /*
+ * When we have a connstring and are not re-using
+ * parameters, swap *all* entries, even those not set
+ * by the connstring. This avoids absorbing
+ * environment-dependent defaults from the result of
+ * PQconndefaults(). We don't want to do that because
+ * they'd override service-file entries if the
+ * connstring specifies a service parameter, whereas
+ * the priority should be the other way around. libpq
+ * can certainly recompute any defaults we don't pass
+ * here. (In this situation, it's a bit wasteful to
+ * have called PQconndefaults() at all, but not doing
+ * so would require yet another major code path here.)
+ */
+ replci->val = ci->val;
+ ci->val = NULL;
+ }
+ }
+ Assert(ci->keyword == NULL && replci->keyword == NULL);
+
+ /* While here, determine how many option slots there are */
+ nconnopts = ci - cinfo;
+
+ PQconninfoFree(replcinfo);
+
+ /*
+ * If the connstring contains a password, tell the loop below
+ * that we may use it, regardless of other settings (i.e.,
+ * cinfo's password is no longer an "old" password).
+ */
+ if (have_password)
+ keep_password = true;
+
+ /* Don't let code below try to inject dbname into params. */
+ dbname = NULL;
+ }
+ else
+ {
+ /* PQconninfoParse failed */
+ if (errmsg)
+ {
+ pg_log_error("%s", errmsg);
+ PQfreemem(errmsg);
+ }
+ else
+ pg_log_error("out of memory");
+ success = false;
+ }
+ }
+ else
+ {
+ /*
+ * If dbname isn't a connection string, then we'll inject it and
+ * the other parameters into the keyword array below. (We can't
+ * easily insert them into the cinfo array because of memory
+ * management issues: PQconninfoFree would misbehave on Windows.)
+ * However, to avoid dependencies on the order in which parameters
+ * appear in the array, make a preliminary scan to set
+ * keep_password and same_host correctly.
+ *
+ * While any change in user, host, or port causes us to ignore the
+ * old connection's password, we don't force that for dbname,
+ * since passwords aren't database-specific.
+ */
+ PQconninfoOption *ci;
+
+ for (ci = cinfo; ci->keyword; ci++)
+ {
+ if (user && strcmp(ci->keyword, "user") == 0)
+ {
+ if (!(ci->val && strcmp(user, ci->val) == 0))
+ keep_password = false;
+ }
+ else if (host && strcmp(ci->keyword, "host") == 0)
+ {
+ if (ci->val && strcmp(host, ci->val) == 0)
+ same_host = true;
+ else
+ keep_password = false;
+ }
+ else if (port && strcmp(ci->keyword, "port") == 0)
+ {
+ if (!(ci->val && strcmp(port, ci->val) == 0))
+ keep_password = false;
+ }
+ }
+
+ /* While here, determine how many option slots there are */
+ nconnopts = ci - cinfo;
+ }
+ }
+ else
+ {
+ /* We failed to create the cinfo structure */
+ pg_log_error("out of memory");
+ success = false;
+ }
+
+ /*
+ * If the user asked to be prompted for a password, ask for one now. If
+ * not, use the password from the old connection, provided the username
+ * etc have not changed. Otherwise, try to connect without a password
+ * first, and then ask for a password if needed.
+ *
+ * XXX: this behavior leads to spurious connection attempts recorded in
+ * the postmaster's log. But libpq offers no API that would let us obtain
+ * a password and then continue with the first connection attempt.
+ */
+ if (pset.getPassword == TRI_YES && success)
+ {
+ bool canceled = false;
+
+ /*
+ * If a connstring or URI is provided, we don't know which username
+ * will be used, since we haven't dug that out of the connstring.
+ * Don't risk issuing a misleading prompt. As in startup.c, it does
+ * not seem worth working harder, since this getPassword setting is
+ * normally only used in noninteractive cases.
+ */
+ password = prompt_for_password(has_connection_string ? NULL : user,
+ &canceled);
+ success = !canceled;
+ }
+
+ /*
+ * Consider whether to force client_encoding to "auto" (overriding
+ * anything in the connection string). We do so if we have a terminal
+ * connection and there is no PGCLIENTENCODING environment setting.
+ */
+ if (pset.notty || getenv("PGCLIENTENCODING"))
+ client_encoding = NULL;
+ else
+ client_encoding = "auto";
+
+ /* Loop till we have a connection or fail, which we might've already */
+ while (success)
+ {
+ const char **keywords = pg_malloc((nconnopts + 1) * sizeof(*keywords));
+ const char **values = pg_malloc((nconnopts + 1) * sizeof(*values));
+ int paramnum = 0;
+ PQconninfoOption *ci;
+
+ /*
+ * Copy non-default settings into the PQconnectdbParams parameter
+ * arrays; but inject any values specified old-style, as well as any
+ * interactively-obtained password, and a couple of fields we want to
+ * set forcibly.
+ *
+ * If you change this code, see also the initial-connection code in
+ * main().
+ */
+ for (ci = cinfo; ci->keyword; ci++)
+ {
+ keywords[paramnum] = ci->keyword;
+
+ if (dbname && strcmp(ci->keyword, "dbname") == 0)
+ values[paramnum++] = dbname;
+ else if (user && strcmp(ci->keyword, "user") == 0)
+ values[paramnum++] = user;
+ else if (host && strcmp(ci->keyword, "host") == 0)
+ values[paramnum++] = host;
+ else if (host && !same_host && strcmp(ci->keyword, "hostaddr") == 0)
+ {
+ /* If we're changing the host value, drop any old hostaddr */
+ values[paramnum++] = NULL;
+ }
+ else if (port && strcmp(ci->keyword, "port") == 0)
+ values[paramnum++] = port;
+ /* If !keep_password, we unconditionally drop old password */
+ else if ((password || !keep_password) &&
+ strcmp(ci->keyword, "password") == 0)
+ values[paramnum++] = password;
+ else if (strcmp(ci->keyword, "fallback_application_name") == 0)
+ values[paramnum++] = pset.progname;
+ else if (client_encoding &&
+ strcmp(ci->keyword, "client_encoding") == 0)
+ values[paramnum++] = client_encoding;
+ else if (ci->val)
+ values[paramnum++] = ci->val;
+ /* else, don't bother making libpq parse this keyword */
+ }
+ /* add array terminator */
+ keywords[paramnum] = NULL;
+ values[paramnum] = NULL;
+
+ /* Note we do not want libpq to re-expand the dbname parameter */
+ n_conn = PQconnectdbParams(keywords, values, false);
+
+ pg_free(keywords);
+ pg_free(values);
+
+ if (PQstatus(n_conn) == CONNECTION_OK)
+ break;
+
+ /*
+ * Connection attempt failed; either retry the connection attempt with
+ * a new password, or give up.
+ */
+ if (!password && PQconnectionNeedsPassword(n_conn) && pset.getPassword != TRI_NO)
+ {
+ bool canceled = false;
+
+ /*
+ * Prompt for password using the username we actually connected
+ * with --- it might've come out of "dbname" rather than "user".
+ */
+ password = prompt_for_password(PQuser(n_conn), &canceled);
+ PQfinish(n_conn);
+ n_conn = NULL;
+ success = !canceled;
+ continue;
+ }
+
+ /*
+ * We'll report the error below ... unless n_conn is NULL, indicating
+ * that libpq didn't have enough memory to make a PGconn.
+ */
+ if (n_conn == NULL)
+ pg_log_error("out of memory");
+
+ success = false;
+ } /* end retry loop */
+
+ /* Release locally allocated data, whether we succeeded or not */
+ if (password)
+ pg_free(password);
+ if (cinfo)
+ PQconninfoFree(cinfo);
+
+ if (!success)
+ {
+ /*
+ * Failed to connect to the database. In interactive mode, keep the
+ * previous connection to the DB; in scripting mode, close our
+ * previous connection as well.
+ */
+ if (pset.cur_cmd_interactive)
+ {
+ if (n_conn)
+ {
+ pg_log_info("%s", PQerrorMessage(n_conn));
+ PQfinish(n_conn);
+ }
+
+ /* pset.db is left unmodified */
+ if (o_conn)
+ pg_log_info("Previous connection kept");
+ }
+ else
+ {
+ if (n_conn)
+ {
+ pg_log_error("\\connect: %s", PQerrorMessage(n_conn));
+ PQfinish(n_conn);
+ }
+
+ if (o_conn)
+ {
+ /*
+ * Transition to having no connection.
+ *
+ * Unlike CheckConnection(), we close the old connection
+ * immediately to prevent its parameters from being re-used.
+ * This is so that a script cannot accidentally reuse
+ * parameters it did not expect to. Otherwise, the state
+ * cleanup should be the same as in CheckConnection().
+ */
+ PQfinish(o_conn);
+ pset.db = NULL;
+ ResetCancelConn();
+ UnsyncVariables();
+ }
+
+ /* On the same reasoning, release any dead_conn to prevent reuse */
+ if (pset.dead_conn)
+ {
+ PQfinish(pset.dead_conn);
+ pset.dead_conn = NULL;
+ }
+ }
+
+ return false;
+ }
+
+ /*
+ * Replace the old connection with the new one, and update
+ * connection-dependent variables. Keep the resynchronization logic in
+ * sync with CheckConnection().
+ */
+ PQsetNoticeProcessor(n_conn, NoticeProcessor, NULL);
+ pset.db = n_conn;
+ SyncVariables();
+ connection_warnings(false); /* Must be after SyncVariables */
+
+ /* Tell the user about the new connection */
+ if (!pset.quiet)
+ {
+ if (!o_conn ||
+ param_is_newly_set(PQhost(o_conn), PQhost(pset.db)) ||
+ param_is_newly_set(PQport(o_conn), PQport(pset.db)))
+ {
+ char *host = PQhost(pset.db);
+ char *hostaddr = PQhostaddr(pset.db);
+
+ if (is_unixsock_path(host))
+ {
+ /* hostaddr overrides host */
+ if (hostaddr && *hostaddr)
+ printf(_("You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"),
+ PQdb(pset.db), PQuser(pset.db), hostaddr, PQport(pset.db));
+ else
+ printf(_("You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"),
+ PQdb(pset.db), PQuser(pset.db), host, PQport(pset.db));
+ }
+ else
+ {
+ if (hostaddr && *hostaddr && strcmp(host, hostaddr) != 0)
+ printf(_("You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"),
+ PQdb(pset.db), PQuser(pset.db), host, hostaddr, PQport(pset.db));
+ else
+ printf(_("You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"),
+ PQdb(pset.db), PQuser(pset.db), host, PQport(pset.db));
+ }
+ }
+ else
+ printf(_("You are now connected to database \"%s\" as user \"%s\".\n"),
+ PQdb(pset.db), PQuser(pset.db));
+ }
+
+ /* Drop no-longer-needed connection(s) */
+ if (o_conn)
+ PQfinish(o_conn);
+ if (pset.dead_conn)
+ {
+ PQfinish(pset.dead_conn);
+ pset.dead_conn = NULL;
+ }
+
+ return true;
+}
+
+
+void
+connection_warnings(bool in_startup)
+{
+ if (!pset.quiet && !pset.notty)
+ {
+ int client_ver = PG_VERSION_NUM;
+ char cverbuf[32];
+ char sverbuf[32];
+
+ if (pset.sversion != client_ver)
+ {
+ const char *server_version;
+
+ /* Try to get full text form, might include "devel" etc */
+ server_version = PQparameterStatus(pset.db, "server_version");
+ /* Otherwise fall back on pset.sversion */
+ if (!server_version)
+ {
+ formatPGVersionNumber(pset.sversion, true,
+ sverbuf, sizeof(sverbuf));
+ server_version = sverbuf;
+ }
+
+ printf(_("%s (%s, server %s)\n"),
+ pset.progname, PG_VERSION, server_version);
+ }
+ /* For version match, only print psql banner on startup. */
+ else if (in_startup)
+ printf("%s (%s)\n", pset.progname, PG_VERSION);
+
+ /*
+ * Warn if server's major version is newer than ours, or if server
+ * predates our support cutoff (currently 9.2).
+ */
+ if (pset.sversion / 100 > client_ver / 100 ||
+ pset.sversion < 90200)
+ printf(_("WARNING: %s major version %s, server major version %s.\n"
+ " Some psql features might not work.\n"),
+ pset.progname,
+ formatPGVersionNumber(client_ver, false,
+ cverbuf, sizeof(cverbuf)),
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+
+#ifdef WIN32
+ if (in_startup)
+ checkWin32Codepage();
+#endif
+ printSSLInfo();
+ printGSSInfo();
+ }
+}
+
+
+/*
+ * printSSLInfo
+ *
+ * Prints information about the current SSL connection, if SSL is in use
+ */
+static void
+printSSLInfo(void)
+{
+ const char *protocol;
+ const char *cipher;
+ const char *compression;
+
+ if (!PQsslInUse(pset.db))
+ return; /* no SSL */
+
+ protocol = PQsslAttribute(pset.db, "protocol");
+ cipher = PQsslAttribute(pset.db, "cipher");
+ compression = PQsslAttribute(pset.db, "compression");
+
+ printf(_("SSL connection (protocol: %s, cipher: %s, compression: %s)\n"),
+ protocol ? protocol : _("unknown"),
+ cipher ? cipher : _("unknown"),
+ (compression && strcmp(compression, "off") != 0) ? _("on") : _("off"));
+}
+
+/*
+ * printGSSInfo
+ *
+ * Prints information about the current GSSAPI connection, if GSSAPI encryption is in use
+ */
+static void
+printGSSInfo(void)
+{
+ if (!PQgssEncInUse(pset.db))
+ return; /* no GSSAPI encryption in use */
+
+ printf(_("GSSAPI-encrypted connection\n"));
+}
+
+
+/*
+ * checkWin32Codepage
+ *
+ * Prints a warning when win32 console codepage differs from Windows codepage
+ */
+#ifdef WIN32
+static void
+checkWin32Codepage(void)
+{
+ unsigned int wincp,
+ concp;
+
+ wincp = GetACP();
+ concp = GetConsoleCP();
+ if (wincp != concp)
+ {
+ printf(_("WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+ " 8-bit characters might not work correctly. See psql reference\n"
+ " page \"Notes for Windows users\" for details.\n"),
+ concp, wincp);
+ }
+}
+#endif
+
+
+/*
+ * SyncVariables
+ *
+ * Make psql's internal variables agree with connection state upon
+ * establishing a new connection.
+ */
+void
+SyncVariables(void)
+{
+ char vbuf[32];
+ const char *server_version;
+
+ /* get stuff from connection */
+ pset.encoding = PQclientEncoding(pset.db);
+ pset.popt.topt.encoding = pset.encoding;
+ pset.sversion = PQserverVersion(pset.db);
+
+ SetVariable(pset.vars, "DBNAME", PQdb(pset.db));
+ SetVariable(pset.vars, "USER", PQuser(pset.db));
+ SetVariable(pset.vars, "HOST", PQhost(pset.db));
+ SetVariable(pset.vars, "PORT", PQport(pset.db));
+ SetVariable(pset.vars, "ENCODING", pg_encoding_to_char(pset.encoding));
+
+ /* this bit should match connection_warnings(): */
+ /* Try to get full text form of version, might include "devel" etc */
+ server_version = PQparameterStatus(pset.db, "server_version");
+ /* Otherwise fall back on pset.sversion */
+ if (!server_version)
+ {
+ formatPGVersionNumber(pset.sversion, true, vbuf, sizeof(vbuf));
+ server_version = vbuf;
+ }
+ SetVariable(pset.vars, "SERVER_VERSION_NAME", server_version);
+
+ snprintf(vbuf, sizeof(vbuf), "%d", pset.sversion);
+ SetVariable(pset.vars, "SERVER_VERSION_NUM", vbuf);
+
+ /* send stuff to it, too */
+ PQsetErrorVerbosity(pset.db, pset.verbosity);
+ PQsetErrorContextVisibility(pset.db, pset.show_context);
+}
+
+/*
+ * UnsyncVariables
+ *
+ * Clear variables that should be not be set when there is no connection.
+ */
+void
+UnsyncVariables(void)
+{
+ SetVariable(pset.vars, "DBNAME", NULL);
+ SetVariable(pset.vars, "USER", NULL);
+ SetVariable(pset.vars, "HOST", NULL);
+ SetVariable(pset.vars, "PORT", NULL);
+ SetVariable(pset.vars, "ENCODING", NULL);
+ SetVariable(pset.vars, "SERVER_VERSION_NAME", NULL);
+ SetVariable(pset.vars, "SERVER_VERSION_NUM", NULL);
+}
+
+
+/*
+ * helper for do_edit(): actually invoke the editor
+ *
+ * Returns true on success, false if we failed to invoke the editor or
+ * it returned nonzero status. (An error message is printed for failed-
+ * to-invoke cases, but not if the editor returns nonzero status.)
+ */
+static bool
+editFile(const char *fname, int lineno)
+{
+ const char *editorName;
+ const char *editor_lineno_arg = NULL;
+ char *sys;
+ int result;
+
+ Assert(fname != NULL);
+
+ /* Find an editor to use */
+ editorName = getenv("PSQL_EDITOR");
+ if (!editorName)
+ editorName = getenv("EDITOR");
+ if (!editorName)
+ editorName = getenv("VISUAL");
+ if (!editorName)
+ editorName = DEFAULT_EDITOR;
+
+ /* Get line number argument, if we need it. */
+ if (lineno > 0)
+ {
+ editor_lineno_arg = getenv("PSQL_EDITOR_LINENUMBER_ARG");
+#ifdef DEFAULT_EDITOR_LINENUMBER_ARG
+ if (!editor_lineno_arg)
+ editor_lineno_arg = DEFAULT_EDITOR_LINENUMBER_ARG;
+#endif
+ if (!editor_lineno_arg)
+ {
+ pg_log_error("environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number");
+ return false;
+ }
+ }
+
+ /*
+ * On Unix the EDITOR value should *not* be quoted, since it might include
+ * switches, eg, EDITOR="pico -t"; it's up to the user to put quotes in it
+ * if necessary. But this policy is not very workable on Windows, due to
+ * severe brain damage in their command shell plus the fact that standard
+ * program paths include spaces.
+ */
+#ifndef WIN32
+ if (lineno > 0)
+ sys = psprintf("exec %s %s%d '%s'",
+ editorName, editor_lineno_arg, lineno, fname);
+ else
+ sys = psprintf("exec %s '%s'",
+ editorName, fname);
+#else
+ if (lineno > 0)
+ sys = psprintf("\"%s\" %s%d \"%s\"",
+ editorName, editor_lineno_arg, lineno, fname);
+ else
+ sys = psprintf("\"%s\" \"%s\"",
+ editorName, fname);
+#endif
+ result = system(sys);
+ if (result == -1)
+ pg_log_error("could not start editor \"%s\"", editorName);
+ else if (result == 127)
+ pg_log_error("could not start /bin/sh");
+ free(sys);
+
+ return result == 0;
+}
+
+
+/*
+ * do_edit -- handler for \e
+ *
+ * If you do not specify a filename, the current query buffer will be copied
+ * into a temporary file.
+ *
+ * After this function is done, the resulting file will be copied back into the
+ * query buffer. As an exception to this, the query buffer will be emptied
+ * if the file was not modified (or the editor failed) and the caller passes
+ * "discard_on_quit" = true.
+ *
+ * If "edited" isn't NULL, *edited will be set to true if the query buffer
+ * is successfully replaced.
+ */
+static bool
+do_edit(const char *filename_arg, PQExpBuffer query_buf,
+ int lineno, bool discard_on_quit, bool *edited)
+{
+ char fnametmp[MAXPGPATH];
+ FILE *stream = NULL;
+ const char *fname;
+ bool error = false;
+ int fd;
+ struct stat before,
+ after;
+
+ if (filename_arg)
+ fname = filename_arg;
+ else
+ {
+ /* make a temp file to edit */
+#ifndef WIN32
+ const char *tmpdir = getenv("TMPDIR");
+
+ if (!tmpdir)
+ tmpdir = "/tmp";
+#else
+ char tmpdir[MAXPGPATH];
+ int ret;
+
+ ret = GetTempPath(MAXPGPATH, tmpdir);
+ if (ret == 0 || ret > MAXPGPATH)
+ {
+ pg_log_error("could not locate temporary directory: %s",
+ !ret ? strerror(errno) : "");
+ return false;
+ }
+#endif
+
+ /*
+ * No canonicalize_path() here. EDIT.EXE run from CMD.EXE prepends the
+ * current directory to the supplied path unless we use only
+ * backslashes, so we do that.
+ */
+#ifndef WIN32
+ snprintf(fnametmp, sizeof(fnametmp), "%s%spsql.edit.%d.sql", tmpdir,
+ "/", (int) getpid());
+#else
+ snprintf(fnametmp, sizeof(fnametmp), "%s%spsql.edit.%d.sql", tmpdir,
+ "" /* trailing separator already present */ , (int) getpid());
+#endif
+
+ fname = (const char *) fnametmp;
+
+ fd = open(fname, O_WRONLY | O_CREAT | O_EXCL, 0600);
+ if (fd != -1)
+ stream = fdopen(fd, "w");
+
+ if (fd == -1 || !stream)
+ {
+ pg_log_error("could not open temporary file \"%s\": %m", fname);
+ error = true;
+ }
+ else
+ {
+ unsigned int ql = query_buf->len;
+
+ /* force newline-termination of what we send to editor */
+ if (ql > 0 && query_buf->data[ql - 1] != '\n')
+ {
+ appendPQExpBufferChar(query_buf, '\n');
+ ql++;
+ }
+
+ if (fwrite(query_buf->data, 1, ql, stream) != ql)
+ {
+ pg_log_error("%s: %m", fname);
+
+ if (fclose(stream) != 0)
+ pg_log_error("%s: %m", fname);
+
+ if (remove(fname) != 0)
+ pg_log_error("%s: %m", fname);
+
+ error = true;
+ }
+ else if (fclose(stream) != 0)
+ {
+ pg_log_error("%s: %m", fname);
+ if (remove(fname) != 0)
+ pg_log_error("%s: %m", fname);
+ error = true;
+ }
+ else
+ {
+ struct utimbuf ut;
+
+ /*
+ * Try to set the file modification time of the temporary file
+ * a few seconds in the past. Otherwise, the low granularity
+ * (one second, or even worse on some filesystems) that we can
+ * portably measure with stat(2) could lead us to not
+ * recognize a modification, if the user typed very quickly.
+ *
+ * This is a rather unlikely race condition, so don't error
+ * out if the utime(2) call fails --- that would make the cure
+ * worse than the disease.
+ */
+ ut.modtime = ut.actime = time(NULL) - 2;
+ (void) utime(fname, &ut);
+ }
+ }
+ }
+
+ if (!error && stat(fname, &before) != 0)
+ {
+ pg_log_error("%s: %m", fname);
+ error = true;
+ }
+
+ /* call editor */
+ if (!error)
+ error = !editFile(fname, lineno);
+
+ if (!error && stat(fname, &after) != 0)
+ {
+ pg_log_error("%s: %m", fname);
+ error = true;
+ }
+
+ /* file was edited if the size or modification time has changed */
+ if (!error &&
+ (before.st_size != after.st_size ||
+ before.st_mtime != after.st_mtime))
+ {
+ stream = fopen(fname, PG_BINARY_R);
+ if (!stream)
+ {
+ pg_log_error("%s: %m", fname);
+ error = true;
+ }
+ else
+ {
+ /* read file back into query_buf */
+ char line[1024];
+
+ resetPQExpBuffer(query_buf);
+ while (fgets(line, sizeof(line), stream) != NULL)
+ appendPQExpBufferStr(query_buf, line);
+
+ if (ferror(stream))
+ {
+ pg_log_error("%s: %m", fname);
+ error = true;
+ resetPQExpBuffer(query_buf);
+ }
+ else if (edited)
+ {
+ *edited = true;
+ }
+
+ fclose(stream);
+ }
+ }
+ else
+ {
+ /*
+ * If the file was not modified, and the caller requested it, discard
+ * the query buffer.
+ */
+ if (discard_on_quit)
+ resetPQExpBuffer(query_buf);
+ }
+
+ /* remove temp file */
+ if (!filename_arg)
+ {
+ if (remove(fname) == -1)
+ {
+ pg_log_error("%s: %m", fname);
+ error = true;
+ }
+ }
+
+ return !error;
+}
+
+
+
+/*
+ * process_file
+ *
+ * Reads commands from filename and passes them to the main processing loop.
+ * Handler for \i and \ir, but can be used for other things as well. Returns
+ * MainLoop() error code.
+ *
+ * If use_relative_path is true and filename is not an absolute path, then open
+ * the file from where the currently processed file (if any) is located.
+ */
+int
+process_file(char *filename, bool use_relative_path)
+{
+ FILE *fd;
+ int result;
+ char *oldfilename;
+ char relpath[MAXPGPATH];
+
+ if (!filename)
+ {
+ fd = stdin;
+ filename = NULL;
+ }
+ else if (strcmp(filename, "-") != 0)
+ {
+ canonicalize_path(filename);
+
+ /*
+ * If we were asked to resolve the pathname relative to the location
+ * of the currently executing script, and there is one, and this is a
+ * relative pathname, then prepend all but the last pathname component
+ * of the current script to this pathname.
+ */
+ if (use_relative_path && pset.inputfile &&
+ !is_absolute_path(filename) && !has_drive_prefix(filename))
+ {
+ strlcpy(relpath, pset.inputfile, sizeof(relpath));
+ get_parent_directory(relpath);
+ join_path_components(relpath, relpath, filename);
+ canonicalize_path(relpath);
+
+ filename = relpath;
+ }
+
+ fd = fopen(filename, PG_BINARY_R);
+
+ if (!fd)
+ {
+ pg_log_error("%s: %m", filename);
+ return EXIT_FAILURE;
+ }
+ }
+ else
+ {
+ fd = stdin;
+ filename = "<stdin>"; /* for future error messages */
+ }
+
+ oldfilename = pset.inputfile;
+ pset.inputfile = filename;
+
+ pg_logging_config(pset.inputfile ? 0 : PG_LOG_FLAG_TERSE);
+
+ result = MainLoop(fd);
+
+ if (fd != stdin)
+ fclose(fd);
+
+ pset.inputfile = oldfilename;
+
+ pg_logging_config(pset.inputfile ? 0 : PG_LOG_FLAG_TERSE);
+
+ return result;
+}
+
+
+
+static const char *
+_align2string(enum printFormat in)
+{
+ switch (in)
+ {
+ case PRINT_NOTHING:
+ return "nothing";
+ break;
+ case PRINT_ALIGNED:
+ return "aligned";
+ break;
+ case PRINT_ASCIIDOC:
+ return "asciidoc";
+ break;
+ case PRINT_CSV:
+ return "csv";
+ break;
+ case PRINT_HTML:
+ return "html";
+ break;
+ case PRINT_LATEX:
+ return "latex";
+ break;
+ case PRINT_LATEX_LONGTABLE:
+ return "latex-longtable";
+ break;
+ case PRINT_TROFF_MS:
+ return "troff-ms";
+ break;
+ case PRINT_UNALIGNED:
+ return "unaligned";
+ break;
+ case PRINT_WRAPPED:
+ return "wrapped";
+ break;
+ }
+ return "unknown";
+}
+
+/*
+ * Parse entered Unicode linestyle. If ok, update *linestyle and return
+ * true, else return false.
+ */
+static bool
+set_unicode_line_style(const char *value, size_t vallen,
+ unicode_linestyle *linestyle)
+{
+ if (pg_strncasecmp("single", value, vallen) == 0)
+ *linestyle = UNICODE_LINESTYLE_SINGLE;
+ else if (pg_strncasecmp("double", value, vallen) == 0)
+ *linestyle = UNICODE_LINESTYLE_DOUBLE;
+ else
+ return false;
+ return true;
+}
+
+static const char *
+_unicode_linestyle2string(int linestyle)
+{
+ switch (linestyle)
+ {
+ case UNICODE_LINESTYLE_SINGLE:
+ return "single";
+ break;
+ case UNICODE_LINESTYLE_DOUBLE:
+ return "double";
+ break;
+ }
+ return "unknown";
+}
+
+/*
+ * do_pset
+ *
+ * Performs the assignment "param = value", where value could be NULL;
+ * for some params that has an effect such as inversion, for others
+ * it does nothing.
+ *
+ * Adjusts the state of the formatting options at *popt. (In practice that
+ * is always pset.popt, but maybe someday it could be different.)
+ *
+ * If successful and quiet is false, then invokes printPsetInfo() to report
+ * the change.
+ *
+ * Returns true if successful, else false (eg for invalid param or value).
+ */
+bool
+do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
+{
+ size_t vallen = 0;
+
+ Assert(param != NULL);
+
+ if (value)
+ vallen = strlen(value);
+
+ /* set format */
+ if (strcmp(param, "format") == 0)
+ {
+ static const struct fmt
+ {
+ const char *name;
+ enum printFormat number;
+ } formats[] =
+ {
+ /* remember to update error message below when adding more */
+ {"aligned", PRINT_ALIGNED},
+ {"asciidoc", PRINT_ASCIIDOC},
+ {"csv", PRINT_CSV},
+ {"html", PRINT_HTML},
+ {"latex", PRINT_LATEX},
+ {"troff-ms", PRINT_TROFF_MS},
+ {"unaligned", PRINT_UNALIGNED},
+ {"wrapped", PRINT_WRAPPED}
+ };
+
+ if (!value)
+ ;
+ else
+ {
+ int match_pos = -1;
+
+ for (int i = 0; i < lengthof(formats); i++)
+ {
+ if (pg_strncasecmp(formats[i].name, value, vallen) == 0)
+ {
+ if (match_pos < 0)
+ match_pos = i;
+ else
+ {
+ pg_log_error("\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"",
+ value,
+ formats[match_pos].name, formats[i].name);
+ return false;
+ }
+ }
+ }
+ if (match_pos >= 0)
+ popt->topt.format = formats[match_pos].number;
+ else if (pg_strncasecmp("latex-longtable", value, vallen) == 0)
+ {
+ /*
+ * We must treat latex-longtable specially because latex is a
+ * prefix of it; if both were in the table above, we'd think
+ * "latex" is ambiguous.
+ */
+ popt->topt.format = PRINT_LATEX_LONGTABLE;
+ }
+ else
+ {
+ pg_log_error("\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped");
+ return false;
+ }
+ }
+ }
+
+ /* set table line style */
+ else if (strcmp(param, "linestyle") == 0)
+ {
+ if (!value)
+ ;
+ else if (pg_strncasecmp("ascii", value, vallen) == 0)
+ popt->topt.line_style = &pg_asciiformat;
+ else if (pg_strncasecmp("old-ascii", value, vallen) == 0)
+ popt->topt.line_style = &pg_asciiformat_old;
+ else if (pg_strncasecmp("unicode", value, vallen) == 0)
+ popt->topt.line_style = &pg_utf8format;
+ else
+ {
+ pg_log_error("\\pset: allowed line styles are ascii, old-ascii, unicode");
+ return false;
+ }
+ }
+
+ /* set unicode border line style */
+ else if (strcmp(param, "unicode_border_linestyle") == 0)
+ {
+ if (!value)
+ ;
+ else if (set_unicode_line_style(value, vallen,
+ &popt->topt.unicode_border_linestyle))
+ refresh_utf8format(&(popt->topt));
+ else
+ {
+ pg_log_error("\\pset: allowed Unicode border line styles are single, double");
+ return false;
+ }
+ }
+
+ /* set unicode column line style */
+ else if (strcmp(param, "unicode_column_linestyle") == 0)
+ {
+ if (!value)
+ ;
+ else if (set_unicode_line_style(value, vallen,
+ &popt->topt.unicode_column_linestyle))
+ refresh_utf8format(&(popt->topt));
+ else
+ {
+ pg_log_error("\\pset: allowed Unicode column line styles are single, double");
+ return false;
+ }
+ }
+
+ /* set unicode header line style */
+ else if (strcmp(param, "unicode_header_linestyle") == 0)
+ {
+ if (!value)
+ ;
+ else if (set_unicode_line_style(value, vallen,
+ &popt->topt.unicode_header_linestyle))
+ refresh_utf8format(&(popt->topt));
+ else
+ {
+ pg_log_error("\\pset: allowed Unicode header line styles are single, double");
+ return false;
+ }
+ }
+
+ /* set border style/width */
+ else if (strcmp(param, "border") == 0)
+ {
+ if (value)
+ popt->topt.border = atoi(value);
+ }
+
+ /* set expanded/vertical mode */
+ else if (strcmp(param, "x") == 0 ||
+ strcmp(param, "expanded") == 0 ||
+ strcmp(param, "vertical") == 0)
+ {
+ if (value && pg_strcasecmp(value, "auto") == 0)
+ popt->topt.expanded = 2;
+ else if (value)
+ {
+ bool on_off;
+
+ if (ParseVariableBool(value, NULL, &on_off))
+ popt->topt.expanded = on_off ? 1 : 0;
+ else
+ {
+ PsqlVarEnumError(param, value, "on, off, auto");
+ return false;
+ }
+ }
+ else
+ popt->topt.expanded = !popt->topt.expanded;
+ }
+
+ /* field separator for CSV format */
+ else if (strcmp(param, "csv_fieldsep") == 0)
+ {
+ if (value)
+ {
+ /* CSV separator has to be a one-byte character */
+ if (strlen(value) != 1)
+ {
+ pg_log_error("\\pset: csv_fieldsep must be a single one-byte character");
+ return false;
+ }
+ if (value[0] == '"' || value[0] == '\n' || value[0] == '\r')
+ {
+ pg_log_error("\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return");
+ return false;
+ }
+ popt->topt.csvFieldSep[0] = value[0];
+ }
+ }
+
+ /* locale-aware numeric output */
+ else if (strcmp(param, "numericlocale") == 0)
+ {
+ if (value)
+ return ParseVariableBool(value, param, &popt->topt.numericLocale);
+ else
+ popt->topt.numericLocale = !popt->topt.numericLocale;
+ }
+
+ /* null display */
+ else if (strcmp(param, "null") == 0)
+ {
+ if (value)
+ {
+ free(popt->nullPrint);
+ popt->nullPrint = pg_strdup(value);
+ }
+ }
+
+ /* field separator for unaligned text */
+ else if (strcmp(param, "fieldsep") == 0)
+ {
+ if (value)
+ {
+ free(popt->topt.fieldSep.separator);
+ popt->topt.fieldSep.separator = pg_strdup(value);
+ popt->topt.fieldSep.separator_zero = false;
+ }
+ }
+
+ else if (strcmp(param, "fieldsep_zero") == 0)
+ {
+ free(popt->topt.fieldSep.separator);
+ popt->topt.fieldSep.separator = NULL;
+ popt->topt.fieldSep.separator_zero = true;
+ }
+
+ /* record separator for unaligned text */
+ else if (strcmp(param, "recordsep") == 0)
+ {
+ if (value)
+ {
+ free(popt->topt.recordSep.separator);
+ popt->topt.recordSep.separator = pg_strdup(value);
+ popt->topt.recordSep.separator_zero = false;
+ }
+ }
+
+ else if (strcmp(param, "recordsep_zero") == 0)
+ {
+ free(popt->topt.recordSep.separator);
+ popt->topt.recordSep.separator = NULL;
+ popt->topt.recordSep.separator_zero = true;
+ }
+
+ /* toggle between full and tuples-only format */
+ else if (strcmp(param, "t") == 0 || strcmp(param, "tuples_only") == 0)
+ {
+ if (value)
+ return ParseVariableBool(value, param, &popt->topt.tuples_only);
+ else
+ popt->topt.tuples_only = !popt->topt.tuples_only;
+ }
+
+ /* set title override */
+ else if (strcmp(param, "C") == 0 || strcmp(param, "title") == 0)
+ {
+ free(popt->title);
+ if (!value)
+ popt->title = NULL;
+ else
+ popt->title = pg_strdup(value);
+ }
+
+ /* set HTML table tag options */
+ else if (strcmp(param, "T") == 0 || strcmp(param, "tableattr") == 0)
+ {
+ free(popt->topt.tableAttr);
+ if (!value)
+ popt->topt.tableAttr = NULL;
+ else
+ popt->topt.tableAttr = pg_strdup(value);
+ }
+
+ /* toggle use of pager */
+ else if (strcmp(param, "pager") == 0)
+ {
+ if (value && pg_strcasecmp(value, "always") == 0)
+ popt->topt.pager = 2;
+ else if (value)
+ {
+ bool on_off;
+
+ if (!ParseVariableBool(value, NULL, &on_off))
+ {
+ PsqlVarEnumError(param, value, "on, off, always");
+ return false;
+ }
+ popt->topt.pager = on_off ? 1 : 0;
+ }
+ else if (popt->topt.pager == 1)
+ popt->topt.pager = 0;
+ else
+ popt->topt.pager = 1;
+ }
+
+ /* set minimum lines for pager use */
+ else if (strcmp(param, "pager_min_lines") == 0)
+ {
+ if (value)
+ popt->topt.pager_min_lines = atoi(value);
+ }
+
+ /* disable "(x rows)" footer */
+ else if (strcmp(param, "footer") == 0)
+ {
+ if (value)
+ return ParseVariableBool(value, param, &popt->topt.default_footer);
+ else
+ popt->topt.default_footer = !popt->topt.default_footer;
+ }
+
+ /* set border style/width */
+ else if (strcmp(param, "columns") == 0)
+ {
+ if (value)
+ popt->topt.columns = atoi(value);
+ }
+ else
+ {
+ pg_log_error("\\pset: unknown option: %s", param);
+ return false;
+ }
+
+ if (!quiet)
+ printPsetInfo(param, &pset.popt);
+
+ return true;
+}
+
+/*
+ * printPsetInfo: print the state of the "param" formatting parameter in popt.
+ */
+static bool
+printPsetInfo(const char *param, printQueryOpt *popt)
+{
+ Assert(param != NULL);
+
+ /* show border style/width */
+ if (strcmp(param, "border") == 0)
+ printf(_("Border style is %d.\n"), popt->topt.border);
+
+ /* show the target width for the wrapped format */
+ else if (strcmp(param, "columns") == 0)
+ {
+ if (!popt->topt.columns)
+ printf(_("Target width is unset.\n"));
+ else
+ printf(_("Target width is %d.\n"), popt->topt.columns);
+ }
+
+ /* show expanded/vertical mode */
+ else if (strcmp(param, "x") == 0 || strcmp(param, "expanded") == 0 || strcmp(param, "vertical") == 0)
+ {
+ if (popt->topt.expanded == 1)
+ printf(_("Expanded display is on.\n"));
+ else if (popt->topt.expanded == 2)
+ printf(_("Expanded display is used automatically.\n"));
+ else
+ printf(_("Expanded display is off.\n"));
+ }
+
+ /* show field separator for CSV format */
+ else if (strcmp(param, "csv_fieldsep") == 0)
+ {
+ printf(_("Field separator for CSV is \"%s\".\n"),
+ popt->topt.csvFieldSep);
+ }
+
+ /* show field separator for unaligned text */
+ else if (strcmp(param, "fieldsep") == 0)
+ {
+ if (popt->topt.fieldSep.separator_zero)
+ printf(_("Field separator is zero byte.\n"));
+ else
+ printf(_("Field separator is \"%s\".\n"),
+ popt->topt.fieldSep.separator);
+ }
+
+ else if (strcmp(param, "fieldsep_zero") == 0)
+ {
+ printf(_("Field separator is zero byte.\n"));
+ }
+
+ /* show disable "(x rows)" footer */
+ else if (strcmp(param, "footer") == 0)
+ {
+ if (popt->topt.default_footer)
+ printf(_("Default footer is on.\n"));
+ else
+ printf(_("Default footer is off.\n"));
+ }
+
+ /* show format */
+ else if (strcmp(param, "format") == 0)
+ {
+ printf(_("Output format is %s.\n"), _align2string(popt->topt.format));
+ }
+
+ /* show table line style */
+ else if (strcmp(param, "linestyle") == 0)
+ {
+ printf(_("Line style is %s.\n"),
+ get_line_style(&popt->topt)->name);
+ }
+
+ /* show null display */
+ else if (strcmp(param, "null") == 0)
+ {
+ printf(_("Null display is \"%s\".\n"),
+ popt->nullPrint ? popt->nullPrint : "");
+ }
+
+ /* show locale-aware numeric output */
+ else if (strcmp(param, "numericlocale") == 0)
+ {
+ if (popt->topt.numericLocale)
+ printf(_("Locale-adjusted numeric output is on.\n"));
+ else
+ printf(_("Locale-adjusted numeric output is off.\n"));
+ }
+
+ /* show toggle use of pager */
+ else if (strcmp(param, "pager") == 0)
+ {
+ if (popt->topt.pager == 1)
+ printf(_("Pager is used for long output.\n"));
+ else if (popt->topt.pager == 2)
+ printf(_("Pager is always used.\n"));
+ else
+ printf(_("Pager usage is off.\n"));
+ }
+
+ /* show minimum lines for pager use */
+ else if (strcmp(param, "pager_min_lines") == 0)
+ {
+ printf(ngettext("Pager won't be used for less than %d line.\n",
+ "Pager won't be used for less than %d lines.\n",
+ popt->topt.pager_min_lines),
+ popt->topt.pager_min_lines);
+ }
+
+ /* show record separator for unaligned text */
+ else if (strcmp(param, "recordsep") == 0)
+ {
+ if (popt->topt.recordSep.separator_zero)
+ printf(_("Record separator is zero byte.\n"));
+ else if (strcmp(popt->topt.recordSep.separator, "\n") == 0)
+ printf(_("Record separator is <newline>.\n"));
+ else
+ printf(_("Record separator is \"%s\".\n"),
+ popt->topt.recordSep.separator);
+ }
+
+ else if (strcmp(param, "recordsep_zero") == 0)
+ {
+ printf(_("Record separator is zero byte.\n"));
+ }
+
+ /* show HTML table tag options */
+ else if (strcmp(param, "T") == 0 || strcmp(param, "tableattr") == 0)
+ {
+ if (popt->topt.tableAttr)
+ printf(_("Table attributes are \"%s\".\n"),
+ popt->topt.tableAttr);
+ else
+ printf(_("Table attributes unset.\n"));
+ }
+
+ /* show title override */
+ else if (strcmp(param, "C") == 0 || strcmp(param, "title") == 0)
+ {
+ if (popt->title)
+ printf(_("Title is \"%s\".\n"), popt->title);
+ else
+ printf(_("Title is unset.\n"));
+ }
+
+ /* show toggle between full and tuples-only format */
+ else if (strcmp(param, "t") == 0 || strcmp(param, "tuples_only") == 0)
+ {
+ if (popt->topt.tuples_only)
+ printf(_("Tuples only is on.\n"));
+ else
+ printf(_("Tuples only is off.\n"));
+ }
+
+ /* Unicode style formatting */
+ else if (strcmp(param, "unicode_border_linestyle") == 0)
+ {
+ printf(_("Unicode border line style is \"%s\".\n"),
+ _unicode_linestyle2string(popt->topt.unicode_border_linestyle));
+ }
+
+ else if (strcmp(param, "unicode_column_linestyle") == 0)
+ {
+ printf(_("Unicode column line style is \"%s\".\n"),
+ _unicode_linestyle2string(popt->topt.unicode_column_linestyle));
+ }
+
+ else if (strcmp(param, "unicode_header_linestyle") == 0)
+ {
+ printf(_("Unicode header line style is \"%s\".\n"),
+ _unicode_linestyle2string(popt->topt.unicode_header_linestyle));
+ }
+
+ else
+ {
+ pg_log_error("\\pset: unknown option: %s", param);
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * savePsetInfo: make a malloc'd copy of the data in *popt.
+ *
+ * Possibly this should be somewhere else, but it's a bit specific to psql.
+ */
+printQueryOpt *
+savePsetInfo(const printQueryOpt *popt)
+{
+ printQueryOpt *save;
+
+ save = (printQueryOpt *) pg_malloc(sizeof(printQueryOpt));
+
+ /* Flat-copy all the scalar fields, then duplicate sub-structures. */
+ memcpy(save, popt, sizeof(printQueryOpt));
+
+ /* topt.line_style points to const data that need not be duplicated */
+ if (popt->topt.fieldSep.separator)
+ save->topt.fieldSep.separator = pg_strdup(popt->topt.fieldSep.separator);
+ if (popt->topt.recordSep.separator)
+ save->topt.recordSep.separator = pg_strdup(popt->topt.recordSep.separator);
+ if (popt->topt.tableAttr)
+ save->topt.tableAttr = pg_strdup(popt->topt.tableAttr);
+ if (popt->nullPrint)
+ save->nullPrint = pg_strdup(popt->nullPrint);
+ if (popt->title)
+ save->title = pg_strdup(popt->title);
+
+ /*
+ * footers and translate_columns are never set in psql's print settings,
+ * so we needn't write code to duplicate them.
+ */
+ Assert(popt->footers == NULL);
+ Assert(popt->translate_columns == NULL);
+
+ return save;
+}
+
+/*
+ * restorePsetInfo: restore *popt from the previously-saved copy *save,
+ * then free *save.
+ */
+void
+restorePsetInfo(printQueryOpt *popt, printQueryOpt *save)
+{
+ /* Free all the old data we're about to overwrite the pointers to. */
+
+ /* topt.line_style points to const data that need not be duplicated */
+ if (popt->topt.fieldSep.separator)
+ free(popt->topt.fieldSep.separator);
+ if (popt->topt.recordSep.separator)
+ free(popt->topt.recordSep.separator);
+ if (popt->topt.tableAttr)
+ free(popt->topt.tableAttr);
+ if (popt->nullPrint)
+ free(popt->nullPrint);
+ if (popt->title)
+ free(popt->title);
+
+ /*
+ * footers and translate_columns are never set in psql's print settings,
+ * so we needn't write code to duplicate them.
+ */
+ Assert(popt->footers == NULL);
+ Assert(popt->translate_columns == NULL);
+
+ /* Now we may flat-copy all the fields, including pointers. */
+ memcpy(popt, save, sizeof(printQueryOpt));
+
+ /* Lastly, free "save" ... but its sub-structures now belong to popt. */
+ free(save);
+}
+
+static const char *
+pset_bool_string(bool val)
+{
+ return val ? "on" : "off";
+}
+
+
+static char *
+pset_quoted_string(const char *str)
+{
+ char *ret = pg_malloc(strlen(str) * 2 + 3);
+ char *r = ret;
+
+ *r++ = '\'';
+
+ for (; *str; str++)
+ {
+ if (*str == '\n')
+ {
+ *r++ = '\\';
+ *r++ = 'n';
+ }
+ else if (*str == '\'')
+ {
+ *r++ = '\\';
+ *r++ = '\'';
+ }
+ else
+ *r++ = *str;
+ }
+
+ *r++ = '\'';
+ *r = '\0';
+
+ return ret;
+}
+
+
+/*
+ * Return a malloc'ed string for the \pset value.
+ *
+ * Note that for some string parameters, print.c distinguishes between unset
+ * and empty string, but for others it doesn't. This function should produce
+ * output that produces the correct setting when fed back into \pset.
+ */
+static char *
+pset_value_string(const char *param, printQueryOpt *popt)
+{
+ Assert(param != NULL);
+
+ if (strcmp(param, "border") == 0)
+ return psprintf("%d", popt->topt.border);
+ else if (strcmp(param, "columns") == 0)
+ return psprintf("%d", popt->topt.columns);
+ else if (strcmp(param, "csv_fieldsep") == 0)
+ return pset_quoted_string(popt->topt.csvFieldSep);
+ else if (strcmp(param, "expanded") == 0)
+ return pstrdup(popt->topt.expanded == 2
+ ? "auto"
+ : pset_bool_string(popt->topt.expanded));
+ else if (strcmp(param, "fieldsep") == 0)
+ return pset_quoted_string(popt->topt.fieldSep.separator
+ ? popt->topt.fieldSep.separator
+ : "");
+ else if (strcmp(param, "fieldsep_zero") == 0)
+ return pstrdup(pset_bool_string(popt->topt.fieldSep.separator_zero));
+ else if (strcmp(param, "footer") == 0)
+ return pstrdup(pset_bool_string(popt->topt.default_footer));
+ else if (strcmp(param, "format") == 0)
+ return psprintf("%s", _align2string(popt->topt.format));
+ else if (strcmp(param, "linestyle") == 0)
+ return psprintf("%s", get_line_style(&popt->topt)->name);
+ else if (strcmp(param, "null") == 0)
+ return pset_quoted_string(popt->nullPrint
+ ? popt->nullPrint
+ : "");
+ else if (strcmp(param, "numericlocale") == 0)
+ return pstrdup(pset_bool_string(popt->topt.numericLocale));
+ else if (strcmp(param, "pager") == 0)
+ return psprintf("%d", popt->topt.pager);
+ else if (strcmp(param, "pager_min_lines") == 0)
+ return psprintf("%d", popt->topt.pager_min_lines);
+ else if (strcmp(param, "recordsep") == 0)
+ return pset_quoted_string(popt->topt.recordSep.separator
+ ? popt->topt.recordSep.separator
+ : "");
+ else if (strcmp(param, "recordsep_zero") == 0)
+ return pstrdup(pset_bool_string(popt->topt.recordSep.separator_zero));
+ else if (strcmp(param, "tableattr") == 0)
+ return popt->topt.tableAttr ? pset_quoted_string(popt->topt.tableAttr) : pstrdup("");
+ else if (strcmp(param, "title") == 0)
+ return popt->title ? pset_quoted_string(popt->title) : pstrdup("");
+ else if (strcmp(param, "tuples_only") == 0)
+ return pstrdup(pset_bool_string(popt->topt.tuples_only));
+ else if (strcmp(param, "unicode_border_linestyle") == 0)
+ return pstrdup(_unicode_linestyle2string(popt->topt.unicode_border_linestyle));
+ else if (strcmp(param, "unicode_column_linestyle") == 0)
+ return pstrdup(_unicode_linestyle2string(popt->topt.unicode_column_linestyle));
+ else if (strcmp(param, "unicode_header_linestyle") == 0)
+ return pstrdup(_unicode_linestyle2string(popt->topt.unicode_header_linestyle));
+ else
+ return pstrdup("ERROR");
+}
+
+
+
+#ifndef WIN32
+#define DEFAULT_SHELL "/bin/sh"
+#else
+/*
+ * CMD.EXE is in different places in different Win32 releases so we
+ * have to rely on the path to find it.
+ */
+#define DEFAULT_SHELL "cmd.exe"
+#endif
+
+static bool
+do_shell(const char *command)
+{
+ int result;
+
+ if (!command)
+ {
+ char *sys;
+ const char *shellName;
+
+ shellName = getenv("SHELL");
+#ifdef WIN32
+ if (shellName == NULL)
+ shellName = getenv("COMSPEC");
+#endif
+ if (shellName == NULL)
+ shellName = DEFAULT_SHELL;
+
+ /* See EDITOR handling comment for an explanation */
+#ifndef WIN32
+ sys = psprintf("exec %s", shellName);
+#else
+ sys = psprintf("\"%s\"", shellName);
+#endif
+ result = system(sys);
+ free(sys);
+ }
+ else
+ result = system(command);
+
+ if (result == 127 || result == -1)
+ {
+ pg_log_error("\\!: failed");
+ return false;
+ }
+ return true;
+}
+
+/*
+ * do_watch -- handler for \watch
+ *
+ * We break this out of exec_command to avoid having to plaster "volatile"
+ * onto a bunch of exec_command's variables to silence stupider compilers.
+ */
+static bool
+do_watch(PQExpBuffer query_buf, double sleep)
+{
+ long sleep_ms = (long) (sleep * 1000);
+ printQueryOpt myopt = pset.popt;
+ const char *strftime_fmt;
+ const char *user_title;
+ char *title;
+ const char *pagerprog = NULL;
+ FILE *pagerpipe = NULL;
+ int title_len;
+ int res = 0;
+#ifdef HAVE_POSIX_DECL_SIGWAIT
+ sigset_t sigalrm_sigchld_sigint;
+ sigset_t sigalrm_sigchld;
+ sigset_t sigint;
+ struct itimerval interval;
+ bool done = false;
+#endif
+
+ if (!query_buf || query_buf->len <= 0)
+ {
+ pg_log_error("\\watch cannot be used with an empty query");
+ return false;
+ }
+
+#ifdef HAVE_POSIX_DECL_SIGWAIT
+ sigemptyset(&sigalrm_sigchld_sigint);
+ sigaddset(&sigalrm_sigchld_sigint, SIGCHLD);
+ sigaddset(&sigalrm_sigchld_sigint, SIGALRM);
+ sigaddset(&sigalrm_sigchld_sigint, SIGINT);
+
+ sigemptyset(&sigalrm_sigchld);
+ sigaddset(&sigalrm_sigchld, SIGCHLD);
+ sigaddset(&sigalrm_sigchld, SIGALRM);
+
+ sigemptyset(&sigint);
+ sigaddset(&sigint, SIGINT);
+
+ /*
+ * Block SIGALRM and SIGCHLD before we start the timer and the pager (if
+ * configured), to avoid races. sigwait() will receive them.
+ */
+ sigprocmask(SIG_BLOCK, &sigalrm_sigchld, NULL);
+
+ /*
+ * Set a timer to interrupt sigwait() so we can run the query at the
+ * requested intervals.
+ */
+ interval.it_value.tv_sec = sleep_ms / 1000;
+ interval.it_value.tv_usec = (sleep_ms % 1000) * 1000;
+ interval.it_interval = interval.it_value;
+ if (setitimer(ITIMER_REAL, &interval, NULL) < 0)
+ {
+ pg_log_error("could not set timer: %m");
+ done = true;
+ }
+#endif
+
+ /*
+ * For \watch, we ignore the size of the result and always use the pager
+ * as long as we're talking to a terminal and "\pset pager" is enabled.
+ * However, we'll only use the pager identified by PSQL_WATCH_PAGER. We
+ * ignore the regular PSQL_PAGER or PAGER environment variables, because
+ * traditional pagers probably won't be very useful for showing a stream
+ * of results.
+ */
+#ifdef HAVE_POSIX_DECL_SIGWAIT
+ pagerprog = getenv("PSQL_WATCH_PAGER");
+ /* if variable is empty or all-white-space, don't use pager */
+ if (pagerprog && strspn(pagerprog, " \t\r\n") == strlen(pagerprog))
+ pagerprog = NULL;
+#endif
+ if (pagerprog && myopt.topt.pager &&
+ isatty(fileno(stdin)) && isatty(fileno(stdout)))
+ {
+ disable_sigpipe_trap();
+ pagerpipe = popen(pagerprog, "w");
+
+ if (!pagerpipe)
+ /* silently proceed without pager */
+ restore_sigpipe_trap();
+ }
+
+ /*
+ * Choose format for timestamps. We might eventually make this a \pset
+ * option. In the meantime, using a variable for the format suppresses
+ * overly-anal-retentive gcc warnings about %c being Y2K sensitive.
+ */
+ strftime_fmt = "%c";
+
+ /*
+ * Set up rendering options, in particular, disable the pager unless
+ * PSQL_WATCH_PAGER was successfully launched.
+ */
+ if (!pagerpipe)
+ myopt.topt.pager = 0;
+
+
+ /*
+ * If there's a title in the user configuration, make sure we have room
+ * for it in the title buffer. Allow 128 bytes for the timestamp plus 128
+ * bytes for the rest.
+ */
+ user_title = myopt.title;
+ title_len = (user_title ? strlen(user_title) : 0) + 256;
+ title = pg_malloc(title_len);
+
+ for (;;)
+ {
+ time_t timer;
+ char timebuf[128];
+
+ /*
+ * Prepare title for output. Note that we intentionally include a
+ * newline at the end of the title; this is somewhat historical but it
+ * makes for reasonably nicely formatted output in simple cases.
+ */
+ timer = time(NULL);
+ strftime(timebuf, sizeof(timebuf), strftime_fmt, localtime(&timer));
+
+ if (user_title)
+ snprintf(title, title_len, _("%s\t%s (every %gs)\n"),
+ user_title, timebuf, sleep);
+ else
+ snprintf(title, title_len, _("%s (every %gs)\n"),
+ timebuf, sleep);
+ myopt.title = title;
+
+ /* Run the query and print out the result */
+ res = PSQLexecWatch(query_buf->data, &myopt, pagerpipe);
+
+ /*
+ * PSQLexecWatch handles the case where we can no longer repeat the
+ * query, and returns 0 or -1.
+ */
+ if (res <= 0)
+ break;
+
+ if (pagerpipe && ferror(pagerpipe))
+ break;
+
+#ifndef HAVE_POSIX_DECL_SIGWAIT
+
+ /*
+ * Set up cancellation of 'watch' via SIGINT. We redo this each time
+ * through the loop since it's conceivable something inside
+ * PSQLexecWatch could change sigint_interrupt_jmp.
+ */
+ if (sigsetjmp(sigint_interrupt_jmp, 1) != 0)
+ break;
+
+ /*
+ * Enable 'watch' cancellations and wait a while before running the
+ * query again. Break the sleep into short intervals (at most 1s).
+ */
+ sigint_interrupt_enabled = true;
+ for (long i = sleep_ms; i > 0;)
+ {
+ long s = Min(i, 1000L);
+
+ pg_usleep(s * 1000L);
+ if (cancel_pressed)
+ break;
+ i -= s;
+ }
+ sigint_interrupt_enabled = false;
+#else
+ /* sigwait() will handle SIGINT. */
+ sigprocmask(SIG_BLOCK, &sigint, NULL);
+ if (cancel_pressed)
+ done = true;
+
+ /* Wait for SIGINT, SIGCHLD or SIGALRM. */
+ while (!done)
+ {
+ int signal_received;
+
+ errno = sigwait(&sigalrm_sigchld_sigint, &signal_received);
+ if (errno != 0)
+ {
+ /* Some other signal arrived? */
+ if (errno == EINTR)
+ continue;
+ else
+ {
+ pg_log_error("could not wait for signals: %m");
+ done = true;
+ break;
+ }
+ }
+ /* On ^C or pager exit, it's time to stop running the query. */
+ if (signal_received == SIGINT || signal_received == SIGCHLD)
+ done = true;
+ /* Otherwise, we must have SIGALRM. Time to run the query again. */
+ break;
+ }
+
+ /* Unblock SIGINT so that slow queries can be interrupted. */
+ sigprocmask(SIG_UNBLOCK, &sigint, NULL);
+ if (done)
+ break;
+#endif
+ }
+
+ if (pagerpipe)
+ {
+ pclose(pagerpipe);
+ restore_sigpipe_trap();
+ }
+ else
+ {
+ /*
+ * If the terminal driver echoed "^C", libedit/libreadline might be
+ * confused about the cursor position. Therefore, inject a newline
+ * before the next prompt is displayed. We only do this when not
+ * using a pager, because pagers are expected to restore the screen to
+ * a sane state on exit.
+ */
+ fprintf(stdout, "\n");
+ fflush(stdout);
+ }
+
+#ifdef HAVE_POSIX_DECL_SIGWAIT
+ /* Disable the interval timer. */
+ memset(&interval, 0, sizeof(interval));
+ setitimer(ITIMER_REAL, &interval, NULL);
+ /* Unblock SIGINT, SIGCHLD and SIGALRM. */
+ sigprocmask(SIG_UNBLOCK, &sigalrm_sigchld_sigint, NULL);
+#endif
+
+ pg_free(title);
+ return (res >= 0);
+}
+
+/*
+ * a little code borrowed from PSQLexec() to manage ECHO_HIDDEN output.
+ * returns true unless we have ECHO_HIDDEN_NOEXEC.
+ */
+static bool
+echo_hidden_command(const char *query)
+{
+ if (pset.echo_hidden != PSQL_ECHO_HIDDEN_OFF)
+ {
+ printf(_("********* QUERY **********\n"
+ "%s\n"
+ "**************************\n\n"), query);
+ fflush(stdout);
+ if (pset.logfile)
+ {
+ fprintf(pset.logfile,
+ _("********* QUERY **********\n"
+ "%s\n"
+ "**************************\n\n"), query);
+ fflush(pset.logfile);
+ }
+
+ if (pset.echo_hidden == PSQL_ECHO_HIDDEN_NOEXEC)
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Look up the object identified by obj_type and desc. If successful,
+ * store its OID in *obj_oid and return true, else return false.
+ *
+ * Note that we'll fail if the object doesn't exist OR if there are multiple
+ * matching candidates OR if there's something syntactically wrong with the
+ * object description; unfortunately it can be hard to tell the difference.
+ */
+static bool
+lookup_object_oid(EditableObjectType obj_type, const char *desc,
+ Oid *obj_oid)
+{
+ bool result = true;
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+
+ switch (obj_type)
+ {
+ case EditableFunction:
+
+ /*
+ * We have a function description, e.g. "x" or "x(int)". Issue a
+ * query to retrieve the function's OID using a cast to regproc or
+ * regprocedure (as appropriate).
+ */
+ appendPQExpBufferStr(query, "SELECT ");
+ appendStringLiteralConn(query, desc, pset.db);
+ appendPQExpBuffer(query, "::pg_catalog.%s::pg_catalog.oid",
+ strchr(desc, '(') ? "regprocedure" : "regproc");
+ break;
+
+ case EditableView:
+
+ /*
+ * Convert view name (possibly schema-qualified) to OID. Note:
+ * this code doesn't check if the relation is actually a view.
+ * We'll detect that in get_create_object_cmd().
+ */
+ appendPQExpBufferStr(query, "SELECT ");
+ appendStringLiteralConn(query, desc, pset.db);
+ appendPQExpBufferStr(query, "::pg_catalog.regclass::pg_catalog.oid");
+ break;
+ }
+
+ if (!echo_hidden_command(query->data))
+ {
+ destroyPQExpBuffer(query);
+ return false;
+ }
+ res = PQexec(pset.db, query->data);
+ if (PQresultStatus(res) == PGRES_TUPLES_OK && PQntuples(res) == 1)
+ *obj_oid = atooid(PQgetvalue(res, 0, 0));
+ else
+ {
+ minimal_error_message(res);
+ result = false;
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+
+ return result;
+}
+
+/*
+ * Construct a "CREATE OR REPLACE ..." command that describes the specified
+ * database object. If successful, the result is stored in buf.
+ */
+static bool
+get_create_object_cmd(EditableObjectType obj_type, Oid oid,
+ PQExpBuffer buf)
+{
+ bool result = true;
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+
+ switch (obj_type)
+ {
+ case EditableFunction:
+ printfPQExpBuffer(query,
+ "SELECT pg_catalog.pg_get_functiondef(%u)",
+ oid);
+ break;
+
+ case EditableView:
+
+ /*
+ * pg_get_viewdef() just prints the query, so we must prepend
+ * CREATE for ourselves. We must fully qualify the view name to
+ * ensure the right view gets replaced. Also, check relation kind
+ * to be sure it's a view.
+ *
+ * Starting with PG 9.4, views may have WITH [LOCAL|CASCADED]
+ * CHECK OPTION. These are not part of the view definition
+ * returned by pg_get_viewdef() and so need to be retrieved
+ * separately. Materialized views (introduced in 9.3) may have
+ * arbitrary storage parameter reloptions.
+ */
+ if (pset.sversion >= 90400)
+ {
+ printfPQExpBuffer(query,
+ "SELECT nspname, relname, relkind, "
+ "pg_catalog.pg_get_viewdef(c.oid, true), "
+ "pg_catalog.array_remove(pg_catalog.array_remove(c.reloptions,'check_option=local'),'check_option=cascaded') AS reloptions, "
+ "CASE WHEN 'check_option=local' = ANY (c.reloptions) THEN 'LOCAL'::text "
+ "WHEN 'check_option=cascaded' = ANY (c.reloptions) THEN 'CASCADED'::text ELSE NULL END AS checkoption "
+ "FROM pg_catalog.pg_class c "
+ "LEFT JOIN pg_catalog.pg_namespace n "
+ "ON c.relnamespace = n.oid WHERE c.oid = %u",
+ oid);
+ }
+ else
+ {
+ printfPQExpBuffer(query,
+ "SELECT nspname, relname, relkind, "
+ "pg_catalog.pg_get_viewdef(c.oid, true), "
+ "c.reloptions AS reloptions, "
+ "NULL AS checkoption "
+ "FROM pg_catalog.pg_class c "
+ "LEFT JOIN pg_catalog.pg_namespace n "
+ "ON c.relnamespace = n.oid WHERE c.oid = %u",
+ oid);
+ }
+ break;
+ }
+
+ if (!echo_hidden_command(query->data))
+ {
+ destroyPQExpBuffer(query);
+ return false;
+ }
+ res = PQexec(pset.db, query->data);
+ if (PQresultStatus(res) == PGRES_TUPLES_OK && PQntuples(res) == 1)
+ {
+ resetPQExpBuffer(buf);
+ switch (obj_type)
+ {
+ case EditableFunction:
+ appendPQExpBufferStr(buf, PQgetvalue(res, 0, 0));
+ break;
+
+ case EditableView:
+ {
+ char *nspname = PQgetvalue(res, 0, 0);
+ char *relname = PQgetvalue(res, 0, 1);
+ char *relkind = PQgetvalue(res, 0, 2);
+ char *viewdef = PQgetvalue(res, 0, 3);
+ char *reloptions = PQgetvalue(res, 0, 4);
+ char *checkoption = PQgetvalue(res, 0, 5);
+
+ /*
+ * If the backend ever supports CREATE OR REPLACE
+ * MATERIALIZED VIEW, allow that here; but as of today it
+ * does not, so editing a matview definition in this way
+ * is impossible.
+ */
+ switch (relkind[0])
+ {
+#ifdef NOT_USED
+ case RELKIND_MATVIEW:
+ appendPQExpBufferStr(buf, "CREATE OR REPLACE MATERIALIZED VIEW ");
+ break;
+#endif
+ case RELKIND_VIEW:
+ appendPQExpBufferStr(buf, "CREATE OR REPLACE VIEW ");
+ break;
+ default:
+ pg_log_error("\"%s.%s\" is not a view",
+ nspname, relname);
+ result = false;
+ break;
+ }
+ appendPQExpBuffer(buf, "%s.", fmtId(nspname));
+ appendPQExpBufferStr(buf, fmtId(relname));
+
+ /* reloptions, if not an empty array "{}" */
+ if (reloptions != NULL && strlen(reloptions) > 2)
+ {
+ appendPQExpBufferStr(buf, "\n WITH (");
+ if (!appendReloptionsArray(buf, reloptions, "",
+ pset.encoding,
+ standard_strings()))
+ {
+ pg_log_error("could not parse reloptions array");
+ result = false;
+ }
+ appendPQExpBufferChar(buf, ')');
+ }
+
+ /* View definition from pg_get_viewdef (a SELECT query) */
+ appendPQExpBuffer(buf, " AS\n%s", viewdef);
+
+ /* Get rid of the semicolon that pg_get_viewdef appends */
+ if (buf->len > 0 && buf->data[buf->len - 1] == ';')
+ buf->data[--(buf->len)] = '\0';
+
+ /* WITH [LOCAL|CASCADED] CHECK OPTION */
+ if (checkoption && checkoption[0] != '\0')
+ appendPQExpBuffer(buf, "\n WITH %s CHECK OPTION",
+ checkoption);
+ }
+ break;
+ }
+ /* Make sure result ends with a newline */
+ if (buf->len > 0 && buf->data[buf->len - 1] != '\n')
+ appendPQExpBufferChar(buf, '\n');
+ }
+ else
+ {
+ minimal_error_message(res);
+ result = false;
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+
+ return result;
+}
+
+/*
+ * If the given argument of \ef or \ev ends with a line number, delete the line
+ * number from the argument string and return it as an integer. (We need
+ * this kluge because we're too lazy to parse \ef's function or \ev's view
+ * argument carefully --- we just slop it up in OT_WHOLE_LINE mode.)
+ *
+ * Returns -1 if no line number is present, 0 on error, or a positive value
+ * on success.
+ */
+static int
+strip_lineno_from_objdesc(char *obj)
+{
+ char *c;
+ int lineno;
+
+ if (!obj || obj[0] == '\0')
+ return -1;
+
+ c = obj + strlen(obj) - 1;
+
+ /*
+ * This business of parsing backwards is dangerous as can be in a
+ * multibyte environment: there is no reason to believe that we are
+ * looking at the first byte of a character, nor are we necessarily
+ * working in a "safe" encoding. Fortunately the bitpatterns we are
+ * looking for are unlikely to occur as non-first bytes, but beware of
+ * trying to expand the set of cases that can be recognized. We must
+ * guard the <ctype.h> macros by using isascii() first, too.
+ */
+
+ /* skip trailing whitespace */
+ while (c > obj && isascii((unsigned char) *c) && isspace((unsigned char) *c))
+ c--;
+
+ /* must have a digit as last non-space char */
+ if (c == obj || !isascii((unsigned char) *c) || !isdigit((unsigned char) *c))
+ return -1;
+
+ /* find start of digit string */
+ while (c > obj && isascii((unsigned char) *c) && isdigit((unsigned char) *c))
+ c--;
+
+ /* digits must be separated from object name by space or closing paren */
+ /* notice also that we are not allowing an empty object name ... */
+ if (c == obj || !isascii((unsigned char) *c) ||
+ !(isspace((unsigned char) *c) || *c == ')'))
+ return -1;
+
+ /* parse digit string */
+ c++;
+ lineno = atoi(c);
+ if (lineno < 1)
+ {
+ pg_log_error("invalid line number: %s", c);
+ return 0;
+ }
+
+ /* strip digit string from object name */
+ *c = '\0';
+
+ return lineno;
+}
+
+/*
+ * Count number of lines in the buffer.
+ * This is used to test if pager is needed or not.
+ */
+static int
+count_lines_in_buf(PQExpBuffer buf)
+{
+ int lineno = 0;
+ const char *lines = buf->data;
+
+ while (*lines != '\0')
+ {
+ lineno++;
+ /* find start of next line */
+ lines = strchr(lines, '\n');
+ if (!lines)
+ break;
+ lines++;
+ }
+
+ return lineno;
+}
+
+/*
+ * Write text at *lines to output with line numbers.
+ *
+ * For functions, lineno "1" should correspond to the first line of the
+ * function body; lines before that are unnumbered. We expect that
+ * pg_get_functiondef() will emit that on a line beginning with "AS ",
+ * "BEGIN ", or "RETURN ", and that there can be no such line before
+ * the real start of the function body.
+ *
+ * Caution: this scribbles on *lines.
+ */
+static void
+print_with_linenumbers(FILE *output, char *lines, bool is_func)
+{
+ bool in_header = is_func;
+ int lineno = 0;
+
+ while (*lines != '\0')
+ {
+ char *eol;
+
+ if (in_header &&
+ (strncmp(lines, "AS ", 3) == 0 ||
+ strncmp(lines, "BEGIN ", 6) == 0 ||
+ strncmp(lines, "RETURN ", 7) == 0))
+ in_header = false;
+
+ /* increment lineno only for body's lines */
+ if (!in_header)
+ lineno++;
+
+ /* find and mark end of current line */
+ eol = strchr(lines, '\n');
+ if (eol != NULL)
+ *eol = '\0';
+
+ /* show current line as appropriate */
+ if (in_header)
+ fprintf(output, " %s\n", lines);
+ else
+ fprintf(output, "%-7d %s\n", lineno, lines);
+
+ /* advance to next line, if any */
+ if (eol == NULL)
+ break;
+ lines = ++eol;
+ }
+}
+
+/*
+ * Report just the primary error; this is to avoid cluttering the output
+ * with, for instance, a redisplay of the internally generated query
+ */
+static void
+minimal_error_message(PGresult *res)
+{
+ PQExpBuffer msg;
+ const char *fld;
+
+ msg = createPQExpBuffer();
+
+ fld = PQresultErrorField(res, PG_DIAG_SEVERITY);
+ if (fld)
+ printfPQExpBuffer(msg, "%s: ", fld);
+ else
+ printfPQExpBuffer(msg, "ERROR: ");
+ fld = PQresultErrorField(res, PG_DIAG_MESSAGE_PRIMARY);
+ if (fld)
+ appendPQExpBufferStr(msg, fld);
+ else
+ appendPQExpBufferStr(msg, "(not available)");
+ appendPQExpBufferChar(msg, '\n');
+
+ pg_log_error("%s", msg->data);
+
+ destroyPQExpBuffer(msg);
+}
diff --git a/src/bin/psql/command.h b/src/bin/psql/command.h
new file mode 100644
index 0000000..7354ab5
--- /dev/null
+++ b/src/bin/psql/command.h
@@ -0,0 +1,49 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/command.h
+ */
+#ifndef COMMAND_H
+#define COMMAND_H
+
+#include "fe_utils/conditional.h"
+#include "fe_utils/print.h"
+#include "fe_utils/psqlscan.h"
+
+typedef enum _backslashResult
+{
+ PSQL_CMD_UNKNOWN = 0, /* not done parsing yet (internal only) */
+ PSQL_CMD_SEND, /* query complete; send off */
+ PSQL_CMD_SKIP_LINE, /* keep building query */
+ PSQL_CMD_TERMINATE, /* quit program */
+ PSQL_CMD_NEWEDIT, /* query buffer was changed (e.g., via \e) */
+ PSQL_CMD_ERROR /* the execution of the backslash command
+ * resulted in an error */
+} backslashResult;
+
+
+extern backslashResult HandleSlashCmds(PsqlScanState scan_state,
+ ConditionalStack cstack,
+ PQExpBuffer query_buf,
+ PQExpBuffer previous_buf);
+
+extern int process_file(char *filename, bool use_relative_path);
+
+extern bool do_pset(const char *param,
+ const char *value,
+ printQueryOpt *popt,
+ bool quiet);
+
+extern printQueryOpt *savePsetInfo(const printQueryOpt *popt);
+
+extern void restorePsetInfo(printQueryOpt *popt, printQueryOpt *save);
+
+extern void connection_warnings(bool in_startup);
+
+extern void SyncVariables(void);
+
+extern void UnsyncVariables(void);
+
+#endif /* COMMAND_H */
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
new file mode 100644
index 0000000..f5909f9
--- /dev/null
+++ b/src/bin/psql/common.c
@@ -0,0 +1,2388 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/common.c
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#include <limits.h>
+#include <math.h>
+#include <pwd.h>
+#include <signal.h>
+#ifndef WIN32
+#include <unistd.h> /* for write() */
+#else
+#include <io.h> /* for _write() */
+#include <win32.h>
+#endif
+
+#include "command.h"
+#include "common.h"
+#include "common/logging.h"
+#include "copy.h"
+#include "crosstabview.h"
+#include "fe_utils/cancel.h"
+#include "fe_utils/mbprint.h"
+#include "fe_utils/string_utils.h"
+#include "portability/instr_time.h"
+#include "settings.h"
+
+static bool DescribeQuery(const char *query, double *elapsed_msec);
+static bool ExecQueryUsingCursor(const char *query, double *elapsed_msec);
+static int ExecQueryAndProcessResults(const char *query,
+ double *elapsed_msec,
+ bool *svpt_gone_p,
+ bool is_watch,
+ const printQueryOpt *opt,
+ FILE *printQueryFout);
+static bool command_no_begin(const char *query);
+static bool is_select_command(const char *query);
+
+
+/*
+ * openQueryOutputFile --- attempt to open a query output file
+ *
+ * fname == NULL selects stdout, else an initial '|' selects a pipe,
+ * else plain file.
+ *
+ * Returns output file pointer into *fout, and is-a-pipe flag into *is_pipe.
+ * Caller is responsible for adjusting SIGPIPE state if it's a pipe.
+ *
+ * On error, reports suitable error message and returns false.
+ */
+bool
+openQueryOutputFile(const char *fname, FILE **fout, bool *is_pipe)
+{
+ if (!fname || fname[0] == '\0')
+ {
+ *fout = stdout;
+ *is_pipe = false;
+ }
+ else if (*fname == '|')
+ {
+ *fout = popen(fname + 1, "w");
+ *is_pipe = true;
+ }
+ else
+ {
+ *fout = fopen(fname, "w");
+ *is_pipe = false;
+ }
+
+ if (*fout == NULL)
+ {
+ pg_log_error("%s: %m", fname);
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * setQFout
+ * -- handler for -o command line option and \o command
+ *
+ * On success, updates pset with the new output file and returns true.
+ * On failure, returns false without changing pset state.
+ */
+bool
+setQFout(const char *fname)
+{
+ FILE *fout;
+ bool is_pipe;
+
+ /* First make sure we can open the new output file/pipe */
+ if (!openQueryOutputFile(fname, &fout, &is_pipe))
+ return false;
+
+ /* Close old file/pipe */
+ if (pset.queryFout && pset.queryFout != stdout && pset.queryFout != stderr)
+ {
+ if (pset.queryFoutPipe)
+ pclose(pset.queryFout);
+ else
+ fclose(pset.queryFout);
+ }
+
+ pset.queryFout = fout;
+ pset.queryFoutPipe = is_pipe;
+
+ /* Adjust SIGPIPE handling appropriately: ignore signal if is_pipe */
+ set_sigpipe_trap_state(is_pipe);
+ restore_sigpipe_trap();
+
+ return true;
+}
+
+
+/*
+ * Variable-fetching callback for flex lexer
+ *
+ * If the specified variable exists, return its value as a string (malloc'd
+ * and expected to be freed by the caller); else return NULL.
+ *
+ * If "quote" isn't PQUOTE_PLAIN, then return the value suitably quoted and
+ * escaped for the specified quoting requirement. (Failure in escaping
+ * should lead to printing an error and returning NULL.)
+ *
+ * "passthrough" is the pointer previously given to psql_scan_set_passthrough.
+ * In psql, passthrough points to a ConditionalStack, which we check to
+ * determine whether variable expansion is allowed.
+ */
+char *
+psql_get_variable(const char *varname, PsqlScanQuoteType quote,
+ void *passthrough)
+{
+ char *result = NULL;
+ const char *value;
+
+ /* In an inactive \if branch, suppress all variable substitutions */
+ if (passthrough && !conditional_active((ConditionalStack) passthrough))
+ return NULL;
+
+ value = GetVariable(pset.vars, varname);
+ if (!value)
+ return NULL;
+
+ switch (quote)
+ {
+ case PQUOTE_PLAIN:
+ result = pg_strdup(value);
+ break;
+ case PQUOTE_SQL_LITERAL:
+ case PQUOTE_SQL_IDENT:
+ {
+ /*
+ * For these cases, we use libpq's quoting functions, which
+ * assume the string is in the connection's client encoding.
+ */
+ char *escaped_value;
+
+ if (!pset.db)
+ {
+ pg_log_error("cannot escape without active connection");
+ return NULL;
+ }
+
+ if (quote == PQUOTE_SQL_LITERAL)
+ escaped_value =
+ PQescapeLiteral(pset.db, value, strlen(value));
+ else
+ escaped_value =
+ PQescapeIdentifier(pset.db, value, strlen(value));
+
+ if (escaped_value == NULL)
+ {
+ const char *error = PQerrorMessage(pset.db);
+
+ pg_log_info("%s", error);
+ return NULL;
+ }
+
+ /*
+ * Rather than complicate the lexer's API with a notion of
+ * which free() routine to use, just pay the price of an extra
+ * strdup().
+ */
+ result = pg_strdup(escaped_value);
+ PQfreemem(escaped_value);
+ break;
+ }
+ case PQUOTE_SHELL_ARG:
+ {
+ /*
+ * For this we use appendShellStringNoError, which is
+ * encoding-agnostic, which is fine since the shell probably
+ * is too. In any case, the only special character is "'",
+ * which is not known to appear in valid multibyte characters.
+ */
+ PQExpBufferData buf;
+
+ initPQExpBuffer(&buf);
+ if (!appendShellStringNoError(&buf, value))
+ {
+ pg_log_error("shell command argument contains a newline or carriage return: \"%s\"",
+ value);
+ free(buf.data);
+ return NULL;
+ }
+ result = buf.data;
+ break;
+ }
+
+ /* No default: we want a compiler warning for missing cases */
+ }
+
+ return result;
+}
+
+
+/*
+ * for backend Notice messages (INFO, WARNING, etc)
+ */
+void
+NoticeProcessor(void *arg, const char *message)
+{
+ (void) arg; /* not used */
+ pg_log_info("%s", message);
+}
+
+
+
+/*
+ * Code to support query cancellation
+ *
+ * Before we start a query, we enable the SIGINT signal catcher to send a
+ * cancel request to the backend.
+ *
+ * SIGINT is supposed to abort all long-running psql operations, not only
+ * database queries. In most places, this is accomplished by checking
+ * cancel_pressed during long-running loops. However, that won't work when
+ * blocked on user input (in readline() or fgets()). In those places, we
+ * set sigint_interrupt_enabled true while blocked, instructing the signal
+ * catcher to longjmp through sigint_interrupt_jmp. We assume readline and
+ * fgets are coded to handle possible interruption.
+ *
+ * On Windows, currently this does not work, so control-C is less useful
+ * there.
+ */
+volatile bool sigint_interrupt_enabled = false;
+
+sigjmp_buf sigint_interrupt_jmp;
+
+static void
+psql_cancel_callback(void)
+{
+#ifndef WIN32
+ /* if we are waiting for input, longjmp out of it */
+ if (sigint_interrupt_enabled)
+ {
+ sigint_interrupt_enabled = false;
+ siglongjmp(sigint_interrupt_jmp, 1);
+ }
+#endif
+
+ /* else, set cancel flag to stop any long-running loops */
+ cancel_pressed = true;
+}
+
+void
+psql_setup_cancel_handler(void)
+{
+ setup_cancel_handler(psql_cancel_callback);
+}
+
+
+/* ConnectionUp
+ *
+ * Returns whether our backend connection is still there.
+ */
+static bool
+ConnectionUp(void)
+{
+ return PQstatus(pset.db) != CONNECTION_BAD;
+}
+
+
+
+/* CheckConnection
+ *
+ * Verify that we still have a good connection to the backend, and if not,
+ * see if it can be restored.
+ *
+ * Returns true if either the connection was still there, or it could be
+ * restored successfully; false otherwise. If, however, there was no
+ * connection and the session is non-interactive, this will exit the program
+ * with a code of EXIT_BADCONN.
+ */
+static bool
+CheckConnection(void)
+{
+ bool OK;
+
+ OK = ConnectionUp();
+ if (!OK)
+ {
+ if (!pset.cur_cmd_interactive)
+ {
+ pg_log_error("connection to server was lost");
+ exit(EXIT_BADCONN);
+ }
+
+ fprintf(stderr, _("The connection to the server was lost. Attempting reset: "));
+ PQreset(pset.db);
+ OK = ConnectionUp();
+ if (!OK)
+ {
+ fprintf(stderr, _("Failed.\n"));
+
+ /*
+ * Transition to having no connection; but stash away the failed
+ * connection so that we can still refer to its parameters in a
+ * later \connect attempt. Keep the state cleanup here in sync
+ * with do_connect().
+ */
+ if (pset.dead_conn)
+ PQfinish(pset.dead_conn);
+ pset.dead_conn = pset.db;
+ pset.db = NULL;
+ ResetCancelConn();
+ UnsyncVariables();
+ }
+ else
+ {
+ fprintf(stderr, _("Succeeded.\n"));
+
+ /*
+ * Re-sync, just in case anything changed. Keep this in sync with
+ * do_connect().
+ */
+ SyncVariables();
+ connection_warnings(false); /* Must be after SyncVariables */
+ }
+ }
+
+ return OK;
+}
+
+
+
+
+/*
+ * AcceptResult
+ *
+ * Checks whether a result is valid, giving an error message if necessary;
+ * and ensures that the connection to the backend is still up.
+ *
+ * Returns true for valid result, false for error state.
+ */
+static bool
+AcceptResult(const PGresult *result, bool show_error)
+{
+ bool OK;
+
+ if (!result)
+ OK = false;
+ else
+ switch (PQresultStatus(result))
+ {
+ case PGRES_COMMAND_OK:
+ case PGRES_TUPLES_OK:
+ case PGRES_EMPTY_QUERY:
+ case PGRES_COPY_IN:
+ case PGRES_COPY_OUT:
+ /* Fine, do nothing */
+ OK = true;
+ break;
+
+ case PGRES_BAD_RESPONSE:
+ case PGRES_NONFATAL_ERROR:
+ case PGRES_FATAL_ERROR:
+ OK = false;
+ break;
+
+ default:
+ OK = false;
+ pg_log_error("unexpected PQresultStatus: %d",
+ PQresultStatus(result));
+ break;
+ }
+
+ if (!OK && show_error)
+ {
+ const char *error = PQerrorMessage(pset.db);
+
+ if (strlen(error))
+ pg_log_info("%s", error);
+
+ CheckConnection();
+ }
+
+ return OK;
+}
+
+
+/*
+ * Set special variables from a query result
+ * - ERROR: true/false, whether an error occurred on this query
+ * - SQLSTATE: code of error, or "00000" if no error, or "" if unknown
+ * - ROW_COUNT: how many rows were returned or affected, or "0"
+ * - LAST_ERROR_SQLSTATE: same for last error
+ * - LAST_ERROR_MESSAGE: message of last error
+ *
+ * Note: current policy is to apply this only to the results of queries
+ * entered by the user, not queries generated by slash commands.
+ */
+static void
+SetResultVariables(PGresult *result, bool success)
+{
+ if (success)
+ {
+ const char *ntuples = PQcmdTuples(result);
+
+ SetVariable(pset.vars, "ERROR", "false");
+ SetVariable(pset.vars, "SQLSTATE", "00000");
+ SetVariable(pset.vars, "ROW_COUNT", *ntuples ? ntuples : "0");
+ }
+ else
+ {
+ const char *code = PQresultErrorField(result, PG_DIAG_SQLSTATE);
+ const char *mesg = PQresultErrorField(result, PG_DIAG_MESSAGE_PRIMARY);
+
+ SetVariable(pset.vars, "ERROR", "true");
+
+ /*
+ * If there is no SQLSTATE code, use an empty string. This can happen
+ * for libpq-detected errors (e.g., lost connection, ENOMEM).
+ */
+ if (code == NULL)
+ code = "";
+ SetVariable(pset.vars, "SQLSTATE", code);
+ SetVariable(pset.vars, "ROW_COUNT", "0");
+ SetVariable(pset.vars, "LAST_ERROR_SQLSTATE", code);
+ SetVariable(pset.vars, "LAST_ERROR_MESSAGE", mesg ? mesg : "");
+ }
+}
+
+
+/*
+ * ClearOrSaveResult
+ *
+ * If the result represents an error, remember it for possible display by
+ * \errverbose. Otherwise, just PQclear() it.
+ *
+ * Note: current policy is to apply this to the results of all queries,
+ * including "back door" queries, for debugging's sake. It's OK to use
+ * PQclear() directly on results known to not be error results, however.
+ */
+static void
+ClearOrSaveResult(PGresult *result)
+{
+ if (result)
+ {
+ switch (PQresultStatus(result))
+ {
+ case PGRES_NONFATAL_ERROR:
+ case PGRES_FATAL_ERROR:
+ if (pset.last_error_result)
+ PQclear(pset.last_error_result);
+ pset.last_error_result = result;
+ break;
+
+ default:
+ PQclear(result);
+ break;
+ }
+ }
+}
+
+
+/*
+ * Consume all results
+ */
+static void
+ClearOrSaveAllResults(void)
+{
+ PGresult *result;
+
+ while ((result = PQgetResult(pset.db)) != NULL)
+ ClearOrSaveResult(result);
+}
+
+
+/*
+ * Print microtiming output. Always print raw milliseconds; if the interval
+ * is >= 1 second, also break it down into days/hours/minutes/seconds.
+ */
+static void
+PrintTiming(double elapsed_msec)
+{
+ double seconds;
+ double minutes;
+ double hours;
+ double days;
+
+ if (elapsed_msec < 1000.0)
+ {
+ /* This is the traditional (pre-v10) output format */
+ printf(_("Time: %.3f ms\n"), elapsed_msec);
+ return;
+ }
+
+ /*
+ * Note: we could print just seconds, in a format like %06.3f, when the
+ * total is less than 1min. But that's hard to interpret unless we tack
+ * on "s" or otherwise annotate it. Forcing the display to include
+ * minutes seems like a better solution.
+ */
+ seconds = elapsed_msec / 1000.0;
+ minutes = floor(seconds / 60.0);
+ seconds -= 60.0 * minutes;
+ if (minutes < 60.0)
+ {
+ printf(_("Time: %.3f ms (%02d:%06.3f)\n"),
+ elapsed_msec, (int) minutes, seconds);
+ return;
+ }
+
+ hours = floor(minutes / 60.0);
+ minutes -= 60.0 * hours;
+ if (hours < 24.0)
+ {
+ printf(_("Time: %.3f ms (%02d:%02d:%06.3f)\n"),
+ elapsed_msec, (int) hours, (int) minutes, seconds);
+ return;
+ }
+
+ days = floor(hours / 24.0);
+ hours -= 24.0 * days;
+ printf(_("Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"),
+ elapsed_msec, days, (int) hours, (int) minutes, seconds);
+}
+
+
+/*
+ * PSQLexec
+ *
+ * This is the way to send "backdoor" queries (those not directly entered
+ * by the user). It is subject to -E but not -e.
+ *
+ * Caller is responsible for handling the ensuing processing if a COPY
+ * command is sent.
+ *
+ * Note: we don't bother to check PQclientEncoding; it is assumed that no
+ * caller uses this path to issue "SET CLIENT_ENCODING".
+ */
+PGresult *
+PSQLexec(const char *query)
+{
+ PGresult *res;
+
+ if (!pset.db)
+ {
+ pg_log_error("You are currently not connected to a database.");
+ return NULL;
+ }
+
+ if (pset.echo_hidden != PSQL_ECHO_HIDDEN_OFF)
+ {
+ printf(_("********* QUERY **********\n"
+ "%s\n"
+ "**************************\n\n"), query);
+ fflush(stdout);
+ if (pset.logfile)
+ {
+ fprintf(pset.logfile,
+ _("********* QUERY **********\n"
+ "%s\n"
+ "**************************\n\n"), query);
+ fflush(pset.logfile);
+ }
+
+ if (pset.echo_hidden == PSQL_ECHO_HIDDEN_NOEXEC)
+ return NULL;
+ }
+
+ SetCancelConn(pset.db);
+
+ res = PQexec(pset.db, query);
+
+ ResetCancelConn();
+
+ if (!AcceptResult(res, true))
+ {
+ ClearOrSaveResult(res);
+ res = NULL;
+ }
+
+ return res;
+}
+
+
+/*
+ * PSQLexecWatch
+ *
+ * This function is used for \watch command to send the query to
+ * the server and print out the result.
+ *
+ * Returns 1 if the query executed successfully, 0 if it cannot be repeated,
+ * e.g., because of the interrupt, -1 on error.
+ */
+int
+PSQLexecWatch(const char *query, const printQueryOpt *opt, FILE *printQueryFout)
+{
+ bool timing = pset.timing;
+ double elapsed_msec = 0;
+ int res;
+
+ if (!pset.db)
+ {
+ pg_log_error("You are currently not connected to a database.");
+ return 0;
+ }
+
+ SetCancelConn(pset.db);
+
+ res = ExecQueryAndProcessResults(query, &elapsed_msec, NULL, true, opt, printQueryFout);
+
+ ResetCancelConn();
+
+ /* Possible microtiming output */
+ if (timing)
+ PrintTiming(elapsed_msec);
+
+ return res;
+}
+
+
+/*
+ * PrintNotifications: check for asynchronous notifications, and print them out
+ */
+static void
+PrintNotifications(void)
+{
+ PGnotify *notify;
+
+ PQconsumeInput(pset.db);
+ while ((notify = PQnotifies(pset.db)) != NULL)
+ {
+ /* for backward compatibility, only show payload if nonempty */
+ if (notify->extra[0])
+ fprintf(pset.queryFout, _("Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"),
+ notify->relname, notify->extra, notify->be_pid);
+ else
+ fprintf(pset.queryFout, _("Asynchronous notification \"%s\" received from server process with PID %d.\n"),
+ notify->relname, notify->be_pid);
+ fflush(pset.queryFout);
+ PQfreemem(notify);
+ PQconsumeInput(pset.db);
+ }
+}
+
+
+/*
+ * PrintQueryTuples: assuming query result is OK, print its tuples
+ *
+ * We use the options given by opt unless that's NULL, in which case
+ * we use pset.popt.
+ *
+ * Output is to printQueryFout unless that's NULL, in which case
+ * we use pset.queryFout.
+ *
+ * Returns true if successful, false otherwise.
+ */
+static bool
+PrintQueryTuples(const PGresult *result, const printQueryOpt *opt,
+ FILE *printQueryFout)
+{
+ bool ok = true;
+ FILE *fout = printQueryFout ? printQueryFout : pset.queryFout;
+
+ printQuery(result, opt ? opt : &pset.popt, fout, false, pset.logfile);
+ fflush(fout);
+ if (ferror(fout))
+ {
+ pg_log_error("could not print result table: %m");
+ ok = false;
+ }
+
+ return ok;
+}
+
+
+/*
+ * StoreQueryTuple: assuming query result is OK, save data into variables
+ *
+ * Returns true if successful, false otherwise.
+ */
+static bool
+StoreQueryTuple(const PGresult *result)
+{
+ bool success = true;
+
+ if (PQntuples(result) < 1)
+ {
+ pg_log_error("no rows returned for \\gset");
+ success = false;
+ }
+ else if (PQntuples(result) > 1)
+ {
+ pg_log_error("more than one row returned for \\gset");
+ success = false;
+ }
+ else
+ {
+ int i;
+
+ for (i = 0; i < PQnfields(result); i++)
+ {
+ char *colname = PQfname(result, i);
+ char *varname;
+ char *value;
+
+ /* concatenate prefix and column name */
+ varname = psprintf("%s%s", pset.gset_prefix, colname);
+
+ if (VariableHasHook(pset.vars, varname))
+ {
+ pg_log_warning("attempt to \\gset into specially treated variable \"%s\" ignored",
+ varname);
+ continue;
+ }
+
+ if (!PQgetisnull(result, 0, i))
+ value = PQgetvalue(result, 0, i);
+ else
+ {
+ /* for NULL value, unset rather than set the variable */
+ value = NULL;
+ }
+
+ if (!SetVariable(pset.vars, varname, value))
+ {
+ free(varname);
+ success = false;
+ break;
+ }
+
+ free(varname);
+ }
+ }
+
+ return success;
+}
+
+
+/*
+ * ExecQueryTuples: assuming query result is OK, execute each query
+ * result field as a SQL statement
+ *
+ * Returns true if successful, false otherwise.
+ */
+static bool
+ExecQueryTuples(const PGresult *result)
+{
+ bool success = true;
+ int nrows = PQntuples(result);
+ int ncolumns = PQnfields(result);
+ int r,
+ c;
+
+ /*
+ * We must turn off gexec_flag to avoid infinite recursion. Note that
+ * this allows ExecQueryUsingCursor to be applied to the individual query
+ * results. SendQuery prevents it from being applied when fetching the
+ * queries-to-execute, because it can't handle recursion either.
+ */
+ pset.gexec_flag = false;
+
+ for (r = 0; r < nrows; r++)
+ {
+ for (c = 0; c < ncolumns; c++)
+ {
+ if (!PQgetisnull(result, r, c))
+ {
+ const char *query = PQgetvalue(result, r, c);
+
+ /* Abandon execution if cancel_pressed */
+ if (cancel_pressed)
+ goto loop_exit;
+
+ /*
+ * ECHO_ALL mode should echo these queries, but SendQuery
+ * assumes that MainLoop did that, so we have to do it here.
+ */
+ if (pset.echo == PSQL_ECHO_ALL && !pset.singlestep)
+ {
+ puts(query);
+ fflush(stdout);
+ }
+
+ if (!SendQuery(query))
+ {
+ /* Error - abandon execution if ON_ERROR_STOP */
+ success = false;
+ if (pset.on_error_stop)
+ goto loop_exit;
+ }
+ }
+ }
+ }
+
+loop_exit:
+
+ /*
+ * Restore state. We know gexec_flag was on, else we'd not be here. (We
+ * also know it'll get turned off at end of command, but that's not ours
+ * to do here.)
+ */
+ pset.gexec_flag = true;
+
+ /* Return true if all queries were successful */
+ return success;
+}
+
+
+/*
+ * Marshal the COPY data. Either path will get the
+ * connection out of its COPY state, then call PQresultStatus()
+ * once and report any error. Return whether all was ok.
+ *
+ * For COPY OUT, direct the output to copystream, or discard if that's NULL.
+ * For COPY IN, use pset.copyStream as data source if it's set,
+ * otherwise cur_cmd_source.
+ *
+ * Update *resultp if further processing is necessary; set to NULL otherwise.
+ * Return a result when queryFout can safely output a result status: on COPY
+ * IN, or on COPY OUT if written to something other than pset.queryFout.
+ * Returning NULL prevents the command status from being printed, which we
+ * want if the status line doesn't get taken as part of the COPY data.
+ */
+static bool
+HandleCopyResult(PGresult **resultp, FILE *copystream)
+{
+ bool success;
+ PGresult *copy_result;
+ ExecStatusType result_status = PQresultStatus(*resultp);
+
+ Assert(result_status == PGRES_COPY_OUT ||
+ result_status == PGRES_COPY_IN);
+
+ SetCancelConn(pset.db);
+
+ if (result_status == PGRES_COPY_OUT)
+ {
+ success = handleCopyOut(pset.db,
+ copystream,
+ &copy_result)
+ && (copystream != NULL);
+
+ /*
+ * Suppress status printing if the report would go to the same place
+ * as the COPY data just went. Note this doesn't prevent error
+ * reporting, since handleCopyOut did that.
+ */
+ if (copystream == pset.queryFout)
+ {
+ PQclear(copy_result);
+ copy_result = NULL;
+ }
+ }
+ else
+ {
+ /* COPY IN */
+ /* Ignore the copystream argument passed to the function */
+ copystream = pset.copyStream ? pset.copyStream : pset.cur_cmd_source;
+ success = handleCopyIn(pset.db,
+ copystream,
+ PQbinaryTuples(*resultp),
+ &copy_result);
+ }
+ ResetCancelConn();
+
+ /*
+ * Replace the PGRES_COPY_OUT/IN result with COPY command's exit status,
+ * or with NULL if we want to suppress printing anything.
+ */
+ PQclear(*resultp);
+ *resultp = copy_result;
+
+ return success;
+}
+
+/*
+ * PrintQueryStatus: report command status as required
+ *
+ * Note: Utility function for use by PrintQueryResult() only.
+ */
+static void
+PrintQueryStatus(PGresult *result, FILE *printQueryFout)
+{
+ char buf[16];
+ FILE *fout = printQueryFout ? printQueryFout : pset.queryFout;
+
+ if (!pset.quiet)
+ {
+ if (pset.popt.topt.format == PRINT_HTML)
+ {
+ fputs("<p>", fout);
+ html_escaped_print(PQcmdStatus(result), fout);
+ fputs("</p>\n", fout);
+ }
+ else
+ fprintf(fout, "%s\n", PQcmdStatus(result));
+ fflush(fout);
+ }
+
+ if (pset.logfile)
+ fprintf(pset.logfile, "%s\n", PQcmdStatus(result));
+
+ snprintf(buf, sizeof(buf), "%u", (unsigned int) PQoidValue(result));
+ SetVariable(pset.vars, "LASTOID", buf);
+}
+
+
+/*
+ * PrintQueryResult: print out (or store or execute) query result as required
+ *
+ * Note: Utility function for use by SendQuery() only.
+ *
+ * last is true if this is the last result of a command string.
+ * opt and printQueryFout are defined as for PrintQueryTuples.
+ * printStatusFout is where to send command status; NULL means pset.queryFout.
+ *
+ * Returns true if the query executed successfully, false otherwise.
+ */
+static bool
+PrintQueryResult(PGresult *result, bool last,
+ const printQueryOpt *opt, FILE *printQueryFout,
+ FILE *printStatusFout)
+{
+ bool success;
+ const char *cmdstatus;
+
+ if (!result)
+ return false;
+
+ switch (PQresultStatus(result))
+ {
+ case PGRES_TUPLES_OK:
+ /* store or execute or print the data ... */
+ if (last && pset.gset_prefix)
+ success = StoreQueryTuple(result);
+ else if (last && pset.gexec_flag)
+ success = ExecQueryTuples(result);
+ else if (last && pset.crosstab_flag)
+ success = PrintResultInCrosstab(result);
+ else if (last || pset.show_all_results)
+ success = PrintQueryTuples(result, opt, printQueryFout);
+ else
+ success = true;
+
+ /* if it's INSERT/UPDATE/DELETE RETURNING, also print status */
+ if (last || pset.show_all_results)
+ {
+ cmdstatus = PQcmdStatus(result);
+ if (strncmp(cmdstatus, "INSERT", 6) == 0 ||
+ strncmp(cmdstatus, "UPDATE", 6) == 0 ||
+ strncmp(cmdstatus, "DELETE", 6) == 0)
+ PrintQueryStatus(result, printStatusFout);
+ }
+
+ break;
+
+ case PGRES_COMMAND_OK:
+ if (last || pset.show_all_results)
+ PrintQueryStatus(result, printStatusFout);
+ success = true;
+ break;
+
+ case PGRES_EMPTY_QUERY:
+ success = true;
+ break;
+
+ case PGRES_COPY_OUT:
+ case PGRES_COPY_IN:
+ /* nothing to do here: already processed */
+ success = true;
+ break;
+
+ case PGRES_BAD_RESPONSE:
+ case PGRES_NONFATAL_ERROR:
+ case PGRES_FATAL_ERROR:
+ success = false;
+ break;
+
+ default:
+ success = false;
+ pg_log_error("unexpected PQresultStatus: %d",
+ PQresultStatus(result));
+ break;
+ }
+
+ return success;
+}
+
+/*
+ * SendQuery: send the query string to the backend
+ * (and print out result)
+ *
+ * Note: This is the "front door" way to send a query. That is, use it to
+ * send queries actually entered by the user. These queries will be subject to
+ * single step mode.
+ * To send "back door" queries (generated by slash commands, etc.) in a
+ * controlled way, use PSQLexec().
+ *
+ * Returns true if the query executed successfully, false otherwise.
+ */
+bool
+SendQuery(const char *query)
+{
+ bool timing = pset.timing;
+ PGTransactionStatusType transaction_status;
+ double elapsed_msec = 0;
+ bool OK = false;
+ int i;
+ bool on_error_rollback_savepoint = false;
+ bool svpt_gone = false;
+
+ if (!pset.db)
+ {
+ pg_log_error("You are currently not connected to a database.");
+ goto sendquery_cleanup;
+ }
+
+ if (pset.singlestep)
+ {
+ char buf[3];
+
+ fflush(stderr);
+ printf(_("***(Single step mode: verify command)*******************************************\n"
+ "%s\n"
+ "***(press return to proceed or enter x and return to cancel)********************\n"),
+ query);
+ fflush(stdout);
+ if (fgets(buf, sizeof(buf), stdin) != NULL)
+ if (buf[0] == 'x')
+ goto sendquery_cleanup;
+ if (cancel_pressed)
+ goto sendquery_cleanup;
+ }
+ else if (pset.echo == PSQL_ECHO_QUERIES)
+ {
+ puts(query);
+ fflush(stdout);
+ }
+
+ if (pset.logfile)
+ {
+ fprintf(pset.logfile,
+ _("********* QUERY **********\n"
+ "%s\n"
+ "**************************\n\n"), query);
+ fflush(pset.logfile);
+ }
+
+ SetCancelConn(pset.db);
+
+ transaction_status = PQtransactionStatus(pset.db);
+
+ if (transaction_status == PQTRANS_IDLE &&
+ !pset.autocommit &&
+ !command_no_begin(query))
+ {
+ PGresult *result;
+
+ result = PQexec(pset.db, "BEGIN");
+ if (PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ ClearOrSaveResult(result);
+ goto sendquery_cleanup;
+ }
+ ClearOrSaveResult(result);
+ transaction_status = PQtransactionStatus(pset.db);
+ }
+
+ if (transaction_status == PQTRANS_INTRANS &&
+ pset.on_error_rollback != PSQL_ERROR_ROLLBACK_OFF &&
+ (pset.cur_cmd_interactive ||
+ pset.on_error_rollback == PSQL_ERROR_ROLLBACK_ON))
+ {
+ PGresult *result;
+
+ result = PQexec(pset.db, "SAVEPOINT pg_psql_temporary_savepoint");
+ if (PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ ClearOrSaveResult(result);
+ goto sendquery_cleanup;
+ }
+ ClearOrSaveResult(result);
+ on_error_rollback_savepoint = true;
+ }
+
+ if (pset.gdesc_flag)
+ {
+ /* Describe query's result columns, without executing it */
+ OK = DescribeQuery(query, &elapsed_msec);
+ }
+ else if (pset.fetch_count <= 0 || pset.gexec_flag ||
+ pset.crosstab_flag || !is_select_command(query))
+ {
+ /* Default fetch-it-all-and-print mode */
+ OK = (ExecQueryAndProcessResults(query, &elapsed_msec, &svpt_gone, false, NULL, NULL) > 0);
+ }
+ else
+ {
+ /* Fetch-in-segments mode */
+ OK = ExecQueryUsingCursor(query, &elapsed_msec);
+ }
+
+ if (!OK && pset.echo == PSQL_ECHO_ERRORS)
+ pg_log_info("STATEMENT: %s", query);
+
+ /* If we made a temporary savepoint, possibly release/rollback */
+ if (on_error_rollback_savepoint)
+ {
+ const char *svptcmd = NULL;
+
+ transaction_status = PQtransactionStatus(pset.db);
+
+ switch (transaction_status)
+ {
+ case PQTRANS_INERROR:
+ /* We always rollback on an error */
+ svptcmd = "ROLLBACK TO pg_psql_temporary_savepoint";
+ break;
+
+ case PQTRANS_IDLE:
+ /* If they are no longer in a transaction, then do nothing */
+ break;
+
+ case PQTRANS_INTRANS:
+
+ /*
+ * Release our savepoint, but do nothing if they are messing
+ * with savepoints themselves
+ */
+ if (!svpt_gone)
+ svptcmd = "RELEASE pg_psql_temporary_savepoint";
+ break;
+
+ case PQTRANS_ACTIVE:
+ case PQTRANS_UNKNOWN:
+ default:
+ OK = false;
+ /* PQTRANS_UNKNOWN is expected given a broken connection. */
+ if (transaction_status != PQTRANS_UNKNOWN || ConnectionUp())
+ pg_log_error("unexpected transaction status (%d)",
+ transaction_status);
+ break;
+ }
+
+ if (svptcmd)
+ {
+ PGresult *svptres;
+
+ svptres = PQexec(pset.db, svptcmd);
+ if (PQresultStatus(svptres) != PGRES_COMMAND_OK)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ ClearOrSaveResult(svptres);
+ OK = false;
+
+ goto sendquery_cleanup;
+ }
+ PQclear(svptres);
+ }
+ }
+
+ /* Possible microtiming output */
+ if (timing)
+ PrintTiming(elapsed_msec);
+
+ /* check for events that may occur during query execution */
+
+ if (pset.encoding != PQclientEncoding(pset.db) &&
+ PQclientEncoding(pset.db) >= 0)
+ {
+ /* track effects of SET CLIENT_ENCODING */
+ pset.encoding = PQclientEncoding(pset.db);
+ pset.popt.topt.encoding = pset.encoding;
+ SetVariable(pset.vars, "ENCODING",
+ pg_encoding_to_char(pset.encoding));
+ }
+
+ PrintNotifications();
+
+ /* perform cleanup that should occur after any attempted query */
+
+sendquery_cleanup:
+
+ /* global cancellation reset */
+ ResetCancelConn();
+
+ /* reset \g's output-to-filename trigger */
+ if (pset.gfname)
+ {
+ free(pset.gfname);
+ pset.gfname = NULL;
+ }
+
+ /* restore print settings if \g changed them */
+ if (pset.gsavepopt)
+ {
+ restorePsetInfo(&pset.popt, pset.gsavepopt);
+ pset.gsavepopt = NULL;
+ }
+
+ /* reset \gset trigger */
+ if (pset.gset_prefix)
+ {
+ free(pset.gset_prefix);
+ pset.gset_prefix = NULL;
+ }
+
+ /* reset \gdesc trigger */
+ pset.gdesc_flag = false;
+
+ /* reset \gexec trigger */
+ pset.gexec_flag = false;
+
+ /* reset \crosstabview trigger */
+ pset.crosstab_flag = false;
+ for (i = 0; i < lengthof(pset.ctv_args); i++)
+ {
+ pg_free(pset.ctv_args[i]);
+ pset.ctv_args[i] = NULL;
+ }
+
+ return OK;
+}
+
+
+/*
+ * DescribeQuery: describe the result columns of a query, without executing it
+ *
+ * Returns true if the operation executed successfully, false otherwise.
+ *
+ * If pset.timing is on, total query time (exclusive of result-printing) is
+ * stored into *elapsed_msec.
+ */
+static bool
+DescribeQuery(const char *query, double *elapsed_msec)
+{
+ bool timing = pset.timing;
+ PGresult *result;
+ bool OK;
+ instr_time before,
+ after;
+
+ *elapsed_msec = 0;
+
+ if (timing)
+ INSTR_TIME_SET_CURRENT(before);
+
+ /*
+ * To parse the query but not execute it, we prepare it, using the unnamed
+ * prepared statement. This is invisible to psql users, since there's no
+ * way to access the unnamed prepared statement from psql user space. The
+ * next Parse or Query protocol message would overwrite the statement
+ * anyway. (So there's no great need to clear it when done, which is a
+ * good thing because libpq provides no easy way to do that.)
+ */
+ result = PQprepare(pset.db, "", query, 0, NULL);
+ if (PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ SetResultVariables(result, false);
+ ClearOrSaveResult(result);
+ return false;
+ }
+ PQclear(result);
+
+ result = PQdescribePrepared(pset.db, "");
+ OK = AcceptResult(result, true) &&
+ (PQresultStatus(result) == PGRES_COMMAND_OK);
+ if (OK && result)
+ {
+ if (PQnfields(result) > 0)
+ {
+ PQExpBufferData buf;
+ int i;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT name AS \"%s\", pg_catalog.format_type(tp, tpm) AS \"%s\"\n"
+ "FROM (VALUES ",
+ gettext_noop("Column"),
+ gettext_noop("Type"));
+
+ for (i = 0; i < PQnfields(result); i++)
+ {
+ const char *name;
+ char *escname;
+
+ if (i > 0)
+ appendPQExpBufferStr(&buf, ",");
+
+ name = PQfname(result, i);
+ escname = PQescapeLiteral(pset.db, name, strlen(name));
+
+ if (escname == NULL)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ PQclear(result);
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBuffer(&buf, "(%s, '%u'::pg_catalog.oid, %d)",
+ escname,
+ PQftype(result, i),
+ PQfmod(result, i));
+
+ PQfreemem(escname);
+ }
+
+ appendPQExpBufferStr(&buf, ") s(name, tp, tpm)");
+ PQclear(result);
+
+ result = PQexec(pset.db, buf.data);
+ OK = AcceptResult(result, true);
+
+ if (timing)
+ {
+ INSTR_TIME_SET_CURRENT(after);
+ INSTR_TIME_SUBTRACT(after, before);
+ *elapsed_msec += INSTR_TIME_GET_MILLISEC(after);
+ }
+
+ if (OK && result)
+ OK = PrintQueryResult(result, true, NULL, NULL, NULL);
+
+ termPQExpBuffer(&buf);
+ }
+ else
+ fprintf(pset.queryFout,
+ _("The command has no result, or the result has no columns.\n"));
+ }
+
+ SetResultVariables(result, OK);
+ ClearOrSaveResult(result);
+
+ return OK;
+}
+
+
+/*
+ * ExecQueryAndProcessResults: utility function for use by SendQuery()
+ * and PSQLexecWatch().
+ *
+ * Sends query and cycles through PGresult objects.
+ *
+ * If our command string contained a COPY FROM STDIN or COPY TO STDOUT, the
+ * PGresult associated with these commands must be processed by providing an
+ * input or output stream. In that event, we'll marshal data for the COPY.
+ *
+ * For other commands, the results are processed normally, depending on their
+ * status.
+ *
+ * Returns 1 on complete success, 0 on interrupt and -1 or errors. Possible
+ * failure modes include purely client-side problems; check the transaction
+ * status for the server-side opinion.
+ *
+ * Note that on a combined query, failure does not mean that nothing was
+ * committed.
+ */
+static int
+ExecQueryAndProcessResults(const char *query,
+ double *elapsed_msec, bool *svpt_gone_p,
+ bool is_watch,
+ const printQueryOpt *opt, FILE *printQueryFout)
+{
+ bool timing = pset.timing;
+ bool success;
+ instr_time before,
+ after;
+ PGresult *result;
+ FILE *gfile_fout = NULL;
+ bool gfile_is_pipe = false;
+
+ if (timing)
+ INSTR_TIME_SET_CURRENT(before);
+
+ success = PQsendQuery(pset.db, query);
+
+ if (!success)
+ {
+ const char *error = PQerrorMessage(pset.db);
+
+ if (strlen(error))
+ pg_log_info("%s", error);
+
+ CheckConnection();
+
+ return -1;
+ }
+
+ /*
+ * If SIGINT is sent while the query is processing, the interrupt will be
+ * consumed. The user's intention, though, is to cancel the entire watch
+ * process, so detect a sent cancellation request and exit in this case.
+ */
+ if (is_watch && cancel_pressed)
+ {
+ ClearOrSaveAllResults();
+ return 0;
+ }
+
+ /* first result */
+ result = PQgetResult(pset.db);
+
+ while (result != NULL)
+ {
+ ExecStatusType result_status;
+ PGresult *next_result;
+ bool last;
+
+ if (!AcceptResult(result, false))
+ {
+ /*
+ * Some error occured, either a server-side failure or a failure
+ * to submit the command string. Record that.
+ */
+ const char *error = PQresultErrorMessage(result);
+
+ if (strlen(error))
+ pg_log_info("%s", error);
+
+ CheckConnection();
+ if (!is_watch)
+ SetResultVariables(result, false);
+
+ /* keep the result status before clearing it */
+ result_status = PQresultStatus(result);
+ ClearOrSaveResult(result);
+ success = false;
+
+ /*
+ * switch to next result
+ */
+ if (result_status == PGRES_COPY_BOTH ||
+ result_status == PGRES_COPY_OUT ||
+ result_status == PGRES_COPY_IN)
+
+ /*
+ * For some obscure reason PQgetResult does *not* return a
+ * NULL in copy cases despite the result having been cleared,
+ * but keeps returning an "empty" result that we have to
+ * ignore manually.
+ */
+ result = NULL;
+ else
+ result = PQgetResult(pset.db);
+
+ /*
+ * Get current timing measure in case an error occurs
+ */
+ if (timing)
+ {
+ INSTR_TIME_SET_CURRENT(after);
+ INSTR_TIME_SUBTRACT(after, before);
+ *elapsed_msec = INSTR_TIME_GET_MILLISEC(after);
+ }
+
+ continue;
+ }
+ else if (svpt_gone_p && !*svpt_gone_p)
+ {
+ /*
+ * Check if the user ran any command that would destroy our
+ * internal savepoint: If the user did COMMIT AND CHAIN, RELEASE
+ * or ROLLBACK, our savepoint is gone. If they issued a SAVEPOINT,
+ * releasing ours would remove theirs.
+ */
+ const char *cmd = PQcmdStatus(result);
+
+ *svpt_gone_p = (strcmp(cmd, "COMMIT") == 0 ||
+ strcmp(cmd, "SAVEPOINT") == 0 ||
+ strcmp(cmd, "RELEASE") == 0 ||
+ strcmp(cmd, "ROLLBACK") == 0);
+ }
+
+ result_status = PQresultStatus(result);
+
+ /* must handle COPY before changing the current result */
+ Assert(result_status != PGRES_COPY_BOTH);
+ if (result_status == PGRES_COPY_IN ||
+ result_status == PGRES_COPY_OUT)
+ {
+ FILE *copy_stream = NULL;
+
+ /*
+ * For COPY OUT, direct the output to the default place (probably
+ * a pager pipe) for \watch, or to pset.copyStream for \copy,
+ * otherwise to pset.gfname if that's set, otherwise to
+ * pset.queryFout.
+ */
+ if (result_status == PGRES_COPY_OUT)
+ {
+ if (is_watch)
+ {
+ /* invoked by \watch */
+ copy_stream = printQueryFout ? printQueryFout : pset.queryFout;
+ }
+ else if (pset.copyStream)
+ {
+ /* invoked by \copy */
+ copy_stream = pset.copyStream;
+ }
+ else if (pset.gfname)
+ {
+ /* send to \g file, which we may have opened already */
+ if (gfile_fout == NULL)
+ {
+ if (openQueryOutputFile(pset.gfname,
+ &gfile_fout, &gfile_is_pipe))
+ {
+ if (gfile_is_pipe)
+ disable_sigpipe_trap();
+ copy_stream = gfile_fout;
+ }
+ else
+ success = false;
+ }
+ else
+ copy_stream = gfile_fout;
+ }
+ else
+ {
+ /* fall back to the generic query output stream */
+ copy_stream = pset.queryFout;
+ }
+ }
+
+ /*
+ * Even if the output stream could not be opened, we call
+ * HandleCopyResult() with a NULL output stream to collect and
+ * discard the COPY data.
+ */
+ success &= HandleCopyResult(&result, copy_stream);
+ }
+
+ /*
+ * Check PQgetResult() again. In the typical case of a single-command
+ * string, it will return NULL. Otherwise, we'll have other results
+ * to process. We need to do that to check whether this is the last.
+ */
+ next_result = PQgetResult(pset.db);
+ last = (next_result == NULL);
+
+ /*
+ * Update current timing measure.
+ *
+ * It will include the display of previous results, if any. This
+ * cannot be helped because the server goes on processing further
+ * queries anyway while the previous ones are being displayed. The
+ * parallel execution of the client display hides the server time when
+ * it is shorter.
+ *
+ * With combined queries, timing must be understood as an upper bound
+ * of the time spent processing them.
+ */
+ if (timing)
+ {
+ INSTR_TIME_SET_CURRENT(after);
+ INSTR_TIME_SUBTRACT(after, before);
+ *elapsed_msec = INSTR_TIME_GET_MILLISEC(after);
+ }
+
+ /* this may or may not print something depending on settings */
+ if (result != NULL)
+ {
+ /*
+ * If results need to be printed into the file specified by \g,
+ * open it, unless we already did. Note that when pset.gfname is
+ * set, the passed-in value of printQueryFout is not used for
+ * tuple output, but it's still used for status output.
+ */
+ FILE *tuples_fout = printQueryFout;
+ bool do_print = true;
+
+ if (PQresultStatus(result) == PGRES_TUPLES_OK &&
+ pset.gfname)
+ {
+ if (gfile_fout == NULL)
+ {
+ if (openQueryOutputFile(pset.gfname,
+ &gfile_fout, &gfile_is_pipe))
+ {
+ if (gfile_is_pipe)
+ disable_sigpipe_trap();
+ }
+ else
+ success = do_print = false;
+ }
+ tuples_fout = gfile_fout;
+ }
+ if (do_print)
+ success &= PrintQueryResult(result, last, opt,
+ tuples_fout, printQueryFout);
+ }
+
+ /* set variables on last result if all went well */
+ if (!is_watch && last && success)
+ SetResultVariables(result, true);
+
+ ClearOrSaveResult(result);
+ result = next_result;
+
+ if (cancel_pressed)
+ {
+ ClearOrSaveAllResults();
+ break;
+ }
+ }
+
+ /* close \g file if we opened it */
+ if (gfile_fout)
+ {
+ if (gfile_is_pipe)
+ {
+ pclose(gfile_fout);
+ restore_sigpipe_trap();
+ }
+ else
+ fclose(gfile_fout);
+ }
+
+ /* may need this to recover from conn loss during COPY */
+ if (!CheckConnection())
+ return -1;
+
+ return cancel_pressed ? 0 : success ? 1 : -1;
+}
+
+
+/*
+ * ExecQueryUsingCursor: run a SELECT-like query using a cursor
+ *
+ * This feature allows result sets larger than RAM to be dealt with.
+ *
+ * Returns true if the query executed successfully, false otherwise.
+ *
+ * If pset.timing is on, total query time (exclusive of result-printing) is
+ * stored into *elapsed_msec.
+ */
+static bool
+ExecQueryUsingCursor(const char *query, double *elapsed_msec)
+{
+ bool OK = true;
+ PGresult *result;
+ PQExpBufferData buf;
+ printQueryOpt my_popt = pset.popt;
+ bool timing = pset.timing;
+ FILE *fout;
+ bool is_pipe;
+ bool is_pager = false;
+ bool started_txn = false;
+ int64 total_tuples = 0;
+ int ntuples;
+ int fetch_count;
+ char fetch_cmd[64];
+ instr_time before,
+ after;
+ int flush_error;
+
+ *elapsed_msec = 0;
+
+ /* initialize print options for partial table output */
+ my_popt.topt.start_table = true;
+ my_popt.topt.stop_table = false;
+ my_popt.topt.prior_records = 0;
+
+ if (timing)
+ INSTR_TIME_SET_CURRENT(before);
+
+ /* if we're not in a transaction, start one */
+ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE)
+ {
+ result = PQexec(pset.db, "BEGIN");
+ OK = AcceptResult(result, true) &&
+ (PQresultStatus(result) == PGRES_COMMAND_OK);
+ ClearOrSaveResult(result);
+ if (!OK)
+ return false;
+ started_txn = true;
+ }
+
+ /* Send DECLARE CURSOR */
+ initPQExpBuffer(&buf);
+ appendPQExpBuffer(&buf, "DECLARE _psql_cursor NO SCROLL CURSOR FOR\n%s",
+ query);
+
+ result = PQexec(pset.db, buf.data);
+ OK = AcceptResult(result, true) &&
+ (PQresultStatus(result) == PGRES_COMMAND_OK);
+ if (!OK)
+ SetResultVariables(result, OK);
+ ClearOrSaveResult(result);
+ termPQExpBuffer(&buf);
+ if (!OK)
+ goto cleanup;
+
+ if (timing)
+ {
+ INSTR_TIME_SET_CURRENT(after);
+ INSTR_TIME_SUBTRACT(after, before);
+ *elapsed_msec += INSTR_TIME_GET_MILLISEC(after);
+ }
+
+ /*
+ * In \gset mode, we force the fetch count to be 2, so that we will throw
+ * the appropriate error if the query returns more than one row.
+ */
+ if (pset.gset_prefix)
+ fetch_count = 2;
+ else
+ fetch_count = pset.fetch_count;
+
+ snprintf(fetch_cmd, sizeof(fetch_cmd),
+ "FETCH FORWARD %d FROM _psql_cursor",
+ fetch_count);
+
+ /* prepare to write output to \g argument, if any */
+ if (pset.gfname)
+ {
+ if (!openQueryOutputFile(pset.gfname, &fout, &is_pipe))
+ {
+ OK = false;
+ goto cleanup;
+ }
+ if (is_pipe)
+ disable_sigpipe_trap();
+ }
+ else
+ {
+ fout = pset.queryFout;
+ is_pipe = false; /* doesn't matter */
+ }
+
+ /* clear any pre-existing error indication on the output stream */
+ clearerr(fout);
+
+ for (;;)
+ {
+ if (timing)
+ INSTR_TIME_SET_CURRENT(before);
+
+ /* get fetch_count tuples at a time */
+ result = PQexec(pset.db, fetch_cmd);
+
+ if (timing)
+ {
+ INSTR_TIME_SET_CURRENT(after);
+ INSTR_TIME_SUBTRACT(after, before);
+ *elapsed_msec += INSTR_TIME_GET_MILLISEC(after);
+ }
+
+ if (PQresultStatus(result) != PGRES_TUPLES_OK)
+ {
+ /* shut down pager before printing error message */
+ if (is_pager)
+ {
+ ClosePager(fout);
+ is_pager = false;
+ }
+
+ OK = AcceptResult(result, true);
+ Assert(!OK);
+ SetResultVariables(result, OK);
+ ClearOrSaveResult(result);
+ break;
+ }
+
+ if (pset.gset_prefix)
+ {
+ /* StoreQueryTuple will complain if not exactly one row */
+ OK = StoreQueryTuple(result);
+ ClearOrSaveResult(result);
+ break;
+ }
+
+ /*
+ * Note we do not deal with \gdesc, \gexec or \crosstabview modes here
+ */
+
+ ntuples = PQntuples(result);
+ total_tuples += ntuples;
+
+ if (ntuples < fetch_count)
+ {
+ /* this is the last result set, so allow footer decoration */
+ my_popt.topt.stop_table = true;
+ }
+ else if (fout == stdout && !is_pager)
+ {
+ /*
+ * If query requires multiple result sets, hack to ensure that
+ * only one pager instance is used for the whole mess
+ */
+ fout = PageOutput(INT_MAX, &(my_popt.topt));
+ is_pager = true;
+ }
+
+ printQuery(result, &my_popt, fout, is_pager, pset.logfile);
+
+ ClearOrSaveResult(result);
+
+ /* after the first result set, disallow header decoration */
+ my_popt.topt.start_table = false;
+ my_popt.topt.prior_records += ntuples;
+
+ /*
+ * Make sure to flush the output stream, so intermediate results are
+ * visible to the client immediately. We check the results because if
+ * the pager dies/exits/etc, there's no sense throwing more data at
+ * it.
+ */
+ flush_error = fflush(fout);
+
+ /*
+ * Check if we are at the end, if a cancel was pressed, or if there
+ * were any errors either trying to flush out the results, or more
+ * generally on the output stream at all. If we hit any errors
+ * writing things to the stream, we presume $PAGER has disappeared and
+ * stop bothering to pull down more data.
+ */
+ if (ntuples < fetch_count || cancel_pressed || flush_error ||
+ ferror(fout))
+ break;
+ }
+
+ if (pset.gfname)
+ {
+ /* close \g argument file/pipe */
+ if (is_pipe)
+ {
+ pclose(fout);
+ restore_sigpipe_trap();
+ }
+ else
+ fclose(fout);
+ }
+ else if (is_pager)
+ {
+ /* close transient pager */
+ ClosePager(fout);
+ }
+
+ if (OK)
+ {
+ /*
+ * We don't have a PGresult here, and even if we did it wouldn't have
+ * the right row count, so fake SetResultVariables(). In error cases,
+ * we already set the result variables above.
+ */
+ char buf[32];
+
+ SetVariable(pset.vars, "ERROR", "false");
+ SetVariable(pset.vars, "SQLSTATE", "00000");
+ snprintf(buf, sizeof(buf), INT64_FORMAT, total_tuples);
+ SetVariable(pset.vars, "ROW_COUNT", buf);
+ }
+
+cleanup:
+ if (timing)
+ INSTR_TIME_SET_CURRENT(before);
+
+ /*
+ * We try to close the cursor on either success or failure, but on failure
+ * ignore the result (it's probably just a bleat about being in an aborted
+ * transaction)
+ */
+ result = PQexec(pset.db, "CLOSE _psql_cursor");
+ if (OK)
+ {
+ OK = AcceptResult(result, true) &&
+ (PQresultStatus(result) == PGRES_COMMAND_OK);
+ ClearOrSaveResult(result);
+ }
+ else
+ PQclear(result);
+
+ if (started_txn)
+ {
+ result = PQexec(pset.db, OK ? "COMMIT" : "ROLLBACK");
+ OK &= AcceptResult(result, true) &&
+ (PQresultStatus(result) == PGRES_COMMAND_OK);
+ ClearOrSaveResult(result);
+ }
+
+ if (timing)
+ {
+ INSTR_TIME_SET_CURRENT(after);
+ INSTR_TIME_SUBTRACT(after, before);
+ *elapsed_msec += INSTR_TIME_GET_MILLISEC(after);
+ }
+
+ return OK;
+}
+
+
+/*
+ * Advance the given char pointer over white space and SQL comments.
+ */
+static const char *
+skip_white_space(const char *query)
+{
+ int cnestlevel = 0; /* slash-star comment nest level */
+
+ while (*query)
+ {
+ int mblen = PQmblenBounded(query, pset.encoding);
+
+ /*
+ * Note: we assume the encoding is a superset of ASCII, so that for
+ * example "query[0] == '/'" is meaningful. However, we do NOT assume
+ * that the second and subsequent bytes of a multibyte character
+ * couldn't look like ASCII characters; so it is critical to advance
+ * by mblen, not 1, whenever we haven't exactly identified the
+ * character we are skipping over.
+ */
+ if (isspace((unsigned char) *query))
+ query += mblen;
+ else if (query[0] == '/' && query[1] == '*')
+ {
+ cnestlevel++;
+ query += 2;
+ }
+ else if (cnestlevel > 0 && query[0] == '*' && query[1] == '/')
+ {
+ cnestlevel--;
+ query += 2;
+ }
+ else if (cnestlevel == 0 && query[0] == '-' && query[1] == '-')
+ {
+ query += 2;
+
+ /*
+ * We have to skip to end of line since any slash-star inside the
+ * -- comment does NOT start a slash-star comment.
+ */
+ while (*query)
+ {
+ if (*query == '\n')
+ {
+ query++;
+ break;
+ }
+ query += PQmblenBounded(query, pset.encoding);
+ }
+ }
+ else if (cnestlevel > 0)
+ query += mblen;
+ else
+ break; /* found first token */
+ }
+
+ return query;
+}
+
+
+/*
+ * Check whether a command is one of those for which we should NOT start
+ * a new transaction block (ie, send a preceding BEGIN).
+ *
+ * These include the transaction control statements themselves, plus
+ * certain statements that the backend disallows inside transaction blocks.
+ */
+static bool
+command_no_begin(const char *query)
+{
+ int wordlen;
+
+ /*
+ * First we must advance over any whitespace and comments.
+ */
+ query = skip_white_space(query);
+
+ /*
+ * Check word length (since "beginx" is not "begin").
+ */
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ /*
+ * Transaction control commands. These should include every keyword that
+ * gives rise to a TransactionStmt in the backend grammar, except for the
+ * savepoint-related commands.
+ *
+ * (We assume that START must be START TRANSACTION, since there is
+ * presently no other "START foo" command.)
+ */
+ if (wordlen == 5 && pg_strncasecmp(query, "abort", 5) == 0)
+ return true;
+ if (wordlen == 5 && pg_strncasecmp(query, "begin", 5) == 0)
+ return true;
+ if (wordlen == 5 && pg_strncasecmp(query, "start", 5) == 0)
+ return true;
+ if (wordlen == 6 && pg_strncasecmp(query, "commit", 6) == 0)
+ return true;
+ if (wordlen == 3 && pg_strncasecmp(query, "end", 3) == 0)
+ return true;
+ if (wordlen == 8 && pg_strncasecmp(query, "rollback", 8) == 0)
+ return true;
+ if (wordlen == 7 && pg_strncasecmp(query, "prepare", 7) == 0)
+ {
+ /* PREPARE TRANSACTION is a TC command, PREPARE foo is not */
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ if (wordlen == 11 && pg_strncasecmp(query, "transaction", 11) == 0)
+ return true;
+ return false;
+ }
+
+ /*
+ * Commands not allowed within transactions. The statements checked for
+ * here should be exactly those that call PreventInTransactionBlock() in
+ * the backend.
+ */
+ if (wordlen == 6 && pg_strncasecmp(query, "vacuum", 6) == 0)
+ return true;
+ if (wordlen == 7 && pg_strncasecmp(query, "cluster", 7) == 0)
+ {
+ /* CLUSTER with any arguments is allowed in transactions */
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ if (isalpha((unsigned char) query[0]))
+ return false; /* has additional words */
+ return true; /* it's CLUSTER without arguments */
+ }
+
+ if (wordlen == 6 && pg_strncasecmp(query, "create", 6) == 0)
+ {
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ if (wordlen == 8 && pg_strncasecmp(query, "database", 8) == 0)
+ return true;
+ if (wordlen == 10 && pg_strncasecmp(query, "tablespace", 10) == 0)
+ return true;
+
+ /* CREATE [UNIQUE] INDEX CONCURRENTLY isn't allowed in xacts */
+ if (wordlen == 6 && pg_strncasecmp(query, "unique", 6) == 0)
+ {
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+ }
+
+ if (wordlen == 5 && pg_strncasecmp(query, "index", 5) == 0)
+ {
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ if (wordlen == 12 && pg_strncasecmp(query, "concurrently", 12) == 0)
+ return true;
+ }
+
+ return false;
+ }
+
+ if (wordlen == 5 && pg_strncasecmp(query, "alter", 5) == 0)
+ {
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ /* ALTER SYSTEM isn't allowed in xacts */
+ if (wordlen == 6 && pg_strncasecmp(query, "system", 6) == 0)
+ return true;
+
+ return false;
+ }
+
+ /*
+ * Note: these tests will match DROP SYSTEM and REINDEX TABLESPACE, which
+ * aren't really valid commands so we don't care much. The other four
+ * possible matches are correct.
+ */
+ if ((wordlen == 4 && pg_strncasecmp(query, "drop", 4) == 0) ||
+ (wordlen == 7 && pg_strncasecmp(query, "reindex", 7) == 0))
+ {
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ if (wordlen == 8 && pg_strncasecmp(query, "database", 8) == 0)
+ return true;
+ if (wordlen == 6 && pg_strncasecmp(query, "system", 6) == 0)
+ return true;
+ if (wordlen == 10 && pg_strncasecmp(query, "tablespace", 10) == 0)
+ return true;
+ if (wordlen == 5 && (pg_strncasecmp(query, "index", 5) == 0 ||
+ pg_strncasecmp(query, "table", 5) == 0))
+ {
+ query += wordlen;
+ query = skip_white_space(query);
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ /*
+ * REINDEX [ TABLE | INDEX ] CONCURRENTLY are not allowed in
+ * xacts.
+ */
+ if (wordlen == 12 && pg_strncasecmp(query, "concurrently", 12) == 0)
+ return true;
+ }
+
+ /* DROP INDEX CONCURRENTLY isn't allowed in xacts */
+ if (wordlen == 5 && pg_strncasecmp(query, "index", 5) == 0)
+ {
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ if (wordlen == 12 && pg_strncasecmp(query, "concurrently", 12) == 0)
+ return true;
+
+ return false;
+ }
+
+ return false;
+ }
+
+ /* DISCARD ALL isn't allowed in xacts, but other variants are allowed. */
+ if (wordlen == 7 && pg_strncasecmp(query, "discard", 7) == 0)
+ {
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ if (wordlen == 3 && pg_strncasecmp(query, "all", 3) == 0)
+ return true;
+ return false;
+ }
+
+ return false;
+}
+
+
+/*
+ * Check whether the specified command is a SELECT (or VALUES).
+ */
+static bool
+is_select_command(const char *query)
+{
+ int wordlen;
+
+ /*
+ * First advance over any whitespace, comments and left parentheses.
+ */
+ for (;;)
+ {
+ query = skip_white_space(query);
+ if (query[0] == '(')
+ query++;
+ else
+ break;
+ }
+
+ /*
+ * Check word length (since "selectx" is not "select").
+ */
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ if (wordlen == 6 && pg_strncasecmp(query, "select", 6) == 0)
+ return true;
+
+ if (wordlen == 6 && pg_strncasecmp(query, "values", 6) == 0)
+ return true;
+
+ return false;
+}
+
+
+/*
+ * Test if the current user is a database superuser.
+ */
+bool
+is_superuser(void)
+{
+ const char *val;
+
+ if (!pset.db)
+ return false;
+
+ val = PQparameterStatus(pset.db, "is_superuser");
+
+ if (val && strcmp(val, "on") == 0)
+ return true;
+
+ return false;
+}
+
+
+/*
+ * Test if the current session uses standard string literals.
+ */
+bool
+standard_strings(void)
+{
+ const char *val;
+
+ if (!pset.db)
+ return false;
+
+ val = PQparameterStatus(pset.db, "standard_conforming_strings");
+
+ if (val && strcmp(val, "on") == 0)
+ return true;
+
+ return false;
+}
+
+
+/*
+ * Return the session user of the current connection.
+ */
+const char *
+session_username(void)
+{
+ const char *val;
+
+ if (!pset.db)
+ return NULL;
+
+ val = PQparameterStatus(pset.db, "session_authorization");
+ if (val)
+ return val;
+ else
+ return PQuser(pset.db);
+}
+
+
+/* expand_tilde
+ *
+ * substitute '~' with HOME or '~username' with username's home dir
+ *
+ */
+void
+expand_tilde(char **filename)
+{
+ if (!filename || !(*filename))
+ return;
+
+ /*
+ * WIN32 doesn't use tilde expansion for file names. Also, it uses tilde
+ * for short versions of long file names, though the tilde is usually
+ * toward the end, not at the beginning.
+ */
+#ifndef WIN32
+
+ /* try tilde expansion */
+ if (**filename == '~')
+ {
+ char *fn;
+ char oldp,
+ *p;
+ struct passwd *pw;
+ char home[MAXPGPATH];
+
+ fn = *filename;
+ *home = '\0';
+
+ p = fn + 1;
+ while (*p != '/' && *p != '\0')
+ p++;
+
+ oldp = *p;
+ *p = '\0';
+
+ if (*(fn + 1) == '\0')
+ get_home_path(home); /* ~ or ~/ only */
+ else if ((pw = getpwnam(fn + 1)) != NULL)
+ strlcpy(home, pw->pw_dir, sizeof(home)); /* ~user */
+
+ *p = oldp;
+ if (strlen(home) != 0)
+ {
+ char *newfn;
+
+ newfn = psprintf("%s%s", home, p);
+ free(fn);
+ *filename = newfn;
+ }
+ }
+#endif
+}
+
+/*
+ * Checks if connection string starts with either of the valid URI prefix
+ * designators.
+ *
+ * Returns the URI prefix length, 0 if the string doesn't contain a URI prefix.
+ *
+ * XXX This is a duplicate of the eponymous libpq function.
+ */
+static int
+uri_prefix_length(const char *connstr)
+{
+ /* The connection URI must start with either of the following designators: */
+ static const char uri_designator[] = "postgresql://";
+ static const char short_uri_designator[] = "postgres://";
+
+ if (strncmp(connstr, uri_designator,
+ sizeof(uri_designator) - 1) == 0)
+ return sizeof(uri_designator) - 1;
+
+ if (strncmp(connstr, short_uri_designator,
+ sizeof(short_uri_designator) - 1) == 0)
+ return sizeof(short_uri_designator) - 1;
+
+ return 0;
+}
+
+/*
+ * Recognized connection string either starts with a valid URI prefix or
+ * contains a "=" in it.
+ *
+ * Must be consistent with parse_connection_string: anything for which this
+ * returns true should at least look like it's parseable by that routine.
+ *
+ * XXX This is a duplicate of the eponymous libpq function.
+ */
+bool
+recognized_connection_string(const char *connstr)
+{
+ return uri_prefix_length(connstr) != 0 || strchr(connstr, '=') != NULL;
+}
diff --git a/src/bin/psql/common.h b/src/bin/psql/common.h
new file mode 100644
index 0000000..d84c3a0
--- /dev/null
+++ b/src/bin/psql/common.h
@@ -0,0 +1,44 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/common.h
+ */
+#ifndef COMMON_H
+#define COMMON_H
+
+#include <setjmp.h>
+
+#include "fe_utils/print.h"
+#include "fe_utils/psqlscan.h"
+#include "libpq-fe.h"
+
+extern bool openQueryOutputFile(const char *fname, FILE **fout, bool *is_pipe);
+extern bool setQFout(const char *fname);
+
+extern char *psql_get_variable(const char *varname, PsqlScanQuoteType quote,
+ void *passthrough);
+
+extern void NoticeProcessor(void *arg, const char *message);
+
+extern volatile bool sigint_interrupt_enabled;
+
+extern sigjmp_buf sigint_interrupt_jmp;
+
+extern void psql_setup_cancel_handler(void);
+
+extern PGresult *PSQLexec(const char *query);
+extern int PSQLexecWatch(const char *query, const printQueryOpt *opt, FILE *printQueryFout);
+
+extern bool SendQuery(const char *query);
+
+extern bool is_superuser(void);
+extern bool standard_strings(void);
+extern const char *session_username(void);
+
+extern void expand_tilde(char **filename);
+
+extern bool recognized_connection_string(const char *connstr);
+
+#endif /* COMMON_H */
diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c
new file mode 100644
index 0000000..23363b0
--- /dev/null
+++ b/src/bin/psql/copy.c
@@ -0,0 +1,728 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/copy.c
+ */
+#include "postgres_fe.h"
+
+#include <signal.h>
+#include <sys/stat.h>
+#ifndef WIN32
+#include <unistd.h> /* for isatty */
+#else
+#include <io.h> /* I think */
+#endif
+
+#include "common.h"
+#include "common/logging.h"
+#include "copy.h"
+#include "libpq-fe.h"
+#include "pqexpbuffer.h"
+#include "prompt.h"
+#include "settings.h"
+#include "stringutils.h"
+
+/*
+ * parse_slash_copy
+ * -- parses \copy command line
+ *
+ * The documented syntax is:
+ * \copy tablename [(columnlist)] from|to filename [options]
+ * \copy ( query stmt ) to filename [options]
+ *
+ * where 'filename' can be one of the following:
+ * '<file path>' | PROGRAM '<command>' | stdin | stdout | pstdout | pstdout
+ * and 'query' can be one of the following:
+ * SELECT | UPDATE | INSERT | DELETE
+ *
+ * An undocumented fact is that you can still write BINARY before the
+ * tablename; this is a hangover from the pre-7.3 syntax. The options
+ * syntax varies across backend versions, but we avoid all that mess
+ * by just transmitting the stuff after the filename literally.
+ *
+ * table name can be double-quoted and can have a schema part.
+ * column names can be double-quoted.
+ * filename can be single-quoted like SQL literals.
+ * command must be single-quoted like SQL literals.
+ *
+ * returns a malloc'ed structure with the options, or NULL on parsing error
+ */
+
+struct copy_options
+{
+ char *before_tofrom; /* COPY string before TO/FROM */
+ char *after_tofrom; /* COPY string after TO/FROM filename */
+ char *file; /* NULL = stdin/stdout */
+ bool program; /* is 'file' a program to popen? */
+ bool psql_inout; /* true = use psql stdin/stdout */
+ bool from; /* true = FROM, false = TO */
+};
+
+
+static void
+free_copy_options(struct copy_options *ptr)
+{
+ if (!ptr)
+ return;
+ free(ptr->before_tofrom);
+ free(ptr->after_tofrom);
+ free(ptr->file);
+ free(ptr);
+}
+
+
+/* concatenate "more" onto "var", freeing the original value of *var */
+static void
+xstrcat(char **var, const char *more)
+{
+ char *newvar;
+
+ newvar = psprintf("%s%s", *var, more);
+ free(*var);
+ *var = newvar;
+}
+
+
+static struct copy_options *
+parse_slash_copy(const char *args)
+{
+ struct copy_options *result;
+ char *token;
+ const char *whitespace = " \t\n\r";
+ char nonstd_backslash = standard_strings() ? 0 : '\\';
+
+ if (!args)
+ {
+ pg_log_error("\\copy: arguments required");
+ return NULL;
+ }
+
+ result = pg_malloc0(sizeof(struct copy_options));
+
+ result->before_tofrom = pg_strdup(""); /* initialize for appending */
+
+ token = strtokx(args, whitespace, ".,()", "\"",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+
+ /* The following can be removed when we drop 7.3 syntax support */
+ if (pg_strcasecmp(token, "binary") == 0)
+ {
+ xstrcat(&result->before_tofrom, token);
+ token = strtokx(NULL, whitespace, ".,()", "\"",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+ }
+
+ /* Handle COPY (query) case */
+ if (token[0] == '(')
+ {
+ int parens = 1;
+
+ while (parens > 0)
+ {
+ xstrcat(&result->before_tofrom, " ");
+ xstrcat(&result->before_tofrom, token);
+ token = strtokx(NULL, whitespace, "()", "\"'",
+ nonstd_backslash, true, false, pset.encoding);
+ if (!token)
+ goto error;
+ if (token[0] == '(')
+ parens++;
+ else if (token[0] == ')')
+ parens--;
+ }
+ }
+
+ xstrcat(&result->before_tofrom, " ");
+ xstrcat(&result->before_tofrom, token);
+ token = strtokx(NULL, whitespace, ".,()", "\"",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+
+ /*
+ * strtokx() will not have returned a multi-character token starting with
+ * '.', so we don't need strcmp() here. Likewise for '(', etc, below.
+ */
+ if (token[0] == '.')
+ {
+ /* handle schema . table */
+ xstrcat(&result->before_tofrom, token);
+ token = strtokx(NULL, whitespace, ".,()", "\"",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+ xstrcat(&result->before_tofrom, token);
+ token = strtokx(NULL, whitespace, ".,()", "\"",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+ }
+
+ if (token[0] == '(')
+ {
+ /* handle parenthesized column list */
+ for (;;)
+ {
+ xstrcat(&result->before_tofrom, " ");
+ xstrcat(&result->before_tofrom, token);
+ token = strtokx(NULL, whitespace, "()", "\"",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+ if (token[0] == ')')
+ break;
+ }
+ xstrcat(&result->before_tofrom, " ");
+ xstrcat(&result->before_tofrom, token);
+ token = strtokx(NULL, whitespace, ".,()", "\"",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+ }
+
+ if (pg_strcasecmp(token, "from") == 0)
+ result->from = true;
+ else if (pg_strcasecmp(token, "to") == 0)
+ result->from = false;
+ else
+ goto error;
+
+ /* { 'filename' | PROGRAM 'command' | STDIN | STDOUT | PSTDIN | PSTDOUT } */
+ token = strtokx(NULL, whitespace, ";", "'",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+
+ if (pg_strcasecmp(token, "program") == 0)
+ {
+ int toklen;
+
+ token = strtokx(NULL, whitespace, ";", "'",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+
+ /*
+ * The shell command must be quoted. This isn't fool-proof, but
+ * catches most quoting errors.
+ */
+ toklen = strlen(token);
+ if (token[0] != '\'' || toklen < 2 || token[toklen - 1] != '\'')
+ goto error;
+
+ strip_quotes(token, '\'', 0, pset.encoding);
+
+ result->program = true;
+ result->file = pg_strdup(token);
+ }
+ else if (pg_strcasecmp(token, "stdin") == 0 ||
+ pg_strcasecmp(token, "stdout") == 0)
+ {
+ result->file = NULL;
+ }
+ else if (pg_strcasecmp(token, "pstdin") == 0 ||
+ pg_strcasecmp(token, "pstdout") == 0)
+ {
+ result->psql_inout = true;
+ result->file = NULL;
+ }
+ else
+ {
+ /* filename can be optionally quoted */
+ strip_quotes(token, '\'', 0, pset.encoding);
+ result->file = pg_strdup(token);
+ expand_tilde(&result->file);
+ }
+
+ /* Collect the rest of the line (COPY options) */
+ token = strtokx(NULL, "", NULL, NULL,
+ 0, false, false, pset.encoding);
+ if (token)
+ result->after_tofrom = pg_strdup(token);
+
+ return result;
+
+error:
+ if (token)
+ pg_log_error("\\copy: parse error at \"%s\"", token);
+ else
+ pg_log_error("\\copy: parse error at end of line");
+ free_copy_options(result);
+
+ return NULL;
+}
+
+
+/*
+ * Execute a \copy command (frontend copy). We have to open a file (or execute
+ * a command), then submit a COPY query to the backend and either feed it data
+ * from the file or route its response into the file.
+ */
+bool
+do_copy(const char *args)
+{
+ PQExpBufferData query;
+ FILE *copystream;
+ struct copy_options *options;
+ bool success;
+
+ /* parse options */
+ options = parse_slash_copy(args);
+
+ if (!options)
+ return false;
+
+ /* prepare to read or write the target file */
+ if (options->file && !options->program)
+ canonicalize_path(options->file);
+
+ if (options->from)
+ {
+ if (options->file)
+ {
+ if (options->program)
+ {
+ fflush(stdout);
+ fflush(stderr);
+ errno = 0;
+ copystream = popen(options->file, PG_BINARY_R);
+ }
+ else
+ copystream = fopen(options->file, PG_BINARY_R);
+ }
+ else if (!options->psql_inout)
+ copystream = pset.cur_cmd_source;
+ else
+ copystream = stdin;
+ }
+ else
+ {
+ if (options->file)
+ {
+ if (options->program)
+ {
+ fflush(stdout);
+ fflush(stderr);
+ errno = 0;
+ disable_sigpipe_trap();
+ copystream = popen(options->file, PG_BINARY_W);
+ }
+ else
+ copystream = fopen(options->file, PG_BINARY_W);
+ }
+ else if (!options->psql_inout)
+ copystream = pset.queryFout;
+ else
+ copystream = stdout;
+ }
+
+ if (!copystream)
+ {
+ if (options->program)
+ pg_log_error("could not execute command \"%s\": %m",
+ options->file);
+ else
+ pg_log_error("%s: %m",
+ options->file);
+ free_copy_options(options);
+ return false;
+ }
+
+ if (!options->program)
+ {
+ struct stat st;
+ int result;
+
+ /* make sure the specified file is not a directory */
+ if ((result = fstat(fileno(copystream), &st)) < 0)
+ pg_log_error("could not stat file \"%s\": %m",
+ options->file);
+
+ if (result == 0 && S_ISDIR(st.st_mode))
+ pg_log_error("%s: cannot copy from/to a directory",
+ options->file);
+
+ if (result < 0 || S_ISDIR(st.st_mode))
+ {
+ fclose(copystream);
+ free_copy_options(options);
+ return false;
+ }
+ }
+
+ /* build the command we will send to the backend */
+ initPQExpBuffer(&query);
+ printfPQExpBuffer(&query, "COPY ");
+ appendPQExpBufferStr(&query, options->before_tofrom);
+ if (options->from)
+ appendPQExpBufferStr(&query, " FROM STDIN ");
+ else
+ appendPQExpBufferStr(&query, " TO STDOUT ");
+ if (options->after_tofrom)
+ appendPQExpBufferStr(&query, options->after_tofrom);
+
+ /* run it like a user command, but with copystream as data source/sink */
+ pset.copyStream = copystream;
+ success = SendQuery(query.data);
+ pset.copyStream = NULL;
+ termPQExpBuffer(&query);
+
+ if (options->file != NULL)
+ {
+ if (options->program)
+ {
+ int pclose_rc = pclose(copystream);
+
+ if (pclose_rc != 0)
+ {
+ if (pclose_rc < 0)
+ pg_log_error("could not close pipe to external command: %m");
+ else
+ {
+ char *reason = wait_result_to_str(pclose_rc);
+
+ pg_log_error("%s: %s", options->file,
+ reason ? reason : "");
+ if (reason)
+ free(reason);
+ }
+ success = false;
+ }
+ restore_sigpipe_trap();
+ }
+ else
+ {
+ if (fclose(copystream) != 0)
+ {
+ pg_log_error("%s: %m", options->file);
+ success = false;
+ }
+ }
+ }
+ free_copy_options(options);
+ return success;
+}
+
+
+/*
+ * Functions for handling COPY IN/OUT data transfer.
+ *
+ * If you want to use COPY TO STDOUT/FROM STDIN in your application,
+ * this is the code to steal ;)
+ */
+
+/*
+ * handleCopyOut
+ * receives data as a result of a COPY ... TO STDOUT command
+ *
+ * conn should be a database connection that you just issued COPY TO on
+ * and got back a PGRES_COPY_OUT result.
+ *
+ * copystream is the file stream for the data to go to.
+ * copystream can be NULL to eat the data without writing it anywhere.
+ *
+ * The final status for the COPY is returned into *res (but note
+ * we already reported the error, if it's not a success result).
+ *
+ * result is true if successful, false if not.
+ */
+bool
+handleCopyOut(PGconn *conn, FILE *copystream, PGresult **res)
+{
+ bool OK = true;
+ char *buf;
+ int ret;
+
+ for (;;)
+ {
+ ret = PQgetCopyData(conn, &buf, 0);
+
+ if (ret < 0)
+ break; /* done or server/connection error */
+
+ if (buf)
+ {
+ if (OK && copystream && fwrite(buf, 1, ret, copystream) != ret)
+ {
+ pg_log_error("could not write COPY data: %m");
+ /* complain only once, keep reading data from server */
+ OK = false;
+ }
+ PQfreemem(buf);
+ }
+ }
+
+ if (OK && copystream && fflush(copystream))
+ {
+ pg_log_error("could not write COPY data: %m");
+ OK = false;
+ }
+
+ if (ret == -2)
+ {
+ pg_log_error("COPY data transfer failed: %s", PQerrorMessage(conn));
+ OK = false;
+ }
+
+ /*
+ * Check command status and return to normal libpq state.
+ *
+ * If for some reason libpq is still reporting PGRES_COPY_OUT state, we
+ * would like to forcibly exit that state, since our caller would be
+ * unable to distinguish that situation from reaching the next COPY in a
+ * command string that happened to contain two consecutive COPY TO STDOUT
+ * commands. However, libpq provides no API for doing that, and in
+ * principle it's a libpq bug anyway if PQgetCopyData() returns -1 or -2
+ * but hasn't exited COPY_OUT state internally. So we ignore the
+ * possibility here.
+ */
+ *res = PQgetResult(conn);
+ if (PQresultStatus(*res) != PGRES_COMMAND_OK)
+ {
+ pg_log_info("%s", PQerrorMessage(conn));
+ OK = false;
+ }
+
+ return OK;
+}
+
+/*
+ * handleCopyIn
+ * sends data to complete a COPY ... FROM STDIN command
+ *
+ * conn should be a database connection that you just issued COPY FROM on
+ * and got back a PGRES_COPY_IN result.
+ * copystream is the file stream to read the data from.
+ * isbinary can be set from PQbinaryTuples().
+ * The final status for the COPY is returned into *res (but note
+ * we already reported the error, if it's not a success result).
+ *
+ * result is true if successful, false if not.
+ */
+
+/* read chunk size for COPY IN - size is not critical */
+#define COPYBUFSIZ 8192
+
+bool
+handleCopyIn(PGconn *conn, FILE *copystream, bool isbinary, PGresult **res)
+{
+ bool OK;
+ char buf[COPYBUFSIZ];
+ bool showprompt;
+
+ /*
+ * Establish longjmp destination for exiting from wait-for-input. (This is
+ * only effective while sigint_interrupt_enabled is TRUE.)
+ */
+ if (sigsetjmp(sigint_interrupt_jmp, 1) != 0)
+ {
+ /* got here with longjmp */
+
+ /* Terminate data transfer */
+ PQputCopyEnd(conn,
+ (PQprotocolVersion(conn) < 3) ? NULL :
+ _("canceled by user"));
+
+ OK = false;
+ goto copyin_cleanup;
+ }
+
+ /* Prompt if interactive input */
+ if (isatty(fileno(copystream)))
+ {
+ showprompt = true;
+ if (!pset.quiet)
+ puts(_("Enter data to be copied followed by a newline.\n"
+ "End with a backslash and a period on a line by itself, or an EOF signal."));
+ }
+ else
+ showprompt = false;
+
+ OK = true;
+
+ if (isbinary)
+ {
+ /* interactive input probably silly, but give one prompt anyway */
+ if (showprompt)
+ {
+ const char *prompt = get_prompt(PROMPT_COPY, NULL);
+
+ fputs(prompt, stdout);
+ fflush(stdout);
+ }
+
+ for (;;)
+ {
+ int buflen;
+
+ /* enable longjmp while waiting for input */
+ sigint_interrupt_enabled = true;
+
+ buflen = fread(buf, 1, COPYBUFSIZ, copystream);
+
+ sigint_interrupt_enabled = false;
+
+ if (buflen <= 0)
+ break;
+
+ if (PQputCopyData(conn, buf, buflen) <= 0)
+ {
+ OK = false;
+ break;
+ }
+ }
+ }
+ else
+ {
+ bool copydone = false;
+ int buflen;
+ bool at_line_begin = true;
+
+ /*
+ * In text mode, we have to read the input one line at a time, so that
+ * we can stop reading at the EOF marker (\.). We mustn't read beyond
+ * the EOF marker, because if the data was inlined in a SQL script, we
+ * would eat up the commands after the EOF marker.
+ */
+ buflen = 0;
+ while (!copydone)
+ {
+ char *fgresult;
+
+ if (at_line_begin && showprompt)
+ {
+ const char *prompt = get_prompt(PROMPT_COPY, NULL);
+
+ fputs(prompt, stdout);
+ fflush(stdout);
+ }
+
+ /* enable longjmp while waiting for input */
+ sigint_interrupt_enabled = true;
+
+ fgresult = fgets(&buf[buflen], COPYBUFSIZ - buflen, copystream);
+
+ sigint_interrupt_enabled = false;
+
+ if (!fgresult)
+ copydone = true;
+ else
+ {
+ int linelen;
+
+ linelen = strlen(fgresult);
+ buflen += linelen;
+
+ /* current line is done? */
+ if (buf[buflen - 1] == '\n')
+ {
+ /* check for EOF marker, but not on a partial line */
+ if (at_line_begin)
+ {
+ /*
+ * This code erroneously assumes '\.' on a line alone
+ * inside a quoted CSV string terminates the \copy.
+ * https://www.postgresql.org/message-id/E1TdNVQ-0001ju-GO@wrigleys.postgresql.org
+ * https://www.postgresql.org/message-id/bfcd57e4-8f23-4c3e-a5db-2571d09208e2@beta.fastmail.com
+ */
+ if ((linelen == 3 && memcmp(fgresult, "\\.\n", 3) == 0) ||
+ (linelen == 4 && memcmp(fgresult, "\\.\r\n", 4) == 0))
+ {
+ copydone = true;
+ }
+ }
+
+ if (copystream == pset.cur_cmd_source)
+ {
+ pset.lineno++;
+ pset.stmt_lineno++;
+ }
+ at_line_begin = true;
+ }
+ else
+ at_line_begin = false;
+ }
+
+ /*
+ * If the buffer is full, or we've reached the EOF, flush it.
+ *
+ * Make sure there's always space for four more bytes in the
+ * buffer, plus a NUL terminator. That way, an EOF marker is
+ * never split across two fgets() calls, which simplifies the
+ * logic.
+ */
+ if (buflen >= COPYBUFSIZ - 5 || (copydone && buflen > 0))
+ {
+ if (PQputCopyData(conn, buf, buflen) <= 0)
+ {
+ OK = false;
+ break;
+ }
+
+ buflen = 0;
+ }
+ }
+ }
+
+ /* Check for read error */
+ if (ferror(copystream))
+ OK = false;
+
+ /*
+ * Terminate data transfer. We can't send an error message if we're using
+ * protocol version 2. (libpq no longer supports protocol version 2, but
+ * keep the version checks just in case you're using a pre-v14 libpq.so at
+ * runtime)
+ */
+ if (PQputCopyEnd(conn,
+ (OK || PQprotocolVersion(conn) < 3) ? NULL :
+ _("aborted because of read failure")) <= 0)
+ OK = false;
+
+copyin_cleanup:
+
+ /*
+ * Clear the EOF flag on the stream, in case copying ended due to an EOF
+ * signal. This allows an interactive TTY session to perform another COPY
+ * FROM STDIN later. (In non-STDIN cases, we're about to close the file
+ * anyway, so it doesn't matter.) Although we don't ever test the flag
+ * with feof(), some fread() implementations won't read more data if it's
+ * set. This also clears the error flag, but we already checked that.
+ */
+ clearerr(copystream);
+
+ /*
+ * Check command status and return to normal libpq state.
+ *
+ * We do not want to return with the status still PGRES_COPY_IN: our
+ * caller would be unable to distinguish that situation from reaching the
+ * next COPY in a command string that happened to contain two consecutive
+ * COPY FROM STDIN commands. We keep trying PQputCopyEnd() in the hope
+ * it'll work eventually. (What's actually likely to happen is that in
+ * attempting to flush the data, libpq will eventually realize that the
+ * connection is lost. But that's fine; it will get us out of COPY_IN
+ * state, which is what we need.)
+ */
+ while (*res = PQgetResult(conn), PQresultStatus(*res) == PGRES_COPY_IN)
+ {
+ OK = false;
+ PQclear(*res);
+ /* We can't send an error message if we're using protocol version 2 */
+ PQputCopyEnd(conn,
+ (PQprotocolVersion(conn) < 3) ? NULL :
+ _("trying to exit copy mode"));
+ }
+ if (PQresultStatus(*res) != PGRES_COMMAND_OK)
+ {
+ pg_log_info("%s", PQerrorMessage(conn));
+ OK = false;
+ }
+
+ return OK;
+}
diff --git a/src/bin/psql/copy.h b/src/bin/psql/copy.h
new file mode 100644
index 0000000..effc05d
--- /dev/null
+++ b/src/bin/psql/copy.h
@@ -0,0 +1,24 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/copy.h
+ */
+#ifndef COPY_H
+#define COPY_H
+
+#include "libpq-fe.h"
+
+
+/* handler for \copy */
+extern bool do_copy(const char *args);
+
+/* lower level processors for copy in/out streams */
+
+extern bool handleCopyOut(PGconn *conn, FILE *copystream,
+ PGresult **res);
+extern bool handleCopyIn(PGconn *conn, FILE *copystream, bool isbinary,
+ PGresult **res);
+
+#endif
diff --git a/src/bin/psql/create_help.pl b/src/bin/psql/create_help.pl
new file mode 100644
index 0000000..78ab2ff
--- /dev/null
+++ b/src/bin/psql/create_help.pl
@@ -0,0 +1,219 @@
+#! /usr/bin/perl
+
+#################################################################
+# create_help.pl -- converts SGML docs to internal psql help
+#
+# Copyright (c) 2000-2022, PostgreSQL Global Development Group
+#
+# src/bin/psql/create_help.pl
+#################################################################
+
+#
+# This script automatically generates the help on SQL in psql from
+# the SGML docs. So far the format of the docs was consistent
+# enough that this worked, but this here is by no means an SGML
+# parser.
+#
+# Call: perl create_help.pl docdir sql_help
+# The name of the header file doesn't matter to this script, but it
+# sure does matter to the rest of the source.
+#
+
+use strict;
+use warnings;
+
+my $docdir = $ARGV[0] or die "$0: missing required argument: docdir\n";
+my $hfile = $ARGV[1] . '.h'
+ or die "$0: missing required argument: output file\n";
+my $cfile = $ARGV[1] . '.c';
+
+my $hfilebasename;
+if ($hfile =~ m!.*/([^/]+)$!)
+{
+ $hfilebasename = $1;
+}
+else
+{
+ $hfilebasename = $hfile;
+}
+
+my $define = $hfilebasename;
+$define =~ tr/a-z/A-Z/;
+$define =~ s/\W/_/g;
+
+opendir(my $dh, $docdir)
+ or die "$0: could not open documentation source dir '$docdir': $!\n";
+open(my $hfile_handle, '>', $hfile)
+ or die "$0: could not open output file '$hfile': $!\n";
+open(my $cfile_handle, '>', $cfile)
+ or die "$0: could not open output file '$cfile': $!\n";
+
+print $hfile_handle "/*
+ * *** Do not change this file by hand. It is automatically
+ * *** generated from the DocBook documentation.
+ *
+ * generated by src/bin/psql/create_help.pl
+ *
+ */
+
+#ifndef $define
+#define $define
+
+#include \"pqexpbuffer.h\"
+
+struct _helpStruct
+{
+ const char *cmd; /* the command name */
+ const char *help; /* the help associated with it */
+ const char *docbook_id; /* DocBook XML id (for generating URL) */
+ void (*syntaxfunc) (PQExpBuffer); /* function that prints the
+ * syntax associated with it */
+ int nl_count; /* number of newlines in syntax (for pager) */
+};
+
+extern const struct _helpStruct QL_HELP[];
+";
+
+print $cfile_handle "/*
+ * *** Do not change this file by hand. It is automatically
+ * *** generated from the DocBook documentation.
+ *
+ * generated by src/bin/psql/create_help.pl
+ *
+ */
+
+#define N_(x) (x) /* gettext noop */
+
+#include \"postgres_fe.h\"
+#include \"$hfile\"
+
+";
+
+my $maxlen = 0;
+
+my %entries;
+
+foreach my $file (sort readdir $dh)
+{
+ my ($cmdid, @cmdnames, $cmddesc, $cmdsynopsis);
+ $file =~ /\.sgml$/ or next;
+
+ open(my $fh, '<', "$docdir/$file") or next;
+ my $filecontent = join('', <$fh>);
+ close $fh;
+
+ # Ignore files that are not for SQL language statements
+ $filecontent =~
+ m!<refmiscinfo>\s*SQL - Language Statements\s*</refmiscinfo>!i
+ or next;
+
+ $filecontent =~ m!<refentry id="([a-z-]+)">!
+ and $cmdid = $1;
+
+ # Collect multiple refnames
+ LOOP:
+ {
+ $filecontent =~ m!\G.*?<refname>\s*([a-z ]+?)\s*</refname>!cgis
+ and push @cmdnames, $1
+ and redo LOOP;
+ }
+ $filecontent =~ m!<refpurpose>\s*(.+?)\s*</refpurpose>!is
+ and $cmddesc = $1;
+ $filecontent =~ m!<synopsis>\s*(.+?)\s*</synopsis>!is
+ and $cmdsynopsis = $1;
+
+ if (@cmdnames && $cmddesc && $cmdid && $cmdsynopsis)
+ {
+ s/\"/\\"/g foreach @cmdnames;
+
+ $cmddesc =~ s/<[^>]+>//g;
+ $cmddesc =~ s/\s+/ /g;
+ $cmddesc =~ s/\"/\\"/g;
+
+ my @params = ();
+
+ my $nl_count = () = $cmdsynopsis =~ /\n/g;
+
+ $cmdsynopsis =~ s/%/%%/g;
+
+ while ($cmdsynopsis =~ m!<(\w+)[^>]*>(.+?)</\1[^>]*>!)
+ {
+ my $match = $2;
+ $match =~ s/<[^>]+>//g;
+ $match =~ s/%%/%/g;
+ push @params, $match;
+ $cmdsynopsis =~ s!<(\w+)[^>]*>.+?</\1[^>]*>!%s!;
+ }
+ $cmdsynopsis =~ s/\r?\n/\\n/g;
+ $cmdsynopsis =~ s/\"/\\"/g;
+
+ foreach my $cmdname (@cmdnames)
+ {
+ $entries{$cmdname} = {
+ cmdid => $cmdid,
+ cmddesc => $cmddesc,
+ cmdsynopsis => $cmdsynopsis,
+ params => \@params,
+ nl_count => $nl_count
+ };
+ $maxlen =
+ ($maxlen >= length $cmdname) ? $maxlen : length $cmdname;
+ }
+ }
+ else
+ {
+ die "$0: parsing file '$file' failed (N='@cmdnames' D='$cmddesc')\n";
+ }
+}
+
+foreach (sort keys %entries)
+{
+ my $prefix = "\t" x 5 . ' ';
+ my $id = $_;
+ $id =~ s/ /_/g;
+ my $synopsis = "\"$entries{$_}{cmdsynopsis}\"";
+ $synopsis =~ s/\\n/\\n"\n$prefix"/g;
+ my @args =
+ ("buf", $synopsis, map("_(\"$_\")", @{ $entries{$_}{params} }));
+ print $cfile_handle "static void
+sql_help_$id(PQExpBuffer buf)
+{
+\tappendPQExpBuffer(" . join(",\n$prefix", @args) . ");
+}
+
+";
+}
+
+print $cfile_handle "
+const struct _helpStruct QL_HELP[] = {
+";
+foreach (sort keys %entries)
+{
+ my $id = $_;
+ $id =~ s/ /_/g;
+ print $cfile_handle "\t{\"$_\",
+\t\tN_(\"$entries{$_}{cmddesc}\"),
+\t\t\"$entries{$_}{cmdid}\",
+\t\tsql_help_$id,
+\t$entries{$_}{nl_count}},
+
+";
+}
+
+print $cfile_handle "
+\t{NULL, NULL, NULL}\t\t\t/* End of list marker */
+};
+";
+
+print $hfile_handle "
+#define QL_HELP_COUNT "
+ . scalar(keys %entries) . " /* number of help items */
+#define QL_MAX_CMD_LEN $maxlen /* largest strlen(cmd) */
+
+
+#endif /* $define */
+";
+
+close $cfile_handle;
+close $hfile_handle;
+closedir $dh;
diff --git a/src/bin/psql/crosstabview.c b/src/bin/psql/crosstabview.c
new file mode 100644
index 0000000..2c29138
--- /dev/null
+++ b/src/bin/psql/crosstabview.c
@@ -0,0 +1,713 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/crosstabview.c
+ */
+#include "postgres_fe.h"
+
+#include "common.h"
+#include "common/logging.h"
+#include "crosstabview.h"
+#include "pqexpbuffer.h"
+#include "psqlscanslash.h"
+#include "settings.h"
+
+/*
+ * Value/position from the resultset that goes into the horizontal or vertical
+ * crosstabview header.
+ */
+typedef struct _pivot_field
+{
+ /*
+ * Pointer obtained from PQgetvalue() for colV or colH. Each distinct
+ * value becomes an entry in the vertical header (colV), or horizontal
+ * header (colH). A Null value is represented by a NULL pointer.
+ */
+ char *name;
+
+ /*
+ * When a sort is requested on an alternative column, this holds
+ * PQgetvalue() for the sort column corresponding to <name>. If <name>
+ * appear multiple times, it's the first value in the order of the results
+ * that is kept. A Null value is represented by a NULL pointer.
+ */
+ char *sort_value;
+
+ /*
+ * Rank of this value, starting at 0. Initially, it's the relative
+ * position of the first appearance of <name> in the resultset. For
+ * example, if successive rows contain B,A,C,A,D then it's B:0,A:1,C:2,D:3
+ * When a sort column is specified, ranks get updated in a final pass to
+ * reflect the desired order.
+ */
+ int rank;
+} pivot_field;
+
+/* Node in avl_tree */
+typedef struct _avl_node
+{
+ /* Node contents */
+ pivot_field field;
+
+ /*
+ * Height of this node in the tree (number of nodes on the longest path to
+ * a leaf).
+ */
+ int height;
+
+ /*
+ * Child nodes. [0] points to left subtree, [1] to right subtree. Never
+ * NULL, points to the empty node avl_tree.end when no left or right
+ * value.
+ */
+ struct _avl_node *children[2];
+} avl_node;
+
+/*
+ * Control structure for the AVL tree (binary search tree kept
+ * balanced with the AVL algorithm)
+ */
+typedef struct _avl_tree
+{
+ int count; /* Total number of nodes */
+ avl_node *root; /* root of the tree */
+ avl_node *end; /* Immutable dereferenceable empty tree */
+} avl_tree;
+
+
+static bool printCrosstab(const PGresult *result,
+ int num_columns, pivot_field *piv_columns, int field_for_columns,
+ int num_rows, pivot_field *piv_rows, int field_for_rows,
+ int field_for_data);
+static void avlInit(avl_tree *tree);
+static void avlMergeValue(avl_tree *tree, char *name, char *sort_value);
+static int avlCollectFields(avl_tree *tree, avl_node *node,
+ pivot_field *fields, int idx);
+static void avlFree(avl_tree *tree, avl_node *node);
+static void rankSort(int num_columns, pivot_field *piv_columns);
+static int indexOfColumn(char *arg, const PGresult *res);
+static int pivotFieldCompare(const void *a, const void *b);
+static int rankCompare(const void *a, const void *b);
+
+
+/*
+ * Main entry point to this module.
+ *
+ * Process the data from *res according to the options in pset (global),
+ * to generate the horizontal and vertical headers contents,
+ * then call printCrosstab() for the actual output.
+ */
+bool
+PrintResultInCrosstab(const PGresult *res)
+{
+ bool retval = false;
+ avl_tree piv_columns;
+ avl_tree piv_rows;
+ pivot_field *array_columns = NULL;
+ pivot_field *array_rows = NULL;
+ int num_columns = 0;
+ int num_rows = 0;
+ int field_for_rows;
+ int field_for_columns;
+ int field_for_data;
+ int sort_field_for_columns;
+ int rn;
+
+ avlInit(&piv_rows);
+ avlInit(&piv_columns);
+
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("\\crosstabview: statement did not return a result set");
+ goto error_return;
+ }
+
+ if (PQnfields(res) < 3)
+ {
+ pg_log_error("\\crosstabview: query must return at least three columns");
+ goto error_return;
+ }
+
+ /* Process first optional arg (vertical header column) */
+ if (pset.ctv_args[0] == NULL)
+ field_for_rows = 0;
+ else
+ {
+ field_for_rows = indexOfColumn(pset.ctv_args[0], res);
+ if (field_for_rows < 0)
+ goto error_return;
+ }
+
+ /* Process second optional arg (horizontal header column) */
+ if (pset.ctv_args[1] == NULL)
+ field_for_columns = 1;
+ else
+ {
+ field_for_columns = indexOfColumn(pset.ctv_args[1], res);
+ if (field_for_columns < 0)
+ goto error_return;
+ }
+
+ /* Insist that header columns be distinct */
+ if (field_for_columns == field_for_rows)
+ {
+ pg_log_error("\\crosstabview: vertical and horizontal headers must be different columns");
+ goto error_return;
+ }
+
+ /* Process third optional arg (data column) */
+ if (pset.ctv_args[2] == NULL)
+ {
+ int i;
+
+ /*
+ * If the data column was not specified, we search for the one not
+ * used as either vertical or horizontal headers. Must be exactly
+ * three columns, or this won't be unique.
+ */
+ if (PQnfields(res) != 3)
+ {
+ pg_log_error("\\crosstabview: data column must be specified when query returns more than three columns");
+ goto error_return;
+ }
+
+ field_for_data = -1;
+ for (i = 0; i < PQnfields(res); i++)
+ {
+ if (i != field_for_rows && i != field_for_columns)
+ {
+ field_for_data = i;
+ break;
+ }
+ }
+ Assert(field_for_data >= 0);
+ }
+ else
+ {
+ field_for_data = indexOfColumn(pset.ctv_args[2], res);
+ if (field_for_data < 0)
+ goto error_return;
+ }
+
+ /* Process fourth optional arg (horizontal header sort column) */
+ if (pset.ctv_args[3] == NULL)
+ sort_field_for_columns = -1; /* no sort column */
+ else
+ {
+ sort_field_for_columns = indexOfColumn(pset.ctv_args[3], res);
+ if (sort_field_for_columns < 0)
+ goto error_return;
+ }
+
+ /*
+ * First part: accumulate the names that go into the vertical and
+ * horizontal headers, each into an AVL binary tree to build the set of
+ * DISTINCT values.
+ */
+
+ for (rn = 0; rn < PQntuples(res); rn++)
+ {
+ char *val;
+ char *val1;
+
+ /* horizontal */
+ val = PQgetisnull(res, rn, field_for_columns) ? NULL :
+ PQgetvalue(res, rn, field_for_columns);
+ val1 = NULL;
+
+ if (sort_field_for_columns >= 0 &&
+ !PQgetisnull(res, rn, sort_field_for_columns))
+ val1 = PQgetvalue(res, rn, sort_field_for_columns);
+
+ avlMergeValue(&piv_columns, val, val1);
+
+ if (piv_columns.count > CROSSTABVIEW_MAX_COLUMNS)
+ {
+ pg_log_error("\\crosstabview: maximum number of columns (%d) exceeded",
+ CROSSTABVIEW_MAX_COLUMNS);
+ goto error_return;
+ }
+
+ /* vertical */
+ val = PQgetisnull(res, rn, field_for_rows) ? NULL :
+ PQgetvalue(res, rn, field_for_rows);
+
+ avlMergeValue(&piv_rows, val, NULL);
+ }
+
+ /*
+ * Second part: Generate sorted arrays from the AVL trees.
+ */
+
+ num_columns = piv_columns.count;
+ num_rows = piv_rows.count;
+
+ array_columns = (pivot_field *)
+ pg_malloc(sizeof(pivot_field) * num_columns);
+
+ array_rows = (pivot_field *)
+ pg_malloc(sizeof(pivot_field) * num_rows);
+
+ avlCollectFields(&piv_columns, piv_columns.root, array_columns, 0);
+ avlCollectFields(&piv_rows, piv_rows.root, array_rows, 0);
+
+ /*
+ * Third part: optionally, process the ranking data for the horizontal
+ * header
+ */
+ if (sort_field_for_columns >= 0)
+ rankSort(num_columns, array_columns);
+
+ /*
+ * Fourth part: print the crosstab'ed result.
+ */
+ retval = printCrosstab(res,
+ num_columns, array_columns, field_for_columns,
+ num_rows, array_rows, field_for_rows,
+ field_for_data);
+
+error_return:
+ avlFree(&piv_columns, piv_columns.root);
+ avlFree(&piv_rows, piv_rows.root);
+ pg_free(array_columns);
+ pg_free(array_rows);
+
+ return retval;
+}
+
+/*
+ * Output the pivoted resultset with the printTable* functions. Return true
+ * if successful, false otherwise.
+ */
+static bool
+printCrosstab(const PGresult *result,
+ int num_columns, pivot_field *piv_columns, int field_for_columns,
+ int num_rows, pivot_field *piv_rows, int field_for_rows,
+ int field_for_data)
+{
+ printQueryOpt popt = pset.popt;
+ printTableContent cont;
+ int i,
+ rn;
+ char col_align;
+ int *horiz_map;
+ bool retval = false;
+
+ printTableInit(&cont, &popt.topt, popt.title, num_columns + 1, num_rows);
+
+ /* Step 1: set target column names (horizontal header) */
+
+ /* The name of the first column is kept unchanged by the pivoting */
+ printTableAddHeader(&cont,
+ PQfname(result, field_for_rows),
+ false,
+ column_type_alignment(PQftype(result,
+ field_for_rows)));
+
+ /*
+ * To iterate over piv_columns[] by piv_columns[].rank, create a reverse
+ * map associating each piv_columns[].rank to its index in piv_columns.
+ * This avoids an O(N^2) loop later.
+ */
+ horiz_map = (int *) pg_malloc(sizeof(int) * num_columns);
+ for (i = 0; i < num_columns; i++)
+ horiz_map[piv_columns[i].rank] = i;
+
+ /*
+ * The display alignment depends on its PQftype().
+ */
+ col_align = column_type_alignment(PQftype(result, field_for_data));
+
+ for (i = 0; i < num_columns; i++)
+ {
+ char *colname;
+
+ colname = piv_columns[horiz_map[i]].name ?
+ piv_columns[horiz_map[i]].name :
+ (popt.nullPrint ? popt.nullPrint : "");
+
+ printTableAddHeader(&cont, colname, false, col_align);
+ }
+ pg_free(horiz_map);
+
+ /* Step 2: set row names in the first output column (vertical header) */
+ for (i = 0; i < num_rows; i++)
+ {
+ int k = piv_rows[i].rank;
+
+ cont.cells[k * (num_columns + 1)] = piv_rows[i].name ?
+ piv_rows[i].name :
+ (popt.nullPrint ? popt.nullPrint : "");
+ }
+ cont.cellsadded = num_rows * (num_columns + 1);
+
+ /*
+ * Step 3: fill in the content cells.
+ */
+ for (rn = 0; rn < PQntuples(result); rn++)
+ {
+ int row_number;
+ int col_number;
+ pivot_field *rp,
+ *cp;
+ pivot_field elt;
+
+ /* Find target row */
+ if (!PQgetisnull(result, rn, field_for_rows))
+ elt.name = PQgetvalue(result, rn, field_for_rows);
+ else
+ elt.name = NULL;
+ rp = (pivot_field *) bsearch(&elt,
+ piv_rows,
+ num_rows,
+ sizeof(pivot_field),
+ pivotFieldCompare);
+ Assert(rp != NULL);
+ row_number = rp->rank;
+
+ /* Find target column */
+ if (!PQgetisnull(result, rn, field_for_columns))
+ elt.name = PQgetvalue(result, rn, field_for_columns);
+ else
+ elt.name = NULL;
+
+ cp = (pivot_field *) bsearch(&elt,
+ piv_columns,
+ num_columns,
+ sizeof(pivot_field),
+ pivotFieldCompare);
+ Assert(cp != NULL);
+ col_number = cp->rank;
+
+ /* Place value into cell */
+ if (col_number >= 0 && row_number >= 0)
+ {
+ int idx;
+
+ /* index into the cont.cells array */
+ idx = 1 + col_number + row_number * (num_columns + 1);
+
+ /*
+ * If the cell already contains a value, raise an error.
+ */
+ if (cont.cells[idx] != NULL)
+ {
+ pg_log_error("\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"",
+ rp->name ? rp->name :
+ (popt.nullPrint ? popt.nullPrint : "(null)"),
+ cp->name ? cp->name :
+ (popt.nullPrint ? popt.nullPrint : "(null)"));
+ goto error;
+ }
+
+ cont.cells[idx] = !PQgetisnull(result, rn, field_for_data) ?
+ PQgetvalue(result, rn, field_for_data) :
+ (popt.nullPrint ? popt.nullPrint : "");
+ }
+ }
+
+ /*
+ * The non-initialized cells must be set to an empty string for the print
+ * functions
+ */
+ for (i = 0; i < cont.cellsadded; i++)
+ {
+ if (cont.cells[i] == NULL)
+ cont.cells[i] = "";
+ }
+
+ printTable(&cont, pset.queryFout, false, pset.logfile);
+ retval = true;
+
+error:
+ printTableCleanup(&cont);
+
+ return retval;
+}
+
+/*
+ * The avl* functions below provide a minimalistic implementation of AVL binary
+ * trees, to efficiently collect the distinct values that will form the horizontal
+ * and vertical headers. It only supports adding new values, no removal or even
+ * search.
+ */
+static void
+avlInit(avl_tree *tree)
+{
+ tree->end = (avl_node *) pg_malloc0(sizeof(avl_node));
+ tree->end->children[0] = tree->end->children[1] = tree->end;
+ tree->count = 0;
+ tree->root = tree->end;
+}
+
+/* Deallocate recursively an AVL tree, starting from node */
+static void
+avlFree(avl_tree *tree, avl_node *node)
+{
+ if (node->children[0] != tree->end)
+ {
+ avlFree(tree, node->children[0]);
+ pg_free(node->children[0]);
+ }
+ if (node->children[1] != tree->end)
+ {
+ avlFree(tree, node->children[1]);
+ pg_free(node->children[1]);
+ }
+ if (node == tree->root)
+ {
+ /* free the root separately as it's not child of anything */
+ if (node != tree->end)
+ pg_free(node);
+ /* free the tree->end struct only once and when all else is freed */
+ pg_free(tree->end);
+ }
+}
+
+/* Set the height to 1 plus the greatest of left and right heights */
+static void
+avlUpdateHeight(avl_node *n)
+{
+ n->height = 1 + (n->children[0]->height > n->children[1]->height ?
+ n->children[0]->height :
+ n->children[1]->height);
+}
+
+/* Rotate a subtree left (dir=0) or right (dir=1). Not recursive */
+static avl_node *
+avlRotate(avl_node **current, int dir)
+{
+ avl_node *before = *current;
+ avl_node *after = (*current)->children[dir];
+
+ *current = after;
+ before->children[dir] = after->children[!dir];
+ avlUpdateHeight(before);
+ after->children[!dir] = before;
+
+ return after;
+}
+
+static int
+avlBalance(avl_node *n)
+{
+ return n->children[0]->height - n->children[1]->height;
+}
+
+/*
+ * After an insertion, possibly rebalance the tree so that the left and right
+ * node heights don't differ by more than 1.
+ * May update *node.
+ */
+static void
+avlAdjustBalance(avl_tree *tree, avl_node **node)
+{
+ avl_node *current = *node;
+ int b = avlBalance(current) / 2;
+
+ if (b != 0)
+ {
+ int dir = (1 - b) / 2;
+
+ if (avlBalance(current->children[dir]) == -b)
+ avlRotate(&current->children[dir], !dir);
+ current = avlRotate(node, dir);
+ }
+ if (current != tree->end)
+ avlUpdateHeight(current);
+}
+
+/*
+ * Insert a new value/field, starting from *node, reaching the correct position
+ * in the tree by recursion. Possibly rebalance the tree and possibly update
+ * *node. Do nothing if the value is already present in the tree.
+ */
+static void
+avlInsertNode(avl_tree *tree, avl_node **node, pivot_field field)
+{
+ avl_node *current = *node;
+
+ if (current == tree->end)
+ {
+ avl_node *new_node = (avl_node *)
+ pg_malloc(sizeof(avl_node));
+
+ new_node->height = 1;
+ new_node->field = field;
+ new_node->children[0] = new_node->children[1] = tree->end;
+ tree->count++;
+ *node = new_node;
+ }
+ else
+ {
+ int cmp = pivotFieldCompare(&field, &current->field);
+
+ if (cmp != 0)
+ {
+ avlInsertNode(tree,
+ cmp > 0 ? &current->children[1] : &current->children[0],
+ field);
+ avlAdjustBalance(tree, node);
+ }
+ }
+}
+
+/* Insert the value into the AVL tree, if it does not preexist */
+static void
+avlMergeValue(avl_tree *tree, char *name, char *sort_value)
+{
+ pivot_field field;
+
+ field.name = name;
+ field.rank = tree->count;
+ field.sort_value = sort_value;
+ avlInsertNode(tree, &tree->root, field);
+}
+
+/*
+ * Recursively extract node values into the names array, in sorted order with a
+ * left-to-right tree traversal.
+ * Return the next candidate offset to write into the names array.
+ * fields[] must be preallocated to hold tree->count entries
+ */
+static int
+avlCollectFields(avl_tree *tree, avl_node *node, pivot_field *fields, int idx)
+{
+ if (node == tree->end)
+ return idx;
+
+ idx = avlCollectFields(tree, node->children[0], fields, idx);
+ fields[idx] = node->field;
+ return avlCollectFields(tree, node->children[1], fields, idx + 1);
+}
+
+static void
+rankSort(int num_columns, pivot_field *piv_columns)
+{
+ int *hmap; /* [[offset in piv_columns, rank], ...for
+ * every header entry] */
+ int i;
+
+ hmap = (int *) pg_malloc(sizeof(int) * num_columns * 2);
+ for (i = 0; i < num_columns; i++)
+ {
+ char *val = piv_columns[i].sort_value;
+
+ /* ranking information is valid if non null and matches /^-?\d+$/ */
+ if (val &&
+ ((*val == '-' &&
+ strspn(val + 1, "0123456789") == strlen(val + 1)) ||
+ strspn(val, "0123456789") == strlen(val)))
+ {
+ hmap[i * 2] = atoi(val);
+ hmap[i * 2 + 1] = i;
+ }
+ else
+ {
+ /* invalid rank information ignored (equivalent to rank 0) */
+ hmap[i * 2] = 0;
+ hmap[i * 2 + 1] = i;
+ }
+ }
+
+ qsort(hmap, num_columns, sizeof(int) * 2, rankCompare);
+
+ for (i = 0; i < num_columns; i++)
+ {
+ piv_columns[hmap[i * 2 + 1]].rank = i;
+ }
+
+ pg_free(hmap);
+}
+
+/*
+ * Look up a column reference, which can be either:
+ * - a number from 1 to PQnfields(res)
+ * - a column name matching one of PQfname(res,...)
+ *
+ * Returns zero-based column number, or -1 if not found or ambiguous.
+ *
+ * Note: may modify contents of "arg" string.
+ */
+static int
+indexOfColumn(char *arg, const PGresult *res)
+{
+ int idx;
+
+ if (arg[0] && strspn(arg, "0123456789") == strlen(arg))
+ {
+ /* if arg contains only digits, it's a column number */
+ idx = atoi(arg) - 1;
+ if (idx < 0 || idx >= PQnfields(res))
+ {
+ pg_log_error("\\crosstabview: column number %d is out of range 1..%d",
+ idx + 1, PQnfields(res));
+ return -1;
+ }
+ }
+ else
+ {
+ int i;
+
+ /*
+ * Dequote and downcase the column name. By checking for all-digits
+ * before doing this, we can ensure that a quoted name is treated as a
+ * name even if it's all digits.
+ */
+ dequote_downcase_identifier(arg, true, pset.encoding);
+
+ /* Now look for match(es) among res' column names */
+ idx = -1;
+ for (i = 0; i < PQnfields(res); i++)
+ {
+ if (strcmp(arg, PQfname(res, i)) == 0)
+ {
+ if (idx >= 0)
+ {
+ /* another idx was already found for the same name */
+ pg_log_error("\\crosstabview: ambiguous column name: \"%s\"", arg);
+ return -1;
+ }
+ idx = i;
+ }
+ }
+ if (idx == -1)
+ {
+ pg_log_error("\\crosstabview: column name not found: \"%s\"", arg);
+ return -1;
+ }
+ }
+
+ return idx;
+}
+
+/*
+ * Value comparator for vertical and horizontal headers
+ * used for deduplication only.
+ * - null values are considered equal
+ * - non-null < null
+ * - non-null values are compared with strcmp()
+ */
+static int
+pivotFieldCompare(const void *a, const void *b)
+{
+ const pivot_field *pa = (const pivot_field *) a;
+ const pivot_field *pb = (const pivot_field *) b;
+
+ /* test null values */
+ if (!pb->name)
+ return pa->name ? -1 : 0;
+ else if (!pa->name)
+ return 1;
+
+ /* non-null values */
+ return strcmp(pa->name, pb->name);
+}
+
+static int
+rankCompare(const void *a, const void *b)
+{
+ return *((const int *) a) - *((const int *) b);
+}
diff --git a/src/bin/psql/crosstabview.h b/src/bin/psql/crosstabview.h
new file mode 100644
index 0000000..3b96906
--- /dev/null
+++ b/src/bin/psql/crosstabview.h
@@ -0,0 +1,29 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/crosstabview.h
+ */
+
+#ifndef CROSSTABVIEW_H
+#define CROSSTABVIEW_H
+
+#include "libpq-fe.h"
+
+/*
+ * Limit the number of output columns generated in memory by the crosstabview
+ * algorithm. A new output column is added for each distinct value found in the
+ * column that pivots (to form the horizontal header).
+ * The purpose of this limit is to fail early instead of over-allocating or spending
+ * too much time if the crosstab to generate happens to be unreasonably large
+ * (worst case: a NxN cartesian product with N=number of tuples).
+ * The value of 1600 corresponds to the maximum columns per table in storage,
+ * but it could be as much as INT_MAX theoretically.
+ */
+#define CROSSTABVIEW_MAX_COLUMNS 1600
+
+/* prototypes */
+extern bool PrintResultInCrosstab(const PGresult *res);
+
+#endif /* CROSSTABVIEW_H */
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
new file mode 100644
index 0000000..3823dca
--- /dev/null
+++ b/src/bin/psql/describe.c
@@ -0,0 +1,7007 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Support for the various \d ("describe") commands. Note that the current
+ * expectation is that all functions in this file will succeed when working
+ * with servers of versions 9.2 and up. It's okay to omit irrelevant
+ * information for an old server, but not to fail outright. (But failing
+ * against a pre-9.2 server is allowed.)
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/describe.c
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+
+#include "catalog/pg_am.h"
+#include "catalog/pg_attribute_d.h"
+#include "catalog/pg_cast_d.h"
+#include "catalog/pg_class_d.h"
+#include "catalog/pg_default_acl_d.h"
+#include "common.h"
+#include "common/logging.h"
+#include "describe.h"
+#include "fe_utils/mbprint.h"
+#include "fe_utils/print.h"
+#include "fe_utils/string_utils.h"
+#include "settings.h"
+#include "variables.h"
+
+static const char *map_typename_pattern(const char *pattern);
+static bool describeOneTableDetails(const char *schemaname,
+ const char *relationname,
+ const char *oid,
+ bool verbose);
+static void add_tablespace_footer(printTableContent *const cont, char relkind,
+ Oid tablespace, const bool newline);
+static void add_role_attribute(PQExpBuffer buf, const char *const str);
+static bool listTSParsersVerbose(const char *pattern);
+static bool describeOneTSParser(const char *oid, const char *nspname,
+ const char *prsname);
+static bool listTSConfigsVerbose(const char *pattern);
+static bool describeOneTSConfig(const char *oid, const char *nspname,
+ const char *cfgname,
+ const char *pnspname, const char *prsname);
+static void printACLColumn(PQExpBuffer buf, const char *colname);
+static bool listOneExtensionContents(const char *extname, const char *oid);
+static bool validateSQLNamePattern(PQExpBuffer buf, const char *pattern,
+ bool have_where, bool force_escape,
+ const char *schemavar, const char *namevar,
+ const char *altnamevar,
+ const char *visibilityrule,
+ bool *added_clause, int maxparts);
+
+
+/*----------------
+ * Handlers for various slash commands displaying some sort of list
+ * of things in the database.
+ *
+ * Note: try to format the queries to look nice in -E output.
+ *----------------
+ */
+
+
+/*
+ * \da
+ * Takes an optional regexp to select particular aggregates
+ */
+bool
+describeAggregates(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname as \"%s\",\n"
+ " p.proname AS \"%s\",\n"
+ " pg_catalog.format_type(p.prorettype, NULL) AS \"%s\",\n"
+ " CASE WHEN p.pronargs = 0\n"
+ " THEN CAST('*' AS pg_catalog.text)\n"
+ " ELSE pg_catalog.pg_get_function_arguments(p.oid)\n"
+ " END AS \"%s\",\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Result data type"),
+ gettext_noop("Argument data types"));
+
+ if (pset.sversion >= 110000)
+ appendPQExpBuffer(&buf,
+ " pg_catalog.obj_description(p.oid, 'pg_proc') as \"%s\"\n"
+ "FROM pg_catalog.pg_proc p\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\n"
+ "WHERE p.prokind = 'a'\n",
+ gettext_noop("Description"));
+ else
+ appendPQExpBuffer(&buf,
+ " pg_catalog.obj_description(p.oid, 'pg_proc') as \"%s\"\n"
+ "FROM pg_catalog.pg_proc p\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\n"
+ "WHERE p.proisagg\n",
+ gettext_noop("Description"));
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "p.proname", NULL,
+ "pg_catalog.pg_function_is_visible(p.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 4;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of aggregate functions");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dA
+ * Takes an optional regexp to select particular access methods
+ */
+bool
+describeAccessMethods(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, true, false, false};
+
+ if (pset.sversion < 90600)
+ {
+ char sverbuf[32];
+
+ pg_log_error("The server (version %s) does not support access methods.",
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+ return true;
+ }
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT amname AS \"%s\",\n"
+ " CASE amtype"
+ " WHEN 'i' THEN '%s'"
+ " WHEN 't' THEN '%s'"
+ " END AS \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Index"),
+ gettext_noop("Table"),
+ gettext_noop("Type"));
+
+ if (verbose)
+ {
+ appendPQExpBuffer(&buf,
+ ",\n amhandler AS \"%s\",\n"
+ " pg_catalog.obj_description(oid, 'pg_am') AS \"%s\"",
+ gettext_noop("Handler"),
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_am\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "amname", NULL,
+ NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of access methods");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \db
+ * Takes an optional regexp to select particular tablespaces
+ */
+bool
+describeTablespaces(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT spcname AS \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(spcowner) AS \"%s\",\n"
+ " pg_catalog.pg_tablespace_location(oid) AS \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Owner"),
+ gettext_noop("Location"));
+
+ if (verbose)
+ {
+ appendPQExpBufferStr(&buf, ",\n ");
+ printACLColumn(&buf, "spcacl");
+ appendPQExpBuffer(&buf,
+ ",\n spcoptions AS \"%s\""
+ ",\n pg_catalog.pg_size_pretty(pg_catalog.pg_tablespace_size(oid)) AS \"%s\""
+ ",\n pg_catalog.shobj_description(oid, 'pg_tablespace') AS \"%s\"",
+ gettext_noop("Options"),
+ gettext_noop("Size"),
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_tablespace\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "spcname", NULL,
+ NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of tablespaces");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+
+/*
+ * \df
+ * Takes an optional regexp to select particular functions.
+ *
+ * As with \d, you can specify the kinds of functions you want:
+ *
+ * a for aggregates
+ * n for normal
+ * p for procedure
+ * t for trigger
+ * w for window
+ *
+ * and you can mix and match these in any order.
+ */
+bool
+describeFunctions(const char *functypes, const char *func_pattern,
+ char **arg_patterns, int num_arg_patterns,
+ bool verbose, bool showSystem)
+{
+ bool showAggregate = strchr(functypes, 'a') != NULL;
+ bool showNormal = strchr(functypes, 'n') != NULL;
+ bool showProcedure = strchr(functypes, 'p') != NULL;
+ bool showTrigger = strchr(functypes, 't') != NULL;
+ bool showWindow = strchr(functypes, 'w') != NULL;
+ bool have_where;
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, false, false, false, true, true, true, false, true, false, false, false, false};
+
+ /* No "Parallel" column before 9.6 */
+ static const bool translate_columns_pre_96[] = {false, false, false, false, true, true, false, true, false, false, false, false};
+
+ if (strlen(functypes) != strspn(functypes, "anptwS+"))
+ {
+ pg_log_error("\\df only takes [anptwS+] as options");
+ return true;
+ }
+
+ if (showProcedure && pset.sversion < 110000)
+ {
+ char sverbuf[32];
+
+ pg_log_error("\\df does not take a \"%c\" option with server version %s",
+ 'p',
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+ return true;
+ }
+
+ if (!showAggregate && !showNormal && !showProcedure && !showTrigger && !showWindow)
+ {
+ showAggregate = showNormal = showTrigger = showWindow = true;
+ if (pset.sversion >= 110000)
+ showProcedure = true;
+ }
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname as \"%s\",\n"
+ " p.proname as \"%s\",\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"));
+
+ if (pset.sversion >= 110000)
+ appendPQExpBuffer(&buf,
+ " pg_catalog.pg_get_function_result(p.oid) as \"%s\",\n"
+ " pg_catalog.pg_get_function_arguments(p.oid) as \"%s\",\n"
+ " CASE p.prokind\n"
+ " WHEN 'a' THEN '%s'\n"
+ " WHEN 'w' THEN '%s'\n"
+ " WHEN 'p' THEN '%s'\n"
+ " ELSE '%s'\n"
+ " END as \"%s\"",
+ gettext_noop("Result data type"),
+ gettext_noop("Argument data types"),
+ /* translator: "agg" is short for "aggregate" */
+ gettext_noop("agg"),
+ gettext_noop("window"),
+ gettext_noop("proc"),
+ gettext_noop("func"),
+ gettext_noop("Type"));
+ else
+ appendPQExpBuffer(&buf,
+ " pg_catalog.pg_get_function_result(p.oid) as \"%s\",\n"
+ " pg_catalog.pg_get_function_arguments(p.oid) as \"%s\",\n"
+ " CASE\n"
+ " WHEN p.proisagg THEN '%s'\n"
+ " WHEN p.proiswindow THEN '%s'\n"
+ " WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN '%s'\n"
+ " ELSE '%s'\n"
+ " END as \"%s\"",
+ gettext_noop("Result data type"),
+ gettext_noop("Argument data types"),
+ /* translator: "agg" is short for "aggregate" */
+ gettext_noop("agg"),
+ gettext_noop("window"),
+ gettext_noop("trigger"),
+ gettext_noop("func"),
+ gettext_noop("Type"));
+
+ if (verbose)
+ {
+ appendPQExpBuffer(&buf,
+ ",\n CASE\n"
+ " WHEN p.provolatile = 'i' THEN '%s'\n"
+ " WHEN p.provolatile = 's' THEN '%s'\n"
+ " WHEN p.provolatile = 'v' THEN '%s'\n"
+ " END as \"%s\"",
+ gettext_noop("immutable"),
+ gettext_noop("stable"),
+ gettext_noop("volatile"),
+ gettext_noop("Volatility"));
+ if (pset.sversion >= 90600)
+ appendPQExpBuffer(&buf,
+ ",\n CASE\n"
+ " WHEN p.proparallel = 'r' THEN '%s'\n"
+ " WHEN p.proparallel = 's' THEN '%s'\n"
+ " WHEN p.proparallel = 'u' THEN '%s'\n"
+ " END as \"%s\"",
+ gettext_noop("restricted"),
+ gettext_noop("safe"),
+ gettext_noop("unsafe"),
+ gettext_noop("Parallel"));
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.pg_get_userbyid(p.proowner) as \"%s\""
+ ",\n CASE WHEN prosecdef THEN '%s' ELSE '%s' END AS \"%s\"",
+ gettext_noop("Owner"),
+ gettext_noop("definer"),
+ gettext_noop("invoker"),
+ gettext_noop("Security"));
+ appendPQExpBufferStr(&buf, ",\n ");
+ printACLColumn(&buf, "p.proacl");
+ appendPQExpBuffer(&buf,
+ ",\n l.lanname as \"%s\"",
+ gettext_noop("Language"));
+ if (pset.sversion >= 140000)
+ appendPQExpBuffer(&buf,
+ ",\n COALESCE(pg_catalog.pg_get_function_sqlbody(p.oid), p.prosrc) as \"%s\"",
+ gettext_noop("Source code"));
+ else
+ appendPQExpBuffer(&buf,
+ ",\n p.prosrc as \"%s\"",
+ gettext_noop("Source code"));
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.obj_description(p.oid, 'pg_proc') as \"%s\"",
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_proc p"
+ "\n LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\n");
+
+ for (int i = 0; i < num_arg_patterns; i++)
+ {
+ appendPQExpBuffer(&buf,
+ " LEFT JOIN pg_catalog.pg_type t%d ON t%d.oid = p.proargtypes[%d]\n"
+ " LEFT JOIN pg_catalog.pg_namespace nt%d ON nt%d.oid = t%d.typnamespace\n",
+ i, i, i, i, i, i);
+ }
+
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_language l ON l.oid = p.prolang\n");
+
+ have_where = false;
+
+ /* filter by function type, if requested */
+ if (showNormal && showAggregate && showProcedure && showTrigger && showWindow)
+ /* Do nothing */ ;
+ else if (showNormal)
+ {
+ if (!showAggregate)
+ {
+ if (have_where)
+ appendPQExpBufferStr(&buf, " AND ");
+ else
+ {
+ appendPQExpBufferStr(&buf, "WHERE ");
+ have_where = true;
+ }
+ if (pset.sversion >= 110000)
+ appendPQExpBufferStr(&buf, "p.prokind <> 'a'\n");
+ else
+ appendPQExpBufferStr(&buf, "NOT p.proisagg\n");
+ }
+ if (!showProcedure && pset.sversion >= 110000)
+ {
+ if (have_where)
+ appendPQExpBufferStr(&buf, " AND ");
+ else
+ {
+ appendPQExpBufferStr(&buf, "WHERE ");
+ have_where = true;
+ }
+ appendPQExpBufferStr(&buf, "p.prokind <> 'p'\n");
+ }
+ if (!showTrigger)
+ {
+ if (have_where)
+ appendPQExpBufferStr(&buf, " AND ");
+ else
+ {
+ appendPQExpBufferStr(&buf, "WHERE ");
+ have_where = true;
+ }
+ appendPQExpBufferStr(&buf, "p.prorettype <> 'pg_catalog.trigger'::pg_catalog.regtype\n");
+ }
+ if (!showWindow)
+ {
+ if (have_where)
+ appendPQExpBufferStr(&buf, " AND ");
+ else
+ {
+ appendPQExpBufferStr(&buf, "WHERE ");
+ have_where = true;
+ }
+ if (pset.sversion >= 110000)
+ appendPQExpBufferStr(&buf, "p.prokind <> 'w'\n");
+ else
+ appendPQExpBufferStr(&buf, "NOT p.proiswindow\n");
+ }
+ }
+ else
+ {
+ bool needs_or = false;
+
+ appendPQExpBufferStr(&buf, "WHERE (\n ");
+ have_where = true;
+ /* Note: at least one of these must be true ... */
+ if (showAggregate)
+ {
+ if (pset.sversion >= 110000)
+ appendPQExpBufferStr(&buf, "p.prokind = 'a'\n");
+ else
+ appendPQExpBufferStr(&buf, "p.proisagg\n");
+ needs_or = true;
+ }
+ if (showTrigger)
+ {
+ if (needs_or)
+ appendPQExpBufferStr(&buf, " OR ");
+ appendPQExpBufferStr(&buf,
+ "p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype\n");
+ needs_or = true;
+ }
+ if (showProcedure)
+ {
+ if (needs_or)
+ appendPQExpBufferStr(&buf, " OR ");
+ appendPQExpBufferStr(&buf, "p.prokind = 'p'\n");
+ needs_or = true;
+ }
+ if (showWindow)
+ {
+ if (needs_or)
+ appendPQExpBufferStr(&buf, " OR ");
+ if (pset.sversion >= 110000)
+ appendPQExpBufferStr(&buf, "p.prokind = 'w'\n");
+ else
+ appendPQExpBufferStr(&buf, "p.proiswindow\n");
+ }
+ appendPQExpBufferStr(&buf, " )\n");
+ }
+
+ if (!validateSQLNamePattern(&buf, func_pattern, have_where, false,
+ "n.nspname", "p.proname", NULL,
+ "pg_catalog.pg_function_is_visible(p.oid)",
+ NULL, 3))
+ goto error_return;
+
+ for (int i = 0; i < num_arg_patterns; i++)
+ {
+ if (strcmp(arg_patterns[i], "-") != 0)
+ {
+ /*
+ * Match type-name patterns against either internal or external
+ * name, like \dT. Unlike \dT, there seems no reason to
+ * discriminate against arrays or composite types.
+ */
+ char nspname[64];
+ char typname[64];
+ char ft[64];
+ char tiv[64];
+
+ snprintf(nspname, sizeof(nspname), "nt%d.nspname", i);
+ snprintf(typname, sizeof(typname), "t%d.typname", i);
+ snprintf(ft, sizeof(ft),
+ "pg_catalog.format_type(t%d.oid, NULL)", i);
+ snprintf(tiv, sizeof(tiv),
+ "pg_catalog.pg_type_is_visible(t%d.oid)", i);
+ if (!validateSQLNamePattern(&buf,
+ map_typename_pattern(arg_patterns[i]),
+ true, false,
+ nspname, typname, ft, tiv,
+ NULL, 3))
+ goto error_return;
+ }
+ else
+ {
+ /* "-" pattern specifies no such parameter */
+ appendPQExpBuffer(&buf, " AND t%d.typname IS NULL\n", i);
+ }
+ }
+
+ if (!showSystem && !func_pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 4;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of functions");
+ myopt.translate_header = true;
+ if (pset.sversion >= 90600)
+ {
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+ }
+ else
+ {
+ myopt.translate_columns = translate_columns_pre_96;
+ myopt.n_translate_columns = lengthof(translate_columns_pre_96);
+ }
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+
+
+/*
+ * \dT
+ * describe types
+ */
+bool
+describeTypes(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname as \"%s\",\n"
+ " pg_catalog.format_type(t.oid, NULL) AS \"%s\",\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"));
+ if (verbose)
+ {
+ appendPQExpBuffer(&buf,
+ " t.typname AS \"%s\",\n"
+ " CASE WHEN t.typrelid != 0\n"
+ " THEN CAST('tuple' AS pg_catalog.text)\n"
+ " WHEN t.typlen < 0\n"
+ " THEN CAST('var' AS pg_catalog.text)\n"
+ " ELSE CAST(t.typlen AS pg_catalog.text)\n"
+ " END AS \"%s\",\n"
+ " pg_catalog.array_to_string(\n"
+ " ARRAY(\n"
+ " SELECT e.enumlabel\n"
+ " FROM pg_catalog.pg_enum e\n"
+ " WHERE e.enumtypid = t.oid\n"
+ " ORDER BY e.enumsortorder\n"
+ " ),\n"
+ " E'\\n'\n"
+ " ) AS \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(t.typowner) AS \"%s\",\n",
+ gettext_noop("Internal name"),
+ gettext_noop("Size"),
+ gettext_noop("Elements"),
+ gettext_noop("Owner"));
+ printACLColumn(&buf, "t.typacl");
+ appendPQExpBufferStr(&buf, ",\n ");
+ }
+
+ appendPQExpBuffer(&buf,
+ " pg_catalog.obj_description(t.oid, 'pg_type') as \"%s\"\n",
+ gettext_noop("Description"));
+
+ appendPQExpBufferStr(&buf, "FROM pg_catalog.pg_type t\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n");
+
+ /*
+ * do not include complex types (typrelid!=0) unless they are standalone
+ * composite types
+ */
+ appendPQExpBufferStr(&buf, "WHERE (t.typrelid = 0 ");
+ appendPQExpBufferStr(&buf, "OR (SELECT c.relkind = " CppAsString2(RELKIND_COMPOSITE_TYPE)
+ " FROM pg_catalog.pg_class c "
+ "WHERE c.oid = t.typrelid))\n");
+
+ /*
+ * do not include array types unless the pattern contains []
+ */
+ if (pattern == NULL || strstr(pattern, "[]") == NULL)
+ appendPQExpBufferStr(&buf, " AND NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type el WHERE el.oid = t.typelem AND el.typarray = t.oid)\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ /* Match name pattern against either internal or external name */
+ if (!validateSQLNamePattern(&buf, map_typename_pattern(pattern),
+ true, false,
+ "n.nspname", "t.typname",
+ "pg_catalog.format_type(t.oid, NULL)",
+ "pg_catalog.pg_type_is_visible(t.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of data types");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * Map some variant type names accepted by the backend grammar into
+ * canonical type names.
+ *
+ * Helper for \dT and other functions that take typename patterns.
+ * This doesn't completely mask the fact that these names are special;
+ * for example, a pattern of "dec*" won't magically match "numeric".
+ * But it goes a long way to reduce the surprise factor.
+ */
+static const char *
+map_typename_pattern(const char *pattern)
+{
+ static const char *const typename_map[] = {
+ /*
+ * These names are accepted by gram.y, although they are neither the
+ * "real" name seen in pg_type nor the canonical name printed by
+ * format_type().
+ */
+ "decimal", "numeric",
+ "float", "double precision",
+ "int", "integer",
+
+ /*
+ * We also have to map the array names for cases where the canonical
+ * name is different from what pg_type says.
+ */
+ "bool[]", "boolean[]",
+ "decimal[]", "numeric[]",
+ "float[]", "double precision[]",
+ "float4[]", "real[]",
+ "float8[]", "double precision[]",
+ "int[]", "integer[]",
+ "int2[]", "smallint[]",
+ "int4[]", "integer[]",
+ "int8[]", "bigint[]",
+ "time[]", "time without time zone[]",
+ "timetz[]", "time with time zone[]",
+ "timestamp[]", "timestamp without time zone[]",
+ "timestamptz[]", "timestamp with time zone[]",
+ "varbit[]", "bit varying[]",
+ "varchar[]", "character varying[]",
+ NULL
+ };
+
+ if (pattern == NULL)
+ return NULL;
+ for (int i = 0; typename_map[i] != NULL; i += 2)
+ {
+ if (pg_strcasecmp(pattern, typename_map[i]) == 0)
+ return typename_map[i + 1];
+ }
+ return pattern;
+}
+
+
+/*
+ * \do
+ * Describe operators
+ */
+bool
+describeOperators(const char *oper_pattern,
+ char **arg_patterns, int num_arg_patterns,
+ bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ /*
+ * Note: before Postgres 9.1, we did not assign comments to any built-in
+ * operators, preferring to let the comment on the underlying function
+ * suffice. The coalesce() on the obj_description() calls below supports
+ * this convention by providing a fallback lookup of a comment on the
+ * operator's function. Since 9.1 there is a policy that every built-in
+ * operator should have a comment; so the coalesce() is no longer
+ * necessary so far as built-in operators are concerned. We keep it
+ * anyway, for now, because third-party modules may still be following the
+ * old convention.
+ *
+ * The support for postfix operators in this query is dead code as of
+ * Postgres 14, but we need to keep it for as long as we support talking
+ * to pre-v14 servers.
+ */
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname as \"%s\",\n"
+ " o.oprname AS \"%s\",\n"
+ " CASE WHEN o.oprkind='l' THEN NULL ELSE pg_catalog.format_type(o.oprleft, NULL) END AS \"%s\",\n"
+ " CASE WHEN o.oprkind='r' THEN NULL ELSE pg_catalog.format_type(o.oprright, NULL) END AS \"%s\",\n"
+ " pg_catalog.format_type(o.oprresult, NULL) AS \"%s\",\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Left arg type"),
+ gettext_noop("Right arg type"),
+ gettext_noop("Result type"));
+
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ " o.oprcode AS \"%s\",\n",
+ gettext_noop("Function"));
+
+ appendPQExpBuffer(&buf,
+ " coalesce(pg_catalog.obj_description(o.oid, 'pg_operator'),\n"
+ " pg_catalog.obj_description(o.oprcode, 'pg_proc')) AS \"%s\"\n"
+ "FROM pg_catalog.pg_operator o\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = o.oprnamespace\n",
+ gettext_noop("Description"));
+
+ if (num_arg_patterns >= 2)
+ {
+ num_arg_patterns = 2; /* ignore any additional arguments */
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_type t0 ON t0.oid = o.oprleft\n"
+ " LEFT JOIN pg_catalog.pg_namespace nt0 ON nt0.oid = t0.typnamespace\n"
+ " LEFT JOIN pg_catalog.pg_type t1 ON t1.oid = o.oprright\n"
+ " LEFT JOIN pg_catalog.pg_namespace nt1 ON nt1.oid = t1.typnamespace\n");
+ }
+ else if (num_arg_patterns == 1)
+ {
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_type t0 ON t0.oid = o.oprright\n"
+ " LEFT JOIN pg_catalog.pg_namespace nt0 ON nt0.oid = t0.typnamespace\n");
+ }
+
+ if (!showSystem && !oper_pattern)
+ appendPQExpBufferStr(&buf, "WHERE n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, oper_pattern,
+ !showSystem && !oper_pattern, true,
+ "n.nspname", "o.oprname", NULL,
+ "pg_catalog.pg_operator_is_visible(o.oid)",
+ NULL, 3))
+ goto error_return;
+
+ if (num_arg_patterns == 1)
+ appendPQExpBufferStr(&buf, " AND o.oprleft = 0\n");
+
+ for (int i = 0; i < num_arg_patterns; i++)
+ {
+ if (strcmp(arg_patterns[i], "-") != 0)
+ {
+ /*
+ * Match type-name patterns against either internal or external
+ * name, like \dT. Unlike \dT, there seems no reason to
+ * discriminate against arrays or composite types.
+ */
+ char nspname[64];
+ char typname[64];
+ char ft[64];
+ char tiv[64];
+
+ snprintf(nspname, sizeof(nspname), "nt%d.nspname", i);
+ snprintf(typname, sizeof(typname), "t%d.typname", i);
+ snprintf(ft, sizeof(ft),
+ "pg_catalog.format_type(t%d.oid, NULL)", i);
+ snprintf(tiv, sizeof(tiv),
+ "pg_catalog.pg_type_is_visible(t%d.oid)", i);
+ if (!validateSQLNamePattern(&buf,
+ map_typename_pattern(arg_patterns[i]),
+ true, false,
+ nspname, typname, ft, tiv,
+ NULL, 3))
+ goto error_return;
+ }
+ else
+ {
+ /* "-" pattern specifies no such parameter */
+ appendPQExpBuffer(&buf, " AND t%d.typname IS NULL\n", i);
+ }
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 3, 4;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of operators");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+
+/*
+ * listAllDbs
+ *
+ * for \l, \list, and -l switch
+ */
+bool
+listAllDbs(const char *pattern, bool verbose)
+{
+ PGresult *res;
+ PQExpBufferData buf;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT d.datname as \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(d.datdba) as \"%s\",\n"
+ " pg_catalog.pg_encoding_to_char(d.encoding) as \"%s\",\n"
+ " d.datcollate as \"%s\",\n"
+ " d.datctype as \"%s\",\n",
+ gettext_noop("Name"),
+ gettext_noop("Owner"),
+ gettext_noop("Encoding"),
+ gettext_noop("Collate"),
+ gettext_noop("Ctype"));
+ if (pset.sversion >= 150000)
+ appendPQExpBuffer(&buf,
+ " d.daticulocale as \"%s\",\n"
+ " CASE d.datlocprovider WHEN 'c' THEN 'libc' WHEN 'i' THEN 'icu' END AS \"%s\",\n",
+ gettext_noop("ICU Locale"),
+ gettext_noop("Locale Provider"));
+ else
+ appendPQExpBuffer(&buf,
+ " NULL as \"%s\",\n"
+ " 'libc' AS \"%s\",\n",
+ gettext_noop("ICU Locale"),
+ gettext_noop("Locale Provider"));
+ appendPQExpBufferStr(&buf, " ");
+ printACLColumn(&buf, "d.datacl");
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\n CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')\n"
+ " THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))\n"
+ " ELSE 'No Access'\n"
+ " END as \"%s\""
+ ",\n t.spcname as \"%s\""
+ ",\n pg_catalog.shobj_description(d.oid, 'pg_database') as \"%s\"",
+ gettext_noop("Size"),
+ gettext_noop("Tablespace"),
+ gettext_noop("Description"));
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_database d\n");
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ " JOIN pg_catalog.pg_tablespace t on d.dattablespace = t.oid\n");
+
+ if (pattern)
+ {
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "d.datname", NULL, NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of databases");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+
+/*
+ * List Tables' Grant/Revoke Permissions
+ * \z (now also \dp -- perhaps more mnemonic)
+ */
+bool
+permissionsList(const char *pattern)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, false, true, false, false, false};
+
+ initPQExpBuffer(&buf);
+
+ /*
+ * we ignore indexes and toast tables since they have no meaningful rights
+ */
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname as \"%s\",\n"
+ " c.relname as \"%s\",\n"
+ " CASE c.relkind"
+ " WHEN " CppAsString2(RELKIND_RELATION) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_VIEW) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_MATVIEW) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_SEQUENCE) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_FOREIGN_TABLE) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_PARTITIONED_TABLE) " THEN '%s'"
+ " END as \"%s\",\n"
+ " ",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("table"),
+ gettext_noop("view"),
+ gettext_noop("materialized view"),
+ gettext_noop("sequence"),
+ gettext_noop("foreign table"),
+ gettext_noop("partitioned table"),
+ gettext_noop("Type"));
+
+ printACLColumn(&buf, "c.relacl");
+
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.array_to_string(ARRAY(\n"
+ " SELECT attname || E':\\n ' || pg_catalog.array_to_string(attacl, E'\\n ')\n"
+ " FROM pg_catalog.pg_attribute a\n"
+ " WHERE attrelid = c.oid AND NOT attisdropped AND attacl IS NOT NULL\n"
+ " ), E'\\n') AS \"%s\"",
+ gettext_noop("Column privileges"));
+
+ if (pset.sversion >= 90500 && pset.sversion < 100000)
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.array_to_string(ARRAY(\n"
+ " SELECT polname\n"
+ " || CASE WHEN polcmd != '*' THEN\n"
+ " E' (' || polcmd::pg_catalog.text || E'):'\n"
+ " ELSE E':'\n"
+ " END\n"
+ " || CASE WHEN polqual IS NOT NULL THEN\n"
+ " E'\\n (u): ' || pg_catalog.pg_get_expr(polqual, polrelid)\n"
+ " ELSE E''\n"
+ " END\n"
+ " || CASE WHEN polwithcheck IS NOT NULL THEN\n"
+ " E'\\n (c): ' || pg_catalog.pg_get_expr(polwithcheck, polrelid)\n"
+ " ELSE E''\n"
+ " END"
+ " || CASE WHEN polroles <> '{0}' THEN\n"
+ " E'\\n to: ' || pg_catalog.array_to_string(\n"
+ " ARRAY(\n"
+ " SELECT rolname\n"
+ " FROM pg_catalog.pg_roles\n"
+ " WHERE oid = ANY (polroles)\n"
+ " ORDER BY 1\n"
+ " ), E', ')\n"
+ " ELSE E''\n"
+ " END\n"
+ " FROM pg_catalog.pg_policy pol\n"
+ " WHERE polrelid = c.oid), E'\\n')\n"
+ " AS \"%s\"",
+ gettext_noop("Policies"));
+
+ if (pset.sversion >= 100000)
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.array_to_string(ARRAY(\n"
+ " SELECT polname\n"
+ " || CASE WHEN NOT polpermissive THEN\n"
+ " E' (RESTRICTIVE)'\n"
+ " ELSE '' END\n"
+ " || CASE WHEN polcmd != '*' THEN\n"
+ " E' (' || polcmd::pg_catalog.text || E'):'\n"
+ " ELSE E':'\n"
+ " END\n"
+ " || CASE WHEN polqual IS NOT NULL THEN\n"
+ " E'\\n (u): ' || pg_catalog.pg_get_expr(polqual, polrelid)\n"
+ " ELSE E''\n"
+ " END\n"
+ " || CASE WHEN polwithcheck IS NOT NULL THEN\n"
+ " E'\\n (c): ' || pg_catalog.pg_get_expr(polwithcheck, polrelid)\n"
+ " ELSE E''\n"
+ " END"
+ " || CASE WHEN polroles <> '{0}' THEN\n"
+ " E'\\n to: ' || pg_catalog.array_to_string(\n"
+ " ARRAY(\n"
+ " SELECT rolname\n"
+ " FROM pg_catalog.pg_roles\n"
+ " WHERE oid = ANY (polroles)\n"
+ " ORDER BY 1\n"
+ " ), E', ')\n"
+ " ELSE E''\n"
+ " END\n"
+ " FROM pg_catalog.pg_policy pol\n"
+ " WHERE polrelid = c.oid), E'\\n')\n"
+ " AS \"%s\"",
+ gettext_noop("Policies"));
+
+ appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_class c\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n"
+ "WHERE c.relkind IN ("
+ CppAsString2(RELKIND_RELATION) ","
+ CppAsString2(RELKIND_VIEW) ","
+ CppAsString2(RELKIND_MATVIEW) ","
+ CppAsString2(RELKIND_SEQUENCE) ","
+ CppAsString2(RELKIND_FOREIGN_TABLE) ","
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ")\n");
+
+ /*
+ * Unless a schema pattern is specified, we suppress system and temp
+ * tables, since they normally aren't very interesting from a permissions
+ * point of view. You can see 'em by explicit request though, eg with \z
+ * pg_catalog.*
+ */
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "c.relname", NULL,
+ "n.nspname !~ '^pg_' AND pg_catalog.pg_table_is_visible(c.oid)",
+ NULL, 3))
+ goto error_return;
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ if (!res)
+ goto error_return;
+
+ myopt.nullPrint = NULL;
+ printfPQExpBuffer(&buf, _("Access privileges"));
+ myopt.title = buf.data;
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ termPQExpBuffer(&buf);
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+
+/*
+ * \ddp
+ *
+ * List Default ACLs. The pattern can match either schema or role name.
+ */
+bool
+listDefaultACLs(const char *pattern)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, false, true, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT pg_catalog.pg_get_userbyid(d.defaclrole) AS \"%s\",\n"
+ " n.nspname AS \"%s\",\n"
+ " CASE d.defaclobjtype WHEN '%c' THEN '%s' WHEN '%c' THEN '%s' WHEN '%c' THEN '%s' WHEN '%c' THEN '%s' WHEN '%c' THEN '%s' END AS \"%s\",\n"
+ " ",
+ gettext_noop("Owner"),
+ gettext_noop("Schema"),
+ DEFACLOBJ_RELATION,
+ gettext_noop("table"),
+ DEFACLOBJ_SEQUENCE,
+ gettext_noop("sequence"),
+ DEFACLOBJ_FUNCTION,
+ gettext_noop("function"),
+ DEFACLOBJ_TYPE,
+ gettext_noop("type"),
+ DEFACLOBJ_NAMESPACE,
+ gettext_noop("schema"),
+ gettext_noop("Type"));
+
+ printACLColumn(&buf, "d.defaclacl");
+
+ appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_default_acl d\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.defaclnamespace\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL,
+ "n.nspname",
+ "pg_catalog.pg_get_userbyid(d.defaclrole)",
+ NULL,
+ NULL, 3))
+ goto error_return;
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 3;");
+
+ res = PSQLexec(buf.data);
+ if (!res)
+ goto error_return;
+
+ myopt.nullPrint = NULL;
+ printfPQExpBuffer(&buf, _("Default access privileges"));
+ myopt.title = buf.data;
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ termPQExpBuffer(&buf);
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+
+/*
+ * Get object comments
+ *
+ * \dd [foo]
+ *
+ * Note: This command only lists comments for object types which do not have
+ * their comments displayed by their own backslash commands. The following
+ * types of objects will be displayed: constraint, operator class,
+ * operator family, rule, and trigger.
+ *
+ */
+bool
+objectDescription(const char *pattern, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, false, true, false};
+
+ initPQExpBuffer(&buf);
+
+ appendPQExpBuffer(&buf,
+ "SELECT DISTINCT tt.nspname AS \"%s\", tt.name AS \"%s\", tt.object AS \"%s\", d.description AS \"%s\"\n"
+ "FROM (\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Object"),
+ gettext_noop("Description"));
+
+ /* Table constraint descriptions */
+ appendPQExpBuffer(&buf,
+ " SELECT pgc.oid as oid, pgc.tableoid AS tableoid,\n"
+ " n.nspname as nspname,\n"
+ " CAST(pgc.conname AS pg_catalog.text) as name,"
+ " CAST('%s' AS pg_catalog.text) as object\n"
+ " FROM pg_catalog.pg_constraint pgc\n"
+ " JOIN pg_catalog.pg_class c "
+ "ON c.oid = pgc.conrelid\n"
+ " LEFT JOIN pg_catalog.pg_namespace n "
+ " ON n.oid = c.relnamespace\n",
+ gettext_noop("table constraint"));
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, "WHERE n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, !showSystem && !pattern,
+ false, "n.nspname", "pgc.conname", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)",
+ NULL, 3))
+ goto error_return;
+
+ /* Domain constraint descriptions */
+ appendPQExpBuffer(&buf,
+ "UNION ALL\n"
+ " SELECT pgc.oid as oid, pgc.tableoid AS tableoid,\n"
+ " n.nspname as nspname,\n"
+ " CAST(pgc.conname AS pg_catalog.text) as name,"
+ " CAST('%s' AS pg_catalog.text) as object\n"
+ " FROM pg_catalog.pg_constraint pgc\n"
+ " JOIN pg_catalog.pg_type t "
+ "ON t.oid = pgc.contypid\n"
+ " LEFT JOIN pg_catalog.pg_namespace n "
+ " ON n.oid = t.typnamespace\n",
+ gettext_noop("domain constraint"));
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, "WHERE n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, !showSystem && !pattern,
+ false, "n.nspname", "pgc.conname", NULL,
+ "pg_catalog.pg_type_is_visible(t.oid)",
+ NULL, 3))
+ goto error_return;
+
+ /* Operator class descriptions */
+ appendPQExpBuffer(&buf,
+ "UNION ALL\n"
+ " SELECT o.oid as oid, o.tableoid as tableoid,\n"
+ " n.nspname as nspname,\n"
+ " CAST(o.opcname AS pg_catalog.text) as name,\n"
+ " CAST('%s' AS pg_catalog.text) as object\n"
+ " FROM pg_catalog.pg_opclass o\n"
+ " JOIN pg_catalog.pg_am am ON "
+ "o.opcmethod = am.oid\n"
+ " JOIN pg_catalog.pg_namespace n ON "
+ "n.oid = o.opcnamespace\n",
+ gettext_noop("operator class"));
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "o.opcname", NULL,
+ "pg_catalog.pg_opclass_is_visible(o.oid)",
+ NULL, 3))
+ goto error_return;
+
+ /* Operator family descriptions */
+ appendPQExpBuffer(&buf,
+ "UNION ALL\n"
+ " SELECT opf.oid as oid, opf.tableoid as tableoid,\n"
+ " n.nspname as nspname,\n"
+ " CAST(opf.opfname AS pg_catalog.text) AS name,\n"
+ " CAST('%s' AS pg_catalog.text) as object\n"
+ " FROM pg_catalog.pg_opfamily opf\n"
+ " JOIN pg_catalog.pg_am am "
+ "ON opf.opfmethod = am.oid\n"
+ " JOIN pg_catalog.pg_namespace n "
+ "ON opf.opfnamespace = n.oid\n",
+ gettext_noop("operator family"));
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "opf.opfname", NULL,
+ "pg_catalog.pg_opfamily_is_visible(opf.oid)",
+ NULL, 3))
+ goto error_return;
+
+ /* Rule descriptions (ignore rules for views) */
+ appendPQExpBuffer(&buf,
+ "UNION ALL\n"
+ " SELECT r.oid as oid, r.tableoid as tableoid,\n"
+ " n.nspname as nspname,\n"
+ " CAST(r.rulename AS pg_catalog.text) as name,"
+ " CAST('%s' AS pg_catalog.text) as object\n"
+ " FROM pg_catalog.pg_rewrite r\n"
+ " JOIN pg_catalog.pg_class c ON c.oid = r.ev_class\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n"
+ " WHERE r.rulename != '_RETURN'\n",
+ gettext_noop("rule"));
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "r.rulename", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)",
+ NULL, 3))
+ goto error_return;
+
+ /* Trigger descriptions */
+ appendPQExpBuffer(&buf,
+ "UNION ALL\n"
+ " SELECT t.oid as oid, t.tableoid as tableoid,\n"
+ " n.nspname as nspname,\n"
+ " CAST(t.tgname AS pg_catalog.text) as name,"
+ " CAST('%s' AS pg_catalog.text) as object\n"
+ " FROM pg_catalog.pg_trigger t\n"
+ " JOIN pg_catalog.pg_class c ON c.oid = t.tgrelid\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n",
+ gettext_noop("trigger"));
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, "WHERE n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, !showSystem && !pattern, false,
+ "n.nspname", "t.tgname", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)",
+ NULL, 3))
+ goto error_return;
+
+ appendPQExpBufferStr(&buf,
+ ") AS tt\n"
+ " JOIN pg_catalog.pg_description d ON (tt.oid = d.objoid AND tt.tableoid = d.classoid AND d.objsubid = 0)\n");
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 3;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("Object descriptions");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+
+/*
+ * describeTableDetails (for \d)
+ *
+ * This routine finds the tables to be displayed, and calls
+ * describeOneTableDetails for each one.
+ *
+ * verbose: if true, this is \d+
+ */
+bool
+describeTableDetails(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ int i;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT c.oid,\n"
+ " n.nspname,\n"
+ " c.relname\n"
+ "FROM pg_catalog.pg_class c\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, "WHERE n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, !showSystem && !pattern, false,
+ "n.nspname", "c.relname", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 2, 3;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ if (PQntuples(res) == 0)
+ {
+ if (!pset.quiet)
+ {
+ if (pattern)
+ pg_log_error("Did not find any relation named \"%s\".",
+ pattern);
+ else
+ pg_log_error("Did not find any relations.");
+ }
+ PQclear(res);
+ return false;
+ }
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ const char *oid;
+ const char *nspname;
+ const char *relname;
+
+ oid = PQgetvalue(res, i, 0);
+ nspname = PQgetvalue(res, i, 1);
+ relname = PQgetvalue(res, i, 2);
+
+ if (!describeOneTableDetails(nspname, relname, oid, verbose))
+ {
+ PQclear(res);
+ return false;
+ }
+ if (cancel_pressed)
+ {
+ PQclear(res);
+ return false;
+ }
+ }
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * describeOneTableDetails (for \d)
+ *
+ * Unfortunately, the information presented here is so complicated that it
+ * cannot be done in a single query. So we have to assemble the printed table
+ * by hand and pass it to the underlying printTable() function.
+ */
+static bool
+describeOneTableDetails(const char *schemaname,
+ const char *relationname,
+ const char *oid,
+ bool verbose)
+{
+ bool retval = false;
+ PQExpBufferData buf;
+ PGresult *res = NULL;
+ printTableOpt myopt = pset.popt.topt;
+ printTableContent cont;
+ bool printTableInitialized = false;
+ int i;
+ char *view_def = NULL;
+ char *headers[12];
+ PQExpBufferData title;
+ PQExpBufferData tmpbuf;
+ int cols;
+ int attname_col = -1, /* column indexes in "res" */
+ atttype_col = -1,
+ attrdef_col = -1,
+ attnotnull_col = -1,
+ attcoll_col = -1,
+ attidentity_col = -1,
+ attgenerated_col = -1,
+ isindexkey_col = -1,
+ indexdef_col = -1,
+ fdwopts_col = -1,
+ attstorage_col = -1,
+ attcompression_col = -1,
+ attstattarget_col = -1,
+ attdescr_col = -1;
+ int numrows;
+ struct
+ {
+ int16 checks;
+ char relkind;
+ bool hasindex;
+ bool hasrules;
+ bool hastriggers;
+ bool rowsecurity;
+ bool forcerowsecurity;
+ bool hasoids;
+ bool ispartition;
+ Oid tablespace;
+ char *reloptions;
+ char *reloftype;
+ char relpersistence;
+ char relreplident;
+ char *relam;
+ } tableinfo;
+ bool show_column_details = false;
+
+ myopt.default_footer = false;
+ /* This output looks confusing in expanded mode. */
+ myopt.expanded = false;
+
+ initPQExpBuffer(&buf);
+ initPQExpBuffer(&title);
+ initPQExpBuffer(&tmpbuf);
+
+ /* Get general table info */
+ if (pset.sversion >= 120000)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, "
+ "c.relhastriggers, c.relrowsecurity, c.relforcerowsecurity, "
+ "false AS relhasoids, c.relispartition, %s, c.reltablespace, "
+ "CASE WHEN c.reloftype = 0 THEN '' ELSE c.reloftype::pg_catalog.regtype::pg_catalog.text END, "
+ "c.relpersistence, c.relreplident, am.amname\n"
+ "FROM pg_catalog.pg_class c\n "
+ "LEFT JOIN pg_catalog.pg_class tc ON (c.reltoastrelid = tc.oid)\n"
+ "LEFT JOIN pg_catalog.pg_am am ON (c.relam = am.oid)\n"
+ "WHERE c.oid = '%s';",
+ (verbose ?
+ "pg_catalog.array_to_string(c.reloptions || "
+ "array(select 'toast.' || x from pg_catalog.unnest(tc.reloptions) x), ', ')\n"
+ : "''"),
+ oid);
+ }
+ else if (pset.sversion >= 100000)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, "
+ "c.relhastriggers, c.relrowsecurity, c.relforcerowsecurity, "
+ "c.relhasoids, c.relispartition, %s, c.reltablespace, "
+ "CASE WHEN c.reloftype = 0 THEN '' ELSE c.reloftype::pg_catalog.regtype::pg_catalog.text END, "
+ "c.relpersistence, c.relreplident\n"
+ "FROM pg_catalog.pg_class c\n "
+ "LEFT JOIN pg_catalog.pg_class tc ON (c.reltoastrelid = tc.oid)\n"
+ "WHERE c.oid = '%s';",
+ (verbose ?
+ "pg_catalog.array_to_string(c.reloptions || "
+ "array(select 'toast.' || x from pg_catalog.unnest(tc.reloptions) x), ', ')\n"
+ : "''"),
+ oid);
+ }
+ else if (pset.sversion >= 90500)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, "
+ "c.relhastriggers, c.relrowsecurity, c.relforcerowsecurity, "
+ "c.relhasoids, false as relispartition, %s, c.reltablespace, "
+ "CASE WHEN c.reloftype = 0 THEN '' ELSE c.reloftype::pg_catalog.regtype::pg_catalog.text END, "
+ "c.relpersistence, c.relreplident\n"
+ "FROM pg_catalog.pg_class c\n "
+ "LEFT JOIN pg_catalog.pg_class tc ON (c.reltoastrelid = tc.oid)\n"
+ "WHERE c.oid = '%s';",
+ (verbose ?
+ "pg_catalog.array_to_string(c.reloptions || "
+ "array(select 'toast.' || x from pg_catalog.unnest(tc.reloptions) x), ', ')\n"
+ : "''"),
+ oid);
+ }
+ else if (pset.sversion >= 90400)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, "
+ "c.relhastriggers, false, false, c.relhasoids, "
+ "false as relispartition, %s, c.reltablespace, "
+ "CASE WHEN c.reloftype = 0 THEN '' ELSE c.reloftype::pg_catalog.regtype::pg_catalog.text END, "
+ "c.relpersistence, c.relreplident\n"
+ "FROM pg_catalog.pg_class c\n "
+ "LEFT JOIN pg_catalog.pg_class tc ON (c.reltoastrelid = tc.oid)\n"
+ "WHERE c.oid = '%s';",
+ (verbose ?
+ "pg_catalog.array_to_string(c.reloptions || "
+ "array(select 'toast.' || x from pg_catalog.unnest(tc.reloptions) x), ', ')\n"
+ : "''"),
+ oid);
+ }
+ else
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, "
+ "c.relhastriggers, false, false, c.relhasoids, "
+ "false as relispartition, %s, c.reltablespace, "
+ "CASE WHEN c.reloftype = 0 THEN '' ELSE c.reloftype::pg_catalog.regtype::pg_catalog.text END, "
+ "c.relpersistence\n"
+ "FROM pg_catalog.pg_class c\n "
+ "LEFT JOIN pg_catalog.pg_class tc ON (c.reltoastrelid = tc.oid)\n"
+ "WHERE c.oid = '%s';",
+ (verbose ?
+ "pg_catalog.array_to_string(c.reloptions || "
+ "array(select 'toast.' || x from pg_catalog.unnest(tc.reloptions) x), ', ')\n"
+ : "''"),
+ oid);
+ }
+
+ res = PSQLexec(buf.data);
+ if (!res)
+ goto error_return;
+
+ /* Did we get anything? */
+ if (PQntuples(res) == 0)
+ {
+ if (!pset.quiet)
+ pg_log_error("Did not find any relation with OID %s.", oid);
+ goto error_return;
+ }
+
+ tableinfo.checks = atoi(PQgetvalue(res, 0, 0));
+ tableinfo.relkind = *(PQgetvalue(res, 0, 1));
+ tableinfo.hasindex = strcmp(PQgetvalue(res, 0, 2), "t") == 0;
+ tableinfo.hasrules = strcmp(PQgetvalue(res, 0, 3), "t") == 0;
+ tableinfo.hastriggers = strcmp(PQgetvalue(res, 0, 4), "t") == 0;
+ tableinfo.rowsecurity = strcmp(PQgetvalue(res, 0, 5), "t") == 0;
+ tableinfo.forcerowsecurity = strcmp(PQgetvalue(res, 0, 6), "t") == 0;
+ tableinfo.hasoids = strcmp(PQgetvalue(res, 0, 7), "t") == 0;
+ tableinfo.ispartition = strcmp(PQgetvalue(res, 0, 8), "t") == 0;
+ tableinfo.reloptions = pg_strdup(PQgetvalue(res, 0, 9));
+ tableinfo.tablespace = atooid(PQgetvalue(res, 0, 10));
+ tableinfo.reloftype = (strcmp(PQgetvalue(res, 0, 11), "") != 0) ?
+ pg_strdup(PQgetvalue(res, 0, 11)) : NULL;
+ tableinfo.relpersistence = *(PQgetvalue(res, 0, 12));
+ tableinfo.relreplident = (pset.sversion >= 90400) ?
+ *(PQgetvalue(res, 0, 13)) : 'd';
+ if (pset.sversion >= 120000)
+ tableinfo.relam = PQgetisnull(res, 0, 14) ?
+ (char *) NULL : pg_strdup(PQgetvalue(res, 0, 14));
+ else
+ tableinfo.relam = NULL;
+ PQclear(res);
+ res = NULL;
+
+ /*
+ * If it's a sequence, deal with it here separately.
+ */
+ if (tableinfo.relkind == RELKIND_SEQUENCE)
+ {
+ PGresult *result = NULL;
+ printQueryOpt myopt = pset.popt;
+ char *footers[2] = {NULL, NULL};
+
+ if (pset.sversion >= 100000)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT pg_catalog.format_type(seqtypid, NULL) AS \"%s\",\n"
+ " seqstart AS \"%s\",\n"
+ " seqmin AS \"%s\",\n"
+ " seqmax AS \"%s\",\n"
+ " seqincrement AS \"%s\",\n"
+ " CASE WHEN seqcycle THEN '%s' ELSE '%s' END AS \"%s\",\n"
+ " seqcache AS \"%s\"\n",
+ gettext_noop("Type"),
+ gettext_noop("Start"),
+ gettext_noop("Minimum"),
+ gettext_noop("Maximum"),
+ gettext_noop("Increment"),
+ gettext_noop("yes"),
+ gettext_noop("no"),
+ gettext_noop("Cycles?"),
+ gettext_noop("Cache"));
+ appendPQExpBuffer(&buf,
+ "FROM pg_catalog.pg_sequence\n"
+ "WHERE seqrelid = '%s';",
+ oid);
+ }
+ else
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT 'bigint' AS \"%s\",\n"
+ " start_value AS \"%s\",\n"
+ " min_value AS \"%s\",\n"
+ " max_value AS \"%s\",\n"
+ " increment_by AS \"%s\",\n"
+ " CASE WHEN is_cycled THEN '%s' ELSE '%s' END AS \"%s\",\n"
+ " cache_value AS \"%s\"\n",
+ gettext_noop("Type"),
+ gettext_noop("Start"),
+ gettext_noop("Minimum"),
+ gettext_noop("Maximum"),
+ gettext_noop("Increment"),
+ gettext_noop("yes"),
+ gettext_noop("no"),
+ gettext_noop("Cycles?"),
+ gettext_noop("Cache"));
+ appendPQExpBuffer(&buf, "FROM %s", fmtId(schemaname));
+ /* must be separate because fmtId isn't reentrant */
+ appendPQExpBuffer(&buf, ".%s;", fmtId(relationname));
+ }
+
+ res = PSQLexec(buf.data);
+ if (!res)
+ goto error_return;
+
+ /* Get the column that owns this sequence */
+ printfPQExpBuffer(&buf, "SELECT pg_catalog.quote_ident(nspname) || '.' ||"
+ "\n pg_catalog.quote_ident(relname) || '.' ||"
+ "\n pg_catalog.quote_ident(attname),"
+ "\n d.deptype"
+ "\nFROM pg_catalog.pg_class c"
+ "\nINNER JOIN pg_catalog.pg_depend d ON c.oid=d.refobjid"
+ "\nINNER JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace"
+ "\nINNER JOIN pg_catalog.pg_attribute a ON ("
+ "\n a.attrelid=c.oid AND"
+ "\n a.attnum=d.refobjsubid)"
+ "\nWHERE d.classid='pg_catalog.pg_class'::pg_catalog.regclass"
+ "\n AND d.refclassid='pg_catalog.pg_class'::pg_catalog.regclass"
+ "\n AND d.objid='%s'"
+ "\n AND d.deptype IN ('a', 'i')",
+ oid);
+
+ result = PSQLexec(buf.data);
+
+ /*
+ * If we get no rows back, don't show anything (obviously). We should
+ * never get more than one row back, but if we do, just ignore it and
+ * don't print anything.
+ */
+ if (!result)
+ goto error_return;
+ else if (PQntuples(result) == 1)
+ {
+ switch (PQgetvalue(result, 0, 1)[0])
+ {
+ case 'a':
+ footers[0] = psprintf(_("Owned by: %s"),
+ PQgetvalue(result, 0, 0));
+ break;
+ case 'i':
+ footers[0] = psprintf(_("Sequence for identity column: %s"),
+ PQgetvalue(result, 0, 0));
+ break;
+ }
+ }
+ PQclear(result);
+
+ if (tableinfo.relpersistence == 'u')
+ printfPQExpBuffer(&title, _("Unlogged sequence \"%s.%s\""),
+ schemaname, relationname);
+ else
+ printfPQExpBuffer(&title, _("Sequence \"%s.%s\""),
+ schemaname, relationname);
+
+ myopt.footers = footers;
+ myopt.topt.default_footer = false;
+ myopt.title = title.data;
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ if (footers[0])
+ free(footers[0]);
+
+ retval = true;
+ goto error_return; /* not an error, just return early */
+ }
+
+ /* Identify whether we should print collation, nullable, default vals */
+ if (tableinfo.relkind == RELKIND_RELATION ||
+ tableinfo.relkind == RELKIND_VIEW ||
+ tableinfo.relkind == RELKIND_MATVIEW ||
+ tableinfo.relkind == RELKIND_FOREIGN_TABLE ||
+ tableinfo.relkind == RELKIND_COMPOSITE_TYPE ||
+ tableinfo.relkind == RELKIND_PARTITIONED_TABLE)
+ show_column_details = true;
+
+ /*
+ * Get per-column info
+ *
+ * Since the set of query columns we need varies depending on relkind and
+ * server version, we compute all the column numbers on-the-fly. Column
+ * number variables for columns not fetched are left as -1; this avoids
+ * duplicative test logic below.
+ */
+ cols = 0;
+ printfPQExpBuffer(&buf, "SELECT a.attname");
+ attname_col = cols++;
+ appendPQExpBufferStr(&buf, ",\n pg_catalog.format_type(a.atttypid, a.atttypmod)");
+ atttype_col = cols++;
+
+ if (show_column_details)
+ {
+ /* use "pretty" mode for expression to avoid excessive parentheses */
+ appendPQExpBufferStr(&buf,
+ ",\n (SELECT pg_catalog.pg_get_expr(d.adbin, d.adrelid, true)"
+ "\n FROM pg_catalog.pg_attrdef d"
+ "\n WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef)"
+ ",\n a.attnotnull");
+ attrdef_col = cols++;
+ attnotnull_col = cols++;
+ appendPQExpBufferStr(&buf, ",\n (SELECT c.collname FROM pg_catalog.pg_collation c, pg_catalog.pg_type t\n"
+ " WHERE c.oid = a.attcollation AND t.oid = a.atttypid AND a.attcollation <> t.typcollation) AS attcollation");
+ attcoll_col = cols++;
+ if (pset.sversion >= 100000)
+ appendPQExpBufferStr(&buf, ",\n a.attidentity");
+ else
+ appendPQExpBufferStr(&buf, ",\n ''::pg_catalog.char AS attidentity");
+ attidentity_col = cols++;
+ if (pset.sversion >= 120000)
+ appendPQExpBufferStr(&buf, ",\n a.attgenerated");
+ else
+ appendPQExpBufferStr(&buf, ",\n ''::pg_catalog.char AS attgenerated");
+ attgenerated_col = cols++;
+ }
+ if (tableinfo.relkind == RELKIND_INDEX ||
+ tableinfo.relkind == RELKIND_PARTITIONED_INDEX)
+ {
+ if (pset.sversion >= 110000)
+ {
+ appendPQExpBuffer(&buf, ",\n CASE WHEN a.attnum <= (SELECT i.indnkeyatts FROM pg_catalog.pg_index i WHERE i.indexrelid = '%s') THEN '%s' ELSE '%s' END AS is_key",
+ oid,
+ gettext_noop("yes"),
+ gettext_noop("no"));
+ isindexkey_col = cols++;
+ }
+ appendPQExpBufferStr(&buf, ",\n pg_catalog.pg_get_indexdef(a.attrelid, a.attnum, TRUE) AS indexdef");
+ indexdef_col = cols++;
+ }
+ /* FDW options for foreign table column */
+ if (tableinfo.relkind == RELKIND_FOREIGN_TABLE)
+ {
+ appendPQExpBufferStr(&buf, ",\n CASE WHEN attfdwoptions IS NULL THEN '' ELSE "
+ " '(' || pg_catalog.array_to_string(ARRAY(SELECT pg_catalog.quote_ident(option_name) || ' ' || pg_catalog.quote_literal(option_value) FROM "
+ " pg_catalog.pg_options_to_table(attfdwoptions)), ', ') || ')' END AS attfdwoptions");
+ fdwopts_col = cols++;
+ }
+ if (verbose)
+ {
+ appendPQExpBufferStr(&buf, ",\n a.attstorage");
+ attstorage_col = cols++;
+
+ /* compression info, if relevant to relkind */
+ if (pset.sversion >= 140000 &&
+ !pset.hide_compression &&
+ (tableinfo.relkind == RELKIND_RELATION ||
+ tableinfo.relkind == RELKIND_PARTITIONED_TABLE ||
+ tableinfo.relkind == RELKIND_MATVIEW))
+ {
+ appendPQExpBufferStr(&buf, ",\n a.attcompression AS attcompression");
+ attcompression_col = cols++;
+ }
+
+ /* stats target, if relevant to relkind */
+ if (tableinfo.relkind == RELKIND_RELATION ||
+ tableinfo.relkind == RELKIND_INDEX ||
+ tableinfo.relkind == RELKIND_PARTITIONED_INDEX ||
+ tableinfo.relkind == RELKIND_MATVIEW ||
+ tableinfo.relkind == RELKIND_FOREIGN_TABLE ||
+ tableinfo.relkind == RELKIND_PARTITIONED_TABLE)
+ {
+ appendPQExpBufferStr(&buf, ",\n CASE WHEN a.attstattarget=-1 THEN NULL ELSE a.attstattarget END AS attstattarget");
+ attstattarget_col = cols++;
+ }
+
+ /*
+ * In 9.0+, we have column comments for: relations, views, composite
+ * types, and foreign tables (cf. CommentObject() in comment.c).
+ */
+ if (tableinfo.relkind == RELKIND_RELATION ||
+ tableinfo.relkind == RELKIND_VIEW ||
+ tableinfo.relkind == RELKIND_MATVIEW ||
+ tableinfo.relkind == RELKIND_FOREIGN_TABLE ||
+ tableinfo.relkind == RELKIND_COMPOSITE_TYPE ||
+ tableinfo.relkind == RELKIND_PARTITIONED_TABLE)
+ {
+ appendPQExpBufferStr(&buf, ",\n pg_catalog.col_description(a.attrelid, a.attnum)");
+ attdescr_col = cols++;
+ }
+ }
+
+ appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_attribute a");
+ appendPQExpBuffer(&buf, "\nWHERE a.attrelid = '%s' AND a.attnum > 0 AND NOT a.attisdropped", oid);
+ appendPQExpBufferStr(&buf, "\nORDER BY a.attnum;");
+
+ res = PSQLexec(buf.data);
+ if (!res)
+ goto error_return;
+ numrows = PQntuples(res);
+
+ /* Make title */
+ switch (tableinfo.relkind)
+ {
+ case RELKIND_RELATION:
+ if (tableinfo.relpersistence == 'u')
+ printfPQExpBuffer(&title, _("Unlogged table \"%s.%s\""),
+ schemaname, relationname);
+ else
+ printfPQExpBuffer(&title, _("Table \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ case RELKIND_VIEW:
+ printfPQExpBuffer(&title, _("View \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ case RELKIND_MATVIEW:
+ if (tableinfo.relpersistence == 'u')
+ printfPQExpBuffer(&title, _("Unlogged materialized view \"%s.%s\""),
+ schemaname, relationname);
+ else
+ printfPQExpBuffer(&title, _("Materialized view \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ case RELKIND_INDEX:
+ if (tableinfo.relpersistence == 'u')
+ printfPQExpBuffer(&title, _("Unlogged index \"%s.%s\""),
+ schemaname, relationname);
+ else
+ printfPQExpBuffer(&title, _("Index \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ case RELKIND_PARTITIONED_INDEX:
+ if (tableinfo.relpersistence == 'u')
+ printfPQExpBuffer(&title, _("Unlogged partitioned index \"%s.%s\""),
+ schemaname, relationname);
+ else
+ printfPQExpBuffer(&title, _("Partitioned index \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ case RELKIND_TOASTVALUE:
+ printfPQExpBuffer(&title, _("TOAST table \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ case RELKIND_COMPOSITE_TYPE:
+ printfPQExpBuffer(&title, _("Composite type \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ case RELKIND_FOREIGN_TABLE:
+ printfPQExpBuffer(&title, _("Foreign table \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ case RELKIND_PARTITIONED_TABLE:
+ if (tableinfo.relpersistence == 'u')
+ printfPQExpBuffer(&title, _("Unlogged partitioned table \"%s.%s\""),
+ schemaname, relationname);
+ else
+ printfPQExpBuffer(&title, _("Partitioned table \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ default:
+ /* untranslated unknown relkind */
+ printfPQExpBuffer(&title, "?%c? \"%s.%s\"",
+ tableinfo.relkind, schemaname, relationname);
+ break;
+ }
+
+ /* Fill headers[] with the names of the columns we will output */
+ cols = 0;
+ headers[cols++] = gettext_noop("Column");
+ headers[cols++] = gettext_noop("Type");
+ if (show_column_details)
+ {
+ headers[cols++] = gettext_noop("Collation");
+ headers[cols++] = gettext_noop("Nullable");
+ headers[cols++] = gettext_noop("Default");
+ }
+ if (isindexkey_col >= 0)
+ headers[cols++] = gettext_noop("Key?");
+ if (indexdef_col >= 0)
+ headers[cols++] = gettext_noop("Definition");
+ if (fdwopts_col >= 0)
+ headers[cols++] = gettext_noop("FDW options");
+ if (attstorage_col >= 0)
+ headers[cols++] = gettext_noop("Storage");
+ if (attcompression_col >= 0)
+ headers[cols++] = gettext_noop("Compression");
+ if (attstattarget_col >= 0)
+ headers[cols++] = gettext_noop("Stats target");
+ if (attdescr_col >= 0)
+ headers[cols++] = gettext_noop("Description");
+
+ Assert(cols <= lengthof(headers));
+
+ printTableInit(&cont, &myopt, title.data, cols, numrows);
+ printTableInitialized = true;
+
+ for (i = 0; i < cols; i++)
+ printTableAddHeader(&cont, headers[i], true, 'l');
+
+ /* Generate table cells to be printed */
+ for (i = 0; i < numrows; i++)
+ {
+ /* Column */
+ printTableAddCell(&cont, PQgetvalue(res, i, attname_col), false, false);
+
+ /* Type */
+ printTableAddCell(&cont, PQgetvalue(res, i, atttype_col), false, false);
+
+ /* Collation, Nullable, Default */
+ if (show_column_details)
+ {
+ char *identity;
+ char *generated;
+ char *default_str;
+ bool mustfree = false;
+
+ printTableAddCell(&cont, PQgetvalue(res, i, attcoll_col), false, false);
+
+ printTableAddCell(&cont,
+ strcmp(PQgetvalue(res, i, attnotnull_col), "t") == 0 ? "not null" : "",
+ false, false);
+
+ identity = PQgetvalue(res, i, attidentity_col);
+ generated = PQgetvalue(res, i, attgenerated_col);
+
+ if (identity[0] == ATTRIBUTE_IDENTITY_ALWAYS)
+ default_str = "generated always as identity";
+ else if (identity[0] == ATTRIBUTE_IDENTITY_BY_DEFAULT)
+ default_str = "generated by default as identity";
+ else if (generated[0] == ATTRIBUTE_GENERATED_STORED)
+ {
+ default_str = psprintf("generated always as (%s) stored",
+ PQgetvalue(res, i, attrdef_col));
+ mustfree = true;
+ }
+ else
+ default_str = PQgetvalue(res, i, attrdef_col);
+
+ printTableAddCell(&cont, default_str, false, mustfree);
+ }
+
+ /* Info for index columns */
+ if (isindexkey_col >= 0)
+ printTableAddCell(&cont, PQgetvalue(res, i, isindexkey_col), true, false);
+ if (indexdef_col >= 0)
+ printTableAddCell(&cont, PQgetvalue(res, i, indexdef_col), false, false);
+
+ /* FDW options for foreign table columns */
+ if (fdwopts_col >= 0)
+ printTableAddCell(&cont, PQgetvalue(res, i, fdwopts_col), false, false);
+
+ /* Storage mode, if relevant */
+ if (attstorage_col >= 0)
+ {
+ char *storage = PQgetvalue(res, i, attstorage_col);
+
+ /* these strings are literal in our syntax, so not translated. */
+ printTableAddCell(&cont, (storage[0] == 'p' ? "plain" :
+ (storage[0] == 'm' ? "main" :
+ (storage[0] == 'x' ? "extended" :
+ (storage[0] == 'e' ? "external" :
+ "???")))),
+ false, false);
+ }
+
+ /* Column compression, if relevant */
+ if (attcompression_col >= 0)
+ {
+ char *compression = PQgetvalue(res, i, attcompression_col);
+
+ /* these strings are literal in our syntax, so not translated. */
+ printTableAddCell(&cont, (compression[0] == 'p' ? "pglz" :
+ (compression[0] == 'l' ? "lz4" :
+ (compression[0] == '\0' ? "" :
+ "???"))),
+ false, false);
+ }
+
+ /* Statistics target, if the relkind supports this feature */
+ if (attstattarget_col >= 0)
+ printTableAddCell(&cont, PQgetvalue(res, i, attstattarget_col),
+ false, false);
+
+ /* Column comments, if the relkind supports this feature */
+ if (attdescr_col >= 0)
+ printTableAddCell(&cont, PQgetvalue(res, i, attdescr_col),
+ false, false);
+ }
+
+ /* Make footers */
+
+ if (tableinfo.ispartition)
+ {
+ /* Footer information for a partition child table */
+ PGresult *result;
+
+ printfPQExpBuffer(&buf,
+ "SELECT inhparent::pg_catalog.regclass,\n"
+ " pg_catalog.pg_get_expr(c.relpartbound, c.oid),\n ");
+
+ appendPQExpBuffer(&buf,
+ pset.sversion >= 140000 ? "inhdetachpending" :
+ "false as inhdetachpending");
+
+ /* If verbose, also request the partition constraint definition */
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ ",\n pg_catalog.pg_get_partition_constraintdef(c.oid)");
+ appendPQExpBuffer(&buf,
+ "\nFROM pg_catalog.pg_class c"
+ " JOIN pg_catalog.pg_inherits i"
+ " ON c.oid = inhrelid"
+ "\nWHERE c.oid = '%s';", oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+
+ if (PQntuples(result) > 0)
+ {
+ char *parent_name = PQgetvalue(result, 0, 0);
+ char *partdef = PQgetvalue(result, 0, 1);
+ char *detached = PQgetvalue(result, 0, 2);
+
+ printfPQExpBuffer(&tmpbuf, _("Partition of: %s %s%s"), parent_name,
+ partdef,
+ strcmp(detached, "t") == 0 ? " DETACH PENDING" : "");
+ printTableAddFooter(&cont, tmpbuf.data);
+
+ if (verbose)
+ {
+ char *partconstraintdef = NULL;
+
+ if (!PQgetisnull(result, 0, 3))
+ partconstraintdef = PQgetvalue(result, 0, 3);
+ /* If there isn't any constraint, show that explicitly */
+ if (partconstraintdef == NULL || partconstraintdef[0] == '\0')
+ printfPQExpBuffer(&tmpbuf, _("No partition constraint"));
+ else
+ printfPQExpBuffer(&tmpbuf, _("Partition constraint: %s"),
+ partconstraintdef);
+ printTableAddFooter(&cont, tmpbuf.data);
+ }
+ }
+ PQclear(result);
+ }
+
+ if (tableinfo.relkind == RELKIND_PARTITIONED_TABLE)
+ {
+ /* Footer information for a partitioned table (partitioning parent) */
+ PGresult *result;
+
+ printfPQExpBuffer(&buf,
+ "SELECT pg_catalog.pg_get_partkeydef('%s'::pg_catalog.oid);",
+ oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+
+ if (PQntuples(result) == 1)
+ {
+ char *partkeydef = PQgetvalue(result, 0, 0);
+
+ printfPQExpBuffer(&tmpbuf, _("Partition key: %s"), partkeydef);
+ printTableAddFooter(&cont, tmpbuf.data);
+ }
+ PQclear(result);
+ }
+
+ if (tableinfo.relkind == RELKIND_TOASTVALUE)
+ {
+ /* For a TOAST table, print name of owning table */
+ PGresult *result;
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname, c.relname\n"
+ "FROM pg_catalog.pg_class c"
+ " JOIN pg_catalog.pg_namespace n"
+ " ON n.oid = c.relnamespace\n"
+ "WHERE reltoastrelid = '%s';", oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+
+ if (PQntuples(result) == 1)
+ {
+ char *schemaname = PQgetvalue(result, 0, 0);
+ char *relname = PQgetvalue(result, 0, 1);
+
+ printfPQExpBuffer(&tmpbuf, _("Owning table: \"%s.%s\""),
+ schemaname, relname);
+ printTableAddFooter(&cont, tmpbuf.data);
+ }
+ PQclear(result);
+ }
+
+ if (tableinfo.relkind == RELKIND_INDEX ||
+ tableinfo.relkind == RELKIND_PARTITIONED_INDEX)
+ {
+ /* Footer information about an index */
+ PGresult *result;
+
+ printfPQExpBuffer(&buf,
+ "SELECT i.indisunique, i.indisprimary, i.indisclustered, "
+ "i.indisvalid,\n"
+ " (NOT i.indimmediate) AND "
+ "EXISTS (SELECT 1 FROM pg_catalog.pg_constraint "
+ "WHERE conrelid = i.indrelid AND "
+ "conindid = i.indexrelid AND "
+ "contype IN ('p','u','x') AND "
+ "condeferrable) AS condeferrable,\n"
+ " (NOT i.indimmediate) AND "
+ "EXISTS (SELECT 1 FROM pg_catalog.pg_constraint "
+ "WHERE conrelid = i.indrelid AND "
+ "conindid = i.indexrelid AND "
+ "contype IN ('p','u','x') AND "
+ "condeferred) AS condeferred,\n");
+
+ if (pset.sversion >= 90400)
+ appendPQExpBufferStr(&buf, "i.indisreplident,\n");
+ else
+ appendPQExpBufferStr(&buf, "false AS indisreplident,\n");
+
+ if (pset.sversion >= 150000)
+ appendPQExpBufferStr(&buf, "i.indnullsnotdistinct,\n");
+ else
+ appendPQExpBufferStr(&buf, "false AS indnullsnotdistinct,\n");
+
+ appendPQExpBuffer(&buf, " a.amname, c2.relname, "
+ "pg_catalog.pg_get_expr(i.indpred, i.indrelid, true)\n"
+ "FROM pg_catalog.pg_index i, pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_am a\n"
+ "WHERE i.indexrelid = c.oid AND c.oid = '%s' AND c.relam = a.oid\n"
+ "AND i.indrelid = c2.oid;",
+ oid);
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else if (PQntuples(result) != 1)
+ {
+ PQclear(result);
+ goto error_return;
+ }
+ else
+ {
+ char *indisunique = PQgetvalue(result, 0, 0);
+ char *indisprimary = PQgetvalue(result, 0, 1);
+ char *indisclustered = PQgetvalue(result, 0, 2);
+ char *indisvalid = PQgetvalue(result, 0, 3);
+ char *deferrable = PQgetvalue(result, 0, 4);
+ char *deferred = PQgetvalue(result, 0, 5);
+ char *indisreplident = PQgetvalue(result, 0, 6);
+ char *indnullsnotdistinct = PQgetvalue(result, 0, 7);
+ char *indamname = PQgetvalue(result, 0, 8);
+ char *indtable = PQgetvalue(result, 0, 9);
+ char *indpred = PQgetvalue(result, 0, 10);
+
+ if (strcmp(indisprimary, "t") == 0)
+ printfPQExpBuffer(&tmpbuf, _("primary key, "));
+ else if (strcmp(indisunique, "t") == 0)
+ {
+ printfPQExpBuffer(&tmpbuf, _("unique"));
+ if (strcmp(indnullsnotdistinct, "t") == 0)
+ appendPQExpBufferStr(&tmpbuf, _(" nulls not distinct"));
+ appendPQExpBuffer(&tmpbuf, _(", "));
+ }
+ else
+ resetPQExpBuffer(&tmpbuf);
+ appendPQExpBuffer(&tmpbuf, "%s, ", indamname);
+
+ /* we assume here that index and table are in same schema */
+ appendPQExpBuffer(&tmpbuf, _("for table \"%s.%s\""),
+ schemaname, indtable);
+
+ if (strlen(indpred))
+ appendPQExpBuffer(&tmpbuf, _(", predicate (%s)"), indpred);
+
+ if (strcmp(indisclustered, "t") == 0)
+ appendPQExpBufferStr(&tmpbuf, _(", clustered"));
+
+ if (strcmp(indisvalid, "t") != 0)
+ appendPQExpBufferStr(&tmpbuf, _(", invalid"));
+
+ if (strcmp(deferrable, "t") == 0)
+ appendPQExpBufferStr(&tmpbuf, _(", deferrable"));
+
+ if (strcmp(deferred, "t") == 0)
+ appendPQExpBufferStr(&tmpbuf, _(", initially deferred"));
+
+ if (strcmp(indisreplident, "t") == 0)
+ appendPQExpBufferStr(&tmpbuf, _(", replica identity"));
+
+ printTableAddFooter(&cont, tmpbuf.data);
+
+ /*
+ * If it's a partitioned index, we'll print the tablespace below
+ */
+ if (tableinfo.relkind == RELKIND_INDEX)
+ add_tablespace_footer(&cont, tableinfo.relkind,
+ tableinfo.tablespace, true);
+ }
+
+ PQclear(result);
+ }
+ /* If you add relkinds here, see also "Finish printing..." stanza below */
+ else if (tableinfo.relkind == RELKIND_RELATION ||
+ tableinfo.relkind == RELKIND_MATVIEW ||
+ tableinfo.relkind == RELKIND_FOREIGN_TABLE ||
+ tableinfo.relkind == RELKIND_PARTITIONED_TABLE ||
+ tableinfo.relkind == RELKIND_PARTITIONED_INDEX ||
+ tableinfo.relkind == RELKIND_TOASTVALUE)
+ {
+ /* Footer information about a table */
+ PGresult *result = NULL;
+ int tuples = 0;
+
+ /* print indexes */
+ if (tableinfo.hasindex)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT c2.relname, i.indisprimary, i.indisunique, "
+ "i.indisclustered, i.indisvalid, "
+ "pg_catalog.pg_get_indexdef(i.indexrelid, 0, true),\n "
+ "pg_catalog.pg_get_constraintdef(con.oid, true), "
+ "contype, condeferrable, condeferred");
+ if (pset.sversion >= 90400)
+ appendPQExpBufferStr(&buf, ", i.indisreplident");
+ else
+ appendPQExpBufferStr(&buf, ", false AS indisreplident");
+ appendPQExpBufferStr(&buf, ", c2.reltablespace");
+ appendPQExpBuffer(&buf,
+ "\nFROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i\n"
+ " LEFT JOIN pg_catalog.pg_constraint con ON (conrelid = i.indrelid AND conindid = i.indexrelid AND contype IN ('p','u','x'))\n"
+ "WHERE c.oid = '%s' AND c.oid = i.indrelid AND i.indexrelid = c2.oid\n"
+ "ORDER BY i.indisprimary DESC, c2.relname;",
+ oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ {
+ printTableAddFooter(&cont, _("Indexes:"));
+ for (i = 0; i < tuples; i++)
+ {
+ /* untranslated index name */
+ printfPQExpBuffer(&buf, " \"%s\"",
+ PQgetvalue(result, i, 0));
+
+ /* If exclusion constraint, print the constraintdef */
+ if (strcmp(PQgetvalue(result, i, 7), "x") == 0)
+ {
+ appendPQExpBuffer(&buf, " %s",
+ PQgetvalue(result, i, 6));
+ }
+ else
+ {
+ const char *indexdef;
+ const char *usingpos;
+
+ /* Label as primary key or unique (but not both) */
+ if (strcmp(PQgetvalue(result, i, 1), "t") == 0)
+ appendPQExpBufferStr(&buf, " PRIMARY KEY,");
+ else if (strcmp(PQgetvalue(result, i, 2), "t") == 0)
+ {
+ if (strcmp(PQgetvalue(result, i, 7), "u") == 0)
+ appendPQExpBufferStr(&buf, " UNIQUE CONSTRAINT,");
+ else
+ appendPQExpBufferStr(&buf, " UNIQUE,");
+ }
+
+ /* Everything after "USING" is echoed verbatim */
+ indexdef = PQgetvalue(result, i, 5);
+ usingpos = strstr(indexdef, " USING ");
+ if (usingpos)
+ indexdef = usingpos + 7;
+ appendPQExpBuffer(&buf, " %s", indexdef);
+
+ /* Need these for deferrable PK/UNIQUE indexes */
+ if (strcmp(PQgetvalue(result, i, 8), "t") == 0)
+ appendPQExpBufferStr(&buf, " DEFERRABLE");
+
+ if (strcmp(PQgetvalue(result, i, 9), "t") == 0)
+ appendPQExpBufferStr(&buf, " INITIALLY DEFERRED");
+ }
+
+ /* Add these for all cases */
+ if (strcmp(PQgetvalue(result, i, 3), "t") == 0)
+ appendPQExpBufferStr(&buf, " CLUSTER");
+
+ if (strcmp(PQgetvalue(result, i, 4), "t") != 0)
+ appendPQExpBufferStr(&buf, " INVALID");
+
+ if (strcmp(PQgetvalue(result, i, 10), "t") == 0)
+ appendPQExpBufferStr(&buf, " REPLICA IDENTITY");
+
+ printTableAddFooter(&cont, buf.data);
+
+ /* Print tablespace of the index on the same line */
+ add_tablespace_footer(&cont, RELKIND_INDEX,
+ atooid(PQgetvalue(result, i, 11)),
+ false);
+ }
+ }
+ PQclear(result);
+ }
+
+ /* print table (and column) check constraints */
+ if (tableinfo.checks)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT r.conname, "
+ "pg_catalog.pg_get_constraintdef(r.oid, true)\n"
+ "FROM pg_catalog.pg_constraint r\n"
+ "WHERE r.conrelid = '%s' AND r.contype = 'c'\n"
+ "ORDER BY 1;",
+ oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ {
+ printTableAddFooter(&cont, _("Check constraints:"));
+ for (i = 0; i < tuples; i++)
+ {
+ /* untranslated constraint name and def */
+ printfPQExpBuffer(&buf, " \"%s\" %s",
+ PQgetvalue(result, i, 0),
+ PQgetvalue(result, i, 1));
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ PQclear(result);
+ }
+
+ /*
+ * Print foreign-key constraints (there are none if no triggers,
+ * except if the table is partitioned, in which case the triggers
+ * appear in the partitions)
+ */
+ if (tableinfo.hastriggers ||
+ tableinfo.relkind == RELKIND_PARTITIONED_TABLE)
+ {
+ if (pset.sversion >= 120000 &&
+ (tableinfo.ispartition || tableinfo.relkind == RELKIND_PARTITIONED_TABLE))
+ {
+ /*
+ * Put the constraints defined in this table first, followed
+ * by the constraints defined in ancestor partitioned tables.
+ */
+ printfPQExpBuffer(&buf,
+ "SELECT conrelid = '%s'::pg_catalog.regclass AS sametable,\n"
+ " conname,\n"
+ " pg_catalog.pg_get_constraintdef(oid, true) AS condef,\n"
+ " conrelid::pg_catalog.regclass AS ontable\n"
+ " FROM pg_catalog.pg_constraint,\n"
+ " pg_catalog.pg_partition_ancestors('%s')\n"
+ " WHERE conrelid = relid AND contype = 'f' AND conparentid = 0\n"
+ "ORDER BY sametable DESC, conname;",
+ oid, oid);
+ }
+ else
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT true as sametable, conname,\n"
+ " pg_catalog.pg_get_constraintdef(r.oid, true) as condef,\n"
+ " conrelid::pg_catalog.regclass AS ontable\n"
+ "FROM pg_catalog.pg_constraint r\n"
+ "WHERE r.conrelid = '%s' AND r.contype = 'f'\n",
+ oid);
+
+ if (pset.sversion >= 120000)
+ appendPQExpBufferStr(&buf, " AND conparentid = 0\n");
+ appendPQExpBufferStr(&buf, "ORDER BY conname");
+ }
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ {
+ int i_sametable = PQfnumber(result, "sametable"),
+ i_conname = PQfnumber(result, "conname"),
+ i_condef = PQfnumber(result, "condef"),
+ i_ontable = PQfnumber(result, "ontable");
+
+ printTableAddFooter(&cont, _("Foreign-key constraints:"));
+ for (i = 0; i < tuples; i++)
+ {
+ /*
+ * Print untranslated constraint name and definition. Use
+ * a "TABLE tab" prefix when the constraint is defined in
+ * a parent partitioned table.
+ */
+ if (strcmp(PQgetvalue(result, i, i_sametable), "f") == 0)
+ printfPQExpBuffer(&buf, " TABLE \"%s\" CONSTRAINT \"%s\" %s",
+ PQgetvalue(result, i, i_ontable),
+ PQgetvalue(result, i, i_conname),
+ PQgetvalue(result, i, i_condef));
+ else
+ printfPQExpBuffer(&buf, " \"%s\" %s",
+ PQgetvalue(result, i, i_conname),
+ PQgetvalue(result, i, i_condef));
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ PQclear(result);
+ }
+
+ /* print incoming foreign-key references */
+ if (tableinfo.hastriggers ||
+ tableinfo.relkind == RELKIND_PARTITIONED_TABLE)
+ {
+ if (pset.sversion >= 120000)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT conname, conrelid::pg_catalog.regclass AS ontable,\n"
+ " pg_catalog.pg_get_constraintdef(oid, true) AS condef\n"
+ " FROM pg_catalog.pg_constraint c\n"
+ " WHERE confrelid IN (SELECT pg_catalog.pg_partition_ancestors('%s')\n"
+ " UNION ALL VALUES ('%s'::pg_catalog.regclass))\n"
+ " AND contype = 'f' AND conparentid = 0\n"
+ "ORDER BY conname;",
+ oid, oid);
+ }
+ else
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT conname, conrelid::pg_catalog.regclass AS ontable,\n"
+ " pg_catalog.pg_get_constraintdef(oid, true) AS condef\n"
+ " FROM pg_catalog.pg_constraint\n"
+ " WHERE confrelid = %s AND contype = 'f'\n"
+ "ORDER BY conname;",
+ oid);
+ }
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ {
+ int i_conname = PQfnumber(result, "conname"),
+ i_ontable = PQfnumber(result, "ontable"),
+ i_condef = PQfnumber(result, "condef");
+
+ printTableAddFooter(&cont, _("Referenced by:"));
+ for (i = 0; i < tuples; i++)
+ {
+ printfPQExpBuffer(&buf, " TABLE \"%s\" CONSTRAINT \"%s\" %s",
+ PQgetvalue(result, i, i_ontable),
+ PQgetvalue(result, i, i_conname),
+ PQgetvalue(result, i, i_condef));
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ PQclear(result);
+ }
+
+ /* print any row-level policies */
+ if (pset.sversion >= 90500)
+ {
+ printfPQExpBuffer(&buf, "SELECT pol.polname,");
+ if (pset.sversion >= 100000)
+ appendPQExpBufferStr(&buf,
+ " pol.polpermissive,\n");
+ else
+ appendPQExpBufferStr(&buf,
+ " 't' as polpermissive,\n");
+ appendPQExpBuffer(&buf,
+ " CASE WHEN pol.polroles = '{0}' THEN NULL ELSE pg_catalog.array_to_string(array(select rolname from pg_catalog.pg_roles where oid = any (pol.polroles) order by 1),',') END,\n"
+ " pg_catalog.pg_get_expr(pol.polqual, pol.polrelid),\n"
+ " pg_catalog.pg_get_expr(pol.polwithcheck, pol.polrelid),\n"
+ " CASE pol.polcmd\n"
+ " WHEN 'r' THEN 'SELECT'\n"
+ " WHEN 'a' THEN 'INSERT'\n"
+ " WHEN 'w' THEN 'UPDATE'\n"
+ " WHEN 'd' THEN 'DELETE'\n"
+ " END AS cmd\n"
+ "FROM pg_catalog.pg_policy pol\n"
+ "WHERE pol.polrelid = '%s' ORDER BY 1;",
+ oid);
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ /*
+ * Handle cases where RLS is enabled and there are policies, or
+ * there aren't policies, or RLS isn't enabled but there are
+ * policies
+ */
+ if (tableinfo.rowsecurity && !tableinfo.forcerowsecurity && tuples > 0)
+ printTableAddFooter(&cont, _("Policies:"));
+
+ if (tableinfo.rowsecurity && tableinfo.forcerowsecurity && tuples > 0)
+ printTableAddFooter(&cont, _("Policies (forced row security enabled):"));
+
+ if (tableinfo.rowsecurity && !tableinfo.forcerowsecurity && tuples == 0)
+ printTableAddFooter(&cont, _("Policies (row security enabled): (none)"));
+
+ if (tableinfo.rowsecurity && tableinfo.forcerowsecurity && tuples == 0)
+ printTableAddFooter(&cont, _("Policies (forced row security enabled): (none)"));
+
+ if (!tableinfo.rowsecurity && tuples > 0)
+ printTableAddFooter(&cont, _("Policies (row security disabled):"));
+
+ /* Might be an empty set - that's ok */
+ for (i = 0; i < tuples; i++)
+ {
+ printfPQExpBuffer(&buf, " POLICY \"%s\"",
+ PQgetvalue(result, i, 0));
+
+ if (*(PQgetvalue(result, i, 1)) == 'f')
+ appendPQExpBufferStr(&buf, " AS RESTRICTIVE");
+
+ if (!PQgetisnull(result, i, 5))
+ appendPQExpBuffer(&buf, " FOR %s",
+ PQgetvalue(result, i, 5));
+
+ if (!PQgetisnull(result, i, 2))
+ {
+ appendPQExpBuffer(&buf, "\n TO %s",
+ PQgetvalue(result, i, 2));
+ }
+
+ if (!PQgetisnull(result, i, 3))
+ appendPQExpBuffer(&buf, "\n USING (%s)",
+ PQgetvalue(result, i, 3));
+
+ if (!PQgetisnull(result, i, 4))
+ appendPQExpBuffer(&buf, "\n WITH CHECK (%s)",
+ PQgetvalue(result, i, 4));
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ PQclear(result);
+ }
+
+ /* print any extended statistics */
+ if (pset.sversion >= 140000)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT oid, "
+ "stxrelid::pg_catalog.regclass, "
+ "stxnamespace::pg_catalog.regnamespace::pg_catalog.text AS nsp, "
+ "stxname,\n"
+ "pg_catalog.pg_get_statisticsobjdef_columns(oid) AS columns,\n"
+ " 'd' = any(stxkind) AS ndist_enabled,\n"
+ " 'f' = any(stxkind) AS deps_enabled,\n"
+ " 'm' = any(stxkind) AS mcv_enabled,\n"
+ "stxstattarget\n"
+ "FROM pg_catalog.pg_statistic_ext\n"
+ "WHERE stxrelid = '%s'\n"
+ "ORDER BY nsp, stxname;",
+ oid);
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ {
+ printTableAddFooter(&cont, _("Statistics objects:"));
+
+ for (i = 0; i < tuples; i++)
+ {
+ bool gotone = false;
+ bool has_ndistinct;
+ bool has_dependencies;
+ bool has_mcv;
+ bool has_all;
+ bool has_some;
+
+ has_ndistinct = (strcmp(PQgetvalue(result, i, 5), "t") == 0);
+ has_dependencies = (strcmp(PQgetvalue(result, i, 6), "t") == 0);
+ has_mcv = (strcmp(PQgetvalue(result, i, 7), "t") == 0);
+
+ printfPQExpBuffer(&buf, " ");
+
+ /* statistics object name (qualified with namespace) */
+ appendPQExpBuffer(&buf, "\"%s.%s\"",
+ PQgetvalue(result, i, 2),
+ PQgetvalue(result, i, 3));
+
+ /*
+ * When printing kinds we ignore expression statistics,
+ * which are used only internally and can't be specified
+ * by user. We don't print the kinds when none are
+ * specified (in which case it has to be statistics on a
+ * single expr) or when all are specified (in which case
+ * we assume it's expanded by CREATE STATISTICS).
+ */
+ has_all = (has_ndistinct && has_dependencies && has_mcv);
+ has_some = (has_ndistinct || has_dependencies || has_mcv);
+
+ if (has_some && !has_all)
+ {
+ appendPQExpBufferStr(&buf, " (");
+
+ /* options */
+ if (has_ndistinct)
+ {
+ appendPQExpBufferStr(&buf, "ndistinct");
+ gotone = true;
+ }
+
+ if (has_dependencies)
+ {
+ appendPQExpBuffer(&buf, "%sdependencies", gotone ? ", " : "");
+ gotone = true;
+ }
+
+ if (has_mcv)
+ {
+ appendPQExpBuffer(&buf, "%smcv", gotone ? ", " : "");
+ }
+
+ appendPQExpBufferChar(&buf, ')');
+ }
+
+ appendPQExpBuffer(&buf, " ON %s FROM %s",
+ PQgetvalue(result, i, 4),
+ PQgetvalue(result, i, 1));
+
+ /* Show the stats target if it's not default */
+ if (strcmp(PQgetvalue(result, i, 8), "-1") != 0)
+ appendPQExpBuffer(&buf, "; STATISTICS %s",
+ PQgetvalue(result, i, 8));
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ PQclear(result);
+ }
+ else if (pset.sversion >= 100000)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT oid, "
+ "stxrelid::pg_catalog.regclass, "
+ "stxnamespace::pg_catalog.regnamespace AS nsp, "
+ "stxname,\n"
+ " (SELECT pg_catalog.string_agg(pg_catalog.quote_ident(attname),', ')\n"
+ " FROM pg_catalog.unnest(stxkeys) s(attnum)\n"
+ " JOIN pg_catalog.pg_attribute a ON (stxrelid = a.attrelid AND\n"
+ " a.attnum = s.attnum AND NOT attisdropped)) AS columns,\n"
+ " 'd' = any(stxkind) AS ndist_enabled,\n"
+ " 'f' = any(stxkind) AS deps_enabled,\n"
+ " 'm' = any(stxkind) AS mcv_enabled,\n");
+
+ if (pset.sversion >= 130000)
+ appendPQExpBufferStr(&buf, " stxstattarget\n");
+ else
+ appendPQExpBufferStr(&buf, " -1 AS stxstattarget\n");
+ appendPQExpBuffer(&buf, "FROM pg_catalog.pg_statistic_ext\n"
+ "WHERE stxrelid = '%s'\n"
+ "ORDER BY 1;",
+ oid);
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ {
+ printTableAddFooter(&cont, _("Statistics objects:"));
+
+ for (i = 0; i < tuples; i++)
+ {
+ bool gotone = false;
+
+ printfPQExpBuffer(&buf, " ");
+
+ /* statistics object name (qualified with namespace) */
+ appendPQExpBuffer(&buf, "\"%s.%s\" (",
+ PQgetvalue(result, i, 2),
+ PQgetvalue(result, i, 3));
+
+ /* options */
+ if (strcmp(PQgetvalue(result, i, 5), "t") == 0)
+ {
+ appendPQExpBufferStr(&buf, "ndistinct");
+ gotone = true;
+ }
+
+ if (strcmp(PQgetvalue(result, i, 6), "t") == 0)
+ {
+ appendPQExpBuffer(&buf, "%sdependencies", gotone ? ", " : "");
+ gotone = true;
+ }
+
+ if (strcmp(PQgetvalue(result, i, 7), "t") == 0)
+ {
+ appendPQExpBuffer(&buf, "%smcv", gotone ? ", " : "");
+ }
+
+ appendPQExpBuffer(&buf, ") ON %s FROM %s",
+ PQgetvalue(result, i, 4),
+ PQgetvalue(result, i, 1));
+
+ /* Show the stats target if it's not default */
+ if (strcmp(PQgetvalue(result, i, 8), "-1") != 0)
+ appendPQExpBuffer(&buf, "; STATISTICS %s",
+ PQgetvalue(result, i, 8));
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ PQclear(result);
+ }
+
+ /* print rules */
+ if (tableinfo.hasrules && tableinfo.relkind != RELKIND_MATVIEW)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT r.rulename, trim(trailing ';' from pg_catalog.pg_get_ruledef(r.oid, true)), "
+ "ev_enabled\n"
+ "FROM pg_catalog.pg_rewrite r\n"
+ "WHERE r.ev_class = '%s' ORDER BY 1;",
+ oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ {
+ bool have_heading;
+ int category;
+
+ for (category = 0; category < 4; category++)
+ {
+ have_heading = false;
+
+ for (i = 0; i < tuples; i++)
+ {
+ const char *ruledef;
+ bool list_rule = false;
+
+ switch (category)
+ {
+ case 0:
+ if (*PQgetvalue(result, i, 2) == 'O')
+ list_rule = true;
+ break;
+ case 1:
+ if (*PQgetvalue(result, i, 2) == 'D')
+ list_rule = true;
+ break;
+ case 2:
+ if (*PQgetvalue(result, i, 2) == 'A')
+ list_rule = true;
+ break;
+ case 3:
+ if (*PQgetvalue(result, i, 2) == 'R')
+ list_rule = true;
+ break;
+ }
+ if (!list_rule)
+ continue;
+
+ if (!have_heading)
+ {
+ switch (category)
+ {
+ case 0:
+ printfPQExpBuffer(&buf, _("Rules:"));
+ break;
+ case 1:
+ printfPQExpBuffer(&buf, _("Disabled rules:"));
+ break;
+ case 2:
+ printfPQExpBuffer(&buf, _("Rules firing always:"));
+ break;
+ case 3:
+ printfPQExpBuffer(&buf, _("Rules firing on replica only:"));
+ break;
+ }
+ printTableAddFooter(&cont, buf.data);
+ have_heading = true;
+ }
+
+ /* Everything after "CREATE RULE" is echoed verbatim */
+ ruledef = PQgetvalue(result, i, 1);
+ ruledef += 12;
+ printfPQExpBuffer(&buf, " %s", ruledef);
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ }
+ PQclear(result);
+ }
+
+ /* print any publications */
+ if (pset.sversion >= 100000)
+ {
+ if (pset.sversion >= 150000)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT pubname\n"
+ " , NULL\n"
+ " , NULL\n"
+ "FROM pg_catalog.pg_publication p\n"
+ " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n"
+ " JOIN pg_catalog.pg_class pc ON pc.relnamespace = pn.pnnspid\n"
+ "WHERE pc.oid ='%s' and pg_catalog.pg_relation_is_publishable('%s')\n"
+ "UNION\n"
+ "SELECT pubname\n"
+ " , pg_get_expr(pr.prqual, c.oid)\n"
+ " , (CASE WHEN pr.prattrs IS NOT NULL THEN\n"
+ " (SELECT string_agg(attname, ', ')\n"
+ " FROM pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s,\n"
+ " pg_catalog.pg_attribute\n"
+ " WHERE attrelid = pr.prrelid AND attnum = prattrs[s])\n"
+ " ELSE NULL END) "
+ "FROM pg_catalog.pg_publication p\n"
+ " JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n"
+ " JOIN pg_catalog.pg_class c ON c.oid = pr.prrelid\n"
+ "WHERE pr.prrelid = '%s'\n"
+ "UNION\n"
+ "SELECT pubname\n"
+ " , NULL\n"
+ " , NULL\n"
+ "FROM pg_catalog.pg_publication p\n"
+ "WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n"
+ "ORDER BY 1;",
+ oid, oid, oid, oid);
+ }
+ else
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT pubname\n"
+ " , NULL\n"
+ " , NULL\n"
+ "FROM pg_catalog.pg_publication p\n"
+ "JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n"
+ "WHERE pr.prrelid = '%s'\n"
+ "UNION ALL\n"
+ "SELECT pubname\n"
+ " , NULL\n"
+ " , NULL\n"
+ "FROM pg_catalog.pg_publication p\n"
+ "WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n"
+ "ORDER BY 1;",
+ oid, oid);
+ }
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ printTableAddFooter(&cont, _("Publications:"));
+
+ /* Might be an empty set - that's ok */
+ for (i = 0; i < tuples; i++)
+ {
+ printfPQExpBuffer(&buf, " \"%s\"",
+ PQgetvalue(result, i, 0));
+
+ /* column list (if any) */
+ if (!PQgetisnull(result, i, 2))
+ appendPQExpBuffer(&buf, " (%s)",
+ PQgetvalue(result, i, 2));
+
+ /* row filter (if any) */
+ if (!PQgetisnull(result, i, 1))
+ appendPQExpBuffer(&buf, " WHERE %s",
+ PQgetvalue(result, i, 1));
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ PQclear(result);
+ }
+ }
+
+ /* Get view_def if table is a view or materialized view */
+ if ((tableinfo.relkind == RELKIND_VIEW ||
+ tableinfo.relkind == RELKIND_MATVIEW) && verbose)
+ {
+ PGresult *result;
+
+ printfPQExpBuffer(&buf,
+ "SELECT pg_catalog.pg_get_viewdef('%s'::pg_catalog.oid, true);",
+ oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+
+ if (PQntuples(result) > 0)
+ view_def = pg_strdup(PQgetvalue(result, 0, 0));
+
+ PQclear(result);
+ }
+
+ if (view_def)
+ {
+ PGresult *result = NULL;
+
+ /* Footer information about a view */
+ printTableAddFooter(&cont, _("View definition:"));
+ printTableAddFooter(&cont, view_def);
+
+ /* print rules */
+ if (tableinfo.hasrules)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT r.rulename, trim(trailing ';' from pg_catalog.pg_get_ruledef(r.oid, true))\n"
+ "FROM pg_catalog.pg_rewrite r\n"
+ "WHERE r.ev_class = '%s' AND r.rulename != '_RETURN' ORDER BY 1;",
+ oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+
+ if (PQntuples(result) > 0)
+ {
+ printTableAddFooter(&cont, _("Rules:"));
+ for (i = 0; i < PQntuples(result); i++)
+ {
+ const char *ruledef;
+
+ /* Everything after "CREATE RULE" is echoed verbatim */
+ ruledef = PQgetvalue(result, i, 1);
+ ruledef += 12;
+
+ printfPQExpBuffer(&buf, " %s", ruledef);
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ PQclear(result);
+ }
+ }
+
+ /*
+ * Print triggers next, if any (but only user-defined triggers). This
+ * could apply to either a table or a view.
+ */
+ if (tableinfo.hastriggers)
+ {
+ PGresult *result;
+ int tuples;
+
+ printfPQExpBuffer(&buf,
+ "SELECT t.tgname, "
+ "pg_catalog.pg_get_triggerdef(t.oid, true), "
+ "t.tgenabled, t.tgisinternal,\n");
+
+ /*
+ * Detect whether each trigger is inherited, and if so, get the name
+ * of the topmost table it's inherited from. We have no easy way to
+ * do that pre-v13, for lack of the tgparentid column. Even with
+ * tgparentid, a straightforward search for the topmost parent would
+ * require a recursive CTE, which seems unduly expensive. We cheat a
+ * bit by assuming parent triggers will match by tgname; then, joining
+ * with pg_partition_ancestors() allows the planner to make use of
+ * pg_trigger_tgrelid_tgname_index if it wishes. We ensure we find
+ * the correct topmost parent by stopping at the first-in-partition-
+ * ancestry-order trigger that has tgparentid = 0. (There might be
+ * unrelated, non-inherited triggers with the same name further up the
+ * stack, so this is important.)
+ */
+ if (pset.sversion >= 130000)
+ appendPQExpBufferStr(&buf,
+ " CASE WHEN t.tgparentid != 0 THEN\n"
+ " (SELECT u.tgrelid::pg_catalog.regclass\n"
+ " FROM pg_catalog.pg_trigger AS u,\n"
+ " pg_catalog.pg_partition_ancestors(t.tgrelid) WITH ORDINALITY AS a(relid, depth)\n"
+ " WHERE u.tgname = t.tgname AND u.tgrelid = a.relid\n"
+ " AND u.tgparentid = 0\n"
+ " ORDER BY a.depth LIMIT 1)\n"
+ " END AS parent\n");
+ else
+ appendPQExpBufferStr(&buf, " NULL AS parent\n");
+
+ appendPQExpBuffer(&buf,
+ "FROM pg_catalog.pg_trigger t\n"
+ "WHERE t.tgrelid = '%s' AND ",
+ oid);
+
+ /*
+ * tgisinternal is set true for inherited triggers of partitions in
+ * servers between v11 and v14, though these must still be shown to
+ * the user. So we use another property that is true for such
+ * inherited triggers to avoid them being hidden, which is their
+ * dependence on another trigger.
+ */
+ if (pset.sversion >= 110000 && pset.sversion < 150000)
+ appendPQExpBufferStr(&buf, "(NOT t.tgisinternal OR (t.tgisinternal AND t.tgenabled = 'D') \n"
+ " OR EXISTS (SELECT 1 FROM pg_catalog.pg_depend WHERE objid = t.oid \n"
+ " AND refclassid = 'pg_catalog.pg_trigger'::pg_catalog.regclass))");
+ else
+ /* display/warn about disabled internal triggers */
+ appendPQExpBufferStr(&buf, "(NOT t.tgisinternal OR (t.tgisinternal AND t.tgenabled = 'D'))");
+ appendPQExpBufferStr(&buf, "\nORDER BY 1;");
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ {
+ bool have_heading;
+ int category;
+
+ /*
+ * split the output into 4 different categories. Enabled triggers,
+ * disabled triggers and the two special ALWAYS and REPLICA
+ * configurations.
+ */
+ for (category = 0; category <= 4; category++)
+ {
+ have_heading = false;
+ for (i = 0; i < tuples; i++)
+ {
+ bool list_trigger;
+ const char *tgdef;
+ const char *usingpos;
+ const char *tgenabled;
+ const char *tgisinternal;
+
+ /*
+ * Check if this trigger falls into the current category
+ */
+ tgenabled = PQgetvalue(result, i, 2);
+ tgisinternal = PQgetvalue(result, i, 3);
+ list_trigger = false;
+ switch (category)
+ {
+ case 0:
+ if (*tgenabled == 'O' || *tgenabled == 't')
+ list_trigger = true;
+ break;
+ case 1:
+ if ((*tgenabled == 'D' || *tgenabled == 'f') &&
+ *tgisinternal == 'f')
+ list_trigger = true;
+ break;
+ case 2:
+ if ((*tgenabled == 'D' || *tgenabled == 'f') &&
+ *tgisinternal == 't')
+ list_trigger = true;
+ break;
+ case 3:
+ if (*tgenabled == 'A')
+ list_trigger = true;
+ break;
+ case 4:
+ if (*tgenabled == 'R')
+ list_trigger = true;
+ break;
+ }
+ if (list_trigger == false)
+ continue;
+
+ /* Print the category heading once */
+ if (have_heading == false)
+ {
+ switch (category)
+ {
+ case 0:
+ printfPQExpBuffer(&buf, _("Triggers:"));
+ break;
+ case 1:
+ printfPQExpBuffer(&buf, _("Disabled user triggers:"));
+ break;
+ case 2:
+ printfPQExpBuffer(&buf, _("Disabled internal triggers:"));
+ break;
+ case 3:
+ printfPQExpBuffer(&buf, _("Triggers firing always:"));
+ break;
+ case 4:
+ printfPQExpBuffer(&buf, _("Triggers firing on replica only:"));
+ break;
+ }
+ printTableAddFooter(&cont, buf.data);
+ have_heading = true;
+ }
+
+ /* Everything after "TRIGGER" is echoed verbatim */
+ tgdef = PQgetvalue(result, i, 1);
+ usingpos = strstr(tgdef, " TRIGGER ");
+ if (usingpos)
+ tgdef = usingpos + 9;
+
+ printfPQExpBuffer(&buf, " %s", tgdef);
+
+ /* Visually distinguish inherited triggers */
+ if (!PQgetisnull(result, i, 4))
+ appendPQExpBuffer(&buf, ", ON TABLE %s",
+ PQgetvalue(result, i, 4));
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ }
+ PQclear(result);
+ }
+
+ /*
+ * Finish printing the footer information about a table.
+ */
+ if (tableinfo.relkind == RELKIND_RELATION ||
+ tableinfo.relkind == RELKIND_MATVIEW ||
+ tableinfo.relkind == RELKIND_FOREIGN_TABLE ||
+ tableinfo.relkind == RELKIND_PARTITIONED_TABLE ||
+ tableinfo.relkind == RELKIND_PARTITIONED_INDEX ||
+ tableinfo.relkind == RELKIND_TOASTVALUE)
+ {
+ bool is_partitioned;
+ PGresult *result;
+ int tuples;
+
+ /* simplify some repeated tests below */
+ is_partitioned = (tableinfo.relkind == RELKIND_PARTITIONED_TABLE ||
+ tableinfo.relkind == RELKIND_PARTITIONED_INDEX);
+
+ /* print foreign server name */
+ if (tableinfo.relkind == RELKIND_FOREIGN_TABLE)
+ {
+ char *ftoptions;
+
+ /* Footer information about foreign table */
+ printfPQExpBuffer(&buf,
+ "SELECT s.srvname,\n"
+ " pg_catalog.array_to_string(ARRAY(\n"
+ " SELECT pg_catalog.quote_ident(option_name)"
+ " || ' ' || pg_catalog.quote_literal(option_value)\n"
+ " FROM pg_catalog.pg_options_to_table(ftoptions)), ', ')\n"
+ "FROM pg_catalog.pg_foreign_table f,\n"
+ " pg_catalog.pg_foreign_server s\n"
+ "WHERE f.ftrelid = '%s' AND s.oid = f.ftserver;",
+ oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else if (PQntuples(result) != 1)
+ {
+ PQclear(result);
+ goto error_return;
+ }
+
+ /* Print server name */
+ printfPQExpBuffer(&buf, _("Server: %s"),
+ PQgetvalue(result, 0, 0));
+ printTableAddFooter(&cont, buf.data);
+
+ /* Print per-table FDW options, if any */
+ ftoptions = PQgetvalue(result, 0, 1);
+ if (ftoptions && ftoptions[0] != '\0')
+ {
+ printfPQExpBuffer(&buf, _("FDW options: (%s)"), ftoptions);
+ printTableAddFooter(&cont, buf.data);
+ }
+ PQclear(result);
+ }
+
+ /* print tables inherited from (exclude partitioned parents) */
+ printfPQExpBuffer(&buf,
+ "SELECT c.oid::pg_catalog.regclass\n"
+ "FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i\n"
+ "WHERE c.oid = i.inhparent AND i.inhrelid = '%s'\n"
+ " AND c.relkind != " CppAsString2(RELKIND_PARTITIONED_TABLE)
+ " AND c.relkind != " CppAsString2(RELKIND_PARTITIONED_INDEX)
+ "\nORDER BY inhseqno;",
+ oid);
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ {
+ const char *s = _("Inherits");
+ int sw = pg_wcswidth(s, strlen(s), pset.encoding);
+
+ tuples = PQntuples(result);
+
+ for (i = 0; i < tuples; i++)
+ {
+ if (i == 0)
+ printfPQExpBuffer(&buf, "%s: %s",
+ s, PQgetvalue(result, i, 0));
+ else
+ printfPQExpBuffer(&buf, "%*s %s",
+ sw, "", PQgetvalue(result, i, 0));
+ if (i < tuples - 1)
+ appendPQExpBufferChar(&buf, ',');
+
+ printTableAddFooter(&cont, buf.data);
+ }
+
+ PQclear(result);
+ }
+
+ /* print child tables (with additional info if partitions) */
+ if (pset.sversion >= 140000)
+ printfPQExpBuffer(&buf,
+ "SELECT c.oid::pg_catalog.regclass, c.relkind,"
+ " inhdetachpending,"
+ " pg_catalog.pg_get_expr(c.relpartbound, c.oid)\n"
+ "FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i\n"
+ "WHERE c.oid = i.inhrelid AND i.inhparent = '%s'\n"
+ "ORDER BY pg_catalog.pg_get_expr(c.relpartbound, c.oid) = 'DEFAULT',"
+ " c.oid::pg_catalog.regclass::pg_catalog.text;",
+ oid);
+ else if (pset.sversion >= 100000)
+ printfPQExpBuffer(&buf,
+ "SELECT c.oid::pg_catalog.regclass, c.relkind,"
+ " false AS inhdetachpending,"
+ " pg_catalog.pg_get_expr(c.relpartbound, c.oid)\n"
+ "FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i\n"
+ "WHERE c.oid = i.inhrelid AND i.inhparent = '%s'\n"
+ "ORDER BY pg_catalog.pg_get_expr(c.relpartbound, c.oid) = 'DEFAULT',"
+ " c.oid::pg_catalog.regclass::pg_catalog.text;",
+ oid);
+ else
+ printfPQExpBuffer(&buf,
+ "SELECT c.oid::pg_catalog.regclass, c.relkind,"
+ " false AS inhdetachpending, NULL\n"
+ "FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i\n"
+ "WHERE c.oid = i.inhrelid AND i.inhparent = '%s'\n"
+ "ORDER BY c.oid::pg_catalog.regclass::pg_catalog.text;",
+ oid);
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ tuples = PQntuples(result);
+
+ /*
+ * For a partitioned table with no partitions, always print the number
+ * of partitions as zero, even when verbose output is expected.
+ * Otherwise, we will not print "Partitions" section for a partitioned
+ * table without any partitions.
+ */
+ if (is_partitioned && tuples == 0)
+ {
+ printfPQExpBuffer(&buf, _("Number of partitions: %d"), tuples);
+ printTableAddFooter(&cont, buf.data);
+ }
+ else if (!verbose)
+ {
+ /* print the number of child tables, if any */
+ if (tuples > 0)
+ {
+ if (is_partitioned)
+ printfPQExpBuffer(&buf, _("Number of partitions: %d (Use \\d+ to list them.)"), tuples);
+ else
+ printfPQExpBuffer(&buf, _("Number of child tables: %d (Use \\d+ to list them.)"), tuples);
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ else
+ {
+ /* display the list of child tables */
+ const char *ct = is_partitioned ? _("Partitions") : _("Child tables");
+ int ctw = pg_wcswidth(ct, strlen(ct), pset.encoding);
+
+ for (i = 0; i < tuples; i++)
+ {
+ char child_relkind = *PQgetvalue(result, i, 1);
+
+ if (i == 0)
+ printfPQExpBuffer(&buf, "%s: %s",
+ ct, PQgetvalue(result, i, 0));
+ else
+ printfPQExpBuffer(&buf, "%*s %s",
+ ctw, "", PQgetvalue(result, i, 0));
+ if (!PQgetisnull(result, i, 3))
+ appendPQExpBuffer(&buf, " %s", PQgetvalue(result, i, 3));
+ if (child_relkind == RELKIND_PARTITIONED_TABLE ||
+ child_relkind == RELKIND_PARTITIONED_INDEX)
+ appendPQExpBufferStr(&buf, ", PARTITIONED");
+ if (strcmp(PQgetvalue(result, i, 2), "t") == 0)
+ appendPQExpBufferStr(&buf, " (DETACH PENDING)");
+ if (i < tuples - 1)
+ appendPQExpBufferChar(&buf, ',');
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ PQclear(result);
+
+ /* Table type */
+ if (tableinfo.reloftype)
+ {
+ printfPQExpBuffer(&buf, _("Typed table of type: %s"), tableinfo.reloftype);
+ printTableAddFooter(&cont, buf.data);
+ }
+
+ if (verbose &&
+ (tableinfo.relkind == RELKIND_RELATION ||
+ tableinfo.relkind == RELKIND_MATVIEW) &&
+
+ /*
+ * No need to display default values; we already display a REPLICA
+ * IDENTITY marker on indexes.
+ */
+ tableinfo.relreplident != 'i' &&
+ ((strcmp(schemaname, "pg_catalog") != 0 && tableinfo.relreplident != 'd') ||
+ (strcmp(schemaname, "pg_catalog") == 0 && tableinfo.relreplident != 'n')))
+ {
+ const char *s = _("Replica Identity");
+
+ printfPQExpBuffer(&buf, "%s: %s",
+ s,
+ tableinfo.relreplident == 'f' ? "FULL" :
+ tableinfo.relreplident == 'n' ? "NOTHING" :
+ "???");
+
+ printTableAddFooter(&cont, buf.data);
+ }
+
+ /* OIDs, if verbose and not a materialized view */
+ if (verbose && tableinfo.relkind != RELKIND_MATVIEW && tableinfo.hasoids)
+ printTableAddFooter(&cont, _("Has OIDs: yes"));
+
+ /* Tablespace info */
+ add_tablespace_footer(&cont, tableinfo.relkind, tableinfo.tablespace,
+ true);
+
+ /* Access method info */
+ if (verbose && tableinfo.relam != NULL && !pset.hide_tableam)
+ {
+ printfPQExpBuffer(&buf, _("Access method: %s"), tableinfo.relam);
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+
+ /* reloptions, if verbose */
+ if (verbose &&
+ tableinfo.reloptions && tableinfo.reloptions[0] != '\0')
+ {
+ const char *t = _("Options");
+
+ printfPQExpBuffer(&buf, "%s: %s", t, tableinfo.reloptions);
+ printTableAddFooter(&cont, buf.data);
+ }
+
+ printTable(&cont, pset.queryFout, false, pset.logfile);
+
+ retval = true;
+
+error_return:
+
+ /* clean up */
+ if (printTableInitialized)
+ printTableCleanup(&cont);
+ termPQExpBuffer(&buf);
+ termPQExpBuffer(&title);
+ termPQExpBuffer(&tmpbuf);
+
+ if (view_def)
+ free(view_def);
+
+ if (res)
+ PQclear(res);
+
+ return retval;
+}
+
+/*
+ * Add a tablespace description to a footer. If 'newline' is true, it is added
+ * in a new line; otherwise it's appended to the current value of the last
+ * footer.
+ */
+static void
+add_tablespace_footer(printTableContent *const cont, char relkind,
+ Oid tablespace, const bool newline)
+{
+ /* relkinds for which we support tablespaces */
+ if (relkind == RELKIND_RELATION ||
+ relkind == RELKIND_MATVIEW ||
+ relkind == RELKIND_INDEX ||
+ relkind == RELKIND_PARTITIONED_TABLE ||
+ relkind == RELKIND_PARTITIONED_INDEX ||
+ relkind == RELKIND_TOASTVALUE)
+ {
+ /*
+ * We ignore the database default tablespace so that users not using
+ * tablespaces don't need to know about them.
+ */
+ if (tablespace != 0)
+ {
+ PGresult *result = NULL;
+ PQExpBufferData buf;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT spcname FROM pg_catalog.pg_tablespace\n"
+ "WHERE oid = '%u';", tablespace);
+ result = PSQLexec(buf.data);
+ if (!result)
+ {
+ termPQExpBuffer(&buf);
+ return;
+ }
+ /* Should always be the case, but.... */
+ if (PQntuples(result) > 0)
+ {
+ if (newline)
+ {
+ /* Add the tablespace as a new footer */
+ printfPQExpBuffer(&buf, _("Tablespace: \"%s\""),
+ PQgetvalue(result, 0, 0));
+ printTableAddFooter(cont, buf.data);
+ }
+ else
+ {
+ /* Append the tablespace to the latest footer */
+ printfPQExpBuffer(&buf, "%s", cont->footer->data);
+
+ /*-------
+ translator: before this string there's an index description like
+ '"foo_pkey" PRIMARY KEY, btree (a)' */
+ appendPQExpBuffer(&buf, _(", tablespace \"%s\""),
+ PQgetvalue(result, 0, 0));
+ printTableSetFooter(cont, buf.data);
+ }
+ }
+ PQclear(result);
+ termPQExpBuffer(&buf);
+ }
+ }
+}
+
+/*
+ * \du or \dg
+ *
+ * Describes roles. Any schema portion of the pattern is ignored.
+ */
+bool
+describeRoles(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printTableContent cont;
+ printTableOpt myopt = pset.popt.topt;
+ int ncols = 3;
+ int nrows = 0;
+ int i;
+ int conns;
+ const char align = 'l';
+ char **attr;
+
+ myopt.default_footer = false;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT r.rolname, r.rolsuper, r.rolinherit,\n"
+ " r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,\n"
+ " r.rolconnlimit, r.rolvaliduntil,\n"
+ " ARRAY(SELECT b.rolname\n"
+ " FROM pg_catalog.pg_auth_members m\n"
+ " JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)\n"
+ " WHERE m.member = r.oid) as memberof");
+
+ if (verbose)
+ {
+ appendPQExpBufferStr(&buf, "\n, pg_catalog.shobj_description(r.oid, 'pg_authid') AS description");
+ ncols++;
+ }
+ appendPQExpBufferStr(&buf, "\n, r.rolreplication");
+
+ if (pset.sversion >= 90500)
+ {
+ appendPQExpBufferStr(&buf, "\n, r.rolbypassrls");
+ }
+
+ appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_roles r\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, "WHERE r.rolname !~ '^pg_'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "r.rolname", NULL, NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ if (!res)
+ return false;
+
+ nrows = PQntuples(res);
+ attr = pg_malloc0((nrows + 1) * sizeof(*attr));
+
+ printTableInit(&cont, &myopt, _("List of roles"), ncols, nrows);
+
+ printTableAddHeader(&cont, gettext_noop("Role name"), true, align);
+ printTableAddHeader(&cont, gettext_noop("Attributes"), true, align);
+ /* ignores implicit memberships from superuser & pg_database_owner */
+ printTableAddHeader(&cont, gettext_noop("Member of"), true, align);
+
+ if (verbose)
+ printTableAddHeader(&cont, gettext_noop("Description"), true, align);
+
+ for (i = 0; i < nrows; i++)
+ {
+ printTableAddCell(&cont, PQgetvalue(res, i, 0), false, false);
+
+ resetPQExpBuffer(&buf);
+ if (strcmp(PQgetvalue(res, i, 1), "t") == 0)
+ add_role_attribute(&buf, _("Superuser"));
+
+ if (strcmp(PQgetvalue(res, i, 2), "t") != 0)
+ add_role_attribute(&buf, _("No inheritance"));
+
+ if (strcmp(PQgetvalue(res, i, 3), "t") == 0)
+ add_role_attribute(&buf, _("Create role"));
+
+ if (strcmp(PQgetvalue(res, i, 4), "t") == 0)
+ add_role_attribute(&buf, _("Create DB"));
+
+ if (strcmp(PQgetvalue(res, i, 5), "t") != 0)
+ add_role_attribute(&buf, _("Cannot login"));
+
+ if (strcmp(PQgetvalue(res, i, (verbose ? 10 : 9)), "t") == 0)
+ add_role_attribute(&buf, _("Replication"));
+
+ if (pset.sversion >= 90500)
+ if (strcmp(PQgetvalue(res, i, (verbose ? 11 : 10)), "t") == 0)
+ add_role_attribute(&buf, _("Bypass RLS"));
+
+ conns = atoi(PQgetvalue(res, i, 6));
+ if (conns >= 0)
+ {
+ if (buf.len > 0)
+ appendPQExpBufferChar(&buf, '\n');
+
+ if (conns == 0)
+ appendPQExpBufferStr(&buf, _("No connections"));
+ else
+ appendPQExpBuffer(&buf, ngettext("%d connection",
+ "%d connections",
+ conns),
+ conns);
+ }
+
+ if (strcmp(PQgetvalue(res, i, 7), "") != 0)
+ {
+ if (buf.len > 0)
+ appendPQExpBufferChar(&buf, '\n');
+ appendPQExpBufferStr(&buf, _("Password valid until "));
+ appendPQExpBufferStr(&buf, PQgetvalue(res, i, 7));
+ }
+
+ attr[i] = pg_strdup(buf.data);
+
+ printTableAddCell(&cont, attr[i], false, false);
+
+ printTableAddCell(&cont, PQgetvalue(res, i, 8), false, false);
+
+ if (verbose)
+ printTableAddCell(&cont, PQgetvalue(res, i, 9), false, false);
+ }
+ termPQExpBuffer(&buf);
+
+ printTable(&cont, pset.queryFout, false, pset.logfile);
+ printTableCleanup(&cont);
+
+ for (i = 0; i < nrows; i++)
+ free(attr[i]);
+ free(attr);
+
+ PQclear(res);
+ return true;
+}
+
+static void
+add_role_attribute(PQExpBuffer buf, const char *const str)
+{
+ if (buf->len > 0)
+ appendPQExpBufferStr(buf, ", ");
+
+ appendPQExpBufferStr(buf, str);
+}
+
+/*
+ * \drds
+ */
+bool
+listDbRoleSettings(const char *pattern, const char *pattern2)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ bool havewhere;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf, "SELECT rolname AS \"%s\", datname AS \"%s\",\n"
+ "pg_catalog.array_to_string(setconfig, E'\\n') AS \"%s\"\n"
+ "FROM pg_catalog.pg_db_role_setting s\n"
+ "LEFT JOIN pg_catalog.pg_database d ON d.oid = setdatabase\n"
+ "LEFT JOIN pg_catalog.pg_roles r ON r.oid = setrole\n",
+ gettext_noop("Role"),
+ gettext_noop("Database"),
+ gettext_noop("Settings"));
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "r.rolname", NULL, NULL, &havewhere, 1))
+ goto error_return;
+ if (!validateSQLNamePattern(&buf, pattern2, havewhere, false,
+ NULL, "d.datname", NULL, NULL,
+ NULL, 1))
+ goto error_return;
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ /*
+ * Most functions in this file are content to print an empty table when
+ * there are no matching objects. We intentionally deviate from that
+ * here, but only in !quiet mode, because of the possibility that the user
+ * is confused about what the two pattern arguments mean.
+ */
+ if (PQntuples(res) == 0 && !pset.quiet)
+ {
+ if (pattern && pattern2)
+ pg_log_error("Did not find any settings for role \"%s\" and database \"%s\".",
+ pattern, pattern2);
+ else if (pattern)
+ pg_log_error("Did not find any settings for role \"%s\".",
+ pattern);
+ else
+ pg_log_error("Did not find any settings.");
+ }
+ else
+ {
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of settings");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+ }
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+
+/*
+ * listTables()
+ *
+ * handler for \dt, \di, etc.
+ *
+ * tabtypes is an array of characters, specifying what info is desired:
+ * t - tables
+ * i - indexes
+ * v - views
+ * m - materialized views
+ * s - sequences
+ * E - foreign table (Note: different from 'f', the relkind value)
+ * (any order of the above is fine)
+ */
+bool
+listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSystem)
+{
+ bool showTables = strchr(tabtypes, 't') != NULL;
+ bool showIndexes = strchr(tabtypes, 'i') != NULL;
+ bool showViews = strchr(tabtypes, 'v') != NULL;
+ bool showMatViews = strchr(tabtypes, 'm') != NULL;
+ bool showSeq = strchr(tabtypes, 's') != NULL;
+ bool showForeign = strchr(tabtypes, 'E') != NULL;
+
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ int cols_so_far;
+ bool translate_columns[] = {false, false, true, false, false, false, false, false, false};
+
+ /* If tabtypes is empty, we default to \dtvmsE (but see also command.c) */
+ if (!(showTables || showIndexes || showViews || showMatViews || showSeq || showForeign))
+ showTables = showViews = showMatViews = showSeq = showForeign = true;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname as \"%s\",\n"
+ " c.relname as \"%s\",\n"
+ " CASE c.relkind"
+ " WHEN " CppAsString2(RELKIND_RELATION) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_VIEW) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_MATVIEW) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_INDEX) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_SEQUENCE) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_TOASTVALUE) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_FOREIGN_TABLE) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_PARTITIONED_TABLE) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_PARTITIONED_INDEX) " THEN '%s'"
+ " END as \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(c.relowner) as \"%s\"",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("table"),
+ gettext_noop("view"),
+ gettext_noop("materialized view"),
+ gettext_noop("index"),
+ gettext_noop("sequence"),
+ gettext_noop("TOAST table"),
+ gettext_noop("foreign table"),
+ gettext_noop("partitioned table"),
+ gettext_noop("partitioned index"),
+ gettext_noop("Type"),
+ gettext_noop("Owner"));
+ cols_so_far = 4;
+
+ if (showIndexes)
+ {
+ appendPQExpBuffer(&buf,
+ ",\n c2.relname as \"%s\"",
+ gettext_noop("Table"));
+ cols_so_far++;
+ }
+
+ if (verbose)
+ {
+ /*
+ * Show whether a relation is permanent, temporary, or unlogged.
+ */
+ appendPQExpBuffer(&buf,
+ ",\n CASE c.relpersistence WHEN 'p' THEN '%s' WHEN 't' THEN '%s' WHEN 'u' THEN '%s' END as \"%s\"",
+ gettext_noop("permanent"),
+ gettext_noop("temporary"),
+ gettext_noop("unlogged"),
+ gettext_noop("Persistence"));
+ translate_columns[cols_so_far] = true;
+
+ /*
+ * We don't bother to count cols_so_far below here, as there's no need
+ * to; this might change with future additions to the output columns.
+ */
+
+ /*
+ * Access methods exist for tables, materialized views and indexes.
+ * This has been introduced in PostgreSQL 12 for tables.
+ */
+ if (pset.sversion >= 120000 && !pset.hide_tableam &&
+ (showTables || showMatViews || showIndexes))
+ appendPQExpBuffer(&buf,
+ ",\n am.amname as \"%s\"",
+ gettext_noop("Access method"));
+
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.pg_size_pretty(pg_catalog.pg_table_size(c.oid)) as \"%s\""
+ ",\n pg_catalog.obj_description(c.oid, 'pg_class') as \"%s\"",
+ gettext_noop("Size"),
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_class c"
+ "\n LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace");
+
+ if (pset.sversion >= 120000 && !pset.hide_tableam &&
+ (showTables || showMatViews || showIndexes))
+ appendPQExpBufferStr(&buf,
+ "\n LEFT JOIN pg_catalog.pg_am am ON am.oid = c.relam");
+
+ if (showIndexes)
+ appendPQExpBufferStr(&buf,
+ "\n LEFT JOIN pg_catalog.pg_index i ON i.indexrelid = c.oid"
+ "\n LEFT JOIN pg_catalog.pg_class c2 ON i.indrelid = c2.oid");
+
+ appendPQExpBufferStr(&buf, "\nWHERE c.relkind IN (");
+ if (showTables)
+ {
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_RELATION) ","
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ",");
+ /* with 'S' or a pattern, allow 't' to match TOAST tables too */
+ if (showSystem || pattern)
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_TOASTVALUE) ",");
+ }
+ if (showViews)
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_VIEW) ",");
+ if (showMatViews)
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_MATVIEW) ",");
+ if (showIndexes)
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_INDEX) ","
+ CppAsString2(RELKIND_PARTITIONED_INDEX) ",");
+ if (showSeq)
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_SEQUENCE) ",");
+ if (showSystem || pattern)
+ appendPQExpBufferStr(&buf, "'s',"); /* was RELKIND_SPECIAL */
+ if (showForeign)
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_FOREIGN_TABLE) ",");
+
+ appendPQExpBufferStr(&buf, "''"); /* dummy */
+ appendPQExpBufferStr(&buf, ")\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname !~ '^pg_toast'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "c.relname", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1,2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ /*
+ * Most functions in this file are content to print an empty table when
+ * there are no matching objects. We intentionally deviate from that
+ * here, but only in !quiet mode, for historical reasons.
+ */
+ if (PQntuples(res) == 0 && !pset.quiet)
+ {
+ if (pattern)
+ pg_log_error("Did not find any relation named \"%s\".",
+ pattern);
+ else
+ pg_log_error("Did not find any relations.");
+ }
+ else
+ {
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of relations");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+ }
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dP
+ * Takes an optional regexp to select particular relations
+ *
+ * As with \d, you can specify the kinds of relations you want:
+ *
+ * t for tables
+ * i for indexes
+ *
+ * And there's additional flags:
+ *
+ * n to list non-leaf partitioned tables
+ *
+ * and you can mix and match these in any order.
+ */
+bool
+listPartitionedTables(const char *reltypes, const char *pattern, bool verbose)
+{
+ bool showTables = strchr(reltypes, 't') != NULL;
+ bool showIndexes = strchr(reltypes, 'i') != NULL;
+ bool showNested = strchr(reltypes, 'n') != NULL;
+ PQExpBufferData buf;
+ PQExpBufferData title;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ bool translate_columns[] = {false, false, false, false, false, false, false, false, false};
+ const char *tabletitle;
+ bool mixed_output = false;
+
+ /*
+ * Note: Declarative table partitioning is only supported as of Pg 10.0.
+ */
+ if (pset.sversion < 100000)
+ {
+ char sverbuf[32];
+
+ pg_log_error("The server (version %s) does not support declarative table partitioning.",
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+ return true;
+ }
+
+ /* If no relation kind was selected, show them all */
+ if (!showTables && !showIndexes)
+ showTables = showIndexes = true;
+
+ if (showIndexes && !showTables)
+ tabletitle = _("List of partitioned indexes"); /* \dPi */
+ else if (showTables && !showIndexes)
+ tabletitle = _("List of partitioned tables"); /* \dPt */
+ else
+ {
+ /* show all kinds */
+ tabletitle = _("List of partitioned relations");
+ mixed_output = true;
+ }
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname as \"%s\",\n"
+ " c.relname as \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(c.relowner) as \"%s\"",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Owner"));
+
+ if (mixed_output)
+ {
+ appendPQExpBuffer(&buf,
+ ",\n CASE c.relkind"
+ " WHEN " CppAsString2(RELKIND_PARTITIONED_TABLE) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_PARTITIONED_INDEX) " THEN '%s'"
+ " END as \"%s\"",
+ gettext_noop("partitioned table"),
+ gettext_noop("partitioned index"),
+ gettext_noop("Type"));
+
+ translate_columns[3] = true;
+ }
+
+ if (showNested || pattern)
+ appendPQExpBuffer(&buf,
+ ",\n inh.inhparent::pg_catalog.regclass as \"%s\"",
+ gettext_noop("Parent name"));
+
+ if (showIndexes)
+ appendPQExpBuffer(&buf,
+ ",\n c2.oid::pg_catalog.regclass as \"%s\"",
+ gettext_noop("Table"));
+
+ if (verbose)
+ {
+ if (showNested)
+ {
+ appendPQExpBuffer(&buf,
+ ",\n s.dps as \"%s\"",
+ gettext_noop("Leaf partition size"));
+ appendPQExpBuffer(&buf,
+ ",\n s.tps as \"%s\"",
+ gettext_noop("Total size"));
+ }
+ else
+ /* Sizes of all partitions are considered in this case. */
+ appendPQExpBuffer(&buf,
+ ",\n s.tps as \"%s\"",
+ gettext_noop("Total size"));
+
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.obj_description(c.oid, 'pg_class') as \"%s\"",
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_class c"
+ "\n LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace");
+
+ if (showIndexes)
+ appendPQExpBufferStr(&buf,
+ "\n LEFT JOIN pg_catalog.pg_index i ON i.indexrelid = c.oid"
+ "\n LEFT JOIN pg_catalog.pg_class c2 ON i.indrelid = c2.oid");
+
+ if (showNested || pattern)
+ appendPQExpBufferStr(&buf,
+ "\n LEFT JOIN pg_catalog.pg_inherits inh ON c.oid = inh.inhrelid");
+
+ if (verbose)
+ {
+ if (pset.sversion < 120000)
+ {
+ appendPQExpBufferStr(&buf,
+ ",\n LATERAL (WITH RECURSIVE d\n"
+ " AS (SELECT inhrelid AS oid, 1 AS level\n"
+ " FROM pg_catalog.pg_inherits\n"
+ " WHERE inhparent = c.oid\n"
+ " UNION ALL\n"
+ " SELECT inhrelid, level + 1\n"
+ " FROM pg_catalog.pg_inherits i\n"
+ " JOIN d ON i.inhparent = d.oid)\n"
+ " SELECT pg_catalog.pg_size_pretty(sum(pg_catalog.pg_table_size("
+ "d.oid))) AS tps,\n"
+ " pg_catalog.pg_size_pretty(sum("
+ "\n CASE WHEN d.level = 1"
+ " THEN pg_catalog.pg_table_size(d.oid) ELSE 0 END)) AS dps\n"
+ " FROM d) s");
+ }
+ else
+ {
+ /* PostgreSQL 12 has pg_partition_tree function */
+ appendPQExpBufferStr(&buf,
+ ",\n LATERAL (SELECT pg_catalog.pg_size_pretty(sum("
+ "\n CASE WHEN ppt.isleaf AND ppt.level = 1"
+ "\n THEN pg_catalog.pg_table_size(ppt.relid)"
+ " ELSE 0 END)) AS dps"
+ ",\n pg_catalog.pg_size_pretty(sum("
+ "pg_catalog.pg_table_size(ppt.relid))) AS tps"
+ "\n FROM pg_catalog.pg_partition_tree(c.oid) ppt) s");
+ }
+ }
+
+ appendPQExpBufferStr(&buf, "\nWHERE c.relkind IN (");
+ if (showTables)
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_PARTITIONED_TABLE) ",");
+ if (showIndexes)
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_PARTITIONED_INDEX) ",");
+ appendPQExpBufferStr(&buf, "''"); /* dummy */
+ appendPQExpBufferStr(&buf, ")\n");
+
+ appendPQExpBufferStr(&buf, !showNested && !pattern ?
+ " AND NOT c.relispartition\n" : "");
+
+ if (!pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname !~ '^pg_toast'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "c.relname", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBuffer(&buf, "ORDER BY \"Schema\", %s%s\"Name\";",
+ mixed_output ? "\"Type\" DESC, " : "",
+ showNested || pattern ? "\"Parent name\" NULLS FIRST, " : "");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ initPQExpBuffer(&title);
+ appendPQExpBufferStr(&title, tabletitle);
+
+ myopt.nullPrint = NULL;
+ myopt.title = title.data;
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ termPQExpBuffer(&title);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dL
+ *
+ * Describes languages.
+ */
+bool
+listLanguages(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT l.lanname AS \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(l.lanowner) as \"%s\",\n"
+ " l.lanpltrusted AS \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Owner"),
+ gettext_noop("Trusted"));
+
+ if (verbose)
+ {
+ appendPQExpBuffer(&buf,
+ ",\n NOT l.lanispl AS \"%s\",\n"
+ " l.lanplcallfoid::pg_catalog.regprocedure AS \"%s\",\n"
+ " l.lanvalidator::pg_catalog.regprocedure AS \"%s\",\n "
+ "l.laninline::pg_catalog.regprocedure AS \"%s\",\n ",
+ gettext_noop("Internal language"),
+ gettext_noop("Call handler"),
+ gettext_noop("Validator"),
+ gettext_noop("Inline handler"));
+ printACLColumn(&buf, "l.lanacl");
+ }
+
+ appendPQExpBuffer(&buf,
+ ",\n d.description AS \"%s\""
+ "\nFROM pg_catalog.pg_language l\n"
+ "LEFT JOIN pg_catalog.pg_description d\n"
+ " ON d.classoid = l.tableoid AND d.objoid = l.oid\n"
+ " AND d.objsubid = 0\n",
+ gettext_noop("Description"));
+
+ if (pattern)
+ {
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "l.lanname", NULL, NULL,
+ NULL, 2))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+ }
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, "WHERE l.lanplcallfoid != 0\n");
+
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of languages");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+
+/*
+ * \dD
+ *
+ * Describes domains.
+ */
+bool
+listDomains(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname as \"%s\",\n"
+ " t.typname as \"%s\",\n"
+ " pg_catalog.format_type(t.typbasetype, t.typtypmod) as \"%s\",\n"
+ " (SELECT c.collname FROM pg_catalog.pg_collation c, pg_catalog.pg_type bt\n"
+ " WHERE c.oid = t.typcollation AND bt.oid = t.typbasetype AND t.typcollation <> bt.typcollation) as \"%s\",\n"
+ " CASE WHEN t.typnotnull THEN 'not null' END as \"%s\",\n"
+ " t.typdefault as \"%s\",\n"
+ " pg_catalog.array_to_string(ARRAY(\n"
+ " SELECT pg_catalog.pg_get_constraintdef(r.oid, true) FROM pg_catalog.pg_constraint r WHERE t.oid = r.contypid\n"
+ " ), ' ') as \"%s\"",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Type"),
+ gettext_noop("Collation"),
+ gettext_noop("Nullable"),
+ gettext_noop("Default"),
+ gettext_noop("Check"));
+
+ if (verbose)
+ {
+ appendPQExpBufferStr(&buf, ",\n ");
+ printACLColumn(&buf, "t.typacl");
+ appendPQExpBuffer(&buf,
+ ",\n d.description as \"%s\"",
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_type t\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n");
+
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_description d "
+ "ON d.classoid = t.tableoid AND d.objoid = t.oid "
+ "AND d.objsubid = 0\n");
+
+ appendPQExpBufferStr(&buf, "WHERE t.typtype = 'd'\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "t.typname", NULL,
+ "pg_catalog.pg_type_is_visible(t.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of domains");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dc
+ *
+ * Describes conversions.
+ */
+bool
+listConversions(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] =
+ {false, false, false, false, true, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname AS \"%s\",\n"
+ " c.conname AS \"%s\",\n"
+ " pg_catalog.pg_encoding_to_char(c.conforencoding) AS \"%s\",\n"
+ " pg_catalog.pg_encoding_to_char(c.contoencoding) AS \"%s\",\n"
+ " CASE WHEN c.condefault THEN '%s'\n"
+ " ELSE '%s' END AS \"%s\"",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Source"),
+ gettext_noop("Destination"),
+ gettext_noop("yes"), gettext_noop("no"),
+ gettext_noop("Default?"));
+
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\n d.description AS \"%s\"",
+ gettext_noop("Description"));
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_conversion c\n"
+ " JOIN pg_catalog.pg_namespace n "
+ "ON n.oid = c.connamespace\n");
+
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ "LEFT JOIN pg_catalog.pg_description d "
+ "ON d.classoid = c.tableoid\n"
+ " AND d.objoid = c.oid "
+ "AND d.objsubid = 0\n");
+
+ appendPQExpBufferStr(&buf, "WHERE true\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "c.conname", NULL,
+ "pg_catalog.pg_conversion_is_visible(c.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of conversions");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dconfig
+ *
+ * Describes configuration parameters.
+ */
+bool
+describeConfigurationParameters(const char *pattern, bool verbose,
+ bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT s.name AS \"%s\", "
+ "pg_catalog.current_setting(s.name) AS \"%s\"",
+ gettext_noop("Parameter"),
+ gettext_noop("Value"));
+
+ if (verbose)
+ {
+ appendPQExpBuffer(&buf,
+ ", s.vartype AS \"%s\", s.context AS \"%s\", ",
+ gettext_noop("Type"),
+ gettext_noop("Context"));
+ if (pset.sversion >= 150000)
+ printACLColumn(&buf, "p.paracl");
+ else
+ appendPQExpBuffer(&buf, "NULL AS \"%s\"",
+ gettext_noop("Access privileges"));
+ }
+
+ appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_settings s\n");
+
+ if (verbose && pset.sversion >= 150000)
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_parameter_acl p\n"
+ " ON pg_catalog.lower(s.name) = p.parname\n");
+
+ if (pattern)
+ processSQLNamePattern(pset.db, &buf, pattern,
+ false, false,
+ NULL, "pg_catalog.lower(s.name)", NULL,
+ NULL, NULL, NULL);
+ else
+ appendPQExpBufferStr(&buf, "WHERE s.source <> 'default' AND\n"
+ " s.setting IS DISTINCT FROM s.boot_val\n");
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ if (pattern)
+ myopt.title = _("List of configuration parameters");
+ else
+ myopt.title = _("List of non-default configuration parameters");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dy
+ *
+ * Describes Event Triggers.
+ */
+bool
+listEventTriggers(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] =
+ {false, false, false, true, false, false, false};
+
+ if (pset.sversion < 90300)
+ {
+ char sverbuf[32];
+
+ pg_log_error("The server (version %s) does not support event triggers.",
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+ return true;
+ }
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT evtname as \"%s\", "
+ "evtevent as \"%s\", "
+ "pg_catalog.pg_get_userbyid(e.evtowner) as \"%s\",\n"
+ " case evtenabled when 'O' then '%s'"
+ " when 'R' then '%s'"
+ " when 'A' then '%s'"
+ " when 'D' then '%s' end as \"%s\",\n"
+ " e.evtfoid::pg_catalog.regproc as \"%s\", "
+ "pg_catalog.array_to_string(array(select x"
+ " from pg_catalog.unnest(evttags) as t(x)), ', ') as \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Event"),
+ gettext_noop("Owner"),
+ gettext_noop("enabled"),
+ gettext_noop("replica"),
+ gettext_noop("always"),
+ gettext_noop("disabled"),
+ gettext_noop("Enabled"),
+ gettext_noop("Function"),
+ gettext_noop("Tags"));
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\npg_catalog.obj_description(e.oid, 'pg_event_trigger') as \"%s\"",
+ gettext_noop("Description"));
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_event_trigger e ");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "evtname", NULL, NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of event triggers");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dX
+ *
+ * Describes extended statistics.
+ */
+bool
+listExtendedStats(const char *pattern)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ if (pset.sversion < 100000)
+ {
+ char sverbuf[32];
+
+ pg_log_error("The server (version %s) does not support extended statistics.",
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+ return true;
+ }
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT \n"
+ "es.stxnamespace::pg_catalog.regnamespace::pg_catalog.text AS \"%s\", \n"
+ "es.stxname AS \"%s\", \n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"));
+
+ if (pset.sversion >= 140000)
+ appendPQExpBuffer(&buf,
+ "pg_catalog.format('%%s FROM %%s', \n"
+ " pg_catalog.pg_get_statisticsobjdef_columns(es.oid), \n"
+ " es.stxrelid::pg_catalog.regclass) AS \"%s\"",
+ gettext_noop("Definition"));
+ else
+ appendPQExpBuffer(&buf,
+ "pg_catalog.format('%%s FROM %%s', \n"
+ " (SELECT pg_catalog.string_agg(pg_catalog.quote_ident(a.attname),', ') \n"
+ " FROM pg_catalog.unnest(es.stxkeys) s(attnum) \n"
+ " JOIN pg_catalog.pg_attribute a \n"
+ " ON (es.stxrelid = a.attrelid \n"
+ " AND a.attnum = s.attnum \n"
+ " AND NOT a.attisdropped)), \n"
+ "es.stxrelid::pg_catalog.regclass) AS \"%s\"",
+ gettext_noop("Definition"));
+
+ appendPQExpBuffer(&buf,
+ ",\nCASE WHEN 'd' = any(es.stxkind) THEN 'defined' \n"
+ "END AS \"%s\", \n"
+ "CASE WHEN 'f' = any(es.stxkind) THEN 'defined' \n"
+ "END AS \"%s\"",
+ gettext_noop("Ndistinct"),
+ gettext_noop("Dependencies"));
+
+ /*
+ * Include the MCV statistics kind.
+ */
+ if (pset.sversion >= 120000)
+ {
+ appendPQExpBuffer(&buf,
+ ",\nCASE WHEN 'm' = any(es.stxkind) THEN 'defined' \n"
+ "END AS \"%s\" ",
+ gettext_noop("MCV"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ " \nFROM pg_catalog.pg_statistic_ext es \n");
+
+ if (!validateSQLNamePattern(&buf, pattern,
+ false, false,
+ "es.stxnamespace::pg_catalog.regnamespace::pg_catalog.text", "es.stxname",
+ NULL, "pg_catalog.pg_statistics_obj_is_visible(es.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of extended statistics");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dC
+ *
+ * Describes casts.
+ */
+bool
+listCasts(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, false, false, true, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT pg_catalog.format_type(castsource, NULL) AS \"%s\",\n"
+ " pg_catalog.format_type(casttarget, NULL) AS \"%s\",\n",
+ gettext_noop("Source type"),
+ gettext_noop("Target type"));
+
+ /*
+ * We don't attempt to localize '(binary coercible)' or '(with inout)',
+ * because there's too much risk of gettext translating a function name
+ * that happens to match some string in the PO database.
+ */
+ appendPQExpBuffer(&buf,
+ " CASE WHEN c.castmethod = '%c' THEN '(binary coercible)'\n"
+ " WHEN c.castmethod = '%c' THEN '(with inout)'\n"
+ " ELSE p.proname\n"
+ " END AS \"%s\",\n",
+ COERCION_METHOD_BINARY,
+ COERCION_METHOD_INOUT,
+ gettext_noop("Function"));
+
+ appendPQExpBuffer(&buf,
+ " CASE WHEN c.castcontext = '%c' THEN '%s'\n"
+ " WHEN c.castcontext = '%c' THEN '%s'\n"
+ " ELSE '%s'\n"
+ " END AS \"%s\"",
+ COERCION_CODE_EXPLICIT,
+ gettext_noop("no"),
+ COERCION_CODE_ASSIGNMENT,
+ gettext_noop("in assignment"),
+ gettext_noop("yes"),
+ gettext_noop("Implicit?"));
+
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\n d.description AS \"%s\"",
+ gettext_noop("Description"));
+
+ /*
+ * We need a left join to pg_proc for binary casts; the others are just
+ * paranoia.
+ */
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_cast c LEFT JOIN pg_catalog.pg_proc p\n"
+ " ON c.castfunc = p.oid\n"
+ " LEFT JOIN pg_catalog.pg_type ts\n"
+ " ON c.castsource = ts.oid\n"
+ " LEFT JOIN pg_catalog.pg_namespace ns\n"
+ " ON ns.oid = ts.typnamespace\n"
+ " LEFT JOIN pg_catalog.pg_type tt\n"
+ " ON c.casttarget = tt.oid\n"
+ " LEFT JOIN pg_catalog.pg_namespace nt\n"
+ " ON nt.oid = tt.typnamespace\n");
+
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_description d\n"
+ " ON d.classoid = c.tableoid AND d.objoid = "
+ "c.oid AND d.objsubid = 0\n");
+
+ appendPQExpBufferStr(&buf, "WHERE ( (true");
+
+ /*
+ * Match name pattern against either internal or external name of either
+ * castsource or casttarget
+ */
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "ns.nspname", "ts.typname",
+ "pg_catalog.format_type(ts.oid, NULL)",
+ "pg_catalog.pg_type_is_visible(ts.oid)",
+ NULL, 3))
+ goto error_return;
+
+ appendPQExpBufferStr(&buf, ") OR (true");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "nt.nspname", "tt.typname",
+ "pg_catalog.format_type(tt.oid, NULL)",
+ "pg_catalog.pg_type_is_visible(tt.oid)",
+ NULL, 3))
+ goto error_return;
+
+ appendPQExpBufferStr(&buf, ") )\nORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of casts");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+/*
+ * \dO
+ *
+ * Describes collations.
+ */
+bool
+listCollations(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, false, false, false, false, false, true, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname AS \"%s\",\n"
+ " c.collname AS \"%s\",\n"
+ " c.collcollate AS \"%s\",\n"
+ " c.collctype AS \"%s\"",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Collate"),
+ gettext_noop("Ctype"));
+
+ if (pset.sversion >= 150000)
+ appendPQExpBuffer(&buf,
+ ",\n c.colliculocale AS \"%s\"",
+ gettext_noop("ICU Locale"));
+ else
+ appendPQExpBuffer(&buf,
+ ",\n c.collcollate AS \"%s\"",
+ gettext_noop("ICU Locale"));
+
+ if (pset.sversion >= 100000)
+ appendPQExpBuffer(&buf,
+ ",\n CASE c.collprovider WHEN 'd' THEN 'default' WHEN 'c' THEN 'libc' WHEN 'i' THEN 'icu' END AS \"%s\"",
+ gettext_noop("Provider"));
+ else
+ appendPQExpBuffer(&buf,
+ ",\n 'libc' AS \"%s\"",
+ gettext_noop("Provider"));
+
+ if (pset.sversion >= 120000)
+ appendPQExpBuffer(&buf,
+ ",\n CASE WHEN c.collisdeterministic THEN '%s' ELSE '%s' END AS \"%s\"",
+ gettext_noop("yes"), gettext_noop("no"),
+ gettext_noop("Deterministic?"));
+ else
+ appendPQExpBuffer(&buf,
+ ",\n '%s' AS \"%s\"",
+ gettext_noop("yes"),
+ gettext_noop("Deterministic?"));
+
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.obj_description(c.oid, 'pg_collation') AS \"%s\"",
+ gettext_noop("Description"));
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_collation c, pg_catalog.pg_namespace n\n"
+ "WHERE n.oid = c.collnamespace\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ /*
+ * Hide collations that aren't usable in the current database's encoding.
+ * If you think to change this, note that pg_collation_is_visible rejects
+ * unusable collations, so you will need to hack name pattern processing
+ * somehow to avoid inconsistent behavior.
+ */
+ appendPQExpBufferStr(&buf, " AND c.collencoding IN (-1, pg_catalog.pg_char_to_encoding(pg_catalog.getdatabaseencoding()))\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "c.collname", NULL,
+ "pg_catalog.pg_collation_is_visible(c.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of collations");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dn
+ *
+ * Describes schemas (namespaces)
+ */
+bool
+listSchemas(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ int pub_schema_tuples = 0;
+ char **footers = NULL;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname AS \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(n.nspowner) AS \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Owner"));
+
+ if (verbose)
+ {
+ appendPQExpBufferStr(&buf, ",\n ");
+ printACLColumn(&buf, "n.nspacl");
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.obj_description(n.oid, 'pg_namespace') AS \"%s\"",
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_namespace n\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf,
+ "WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern,
+ !showSystem && !pattern, false,
+ NULL, "n.nspname", NULL,
+ NULL,
+ NULL, 2))
+ goto error_return;
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ if (!res)
+ goto error_return;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of schemas");
+ myopt.translate_header = true;
+
+ if (pattern && pset.sversion >= 150000)
+ {
+ PGresult *result;
+ int i;
+
+ printfPQExpBuffer(&buf,
+ "SELECT pubname \n"
+ "FROM pg_catalog.pg_publication p\n"
+ " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n"
+ " JOIN pg_catalog.pg_namespace n ON n.oid = pn.pnnspid \n"
+ "WHERE n.nspname = '%s'\n"
+ "ORDER BY 1",
+ pattern);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ pub_schema_tuples = PQntuples(result);
+
+ if (pub_schema_tuples > 0)
+ {
+ /*
+ * Allocate memory for footers. Size of footers will be 1 (for
+ * storing "Publications:" string) + publication schema mapping
+ * count + 1 (for storing NULL).
+ */
+ footers = (char **) pg_malloc((1 + pub_schema_tuples + 1) * sizeof(char *));
+ footers[0] = pg_strdup(_("Publications:"));
+
+ /* Might be an empty set - that's ok */
+ for (i = 0; i < pub_schema_tuples; i++)
+ {
+ printfPQExpBuffer(&buf, " \"%s\"",
+ PQgetvalue(result, i, 0));
+
+ footers[i + 1] = pg_strdup(buf.data);
+ }
+
+ footers[i + 1] = NULL;
+ myopt.footers = footers;
+ }
+
+ PQclear(result);
+ }
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ termPQExpBuffer(&buf);
+ PQclear(res);
+
+ /* Free the memory allocated for the footer */
+ if (footers)
+ {
+ char **footer = NULL;
+
+ for (footer = footers; *footer; footer++)
+ pg_free(*footer);
+
+ pg_free(footers);
+ }
+
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+
+/*
+ * \dFp
+ * list text search parsers
+ */
+bool
+listTSParsers(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ if (verbose)
+ return listTSParsersVerbose(pattern);
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " n.nspname as \"%s\",\n"
+ " p.prsname as \"%s\",\n"
+ " pg_catalog.obj_description(p.oid, 'pg_ts_parser') as \"%s\"\n"
+ "FROM pg_catalog.pg_ts_parser p\n"
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.prsnamespace\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Description")
+ );
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ "n.nspname", "p.prsname", NULL,
+ "pg_catalog.pg_ts_parser_is_visible(p.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of text search parsers");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * full description of parsers
+ */
+static bool
+listTSParsersVerbose(const char *pattern)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ int i;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT p.oid,\n"
+ " n.nspname,\n"
+ " p.prsname\n"
+ "FROM pg_catalog.pg_ts_parser p\n"
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.prsnamespace\n"
+ );
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ "n.nspname", "p.prsname", NULL,
+ "pg_catalog.pg_ts_parser_is_visible(p.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ if (PQntuples(res) == 0)
+ {
+ if (!pset.quiet)
+ {
+ if (pattern)
+ pg_log_error("Did not find any text search parser named \"%s\".",
+ pattern);
+ else
+ pg_log_error("Did not find any text search parsers.");
+ }
+ PQclear(res);
+ return false;
+ }
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ const char *oid;
+ const char *nspname = NULL;
+ const char *prsname;
+
+ oid = PQgetvalue(res, i, 0);
+ if (!PQgetisnull(res, i, 1))
+ nspname = PQgetvalue(res, i, 1);
+ prsname = PQgetvalue(res, i, 2);
+
+ if (!describeOneTSParser(oid, nspname, prsname))
+ {
+ PQclear(res);
+ return false;
+ }
+
+ if (cancel_pressed)
+ {
+ PQclear(res);
+ return false;
+ }
+ }
+
+ PQclear(res);
+ return true;
+}
+
+static bool
+describeOneTSParser(const char *oid, const char *nspname, const char *prsname)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ PQExpBufferData title;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {true, false, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT '%s' AS \"%s\",\n"
+ " p.prsstart::pg_catalog.regproc AS \"%s\",\n"
+ " pg_catalog.obj_description(p.prsstart, 'pg_proc') as \"%s\"\n"
+ " FROM pg_catalog.pg_ts_parser p\n"
+ " WHERE p.oid = '%s'\n"
+ "UNION ALL\n"
+ "SELECT '%s',\n"
+ " p.prstoken::pg_catalog.regproc,\n"
+ " pg_catalog.obj_description(p.prstoken, 'pg_proc')\n"
+ " FROM pg_catalog.pg_ts_parser p\n"
+ " WHERE p.oid = '%s'\n"
+ "UNION ALL\n"
+ "SELECT '%s',\n"
+ " p.prsend::pg_catalog.regproc,\n"
+ " pg_catalog.obj_description(p.prsend, 'pg_proc')\n"
+ " FROM pg_catalog.pg_ts_parser p\n"
+ " WHERE p.oid = '%s'\n"
+ "UNION ALL\n"
+ "SELECT '%s',\n"
+ " p.prsheadline::pg_catalog.regproc,\n"
+ " pg_catalog.obj_description(p.prsheadline, 'pg_proc')\n"
+ " FROM pg_catalog.pg_ts_parser p\n"
+ " WHERE p.oid = '%s'\n"
+ "UNION ALL\n"
+ "SELECT '%s',\n"
+ " p.prslextype::pg_catalog.regproc,\n"
+ " pg_catalog.obj_description(p.prslextype, 'pg_proc')\n"
+ " FROM pg_catalog.pg_ts_parser p\n"
+ " WHERE p.oid = '%s';",
+ gettext_noop("Start parse"),
+ gettext_noop("Method"),
+ gettext_noop("Function"),
+ gettext_noop("Description"),
+ oid,
+ gettext_noop("Get next token"),
+ oid,
+ gettext_noop("End parse"),
+ oid,
+ gettext_noop("Get headline"),
+ oid,
+ gettext_noop("Get token types"),
+ oid);
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ initPQExpBuffer(&title);
+ if (nspname)
+ printfPQExpBuffer(&title, _("Text search parser \"%s.%s\""),
+ nspname, prsname);
+ else
+ printfPQExpBuffer(&title, _("Text search parser \"%s\""), prsname);
+ myopt.title = title.data;
+ myopt.footers = NULL;
+ myopt.topt.default_footer = false;
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT t.alias as \"%s\",\n"
+ " t.description as \"%s\"\n"
+ "FROM pg_catalog.ts_token_type( '%s'::pg_catalog.oid ) as t\n"
+ "ORDER BY 1;",
+ gettext_noop("Token name"),
+ gettext_noop("Description"),
+ oid);
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ {
+ termPQExpBuffer(&title);
+ return false;
+ }
+
+ myopt.nullPrint = NULL;
+ if (nspname)
+ printfPQExpBuffer(&title, _("Token types for parser \"%s.%s\""),
+ nspname, prsname);
+ else
+ printfPQExpBuffer(&title, _("Token types for parser \"%s\""), prsname);
+ myopt.title = title.data;
+ myopt.footers = NULL;
+ myopt.topt.default_footer = true;
+ myopt.translate_header = true;
+ myopt.translate_columns = NULL;
+ myopt.n_translate_columns = 0;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ termPQExpBuffer(&title);
+ PQclear(res);
+ return true;
+}
+
+
+/*
+ * \dFd
+ * list text search dictionaries
+ */
+bool
+listTSDictionaries(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " n.nspname as \"%s\",\n"
+ " d.dictname as \"%s\",\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"));
+
+ if (verbose)
+ {
+ appendPQExpBuffer(&buf,
+ " ( SELECT COALESCE(nt.nspname, '(null)')::pg_catalog.text || '.' || t.tmplname FROM\n"
+ " pg_catalog.pg_ts_template t\n"
+ " LEFT JOIN pg_catalog.pg_namespace nt ON nt.oid = t.tmplnamespace\n"
+ " WHERE d.dicttemplate = t.oid ) AS \"%s\",\n"
+ " d.dictinitoption as \"%s\",\n",
+ gettext_noop("Template"),
+ gettext_noop("Init options"));
+ }
+
+ appendPQExpBuffer(&buf,
+ " pg_catalog.obj_description(d.oid, 'pg_ts_dict') as \"%s\"\n",
+ gettext_noop("Description"));
+
+ appendPQExpBufferStr(&buf, "FROM pg_catalog.pg_ts_dict d\n"
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.dictnamespace\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ "n.nspname", "d.dictname", NULL,
+ "pg_catalog.pg_ts_dict_is_visible(d.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of text search dictionaries");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+
+/*
+ * \dFt
+ * list text search templates
+ */
+bool
+listTSTemplates(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ if (verbose)
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " n.nspname AS \"%s\",\n"
+ " t.tmplname AS \"%s\",\n"
+ " t.tmplinit::pg_catalog.regproc AS \"%s\",\n"
+ " t.tmpllexize::pg_catalog.regproc AS \"%s\",\n"
+ " pg_catalog.obj_description(t.oid, 'pg_ts_template') AS \"%s\"\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Init"),
+ gettext_noop("Lexize"),
+ gettext_noop("Description"));
+ else
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " n.nspname AS \"%s\",\n"
+ " t.tmplname AS \"%s\",\n"
+ " pg_catalog.obj_description(t.oid, 'pg_ts_template') AS \"%s\"\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Description"));
+
+ appendPQExpBufferStr(&buf, "FROM pg_catalog.pg_ts_template t\n"
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.tmplnamespace\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ "n.nspname", "t.tmplname", NULL,
+ "pg_catalog.pg_ts_template_is_visible(t.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of text search templates");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+
+/*
+ * \dF
+ * list text search configurations
+ */
+bool
+listTSConfigs(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ if (verbose)
+ return listTSConfigsVerbose(pattern);
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " n.nspname as \"%s\",\n"
+ " c.cfgname as \"%s\",\n"
+ " pg_catalog.obj_description(c.oid, 'pg_ts_config') as \"%s\"\n"
+ "FROM pg_catalog.pg_ts_config c\n"
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.cfgnamespace\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Description")
+ );
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ "n.nspname", "c.cfgname", NULL,
+ "pg_catalog.pg_ts_config_is_visible(c.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of text search configurations");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+static bool
+listTSConfigsVerbose(const char *pattern)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ int i;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT c.oid, c.cfgname,\n"
+ " n.nspname,\n"
+ " p.prsname,\n"
+ " np.nspname as pnspname\n"
+ "FROM pg_catalog.pg_ts_config c\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.cfgnamespace,\n"
+ " pg_catalog.pg_ts_parser p\n"
+ " LEFT JOIN pg_catalog.pg_namespace np ON np.oid = p.prsnamespace\n"
+ "WHERE p.oid = c.cfgparser\n"
+ );
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "c.cfgname", NULL,
+ "pg_catalog.pg_ts_config_is_visible(c.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 3, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ if (PQntuples(res) == 0)
+ {
+ if (!pset.quiet)
+ {
+ if (pattern)
+ pg_log_error("Did not find any text search configuration named \"%s\".",
+ pattern);
+ else
+ pg_log_error("Did not find any text search configurations.");
+ }
+ PQclear(res);
+ return false;
+ }
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ const char *oid;
+ const char *cfgname;
+ const char *nspname = NULL;
+ const char *prsname;
+ const char *pnspname = NULL;
+
+ oid = PQgetvalue(res, i, 0);
+ cfgname = PQgetvalue(res, i, 1);
+ if (!PQgetisnull(res, i, 2))
+ nspname = PQgetvalue(res, i, 2);
+ prsname = PQgetvalue(res, i, 3);
+ if (!PQgetisnull(res, i, 4))
+ pnspname = PQgetvalue(res, i, 4);
+
+ if (!describeOneTSConfig(oid, nspname, cfgname, pnspname, prsname))
+ {
+ PQclear(res);
+ return false;
+ }
+
+ if (cancel_pressed)
+ {
+ PQclear(res);
+ return false;
+ }
+ }
+
+ PQclear(res);
+ return true;
+}
+
+static bool
+describeOneTSConfig(const char *oid, const char *nspname, const char *cfgname,
+ const char *pnspname, const char *prsname)
+{
+ PQExpBufferData buf,
+ title;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " ( SELECT t.alias FROM\n"
+ " pg_catalog.ts_token_type(c.cfgparser) AS t\n"
+ " WHERE t.tokid = m.maptokentype ) AS \"%s\",\n"
+ " pg_catalog.btrim(\n"
+ " ARRAY( SELECT mm.mapdict::pg_catalog.regdictionary\n"
+ " FROM pg_catalog.pg_ts_config_map AS mm\n"
+ " WHERE mm.mapcfg = m.mapcfg AND mm.maptokentype = m.maptokentype\n"
+ " ORDER BY mapcfg, maptokentype, mapseqno\n"
+ " ) :: pg_catalog.text,\n"
+ " '{}') AS \"%s\"\n"
+ "FROM pg_catalog.pg_ts_config AS c, pg_catalog.pg_ts_config_map AS m\n"
+ "WHERE c.oid = '%s' AND m.mapcfg = c.oid\n"
+ "GROUP BY m.mapcfg, m.maptokentype, c.cfgparser\n"
+ "ORDER BY 1;",
+ gettext_noop("Token"),
+ gettext_noop("Dictionaries"),
+ oid);
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ initPQExpBuffer(&title);
+
+ if (nspname)
+ appendPQExpBuffer(&title, _("Text search configuration \"%s.%s\""),
+ nspname, cfgname);
+ else
+ appendPQExpBuffer(&title, _("Text search configuration \"%s\""),
+ cfgname);
+
+ if (pnspname)
+ appendPQExpBuffer(&title, _("\nParser: \"%s.%s\""),
+ pnspname, prsname);
+ else
+ appendPQExpBuffer(&title, _("\nParser: \"%s\""),
+ prsname);
+
+ myopt.nullPrint = NULL;
+ myopt.title = title.data;
+ myopt.footers = NULL;
+ myopt.topt.default_footer = false;
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ termPQExpBuffer(&title);
+
+ PQclear(res);
+ return true;
+}
+
+
+/*
+ * \dew
+ *
+ * Describes foreign-data wrappers
+ */
+bool
+listForeignDataWrappers(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT fdw.fdwname AS \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(fdw.fdwowner) AS \"%s\",\n"
+ " fdw.fdwhandler::pg_catalog.regproc AS \"%s\",\n"
+ " fdw.fdwvalidator::pg_catalog.regproc AS \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Owner"),
+ gettext_noop("Handler"),
+ gettext_noop("Validator"));
+
+ if (verbose)
+ {
+ appendPQExpBufferStr(&buf, ",\n ");
+ printACLColumn(&buf, "fdwacl");
+ appendPQExpBuffer(&buf,
+ ",\n CASE WHEN fdwoptions IS NULL THEN '' ELSE "
+ " '(' || pg_catalog.array_to_string(ARRAY(SELECT "
+ " pg_catalog.quote_ident(option_name) || ' ' || "
+ " pg_catalog.quote_literal(option_value) FROM "
+ " pg_catalog.pg_options_to_table(fdwoptions)), ', ') || ')' "
+ " END AS \"%s\""
+ ",\n d.description AS \"%s\" ",
+ gettext_noop("FDW options"),
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_foreign_data_wrapper fdw\n");
+
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ "LEFT JOIN pg_catalog.pg_description d\n"
+ " ON d.classoid = fdw.tableoid "
+ "AND d.objoid = fdw.oid AND d.objsubid = 0\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "fdwname", NULL, NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of foreign-data wrappers");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \des
+ *
+ * Describes foreign servers.
+ */
+bool
+listForeignServers(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT s.srvname AS \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(s.srvowner) AS \"%s\",\n"
+ " f.fdwname AS \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Owner"),
+ gettext_noop("Foreign-data wrapper"));
+
+ if (verbose)
+ {
+ appendPQExpBufferStr(&buf, ",\n ");
+ printACLColumn(&buf, "s.srvacl");
+ appendPQExpBuffer(&buf,
+ ",\n"
+ " s.srvtype AS \"%s\",\n"
+ " s.srvversion AS \"%s\",\n"
+ " CASE WHEN srvoptions IS NULL THEN '' ELSE "
+ " '(' || pg_catalog.array_to_string(ARRAY(SELECT "
+ " pg_catalog.quote_ident(option_name) || ' ' || "
+ " pg_catalog.quote_literal(option_value) FROM "
+ " pg_catalog.pg_options_to_table(srvoptions)), ', ') || ')' "
+ " END AS \"%s\",\n"
+ " d.description AS \"%s\"",
+ gettext_noop("Type"),
+ gettext_noop("Version"),
+ gettext_noop("FDW options"),
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_foreign_server s\n"
+ " JOIN pg_catalog.pg_foreign_data_wrapper f ON f.oid=s.srvfdw\n");
+
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ "LEFT JOIN pg_catalog.pg_description d\n "
+ "ON d.classoid = s.tableoid AND d.objoid = s.oid "
+ "AND d.objsubid = 0\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "s.srvname", NULL, NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of foreign servers");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \deu
+ *
+ * Describes user mappings.
+ */
+bool
+listUserMappings(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT um.srvname AS \"%s\",\n"
+ " um.usename AS \"%s\"",
+ gettext_noop("Server"),
+ gettext_noop("User name"));
+
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\n CASE WHEN umoptions IS NULL THEN '' ELSE "
+ " '(' || pg_catalog.array_to_string(ARRAY(SELECT "
+ " pg_catalog.quote_ident(option_name) || ' ' || "
+ " pg_catalog.quote_literal(option_value) FROM "
+ " pg_catalog.pg_options_to_table(umoptions)), ', ') || ')' "
+ " END AS \"%s\"",
+ gettext_noop("FDW options"));
+
+ appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_user_mappings um\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "um.srvname", "um.usename", NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of user mappings");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \det
+ *
+ * Describes foreign tables.
+ */
+bool
+listForeignTables(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname AS \"%s\",\n"
+ " c.relname AS \"%s\",\n"
+ " s.srvname AS \"%s\"",
+ gettext_noop("Schema"),
+ gettext_noop("Table"),
+ gettext_noop("Server"));
+
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\n CASE WHEN ftoptions IS NULL THEN '' ELSE "
+ " '(' || pg_catalog.array_to_string(ARRAY(SELECT "
+ " pg_catalog.quote_ident(option_name) || ' ' || "
+ " pg_catalog.quote_literal(option_value) FROM "
+ " pg_catalog.pg_options_to_table(ftoptions)), ', ') || ')' "
+ " END AS \"%s\",\n"
+ " d.description AS \"%s\"",
+ gettext_noop("FDW options"),
+ gettext_noop("Description"));
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_foreign_table ft\n"
+ " INNER JOIN pg_catalog.pg_class c"
+ " ON c.oid = ft.ftrelid\n"
+ " INNER JOIN pg_catalog.pg_namespace n"
+ " ON n.oid = c.relnamespace\n"
+ " INNER JOIN pg_catalog.pg_foreign_server s"
+ " ON s.oid = ft.ftserver\n");
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_description d\n"
+ " ON d.classoid = c.tableoid AND "
+ "d.objoid = c.oid AND d.objsubid = 0\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ "n.nspname", "c.relname", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of foreign tables");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dx
+ *
+ * Briefly describes installed extensions.
+ */
+bool
+listExtensions(const char *pattern)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT e.extname AS \"%s\", "
+ "e.extversion AS \"%s\", n.nspname AS \"%s\", c.description AS \"%s\"\n"
+ "FROM pg_catalog.pg_extension e "
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace "
+ "LEFT JOIN pg_catalog.pg_description c ON c.objoid = e.oid "
+ "AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass\n",
+ gettext_noop("Name"),
+ gettext_noop("Version"),
+ gettext_noop("Schema"),
+ gettext_noop("Description"));
+
+ if (!validateSQLNamePattern(&buf, pattern,
+ false, false,
+ NULL, "e.extname", NULL,
+ NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of installed extensions");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dx+
+ *
+ * List contents of installed extensions.
+ */
+bool
+listExtensionContents(const char *pattern)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ int i;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT e.extname, e.oid\n"
+ "FROM pg_catalog.pg_extension e\n");
+
+ if (!validateSQLNamePattern(&buf, pattern,
+ false, false,
+ NULL, "e.extname", NULL,
+ NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ if (PQntuples(res) == 0)
+ {
+ if (!pset.quiet)
+ {
+ if (pattern)
+ pg_log_error("Did not find any extension named \"%s\".",
+ pattern);
+ else
+ pg_log_error("Did not find any extensions.");
+ }
+ PQclear(res);
+ return false;
+ }
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ const char *extname;
+ const char *oid;
+
+ extname = PQgetvalue(res, i, 0);
+ oid = PQgetvalue(res, i, 1);
+
+ if (!listOneExtensionContents(extname, oid))
+ {
+ PQclear(res);
+ return false;
+ }
+ if (cancel_pressed)
+ {
+ PQclear(res);
+ return false;
+ }
+ }
+
+ PQclear(res);
+ return true;
+}
+
+static bool
+listOneExtensionContents(const char *extname, const char *oid)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ PQExpBufferData title;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT pg_catalog.pg_describe_object(classid, objid, 0) AS \"%s\"\n"
+ "FROM pg_catalog.pg_depend\n"
+ "WHERE refclassid = 'pg_catalog.pg_extension'::pg_catalog.regclass AND refobjid = '%s' AND deptype = 'e'\n"
+ "ORDER BY 1;",
+ gettext_noop("Object description"),
+ oid);
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ initPQExpBuffer(&title);
+ printfPQExpBuffer(&title, _("Objects in extension \"%s\""), extname);
+ myopt.title = title.data;
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ termPQExpBuffer(&title);
+ PQclear(res);
+ return true;
+}
+
+/*
+ * validateSQLNamePattern
+ *
+ * Wrapper around string_utils's processSQLNamePattern which also checks the
+ * pattern's validity. In addition to that function's parameters, takes a
+ * 'maxparts' parameter specifying the maximum number of dotted names the
+ * pattern is allowed to have, and a 'added_clause' parameter that returns by
+ * reference whether a clause was added to 'buf'. Returns whether the pattern
+ * passed validation, after logging any errors.
+ */
+static bool
+validateSQLNamePattern(PQExpBuffer buf, const char *pattern, bool have_where,
+ bool force_escape, const char *schemavar,
+ const char *namevar, const char *altnamevar,
+ const char *visibilityrule, bool *added_clause,
+ int maxparts)
+{
+ PQExpBufferData dbbuf;
+ int dotcnt;
+ bool added;
+
+ initPQExpBuffer(&dbbuf);
+ added = processSQLNamePattern(pset.db, buf, pattern, have_where, force_escape,
+ schemavar, namevar, altnamevar,
+ visibilityrule, &dbbuf, &dotcnt);
+ if (added_clause != NULL)
+ *added_clause = added;
+
+ if (dotcnt >= maxparts)
+ {
+ pg_log_error("improper qualified name (too many dotted names): %s",
+ pattern);
+ goto error_return;
+ }
+
+ if (maxparts > 1 && dotcnt == maxparts - 1)
+ {
+ if (PQdb(pset.db) == NULL)
+ {
+ pg_log_error("You are currently not connected to a database.");
+ goto error_return;
+ }
+ if (strcmp(PQdb(pset.db), dbbuf.data) != 0)
+ {
+ pg_log_error("cross-database references are not implemented: %s",
+ pattern);
+ goto error_return;
+ }
+ }
+ termPQExpBuffer(&dbbuf);
+ return true;
+
+error_return:
+ termPQExpBuffer(&dbbuf);
+ return false;
+}
+
+/*
+ * \dRp
+ * Lists publications.
+ *
+ * Takes an optional regexp to select particular publications
+ */
+bool
+listPublications(const char *pattern)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, false, false, false, false, false, false, false};
+
+ if (pset.sversion < 100000)
+ {
+ char sverbuf[32];
+
+ pg_log_error("The server (version %s) does not support publications.",
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+ return true;
+ }
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT pubname AS \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(pubowner) AS \"%s\",\n"
+ " puballtables AS \"%s\",\n"
+ " pubinsert AS \"%s\",\n"
+ " pubupdate AS \"%s\",\n"
+ " pubdelete AS \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Owner"),
+ gettext_noop("All tables"),
+ gettext_noop("Inserts"),
+ gettext_noop("Updates"),
+ gettext_noop("Deletes"));
+ if (pset.sversion >= 110000)
+ appendPQExpBuffer(&buf,
+ ",\n pubtruncate AS \"%s\"",
+ gettext_noop("Truncates"));
+ if (pset.sversion >= 130000)
+ appendPQExpBuffer(&buf,
+ ",\n pubviaroot AS \"%s\"",
+ gettext_noop("Via root"));
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_publication\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "pubname", NULL,
+ NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of publications");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+
+ return true;
+}
+
+/*
+ * Add footer to publication description.
+ */
+static bool
+addFooterToPublicationDesc(PQExpBuffer buf, const char *footermsg,
+ bool as_schema, printTableContent *const cont)
+{
+ PGresult *res;
+ int count = 0;
+ int i = 0;
+
+ res = PSQLexec(buf->data);
+ if (!res)
+ return false;
+ else
+ count = PQntuples(res);
+
+ if (count > 0)
+ printTableAddFooter(cont, footermsg);
+
+ for (i = 0; i < count; i++)
+ {
+ if (as_schema)
+ printfPQExpBuffer(buf, " \"%s\"", PQgetvalue(res, i, 0));
+ else
+ {
+ printfPQExpBuffer(buf, " \"%s.%s\"", PQgetvalue(res, i, 0),
+ PQgetvalue(res, i, 1));
+
+ if (!PQgetisnull(res, i, 3))
+ appendPQExpBuffer(buf, " (%s)", PQgetvalue(res, i, 3));
+
+ if (!PQgetisnull(res, i, 2))
+ appendPQExpBuffer(buf, " WHERE %s", PQgetvalue(res, i, 2));
+ }
+
+ printTableAddFooter(cont, buf->data);
+ }
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dRp+
+ * Describes publications including the contents.
+ *
+ * Takes an optional regexp to select particular publications
+ */
+bool
+describePublications(const char *pattern)
+{
+ PQExpBufferData buf;
+ int i;
+ PGresult *res;
+ bool has_pubtruncate;
+ bool has_pubviaroot;
+
+ PQExpBufferData title;
+ printTableContent cont;
+
+ if (pset.sversion < 100000)
+ {
+ char sverbuf[32];
+
+ pg_log_error("The server (version %s) does not support publications.",
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+ return true;
+ }
+
+ has_pubtruncate = (pset.sversion >= 110000);
+ has_pubviaroot = (pset.sversion >= 130000);
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT oid, pubname,\n"
+ " pg_catalog.pg_get_userbyid(pubowner) AS owner,\n"
+ " puballtables, pubinsert, pubupdate, pubdelete");
+ if (has_pubtruncate)
+ appendPQExpBufferStr(&buf,
+ ", pubtruncate");
+ if (has_pubviaroot)
+ appendPQExpBufferStr(&buf,
+ ", pubviaroot");
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_publication\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "pubname", NULL,
+ NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 2;");
+
+ res = PSQLexec(buf.data);
+ if (!res)
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ if (PQntuples(res) == 0)
+ {
+ if (!pset.quiet)
+ {
+ if (pattern)
+ pg_log_error("Did not find any publication named \"%s\".",
+ pattern);
+ else
+ pg_log_error("Did not find any publications.");
+ }
+
+ termPQExpBuffer(&buf);
+ PQclear(res);
+ return false;
+ }
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ const char align = 'l';
+ int ncols = 5;
+ int nrows = 1;
+ char *pubid = PQgetvalue(res, i, 0);
+ char *pubname = PQgetvalue(res, i, 1);
+ bool puballtables = strcmp(PQgetvalue(res, i, 3), "t") == 0;
+ printTableOpt myopt = pset.popt.topt;
+
+ if (has_pubtruncate)
+ ncols++;
+ if (has_pubviaroot)
+ ncols++;
+
+ initPQExpBuffer(&title);
+ printfPQExpBuffer(&title, _("Publication %s"), pubname);
+ printTableInit(&cont, &myopt, title.data, ncols, nrows);
+
+ printTableAddHeader(&cont, gettext_noop("Owner"), true, align);
+ printTableAddHeader(&cont, gettext_noop("All tables"), true, align);
+ printTableAddHeader(&cont, gettext_noop("Inserts"), true, align);
+ printTableAddHeader(&cont, gettext_noop("Updates"), true, align);
+ printTableAddHeader(&cont, gettext_noop("Deletes"), true, align);
+ if (has_pubtruncate)
+ printTableAddHeader(&cont, gettext_noop("Truncates"), true, align);
+ if (has_pubviaroot)
+ printTableAddHeader(&cont, gettext_noop("Via root"), true, align);
+
+ printTableAddCell(&cont, PQgetvalue(res, i, 2), false, false);
+ printTableAddCell(&cont, PQgetvalue(res, i, 3), false, false);
+ printTableAddCell(&cont, PQgetvalue(res, i, 4), false, false);
+ printTableAddCell(&cont, PQgetvalue(res, i, 5), false, false);
+ printTableAddCell(&cont, PQgetvalue(res, i, 6), false, false);
+ if (has_pubtruncate)
+ printTableAddCell(&cont, PQgetvalue(res, i, 7), false, false);
+ if (has_pubviaroot)
+ printTableAddCell(&cont, PQgetvalue(res, i, 8), false, false);
+
+ if (!puballtables)
+ {
+ /* Get the tables for the specified publication */
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname, c.relname");
+ if (pset.sversion >= 150000)
+ {
+ appendPQExpBufferStr(&buf,
+ ", pg_get_expr(pr.prqual, c.oid)");
+ appendPQExpBufferStr(&buf,
+ ", (CASE WHEN pr.prattrs IS NOT NULL THEN\n"
+ " pg_catalog.array_to_string("
+ " ARRAY(SELECT attname\n"
+ " FROM\n"
+ " pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s,\n"
+ " pg_catalog.pg_attribute\n"
+ " WHERE attrelid = c.oid AND attnum = prattrs[s]), ', ')\n"
+ " ELSE NULL END)");
+ }
+ else
+ appendPQExpBufferStr(&buf,
+ ", NULL, NULL");
+ appendPQExpBuffer(&buf,
+ "\nFROM pg_catalog.pg_class c,\n"
+ " pg_catalog.pg_namespace n,\n"
+ " pg_catalog.pg_publication_rel pr\n"
+ "WHERE c.relnamespace = n.oid\n"
+ " AND c.oid = pr.prrelid\n"
+ " AND pr.prpubid = '%s'\n"
+ "ORDER BY 1,2", pubid);
+ if (!addFooterToPublicationDesc(&buf, _("Tables:"), false, &cont))
+ goto error_return;
+
+ if (pset.sversion >= 150000)
+ {
+ /* Get the schemas for the specified publication */
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname\n"
+ "FROM pg_catalog.pg_namespace n\n"
+ " JOIN pg_catalog.pg_publication_namespace pn ON n.oid = pn.pnnspid\n"
+ "WHERE pn.pnpubid = '%s'\n"
+ "ORDER BY 1", pubid);
+ if (!addFooterToPublicationDesc(&buf, _("Tables from schemas:"),
+ true, &cont))
+ goto error_return;
+ }
+ }
+
+ printTable(&cont, pset.queryFout, false, pset.logfile);
+ printTableCleanup(&cont);
+
+ termPQExpBuffer(&title);
+ }
+
+ termPQExpBuffer(&buf);
+ PQclear(res);
+
+ return true;
+
+error_return:
+ printTableCleanup(&cont);
+ PQclear(res);
+ termPQExpBuffer(&buf);
+ termPQExpBuffer(&title);
+ return false;
+}
+
+/*
+ * \dRs
+ * Describes subscriptions.
+ *
+ * Takes an optional regexp to select particular subscriptions
+ */
+bool
+describeSubscriptions(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, false, false, false,
+ false, false, false, false, false, false, false};
+
+ if (pset.sversion < 100000)
+ {
+ char sverbuf[32];
+
+ pg_log_error("The server (version %s) does not support subscriptions.",
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+ return true;
+ }
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT subname AS \"%s\"\n"
+ ", pg_catalog.pg_get_userbyid(subowner) AS \"%s\"\n"
+ ", subenabled AS \"%s\"\n"
+ ", subpublications AS \"%s\"\n",
+ gettext_noop("Name"),
+ gettext_noop("Owner"),
+ gettext_noop("Enabled"),
+ gettext_noop("Publication"));
+
+ if (verbose)
+ {
+ /* Binary mode and streaming are only supported in v14 and higher */
+ if (pset.sversion >= 140000)
+ appendPQExpBuffer(&buf,
+ ", subbinary AS \"%s\"\n"
+ ", substream AS \"%s\"\n",
+ gettext_noop("Binary"),
+ gettext_noop("Streaming"));
+
+ /* Two_phase and disable_on_error are only supported in v15 and higher */
+ if (pset.sversion >= 150000)
+ appendPQExpBuffer(&buf,
+ ", subtwophasestate AS \"%s\"\n"
+ ", subdisableonerr AS \"%s\"\n",
+ gettext_noop("Two-phase commit"),
+ gettext_noop("Disable on error"));
+
+ appendPQExpBuffer(&buf,
+ ", subsynccommit AS \"%s\"\n"
+ ", subconninfo AS \"%s\"\n",
+ gettext_noop("Synchronous commit"),
+ gettext_noop("Conninfo"));
+
+ /* Skip LSN is only supported in v15 and higher */
+ if (pset.sversion >= 150000)
+ appendPQExpBuffer(&buf,
+ ", subskiplsn AS \"%s\"\n",
+ gettext_noop("Skip LSN"));
+ }
+
+ /* Only display subscriptions in current database. */
+ appendPQExpBufferStr(&buf,
+ "FROM pg_catalog.pg_subscription\n"
+ "WHERE subdbid = (SELECT oid\n"
+ " FROM pg_catalog.pg_database\n"
+ " WHERE datname = pg_catalog.current_database())");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ NULL, "subname", NULL,
+ NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of subscriptions");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * printACLColumn
+ *
+ * Helper function for consistently formatting ACL (privilege) columns.
+ * The proper targetlist entry is appended to buf. Note lack of any
+ * whitespace or comma decoration.
+ */
+static void
+printACLColumn(PQExpBuffer buf, const char *colname)
+{
+ appendPQExpBuffer(buf,
+ "pg_catalog.array_to_string(%s, E'\\n') AS \"%s\"",
+ colname, gettext_noop("Access privileges"));
+}
+
+/*
+ * \dAc
+ * Lists operator classes
+ *
+ * Takes optional regexps to filter by index access method and input data type.
+ */
+bool
+listOperatorClasses(const char *access_method_pattern,
+ const char *type_pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ bool have_where = false;
+ static const bool translate_columns[] = {false, false, false, false, false, false, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " am.amname AS \"%s\",\n"
+ " pg_catalog.format_type(c.opcintype, NULL) AS \"%s\",\n"
+ " CASE\n"
+ " WHEN c.opckeytype <> 0 AND c.opckeytype <> c.opcintype\n"
+ " THEN pg_catalog.format_type(c.opckeytype, NULL)\n"
+ " ELSE NULL\n"
+ " END AS \"%s\",\n"
+ " CASE\n"
+ " WHEN pg_catalog.pg_opclass_is_visible(c.oid)\n"
+ " THEN pg_catalog.format('%%I', c.opcname)\n"
+ " ELSE pg_catalog.format('%%I.%%I', n.nspname, c.opcname)\n"
+ " END AS \"%s\",\n"
+ " (CASE WHEN c.opcdefault\n"
+ " THEN '%s'\n"
+ " ELSE '%s'\n"
+ " END) AS \"%s\"",
+ gettext_noop("AM"),
+ gettext_noop("Input type"),
+ gettext_noop("Storage type"),
+ gettext_noop("Operator class"),
+ gettext_noop("yes"),
+ gettext_noop("no"),
+ gettext_noop("Default?"));
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\n CASE\n"
+ " WHEN pg_catalog.pg_opfamily_is_visible(of.oid)\n"
+ " THEN pg_catalog.format('%%I', of.opfname)\n"
+ " ELSE pg_catalog.format('%%I.%%I', ofn.nspname, of.opfname)\n"
+ " END AS \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(c.opcowner) AS \"%s\"\n",
+ gettext_noop("Operator family"),
+ gettext_noop("Owner"));
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_opclass c\n"
+ " LEFT JOIN pg_catalog.pg_am am on am.oid = c.opcmethod\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.opcnamespace\n"
+ " LEFT JOIN pg_catalog.pg_type t ON t.oid = c.opcintype\n"
+ " LEFT JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace\n");
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_opfamily of ON of.oid = c.opcfamily\n"
+ " LEFT JOIN pg_catalog.pg_namespace ofn ON ofn.oid = of.opfnamespace\n");
+
+ if (access_method_pattern)
+ if (!validateSQLNamePattern(&buf, access_method_pattern,
+ false, false, NULL, "am.amname", NULL, NULL,
+ &have_where, 1))
+ goto error_return;
+ if (type_pattern)
+ {
+ /* Match type name pattern against either internal or external name */
+ if (!validateSQLNamePattern(&buf, type_pattern, have_where, false,
+ "tn.nspname", "t.typname",
+ "pg_catalog.format_type(t.oid, NULL)",
+ "pg_catalog.pg_type_is_visible(t.oid)",
+ NULL, 3))
+ goto error_return;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 4;");
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of operator classes");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+/*
+ * \dAf
+ * Lists operator families
+ *
+ * Takes optional regexps to filter by index access method and input data type.
+ */
+bool
+listOperatorFamilies(const char *access_method_pattern,
+ const char *type_pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ bool have_where = false;
+ static const bool translate_columns[] = {false, false, false, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " am.amname AS \"%s\",\n"
+ " CASE\n"
+ " WHEN pg_catalog.pg_opfamily_is_visible(f.oid)\n"
+ " THEN pg_catalog.format('%%I', f.opfname)\n"
+ " ELSE pg_catalog.format('%%I.%%I', n.nspname, f.opfname)\n"
+ " END AS \"%s\",\n"
+ " (SELECT\n"
+ " pg_catalog.string_agg(pg_catalog.format_type(oc.opcintype, NULL), ', ')\n"
+ " FROM pg_catalog.pg_opclass oc\n"
+ " WHERE oc.opcfamily = f.oid) \"%s\"",
+ gettext_noop("AM"),
+ gettext_noop("Operator family"),
+ gettext_noop("Applicable types"));
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.pg_get_userbyid(f.opfowner) AS \"%s\"\n",
+ gettext_noop("Owner"));
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_opfamily f\n"
+ " LEFT JOIN pg_catalog.pg_am am on am.oid = f.opfmethod\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = f.opfnamespace\n");
+
+ if (access_method_pattern)
+ if (!validateSQLNamePattern(&buf, access_method_pattern,
+ false, false, NULL, "am.amname", NULL, NULL,
+ &have_where, 1))
+ goto error_return;
+ if (type_pattern)
+ {
+ appendPQExpBuffer(&buf,
+ " %s EXISTS (\n"
+ " SELECT 1\n"
+ " FROM pg_catalog.pg_type t\n"
+ " JOIN pg_catalog.pg_opclass oc ON oc.opcintype = t.oid\n"
+ " LEFT JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace\n"
+ " WHERE oc.opcfamily = f.oid\n",
+ have_where ? "AND" : "WHERE");
+ /* Match type name pattern against either internal or external name */
+ if (!validateSQLNamePattern(&buf, type_pattern, true, false,
+ "tn.nspname", "t.typname",
+ "pg_catalog.format_type(t.oid, NULL)",
+ "pg_catalog.pg_type_is_visible(t.oid)",
+ NULL, 3))
+ goto error_return;
+ appendPQExpBufferStr(&buf, " )\n");
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of operator families");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+/*
+ * \dAo
+ * Lists operators of operator families
+ *
+ * Takes optional regexps to filter by index access method and operator
+ * family.
+ */
+bool
+listOpFamilyOperators(const char *access_method_pattern,
+ const char *family_pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ bool have_where = false;
+
+ static const bool translate_columns[] = {false, false, false, false, false, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " am.amname AS \"%s\",\n"
+ " CASE\n"
+ " WHEN pg_catalog.pg_opfamily_is_visible(of.oid)\n"
+ " THEN pg_catalog.format('%%I', of.opfname)\n"
+ " ELSE pg_catalog.format('%%I.%%I', nsf.nspname, of.opfname)\n"
+ " END AS \"%s\",\n"
+ " o.amopopr::pg_catalog.regoperator AS \"%s\"\n,"
+ " o.amopstrategy AS \"%s\",\n"
+ " CASE o.amoppurpose\n"
+ " WHEN 'o' THEN '%s'\n"
+ " WHEN 's' THEN '%s'\n"
+ " END AS \"%s\"\n",
+ gettext_noop("AM"),
+ gettext_noop("Operator family"),
+ gettext_noop("Operator"),
+ gettext_noop("Strategy"),
+ gettext_noop("ordering"),
+ gettext_noop("search"),
+ gettext_noop("Purpose"));
+
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ", ofs.opfname AS \"%s\"\n",
+ gettext_noop("Sort opfamily"));
+ appendPQExpBufferStr(&buf,
+ "FROM pg_catalog.pg_amop o\n"
+ " LEFT JOIN pg_catalog.pg_opfamily of ON of.oid = o.amopfamily\n"
+ " LEFT JOIN pg_catalog.pg_am am ON am.oid = of.opfmethod AND am.oid = o.amopmethod\n"
+ " LEFT JOIN pg_catalog.pg_namespace nsf ON of.opfnamespace = nsf.oid\n");
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_opfamily ofs ON ofs.oid = o.amopsortfamily\n");
+
+ if (access_method_pattern)
+ {
+ if (!validateSQLNamePattern(&buf, access_method_pattern,
+ false, false, NULL, "am.amname",
+ NULL, NULL,
+ &have_where, 1))
+ goto error_return;
+ }
+
+ if (family_pattern)
+ {
+ if (!validateSQLNamePattern(&buf, family_pattern, have_where, false,
+ "nsf.nspname", "of.opfname", NULL, NULL,
+ NULL, 3))
+ goto error_return;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2,\n"
+ " o.amoplefttype = o.amoprighttype DESC,\n"
+ " pg_catalog.format_type(o.amoplefttype, NULL),\n"
+ " pg_catalog.format_type(o.amoprighttype, NULL),\n"
+ " o.amopstrategy;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of operators of operator families");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+/*
+ * \dAp
+ * Lists support functions of operator families
+ *
+ * Takes optional regexps to filter by index access method and operator
+ * family.
+ */
+bool
+listOpFamilyFunctions(const char *access_method_pattern,
+ const char *family_pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ bool have_where = false;
+ static const bool translate_columns[] = {false, false, false, false, false, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " am.amname AS \"%s\",\n"
+ " CASE\n"
+ " WHEN pg_catalog.pg_opfamily_is_visible(of.oid)\n"
+ " THEN pg_catalog.format('%%I', of.opfname)\n"
+ " ELSE pg_catalog.format('%%I.%%I', ns.nspname, of.opfname)\n"
+ " END AS \"%s\",\n"
+ " pg_catalog.format_type(ap.amproclefttype, NULL) AS \"%s\",\n"
+ " pg_catalog.format_type(ap.amprocrighttype, NULL) AS \"%s\",\n"
+ " ap.amprocnum AS \"%s\"\n",
+ gettext_noop("AM"),
+ gettext_noop("Operator family"),
+ gettext_noop("Registered left type"),
+ gettext_noop("Registered right type"),
+ gettext_noop("Number"));
+
+ if (!verbose)
+ appendPQExpBuffer(&buf,
+ ", p.proname AS \"%s\"\n",
+ gettext_noop("Function"));
+ else
+ appendPQExpBuffer(&buf,
+ ", ap.amproc::pg_catalog.regprocedure AS \"%s\"\n",
+ gettext_noop("Function"));
+
+ appendPQExpBufferStr(&buf,
+ "FROM pg_catalog.pg_amproc ap\n"
+ " LEFT JOIN pg_catalog.pg_opfamily of ON of.oid = ap.amprocfamily\n"
+ " LEFT JOIN pg_catalog.pg_am am ON am.oid = of.opfmethod\n"
+ " LEFT JOIN pg_catalog.pg_namespace ns ON of.opfnamespace = ns.oid\n"
+ " LEFT JOIN pg_catalog.pg_proc p ON ap.amproc = p.oid\n");
+
+ if (access_method_pattern)
+ {
+ if (!validateSQLNamePattern(&buf, access_method_pattern,
+ false, false, NULL, "am.amname",
+ NULL, NULL,
+ &have_where, 1))
+ goto error_return;
+ }
+ if (family_pattern)
+ {
+ if (!validateSQLNamePattern(&buf, family_pattern, have_where, false,
+ "ns.nspname", "of.opfname", NULL, NULL,
+ NULL, 3))
+ goto error_return;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2,\n"
+ " ap.amproclefttype = ap.amprocrighttype DESC,\n"
+ " 3, 4, 5;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of support functions of operator families");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+/*
+ * \dl or \lo_list
+ * Lists large objects
+ */
+bool
+listLargeObjects(bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT oid as \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(lomowner) as \"%s\",\n ",
+ gettext_noop("ID"),
+ gettext_noop("Owner"));
+
+ if (verbose)
+ {
+ printACLColumn(&buf, "lomacl");
+ appendPQExpBufferStr(&buf, ",\n ");
+ }
+
+ appendPQExpBuffer(&buf,
+ "pg_catalog.obj_description(oid, 'pg_largeobject') as \"%s\"\n"
+ "FROM pg_catalog.pg_largeobject_metadata\n"
+ "ORDER BY oid",
+ gettext_noop("Description"));
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("Large objects");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
diff --git a/src/bin/psql/describe.h b/src/bin/psql/describe.h
new file mode 100644
index 0000000..7872c71
--- /dev/null
+++ b/src/bin/psql/describe.h
@@ -0,0 +1,149 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/describe.h
+ */
+#ifndef DESCRIBE_H
+#define DESCRIBE_H
+
+
+/* \da */
+extern bool describeAggregates(const char *pattern, bool verbose, bool showSystem);
+
+/* \dA */
+extern bool describeAccessMethods(const char *pattern, bool verbose);
+
+/* \db */
+extern bool describeTablespaces(const char *pattern, bool verbose);
+
+/* \df, \dfa, \dfn, \dft, \dfw, etc. */
+extern bool describeFunctions(const char *functypes, const char *func_pattern,
+ char **arg_patterns, int num_arg_patterns,
+ bool verbose, bool showSystem);
+
+/* \dT */
+extern bool describeTypes(const char *pattern, bool verbose, bool showSystem);
+
+/* \do */
+extern bool describeOperators(const char *oper_pattern,
+ char **arg_patterns, int num_arg_patterns,
+ bool verbose, bool showSystem);
+
+/* \du, \dg */
+extern bool describeRoles(const char *pattern, bool verbose, bool showSystem);
+
+/* \drds */
+extern bool listDbRoleSettings(const char *pattern, const char *pattern2);
+
+/* \z (or \dp) */
+extern bool permissionsList(const char *pattern);
+
+/* \ddp */
+extern bool listDefaultACLs(const char *pattern);
+
+/* \dd */
+extern bool objectDescription(const char *pattern, bool showSystem);
+
+/* \d foo */
+extern bool describeTableDetails(const char *pattern, bool verbose, bool showSystem);
+
+/* \dF */
+extern bool listTSConfigs(const char *pattern, bool verbose);
+
+/* \dFp */
+extern bool listTSParsers(const char *pattern, bool verbose);
+
+/* \dFd */
+extern bool listTSDictionaries(const char *pattern, bool verbose);
+
+/* \dFt */
+extern bool listTSTemplates(const char *pattern, bool verbose);
+
+/* \l */
+extern bool listAllDbs(const char *pattern, bool verbose);
+
+/* \dt, \di, \ds, \dS, etc. */
+extern bool listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSystem);
+
+/* \dP */
+extern bool listPartitionedTables(const char *reltypes, const char *pattern, bool verbose);
+
+/* \dD */
+extern bool listDomains(const char *pattern, bool verbose, bool showSystem);
+
+/* \dc */
+extern bool listConversions(const char *pattern, bool verbose, bool showSystem);
+
+/* \dconfig */
+extern bool describeConfigurationParameters(const char *pattern, bool verbose,
+ bool showSystem);
+
+/* \dC */
+extern bool listCasts(const char *pattern, bool verbose);
+
+/* \dO */
+extern bool listCollations(const char *pattern, bool verbose, bool showSystem);
+
+/* \dn */
+extern bool listSchemas(const char *pattern, bool verbose, bool showSystem);
+
+/* \dew */
+extern bool listForeignDataWrappers(const char *pattern, bool verbose);
+
+/* \des */
+extern bool listForeignServers(const char *pattern, bool verbose);
+
+/* \deu */
+extern bool listUserMappings(const char *pattern, bool verbose);
+
+/* \det */
+extern bool listForeignTables(const char *pattern, bool verbose);
+
+/* \dL */
+extern bool listLanguages(const char *pattern, bool verbose, bool showSystem);
+
+/* \dx */
+extern bool listExtensions(const char *pattern);
+
+/* \dx+ */
+extern bool listExtensionContents(const char *pattern);
+
+/* \dX */
+extern bool listExtendedStats(const char *pattern);
+
+/* \dy */
+extern bool listEventTriggers(const char *pattern, bool verbose);
+
+/* \dRp */
+bool listPublications(const char *pattern);
+
+/* \dRp+ */
+bool describePublications(const char *pattern);
+
+/* \dRs */
+bool describeSubscriptions(const char *pattern, bool verbose);
+
+/* \dAc */
+extern bool listOperatorClasses(const char *access_method_pattern,
+ const char *opclass_pattern,
+ bool verbose);
+
+/* \dAf */
+extern bool listOperatorFamilies(const char *access_method_pattern,
+ const char *opclass_pattern,
+ bool verbose);
+
+/* \dAo */
+extern bool listOpFamilyOperators(const char *accessMethod_pattern,
+ const char *family_pattern, bool verbose);
+
+/* \dAp */
+extern bool listOpFamilyFunctions(const char *access_method_pattern,
+ const char *family_pattern, bool verbose);
+
+/* \dl or \lo_list */
+extern bool listLargeObjects(bool verbose);
+
+#endif /* DESCRIBE_H */
diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c
new file mode 100644
index 0000000..f8ce1a0
--- /dev/null
+++ b/src/bin/psql/help.c
@@ -0,0 +1,766 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/help.c
+ */
+#include "postgres_fe.h"
+
+#ifndef WIN32
+#include <unistd.h> /* for geteuid() */
+#else
+#include <win32.h>
+#endif
+
+#ifndef WIN32
+#include <sys/ioctl.h> /* for ioctl() */
+#endif
+
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#endif
+
+#include "common.h"
+#include "common/logging.h"
+#include "common/username.h"
+#include "help.h"
+#include "input.h"
+#include "settings.h"
+#include "sql_help.h"
+
+/*
+ * PLEASE:
+ * If you change something in this file, also make the same changes
+ * in the DocBook documentation, file ref/psql-ref.sgml. If you don't
+ * know how to do it, please find someone who can help you.
+ */
+
+/* Some helper macros to make the code less verbose */
+#define HELP0(str) appendPQExpBufferStr(&buf, _(str))
+#define HELPN(str,...) appendPQExpBuffer(&buf, _(str), __VA_ARGS__)
+#define ON(var) ((var) ? _("on") : _("off"))
+
+
+/*
+ * usage
+ *
+ * print out command line arguments
+ */
+void
+usage(unsigned short int pager)
+{
+ const char *env;
+ const char *user;
+ char *errstr;
+ PQExpBufferData buf;
+ int nlcount;
+ FILE *output;
+
+ /* Find default user, in case we need it. */
+ user = getenv("PGUSER");
+ if (!user)
+ {
+ user = get_user_name(&errstr);
+ if (!user)
+ pg_fatal("%s", errstr);
+ }
+
+ /*
+ * To avoid counting the output lines manually, build the output in "buf"
+ * and then count them.
+ */
+ initPQExpBuffer(&buf);
+
+ HELP0("psql is the PostgreSQL interactive terminal.\n\n");
+ HELP0("Usage:\n");
+ HELP0(" psql [OPTION]... [DBNAME [USERNAME]]\n\n");
+
+ HELP0("General options:\n");
+ /* Display default database */
+ env = getenv("PGDATABASE");
+ if (!env)
+ env = user;
+ HELP0(" -c, --command=COMMAND run only single command (SQL or internal) and exit\n");
+ HELPN(" -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n",
+ env);
+ HELP0(" -f, --file=FILENAME execute commands from file, then exit\n");
+ HELP0(" -l, --list list available databases, then exit\n");
+ HELP0(" -v, --set=, --variable=NAME=VALUE\n"
+ " set psql variable NAME to VALUE\n"
+ " (e.g., -v ON_ERROR_STOP=1)\n");
+ HELP0(" -V, --version output version information, then exit\n");
+ HELP0(" -X, --no-psqlrc do not read startup file (~/.psqlrc)\n");
+ HELP0(" -1 (\"one\"), --single-transaction\n"
+ " execute as a single transaction (if non-interactive)\n");
+ HELP0(" -?, --help[=options] show this help, then exit\n");
+ HELP0(" --help=commands list backslash commands, then exit\n");
+ HELP0(" --help=variables list special variables, then exit\n");
+
+ HELP0("\nInput and output options:\n");
+ HELP0(" -a, --echo-all echo all input from script\n");
+ HELP0(" -b, --echo-errors echo failed commands\n");
+ HELP0(" -e, --echo-queries echo commands sent to server\n");
+ HELP0(" -E, --echo-hidden display queries that internal commands generate\n");
+ HELP0(" -L, --log-file=FILENAME send session log to file\n");
+ HELP0(" -n, --no-readline disable enhanced command line editing (readline)\n");
+ HELP0(" -o, --output=FILENAME send query results to file (or |pipe)\n");
+ HELP0(" -q, --quiet run quietly (no messages, only query output)\n");
+ HELP0(" -s, --single-step single-step mode (confirm each query)\n");
+ HELP0(" -S, --single-line single-line mode (end of line terminates SQL command)\n");
+
+ HELP0("\nOutput format options:\n");
+ HELP0(" -A, --no-align unaligned table output mode\n");
+ HELP0(" --csv CSV (Comma-Separated Values) table output mode\n");
+ HELPN(" -F, --field-separator=STRING\n"
+ " field separator for unaligned output (default: \"%s\")\n",
+ DEFAULT_FIELD_SEP);
+ HELP0(" -H, --html HTML table output mode\n");
+ HELP0(" -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n");
+ HELP0(" -R, --record-separator=STRING\n"
+ " record separator for unaligned output (default: newline)\n");
+ HELP0(" -t, --tuples-only print rows only\n");
+ HELP0(" -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n");
+ HELP0(" -x, --expanded turn on expanded table output\n");
+ HELP0(" -z, --field-separator-zero\n"
+ " set field separator for unaligned output to zero byte\n");
+ HELP0(" -0, --record-separator-zero\n"
+ " set record separator for unaligned output to zero byte\n");
+
+ HELP0("\nConnection options:\n");
+ /* Display default host */
+ env = getenv("PGHOST");
+ HELPN(" -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n",
+ env ? env : _("local socket"));
+ /* Display default port */
+ env = getenv("PGPORT");
+ HELPN(" -p, --port=PORT database server port (default: \"%s\")\n",
+ env ? env : DEF_PGPORT_STR);
+ /* Display default user */
+ HELPN(" -U, --username=USERNAME database user name (default: \"%s\")\n",
+ user);
+ HELP0(" -w, --no-password never prompt for password\n");
+ HELP0(" -W, --password force password prompt (should happen automatically)\n");
+
+ HELP0("\nFor more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+ "commands) from within psql, or consult the psql section in the PostgreSQL\n"
+ "documentation.\n\n");
+ HELPN("Report bugs to <%s>.\n", PACKAGE_BUGREPORT);
+ HELPN("%s home page: <%s>\n", PACKAGE_NAME, PACKAGE_URL);
+
+ /* Now we can count the lines. */
+ nlcount = 0;
+ for (const char *ptr = buf.data; *ptr; ptr++)
+ {
+ if (*ptr == '\n')
+ nlcount++;
+ }
+
+ /* And dump the output, with appropriate pagination. */
+ output = PageOutput(nlcount, pager ? &(pset.popt.topt) : NULL);
+
+ fputs(buf.data, output);
+
+ ClosePager(output);
+
+ termPQExpBuffer(&buf);
+}
+
+
+/*
+ * slashUsage
+ *
+ * print out help for the backslash commands
+ */
+void
+slashUsage(unsigned short int pager)
+{
+ PQExpBufferData buf;
+ int nlcount;
+ FILE *output;
+ char *currdb;
+
+ currdb = PQdb(pset.db);
+
+ /*
+ * To avoid counting the output lines manually, build the output in "buf"
+ * and then count them.
+ */
+ initPQExpBuffer(&buf);
+
+ HELP0("General\n");
+ HELP0(" \\copyright show PostgreSQL usage and distribution terms\n");
+ HELP0(" \\crosstabview [COLUMNS] execute query and display result in crosstab\n");
+ HELP0(" \\errverbose show most recent error message at maximum verbosity\n");
+ HELP0(" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+ " \\g with no arguments is equivalent to a semicolon\n");
+ HELP0(" \\gdesc describe result of query, without executing it\n");
+ HELP0(" \\gexec execute query, then execute each value in its result\n");
+ HELP0(" \\gset [PREFIX] execute query and store result in psql variables\n");
+ HELP0(" \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n");
+ HELP0(" \\q quit psql\n");
+ HELP0(" \\watch [SEC] execute query every SEC seconds\n");
+ HELP0("\n");
+
+ HELP0("Help\n");
+
+ HELP0(" \\? [commands] show help on backslash commands\n");
+ HELP0(" \\? options show help on psql command-line options\n");
+ HELP0(" \\? variables show help on special variables\n");
+ HELP0(" \\h [NAME] help on syntax of SQL commands, * for all commands\n");
+ HELP0("\n");
+
+ HELP0("Query Buffer\n");
+ HELP0(" \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n");
+ HELP0(" \\ef [FUNCNAME [LINE]] edit function definition with external editor\n");
+ HELP0(" \\ev [VIEWNAME [LINE]] edit view definition with external editor\n");
+ HELP0(" \\p show the contents of the query buffer\n");
+ HELP0(" \\r reset (clear) the query buffer\n");
+#ifdef USE_READLINE
+ HELP0(" \\s [FILE] display history or save it to file\n");
+#endif
+ HELP0(" \\w FILE write query buffer to file\n");
+ HELP0("\n");
+
+ HELP0("Input/Output\n");
+ HELP0(" \\copy ... perform SQL COPY with data stream to the client host\n");
+ HELP0(" \\echo [-n] [STRING] write string to standard output (-n for no newline)\n");
+ HELP0(" \\i FILE execute commands from file\n");
+ HELP0(" \\ir FILE as \\i, but relative to location of current script\n");
+ HELP0(" \\o [FILE] send all query results to file or |pipe\n");
+ HELP0(" \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n");
+ HELP0(" \\warn [-n] [STRING] write string to standard error (-n for no newline)\n");
+ HELP0("\n");
+
+ HELP0("Conditional\n");
+ HELP0(" \\if EXPR begin conditional block\n");
+ HELP0(" \\elif EXPR alternative within current conditional block\n");
+ HELP0(" \\else final alternative within current conditional block\n");
+ HELP0(" \\endif end conditional block\n");
+ HELP0("\n");
+
+ HELP0("Informational\n");
+ HELP0(" (options: S = show system objects, + = additional detail)\n");
+ HELP0(" \\d[S+] list tables, views, and sequences\n");
+ HELP0(" \\d[S+] NAME describe table, view, sequence, or index\n");
+ HELP0(" \\da[S] [PATTERN] list aggregates\n");
+ HELP0(" \\dA[+] [PATTERN] list access methods\n");
+ HELP0(" \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n");
+ HELP0(" \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n");
+ HELP0(" \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n");
+ HELP0(" \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n");
+ HELP0(" \\db[+] [PATTERN] list tablespaces\n");
+ HELP0(" \\dc[S+] [PATTERN] list conversions\n");
+ HELP0(" \\dconfig[+] [PATTERN] list configuration parameters\n");
+ HELP0(" \\dC[+] [PATTERN] list casts\n");
+ HELP0(" \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n");
+ HELP0(" \\dD[S+] [PATTERN] list domains\n");
+ HELP0(" \\ddp [PATTERN] list default privileges\n");
+ HELP0(" \\dE[S+] [PATTERN] list foreign tables\n");
+ HELP0(" \\des[+] [PATTERN] list foreign servers\n");
+ HELP0(" \\det[+] [PATTERN] list foreign tables\n");
+ HELP0(" \\deu[+] [PATTERN] list user mappings\n");
+ HELP0(" \\dew[+] [PATTERN] list foreign-data wrappers\n");
+ HELP0(" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+ " list [only agg/normal/procedure/trigger/window] functions\n");
+ HELP0(" \\dF[+] [PATTERN] list text search configurations\n");
+ HELP0(" \\dFd[+] [PATTERN] list text search dictionaries\n");
+ HELP0(" \\dFp[+] [PATTERN] list text search parsers\n");
+ HELP0(" \\dFt[+] [PATTERN] list text search templates\n");
+ HELP0(" \\dg[S+] [PATTERN] list roles\n");
+ HELP0(" \\di[S+] [PATTERN] list indexes\n");
+ HELP0(" \\dl[+] list large objects, same as \\lo_list\n");
+ HELP0(" \\dL[S+] [PATTERN] list procedural languages\n");
+ HELP0(" \\dm[S+] [PATTERN] list materialized views\n");
+ HELP0(" \\dn[S+] [PATTERN] list schemas\n");
+ HELP0(" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+ " list operators\n");
+ HELP0(" \\dO[S+] [PATTERN] list collations\n");
+ HELP0(" \\dp [PATTERN] list table, view, and sequence access privileges\n");
+ HELP0(" \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n");
+ HELP0(" \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n");
+ HELP0(" \\dRp[+] [PATTERN] list replication publications\n");
+ HELP0(" \\dRs[+] [PATTERN] list replication subscriptions\n");
+ HELP0(" \\ds[S+] [PATTERN] list sequences\n");
+ HELP0(" \\dt[S+] [PATTERN] list tables\n");
+ HELP0(" \\dT[S+] [PATTERN] list data types\n");
+ HELP0(" \\du[S+] [PATTERN] list roles\n");
+ HELP0(" \\dv[S+] [PATTERN] list views\n");
+ HELP0(" \\dx[+] [PATTERN] list extensions\n");
+ HELP0(" \\dX [PATTERN] list extended statistics\n");
+ HELP0(" \\dy[+] [PATTERN] list event triggers\n");
+ HELP0(" \\l[+] [PATTERN] list databases\n");
+ HELP0(" \\sf[+] FUNCNAME show a function's definition\n");
+ HELP0(" \\sv[+] VIEWNAME show a view's definition\n");
+ HELP0(" \\z [PATTERN] same as \\dp\n");
+ HELP0("\n");
+
+ HELP0("Large Objects\n");
+ HELP0(" \\lo_export LOBOID FILE write large object to file\n");
+ HELP0(" \\lo_import FILE [COMMENT]\n"
+ " read large object from file\n");
+ HELP0(" \\lo_list[+] list large objects\n");
+ HELP0(" \\lo_unlink LOBOID delete a large object\n");
+ HELP0("\n");
+
+ HELP0("Formatting\n");
+ HELP0(" \\a toggle between unaligned and aligned output mode\n");
+ HELP0(" \\C [STRING] set table title, or unset if none\n");
+ HELP0(" \\f [STRING] show or set field separator for unaligned query output\n");
+ HELPN(" \\H toggle HTML output mode (currently %s)\n",
+ ON(pset.popt.topt.format == PRINT_HTML));
+ HELP0(" \\pset [NAME [VALUE]] set table output option\n"
+ " (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+ " fieldsep_zero|footer|format|linestyle|null|\n"
+ " numericlocale|pager|pager_min_lines|recordsep|\n"
+ " recordsep_zero|tableattr|title|tuples_only|\n"
+ " unicode_border_linestyle|unicode_column_linestyle|\n"
+ " unicode_header_linestyle)\n");
+ HELPN(" \\t [on|off] show only rows (currently %s)\n",
+ ON(pset.popt.topt.tuples_only));
+ HELP0(" \\T [STRING] set HTML <table> tag attributes, or unset if none\n");
+ HELPN(" \\x [on|off|auto] toggle expanded output (currently %s)\n",
+ pset.popt.topt.expanded == 2 ? _("auto") : ON(pset.popt.topt.expanded));
+ HELP0("\n");
+
+ HELP0("Connection\n");
+ if (currdb)
+ HELPN(" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+ " connect to new database (currently \"%s\")\n",
+ currdb);
+ else
+ HELP0(" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+ " connect to new database (currently no connection)\n");
+ HELP0(" \\conninfo display information about current connection\n");
+ HELP0(" \\encoding [ENCODING] show or set client encoding\n");
+ HELP0(" \\password [USERNAME] securely change the password for a user\n");
+ HELP0("\n");
+
+ HELP0("Operating System\n");
+ HELP0(" \\cd [DIR] change the current working directory\n");
+ HELP0(" \\getenv PSQLVAR ENVVAR fetch environment variable\n");
+ HELP0(" \\setenv NAME [VALUE] set or unset environment variable\n");
+ HELPN(" \\timing [on|off] toggle timing of commands (currently %s)\n",
+ ON(pset.timing));
+ HELP0(" \\! [COMMAND] execute command in shell or start interactive shell\n");
+ HELP0("\n");
+
+ HELP0("Variables\n");
+ HELP0(" \\prompt [TEXT] NAME prompt user to set internal variable\n");
+ HELP0(" \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n");
+ HELP0(" \\unset NAME unset (delete) internal variable\n");
+
+ /* Now we can count the lines. */
+ nlcount = 0;
+ for (const char *ptr = buf.data; *ptr; ptr++)
+ {
+ if (*ptr == '\n')
+ nlcount++;
+ }
+
+ /* And dump the output, with appropriate pagination. */
+ output = PageOutput(nlcount, pager ? &(pset.popt.topt) : NULL);
+
+ fputs(buf.data, output);
+
+ ClosePager(output);
+
+ termPQExpBuffer(&buf);
+}
+
+
+/*
+ * helpVariables
+ *
+ * show list of available variables (options) from command line
+ */
+void
+helpVariables(unsigned short int pager)
+{
+ PQExpBufferData buf;
+ int nlcount;
+ FILE *output;
+
+ /*
+ * To avoid counting the output lines manually, build the output in "buf"
+ * and then count them.
+ */
+ initPQExpBuffer(&buf);
+
+ HELP0("List of specially treated variables\n\n");
+
+ HELP0("psql variables:\n");
+ HELP0("Usage:\n");
+ HELP0(" psql --set=NAME=VALUE\n or \\set NAME VALUE inside psql\n\n");
+
+ HELP0(" AUTOCOMMIT\n"
+ " if set, successful SQL commands are automatically committed\n");
+ HELP0(" COMP_KEYWORD_CASE\n"
+ " determines the case used to complete SQL key words\n"
+ " [lower, upper, preserve-lower, preserve-upper]\n");
+ HELP0(" DBNAME\n"
+ " the currently connected database name\n");
+ HELP0(" ECHO\n"
+ " controls what input is written to standard output\n"
+ " [all, errors, none, queries]\n");
+ HELP0(" ECHO_HIDDEN\n"
+ " if set, display internal queries executed by backslash commands;\n"
+ " if set to \"noexec\", just show them without execution\n");
+ HELP0(" ENCODING\n"
+ " current client character set encoding\n");
+ HELP0(" ERROR\n"
+ " true if last query failed, else false\n");
+ HELP0(" FETCH_COUNT\n"
+ " the number of result rows to fetch and display at a time (0 = unlimited)\n");
+ HELP0(" HIDE_TABLEAM\n"
+ " if set, table access methods are not displayed\n");
+ HELP0(" HIDE_TOAST_COMPRESSION\n"
+ " if set, compression methods are not displayed\n");
+ HELP0(" HISTCONTROL\n"
+ " controls command history [ignorespace, ignoredups, ignoreboth]\n");
+ HELP0(" HISTFILE\n"
+ " file name used to store the command history\n");
+ HELP0(" HISTSIZE\n"
+ " maximum number of commands to store in the command history\n");
+ HELP0(" HOST\n"
+ " the currently connected database server host\n");
+ HELP0(" IGNOREEOF\n"
+ " number of EOFs needed to terminate an interactive session\n");
+ HELP0(" LASTOID\n"
+ " value of the last affected OID\n");
+ HELP0(" LAST_ERROR_MESSAGE\n"
+ " LAST_ERROR_SQLSTATE\n"
+ " message and SQLSTATE of last error, or empty string and \"00000\" if none\n");
+ HELP0(" ON_ERROR_ROLLBACK\n"
+ " if set, an error doesn't stop a transaction (uses implicit savepoints)\n");
+ HELP0(" ON_ERROR_STOP\n"
+ " stop batch execution after error\n");
+ HELP0(" PORT\n"
+ " server port of the current connection\n");
+ HELP0(" PROMPT1\n"
+ " specifies the standard psql prompt\n");
+ HELP0(" PROMPT2\n"
+ " specifies the prompt used when a statement continues from a previous line\n");
+ HELP0(" PROMPT3\n"
+ " specifies the prompt used during COPY ... FROM STDIN\n");
+ HELP0(" QUIET\n"
+ " run quietly (same as -q option)\n");
+ HELP0(" ROW_COUNT\n"
+ " number of rows returned or affected by last query, or 0\n");
+ HELP0(" SERVER_VERSION_NAME\n"
+ " SERVER_VERSION_NUM\n"
+ " server's version (in short string or numeric format)\n");
+ HELP0(" SHOW_ALL_RESULTS\n"
+ " show all results of a combined query (\\;) instead of only the last\n");
+ HELP0(" SHOW_CONTEXT\n"
+ " controls display of message context fields [never, errors, always]\n");
+ HELP0(" SINGLELINE\n"
+ " if set, end of line terminates SQL commands (same as -S option)\n");
+ HELP0(" SINGLESTEP\n"
+ " single-step mode (same as -s option)\n");
+ HELP0(" SQLSTATE\n"
+ " SQLSTATE of last query, or \"00000\" if no error\n");
+ HELP0(" USER\n"
+ " the currently connected database user\n");
+ HELP0(" VERBOSITY\n"
+ " controls verbosity of error reports [default, verbose, terse, sqlstate]\n");
+ HELP0(" VERSION\n"
+ " VERSION_NAME\n"
+ " VERSION_NUM\n"
+ " psql's version (in verbose string, short string, or numeric format)\n");
+
+ HELP0("\nDisplay settings:\n");
+ HELP0("Usage:\n");
+ HELP0(" psql --pset=NAME[=VALUE]\n or \\pset NAME [VALUE] inside psql\n\n");
+
+ HELP0(" border\n"
+ " border style (number)\n");
+ HELP0(" columns\n"
+ " target width for the wrapped format\n");
+ HELP0(" expanded (or x)\n"
+ " expanded output [on, off, auto]\n");
+ HELPN(" fieldsep\n"
+ " field separator for unaligned output (default \"%s\")\n",
+ DEFAULT_FIELD_SEP);
+ HELP0(" fieldsep_zero\n"
+ " set field separator for unaligned output to a zero byte\n");
+ HELP0(" footer\n"
+ " enable or disable display of the table footer [on, off]\n");
+ HELP0(" format\n"
+ " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n");
+ HELP0(" linestyle\n"
+ " set the border line drawing style [ascii, old-ascii, unicode]\n");
+ HELP0(" null\n"
+ " set the string to be printed in place of a null value\n");
+ HELP0(" numericlocale\n"
+ " enable display of a locale-specific character to separate groups of digits\n");
+ HELP0(" pager\n"
+ " control when an external pager is used [yes, no, always]\n");
+ HELP0(" recordsep\n"
+ " record (line) separator for unaligned output\n");
+ HELP0(" recordsep_zero\n"
+ " set record separator for unaligned output to a zero byte\n");
+ HELP0(" tableattr (or T)\n"
+ " specify attributes for table tag in html format, or proportional\n"
+ " column widths for left-aligned data types in latex-longtable format\n");
+ HELP0(" title\n"
+ " set the table title for subsequently printed tables\n");
+ HELP0(" tuples_only\n"
+ " if set, only actual table data is shown\n");
+ HELP0(" unicode_border_linestyle\n"
+ " unicode_column_linestyle\n"
+ " unicode_header_linestyle\n"
+ " set the style of Unicode line drawing [single, double]\n");
+
+ HELP0("\nEnvironment variables:\n");
+ HELP0("Usage:\n");
+
+#ifndef WIN32
+ HELP0(" NAME=VALUE [NAME=VALUE] psql ...\n or \\setenv NAME [VALUE] inside psql\n\n");
+#else
+ HELP0(" set NAME=VALUE\n psql ...\n or \\setenv NAME [VALUE] inside psql\n\n");
+#endif
+
+ HELP0(" COLUMNS\n"
+ " number of columns for wrapped format\n");
+ HELP0(" PGAPPNAME\n"
+ " same as the application_name connection parameter\n");
+ HELP0(" PGDATABASE\n"
+ " same as the dbname connection parameter\n");
+ HELP0(" PGHOST\n"
+ " same as the host connection parameter\n");
+ HELP0(" PGPASSFILE\n"
+ " password file name\n");
+ HELP0(" PGPASSWORD\n"
+ " connection password (not recommended)\n");
+ HELP0(" PGPORT\n"
+ " same as the port connection parameter\n");
+ HELP0(" PGUSER\n"
+ " same as the user connection parameter\n");
+ HELP0(" PSQL_EDITOR, EDITOR, VISUAL\n"
+ " editor used by the \\e, \\ef, and \\ev commands\n");
+ HELP0(" PSQL_EDITOR_LINENUMBER_ARG\n"
+ " how to specify a line number when invoking the editor\n");
+ HELP0(" PSQL_HISTORY\n"
+ " alternative location for the command history file\n");
+ HELP0(" PSQL_PAGER, PAGER\n"
+ " name of external pager program\n");
+#ifndef WIN32
+ HELP0(" PSQL_WATCH_PAGER\n"
+ " name of external pager program used for \\watch\n");
+#endif
+ HELP0(" PSQLRC\n"
+ " alternative location for the user's .psqlrc file\n");
+ HELP0(" SHELL\n"
+ " shell used by the \\! command\n");
+ HELP0(" TMPDIR\n"
+ " directory for temporary files\n");
+
+ /* Now we can count the lines. */
+ nlcount = 0;
+ for (const char *ptr = buf.data; *ptr; ptr++)
+ {
+ if (*ptr == '\n')
+ nlcount++;
+ }
+
+ /* And dump the output, with appropriate pagination. */
+ output = PageOutput(nlcount, pager ? &(pset.popt.topt) : NULL);
+
+ fputs(buf.data, output);
+
+ ClosePager(output);
+
+ termPQExpBuffer(&buf);
+}
+
+
+/*
+ * helpSQL -- help with SQL commands
+ *
+ * Note: we assume caller removed any trailing spaces in "topic".
+ */
+void
+helpSQL(const char *topic, unsigned short int pager)
+{
+#define VALUE_OR_NULL(a) ((a) ? (a) : "")
+
+ if (!topic || strlen(topic) == 0)
+ {
+ /* Print all the available command names */
+ int screen_width;
+ int ncolumns;
+ int nrows;
+ FILE *output;
+ int i;
+ int j;
+
+ /* Find screen width to determine how many columns will fit */
+#ifdef TIOCGWINSZ
+ struct winsize screen_size;
+
+ if (ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) == -1)
+ screen_width = 80; /* ioctl failed, assume 80 */
+ else
+ screen_width = screen_size.ws_col;
+#else
+ screen_width = 80; /* default assumption */
+#endif
+
+ ncolumns = (screen_width - 3) / (QL_MAX_CMD_LEN + 1);
+ ncolumns = Max(ncolumns, 1);
+ nrows = (QL_HELP_COUNT + (ncolumns - 1)) / ncolumns;
+
+ output = PageOutput(nrows + 1, pager ? &(pset.popt.topt) : NULL);
+
+ fputs(_("Available help:\n"), output);
+
+ for (i = 0; i < nrows; i++)
+ {
+ fprintf(output, " ");
+ for (j = 0; j < ncolumns - 1; j++)
+ fprintf(output, "%-*s",
+ QL_MAX_CMD_LEN + 1,
+ VALUE_OR_NULL(QL_HELP[i + j * nrows].cmd));
+ if (i + j * nrows < QL_HELP_COUNT)
+ fprintf(output, "%s",
+ VALUE_OR_NULL(QL_HELP[i + j * nrows].cmd));
+ fputc('\n', output);
+ }
+
+ ClosePager(output);
+ }
+ else
+ {
+ int i,
+ pass;
+ FILE *output = NULL;
+ size_t len,
+ wordlen,
+ j;
+ int nl_count;
+
+ /*
+ * len is the amount of the input to compare to the help topic names.
+ * We first try exact match, then first + second words, then first
+ * word only.
+ */
+ len = strlen(topic);
+
+ for (pass = 1; pass <= 3; pass++)
+ {
+ if (pass > 1) /* Nothing on first pass - try the opening
+ * word(s) */
+ {
+ wordlen = j = 1;
+ while (j < len && topic[j++] != ' ')
+ wordlen++;
+ if (pass == 2 && j < len)
+ {
+ wordlen++;
+ while (j < len && topic[j++] != ' ')
+ wordlen++;
+ }
+ if (wordlen >= len)
+ {
+ /* Failed to shorten input, so try next pass if any */
+ continue;
+ }
+ len = wordlen;
+ }
+
+ /*
+ * Count newlines for pager. This logic must agree with what the
+ * following loop will do!
+ */
+ nl_count = 0;
+ for (i = 0; QL_HELP[i].cmd; i++)
+ {
+ if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
+ strcmp(topic, "*") == 0)
+ {
+ /* magic constant here must match format below! */
+ nl_count += 7 + QL_HELP[i].nl_count;
+
+ /* If we have an exact match, exit. Fixes \h SELECT */
+ if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
+ break;
+ }
+ }
+ /* If no matches, don't open the output yet */
+ if (nl_count == 0)
+ continue;
+
+ if (!output)
+ output = PageOutput(nl_count, pager ? &(pset.popt.topt) : NULL);
+
+ for (i = 0; QL_HELP[i].cmd; i++)
+ {
+ if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
+ strcmp(topic, "*") == 0)
+ {
+ PQExpBufferData buffer;
+ char *url;
+
+ initPQExpBuffer(&buffer);
+ QL_HELP[i].syntaxfunc(&buffer);
+ url = psprintf("https://www.postgresql.org/docs/%s/%s.html",
+ strstr(PG_VERSION, "devel") ? "devel" : PG_MAJORVERSION,
+ QL_HELP[i].docbook_id);
+ /* # of newlines in format must match constant above! */
+ fprintf(output, _("Command: %s\n"
+ "Description: %s\n"
+ "Syntax:\n%s\n\n"
+ "URL: %s\n\n"),
+ QL_HELP[i].cmd,
+ _(QL_HELP[i].help),
+ buffer.data,
+ url);
+ free(url);
+ termPQExpBuffer(&buffer);
+
+ /* If we have an exact match, exit. Fixes \h SELECT */
+ if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
+ break;
+ }
+ }
+ break;
+ }
+
+ /* If we never found anything, report that */
+ if (!output)
+ {
+ output = PageOutput(2, pager ? &(pset.popt.topt) : NULL);
+ fprintf(output, _("No help available for \"%s\".\n"
+ "Try \\h with no arguments to see available help.\n"),
+ topic);
+ }
+
+ ClosePager(output);
+ }
+}
+
+
+
+void
+print_copyright(void)
+{
+ puts("PostgreSQL Database Management System\n"
+ "(formerly known as Postgres, then as Postgres95)\n\n"
+ "Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group\n\n"
+ "Portions Copyright (c) 1994, The Regents of the University of California\n\n"
+ "Permission to use, copy, modify, and distribute this software and its\n"
+ "documentation for any purpose, without fee, and without a written agreement\n"
+ "is hereby granted, provided that the above copyright notice and this\n"
+ "paragraph and the following two paragraphs appear in all copies.\n\n"
+ "IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR\n"
+ "DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING\n"
+ "LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS\n"
+ "DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE\n"
+ "POSSIBILITY OF SUCH DAMAGE.\n\n"
+ "THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,\n"
+ "INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n"
+ "AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS\n"
+ "ON AN \"AS IS\" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO\n"
+ "PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.\n");
+}
diff --git a/src/bin/psql/help.h b/src/bin/psql/help.h
new file mode 100644
index 0000000..798807b
--- /dev/null
+++ b/src/bin/psql/help.h
@@ -0,0 +1,21 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/help.h
+ */
+#ifndef HELP_H
+#define HELP_H
+
+void usage(unsigned short int pager);
+
+void slashUsage(unsigned short int pager);
+
+void helpVariables(unsigned short int pager);
+
+void helpSQL(const char *topic, unsigned short int pager);
+
+void print_copyright(void);
+
+#endif
diff --git a/src/bin/psql/input.c b/src/bin/psql/input.c
new file mode 100644
index 0000000..416185d
--- /dev/null
+++ b/src/bin/psql/input.c
@@ -0,0 +1,552 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/input.c
+ */
+#include "postgres_fe.h"
+
+#ifndef WIN32
+#include <unistd.h>
+#endif
+#include <fcntl.h>
+#include <limits.h>
+
+#include "common.h"
+#include "common/logging.h"
+#include "input.h"
+#include "settings.h"
+#include "tab-complete.h"
+
+#ifndef WIN32
+#define PSQLHISTORY ".psql_history"
+#else
+#define PSQLHISTORY "psql_history"
+#endif
+
+/* Runtime options for turning off readline and history */
+/* (of course there is no runtime command for doing that :) */
+#ifdef USE_READLINE
+static bool useReadline;
+static bool useHistory;
+
+static char *psql_history;
+
+static int history_lines_added;
+
+
+/*
+ * Preserve newlines in saved queries by mapping '\n' to NL_IN_HISTORY
+ *
+ * It is assumed NL_IN_HISTORY will never be entered by the user
+ * nor appear inside a multi-byte string. 0x00 is not properly
+ * handled by the readline routines so it can not be used
+ * for this purpose.
+ */
+#define NL_IN_HISTORY 0x01
+#endif
+
+static void finishInput(void);
+
+
+/*
+ * gets_interactive()
+ *
+ * Gets a line of interactive input, using readline if desired.
+ *
+ * prompt: the prompt string to be used
+ * query_buf: buffer containing lines already read in the current command
+ * (query_buf is not modified here, but may be consulted for tab completion)
+ *
+ * The result is a malloc'd string.
+ *
+ * Caller *must* have set up sigint_interrupt_jmp before calling.
+ */
+char *
+gets_interactive(const char *prompt, PQExpBuffer query_buf)
+{
+#ifdef USE_READLINE
+ if (useReadline)
+ {
+ char *result;
+
+ /*
+ * Some versions of readline don't notice SIGWINCH signals that arrive
+ * when not actively reading input. The simplest fix is to always
+ * re-read the terminal size. This leaves a window for SIGWINCH to be
+ * missed between here and where readline() enables libreadline's
+ * signal handler, but that's probably short enough to be ignored.
+ */
+#ifdef HAVE_RL_RESET_SCREEN_SIZE
+ rl_reset_screen_size();
+#endif
+
+ /* Make current query_buf available to tab completion callback */
+ tab_completion_query_buf = query_buf;
+
+ /* Enable SIGINT to longjmp to sigint_interrupt_jmp */
+ sigint_interrupt_enabled = true;
+
+ /* On some platforms, readline is declared as readline(char *) */
+ result = readline((char *) prompt);
+
+ /* Disable SIGINT again */
+ sigint_interrupt_enabled = false;
+
+ /* Pure neatnik-ism */
+ tab_completion_query_buf = NULL;
+
+ return result;
+ }
+#endif
+
+ fputs(prompt, stdout);
+ fflush(stdout);
+ return gets_fromFile(stdin);
+}
+
+
+/*
+ * Append the line to the history buffer, making sure there is a trailing '\n'
+ */
+void
+pg_append_history(const char *s, PQExpBuffer history_buf)
+{
+#ifdef USE_READLINE
+ if (useHistory && s)
+ {
+ appendPQExpBufferStr(history_buf, s);
+ if (!s[0] || s[strlen(s) - 1] != '\n')
+ appendPQExpBufferChar(history_buf, '\n');
+ }
+#endif
+}
+
+
+/*
+ * Emit accumulated history entry to readline's history mechanism,
+ * then reset the buffer to empty.
+ *
+ * Note: we write nothing if history_buf is empty, so extra calls to this
+ * function don't hurt. There must have been at least one line added by
+ * pg_append_history before we'll do anything.
+ */
+void
+pg_send_history(PQExpBuffer history_buf)
+{
+#ifdef USE_READLINE
+ static char *prev_hist = NULL;
+
+ char *s = history_buf->data;
+ int i;
+
+ /* Trim any trailing \n's (OK to scribble on history_buf) */
+ for (i = strlen(s) - 1; i >= 0 && s[i] == '\n'; i--)
+ ;
+ s[i + 1] = '\0';
+
+ if (useHistory && s[0])
+ {
+ if (((pset.histcontrol & hctl_ignorespace) &&
+ s[0] == ' ') ||
+ ((pset.histcontrol & hctl_ignoredups) &&
+ prev_hist && strcmp(s, prev_hist) == 0))
+ {
+ /* Ignore this line as far as history is concerned */
+ }
+ else
+ {
+ /* Save each previous line for ignoredups processing */
+ if (prev_hist)
+ free(prev_hist);
+ prev_hist = pg_strdup(s);
+ /* And send it to readline */
+ add_history(s);
+ /* Count lines added to history for use later */
+ history_lines_added++;
+ }
+ }
+
+ resetPQExpBuffer(history_buf);
+#endif
+}
+
+
+/*
+ * gets_fromFile
+ *
+ * Gets a line of noninteractive input from a file (which could be stdin).
+ * The result is a malloc'd string, or NULL on EOF or input error.
+ *
+ * Caller *must* have set up sigint_interrupt_jmp before calling.
+ *
+ * Note: we re-use a static PQExpBuffer for each call. This is to avoid
+ * leaking memory if interrupted by SIGINT.
+ */
+char *
+gets_fromFile(FILE *source)
+{
+ static PQExpBuffer buffer = NULL;
+
+ char line[1024];
+
+ if (buffer == NULL) /* first time through? */
+ buffer = createPQExpBuffer();
+ else
+ resetPQExpBuffer(buffer);
+
+ for (;;)
+ {
+ char *result;
+
+ /* Enable SIGINT to longjmp to sigint_interrupt_jmp */
+ sigint_interrupt_enabled = true;
+
+ /* Get some data */
+ result = fgets(line, sizeof(line), source);
+
+ /* Disable SIGINT again */
+ sigint_interrupt_enabled = false;
+
+ /* EOF or error? */
+ if (result == NULL)
+ {
+ if (ferror(source))
+ {
+ pg_log_error("could not read from input file: %m");
+ return NULL;
+ }
+ break;
+ }
+
+ appendPQExpBufferStr(buffer, line);
+
+ if (PQExpBufferBroken(buffer))
+ {
+ pg_log_error("out of memory");
+ return NULL;
+ }
+
+ /* EOL? */
+ if (buffer->len > 0 && buffer->data[buffer->len - 1] == '\n')
+ {
+ buffer->data[buffer->len - 1] = '\0';
+ return pg_strdup(buffer->data);
+ }
+ }
+
+ if (buffer->len > 0) /* EOF after reading some bufferload(s) */
+ return pg_strdup(buffer->data);
+
+ /* EOF, so return null */
+ return NULL;
+}
+
+
+#ifdef USE_READLINE
+
+/*
+ * Macros to iterate over each element of the history list in order
+ *
+ * You would think this would be simple enough, but in its inimitable fashion
+ * libedit has managed to break it: in libreadline we must use next_history()
+ * to go from oldest to newest, but in libedit we must use previous_history().
+ * To detect what to do, we make a trial call of previous_history(): if it
+ * fails, then either next_history() is what to use, or there's zero or one
+ * history entry so that it doesn't matter which direction we go.
+ *
+ * In case that wasn't disgusting enough: the code below is not as obvious as
+ * it might appear. In some libedit releases history_set_pos(0) fails until
+ * at least one add_history() call has been done. This is not an issue for
+ * printHistory() or encode_history(), which cannot be invoked before that has
+ * happened. In decode_history(), that's not so, and what actually happens is
+ * that we are sitting on the newest entry to start with, previous_history()
+ * fails, and we iterate over all the entries using next_history(). So the
+ * decode_history() loop iterates over the entries in the wrong order when
+ * using such a libedit release, and if there were another attempt to use
+ * BEGIN_ITERATE_HISTORY() before some add_history() call had happened, it
+ * wouldn't work. Fortunately we don't care about either of those things.
+ *
+ * Usage pattern is:
+ *
+ * BEGIN_ITERATE_HISTORY(varname);
+ * {
+ * loop body referencing varname->line;
+ * }
+ * END_ITERATE_HISTORY();
+ */
+#define BEGIN_ITERATE_HISTORY(VARNAME) \
+ do { \
+ HIST_ENTRY *VARNAME; \
+ bool use_prev_; \
+ \
+ history_set_pos(0); \
+ use_prev_ = (previous_history() != NULL); \
+ history_set_pos(0); \
+ for (VARNAME = current_history(); VARNAME != NULL; \
+ VARNAME = use_prev_ ? previous_history() : next_history()) \
+ { \
+ (void) 0
+
+#define END_ITERATE_HISTORY() \
+ } \
+ } while(0)
+
+
+/*
+ * Convert newlines to NL_IN_HISTORY for safe saving in readline history file
+ */
+static void
+encode_history(void)
+{
+ BEGIN_ITERATE_HISTORY(cur_hist);
+ {
+ char *cur_ptr;
+
+ /* some platforms declare HIST_ENTRY.line as const char * */
+ for (cur_ptr = (char *) cur_hist->line; *cur_ptr; cur_ptr++)
+ {
+ if (*cur_ptr == '\n')
+ *cur_ptr = NL_IN_HISTORY;
+ }
+ }
+ END_ITERATE_HISTORY();
+}
+
+/*
+ * Reverse the above encoding
+ */
+static void
+decode_history(void)
+{
+ BEGIN_ITERATE_HISTORY(cur_hist);
+ {
+ char *cur_ptr;
+
+ /* some platforms declare HIST_ENTRY.line as const char * */
+ for (cur_ptr = (char *) cur_hist->line; *cur_ptr; cur_ptr++)
+ {
+ if (*cur_ptr == NL_IN_HISTORY)
+ *cur_ptr = '\n';
+ }
+ }
+ END_ITERATE_HISTORY();
+}
+#endif /* USE_READLINE */
+
+
+/*
+ * Put any startup stuff related to input in here. It's good to maintain
+ * abstraction this way.
+ *
+ * The only "flag" right now is 1 for use readline & history.
+ */
+void
+initializeInput(int flags)
+{
+#ifdef USE_READLINE
+ if (flags & 1)
+ {
+ const char *histfile;
+ char home[MAXPGPATH];
+
+ useReadline = true;
+
+ /* set appropriate values for Readline's global variables */
+ initialize_readline();
+
+#ifdef HAVE_RL_VARIABLE_BIND
+ /* set comment-begin to a useful value for SQL */
+ (void) rl_variable_bind("comment-begin", "-- ");
+#endif
+
+ /* this reads ~/.inputrc, so do it after rl_variable_bind */
+ rl_initialize();
+
+ useHistory = true;
+ using_history();
+ history_lines_added = 0;
+
+ histfile = GetVariable(pset.vars, "HISTFILE");
+
+ if (histfile == NULL)
+ {
+ char *envhist;
+
+ envhist = getenv("PSQL_HISTORY");
+ if (envhist != NULL && strlen(envhist) > 0)
+ histfile = envhist;
+ }
+
+ if (histfile == NULL)
+ {
+ if (get_home_path(home))
+ psql_history = psprintf("%s/%s", home, PSQLHISTORY);
+ }
+ else
+ {
+ psql_history = pg_strdup(histfile);
+ expand_tilde(&psql_history);
+ }
+
+ if (psql_history)
+ {
+ read_history(psql_history);
+ decode_history();
+ }
+ }
+#endif
+
+ atexit(finishInput);
+}
+
+
+/*
+ * This function saves the readline history when psql exits.
+ *
+ * fname: pathname of history file. (Should really be "const char *",
+ * but some ancient versions of readline omit the const-decoration.)
+ *
+ * max_lines: if >= 0, limit history file to that many entries.
+ */
+#ifdef USE_READLINE
+static bool
+saveHistory(char *fname, int max_lines)
+{
+ int errnum;
+
+ /*
+ * Suppressing the write attempt when HISTFILE is set to /dev/null may
+ * look like a negligible optimization, but it's necessary on e.g. macOS,
+ * where write_history will fail because it tries to chmod the target
+ * file.
+ */
+ if (strcmp(fname, DEVNULL) != 0)
+ {
+ /*
+ * Encode \n, since otherwise readline will reload multiline history
+ * entries as separate lines. (libedit doesn't really need this, but
+ * we do it anyway since it's too hard to tell which implementation we
+ * are using.)
+ */
+ encode_history();
+
+ /*
+ * On newer versions of libreadline, truncate the history file as
+ * needed and then append what we've added. This avoids overwriting
+ * history from other concurrent sessions (although there are still
+ * race conditions when two sessions exit at about the same time). If
+ * we don't have those functions, fall back to write_history().
+ */
+#if defined(HAVE_HISTORY_TRUNCATE_FILE) && defined(HAVE_APPEND_HISTORY)
+ {
+ int nlines;
+ int fd;
+
+ /* truncate previous entries if needed */
+ if (max_lines >= 0)
+ {
+ nlines = Max(max_lines - history_lines_added, 0);
+ (void) history_truncate_file(fname, nlines);
+ }
+ /* append_history fails if file doesn't already exist :-( */
+ fd = open(fname, O_CREAT | O_WRONLY | PG_BINARY, 0600);
+ if (fd >= 0)
+ close(fd);
+ /* append the appropriate number of lines */
+ if (max_lines >= 0)
+ nlines = Min(max_lines, history_lines_added);
+ else
+ nlines = history_lines_added;
+ errnum = append_history(nlines, fname);
+ if (errnum == 0)
+ return true;
+ }
+#else /* don't have append support */
+ {
+ /* truncate what we have ... */
+ if (max_lines >= 0)
+ stifle_history(max_lines);
+ /* ... and overwrite file. Tough luck for concurrent sessions. */
+ errnum = write_history(fname);
+ if (errnum == 0)
+ return true;
+ }
+#endif
+
+ pg_log_error("could not save history to file \"%s\": %m", fname);
+ }
+ return false;
+}
+#endif
+
+
+
+/*
+ * Print history to the specified file, or to the console if fname is NULL
+ * (psql \s command)
+ *
+ * We used to use saveHistory() for this purpose, but that doesn't permit
+ * use of a pager; moreover libedit's implementation behaves incompatibly
+ * (preferring to encode its output) and may fail outright when the target
+ * file is specified as /dev/tty.
+ */
+bool
+printHistory(const char *fname, unsigned short int pager)
+{
+#ifdef USE_READLINE
+ FILE *output;
+ bool is_pager;
+
+ if (!useHistory)
+ return false;
+
+ if (fname == NULL)
+ {
+ /* use pager, if enabled, when printing to console */
+ output = PageOutput(INT_MAX, pager ? &(pset.popt.topt) : NULL);
+ is_pager = true;
+ }
+ else
+ {
+ output = fopen(fname, "w");
+ if (output == NULL)
+ {
+ pg_log_error("could not save history to file \"%s\": %m", fname);
+ return false;
+ }
+ is_pager = false;
+ }
+
+ BEGIN_ITERATE_HISTORY(cur_hist);
+ {
+ fprintf(output, "%s\n", cur_hist->line);
+ }
+ END_ITERATE_HISTORY();
+
+ if (is_pager)
+ ClosePager(output);
+ else
+ fclose(output);
+
+ return true;
+#else
+ pg_log_error("history is not supported by this installation");
+ return false;
+#endif
+}
+
+
+static void
+finishInput(void)
+{
+#ifdef USE_READLINE
+ if (useHistory && psql_history)
+ {
+ (void) saveHistory(psql_history, pset.histsize);
+ free(psql_history);
+ psql_history = NULL;
+ }
+#endif
+}
diff --git a/src/bin/psql/input.h b/src/bin/psql/input.h
new file mode 100644
index 0000000..41766db
--- /dev/null
+++ b/src/bin/psql/input.h
@@ -0,0 +1,51 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/input.h
+ */
+#ifndef INPUT_H
+#define INPUT_H
+
+/*
+ * If some other file needs to have access to readline/history, include this
+ * file and save yourself all this work.
+ *
+ * USE_READLINE is what to conditionalize readline-dependent code on.
+ */
+#ifdef HAVE_LIBREADLINE
+#define USE_READLINE 1
+
+#if defined(HAVE_READLINE_READLINE_H)
+#include <readline/readline.h>
+#if defined(HAVE_READLINE_HISTORY_H)
+#include <readline/history.h>
+#endif
+#elif defined(HAVE_EDITLINE_READLINE_H)
+#include <editline/readline.h>
+#if defined(HAVE_EDITLINE_HISTORY_H)
+#include <editline/history.h>
+#endif
+#elif defined(HAVE_READLINE_H)
+#include <readline.h>
+#if defined(HAVE_HISTORY_H)
+#include <history.h>
+#endif
+#endif /* HAVE_READLINE_READLINE_H, etc */
+#endif /* HAVE_LIBREADLINE */
+
+#include "pqexpbuffer.h"
+
+
+extern char *gets_interactive(const char *prompt, PQExpBuffer query_buf);
+extern char *gets_fromFile(FILE *source);
+
+extern void initializeInput(int flags);
+
+extern bool printHistory(const char *fname, unsigned short int pager);
+
+extern void pg_append_history(const char *s, PQExpBuffer history_buf);
+extern void pg_send_history(PQExpBuffer history_buf);
+
+#endif /* INPUT_H */
diff --git a/src/bin/psql/large_obj.c b/src/bin/psql/large_obj.c
new file mode 100644
index 0000000..64338d5
--- /dev/null
+++ b/src/bin/psql/large_obj.c
@@ -0,0 +1,264 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/large_obj.c
+ */
+#include "postgres_fe.h"
+
+#include "common.h"
+#include "common/logging.h"
+#include "fe_utils/cancel.h"
+#include "large_obj.h"
+#include "settings.h"
+
+static void print_lo_result(const char *fmt,...) pg_attribute_printf(1, 2);
+
+static void
+print_lo_result(const char *fmt,...)
+{
+ va_list ap;
+
+ if (!pset.quiet)
+ {
+ if (pset.popt.topt.format == PRINT_HTML)
+ fputs("<p>", pset.queryFout);
+
+ va_start(ap, fmt);
+ vfprintf(pset.queryFout, fmt, ap);
+ va_end(ap);
+
+ if (pset.popt.topt.format == PRINT_HTML)
+ fputs("</p>\n", pset.queryFout);
+ else
+ fputs("\n", pset.queryFout);
+ }
+
+ if (pset.logfile)
+ {
+ va_start(ap, fmt);
+ vfprintf(pset.logfile, fmt, ap);
+ va_end(ap);
+ fputs("\n", pset.logfile);
+ }
+}
+
+
+/*
+ * Prepare to do a large-object operation. We *must* be inside a transaction
+ * block for all these operations, so start one if needed.
+ *
+ * Returns true if okay, false if failed. *own_transaction is set to indicate
+ * if we started our own transaction or not.
+ */
+static bool
+start_lo_xact(const char *operation, bool *own_transaction)
+{
+ PGTransactionStatusType tstatus;
+ PGresult *res;
+
+ *own_transaction = false;
+
+ if (!pset.db)
+ {
+ pg_log_error("%s: not connected to a database", operation);
+ return false;
+ }
+
+ tstatus = PQtransactionStatus(pset.db);
+
+ switch (tstatus)
+ {
+ case PQTRANS_IDLE:
+ /* need to start our own xact */
+ if (!(res = PSQLexec("BEGIN")))
+ return false;
+ PQclear(res);
+ *own_transaction = true;
+ break;
+ case PQTRANS_INTRANS:
+ /* use the existing xact */
+ break;
+ case PQTRANS_INERROR:
+ pg_log_error("%s: current transaction is aborted", operation);
+ return false;
+ default:
+ pg_log_error("%s: unknown transaction status", operation);
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * Clean up after a successful LO operation
+ */
+static bool
+finish_lo_xact(const char *operation, bool own_transaction)
+{
+ PGresult *res;
+
+ if (own_transaction && pset.autocommit)
+ {
+ /* close out our own xact */
+ if (!(res = PSQLexec("COMMIT")))
+ {
+ res = PSQLexec("ROLLBACK");
+ PQclear(res);
+ return false;
+ }
+ PQclear(res);
+ }
+
+ return true;
+}
+
+/*
+ * Clean up after a failed LO operation
+ */
+static bool
+fail_lo_xact(const char *operation, bool own_transaction)
+{
+ PGresult *res;
+
+ if (own_transaction && pset.autocommit)
+ {
+ /* close out our own xact */
+ res = PSQLexec("ROLLBACK");
+ PQclear(res);
+ }
+
+ return false; /* always */
+}
+
+
+/*
+ * do_lo_export()
+ *
+ * Write a large object to a file
+ */
+bool
+do_lo_export(const char *loid_arg, const char *filename_arg)
+{
+ int status;
+ bool own_transaction;
+
+ if (!start_lo_xact("\\lo_export", &own_transaction))
+ return false;
+
+ SetCancelConn(NULL);
+ status = lo_export(pset.db, atooid(loid_arg), filename_arg);
+ ResetCancelConn();
+
+ /* of course this status is documented nowhere :( */
+ if (status != 1)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ return fail_lo_xact("\\lo_export", own_transaction);
+ }
+
+ if (!finish_lo_xact("\\lo_export", own_transaction))
+ return false;
+
+ print_lo_result("lo_export");
+
+ return true;
+}
+
+
+/*
+ * do_lo_import()
+ *
+ * Copy large object from file to database
+ */
+bool
+do_lo_import(const char *filename_arg, const char *comment_arg)
+{
+ PGresult *res;
+ Oid loid;
+ char oidbuf[32];
+ bool own_transaction;
+
+ if (!start_lo_xact("\\lo_import", &own_transaction))
+ return false;
+
+ SetCancelConn(NULL);
+ loid = lo_import(pset.db, filename_arg);
+ ResetCancelConn();
+
+ if (loid == InvalidOid)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ return fail_lo_xact("\\lo_import", own_transaction);
+ }
+
+ /* insert description if given */
+ if (comment_arg)
+ {
+ char *cmdbuf;
+ char *bufptr;
+ size_t slen = strlen(comment_arg);
+
+ cmdbuf = pg_malloc_extended(slen * 2 + 256, MCXT_ALLOC_NO_OOM);
+ if (!cmdbuf)
+ return fail_lo_xact("\\lo_import", own_transaction);
+ sprintf(cmdbuf, "COMMENT ON LARGE OBJECT %u IS '", loid);
+ bufptr = cmdbuf + strlen(cmdbuf);
+ bufptr += PQescapeStringConn(pset.db, bufptr, comment_arg, slen, NULL);
+ strcpy(bufptr, "'");
+
+ if (!(res = PSQLexec(cmdbuf)))
+ {
+ free(cmdbuf);
+ return fail_lo_xact("\\lo_import", own_transaction);
+ }
+
+ PQclear(res);
+ free(cmdbuf);
+ }
+
+ if (!finish_lo_xact("\\lo_import", own_transaction))
+ return false;
+
+ print_lo_result("lo_import %u", loid);
+
+ sprintf(oidbuf, "%u", loid);
+ SetVariable(pset.vars, "LASTOID", oidbuf);
+
+ return true;
+}
+
+
+/*
+ * do_lo_unlink()
+ *
+ * removes a large object out of the database
+ */
+bool
+do_lo_unlink(const char *loid_arg)
+{
+ int status;
+ Oid loid = atooid(loid_arg);
+ bool own_transaction;
+
+ if (!start_lo_xact("\\lo_unlink", &own_transaction))
+ return false;
+
+ SetCancelConn(NULL);
+ status = lo_unlink(pset.db, loid);
+ ResetCancelConn();
+
+ if (status == -1)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ return fail_lo_xact("\\lo_unlink", own_transaction);
+ }
+
+ if (!finish_lo_xact("\\lo_unlink", own_transaction))
+ return false;
+
+ print_lo_result("lo_unlink %u", loid);
+
+ return true;
+}
diff --git a/src/bin/psql/large_obj.h b/src/bin/psql/large_obj.h
new file mode 100644
index 0000000..1242ea5
--- /dev/null
+++ b/src/bin/psql/large_obj.h
@@ -0,0 +1,15 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/large_obj.h
+ */
+#ifndef LARGE_OBJ_H
+#define LARGE_OBJ_H
+
+bool do_lo_export(const char *loid_arg, const char *filename_arg);
+bool do_lo_import(const char *filename_arg, const char *comment_arg);
+bool do_lo_unlink(const char *loid_arg);
+
+#endif /* LARGE_OBJ_H */
diff --git a/src/bin/psql/mainloop.c b/src/bin/psql/mainloop.c
new file mode 100644
index 0000000..b0c4177
--- /dev/null
+++ b/src/bin/psql/mainloop.c
@@ -0,0 +1,662 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/mainloop.c
+ */
+#include "postgres_fe.h"
+
+#include "command.h"
+#include "common.h"
+#include "common/logging.h"
+#include "input.h"
+#include "mainloop.h"
+#include "mb/pg_wchar.h"
+#include "prompt.h"
+#include "settings.h"
+
+/* callback functions for our flex lexer */
+const PsqlScanCallbacks psqlscan_callbacks = {
+ psql_get_variable,
+};
+
+
+/*
+ * Main processing loop for reading lines of input
+ * and sending them to the backend.
+ *
+ * This loop is re-entrant. May be called by \i command
+ * which reads input from a file.
+ */
+int
+MainLoop(FILE *source)
+{
+ PsqlScanState scan_state; /* lexer working state */
+ ConditionalStack cond_stack; /* \if status stack */
+ volatile PQExpBuffer query_buf; /* buffer for query being accumulated */
+ volatile PQExpBuffer previous_buf; /* if there isn't anything in the new
+ * buffer yet, use this one for \e,
+ * etc. */
+ PQExpBuffer history_buf; /* earlier lines of a multi-line command, not
+ * yet saved to readline history */
+ char *line; /* current line of input */
+ int added_nl_pos;
+ bool success;
+ bool line_saved_in_history;
+ volatile int successResult = EXIT_SUCCESS;
+ volatile backslashResult slashCmdStatus = PSQL_CMD_UNKNOWN;
+ volatile promptStatus_t prompt_status = PROMPT_READY;
+ volatile bool need_redisplay = false;
+ volatile int count_eof = 0;
+ volatile bool die_on_error = false;
+ FILE *prev_cmd_source;
+ bool prev_cmd_interactive;
+ uint64 prev_lineno;
+
+ /* Save the prior command source */
+ prev_cmd_source = pset.cur_cmd_source;
+ prev_cmd_interactive = pset.cur_cmd_interactive;
+ prev_lineno = pset.lineno;
+ /* pset.stmt_lineno does not need to be saved and restored */
+
+ /* Establish new source */
+ pset.cur_cmd_source = source;
+ pset.cur_cmd_interactive = ((source == stdin) && !pset.notty);
+ pset.lineno = 0;
+ pset.stmt_lineno = 1;
+
+ /* Create working state */
+ scan_state = psql_scan_create(&psqlscan_callbacks);
+ cond_stack = conditional_stack_create();
+ psql_scan_set_passthrough(scan_state, (void *) cond_stack);
+
+ query_buf = createPQExpBuffer();
+ previous_buf = createPQExpBuffer();
+ history_buf = createPQExpBuffer();
+ if (PQExpBufferBroken(query_buf) ||
+ PQExpBufferBroken(previous_buf) ||
+ PQExpBufferBroken(history_buf))
+ pg_fatal("out of memory");
+
+ /* main loop to get queries and execute them */
+ while (successResult == EXIT_SUCCESS)
+ {
+ /*
+ * Clean up after a previous Control-C
+ */
+ if (cancel_pressed)
+ {
+ if (!pset.cur_cmd_interactive)
+ {
+ /*
+ * You get here if you stopped a script with Ctrl-C.
+ */
+ successResult = EXIT_USER;
+ break;
+ }
+
+ cancel_pressed = false;
+ }
+
+ /*
+ * Establish longjmp destination for exiting from wait-for-input. We
+ * must re-do this each time through the loop for safety, since the
+ * jmpbuf might get changed during command execution.
+ */
+ if (sigsetjmp(sigint_interrupt_jmp, 1) != 0)
+ {
+ /* got here with longjmp */
+
+ /* reset parsing state */
+ psql_scan_finish(scan_state);
+ psql_scan_reset(scan_state);
+ resetPQExpBuffer(query_buf);
+ resetPQExpBuffer(history_buf);
+ count_eof = 0;
+ slashCmdStatus = PSQL_CMD_UNKNOWN;
+ prompt_status = PROMPT_READY;
+ need_redisplay = false;
+ pset.stmt_lineno = 1;
+ cancel_pressed = false;
+
+ if (pset.cur_cmd_interactive)
+ {
+ putc('\n', stdout);
+
+ /*
+ * if interactive user is in an \if block, then Ctrl-C will
+ * exit from the innermost \if.
+ */
+ if (!conditional_stack_empty(cond_stack))
+ {
+ pg_log_error("\\if: escaped");
+ conditional_stack_pop(cond_stack);
+ }
+ }
+ else
+ {
+ successResult = EXIT_USER;
+ break;
+ }
+ }
+
+ fflush(stdout);
+
+ /*
+ * get another line
+ */
+ if (pset.cur_cmd_interactive)
+ {
+ /* May need to reset prompt, eg after \r command */
+ if (query_buf->len == 0)
+ prompt_status = PROMPT_READY;
+ /* If query buffer came from \e, redisplay it with a prompt */
+ if (need_redisplay)
+ {
+ if (query_buf->len > 0)
+ {
+ fputs(get_prompt(PROMPT_READY, cond_stack), stdout);
+ fputs(query_buf->data, stdout);
+ fflush(stdout);
+ }
+ need_redisplay = false;
+ }
+ /* Now we can fetch a line */
+ line = gets_interactive(get_prompt(prompt_status, cond_stack),
+ query_buf);
+ }
+ else
+ {
+ line = gets_fromFile(source);
+ if (!line && ferror(source))
+ successResult = EXIT_FAILURE;
+ }
+
+ /*
+ * query_buf holds query already accumulated. line is the malloc'd
+ * new line of input (note it must be freed before looping around!)
+ */
+
+ /* No more input. Time to quit, or \i done */
+ if (line == NULL)
+ {
+ if (pset.cur_cmd_interactive)
+ {
+ /* This tries to mimic bash's IGNOREEOF feature. */
+ count_eof++;
+
+ if (count_eof < pset.ignoreeof)
+ {
+ if (!pset.quiet)
+ printf(_("Use \"\\q\" to leave %s.\n"), pset.progname);
+ continue;
+ }
+
+ puts(pset.quiet ? "" : "\\q");
+ }
+ break;
+ }
+
+ count_eof = 0;
+
+ pset.lineno++;
+
+ /* ignore UTF-8 Unicode byte-order mark */
+ if (pset.lineno == 1 && pset.encoding == PG_UTF8 && strncmp(line, "\xef\xbb\xbf", 3) == 0)
+ memmove(line, line + 3, strlen(line + 3) + 1);
+
+ /* Detect attempts to run custom-format dumps as SQL scripts */
+ if (pset.lineno == 1 && !pset.cur_cmd_interactive &&
+ strncmp(line, "PGDMP", 5) == 0)
+ {
+ free(line);
+ puts(_("The input is a PostgreSQL custom-format dump.\n"
+ "Use the pg_restore command-line client to restore this dump to a database.\n"));
+ fflush(stdout);
+ successResult = EXIT_FAILURE;
+ break;
+ }
+
+ /* no further processing of empty lines, unless within a literal */
+ if (line[0] == '\0' && !psql_scan_in_quote(scan_state))
+ {
+ free(line);
+ continue;
+ }
+
+ /* Recognize "help", "quit", "exit" only in interactive mode */
+ if (pset.cur_cmd_interactive)
+ {
+ char *first_word = line;
+ char *rest_of_line = NULL;
+ bool found_help = false;
+ bool found_exit_or_quit = false;
+ bool found_q = false;
+
+ /*
+ * The assistance words, help/exit/quit, must have no whitespace
+ * before them, and only whitespace after, with an optional
+ * semicolon. This prevents indented use of these words, perhaps
+ * as identifiers, from invoking the assistance behavior.
+ */
+ if (pg_strncasecmp(first_word, "help", 4) == 0)
+ {
+ rest_of_line = first_word + 4;
+ found_help = true;
+ }
+ else if (pg_strncasecmp(first_word, "exit", 4) == 0 ||
+ pg_strncasecmp(first_word, "quit", 4) == 0)
+ {
+ rest_of_line = first_word + 4;
+ found_exit_or_quit = true;
+ }
+ else if (strncmp(first_word, "\\q", 2) == 0)
+ {
+ rest_of_line = first_word + 2;
+ found_q = true;
+ }
+
+ /*
+ * If we found a command word, check whether the rest of the line
+ * contains only whitespace plus maybe one semicolon. If not,
+ * ignore the command word after all. These commands are only for
+ * compatibility with other SQL clients and are not documented.
+ */
+ if (rest_of_line != NULL)
+ {
+ /*
+ * Ignore unless rest of line is whitespace, plus maybe one
+ * semicolon
+ */
+ while (isspace((unsigned char) *rest_of_line))
+ ++rest_of_line;
+ if (*rest_of_line == ';')
+ ++rest_of_line;
+ while (isspace((unsigned char) *rest_of_line))
+ ++rest_of_line;
+ if (*rest_of_line != '\0')
+ {
+ found_help = false;
+ found_exit_or_quit = false;
+ }
+ }
+
+ /*
+ * "help" is only a command when the query buffer is empty, but we
+ * emit a one-line message even when it isn't to help confused
+ * users. The text is still added to the query buffer in that
+ * case.
+ */
+ if (found_help)
+ {
+ if (query_buf->len != 0)
+#ifndef WIN32
+ puts(_("Use \\? for help or press control-C to clear the input buffer."));
+#else
+ puts(_("Use \\? for help."));
+#endif
+ else
+ {
+ puts(_("You are using psql, the command-line interface to PostgreSQL."));
+ printf(_("Type: \\copyright for distribution terms\n"
+ " \\h for help with SQL commands\n"
+ " \\? for help with psql commands\n"
+ " \\g or terminate with semicolon to execute query\n"
+ " \\q to quit\n"));
+ free(line);
+ fflush(stdout);
+ continue;
+ }
+ }
+
+ /*
+ * "quit" and "exit" are only commands when the query buffer is
+ * empty, but we emit a one-line message even when it isn't to
+ * help confused users. The text is still added to the query
+ * buffer in that case.
+ */
+ if (found_exit_or_quit)
+ {
+ if (query_buf->len != 0)
+ {
+ if (prompt_status == PROMPT_READY ||
+ prompt_status == PROMPT_CONTINUE ||
+ prompt_status == PROMPT_PAREN)
+ puts(_("Use \\q to quit."));
+ else
+#ifndef WIN32
+ puts(_("Use control-D to quit."));
+#else
+ puts(_("Use control-C to quit."));
+#endif
+ }
+ else
+ {
+ /* exit app */
+ free(line);
+ fflush(stdout);
+ successResult = EXIT_SUCCESS;
+ break;
+ }
+ }
+
+ /*
+ * If they typed "\q" in a place where "\q" is not active, supply
+ * a hint. The text is still added to the query buffer.
+ */
+ if (found_q && query_buf->len != 0 &&
+ prompt_status != PROMPT_READY &&
+ prompt_status != PROMPT_CONTINUE &&
+ prompt_status != PROMPT_PAREN)
+#ifndef WIN32
+ puts(_("Use control-D to quit."));
+#else
+ puts(_("Use control-C to quit."));
+#endif
+ }
+
+ /* echo back if flag is set, unless interactive */
+ if (pset.echo == PSQL_ECHO_ALL && !pset.cur_cmd_interactive)
+ {
+ puts(line);
+ fflush(stdout);
+ }
+
+ /* insert newlines into query buffer between source lines */
+ if (query_buf->len > 0)
+ {
+ appendPQExpBufferChar(query_buf, '\n');
+ added_nl_pos = query_buf->len;
+ }
+ else
+ added_nl_pos = -1; /* flag we didn't add one */
+
+ /* Setting this will not have effect until next line. */
+ die_on_error = pset.on_error_stop;
+
+ /*
+ * Parse line, looking for command separators.
+ */
+ psql_scan_setup(scan_state, line, strlen(line),
+ pset.encoding, standard_strings());
+ success = true;
+ line_saved_in_history = false;
+
+ while (success || !die_on_error)
+ {
+ PsqlScanResult scan_result;
+ promptStatus_t prompt_tmp = prompt_status;
+ size_t pos_in_query;
+ char *tmp_line;
+
+ pos_in_query = query_buf->len;
+ scan_result = psql_scan(scan_state, query_buf, &prompt_tmp);
+ prompt_status = prompt_tmp;
+
+ if (PQExpBufferBroken(query_buf))
+ pg_fatal("out of memory");
+
+ /*
+ * Increase statement line number counter for each linebreak added
+ * to the query buffer by the last psql_scan() call. There only
+ * will be ones to add when navigating to a statement in
+ * readline's history containing newlines.
+ */
+ tmp_line = query_buf->data + pos_in_query;
+ while (*tmp_line != '\0')
+ {
+ if (*(tmp_line++) == '\n')
+ pset.stmt_lineno++;
+ }
+
+ if (scan_result == PSCAN_EOL)
+ pset.stmt_lineno++;
+
+ /*
+ * Send command if semicolon found, or if end of line and we're in
+ * single-line mode.
+ */
+ if (scan_result == PSCAN_SEMICOLON ||
+ (scan_result == PSCAN_EOL && pset.singleline))
+ {
+ /*
+ * Save line in history. We use history_buf to accumulate
+ * multi-line queries into a single history entry. Note that
+ * history accumulation works on input lines, so it doesn't
+ * matter whether the query will be ignored due to \if.
+ */
+ if (pset.cur_cmd_interactive && !line_saved_in_history)
+ {
+ pg_append_history(line, history_buf);
+ pg_send_history(history_buf);
+ line_saved_in_history = true;
+ }
+
+ /* execute query unless we're in an inactive \if branch */
+ if (conditional_active(cond_stack))
+ {
+ success = SendQuery(query_buf->data);
+ slashCmdStatus = success ? PSQL_CMD_SEND : PSQL_CMD_ERROR;
+ pset.stmt_lineno = 1;
+
+ /* transfer query to previous_buf by pointer-swapping */
+ {
+ PQExpBuffer swap_buf = previous_buf;
+
+ previous_buf = query_buf;
+ query_buf = swap_buf;
+ }
+ resetPQExpBuffer(query_buf);
+
+ added_nl_pos = -1;
+ /* we need not do psql_scan_reset() here */
+ }
+ else
+ {
+ /* if interactive, warn about non-executed query */
+ if (pset.cur_cmd_interactive)
+ pg_log_error("query ignored; use \\endif or Ctrl-C to exit current \\if block");
+ /* fake an OK result for purposes of loop checks */
+ success = true;
+ slashCmdStatus = PSQL_CMD_SEND;
+ pset.stmt_lineno = 1;
+ /* note that query_buf doesn't change state */
+ }
+ }
+ else if (scan_result == PSCAN_BACKSLASH)
+ {
+ /* handle backslash command */
+
+ /*
+ * If we added a newline to query_buf, and nothing else has
+ * been inserted in query_buf by the lexer, then strip off the
+ * newline again. This avoids any change to query_buf when a
+ * line contains only a backslash command. Also, in this
+ * situation we force out any previous lines as a separate
+ * history entry; we don't want SQL and backslash commands
+ * intermixed in history if at all possible.
+ */
+ if (query_buf->len == added_nl_pos)
+ {
+ query_buf->data[--query_buf->len] = '\0';
+ pg_send_history(history_buf);
+ }
+ added_nl_pos = -1;
+
+ /* save backslash command in history */
+ if (pset.cur_cmd_interactive && !line_saved_in_history)
+ {
+ pg_append_history(line, history_buf);
+ pg_send_history(history_buf);
+ line_saved_in_history = true;
+ }
+
+ /* execute backslash command */
+ slashCmdStatus = HandleSlashCmds(scan_state,
+ cond_stack,
+ query_buf,
+ previous_buf);
+
+ success = slashCmdStatus != PSQL_CMD_ERROR;
+
+ /*
+ * Resetting stmt_lineno after a backslash command isn't
+ * always appropriate, but it's what we've done historically
+ * and there have been few complaints.
+ */
+ pset.stmt_lineno = 1;
+
+ if (slashCmdStatus == PSQL_CMD_SEND)
+ {
+ /* should not see this in inactive branch */
+ Assert(conditional_active(cond_stack));
+
+ success = SendQuery(query_buf->data);
+
+ /* transfer query to previous_buf by pointer-swapping */
+ {
+ PQExpBuffer swap_buf = previous_buf;
+
+ previous_buf = query_buf;
+ query_buf = swap_buf;
+ }
+ resetPQExpBuffer(query_buf);
+
+ /* flush any paren nesting info after forced send */
+ psql_scan_reset(scan_state);
+ }
+ else if (slashCmdStatus == PSQL_CMD_NEWEDIT)
+ {
+ /* should not see this in inactive branch */
+ Assert(conditional_active(cond_stack));
+ /* ensure what came back from editing ends in a newline */
+ if (query_buf->len > 0 &&
+ query_buf->data[query_buf->len - 1] != '\n')
+ appendPQExpBufferChar(query_buf, '\n');
+ /* rescan query_buf as new input */
+ psql_scan_finish(scan_state);
+ free(line);
+ line = pg_strdup(query_buf->data);
+ resetPQExpBuffer(query_buf);
+ /* reset parsing state since we are rescanning whole line */
+ psql_scan_reset(scan_state);
+ psql_scan_setup(scan_state, line, strlen(line),
+ pset.encoding, standard_strings());
+ line_saved_in_history = false;
+ prompt_status = PROMPT_READY;
+ /* we'll want to redisplay after parsing what we have */
+ need_redisplay = true;
+ }
+ else if (slashCmdStatus == PSQL_CMD_TERMINATE)
+ break;
+ }
+
+ /* fall out of loop if lexer reached EOL */
+ if (scan_result == PSCAN_INCOMPLETE ||
+ scan_result == PSCAN_EOL)
+ break;
+ }
+
+ /*
+ * Add line to pending history if we didn't do so already. Then, if
+ * the query buffer is still empty, flush out any unsent history
+ * entry. This means that empty lines (containing only whitespace and
+ * perhaps a dash-dash comment) that precede a query will be recorded
+ * as separate history entries, not as part of that query.
+ */
+ if (pset.cur_cmd_interactive)
+ {
+ if (!line_saved_in_history)
+ pg_append_history(line, history_buf);
+ if (query_buf->len == 0)
+ pg_send_history(history_buf);
+ }
+
+ psql_scan_finish(scan_state);
+ free(line);
+
+ if (slashCmdStatus == PSQL_CMD_TERMINATE)
+ {
+ successResult = EXIT_SUCCESS;
+ break;
+ }
+
+ if (!pset.cur_cmd_interactive)
+ {
+ if (!success && die_on_error)
+ successResult = EXIT_USER;
+ /* Have we lost the db connection? */
+ else if (!pset.db)
+ successResult = EXIT_BADCONN;
+ }
+ } /* while !endoffile/session */
+
+ /*
+ * If we have a non-semicolon-terminated query at the end of file, we
+ * process it unless the input source is interactive --- in that case it
+ * seems better to go ahead and quit. Also skip if this is an error exit.
+ */
+ if (query_buf->len > 0 && !pset.cur_cmd_interactive &&
+ successResult == EXIT_SUCCESS)
+ {
+ /* save query in history */
+ /* currently unneeded since we don't use this block if interactive */
+#ifdef NOT_USED
+ if (pset.cur_cmd_interactive)
+ pg_send_history(history_buf);
+#endif
+
+ /* execute query unless we're in an inactive \if branch */
+ if (conditional_active(cond_stack))
+ {
+ success = SendQuery(query_buf->data);
+ }
+ else
+ {
+ if (pset.cur_cmd_interactive)
+ pg_log_error("query ignored; use \\endif or Ctrl-C to exit current \\if block");
+ success = true;
+ }
+
+ if (!success && die_on_error)
+ successResult = EXIT_USER;
+ else if (pset.db == NULL)
+ successResult = EXIT_BADCONN;
+ }
+
+ /*
+ * Check for unbalanced \if-\endifs unless user explicitly quit, or the
+ * script is erroring out
+ */
+ if (slashCmdStatus != PSQL_CMD_TERMINATE &&
+ successResult != EXIT_USER &&
+ !conditional_stack_empty(cond_stack))
+ {
+ pg_log_error("reached EOF without finding closing \\endif(s)");
+ if (die_on_error && !pset.cur_cmd_interactive)
+ successResult = EXIT_USER;
+ }
+
+ /*
+ * Let's just make real sure the SIGINT handler won't try to use
+ * sigint_interrupt_jmp after we exit this routine. If there is an outer
+ * MainLoop instance, it will reset sigint_interrupt_jmp to point to
+ * itself at the top of its loop, before any further interactive input
+ * happens.
+ */
+ sigint_interrupt_enabled = false;
+
+ destroyPQExpBuffer(query_buf);
+ destroyPQExpBuffer(previous_buf);
+ destroyPQExpBuffer(history_buf);
+
+ psql_scan_destroy(scan_state);
+ conditional_stack_destroy(cond_stack);
+
+ pset.cur_cmd_source = prev_cmd_source;
+ pset.cur_cmd_interactive = prev_cmd_interactive;
+ pset.lineno = prev_lineno;
+
+ return successResult;
+} /* MainLoop() */
diff --git a/src/bin/psql/mainloop.h b/src/bin/psql/mainloop.h
new file mode 100644
index 0000000..80e0c99
--- /dev/null
+++ b/src/bin/psql/mainloop.h
@@ -0,0 +1,17 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/mainloop.h
+ */
+#ifndef MAINLOOP_H
+#define MAINLOOP_H
+
+#include "fe_utils/psqlscan.h"
+
+extern const PsqlScanCallbacks psqlscan_callbacks;
+
+extern int MainLoop(FILE *source);
+
+#endif /* MAINLOOP_H */
diff --git a/src/bin/psql/nls.mk b/src/bin/psql/nls.mk
new file mode 100644
index 0000000..6e294b1
--- /dev/null
+++ b/src/bin/psql/nls.mk
@@ -0,0 +1,15 @@
+# src/bin/psql/nls.mk
+CATALOG_NAME = psql
+AVAIL_LANGUAGES = cs de el es fr it ja ka ko ru sv uk zh_CN
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ command.c common.c copy.c crosstabview.c help.c input.c large_obj.c \
+ mainloop.c psqlscanslash.c startup.c \
+ describe.c sql_help.h sql_help.c \
+ tab-complete.c variables.c \
+ ../../fe_utils/cancel.c ../../fe_utils/print.c ../../fe_utils/psqlscan.c \
+ ../../common/exec.c ../../common/fe_memutils.c ../../common/username.c \
+ ../../common/wait_error.c ../../port/thread.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \
+ HELP0 HELPN N_ simple_prompt simple_prompt_extended
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \
+ HELPN:1:c-format
diff --git a/src/bin/psql/po/cs.po b/src/bin/psql/po/cs.po
new file mode 100644
index 0000000..45771e1
--- /dev/null
+++ b/src/bin/psql/po/cs.po
@@ -0,0 +1,6603 @@
+# Czech translation of psql
+#
+# pgtranslation Id: psql.po,v 1.6 2011/09/08 18:23:06 petere Exp $
+# Karel Žák, 2001-2003, 2004.
+# Zdeněk Kotala, 2009, 2011, 2012, 2013.
+# Tomáš Vondra <tv@fuzzy.cz>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: psql-cs (PostgreSQL 9.3)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:14+0000\n"
+"PO-Revision-Date: 2020-11-01 00:59+0100\n"
+"Last-Translator: Tomas Vondra <tv@fuzzy.cz>\n"
+"Language-Team: Czech <info@cspug.cx>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "fatal: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "nelze získat aktuální adresář: %m"
+
+#: ../../common/exec.c:156
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "neplatný binární soubor\"%s\""
+
+#: ../../common/exec.c:206
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "nelze číst binární soubor \"%s\""
+
+#: ../../common/exec.c:214
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "nelze najít příkaz \"%s\" ke spuštění"
+
+#: ../../common/exec.c:270 ../../common/exec.c:309
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "nelze změnit adresář na \"%s\" : %m"
+
+#: ../../common/exec.c:287
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "nelze přečíst symbolický odkaz \"%s\": %m"
+
+#: ../../common/exec.c:410
+#, c-format
+msgid "pclose failed: %m"
+msgstr "volání pclose selhalo: %m"
+
+#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676
+#: command.c:1255 command.c:3146 command.c:3195 command.c:3307 input.c:227
+#: mainloop.c:81 mainloop.c:402
+#, c-format
+msgid "out of memory"
+msgstr "nedostatek paměti"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "nedostatek paměti\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nelze duplikovat null pointer (interní chyba)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "nelze načíst efektivní user ID \"%ld\": %s"
+
+#: ../../common/username.c:45 command.c:559
+msgid "user does not exist"
+msgstr "uživatel neexistuje"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "vyhledávání uživatele selhalo: chybový kód %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "příkaz není spustitelný"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "příkaz nenalezen"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "potomek skončil s návratovým kódem %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "potomek byl ukončen výjimkou 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "potomek byl ukončen signálem %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "potomek skončil s nerozponaným stavem %d"
+
+#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206
+msgid "Cancel request sent\n"
+msgstr "Požadavek na zrušení byl poslán\n"
+
+#: ../../fe_utils/cancel.c:165
+msgid "Could not send cancel request: "
+msgstr "Nelze poslat požadavek na zrušení: "
+
+#: ../../fe_utils/cancel.c:210
+#, c-format
+msgid "Could not send cancel request: %s"
+msgstr "Nelze poslat požadavek na zrušení: %s"
+
+#: ../../fe_utils/print.c:350
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu řádka)"
+msgstr[1] "(%lu řádky)"
+msgstr[2] "(%lu řádek)"
+
+#: ../../fe_utils/print.c:3055
+#, c-format
+msgid "Interrupted\n"
+msgstr "Přerušeno\n"
+
+#: ../../fe_utils/print.c:3119
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Nelze přidat hlavičku k obsahu tabulky: překročen počet sloupců %d.\n"
+
+#: ../../fe_utils/print.c:3159
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Nelze přidat buňku do obsahu tabulky: překročen celkový počet buněk %d.\n"
+
+#: ../../fe_utils/print.c:3414
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "specifikován neplatný formát výstupu (interní chyba): %d"
+
+#: ../../fe_utils/psqlscan.l:694
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "přeskakuji rekursivní expanzi proměnné \"%s\""
+
+#: command.c:224
+#, c-format
+msgid "invalid command \\%s"
+msgstr "neplatný příkaz \\%s"
+
+#: command.c:226
+#, c-format
+msgid "Try \\? for help."
+msgstr "Zkuste \\? pro zobrazení nápovědy."
+
+#: command.c:244
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: nadbytečný argument \"%s\" ignorován"
+
+#: command.c:296
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "\\%s příkaz ignorován; použijte \\endif nebo Ctrl-C pro ukončení aktuálního \\if bloku"
+
+#: command.c:557
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "nelze získat domácí adresář pro uživatele ID %ld: %s"
+
+#: command.c:575
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: nelze změnit adresář na \"%s\": %m"
+
+#: command.c:600
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "Aktuálně nejste připojeni k databázi.\n"
+
+#: command.c:613
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Nyní jste připojeni k databázi \"%s\" jako uživatel \"%s\" na adrese \"%s\" na portu\"%s\".\n"
+
+#: command.c:616
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Jste připojeni k databázi \"%s\" jako uživatel \"%s\" přes socket v \"%s\" naportu \"%s\".\n"
+
+#: command.c:622
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Nyní jste připojeni k databázi \"%s\" jako uživatel \"%s\" na serveru \"%s\" (adresa \"%s\") na portu\"%s\".\n"
+
+#: command.c:625
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Nyní jste připojeni k databázi \"%s\" jako uživatel \"%s\" na serveru \"%s\" na portu\"%s\".\n"
+
+#: command.c:965 command.c:1061 command.c:2550
+#, c-format
+msgid "no query buffer"
+msgstr "v historii není žádný dotaz"
+
+#: command.c:998 command.c:5139
+#, c-format
+msgid "invalid line number: %s"
+msgstr "neplatné číslo řádky: %s"
+
+#: command.c:1052
+#, c-format
+msgid "The server (version %s) does not support editing function source."
+msgstr "Server (verze %s) nepodporuje editaci zdrojového kódu funkce."
+
+#: command.c:1055
+#, c-format
+msgid "The server (version %s) does not support editing view definitions."
+msgstr "Server (verze %s) nepodporuje editaci definice pohledu."
+
+#: command.c:1137
+msgid "No changes"
+msgstr "Žádné změny"
+
+#: command.c:1216
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: neplatné jméno kódování nebo nenalezena konverzní funkce"
+
+#: command.c:1251 command.c:1992 command.c:3142 command.c:3329 command.c:5241
+#: common.c:174 common.c:223 common.c:388 common.c:1237 common.c:1265
+#: common.c:1373 common.c:1480 common.c:1518 copy.c:488 copy.c:707 help.c:62
+#: large_obj.c:157 large_obj.c:192 large_obj.c:254
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1258
+msgid "There is no previous error."
+msgstr "Žádná předchozí chyba."
+
+#: command.c:1371
+#, c-format
+#| msgid "Missing left parenthesis."
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: chybějící pravá závorka"
+
+#: command.c:1548 command.c:1853 command.c:1867 command.c:1884 command.c:2044
+#: command.c:2281 command.c:2517 command.c:2557
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: chybí požadovaný argument"
+
+#: command.c:1679
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: nemůže být zadáno po \\else"
+
+#: command.c:1684
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: žádné odpovídající \\if"
+
+#: command.c:1748
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: nemůže být zadáno po \\else"
+
+#: command.c:1753
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: žádné odpovídající \\if"
+
+#: command.c:1793
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: žádné odpovídající \\if"
+
+#: command.c:1948
+msgid "Query buffer is empty."
+msgstr "Buffer dotazů je prázdný."
+
+#: command.c:1970
+msgid "Enter new password: "
+msgstr "Zadejte nové heslo: "
+
+#: command.c:1971
+msgid "Enter it again: "
+msgstr "Zadejte znova: "
+
+#: command.c:1975
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Hesla se neshodují."
+
+#: command.c:2074
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: nelze načíst hodnotu proměnné"
+
+#: command.c:2177
+msgid "Query buffer reset (cleared)."
+msgstr "Buffer dotazů vyprázdněn."
+
+#: command.c:2199
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "Historie zapsána do souboru: \"%s\".\n"
+
+#: command.c:2286
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: název proměnné prostředí nesmí obsahovat \"=\""
+
+#: command.c:2347
+#, c-format
+msgid "The server (version %s) does not support showing function source."
+msgstr "Server (verze %s) nepodporuje zobrazování zdrojového kódu funkce."
+
+#: command.c:2350
+#, c-format
+msgid "The server (version %s) does not support showing view definitions."
+msgstr "Server (verze %s) nepodporuje zobrazování definice pohledu."
+
+#: command.c:2357
+#, c-format
+msgid "function name is required"
+msgstr "function name is required"
+
+#: command.c:2359
+#, c-format
+msgid "view name is required"
+msgstr "je vyžadováno jméno pohledu"
+
+#: command.c:2489
+msgid "Timing is on."
+msgstr "Sledování času je zapnuto."
+
+#: command.c:2491
+msgid "Timing is off."
+msgstr "Sledování času je vypnuto."
+
+#: command.c:2576 command.c:2604 command.c:3739 command.c:3742 command.c:3745
+#: command.c:3751 command.c:3753 command.c:3761 command.c:3771 command.c:3780
+#: command.c:3794 command.c:3811 command.c:3869 common.c:70 copy.c:331
+#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:2988 startup.c:236 startup.c:287
+msgid "Password: "
+msgstr "Heslo: "
+
+#: command.c:2993 startup.c:284
+#, c-format
+msgid "Password for user %s: "
+msgstr "Heslo pro uživatele %s: "
+
+#: command.c:3046
+#, c-format
+msgid "All connection parameters must be supplied because no database connection exists"
+msgstr "Všechny parametry musí být zadány protože žádné připojení k databázi neexistuje"
+
+#: command.c:3335
+#, c-format
+msgid "Previous connection kept"
+msgstr "Předchozí spojení zachováno"
+
+#: command.c:3341
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3388
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Nyní jste připojeni k databázi \"%s\" jako uživatel \"%s\" na adrese \"%s\" na portu\"%s\".\n"
+
+#: command.c:3391
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+
+#: command.c:3397
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Nyní jste připojeni k databázi \"%s\" jako uživatel \"%s\" na serveru \"%s\" (adresa \"%s\") na portu\"%s\".\n"
+
+#: command.c:3400
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Nyní jste připojeni k databázi \"%s\" jako uživatel \"%s\" na serveru \"%s\" na portu\"%s\".\n"
+
+#: command.c:3405
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Nyní jste připojeni k databázi \"%s\" jako uživatel \"%s\".\n"
+
+#: command.c:3438
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, server %s)\n"
+
+#: command.c:3446
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"VAROVÁNÍ: %s major verze %s, major verze serveru %s.\n"
+" Některé vlastnosti psql nemusí fungovat.\n"
+
+#: command.c:3485
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n"
+msgstr "SSL spojení (protokol: %s, šifra: %s, bitů: %s, komprese: %s)\n"
+
+#: command.c:3486 command.c:3487 command.c:3488
+msgid "unknown"
+msgstr "neznámé"
+
+#: command.c:3489 help.c:45
+msgid "off"
+msgstr "vypnuto"
+
+#: command.c:3489 help.c:45
+msgid "on"
+msgstr "zapnuto"
+
+#: command.c:3503
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "GSSAPI-šifrované spojení\n"
+
+#: command.c:3523
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"VAROVÁNÍ: Kódová stránka konzole (%u) není shodná s kódovou stránkou\n"
+" Windows (%u) 8-bitové znaky nemusí fungovat správně. Další\n"
+" informace najdete v manuálu k psql na stránce \"Poznámky pro\n"
+" uživatele Windows.\"\n"
+
+#: command.c:3627
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "proměnná prostředí PSQL_EDITOR_LINENUMBER_ARG musí být nastavena pro zadáníčísla řádky"
+
+#: command.c:3656
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "nelze spustit editor \"%s\""
+
+#: command.c:3658
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "nelze spustit /bin/sh"
+
+#: command.c:3696
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "nelze najít dočasný adresář: %s"
+
+#: command.c:3723
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "nelze otevřít dočasný soubor \"%s\": %m"
+
+#: command.c:4028
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: nejednoznačná zkratka \"%s\" odpovídá \"%s\" a \"%s\""
+
+#: command.c:4048
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: dovolené formáty jsou aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4067
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: povolené styly řádek jsou ascii, old-ascii, unicode"
+
+#: command.c:4082
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: povolené styly Unicode rámečků jsou single, double"
+
+#: command.c:4097
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: povolené styly Unicode sloupců jsou single, double"
+
+#: command.c:4112
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: povolené styly Unicode rámečků záhlaví single, double"
+
+#: command.c:4155
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep musí být jediný jedno-bytový znak"
+
+#: command.c:4160
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep nemůže být dvojitá uvozovka, nový řádek, nebo konec řádky"
+
+#: command.c:4297 command.c:4485
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: neznámá volba: %s"
+
+#: command.c:4317
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Styl rámečků je %d.\n"
+
+#: command.c:4323
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "Cílová šířka není nastavena.\n"
+
+#: command.c:4325
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "Cílová šířka je %d.\n"
+
+#: command.c:4332
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Rozšířené zobrazení zapnuto.\n"
+
+#: command.c:4334
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "Rozšířené zobrazení je zapnuto automaticky.\n"
+
+#: command.c:4336
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Rozšířené zobrazení vypnuto.\n"
+
+#: command.c:4342
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "Oddělovač polí pro CSV je '\"%s\"'.\n"
+
+#: command.c:4350 command.c:4358
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "Oddělovač polí je nulový byte.\n"
+
+#: command.c:4352
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "Oddělovač polí je '\"%s\"'.\n"
+
+#: command.c:4365
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Implicitní zápatí je zapnuto.\n"
+
+#: command.c:4367
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Implicitní zápatí je vypnuto.\n"
+
+#: command.c:4373
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Výstupní formát je %s.\n"
+
+#: command.c:4379
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Styl čar je %s.\n"
+
+#: command.c:4386
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Null je zobrazován jako '\"%s\"'.\n"
+
+#: command.c:4394
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "Zobrazení číselného výstupu dle národního nastavení je vypnuto.\n"
+
+#: command.c:4396
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "Zobrazení číselného výstupu dle národního nastavení je vypnuto.\n"
+
+#: command.c:4403
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "Stránkování je zapnuto pro dlouhé výstupy.\n"
+
+#: command.c:4405
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "Stránkování je vždy použito.\n"
+
+#: command.c:4407
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "Stránkování je vypnuto.\n"
+
+#: command.c:4413
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "Pager nebude použit pro méně než %d řáden.\n"
+msgstr[1] "Pager won't be used for less than %d lines.\n"
+msgstr[2] "Pager won't be used for less than %d lines.\n"
+
+#: command.c:4423 command.c:4433
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "Oddělovač záznamů je nulový byte.\n"
+
+#: command.c:4425
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "Oddělovač záznamů je <newline>.\n"
+
+#: command.c:4427
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "Oddělovač záznamů je '\"%s\"'.\n"
+
+#: command.c:4440
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Atributy tabulky jsou \"%s\".\n"
+
+#: command.c:4443
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Atributy tabulky nejsou nastaveny.\n"
+
+#: command.c:4450
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Nadpis je \"%s\".\n"
+
+#: command.c:4452
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Nadpis není nastaven.\n"
+
+#: command.c:4459
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "Zobrazování pouze záznamů je vypnuto.\n"
+
+#: command.c:4461
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "Zobrazování pouze záznamů je vypnuto.\n"
+
+#: command.c:4467
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Styl Unicode rámečků je \"%s\".\n"
+
+#: command.c:4473
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Styl Unicode sloupců je \"%s\".\n"
+
+#: command.c:4479
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Styl Unicode rámečků záhlaví je \"%s\".\n"
+
+#: command.c:4712
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: selhal"
+
+#: command.c:4737 common.c:648
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch neze použít s prázdným dotazem"
+
+#: command.c:4778
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (každé %gs)\n"
+
+#: command.c:4781
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (každé %gs)\n"
+
+#: command.c:4835 command.c:4842 common.c:548 common.c:555 common.c:1220
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* DOTAZ **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5034
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" není pohled"
+
+#: command.c:5050
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "nelze naparsovat pole reloptions"
+
+#: common.c:159
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "nelze escapovat bez aktivního spojení"
+
+#: common.c:200
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "argument shell příkazu obsahuje přechod na nový řádek nebo návrat na začátek (carriage return): \"%s\""
+
+#: common.c:304
+#, c-format
+msgid "connection to server was lost"
+msgstr "spojení na server bylo ztraceno"
+
+#: common.c:308
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "Spojení na server bylo ztraceno. Zkoušen restart: "
+
+#: common.c:313
+#, c-format
+msgid "Failed.\n"
+msgstr "Nepodařilo se.\n"
+
+#: common.c:326
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Podařilo se.\n"
+
+#: common.c:378 common.c:938 common.c:1155
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "neočekávaný PQresultStatus: %d"
+
+#: common.c:487
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Čas: %.3f ms\n"
+
+#: common.c:502
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Čas: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:511
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Čas: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:518
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Čas: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:542 common.c:600 common.c:1191
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Aktuálně nejste připojeni k databázi."
+
+#: common.c:655
+#, c-format
+msgid "\\watch cannot be used with COPY"
+msgstr "\\watch nelze použít s COPY"
+
+#: common.c:660
+#, c-format
+msgid "unexpected result status for \\watch"
+msgstr "neočekávaný stav výsledku pro \\watch"
+
+#: common.c:690
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "Asynchronní upozornění \"%s\" s obsahem \"%s\" obdrženo ze serverového procesu s PID %d.\n"
+
+#: common.c:693
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "Asynchronní upozornění \"%s\" obdrženo z procesu serveru s PID %d.\n"
+
+#: common.c:726 common.c:743
+#, c-format
+msgid "could not print result table: %m"
+msgstr "nelze číst vypsat tabulku: %m"
+
+#: common.c:764
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "žádné řádky nevráceny pro \\gset"
+
+#: common.c:769
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "více než jedna řádka vrácena pro \\gset"
+
+#: common.c:1200
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Krokovací mód: potvrďte příkaz)*******************************************\n"
+"%s\n"
+"***(stiskněte return pro zpracování nebo x a return pro zrušení)********************\n"
+
+#: common.c:1255
+#, c-format
+msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK."
+msgstr "Server (verze %s) nepodporuje savepoints pro ON_ERROR_ROLLBACK."
+
+#: common.c:1318
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "PŘÍKAZ: %s"
+
+#: common.c:1361
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "neočekávaný stav transakce: (%d)"
+
+#: common.c:1502 describe.c:2001
+msgid "Column"
+msgstr "Sloupec"
+
+#: common.c:1503 describe.c:177 describe.c:393 describe.c:411 describe.c:456
+#: describe.c:473 describe.c:962 describe.c:1126 describe.c:1711
+#: describe.c:1735 describe.c:2002 describe.c:3729 describe.c:3939
+#: describe.c:4172 describe.c:5378
+msgid "Type"
+msgstr "Typ"
+
+#: common.c:1552
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "Příkaz nevrátil žádný výsledek, nebo výsledek nemá žádné sloupce.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: argumenty jsou povinné"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: chyba na \"%s\""
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: chyba na konci řádku"
+
+#: copy.c:328
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "nelze spustit příkaz \"%s\": %m"
+
+#: copy.c:344
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "nelze provést stat souboru \"%s\": %m"
+
+#: copy.c:348
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: nelze kopírovat z/do adresáře"
+
+#: copy.c:385
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "nelze zavřít rouru (pipe) pro externí příkaz: %m"
+
+#: copy.c:390
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: copy.c:453 copy.c:463
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "nelze zapsat data příkazu COPY: %m"
+
+#: copy.c:469
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "přenos dat příkazu COPY selhal: %s"
+
+#: copy.c:530
+msgid "canceled by user"
+msgstr "zrušeno na žádost uživatele"
+
+# common.c:485
+#: copy.c:541
+msgid ""
+"Enter data to be copied followed by a newline.\n"
+"End with a backslash and a period on a line by itself, or an EOF signal."
+msgstr ""
+"Zadejte data pro kopírování následovaná novým řádkem.\n"
+"Ukončete zpětným lomítkem a tečkou na samostatném řádku."
+
+#: copy.c:669
+msgid "aborted because of read failure"
+msgstr "přerušeno z důvodu chyby čtení"
+
+#: copy.c:703
+msgid "trying to exit copy mode"
+msgstr "pokouším se opustit copy mód"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: příkaz nevrátil žádný výsledek"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: dotaz musí vracet alespoň tři sloupce"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: vertikální a horozintální záklaví musí být různé sloupce"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: datový sloupec musí být specifikován pokud má dotaz více než tři sloupce"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: maximální počet sloupců (%d) překročen"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: výsledek dotazu obsahuje několik hodnot pro řádek \"%s\", sloupec \"%s\""
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: číslo sloupce %d je mimo rozsah 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: nejednoznačný název sloupce: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: sloupec nenaleze: \"%s\""
+
+#: describe.c:75 describe.c:373 describe.c:678 describe.c:810 describe.c:954
+#: describe.c:1115 describe.c:1187 describe.c:3718 describe.c:3926
+#: describe.c:4170 describe.c:4261 describe.c:4528 describe.c:4688
+#: describe.c:4929 describe.c:5004 describe.c:5015 describe.c:5077
+#: describe.c:5502 describe.c:5585
+msgid "Schema"
+msgstr "Schéma"
+
+#: describe.c:76 describe.c:174 describe.c:242 describe.c:250 describe.c:374
+#: describe.c:679 describe.c:811 describe.c:872 describe.c:955 describe.c:1188
+#: describe.c:3719 describe.c:3927 describe.c:4093 describe.c:4171
+#: describe.c:4262 describe.c:4341 describe.c:4529 describe.c:4613
+#: describe.c:4689 describe.c:4930 describe.c:5005 describe.c:5016
+#: describe.c:5078 describe.c:5275 describe.c:5359 describe.c:5583
+#: describe.c:5755 describe.c:5995
+msgid "Name"
+msgstr "Jméno"
+
+#: describe.c:77 describe.c:386 describe.c:404 describe.c:450 describe.c:467
+msgid "Result data type"
+msgstr "Datový typ výsledku"
+
+#: describe.c:85 describe.c:98 describe.c:102 describe.c:387 describe.c:405
+#: describe.c:451 describe.c:468
+msgid "Argument data types"
+msgstr "Datový typ parametru"
+
+#: describe.c:110 describe.c:117 describe.c:185 describe.c:273 describe.c:513
+#: describe.c:727 describe.c:826 describe.c:897 describe.c:1190 describe.c:2020
+#: describe.c:3506 describe.c:3779 describe.c:3973 describe.c:4124
+#: describe.c:4198 describe.c:4271 describe.c:4354 describe.c:4437
+#: describe.c:4556 describe.c:4622 describe.c:4690 describe.c:4831
+#: describe.c:4873 describe.c:4946 describe.c:5008 describe.c:5017
+#: describe.c:5079 describe.c:5301 describe.c:5381 describe.c:5516
+#: describe.c:5586 large_obj.c:290 large_obj.c:300
+msgid "Description"
+msgstr "Popis"
+
+#: describe.c:135
+msgid "List of aggregate functions"
+msgstr "Seznam agregačních funkcí"
+
+#: describe.c:160
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "Server (verze %s) nepodporuje přístupové metody (access methods)."
+
+#: describe.c:175
+msgid "Index"
+msgstr "Index"
+
+#: describe.c:176 describe.c:3737 describe.c:3952 describe.c:5503
+msgid "Table"
+msgstr "Tabulka"
+
+#: describe.c:184 describe.c:5280
+msgid "Handler"
+msgstr "Handler"
+
+#: describe.c:203
+msgid "List of access methods"
+msgstr "Seznam přístupových metod"
+
+#: describe.c:229
+#, c-format
+msgid "The server (version %s) does not support tablespaces."
+msgstr "Server (verze %s) nepodporuje tablespaces."
+
+#: describe.c:243 describe.c:251 describe.c:501 describe.c:717 describe.c:873
+#: describe.c:1114 describe.c:3730 describe.c:3928 describe.c:4097
+#: describe.c:4343 describe.c:4614 describe.c:5276 describe.c:5360
+#: describe.c:5756 describe.c:5893 describe.c:5996 describe.c:6111
+#: describe.c:6190 large_obj.c:289
+msgid "Owner"
+msgstr "Vlastník"
+
+#: describe.c:244 describe.c:252
+msgid "Location"
+msgstr "Umístění"
+
+#: describe.c:263 describe.c:3323
+msgid "Options"
+msgstr "Volby"
+
+#: describe.c:268 describe.c:690 describe.c:889 describe.c:3771 describe.c:3775
+msgid "Size"
+msgstr "Velikost"
+
+#: describe.c:290
+msgid "List of tablespaces"
+msgstr "Seznam tablespaces"
+
+#: describe.c:333
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "pro \\df můžete použít pouze přepínače [anptwS+]"
+
+#: describe.c:341 describe.c:352
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "pro \\df nelze použít volbu \"%c\" ve verzi serveru %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:389 describe.c:407 describe.c:453 describe.c:470
+msgid "agg"
+msgstr "agg"
+
+#: describe.c:390 describe.c:408
+msgid "window"
+msgstr "window"
+
+#: describe.c:391
+msgid "proc"
+msgstr "proc"
+
+#: describe.c:392 describe.c:410 describe.c:455 describe.c:472
+msgid "func"
+msgstr "func"
+
+#: describe.c:409 describe.c:454 describe.c:471 describe.c:1324
+msgid "trigger"
+msgstr "trigger"
+
+#: describe.c:483
+msgid "immutable"
+msgstr "immutable"
+
+#: describe.c:484
+msgid "stable"
+msgstr "stable"
+
+#: describe.c:485
+msgid "volatile"
+msgstr "volatile"
+
+#: describe.c:486
+msgid "Volatility"
+msgstr "Volatilita"
+
+#: describe.c:494
+msgid "restricted"
+msgstr "restricted"
+
+#: describe.c:495
+msgid "safe"
+msgstr "safe"
+
+#: describe.c:496
+msgid "unsafe"
+msgstr "unsafe"
+
+#: describe.c:497
+msgid "Parallel"
+msgstr "Parallel"
+
+#: describe.c:502
+msgid "definer"
+msgstr "definer"
+
+#: describe.c:503
+msgid "invoker"
+msgstr "invoker"
+
+#: describe.c:504
+msgid "Security"
+msgstr "Bezpečnost"
+
+#: describe.c:511
+msgid "Language"
+msgstr "Jazyk"
+
+#: describe.c:512
+msgid "Source code"
+msgstr "Zdrojový kód"
+
+#: describe.c:641
+msgid "List of functions"
+msgstr "Seznam funkcí"
+
+#: describe.c:689
+msgid "Internal name"
+msgstr "Interní jméno"
+
+#: describe.c:711
+msgid "Elements"
+msgstr "Složky"
+
+#: describe.c:768
+msgid "List of data types"
+msgstr "Seznam datových typů"
+
+#: describe.c:812
+msgid "Left arg type"
+msgstr "Typ levého argumentu"
+
+#: describe.c:813
+msgid "Right arg type"
+msgstr "Typ pravého argumentu"
+
+#: describe.c:814
+msgid "Result type"
+msgstr "Typ výsledku"
+
+#: describe.c:819 describe.c:4349 describe.c:4414 describe.c:4420
+#: describe.c:4830 describe.c:6362 describe.c:6366
+msgid "Function"
+msgstr "Funkce"
+
+#: describe.c:844
+msgid "List of operators"
+msgstr "Seznam operátorů"
+
+#: describe.c:874
+msgid "Encoding"
+msgstr "Kódování"
+
+#: describe.c:879 describe.c:4530
+msgid "Collate"
+msgstr "Collation"
+
+#: describe.c:880 describe.c:4531
+msgid "Ctype"
+msgstr "CType"
+
+#: describe.c:893
+msgid "Tablespace"
+msgstr "Tablespace"
+
+#: describe.c:915
+msgid "List of databases"
+msgstr "Seznam databází"
+
+#: describe.c:956 describe.c:1117 describe.c:3720
+msgid "table"
+msgstr "tabulka"
+
+#: describe.c:957 describe.c:3721
+msgid "view"
+msgstr "pohled"
+
+#: describe.c:958 describe.c:3722
+msgid "materialized view"
+msgstr "materializovaný pohled"
+
+#: describe.c:959 describe.c:1119 describe.c:3724
+msgid "sequence"
+msgstr "sekvence"
+
+#: describe.c:960 describe.c:3726
+msgid "foreign table"
+msgstr "foreign_tabulka"
+
+#: describe.c:961 describe.c:3727 describe.c:3937
+msgid "partitioned table"
+msgstr "partitioned tabulka"
+
+#
+#: describe.c:973
+msgid "Column privileges"
+msgstr "Přístupová práva k atributům"
+
+#: describe.c:1004 describe.c:1038
+msgid "Policies"
+msgstr "Politiky"
+
+#: describe.c:1070 describe.c:6052 describe.c:6056
+msgid "Access privileges"
+msgstr "Přístupová práva"
+
+#: describe.c:1101
+#, c-format
+msgid "The server (version %s) does not support altering default privileges."
+msgstr "Server (verze %s) nepodporuje změny výchozích privilegií."
+
+#: describe.c:1121
+msgid "function"
+msgstr "funkce"
+
+#: describe.c:1123
+msgid "type"
+msgstr "typ"
+
+#: describe.c:1125
+msgid "schema"
+msgstr "schéma"
+
+#: describe.c:1149
+msgid "Default access privileges"
+msgstr "Implicitní přístupová práva"
+
+#: describe.c:1189
+msgid "Object"
+msgstr "Objekt"
+
+#: describe.c:1203
+msgid "table constraint"
+msgstr "omezení tabulky"
+
+#: describe.c:1225
+msgid "domain constraint"
+msgstr "omezení domény"
+
+#: describe.c:1253
+msgid "operator class"
+msgstr "třída operátorů"
+
+#: describe.c:1282
+msgid "operator family"
+msgstr "rodina operátorů"
+
+#: describe.c:1304
+msgid "rule"
+msgstr "rule"
+
+#: describe.c:1346
+msgid "Object descriptions"
+msgstr "Popis objektu"
+
+#: describe.c:1402 describe.c:3843
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Nelze nalézt relaci se jménem \"%s\"."
+
+#: describe.c:1405 describe.c:3846
+#, c-format
+msgid "Did not find any relations."
+msgstr "Nelze nalézt žádnou relaci."
+
+#: describe.c:1660
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Nelze nalézt relaci se OID %s."
+
+#: describe.c:1712 describe.c:1736
+msgid "Start"
+msgstr "Start"
+
+#: describe.c:1713 describe.c:1737
+msgid "Minimum"
+msgstr "Minimum"
+
+#: describe.c:1714 describe.c:1738
+msgid "Maximum"
+msgstr "Maximum"
+
+#: describe.c:1715 describe.c:1739
+msgid "Increment"
+msgstr "Inkrement"
+
+#: describe.c:1716 describe.c:1740 describe.c:1871 describe.c:4265
+#: describe.c:4431 describe.c:4545 describe.c:4550 describe.c:6099
+msgid "yes"
+msgstr "ano"
+
+#: describe.c:1717 describe.c:1741 describe.c:1872 describe.c:4265
+#: describe.c:4428 describe.c:4545 describe.c:6100
+msgid "no"
+msgstr "ne"
+
+#: describe.c:1718 describe.c:1742
+msgid "Cycles?"
+msgstr "Cycles?"
+
+#: describe.c:1719 describe.c:1743
+msgid "Cache"
+msgstr "Cache"
+
+#: describe.c:1786
+#, c-format
+msgid "Owned by: %s"
+msgstr "Vlastník: %s"
+
+#: describe.c:1790
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Sekvence pro identity sloupec: %s"
+
+#: describe.c:1797
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Sekvence \"%s.%s\""
+
+#: describe.c:1933
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Unlogged tabulka \"%s.%s\""
+
+#: describe.c:1936
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Tabulka \"%s.%s\""
+
+#: describe.c:1940
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Pohled \"%s.%s\""
+
+#: describe.c:1945
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Unlogged materializovaný pohled \"%s.%s\""
+
+#: describe.c:1948
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Materializovaný pohled \"%s.%s\""
+
+#: describe.c:1953
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Unlogged index \"%s.%s\""
+
+#: describe.c:1956
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Index \"%s.%s\""
+
+#: describe.c:1961
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Unlogged partitioned index \"%s.%s\""
+
+#: describe.c:1964
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Partitioned index \"%s.%s\""
+
+#: describe.c:1969
+#, c-format
+msgid "Special relation \"%s.%s\""
+msgstr "Speciální relace \"%s.%s\""
+
+#: describe.c:1973
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST tabulka \"%s.%s\""
+
+#: describe.c:1977
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Složený typ \"%s.%s\""
+
+#: describe.c:1981
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Foreign tabulka \"%s.%s\""
+
+#: describe.c:1986
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Unlogged partitioned tabulka \"%s.%s\""
+
+#: describe.c:1989
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Partitioned tabulka \"%s.%s\""
+
+#: describe.c:2005 describe.c:4178
+msgid "Collation"
+msgstr "Collation"
+
+#: describe.c:2006 describe.c:4185
+msgid "Nullable"
+msgstr "Nullable"
+
+#: describe.c:2007 describe.c:4186
+msgid "Default"
+msgstr "Implicitně"
+
+#: describe.c:2010
+msgid "Key?"
+msgstr "Klíč?"
+
+#: describe.c:2012
+msgid "Definition"
+msgstr "Definice"
+
+#: describe.c:2014 describe.c:5296 describe.c:5380 describe.c:5451
+#: describe.c:5515
+msgid "FDW options"
+msgstr "FDW volby"
+
+#: describe.c:2016
+msgid "Storage"
+msgstr "Uložení"
+
+#: describe.c:2018
+msgid "Stats target"
+msgstr "Stats target"
+
+#: describe.c:2131
+#, c-format
+msgid "Partition of: %s %s"
+msgstr "Partition pro: %s %s"
+
+#: describe.c:2143
+msgid "No partition constraint"
+msgstr "Žádné omezení partition"
+
+#: describe.c:2145
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Omezení partition: %s"
+
+#: describe.c:2169
+#, c-format
+msgid "Partition key: %s"
+msgstr "Partition klíč: %s"
+
+#: describe.c:2195
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Owning table: \"%s.%s\""
+
+#: describe.c:2266
+msgid "primary key, "
+msgstr "primární klíč, "
+
+#: describe.c:2268
+msgid "unique, "
+msgstr "unikátní, "
+
+#: describe.c:2274
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "pro tabulku \"%s.%s\""
+
+#: describe.c:2278
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", predikát (%s)"
+
+#: describe.c:2281
+msgid ", clustered"
+msgstr ", clusterován"
+
+#: describe.c:2284
+msgid ", invalid"
+msgstr ", neplatný"
+
+#: describe.c:2287
+msgid ", deferrable"
+msgstr ", odložitelný"
+
+#: describe.c:2290
+msgid ", initially deferred"
+msgstr ", iniciálně odložený"
+
+#: describe.c:2293
+msgid ", replica identity"
+msgstr ", replica identity"
+
+#: describe.c:2360
+msgid "Indexes:"
+msgstr "Indexy:"
+
+#: describe.c:2444
+msgid "Check constraints:"
+msgstr "Kontrolní pravidla:"
+
+#: describe.c:2512
+msgid "Foreign-key constraints:"
+msgstr "Podmínky cizího klíče:"
+
+#: describe.c:2575
+msgid "Referenced by:"
+msgstr "Odkazovaný:"
+
+#: describe.c:2625
+msgid "Policies:"
+msgstr "Politiky:"
+
+#: describe.c:2628
+msgid "Policies (forced row security enabled):"
+msgstr "Poitiky (forced row security zapnuta):"
+
+#: describe.c:2631
+msgid "Policies (row security enabled): (none)"
+msgstr "Politiky (row security zapnuta): (žádné)"
+
+#: describe.c:2634
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Politiky (forced row security zapnuta): (žádné)"
+
+#: describe.c:2637
+msgid "Policies (row security disabled):"
+msgstr "Politiky (row security vypnuta):"
+
+#: describe.c:2705
+msgid "Statistics objects:"
+msgstr "Statistické objekty:"
+
+#: describe.c:2819 describe.c:2923
+msgid "Rules:"
+msgstr "Rules:"
+
+#: describe.c:2822
+msgid "Disabled rules:"
+msgstr "Vypnutá pravidla (rules):"
+
+#: describe.c:2825
+msgid "Rules firing always:"
+msgstr "Vždy spouštěná pravidla:"
+
+#: describe.c:2828
+msgid "Rules firing on replica only:"
+msgstr "Pravidla spouštěná jen na replice:"
+
+#: describe.c:2868
+msgid "Publications:"
+msgstr "Publikace:"
+
+#: describe.c:2906
+msgid "View definition:"
+msgstr "Definice pohledu:"
+
+#: describe.c:3053
+msgid "Triggers:"
+msgstr "Triggery:"
+
+#: describe.c:3057
+msgid "Disabled user triggers:"
+msgstr "Vypnuté uživatelské triggery:"
+
+#: describe.c:3059
+msgid "Disabled triggers:"
+msgstr "Vypnuté triggery:"
+
+#: describe.c:3062
+msgid "Disabled internal triggers:"
+msgstr "Vypnuté interní triggery:"
+
+#: describe.c:3065
+msgid "Triggers firing always:"
+msgstr "Vždy spouštěné triggery:"
+
+#: describe.c:3068
+msgid "Triggers firing on replica only:"
+msgstr "Triggery spouštěné jen na replice:"
+
+#: describe.c:3140
+#, c-format
+msgid "Server: %s"
+msgstr "Server: %s"
+
+#: describe.c:3148
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW volby: (%s)"
+
+#: describe.c:3169
+msgid "Inherits"
+msgstr "Dědí"
+
+#: describe.c:3229
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "Počet partition: %d"
+
+#: describe.c:3238
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Počet partitions: %d (Použijte \\d+ pro jejich seznam.)"
+
+#: describe.c:3240
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Počet podřízených tabulek: %d (Použijte \\d+ pro jejich seznam.)"
+
+#: describe.c:3247
+msgid "Child tables"
+msgstr "Podřízené tabulky"
+
+#: describe.c:3247
+msgid "Partitions"
+msgstr "Partitions"
+
+#: describe.c:3276
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Typovaná tabulka typu: %s"
+
+#: describe.c:3292
+msgid "Replica Identity"
+msgstr "Replica Identity"
+
+#: describe.c:3305
+msgid "Has OIDs: yes"
+msgstr "Má OID: ano"
+
+#: describe.c:3314
+#, c-format
+msgid "Access method: %s"
+msgstr "Přístupová metoda: %s"
+
+#: describe.c:3394
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "Tablespace: \"%s\""
+
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:3406
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", tablespace: \"%s\""
+
+#: describe.c:3499
+msgid "List of roles"
+msgstr "Seznam rolí"
+
+#: describe.c:3501
+msgid "Role name"
+msgstr "Jméno role"
+
+#: describe.c:3502
+msgid "Attributes"
+msgstr "Atributy"
+
+#: describe.c:3503
+msgid "Member of"
+msgstr "Je členem"
+
+#: describe.c:3514
+msgid "Superuser"
+msgstr "Super-uživatel"
+
+#: describe.c:3517
+msgid "No inheritance"
+msgstr "Bez dědičnosti"
+
+#: describe.c:3520
+msgid "Create role"
+msgstr "Vytvoř roli"
+
+#: describe.c:3523
+msgid "Create DB"
+msgstr "Vytvoř DB"
+
+#: describe.c:3526
+msgid "Cannot login"
+msgstr "Nemohu se přihlásit"
+
+#: describe.c:3530
+msgid "Replication"
+msgstr "Replikace"
+
+#: describe.c:3534
+msgid "Bypass RLS"
+msgstr "Obejít RLS"
+
+#: describe.c:3543
+msgid "No connections"
+msgstr "Není spojení"
+
+#: describe.c:3545
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d spojení"
+msgstr[1] "%d spojení"
+msgstr[2] "%d spojení"
+
+#: describe.c:3555
+msgid "Password valid until "
+msgstr "Heslo platné do "
+
+#: describe.c:3605
+#, c-format
+msgid "The server (version %s) does not support per-database role settings."
+msgstr "Server (verze %s) nepodporuje nastavení rolí pro jednotlivé databáze."
+
+#: describe.c:3618
+msgid "Role"
+msgstr "Role"
+
+#: describe.c:3619
+msgid "Database"
+msgstr "Databáze"
+
+#: describe.c:3620
+msgid "Settings"
+msgstr "Nastavení"
+
+#: describe.c:3641
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "Nelze nalézt žádné nastavení pro roli \"%s\" a databázi \"%s\"."
+
+#: describe.c:3644
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Nelze nalézt žádné nastavení pro roli \"%s\"."
+
+#: describe.c:3647
+#, c-format
+msgid "Did not find any settings."
+msgstr "Žádná nastavení nenalezena."
+
+#: describe.c:3652
+msgid "List of settings"
+msgstr "Seznam nastavení"
+
+#: describe.c:3723
+msgid "index"
+msgstr "index"
+
+#: describe.c:3725
+msgid "special"
+msgstr "speciální"
+
+#: describe.c:3728 describe.c:3938
+msgid "partitioned index"
+msgstr "partitioned index"
+
+#: describe.c:3752
+msgid "permanent"
+msgstr "permanent"
+
+#: describe.c:3753
+msgid "temporary"
+msgstr "temporary"
+
+#: describe.c:3754
+msgid "unlogged"
+msgstr "unlogged"
+
+#: describe.c:3755
+msgid "Persistence"
+msgstr "Persistence"
+
+#: describe.c:3851
+msgid "List of relations"
+msgstr "Seznam relací"
+
+#: describe.c:3899
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "Server (verze %s) nepodporuje deklarativní partitioning."
+
+#: describe.c:3910
+msgid "List of partitioned indexes"
+msgstr "Seznam partitioned indexů"
+
+#: describe.c:3912
+msgid "List of partitioned tables"
+msgstr "Seznam partitioned tabulek"
+
+#: describe.c:3916
+msgid "List of partitioned relations"
+msgstr "Seznam partitioned relací"
+
+#: describe.c:3947
+msgid "Parent name"
+msgstr "Jméno předka"
+
+#: describe.c:3960
+msgid "Leaf partition size"
+msgstr "Leaf partition size"
+
+#: describe.c:3963 describe.c:3969
+msgid "Total size"
+msgstr "Celková velikost"
+
+#: describe.c:4101
+msgid "Trusted"
+msgstr "Důvěryhodný"
+
+#: describe.c:4109
+msgid "Internal language"
+msgstr "Interní jazyk"
+
+#: describe.c:4110
+msgid "Call handler"
+msgstr "Call handler"
+
+#: describe.c:4111 describe.c:5283
+msgid "Validator"
+msgstr "Validátor"
+
+#: describe.c:4114
+msgid "Inline handler"
+msgstr "Inline handler"
+
+#: describe.c:4142
+msgid "List of languages"
+msgstr "Seznam jazyků"
+
+#: describe.c:4187
+msgid "Check"
+msgstr "Kontrola"
+
+#: describe.c:4229
+msgid "List of domains"
+msgstr "Seznam domén"
+
+#: describe.c:4263
+msgid "Source"
+msgstr "Zdroj"
+
+#: describe.c:4264
+msgid "Destination"
+msgstr "Cíl"
+
+#: describe.c:4266 describe.c:6101
+msgid "Default?"
+msgstr "Implicitně?"
+
+#: describe.c:4303
+msgid "List of conversions"
+msgstr "Seznam konverzí"
+
+#: describe.c:4342
+msgid "Event"
+msgstr "Událost"
+
+#: describe.c:4344
+msgid "enabled"
+msgstr "povoleno"
+
+#: describe.c:4345
+msgid "replica"
+msgstr "replica"
+
+#: describe.c:4346
+msgid "always"
+msgstr "vždy"
+
+#: describe.c:4347
+msgid "disabled"
+msgstr "disabled"
+
+#: describe.c:4348 describe.c:5997
+msgid "Enabled"
+msgstr "Povoleno"
+
+#: describe.c:4350
+msgid "Tags"
+msgstr "Tagy"
+
+#: describe.c:4369
+msgid "List of event triggers"
+msgstr "Seznam event triggerů"
+
+#: describe.c:4398
+msgid "Source type"
+msgstr "Zdrojový typ"
+
+#: describe.c:4399
+msgid "Target type"
+msgstr "Cílový typ"
+
+#: describe.c:4430
+msgid "in assignment"
+msgstr "v přiřazení"
+
+#: describe.c:4432
+msgid "Implicit?"
+msgstr "Implicitně?"
+
+#: describe.c:4487
+msgid "List of casts"
+msgstr "Seznam přetypování"
+
+#: describe.c:4515
+#, c-format
+msgid "The server (version %s) does not support collations."
+msgstr "Server (verze %s) nepodporuje collations."
+
+#: describe.c:4536 describe.c:4540
+msgid "Provider"
+msgstr "Provider"
+
+#: describe.c:4546 describe.c:4551
+msgid "Deterministic?"
+msgstr "Deterministická?"
+
+#: describe.c:4586
+msgid "List of collations"
+msgstr "Seznam collations"
+
+#: describe.c:4645
+msgid "List of schemas"
+msgstr "Seznam schémat"
+
+#: describe.c:4670 describe.c:4917 describe.c:4988 describe.c:5059
+#, c-format
+msgid "The server (version %s) does not support full text search."
+msgstr "Server (verze %s) nepodporuje fulltextové vyhledávání."
+
+#: describe.c:4705
+msgid "List of text search parsers"
+msgstr "Seznam fulltextových parserů"
+
+#: describe.c:4750
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Nelze nalézt fulltextový parser se jménem \"%s\"."
+
+#: describe.c:4753
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Nelze nalézt žádný fulltextový parser."
+
+#: describe.c:4828
+msgid "Start parse"
+msgstr "Začátek parsování"
+
+#: describe.c:4829
+msgid "Method"
+msgstr "Metoda"
+
+#: describe.c:4833
+msgid "Get next token"
+msgstr "Získej další token"
+
+#: describe.c:4835
+msgid "End parse"
+msgstr "Konec parsování"
+
+#: describe.c:4837
+msgid "Get headline"
+msgstr "Získej záhlaví"
+
+#: describe.c:4839
+msgid "Get token types"
+msgstr "Získej typy tokenu"
+
+#: describe.c:4850
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Fulltextový parser \"%s.%s\""
+
+#: describe.c:4853
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Fulltextový parser \"%s\""
+
+#: describe.c:4872
+msgid "Token name"
+msgstr "Jméno tokenu"
+
+#: describe.c:4883
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Jméno tokenu pro parser \"%s.%s\""
+
+#: describe.c:4886
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Typ tokenu pro parser \"%s\""
+
+#: describe.c:4940
+msgid "Template"
+msgstr "Šablona"
+
+#: describe.c:4941
+msgid "Init options"
+msgstr "Init options"
+
+#: describe.c:4963
+msgid "List of text search dictionaries"
+msgstr "Seznam fulltextových slovníků"
+
+#: describe.c:5006
+msgid "Init"
+msgstr "Init"
+
+#: describe.c:5007
+msgid "Lexize"
+msgstr "Lexize"
+
+#: describe.c:5034
+msgid "List of text search templates"
+msgstr "Seznam fulltextových šablon"
+
+#: describe.c:5094
+msgid "List of text search configurations"
+msgstr "Seznam fulltextových konfigurací"
+
+#: describe.c:5140
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "Nelze nalézt fulltextovou konfiguraci se jménem \"%s\"."
+
+#: describe.c:5143
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Nelze nalézt žádnou fulltextovou konfiguraci."
+
+#: describe.c:5209
+msgid "Token"
+msgstr "Token"
+
+#: describe.c:5210
+msgid "Dictionaries"
+msgstr "Slovníky"
+
+#: describe.c:5221
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Fulltextová konfigurace \"%s.%s\""
+
+#: describe.c:5224
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Fulltextová konfigurace \"%s\""
+
+#: describe.c:5228
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Parser: \"%s.%s\""
+
+#: describe.c:5231
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Parser: \"%s\""
+
+#: describe.c:5265
+#, c-format
+msgid "The server (version %s) does not support foreign-data wrappers."
+msgstr "Server (verze %s) nepodporuje foreign-data wrappery."
+
+#: describe.c:5323
+msgid "List of foreign-data wrappers"
+msgstr "Seznam foreign-data wrapperů"
+
+#: describe.c:5348
+#, c-format
+msgid "The server (version %s) does not support foreign servers."
+msgstr "Server (verze %s) nepodporuje foreign servery."
+
+#: describe.c:5361
+msgid "Foreign-data wrapper"
+msgstr "Foreign-data wrapper"
+
+#: describe.c:5379 describe.c:5584
+msgid "Version"
+msgstr "Verze"
+
+#: describe.c:5405
+msgid "List of foreign servers"
+msgstr "Seznam foreign serverů"
+
+#: describe.c:5430
+#, c-format
+msgid "The server (version %s) does not support user mappings."
+msgstr "Server (verze %s) nepodporuje mapování uživatelů."
+
+#: describe.c:5440 describe.c:5504
+msgid "Server"
+msgstr "Server"
+
+#: describe.c:5441
+msgid "User name"
+msgstr "Uživatelské jméno"
+
+#: describe.c:5466
+msgid "List of user mappings"
+msgstr "Seznam mapování uživatelů"
+
+#: describe.c:5491
+#, c-format
+msgid "The server (version %s) does not support foreign tables."
+msgstr "Server (verze %s) nepodporuje foreign tabulky."
+
+#: describe.c:5544
+msgid "List of foreign tables"
+msgstr "Seznam foreign tabulek"
+
+#: describe.c:5569 describe.c:5626
+#, c-format
+msgid "The server (version %s) does not support extensions."
+msgstr "Server (verze %s) nepodporuje extensions."
+
+#: describe.c:5601
+msgid "List of installed extensions"
+msgstr "Seznam instalovaných extensions"
+
+#: describe.c:5654
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "Nelze nalézt extension se jménem \"%s\"."
+
+#: describe.c:5657
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Nelze nalézt žádnou extension."
+
+#: describe.c:5701
+msgid "Object description"
+msgstr "Popis objektu"
+
+#: describe.c:5711
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Objekty v rozšíření \"%s\""
+
+#: describe.c:5740 describe.c:5816
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "Server (verze %s) nepodporuje publikace."
+
+#: describe.c:5757 describe.c:5894
+msgid "All tables"
+msgstr "Všechny tabulky"
+
+#: describe.c:5758 describe.c:5895
+msgid "Inserts"
+msgstr "Insert"
+
+#: describe.c:5759 describe.c:5896
+msgid "Updates"
+msgstr "Update"
+
+#: describe.c:5760 describe.c:5897
+msgid "Deletes"
+msgstr "Delete"
+
+#: describe.c:5764 describe.c:5899
+msgid "Truncates"
+msgstr "Truncates"
+
+#: describe.c:5768 describe.c:5901
+msgid "Via root"
+msgstr "Via root"
+
+#: describe.c:5785
+msgid "List of publications"
+msgstr "Seznam publikací"
+
+#: describe.c:5858
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "Nelze nalézt publikaci se jménem \"%s\"."
+
+#: describe.c:5861
+#, c-format
+msgid "Did not find any publications."
+msgstr "Nelze nalézt žádnou publikaci."
+
+#: describe.c:5890
+#, c-format
+msgid "Publication %s"
+msgstr "Publikace %s"
+
+#: describe.c:5938
+msgid "Tables:"
+msgstr "Tabulky:"
+
+#: describe.c:5982
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Server (verze %s) nepodporuje subskripce."
+
+#: describe.c:5998
+msgid "Publication"
+msgstr "Publikace"
+
+#: describe.c:6005
+msgid "Synchronous commit"
+msgstr "Synchronní commit"
+
+#: describe.c:6006
+msgid "Conninfo"
+msgstr "Spojení"
+
+#: describe.c:6028
+msgid "List of subscriptions"
+msgstr "Seznam subskripcí"
+
+#: describe.c:6095 describe.c:6184 describe.c:6270 describe.c:6353
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6096
+msgid "Input type"
+msgstr "Vstupní typ"
+
+#: describe.c:6097
+msgid "Storage type"
+msgstr "Typ uložení"
+
+#: describe.c:6098
+msgid "Operator class"
+msgstr "Třída operátorů"
+
+#: describe.c:6110 describe.c:6185 describe.c:6271 describe.c:6354
+msgid "Operator family"
+msgstr "Rodina operátorů"
+
+#: describe.c:6143
+msgid "List of operator classes"
+msgstr "Seznam tříd operátorů"
+
+#: describe.c:6186
+msgid "Applicable types"
+msgstr "Aplikovatelné typy"
+
+#: describe.c:6225
+msgid "List of operator families"
+msgstr "Seznam rodin operátorů"
+
+#: describe.c:6272
+msgid "Operator"
+msgstr "Operátor"
+
+#: describe.c:6273
+msgid "Strategy"
+msgstr "Strategie"
+
+#: describe.c:6274
+msgid "ordering"
+msgstr "řazení"
+
+#: describe.c:6275
+msgid "search"
+msgstr "hledání"
+
+#: describe.c:6276
+msgid "Purpose"
+msgstr "Účel"
+
+#: describe.c:6281
+msgid "Sort opfamily"
+msgstr "Rodina operátorů"
+
+#: describe.c:6312
+msgid "List of operators of operator families"
+msgstr "List operátorů v rodinách operátorů"
+
+#: describe.c:6355
+msgid "Registered left type"
+msgstr "Typ levého argumentu"
+
+#: describe.c:6356
+msgid "Registered right type"
+msgstr "Typ pravého argumentu"
+
+#: describe.c:6357
+msgid "Number"
+msgstr "Číslo"
+
+#: describe.c:6393
+msgid "List of support functions of operator families"
+msgstr "Seznam support funkcí pro rodiny operátorů"
+
+#: help.c:73
+#, c-format
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql je PostgreSQL interaktivní terminál.\n"
+"\n"
+
+#: help.c:74 help.c:355 help.c:431 help.c:474
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: help.c:75
+#, c-format
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [PŘEPÍNAČE]... [DATABÁZE [UŽIVATEL]]\n"
+"\n"
+
+#: help.c:77
+#, c-format
+msgid "General options:\n"
+msgstr "Základní volby:\n"
+
+#: help.c:82
+#, c-format
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=PŘÍKAZ provede pouze jeden příkaz (SQL nebo interní) a skončí\n"
+
+#: help.c:83
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=DATABÁZE jméno databáze pro spojení (implicitně: \"%s\")\n"
+
+#: help.c:84
+#, c-format
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=SOUBOR provede příkazy ze souboru a skončí\n"
+
+#: help.c:85
+#, c-format
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list vypíše seznam dostupných databází a skončí\n"
+
+#: help.c:86
+#, c-format
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=JMÉNO=HODNOTA\n"
+" nastaví psql proměnnou JMÉNO na HODNOTA\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+"\n"
+
+#: help.c:89
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ukáže informace o verzi a skončí\n"
+
+#: help.c:90
+#, c-format
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc nečíst inicializační soubor (~/.psqlrc)\n"
+
+#: help.c:91
+#, c-format
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (\"jedna\"), --single-transaction\n"
+" proveď operaci v rámci jedné transakce\n"
+
+#: help.c:93
+#, c-format
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] ukáže tuto nápovědu, a skončí\n"
+
+#: help.c:94
+#, c-format
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands vypíše interní příkazy, poté skončí\n"
+
+#: help.c:95
+#, c-format
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables vypíše speciální proměnné, poté skončí\n"
+
+#: help.c:97
+#, c-format
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Vstupní a výstupní přepínače:\n"
+
+#: help.c:98
+#, c-format
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all ukáže všechny vstupy ze skriptu\n"
+
+#: help.c:99
+#, c-format
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors vypíše příkazy které selhaly\n"
+
+#: help.c:100
+#, c-format
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e --echo-queries ukáže všechny příkazy poslané na server\n"
+
+#: help.c:101
+#, c-format
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden ukáže dotazy generované interními příkazy\n"
+
+#: help.c:102
+#, c-format
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=SOUBOR uloží záznam sezení do souboru\n"
+
+#: help.c:103
+#, c-format
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline vypne pokročilé editační možnosti příkazové řádky (podpora readline)\n"
+
+#: help.c:104
+#, c-format
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=SOUBOR zapíše výsledek dotazu do souboru (nebo |roury)\n"
+
+#: help.c:105
+#, c-format
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet tichý chod (bez hlášek, pouze výstupy dotazů)\n"
+
+#: help.c:106
+#, c-format
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step krokovací mód (nutné potvrzení každého dotazu)\n"
+
+#: help.c:107
+#, c-format
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line jednořádkový mód (konec řádky ukončuje SQL příkaz)\n"
+
+#: help.c:109
+#, c-format
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Výstupní formát je:\n"
+
+#: help.c:110
+#, c-format
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align mód nezarovnaného formátu tabulky\n"
+
+#: help.c:111
+#, c-format
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv CSV (Comma-Separated Values) mód výstupu tabulek\n"
+
+#: help.c:112
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=ŘETĚZEC\n"
+" oddělovač polí pro nezarovnaný výstup (implicitně: \"%s\")\n"
+
+#: help.c:115
+#, c-format
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html mód HTML formátu tabulky\n"
+
+#: help.c:116
+#, c-format
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=VAR[=ARG] nastaví zobrazovací parametr VAR na hodnotu ARG (viz. příkaz \\pset)\n"
+
+#: help.c:117
+#, c-format
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=ŘETĚZEC\n"
+" oddělovač záznamů pro nezarovnaný výstup (implicitně: newline)\n"
+
+#: help.c:119
+#, c-format
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only tiskni pouze řádky\n"
+
+#: help.c:120
+#, c-format
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=TEXT nastaví atributy HTML tabulky (např. width, border)\n"
+
+#: help.c:121
+#, c-format
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded zapne rozšířený tabulkový výstup\n"
+
+#: help.c:122
+#, c-format
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" nastaví oddělovač polí pro nezarovnaný výstup na nulový byte\n"
+
+#: help.c:124
+#, c-format
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" nastaví oddělovač záznamů pro nezarovnaný výstup na nulový byte\n"
+
+#: help.c:127
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Parametry spojení:\n"
+
+#: help.c:130
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr " -h, --host=HOSTNAME jméno databázového serveru nebo adresář se soketem (implicitně: \"%s\")\n"
+
+#: help.c:131
+msgid "local socket"
+msgstr "lokální soket"
+
+#: help.c:134
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT port databázového serveru (implicitně: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=JMÉNO jméno databázového uživatele (implicitně: \"%s\")\n"
+
+#: help.c:141
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password neptá se na heslo\n"
+
+#: help.c:142
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password vynucený dotaz na heslo (měl by být proveden automaticky)\n"
+
+#: help.c:144
+#, c-format
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Pro více informací použijte \"\\?\" (pro interní příkazy) nebo \"\\help\"\n"
+"(pro SQL příkazy), nebo se podívejte do dokumentace PostgreSQL a\n"
+"části věnované psql.\n"
+"\n"
+
+#: help.c:147
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Chyby hlašte na <%s>.\n"
+
+#: help.c:148
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: help.c:174
+#, c-format
+msgid "General\n"
+msgstr "Hlavní\n"
+
+#: help.c:175
+#, c-format
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright zobrazí podmínky použití a distribuce PostgreSQL\n"
+
+#: help.c:176
+#, c-format
+msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n"
+msgstr " \\crosstabview [SLOUPCE] spustí dotaz a zobrazí výsledek přes crosstab\n"
+
+#: help.c:177
+#, c-format
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose zobrazí polední chybovou hlášku s maximem podrobností\n"
+
+#: help.c:178
+#, c-format
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send results to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPTIONS)] [FILE] execute query (and send results to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+
+#: help.c:180
+#, c-format
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc popíše výsledek dotazu, bez spuštění\n"
+
+#: help.c:181
+#, c-format
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec spustí dotaz, poté spustí každou hodnotu z jeho výsledku\n"
+
+#: help.c:182
+#, c-format
+msgid " \\gset [PREFIX] execute query and store results in psql variables\n"
+msgstr " \\gset [PREFIX] spustí dotaz a uloží výsledky v psql proměnných\n"
+
+#: help.c:183
+#, c-format
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(VOLBY)] [SOUBOR] jako \\g, ale vynucuje rozšířený mód výstupu\n"
+
+#: help.c:184
+#, c-format
+msgid " \\q quit psql\n"
+msgstr " \\q ukončení psql\n"
+
+#: help.c:185
+#, c-format
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SEC] každých SEC vteřin spusť dotaz\n"
+
+#: help.c:188
+#, c-format
+msgid "Help\n"
+msgstr "Nápověda\n"
+
+#: help.c:190
+#, c-format
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] zobrazí nápovědu k interním příkazům\n"
+
+#: help.c:191
+#, c-format
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options zobrazí nápovědu k psql parametrům psql pro příkazovou řádku\n"
+
+#: help.c:192
+#, c-format
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables zobrazí nápovědu ke speciálním proměnným\n"
+
+#: help.c:193
+#, c-format
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [JMÉNO] nápověda syntaxe SQL příkazů, * pro všechny příkazy\n"
+
+#: help.c:196
+#, c-format
+msgid "Query Buffer\n"
+msgstr "Paměť dotazu\n"
+
+#: help.c:197
+#, c-format
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [SOUBOR] [ŘÁDEK] editace aktuálního dotazu (nebo souboru) v externím editoru\n"
+
+#: help.c:198
+#, c-format
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [JMENOFUNKCE [ŘÁDEK]] editace definice funkce v externím editoru\n"
+
+#: help.c:199
+#, c-format
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr ""
+" \\ev [VIEWNAME [LINE]] editace definice pohledu v externím editoru\n"
+"\n"
+
+#: help.c:200
+#, c-format
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p ukázat současný obsah paměti s dotazem\n"
+
+#: help.c:201
+#, c-format
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r vyprázdnění paměti s dotazy\n"
+
+#: help.c:203
+#, c-format
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [SOUBOR] vytiskne historii nebo ji uloží do souboru\n"
+
+#: help.c:205
+#, c-format
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w SOUBOR zapsání paměti s dotazem do souboru\n"
+
+#: help.c:208
+#, c-format
+msgid "Input/Output\n"
+msgstr "Vstup/Výstup\n"
+
+#: help.c:209
+#, c-format
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... provede SQL COPY s tokem dat na klienta\n"
+
+#: help.c:210
+#, c-format
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr ""
+" \\echo [-n] [ŘETĚZEC] vypsání textu na standardní výstup (-n pro potlačení\n"
+" nového řádku)\n"
+
+#: help.c:211
+#, c-format
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i SOUBOR provedení příkazů ze souboru\n"
+
+#: help.c:212
+#, c-format
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir FILE jako \\i, ale relativně k pozici v aktuálním skriptu\n"
+
+#: help.c:213
+#, c-format
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [SOUBOR] přesměrování výsledků dotazu do souboru nebo |roury\n"
+
+#: help.c:214
+#, c-format
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr ""
+" \\qecho [ŘETĚZEC] vypsání textu na \\o výstup dotazů (-n pro potlačení\n"
+" nového řádku)\n"
+
+#: help.c:215
+#, c-format
+#| msgid " \\echo [STRING] write string to standard output\n"
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr ""
+" \\warn [-n] [TEXT] vypsání textu na standardní výstup (-n pro potlačení\n"
+" nového řádku)\n"
+
+#: help.c:218
+#, c-format
+msgid "Conditional\n"
+msgstr "Podmínka\n"
+
+#: help.c:219
+#, c-format
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR začne podmíněný blok\n"
+
+#: help.c:220
+#, c-format
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR alternativa v současném podmíněném bloku\n"
+
+#: help.c:221
+#, c-format
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else poslední alternativa v současném podmíněném bloku\n"
+
+#: help.c:222
+#, c-format
+msgid " \\endif end conditional block\n"
+msgstr " \\endif ukončí podmíněný blok\n"
+
+#: help.c:225
+#, c-format
+msgid "Informational\n"
+msgstr "Informační\n"
+
+#: help.c:226
+#, c-format
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (volby: S = zobraz systémové objekty, + = další detaily)\n"
+
+#: help.c:227
+#, c-format
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] seznam tabulek, pohledů a sekvencí\n"
+
+#: help.c:228
+#, c-format
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] JMÉNO popis tabulky, pohledů, sekvence nebo indexu\n"
+
+#: help.c:229
+#, c-format
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [VZOR] seznam agregačních funkcí\n"
+
+#: help.c:230
+#, c-format
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [PATTERN] seznam přístupových metod\n"
+
+#: help.c:231
+#, c-format
+#| msgid " \\do[S] [PATTERN] list operators\n"
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] vypíše třídy operátorů\n"
+
+#: help.c:232
+#, c-format
+#| msgid " \\do[S] [PATTERN] list operators\n"
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] vypíše rodiny operátorů\n"
+
+#: help.c:233
+#, c-format
+#| msgid " \\do[S] [PATTERN] list operators\n"
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] vypíše operátory pro rodiny operátorů\n"
+
+#: help.c:234
+#, c-format
+msgid " \\dAp [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp [AMPTRN [OPFPTRN]] vypíše support funkce rodin operátorů\n"
+
+#: help.c:235
+#, c-format
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [VZOR] seznam tablespaces\n"
+
+#: help.c:236
+#, c-format
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [PATTERN] seznam konverzí\n"
+
+#: help.c:237
+#, c-format
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [PATTERN] seznam přetypování\n"
+
+#: help.c:238
+#, c-format
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [PATTERN] zobrazí popis objektů nezobrazených jinde\n"
+
+#: help.c:239
+#, c-format
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [PATTERN] seznam domén\n"
+
+#: help.c:240
+#, c-format
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [VZOR] seznam implicitních privilegií\n"
+
+#: help.c:241
+#, c-format
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [VZOR] seznam foreign tabulek\n"
+
+#: help.c:242
+#, c-format
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [VZOR] seznam foreign tabulek\n"
+
+#: help.c:243
+#, c-format
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [VZOR] seznam foreign serverů\n"
+
+#: help.c:244
+#, c-format
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [VZOR] seznam mapování uživatelů\n"
+
+#: help.c:245
+#, c-format
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [VZOR] seznam foreign-data wrapperů\n"
+
+#: help.c:246
+#, c-format
+msgid " \\df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] functions\n"
+msgstr " \\df[anptw][S+] [VZOR] seznam [pouze agg/normal/procedures/trigger/window] funkcí\n"
+
+#: help.c:247
+#, c-format
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [VZOR] seznam konfigurací fulltextového vyhledávání\n"
+
+#: help.c:248
+#, c-format
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [VZOR] seznam slovníků fulltextového vyhledávání\n"
+
+#: help.c:249
+#, c-format
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [VZOR] seznam parserů fulltextového vyhledávání\n"
+
+#: help.c:250
+#, c-format
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [VZOR] seznam šablon fulltextového vyhledávání\n"
+
+#: help.c:251
+#, c-format
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [PATTERN] seznam rolí\n"
+
+#: help.c:252
+#, c-format
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [VZOR] seznam indexů\n"
+
+#: help.c:253
+#, c-format
+msgid " \\dl list large objects, same as \\lo_list\n"
+msgstr " \\dl seznam \"large object\" stejné jako \\lo_list\n"
+
+#: help.c:254
+#, c-format
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [VZOR] seznam procedurálních jazyků\n"
+
+#: help.c:255
+#, c-format
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [PATTERN] seznam materializovaných pohledů\n"
+
+#: help.c:256
+#, c-format
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [VZOR] seznam schémat\n"
+
+#: help.c:257
+#, c-format
+msgid " \\do[S] [PATTERN] list operators\n"
+msgstr " \\do[S] [VZOR] seznam operátorů\n"
+
+#: help.c:258
+#, c-format
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [VZOR] seznam collations\n"
+
+#: help.c:259
+#, c-format
+msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp [VZOR] seznam přístupových práv tabulek, pohledů a sekvencí\n"
+
+#: help.c:260
+#, c-format
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[itn+] [PATTERN] seznam [pouze index/table] partitioned relations [n=nested]\n"
+
+#: help.c:261
+#, c-format
+msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n"
+msgstr " \\drds [VZOR1 [VZOR2]] seznam nastavení rolí pro jednotlivé databáze\n"
+
+#: help.c:262
+#, c-format
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [PATTERN] seznam replikačních publikací\n"
+
+#: help.c:263
+#, c-format
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [PATTERN] seznam replikačních subskripcí\n"
+
+#: help.c:264
+#, c-format
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [VZOR] seznam sekvencí\n"
+
+#: help.c:265
+#, c-format
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [VZOR] seznam tabulek\n"
+
+#: help.c:266
+#, c-format
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [VZOR] seznam datových typů\n"
+
+#: help.c:267
+#, c-format
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [PATTERN] seznam rolí\n"
+
+#: help.c:268
+#, c-format
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [VZOR] seznam pohledů\n"
+
+#: help.c:269
+#, c-format
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [VZOR] seznam rozšíření\n"
+
+#: help.c:270
+#, c-format
+msgid " \\dy [PATTERN] list event triggers\n"
+msgstr " \\dy [PATTERN] seznam event triggerů\n"
+
+#: help.c:271
+#, c-format
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [PATTERN] seznam databází\n"
+
+#: help.c:272
+#, c-format
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNCNAME zobrazí definici funkce\n"
+
+#: help.c:273
+#, c-format
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VIEWNAME zobrazí definici pohledu\n"
+
+#: help.c:274
+#, c-format
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [VZOR] stejné jako \\dp\n"
+
+#: help.c:277
+#, c-format
+msgid "Formatting\n"
+msgstr "Formátování\n"
+
+#: help.c:278
+#, c-format
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a přepíná mezi 'unaligned' a 'aligned' modem výstupu\n"
+
+#: help.c:279
+#, c-format
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [ŘETĚZEC] nastaví titulek tabulky nebo odnastaví pokud není definován řetězec\n"
+
+#: help.c:280
+#, c-format
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [ŘETĚZEC] nastaví nebo zobrazí oddělovače polí pro nezarovnaný výstup dotazů\n"
+
+#: help.c:281
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H zapne HTML mód výstupu (nyní %s)\n"
+
+#: help.c:283
+#, c-format
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:290
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] ukazovat pouze řádky (nyní %s)\n"
+
+#: help.c:292
+#, c-format
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [ŘETĚZEC] nastavení atributů HTML tagu <table>\n"
+
+#: help.c:293
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] zapne rozšířený mód výstupu (nyní %s)\n"
+
+#: help.c:297
+#, c-format
+msgid "Connection\n"
+msgstr "Spojení\n"
+
+#: help.c:299
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] [DATABÁZE|- UŽIVATEL|- HOST|- PORT|-] | conninfo]\n"
+" připojí se do nové databáze (současná \"%s\")\n"
+
+#: help.c:303
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] [DATABÁZE|- UŽIVATEL|- HOST|- PORT|-] | conninfo]\n"
+" připojí se do nové databáze (současně žádné spojení)\n"
+
+#: help.c:305
+#, c-format
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo zobrazí informace o aktuálním spojení\n"
+
+#: help.c:306
+#, c-format
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [KÓDOVÁNÍ] zobrazení nebo nastavení kódování klienta\n"
+
+#: help.c:307
+#, c-format
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [UŽIVATEL] bezpečná změna hesla uživatele\n"
+
+#: help.c:310
+#, c-format
+msgid "Operating System\n"
+msgstr "Operační systém\n"
+
+#: help.c:311
+#, c-format
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [ADRESÁŘ] změna aktuálního pracovního adresář\n"
+
+#: help.c:312
+#, c-format
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAME [VALUE] nastaví nebo zruší proměnnou prostředí\n"
+
+#: help.c:313
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] použít sledování času u příkazů (nyní %s)\n"
+
+#: help.c:315
+#, c-format
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [PŘÍKAZ] provedení příkazu v shellu nebo nastartuje interaktivní shell\n"
+
+#: help.c:318
+#, c-format
+msgid "Variables\n"
+msgstr "Proměnné\n"
+
+#: help.c:319
+#, c-format
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TEXT] PROMĚNÁ vyzve uživatele, aby zadal hodnotu proměnné\n"
+
+#: help.c:320
+#, c-format
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr ""
+" \\set [PROMĚNÁ [HODNOTA]]\n"
+" nastavení interní proměnné nebo bez parametrů zobrazí\n"
+" seznam všech proměnných\n"
+
+#: help.c:321
+#, c-format
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset JMÉNO zrušení interní proměnné\n"
+
+#: help.c:324
+#, c-format
+msgid "Large Objects\n"
+msgstr "Velké objekty (LO)\n"
+
+#: help.c:325
+#, c-format
+msgid ""
+" \\lo_export LOBOID FILE\n"
+" \\lo_import FILE [COMMENT]\n"
+" \\lo_list\n"
+" \\lo_unlink LOBOID large object operations\n"
+msgstr ""
+" \\lo_export LOBOID SOUBOR\n"
+" \\lo_import SOUBOR [KOMENTÁŘ]\n"
+" \\lo_list\n"
+" \\lo_unlink LOBOID operace s \"large\" objekty\n"
+
+#: help.c:352
+#, c-format
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"Seznam proměnných se zvláštním významem\n"
+"\n"
+
+#: help.c:354
+#, c-format
+msgid "psql variables:\n"
+msgstr "psql proměnné:\n"
+
+#: help.c:356
+#, c-format
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAME=VALUE\n"
+" nebo \\set NAME VALUE v psql\n"
+"\n"
+
+#: help.c:358
+#, c-format
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" pokud nastaveno, úspěšně dokončené SQL příkazy jsou automaticky commitovány\n"
+
+#: help.c:360
+#, c-format
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" určuje velikost písmen pro dokončování SQL klíčových slov\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:363
+#, c-format
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" název aktuálně připojené databáze\n"
+
+#: help.c:365
+#, c-format
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" určuje jaký vstup je zapisován na standardní výstup\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:368
+#, c-format
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" pokud je nastaveno, zobrazuje dotazy spouštěné interními (backslash) příkazy;\n"
+" při nastavení na \"noexec\", pouze zobrazí bez spuštění\n"
+
+#: help.c:371
+#, c-format
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" aktuální kódování znakové sady klienta\n"
+
+#: help.c:373
+#, c-format
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr ""
+" ERROR\n"
+" nastaveno na true pokud poslední dotaz selhal, jinak false\n"
+
+#: help.c:375
+#, c-format
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" počet řádek výsledku pro načtení a zobrazení nanjednou (0 = unlimited)\n"
+
+#: help.c:377
+#, c-format
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" pokud nastaveno, informace o table access methods nejsou zobrazovány\n"
+
+#: help.c:379
+#, c-format
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" nastavuje chování historie příkazů [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:381
+#, c-format
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" název souboru pro uložení historie příkazů\n"
+
+#: help.c:383
+#, c-format
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" maximální počet položek uložených v historii přkazů\n"
+"\n"
+
+#: help.c:385
+#, c-format
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" databázový server ke kterému jste aktuálně připojeni\n"
+
+#: help.c:387
+#, c-format
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" počet EOF znaků potřebných pro ukončení interaktivníhi sezení\n"
+
+#: help.c:389
+#, c-format
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" hodnota posledního změněného OID\n"
+
+#: help.c:391
+#, c-format
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" zpráva a SQLSTATE poslední chyby, nebo prázdný řetězec a \"00000\" pokud se chyba nevyskytla\n"
+
+#: help.c:394
+#, c-format
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" pokud nastaveno, chyba nepřeruší transakci (používá implicitní savepointy)\n"
+
+#: help.c:396
+#, c-format
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" zastaví dávkové spouštění v případě výskytu chyby\n"
+
+#: help.c:398
+#, c-format
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" port na serveru používaný aktuálním spojením\n"
+
+#: help.c:400
+#, c-format
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" specifikuje standardní psql prompt\n"
+
+#: help.c:402
+#, c-format
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" specifikuje prompt používaný pokud příkaz pokračuje z předchozí řádky\n"
+
+#: help.c:404
+#, c-format
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" specifikuje prompt používaný během COPY ... FROM STDIN\n"
+
+#: help.c:406
+#, c-format
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" tichý běh (stejné jako volba -q)\n"
+
+#: help.c:408
+#, c-format
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" počet řádek vrácených nebo ovlivněných předchozím dotazem, nebo 0\n"
+
+#: help.c:410
+#, c-format
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" verze serveru (v krátkém textovém nebo numerickém formátu)\n"
+
+#: help.c:413
+#, c-format
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" určuje zobrazení informací o kontextu zpráv [never, errors, always]\n"
+
+#: help.c:415
+#, c-format
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" pokud nastaveno, konec řádky ukončuje SQL příkazy (stejné jako volba -S)\n"
+
+#: help.c:417
+#, c-format
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" single-step mód (stejné jako volba -s)\n"
+
+#: help.c:419
+#, c-format
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" SQLSTATE posledního dotazu, nebo \"00000\" pokud skončil bez chyby\n"
+
+#: help.c:421
+#, c-format
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" uživatelský účet ke kterému jste aktuálně připojeni\n"
+
+#: help.c:423
+#, c-format
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" určuje podrobnost chybových hlášení [default, verbose, terse, sqlstate]\n"
+"\n"
+
+#: help.c:425
+#, c-format
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" verze psql (v podropbném řetězci, krátkém řetězci, nebo numerickém formátu)\n"
+
+#: help.c:430
+#, c-format
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Nastavení zobrazení:\n"
+
+#: help.c:432
+#, c-format
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NAME[=VALUE]\n"
+" nebo \\pset NAME [VALUE] v psql\n"
+"\n"
+
+#: help.c:434
+#, c-format
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" styl rámečků (číslo)\n"
+
+#: help.c:436
+#, c-format
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" cílová šířka pro zalomený formát\n"
+
+#: help.c:438
+#, c-format
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (nebo x)\n"
+" rozšířený výstup [on, off, auto]\n"
+
+#: help.c:440
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" oddělovač položek pro nezarovnaný výstup (výchozí \"%s\")\n"
+
+#: help.c:443
+#, c-format
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" nastaví oddělovač polí pro nezarovnaný výstup na nulový byte\n"
+
+#: help.c:445
+#, c-format
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" zapne nebo vypne zobrazení zápatí tabulky [on, off]\n"
+
+#: help.c:447
+#, c-format
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" nastaví formát výstupu [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:449
+#, c-format
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestype\n"
+" nastaví styl vykreslování rámečků [ascii, old-ascii, unicode]\n"
+
+#: help.c:451
+#, c-format
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" nastaví řetězec vypisovaný místo null hodnoty\n"
+
+#: help.c:453
+#, c-format
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" zapne zobrazení lokalizovaného znaku pro oddělení skupin číslic\n"
+
+#: help.c:455
+#, c-format
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" určuje kdy se použije externí pager [yes, no, always]\n"
+
+#: help.c:457
+#, c-format
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" oddělovač záznamů (řádek) pro nezarovnaný výstup\n"
+
+#: help.c:459
+#, c-format
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" nastaví oddělovač záznamů pro nezarovnaný výstup na nulový byte\n"
+
+#: help.c:461
+#, c-format
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (or T)\n"
+" specifikuje attributy pro table tag v html formátu, nebo proporcionální\n"
+" šířky sloupců pro datové typy zarovnávané doleva v latex-longtable formátu\n"
+
+#: help.c:464
+#, c-format
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" nastavuje titulek tabulky pro následně vypisované tabulky\n"
+
+#: help.c:466
+#, c-format
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" pokud nastaveno, jsou vypsána pouze data z tabulky\n"
+
+#: help.c:468
+#, c-format
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" nastaví styl Unicode rámečků [single, double]\n"
+
+#: help.c:473
+#, c-format
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Proměnné prostředí:\n"
+
+#: help.c:477
+#, c-format
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" nebo \\setenv NAME [VALUE] v rámci psql\n"
+"\n"
+
+#: help.c:479
+#, c-format
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" nebo \\setenv NAME [VALUE] v rámci psql\n"
+"\n"
+
+#: help.c:482
+#, c-format
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" počet sloupců pro zalamovaný formát\n"
+
+#: help.c:484
+#, c-format
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" stejné jako application_name v parametrech spojení\n"
+
+#: help.c:486
+#, c-format
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" stejné jako dbname v parametrech spojení\n"
+
+#: help.c:488
+#, c-format
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" stejné jako host v parametrech spojení\n"
+
+#: help.c:490
+#, c-format
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" heslo pro spojení (nedoporučuje se)\n"
+
+#: help.c:492
+#, c-format
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" jméno souboru s hesly\n"
+
+#: help.c:494
+#, c-format
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" stejné jako port v parametrech spojení\n"
+
+#: help.c:496
+#, c-format
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" stejné jako user v parametrech spojení\n"
+
+#: help.c:498
+#, c-format
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor používaný příkazy \\e, \\ef, a \\ev\n"
+
+#: help.c:500
+#, c-format
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" jak specifikovat číslo řádky při spouštění editoru\n"
+
+#: help.c:502
+#, c-format
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" alternativní umístění pro soubor s historií příkazů\n"
+
+#: help.c:504
+#, c-format
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" jméno externího stránkovacího programu (pageru)\n"
+
+#: help.c:506
+#, c-format
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" alternativní umístění uživatelova .psqlrc souboru\n"
+
+#: help.c:508
+#, c-format
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" shell používaný \\! příkazem\n"
+
+#: help.c:510
+#, c-format
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" adresář pro dočasné soubory\n"
+
+#: help.c:554
+msgid "Available help:\n"
+msgstr "Dostupná nápověda:\n"
+
+#: help.c:642
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Příkaz: %s\n"
+"Popis: %s\n"
+"Syntaxe:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:661
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Nápověda pro \"%s\" je nedostupná.\n"
+"Pomocí \\h bez parametrů lze získat seznam dostupných nápověd.\n"
+
+#: input.c:217
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "nelze číst vstupní soubor: %m"
+
+#: input.c:471 input.c:509
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "nelze uložit historii do souboru \"%s\": %m"
+
+#: input.c:528
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "historie není podporována pro tuto instalaci"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: není spojení s databází"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: současná transakce je přerušena (abort)"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: neznámý status transakce"
+
+#: large_obj.c:288 large_obj.c:299
+msgid "ID"
+msgstr "ID"
+
+#: large_obj.c:309
+msgid "Large objects"
+msgstr "Velké objekty (LO)"
+
+#: mainloop.c:136
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: escapované"
+
+#: mainloop.c:195
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Použijte \"\\q\" pro odchod z %s.\n"
+
+#: mainloop.c:217
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"Na vstupu je dump v PostgreSQL \"custom\" formátu.\n"
+"Pro obnovení této zálohy použijte klienta pg_restore pro příkazovou řádku.\n"
+
+#: mainloop.c:298
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Použijte \\? pro nápovědu nebo stiskněte control-C pro vymazání vstupního bufferu."
+
+#: mainloop.c:300
+msgid "Use \\? for help."
+msgstr "Pro zobrazení nápovědy použijte \"\\?\"."
+
+#: mainloop.c:304
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Používáte psql, řádkový nástroj pro připojení k PostgreSQL."
+
+#: mainloop.c:305
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Pište: \\copyright pro podmínky distribuce\n"
+" \\h pro nápovědu k SQL příkazům\n"
+" \\? pro nápovědu k psql příkazům\n"
+" \\g nebo středník pro ukončení SQL příkazů\n"
+" \\q pro ukončení programu\n"
+
+#: mainloop.c:329
+msgid "Use \\q to quit."
+msgstr "Použijte \\q pro ukončení."
+
+#: mainloop.c:332 mainloop.c:356
+msgid "Use control-D to quit."
+msgstr "Použijte control-D pro ukončení."
+
+#: mainloop.c:334 mainloop.c:358
+msgid "Use control-C to quit."
+msgstr "Použijte control-C pro ukončení."
+
+#: mainloop.c:465 mainloop.c:613
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "dotaz ignorován; použijte \\endif nebo Ctrl-C pro ukončení aktuálního \\if bloku"
+
+#: mainloop.c:631
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "dosažen EOF bez nalezení ukončujícího \\endif(s)"
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "neukončený řetězec v uvozovkách"
+
+#: psqlscanslash.l:811
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: nedostatek paměti"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:111 sql_help.c:117 sql_help.c:119 sql_help.c:121 sql_help.c:123
+#: sql_help.c:126 sql_help.c:128 sql_help.c:130 sql_help.c:235 sql_help.c:237
+#: sql_help.c:238 sql_help.c:240 sql_help.c:242 sql_help.c:245 sql_help.c:247
+#: sql_help.c:249 sql_help.c:251 sql_help.c:263 sql_help.c:264 sql_help.c:265
+#: sql_help.c:267 sql_help.c:316 sql_help.c:318 sql_help.c:320 sql_help.c:322
+#: sql_help.c:391 sql_help.c:396 sql_help.c:398 sql_help.c:440 sql_help.c:442
+#: sql_help.c:445 sql_help.c:447 sql_help.c:515 sql_help.c:520 sql_help.c:525
+#: sql_help.c:530 sql_help.c:535 sql_help.c:588 sql_help.c:590 sql_help.c:592
+#: sql_help.c:594 sql_help.c:596 sql_help.c:599 sql_help.c:601 sql_help.c:604
+#: sql_help.c:615 sql_help.c:617 sql_help.c:658 sql_help.c:660 sql_help.c:662
+#: sql_help.c:665 sql_help.c:667 sql_help.c:669 sql_help.c:702 sql_help.c:706
+#: sql_help.c:710 sql_help.c:729 sql_help.c:732 sql_help.c:735 sql_help.c:764
+#: sql_help.c:776 sql_help.c:784 sql_help.c:787 sql_help.c:790 sql_help.c:805
+#: sql_help.c:808 sql_help.c:837 sql_help.c:842 sql_help.c:847 sql_help.c:852
+#: sql_help.c:857 sql_help.c:879 sql_help.c:881 sql_help.c:883 sql_help.c:885
+#: sql_help.c:888 sql_help.c:890 sql_help.c:931 sql_help.c:975 sql_help.c:980
+#: sql_help.c:985 sql_help.c:990 sql_help.c:995 sql_help.c:1014 sql_help.c:1025
+#: sql_help.c:1027 sql_help.c:1046 sql_help.c:1056 sql_help.c:1058
+#: sql_help.c:1060 sql_help.c:1072 sql_help.c:1076 sql_help.c:1078
+#: sql_help.c:1090 sql_help.c:1092 sql_help.c:1094 sql_help.c:1096
+#: sql_help.c:1112 sql_help.c:1114 sql_help.c:1118 sql_help.c:1121
+#: sql_help.c:1122 sql_help.c:1123 sql_help.c:1126 sql_help.c:1128
+#: sql_help.c:1262 sql_help.c:1264 sql_help.c:1267 sql_help.c:1270
+#: sql_help.c:1272 sql_help.c:1274 sql_help.c:1277 sql_help.c:1280
+#: sql_help.c:1391 sql_help.c:1393 sql_help.c:1395 sql_help.c:1398
+#: sql_help.c:1419 sql_help.c:1422 sql_help.c:1425 sql_help.c:1428
+#: sql_help.c:1432 sql_help.c:1434 sql_help.c:1436 sql_help.c:1438
+#: sql_help.c:1452 sql_help.c:1455 sql_help.c:1457 sql_help.c:1459
+#: sql_help.c:1469 sql_help.c:1471 sql_help.c:1481 sql_help.c:1483
+#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1519 sql_help.c:1521
+#: sql_help.c:1523 sql_help.c:1525 sql_help.c:1528 sql_help.c:1530
+#: sql_help.c:1533 sql_help.c:1536 sql_help.c:1586 sql_help.c:1629
+#: sql_help.c:1632 sql_help.c:1634 sql_help.c:1636 sql_help.c:1639
+#: sql_help.c:1641 sql_help.c:1643 sql_help.c:1646 sql_help.c:1696
+#: sql_help.c:1712 sql_help.c:1933 sql_help.c:2002 sql_help.c:2021
+#: sql_help.c:2034 sql_help.c:2091 sql_help.c:2098 sql_help.c:2108
+#: sql_help.c:2129 sql_help.c:2155 sql_help.c:2173 sql_help.c:2200
+#: sql_help.c:2295 sql_help.c:2340 sql_help.c:2364 sql_help.c:2387
+#: sql_help.c:2391 sql_help.c:2425 sql_help.c:2445 sql_help.c:2467
+#: sql_help.c:2481 sql_help.c:2501 sql_help.c:2524 sql_help.c:2554
+#: sql_help.c:2579 sql_help.c:2625 sql_help.c:2903 sql_help.c:2916
+#: sql_help.c:2933 sql_help.c:2949 sql_help.c:2989 sql_help.c:3041
+#: sql_help.c:3045 sql_help.c:3047 sql_help.c:3053 sql_help.c:3071
+#: sql_help.c:3098 sql_help.c:3133 sql_help.c:3145 sql_help.c:3154
+#: sql_help.c:3198 sql_help.c:3212 sql_help.c:3240 sql_help.c:3248
+#: sql_help.c:3260 sql_help.c:3270 sql_help.c:3278 sql_help.c:3286
+#: sql_help.c:3294 sql_help.c:3302 sql_help.c:3311 sql_help.c:3322
+#: sql_help.c:3330 sql_help.c:3338 sql_help.c:3346 sql_help.c:3354
+#: sql_help.c:3364 sql_help.c:3373 sql_help.c:3382 sql_help.c:3390
+#: sql_help.c:3400 sql_help.c:3411 sql_help.c:3419 sql_help.c:3428
+#: sql_help.c:3439 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464
+#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3488 sql_help.c:3496
+#: sql_help.c:3504 sql_help.c:3512 sql_help.c:3520 sql_help.c:3528
+#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3562 sql_help.c:3579
+#: sql_help.c:3594 sql_help.c:3869 sql_help.c:3920 sql_help.c:3949
+#: sql_help.c:3962 sql_help.c:4407 sql_help.c:4455 sql_help.c:4596
+msgid "name"
+msgstr "jméno"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1783
+#: sql_help.c:3213 sql_help.c:4193
+msgid "aggregate_signature"
+msgstr "aggregate_signature"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:118 sql_help.c:250
+#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:524 sql_help.c:571
+#: sql_help.c:589 sql_help.c:616 sql_help.c:666 sql_help.c:731 sql_help.c:786
+#: sql_help.c:807 sql_help.c:846 sql_help.c:891 sql_help.c:932 sql_help.c:984
+#: sql_help.c:1016 sql_help.c:1026 sql_help.c:1059 sql_help.c:1079
+#: sql_help.c:1093 sql_help.c:1129 sql_help.c:1271 sql_help.c:1392
+#: sql_help.c:1435 sql_help.c:1456 sql_help.c:1470 sql_help.c:1482
+#: sql_help.c:1495 sql_help.c:1522 sql_help.c:1587 sql_help.c:1640
+msgid "new_name"
+msgstr "nové_jméno"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:120 sql_help.c:248
+#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:529 sql_help.c:618
+#: sql_help.c:627 sql_help.c:685 sql_help.c:705 sql_help.c:734 sql_help.c:789
+#: sql_help.c:851 sql_help.c:889 sql_help.c:989 sql_help.c:1028 sql_help.c:1057
+#: sql_help.c:1077 sql_help.c:1091 sql_help.c:1127 sql_help.c:1332
+#: sql_help.c:1394 sql_help.c:1437 sql_help.c:1458 sql_help.c:1520
+#: sql_help.c:1635 sql_help.c:2889
+msgid "new_owner"
+msgstr "nový_vlastník"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:252 sql_help.c:319
+#: sql_help.c:448 sql_help.c:534 sql_help.c:668 sql_help.c:709 sql_help.c:737
+#: sql_help.c:792 sql_help.c:856 sql_help.c:994 sql_help.c:1061 sql_help.c:1095
+#: sql_help.c:1273 sql_help.c:1439 sql_help.c:1460 sql_help.c:1472
+#: sql_help.c:1484 sql_help.c:1524 sql_help.c:1642
+msgid "new_schema"
+msgstr "nové_schéma"
+
+#: sql_help.c:44 sql_help.c:1847 sql_help.c:3214 sql_help.c:4222
+msgid "where aggregate_signature is:"
+msgstr "kde aggregate_signature je:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:337 sql_help.c:350
+#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:516
+#: sql_help.c:521 sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:838
+#: sql_help.c:843 sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:976
+#: sql_help.c:981 sql_help.c:986 sql_help.c:991 sql_help.c:996 sql_help.c:1801
+#: sql_help.c:1818 sql_help.c:1824 sql_help.c:1848 sql_help.c:1851
+#: sql_help.c:1854 sql_help.c:2003 sql_help.c:2022 sql_help.c:2025
+#: sql_help.c:2296 sql_help.c:2502 sql_help.c:3215 sql_help.c:3218
+#: sql_help.c:3221 sql_help.c:3312 sql_help.c:3401 sql_help.c:3429
+#: sql_help.c:3753 sql_help.c:4101 sql_help.c:4199 sql_help.c:4206
+#: sql_help.c:4212 sql_help.c:4223 sql_help.c:4226 sql_help.c:4229
+msgid "argmode"
+msgstr "mód_argumentu"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:338 sql_help.c:351
+#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:517
+#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:839
+#: sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:977
+#: sql_help.c:982 sql_help.c:987 sql_help.c:992 sql_help.c:997 sql_help.c:1802
+#: sql_help.c:1819 sql_help.c:1825 sql_help.c:1849 sql_help.c:1852
+#: sql_help.c:1855 sql_help.c:2004 sql_help.c:2023 sql_help.c:2026
+#: sql_help.c:2297 sql_help.c:2503 sql_help.c:3216 sql_help.c:3219
+#: sql_help.c:3222 sql_help.c:3313 sql_help.c:3402 sql_help.c:3430
+#: sql_help.c:4200 sql_help.c:4207 sql_help.c:4213 sql_help.c:4224
+#: sql_help.c:4227 sql_help.c:4230
+msgid "argname"
+msgstr "jméno_argumentu"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:339 sql_help.c:352
+#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:518
+#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:840
+#: sql_help.c:845 sql_help.c:850 sql_help.c:855 sql_help.c:860 sql_help.c:978
+#: sql_help.c:983 sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1803
+#: sql_help.c:1820 sql_help.c:1826 sql_help.c:1850 sql_help.c:1853
+#: sql_help.c:1856 sql_help.c:2298 sql_help.c:2504 sql_help.c:3217
+#: sql_help.c:3220 sql_help.c:3223 sql_help.c:3314 sql_help.c:3403
+#: sql_help.c:3431 sql_help.c:4201 sql_help.c:4208 sql_help.c:4214
+#: sql_help.c:4225 sql_help.c:4228 sql_help.c:4231
+msgid "argtype"
+msgstr "typ_argumentu"
+
+#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:926
+#: sql_help.c:1074 sql_help.c:1453 sql_help.c:1581 sql_help.c:1613
+#: sql_help.c:1665 sql_help.c:1904 sql_help.c:1911 sql_help.c:2203
+#: sql_help.c:2245 sql_help.c:2252 sql_help.c:2261 sql_help.c:2341
+#: sql_help.c:2555 sql_help.c:2647 sql_help.c:2918 sql_help.c:3099
+#: sql_help.c:3121 sql_help.c:3261 sql_help.c:3616 sql_help.c:3788
+#: sql_help.c:3961 sql_help.c:4658
+msgid "option"
+msgstr "volba"
+
+#: sql_help.c:113 sql_help.c:927 sql_help.c:1582 sql_help.c:2342
+#: sql_help.c:2556 sql_help.c:3100 sql_help.c:3262
+msgid "where option can be:"
+msgstr "kde volba může být:"
+
+#: sql_help.c:114 sql_help.c:2137
+msgid "allowconn"
+msgstr "allowconn"
+
+#: sql_help.c:115 sql_help.c:928 sql_help.c:1583 sql_help.c:2138
+#: sql_help.c:2343 sql_help.c:2557 sql_help.c:3101
+msgid "connlimit"
+msgstr "connlimit"
+
+#: sql_help.c:116 sql_help.c:2139
+msgid "istemplate"
+msgstr "istemplate"
+
+#: sql_help.c:122 sql_help.c:606 sql_help.c:671 sql_help.c:1276 sql_help.c:1325
+msgid "new_tablespace"
+msgstr "nový_tablespace"
+
+#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:544 sql_help.c:546
+#: sql_help.c:547 sql_help.c:863 sql_help.c:865 sql_help.c:866 sql_help.c:935
+#: sql_help.c:939 sql_help.c:942 sql_help.c:1003 sql_help.c:1005
+#: sql_help.c:1006 sql_help.c:1140 sql_help.c:1143 sql_help.c:1590
+#: sql_help.c:1594 sql_help.c:1597 sql_help.c:2308 sql_help.c:2508
+#: sql_help.c:3980 sql_help.c:4396
+msgid "configuration_parameter"
+msgstr "konfigurační_parametr"
+
+#: sql_help.c:125 sql_help.c:395 sql_help.c:466 sql_help.c:472 sql_help.c:484
+#: sql_help.c:545 sql_help.c:598 sql_help.c:677 sql_help.c:683 sql_help.c:864
+#: sql_help.c:887 sql_help.c:936 sql_help.c:1004 sql_help.c:1075
+#: sql_help.c:1117 sql_help.c:1120 sql_help.c:1125 sql_help.c:1141
+#: sql_help.c:1142 sql_help.c:1307 sql_help.c:1327 sql_help.c:1375
+#: sql_help.c:1397 sql_help.c:1454 sql_help.c:1538 sql_help.c:1591
+#: sql_help.c:1614 sql_help.c:2204 sql_help.c:2246 sql_help.c:2253
+#: sql_help.c:2262 sql_help.c:2309 sql_help.c:2310 sql_help.c:2372
+#: sql_help.c:2375 sql_help.c:2409 sql_help.c:2509 sql_help.c:2510
+#: sql_help.c:2527 sql_help.c:2648 sql_help.c:2678 sql_help.c:2783
+#: sql_help.c:2796 sql_help.c:2810 sql_help.c:2851 sql_help.c:2875
+#: sql_help.c:2892 sql_help.c:2919 sql_help.c:3122 sql_help.c:3789
+#: sql_help.c:4397 sql_help.c:4398
+msgid "value"
+msgstr "hodnota"
+
+#: sql_help.c:197
+msgid "target_role"
+msgstr "cílová_role"
+
+#: sql_help.c:198 sql_help.c:2188 sql_help.c:2603 sql_help.c:2608
+#: sql_help.c:3735 sql_help.c:3742 sql_help.c:3756 sql_help.c:3762
+#: sql_help.c:4083 sql_help.c:4090 sql_help.c:4104 sql_help.c:4110
+msgid "schema_name"
+msgstr "jméno_schématu"
+
+#: sql_help.c:199
+msgid "abbreviated_grant_or_revoke"
+msgstr "zkrácený_grant_nebo_revoke"
+
+#: sql_help.c:200
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "kde zkrácený_grant_nebo_revoke je jedno z:"
+
+#: sql_help.c:201 sql_help.c:202 sql_help.c:203 sql_help.c:204 sql_help.c:205
+#: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210
+#: sql_help.c:569 sql_help.c:605 sql_help.c:670 sql_help.c:810 sql_help.c:946
+#: sql_help.c:1275 sql_help.c:1601 sql_help.c:2346 sql_help.c:2347
+#: sql_help.c:2348 sql_help.c:2349 sql_help.c:2350 sql_help.c:2483
+#: sql_help.c:2560 sql_help.c:2561 sql_help.c:2562 sql_help.c:2563
+#: sql_help.c:2564 sql_help.c:3104 sql_help.c:3105 sql_help.c:3106
+#: sql_help.c:3107 sql_help.c:3108 sql_help.c:3768 sql_help.c:3772
+#: sql_help.c:4116 sql_help.c:4120 sql_help.c:4417
+msgid "role_name"
+msgstr "jméno_role"
+
+#: sql_help.c:236 sql_help.c:459 sql_help.c:1291 sql_help.c:1293
+#: sql_help.c:1342 sql_help.c:1354 sql_help.c:1379 sql_help.c:1631
+#: sql_help.c:2158 sql_help.c:2162 sql_help.c:2265 sql_help.c:2270
+#: sql_help.c:2368 sql_help.c:2778 sql_help.c:2791 sql_help.c:2805
+#: sql_help.c:2814 sql_help.c:2826 sql_help.c:2855 sql_help.c:3820
+#: sql_help.c:3835 sql_help.c:3837 sql_help.c:4282 sql_help.c:4283
+#: sql_help.c:4292 sql_help.c:4333 sql_help.c:4334 sql_help.c:4335
+#: sql_help.c:4336 sql_help.c:4337 sql_help.c:4338 sql_help.c:4371
+#: sql_help.c:4372 sql_help.c:4377 sql_help.c:4382 sql_help.c:4521
+#: sql_help.c:4522 sql_help.c:4531 sql_help.c:4572 sql_help.c:4573
+#: sql_help.c:4574 sql_help.c:4575 sql_help.c:4576 sql_help.c:4577
+#: sql_help.c:4624 sql_help.c:4626 sql_help.c:4685 sql_help.c:4741
+#: sql_help.c:4742 sql_help.c:4751 sql_help.c:4792 sql_help.c:4793
+#: sql_help.c:4794 sql_help.c:4795 sql_help.c:4796 sql_help.c:4797
+msgid "expression"
+msgstr "výraz"
+
+#: sql_help.c:239
+msgid "domain_constraint"
+msgstr "omezení_domény"
+
+#: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:474 sql_help.c:475
+#: sql_help.c:1268 sql_help.c:1313 sql_help.c:1314 sql_help.c:1315
+#: sql_help.c:1341 sql_help.c:1353 sql_help.c:1370 sql_help.c:1789
+#: sql_help.c:1791 sql_help.c:2161 sql_help.c:2264 sql_help.c:2269
+#: sql_help.c:2813 sql_help.c:2825 sql_help.c:3832
+msgid "constraint_name"
+msgstr "jméno_omezení"
+
+#: sql_help.c:244 sql_help.c:1269
+msgid "new_constraint_name"
+msgstr "jméno_nového_omezení"
+
+#: sql_help.c:317 sql_help.c:1073
+msgid "new_version"
+msgstr "nová_verze"
+
+#: sql_help.c:321 sql_help.c:323
+msgid "member_object"
+msgstr "členský_objekt"
+
+#: sql_help.c:324
+msgid "where member_object is:"
+msgstr "kde členský_objekt je:"
+
+#: sql_help.c:325 sql_help.c:330 sql_help.c:331 sql_help.c:332 sql_help.c:333
+#: sql_help.c:334 sql_help.c:335 sql_help.c:340 sql_help.c:344 sql_help.c:346
+#: sql_help.c:348 sql_help.c:357 sql_help.c:358 sql_help.c:359 sql_help.c:360
+#: sql_help.c:361 sql_help.c:362 sql_help.c:363 sql_help.c:364 sql_help.c:367
+#: sql_help.c:368 sql_help.c:1781 sql_help.c:1786 sql_help.c:1793
+#: sql_help.c:1794 sql_help.c:1795 sql_help.c:1796 sql_help.c:1797
+#: sql_help.c:1798 sql_help.c:1799 sql_help.c:1804 sql_help.c:1806
+#: sql_help.c:1810 sql_help.c:1812 sql_help.c:1816 sql_help.c:1821
+#: sql_help.c:1822 sql_help.c:1829 sql_help.c:1830 sql_help.c:1831
+#: sql_help.c:1832 sql_help.c:1833 sql_help.c:1834 sql_help.c:1835
+#: sql_help.c:1836 sql_help.c:1837 sql_help.c:1838 sql_help.c:1839
+#: sql_help.c:1844 sql_help.c:1845 sql_help.c:4189 sql_help.c:4194
+#: sql_help.c:4195 sql_help.c:4196 sql_help.c:4197 sql_help.c:4203
+#: sql_help.c:4204 sql_help.c:4209 sql_help.c:4210 sql_help.c:4215
+#: sql_help.c:4216 sql_help.c:4217 sql_help.c:4218 sql_help.c:4219
+#: sql_help.c:4220
+msgid "object_name"
+msgstr "jméno_objektu"
+
+#: sql_help.c:326 sql_help.c:1782 sql_help.c:4192
+msgid "aggregate_name"
+msgstr "aggregate_name"
+
+#: sql_help.c:328 sql_help.c:1784 sql_help.c:2068 sql_help.c:2072
+#: sql_help.c:2074 sql_help.c:3231
+msgid "source_type"
+msgstr "zdrojový_typ"
+
+#: sql_help.c:329 sql_help.c:1785 sql_help.c:2069 sql_help.c:2073
+#: sql_help.c:2075 sql_help.c:3232
+msgid "target_type"
+msgstr "cílový_typ"
+
+#: sql_help.c:336 sql_help.c:774 sql_help.c:1800 sql_help.c:2070
+#: sql_help.c:2111 sql_help.c:2176 sql_help.c:2426 sql_help.c:2457
+#: sql_help.c:2995 sql_help.c:4100 sql_help.c:4198 sql_help.c:4311
+#: sql_help.c:4315 sql_help.c:4319 sql_help.c:4322 sql_help.c:4550
+#: sql_help.c:4554 sql_help.c:4558 sql_help.c:4561 sql_help.c:4770
+#: sql_help.c:4774 sql_help.c:4778 sql_help.c:4781
+msgid "function_name"
+msgstr "jméno_funkce"
+
+#: sql_help.c:341 sql_help.c:767 sql_help.c:1807 sql_help.c:2450
+msgid "operator_name"
+msgstr "jméno_operátoru"
+
+#: sql_help.c:342 sql_help.c:703 sql_help.c:707 sql_help.c:711 sql_help.c:1808
+#: sql_help.c:2427 sql_help.c:3355
+msgid "left_type"
+msgstr "levý_typ"
+
+#: sql_help.c:343 sql_help.c:704 sql_help.c:708 sql_help.c:712 sql_help.c:1809
+#: sql_help.c:2428 sql_help.c:3356
+msgid "right_type"
+msgstr "pravý_typ"
+
+#: sql_help.c:345 sql_help.c:347 sql_help.c:730 sql_help.c:733 sql_help.c:736
+#: sql_help.c:765 sql_help.c:777 sql_help.c:785 sql_help.c:788 sql_help.c:791
+#: sql_help.c:1359 sql_help.c:1811 sql_help.c:1813 sql_help.c:2447
+#: sql_help.c:2468 sql_help.c:2831 sql_help.c:3365 sql_help.c:3374
+msgid "index_method"
+msgstr "metoda_indexování"
+
+#: sql_help.c:349 sql_help.c:1817 sql_help.c:4205
+msgid "procedure_name"
+msgstr "procedure_name"
+
+#: sql_help.c:353 sql_help.c:1823 sql_help.c:3752 sql_help.c:4211
+msgid "routine_name"
+msgstr "routine_name"
+
+#: sql_help.c:365 sql_help.c:1331 sql_help.c:1840 sql_help.c:2304
+#: sql_help.c:2507 sql_help.c:2786 sql_help.c:2962 sql_help.c:3536
+#: sql_help.c:3766 sql_help.c:4114
+msgid "type_name"
+msgstr "jméno_typu"
+
+#: sql_help.c:366 sql_help.c:1841 sql_help.c:2303 sql_help.c:2506
+#: sql_help.c:2963 sql_help.c:3189 sql_help.c:3537 sql_help.c:3758
+#: sql_help.c:4106
+msgid "lang_name"
+msgstr "jméno_jazyka"
+
+#: sql_help.c:369
+msgid "and aggregate_signature is:"
+msgstr "a aggregate_signature je:"
+
+#: sql_help.c:392 sql_help.c:1935 sql_help.c:2201
+msgid "handler_function"
+msgstr "handler_function"
+
+#: sql_help.c:393 sql_help.c:2202
+msgid "validator_function"
+msgstr "validator_function"
+
+#: sql_help.c:441 sql_help.c:519 sql_help.c:659 sql_help.c:841 sql_help.c:979
+#: sql_help.c:1263 sql_help.c:1529
+msgid "action"
+msgstr "akce"
+
+#: sql_help.c:443 sql_help.c:450 sql_help.c:454 sql_help.c:455 sql_help.c:458
+#: sql_help.c:460 sql_help.c:461 sql_help.c:462 sql_help.c:464 sql_help.c:467
+#: sql_help.c:469 sql_help.c:470 sql_help.c:663 sql_help.c:673 sql_help.c:675
+#: sql_help.c:678 sql_help.c:680 sql_help.c:1055 sql_help.c:1265
+#: sql_help.c:1283 sql_help.c:1287 sql_help.c:1288 sql_help.c:1292
+#: sql_help.c:1294 sql_help.c:1295 sql_help.c:1296 sql_help.c:1297
+#: sql_help.c:1299 sql_help.c:1302 sql_help.c:1303 sql_help.c:1305
+#: sql_help.c:1308 sql_help.c:1310 sql_help.c:1355 sql_help.c:1357
+#: sql_help.c:1364 sql_help.c:1373 sql_help.c:1378 sql_help.c:1630
+#: sql_help.c:1633 sql_help.c:1637 sql_help.c:1673 sql_help.c:1788
+#: sql_help.c:1901 sql_help.c:1907 sql_help.c:1920 sql_help.c:1921
+#: sql_help.c:1922 sql_help.c:2243 sql_help.c:2256 sql_help.c:2301
+#: sql_help.c:2367 sql_help.c:2373 sql_help.c:2406 sql_help.c:2633
+#: sql_help.c:2661 sql_help.c:2662 sql_help.c:2769 sql_help.c:2777
+#: sql_help.c:2787 sql_help.c:2790 sql_help.c:2800 sql_help.c:2804
+#: sql_help.c:2827 sql_help.c:2829 sql_help.c:2836 sql_help.c:2849
+#: sql_help.c:2854 sql_help.c:2872 sql_help.c:2998 sql_help.c:3134
+#: sql_help.c:3737 sql_help.c:3738 sql_help.c:3819 sql_help.c:3834
+#: sql_help.c:3836 sql_help.c:3838 sql_help.c:4085 sql_help.c:4086
+#: sql_help.c:4191 sql_help.c:4342 sql_help.c:4581 sql_help.c:4623
+#: sql_help.c:4625 sql_help.c:4627 sql_help.c:4673 sql_help.c:4801
+msgid "column_name"
+msgstr "jméno_sloupce"
+
+#: sql_help.c:444 sql_help.c:664 sql_help.c:1266 sql_help.c:1638
+msgid "new_column_name"
+msgstr "nové_jméno_sloupce"
+
+#: sql_help.c:449 sql_help.c:540 sql_help.c:672 sql_help.c:862 sql_help.c:1000
+#: sql_help.c:1282 sql_help.c:1539
+msgid "where action is one of:"
+msgstr "kde akce je jedno z:"
+
+#: sql_help.c:451 sql_help.c:456 sql_help.c:1047 sql_help.c:1284
+#: sql_help.c:1289 sql_help.c:1541 sql_help.c:1545 sql_help.c:2156
+#: sql_help.c:2244 sql_help.c:2446 sql_help.c:2626 sql_help.c:2770
+#: sql_help.c:3043 sql_help.c:3921
+msgid "data_type"
+msgstr "datový_typ"
+
+#: sql_help.c:452 sql_help.c:457 sql_help.c:1285 sql_help.c:1290
+#: sql_help.c:1542 sql_help.c:1546 sql_help.c:2157 sql_help.c:2247
+#: sql_help.c:2369 sql_help.c:2771 sql_help.c:2779 sql_help.c:2792
+#: sql_help.c:2806 sql_help.c:3044 sql_help.c:3050 sql_help.c:3829
+msgid "collation"
+msgstr "collation"
+
+#: sql_help.c:453 sql_help.c:1286 sql_help.c:2248 sql_help.c:2257
+#: sql_help.c:2772 sql_help.c:2788 sql_help.c:2801
+msgid "column_constraint"
+msgstr "omezení_sloupce"
+
+#: sql_help.c:463 sql_help.c:603 sql_help.c:674 sql_help.c:1304 sql_help.c:4670
+msgid "integer"
+msgstr "integer"
+
+#: sql_help.c:465 sql_help.c:468 sql_help.c:676 sql_help.c:679 sql_help.c:1306
+#: sql_help.c:1309
+msgid "attribute_option"
+msgstr "volba_atributu"
+
+#: sql_help.c:473 sql_help.c:1311 sql_help.c:2249 sql_help.c:2258
+#: sql_help.c:2773 sql_help.c:2789 sql_help.c:2802
+msgid "table_constraint"
+msgstr "omezení_tabulky"
+
+#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1316
+#: sql_help.c:1317 sql_help.c:1318 sql_help.c:1319 sql_help.c:1842
+msgid "trigger_name"
+msgstr "jméno_triggeru"
+
+#: sql_help.c:480 sql_help.c:481 sql_help.c:1329 sql_help.c:1330
+#: sql_help.c:2250 sql_help.c:2255 sql_help.c:2776 sql_help.c:2799
+msgid "parent_table"
+msgstr "nadřízená_tabulka"
+
+#: sql_help.c:539 sql_help.c:595 sql_help.c:661 sql_help.c:861 sql_help.c:999
+#: sql_help.c:1498 sql_help.c:2187
+msgid "extension_name"
+msgstr "název_extension"
+
+#: sql_help.c:541 sql_help.c:1001 sql_help.c:2305
+msgid "execution_cost"
+msgstr "execution_cost"
+
+#: sql_help.c:542 sql_help.c:1002 sql_help.c:2306
+msgid "result_rows"
+msgstr "výsledné_řádky"
+
+#: sql_help.c:543 sql_help.c:2307
+msgid "support_function"
+msgstr "support_funkce"
+
+#: sql_help.c:564 sql_help.c:566 sql_help.c:925 sql_help.c:933 sql_help.c:937
+#: sql_help.c:940 sql_help.c:943 sql_help.c:1580 sql_help.c:1588
+#: sql_help.c:1592 sql_help.c:1595 sql_help.c:1598 sql_help.c:2604
+#: sql_help.c:2606 sql_help.c:2609 sql_help.c:2610 sql_help.c:3736
+#: sql_help.c:3740 sql_help.c:3743 sql_help.c:3745 sql_help.c:3747
+#: sql_help.c:3749 sql_help.c:3751 sql_help.c:3757 sql_help.c:3759
+#: sql_help.c:3761 sql_help.c:3763 sql_help.c:3765 sql_help.c:3767
+#: sql_help.c:3769 sql_help.c:3770 sql_help.c:4084 sql_help.c:4088
+#: sql_help.c:4091 sql_help.c:4093 sql_help.c:4095 sql_help.c:4097
+#: sql_help.c:4099 sql_help.c:4105 sql_help.c:4107 sql_help.c:4109
+#: sql_help.c:4111 sql_help.c:4113 sql_help.c:4115 sql_help.c:4117
+#: sql_help.c:4118
+msgid "role_specification"
+msgstr "role_specification"
+
+#: sql_help.c:565 sql_help.c:567 sql_help.c:1611 sql_help.c:2130
+#: sql_help.c:2612 sql_help.c:3119 sql_help.c:3570 sql_help.c:4427
+msgid "user_name"
+msgstr "uživatel"
+
+#: sql_help.c:568 sql_help.c:945 sql_help.c:1600 sql_help.c:2611
+#: sql_help.c:3771 sql_help.c:4119
+msgid "where role_specification can be:"
+msgstr "kde role_specification může být:"
+
+#: sql_help.c:570
+msgid "group_name"
+msgstr "group_name"
+
+#: sql_help.c:591 sql_help.c:1376 sql_help.c:2136 sql_help.c:2376
+#: sql_help.c:2410 sql_help.c:2784 sql_help.c:2797 sql_help.c:2811
+#: sql_help.c:2852 sql_help.c:2876 sql_help.c:2888 sql_help.c:3764
+#: sql_help.c:4112
+msgid "tablespace_name"
+msgstr "jméno_tablespace"
+
+#: sql_help.c:593 sql_help.c:681 sql_help.c:1324 sql_help.c:1333
+#: sql_help.c:1371 sql_help.c:1722
+msgid "index_name"
+msgstr "jméno_indexu"
+
+#: sql_help.c:597 sql_help.c:600 sql_help.c:682 sql_help.c:684 sql_help.c:1326
+#: sql_help.c:1328 sql_help.c:1374 sql_help.c:2374 sql_help.c:2408
+#: sql_help.c:2782 sql_help.c:2795 sql_help.c:2809 sql_help.c:2850
+#: sql_help.c:2874
+msgid "storage_parameter"
+msgstr "parametr_uložení"
+
+#: sql_help.c:602
+msgid "column_number"
+msgstr "column_number"
+
+#: sql_help.c:626 sql_help.c:1805 sql_help.c:4202
+msgid "large_object_oid"
+msgstr "oid_large_objektu"
+
+#: sql_help.c:713 sql_help.c:2431
+msgid "res_proc"
+msgstr "res_proc"
+
+#: sql_help.c:714 sql_help.c:2432
+msgid "join_proc"
+msgstr "join_proc"
+
+#: sql_help.c:766 sql_help.c:778 sql_help.c:2449
+msgid "strategy_number"
+msgstr "číslo_strategie"
+
+#: sql_help.c:768 sql_help.c:769 sql_help.c:772 sql_help.c:773 sql_help.c:779
+#: sql_help.c:780 sql_help.c:782 sql_help.c:783 sql_help.c:2451 sql_help.c:2452
+#: sql_help.c:2455 sql_help.c:2456
+msgid "op_type"
+msgstr "typ_operátoru"
+
+#: sql_help.c:770 sql_help.c:2453
+msgid "sort_family_name"
+msgstr "sort_family_name"
+
+#: sql_help.c:771 sql_help.c:781 sql_help.c:2454
+msgid "support_number"
+msgstr "support_number"
+
+#: sql_help.c:775 sql_help.c:2071 sql_help.c:2458 sql_help.c:2965
+#: sql_help.c:2967
+msgid "argument_type"
+msgstr "typ_argumentu"
+
+#: sql_help.c:806 sql_help.c:809 sql_help.c:880 sql_help.c:882 sql_help.c:884
+#: sql_help.c:1015 sql_help.c:1054 sql_help.c:1494 sql_help.c:1497
+#: sql_help.c:1672 sql_help.c:1721 sql_help.c:1790 sql_help.c:1815
+#: sql_help.c:1828 sql_help.c:1843 sql_help.c:1900 sql_help.c:1906
+#: sql_help.c:2242 sql_help.c:2254 sql_help.c:2365 sql_help.c:2405
+#: sql_help.c:2482 sql_help.c:2525 sql_help.c:2581 sql_help.c:2632
+#: sql_help.c:2663 sql_help.c:2768 sql_help.c:2785 sql_help.c:2798
+#: sql_help.c:2871 sql_help.c:2991 sql_help.c:3168 sql_help.c:3391
+#: sql_help.c:3440 sql_help.c:3546 sql_help.c:3734 sql_help.c:3739
+#: sql_help.c:3785 sql_help.c:3817 sql_help.c:4082 sql_help.c:4087
+#: sql_help.c:4190 sql_help.c:4297 sql_help.c:4299 sql_help.c:4348
+#: sql_help.c:4387 sql_help.c:4536 sql_help.c:4538 sql_help.c:4587
+#: sql_help.c:4621 sql_help.c:4672 sql_help.c:4756 sql_help.c:4758
+#: sql_help.c:4807
+msgid "table_name"
+msgstr "jméno_tabulky"
+
+#: sql_help.c:811 sql_help.c:2484
+msgid "using_expression"
+msgstr "using_expression"
+
+#: sql_help.c:812 sql_help.c:2485
+msgid "check_expression"
+msgstr "check_expression"
+
+#: sql_help.c:886 sql_help.c:2526
+msgid "publication_parameter"
+msgstr "publication_parameter"
+
+#: sql_help.c:929 sql_help.c:1584 sql_help.c:2344 sql_help.c:2558
+#: sql_help.c:3102
+msgid "password"
+msgstr "heslo"
+
+#: sql_help.c:930 sql_help.c:1585 sql_help.c:2345 sql_help.c:2559
+#: sql_help.c:3103
+msgid "timestamp"
+msgstr "timestamp"
+
+#: sql_help.c:934 sql_help.c:938 sql_help.c:941 sql_help.c:944 sql_help.c:1589
+#: sql_help.c:1593 sql_help.c:1596 sql_help.c:1599 sql_help.c:3744
+#: sql_help.c:4092
+msgid "database_name"
+msgstr "jméno_databáze"
+
+#: sql_help.c:1048 sql_help.c:2627
+msgid "increment"
+msgstr "inkrement"
+
+#: sql_help.c:1049 sql_help.c:2628
+msgid "minvalue"
+msgstr "min_hodnota"
+
+#: sql_help.c:1050 sql_help.c:2629
+msgid "maxvalue"
+msgstr "max_hodnota"
+
+#: sql_help.c:1051 sql_help.c:2630 sql_help.c:4295 sql_help.c:4385
+#: sql_help.c:4534 sql_help.c:4689 sql_help.c:4754
+msgid "start"
+msgstr "start"
+
+#: sql_help.c:1052 sql_help.c:1301
+msgid "restart"
+msgstr "restart"
+
+#: sql_help.c:1053 sql_help.c:2631
+msgid "cache"
+msgstr "cache"
+
+#: sql_help.c:1097
+#| msgid "new_table"
+msgid "new_target"
+msgstr "nový_cíl"
+
+#: sql_help.c:1113 sql_help.c:2675
+msgid "conninfo"
+msgstr "conninfo"
+
+#: sql_help.c:1115 sql_help.c:2676
+msgid "publication_name"
+msgstr "publication_name"
+
+#: sql_help.c:1116
+msgid "set_publication_option"
+msgstr "set_publication_option"
+
+#: sql_help.c:1119
+msgid "refresh_option"
+msgstr "refresh_option"
+
+#: sql_help.c:1124 sql_help.c:2677
+msgid "subscription_parameter"
+msgstr "subscription_parameter"
+
+#: sql_help.c:1278 sql_help.c:1281
+msgid "partition_name"
+msgstr "partition_name"
+
+#: sql_help.c:1279 sql_help.c:2259 sql_help.c:2803
+msgid "partition_bound_spec"
+msgstr "partition_bound_spec"
+
+#: sql_help.c:1298 sql_help.c:1345 sql_help.c:2817
+msgid "sequence_options"
+msgstr "sequence_options"
+
+#: sql_help.c:1300
+msgid "sequence_option"
+msgstr "sequence_option"
+
+#: sql_help.c:1312
+msgid "table_constraint_using_index"
+msgstr "omezení_tabulky_s_využitím_indexu"
+
+#: sql_help.c:1320 sql_help.c:1321 sql_help.c:1322 sql_help.c:1323
+msgid "rewrite_rule_name"
+msgstr "přepisovací_pravidlo"
+
+#: sql_help.c:1334 sql_help.c:2842
+msgid "and partition_bound_spec is:"
+msgstr "a partition_bound_spec je:"
+
+#: sql_help.c:1335 sql_help.c:1336 sql_help.c:1337 sql_help.c:2843
+#: sql_help.c:2844 sql_help.c:2845
+msgid "partition_bound_expr"
+msgstr "partition_bound_expr"
+
+#: sql_help.c:1338 sql_help.c:1339 sql_help.c:2846 sql_help.c:2847
+msgid "numeric_literal"
+msgstr "numeric_literal"
+
+#: sql_help.c:1340
+msgid "and column_constraint is:"
+msgstr "a column_constraint je:"
+
+#: sql_help.c:1343 sql_help.c:2266 sql_help.c:2299 sql_help.c:2505
+#: sql_help.c:2815
+msgid "default_expr"
+msgstr "implicitní_výraz"
+
+#: sql_help.c:1344 sql_help.c:2267 sql_help.c:2816
+msgid "generation_expr"
+msgstr "generation_expr"
+
+#: sql_help.c:1346 sql_help.c:1347 sql_help.c:1356 sql_help.c:1358
+#: sql_help.c:1362 sql_help.c:2818 sql_help.c:2819 sql_help.c:2828
+#: sql_help.c:2830 sql_help.c:2834
+msgid "index_parameters"
+msgstr "parametry_indexu"
+
+#: sql_help.c:1348 sql_help.c:1365 sql_help.c:2820 sql_help.c:2837
+msgid "reftable"
+msgstr "odkazovaná_tabulka"
+
+#: sql_help.c:1349 sql_help.c:1366 sql_help.c:2821 sql_help.c:2838
+msgid "refcolumn"
+msgstr "odkazovaný_sloupec"
+
+#: sql_help.c:1350 sql_help.c:1351 sql_help.c:1367 sql_help.c:1368
+#: sql_help.c:2822 sql_help.c:2823 sql_help.c:2839 sql_help.c:2840
+msgid "referential_action"
+msgstr "referential_action"
+
+#: sql_help.c:1352 sql_help.c:2268 sql_help.c:2824
+msgid "and table_constraint is:"
+msgstr "a omezení_tabulky je:"
+
+#: sql_help.c:1360 sql_help.c:2832
+msgid "exclude_element"
+msgstr "exclude_element"
+
+#: sql_help.c:1361 sql_help.c:2833 sql_help.c:4293 sql_help.c:4383
+#: sql_help.c:4532 sql_help.c:4687 sql_help.c:4752
+msgid "operator"
+msgstr "operátor"
+
+#: sql_help.c:1363 sql_help.c:2377 sql_help.c:2835
+msgid "predicate"
+msgstr "predikát"
+
+#: sql_help.c:1369
+msgid "and table_constraint_using_index is:"
+msgstr "a omezení_tabulky_s_využitím_indexu je:"
+
+#: sql_help.c:1372 sql_help.c:2848
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "parametry_indexu v UNIQUE, PRIMARY KEY, a EXCLUDE omezeních jsou:"
+
+#: sql_help.c:1377 sql_help.c:2853
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "exclude_element v EXCLUDE omezení je:"
+
+#: sql_help.c:1380 sql_help.c:2370 sql_help.c:2780 sql_help.c:2793
+#: sql_help.c:2807 sql_help.c:2856 sql_help.c:3830
+msgid "opclass"
+msgstr "třída_operátoru"
+
+#: sql_help.c:1396 sql_help.c:1399 sql_help.c:2891
+msgid "tablespace_option"
+msgstr "volba_tablespace"
+
+#: sql_help.c:1420 sql_help.c:1423 sql_help.c:1429 sql_help.c:1433
+msgid "token_type"
+msgstr "typ_tokenu"
+
+#: sql_help.c:1421 sql_help.c:1424
+msgid "dictionary_name"
+msgstr "jméno_slovníku"
+
+#: sql_help.c:1426 sql_help.c:1430
+msgid "old_dictionary"
+msgstr "starý_slovník"
+
+#: sql_help.c:1427 sql_help.c:1431
+msgid "new_dictionary"
+msgstr "nový_slovník"
+
+#: sql_help.c:1526 sql_help.c:1540 sql_help.c:1543 sql_help.c:1544
+#: sql_help.c:3042
+msgid "attribute_name"
+msgstr "jméno_atributu"
+
+#: sql_help.c:1527
+msgid "new_attribute_name"
+msgstr "nové_jméno_atributu"
+
+#: sql_help.c:1531 sql_help.c:1535
+msgid "new_enum_value"
+msgstr "nová_enum_hodnota"
+
+#: sql_help.c:1532
+msgid "neighbor_enum_value"
+msgstr "neighbor_enum_value"
+
+#: sql_help.c:1534
+msgid "existing_enum_value"
+msgstr "existing_enum_value"
+
+#: sql_help.c:1537
+#| msgid "operator"
+msgid "property"
+msgstr "vlastnost"
+
+#: sql_help.c:1612 sql_help.c:2251 sql_help.c:2260 sql_help.c:2643
+#: sql_help.c:3120 sql_help.c:3571 sql_help.c:3750 sql_help.c:3786
+#: sql_help.c:4098
+msgid "server_name"
+msgstr "jméno_serveru"
+
+#: sql_help.c:1644 sql_help.c:1647 sql_help.c:3135
+msgid "view_option_name"
+msgstr "název_volby_pohledu"
+
+#: sql_help.c:1645 sql_help.c:3136
+msgid "view_option_value"
+msgstr "hodnota_volby_pohledu"
+
+#: sql_help.c:1666 sql_help.c:1667 sql_help.c:4659 sql_help.c:4660
+msgid "table_and_columns"
+msgstr "table_and_columns"
+
+#: sql_help.c:1668 sql_help.c:1912 sql_help.c:3619 sql_help.c:3963
+#: sql_help.c:4661
+msgid "where option can be one of:"
+msgstr "kde volba je jedno z:"
+
+#: sql_help.c:1669 sql_help.c:1670 sql_help.c:1914 sql_help.c:1917
+#: sql_help.c:2096 sql_help.c:3620 sql_help.c:3621 sql_help.c:3622
+#: sql_help.c:3623 sql_help.c:3624 sql_help.c:3625 sql_help.c:3626
+#: sql_help.c:3627 sql_help.c:4662 sql_help.c:4663 sql_help.c:4664
+#: sql_help.c:4665 sql_help.c:4666 sql_help.c:4667 sql_help.c:4668
+#: sql_help.c:4669
+msgid "boolean"
+msgstr "boolean"
+
+#: sql_help.c:1671 sql_help.c:4671
+msgid "and table_and_columns is:"
+msgstr "a table_and_columns je:"
+
+#: sql_help.c:1687 sql_help.c:4443 sql_help.c:4445 sql_help.c:4469
+msgid "transaction_mode"
+msgstr "transakční_mód"
+
+#: sql_help.c:1688 sql_help.c:4446 sql_help.c:4470
+msgid "where transaction_mode is one of:"
+msgstr "kde transakční_mód je jedno z:"
+
+#: sql_help.c:1697 sql_help.c:4303 sql_help.c:4312 sql_help.c:4316
+#: sql_help.c:4320 sql_help.c:4323 sql_help.c:4542 sql_help.c:4551
+#: sql_help.c:4555 sql_help.c:4559 sql_help.c:4562 sql_help.c:4762
+#: sql_help.c:4771 sql_help.c:4775 sql_help.c:4779 sql_help.c:4782
+msgid "argument"
+msgstr "argument"
+
+#: sql_help.c:1787
+msgid "relation_name"
+msgstr "název_relace"
+
+#: sql_help.c:1792 sql_help.c:3746 sql_help.c:4094
+msgid "domain_name"
+msgstr "jméno_domény"
+
+#: sql_help.c:1814
+msgid "policy_name"
+msgstr "policy_name"
+
+#: sql_help.c:1827
+msgid "rule_name"
+msgstr "jméno_pravidla"
+
+#: sql_help.c:1846
+msgid "text"
+msgstr "text"
+
+#: sql_help.c:1871 sql_help.c:3930 sql_help.c:4135
+msgid "transaction_id"
+msgstr "id_transakce"
+
+#: sql_help.c:1902 sql_help.c:1909 sql_help.c:3856
+msgid "filename"
+msgstr "jméno_souboru"
+
+#: sql_help.c:1903 sql_help.c:1910 sql_help.c:2583 sql_help.c:2584
+#: sql_help.c:2585
+msgid "command"
+msgstr "příkaz"
+
+#: sql_help.c:1905 sql_help.c:2582 sql_help.c:2994 sql_help.c:3171
+#: sql_help.c:3840 sql_help.c:4286 sql_help.c:4288 sql_help.c:4376
+#: sql_help.c:4378 sql_help.c:4525 sql_help.c:4527 sql_help.c:4630
+#: sql_help.c:4745 sql_help.c:4747
+msgid "condition"
+msgstr "podmínka"
+
+#: sql_help.c:1908 sql_help.c:2411 sql_help.c:2877 sql_help.c:3137
+#: sql_help.c:3155 sql_help.c:3821
+msgid "query"
+msgstr "dotaz"
+
+#: sql_help.c:1913
+msgid "format_name"
+msgstr "jméno_formátu"
+
+#: sql_help.c:1915
+msgid "delimiter_character"
+msgstr "oddělovací_znak"
+
+#: sql_help.c:1916
+msgid "null_string"
+msgstr "null_string"
+
+#: sql_help.c:1918
+msgid "quote_character"
+msgstr "quote_character"
+
+#: sql_help.c:1919
+msgid "escape_character"
+msgstr "escape_character"
+
+#: sql_help.c:1923
+msgid "encoding_name"
+msgstr "název_kódování"
+
+#: sql_help.c:1934
+msgid "access_method_type"
+msgstr "access_method_type"
+
+#: sql_help.c:2005 sql_help.c:2024 sql_help.c:2027
+msgid "arg_data_type"
+msgstr "arg_data_type"
+
+#: sql_help.c:2006 sql_help.c:2028 sql_help.c:2036
+msgid "sfunc"
+msgstr "sfunc"
+
+#: sql_help.c:2007 sql_help.c:2029 sql_help.c:2037
+msgid "state_data_type"
+msgstr "datový_typ_stavu"
+
+#: sql_help.c:2008 sql_help.c:2030 sql_help.c:2038
+msgid "state_data_size"
+msgstr "state_data_size"
+
+#: sql_help.c:2009 sql_help.c:2031 sql_help.c:2039
+msgid "ffunc"
+msgstr "ffunc"
+
+#: sql_help.c:2010 sql_help.c:2040
+msgid "combinefunc"
+msgstr "combinefunc"
+
+#: sql_help.c:2011 sql_help.c:2041
+msgid "serialfunc"
+msgstr "serialfunc"
+
+#: sql_help.c:2012 sql_help.c:2042
+msgid "deserialfunc"
+msgstr "deserialfunc"
+
+#: sql_help.c:2013 sql_help.c:2032 sql_help.c:2043
+msgid "initial_condition"
+msgstr "výchozí_podmínka"
+
+#: sql_help.c:2014 sql_help.c:2044
+msgid "msfunc"
+msgstr "msfunc"
+
+#: sql_help.c:2015 sql_help.c:2045
+msgid "minvfunc"
+msgstr "minvfunc"
+
+#: sql_help.c:2016 sql_help.c:2046
+msgid "mstate_data_type"
+msgstr "mstate_data_type"
+
+#: sql_help.c:2017 sql_help.c:2047
+msgid "mstate_data_size"
+msgstr "mstate_data_size"
+
+#: sql_help.c:2018 sql_help.c:2048
+msgid "mffunc"
+msgstr "mffunc"
+
+#: sql_help.c:2019 sql_help.c:2049
+msgid "minitial_condition"
+msgstr "minitial_condition"
+
+#: sql_help.c:2020 sql_help.c:2050
+msgid "sort_operator"
+msgstr "operátor_třídění"
+
+#: sql_help.c:2033
+msgid "or the old syntax"
+msgstr "nebo stará syntaxe"
+
+#: sql_help.c:2035
+msgid "base_type"
+msgstr "základní_typ"
+
+#: sql_help.c:2092 sql_help.c:2133
+msgid "locale"
+msgstr "locale"
+
+#: sql_help.c:2093 sql_help.c:2134
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2094 sql_help.c:2135
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2095 sql_help.c:4188
+msgid "provider"
+msgstr "provider"
+
+#: sql_help.c:2097 sql_help.c:2189
+msgid "version"
+msgstr "verze"
+
+#: sql_help.c:2099
+msgid "existing_collation"
+msgstr "existující_collation"
+
+#: sql_help.c:2109
+msgid "source_encoding"
+msgstr "kódování_zdroje"
+
+#: sql_help.c:2110
+msgid "dest_encoding"
+msgstr "kódování_cíle"
+
+#: sql_help.c:2131 sql_help.c:2917
+msgid "template"
+msgstr "šablona"
+
+#: sql_help.c:2132
+msgid "encoding"
+msgstr "kódování"
+
+#: sql_help.c:2159
+msgid "constraint"
+msgstr "omezení"
+
+#: sql_help.c:2160
+msgid "where constraint is:"
+msgstr "kde omezení je:"
+
+#: sql_help.c:2174 sql_help.c:2580 sql_help.c:2990
+msgid "event"
+msgstr "událost"
+
+#: sql_help.c:2175
+msgid "filter_variable"
+msgstr "filter_variable"
+
+#: sql_help.c:2263 sql_help.c:2812
+msgid "where column_constraint is:"
+msgstr "kde omezení_sloupce je:"
+
+#: sql_help.c:2300
+msgid "rettype"
+msgstr "návratový_typ"
+
+#: sql_help.c:2302
+msgid "column_type"
+msgstr "typ_sloupce"
+
+#: sql_help.c:2311 sql_help.c:2511
+msgid "definition"
+msgstr "definice"
+
+#: sql_help.c:2312 sql_help.c:2512
+msgid "obj_file"
+msgstr "obj_file"
+
+#: sql_help.c:2313 sql_help.c:2513
+msgid "link_symbol"
+msgstr "link_symbol"
+
+#: sql_help.c:2351 sql_help.c:2565 sql_help.c:3109
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2366 sql_help.c:2407 sql_help.c:2781 sql_help.c:2794
+#: sql_help.c:2808 sql_help.c:2873
+msgid "method"
+msgstr "metoda"
+
+#: sql_help.c:2371
+#| msgid "storage_parameter"
+msgid "opclass_parameter"
+msgstr "opclass_parametr"
+
+#: sql_help.c:2388
+msgid "call_handler"
+msgstr "call_handler"
+
+#: sql_help.c:2389
+msgid "inline_handler"
+msgstr "inline_handler"
+
+#: sql_help.c:2390
+msgid "valfunction"
+msgstr "valfunction"
+
+#: sql_help.c:2429
+msgid "com_op"
+msgstr "com_op"
+
+#: sql_help.c:2430
+msgid "neg_op"
+msgstr "neg_op"
+
+#: sql_help.c:2448
+msgid "family_name"
+msgstr "family_name"
+
+#: sql_help.c:2459
+msgid "storage_type"
+msgstr "typ_uložení"
+
+#: sql_help.c:2586 sql_help.c:2997
+msgid "where event can be one of:"
+msgstr "kde událost může být jedno z:"
+
+#: sql_help.c:2605 sql_help.c:2607
+msgid "schema_element"
+msgstr "prvek_schématu"
+
+#: sql_help.c:2644
+msgid "server_type"
+msgstr "typ_serveru"
+
+#: sql_help.c:2645
+msgid "server_version"
+msgstr "verze_serveru"
+
+#: sql_help.c:2646 sql_help.c:3748 sql_help.c:4096
+msgid "fdw_name"
+msgstr "fdw_jméno"
+
+#: sql_help.c:2659
+msgid "statistics_name"
+msgstr "statistics_name"
+
+#: sql_help.c:2660
+msgid "statistics_kind"
+msgstr "statistics_kind"
+
+#: sql_help.c:2674
+msgid "subscription_name"
+msgstr "subscription_name"
+
+#: sql_help.c:2774
+msgid "source_table"
+msgstr "zdrojová_tabulka"
+
+#: sql_help.c:2775
+msgid "like_option"
+msgstr "like_volba"
+
+#: sql_help.c:2841
+msgid "and like_option is:"
+msgstr "a like_volba je:"
+
+#: sql_help.c:2890
+msgid "directory"
+msgstr "adresář"
+
+#: sql_help.c:2904
+msgid "parser_name"
+msgstr "jméno_parseru"
+
+#: sql_help.c:2905
+msgid "source_config"
+msgstr "source_config"
+
+#: sql_help.c:2934
+msgid "start_function"
+msgstr "start_funkce"
+
+#: sql_help.c:2935
+msgid "gettoken_function"
+msgstr "gettoken_funkce"
+
+#: sql_help.c:2936
+msgid "end_function"
+msgstr "end_function"
+
+#: sql_help.c:2937
+msgid "lextypes_function"
+msgstr "lextypes_funkce"
+
+#: sql_help.c:2938
+msgid "headline_function"
+msgstr "headline_funkce"
+
+#: sql_help.c:2950
+msgid "init_function"
+msgstr "init_funkce"
+
+#: sql_help.c:2951
+msgid "lexize_function"
+msgstr "lexize_funkce"
+
+#: sql_help.c:2964
+msgid "from_sql_function_name"
+msgstr "from_sql_function_name"
+
+#: sql_help.c:2966
+msgid "to_sql_function_name"
+msgstr "to_sql_function_name"
+
+#: sql_help.c:2992
+msgid "referenced_table_name"
+msgstr "jméno_odkazované_tabulky"
+
+#: sql_help.c:2993
+msgid "transition_relation_name"
+msgstr "transition_relation_name"
+
+#: sql_help.c:2996
+msgid "arguments"
+msgstr "argumenty"
+
+#: sql_help.c:3046 sql_help.c:4221
+msgid "label"
+msgstr "popisek"
+
+#: sql_help.c:3048
+msgid "subtype"
+msgstr "subtyp"
+
+#: sql_help.c:3049
+msgid "subtype_operator_class"
+msgstr "třída_operátorů_subtypu"
+
+#: sql_help.c:3051
+msgid "canonical_function"
+msgstr "kanonická_funkce"
+
+#: sql_help.c:3052
+msgid "subtype_diff_function"
+msgstr "diff_funkce_subtypu"
+
+#: sql_help.c:3054
+msgid "input_function"
+msgstr "vstupní_funkce"
+
+#: sql_help.c:3055
+msgid "output_function"
+msgstr "výstupní_funkce"
+
+#: sql_help.c:3056
+msgid "receive_function"
+msgstr "receive_funkce"
+
+#: sql_help.c:3057
+msgid "send_function"
+msgstr "send_funkce"
+
+#: sql_help.c:3058
+msgid "type_modifier_input_function"
+msgstr "type_modifier_input_function"
+
+#: sql_help.c:3059
+msgid "type_modifier_output_function"
+msgstr "type_modifier_output_function"
+
+#: sql_help.c:3060
+msgid "analyze_function"
+msgstr "analyze_funkce"
+
+#: sql_help.c:3061
+msgid "internallength"
+msgstr "interní_délka"
+
+#: sql_help.c:3062
+msgid "alignment"
+msgstr "zarovnání"
+
+#: sql_help.c:3063
+msgid "storage"
+msgstr "uložení"
+
+#: sql_help.c:3064
+msgid "like_type"
+msgstr "like_typ"
+
+#: sql_help.c:3065
+msgid "category"
+msgstr "kategorie"
+
+#: sql_help.c:3066
+msgid "preferred"
+msgstr "preferovaný"
+
+#: sql_help.c:3067
+msgid "default"
+msgstr "implicitní"
+
+#: sql_help.c:3068
+msgid "element"
+msgstr "prvek"
+
+#: sql_help.c:3069
+msgid "delimiter"
+msgstr "oddělovač"
+
+#: sql_help.c:3070
+msgid "collatable"
+msgstr "collatable"
+
+#: sql_help.c:3167 sql_help.c:3816 sql_help.c:4281 sql_help.c:4370
+#: sql_help.c:4520 sql_help.c:4620 sql_help.c:4740
+msgid "with_query"
+msgstr "with_dotaz"
+
+#: sql_help.c:3169 sql_help.c:3818 sql_help.c:4300 sql_help.c:4306
+#: sql_help.c:4309 sql_help.c:4313 sql_help.c:4317 sql_help.c:4325
+#: sql_help.c:4539 sql_help.c:4545 sql_help.c:4548 sql_help.c:4552
+#: sql_help.c:4556 sql_help.c:4564 sql_help.c:4622 sql_help.c:4759
+#: sql_help.c:4765 sql_help.c:4768 sql_help.c:4772 sql_help.c:4776
+#: sql_help.c:4784
+msgid "alias"
+msgstr "alias"
+
+#: sql_help.c:3170 sql_help.c:4285 sql_help.c:4327 sql_help.c:4329
+#: sql_help.c:4375 sql_help.c:4524 sql_help.c:4566 sql_help.c:4568
+#: sql_help.c:4629 sql_help.c:4744 sql_help.c:4786 sql_help.c:4788
+msgid "from_item"
+msgstr "z_položky"
+
+#: sql_help.c:3172 sql_help.c:3653 sql_help.c:3897 sql_help.c:4631
+msgid "cursor_name"
+msgstr "jméno_kurzoru"
+
+#: sql_help.c:3173 sql_help.c:3824 sql_help.c:4632
+msgid "output_expression"
+msgstr "výstupní_výraz"
+
+#: sql_help.c:3174 sql_help.c:3825 sql_help.c:4284 sql_help.c:4373
+#: sql_help.c:4523 sql_help.c:4633 sql_help.c:4743
+msgid "output_name"
+msgstr "výstupní_jméno"
+
+#: sql_help.c:3190
+msgid "code"
+msgstr "kód"
+
+#: sql_help.c:3595
+msgid "parameter"
+msgstr "parametr"
+
+#: sql_help.c:3617 sql_help.c:3618 sql_help.c:3922
+msgid "statement"
+msgstr "příkaz"
+
+#: sql_help.c:3652 sql_help.c:3896
+msgid "direction"
+msgstr "směr"
+
+#: sql_help.c:3654 sql_help.c:3898
+msgid "where direction can be empty or one of:"
+msgstr "kde směr může být prázdný nebo jedno z:"
+
+#: sql_help.c:3655 sql_help.c:3656 sql_help.c:3657 sql_help.c:3658
+#: sql_help.c:3659 sql_help.c:3899 sql_help.c:3900 sql_help.c:3901
+#: sql_help.c:3902 sql_help.c:3903 sql_help.c:4294 sql_help.c:4296
+#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4533 sql_help.c:4535
+#: sql_help.c:4688 sql_help.c:4690 sql_help.c:4753 sql_help.c:4755
+msgid "count"
+msgstr "počet"
+
+#: sql_help.c:3741 sql_help.c:4089
+msgid "sequence_name"
+msgstr "sekvence"
+
+#: sql_help.c:3754 sql_help.c:4102
+msgid "arg_name"
+msgstr "jméno_argumentu"
+
+#: sql_help.c:3755 sql_help.c:4103
+msgid "arg_type"
+msgstr "typ_argumentu"
+
+#: sql_help.c:3760 sql_help.c:4108
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3784
+msgid "remote_schema"
+msgstr "remote_schema"
+
+#: sql_help.c:3787
+msgid "local_schema"
+msgstr "local_schema"
+
+#: sql_help.c:3822
+msgid "conflict_target"
+msgstr "conflict_target"
+
+#: sql_help.c:3823
+msgid "conflict_action"
+msgstr "conflict_action"
+
+#: sql_help.c:3826
+msgid "where conflict_target can be one of:"
+msgstr "where conflict_target can be one of:"
+
+#: sql_help.c:3827
+msgid "index_column_name"
+msgstr "index_column_name"
+
+#: sql_help.c:3828
+msgid "index_expression"
+msgstr "index_expression"
+
+#: sql_help.c:3831
+msgid "index_predicate"
+msgstr "index_predicate"
+
+#: sql_help.c:3833
+msgid "and conflict_action is one of:"
+msgstr "a conflict_action je jedno z:"
+
+#: sql_help.c:3839 sql_help.c:4628
+msgid "sub-SELECT"
+msgstr "sub-SELECT"
+
+#: sql_help.c:3848 sql_help.c:3911 sql_help.c:4604
+msgid "channel"
+msgstr "kanál"
+
+#: sql_help.c:3870
+msgid "lockmode"
+msgstr "mód_zámku"
+
+#: sql_help.c:3871
+msgid "where lockmode is one of:"
+msgstr "kde mód_zámku je jedno z:"
+
+#: sql_help.c:3912
+msgid "payload"
+msgstr "náklad"
+
+#: sql_help.c:3939
+msgid "old_role"
+msgstr "stará_role"
+
+#: sql_help.c:3940
+msgid "new_role"
+msgstr "nová_role"
+
+#: sql_help.c:3971 sql_help.c:4143 sql_help.c:4151
+msgid "savepoint_name"
+msgstr "jméno_savepointu"
+
+#: sql_help.c:4287 sql_help.c:4339 sql_help.c:4526 sql_help.c:4578
+#: sql_help.c:4746 sql_help.c:4798
+msgid "grouping_element"
+msgstr "grouping_element"
+
+#: sql_help.c:4289 sql_help.c:4379 sql_help.c:4528 sql_help.c:4748
+msgid "window_name"
+msgstr "jméno_okna"
+
+#: sql_help.c:4290 sql_help.c:4380 sql_help.c:4529 sql_help.c:4749
+msgid "window_definition"
+msgstr "definice_okna"
+
+#: sql_help.c:4291 sql_help.c:4305 sql_help.c:4343 sql_help.c:4381
+#: sql_help.c:4530 sql_help.c:4544 sql_help.c:4582 sql_help.c:4750
+#: sql_help.c:4764 sql_help.c:4802
+msgid "select"
+msgstr "select"
+
+#: sql_help.c:4298 sql_help.c:4537 sql_help.c:4757
+msgid "where from_item can be one of:"
+msgstr "kde z_položky může být jedno z:"
+
+#: sql_help.c:4301 sql_help.c:4307 sql_help.c:4310 sql_help.c:4314
+#: sql_help.c:4326 sql_help.c:4540 sql_help.c:4546 sql_help.c:4549
+#: sql_help.c:4553 sql_help.c:4565 sql_help.c:4760 sql_help.c:4766
+#: sql_help.c:4769 sql_help.c:4773 sql_help.c:4785
+msgid "column_alias"
+msgstr "alias_sloupce"
+
+#: sql_help.c:4302 sql_help.c:4541 sql_help.c:4761
+msgid "sampling_method"
+msgstr "sampling_method"
+
+#: sql_help.c:4304 sql_help.c:4543 sql_help.c:4763
+msgid "seed"
+msgstr "seed"
+
+#: sql_help.c:4308 sql_help.c:4341 sql_help.c:4547 sql_help.c:4580
+#: sql_help.c:4767 sql_help.c:4800
+msgid "with_query_name"
+msgstr "jméno_with_dotazu"
+
+#: sql_help.c:4318 sql_help.c:4321 sql_help.c:4324 sql_help.c:4557
+#: sql_help.c:4560 sql_help.c:4563 sql_help.c:4777 sql_help.c:4780
+#: sql_help.c:4783
+msgid "column_definition"
+msgstr "definice_sloupce"
+
+#: sql_help.c:4328 sql_help.c:4567 sql_help.c:4787
+msgid "join_type"
+msgstr "typ_joinu"
+
+#: sql_help.c:4330 sql_help.c:4569 sql_help.c:4789
+msgid "join_condition"
+msgstr "joinovací_podmínka"
+
+#: sql_help.c:4331 sql_help.c:4570 sql_help.c:4790
+msgid "join_column"
+msgstr "joinovací_sloupec"
+
+#: sql_help.c:4332 sql_help.c:4571 sql_help.c:4791
+msgid "and grouping_element can be one of:"
+msgstr "a grouping_element může být jedno z:"
+
+#: sql_help.c:4340 sql_help.c:4579 sql_help.c:4799
+msgid "and with_query is:"
+msgstr "a with_dotaz je:"
+
+#: sql_help.c:4344 sql_help.c:4583 sql_help.c:4803
+msgid "values"
+msgstr "hodnoty"
+
+#: sql_help.c:4345 sql_help.c:4584 sql_help.c:4804
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4346 sql_help.c:4585 sql_help.c:4805
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4347 sql_help.c:4586 sql_help.c:4806
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4374
+msgid "new_table"
+msgstr "nová_tabulka"
+
+#: sql_help.c:4399
+msgid "timezone"
+msgstr "časová_zóna"
+
+#: sql_help.c:4444
+msgid "snapshot_id"
+msgstr "snapshot_id"
+
+#: sql_help.c:4686
+msgid "sort_expression"
+msgstr "sort_expression"
+
+#: sql_help.c:4813 sql_help.c:5791
+msgid "abort the current transaction"
+msgstr "nestandardní ukončení (abort) současné transakce"
+
+#: sql_help.c:4819
+msgid "change the definition of an aggregate function"
+msgstr "změna definice agregátní funkce"
+
+#: sql_help.c:4825
+msgid "change the definition of a collation"
+msgstr "změní definici collation"
+
+#: sql_help.c:4831
+msgid "change the definition of a conversion"
+msgstr "změna definice konverze"
+
+#: sql_help.c:4837
+msgid "change a database"
+msgstr "změní databázi"
+
+#: sql_help.c:4843
+msgid "define default access privileges"
+msgstr "definuje výchozí přístupová práva"
+
+#: sql_help.c:4849
+msgid "change the definition of a domain"
+msgstr "změní definici domény"
+
+#: sql_help.c:4855
+msgid "change the definition of an event trigger"
+msgstr "změní definici event triggeru"
+
+#: sql_help.c:4861
+msgid "change the definition of an extension"
+msgstr "změna definice extension"
+
+#: sql_help.c:4867
+msgid "change the definition of a foreign-data wrapper"
+msgstr "změní definici foreign-data wrapperu"
+
+#: sql_help.c:4873
+msgid "change the definition of a foreign table"
+msgstr "změní definici foreign tabulky"
+
+#: sql_help.c:4879
+msgid "change the definition of a function"
+msgstr "změní definici funkce"
+
+#: sql_help.c:4885
+msgid "change role name or membership"
+msgstr "změní jméno role nebo členství"
+
+#: sql_help.c:4891
+msgid "change the definition of an index"
+msgstr "změní definici indexu"
+
+#: sql_help.c:4897
+msgid "change the definition of a procedural language"
+msgstr "změní definici procedurálního jazyka"
+
+#: sql_help.c:4903
+msgid "change the definition of a large object"
+msgstr "změní definici large objektu"
+
+#: sql_help.c:4909
+msgid "change the definition of a materialized view"
+msgstr "změní definici materializovaného pohledu"
+
+#: sql_help.c:4915
+msgid "change the definition of an operator"
+msgstr "změní definici operátoru"
+
+#: sql_help.c:4921
+msgid "change the definition of an operator class"
+msgstr "změní definici třídy operátorů"
+
+#: sql_help.c:4927
+msgid "change the definition of an operator family"
+msgstr "změní definici rodiny operátorů"
+
+#: sql_help.c:4933
+msgid "change the definition of a row level security policy"
+msgstr "změní definici row level security politiky"
+
+#: sql_help.c:4939
+msgid "change the definition of a procedure"
+msgstr "změní definici procedury"
+
+#: sql_help.c:4945
+msgid "change the definition of a publication"
+msgstr "změní definici publikace"
+
+#: sql_help.c:4951 sql_help.c:5053
+msgid "change a database role"
+msgstr "změní databázovou roli"
+
+#: sql_help.c:4957
+msgid "change the definition of a routine"
+msgstr "změní definici rutiny"
+
+#: sql_help.c:4963
+msgid "change the definition of a rule"
+msgstr "změní definici pravidla"
+
+#: sql_help.c:4969
+msgid "change the definition of a schema"
+msgstr "změní definici schématu"
+
+#: sql_help.c:4975
+msgid "change the definition of a sequence generator"
+msgstr "změní definici generátoru sekvencí"
+
+#: sql_help.c:4981
+msgid "change the definition of a foreign server"
+msgstr "změní definici foreign serveru"
+
+#: sql_help.c:4987
+msgid "change the definition of an extended statistics object"
+msgstr "změna definice rozšířené statistiky"
+
+#: sql_help.c:4993
+msgid "change the definition of a subscription"
+msgstr "změní definici subskripce"
+
+#: sql_help.c:4999
+msgid "change a server configuration parameter"
+msgstr "změní serverový konfigurační parametr"
+
+#: sql_help.c:5005
+msgid "change the definition of a table"
+msgstr "změní definici tabulky"
+
+#: sql_help.c:5011
+msgid "change the definition of a tablespace"
+msgstr "změní definici tablespace"
+
+#: sql_help.c:5017
+msgid "change the definition of a text search configuration"
+msgstr "změní definici konfigurace fulltextového vyhledávání"
+
+#: sql_help.c:5023
+msgid "change the definition of a text search dictionary"
+msgstr "změní definici slovníku pro fulltextové vyhledávání"
+
+#: sql_help.c:5029
+msgid "change the definition of a text search parser"
+msgstr "změní definici parseru pro fulltextové vyhledávání"
+
+#: sql_help.c:5035
+msgid "change the definition of a text search template"
+msgstr "změní definici šablony pro fulltextové vyhledávání"
+
+#: sql_help.c:5041
+msgid "change the definition of a trigger"
+msgstr "změní definici triggeru"
+
+#: sql_help.c:5047
+msgid "change the definition of a type"
+msgstr "změní definici datového typu"
+
+#: sql_help.c:5059
+msgid "change the definition of a user mapping"
+msgstr "změní definici mapování uživatelů"
+
+#: sql_help.c:5065
+msgid "change the definition of a view"
+msgstr "změní definici pohledu"
+
+#: sql_help.c:5071
+msgid "collect statistics about a database"
+msgstr "shromáždí statistické informace o databázi"
+
+#: sql_help.c:5077 sql_help.c:5869
+msgid "start a transaction block"
+msgstr "nastartuje nový transakční blok"
+
+#: sql_help.c:5083
+msgid "invoke a procedure"
+msgstr "spustí proceduru"
+
+#: sql_help.c:5089
+msgid "force a write-ahead log checkpoint"
+msgstr "vynutí checkpoint transakčního logu"
+
+#: sql_help.c:5095
+msgid "close a cursor"
+msgstr "uzavře kursor"
+
+#: sql_help.c:5101
+msgid "cluster a table according to an index"
+msgstr "přerovná obsah tabulky dle indexu"
+
+#: sql_help.c:5107
+msgid "define or change the comment of an object"
+msgstr "definuje nebo změní komentář objektu"
+
+#: sql_help.c:5113 sql_help.c:5671
+msgid "commit the current transaction"
+msgstr "potvrzení aktuální transakce"
+
+#: sql_help.c:5119
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "potvrzení aktuální transakce, která byla již dříve připravena pro dvoufázový commit"
+
+#: sql_help.c:5125
+msgid "copy data between a file and a table"
+msgstr "kopíruje data mezi souborem a tabulkou"
+
+#: sql_help.c:5131
+msgid "define a new access method"
+msgstr "definuje novou přístupovou metodu"
+
+#: sql_help.c:5137
+msgid "define a new aggregate function"
+msgstr "definuje novou agrefunkci"
+
+#: sql_help.c:5143
+msgid "define a new cast"
+msgstr "definuje nové přetypování"
+
+#: sql_help.c:5149
+msgid "define a new collation"
+msgstr "definuje novou collation"
+
+#: sql_help.c:5155
+msgid "define a new encoding conversion"
+msgstr "definuje novou konverzi kódování"
+
+#: sql_help.c:5161
+msgid "create a new database"
+msgstr "vytvoří novou databázi"
+
+#: sql_help.c:5167
+msgid "define a new domain"
+msgstr "definuje novou atributovou doménu"
+
+#: sql_help.c:5173
+msgid "define a new event trigger"
+msgstr "definuje nový event trigger"
+
+#: sql_help.c:5179
+msgid "install an extension"
+msgstr "instaluje rozšíření"
+
+#: sql_help.c:5185
+msgid "define a new foreign-data wrapper"
+msgstr "definuje nový foreign-data wrapper"
+
+#: sql_help.c:5191
+msgid "define a new foreign table"
+msgstr "definuje nový foreign tabulku"
+
+#: sql_help.c:5197
+msgid "define a new function"
+msgstr "definuje novou funkci"
+
+#: sql_help.c:5203 sql_help.c:5263 sql_help.c:5365
+msgid "define a new database role"
+msgstr "definuje novou databázovou roli"
+
+#: sql_help.c:5209
+msgid "define a new index"
+msgstr "definuje nový index"
+
+#: sql_help.c:5215
+msgid "define a new procedural language"
+msgstr "definuje nový procedurální jazyk"
+
+#: sql_help.c:5221
+msgid "define a new materialized view"
+msgstr "definuje nový materializovaný pohled"
+
+#: sql_help.c:5227
+msgid "define a new operator"
+msgstr "definuje nový operátor"
+
+#: sql_help.c:5233
+msgid "define a new operator class"
+msgstr "definuje novou třídu operátorů"
+
+#: sql_help.c:5239
+msgid "define a new operator family"
+msgstr "definuje novou rodinu operátorů"
+
+#: sql_help.c:5245
+msgid "define a new row level security policy for a table"
+msgstr "definute novou row level security politiku pro tabulku"
+
+#: sql_help.c:5251
+msgid "define a new procedure"
+msgstr "definuje novou proceduru"
+
+#: sql_help.c:5257
+msgid "define a new publication"
+msgstr "definuje novou publikaci"
+
+#: sql_help.c:5269
+msgid "define a new rewrite rule"
+msgstr "definuje nové přepisovací pravidlo (rule)"
+
+#: sql_help.c:5275
+msgid "define a new schema"
+msgstr "definuje nové schéma"
+
+#: sql_help.c:5281
+msgid "define a new sequence generator"
+msgstr "definuje nový generátor sekvencí"
+
+#: sql_help.c:5287
+msgid "define a new foreign server"
+msgstr "definuje nový foreign server"
+
+#: sql_help.c:5293
+msgid "define extended statistics"
+msgstr "definuje nové rozšířené statistiky"
+
+#: sql_help.c:5299
+msgid "define a new subscription"
+msgstr "definuje novou subskripci"
+
+#: sql_help.c:5305
+msgid "define a new table"
+msgstr "definuje novou tabulku"
+
+#: sql_help.c:5311 sql_help.c:5827
+msgid "define a new table from the results of a query"
+msgstr "definuje novou tabulku dle výsledku dotazu"
+
+#: sql_help.c:5317
+msgid "define a new tablespace"
+msgstr "definuje nový tablespace"
+
+#: sql_help.c:5323
+msgid "define a new text search configuration"
+msgstr "definuje novou konfiguraci fulltextového vyhledávání"
+
+#: sql_help.c:5329
+msgid "define a new text search dictionary"
+msgstr "definuje nový slovník pro fulltextové vyhledávání"
+
+#: sql_help.c:5335
+msgid "define a new text search parser"
+msgstr "definuje nový parser pro fulltextové vyhledávání"
+
+#: sql_help.c:5341
+msgid "define a new text search template"
+msgstr "definuje novou šablonu pro fulltextové vyhledávání"
+
+#: sql_help.c:5347
+msgid "define a new transform"
+msgstr "definuje novou transformaci"
+
+#: sql_help.c:5353
+msgid "define a new trigger"
+msgstr "definuje nový trigger"
+
+#: sql_help.c:5359
+msgid "define a new data type"
+msgstr "definuje nový datový typ"
+
+#: sql_help.c:5371
+msgid "define a new mapping of a user to a foreign server"
+msgstr "definuje nové mapování uživatele na vzdálený server"
+
+#: sql_help.c:5377
+msgid "define a new view"
+msgstr "definuje nový pohled"
+
+#: sql_help.c:5383
+msgid "deallocate a prepared statement"
+msgstr "dealokuje připravený dotaz (prepared statement)"
+
+#: sql_help.c:5389
+msgid "define a cursor"
+msgstr "definuje kursor"
+
+#: sql_help.c:5395
+msgid "delete rows of a table"
+msgstr "smaže řádky z takulky"
+
+#: sql_help.c:5401
+msgid "discard session state"
+msgstr "zahodí stav session"
+
+#: sql_help.c:5407
+msgid "execute an anonymous code block"
+msgstr "spustí anonymní blok kódu"
+
+#: sql_help.c:5413
+msgid "remove an access method"
+msgstr "odstraní definici přístupové metody"
+
+#: sql_help.c:5419
+msgid "remove an aggregate function"
+msgstr "odstraní agregační funkci"
+
+#: sql_help.c:5425
+msgid "remove a cast"
+msgstr "odstraní definici přetypování"
+
+#: sql_help.c:5431
+msgid "remove a collation"
+msgstr "odstraní collation"
+
+#: sql_help.c:5437
+msgid "remove a conversion"
+msgstr "odstraní konverzi"
+
+#: sql_help.c:5443
+msgid "remove a database"
+msgstr "odstraní databázi"
+
+#: sql_help.c:5449
+msgid "remove a domain"
+msgstr "odstraní doménu"
+
+#: sql_help.c:5455
+msgid "remove an event trigger"
+msgstr "odstraní event trigger"
+
+#: sql_help.c:5461
+msgid "remove an extension"
+msgstr "odstraní extension"
+
+#: sql_help.c:5467
+msgid "remove a foreign-data wrapper"
+msgstr "odstraní foreign-data wrapper"
+
+#: sql_help.c:5473
+msgid "remove a foreign table"
+msgstr "odstraní foreign tabulku"
+
+#: sql_help.c:5479
+msgid "remove a function"
+msgstr "odstraní funkci"
+
+#: sql_help.c:5485 sql_help.c:5551 sql_help.c:5653
+msgid "remove a database role"
+msgstr "odstraní databázovou roli"
+
+#: sql_help.c:5491
+msgid "remove an index"
+msgstr "odstraní index"
+
+#: sql_help.c:5497
+msgid "remove a procedural language"
+msgstr "odstraní procedurální jazyk"
+
+#: sql_help.c:5503
+msgid "remove a materialized view"
+msgstr "odstraní materializovaný pohled"
+
+#: sql_help.c:5509
+msgid "remove an operator"
+msgstr "odstraní operátor"
+
+#: sql_help.c:5515
+msgid "remove an operator class"
+msgstr "odstraní třídu operátorů"
+
+#: sql_help.c:5521
+msgid "remove an operator family"
+msgstr "odstraní rodinu operátorů"
+
+#: sql_help.c:5527
+msgid "remove database objects owned by a database role"
+msgstr "odstraní objekty vlastněné databázovou rolí"
+
+#: sql_help.c:5533
+msgid "remove a row level security policy from a table"
+msgstr "odstraní row level security politiku z tabulky"
+
+#: sql_help.c:5539
+msgid "remove a procedure"
+msgstr "odstraní proceduru"
+
+#: sql_help.c:5545
+msgid "remove a publication"
+msgstr "odstraní publikaci"
+
+#: sql_help.c:5557
+msgid "remove a routine"
+msgstr "odstraní rutinu"
+
+#: sql_help.c:5563
+msgid "remove a rewrite rule"
+msgstr "odstraní přepisovací pravidlo (rule)"
+
+#: sql_help.c:5569
+msgid "remove a schema"
+msgstr "odstraní schéma"
+
+#: sql_help.c:5575
+msgid "remove a sequence"
+msgstr "odstraní sekvenci"
+
+#: sql_help.c:5581
+msgid "remove a foreign server descriptor"
+msgstr "odstraní deskriptor foreign serveru"
+
+#: sql_help.c:5587
+msgid "remove extended statistics"
+msgstr "odstraní rozšířené statistiky"
+
+#: sql_help.c:5593
+msgid "remove a subscription"
+msgstr "odstraní subskripci"
+
+#: sql_help.c:5599
+msgid "remove a table"
+msgstr "odstraní tabulku"
+
+#: sql_help.c:5605
+msgid "remove a tablespace"
+msgstr "odstraní tablespace"
+
+#: sql_help.c:5611
+msgid "remove a text search configuration"
+msgstr "odstraní konfiguraci fulltextového vyhledávání"
+
+#: sql_help.c:5617
+msgid "remove a text search dictionary"
+msgstr "odstraní slovn?ik pro fulltextové vyhledávání"
+
+#: sql_help.c:5623
+msgid "remove a text search parser"
+msgstr "odstraní parser pro fulltextové vyhledávání"
+
+#: sql_help.c:5629
+msgid "remove a text search template"
+msgstr "odstraní Šablonu fulltextového vyhledávání"
+
+#: sql_help.c:5635
+msgid "remove a transform"
+msgstr "odstraní transformaci"
+
+#: sql_help.c:5641
+msgid "remove a trigger"
+msgstr "odstraní trigger"
+
+#: sql_help.c:5647
+msgid "remove a data type"
+msgstr "odstraní datový typ"
+
+#: sql_help.c:5659
+msgid "remove a user mapping for a foreign server"
+msgstr "odstraní mapování uživatele z foreign serveru"
+
+#: sql_help.c:5665
+msgid "remove a view"
+msgstr "odstraní náhled"
+
+#: sql_help.c:5677
+msgid "execute a prepared statement"
+msgstr "provede připravený dotaz (prepared statement)"
+
+#: sql_help.c:5683
+msgid "show the execution plan of a statement"
+msgstr "ukáže prováděcí plán dotazu"
+
+#: sql_help.c:5689
+msgid "retrieve rows from a query using a cursor"
+msgstr "načte řádky z výsledku dotazu pomocí kursoru"
+
+#: sql_help.c:5695
+msgid "define access privileges"
+msgstr "definuje přístupová práva"
+
+#: sql_help.c:5701
+msgid "import table definitions from a foreign server"
+msgstr "importuje definice tabulek z foreign serveru"
+
+#: sql_help.c:5707
+msgid "create new rows in a table"
+msgstr "přidá nové řádky do tabulky"
+
+#: sql_help.c:5713
+msgid "listen for a notification"
+msgstr "naslouchá upozorněním"
+
+#: sql_help.c:5719
+msgid "load a shared library file"
+msgstr "načte sdílenou knihovnu"
+
+#: sql_help.c:5725
+msgid "lock a named relation (table, etc)"
+msgstr "zamkne uvedenou relaci (tabulku, etc)"
+
+#: sql_help.c:5731
+msgid "position a cursor"
+msgstr "přemístí kursor"
+
+#: sql_help.c:5737
+msgid "generate a notification"
+msgstr "generuje upozornění"
+
+#: sql_help.c:5743
+msgid "prepare a statement for execution"
+msgstr "připraví a uloží dotaz pro provedení"
+
+#: sql_help.c:5749
+msgid "prepare the current transaction for two-phase commit"
+msgstr "přípraví aktuální transakci pro dvoufázoví commit"
+
+#: sql_help.c:5755
+msgid "change the ownership of database objects owned by a database role"
+msgstr "změní vlastníka databázových objektů vlastněných databázovou rolí"
+
+#: sql_help.c:5761
+msgid "replace the contents of a materialized view"
+msgstr "nahraď obsah materializovaného pohledu"
+
+#: sql_help.c:5767
+msgid "rebuild indexes"
+msgstr "znovuvytvoří indexy"
+
+#: sql_help.c:5773
+msgid "destroy a previously defined savepoint"
+msgstr "odstraní dříve vytvořený savepoint"
+
+#: sql_help.c:5779
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "přenastaví parametr běhu na implicitní hodnotu"
+
+#: sql_help.c:5785
+msgid "remove access privileges"
+msgstr "odstraní přístupová práva"
+
+#: sql_help.c:5797
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "zruší transakci, která byla připravena pro dvoufázový commit"
+
+#: sql_help.c:5803
+msgid "roll back to a savepoint"
+msgstr "vrátí se na savepoint"
+
+#: sql_help.c:5809
+msgid "define a new savepoint within the current transaction"
+msgstr "definuje nový savepoint uvnitř aktuální transakce"
+
+#: sql_help.c:5815
+msgid "define or change a security label applied to an object"
+msgstr "definuje nebo změní bezpečnostní štítek aplikovaný na objekt"
+
+#: sql_help.c:5821 sql_help.c:5875 sql_help.c:5911
+msgid "retrieve rows from a table or view"
+msgstr "vybere řádky z tabulky nebo náhledu"
+
+#: sql_help.c:5833
+msgid "change a run-time parameter"
+msgstr "změní parametry běhu"
+
+#: sql_help.c:5839
+msgid "set constraint check timing for the current transaction"
+msgstr "nastaví mód kontroly omezení (constraints) pro aktuální transakci"
+
+#: sql_help.c:5845
+msgid "set the current user identifier of the current session"
+msgstr "nastaví uživatelský identifikátor aktuální session"
+
+#: sql_help.c:5851
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "nastaví uživatelský identifikátor session a identifikátor aktuálníhouživatele pro aktuální session"
+
+#: sql_help.c:5857
+msgid "set the characteristics of the current transaction"
+msgstr "nastaví charakteristiku pro aktualní trasakci"
+
+#: sql_help.c:5863
+msgid "show the value of a run-time parameter"
+msgstr "zobrazí hodnoty run-time parametrů"
+
+#: sql_help.c:5881
+msgid "empty a table or set of tables"
+msgstr "zruší obsah tabulky nebo skupiny tabulek"
+
+#: sql_help.c:5887
+msgid "stop listening for a notification"
+msgstr "ukončí naslouchání připomínkám"
+
+#: sql_help.c:5893
+msgid "update rows of a table"
+msgstr "aktualizuje řádky tabulky"
+
+#: sql_help.c:5899
+msgid "garbage-collect and optionally analyze a database"
+msgstr "provede úklid a případně analýzu databáze"
+
+#: sql_help.c:5905
+msgid "compute a set of rows"
+msgstr "spočítá množinu řádek"
+
+#: startup.c:212
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 může být použito pouze pro neinteraktivní módy"
+
+#: startup.c:299
+#, c-format
+msgid "could not connect to server: %s"
+msgstr "nelze se připojit k serveru: %s"
+
+#: startup.c:327
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "nelze otevřít soubor \"%s\": %m"
+
+#: startup.c:439
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Pro získání nápovědy napište \"help\".\n"
+"\n"
+
+#: startup.c:589
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "nelze nastavit parametr zobrazení \"%s\""
+
+#: startup.c:697
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: startup.c:714
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "varování: nadbytečný parametr příkazové řádky \"%s\" ignorován"
+
+#: startup.c:763
+#, c-format
+msgid "could not find own program executable"
+msgstr "nelze najít vlastní spustitelný soubor"
+
+#: tab-complete.c:4640
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"tab completion dotaz selhal: %s\n"
+"Dotaz byl:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "nerozpoznaná hodnota \"%s\" pro \"%s\": očekáván Boolean výraz"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "neplatná hodnota \"%s\" pro \"%s\": očekáváno celé číslo"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "neplatný název proměnné: \"%s\""
+
+#: variables.c:393
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"nerozpoznaná hodnota \"%s\" pro \"%s\"\n"
+"Možné hodnoty jsou: %s."
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "nelze číst symbolický link \"%s\""
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "potomek byl ukončen signálem %s"
+
+#~ msgid "Invalid command \\%s. Try \\? for help.\n"
+#~ msgstr "Neplatný příkaz \\%s. Použijte \\? pro nápovědu.\n"
+
+#~ msgid "%s: %s\n"
+#~ msgstr "%s: %s\n"
+
+#~ msgid "Procedure"
+#~ msgstr "Procedura"
+
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#~ msgid "unterminated quoted string\n"
+#~ msgstr "neukončený řetězec v uvozovkách\n"
+
+#~ msgid "string_literal"
+#~ msgstr "string_literal"
+
+#~ msgid "%s: could not open log file \"%s\": %s\n"
+#~ msgstr "%s: nelze otevřít logovací soubor \"%s\": %s\n"
+
+#~ msgid "\\%s: error\n"
+#~ msgstr "\\%s: chyba\n"
+
+#~ msgid "\\copy: %s"
+#~ msgstr "\\copy: %s"
+
+#~ msgid "\\copy: unexpected response (%d)\n"
+#~ msgstr "\\copy: neočekávaná odezva (%d)\n"
+
+#~ msgid "data type"
+#~ msgstr "datový typ"
+
+#~ msgid " on host \"%s\""
+#~ msgstr " na počítač \"%s\""
+
+#~ msgid " at port \"%s\""
+#~ msgstr " na port \"%s\""
+
+#~ msgid " as user \"%s\""
+#~ msgstr " jako uživatel \"%s\""
+
+#~ msgid "define a new constraint trigger"
+#~ msgstr "defunuje nový constraint trigger"
+
+#~ msgid " \"%s\" IN %s %s"
+#~ msgstr " \"%s\" IN %s %s"
+
+#~ msgid "ABORT [ WORK | TRANSACTION ]"
+#~ msgstr "ABORT [ WORK | TRANSACTION ]"
+
+#~ msgid "contains support for command-line editing"
+#~ msgstr "obsahuje podporu pro editaci příkazové řádky "
+
+#~ msgid "tablespace"
+#~ msgstr "tablespace"
+
+#~ msgid "new_column"
+#~ msgstr "nový_sloupec"
+
+#~ msgid "column"
+#~ msgstr "sloupec"
+
+#~ msgid " \\l[+] list all databases\n"
+#~ msgstr " \\l[+] seznam databází\n"
+
+#~ msgid "%s: -1 is incompatible with -c and -l\n"
+#~ msgstr "%s: -1 je nekompatibilní s -c a -l\n"
+
+#~ msgid "unrecognized Boolean value; assuming \"on\"\n"
+#~ msgstr "nerozpoznaná boolean hodnota; předpokládám \"on\".\n"
+
+#~ msgid "%s: could not set variable \"%s\"\n"
+#~ msgstr "%s: nelze nastavit proměnnou \"%s\"\n"
+
+#~ msgid "attribute"
+#~ msgstr "atribut"
+
+#~ msgid "input_data_type"
+#~ msgstr "vstupní_datový_typ"
+
+#~ msgid "agg_type"
+#~ msgstr "typ_agregace"
+
+#~ msgid "agg_name"
+#~ msgstr "jméno_agregace"
+
+#~ msgid "(No rows)\n"
+#~ msgstr "(Žádné řádky)\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help ukáže tuto nápovědu a skončí\n"
+
+#~ msgid "could not get current user name: %s\n"
+#~ msgstr "nelze získat aktuální uživatelské jméno: %s\n"
+
+#~ msgid "Object Description"
+#~ msgstr "Popis objektu"
+
+#~ msgid "Modifier"
+#~ msgstr "Modifikátor"
+
+#~ msgid "No relations found.\n"
+#~ msgstr "Žádné relace nenalezeny.\n"
+
+#~ msgid "No matching relations found.\n"
+#~ msgstr "Odpovídající relace nebyla nalezena.\n"
+
+#~ msgid "No settings found.\n"
+#~ msgstr "Žádné nastavení nenalezeno.\n"
+
+#~ msgid "No matching settings found.\n"
+#~ msgstr "Odpovídající relace nebyla nalezena.\n"
+
+#~ msgid "No per-database role settings support in this server version.\n"
+#~ msgstr "Tato verze serveru nepodporuje nastavení rolí dle databáze.\n"
+
+#~ msgid "default %s"
+#~ msgstr "implicitně %s"
+
+#~ msgid "not null"
+#~ msgstr "not null"
+
+#~ msgid "collate %s"
+#~ msgstr "collate %s"
+
+#~ msgid "Value"
+#~ msgstr "Hodnota"
+
+#~ msgid "Modifiers"
+#~ msgstr "Modifikátory"
+
+#~ msgid "normal"
+#~ msgstr "normal"
+
+#~ msgid "could not set variable \"%s\"\n"
+#~ msgstr "nelze nastavit proměnnou \"%s\"\n"
+
+#~ msgid "Watch every %lds\t%s"
+#~ msgstr "Zkontroluj každých %lds\t%s"
+
+#~ msgid "Showing only tuples."
+#~ msgstr "Zobrazovány jsou pouze záznamy."
+
+#~ msgid "Showing locale-adjusted numeric output."
+#~ msgstr "Zobrazí číselný výstup dle národního nastavení."
+
+#~ msgid "SSL connection (unknown cipher)\n"
+#~ msgstr "SSL spojení (neznámá šifra)\n"
+
+#~ msgid "+ opt(%d) = |%s|\n"
+#~ msgstr "+ opt(%d) = |%s|\n"
+
+#~ msgid "\\%s: error while setting variable\n"
+#~ msgstr "\\%s: chyba při nastavování proměnné\n"
+
+#~ msgid "Password encryption failed.\n"
+#~ msgstr "Zašifrování hesla selhalo.\n"
+
+#~ msgid "lock a table"
+#~ msgstr "uzamkne tabulku"
+
+#~ msgid "from_list"
+#~ msgstr "from_seznam"
+
+#~ msgid "using_list"
+#~ msgstr "using_seznam"
+
+#~ msgid "old_version"
+#~ msgstr "stará_verze"
+
+#~ msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n"
+#~ msgstr " \\g [SOUBOR] nebo ; pošle SQL dotaz na server (a zapíše výsledek do souboru nebo |roury)\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Chyby posílejte na adresu <pgsql-bugs@postgresql.org>.\n"
diff --git a/src/bin/psql/po/de.po b/src/bin/psql/po/de.po
new file mode 100644
index 0000000..912297d
--- /dev/null
+++ b/src/bin/psql/po/de.po
@@ -0,0 +1,6486 @@
+# German message translation file for psql
+# Peter Eisentraut <peter@eisentraut.org>, 2001 - 2023.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-02-03 13:16+0000\n"
+"PO-Revision-Date: 2023-02-03 16:09+0100\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "konnte aktuelles Verzeichnis nicht ermitteln: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "ungültige Programmdatei »%s«"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "konnte Programmdatei »%s« nicht lesen"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "konnte kein »%s« zum Ausführen finden"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "konnte nicht in Verzeichnis »%s« wechseln: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() fehlgeschlagen: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "Speicher aufgebraucht"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "konnte effektive Benutzer-ID %ld nicht nachschlagen: %s"
+
+#: ../../common/username.c:45 command.c:575
+msgid "user does not exist"
+msgstr "Benutzer existiert nicht"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "Fehler beim Nachschlagen des Benutzernamens: Fehlercode %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "Befehl ist nicht ausführbar"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "Befehl nicht gefunden"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "Kindprozess hat mit Code %d beendet"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "Kindprozess wurde durch Ausnahme 0x%X beendet"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "Kindprozess wurde von Signal %d beendet: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "Kindprozess hat mit unbekanntem Status %d beendet"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Abbruchsanforderung gesendet\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Konnte Abbruchsanforderung nicht senden: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu Zeile)"
+msgstr[1] "(%lu Zeilen)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Unterbrochen\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Kann keinen weiteren Spaltenkopf zur Tabelle hinzufügen: Spaltenzahl %d überschritten.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Cann keine weitere Zelle zur Tabelle hinzufügen: Zellengesamtzahl %d überschritten.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "ungültiges Ausgabeformat (interner Fehler): %d"
+
+#: ../../fe_utils/psqlscan.l:702
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "rekursive Auswertung der Variable »%s« wird ausgelassen"
+
+#: ../../port/thread.c:100 ../../port/thread.c:136
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "konnte lokale Benutzer-ID %d nicht nachschlagen: %s"
+
+#: ../../port/thread.c:105 ../../port/thread.c:141
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "lokaler Benutzer mit ID %d existiert nicht"
+
+#: command.c:232
+#, c-format
+msgid "invalid command \\%s"
+msgstr "ungültige Anweisung \\%s"
+
+#: command.c:234
+#, c-format
+msgid "Try \\? for help."
+msgstr "Versuchen Sie \\? für Hilfe."
+
+#: command.c:252
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: überflüssiges Argument »%s« ignoriert"
+
+#: command.c:304
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "Befehl \\%s ignoriert; verwenden Sie \\endif oder Strg-C um den aktuellen \\if-Block zu beenden"
+
+#: command.c:573
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "konnte Home-Verzeichnis für Benutzer-ID %ld nicht ermitteln: %s"
+
+#: command.c:592
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: konnte nicht in das Verzeichnis »%s« wechseln: %m"
+
+#: command.c:617
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "Sie sind gegenwärtig nicht mit einer Datenbank verbunden.\n"
+
+#: command.c:627
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Sie sind verbunden mit der Datenbank »%s« als Benutzer »%s« auf Adresse »%s« auf Port »%s«.\n"
+
+#: command.c:630
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Sie sind verbunden mit der Datenbank »%s« als Benutzer »%s« via Socket in »%s« auf Port »%s«.\n"
+
+#: command.c:636
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Sie sind verbunden mit der Datenbank »%s« als Benutzer »%s« auf Host »%s« (Adresse »%s«) auf Port »%s«.\n"
+
+#: command.c:639
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Sie sind verbunden mit der Datenbank »%s« als Benutzer »%s« auf Host »%s« auf Port »%s«.\n"
+
+#: command.c:1030 command.c:1125 command.c:2654
+#, c-format
+msgid "no query buffer"
+msgstr "kein Anfragepuffer"
+
+#: command.c:1063 command.c:5491
+#, c-format
+msgid "invalid line number: %s"
+msgstr "ungültige Zeilennummer: %s"
+
+#: command.c:1203
+msgid "No changes"
+msgstr "keine Änderungen"
+
+#: command.c:1282
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: ungültiger Kodierungsname oder Umwandlungsprozedur nicht gefunden"
+
+#: command.c:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597
+#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100
+#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443
+#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1324
+msgid "There is no previous error."
+msgstr "Es gibt keinen vorangegangenen Fehler."
+
+#: command.c:1437
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: rechte Klammer fehlt"
+
+#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989
+#: command.c:2173 command.c:2415 command.c:2621 command.c:2661
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: notwendiges Argument fehlt"
+
+#: command.c:1782
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: kann nicht nach \\else kommen"
+
+#: command.c:1787
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: kein passendes \\if"
+
+#: command.c:1851
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: kann nicht nach \\else kommen"
+
+#: command.c:1856
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: kein passendes \\if"
+
+#: command.c:1896
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: kein passendes \\if"
+
+#: command.c:2053
+msgid "Query buffer is empty."
+msgstr "Anfragepuffer ist leer."
+
+#: command.c:2096
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Neues Passwort für Benutzer »%s« eingeben: "
+
+#: command.c:2100
+msgid "Enter it again: "
+msgstr "Geben Sie es noch einmal ein: "
+
+#: command.c:2109
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Passwörter stimmten nicht überein."
+
+#: command.c:2208
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: konnte Wert für Variable nicht lesen"
+
+#: command.c:2311
+msgid "Query buffer reset (cleared)."
+msgstr "Anfragepuffer wurde gelöscht."
+
+#: command.c:2333
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "Befehlsgeschichte in Datei »%s« geschrieben.\n"
+
+#: command.c:2420
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: Name der Umgebungsvariable darf kein »=« enthalten"
+
+#: command.c:2468
+#, c-format
+msgid "function name is required"
+msgstr "Funktionsname wird benötigt"
+
+#: command.c:2470
+#, c-format
+msgid "view name is required"
+msgstr "Sichtname wird benötigt"
+
+#: command.c:2593
+msgid "Timing is on."
+msgstr "Zeitmessung ist an."
+
+#: command.c:2595
+msgid "Timing is off."
+msgstr "Zeitmessung ist aus."
+
+#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952
+#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008
+#: command.c:4022 command.c:4049 command.c:4107 common.c:77 copy.c:331
+#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:3107 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Passwort: "
+
+#: command.c:3112 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Passwort für Benutzer %s: "
+
+#: command.c:3168
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "Geben Sie Benutzer, Host oder Port nicht separat an, wenn eine Verbindungsangabe verwendet wird"
+
+#: command.c:3203
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "Es gibt keine Verbindung, von der die Parameter verwendet werden können"
+
+#: command.c:3511
+#, c-format
+msgid "Previous connection kept"
+msgstr "Vorherige Verbindung wurde behalten"
+
+#: command.c:3517
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3573
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s« auf Adresse »%s« auf Port »%s«.\n"
+
+#: command.c:3576
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s« via Socket in »%s« auf Port »%s«.\n"
+
+#: command.c:3582
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s« auf Host »%s« (Adresse »%s«) auf Port »%s«.\n"
+
+#: command.c:3585
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s« auf Host »%s« auf Port »%s«.\n"
+
+#: command.c:3590
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s«.\n"
+
+#: command.c:3630
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, Server %s)\n"
+
+#: command.c:3643
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"WARNUNG: %s-Hauptversion %s, Server-Hauptversion %s.\n"
+" Einige Features von psql werden eventuell nicht funktionieren.\n"
+
+#: command.c:3680
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "SSL-Verbindung (Protokoll: %s, Verschlüsselungsmethode: %s, Komprimierung: %s)\n"
+
+#: command.c:3681 command.c:3682
+msgid "unknown"
+msgstr "unbekannt"
+
+#: command.c:3683 help.c:42
+msgid "off"
+msgstr "aus"
+
+#: command.c:3683 help.c:42
+msgid "on"
+msgstr "an"
+
+#: command.c:3697
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "GSSAPI-verschlüsselte Verbindung\n"
+
+#: command.c:3717
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"Warnung: Konsolencodeseite (%u) unterscheidet sich von der Windows-\n"
+" Codeseite (%u). 8-Bit-Zeichen funktionieren möglicherweise nicht\n"
+" richtig. Einzelheiten finden Sie auf der psql-Handbuchseite unter\n"
+" »Notes for Windows users«.\n"
+
+#: command.c:3822
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "Umgebungsvariable PSQL_EDITOR_LINENUMBER_ARG muss gesetzt werden, um eine Zeilennummer angeben zu können"
+
+#: command.c:3851
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "konnte Editor »%s« nicht starten"
+
+#: command.c:3853
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "konnte /bin/sh nicht starten"
+
+#: command.c:3903
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "konnte temporäres Verzeichnis nicht finden: %s"
+
+#: command.c:3930
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "konnte temporäre Datei »%s« nicht öffnen: %m"
+
+#: command.c:4266
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: Abkürzung »%s« ist nicht eindeutig, passt auf »%s« und »%s«"
+
+#: command.c:4286
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: zulässige Formate sind aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4305
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: zulässige Linienstile sind ascii, old-ascii, unicode"
+
+#: command.c:4320
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: zulässige Unicode-Rahmnenlinienstile sind single, double"
+
+#: command.c:4335
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: zulässige Unicode-Spaltenlinienstile sind single, double"
+
+#: command.c:4350
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: zulässige Unicode-Kopflinienstile sind single, double"
+
+#: command.c:4393
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep muss ein einzelnes Ein-Byte-Zeichen sein"
+
+#: command.c:4398
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep kann nicht doppeltes Anführungszeichen, Newline oder Carriage Return sein"
+
+#: command.c:4535 command.c:4723
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: unbekannte Option: %s"
+
+#: command.c:4555
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Rahmenstil ist %d.\n"
+
+#: command.c:4561
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "Zielbreite ist nicht gesetzt.\n"
+
+#: command.c:4563
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "Zielbreite ist %d.\n"
+
+#: command.c:4570
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Erweiterte Anzeige ist an.\n"
+
+#: command.c:4572
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "Erweiterte Anzeige wird automatisch verwendet.\n"
+
+#: command.c:4574
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Erweiterte Anzeige ist aus.\n"
+
+#: command.c:4580
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "Feldtrennzeichen für CSV ist »%s«.\n"
+
+#: command.c:4588 command.c:4596
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "Feldtrennzeichen ist ein Null-Byte.\n"
+
+#: command.c:4590
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "Feldtrennzeichen ist »%s«.\n"
+
+#: command.c:4603
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Standardfußzeile ist an.\n"
+
+#: command.c:4605
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Standardfußzeile ist aus.\n"
+
+#: command.c:4611
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Ausgabeformat ist »%s«.\n"
+
+#: command.c:4617
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Linienstil ist %s.\n"
+
+#: command.c:4624
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Null-Anzeige ist »%s«.\n"
+
+#: command.c:4632
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "Lokalisiertes Format für numerische Daten ist an.\n"
+
+#: command.c:4634
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "Lokalisiertes Format für numerische Daten ist aus.\n"
+
+#: command.c:4641
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "Pager wird für lange Ausgaben verwendet.\n"
+
+#: command.c:4643
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "Pager wird immer verwendet.\n"
+
+#: command.c:4645
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "Pager-Verwendung ist aus.\n"
+
+#: command.c:4651
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "Pager wird nicht für weniger als %d Zeile verwendet werden.\n"
+msgstr[1] "Pager wird nicht für weniger als %d Zeilen verwendet werden.\n"
+
+#: command.c:4661 command.c:4671
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "Satztrennzeichen ist ein Null-Byte.\n"
+
+#: command.c:4663
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "Satztrennzeichen ist <newline>.\n"
+
+#: command.c:4665
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "Satztrennzeichen ist »%s«.\n"
+
+#: command.c:4678
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Tabellenattribute sind »%s«.\n"
+
+#: command.c:4681
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Tabellenattribute sind nicht gesetzt.\n"
+
+#: command.c:4688
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Titel ist »%s«.\n"
+
+#: command.c:4690
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Titel ist nicht gesetzt.\n"
+
+#: command.c:4697
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "Nur Datenzeilen ist an.\n"
+
+#: command.c:4699
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "Nur Datenzeilen ist aus.\n"
+
+#: command.c:4705
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Unicode-Rahmenlinienstil ist »%s«.\n"
+
+#: command.c:4711
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Unicode-Spaltenlinienstil ist »%s«.\n"
+
+#: command.c:4717
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Unicode-Kopflinienstil ist »%s«.\n"
+
+#: command.c:4950
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: fehlgeschlagen"
+
+#: command.c:4984
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch kann nicht mit einer leeren Anfrage verwendet werden"
+
+#: command.c:5016
+#, c-format
+msgid "could not set timer: %m"
+msgstr "konnte Timer nicht setzen: %m"
+
+#: command.c:5078
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (alle %gs)\n"
+
+#: command.c:5081
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (alle %gs)\n"
+
+#: command.c:5142
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "konnte nicht auf Signale warten: %m"
+
+#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"******** ANFRAGE *********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5386
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "»%s.%s« ist keine Sicht"
+
+#: command.c:5402
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "konnte reloptions-Array nicht interpretieren"
+
+#: common.c:166
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "Escape kann nicht ohne aktive Verbindung ausgeführt werden"
+
+#: common.c:207
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "Argument des Shell-Befehls enthält Newline oder Carriage Return: »%s«"
+
+#: common.c:311
+#, c-format
+msgid "connection to server was lost"
+msgstr "Verbindung zum Server wurde verloren"
+
+#: common.c:315
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "Die Verbindung zum Server wurde verloren. Versuche Reset: "
+
+#: common.c:320
+#, c-format
+msgid "Failed.\n"
+msgstr "Fehlgeschlagen.\n"
+
+#: common.c:337
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Erfolgreich.\n"
+
+#: common.c:389 common.c:1001
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "unerwarteter PQresultStatus: %d"
+
+#: common.c:511
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Zeit: %.3f ms\n"
+
+#: common.c:526
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Zeit: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:535
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Zeit: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:542
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Zeit: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:566 common.c:623 common.c:1034 describe.c:6135
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Sie sind gegenwärtig nicht mit einer Datenbank verbunden."
+
+#: common.c:654
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "Asynchrone Benachrichtigung »%s« mit Daten »%s« vom Serverprozess mit PID %d empfangen.\n"
+
+#: common.c:657
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "Asynchrone Benachrichtigung »%s« vom Serverprozess mit PID %d empfangen.\n"
+
+#: common.c:688
+#, c-format
+msgid "could not print result table: %m"
+msgstr "konnte Ergebnistabelle nicht ausgeben: %m"
+
+#: common.c:708
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "keine Zeilen für \\gset zurückgegeben"
+
+#: common.c:713
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "mehr als eine Zeile für \\gset zurückgegeben"
+
+#: common.c:731
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "Versuch von \\gset in besonders behandelte Variable »%s« ignoriert"
+
+#: common.c:1043
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Einzelschrittmodus: Anfrage bestätigen)*************************************\n"
+"%s\n"
+"***(Drücken Sie die Eingabetaste um fortzufahren oder »x« um abzubrechen)*******\n"
+
+#: common.c:1126
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "ANWEISUNG: %s"
+
+#: common.c:1162
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "unerwarteter Transaktionsstatus (%d)"
+
+#: common.c:1303 describe.c:2020
+msgid "Column"
+msgstr "Spalte"
+
+#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037
+#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021
+#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504
+#: describe.c:5767
+msgid "Type"
+msgstr "Typ"
+
+#: common.c:1353
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "Der Befehl hat kein Ergebnis oder das Ergebnis hat keine Spalten.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: benötigt Argumente"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: Parse-Fehler bei »%s«"
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: Parse-Fehler am Zeilenende"
+
+#: copy.c:328
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "konnte Befehl »%s« nicht ausführen: %m"
+
+#: copy.c:344
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m"
+
+#: copy.c:348
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: ein Verzeichnis kann nicht kopiert werden"
+
+#: copy.c:385
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "konnte Pipe zu externem Programm nicht schließen: %m"
+
+#: copy.c:390
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: copy.c:453 copy.c:463
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "konnte COPY-Daten nicht schreiben: %m"
+
+#: copy.c:469
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "Datentransfer mit COPY fehlgeschlagen: %s"
+
+#: copy.c:530
+msgid "canceled by user"
+msgstr "vom Benutzer abgebrochen"
+
+#: copy.c:541
+msgid ""
+"Enter data to be copied followed by a newline.\n"
+"End with a backslash and a period on a line by itself, or an EOF signal."
+msgstr ""
+"Geben Sie die zu kopierenden Daten ein, gefolgt von einem Zeilenende.\n"
+"Beenden Sie mit einem Backslash und einem Punkt alleine auf einer Zeile, oder einem EOF-Signal."
+
+#: copy.c:684
+msgid "aborted because of read failure"
+msgstr "abgebrochen wegen Lesenfehlers"
+
+#: copy.c:718
+msgid "trying to exit copy mode"
+msgstr "versuche, den COPY-Modus zu verlassen"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: Anweisung hat keine Ergebnismenge zurückgegeben"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: Anfrage muss mindestens drei Spalten zurückgeben"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: die vertikalen und horizontalen Kopffelder müssen verschiedene Spalten sein"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: Datenspalte muss angegeben werden, wenn die Anfrage mehr als drei Spalten zurückgibt"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: maximale Anzahl Spalten (%d) überschritten"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: Anfrageergebnis enthält mehrfache Datenwerte für Zeile »%s«, Spalte »%s«"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: Spaltennummer %d ist außerhalb des zulässigen Bereichs 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: zweideutiger Spaltenname: »%s«"
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: Spaltenname nicht gefunden: »%s«"
+
+#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029
+#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090
+#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866
+#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420
+#: describe.c:5477 describe.c:5881 describe.c:5959
+msgid "Schema"
+msgstr "Schema"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636
+#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258
+#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341
+#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867
+#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410
+#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748
+#: describe.c:5957 describe.c:6186 describe.c:6494
+msgid "Name"
+msgstr "Name"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "Ergebnisdatentyp"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "Argumentdatentypen"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423
+#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041
+#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280
+#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777
+#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248
+#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422
+#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895
+#: describe.c:5960 describe.c:6992
+msgid "Description"
+msgstr "Beschreibung"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "Liste der Aggregatfunktionen"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "Der Server (Version %s) unterstützt keine Zugriffsmethoden."
+
+#: describe.c:168
+msgid "Index"
+msgstr "Index"
+
+#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882
+msgid "Table"
+msgstr "Tabelle"
+
+#: describe.c:177 describe.c:5679
+msgid "Handler"
+msgstr "Handler"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "Liste der Zugriffsmethoden"
+
+#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181
+#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588
+#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187
+#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718
+#: describe.c:6980
+msgid "Owner"
+msgstr "Eigentümer"
+
+#: describe.c:231
+msgid "Location"
+msgstr "Pfad"
+
+#: describe.c:241 describe.c:3509
+msgid "Options"
+msgstr "Optionen"
+
+#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934
+msgid "Size"
+msgstr "Größe"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "Liste der Tablespaces"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df akzeptiert nur [anptwS+] als Optionen"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df akzeptiert die Option »%c« nicht mit Serverversion %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "Agg"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "Fenster"
+
+#: describe.c:356
+msgid "proc"
+msgstr "Proz"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "Funk"
+
+#: describe.c:374 describe.c:1390
+msgid "trigger"
+msgstr "Trigger"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "unveränderlich"
+
+#: describe.c:387
+msgid "stable"
+msgstr "stabil"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "volatil"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "Volatilität"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "beschränkt"
+
+#: describe.c:398
+msgid "safe"
+msgstr "sicher"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "unsicher"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "Parallel"
+
+#: describe.c:405
+msgid "definer"
+msgstr "definer"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "invoker"
+
+#: describe.c:407
+msgid "Security"
+msgstr "Sicherheit"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Sprache"
+
+#: describe.c:416 describe.c:420
+msgid "Source code"
+msgstr "Quelltext"
+
+#: describe.c:594
+msgid "List of functions"
+msgstr "Liste der Funktionen"
+
+#: describe.c:657
+msgid "Internal name"
+msgstr "Interner Name"
+
+#: describe.c:659
+msgid "Elements"
+msgstr "Elemente"
+
+#: describe.c:711
+msgid "List of data types"
+msgstr "Liste der Datentypen"
+
+#: describe.c:814
+msgid "Left arg type"
+msgstr "Linker Typ"
+
+#: describe.c:815
+msgid "Right arg type"
+msgstr "Rechter Typ"
+
+#: describe.c:816
+msgid "Result type"
+msgstr "Ergebnistyp"
+
+#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247
+#: describe.c:6909 describe.c:6913
+msgid "Function"
+msgstr "Funktion"
+
+#: describe.c:902
+msgid "List of operators"
+msgstr "Liste der Operatoren"
+
+#: describe.c:938
+msgid "Encoding"
+msgstr "Kodierung"
+
+#: describe.c:939 describe.c:4868
+msgid "Collate"
+msgstr "Sortierfolge"
+
+#: describe.c:940 describe.c:4869
+msgid "Ctype"
+msgstr "Zeichentyp"
+
+#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878
+msgid "ICU Locale"
+msgstr "ICU-Locale"
+
+#: describe.c:946 describe.c:952
+msgid "Locale Provider"
+msgstr "Locale-Provider"
+
+#: describe.c:964
+msgid "Tablespace"
+msgstr "Tablespace"
+
+#: describe.c:990
+msgid "List of databases"
+msgstr "Liste der Datenbanken"
+
+#: describe.c:1031 describe.c:1184 describe.c:3882
+msgid "table"
+msgstr "Tabelle"
+
+#: describe.c:1032 describe.c:3883
+msgid "view"
+msgstr "Sicht"
+
+#: describe.c:1033 describe.c:3884
+msgid "materialized view"
+msgstr "materialisierte Sicht"
+
+#: describe.c:1034 describe.c:1186 describe.c:3886
+msgid "sequence"
+msgstr "Sequenz"
+
+#: describe.c:1035 describe.c:3888
+msgid "foreign table"
+msgstr "Fremdtabelle"
+
+#: describe.c:1036 describe.c:3889 describe.c:4101
+msgid "partitioned table"
+msgstr "partitionierte Tabelle"
+
+#: describe.c:1047
+msgid "Column privileges"
+msgstr "Spaltenprivilegien"
+
+#: describe.c:1078 describe.c:1112
+msgid "Policies"
+msgstr "Policys"
+
+#: describe.c:1143 describe.c:4510 describe.c:6577
+msgid "Access privileges"
+msgstr "Zugriffsprivilegien"
+
+#: describe.c:1188
+msgid "function"
+msgstr "Funktion"
+
+#: describe.c:1190
+msgid "type"
+msgstr "Typ"
+
+#: describe.c:1192
+msgid "schema"
+msgstr "Schema"
+
+#: describe.c:1215
+msgid "Default access privileges"
+msgstr "Vorgegebene Zugriffsprivilegien"
+
+#: describe.c:1259
+msgid "Object"
+msgstr "Objekt"
+
+#: describe.c:1273
+msgid "table constraint"
+msgstr "Tabellen-Constraint"
+
+#: describe.c:1297
+msgid "domain constraint"
+msgstr "Domänen-Constraint"
+
+#: describe.c:1321
+msgid "operator class"
+msgstr "Operatorklasse"
+
+#: describe.c:1345
+msgid "operator family"
+msgstr "Operatorfamilie"
+
+#: describe.c:1368
+msgid "rule"
+msgstr "Rule"
+
+#: describe.c:1414
+msgid "Object descriptions"
+msgstr "Objektbeschreibungen"
+
+#: describe.c:1479 describe.c:4007
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Keine Relation namens »%s« gefunden"
+
+#: describe.c:1482 describe.c:4010
+#, c-format
+msgid "Did not find any relations."
+msgstr "Keine Relationen gefunden"
+
+#: describe.c:1678
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Keine Relation mit OID %s gefunden"
+
+#: describe.c:1726 describe.c:1750
+msgid "Start"
+msgstr "Start"
+
+#: describe.c:1727 describe.c:1751
+msgid "Minimum"
+msgstr "Minimum"
+
+#: describe.c:1728 describe.c:1752
+msgid "Maximum"
+msgstr "Maximum"
+
+#: describe.c:1729 describe.c:1753
+msgid "Increment"
+msgstr "Inkrement"
+
+#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426
+#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620
+msgid "yes"
+msgstr "ja"
+
+#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426
+#: describe.c:4768 describe.c:4892 describe.c:6621
+msgid "no"
+msgstr "nein"
+
+#: describe.c:1732 describe.c:1756
+msgid "Cycles?"
+msgstr "Zyklisch?"
+
+#: describe.c:1733 describe.c:1757
+msgid "Cache"
+msgstr "Cache"
+
+#: describe.c:1798
+#, c-format
+msgid "Owned by: %s"
+msgstr "Eigentümer: %s"
+
+#: describe.c:1802
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Sequenz für Identitätsspalte: %s"
+
+#: describe.c:1810
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "Ungeloggte Sequenz »%s.%s«"
+
+#: describe.c:1813
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Sequenz »%s.%s«"
+
+#: describe.c:1957
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Ungeloggte Tabelle »%s.%s«"
+
+#: describe.c:1960
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Tabelle »%s.%s«"
+
+#: describe.c:1964
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Sicht »%s.%s«"
+
+#: describe.c:1969
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Ungeloggte materialisierte Sicht »%s.%s«"
+
+#: describe.c:1972
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Materialisierte Sicht »%s.%s«"
+
+#: describe.c:1977
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Ungeloggter Index »%s.%s«"
+
+#: describe.c:1980
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Index »%s.%s«"
+
+#: describe.c:1985
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Ungeloggter partitionierter Index »%s.%s«"
+
+#: describe.c:1988
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Partitionierter Index »%s.%s«"
+
+#: describe.c:1992
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST-Tabelle »%s.%s«"
+
+#: describe.c:1996
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Zusammengesetzter Typ »%s.%s«"
+
+#: describe.c:2000
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Fremdtabelle »%s.%s«"
+
+#: describe.c:2005
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Ungeloggte partitionierte Tabelle »%s.%s«"
+
+#: describe.c:2008
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Partitionierte Tabelle »%s.%s«"
+
+#: describe.c:2024 describe.c:4343
+msgid "Collation"
+msgstr "Sortierfolge"
+
+#: describe.c:2025 describe.c:4344
+msgid "Nullable"
+msgstr "NULL erlaubt?"
+
+#: describe.c:2026 describe.c:4345
+msgid "Default"
+msgstr "Vorgabewert"
+
+#: describe.c:2029
+msgid "Key?"
+msgstr "Schlüssel?"
+
+#: describe.c:2031 describe.c:4665 describe.c:4676
+msgid "Definition"
+msgstr "Definition"
+
+#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835
+#: describe.c:5894
+msgid "FDW options"
+msgstr "FDW-Optionen"
+
+#: describe.c:2035
+msgid "Storage"
+msgstr "Speicherung"
+
+#: describe.c:2037
+msgid "Compression"
+msgstr "Kompression"
+
+#: describe.c:2039
+msgid "Stats target"
+msgstr "Statistikziel"
+
+#: describe.c:2175
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "Partition von: %s %s%s"
+
+#: describe.c:2188
+msgid "No partition constraint"
+msgstr "Kein Partitions-Constraint"
+
+#: describe.c:2190
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Partitions-Constraint: %s"
+
+#: describe.c:2214
+#, c-format
+msgid "Partition key: %s"
+msgstr "Partitionsschlüssel: %s"
+
+#: describe.c:2240
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Gehört zu Tabelle: »%s.%s«"
+
+#: describe.c:2309
+msgid "primary key, "
+msgstr "Primärschlüssel, "
+
+#: describe.c:2312
+msgid "unique"
+msgstr "unique"
+
+#: describe.c:2314
+msgid " nulls not distinct"
+msgstr " nulls not distinct"
+
+#: describe.c:2315
+msgid ", "
+msgstr ", "
+
+#: describe.c:2322
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "für Tabelle »%s.%s«"
+
+#: describe.c:2326
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", Prädikat (%s)"
+
+#: describe.c:2329
+msgid ", clustered"
+msgstr ", geclustert"
+
+#: describe.c:2332
+msgid ", invalid"
+msgstr ", ungültig"
+
+#: describe.c:2335
+msgid ", deferrable"
+msgstr ", DEFERRABLE"
+
+#: describe.c:2338
+msgid ", initially deferred"
+msgstr ", INITIALLY DEFERRED"
+
+#: describe.c:2341
+msgid ", replica identity"
+msgstr ", Replika-Identität"
+
+#: describe.c:2395
+msgid "Indexes:"
+msgstr "Indexe:"
+
+#: describe.c:2478
+msgid "Check constraints:"
+msgstr "Check-Constraints:"
+
+#: describe.c:2546
+msgid "Foreign-key constraints:"
+msgstr "Fremdschlüssel-Constraints:"
+
+#: describe.c:2609
+msgid "Referenced by:"
+msgstr "Fremdschlüsselverweise von:"
+
+#: describe.c:2659
+msgid "Policies:"
+msgstr "Policys:"
+
+#: describe.c:2662
+msgid "Policies (forced row security enabled):"
+msgstr "Policys (Sicherheit auf Zeilenebene erzwungen):"
+
+#: describe.c:2665
+msgid "Policies (row security enabled): (none)"
+msgstr "Policys (Sicherheit auf Zeilenebene eingeschaltet): (keine)"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Policys (Sicherheit auf Zeilenebene erzwungen): (keine)"
+
+#: describe.c:2671
+msgid "Policies (row security disabled):"
+msgstr "Policys (Sicherheit auf Zeilenebene ausgeschaltet):"
+
+#: describe.c:2731 describe.c:2835
+msgid "Statistics objects:"
+msgstr "Statistikobjekte:"
+
+#: describe.c:2937 describe.c:3090
+msgid "Rules:"
+msgstr "Regeln:"
+
+#: describe.c:2940
+msgid "Disabled rules:"
+msgstr "Abgeschaltete Regeln:"
+
+#: describe.c:2943
+msgid "Rules firing always:"
+msgstr "Regeln, die immer aktiv werden:"
+
+#: describe.c:2946
+msgid "Rules firing on replica only:"
+msgstr "Regeln, die nur im Replikat aktiv werden:"
+
+#: describe.c:3025 describe.c:5030
+msgid "Publications:"
+msgstr "Publikationen:"
+
+#: describe.c:3073
+msgid "View definition:"
+msgstr "Sichtdefinition:"
+
+#: describe.c:3236
+msgid "Triggers:"
+msgstr "Trigger:"
+
+#: describe.c:3239
+msgid "Disabled user triggers:"
+msgstr "Abgeschaltete Benutzer-Trigger:"
+
+#: describe.c:3242
+msgid "Disabled internal triggers:"
+msgstr "Abgeschaltete interne Trigger:"
+
+#: describe.c:3245
+msgid "Triggers firing always:"
+msgstr "Trigger, die immer aktiv werden:"
+
+#: describe.c:3248
+msgid "Triggers firing on replica only:"
+msgstr "Trigger, die nur im Replikat aktiv werden:"
+
+#: describe.c:3319
+#, c-format
+msgid "Server: %s"
+msgstr "Server: %s"
+
+#: describe.c:3327
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW-Optionen: (%s)"
+
+#: describe.c:3348
+msgid "Inherits"
+msgstr "Erbt von"
+
+#: describe.c:3413
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "Anzahl Partitionen: %d"
+
+#: describe.c:3422
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Anzahl Partitionen: %d (Mit \\d+ alle anzeigen.)"
+
+#: describe.c:3424
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Anzahl Kindtabellen: %d (Mit \\d+ alle anzeigen.)"
+
+#: describe.c:3431
+msgid "Child tables"
+msgstr "Kindtabellen"
+
+#: describe.c:3431
+msgid "Partitions"
+msgstr "Partitionen"
+
+#: describe.c:3462
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Getypte Tabelle vom Typ: %s"
+
+#: describe.c:3478
+msgid "Replica Identity"
+msgstr "Replika-Identität"
+
+#: describe.c:3491
+msgid "Has OIDs: yes"
+msgstr "Hat OIDs: ja"
+
+#: describe.c:3500
+#, c-format
+msgid "Access method: %s"
+msgstr "Zugriffsmethode: %s"
+
+#: describe.c:3579
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "Tablespace: »%s«"
+
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:3591
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", Tablespace »%s«"
+
+#: describe.c:3668
+msgid "List of roles"
+msgstr "Liste der Rollen"
+
+#: describe.c:3670
+msgid "Role name"
+msgstr "Rollenname"
+
+#: describe.c:3671
+msgid "Attributes"
+msgstr "Attribute"
+
+#: describe.c:3673
+msgid "Member of"
+msgstr "Mitglied von"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "Superuser"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "keine Vererbung"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "Rolle erzeugen"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "DB erzeugen"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "kann nicht einloggen"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "Replikation"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "Bypass RLS"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "keine Verbindungen"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d Verbindung"
+msgstr[1] "%d Verbindungen"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Passwort gültig bis "
+
+#: describe.c:3777
+msgid "Role"
+msgstr "Rolle"
+
+#: describe.c:3778
+msgid "Database"
+msgstr "Datenbank"
+
+#: describe.c:3779
+msgid "Settings"
+msgstr "Einstellung"
+
+#: describe.c:3803
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "Keine Einstellungen für Rolle »%s« und Datenbank »%s« gefunden"
+
+#: describe.c:3806
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Keine Einstellungen für Rolle »%s« gefunden"
+
+#: describe.c:3809
+#, c-format
+msgid "Did not find any settings."
+msgstr "Keine Einstellungen gefunden"
+
+#: describe.c:3814
+msgid "List of settings"
+msgstr "Liste der Einstellungen"
+
+#: describe.c:3885
+msgid "index"
+msgstr "Index"
+
+#: describe.c:3887
+msgid "TOAST table"
+msgstr "TOAST-Tabelle"
+
+#: describe.c:3890 describe.c:4102
+msgid "partitioned index"
+msgstr "partitionierter Index"
+
+#: describe.c:3910
+msgid "permanent"
+msgstr "permanent"
+
+#: describe.c:3911
+msgid "temporary"
+msgstr "temporär"
+
+#: describe.c:3912
+msgid "unlogged"
+msgstr "ungeloggt"
+
+#: describe.c:3913
+msgid "Persistence"
+msgstr "Persistenz"
+
+#: describe.c:3929
+msgid "Access method"
+msgstr "Zugriffsmethode"
+
+#: describe.c:4015
+msgid "List of relations"
+msgstr "Liste der Relationen"
+
+#: describe.c:4063
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "Der Server (Version %s) unterstützt keine deklarative Tabellenpartitionierung."
+
+#: describe.c:4074
+msgid "List of partitioned indexes"
+msgstr "Liste partitionierter Indexe"
+
+#: describe.c:4076
+msgid "List of partitioned tables"
+msgstr "Liste partitionierte Tabellen"
+
+#: describe.c:4080
+msgid "List of partitioned relations"
+msgstr "Liste partitionierter Relationen"
+
+#: describe.c:4111
+msgid "Parent name"
+msgstr "Elternname"
+
+#: describe.c:4124
+msgid "Leaf partition size"
+msgstr "Größe Leaf-Partition"
+
+#: describe.c:4127 describe.c:4133
+msgid "Total size"
+msgstr "Gesamtgröße"
+
+#: describe.c:4258
+msgid "Trusted"
+msgstr "Vertraut"
+
+#: describe.c:4267
+msgid "Internal language"
+msgstr "Interne Sprache"
+
+#: describe.c:4268
+msgid "Call handler"
+msgstr "Call-Handler"
+
+#: describe.c:4269 describe.c:5680
+msgid "Validator"
+msgstr "Validator"
+
+#: describe.c:4270
+msgid "Inline handler"
+msgstr "Inline-Handler"
+
+#: describe.c:4305
+msgid "List of languages"
+msgstr "Liste der Sprachen"
+
+#: describe.c:4346
+msgid "Check"
+msgstr "Check"
+
+#: describe.c:4390
+msgid "List of domains"
+msgstr "Liste der Domänen"
+
+#: describe.c:4424
+msgid "Source"
+msgstr "Quelle"
+
+#: describe.c:4425
+msgid "Destination"
+msgstr "Ziel"
+
+#: describe.c:4427 describe.c:6622
+msgid "Default?"
+msgstr "Standard?"
+
+#: describe.c:4469
+msgid "List of conversions"
+msgstr "Liste der Konversionen"
+
+#: describe.c:4497
+msgid "Parameter"
+msgstr "Parameter"
+
+#: describe.c:4498
+msgid "Value"
+msgstr "Wert"
+
+#: describe.c:4505
+msgid "Context"
+msgstr "Kontext"
+
+#: describe.c:4538
+msgid "List of configuration parameters"
+msgstr "Liste der Konfigurationsparameter"
+
+#: describe.c:4540
+msgid "List of non-default configuration parameters"
+msgstr "Liste der veränderten Konfigurationsparameter"
+
+#: describe.c:4567
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "Der Server (Version %s) unterstützt keine Ereignistrigger."
+
+#: describe.c:4587
+msgid "Event"
+msgstr "Ereignis"
+
+#: describe.c:4589
+msgid "enabled"
+msgstr "eingeschaltet"
+
+#: describe.c:4590
+msgid "replica"
+msgstr "Replika"
+
+#: describe.c:4591
+msgid "always"
+msgstr "immer"
+
+#: describe.c:4592
+msgid "disabled"
+msgstr "ausgeschaltet"
+
+#: describe.c:4593 describe.c:6496
+msgid "Enabled"
+msgstr "Eingeschaltet"
+
+#: describe.c:4595
+msgid "Tags"
+msgstr "Tags"
+
+#: describe.c:4619
+msgid "List of event triggers"
+msgstr "Liste der Ereignistrigger"
+
+#: describe.c:4646
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "Der Server (Version %s) unterstützt keine erweiterten Statistiken."
+
+#: describe.c:4683
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4684
+msgid "Dependencies"
+msgstr "Abhängigkeiten"
+
+#: describe.c:4694
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4718
+msgid "List of extended statistics"
+msgstr "Liste der erweiterten Statistiken"
+
+#: describe.c:4745
+msgid "Source type"
+msgstr "Quelltyp"
+
+#: describe.c:4746
+msgid "Target type"
+msgstr "Zieltyp"
+
+#: describe.c:4770
+msgid "in assignment"
+msgstr "in Zuweisung"
+
+#: describe.c:4772
+msgid "Implicit?"
+msgstr "Implizit?"
+
+#: describe.c:4831
+msgid "List of casts"
+msgstr "Liste der Typumwandlungen"
+
+#: describe.c:4883 describe.c:4887
+msgid "Provider"
+msgstr "Provider"
+
+#: describe.c:4893 describe.c:4898
+msgid "Deterministic?"
+msgstr "Deterministisch?"
+
+#: describe.c:4938
+msgid "List of collations"
+msgstr "Liste der Sortierfolgen"
+
+#: describe.c:5000
+msgid "List of schemas"
+msgstr "Liste der Schemas"
+
+#: describe.c:5117
+msgid "List of text search parsers"
+msgstr "Liste der Textsucheparser"
+
+#: describe.c:5167
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Kein Textsucheparser namens »%s« gefunden"
+
+#: describe.c:5170
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Keine Textsucheparser gefunden"
+
+#: describe.c:5245
+msgid "Start parse"
+msgstr "Parsen starten"
+
+#: describe.c:5246
+msgid "Method"
+msgstr "Methode"
+
+#: describe.c:5250
+msgid "Get next token"
+msgstr "Nächstes Token lesen"
+
+#: describe.c:5252
+msgid "End parse"
+msgstr "Parsen beenden"
+
+#: describe.c:5254
+msgid "Get headline"
+msgstr "Überschrift ermitteln"
+
+#: describe.c:5256
+msgid "Get token types"
+msgstr "Tokentypen ermitteln"
+
+#: describe.c:5267
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Textsucheparser »%s.%s«"
+
+#: describe.c:5270
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Textsucheparser »%s«"
+
+#: describe.c:5289
+msgid "Token name"
+msgstr "Tokenname"
+
+#: describe.c:5303
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Tokentypen für Parser »%s.%s«"
+
+#: describe.c:5306
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Tokentypen für Parser »%s«"
+
+#: describe.c:5350
+msgid "Template"
+msgstr "Vorlage"
+
+#: describe.c:5351
+msgid "Init options"
+msgstr "Initialisierungsoptionen"
+
+#: describe.c:5378
+msgid "List of text search dictionaries"
+msgstr "Liste der Textsuchewörterbücher"
+
+#: describe.c:5411
+msgid "Init"
+msgstr "Init"
+
+#: describe.c:5412
+msgid "Lexize"
+msgstr "Lexize"
+
+#: describe.c:5444
+msgid "List of text search templates"
+msgstr "Liste der Textsuchevorlagen"
+
+#: describe.c:5499
+msgid "List of text search configurations"
+msgstr "Liste der Textsuchekonfigurationen"
+
+#: describe.c:5550
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "Keine Textsuchekonfiguration namens »%s« gefunden"
+
+#: describe.c:5553
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Keine Textsuchekonfigurationen gefunden"
+
+#: describe.c:5619
+msgid "Token"
+msgstr "Token"
+
+#: describe.c:5620
+msgid "Dictionaries"
+msgstr "Wörterbücher"
+
+#: describe.c:5631
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Textsuchekonfiguration »%s.%s«"
+
+#: describe.c:5634
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Textsuchekonfiguration »%s«"
+
+#: describe.c:5638
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Parser: »%s.%s«"
+
+#: describe.c:5641
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Parser: »%s«"
+
+#: describe.c:5722
+msgid "List of foreign-data wrappers"
+msgstr "Liste der Fremddaten-Wrapper"
+
+#: describe.c:5750
+msgid "Foreign-data wrapper"
+msgstr "Fremddaten-Wrapper"
+
+#: describe.c:5768 describe.c:5958
+msgid "Version"
+msgstr "Version"
+
+#: describe.c:5799
+msgid "List of foreign servers"
+msgstr "Liste der Fremdserver"
+
+#: describe.c:5824 describe.c:5883
+msgid "Server"
+msgstr "Server"
+
+#: describe.c:5825
+msgid "User name"
+msgstr "Benutzername"
+
+#: describe.c:5855
+msgid "List of user mappings"
+msgstr "Liste der Benutzerabbildungen"
+
+#: describe.c:5928
+msgid "List of foreign tables"
+msgstr "Liste der Fremdtabellen"
+
+#: describe.c:5980
+msgid "List of installed extensions"
+msgstr "Liste der installierten Erweiterungen"
+
+#: describe.c:6028
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "Keine Erweiterung namens »%s« gefunden"
+
+#: describe.c:6031
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Keine Erweiterungen gefunden"
+
+#: describe.c:6075
+msgid "Object description"
+msgstr "Objektbeschreibung"
+
+#: describe.c:6085
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Objekte in Erweiterung »%s«"
+
+#: describe.c:6126
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "falscher qualifizierter Name (zu viele Namensteile): %s"
+
+#: describe.c:6140
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "Verweise auf andere Datenbanken sind nicht implementiert: %s"
+
+#: describe.c:6171 describe.c:6298
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "Der Server (Version %s) unterstützt keine Publikationen."
+
+#: describe.c:6188 describe.c:6376
+msgid "All tables"
+msgstr "Alle Tabellen"
+
+#: describe.c:6189 describe.c:6377
+msgid "Inserts"
+msgstr "Inserts"
+
+#: describe.c:6190 describe.c:6378
+msgid "Updates"
+msgstr "Updates"
+
+#: describe.c:6191 describe.c:6379
+msgid "Deletes"
+msgstr "Deletes"
+
+#: describe.c:6195 describe.c:6381
+msgid "Truncates"
+msgstr "Truncates"
+
+#: describe.c:6199 describe.c:6383
+msgid "Via root"
+msgstr "Über Wurzel"
+
+#: describe.c:6221
+msgid "List of publications"
+msgstr "Liste der Publikationen"
+
+#: describe.c:6345
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "Keine Publikation namens »%s« gefunden"
+
+#: describe.c:6348
+#, c-format
+msgid "Did not find any publications."
+msgstr "Keine Publikationen gefunden"
+
+#: describe.c:6372
+#, c-format
+msgid "Publication %s"
+msgstr "Publikation %s"
+
+#: describe.c:6425
+msgid "Tables:"
+msgstr "Tabellen:"
+
+#: describe.c:6437
+msgid "Tables from schemas:"
+msgstr "Tabellen aus Schemas:"
+
+#: describe.c:6481
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Der Server (Version %s) unterstützt keine Subskriptionen."
+
+#: describe.c:6497
+msgid "Publication"
+msgstr "Publikation"
+
+#: describe.c:6506
+msgid "Binary"
+msgstr "Binär"
+
+#: describe.c:6507
+msgid "Streaming"
+msgstr "Streaming"
+
+#: describe.c:6514
+msgid "Two-phase commit"
+msgstr "Two-Phase-Commit"
+
+#: describe.c:6515
+msgid "Disable on error"
+msgstr "Bei Fehler abschalten"
+
+#: describe.c:6520
+msgid "Synchronous commit"
+msgstr "Synchroner Commit"
+
+#: describe.c:6521
+msgid "Conninfo"
+msgstr "Verbindungsinfo"
+
+#: describe.c:6527
+msgid "Skip LSN"
+msgstr "Skip-LSN"
+
+#: describe.c:6554
+msgid "List of subscriptions"
+msgstr "Liste der Subskriptionen"
+
+#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6617
+msgid "Input type"
+msgstr "Eingabetyp"
+
+#: describe.c:6618
+msgid "Storage type"
+msgstr "Storage-Typ"
+
+#: describe.c:6619
+msgid "Operator class"
+msgstr "Operatorklasse"
+
+#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901
+msgid "Operator family"
+msgstr "Operatorfamilie"
+
+#: describe.c:6667
+msgid "List of operator classes"
+msgstr "Liste der Operatorklassen"
+
+#: describe.c:6714
+msgid "Applicable types"
+msgstr "Passende Typen"
+
+#: describe.c:6756
+msgid "List of operator families"
+msgstr "Liste der Operatorfamilien"
+
+#: describe.c:6807
+msgid "Operator"
+msgstr "Operator"
+
+#: describe.c:6808
+msgid "Strategy"
+msgstr "Strategie"
+
+#: describe.c:6809
+msgid "ordering"
+msgstr "Sortieren"
+
+#: describe.c:6810
+msgid "search"
+msgstr "Suchen"
+
+#: describe.c:6811
+msgid "Purpose"
+msgstr "Zweck"
+
+#: describe.c:6816
+msgid "Sort opfamily"
+msgstr "Sortier-Opfamilie"
+
+#: describe.c:6855
+msgid "List of operators of operator families"
+msgstr "Liste der Operatoren in Operatorfamilien"
+
+#: describe.c:6902
+msgid "Registered left type"
+msgstr "Registrierter linker Typ"
+
+#: describe.c:6903
+msgid "Registered right type"
+msgstr "Registrierter rechter Typ"
+
+#: describe.c:6904
+msgid "Number"
+msgstr "Nummer"
+
+#: describe.c:6948
+msgid "List of support functions of operator families"
+msgstr "Liste der Unterstützungsfunktionen in Operatorfamilien"
+
+#: describe.c:6979
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7000
+msgid "Large objects"
+msgstr "Large Objects"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql ist das interaktive PostgreSQL-Terminal.\n"
+"\n"
+
+#: help.c:76 help.c:393 help.c:473 help.c:516
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [OPTION]... [DBNAME [BENUTZERNAME]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "Allgemeine Optionen:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=ANWEISUNG einzelne Anweisung ausführen und beenden\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr ""
+" -d, --dbname=DBNAME Datenbank, zu der verbunden werden soll\n"
+" (Standard: »%s«)\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=DATEINAME Anweisungen aus Datei ausführen und danach beenden\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list verfügbare Datenbanken auflisten und beenden\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NAME=WERT\n"
+" psql-Variable NAME auf WERT setzen\n"
+" (z.B. -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc Startdatei (~/.psqlrc) nicht lesen\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (»eins«), --single-transaction\n"
+" als eine einzige Transaktion ausführen (wenn nicht\n"
+" interaktiv)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] diese Hilfe anzeigen, dann beenden\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands Backslash-Befehle auflisten, dann beenden\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables besondere Variablen auflisten, dann beenden\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Eingabe- und Ausgabeoptionen:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all Skript-Inhalt wiedergeben\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors fehlgeschlagene Anweisungen wiedergeben\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries an den Server geschickte Anweisungen zeigen\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden von internen Anweisungen erzeugte Anfragen zeigen\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr ""
+" -L, --log-file=DATEINAME\n"
+" Sitzungslog in Datei senden\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline erweiterte Zeilenbearbeitung (Readline) ausschalten\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=DATEINAME Anfrageergebnisse in Datei (oder |Pipe) senden\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr ""
+" -q, --quiet stille Ausführung (keine Mitteilungen, nur\n"
+" Anfrageergebnisse)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step Einzelschrittmodus (jede Anfrage bestätigen)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line Einzelzeilenmodus (Zeilenende beendet SQL-Anweisung)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Ausgabeformatoptionen:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align unausgerichteter Tabellenausgabemodus\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv Tabellenausgabemodus CSV (Comma-Separated Values)\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=ZEICHEN\n"
+" Feldtrennzeichen für unausgerichteten Ausgabemodus\n"
+" (Standard: »%s«)\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html HTML-Tabellenausgabemodus\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr ""
+" -P, --pset=VAR[=ARG] Ausgabeoption VAR auf ARG setzen (siehe\n"
+" \\pset-Anweisung)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=ZEICHEN\n"
+" Satztrennzeichen für unausgerichteten Ausgabemodus\n"
+" (Standard: Newline)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only nur Datenzeilen ausgeben\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=TEXT HTML »table«-Tag-Attribute setzen (z.B. width, border)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded erweiterte Tabellenausgabe einschalten\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" Feldtrennzeichen für unausgerichteten Ausgabemodus auf\n"
+" Null-Byte setzen\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" Satztrennzeichen für unausgerichteten Ausgabemodus auf\n"
+" Null-Byte setzen\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Verbindungsoptionen:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr ""
+" -h, --host=HOSTNAME Hostname des Datenbankservers oder\n"
+" Socket-Verzeichnis (Standard: »%s«)\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "lokales Socket"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT Port des Datenbankservers (Standard: »%s«)\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=NAME Datenbank-Benutzername (Standard: »%s«)\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password niemals nach Passwort fragen\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password nach Passwort fragen (sollte automatisch geschehen)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Für mehr Informationen, geben Sie »\\?« (für interne Anweisungen) oder\n"
+"»\\help« (für SQL-Anweisungen) in psql ein oder schauen Sie in den psql-\n"
+"Abschnitt der PostgreSQL-Dokumentation.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Berichten Sie Fehler an <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "Allgemein\n"
+
+#: help.c:192
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright PostgreSQL-Urheberrechtsinformationen zeigen\n"
+
+#: help.c:193
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr ""
+" \\crosstabview [SPALTEN] Anfrage ausführen und Ergebnis als Kreuztabelle\n"
+" anzeigen\n"
+
+#: help.c:194
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose letzte Fehlermeldung mit vollen Details anzeigen\n"
+
+#: help.c:195
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPT)] [DATEI] SQL-Anweisung ausführen (und Ergebnis in Datei oder\n"
+" |Pipe schreiben); \\g ohne Argumente entspricht Semikolon\n"
+
+#: help.c:197
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc Ergebnis der Anfrage beschreiben ohne sie auszuführen\n"
+
+#: help.c:198
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr ""
+" \\gexec Anfrage ausführen, dann jeden Ergebniswert als\n"
+" Anweisung ausführen\n"
+
+#: help.c:199
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr ""
+" \\gset [PREFIX] SQL-Anweisung ausführen und Ergebnis in psql-Variablen\n"
+" ablegen\n"
+
+#: help.c:200
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(OPT)] [DATEI] wie \\g, aber mit erweitertem Ausgabemodus\n"
+
+#: help.c:201
+msgid " \\q quit psql\n"
+msgstr " \\q psql beenden\n"
+
+#: help.c:202
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SEK] Anfrage alle SEK Sekunden ausführen\n"
+
+#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304
+#: help.c:324 help.c:337 help.c:346
+msgid "\n"
+msgstr "\n"
+
+#: help.c:205
+msgid "Help\n"
+msgstr "Hilfe\n"
+
+#: help.c:207
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] Hilfe über Backslash-Befehle anzeigen\n"
+
+#: help.c:208
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options Hilfe über psql-Kommandozeilenoptionen anzeigen\n"
+
+#: help.c:209
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables Hilfe über besondere Variablen anzeigen\n"
+
+#: help.c:210
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [NAME] Syntaxhilfe über SQL-Anweisung, * für alle Anweisungen\n"
+
+#: help.c:213
+msgid "Query Buffer\n"
+msgstr "Anfragepuffer\n"
+
+#: help.c:214
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [DATEI] [ZEILE] Anfragepuffer (oder Datei) mit externem Editor bearbeiten\n"
+
+#: help.c:215
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [FUNKNAME [ZEILE]] Funktionsdefinition mit externem Editor bearbeiten\n"
+
+#: help.c:216
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [SICHTNAME [ZEILE]] Sichtdefinition mit externem Editor bearbeiten\n"
+
+#: help.c:217
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p aktuellen Inhalt der Anfragepuffers zeigen\n"
+
+#: help.c:218
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r Anfragepuffer löschen\n"
+
+#: help.c:220
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [DATEI] Befehlsgeschichte ausgeben oder in Datei schreiben\n"
+
+#: help.c:222
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w DATEI Anfragepuffer in Datei schreiben\n"
+
+#: help.c:225
+msgid "Input/Output\n"
+msgstr "Eingabe/Ausgabe\n"
+
+#: help.c:226
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... SQL COPY mit Datenstrom auf Client-Host ausführen\n"
+
+#: help.c:227
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [TEXT] Text auf Standardausgabe schreiben (-n für ohne Newline)\n"
+
+#: help.c:228
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i DATEI Befehle aus Datei ausführen\n"
+
+#: help.c:229
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir DATEI wie \\i, aber relativ zum Ort des aktuellen Skripts\n"
+
+#: help.c:230
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [DATEI] alle Anfrageergebnisse in Datei oder |Pipe schreiben\n"
+
+#: help.c:231
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr ""
+" \\qecho [-n] [TEXT] Text auf Ausgabestrom für \\o schreiben (-n für ohne\n"
+" Newline)\n"
+
+#: help.c:232
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr ""
+" \\warn [-n] [TEXT] Text auf Standardfehlerausgabe schreiben (-n für ohne\n"
+" Newline)\n"
+
+#: help.c:235
+msgid "Conditional\n"
+msgstr "Bedingte Anweisungen\n"
+
+#: help.c:236
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if AUSDRUCK Beginn einer bedingten Anweisung\n"
+
+#: help.c:237
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif AUSDRUCK Alternative in aktueller bedingter Anweisung\n"
+
+#: help.c:238
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else letzte Alternative in aktueller bedingter Anweisung\n"
+
+#: help.c:239
+msgid " \\endif end conditional block\n"
+msgstr " \\endif Ende einer bedingten Anweisung\n"
+
+#: help.c:242
+msgid "Informational\n"
+msgstr "Informationen\n"
+
+#: help.c:243
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (Optionen: S = Systemobjekte zeigen, + = zusätzliche Details zeigen)\n"
+
+#: help.c:244
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] Tabellen, Sichten und Sequenzen auflisten\n"
+
+#: help.c:245
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NAME Tabelle, Sicht, Sequenz oder Index beschreiben\n"
+
+#: help.c:246
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [MUSTER] Aggregatfunktionen auflisten\n"
+
+#: help.c:247
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [MUSTER] Zugriffsmethoden auflisten\n"
+
+#: help.c:248
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMMUST [TYPMUST]] Operatorklassen auflisten\n"
+
+#: help.c:249
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMMUST [TYPMUST]] Operatorfamilien auflisten\n"
+
+#: help.c:250
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMMUST [OPFMUST]] Operatoren in Operatorfamilien auflisten\n"
+
+#: help.c:251
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMMUST [OPFMUST]] Unterst.funktionen in Operatorfamilien auflisten\n"
+
+#: help.c:252
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [MUSTER] Tablespaces auflisten\n"
+
+#: help.c:253
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [MUSTER] Konversionen auflisten\n"
+
+#: help.c:254
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [MUSTER] Konfigurationsparameter auflisten\n"
+
+#: help.c:255
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [MUSTER] Typumwandlungen (Casts) auflisten\n"
+
+#: help.c:256
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr ""
+" \\dd[S] [MUSTER] Objektbeschreibungen zeigen, die nirgendwo anders\n"
+" erscheinen\n"
+
+#: help.c:257
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [MUSTER] Domänen auflisten\n"
+
+#: help.c:258
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [MUSTER] Vorgabeprivilegien auflisten\n"
+
+#: help.c:259
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [MUSTER] Fremdtabellen auflisten\n"
+
+#: help.c:260
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [MUSTER] Fremdserver auflisten\n"
+
+#: help.c:261
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [MUSTER] Fremdtabellen auflisten\n"
+
+#: help.c:262
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [MUSTER] Benutzerabbildungen auflisten\n"
+
+#: help.c:263
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [MUSTER] Fremddaten-Wrapper auflisten\n"
+
+#: help.c:264
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNKMUSTR [TYPMUSTR ...]]\n"
+" Funktionen [nur Agg/normale/Proz/Trigger/Fenster] auflisten\n"
+
+#: help.c:266
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [MUSTER] Textsuchekonfigurationen auflisten\n"
+
+#: help.c:267
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [MUSTER] Textsuchewörterbücher auflisten\n"
+
+#: help.c:268
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [MUSTER] Textsucheparser auflisten\n"
+
+#: help.c:269
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [MUSTER] Textsuchevorlagen auflisten\n"
+
+#: help.c:270
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [MUSTER] Rollen auflisten\n"
+
+#: help.c:271
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [MUSTER] Indexe auflisten\n"
+
+#: help.c:272
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] Large Objects auflisten, wie \\lo_list\n"
+
+#: help.c:273
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [MUSTER] prozedurale Sprachen auflisten\n"
+
+#: help.c:274
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [MUSTER] materialisierte Sichten auflisten\n"
+
+#: help.c:275
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [MUSTER] Schemas auflisten\n"
+
+#: help.c:276
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPMUST [TYPMUST [TYPMUST]]]\n"
+" Operatoren auflisten\n"
+
+#: help.c:278
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [MUSTER] Sortierfolgen auflisten\n"
+
+#: help.c:279
+msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr ""
+" \\dp [MUSTER] Zugriffsprivilegien für Tabellen, Sichten und\n"
+" Sequenzen auflisten\n"
+
+#: help.c:280
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr ""
+" \\dP[itn+] [MUSTER] partitionierte Relationen [nur Indexe/Tabellen]\n"
+" auflisten [n=geschachtelt]\n"
+
+#: help.c:281
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr " \\drds [ROLLMUST [DBMUST]] datenbankspezifische Rolleneinstellungen auflisten\n"
+
+#: help.c:282
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [MUSTER] Replikationspublikationen auflisten\n"
+
+#: help.c:283
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [MUSTER] Replikationssubskriptionen auflisten\n"
+
+#: help.c:284
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [MUSTER] Sequenzen auflisten\n"
+
+#: help.c:285
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [MUSTER] Tabellen auflisten\n"
+
+#: help.c:286
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [MUSTER] Datentypen auflisten\n"
+
+#: help.c:287
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [MUSTER] Rollen auflisten\n"
+
+#: help.c:288
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [MUSTER] Sichten auflisten\n"
+
+#: help.c:289
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [MUSTER] Erweiterungen auflisten\n"
+
+#: help.c:290
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [MUSTER] erweiterte Statistiken auflisten\n"
+
+#: help.c:291
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [MUSTER] Ereignistrigger auflisten\n"
+
+#: help.c:292
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [MUSTER] Datenbanken auflisten\n"
+
+#: help.c:293
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNKNAME Funktionsdefinition zeigen\n"
+
+#: help.c:294
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] SICHTNAME Sichtdefinition zeigen\n"
+
+#: help.c:295
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [MUSTER] äquivalent zu \\dp\n"
+
+#: help.c:298
+msgid "Large Objects\n"
+msgstr "Large Objects\n"
+
+#: help.c:299
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr ""
+" \\lo_export LOBOID DATEI\n"
+" Large Object in Datei schreiben\n"
+
+#: help.c:300
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import DATEI [KOMMENTAR]\n"
+" Large Object aus Datei lesen\n"
+
+#: help.c:302
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] Large Objects auflisten\n"
+
+#: help.c:303
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID Large Object löschen\n"
+
+#: help.c:306
+msgid "Formatting\n"
+msgstr "Formatierung\n"
+
+#: help.c:307
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr ""
+" \\a zwischen unausgerichtetem und ausgerichtetem Ausgabemodus\n"
+" umschalten\n"
+
+#: help.c:308
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [TEXT] Tabellentitel setzen oder löschen\n"
+
+#: help.c:309
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [ZEICHEN] Feldtrennzeichen zeigen oder setzen\n"
+
+#: help.c:310
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H HTML-Ausgabemodus umschalten (gegenwärtig %s)\n"
+
+#: help.c:312
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NAME [WERT]] Tabellenausgabeoption setzen\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:319
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] nur Datenzeilen zeigen (gegenwärtig %s)\n"
+
+#: help.c:321
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [TEXT] HTML <table>-Tag-Attribute setzen oder löschen\n"
+
+#: help.c:322
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] erweiterte Ausgabe umschalten (gegenwärtig %s)\n"
+
+#: help.c:323
+msgid "auto"
+msgstr "auto"
+
+#: help.c:326
+msgid "Connection\n"
+msgstr "Verbindung\n"
+
+#: help.c:328
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- BENUTZER|- HOST|- PORT|-] | conninfo}\n"
+" mit neuer Datenbank verbinden (aktuell »%s«)\n"
+
+#: help.c:332
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- BENUTZER|- HOST|- PORT|-] | conninfo}\n"
+" mit neuer Datenbank verbinden (aktuell keine Verbindung)\n"
+
+#: help.c:334
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo Informationen über aktuelle Verbindung anzeigen\n"
+
+#: help.c:335
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [KODIERUNG] Client-Kodierung zeigen oder setzen\n"
+
+#: help.c:336
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr ""
+" \\password [BENUTZERNAME]\n"
+" sicheres Ändern eines Benutzerpasswortes\n"
+
+#: help.c:339
+msgid "Operating System\n"
+msgstr "Betriebssystem\n"
+
+#: help.c:340
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [VERZ] Arbeitsverzeichnis wechseln\n"
+
+#: help.c:341
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR Umgebungsvariable auslesen\n"
+
+#: help.c:342
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAME [WERT] Umgebungsvariable setzen oder löschen\n"
+
+#: help.c:343
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] Zeitmessung umschalten (gegenwärtig %s)\n"
+
+#: help.c:345
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [BEFEHL] Befehl in Shell ausführen oder interaktive Shell starten\n"
+
+#: help.c:348
+msgid "Variables\n"
+msgstr "Variablen\n"
+
+#: help.c:349
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TEXT] NAME interne Variable vom Benutzer abfragen\n"
+
+#: help.c:350
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [NAME [WERT]] interne Variable setzen, oder alle anzeigen\n"
+
+#: help.c:351
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NAME interne Variable löschen\n"
+
+#: help.c:390
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"Liste besonderer Variablen\n"
+"\n"
+
+#: help.c:392
+msgid "psql variables:\n"
+msgstr "psql-Variablen:\n"
+
+#: help.c:394
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAME=WERT\n"
+" oder \\set NAME WERT innerhalb von psql\n"
+"\n"
+
+#: help.c:396
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" wenn gesetzt werden alle erfolgreichen SQL-Befehle automatisch committet\n"
+
+#: help.c:398
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" bestimmt, ob SQL-Schlüsselwörter in Groß- oder Kleinschreibung\n"
+" vervollständigt werden [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:401
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" Name der aktuellen Datenbank\n"
+
+#: help.c:403
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" kontrolliert, welche Eingaben auf die Standardausgabe geschrieben werden\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:406
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" wenn gesetzt, interne Anfragen, die von Backslash-Befehlen ausgeführt werden,\n"
+" anzeigen; wenn auf »noexec« gesetzt, nur anzeigen, nicht ausführen\n"
+
+#: help.c:409
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" aktuelle Zeichensatzkodierung des Clients\n"
+
+#: help.c:411
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr ""
+" ERROR\n"
+" »true« wenn die letzte Anfrage fehlgeschlagen ist, sonst »false«\n"
+
+#: help.c:413
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" Anzahl auf einmal zu holender und anzuzeigender Zeilen (0 = unbegrenzt)\n"
+
+#: help.c:415
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" wenn gesetzt werden Tabellenzugriffsmethoden nicht angezeigt\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" wenn gesetzt werden Kompressionsmethoden nicht angezeigt\n"
+
+#: help.c:419
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" kontrolliert Befehlsgeschichte [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:421
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" Dateiname für die Befehlsgeschichte\n"
+
+#: help.c:423
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" maximale Anzahl der in der Befehlsgeschichte zu speichernden Befehle\n"
+
+#: help.c:425
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" der aktuell verbundene Datenbankserverhost\n"
+
+#: help.c:427
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" Anzahl benötigter EOFs um eine interaktive Sitzung zu beenden\n"
+
+#: help.c:429
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" Wert der zuletzt beinträchtigten OID\n"
+
+#: help.c:431
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" Fehlermeldung und SQLSTATE des letzten Fehlers, oder leer und »000000« wenn\n"
+" kein Fehler\n"
+
+#: help.c:434
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" wenn gesetzt beendet ein Fehler die Transaktion nicht (verwendet implizite\n"
+" Sicherungspunkte)\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" Skriptausführung bei Fehler beenden\n"
+
+#: help.c:438
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" Serverport der aktuellen Verbindung\n"
+
+#: help.c:440
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" der normale psql-Prompt\n"
+
+#: help.c:442
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" der Prompt, wenn eine Anweisung von der vorherigen Zeile fortgesetzt wird\n"
+
+#: help.c:444
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" der Prompt während COPY ... FROM STDIN\n"
+
+#: help.c:446
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" stille Ausführung (wie Option -q)\n"
+
+#: help.c:448
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" Anzahl der von der letzten Anfrage beeinträchtigten Zeilen, oder 0\n"
+
+#: help.c:450
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" Serverversion (kurze Zeichenkette oder numerisches Format)\n"
+
+#: help.c:453
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" alle Ergebnisse einer kombinierten Anfrage (\\;) anzeigen statt nur das letzte\n"
+
+#: help.c:455
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" kontrolliert die Anzeige von Kontextinformationen in Meldungen\n"
+" [never, errors, always]\n"
+
+#: help.c:457
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" wenn gesetzt beendet Zeilenende die SQL-Anweisung (wie Option -S)\n"
+
+#: help.c:459
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" Einzelschrittmodus (wie Option -s)\n"
+
+#: help.c:461
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" SQLSTATE der letzten Anfrage, oder »00000« wenn kein Fehler\n"
+
+#: help.c:463
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" der aktuell verbundene Datenbankbenutzer\n"
+
+#: help.c:465
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" kontrolliert wieviele Details in Fehlermeldungen enthalten sind\n"
+" [default, verbose, terse, sqlstate]\n"
+
+#: help.c:467
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" Version von psql (lange Zeichenkette, kurze Zeichenkette oder numerisch)\n"
+
+#: help.c:472
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Anzeigeeinstellungen:\n"
+
+#: help.c:474
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NAME[=WERT]\n"
+" oder \\pset NAME [WERT] innerhalb von psql\n"
+"\n"
+
+#: help.c:476
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" Rahmenstil (Zahl)\n"
+
+#: help.c:478
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" Zielbreite für das Format »wrapped«\n"
+
+#: help.c:480
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (oder x)\n"
+" erweiterte Ausgabe [on, off, auto]\n"
+
+#: help.c:482
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" Feldtrennzeichen für unausgerichteten Ausgabemodus (Standard »%s«)\n"
+
+#: help.c:485
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" Feldtrennzeichen für unausgerichteten Ausgabemodus auf Null-Byte setzen\n"
+
+#: help.c:487
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" Tabellenfußzeile ein- oder auschalten [on, off]\n"
+
+#: help.c:489
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" Ausgabeformat setzen [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:491
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" Rahmenlinienstil setzen [ascii, old-ascii, unicode]\n"
+
+#: help.c:493
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" setzt die Zeichenkette, die anstelle eines NULL-Wertes ausgegeben wird\n"
+
+#: help.c:495
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" Verwendung eines Locale-spezifischen Zeichens zur Trennung von Zifferngruppen\n"
+" einschalten [on, off]\n"
+
+#: help.c:497
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" kontrolliert Verwendung eines externen Pager-Programms [yes, no, always]\n"
+
+#: help.c:499
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" Satztrennzeichen für unausgerichteten Ausgabemodus\n"
+
+#: help.c:501
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" Satztrennzeichen für unausgerichteten Ausgabemodus auf Null-Byte setzen\n"
+
+#: help.c:503
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (or T)\n"
+" Attribute für das »table«-Tag im Format »html« oder proportionale\n"
+" Spaltenbreite für links ausgerichtete Datentypen im Format »latex-longtable«\n"
+
+#: help.c:506
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" setzt den Titel darauffolgend ausgegebener Tabellen\n"
+
+#: help.c:508
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" wenn gesetzt werden nur die eigentlichen Tabellendaten gezeigt\n"
+
+#: help.c:510
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" setzt den Stil für Unicode-Linien [single, double]\n"
+
+#: help.c:515
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Umgebungsvariablen:\n"
+
+#: help.c:519
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NAME=WERT [NAME=WERT] psql ...\n"
+" oder \\setenv NAME [WERT] innerhalb von psql\n"
+"\n"
+
+#: help.c:521
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NAME=WERT\n"
+" psql ...\n"
+" oder \\setenv NAME [WERT] innerhalb von psql\n"
+"\n"
+
+#: help.c:524
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" Anzahl Spalten im Format »wrapped«\n"
+
+#: help.c:526
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" wie Verbindungsparameter »application_name«\n"
+
+#: help.c:528
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" wie Verbindungsparameter »dbname«\n"
+
+#: help.c:530
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" wie Verbindungsparameter »host«\n"
+
+#: help.c:532
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" Name der Passwortdatei\n"
+
+#: help.c:534
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" Verbindungspasswort (nicht empfohlen)\n"
+
+#: help.c:536
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" wie Verbindungsparameter »port«\n"
+
+#: help.c:538
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" wie Verbindungsparameter »user«\n"
+
+#: help.c:540
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" Editor für Befehle \\e, \\ef und \\ev\n"
+
+#: help.c:542
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" wie die Zeilennummer beim Aufruf des Editors angegeben wird\n"
+
+#: help.c:544
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" alternativer Pfad für History-Datei\n"
+
+#: help.c:546
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" Name des externen Pager-Programms\n"
+
+#: help.c:549
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" Name des externen Pager-Programms für \\watch\n"
+
+#: help.c:552
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" alternativer Pfad für .psqlrc-Datei des Benutzers\n"
+
+#: help.c:554
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" Shell für den Befehl \\!\n"
+
+#: help.c:556
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" Verzeichnis für temporäre Dateien\n"
+
+#: help.c:616
+msgid "Available help:\n"
+msgstr "Verfügbare Hilfe:\n"
+
+#: help.c:711
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Anweisung: %s\n"
+"Beschreibung: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:734
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Keine Hilfe verfügbar für »%s«.\n"
+"Versuchen Sie \\h ohne Argumente, um die verfügbare Hilfe zu sehen.\n"
+
+#: input.c:217
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "konnte nicht aus Eingabedatei lesen: %m"
+
+#: input.c:478 input.c:516
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "konnte Befehlsgeschichte nicht in Datei »%s« speichern: %m"
+
+#: input.c:535
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "Befehlsgeschichte wird von dieser Installation nicht unterstützt"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: nicht mit einer Datenbank verbunden"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: aktuelle Transaktion ist abgebrochen"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: unbekannter Transaktionsstatus"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: abgebrochen"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Verwenden Sie »\\q«, um %s zu verlassen.\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"Die Eingabe ist ein PostgreSQL-Dump im Custom-Format.\n"
+"Verwenden Sie den Kommandozeilen-Client pg_restore, um diesen Dump in die\n"
+"Datenbank zurückzuspielen.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Verwenden Sie \\? für Hilfe oder drücken Sie Strg-C um den Eingabepuffer zu löschen."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "Verwenden Sie \\? für Hilfe."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Dies ist psql, die Kommandozeilenschnittstelle für PostgreSQL."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Geben Sie ein: \\copyright für Urheberrechtsinformationen\n"
+" \\h für Hilfe über SQL-Anweisungen\n"
+" \\? für Hilfe über interne Anweisungen\n"
+" \\g oder Semikolon, um eine Anfrage auszuführen\n"
+" \\q um zu beenden\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "Verwenden Sie \\q zum beenden."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "Verwenden Sie Strg-D zum beenden."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "Verwenden Sie Strg-C zum beenden."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "Anfrage ignoriert; verwenden Sie \\endif oder Strg-C um den aktuellen \\if-Block zu beenden"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "Dateiende erreicht, aber schließendes \\endif fehlt"
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "Zeichenkette in Anführungszeichen nicht abgeschlossen"
+
+#: psqlscanslash.l:811
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: Speicher aufgebraucht"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1996
+#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154
+#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228
+#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431
+#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517
+#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594
+#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730
+#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071
+#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171
+#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259
+#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338
+#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396
+#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428
+#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464
+#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499
+#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537
+#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574
+#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606
+#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638
+#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680
+#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030
+#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687
+#: sql_help.c:4735 sql_help.c:4893
+msgid "name"
+msgstr "Name"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846
+#: sql_help.c:3339 sql_help.c:4455
+msgid "aggregate_signature"
+msgstr "Aggregatsignatur"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "neuer_Name"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3011
+msgid "new_owner"
+msgstr "neuer_Eigentümer"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "neues_Schema"
+
+#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484
+msgid "where aggregate_signature is:"
+msgstr "wobei Aggregatsignatur Folgendes ist:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911
+#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085
+#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341
+#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527
+#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461
+#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488
+#: sql_help.c:4491
+msgid "argmode"
+msgstr "Argmodus"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912
+#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2067 sql_help.c:2086
+#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342
+#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528
+#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475
+#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492
+msgid "argname"
+msgstr "Argname"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2388 sql_help.c:2597
+#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440
+#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470
+#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493
+msgid "argtype"
+msgstr "Argtyp"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974
+#: sql_help.c:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343
+#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040
+#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742
+#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956
+msgid "option"
+msgstr "Option"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433
+#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388
+msgid "where option can be:"
+msgstr "wobei Option Folgendes sein kann:"
+
+#: sql_help.c:116 sql_help.c:2209
+msgid "allowconn"
+msgstr "allowconn"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210
+#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227
+msgid "connlimit"
+msgstr "Verbindungslimit"
+
+#: sql_help.c:118 sql_help.c:2211
+msgid "istemplate"
+msgstr "istemplate"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4187
+msgid "new_tablespace"
+msgstr "neuer_Tablespace"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2398 sql_help.c:2601
+#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675
+msgid "configuration_parameter"
+msgstr "Konfigurationsparameter"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344
+#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467
+#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626
+#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915
+#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014
+#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676
+#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679
+msgid "value"
+msgstr "Wert"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "Zielrolle"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631
+#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889
+#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338
+#: sql_help.c:4357 sql_help.c:4369
+msgid "schema_name"
+msgstr "Schemaname"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "abgekürztes_Grant_oder_Revoke"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "wobei abgekürztes_Grant_oder_Revoke Folgendes sein kann:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2437 sql_help.c:2438
+#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575
+#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667
+#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232
+#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933
+#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697
+msgid "role_name"
+msgstr "Rollenname"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352
+#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774
+#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924
+#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981
+#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088
+#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558
+#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608
+#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651
+#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806
+#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864
+#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921
+#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044
+#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102
+#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105
+msgid "expression"
+msgstr "Ausdruck"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "Domänen-Constraint"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852
+#: sql_help.c:1854 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351
+#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993
+msgid "constraint_name"
+msgstr "Constraint-Name"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "neuer_Constraint-Name"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "neue_Version"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "Elementobjekt"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "wobei Elementobjekt Folgendes ist:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856
+#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860
+#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869
+#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884
+#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894
+#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898
+#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902
+#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4451 sql_help.c:4456
+#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465
+#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477
+#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481
+#: sql_help.c:4482
+msgid "object_name"
+msgstr "Objektname"
+
+#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454
+msgid "aggregate_name"
+msgstr "Aggregatname"
+
+#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135
+#: sql_help.c:2137 sql_help.c:3357
+msgid "source_type"
+msgstr "Quelltyp"
+
+#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136
+#: sql_help.c:2138 sql_help.c:3358
+msgid "target_type"
+msgstr "Zieltyp"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133
+#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549
+#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577
+#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834
+#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072
+#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083
+msgid "function_name"
+msgstr "Funktionsname"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542
+msgid "operator_name"
+msgstr "Operatorname"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871
+#: sql_help.c:2519 sql_help.c:3481
+msgid "left_type"
+msgstr "linker_Typ"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872
+#: sql_help.c:2520 sql_help.c:3482
+msgid "right_type"
+msgstr "rechter_Typ"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2539
+#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500
+msgid "index_method"
+msgstr "Indexmethode"
+
+#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467
+msgid "procedure_name"
+msgstr "Prozedurname"
+
+#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473
+msgid "routine_name"
+msgstr "Routinenname"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394
+#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662
+#: sql_help.c:3926 sql_help.c:4375
+msgid "type_name"
+msgstr "Typname"
+
+#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599
+#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911
+#: sql_help.c:4360
+msgid "lang_name"
+msgstr "Sprachname"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "und Aggregatsignatur Folgendes ist:"
+
+#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275
+msgid "handler_function"
+msgstr "Handler-Funktion"
+
+#: sql_help.c:396 sql_help.c:2276
+msgid "validator_function"
+msgstr "Validator-Funktion"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "Aktion"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851
+#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1983 sql_help.c:1984
+#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391
+#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629
+#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887
+#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919
+#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955
+#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978
+#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883
+#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997
+#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089
+#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614
+#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877
+#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924
+#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117
+msgid "column_name"
+msgstr "Spaltenname"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "neuer_Spaltenname"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "wobei Aktion Folgendes sein kann:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2229
+#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888
+#: sql_help.c:3167 sql_help.c:4141
+msgid "data_type"
+msgstr "Datentyp"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2230 sql_help.c:2329
+#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911
+#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990
+msgid "collation"
+msgstr "Sortierfolge"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339
+#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920
+msgid "column_constraint"
+msgstr "Spalten-Constraint"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968
+msgid "integer"
+msgstr "ganze_Zahl"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "Attributoption"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340
+#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921
+msgid "table_constraint"
+msgstr "Tabellen-Constraint"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905
+msgid "trigger_name"
+msgstr "Triggername"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918
+msgid "parent_table"
+msgstr "Elterntabelle"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2261
+msgid "extension_name"
+msgstr "Erweiterungsname"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395
+msgid "execution_cost"
+msgstr "Ausführungskosten"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396
+msgid "result_rows"
+msgstr "Ergebniszeilen"
+
+#: sql_help.c:547 sql_help.c:2397
+msgid "support_function"
+msgstr "Support-Funktion"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2709
+#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881
+#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890
+#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 sql_help.c:3896
+#: sql_help.c:3897 sql_help.c:3899 sql_help.c:3900 sql_help.c:3902
+#: sql_help.c:3903 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918
+#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924
+#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930
+#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335
+#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342
+#: sql_help.c:4343 sql_help.c:4345 sql_help.c:4346 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4351 sql_help.c:4352 sql_help.c:4358
+#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364
+#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370
+#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376
+#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380
+msgid "role_specification"
+msgstr "Rollenangabe"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198
+#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707
+msgid "user_name"
+msgstr "Benutzername"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716
+#: sql_help.c:3932 sql_help.c:4381
+msgid "where role_specification can be:"
+msgstr "wobei Rollenangabe Folgendes sein kann:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "Gruppenname"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468
+#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930
+#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923
+#: sql_help.c:4372
+msgid "tablespace_name"
+msgstr "Tablespace-Name"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783
+msgid "index_name"
+msgstr "Indexname"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2466 sql_help.c:2500
+#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969
+#: sql_help.c:2996
+msgid "storage_parameter"
+msgstr "Storage-Parameter"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "Spaltennummer"
+
+#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464
+msgid "large_object_oid"
+msgstr "Large-Object-OID"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889
+msgid "compression_method"
+msgstr "Kompressionsmethode"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "neue_Zugriffsmethode"
+
+#: sql_help.c:725 sql_help.c:2523
+msgid "res_proc"
+msgstr "Res-Funktion"
+
+#: sql_help.c:726 sql_help.c:2524
+msgid "join_proc"
+msgstr "Join-Funktion"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2541
+msgid "strategy_number"
+msgstr "Strategienummer"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2543 sql_help.c:2544
+#: sql_help.c:2547 sql_help.c:2548
+msgid "op_type"
+msgstr "Optyp"
+
+#: sql_help.c:782 sql_help.c:2545
+msgid "sort_family_name"
+msgstr "Sortierfamilienname"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2546
+msgid "support_number"
+msgstr "Unterst-Nummer"
+
+#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087
+#: sql_help.c:3089
+msgid "argument_type"
+msgstr "Argumenttyp"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779
+#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891
+#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2324
+#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574
+#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770
+#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917
+#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517
+#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885
+#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334
+#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627
+#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884
+#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060
+#: sql_help.c:5122
+msgid "table_name"
+msgstr "Tabellenname"
+
+#: sql_help.c:823 sql_help.c:2576
+msgid "using_expression"
+msgstr "Using-Ausdruck"
+
+#: sql_help.c:824 sql_help.c:2577
+msgid "check_expression"
+msgstr "Check-Ausdruck"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624
+msgid "publication_object"
+msgstr "Publikationsobjekt"
+
+#: sql_help.c:903 sql_help.c:2625
+msgid "publication_parameter"
+msgstr "Publikationsparameter"
+
+#: sql_help.c:909 sql_help.c:2627
+msgid "where publication_object is one of:"
+msgstr "wobei Publikationsobjekt Folgendes sein kann:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662
+#: sql_help.c:3228
+msgid "password"
+msgstr "Passwort"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663
+#: sql_help.c:3229
+msgid "timestamp"
+msgstr "Zeit"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3892
+#: sql_help.c:4341
+msgid "database_name"
+msgstr "Datenbankname"
+
+#: sql_help.c:1073 sql_help.c:2732
+msgid "increment"
+msgstr "Inkrement"
+
+#: sql_help.c:1074 sql_help.c:2733
+msgid "minvalue"
+msgstr "Minwert"
+
+#: sql_help.c:1075 sql_help.c:2734
+msgid "maxvalue"
+msgstr "Maxwert"
+
+#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664
+#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056
+msgid "start"
+msgstr "Start"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "Restart"
+
+#: sql_help.c:1078 sql_help.c:2736
+msgid "cache"
+msgstr "Cache"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "neues_Ziel"
+
+#: sql_help.c:1142 sql_help.c:2789
+msgid "conninfo"
+msgstr "Verbindungsinfo"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790
+msgid "publication_name"
+msgstr "Publikationsname"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "Publikationsoption"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "Refresh-Option"
+
+#: sql_help.c:1161 sql_help.c:2791
+msgid "subscription_parameter"
+msgstr "Subskriptionsparameter"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "Skip-Option"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "Partitionsname"
+
+#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922
+msgid "partition_bound_spec"
+msgstr "Partitionsbegrenzungsangabe"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936
+msgid "sequence_options"
+msgstr "Sequenzoptionen"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "Sequenzoption"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "Tabellen-Constraint-für-Index"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "Regelname"
+
+#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961
+msgid "and partition_bound_spec is:"
+msgstr "und Partitionsbegrenzungsangabe Folgendes ist:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354
+#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963
+#: sql_help.c:2964
+msgid "partition_bound_expr"
+msgstr "Partitionsbegrenzungsausdruck"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358
+#: sql_help.c:2965 sql_help.c:2966
+msgid "numeric_literal"
+msgstr "numerische_Konstante"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "und Spalten-Constraint Folgendes ist:"
+
+#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598
+#: sql_help.c:2934
+msgid "default_expr"
+msgstr "Vorgabeausdruck"
+
+#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935
+msgid "generation_expr"
+msgstr "Generierungsausdruck"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947
+#: sql_help.c:2949 sql_help.c:2953
+msgid "index_parameters"
+msgstr "Indexparameter"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956
+msgid "reftable"
+msgstr "Reftabelle"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957
+msgid "refcolumn"
+msgstr "Refspalte"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959
+msgid "referential_action"
+msgstr "Fremdschlüsselaktion"
+
+#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943
+msgid "and table_constraint is:"
+msgstr "und Tabellen-Constraint Folgendes ist:"
+
+#: sql_help.c:1409 sql_help.c:2951
+msgid "exclude_element"
+msgstr "Exclude-Element"
+
+#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662
+#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054
+msgid "operator"
+msgstr "Operator"
+
+#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954
+msgid "predicate"
+msgstr "Prädikat"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "und Tabellen-Constraint-für-Index Folgendes ist:"
+
+#: sql_help.c:1421 sql_help.c:2967
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "Indexparameter bei UNIQUE-, PRIMARY KEY- und EXCLUDE-Constraints sind:"
+
+#: sql_help.c:1426 sql_help.c:2972
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "Exclude-Element in einem EXCLUDE-Constraint ist:"
+
+#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912
+#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991
+msgid "opclass"
+msgstr "Opklasse"
+
+#: sql_help.c:1430 sql_help.c:2976
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "Fremdschlüsselaktion in FOREIGN KEY/REFERENCES ist:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013
+msgid "tablespace_option"
+msgstr "Tablespace-Option"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "Tokentyp"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "Wörterbuchname"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "altes_Wörterbuch"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "neues_Wörterbuch"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3166
+msgid "attribute_name"
+msgstr "Attributname"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "neuer_Attributname"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "neuer_Enum-Wert"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "Nachbar-Enum-Wert"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "existierender_Enum-Wert"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "Eigenschaft"
+
+#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748
+#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947
+#: sql_help.c:4350
+msgid "server_name"
+msgstr "Servername"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261
+msgid "view_option_name"
+msgstr "Sichtoptionsname"
+
+#: sql_help.c:1698 sql_help.c:3262
+msgid "view_option_value"
+msgstr "Sichtoptionswert"
+
+#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958
+msgid "table_and_columns"
+msgstr "Tabelle-und-Spalten"
+
+#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745
+#: sql_help.c:4185 sql_help.c:4959
+msgid "where option can be one of:"
+msgstr "wobei Option eine der folgenden sein kann:"
+
+#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977
+#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747
+#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188
+#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963
+#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967
+msgid "boolean"
+msgstr "boolean"
+
+#: sql_help.c:1724 sql_help.c:4969
+msgid "and table_and_columns is:"
+msgstr "und Tabelle-und-Spalten Folgendes ist:"
+
+#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749
+msgid "transaction_mode"
+msgstr "Transaktionsmodus"
+
+#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750
+msgid "where transaction_mode is one of:"
+msgstr "wobei Transaktionsmodus Folgendes sein kann:"
+
+#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582
+#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835
+#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064
+#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084
+msgid "argument"
+msgstr "Argument"
+
+#: sql_help.c:1850
+msgid "relation_name"
+msgstr "Relationsname"
+
+#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344
+msgid "domain_name"
+msgstr "Domänenname"
+
+#: sql_help.c:1877
+msgid "policy_name"
+msgstr "Policy-Name"
+
+#: sql_help.c:1890
+msgid "rule_name"
+msgstr "Regelname"
+
+#: sql_help.c:1909 sql_help.c:4483
+msgid "string_literal"
+msgstr "Zeichenkettenkonstante"
+
+#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397
+msgid "transaction_id"
+msgstr "Transaktions-ID"
+
+#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017
+msgid "filename"
+msgstr "Dateiname"
+
+#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688
+#: sql_help.c:2689
+msgid "command"
+msgstr "Befehl"
+
+#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297
+#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552
+#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809
+#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049
+msgid "condition"
+msgstr "Bedingung"
+
+#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263
+#: sql_help.c:3281 sql_help.c:3982
+msgid "query"
+msgstr "Anfrage"
+
+#: sql_help.c:1976
+msgid "format_name"
+msgstr "Formatname"
+
+#: sql_help.c:1978
+msgid "delimiter_character"
+msgstr "Trennzeichen"
+
+#: sql_help.c:1979
+msgid "null_string"
+msgstr "Null-Zeichenkette"
+
+#: sql_help.c:1981
+msgid "quote_character"
+msgstr "Quote-Zeichen"
+
+#: sql_help.c:1982
+msgid "escape_character"
+msgstr "Escape-Zeichen"
+
+#: sql_help.c:1986
+msgid "encoding_name"
+msgstr "Kodierungsname"
+
+#: sql_help.c:1997
+msgid "access_method_type"
+msgstr "Zugriffsmethodentyp"
+
+#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090
+msgid "arg_data_type"
+msgstr "Arg-Datentyp"
+
+#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099
+msgid "sfunc"
+msgstr "Übergangsfunktion"
+
+#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100
+msgid "state_data_type"
+msgstr "Zustandsdatentyp"
+
+#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101
+msgid "state_data_size"
+msgstr "Zustandsdatengröße"
+
+#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102
+msgid "ffunc"
+msgstr "Abschlussfunktion"
+
+#: sql_help.c:2073 sql_help.c:2103
+msgid "combinefunc"
+msgstr "Combine-Funktion"
+
+#: sql_help.c:2074 sql_help.c:2104
+msgid "serialfunc"
+msgstr "Serialisierungsfunktion"
+
+#: sql_help.c:2075 sql_help.c:2105
+msgid "deserialfunc"
+msgstr "Deserialisierungsfunktion"
+
+#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106
+msgid "initial_condition"
+msgstr "Anfangswert"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "msfunc"
+msgstr "Moving-Übergangsfunktion"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "minvfunc"
+msgstr "Moving-Inversfunktion"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "mstate_data_type"
+msgstr "Moving-Zustandsdatentyp"
+
+#: sql_help.c:2080 sql_help.c:2110
+msgid "mstate_data_size"
+msgstr "Moving-Zustandsdatengröße"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "mffunc"
+msgstr "Moving-Abschlussfunktion"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minitial_condition"
+msgstr "Moving-Anfangswert"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "sort_operator"
+msgstr "Sortieroperator"
+
+#: sql_help.c:2096
+msgid "or the old syntax"
+msgstr "oder die alte Syntax"
+
+#: sql_help.c:2098
+msgid "base_type"
+msgstr "Basistyp"
+
+#: sql_help.c:2155 sql_help.c:2202
+msgid "locale"
+msgstr "Locale"
+
+#: sql_help.c:2156 sql_help.c:2203
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2157 sql_help.c:2204
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2158 sql_help.c:4450
+msgid "provider"
+msgstr "Provider"
+
+#: sql_help.c:2160 sql_help.c:2263
+msgid "version"
+msgstr "Version"
+
+#: sql_help.c:2162
+msgid "existing_collation"
+msgstr "existierende_Sortierfolge"
+
+#: sql_help.c:2172
+msgid "source_encoding"
+msgstr "Quellkodierung"
+
+#: sql_help.c:2173
+msgid "dest_encoding"
+msgstr "Zielkodierung"
+
+#: sql_help.c:2199 sql_help.c:3039
+msgid "template"
+msgstr "Vorlage"
+
+#: sql_help.c:2200
+msgid "encoding"
+msgstr "Kodierung"
+
+#: sql_help.c:2201
+msgid "strategy"
+msgstr "Strategie"
+
+#: sql_help.c:2205
+msgid "icu_locale"
+msgstr "ICU-Locale"
+
+#: sql_help.c:2206
+msgid "locale_provider"
+msgstr "Locale-Provider"
+
+#: sql_help.c:2207
+msgid "collation_version"
+msgstr "Sortierfolgenversion"
+
+#: sql_help.c:2212
+msgid "oid"
+msgstr "OID"
+
+#: sql_help.c:2232
+msgid "constraint"
+msgstr "Constraint"
+
+#: sql_help.c:2233
+msgid "where constraint is:"
+msgstr "wobei Constraint Folgendes ist:"
+
+#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112
+msgid "event"
+msgstr "Ereignis"
+
+#: sql_help.c:2248
+msgid "filter_variable"
+msgstr "Filtervariable"
+
+#: sql_help.c:2249
+msgid "filter_value"
+msgstr "Filterwert"
+
+#: sql_help.c:2345 sql_help.c:2931
+msgid "where column_constraint is:"
+msgstr "wobei Spalten-Constraint Folgendes ist:"
+
+#: sql_help.c:2390
+msgid "rettype"
+msgstr "Rückgabetyp"
+
+#: sql_help.c:2392
+msgid "column_type"
+msgstr "Spaltentyp"
+
+#: sql_help.c:2401 sql_help.c:2604
+msgid "definition"
+msgstr "Definition"
+
+#: sql_help.c:2402 sql_help.c:2605
+msgid "obj_file"
+msgstr "Objektdatei"
+
+#: sql_help.c:2403 sql_help.c:2606
+msgid "link_symbol"
+msgstr "Linksymbol"
+
+#: sql_help.c:2404 sql_help.c:2607
+msgid "sql_body"
+msgstr "SQL-Rumpf"
+
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "uid"
+msgstr "Uid"
+
+#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913
+#: sql_help.c:2927 sql_help.c:2995
+msgid "method"
+msgstr "Methode"
+
+#: sql_help.c:2463
+msgid "opclass_parameter"
+msgstr "Opklassen-Parameter"
+
+#: sql_help.c:2480
+msgid "call_handler"
+msgstr "Handler"
+
+#: sql_help.c:2481
+msgid "inline_handler"
+msgstr "Inline-Handler"
+
+#: sql_help.c:2482
+msgid "valfunction"
+msgstr "Valfunktion"
+
+#: sql_help.c:2521
+msgid "com_op"
+msgstr "Kommutator-Op"
+
+#: sql_help.c:2522
+msgid "neg_op"
+msgstr "Umkehrungs-Op"
+
+#: sql_help.c:2540
+msgid "family_name"
+msgstr "Familienname"
+
+#: sql_help.c:2551
+msgid "storage_type"
+msgstr "Storage-Typ"
+
+#: sql_help.c:2690 sql_help.c:3119
+msgid "where event can be one of:"
+msgstr "wobei Ereignis eins der folgenden sein kann:"
+
+#: sql_help.c:2710 sql_help.c:2712
+msgid "schema_element"
+msgstr "Schemaelement"
+
+#: sql_help.c:2749
+msgid "server_type"
+msgstr "Servertyp"
+
+#: sql_help.c:2750
+msgid "server_version"
+msgstr "Serverversion"
+
+#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347
+msgid "fdw_name"
+msgstr "FDW-Name"
+
+#: sql_help.c:2768 sql_help.c:2771
+msgid "statistics_name"
+msgstr "Statistikname"
+
+#: sql_help.c:2772
+msgid "statistics_kind"
+msgstr "Statistikart"
+
+#: sql_help.c:2788
+msgid "subscription_name"
+msgstr "Subskriptionsname"
+
+#: sql_help.c:2893
+msgid "source_table"
+msgstr "Quelltabelle"
+
+#: sql_help.c:2894
+msgid "like_option"
+msgstr "Like-Option"
+
+#: sql_help.c:2960
+msgid "and like_option is:"
+msgstr "und Like-Option Folgendes ist:"
+
+#: sql_help.c:3012
+msgid "directory"
+msgstr "Verzeichnis"
+
+#: sql_help.c:3026
+msgid "parser_name"
+msgstr "Parser-Name"
+
+#: sql_help.c:3027
+msgid "source_config"
+msgstr "Quellkonfig"
+
+#: sql_help.c:3056
+msgid "start_function"
+msgstr "Startfunktion"
+
+#: sql_help.c:3057
+msgid "gettoken_function"
+msgstr "Gettext-Funktion"
+
+#: sql_help.c:3058
+msgid "end_function"
+msgstr "Endfunktion"
+
+#: sql_help.c:3059
+msgid "lextypes_function"
+msgstr "Lextypenfunktion"
+
+#: sql_help.c:3060
+msgid "headline_function"
+msgstr "Headline-Funktion"
+
+#: sql_help.c:3072
+msgid "init_function"
+msgstr "Init-Funktion"
+
+#: sql_help.c:3073
+msgid "lexize_function"
+msgstr "Lexize-Funktion"
+
+#: sql_help.c:3086
+msgid "from_sql_function_name"
+msgstr "From-SQL-Funktionsname"
+
+#: sql_help.c:3088
+msgid "to_sql_function_name"
+msgstr "To-SQL-Funktionsname"
+
+#: sql_help.c:3114
+msgid "referenced_table_name"
+msgstr "verwiesener_Tabellenname"
+
+#: sql_help.c:3115
+msgid "transition_relation_name"
+msgstr "Übergangsrelationsname"
+
+#: sql_help.c:3118
+msgid "arguments"
+msgstr "Argumente"
+
+#: sql_help.c:3170
+msgid "label"
+msgstr "Label"
+
+#: sql_help.c:3172
+msgid "subtype"
+msgstr "Untertyp"
+
+#: sql_help.c:3173
+msgid "subtype_operator_class"
+msgstr "Untertyp-Operatorklasse"
+
+#: sql_help.c:3175
+msgid "canonical_function"
+msgstr "Canonical-Funktion"
+
+#: sql_help.c:3176
+msgid "subtype_diff_function"
+msgstr "Untertyp-Diff-Funktion"
+
+#: sql_help.c:3177
+msgid "multirange_type_name"
+msgstr "Multirange-Typname"
+
+#: sql_help.c:3179
+msgid "input_function"
+msgstr "Eingabefunktion"
+
+#: sql_help.c:3180
+msgid "output_function"
+msgstr "Ausgabefunktion"
+
+#: sql_help.c:3181
+msgid "receive_function"
+msgstr "Empfangsfunktion"
+
+#: sql_help.c:3182
+msgid "send_function"
+msgstr "Sendefunktion"
+
+#: sql_help.c:3183
+msgid "type_modifier_input_function"
+msgstr "Typmod-Eingabefunktion"
+
+#: sql_help.c:3184
+msgid "type_modifier_output_function"
+msgstr "Typmod-Ausgabefunktion"
+
+#: sql_help.c:3185
+msgid "analyze_function"
+msgstr "Analyze-Funktion"
+
+#: sql_help.c:3186
+msgid "subscript_function"
+msgstr "Subscript-Funktion"
+
+#: sql_help.c:3187
+msgid "internallength"
+msgstr "interne_Länge"
+
+#: sql_help.c:3188
+msgid "alignment"
+msgstr "Ausrichtung"
+
+#: sql_help.c:3189
+msgid "storage"
+msgstr "Speicherung"
+
+#: sql_help.c:3190
+msgid "like_type"
+msgstr "wie_Typ"
+
+#: sql_help.c:3191
+msgid "category"
+msgstr "Kategorie"
+
+#: sql_help.c:3192
+msgid "preferred"
+msgstr "bevorzugt"
+
+#: sql_help.c:3193
+msgid "default"
+msgstr "Vorgabewert"
+
+#: sql_help.c:3194
+msgid "element"
+msgstr "Element"
+
+#: sql_help.c:3195
+msgid "delimiter"
+msgstr "Trennzeichen"
+
+#: sql_help.c:3196
+msgid "collatable"
+msgstr "sortierbar"
+
+#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547
+#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042
+msgid "with_query"
+msgstr "With-Anfrage"
+
+#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572
+#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591
+#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836
+#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061
+#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078
+#: sql_help.c:5086
+msgid "alias"
+msgstr "Alias"
+
+#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603
+#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852
+#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860
+#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090
+#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098
+msgid "from_item"
+msgstr "From-Element"
+
+#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928
+msgid "cursor_name"
+msgstr "Cursor-Name"
+
+#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929
+msgid "output_expression"
+msgstr "Ausgabeausdruck"
+
+#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652
+#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045
+msgid "output_name"
+msgstr "Ausgabename"
+
+#: sql_help.c:3316
+msgid "code"
+msgstr "Code"
+
+#: sql_help.c:3721
+msgid "parameter"
+msgstr "Parameter"
+
+#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142
+msgid "statement"
+msgstr "Anweisung"
+
+#: sql_help.c:3778 sql_help.c:4116
+msgid "direction"
+msgstr "Richtung"
+
+#: sql_help.c:3780 sql_help.c:4118
+msgid "where direction can be one of:"
+msgstr "wobei Richtung eine der folgenden sein kann:"
+
+#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784
+#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121
+#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562
+#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819
+#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057
+msgid "count"
+msgstr "Anzahl"
+
+#: sql_help.c:3888 sql_help.c:4337
+msgid "sequence_name"
+msgstr "Sequenzname"
+
+#: sql_help.c:3906 sql_help.c:4355
+msgid "arg_name"
+msgstr "Argname"
+
+#: sql_help.c:3907 sql_help.c:4356
+msgid "arg_type"
+msgstr "Argtyp"
+
+#: sql_help.c:3914 sql_help.c:4363
+msgid "loid"
+msgstr "Large-Object-OID"
+
+#: sql_help.c:3945
+msgid "remote_schema"
+msgstr "fernes_Schema"
+
+#: sql_help.c:3948
+msgid "local_schema"
+msgstr "lokales_Schema"
+
+#: sql_help.c:3983
+msgid "conflict_target"
+msgstr "Konfliktziel"
+
+#: sql_help.c:3984
+msgid "conflict_action"
+msgstr "Konfliktaktion"
+
+#: sql_help.c:3987
+msgid "where conflict_target can be one of:"
+msgstr "wobei Konfliktziel Folgendes sein kann:"
+
+#: sql_help.c:3988
+msgid "index_column_name"
+msgstr "Indexspaltenname"
+
+#: sql_help.c:3989
+msgid "index_expression"
+msgstr "Indexausdruck"
+
+#: sql_help.c:3992
+msgid "index_predicate"
+msgstr "Indexprädikat"
+
+#: sql_help.c:3994
+msgid "and conflict_action is one of:"
+msgstr "und Konfliktaktion Folgendes sein kann:"
+
+#: sql_help.c:4000 sql_help.c:4925
+msgid "sub-SELECT"
+msgstr "Sub-SELECT"
+
+#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901
+msgid "channel"
+msgstr "Kanal"
+
+#: sql_help.c:4031
+msgid "lockmode"
+msgstr "Sperrmodus"
+
+#: sql_help.c:4032
+msgid "where lockmode is one of:"
+msgstr "wobei Sperrmodus Folgendes sein kann:"
+
+#: sql_help.c:4068
+msgid "target_table_name"
+msgstr "Zieltabellenname"
+
+#: sql_help.c:4069
+msgid "target_alias"
+msgstr "Zielalias"
+
+#: sql_help.c:4070
+msgid "data_source"
+msgstr "Datenquelle"
+
+#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091
+msgid "join_condition"
+msgstr "Verbundbedingung"
+
+#: sql_help.c:4072
+msgid "when_clause"
+msgstr "When-Klausel"
+
+#: sql_help.c:4073
+msgid "where data_source is:"
+msgstr "wobei Datenquelle Folgendes ist:"
+
+#: sql_help.c:4074
+msgid "source_table_name"
+msgstr "Quelltabellenname"
+
+#: sql_help.c:4075
+msgid "source_query"
+msgstr "Quellanfrage"
+
+#: sql_help.c:4076
+msgid "source_alias"
+msgstr "Quellalias"
+
+#: sql_help.c:4077
+msgid "and when_clause is:"
+msgstr "und When-Klausel Folgendes ist:"
+
+#: sql_help.c:4079
+msgid "merge_update"
+msgstr "Merge-Update"
+
+#: sql_help.c:4080
+msgid "merge_delete"
+msgstr "Merge-Delete"
+
+#: sql_help.c:4082
+msgid "merge_insert"
+msgstr "Merge-Insert"
+
+#: sql_help.c:4083
+msgid "and merge_insert is:"
+msgstr "und Merge-Insert Folgendes ist:"
+
+#: sql_help.c:4086
+msgid "and merge_update is:"
+msgstr "und Merge-Update Folgendes ist:"
+
+#: sql_help.c:4091
+msgid "and merge_delete is:"
+msgstr "und Merge-Delete Folgendes ist:"
+
+#: sql_help.c:4132
+msgid "payload"
+msgstr "Payload"
+
+#: sql_help.c:4159
+msgid "old_role"
+msgstr "alte_Rolle"
+
+#: sql_help.c:4160
+msgid "new_role"
+msgstr "neue_Rolle"
+
+#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413
+msgid "savepoint_name"
+msgstr "Sicherungspunktsname"
+
+#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868
+#: sql_help.c:5048 sql_help.c:5106
+msgid "grouping_element"
+msgstr "Gruppierelement"
+
+#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050
+msgid "window_name"
+msgstr "Fenstername"
+
+#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051
+msgid "window_definition"
+msgstr "Fensterdefinition"
+
+#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660
+#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052
+#: sql_help.c:5066 sql_help.c:5110
+msgid "select"
+msgstr "Select"
+
+#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059
+msgid "where from_item can be one of:"
+msgstr "wobei From-Element Folgendes sein kann:"
+
+#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580
+#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833
+#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068
+#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087
+msgid "column_alias"
+msgstr "Spaltenalias"
+
+#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063
+msgid "sampling_method"
+msgstr "Stichprobenmethode"
+
+#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065
+msgid "seed"
+msgstr "Startwert"
+
+#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870
+#: sql_help.c:5069 sql_help.c:5108
+msgid "with_query_name"
+msgstr "With-Anfragename"
+
+#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841
+#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082
+#: sql_help.c:5085
+msgid "column_definition"
+msgstr "Spaltendefinition"
+
+#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857
+#: sql_help.c:5089 sql_help.c:5095
+msgid "join_type"
+msgstr "Verbundtyp"
+
+#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092
+msgid "join_column"
+msgstr "Verbundspalte"
+
+#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093
+msgid "join_using_alias"
+msgstr "Join-Using-Alias"
+
+#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099
+msgid "and grouping_element can be one of:"
+msgstr "und Gruppierelement eins der folgenden sein kann:"
+
+#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107
+msgid "and with_query is:"
+msgstr "und With-Anfrage ist:"
+
+#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111
+msgid "values"
+msgstr "values"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116
+msgid "search_seq_col_name"
+msgstr "Search-Seq-Spaltenname"
+
+#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118
+msgid "cycle_mark_col_name"
+msgstr "Cycle-Mark-Spaltenname"
+
+#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119
+msgid "cycle_mark_value"
+msgstr "Cycle-Mark-Wert"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120
+msgid "cycle_mark_default"
+msgstr "Cycle-Mark-Standard"
+
+#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121
+msgid "cycle_path_col_name"
+msgstr "Cycle-Pfad-Spaltenname"
+
+#: sql_help.c:4653
+msgid "new_table"
+msgstr "neue_Tabelle"
+
+#: sql_help.c:4724
+msgid "snapshot_id"
+msgstr "Snapshot-ID"
+
+#: sql_help.c:4984
+msgid "sort_expression"
+msgstr "Sortierausdruck"
+
+#: sql_help.c:5128 sql_help.c:6112
+msgid "abort the current transaction"
+msgstr "bricht die aktuelle Transaktion ab"
+
+#: sql_help.c:5134
+msgid "change the definition of an aggregate function"
+msgstr "ändert die Definition einer Aggregatfunktion"
+
+#: sql_help.c:5140
+msgid "change the definition of a collation"
+msgstr "ändert die Definition einer Sortierfolge"
+
+#: sql_help.c:5146
+msgid "change the definition of a conversion"
+msgstr "ändert die Definition einer Zeichensatzkonversion"
+
+#: sql_help.c:5152
+msgid "change a database"
+msgstr "ändert eine Datenbank"
+
+#: sql_help.c:5158
+msgid "define default access privileges"
+msgstr "definiert vorgegebene Zugriffsprivilegien"
+
+#: sql_help.c:5164
+msgid "change the definition of a domain"
+msgstr "ändert die Definition einer Domäne"
+
+#: sql_help.c:5170
+msgid "change the definition of an event trigger"
+msgstr "ändert die Definition eines Ereignistriggers"
+
+#: sql_help.c:5176
+msgid "change the definition of an extension"
+msgstr "ändert die Definition einer Erweiterung"
+
+#: sql_help.c:5182
+msgid "change the definition of a foreign-data wrapper"
+msgstr "ändert die Definition eines Fremddaten-Wrappers"
+
+#: sql_help.c:5188
+msgid "change the definition of a foreign table"
+msgstr "ändert die Definition einer Fremdtabelle"
+
+#: sql_help.c:5194
+msgid "change the definition of a function"
+msgstr "ändert die Definition einer Funktion"
+
+#: sql_help.c:5200
+msgid "change role name or membership"
+msgstr "ändert Rollenname oder -mitglieder"
+
+#: sql_help.c:5206
+msgid "change the definition of an index"
+msgstr "ändert die Definition eines Index"
+
+#: sql_help.c:5212
+msgid "change the definition of a procedural language"
+msgstr "ändert die Definition einer prozeduralen Sprache"
+
+#: sql_help.c:5218
+msgid "change the definition of a large object"
+msgstr "ändert die Definition eines Large Object"
+
+#: sql_help.c:5224
+msgid "change the definition of a materialized view"
+msgstr "ändert die Definition einer materialisierten Sicht"
+
+#: sql_help.c:5230
+msgid "change the definition of an operator"
+msgstr "ändert die Definition eines Operators"
+
+#: sql_help.c:5236
+msgid "change the definition of an operator class"
+msgstr "ändert die Definition einer Operatorklasse"
+
+#: sql_help.c:5242
+msgid "change the definition of an operator family"
+msgstr "ändert die Definition einer Operatorfamilie"
+
+#: sql_help.c:5248
+msgid "change the definition of a row-level security policy"
+msgstr "ändert die Definition einer Policy für Sicherheit auf Zeilenebene"
+
+#: sql_help.c:5254
+msgid "change the definition of a procedure"
+msgstr "ändert die Definition einer Prozedur"
+
+#: sql_help.c:5260
+msgid "change the definition of a publication"
+msgstr "ändert die Definition einer Publikation"
+
+#: sql_help.c:5266 sql_help.c:5368
+msgid "change a database role"
+msgstr "ändert eine Datenbankrolle"
+
+#: sql_help.c:5272
+msgid "change the definition of a routine"
+msgstr "ändert die Definition einer Routine"
+
+#: sql_help.c:5278
+msgid "change the definition of a rule"
+msgstr "ändert die Definition einer Regel"
+
+#: sql_help.c:5284
+msgid "change the definition of a schema"
+msgstr "ändert die Definition eines Schemas"
+
+#: sql_help.c:5290
+msgid "change the definition of a sequence generator"
+msgstr "ändert die Definition eines Sequenzgenerators"
+
+#: sql_help.c:5296
+msgid "change the definition of a foreign server"
+msgstr "ändert die Definition eines Fremdservers"
+
+#: sql_help.c:5302
+msgid "change the definition of an extended statistics object"
+msgstr "ändert die Definition eines erweiterten Statistikobjekts"
+
+#: sql_help.c:5308
+msgid "change the definition of a subscription"
+msgstr "ändert die Definition einer Subskription"
+
+#: sql_help.c:5314
+msgid "change a server configuration parameter"
+msgstr "ändert einen Server-Konfigurationsparameter"
+
+#: sql_help.c:5320
+msgid "change the definition of a table"
+msgstr "ändert die Definition einer Tabelle"
+
+#: sql_help.c:5326
+msgid "change the definition of a tablespace"
+msgstr "ändert die Definition eines Tablespace"
+
+#: sql_help.c:5332
+msgid "change the definition of a text search configuration"
+msgstr "ändert die Definition einer Textsuchekonfiguration"
+
+#: sql_help.c:5338
+msgid "change the definition of a text search dictionary"
+msgstr "ändert die Definition eines Textsuchewörterbuchs"
+
+#: sql_help.c:5344
+msgid "change the definition of a text search parser"
+msgstr "ändert die Definition eines Textsucheparsers"
+
+#: sql_help.c:5350
+msgid "change the definition of a text search template"
+msgstr "ändert die Definition einer Textsuchevorlage"
+
+#: sql_help.c:5356
+msgid "change the definition of a trigger"
+msgstr "ändert die Definition eines Triggers"
+
+#: sql_help.c:5362
+msgid "change the definition of a type"
+msgstr "ändert die Definition eines Typs"
+
+#: sql_help.c:5374
+msgid "change the definition of a user mapping"
+msgstr "ändert die Definition einer Benutzerabbildung"
+
+#: sql_help.c:5380
+msgid "change the definition of a view"
+msgstr "ändert die Definition einer Sicht"
+
+#: sql_help.c:5386
+msgid "collect statistics about a database"
+msgstr "sammelt Statistiken über eine Datenbank"
+
+#: sql_help.c:5392 sql_help.c:6190
+msgid "start a transaction block"
+msgstr "startet einen Transaktionsblock"
+
+#: sql_help.c:5398
+msgid "invoke a procedure"
+msgstr "ruft eine Prozedur auf"
+
+#: sql_help.c:5404
+msgid "force a write-ahead log checkpoint"
+msgstr "erzwingt einen Checkpoint im Write-Ahead-Log"
+
+#: sql_help.c:5410
+msgid "close a cursor"
+msgstr "schließt einen Cursor"
+
+#: sql_help.c:5416
+msgid "cluster a table according to an index"
+msgstr "clustert eine Tabelle nach einem Index"
+
+#: sql_help.c:5422
+msgid "define or change the comment of an object"
+msgstr "definiert oder ändert den Kommentar eines Objektes"
+
+#: sql_help.c:5428 sql_help.c:5986
+msgid "commit the current transaction"
+msgstr "schließt die aktuelle Transaktion ab"
+
+#: sql_help.c:5434
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "schließt eine Transaktion ab, die vorher für Two-Phase-Commit vorbereitet worden war"
+
+#: sql_help.c:5440
+msgid "copy data between a file and a table"
+msgstr "kopiert Daten zwischen einer Datei und einer Tabelle"
+
+#: sql_help.c:5446
+msgid "define a new access method"
+msgstr "definiert eine neue Zugriffsmethode"
+
+#: sql_help.c:5452
+msgid "define a new aggregate function"
+msgstr "definiert eine neue Aggregatfunktion"
+
+#: sql_help.c:5458
+msgid "define a new cast"
+msgstr "definiert eine neue Typumwandlung"
+
+#: sql_help.c:5464
+msgid "define a new collation"
+msgstr "definiert eine neue Sortierfolge"
+
+#: sql_help.c:5470
+msgid "define a new encoding conversion"
+msgstr "definiert eine neue Kodierungskonversion"
+
+#: sql_help.c:5476
+msgid "create a new database"
+msgstr "erzeugt eine neue Datenbank"
+
+#: sql_help.c:5482
+msgid "define a new domain"
+msgstr "definiert eine neue Domäne"
+
+#: sql_help.c:5488
+msgid "define a new event trigger"
+msgstr "definiert einen neuen Ereignistrigger"
+
+#: sql_help.c:5494
+msgid "install an extension"
+msgstr "installiert eine Erweiterung"
+
+#: sql_help.c:5500
+msgid "define a new foreign-data wrapper"
+msgstr "definiert einen neuen Fremddaten-Wrapper"
+
+#: sql_help.c:5506
+msgid "define a new foreign table"
+msgstr "definiert eine neue Fremdtabelle"
+
+#: sql_help.c:5512
+msgid "define a new function"
+msgstr "definiert eine neue Funktion"
+
+#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680
+msgid "define a new database role"
+msgstr "definiert eine neue Datenbankrolle"
+
+#: sql_help.c:5524
+msgid "define a new index"
+msgstr "definiert einen neuen Index"
+
+#: sql_help.c:5530
+msgid "define a new procedural language"
+msgstr "definiert eine neue prozedurale Sprache"
+
+#: sql_help.c:5536
+msgid "define a new materialized view"
+msgstr "definiert eine neue materialisierte Sicht"
+
+#: sql_help.c:5542
+msgid "define a new operator"
+msgstr "definiert einen neuen Operator"
+
+#: sql_help.c:5548
+msgid "define a new operator class"
+msgstr "definiert eine neue Operatorklasse"
+
+#: sql_help.c:5554
+msgid "define a new operator family"
+msgstr "definiert eine neue Operatorfamilie"
+
+#: sql_help.c:5560
+msgid "define a new row-level security policy for a table"
+msgstr "definiert eine neue Policy für Sicherheit auf Zeilenebene für eine Tabelle"
+
+#: sql_help.c:5566
+msgid "define a new procedure"
+msgstr "definiert eine neue Prozedur"
+
+#: sql_help.c:5572
+msgid "define a new publication"
+msgstr "definiert eine neue Publikation"
+
+#: sql_help.c:5584
+msgid "define a new rewrite rule"
+msgstr "definiert eine neue Umschreiberegel"
+
+#: sql_help.c:5590
+msgid "define a new schema"
+msgstr "definiert ein neues Schema"
+
+#: sql_help.c:5596
+msgid "define a new sequence generator"
+msgstr "definiert einen neuen Sequenzgenerator"
+
+#: sql_help.c:5602
+msgid "define a new foreign server"
+msgstr "definiert einen neuen Fremdserver"
+
+#: sql_help.c:5608
+msgid "define extended statistics"
+msgstr "definiert erweiterte Statistiken"
+
+#: sql_help.c:5614
+msgid "define a new subscription"
+msgstr "definiert eine neue Subskription"
+
+#: sql_help.c:5620
+msgid "define a new table"
+msgstr "definiert eine neue Tabelle"
+
+#: sql_help.c:5626 sql_help.c:6148
+msgid "define a new table from the results of a query"
+msgstr "definiert eine neue Tabelle aus den Ergebnissen einer Anfrage"
+
+#: sql_help.c:5632
+msgid "define a new tablespace"
+msgstr "definiert einen neuen Tablespace"
+
+#: sql_help.c:5638
+msgid "define a new text search configuration"
+msgstr "definiert eine neue Textsuchekonfiguration"
+
+#: sql_help.c:5644
+msgid "define a new text search dictionary"
+msgstr "definiert ein neues Textsuchewörterbuch"
+
+#: sql_help.c:5650
+msgid "define a new text search parser"
+msgstr "definiert einen neuen Textsucheparser"
+
+#: sql_help.c:5656
+msgid "define a new text search template"
+msgstr "definiert eine neue Textsuchevorlage"
+
+#: sql_help.c:5662
+msgid "define a new transform"
+msgstr "definiert eine neue Transformation"
+
+#: sql_help.c:5668
+msgid "define a new trigger"
+msgstr "definiert einen neuen Trigger"
+
+#: sql_help.c:5674
+msgid "define a new data type"
+msgstr "definiert einen neuen Datentyp"
+
+#: sql_help.c:5686
+msgid "define a new mapping of a user to a foreign server"
+msgstr "definiert eine neue Abbildung eines Benutzers auf einen Fremdserver"
+
+#: sql_help.c:5692
+msgid "define a new view"
+msgstr "definiert eine neue Sicht"
+
+#: sql_help.c:5698
+msgid "deallocate a prepared statement"
+msgstr "gibt einen vorbereiteten Befehl frei"
+
+#: sql_help.c:5704
+msgid "define a cursor"
+msgstr "definiert einen Cursor"
+
+#: sql_help.c:5710
+msgid "delete rows of a table"
+msgstr "löscht Zeilen einer Tabelle"
+
+#: sql_help.c:5716
+msgid "discard session state"
+msgstr "verwirft den Sitzungszustand"
+
+#: sql_help.c:5722
+msgid "execute an anonymous code block"
+msgstr "führt einen anonymen Codeblock aus"
+
+#: sql_help.c:5728
+msgid "remove an access method"
+msgstr "entfernt eine Zugriffsmethode"
+
+#: sql_help.c:5734
+msgid "remove an aggregate function"
+msgstr "entfernt eine Aggregatfunktion"
+
+#: sql_help.c:5740
+msgid "remove a cast"
+msgstr "entfernt eine Typumwandlung"
+
+#: sql_help.c:5746
+msgid "remove a collation"
+msgstr "entfernt eine Sortierfolge"
+
+#: sql_help.c:5752
+msgid "remove a conversion"
+msgstr "entfernt eine Zeichensatzkonversion"
+
+#: sql_help.c:5758
+msgid "remove a database"
+msgstr "entfernt eine Datenbank"
+
+#: sql_help.c:5764
+msgid "remove a domain"
+msgstr "entfernt eine Domäne"
+
+#: sql_help.c:5770
+msgid "remove an event trigger"
+msgstr "entfernt einen Ereignistrigger"
+
+#: sql_help.c:5776
+msgid "remove an extension"
+msgstr "entfernt eine Erweiterung"
+
+#: sql_help.c:5782
+msgid "remove a foreign-data wrapper"
+msgstr "entfernt einen Fremddaten-Wrapper"
+
+#: sql_help.c:5788
+msgid "remove a foreign table"
+msgstr "entfernt eine Fremdtabelle"
+
+#: sql_help.c:5794
+msgid "remove a function"
+msgstr "entfernt eine Funktion"
+
+#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968
+msgid "remove a database role"
+msgstr "entfernt eine Datenbankrolle"
+
+#: sql_help.c:5806
+msgid "remove an index"
+msgstr "entfernt einen Index"
+
+#: sql_help.c:5812
+msgid "remove a procedural language"
+msgstr "entfernt eine prozedurale Sprache"
+
+#: sql_help.c:5818
+msgid "remove a materialized view"
+msgstr "entfernt eine materialisierte Sicht"
+
+#: sql_help.c:5824
+msgid "remove an operator"
+msgstr "entfernt einen Operator"
+
+#: sql_help.c:5830
+msgid "remove an operator class"
+msgstr "entfernt eine Operatorklasse"
+
+#: sql_help.c:5836
+msgid "remove an operator family"
+msgstr "entfernt eine Operatorfamilie"
+
+#: sql_help.c:5842
+msgid "remove database objects owned by a database role"
+msgstr "entfernt die einer Datenbankrolle gehörenden Datenbankobjekte"
+
+#: sql_help.c:5848
+msgid "remove a row-level security policy from a table"
+msgstr "entfernt eine Policy für Sicherheit auf Zeilenebene von einer Tabelle"
+
+#: sql_help.c:5854
+msgid "remove a procedure"
+msgstr "entfernt eine Prozedur"
+
+#: sql_help.c:5860
+msgid "remove a publication"
+msgstr "entfernt eine Publikation"
+
+#: sql_help.c:5872
+msgid "remove a routine"
+msgstr "entfernt eine Routine"
+
+#: sql_help.c:5878
+msgid "remove a rewrite rule"
+msgstr "entfernt eine Umschreiberegel"
+
+#: sql_help.c:5884
+msgid "remove a schema"
+msgstr "entfernt ein Schema"
+
+#: sql_help.c:5890
+msgid "remove a sequence"
+msgstr "entfernt eine Sequenz"
+
+#: sql_help.c:5896
+msgid "remove a foreign server descriptor"
+msgstr "entfernt einen Fremdserverdeskriptor"
+
+#: sql_help.c:5902
+msgid "remove extended statistics"
+msgstr "entfernt erweiterte Statistiken"
+
+#: sql_help.c:5908
+msgid "remove a subscription"
+msgstr "entfernt eine Subskription"
+
+#: sql_help.c:5914
+msgid "remove a table"
+msgstr "entfernt eine Tabelle"
+
+#: sql_help.c:5920
+msgid "remove a tablespace"
+msgstr "entfernt einen Tablespace"
+
+#: sql_help.c:5926
+msgid "remove a text search configuration"
+msgstr "entfernt eine Textsuchekonfiguration"
+
+#: sql_help.c:5932
+msgid "remove a text search dictionary"
+msgstr "entfernt ein Textsuchewörterbuch"
+
+#: sql_help.c:5938
+msgid "remove a text search parser"
+msgstr "entfernt einen Textsucheparser"
+
+#: sql_help.c:5944
+msgid "remove a text search template"
+msgstr "entfernt eine Textsuchevorlage"
+
+#: sql_help.c:5950
+msgid "remove a transform"
+msgstr "entfernt eine Transformation"
+
+#: sql_help.c:5956
+msgid "remove a trigger"
+msgstr "entfernt einen Trigger"
+
+#: sql_help.c:5962
+msgid "remove a data type"
+msgstr "entfernt einen Datentyp"
+
+#: sql_help.c:5974
+msgid "remove a user mapping for a foreign server"
+msgstr "entfernt eine Benutzerabbildung für einen Fremdserver"
+
+#: sql_help.c:5980
+msgid "remove a view"
+msgstr "entfernt eine Sicht"
+
+#: sql_help.c:5992
+msgid "execute a prepared statement"
+msgstr "führt einen vorbereiteten Befehl aus"
+
+#: sql_help.c:5998
+msgid "show the execution plan of a statement"
+msgstr "zeigt den Ausführungsplan eines Befehls"
+
+#: sql_help.c:6004
+msgid "retrieve rows from a query using a cursor"
+msgstr "liest Zeilen aus einer Anfrage mit einem Cursor"
+
+#: sql_help.c:6010
+msgid "define access privileges"
+msgstr "definiert Zugriffsprivilegien"
+
+#: sql_help.c:6016
+msgid "import table definitions from a foreign server"
+msgstr "importiert Tabellendefinitionen von einem Fremdserver"
+
+#: sql_help.c:6022
+msgid "create new rows in a table"
+msgstr "erzeugt neue Zeilen in einer Tabelle"
+
+#: sql_help.c:6028
+msgid "listen for a notification"
+msgstr "hört auf eine Benachrichtigung"
+
+#: sql_help.c:6034
+msgid "load a shared library file"
+msgstr "lädt eine dynamische Bibliotheksdatei"
+
+#: sql_help.c:6040
+msgid "lock a table"
+msgstr "sperrt eine Tabelle"
+
+#: sql_help.c:6046
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "fügt Zeilen in eine Tabelle ein oder ändert oder löscht Zeilen einer Tabelle, abhängig von Bedingungen"
+
+#: sql_help.c:6052
+msgid "position a cursor"
+msgstr "positioniert einen Cursor"
+
+#: sql_help.c:6058
+msgid "generate a notification"
+msgstr "erzeugt eine Benachrichtigung"
+
+#: sql_help.c:6064
+msgid "prepare a statement for execution"
+msgstr "bereitet einen Befehl zur Ausführung vor"
+
+#: sql_help.c:6070
+msgid "prepare the current transaction for two-phase commit"
+msgstr "bereitet die aktuelle Transaktion für Two-Phase-Commit vor"
+
+#: sql_help.c:6076
+msgid "change the ownership of database objects owned by a database role"
+msgstr "ändert den Eigentümer der der Rolle gehörenden Datenbankobjekte"
+
+#: sql_help.c:6082
+msgid "replace the contents of a materialized view"
+msgstr "ersetzt den Inhalt einer materialisierten Sicht"
+
+#: sql_help.c:6088
+msgid "rebuild indexes"
+msgstr "baut Indexe neu"
+
+#: sql_help.c:6094
+msgid "destroy a previously defined savepoint"
+msgstr "gibt einen zuvor definierten Sicherungspunkt frei"
+
+#: sql_help.c:6100
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "setzt einen Konfigurationsparameter auf die Voreinstellung zurück"
+
+#: sql_help.c:6106
+msgid "remove access privileges"
+msgstr "entfernt Zugriffsprivilegien"
+
+#: sql_help.c:6118
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "storniert eine Transaktion, die vorher für Two-Phase-Commit vorbereitet worden war"
+
+#: sql_help.c:6124
+msgid "roll back to a savepoint"
+msgstr "rollt eine Transaktion bis zu einem Sicherungspunkt zurück"
+
+#: sql_help.c:6130
+msgid "define a new savepoint within the current transaction"
+msgstr "definiert einen neuen Sicherungspunkt in der aktuellen Transaktion"
+
+#: sql_help.c:6136
+msgid "define or change a security label applied to an object"
+msgstr "definiert oder ändert ein Security-Label eines Objektes"
+
+#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232
+msgid "retrieve rows from a table or view"
+msgstr "liest Zeilen aus einer Tabelle oder Sicht"
+
+#: sql_help.c:6154
+msgid "change a run-time parameter"
+msgstr "ändert einen Konfigurationsparameter"
+
+#: sql_help.c:6160
+msgid "set constraint check timing for the current transaction"
+msgstr "setzt die Zeitsteuerung für Check-Constraints in der aktuellen Transaktion"
+
+#: sql_help.c:6166
+msgid "set the current user identifier of the current session"
+msgstr "setzt den aktuellen Benutzernamen der aktuellen Sitzung"
+
+#: sql_help.c:6172
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "setzt den Sitzungsbenutzernamen und den aktuellen Benutzernamen der aktuellen Sitzung"
+
+#: sql_help.c:6178
+msgid "set the characteristics of the current transaction"
+msgstr "setzt die Charakteristika der aktuellen Transaktion"
+
+#: sql_help.c:6184
+msgid "show the value of a run-time parameter"
+msgstr "zeigt den Wert eines Konfigurationsparameters"
+
+#: sql_help.c:6202
+msgid "empty a table or set of tables"
+msgstr "leert eine oder mehrere Tabellen"
+
+#: sql_help.c:6208
+msgid "stop listening for a notification"
+msgstr "beendet das Hören auf eine Benachrichtigung"
+
+#: sql_help.c:6214
+msgid "update rows of a table"
+msgstr "aktualisiert Zeilen einer Tabelle"
+
+#: sql_help.c:6220
+msgid "garbage-collect and optionally analyze a database"
+msgstr "säubert und analysiert eine Datenbank"
+
+#: sql_help.c:6226
+msgid "compute a set of rows"
+msgstr "berechnet eine Zeilenmenge"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 kann nur im nicht interaktiven Modus verwendet werden"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "konnte Logdatei »%s« nicht öffnen: %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Geben Sie »help« für Hilfe ein.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "konnte Ausgabeparameter »%s« nicht setzen"
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "überflüssiges Kommandozeilenargument »%s« ignoriert"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "konnte eigene Programmdatei nicht finden"
+
+#: tab-complete.c:5955
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"Anfrage zur Tab-Vervollständigung fehlgeschlagen: %s\n"
+"Anfrage war:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "unbekannter Wert »%s« für »%s«: Boole'scher Wert erwartet"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "ungültiger Wert »%s« für »%s«: ganze Zahl erwartet"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "ungültiger Variablenname: »%s«"
+
+#: variables.c:419
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"unbekannter Wert »%s« für »%s«\n"
+"Verfügbare Werte sind: %s."
diff --git a/src/bin/psql/po/el.po b/src/bin/psql/po/el.po
new file mode 100644
index 0000000..a40390d
--- /dev/null
+++ b/src/bin/psql/po/el.po
@@ -0,0 +1,6535 @@
+# Greek message translation file for psql
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the psql (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-14 09:16+0000\n"
+"PO-Revision-Date: 2023-04-14 15:45+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "προειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέρεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "δεν ήταν δυνατή η αναγνώριση του τρέχοντος καταλόγου: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "μη έγκυρο δυαδικό αρχείο «%s»"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "δεν ήταν δυνατή η ανάγνωση του δυαδικού αρχείου «%s»"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "δεν βρέθηκε το αρχείο «%s» για να εκτελεστεί"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του συμβολικού συνδέσμου «%s»: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() απέτυχε: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "έλλειψη μνήμης"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "έλλειψη μνήμης\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "δεν ήταν δυνατή η αντιγραφή δείκτη null (εσωτερικό σφάλμα)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "δεν ήταν δυνατή η αναζήτηση ενεργής ταυτότητας χρήστη %ld: %s"
+
+#: ../../common/username.c:45 command.c:575
+msgid "user does not exist"
+msgstr "ο χρήστης δεν υπάρχει"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "αποτυχία αναζήτησης ονόματος χρήστη: κωδικός σφάλματος %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "εντολή μη εκτελέσιμη"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "εντολή δεν βρέθηκε"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "απόγονος διεργασίας τερμάτισε με κωδικό εξόδου %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "απόγονος διεργασίας τερματίστηκε με εξαίρεση 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "απόγονος διεργασίας τερματίστηκε με σήμα %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "απόγονος διεργασίας τερμάτισε με μη αναγνωρίσιμη κατάσταση %d"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Αίτηση ακύρωσης εστάλη\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Δεν ήταν δυνατή η αποστολή αίτησης ακύρωσης: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu σειρά)"
+msgstr[1] "(%lu σειρές)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Διακόπηκε\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Δεν είναι δυνατή η προσθήκη κεφαλίδας σε περιεχόμενο πίνακα: υπέρβαση του πλήθους στηλών %d.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Δεν είναι δυνατή η προσθήκη κελιού σε περιεχόμενο πίνακα: υπέρβαση του συνολικού αριθμού κελιών %d.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "μη έγκυρη μορφή εξόδου (εσωτερικό σφάλμα): %d"
+
+#: ../../fe_utils/psqlscan.l:702
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "παραλείπεται η αναδρομική επέκταση της μεταβλητής «%s»"
+
+#: ../../port/thread.c:100 ../../port/thread.c:136
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "δεν ήταν δυνατή η αναζήτηση ID τοπικού χρήστη %d: %s"
+
+#: ../../port/thread.c:105 ../../port/thread.c:141
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "δεν υπάρχει τοπικός χρήστης με ID %d"
+
+#: command.c:232
+#, c-format
+msgid "invalid command \\%s"
+msgstr "μη έγκυρη εντολή «%s»"
+
+#: command.c:234
+#, c-format
+msgid "Try \\? for help."
+msgstr "Δοκιμάστε \\? για βοήθεια."
+
+#: command.c:252
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: επιπλέον παράμετρος «%s» αγνοείται"
+
+#: command.c:304
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "\\%s εντολή αγνοείται, χρησιμοποιείστε \\endif ή Ctrl-C για να εξέλθετε από το παρόν μπλοκ \\if"
+
+#: command.c:573
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "δεν ήταν δυνατή η ανάλληψη προσωπικού καταλόγου για τον χρήστη με ID %ld: %s"
+
+#: command.c:592
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m"
+
+#: command.c:617
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "Αυτή τη στιγμή δεν είστε συνδεδεμένοι σε μία βάση δεδομένων.\n"
+
+#: command.c:627
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s» στην διεύθυνση «%s» στη θύρα «%s».\n"
+
+#: command.c:630
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s» μέσω του υποδεχέα «%s» στη θύρα «%s».\n"
+
+#: command.c:636
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s» στον κεντρικό υπολογιστή «%s» (διεύθυνση «%s») στη θύρα «%s».\n"
+
+#: command.c:639
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s» στον κεντρικό υπολογιστή «%s» στη θύρα «%s».\n"
+
+#: command.c:1030 command.c:1125 command.c:2654
+#, c-format
+msgid "no query buffer"
+msgstr "μη ενδιάμεση μνήμη ερώτησης"
+
+#: command.c:1063 command.c:5491
+#, c-format
+msgid "invalid line number: %s"
+msgstr "μη έγκυρος αριθμός γραμμής «%s»"
+
+#: command.c:1203
+msgid "No changes"
+msgstr "Καθόλου αλλάγες"
+
+#: command.c:1282
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: μη έγκυρη ονομασία κωδικοποίησης ή δεν βρέθηκε η διεργασία μετατροπής"
+
+#: command.c:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597
+#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100
+#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443
+#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1324
+msgid "There is no previous error."
+msgstr "Δεν υπάρχει προηγούμενο σφάλμα."
+
+#: command.c:1437
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: λείπει δεξιά παρένθεση"
+
+#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989
+#: command.c:2173 command.c:2415 command.c:2621 command.c:2661
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: λείπει αναγκαία παράμετρος"
+
+#: command.c:1782
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: δεν δύναται να προκύψει μετά \\else"
+
+#: command.c:1787
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: δεν υπάρχει αντίστοιχο \\if"
+
+#: command.c:1851
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: δεν δύναται να προκύψει μετά \\else"
+
+#: command.c:1856
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: δεν υπάρχει αντίστοιχο \\if"
+
+#: command.c:1896
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: δεν υπάρχει αντίστοιχο \\if"
+
+#: command.c:2053
+msgid "Query buffer is empty."
+msgstr "Άδεια ενδιάμεση μνήμη ερώτησης."
+
+#: command.c:2096
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Εισάγετε νέο κωδικό πρόσβασης για το χρήστη «%s»: "
+
+#: command.c:2100
+msgid "Enter it again: "
+msgstr "Εισάγετε ξανά: "
+
+#: command.c:2109
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Οι κωδικοί πρόσβασης δεν είναι ίδιοι."
+
+#: command.c:2208
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: δεν ήταν δυνατή η ανάγνωση τιμής για την μεταβλητή"
+
+#: command.c:2311
+msgid "Query buffer reset (cleared)."
+msgstr "Μηδενισμός ενδιάμεσης μνήμη ερώτησης (καθάρισμα)."
+
+#: command.c:2333
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "‘Εγραψε την ιστορία στο αρχείο «%s».\n"
+
+#: command.c:2420
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: η ονομασία μεταβλητή περιβάλλοντος environment δεν δύναται να εμπεριέχει «=«"
+
+#: command.c:2468
+#, c-format
+msgid "function name is required"
+msgstr "η ονομασία συνάρτησης είναι αναγκαία"
+
+#: command.c:2470
+#, c-format
+msgid "view name is required"
+msgstr "η ονομασία ορισμού είναι αναγκαία"
+
+#: command.c:2593
+msgid "Timing is on."
+msgstr "Η χρονομέτρηση είναι ενεργή."
+
+#: command.c:2595
+msgid "Timing is off."
+msgstr "Η χρονομέτρηση είναι ανενεργή."
+
+#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952
+#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008
+#: command.c:4022 command.c:4049 command.c:4107 common.c:77 copy.c:331
+#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:3107 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Κωδικός πρόσβασης: "
+
+#: command.c:3112 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Κωδικός πρόσβασης για τον χρήστη %s: "
+
+#: command.c:3168
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "Να μην οριστεί ξεχωριστά ο χρήστης, ο κεντρικός υπολογιστής, ή η θύρα όταν χρησιμοποιείται μια συμβολοσειρά σύνδεσης"
+
+#: command.c:3203
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "Δεν υπάρχει σύνδεση βάσης δεδομένων για την επαναχρησιμοποίηση παραμέτρων"
+
+#: command.c:3511
+#, c-format
+msgid "Previous connection kept"
+msgstr "Κρατήθηκε η προηγούμενη σύνδεση"
+
+#: command.c:3517
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3573
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr ""
+"Τώρα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s» στη διεύθυνση «%s» στη θύρα «%s».\n"
+"=\n"
+
+#: command.c:3576
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Τώρα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s» μέσω του υποδεχέα «%s» στη θύρα «%s».\n"
+
+#: command.c:3582
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Τώρα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s» στον κεντρικό υπολογιστή «%s» (διεύθυνση «%s») στη θύρα «%s».\n"
+
+#: command.c:3585
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Τώρα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s» στον κεντρικό υπολογιστή «%s» στη θύρα «%s».\n"
+
+#: command.c:3590
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Τώρα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χρήστης «%s».\n"
+
+#: command.c:3630
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, διακομιστής %s)\n"
+
+#: command.c:3643
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"ΠΡΟΕΙΔΟΠΟΙΗΣΗ: %s κύρια έκδοση %s, %s κύρια έκδοση διακομιστή.\n"
+" Ορισμένες δυνατότητες psql ενδέχεται να μην λειτουργούν.\n"
+
+#: command.c:3680
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "SSL σύνδεση (πρωτόκολλο: %s, cipher: %s, συμπίεση: %s)\n"
+
+#: command.c:3681 command.c:3682
+msgid "unknown"
+msgstr "άγνωστο"
+
+#: command.c:3683 help.c:42
+msgid "off"
+msgstr "κλειστό"
+
+#: command.c:3683 help.c:42
+msgid "on"
+msgstr "ανοικτό"
+
+#: command.c:3697
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "GSSAPI-κρυπτογραφημένη σύνδεση\n"
+
+#: command.c:3717
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Ο πηγαίος κώδικας της κονσόλας (%u) διαφέρει από τον πηγαίο κώδικα των Windows(%u)\n"
+" Χαρακτήρες 8-bit δύναται να μην λειτουργούν ορθά. Δείτε την αναφορά στη σελίδα\n"
+" psql με τίτλο «Σημειώσεις για χρήστες Windows» για πληροφορίες.\n"
+
+#: command.c:3822
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "η μεταβλητή περιβάλλοντος PSQL_EDITOR_LINENUMBER_ARG πρέπει να έχει οριστεί για να ορίσετε αριθμό σειράς"
+
+#: command.c:3851
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "δεν μπόρεσε να εκκινήσει τον editor «%s»"
+
+#: command.c:3853
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "δεν μπόρεσε να εκκινήσει το /bin/sh"
+
+#: command.c:3903
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "δεν ήταν δυνατός ο εντοπισμός του προσωρινού καταλόγου %s"
+
+#: command.c:3930
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του προσωρινού αρχείου «%s»: %m"
+
+#: command.c:4266
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: διφορούμενης συντόμευση «%s» ταιριάζει τόσο «%s» όσο «%s»"
+
+#: command.c:4286
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: επιτρεπόμενες μορφές είναι aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4305
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: επιτρεπόμενες μορφές γραμμών είναι ascii, old-ascii, unicode"
+
+#: command.c:4320
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: επιτρεπόμενες μορφές Unicode border line είναι single, double"
+
+#: command.c:4335
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: επιτρεπόμενες μορφές Unicode column line είναι single, double"
+
+#: command.c:4350
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: επιτρεπόμενες μορφές Unicode header line είναι single, double"
+
+#: command.c:4393
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep πρέπει να είναι ένας χαρακτήρας ενός-byte"
+
+#: command.c:4398
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep δεν μπορεί να είναι διπλά εισαγωγικά, νέα γραμμή, ή carriage return"
+
+#: command.c:4535 command.c:4723
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: άγνωστη επιλογή: %s"
+
+#: command.c:4555
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Border style είναι %d.\n"
+
+#: command.c:4561
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "Target width δεν είναι ορισμένο.\n"
+
+#: command.c:4563
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "Target width είναι %d.\n"
+
+#: command.c:4570
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Εκτεταμένη οθόνη είναι ενεργή.\n"
+
+#: command.c:4572
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "Εκτεταμένη οθόνη χρησιμοποιείται αυτόματα.\n"
+
+#: command.c:4574
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Εκτεταμένη οθόνη είναι ανενεργή.\n"
+
+#: command.c:4580
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "Διαχωριστής πεδίων CSV είναι ο «%s».\n"
+
+#: command.c:4588 command.c:4596
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "Διαχωριστής πεδίων είναι το μηδενικό byte\n"
+
+#: command.c:4590
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "Διαχωριστής πεδίων είναι ο «%s».\n"
+
+#: command.c:4603
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Προκαθορισμένο υποσέλιδο είναι ενεργό.\n"
+
+#: command.c:4605
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Προκαθορισμένο υποσέλιδο είναι ανενεργό.\n"
+
+#: command.c:4611
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Η μορφή εξόδου είναι %s.\n"
+
+#: command.c:4617
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Η μορφή γραμμής είναι %s.\n"
+
+#: command.c:4624
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Εμφάνιση Null είναι «%s».\n"
+
+#: command.c:4632
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "Η κατά εντοπιότητα διορθωμένη μορφή αριθμητικής εξόδου είναι ενεργή.\n"
+
+#: command.c:4634
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "Η κατά εντοπιότητα διορθωμένη μορφή αριθμητικής εξόδου είναι ανενεργή.\n"
+
+#: command.c:4641
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "Χρησιμοποιείται Pager για μεγάλη έξοδο.\n"
+
+#: command.c:4643
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "Χρησιμοποιείται Pager συνέχεια.\n"
+
+#: command.c:4645
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "Η χρήση Pager είναι ανενεργή.\n"
+
+#: command.c:4651
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "Ο Pager δεν θα χρησιμοποιηθεί για λιγότερο από %d γραμμή.\n"
+msgstr[1] "Ο Pager δεν θα χρησιμοποιηθεί για λιγότερες από %d γραμμές.\n"
+
+#: command.c:4661 command.c:4671
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "Διαχωριστής εγγραφών είναι το μηδενικό byte\n"
+
+#: command.c:4663
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "Διαχωριστής εγγραφών είναι ο <newline>.\n"
+
+#: command.c:4665
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "Διαχωριστής εγγραφών είναι ο/η «%s».\n"
+
+#: command.c:4678
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Τα χαρακτηριστικά του πίνακα είναι «%s».\n"
+
+#: command.c:4681
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Χαρακτηριστικά πίνακα μη ορισμένα.\n"
+
+#: command.c:4688
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Ο τίτλος είναι «%s».\n"
+
+#: command.c:4690
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Ο τίτλος δεν είναι ορισμένος.\n"
+
+#: command.c:4697
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "Ενεργή όψη μόνο πλειάδων.\n"
+
+#: command.c:4699
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "Ανενεργή όψη μόνο πλειάδων.\n"
+
+#: command.c:4705
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Το στυλ περιγράμματος γραμμής Unicode είναι «%s».\n"
+
+#: command.c:4711
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Το στυλ περιγράμματος στήλης Unicode είναι «%s».\n"
+
+#: command.c:4717
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Το στυλ περιγράμματος γραμμής κεφαλίδας Unicode είναι «%s».\n"
+
+#: command.c:4950
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: απέτυχε"
+
+#: command.c:4984
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch δεν μπορεί να χρησιμοποιηθεί με κενή ερώτηση"
+
+#: command.c:5016
+#, c-format
+msgid "could not set timer: %m"
+msgstr "δεν ήταν δυνατή η ρύθμιση του χρονομετρητή: %m"
+
+#: command.c:5078
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (κάθε %gs)\n"
+
+#: command.c:5081
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr ""
+"%s (κάθε %gs)\n"
+"\n"
+
+#: command.c:5142
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "δεν ήταν δυνατή η αναμονή για σήματα: %m"
+
+#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* ΕΡΩΤΗΣΗ **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5386
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "«%s.%s» δεν είναι μία όψη"
+
+#: command.c:5402
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "δεν ήταν δυνατή η ανάλυση συστυχίας reloptions"
+
+#: common.c:166
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "δεν είναι δυνατή η διαφυγή χωρίς ενεργή σύνδεση"
+
+#: common.c:207
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "παράμετρος της εντολής κελύφους περιέχει μια νέα γραμμή ή μια επιστροφή μεταφοράς: «%s»"
+
+#: common.c:311
+#, c-format
+msgid "connection to server was lost"
+msgstr "χάθηκε η σύνδεση στον διακομιστή"
+
+#: common.c:315
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "Χάθηκε η σύνδεση στον διακομιστή. Προσπάθεια επαναφοράς: "
+
+#: common.c:320
+#, c-format
+msgid "Failed.\n"
+msgstr "Απέτυχε.\n"
+
+#: common.c:337
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Πέτυχε.\n"
+
+#: common.c:389 common.c:1001
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "μη αναμενόμενο PQresultStatus: %d"
+
+#: common.c:511
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Χρόνος: %.3f ms\n"
+
+#: common.c:526
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Χρόνος: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:535
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Χρόνος: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:542
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Χρόνος: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:566 common.c:623 common.c:1034 describe.c:6135
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Αυτή τη στιγμή δεν είστε συνδεδεμένοι σε μία βάση δεδομένων."
+
+#: common.c:654
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "Ελήφθει ασύγχρονη ειδοποίηση «%s» με ωφέλιμο φορτίο «%s» από τη διαδικασία διακομιστή με %d PID.\n"
+
+#: common.c:657
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "Ελήφθει ασύγχρονη ειδοποίηση «%s» από τη διαδικασία διακομιστή με %d PID.\n"
+
+#: common.c:688
+#, c-format
+msgid "could not print result table: %m"
+msgstr "δεν μπόρεσε να εκτυπώσει τον πίνακα αποτελέσματος: %m"
+
+#: common.c:708
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "δεν επιστράφηκαν σειρές για \\gset"
+
+#: common.c:713
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "περισσότερες από μία γραμμές επιστράφηκαν για \\gset"
+
+#: common.c:731
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "αγνοείται η προσπάθεια να τεθεί \\gset στην ειδικά διαμορφωμένη μεταβλητή «%s»"
+
+#: common.c:1043
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Λειτουργία μονού βήματος: επιβεβαιώστε την εντολή)*******************************************\n"
+"%s\n"
+"***(πατήστε return για να συνεχίσετε ή εισάγετε x και return για να ακυρώσετε)********************\n"
+
+#: common.c:1126
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "ΔΗΛΩΣΗ: %s"
+
+#: common.c:1162
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "μη αναμενόμενη κατάσταση συναλλαγής: %d"
+
+#: common.c:1303 describe.c:2020
+msgid "Column"
+msgstr "Στήλη"
+
+#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037
+#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021
+#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504
+#: describe.c:5767
+msgid "Type"
+msgstr "Τύπος"
+
+#: common.c:1353
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "Η εντολή δεν έχει αποτέλεσμα, η το αποτέλεσμα δεν έχει στήλες.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: παράμετροι επιβάλλονται"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: σφάλμα ανάλυσης σε «%s»"
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: σφάλμα ανάλυσης στο τέλος γραμμής"
+
+#: copy.c:328
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής «%s»: %m"
+
+#: copy.c:344
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο «%s»: %m"
+
+#: copy.c:348
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: δεν μπορεί να αντιγράψει από/προς κατάλογο"
+
+#: copy.c:385
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο της διοχέτευσης σε εξωτερική εντολή: %m"
+
+#: copy.c:390
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: copy.c:453 copy.c:463
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "δεν ήταν δυνατή η εγγραφή δεδομένων COPY: %m"
+
+#: copy.c:469
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "Μεταφορά δεδομένων μέσω COPY απέτυχε: %s"
+
+#: copy.c:530
+msgid "canceled by user"
+msgstr "ακυρώθηκε από τον χρήστη"
+
+#: copy.c:541
+msgid ""
+"Enter data to be copied followed by a newline.\n"
+"End with a backslash and a period on a line by itself, or an EOF signal."
+msgstr ""
+"Εισαγάγετε τα δεδομένα που θα αντιγραφούν ακολουθούμενα από νέα γραμμή.\n"
+"Τερματίστε με μια ανάστροφη κάθετο και μια τελεία σε μια ξεχωριστή γραμμή, ή ένα σήμα EOF."
+
+#: copy.c:684
+msgid "aborted because of read failure"
+msgstr "ματαιώθηκε λόγω σφάλματος κατά την ανάγνωση"
+
+#: copy.c:718
+msgid "trying to exit copy mode"
+msgstr "προσπαθεί να τερματίσει τη λειτουργία αντιγραφής"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: η δήλωση δεν επέστρεψε σετ αποτελεσμάτων"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: η ερώτηση πρέπει να επιστρέψει τουλάχιστον τρεις στήλες"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: κάθετες και οριζόντιες κεφαλίδες πρέπει να βρίσκονται σε διαφορετικές στήλες"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: επιβάλλεται να έχει οριστεί στήλη δεδομένων όταν η ερώτηση επιστρέφει περισσότερες από τρεις στήλες"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: υπερβλήθηκε ο μέγιστος αριθμός στηλών (%d)"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: το αποτέλεσμα της ερώτησης περιλαμβάνει πολλαπλές τιμές δεδομένων για την σειρά «%s», στήλη «%s»"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: αριθμός στήλης %d βρίσκεται εκτός διαστήματος 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: αμφίσημο όνομα στήλης: «%s»"
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: όνομα στήλης δεν βρέθηκε: «%s»"
+
+#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029
+#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090
+#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866
+#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420
+#: describe.c:5477 describe.c:5881 describe.c:5959
+msgid "Schema"
+msgstr "Σχήμα"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636
+#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258
+#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341
+#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867
+#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410
+#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748
+#: describe.c:5957 describe.c:6186 describe.c:6494
+msgid "Name"
+msgstr "Όνομα"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "Τύπος δεδομένων αποτελεσμάτων"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "Τύπος δεδομένων παραμέτρων"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423
+#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041
+#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280
+#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777
+#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248
+#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422
+#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895
+#: describe.c:5960 describe.c:6992
+msgid "Description"
+msgstr "Περιγραφή"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "Λίστα των συγκεντρωτικών συναρτήσεων"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει μεθόδους πρόσβασης."
+
+#: describe.c:168
+msgid "Index"
+msgstr "Ευρετήριο"
+
+#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882
+msgid "Table"
+msgstr "Πίνακας"
+
+#: describe.c:177 describe.c:5679
+msgid "Handler"
+msgstr "Διαχειριστής"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "Λίστα μεθόδων πρόσβασης"
+
+#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181
+#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588
+#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187
+#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718
+#: describe.c:6980
+msgid "Owner"
+msgstr "Ιδιοκτήτης"
+
+#: describe.c:231
+msgid "Location"
+msgstr "Τοποθεσία"
+
+#: describe.c:241 describe.c:3509
+msgid "Options"
+msgstr "Επιλογές"
+
+#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934
+msgid "Size"
+msgstr "Μέγεθος"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "Λίστα tablespaces"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df λαμβάνει μόνο [anptwS+] ως επιλογές"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df δεν λαμβάνει την επιλογή «%c» στην έκδοση διακομιστή %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "agg"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "window"
+
+#: describe.c:356
+msgid "proc"
+msgstr "proc"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "func"
+
+#: describe.c:374 describe.c:1390
+msgid "trigger"
+msgstr "trigger"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "immutable"
+
+#: describe.c:387
+msgid "stable"
+msgstr "stable"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "volatile"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "Προσωρινή"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "περιορισμένη"
+
+#: describe.c:398
+msgid "safe"
+msgstr "ασφαλής"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "ανασφαλής"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "Παράλληλη"
+
+#: describe.c:405
+msgid "definer"
+msgstr "definer"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "invoker"
+
+#: describe.c:407
+msgid "Security"
+msgstr "Ασφάλεια"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Γλώσσα"
+
+#: describe.c:416 describe.c:420
+msgid "Source code"
+msgstr "Πηγαίος κώδικας"
+
+#: describe.c:594
+msgid "List of functions"
+msgstr "Λίστα συναρτήσεων"
+
+#: describe.c:657
+msgid "Internal name"
+msgstr "Εσωτερική ονομασία"
+
+#: describe.c:659
+msgid "Elements"
+msgstr "Στοιχεία"
+
+#: describe.c:711
+msgid "List of data types"
+msgstr "Λίστα τύπων δεδομένων"
+
+#: describe.c:814
+msgid "Left arg type"
+msgstr "Τύπος αριστερής παραμέτρου"
+
+#: describe.c:815
+msgid "Right arg type"
+msgstr "Τύπος δεξιάς παραμέτρου"
+
+#: describe.c:816
+msgid "Result type"
+msgstr "Τύπος αποτελέσματος"
+
+#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247
+#: describe.c:6909 describe.c:6913
+msgid "Function"
+msgstr "Συνάρτηση"
+
+#: describe.c:902
+msgid "List of operators"
+msgstr "Λίστα operators"
+
+#: describe.c:938
+msgid "Encoding"
+msgstr "Κωδικοποίηση"
+
+#: describe.c:939 describe.c:4868
+msgid "Collate"
+msgstr "Σύνθεση"
+
+#: describe.c:940 describe.c:4869
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878
+msgid "ICU Locale"
+msgstr "ICU εντοπιότητα"
+
+#: describe.c:946 describe.c:952
+msgid "Locale Provider"
+msgstr "Πάροχος εντοπιότητας"
+
+#: describe.c:964
+msgid "Tablespace"
+msgstr "Tablespace"
+
+#: describe.c:990
+msgid "List of databases"
+msgstr "Λίστα βάσεων δεδομένων"
+
+#: describe.c:1031 describe.c:1184 describe.c:3882
+msgid "table"
+msgstr "πίνακας"
+
+#: describe.c:1032 describe.c:3883
+msgid "view"
+msgstr "όψη"
+
+#: describe.c:1033 describe.c:3884
+msgid "materialized view"
+msgstr "υλοποιημένη όψη"
+
+#: describe.c:1034 describe.c:1186 describe.c:3886
+msgid "sequence"
+msgstr "ακολουθία"
+
+#: describe.c:1035 describe.c:3888
+msgid "foreign table"
+msgstr "ξένος πίνακας"
+
+#: describe.c:1036 describe.c:3889 describe.c:4101
+msgid "partitioned table"
+msgstr "κατατμημένος πίνακας"
+
+#: describe.c:1047
+msgid "Column privileges"
+msgstr "Προνόμια στήλης"
+
+#: describe.c:1078 describe.c:1112
+msgid "Policies"
+msgstr "Πολιτικές"
+
+#: describe.c:1143 describe.c:4510 describe.c:6577
+msgid "Access privileges"
+msgstr "Προνόμια πρόσβασης"
+
+#: describe.c:1188
+msgid "function"
+msgstr "συνάρτηση"
+
+#: describe.c:1190
+msgid "type"
+msgstr "τύπος"
+
+#: describe.c:1192
+msgid "schema"
+msgstr "σχήμα"
+
+#: describe.c:1215
+msgid "Default access privileges"
+msgstr "Προεπιλεγμένες επιλογές δικαιωμάτων"
+
+#: describe.c:1259
+msgid "Object"
+msgstr "Ατνικείμενο"
+
+#: describe.c:1273
+msgid "table constraint"
+msgstr "περιορισμός πίνακα"
+
+#: describe.c:1297
+msgid "domain constraint"
+msgstr "περιορισμός πεδίου"
+
+#: describe.c:1321
+msgid "operator class"
+msgstr "κλάση χειριστή"
+
+#: describe.c:1345
+msgid "operator family"
+msgstr "οικογένεια χειριστή"
+
+#: describe.c:1368
+msgid "rule"
+msgstr "περιγραφή"
+
+#: describe.c:1414
+msgid "Object descriptions"
+msgstr "Περιγραφές αντικειμένου"
+
+#: describe.c:1479 describe.c:4007
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Δεν βρέθηκε καμία σχέση με όνομα «%s»."
+
+#: describe.c:1482 describe.c:4010
+#, c-format
+msgid "Did not find any relations."
+msgstr "Δεν βρέθηκαν καθόλου σχέσεις."
+
+#: describe.c:1678
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Δεν βρέθηκαν καθόλου σχέσεις με OID %s."
+
+#: describe.c:1726 describe.c:1750
+msgid "Start"
+msgstr "Εκκίνηση"
+
+#: describe.c:1727 describe.c:1751
+msgid "Minimum"
+msgstr "Ελάχιστο"
+
+#: describe.c:1728 describe.c:1752
+msgid "Maximum"
+msgstr "Μέγιστο"
+
+#: describe.c:1729 describe.c:1753
+msgid "Increment"
+msgstr "Επαύξηση"
+
+#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426
+#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620
+msgid "yes"
+msgstr "ναι"
+
+#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426
+#: describe.c:4768 describe.c:4892 describe.c:6621
+msgid "no"
+msgstr "όχι"
+
+#: describe.c:1732 describe.c:1756
+msgid "Cycles?"
+msgstr "Κύκλοι;"
+
+#: describe.c:1733 describe.c:1757
+msgid "Cache"
+msgstr "Προσωρινή μνήμη"
+
+#: describe.c:1798
+#, c-format
+msgid "Owned by: %s"
+msgstr "Ανήκει σε: %s"
+
+#: describe.c:1802
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Ακολουθία για τη στήλη ταυτότητας: %s"
+
+#: describe.c:1810
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "Ακαταχώρητη ακολουθία «%s.%s»"
+
+#: describe.c:1813
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Ακολουθία «%s.%s»"
+
+#: describe.c:1957
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Ακαταχώρητος πίνακας «%s.%s»"
+
+#: describe.c:1960
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Πίνακας «%s.%s»"
+
+#: describe.c:1964
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Όψη «%s.%s»"
+
+#: describe.c:1969
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Ακαταχώρητη υλοποιημένη όψη «%s.%s»"
+
+#: describe.c:1972
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Υλοποιημένη όψη «%s.%s»"
+
+#: describe.c:1977
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Ακαταχώρητο ευρετήριο «%s.%s»"
+
+#: describe.c:1980
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Ευρετήριο «%s.%s»"
+
+#: describe.c:1985
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Ακαταχώρητο κατατετμημένο ευρετήριο «%s.%s»"
+
+#: describe.c:1988
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Κατατετμημένο ευρετήριο «%s.%s»"
+
+#: describe.c:1992
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST πίνακας «%s.%s»"
+
+#: describe.c:1996
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Συνθετικός τύπος «%s.%s»"
+
+#: describe.c:2000
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Ξενικός πίνακας «%s.%s»"
+
+#: describe.c:2005
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Ακαταχώρητος κατατετμημένος πίνακας «%s.%s»"
+
+#: describe.c:2008
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Κατατετμημένος πίνακας «%s.%s»"
+
+#: describe.c:2024 describe.c:4343
+msgid "Collation"
+msgstr "Σύνθεση"
+
+#: describe.c:2025 describe.c:4344
+msgid "Nullable"
+msgstr "Nullable"
+
+#: describe.c:2026 describe.c:4345
+msgid "Default"
+msgstr "Προκαθορισμένο"
+
+#: describe.c:2029
+msgid "Key?"
+msgstr "Κλειδί;"
+
+#: describe.c:2031 describe.c:4665 describe.c:4676
+msgid "Definition"
+msgstr "Ορισμός"
+
+#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835
+#: describe.c:5894
+msgid "FDW options"
+msgstr "Επιλογές FDW"
+
+#: describe.c:2035
+msgid "Storage"
+msgstr "Αποθήκευση"
+
+#: describe.c:2037
+msgid "Compression"
+msgstr "Συμπίεση"
+
+#: describe.c:2039
+msgid "Stats target"
+msgstr "Στόχος στατιστικών"
+
+#: describe.c:2175
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "Κατάτμηση του: %s %s%s"
+
+#: describe.c:2188
+msgid "No partition constraint"
+msgstr "Κανένας περιορισμός κατάτμησης"
+
+#: describe.c:2190
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Περιορισμός κατάτμησης: %s"
+
+#: describe.c:2214
+#, c-format
+msgid "Partition key: %s"
+msgstr "Κλειδί κατάτμησης: %s"
+
+#: describe.c:2240
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Ιδιοκτήτης πίνακα «%s.%s»"
+
+#: describe.c:2309
+msgid "primary key, "
+msgstr "κύριο κλειδί, "
+
+#: describe.c:2312
+msgid "unique"
+msgstr "μοναδικό"
+
+#: describe.c:2314
+msgid " nulls not distinct"
+msgstr " nulls μη διακριτά"
+
+#: describe.c:2315
+msgid ", "
+msgstr ", "
+
+#: describe.c:2322
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "για πίνακα «%s.%s»"
+
+#: describe.c:2326
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", πρόβλεψη (%s)"
+
+#: describe.c:2329
+msgid ", clustered"
+msgstr ", συσταδοποιημένο"
+
+#: describe.c:2332
+msgid ", invalid"
+msgstr ", άκυρο"
+
+#: describe.c:2335
+msgid ", deferrable"
+msgstr ", αναβαλλόμενο"
+
+#: describe.c:2338
+msgid ", initially deferred"
+msgstr ", αρχικά αναβαλλόμενο"
+
+#: describe.c:2341
+msgid ", replica identity"
+msgstr ", ταυτότητα πανομοιόματος"
+
+#: describe.c:2395
+msgid "Indexes:"
+msgstr "Ευρετήρια:"
+
+#: describe.c:2478
+msgid "Check constraints:"
+msgstr "Περιορισμοί ελέγχου:"
+
+#: describe.c:2546
+msgid "Foreign-key constraints:"
+msgstr "Περιορισμοί ξενικών κλειδιών:"
+
+#: describe.c:2609
+msgid "Referenced by:"
+msgstr "Αναφέρεται από:"
+
+#: describe.c:2659
+msgid "Policies:"
+msgstr "Πολιτικές:"
+
+#: describe.c:2662
+msgid "Policies (forced row security enabled):"
+msgstr "Πολιτικές (ενεργοποιημένη επιβολή ασφάλειας γραμμών):"
+
+#: describe.c:2665
+msgid "Policies (row security enabled): (none)"
+msgstr "Πολιτικές (ενεργοποιημένη ασφάλεια γραμμών): (καμία)"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Πολιτικές (ενεργοποιημένη επιβολή ασφάλειας γραμμών): (καμία)"
+
+#: describe.c:2671
+msgid "Policies (row security disabled):"
+msgstr "Πολιτικές (απενεργοποιημένη ασφάλεια γραμμών):"
+
+#: describe.c:2731 describe.c:2835
+msgid "Statistics objects:"
+msgstr "Αντικείμενα στατιστικών:"
+
+#: describe.c:2937 describe.c:3090
+msgid "Rules:"
+msgstr "Κανόνες:"
+
+#: describe.c:2940
+msgid "Disabled rules:"
+msgstr "Απενεργοποιημένοι κανόνες:"
+
+#: describe.c:2943
+msgid "Rules firing always:"
+msgstr "Κανόνες πάντα σε χρήση:"
+
+#: describe.c:2946
+msgid "Rules firing on replica only:"
+msgstr "Κανόνες σε χρήση μόνο στο ομοίωμα:"
+
+#: describe.c:3025 describe.c:5030
+msgid "Publications:"
+msgstr "Δημοσιεύσεις:"
+
+#: describe.c:3073
+msgid "View definition:"
+msgstr "Ορισμός όψης:"
+
+#: describe.c:3236
+msgid "Triggers:"
+msgstr "Triggers:"
+
+#: describe.c:3239
+msgid "Disabled user triggers:"
+msgstr "Απενεργοποιημένες triggers χρήστη:"
+
+#: describe.c:3242
+msgid "Disabled internal triggers:"
+msgstr "Απενεργοποιημένες εσωτερικές triggers:"
+
+#: describe.c:3245
+msgid "Triggers firing always:"
+msgstr "Triggers πάντα σε χρήση:"
+
+#: describe.c:3248
+msgid "Triggers firing on replica only:"
+msgstr "Triggers σε χρήση μόνο στο ομοίωμα:"
+
+#: describe.c:3319
+#, c-format
+msgid "Server: %s"
+msgstr "Διακομιστής: %s"
+
+#: describe.c:3327
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW επιλογές: (%s)"
+
+#: describe.c:3348
+msgid "Inherits"
+msgstr "Κληρονομεί"
+
+#: describe.c:3413
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "Αριθμός κατατμήσεων: %d"
+
+#: describe.c:3422
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Αριθμός κατατμήσεων: %d (Χρησιμοποιείστε \\d+ για να τους απαριθμήσετε.)"
+
+#: describe.c:3424
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Αριθμός απογονικών πινάκων: %d (Χρησιμοποιείστε \\d+ για να τους απαριθμήσετε.)"
+
+#: describe.c:3431
+msgid "Child tables"
+msgstr "Απογονικοί πίνακες"
+
+#: describe.c:3431
+msgid "Partitions"
+msgstr "Κατατμήσεις"
+
+#: describe.c:3462
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Τυποποιημένος πίνακας τύπου: %s"
+
+#: describe.c:3478
+msgid "Replica Identity"
+msgstr "Ταυτότητα Ομοιόματος"
+
+#: describe.c:3491
+msgid "Has OIDs: yes"
+msgstr "Έχει OIDs: ναι"
+
+#: describe.c:3500
+#, c-format
+msgid "Access method: %s"
+msgstr "Μέθοδος πρόσβασης: %s"
+
+#: describe.c:3579
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "Χώρος πινάκα: «%s»"
+
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:3591
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", χώρος πίνακα «%s»"
+
+#: describe.c:3668
+msgid "List of roles"
+msgstr "Λίστα ρόλων"
+
+#: describe.c:3670
+msgid "Role name"
+msgstr "Όνομα ρόλου"
+
+#: describe.c:3671
+msgid "Attributes"
+msgstr "Χαρακτηριστικά"
+
+#: describe.c:3673
+msgid "Member of"
+msgstr "Μέλος του"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "Υπερχρήστης"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "Καμία κληρονιμιά"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "Δημιουργήστε ρόλο"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "Δημιουργήστε βάση δεδομένων"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "Δεν δύναται σύνδεση"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "Αντιγραφή"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "Παράκαμψη RLS"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "Καθόλου συνδέσεις"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d σύνδεση"
+msgstr[1] "%d συνδέσεις"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Κωδικός πρόσβασης ενεργός μέχρι "
+
+#: describe.c:3777
+msgid "Role"
+msgstr "Ρόλος"
+
+#: describe.c:3778
+msgid "Database"
+msgstr "Βάση δεδομένων"
+
+#: describe.c:3779
+msgid "Settings"
+msgstr "Ρυθμίσεις"
+
+#: describe.c:3803
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "Δεν βρέθηκαν ρυθμίσεις για το ρόλο «%s» και τη βάση δεδομένων «%s»."
+
+#: describe.c:3806
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Δεν βρέθηκαν ρυθμίσεις για το ρόλο «%s»."
+
+#: describe.c:3809
+#, c-format
+msgid "Did not find any settings."
+msgstr "Δεν βρέθηκαν ρυθμίσεις."
+
+#: describe.c:3814
+msgid "List of settings"
+msgstr "Λίστα ρυθμίσεων"
+
+#: describe.c:3885
+msgid "index"
+msgstr "ευρετήριο"
+
+#: describe.c:3887
+msgid "TOAST table"
+msgstr "TOAST πίνακας"
+
+#: describe.c:3890 describe.c:4102
+msgid "partitioned index"
+msgstr "κατατετμημένο ευρετήριο"
+
+#: describe.c:3910
+msgid "permanent"
+msgstr "μόνιμο"
+
+#: describe.c:3911
+msgid "temporary"
+msgstr "προσωρινό"
+
+#: describe.c:3912
+msgid "unlogged"
+msgstr "ακαταχώρητο"
+
+#: describe.c:3913
+msgid "Persistence"
+msgstr "Διάρκεια"
+
+#: describe.c:3929
+msgid "Access method"
+msgstr "Μέθοδος πρόσβασης"
+
+#: describe.c:4015
+msgid "List of relations"
+msgstr "Λίστα σχέσεων"
+
+#: describe.c:4063
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει την δηλωτική δημιουργία κατατμήσεων πίνακα."
+
+#: describe.c:4074
+msgid "List of partitioned indexes"
+msgstr "Λίστα κατατμημένων ευρετηρίων"
+
+#: describe.c:4076
+msgid "List of partitioned tables"
+msgstr "Λίστα κατατμημένων πινάκων"
+
+#: describe.c:4080
+msgid "List of partitioned relations"
+msgstr "Λίστα κατατμημένων σχέσεων"
+
+#: describe.c:4111
+msgid "Parent name"
+msgstr "Γονικό όνομα"
+
+#: describe.c:4124
+msgid "Leaf partition size"
+msgstr "Μέγεθος φύλλου κατάτμησης"
+
+#: describe.c:4127 describe.c:4133
+msgid "Total size"
+msgstr "Συνολικό μέγεθος"
+
+#: describe.c:4258
+msgid "Trusted"
+msgstr "Εμπιστευόμενο"
+
+#: describe.c:4267
+msgid "Internal language"
+msgstr "Εσωτερική γλώσσα"
+
+#: describe.c:4268
+msgid "Call handler"
+msgstr "Πρόγραμμα χειρισμού κλήσεων"
+
+#: describe.c:4269 describe.c:5680
+msgid "Validator"
+msgstr "Ελεκτής"
+
+#: describe.c:4270
+msgid "Inline handler"
+msgstr "Ενσωματωμένος χειριστής"
+
+#: describe.c:4305
+msgid "List of languages"
+msgstr "Λίστα γλωσσών"
+
+#: describe.c:4346
+msgid "Check"
+msgstr "Έλεγχος"
+
+#: describe.c:4390
+msgid "List of domains"
+msgstr "Λίστα πεδίων"
+
+#: describe.c:4424
+msgid "Source"
+msgstr "Πηγή"
+
+#: describe.c:4425
+msgid "Destination"
+msgstr "Προορισμός"
+
+#: describe.c:4427 describe.c:6622
+msgid "Default?"
+msgstr "Προεπιλογή;"
+
+#: describe.c:4469
+msgid "List of conversions"
+msgstr "Λίστα μετατροπών"
+
+#: describe.c:4497
+msgid "Parameter"
+msgstr "Παράμετρος"
+
+#: describe.c:4498
+msgid "Value"
+msgstr "Τιμή"
+
+#: describe.c:4505
+msgid "Context"
+msgstr "Περιεχόμενο"
+
+#: describe.c:4538
+msgid "List of configuration parameters"
+msgstr "Λίστα ρυθμίσεων παραμέτρων"
+
+#: describe.c:4540
+msgid "List of non-default configuration parameters"
+msgstr "Λίστα μη προεπιλεγμένων ρυθμίσεων παραμέτρων"
+
+#: describe.c:4567
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει εναύσματα συμβάντων."
+
+#: describe.c:4587
+msgid "Event"
+msgstr "Συμβάν"
+
+#: describe.c:4589
+msgid "enabled"
+msgstr "ενεγροποιημένο"
+
+#: describe.c:4590
+msgid "replica"
+msgstr "ομοίωμα"
+
+#: describe.c:4591
+msgid "always"
+msgstr "πάντα"
+
+#: describe.c:4592
+msgid "disabled"
+msgstr "απενεργοποιημένο"
+
+#: describe.c:4593 describe.c:6496
+msgid "Enabled"
+msgstr "Ενεργοποιημένο"
+
+#: describe.c:4595
+msgid "Tags"
+msgstr "Ετικέτες"
+
+#: describe.c:4619
+msgid "List of event triggers"
+msgstr "Λίστα ενεργοποιήσεων συμβάντων"
+
+#: describe.c:4646
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει εκτεταμένες στατιστικές."
+
+#: describe.c:4683
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4684
+msgid "Dependencies"
+msgstr "Dependencies"
+
+#: describe.c:4694
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4718
+msgid "List of extended statistics"
+msgstr "Λίστα εκτεταμένων στατιστικών"
+
+#: describe.c:4745
+msgid "Source type"
+msgstr "Τύπος πηγής"
+
+#: describe.c:4746
+msgid "Target type"
+msgstr "Τύπος προοριστμού"
+
+#: describe.c:4770
+msgid "in assignment"
+msgstr "σε ανάθεση"
+
+#: describe.c:4772
+msgid "Implicit?"
+msgstr "Έμμεσα;"
+
+#: describe.c:4831
+msgid "List of casts"
+msgstr "Λίστα casts"
+
+#: describe.c:4883 describe.c:4887
+msgid "Provider"
+msgstr "Πάροχος"
+
+#: describe.c:4893 describe.c:4898
+msgid "Deterministic?"
+msgstr "Ντετερμινιστικό;"
+
+#: describe.c:4938
+msgid "List of collations"
+msgstr "Λίστα συρραφών"
+
+#: describe.c:5000
+msgid "List of schemas"
+msgstr "Λίστα σχημάτων"
+
+#: describe.c:5117
+msgid "List of text search parsers"
+msgstr "Λίστα αναλυτών αναζήτησης κειμένου"
+
+#: describe.c:5167
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Δεν βρήκε ανάλυση αναζήτησης κειμένου με το όνομα «%s»."
+
+#: describe.c:5170
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Δεν βρήκε ανάλυση αναζήτησης κειμένου."
+
+#: describe.c:5245
+msgid "Start parse"
+msgstr "Εκκίνηση ανάλυσης"
+
+#: describe.c:5246
+msgid "Method"
+msgstr "Μέθοδος"
+
+#: describe.c:5250
+msgid "Get next token"
+msgstr "Λήψη επόμενου ενδεικτικού"
+
+#: describe.c:5252
+msgid "End parse"
+msgstr "Τέλος ανάλυσης"
+
+#: describe.c:5254
+msgid "Get headline"
+msgstr "Λήψη επικεφαλίδας"
+
+#: describe.c:5256
+msgid "Get token types"
+msgstr "Λήψη τύπων ενδεικτικών"
+
+#: describe.c:5267
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Αναλυτής αναζήτης κειμένου «%s.%s»"
+
+#: describe.c:5270
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Αναλυτής αναζήτης κειμένου «%s»"
+
+#: describe.c:5289
+msgid "Token name"
+msgstr "Ονομασία ενδεικτικού"
+
+#: describe.c:5303
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Τύποι ενδεικτικών αναλυτή «%s.%s»"
+
+#: describe.c:5306
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Τύποι ενδεικτικών αναλυτή «%s»"
+
+#: describe.c:5350
+msgid "Template"
+msgstr "Πρότυπο"
+
+#: describe.c:5351
+msgid "Init options"
+msgstr "Επιλογές εκκίνησης"
+
+#: describe.c:5378
+msgid "List of text search dictionaries"
+msgstr "Λίστα λεξικών αναζήτησης κειμένου"
+
+#: describe.c:5411
+msgid "Init"
+msgstr "Εκκίνηση"
+
+#: describe.c:5412
+msgid "Lexize"
+msgstr "Lexize"
+
+#: describe.c:5444
+msgid "List of text search templates"
+msgstr "Λίστα προτύπων αναζήτησης κειμένου"
+
+#: describe.c:5499
+msgid "List of text search configurations"
+msgstr "Λίστα ρυθμίσεων αναζήτησης κειμένου"
+
+#: describe.c:5550
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "Δεν βρέθηκαν ρυθμίσεις αναζήτησης κειμένου με όνομα «%s»."
+
+#: describe.c:5553
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Δεν βρέθηκαν ρυθμίσεις αναζήτησης κειμένου."
+
+#: describe.c:5619
+msgid "Token"
+msgstr "Ενδεικτικό"
+
+#: describe.c:5620
+msgid "Dictionaries"
+msgstr "Λεξικά"
+
+#: describe.c:5631
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Ρύθμιση αναζήτησης κειμένου «%s.%s»"
+
+#: describe.c:5634
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Ρύθμιση αναζήτησης κειμένου «%s»"
+
+#: describe.c:5638
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Αναλυτής: «%s.%s»"
+
+#: describe.c:5641
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Αναλυτής: «%s»"
+
+#: describe.c:5722
+msgid "List of foreign-data wrappers"
+msgstr "Λίστα περιτύλιξης ξένων δεδομένων"
+
+#: describe.c:5750
+msgid "Foreign-data wrapper"
+msgstr "Περιτύλιξη ξένων δεδομένων"
+
+#: describe.c:5768 describe.c:5958
+msgid "Version"
+msgstr "Έκδοση"
+
+#: describe.c:5799
+msgid "List of foreign servers"
+msgstr "Λίστα ξενικών διακομιστών"
+
+#: describe.c:5824 describe.c:5883
+msgid "Server"
+msgstr "Διακομιστής"
+
+#: describe.c:5825
+msgid "User name"
+msgstr "Όνομα χρήστη"
+
+#: describe.c:5855
+msgid "List of user mappings"
+msgstr "Λίστα αντιστοιχιών χρηστών"
+
+#: describe.c:5928
+msgid "List of foreign tables"
+msgstr "Λίστα ξενικών πινάκων"
+
+#: describe.c:5980
+msgid "List of installed extensions"
+msgstr "Λίστα εγκατεστημένων επεκτάσεων"
+
+#: describe.c:6028
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "Δεν βρέθηκε καμία επέκταση με το όνομα «%s»."
+
+#: describe.c:6031
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Δεν βρέθηκαν επεκτάσεις."
+
+#: describe.c:6075
+msgid "Object description"
+msgstr "Περιγραφή αντικειμένου"
+
+#: describe.c:6085
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Αντικείμενα στην επέκταση «%s»"
+
+#: describe.c:6126
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "ακατάλληλο αναγνωρισμένο όνομα (πάρα πολλά διάστικτα ονόματα): %s"
+
+#: describe.c:6140
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "οι παραπομπές μεταξύ βάσεων δεδομένων δεν είναι υλοποιημένες: %s"
+
+#: describe.c:6171 describe.c:6298
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει δημοσιεύσεις."
+
+#: describe.c:6188 describe.c:6376
+msgid "All tables"
+msgstr "Όλοι οι πίνακες"
+
+#: describe.c:6189 describe.c:6377
+msgid "Inserts"
+msgstr "Εισαγωγές"
+
+#: describe.c:6190 describe.c:6378
+msgid "Updates"
+msgstr "Ενημερώσεις"
+
+#: describe.c:6191 describe.c:6379
+msgid "Deletes"
+msgstr "Διαγραφές"
+
+#: describe.c:6195 describe.c:6381
+msgid "Truncates"
+msgstr "Περικοπές"
+
+#: describe.c:6199 describe.c:6383
+msgid "Via root"
+msgstr "Διαμέσου υπερχρήστη"
+
+#: describe.c:6221
+msgid "List of publications"
+msgstr "Λίστα δημοσιεύσεων"
+
+#: describe.c:6345
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "Δεν βρέθηκε καμία δημοσίευση με όνομα «%s»."
+
+#: describe.c:6348
+#, c-format
+msgid "Did not find any publications."
+msgstr "Δεν βρέθηκε καμία δημοσίευση."
+
+#: describe.c:6372
+#, c-format
+msgid "Publication %s"
+msgstr "Δημοσίευση %s"
+
+#: describe.c:6425
+msgid "Tables:"
+msgstr "Πίνακες:"
+
+#: describe.c:6437
+msgid "Tables from schemas:"
+msgstr "Πίνακες από σχήματα:"
+
+#: describe.c:6481
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει συνδρομές."
+
+#: describe.c:6497
+msgid "Publication"
+msgstr "Δημοσίευση"
+
+#: describe.c:6506
+msgid "Binary"
+msgstr "Δυαδικό"
+
+#: describe.c:6507
+msgid "Streaming"
+msgstr "Ροής"
+
+#: describe.c:6514
+msgid "Two-phase commit"
+msgstr "Συναλλαγή δύο φάσεων"
+
+#: describe.c:6515
+msgid "Disable on error"
+msgstr "Απενεργοποίηση μετά από σφάλμα"
+
+#: describe.c:6520
+msgid "Synchronous commit"
+msgstr "Σύγχρονη δέσμευση"
+
+#: describe.c:6521
+msgid "Conninfo"
+msgstr "Conninfo"
+
+#: describe.c:6527
+msgid "Skip LSN"
+msgstr "Παράλειψη LSN"
+
+#: describe.c:6554
+msgid "List of subscriptions"
+msgstr "Λίστα συνδρομών"
+
+#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900
+msgid "AM"
+msgstr "ΑΜ"
+
+#: describe.c:6617
+msgid "Input type"
+msgstr "Τύπος εισόδου"
+
+#: describe.c:6618
+msgid "Storage type"
+msgstr "Τύπος αποθήκευσης"
+
+#: describe.c:6619
+msgid "Operator class"
+msgstr "Κλάση χειριστή"
+
+#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901
+msgid "Operator family"
+msgstr "Οικογένεια χειριστή"
+
+#: describe.c:6667
+msgid "List of operator classes"
+msgstr "Λίστα οικογένειας κλάσεων"
+
+#: describe.c:6714
+msgid "Applicable types"
+msgstr "Εφαρμόσιμοι τύποι"
+
+#: describe.c:6756
+msgid "List of operator families"
+msgstr "Λίστα οικογενειών χειριστών"
+
+#: describe.c:6807
+msgid "Operator"
+msgstr "Χειριστής"
+
+#: describe.c:6808
+msgid "Strategy"
+msgstr "Στρατηγική"
+
+#: describe.c:6809
+msgid "ordering"
+msgstr "διάταξη"
+
+#: describe.c:6810
+msgid "search"
+msgstr "αναζήτηση"
+
+#: describe.c:6811
+msgid "Purpose"
+msgstr "Στόχος"
+
+#: describe.c:6816
+msgid "Sort opfamily"
+msgstr "Διάταξη opfamily"
+
+#: describe.c:6855
+msgid "List of operators of operator families"
+msgstr "Λίστα χειριστών των οικογενειών χειριστών"
+
+#: describe.c:6902
+msgid "Registered left type"
+msgstr "Καταχωρημένος αριστερός τύπος"
+
+#: describe.c:6903
+msgid "Registered right type"
+msgstr "Καταχωρημένος δεξιός τύπος"
+
+#: describe.c:6904
+msgid "Number"
+msgstr "Αριθμός"
+
+#: describe.c:6948
+msgid "List of support functions of operator families"
+msgstr "Λίστα συναρτήσεων υποστήριξης των οικογενειών χειριστών"
+
+#: describe.c:6979
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7000
+msgid "Large objects"
+msgstr "Μεγάλα αντικείμενα"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql είναι το διαδραστικό τερματικό της PostgreSQL.\n"
+"\n"
+
+#: help.c:76 help.c:393 help.c:473 help.c:516
+msgid "Usage:\n"
+msgstr "Χρήση:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [ΕΠΙΛΟΓΗ]... [DBNAME [USERNAME]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "Γενικές επιλογές:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=COMMAND εκτέλεσε μόνο μία μονή εντολή (SQL ή εσωτερική) και έξελθε\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=DBNAME ονομασία βάσης δεδομένων στην οποία θα συνδεθείτε (προεπιλογή: «%s»)\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=FILENAME εκτέλεσε εντολές από αρχείο, στη συνέχεια έξοδος\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list απαρίθμησε τις διαθέσιμες βάσεις δεδομένων, στη συνέχεια έξοδος\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" όρισε την μεταβλητή της psql NAME στην τιμή VALUE\n"
+" (π.χ., -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc να μην διαβαστεί το αρχείο εκκίνησης (~/.psqlrc)\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 («one»), --single-transaction\n"
+" εκτέλεσε ως μεμονωμένη συναλλαγή (εάν δεν είναι διαδραστική)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] εμφάνισε αυτής της βοήθειας και, στη συνέχεια, έξοδος\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands απαρίθμησε τις εντολές ανάποδης καθέτου και, στη συνέχεια, έξοδος\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables απαρίθμησε τις ειδικές μεταβλητές και, στη συνέχεια, έξοδος\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Επιλογές εισόδου και εξόδου:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all echo όλη την είσοδο από σενάριο\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors echo όλες τις αποτυχημένες εντολές\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries echo τις εντολές που αποστέλλονται στο διακομιστή\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden εμφάνισε ερωτήματα που δημιουργούνται από εσωτερικές εντολές\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=FILENAME στείλε την καταγραφή της συνεδρίας στο αρχείο\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline απενεργοποιήσε την βελτιωμένη επεξεργασία γραμμής εντολών (readline)\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=FILENAME στείλε τα αποτελέσματα ερωτημάτων σε αρχείο (ή |pipe)\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet εκτέλεσε σιωπηλά (καθόλου μηνύματα, μόνο έξοδος ερωτημάτων)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step λειτουργία μονού βήματος (επιβεβαίωσε κάθε ερώτημα)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line λειτουργία μονής γραμμής (το τέλος της γραμμής τερματίζει την εντολή SQL)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Επιλογές μορφής εξόδου:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align λειτουργία εξόδου πίνακα μη ευθυγραμμισμένη λειτουργία εξόδου πίνακα\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv λειτουργία εξόδου πίνακα CSV (τιμές διαχωρισμένες με κόμματα)\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=STRING\n"
+" διαχωριστικό πεδίου για μη ευθυγραμμισμένη έξοδο (προεπιλογή: \"%s\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html λειτουργία εξόδου πίνακα HTML\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=VAR[=ARG] όρισε την επιλογή εκτύπωσης VAR σε ARG (δείτε την εντολή \\pset)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=STRING\n"
+" διαχωριστικό εγγραφών για μη ευθυγραμμισμένη έξοδο (προεπιλογή: νέα γραμμή)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only εκτύπωσε μόνο γραμμές\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=TEXT όρισε τα χαρακτηριστικά ετικετών πίνακα HTML (π.χ. πλάτος, περίγραμμα)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded ενεργοποίησε λειτουργία εκτεταμένης εξόδου πίνακα\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" όρισε το διαχωριστικό πεδίου για μη ευθυγραμμισμένη έξοδο στο μηδενικό byte\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" όρισε το διαχωριστικό εγγραφών για μη ευθυγραμμισμένη έξοδο στο μηδενικό byte\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Επιλογές σύνδεσης:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr " -h, --host=HOSTNAME κεντρικός υπολογιστής διακομιστή βάσης δεδομένων ή κατάλογος υποδοχών (προεπιλογή: «%s»)\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "τοπική υποδοχή"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT θύρα διακομιστή βάσης δεδομένων (προεπιλογή: «%s»)\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=USERNAME όνομα χρήστη βάσης δεδομένων (προεπιλογή: «%s»)\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός πρόσβασης\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password αναγκαστική προτροπή κωδικού πρόσβασης (πρέπει να συμβεί αυτόματα)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Για περισσότερες πληροφορίες, πληκτρολογήστε \"\\?\" (για εσωτερικές εντολές) ή «\\help» (για SQL\n"
+"εντολές) μέσα από το psql, ή συμβουλευτείτε την ενότητα psql στην τεκμηρίωση της PostgreSQL\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Υποβάλετε αναφορές σφάλματων σε <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αρχική σελίδα: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "Γενικά\n"
+
+#: help.c:192
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright εμφάνισε τους όρους χρήσης και διανομής της PostgreSQL\n"
+
+#: help.c:193
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr " \\crosstabview [COLUMNS] εκτέλεσε το ερώτημα και εμφάνισε τo αποτελέσμα σε όψη crosstab\n"
+
+#: help.c:194
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose εμφάνισε το πιο πρόσφατο μήνυμα σφάλματος στη μέγιστη λεπτομέρεια\n"
+
+#: help.c:195
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPTIONS)] [FILE] εκτέλεσε το ερώτημα (και στείλε το αποτελέσματα σε αρχείο ή |pipe).\n"
+" \\g χωρίς ορίσματα ισοδυναμεί με το ερωματικό\n"
+
+#: help.c:197
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc περίγραψε το αποτέλεσμα του ερωτήματος, χωρίς να εκτελεστεί\n"
+
+#: help.c:198
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec εκτέλεσε το ερώτημα και, στη συνέχεια, εκτέλεσε κάθε τιμή του αποτελέσματός της\n"
+
+#: help.c:199
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [PREFIX] εκτέλεσε το ερώτημα και αποθήκευσε το αποτελέσμα σε psql μεταβλητές\n"
+
+#: help.c:200
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(OPTIONS)] [FILE] όμοια με \\g, αλλά επιβάλλει λειτουργία εκτεταμένης εξόδου\n"
+
+#: help.c:201
+msgid " \\q quit psql\n"
+msgstr " \\q τερμάτισε psql\n"
+
+#: help.c:202
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SEC] εκτέλεση του ερωτήματος κάθε SEC δευτερόλεπτα\n"
+
+#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304
+#: help.c:324 help.c:337 help.c:346
+msgid "\n"
+msgstr "\n"
+
+#: help.c:205
+msgid "Help\n"
+msgstr "Βοήθεια\n"
+
+#: help.c:207
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] εμφάνισε την βοήθεια για τις εντολές ανάποδης καθέτου\n"
+
+#: help.c:208
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options εμφάνισε την βοήθεια για τις επιλογές εντολών γραμμής της psql\n"
+
+#: help.c:209
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables εμφάνισε την βοήθεια για τις ειδικές μεταβλητές\n"
+
+#: help.c:210
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [NAME] βοήθεια για την σύνταξη των εντολών SQL, * για όλες τις εντολών\n"
+
+#: help.c:213
+msgid "Query Buffer\n"
+msgstr "Ενδιάμεση μνήμη Ερωτήματος\n"
+
+#: help.c:214
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [FILE] [LINE] επεξεργάσου την ενδιάμεση μνήμη (ή αρχείο) ερωτήματος με εξωτερικό επεξεργαστή κειμένου\n"
+
+#: help.c:215
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [FUNCNAME [LINE]] επεξεργάσου τον ορισμό της συνάρτησης με εξωτερικό επεξεργαστή κειμένου\n"
+
+#: help.c:216
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ef [FUNCNAME [LINE]] επεξεργάσου τον ορισμό της όψης με εξωτερικό επεξεργαστή κειμένου\n"
+
+#: help.c:217
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p εμφάνισε τα περιοχόμενα της ενδιάμεσης μνήμης ερωτήματος\n"
+
+#: help.c:218
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r επαναφορά (αρχικοποίηση) της ενδιάμεσης μνήμης ερωτήματος\n"
+
+#: help.c:220
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [FILE] εμφάνισε το ιστορικό η αποθήκευσε το σε αρχείο\n"
+
+#: help.c:222
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w FILE γράψε την ενδιάμεση μνήμη ερωτήματος σε αρχείο\n"
+
+#: help.c:225
+msgid "Input/Output\n"
+msgstr "Είσοδος/Έξοδος\n"
+
+#: help.c:226
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... εκτέλεσε SQL COPY με ροή δεδομένων σε διακομιστή πελάτη\n"
+
+#: help.c:227
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [STRING] γράψε την στοιχειοσειρά στην τυπική έξοδο (-n για παράληψη νέας γραμμής)\n"
+
+#: help.c:228
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i FILE εκτέλεσε εντολές από αρχείο\n"
+
+#: help.c:229
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir FILE όπως \\i, αλλά σε σχέση με την τοποθεσία του τρέχοντος σεναρίου\n"
+
+#: help.c:230
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [FILE] στείλε όλα τα αποτελέσματα ερωτημάτων σε αρχείο ή |pipe\n"
+
+#: help.c:231
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr " \\qecho [-n] [STRING] γράψε την στοιχειοσειρά στην ροή εξόδου \\o (-n για παράληψη νέας γραμμής)\n"
+
+#: help.c:232
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [STRING] γράψε την στοιχειοσειρά στο τυπικό σφάλμα (-n για παράληψη νέας γραμμής)\n"
+
+#: help.c:235
+msgid "Conditional\n"
+msgstr "Υπό συνθήκη\n"
+
+#: help.c:236
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR έναρξη υπό συνθήκης μπλοκ\n"
+
+#: help.c:237
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR εναλλακτική λύση εντός του τρέχοντος μπλοκ υπό όρους\n"
+
+#: help.c:238
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else τελική εναλλακτική λύση εντός του τρέχοντος μπλοκ υπό όρους\n"
+
+#: help.c:239
+msgid " \\endif end conditional block\n"
+msgstr " \\endif τερματισμός μπλοκ υπό όρους\n"
+
+#: help.c:242
+msgid "Informational\n"
+msgstr "Πληροφοριακά\n"
+
+#: help.c:243
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (επιλογές: S = εμφάνισε αντικείμενα συστήματος, + = επιπλέον λεπτομέριες)\n"
+
+#: help.c:244
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] εμφάνισε πίνακες, όψεις και σειρές\n"
+
+#: help.c:245
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NAME περιέγραψε πίνακα, όψη, σειρά, ή ευρετήριο\n"
+
+#: help.c:246
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [PATTERN] απαρίθμησε συγκεντρωτικά\n"
+
+#: help.c:247
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [PATTERN] απαρίθμησε μεθόδους πρόσβασης\n"
+
+#: help.c:248
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] απαρίθμησε κλάσεις χειριστή\n"
+
+#: help.c:249
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] απαρίθμησε οικογένειες χειριστών\n"
+
+#: help.c:250
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] απαρίθμησε χειριστές των οικογενειών χειριστών\n"
+
+#: help.c:251
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] απαρίθμησε συναρτήσεις των οικογενειών χειριστών\n"
+
+#: help.c:252
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [PATTERN] απαρίθμησε πινακοχώρους\n"
+
+#: help.c:253
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [PATTERN] απαρίθμησε μετατροπές\n"
+
+#: help.c:254
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [PATTERN] απαρίθμησε παραμέτρους ρύθμισης\n"
+
+#: help.c:255
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [PATTERN] απαρίθμησε casts\n"
+
+#: help.c:256
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [PATTERN] εμφάνισε περιγραφές αντικειμένων που δεν φαίνονται πουθενά αλλού\n"
+
+#: help.c:257
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [PATTERN] απαρίθμησε πεδία\n"
+
+#: help.c:258
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [PATTERN] απαρίθμησε προεπιλεγμένα προνόμια\n"
+
+#: help.c:259
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [PATTERN] απαρίθμησε ξενικούς πίνακες\n"
+
+#: help.c:260
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [PATTERN] απαρίθμησε ξενικούς διακομιστές\n"
+
+#: help.c:261
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [PATTERN] απαρίθμησε ξενικούς πίνακες\n"
+
+#: help.c:262
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [PATTERN] απαρίθμησε αντιστοιχίες χρηστών\n"
+
+#: help.c:263
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [PATTERN] απαρίθμησε περιτυλίξεις ξένων δεδομένων\n"
+
+#: help.c:264
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN …]]\n"
+" απαρίθμησε συναρτήσεις [μόνο agg/normal/procedures/trigger/window]\n"
+
+#: help.c:266
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [PATTERN] απαρίθμησε ρυθμίσεις αναζήτησης κειμένου\n"
+
+#: help.c:267
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [PATTERN] απαρίθμησε λεξικά αναζήτησης κειμένου\n"
+
+#: help.c:268
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [PATTERN] απαρίθμησε αναλυτές αναζήτησης κειμένου\n"
+
+#: help.c:269
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [PATTERN] απαρίθμησε πρότυπα αναζήτησης κειμένου\n"
+
+#: help.c:270
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [PATTERN] απαρίθμησε ρόλους\n"
+
+#: help.c:271
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [PATTERN] απαρίθμησε ευρετήρια\n"
+
+#: help.c:272
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] απαρίθμησε μεγάλα αντικείμενα, όπως \\lo_list\n"
+
+#: help.c:273
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [PATTERN] απαρίθμησε διαδικαστικές γλώσσες\n"
+
+#: help.c:274
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [PATTERN] απαρίθμησε υλοποιημένες όψεις\n"
+
+#: help.c:275
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [PATTERN] απαρίθμησε σχήματα\n"
+
+#: help.c:276
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" απαρίθμησε χειριστές\n"
+
+#: help.c:278
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [PATTERN] απαρίθμησε συρραφές\n"
+
+#: help.c:279
+msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp [PATTERN] απαρίθμησε προνόμια πρόσβασης πίνακα, όψης και σειράς\n"
+
+#: help.c:280
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[itn+] [PATTERN] απαρίθμησε διαχωρισμένες σχέσεις [μόνο ευρετήριο/πίνακα] [n=nested]\n"
+
+#: help.c:281
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr " \\drds [ROLEPTRN [DBPTRN]] απαρίθμησε ρυθμίσεις ρόλου ανά βάση δεδομένων\n"
+
+#: help.c:282
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [PATTERN] απαρίθμησε δημοσιεύσεις αναπαραγωγής\n"
+
+#: help.c:283
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [PATTERN] απαρίθμησε συνδρομές αναπαραγωγής\n"
+
+#: help.c:284
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [PATTERN] απαρίθμησε ακολουθίες\n"
+
+#: help.c:285
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [PATTERN] απαρίθμησε πίνακες\n"
+
+#: help.c:286
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [PATTERN] απαρίθμησε τύπους δεδομένων\n"
+
+#: help.c:287
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [PATTERN] απαρίθμησε ρόλους\n"
+
+#: help.c:288
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [PATTERN] απαρίθμησε όψεις\n"
+
+#: help.c:289
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [PATTERN] απαρίθμησε προεκτάσεις\n"
+
+#: help.c:290
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [PATTERN] απαρίθμησε εναύσματα συμβάντων\n"
+
+#: help.c:291
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [PATTERN] απαρίθμησε εναύσματα συμβάντων\n"
+
+#: help.c:292
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [PATTERN] απαρίθμησε βάσεις δεδομένων\n"
+
+#: help.c:293
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNCNAME εμφάνισε τον ορισμό μίας συνάρτησης\n"
+
+#: help.c:294
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VIEWNAME εμφάνισε τον ορισμό μίας όψης\n"
+
+#: help.c:295
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [PATTERN] όπως \\dp\n"
+
+#: help.c:298
+msgid "Large Objects\n"
+msgstr "Μεγάλα αντικείμενα\n"
+
+#: help.c:299
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export LOBOID FILE εγγραφή μεγάλου αντικειμένου σε αρχείο\n"
+
+#: help.c:300
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import FILE [COMMENT]\n"
+" ανάγνωση μεγάλων αντικειμένων από αρχείο\n"
+
+#: help.c:302
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] απαρίθμησε μεγάλα αντικείμενα\n"
+
+#: help.c:303
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID διαγραφή μεγάλου αντικειμένου\n"
+
+#: help.c:306
+msgid "Formatting\n"
+msgstr "Μορφοποίηση\n"
+
+#: help.c:307
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a εναλλαγή μεταξύ μη ευθυγραμμισμένης και ευθυγραμμισμένης μορφής εξόδου\n"
+
+#: help.c:308
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [STRING] όρισε τίτλο πίνακα, ή αναίρεσε εάν κενό\n"
+
+#: help.c:309
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [STRING] εμφάνισε ή όρισε τον διαχωριστή πεδίου για μη ευθυγραμμισμένη έξοδο ερωτήματος\n"
+
+#: help.c:310
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H εναλλαγή λειτουργίας εξόδου HTML (επί του παρόντος %s)\n"
+
+#: help.c:312
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NAME [VALUE]] όρισε την επιλογή εξόδου πίνακα\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:319
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] εμφάνισε μόνο γραμμές (επί του παρόντος %s)\n"
+
+#: help.c:321
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [STRING] ορίστε χαρακτηριστικά ετικέτας <table> HTML, ή αναιρέστε εάν δεν υπάρχουν\n"
+
+#: help.c:322
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] εναλλαγή τιμής διευρυμένης εξόδου (επί του παρόντος %s)\n"
+
+#: help.c:323
+msgid "auto"
+msgstr "αυτόματο"
+
+#: help.c:326
+msgid "Connection\n"
+msgstr "Σύνδεση\n"
+
+#: help.c:328
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" σύνδεση σε νέα βάση δεδομένων (επί του παρόντος «%s»)\n"
+
+#: help.c:332
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" σύνδεση σε νέα βάση δεδομένων (επί του παρόντος καμία σύνδεση)\n"
+
+#: help.c:334
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo εμφάνιση πληροφοριών σχετικά με την παρούσα σύνδεση\n"
+
+#: help.c:335
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [ENCODING] εμφάνισε ή όρισε την κωδικοποίηση του πελάτη\n"
+
+#: help.c:336
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [USERNAME] άλλαξε με ασφάλεια τον κωδικό πρόσβασης ενός χρήστη\n"
+
+#: help.c:339
+msgid "Operating System\n"
+msgstr "Λειτουργικό σύστημα\n"
+
+#: help.c:340
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [DIR] άλλαξε τον παρόν κατάλογο εργασίας\n"
+
+#: help.c:341
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\setenv NAME [VALUE] λήψη μεταβλητής περιβάλλοντος\n"
+
+#: help.c:342
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAME [VALUE] όρισε ή αναίρεσε μεταβλητή περιβάλλοντος\n"
+
+#: help.c:343
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] εναλλαγή χρονισμού των εντολών (επί του παρόντος %s)\n"
+
+#: help.c:345
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [COMMAND] εκτέλεσε εντολή σε κέλυφος ή ξεκίνησε διαδραστικό κέλυφος\n"
+
+#: help.c:348
+msgid "Variables\n"
+msgstr "Μεταβλητές\n"
+
+#: help.c:349
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TEXT] NAME προέτρεψε τον χρήστη να ορίσει εσωτερική μεταβλητή\n"
+
+#: help.c:350
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [NAME [VALUE]] όρισε εσωτερική μεταβλητή, ή απαρίθμησέ τες όλες εάν δεν υπάρχουν παράμετροι\n"
+
+#: help.c:351
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NAME αναίρεσε (διέγραψε) εσωτερική μεταβλητή\n"
+
+#: help.c:390
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"Απαρίθμηση των ειδικά επεξεργασμένων μεταβλητών\n"
+"\n"
+
+#: help.c:392
+msgid "psql variables:\n"
+msgstr "psql μεταβλητές:\n"
+
+#: help.c:394
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAME=VALUE\n"
+" ή \\set NAME VALUE μέσα σε psql\n"
+"\n"
+
+#: help.c:396
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" εφόσον ορισμένο, επιτυχημένες εντολές SQL ολοκληρώνονται αυτόματα\n"
+
+#: help.c:398
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" καθορίζει τον τύπο (πεζά, κεφαλαία) για την ολοκλήρωση όρων SQL\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:401
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" ονομασία της συνδεδεμένης βάσης δεδομένων\n"
+
+#: help.c:403
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" ελέγχει ποία είσοδος γράφεται στην τυπική έξοδο\n"
+" [all, errors, none, queries]\n"
+"\n"
+
+#: help.c:406
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" εάν έχει οριστεί, εμφανίστε εσωτερικά ερωτήματα που εκτελούνται από εντολές ανάστρωσής τους.\n"
+" εάν οριστεί σε \"noexec\", απλά δείξτε τους χωρίς εκτέλεση\n"
+
+#: help.c:409
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" τρέχουσα κωδικοποίηση χαρακτήρων του προγράμματος-πελάτη\n"
+
+#: help.c:411
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr ""
+" ERROR\n"
+" αληθές εάν το τελευταίο ερώτημα απέτυχε, διαφορετικά ψευδές\n"
+
+#: help.c:413
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" αριθμός των σειρών αποτελεσμάτων για λήψη και εμφάνιση ανά επανάλληψη (0 = απεριόριστος)\n"
+
+#: help.c:415
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" εάν έχει οριστεί, δεν εμφανίζονται μέθοδοι πρόσβασης πίνακα\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" εάν έχει οριστεί, δεν εμφανίζονται μέθοδοι συμπίεσης\n"
+
+#: help.c:419
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" ελέγχει το ιστορικό εντολών [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:421
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" όνομα αρχείου που χρησιμοποιείται για την αποθήκευση του ιστορικού εντολών\n"
+
+#: help.c:423
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" μέγιστος αριθμός εντολών που θα αποθηκευτούν στο ιστορικό εντολών\n"
+
+#: help.c:425
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" ο συνδεδεμένος κεντρικός υπολογιστής διακομιστή βάσης δεδομένων\n"
+
+#: help.c:427
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" αριθμός των EOF που απαιτούνται για τον τερματισμό μιας διαδραστικής συνεδρίας\n"
+
+#: help.c:429
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" τιμή του τελευταίου επηρεασμένου OID\n"
+
+#: help.c:431
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" μήνυμα και SQLSTATE του τελευταίου σφάλματος, ή κενή συμβολοσειρά και \"00000\" εάν δεν\n"
+
+#: help.c:434
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" εάν έχει οριστεί, ένα σφάλμα δεν διακόπτει μια συναλλαγή (χρησιμοποιεί έμμεσα σημεία αποθήκευσης)\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" σταμάτησε την ομαδική εκτέλεση μετά από σφάλμα\n"
+
+#: help.c:438
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" θύρα διακομιστή της τρέχουσας σύνδεσης\n"
+
+#: help.c:440
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" ορίζει την τυπική προτροπή psql\n"
+
+#: help.c:442
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" καθορίζει την προτροπή που χρησιμοποιείται όταν μια πρόταση συνεχίζεται από προηγούμενη γραμμή\n"
+
+#: help.c:444
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" καθορίζει την προτροπή που χρησιμοποιείται κατά την διάρκεια COPY … FROM STDIN\n"
+
+#: help.c:446
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" σιωπηλή εκτέλεση(όμοια με την επιλογή -q)\n"
+
+#: help.c:448
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" αριθμός των επηρεασμένων ή επιστρεφομένων σειρών του τελευταίου ερωτήματος, ή 0\n"
+
+#: help.c:450
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" έκδοση διακομιστή (σε σύντομη συμβολοσειρά ή αριθμητική μορφή)\n"
+
+#: help.c:453
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" εμφάνισε όλα τα αποτελέσματα ερωτημάτων (\\;) αντί μόνο του τελευταίου\n"
+
+#: help.c:455
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" ελέγχει την εμφάνιση των πεδίων του περιεχομένου μηνύματος [never, errors, always]\n"
+
+#: help.c:457
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" εάν έχει οριστεί, το τέλος γραμμής ολοκληρώνει τα ερωτήματα SQL (όμοια με την επιλογή -S)\n"
+
+#: help.c:459
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" λειτουργία μονού-βήματος(όμοια με την επιλογή -s)\n"
+
+#: help.c:461
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" SQLSTATE του τελευταίου ερωτήματος, ή «00000» εάν δεν υπήρξαν σφάλματα\n"
+
+#: help.c:463
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" ο τρέχων συνδεδεμένος χρήστης βάσης δεδομένων\n"
+
+#: help.c:465
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" ελέγχει την περιφραστικότητα των αναφορών σφαλμάτων [default, verbose, terse, sqlstate]\n"
+
+#: help.c:467
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" η έκδοση της psql (σε περιγραφική συμβολοσειρά, σύντομη συμβολοσειρά, ή αριθμητική μορφή)\n"
+
+#: help.c:472
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Ρυθμίσεις εμφάνισης:\n"
+
+#: help.c:474
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAME=VALUE\n"
+" ή \\set NAME VALUE μέσα σε συνεδρία psql\n"
+"\n"
+
+#: help.c:476
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" στυλ περιγράμματος (αριθμός)\n"
+
+#: help.c:478
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" πλάτος προορισμού κατά την εμφάνιση αναδιπλωμένης μορφής\n"
+
+#: help.c:480
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (ή x)\n"
+" διευρυμένη έξοδος [on, off, auto]\n"
+
+#: help.c:482
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" διαχωριστικό πεδίου σε μορφή μή ευθυγραμισμένης εξόδου (προκαθοριμένο «%s»)\n"
+
+#: help.c:485
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" ορίζει το διαχωριστικό πεδίου για τη μορφή μη ευθυγραμμισμένης εξόδου στο μηδενικό byte\n"
+
+#: help.c:487
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" ενεργοποιεί ή απενεργοποιεί την εμφάνιση του υποσέλιδου σε πίνακα [on, off]\n"
+
+#: help.c:489
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" ορίζει τη μορφή εξόδου [unaligned, aligned, wrapped, html, asciidoc, …]\n"
+
+#: help.c:491
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" ορίζει τη μορφή περιγράμματος [ascii, old-ascii, unicode]\n"
+
+#: help.c:493
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" ορίζει τη συμβολοσειρά που θα εκτυπωθεί στη θέση κενής τιμής\n"
+
+#: help.c:495
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" ενεργοποίηση εμφάνισης ενός χαρακτήρα εντοπιότητας για το διαχωρισμό ομάδων ψηφίων\n"
+
+#: help.c:497
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" Pager\n"
+" ελέγχει πότε χρησιμοποιείται εξωτερικός σελιδοποιητής [yes, no, always]\n"
+
+#: help.c:499
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" διαχωριστικό εγγραφών (σειράς) κατά την έξοδο μη ευθυγραμμισμένης μορφής\n"
+
+#: help.c:501
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" ορίζει το διαχωριστικό εγγραφών στο μηδενικό byte κατά την έξοδο μη ευθυγραμμισμένης μορφής\n"
+
+#: help.c:503
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (ή T)\n"
+" καθορίζει τα χαρακτηριστικά ενός πίνακα tag σε μορφή HTML, ή καθορίζει\n"
+" αναλογικό πλάτος στηλών για τύπους δεδομένων με αριστερή στοίχιση σε μορφή latex-longtable\n"
+
+#: help.c:506
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" ορίζει τον τίτλο πίνακα για χρήση στους επόμενα εκτυπωμένους πίνακες\n"
+
+#: help.c:508
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" εάν έχει ορισθεί, τότε εμφανίζονται μόνο τα δεδομένα πίνακα\n"
+
+#: help.c:510
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" ορισμός του στυλ γραμμής Unicode [single, double]\n"
+
+#: help.c:515
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Μεταβλητές περιβάλλοντος:\n"
+
+#: help.c:519
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NAME=VALUE [NAME=VALUE] psql …\n"
+" ή \\setenv ΟΝΟΜΑ [ΤΙΜΗ] μέσα σε συνεδρία psql\n"
+"\n"
+
+#: help.c:521
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" ορίστε NAME=VALUE\n"
+" psql ...\n"
+" ή \\setenv NAME [VALUE] μέσα σε συνεδρία psql\n"
+"\n"
+
+#: help.c:524
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" αριθμός στηλών για αναδιπλωμένη μορφή\n"
+
+#: help.c:526
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" όμοια με την παράμετρο σύνδεσης application_name\n"
+
+#: help.c:528
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" όμοια με την παράμετρο σύνδεσης dbname\n"
+
+#: help.c:530
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" όμοια με την παράμετρο της σύνδεσης κεντρικού υπολογιστή\n"
+
+#: help.c:532
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" αρχείο κωδικών πρόσβασης\n"
+
+#: help.c:534
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" κωδικός πρόσβασης σύνδεσης (δεν συνιστάται)\n"
+
+#: help.c:536
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" όμοια με την παράμετρο σύνδεσης θύρας\n"
+
+#: help.c:538
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" όμοια με την παράμετρο σύνδεσης χρήστη\n"
+
+#: help.c:540
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" πρόγραμμα επεξεργασίας κειμένου που χρησιμοποιείται από τις εντολές \\e, \\ef και \\ev\n"
+
+#: help.c:542
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" τρόπος καθορισμού αριθμού γραμμής κατά την κλήση του προγράμματος επεξεργασίας κειμένου\n"
+
+#: help.c:544
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" εναλλακτική τοποθεσία για το αρχείο ιστορικού εντολών\n"
+
+#: help.c:546
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" όνομα του εξωτερικού προγράμματος σελιδοποίησης\n"
+
+#: help.c:549
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" όνομα του εξωτερικού προγράμματος σελιδοποίησης για \\watch\n"
+
+#: help.c:552
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" εναλλακτική τοποθεσία για το αρχείο .psqlrc του χρήστη\n"
+
+#: help.c:554
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" shell που χρησιμοποιείται κατά την εντολή \\!\n"
+
+#: help.c:556
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" κατάλογος για προσωρινά αρχεία\n"
+
+#: help.c:616
+msgid "Available help:\n"
+msgstr "Διαθέσιμη βοήθεια:\n"
+
+#: help.c:711
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Εντολή: %s\n"
+"Περιγραφή: %s\n"
+"Σύνταξη:\n"
+"%s\n"
+"\n"
+"Διεύθυνση URL: %s\n"
+"\n"
+
+#: help.c:734
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Δεν υπάρχει διαθέσιμη βοήθεια για το \"%s\".\n"
+"Δοκιμάστε \\h χωρίς παραμέτρους για να δείτε τη διαθέσιμη βοήθεια.\n"
+
+#: input.c:217
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση από αρχείο: %m"
+
+#: input.c:478 input.c:516
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αποθήκευση του ιστορικού στο αρχείο «%s»: %m"
+
+#: input.c:535
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "το ιστορικό δεν υποστηρίζεται από την παρούσα εγκατάσταση"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: δεν είναι συνδεμένο σε μία βάση δεδομένων"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: η τρέχουσα συναλλαγή ματαιώθηκε"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: άγνωστη κατάσταση συναλλαγής"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: με διαφυγή"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Χρησιμοποιείστε «\\q» για να εξέλθετε %s.\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"Η είσοδος είναι μια απόθεση PostgreSQL προσαρμοσμένης μορφής.\n"
+"Χρησιμοποιήστε το πρόγραμμα γραμμής εντολών pg_restore για να επαναφέρετε αυτήν την απόθεση σε μια βάση δεδομένων.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Χρησιμοποιείστε \\? για βοήθεια ή πληκτρολογήστε control-C για να αδειάσετε την ενδιάμεση μνήμη εισόδου."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "Χρησιμοποιείστε \\? για βοήθεια."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Χρησιμοποιείτε psql, τη διασύνδεση γραμμής εντολών της PostgreSQL."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Πληκτρολογείστε: \\copyright για τους όρους διανομής\n"
+" \\h για βοήθεια σχετικά με τις εντολές SQL\n"
+" \\? για βοήθεια σχετικά με τις εντολές psql\n"
+" \\g ή ολοκληρώστε με ερωτηματικό για να εκτελέσετε ερώτημα\n"
+" \\q για έξοδο\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "Χρησιμοποιείστε «\\q» για να εξέλθετε."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "Πληκτρολογείστε control-D για να εξέλθετε."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "Πληκτρολογείστε control-D για να εξέλθετε."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "το ερώτημα παραβλέφθηκε· χρησιμοποιήστε το \\endif ή το Ctrl-C για να κλείσετε το τρέχον υπό συνθήκη \\if μπλοκ"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "έφτασε στο EOF χωρίς να βρεθούν τελικά \\endif(s)"
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "ανολοκλήρωτη συμβολοσειρά με εισαγωγικά"
+
+#: psqlscanslash.l:811
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: έλλειψη μνήμης"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1996
+#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154
+#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228
+#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431
+#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517
+#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594
+#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730
+#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071
+#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171
+#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259
+#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338
+#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396
+#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428
+#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464
+#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499
+#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537
+#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574
+#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606
+#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638
+#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680
+#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030
+#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687
+#: sql_help.c:4735 sql_help.c:4893
+msgid "name"
+msgstr "ονομασία"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846
+#: sql_help.c:3339 sql_help.c:4455
+msgid "aggregate_signature"
+msgstr "aggregate_signature"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "new_name"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3011
+msgid "new_owner"
+msgstr "new_owner"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "new_schema"
+
+#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484
+msgid "where aggregate_signature is:"
+msgstr "όπου aggregate_signature είναι:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911
+#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085
+#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341
+#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527
+#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461
+#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488
+#: sql_help.c:4491
+msgid "argmode"
+msgstr "argmode"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912
+#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2067 sql_help.c:2086
+#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342
+#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528
+#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475
+#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492
+msgid "argname"
+msgstr "argname"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2388 sql_help.c:2597
+#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440
+#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470
+#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493
+msgid "argtype"
+msgstr "argtype"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974
+#: sql_help.c:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343
+#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040
+#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742
+#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956
+msgid "option"
+msgstr "επιλογή"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433
+#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388
+msgid "where option can be:"
+msgstr "όπου option μπορεί να είναι:"
+
+#: sql_help.c:116 sql_help.c:2209
+msgid "allowconn"
+msgstr "allowconn"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210
+#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227
+msgid "connlimit"
+msgstr "connlimit"
+
+#: sql_help.c:118 sql_help.c:2211
+msgid "istemplate"
+msgstr "istemplate"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4187
+msgid "new_tablespace"
+msgstr "new_tablespace"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2398 sql_help.c:2601
+#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675
+msgid "configuration_parameter"
+msgstr "configuration_parameter"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344
+#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467
+#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626
+#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915
+#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014
+#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676
+#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679
+msgid "value"
+msgstr "value"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "target_role"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631
+#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889
+#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338
+#: sql_help.c:4357 sql_help.c:4369
+msgid "schema_name"
+msgstr "schema_name"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "abbreviated_grant_or_revoke"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "όπου abbreviated_grant_or_revoke είναι ένα από:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2437 sql_help.c:2438
+#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575
+#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667
+#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232
+#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933
+#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697
+msgid "role_name"
+msgstr "role_name"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352
+#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774
+#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924
+#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981
+#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088
+#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558
+#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608
+#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651
+#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806
+#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864
+#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921
+#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044
+#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102
+#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105
+msgid "expression"
+msgstr "expression"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "domain_constraint"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852
+#: sql_help.c:1854 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351
+#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993
+msgid "constraint_name"
+msgstr "constraint_name"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "new_constraint_name"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "new_version"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "member_object"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "όπου member_object είναι:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856
+#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860
+#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869
+#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884
+#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894
+#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898
+#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902
+#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4451 sql_help.c:4456
+#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465
+#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477
+#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481
+#: sql_help.c:4482
+msgid "object_name"
+msgstr "object_name"
+
+#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454
+msgid "aggregate_name"
+msgstr "aggregate_name"
+
+#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135
+#: sql_help.c:2137 sql_help.c:3357
+msgid "source_type"
+msgstr "source_type"
+
+#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136
+#: sql_help.c:2138 sql_help.c:3358
+msgid "target_type"
+msgstr "source_type"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133
+#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549
+#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577
+#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834
+#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072
+#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083
+msgid "function_name"
+msgstr "function_name"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542
+msgid "operator_name"
+msgstr "operator_name"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871
+#: sql_help.c:2519 sql_help.c:3481
+msgid "left_type"
+msgstr "source_type"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872
+#: sql_help.c:2520 sql_help.c:3482
+msgid "right_type"
+msgstr "source_type"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2539
+#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500
+msgid "index_method"
+msgstr "source_type"
+
+#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467
+msgid "procedure_name"
+msgstr "procedure_name"
+
+#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473
+msgid "routine_name"
+msgstr "routine_name"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394
+#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662
+#: sql_help.c:3926 sql_help.c:4375
+msgid "type_name"
+msgstr "type_name"
+
+#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599
+#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911
+#: sql_help.c:4360
+msgid "lang_name"
+msgstr "lang_name"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "και aggregate_signature είναι:"
+
+#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275
+msgid "handler_function"
+msgstr "handler_function"
+
+#: sql_help.c:396 sql_help.c:2276
+msgid "validator_function"
+msgstr "validator_function"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "action"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851
+#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1983 sql_help.c:1984
+#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391
+#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629
+#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887
+#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919
+#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955
+#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978
+#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883
+#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997
+#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089
+#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614
+#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877
+#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924
+#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117
+msgid "column_name"
+msgstr "column_name"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "new_column_name"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "όπου action είναι ένα από:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2229
+#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888
+#: sql_help.c:3167 sql_help.c:4141
+msgid "data_type"
+msgstr "data_type"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2230 sql_help.c:2329
+#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911
+#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990
+msgid "collation"
+msgstr "collation"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339
+#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920
+msgid "column_constraint"
+msgstr "column_constraint"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968
+msgid "integer"
+msgstr "integer"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "attribute_option"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340
+#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921
+msgid "table_constraint"
+msgstr "table_constraint"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905
+msgid "trigger_name"
+msgstr "trigger_name"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918
+msgid "parent_table"
+msgstr "parent_table"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2261
+msgid "extension_name"
+msgstr "extension_name"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395
+msgid "execution_cost"
+msgstr "execution_cost"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396
+msgid "result_rows"
+msgstr "result_rows"
+
+#: sql_help.c:547 sql_help.c:2397
+msgid "support_function"
+msgstr "support_function"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2709
+#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881
+#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890
+#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 sql_help.c:3896
+#: sql_help.c:3897 sql_help.c:3899 sql_help.c:3900 sql_help.c:3902
+#: sql_help.c:3903 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918
+#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924
+#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930
+#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335
+#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342
+#: sql_help.c:4343 sql_help.c:4345 sql_help.c:4346 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4351 sql_help.c:4352 sql_help.c:4358
+#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364
+#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370
+#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376
+#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380
+msgid "role_specification"
+msgstr "role_specification"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198
+#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707
+msgid "user_name"
+msgstr "user_name"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716
+#: sql_help.c:3932 sql_help.c:4381
+msgid "where role_specification can be:"
+msgstr "όπου role_specification μπορεί να είναι:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "group_name"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468
+#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930
+#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923
+#: sql_help.c:4372
+msgid "tablespace_name"
+msgstr "group_name"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783
+msgid "index_name"
+msgstr "index_name"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2466 sql_help.c:2500
+#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969
+#: sql_help.c:2996
+msgid "storage_parameter"
+msgstr "storage_parameter"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "column_number"
+
+#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464
+msgid "large_object_oid"
+msgstr "large_object_oid"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889
+msgid "compression_method"
+msgstr "compression_method"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "new_access_method"
+
+#: sql_help.c:725 sql_help.c:2523
+msgid "res_proc"
+msgstr "res_proc"
+
+#: sql_help.c:726 sql_help.c:2524
+msgid "join_proc"
+msgstr "join_proc"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2541
+msgid "strategy_number"
+msgstr "strategy_number"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2543 sql_help.c:2544
+#: sql_help.c:2547 sql_help.c:2548
+msgid "op_type"
+msgstr "op_type"
+
+#: sql_help.c:782 sql_help.c:2545
+msgid "sort_family_name"
+msgstr "index_name"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2546
+msgid "support_number"
+msgstr "support_number"
+
+#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087
+#: sql_help.c:3089
+msgid "argument_type"
+msgstr "argument_type"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779
+#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891
+#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2324
+#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574
+#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770
+#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917
+#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517
+#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885
+#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334
+#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627
+#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884
+#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060
+#: sql_help.c:5122
+msgid "table_name"
+msgstr "table_name"
+
+#: sql_help.c:823 sql_help.c:2576
+msgid "using_expression"
+msgstr "using_expression"
+
+#: sql_help.c:824 sql_help.c:2577
+msgid "check_expression"
+msgstr "check_expression"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624
+msgid "publication_object"
+msgstr "publication_object"
+
+#: sql_help.c:903 sql_help.c:2625
+msgid "publication_parameter"
+msgstr "publication_parameter"
+
+#: sql_help.c:909 sql_help.c:2627
+msgid "where publication_object is one of:"
+msgstr "όπου publication_object είναι ένα από:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662
+#: sql_help.c:3228
+msgid "password"
+msgstr "password"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663
+#: sql_help.c:3229
+msgid "timestamp"
+msgstr "timestamp"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3892
+#: sql_help.c:4341
+msgid "database_name"
+msgstr "database_name"
+
+#: sql_help.c:1073 sql_help.c:2732
+msgid "increment"
+msgstr "increment"
+
+#: sql_help.c:1074 sql_help.c:2733
+msgid "minvalue"
+msgstr "minvalue"
+
+#: sql_help.c:1075 sql_help.c:2734
+msgid "maxvalue"
+msgstr "maxvalue"
+
+#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664
+#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056
+msgid "start"
+msgstr "start"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "restart"
+
+#: sql_help.c:1078 sql_help.c:2736
+msgid "cache"
+msgstr "cache"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "new_target"
+
+#: sql_help.c:1142 sql_help.c:2789
+msgid "conninfo"
+msgstr "conninfo"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790
+msgid "publication_name"
+msgstr "publication_name"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "publication_option"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "refresh_option"
+
+#: sql_help.c:1161 sql_help.c:2791
+msgid "subscription_parameter"
+msgstr "subscription_parameter"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "skip_option"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "partition_name"
+
+#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922
+msgid "partition_bound_spec"
+msgstr "partition_bound_spec"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936
+msgid "sequence_options"
+msgstr "sequence_options"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "sequence_option"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "table_constraint_using_index"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "rewrite_rule_name"
+
+#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961
+msgid "and partition_bound_spec is:"
+msgstr "και partition_bound_spec είναι:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354
+#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963
+#: sql_help.c:2964
+msgid "partition_bound_expr"
+msgstr "partition_bound_expr"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358
+#: sql_help.c:2965 sql_help.c:2966
+msgid "numeric_literal"
+msgstr "numeric_literal"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "και column_constraint είναι:"
+
+#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598
+#: sql_help.c:2934
+msgid "default_expr"
+msgstr "default_expr"
+
+#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935
+msgid "generation_expr"
+msgstr "generation_expr"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947
+#: sql_help.c:2949 sql_help.c:2953
+msgid "index_parameters"
+msgstr "index_parameters"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956
+msgid "reftable"
+msgstr "reftable"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957
+msgid "refcolumn"
+msgstr "refcolumn"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959
+msgid "referential_action"
+msgstr "referential_action"
+
+#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943
+msgid "and table_constraint is:"
+msgstr "και table_constraint είναι:"
+
+#: sql_help.c:1409 sql_help.c:2951
+msgid "exclude_element"
+msgstr "exclude_element"
+
+#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662
+#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054
+msgid "operator"
+msgstr "operator"
+
+#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954
+msgid "predicate"
+msgstr "predicate"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "και table_constraint_using_index είναι:"
+
+#: sql_help.c:1421 sql_help.c:2967
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "index_parameters για περιορισμούς UNIQUE, PRIMARY KEY και EXCLUDE είναι:"
+
+#: sql_help.c:1426 sql_help.c:2972
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "exclude_element σε έναν περιορισμό τύπου EXCLUDE είναι:"
+
+#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912
+#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991
+msgid "opclass"
+msgstr "opclass"
+
+#: sql_help.c:1430 sql_help.c:2976
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "referential_action σε ένα περιορισμό FOREIGN KEY/REFERENCES είναι:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013
+msgid "tablespace_option"
+msgstr "tablespace_option"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "token_type"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "dictionary_name"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "old_dictionary"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "new_dictionary"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3166
+msgid "attribute_name"
+msgstr "attribute_name"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "new_attribute_name"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "new_enum_value"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "neighbor_enum_value"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "existing_enum_value"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "property"
+
+#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748
+#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947
+#: sql_help.c:4350
+msgid "server_name"
+msgstr "server_name"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261
+msgid "view_option_name"
+msgstr "view_option_name"
+
+#: sql_help.c:1698 sql_help.c:3262
+msgid "view_option_value"
+msgstr "view_option_value"
+
+#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958
+msgid "table_and_columns"
+msgstr "table_and_columns"
+
+#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745
+#: sql_help.c:4185 sql_help.c:4959
+msgid "where option can be one of:"
+msgstr "όπου option μπορεί να είναι ένα από:"
+
+#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977
+#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747
+#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188
+#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963
+#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967
+msgid "boolean"
+msgstr "boolean"
+
+#: sql_help.c:1724 sql_help.c:4969
+msgid "and table_and_columns is:"
+msgstr "και table_and_columns είναι:"
+
+#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749
+msgid "transaction_mode"
+msgstr "transaction_mode"
+
+#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750
+msgid "where transaction_mode is one of:"
+msgstr "όπου transaction_mode είναι ένα από:"
+
+#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582
+#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835
+#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064
+#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084
+msgid "argument"
+msgstr "argument"
+
+#: sql_help.c:1850
+msgid "relation_name"
+msgstr "relation_name"
+
+#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344
+msgid "domain_name"
+msgstr "domain_name"
+
+#: sql_help.c:1877
+msgid "policy_name"
+msgstr "policy_name"
+
+#: sql_help.c:1890
+msgid "rule_name"
+msgstr "rule_name"
+
+#: sql_help.c:1909 sql_help.c:4483
+msgid "string_literal"
+msgstr "string_literal"
+
+#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397
+msgid "transaction_id"
+msgstr "transaction_id"
+
+#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017
+msgid "filename"
+msgstr "filename"
+
+#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688
+#: sql_help.c:2689
+msgid "command"
+msgstr "command"
+
+#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297
+#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552
+#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809
+#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049
+msgid "condition"
+msgstr "condition"
+
+#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263
+#: sql_help.c:3281 sql_help.c:3982
+msgid "query"
+msgstr "query"
+
+#: sql_help.c:1976
+msgid "format_name"
+msgstr "format_name"
+
+#: sql_help.c:1978
+msgid "delimiter_character"
+msgstr "delimiter_character"
+
+#: sql_help.c:1979
+msgid "null_string"
+msgstr "null_string"
+
+#: sql_help.c:1981
+msgid "quote_character"
+msgstr "quote_character"
+
+#: sql_help.c:1982
+msgid "escape_character"
+msgstr "escape_character"
+
+#: sql_help.c:1986
+msgid "encoding_name"
+msgstr "encoding_name"
+
+#: sql_help.c:1997
+msgid "access_method_type"
+msgstr "access_method_type"
+
+#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090
+msgid "arg_data_type"
+msgstr "arg_data_type"
+
+#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099
+msgid "sfunc"
+msgstr "sfunc"
+
+#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100
+msgid "state_data_type"
+msgstr "state_data_type"
+
+#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101
+msgid "state_data_size"
+msgstr "state_data_size"
+
+#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102
+msgid "ffunc"
+msgstr "ffunc"
+
+#: sql_help.c:2073 sql_help.c:2103
+msgid "combinefunc"
+msgstr "combinefunc"
+
+#: sql_help.c:2074 sql_help.c:2104
+msgid "serialfunc"
+msgstr "serialfunc"
+
+#: sql_help.c:2075 sql_help.c:2105
+msgid "deserialfunc"
+msgstr "deserialfunc"
+
+#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106
+msgid "initial_condition"
+msgstr "initial_condition"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "msfunc"
+msgstr "msfunc"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "minvfunc"
+msgstr "minvfunc"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "mstate_data_type"
+msgstr "mstate_data_type"
+
+#: sql_help.c:2080 sql_help.c:2110
+msgid "mstate_data_size"
+msgstr "mstate_data_size"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "mffunc"
+msgstr "mffunc"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minitial_condition"
+msgstr "minitial_condition"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "sort_operator"
+msgstr "sort_operator"
+
+#: sql_help.c:2096
+msgid "or the old syntax"
+msgstr "ή την παλαιά σύνταξη"
+
+#: sql_help.c:2098
+msgid "base_type"
+msgstr "base_type"
+
+#: sql_help.c:2155 sql_help.c:2202
+msgid "locale"
+msgstr "locale"
+
+#: sql_help.c:2156 sql_help.c:2203
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2157 sql_help.c:2204
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2158 sql_help.c:4450
+msgid "provider"
+msgstr "provider"
+
+#: sql_help.c:2160 sql_help.c:2263
+msgid "version"
+msgstr "version"
+
+#: sql_help.c:2162
+msgid "existing_collation"
+msgstr "existing_collation"
+
+#: sql_help.c:2172
+msgid "source_encoding"
+msgstr "source_encoding"
+
+#: sql_help.c:2173
+msgid "dest_encoding"
+msgstr "dest_encoding"
+
+#: sql_help.c:2199 sql_help.c:3039
+msgid "template"
+msgstr "template"
+
+#: sql_help.c:2200
+msgid "encoding"
+msgstr "dest_encoding"
+
+#: sql_help.c:2201
+msgid "strategy"
+msgstr "strategy"
+
+#: sql_help.c:2205
+msgid "icu_locale"
+msgstr "icu_locale"
+
+#: sql_help.c:2206
+msgid "locale_provider"
+msgstr "locale_provider"
+
+#: sql_help.c:2207
+msgid "collation_version"
+msgstr "collation_version"
+
+#: sql_help.c:2212
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2232
+msgid "constraint"
+msgstr "constraint"
+
+#: sql_help.c:2233
+msgid "where constraint is:"
+msgstr "όπου constraint είναι:"
+
+#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112
+msgid "event"
+msgstr "event"
+
+#: sql_help.c:2248
+msgid "filter_variable"
+msgstr "filter_variable"
+
+#: sql_help.c:2249
+msgid "filter_value"
+msgstr "filter_value"
+
+#: sql_help.c:2345 sql_help.c:2931
+msgid "where column_constraint is:"
+msgstr "όπου column_constraint είναι:"
+
+#: sql_help.c:2390
+msgid "rettype"
+msgstr "rettype"
+
+#: sql_help.c:2392
+msgid "column_type"
+msgstr "column_type"
+
+#: sql_help.c:2401 sql_help.c:2604
+msgid "definition"
+msgstr "definition"
+
+#: sql_help.c:2402 sql_help.c:2605
+msgid "obj_file"
+msgstr "obj_file"
+
+#: sql_help.c:2403 sql_help.c:2606
+msgid "link_symbol"
+msgstr "link_symbol"
+
+#: sql_help.c:2404 sql_help.c:2607
+msgid "sql_body"
+msgstr "sql_body"
+
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913
+#: sql_help.c:2927 sql_help.c:2995
+msgid "method"
+msgstr "method"
+
+#: sql_help.c:2463
+msgid "opclass_parameter"
+msgstr "opclass_parameter"
+
+#: sql_help.c:2480
+msgid "call_handler"
+msgstr "call_handler"
+
+#: sql_help.c:2481
+msgid "inline_handler"
+msgstr "inline_handler"
+
+#: sql_help.c:2482
+msgid "valfunction"
+msgstr "valfunction"
+
+#: sql_help.c:2521
+msgid "com_op"
+msgstr "com_op"
+
+#: sql_help.c:2522
+msgid "neg_op"
+msgstr "neg_op"
+
+#: sql_help.c:2540
+msgid "family_name"
+msgstr "family_name"
+
+#: sql_help.c:2551
+msgid "storage_type"
+msgstr "storage_type"
+
+#: sql_help.c:2690 sql_help.c:3119
+msgid "where event can be one of:"
+msgstr "όπου event μπορεί να είναι ένα από:"
+
+#: sql_help.c:2710 sql_help.c:2712
+msgid "schema_element"
+msgstr "schema_element"
+
+#: sql_help.c:2749
+msgid "server_type"
+msgstr "server_type"
+
+#: sql_help.c:2750
+msgid "server_version"
+msgstr "server_version"
+
+#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347
+msgid "fdw_name"
+msgstr "fdw_name"
+
+#: sql_help.c:2768 sql_help.c:2771
+msgid "statistics_name"
+msgstr "statistics_name"
+
+#: sql_help.c:2772
+msgid "statistics_kind"
+msgstr "statistics_kind"
+
+#: sql_help.c:2788
+msgid "subscription_name"
+msgstr "subscription_name"
+
+#: sql_help.c:2893
+msgid "source_table"
+msgstr "source_table"
+
+#: sql_help.c:2894
+msgid "like_option"
+msgstr "like_option"
+
+#: sql_help.c:2960
+msgid "and like_option is:"
+msgstr "και like_option είναι:"
+
+#: sql_help.c:3012
+msgid "directory"
+msgstr "directory"
+
+#: sql_help.c:3026
+msgid "parser_name"
+msgstr "parser_name"
+
+#: sql_help.c:3027
+msgid "source_config"
+msgstr "source_config"
+
+#: sql_help.c:3056
+msgid "start_function"
+msgstr "start_function"
+
+#: sql_help.c:3057
+msgid "gettoken_function"
+msgstr "gettoken_function"
+
+#: sql_help.c:3058
+msgid "end_function"
+msgstr "end_function"
+
+#: sql_help.c:3059
+msgid "lextypes_function"
+msgstr "lextypes_function"
+
+#: sql_help.c:3060
+msgid "headline_function"
+msgstr "headline_function"
+
+#: sql_help.c:3072
+msgid "init_function"
+msgstr "init_function"
+
+#: sql_help.c:3073
+msgid "lexize_function"
+msgstr "lexize_function"
+
+#: sql_help.c:3086
+msgid "from_sql_function_name"
+msgstr "from_sql_function_name"
+
+#: sql_help.c:3088
+msgid "to_sql_function_name"
+msgstr "to_sql_function_name"
+
+#: sql_help.c:3114
+msgid "referenced_table_name"
+msgstr "referenced_table_name"
+
+#: sql_help.c:3115
+msgid "transition_relation_name"
+msgstr "transition_relation_name"
+
+#: sql_help.c:3118
+msgid "arguments"
+msgstr "arguments"
+
+#: sql_help.c:3170
+msgid "label"
+msgstr "label"
+
+#: sql_help.c:3172
+msgid "subtype"
+msgstr "subtype"
+
+#: sql_help.c:3173
+msgid "subtype_operator_class"
+msgstr "subtype_operator_class"
+
+#: sql_help.c:3175
+msgid "canonical_function"
+msgstr "canonical_function"
+
+#: sql_help.c:3176
+msgid "subtype_diff_function"
+msgstr "subtype_diff_function"
+
+#: sql_help.c:3177
+msgid "multirange_type_name"
+msgstr "multirange_type_name"
+
+#: sql_help.c:3179
+msgid "input_function"
+msgstr "input_function"
+
+#: sql_help.c:3180
+msgid "output_function"
+msgstr "output_function"
+
+#: sql_help.c:3181
+msgid "receive_function"
+msgstr "receive_function"
+
+#: sql_help.c:3182
+msgid "send_function"
+msgstr "send_function"
+
+#: sql_help.c:3183
+msgid "type_modifier_input_function"
+msgstr "type_modifier_input_function"
+
+#: sql_help.c:3184
+msgid "type_modifier_output_function"
+msgstr "type_modifier_output_function"
+
+#: sql_help.c:3185
+msgid "analyze_function"
+msgstr "analyze_function"
+
+#: sql_help.c:3186
+msgid "subscript_function"
+msgstr "subscript_function"
+
+#: sql_help.c:3187
+msgid "internallength"
+msgstr "internallength"
+
+#: sql_help.c:3188
+msgid "alignment"
+msgstr "alignment"
+
+#: sql_help.c:3189
+msgid "storage"
+msgstr "storage"
+
+#: sql_help.c:3190
+msgid "like_type"
+msgstr "like_type"
+
+#: sql_help.c:3191
+msgid "category"
+msgstr "category"
+
+#: sql_help.c:3192
+msgid "preferred"
+msgstr "preferred"
+
+#: sql_help.c:3193
+msgid "default"
+msgstr "default"
+
+#: sql_help.c:3194
+msgid "element"
+msgstr "element"
+
+#: sql_help.c:3195
+msgid "delimiter"
+msgstr "delimiter"
+
+#: sql_help.c:3196
+msgid "collatable"
+msgstr "collatable"
+
+#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547
+#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042
+msgid "with_query"
+msgstr "with_query"
+
+#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572
+#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591
+#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836
+#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061
+#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078
+#: sql_help.c:5086
+msgid "alias"
+msgstr "alias"
+
+#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603
+#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852
+#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860
+#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090
+#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098
+msgid "from_item"
+msgstr "from_item"
+
+#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928
+msgid "cursor_name"
+msgstr "cursor_name"
+
+#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929
+msgid "output_expression"
+msgstr "output_expression"
+
+#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652
+#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045
+msgid "output_name"
+msgstr "output_name"
+
+#: sql_help.c:3316
+msgid "code"
+msgstr "code"
+
+#: sql_help.c:3721
+msgid "parameter"
+msgstr "parameter"
+
+#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142
+msgid "statement"
+msgstr "statement"
+
+#: sql_help.c:3778 sql_help.c:4116
+msgid "direction"
+msgstr "direction"
+
+#: sql_help.c:3780 sql_help.c:4118
+msgid "where direction can be one of:"
+msgstr "όπου κατεύθυνση μπορεί να είναι μία από:"
+
+#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784
+#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121
+#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562
+#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819
+#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057
+msgid "count"
+msgstr "count"
+
+#: sql_help.c:3888 sql_help.c:4337
+msgid "sequence_name"
+msgstr "sequence_name"
+
+#: sql_help.c:3906 sql_help.c:4355
+msgid "arg_name"
+msgstr "arg_name"
+
+#: sql_help.c:3907 sql_help.c:4356
+msgid "arg_type"
+msgstr "arg_type"
+
+#: sql_help.c:3914 sql_help.c:4363
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3945
+msgid "remote_schema"
+msgstr "remote_schema"
+
+#: sql_help.c:3948
+msgid "local_schema"
+msgstr "local_schema"
+
+#: sql_help.c:3983
+msgid "conflict_target"
+msgstr "conflict_target"
+
+#: sql_help.c:3984
+msgid "conflict_action"
+msgstr "conflict_action"
+
+#: sql_help.c:3987
+msgid "where conflict_target can be one of:"
+msgstr "όπου conflict_target μπορεί να είναι ένα από:"
+
+#: sql_help.c:3988
+msgid "index_column_name"
+msgstr "index_column_name"
+
+#: sql_help.c:3989
+msgid "index_expression"
+msgstr "index_expression"
+
+#: sql_help.c:3992
+msgid "index_predicate"
+msgstr "index_predicate"
+
+#: sql_help.c:3994
+msgid "and conflict_action is one of:"
+msgstr "και conflict_action είναι ένα από:"
+
+#: sql_help.c:4000 sql_help.c:4925
+msgid "sub-SELECT"
+msgstr "sub-SELECT"
+
+#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901
+msgid "channel"
+msgstr "channel"
+
+#: sql_help.c:4031
+msgid "lockmode"
+msgstr "lockmode"
+
+#: sql_help.c:4032
+msgid "where lockmode is one of:"
+msgstr "όπου lockmode είναι ένα από:"
+
+#: sql_help.c:4068
+msgid "target_table_name"
+msgstr "table_table_name"
+
+#: sql_help.c:4069
+msgid "target_alias"
+msgstr "target_alias"
+
+#: sql_help.c:4070
+msgid "data_source"
+msgstr "data_source"
+
+#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091
+msgid "join_condition"
+msgstr "join_condition"
+
+#: sql_help.c:4072
+msgid "when_clause"
+msgstr "when_clause"
+
+#: sql_help.c:4073
+msgid "where data_source is:"
+msgstr "όπου data_source είναι:"
+
+#: sql_help.c:4074
+msgid "source_table_name"
+msgstr "source_table_name"
+
+#: sql_help.c:4075
+msgid "source_query"
+msgstr "source_query"
+
+#: sql_help.c:4076
+msgid "source_alias"
+msgstr "source_alias"
+
+#: sql_help.c:4077
+msgid "and when_clause is:"
+msgstr "και when_clause είναι:"
+
+#: sql_help.c:4079
+msgid "merge_update"
+msgstr "merge_update"
+
+#: sql_help.c:4080
+msgid "merge_delete"
+msgstr "merge_delete"
+
+#: sql_help.c:4082
+msgid "merge_insert"
+msgstr "merge_insert"
+
+#: sql_help.c:4083
+msgid "and merge_insert is:"
+msgstr "και merge_insert είναι:"
+
+#: sql_help.c:4086
+msgid "and merge_update is:"
+msgstr "και merge_update είναι:"
+
+#: sql_help.c:4091
+msgid "and merge_delete is:"
+msgstr "και merge_delete είναι:"
+
+#: sql_help.c:4132
+msgid "payload"
+msgstr "payload"
+
+#: sql_help.c:4159
+msgid "old_role"
+msgstr "old_role"
+
+#: sql_help.c:4160
+msgid "new_role"
+msgstr "new_role"
+
+#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413
+msgid "savepoint_name"
+msgstr "savepoint_name"
+
+#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868
+#: sql_help.c:5048 sql_help.c:5106
+msgid "grouping_element"
+msgstr "grouping_element"
+
+#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050
+msgid "window_name"
+msgstr "window_name"
+
+#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051
+msgid "window_definition"
+msgstr "window_definition"
+
+#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660
+#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052
+#: sql_help.c:5066 sql_help.c:5110
+msgid "select"
+msgstr "select"
+
+#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059
+msgid "where from_item can be one of:"
+msgstr "όπου from_item μπορεί να είναι ένα από:"
+
+#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580
+#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833
+#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068
+#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087
+msgid "column_alias"
+msgstr "column_alias"
+
+#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063
+msgid "sampling_method"
+msgstr "sampling_method"
+
+#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065
+msgid "seed"
+msgstr "seed"
+
+#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870
+#: sql_help.c:5069 sql_help.c:5108
+msgid "with_query_name"
+msgstr "with_query_name"
+
+#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841
+#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082
+#: sql_help.c:5085
+msgid "column_definition"
+msgstr "column_definition"
+
+#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857
+#: sql_help.c:5089 sql_help.c:5095
+msgid "join_type"
+msgstr "join_type"
+
+#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092
+msgid "join_column"
+msgstr "join_column"
+
+#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093
+msgid "join_using_alias"
+msgstr "join_using_alias"
+
+#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099
+msgid "and grouping_element can be one of:"
+msgstr "και grouping_element μπορεί να είναι ένα από:"
+
+#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107
+msgid "and with_query is:"
+msgstr "και with_query είναι:"
+
+#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111
+msgid "values"
+msgstr "values"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116
+msgid "search_seq_col_name"
+msgstr "search_seq_col_name"
+
+#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118
+msgid "cycle_mark_col_name"
+msgstr "cycle_mark_col_name"
+
+#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119
+msgid "cycle_mark_value"
+msgstr "cycle_mark_value"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120
+msgid "cycle_mark_default"
+msgstr "cycle_mark_default"
+
+#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121
+msgid "cycle_path_col_name"
+msgstr "cycle_path_col_name"
+
+#: sql_help.c:4653
+msgid "new_table"
+msgstr "new_table"
+
+#: sql_help.c:4724
+msgid "snapshot_id"
+msgstr "snapshot_id"
+
+#: sql_help.c:4984
+msgid "sort_expression"
+msgstr "sort_expression"
+
+#: sql_help.c:5128 sql_help.c:6112
+msgid "abort the current transaction"
+msgstr "ματαιώστε την τρέχουσα συναλλαγή"
+
+#: sql_help.c:5134
+msgid "change the definition of an aggregate function"
+msgstr "αλλάξτε τον ορισμό μιας συνάρτησης συγκεντρωτικών αποτελεσμάτων"
+
+#: sql_help.c:5140
+msgid "change the definition of a collation"
+msgstr "αλλάξτε τον ορισμό συρραφής"
+
+#: sql_help.c:5146
+msgid "change the definition of a conversion"
+msgstr "αλλάξτε τον ορισμό μίας μετατροπής"
+
+#: sql_help.c:5152
+msgid "change a database"
+msgstr "αλλάξτε μία βάση δεδομένων"
+
+#: sql_help.c:5158
+msgid "define default access privileges"
+msgstr "ορίσθε τα προεπιλεγμένα δικαιώματα πρόσβασης"
+
+#: sql_help.c:5164
+msgid "change the definition of a domain"
+msgstr "αλλάξτε τον ορισμό ενός τομέα"
+
+#: sql_help.c:5170
+msgid "change the definition of an event trigger"
+msgstr "αλλάξτε τον ορισμό μιας ενεργοποίησης συμβάντος"
+
+#: sql_help.c:5176
+msgid "change the definition of an extension"
+msgstr "αλλάξτε τον ορισμό μίας προέκτασης"
+
+#: sql_help.c:5182
+msgid "change the definition of a foreign-data wrapper"
+msgstr "αλλάξτε τον ορισιμό μιας περιτύλιξης ξένων δεδομένων"
+
+#: sql_help.c:5188
+msgid "change the definition of a foreign table"
+msgstr "αλλάξτε τον ορισιμό ενός ξενικού πίνακα"
+
+#: sql_help.c:5194
+msgid "change the definition of a function"
+msgstr "αλλάξτε τον ορισμό μιας συνάρτησης"
+
+#: sql_help.c:5200
+msgid "change role name or membership"
+msgstr "αλλάξτε το όνομα ρόλου ή ιδιότητας μέλους"
+
+#: sql_help.c:5206
+msgid "change the definition of an index"
+msgstr "αλλάξτε τον ορισμό ενός ευρετηρίου"
+
+#: sql_help.c:5212
+msgid "change the definition of a procedural language"
+msgstr "αλλάξτε τον ορισμό μιας διαδικαστικής γλώσσας"
+
+#: sql_help.c:5218
+msgid "change the definition of a large object"
+msgstr "αλλάξτε τον ορισιμό ενός μεγάλου αντικειμένου"
+
+#: sql_help.c:5224
+msgid "change the definition of a materialized view"
+msgstr "αλλάξτε τον ορισμό μίας υλοποιημένης όψης"
+
+#: sql_help.c:5230
+msgid "change the definition of an operator"
+msgstr "αλλάξτε τον ορισμό ενός χειριστή"
+
+#: sql_help.c:5236
+msgid "change the definition of an operator class"
+msgstr "αλλάξτε τον ορισμό μίας κλάσης χειριστή"
+
+#: sql_help.c:5242
+msgid "change the definition of an operator family"
+msgstr "αλλάξτε τον ορισμό μίας οικογένειας χειριστή"
+
+#: sql_help.c:5248
+msgid "change the definition of a row-level security policy"
+msgstr "αλλάξτε τον ορισμό μιας πολιτικής ασφάλειας επιπέδου σειράς"
+
+#: sql_help.c:5254
+msgid "change the definition of a procedure"
+msgstr "αλλάξτε τον ορισμό μίας διαδικασίας"
+
+#: sql_help.c:5260
+msgid "change the definition of a publication"
+msgstr "αλλάξτε τον ορισμό μίας δημοσίευσης"
+
+#: sql_help.c:5266 sql_help.c:5368
+msgid "change a database role"
+msgstr "αλλάξτε τον ρόλο μίας βάσης δεδομένων"
+
+#: sql_help.c:5272
+msgid "change the definition of a routine"
+msgstr "αλλάξτε τον ορισμό μιας ρουτίνας"
+
+#: sql_help.c:5278
+msgid "change the definition of a rule"
+msgstr "αλλάξτε τον ορισμό ενός κανόνα"
+
+#: sql_help.c:5284
+msgid "change the definition of a schema"
+msgstr "αλλάξτε τον ορισμό ενός σχήματος"
+
+#: sql_help.c:5290
+msgid "change the definition of a sequence generator"
+msgstr "αλλάξτε τον ορισμό μίας γεννήτριας ακολουθίας"
+
+#: sql_help.c:5296
+msgid "change the definition of a foreign server"
+msgstr "αλλάξτε τον ορισμό ενός ξενικού διακομιστή"
+
+#: sql_help.c:5302
+msgid "change the definition of an extended statistics object"
+msgstr "αλλάξτε τον ορισμό ενός εκτεταμένου αντικειμένου στατιστικών"
+
+#: sql_help.c:5308
+msgid "change the definition of a subscription"
+msgstr "αλλάξτε τον ορισμό μιας συνδρομής"
+
+#: sql_help.c:5314
+msgid "change a server configuration parameter"
+msgstr "αλλάξτε μία παράμετρο διαμόρφωσης διακομιστή"
+
+#: sql_help.c:5320
+msgid "change the definition of a table"
+msgstr "αλλάξτε τον ορισμό ενός πίνακα"
+
+#: sql_help.c:5326
+msgid "change the definition of a tablespace"
+msgstr "αλλάξτε τον ορισμό ενός πινακοχώρου"
+
+#: sql_help.c:5332
+msgid "change the definition of a text search configuration"
+msgstr "αλλάξτε τον ορισμό μίας διαμόρφωσης αναζήτησης κειμένου"
+
+#: sql_help.c:5338
+msgid "change the definition of a text search dictionary"
+msgstr "αλλάξτε τον ορισμό ενός λεξικού αναζήτησης κειμένου"
+
+#: sql_help.c:5344
+msgid "change the definition of a text search parser"
+msgstr "αλλάξτε τον ορισμό ενός αναλυτή αναζήτησης κειμένου"
+
+#: sql_help.c:5350
+msgid "change the definition of a text search template"
+msgstr "αλλάξτε τον ορισμό ενός προτύπου αναζήτησης κειμένου"
+
+#: sql_help.c:5356
+msgid "change the definition of a trigger"
+msgstr "αλλάξτε τον ορισμό μιας ενεργοποίησης"
+
+#: sql_help.c:5362
+msgid "change the definition of a type"
+msgstr "αλλάξτε τον ορισμό ενός τύπου"
+
+#: sql_help.c:5374
+msgid "change the definition of a user mapping"
+msgstr "αλλάξτε τον ορισμό μίας αντιστοίχισης χρήστη"
+
+#: sql_help.c:5380
+msgid "change the definition of a view"
+msgstr "αλλάξτε τον ορισμό μίας όψης"
+
+#: sql_help.c:5386
+msgid "collect statistics about a database"
+msgstr "συλλέξτε στατιστικά σχετικά με μία βάση δεδομένων"
+
+#: sql_help.c:5392 sql_help.c:6190
+msgid "start a transaction block"
+msgstr "εκκινήστε ένα μπλοκ συναλλαγής"
+
+#: sql_help.c:5398
+msgid "invoke a procedure"
+msgstr "κλήση διαδικασίας"
+
+#: sql_help.c:5404
+msgid "force a write-ahead log checkpoint"
+msgstr "επιβάλλετε εισαγωγή ενός σημείου ελέγχου (checkpoint) του write-ahead log"
+
+#: sql_help.c:5410
+msgid "close a cursor"
+msgstr "κλείστε έναν δρομέα"
+
+#: sql_help.c:5416
+msgid "cluster a table according to an index"
+msgstr "δημιουργείστε συστάδα ενός πίνακα σύμφωνα με ένα ευρετήριο"
+
+#: sql_help.c:5422
+msgid "define or change the comment of an object"
+msgstr "ορίσετε ή αλλάξτε το σχόλιο ενός αντικειμένου"
+
+#: sql_help.c:5428 sql_help.c:5986
+msgid "commit the current transaction"
+msgstr "ολοκληρώστε την τρέχουσας συναλλαγής"
+
+#: sql_help.c:5434
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "ολοκληρώστε μία συναλλαγή που είχε προετοιμαστεί νωρίτερα για ολοκλήρωση σε δύο φάσεις"
+
+#: sql_help.c:5440
+msgid "copy data between a file and a table"
+msgstr "αντιγράψτε δεδομένα μεταξύ ενός αρχείου και ενός πίνακα"
+
+#: sql_help.c:5446
+msgid "define a new access method"
+msgstr "ορίσετε μία νέα μέθοδο πρόσβασης"
+
+#: sql_help.c:5452
+msgid "define a new aggregate function"
+msgstr "ορίσετε μία νέα συνάρτηση συγκεντρωτικών αποτελεσμάτων"
+
+#: sql_help.c:5458
+msgid "define a new cast"
+msgstr "ορίσετε ένα νέο καστ"
+
+#: sql_help.c:5464
+msgid "define a new collation"
+msgstr "ορίσετε μία νέα συρραφή"
+
+#: sql_help.c:5470
+msgid "define a new encoding conversion"
+msgstr "ορίσετε μία νέα μετατροπή κωδικοποίησης"
+
+#: sql_help.c:5476
+msgid "create a new database"
+msgstr "δημιουργήστε μία νέα βάση δεδομένων"
+
+#: sql_help.c:5482
+msgid "define a new domain"
+msgstr "ορίσετε ένα νέο πεδίο"
+
+#: sql_help.c:5488
+msgid "define a new event trigger"
+msgstr "ορίσετε μία νέα ενεργοποίησης συμβάντος"
+
+#: sql_help.c:5494
+msgid "install an extension"
+msgstr "εγκαταστήστε μία νέα προέκταση"
+
+#: sql_help.c:5500
+msgid "define a new foreign-data wrapper"
+msgstr "ορίσετε μία νέα περιτύλιξη ξένων δεδομένων"
+
+#: sql_help.c:5506
+msgid "define a new foreign table"
+msgstr "ορίσετε ένα νέο ξενικό πίνακα"
+
+#: sql_help.c:5512
+msgid "define a new function"
+msgstr "ορίσετε μία νέα συνάρτηση"
+
+#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680
+msgid "define a new database role"
+msgstr "ορίστε έναν νέο ρόλο βάσης δεδομένων"
+
+#: sql_help.c:5524
+msgid "define a new index"
+msgstr "ορίστε ένα νέο ευρετήριο"
+
+#: sql_help.c:5530
+msgid "define a new procedural language"
+msgstr "ορίστε μία νέα διαδικαστική γλώσσα"
+
+#: sql_help.c:5536
+msgid "define a new materialized view"
+msgstr "ορίστε μία νέα υλοποιημένη όψη"
+
+#: sql_help.c:5542
+msgid "define a new operator"
+msgstr "ορίστε έναν νέο χειριστή"
+
+#: sql_help.c:5548
+msgid "define a new operator class"
+msgstr "ορίστε μία νέα κλάση χειριστή"
+
+#: sql_help.c:5554
+msgid "define a new operator family"
+msgstr "ορίστε μία νέα οικογένεια χειριστή"
+
+#: sql_help.c:5560
+msgid "define a new row-level security policy for a table"
+msgstr "ορίστε μία νέα πολιτική προστασίας σειράς για έναν πίνακα"
+
+#: sql_help.c:5566
+msgid "define a new procedure"
+msgstr "ορίστε μία νέα διαδικασία"
+
+#: sql_help.c:5572
+msgid "define a new publication"
+msgstr "ορίστε μία νέα κοινοποιήση"
+
+#: sql_help.c:5584
+msgid "define a new rewrite rule"
+msgstr "ορίστε ένα νέο κανόνα επανεγγραφής"
+
+#: sql_help.c:5590
+msgid "define a new schema"
+msgstr "ορίστε ένα νέο σχήμα"
+
+#: sql_help.c:5596
+msgid "define a new sequence generator"
+msgstr "ορίστε ένα νέο παραγωγό ακολουθίων"
+
+#: sql_help.c:5602
+msgid "define a new foreign server"
+msgstr "ορίστε ένα νέο ξενικό διακομιστή"
+
+#: sql_help.c:5608
+msgid "define extended statistics"
+msgstr "ορίστε εκτεταμένα στατιστικά στοιχεία"
+
+#: sql_help.c:5614
+msgid "define a new subscription"
+msgstr "ορίστε μία νέα συνδρομή"
+
+#: sql_help.c:5620
+msgid "define a new table"
+msgstr "ορίσετε ένα νέο πίνακα"
+
+#: sql_help.c:5626 sql_help.c:6148
+msgid "define a new table from the results of a query"
+msgstr "ορίστε ένα νέο πίνακα από τα αποτελέσματα ενός ερωτήματος"
+
+#: sql_help.c:5632
+msgid "define a new tablespace"
+msgstr "ορίστε ένα νέο πινακοχώρο"
+
+#: sql_help.c:5638
+msgid "define a new text search configuration"
+msgstr "ορίστε μία νέα διαμόρφωση αναζήτησης κειμένου"
+
+#: sql_help.c:5644
+msgid "define a new text search dictionary"
+msgstr "ορίστε ένα νέο λεξικό αναζήτησης κειμένου"
+
+#: sql_help.c:5650
+msgid "define a new text search parser"
+msgstr "ορίστε ένα νέο αναλυτή αναζήτησης κειμένου"
+
+#: sql_help.c:5656
+msgid "define a new text search template"
+msgstr "ορίστε ένα νέο πρότυπο αναζήτησης κειμένου"
+
+#: sql_help.c:5662
+msgid "define a new transform"
+msgstr "ορίστε μία νέα μετατροπή"
+
+#: sql_help.c:5668
+msgid "define a new trigger"
+msgstr "ορίσετε μία νέα ενεργοποίηση"
+
+#: sql_help.c:5674
+msgid "define a new data type"
+msgstr "ορίσετε ένα νέο τύπο δεδομένων"
+
+#: sql_help.c:5686
+msgid "define a new mapping of a user to a foreign server"
+msgstr "ορίστε μία νέα αντιστοίχιση ενός χρήστη σε έναν ξένο διακομιστή"
+
+#: sql_help.c:5692
+msgid "define a new view"
+msgstr "ορίστε μία νέα όψη"
+
+#: sql_help.c:5698
+msgid "deallocate a prepared statement"
+msgstr "καταργήστε μία προετοιμασμένη δήλωση"
+
+#: sql_help.c:5704
+msgid "define a cursor"
+msgstr "ορίστε έναν δρομέα"
+
+#: sql_help.c:5710
+msgid "delete rows of a table"
+msgstr "διαγράψτε σειρές ενός πίνακα"
+
+#: sql_help.c:5716
+msgid "discard session state"
+msgstr "καταργήστε την κατάσταση συνεδρίας"
+
+#: sql_help.c:5722
+msgid "execute an anonymous code block"
+msgstr "εκτελέστε ανώνυμο μπλοκ κώδικα"
+
+#: sql_help.c:5728
+msgid "remove an access method"
+msgstr "αφαιρέστε μία μέθοδο πρόσβασης"
+
+#: sql_help.c:5734
+msgid "remove an aggregate function"
+msgstr "αφαιρέστε μία συνάρτηση συγκεντρωτικών αποτελεσμάτων"
+
+#: sql_help.c:5740
+msgid "remove a cast"
+msgstr "αφαιρέστε ένα καστ"
+
+#: sql_help.c:5746
+msgid "remove a collation"
+msgstr "αφαιρέστε μία συρραφή"
+
+#: sql_help.c:5752
+msgid "remove a conversion"
+msgstr "αφαιρέστε μία μετατροπή"
+
+#: sql_help.c:5758
+msgid "remove a database"
+msgstr "αφαιρέστε μία βάση δεδομένων"
+
+#: sql_help.c:5764
+msgid "remove a domain"
+msgstr "αφαιρέστε ένα πεδίο"
+
+#: sql_help.c:5770
+msgid "remove an event trigger"
+msgstr "αφαιρέστε μία ενεργοποίηση συμβάντος"
+
+#: sql_help.c:5776
+msgid "remove an extension"
+msgstr "αφαιρέστε μία προέκταση"
+
+#: sql_help.c:5782
+msgid "remove a foreign-data wrapper"
+msgstr "αφαιρέστε μία περιτύλιξη ξένων δεδομένων"
+
+#: sql_help.c:5788
+msgid "remove a foreign table"
+msgstr "αφαιρέστε έναν ξενικό πίνακα"
+
+#: sql_help.c:5794
+msgid "remove a function"
+msgstr "αφαιρέστε μία συνάρτηση"
+
+#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968
+msgid "remove a database role"
+msgstr "αφαιρέστε έναν ρόλο μίας βάσης δεδομένων"
+
+#: sql_help.c:5806
+msgid "remove an index"
+msgstr "αφαιρέστε ένα ευρετήριο"
+
+#: sql_help.c:5812
+msgid "remove a procedural language"
+msgstr "αφαιρέστε μία διαδικαστική γλώσσα"
+
+#: sql_help.c:5818
+msgid "remove a materialized view"
+msgstr "αφαιρέστε μία υλοποιημένη όψη"
+
+#: sql_help.c:5824
+msgid "remove an operator"
+msgstr "αφαιρέστε έναν χειριστή"
+
+#: sql_help.c:5830
+msgid "remove an operator class"
+msgstr "αφαιρέστε μία κλάση χειριστή"
+
+#: sql_help.c:5836
+msgid "remove an operator family"
+msgstr "αφαιρέστε μία οικογένεια χειριστή"
+
+#: sql_help.c:5842
+msgid "remove database objects owned by a database role"
+msgstr "αφαιρέστε αντικειμένα βάσης δεδομένων που ανήκουν σε ρόλο βάσης δεδομένων"
+
+#: sql_help.c:5848
+msgid "remove a row-level security policy from a table"
+msgstr "αφαιρέστε μία πολιτική ασφαλείας επιπέδου σειράς από έναν πίνακα"
+
+#: sql_help.c:5854
+msgid "remove a procedure"
+msgstr "αφαιρέστε μία διαδικασία"
+
+#: sql_help.c:5860
+msgid "remove a publication"
+msgstr "αφαιρέστε μία δημοσίευση"
+
+#: sql_help.c:5872
+msgid "remove a routine"
+msgstr "αφαιρέστε μία ρουτίνα"
+
+#: sql_help.c:5878
+msgid "remove a rewrite rule"
+msgstr "αφαιρέστε έναν κανόνα επανεγγραφής"
+
+#: sql_help.c:5884
+msgid "remove a schema"
+msgstr "αφαιρέστε ένα σχήμα"
+
+#: sql_help.c:5890
+msgid "remove a sequence"
+msgstr "αφαιρέστε μία ακολουθία"
+
+#: sql_help.c:5896
+msgid "remove a foreign server descriptor"
+msgstr "αφαιρέστε έναν περιγραφέα ξενικού διακομιστή"
+
+#: sql_help.c:5902
+msgid "remove extended statistics"
+msgstr "αφαιρέστε εκτεταμένα στατιστικά στοιχεία"
+
+#: sql_help.c:5908
+msgid "remove a subscription"
+msgstr "αφαιρέστε μία συνδρομή"
+
+#: sql_help.c:5914
+msgid "remove a table"
+msgstr "αφαιρέστε έναν πίνακα"
+
+#: sql_help.c:5920
+msgid "remove a tablespace"
+msgstr "αφαιρέστε έναν πινακοχώρο"
+
+#: sql_help.c:5926
+msgid "remove a text search configuration"
+msgstr "αφαιρέστε μία διαμόρφωση αναζήτησης κειμένου"
+
+#: sql_help.c:5932
+msgid "remove a text search dictionary"
+msgstr "αφαιρέστε ένα λεξικό αναζήτησης κειμένου"
+
+#: sql_help.c:5938
+msgid "remove a text search parser"
+msgstr "αφαιρέστε έναν αναλυτή αναζήτησης κειμένου"
+
+#: sql_help.c:5944
+msgid "remove a text search template"
+msgstr "αφαιρέστε ένα πρότυπο αναζήτησης κειμένου"
+
+#: sql_help.c:5950
+msgid "remove a transform"
+msgstr "αφαιρέστε μία μετατροπή"
+
+#: sql_help.c:5956
+msgid "remove a trigger"
+msgstr "αφαιρέστε μία ενεργοποίηση"
+
+#: sql_help.c:5962
+msgid "remove a data type"
+msgstr "αφαιρέστε έναν τύπο δεδομένων"
+
+#: sql_help.c:5974
+msgid "remove a user mapping for a foreign server"
+msgstr "αφαιρέστε μία αντιστοίχιση χρήστη για ξένο διακομιστή"
+
+#: sql_help.c:5980
+msgid "remove a view"
+msgstr "αφαιρέστε μία όψη"
+
+#: sql_help.c:5992
+msgid "execute a prepared statement"
+msgstr "εκτελέστε μία προεπιλεγμένη δήλωση"
+
+#: sql_help.c:5998
+msgid "show the execution plan of a statement"
+msgstr "εμφανίστε το πλάνο εκτέλεσης μίας δήλωσης"
+
+#: sql_help.c:6004
+msgid "retrieve rows from a query using a cursor"
+msgstr "ανακτήστε σειρές από ερώτημα μέσω δρομέα"
+
+#: sql_help.c:6010
+msgid "define access privileges"
+msgstr "ορίσθε δικαιώματα πρόσβασης"
+
+#: sql_help.c:6016
+msgid "import table definitions from a foreign server"
+msgstr "εισαγωγή ορισμών πίνακα από ξένο διακομιστή"
+
+#: sql_help.c:6022
+msgid "create new rows in a table"
+msgstr "δημιουργήστε καινούργιες σειρές σε έναν πίνακα"
+
+#: sql_help.c:6028
+msgid "listen for a notification"
+msgstr "ακούστε για μία κοινοποίηση"
+
+#: sql_help.c:6034
+msgid "load a shared library file"
+msgstr "φορτώστε ένα αρχείο κοινόχρηστης βιβλιοθήκης"
+
+#: sql_help.c:6040
+msgid "lock a table"
+msgstr "κλειδώστε έναν πίνακα"
+
+#: sql_help.c:6046
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "υπό όρους εισαγωγή, ενημέρωση, ή διαγραφή σειρών ενός πίνακα"
+
+#: sql_help.c:6052
+msgid "position a cursor"
+msgstr "τοποθετήστε έναν δρομέα"
+
+#: sql_help.c:6058
+msgid "generate a notification"
+msgstr "δημιουργήστε μία κοινοποίηση"
+
+#: sql_help.c:6064
+msgid "prepare a statement for execution"
+msgstr "προετοιμάστε μία δήλωση για εκτέλεση"
+
+#: sql_help.c:6070
+msgid "prepare the current transaction for two-phase commit"
+msgstr "προετοιμάστε την τρέχουσας συναλλαγής για ολοκλήρωση σε δύο φάσεις"
+
+#: sql_help.c:6076
+msgid "change the ownership of database objects owned by a database role"
+msgstr "αλλάξτε την κυριότητα αντικειμένων βάσης δεδομένων που ανήκουν σε ρόλο βάσης δεδομένων"
+
+#: sql_help.c:6082
+msgid "replace the contents of a materialized view"
+msgstr "αντικαθαστήστε τα περιεχόμενα μίας υλοποιημένης όψης"
+
+#: sql_help.c:6088
+msgid "rebuild indexes"
+msgstr "επανακατασκευάστε ευρετήρια"
+
+#: sql_help.c:6094
+msgid "destroy a previously defined savepoint"
+msgstr "καταστρέψτε ένα προηγούμενα ορισμένο σημείο αποθήκευσης"
+
+#: sql_help.c:6100
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "επαναφορά της τιμής μιας παραμέτρου χρόνου εκτέλεσης στην προεπιλεγμένη τιμή"
+
+#: sql_help.c:6106
+msgid "remove access privileges"
+msgstr "αφαιρέστε δικαιώματα πρόσβασης"
+
+#: sql_help.c:6118
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "ακύρωση συναλλαγής που είχε προετοιμαστεί προηγουμένως για ολοκλήρωση σε δύο φάσεις"
+
+#: sql_help.c:6124
+msgid "roll back to a savepoint"
+msgstr "επαναφορά σε σημείο αποθήκευσης"
+
+#: sql_help.c:6130
+msgid "define a new savepoint within the current transaction"
+msgstr "ορίστε ένα νέο σημείο αποθήκευσης (savepoint) μέσα στην τρέχουσα συναλλαγή"
+
+#: sql_help.c:6136
+msgid "define or change a security label applied to an object"
+msgstr "ορίστε ή αλλάξτε μία ετικέτα ασφαλείας που εφαρμόζεται σε ένα αντικείμενο"
+
+#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232
+msgid "retrieve rows from a table or view"
+msgstr "ανακτήστε σειρές από πίνακα ή όψη"
+
+#: sql_help.c:6154
+msgid "change a run-time parameter"
+msgstr "αλλάξτε μία παράμετρο χρόνου εκτέλεσης"
+
+#: sql_help.c:6160
+msgid "set constraint check timing for the current transaction"
+msgstr "ορίστε τον χρονισμό ελέγχου περιορισμού για την τρέχουσα συναλλαγή"
+
+#: sql_help.c:6166
+msgid "set the current user identifier of the current session"
+msgstr "ορίστε το αναγνωριστικό τρέχοντος χρήστη της τρέχουσας συνεδρίας"
+
+#: sql_help.c:6172
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "ορίστε το αναγνωριστικό χρήστη συνεδρίας και το αναγνωριστικό τρέχοντος χρήστη της τρέχουσας συνεδρίας"
+
+#: sql_help.c:6178
+msgid "set the characteristics of the current transaction"
+msgstr "ορίστε τα χαρακτηριστικά της τρέχουσας συναλλαγής"
+
+#: sql_help.c:6184
+msgid "show the value of a run-time parameter"
+msgstr "εμφάνιση της τιμής μιας παραμέτρου χρόνου εκτέλεσης"
+
+#: sql_help.c:6202
+msgid "empty a table or set of tables"
+msgstr "αδειάστε έναν πίνακα ή ένα σύνολο πινάκων"
+
+#: sql_help.c:6208
+msgid "stop listening for a notification"
+msgstr "σταματήστε να ακούτε μια κοινοποίηση"
+
+#: sql_help.c:6214
+msgid "update rows of a table"
+msgstr "ενημέρωση σειρών πίνακα"
+
+#: sql_help.c:6220
+msgid "garbage-collect and optionally analyze a database"
+msgstr "συλλογή απορριμμάτων και προαιρετική ανάλυση βάσης δεδομένων"
+
+#: sql_help.c:6226
+msgid "compute a set of rows"
+msgstr "υπολογίστε ένα σύνολο σειρών"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 μπορεί να χρησιμοποιηθεί μόνο σε μη διαδραστική λειτουργία"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου καταγραφής «%s»: %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Γράψτε «help» για βοήθεια.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "δεν ήταν δυνατός ο ορισμός παραμέτρου εκτύπωσης «%s»"
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "παραβλέπεται η πρόσθετη παράμετρος γραμμής εντολών «%s»"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "δεν ήταν δυνατή η εύρεση του ιδίου εκτελέσιμου προγράμματος"
+
+#: tab-complete.c:5955
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"ολοκλήρωσης καρτέλας ερωτήματος απέτυχε: %s\n"
+"Το ερώτημα ήταν:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "μη αναγνωρίσιμη τιμή «%s» για «%s»: αναμένεται Boolean"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "άκυρη τιμή «%s» για «%s»: αναμένεται ακέραιος"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "άκυρη ονομασία παραμέτρου «%s»"
+
+#: variables.c:419
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"μη αναγνωρίσιμη τιμή \"%s\" για \"%s\"\n"
+"Οι διαθέσιμες τιμές είναι: %s."
+
+#~ msgid ""
+#~ " \\lo_export LOBOID FILE\n"
+#~ " \\lo_import FILE [COMMENT]\n"
+#~ " \\lo_list\n"
+#~ " \\lo_unlink LOBOID large object operations\n"
+#~ msgstr ""
+#~ " \\lo_export LOBOID FILE\n"
+#~ " \\lo_import FILE [COMMENT]\n"
+#~ " \\lo_list\n"
+#~ " \\lo_unlink LOBOID λειτουργίες μεγάλου αντικειμένου\n"
+
+#~ msgid "All connection parameters must be supplied because no database connection exists"
+#~ msgstr "Πρέπει να δωθούν όλες οι παρέμετροι γιατί δεν υπάρχει σύνδεση με τη βάση δεδομένων"
+
+#~ msgid "Disabled triggers:"
+#~ msgstr "Απενεργοποιημένες triggers:"
+
+#~ msgid "Enter new password: "
+#~ msgstr "Εισάγετε νέο κωδικό πρόσβασης: "
+
+#~ msgid "Special relation \"%s.%s\""
+#~ msgstr "Ειδική σχέση «%s.%s»"
+
+#~ msgid "The server (version %s) does not support altering default privileges."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει την τροποποίηση προεπιλεγμένων δικαιωμάτων."
+
+#~ msgid "The server (version %s) does not support collations."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει συρραφές."
+
+#~ msgid "The server (version %s) does not support editing function source."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει την επεξεργασία πηγών συναρτήσεων."
+
+#~ msgid "The server (version %s) does not support editing view definitions."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει την επεξεργασία ορισμών προβολής."
+
+#~ msgid "The server (version %s) does not support foreign servers."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν ξενικούς διακομιστές."
+
+#~ msgid "The server (version %s) does not support foreign tables."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν ξενικούς πίνακες."
+
+#~ msgid "The server (version %s) does not support foreign-data wrappers."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει περιτύλιξη ξένων δεδομένων."
+
+#~ msgid "The server (version %s) does not support full text search."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει αναζήτηση πλήρους κειμένου."
+
+#~ msgid "The server (version %s) does not support per-database role settings."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει ρυθμίσεις ρόλων ανά βάση δεδομένων."
+
+#~ msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει savepoints για ON_ERROR_ROLLBACK."
+
+#~ msgid "The server (version %s) does not support showing function source."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει την εμφάνιση του κώδικα της συνάρτησης."
+
+#~ msgid "The server (version %s) does not support showing view definitions."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει την επεξεργασία ορισμών προβολής."
+
+#~ msgid "The server (version %s) does not support tablespaces."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει tablespaces."
+
+#~ msgid "The server (version %s) does not support user mappings."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηρίζει αντιστοιχίσεις χρηστών."
+
+#~ msgid "\\watch cannot be used with COPY"
+#~ msgstr "\\watch δεν μπορεί να χρησιμοποιηθεί μαζί με COPY"
+
+#~ msgid "fatal: "
+#~ msgstr "κρίσιμο: "
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "απέτυχε η εντολή pclose: %m"
+
+#~ msgid "special"
+#~ msgstr "ειδικό"
+
+#~ msgid "timezone"
+#~ msgstr "timezone"
+
+#~ msgid "unexpected result status for \\watch"
+#~ msgstr "μη αναμενόμενη κατάσταση αποτελέσματος για \\watch"
+
+#~ msgid "where direction can be empty or one of:"
+#~ msgstr "όπου direction μπορεί να είναι άδειο ή ένα από:"
diff --git a/src/bin/psql/po/es.po b/src/bin/psql/po/es.po
new file mode 100644
index 0000000..e3b001e
--- /dev/null
+++ b/src/bin/psql/po/es.po
@@ -0,0 +1,6405 @@
+# spanish translation of psql.
+#
+# Copyright (c) 2003-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Alvaro Herrera, <alvherre@alvh.no-ip.org>, 2003-2015
+# Diego A. Gil <diego@adminsa.com>, 2005
+# Martín Marqués <martin@2ndquadrant.com>, 2013
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:46+0000\n"
+"PO-Revision-Date: 2023-05-08 11:17+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "no se pudo identificar el directorio actual: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "el binario «%s» no es válido"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "no se pudo leer el binario «%s»"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "no se pudo encontrar un «%s» para ejecutar"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "no se pudo cambiar al directorio «%s»: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "no se pudo leer el enlace simbólico «%s»: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falló: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "no se puede duplicar un puntero nulo (error interno)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "no se pudo buscar el ID de usuario efectivo %ld: %s"
+
+#: ../../common/username.c:45 command.c:575
+msgid "user does not exist"
+msgstr "el usuario no existe"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "fallo en la búsqueda de nombre de usuario: código de error %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "la orden no es ejecutable"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "orden no encontrada"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "el proceso hijo terminó con código de salida %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "el proceso hijo fue terminado por una excepción 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "el proceso hijo fue terminado por una señal %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "el proceso hijo terminó con código no reconocido %d"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Petición de cancelación enviada\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "No se pudo enviar la petición de cancelación: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu fila)"
+msgstr[1] "(%lu filas)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Interrumpido\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "No se puede agregar un encabezado al contenido de la tabla: la cantidad de columnas de %d ha sido excedida.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "No se puede agregar una celda al contenido de la tabla: la cantidad de celdas de %d ha sido excedida.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "formato de salida no válido (error interno): %d"
+
+#: ../../fe_utils/psqlscan.l:702
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "saltando expansión recursiva de la variable «%s»"
+
+#: ../../port/thread.c:100 ../../port/thread.c:136
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "no se pudo buscar el usuario local de ID %d: %s"
+
+#: ../../port/thread.c:105 ../../port/thread.c:141
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "no existe un usuario local con ID %d"
+
+#: command.c:232
+#, c-format
+msgid "invalid command \\%s"
+msgstr "orden \\%s no válida"
+
+#: command.c:234
+#, c-format
+msgid "Try \\? for help."
+msgstr "Digite \\? para obtener ayuda."
+
+#: command.c:252
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: argumento extra «%s» ignorado"
+
+#: command.c:304
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "orden \\%s ignorada: use \\endif o Ctrl-C para salir del bloque \\if actual"
+
+#: command.c:573
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "no se pudo obtener directorio home para el usuario de ID %ld: %s"
+
+#: command.c:592
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: no se pudo cambiar directorio a «%s»: %m"
+
+#: command.c:617
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "No está conectado a una base de datos.\n"
+
+#: command.c:627
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Está conectado a la base de datos «%s» como el usuario «%s» en la dirección «%s» port «%s».\n"
+
+#: command.c:630
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Está conectado a la base de datos «%s» como el usuario «%s» a través del socket en «%s» port «%s».\n"
+
+#: command.c:636
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Está conectado a la base de datos «%s» como el usuario «%s» en el servidor «%s» (dirección «%s») port «%s».\n"
+
+#: command.c:639
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Está conectado a la base de datos «%s» como el usuario «%s» en el servidor «%s» port «%s».\n"
+
+#: command.c:1030 command.c:1125 command.c:2654
+#, c-format
+msgid "no query buffer"
+msgstr "no hay búfer de consulta"
+
+#: command.c:1063 command.c:5491
+#, c-format
+msgid "invalid line number: %s"
+msgstr "número de línea no válido: %s"
+
+#: command.c:1203
+msgid "No changes"
+msgstr "Sin cambios"
+
+#: command.c:1282
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: nombre de codificación no válido o procedimiento de conversión no encontrado"
+
+#: command.c:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597
+#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100
+#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443
+#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1324
+msgid "There is no previous error."
+msgstr "No hay error anterior."
+
+#: command.c:1437
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: falta el paréntesis derecho"
+
+#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989
+#: command.c:2173 command.c:2415 command.c:2621 command.c:2661
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: falta argumento requerido"
+
+#: command.c:1782
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: no puede ocurrir después de \\else"
+
+#: command.c:1787
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: no hay un \\if coincidente"
+
+#: command.c:1851
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: no puede ocurrir después de \\else"
+
+#: command.c:1856
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: no hay un \\if coincidente"
+
+#: command.c:1896
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: no hay un \\if coincidente"
+
+#: command.c:2053
+msgid "Query buffer is empty."
+msgstr "El búfer de consulta está vacío."
+
+#: command.c:2096
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Ingrese nueva contraseña para usuario «%s»: "
+
+#: command.c:2100
+msgid "Enter it again: "
+msgstr "Ingrésela nuevamente: "
+
+#: command.c:2109
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Las contraseñas no coinciden."
+
+#: command.c:2208
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "%s: no se pudo leer el valor para la variable"
+
+#: command.c:2311
+msgid "Query buffer reset (cleared)."
+msgstr "El búfer de consulta ha sido reiniciado (limpiado)."
+
+#: command.c:2333
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "Se escribió la historia en el archivo «%s».\n"
+
+#: command.c:2420
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: el nombre de variable de ambiente no debe contener «=»"
+
+#: command.c:2468
+#, c-format
+msgid "function name is required"
+msgstr "el nombre de la función es requerido"
+
+#: command.c:2470
+#, c-format
+msgid "view name is required"
+msgstr "el nombre de la vista es requerido"
+
+#: command.c:2593
+msgid "Timing is on."
+msgstr "El despliegue de duración está activado."
+
+#: command.c:2595
+msgid "Timing is off."
+msgstr "El despliegue de duración está desactivado."
+
+#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952
+#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008
+#: command.c:4022 command.c:4049 command.c:4107 common.c:77 copy.c:331
+#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:3107 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Contraseña: "
+
+#: command.c:3112 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Contraseña para usuario %s: "
+
+#: command.c:3168
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "No proporcione usuario, host o puerto de forma separada al usar una cadena de conexión"
+
+#: command.c:3203
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "No existe una conexión de base de datos para poder reusar sus parámetros"
+
+#: command.c:3511
+#, c-format
+msgid "Previous connection kept"
+msgstr "Se ha mantenido la conexión anterior"
+
+#: command.c:3517
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3573
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Ahora está conectado a la base de datos «%s» como el usuario «%s» en la dirección «%s» port «%s».\n"
+
+#: command.c:3576
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Ahora está conectado a la base de datos «%s» como el usuario «%s» a través del socket en «%s» port «%s».\n"
+
+#: command.c:3582
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Ahora está conectado a la base de datos «%s» como el usuario «%s» en el servidor «%s» (dirección «%s») port «%s».\n"
+
+#: command.c:3585
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Ahora está conectado a la base de datos «%s» como el usuario «%s» en el servidor «%s» port «%s».\n"
+
+#: command.c:3590
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Ahora está conectado a la base de datos «%s» con el usuario «%s».\n"
+
+#: command.c:3630
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, servidor %s)\n"
+
+#: command.c:3643
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"ADVERTENCIA: %s versión mayor %s, servidor versión mayor %s.\n"
+" Algunas características de psql podrían no funcionar.\n"
+
+#: command.c:3680
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "Conexión SSL (protocolo: %s, cifrado: %s, compresión: %s)\n"
+
+#: command.c:3681 command.c:3682
+msgid "unknown"
+msgstr "desconocido"
+
+#: command.c:3683 help.c:42
+msgid "off"
+msgstr "desactivado"
+
+#: command.c:3683 help.c:42
+msgid "on"
+msgstr "activado"
+
+#: command.c:3697
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "Conexión Cifrada GSSAPI\n"
+
+#: command.c:3717
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"ADVERTENCIA: El código de página de la consola (%u) difiere del código\n"
+" de página de Windows (%u).\n"
+" Los caracteres de 8 bits pueden funcionar incorrectamente.\n"
+" Vea la página de referencia de psql «Notes for Windows users»\n"
+" para obtener más detalles.\n"
+
+#: command.c:3822
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "la variable de ambiente PSQL_EDITOR_LINENUMBER_SWITCH debe estar definida para poder especificar un número de línea"
+
+#: command.c:3851
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "no se pudo iniciar el editor «%s»"
+
+#: command.c:3853
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "no se pudo iniciar /bin/sh"
+
+#: command.c:3903
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "no se pudo ubicar el directorio temporal: %s"
+
+#: command.c:3930
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "no se pudo abrir archivo temporal «%s»: %m"
+
+#: command.c:4266
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: abreviación ambigua «%s» coincide tanto con «%s» como con «%s»"
+
+#: command.c:4286
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: formatos permitidos son aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4305
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: estilos de línea permitidos son ascii, old-ascii, unicode"
+
+#: command.c:4320
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: estilos de línea Unicode de borde permitidos son single, double"
+
+#: command.c:4335
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: estilos de línea Unicode de columna permitidos son single, double"
+
+#: command.c:4350
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: estilos de línea Unicode de encabezado permitidos son single, double"
+
+#: command.c:4393
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep debe ser un carácter de un solo byte"
+
+#: command.c:4398
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldset ni puede ser una comilla doble, un salto de línea, o un retorno de carro"
+
+#: command.c:4535 command.c:4723
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: opción desconocida: %s"
+
+#: command.c:4555
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "El estilo de borde es %d.\n"
+
+#: command.c:4561
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "El ancho no está definido.\n"
+
+#: command.c:4563
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "El ancho es %d.\n"
+
+#: command.c:4570
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Se ha activado el despliegue expandido.\n"
+
+#: command.c:4572
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "El despliegue expandido se usa automáticamente.\n"
+
+#: command.c:4574
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Se ha desactivado el despliegue expandido.\n"
+
+#: command.c:4580
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "El separador de campos para CSV es «%s».\n"
+
+#: command.c:4588 command.c:4596
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "El separador de campos es el byte cero.\n"
+
+#: command.c:4590
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "El separador de campos es «%s».\n"
+
+#: command.c:4603
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "El pie por omisión está activo.\n"
+
+#: command.c:4605
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "El pie de página por omisión está desactivado.\n"
+
+#: command.c:4611
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "El formato de salida es %s.\n"
+
+#: command.c:4617
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "El estilo de línea es %s.\n"
+
+#: command.c:4624
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Despliegue de nulos es «%s».\n"
+
+#: command.c:4632
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "La salida numérica ajustada localmente está habilitada.\n"
+
+#: command.c:4634
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "La salida numérica ajustada localmente está deshabilitada.\n"
+
+#: command.c:4641
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "El paginador se usará para salida larga.\n"
+
+#: command.c:4643
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "El paginador se usará siempre.\n"
+
+#: command.c:4645
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "El paginador no se usará.\n"
+
+#: command.c:4651
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "El paginador no se usará para menos de %d línea.\n"
+msgstr[1] "El paginador no se usará para menos de %d líneas.\n"
+
+#: command.c:4661 command.c:4671
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "El separador de filas es el byte cero.\n"
+
+#: command.c:4663
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "El separador de filas es <salto de línea>.\n"
+
+#: command.c:4665
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "El separador de filas es «%s».\n"
+
+#: command.c:4678
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Los atributos de tabla son «%s».\n"
+
+#: command.c:4681
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Los atributos de tabla han sido indefinidos.\n"
+
+#: command.c:4688
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "El título es «%s».\n"
+
+#: command.c:4690
+#, c-format
+msgid "Title is unset.\n"
+msgstr "El título ha sido indefinido.\n"
+
+#: command.c:4697
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "Mostrar sólo filas está activado.\n"
+
+#: command.c:4699
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "Mostrar sólo filas está desactivado.\n"
+
+#: command.c:4705
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "El estilo Unicode de borde es «%s».\n"
+
+#: command.c:4711
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "El estilo de línea Unicode de columna es «%s».\n"
+
+#: command.c:4717
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "El estilo de línea Unicode de encabezado es «%s».\n"
+
+#: command.c:4950
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: falló"
+
+#: command.c:4984
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch no puede ser usado con una consulta vacía"
+
+#: command.c:5016
+#, c-format
+msgid "could not set timer: %m"
+msgstr "no se pudo establecer un temporizador: %m"
+
+#: command.c:5078
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (cada %gs)\n"
+
+#: command.c:5081
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (cada %gs)\n"
+
+#: command.c:5142
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "no se pudo esperar señales: %m"
+
+#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5386
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "«%s.%s» no es una vista"
+
+#: command.c:5402
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "no se pudo interpretar el array reloptions"
+
+#: common.c:166
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "no se puede escapar sin una conexión activa"
+
+#: common.c:207
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "el argumento de la orden de shell contiene un salto de línea o retorno de carro: «%s»"
+
+#: common.c:311
+#, c-format
+msgid "connection to server was lost"
+msgstr "se ha perdido la conexión al servidor"
+
+#: common.c:315
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "La conexión al servidor se ha perdido. Intentando reiniciar: "
+
+#: common.c:320
+#, c-format
+msgid "Failed.\n"
+msgstr "Falló.\n"
+
+#: common.c:337
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Con éxito.\n"
+
+#: common.c:389 common.c:1001
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "PQresultStatus no esperado: %d"
+
+#: common.c:511
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Duración: %.3f ms\n"
+
+#: common.c:526
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Duración: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:535
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Duración: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:542
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Duración: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:566 common.c:623 common.c:1034 describe.c:6135
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "No está conectado a una base de datos."
+
+#: common.c:654
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "Notificación asíncrona «%s» con carga «%s» recibida del proceso de servidor con PID %d.\n"
+
+#: common.c:657
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "Notificación asíncrona «%s» recibida del proceso de servidor con PID %d.\n"
+
+#: common.c:688
+#, c-format
+msgid "could not print result table: %m"
+msgstr "no se pudo mostrar la tabla de resultados: %m"
+
+#: common.c:708
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "\\gset no retornó renglón alguno"
+
+#: common.c:713
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "\\gset retornó más de un renglón"
+
+#: common.c:731
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "se ignoró intentó de hacer \\gset a variable con tratamiento especial «%s»"
+
+#: common.c:1043
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Modo paso a paso: verifique la orden)****************************************\n"
+"%s\n"
+"***(presione enter para continuar, o x y enter para cancelar)*******************\n"
+
+#: common.c:1126
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "SENTENCIA: %s"
+
+#: common.c:1162
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "estado de transacción inesperado (%d)"
+
+#: common.c:1303 describe.c:2020
+msgid "Column"
+msgstr "Columna"
+
+#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037
+#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021
+#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504
+#: describe.c:5767
+msgid "Type"
+msgstr "Tipo"
+
+#: common.c:1353
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "La orden no tiene resultado, o el resultado no tiene columnas.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: argumentos requeridos"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: error de procesamiento en «%s»"
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: error de procesamiento al final de la línea"
+
+#: copy.c:328
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "no se pudo ejecutar la orden «%s»: %m"
+
+#: copy.c:344
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "no se pudo hacer stat al archivo «%s»: %m"
+
+#: copy.c:348
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: no se puede copiar desde/hacia un directorio"
+
+#: copy.c:385
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "no se pudo cerrar la tubería a la orden externa: %m"
+
+#: copy.c:390
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: copy.c:453 copy.c:463
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "no se pudo escribir datos COPY: %m"
+
+#: copy.c:469
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "falló la transferencia de datos COPY: %s"
+
+#: copy.c:530
+msgid "canceled by user"
+msgstr "cancelada por el usuario"
+
+#: copy.c:541
+msgid ""
+"Enter data to be copied followed by a newline.\n"
+"End with a backslash and a period on a line by itself, or an EOF signal."
+msgstr ""
+"Ingrese los datos a ser copiados seguidos de un fin de línea.\n"
+"Termine con un backslash y un punto, o una señal EOF."
+
+#: copy.c:684
+msgid "aborted because of read failure"
+msgstr "se abortó por un error de lectura"
+
+#: copy.c:718
+msgid "trying to exit copy mode"
+msgstr "tratando de salir del modo copy"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: la sentencia no produjo un conjunto de resultados"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: la consulta debe retornar al menos tres columnas"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: los encabezados verticales y horizontales deben ser columnas distintas"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: la columna de datos debe ser especificada cuando la consulta retorna más de tres columnas"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: se superó el número máximo de columnas (%d)"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: el resultado de la consulta contiene múltiples valores para la fila «%s», columna «%s»"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: el número de columna %d está fuera del rango 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: nombre de columna «%s» ambiguo"
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: nombre de columna «%s» no encontrado"
+
+#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029
+#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090
+#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866
+#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420
+#: describe.c:5477 describe.c:5881 describe.c:5959
+msgid "Schema"
+msgstr "Esquema"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636
+#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258
+#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341
+#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867
+#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410
+#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748
+#: describe.c:5957 describe.c:6186 describe.c:6494
+msgid "Name"
+msgstr "Nombre"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "Tipo de dato de salida"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "Tipos de datos de argumentos"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423
+#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041
+#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280
+#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777
+#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248
+#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422
+#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895
+#: describe.c:5960 describe.c:6992
+msgid "Description"
+msgstr "Descripción"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "Listado de funciones de agregación"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "El servidor (versión %s) no soporta métodos de acceso."
+
+#: describe.c:168
+msgid "Index"
+msgstr "Indice"
+
+#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882
+msgid "Table"
+msgstr "Tabla"
+
+#: describe.c:177 describe.c:5679
+msgid "Handler"
+msgstr "Manejador"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "Lista de métodos de acceso"
+
+#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181
+#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588
+#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187
+#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718
+#: describe.c:6980
+msgid "Owner"
+msgstr "Dueño"
+
+#: describe.c:231
+msgid "Location"
+msgstr "Ubicación"
+
+#: describe.c:241 describe.c:3509
+msgid "Options"
+msgstr "Opciones"
+
+#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934
+msgid "Size"
+msgstr "Tamaño"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "Listado de tablespaces"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df sólo acepta las opciones [antpwS+]"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df no acepta la opción «%c» en un servidor versión %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "agg"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "ventana"
+
+#: describe.c:356
+msgid "proc"
+msgstr "proc"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "func"
+
+#: describe.c:374 describe.c:1390
+msgid "trigger"
+msgstr "disparador"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "inmutable"
+
+#: describe.c:387
+msgid "stable"
+msgstr "estable"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "volátil"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "Volatilidad"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "restringida"
+
+#: describe.c:398
+msgid "safe"
+msgstr "segura"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "insegura"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "Paralelismo"
+
+#: describe.c:405
+msgid "definer"
+msgstr "definidor"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "invocador"
+
+#: describe.c:407
+msgid "Security"
+msgstr "Seguridad"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Lenguaje"
+
+#: describe.c:416 describe.c:420
+msgid "Source code"
+msgstr "Código fuente"
+
+#: describe.c:594
+msgid "List of functions"
+msgstr "Listado de funciones"
+
+#: describe.c:657
+msgid "Internal name"
+msgstr "Nombre interno"
+
+#: describe.c:659
+msgid "Elements"
+msgstr "Elementos"
+
+#: describe.c:711
+msgid "List of data types"
+msgstr "Listado de tipos de dato"
+
+#: describe.c:814
+msgid "Left arg type"
+msgstr "Tipo arg izq"
+
+#: describe.c:815
+msgid "Right arg type"
+msgstr "Tipo arg der"
+
+#: describe.c:816
+msgid "Result type"
+msgstr "Tipo resultado"
+
+#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247
+#: describe.c:6909 describe.c:6913
+msgid "Function"
+msgstr "Función"
+
+#: describe.c:902
+msgid "List of operators"
+msgstr "Listado de operadores"
+
+#: describe.c:938
+msgid "Encoding"
+msgstr "Codificación"
+
+#: describe.c:939 describe.c:4868
+msgid "Collate"
+msgstr "Collate"
+
+#: describe.c:940 describe.c:4869
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878
+msgid "ICU Locale"
+msgstr "configuración ICU"
+
+#: describe.c:946 describe.c:952
+msgid "Locale Provider"
+msgstr "Proveedor de locale"
+
+#: describe.c:964
+msgid "Tablespace"
+msgstr "Tablespace"
+
+#: describe.c:990
+msgid "List of databases"
+msgstr "Listado de base de datos"
+
+#: describe.c:1031 describe.c:1184 describe.c:3882
+msgid "table"
+msgstr "tabla"
+
+#: describe.c:1032 describe.c:3883
+msgid "view"
+msgstr "vista"
+
+#: describe.c:1033 describe.c:3884
+msgid "materialized view"
+msgstr "vistas materializadas"
+
+#: describe.c:1034 describe.c:1186 describe.c:3886
+msgid "sequence"
+msgstr "secuencia"
+
+#: describe.c:1035 describe.c:3888
+msgid "foreign table"
+msgstr "tabla foránea"
+
+#: describe.c:1036 describe.c:3889 describe.c:4101
+msgid "partitioned table"
+msgstr "tabla particionada"
+
+#: describe.c:1047
+msgid "Column privileges"
+msgstr "Privilegios de acceso a columnas"
+
+#: describe.c:1078 describe.c:1112
+msgid "Policies"
+msgstr "Políticas"
+
+#: describe.c:1143 describe.c:4510 describe.c:6577
+msgid "Access privileges"
+msgstr "Privilegios"
+
+#: describe.c:1188
+msgid "function"
+msgstr "función"
+
+#: describe.c:1190
+msgid "type"
+msgstr "tipo"
+
+#: describe.c:1192
+msgid "schema"
+msgstr "esquema"
+
+#: describe.c:1215
+msgid "Default access privileges"
+msgstr "Privilegios de acceso por omisión"
+
+#: describe.c:1259
+msgid "Object"
+msgstr "Objeto"
+
+#: describe.c:1273
+msgid "table constraint"
+msgstr "restricción de tabla"
+
+#: describe.c:1297
+msgid "domain constraint"
+msgstr "restricción de dominio"
+
+#: describe.c:1321
+msgid "operator class"
+msgstr "clase de operadores"
+
+#: describe.c:1345
+msgid "operator family"
+msgstr "familia de operadores"
+
+#: describe.c:1368
+msgid "rule"
+msgstr "regla"
+
+#: describe.c:1414
+msgid "Object descriptions"
+msgstr "Descripciones de objetos"
+
+#: describe.c:1479 describe.c:4007
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "No se encontró relación llamada «%s»."
+
+#: describe.c:1482 describe.c:4010
+#, c-format
+msgid "Did not find any relations."
+msgstr "No se encontró ninguna relación."
+
+#: describe.c:1678
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "No se encontró relación con OID %s."
+
+#: describe.c:1726 describe.c:1750
+msgid "Start"
+msgstr "Inicio"
+
+#: describe.c:1727 describe.c:1751
+msgid "Minimum"
+msgstr "Mínimo"
+
+#: describe.c:1728 describe.c:1752
+msgid "Maximum"
+msgstr "Máximo"
+
+#: describe.c:1729 describe.c:1753
+msgid "Increment"
+msgstr "Incremento"
+
+#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426
+#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620
+msgid "yes"
+msgstr "sí"
+
+#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426
+#: describe.c:4768 describe.c:4892 describe.c:6621
+msgid "no"
+msgstr "no"
+
+#: describe.c:1732 describe.c:1756
+msgid "Cycles?"
+msgstr "¿Cicla?"
+
+#: describe.c:1733 describe.c:1757
+msgid "Cache"
+msgstr "Cache"
+
+#: describe.c:1798
+#, c-format
+msgid "Owned by: %s"
+msgstr "Asociada a: %s"
+
+#: describe.c:1802
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Secuencia para columna identidad: %s"
+
+#: describe.c:1810
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "Secuencia unlogged «%s.%s»"
+
+#: describe.c:1813
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Secuencia «%s.%s»"
+
+#: describe.c:1957
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Tabla unlogged «%s.%s»"
+
+#: describe.c:1960
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Tabla «%s.%s»"
+
+#: describe.c:1964
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Vista «%s.%s»"
+
+#: describe.c:1969
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Vista materializada unlogged «%s.%s»"
+
+#: describe.c:1972
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Vista materializada \"%s.%s\""
+
+#: describe.c:1977
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Índice unlogged «%s.%s»"
+
+#: describe.c:1980
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Índice «%s.%s»"
+
+#: describe.c:1985
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Índice particionado unlogged «%s.%s»"
+
+#: describe.c:1988
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Índice particionado «%s.%s»"
+
+#: describe.c:1992
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "Tabla TOAST «%s.%s»"
+
+#: describe.c:1996
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Tipo compuesto «%s.%s»"
+
+#: describe.c:2000
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Tabla foránea «%s.%s»"
+
+#: describe.c:2005
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Tabla unlogged particionada «%s.%s»"
+
+#: describe.c:2008
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Tabla particionada «%s.%s»"
+
+#: describe.c:2024 describe.c:4343
+msgid "Collation"
+msgstr "Ordenamiento"
+
+#: describe.c:2025 describe.c:4344
+msgid "Nullable"
+msgstr "Nulable"
+
+#: describe.c:2026 describe.c:4345
+msgid "Default"
+msgstr "Por omisión"
+
+#: describe.c:2029
+msgid "Key?"
+msgstr "¿Llave?"
+
+#: describe.c:2031 describe.c:4665 describe.c:4676
+msgid "Definition"
+msgstr "Definición"
+
+#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835
+#: describe.c:5894
+msgid "FDW options"
+msgstr "Opciones de FDW"
+
+#: describe.c:2035
+msgid "Storage"
+msgstr "Almacenamiento"
+
+#: describe.c:2037
+msgid "Compression"
+msgstr "Compresión"
+
+#: describe.c:2039
+msgid "Stats target"
+msgstr "Estadísticas"
+
+#: describe.c:2175
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "Partición de: %s %s%s"
+
+#: describe.c:2188
+msgid "No partition constraint"
+msgstr "Sin restricción de partición"
+
+#: describe.c:2190
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Restricción de partición: %s"
+
+#: describe.c:2214
+#, c-format
+msgid "Partition key: %s"
+msgstr "Llave de partición: %s"
+
+#: describe.c:2240
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Tabla dueña: «%s.%s»"
+
+#: describe.c:2309
+msgid "primary key, "
+msgstr "llave primaria, "
+
+#: describe.c:2312
+msgid "unique"
+msgstr "único"
+
+#: describe.c:2314
+msgid " nulls not distinct"
+msgstr " nulls no distintos"
+
+#: describe.c:2315
+msgid ", "
+msgstr ", "
+
+#: describe.c:2322
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "de tabla «%s.%s»"
+
+#: describe.c:2326
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", predicado (%s)"
+
+#: describe.c:2329
+msgid ", clustered"
+msgstr ", clustered"
+
+#: describe.c:2332
+msgid ", invalid"
+msgstr ", no válido"
+
+#: describe.c:2335
+msgid ", deferrable"
+msgstr ", postergable"
+
+#: describe.c:2338
+msgid ", initially deferred"
+msgstr ", inicialmente postergada"
+
+#: describe.c:2341
+msgid ", replica identity"
+msgstr ", identidad de replicación"
+
+#: describe.c:2395
+msgid "Indexes:"
+msgstr "Índices:"
+
+#: describe.c:2478
+msgid "Check constraints:"
+msgstr "Restricciones CHECK:"
+
+#: describe.c:2546
+msgid "Foreign-key constraints:"
+msgstr "Restricciones de llave foránea:"
+
+#: describe.c:2609
+msgid "Referenced by:"
+msgstr "Referenciada por:"
+
+#: describe.c:2659
+msgid "Policies:"
+msgstr "Políticas:"
+
+#: describe.c:2662
+msgid "Policies (forced row security enabled):"
+msgstr "Políticas (seguridad de registros forzada):"
+
+#: describe.c:2665
+msgid "Policies (row security enabled): (none)"
+msgstr "Políticas (seguridad de filas activa): (ninguna)"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Políticas (seguridad de filas forzada): (ninguna)"
+
+#: describe.c:2671
+msgid "Policies (row security disabled):"
+msgstr "Políticas (seguridad de filas inactiva):"
+
+#: describe.c:2731 describe.c:2835
+msgid "Statistics objects:"
+msgstr "Objetos de estadísticas:"
+
+#: describe.c:2937 describe.c:3090
+msgid "Rules:"
+msgstr "Reglas:"
+
+#: describe.c:2940
+msgid "Disabled rules:"
+msgstr "Reglas deshabilitadas:"
+
+#: describe.c:2943
+msgid "Rules firing always:"
+msgstr "Reglas que se activan siempre:"
+
+#: describe.c:2946
+msgid "Rules firing on replica only:"
+msgstr "Reglas que se activan sólo en las réplicas:"
+
+#: describe.c:3025 describe.c:5030
+msgid "Publications:"
+msgstr "Publicaciones:"
+
+#: describe.c:3073
+msgid "View definition:"
+msgstr "Definición de vista:"
+
+#: describe.c:3236
+msgid "Triggers:"
+msgstr "Triggers:"
+
+#: describe.c:3239
+msgid "Disabled user triggers:"
+msgstr "Disparadores de usuario deshabilitados:"
+
+#: describe.c:3242
+msgid "Disabled internal triggers:"
+msgstr "Disparadores internos deshabilitados:"
+
+#: describe.c:3245
+msgid "Triggers firing always:"
+msgstr "Disparadores que siempre se ejecutan:"
+
+#: describe.c:3248
+msgid "Triggers firing on replica only:"
+msgstr "Disparadores que se ejecutan sólo en las réplicas:"
+
+#: describe.c:3319
+#, c-format
+msgid "Server: %s"
+msgstr "Servidor: %s"
+
+#: describe.c:3327
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "Opciones de FDW: (%s)"
+
+#: describe.c:3348
+msgid "Inherits"
+msgstr "Hereda"
+
+#: describe.c:3413
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "Número de particiones: %d"
+
+#: describe.c:3422
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Número de particiones: %d (Use \\d+ para listarlas.)"
+
+#: describe.c:3424
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Número de tablas hijas: %d (Use \\d+ para listarlas.)"
+
+#: describe.c:3431
+msgid "Child tables"
+msgstr "Tablas hijas"
+
+#: describe.c:3431
+msgid "Partitions"
+msgstr "Particiones"
+
+#: describe.c:3462
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Tabla tipada de tipo: %s"
+
+#: describe.c:3478
+msgid "Replica Identity"
+msgstr "Identidad de replicación"
+
+#: describe.c:3491
+msgid "Has OIDs: yes"
+msgstr "Tiene OIDs: sí"
+
+#: describe.c:3500
+#, c-format
+msgid "Access method: %s"
+msgstr "Método de acceso: %s"
+
+#: describe.c:3579
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "Tablespace: «%s»"
+
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:3591
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", tablespace «%s»"
+
+#: describe.c:3668
+msgid "List of roles"
+msgstr "Lista de roles"
+
+#: describe.c:3670
+msgid "Role name"
+msgstr "Nombre de rol"
+
+#: describe.c:3671
+msgid "Attributes"
+msgstr "Atributos"
+
+#: describe.c:3673
+msgid "Member of"
+msgstr "Miembro de"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "Superusuario"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "Sin herencia"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "Crear rol"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "Crear BD"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "No puede conectarse"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "Replicación"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "Ignora RLS"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "Ninguna conexión"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d conexión"
+msgstr[1] "%d conexiones"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Constraseña válida hasta "
+
+#: describe.c:3777
+msgid "Role"
+msgstr "Nombre de rol"
+
+#: describe.c:3778
+msgid "Database"
+msgstr "Base de Datos"
+
+#: describe.c:3779
+msgid "Settings"
+msgstr "Parámetros"
+
+#: describe.c:3803
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "No se encontró ningún parámetro para el rol «%s» y la base de datos «%s»."
+
+#: describe.c:3806
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "No se encontró ningún parámetro para el rol «%s»."
+
+#: describe.c:3809
+#, c-format
+msgid "Did not find any settings."
+msgstr "No se encontró ningún parámetro."
+
+#: describe.c:3814
+msgid "List of settings"
+msgstr "Listado de parámetros"
+
+#: describe.c:3885
+msgid "index"
+msgstr "índice"
+
+#: describe.c:3887
+msgid "TOAST table"
+msgstr "Tabla TOAST"
+
+#: describe.c:3890 describe.c:4102
+msgid "partitioned index"
+msgstr "índice particionado"
+
+#: describe.c:3910
+msgid "permanent"
+msgstr "permanente"
+
+#: describe.c:3911
+msgid "temporary"
+msgstr "temporal"
+
+#: describe.c:3912
+msgid "unlogged"
+msgstr "unlogged"
+
+#: describe.c:3913
+msgid "Persistence"
+msgstr "Persistencia"
+
+#: describe.c:3929
+msgid "Access method"
+msgstr "Método de acceso"
+
+#: describe.c:4015
+msgid "List of relations"
+msgstr "Listado de relaciones"
+
+#: describe.c:4063
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "El servidor (versión %s) no soporta particionamiento declarativo de tablas."
+
+#: describe.c:4074
+msgid "List of partitioned indexes"
+msgstr "Listado de índices particionados"
+
+#: describe.c:4076
+msgid "List of partitioned tables"
+msgstr "Listado de tablas particionadas"
+
+#: describe.c:4080
+msgid "List of partitioned relations"
+msgstr "Listado de relaciones particionadas"
+
+#: describe.c:4111
+msgid "Parent name"
+msgstr "Nombre del padre"
+
+#: describe.c:4124
+msgid "Leaf partition size"
+msgstr "Tamaño de particiones hoja"
+
+#: describe.c:4127 describe.c:4133
+msgid "Total size"
+msgstr "Tamaño total"
+
+#: describe.c:4258
+msgid "Trusted"
+msgstr "Confiable"
+
+#: describe.c:4267
+msgid "Internal language"
+msgstr "Lenguaje interno"
+
+#: describe.c:4268
+msgid "Call handler"
+msgstr "Manejador de llamada"
+
+#: describe.c:4269 describe.c:5680
+msgid "Validator"
+msgstr "Validador"
+
+#: describe.c:4270
+msgid "Inline handler"
+msgstr "Manejador en línea"
+
+#: describe.c:4305
+msgid "List of languages"
+msgstr "Lista de lenguajes"
+
+#: describe.c:4346
+msgid "Check"
+msgstr "Check"
+
+#: describe.c:4390
+msgid "List of domains"
+msgstr "Listado de dominios"
+
+#: describe.c:4424
+msgid "Source"
+msgstr "Fuente"
+
+#: describe.c:4425
+msgid "Destination"
+msgstr "Destino"
+
+#: describe.c:4427 describe.c:6622
+msgid "Default?"
+msgstr "Por omisión?"
+
+#: describe.c:4469
+msgid "List of conversions"
+msgstr "Listado de conversiones"
+
+#: describe.c:4497
+msgid "Parameter"
+msgstr "Parámetro"
+
+#: describe.c:4498
+msgid "Value"
+msgstr "Valor"
+
+#: describe.c:4505
+msgid "Context"
+msgstr "Contexto"
+
+#: describe.c:4538
+msgid "List of configuration parameters"
+msgstr "Listado de parámetro de configuración"
+
+#: describe.c:4540
+msgid "List of non-default configuration parameters"
+msgstr "Listado de parámetros de configuración no-default"
+
+#: describe.c:4567
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "El servidor (versión %s) no soporta triggers por eventos."
+
+#: describe.c:4587
+msgid "Event"
+msgstr "Evento"
+
+#: describe.c:4589
+msgid "enabled"
+msgstr "activo"
+
+#: describe.c:4590
+msgid "replica"
+msgstr "réplica"
+
+#: describe.c:4591
+msgid "always"
+msgstr "siempre"
+
+#: describe.c:4592
+msgid "disabled"
+msgstr "inactivo"
+
+#: describe.c:4593 describe.c:6496
+msgid "Enabled"
+msgstr "Activo"
+
+#: describe.c:4595
+msgid "Tags"
+msgstr "Etiquetas"
+
+#: describe.c:4619
+msgid "List of event triggers"
+msgstr "Listado de disparadores por eventos"
+
+#: describe.c:4646
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "El servidor (versión %s) no soporta estadísticas extendidas."
+
+#: describe.c:4683
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4684
+msgid "Dependencies"
+msgstr "Dependencias"
+
+#: describe.c:4694
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4718
+msgid "List of extended statistics"
+msgstr "Lista de estadísticas extendidas"
+
+#: describe.c:4745
+msgid "Source type"
+msgstr "Tipo fuente"
+
+#: describe.c:4746
+msgid "Target type"
+msgstr "Tipo destino"
+
+#: describe.c:4770
+msgid "in assignment"
+msgstr "en asignación"
+
+#: describe.c:4772
+msgid "Implicit?"
+msgstr "Implícito?"
+
+#: describe.c:4831
+msgid "List of casts"
+msgstr "Listado de conversiones de tipo (casts)"
+
+#: describe.c:4883 describe.c:4887
+msgid "Provider"
+msgstr "Proveedor"
+
+#: describe.c:4893 describe.c:4898
+msgid "Deterministic?"
+msgstr "¿Determinístico?"
+
+#: describe.c:4938
+msgid "List of collations"
+msgstr "Listado de ordenamientos"
+
+#: describe.c:5000
+msgid "List of schemas"
+msgstr "Listado de esquemas"
+
+#: describe.c:5117
+msgid "List of text search parsers"
+msgstr "Listado de analizadores de búsqueda en texto"
+
+#: describe.c:5167
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "No se encontró ningún analizador de búsqueda en texto llamado «%s»."
+
+#: describe.c:5170
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "No se encontró ningún analizador de búsqueda en texto."
+
+#: describe.c:5245
+msgid "Start parse"
+msgstr "Inicio de parse"
+
+#: describe.c:5246
+msgid "Method"
+msgstr "Método"
+
+#: describe.c:5250
+msgid "Get next token"
+msgstr "Obtener siguiente elemento"
+
+#: describe.c:5252
+msgid "End parse"
+msgstr "Fin de parse"
+
+#: describe.c:5254
+msgid "Get headline"
+msgstr "Obtener encabezado"
+
+#: describe.c:5256
+msgid "Get token types"
+msgstr "Obtener tipos de elemento"
+
+#: describe.c:5267
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Analizador de búsqueda en texto «%s.%s»"
+
+#: describe.c:5270
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Analizador de búsqueda en texto «%s»"
+
+#: describe.c:5289
+msgid "Token name"
+msgstr "Nombre de elemento"
+
+#: describe.c:5303
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Tipos de elemento para el analizador «%s.%s»"
+
+#: describe.c:5306
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Tipos de elemento para el analizador «%s»"
+
+#: describe.c:5350
+msgid "Template"
+msgstr "Plantilla"
+
+#: describe.c:5351
+msgid "Init options"
+msgstr "Opciones de inicialización"
+
+#: describe.c:5378
+msgid "List of text search dictionaries"
+msgstr "Listado de diccionarios de búsqueda en texto"
+
+#: describe.c:5411
+msgid "Init"
+msgstr "Inicializador"
+
+#: describe.c:5412
+msgid "Lexize"
+msgstr "Fn. análisis léx."
+
+#: describe.c:5444
+msgid "List of text search templates"
+msgstr "Listado de plantillas de búsqueda en texto"
+
+#: describe.c:5499
+msgid "List of text search configurations"
+msgstr "Listado de configuraciones de búsqueda en texto"
+
+#: describe.c:5550
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "No se encontró una configuración de búsqueda en texto llamada «%s»."
+
+#: describe.c:5553
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "No se encontró una configuración de búsqueda en texto."
+
+#: describe.c:5619
+msgid "Token"
+msgstr "Elemento"
+
+#: describe.c:5620
+msgid "Dictionaries"
+msgstr "Diccionarios"
+
+#: describe.c:5631
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Configuración de búsqueda en texto «%s.%s»"
+
+#: describe.c:5634
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Configuración de búsqueda en texto «%s»"
+
+#: describe.c:5638
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Analizador: «%s.%s»"
+
+#: describe.c:5641
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Analizador: «%s»"
+
+#: describe.c:5722
+msgid "List of foreign-data wrappers"
+msgstr "Listado de conectores de datos externos"
+
+#: describe.c:5750
+msgid "Foreign-data wrapper"
+msgstr "Conectores de datos externos"
+
+#: describe.c:5768 describe.c:5958
+msgid "Version"
+msgstr "Versión"
+
+#: describe.c:5799
+msgid "List of foreign servers"
+msgstr "Listado de servidores foráneos"
+
+#: describe.c:5824 describe.c:5883
+msgid "Server"
+msgstr "Servidor"
+
+#: describe.c:5825
+msgid "User name"
+msgstr "Nombre de usuario"
+
+#: describe.c:5855
+msgid "List of user mappings"
+msgstr "Listado de mapeos de usuario"
+
+#: describe.c:5928
+msgid "List of foreign tables"
+msgstr "Listado de tablas foráneas"
+
+#: describe.c:5980
+msgid "List of installed extensions"
+msgstr "Listado de extensiones instaladas"
+
+#: describe.c:6028
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "No se encontró extensión llamada «%s»."
+
+#: describe.c:6031
+#, c-format
+msgid "Did not find any extensions."
+msgstr "No se encontró ninguna extensión."
+
+#: describe.c:6075
+msgid "Object description"
+msgstr "Descripción de objeto"
+
+#: describe.c:6085
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Objetos en extensión «%s»"
+
+#: describe.c:6126
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "el nombre no es válido (demasiados puntos): %s"
+
+#: describe.c:6140
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "no están implementadas las referencias entre bases de datos: %s"
+
+#: describe.c:6171 describe.c:6298
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "El servidor (versión %s) no soporta publicaciones."
+
+#: describe.c:6188 describe.c:6376
+msgid "All tables"
+msgstr "Todas las tablas"
+
+#: describe.c:6189 describe.c:6377
+msgid "Inserts"
+msgstr "Inserts"
+
+#: describe.c:6190 describe.c:6378
+msgid "Updates"
+msgstr "Updates"
+
+#: describe.c:6191 describe.c:6379
+msgid "Deletes"
+msgstr "Deletes"
+
+#: describe.c:6195 describe.c:6381
+msgid "Truncates"
+msgstr "Truncates"
+
+#: describe.c:6199 describe.c:6383
+msgid "Via root"
+msgstr "Via root"
+
+#: describe.c:6221
+msgid "List of publications"
+msgstr "Listado de publicaciones"
+
+#: describe.c:6345
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "No se encontró publicación llamada «%s»."
+
+#: describe.c:6348
+#, c-format
+msgid "Did not find any publications."
+msgstr "No se encontró ninguna publicación."
+
+#: describe.c:6372
+#, c-format
+msgid "Publication %s"
+msgstr "Publicación %s"
+
+#: describe.c:6425
+msgid "Tables:"
+msgstr "Tablas:"
+
+#: describe.c:6437
+msgid "Tables from schemas:"
+msgstr "Tablas de esquemas:"
+
+#: describe.c:6481
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "El servidor (versión %s) no soporta suscripciones."
+
+#: describe.c:6497
+msgid "Publication"
+msgstr "Publicación"
+
+#: describe.c:6506
+msgid "Binary"
+msgstr "Binario"
+
+#: describe.c:6507
+msgid "Streaming"
+msgstr "De flujo"
+
+#: describe.c:6514
+msgid "Two-phase commit"
+msgstr "Commit 2-fases"
+
+#: describe.c:6515
+msgid "Disable on error"
+msgstr "Desactivar en error"
+
+#: describe.c:6520
+msgid "Synchronous commit"
+msgstr "Commit síncrono"
+
+#: describe.c:6521
+msgid "Conninfo"
+msgstr "Conninfo"
+
+#: describe.c:6527
+msgid "Skip LSN"
+msgstr "Saltar LSN"
+
+#: describe.c:6554
+msgid "List of subscriptions"
+msgstr "Listado de suscripciones"
+
+#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6617
+msgid "Input type"
+msgstr "Tipo de entrada"
+
+#: describe.c:6618
+msgid "Storage type"
+msgstr "Tipo de almacenamiento"
+
+#: describe.c:6619
+msgid "Operator class"
+msgstr "Clase de operador"
+
+#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901
+msgid "Operator family"
+msgstr "Familia de operadores"
+
+#: describe.c:6667
+msgid "List of operator classes"
+msgstr "Listado de clases de operador"
+
+#: describe.c:6714
+msgid "Applicable types"
+msgstr "Tipos aplicables"
+
+#: describe.c:6756
+msgid "List of operator families"
+msgstr "Listado de familias de operadores"
+
+#: describe.c:6807
+msgid "Operator"
+msgstr "Operador"
+
+#: describe.c:6808
+msgid "Strategy"
+msgstr "Estrategia"
+
+#: describe.c:6809
+msgid "ordering"
+msgstr "ordenamiento"
+
+#: describe.c:6810
+msgid "search"
+msgstr "búsqueda"
+
+#: describe.c:6811
+msgid "Purpose"
+msgstr "Propósito"
+
+#: describe.c:6816
+msgid "Sort opfamily"
+msgstr "familia de ops de ordenamiento"
+
+#: describe.c:6855
+msgid "List of operators of operator families"
+msgstr "Lista de operadores de familias de operadores"
+
+#: describe.c:6902
+msgid "Registered left type"
+msgstr "Tipo de dato izquierdo registrado"
+
+#: describe.c:6903
+msgid "Registered right type"
+msgstr "Tipo de dato derecho registrado"
+
+#: describe.c:6904
+msgid "Number"
+msgstr "Número"
+
+#: describe.c:6948
+msgid "List of support functions of operator families"
+msgstr "Listado de funciones de la familia de operadores %s"
+
+#: describe.c:6979
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7000
+msgid "Large objects"
+msgstr "Objetos grandes"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql es el terminal interactivo de PostgreSQL.\n"
+"\n"
+
+#: help.c:76 help.c:393 help.c:473 help.c:516
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [OPCIONES]... [BASE-DE-DATOS [USUARIO]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "Opciones generales:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=ORDEN ejecutar sólo una orden (SQL o interna) y salir\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr ""
+" -d, --dbname=NOMBRE nombre de base de datos a conectarse\n"
+" (por omisión: «%s»)\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=ARCHIVO ejecutar órdenes desde archivo, luego salir\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list listar bases de datos, luego salir\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NOMBRE=VALOR\n"
+" definir variable de psql NOMBRE a VALOR\n"
+" (p.ej. -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión, luego salir\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc no leer archivo de configuración (~/.psqlrc)\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 («uno»), --single-transaction\n"
+" ejecuta órdenes en una única transacción\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=opcs] mostrar esta ayuda, luego salir\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands listar órdenes backslash, luego salir\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables listar variables especiales, luego salir\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Opciones de entrada y salida:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all mostrar las órdenes del script\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors mostrar órdenes fallidas\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries mostrar órdenes enviadas al servidor\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden mostrar consultas generadas por órdenes internas\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=ARCH envía el registro de la sesión a un archivo\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline deshabilitar edición de línea de órdenes (readline)\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=ARCHIVO enviar resultados de consultas a archivo (u |orden)\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet modo silencioso (sin mensajes, sólo resultados)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step modo paso a paso (confirmar cada consulta)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line modo de líneas (fin de línea termina la orden SQL)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Opciones de formato de salida:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align modo de salida desalineado\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv modo de salida de tabla CSV (valores separados por comas)\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=CADENA separador de campos para salida desalineada\n"
+" (por omisión: «%s»)\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html modo de salida en tablas HTML\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=VAR[=ARG] definir opción de impresión VAR en ARG (ver orden \\pset)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=CADENA separador de registros para salida desalineada\n"
+" (por omisión: salto de línea)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only sólo muestra registros\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr ""
+" -T, --table-attr=TEXTO\n"
+" definir atributos de marcas de tabla HTML (ancho, borde)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded activar modo expandido de salida de tablas\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" definir separador de campos para salida desalineada al byte cero\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" definir separador de filas para salida desalineada al byte cero\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opciones de conexión:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr ""
+" -h, --host=NOMBRE nombre del anfitrión o directorio de socket\n"
+" (por omisión: «%s»)\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "socket local"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PUERTO puerto del servidor (por omisión: «%s»)\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr ""
+" -U, --username=NOMBRE\n"
+" nombre de usuario (por omisión: «%s»)\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pedir contraseña\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password forzar petición de contraseña\n"
+" (debería ser automático)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Para obtener más ayuda, digite «\\?» (para órdenes internas) o «\\help»\n"
+"(para órdenes SQL) dentro de psql, o consulte la sección de psql\n"
+"en la documentación de PostgreSQL.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Reporte de errores a <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "General\n"
+
+#: help.c:192
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright mostrar términos de uso y distribución de PostgreSQL\n"
+
+#: help.c:193
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr ""
+" \\crosstabview [COLUMNAS]\n"
+" ejecutar la consulta y desplegar en «crosstab»\n"
+
+#: help.c:194
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose mostrar error más reciente en máxima verbosidad\n"
+
+#: help.c:195
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPTIONS)] [FILE]\n"
+" ejecuta la consulta (y envía el resultado a un fichero o |pipe);\n"
+" \\g sin argumentos es equivalente a un punto y coma\n"
+
+#: help.c:197
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc describir resultado de la consulta, sin ejecutarla\n"
+
+#: help.c:198
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec ejecutar la consulta, luego ejecuta cada valor del resultado\n"
+
+#: help.c:199
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr ""
+" \\gset [PREFIJO] ejecutar la consulta y almacenar el resultado en variables\n"
+" de psql\n"
+
+#: help.c:200
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr ""
+" \\gx [(OPTIONS)] [FILE]\n"
+" como \\g, pero fuerza el modo de salida expandido\n"
+
+#: help.c:201
+msgid " \\q quit psql\n"
+msgstr " \\q salir de psql\n"
+
+#: help.c:202
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SEGS] ejecutar consulta cada SEGS segundos\n"
+
+#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304
+#: help.c:324 help.c:337 help.c:346
+msgid "\n"
+msgstr "\n"
+
+#: help.c:205
+msgid "Help\n"
+msgstr "Ayuda\n"
+
+#: help.c:207
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] desplegar ayuda sobre las órdenes backslash\n"
+
+#: help.c:208
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options desplegar ayuda sobre opciones de línea de órdenes\n"
+
+#: help.c:209
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables desplegar ayuda sobre variables especiales\n"
+
+#: help.c:210
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr ""
+" \\h [NOMBRE] mostrar ayuda de sintaxis de órdenes SQL;\n"
+" use «*» para todas las órdenes\n"
+
+#: help.c:213
+msgid "Query Buffer\n"
+msgstr "Búfer de consulta\n"
+
+#: help.c:214
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr ""
+" \\e [ARCHIVO] [LÍNEA]\n"
+" editar el búfer de consulta (o archivo) con editor externo\n"
+
+#: help.c:215
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr ""
+" \\ef [NOMBRE-FUNCIÓN [LÍNEA]]\n"
+" editar una función con editor externo\n"
+
+#: help.c:216
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr ""
+" \\ev [NOMBRE-VISTA [LÍNEA]]\n"
+" editar definición de una vista con editor externo\n"
+
+#: help.c:217
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p mostrar el contenido del búfer de consulta\n"
+
+#: help.c:218
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r reiniciar (limpiar) el búfer de consulta\n"
+
+#: help.c:220
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [ARCHIVO] mostrar historial de órdenes o guardarlo en archivo\n"
+
+#: help.c:222
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w ARCHIVO escribir búfer de consulta a archivo\n"
+
+#: help.c:225
+msgid "Input/Output\n"
+msgstr ""
+"Entrada/Salida\n"
+" (con -n, donde existe, se omite el salto de línea final)\n"
+
+#: help.c:226
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... ejecutar orden SQL COPY con flujo de datos al cliente\n"
+
+#: help.c:227
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [STRING] escribe la cadena en la salida estándar\n"
+
+#: help.c:228
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i ARCHIVO ejecutar órdenes desde archivo\n"
+
+#: help.c:229
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir ARCHIVO como \\i, pero relativo a la ubicación del script actual\n"
+
+#: help.c:230
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [ARCHIVO] enviar resultados de consultas a archivo u |orden\n"
+
+#: help.c:231
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr " \\qecho [-n] [STRING] escribe la cadena hacia flujo de salida \\o\n"
+
+#: help.c:232
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [STRING] escribe la cadena a la salida de error estándar\n"
+
+#: help.c:235
+msgid "Conditional\n"
+msgstr "Condicional\n"
+
+#: help.c:236
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPRESIÓN inicia bloque condicional\n"
+
+#: help.c:237
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR alternativa dentro del bloque condicional actual\n"
+
+#: help.c:238
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else alternativa final dentro del bloque condicional actual\n"
+
+#: help.c:239
+msgid " \\endif end conditional block\n"
+msgstr " \\endif termina el bloque condicional\n"
+
+#: help.c:242
+msgid "Informational\n"
+msgstr "Informativo\n"
+
+#: help.c:243
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (opciones: S = desplegar objetos de sistema, + = agregar más detalle)\n"
+
+#: help.c:244
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] listar tablas, vistas y secuencias\n"
+
+#: help.c:245
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NOMBRE describir tabla, índice, secuencia o vista\n"
+
+#: help.c:246
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [PATRÓN] listar funciones de agregación\n"
+
+#: help.c:247
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [PATRÓN] listar métodos de acceso\n"
+
+#: help.c:248
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] listar las clases de operadores\n"
+
+#: help.c:249
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] listar las familias de operadores\n"
+
+#: help.c:250
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] listar los operadores de la familia de operadores\n"
+
+#: help.c:251
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] enumera las funciones de la familia de operadores\n"
+
+#: help.c:252
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [PATRÓN] listar tablespaces\n"
+
+#: help.c:253
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [PATRÓN] listar conversiones\n"
+
+#: help.c:254
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [PATRÓN] listar parámetros de configuración\n"
+
+#: help.c:255
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [PATRÓN] listar conversiones de tipo (casts)\n"
+
+#: help.c:256
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [PATRÓN] listar comentarios de objetos que no aparecen en otra parte\n"
+
+#: help.c:257
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [PATRÓN] listar dominios\n"
+
+#: help.c:258
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [PATRÓN] listar privilegios por omisión\n"
+
+#: help.c:259
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [PATRÓN] listar tablas foráneas\n"
+
+#: help.c:260
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [PATRÓN] listar servidores foráneos\n"
+
+#: help.c:261
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [PATRÓN] listar tablas foráneas\n"
+
+#: help.c:262
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [PATRÓN] listar mapeos de usuario\n"
+
+#: help.c:263
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [PATRÓN] listar conectores de datos externos\n"
+
+#: help.c:264
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" listar funciones [sólo ag./normal/proc./trigger/ventana]\n"
+
+#: help.c:266
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [PATRÓN] listar configuraciones de búsqueda en texto\n"
+
+#: help.c:267
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [PATRÓN] listar diccionarios de búsqueda en texto\n"
+
+#: help.c:268
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [PATRÓN] listar analizadores (parsers) de búsq. en texto\n"
+
+#: help.c:269
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [PATRÓN] listar plantillas de búsqueda en texto\n"
+
+#: help.c:270
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [PATRÓN] listar roles\n"
+
+#: help.c:271
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [PATRÓN] listar índices\n"
+
+#: help.c:272
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] listar objetos grandes, lo mismo que \\lo_list\n"
+
+#: help.c:273
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [PATRÓN] listar lenguajes procedurales\n"
+
+#: help.c:274
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [PATRÓN] listar vistas materializadas\n"
+
+#: help.c:275
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [PATRÓN] listar esquemas\n"
+
+#: help.c:276
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" listar operadores\n"
+
+#: help.c:278
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S] [PATRÓN] listar ordenamientos (collations)\n"
+
+#: help.c:279
+msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp [PATRÓN] listar privilegios de acceso a tablas, vistas y secuencias\n"
+
+#: help.c:280
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[tin+] [PATRÓN] listar relaciones particionadas (sólo tablas/índices) [n=anidadas]\n"
+
+#: help.c:281
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr ""
+" \\drds [PATRÓN_ROL [PATRÓN_BASE]]\n"
+" listar parámetros de rol por base de datos\n"
+
+#: help.c:282
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [PATRÓN] listar publicaciones de replicación\n"
+
+#: help.c:283
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [PATRÓN] listar suscripciones de replicación\n"
+
+#: help.c:284
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [PATRÓN] listar secuencias\n"
+
+#: help.c:285
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [PATRÓN] listar tablas\n"
+
+#: help.c:286
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [PATRÓN] listar tipos de dato\n"
+
+#: help.c:287
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [PATRÓN] listar roles\n"
+
+#: help.c:288
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [PATRÓN] listar vistas\n"
+
+#: help.c:289
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [PATRÓN] listar extensiones\n"
+
+#: help.c:290
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [PATRÓN] listar estadísticas extendidas\n"
+
+#: help.c:291
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [PATRÓN] listar disparadores por eventos\n"
+
+#: help.c:292
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [PATRÓN] listar bases de datos\n"
+
+#: help.c:293
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNCIÓN mostrar la definición de una función\n"
+
+#: help.c:294
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VISTA mostrar la definición de una vista\n"
+
+#: help.c:295
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [PATRÓN] lo mismo que \\dp\n"
+
+#: help.c:298
+msgid "Large Objects\n"
+msgstr "Objetos Grandes\n"
+
+#: help.c:299
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export LOBOID ARCHIVO escribir objeto grande a archivo\n"
+
+#: help.c:300
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import ARCHIVO [COMENTARIO]\n"
+" leer objeto grande desde archivo\n"
+
+#: help.c:302
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] listar objetos grandes\n"
+
+#: help.c:303
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID borrar un objeto grande\n"
+
+#: help.c:306
+msgid "Formatting\n"
+msgstr "Formato\n"
+
+#: help.c:307
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a cambiar entre modo de salida alineado y sin alinear\n"
+
+#: help.c:308
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [CADENA] definir título de tabla, o indefinir si es vacío\n"
+
+#: help.c:309
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr ""
+" \\f [CADENA] mostrar o definir separador de campos para\n"
+" modo de salida sin alinear\n"
+
+#: help.c:310
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H cambiar modo de salida HTML (actualmente %s)\n"
+
+#: help.c:312
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NOMBRE [VALOR]] define opción de tabla de salida\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|fieldsep_zero|\n"
+" footer|format|linestyle|null|numericlocale|pager|\n"
+" pager_min_lines|recordsep|recordsep_zero|tableattr|title|\n"
+" tuples_only|unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:319
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] mostrar sólo filas (actualmente %s)\n"
+
+#: help.c:321
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [CADENA] definir atributos HTML de <table>, o indefinir si es vacío\n"
+
+#: help.c:322
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] cambiar modo expandido (actualmente %s)\n"
+
+#: help.c:323
+msgid "auto"
+msgstr "auto"
+
+#: help.c:326
+msgid "Connection\n"
+msgstr "Conexiones\n"
+
+#: help.c:328
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] [BASE-DE-DATOS|- USUARIO|- ANFITRIÓN|- PUERTO|- | conninfo]\n"
+" conectar a una nueva base de datos (actual: «%s»)\n"
+
+#: help.c:332
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] [BASE-DE-DATOS|- USUARIO|- ANFITRIÓN|- PUERTO|- | conninfo]\n"
+" conectar a una nueva base de datos (no hay conexión actual)\n"
+
+#: help.c:334
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo despliega la información sobre la conexión actual\n"
+
+#: help.c:335
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr ""
+" \\encoding [CODIFICACIÓN]\n"
+" mostrar o definir codificación del cliente\n"
+
+#: help.c:336
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr ""
+" \\password [USUARIO]\n"
+" cambiar la contraseña para un usuario en forma segura\n"
+
+#: help.c:339
+msgid "Operating System\n"
+msgstr "Sistema Operativo\n"
+
+#: help.c:340
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [DIR] cambiar el directorio de trabajo actual\n"
+
+#: help.c:341
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR obtener variable de ambiente\n"
+
+#: help.c:342
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr ""
+" \\setenv NOMBRE [VALOR]\n"
+" definir o indefinir variable de ambiente\n"
+
+#: help.c:343
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr ""
+" \\timing [on|off] mostrar tiempo de ejecución de órdenes\n"
+" (actualmente %s)\n"
+
+#: help.c:345
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr ""
+" \\! [ORDEN] ejecutar orden en intérprete de órdenes (shell),\n"
+" o iniciar intérprete interactivo\n"
+
+#: help.c:348
+msgid "Variables\n"
+msgstr "Variables\n"
+
+#: help.c:349
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TEXTO] NOMBRE preguntar al usuario el valor de la variable\n"
+
+#: help.c:350
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr ""
+" \\set [NOMBRE [VALOR]] definir variables internas,\n"
+" listar todas si no se dan parámetros\n"
+
+#: help.c:351
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NOMBRE indefinir (eliminar) variable interna\n"
+
+#: help.c:390
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"Lista de variables con tratamiento especial\n"
+"\n"
+
+#: help.c:392
+msgid "psql variables:\n"
+msgstr "variables psql:\n"
+
+#: help.c:394
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NOMBRE=VALOR\n"
+" o \\set NOMBRE VALOR dentro de psql\n"
+
+#: help.c:396
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT si está definida, órdenes SQL exitosas se comprometen\n"
+" automáticamente\n"
+
+#: help.c:398
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE determina si usar mayúsculas al completar palabras SQL\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:401
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr " DBNAME la base de datos actualmente conectada\n"
+
+#: help.c:403
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO controla qué entrada se escribe a la salida estándar\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:406
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN muestra consultas internas usadas por órdenes backslash\n"
+" con «noexec» sólo las muestra sin ejecutarlas\n"
+
+#: help.c:409
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr " ENCODING codificación actual del cliente\n"
+
+#: help.c:411
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr " ERROR verdadero si la última consulta falló; si no, falso\n"
+
+#: help.c:413
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT número de filas del resultado que extraer y mostrar cada vez\n"
+" (por omisión: 0=sin límite)\n"
+
+#: help.c:415
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" ocultar métodos de acceso de tabla\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" ocultar métodos de compresión\n"
+
+#: help.c:419
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL controla la lista de historia de órdenes\n"
+" [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:421
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr " HISTFILE nombre de archivo para almacenar historia de órdenes\n"
+
+#: help.c:423
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr " HISTSIZE número de órdenes a guardar en la historia de órdenes\n"
+
+#: help.c:425
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr " HOST el servidor actualmente conectado\n"
+
+#: help.c:427
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF si no está definida, enviar un EOF a sesión interactiva\n"
+" termina la aplicación\n"
+
+#: help.c:429
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr " LASTOID el valor del último OID afectado\n"
+
+#: help.c:431
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" mensaje y SQLSTATE del último error, o cadena vacía y\n"
+" «00000» si no hubo\n"
+
+#: help.c:434
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK si está definido, un error no aborta la transacción\n"
+" (usa «savepoints» implícitos)\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr " ON_ERROR_STOP detiene ejecución por lotes al ocurrir un error\n"
+
+#: help.c:438
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr " PORT puerto del servidor de la conexión actual\n"
+
+#: help.c:440
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr " PROMPT1 especifica el prompt estándar de psql\n"
+
+#: help.c:442
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2 especifica el prompt usado cuando una sentencia continúa\n"
+" de una línea anterior\n"
+
+#: help.c:444
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr " PROMPT3 especifica el prompt usado durante COPY ... FROM STDIN\n"
+
+#: help.c:446
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr " QUIET ejecuta silenciosamente (igual que -q)\n"
+
+#: help.c:448
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT número de tuplas retornadas o afectadas por última\n"
+" consulta, o 0\n"
+
+#: help.c:450
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" versión del servidor (cadena corta o numérica)\n"
+
+#: help.c:453
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" mostrar todos los resultados de una consulta combinada (\\;) en lugar\n"
+" de sólo mostrar el último\n"
+
+#: help.c:455
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT controla el despliegue de campos de contexto de mensaje\n"
+" [never, errors, always]\n"
+
+#: help.c:457
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr " SINGLELINE fin de línea termina modo de órdenes SQL (igual que -S)\n"
+
+#: help.c:459
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr " SINGLESTEP modo paso a paso (igual que -s)\n"
+
+#: help.c:461
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr " SQLSTATE SQLSTATE de la última consulta, o «00000» si no hubo error\n"
+
+#: help.c:463
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr " USER el usuario actualmente conectado\n"
+
+#: help.c:465
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY controla la verbosidad de errores [default, verbose,\n"
+" terse, sqlstate]\n"
+
+#: help.c:467
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" versión de psql (cadena verbosa, corta o numérica)\n"
+
+#: help.c:472
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Parámetros de despliegue:\n"
+
+#: help.c:474
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NOMBRE[=VALOR]\n"
+" o \\pset NOMBRE [VALOR] dentro de psql\n"
+"\n"
+
+#: help.c:476
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr " border estilo de borde (número)\n"
+
+#: help.c:478
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr " columns define el ancho para formato «wrapped»\n"
+
+#: help.c:480
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr " expanded (o x) salida expandida [on, off, auto]\n"
+
+#: help.c:482
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep separador de campos para formato «unaligned»\n"
+" (por omisión: «%s»)\n"
+
+#: help.c:485
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr " fieldsep_zero separador de campos en «unaligned» es byte cero\n"
+
+#: help.c:487
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr " footer activa o desactiva el pie de tabla [on, off]\n"
+
+#: help.c:489
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr " format define el formato de salida [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:491
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr " linestyle define el estilo de dibujo de líneas [ascii, old-ascii, unicode]\n"
+
+#: help.c:493
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr " null define la cadena a imprimirse para valores null\n"
+
+#: help.c:495
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale activa despliegue de carácter específico del lenguaje para\n"
+" separar grupos de dígitos\n"
+
+#: help.c:497
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr " pager controla cuándo se usará un paginador externo [yes, no, always]\n"
+
+#: help.c:499
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr " recordsep separador de registros (líneas) para formato «unaligned»\n"
+
+#: help.c:501
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr " recordsep_zero separador de registros en «unaligned» es byte cero\n"
+
+# XXX WTF does this mean?
+#: help.c:503
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (o T) especifica atributos para el tag «table» en formato «html»,\n"
+" o ancho proporcional de columnas alineadas a la izquierda\n"
+" en formato «latex-longtable»\n"
+
+#: help.c:506
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr " title define el título de tablas\n"
+
+#: help.c:508
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr " tuples_only si está definido, sólo los datos de la tabla se muestran\n"
+
+#: help.c:510
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" define el estilo de líneas Unicode [single, double]\n"
+
+#: help.c:515
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Variables de ambiente:\n"
+
+#: help.c:519
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NOMBRE=VALOR [NOMBRE=VALOR] psql ...\n"
+" o \\setenv NOMBRE [VALOR] dentro de psql\n"
+
+#: help.c:521
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NOMBRE=VALOR\n"
+" psql ...\n"
+" o \\setenv NOMBRE [VALOR] dentro de psql\n"
+
+#: help.c:524
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr " COLUMNS número de columnas para formato «wrapped»\n"
+
+#: help.c:526
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr " PGAPPNAME igual que el parámetro de conexión application_name\n"
+
+#: help.c:528
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr " PGDATABASE igual que el parámetro de conexión dbname\n"
+
+#: help.c:530
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr " PGHOST igual que el parámetro de conexión host\n"
+
+#: help.c:532
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr " PGPASSFILE nombre de archivo de contraseñas\n"
+
+#: help.c:534
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr " PGPASSWORD contraseña de la conexión (no recomendado)\n"
+
+#: help.c:536
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr " PGPORT igual que el parámetro de conexión port\n"
+
+#: help.c:538
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr " PGUSER igual que el parámetro de conexión user\n"
+
+#: help.c:540
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor usado por órdenes \\e, \\ef, y \\ev\n"
+
+#: help.c:542
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARGS\n"
+" cómo especificar número de línea al invocar al editor\n"
+
+#: help.c:544
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr " PSQL_HISTORY ubicación alternativa del archivo de historia de órdenes\n"
+
+#: help.c:546
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr " PSQL_PAGER, PAGER nombre de programa paginador externo\n"
+
+#: help.c:549
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr " PSQL_WATCH_PAGER paginador externo para usar con \\watch\n"
+
+#: help.c:552
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr " PSQLRC ubicación alternativa para el archivo .psqlrc del usuario\n"
+
+#: help.c:554
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr " SHELL intérprete usado por la orden \\!\n"
+
+#: help.c:556
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr " TMPDIR directorio para archivos temporales\n"
+
+#: help.c:616
+msgid "Available help:\n"
+msgstr "Ayuda disponible:\n"
+
+#: help.c:711
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Orden: %s\n"
+"Descripción: %s\n"
+"Sintaxis:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:734
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"No hay ayuda disponible para «%s».\n"
+"Pruebe \\h sin argumentos para mostrar los elementos de ayuda disponibles.\n"
+
+#: input.c:217
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "no se pudo leer el archivo de entrada: %m"
+
+#: input.c:478 input.c:516
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "no se pudo guardar historial a archivo «%s»: %m"
+
+#: input.c:535
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "el historial de órdenes no está soportado en esta instalación"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: no está conectado a una base de datos"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: transacción en curso está abortada"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: estado de transacción desconocido"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: escapado"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Use «\\q» para salir de %s.\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"La entrada es un dump de PostgreSQL en formato custom.\n"
+"Use el programa pg_restore para restaurar este dump a una base de datos.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Use \\? para ayuda o presione control-C para limpiar el búfer de entrada."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "Digite \\? para obtener ayuda."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Está usando psql, la interfaz de línea de órdenes de PostgreSQL."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Digite: \\copyright para ver los términos de distribución\n"
+" \\h para ayuda de órdenes SQL\n"
+" \\? para ayuda de órdenes psql\n"
+" \\g o punto y coma («;») para ejecutar la consulta\n"
+" \\q para salir\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "Use \\q para salir."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "Use control-D para salir."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "Use control-C para salir."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "consulta ignorada; use \\endif o Ctrl-C para salir del bloque \\if actual"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "se alcanzó EOF sin encontrar el/los \\endif de cierre"
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "una cadena de caracteres entre comillas está inconclusa"
+
+#: psqlscanslash.l:811
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: memoria agotada"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1996
+#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154
+#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228
+#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431
+#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517
+#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594
+#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730
+#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071
+#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171
+#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259
+#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338
+#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396
+#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428
+#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464
+#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499
+#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537
+#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574
+#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606
+#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638
+#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680
+#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030
+#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687
+#: sql_help.c:4735 sql_help.c:4893
+msgid "name"
+msgstr "nombre"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846
+#: sql_help.c:3339 sql_help.c:4455
+msgid "aggregate_signature"
+msgstr "signatura_func_agregación"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "nuevo_nombre"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3011
+msgid "new_owner"
+msgstr "nuevo_dueño"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "nuevo_esquema"
+
+#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484
+msgid "where aggregate_signature is:"
+msgstr "donde signatura_func_agregación es:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911
+#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085
+#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341
+#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527
+#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461
+#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488
+#: sql_help.c:4491
+msgid "argmode"
+msgstr "modo_arg"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912
+#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2067 sql_help.c:2086
+#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342
+#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528
+#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475
+#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492
+msgid "argname"
+msgstr "nombre_arg"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2388 sql_help.c:2597
+#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440
+#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470
+#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493
+msgid "argtype"
+msgstr "tipo_arg"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974
+#: sql_help.c:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343
+#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040
+#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742
+#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956
+msgid "option"
+msgstr "opción"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433
+#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388
+msgid "where option can be:"
+msgstr "donde opción puede ser:"
+
+#: sql_help.c:116 sql_help.c:2209
+msgid "allowconn"
+msgstr "allowconn"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210
+#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227
+msgid "connlimit"
+msgstr "límite_conexiones"
+
+#: sql_help.c:118 sql_help.c:2211
+msgid "istemplate"
+msgstr "esplantilla"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4187
+msgid "new_tablespace"
+msgstr "nuevo_tablespace"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2398 sql_help.c:2601
+#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675
+msgid "configuration_parameter"
+msgstr "parámetro_de_configuración"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344
+#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467
+#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626
+#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915
+#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014
+#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676
+#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679
+msgid "value"
+msgstr "valor"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "rol_destino"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631
+#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889
+#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338
+#: sql_help.c:4357 sql_help.c:4369
+msgid "schema_name"
+msgstr "nombre_de_esquema"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "grant_o_revoke_abreviado"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "donde grant_o_revoke_abreviado es uno de:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2437 sql_help.c:2438
+#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575
+#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667
+#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232
+#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933
+#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697
+msgid "role_name"
+msgstr "nombre_de_rol"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352
+#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774
+#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924
+#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981
+#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088
+#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558
+#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608
+#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651
+#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806
+#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864
+#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921
+#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044
+#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102
+#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105
+msgid "expression"
+msgstr "expresión"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "restricción_de_dominio"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852
+#: sql_help.c:1854 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351
+#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993
+msgid "constraint_name"
+msgstr "nombre_restricción"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "nuevo_nombre_restricción"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "nueva_versión"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "objeto_miembro"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "dondo objeto_miembro es:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856
+#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860
+#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869
+#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884
+#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894
+#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898
+#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902
+#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4451 sql_help.c:4456
+#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465
+#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477
+#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481
+#: sql_help.c:4482
+msgid "object_name"
+msgstr "nombre_de_objeto"
+
+#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454
+msgid "aggregate_name"
+msgstr "nombre_función_agregación"
+
+#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135
+#: sql_help.c:2137 sql_help.c:3357
+msgid "source_type"
+msgstr "tipo_fuente"
+
+#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136
+#: sql_help.c:2138 sql_help.c:3358
+msgid "target_type"
+msgstr "tipo_destino"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133
+#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549
+#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577
+#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834
+#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072
+#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083
+msgid "function_name"
+msgstr "nombre_de_función"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542
+msgid "operator_name"
+msgstr "nombre_operador"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871
+#: sql_help.c:2519 sql_help.c:3481
+msgid "left_type"
+msgstr "tipo_izq"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872
+#: sql_help.c:2520 sql_help.c:3482
+msgid "right_type"
+msgstr "tipo_der"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2539
+#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500
+msgid "index_method"
+msgstr "método_de_índice"
+
+#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467
+msgid "procedure_name"
+msgstr "nombre_de_procedimiento"
+
+#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473
+msgid "routine_name"
+msgstr "nombre_de_rutina"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394
+#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662
+#: sql_help.c:3926 sql_help.c:4375
+msgid "type_name"
+msgstr "nombre_de_tipo"
+
+#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599
+#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911
+#: sql_help.c:4360
+msgid "lang_name"
+msgstr "nombre_lenguaje"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "y signatura_func_agregación es:"
+
+#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275
+msgid "handler_function"
+msgstr "función_manejadora"
+
+#: sql_help.c:396 sql_help.c:2276
+msgid "validator_function"
+msgstr "función_validadora"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "acción"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851
+#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1983 sql_help.c:1984
+#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391
+#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629
+#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887
+#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919
+#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955
+#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978
+#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883
+#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997
+#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089
+#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614
+#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877
+#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924
+#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117
+msgid "column_name"
+msgstr "nombre_de_columna"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "nuevo_nombre_de_columna"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "donde acción es una de:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2229
+#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888
+#: sql_help.c:3167 sql_help.c:4141
+msgid "data_type"
+msgstr "tipo_de_dato"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2230 sql_help.c:2329
+#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911
+#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990
+msgid "collation"
+msgstr "ordenamiento"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339
+#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920
+msgid "column_constraint"
+msgstr "restricción_de_columna"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968
+msgid "integer"
+msgstr "entero"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "opción_de_atributo"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340
+#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921
+msgid "table_constraint"
+msgstr "restricción_de_tabla"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905
+msgid "trigger_name"
+msgstr "nombre_disparador"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918
+msgid "parent_table"
+msgstr "tabla_padre"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2261
+msgid "extension_name"
+msgstr "nombre_de_extensión"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395
+msgid "execution_cost"
+msgstr "costo_de_ejecución"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396
+msgid "result_rows"
+msgstr "núm_de_filas"
+
+#: sql_help.c:547 sql_help.c:2397
+msgid "support_function"
+msgstr "función_de_soporte"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2709
+#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881
+#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890
+#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 sql_help.c:3896
+#: sql_help.c:3897 sql_help.c:3899 sql_help.c:3900 sql_help.c:3902
+#: sql_help.c:3903 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918
+#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924
+#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930
+#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335
+#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342
+#: sql_help.c:4343 sql_help.c:4345 sql_help.c:4346 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4351 sql_help.c:4352 sql_help.c:4358
+#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364
+#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370
+#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376
+#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380
+msgid "role_specification"
+msgstr "especificación_de_rol"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198
+#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707
+msgid "user_name"
+msgstr "nombre_de_usuario"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716
+#: sql_help.c:3932 sql_help.c:4381
+msgid "where role_specification can be:"
+msgstr "donde especificación_de_rol puede ser:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "nombre_de_grupo"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468
+#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930
+#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923
+#: sql_help.c:4372
+msgid "tablespace_name"
+msgstr "nombre_de_tablespace"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783
+msgid "index_name"
+msgstr "nombre_índice"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2466 sql_help.c:2500
+#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969
+#: sql_help.c:2996
+msgid "storage_parameter"
+msgstr "parámetro_de_almacenamiento"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "número_de_columna"
+
+#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464
+msgid "large_object_oid"
+msgstr "oid_de_objeto_grande"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889
+msgid "compression_method"
+msgstr "método_de_compresión"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "nuevo_método_de_acceso"
+
+#: sql_help.c:725 sql_help.c:2523
+msgid "res_proc"
+msgstr "proc_res"
+
+#: sql_help.c:726 sql_help.c:2524
+msgid "join_proc"
+msgstr "proc_join"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2541
+msgid "strategy_number"
+msgstr "número_de_estrategia"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2543 sql_help.c:2544
+#: sql_help.c:2547 sql_help.c:2548
+msgid "op_type"
+msgstr "tipo_op"
+
+#: sql_help.c:782 sql_help.c:2545
+msgid "sort_family_name"
+msgstr "nombre_familia_ordenamiento"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2546
+msgid "support_number"
+msgstr "número_de_soporte"
+
+#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087
+#: sql_help.c:3089
+msgid "argument_type"
+msgstr "tipo_argumento"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779
+#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891
+#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2324
+#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574
+#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770
+#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917
+#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517
+#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885
+#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334
+#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627
+#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884
+#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060
+#: sql_help.c:5122
+msgid "table_name"
+msgstr "nombre_de_tabla"
+
+#: sql_help.c:823 sql_help.c:2576
+msgid "using_expression"
+msgstr "expresión_using"
+
+#: sql_help.c:824 sql_help.c:2577
+msgid "check_expression"
+msgstr "expresión_check"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624
+msgid "publication_object"
+msgstr "objeto_de_publicación"
+
+#: sql_help.c:903 sql_help.c:2625
+msgid "publication_parameter"
+msgstr "parámetro_de_publicación"
+
+#: sql_help.c:909 sql_help.c:2627
+msgid "where publication_object is one of:"
+msgstr "donde objeto_de_publicación es uno de:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662
+#: sql_help.c:3228
+msgid "password"
+msgstr "contraseña"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663
+#: sql_help.c:3229
+msgid "timestamp"
+msgstr "fecha_hora"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3892
+#: sql_help.c:4341
+msgid "database_name"
+msgstr "nombre_de_base_de_datos"
+
+#: sql_help.c:1073 sql_help.c:2732
+msgid "increment"
+msgstr "incremento"
+
+#: sql_help.c:1074 sql_help.c:2733
+msgid "minvalue"
+msgstr "valormin"
+
+#: sql_help.c:1075 sql_help.c:2734
+msgid "maxvalue"
+msgstr "valormax"
+
+#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664
+#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056
+msgid "start"
+msgstr "inicio"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "reinicio"
+
+#: sql_help.c:1078 sql_help.c:2736
+msgid "cache"
+msgstr "cache"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "nuevo_valor"
+
+#: sql_help.c:1142 sql_help.c:2789
+msgid "conninfo"
+msgstr "conninfo"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790
+msgid "publication_name"
+msgstr "nombre_de_publicación"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "opción_de_publicación"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "opción_refresh"
+
+#: sql_help.c:1161 sql_help.c:2791
+msgid "subscription_parameter"
+msgstr "parámetro_de_suscripción"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "opción_skip"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "nombre_de_partición"
+
+#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922
+msgid "partition_bound_spec"
+msgstr "borde_de_partición"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936
+msgid "sequence_options"
+msgstr "opciones_de_secuencia"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "opción_de_secuencia"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "restricción_de_tabla_con_índice"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "nombre_regla_de_reescritura"
+
+#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961
+msgid "and partition_bound_spec is:"
+msgstr "y borde_de_partición es:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354
+#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963
+#: sql_help.c:2964
+msgid "partition_bound_expr"
+msgstr "expresión_de_borde_de_partición"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358
+#: sql_help.c:2965 sql_help.c:2966
+msgid "numeric_literal"
+msgstr "literal_numérico"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "donde restricción_de_columna es:"
+
+#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598
+#: sql_help.c:2934
+msgid "default_expr"
+msgstr "expr_por_omisión"
+
+#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935
+msgid "generation_expr"
+msgstr "expr_de_generación"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947
+#: sql_help.c:2949 sql_help.c:2953
+msgid "index_parameters"
+msgstr "parámetros_de_índice"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956
+msgid "reftable"
+msgstr "tabla_ref"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957
+msgid "refcolumn"
+msgstr "columna_ref"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959
+msgid "referential_action"
+msgstr "acción_referencial"
+
+#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943
+msgid "and table_constraint is:"
+msgstr "y restricción_de_tabla es:"
+
+#: sql_help.c:1409 sql_help.c:2951
+msgid "exclude_element"
+msgstr "elemento_de_exclusión"
+
+#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662
+#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054
+msgid "operator"
+msgstr "operador"
+
+#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954
+msgid "predicate"
+msgstr "predicado"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "y restricción_de_tabla_con_índice es:"
+
+#: sql_help.c:1421 sql_help.c:2967
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "parámetros_de_índice en UNIQUE, PRIMARY KEY y EXCLUDE son:"
+
+#: sql_help.c:1426 sql_help.c:2972
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "elemento_de_exclusión en una restricción EXCLUDE es:"
+
+#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912
+#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991
+msgid "opclass"
+msgstr "clase_de_ops"
+
+#: sql_help.c:1430 sql_help.c:2976
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "acción_referencial en una restricción FOREIGN KEY/REFERENCES es:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013
+msgid "tablespace_option"
+msgstr "opción_de_tablespace"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "tipo_de_token"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "nombre_diccionario"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "diccionario_antiguo"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "diccionario_nuevo"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3166
+msgid "attribute_name"
+msgstr "nombre_atributo"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "nuevo_nombre_atributo"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "nuevo_valor_enum"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "valor_enum_vecino"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "valor_enum_existente"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "propiedad"
+
+#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748
+#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947
+#: sql_help.c:4350
+msgid "server_name"
+msgstr "nombre_de_servidor"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261
+msgid "view_option_name"
+msgstr "nombre_opción_de_vista"
+
+#: sql_help.c:1698 sql_help.c:3262
+msgid "view_option_value"
+msgstr "valor_opción_de_vista"
+
+#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958
+msgid "table_and_columns"
+msgstr "tabla_y_columnas"
+
+#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745
+#: sql_help.c:4185 sql_help.c:4959
+msgid "where option can be one of:"
+msgstr "donde opción puede ser una de:"
+
+#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977
+#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747
+#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188
+#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963
+#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967
+msgid "boolean"
+msgstr "booleano"
+
+#: sql_help.c:1724 sql_help.c:4969
+msgid "and table_and_columns is:"
+msgstr "y tabla_y_columnas es:"
+
+#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749
+msgid "transaction_mode"
+msgstr "modo_de_transacción"
+
+#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750
+msgid "where transaction_mode is one of:"
+msgstr "donde modo_de_transacción es uno de:"
+
+#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582
+#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835
+#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064
+#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084
+msgid "argument"
+msgstr "argumento"
+
+#: sql_help.c:1850
+msgid "relation_name"
+msgstr "nombre_relación"
+
+#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344
+msgid "domain_name"
+msgstr "nombre_de_dominio"
+
+#: sql_help.c:1877
+msgid "policy_name"
+msgstr "nombre_de_política"
+
+#: sql_help.c:1890
+msgid "rule_name"
+msgstr "nombre_regla"
+
+#: sql_help.c:1909 sql_help.c:4483
+msgid "string_literal"
+msgstr "literal_de_cadena"
+
+#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397
+msgid "transaction_id"
+msgstr "id_de_transacción"
+
+#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017
+msgid "filename"
+msgstr "nombre_de_archivo"
+
+#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688
+#: sql_help.c:2689
+msgid "command"
+msgstr "orden"
+
+#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297
+#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552
+#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809
+#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049
+msgid "condition"
+msgstr "condición"
+
+#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263
+#: sql_help.c:3281 sql_help.c:3982
+msgid "query"
+msgstr "consulta"
+
+#: sql_help.c:1976
+msgid "format_name"
+msgstr "nombre_de_formato"
+
+#: sql_help.c:1978
+msgid "delimiter_character"
+msgstr "carácter_delimitador"
+
+#: sql_help.c:1979
+msgid "null_string"
+msgstr "cadena_null"
+
+#: sql_help.c:1981
+msgid "quote_character"
+msgstr "carácter_de_comilla"
+
+#: sql_help.c:1982
+msgid "escape_character"
+msgstr "carácter_de_escape"
+
+#: sql_help.c:1986
+msgid "encoding_name"
+msgstr "nombre_codificación"
+
+#: sql_help.c:1997
+msgid "access_method_type"
+msgstr "tipo_de_método_de_acceso"
+
+#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090
+msgid "arg_data_type"
+msgstr "tipo_de_dato_arg"
+
+#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099
+msgid "sfunc"
+msgstr "func_transición"
+
+#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100
+msgid "state_data_type"
+msgstr "tipo_de_dato_de_estado"
+
+#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101
+msgid "state_data_size"
+msgstr "tamaño_de_dato_de_estado"
+
+#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102
+msgid "ffunc"
+msgstr "func_final"
+
+#: sql_help.c:2073 sql_help.c:2103
+msgid "combinefunc"
+msgstr "func_combinación"
+
+#: sql_help.c:2074 sql_help.c:2104
+msgid "serialfunc"
+msgstr "func_serial"
+
+#: sql_help.c:2075 sql_help.c:2105
+msgid "deserialfunc"
+msgstr "func_deserial"
+
+#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106
+msgid "initial_condition"
+msgstr "condición_inicial"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "msfunc"
+msgstr "func_transición_m"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "minvfunc"
+msgstr "func_inv_m"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "mstate_data_type"
+msgstr "tipo_de_dato_de_estado_m"
+
+#: sql_help.c:2080 sql_help.c:2110
+msgid "mstate_data_size"
+msgstr "tamaño_de_dato_de_estado_m"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "mffunc"
+msgstr "func_final_m"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minitial_condition"
+msgstr "condición_inicial_m"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "sort_operator"
+msgstr "operador_de_ordenamiento"
+
+#: sql_help.c:2096
+msgid "or the old syntax"
+msgstr "o la sintaxis antigua"
+
+#: sql_help.c:2098
+msgid "base_type"
+msgstr "tipo_base"
+
+#: sql_help.c:2155 sql_help.c:2202
+msgid "locale"
+msgstr "configuración regional"
+
+#: sql_help.c:2156 sql_help.c:2203
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2157 sql_help.c:2204
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2158 sql_help.c:4450
+msgid "provider"
+msgstr "proveedor"
+
+#: sql_help.c:2160 sql_help.c:2263
+msgid "version"
+msgstr "versión"
+
+#: sql_help.c:2162
+msgid "existing_collation"
+msgstr "ordenamiento_existente"
+
+#: sql_help.c:2172
+msgid "source_encoding"
+msgstr "codificación_origen"
+
+#: sql_help.c:2173
+msgid "dest_encoding"
+msgstr "codificación_destino"
+
+#: sql_help.c:2199 sql_help.c:3039
+msgid "template"
+msgstr "plantilla"
+
+#: sql_help.c:2200
+msgid "encoding"
+msgstr "codificación"
+
+#: sql_help.c:2201
+msgid "strategy"
+msgstr "estrategia"
+
+#: sql_help.c:2205
+msgid "icu_locale"
+msgstr "locale_icu"
+
+#: sql_help.c:2206
+msgid "locale_provider"
+msgstr "proveedor_locale"
+
+#: sql_help.c:2207
+msgid "collation_version"
+msgstr "versión_ordenamiento"
+
+#: sql_help.c:2212
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2232
+msgid "constraint"
+msgstr "restricción"
+
+#: sql_help.c:2233
+msgid "where constraint is:"
+msgstr "donde restricción es:"
+
+#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112
+msgid "event"
+msgstr "evento"
+
+#: sql_help.c:2248
+msgid "filter_variable"
+msgstr "variable_de_filtrado"
+
+#: sql_help.c:2249
+msgid "filter_value"
+msgstr "valor_de_filtrado"
+
+#: sql_help.c:2345 sql_help.c:2931
+msgid "where column_constraint is:"
+msgstr "donde restricción_de_columna es:"
+
+#: sql_help.c:2390
+msgid "rettype"
+msgstr "tipo_ret"
+
+#: sql_help.c:2392
+msgid "column_type"
+msgstr "tipo_columna"
+
+#: sql_help.c:2401 sql_help.c:2604
+msgid "definition"
+msgstr "definición"
+
+#: sql_help.c:2402 sql_help.c:2605
+msgid "obj_file"
+msgstr "archivo_obj"
+
+#: sql_help.c:2403 sql_help.c:2606
+msgid "link_symbol"
+msgstr "símbolo_enlace"
+
+#: sql_help.c:2404 sql_help.c:2607
+msgid "sql_body"
+msgstr "contenido_sql"
+
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913
+#: sql_help.c:2927 sql_help.c:2995
+msgid "method"
+msgstr "método"
+
+#: sql_help.c:2463
+msgid "opclass_parameter"
+msgstr "parámetro_opclass"
+
+#: sql_help.c:2480
+msgid "call_handler"
+msgstr "manejador_de_llamada"
+
+#: sql_help.c:2481
+msgid "inline_handler"
+msgstr "manejador_en_línea"
+
+#: sql_help.c:2482
+msgid "valfunction"
+msgstr "función_val"
+
+#: sql_help.c:2521
+msgid "com_op"
+msgstr "op_conm"
+
+#: sql_help.c:2522
+msgid "neg_op"
+msgstr "op_neg"
+
+#: sql_help.c:2540
+msgid "family_name"
+msgstr "nombre_familia"
+
+#: sql_help.c:2551
+msgid "storage_type"
+msgstr "tipo_almacenamiento"
+
+#: sql_help.c:2690 sql_help.c:3119
+msgid "where event can be one of:"
+msgstr "donde evento puede ser una de:"
+
+#: sql_help.c:2710 sql_help.c:2712
+msgid "schema_element"
+msgstr "elemento_de_esquema"
+
+#: sql_help.c:2749
+msgid "server_type"
+msgstr "tipo_de_servidor"
+
+#: sql_help.c:2750
+msgid "server_version"
+msgstr "versión_de_servidor"
+
+#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347
+msgid "fdw_name"
+msgstr "nombre_fdw"
+
+#: sql_help.c:2768 sql_help.c:2771
+msgid "statistics_name"
+msgstr "nombre_de_estadística"
+
+#: sql_help.c:2772
+msgid "statistics_kind"
+msgstr "tipo_de_estadística"
+
+#: sql_help.c:2788
+msgid "subscription_name"
+msgstr "nombre_de_suscripción"
+
+#: sql_help.c:2893
+msgid "source_table"
+msgstr "tabla_origen"
+
+#: sql_help.c:2894
+msgid "like_option"
+msgstr "opción_de_like"
+
+#: sql_help.c:2960
+msgid "and like_option is:"
+msgstr "y opción_de_like es:"
+
+#: sql_help.c:3012
+msgid "directory"
+msgstr "directorio"
+
+#: sql_help.c:3026
+msgid "parser_name"
+msgstr "nombre_de_parser"
+
+#: sql_help.c:3027
+msgid "source_config"
+msgstr "config_origen"
+
+#: sql_help.c:3056
+msgid "start_function"
+msgstr "función_inicio"
+
+#: sql_help.c:3057
+msgid "gettoken_function"
+msgstr "función_gettoken"
+
+#: sql_help.c:3058
+msgid "end_function"
+msgstr "función_fin"
+
+#: sql_help.c:3059
+msgid "lextypes_function"
+msgstr "función_lextypes"
+
+#: sql_help.c:3060
+msgid "headline_function"
+msgstr "función_headline"
+
+#: sql_help.c:3072
+msgid "init_function"
+msgstr "función_init"
+
+#: sql_help.c:3073
+msgid "lexize_function"
+msgstr "función_lexize"
+
+#: sql_help.c:3086
+msgid "from_sql_function_name"
+msgstr "nombre_de_función_from"
+
+#: sql_help.c:3088
+msgid "to_sql_function_name"
+msgstr "nombre_de_función_to"
+
+#: sql_help.c:3114
+msgid "referenced_table_name"
+msgstr "nombre_tabla_referenciada"
+
+#: sql_help.c:3115
+msgid "transition_relation_name"
+msgstr "nombre_de_relación_de_transición"
+
+#: sql_help.c:3118
+msgid "arguments"
+msgstr "argumentos"
+
+#: sql_help.c:3170
+msgid "label"
+msgstr "etiqueta"
+
+#: sql_help.c:3172
+msgid "subtype"
+msgstr "subtipo"
+
+#: sql_help.c:3173
+msgid "subtype_operator_class"
+msgstr "clase_de_operador_del_subtipo"
+
+#: sql_help.c:3175
+msgid "canonical_function"
+msgstr "función_canónica"
+
+#: sql_help.c:3176
+msgid "subtype_diff_function"
+msgstr "función_diff_del_subtipo"
+
+#: sql_help.c:3177
+msgid "multirange_type_name"
+msgstr "nombre_de_tipo_de_multirango"
+
+#: sql_help.c:3179
+msgid "input_function"
+msgstr "función_entrada"
+
+#: sql_help.c:3180
+msgid "output_function"
+msgstr "función_salida"
+
+#: sql_help.c:3181
+msgid "receive_function"
+msgstr "función_receive"
+
+#: sql_help.c:3182
+msgid "send_function"
+msgstr "función_send"
+
+#: sql_help.c:3183
+msgid "type_modifier_input_function"
+msgstr "función_entrada_del_modificador_de_tipo"
+
+#: sql_help.c:3184
+msgid "type_modifier_output_function"
+msgstr "función_salida_del_modificador_de_tipo"
+
+#: sql_help.c:3185
+msgid "analyze_function"
+msgstr "función_analyze"
+
+#: sql_help.c:3186
+msgid "subscript_function"
+msgstr "función_de_subíndice"
+
+#: sql_help.c:3187
+msgid "internallength"
+msgstr "largo_interno"
+
+#: sql_help.c:3188
+msgid "alignment"
+msgstr "alineamiento"
+
+#: sql_help.c:3189
+msgid "storage"
+msgstr "almacenamiento"
+
+#: sql_help.c:3190
+msgid "like_type"
+msgstr "como_tipo"
+
+#: sql_help.c:3191
+msgid "category"
+msgstr "categoría"
+
+#: sql_help.c:3192
+msgid "preferred"
+msgstr "preferido"
+
+#: sql_help.c:3193
+msgid "default"
+msgstr "valor_por_omisión"
+
+#: sql_help.c:3194
+msgid "element"
+msgstr "elemento"
+
+#: sql_help.c:3195
+msgid "delimiter"
+msgstr "delimitador"
+
+#: sql_help.c:3196
+msgid "collatable"
+msgstr "ordenable"
+
+#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547
+#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042
+msgid "with_query"
+msgstr "consulta_with"
+
+#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572
+#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591
+#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836
+#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061
+#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078
+#: sql_help.c:5086
+msgid "alias"
+msgstr "alias"
+
+#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603
+#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852
+#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860
+#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090
+#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098
+msgid "from_item"
+msgstr "item_de_from"
+
+#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928
+msgid "cursor_name"
+msgstr "nombre_de_cursor"
+
+#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929
+msgid "output_expression"
+msgstr "expresión_de_salida"
+
+#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652
+#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045
+msgid "output_name"
+msgstr "nombre_de_salida"
+
+#: sql_help.c:3316
+msgid "code"
+msgstr "código"
+
+#: sql_help.c:3721
+msgid "parameter"
+msgstr "parámetro"
+
+#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142
+msgid "statement"
+msgstr "sentencia"
+
+#: sql_help.c:3778 sql_help.c:4116
+msgid "direction"
+msgstr "dirección"
+
+#: sql_help.c:3780 sql_help.c:4118
+msgid "where direction can be one of:"
+msgstr "donde dirección puede ser una de:"
+
+#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784
+#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121
+#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562
+#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819
+#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057
+msgid "count"
+msgstr "cantidad"
+
+#: sql_help.c:3888 sql_help.c:4337
+msgid "sequence_name"
+msgstr "nombre_secuencia"
+
+#: sql_help.c:3906 sql_help.c:4355
+msgid "arg_name"
+msgstr "nombre_arg"
+
+#: sql_help.c:3907 sql_help.c:4356
+msgid "arg_type"
+msgstr "tipo_arg"
+
+#: sql_help.c:3914 sql_help.c:4363
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3945
+msgid "remote_schema"
+msgstr "esquema_remoto"
+
+#: sql_help.c:3948
+msgid "local_schema"
+msgstr "esquema_local"
+
+#: sql_help.c:3983
+msgid "conflict_target"
+msgstr "destino_de_conflict"
+
+#: sql_help.c:3984
+msgid "conflict_action"
+msgstr "acción_de_conflict"
+
+#: sql_help.c:3987
+msgid "where conflict_target can be one of:"
+msgstr "donde destino_de_conflict puede ser uno de:"
+
+#: sql_help.c:3988
+msgid "index_column_name"
+msgstr "nombre_de_columna_de_índice"
+
+#: sql_help.c:3989
+msgid "index_expression"
+msgstr "expresión_de_índice"
+
+#: sql_help.c:3992
+msgid "index_predicate"
+msgstr "predicado_de_índice"
+
+#: sql_help.c:3994
+msgid "and conflict_action is one of:"
+msgstr "donde acción_de_conflict es una de:"
+
+#: sql_help.c:4000 sql_help.c:4925
+msgid "sub-SELECT"
+msgstr "sub-SELECT"
+
+#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901
+msgid "channel"
+msgstr "canal"
+
+#: sql_help.c:4031
+msgid "lockmode"
+msgstr "modo_bloqueo"
+
+#: sql_help.c:4032
+msgid "where lockmode is one of:"
+msgstr "donde modo_bloqueo es uno de:"
+
+#: sql_help.c:4068
+msgid "target_table_name"
+msgstr "nombre_de_tabla_destino"
+
+#: sql_help.c:4069
+msgid "target_alias"
+msgstr "alias_de_destino"
+
+#: sql_help.c:4070
+msgid "data_source"
+msgstr "origin_de_datos"
+
+#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091
+msgid "join_condition"
+msgstr "condición_de_join"
+
+#: sql_help.c:4072
+msgid "when_clause"
+msgstr "cláusula_when"
+
+#: sql_help.c:4073
+msgid "where data_source is:"
+msgstr "donde origen_de_datos es:"
+
+#: sql_help.c:4074
+msgid "source_table_name"
+msgstr "nombre_tabla_origen"
+
+#: sql_help.c:4075
+msgid "source_query"
+msgstr "consulta_origen"
+
+#: sql_help.c:4076
+msgid "source_alias"
+msgstr "alias_origen"
+
+#: sql_help.c:4077
+msgid "and when_clause is:"
+msgstr "y cláusula_when es:"
+
+#: sql_help.c:4079
+msgid "merge_update"
+msgstr "update_de_merge"
+
+#: sql_help.c:4080
+msgid "merge_delete"
+msgstr "delete_de_merge"
+
+#: sql_help.c:4082
+msgid "merge_insert"
+msgstr "insert_de_merge"
+
+#: sql_help.c:4083
+msgid "and merge_insert is:"
+msgstr "y insert_de_merge es:"
+
+#: sql_help.c:4086
+msgid "and merge_update is:"
+msgstr "y update_de_merge es:"
+
+#: sql_help.c:4091
+msgid "and merge_delete is:"
+msgstr "y delete_de_merge es:"
+
+#: sql_help.c:4132
+msgid "payload"
+msgstr "carga"
+
+#: sql_help.c:4159
+msgid "old_role"
+msgstr "rol_antiguo"
+
+#: sql_help.c:4160
+msgid "new_role"
+msgstr "rol_nuevo"
+
+#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413
+msgid "savepoint_name"
+msgstr "nombre_de_savepoint"
+
+#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868
+#: sql_help.c:5048 sql_help.c:5106
+msgid "grouping_element"
+msgstr "elemento_agrupante"
+
+#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050
+msgid "window_name"
+msgstr "nombre_de_ventana"
+
+#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051
+msgid "window_definition"
+msgstr "definición_de_ventana"
+
+#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660
+#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052
+#: sql_help.c:5066 sql_help.c:5110
+msgid "select"
+msgstr "select"
+
+#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059
+msgid "where from_item can be one of:"
+msgstr "donde item_de_from puede ser uno de:"
+
+#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580
+#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833
+#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068
+#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087
+msgid "column_alias"
+msgstr "alias_de_columna"
+
+#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063
+msgid "sampling_method"
+msgstr "método_de_sampleo"
+
+#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065
+msgid "seed"
+msgstr "semilla"
+
+#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870
+#: sql_help.c:5069 sql_help.c:5108
+msgid "with_query_name"
+msgstr "nombre_consulta_with"
+
+#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841
+#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082
+#: sql_help.c:5085
+msgid "column_definition"
+msgstr "definición_de_columna"
+
+#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857
+#: sql_help.c:5089 sql_help.c:5095
+msgid "join_type"
+msgstr "tipo_de_join"
+
+#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092
+msgid "join_column"
+msgstr "columna_de_join"
+
+#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093
+msgid "join_using_alias"
+msgstr "join_con_alias"
+
+#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099
+msgid "and grouping_element can be one of:"
+msgstr "donde elemento_agrupante puede ser una de:"
+
+#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107
+msgid "and with_query is:"
+msgstr "y consulta_with es:"
+
+#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111
+msgid "values"
+msgstr "valores"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116
+msgid "search_seq_col_name"
+msgstr "nombre_col_para_sec_de_búsqueda"
+
+#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118
+msgid "cycle_mark_col_name"
+msgstr "nombre_col_para_marca_de_ciclo"
+
+#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119
+msgid "cycle_mark_value"
+msgstr "valor_marca_de_ciclo"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120
+msgid "cycle_mark_default"
+msgstr "valor_predet_marca_de_ciclo"
+
+#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121
+msgid "cycle_path_col_name"
+msgstr "nombre_col_para_ruta_de_ciclo"
+
+#: sql_help.c:4653
+msgid "new_table"
+msgstr "nueva_tabla"
+
+#: sql_help.c:4724
+msgid "snapshot_id"
+msgstr "id_de_snapshot"
+
+#: sql_help.c:4984
+msgid "sort_expression"
+msgstr "expresión_orden"
+
+#: sql_help.c:5128 sql_help.c:6112
+msgid "abort the current transaction"
+msgstr "aborta la transacción en curso"
+
+#: sql_help.c:5134
+msgid "change the definition of an aggregate function"
+msgstr "cambia la definición de una función de agregación"
+
+#: sql_help.c:5140
+msgid "change the definition of a collation"
+msgstr "cambia la definición de un ordenamiento"
+
+#: sql_help.c:5146
+msgid "change the definition of a conversion"
+msgstr "cambia la definición de una conversión"
+
+#: sql_help.c:5152
+msgid "change a database"
+msgstr "cambia una base de datos"
+
+#: sql_help.c:5158
+msgid "define default access privileges"
+msgstr "define privilegios de acceso por omisión"
+
+#: sql_help.c:5164
+msgid "change the definition of a domain"
+msgstr "cambia la definición de un dominio"
+
+#: sql_help.c:5170
+msgid "change the definition of an event trigger"
+msgstr "cambia la definición de un disparador por evento"
+
+#: sql_help.c:5176
+msgid "change the definition of an extension"
+msgstr "cambia la definición de una extensión"
+
+#: sql_help.c:5182
+msgid "change the definition of a foreign-data wrapper"
+msgstr "cambia la definición de un conector de datos externos"
+
+#: sql_help.c:5188
+msgid "change the definition of a foreign table"
+msgstr "cambia la definición de una tabla foránea"
+
+#: sql_help.c:5194
+msgid "change the definition of a function"
+msgstr "cambia la definición de una función"
+
+#: sql_help.c:5200
+msgid "change role name or membership"
+msgstr "cambiar nombre del rol o membresía"
+
+#: sql_help.c:5206
+msgid "change the definition of an index"
+msgstr "cambia la definición de un índice"
+
+#: sql_help.c:5212
+msgid "change the definition of a procedural language"
+msgstr "cambia la definición de un lenguaje procedural"
+
+#: sql_help.c:5218
+msgid "change the definition of a large object"
+msgstr "cambia la definición de un objeto grande"
+
+#: sql_help.c:5224
+msgid "change the definition of a materialized view"
+msgstr "cambia la definición de una vista materializada"
+
+#: sql_help.c:5230
+msgid "change the definition of an operator"
+msgstr "cambia la definición de un operador"
+
+#: sql_help.c:5236
+msgid "change the definition of an operator class"
+msgstr "cambia la definición de una clase de operadores"
+
+#: sql_help.c:5242
+msgid "change the definition of an operator family"
+msgstr "cambia la definición de una familia de operadores"
+
+#: sql_help.c:5248
+msgid "change the definition of a row-level security policy"
+msgstr "cambia la definición de una política de seguridad a nivel de registros"
+
+#: sql_help.c:5254
+msgid "change the definition of a procedure"
+msgstr "cambia la definición de un procedimiento"
+
+#: sql_help.c:5260
+msgid "change the definition of a publication"
+msgstr "cambia la definición de una publicación"
+
+#: sql_help.c:5266 sql_help.c:5368
+msgid "change a database role"
+msgstr "cambia un rol de la base de datos"
+
+#: sql_help.c:5272
+msgid "change the definition of a routine"
+msgstr "cambia la definición de una rutina"
+
+#: sql_help.c:5278
+msgid "change the definition of a rule"
+msgstr "cambia la definición de una regla"
+
+#: sql_help.c:5284
+msgid "change the definition of a schema"
+msgstr "cambia la definición de un esquema"
+
+#: sql_help.c:5290
+msgid "change the definition of a sequence generator"
+msgstr "cambia la definición de un generador secuencial"
+
+#: sql_help.c:5296
+msgid "change the definition of a foreign server"
+msgstr "cambia la definición de un servidor foráneo"
+
+#: sql_help.c:5302
+msgid "change the definition of an extended statistics object"
+msgstr "cambia la definición de un objeto de estadísticas extendidas"
+
+#: sql_help.c:5308
+msgid "change the definition of a subscription"
+msgstr "cambia la definición de una suscripción"
+
+#: sql_help.c:5314
+msgid "change a server configuration parameter"
+msgstr "cambia un parámetro de configuración del servidor"
+
+#: sql_help.c:5320
+msgid "change the definition of a table"
+msgstr "cambia la definición de una tabla"
+
+#: sql_help.c:5326
+msgid "change the definition of a tablespace"
+msgstr "cambia la definición de un tablespace"
+
+#: sql_help.c:5332
+msgid "change the definition of a text search configuration"
+msgstr "cambia la definición de una configuración de búsqueda en texto"
+
+#: sql_help.c:5338
+msgid "change the definition of a text search dictionary"
+msgstr "cambia la definición de un diccionario de búsqueda en texto"
+
+#: sql_help.c:5344
+msgid "change the definition of a text search parser"
+msgstr "cambia la definición de un analizador de búsqueda en texto"
+
+#: sql_help.c:5350
+msgid "change the definition of a text search template"
+msgstr "cambia la definición de una plantilla de búsqueda en texto"
+
+#: sql_help.c:5356
+msgid "change the definition of a trigger"
+msgstr "cambia la definición de un disparador"
+
+#: sql_help.c:5362
+msgid "change the definition of a type"
+msgstr "cambia la definición de un tipo"
+
+#: sql_help.c:5374
+msgid "change the definition of a user mapping"
+msgstr "cambia la definición de un mapeo de usuario"
+
+#: sql_help.c:5380
+msgid "change the definition of a view"
+msgstr "cambia la definición de una vista"
+
+#: sql_help.c:5386
+msgid "collect statistics about a database"
+msgstr "recolecta estadísticas sobre una base de datos"
+
+#: sql_help.c:5392 sql_help.c:6190
+msgid "start a transaction block"
+msgstr "inicia un bloque de transacción"
+
+#: sql_help.c:5398
+msgid "invoke a procedure"
+msgstr "invocar un procedimiento"
+
+#: sql_help.c:5404
+msgid "force a write-ahead log checkpoint"
+msgstr "fuerza un checkpoint de wal"
+
+#: sql_help.c:5410
+msgid "close a cursor"
+msgstr "cierra un cursor"
+
+#: sql_help.c:5416
+msgid "cluster a table according to an index"
+msgstr "reordena una tabla siguiendo un índice"
+
+#: sql_help.c:5422
+msgid "define or change the comment of an object"
+msgstr "define o cambia un comentario sobre un objeto"
+
+#: sql_help.c:5428 sql_help.c:5986
+msgid "commit the current transaction"
+msgstr "compromete la transacción en curso"
+
+#: sql_help.c:5434
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "confirma una transacción que fue preparada para two-phase commit"
+
+#: sql_help.c:5440
+msgid "copy data between a file and a table"
+msgstr "copia datos entre un archivo y una tabla"
+
+#: sql_help.c:5446
+msgid "define a new access method"
+msgstr "define un nuevo método de acceso"
+
+#: sql_help.c:5452
+msgid "define a new aggregate function"
+msgstr "define una nueva función de agregación"
+
+#: sql_help.c:5458
+msgid "define a new cast"
+msgstr "define una nueva conversión de tipo"
+
+#: sql_help.c:5464
+msgid "define a new collation"
+msgstr "define un nuevo ordenamiento"
+
+#: sql_help.c:5470
+msgid "define a new encoding conversion"
+msgstr "define una nueva conversión de codificación"
+
+#: sql_help.c:5476
+msgid "create a new database"
+msgstr "crea una nueva base de datos"
+
+#: sql_help.c:5482
+msgid "define a new domain"
+msgstr "define un nuevo dominio"
+
+#: sql_help.c:5488
+msgid "define a new event trigger"
+msgstr "define un nuevo disparador por evento"
+
+#: sql_help.c:5494
+msgid "install an extension"
+msgstr "instala una extensión"
+
+#: sql_help.c:5500
+msgid "define a new foreign-data wrapper"
+msgstr "define un nuevo conector de datos externos"
+
+#: sql_help.c:5506
+msgid "define a new foreign table"
+msgstr "define una nueva tabla foránea"
+
+#: sql_help.c:5512
+msgid "define a new function"
+msgstr "define una nueva función"
+
+#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680
+msgid "define a new database role"
+msgstr "define un nuevo rol de la base de datos"
+
+#: sql_help.c:5524
+msgid "define a new index"
+msgstr "define un nuevo índice"
+
+#: sql_help.c:5530
+msgid "define a new procedural language"
+msgstr "define un nuevo lenguaje procedural"
+
+#: sql_help.c:5536
+msgid "define a new materialized view"
+msgstr "define una nueva vista materializada"
+
+#: sql_help.c:5542
+msgid "define a new operator"
+msgstr "define un nuevo operador"
+
+#: sql_help.c:5548
+msgid "define a new operator class"
+msgstr "define una nueva clase de operadores"
+
+#: sql_help.c:5554
+msgid "define a new operator family"
+msgstr "define una nueva familia de operadores"
+
+#: sql_help.c:5560
+msgid "define a new row-level security policy for a table"
+msgstr "define una nueva política de seguridad a nivel de registros para una tabla"
+
+#: sql_help.c:5566
+msgid "define a new procedure"
+msgstr "define un nuevo procedimiento"
+
+#: sql_help.c:5572
+msgid "define a new publication"
+msgstr "define una nueva publicación"
+
+#: sql_help.c:5584
+msgid "define a new rewrite rule"
+msgstr "define una nueva regla de reescritura"
+
+#: sql_help.c:5590
+msgid "define a new schema"
+msgstr "define un nuevo esquema"
+
+#: sql_help.c:5596
+msgid "define a new sequence generator"
+msgstr "define un nuevo generador secuencial"
+
+#: sql_help.c:5602
+msgid "define a new foreign server"
+msgstr "define un nuevo servidor foráneo"
+
+#: sql_help.c:5608
+msgid "define extended statistics"
+msgstr "define estadísticas extendidas"
+
+#: sql_help.c:5614
+msgid "define a new subscription"
+msgstr "define una nueva suscripción"
+
+#: sql_help.c:5620
+msgid "define a new table"
+msgstr "define una nueva tabla"
+
+#: sql_help.c:5626 sql_help.c:6148
+msgid "define a new table from the results of a query"
+msgstr "crea una nueva tabla usando los resultados de una consulta"
+
+#: sql_help.c:5632
+msgid "define a new tablespace"
+msgstr "define un nuevo tablespace"
+
+#: sql_help.c:5638
+msgid "define a new text search configuration"
+msgstr "define una nueva configuración de búsqueda en texto"
+
+#: sql_help.c:5644
+msgid "define a new text search dictionary"
+msgstr "define un nuevo diccionario de búsqueda en texto"
+
+#: sql_help.c:5650
+msgid "define a new text search parser"
+msgstr "define un nuevo analizador de búsqueda en texto"
+
+#: sql_help.c:5656
+msgid "define a new text search template"
+msgstr "define una nueva plantilla de búsqueda en texto"
+
+#: sql_help.c:5662
+msgid "define a new transform"
+msgstr "define una nueva transformación"
+
+#: sql_help.c:5668
+msgid "define a new trigger"
+msgstr "define un nuevo disparador"
+
+#: sql_help.c:5674
+msgid "define a new data type"
+msgstr "define un nuevo tipo de datos"
+
+#: sql_help.c:5686
+msgid "define a new mapping of a user to a foreign server"
+msgstr "define un nuevo mapa de usuario a servidor foráneo"
+
+#: sql_help.c:5692
+msgid "define a new view"
+msgstr "define una nueva vista"
+
+#: sql_help.c:5698
+msgid "deallocate a prepared statement"
+msgstr "elimina una sentencia preparada"
+
+#: sql_help.c:5704
+msgid "define a cursor"
+msgstr "define un nuevo cursor"
+
+#: sql_help.c:5710
+msgid "delete rows of a table"
+msgstr "elimina filas de una tabla"
+
+#: sql_help.c:5716
+msgid "discard session state"
+msgstr "descartar datos de la sesión"
+
+#: sql_help.c:5722
+msgid "execute an anonymous code block"
+msgstr "ejecutar un bloque anónimo de código"
+
+#: sql_help.c:5728
+msgid "remove an access method"
+msgstr "elimina un método de acceso"
+
+#: sql_help.c:5734
+msgid "remove an aggregate function"
+msgstr "elimina una función de agregación"
+
+#: sql_help.c:5740
+msgid "remove a cast"
+msgstr "elimina una conversión de tipo"
+
+#: sql_help.c:5746
+msgid "remove a collation"
+msgstr "elimina un ordenamiento"
+
+#: sql_help.c:5752
+msgid "remove a conversion"
+msgstr "elimina una conversión de codificación"
+
+#: sql_help.c:5758
+msgid "remove a database"
+msgstr "elimina una base de datos"
+
+#: sql_help.c:5764
+msgid "remove a domain"
+msgstr "elimina un dominio"
+
+#: sql_help.c:5770
+msgid "remove an event trigger"
+msgstr "elimina un disparador por evento"
+
+#: sql_help.c:5776
+msgid "remove an extension"
+msgstr "elimina una extensión"
+
+#: sql_help.c:5782
+msgid "remove a foreign-data wrapper"
+msgstr "elimina un conector de datos externos"
+
+#: sql_help.c:5788
+msgid "remove a foreign table"
+msgstr "elimina una tabla foránea"
+
+#: sql_help.c:5794
+msgid "remove a function"
+msgstr "elimina una función"
+
+#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968
+msgid "remove a database role"
+msgstr "elimina un rol de base de datos"
+
+#: sql_help.c:5806
+msgid "remove an index"
+msgstr "elimina un índice"
+
+#: sql_help.c:5812
+msgid "remove a procedural language"
+msgstr "elimina un lenguaje procedural"
+
+#: sql_help.c:5818
+msgid "remove a materialized view"
+msgstr "elimina una vista materializada"
+
+#: sql_help.c:5824
+msgid "remove an operator"
+msgstr "elimina un operador"
+
+#: sql_help.c:5830
+msgid "remove an operator class"
+msgstr "elimina una clase de operadores"
+
+#: sql_help.c:5836
+msgid "remove an operator family"
+msgstr "elimina una familia de operadores"
+
+#: sql_help.c:5842
+msgid "remove database objects owned by a database role"
+msgstr "elimina objetos de propiedad de un rol de la base de datos"
+
+#: sql_help.c:5848
+msgid "remove a row-level security policy from a table"
+msgstr "elimina una política de seguridad a nivel de registros de una tabla"
+
+#: sql_help.c:5854
+msgid "remove a procedure"
+msgstr "elimina un procedimiento"
+
+#: sql_help.c:5860
+msgid "remove a publication"
+msgstr "elimina una publicación"
+
+#: sql_help.c:5872
+msgid "remove a routine"
+msgstr "elimina una rutina"
+
+#: sql_help.c:5878
+msgid "remove a rewrite rule"
+msgstr "elimina una regla de reescritura"
+
+#: sql_help.c:5884
+msgid "remove a schema"
+msgstr "elimina un esquema"
+
+#: sql_help.c:5890
+msgid "remove a sequence"
+msgstr "elimina un generador secuencial"
+
+#: sql_help.c:5896
+msgid "remove a foreign server descriptor"
+msgstr "elimina un descriptor de servidor foráneo"
+
+#: sql_help.c:5902
+msgid "remove extended statistics"
+msgstr "elimina estadísticas extendidas"
+
+#: sql_help.c:5908
+msgid "remove a subscription"
+msgstr "elimina una suscripción"
+
+#: sql_help.c:5914
+msgid "remove a table"
+msgstr "elimina una tabla"
+
+#: sql_help.c:5920
+msgid "remove a tablespace"
+msgstr "elimina un tablespace"
+
+#: sql_help.c:5926
+msgid "remove a text search configuration"
+msgstr "elimina una configuración de búsqueda en texto"
+
+#: sql_help.c:5932
+msgid "remove a text search dictionary"
+msgstr "elimina un diccionario de búsqueda en texto"
+
+#: sql_help.c:5938
+msgid "remove a text search parser"
+msgstr "elimina un analizador de búsqueda en texto"
+
+#: sql_help.c:5944
+msgid "remove a text search template"
+msgstr "elimina una plantilla de búsqueda en texto"
+
+#: sql_help.c:5950
+msgid "remove a transform"
+msgstr "elimina una transformación"
+
+#: sql_help.c:5956
+msgid "remove a trigger"
+msgstr "elimina un disparador"
+
+#: sql_help.c:5962
+msgid "remove a data type"
+msgstr "elimina un tipo de datos"
+
+#: sql_help.c:5974
+msgid "remove a user mapping for a foreign server"
+msgstr "elimina un mapeo de usuario para un servidor remoto"
+
+#: sql_help.c:5980
+msgid "remove a view"
+msgstr "elimina una vista"
+
+#: sql_help.c:5992
+msgid "execute a prepared statement"
+msgstr "ejecuta una sentencia preparada"
+
+#: sql_help.c:5998
+msgid "show the execution plan of a statement"
+msgstr "muestra el plan de ejecución de una sentencia"
+
+#: sql_help.c:6004
+msgid "retrieve rows from a query using a cursor"
+msgstr "recupera filas de una consulta usando un cursor"
+
+#: sql_help.c:6010
+msgid "define access privileges"
+msgstr "define privilegios de acceso"
+
+#: sql_help.c:6016
+msgid "import table definitions from a foreign server"
+msgstr "importa definiciones de tablas desde un servidor foráneo"
+
+#: sql_help.c:6022
+msgid "create new rows in a table"
+msgstr "crea nuevas filas en una tabla"
+
+#: sql_help.c:6028
+msgid "listen for a notification"
+msgstr "escucha notificaciones"
+
+#: sql_help.c:6034
+msgid "load a shared library file"
+msgstr "carga un archivo de biblioteca compartida"
+
+#: sql_help.c:6040
+msgid "lock a table"
+msgstr "bloquea una tabla"
+
+#: sql_help.c:6046
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "condicionalmente inserta, actualiza o elimina filas de una tabla"
+
+#: sql_help.c:6052
+msgid "position a cursor"
+msgstr "reposiciona un cursor"
+
+#: sql_help.c:6058
+msgid "generate a notification"
+msgstr "genera una notificación"
+
+#: sql_help.c:6064
+msgid "prepare a statement for execution"
+msgstr "prepara una sentencia para ejecución"
+
+#: sql_help.c:6070
+msgid "prepare the current transaction for two-phase commit"
+msgstr "prepara la transacción actual para two-phase commit"
+
+#: sql_help.c:6076
+msgid "change the ownership of database objects owned by a database role"
+msgstr "cambia de dueño a los objetos de propiedad de un rol de la base de datos"
+
+#: sql_help.c:6082
+msgid "replace the contents of a materialized view"
+msgstr "reemplaza los contenidos de una vista materializada"
+
+#: sql_help.c:6088
+msgid "rebuild indexes"
+msgstr "reconstruye índices"
+
+#: sql_help.c:6094
+msgid "destroy a previously defined savepoint"
+msgstr "destruye un savepoint previamente definido"
+
+#: sql_help.c:6100
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "restaura el valor de un parámetro de configuración al valor inicial"
+
+#: sql_help.c:6106
+msgid "remove access privileges"
+msgstr "revoca privilegios de acceso"
+
+#: sql_help.c:6118
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "cancela una transacción que fue previamente preparada para two-phase commit"
+
+#: sql_help.c:6124
+msgid "roll back to a savepoint"
+msgstr "descartar hacia un savepoint"
+
+#: sql_help.c:6130
+msgid "define a new savepoint within the current transaction"
+msgstr "define un nuevo savepoint en la transacción en curso"
+
+#: sql_help.c:6136
+msgid "define or change a security label applied to an object"
+msgstr "define o cambia una etiqueta de seguridad sobre un objeto"
+
+#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232
+msgid "retrieve rows from a table or view"
+msgstr "recupera filas desde una tabla o vista"
+
+#: sql_help.c:6154
+msgid "change a run-time parameter"
+msgstr "cambia un parámetro de configuración"
+
+#: sql_help.c:6160
+msgid "set constraint check timing for the current transaction"
+msgstr "define el modo de verificación de las restricciones de la transacción en curso"
+
+#: sql_help.c:6166
+msgid "set the current user identifier of the current session"
+msgstr "define el identificador de usuario actual de la sesión actual"
+
+#: sql_help.c:6172
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr ""
+"define el identificador del usuario de sesión y el identificador\n"
+"del usuario actual de la sesión en curso"
+
+#: sql_help.c:6178
+msgid "set the characteristics of the current transaction"
+msgstr "define las características de la transacción en curso"
+
+#: sql_help.c:6184
+msgid "show the value of a run-time parameter"
+msgstr "muestra el valor de un parámetro de configuración"
+
+#: sql_help.c:6202
+msgid "empty a table or set of tables"
+msgstr "vacía una tabla o conjunto de tablas"
+
+#: sql_help.c:6208
+msgid "stop listening for a notification"
+msgstr "deja de escuchar una notificación"
+
+#: sql_help.c:6214
+msgid "update rows of a table"
+msgstr "actualiza filas de una tabla"
+
+#: sql_help.c:6220
+msgid "garbage-collect and optionally analyze a database"
+msgstr "recolecta basura y opcionalmente estadísticas sobre una base de datos"
+
+#: sql_help.c:6226
+msgid "compute a set of rows"
+msgstr "calcula un conjunto de registros"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 sólo puede ser usado en modo no interactivo"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "no se pudo abrir el archivo de registro «%s»: %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Digite «help» para obtener ayuda.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "no se pudo definir parámetro de impresión «%s»"
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "se ignoró argumento extra «%s» en línea de órdenes"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "no se pudo encontrar el ejecutable propio"
+
+#: tab-complete.c:5955
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"la consulta para completación por tabulador falló: %s\n"
+"La consulta era:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "valor «%s» no reconocido para «%s»: se esperaba booleano"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "valor «%s» no válido para «%s»: se esperaba número entero"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "nombre de variable no válido: «%s»"
+
+#: variables.c:419
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"valor «%s» no reconocido para «%s»\n"
+"Los valores disponibles son: %s."
diff --git a/src/bin/psql/po/fr.po b/src/bin/psql/po/fr.po
new file mode 100644
index 0000000..27003b2
--- /dev/null
+++ b/src/bin/psql/po/fr.po
@@ -0,0 +1,7011 @@
+# LANGUAGE message translation file for psql
+# Copyright (C) 2001-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the psql (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Peter Eisentraut <peter_e@gmx.net>, 2001.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2003-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-02-03 22:46+0000\n"
+"PO-Revision-Date: 2023-02-05 17:29+0100\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "n'a pas pu identifier le répertoire courant : %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binaire « %s » invalide"
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "n'a pas pu lire le binaire « %s »"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "n'a pas pu trouver un « %s » à exécuter"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "n'a pas pu modifier le répertoire par « %s » : %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "n'a pas pu lire le lien symbolique « %s » : %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "échec de %s() : %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "n'a pas pu trouver l'identifiant réel %ld de l'utilisateur : %s"
+
+#: ../../common/username.c:45 command.c:575
+msgid "user does not exist"
+msgstr "l'utilisateur n'existe pas"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "commande non exécutable"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "commande introuvable"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "le processus fils a quitté avec le code de sortie %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "le processus fils a été terminé par l'exception 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "le processus fils a été terminé par le signal %d : %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "le processus fils a quitté avec un statut %d non reconnu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Requête d'annulation envoyée\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "N'a pas pu envoyer la requête d'annulation : "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu ligne)"
+msgstr[1] "(%lu lignes)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Interrompu\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr ""
+"Ne peut pas ajouter l'en-tête au contenu de la table : le nombre de colonnes\n"
+"%d est dépassé.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr ""
+"Ne peut pas ajouter une cellule au contenu de la table : le nombre total des\n"
+"cellules %d est dépassé.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "format de sortie invalide (erreur interne) : %d"
+
+#: ../../fe_utils/psqlscan.l:702
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "ignore l'expansion récursive de la variable « %s »"
+
+#: ../../port/thread.c:100 ../../port/thread.c:136
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "n'a pas pu rechercher l'identifiant de l'utilisateur local %d : %s"
+
+#: ../../port/thread.c:105 ../../port/thread.c:141
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "l'utilisateur local dont l'identifiant est %d n'existe pas"
+
+#: command.c:232
+#, c-format
+msgid "invalid command \\%s"
+msgstr "commande \\%s invalide"
+
+#: command.c:234
+#, c-format
+msgid "Try \\? for help."
+msgstr "Essayez \\? pour l'aide."
+
+#: command.c:252
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s : argument « %s » supplémentaire ignoré"
+
+#: command.c:304
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "commande \\%s ignorée ; utilisez \\endif ou Ctrl-C pour quitter le bloc \\if courant"
+
+#: command.c:573
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "n'a pas pu obtenir le répertoire principal pour l'identifiant d'utilisateur %ld : %s"
+
+#: command.c:592
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s : n'a pas pu accéder au répertoire « %s » : %m"
+
+#: command.c:617
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "Vous n'êtes pas connecté à une base de données.\n"
+
+#: command.c:627
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Vous êtes connecté à la base de données « %s » en tant qu'utilisateur « %s » à l'adresse « %s » via le port « %s ».\n"
+
+#: command.c:630
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Vous êtes connecté à la base de données « %s » en tant qu'utilisateur « %s » via le socket dans « %s » via le port « %s ».\n"
+
+#: command.c:636
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Vous êtes connecté à la base de données « %s » en tant qu'utilisateur « %s » sur l'hôte « %s » (adresse « %s ») via le port « %s ».\n"
+
+#: command.c:639
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Vous êtes connecté à la base de données « %s » en tant qu'utilisateur « %s » sur l'hôte « %s » via le port « %s ».\n"
+
+#: command.c:1030 command.c:1125 command.c:2654
+#, c-format
+msgid "no query buffer"
+msgstr "aucun tampon de requête"
+
+#: command.c:1063 command.c:5491
+#, c-format
+msgid "invalid line number: %s"
+msgstr "numéro de ligne invalide : %s"
+
+#: command.c:1203
+msgid "No changes"
+msgstr "Aucun changement"
+
+#: command.c:1282
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s : nom d'encodage invalide ou procédure de conversion introuvable"
+
+#: command.c:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597
+#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100
+#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443
+#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1324
+msgid "There is no previous error."
+msgstr "Il n'y a pas d'erreur précédente."
+
+#: command.c:1437
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: parenthèse droite manquante"
+
+#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989
+#: command.c:2173 command.c:2415 command.c:2621 command.c:2661
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s : argument requis manquant"
+
+#: command.c:1782
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif : ne peut pas survenir après \\else"
+
+#: command.c:1787
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif : pas de \\if correspondant"
+
+#: command.c:1851
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else : ne peut pas survenir après \\else"
+
+#: command.c:1856
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else : pas de \\if correspondant"
+
+#: command.c:1896
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif : pas de \\if correspondant"
+
+#: command.c:2053
+msgid "Query buffer is empty."
+msgstr "Le tampon de requête est vide."
+
+#: command.c:2096
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Saisir le nouveau mot de passe de l'utilisateur « %s » : "
+
+#: command.c:2100
+msgid "Enter it again: "
+msgstr "Saisir le mot de passe à nouveau : "
+
+#: command.c:2109
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Les mots de passe ne sont pas identiques."
+
+#: command.c:2208
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s : n'a pas pu lire la valeur pour la variable"
+
+#: command.c:2311
+msgid "Query buffer reset (cleared)."
+msgstr "Le tampon de requête a été effacé."
+
+#: command.c:2333
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "Historique sauvegardé dans le fichier « %s ».\n"
+
+#: command.c:2420
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s : le nom de la variable d'environnement ne doit pas contenir « = »"
+
+#: command.c:2468
+#, c-format
+msgid "function name is required"
+msgstr "le nom de la fonction est requis"
+
+#: command.c:2470
+#, c-format
+msgid "view name is required"
+msgstr "le nom de la vue est requis"
+
+#: command.c:2593
+msgid "Timing is on."
+msgstr "Chronométrage activé."
+
+#: command.c:2595
+msgid "Timing is off."
+msgstr "Chronométrage désactivé."
+
+#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952
+#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008
+#: command.c:4022 command.c:4049 command.c:4107 common.c:77 copy.c:331
+#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, c-format
+msgid "%s: %m"
+msgstr "%s : %m"
+
+#: command.c:3107 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Mot de passe : "
+
+#: command.c:3112 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Mot de passe pour l'utilisateur %s : "
+
+#: command.c:3168
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "Ne pas donner utilisateur, hôte ou port lors de l'utilisation d'une chaîne de connexion"
+
+#: command.c:3203
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "Aucune connexion de base existante pour réutiliser ses paramètres"
+
+#: command.c:3511
+#, c-format
+msgid "Previous connection kept"
+msgstr "Connexion précédente conservée"
+
+#: command.c:3517
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect : %s"
+
+#: command.c:3573
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s » à l'adresse « %s » via le port « %s ».\n"
+
+#: command.c:3576
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s » via le socket dans « %s » via le port « %s ».\n"
+
+#: command.c:3582
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s » sur l'hôte « %s » (adresse « %s » ) via le port « %s ».\n"
+
+#: command.c:3585
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s » sur l'hôte « %s » via le port « %s ».\n"
+
+#: command.c:3590
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s ».\n"
+
+#: command.c:3630
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, serveur %s)\n"
+
+#: command.c:3643
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"ATTENTION : %s version majeure %s, version majeure du serveur %s.\n"
+" Certaines fonctionnalités de psql pourraient ne pas fonctionner.\n"
+
+#: command.c:3680
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "Connexion SSL (protocole : %s, chiffrement : %s, compression : %s)\n"
+
+#: command.c:3681 command.c:3682
+msgid "unknown"
+msgstr "inconnu"
+
+#: command.c:3683 help.c:42
+msgid "off"
+msgstr "désactivé"
+
+#: command.c:3683 help.c:42
+msgid "on"
+msgstr "activé"
+
+#: command.c:3697
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "connexion chiffrée avec GSSAPI\n"
+
+#: command.c:3717
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"Attention : l'encodage console (%u) diffère de l'encodage Windows (%u).\n"
+" Les caractères 8 bits peuvent ne pas fonctionner correctement.\n"
+" Voir la section « Notes aux utilisateurs de Windows » de la page\n"
+" référence de psql pour les détails.\n"
+
+#: command.c:3822
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "la variable d'environnement PSQL_EDITOR_LINENUMBER_ARG doit être définie avec un numéro de ligne"
+
+#: command.c:3851
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "n'a pas pu exécuter l'éditeur « %s »"
+
+#: command.c:3853
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "n'a pas pu exécuter /bin/sh"
+
+#: command.c:3903
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "n'a pas pu localiser le répertoire temporaire : %s"
+
+#: command.c:3930
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier temporaire « %s » : %m"
+
+#: command.c:4266
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: abréviation ambigüe : « %s » correspond à « %s » comme à « %s »"
+
+#: command.c:4286
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset : les formats autorisés sont aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4305
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: les styles de lignes autorisés sont ascii, old-ascii, unicode"
+
+#: command.c:4320
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset : les styles autorisés de ligne de bordure Unicode sont single, double"
+
+#: command.c:4335
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset : les styles autorisés pour la ligne de colonne Unicode sont single, double"
+
+#: command.c:4350
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset : les styles autorisés pour la ligne d'en-tête Unicode sont single, double"
+
+#: command.c:4393
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep doit être un unique caractère d'un octet"
+
+#: command.c:4398
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep ne peut pas être un guillemet, un retour à la ligne ou un retour chariot"
+
+#: command.c:4535 command.c:4723
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset : option inconnue : %s"
+
+#: command.c:4555
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Le style de bordure est %d.\n"
+
+#: command.c:4561
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "La largeur cible n'est pas configuré.\n"
+
+#: command.c:4563
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "La largeur cible est %d.\n"
+
+#: command.c:4570
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Affichage étendu activé.\n"
+
+#: command.c:4572
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "L'affichage étendu est utilisé automatiquement.\n"
+
+#: command.c:4574
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Affichage étendu désactivé.\n"
+
+#: command.c:4580
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "Le séparateur de champs pour un CSV est « %s ».\n"
+
+#: command.c:4588 command.c:4596
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "Le séparateur de champs est l'octet zéro.\n"
+
+#: command.c:4590
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "Le séparateur de champs est « %s ».\n"
+
+#: command.c:4603
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Le bas de page pas défaut est activé.\n"
+
+#: command.c:4605
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Le bas de page par défaut est désactivé.\n"
+
+#: command.c:4611
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Le format de sortie est %s.\n"
+
+#: command.c:4617
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Le style de ligne est %s.\n"
+
+#: command.c:4624
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "L'affichage de null est « %s ».\n"
+
+#: command.c:4632
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "L'affichage de la sortie numérique adaptée à la locale est activé.\n"
+
+#: command.c:4634
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "L'affichage de la sortie numérique adaptée à la locale est désactivé.\n"
+
+#: command.c:4641
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "Le paginateur est utilisé pour les affichages longs.\n"
+
+#: command.c:4643
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "Le paginateur est toujours utilisé.\n"
+
+#: command.c:4645
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "L'utilisation du paginateur est désactivé.\n"
+
+#: command.c:4651
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "Le paginateur ne sera pas utilisé pour moins que %d ligne.\n"
+msgstr[1] "Le paginateur ne sera pas utilisé pour moins que %d lignes.\n"
+
+#: command.c:4661 command.c:4671
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "Le séparateur d'enregistrements est l'octet zéro.\n"
+
+#: command.c:4663
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "Le séparateur d'enregistrement est <saut de ligne>.\n"
+
+#: command.c:4665
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "Le séparateur d'enregistrements est « %s ».\n"
+
+#: command.c:4678
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Les attributs de la table sont « %s ».\n"
+
+#: command.c:4681
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Les attributs de la table ne sont pas définis.\n"
+
+#: command.c:4688
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Le titre est « %s ».\n"
+
+#: command.c:4690
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Le titre n'est pas défini.\n"
+
+#: command.c:4697
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "L'affichage des tuples seuls est activé.\n"
+
+#: command.c:4699
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "L'affichage des tuples seuls est désactivé.\n"
+
+#: command.c:4705
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Le style de bordure Unicode est « %s ».\n"
+
+#: command.c:4711
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Le style de ligne Unicode est « %s ».\n"
+
+#: command.c:4717
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Le style d'en-tête Unicode est « %s ».\n"
+
+#: command.c:4950
+#, c-format
+msgid "\\!: failed"
+msgstr "\\! : échec"
+
+#: command.c:4984
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch ne peut pas être utilisé avec une requête vide"
+
+#: command.c:5016
+#, c-format
+msgid "could not set timer: %m"
+msgstr "n'a pas pu configurer le chronomètre : %m"
+
+#: command.c:5078
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (chaque %gs)\n"
+
+#: command.c:5081
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (chaque %gs)\n"
+
+#: command.c:5142
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "n'a pas pu attendre le signal : %m"
+
+#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"******** REQUÊTE *********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5386
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "« %s.%s » n'est pas une vue"
+
+#: command.c:5402
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "n'a pas pu analyser le tableau reloptions"
+
+#: common.c:166
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "ne peut mettre entre guillemets sans connexion active"
+
+#: common.c:207
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "l'argument de la commande shell contient un retour à la ligne ou un retour chariot : « %s »"
+
+#: common.c:311
+#, c-format
+msgid "connection to server was lost"
+msgstr "la connexion au serveur a été perdue"
+
+#: common.c:315
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "La connexion au serveur a été perdue. Tentative de réinitialisation : "
+
+#: common.c:320
+#, c-format
+msgid "Failed.\n"
+msgstr "Échec.\n"
+
+#: common.c:337
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Succès.\n"
+
+#: common.c:389 common.c:1001
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "PQresultStatus inattendu : %d"
+
+#: common.c:511
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Temps : %.3f ms\n"
+
+#: common.c:526
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Durée : %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:535
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Durée : %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:542
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Durée : %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:566 common.c:623 common.c:1034 describe.c:6135
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Vous n'êtes pas connecté à une base de données."
+
+#: common.c:654
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr ""
+"Notification asynchrone « %s » reçue avec le contenu « %s » en provenance du\n"
+"processus serveur de PID %d.\n"
+
+#: common.c:657
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr ""
+"Notification asynchrone « %s » reçue en provenance du processus serveur de\n"
+"PID %d.\n"
+
+#: common.c:688
+#, c-format
+msgid "could not print result table: %m"
+msgstr "n'a pas pu imprimer la table résultante : %m"
+
+#: common.c:708
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "aucune ligne retournée pour \\gset"
+
+#: common.c:713
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "plus d'une ligne retournée pour \\gset"
+
+#: common.c:731
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "tentative ignorée d'utilisation de \\gset dans une variable traitée spécialement « %s »"
+
+#: common.c:1043
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Mode étape par étape: vérifiez la commande)*********************************\n"
+"%s\n"
+"***(appuyez sur entrée pour l'exécuter ou tapez x puis entrée pour annuler)***\n"
+
+#: common.c:1126
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "INSTRUCTION : %s"
+
+#: common.c:1162
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "état de la transaction inattendu (%d)"
+
+#: common.c:1303 describe.c:2020
+msgid "Column"
+msgstr "Colonne"
+
+#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037
+#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021
+#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504
+#: describe.c:5767
+msgid "Type"
+msgstr "Type"
+
+#: common.c:1353
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "La commande n'a pas de résultats ou le résultat n'a pas de colonnes.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy : arguments requis"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy : erreur d'analyse sur « %s »"
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy : erreur d'analyse à la fin de la ligne"
+
+#: copy.c:328
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "n'a pas pu exécuter la commande « %s » : %m"
+
+#: copy.c:344
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "n'a pas pu tester le fichier « %s » : %m"
+
+#: copy.c:348
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s : ne peut pas copier depuis/vers un répertoire"
+
+#: copy.c:385
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "n'a pas pu fermer le fichier pipe vers la commande externe : %m"
+
+#: copy.c:390
+#, c-format
+msgid "%s: %s"
+msgstr "%s : %s"
+
+#: copy.c:453 copy.c:463
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "n'a pas pu écrire les données du COPY : %m"
+
+#: copy.c:469
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "Échec du transfert de données COPY : %s"
+
+#: copy.c:530
+msgid "canceled by user"
+msgstr "annulé par l'utilisateur"
+
+#: copy.c:541
+msgid ""
+"Enter data to be copied followed by a newline.\n"
+"End with a backslash and a period on a line by itself, or an EOF signal."
+msgstr ""
+"Saisissez les données à copier suivies d'un saut de ligne.\n"
+"Terminez avec un antislash et un point seuls sur une ligne ou un signal EOF."
+
+#: copy.c:684
+msgid "aborted because of read failure"
+msgstr "annulé du fait d'une erreur de lecture"
+
+#: copy.c:718
+msgid "trying to exit copy mode"
+msgstr "tente de sortir du mode copy"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview : la commande n'a pas retourné d'ensemble de résultats"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview : la requête doit renvoyer au moins trois colonnes"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview : les en-têtes horizontales et verticales doivent être des colonnes différentes"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview : la colonne de données doit être spécifiée quand la requête retourne plus de trois colonnes"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview : nombre maximum de colonnes (%d) dépassé"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview : le résultat de la requête contient plusieurs valeurs de données pour la ligne « %s », colonne « %s »"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview : le numéro de colonne %d est en dehors des limites 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview : nom de colonne ambigu : « %s »"
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview : nom de colonne non trouvé : « %s »"
+
+#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029
+#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090
+#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866
+#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420
+#: describe.c:5477 describe.c:5881 describe.c:5959
+msgid "Schema"
+msgstr "Schéma"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636
+#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258
+#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341
+#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867
+#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410
+#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748
+#: describe.c:5957 describe.c:6186 describe.c:6494
+msgid "Name"
+msgstr "Nom"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "Type de données du résultat"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "Type de données des paramètres"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423
+#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041
+#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280
+#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777
+#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248
+#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422
+#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895
+#: describe.c:5960 describe.c:6992
+msgid "Description"
+msgstr "Description"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "Liste des fonctions d'agrégation"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "Le serveur (version %s) ne supporte pas les méthodes d'accès."
+
+#: describe.c:168
+msgid "Index"
+msgstr "Index"
+
+#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882
+msgid "Table"
+msgstr "Table"
+
+#: describe.c:177 describe.c:5679
+msgid "Handler"
+msgstr "Gestionnaire"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "Liste des méthodes d'accès"
+
+#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181
+#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588
+#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187
+#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718
+#: describe.c:6980
+msgid "Owner"
+msgstr "Propriétaire"
+
+#: describe.c:231
+msgid "Location"
+msgstr "Emplacement"
+
+#: describe.c:241 describe.c:3509
+msgid "Options"
+msgstr "Options"
+
+#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934
+msgid "Size"
+msgstr "Taille"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "Liste des tablespaces"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df ne prend que [anptwS+] comme options"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df ne prend pas d'option « %c » pour un serveur en version %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "agg"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "window"
+
+#: describe.c:356
+msgid "proc"
+msgstr "proc"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "func"
+
+#: describe.c:374 describe.c:1390
+msgid "trigger"
+msgstr "trigger"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "immutable"
+
+#: describe.c:387
+msgid "stable"
+msgstr "stable"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "volatile"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "Volatibilité"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "restricted"
+
+#: describe.c:398
+msgid "safe"
+msgstr "safe"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "unsafe"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "Parallèle"
+
+#: describe.c:405
+msgid "definer"
+msgstr "definer"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "invoker"
+
+#: describe.c:407
+msgid "Security"
+msgstr "Sécurité"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Langage"
+
+#: describe.c:416 describe.c:420
+msgid "Source code"
+msgstr "Code source"
+
+#: describe.c:594
+msgid "List of functions"
+msgstr "Liste des fonctions"
+
+#: describe.c:657
+msgid "Internal name"
+msgstr "Nom interne"
+
+#: describe.c:659
+msgid "Elements"
+msgstr "Éléments"
+
+#: describe.c:711
+msgid "List of data types"
+msgstr "Liste des types de données"
+
+#: describe.c:814
+msgid "Left arg type"
+msgstr "Type de l'arg. gauche"
+
+#: describe.c:815
+msgid "Right arg type"
+msgstr "Type de l'arg. droit"
+
+#: describe.c:816
+msgid "Result type"
+msgstr "Type du résultat"
+
+#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247
+#: describe.c:6909 describe.c:6913
+msgid "Function"
+msgstr "Fonction"
+
+#: describe.c:902
+msgid "List of operators"
+msgstr "Liste des opérateurs"
+
+#: describe.c:938
+msgid "Encoding"
+msgstr "Encodage"
+
+#: describe.c:939 describe.c:4868
+msgid "Collate"
+msgstr "Collationnement"
+
+#: describe.c:940 describe.c:4869
+msgid "Ctype"
+msgstr "Type caract."
+
+#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878
+msgid "ICU Locale"
+msgstr "Locale ICU"
+
+#: describe.c:946 describe.c:952
+msgid "Locale Provider"
+msgstr "Fournisseur de locale"
+
+#: describe.c:964
+msgid "Tablespace"
+msgstr "Tablespace"
+
+#: describe.c:990
+msgid "List of databases"
+msgstr "Liste des bases de données"
+
+#: describe.c:1031 describe.c:1184 describe.c:3882
+msgid "table"
+msgstr "table"
+
+#: describe.c:1032 describe.c:3883
+msgid "view"
+msgstr "vue"
+
+#: describe.c:1033 describe.c:3884
+msgid "materialized view"
+msgstr "vue matérialisée"
+
+#: describe.c:1034 describe.c:1186 describe.c:3886
+msgid "sequence"
+msgstr "séquence"
+
+#: describe.c:1035 describe.c:3888
+msgid "foreign table"
+msgstr "table distante"
+
+#: describe.c:1036 describe.c:3889 describe.c:4101
+msgid "partitioned table"
+msgstr "table partitionnée"
+
+#: describe.c:1047
+msgid "Column privileges"
+msgstr "Droits d'accès à la colonne"
+
+#: describe.c:1078 describe.c:1112
+msgid "Policies"
+msgstr "Politiques"
+
+#: describe.c:1143 describe.c:4510 describe.c:6577
+msgid "Access privileges"
+msgstr "Droits d'accès"
+
+#: describe.c:1188
+msgid "function"
+msgstr "fonction"
+
+#: describe.c:1190
+msgid "type"
+msgstr "type"
+
+#: describe.c:1192
+msgid "schema"
+msgstr "schéma"
+
+#: describe.c:1215
+msgid "Default access privileges"
+msgstr "Droits d'accès par défaut"
+
+#: describe.c:1259
+msgid "Object"
+msgstr "Objet"
+
+#: describe.c:1273
+msgid "table constraint"
+msgstr "contrainte de table"
+
+#: describe.c:1297
+msgid "domain constraint"
+msgstr "contrainte de domaine"
+
+#: describe.c:1321
+msgid "operator class"
+msgstr "classe d'opérateur"
+
+#: describe.c:1345
+msgid "operator family"
+msgstr "famille d'opérateur"
+
+#: describe.c:1368
+msgid "rule"
+msgstr "règle"
+
+#: describe.c:1414
+msgid "Object descriptions"
+msgstr "Descriptions des objets"
+
+#: describe.c:1479 describe.c:4007
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Aucune relation nommée « %s » n'a été trouvée."
+
+#: describe.c:1482 describe.c:4010
+#, c-format
+msgid "Did not find any relations."
+msgstr "Aucune relation n'a été trouvée."
+
+#: describe.c:1678
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Aucune relation avec l'OID « %s » n'a été trouvée."
+
+#: describe.c:1726 describe.c:1750
+msgid "Start"
+msgstr "Début"
+
+#: describe.c:1727 describe.c:1751
+msgid "Minimum"
+msgstr "Minimum"
+
+#: describe.c:1728 describe.c:1752
+msgid "Maximum"
+msgstr "Maximum"
+
+#: describe.c:1729 describe.c:1753
+msgid "Increment"
+msgstr "Incrément"
+
+#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426
+#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620
+msgid "yes"
+msgstr "oui"
+
+#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426
+#: describe.c:4768 describe.c:4892 describe.c:6621
+msgid "no"
+msgstr "non"
+
+#: describe.c:1732 describe.c:1756
+msgid "Cycles?"
+msgstr "Cycles ?"
+
+#: describe.c:1733 describe.c:1757
+msgid "Cache"
+msgstr "Cache"
+
+#: describe.c:1798
+#, c-format
+msgid "Owned by: %s"
+msgstr "Propriétaire : %s"
+
+#: describe.c:1802
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Séquence pour la colonne d'identité : %s"
+
+#: describe.c:1810
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "Séquence non journalisée « %s.%s »"
+
+#: describe.c:1813
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Séquence « %s.%s »"
+
+#: describe.c:1957
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Table non tracée « %s.%s »"
+
+#: describe.c:1960
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Table « %s.%s »"
+
+#: describe.c:1964
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Vue « %s.%s »"
+
+#: describe.c:1969
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Vue matérialisée non journalisée « %s.%s »"
+
+#: describe.c:1972
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Vue matérialisée « %s.%s »"
+
+#: describe.c:1977
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Index non tracé « %s.%s »"
+
+#: describe.c:1980
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Index « %s.%s »"
+
+#: describe.c:1985
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Index partitionné non journalisé « %s.%s »"
+
+#: describe.c:1988
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Index partitionné « %s.%s »"
+
+#: describe.c:1992
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "Table TOAST « %s.%s »"
+
+#: describe.c:1996
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Type composé « %s.%s »"
+
+#: describe.c:2000
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Table distante « %s.%s »"
+
+#: describe.c:2005
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Table non journalisée « %s.%s »"
+
+#: describe.c:2008
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Table partitionnée « %s.%s »"
+
+#: describe.c:2024 describe.c:4343
+msgid "Collation"
+msgstr "Collationnement"
+
+#: describe.c:2025 describe.c:4344
+msgid "Nullable"
+msgstr "NULL-able"
+
+#: describe.c:2026 describe.c:4345
+msgid "Default"
+msgstr "Par défaut"
+
+#: describe.c:2029
+msgid "Key?"
+msgstr "Clé ?"
+
+#: describe.c:2031 describe.c:4665 describe.c:4676
+msgid "Definition"
+msgstr "Définition"
+
+#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835
+#: describe.c:5894
+msgid "FDW options"
+msgstr "Options FDW"
+
+#: describe.c:2035
+msgid "Storage"
+msgstr "Stockage"
+
+#: describe.c:2037
+msgid "Compression"
+msgstr "Compression"
+
+#: describe.c:2039
+msgid "Stats target"
+msgstr "Cible de statistiques"
+
+#: describe.c:2175
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "Partition de : %s %s%s"
+
+#: describe.c:2188
+msgid "No partition constraint"
+msgstr "Aucune contrainte de partition"
+
+#: describe.c:2190
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Contrainte de partition : %s"
+
+#: describe.c:2214
+#, c-format
+msgid "Partition key: %s"
+msgstr "Clé de partition : %s"
+
+#: describe.c:2240
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Table propriétaire : « %s.%s »"
+
+#: describe.c:2309
+msgid "primary key, "
+msgstr "clé primaire, "
+
+#: describe.c:2312
+msgid "unique"
+msgstr "unique"
+
+#: describe.c:2314
+msgid " nulls not distinct"
+msgstr " nulls non distincts"
+
+#: describe.c:2315
+msgid ", "
+msgstr " , "
+
+#: describe.c:2322
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "pour la table « %s.%s »"
+
+#: describe.c:2326
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", prédicat (%s)"
+
+#: describe.c:2329
+msgid ", clustered"
+msgstr ", en cluster"
+
+#: describe.c:2332
+msgid ", invalid"
+msgstr ", invalide"
+
+#: describe.c:2335
+msgid ", deferrable"
+msgstr ", déferrable"
+
+#: describe.c:2338
+msgid ", initially deferred"
+msgstr ", initialement déferré"
+
+#: describe.c:2341
+msgid ", replica identity"
+msgstr ", identité réplica"
+
+#: describe.c:2395
+msgid "Indexes:"
+msgstr "Index :"
+
+#: describe.c:2478
+msgid "Check constraints:"
+msgstr "Contraintes de vérification :"
+
+#: describe.c:2546
+msgid "Foreign-key constraints:"
+msgstr "Contraintes de clés étrangères :"
+
+#: describe.c:2609
+msgid "Referenced by:"
+msgstr "Référencé par :"
+
+#: describe.c:2659
+msgid "Policies:"
+msgstr "Politiques :"
+
+#: describe.c:2662
+msgid "Policies (forced row security enabled):"
+msgstr "Politiques (mode sécurité de ligne activé en forcé) :"
+
+#: describe.c:2665
+msgid "Policies (row security enabled): (none)"
+msgstr "Politiques (mode sécurité de ligne activé) : (aucune)"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Politiques (mode sécurité de ligne activé en forcé) : (aucune)"
+
+#: describe.c:2671
+msgid "Policies (row security disabled):"
+msgstr "Politiques (mode sécurité de ligne désactivé) :"
+
+#: describe.c:2731 describe.c:2835
+msgid "Statistics objects:"
+msgstr "Objets statistiques :"
+
+#: describe.c:2937 describe.c:3090
+msgid "Rules:"
+msgstr "Règles :"
+
+#: describe.c:2940
+msgid "Disabled rules:"
+msgstr "Règles désactivées :"
+
+#: describe.c:2943
+msgid "Rules firing always:"
+msgstr "Règles toujous activées :"
+
+#: describe.c:2946
+msgid "Rules firing on replica only:"
+msgstr "Règles activées uniquement sur le réplica :"
+
+#: describe.c:3025 describe.c:5030
+msgid "Publications:"
+msgstr "Publications :"
+
+#: describe.c:3073
+msgid "View definition:"
+msgstr "Définition de la vue :"
+
+#: describe.c:3236
+msgid "Triggers:"
+msgstr "Triggers :"
+
+#: describe.c:3239
+msgid "Disabled user triggers:"
+msgstr "Triggers utilisateurs désactivés :"
+
+#: describe.c:3242
+msgid "Disabled internal triggers:"
+msgstr "Triggers internes désactivés :"
+
+#: describe.c:3245
+msgid "Triggers firing always:"
+msgstr "Triggers toujours activés :"
+
+#: describe.c:3248
+msgid "Triggers firing on replica only:"
+msgstr "Triggers activés uniquement sur le réplica :"
+
+#: describe.c:3319
+#, c-format
+msgid "Server: %s"
+msgstr "Serveur : %s"
+
+#: describe.c:3327
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "Options FDW : (%s)"
+
+#: describe.c:3348
+msgid "Inherits"
+msgstr "Hérite de"
+
+#: describe.c:3413
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "Nombre de partitions : %d"
+
+#: describe.c:3422
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Nombre de partitions : %d (utilisez \\d+ pour les lister)"
+
+#: describe.c:3424
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Nombre de tables enfants : %d (utilisez \\d+ pour les lister)"
+
+#: describe.c:3431
+msgid "Child tables"
+msgstr "Tables enfant"
+
+#: describe.c:3431
+msgid "Partitions"
+msgstr "Partitions"
+
+#: describe.c:3462
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Table de type : %s"
+
+#: describe.c:3478
+msgid "Replica Identity"
+msgstr "Identité de réplicat"
+
+#: describe.c:3491
+msgid "Has OIDs: yes"
+msgstr "Contient des OID : oui"
+
+#: describe.c:3500
+#, c-format
+msgid "Access method: %s"
+msgstr "Méthode d'accès : %s"
+
+#: describe.c:3579
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "Tablespace : « %s »"
+
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:3591
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", tablespace « %s »"
+
+#: describe.c:3668
+msgid "List of roles"
+msgstr "Liste des rôles"
+
+#: describe.c:3670
+msgid "Role name"
+msgstr "Nom du rôle"
+
+#: describe.c:3671
+msgid "Attributes"
+msgstr "Attributs"
+
+#: describe.c:3673
+msgid "Member of"
+msgstr "Membre de"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "Superutilisateur"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "Pas d'héritage"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "Créer un rôle"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "Créer une base"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "Ne peut pas se connecter"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "Réplication"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "Contournement RLS"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "Sans connexions"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d connexion"
+msgstr[1] "%d connexions"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Mot de passe valide jusqu'à "
+
+#: describe.c:3777
+msgid "Role"
+msgstr "Rôle"
+
+#: describe.c:3778
+msgid "Database"
+msgstr "Base de données"
+
+#: describe.c:3779
+msgid "Settings"
+msgstr "Réglages"
+
+#: describe.c:3803
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "Aucune configuration pour le rôle « %s » et la base de données « %s » n'a été trouvée."
+
+#: describe.c:3806
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Aucune configuration pour le rôle « %s » n'a été trouvée."
+
+#: describe.c:3809
+#, c-format
+msgid "Did not find any settings."
+msgstr "Aucune configuration n'a été trouvée."
+
+#: describe.c:3814
+msgid "List of settings"
+msgstr "Liste des paramètres"
+
+#: describe.c:3885
+msgid "index"
+msgstr "index"
+
+#: describe.c:3887
+msgid "TOAST table"
+msgstr "Table TOAST"
+
+#: describe.c:3890 describe.c:4102
+msgid "partitioned index"
+msgstr "index partitionné"
+
+#: describe.c:3910
+msgid "permanent"
+msgstr "permanent"
+
+#: describe.c:3911
+msgid "temporary"
+msgstr "temporaire"
+
+#: describe.c:3912
+msgid "unlogged"
+msgstr "non journalisé"
+
+#: describe.c:3913
+msgid "Persistence"
+msgstr "Persistence"
+
+#: describe.c:3929
+msgid "Access method"
+msgstr "Méthode d'accès"
+
+#: describe.c:4015
+msgid "List of relations"
+msgstr "Liste des relations"
+
+#: describe.c:4063
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "Le serveur (version %s) ne supporte pas le partitionnement déclaratif des tables."
+
+#: describe.c:4074
+msgid "List of partitioned indexes"
+msgstr "Liste des index partitionnés"
+
+#: describe.c:4076
+msgid "List of partitioned tables"
+msgstr "Liste des tables partitionnées"
+
+#: describe.c:4080
+msgid "List of partitioned relations"
+msgstr "Liste des relations partitionnées"
+
+#: describe.c:4111
+msgid "Parent name"
+msgstr "Nom du parent"
+
+#: describe.c:4124
+msgid "Leaf partition size"
+msgstr "Taille de la partition de dernier niveau"
+
+#: describe.c:4127 describe.c:4133
+msgid "Total size"
+msgstr "Taille totale"
+
+#: describe.c:4258
+msgid "Trusted"
+msgstr "De confiance"
+
+#: describe.c:4267
+msgid "Internal language"
+msgstr "Langage interne"
+
+#: describe.c:4268
+msgid "Call handler"
+msgstr "Gestionnaire d'appel"
+
+#: describe.c:4269 describe.c:5680
+msgid "Validator"
+msgstr "Validateur"
+
+#: describe.c:4270
+msgid "Inline handler"
+msgstr "Gestionnaire en ligne"
+
+#: describe.c:4305
+msgid "List of languages"
+msgstr "Liste des langages"
+
+#: describe.c:4346
+msgid "Check"
+msgstr "Vérification"
+
+#: describe.c:4390
+msgid "List of domains"
+msgstr "Liste des domaines"
+
+#: describe.c:4424
+msgid "Source"
+msgstr "Source"
+
+#: describe.c:4425
+msgid "Destination"
+msgstr "Destination"
+
+#: describe.c:4427 describe.c:6622
+msgid "Default?"
+msgstr "Par défaut ?"
+
+#: describe.c:4469
+msgid "List of conversions"
+msgstr "Liste des conversions"
+
+#: describe.c:4497
+msgid "Parameter"
+msgstr "Paramètre"
+
+#: describe.c:4498
+msgid "Value"
+msgstr "Valeur"
+
+#: describe.c:4505
+msgid "Context"
+msgstr "Contexte"
+
+#: describe.c:4538
+msgid "List of configuration parameters"
+msgstr "Liste des paramètres de configuration"
+
+#: describe.c:4540
+msgid "List of non-default configuration parameters"
+msgstr "Liste des paramètres de configuration à valeur personnalisée"
+
+#: describe.c:4567
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "Le serveur (version %s) ne supporte pas les triggers d'événement."
+
+#: describe.c:4587
+msgid "Event"
+msgstr "Événement"
+
+#: describe.c:4589
+msgid "enabled"
+msgstr "activé"
+
+#: describe.c:4590
+msgid "replica"
+msgstr "réplicat"
+
+#: describe.c:4591
+msgid "always"
+msgstr "toujours"
+
+#: describe.c:4592
+msgid "disabled"
+msgstr "désactivé"
+
+#: describe.c:4593 describe.c:6496
+msgid "Enabled"
+msgstr "Activé"
+
+#: describe.c:4595
+msgid "Tags"
+msgstr "Tags"
+
+#: describe.c:4619
+msgid "List of event triggers"
+msgstr "Liste des triggers sur évènement"
+
+#: describe.c:4646
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "Le serveur (version %s) ne supporte pas les statistiques étendues."
+
+#: describe.c:4683
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4684
+msgid "Dependencies"
+msgstr "Dépendances"
+
+#: describe.c:4694
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4718
+msgid "List of extended statistics"
+msgstr "Liste des statistiques étendues"
+
+#: describe.c:4745
+msgid "Source type"
+msgstr "Type source"
+
+#: describe.c:4746
+msgid "Target type"
+msgstr "Type cible"
+
+#: describe.c:4770
+msgid "in assignment"
+msgstr "assigné"
+
+#: describe.c:4772
+msgid "Implicit?"
+msgstr "Implicite ?"
+
+#: describe.c:4831
+msgid "List of casts"
+msgstr "Liste des conversions explicites"
+
+#: describe.c:4883 describe.c:4887
+msgid "Provider"
+msgstr "Fournisseur"
+
+#: describe.c:4893 describe.c:4898
+msgid "Deterministic?"
+msgstr "Déterministe ?"
+
+#: describe.c:4938
+msgid "List of collations"
+msgstr "Liste des collationnements"
+
+#: describe.c:5000
+msgid "List of schemas"
+msgstr "Liste des schémas"
+
+#: describe.c:5117
+msgid "List of text search parsers"
+msgstr "Liste des analyseurs de la recherche de texte"
+
+#: describe.c:5167
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Aucun analyseur de la recherche de texte nommé « %s » n'a été trouvé."
+
+#: describe.c:5170
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Aucun analyseur de recherche de texte n'a été trouvé."
+
+#: describe.c:5245
+msgid "Start parse"
+msgstr "Début de l'analyse"
+
+#: describe.c:5246
+msgid "Method"
+msgstr "Méthode"
+
+#: describe.c:5250
+msgid "Get next token"
+msgstr "Obtenir le prochain jeton"
+
+#: describe.c:5252
+msgid "End parse"
+msgstr "Fin de l'analyse"
+
+#: describe.c:5254
+msgid "Get headline"
+msgstr "Obtenir l'en-tête"
+
+#: describe.c:5256
+msgid "Get token types"
+msgstr "Obtenir les types de jeton"
+
+#: describe.c:5267
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Analyseur « %s.%s » de la recherche de texte"
+
+#: describe.c:5270
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Analyseur « %s » de la recherche de texte"
+
+#: describe.c:5289
+msgid "Token name"
+msgstr "Nom du jeton"
+
+#: describe.c:5303
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Types de jeton pour l'analyseur « %s.%s »"
+
+#: describe.c:5306
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Types de jeton pour l'analyseur « %s »"
+
+#: describe.c:5350
+msgid "Template"
+msgstr "Modèle"
+
+#: describe.c:5351
+msgid "Init options"
+msgstr "Options d'initialisation"
+
+#: describe.c:5378
+msgid "List of text search dictionaries"
+msgstr "Liste des dictionnaires de la recherche de texte"
+
+#: describe.c:5411
+msgid "Init"
+msgstr "Initialisation"
+
+#: describe.c:5412
+msgid "Lexize"
+msgstr "Lexize"
+
+#: describe.c:5444
+msgid "List of text search templates"
+msgstr "Liste des modèles de la recherche de texte"
+
+#: describe.c:5499
+msgid "List of text search configurations"
+msgstr "Liste des configurations de la recherche de texte"
+
+#: describe.c:5550
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "Aucune configuration de la recherche de texte nommée « %s » n'a été trouvée."
+
+#: describe.c:5553
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Aucune configuration de recherche de texte n'a été trouvée."
+
+#: describe.c:5619
+msgid "Token"
+msgstr "Jeton"
+
+#: describe.c:5620
+msgid "Dictionaries"
+msgstr "Dictionnaires"
+
+#: describe.c:5631
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Configuration « %s.%s » de la recherche de texte"
+
+#: describe.c:5634
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Configuration « %s » de la recherche de texte"
+
+#: describe.c:5638
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Analyseur : « %s.%s »"
+
+#: describe.c:5641
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Analyseur : « %s »"
+
+#: describe.c:5722
+msgid "List of foreign-data wrappers"
+msgstr "Liste des wrappers de données distantes"
+
+#: describe.c:5750
+msgid "Foreign-data wrapper"
+msgstr "Wrapper des données distantes"
+
+#: describe.c:5768 describe.c:5958
+msgid "Version"
+msgstr "Version"
+
+#: describe.c:5799
+msgid "List of foreign servers"
+msgstr "Liste des serveurs distants"
+
+#: describe.c:5824 describe.c:5883
+msgid "Server"
+msgstr "Serveur"
+
+#: describe.c:5825
+msgid "User name"
+msgstr "Nom de l'utilisateur"
+
+#: describe.c:5855
+msgid "List of user mappings"
+msgstr "Liste des correspondances utilisateurs"
+
+#: describe.c:5928
+msgid "List of foreign tables"
+msgstr "Liste des tables distantes"
+
+#: describe.c:5980
+msgid "List of installed extensions"
+msgstr "Liste des extensions installées"
+
+#: describe.c:6028
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "Aucune extension nommée « %s » n'a été trouvée."
+
+#: describe.c:6031
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Aucune extension n'a été trouvée."
+
+#: describe.c:6075
+msgid "Object description"
+msgstr "Description d'objet"
+
+#: describe.c:6085
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Objets dans l'extension « %s »"
+
+#: describe.c:6126
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "mauvaise qualification du nom (trop de points entre les noms) : %s"
+
+#: describe.c:6140
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "les références entre bases de données ne sont pas implémentées : %s"
+
+#: describe.c:6171 describe.c:6298
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "Le serveur (version %s) ne supporte pas les publications."
+
+#: describe.c:6188 describe.c:6376
+msgid "All tables"
+msgstr "Toutes les tables"
+
+#: describe.c:6189 describe.c:6377
+msgid "Inserts"
+msgstr "Insertions"
+
+#: describe.c:6190 describe.c:6378
+msgid "Updates"
+msgstr "Mises à jour"
+
+#: describe.c:6191 describe.c:6379
+msgid "Deletes"
+msgstr "Suppressions"
+
+#: describe.c:6195 describe.c:6381
+msgid "Truncates"
+msgstr "Tronque"
+
+#: describe.c:6199 describe.c:6383
+msgid "Via root"
+msgstr "Via la racine"
+
+#: describe.c:6221
+msgid "List of publications"
+msgstr "Liste des publications"
+
+#: describe.c:6345
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "Aucune publication nommée « %s » n'a été trouvée."
+
+#: describe.c:6348
+#, c-format
+msgid "Did not find any publications."
+msgstr "Aucune publication n'a été trouvée."
+
+#: describe.c:6372
+#, c-format
+msgid "Publication %s"
+msgstr "Publication %s"
+
+#: describe.c:6425
+msgid "Tables:"
+msgstr "Tables :"
+
+#: describe.c:6437
+msgid "Tables from schemas:"
+msgstr "Tables des schémas :"
+
+#: describe.c:6481
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Le serveur (version %s) ne supporte pas les souscriptions."
+
+#: describe.c:6497
+msgid "Publication"
+msgstr "Publication"
+
+#: describe.c:6506
+msgid "Binary"
+msgstr "Binaire"
+
+#: describe.c:6507
+msgid "Streaming"
+msgstr "Flux"
+
+#: describe.c:6514
+msgid "Two-phase commit"
+msgstr "Commit en deux phases"
+
+#: describe.c:6515
+msgid "Disable on error"
+msgstr "Désactiver en cas d'erreur"
+
+#: describe.c:6520
+msgid "Synchronous commit"
+msgstr "Validation synchrone"
+
+#: describe.c:6521
+msgid "Conninfo"
+msgstr "Informations de connexion"
+
+#: describe.c:6527
+msgid "Skip LSN"
+msgstr "Ignore LSN"
+
+#: describe.c:6554
+msgid "List of subscriptions"
+msgstr "Liste des souscriptions"
+
+#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6617
+msgid "Input type"
+msgstr "Type en entrée"
+
+#: describe.c:6618
+msgid "Storage type"
+msgstr "Type de stockage"
+
+#: describe.c:6619
+msgid "Operator class"
+msgstr "Classe d'opérateur"
+
+#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901
+msgid "Operator family"
+msgstr "Famille d'opérateur"
+
+#: describe.c:6667
+msgid "List of operator classes"
+msgstr "Liste des classes d'opérateurs"
+
+#: describe.c:6714
+msgid "Applicable types"
+msgstr "Types applicables"
+
+#: describe.c:6756
+msgid "List of operator families"
+msgstr "Liste des familles d'opérateurs"
+
+#: describe.c:6807
+msgid "Operator"
+msgstr "Opérateur"
+
+#: describe.c:6808
+msgid "Strategy"
+msgstr "Stratégie"
+
+#: describe.c:6809
+msgid "ordering"
+msgstr "ordre"
+
+#: describe.c:6810
+msgid "search"
+msgstr "recherche"
+
+#: describe.c:6811
+msgid "Purpose"
+msgstr "But"
+
+#: describe.c:6816
+msgid "Sort opfamily"
+msgstr "Tri famille d'opérateur"
+
+#: describe.c:6855
+msgid "List of operators of operator families"
+msgstr "Liste d'opérateurs des familles d'opérateurs"
+
+#: describe.c:6902
+msgid "Registered left type"
+msgstr "Type de l'arg. gauche enregistré"
+
+#: describe.c:6903
+msgid "Registered right type"
+msgstr "Type de l'arg. droit enregistré"
+
+#: describe.c:6904
+msgid "Number"
+msgstr "Numéro"
+
+#: describe.c:6948
+msgid "List of support functions of operator families"
+msgstr "Liste des fonctions de support des familles d'opérateurs"
+
+#: describe.c:6979
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7000
+msgid "Large objects"
+msgstr "« Large objects »"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql est l'interface interactive de PostgreSQL.\n"
+"\n"
+
+#: help.c:76 help.c:393 help.c:473 help.c:516
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [OPTIONS]... [BASE [UTILISATEUR]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "Options générales :\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr ""
+" -c, --command=COMMANDE exécute une commande unique (SQL ou interne), puis\n"
+" quitte\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr ""
+" -d, --dbname=BASE indique le nom de la base de données à laquelle se\n"
+" connecter (par défaut : « %s »)\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=FICHIER exécute les commandes du fichier, puis quitte\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list affiche les bases de données disponibles, puis quitte\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NOM=VALEUR\n"
+" configure la variable psql NOM en VALEUR\n"
+" (par exemple : -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc ne lit pas le fichier de démarrage (~/.psqlrc)\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (« un »), --single-transaction\n"
+" exécute dans une transaction unique (si non\n"
+" interactif)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] affiche cette aide et quitte\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commandes liste les méta-commandes, puis quitte\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables liste les variables spéciales, puis quitte\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Options d'entrée/sortie :\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all affiche les lignes du script\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors affiche les commandes échouées\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries affiche les commandes envoyées au serveur\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr ""
+" -E, --echo-hidden affiche les requêtes engendrées par les commandes\n"
+" internes\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=FICHIER envoie les traces dans le fichier\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr ""
+" -n, --no-readline désactive l'édition avancée de la ligne de commande\n"
+" (readline)\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr ""
+" -o, --output=FICHIER écrit les résultats des requêtes dans un fichier (ou\n"
+" |tube)\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr ""
+" -q, --quiet s'exécute silencieusement (pas de messages, uniquement\n"
+" le résultat des requêtes)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr ""
+" -s, --single-step active le mode étape par étape (confirmation pour\n"
+" chaque requête)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr ""
+" -S, --single-line active le mode ligne par ligne (EOL termine la\n"
+" commande SQL)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Options de formattage de la sortie :\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr ""
+" -A, --no-align active le mode d'affichage non aligné des tables\n"
+" (-P format=unaligned)\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr ""
+" --csv mode d'affichage CSV (valeurs séparées par des\n"
+" virgules)\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=CHAINE\n"
+" séparateur de champs pour un affichage non aligné\n"
+" (par défaut : « %s »)\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr ""
+" -H, --html active le mode d'affichage HTML des tables\n"
+" (-P format=html)\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr ""
+" -P, --pset=VAR[=ARG] initialise l'option d'impression VAR à ARG (voir la\n"
+" commande \\pset)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=CHAINE\n"
+" séparateur d'enregistrements pour un affichage non\n"
+" aligné (par défaut : saut de ligne)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only affiche seulement les lignes (-P tuples_only)\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr ""
+" -T, --table-attr=TEXTE initialise les attributs des balises HTML de tableau\n"
+" (largeur, bordure)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded active l'affichage étendu des tables (-P expanded)\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" initialise le séparateur de champs pour un affichage\n"
+" non aligné à l'octet zéro\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" initialise le séparateur d'enregistrements pour un\n"
+" affichage non aligné à l'octet zéro\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Options de connexion :\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr ""
+" -h, --host=HÔTE nom d'hôte du serveur de la base de données ou\n"
+" répertoire de la socket (par défaut : %s)\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "socket locale"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr ""
+" -p, --port=PORT port du serveur de la base de données (par défaut :\n"
+" « %s »)\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr ""
+" -U, --username=UTILISATEUR\n"
+" nom d'utilisateur de la base de données (par\n"
+" défaut : « %s »)\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ne demande jamais un mot de passe\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password force la demande du mot de passe (devrait survenir\n"
+" automatiquement)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Pour en savoir davantage, saisissez « \\? » (pour les commandes internes) ou\n"
+"« \\help » (pour les commandes SQL) dans psql, ou consultez la section psql de\n"
+"la documentation de PostgreSQL.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapporter les bogues à <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "Général\n"
+
+#: help.c:192
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr ""
+" \\copyright affiche les conditions d'utilisation et de\n"
+" distribution de PostgreSQL\n"
+
+#: help.c:193
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr " \\crosstabview [COLONNES] exécute la requête et affiche le résultat dans un tableau croisé\n"
+
+#: help.c:194
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose affiche le message d'erreur le plus récent avec une verbosité maximale\n"
+
+#: help.c:195
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPTIONS)] [FICHIER] exécute la requête (et envoie les résultats à un fichier ou à |pipe);\n"
+" \\g sans arguments est équivalent à un point-virgule\n"
+
+#: help.c:197
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc décrit le résultat de la requête sans l'exécuter\n"
+
+#: help.c:198
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec exécute la requête et exécute chaque valeur du résultat\n"
+
+#: help.c:199
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [PRÉFIXE] exécute la requête et enregistre le résultat dans des variables psql\n"
+
+#: help.c:200
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(OPTIONS)] [FICHIER] comme \\g, mais force le mode de sortie étendu\n"
+
+#: help.c:201
+msgid " \\q quit psql\n"
+msgstr " \\q quitte psql\n"
+
+#: help.c:202
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SEC] exécute la requête toutes les SEC secondes\n"
+
+#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304
+#: help.c:324 help.c:337 help.c:346
+msgid "\n"
+msgstr "\n"
+
+#: help.c:205
+msgid "Help\n"
+msgstr "Aide\n"
+
+#: help.c:207
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commandes] affiche l'aide sur les métacommandes\n"
+
+#: help.c:208
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options affiche l'aide sur les options en ligne de commande de psql\n"
+
+#: help.c:209
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables affiche l'aide sur les variables spéciales\n"
+
+#: help.c:210
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr ""
+" \\h [NOM] aide-mémoire pour les commandes SQL, * pour toutes\n"
+" les commandes\n"
+
+#: help.c:213
+msgid "Query Buffer\n"
+msgstr "Tampon de requête\n"
+
+#: help.c:214
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr ""
+" \\e [FICHIER] [LIGNE] édite le tampon de requête ou le fichier avec un\n"
+" éditeur externe\n"
+
+#: help.c:215
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr ""
+" \\ef [FONCTION [LIGNE]] édite la définition de fonction avec un éditeur\n"
+" externe\n"
+
+#: help.c:216
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr ""
+" \\ev [VUE [LIGNE]] édite la définition de vue avec un éditeur\n"
+" externe\n"
+
+#: help.c:217
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p affiche le contenu du tampon de requête\n"
+
+#: help.c:218
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r efface le tampon de requêtes\n"
+
+#: help.c:220
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr ""
+" \\s [FICHIER] affiche l'historique ou le sauvegarde dans un\n"
+" fichier\n"
+
+#: help.c:222
+msgid " \\w FILE write query buffer to file\n"
+msgstr ""
+" \\w [FICHIER] écrit le contenu du tampon de requêtes dans un\n"
+" fichier\n"
+
+#: help.c:225
+msgid "Input/Output\n"
+msgstr "Entrée/Sortie\n"
+
+#: help.c:226
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr ""
+" \\copy ... exécute SQL COPY avec le flux de données dirigé vers\n"
+" l'hôte client\n"
+
+#: help.c:227
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [TEXTE] écrit le texte sur la sortie standard (-n pour supprimer le retour à la ligne)\n"
+
+#: help.c:228
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i FICHIER exécute les commandes du fichier\n"
+
+#: help.c:229
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr ""
+" \\ir FICHIER identique à \\i, mais relatif à l'emplacement du script\n"
+" ou un |tube\n"
+
+#: help.c:230
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr ""
+" \\o [FICHIER] envoie les résultats de la requête vers un fichier\n"
+" ou un |tube\n"
+
+#: help.c:231
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr ""
+" \\qecho [-n] [TEXTE] écrit un texte sur la sortie des résultats des\n"
+" requêtes (\\o) (-n pour supprimer le retour à la ligne)\n"
+
+#: help.c:232
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [TEXTE] écrit le texte sur la sortie des erreurs (-n pour supprimer le retour à la ligne)\n"
+
+#: help.c:235
+msgid "Conditional\n"
+msgstr "Conditionnel\n"
+
+#: help.c:236
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR début du bloc conditionnel\n"
+
+#: help.c:237
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif alternative à l'intérieur du bloc conditionnel courant\n"
+
+#: help.c:238
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else alternative finale à l'intérieur du bloc conditionnel courant\n"
+
+#: help.c:239
+msgid " \\endif end conditional block\n"
+msgstr " \\endif bloc conditionnel de fin\n"
+
+#: help.c:242
+msgid "Informational\n"
+msgstr "Informations\n"
+
+#: help.c:243
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (options : S = affiche les objets systèmes, + = informations supplémentaires)\n"
+
+#: help.c:244
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] affiche la liste des tables, vues et séquences\n"
+
+#: help.c:245
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr ""
+" \\d[S+] NOM affiche la description de la table, de la vue,\n"
+" de la séquence ou de l'index\n"
+
+#: help.c:246
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [MODÈLE] affiche les aggrégats\n"
+
+#: help.c:247
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [MODÈLE] affiche la liste des méthodes d'accès\n"
+
+#: help.c:248
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] affiche les classes d'opérateurs\n"
+
+#: help.c:249
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] affiche les familles d'opérateur\n"
+
+#: help.c:250
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] affiche les opérateurs des familles d'opérateur\n"
+
+#: help.c:251
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] liste les fonctions de support des familles d'opérateur\n"
+
+#: help.c:252
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [MODÈLE] affiche la liste des tablespaces\n"
+
+#: help.c:253
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [MODÈLE] affiche la liste des conversions\n"
+
+#: help.c:254
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [MODÈLE] affiche les paramètres de configuration\n"
+
+#: help.c:255
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [MODÈLE] affiche la liste des transtypages\n"
+
+#: help.c:256
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr ""
+" \\dd[S] [MODÈLE] affiche les commentaires des objets dont le commentaire\n"
+" n'est affiché nul part ailleurs\n"
+
+#: help.c:257
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [MODÈLE] affiche la liste des domaines\n"
+
+#: help.c:258
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [MODÈLE] affiche les droits par défaut\n"
+
+#: help.c:259
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [MODÈLE] affiche la liste des tables distantes\n"
+
+#: help.c:260
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [MODÈLE] affiche la liste des serveurs distants\n"
+
+#: help.c:261
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [MODÈLE] affiche la liste des tables distantes\n"
+
+#: help.c:262
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [MODÈLE] affiche la liste des correspondances utilisateurs\n"
+
+#: help.c:263
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [MODÈLE] affiche la liste des wrappers de données distantes\n"
+
+#: help.c:264
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" affiche la liste des fonctions [seulement agrégat/normal/procédure/trigger/window]\n"
+
+#: help.c:266
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr ""
+" \\dF[+] [MODÈLE] affiche la liste des configurations de la recherche\n"
+" plein texte\n"
+
+#: help.c:267
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr ""
+" \\dFd[+] [MODÈLE] affiche la liste des dictionnaires de la recherche de\n"
+" texte\n"
+
+#: help.c:268
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr ""
+" \\dFp[+] [MODÈLE] affiche la liste des analyseurs de la recherche de\n"
+" texte\n"
+
+#: help.c:269
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr ""
+" \\dFt[+] [MODÈLE] affiche la liste des modèles de la recherche de\n"
+" texte\n"
+
+#: help.c:270
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [MODÈLE] affiche la liste des rôles (utilisateurs)\n"
+
+#: help.c:271
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [MODÈLE] affiche la liste des index\n"
+
+#: help.c:272
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] liste des « Large Objects », identique à \\lo_list\n"
+
+#: help.c:273
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [MODÈLE] affiche la liste des langages procéduraux\n"
+
+#: help.c:274
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [MODÈLE] affiche la liste des vues matérialisées\n"
+
+#: help.c:275
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [MODÈLE] affiche la liste des schémas\n"
+
+#: help.c:276
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" affiche la liste des opérateurs\n"
+
+#: help.c:278
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [MODÈLE] affiche la liste des collationnements\n"
+
+#: help.c:279
+msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr ""
+" \\dp [MODÈLE] affiche la liste des droits d'accès aux tables,\n"
+" vues, séquences\n"
+
+#: help.c:280
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[itn+] [PATTERN] affiche les relations partitionnées [seulement index/table] [n=imbriquées]\n"
+
+#: help.c:281
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr ""
+" \\drds [ROLEPTRN [DBPTRN]] liste la configuration utilisateur par base de données\n"
+"\n"
+
+#: help.c:282
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[S+] [MODÈLE] affiche la liste des publications de réplication\n"
+
+#: help.c:283
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [MODÈLE] affiche la liste des souscriptions de réplication\n"
+
+#: help.c:284
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [MODÈLE] affiche la liste des séquences\n"
+
+#: help.c:285
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [MODÈLE] affiche la liste des tables\n"
+
+#: help.c:286
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [MODÈLE] affiche la liste des types de données\n"
+
+#: help.c:287
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [MODÈLE] affiche la liste des rôles (utilisateurs)\n"
+
+#: help.c:288
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [MODÈLE] affiche la liste des vues\n"
+
+#: help.c:289
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [MODÈLE] affiche la liste des extensions\n"
+
+#: help.c:290
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [MODÈLE] affiche les statistiques étendues\n"
+
+#: help.c:291
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [MODÈLE] affiche les triggers sur évènement\n"
+
+#: help.c:292
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [MODÈLE] affiche la liste des bases de données\n"
+
+#: help.c:293
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] [FONCTION] édite la définition d'une fonction\n"
+
+#: help.c:294
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv [FONCTION] édite la définition d'une vue\n"
+
+#: help.c:295
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [MODÈLE] identique à \\dp\n"
+
+#: help.c:298
+msgid "Large Objects\n"
+msgstr "« Large objects »\n"
+
+#: help.c:299
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr ""
+" \\lo_export LOBOID FICHIER\n"
+" écrit un « Large Object » dans le fichier\n"
+
+#: help.c:300
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import FICHIER [COMMENTAIRE]\n"
+" lit un « Large Object » à partir du fichier\n"
+
+#: help.c:302
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\dl[+] liste des « Large Objects »\n"
+
+#: help.c:303
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID supprime un « Large Object »\n"
+
+#: help.c:306
+msgid "Formatting\n"
+msgstr "Formatage\n"
+
+#: help.c:307
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr ""
+" \\a bascule entre les modes de sortie alignée et non\n"
+" alignée\n"
+
+#: help.c:308
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr ""
+" \\C [CHAÎNE] initialise le titre d'une table, ou le désactive en\n"
+" l'absence d'argument\n"
+
+#: help.c:309
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr ""
+" \\f [CHAÎNE] affiche ou initialise le séparateur de champ pour\n"
+" une sortie non alignée des requêtes\n"
+
+#: help.c:310
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H bascule le mode de sortie HTML (actuellement %s)\n"
+
+#: help.c:312
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NOM [VALEUR]] règle l'affichage de la table\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:319
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t affiche uniquement les lignes (actuellement %s)\n"
+
+#: help.c:321
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr ""
+" \\T [CHAÎNE] initialise les attributs HTML de la balise <table>,\n"
+" ou l'annule en l'absence d'argument\n"
+
+#: help.c:322
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] bascule l'affichage étendu (actuellement %s)\n"
+
+#: help.c:323
+msgid "auto"
+msgstr "auto"
+
+#: help.c:326
+msgid "Connection\n"
+msgstr "Connexions\n"
+
+#: help.c:328
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[BASE|- UTILISATEUR|- HÔTE|- PORT|-] | conninfo}\n"
+" se connecte à une autre base de données\n"
+" (actuellement « %s »)\n"
+
+#: help.c:332
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[BASE|- UTILISATEUR|- HÔTE|- PORT|-] | conninfo}\n"
+" se connecte à une nouvelle base de données\n"
+" (aucune connexion actuellement)\n"
+
+#: help.c:334
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo affiche des informations sur la connexion en cours\n"
+
+#: help.c:335
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [ENCODAGE] affiche ou initialise l'encodage du client\n"
+
+#: help.c:336
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr ""
+" \\password [UTILISATEUR]\n"
+" modifie de façon sécurisé le mot de passe d'un\n"
+" utilisateur\n"
+
+#: help.c:339
+msgid "Operating System\n"
+msgstr "Système d'exploitation\n"
+
+#: help.c:340
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [RÉPERTOIRE] change de répertoire de travail\n"
+
+#: help.c:341
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR récupère une variable d'environnement\n"
+
+#: help.c:342
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NOM [VALEUR] (dés)initialise une variable d'environnement\n"
+
+#: help.c:343
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr ""
+" \\timing [on|off] bascule l'activation du chronométrage des commandes\n"
+" (actuellement %s)\n"
+
+#: help.c:345
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr ""
+" \\! [COMMANDE] exécute la commande dans un shell ou exécute un\n"
+" shell interactif\n"
+
+#: help.c:348
+msgid "Variables\n"
+msgstr "Variables\n"
+
+#: help.c:349
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr ""
+" \\prompt [TEXTE] NOM demande à l'utilisateur de configurer la variable\n"
+" interne\n"
+
+#: help.c:350
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr ""
+" \\set [NOM [VALEUR]] initialise une variable interne ou les affiche\n"
+" toutes en l'absence de paramètre\n"
+
+#: help.c:351
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NOM désactive (supprime) la variable interne\n"
+
+#: help.c:390
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"Liste des variables traitées spécialement\n"
+"\n"
+
+#: help.c:392
+msgid "psql variables:\n"
+msgstr "variables psql :\n"
+
+#: help.c:394
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NOM=VALEUR\n"
+" ou \\set NOM VALEUR dans psql\n"
+"\n"
+
+#: help.c:396
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" si activé, les commandes SQL réussies sont automatiquement validées\n"
+
+#: help.c:398
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" détermine la casse utilisée pour compléter les mots clés SQL\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:401
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" le nom de base de données actuel\n"
+
+#: help.c:403
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" contrôle ce qui est envoyé sur la sortie standard\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:406
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" si activé, affiche les requêtes internes exécutées par les méta-commandes ;\n"
+" si configuré à « noexec », affiche les requêtes sans les exécuter\n"
+
+#: help.c:409
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" encodage du jeu de caractères client\n"
+
+#: help.c:411
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr ""
+" ERROR\n"
+" true si la dernière requête a échoué, sinon false\n"
+
+#: help.c:413
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" le nombre de lignes résultats à récupérer et à afficher à la fois\n"
+" (0 pour illimité)\n"
+
+#: help.c:415
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" si activé, les méthodes d'accès ne sont pas affichées\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" si activé, les méthodes de compression methods ne sont pas affichées\n"
+"\n"
+
+#: help.c:419
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" contrôle l'historique des commandes [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:421
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" nom du fichier utilisé pour stocker l'historique des commandes\n"
+
+#: help.c:423
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" nombre maximum de commandes à stocker dans l'historique de commandes\n"
+
+#: help.c:425
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" l'hôte de la base de données\n"
+
+#: help.c:427
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" nombre d'EOF nécessaire pour terminer une session interactive\n"
+
+#: help.c:429
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" valeur du dernier OID affecté\n"
+
+#: help.c:431
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message et SQLSTATE de la dernière erreur ou une chaîne vide et \"00000\" if si aucune erreur\n"
+
+#: help.c:434
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" si activé, une erreur n'arrête pas une transaction (utilise des savepoints implicites)\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" arrête l'exécution d'un batch après une erreur\n"
+
+#: help.c:438
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" port du serveur pour la connexion actuelle\n"
+
+#: help.c:440
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" spécifie l'invite standard de psql\n"
+
+#: help.c:442
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" spécifie l'invite utilisé quand une requête continue après la ligne courante\n"
+
+#: help.c:444
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" spécifie l'invite utilisée lors d'un COPY ... FROM STDIN\n"
+
+#: help.c:446
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" s'exécute en silence (identique à l'option -q)\n"
+
+#: help.c:448
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" nombre de lignes renvoyées ou affectées par la dernière requête, ou 0\n"
+
+#: help.c:450
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" version du serveur (chaîne courte ou format numérique)\n"
+
+#: help.c:453
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" affiche tous les résultats d'une requête combinée (\\;) au lieu du dernier uniquement\n"
+
+#: help.c:455
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" contrôle l'affichage des champs de contexte du message [never, errors, always]\n"
+
+#: help.c:457
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" une fin de ligne termine le mode de commande SQL (identique à l'option -S)\n"
+
+#: help.c:459
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" mode pas à pas (identique à l'option -s)\n"
+
+#: help.c:461
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" SQLSTATE de la dernière requête, ou \"00000\" si aucune erreur\n"
+
+#: help.c:463
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" l'utilisateur actuellement connecté\n"
+
+#: help.c:465
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" contrôle la verbosité des rapports d'erreurs [default, verbose, terse, sqlstate]\n"
+
+#: help.c:467
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" version de psql (chaîne longue, chaîne courte, ou format numérique)\n"
+
+#: help.c:472
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Paramètres d'affichage :\n"
+
+#: help.c:474
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NOM[=VALEUR]\n"
+" ou \\pset NOM [VALEUR] dans psql\n"
+"\n"
+
+#: help.c:476
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" style de bordure (nombre)\n"
+
+#: help.c:478
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" largeur cible pour le format encadré\n"
+
+#: help.c:480
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (ou x)\n"
+" sortie étendue [on, off, auto]\n"
+
+#: help.c:482
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" champ séparateur pour l'affichage non aligné (par défaut « %s »)\n"
+
+#: help.c:485
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" configure le séparateur de champ pour l'affichage non alignée à l'octet zéro\n"
+
+#: help.c:487
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" active ou désactive l'affiche du bas de tableau [on, off]\n"
+
+#: help.c:489
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" active le format de sortie [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:491
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" configure l'affichage des lignes de bordure [ascii, old-ascii, unicode]\n"
+
+#: help.c:493
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" configure la chaîne à afficher à la place d'une valeur NULL\n"
+
+#: help.c:495
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" active ou désactive l'affichage d'un caractère spécifique à la locale pour séparer\n"
+" des groupes de chiffres [on, off]\n"
+
+#: help.c:497
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" contrôle quand un paginateur externe est utilisé [yes, no, always]\n"
+
+#: help.c:499
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" enregistre le séparateur de ligne pour les affichages non alignés\n"
+
+#: help.c:501
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" initialise le séparateur d'enregistrements pour un affichage\n"
+" non aligné à l'octet zéro\n"
+
+#: help.c:503
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (ou T)\n"
+" indique les attributs pour la balise de table dans le format html ou les largeurs\n"
+" proportionnelles de colonnes pour les types de données alignés à gauche dans le\n"
+" format latex-longtable\n"
+
+#: help.c:506
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" configure le titre de la table pour toute table affichée\n"
+
+#: help.c:508
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" si activé, seules les données de la table sont affichées\n"
+
+#: help.c:510
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" configure le style d'affichage de ligne Unicode [single, double]\n"
+
+#: help.c:515
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Variables d'environnement :\n"
+
+#: help.c:519
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NOM=VALEUR [NOM=VALEUR] psql ...\n"
+" ou \\setenv NOM [VALEUR] dans psql\n"
+"\n"
+
+#: help.c:521
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NOM=VALEUR\n"
+" psql ...\n"
+" ou \\setenv NOM [VALEUR] dans psql\n"
+"\n"
+
+#: help.c:524
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" nombre de colonnes pour le format encadré\n"
+
+#: help.c:526
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" identique au paramètre de connexion application_name\n"
+
+#: help.c:528
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" identique au paramètre de connexion dbname\n"
+
+#: help.c:530
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" identique au paramètre de connexion host\n"
+
+#: help.c:532
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" nom du fichier de mot de passe\n"
+
+#: help.c:534
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" mot de passe de connexion (non recommendé)\n"
+
+#: help.c:536
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" identique au paramètre de connexion port\n"
+
+#: help.c:538
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" identique au paramètre de connexion user\n"
+
+#: help.c:540
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" éditeur utilisé par les commandes \\e, \\ef et \\ev\n"
+
+#: help.c:542
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" comment spécifier un numéro de ligne lors de l'appel de l'éditeur\n"
+
+#: help.c:544
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" autre emplacement pour le fichier d'historique des commandes\n"
+
+#: help.c:546
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" nom du paginateur externe\n"
+
+#: help.c:549
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" nom du paginateur externe utilisé pour \\watch\n"
+
+#: help.c:552
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" autre emplacement pour le fichier .psqlrc de l'utilisateur\n"
+
+#: help.c:554
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" shell utilisé par la commande \\!\n"
+
+#: help.c:556
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" répertoire pour les fichiers temporaires\n"
+
+#: help.c:616
+msgid "Available help:\n"
+msgstr "Aide-mémoire disponible :\n"
+
+#: help.c:711
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Commande : %s\n"
+"Description : %s\n"
+"Syntaxe :\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:734
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Aucun aide-mémoire disponible pour « %s ».\n"
+"Essayez \\h sans arguments pour afficher les aide-mémoires disponibles.\n"
+
+#: input.c:217
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "n'a pas pu lire à partir du fichier en entrée : %m"
+
+#: input.c:478 input.c:516
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "n'a pas pu sauvegarder l'historique dans le fichier « %s » : %m"
+
+#: input.c:535
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "l'historique n'est pas supportée par cette installation"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s : non connecté à une base de données"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s : la transaction en cours est abandonnée"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s : état de la transaction inconnu"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if : échappé"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Saisissez « \\q » pour quitter %s.\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"Les données en entrée proviennent d'une sauvegarde PostgreSQL au format custom.\n"
+"Utilisez l'outil en ligne de commande pg_restore pour restaurer cette sauvegarde dans une base de données.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Utilisez \\? pour l'aide ou appuyez sur control-C pour vider le tampon de saisie."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "Utilisez \\? pour l'aide."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Vous utilisez psql, l'interface en ligne de commande de PostgreSQL."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Saisissez:\n"
+" \\copyright pour les termes de distribution\n"
+" \\h pour l'aide-mémoire des commandes SQL\n"
+" \\? pour l'aide-mémoire des commandes psql\n"
+" \\g ou point-virgule en fin d'instruction pour exécuter la requête\n"
+" \\q pour quitter\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "Utilisez \\q pour quitter."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "Utilisez control-D pour quitter."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "Utilisez control-C pour quitter."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "requête ignorée ; utilisez \\endif ou Ctrl-C pour quitter le bloc \\if courant"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "a atteint EOF sans trouver le(s) \\endif fermant"
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "chaîne entre guillemets non terminée"
+
+#: psqlscanslash.l:811
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s : mémoire épuisée"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1996
+#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154
+#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228
+#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431
+#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517
+#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594
+#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730
+#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071
+#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171
+#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259
+#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338
+#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396
+#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428
+#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464
+#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499
+#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537
+#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574
+#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606
+#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638
+#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680
+#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030
+#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687
+#: sql_help.c:4735 sql_help.c:4893
+msgid "name"
+msgstr "nom"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846
+#: sql_help.c:3339 sql_help.c:4455
+msgid "aggregate_signature"
+msgstr "signature_agrégat"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "nouveau_nom"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3011
+msgid "new_owner"
+msgstr "nouveau_propriétaire"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "nouveau_schéma"
+
+#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484
+msgid "where aggregate_signature is:"
+msgstr "où signature_agrégat est :"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911
+#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085
+#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341
+#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527
+#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461
+#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488
+#: sql_help.c:4491
+msgid "argmode"
+msgstr "mode_argument"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912
+#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2067 sql_help.c:2086
+#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342
+#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528
+#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475
+#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492
+msgid "argname"
+msgstr "nom_agrégat"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2388 sql_help.c:2597
+#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440
+#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470
+#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493
+msgid "argtype"
+msgstr "type_argument"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974
+#: sql_help.c:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343
+#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040
+#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742
+#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956
+msgid "option"
+msgstr "option"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433
+#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388
+msgid "where option can be:"
+msgstr "où option peut être :"
+
+#: sql_help.c:116 sql_help.c:2209
+msgid "allowconn"
+msgstr "allowconn"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210
+#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227
+msgid "connlimit"
+msgstr "limite_de_connexion"
+
+#: sql_help.c:118 sql_help.c:2211
+msgid "istemplate"
+msgstr "istemplate"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4187
+msgid "new_tablespace"
+msgstr "nouveau_tablespace"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2398 sql_help.c:2601
+#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675
+msgid "configuration_parameter"
+msgstr "paramètre_configuration"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344
+#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467
+#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626
+#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915
+#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014
+#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676
+#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679
+msgid "value"
+msgstr "valeur"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "rôle_cible"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631
+#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889
+#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338
+#: sql_help.c:4357 sql_help.c:4369
+msgid "schema_name"
+msgstr "nom_schéma"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "grant_ou_revoke_raccourci"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "où abbreviated_grant_or_revoke fait partie de :"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2437 sql_help.c:2438
+#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575
+#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667
+#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232
+#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933
+#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697
+msgid "role_name"
+msgstr "nom_rôle"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352
+#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774
+#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924
+#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981
+#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088
+#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558
+#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608
+#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651
+#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806
+#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864
+#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921
+#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044
+#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102
+#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105
+msgid "expression"
+msgstr "expression"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "contrainte_domaine"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852
+#: sql_help.c:1854 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351
+#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993
+msgid "constraint_name"
+msgstr "nom_contrainte"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "nouvelle_nom_contrainte"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "nouvelle_version"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "objet_membre"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "où objet_membre fait partie de :"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856
+#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860
+#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869
+#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884
+#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894
+#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898
+#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902
+#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4451 sql_help.c:4456
+#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465
+#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477
+#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481
+#: sql_help.c:4482
+msgid "object_name"
+msgstr "nom_objet"
+
+#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454
+msgid "aggregate_name"
+msgstr "nom_agrégat"
+
+#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135
+#: sql_help.c:2137 sql_help.c:3357
+msgid "source_type"
+msgstr "type_source"
+
+#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136
+#: sql_help.c:2138 sql_help.c:3358
+msgid "target_type"
+msgstr "type_cible"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133
+#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549
+#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577
+#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834
+#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072
+#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083
+msgid "function_name"
+msgstr "nom_fonction"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542
+msgid "operator_name"
+msgstr "nom_opérateur"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871
+#: sql_help.c:2519 sql_help.c:3481
+msgid "left_type"
+msgstr "type_argument_gauche"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872
+#: sql_help.c:2520 sql_help.c:3482
+msgid "right_type"
+msgstr "type_argument_droit"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2539
+#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500
+msgid "index_method"
+msgstr "méthode_indexage"
+
+#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467
+msgid "procedure_name"
+msgstr "nom_procédure"
+
+#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473
+msgid "routine_name"
+msgstr "nom_routine"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394
+#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662
+#: sql_help.c:3926 sql_help.c:4375
+msgid "type_name"
+msgstr "nom_type"
+
+#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599
+#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911
+#: sql_help.c:4360
+msgid "lang_name"
+msgstr "nom_langage"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "et signature_agrégat est :"
+
+#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275
+msgid "handler_function"
+msgstr "fonction_gestionnaire"
+
+#: sql_help.c:396 sql_help.c:2276
+msgid "validator_function"
+msgstr "fonction_validateur"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "action"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851
+#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1983 sql_help.c:1984
+#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391
+#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629
+#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887
+#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919
+#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955
+#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978
+#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883
+#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997
+#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089
+#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614
+#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877
+#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924
+#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117
+msgid "column_name"
+msgstr "nom_colonne"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "nouvelle_nom_colonne"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "où action fait partie de :"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2229
+#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888
+#: sql_help.c:3167 sql_help.c:4141
+msgid "data_type"
+msgstr "type_données"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2230 sql_help.c:2329
+#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911
+#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990
+msgid "collation"
+msgstr "collationnement"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339
+#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920
+msgid "column_constraint"
+msgstr "contrainte_colonne"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968
+msgid "integer"
+msgstr "entier"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "option_attribut"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340
+#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921
+msgid "table_constraint"
+msgstr "contrainte_table"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905
+msgid "trigger_name"
+msgstr "nom_trigger"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918
+msgid "parent_table"
+msgstr "table_parent"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2261
+msgid "extension_name"
+msgstr "nom_extension"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395
+msgid "execution_cost"
+msgstr "coût_exécution"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396
+msgid "result_rows"
+msgstr "lignes_de_résultat"
+
+#: sql_help.c:547 sql_help.c:2397
+msgid "support_function"
+msgstr "fonction_support"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2709
+#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881
+#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890
+#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 sql_help.c:3896
+#: sql_help.c:3897 sql_help.c:3899 sql_help.c:3900 sql_help.c:3902
+#: sql_help.c:3903 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918
+#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924
+#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930
+#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335
+#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342
+#: sql_help.c:4343 sql_help.c:4345 sql_help.c:4346 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4351 sql_help.c:4352 sql_help.c:4358
+#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364
+#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370
+#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376
+#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380
+msgid "role_specification"
+msgstr "specification_role"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198
+#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707
+msgid "user_name"
+msgstr "nom_utilisateur"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716
+#: sql_help.c:3932 sql_help.c:4381
+msgid "where role_specification can be:"
+msgstr "où specification_role peut être :"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "nom_groupe"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468
+#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930
+#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923
+#: sql_help.c:4372
+msgid "tablespace_name"
+msgstr "nom_tablespace"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783
+msgid "index_name"
+msgstr "nom_index"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2466 sql_help.c:2500
+#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969
+#: sql_help.c:2996
+msgid "storage_parameter"
+msgstr "paramètre_stockage"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "numéro_colonne"
+
+#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464
+msgid "large_object_oid"
+msgstr "oid_large_object"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889
+msgid "compression_method"
+msgstr "méthode_compression"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "new_access_method"
+
+#: sql_help.c:725 sql_help.c:2523
+msgid "res_proc"
+msgstr "res_proc"
+
+#: sql_help.c:726 sql_help.c:2524
+msgid "join_proc"
+msgstr "join_proc"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2541
+msgid "strategy_number"
+msgstr "numéro_de_stratégie"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2543 sql_help.c:2544
+#: sql_help.c:2547 sql_help.c:2548
+msgid "op_type"
+msgstr "type_op"
+
+#: sql_help.c:782 sql_help.c:2545
+msgid "sort_family_name"
+msgstr "nom_famille_tri"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2546
+msgid "support_number"
+msgstr "numéro_de_support"
+
+#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087
+#: sql_help.c:3089
+msgid "argument_type"
+msgstr "type_argument"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779
+#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891
+#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2324
+#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574
+#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770
+#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917
+#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517
+#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885
+#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334
+#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627
+#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884
+#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060
+#: sql_help.c:5122
+msgid "table_name"
+msgstr "nom_table"
+
+#: sql_help.c:823 sql_help.c:2576
+msgid "using_expression"
+msgstr "expression_using"
+
+#: sql_help.c:824 sql_help.c:2577
+msgid "check_expression"
+msgstr "expression_check"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624
+msgid "publication_object"
+msgstr "objet_publication"
+
+#: sql_help.c:903 sql_help.c:2625
+msgid "publication_parameter"
+msgstr "paramètre_publication"
+
+#: sql_help.c:909 sql_help.c:2627
+msgid "where publication_object is one of:"
+msgstr "où publication_object fait partie de :"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662
+#: sql_help.c:3228
+msgid "password"
+msgstr "mot_de_passe"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663
+#: sql_help.c:3229
+msgid "timestamp"
+msgstr "horodatage"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3892
+#: sql_help.c:4341
+msgid "database_name"
+msgstr "nom_base_de_donnée"
+
+#: sql_help.c:1073 sql_help.c:2732
+msgid "increment"
+msgstr "incrément"
+
+#: sql_help.c:1074 sql_help.c:2733
+msgid "minvalue"
+msgstr "valeur_min"
+
+#: sql_help.c:1075 sql_help.c:2734
+msgid "maxvalue"
+msgstr "valeur_max"
+
+#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664
+#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056
+msgid "start"
+msgstr "début"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "nouveau_début"
+
+#: sql_help.c:1078 sql_help.c:2736
+msgid "cache"
+msgstr "cache"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "nouvelle_cible"
+
+#: sql_help.c:1142 sql_help.c:2789
+msgid "conninfo"
+msgstr "conninfo"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790
+msgid "publication_name"
+msgstr "nom_publication"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "option_publication"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "option_rafraichissement"
+
+#: sql_help.c:1161 sql_help.c:2791
+msgid "subscription_parameter"
+msgstr "paramètre_souscription"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "option_skip"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "nom_partition"
+
+#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922
+msgid "partition_bound_spec"
+msgstr "spec_limite_partition"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936
+msgid "sequence_options"
+msgstr "options_séquence"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "option_séquence"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "contrainte_table_utilisant_index"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "nom_règle_réécriture"
+
+#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961
+msgid "and partition_bound_spec is:"
+msgstr "et partition_bound_spec est :"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354
+#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963
+#: sql_help.c:2964
+msgid "partition_bound_expr"
+msgstr "expr_limite_partition"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358
+#: sql_help.c:2965 sql_help.c:2966
+msgid "numeric_literal"
+msgstr "numeric_literal"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "et contrainte_colonne est :"
+
+#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598
+#: sql_help.c:2934
+msgid "default_expr"
+msgstr "expression_par_défaut"
+
+#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935
+msgid "generation_expr"
+msgstr "expression_génération"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947
+#: sql_help.c:2949 sql_help.c:2953
+msgid "index_parameters"
+msgstr "paramètres_index"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956
+msgid "reftable"
+msgstr "table_référence"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957
+msgid "refcolumn"
+msgstr "colonne_référence"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959
+msgid "referential_action"
+msgstr "action"
+
+#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943
+msgid "and table_constraint is:"
+msgstr "et contrainte_table est :"
+
+#: sql_help.c:1409 sql_help.c:2951
+msgid "exclude_element"
+msgstr "élément_exclusion"
+
+#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662
+#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054
+msgid "operator"
+msgstr "opérateur"
+
+#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954
+msgid "predicate"
+msgstr "prédicat"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "et contrainte_table_utilisant_index est :"
+
+#: sql_help.c:1421 sql_help.c:2967
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "dans les contraintes UNIQUE, PRIMARY KEY et EXCLUDE, les paramètres_index sont :"
+
+#: sql_help.c:1426 sql_help.c:2972
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "élément_exclusion dans une contrainte EXCLUDE est :"
+
+#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912
+#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991
+msgid "opclass"
+msgstr "classe_d_opérateur"
+
+#: sql_help.c:1430 sql_help.c:2976
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "referential_action dans une contrainte FOREIGN KEY/REFERENCES est :"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013
+msgid "tablespace_option"
+msgstr "option_tablespace"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "type_jeton"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "nom_dictionnaire"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "ancien_dictionnaire"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "nouveau_dictionnaire"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3166
+msgid "attribute_name"
+msgstr "nom_attribut"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "nouveau_nom_attribut"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "nouvelle_valeur_enum"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "valeur_enum_voisine"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "valeur_enum_existante"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "propriété"
+
+#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748
+#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947
+#: sql_help.c:4350
+msgid "server_name"
+msgstr "nom_serveur"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261
+msgid "view_option_name"
+msgstr "nom_option_vue"
+
+#: sql_help.c:1698 sql_help.c:3262
+msgid "view_option_value"
+msgstr "valeur_option_vue"
+
+#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958
+msgid "table_and_columns"
+msgstr "table_et_colonnes"
+
+#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745
+#: sql_help.c:4185 sql_help.c:4959
+msgid "where option can be one of:"
+msgstr "où option fait partie de :"
+
+#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977
+#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747
+#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188
+#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963
+#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967
+msgid "boolean"
+msgstr "boolean"
+
+#: sql_help.c:1724 sql_help.c:4969
+msgid "and table_and_columns is:"
+msgstr "et table_et_colonnes est :"
+
+#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749
+msgid "transaction_mode"
+msgstr "mode_transaction"
+
+#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750
+msgid "where transaction_mode is one of:"
+msgstr "où mode_transaction fait partie de :"
+
+#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582
+#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835
+#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064
+#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084
+msgid "argument"
+msgstr "argument"
+
+#: sql_help.c:1850
+msgid "relation_name"
+msgstr "nom_relation"
+
+#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344
+msgid "domain_name"
+msgstr "nom_domaine"
+
+#: sql_help.c:1877
+msgid "policy_name"
+msgstr "nom_politique"
+
+#: sql_help.c:1890
+msgid "rule_name"
+msgstr "nom_règle"
+
+#: sql_help.c:1909 sql_help.c:4483
+msgid "string_literal"
+msgstr "littéral_chaîne"
+
+#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397
+msgid "transaction_id"
+msgstr "id_transaction"
+
+#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017
+msgid "filename"
+msgstr "nom_fichier"
+
+#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688
+#: sql_help.c:2689
+msgid "command"
+msgstr "commande"
+
+#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297
+#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552
+#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809
+#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049
+msgid "condition"
+msgstr "condition"
+
+#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263
+#: sql_help.c:3281 sql_help.c:3982
+msgid "query"
+msgstr "requête"
+
+#: sql_help.c:1976
+msgid "format_name"
+msgstr "nom_format"
+
+#: sql_help.c:1978
+msgid "delimiter_character"
+msgstr "caractère_délimiteur"
+
+#: sql_help.c:1979
+msgid "null_string"
+msgstr "chaîne_null"
+
+#: sql_help.c:1981
+msgid "quote_character"
+msgstr "caractère_guillemet"
+
+#: sql_help.c:1982
+msgid "escape_character"
+msgstr "chaîne_d_échappement"
+
+#: sql_help.c:1986
+msgid "encoding_name"
+msgstr "nom_encodage"
+
+#: sql_help.c:1997
+msgid "access_method_type"
+msgstr "access_method_type"
+
+#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090
+msgid "arg_data_type"
+msgstr "type_données_arg"
+
+#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099
+msgid "sfunc"
+msgstr "sfunc"
+
+#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100
+msgid "state_data_type"
+msgstr "type_de_données_statut"
+
+#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101
+msgid "state_data_size"
+msgstr "taille_de_données_statut"
+
+#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102
+msgid "ffunc"
+msgstr "ffunc"
+
+#: sql_help.c:2073 sql_help.c:2103
+msgid "combinefunc"
+msgstr "combinefunc"
+
+#: sql_help.c:2074 sql_help.c:2104
+msgid "serialfunc"
+msgstr "serialfunc"
+
+#: sql_help.c:2075 sql_help.c:2105
+msgid "deserialfunc"
+msgstr "deserialfunc"
+
+#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106
+msgid "initial_condition"
+msgstr "condition_initiale"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "msfunc"
+msgstr "msfunc"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "minvfunc"
+msgstr "minvfunc"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "mstate_data_type"
+msgstr "m_type_de_données_statut"
+
+#: sql_help.c:2080 sql_help.c:2110
+msgid "mstate_data_size"
+msgstr "m_taille_de_données_statut"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "mffunc"
+msgstr "mffunc"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minitial_condition"
+msgstr "m_condition_initiale"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "sort_operator"
+msgstr "opérateur_de_tri"
+
+#: sql_help.c:2096
+msgid "or the old syntax"
+msgstr "ou l'ancienne syntaxe"
+
+#: sql_help.c:2098
+msgid "base_type"
+msgstr "type_base"
+
+#: sql_help.c:2155 sql_help.c:2202
+msgid "locale"
+msgstr "locale"
+
+#: sql_help.c:2156 sql_help.c:2203
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2157 sql_help.c:2204
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2158 sql_help.c:4450
+msgid "provider"
+msgstr "fournisseur"
+
+#: sql_help.c:2160 sql_help.c:2263
+msgid "version"
+msgstr "version"
+
+#: sql_help.c:2162
+msgid "existing_collation"
+msgstr "collationnement_existant"
+
+#: sql_help.c:2172
+msgid "source_encoding"
+msgstr "encodage_source"
+
+#: sql_help.c:2173
+msgid "dest_encoding"
+msgstr "encodage_destination"
+
+#: sql_help.c:2199 sql_help.c:3039
+msgid "template"
+msgstr "modèle"
+
+#: sql_help.c:2200
+msgid "encoding"
+msgstr "encodage"
+
+#: sql_help.c:2201
+msgid "strategy"
+msgstr "stratégie"
+
+#: sql_help.c:2205
+msgid "icu_locale"
+msgstr "icu_locale"
+
+#: sql_help.c:2206
+msgid "locale_provider"
+msgstr "locale_provider"
+
+#: sql_help.c:2207
+msgid "collation_version"
+msgstr "collation_version"
+
+#: sql_help.c:2212
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2232
+msgid "constraint"
+msgstr "contrainte"
+
+#: sql_help.c:2233
+msgid "where constraint is:"
+msgstr "où la contrainte est :"
+
+#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112
+msgid "event"
+msgstr "événement"
+
+#: sql_help.c:2248
+msgid "filter_variable"
+msgstr "filter_variable"
+
+#: sql_help.c:2249
+msgid "filter_value"
+msgstr "filtre_valeur"
+
+#: sql_help.c:2345 sql_help.c:2931
+msgid "where column_constraint is:"
+msgstr "où contrainte_colonne est :"
+
+#: sql_help.c:2390
+msgid "rettype"
+msgstr "type_en_retour"
+
+#: sql_help.c:2392
+msgid "column_type"
+msgstr "type_colonne"
+
+#: sql_help.c:2401 sql_help.c:2604
+msgid "definition"
+msgstr "définition"
+
+#: sql_help.c:2402 sql_help.c:2605
+msgid "obj_file"
+msgstr "fichier_objet"
+
+#: sql_help.c:2403 sql_help.c:2606
+msgid "link_symbol"
+msgstr "symbole_link"
+
+#: sql_help.c:2404 sql_help.c:2607
+msgid "sql_body"
+msgstr "corps_sql"
+
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913
+#: sql_help.c:2927 sql_help.c:2995
+msgid "method"
+msgstr "méthode"
+
+#: sql_help.c:2463
+msgid "opclass_parameter"
+msgstr "paramètre_opclass"
+
+#: sql_help.c:2480
+msgid "call_handler"
+msgstr "gestionnaire_d_appel"
+
+#: sql_help.c:2481
+msgid "inline_handler"
+msgstr "gestionnaire_en_ligne"
+
+#: sql_help.c:2482
+msgid "valfunction"
+msgstr "fonction_val"
+
+#: sql_help.c:2521
+msgid "com_op"
+msgstr "com_op"
+
+#: sql_help.c:2522
+msgid "neg_op"
+msgstr "neg_op"
+
+#: sql_help.c:2540
+msgid "family_name"
+msgstr "nom_famille"
+
+#: sql_help.c:2551
+msgid "storage_type"
+msgstr "type_stockage"
+
+#: sql_help.c:2690 sql_help.c:3119
+msgid "where event can be one of:"
+msgstr "où événement fait partie de :"
+
+#: sql_help.c:2710 sql_help.c:2712
+msgid "schema_element"
+msgstr "élément_schéma"
+
+#: sql_help.c:2749
+msgid "server_type"
+msgstr "type_serveur"
+
+#: sql_help.c:2750
+msgid "server_version"
+msgstr "version_serveur"
+
+#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347
+msgid "fdw_name"
+msgstr "nom_fdw"
+
+#: sql_help.c:2768 sql_help.c:2771
+msgid "statistics_name"
+msgstr "nom_statistique"
+
+#: sql_help.c:2772
+msgid "statistics_kind"
+msgstr "statistics_kind"
+
+#: sql_help.c:2788
+msgid "subscription_name"
+msgstr "nom_souscription"
+
+#: sql_help.c:2893
+msgid "source_table"
+msgstr "table_source"
+
+#: sql_help.c:2894
+msgid "like_option"
+msgstr "option_like"
+
+#: sql_help.c:2960
+msgid "and like_option is:"
+msgstr "et option_like est :"
+
+#: sql_help.c:3012
+msgid "directory"
+msgstr "répertoire"
+
+#: sql_help.c:3026
+msgid "parser_name"
+msgstr "nom_analyseur"
+
+#: sql_help.c:3027
+msgid "source_config"
+msgstr "configuration_source"
+
+#: sql_help.c:3056
+msgid "start_function"
+msgstr "fonction_start"
+
+#: sql_help.c:3057
+msgid "gettoken_function"
+msgstr "fonction_gettoken"
+
+#: sql_help.c:3058
+msgid "end_function"
+msgstr "fonction_end"
+
+#: sql_help.c:3059
+msgid "lextypes_function"
+msgstr "fonction_lextypes"
+
+#: sql_help.c:3060
+msgid "headline_function"
+msgstr "fonction_headline"
+
+#: sql_help.c:3072
+msgid "init_function"
+msgstr "fonction_init"
+
+#: sql_help.c:3073
+msgid "lexize_function"
+msgstr "fonction_lexize"
+
+#: sql_help.c:3086
+msgid "from_sql_function_name"
+msgstr "nom_fonction_from_sql"
+
+#: sql_help.c:3088
+msgid "to_sql_function_name"
+msgstr "nom_fonction_to_sql"
+
+#: sql_help.c:3114
+msgid "referenced_table_name"
+msgstr "nom_table_référencée"
+
+#: sql_help.c:3115
+msgid "transition_relation_name"
+msgstr "nom_relation_transition"
+
+#: sql_help.c:3118
+msgid "arguments"
+msgstr "arguments"
+
+#: sql_help.c:3170
+msgid "label"
+msgstr "label"
+
+#: sql_help.c:3172
+msgid "subtype"
+msgstr "sous_type"
+
+#: sql_help.c:3173
+msgid "subtype_operator_class"
+msgstr "classe_opérateur_sous_type"
+
+#: sql_help.c:3175
+msgid "canonical_function"
+msgstr "fonction_canonique"
+
+#: sql_help.c:3176
+msgid "subtype_diff_function"
+msgstr "fonction_diff_sous_type"
+
+#: sql_help.c:3177
+msgid "multirange_type_name"
+msgstr "nom_type_multirange"
+
+#: sql_help.c:3179
+msgid "input_function"
+msgstr "fonction_en_sortie"
+
+#: sql_help.c:3180
+msgid "output_function"
+msgstr "fonction_en_sortie"
+
+#: sql_help.c:3181
+msgid "receive_function"
+msgstr "fonction_receive"
+
+#: sql_help.c:3182
+msgid "send_function"
+msgstr "fonction_send"
+
+#: sql_help.c:3183
+msgid "type_modifier_input_function"
+msgstr "fonction_en_entrée_modificateur_type"
+
+#: sql_help.c:3184
+msgid "type_modifier_output_function"
+msgstr "fonction_en_sortie_modificateur_type"
+
+#: sql_help.c:3185
+msgid "analyze_function"
+msgstr "fonction_analyze"
+
+#: sql_help.c:3186
+msgid "subscript_function"
+msgstr "fonction_indice"
+
+#: sql_help.c:3187
+msgid "internallength"
+msgstr "longueur_interne"
+
+#: sql_help.c:3188
+msgid "alignment"
+msgstr "alignement"
+
+#: sql_help.c:3189
+msgid "storage"
+msgstr "stockage"
+
+#: sql_help.c:3190
+msgid "like_type"
+msgstr "type_like"
+
+#: sql_help.c:3191
+msgid "category"
+msgstr "catégorie"
+
+#: sql_help.c:3192
+msgid "preferred"
+msgstr "préféré"
+
+#: sql_help.c:3193
+msgid "default"
+msgstr "par défaut"
+
+#: sql_help.c:3194
+msgid "element"
+msgstr "élément"
+
+#: sql_help.c:3195
+msgid "delimiter"
+msgstr "délimiteur"
+
+#: sql_help.c:3196
+msgid "collatable"
+msgstr "collationnable"
+
+#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547
+#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042
+msgid "with_query"
+msgstr "requête_with"
+
+#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572
+#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591
+#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836
+#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061
+#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078
+#: sql_help.c:5086
+msgid "alias"
+msgstr "alias"
+
+#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603
+#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852
+#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860
+#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090
+#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098
+msgid "from_item"
+msgstr "élément_from"
+
+#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928
+msgid "cursor_name"
+msgstr "nom_curseur"
+
+#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929
+msgid "output_expression"
+msgstr "expression_en_sortie"
+
+#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652
+#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045
+msgid "output_name"
+msgstr "nom_en_sortie"
+
+#: sql_help.c:3316
+msgid "code"
+msgstr "code"
+
+#: sql_help.c:3721
+msgid "parameter"
+msgstr "paramètre"
+
+#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142
+msgid "statement"
+msgstr "instruction"
+
+#: sql_help.c:3778 sql_help.c:4116
+msgid "direction"
+msgstr "direction"
+
+#: sql_help.c:3780 sql_help.c:4118
+msgid "where direction can be one of:"
+msgstr "où direction fait partie de :"
+
+#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784
+#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121
+#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562
+#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819
+#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057
+msgid "count"
+msgstr "nombre"
+
+#: sql_help.c:3888 sql_help.c:4337
+msgid "sequence_name"
+msgstr "nom_séquence"
+
+#: sql_help.c:3906 sql_help.c:4355
+msgid "arg_name"
+msgstr "nom_argument"
+
+#: sql_help.c:3907 sql_help.c:4356
+msgid "arg_type"
+msgstr "type_arg"
+
+#: sql_help.c:3914 sql_help.c:4363
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3945
+msgid "remote_schema"
+msgstr "schema_distant"
+
+#: sql_help.c:3948
+msgid "local_schema"
+msgstr "schéma_local"
+
+#: sql_help.c:3983
+msgid "conflict_target"
+msgstr "cible_conflit"
+
+#: sql_help.c:3984
+msgid "conflict_action"
+msgstr "action_conflit"
+
+#: sql_help.c:3987
+msgid "where conflict_target can be one of:"
+msgstr "où cible_conflit fait partie de :"
+
+#: sql_help.c:3988
+msgid "index_column_name"
+msgstr "index_nom_colonne"
+
+#: sql_help.c:3989
+msgid "index_expression"
+msgstr "index_expression"
+
+#: sql_help.c:3992
+msgid "index_predicate"
+msgstr "index_prédicat"
+
+#: sql_help.c:3994
+msgid "and conflict_action is one of:"
+msgstr "où action_conflit fait partie de :"
+
+#: sql_help.c:4000 sql_help.c:4925
+msgid "sub-SELECT"
+msgstr "sous-SELECT"
+
+#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901
+msgid "channel"
+msgstr "canal"
+
+#: sql_help.c:4031
+msgid "lockmode"
+msgstr "mode_de_verrou"
+
+#: sql_help.c:4032
+msgid "where lockmode is one of:"
+msgstr "où mode_de_verrou fait partie de :"
+
+#: sql_help.c:4068
+msgid "target_table_name"
+msgstr "target_table_name"
+
+#: sql_help.c:4069
+msgid "target_alias"
+msgstr "target_alias"
+
+#: sql_help.c:4070
+msgid "data_source"
+msgstr "data_source"
+
+#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091
+msgid "join_condition"
+msgstr "condition_de_jointure"
+
+#: sql_help.c:4072
+msgid "when_clause"
+msgstr "when_clause"
+
+#: sql_help.c:4073
+msgid "where data_source is:"
+msgstr "où data_source est :"
+
+#: sql_help.c:4074
+msgid "source_table_name"
+msgstr "source_table_name"
+
+#: sql_help.c:4075
+msgid "source_query"
+msgstr "source_query"
+
+#: sql_help.c:4076
+msgid "source_alias"
+msgstr "source_alias"
+
+#: sql_help.c:4077
+msgid "and when_clause is:"
+msgstr "et when_clause est :"
+
+#: sql_help.c:4079
+msgid "merge_update"
+msgstr "merge_delete"
+
+#: sql_help.c:4080
+msgid "merge_delete"
+msgstr "merge_delete"
+
+#: sql_help.c:4082
+msgid "merge_insert"
+msgstr "merge_insert"
+
+#: sql_help.c:4083
+msgid "and merge_insert is:"
+msgstr "et merge_insert est :"
+
+#: sql_help.c:4086
+msgid "and merge_update is:"
+msgstr "et merge_update est :"
+
+#: sql_help.c:4091
+msgid "and merge_delete is:"
+msgstr "et merge_delete est :"
+
+#: sql_help.c:4132
+msgid "payload"
+msgstr "contenu"
+
+#: sql_help.c:4159
+msgid "old_role"
+msgstr "ancien_rôle"
+
+#: sql_help.c:4160
+msgid "new_role"
+msgstr "nouveau_rôle"
+
+#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413
+msgid "savepoint_name"
+msgstr "nom_savepoint"
+
+#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868
+#: sql_help.c:5048 sql_help.c:5106
+msgid "grouping_element"
+msgstr "element_regroupement"
+
+#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050
+msgid "window_name"
+msgstr "nom_window"
+
+#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051
+msgid "window_definition"
+msgstr "définition_window"
+
+#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660
+#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052
+#: sql_help.c:5066 sql_help.c:5110
+msgid "select"
+msgstr "sélection"
+
+#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059
+msgid "where from_item can be one of:"
+msgstr "où élément_from fait partie de :"
+
+#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580
+#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833
+#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068
+#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087
+msgid "column_alias"
+msgstr "alias_colonne"
+
+#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063
+msgid "sampling_method"
+msgstr "méthode_echantillonnage"
+
+#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065
+msgid "seed"
+msgstr "graine"
+
+#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870
+#: sql_help.c:5069 sql_help.c:5108
+msgid "with_query_name"
+msgstr "nom_requête_with"
+
+#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841
+#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082
+#: sql_help.c:5085
+msgid "column_definition"
+msgstr "définition_colonne"
+
+#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857
+#: sql_help.c:5089 sql_help.c:5095
+msgid "join_type"
+msgstr "type_de_jointure"
+
+#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092
+msgid "join_column"
+msgstr "colonne_de_jointure"
+
+#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093
+msgid "join_using_alias"
+msgstr "join_utilisant_alias"
+
+#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099
+msgid "and grouping_element can be one of:"
+msgstr "où element_regroupement fait partie de :"
+
+#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107
+msgid "and with_query is:"
+msgstr "et requête_with est :"
+
+#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111
+msgid "values"
+msgstr "valeurs"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116
+msgid "search_seq_col_name"
+msgstr "nom_colonne_seq_recherche"
+
+#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118
+msgid "cycle_mark_col_name"
+msgstr "nom_colonne_marque_cycle"
+
+#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119
+msgid "cycle_mark_value"
+msgstr "valeur_marque_cycle"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120
+msgid "cycle_mark_default"
+msgstr "défaut_marque_cyle"
+
+#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121
+msgid "cycle_path_col_name"
+msgstr "nom_colonne_chemin_cycle"
+
+#: sql_help.c:4653
+msgid "new_table"
+msgstr "nouvelle_table"
+
+#: sql_help.c:4724
+msgid "snapshot_id"
+msgstr "id_snapshot"
+
+#: sql_help.c:4984
+msgid "sort_expression"
+msgstr "expression_de_tri"
+
+#: sql_help.c:5128 sql_help.c:6112
+msgid "abort the current transaction"
+msgstr "abandonner la transaction en cours"
+
+#: sql_help.c:5134
+msgid "change the definition of an aggregate function"
+msgstr "modifier la définition d'une fonction d'agrégation"
+
+#: sql_help.c:5140
+msgid "change the definition of a collation"
+msgstr "modifier la définition d'un collationnement"
+
+#: sql_help.c:5146
+msgid "change the definition of a conversion"
+msgstr "modifier la définition d'une conversion"
+
+#: sql_help.c:5152
+msgid "change a database"
+msgstr "modifier une base de données"
+
+#: sql_help.c:5158
+msgid "define default access privileges"
+msgstr "définir les droits d'accès par défaut"
+
+#: sql_help.c:5164
+msgid "change the definition of a domain"
+msgstr "modifier la définition d'un domaine"
+
+#: sql_help.c:5170
+msgid "change the definition of an event trigger"
+msgstr "modifier la définition d'un trigger sur évènement"
+
+#: sql_help.c:5176
+msgid "change the definition of an extension"
+msgstr "modifier la définition d'une extension"
+
+#: sql_help.c:5182
+msgid "change the definition of a foreign-data wrapper"
+msgstr "modifier la définition d'un wrapper de données distantes"
+
+#: sql_help.c:5188
+msgid "change the definition of a foreign table"
+msgstr "modifier la définition d'une table distante"
+
+#: sql_help.c:5194
+msgid "change the definition of a function"
+msgstr "modifier la définition d'une fonction"
+
+#: sql_help.c:5200
+msgid "change role name or membership"
+msgstr "modifier le nom d'un groupe ou la liste des ses membres"
+
+#: sql_help.c:5206
+msgid "change the definition of an index"
+msgstr "modifier la définition d'un index"
+
+#: sql_help.c:5212
+msgid "change the definition of a procedural language"
+msgstr "modifier la définition d'un langage procédural"
+
+#: sql_help.c:5218
+msgid "change the definition of a large object"
+msgstr "modifier la définition d'un « Large Object »"
+
+#: sql_help.c:5224
+msgid "change the definition of a materialized view"
+msgstr "modifier la définition d'une vue matérialisée"
+
+#: sql_help.c:5230
+msgid "change the definition of an operator"
+msgstr "modifier la définition d'un opérateur"
+
+#: sql_help.c:5236
+msgid "change the definition of an operator class"
+msgstr "modifier la définition d'une classe d'opérateurs"
+
+#: sql_help.c:5242
+msgid "change the definition of an operator family"
+msgstr "modifier la définition d'une famille d'opérateur"
+
+#: sql_help.c:5248
+msgid "change the definition of a row-level security policy"
+msgstr "modifier la définition d'une politique de sécurité au niveau ligne"
+
+#: sql_help.c:5254
+msgid "change the definition of a procedure"
+msgstr "modifier la définition d'une procédure"
+
+#: sql_help.c:5260
+msgid "change the definition of a publication"
+msgstr "modifier la définition d'une publication"
+
+#: sql_help.c:5266 sql_help.c:5368
+msgid "change a database role"
+msgstr "modifier un rôle"
+
+#: sql_help.c:5272
+msgid "change the definition of a routine"
+msgstr "modifier la définition d'une routine"
+
+#: sql_help.c:5278
+msgid "change the definition of a rule"
+msgstr "modifier la définition d'une règle"
+
+#: sql_help.c:5284
+msgid "change the definition of a schema"
+msgstr "modifier la définition d'un schéma"
+
+#: sql_help.c:5290
+msgid "change the definition of a sequence generator"
+msgstr "modifier la définition d'un générateur de séquence"
+
+#: sql_help.c:5296
+msgid "change the definition of a foreign server"
+msgstr "modifier la définition d'un serveur distant"
+
+#: sql_help.c:5302
+msgid "change the definition of an extended statistics object"
+msgstr "modifier la définition d'un objet de statistiques étendues"
+
+#: sql_help.c:5308
+msgid "change the definition of a subscription"
+msgstr "modifier la définition d'une souscription"
+
+#: sql_help.c:5314
+msgid "change a server configuration parameter"
+msgstr "modifie un paramètre de configuration du serveur"
+
+#: sql_help.c:5320
+msgid "change the definition of a table"
+msgstr "modifier la définition d'une table"
+
+#: sql_help.c:5326
+msgid "change the definition of a tablespace"
+msgstr "modifier la définition d'un tablespace"
+
+#: sql_help.c:5332
+msgid "change the definition of a text search configuration"
+msgstr "modifier la définition d'une configuration de la recherche de texte"
+
+#: sql_help.c:5338
+msgid "change the definition of a text search dictionary"
+msgstr "modifier la définition d'un dictionnaire de la recherche de texte"
+
+#: sql_help.c:5344
+msgid "change the definition of a text search parser"
+msgstr "modifier la définition d'un analyseur de la recherche de texte"
+
+#: sql_help.c:5350
+msgid "change the definition of a text search template"
+msgstr "modifier la définition d'un modèle de la recherche de texte"
+
+#: sql_help.c:5356
+msgid "change the definition of a trigger"
+msgstr "modifier la définition d'un trigger"
+
+#: sql_help.c:5362
+msgid "change the definition of a type"
+msgstr "modifier la définition d'un type"
+
+#: sql_help.c:5374
+msgid "change the definition of a user mapping"
+msgstr "modifier la définition d'une correspondance d'utilisateur"
+
+#: sql_help.c:5380
+msgid "change the definition of a view"
+msgstr "modifier la définition d'une vue"
+
+#: sql_help.c:5386
+msgid "collect statistics about a database"
+msgstr "acquérir des statistiques concernant la base de données"
+
+#: sql_help.c:5392 sql_help.c:6190
+msgid "start a transaction block"
+msgstr "débuter un bloc de transaction"
+
+#: sql_help.c:5398
+msgid "invoke a procedure"
+msgstr "appeler une procédure"
+
+#: sql_help.c:5404
+msgid "force a write-ahead log checkpoint"
+msgstr "forcer un point de vérification des journaux de transactions"
+
+#: sql_help.c:5410
+msgid "close a cursor"
+msgstr "fermer un curseur"
+
+#: sql_help.c:5416
+msgid "cluster a table according to an index"
+msgstr "réorganiser (cluster) une table en fonction d'un index"
+
+#: sql_help.c:5422
+msgid "define or change the comment of an object"
+msgstr "définir ou modifier les commentaires d'un objet"
+
+#: sql_help.c:5428 sql_help.c:5986
+msgid "commit the current transaction"
+msgstr "valider la transaction en cours"
+
+#: sql_help.c:5434
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr ""
+"valider une transaction précédemment préparée pour une validation en deux\n"
+"phases"
+
+#: sql_help.c:5440
+msgid "copy data between a file and a table"
+msgstr "copier des données entre un fichier et une table"
+
+#: sql_help.c:5446
+msgid "define a new access method"
+msgstr "définir une nouvelle méthode d'accès"
+
+#: sql_help.c:5452
+msgid "define a new aggregate function"
+msgstr "définir une nouvelle fonction d'agrégation"
+
+#: sql_help.c:5458
+msgid "define a new cast"
+msgstr "définir un nouveau transtypage"
+
+#: sql_help.c:5464
+msgid "define a new collation"
+msgstr "définir un nouveau collationnement"
+
+#: sql_help.c:5470
+msgid "define a new encoding conversion"
+msgstr "définir une nouvelle conversion d'encodage"
+
+#: sql_help.c:5476
+msgid "create a new database"
+msgstr "créer une nouvelle base de données"
+
+#: sql_help.c:5482
+msgid "define a new domain"
+msgstr "définir un nouveau domaine"
+
+#: sql_help.c:5488
+msgid "define a new event trigger"
+msgstr "définir un nouveau trigger sur évènement"
+
+#: sql_help.c:5494
+msgid "install an extension"
+msgstr "installer une extension"
+
+#: sql_help.c:5500
+msgid "define a new foreign-data wrapper"
+msgstr "définir un nouveau wrapper de données distantes"
+
+#: sql_help.c:5506
+msgid "define a new foreign table"
+msgstr "définir une nouvelle table distante"
+
+#: sql_help.c:5512
+msgid "define a new function"
+msgstr "définir une nouvelle fonction"
+
+#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680
+msgid "define a new database role"
+msgstr "définir un nouveau rôle"
+
+#: sql_help.c:5524
+msgid "define a new index"
+msgstr "définir un nouvel index"
+
+#: sql_help.c:5530
+msgid "define a new procedural language"
+msgstr "définir un nouveau langage de procédures"
+
+#: sql_help.c:5536
+msgid "define a new materialized view"
+msgstr "définir une nouvelle vue matérialisée"
+
+#: sql_help.c:5542
+msgid "define a new operator"
+msgstr "définir un nouvel opérateur"
+
+#: sql_help.c:5548
+msgid "define a new operator class"
+msgstr "définir une nouvelle classe d'opérateur"
+
+#: sql_help.c:5554
+msgid "define a new operator family"
+msgstr "définir une nouvelle famille d'opérateur"
+
+#: sql_help.c:5560
+msgid "define a new row-level security policy for a table"
+msgstr "définir une nouvelle politique de sécurité au niveau ligne pour une table"
+
+#: sql_help.c:5566
+msgid "define a new procedure"
+msgstr "définir une nouvelle procédure"
+
+#: sql_help.c:5572
+msgid "define a new publication"
+msgstr "définir une nouvelle publication"
+
+#: sql_help.c:5584
+msgid "define a new rewrite rule"
+msgstr "définir une nouvelle règle de réécriture"
+
+#: sql_help.c:5590
+msgid "define a new schema"
+msgstr "définir un nouveau schéma"
+
+#: sql_help.c:5596
+msgid "define a new sequence generator"
+msgstr "définir un nouveau générateur de séquence"
+
+#: sql_help.c:5602
+msgid "define a new foreign server"
+msgstr "définir un nouveau serveur distant"
+
+#: sql_help.c:5608
+msgid "define extended statistics"
+msgstr "définir des statistiques étendues"
+
+#: sql_help.c:5614
+msgid "define a new subscription"
+msgstr "définir une nouvelle souscription"
+
+#: sql_help.c:5620
+msgid "define a new table"
+msgstr "définir une nouvelle table"
+
+#: sql_help.c:5626 sql_help.c:6148
+msgid "define a new table from the results of a query"
+msgstr "définir une nouvelle table à partir des résultats d'une requête"
+
+#: sql_help.c:5632
+msgid "define a new tablespace"
+msgstr "définir un nouveau tablespace"
+
+#: sql_help.c:5638
+msgid "define a new text search configuration"
+msgstr "définir une nouvelle configuration de la recherche de texte"
+
+#: sql_help.c:5644
+msgid "define a new text search dictionary"
+msgstr "définir un nouveau dictionnaire de la recherche de texte"
+
+#: sql_help.c:5650
+msgid "define a new text search parser"
+msgstr "définir un nouvel analyseur de la recherche de texte"
+
+#: sql_help.c:5656
+msgid "define a new text search template"
+msgstr "définir un nouveau modèle de la recherche de texte"
+
+#: sql_help.c:5662
+msgid "define a new transform"
+msgstr "définir une nouvelle transformation"
+
+#: sql_help.c:5668
+msgid "define a new trigger"
+msgstr "définir un nouveau trigger"
+
+#: sql_help.c:5674
+msgid "define a new data type"
+msgstr "définir un nouveau type de données"
+
+#: sql_help.c:5686
+msgid "define a new mapping of a user to a foreign server"
+msgstr "définit une nouvelle correspondance d'un utilisateur vers un serveur distant"
+
+#: sql_help.c:5692
+msgid "define a new view"
+msgstr "définir une nouvelle vue"
+
+#: sql_help.c:5698
+msgid "deallocate a prepared statement"
+msgstr "désallouer une instruction préparée"
+
+#: sql_help.c:5704
+msgid "define a cursor"
+msgstr "définir un curseur"
+
+#: sql_help.c:5710
+msgid "delete rows of a table"
+msgstr "supprimer des lignes d'une table"
+
+#: sql_help.c:5716
+msgid "discard session state"
+msgstr "annuler l'état de la session"
+
+#: sql_help.c:5722
+msgid "execute an anonymous code block"
+msgstr "exécute un bloc de code anonyme"
+
+#: sql_help.c:5728
+msgid "remove an access method"
+msgstr "supprimer une méthode d'accès"
+
+#: sql_help.c:5734
+msgid "remove an aggregate function"
+msgstr "supprimer une fonction d'agrégation"
+
+#: sql_help.c:5740
+msgid "remove a cast"
+msgstr "supprimer un transtypage"
+
+#: sql_help.c:5746
+msgid "remove a collation"
+msgstr "supprimer un collationnement"
+
+#: sql_help.c:5752
+msgid "remove a conversion"
+msgstr "supprimer une conversion"
+
+#: sql_help.c:5758
+msgid "remove a database"
+msgstr "supprimer une base de données"
+
+#: sql_help.c:5764
+msgid "remove a domain"
+msgstr "supprimer un domaine"
+
+#: sql_help.c:5770
+msgid "remove an event trigger"
+msgstr "supprimer un trigger sur évènement"
+
+#: sql_help.c:5776
+msgid "remove an extension"
+msgstr "supprimer une extension"
+
+#: sql_help.c:5782
+msgid "remove a foreign-data wrapper"
+msgstr "supprimer un wrapper de données distantes"
+
+#: sql_help.c:5788
+msgid "remove a foreign table"
+msgstr "supprimer une table distante"
+
+#: sql_help.c:5794
+msgid "remove a function"
+msgstr "supprimer une fonction"
+
+#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968
+msgid "remove a database role"
+msgstr "supprimer un rôle de la base de données"
+
+#: sql_help.c:5806
+msgid "remove an index"
+msgstr "supprimer un index"
+
+#: sql_help.c:5812
+msgid "remove a procedural language"
+msgstr "supprimer un langage procédural"
+
+#: sql_help.c:5818
+msgid "remove a materialized view"
+msgstr "supprimer une vue matérialisée"
+
+#: sql_help.c:5824
+msgid "remove an operator"
+msgstr "supprimer un opérateur"
+
+#: sql_help.c:5830
+msgid "remove an operator class"
+msgstr "supprimer une classe d'opérateur"
+
+#: sql_help.c:5836
+msgid "remove an operator family"
+msgstr "supprimer une famille d'opérateur"
+
+#: sql_help.c:5842
+msgid "remove database objects owned by a database role"
+msgstr "supprimer les objets appartenant à un rôle"
+
+#: sql_help.c:5848
+msgid "remove a row-level security policy from a table"
+msgstr "supprimer une politique de sécurité au niveau ligne pour une table"
+
+#: sql_help.c:5854
+msgid "remove a procedure"
+msgstr "supprimer une procédure"
+
+#: sql_help.c:5860
+msgid "remove a publication"
+msgstr "supprimer une publication"
+
+#: sql_help.c:5872
+msgid "remove a routine"
+msgstr "supprimer une routine"
+
+#: sql_help.c:5878
+msgid "remove a rewrite rule"
+msgstr "supprimer une règle de réécriture"
+
+#: sql_help.c:5884
+msgid "remove a schema"
+msgstr "supprimer un schéma"
+
+#: sql_help.c:5890
+msgid "remove a sequence"
+msgstr "supprimer une séquence"
+
+#: sql_help.c:5896
+msgid "remove a foreign server descriptor"
+msgstr "supprimer un descripteur de serveur distant"
+
+#: sql_help.c:5902
+msgid "remove extended statistics"
+msgstr "supprimer des statistiques étendues"
+
+#: sql_help.c:5908
+msgid "remove a subscription"
+msgstr "supprimer une souscription"
+
+#: sql_help.c:5914
+msgid "remove a table"
+msgstr "supprimer une table"
+
+#: sql_help.c:5920
+msgid "remove a tablespace"
+msgstr "supprimer un tablespace"
+
+#: sql_help.c:5926
+msgid "remove a text search configuration"
+msgstr "supprimer une configuration de la recherche de texte"
+
+#: sql_help.c:5932
+msgid "remove a text search dictionary"
+msgstr "supprimer un dictionnaire de la recherche de texte"
+
+#: sql_help.c:5938
+msgid "remove a text search parser"
+msgstr "supprimer un analyseur de la recherche de texte"
+
+#: sql_help.c:5944
+msgid "remove a text search template"
+msgstr "supprimer un modèle de la recherche de texte"
+
+#: sql_help.c:5950
+msgid "remove a transform"
+msgstr "supprimer une transformation"
+
+#: sql_help.c:5956
+msgid "remove a trigger"
+msgstr "supprimer un trigger"
+
+#: sql_help.c:5962
+msgid "remove a data type"
+msgstr "supprimer un type de données"
+
+#: sql_help.c:5974
+msgid "remove a user mapping for a foreign server"
+msgstr "supprime une correspondance utilisateur pour un serveur distant"
+
+#: sql_help.c:5980
+msgid "remove a view"
+msgstr "supprimer une vue"
+
+#: sql_help.c:5992
+msgid "execute a prepared statement"
+msgstr "exécuter une instruction préparée"
+
+#: sql_help.c:5998
+msgid "show the execution plan of a statement"
+msgstr "afficher le plan d'exécution d'une instruction"
+
+#: sql_help.c:6004
+msgid "retrieve rows from a query using a cursor"
+msgstr "extraire certaines lignes d'une requête à l'aide d'un curseur"
+
+#: sql_help.c:6010
+msgid "define access privileges"
+msgstr "définir des privilèges d'accès"
+
+#: sql_help.c:6016
+msgid "import table definitions from a foreign server"
+msgstr "importer la définition d'une table à partir d'un serveur distant"
+
+#: sql_help.c:6022
+msgid "create new rows in a table"
+msgstr "créer de nouvelles lignes dans une table"
+
+#: sql_help.c:6028
+msgid "listen for a notification"
+msgstr "se mettre à l'écoute d'une notification"
+
+#: sql_help.c:6034
+msgid "load a shared library file"
+msgstr "charger un fichier de bibliothèque partagée"
+
+#: sql_help.c:6040
+msgid "lock a table"
+msgstr "verrouiller une table"
+
+#: sql_help.c:6046
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "insère, modifie ou supprime des lignes d'une table de façon conditionnelle"
+
+#: sql_help.c:6052
+msgid "position a cursor"
+msgstr "positionner un curseur"
+
+#: sql_help.c:6058
+msgid "generate a notification"
+msgstr "engendrer une notification"
+
+#: sql_help.c:6064
+msgid "prepare a statement for execution"
+msgstr "préparer une instruction pour exécution"
+
+#: sql_help.c:6070
+msgid "prepare the current transaction for two-phase commit"
+msgstr "préparer la transaction en cours pour une validation en deux phases"
+
+#: sql_help.c:6076
+msgid "change the ownership of database objects owned by a database role"
+msgstr "changer le propriétaire des objets d'un rôle"
+
+#: sql_help.c:6082
+msgid "replace the contents of a materialized view"
+msgstr "remplacer le contenu d'une vue matérialisée"
+
+#: sql_help.c:6088
+msgid "rebuild indexes"
+msgstr "reconstruire des index"
+
+#: sql_help.c:6094
+msgid "destroy a previously defined savepoint"
+msgstr "détruire un point de retournement précédemment défini"
+
+#: sql_help.c:6100
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "réinitialiser un paramètre d'exécution à sa valeur par défaut"
+
+#: sql_help.c:6106
+msgid "remove access privileges"
+msgstr "supprimer des privilèges d'accès"
+
+#: sql_help.c:6118
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr ""
+"annuler une transaction précédemment préparée pour une validation en deux\n"
+"phases"
+
+#: sql_help.c:6124
+msgid "roll back to a savepoint"
+msgstr "annuler jusqu'au point de retournement"
+
+#: sql_help.c:6130
+msgid "define a new savepoint within the current transaction"
+msgstr "définir un nouveau point de retournement pour la transaction en cours"
+
+#: sql_help.c:6136
+msgid "define or change a security label applied to an object"
+msgstr "définir ou modifier un label de sécurité à un objet"
+
+#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232
+msgid "retrieve rows from a table or view"
+msgstr "extraire des lignes d'une table ou d'une vue"
+
+#: sql_help.c:6154
+msgid "change a run-time parameter"
+msgstr "modifier un paramètre d'exécution"
+
+#: sql_help.c:6160
+msgid "set constraint check timing for the current transaction"
+msgstr "définir le moment de la vérification des contraintes pour la transaction en cours"
+
+#: sql_help.c:6166
+msgid "set the current user identifier of the current session"
+msgstr "définir l'identifiant actuel de l'utilisateur de la session courante"
+
+#: sql_help.c:6172
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr ""
+"définir l'identifiant de l'utilisateur de session et l'identifiant actuel de\n"
+"l'utilisateur de la session courante"
+
+#: sql_help.c:6178
+msgid "set the characteristics of the current transaction"
+msgstr "définir les caractéristiques de la transaction en cours"
+
+#: sql_help.c:6184
+msgid "show the value of a run-time parameter"
+msgstr "afficher la valeur d'un paramètre d'exécution"
+
+#: sql_help.c:6202
+msgid "empty a table or set of tables"
+msgstr "vider une table ou un ensemble de tables"
+
+#: sql_help.c:6208
+msgid "stop listening for a notification"
+msgstr "arrêter l'écoute d'une notification"
+
+#: sql_help.c:6214
+msgid "update rows of a table"
+msgstr "actualiser les lignes d'une table"
+
+#: sql_help.c:6220
+msgid "garbage-collect and optionally analyze a database"
+msgstr "compacter et optionnellement analyser une base de données"
+
+#: sql_help.c:6226
+msgid "compute a set of rows"
+msgstr "calculer un ensemble de lignes"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 peut seulement être utilisé dans un mode non interactif"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Saisissez « help » pour l'aide.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "n'a pas pu configurer le paramètre d'impression « %s »"
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "option supplémentaire « %s » ignorée"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "n'a pas pu trouver son propre exécutable"
+
+#: tab-complete.c:5955
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"la complétion de la requête a échoué : %s\n"
+"La requête était :\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "valeur « %s » non reconnue pour « %s » : booléen attendu"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "valeur « %s » invalide pour « %s » : entier attendu"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "nom de variable « %s » invalide"
+
+#: variables.c:419
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"valeur « %s » non reconnue pour « %s »\n"
+"Les valeurs disponibles sont : %s."
+
+#~ msgid " \"%s\""
+#~ msgstr " « %s »"
+
+#~ msgid " \"%s\" IN %s %s"
+#~ msgstr " \"%s\" DANS %s %s"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide, puis quitte\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version affiche la version, puis quitte\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#~ msgid " SERVER_VERSION_NAME server's version (short string)\n"
+#~ msgstr " SERVER_VERSION_NAME version du serveur (chaîne courte)\n"
+
+#~ msgid " VERSION psql's version (verbose string)\n"
+#~ msgstr " VERSION version de psql (chaîne verbeuse)\n"
+
+#~ msgid " VERSION_NAME psql's version (short string)\n"
+#~ msgstr " VERSION_NAME version de psql (chaîne courte)\n"
+
+#~ msgid " VERSION_NUM psql's version (numeric format)\n"
+#~ msgstr " VERSION_NUM version de psql (format numérique)\n"
+
+#~ msgid " \\dFd [PATTERN] list text search dictionaries (add \"+\" for more detail)\n"
+#~ msgstr ""
+#~ " \\dFd [MODÈLE] affiche la liste des dictionnaires de la recherche\n"
+#~ " de texte (ajouter « + » pour plus de détails)\n"
+
+#~ msgid " \\dFp [PATTERN] list text search parsers (add \"+\" for more detail)\n"
+#~ msgstr ""
+#~ " \\dFp [MODÈLE] affiche la liste des analyseurs de la recherche de\n"
+#~ " texte (ajouter « + » pour plus de détails)\n"
+
+#~ msgid " \\dT [PATTERN] list data types (add \"+\" for more detail)\n"
+#~ msgstr ""
+#~ " \\dT [MODÈLE] affiche la liste des types de données (ajouter « + »\n"
+#~ " pour plus de détails)\n"
+
+#~ msgid " \\db [PATTERN] list tablespaces (add \"+\" for more detail)\n"
+#~ msgstr ""
+#~ " \\db [MODÈLE] affiche la liste des tablespaces (ajouter « + » pour\n"
+#~ " plus de détails)\n"
+
+#~ msgid " \\df [PATTERN] list functions (add \"+\" for more detail)\n"
+#~ msgstr ""
+#~ " \\df [MODÈLE] affiche la liste des fonctions (ajouter « + » pour\n"
+#~ " plus de détails)\n"
+
+#~ msgid " \\dn [PATTERN] list schemas (add \"+\" for more detail)\n"
+#~ msgstr ""
+#~ " \\dn [MODÈLE] affiche la liste des schémas (ajouter « + » pour\n"
+#~ " plus de détails)\n"
+
+#~ msgid ""
+#~ " \\d{t|i|s|v|S} [PATTERN] (add \"+\" for more detail)\n"
+#~ " list tables/indexes/sequences/views/system tables\n"
+#~ msgstr ""
+#~ " \\d{t|i|s|v|S} [MODÈLE] (ajouter « + » pour plus de détails)\n"
+#~ " affiche la liste des\n"
+#~ " tables/index/séquences/vues/tables système\n"
+
+#~ msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n"
+#~ msgstr ""
+#~ " \\g [FICHIER] ou ; envoie le tampon de requêtes au serveur (et les\n"
+#~ " résultats au fichier ou |tube)\n"
+
+#~ msgid " \\l list all databases (add \"+\" for more detail)\n"
+#~ msgstr ""
+#~ " \\l affiche la liste des bases de données (ajouter « + »\n"
+#~ " pour plus de détails)\n"
+
+#~ msgid " \\l[+] list all databases\n"
+#~ msgstr " \\l[+] affiche la liste des bases de données\n"
+
+#, c-format
+#~ msgid ""
+#~ " \\lo_export LOBOID FILE\n"
+#~ " \\lo_import FILE [COMMENT]\n"
+#~ " \\lo_list[+]\n"
+#~ " \\lo_unlink LOBOID large object operations\n"
+#~ msgstr ""
+#~ " \\lo_export OIDLOB FICHIER\n"
+#~ " \\lo_import FICHIER [COMMENTAIRE]\n"
+#~ " \\lo_list[+]\n"
+#~ " \\lo_unlink OIDLOB opérations sur les « Large Objects »\n"
+
+#~ msgid " \\z [PATTERN] list table, view, and sequence access privileges (same as \\dp)\n"
+#~ msgstr ""
+#~ " \\z [MODÈLE] affiche la liste des privilèges d'accès aux tables,\n"
+#~ " vues et séquences (identique à \\dp)\n"
+
+#~ msgid " as user \"%s\""
+#~ msgstr " comme utilisateur « %s »"
+
+#~ msgid " at port \"%s\""
+#~ msgstr " sur le port « %s »"
+
+#~ msgid " on host \"%s\""
+#~ msgstr " sur l'hôte « %s »"
+
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#~ msgid "%s: %s\n"
+#~ msgstr "%s : %s\n"
+
+#~ msgid "%s: could not open log file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s » : %s\n"
+
+#~ msgid "%s: could not set variable \"%s\"\n"
+#~ msgstr "%s : n'a pas pu initialiser la variable « %s »\n"
+
+#~ msgid "%s: pg_strdup: cannot duplicate null pointer (internal error)\n"
+#~ msgstr "%s : pg_strdup : ne peut pas dupliquer le pointeur null (erreur interne)\n"
+
+#~ msgid "(1 row)"
+#~ msgid_plural "(%lu rows)"
+#~ msgstr[0] "(1 ligne)"
+#~ msgstr[1] "(%lu lignes)"
+
+#~ msgid "(No rows)\n"
+#~ msgstr "(Aucune ligne)\n"
+
+#~ msgid "+ opt(%d) = |%s|\n"
+#~ msgstr "+ opt(%d) = |%s|\n"
+
+#~ msgid "?%c? \"%s.%s\""
+#~ msgstr "?%c? « %s.%s »"
+
+#~ msgid "Access privileges for database \"%s\""
+#~ msgstr "Droits d'accès pour la base de données « %s »"
+
+#~ msgid "All connection parameters must be supplied because no database connection exists"
+#~ msgstr "Tous les paramètres de connexion doivent être fournis car il n'existe pas de connexion à une base de données"
+
+#~ msgid "Copy, Large Object\n"
+#~ msgstr "Copie, « Large Object »\n"
+
+#~ msgid "Could not send cancel request: %s"
+#~ msgstr "N'a pas pu envoyer la requête d'annulation : %s"
+
+#~ msgid "Disabled triggers:"
+#~ msgstr "Triggers désactivés :"
+
+#~ msgid "Enter new password: "
+#~ msgstr "Saisir le nouveau mot de passe : "
+
+#~ msgid "Exclusion constraints:"
+#~ msgstr "Contraintes d'exclusion :"
+
+#~ msgid "Invalid command \\%s. Try \\? for help.\n"
+#~ msgstr "Commande \\%s invalide. Essayez \\? pour l'aide-mémoire.\n"
+
+#~ msgid "Modifier"
+#~ msgstr "Modificateur"
+
+#~ msgid "Modifiers"
+#~ msgstr "Modificateurs"
+
+#~ msgid "No matching relations found.\n"
+#~ msgstr "Aucune relation correspondante trouvée.\n"
+
+#~ msgid "No matching settings found.\n"
+#~ msgstr "Aucun paramètre correspondant trouvé.\n"
+
+#~ msgid "No per-database role settings support in this server version.\n"
+#~ msgstr "Pas de supprot des paramètres rôle par base de données pour la version de ce serveur.\n"
+
+#~ msgid "No relations found.\n"
+#~ msgstr "Aucune relation trouvée.\n"
+
+#~ msgid "No settings found.\n"
+#~ msgstr "Aucun paramètre trouvé.\n"
+
+#~ msgid "Object Description"
+#~ msgstr "Description d'un objet"
+
+#~ msgid "Password encryption failed.\n"
+#~ msgstr "Échec du chiffrement du mot de passe.\n"
+
+#~ msgid "Procedure"
+#~ msgstr "Procédure"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+#~ msgstr "Rapportez les bogues à <pgsql-bugs@postgresql.org>.\n"
+
+#~ msgid "SSL connection (unknown cipher)\n"
+#~ msgstr "Connexion SSL (chiffrement inconnu)\n"
+
+#~ msgid "Showing locale-adjusted numeric output."
+#~ msgstr "Affichage de la sortie numérique adaptée à la locale."
+
+#~ msgid "Showing only tuples."
+#~ msgstr "Affichage des tuples seuls."
+
+#, c-format
+#~ msgid "Special relation \"%s.%s\""
+#~ msgstr "Relation spéciale « %s.%s »"
+
+#, c-format
+#~ msgid "The server (version %s) does not support altering default privileges."
+#~ msgstr "Le serveur (version %s) ne supporte pas la modification des droits par défaut."
+
+#, c-format
+#~ msgid "The server (version %s) does not support collations."
+#~ msgstr "Le serveur (version %s) ne supporte pas les collationnements."
+
+#, c-format
+#~ msgid "The server (version %s) does not support editing function source."
+#~ msgstr "Le serveur (version %s) ne supporte pas l'édition du code de la fonction."
+
+#, c-format
+#~ msgid "The server (version %s) does not support editing view definitions."
+#~ msgstr "Le serveur (version %s) ne supporte pas l'édition des définitions de vue."
+
+#, c-format
+#~ msgid "The server (version %s) does not support foreign servers."
+#~ msgstr "Le serveur (version %s) ne supporte pas les serveurs distants."
+
+#, c-format
+#~ msgid "The server (version %s) does not support foreign tables."
+#~ msgstr "Le serveur (version %s) ne supporte pas les tables distantes."
+
+#, c-format
+#~ msgid "The server (version %s) does not support foreign-data wrappers."
+#~ msgstr "Le serveur (version %s) ne supporte pas les wrappers de données distantes."
+
+#, c-format
+#~ msgid "The server (version %s) does not support full text search."
+#~ msgstr "Le serveur (version %s) ne supporte pas la recherche plein texte."
+
+#, c-format
+#~ msgid "The server (version %s) does not support per-database role settings."
+#~ msgstr "Le serveur (version %s) ne supporte pas les paramètres de rôles par bases de données."
+
+#, c-format
+#~ msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK."
+#~ msgstr "Le serveur (version %s) ne supporte pas les points de sauvegarde pour ON_ERROR_ROLLBACK."
+
+#, c-format
+#~ msgid "The server (version %s) does not support showing function source."
+#~ msgstr "Le serveur (version %s) ne supporte pas l'affichage du code de la fonction."
+
+#, c-format
+#~ msgid "The server (version %s) does not support showing view definitions."
+#~ msgstr "Le serveur (version %s) ne supporte pas l'affichage des définitions de vues."
+
+#, c-format
+#~ msgid "The server (version %s) does not support tablespaces."
+#~ msgstr "Le serveur (version %s) ne supporte pas les tablespaces."
+
+#, c-format
+#~ msgid "The server (version %s) does not support user mappings."
+#~ msgstr "Le serveur (version %s) ne supporte pas les correspondances d'utilisateurs."
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#~ msgid ""
+#~ "WARNING: You are connected to a server with major version %d.%d,\n"
+#~ "but your %s client is major version %d.%d. Some backslash commands,\n"
+#~ "such as \\d, might not work properly.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ATTENTION : vous êtes connecté sur un serveur dont la version majeure est\n"
+#~ "%d.%d alors que votre client %s est en version majeure %d.%d. Certaines\n"
+#~ "commandes avec antislashs, comme \\d, peuvent ne pas fonctionner\n"
+#~ "correctement.\n"
+#~ "\n"
+
+#~ msgid "Watch every %lds\t%s"
+#~ msgstr "Vérifier chaque %lds\t%s"
+
+#~ msgid ""
+#~ "Welcome to %s %s (server %s), the PostgreSQL interactive terminal.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Bienvenue dans %s %s (serveur %s), l'interface interactive de PostgreSQL.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Welcome to %s %s, the PostgreSQL interactive terminal.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Bienvenue dans %s %s, l'interface interactive de PostgreSQL.\n"
+#~ "\n"
+
+#~ msgid "\\%s: error\n"
+#~ msgstr "\\%s : erreur\n"
+
+#~ msgid "\\%s: error while setting variable\n"
+#~ msgstr "\\%s : erreur lors de l'initialisation de la variable\n"
+
+#~ msgid "\\copy: %s"
+#~ msgstr "\\copy : %s"
+
+#~ msgid "\\copy: unexpected response (%d)\n"
+#~ msgstr "\\copy : réponse inattendue (%d)\n"
+
+#, c-format
+#~ msgid "\\watch cannot be used with COPY"
+#~ msgstr "\\watch ne peut pas être utilisé avec COPY"
+
+#~ msgid "agg_name"
+#~ msgstr "nom_d_agrégat"
+
+#~ msgid "agg_type"
+#~ msgstr "type_aggrégat"
+
+#~ msgid "attribute"
+#~ msgstr "attribut"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "le processus fils a été terminé par le signal %d"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "le processus fils a été terminé par le signal %s"
+
+#~ msgid "collate %s"
+#~ msgstr "collationnement %s"
+
+#~ msgid "collation_name"
+#~ msgstr "nom_collation"
+
+#~ msgid "column"
+#~ msgstr "colonne"
+
+#~ msgid "contains support for command-line editing"
+#~ msgstr "contient une gestion avancée de la ligne de commande"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "n'a pas pu accéder au répertoire « %s »"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "n'a pas pu changer le répertoire par « %s » : %s"
+
+#~ msgid "could not close pipe to external command: %s\n"
+#~ msgstr "n'a pas pu fermer le fichier pipe vers la commande externe : %s\n"
+
+#~ msgid "could not connect to server: %s"
+#~ msgstr "n'a pas pu se connecter au serveur : %s"
+
+#~ msgid "could not execute command \"%s\": %s\n"
+#~ msgstr "n'a pas pu exécuter la commande « %s » : %s\n"
+
+#~ msgid "could not get current user name: %s\n"
+#~ msgstr "n'a pas pu obtenir le nom d'utilisateur courant : %s\n"
+
+#~ msgid "could not identify current directory: %s"
+#~ msgstr "n'a pas pu identifier le répertoire courant : %s"
+
+#~ msgid "could not open temporary file \"%s\": %s\n"
+#~ msgstr "n'a pas pu ouvrir le fichier temporaire « %s » : %s\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "n'a pas pu lire le lien symbolique « %s »"
+
+#~ msgid "could not set variable \"%s\"\n"
+#~ msgstr "n'a pas pu initialiser la variable « %s »\n"
+
+#~ msgid "could not stat file \"%s\": %s\n"
+#~ msgstr "n'a pas pu tester le fichier « %s » : %s\n"
+
+#~ msgid "data type"
+#~ msgstr "type de données"
+
+#~ msgid "default %s"
+#~ msgstr "Par défaut, %s"
+
+#~ msgid "define a new constraint trigger"
+#~ msgstr "définir une nouvelle contrainte de déclenchement"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#~ msgid "from_list"
+#~ msgstr "liste_from"
+
+#~ msgid "input_data_type"
+#~ msgstr "type_de_données_en_entrée"
+
+#~ msgid "lock a named relation (table, etc)"
+#~ msgstr "verrouille une relation nommée (table, etc)"
+
+#~ msgid "match"
+#~ msgstr "match"
+
+#~ msgid "new_column"
+#~ msgstr "nouvelle_colonne"
+
+#~ msgid "normal"
+#~ msgstr "normal"
+
+#~ msgid "not null"
+#~ msgstr "non NULL"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "échec de pclose : %m"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "échec de pclose : %s"
+
+#~ msgid "rolename"
+#~ msgstr "nom_rôle"
+
+#~ msgid "serialtype"
+#~ msgstr "serialtype"
+
+#~ msgid "special"
+#~ msgstr "spécial"
+
+#~ msgid "statistic_type"
+#~ msgstr "type_statistique"
+
+#~ msgid "tablespace"
+#~ msgstr "tablespace"
+
+#~ msgid "text"
+#~ msgstr "texte"
+
+#~ msgid "timezone"
+#~ msgstr "fuseau_horaire"
+
+#, c-format
+#~ msgid "unexpected result status for \\watch"
+#~ msgstr "statut résultat inattendu pour \\watch"
+
+#~ msgid "unterminated quoted string\n"
+#~ msgstr "chaîne entre guillemets non terminée\n"
+
+#~ msgid "where direction can be empty or one of:"
+#~ msgstr "où direction peut être vide ou faire partie de :"
diff --git a/src/bin/psql/po/it.po b/src/bin/psql/po/it.po
new file mode 100644
index 0000000..f458cc8
--- /dev/null
+++ b/src/bin/psql/po/it.po
@@ -0,0 +1,6647 @@
+#
+# psql.po
+# Italian message translation file for psql
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+# Copyright (C) 2010, Associazione Culturale ITPUG
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017.
+# Cosimo D'Arcangelo <cosimo.darcangelo@itpug.org>
+# Massimo Mangoni <massimo.mangoni@phoops.it>
+# Mirko Tebaldi <mirkotebaldi@yahoo.it>
+# Gabriele Bartolini <gabriele.bartolini@2ndquadrant.it>
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:16+0000\n"
+"PO-Revision-Date: 2022-09-26 15:03+0200\n"
+"Last-Translator: Daniele Varrazzo <daniele.varrazzo@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "identificazione della directory corrente fallita: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binario non valido \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "lettura del binario \"%s\" fallita"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "programma \"%s\" da eseguire non trovato"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "spostamento nella directory \"%s\" fallito: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "lettura del link simbolico \"%s\" fallita: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() non riuscito: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: command.c:1320 command.c:3316 command.c:3365 command.c:3489 input.c:227
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "memoria esaurita"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "impossibile duplicare il puntatore nullo (errore interno)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "impossibile cercare l'ID utente effettivo %ld: %s"
+
+#: ../../common/username.c:45 command.c:576
+msgid "user does not exist"
+msgstr "l'utente non esiste"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "ricerca del nome utente fallita: codice di errore %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "comando non eseguibile"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "comando non trovato"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "processo figlio uscito con codice di uscita %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "processo figlio terminato da eccezione 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "processo figlio terminato da segnale %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "processo figlio uscito con stato non riconosciuto %d"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Richiesta di annullamento inviata\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Impossibile inviare la richiesta di annullamento: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu riga)"
+msgstr[1] "(%lu righe)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Interrotto\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Non è possibile aggiungere l'intestazione al contenuto della tabella: il numero di colonne %d è stato superato.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Non è possibile aggiungere celle al contenuto della tabella: il numero totale di celle %d è stato superato.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "il formato di output non è valido (errore interno): %d"
+
+#: ../../fe_utils/psqlscan.l:702
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "saltare l'espansione ricorsiva della variabile \"%s\""
+
+#: ../../port/thread.c:100 ../../port/thread.c:136
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "impossibile cercare l'ID utente locale %d: %s"
+
+#: ../../port/thread.c:105 ../../port/thread.c:141
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "l'utente locale con ID %d non esiste"
+
+#: command.c:233
+#, c-format
+msgid "invalid command \\%s"
+msgstr "comando errato \\%s"
+
+#: command.c:235
+#, c-format
+msgid "Try \\? for help."
+msgstr "Usa \\? per avere un aiuto."
+
+#: command.c:253
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: parametro in eccesso \"%s\" ignorato"
+
+#: command.c:305
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "comando \\%s ignorato; usa \\endif o Ctrl-C per uscire dal blocco \\if corrente"
+
+#: command.c:574
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "directory home non trovata per l'ID utente %ld: %s"
+
+#: command.c:593
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: spostamento della directory a \"%s\" fallito: %m"
+
+#: command.c:618
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "Al momento non sei connesso ad un database.\n"
+
+#: command.c:628
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Sei collegato al database \"%s\" con nome utente \"%s\" sull'host \"%s\" porta \"%s\".\n"
+
+#: command.c:631
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Sei collegato al database \"%s\" con nome utente \"%s\" tramite il socket in \"%s\" porta \"%s\".\n"
+
+#: command.c:637
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Sei collegato al database \"%s\" con nome utente \"%s\" sull'host \"%s\" (indirizzo \"%s\") sulla porta \"%s\".\n"
+
+#: command.c:640
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Sei collegato al database \"%s\" con nome utente \"%s\" sull'host \"%s\" porta \"%s\".\n"
+
+#: command.c:1031 command.c:1126 command.c:2660
+#, c-format
+msgid "no query buffer"
+msgstr "nessun buffer query"
+
+#: command.c:1064 command.c:5497
+#, c-format
+msgid "invalid line number: %s"
+msgstr "numero di riga non valido: \"%s\""
+
+#: command.c:1202
+msgid "No changes"
+msgstr "Nessuna modifica"
+
+#: command.c:1281
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: nome codifica errato oppure non esiste una procedura di conversione"
+
+#: command.c:1316 command.c:2119 command.c:3312 command.c:3511 command.c:5599
+#: common.c:177 common.c:226 common.c:395 common.c:1137 common.c:1155
+#: common.c:1229 common.c:1336 common.c:1374 common.c:1459 common.c:1495
+#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1323
+msgid "There is no previous error."
+msgstr "Non c'è un errore precedente."
+
+#: command.c:1436
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: parentesi a destra mancanti"
+
+#: command.c:1520 command.c:1650 command.c:1955 command.c:1969 command.c:1988
+#: command.c:2172 command.c:2414 command.c:2627 command.c:2667
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: parametro richiesto mancante"
+
+#: command.c:1781
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: non può apparire dopo \\else"
+
+#: command.c:1786
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: \\if corrispondente non trovato"
+
+#: command.c:1850
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: non può apparire dopo \\else"
+
+#: command.c:1855
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: \\if corrispondente non trovato"
+
+#: command.c:1895
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: \\if corrispondente non trovato"
+
+#: command.c:2052
+msgid "Query buffer is empty."
+msgstr "Il buffer query è vuoto."
+
+#: command.c:2095
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Inserisci la password per l'utente \"%s\": "
+
+#: command.c:2099
+msgid "Enter it again: "
+msgstr "Conferma password: "
+
+#: command.c:2108
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Le password non corrispondono."
+
+#: command.c:2207
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: errore nella lettura del valore della variabile"
+
+#: command.c:2310
+msgid "Query buffer reset (cleared)."
+msgstr "Buffer query resettato (svuotato)."
+
+#: command.c:2332
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "Storia scritta nel file \"%s\".\n"
+
+#: command.c:2419
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: il nome della variabile d'ambiente non deve contenere \"=\""
+
+#: command.c:2467
+#, c-format
+msgid "function name is required"
+msgstr "il nome della funzione è richiesto"
+
+#: command.c:2469
+#, c-format
+msgid "view name is required"
+msgstr "il nome della vista è richiesto"
+
+#: command.c:2599
+msgid "Timing is on."
+msgstr "Controllo tempo attivato."
+
+#: command.c:2601
+msgid "Timing is off."
+msgstr "Controllo tempo disattivato."
+
+#: command.c:2686 command.c:2714 command.c:3952 command.c:3955 command.c:3958
+#: command.c:3964 command.c:3966 command.c:3992 command.c:4002 command.c:4014
+#: command.c:4028 command.c:4055 command.c:4113 common.c:73 copy.c:331
+#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:3113 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Password: "
+
+#: command.c:3118 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Inserisci la password per l'utente %s: "
+
+#: command.c:3174
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "Non fornire utente, host o porta separatamente quando si utilizza una stringa di connessione"
+
+#: command.c:3209
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "Non esiste alcuna connessione al database da cui riutilizzare i parametri"
+
+#: command.c:3517
+#, c-format
+msgid "Previous connection kept"
+msgstr "Connessione precedente mantenuta"
+
+#: command.c:3523
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3579
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Adesso sei collegato al database \"%s\" con nome utente \"%s\" sull'indirizzo \"%s\" porta \"%s\".\n"
+
+#: command.c:3582
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Adesso sei collegato al database \"%s\" con nome utente \"%s\" tramite socket \"%s\" porta \"%s\".\n"
+
+#: command.c:3588
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Adesso sei collegato al database \"%s\" con nome utente \"%s\" sull'host \"%s\" (indiirizzo \"%s\") sulla porta \"%s\".\n"
+
+#: command.c:3591
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Adesso sei collegato al database \"%s\" con nome utente \"%s\" sull'host \"%s\" porta \"%s\".\n"
+
+#: command.c:3596
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Sei collegato al database \"%s\" con nome utente \"%s\".\n"
+
+#: command.c:3636
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, server %s)\n"
+
+#: command.c:3649
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"ATTENZIONE: versione maggiore %s %s, versione maggiore server %s.\n"
+" Alcune caratteristiche di psql potrebbero non funzionare.\n"
+
+#: command.c:3686
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "connessione SSL (protocollo: %s, cifrario: %s, compressione: %s)\n"
+
+#: command.c:3687 command.c:3688
+msgid "unknown"
+msgstr "sconosciuto"
+
+#: command.c:3689 help.c:42
+msgid "off"
+msgstr "disattivato"
+
+#: command.c:3689 help.c:42
+msgid "on"
+msgstr "attivato"
+
+#: command.c:3703
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "Connessione crittografata GSSAPI\n"
+
+#: command.c:3723
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"ATTENZIONE: Il code page della console (%u) differisce dal code page\n"
+" di Windows (%u). I caratteri a 8-bit potrebbero non\n"
+" funzionare correttamente. Vedi le pagine di riferimento\n"
+" psql \"Note per utenti Windows\" per i dettagli.\n"
+
+#: command.c:3828
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "la variabile di ambiente PSQL_EDITOR_LINENUMBER_ARG deve specificare un numero di riga"
+
+#: command.c:3857
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "avvio dell'editor \"%s\" fallito"
+
+#: command.c:3859
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "avvio di /bin/sh fallito"
+
+#: command.c:3909
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "directory temporanea non trovata: %s"
+
+#: command.c:3936
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "errore nell'apertura del file temporaneo \"%s\": %m"
+
+#: command.c:4272
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: l'abbreviazione ambigua \"%s\" corrisponde sia a \"%s\" che a \"%s\""
+
+#: command.c:4292
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: i formati consentiti sono unaligned, aligned, wrapped, html, asciidoc, latex, latex-longtable, troff-ms"
+
+#: command.c:4311
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: gli stili di linea permessi sono ascii, old-ascii, unicode"
+
+#: command.c:4326
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: gli stili riga Unicode dei bordi consentiti sono single, double"
+
+#: command.c:4341
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: gli stili riga Unicode delle colonne consentiti sono single, double"
+
+#: command.c:4356
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: gli stili riga Unicode delle intestazioni consentiti sono single, double"
+
+#: command.c:4399
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep deve essere un singolo carattere di un byte"
+
+#: command.c:4404
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep non può essere un apice, una nuova riga o un ritorno a capo"
+
+#: command.c:4541 command.c:4729
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: opzione sconosciuta: %s"
+
+#: command.c:4561
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Lo stile del bordo è %d.\n"
+
+#: command.c:4567
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "La lunghezza di destinazione non è impostata.\n"
+
+#: command.c:4569
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "La larghezza di destinazione è %d.\n"
+
+#: command.c:4576
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "La visualizzazione espansa è attiva.\n"
+
+#: command.c:4578
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "La visualizzazione espansa è usata automaticamente.\n"
+
+#: command.c:4580
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "La visualizzazione espansa è disattivata.\n"
+
+#: command.c:4586
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "Il separatore di campo per i CSV è \"%s\".\n"
+
+#: command.c:4594 command.c:4602
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "Il separatore di campo è il byte zero.\n"
+
+#: command.c:4596
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "Il separatore di campo è \"%s\".\n"
+
+#: command.c:4609
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Il piè di pagina di default è attivo.\n"
+
+#: command.c:4611
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Il piè di pagina di default è disattivato.\n"
+
+#: command.c:4617
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Il formato di output è %s.\n"
+
+#: command.c:4623
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Lo stile della linea è %s.\n"
+
+#: command.c:4630
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "La visualizzazione dei null è \"%s\".\n"
+
+#: command.c:4638
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "La correzione dell'output numerico secondo il locale è attiva.\n"
+
+#: command.c:4640
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "La correzione dell'output numerico secondo il locale è disattivata.\n"
+
+#: command.c:4647
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "Usa la paginazione per risultati estesi.\n"
+
+#: command.c:4649
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "Paginazione sempre attiva.\n"
+
+#: command.c:4651
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "Paginazione disattivata.\n"
+
+#: command.c:4657
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "La paginazione non verrà usata per meno di %d riga.\n"
+msgstr[1] "La paginazione non verrà usata per meno di %d righe.\n"
+
+#: command.c:4667 command.c:4677
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "Il separatore di record è il byte zero.\n"
+
+#: command.c:4669
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "Il separatore di record è <a capo>.\n"
+
+#: command.c:4671
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "Il separatore di record è \"%s\".\n"
+
+#: command.c:4684
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Gli attributi di tabella sono \"%s\".\n"
+
+#: command.c:4687
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Gli attributi di tabella non sono specificati.\n"
+
+#: command.c:4694
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Il titolo è \"%s\".\n"
+
+#: command.c:4696
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Il titolo non è assegnato.\n"
+
+#: command.c:4703
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "La visualizzazione dei soli dati è attiva.\n"
+
+#: command.c:4705
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "La visualizzazione dei soli dati è disattivata.\n"
+
+#: command.c:4711
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Lo stile riga Unicode dei bordi è \"%s\".\n"
+
+#: command.c:4717
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Lo stile riga Unicode delle colonne è \"%s\".\n"
+
+#: command.c:4723
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Lo stile riga Unicode delle intestazioni è \"%s\".\n"
+
+#: command.c:4956
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: fallita"
+
+#: command.c:4990
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch non può essere usato con una query vuota"
+
+#: command.c:5022
+#, c-format
+msgid "could not set timer: %m"
+msgstr "redirezione di stderr fallita: %m"
+
+#: command.c:5084
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (ogni %gs)\n"
+
+#: command.c:5087
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (ogni %gs)\n"
+
+#: command.c:5148
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "impossibile attendere i segnali: %m"
+
+#: command.c:5206 command.c:5213 common.c:568 common.c:575 common.c:1118
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5392
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" non è una vista"
+
+#: command.c:5408
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "interpretazione dell'array reloptions fallita"
+
+#: common.c:162
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "non è possibile effettuare l'escape senza una connessione attiva"
+
+#: common.c:203
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "l'argomento del comando da shell contiene un caratteri newline o un ritorno a capo: \"%s\""
+
+#: common.c:307
+#, c-format
+msgid "connection to server was lost"
+msgstr "connessione al server persa"
+
+#: common.c:311
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "Connessione al server persa. Tentativo di reset: "
+
+#: common.c:316
+#, c-format
+msgid "Failed.\n"
+msgstr "Fallito.\n"
+
+#: common.c:333
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Riuscito.\n"
+
+#: common.c:385 common.c:1054
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "rilevato PQresultStatus imprevisto: %d"
+
+#: common.c:507
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Tempo: %.3f ms\n"
+
+#: common.c:522
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Tempo: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:531
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Tempo: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:538
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Tempo: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:562 common.c:619 common.c:1089 describe.c:6135
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Al momento non sei connesso ad un database."
+
+#: common.c:650
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "Notifica asincrona \"%s\" con payload \"%s\" ricevuta dal processo server con PID %d.\n"
+
+#: common.c:653
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "Notifica asincrona \"%s\" ricevuta dal processo server con PID %d.\n"
+
+#: common.c:686 common.c:705
+#, c-format
+msgid "could not print result table: %m"
+msgstr "impossibile stampare la tabella dei risultati: %m"
+
+#: common.c:726
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "nessuna riga restituita per \\gset"
+
+#: common.c:731
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "più di una riga restituita per \\gset"
+
+#: common.c:749
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "tentativo di \\gset nella variabile \"%s\" trattata in modo speciale ignorato"
+
+#: common.c:1098
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Modalità passo singolo: verifica comando)***********************************\n"
+"%s\n"
+"***(premi invio per procedere oppure digita x ed invio per annullare)***********\n"
+
+#: common.c:1181
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "COMANDO: %s"
+
+#: common.c:1217
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "stato della transazione imprevisto (%d)"
+
+#: common.c:1358 describe.c:2020
+msgid "Column"
+msgstr "Colonna"
+
+#: common.c:1359 describe.c:170 describe.c:358 describe.c:376 describe.c:1037
+#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021
+#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504
+#: describe.c:5767
+msgid "Type"
+msgstr "Tipo"
+
+#: common.c:1408
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "Il comando non ha prodotto risultati, o il risultato non ha colonne.\n"
+
+#: common.c:1561
+#, c-format
+msgid "\\watch cannot be used with COPY"
+msgstr "\\watch non può essere usato con COPY"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: parametri richiesti"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: errore di sintassi a \"%s\""
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: errore di sintassi a fine riga"
+
+#: copy.c:328
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "esecuzione del comando \"%s\" fallita: %m"
+
+#: copy.c:344
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file \"%s\": %m"
+
+#: copy.c:348
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: non è possibile copiare da/a una directory"
+
+#: copy.c:385
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "chiusura della pipe per verso il comando esterno fallita: %m"
+
+#: copy.c:390
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: copy.c:453 copy.c:463
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "scrittura dei dati COPY fallita: %m"
+
+#: copy.c:469
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "trasferimento dei dati COPY fallito: %s"
+
+#: copy.c:530
+msgid "canceled by user"
+msgstr "annullata dall'utente"
+
+#: copy.c:541
+msgid ""
+"Enter data to be copied followed by a newline.\n"
+"End with a backslash and a period on a line by itself, or an EOF signal."
+msgstr ""
+"Inserire i dati da copiare seguiti da un \"a capo\".\n"
+"Terminare con un backslash ed un punto su una singola riga, o un segnale EOF."
+
+#: copy.c:684
+msgid "aborted because of read failure"
+msgstr "interrotto a causa di lettura non riuscita"
+
+#: copy.c:718
+msgid "trying to exit copy mode"
+msgstr "tentativo di uscita dalla modalità copy"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: l'istruzione non ha restituito dati"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: la query deve restituire almeno tre colonne"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: le intestazioni verticali ed orizzontali devono essere in colonne diverse"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: la colonna dei dati deve essere specificata quando la query restituisce più di tre colonne"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: numero massimo di colonne (%d) superato"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: i risultati della query contengono più di un valore per la riga \"%s\", colonna \"%s\""
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: il numero di colonna %d è al di fuori dell'intervallo 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: nome di colonna ambiguo: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: colonna non trovata: \"%s\""
+
+#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029
+#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090
+#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866
+#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420
+#: describe.c:5477 describe.c:5881 describe.c:5959
+msgid "Schema"
+msgstr "Schema"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636
+#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258
+#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341
+#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867
+#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410
+#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748
+#: describe.c:5957 describe.c:6186 describe.c:6494
+msgid "Name"
+msgstr "Nome"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "Tipo dato del risultato"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "Tipo dato dei parametri"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423
+#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041
+#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280
+#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777
+#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248
+#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422
+#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895
+#: describe.c:5960 describe.c:6992
+msgid "Description"
+msgstr "Descrizione"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "Lista delle funzione aggregate"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "Il server (versione %s) non supporta metodi di accesso."
+
+#: describe.c:168
+msgid "Index"
+msgstr "Indice"
+
+#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882
+msgid "Table"
+msgstr "Tabella"
+
+#: describe.c:177 describe.c:5679
+msgid "Handler"
+msgstr "Handler"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "Lista dei metodi di accesso"
+
+#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181
+#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588
+#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187
+#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718
+#: describe.c:6980
+msgid "Owner"
+msgstr "Proprietario"
+
+#: describe.c:231
+msgid "Location"
+msgstr "Posizione"
+
+#: describe.c:241 describe.c:3509
+msgid "Options"
+msgstr "Opzioni"
+
+#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934
+msgid "Size"
+msgstr "Dimensione"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "Lista dei tablespace"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df accetta come opzioni solo [anptwS+]"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df non accetta un'opzione \"%c\" con il server in versione %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "aggr"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "finestra"
+
+#: describe.c:356
+msgid "proc"
+msgstr "procedura"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "funzione"
+
+#: describe.c:374 describe.c:1390
+msgid "trigger"
+msgstr "trigger"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "immutabile"
+
+#: describe.c:387
+msgid "stable"
+msgstr "stabile"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "volatile"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "Volatilità"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "ristretta"
+
+#: describe.c:398
+msgid "safe"
+msgstr "sicura"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "non sicura"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "Parallela"
+
+#: describe.c:405
+msgid "definer"
+msgstr "definitore"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "invocatore"
+
+#: describe.c:407
+msgid "Security"
+msgstr "Sicurezza"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Linguaggio"
+
+#: describe.c:416 describe.c:420
+msgid "Source code"
+msgstr "Codice sorgente"
+
+#: describe.c:594
+msgid "List of functions"
+msgstr "Lista delle funzioni"
+
+#: describe.c:657
+msgid "Internal name"
+msgstr "Nome interno"
+
+#: describe.c:659
+msgid "Elements"
+msgstr "Elementi"
+
+#: describe.c:711
+msgid "List of data types"
+msgstr "Lista dei tipi di dati"
+
+#: describe.c:814
+msgid "Left arg type"
+msgstr "Argomento sinistro"
+
+#: describe.c:815
+msgid "Right arg type"
+msgstr "Argomento destro"
+
+#: describe.c:816
+msgid "Result type"
+msgstr "Tipo di risultato"
+
+#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247
+#: describe.c:6909 describe.c:6913
+msgid "Function"
+msgstr "Funzione"
+
+#: describe.c:902
+msgid "List of operators"
+msgstr "Lista degli operatori"
+
+#: describe.c:938
+msgid "Encoding"
+msgstr "Codifica"
+
+#: describe.c:939 describe.c:4868
+msgid "Collate"
+msgstr "Ordinamento"
+
+#: describe.c:940 describe.c:4869
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878
+msgid "ICU Locale"
+msgstr "ICU Locale"
+
+#: describe.c:946 describe.c:952
+msgid "Locale Provider"
+msgstr "Provider di localizzazione"
+
+#: describe.c:964
+msgid "Tablespace"
+msgstr "Tablespace"
+
+#: describe.c:990
+msgid "List of databases"
+msgstr "Lista dei database"
+
+#: describe.c:1031 describe.c:1184 describe.c:3882
+msgid "table"
+msgstr "tabella"
+
+#: describe.c:1032 describe.c:3883
+msgid "view"
+msgstr "vista"
+
+#: describe.c:1033 describe.c:3884
+msgid "materialized view"
+msgstr "vista materializzata"
+
+#: describe.c:1034 describe.c:1186 describe.c:3886
+msgid "sequence"
+msgstr "sequenza"
+
+#: describe.c:1035 describe.c:3888
+msgid "foreign table"
+msgstr "tabella esterna"
+
+#: describe.c:1036 describe.c:3889 describe.c:4101
+msgid "partitioned table"
+msgstr "tabella partizionata"
+
+#: describe.c:1047
+msgid "Column privileges"
+msgstr "Privilegi di colonna"
+
+#: describe.c:1078 describe.c:1112
+msgid "Policies"
+msgstr "Regole di sicurezza"
+
+#: describe.c:1143 describe.c:4510 describe.c:6577
+msgid "Access privileges"
+msgstr "Privilegi di accesso"
+
+#: describe.c:1188
+msgid "function"
+msgstr "funzione"
+
+#: describe.c:1190
+msgid "type"
+msgstr "tipo"
+
+#: describe.c:1192
+msgid "schema"
+msgstr "schema"
+
+#: describe.c:1215
+msgid "Default access privileges"
+msgstr "Privilegi di accesso di default"
+
+#: describe.c:1259
+msgid "Object"
+msgstr "Oggetto"
+
+#: describe.c:1273
+msgid "table constraint"
+msgstr "vincolo di tabella"
+
+#: describe.c:1297
+msgid "domain constraint"
+msgstr "vincolo di dominio"
+
+#: describe.c:1321
+msgid "operator class"
+msgstr "classe operatori"
+
+#: describe.c:1345
+msgid "operator family"
+msgstr "famiglia operatori"
+
+#: describe.c:1368
+msgid "rule"
+msgstr "regola"
+
+#: describe.c:1414
+msgid "Object descriptions"
+msgstr "Descrizioni oggetti"
+
+#: describe.c:1479 describe.c:4007
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Non è stata trovata nessuna relazione chiamata \"%s\"."
+
+#: describe.c:1482 describe.c:4010
+#, c-format
+msgid "Did not find any relations."
+msgstr "Non è stata trovata nessuna relazione."
+
+#: describe.c:1678
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Non è stata trovata nessuna relazione con OID %s."
+
+#: describe.c:1726 describe.c:1750
+msgid "Start"
+msgstr "Inizio"
+
+#: describe.c:1727 describe.c:1751
+msgid "Minimum"
+msgstr "Minimo"
+
+#: describe.c:1728 describe.c:1752
+msgid "Maximum"
+msgstr "Massimo"
+
+#: describe.c:1729 describe.c:1753
+msgid "Increment"
+msgstr "Incremento"
+
+#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426
+#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620
+msgid "yes"
+msgstr "sì"
+
+#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426
+#: describe.c:4768 describe.c:4892 describe.c:6621
+msgid "no"
+msgstr "no"
+
+#: describe.c:1732 describe.c:1756
+msgid "Cycles?"
+msgstr "Riparte?"
+
+#: describe.c:1733 describe.c:1757
+msgid "Cache"
+msgstr "Cache"
+
+#: describe.c:1798
+#, c-format
+msgid "Owned by: %s"
+msgstr "Proprietario: %s"
+
+#: describe.c:1802
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Sequenza per la colonna identità: %s"
+
+#: describe.c:1810
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "Sequenza non registrata \"%s.%s\""
+
+#: describe.c:1813
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Sequenza \"%s.%s\""
+
+#: describe.c:1957
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Tabella non loggata \"%s.%s\""
+
+#: describe.c:1960
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Tabella \"%s.%s\""
+
+#: describe.c:1964
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Vista \"%s.%s\""
+
+#: describe.c:1969
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Vista materializzata non loggata \"%s.%s\""
+
+#: describe.c:1972
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Vista materializzata \"%s.%s\""
+
+#: describe.c:1977
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Indice non loggato \"%s.%s\""
+
+#: describe.c:1980
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Indice \"%s.%s\""
+
+#: describe.c:1985
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Indice partizionato non registrato \"%s.%s\""
+
+#: describe.c:1988
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Indice partizionato \"%s.%s\""
+
+#: describe.c:1992
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "Tabella TOAST \"%s.%s\""
+
+#: describe.c:1996
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Tipo composito \"%s.%s\""
+
+#: describe.c:2000
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Tabella esterna \"%s.%s\""
+
+#: describe.c:2005
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Tabella partizionata non registrata \"%s.%s\""
+
+#: describe.c:2008
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Tabella partizionata \"%s.%s\""
+
+#: describe.c:2024 describe.c:4343
+msgid "Collation"
+msgstr "Ordinamento"
+
+#: describe.c:2025 describe.c:4344
+msgid "Nullable"
+msgstr "Può essere null"
+
+#: describe.c:2026 describe.c:4345
+msgid "Default"
+msgstr "Default"
+
+#: describe.c:2029
+msgid "Key?"
+msgstr "Chiave?"
+
+#: describe.c:2031 describe.c:4665 describe.c:4676
+msgid "Definition"
+msgstr "Definizione"
+
+#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835
+#: describe.c:5894
+msgid "FDW options"
+msgstr "Opzioni FDW"
+
+#: describe.c:2035
+msgid "Storage"
+msgstr "Memorizzazione"
+
+#: describe.c:2037
+msgid "Compression"
+msgstr "Compression"
+
+#: describe.c:2039
+msgid "Stats target"
+msgstr "Destinazione statistiche"
+
+#: describe.c:2175
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "Partizione di: %s %s%s"
+
+#: describe.c:2188
+msgid "No partition constraint"
+msgstr "Nessun vincolo di partizione"
+
+#: describe.c:2190
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Vincolo di partizione: %s"
+
+#: describe.c:2214
+#, c-format
+msgid "Partition key: %s"
+msgstr "Chiave di partizione: %s"
+
+#: describe.c:2240
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Tabella proprietaria: \"%s.%s\""
+
+#: describe.c:2309
+msgid "primary key, "
+msgstr "chiave primaria, "
+
+#: describe.c:2312
+msgid "unique"
+msgstr "univoco"
+
+#: describe.c:2314
+msgid " nulls not distinct"
+msgstr " nulls non distinti"
+
+#: describe.c:2315
+msgid ", "
+msgstr ", "
+
+#: describe.c:2322
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "per la tabella \"%s.%s\""
+
+#: describe.c:2326
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", predicato (%s)"
+
+#: describe.c:2329
+msgid ", clustered"
+msgstr ", raggruppato"
+
+#: describe.c:2332
+msgid ", invalid"
+msgstr ", non valido"
+
+#: describe.c:2335
+msgid ", deferrable"
+msgstr ", deferibile"
+
+#: describe.c:2338
+msgid ", initially deferred"
+msgstr ", inizialmente deferito"
+
+#: describe.c:2341
+msgid ", replica identity"
+msgstr ", identità di replica"
+
+#: describe.c:2395
+msgid "Indexes:"
+msgstr "Indici:"
+
+#: describe.c:2478
+msgid "Check constraints:"
+msgstr "Vincoli di controllo:"
+
+#: describe.c:2546
+msgid "Foreign-key constraints:"
+msgstr "Vincoli di integrità referenziale:"
+
+#: describe.c:2609
+msgid "Referenced by:"
+msgstr "Referenziato da:"
+
+#: describe.c:2659
+msgid "Policies:"
+msgstr "Regole di sicurezza:"
+
+#: describe.c:2662
+msgid "Policies (forced row security enabled):"
+msgstr "Regole (sicurezza per riga forzata abilitata):"
+
+#: describe.c:2665
+msgid "Policies (row security enabled): (none)"
+msgstr "Regole (sicurezza per riga abilitata): (nessuna)"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Regole (sicurezza per riga forzata abilitata): (nessuna)"
+
+#: describe.c:2671
+msgid "Policies (row security disabled):"
+msgstr "Regole (sicurezza per riga disabilitata):"
+
+#: describe.c:2731 describe.c:2835
+msgid "Statistics objects:"
+msgstr "Oggetti statistiche:"
+
+#: describe.c:2937 describe.c:3090
+msgid "Rules:"
+msgstr "Regole:"
+
+#: describe.c:2940
+msgid "Disabled rules:"
+msgstr "Regole disabilitate:"
+
+#: describe.c:2943
+msgid "Rules firing always:"
+msgstr "Regole sempre abilitate:"
+
+#: describe.c:2946
+msgid "Rules firing on replica only:"
+msgstr "Regole abilitate solo su replica:"
+
+#: describe.c:3025 describe.c:5030
+msgid "Publications:"
+msgstr "Pubblicazioni:"
+
+#: describe.c:3073
+msgid "View definition:"
+msgstr "Definizione vista:"
+
+#: describe.c:3236
+msgid "Triggers:"
+msgstr "Trigger:"
+
+#: describe.c:3239
+msgid "Disabled user triggers:"
+msgstr "Trigger utente disabilitati:"
+
+#: describe.c:3242
+msgid "Disabled internal triggers:"
+msgstr "Trigger interni disabilitati:"
+
+#: describe.c:3245
+msgid "Triggers firing always:"
+msgstr "Trigger sempre abilitati:"
+
+#: describe.c:3248
+msgid "Triggers firing on replica only:"
+msgstr "Trigger abilitati solo su replica:"
+
+#: describe.c:3319
+#, c-format
+msgid "Server: %s"
+msgstr "Server: %s"
+
+#: describe.c:3327
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "Opzioni FDW (%s)"
+
+#: describe.c:3348
+msgid "Inherits"
+msgstr "Eredita"
+
+#: describe.c:3413
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "Numero di partizioni: %d"
+
+#: describe.c:3422
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Numero di partizioni: %d (Usa \\d+ per elencarle.)"
+
+#: describe.c:3424
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Numero di tabelle figlio: %d (Usa \\d+ per elencarle.)"
+
+#: describe.c:3431
+msgid "Child tables"
+msgstr "Tabelle figlio"
+
+#: describe.c:3431
+msgid "Partitions"
+msgstr "Partizioni"
+
+#: describe.c:3462
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Tabella di tipo: %s"
+
+#: describe.c:3478
+msgid "Replica Identity"
+msgstr "Identità di replica"
+
+#: describe.c:3491
+msgid "Has OIDs: yes"
+msgstr "Ha OID: sì"
+
+#: describe.c:3500
+#, c-format
+msgid "Access method: %s"
+msgstr "Metodo di accesso %s"
+
+#: describe.c:3579
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "Tablespace: \"%s\""
+
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:3591
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", tablespace \"%s\""
+
+#: describe.c:3668
+msgid "List of roles"
+msgstr "Lista dei ruoli"
+
+#: describe.c:3670
+msgid "Role name"
+msgstr "Nome ruolo"
+
+#: describe.c:3671
+msgid "Attributes"
+msgstr "Attributi"
+
+#: describe.c:3673
+msgid "Member of"
+msgstr "Membro di"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "Superutente"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "Nessuna ereditarietà"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "Crea ruoli"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "Crea DB"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "Login non possibile"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "Replica"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "Scavalca RLS"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "Niente connessioni"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d connessione"
+msgstr[1] "%d connessioni"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Password valida fino a "
+
+#: describe.c:3777
+msgid "Role"
+msgstr "Ruolo"
+
+#: describe.c:3778
+msgid "Database"
+msgstr "Database"
+
+#: describe.c:3779
+msgid "Settings"
+msgstr "Impostazioni"
+
+#: describe.c:3803
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "Non è stata trovata nessuna impostazione per il ruolo \"%s\" e il database \"%s\"."
+
+#: describe.c:3806
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Non è stata trovata nessuna impostazione per il ruolo \"%s\"."
+
+#: describe.c:3809
+#, c-format
+msgid "Did not find any settings."
+msgstr "Non è stata trovata nessuna impostazione."
+
+#: describe.c:3814
+msgid "List of settings"
+msgstr "Lista delle impostazioni"
+
+#: describe.c:3885
+msgid "index"
+msgstr "indice"
+
+#: describe.c:3887
+msgid "TOAST table"
+msgstr "Tabella TOAST"
+
+#: describe.c:3890 describe.c:4102
+msgid "partitioned index"
+msgstr "indice partizionato"
+
+#: describe.c:3910
+msgid "permanent"
+msgstr "permanente"
+
+#: describe.c:3911
+msgid "temporary"
+msgstr "temporaneo"
+
+#: describe.c:3912
+msgid "unlogged"
+msgstr "non registrato"
+
+#: describe.c:3913
+msgid "Persistence"
+msgstr "Persistenza"
+
+#: describe.c:3929
+msgid "Access method"
+msgstr "Metodo di accesso"
+
+#: describe.c:4015
+msgid "List of relations"
+msgstr "Lista delle relazioni"
+
+#: describe.c:4063
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "Il server (versione %s) non supporta il partizionamento dichiarativo delle tabelle."
+
+#: describe.c:4074
+msgid "List of partitioned indexes"
+msgstr "Elenco di indici partizionati"
+
+#: describe.c:4076
+msgid "List of partitioned tables"
+msgstr "Elenco delle tabelle partizionate"
+
+#: describe.c:4080
+msgid "List of partitioned relations"
+msgstr "Lista delle relazioni"
+
+#: describe.c:4111
+msgid "Parent name"
+msgstr "Nome del genitore"
+
+#: describe.c:4124
+msgid "Leaf partition size"
+msgstr "Dimensione partizione foglia"
+
+#: describe.c:4127 describe.c:4133
+msgid "Total size"
+msgstr "Dimensione totale"
+
+#: describe.c:4258
+msgid "Trusted"
+msgstr "Fidato"
+
+#: describe.c:4267
+msgid "Internal language"
+msgstr "Linguaggio interno"
+
+#: describe.c:4268
+msgid "Call handler"
+msgstr "Handler di chiamata"
+
+#: describe.c:4269 describe.c:5680
+msgid "Validator"
+msgstr "Validatore"
+
+#: describe.c:4270
+msgid "Inline handler"
+msgstr "Handler inline"
+
+#: describe.c:4305
+msgid "List of languages"
+msgstr "Lista dei linguaggi"
+
+#: describe.c:4346
+msgid "Check"
+msgstr "Controllo"
+
+#: describe.c:4390
+msgid "List of domains"
+msgstr "Lista dei domini"
+
+#: describe.c:4424
+msgid "Source"
+msgstr "Sorgente"
+
+#: describe.c:4425
+msgid "Destination"
+msgstr "Destinazione"
+
+#: describe.c:4427 describe.c:6622
+msgid "Default?"
+msgstr "Predefinito?"
+
+#: describe.c:4469
+msgid "List of conversions"
+msgstr "Lista delle conversioni"
+
+#: describe.c:4497
+msgid "Parameter"
+msgstr "Parametro"
+
+#: describe.c:4498
+msgid "Value"
+msgstr "Valore"
+
+#: describe.c:4505
+msgid "Context"
+msgstr "Contesto"
+
+#: describe.c:4538
+msgid "List of configuration parameters"
+msgstr "Elenco dei parametri di configurazione"
+
+#: describe.c:4540
+msgid "List of non-default configuration parameters"
+msgstr "Elenco dei parametri di configurazione non predefiniti"
+
+#: describe.c:4567
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "Il server (versione %s) non supporta i trigger di eventi."
+
+#: describe.c:4587
+msgid "Event"
+msgstr "Evento"
+
+#: describe.c:4589
+msgid "enabled"
+msgstr "abilitato"
+
+#: describe.c:4590
+msgid "replica"
+msgstr "replica"
+
+#: describe.c:4591
+msgid "always"
+msgstr "sempre"
+
+#: describe.c:4592
+msgid "disabled"
+msgstr "disabilitato"
+
+#: describe.c:4593 describe.c:6496
+msgid "Enabled"
+msgstr "Abilitato"
+
+#: describe.c:4595
+msgid "Tags"
+msgstr "Tag"
+
+#: describe.c:4619
+msgid "List of event triggers"
+msgstr "Lista di trigger di evento"
+
+#: describe.c:4646
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "Il server (versione %s) non supporta le statistiche estese."
+
+#: describe.c:4683
+msgid "Ndistinct"
+msgstr "Ndistinto"
+
+#: describe.c:4684
+msgid "Dependencies"
+msgstr "Dipendenze"
+
+#: describe.c:4694
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4718
+msgid "List of extended statistics"
+msgstr "Definisci una statistica estesa"
+
+#: describe.c:4745
+msgid "Source type"
+msgstr "Tipo di partenza"
+
+#: describe.c:4746
+msgid "Target type"
+msgstr "Tipo di arrivo"
+
+#: describe.c:4770
+msgid "in assignment"
+msgstr "in assegnazione"
+
+#: describe.c:4772
+msgid "Implicit?"
+msgstr "Implicito?"
+
+#: describe.c:4831
+msgid "List of casts"
+msgstr "Lista delle conversioni di tipo"
+
+#: describe.c:4883 describe.c:4887
+msgid "Provider"
+msgstr "Provider"
+
+#: describe.c:4893 describe.c:4898
+msgid "Deterministic?"
+msgstr "Deterministico?"
+
+#: describe.c:4938
+msgid "List of collations"
+msgstr "Lista degli ordinamenti"
+
+#: describe.c:5000
+msgid "List of schemas"
+msgstr "Lista degli schemi"
+
+#: describe.c:5117
+msgid "List of text search parsers"
+msgstr "Lista degli analizzatori di ricerca resto"
+
+#: describe.c:5167
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Non è stato trovato nessun analizzatore di ricerca testo chiamato \"%s\"."
+
+#: describe.c:5170
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Non è stato trovato nessun analizzatore di ricerca testo."
+
+#: describe.c:5245
+msgid "Start parse"
+msgstr "Inizio analisi"
+
+#: describe.c:5246
+msgid "Method"
+msgstr "Metodo"
+
+#: describe.c:5250
+msgid "Get next token"
+msgstr "Ottiene il token successivo"
+
+#: describe.c:5252
+msgid "End parse"
+msgstr "Fine analisi"
+
+#: describe.c:5254
+msgid "Get headline"
+msgstr "Ottiene intestazione"
+
+#: describe.c:5256
+msgid "Get token types"
+msgstr "Ottieni i tipi token"
+
+#: describe.c:5267
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Analizzatore di ricerca teso \"%s.%s\""
+
+#: describe.c:5270
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Analizzatore di ricerca testo \"%s\""
+
+#: describe.c:5289
+msgid "Token name"
+msgstr "Nome token"
+
+#: describe.c:5303
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Tipi token per l'analizzatore \"%s.%s\""
+
+#: describe.c:5306
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Tipi token per l'analizzatore \"%s\""
+
+#: describe.c:5350
+msgid "Template"
+msgstr "Modello"
+
+#: describe.c:5351
+msgid "Init options"
+msgstr "Opzioni iniziali"
+
+#: describe.c:5378
+msgid "List of text search dictionaries"
+msgstr "Lista dei dizionari di ricerca testo"
+
+#: describe.c:5411
+msgid "Init"
+msgstr "Init"
+
+#: describe.c:5412
+msgid "Lexize"
+msgstr "Lexize"
+
+#: describe.c:5444
+msgid "List of text search templates"
+msgstr "Lista dei modelli di ricerca testo"
+
+#: describe.c:5499
+msgid "List of text search configurations"
+msgstr "Lista delle configurazioni di ricerca testo"
+
+#: describe.c:5550
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "Non è stata trovata nessuna configurazione di ricerca testo chiamata \"%s\"."
+
+#: describe.c:5553
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Non è stata trovata nessuna configurazione di ricerca testo."
+
+#: describe.c:5619
+msgid "Token"
+msgstr "Token"
+
+#: describe.c:5620
+msgid "Dictionaries"
+msgstr "Dizionari"
+
+#: describe.c:5631
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Configurazione di ricerca testo \"%s.%s\""
+
+#: describe.c:5634
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Configurazione di ricerca testo \"%s\""
+
+#: describe.c:5638
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Analizzatore \"%s.%s\""
+
+#: describe.c:5641
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Analizzatore: \"%s\""
+
+#: describe.c:5722
+msgid "List of foreign-data wrappers"
+msgstr "Lista dei wrapper di dati esterni"
+
+#: describe.c:5750
+msgid "Foreign-data wrapper"
+msgstr "Wrapper per dati esterni"
+
+#: describe.c:5768 describe.c:5958
+msgid "Version"
+msgstr "Versione"
+
+#: describe.c:5799
+msgid "List of foreign servers"
+msgstr "Lista dei server esterni"
+
+#: describe.c:5824 describe.c:5883
+msgid "Server"
+msgstr "Server"
+
+#: describe.c:5825
+msgid "User name"
+msgstr "Nome utente"
+
+#: describe.c:5855
+msgid "List of user mappings"
+msgstr "Lista delle mappature degli utenti"
+
+#: describe.c:5928
+msgid "List of foreign tables"
+msgstr "Lista delle tabelle esterne"
+
+#: describe.c:5980
+msgid "List of installed extensions"
+msgstr "Lista delle estensioni installate"
+
+#: describe.c:6028
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "Non è stata trovata nessuna estensione chiamata \"%s\"."
+
+#: describe.c:6031
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Non è stata trovata nessuna estensione."
+
+#: describe.c:6075
+msgid "Object description"
+msgstr "Descrizione dell'oggetto"
+
+#: describe.c:6085
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Oggetti nell'estensione \"%s\""
+
+#: describe.c:6126
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "nome qualificato improprio (troppi nomi puntati): %s"
+
+#: describe.c:6140
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "i riferimenti tra database diversi non sono implementati: %s"
+
+#: describe.c:6171 describe.c:6298
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "Il server (versione %s) non supporta pubblicazioni."
+
+#: describe.c:6188 describe.c:6376
+msgid "All tables"
+msgstr "Tutte le tabelle"
+
+#: describe.c:6189 describe.c:6377
+msgid "Inserts"
+msgstr "Inserimenti"
+
+#: describe.c:6190 describe.c:6378
+msgid "Updates"
+msgstr "Modifiche"
+
+#: describe.c:6191 describe.c:6379
+msgid "Deletes"
+msgstr "Cancellazioni"
+
+#: describe.c:6195 describe.c:6381
+msgid "Truncates"
+msgstr "Troncamenti"
+
+#: describe.c:6199 describe.c:6383
+msgid "Via root"
+msgstr "Via root"
+
+#: describe.c:6221
+msgid "List of publications"
+msgstr "Lista delle pubblicazioni"
+
+#: describe.c:6345
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "Non è stata trovata nessuna pubblicazione chiamata \"%s\"."
+
+#: describe.c:6348
+#, c-format
+msgid "Did not find any publications."
+msgstr "Non è stata trovata nessuna pubblicazione."
+
+#: describe.c:6372
+#, c-format
+msgid "Publication %s"
+msgstr "Pubblicazione %s"
+
+#: describe.c:6425
+msgid "Tables:"
+msgstr "Tabelle:"
+
+#: describe.c:6437
+msgid "Tables from schemas:"
+msgstr "Tabelle da schemi:"
+
+#: describe.c:6481
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Il server (versione %s) non supporta sottoscrizioni."
+
+#: describe.c:6497
+msgid "Publication"
+msgstr "Pubblicazione"
+
+#: describe.c:6506
+msgid "Binary"
+msgstr "Binario"
+
+#: describe.c:6507
+msgid "Streaming"
+msgstr "Streaming"
+
+#: describe.c:6514
+msgid "Two-phase commit"
+msgstr "Commit in due fasi"
+
+#: describe.c:6515
+msgid "Disable on error"
+msgstr "Disattiva in caso di errore"
+
+#: describe.c:6520
+msgid "Synchronous commit"
+msgstr "Commit sincrono"
+
+#: describe.c:6521
+msgid "Conninfo"
+msgstr "Conninfo"
+
+#: describe.c:6527
+msgid "Skip LSN"
+msgstr "Salta LSN"
+
+#: describe.c:6554
+msgid "List of subscriptions"
+msgstr "Lista di sottoscrizioni"
+
+#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6617
+msgid "Input type"
+msgstr "Tipo di input"
+
+#: describe.c:6618
+msgid "Storage type"
+msgstr "Tipo di archiviazione"
+
+#: describe.c:6619
+msgid "Operator class"
+msgstr "Classe operatori"
+
+#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901
+msgid "Operator family"
+msgstr "Famiglia operatori"
+
+#: describe.c:6667
+msgid "List of operator classes"
+msgstr "Elenco delle classi di operatori"
+
+#: describe.c:6714
+msgid "Applicable types"
+msgstr "Tipi applicabili"
+
+#: describe.c:6756
+msgid "List of operator families"
+msgstr "Elenco delle famiglie di operatori"
+
+#: describe.c:6807
+msgid "Operator"
+msgstr "Operatore"
+
+#: describe.c:6808
+msgid "Strategy"
+msgstr "Strategia"
+
+#: describe.c:6809
+msgid "ordering"
+msgstr "ordinare"
+
+#: describe.c:6810
+msgid "search"
+msgstr "ricerca"
+
+#: describe.c:6811
+msgid "Purpose"
+msgstr "Scopo"
+
+#: describe.c:6816
+msgid "Sort opfamily"
+msgstr "Ordina la famiglia"
+
+#: describe.c:6855
+msgid "List of operators of operator families"
+msgstr "Elenco degli operatori delle famiglie di operatori"
+
+#: describe.c:6902
+msgid "Registered left type"
+msgstr "Tipo sinistro registrato"
+
+#: describe.c:6903
+msgid "Registered right type"
+msgstr "Tipo destro registrato"
+
+#: describe.c:6904
+msgid "Number"
+msgstr "Numero"
+
+#: describe.c:6948
+msgid "List of support functions of operator families"
+msgstr "Elenco delle funzioni di supporto delle famiglie di operatori"
+
+#: describe.c:6979
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7000
+msgid "Large objects"
+msgstr "Large object"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql è il terminale interattivo per PostgreSQL.\n"
+"\n"
+
+#: help.c:76 help.c:393 help.c:473 help.c:516
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [OPZIONI]... [NOME DB [NOME UTENTE]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "Opzioni generali:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr ""
+" -c, --command=COMANDO esegue solamente un comando singolo (SQL o interno)\n"
+" e termina\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr ""
+" -d, --dbname=NOMEDB specifica il nome del database a cui connettersi\n"
+" (default: \"%s\")\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=NOME FILE esegui i comandi da un file ed esci\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l --list elenca i database disponibili ed esci\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NOME=VALORE\n"
+" imposta la variabile psql NOME a VALORE\n"
+" (es.: -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc non leggere il file di avvio (~/.psqlrc)\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (\"uno\"), --single-transaction\n"
+" esegui in un'unica transazione (se non interattivo)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=opzioni] mostra quest'aiuto ed esci\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands mostra la lista dei comandi backslash ed esci\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables mostra la lista delle variabili speciali ed esci\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Opzioni di input e output:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all mostra tutti gli input dallo script\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors mostra i comandi falliti\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries mostra i comandi inviati al server\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden mostra le query generate dai comandi interni\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=NOME_FILE invia log di sessione al file\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr ""
+" -n, --no-readline disabilita la modifica avanzata della riga\n"
+" di comando (readline)\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr ""
+" -o, --output=NOME_FILE reindirizza i risultati al file specificato\n"
+" (oppure |pipe)\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr ""
+" -q, --quiet esegui in modo silenzioso (nessun messaggio, solo\n"
+" risultati query)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step modalità passo singolo (conferma ogni query)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr ""
+" -S, --single-line modalità riga singola (la fine riga termina\n"
+" il comando SQL)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Opzioni formato output:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align modo output tabelle disallineato\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv Modalità di output della tabella CSV (valori separati da virgola).\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=STRINGA\n"
+" separatore di campo per output non allineato\n"
+" (default: \"%s\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html modo output tabelle in HTML\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr ""
+" -P, --pset=VAR[=ARG] imposta l'opzione di stampa VAR ad ARG (vedi anche\n"
+" il comando \\pset)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=STRINGa\n"
+" separatore di record per output non allineato\n"
+" (default: \"a capo\")\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only mostra solo le righe\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr ""
+" -T, --table-attr=TESTO imposta gli attributi delle tabelle HTML\n"
+" (es: larghezza, bordo)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded attiva output tabelle espanso\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" usa il byte zero come separatore di campo per l'output\n"
+" non allineato\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" usa il byte zero come separatore di record per l'output\n"
+" non allineato\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opzioni di connessione:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr ""
+" -h, --host=HOSTNAME host server del database o directory socket\n"
+" (default: \"%s\")\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "sockect locale"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORTA porta di ascolto del database (default: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=UTENTE nome utente del database (default: \"%s\")\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password non chiedere mai le password\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password forza la richiesta di una password (dovrebbe essere\n"
+" automatico)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Per maggiori informazioni digita \"\\?\" (per comandi interni) oppure \"\\help\"\n"
+"per comandi SQL) da psql, oppure consultare la sezione psql nella\n"
+"documentazione PostgreSQL.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Segnala i bug a <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s pagina iniziale: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "Generali\n"
+
+#: help.c:192
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright mostra i termini di uso e distribuzione di PostgreSQL\n"
+
+#: help.c:193
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr " \\crosstabview [COLONNE] esegui la query e mostra il risultato in crosstab\n"
+
+#: help.c:194
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose mostra il messaggio di errore più recente alla massima loquacità\n"
+
+#: help.c:195
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPZIONI)] [FILE] esegue la query (e invia il risultato a file o |pipe);\n"
+" \\g senza argomenti equivale a un punto e virgola\n"
+
+#: help.c:197
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc descrivi il risultato della query, senza eseguirla\n"
+
+#: help.c:198
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec esegui la query, poi esegui ogni valore nel suo risultato\n"
+
+#: help.c:199
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [PREFIX] esegui la query e salva il risultato in una variabile psql\n"
+
+#: help.c:200
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr ""
+" \\gx [(OPZIONI)] [FILE] come \\g, ma forza la modalità di output espansa\n"
+"\n"
+
+#: help.c:201
+msgid " \\q quit psql\n"
+msgstr " \\q esci da psql\n"
+
+#: help.c:202
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SEC] esegui una query ogni SEC secondi\n"
+
+#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304
+#: help.c:324 help.c:337 help.c:346
+msgid "\n"
+msgstr "\n"
+
+#: help.c:205
+msgid "Help\n"
+msgstr "Aiuto\n"
+
+#: help.c:207
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] mostra aiuto sui comandi backslash\n"
+
+#: help.c:208
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options mostra aiuto sulle opzioni di riga di comando psql\n"
+
+#: help.c:209
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables mostra aiusto sulle variabili speciali\n"
+
+#: help.c:210
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr ""
+" \\h [NOME] mostra aiuto sulla sintassi dei comandi SQL, * mostra\n"
+" tutti i comandi\n"
+
+#: help.c:213
+msgid "Query Buffer\n"
+msgstr "Buffer Query\n"
+
+#: help.c:214
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr ""
+" \\e [FILE] [RIGA] modifica il buffer della query (o il file) con\n"
+" l'editor esterno\n"
+
+#: help.c:215
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr ""
+" \\ef [FUNZIONE [RIGA]] modifica la definizione della funzione con l'editor\n"
+" esterno\n"
+
+#: help.c:216
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [VISTA [LINE]] modifica la definizione della vista con un editor esterno\n"
+
+#: help.c:217
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p mostra i contenuti del buffer query\n"
+
+#: help.c:218
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r reimposta (cancella) il buffer query\n"
+
+#: help.c:220
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [FILE] mostra la cronologia salvala in un file\n"
+
+#: help.c:222
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w FILE scrivi il buffer query su file\n"
+
+#: help.c:225
+msgid "Input/Output\n"
+msgstr "Input/Output\n"
+
+#: help.c:226
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... esegui una SQL COPY con flusso di dati dal client\n"
+
+#: help.c:227
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [STRING] scrive la stringa nello standard output (-n per nessuna nuova riga)\n"
+
+#: help.c:228
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i FILE esegui i comandi dal file\n"
+
+#: help.c:229
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr ""
+" \\ir FILE come \\i, ma relativo alla posizione nello script\n"
+" corrente\n"
+
+#: help.c:230
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr ""
+" \\o [FILE] invia i risultati della query ad un file oppure\n"
+" una |pipe\n"
+
+#: help.c:231
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr ""
+" \\qecho [-n] [STRING] scrive la stringa in \\o flusso di output (-n per nessuna nuova riga)\n"
+"\n"
+
+#: help.c:232
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [STRING] scrive la stringa nell'errore standard (-n per nessuna nuova riga)\n"
+
+#: help.c:235
+msgid "Conditional\n"
+msgstr "Condizionale\n"
+
+#: help.c:236
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if ESPR inizia un blocco condizionale\n"
+
+#: help.c:237
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif ESPR alternativa all'interno di un blocco condizionale\n"
+
+#: help.c:238
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else alternativa finale in un blocco condizionale\n"
+
+#: help.c:239
+msgid " \\endif end conditional block\n"
+msgstr " \\endif fine del blocco condizionale\n"
+
+#: help.c:242
+msgid "Informational\n"
+msgstr "Informativi\n"
+
+#: help.c:243
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (opzioni: S = mostra gli oggetti di sistema, + = dettagli addizionali)\n"
+
+#: help.c:244
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] elenca le tabelle, le viste e le sequenze\n"
+
+#: help.c:245
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NOME descrive la tabella, vista, sequenza o indice\n"
+
+#: help.c:246
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [MODELLO] elenca le funzioni di aggregazione\n"
+
+#: help.c:247
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [MODELLO] elenca i metodi di accesso\n"
+
+#: help.c:248
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] elenca le classi di operatori\n"
+
+#: help.c:249
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] elenca le famiglie di operatori\n"
+
+#: help.c:250
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] elenca gli operatori delle famiglie di operatori\n"
+
+#: help.c:251
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] elenca le funzioni di supporto delle famiglie di operatori\n"
+
+#: help.c:252
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [MODELLO] elenca i tablespace\n"
+
+#: help.c:253
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [MODELLO] elenca le conversioni di codifica\n"
+
+#: help.c:254
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [PATTERN] elenca i parametri di configurazione\n"
+
+#: help.c:255
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [MODELLO] elenca le conversioni di tipo\n"
+
+#: help.c:256
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [MODELLO] mostra la descrizione di oggetti non elencati altrove\n"
+
+#: help.c:257
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [MODELLO] elenca i domini\n"
+
+#: help.c:258
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [MODELLO] elenca i privilegi predefiniti\n"
+
+#: help.c:259
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [MODELLO] elenca le tabelle esterne\n"
+
+#: help.c:260
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [MODELLO] elenca i server esterni\n"
+
+#: help.c:261
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [MODELLO] elenca le tabelle esterne\n"
+
+#: help.c:262
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [MODELLO] elenca le mappature degli utenti\n"
+
+#: help.c:263
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [MODELLO] elenca i wrapper di dati esterni\n"
+
+#: help.c:264
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" elenco funzioni di [solo agg/normal/procedura/trigger/finestra]\n"
+
+#: help.c:266
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [MODELLO] elenca le configurazioni di ricerca testo\n"
+
+#: help.c:267
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [MODELLO] elenca i dizionari di ricerca testo\n"
+
+#: help.c:268
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [MODELLO] elenca gli analizzatori di ricerca testo\n"
+
+#: help.c:269
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [MODELLO] elenca i modelli di ricerca di testo\n"
+
+#: help.c:270
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [MODELLO] elenca i ruoli\n"
+
+#: help.c:271
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [MODELLO] elenca gli indici\n"
+
+#: help.c:272
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] elenca i large object, stesso risultato di \\lo_list\n"
+
+#: help.c:273
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [MODELLO] elenca i linguaggi procedurali\n"
+
+#: help.c:274
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [PATTERN] elenca le viste materializzate\n"
+
+#: help.c:275
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [MODELLO] elenca gli schemi\n"
+
+#: help.c:276
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" operatori di liste\n"
+
+#: help.c:278
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [MODELLO] elenca gli ordinamenti\n"
+
+#: help.c:279
+msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr ""
+" \\dp [MODELLO] elenca i permessi di accesso alla tabella, vista\n"
+" o sequenza\n"
+
+#: help.c:280
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[itn+] [PATTERN] list [solo indice/tabella] relazioni partizionate [n=nidificato]\n"
+
+#: help.c:281
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr " \\drds [ROLEPTRN [DBPTRN]] elenca le impostazioni del ruolo per database\n"
+
+#: help.c:282
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [MODELLO] elenca le pubblicazioni di replica\n"
+
+#: help.c:283
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [MODELLO] elenca le sottoscrizioni di replica\n"
+
+#: help.c:284
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [MODELLO] elenca le sequenze\n"
+
+#: help.c:285
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [MODELLO] elenca le tabelle\n"
+
+#: help.c:286
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [MODELLO] elenca i tipi di dato\n"
+
+#: help.c:287
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [MODELLO] elenca i ruoli\n"
+
+#: help.c:288
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [MODELLO] elenca le viste\n"
+
+#: help.c:289
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [MODELLO] elenca le estensioni\n"
+
+#: help.c:290
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [PATTERN] elenca le statistiche estese\n"
+
+#: help.c:291
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [PATTERN] elenca i trigger di evento\n"
+
+#: help.c:292
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [PATTERN] elenca i database\n"
+
+#: help.c:293
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNZIONE mostra la definizione di una funzione\n"
+
+#: help.c:294
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VISTA mostra la definizione di una vista\n"
+
+#: help.c:295
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [MODELLO] uguale a \\dp\n"
+
+#: help.c:298
+msgid "Large Objects\n"
+msgstr "Large Object\n"
+
+#: help.c:299
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export FILE LOBOID scrive un oggetto di grandi dimensioni su un file\n"
+
+#: help.c:300
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import FILE [COMMENTO]\n"
+" leggi oggetti di grandi dimensioni da file\n"
+
+#: help.c:302
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] elenca gli oggetti di grandi dimensioni\n"
+
+#: help.c:303
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID elimina un oggetto di grandi dimensioni\n"
+
+#: help.c:306
+msgid "Formatting\n"
+msgstr "Formattazione\n"
+
+#: help.c:307
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a alterna tra modalità di output allineata e disallineata\n"
+
+#: help.c:308
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr ""
+" \\C [STRINGA] imposta nome tabella oppure elimina se la stringa\n"
+" non è specificata\n"
+
+#: help.c:309
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr ""
+" \\f [STRINGA] mostra o imposta il separatore di campo per l'output\n"
+" query disallineato\n"
+
+#: help.c:310
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H cambia modalità HTML (attualmente %s)\n"
+
+#: help.c:312
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NOME [VALORE]] imposta opzioni di output tabella\n"
+" (NOME := {border|columns|expanded|fieldsep|fieldsep_zero|\n"
+" footer|format|linestyle|null|numericlocale|pager|\n"
+" pager_min_lines|recordsep|recordsep_zero|tableattr|title|\n"
+" tuples_only|unicode_border_linestyle|\n"
+" unicode_column_linestyle|unicode_header_linestyle})\n"
+
+#: help.c:319
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] mostra solo le righe (attualmente %s)\n"
+
+#: help.c:321
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr ""
+" \\T [STRINGA] imposta gli attributi HTML di <table>, se non\n"
+" specificato allora annullali\n"
+
+#: help.c:322
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr ""
+" \\x [on|off|auto] cambia modalità output espansa\n"
+" (attualmente %s)\n"
+
+#: help.c:323
+msgid "auto"
+msgstr "auto"
+
+#: help.c:326
+msgid "Connection\n"
+msgstr "Connessione\n"
+
+#: help.c:328
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connetti ad un nuovo database (attualmente \"%s\")\n"
+
+#: help.c:332
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connetti ad un nuovo database (nessuna connessione attiva)\n"
+
+#: help.c:334
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo mostra le informazioni su la connessione corrente\n"
+
+#: help.c:335
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [CODIFICA] mostra o imposta la codifica del client\n"
+
+#: help.c:336
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [UTENTE] cambia la password per un utente in sicurezza\n"
+
+#: help.c:339
+msgid "Operating System\n"
+msgstr "Sistema operativo\n"
+
+#: help.c:340
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [DIRECTORY] cambia la directory di lavoro\n"
+
+#: help.c:341
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR recupera la variabile di ambiente\n"
+
+#: help.c:342
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NOME [VALORE] imposta o elimina una variabile d'ambiente\n"
+
+#: help.c:343
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr ""
+" \\timing [on|off] imposta cronometro dei comandi\n"
+" (attualmente %s)\n"
+
+#: help.c:345
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr ""
+" \\! [COMANDO] esegui un comando in una shell oppure avvia una shell\n"
+" interattiva\n"
+
+#: help.c:348
+msgid "Variables\n"
+msgstr "Variabili\n"
+
+#: help.c:349
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TESTO] NOME richiedi all'utente di impostare una variabile interna\n"
+
+#: help.c:350
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr ""
+" \\set [NOME [VALORE]] imposta una variabile interna, oppure mostrale tutte\n"
+" se non sono specificati parametri\n"
+
+#: help.c:351
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NOME cancella una variabile interna\n"
+
+#: help.c:390
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"Lista delle variabili speciali\n"
+"\n"
+
+#: help.c:392
+msgid "psql variables:\n"
+msgstr "variabili psql:\n"
+
+#: help.c:394
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NOME=VALORE\n"
+" oppure \\set NOME VALORE dentro psql\n"
+"\n"
+
+#: help.c:396
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" se impostato, i comandi SQL riusciti sono salvati automaticamente\n"
+
+#: help.c:398
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" determina il caso usato per completare le parole chiave SQL\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:401
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" il nome del database attualmente connesso\n"
+
+#: help.c:403
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" controlla quale input è scritto su standard output\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:406
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" se impostato, mostra le query interne dei comandi backslash;\n"
+" se impostato a \"noexec\", mostrale solo senza eseguirle\n"
+
+#: help.c:409
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" codifica del set di caratteri del client corrente\n"
+
+#: help.c:411
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr ""
+" ERROR\n"
+" true se l'ultima query è fallita, altrimenti false\n"
+
+#: help.c:413
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" il numero di righe del risultato da leggere e mostrare per volta (0 = tutte)\n"
+
+#: help.c:415
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" NASCONDI_TABELLA\n"
+" se impostato, i metodi di accesso alla tabella non vengono visualizzati\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" se impostato, i metodi di compressione non vengono visualizzati\n"
+
+#: help.c:419
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" controlla la storia dei comandi [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:421
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" nome del file usato per memorizzare la storia dei comandi\n"
+
+#: help.c:423
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" numero massimo di comandi da salvare nella storia dei comandi\n"
+
+#: help.c:425
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" l'host del server del database attualmente connesso\n"
+
+#: help.c:427
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" numero di EOF richiesti per terminare una sessione interattiva\n"
+
+#: help.c:429
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" valore dell'ultimo OID interessato\n"
+
+#: help.c:431
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" messaggio e SQLSTATE dell'ultimo errore, o stringa vuota e \"00000\" se non c'è\n"
+
+#: help.c:434
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" se impostato, un errore non termina una transazione (usa punti di\n"
+" salvataggio impliciti)\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" termina l'esecuzione batch dopo un errore\n"
+
+#: help.c:438
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" porta del server attualmente connesso\n"
+
+#: help.c:440
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" specifica il prompt psql standard\n"
+
+#: help.c:442
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" specifica il prompt usato quando un'istruzione continua da una riga\n"
+" precedente\n"
+
+#: help.c:444
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" specifica il prompt usato in COPY ... FROM STDIN\n"
+
+#: help.c:446
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" esegui silenziosamente (come con l'opzione -q)\n"
+
+#: help.c:448
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" numero di righe restituite o toccate dall'ultima query, o 0\n"
+
+#: help.c:450
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" versione del server (come stringa breve o formato numerico)\n"
+
+#: help.c:453
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" mostra tutti i risultati di una query combinata (\\;) anziché solo l'ultima\n"
+
+#: help.c:455
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" controlla la visualizzazione dei campi di contesto dei messaggi [never,\n"
+" errors, always]\n"
+
+#: help.c:457
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" se impostato, la fine riga termina i comandi SQL (come con l'opzione -S)\n"
+
+#: help.c:459
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" modalità passo singolo (come con l'opzione -s)\n"
+
+#: help.c:461
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" il codice SQLSTATE dell'ultima query, o \"00000\" se non c'è stato errore\n"
+
+#: help.c:463
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" l'utente database attualmente connesso\n"
+
+#: help.c:465
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITÀ\n"
+" controlla la verbosità dei rapporti di errore [predefinito, dettagliato, conciso, sqlstate]\n"
+
+#: help.c:467
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" la versione di psql (come stringa estesa, stringa breve, formato numerico)\n"
+
+#: help.c:472
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Impostazioni di visualizzazione:\n"
+
+#: help.c:474
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NOME[=VALORE]\n"
+" oppure \\pset NOME [VALORE] dentro psql\n"
+"\n"
+
+#: help.c:476
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" stile bordo (numero)\n"
+
+#: help.c:478
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" larghezza destinazione per il formato wrapped\n"
+
+#: help.c:480
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (o x)\n"
+" output espanso [on, off, auto]\n"
+
+#: help.c:482
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" separatore di campo per l'output non allineato (default \"%s\")\n"
+
+#: help.c:485
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" imposta il separatore di campo per l'output non allineato al byte zero\n"
+
+#: help.c:487
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" abilita o disabilita la visualizzazione del piè di pagina [on, off]\n"
+
+#: help.c:489
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" imposta il formato di output [unaligned, aligned, wrapped, html, asciidoc,\n"
+" ...]\n"
+
+#: help.c:491
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" imposta lo stile di disegno delle righe dei bordi [ascii, old-ascii,\n"
+" unicode]\n"
+
+#: help.c:493
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" imposta la stringa da visualizzare al posto dei valori null\n"
+
+#: help.c:495
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" abilita i caratteri specifici per il locale per separare i gruppi di cifre\n"
+" [on, off]\n"
+
+#: help.c:497
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" controlla quando usare la paginazione esterna [yes, no, always]\n"
+
+#: help.c:499
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" separatore di record (riga) per l'output non allineato\n"
+
+#: help.c:501
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" imposta il separatore di campo per l'output non allineato al byte zero\n"
+
+#: help.c:503
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (or T)\n"
+" specifica gli attributi per il tag table in formato html o la larghezza\n"
+" colonna proporzionale dei dati allineati a sinistra in formato\n"
+" latex-longtable\n"
+
+#: help.c:506
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" imposta il titolo della tabella per le tabelle stampate in seguito\n"
+
+#: help.c:508
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" se impostato, mostra solo i dati della tabella\n"
+
+#: help.c:510
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" imposta lo stile di disegno delle righe Unicode [single, double]\n"
+
+#: help.c:515
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Variabili d'ambiente:\n"
+
+#: help.c:519
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NOME=VALORE [NOME=VALORE] psql ...\n"
+" oppure \\setenv NOME [VALORE] dentro psql\n"
+"\n"
+
+#: help.c:521
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NOME=VALORE\n"
+" psql ...\n"
+" oppure \\setenv NOME [VALORE] dentro psql\n"
+"\n"
+
+#: help.c:524
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" numero di colonne per il formato wrapped\n"
+
+#: help.c:526
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" come il parametro di connessione application_name\n"
+
+#: help.c:528
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" come il parametro di connessione dbname\n"
+
+#: help.c:530
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" come il parametro di connessione host\n"
+
+#: help.c:532
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" nome del file delle password\n"
+
+#: help.c:534
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" password di connessione (uso non raccomandato)\n"
+
+#: help.c:536
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" come il parametro di connessione port\n"
+
+#: help.c:538
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" come il parametro di connessione user\n"
+
+#: help.c:540
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor usato dai comandi \\e, \\ef, \\ev\n"
+
+#: help.c:542
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" come specificare un numero di riga quando si invoca l'editor\n"
+
+#: help.c:544
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" posizione alternativa del file della storia dei comandi\n"
+
+#: help.c:546
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" nome del programma di paginazione esterno\n"
+
+#: help.c:549
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" nome del programma di paginazione esterno\n"
+
+#: help.c:552
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" posizione alternativa del file .psqlrc dell'utente\n"
+
+#: help.c:554
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" shell usata dal comando \\!\n"
+
+#: help.c:556
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" directory per i file temporanei\n"
+
+#: help.c:616
+msgid "Available help:\n"
+msgstr "Aiuti disponibili:\n"
+
+#: help.c:711
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Comando: %s\n"
+"Descrizione: %s\n"
+"Sintassi:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+"\n"
+
+#: help.c:734
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Nessun aiuto disponibile per \"%s\".\n"
+"Prova a digitare \\h senza parametri per vedere gli aiuti disponibili.\n"
+
+#: input.c:217
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "impossibile leggere dal file di input: %m"
+
+#: input.c:478 input.c:516
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "impossibile salvare la cronologia nel file \"%s\": %m"
+
+#: input.c:535
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "la cronologia non è supportata da questa installazione"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: non connesso ad un database"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: questa transazione è stata interrotta"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: stato della transazione sconosciuto"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: escapato"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Utilizza \"\\q\" per uscire %s.\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"L'input è un file di dump in formato PostgreSQL.\n"
+"Usa il tool di riga di comando pg_restore per ripristinare questo dump in un database.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Usa \\? per avere un aiuto o premi control-C per svuotare il buffer di input."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "Usa \\? per avere un aiuto."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Stai utilizzando psql, l'interfaccia a riga di comando di PostgreSQL."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Digita: \\copyright per le condizioni di distribuzione\n"
+" \\h per la guida sui comandi SQL\n"
+" \\? per la guida sui comandi psql\n"
+" \\g o termina con punto e virgola per eseguire la query\n"
+" \\q per uscire\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "Usa \\q per uscire."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "Usa control-D per uscire."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "Usa control-C per uscire."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "query ignorata: usa \\endif o Ctrl-C per uscire dal blocco \\if corrente"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "raggiunta fine file senza aver trovato \\endif finali"
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "stringa tra virgolette non terminata"
+
+#: psqlscanslash.l:811
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: memoria esaurita"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1996
+#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154
+#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228
+#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431
+#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517
+#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594
+#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730
+#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071
+#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171
+#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259
+#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338
+#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396
+#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428
+#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464
+#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499
+#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537
+#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574
+#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606
+#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638
+#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680
+#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4031
+#: sql_help.c:4142 sql_help.c:4171 sql_help.c:4186 sql_help.c:4689
+#: sql_help.c:4737 sql_help.c:4895
+msgid "name"
+msgstr "nome"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846
+#: sql_help.c:3339 sql_help.c:4457
+msgid "aggregate_signature"
+msgstr "signature_aggregato"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "nuovo_nome"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3011
+msgid "new_owner"
+msgstr "nuovo_proprietario"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "nuovo_schema"
+
+#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4486
+msgid "where aggregate_signature is:"
+msgstr "dove signature_aggregato è:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911
+#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085
+#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341
+#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527
+#: sql_help.c:3555 sql_help.c:3906 sql_help.c:4356 sql_help.c:4463
+#: sql_help.c:4470 sql_help.c:4476 sql_help.c:4487 sql_help.c:4490
+#: sql_help.c:4493
+msgid "argmode"
+msgstr "modo_arg"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912
+#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2067 sql_help.c:2086
+#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342
+#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528
+#: sql_help.c:3556 sql_help.c:4464 sql_help.c:4471 sql_help.c:4477
+#: sql_help.c:4488 sql_help.c:4491 sql_help.c:4494
+msgid "argname"
+msgstr "nome_arg"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2388 sql_help.c:2597
+#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440
+#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4465 sql_help.c:4472
+#: sql_help.c:4478 sql_help.c:4489 sql_help.c:4492 sql_help.c:4495
+msgid "argtype"
+msgstr "tipo_arg"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974
+#: sql_help.c:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343
+#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040
+#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742
+#: sql_help.c:3950 sql_help.c:4185 sql_help.c:4958
+msgid "option"
+msgstr "opzione"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433
+#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388
+msgid "where option can be:"
+msgstr "dove opzione può essere:"
+
+#: sql_help.c:116 sql_help.c:2209
+msgid "allowconn"
+msgstr "permetti_conn"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210
+#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227
+msgid "connlimit"
+msgstr "limite_conn"
+
+#: sql_help.c:118 sql_help.c:2211
+msgid "istemplate"
+msgstr "è_template"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4189
+msgid "new_tablespace"
+msgstr "nuovo_tablespace"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2398 sql_help.c:2601
+#: sql_help.c:3918 sql_help.c:4207 sql_help.c:4368 sql_help.c:4677
+msgid "configuration_parameter"
+msgstr "parametro_config"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344
+#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467
+#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626
+#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915
+#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014
+#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3951 sql_help.c:4678
+#: sql_help.c:4679 sql_help.c:4680 sql_help.c:4681
+msgid "value"
+msgstr "valore"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "ruolo_destinazione"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631
+#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3881 sql_help.c:3890
+#: sql_help.c:3909 sql_help.c:3921 sql_help.c:4331 sql_help.c:4340
+#: sql_help.c:4359 sql_help.c:4371
+msgid "schema_name"
+msgstr "nome_schema"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "grant_o_revoke_abbreviato"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "dove grant_o_revoke_abbreviato è uno di:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2437 sql_help.c:2438
+#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575
+#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667
+#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232
+#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3930 sql_help.c:3934
+#: sql_help.c:4380 sql_help.c:4384 sql_help.c:4699
+msgid "role_name"
+msgstr "nome_ruolo"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352
+#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774
+#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924
+#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3982
+#: sql_help.c:3997 sql_help.c:3999 sql_help.c:4086 sql_help.c:4089
+#: sql_help.c:4091 sql_help.c:4550 sql_help.c:4551 sql_help.c:4560
+#: sql_help.c:4607 sql_help.c:4608 sql_help.c:4609 sql_help.c:4610
+#: sql_help.c:4611 sql_help.c:4612 sql_help.c:4652 sql_help.c:4653
+#: sql_help.c:4658 sql_help.c:4663 sql_help.c:4807 sql_help.c:4808
+#: sql_help.c:4817 sql_help.c:4864 sql_help.c:4865 sql_help.c:4866
+#: sql_help.c:4867 sql_help.c:4868 sql_help.c:4869 sql_help.c:4923
+#: sql_help.c:4925 sql_help.c:4985 sql_help.c:5045 sql_help.c:5046
+#: sql_help.c:5055 sql_help.c:5102 sql_help.c:5103 sql_help.c:5104
+#: sql_help.c:5105 sql_help.c:5106 sql_help.c:5107
+msgid "expression"
+msgstr "espressione"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "vincolo_di_dominio"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852
+#: sql_help.c:1854 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351
+#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3994
+msgid "constraint_name"
+msgstr "nome_vincolo"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "nuovo_nome_vincolo"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "nuova_versione"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "oggetto_membro"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "dove oggetto_membro è:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856
+#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860
+#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869
+#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884
+#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894
+#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898
+#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902
+#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4453 sql_help.c:4458
+#: sql_help.c:4459 sql_help.c:4460 sql_help.c:4461 sql_help.c:4467
+#: sql_help.c:4468 sql_help.c:4473 sql_help.c:4474 sql_help.c:4479
+#: sql_help.c:4480 sql_help.c:4481 sql_help.c:4482 sql_help.c:4483
+#: sql_help.c:4484
+msgid "object_name"
+msgstr "nome_oggetto"
+
+#: sql_help.c:329 sql_help.c:1845 sql_help.c:4456
+msgid "aggregate_name"
+msgstr "nome_aggregato"
+
+#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135
+#: sql_help.c:2137 sql_help.c:3357
+msgid "source_type"
+msgstr "tipo_sorgente"
+
+#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136
+#: sql_help.c:2138 sql_help.c:3358
+msgid "target_type"
+msgstr "tipo_destinazione"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133
+#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549
+#: sql_help.c:3117 sql_help.c:4355 sql_help.c:4462 sql_help.c:4579
+#: sql_help.c:4583 sql_help.c:4587 sql_help.c:4590 sql_help.c:4836
+#: sql_help.c:4840 sql_help.c:4844 sql_help.c:4847 sql_help.c:5074
+#: sql_help.c:5078 sql_help.c:5082 sql_help.c:5085
+msgid "function_name"
+msgstr "nome_funzione"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542
+msgid "operator_name"
+msgstr "nome_operatore"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871
+#: sql_help.c:2519 sql_help.c:3481
+msgid "left_type"
+msgstr "tipo_sx"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872
+#: sql_help.c:2520 sql_help.c:3482
+msgid "right_type"
+msgstr "tipo_dx"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2539
+#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500
+msgid "index_method"
+msgstr "metodo_indice"
+
+#: sql_help.c:352 sql_help.c:1880 sql_help.c:4469
+msgid "procedure_name"
+msgstr "nome_procedura"
+
+#: sql_help.c:356 sql_help.c:1886 sql_help.c:3905 sql_help.c:4475
+msgid "routine_name"
+msgstr "nome_routine"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394
+#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662
+#: sql_help.c:3927 sql_help.c:4377
+msgid "type_name"
+msgstr "nome_di_tipo"
+
+#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599
+#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3912
+#: sql_help.c:4362
+msgid "lang_name"
+msgstr "nome_linguaggio"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "e signature_aggregato è:"
+
+#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275
+msgid "handler_function"
+msgstr "funzione_handler"
+
+#: sql_help.c:396 sql_help.c:2276
+msgid "validator_function"
+msgstr "funzione_validazione"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "azione"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851
+#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1983 sql_help.c:1984
+#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391
+#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629
+#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887
+#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919
+#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955
+#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978
+#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3884
+#: sql_help.c:3885 sql_help.c:3981 sql_help.c:3996 sql_help.c:3998
+#: sql_help.c:4000 sql_help.c:4085 sql_help.c:4088 sql_help.c:4090
+#: sql_help.c:4334 sql_help.c:4335 sql_help.c:4455 sql_help.c:4616
+#: sql_help.c:4622 sql_help.c:4624 sql_help.c:4873 sql_help.c:4879
+#: sql_help.c:4881 sql_help.c:4922 sql_help.c:4924 sql_help.c:4926
+#: sql_help.c:4973 sql_help.c:5111 sql_help.c:5117 sql_help.c:5119
+msgid "column_name"
+msgstr "nome_colonna"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "nuovo_nome_colonna"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "dove azione è una di:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2229
+#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888
+#: sql_help.c:3167 sql_help.c:4143
+msgid "data_type"
+msgstr "tipo_di_dato"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2230 sql_help.c:2329
+#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911
+#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3991
+msgid "collation"
+msgstr "ordinamento"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339
+#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920
+msgid "column_constraint"
+msgstr "vincolo_di_colonna"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4970
+msgid "integer"
+msgstr "intero"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "opzione_attributo"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340
+#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921
+msgid "table_constraint"
+msgstr "vincoli_di_tabella"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905
+msgid "trigger_name"
+msgstr "nome_trigger"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918
+msgid "parent_table"
+msgstr "tabella_padre"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2261
+msgid "extension_name"
+msgstr "nome_estensione"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395
+msgid "execution_cost"
+msgstr "costo_di_esecuzione"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396
+msgid "result_rows"
+msgstr "righe_risultato"
+
+#: sql_help.c:547 sql_help.c:2397
+msgid "support_function"
+msgstr "support_function"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2709
+#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3882
+#: sql_help.c:3883 sql_help.c:3887 sql_help.c:3888 sql_help.c:3891
+#: sql_help.c:3892 sql_help.c:3894 sql_help.c:3895 sql_help.c:3897
+#: sql_help.c:3898 sql_help.c:3900 sql_help.c:3901 sql_help.c:3903
+#: sql_help.c:3904 sql_help.c:3910 sql_help.c:3911 sql_help.c:3913
+#: sql_help.c:3914 sql_help.c:3916 sql_help.c:3917 sql_help.c:3919
+#: sql_help.c:3920 sql_help.c:3922 sql_help.c:3923 sql_help.c:3925
+#: sql_help.c:3926 sql_help.c:3928 sql_help.c:3929 sql_help.c:3931
+#: sql_help.c:3932 sql_help.c:4332 sql_help.c:4333 sql_help.c:4337
+#: sql_help.c:4338 sql_help.c:4341 sql_help.c:4342 sql_help.c:4344
+#: sql_help.c:4345 sql_help.c:4347 sql_help.c:4348 sql_help.c:4350
+#: sql_help.c:4351 sql_help.c:4353 sql_help.c:4354 sql_help.c:4360
+#: sql_help.c:4361 sql_help.c:4363 sql_help.c:4364 sql_help.c:4366
+#: sql_help.c:4367 sql_help.c:4369 sql_help.c:4370 sql_help.c:4372
+#: sql_help.c:4373 sql_help.c:4375 sql_help.c:4376 sql_help.c:4378
+#: sql_help.c:4379 sql_help.c:4381 sql_help.c:4382
+msgid "role_specification"
+msgstr "specifica_ruolo"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198
+#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4709
+msgid "user_name"
+msgstr "nome_utente"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716
+#: sql_help.c:3933 sql_help.c:4383
+msgid "where role_specification can be:"
+msgstr "dove specifica_ruolo può essere:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "nome_gruppo"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468
+#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930
+#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3924
+#: sql_help.c:4374
+msgid "tablespace_name"
+msgstr "nome_tablespace"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783
+msgid "index_name"
+msgstr "nome_indice"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2466 sql_help.c:2500
+#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969
+#: sql_help.c:2996
+msgid "storage_parameter"
+msgstr "parametro_di_memorizzazione"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "numero_colonna"
+
+#: sql_help.c:631 sql_help.c:1868 sql_help.c:4466
+msgid "large_object_oid"
+msgstr "oid_large_object"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889
+msgid "compression_method"
+msgstr "compression_method"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "new_access_method"
+
+#: sql_help.c:725 sql_help.c:2523
+msgid "res_proc"
+msgstr "res_proc"
+
+#: sql_help.c:726 sql_help.c:2524
+msgid "join_proc"
+msgstr "proc_join"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2541
+msgid "strategy_number"
+msgstr "strategia_num"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2543 sql_help.c:2544
+#: sql_help.c:2547 sql_help.c:2548
+msgid "op_type"
+msgstr "tipo_op"
+
+#: sql_help.c:782 sql_help.c:2545
+msgid "sort_family_name"
+msgstr "nome_famiglia_sort"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2546
+msgid "support_number"
+msgstr "num_supporto"
+
+#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087
+#: sql_help.c:3089
+msgid "argument_type"
+msgstr "tipo_argomento"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779
+#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891
+#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2324
+#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574
+#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770
+#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917
+#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517
+#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3880 sql_help.c:3886
+#: sql_help.c:3947 sql_help.c:3979 sql_help.c:4330 sql_help.c:4336
+#: sql_help.c:4454 sql_help.c:4565 sql_help.c:4567 sql_help.c:4629
+#: sql_help.c:4668 sql_help.c:4822 sql_help.c:4824 sql_help.c:4886
+#: sql_help.c:4920 sql_help.c:4972 sql_help.c:5060 sql_help.c:5062
+#: sql_help.c:5124
+msgid "table_name"
+msgstr "nome_tabella"
+
+#: sql_help.c:823 sql_help.c:2576
+msgid "using_expression"
+msgstr "espressione_using"
+
+#: sql_help.c:824 sql_help.c:2577
+msgid "check_expression"
+msgstr "espressione_check"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624
+msgid "publication_object"
+msgstr "publication_object"
+
+#: sql_help.c:903 sql_help.c:2625
+msgid "publication_parameter"
+msgstr "parametro_pubblicazione"
+
+#: sql_help.c:909 sql_help.c:2627
+msgid "where publication_object is one of:"
+msgstr "dove publication_object è uno di:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662
+#: sql_help.c:3228
+msgid "password"
+msgstr "password"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663
+#: sql_help.c:3229
+msgid "timestamp"
+msgstr "timestamp"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3893
+#: sql_help.c:4343
+msgid "database_name"
+msgstr "nome_database"
+
+#: sql_help.c:1073 sql_help.c:2732
+msgid "increment"
+msgstr "incremento"
+
+#: sql_help.c:1074 sql_help.c:2733
+msgid "minvalue"
+msgstr "valoremin"
+
+#: sql_help.c:1075 sql_help.c:2734
+msgid "maxvalue"
+msgstr "valoremax"
+
+#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4563 sql_help.c:4666
+#: sql_help.c:4820 sql_help.c:4989 sql_help.c:5058
+msgid "start"
+msgstr "inizio"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "riavvio"
+
+#: sql_help.c:1078 sql_help.c:2736
+msgid "cache"
+msgstr "cache"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "new_target"
+
+#: sql_help.c:1142 sql_help.c:2789
+msgid "conninfo"
+msgstr "conninfo"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790
+msgid "publication_name"
+msgstr "nome_pubblicazione"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "publication_option"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "opzione_refresh"
+
+#: sql_help.c:1161 sql_help.c:2791
+msgid "subscription_parameter"
+msgstr "parametro_sottoscrizione"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "skip_option"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "nome_partizione"
+
+#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922
+msgid "partition_bound_spec"
+msgstr "specifica_margine_partizione"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936
+msgid "sequence_options"
+msgstr "opzioni_sequenza"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "opzione_sequenza"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "vincoli_di_tabella_con_indice"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "nome_regola_di_riscrittura"
+
+#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961
+msgid "and partition_bound_spec is:"
+msgstr "e specifica_margine_partizione è:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354
+#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963
+#: sql_help.c:2964
+msgid "partition_bound_expr"
+msgstr "partition_bound_expr"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358
+#: sql_help.c:2965 sql_help.c:2966
+msgid "numeric_literal"
+msgstr "letterale_numerico"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "e vincolo_di_colonna è:"
+
+#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598
+#: sql_help.c:2934
+msgid "default_expr"
+msgstr "expr_default"
+
+#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935
+msgid "generation_expr"
+msgstr "generation_expr"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947
+#: sql_help.c:2949 sql_help.c:2953
+msgid "index_parameters"
+msgstr "parametri_di_indice"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956
+msgid "reftable"
+msgstr "tabella_ref"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957
+msgid "refcolumn"
+msgstr "colonna_ref"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959
+msgid "referential_action"
+msgstr "referential_action"
+
+#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943
+msgid "and table_constraint is:"
+msgstr "e vincolo_di_tabella è:"
+
+#: sql_help.c:1409 sql_help.c:2951
+msgid "exclude_element"
+msgstr "elemento_di_esclusione"
+
+#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4561 sql_help.c:4664
+#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056
+msgid "operator"
+msgstr "operatore"
+
+#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954
+msgid "predicate"
+msgstr "predicato"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "e vincolo_di_tabella_con_indice è:"
+
+#: sql_help.c:1421 sql_help.c:2967
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "parametri_di_indice nei vincoli UNIQUE, PRIMARY KEY e EXCLUDE sono:"
+
+#: sql_help.c:1426 sql_help.c:2972
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "elemento_di_esclusione in un vincolo EXCLUDE è:"
+
+#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912
+#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3992
+msgid "opclass"
+msgstr "classe_op"
+
+#: sql_help.c:1430 sql_help.c:2976
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "referential_action in un vincolo FOREIGN KEY/REFERENCES è:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013
+msgid "tablespace_option"
+msgstr "opzione_tablespace"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "tipo_di_token"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "nome_dizionario"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "vecchio_dizionario"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "nuovo_dizionario"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3166
+msgid "attribute_name"
+msgstr "nome_attributo"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "nuovo_nome_attributo"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "nuovo_valore_enum"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "valore_enum_vicino"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "valore_enum_esistente"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "proprietà"
+
+#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748
+#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3902 sql_help.c:3948
+#: sql_help.c:4352
+msgid "server_name"
+msgstr "nome_server"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261
+msgid "view_option_name"
+msgstr "nome_opzione_vista"
+
+#: sql_help.c:1698 sql_help.c:3262
+msgid "view_option_value"
+msgstr "valore_opzione_vista"
+
+#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4959 sql_help.c:4960
+msgid "table_and_columns"
+msgstr "tabelle_e_colonne"
+
+#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745
+#: sql_help.c:4187 sql_help.c:4961
+msgid "where option can be one of:"
+msgstr "dove opzione può essere una di:"
+
+#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977
+#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747
+#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4188 sql_help.c:4190
+#: sql_help.c:4962 sql_help.c:4963 sql_help.c:4964 sql_help.c:4965
+#: sql_help.c:4966 sql_help.c:4967 sql_help.c:4968 sql_help.c:4969
+msgid "boolean"
+msgstr "booleano"
+
+#: sql_help.c:1724 sql_help.c:4971
+msgid "and table_and_columns is:"
+msgstr "e tabelle_e_colonne è:"
+
+#: sql_help.c:1740 sql_help.c:4725 sql_help.c:4727 sql_help.c:4751
+msgid "transaction_mode"
+msgstr "modalità_transazione"
+
+#: sql_help.c:1741 sql_help.c:4728 sql_help.c:4752
+msgid "where transaction_mode is one of:"
+msgstr "dove modalità_transazione è una di:"
+
+#: sql_help.c:1750 sql_help.c:4571 sql_help.c:4580 sql_help.c:4584
+#: sql_help.c:4588 sql_help.c:4591 sql_help.c:4828 sql_help.c:4837
+#: sql_help.c:4841 sql_help.c:4845 sql_help.c:4848 sql_help.c:5066
+#: sql_help.c:5075 sql_help.c:5079 sql_help.c:5083 sql_help.c:5086
+msgid "argument"
+msgstr "argomento"
+
+#: sql_help.c:1850
+msgid "relation_name"
+msgstr "nome_relazione"
+
+#: sql_help.c:1855 sql_help.c:3896 sql_help.c:4346
+msgid "domain_name"
+msgstr "nome_dominio"
+
+#: sql_help.c:1877
+msgid "policy_name"
+msgstr "nome_regola"
+
+#: sql_help.c:1890
+msgid "rule_name"
+msgstr "nome_ruolo"
+
+#: sql_help.c:1909
+msgid "text"
+msgstr "testo"
+
+#: sql_help.c:1934 sql_help.c:4152 sql_help.c:4399
+msgid "transaction_id"
+msgstr "id_transazione"
+
+#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4018
+msgid "filename"
+msgstr "nome_file"
+
+#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688
+#: sql_help.c:2689
+msgid "command"
+msgstr "comando"
+
+#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297
+#: sql_help.c:4002 sql_help.c:4079 sql_help.c:4082 sql_help.c:4554
+#: sql_help.c:4556 sql_help.c:4657 sql_help.c:4659 sql_help.c:4811
+#: sql_help.c:4813 sql_help.c:4929 sql_help.c:5049 sql_help.c:5051
+msgid "condition"
+msgstr "condizione"
+
+#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263
+#: sql_help.c:3281 sql_help.c:3983
+msgid "query"
+msgstr "query"
+
+#: sql_help.c:1976
+msgid "format_name"
+msgstr "nome_formato"
+
+#: sql_help.c:1978
+msgid "delimiter_character"
+msgstr "carattere_delimitatore"
+
+#: sql_help.c:1979
+msgid "null_string"
+msgstr "stringa_nulla"
+
+#: sql_help.c:1981
+msgid "quote_character"
+msgstr "carattere_virgolette"
+
+#: sql_help.c:1982
+msgid "escape_character"
+msgstr "carattere_di_escape"
+
+#: sql_help.c:1986
+msgid "encoding_name"
+msgstr "nome_codifica"
+
+#: sql_help.c:1997
+msgid "access_method_type"
+msgstr "tipo_metodo_accesso"
+
+#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090
+msgid "arg_data_type"
+msgstr "topo_dato_argomento"
+
+#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099
+msgid "sfunc"
+msgstr "sfunz"
+
+#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100
+msgid "state_data_type"
+msgstr "tipo_dato_stato"
+
+#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101
+msgid "state_data_size"
+msgstr "dimensione_dato_stato"
+
+#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102
+msgid "ffunc"
+msgstr "ffunz"
+
+#: sql_help.c:2073 sql_help.c:2103
+msgid "combinefunc"
+msgstr "funz_combine"
+
+#: sql_help.c:2074 sql_help.c:2104
+msgid "serialfunc"
+msgstr "funz_serial"
+
+#: sql_help.c:2075 sql_help.c:2105
+msgid "deserialfunc"
+msgstr "funz_deserial"
+
+#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106
+msgid "initial_condition"
+msgstr "condizione_iniziale"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "msfunc"
+msgstr "msfunz"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "minvfunc"
+msgstr "minvfunz"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "mstate_data_type"
+msgstr "tipo_dato_mstato"
+
+#: sql_help.c:2080 sql_help.c:2110
+msgid "mstate_data_size"
+msgstr "tipo_dato_mstato"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "mffunc"
+msgstr "mffunz"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minitial_condition"
+msgstr "condizione_minima"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "sort_operator"
+msgstr "operatore_di_ordinamento"
+
+#: sql_help.c:2096
+msgid "or the old syntax"
+msgstr "o la vecchia sintassi"
+
+#: sql_help.c:2098
+msgid "base_type"
+msgstr "tipo_base"
+
+#: sql_help.c:2155 sql_help.c:2202
+msgid "locale"
+msgstr "locale"
+
+#: sql_help.c:2156 sql_help.c:2203
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2157 sql_help.c:2204
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2158 sql_help.c:4452
+msgid "provider"
+msgstr "provider"
+
+#: sql_help.c:2160 sql_help.c:2263
+msgid "version"
+msgstr "versione"
+
+#: sql_help.c:2162
+msgid "existing_collation"
+msgstr "ordinamento_esistente"
+
+#: sql_help.c:2172
+msgid "source_encoding"
+msgstr "codifica_origine"
+
+#: sql_help.c:2173
+msgid "dest_encoding"
+msgstr "codifica_destinazione"
+
+#: sql_help.c:2199 sql_help.c:3039
+msgid "template"
+msgstr "template"
+
+#: sql_help.c:2200
+msgid "encoding"
+msgstr "codifica"
+
+#: sql_help.c:2201
+msgid "strategy"
+msgstr "strategia"
+
+#: sql_help.c:2205
+msgid "icu_locale"
+msgstr "icu_locale"
+
+#: sql_help.c:2206
+msgid "locale_provider"
+msgstr "locale_provider"
+
+#: sql_help.c:2207
+msgid "collation_version"
+msgstr "collation_version"
+
+#: sql_help.c:2212
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2232
+msgid "constraint"
+msgstr "vincolo"
+
+#: sql_help.c:2233
+msgid "where constraint is:"
+msgstr "dove vincolo di è:"
+
+#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112
+msgid "event"
+msgstr "evento"
+
+#: sql_help.c:2248
+msgid "filter_variable"
+msgstr "valiabile_filtro"
+
+#: sql_help.c:2249
+msgid "filter_value"
+msgstr "filter_value"
+
+#: sql_help.c:2345 sql_help.c:2931
+msgid "where column_constraint is:"
+msgstr "dove vincolo_di_colonna è:"
+
+#: sql_help.c:2390
+msgid "rettype"
+msgstr "tipo_ritorno"
+
+#: sql_help.c:2392
+msgid "column_type"
+msgstr "tipo_colonna"
+
+#: sql_help.c:2401 sql_help.c:2604
+msgid "definition"
+msgstr "definizione"
+
+#: sql_help.c:2402 sql_help.c:2605
+msgid "obj_file"
+msgstr "file_obj"
+
+#: sql_help.c:2403 sql_help.c:2606
+msgid "link_symbol"
+msgstr "simbolo_link"
+
+#: sql_help.c:2404 sql_help.c:2607
+msgid "sql_body"
+msgstr "sql_body"
+
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913
+#: sql_help.c:2927 sql_help.c:2995
+msgid "method"
+msgstr "metodo"
+
+#: sql_help.c:2463
+msgid "opclass_parameter"
+msgstr "opclass_parameter"
+
+#: sql_help.c:2480
+msgid "call_handler"
+msgstr "handler_chiamata"
+
+#: sql_help.c:2481
+msgid "inline_handler"
+msgstr "handler_inline"
+
+#: sql_help.c:2482
+msgid "valfunction"
+msgstr "funzione_valid"
+
+#: sql_help.c:2521
+msgid "com_op"
+msgstr "com_op"
+
+#: sql_help.c:2522
+msgid "neg_op"
+msgstr "neg_op"
+
+#: sql_help.c:2540
+msgid "family_name"
+msgstr "nome_famiglia"
+
+#: sql_help.c:2551
+msgid "storage_type"
+msgstr "tipo_memorizzazione"
+
+#: sql_help.c:2690 sql_help.c:3119
+msgid "where event can be one of:"
+msgstr "dove evento può essere uno di:"
+
+#: sql_help.c:2710 sql_help.c:2712
+msgid "schema_element"
+msgstr "elemento_di_schema"
+
+#: sql_help.c:2749
+msgid "server_type"
+msgstr "tipo_di_server"
+
+#: sql_help.c:2750
+msgid "server_version"
+msgstr "versione_server"
+
+#: sql_help.c:2751 sql_help.c:3899 sql_help.c:4349
+msgid "fdw_name"
+msgstr "nome_fdw"
+
+#: sql_help.c:2768 sql_help.c:2771
+msgid "statistics_name"
+msgstr "nome_statistica"
+
+#: sql_help.c:2772
+msgid "statistics_kind"
+msgstr "tipo_statistica"
+
+#: sql_help.c:2788
+msgid "subscription_name"
+msgstr "nome_sottoscrizione"
+
+#: sql_help.c:2893
+msgid "source_table"
+msgstr "tabella_origine"
+
+#: sql_help.c:2894
+msgid "like_option"
+msgstr "opzioni_di_like"
+
+#: sql_help.c:2960
+msgid "and like_option is:"
+msgstr "e opzione_like è:"
+
+#: sql_help.c:3012
+msgid "directory"
+msgstr "directory"
+
+#: sql_help.c:3026
+msgid "parser_name"
+msgstr "nome_parser"
+
+#: sql_help.c:3027
+msgid "source_config"
+msgstr "config_origine"
+
+#: sql_help.c:3056
+msgid "start_function"
+msgstr "funzione_inizio"
+
+#: sql_help.c:3057
+msgid "gettoken_function"
+msgstr "funzione_gettoken"
+
+#: sql_help.c:3058
+msgid "end_function"
+msgstr "funzione_fine"
+
+#: sql_help.c:3059
+msgid "lextypes_function"
+msgstr "funzione_lextypes"
+
+#: sql_help.c:3060
+msgid "headline_function"
+msgstr "funzione_headline"
+
+#: sql_help.c:3072
+msgid "init_function"
+msgstr "funzione_init"
+
+#: sql_help.c:3073
+msgid "lexize_function"
+msgstr "funzione_lexize"
+
+#: sql_help.c:3086
+msgid "from_sql_function_name"
+msgstr "nome_funzione_from_sql"
+
+#: sql_help.c:3088
+msgid "to_sql_function_name"
+msgstr "nome_funzione_to_sql"
+
+#: sql_help.c:3114
+msgid "referenced_table_name"
+msgstr "nome_tabella_referenziata"
+
+#: sql_help.c:3115
+msgid "transition_relation_name"
+msgstr "nome_tabella_transizione"
+
+#: sql_help.c:3118
+msgid "arguments"
+msgstr "argomenti"
+
+#: sql_help.c:3170 sql_help.c:4485
+msgid "label"
+msgstr "etichetta"
+
+#: sql_help.c:3172
+msgid "subtype"
+msgstr "sottotipo"
+
+#: sql_help.c:3173
+msgid "subtype_operator_class"
+msgstr "classe_operatore_sottotipo"
+
+#: sql_help.c:3175
+msgid "canonical_function"
+msgstr "funzione_canonica"
+
+#: sql_help.c:3176
+msgid "subtype_diff_function"
+msgstr "funzione_diff_sottotipo"
+
+#: sql_help.c:3177
+msgid "multirange_type_name"
+msgstr "multirange_type_name"
+
+#: sql_help.c:3179
+msgid "input_function"
+msgstr "funzione_input"
+
+#: sql_help.c:3180
+msgid "output_function"
+msgstr "funzione_output"
+
+#: sql_help.c:3181
+msgid "receive_function"
+msgstr "funzione_receive"
+
+#: sql_help.c:3182
+msgid "send_function"
+msgstr "funzione_send"
+
+#: sql_help.c:3183
+msgid "type_modifier_input_function"
+msgstr "funzione_input_modificatore_tipo"
+
+#: sql_help.c:3184
+msgid "type_modifier_output_function"
+msgstr "funzione_output_modificatore_tipo"
+
+#: sql_help.c:3185
+msgid "analyze_function"
+msgstr "funzione_analyze"
+
+#: sql_help.c:3186
+msgid "subscript_function"
+msgstr "subscript_function"
+
+#: sql_help.c:3187
+msgid "internallength"
+msgstr "lunghezza_interna"
+
+#: sql_help.c:3188
+msgid "alignment"
+msgstr "allineamento"
+
+#: sql_help.c:3189
+msgid "storage"
+msgstr "memorizzazione"
+
+#: sql_help.c:3190
+msgid "like_type"
+msgstr "tipo_like"
+
+#: sql_help.c:3191
+msgid "category"
+msgstr "categoria"
+
+#: sql_help.c:3192
+msgid "preferred"
+msgstr "preferito"
+
+#: sql_help.c:3193
+msgid "default"
+msgstr "predefinito"
+
+#: sql_help.c:3194
+msgid "element"
+msgstr "elemento"
+
+#: sql_help.c:3195
+msgid "delimiter"
+msgstr "delimitatore"
+
+#: sql_help.c:3196
+msgid "collatable"
+msgstr "ordinabile"
+
+#: sql_help.c:3293 sql_help.c:3978 sql_help.c:4068 sql_help.c:4549
+#: sql_help.c:4651 sql_help.c:4806 sql_help.c:4919 sql_help.c:5044
+msgid "with_query"
+msgstr "query_with"
+
+#: sql_help.c:3295 sql_help.c:3980 sql_help.c:4568 sql_help.c:4574
+#: sql_help.c:4577 sql_help.c:4581 sql_help.c:4585 sql_help.c:4593
+#: sql_help.c:4825 sql_help.c:4831 sql_help.c:4834 sql_help.c:4838
+#: sql_help.c:4842 sql_help.c:4850 sql_help.c:4921 sql_help.c:5063
+#: sql_help.c:5069 sql_help.c:5072 sql_help.c:5076 sql_help.c:5080
+#: sql_help.c:5088
+msgid "alias"
+msgstr "alias"
+
+#: sql_help.c:3296 sql_help.c:4553 sql_help.c:4595 sql_help.c:4597
+#: sql_help.c:4601 sql_help.c:4603 sql_help.c:4604 sql_help.c:4605
+#: sql_help.c:4656 sql_help.c:4810 sql_help.c:4852 sql_help.c:4854
+#: sql_help.c:4858 sql_help.c:4860 sql_help.c:4861 sql_help.c:4862
+#: sql_help.c:4928 sql_help.c:5048 sql_help.c:5090 sql_help.c:5092
+#: sql_help.c:5096 sql_help.c:5098 sql_help.c:5099 sql_help.c:5100
+msgid "from_item"
+msgstr "elemento_from"
+
+#: sql_help.c:3298 sql_help.c:3780 sql_help.c:4119 sql_help.c:4930
+msgid "cursor_name"
+msgstr "nome_cursore"
+
+#: sql_help.c:3299 sql_help.c:3986 sql_help.c:4931
+msgid "output_expression"
+msgstr "espressione_output"
+
+#: sql_help.c:3300 sql_help.c:3987 sql_help.c:4552 sql_help.c:4654
+#: sql_help.c:4809 sql_help.c:4932 sql_help.c:5047
+msgid "output_name"
+msgstr "nome_output"
+
+#: sql_help.c:3316
+msgid "code"
+msgstr "codice"
+
+#: sql_help.c:3721
+msgid "parameter"
+msgstr "parametro"
+
+#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4144
+msgid "statement"
+msgstr "istruzione"
+
+#: sql_help.c:3779 sql_help.c:3781 sql_help.c:4118 sql_help.c:4120
+msgid "direction"
+msgstr "direzione"
+
+#: sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 sql_help.c:3785
+#: sql_help.c:3786 sql_help.c:4121 sql_help.c:4122 sql_help.c:4123
+#: sql_help.c:4124 sql_help.c:4125 sql_help.c:4562 sql_help.c:4564
+#: sql_help.c:4665 sql_help.c:4667 sql_help.c:4819 sql_help.c:4821
+#: sql_help.c:4988 sql_help.c:4990 sql_help.c:5057 sql_help.c:5059
+msgid "count"
+msgstr "conteggio"
+
+#: sql_help.c:3889 sql_help.c:4339
+msgid "sequence_name"
+msgstr "nome_sequenza"
+
+#: sql_help.c:3907 sql_help.c:4357
+msgid "arg_name"
+msgstr "nome_arg"
+
+#: sql_help.c:3908 sql_help.c:4358
+msgid "arg_type"
+msgstr "tipo_arg"
+
+#: sql_help.c:3915 sql_help.c:4365
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3946
+msgid "remote_schema"
+msgstr "schema_remoto"
+
+#: sql_help.c:3949
+msgid "local_schema"
+msgstr "schema_locale"
+
+#: sql_help.c:3984
+msgid "conflict_target"
+msgstr "target_conflitto"
+
+#: sql_help.c:3985
+msgid "conflict_action"
+msgstr "azione_conflitto"
+
+#: sql_help.c:3988
+msgid "where conflict_target can be one of:"
+msgstr "dove target_conflitto può essere uno di:"
+
+#: sql_help.c:3989
+msgid "index_column_name"
+msgstr "nome_colonna_indice"
+
+#: sql_help.c:3990
+msgid "index_expression"
+msgstr "espressione_indice"
+
+#: sql_help.c:3993
+msgid "index_predicate"
+msgstr "indice_predicato"
+
+#: sql_help.c:3995
+msgid "and conflict_action is one of:"
+msgstr "e azione_conflitto è una di:"
+
+#: sql_help.c:4001 sql_help.c:4927
+msgid "sub-SELECT"
+msgstr "sub-SELECT"
+
+#: sql_help.c:4010 sql_help.c:4133 sql_help.c:4903
+msgid "channel"
+msgstr "canale"
+
+#: sql_help.c:4032
+msgid "lockmode"
+msgstr "modalità_lock"
+
+#: sql_help.c:4033
+msgid "where lockmode is one of:"
+msgstr "dove modalità_lock è una di:"
+
+#: sql_help.c:4069
+msgid "target_table_name"
+msgstr "target_table_name"
+
+#: sql_help.c:4070
+msgid "target_alias"
+msgstr "target_alias"
+
+#: sql_help.c:4071
+msgid "data_source"
+msgstr "data_source"
+
+#: sql_help.c:4072 sql_help.c:4598 sql_help.c:4855 sql_help.c:5093
+msgid "join_condition"
+msgstr "condizione_join"
+
+#: sql_help.c:4073
+msgid "when_clause"
+msgstr "when_clause"
+
+#: sql_help.c:4074
+msgid "where data_source is:"
+msgstr "dove data_source è:"
+
+#: sql_help.c:4075
+msgid "source_table_name"
+msgstr "source_table_name"
+
+#: sql_help.c:4076
+msgid "source_query"
+msgstr "source_query"
+
+#: sql_help.c:4077
+msgid "source_alias"
+msgstr "source_alias"
+
+#: sql_help.c:4078
+msgid "and when_clause is:"
+msgstr "e when_clause è:"
+
+#: sql_help.c:4080
+msgid "merge_update"
+msgstr "merge_update"
+
+#: sql_help.c:4081
+msgid "merge_delete"
+msgstr "merge_delete"
+
+#: sql_help.c:4083
+msgid "merge_insert"
+msgstr "merge_insert"
+
+#: sql_help.c:4084
+msgid "and merge_insert is:"
+msgstr "e merge_insert è:"
+
+#: sql_help.c:4087
+msgid "and merge_update is:"
+msgstr "e merge_update è:"
+
+#: sql_help.c:4092
+msgid "and merge_delete is:"
+msgstr "and merge_delete is:"
+
+#: sql_help.c:4134
+msgid "payload"
+msgstr "payload"
+
+#: sql_help.c:4161
+msgid "old_role"
+msgstr "vecchio_ruolo"
+
+#: sql_help.c:4162
+msgid "new_role"
+msgstr "nuovo_ruolo"
+
+#: sql_help.c:4198 sql_help.c:4407 sql_help.c:4415
+msgid "savepoint_name"
+msgstr "nome_punto_salvataggio"
+
+#: sql_help.c:4555 sql_help.c:4613 sql_help.c:4812 sql_help.c:4870
+#: sql_help.c:5050 sql_help.c:5108
+msgid "grouping_element"
+msgstr "elemento_raggruppante"
+
+#: sql_help.c:4557 sql_help.c:4660 sql_help.c:4814 sql_help.c:5052
+msgid "window_name"
+msgstr "nome_finestra"
+
+#: sql_help.c:4558 sql_help.c:4661 sql_help.c:4815 sql_help.c:5053
+msgid "window_definition"
+msgstr "definizione_finestra"
+
+#: sql_help.c:4559 sql_help.c:4573 sql_help.c:4617 sql_help.c:4662
+#: sql_help.c:4816 sql_help.c:4830 sql_help.c:4874 sql_help.c:5054
+#: sql_help.c:5068 sql_help.c:5112
+msgid "select"
+msgstr "select"
+
+#: sql_help.c:4566 sql_help.c:4823 sql_help.c:5061
+msgid "where from_item can be one of:"
+msgstr "dove from_item può essere uno di:"
+
+#: sql_help.c:4569 sql_help.c:4575 sql_help.c:4578 sql_help.c:4582
+#: sql_help.c:4594 sql_help.c:4826 sql_help.c:4832 sql_help.c:4835
+#: sql_help.c:4839 sql_help.c:4851 sql_help.c:5064 sql_help.c:5070
+#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5089
+msgid "column_alias"
+msgstr "alias_colonna"
+
+#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065
+msgid "sampling_method"
+msgstr "metodo_di_campionamento"
+
+#: sql_help.c:4572 sql_help.c:4829 sql_help.c:5067
+msgid "seed"
+msgstr "seme"
+
+#: sql_help.c:4576 sql_help.c:4615 sql_help.c:4833 sql_help.c:4872
+#: sql_help.c:5071 sql_help.c:5110
+msgid "with_query_name"
+msgstr "nome_query_with"
+
+#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4592 sql_help.c:4843
+#: sql_help.c:4846 sql_help.c:4849 sql_help.c:5081 sql_help.c:5084
+#: sql_help.c:5087
+msgid "column_definition"
+msgstr "definizione_colonna"
+
+#: sql_help.c:4596 sql_help.c:4602 sql_help.c:4853 sql_help.c:4859
+#: sql_help.c:5091 sql_help.c:5097
+msgid "join_type"
+msgstr "tipo_join"
+
+#: sql_help.c:4599 sql_help.c:4856 sql_help.c:5094
+msgid "join_column"
+msgstr "colonna_join"
+
+#: sql_help.c:4600 sql_help.c:4857 sql_help.c:5095
+msgid "join_using_alias"
+msgstr "join_using_alias"
+
+#: sql_help.c:4606 sql_help.c:4863 sql_help.c:5101
+msgid "and grouping_element can be one of:"
+msgstr "e elemento_raggruppante può essere uno di:"
+
+#: sql_help.c:4614 sql_help.c:4871 sql_help.c:5109
+msgid "and with_query is:"
+msgstr "e with_query è:"
+
+#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113
+msgid "values"
+msgstr "valori"
+
+#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4620 sql_help.c:4877 sql_help.c:5115
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118
+msgid "search_seq_col_name"
+msgstr "search_seq_col_name"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120
+msgid "cycle_mark_col_name"
+msgstr "cycle_mark_col_name"
+
+#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121
+msgid "cycle_mark_value"
+msgstr "cycle_mark_value"
+
+#: sql_help.c:4627 sql_help.c:4884 sql_help.c:5122
+msgid "cycle_mark_default"
+msgstr "cycle_mark_default"
+
+#: sql_help.c:4628 sql_help.c:4885 sql_help.c:5123
+msgid "cycle_path_col_name"
+msgstr "cycle_path_col_name"
+
+#: sql_help.c:4655
+msgid "new_table"
+msgstr "nuova_tabella"
+
+#: sql_help.c:4726
+msgid "snapshot_id"
+msgstr "id_snapshot"
+
+#: sql_help.c:4986
+msgid "sort_expression"
+msgstr "espressione_ordinamento"
+
+#: sql_help.c:5130 sql_help.c:6114
+msgid "abort the current transaction"
+msgstr "annulla la transazione corrente"
+
+#: sql_help.c:5136
+msgid "change the definition of an aggregate function"
+msgstr "cambia la definizione di una funzione di aggregazione"
+
+#: sql_help.c:5142
+msgid "change the definition of a collation"
+msgstr "cambia la definizione di un ordinamento"
+
+#: sql_help.c:5148
+msgid "change the definition of a conversion"
+msgstr "cambia la definizione di una conversione"
+
+#: sql_help.c:5154
+msgid "change a database"
+msgstr "cambia un database"
+
+#: sql_help.c:5160
+msgid "define default access privileges"
+msgstr "definisci i privilegi di accesso di default"
+
+#: sql_help.c:5166
+msgid "change the definition of a domain"
+msgstr "cambia la definizione di un dominio"
+
+#: sql_help.c:5172
+msgid "change the definition of an event trigger"
+msgstr "cambia la definizione di un trigger di evento"
+
+#: sql_help.c:5178
+msgid "change the definition of an extension"
+msgstr "cambia la definizione di una estensione"
+
+#: sql_help.c:5184
+msgid "change the definition of a foreign-data wrapper"
+msgstr "cambia la definizione di un wrapper di dati esterni"
+
+#: sql_help.c:5190
+msgid "change the definition of a foreign table"
+msgstr "cambia la definizione di una tabella esterna"
+
+#: sql_help.c:5196
+msgid "change the definition of a function"
+msgstr "cambia la definizione di una funzione"
+
+#: sql_help.c:5202
+msgid "change role name or membership"
+msgstr "cambia il nome del ruolo o l'appartenenza"
+
+#: sql_help.c:5208
+msgid "change the definition of an index"
+msgstr "cambia la definizione di un indice"
+
+#: sql_help.c:5214
+msgid "change the definition of a procedural language"
+msgstr "cambia la definizione di un linguaggio procedurale"
+
+#: sql_help.c:5220
+msgid "change the definition of a large object"
+msgstr "cambia la definizione di un large object"
+
+#: sql_help.c:5226
+msgid "change the definition of a materialized view"
+msgstr "cambia la definizione di una vista materializzata"
+
+#: sql_help.c:5232
+msgid "change the definition of an operator"
+msgstr "cambia la definizione di un operatore"
+
+#: sql_help.c:5238
+msgid "change the definition of an operator class"
+msgstr "cambia la definizione di una classe di operatori"
+
+#: sql_help.c:5244
+msgid "change the definition of an operator family"
+msgstr "cambia la definizione di una famiglia di operatori"
+
+#: sql_help.c:5250
+msgid "change the definition of a row-level security policy"
+msgstr "cambia la definizione di una regola di sicurezza per riga"
+
+#: sql_help.c:5256
+msgid "change the definition of a procedure"
+msgstr "cambia la definizione di una procedura"
+
+#: sql_help.c:5262
+msgid "change the definition of a publication"
+msgstr "cambia la definizione di una pubblicazione"
+
+#: sql_help.c:5268 sql_help.c:5370
+msgid "change a database role"
+msgstr "cambia un ruolo di database"
+
+#: sql_help.c:5274
+msgid "change the definition of a routine"
+msgstr "cambia la definizione di una routine"
+
+#: sql_help.c:5280
+msgid "change the definition of a rule"
+msgstr "cambia la definizione di una regola"
+
+#: sql_help.c:5286
+msgid "change the definition of a schema"
+msgstr "cambia la definizione di uno schema"
+
+#: sql_help.c:5292
+msgid "change the definition of a sequence generator"
+msgstr "cambia la definizione di un generatore di sequenza"
+
+#: sql_help.c:5298
+msgid "change the definition of a foreign server"
+msgstr "cambia la definizione di un server esterno"
+
+#: sql_help.c:5304
+msgid "change the definition of an extended statistics object"
+msgstr "cambia la definizione di una statistica estesa"
+
+#: sql_help.c:5310
+msgid "change the definition of a subscription"
+msgstr "cambia la definizione di una sottoscrizione"
+
+#: sql_help.c:5316
+msgid "change a server configuration parameter"
+msgstr "cambia un parametro di configurazione del server"
+
+#: sql_help.c:5322
+msgid "change the definition of a table"
+msgstr "cambia la definizione di una tabella"
+
+#: sql_help.c:5328
+msgid "change the definition of a tablespace"
+msgstr "cambia la definizione di un tablespace"
+
+#: sql_help.c:5334
+msgid "change the definition of a text search configuration"
+msgstr "cambia la definizione di una configurazione di ricerca testo"
+
+#: sql_help.c:5340
+msgid "change the definition of a text search dictionary"
+msgstr "cambia la definizione di un dizionario di ricerca testo"
+
+#: sql_help.c:5346
+msgid "change the definition of a text search parser"
+msgstr "cambia la definizione di un analizzatore di ricerca testo"
+
+#: sql_help.c:5352
+msgid "change the definition of a text search template"
+msgstr "cambia la definizione di un modello di ricerca testo"
+
+#: sql_help.c:5358
+msgid "change the definition of a trigger"
+msgstr "cambia la definizione di un trigger"
+
+#: sql_help.c:5364
+msgid "change the definition of a type"
+msgstr "cambia la definizione di un tipo di dato"
+
+#: sql_help.c:5376
+msgid "change the definition of a user mapping"
+msgstr "cambia la definizione di una mappatura degli"
+
+#: sql_help.c:5382
+msgid "change the definition of a view"
+msgstr "cambia la definizione di una vista"
+
+#: sql_help.c:5388
+msgid "collect statistics about a database"
+msgstr "raccogli statistiche sul database"
+
+#: sql_help.c:5394 sql_help.c:6192
+msgid "start a transaction block"
+msgstr "avvia un blocco di transazione"
+
+#: sql_help.c:5400
+msgid "invoke a procedure"
+msgstr "esegui una procedura"
+
+#: sql_help.c:5406
+msgid "force a write-ahead log checkpoint"
+msgstr "forza un checkpoint del write-ahead log"
+
+#: sql_help.c:5412
+msgid "close a cursor"
+msgstr "chiudi un cursore"
+
+#: sql_help.c:5418
+msgid "cluster a table according to an index"
+msgstr "raggruppa una tabella in base ad un indice"
+
+#: sql_help.c:5424
+msgid "define or change the comment of an object"
+msgstr "definisci o modifica il commento di un oggetto"
+
+#: sql_help.c:5430 sql_help.c:5988
+msgid "commit the current transaction"
+msgstr "rendi persistente la transazione corrente"
+
+#: sql_help.c:5436
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "concludi transazione che è stata precedentemente preparata per un commit a due fasi"
+
+#: sql_help.c:5442
+msgid "copy data between a file and a table"
+msgstr "copia i dati tra un file ed una tabella"
+
+#: sql_help.c:5448
+msgid "define a new access method"
+msgstr "definisci un nuovo metodo di accesso"
+
+#: sql_help.c:5454
+msgid "define a new aggregate function"
+msgstr "definisci una nuova funzione aggregata"
+
+#: sql_help.c:5460
+msgid "define a new cast"
+msgstr "definisci una nuova conversione di tipi"
+
+#: sql_help.c:5466
+msgid "define a new collation"
+msgstr "definisci un nuovo ordinamento"
+
+#: sql_help.c:5472
+msgid "define a new encoding conversion"
+msgstr "definisci una nuova conversione di codifica"
+
+#: sql_help.c:5478
+msgid "create a new database"
+msgstr "crea un nuovo database"
+
+#: sql_help.c:5484
+msgid "define a new domain"
+msgstr "definisci un nuovo dominio"
+
+#: sql_help.c:5490
+msgid "define a new event trigger"
+msgstr "definisci un nuovo trigger di evento"
+
+#: sql_help.c:5496
+msgid "install an extension"
+msgstr "installa un'estensione"
+
+#: sql_help.c:5502
+msgid "define a new foreign-data wrapper"
+msgstr "definisci un nuovo wrapper di dati esterni"
+
+#: sql_help.c:5508
+msgid "define a new foreign table"
+msgstr "definisci una nuova tabella esterna"
+
+#: sql_help.c:5514
+msgid "define a new function"
+msgstr "definisci una nuova funzione"
+
+#: sql_help.c:5520 sql_help.c:5580 sql_help.c:5682
+msgid "define a new database role"
+msgstr "definisci un nuovo ruolo database"
+
+#: sql_help.c:5526
+msgid "define a new index"
+msgstr "crea un nuovo indice"
+
+#: sql_help.c:5532
+msgid "define a new procedural language"
+msgstr "definisci un nuovo linguaggio procedurale"
+
+#: sql_help.c:5538
+msgid "define a new materialized view"
+msgstr "definisci una nuova vista materializzata"
+
+#: sql_help.c:5544
+msgid "define a new operator"
+msgstr "definisci un nuovo operatore"
+
+#: sql_help.c:5550
+msgid "define a new operator class"
+msgstr "definisci una nuova classe di operatori"
+
+#: sql_help.c:5556
+msgid "define a new operator family"
+msgstr "definisci una nuova famiglia operatore"
+
+#: sql_help.c:5562
+msgid "define a new row-level security policy for a table"
+msgstr "definisci una nuova regola di sicurezza per riga per una tabella"
+
+#: sql_help.c:5568
+msgid "define a new procedure"
+msgstr "definisci una nuova procedura"
+
+#: sql_help.c:5574
+msgid "define a new publication"
+msgstr "definisci una nuova pubblicazione"
+
+#: sql_help.c:5586
+msgid "define a new rewrite rule"
+msgstr "definisci una nuova regola di riscrittura"
+
+#: sql_help.c:5592
+msgid "define a new schema"
+msgstr "crea un nuovo schema"
+
+#: sql_help.c:5598
+msgid "define a new sequence generator"
+msgstr "definisci un nuovo generatore di sequenze"
+
+#: sql_help.c:5604
+msgid "define a new foreign server"
+msgstr "definisci un nuovo server esterno"
+
+#: sql_help.c:5610
+msgid "define extended statistics"
+msgstr "definisci una statistica estesa"
+
+#: sql_help.c:5616
+msgid "define a new subscription"
+msgstr "definisci una nuova sottoscrizione"
+
+#: sql_help.c:5622
+msgid "define a new table"
+msgstr "crea una nuova tabella"
+
+#: sql_help.c:5628 sql_help.c:6150
+msgid "define a new table from the results of a query"
+msgstr "crea una nuova tabella dai risultati di una query"
+
+#: sql_help.c:5634
+msgid "define a new tablespace"
+msgstr "crea un nuovo tablespace"
+
+#: sql_help.c:5640
+msgid "define a new text search configuration"
+msgstr "definisci una nuova configurazione di ricerca testo"
+
+#: sql_help.c:5646
+msgid "define a new text search dictionary"
+msgstr "definisci un nuovo dizionario di ricerca testo"
+
+#: sql_help.c:5652
+msgid "define a new text search parser"
+msgstr "definisci un nuovo analizzatore di ricerca testo"
+
+#: sql_help.c:5658
+msgid "define a new text search template"
+msgstr "definisci un nuovo modello di ricerca testo"
+
+#: sql_help.c:5664
+msgid "define a new transform"
+msgstr "definisci una nuova trasformazione"
+
+#: sql_help.c:5670
+msgid "define a new trigger"
+msgstr "definisci un nuovo trigger"
+
+#: sql_help.c:5676
+msgid "define a new data type"
+msgstr "definisci un nuovo tipo di dato"
+
+#: sql_help.c:5688
+msgid "define a new mapping of a user to a foreign server"
+msgstr "definisci una nuova mappatura di un utente ad un server esterno"
+
+#: sql_help.c:5694
+msgid "define a new view"
+msgstr "definisci una nuova vista"
+
+#: sql_help.c:5700
+msgid "deallocate a prepared statement"
+msgstr "dealloca una istruzione preparata"
+
+#: sql_help.c:5706
+msgid "define a cursor"
+msgstr "definisci un cursore"
+
+#: sql_help.c:5712
+msgid "delete rows of a table"
+msgstr "elimina le righe di una tabella"
+
+#: sql_help.c:5718
+msgid "discard session state"
+msgstr "cancella lo stato della sessione"
+
+#: sql_help.c:5724
+msgid "execute an anonymous code block"
+msgstr "esegui un blocco di codice anonimo"
+
+#: sql_help.c:5730
+msgid "remove an access method"
+msgstr "rimuovi un metodo di accesso"
+
+#: sql_help.c:5736
+msgid "remove an aggregate function"
+msgstr "elimina una funzione aggregata"
+
+#: sql_help.c:5742
+msgid "remove a cast"
+msgstr "elimina una conversione di tipi"
+
+#: sql_help.c:5748
+msgid "remove a collation"
+msgstr "elimina un ordinamento"
+
+#: sql_help.c:5754
+msgid "remove a conversion"
+msgstr "elimina una conversione"
+
+#: sql_help.c:5760
+msgid "remove a database"
+msgstr "elimina un database"
+
+#: sql_help.c:5766
+msgid "remove a domain"
+msgstr "elimina un dominio"
+
+#: sql_help.c:5772
+msgid "remove an event trigger"
+msgstr "elimina un trigger di evento"
+
+#: sql_help.c:5778
+msgid "remove an extension"
+msgstr "elimina una estensione"
+
+#: sql_help.c:5784
+msgid "remove a foreign-data wrapper"
+msgstr "elimina un wrapper di dati esterni"
+
+#: sql_help.c:5790
+msgid "remove a foreign table"
+msgstr "elimina una tabella esterna"
+
+#: sql_help.c:5796
+msgid "remove a function"
+msgstr "elimina una funzione"
+
+#: sql_help.c:5802 sql_help.c:5868 sql_help.c:5970
+msgid "remove a database role"
+msgstr "elimina un ruolo di database"
+
+#: sql_help.c:5808
+msgid "remove an index"
+msgstr "elimina un indice"
+
+#: sql_help.c:5814
+msgid "remove a procedural language"
+msgstr "elimina un linguaggio procedurale"
+
+#: sql_help.c:5820
+msgid "remove a materialized view"
+msgstr "elimina una vista materializzata"
+
+#: sql_help.c:5826
+msgid "remove an operator"
+msgstr "elimina un operatore"
+
+#: sql_help.c:5832
+msgid "remove an operator class"
+msgstr "elimina una classe di operatori"
+
+#: sql_help.c:5838
+msgid "remove an operator family"
+msgstr "elimina una famiglia operatore"
+
+#: sql_help.c:5844
+msgid "remove database objects owned by a database role"
+msgstr "elimina gli oggetti database di proprietà di un ruolo di database"
+
+#: sql_help.c:5850
+msgid "remove a row-level security policy from a table"
+msgstr "rimuovi una regola di sicurezza per riga da una tabella"
+
+#: sql_help.c:5856
+msgid "remove a procedure"
+msgstr "rimuovi una procedura"
+
+#: sql_help.c:5862
+msgid "remove a publication"
+msgstr "rimuovi una pubblicazione"
+
+#: sql_help.c:5874
+msgid "remove a routine"
+msgstr "rimuovi una routine"
+
+#: sql_help.c:5880
+msgid "remove a rewrite rule"
+msgstr "elimina una regola di riscrittura"
+
+#: sql_help.c:5886
+msgid "remove a schema"
+msgstr "elimina uno schema"
+
+#: sql_help.c:5892
+msgid "remove a sequence"
+msgstr "elimina una sequenza"
+
+#: sql_help.c:5898
+msgid "remove a foreign server descriptor"
+msgstr "elimina una descrizione server esterno"
+
+#: sql_help.c:5904
+msgid "remove extended statistics"
+msgstr "rimuovi una statistica estesa"
+
+#: sql_help.c:5910
+msgid "remove a subscription"
+msgstr "rimuovi una sottoscrizione"
+
+#: sql_help.c:5916
+msgid "remove a table"
+msgstr "elimina una tabella"
+
+#: sql_help.c:5922
+msgid "remove a tablespace"
+msgstr "elimina un tablespace"
+
+#: sql_help.c:5928
+msgid "remove a text search configuration"
+msgstr "elimina una configurazione di ricerca testo"
+
+#: sql_help.c:5934
+msgid "remove a text search dictionary"
+msgstr "elimina un dizionario di ricerca testo"
+
+#: sql_help.c:5940
+msgid "remove a text search parser"
+msgstr "elimina un analizzatore di ricerca testo"
+
+#: sql_help.c:5946
+msgid "remove a text search template"
+msgstr "elimina un modello di ricerca testo"
+
+#: sql_help.c:5952
+msgid "remove a transform"
+msgstr "elimina una trasformazione"
+
+#: sql_help.c:5958
+msgid "remove a trigger"
+msgstr "elimina un trigger"
+
+#: sql_help.c:5964
+msgid "remove a data type"
+msgstr "elimina un tipo di dato"
+
+#: sql_help.c:5976
+msgid "remove a user mapping for a foreign server"
+msgstr "elimina la mappatura degli utenti per un server esterno"
+
+#: sql_help.c:5982
+msgid "remove a view"
+msgstr "elimina una vista"
+
+#: sql_help.c:5994
+msgid "execute a prepared statement"
+msgstr "esegui una istruzione preparata"
+
+#: sql_help.c:6000
+msgid "show the execution plan of a statement"
+msgstr "mostra il piano di esecuzione di una istruzione"
+
+#: sql_help.c:6006
+msgid "retrieve rows from a query using a cursor"
+msgstr "estrai delle righe da una query utilizzando un cursore"
+
+#: sql_help.c:6012
+msgid "define access privileges"
+msgstr "definisci i privilegi di accesso"
+
+#: sql_help.c:6018
+msgid "import table definitions from a foreign server"
+msgstr "importa le definizioni di tabella da un server remoto"
+
+#: sql_help.c:6024
+msgid "create new rows in a table"
+msgstr "crea nuove righe in una tabella"
+
+#: sql_help.c:6030
+msgid "listen for a notification"
+msgstr "attendi l'arrivo di notifiche"
+
+#: sql_help.c:6036
+msgid "load a shared library file"
+msgstr "carica un file di libreria condivisa"
+
+#: sql_help.c:6042
+msgid "lock a table"
+msgstr "blocca una tabella"
+
+#: sql_help.c:6048
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "inserire, aggiornare o eliminare condizionalmente le righe di una tabella"
+
+#: sql_help.c:6054
+msgid "position a cursor"
+msgstr "posiziona un cursore"
+
+#: sql_help.c:6060
+msgid "generate a notification"
+msgstr "genera una notifica"
+
+#: sql_help.c:6066
+msgid "prepare a statement for execution"
+msgstr "prepara una istruzione per l'esecuzione"
+
+#: sql_help.c:6072
+msgid "prepare the current transaction for two-phase commit"
+msgstr "prepara la transazione corrente per un commit a due fasi"
+
+#: sql_help.c:6078
+msgid "change the ownership of database objects owned by a database role"
+msgstr "cambia il proprietario degli oggetti del database posseduti da un ruolo"
+
+#: sql_help.c:6084
+msgid "replace the contents of a materialized view"
+msgstr "sostituisci il contenuto di una vista materializzata"
+
+#: sql_help.c:6090
+msgid "rebuild indexes"
+msgstr "ricostruisci indici"
+
+#: sql_help.c:6096
+msgid "destroy a previously defined savepoint"
+msgstr "distruggi un punto di salvataggio precedentemente definito"
+
+#: sql_help.c:6102
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "ripristina un parametro di esecuzione al suo valore di predefinito"
+
+#: sql_help.c:6108
+msgid "remove access privileges"
+msgstr "elimina i privilegi di accesso"
+
+#: sql_help.c:6120
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "annulla una transazione che era stata preparata per un commit a due fasi"
+
+#: sql_help.c:6126
+msgid "roll back to a savepoint"
+msgstr "annulla le modifiche fino a un punto di salvataggio"
+
+#: sql_help.c:6132
+msgid "define a new savepoint within the current transaction"
+msgstr "definisci un nuovo punto di salvataggio per la transazione corrente"
+
+#: sql_help.c:6138
+msgid "define or change a security label applied to an object"
+msgstr "definisci o modifica un'etichetta di sicurezza applicata a un oggetto"
+
+#: sql_help.c:6144 sql_help.c:6198 sql_help.c:6234
+msgid "retrieve rows from a table or view"
+msgstr "estrai righe da una tabella o una vista"
+
+#: sql_help.c:6156
+msgid "change a run-time parameter"
+msgstr "modifica un parametro di esecuzione"
+
+#: sql_help.c:6162
+msgid "set constraint check timing for the current transaction"
+msgstr "imposta il momento del controllo dei vincoli per la transazione corrente"
+
+#: sql_help.c:6168
+msgid "set the current user identifier of the current session"
+msgstr "imposta l'identificativo utente della sessione corrente"
+
+#: sql_help.c:6174
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "imposta l'identificazione utente della sessione e l'identificazione utente corrente della sessione corrente"
+
+#: sql_help.c:6180
+msgid "set the characteristics of the current transaction"
+msgstr "imposta le caratteristiche della transazione corrente"
+
+#: sql_help.c:6186
+msgid "show the value of a run-time parameter"
+msgstr "mostra il valore di un parametro di esecuzione"
+
+#: sql_help.c:6204
+msgid "empty a table or set of tables"
+msgstr "svuota una tabella o una lista di tabelle"
+
+#: sql_help.c:6210
+msgid "stop listening for a notification"
+msgstr "termina l'attesa di notifiche"
+
+#: sql_help.c:6216
+msgid "update rows of a table"
+msgstr "modifica le righe di una tabella"
+
+#: sql_help.c:6222
+msgid "garbage-collect and optionally analyze a database"
+msgstr "pulisci ed eventualmente analizza il database"
+
+#: sql_help.c:6228
+msgid "compute a set of rows"
+msgstr "genera una sequenza di righe"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 può essere utilizzato solo in modalità non interattiva"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "apertura del file di log \"%s\" fallita: %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Digita \"help\" per avere un aiuto.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "impossibile impostare il parametro di stampa \"%s\""
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "argomento aggiuntivo della riga di comando \"%s\" ignorato"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "non è stato possibile trovare il proprio programma eseguibile"
+
+#: tab-complete.c:5952
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"query per il completamento tab fallita: %s\n"
+"La query era:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "valore \"%s\" non valido per \"%s\": è necessario un booleano"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "valore \"%s\" non valido per \"%s\": è necessario un intero"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "nome di variabile non valido: \"%s\""
+
+#: variables.c:419
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"valore \"%s\" non riconosciuto per \"%s\"\n"
+"I valori disponibili sono: %s."
+
+#~ msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n"
+#~ msgstr ""
+#~ " \\g [FILE] o ; esegui la query (ed invia i risultati ad un file o\n"
+#~ " ad una |pipe)\n"
+
+#~ msgid ""
+#~ " \\lo_export LOBOID FILE\n"
+#~ " \\lo_import FILE [COMMENT]\n"
+#~ " \\lo_list\n"
+#~ " \\lo_unlink LOBOID large object operations\n"
+#~ msgstr ""
+#~ " \\lo_export LOBOID FILE\n"
+#~ " \\lo_import FILE [COMMENTO] \n"
+#~ " \\lo_list\n"
+#~ " \\lo_unlink LOBOID operazioni sui large object\n"
+
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#~ msgid "%s: %s\n"
+#~ msgstr "%s: %s\n"
+
+#~ msgid "%s: could not open log file \"%s\": %s\n"
+#~ msgstr "%s: apertura del file di log \"%s\" fallita: %s\n"
+
+#~ msgid "All connection parameters must be supplied because no database connection exists\n"
+#~ msgstr "Tutti i parametri di connessione devono essere forniti perché non esiste alcuna connessione di database\n"
+
+#~ msgid "Disabled triggers:"
+#~ msgstr "Trigger disabilitati:"
+
+#~ msgid "Enter new password: "
+#~ msgstr "Inserire la nuova password: "
+
+#~ msgid "Invalid command \\%s. Try \\? for help.\n"
+#~ msgstr "Comando errato \\%s. Prova \\? per la guida.\n"
+
+#~ msgid "Special relation \"%s.%s\""
+#~ msgstr "relazione speciale \"%s.%s\""
+
+#~ msgid "The server (version %s) does not support altering default privileges.\n"
+#~ msgstr "Il server (versione %s) non supporta la modifica dei privilegi di default.\n"
+
+#~ msgid "The server (version %s) does not support editing function source.\n"
+#~ msgstr "Il server (versione %s) non supporta la modifica dei sorgenti delle funzioni.\n"
+
+#~ msgid "The server (version %s) does not support editing view definitions.\n"
+#~ msgstr "Il server (versione %s) non supporta la modifica della definizione delle viste.\n"
+
+#~ msgid "The server (version %s) does not support foreign servers.\n"
+#~ msgstr "Il server (versione %s) non supporta server esterni.\n"
+
+#~ msgid "The server (version %s) does not support foreign tables.\n"
+#~ msgstr "Il server (versione %s) non supporta tabelle esterne.\n"
+
+#~ msgid "The server (version %s) does not support foreign-data wrappers.\n"
+#~ msgstr "Il server (versione %s) non supporta i wrapper di dati esterni.\n"
+
+#~ msgid "The server (version %s) does not support full text search.\n"
+#~ msgstr "Il server (versione %s) non supporta la ricerca full text.\n"
+
+#~ msgid "The server (version %s) does not support per-database role settings.\n"
+#~ msgstr "Il server (versione %s) non supporta l'impostazione dei ruoli per database.\n"
+
+#~ msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK.\n"
+#~ msgstr "Il server (versione %s) non supporta savepoint per ON_ERROR_ROLLBACK.\n"
+
+#~ msgid "The server (version %s) does not support showing function source.\n"
+#~ msgstr "Il server (versione %s) non supporta la visualizzazione dei sorgenti delle funzioni.\n"
+
+#~ msgid "The server (version %s) does not support showing view definitions.\n"
+#~ msgstr "-\"Il server (versione %s) non supporta la visualizzazione della definizione delle viste.\n"
+
+#~ msgid "The server (version %s) does not support tablespaces.\n"
+#~ msgstr "Il server (versione %s) non supporta i tablespace.\n"
+
+#~ msgid "The server (version %s) does not support user mappings.\n"
+#~ msgstr "Il server (versione %s) non supporta la mappatura di utenti.\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "processo figlio terminato da segnale %s"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "spostamento nella directory \"%s\" fallito: %s"
+
+#~ msgid "could not close pipe to external command: %s\n"
+#~ msgstr "chiusura della pipe verso il comando esterno fallita: %s\n"
+
+#~ msgid "could not execute command \"%s\": %s\n"
+#~ msgstr "esecuzione del comando \"%s\" fallito: %s\n"
+
+#~ msgid "could not open temporary file \"%s\": %s\n"
+#~ msgstr "apertura del file temporaneo \"%s\" fallita: %s\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "lettura del link simbolico \"%s\" fallita"
+
+#~ msgid "could not stat file \"%s\": %s\n"
+#~ msgstr "richiesta informazioni sul file \"%s\" fallita: %s\n"
+
+#~ msgid "from_list"
+#~ msgstr "lista_from"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "pclose fallita: %s"
+
+#~ msgid "special"
+#~ msgstr "speciale"
+
+#~ msgid "string_literal"
+#~ msgstr "letterale_stringa"
+
+#~ msgid "timezone"
+#~ msgstr "timezone"
+
+#~ msgid "unexpected result status for \\watch\n"
+#~ msgstr "risultato imprevisto per \\watch\n"
+
+#~ msgid "unterminated quoted string\n"
+#~ msgstr "stringa tra virgolette non terminata\n"
+
+#~ msgid "where direction can be empty or one of:"
+#~ msgstr "dove direzione può essere vuota o una di:"
diff --git a/src/bin/psql/po/ja.po b/src/bin/psql/po/ja.po
new file mode 100644
index 0000000..b707ff5
--- /dev/null
+++ b/src/bin/psql/po/ja.po
@@ -0,0 +1,6476 @@
+# psql.po
+# Japanese message translation file for psql
+#
+# Copyright (C) 2010-2022 PostgreSQL Global Development Group
+#
+# Michihide Hotta <hotta@net-newbie.com>, 2010.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-02-06 15:59+0900\n"
+"PO-Revision-Date: 2023-02-06 17:39+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "カレントディレクトリを識別できませんでした: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "無効なバイナリ\"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "バイナリ\"%s\"を読み取ることができませんでした"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "実行対象の\"%s\"が見つかりませんでした"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "ディレクトリ\"%s\"に移動できませんでした: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "シンボリックリンク\"%s\"を読めませんでした: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() が失敗しました: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "メモリ不足です"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリ不足です\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null ポインターを複製することはできません(内部エラー) \n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "実効ユーザーID %ld が見つかりませんでした: %s"
+
+#: ../../common/username.c:45 command.c:575
+msgid "user does not exist"
+msgstr "ユーザーが存在しません"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "ユーザー名の検索に失敗: エラー コード %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "コマンドが実行形式ではありません"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "コマンドが見つかりません"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "子プロセスが終了コード %d で終了しました"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "子プロセスが例外 0x%X で強制終了しました"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "子プロセスはシグナル%dにより終了しました: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "子プロセスは認識できないステータス %d で終了しました"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "キャンセル要求を送信しました\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "キャンセル要求を送信できませんでした: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu 行)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "割り込み\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "テーブルの内容にヘッダーを追加できません: 列数 %d が制限値を超えています。\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "テーブルの内容にセルを追加できません: セルの合計数 %d が制限値を超えています。\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "出力フォーマットが無効(内部エラー):%d"
+
+#: ../../fe_utils/psqlscan.l:701
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "変数\"%s\"の再帰展開をスキップしています"
+
+#: ../../port/thread.c:100 ../../port/thread.c:136
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "ローカルユーザーID %dの参照に失敗しました: %s"
+
+#: ../../port/thread.c:105 ../../port/thread.c:141
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "ID %d を持つローカルユーザーは存在しません"
+
+#: command.c:232
+#, c-format
+msgid "invalid command \\%s"
+msgstr "不正なコマンド \\%s "
+
+#: command.c:234
+#, c-format
+msgid "Try \\? for help."
+msgstr " \\? でヘルプを表示します。"
+
+#: command.c:252
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: 余分な引数\"%s\"は無視されました"
+
+#: command.c:304
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "\\%s コマンドは無視されます; 現在の\\ifブロックを抜けるには\\endifまたはCtrl-Cを使用します"
+
+#: command.c:573
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "ユーザーID %ldのホームディレクトリを取得できませんでした : %s"
+
+#: command.c:592
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: ディレクトリを\"%s\"に変更できませんでした: %m"
+
+#: command.c:617
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "現在データベースに接続していません。\n"
+
+#: command.c:627
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "データベース\"%s\"にユーザー\"%s\"として、ホスト\"%s\"上のポート\"%s\"で接続しています。\n"
+
+#: command.c:630
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "データベース\"%s\"にユーザー\"%s\"として、\"%s\"のソケットを介してポート\"%s\"で接続しています。\n"
+
+#: command.c:636
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "データベース\"%s\"にユーザー\"%s\"として、ホスト\"%s\"(アドレス\"%s\")上のポート\"%s\"で接続しています。\n"
+
+#: command.c:639
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "データベース\"%s\"にユーザー\"%s\"として、ホスト\"%s\"上のポート\"%s\"で接続しています。\n"
+
+#: command.c:1030 command.c:1125 command.c:2654
+#, c-format
+msgid "no query buffer"
+msgstr "問い合わせバッファがありません"
+
+#: command.c:1063 command.c:5491
+#, c-format
+msgid "invalid line number: %s"
+msgstr "不正な行番号です: %s"
+
+#: command.c:1203
+msgid "No changes"
+msgstr "変更されていません"
+
+#: command.c:1282
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: エンコーディング名が不正であるか、または変換プロシージャが見つかりません。"
+
+#: command.c:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597
+#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100
+#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443
+#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1324
+msgid "There is no previous error."
+msgstr "直前のエラーはありません。"
+
+#: command.c:1437
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: 右括弧がありません"
+
+#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989
+#: command.c:2173 command.c:2415 command.c:2621 command.c:2661
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: 必要な引数がありません"
+
+#: command.c:1782
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: \\else の後には置けません"
+
+#: command.c:1787
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: 対応する \\if がありません"
+
+#: command.c:1851
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: \\else の後には置けません"
+
+#: command.c:1856
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: 対応する \\if がありません"
+
+#: command.c:1896
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: 対応する \\if がありません"
+
+#: command.c:2053
+msgid "Query buffer is empty."
+msgstr "問い合わせバッファは空です。"
+
+#: command.c:2096
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "ユーザー\"%s\"の新しいパスワードを入力してください: "
+
+#: command.c:2100
+msgid "Enter it again: "
+msgstr "もう一度入力してください: "
+
+#: command.c:2109
+#, c-format
+msgid "Passwords didn't match."
+msgstr "パスワードが一致しませんでした。"
+
+#: command.c:2208
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: 変数の値を読み取ることができませんでした"
+
+#: command.c:2311
+msgid "Query buffer reset (cleared)."
+msgstr "問い合わせバッファがリセット(クリア)されました。"
+
+#: command.c:2333
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "ファイル\"%s\"にヒストリーを出力しました。\n"
+
+#: command.c:2420
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: 環境変数名に\"=\"を含めることはできません"
+
+#: command.c:2468
+#, c-format
+msgid "function name is required"
+msgstr "関数名が必要です"
+
+#: command.c:2470
+#, c-format
+msgid "view name is required"
+msgstr "ビュー名が必要です"
+
+#: command.c:2593
+msgid "Timing is on."
+msgstr "タイミングは on です。"
+
+#: command.c:2595
+msgid "Timing is off."
+msgstr "タイミングは off です。"
+
+#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952
+#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008
+#: command.c:4022 command.c:4049 command.c:4107 common.c:77 copy.c:331
+#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:3107 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "パスワード: "
+
+#: command.c:3112 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "ユーザー %s のパスワード: "
+
+#: command.c:3168
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "接続文字列使用時はユーザー、ホストおよびポートは個別に指定しないでください"
+
+#: command.c:3203
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "パラメータ再利用に使用可能なデータベース接続がありません"
+
+#: command.c:3511
+#, c-format
+msgid "Previous connection kept"
+msgstr "以前の接続は保持されています"
+
+#: command.c:3517
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3573
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "データベース\"%s\"にユーザー\"%s\"として、ホスト\"%s\"のポート\"%s\"で接続しました。\n"
+
+#: command.c:3576
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "データベース\"%s\"にユーザー\"%s\"として、ソケット\"%s\"のポート\"%s\"を介して接続しました。\n"
+
+#: command.c:3582
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "データベース\"%s\"にユーザー\"%s\"として、ホスト\"%s\"(アドレス\"%s\")のポート\"%s\"で接続しました。\n"
+
+#: command.c:3585
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "データベース\"%s\"にユーザー\"%s\"として、ホスト\"%s\"のポート\"%s\"を介して接続しました。\n"
+
+#: command.c:3590
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "データベース\"%s\"にユーザー\"%s\"として接続しました。\n"
+
+#: command.c:3630
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s、サーバー %s)\n"
+
+#: command.c:3643
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"警告: %s のメジャーバージョンは %s ですが、サーバーのメジャーバージョンは %s です。\n"
+" psql の機能の中で、動作しないものがあるかもしれません。\n"
+
+#: command.c:3680
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "SSL接続(プロトコル: %s、暗号化方式: %s、圧縮: %s)\n"
+
+#: command.c:3681 command.c:3682
+msgid "unknown"
+msgstr "不明"
+
+#: command.c:3683 help.c:42
+msgid "off"
+msgstr "オフ"
+
+#: command.c:3683 help.c:42
+msgid "on"
+msgstr "オン"
+
+#: command.c:3697
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "GSSAPI暗号化接続\n"
+
+#: command.c:3717
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"警告:コンソールのコードページ(%u)がWindowsのコードページ(%u)と異なるため、\n"
+" 8ビット文字が正しく表示されない可能性があります。詳細はpsqlリファレンスマニュアルの\n"
+" \"Windowsユーザー向けの注意\" (Notes for Windows users)を参照してください。\n"
+
+#: command.c:3822
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "環境変数PSQL_EDITOR_LINENUMBER_ARGで行番号を指定する必要があります"
+
+#: command.c:3851
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "エディタ\"%s\"を起動できませんでした"
+
+#: command.c:3853
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "/bin/shを起動できませんでした"
+
+#: command.c:3903
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "一時ディレクトリが見つかりませんでした: %s"
+
+#: command.c:3930
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "一時ファイル\"%s\"をオープンできませんでした: %m"
+
+#: command.c:4266
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: 曖昧な短縮形\"%s\"が\"%s\"と\"%s\"のどちらにも合致します"
+
+#: command.c:4286
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: 有効なフォーマットはaligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4305
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: 有効な線のスタイルは ascii, old-ascii, unicode"
+
+#: command.c:4320
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: 有効な Unicode 罫線のスタイルは single, double"
+
+#: command.c:4335
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: 有効な Unicode 列罫線のスタイルは single, double"
+
+#: command.c:4350
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: 有効な Unicode ヘッダー罫線のスタイルは single, double"
+
+#: command.c:4393
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsepは単一の1バイト文字でなければなりません"
+
+#: command.c:4398
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsepはダブルクォート、改行(LF)または復帰(CR)にはできません"
+
+#: command.c:4535 command.c:4723
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: 未定義のオプション:%s"
+
+#: command.c:4555
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "罫線スタイルは %d です。\n"
+
+#: command.c:4561
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "ターゲットの幅が設定されていません。\n"
+
+#: command.c:4563
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "ターゲットの幅は %d です。\n"
+
+#: command.c:4570
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "拡張表示は on です。\n"
+
+#: command.c:4572
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "拡張表示が自動的に使われます。\n"
+
+#: command.c:4574
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "拡張表示は off です。\n"
+
+#: command.c:4580
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "CSVのフィールド区切り文字は\"%s\"です。\n"
+
+#: command.c:4588 command.c:4596
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "フィールド区切り文字はゼロバイトです。\n"
+
+#: command.c:4590
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "フィールド区切り文字は\"%s\"です。\n"
+
+#: command.c:4603
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "デフォルトフッター(行数の表示)は on です。\n"
+
+#: command.c:4605
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "デフォルトフッター(行数の表示)は off です。\n"
+
+#: command.c:4611
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "出力形式は %s です。\n"
+
+#: command.c:4617
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "線のスタイルは %s です。\n"
+
+#: command.c:4624
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Null表示は\"%s\"です。\n"
+
+#: command.c:4632
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "『数値出力時のロケール調整』は on です。\n"
+
+#: command.c:4634
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "『数値出力時のロケール調整』は off です。\n"
+
+#: command.c:4641
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "表示が縦に長くなる場合はページャーを使います。\n"
+
+#: command.c:4643
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "常にページャーを使います。\n"
+
+#: command.c:4645
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "「ページャーを使う」は off です。\n"
+
+#: command.c:4651
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "%d 行未満の場合、ページャーは使われません。\n"
+
+#: command.c:4661 command.c:4671
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "レコードの区切り文字はゼロバイトです\n"
+
+#: command.c:4663
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "レコード区切り文字は<newline>です。\n"
+
+#: command.c:4665
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "レコード区切り記号は\"%s\"です。\n"
+
+#: command.c:4678
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "テーブル属性は\"%s\"です。\n"
+
+#: command.c:4681
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "テーブル属性は設定されていません。\n"
+
+#: command.c:4688
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "タイトルは\"%s\"です。\n"
+
+#: command.c:4690
+#, c-format
+msgid "Title is unset.\n"
+msgstr "タイトルは設定されていません。\n"
+
+#: command.c:4697
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "「タプルのみ表示」は on です。\n"
+
+#: command.c:4699
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "「タプルのみ表示」は off です。\n"
+
+#: command.c:4705
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Unicode の罫線スタイルは\"%s\"です。\n"
+
+#: command.c:4711
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Unicode 行罫線のスタイルは\"%s\"です。\n"
+
+#: command.c:4717
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Unicodeヘッダー行のスタイルは\"%s\"です。\n"
+
+#: command.c:4950
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: 失敗"
+
+#: command.c:4984
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watchは空の問い合わせでは使えません"
+
+#: command.c:5016
+#, c-format
+msgid "could not set timer: %m"
+msgstr "タイマーを設定できません: %m"
+
+#: command.c:5078
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (%g 秒毎)\n"
+
+#: command.c:5081
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (%g 秒毎)\n"
+
+#: command.c:5142
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "シグナルを待機できませんでした: %m"
+
+#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"******** 問い合わせ ******\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5386
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\"はビューではありません"
+
+#: command.c:5402
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "reloptions配列をパースできませんでした"
+
+#: common.c:166
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "有効な接続がないのでエスケープできません"
+
+#: common.c:207
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "シェルコマンドの引数に改行(LF)または復帰(CR)が含まれています: \"%s\""
+
+#: common.c:311
+#, c-format
+msgid "connection to server was lost"
+msgstr "サーバーへの接続が失われました"
+
+#: common.c:315
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "サーバーへの接続が失われました。リセットしています: "
+
+#: common.c:320
+#, c-format
+msgid "Failed.\n"
+msgstr "失敗。\n"
+
+#: common.c:337
+#, c-format
+msgid "Succeeded.\n"
+msgstr "成功。\n"
+
+#: common.c:389 common.c:1001
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "想定外のPQresultStatus: %d"
+
+#: common.c:511
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "時間: %.3f ミリ秒\n"
+
+#: common.c:526
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "時間: %.3f ミリ秒(%02d:%06.3f)\n"
+
+#: common.c:535
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "時間: %.3f ミリ秒 (%02d:%02d:%06.3f)\n"
+
+#: common.c:542
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "時間: %.3f ミリ秒 (%.0f 日 %02d:%02d:%06.3f)\n"
+
+#: common.c:566 common.c:623 common.c:1034 describe.c:6135
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "現在データベースに接続していません。"
+
+#: common.c:654
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "PID %3$dのサーバープロセスから、ペイロード\"%2$s\"を持つ非同期通知\"%1$s\"を受信しました。\n"
+
+#: common.c:657
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "PID %2$dのサーバープロセスから非同期通知\"%1$s\"を受信しました。\n"
+
+#: common.c:688
+#, c-format
+msgid "could not print result table: %m"
+msgstr "結果テーブルを表示できませんでした: %m"
+
+#: common.c:708
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "\\gset に対して返すべき行がありません"
+
+#: common.c:713
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "\\gset に対して複数の行が返されました"
+
+#: common.c:731
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "特殊変数\"%s\"への\\gsetは無視されました"
+
+#: common.c:1043
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(シングルステップモード: コマンドを確認してください)********\n"
+"%s\n"
+"***([Enter] を押して進むか、x [Enter] でキャンセル)**************\n"
+
+#: common.c:1126
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "文: %s"
+
+#: common.c:1162
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "想定外のトランザクション状態(%d)"
+
+#: common.c:1303 describe.c:2020
+msgid "Column"
+msgstr "列"
+
+#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037
+#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021
+#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504
+#: describe.c:5767
+msgid "Type"
+msgstr "タイプ"
+
+#: common.c:1353
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "このコマンドは結果を返却しないか、結果にカラムが含まれません。\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: 引数が必要です"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: \"%s\"で構文解析エラー"
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: 行の末尾で構文解析エラー"
+
+#: copy.c:328
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "コマンド\"%s\"を実行できませんでした: %m"
+
+#: copy.c:344
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ファイル\"%s\"のstatに失敗しました: %m"
+
+#: copy.c:348
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: ディレクトリから/へのコピーはできません"
+
+#: copy.c:385
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "外部コマンドに対するパイプをクローズできませんでした: %m"
+
+#: copy.c:390
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: copy.c:453 copy.c:463
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "COPY データを書き込めませんでした: %m"
+
+#: copy.c:469
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "COPY データの転送に失敗しました: %s"
+
+#: copy.c:530
+msgid "canceled by user"
+msgstr "ユーザーによってキャンセルされました"
+
+#: copy.c:541
+msgid ""
+"Enter data to be copied followed by a newline.\n"
+"End with a backslash and a period on a line by itself, or an EOF signal."
+msgstr ""
+"コピーするデータに続いて改行を入力してください。\n"
+"バックスラッシュとピリオドだけの行、もしくは EOF シグナルで終了します。"
+
+#: copy.c:684
+msgid "aborted because of read failure"
+msgstr "読み取りエラーのため中止"
+
+#: copy.c:718
+msgid "trying to exit copy mode"
+msgstr "コピーモードを終了しようとしています。"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: 文は結果セットを返しませんでした"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: 問い合わせは、少なくとも3つの列を返す必要があります"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: 垂直方向と水平方向のヘッダーは異なった列にする必要があります"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: 問い合わせが 4 つ以上の列を返す場合、データ列を指定する必要があります"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "列数が制限値(%d)を超えています"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: 問い合わせ結果の中の\"%s\"行 \"%s\"列に複数のデータ値が含まれています"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: 列番号%dが範囲外です(1..%d)"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: 列名があいまいです: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: 列名が見つかりませんでした: \"%s\""
+
+#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029
+#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090
+#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866
+#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420
+#: describe.c:5477 describe.c:5881 describe.c:5959
+msgid "Schema"
+msgstr "スキーマ"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636
+#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258
+#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341
+#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867
+#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410
+#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748
+#: describe.c:5957 describe.c:6186 describe.c:6494
+msgid "Name"
+msgstr "名前"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "結果のデータ型"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "引数のデータ型"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423
+#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041
+#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280
+#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777
+#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248
+#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422
+#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895
+#: describe.c:5960 describe.c:6992
+msgid "Description"
+msgstr "説明"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "集約関数一覧"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "このサーバー(バージョン%s)はアクセスメソッドをサポートしていません。"
+
+#: describe.c:168
+msgid "Index"
+msgstr "インデックス"
+
+#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882
+msgid "Table"
+msgstr "テーブル"
+
+#: describe.c:177 describe.c:5679
+msgid "Handler"
+msgstr "ハンドラ"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "アクセスメソッド一覧"
+
+#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181
+#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588
+#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187
+#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718
+#: describe.c:6980
+msgid "Owner"
+msgstr "所有者"
+
+#: describe.c:231
+msgid "Location"
+msgstr "場所"
+
+#: describe.c:241 describe.c:3509
+msgid "Options"
+msgstr "オプション"
+
+#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934
+msgid "Size"
+msgstr "サイズ"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "テーブル空間一覧"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\dfで指定できるオプションは [anptwS+] のみです"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\dfはこのサーバーバージョン%2$sでは\"%1$c\"オプションは指定できません"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "集約"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "ウィンドウ"
+
+#: describe.c:356
+msgid "proc"
+msgstr "プロシージャ"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "関数"
+
+#: describe.c:374 describe.c:1390
+msgid "trigger"
+msgstr "トリガー"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "IMMUTABLE"
+
+#: describe.c:387
+msgid "stable"
+msgstr "STABLE"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "VOLATILE"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "関数の変動性分類"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "制限付き"
+
+#: describe.c:398
+msgid "safe"
+msgstr "安全"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "危険"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "並列実行"
+
+#: describe.c:405
+msgid "definer"
+msgstr "定義ロール"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "起動ロール"
+
+#: describe.c:407
+msgid "Security"
+msgstr "セキュリティ"
+
+#: describe.c:412
+msgid "Language"
+msgstr "手続き言語"
+
+#: describe.c:416 describe.c:420
+msgid "Source code"
+msgstr "ソースコード"
+
+#: describe.c:594
+msgid "List of functions"
+msgstr "関数一覧"
+
+#: describe.c:657
+msgid "Internal name"
+msgstr "内部名"
+
+#: describe.c:659
+msgid "Elements"
+msgstr "構成要素"
+
+#: describe.c:711
+msgid "List of data types"
+msgstr "データ型一覧"
+
+#: describe.c:814
+msgid "Left arg type"
+msgstr "左辺の型"
+
+#: describe.c:815
+msgid "Right arg type"
+msgstr "右辺の型"
+
+#: describe.c:816
+msgid "Result type"
+msgstr "結果の型"
+
+#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247
+#: describe.c:6909 describe.c:6913
+msgid "Function"
+msgstr "関数"
+
+#: describe.c:902
+msgid "List of operators"
+msgstr "演算子一覧"
+
+#: describe.c:938
+msgid "Encoding"
+msgstr "エンコーディング"
+
+#: describe.c:939 describe.c:4868
+msgid "Collate"
+msgstr "照合順序"
+
+#: describe.c:940 describe.c:4869
+msgid "Ctype"
+msgstr "Ctype(変換演算子)"
+
+#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878
+msgid "ICU Locale"
+msgstr "ICUロケール"
+
+#: describe.c:946 describe.c:952
+msgid "Locale Provider"
+msgstr "ロケールプロバイダー"
+
+#: describe.c:964
+msgid "Tablespace"
+msgstr "テーブル空間"
+
+#: describe.c:990
+msgid "List of databases"
+msgstr "データベース一覧"
+
+#: describe.c:1031 describe.c:1184 describe.c:3882
+msgid "table"
+msgstr "テーブル"
+
+#: describe.c:1032 describe.c:3883
+msgid "view"
+msgstr "ビュー"
+
+#: describe.c:1033 describe.c:3884
+msgid "materialized view"
+msgstr "実体化ビュー"
+
+#: describe.c:1034 describe.c:1186 describe.c:3886
+msgid "sequence"
+msgstr "シーケンス"
+
+#: describe.c:1035 describe.c:3888
+msgid "foreign table"
+msgstr "外部テーブル"
+
+#: describe.c:1036 describe.c:3889 describe.c:4101
+msgid "partitioned table"
+msgstr "パーティションテーブル"
+
+#: describe.c:1047
+msgid "Column privileges"
+msgstr "列の権限"
+
+#: describe.c:1078 describe.c:1112
+msgid "Policies"
+msgstr "ポリシー"
+
+#: describe.c:1143 describe.c:4510 describe.c:6577
+msgid "Access privileges"
+msgstr "アクセス権限"
+
+#: describe.c:1188
+msgid "function"
+msgstr "関数"
+
+#: describe.c:1190
+msgid "type"
+msgstr "型"
+
+#: describe.c:1192
+msgid "schema"
+msgstr "スキーマ"
+
+#: describe.c:1215
+msgid "Default access privileges"
+msgstr "デフォルトのアクセス権限"
+
+#: describe.c:1259
+msgid "Object"
+msgstr "オブジェクト"
+
+#: describe.c:1273
+msgid "table constraint"
+msgstr "テーブル制約"
+
+#: describe.c:1297
+msgid "domain constraint"
+msgstr "ドメイン制約"
+
+#: describe.c:1321
+msgid "operator class"
+msgstr "演算子クラス"
+
+#: describe.c:1345
+msgid "operator family"
+msgstr "演算子族"
+
+#: describe.c:1368
+msgid "rule"
+msgstr "ルール"
+
+#: describe.c:1414
+msgid "Object descriptions"
+msgstr "オブジェクトの説明"
+
+#: describe.c:1479 describe.c:4007
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "\"%s\"という名前のリレーションは見つかりませんでした。"
+
+#: describe.c:1482 describe.c:4010
+#, c-format
+msgid "Did not find any relations."
+msgstr "リレーションが見つかりませんでした。"
+
+#: describe.c:1678
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "OID %sを持つリレーションが見つかりませんでした。"
+
+#: describe.c:1726 describe.c:1750
+msgid "Start"
+msgstr "開始"
+
+#: describe.c:1727 describe.c:1751
+msgid "Minimum"
+msgstr "最小"
+
+#: describe.c:1728 describe.c:1752
+msgid "Maximum"
+msgstr "最大"
+
+#: describe.c:1729 describe.c:1753
+msgid "Increment"
+msgstr "増分"
+
+#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426
+#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620
+msgid "yes"
+msgstr "はい"
+
+#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426
+#: describe.c:4768 describe.c:4892 describe.c:6621
+msgid "no"
+msgstr "いいえ"
+
+#: describe.c:1732 describe.c:1756
+msgid "Cycles?"
+msgstr "循環?"
+
+#: describe.c:1733 describe.c:1757
+msgid "Cache"
+msgstr "キャッシュ"
+
+#: describe.c:1798
+#, c-format
+msgid "Owned by: %s"
+msgstr "所有者: %s"
+
+#: describe.c:1802
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "識別列のシーケンス: %s"
+
+#: describe.c:1810
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "ログ出力なしのシーケンス\"%s.%s\""
+
+#: describe.c:1813
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "シーケンス \"%s.%s\""
+
+#: describe.c:1957
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "ログ出力なしのテーブル\"%s.%s\""
+
+#: describe.c:1960
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "テーブル\"%s.%s\""
+
+#: describe.c:1964
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "ビュー\"%s.%s\""
+
+#: describe.c:1969
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "ログ出力なしの実体化ビュー\"%s.%s\""
+
+#: describe.c:1972
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "実体化ビュー\"%s.%s\""
+
+#: describe.c:1977
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "ログ出力なしのインデックス\"%s.%s\""
+
+#: describe.c:1980
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "インデックス\"%s.%s\""
+
+#: describe.c:1985
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "ログ出力なしのパーティション親インデックス\"%s.%s\""
+
+#: describe.c:1988
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "パーティションインデックス\"%s.%s\""
+
+#: describe.c:1992
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST テーブル\"%s.%s\""
+
+#: describe.c:1996
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "複合型\"%s.%s\""
+
+#: describe.c:2000
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "外部テーブル\"%s.%s\""
+
+#: describe.c:2005
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "ログ出力なしのパーティション親テーブル\"%s.%s\""
+
+#: describe.c:2008
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "パーティションテーブル\"%s.%s\""
+
+#: describe.c:2024 describe.c:4343
+msgid "Collation"
+msgstr "照合順序"
+
+#: describe.c:2025 describe.c:4344
+msgid "Nullable"
+msgstr "Null 値を許容"
+
+#: describe.c:2026 describe.c:4345
+msgid "Default"
+msgstr "デフォルト"
+
+#: describe.c:2029
+msgid "Key?"
+msgstr "キー?"
+
+#: describe.c:2031 describe.c:4665 describe.c:4676
+msgid "Definition"
+msgstr "定義"
+
+#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835
+#: describe.c:5894
+msgid "FDW options"
+msgstr "FDW オプション"
+
+#: describe.c:2035
+msgid "Storage"
+msgstr "ストレージ"
+
+#: describe.c:2037
+msgid "Compression"
+msgstr "圧縮"
+
+#: describe.c:2039
+msgid "Stats target"
+msgstr "統計目標"
+
+#: describe.c:2175
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "親パーティション: %s %s%s"
+
+#: describe.c:2188
+msgid "No partition constraint"
+msgstr "パーティション制約なし"
+
+#: describe.c:2190
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "パーティションの制約: %s"
+
+#: describe.c:2214
+#, c-format
+msgid "Partition key: %s"
+msgstr "パーティションキー: %s"
+
+#: describe.c:2240
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "所属先テーブル\"%s.%s\""
+
+#: describe.c:2309
+msgid "primary key, "
+msgstr "プライマリキー, "
+
+#: describe.c:2312
+msgid "unique"
+msgstr "ユニーク"
+
+#: describe.c:2314
+msgid " nulls not distinct"
+msgstr " nulls not distinct"
+
+#: describe.c:2315
+msgid ", "
+msgstr ", "
+
+#: describe.c:2322
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "テーブル\"%s.%s\"用"
+
+#: describe.c:2326
+#, c-format
+msgid ", predicate (%s)"
+msgstr "、述語 (%s)"
+
+#: describe.c:2329
+msgid ", clustered"
+msgstr "、クラスター化"
+
+#: describe.c:2332
+msgid ", invalid"
+msgstr "無効"
+
+#: describe.c:2335
+msgid ", deferrable"
+msgstr "、遅延可能"
+
+#: describe.c:2338
+msgid ", initially deferred"
+msgstr "、最初から遅延中"
+
+#: describe.c:2341
+msgid ", replica identity"
+msgstr "、レプリカの id"
+
+#: describe.c:2395
+msgid "Indexes:"
+msgstr "インデックス:"
+
+#: describe.c:2478
+msgid "Check constraints:"
+msgstr "Check 制約:"
+
+#: describe.c:2546
+msgid "Foreign-key constraints:"
+msgstr "外部キー制約:"
+
+#: describe.c:2609
+msgid "Referenced by:"
+msgstr "参照元:"
+
+#: describe.c:2659
+msgid "Policies:"
+msgstr "ポリシー:"
+
+#: describe.c:2662
+msgid "Policies (forced row security enabled):"
+msgstr "ポリシー(行セキュリティを強制的に有効化):"
+
+#: describe.c:2665
+msgid "Policies (row security enabled): (none)"
+msgstr "ポリシー(行セキュリティ有効化): (なし)"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled): (none)"
+msgstr "ポリシー(行セキュリティを強制的に有効化): (なし)"
+
+#: describe.c:2671
+msgid "Policies (row security disabled):"
+msgstr "ポリシー(行セキュリティを無効化):"
+
+#: describe.c:2731 describe.c:2835
+msgid "Statistics objects:"
+msgstr "統計オブジェクト:"
+
+#: describe.c:2937 describe.c:3090
+msgid "Rules:"
+msgstr "ルール:"
+
+#: describe.c:2940
+msgid "Disabled rules:"
+msgstr "無効化されたルール:"
+
+#: describe.c:2943
+msgid "Rules firing always:"
+msgstr "常に適用するルール:"
+
+#: describe.c:2946
+msgid "Rules firing on replica only:"
+msgstr "レプリカ上でのみ適用するルール:"
+
+#: describe.c:3025 describe.c:5030
+msgid "Publications:"
+msgstr "パブリケーション:"
+
+#: describe.c:3073
+msgid "View definition:"
+msgstr "ビューの定義:"
+
+#: describe.c:3236
+msgid "Triggers:"
+msgstr "トリガー:"
+
+#: describe.c:3239
+msgid "Disabled user triggers:"
+msgstr "無効化されたユーザートリガ:"
+
+#: describe.c:3242
+msgid "Disabled internal triggers:"
+msgstr "無効化された内部トリガー:"
+
+#: describe.c:3245
+msgid "Triggers firing always:"
+msgstr "常に適用するするトリガー:"
+
+#: describe.c:3248
+msgid "Triggers firing on replica only:"
+msgstr "レプリカ上でのみ適用するトリガー:"
+
+#: describe.c:3319
+#, c-format
+msgid "Server: %s"
+msgstr "サーバー: %s"
+
+#: describe.c:3327
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW オプション: (%s)"
+
+#: describe.c:3348
+msgid "Inherits"
+msgstr "継承元"
+
+#: describe.c:3413
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "パーティション数: %d"
+
+#: describe.c:3422
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "パーティション数: %d (\\d+ で一覧を表示)。"
+
+#: describe.c:3424
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "子テーブル数: %d (\\d+ で一覧を表示)"
+
+#: describe.c:3431
+msgid "Child tables"
+msgstr "子テーブル"
+
+#: describe.c:3431
+msgid "Partitions"
+msgstr "パーティション"
+
+#: describe.c:3462
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "%s 型の型付きテーブル"
+
+#: describe.c:3478
+msgid "Replica Identity"
+msgstr "レプリカ識別"
+
+#: describe.c:3491
+msgid "Has OIDs: yes"
+msgstr "OID あり: はい"
+
+#: describe.c:3500
+#, c-format
+msgid "Access method: %s"
+msgstr "アクセスメソッド: %s"
+
+#: describe.c:3579
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "テーブル空間: \"%s\""
+
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:3591
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr "、テーブル空間\"%s\""
+
+#: describe.c:3668
+msgid "List of roles"
+msgstr "ロール一覧"
+
+#: describe.c:3670
+msgid "Role name"
+msgstr "ロール名"
+
+#: describe.c:3671
+msgid "Attributes"
+msgstr "属性"
+
+#: describe.c:3673
+msgid "Member of"
+msgstr "所属グループ"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "スーパーユーザー"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "継承なし"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "ロール作成可"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "DB作成可"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "ログインできません"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "レプリケーション可"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "RLS のバイパス"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "接続なし"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d 個の接続"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "パスワードの有効期限 "
+
+#: describe.c:3777
+msgid "Role"
+msgstr "ロール"
+
+#: describe.c:3778
+msgid "Database"
+msgstr "データベース"
+
+#: describe.c:3779
+msgid "Settings"
+msgstr "設定"
+
+#: describe.c:3803
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "ロール\"%s\"とデータベース\"%s\"の設定が見つかりませんでした。"
+
+#: describe.c:3806
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "ロール\"%s\"の設定が見つかりませんでした。"
+
+#: describe.c:3809
+#, c-format
+msgid "Did not find any settings."
+msgstr "設定が見つかりませんでした。"
+
+#: describe.c:3814
+msgid "List of settings"
+msgstr "設定一覧"
+
+#: describe.c:3885
+msgid "index"
+msgstr "インデックス"
+
+#: describe.c:3887
+msgid "TOAST table"
+msgstr "TOAST テーブル"
+
+#: describe.c:3890 describe.c:4102
+msgid "partitioned index"
+msgstr "パーティションインデックス"
+
+#: describe.c:3910
+msgid "permanent"
+msgstr "永続"
+
+#: describe.c:3911
+msgid "temporary"
+msgstr "一時"
+
+#: describe.c:3912
+msgid "unlogged"
+msgstr "ログなし"
+
+#: describe.c:3913
+msgid "Persistence"
+msgstr "永続性"
+
+#: describe.c:3929
+msgid "Access method"
+msgstr "アクセスメソッド"
+
+#: describe.c:4015
+msgid "List of relations"
+msgstr "リレーション一覧"
+
+#: describe.c:4063
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "このサーバー(バージョン%s)は宣言的テーブルパーティショニングをサポートしていません。"
+
+#: describe.c:4074
+msgid "List of partitioned indexes"
+msgstr "パーティションインデックスの一覧"
+
+#: describe.c:4076
+msgid "List of partitioned tables"
+msgstr "パーティションテーブルの一覧"
+
+#: describe.c:4080
+msgid "List of partitioned relations"
+msgstr "パーティションリレーションの一覧"
+
+#: describe.c:4111
+msgid "Parent name"
+msgstr "親の名前"
+
+#: describe.c:4124
+msgid "Leaf partition size"
+msgstr "末端パーティションのサイズ"
+
+#: describe.c:4127 describe.c:4133
+msgid "Total size"
+msgstr "トータルサイズ"
+
+#: describe.c:4258
+msgid "Trusted"
+msgstr "信頼済み"
+
+#: describe.c:4267
+msgid "Internal language"
+msgstr "内部言語"
+
+#: describe.c:4268
+msgid "Call handler"
+msgstr "呼び出しハンドラー"
+
+#: describe.c:4269 describe.c:5680
+msgid "Validator"
+msgstr "バリデーター"
+
+#: describe.c:4270
+msgid "Inline handler"
+msgstr "インラインハンドラー"
+
+#: describe.c:4305
+msgid "List of languages"
+msgstr "手続き言語一覧"
+
+#: describe.c:4346
+msgid "Check"
+msgstr "CHECK制約"
+
+#: describe.c:4390
+msgid "List of domains"
+msgstr "ドメイン一覧"
+
+#: describe.c:4424
+msgid "Source"
+msgstr "変換元"
+
+#: describe.c:4425
+msgid "Destination"
+msgstr "変換先"
+
+#: describe.c:4427 describe.c:6622
+msgid "Default?"
+msgstr "デフォルト?"
+
+#: describe.c:4469
+msgid "List of conversions"
+msgstr "符号化方式一覧"
+
+#: describe.c:4497
+msgid "Parameter"
+msgstr "パラメータ"
+
+#: describe.c:4498
+msgid "Value"
+msgstr "値"
+
+#: describe.c:4505
+msgid "Context"
+msgstr "コンテクスト"
+
+#: describe.c:4538
+msgid "List of configuration parameters"
+msgstr "設定パラメータの一覧"
+
+#: describe.c:4540
+msgid "List of non-default configuration parameters"
+msgstr "非デフォルトの設定パラメータの一覧"
+
+#: describe.c:4567
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "このサーバー(バージョン%s)はイベントトリガーをサポートしていません。"
+
+#: describe.c:4587
+msgid "Event"
+msgstr "イベント"
+
+#: describe.c:4589
+msgid "enabled"
+msgstr "有効"
+
+#: describe.c:4590
+msgid "replica"
+msgstr "レプリカ"
+
+#: describe.c:4591
+msgid "always"
+msgstr "常時"
+
+#: describe.c:4592
+msgid "disabled"
+msgstr "無効"
+
+#: describe.c:4593 describe.c:6496
+msgid "Enabled"
+msgstr "有効状態"
+
+#: describe.c:4595
+msgid "Tags"
+msgstr "タグ"
+
+#: describe.c:4619
+msgid "List of event triggers"
+msgstr "イベントトリガー一覧"
+
+#: describe.c:4646
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "このサーバー(バージョン%s)は拡張統計情報をサポートしていません。"
+
+#: describe.c:4683
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4684
+msgid "Dependencies"
+msgstr "Dependencies"
+
+#: describe.c:4694
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4718
+msgid "List of extended statistics"
+msgstr "拡張統計情報の一覧"
+
+#: describe.c:4745
+msgid "Source type"
+msgstr "変換元の型"
+
+#: describe.c:4746
+msgid "Target type"
+msgstr "変換先の型"
+
+#: describe.c:4770
+msgid "in assignment"
+msgstr "代入時のみ"
+
+#: describe.c:4772
+msgid "Implicit?"
+msgstr "暗黙的に適用 ?"
+
+#: describe.c:4831
+msgid "List of casts"
+msgstr "キャスト一覧"
+
+#: describe.c:4883 describe.c:4887
+msgid "Provider"
+msgstr "プロバイダー"
+
+#: describe.c:4893 describe.c:4898
+msgid "Deterministic?"
+msgstr "確定的?"
+
+#: describe.c:4938
+msgid "List of collations"
+msgstr "照合順序一覧"
+
+#: describe.c:5000
+msgid "List of schemas"
+msgstr "スキーマ一覧"
+
+#: describe.c:5117
+msgid "List of text search parsers"
+msgstr "テキスト検索用パーサ一覧"
+
+#: describe.c:5167
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "テキスト検索用パーサ\"%s\"が見つかりませんでした。"
+
+#: describe.c:5170
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "テキスト検索パーサが見つかりませんでした。"
+
+#: describe.c:5245
+msgid "Start parse"
+msgstr "パース開始"
+
+#: describe.c:5246
+msgid "Method"
+msgstr "メソッド"
+
+#: describe.c:5250
+msgid "Get next token"
+msgstr "次のトークンを取得"
+
+#: describe.c:5252
+msgid "End parse"
+msgstr "パース終了"
+
+#: describe.c:5254
+msgid "Get headline"
+msgstr "見出しを取得"
+
+#: describe.c:5256
+msgid "Get token types"
+msgstr "トークンタイプを取得"
+
+#: describe.c:5267
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "テキスト検索パーサ\"%s.%s\""
+
+#: describe.c:5270
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "テキスト検索パーサ\"%s\""
+
+#: describe.c:5289
+msgid "Token name"
+msgstr "トークン名"
+
+#: describe.c:5303
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "パーサ\"%s.%s\"のトークンタイプ"
+
+#: describe.c:5306
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "パーサ\"%s\"のトークンタイプ"
+
+#: describe.c:5350
+msgid "Template"
+msgstr "テンプレート"
+
+#: describe.c:5351
+msgid "Init options"
+msgstr "初期化オプション"
+
+#: describe.c:5378
+msgid "List of text search dictionaries"
+msgstr "テキスト検索用辞書一覧"
+
+#: describe.c:5411
+msgid "Init"
+msgstr "初期化"
+
+#: describe.c:5412
+msgid "Lexize"
+msgstr "Lex 処理"
+
+#: describe.c:5444
+msgid "List of text search templates"
+msgstr "テキスト検索テンプレート一覧"
+
+#: describe.c:5499
+msgid "List of text search configurations"
+msgstr "テキスト検索設定一覧"
+
+#: describe.c:5550
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "テキスト検索用設定\"%s\"が見つかりませんでした。"
+
+#: describe.c:5553
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "テキスト検索設定が見つかりませんでした。"
+
+#: describe.c:5619
+msgid "Token"
+msgstr "トークン"
+
+#: describe.c:5620
+msgid "Dictionaries"
+msgstr "辞書"
+
+#: describe.c:5631
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "テキスト検索設定\"%s.%s\""
+
+#: describe.c:5634
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "テキスト検索設定\"%s\""
+
+#: describe.c:5638
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"パーサ: \"%s.%s\""
+
+#: describe.c:5641
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"パーサ: \"%s\""
+
+#: describe.c:5722
+msgid "List of foreign-data wrappers"
+msgstr "外部データラッパ一覧"
+
+#: describe.c:5750
+msgid "Foreign-data wrapper"
+msgstr "外部データラッパ"
+
+#: describe.c:5768 describe.c:5958
+msgid "Version"
+msgstr "バージョン"
+
+#: describe.c:5799
+msgid "List of foreign servers"
+msgstr "外部サーバー一覧"
+
+#: describe.c:5824 describe.c:5883
+msgid "Server"
+msgstr "サーバー"
+
+#: describe.c:5825
+msgid "User name"
+msgstr "ユーザー名"
+
+#: describe.c:5855
+msgid "List of user mappings"
+msgstr "ユーザーマッピング一覧"
+
+#: describe.c:5928
+msgid "List of foreign tables"
+msgstr "外部テーブル一覧"
+
+#: describe.c:5980
+msgid "List of installed extensions"
+msgstr "インストール済みの拡張一覧"
+
+#: describe.c:6028
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "\"%s\"という名前の機能拡張が見つかりませんでした。"
+
+#: describe.c:6031
+#, c-format
+msgid "Did not find any extensions."
+msgstr "機能拡張が見つかりませんでした。"
+
+#: describe.c:6075
+msgid "Object description"
+msgstr "オブジェクトの説明"
+
+#: describe.c:6085
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "機能拡張\"%s\"内のオブジェクト"
+
+#: describe.c:6126
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "修飾名が不適切です(ドット区切りの名前が多すぎます): %s"
+
+#: describe.c:6140
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "データベース間の参照は実装されていません: %s"
+
+#: describe.c:6171 describe.c:6298
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "このサーバー(バージョン%s)はパブリケーションをサポートしていません。"
+
+#: describe.c:6188 describe.c:6376
+msgid "All tables"
+msgstr "全テーブル"
+
+#: describe.c:6189 describe.c:6377
+msgid "Inserts"
+msgstr "Insert文"
+
+#: describe.c:6190 describe.c:6378
+msgid "Updates"
+msgstr "Update文"
+
+#: describe.c:6191 describe.c:6379
+msgid "Deletes"
+msgstr "Delete文"
+
+#: describe.c:6195 describe.c:6381
+msgid "Truncates"
+msgstr "Truncate文"
+
+#: describe.c:6199 describe.c:6383
+msgid "Via root"
+msgstr "最上位パーティションテーブル経由"
+
+#: describe.c:6221
+msgid "List of publications"
+msgstr "パブリケーション一覧"
+
+#: describe.c:6345
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "\"%s\"という名前のパブリケーションが見つかりませんでした。"
+
+#: describe.c:6348
+#, c-format
+msgid "Did not find any publications."
+msgstr "パブリケーションが見つかりませんでした。"
+
+#: describe.c:6372
+#, c-format
+msgid "Publication %s"
+msgstr "パブリケーション %s"
+
+#: describe.c:6425
+msgid "Tables:"
+msgstr "テーブル:"
+
+#: describe.c:6437
+msgid "Tables from schemas:"
+msgstr "以下のスキーマ内のテーブル:"
+
+#: describe.c:6481
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "このサーバー(バージョン%s)はサブスクリプションをサポートしていません。"
+
+#: describe.c:6497
+msgid "Publication"
+msgstr "パブリケーション"
+
+#: describe.c:6506
+msgid "Binary"
+msgstr "バイナリ"
+
+#: describe.c:6507
+msgid "Streaming"
+msgstr "ストリーミング"
+
+#: describe.c:6514
+msgid "Two-phase commit"
+msgstr "2相コミット"
+
+#: describe.c:6515
+msgid "Disable on error"
+msgstr "エラー時無効化"
+
+#: describe.c:6520
+msgid "Synchronous commit"
+msgstr "同期コミット"
+
+#: describe.c:6521
+msgid "Conninfo"
+msgstr "接続情報"
+
+#: describe.c:6527
+msgid "Skip LSN"
+msgstr "スキップLSN"
+
+#: describe.c:6554
+msgid "List of subscriptions"
+msgstr "サブスクリプション一覧"
+
+#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6617
+msgid "Input type"
+msgstr "入力の型"
+
+#: describe.c:6618
+msgid "Storage type"
+msgstr "ストレージタイプ"
+
+#: describe.c:6619
+msgid "Operator class"
+msgstr "演算子クラス"
+
+#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901
+msgid "Operator family"
+msgstr "演算子族"
+
+#: describe.c:6667
+msgid "List of operator classes"
+msgstr "演算子クラス一覧"
+
+#: describe.c:6714
+msgid "Applicable types"
+msgstr "適用可能型"
+
+#: describe.c:6756
+msgid "List of operator families"
+msgstr "演算子族一覧"
+
+#: describe.c:6807
+msgid "Operator"
+msgstr "演算子"
+
+#: describe.c:6808
+msgid "Strategy"
+msgstr "ストラテジ"
+
+#: describe.c:6809
+msgid "ordering"
+msgstr "順序付け"
+
+#: describe.c:6810
+msgid "search"
+msgstr "検索"
+
+#: describe.c:6811
+msgid "Purpose"
+msgstr "目的"
+
+#: describe.c:6816
+msgid "Sort opfamily"
+msgstr "ソート演算子族"
+
+#: describe.c:6855
+msgid "List of operators of operator families"
+msgstr "演算子族の演算子一覧"
+
+#: describe.c:6902
+msgid "Registered left type"
+msgstr "登録左辺型"
+
+#: describe.c:6903
+msgid "Registered right type"
+msgstr "登録右辺型"
+
+#: describe.c:6904
+msgid "Number"
+msgstr "番号"
+
+#: describe.c:6948
+msgid "List of support functions of operator families"
+msgstr "演算子族のサポート関数一覧"
+
+#: describe.c:6979
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7000
+msgid "Large objects"
+msgstr "ラージ オブジェクト"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql は PostgreSQL の対話型ターミナルです。\n"
+"\n"
+
+#: help.c:76 help.c:393 help.c:473 help.c:516
+msgid "Usage:\n"
+msgstr "使い方:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [オプション]... [データベース名 [ユーザー名]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "一般的なオプション:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=コマンド 単一の(SQLまたは内部)コマンドを一つだけ実行して終了\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=DB名 接続するデータベース名(デフォルト: \"%s\")\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=FILENAME ファイルからコマンドを読み込んで実行した後に終了\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l(エル), --list 使用可能なデータベース一覧を表示して終了\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=名前=値\n"
+" psql 変数 '名前' に '値' をセット\n"
+" (例: -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc 初期化ファイル (~/.psqlrc) を読み込まない\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (数字の1), --single-transaction\n"
+" (対話形式でない場合)単一のトランザクションとして実行\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] このヘルプを表示して終了\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands バックスラッシュコマンドの一覧を表示して終了\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables 特殊変数の一覧を表示して終了\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"入出力オプション:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all スクリプトから読み込んだ入力をすべて表示\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors 失敗したコマンドを表示\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries サーバーへ送信したコマンドを表示\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden 内部コマンドが生成した問い合わせを表示\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=FILENAME セッションログをファイルに書き込む\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline 拡張コマンドライン編集機能(readline)を無効にする\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=FILENAME 問い合わせの結果をファイル (または |パイプ)に送る\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet 静かに実行 (メッセージなしで、問い合わせの出力のみ)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step シングルステップモード (各問い合わせごとに確認)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line 単一行モード (行末でSQLコマンドを終端)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"出力フォーマットのオプション\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align 桁揃えなしのテーブル出力モード\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv CSV(カンマ区切り)テーブル出力モード\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=文字列\n"
+" 桁揃えなし出力時のフィールド区切り文字\n"
+" (デフォルト: \"%s\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html HTML テーブル出力モード\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr ""
+" -P, --pset=変数[=値] 表示オプション '変数' を '値' にセット\n"
+" (\\pset コマンドを参照)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=文字列\n"
+" 桁揃えなし出力におけるレコード区切り文字\n"
+" (デフォルト: 改行)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only 行のみを表示\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=TEXT HTMLテーブルのタグ属性をセット (width, border等)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded 拡張テーブル出力に切り替える\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" 桁揃えなし出力のフィールド区切りをバイト値の0に設定\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" 桁揃えなし出力のレコード区切りをバイト値の0に設定\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"接続オプション:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr ""
+" -h, --host=HOSTNAME データベースサーバーのホストまたはソケットの\n"
+" ディレクトリ(デフォルト: \"%s\")\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "ローカルソケット"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT データベースサーバーのポート番号(デフォルト: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=USERNAME データベースのユーザー名 (デフォルト: \"%s\")\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password パスワード入力を要求しない\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password パスワードプロンプトの強制表示(本来は自動的に表示)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"詳細はpsqlの中で\"\\?\"(内部コマンドの場合)または\"\\help\"(SQLコマンドの場合)\n"
+"をタイプするか、またはPostgreSQLドキュメント中のpsqlのセクションを参照のこと。\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "バグは<%s>に報告してください。\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "一般\n"
+
+#: help.c:192
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright PostgreSQL の使い方と配布条件を表示\n"
+
+#: help.c:193
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr " \\crosstabview [列リスト] 問い合わせを実行し、結果をクロス表形式で出力\n"
+
+#: help.c:194
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose 最後のエラーメッセージを最大の冗長性で表示\n"
+
+#: help.c:195
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPTIONS)] [FILE] 問い合わせ実行 (結果はファイルまたは |パイプへ出力);\n"
+" 引数なしの\\gはセミコロンと同義\n"
+
+#: help.c:197
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc 問い合わせを実行せずに結果の説明を行う\n"
+
+#: help.c:198
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec 問い合わせを実行し、結果の中の個々の値を実行\n"
+
+#: help.c:199
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [PREFIX] 問い合わせを実行して結果を psql 変数に格納\n"
+
+#: help.c:200
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [ファイル名] \\g と同じ、ただし拡張出力モードを強制\n"
+
+#: help.c:201
+msgid " \\q quit psql\n"
+msgstr " \\q psql を終了する\n"
+
+#: help.c:202
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [秒数] 指定した秒数ごとに問い合わせを実行\n"
+
+#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304
+#: help.c:324 help.c:337 help.c:346
+msgid "\n"
+msgstr "\n"
+
+#: help.c:205
+msgid "Help\n"
+msgstr "ヘルプ\n"
+
+#: help.c:207
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [コマンド] バックスラッシュコマンドのヘルプを表示\n"
+
+#: help.c:208
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? オプション psql のコマンドライン・オプションのヘルプを表示\n"
+
+#: help.c:209
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? 変数名 特殊変数のヘルプを表示\n"
+
+#: help.c:210
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [名前] SQLコマンドの文法ヘルプの表示。* で全コマンドを表示\n"
+
+#: help.c:213
+msgid "Query Buffer\n"
+msgstr "問い合わせバッファ\n"
+
+#: help.c:214
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr ""
+" \\e [ファイル] [行番号] 現在の問い合わせバッファ(やファイル)を外部エディタで\n"
+" 編集\n"
+
+#: help.c:215
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [関数名 [行番号]] 関数定義を外部エディタで編集\n"
+
+#: help.c:216
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [ビュー名 [行番号]] ビュー定義を外部エディタで編集\n"
+
+#: help.c:217
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p 問い合わせバッファの内容を表示\n"
+
+#: help.c:218
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r 問い合わせバッファをリセット(クリア)\n"
+
+#: help.c:220
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [ファイル] ヒストリを表示またはファイルに保存\n"
+
+#: help.c:222
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w ファイル 問い合わせバッファの内容をファイルに保存\n"
+
+#: help.c:225
+msgid "Input/Output\n"
+msgstr "入出力\n"
+
+#: help.c:226
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr ""
+" \\copy ... クライアントホストに対し、データストリームを使って\n"
+" SQL COPYを実行\n"
+
+#: help.c:227
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [文字列] 文字列を標準出力に書き込む (-n で改行しない)\n"
+
+#: help.c:228
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i ファイル ファイルからコマンドを読み込んで実行\n"
+
+#: help.c:229
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr ""
+" \\ir ファイル \\i と同じ。ただし現在のスクリプトの場所からの相対パス\n"
+" で指定\n"
+
+#: help.c:230
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [ファイル] 問い合わせ結果をすべてファイルまたは |パイプ へ送出\n"
+
+#: help.c:231
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr ""
+" \\qecho [-n] [文字列] 文字列を\\oで指定した出力ストリームに書き込む(-n で改行\n"
+" しない)\n"
+
+#: help.c:232
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [文字列] 文字列を標準エラー出力に書き込む (-n で改行しない)\n"
+
+#: help.c:235
+msgid "Conditional\n"
+msgstr "条件分岐\n"
+
+#: help.c:236
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR 条件分岐ブロックの開始\n"
+
+#: help.c:237
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR 現在の条件分岐ブロック内の選択肢\n"
+
+#: help.c:238
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else 現在の条件分岐ブロックにおける最後の選択肢\n"
+
+#: help.c:239
+msgid " \\endif end conditional block\n"
+msgstr " \\endif 条件分岐ブロックの終了\n"
+
+#: help.c:242
+msgid "Informational\n"
+msgstr "情報表示\n"
+
+#: help.c:243
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (オプション:S = システムオブジェクトを表示, + = 詳細表示)\n"
+
+#: help.c:244
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] テーブル、ビュー、およびシーケンスの一覧を表示\n"
+
+#: help.c:245
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr ""
+" \\d[S+] 名前 テーブル、ビュー、シーケンス、またはインデックスの\n"
+" 説明を表示\n"
+
+#: help.c:246
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [パターン] 集約関数の一覧を表示\n"
+
+#: help.c:247
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [パターン] アクセスメソッドの一覧を表示\n"
+
+#: help.c:248
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] 演算子クラスの一覧を表示\n"
+
+#: help.c:249
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] 演算子族の一覧を表示\n"
+
+#: help.c:250
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] 演算子族の演算子の一覧を表示\n"
+
+#: help.c:251
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] 演算子族のサポート関数の一覧を表示\n"
+
+#: help.c:252
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [パターン] テーブル空間の一覧を表示\n"
+
+#: help.c:253
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [パターン] 符号化方式間の変換の一覧を表示\n"
+
+#: help.c:254
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [PATTERN] 設定パラメータの一覧を表示\n"
+
+#: help.c:255
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [パターン] キャストの一覧を表示します。\n"
+
+#: help.c:256
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [パターン] 他では表示されないオブジェクトの説明を表示\n"
+
+#: help.c:257
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [パターン] ドメインの一覧を表示\n"
+
+#: help.c:258
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [パターン] デフォルト権限の一覧を表示\n"
+
+#: help.c:259
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [パターン] 外部テーブルの一覧を表示\n"
+
+#: help.c:260
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [パターン] 外部サーバーの一覧を表示\n"
+
+#: help.c:261
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [パターン] 外部テーブルの一覧を表示\n"
+
+#: help.c:262
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [パターン] ユーザーマッピングの一覧を表示\n"
+
+#: help.c:263
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [パターン] 外部データラッパの一覧を表示\n"
+
+#: help.c:264
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [関数パターン [型パターン ...]]\n"
+" [集約/通常/プロシージャ/トリガー/ウィンドウ]\n"
+" 関数のみの一覧を表示\n"
+
+#: help.c:266
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [パターン] テキスト検索設定の一覧を表示\n"
+
+#: help.c:267
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [パターン] テキスト検索辞書の一覧を表示\n"
+
+#: help.c:268
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [パターン] テキスト検索パーサの一覧を表示\n"
+
+#: help.c:269
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [パターン] テキスト検索テンプレートの一覧を表示\n"
+
+#: help.c:270
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [パターン] ロールの一覧を表示\n"
+
+#: help.c:271
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [パターン] インデックスの一覧を表示\n"
+
+#: help.c:272
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] ラージオブジェクトの一覧を表示、\\lo_list と同じ\n"
+
+#: help.c:273
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [パターン] 手続き言語の一覧を表示\n"
+
+#: help.c:274
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [パターン] 実体化ビューの一覧を表示\n"
+
+#: help.c:275
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [パターン] スキーマの一覧を表示\n"
+
+#: help.c:276
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [演算子パターン [型パターン [型パターン]]]\n"
+" 演算子の一覧を表示\n"
+
+#: help.c:278
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [パターン] 照合順序の一覧を表示\n"
+
+#: help.c:279
+msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp [パターン] テーブル、ビュー、シーケンスのアクセス権の一覧を表示\n"
+
+#: help.c:280
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr ""
+" \\dP[itn+] [パターン] パーティションリレーション[テーブル/インデックスのみ]\n"
+" の一覧を表示 [n=入れ子]\n"
+
+#: help.c:281
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr ""
+" \\drds [ロールパターン [DBパターン]]\n"
+" データベース毎のロール設定の一覧を表示\n"
+
+#: help.c:282
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [パターン] レプリケーションのパブリケーションの一覧を表示\n"
+
+#: help.c:283
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [パターン] レプリケーションのサブスクリプションの一覧を表示\n"
+
+#: help.c:284
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [パターン] シーケンスの一覧を表示\n"
+
+#: help.c:285
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [パターン] テーブルの一覧を表示\n"
+
+#: help.c:286
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [パターン] データ型の一覧を表示\n"
+
+#: help.c:287
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [パターン] ロールの一覧を表示\n"
+
+#: help.c:288
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [パターン] ビューの一覧を表示\n"
+
+#: help.c:289
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [パターン] 機能拡張の一覧を表示\n"
+
+#: help.c:290
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [パターン] 拡張統計情報の一覧を表示\n"
+
+#: help.c:291
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [パターン] イベントトリガーの一覧を表示\n"
+
+#: help.c:292
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [パターン] データベースの一覧を表示\n"
+
+#: help.c:293
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] 関数名 関数の定義を表示\n"
+
+#: help.c:294
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] ビュー名 ビューの定義を表示\n"
+
+#: help.c:295
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [パターン] \\dp と同じ\n"
+
+#: help.c:298
+msgid "Large Objects\n"
+msgstr "ラージ・オブジェクト\n"
+
+#: help.c:299
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr ""
+" \\lo_export LOBOID ファイル名\n"
+" ラージ・オブエジェクトをファイルに書き込む\n"
+
+#: help.c:300
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import ファイル名 [コメント]\n"
+" ラージ・オブジェクトをファイルから読み込む\n"
+
+#: help.c:302
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] ラージ・オブジェクトの一覧を表示\n"
+
+#: help.c:303
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID ラージ・オブジェクトを削除\n"
+
+#: help.c:306
+msgid "Formatting\n"
+msgstr "書式設定\n"
+
+#: help.c:307
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a 非整列と整列間の出力モードの切り替え\n"
+
+#: help.c:308
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [文字列] テーブルのタイトルを設定、値がなければ削除\n"
+
+#: help.c:309
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr ""
+" \\f [文字列] 問い合わせ結果の非整列出力時のフィールド区切り文字を\n"
+" 表示または設定\n"
+
+#: help.c:310
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H HTML出力モードの切り替え (現在値: %s)\n"
+
+#: help.c:312
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [名前 [値]] テーブル出力のオプション設定\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:319
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] 結果行のみ表示 (現在値: %s)\n"
+
+#: help.c:321
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [文字列] HTMLの<table>タグ属性の設定、値がなければ解除\n"
+
+#: help.c:322
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] 拡張出力の切り替え (現在値: %s)\n"
+
+#: help.c:323
+msgid "auto"
+msgstr "自動(auto)"
+
+#: help.c:326
+msgid "Connection\n"
+msgstr "接続\n"
+
+#: help.c:328
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[DB名|- ユーザー名|- ホスト名|- ポート番号|-] | 接続文字列}\n"
+" 新しいデータベースに接続 (現在: \"%s\")\n"
+
+#: help.c:332
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[DB名|- ユーザー名|- ホスト名|- ポート番号|-] | 接続文字列}\n"
+" 新しいデータベースに接続 (現在: 未接続)\n"
+
+#: help.c:334
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo 現在の接続に関する情報を表示\n"
+
+#: help.c:335
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [エンコーディング] クライアントのエンコーディングを表示または設定\n"
+
+#: help.c:336
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [ユーザー名] ユーザーのパスワードを安全に変更\n"
+
+#: help.c:339
+msgid "Operating System\n"
+msgstr "オペレーティングシステム\n"
+
+#: help.c:340
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [DIR] カレントディレクトリを変更\n"
+
+#: help.c:341
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr ""
+" \\getenv psql変数 環境変数\n"
+" 環境変数を取得\n"
+
+#: help.c:342
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv 名前 [値] 環境変数を設定または解除\n"
+
+#: help.c:343
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] コマンドの実行時間表示の切り替え (現在値: %s)\n"
+
+#: help.c:345
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr ""
+" \\! [コマンド] シェルでコマンドを実行するか、もしくは対話型シェルを\n"
+" 起動します。\n"
+
+#: help.c:348
+msgid "Variables\n"
+msgstr "変数\n"
+
+#: help.c:349
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [テキスト] 変数名 ユーザーに対して内部変数の設定を要求します\n"
+
+#: help.c:350
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [変数名 [値]] 内部変数の値を設定、パラメータがなければ一覧を表示\n"
+
+#: help.c:351
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset 変数名 内部変数を削除\n"
+
+#: help.c:390
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"特別に扱われる変数の一覧\n"
+"\n"
+
+#: help.c:392
+msgid "psql variables:\n"
+msgstr "psql変数:\n"
+
+#: help.c:394
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=名前=値\n"
+" またはpsql内で \\set 名前 値\n"
+"\n"
+
+#: help.c:396
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" セットされている場合、SQLコマンドが成功した際に自動的にコミット\n"
+
+#: help.c:398
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" SQLキーワードの補完に使う文字ケースを指定\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:401
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" 現在接続中のデータベース名\n"
+
+#: help.c:403
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" どの入力を標準出力への出力対象とするかを設定\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:406
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" セットされていれば、バックスラッシュコマンドで実行される内部問い合わせを\n"
+" 表示; \"noexec\"を設定した場合は実行せずに表示のみ\n"
+
+#: help.c:409
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" 現在のクライアント側の文字セットのエンコーディング\n"
+
+#: help.c:411
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr ""
+" ERROR\n"
+" 最後の問い合わせが失敗であれば真、そうでなければ偽\n"
+
+#: help.c:413
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" 一度に取得および表示する結果の行数 (0 = 無制限)\n"
+
+#: help.c:415
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" 設定すると、テーブルアクセスメソッドは表示されない\n"
+"\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" 設定すると、圧縮方式は表示されない\n"
+"\n"
+
+#: help.c:419
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" コマンド履歴の制御 [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:421
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" コマンド履歴を保存するファイルの名前\n"
+
+#: help.c:423
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" コマンド履歴で保存するコマンド数の上限\n"
+
+#: help.c:425
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" 現在接続中のデータベースサーバーホスト\n"
+
+#: help.c:427
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" 対話形セッションを終わらせるのに必要なEOFの数\n"
+
+#: help.c:429
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" 最後の変更の影響を受けたOID\n"
+
+#: help.c:431
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" 最後のエラーのメッセージおよび SQLSTATE、\n"
+" なにもなければ空の文字列および\"00000\"\n"
+
+#: help.c:434
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" セットされている場合、エラーでトランザクションを停止しない (暗黙のセーブ\n"
+" ポイントを使用)\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" エラー発生後にバッチ実行を停止\n"
+
+#: help.c:438
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" 現在の接続のサーバーポート\n"
+
+#: help.c:440
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" psql の標準のプロンプトを指定\n"
+
+#: help.c:442
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" 文が前行から継続する場合のプロンプトを指定\n"
+
+#: help.c:444
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" COPY ... FROM STDIN の最中に使われるプロンプトを指定\n"
+
+#: help.c:446
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" メッセージを表示しない (-q オプションと同じ)\n"
+
+#: help.c:448
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" 最後の問い合わせで返却した、または影響を与えた行の数、または0\n"
+
+#: help.c:450
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" サーバーのバージョン(短い文字列または数値)\n"
+
+#: help.c:453
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" 複合問い合わせ(\\;)の最後の結果のみではなくすべてを表示する\n"
+
+#: help.c:455
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" メッセージコンテキストフィールドの表示を制御 [never, errors, always]\n"
+
+#: help.c:457
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" セットした場合、改行はSQLコマンドを終端する (-S オプションと同じ)\n"
+
+#: help.c:459
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" シングルステップモード (-s オプションと同じ)\n"
+
+#: help.c:461
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" 最後の問い合わせの SQLSTATE、またはエラーでなければ\"00000\"\n"
+
+#: help.c:463
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" 現在接続中のデータベースユーザー\n"
+
+#: help.c:465
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" エラー報告の詳細度を制御 [default, verbose, terse, sqlstate]\n"
+
+#: help.c:467
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql のバージョン(長い文字列、短い文字列または数値)\n"
+
+#: help.c:472
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"表示設定:\n"
+
+#: help.c:474
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=名前[=値]\n"
+" またはpsql内で \\pset 名前 [値]\n"
+"\n"
+
+#: help.c:476
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" 境界線のスタイル (番号)\n"
+
+#: help.c:478
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" 折り返し形式で目標とする横幅\n"
+
+#: help.c:480
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (or x)\n"
+" 拡張出力 [on, off, auto]\n"
+
+#: help.c:482
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" 非整列出力でのフィールド区切り文字(デフォルトは \"%s\")\n"
+
+#: help.c:485
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" 非整列出力でのフィールド区切り文字をバイト値の0に設定\n"
+
+#: help.c:487
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" テーブルフッター出力の要否を設定 [on, off]\n"
+
+#: help.c:489
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" 出力フォーマットを設定 [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:491
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" 境界線の描画スタイルを設定 [ascii, old-ascii, unicode]\n"
+
+#: help.c:493
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" null 値の代わりに表示する文字列を設定\n"
+
+#: help.c:495
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" ロケール固有文字での桁区切りを表示するかどうかを指定\n"
+
+#: help.c:497
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" いつ外部ページャーを使うかを制御 [yes, no, always]\n"
+
+#: help.c:499
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" 非整列出力でのレコード(行)区切り\n"
+
+#: help.c:501
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" 非整列出力でレコード区切りにバイト値の0に設定\n"
+
+#: help.c:503
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (or T)\n"
+" HTMLフォーマット時のtableタグの属性、もしくは latex-longtable\n"
+" フォーマット時に左寄せするデータ型の相対カラム幅を指定\n"
+
+#: help.c:506
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" 以降に表示される表のタイトルを設定\n"
+
+#: help.c:508
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" セットされた場合、実際のテーブルデータのみを表示\n"
+
+#: help.c:510
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" Unicode による線描画時のスタイルを設定 [single, double]\n"
+
+#: help.c:515
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"環境変数:\n"
+
+#: help.c:519
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" 名前=値 [名前=値] psql ...\n"
+" またはpsql内で \\setenv 名前 [値]\n"
+"\n"
+
+#: help.c:521
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set 名前=値\n"
+" psql ...\n"
+" またはpsq内で \\setenv 名前 [値]\n"
+"\n"
+
+#: help.c:524
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" 折り返し書式におけるカラム数\n"
+
+#: help.c:526
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" application_name 接続パラメータと同じ\n"
+
+#: help.c:528
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" dbname 接続パラメータと同じ\n"
+
+#: help.c:530
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" host 接続パラメータと同じ\n"
+
+#: help.c:532
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" パスワードファイル名\n"
+
+#: help.c:534
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" 接続用パスワード (推奨されません)\n"
+
+#: help.c:536
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" port 接続パラメータと同じ\n"
+
+#: help.c:538
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" user 接続パラメータと同じ\n"
+
+#: help.c:540
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" \\e, \\ef, \\ev コマンドで使われるエディタ\n"
+
+#: help.c:542
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" エディタの起動時に行番号を指定する方法\n"
+
+#: help.c:544
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" コマンドライン履歴ファイルの代替の場所\n"
+
+#: help.c:546
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" 外部ページャープログラムの名前\n"
+
+#: help.c:549
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" \\watchで使用する外部ページャープログラムの名前\n"
+
+#: help.c:552
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" ユーザーの .psqlrc ファイルの代替の場所\n"
+
+#: help.c:554
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" \\! コマンドで使われるシェル\n"
+
+#: help.c:556
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" テンポラリファイル用ディレクトリ\n"
+
+#: help.c:616
+msgid "Available help:\n"
+msgstr "利用可能なヘルプ:\n"
+
+#: help.c:711
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"コマンド: %s\n"
+"説明: %s\n"
+"書式:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:734
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"\"%s\"のヘルプがありません。\n"
+"引数なしで \\h とタイプすると、ヘルプの一覧が表示されます。\n"
+
+#: input.c:217
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "入力ファイルから読み込めませんでした: %m"
+
+#: input.c:478 input.c:516
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "ファイル\"%s\"にヒストリーを保存できませんでした: %m"
+
+#: input.c:535
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "この環境ではヒストリー機能がサポートされていません"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: データベースに接続していません"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: 現在のトランザクションは中断されました"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: 未知のトランザクション状態"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: 脱出しました"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "\"\\q\"で%sを抜けます。\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"この入力データは PostgreSQL のカスタムフォーマットのダンプです。\n"
+"このダンプをデータベースにリストアするには pg_restore コマンドを使ってください。\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "\\? でヘルプの表示、control-C で入力バッファをクリアします。"
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr " \\? でヘルプを表示します。"
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "PostgreSQL へのコマンド ライン インターフェイス、psql を使用しています。"
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"ヒント: \\copyright とタイプすると、配布条件を表示します。\n"
+" \\h とタイプすると、SQLコマンドのヘルプを表示します。\n"
+" \\? とタイプすると、psqlコマンドのヘルプを表示します。\n"
+" \\g と打つかセミコロンで閉じると、問い合わせを実行します。\n"
+" \\q で終了します。\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "\\q で終了します。"
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "control-D で終了します。"
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "control-C で終了します。"
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "問い合わせは無視されました; \\endifかCtrl-Cで現在の\\ifブロックを抜けてください"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "ブロックを閉じる\\endifを検出中に、ファイルの終端(EOF)に達しました"
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "文字列の引用符が閉じていません"
+
+#: psqlscanslash.l:811
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: メモリ不足です"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1996
+#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154
+#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228
+#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431
+#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517
+#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594
+#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730
+#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071
+#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171
+#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259
+#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338
+#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396
+#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428
+#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464
+#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499
+#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537
+#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574
+#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606
+#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638
+#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680
+#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030
+#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687
+#: sql_help.c:4735 sql_help.c:4893
+msgid "name"
+msgstr "名前"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846
+#: sql_help.c:3339 sql_help.c:4455
+msgid "aggregate_signature"
+msgstr "集約関数のシグニチャー"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "新しい名前"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3011
+msgid "new_owner"
+msgstr "新しい所有者"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "新しいスキーマ"
+
+#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484
+msgid "where aggregate_signature is:"
+msgstr "集約関数のシグニチャーには以下のものがあります:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911
+#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085
+#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341
+#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527
+#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461
+#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488
+#: sql_help.c:4491
+msgid "argmode"
+msgstr "引数のモード"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912
+#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2067 sql_help.c:2086
+#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342
+#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528
+#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475
+#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492
+msgid "argname"
+msgstr "引数の名前"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2388 sql_help.c:2597
+#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440
+#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470
+#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493
+msgid "argtype"
+msgstr "引数の型"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974
+#: sql_help.c:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343
+#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040
+#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742
+#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956
+msgid "option"
+msgstr "オプション"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433
+#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388
+msgid "where option can be:"
+msgstr "オプションには以下のものがあります:"
+
+#: sql_help.c:116 sql_help.c:2209
+msgid "allowconn"
+msgstr "接続の可否(真偽値)"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210
+#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227
+msgid "connlimit"
+msgstr "最大同時接続数"
+
+#: sql_help.c:118 sql_help.c:2211
+msgid "istemplate"
+msgstr "テンプレートかどうか(真偽値)"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4187
+msgid "new_tablespace"
+msgstr "新しいテーブル空間名"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2398 sql_help.c:2601
+#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675
+msgid "configuration_parameter"
+msgstr "設定パラメータ"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344
+#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467
+#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626
+#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915
+#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014
+#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676
+#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679
+msgid "value"
+msgstr "値"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "対象のロール"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631
+#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889
+#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338
+#: sql_help.c:4357 sql_help.c:4369
+msgid "schema_name"
+msgstr "スキーマ名"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "GRANT/REVOKEの省略形"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "GRANT/REVOKEの省略形は以下のいずれかです:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2437 sql_help.c:2438
+#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575
+#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667
+#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232
+#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933
+#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697
+msgid "role_name"
+msgstr "ロール名"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352
+#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774
+#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924
+#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981
+#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088
+#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558
+#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608
+#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651
+#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806
+#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864
+#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921
+#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044
+#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102
+#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105
+msgid "expression"
+msgstr "評価式"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "ドメイン制約"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852
+#: sql_help.c:1854 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351
+#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993
+msgid "constraint_name"
+msgstr "制約名"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "新しい制約名"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "新しいバージョン"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "メンバーオブジェクト"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "メンバーオブジェクトは以下の通りです:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856
+#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860
+#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869
+#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884
+#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894
+#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898
+#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902
+#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4451 sql_help.c:4456
+#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465
+#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477
+#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481
+#: sql_help.c:4482
+msgid "object_name"
+msgstr "オブジェクト名"
+
+#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454
+msgid "aggregate_name"
+msgstr "集約関数名"
+
+#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135
+#: sql_help.c:2137 sql_help.c:3357
+msgid "source_type"
+msgstr "変換前の型"
+
+#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136
+#: sql_help.c:2138 sql_help.c:3358
+msgid "target_type"
+msgstr "変換後の型"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133
+#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549
+#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577
+#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834
+#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072
+#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083
+msgid "function_name"
+msgstr "関数名"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542
+msgid "operator_name"
+msgstr "演算子名"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871
+#: sql_help.c:2519 sql_help.c:3481
+msgid "left_type"
+msgstr "左辺の型"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872
+#: sql_help.c:2520 sql_help.c:3482
+msgid "right_type"
+msgstr "右辺の型"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2539
+#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500
+msgid "index_method"
+msgstr "インデックスメソッド"
+
+#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467
+msgid "procedure_name"
+msgstr "プロシージャ名"
+
+#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473
+msgid "routine_name"
+msgstr "ルーチン名"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394
+#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662
+#: sql_help.c:3926 sql_help.c:4375
+msgid "type_name"
+msgstr "型名"
+
+#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599
+#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911
+#: sql_help.c:4360
+msgid "lang_name"
+msgstr "言語名"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "集約関数のシグニチャーは以下の通りです:"
+
+#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275
+msgid "handler_function"
+msgstr "ハンドラー関数"
+
+#: sql_help.c:396 sql_help.c:2276
+msgid "validator_function"
+msgstr "バリデーター関数"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "アクション"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851
+#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1983 sql_help.c:1984
+#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391
+#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629
+#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887
+#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919
+#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955
+#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978
+#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883
+#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997
+#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089
+#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614
+#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877
+#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924
+#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117
+msgid "column_name"
+msgstr "列名"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "新しい列名"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "アクションは以下のいずれかです:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2229
+#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888
+#: sql_help.c:3167 sql_help.c:4141
+msgid "data_type"
+msgstr "データ型"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2230 sql_help.c:2329
+#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911
+#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990
+msgid "collation"
+msgstr "照合順序"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339
+#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920
+msgid "column_constraint"
+msgstr "カラム制約"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968
+msgid "integer"
+msgstr "整数"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "属性オプション"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340
+#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921
+msgid "table_constraint"
+msgstr "テーブル制約"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905
+msgid "trigger_name"
+msgstr "トリガー名"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918
+msgid "parent_table"
+msgstr "親テーブル"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2261
+msgid "extension_name"
+msgstr "拡張名"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395
+msgid "execution_cost"
+msgstr "実行コスト"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396
+msgid "result_rows"
+msgstr "結果の行数"
+
+#: sql_help.c:547 sql_help.c:2397
+msgid "support_function"
+msgstr "サポート関数"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2709
+#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881
+#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890
+#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 sql_help.c:3896
+#: sql_help.c:3897 sql_help.c:3899 sql_help.c:3900 sql_help.c:3902
+#: sql_help.c:3903 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918
+#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924
+#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930
+#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335
+#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342
+#: sql_help.c:4343 sql_help.c:4345 sql_help.c:4346 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4351 sql_help.c:4352 sql_help.c:4358
+#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364
+#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370
+#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376
+#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380
+msgid "role_specification"
+msgstr "ロールの指定"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198
+#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707
+msgid "user_name"
+msgstr "ユーザー名"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716
+#: sql_help.c:3932 sql_help.c:4381
+msgid "where role_specification can be:"
+msgstr "ロール指定は以下の通りです:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "グループ名"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468
+#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930
+#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923
+#: sql_help.c:4372
+msgid "tablespace_name"
+msgstr "テーブル空間名"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783
+msgid "index_name"
+msgstr "インデックス名"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2466 sql_help.c:2500
+#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969
+#: sql_help.c:2996
+msgid "storage_parameter"
+msgstr "ストレージパラメータ"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "列番号"
+
+#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464
+msgid "large_object_oid"
+msgstr "ラージオブジェクトのOID"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889
+msgid "compression_method"
+msgstr "圧縮方式"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "新しいアクセスメソッド"
+
+#: sql_help.c:725 sql_help.c:2523
+msgid "res_proc"
+msgstr "制約選択評価関数"
+
+#: sql_help.c:726 sql_help.c:2524
+msgid "join_proc"
+msgstr "結合選択評価関数"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2541
+msgid "strategy_number"
+msgstr "戦略番号"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2543 sql_help.c:2544
+#: sql_help.c:2547 sql_help.c:2548
+msgid "op_type"
+msgstr "演算子の型"
+
+#: sql_help.c:782 sql_help.c:2545
+msgid "sort_family_name"
+msgstr "ソートファミリー名"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2546
+msgid "support_number"
+msgstr "サポート番号"
+
+#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087
+#: sql_help.c:3089
+msgid "argument_type"
+msgstr "引数の型"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779
+#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891
+#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2324
+#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574
+#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770
+#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917
+#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517
+#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885
+#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334
+#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627
+#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884
+#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060
+#: sql_help.c:5122
+msgid "table_name"
+msgstr "テーブル名"
+
+#: sql_help.c:823 sql_help.c:2576
+msgid "using_expression"
+msgstr "USING式"
+
+#: sql_help.c:824 sql_help.c:2577
+msgid "check_expression"
+msgstr "CHECK式"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624
+msgid "publication_object"
+msgstr "発行オブジェクト"
+
+#: sql_help.c:903 sql_help.c:2625
+msgid "publication_parameter"
+msgstr "パブリケーションパラメータ"
+
+#: sql_help.c:909 sql_help.c:2627
+msgid "where publication_object is one of:"
+msgstr "発行オブジェクトは以下のいずれかです:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662
+#: sql_help.c:3228
+msgid "password"
+msgstr "パスワード"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663
+#: sql_help.c:3229
+msgid "timestamp"
+msgstr "タイムスタンプ"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3892
+#: sql_help.c:4341
+msgid "database_name"
+msgstr "データベース名"
+
+#: sql_help.c:1073 sql_help.c:2732
+msgid "increment"
+msgstr "増分値"
+
+#: sql_help.c:1074 sql_help.c:2733
+msgid "minvalue"
+msgstr "最小値"
+
+#: sql_help.c:1075 sql_help.c:2734
+msgid "maxvalue"
+msgstr "最大値"
+
+#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664
+#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056
+msgid "start"
+msgstr "開始番号"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "再開始番号"
+
+#: sql_help.c:1078 sql_help.c:2736
+msgid "cache"
+msgstr "キャッシュ割り当て数"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "新しいターゲット"
+
+#: sql_help.c:1142 sql_help.c:2789
+msgid "conninfo"
+msgstr "接続文字列"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790
+msgid "publication_name"
+msgstr "パブリケーション名"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "パブリケーション・オプション"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "{REFRESH PUBLICATION の追加オプション}"
+
+#: sql_help.c:1161 sql_help.c:2791
+msgid "subscription_parameter"
+msgstr "{SUBSCRIPTION パラメータ名}"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "スキップオプション"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "パーティション名"
+
+#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922
+msgid "partition_bound_spec"
+msgstr "パーティション境界の仕様"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936
+msgid "sequence_options"
+msgstr "シーケンスオプション"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "シーケンスオプション"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "インデックスを使うテーブルの制約"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "書き換えルール名"
+
+#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961
+msgid "and partition_bound_spec is:"
+msgstr "パーティション境界の仕様は以下の通りです:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354
+#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963
+#: sql_help.c:2964
+msgid "partition_bound_expr"
+msgstr "パーティション境界式"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358
+#: sql_help.c:2965 sql_help.c:2966
+msgid "numeric_literal"
+msgstr "numericリテラル"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "そしてカラム制約は以下の通りです:"
+
+#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598
+#: sql_help.c:2934
+msgid "default_expr"
+msgstr "デフォルト表現"
+
+#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935
+msgid "generation_expr"
+msgstr "生成式"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947
+#: sql_help.c:2949 sql_help.c:2953
+msgid "index_parameters"
+msgstr "インデックスパラメータ"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956
+msgid "reftable"
+msgstr "参照テーブル"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957
+msgid "refcolumn"
+msgstr "参照列"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959
+msgid "referential_action"
+msgstr "参照動作"
+
+#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943
+msgid "and table_constraint is:"
+msgstr "テーブル制約は以下の通りです:"
+
+#: sql_help.c:1409 sql_help.c:2951
+msgid "exclude_element"
+msgstr "除外対象要素"
+
+#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662
+#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054
+msgid "operator"
+msgstr "演算子"
+
+#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954
+msgid "predicate"
+msgstr "インデックスの述語"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "テーブル制約は以下の通りです:"
+
+#: sql_help.c:1421 sql_help.c:2967
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "UNIQUE, PRIMARY KEY, EXCLUDE 制約のインデックスパラメータは以下の通りです:"
+
+#: sql_help.c:1426 sql_help.c:2972
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "EXCLUDE 制約の除外対象要素は以下の通りです:"
+
+#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912
+#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991
+msgid "opclass"
+msgstr "演算子クラス"
+
+#: sql_help.c:1430 sql_help.c:2976
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "FOREIGN KEY/REFERENCES制約の参照動作は以下の通り:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013
+msgid "tablespace_option"
+msgstr "テーブル空間のオプション"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "トークンの型"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "辞書名"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "元の辞書"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "新しい辞書"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3166
+msgid "attribute_name"
+msgstr "属性名"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "新しい属性名"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "新しい列挙値"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "隣接した列挙値"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "既存の列挙値"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "プロパティ"
+
+#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748
+#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947
+#: sql_help.c:4350
+msgid "server_name"
+msgstr "サーバー名"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261
+msgid "view_option_name"
+msgstr "ビューのオプション名"
+
+#: sql_help.c:1698 sql_help.c:3262
+msgid "view_option_value"
+msgstr "ビューオプションの値"
+
+#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958
+msgid "table_and_columns"
+msgstr "テーブルおよび列"
+
+#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745
+#: sql_help.c:4185 sql_help.c:4959
+msgid "where option can be one of:"
+msgstr "オプションには以下のうちのいずれかを指定します:"
+
+#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977
+#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747
+#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188
+#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963
+#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967
+msgid "boolean"
+msgstr "真偽値"
+
+#: sql_help.c:1724 sql_help.c:4969
+msgid "and table_and_columns is:"
+msgstr "そしてテーブルと列の指定は以下の通りです:"
+
+#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749
+msgid "transaction_mode"
+msgstr "トランザクションのモード"
+
+#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750
+msgid "where transaction_mode is one of:"
+msgstr "トランザクションのモードは以下の通りです:"
+
+#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582
+#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835
+#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064
+#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084
+msgid "argument"
+msgstr "引数"
+
+#: sql_help.c:1850
+msgid "relation_name"
+msgstr "リレーション名"
+
+#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344
+msgid "domain_name"
+msgstr "ドメイン名"
+
+#: sql_help.c:1877
+msgid "policy_name"
+msgstr "ポリシー名"
+
+#: sql_help.c:1890
+msgid "rule_name"
+msgstr "ルール名"
+
+#: sql_help.c:1909 sql_help.c:4483
+msgid "string_literal"
+msgstr "文字列リテラル"
+
+#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397
+msgid "transaction_id"
+msgstr "トランザクションID"
+
+#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017
+msgid "filename"
+msgstr "ファイル名"
+
+#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688
+#: sql_help.c:2689
+msgid "command"
+msgstr "コマンド"
+
+#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297
+#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552
+#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809
+#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049
+msgid "condition"
+msgstr "条件"
+
+#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263
+#: sql_help.c:3281 sql_help.c:3982
+msgid "query"
+msgstr "問い合わせ"
+
+#: sql_help.c:1976
+msgid "format_name"
+msgstr "フォーマット名"
+
+#: sql_help.c:1978
+msgid "delimiter_character"
+msgstr "区切り文字"
+
+#: sql_help.c:1979
+msgid "null_string"
+msgstr "NULL文字列"
+
+#: sql_help.c:1981
+msgid "quote_character"
+msgstr "引用符文字"
+
+#: sql_help.c:1982
+msgid "escape_character"
+msgstr "エスケープ文字"
+
+#: sql_help.c:1986
+msgid "encoding_name"
+msgstr "エンコーディング名"
+
+#: sql_help.c:1997
+msgid "access_method_type"
+msgstr "アクセスメソッドの型"
+
+#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090
+msgid "arg_data_type"
+msgstr "入力データ型"
+
+#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099
+msgid "sfunc"
+msgstr "状態遷移関数"
+
+#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100
+msgid "state_data_type"
+msgstr "状態データの型"
+
+#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101
+msgid "state_data_size"
+msgstr "状態データのサイズ"
+
+#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102
+msgid "ffunc"
+msgstr "終了関数"
+
+#: sql_help.c:2073 sql_help.c:2103
+msgid "combinefunc"
+msgstr "結合関数"
+
+#: sql_help.c:2074 sql_help.c:2104
+msgid "serialfunc"
+msgstr "シリアライズ関数"
+
+#: sql_help.c:2075 sql_help.c:2105
+msgid "deserialfunc"
+msgstr "デシリアライズ関数"
+
+#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106
+msgid "initial_condition"
+msgstr "初期条件"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "msfunc"
+msgstr "前方状態遷移関数"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "minvfunc"
+msgstr "逆状態遷移関数"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "mstate_data_type"
+msgstr "移動集約モード時の状態値のデータ型"
+
+#: sql_help.c:2080 sql_help.c:2110
+msgid "mstate_data_size"
+msgstr "移動集約モード時の状態値のデータサイズ"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "mffunc"
+msgstr "移動集約モード時の終了関数"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minitial_condition"
+msgstr "移動集約モード時の初期条件"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "sort_operator"
+msgstr "ソート演算子"
+
+#: sql_help.c:2096
+msgid "or the old syntax"
+msgstr "または古い構文"
+
+#: sql_help.c:2098
+msgid "base_type"
+msgstr "基本の型"
+
+#: sql_help.c:2155 sql_help.c:2202
+msgid "locale"
+msgstr "ロケール"
+
+#: sql_help.c:2156 sql_help.c:2203
+msgid "lc_collate"
+msgstr "照合順序"
+
+#: sql_help.c:2157 sql_help.c:2204
+msgid "lc_ctype"
+msgstr "Ctype(変換演算子)"
+
+#: sql_help.c:2158 sql_help.c:4450
+msgid "provider"
+msgstr "プロバイダ"
+
+#: sql_help.c:2160 sql_help.c:2263
+msgid "version"
+msgstr "バージョン"
+
+#: sql_help.c:2162
+msgid "existing_collation"
+msgstr "既存の照合順序"
+
+#: sql_help.c:2172
+msgid "source_encoding"
+msgstr "変換元のエンコーディング"
+
+#: sql_help.c:2173
+msgid "dest_encoding"
+msgstr "変換先のエンコーディング"
+
+#: sql_help.c:2199 sql_help.c:3039
+msgid "template"
+msgstr "テンプレート"
+
+#: sql_help.c:2200
+msgid "encoding"
+msgstr "エンコード"
+
+#: sql_help.c:2201
+msgid "strategy"
+msgstr "ストラテジ"
+
+#: sql_help.c:2205
+msgid "icu_locale"
+msgstr "ICUロケール"
+
+#: sql_help.c:2206
+msgid "locale_provider"
+msgstr "ロケールプロバイダ"
+
+#: sql_help.c:2207
+msgid "collation_version"
+msgstr "照合順序バージョン"
+
+#: sql_help.c:2212
+msgid "oid"
+msgstr "オブジェクトID"
+
+#: sql_help.c:2232
+msgid "constraint"
+msgstr "制約条件"
+
+#: sql_help.c:2233
+msgid "where constraint is:"
+msgstr "制約条件は以下の通りです:"
+
+#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112
+msgid "event"
+msgstr "イベント"
+
+#: sql_help.c:2248
+msgid "filter_variable"
+msgstr "フィルター変数"
+
+#: sql_help.c:2249
+msgid "filter_value"
+msgstr "フィルター値"
+
+#: sql_help.c:2345 sql_help.c:2931
+msgid "where column_constraint is:"
+msgstr "カラム制約は以下の通りです:"
+
+#: sql_help.c:2390
+msgid "rettype"
+msgstr "戻り値の型"
+
+#: sql_help.c:2392
+msgid "column_type"
+msgstr "列の型"
+
+#: sql_help.c:2401 sql_help.c:2604
+msgid "definition"
+msgstr "定義"
+
+#: sql_help.c:2402 sql_help.c:2605
+msgid "obj_file"
+msgstr "オブジェクトファイル名"
+
+#: sql_help.c:2403 sql_help.c:2606
+msgid "link_symbol"
+msgstr "リンクシンボル"
+
+#: sql_help.c:2404 sql_help.c:2607
+msgid "sql_body"
+msgstr "SQL本体"
+
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "uid"
+msgstr "UID"
+
+#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913
+#: sql_help.c:2927 sql_help.c:2995
+msgid "method"
+msgstr "インデックスメソッド"
+
+#: sql_help.c:2463
+msgid "opclass_parameter"
+msgstr "演算子クラスパラメータ"
+
+#: sql_help.c:2480
+msgid "call_handler"
+msgstr "呼び出しハンドラー"
+
+#: sql_help.c:2481
+msgid "inline_handler"
+msgstr "インラインハンドラー"
+
+#: sql_help.c:2482
+msgid "valfunction"
+msgstr "バリデーション関数"
+
+#: sql_help.c:2521
+msgid "com_op"
+msgstr "交代演算子"
+
+#: sql_help.c:2522
+msgid "neg_op"
+msgstr "否定演算子"
+
+#: sql_help.c:2540
+msgid "family_name"
+msgstr "演算子族の名前"
+
+#: sql_help.c:2551
+msgid "storage_type"
+msgstr "ストレージタイプ"
+
+#: sql_help.c:2690 sql_help.c:3119
+msgid "where event can be one of:"
+msgstr "イベントは以下のいずれかです:"
+
+#: sql_help.c:2710 sql_help.c:2712
+msgid "schema_element"
+msgstr "スキーマ要素"
+
+#: sql_help.c:2749
+msgid "server_type"
+msgstr "サーバーのタイプ"
+
+#: sql_help.c:2750
+msgid "server_version"
+msgstr "サーバーのバージョン"
+
+#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347
+msgid "fdw_name"
+msgstr "外部データラッパ名"
+
+#: sql_help.c:2768 sql_help.c:2771
+msgid "statistics_name"
+msgstr "統計オブジェクト名"
+
+#: sql_help.c:2772
+msgid "statistics_kind"
+msgstr "統計種別"
+
+#: sql_help.c:2788
+msgid "subscription_name"
+msgstr "サブスクリプション名"
+
+#: sql_help.c:2893
+msgid "source_table"
+msgstr "コピー元のテーブル"
+
+#: sql_help.c:2894
+msgid "like_option"
+msgstr "LIKEオプション"
+
+#: sql_help.c:2960
+msgid "and like_option is:"
+msgstr "LIKE オプションは以下の通りです:"
+
+#: sql_help.c:3012
+msgid "directory"
+msgstr "ディレクトリ"
+
+#: sql_help.c:3026
+msgid "parser_name"
+msgstr "パーサ名"
+
+#: sql_help.c:3027
+msgid "source_config"
+msgstr "複製元の設定"
+
+#: sql_help.c:3056
+msgid "start_function"
+msgstr "開始関数"
+
+#: sql_help.c:3057
+msgid "gettoken_function"
+msgstr "トークン取得関数"
+
+#: sql_help.c:3058
+msgid "end_function"
+msgstr "終了関数"
+
+#: sql_help.c:3059
+msgid "lextypes_function"
+msgstr "LEXTYPE関数"
+
+#: sql_help.c:3060
+msgid "headline_function"
+msgstr "見出し関数"
+
+#: sql_help.c:3072
+msgid "init_function"
+msgstr "初期処理関数"
+
+#: sql_help.c:3073
+msgid "lexize_function"
+msgstr "LEXIZE関数"
+
+#: sql_help.c:3086
+msgid "from_sql_function_name"
+msgstr "{FROM SQL 関数名}"
+
+#: sql_help.c:3088
+msgid "to_sql_function_name"
+msgstr "{TO SQL 関数名}"
+
+#: sql_help.c:3114
+msgid "referenced_table_name"
+msgstr "被参照テーブル名"
+
+#: sql_help.c:3115
+msgid "transition_relation_name"
+msgstr "移行用リレーション名"
+
+#: sql_help.c:3118
+msgid "arguments"
+msgstr "引数"
+
+#: sql_help.c:3170
+msgid "label"
+msgstr "ラベル"
+
+#: sql_help.c:3172
+msgid "subtype"
+msgstr "当該範囲のデータ型"
+
+#: sql_help.c:3173
+msgid "subtype_operator_class"
+msgstr "当該範囲のデータ型の演算子クラス"
+
+#: sql_help.c:3175
+msgid "canonical_function"
+msgstr "正規化関数"
+
+#: sql_help.c:3176
+msgid "subtype_diff_function"
+msgstr "当該範囲のデータ型の差分抽出関数"
+
+#: sql_help.c:3177
+msgid "multirange_type_name"
+msgstr "複範囲型名"
+
+#: sql_help.c:3179
+msgid "input_function"
+msgstr "入力関数"
+
+#: sql_help.c:3180
+msgid "output_function"
+msgstr "出力関数"
+
+#: sql_help.c:3181
+msgid "receive_function"
+msgstr "受信関数"
+
+#: sql_help.c:3182
+msgid "send_function"
+msgstr "送信関数"
+
+#: sql_help.c:3183
+msgid "type_modifier_input_function"
+msgstr "型修飾子の入力関数"
+
+#: sql_help.c:3184
+msgid "type_modifier_output_function"
+msgstr "型修飾子の出力関数"
+
+#: sql_help.c:3185
+msgid "analyze_function"
+msgstr "分析関数"
+
+#: sql_help.c:3186
+msgid "subscript_function"
+msgstr "添字関数"
+
+#: sql_help.c:3187
+msgid "internallength"
+msgstr "内部長"
+
+#: sql_help.c:3188
+msgid "alignment"
+msgstr "バイト境界"
+
+#: sql_help.c:3189
+msgid "storage"
+msgstr "ストレージ"
+
+#: sql_help.c:3190
+msgid "like_type"
+msgstr "LIKEの型"
+
+#: sql_help.c:3191
+msgid "category"
+msgstr "カテゴリー"
+
+#: sql_help.c:3192
+msgid "preferred"
+msgstr "優先データ型かどうか(真偽値)"
+
+#: sql_help.c:3193
+msgid "default"
+msgstr "デフォルト"
+
+#: sql_help.c:3194
+msgid "element"
+msgstr "要素のデータ型"
+
+#: sql_help.c:3195
+msgid "delimiter"
+msgstr "区切り記号"
+
+#: sql_help.c:3196
+msgid "collatable"
+msgstr "照合可能"
+
+#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547
+#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042
+msgid "with_query"
+msgstr "WITH問い合わせ"
+
+#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572
+#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591
+#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836
+#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061
+#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078
+#: sql_help.c:5086
+msgid "alias"
+msgstr "別名"
+
+#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603
+#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852
+#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860
+#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090
+#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098
+msgid "from_item"
+msgstr "FROM項目"
+
+#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928
+msgid "cursor_name"
+msgstr "カーソル名"
+
+#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929
+msgid "output_expression"
+msgstr "出力表現"
+
+#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652
+#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045
+msgid "output_name"
+msgstr "出力名"
+
+#: sql_help.c:3316
+msgid "code"
+msgstr "コードブロック"
+
+#: sql_help.c:3721
+msgid "parameter"
+msgstr "パラメータ"
+
+#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142
+msgid "statement"
+msgstr "文"
+
+#: sql_help.c:3778 sql_help.c:4116
+msgid "direction"
+msgstr "方向"
+
+#: sql_help.c:3780 sql_help.c:4118
+msgid "where direction can be one of:"
+msgstr "方向 は以下のうちのいずれか:"
+
+#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784
+#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121
+#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562
+#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819
+#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057
+msgid "count"
+msgstr "取り出す位置や行数"
+
+#: sql_help.c:3888 sql_help.c:4337
+msgid "sequence_name"
+msgstr "シーケンス名"
+
+#: sql_help.c:3906 sql_help.c:4355
+msgid "arg_name"
+msgstr "引数名"
+
+#: sql_help.c:3907 sql_help.c:4356
+msgid "arg_type"
+msgstr "引数の型"
+
+#: sql_help.c:3914 sql_help.c:4363
+msgid "loid"
+msgstr "ラージオブジェクトid"
+
+#: sql_help.c:3945
+msgid "remote_schema"
+msgstr "リモートスキーマ"
+
+#: sql_help.c:3948
+msgid "local_schema"
+msgstr "ローカルスキーマ"
+
+#: sql_help.c:3983
+msgid "conflict_target"
+msgstr "競合ターゲット"
+
+#: sql_help.c:3984
+msgid "conflict_action"
+msgstr "競合時アクション"
+
+#: sql_help.c:3987
+msgid "where conflict_target can be one of:"
+msgstr "競合ターゲットは以下のいずれかです:"
+
+#: sql_help.c:3988
+msgid "index_column_name"
+msgstr "インデックスのカラム名"
+
+#: sql_help.c:3989
+msgid "index_expression"
+msgstr "インデックス表現"
+
+#: sql_help.c:3992
+msgid "index_predicate"
+msgstr "インデックスの述語"
+
+#: sql_help.c:3994
+msgid "and conflict_action is one of:"
+msgstr "競合時アクションは以下のいずれかです:"
+
+#: sql_help.c:4000 sql_help.c:4925
+msgid "sub-SELECT"
+msgstr "副問い合わせ句"
+
+#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901
+msgid "channel"
+msgstr "チャネル"
+
+#: sql_help.c:4031
+msgid "lockmode"
+msgstr "ロックモード"
+
+#: sql_help.c:4032
+msgid "where lockmode is one of:"
+msgstr "ロックモードは以下のいずれかです:"
+
+#: sql_help.c:4068
+msgid "target_table_name"
+msgstr "ターゲットテーブル名"
+
+#: sql_help.c:4069
+msgid "target_alias"
+msgstr "ターゲット別名"
+
+#: sql_help.c:4070
+msgid "data_source"
+msgstr "データ源"
+
+#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091
+msgid "join_condition"
+msgstr "JOIN条件"
+
+#: sql_help.c:4072
+msgid "when_clause"
+msgstr "WHEN句"
+
+#: sql_help.c:4073
+msgid "where data_source is:"
+msgstr "ここで\"データ源\"は以下の通り:"
+
+#: sql_help.c:4074
+msgid "source_table_name"
+msgstr "データ源テーブル名"
+
+#: sql_help.c:4075
+msgid "source_query"
+msgstr "データ源問い合わせ"
+
+#: sql_help.c:4076
+msgid "source_alias"
+msgstr "データ源別名"
+
+#: sql_help.c:4077
+msgid "and when_clause is:"
+msgstr "WHEN句は以下の通り:"
+
+#: sql_help.c:4079
+msgid "merge_update"
+msgstr "マージ更新"
+
+#: sql_help.c:4080
+msgid "merge_delete"
+msgstr "マージ削除"
+
+#: sql_help.c:4082
+msgid "merge_insert"
+msgstr "マージ挿入"
+
+#: sql_help.c:4083
+msgid "and merge_insert is:"
+msgstr "そして\"マージ挿入\"は以下の通り:"
+
+#: sql_help.c:4086
+msgid "and merge_update is:"
+msgstr "そして\"マージ更新\"は以下の通り:"
+
+#: sql_help.c:4091
+msgid "and merge_delete is:"
+msgstr "そして\"マージ削除\"は以下の通り:"
+
+#: sql_help.c:4132
+msgid "payload"
+msgstr "ペイロード"
+
+#: sql_help.c:4159
+msgid "old_role"
+msgstr "元のロール"
+
+#: sql_help.c:4160
+msgid "new_role"
+msgstr "新しいロール"
+
+#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413
+msgid "savepoint_name"
+msgstr "セーブポイント名"
+
+#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868
+#: sql_help.c:5048 sql_help.c:5106
+msgid "grouping_element"
+msgstr "グルーピング要素"
+
+#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050
+msgid "window_name"
+msgstr "ウィンドウ名"
+
+#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051
+msgid "window_definition"
+msgstr "ウィンドウ定義"
+
+#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660
+#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052
+#: sql_help.c:5066 sql_help.c:5110
+msgid "select"
+msgstr "SELECT句"
+
+#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059
+msgid "where from_item can be one of:"
+msgstr "FROM項目は以下のいずれかです:"
+
+#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580
+#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833
+#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068
+#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087
+msgid "column_alias"
+msgstr "列別名"
+
+#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063
+msgid "sampling_method"
+msgstr "サンプリングメソッド"
+
+#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065
+msgid "seed"
+msgstr "乱数シード"
+
+#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870
+#: sql_help.c:5069 sql_help.c:5108
+msgid "with_query_name"
+msgstr "WITH問い合わせ名"
+
+#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841
+#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082
+#: sql_help.c:5085
+msgid "column_definition"
+msgstr "カラム定義"
+
+#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857
+#: sql_help.c:5089 sql_help.c:5095
+msgid "join_type"
+msgstr "JOINタイプ"
+
+#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092
+msgid "join_column"
+msgstr "JOINカラム"
+
+#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093
+msgid "join_using_alias"
+msgstr "JOIN用別名"
+
+#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099
+msgid "and grouping_element can be one of:"
+msgstr "グルーピング要素は以下のいずれかです:"
+
+#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107
+msgid "and with_query is:"
+msgstr "WITH問い合わせは以下のいずれかです:"
+
+#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111
+msgid "values"
+msgstr "VALUES句"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112
+msgid "insert"
+msgstr "INSERT句"
+
+#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113
+msgid "update"
+msgstr "UPDATE句"
+
+#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114
+msgid "delete"
+msgstr "DELETE句"
+
+#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116
+msgid "search_seq_col_name"
+msgstr "SEARCH順序列名"
+
+#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118
+msgid "cycle_mark_col_name"
+msgstr "循環識別列名"
+
+#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119
+msgid "cycle_mark_value"
+msgstr "循環識別値"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120
+msgid "cycle_mark_default"
+msgstr "循環識別デフォルト"
+
+#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121
+msgid "cycle_path_col_name"
+msgstr "循環パス列名"
+
+#: sql_help.c:4653
+msgid "new_table"
+msgstr "新しいテーブル"
+
+#: sql_help.c:4724
+msgid "snapshot_id"
+msgstr "スナップショットID"
+
+#: sql_help.c:4984
+msgid "sort_expression"
+msgstr "ソート表現"
+
+#: sql_help.c:5128 sql_help.c:6112
+msgid "abort the current transaction"
+msgstr "現在のトランザクションを中止します"
+
+#: sql_help.c:5134
+msgid "change the definition of an aggregate function"
+msgstr "集約関数の定義を変更します"
+
+#: sql_help.c:5140
+msgid "change the definition of a collation"
+msgstr "照合順序の定義を変更します"
+
+#: sql_help.c:5146
+msgid "change the definition of a conversion"
+msgstr "エンコーディング変換ルールの定義を変更します"
+
+#: sql_help.c:5152
+msgid "change a database"
+msgstr "データベースを変更します"
+
+#: sql_help.c:5158
+msgid "define default access privileges"
+msgstr "デフォルトのアクセス権限を定義します"
+
+#: sql_help.c:5164
+msgid "change the definition of a domain"
+msgstr "ドメインの定義を変更します"
+
+#: sql_help.c:5170
+msgid "change the definition of an event trigger"
+msgstr "イベントトリガーの定義を変更します"
+
+#: sql_help.c:5176
+msgid "change the definition of an extension"
+msgstr "機能拡張の定義を変更します"
+
+#: sql_help.c:5182
+msgid "change the definition of a foreign-data wrapper"
+msgstr "外部データラッパの定義を変更します"
+
+#: sql_help.c:5188
+msgid "change the definition of a foreign table"
+msgstr "外部テーブルの定義を変更します"
+
+#: sql_help.c:5194
+msgid "change the definition of a function"
+msgstr "関数の定義を変更します"
+
+#: sql_help.c:5200
+msgid "change role name or membership"
+msgstr "ロール名またはメンバーシップを変更します"
+
+#: sql_help.c:5206
+msgid "change the definition of an index"
+msgstr "インデックスの定義を変更します"
+
+#: sql_help.c:5212
+msgid "change the definition of a procedural language"
+msgstr "手続き言語の定義を変更します"
+
+#: sql_help.c:5218
+msgid "change the definition of a large object"
+msgstr "ラージオブジェクトの定義を変更します"
+
+#: sql_help.c:5224
+msgid "change the definition of a materialized view"
+msgstr "実体化ビューの定義を変更します"
+
+#: sql_help.c:5230
+msgid "change the definition of an operator"
+msgstr "演算子の定義を変更します"
+
+#: sql_help.c:5236
+msgid "change the definition of an operator class"
+msgstr "演算子クラスの定義を変更します"
+
+#: sql_help.c:5242
+msgid "change the definition of an operator family"
+msgstr "演算子族の定義を変更します"
+
+#: sql_help.c:5248
+msgid "change the definition of a row-level security policy"
+msgstr "行レベルのセキュリティ ポリシーの定義を変更します"
+
+#: sql_help.c:5254
+msgid "change the definition of a procedure"
+msgstr "プロシージャの定義を変更します"
+
+#: sql_help.c:5260
+msgid "change the definition of a publication"
+msgstr "パブリケーションの定義を変更します"
+
+#: sql_help.c:5266 sql_help.c:5368
+msgid "change a database role"
+msgstr "データベースロールを変更します"
+
+#: sql_help.c:5272
+msgid "change the definition of a routine"
+msgstr "ルーチンの定義を変更します"
+
+#: sql_help.c:5278
+msgid "change the definition of a rule"
+msgstr "ルールの定義を変更します"
+
+#: sql_help.c:5284
+msgid "change the definition of a schema"
+msgstr "スキーマの定義を変更します"
+
+#: sql_help.c:5290
+msgid "change the definition of a sequence generator"
+msgstr "シーケンス生成器の定義を変更します"
+
+#: sql_help.c:5296
+msgid "change the definition of a foreign server"
+msgstr "外部サーバーの定義を変更します"
+
+#: sql_help.c:5302
+msgid "change the definition of an extended statistics object"
+msgstr "拡張統計情報オブジェクトの定義を変更します"
+
+#: sql_help.c:5308
+msgid "change the definition of a subscription"
+msgstr "サブスクリプションの定義を変更します"
+
+#: sql_help.c:5314
+msgid "change a server configuration parameter"
+msgstr "サーバーの設定パラメータを変更します"
+
+#: sql_help.c:5320
+msgid "change the definition of a table"
+msgstr "テーブルの定義を変更します。"
+
+#: sql_help.c:5326
+msgid "change the definition of a tablespace"
+msgstr "テーブル空間の定義を変更します"
+
+#: sql_help.c:5332
+msgid "change the definition of a text search configuration"
+msgstr "テキスト検索設定の定義を変更します"
+
+#: sql_help.c:5338
+msgid "change the definition of a text search dictionary"
+msgstr "テキスト検索辞書の定義を変更します"
+
+#: sql_help.c:5344
+msgid "change the definition of a text search parser"
+msgstr "テキスト検索パーサーの定義を変更します"
+
+#: sql_help.c:5350
+msgid "change the definition of a text search template"
+msgstr "テキスト検索テンプレートの定義を変更します"
+
+#: sql_help.c:5356
+msgid "change the definition of a trigger"
+msgstr "トリガーの定義を変更します"
+
+#: sql_help.c:5362
+msgid "change the definition of a type"
+msgstr "型の定義を変更します"
+
+#: sql_help.c:5374
+msgid "change the definition of a user mapping"
+msgstr "ユーザーマッピングの定義を変更します"
+
+#: sql_help.c:5380
+msgid "change the definition of a view"
+msgstr "ビューの定義を変更します"
+
+#: sql_help.c:5386
+msgid "collect statistics about a database"
+msgstr "データベースの統計情報を収集します"
+
+#: sql_help.c:5392 sql_help.c:6190
+msgid "start a transaction block"
+msgstr "トランザクション区間を開始します"
+
+#: sql_help.c:5398
+msgid "invoke a procedure"
+msgstr "プロシージャを実行します"
+
+#: sql_help.c:5404
+msgid "force a write-ahead log checkpoint"
+msgstr "先行書き込みログのチェックポイントを強制的に実行します"
+
+#: sql_help.c:5410
+msgid "close a cursor"
+msgstr "カーソルを閉じます"
+
+#: sql_help.c:5416
+msgid "cluster a table according to an index"
+msgstr "インデックスに従ってテーブルをクラスタ化します"
+
+#: sql_help.c:5422
+msgid "define or change the comment of an object"
+msgstr "オブジェクトのコメントを定義または変更します"
+
+#: sql_help.c:5428 sql_help.c:5986
+msgid "commit the current transaction"
+msgstr "現在のトランザクションをコミットします"
+
+#: sql_help.c:5434
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "二相コミットのために事前に準備されたトランザクションをコミットします"
+
+#: sql_help.c:5440
+msgid "copy data between a file and a table"
+msgstr "ファイルとテーブルとの間でデータをコピーします"
+
+#: sql_help.c:5446
+msgid "define a new access method"
+msgstr "新しいアクセスメソッドを定義します"
+
+#: sql_help.c:5452
+msgid "define a new aggregate function"
+msgstr "新しい集約関数を定義します"
+
+#: sql_help.c:5458
+msgid "define a new cast"
+msgstr "新しい型変換を定義します"
+
+#: sql_help.c:5464
+msgid "define a new collation"
+msgstr "新しい照合順序を定義します"
+
+#: sql_help.c:5470
+msgid "define a new encoding conversion"
+msgstr "新しいエンコーディング変換を定義します"
+
+#: sql_help.c:5476
+msgid "create a new database"
+msgstr "新しいデータベースを作成します"
+
+#: sql_help.c:5482
+msgid "define a new domain"
+msgstr "新しいドメインを定義します"
+
+#: sql_help.c:5488
+msgid "define a new event trigger"
+msgstr "新しいイベントトリガーを定義します"
+
+#: sql_help.c:5494
+msgid "install an extension"
+msgstr "機能拡張をインストールします"
+
+#: sql_help.c:5500
+msgid "define a new foreign-data wrapper"
+msgstr "新しい外部データラッパを定義します"
+
+#: sql_help.c:5506
+msgid "define a new foreign table"
+msgstr "新しい外部テーブルを定義します"
+
+#: sql_help.c:5512
+msgid "define a new function"
+msgstr "新しい関数を定義します"
+
+#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680
+msgid "define a new database role"
+msgstr "新しいデータベースロールを定義します"
+
+#: sql_help.c:5524
+msgid "define a new index"
+msgstr "新しいインデックスを定義します"
+
+#: sql_help.c:5530
+msgid "define a new procedural language"
+msgstr "新しい手続き言語を定義します"
+
+#: sql_help.c:5536
+msgid "define a new materialized view"
+msgstr "新しい実体化ビューを定義します"
+
+#: sql_help.c:5542
+msgid "define a new operator"
+msgstr "新しい演算子を定義します"
+
+#: sql_help.c:5548
+msgid "define a new operator class"
+msgstr "新しい演算子クラスを定義します"
+
+#: sql_help.c:5554
+msgid "define a new operator family"
+msgstr "新しい演算子族を定義します"
+
+#: sql_help.c:5560
+msgid "define a new row-level security policy for a table"
+msgstr "テーブルに対して新しい行レベルセキュリティポリシーを定義します"
+
+#: sql_help.c:5566
+msgid "define a new procedure"
+msgstr "新しいプロシージャを定義します"
+
+#: sql_help.c:5572
+msgid "define a new publication"
+msgstr "新しいパブリケーションを定義します"
+
+#: sql_help.c:5584
+msgid "define a new rewrite rule"
+msgstr "新しい書き換えルールを定義します"
+
+#: sql_help.c:5590
+msgid "define a new schema"
+msgstr "新しいスキーマを定義します"
+
+#: sql_help.c:5596
+msgid "define a new sequence generator"
+msgstr "新しいシーケンス生成器を定義します。"
+
+#: sql_help.c:5602
+msgid "define a new foreign server"
+msgstr "新しい外部サーバーを定義します"
+
+#: sql_help.c:5608
+msgid "define extended statistics"
+msgstr "拡張統計情報を定義します"
+
+#: sql_help.c:5614
+msgid "define a new subscription"
+msgstr "新しいサブスクリプションを定義します"
+
+#: sql_help.c:5620
+msgid "define a new table"
+msgstr "新しいテーブルを定義します"
+
+#: sql_help.c:5626 sql_help.c:6148
+msgid "define a new table from the results of a query"
+msgstr "問い合わせの結果から新しいテーブルを定義します"
+
+#: sql_help.c:5632
+msgid "define a new tablespace"
+msgstr "新しいテーブル空間を定義します"
+
+#: sql_help.c:5638
+msgid "define a new text search configuration"
+msgstr "新しいテキスト検索設定を定義します"
+
+#: sql_help.c:5644
+msgid "define a new text search dictionary"
+msgstr "新しいテキスト検索辞書を定義します"
+
+#: sql_help.c:5650
+msgid "define a new text search parser"
+msgstr "新しいテキスト検索パーサーを定義します"
+
+#: sql_help.c:5656
+msgid "define a new text search template"
+msgstr "新しいテキスト検索テンプレートを定義します"
+
+#: sql_help.c:5662
+msgid "define a new transform"
+msgstr "新しいデータ変換を定義します"
+
+#: sql_help.c:5668
+msgid "define a new trigger"
+msgstr "新しいトリガーを定義します"
+
+#: sql_help.c:5674
+msgid "define a new data type"
+msgstr "新しいデータ型を定義します"
+
+#: sql_help.c:5686
+msgid "define a new mapping of a user to a foreign server"
+msgstr "外部サーバーに対するユーザーの新しいマッピングを定義します。"
+
+#: sql_help.c:5692
+msgid "define a new view"
+msgstr "新しいビューを定義します"
+
+#: sql_help.c:5698
+msgid "deallocate a prepared statement"
+msgstr "準備した文を解放します"
+
+#: sql_help.c:5704
+msgid "define a cursor"
+msgstr "カーソルを定義します"
+
+#: sql_help.c:5710
+msgid "delete rows of a table"
+msgstr "テーブルの行を削除します"
+
+#: sql_help.c:5716
+msgid "discard session state"
+msgstr "セッション状態を破棄します"
+
+#: sql_help.c:5722
+msgid "execute an anonymous code block"
+msgstr "無名コードブロックを実行します"
+
+#: sql_help.c:5728
+msgid "remove an access method"
+msgstr "アクセスメソッドを削除します"
+
+#: sql_help.c:5734
+msgid "remove an aggregate function"
+msgstr "集約関数を削除します"
+
+#: sql_help.c:5740
+msgid "remove a cast"
+msgstr "型変換を削除します"
+
+#: sql_help.c:5746
+msgid "remove a collation"
+msgstr "照合順序を削除します"
+
+#: sql_help.c:5752
+msgid "remove a conversion"
+msgstr "符号化方式変換を削除します"
+
+#: sql_help.c:5758
+msgid "remove a database"
+msgstr "データベースを削除します"
+
+#: sql_help.c:5764
+msgid "remove a domain"
+msgstr "ドメインを削除します"
+
+#: sql_help.c:5770
+msgid "remove an event trigger"
+msgstr "イベントトリガーを削除します"
+
+#: sql_help.c:5776
+msgid "remove an extension"
+msgstr "機能拡張を削除します"
+
+#: sql_help.c:5782
+msgid "remove a foreign-data wrapper"
+msgstr "外部データラッパを削除します"
+
+#: sql_help.c:5788
+msgid "remove a foreign table"
+msgstr "外部テーブルを削除します"
+
+#: sql_help.c:5794
+msgid "remove a function"
+msgstr "関数を削除します"
+
+#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968
+msgid "remove a database role"
+msgstr "データベースロールを削除します"
+
+#: sql_help.c:5806
+msgid "remove an index"
+msgstr "インデックスを削除します"
+
+#: sql_help.c:5812
+msgid "remove a procedural language"
+msgstr "手続き言語を削除します"
+
+#: sql_help.c:5818
+msgid "remove a materialized view"
+msgstr "実体化ビューを削除します"
+
+#: sql_help.c:5824
+msgid "remove an operator"
+msgstr "演算子を削除します"
+
+#: sql_help.c:5830
+msgid "remove an operator class"
+msgstr "演算子クラスを削除します"
+
+#: sql_help.c:5836
+msgid "remove an operator family"
+msgstr "演算子族を削除します"
+
+#: sql_help.c:5842
+msgid "remove database objects owned by a database role"
+msgstr "データベースロールが所有するデータベースオブジェクトを削除します"
+
+#: sql_help.c:5848
+msgid "remove a row-level security policy from a table"
+msgstr "テーブルから行レベルのセキュリティポリシーを削除します"
+
+#: sql_help.c:5854
+msgid "remove a procedure"
+msgstr "プロシージャを削除します"
+
+#: sql_help.c:5860
+msgid "remove a publication"
+msgstr "パブリケーションを削除します"
+
+#: sql_help.c:5872
+msgid "remove a routine"
+msgstr "ルーチンを削除します"
+
+#: sql_help.c:5878
+msgid "remove a rewrite rule"
+msgstr "書き換えルールを削除します"
+
+#: sql_help.c:5884
+msgid "remove a schema"
+msgstr "スキーマを削除します"
+
+#: sql_help.c:5890
+msgid "remove a sequence"
+msgstr "シーケンスを削除します"
+
+#: sql_help.c:5896
+msgid "remove a foreign server descriptor"
+msgstr "外部サーバー記述子を削除します"
+
+#: sql_help.c:5902
+msgid "remove extended statistics"
+msgstr "拡張統計情報を削除します"
+
+#: sql_help.c:5908
+msgid "remove a subscription"
+msgstr "サブスクリプションを削除します"
+
+#: sql_help.c:5914
+msgid "remove a table"
+msgstr "テーブルを削除します"
+
+#: sql_help.c:5920
+msgid "remove a tablespace"
+msgstr "テーブル空間を削除します"
+
+#: sql_help.c:5926
+msgid "remove a text search configuration"
+msgstr "テキスト検索設定を削除します"
+
+#: sql_help.c:5932
+msgid "remove a text search dictionary"
+msgstr "テキスト検索辞書を削除します"
+
+#: sql_help.c:5938
+msgid "remove a text search parser"
+msgstr "テキスト検索パーサーを削除します"
+
+#: sql_help.c:5944
+msgid "remove a text search template"
+msgstr "テキスト検索テンプレートを削除します"
+
+#: sql_help.c:5950
+msgid "remove a transform"
+msgstr "データ変換を削除します"
+
+#: sql_help.c:5956
+msgid "remove a trigger"
+msgstr "トリガーを削除します"
+
+#: sql_help.c:5962
+msgid "remove a data type"
+msgstr "データ型を削除します"
+
+#: sql_help.c:5974
+msgid "remove a user mapping for a foreign server"
+msgstr "外部サーバーのユーザーマッピングを削除します"
+
+#: sql_help.c:5980
+msgid "remove a view"
+msgstr "ビューを削除します"
+
+#: sql_help.c:5992
+msgid "execute a prepared statement"
+msgstr "準備した文を実行します"
+
+#: sql_help.c:5998
+msgid "show the execution plan of a statement"
+msgstr "文の実行計画を表示します"
+
+#: sql_help.c:6004
+msgid "retrieve rows from a query using a cursor"
+msgstr "カーソルを使って問い合わせから行を取り出します"
+
+#: sql_help.c:6010
+msgid "define access privileges"
+msgstr "アクセス権限を定義します"
+
+#: sql_help.c:6016
+msgid "import table definitions from a foreign server"
+msgstr "外部サーバーからテーブル定義をインポートします"
+
+#: sql_help.c:6022
+msgid "create new rows in a table"
+msgstr "テーブルに新しい行を作成します"
+
+#: sql_help.c:6028
+msgid "listen for a notification"
+msgstr "通知メッセージを監視します"
+
+#: sql_help.c:6034
+msgid "load a shared library file"
+msgstr "共有ライブラリファイルをロードします"
+
+#: sql_help.c:6040
+msgid "lock a table"
+msgstr "テーブルをロックします"
+
+#: sql_help.c:6046
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "条件によってテーブルの行を挿入、更新または削除する"
+
+#: sql_help.c:6052
+msgid "position a cursor"
+msgstr "カーソルを位置づけます"
+
+#: sql_help.c:6058
+msgid "generate a notification"
+msgstr "通知を生成します"
+
+#: sql_help.c:6064
+msgid "prepare a statement for execution"
+msgstr "実行に備えて文を準備します"
+
+#: sql_help.c:6070
+msgid "prepare the current transaction for two-phase commit"
+msgstr "二相コミットに備えて現在のトランザクションを準備します"
+
+#: sql_help.c:6076
+msgid "change the ownership of database objects owned by a database role"
+msgstr "データベースロールが所有するデータベースオブジェクトの所有権を変更します"
+
+#: sql_help.c:6082
+msgid "replace the contents of a materialized view"
+msgstr "実体化ビューの内容を置き換えます"
+
+#: sql_help.c:6088
+msgid "rebuild indexes"
+msgstr "インデックスを再構築します"
+
+#: sql_help.c:6094
+msgid "destroy a previously defined savepoint"
+msgstr "以前に定義されたセーブポイントを破棄します"
+
+#: sql_help.c:6100
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "実行時パラメータの値をデフォルト値に戻します"
+
+#: sql_help.c:6106
+msgid "remove access privileges"
+msgstr "アクセス権限を削除します"
+
+#: sql_help.c:6118
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "二相コミットのために事前に準備されたトランザクションをキャンセルします"
+
+#: sql_help.c:6124
+msgid "roll back to a savepoint"
+msgstr "セーブポイントまでロールバックします"
+
+#: sql_help.c:6130
+msgid "define a new savepoint within the current transaction"
+msgstr "現在のトランザクション内で新しいセーブポイントを定義します"
+
+#: sql_help.c:6136
+msgid "define or change a security label applied to an object"
+msgstr "オブジェクトに適用されるセキュリティラベルを定義または変更します"
+
+#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232
+msgid "retrieve rows from a table or view"
+msgstr "テーブルまたはビューから行を取得します"
+
+#: sql_help.c:6154
+msgid "change a run-time parameter"
+msgstr "実行時パラメータを変更します"
+
+#: sql_help.c:6160
+msgid "set constraint check timing for the current transaction"
+msgstr "現在のトランザクションについて、制約チェックのタイミングを設定します"
+
+#: sql_help.c:6166
+msgid "set the current user identifier of the current session"
+msgstr "現在のセッションの現在のユーザー識別子を設定します"
+
+#: sql_help.c:6172
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "セッションのユーザー識別子および現在のセッションの現在のユーザー識別子を設定します"
+
+#: sql_help.c:6178
+msgid "set the characteristics of the current transaction"
+msgstr "現在のトランザクションの特性を設定します"
+
+#: sql_help.c:6184
+msgid "show the value of a run-time parameter"
+msgstr "実行時パラメータの値を表示します"
+
+#: sql_help.c:6202
+msgid "empty a table or set of tables"
+msgstr "一つの、または複数のテーブルを空にします"
+
+#: sql_help.c:6208
+msgid "stop listening for a notification"
+msgstr "通知メッセージの監視を中止します"
+
+#: sql_help.c:6214
+msgid "update rows of a table"
+msgstr "テーブルの行を更新します"
+
+#: sql_help.c:6220
+msgid "garbage-collect and optionally analyze a database"
+msgstr "ガーベッジコレクションを行い、また必要に応じてデータベースを分析します"
+
+#: sql_help.c:6226
+msgid "compute a set of rows"
+msgstr "行セットを計算します"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 は非対話モード時でのみ使用可能です"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "ロックファイル\"%s\"をオープンできませんでした: %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"\"help\"でヘルプを表示します。\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "表示パラメータ\"%s\"を設定できませんでした"
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細は\"%s --help\"を実行してください。"
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "余分なコマンドライン引数\"%s\"は無視されました"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "実行可能ファイルが見つかりませんでした"
+
+#: tab-complete.c:5955
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"タブ補完の問い合わせに失敗しました: %s\n"
+"問い合わせ:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "\"%2$s\"の値\"%1$s\"が認識できません: 真偽値を指定してください"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "\"%2$s\"の値\"%1$s\"が不正です: 整数を指定してください"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "変数名が不正です: \"%s\""
+
+#: variables.c:419
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"\"%2$s\"の値\"%1$s\"が認識できません。\n"
+"有効な値は %3$s。"
diff --git a/src/bin/psql/po/ka.po b/src/bin/psql/po/ka.po
new file mode 100644
index 0000000..1e6cb84
--- /dev/null
+++ b/src/bin/psql/po/ka.po
@@ -0,0 +1,6456 @@
+# Georgian message translation file for psql
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the psql (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-03-26 18:16+0000\n"
+"PO-Revision-Date: 2023-03-27 07:16+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდომა: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გაფრთხილება: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტალები: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნება: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "მიმდინარე საქაღალდის იდენტიფიკაციის პრობლემა: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "არასწორი ბინარული ფაილი \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "ბინარული ფაილის (%s) წაკითხვის შეცდოა"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "გასაშვებად ფაილის \"%s\" პოვნა შეუძლებელია"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "საქაღალდის %s-ზე შეცვლის შეცდომა: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "სიმბოლური ბმის \"%s\" წაკითხვის შეცდომა: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s()-ის შეცდომა: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "არასაკმარისი მეხსიერება"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "არასაკმარისი მეხსიერება\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ნულოვანი მაჩვენებლის დუბლირება შეუძლებელია (შიდა შეცდომა)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "მომხმარებლის ეფექტური ID-ის (%ld) ამოხსნა შეუძლებელია: %s"
+
+#: ../../common/username.c:45 command.c:575
+msgid "user does not exist"
+msgstr "მომხმარებელი არ არსებობს"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "მომხარებლის სახელის ამოხსნის პრობლემა: შეცდომის კოდი: %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "ბრძანება გაშვებადი არაა"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "ბრძანება ვერ ვიპოვე"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "შვილეული პროცესი დასრულდა სტატუსით %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "შვილეული პროცესი დასრულდა გამონაკლისით 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "პროცესი გაჩერდა სიგნალით: %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "შვილეული პროცესი დასრულდა უცნობი სტატუსით %d"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "გაუქმების მოთხოვნა გაგზავნილია\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "გაუქმების მოთხოვნის გაგზავნა შეუძლებელია: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu მწკრივი)"
+msgstr[1] "(%lu მწკრივი)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "შეწყვეტილია\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "ცხრილის შემცველობაზე თავსართის დამატება შეუძლებელია: სვეტების რაოდენობა %d გადაჭარბებულია.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "ცხრილის შემცველობაზე უჯრედის დამატება შეუძლებელია: უჯრედების რაოდენობა %d-ზე მეტია.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "გამოტანის არასწორი ფორმატი (შიდა შეცდომა): %d"
+
+#: ../../fe_utils/psqlscan.l:702
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "რეკურსიული გაფართოების გამოტოვება ცვლადისთვის \"%s\""
+
+#: ../../port/thread.c:100 ../../port/thread.c:136
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "ლოკალური მომხმარებლის ID-ის (%d) ამოხსნა შეუძლებელია: %s"
+
+#: ../../port/thread.c:105 ../../port/thread.c:141
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "ლოკალური მომხმარებელი ID-ით %d არ არსებობს"
+
+#: command.c:232
+#, c-format
+msgid "invalid command \\%s"
+msgstr "არასწორი ბრძანება \\%s"
+
+#: command.c:234
+#, c-format
+msgid "Try \\? for help."
+msgstr "დახმარებისთვის სცადეთ \\? ."
+
+#: command.c:252
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: დამატებითი არგუმენტი \"%s\" იგნორირებულია"
+
+#: command.c:304
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "\\%s ბრძანება გნორირებულია; მიმდინარე \\if ბლოკიდან გამოსასვლელად გამოიყენეთ \\endif ან Control-C"
+
+#: command.c:573
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "მომხმარებლის, ID-ით %ld, საწყის საქაღალდეზე გადასვლის შეცდომა: %s"
+
+#: command.c:592
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: საქაღალდის \"%s\"-ზე შეცვლის შეცდომა: %m"
+
+#: command.c:617
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "ამჟამად მონაცემთა ბაზასთან მიერთებული არ ბრძანდებით.\n"
+
+#: command.c:627
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "ახლა მიერთებული ბრძანდებით ბაზასთან \"%s\" როგორც მომხმარებელი \"%s\" მისამართზე \"%s\" და პორტზე \"%s\".\n"
+
+#: command.c:630
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "ახლა მიერთებული ბრძანდებით ბაზასთან \"%s\" როგორც მომხმარებელი \"%s\" სოკეტით \"%s\" და პორტზე \"%s\".\n"
+
+#: command.c:636
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "ახლა მიერთებული ბრძანდებით ბაზასთან \"%s\" როგორც მომხმარებელი \"%s\" ჰოსტზე \"%s\" (მისამართით \"%s\") და პორტზე \"%s\".\n"
+
+#: command.c:639
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "ახლა მიერთებული ბრძანდებით ბაზასთან \"%s\" როგორც მომხმარებელი \"%s\" ჰოსტზე \"%s\" და პორტზე \"%s\".\n"
+
+#: command.c:1030 command.c:1125 command.c:2654
+#, c-format
+msgid "no query buffer"
+msgstr "მოთხოვნების ბაფერის გარეშე"
+
+#: command.c:1063 command.c:5491
+#, c-format
+msgid "invalid line number: %s"
+msgstr "ხაზის არასწორი ნომერი: %s"
+
+#: command.c:1203
+msgid "No changes"
+msgstr "ცვლილებების გარეშე"
+
+#: command.c:1282
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: კოდირების არასწორი სახელი ან გადაყვანის პროცედურა არ არსებობს"
+
+#: command.c:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597
+#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100
+#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443
+#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1324
+msgid "There is no previous error."
+msgstr "წინა შეცდომის გარეშე."
+
+#: command.c:1437
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: აკლია მარჯვენა მრგვალი ფრჩხილი"
+
+#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989
+#: command.c:2173 command.c:2415 command.c:2621 command.c:2661
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: აკლია საჭირო არგუმენტი"
+
+#: command.c:1782
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: არ შეიძლება \\else -ის შემდეგ იყოს"
+
+#: command.c:1787
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: შესაბამისი \\if -ის გარეშე"
+
+#: command.c:1851
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: ვერ გაჩნდება \\else -ის შემდეგ"
+
+#: command.c:1856
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: შესაბამისი \\if -ის გარეშე"
+
+#: command.c:1896
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: შესაბამისი \\if -ის გარეშე"
+
+#: command.c:2053
+msgid "Query buffer is empty."
+msgstr "მოთხოვნის ბაფერი ცარიელია."
+
+#: command.c:2096
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "შეიყვანეთ მომხმარებლის (\"%s\") ახალი პაროლი: "
+
+#: command.c:2100
+msgid "Enter it again: "
+msgstr "შეიყვანეთ კდევ ერთხელ: "
+
+#: command.c:2109
+#, c-format
+msgid "Passwords didn't match."
+msgstr "პაროლები არ ემთხვევა."
+
+#: command.c:2208
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: ცვლადის მნიშვნელობის წაკითხვის შეცდომა"
+
+#: command.c:2311
+msgid "Query buffer reset (cleared)."
+msgstr "მოთხოვნის ბაფერი ცარიელია(გასუფთავდა)."
+
+#: command.c:2333
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "ისტორია ჩაწერილია ფაილში \"%s\".\n"
+
+#: command.c:2420
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: გარემოს ცვლადის სახელი \"=\" -ს არ შეიძლება შეიცავდეს"
+
+#: command.c:2468
+#, c-format
+msgid "function name is required"
+msgstr "ფუნქციის სახელი აუცილებელია"
+
+#: command.c:2470
+#, c-format
+msgid "view name is required"
+msgstr "საჭიროა ხედის სახელი"
+
+#: command.c:2593
+msgid "Timing is on."
+msgstr "დროის დათვლა ჩართულია."
+
+#: command.c:2595
+msgid "Timing is off."
+msgstr "დროის დათვლა გამორთულია."
+
+#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952
+#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008
+#: command.c:4022 command.c:4049 command.c:4107 common.c:77 copy.c:331
+#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:3107 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "პაროლი: "
+
+#: command.c:3112 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "პაროლი მომხმარებლისთვის %s: "
+
+#: command.c:3168
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "შეერთების სტრიქონის გამოყენებისას მომხმარებლის, ჰოსტისა და და პორტის არ მითითება"
+
+#: command.c:3203
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "მონაცემთა ბაზის კავშირი პარამეტრების ხელახლა გამოსაყენებლად არ არსებობს"
+
+#: command.c:3511
+#, c-format
+msgid "Previous connection kept"
+msgstr "წინა შეერთება ჯერ კიდევ არსებობს"
+
+#: command.c:3517
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3573
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "ახლა მიერთებული ბრძანდებით ბაზასთან \"%s\" როგორც მომხმარებელი \"%s\" მისამართზე \"%s\" და პორტზე \"%s\".\n"
+
+#: command.c:3576
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "ახლა მიერთებული ბრძანდებით ბაზასთან \"%s\" როგორც მომხმარებელი \"%s\" სოკეტით \"%s\" და პორტზე \"%s\".\n"
+
+#: command.c:3582
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "ახლა მიერთებული ბრძანდებით ბაზასთან \"%s\" როგორც მომხმარებელი \"%s\" ჰოსტზე \"%s\" (მისამართით \"%s\") და პორტზე \"%s\".\n"
+
+#: command.c:3585
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "ახლა მიერთებული ბრძანდებით ბაზასთან \"%s\" როგორც მომხმარებელი \"%s\" ჰოსტზე \"%s\" და პორტზე \"%s\".\n"
+
+#: command.c:3590
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "ახლა მიერთებული ბრძანდებით ბაზასთან \"%s\" როგორც მომხმარებელი \"%s\"\n"
+
+#: command.c:3630
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, სერვერი %s)\n"
+
+#: command.c:3643
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"გაფრთხილება: %s ძირითადი ვერსია %s, სერვერის ძირითადი ვერსია %s.\n"
+" psql-ის ზოგიერთმა ფუნქციამ შეიძლება არ იმუშაოს.\n"
+
+#: command.c:3680
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "SSL შეერთება (პროდოკოლი: %s, შიფრაცა: %s, შეკუშმვა: %s)\n"
+
+#: command.c:3681 command.c:3682
+msgid "unknown"
+msgstr "უცნობი"
+
+#: command.c:3683 help.c:42
+msgid "off"
+msgstr "გამორთული"
+
+#: command.c:3683 help.c:42
+msgid "on"
+msgstr "ჩართ"
+
+#: command.c:3697
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "GSSAPI-ით დაშიფრული შეერთება\n"
+
+#: command.c:3717
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"გაფრთხილება: კონსოლის კოდირება (%u) განსხვავდება Windows კოდირებისგან(%u)\n"
+" 8-ბიტიანი სიმბოლოებმა შეიძლება სწორად არ იმუშაოს. მეტი დეტალებისთვის\n"
+" იხილეთ psql-ის დოკუმენტაციის გვერდი გვერდი \"შენიშვნები Windows-ის მომხმარებლებისთვის\".\n"
+
+#: command.c:3822
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "საჭიროა გარემოს ცვლადის PSQL_EDITOR_LINENUMBER_ARG დაყენება ხაზის ნომერზე"
+
+#: command.c:3851
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "რედაქტორის გაშვების შეცდომა: \"%s\""
+
+#: command.c:3853
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "/bin/sh-ის გაშვების შეცდომა"
+
+#: command.c:3903
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "დროებითი საქაღალდის მოძებნის შეცდომა: %s"
+
+#: command.c:3930
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "დროებითი ფაილის (\"%s\") გახსნის შეცდომა: %m"
+
+#: command.c:4266
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: \"%s\"-ის არასწორი აბრევიატურა ორივეს, \"%s\"-ს და \"%s-ს ემთხვევა\""
+
+#: command.c:4286
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: დასაშვები ფორმატებია: aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4305
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: ხაზის ნებადართული სტილებია ascii, old-ascii და unicode"
+
+#: command.c:4320
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: უნიკოდის საზღვრის ხაზის ნებადართული სტილებია single და double"
+
+#: command.c:4335
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: უნიკოდის სვეტის ხაზის ნებადართული სტილებია single და double"
+
+#: command.c:4350
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset:უნიკოდის თავსართის ხაზების ნებადართულ სტილებია single და double"
+
+#: command.c:4393
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep ერთი ერთბაიტიანი სიმბოლო უნდა იყოს"
+
+#: command.c:4398
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep არ შეიძლება იყოს ორმაგი ბრჭყალი, ხაზის დასასრული და კარეტის გადატანა"
+
+#: command.c:4535 command.c:4723
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: არასწორი პარამეტრი: %s"
+
+#: command.c:4555
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "საზღვრის სტილი: %d\n"
+
+#: command.c:4561
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "სამიზნის სიგანე დაყენებული არაა.\n"
+
+#: command.c:4563
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "სამიზნის სიგანეა %d.\n"
+
+#: command.c:4570
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "გაფართოებული ეკრანი ჩართულია.\n"
+
+#: command.c:4572
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "გაფართოებული ეკრანი ავტომატურად გამოიყენება.\n"
+
+#: command.c:4574
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "გაფართოებული ეკრანი გამორთულია.\n"
+
+#: command.c:4580
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "CSV-ში ველების განმაცალკევებელია \"%s\".\n"
+
+#: command.c:4588 command.c:4596
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "ველების განმაცალკევებელი ნულოვანი ბაიტია.\n"
+
+#: command.c:4590
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "ველების განმაცალკევებელია \"%s\".\n"
+
+#: command.c:4603
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "მდგომარეობის ზოლი ჩართულია.\n"
+
+#: command.c:4605
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "ნაგულისხმები ქვესართი გამორთულია\n"
+
+#: command.c:4611
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "გამოტანის ფორმატია %s.\n"
+
+#: command.c:4617
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "ხაზის სტილია %s.\n"
+
+#: command.c:4624
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "ნულოვანია ეკრანია \"%s\".\n"
+
+#: command.c:4632
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "რიცხვების ენაზე მორგებული გამოტანა ჩართულია.\n"
+
+#: command.c:4634
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "რიცხვების ენაზე მორგებული გამოტანა გამორთულა.\n"
+
+#: command.c:4641
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "გრძელი გამოტანისას გამოიყენება გვერდების გადამრთველი.\n"
+
+#: command.c:4643
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "გვერდების გადამრთველი ყოველთვის გამოიყენება.\n"
+
+#: command.c:4645
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "გვერდების გადამრთველი გამორთულია.\n"
+
+#: command.c:4651
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "გვერდების გადამრთველი %d-ზე ნაკლებ ხაზზე არ მუშაობს.\n"
+msgstr[1] "გვერდების გადამრთველი %d-ზე ნაკლებ ხაზზე არ მუშაობს.\n"
+
+#: command.c:4661 command.c:4671
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "ჩანაწერის გამყოფი ნული ბაიტია.\n"
+
+#: command.c:4663
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "ჩანაწერის გამყოფია <newline>.\n"
+
+#: command.c:4665
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "ჩანაწერის გამყოფია \"%s\".\n"
+
+#: command.c:4678
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "ცხრილის ატრიბუტებია \"%s\".\n"
+
+#: command.c:4681
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "ცხრილის ატრიბუტები მოხსნილია.\n"
+
+#: command.c:4688
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "სათაურია \"%s\".\n"
+
+#: command.c:4690
+#, c-format
+msgid "Title is unset.\n"
+msgstr "სათაურის დაყენება გაუქმდა.\n"
+
+#: command.c:4697
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "მხოლოდ სტრუქტურები ჩართულია.\n"
+
+#: command.c:4699
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "მხოლოდ სტრუქტურები გამორთულია.\n"
+
+#: command.c:4705
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "უნიკოდის საზღვრის ხაზის სტილია \"%s\".\n"
+
+#: command.c:4711
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "უნიკოდის სვეტის ხაზის სტილია \"%s\".\n"
+
+#: command.c:4717
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "უნიკოდის თავსართის ხაზის სტილია \"%s\".\n"
+
+#: command.c:4950
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: შეცდომა"
+
+#: command.c:4984
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch ცარიელი მოთხოვნით გამოყენებული ვერ იქნება"
+
+#: command.c:5016
+#, c-format
+msgid "could not set timer: %m"
+msgstr "დროის აღმრიცხველის დაყენების შეცდომა: %m"
+
+#: command.c:5078
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (ყოველ %g-ში)\n"
+
+#: command.c:5081
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (ყოველ %g-ში)\n"
+
+#: command.c:5142
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "სიგნალებისთვის დალოდება შეუძლებელია: %m"
+
+#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* მოთხოვნა **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5386
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" ხედი არაა"
+
+#: command.c:5402
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "reloptions მასივის დამუშავების შეცდომა"
+
+#: common.c:166
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "გაქცევა აქტიური შეერთებს გარეშე შეუძლებელია"
+
+#: common.c:207
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "გარსის ბრძანება ხაზის გადატანას ან კარეტის დაბრუნებას შეიცავს: \"%s\""
+
+#: common.c:311
+#, c-format
+msgid "connection to server was lost"
+msgstr "სერვერთან კავშირი დაკარგულია"
+
+#: common.c:315
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "სერვერთან კავშირი დაკარგულია. ვეცდები თავიდან დავიწყო: "
+
+#: common.c:320
+#, c-format
+msgid "Failed.\n"
+msgstr "წარუმატებელი.\n"
+
+#: common.c:337
+#, c-format
+msgid "Succeeded.\n"
+msgstr "წარმატებულია.\n"
+
+#: common.c:389 common.c:1001
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "მოულოდნელი PQresultStatus: %d"
+
+#: common.c:511
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "დრო: %.3f მწმ\n"
+
+#: common.c:526
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "დრო: %.3f მწმ (%02d:%06.3f)\n"
+
+#: common.c:535
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "დრო: %.3f მწმ (%02d:%02d:%06.3f)\n"
+
+#: common.c:542
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "დრო: %.3f მწმ (%.0f დღე %02d:%02d:%06.3f)\n"
+
+#: common.c:566 common.c:623 common.c:1034 describe.c:6135
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "ამჟამად მონაცემთა ბაზასთან მიერთებული არ ბრძანდებით."
+
+#: common.c:654
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "მიღებულია ასინქრონული გაფრთხილება \"%s\" შემცველობით \"%s\" სერვერის პროცესისგან PID-ით %d.\n"
+
+#: common.c:657
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "მიღებულია ასინქრონული გაფრთხილება \"%s\" სერვერის პროცესისგან PID-ით %d.\n"
+
+#: common.c:688
+#, c-format
+msgid "could not print result table: %m"
+msgstr "შედეგების ცხრილის გამოტანის შეცდომა: %m"
+
+#: common.c:708
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "\\gset -სთვის მწკრივები არ დაბრუნებულა"
+
+#: common.c:713
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "\\gset -სთვის ერთზე მეტი მწკრივი დაბრუნდა"
+
+#: common.c:731
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "მცდელობა, \\gset-ი სპეციალურ ცვლადზე (\"%s\") ყოფილიყო გამოყენებული, იგნორირებულია"
+
+#: common.c:1043
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(ერთნაბიჯიანი რეჟიმი: გადაამოწმეთ ბრძანება)*******************************************\n"
+"%s\n"
+"***(დააწექით Enter-ს გასაგრძელებლად. გასაუქმებლად კი x-ს და შემდეგ Enter-ს )********************\n"
+
+#: common.c:1126
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "ოპერატორი: %s"
+
+#: common.c:1162
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "ტრანზაქციის მოულოდნელი სტატუსი (%d)"
+
+#: common.c:1303 describe.c:2020
+msgid "Column"
+msgstr "სვეტი"
+
+#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037
+#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021
+#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504
+#: describe.c:5767
+msgid "Type"
+msgstr "ტიპი"
+
+#: common.c:1353
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "ბრძანებას შედეგები არ აქვს, ან შედეგებში სვეტები არაა.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: საჭიროა არგუმენტები"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: დამუშავების შეცდომა: \"%s\""
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: დამუშავების შეცდომა ხაზის ბოლოსთან"
+
+#: copy.c:328
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "ბრძანების (\"%s\") შესრულების შეცდომა: %m"
+
+#: copy.c:344
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ფაილი \"%s\" არ არსებობს: %m"
+
+#: copy.c:348
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: საქაღალდ(იდან/ში) კოპირება შეუძლებელია"
+
+#: copy.c:385
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "გარე ბრძანებამდე ფაიფის დახურვის შეცდომა: %m"
+
+#: copy.c:390
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: copy.c:453 copy.c:463
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "შეცდომა COPY-ის მონაცემების ჩაწერისას: %m"
+
+#: copy.c:469
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "COPY-ის მონაცემების გადატანის შეცდომა: %s"
+
+#: copy.c:530
+msgid "canceled by user"
+msgstr "გაუქმებულია მომხმარებლის მიერ"
+
+#: copy.c:541
+msgid ""
+"Enter data to be copied followed by a newline.\n"
+"End with a backslash and a period on a line by itself, or an EOF signal."
+msgstr ""
+"შეიყვანეთ დასაკოპირებელიმ ხაზის გადატანით დასრულებული მონაცემები.\n"
+"დაასრულეთ უკანა ხაზით და წერტილით იგივე ხაზში ხაზით, ან EOF სიგნალით."
+
+#: copy.c:684
+msgid "aborted because of read failure"
+msgstr "დასრულდა კითხვის შეცდომის გამო"
+
+#: copy.c:718
+msgid "trying to exit copy mode"
+msgstr "კოპირების რეჟიმიდან გამოსვლის მცდელობა"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: ოპერატორმა შედეგების სეტი არ დააბრუნა"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: მოთხოვნამ სულ ცოტა, სამი სვეტი უნდა დააბრუნოს"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: ვერტიკალური და ჰორიზონტალური თავსართები სხვადასხვა სვეტებში უნდა იყოს"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: როცა მოთხოვნა სამზე მეტ სვეტს აბრუნებს, ასევე საჭიროა მონაცემების სვეტის მითითება"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: გადაჭარბებულია სვეტების მაქსიმალური რაოდენობა (%d)"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: მოთხოვნის შედეგი მონაცემების მრავალ მნიშვნელობას შეიცავს მწკრივისთვის \"%s\", სვეტი \"%s\""
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: სვეტის რიცხვი %d დიაპაზონს 1..%d გარეთაა"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: სვეტის არასწორი სახელი: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: სვეტის სახელი არ არსებობს: \"%s\""
+
+#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029
+#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090
+#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866
+#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420
+#: describe.c:5477 describe.c:5881 describe.c:5959
+msgid "Schema"
+msgstr "სქემა"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636
+#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258
+#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341
+#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867
+#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410
+#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748
+#: describe.c:5957 describe.c:6186 describe.c:6494
+msgid "Name"
+msgstr "სახელი"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "შედეგის მონაცემების ტიპი"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "არგუმენტის მონაცემების ტიპი"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423
+#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041
+#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280
+#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777
+#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248
+#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422
+#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895
+#: describe.c:5960 describe.c:6992
+msgid "Description"
+msgstr "აღწერა"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "აგრეგატული ფუნქცების სია"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "სერვერს (ვერსია %s) წვდომის მეთოდების მხარდაჭერა არ გააჩნია."
+
+#: describe.c:168
+msgid "Index"
+msgstr "ინდექსი"
+
+#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882
+msgid "Table"
+msgstr "ცხრილი"
+
+#: describe.c:177 describe.c:5679
+msgid "Handler"
+msgstr "დამმუშავებელი"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "წვდომის მეთოდების სია"
+
+#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181
+#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588
+#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187
+#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718
+#: describe.c:6980
+msgid "Owner"
+msgstr "მფლობელი"
+
+#: describe.c:231
+msgid "Location"
+msgstr "მდებარეობა"
+
+#: describe.c:241 describe.c:3509
+msgid "Options"
+msgstr "პარამეტრები"
+
+#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934
+msgid "Size"
+msgstr "ზომა"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "ცხრილის სივრცეების სია"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df მხოლოდ [anptwS+] -ს იღებს პარამეტრად"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df - არ იღებს \"%c\" პარამეტრს, როცა სერვერის ვერსიაა %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "აგ"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "ფანჯარა"
+
+#: describe.c:356
+msgid "proc"
+msgstr "პროც"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "ფუნქც"
+
+#: describe.c:374 describe.c:1390
+msgid "trigger"
+msgstr "ტრიგერი"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "დაურღვეველი"
+
+#: describe.c:387
+msgid "stable"
+msgstr "სტაბილური"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "ცვალებადი"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "ცვალებადობა"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "შეზღუდულია"
+
+#: describe.c:398
+msgid "safe"
+msgstr "უსაფრთხო"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "სახიფათო"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "პარალელური"
+
+#: describe.c:405
+msgid "definer"
+msgstr "აღმწერი"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "ჩამწოდებელი"
+
+#: describe.c:407
+msgid "Security"
+msgstr "უსაფრთხოება"
+
+#: describe.c:412
+msgid "Language"
+msgstr "ენა"
+
+#: describe.c:416 describe.c:420
+msgid "Source code"
+msgstr "საწყისი კოდი"
+
+#: describe.c:594
+msgid "List of functions"
+msgstr "ფუნქციების სია"
+
+#: describe.c:657
+msgid "Internal name"
+msgstr "შიდა სახელი"
+
+#: describe.c:659
+msgid "Elements"
+msgstr "ელემენტები"
+
+#: describe.c:711
+msgid "List of data types"
+msgstr "მონაცემების ტიპების სია"
+
+#: describe.c:814
+msgid "Left arg type"
+msgstr "მარცხენა არგუმენტის ტიპი"
+
+#: describe.c:815
+msgid "Right arg type"
+msgstr "მარჯვენა არგუმენტის ტიპი"
+
+#: describe.c:816
+msgid "Result type"
+msgstr "შედეგის ტიპი"
+
+#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247
+#: describe.c:6909 describe.c:6913
+msgid "Function"
+msgstr "ფუნქცია"
+
+#: describe.c:902
+msgid "List of operators"
+msgstr "ოპერატორების სია"
+
+#: describe.c:938
+msgid "Encoding"
+msgstr "კოდირება"
+
+#: describe.c:939 describe.c:4868
+msgid "Collate"
+msgstr "დაშლა"
+
+#: describe.c:940 describe.c:4869
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878
+msgid "ICU Locale"
+msgstr "ICU ენა"
+
+#: describe.c:946 describe.c:952
+msgid "Locale Provider"
+msgstr "ენის მომწოდებელი"
+
+#: describe.c:964
+msgid "Tablespace"
+msgstr "ცხრილების სივრცე"
+
+#: describe.c:990
+msgid "List of databases"
+msgstr "მონაცემთა ბაზების სია"
+
+#: describe.c:1031 describe.c:1184 describe.c:3882
+msgid "table"
+msgstr "ცხრილი"
+
+#: describe.c:1032 describe.c:3883
+msgid "view"
+msgstr "ხედი"
+
+#: describe.c:1033 describe.c:3884
+msgid "materialized view"
+msgstr "მატერიალიზებული ხედი"
+
+#: describe.c:1034 describe.c:1186 describe.c:3886
+msgid "sequence"
+msgstr "მიმდევრობა"
+
+#: describe.c:1035 describe.c:3888
+msgid "foreign table"
+msgstr "გარე ცხრილი"
+
+#: describe.c:1036 describe.c:3889 describe.c:4101
+msgid "partitioned table"
+msgstr "დაყოფილი ცხრილი"
+
+#: describe.c:1047
+msgid "Column privileges"
+msgstr "სვეტის წვდომები"
+
+#: describe.c:1078 describe.c:1112
+msgid "Policies"
+msgstr "წესები"
+
+#: describe.c:1143 describe.c:4510 describe.c:6577
+msgid "Access privileges"
+msgstr "წვდომები"
+
+#: describe.c:1188
+msgid "function"
+msgstr "ფუნქცია"
+
+#: describe.c:1190
+msgid "type"
+msgstr "ტიპი"
+
+#: describe.c:1192
+msgid "schema"
+msgstr "სქემა"
+
+#: describe.c:1215
+msgid "Default access privileges"
+msgstr "ნაგულისხმები წვდომები"
+
+#: describe.c:1259
+msgid "Object"
+msgstr "ობიექტი"
+
+#: describe.c:1273
+msgid "table constraint"
+msgstr "ცხრილის შეზღუდვები"
+
+#: describe.c:1297
+msgid "domain constraint"
+msgstr "დომენის შეზღუდვები"
+
+#: describe.c:1321
+msgid "operator class"
+msgstr "ოპერატორის კლასი"
+
+#: describe.c:1345
+msgid "operator family"
+msgstr "ოპერატორის ოჯახი"
+
+#: describe.c:1368
+msgid "rule"
+msgstr "წესი"
+
+#: describe.c:1414
+msgid "Object descriptions"
+msgstr "ობიექტების აღწერა"
+
+#: describe.c:1479 describe.c:4007
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "ურთიერთობა სახელით \"%s\" არ არსებობს."
+
+#: describe.c:1482 describe.c:4010
+#, c-format
+msgid "Did not find any relations."
+msgstr "ურთიერთობები ნაპოვნი არაა."
+
+#: describe.c:1678
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "ურთიერთობები, რომლის OID=%s, არ არსებობს."
+
+#: describe.c:1726 describe.c:1750
+msgid "Start"
+msgstr "დაწყება"
+
+#: describe.c:1727 describe.c:1751
+msgid "Minimum"
+msgstr "მინიმუმი"
+
+#: describe.c:1728 describe.c:1752
+msgid "Maximum"
+msgstr "მაქსიმუმი"
+
+#: describe.c:1729 describe.c:1753
+msgid "Increment"
+msgstr "გაზრდა"
+
+#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426
+#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620
+msgid "yes"
+msgstr "დიახ"
+
+#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426
+#: describe.c:4768 describe.c:4892 describe.c:6621
+msgid "no"
+msgstr "არა"
+
+#: describe.c:1732 describe.c:1756
+msgid "Cycles?"
+msgstr "ციკლები?"
+
+#: describe.c:1733 describe.c:1757
+msgid "Cache"
+msgstr "კეში"
+
+#: describe.c:1798
+#, c-format
+msgid "Owned by: %s"
+msgstr "მფლობელი: %s"
+
+#: describe.c:1802
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "იდენტიფიკაციის სვეტის მიმდევრობა: %s"
+
+#: describe.c:1810
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "ჟურნალში არ-ჩაწერილი მიმდევრომა \"%s.%s\""
+
+#: describe.c:1813
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "მიმდევრობა \"%s.%s\""
+
+#: describe.c:1957
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "ჟურნალში არ-ჩაწერილი ცხრილი \"%s.%s\""
+
+#: describe.c:1960
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "ცხრილი \"%s.%s\""
+
+#: describe.c:1964
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "ხედი \"%s.%s\""
+
+#: describe.c:1969
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "ჟურნალში არ-ჩაწერილი მატერიალიზებული ხედი \"%s.%s\""
+
+#: describe.c:1972
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "მატერიალიზებული ხედი \"%s.%s\""
+
+#: describe.c:1977
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "ჟურნალში არ-ჩაწერილი ინდექსი \"%s.%s\""
+
+#: describe.c:1980
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "ინდექსი \"%s.%s\""
+
+#: describe.c:1985
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "ჟურნალში არ-ჩაწერილი დაყოფილი ინდექსი \"%s.%s\""
+
+#: describe.c:1988
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "დაყოფილი ინდექი \"%s.%s\""
+
+#: describe.c:1992
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST ცხრილი \"%s.%s\""
+
+#: describe.c:1996
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "კომპოზიტის ტიპი \"%s.%s\""
+
+#: describe.c:2000
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "გარე ცხრილი \"%s.%s\""
+
+#: describe.c:2005
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "ჟურნალში არ-ჩაწერილი დაყოფილი ცხრილი \"%s.%s\""
+
+#: describe.c:2008
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "დაყოფილი ცხრილი \"%s.%s\""
+
+#: describe.c:2024 describe.c:4343
+msgid "Collation"
+msgstr "კოლაცია"
+
+#: describe.c:2025 describe.c:4344
+msgid "Nullable"
+msgstr "განულებადი"
+
+#: describe.c:2026 describe.c:4345
+msgid "Default"
+msgstr "ნაგულისხმევი"
+
+#: describe.c:2029
+msgid "Key?"
+msgstr "გასაღები?"
+
+#: describe.c:2031 describe.c:4665 describe.c:4676
+msgid "Definition"
+msgstr "განმარტება"
+
+#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835
+#: describe.c:5894
+msgid "FDW options"
+msgstr "FDW -ის მორგება"
+
+#: describe.c:2035
+msgid "Storage"
+msgstr "საცავი"
+
+#: describe.c:2037
+msgid "Compression"
+msgstr "შეკუმშვა"
+
+#: describe.c:2039
+msgid "Stats target"
+msgstr "სამიზნის სტატისტიკა"
+
+#: describe.c:2175
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "დანაყოფი: %s %s%s"
+
+#: describe.c:2188
+msgid "No partition constraint"
+msgstr "დანაყოფის შეზღუდვების გარეშე"
+
+#: describe.c:2190
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "დანაყოფის შეზღუდვა: %s"
+
+#: describe.c:2214
+#, c-format
+msgid "Partition key: %s"
+msgstr "დანაყოფს გასაღები: %s"
+
+#: describe.c:2240
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "ცხრილის მფლობელი: \"%s.%s\""
+
+#: describe.c:2309
+msgid "primary key, "
+msgstr "ძირითადი გასაღები. "
+
+#: describe.c:2312
+msgid "unique"
+msgstr "უნიკალური"
+
+#: describe.c:2314
+msgid " nulls not distinct"
+msgstr " ნულები განსხვავებული არაა"
+
+#: describe.c:2315
+msgid ", "
+msgstr ", "
+
+#: describe.c:2322
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "ცხრილისთვის \"%s.%s\""
+
+#: describe.c:2326
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", პრედიკატი (%s)"
+
+#: describe.c:2329
+msgid ", clustered"
+msgstr ", დაკლასტერებული"
+
+#: describe.c:2332
+msgid ", invalid"
+msgstr ", არასწორი"
+
+#: describe.c:2335
+msgid ", deferrable"
+msgstr ", deferrable"
+
+#: describe.c:2338
+msgid ", initially deferred"
+msgstr ", თავიდან გადადებული"
+
+#: describe.c:2341
+msgid ", replica identity"
+msgstr ", რეპლიკის იდენტიფიკატორი"
+
+#: describe.c:2395
+msgid "Indexes:"
+msgstr "ინდექსები:"
+
+#: describe.c:2478
+msgid "Check constraints:"
+msgstr "შეამოწმეთ შეზღუდვები:"
+
+#: describe.c:2546
+msgid "Foreign-key constraints:"
+msgstr "გარე-გასაღების შეზღუდვები:"
+
+#: describe.c:2609
+msgid "Referenced by:"
+msgstr "ბმული გარედან:"
+
+#: describe.c:2659
+msgid "Policies:"
+msgstr "წესები:"
+
+#: describe.c:2662
+msgid "Policies (forced row security enabled):"
+msgstr "წესები (მწკრივების გაძლიერებული დაცვა ჩართულია):"
+
+#: describe.c:2665
+msgid "Policies (row security enabled): (none)"
+msgstr "წესები (მწკრივების დაცვა ჩართულია): (არცერთი)"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled): (none)"
+msgstr "წესები (მწკრივების გაძლიერებული დაცვა ჩართულია: (არცერთი)"
+
+#: describe.c:2671
+msgid "Policies (row security disabled):"
+msgstr "წესები (მწკრივების უსაფრთხოება გამორთულია)"
+
+#: describe.c:2731 describe.c:2835
+msgid "Statistics objects:"
+msgstr "სტატისტიკის ობიექტები:"
+
+#: describe.c:2937 describe.c:3090
+msgid "Rules:"
+msgstr "წესები:"
+
+#: describe.c:2940
+msgid "Disabled rules:"
+msgstr "გამორთული წესები:"
+
+#: describe.c:2943
+msgid "Rules firing always:"
+msgstr "ყოველთვის გაშვებადი წესები:"
+
+#: describe.c:2946
+msgid "Rules firing on replica only:"
+msgstr "მხოლოდ რეპლიკაზე გაშვებადი წესები:"
+
+#: describe.c:3025 describe.c:5030
+msgid "Publications:"
+msgstr "გამოცემები:"
+
+#: describe.c:3073
+msgid "View definition:"
+msgstr "აღწერის ნახვა:"
+
+#: describe.c:3236
+msgid "Triggers:"
+msgstr "ტრიგერები:"
+
+#: describe.c:3239
+msgid "Disabled user triggers:"
+msgstr "მომხმარებლის გამორთული ტრიგერები:"
+
+#: describe.c:3242
+msgid "Disabled internal triggers:"
+msgstr "გამორთული შიდა ტრიგერები:"
+
+#: describe.c:3245
+msgid "Triggers firing always:"
+msgstr "ყოველთვის გაშვებადი ტრიგერები:"
+
+#: describe.c:3248
+msgid "Triggers firing on replica only:"
+msgstr "მხოლოდ რეპლიკაზე გაშვებადი ტრიგერები:"
+
+#: describe.c:3319
+#, c-format
+msgid "Server: %s"
+msgstr "სერვერი: %s"
+
+#: describe.c:3327
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW პარამეტრები: (%s)"
+
+#: describe.c:3348
+msgid "Inherits"
+msgstr "მემკვიდრეობით"
+
+#: describe.c:3413
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "დანაყოფების რიცხვი: %d"
+
+#: describe.c:3422
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "დანაყოფების რიცხვი: %d (სიის მისაღებად გამოიყენეთ \\d+.)"
+
+#: describe.c:3424
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "შვილეული ცხრილების რიცხვი: %d (სიის გამოსატანად გამოიყენეთ \\d+ )"
+
+#: describe.c:3431
+msgid "Child tables"
+msgstr "შვილეული ცხრილები"
+
+#: describe.c:3431
+msgid "Partitions"
+msgstr "დანაყოფები"
+
+#: describe.c:3462
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "ტიპიზირებული ცხრილის ტიპი: %s"
+
+#: describe.c:3478
+msgid "Replica Identity"
+msgstr "რეპლიკის იდენტიფიკატორი"
+
+#: describe.c:3491
+msgid "Has OIDs: yes"
+msgstr "აქვს OID-ები: დიახ"
+
+#: describe.c:3500
+#, c-format
+msgid "Access method: %s"
+msgstr "წვდომის მეთოდი: %s"
+
+#: describe.c:3579
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "ცხრილების სივრცე: \"%s\""
+
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:3591
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", ცხრილების სივრცე: \"%s\""
+
+#: describe.c:3668
+msgid "List of roles"
+msgstr "როლების სია"
+
+#: describe.c:3670
+msgid "Role name"
+msgstr "როლის სახელი"
+
+#: describe.c:3671
+msgid "Attributes"
+msgstr "ატრიბუტები"
+
+#: describe.c:3673
+msgid "Member of"
+msgstr "წარმოადგენს წევრს"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "ზემომხმარებელი"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "მემკვიდრეობითობის გარეშე"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "როლის შექმნა"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "ბაზის შექმნა"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "შესვლა შეუძლებელია"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "რეპლიკაცია"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "RLS-ის გამოტოვება"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "შეერთებების გარეშე"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d შეერთება"
+msgstr[1] "%d შეერთება"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "პაროლს ვადა "
+
+#: describe.c:3777
+msgid "Role"
+msgstr "როლი"
+
+#: describe.c:3778
+msgid "Database"
+msgstr "მონაცემთა ბაზა"
+
+#: describe.c:3779
+msgid "Settings"
+msgstr "მორგება"
+
+#: describe.c:3803
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "როლისთვის \"%s\" და ბაზისთვის \"%s\" პარამეტრები ნაპოვნი არაა."
+
+#: describe.c:3806
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "როლისთვის (\"%s\") პარამეტრები ნაპოვნი არაა."
+
+#: describe.c:3809
+#, c-format
+msgid "Did not find any settings."
+msgstr "პარამეტრები ნაპოვნი არაა."
+
+#: describe.c:3814
+msgid "List of settings"
+msgstr "პარამეტრების სია"
+
+#: describe.c:3885
+msgid "index"
+msgstr "ინდექსი"
+
+#: describe.c:3887
+msgid "TOAST table"
+msgstr "TOAST ცხრილი"
+
+#: describe.c:3890 describe.c:4102
+msgid "partitioned index"
+msgstr "დაყოფილი ინდექსი"
+
+#: describe.c:3910
+msgid "permanent"
+msgstr "მუდმივი"
+
+#: describe.c:3911
+msgid "temporary"
+msgstr "დროებითი"
+
+#: describe.c:3912
+msgid "unlogged"
+msgstr "ჟურნალში არ-ჩაწერილი"
+
+#: describe.c:3913
+msgid "Persistence"
+msgstr "შენახვა"
+
+#: describe.c:3929
+msgid "Access method"
+msgstr "წვდომის მეთოდი"
+
+#: describe.c:4015
+msgid "List of relations"
+msgstr "ურთიერთობების სია"
+
+#: describe.c:4063
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "სერვერს (ვერსია %s) ცხრილების დეკლარატიულ დაყოფის მხარდაჭერა არ გააჩნია."
+
+#: describe.c:4074
+msgid "List of partitioned indexes"
+msgstr "დაყოფილი ინდექსების სია"
+
+#: describe.c:4076
+msgid "List of partitioned tables"
+msgstr "დაყოფილი ცხრილების სია"
+
+#: describe.c:4080
+msgid "List of partitioned relations"
+msgstr "დაყოფილი ურთიერთობების სია"
+
+#: describe.c:4111
+msgid "Parent name"
+msgstr "მშობლის სახელი"
+
+#: describe.c:4124
+msgid "Leaf partition size"
+msgstr "ბოლო დანაყოფის ზომა"
+
+#: describe.c:4127 describe.c:4133
+msgid "Total size"
+msgstr "ჯამური ზომა"
+
+#: describe.c:4258
+msgid "Trusted"
+msgstr "სანდო"
+
+#: describe.c:4267
+msgid "Internal language"
+msgstr "შიდა ენა"
+
+#: describe.c:4268
+msgid "Call handler"
+msgstr "გამოძახების დამმუშავებელი"
+
+#: describe.c:4269 describe.c:5680
+msgid "Validator"
+msgstr "შემმოწმებელი"
+
+#: describe.c:4270
+msgid "Inline handler"
+msgstr "ჩადგმული კოდის დამმუშავებელი"
+
+#: describe.c:4305
+msgid "List of languages"
+msgstr "ენების სია"
+
+#: describe.c:4346
+msgid "Check"
+msgstr "შემოწმება"
+
+#: describe.c:4390
+msgid "List of domains"
+msgstr "დომენების სია"
+
+#: describe.c:4424
+msgid "Source"
+msgstr "წყარო"
+
+#: describe.c:4425
+msgid "Destination"
+msgstr "დანიშნულება"
+
+#: describe.c:4427 describe.c:6622
+msgid "Default?"
+msgstr "ნაგულისხმები?"
+
+#: describe.c:4469
+msgid "List of conversions"
+msgstr "გადაყვანების სია"
+
+#: describe.c:4497
+msgid "Parameter"
+msgstr "პარამეტრი"
+
+#: describe.c:4498
+msgid "Value"
+msgstr "მნიშვნელობა"
+
+#: describe.c:4505
+msgid "Context"
+msgstr "კონტექსტი"
+
+#: describe.c:4538
+msgid "List of configuration parameters"
+msgstr "კონფიგურაციის პარამეტრების სია"
+
+#: describe.c:4540
+msgid "List of non-default configuration parameters"
+msgstr "კონფიგურაციის არანაგულისხმებადი პარამეტრების სია"
+
+#: describe.c:4567
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "სერვერს (ვერსია %s) მოვლენის ტრიგერების მხარდაჭერა არ გააჩნია."
+
+#: describe.c:4587
+msgid "Event"
+msgstr "მოვლენა"
+
+#: describe.c:4589
+msgid "enabled"
+msgstr "ჩართულია"
+
+#: describe.c:4590
+msgid "replica"
+msgstr "რეპლიკა"
+
+#: describe.c:4591
+msgid "always"
+msgstr "ყოველთვის"
+
+#: describe.c:4592
+msgid "disabled"
+msgstr "გამორთულია"
+
+#: describe.c:4593 describe.c:6496
+msgid "Enabled"
+msgstr "ჩართულია"
+
+#: describe.c:4595
+msgid "Tags"
+msgstr "ჭდეები"
+
+#: describe.c:4619
+msgid "List of event triggers"
+msgstr "მოვლენების ტრიგერების სია"
+
+#: describe.c:4646
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "სერვერს (ვერსია %s) გაფართოებული სტატისტიკის მხარდაჭერა არ გააჩნია."
+
+#: describe.c:4683
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4684
+msgid "Dependencies"
+msgstr "დამოკიდებულებები"
+
+#: describe.c:4694
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4718
+msgid "List of extended statistics"
+msgstr "გაფართოებული სტატისტიკის სია"
+
+#: describe.c:4745
+msgid "Source type"
+msgstr "წყაროს ტიპი"
+
+#: describe.c:4746
+msgid "Target type"
+msgstr "სამიზნის ტიპი"
+
+#: describe.c:4770
+msgid "in assignment"
+msgstr "მინიჭებაში"
+
+#: describe.c:4772
+msgid "Implicit?"
+msgstr "აშკარა?"
+
+#: describe.c:4831
+msgid "List of casts"
+msgstr "კასტების სია"
+
+#: describe.c:4883 describe.c:4887
+msgid "Provider"
+msgstr "სერვისის მომწოდებელი"
+
+#: describe.c:4893 describe.c:4898
+msgid "Deterministic?"
+msgstr "დეტერმნისტული?"
+
+#: describe.c:4938
+msgid "List of collations"
+msgstr "კოლაციების სია"
+
+#: describe.c:5000
+msgid "List of schemas"
+msgstr "სქემების სია"
+
+#: describe.c:5117
+msgid "List of text search parsers"
+msgstr "ტექსტური ძებნის დამმუშავებლების სია"
+
+#: describe.c:5167
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "ტექსტის ძებნის დამმუშავებელი სახელით \"%s\" არ არსებობს."
+
+#: describe.c:5170
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "ტექსტის ძებნის დამმუშავებლები ვერ ვიპოვე."
+
+#: describe.c:5245
+msgid "Start parse"
+msgstr "დამუშავების დაწყება"
+
+#: describe.c:5246
+msgid "Method"
+msgstr "მეთოდი"
+
+#: describe.c:5250
+msgid "Get next token"
+msgstr "შემდეგი კოდის მიღება"
+
+#: describe.c:5252
+msgid "End parse"
+msgstr "დამუშავების დასასრული"
+
+#: describe.c:5254
+msgid "Get headline"
+msgstr "ამონაწერის მიღება"
+
+#: describe.c:5256
+msgid "Get token types"
+msgstr "კოდის ტიპების მიღება"
+
+#: describe.c:5267
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "ტექსტის ძებნის დამმუშავებელი \"%s.%s\""
+
+#: describe.c:5270
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "ტექსტის ძებნის დამმუშავებელი \"%s\""
+
+#: describe.c:5289
+msgid "Token name"
+msgstr "კოდის სახელი"
+
+#: describe.c:5303
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "კოდის ტიპები დამმუშავებლისთვის \"%s.%s\""
+
+#: describe.c:5306
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "კოდის ტიპები დამმუშავებლისთვის \"%s\""
+
+#: describe.c:5350
+msgid "Template"
+msgstr "ნიმუში"
+
+#: describe.c:5351
+msgid "Init options"
+msgstr "ინიციალიზაციის პარამეტრები"
+
+#: describe.c:5378
+msgid "List of text search dictionaries"
+msgstr "ტექსტის ძებნის ლექსიკონების სია"
+
+#: describe.c:5411
+msgid "Init"
+msgstr "ერთეული"
+
+#: describe.c:5412
+msgid "Lexize"
+msgstr "ლექსით გამოყოფა"
+
+#: describe.c:5444
+msgid "List of text search templates"
+msgstr "ტექსტის ძებნის შაბლონების სია"
+
+#: describe.c:5499
+msgid "List of text search configurations"
+msgstr "ტექსტის ძებნის კონფიგურაციების სია"
+
+#: describe.c:5550
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "ტექსტის ძებნის კონფიგურაცია სახელით \"%s\" არ არსებობს."
+
+#: describe.c:5553
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "ტექსტის ძებნის არცერთი კონფიგურაცია ნაპოვნი არაა."
+
+#: describe.c:5619
+msgid "Token"
+msgstr "ტოკენი"
+
+#: describe.c:5620
+msgid "Dictionaries"
+msgstr "ლექსიკონები"
+
+#: describe.c:5631
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "ტექსტის ძებნის კონფიგურაცია \"%s.%s\""
+
+#: describe.c:5634
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "ტექსტის ძებნის კონფიგურაცია \"%s\""
+
+#: describe.c:5638
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"დამმუშავებელი: \"%s.%s\""
+
+#: describe.c:5641
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"დამუშავებელი: \"%s\""
+
+#: describe.c:5722
+msgid "List of foreign-data wrappers"
+msgstr "გარე მონაცემების გადამტანების სია"
+
+#: describe.c:5750
+msgid "Foreign-data wrapper"
+msgstr "გარე-მონაცემების გადამტანი"
+
+#: describe.c:5768 describe.c:5958
+msgid "Version"
+msgstr "ვერსია"
+
+#: describe.c:5799
+msgid "List of foreign servers"
+msgstr "გარე სერვერების სია"
+
+#: describe.c:5824 describe.c:5883
+msgid "Server"
+msgstr "სერვერი"
+
+#: describe.c:5825
+msgid "User name"
+msgstr "მომხმარებლის სახელი"
+
+#: describe.c:5855
+msgid "List of user mappings"
+msgstr "მომხმარებლების მიმაგრებების სია"
+
+#: describe.c:5928
+msgid "List of foreign tables"
+msgstr "გარე ცხრილების სია"
+
+#: describe.c:5980
+msgid "List of installed extensions"
+msgstr "დაყენებული გაფართოებების სია"
+
+#: describe.c:6028
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "გაფართოება სახელით \"%s\" არ არსებობს."
+
+#: describe.c:6031
+#, c-format
+msgid "Did not find any extensions."
+msgstr "გაფართოებების პოვნა შეუძლებელია."
+
+#: describe.c:6075
+msgid "Object description"
+msgstr "ობიექტის აღწერა"
+
+#: describe.c:6085
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "ობიექტები გაფართებაში \"%s\""
+
+#: describe.c:6126
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "არასწორი სრული სახელი (ძალიან ბევრი წერტილიანი სახელი): %s"
+
+#: describe.c:6140
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "ბაზებს შორის ბმულები განხორციელებული არაა: %s"
+
+#: describe.c:6171 describe.c:6298
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "სერვერს (ვერსია %s) გამოცემების მხარდაჭერა არ გააჩნია."
+
+#: describe.c:6188 describe.c:6376
+msgid "All tables"
+msgstr "ყველა ცხრილი"
+
+#: describe.c:6189 describe.c:6377
+msgid "Inserts"
+msgstr "ჩასმები"
+
+#: describe.c:6190 describe.c:6378
+msgid "Updates"
+msgstr "განახლებები"
+
+#: describe.c:6191 describe.c:6379
+msgid "Deletes"
+msgstr "წაშლები"
+
+#: describe.c:6195 describe.c:6381
+msgid "Truncates"
+msgstr "შეკვეცები"
+
+#: describe.c:6199 describe.c:6383
+msgid "Via root"
+msgstr "Root-ის გავლით"
+
+#: describe.c:6221
+msgid "List of publications"
+msgstr "გამოცემების სია"
+
+#: describe.c:6345
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "გამოცემა სახელით \"%s\" არ არსებობს."
+
+#: describe.c:6348
+#, c-format
+msgid "Did not find any publications."
+msgstr "გამოცემების გარეშე."
+
+#: describe.c:6372
+#, c-format
+msgid "Publication %s"
+msgstr "პუბლიკაცია %s"
+
+#: describe.c:6425
+msgid "Tables:"
+msgstr "ცხრილები:"
+
+#: describe.c:6437
+msgid "Tables from schemas:"
+msgstr "ცხრილები სქემებიდან:"
+
+#: describe.c:6481
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "სერვერს (ვერსია %s) გამოწერების მხარდაჭერა არ გააჩნია."
+
+#: describe.c:6497
+msgid "Publication"
+msgstr "გამოცება"
+
+#: describe.c:6506
+msgid "Binary"
+msgstr "ბინარული"
+
+#: describe.c:6507
+msgid "Streaming"
+msgstr "გაადაცემა"
+
+#: describe.c:6514
+msgid "Two-phase commit"
+msgstr "ორ-ფაზიანი გადაცემა"
+
+#: describe.c:6515
+msgid "Disable on error"
+msgstr "გამორთვა შეცდომის შემთხვევაში"
+
+#: describe.c:6520
+msgid "Synchronous commit"
+msgstr "სინქრონული გადაგზავნა"
+
+#: describe.c:6521
+msgid "Conninfo"
+msgstr "შეერთ. ინფო"
+
+#: describe.c:6527
+msgid "Skip LSN"
+msgstr "LSN-ის გამოტოვება"
+
+#: describe.c:6554
+msgid "List of subscriptions"
+msgstr "გამოწერების სია"
+
+#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6617
+msgid "Input type"
+msgstr "შეყვანის ტიპი"
+
+#: describe.c:6618
+msgid "Storage type"
+msgstr "საცავის ტიპი"
+
+#: describe.c:6619
+msgid "Operator class"
+msgstr "ოპერატორის კლასი"
+
+#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901
+msgid "Operator family"
+msgstr "ოპერატორის ოჯახი"
+
+#: describe.c:6667
+msgid "List of operator classes"
+msgstr "ოპერატორის კლასების სია"
+
+#: describe.c:6714
+msgid "Applicable types"
+msgstr "განკუთვნილი ტიპები"
+
+#: describe.c:6756
+msgid "List of operator families"
+msgstr "ოპერატორის ოჯახების სია"
+
+#: describe.c:6807
+msgid "Operator"
+msgstr "ოპერატორი"
+
+#: describe.c:6808
+msgid "Strategy"
+msgstr "სტრატეგია"
+
+#: describe.c:6809
+msgid "ordering"
+msgstr "დალაგება"
+
+#: describe.c:6810
+msgid "search"
+msgstr "ძებნა"
+
+#: describe.c:6811
+msgid "Purpose"
+msgstr "მიზანი"
+
+#: describe.c:6816
+msgid "Sort opfamily"
+msgstr "ოპერატორის ოჯახის დალაგება"
+
+#: describe.c:6855
+msgid "List of operators of operator families"
+msgstr "ოპერატორის ოჯახების ოპერატორების სია"
+
+#: describe.c:6902
+msgid "Registered left type"
+msgstr "რეგისტრირებული მარცხენა ტიპი"
+
+#: describe.c:6903
+msgid "Registered right type"
+msgstr "რეგისტრირებული მარჯვენა ტიპი"
+
+#: describe.c:6904
+msgid "Number"
+msgstr "რიცხვი"
+
+#: describe.c:6948
+msgid "List of support functions of operator families"
+msgstr "ოპერატორის ოჯახების ფუნქციების სია"
+
+#: describe.c:6979
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7000
+msgid "Large objects"
+msgstr "დიდი ობიექტები"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql PostgreSQL-ის ინტერაქტიური ტერმინალია.\n"
+"\n"
+
+#: help.c:76 help.c:393 help.c:473 help.c:516
+msgid "Usage:\n"
+msgstr "გამოყენება:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [პარამეტრი]... [ბაზისსახელი [მომხმსახელი]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "ზოგადი პარამეტრები:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=ბრძანება მხოლოდ ერთი (SQL ან შიდა) ბრძანების გაშვება და გასვლა\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=ბაზისსახელი მისაერთებელი ბაზის სახელი (ნაგულისხმები: \"%s\")\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=ფალისსახელი ბრძანებების ფაილიდან შესრულება და გასვლა\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list ხელმისაწვდომი ბაზების სიის გამოტანა და გასვლა\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=სახელი=მნიშვნელობა\n"
+" psql -ის მითითებული სახელის მქონე ცვლადისთვის მითითებული მნიშვნელობის მინიჭება\n"
+" (მაგ:, -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc გაშვებისას წასაკითხი ფაილის (~/.psqlrc) წაკითხვის შეცდომა\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (\"one\"), --single-transaction\n"
+" როგორც ერთი ტრანზაქციის, ისე გაშვება (თუ არაინტერაქტიურია)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=პარამეტრები] ამ დახმარების ჩვენება და გასვლა\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands \"\\\"-ით დაწყებული ბრძანებების ჩვენება და გასვლა\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables განსაკუთრებული ცვლადების სიის გამოტანა და გასვლა\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"შეტანისა და გამოტანის პარამეტრები:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all სკრიპტიდან წაკითხულის ეკრანზე ჩვენება\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors შეცდომის გამომტანი ბრძანებების ჩვენება\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries სერვერზე გაგზავნილი ბრძანებების გამოტანა\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden შიდა ბრძანებების მიერ გენერირებული მოთხოვნების გამოტანა\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=FILENAME სესიის ჟურნალის ფაილში ჩაწერა\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline ბრძანების სტრიქონის დამატებითი კონტროლის (readline) გამორთვა\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=FILENAME მოთხოვნის შედეგების ფაილში ჩაწერა (ან |ფაიფში)\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet ჩუმად გაშვება (შეტყობინებების გარეშე, მხოლოდ მოთხოვნის შედეგები)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step ერთნაბიჯიანი რეჟიმი (თითოეული მოთხოვნის დადასტურება)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line ერთხაზიანი რეჟიმი (ხაზის დასრულება SQL-ის ბრძანებასაც ასრულებს)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"გამოტანის ფორმატის მორგება:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align ცხრილის დაულაგებლად გამოტანის რეჟიმი\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv CSV (მძიმით გამოყოფილი მნიშვნელობები) ცხრილის გამოტანის რეჟიმი\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=სტრიქონი\n"
+" ველების გამყოფ სიმბოლო დაულაგებელი გამოტანისთვის (ნაგულისხმები: \"%s\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html HTML ცხრილის გამოტანის რეჟიმი\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=ცვლ[=არგ] ცვლ გამოტანის პარამეტრის არგ-ზე დაყენება (იხ, \\pset ბრძანება)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=სტრიქონი\n"
+" ჩანაწერების გამყოფი დაულაგებელი გამოტანისთვის (ნაგულისხმები: ახალი ხაზი)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only მხოლოდ მწკრივების გამოტანა\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=ტექსტი HTML ცხრილის ჭდის ატრიბუტების დაყენება (მაგ: სიგრძე, საზღვარი)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded ცხრილის გაფართოებული გამოტანის ჩართვა\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" დაულაგებელი გამოტანის ველების გამყოფად ნულოვანი ბაიტის დაყენება\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" დაულაგებელი გამოტანის ჩანაწერების გამყოფის ნულოვან ბაიტზე დაყენება\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"შეერთების პარამეტრები:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr " -h, --host=HOSTNAME მონაცემთა ბაზის სერვერის ჰოსტის ან სოკეტის საქაღალდე (ნაგულისხმები: \"%s\")\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "ლოკალური სოკეტი"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT მონაცემთა ბაზის სერვერის პორტი (ნაგულისხმები: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=მომხმარებელი ბაზის მომხმარებლის სახელი (ნაგულისხმები: \"%s\")\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password არასოდეს მკითხო პაროლი\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password პაროლის ყოველთვის კითხვა (ავტომატურად უნდა ხდებოდეს)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"psql-ის შესახებ დამატებითი ინფორმაციის მისაღებად \n"
+"აკრიფეთ \"\\?\" (შიდა ბრძანებებისთვის) ან \"\\help\" (SQL ბრძანებებისთვის), \n"
+"ან გაეცანით \"psql\" განყოფილებას PostgreSQL-ის დოკუმენტაციაში.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "შეცდომების შესახებ მიწერეთ: <%s>\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "ზოგადი\n"
+
+#: help.c:192
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright აჩვენებს PostgreSQL-ის გამოყენებისა და დისტრიბუციის პირობებს\n"
+
+#: help.c:193
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr " \\crosstabview [სვეტები] შეასრულებს მოთხოვნას და შედეგს crosstab-ში აჩვენებს\n"
+
+#: help.c:194
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose ბოლო შეცდომის დეტალების მაქსიმალურად ჩვენება\n"
+
+#: help.c:195
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(პარამეტრი)] [ფაილი] მოთხოვნის შესრულება (და შედეგის ფაილში ან |ფაიფში გაგზავნა;\n"
+" \\g არგუმენტების გარეშე იგივეა, რაც წერტილმძიმე\n"
+
+#: help.c:197
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc მოთხოვნის შედეგის აღწერა მისი შესრულების გარეშე\n"
+
+#: help.c:198
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec ჯერ მოთხოვნის, მერე კი მისი თითოეული შედეგის შესრულება\n"
+
+#: help.c:199
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [პრეფიქსი] მოთხოვნის შესრულება და შედეგის psql-ის ცვლადებში შენახვა\n"
+
+#: help.c:200
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(პარამეტრები)] [ფაილი] როგორც \\g, მაგრამ გამოტანის რეჟიმი უფრო ფართო იქნება\n"
+
+#: help.c:201
+msgid " \\q quit psql\n"
+msgstr " \\q psql-დან გასვლა\n"
+
+#: help.c:202
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SEC] მოთხოვნის ყოველ SEC წამში ერთხელ გაშვება\n"
+
+#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304
+#: help.c:324 help.c:337 help.c:346
+msgid "\n"
+msgstr "\n"
+
+#: help.c:205
+msgid "Help\n"
+msgstr "დახმარება\n"
+
+#: help.c:207
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] დახმარება \"\\\"-ით დაწყებული ბრძანებების შესახებ\n"
+
+#: help.c:208
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options დახმარება psql-ის ბრძანების სტრიქონის შესახებ\n"
+
+#: help.c:209
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables დახმარების ჩვენება განსაკუთრებული ცვლადების შესახებ\n"
+
+#: help.c:210
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [სახელი] SQL ბრძანებების დახმარება, * ყველა ბრძანებისთვის\n"
+
+#: help.c:213
+msgid "Query Buffer\n"
+msgstr "მოთხოვნების ბაფერი\n"
+
+#: help.c:214
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [ფაილი] [ხაზი] მოთხოვნების ბაფერის (ან ფაილის) გარე რედაქტორში გახსნა\n"
+
+#: help.c:215
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [ფუნქცსახელი [ხაზი]] ფუნქციის აღწერის გარე რედაქტორში ჩასწორება\n"
+
+#: help.c:216
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [ხედისსახელი [ხაზი]] ხედის აღწერის გარე რედაქტორით ჩასწორება\n"
+
+#: help.c:217
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p მოთხოვნების ბაფერის შემცველობის ჩვენება\n"
+
+#: help.c:218
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r მოთხოვნების ბაფერის გასუფთავება\n"
+
+#: help.c:220
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [ფაილი] ისტორიის ჩვენება ან ფაილში შენახვა\n"
+
+#: help.c:222
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w FILE მოთხოვნების ბაფერის ფაილში ჩაწერა\n"
+
+#: help.c:225
+msgid "Input/Output\n"
+msgstr "შეტანა/გამოტანა\n"
+
+#: help.c:226
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... SQL COPY -ის შესრულება მონაცემების ნაკადით კლიენტის ჰოსტამდე\n"
+
+#: help.c:227
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [სტრიქონი] სტრიქონის სტანდარტულ გამოტანაზე გაშვება(ხაზის გადატანის გარეშე -n )\n"
+
+#: help.c:228
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i ბრძანებების ფაილიდან შესრულება\n"
+
+#: help.c:229
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir ფაილი იგივე, რაც \\i, მაგრამ სკრიპტის მიმდინარე ადგილიდან დამოკიდებულებით\n"
+
+#: help.c:230
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [ფაილი] მოთხოვნის ყველა შედეგის ფაილში ან |ფაიფში გაგზავნა\n"
+
+#: help.c:231
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr " \\qecho [-n] [striqoni] სტრიქონის \\o გამოტანის ნაკადში ჩაწერა (-n ახალი ხაზების გარეშე)\n"
+
+#: help.c:232
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [სტრიქონი] სტრიქონის სტანდარტულ შეცდომაზე გადამოტანა (-n გადატანის გარეშე)\n"
+
+#: help.c:235
+msgid "Conditional\n"
+msgstr "პირობითი\n"
+
+#: help.c:236
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR პირობის შემცველი ბლოკის დასაწყისი\n"
+
+#: help.c:237
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR ალტერნატიული პირობა მიმდინარე პირობით ბლოკში\n"
+
+#: help.c:238
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else პირობის მიმდინარე ბლოკის ალტერნატიული გზა\n"
+
+#: help.c:239
+msgid " \\endif end conditional block\n"
+msgstr " \\endif პირობის შემცველი ბლოკის დასასრული\n"
+
+#: help.c:242
+msgid "Informational\n"
+msgstr "საინფორმაციო\n"
+
+#: help.c:243
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (პარამეტრები: S = სისტემური ობიექტების ჩვენება, + = დამატებითი დეტალები)\n"
+
+#: help.c:244
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] ცხრილების, ხედებისა და მიმდევრობების სია\n"
+
+#: help.c:245
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NAME ცხრილის, ხედის, მიმდევრობის ან ინდექსის აღწერა\n"
+
+#: help.c:246
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [PATTERN] აგრეგატების სია\n"
+
+#: help.c:247
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [PATTERN] წვდომის მეთოდების სია\n"
+
+#: help.c:248
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] ოპერატორის კლასების სია\n"
+
+#: help.c:249
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] ოპერატორების ოჯახების სია\n"
+
+#: help.c:250
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] ოპერატორების ოჯახების ოპერატორების სია\n"
+
+#: help.c:251
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] ოპერატორის ოჯახების მხარდაჭერის ფუნქციების სია\n"
+
+#: help.c:252
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [PATTERN] ცხრილის სივრცეების სია\n"
+
+#: help.c:253
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [PATTERN] გადაყვანების სია\n"
+
+#: help.c:254
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [PATTERN] კონფიგურაციის პარამეტრების სია\n"
+
+#: help.c:255
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [PATTERN] კასტების სია\n"
+
+#: help.c:256
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [შაბლონი] ობიექტის აღწერის ჩვენება, რომელიც სხვაგან არსადაა ნაჩვენები\n"
+
+#: help.c:257
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [PATTERN] დომენების სია\n"
+
+#: help.c:258
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [შაბლონი] ნაგულისხმები პრივილეგიების სია\n"
+
+#: help.c:259
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [შაბლონი] გარე ცხრილების სია\n"
+
+#: help.c:260
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [შაბლონი] გარე სერვერების სია\n"
+
+#: help.c:261
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [შაბლონი] გარე ცხრილების სია\n"
+
+#: help.c:262
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [PATTERN] მომხმარებლების მომხმარებლის სია\n"
+
+#: help.c:263
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [შაბლონი] გარე მონაცემების გადამტანების სია\n"
+
+#: help.c:264
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" ფუნქციების [მხოლოდ agg/normal/procedure/trigger/window] სია\n"
+
+#: help.c:266
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [შაბლონი] ტექსტის ძებნის კონფიგურაციების სია\n"
+
+#: help.c:267
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [შაბლონი] ტექსტის ძებნის ლექსიკონების სია\n"
+
+#: help.c:268
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [PATTERN] ტექსტის ძებნის დამმუშავებლების სია\n"
+
+#: help.c:269
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [შაბლონი] ტექსტის ძებნის შაბლონების სია\n"
+
+#: help.c:270
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [შაბლონი] როლების სია\n"
+
+#: help.c:271
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [შაბლონი] ინდექსების სია\n"
+
+#: help.c:272
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] დიდი ობიექტების სია. იგივე, რაც \\lo_list\n"
+
+#: help.c:273
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [შაბლონი] პროცედურული ენების სია\n"
+
+#: help.c:274
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [შაბლონი] მატერიალიზებული ხედების სია\n"
+
+#: help.c:275
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [შაბლონი] სქემების სია\n"
+
+#: help.c:276
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" ოპერატორების სია\n"
+
+#: help.c:278
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [შაბლონი] კოლაციების სია\n"
+
+#: help.c:279
+msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp [შაბლონი] ცხრილის, ხედის და მიმდევრობის წვდომის უფლებების სია\n"
+
+#: help.c:280
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[itn+] [შაბლონი] [მხოლოდ ინდექსი/ცხრილი] დაყოფილი ურთიერთობების სია [n=ჩადგმული]\n"
+
+#: help.c:281
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr " \\drds [ROLEPTRN [DBPTRN]] თითოეული ბაზის როლის პარამეტრების სია\n"
+
+#: help.c:282
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [შაბლონი] რეპლიკაციის გამოცემების სია\n"
+
+#: help.c:283
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [შაბლონი] რეპლიკაციის გამოწერების სია\n"
+
+#: help.c:284
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [შაბლონი] მიმდევრობების სია\n"
+
+#: help.c:285
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [შაბლონი] ცხრილების სია\n"
+
+#: help.c:286
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [შაბლონი] მონაცემის ტიპების სია\n"
+
+#: help.c:287
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [შაბლონი] როლების სია\n"
+
+#: help.c:288
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [შაბლონი] ხედების სია\n"
+
+#: help.c:289
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [შაბლონი] გაფართოებების სია\n"
+
+#: help.c:290
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [შაბლონი] გაფართოებული სტატისტიკის სია\n"
+
+#: help.c:291
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [შაბლონი] მოვლენის ტრიგერების სია\n"
+
+#: help.c:292
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [შაბლონი] მონაცემთა ბაზების სია\n"
+
+#: help.c:293
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNCNAME ფუნქციის აღწერის ჩვენება\n"
+
+#: help.c:294
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] ხედისსახელი ხედის აღწერის ჩვენება\n"
+
+#: help.c:295
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [შაბლონი] იგივე, რაც \\dp\n"
+
+#: help.c:298
+msgid "Large Objects\n"
+msgstr "დიდი ობიექტები\n"
+
+#: help.c:299
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export LOBOID FILE დიდი ობიექტის ფაილში ჩაწერა\n"
+
+#: help.c:300
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import ფაილი [კომენტარი]\n"
+" დიდი ობიექტის ფაილიდან წაკითხვა\n"
+
+#: help.c:302
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] დიდი ობიექტების სია\n"
+
+#: help.c:303
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID დიდი ობიექტის წაშლა\n"
+
+#: help.c:306
+msgid "Formatting\n"
+msgstr "ფორმატირება\n"
+
+#: help.c:307
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a სწორებულ და გაუსწორებელ რეჟიმებს შორის გადართვა\n"
+
+#: help.c:308
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [სტრიქონი] ცხრილის სათაურის დაყენება. ან წაშლა, თუ მითითებული არაა\n"
+
+#: help.c:309
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [სტრიქონი] მოთხოვნის შედეგის დაულაგებელი გამოტანის ველების გამყოფის დაყენება ან ჩვენება\n"
+
+#: help.c:310
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H HTML გამოტანის რეჟიმის გადართვა (მიმდინარე %s)\n"
+
+#: help.c:312
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [სახელი [მნიშვნელობა]] ცხრილის გამოტანის პარამეტრის დაყენება\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:319
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] მხოლოდ მწკრივების ჩვენება(ამჟამად %s)\n"
+
+#: help.c:321
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [STRING] HTML-ის <table> ჭდის ატრიბუტების დაყენება. ან გასუფთავება, თუ მითითებული არაფერია\n"
+
+#: help.c:322
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] გაფართოებული გამოტანის გადართვა (ამჟამად %s)\n"
+
+#: help.c:323
+msgid "auto"
+msgstr "ავტომატური"
+
+#: help.c:326
+msgid "Connection\n"
+msgstr "შეერთება\n"
+
+#: help.c:328
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[ბაზისსახელი|- მომხმარებელი|- ჰოსტი|- პორტ|-] | conninfo}\n"
+" ახალ ბაზასთან მიერთება (მიმდინარე \"%s\")\n"
+
+#: help.c:332
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[ბაზისსახელი|- მომხმარებელი|- ჰოსტი|- პორტ|-] | conninfo}\n"
+" ახალ ბაზასთან მიერთება (მიმდინარე შეერთება არ არსებობს)\n"
+
+#: help.c:334
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo მიმდინარე შეერთების შესახებ ინფორმაციის გამოტანა\n"
+
+#: help.c:335
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [კოდირება] კლიენტის კოდირების ჩვენება ან დაყენება\n"
+
+#: help.c:336
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [მომხმარებელი] მომხმარებლის პაროლის უსაფრთხოდ შეცვლა\n"
+
+#: help.c:339
+msgid "Operating System\n"
+msgstr "ოპერაციული სისტემა\n"
+
+#: help.c:340
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [საქ] მიმდინარე საქაღალდის შეცვლა\n"
+
+#: help.c:341
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR გარემოს ცვლადის გამოთხოვა\n"
+
+#: help.c:342
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv სახელი [მნიშვნელობა] გარემოს ცვლადის დაყენება ან მოხსნა\n"
+
+#: help.c:343
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] ბრძანებების ტაიმერის გადართვა (ამჟამად %s)\n"
+
+#: help.c:345
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [ბრძანება] გარსის ბრძანების შესრულება ან ინტერაქტიური გარსის გაშვება\n"
+
+#: help.c:348
+msgid "Variables\n"
+msgstr "ცვლადები\n"
+
+#: help.c:349
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [ტექსტი] სახელი მომხმარებლისთვის შიდა ცვლადის დაყენების შეთავაზება\n"
+
+#: help.c:350
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [სახელი [მნიშვნელობა]] დააყენებს შიდა ცვლადს, ან, თუ პარამეტრები მითითებული არაა, მათ სიას გამოიტანს\n"
+
+#: help.c:351
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset სახელი შიდა ცვლადის მოხსნა (წაშლა)\n"
+
+#: help.c:390
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"განსაკუთრებულად მოსაპყრობი ცვლადების სია\n"
+"\n"
+
+#: help.c:392
+msgid "psql variables:\n"
+msgstr "psql-ის ცვლადები:\n"
+
+#: help.c:394
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=სახელი=მნიშვნელობა\n"
+" ან \\set სახელი მნიშვნელობა psql-ის შიგნით\n"
+"\n"
+
+#: help.c:396
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" iთუ დაყენებულია, წარმატებული SQL ბრძანებები ავტომატურად იქნება გადაცემული\n"
+
+#: help.c:398
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" განსაზღვრავს სიმბოლოების ზომას SQL-ის საკვანძო სიტყვების დასრულებისას\n"
+" [პატარა (lower), upper (დიდი), პატარის_შენარჩუნება (preserve-lower), დიდის_შენარჩუნება (preserve-upper)]\n"
+
+#: help.c:401
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" ბაზის სახელი, რომელთანაც ამჟამად მიერთებული ბრძანდებით\n"
+
+#: help.c:403
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" აკონტროლებს, შეყვანილიდან რა გამოჩნდება სტანდარტულ გამოტანაზე\n"
+" [all(ყველაფერი), errors(შეცდომები), none(არაფერი), queries(მოთხოვნები)]\n"
+
+#: help.c:406
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" თუ დაყენებულია, \\-ით დაწყებული შიდა მოთხოვნები ნაჩვენები იქნება;\n"
+" თუ მნიშვნელობაა 'noexe', შიდა ბრძანებები ნაჩვენები იქნება, მაგრამ შესრულებული არა\n"
+
+#: help.c:409
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" მიმდინარე კლიენტის სიმბოლოების კოდირება\n"
+
+#: help.c:411
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr ""
+" ERROR\n"
+" 1, თუ ბოლო მოთხოვნა ავარიული იყო. არადა 0\n"
+
+#: help.c:413
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" შედეგის გამოსათხოვი მწკრივების რაოდენობა ერთი ჩვენებისთვის (0=უსასრულო)\n"
+
+#: help.c:415
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" თუ დაყენებულა, ცხრილის წვდომის მეთოდები ნაჩვენები არ იქნება\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" თუ ჩართულია, შეკუმშვის მეთოდები ნაჩვენები არ იქნება\n"
+
+#: help.c:419
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" ბრძანებების ისტორიის კონროლი[ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:421
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" ბრძანებების ისტორიის შესანახი ფაილის სახელი\n"
+
+#: help.c:423
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" ისტორიაში შენახული ბრძანებების მაქსიმალური რაოდენობა\n"
+
+#: help.c:425
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" ამჟამად მიერთებული მონაცემთა ბაზის სერვერის ჰოსტი\n"
+
+#: help.c:427
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" ინტერაქტიური სესიის დასამთავრებლად საჭირო EOF-ების რაოდენობა\n"
+
+#: help.c:429
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" უკანასკნელად შეცვლილი OID-ის მნიშვნელობა\n"
+
+#: help.c:431
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" უკანასკნელი შეცდომის შეტყობინება და SQLSTATE. თუ შეცდომა არ არსებობს, დაბრუნდება ცარიელი სტრიქონი და \"00000\"\n"
+
+#: help.c:434
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" თუ დაყენებულია, შეცდომა ტრანზაქციას არ გააჩერებს (გამოიყენება არაპირდაპირი შესანახი წერტილები)\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" ბრძანებების პაკეტის შესრულების შეწყვეტა პირველივე შეცდომის შემდეგ\n"
+
+#: help.c:438
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" პორტი\n"
+" სერვერის პორტი მიმდინარე შეერთებისთვის\n"
+
+#: help.c:440
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" psql-ის ბრძანების სტრიქონის აღწერა\n"
+
+#: help.c:442
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" ბრძანების სტრიქონის მითითება, როცა ბრძანება წინა ხაზიდან გრძელდება\n"
+
+#: help.c:444
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+
+#: help.c:446
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" ჩუმი ოპერაციები(იგივე, რაც პარამეტრი -q)\n"
+
+#: help.c:448
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" ბოლო მოთხოვნის მიერ დაბრუნებული ან შეცვლილი მწკრივები. ან 0\n"
+
+#: help.c:450
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" სერვერის ვერსია(მოკლე სტრიქონის ან რიცხვით ფორმატში)\n"
+
+#: help.c:453
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" მხოლოდ ბოლოს მაგიერ კომბინირებული მოთხოვნის ყველა შედეგის ჩვენება (\\;)\n"
+
+#: help.c:455
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" შეტყობინების კონტექსტის ველების ჩვენების კონტროლი[never, errors, always]\n"
+
+#: help.c:457
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" iთუ დაყენებულია, ხაზის დაბოლოება SQL-ის ბრძანებასაც დაასრულებს (იგივე, რაც -S პარამეტრი)\n"
+
+#: help.c:459
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" ერთნაბიჯიანი რეჟიმი. (იგივე, რაც -s პარამეტრი)\n"
+
+#: help.c:461
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" უკანასკნელი მოთხოვნის SQLSTATE. \"00000\", თუ შეცდომა არ მომხდარა\n"
+
+#: help.c:463
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" ბაზასთან მიერთებული მომხმარებლის სახელი\n"
+
+#: help.c:465
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" შეცდომის ანგარშების დეტალურობის კონტროლი [default, verbose, terse, sqlstate]\n"
+
+#: help.c:467
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql-ის ვერსია (სრული ვერსია, მოკლე ვერსია თუ რიცხვითი ფორმატი)\n"
+
+#: help.c:472
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"ჩვენების პარამეტრები:\n"
+
+#: help.c:474
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=სახ[=მნიშვნ]\n"
+" ან \\pset სახ [მიშნვნ] psql-ში\n"
+"\n"
+
+#: help.c:476
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" საზღვრის სტილი (რიცხვი)\n"
+
+#: help.c:478
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" სამიზნის სიგანე გადატანილი ფორმატისთვის\n"
+
+#: help.c:480
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (or x)\n"
+" გაფართოებული გამოტანა [on, off, auto]\n"
+
+#: help.c:482
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" ველების გამყოფი დაულაგების გამოტანისათვის (ნაგულისხმები \"%s\")\n"
+
+#: help.c:485
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" დაულაგებელი გამოტანის ველების გამყოფის ნულოვან ბაიტზე დაყენება\n"
+
+#: help.c:487
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" ცხრილის მინაწერების ჩვენების ჩაართ/გამორთ[on, off]\n"
+
+#: help.c:489
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" გამოტანის ფორმატის დაყენება [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:491
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" საზღვრის ხაზის ხატვის სტილი [ascii, old-ascii, unicode]\n"
+
+#: help.c:493
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" ნულოვანი ბაიტის მიერ ნაჩვენები სიმბოლო\n"
+
+#: help.c:495
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" ციფრის ჯგუფების გასაყოფად ენის სპეციფიკური სიმბოლოს გამოყენება\n"
+
+#: help.c:497
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" გვერდების გარე გადამრთველის გამოყენება[yes, no, always]\n"
+
+#: help.c:499
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" დაულაგებელი გამოტანის ჩანაწერების(ხაზების) გამყოფი\n"
+
+#: help.c:501
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" დაულაგებელი გამოტანის ველების გამყოფის ნულოვან ბაიტზე დაყენება\n"
+
+#: help.c:503
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (or T)\n"
+" მიუთითებს HTML ფორმატის table ჭდის ატრიბუტებს ან სვეტების პოპორციულ სიგანეს\n"
+" მარცხნივ სწორებული მონაცემების ტიპებისთვის latex-longtable ფორმატში\n"
+
+#: help.c:506
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" ცხრილის სათაურის დაყენება შემდგომ დაბეჭდილი ცხრილებისთვის\n"
+
+#: help.c:508
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" თუ დაყენებულია, ნაჩვენები იქნება მხოლოდ მიმდინარე მონაცემები\n"
+
+#: help.c:510
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" უნიკოდის ხაზის დახატვის სტილი [single, double]\n"
+
+#: help.c:515
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"გარემოს ცვლადები:\n"
+
+#: help.c:519
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" სახელი=მნიშვნელობა [სახელი=მნიშვნელობა ] psql ...\n"
+" ან \\setenv სახელი[მნიშვნელობა ] psql-ის სიგნით\n"
+"\n"
+
+#: help.c:521
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set სახელი=მნიშვნელობა\n"
+" psql ...\n"
+" ან \\setenv სახელი [მნიშვნელობა] psql-ში\n"
+"\n"
+
+#: help.c:524
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" გადასატანი ფორმატის სვეტების რაოდენობა\n"
+
+#: help.c:526
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" იგივე, რაც შეერთების პარამეტრი აპლიკაციის_სახელი\n"
+
+#: help.c:528
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" იგივე, რაც შეერთების dbname პარამეტრი\n"
+
+#: help.c:530
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" იგივე, რაც ჰოსტი შეერთების პარამეტრებში\n"
+
+#: help.c:532
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" პაროლების ფაილის სახელი\n"
+
+#: help.c:534
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" შეერთების პაროლი (რეკომენდებული არაა)\n"
+
+#: help.c:536
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" იგივე, რაც პორტი შეერთების პარამეტრებში\n"
+
+#: help.c:538
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" იგივე, რაც მომხმარებლის სახელი შეერთების პარამეტრებში\n"
+
+#: help.c:540
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" \\e, \\ef, და \\ev ბრძანების მიერ გამოყენებული რედაქტორი\n"
+
+#: help.c:542
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" რედაქტორის გამოძახებისას ხაზის ნომრის მითითების ხერხი\n"
+
+#: help.c:544
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" ბრძანებების ისტორიის ფაილის ალტერნატიული მდებარეობა\n"
+
+#: help.c:546
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" გვერდების გადამრთველი გარე პროგრამის სახელი\n"
+
+#: help.c:549
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" \\watch-ისთვის გამოყენებული გვერდების გადამრთველი გარე პროგრამა\n"
+
+#: help.c:552
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" მომხმარებლის .psqlrc ფაილის ალტერნატიული მდებარეობა\n"
+
+#: help.c:554
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" \\! ბრძანების მიერ გამოყენებული გარსი\n"
+
+#: help.c:556
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" დროებითი ფაილების საქაღალდე\n"
+
+#: help.c:616
+msgid "Available help:\n"
+msgstr "ხელმისაწვდომი დახმარება:\n"
+
+#: help.c:711
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"ბრძანება: %s\n"
+"აღწერა: %s\n"
+"სინტაქსი:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:734
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"\"%s\"-ისთვის დახმარება მიუწვდომელია.\n"
+"ხელმისაწვდომი დახმარების სანახავად სცადეთ \\h .\n"
+
+#: input.c:217
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "შემოსატანი ფაილის წაკითხვის შეცდომა: %m"
+
+#: input.c:478 input.c:516
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "ისტორიის ფაილის (\"%s\") შენახვის შეცდომა: %m"
+
+#: input.c:535
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "ამ აგებას ისტორიის მხარდაჭერა არ გააჩნია"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: ბაზასთან მიერთებული არ ბრძანდებით"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: მიმდინარე ტრანზაქცია ავარიულად დასრულდა"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: ტრანზაქციის უცნობი სტატუსი"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: -დან გამოსვლა"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "%s-დან გასასვლელად გამოიყენეთ \"\\q\".\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"შეყვანილია PostgreSQL-ის საკუთარი ფორმატის გამოტვირთვა\n"
+"გამოტვირთული ბაზის აღსადგენად CLI-ის ბრძანება pg_restore გამოიყენეთ .\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "დახმარებისთვის გამოიყენეთ \\? ან დააწექით Control-C-ს შეყვანის ბაფერის გასასუფთავებლად."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "დახმარებისთვის გამოიყენეთ \\?."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "იყენებთ psql-ს, PostgreSQL-ის ბრძანების სტრიქონის ინტერფეისს."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"აკრიფეთ: \\copyright გავრცელების წესებისთვის\n"
+" \\h SQL-ის ბრძანებების შესახებ დახმარებისთვის\n"
+" \\? psql-ის ბრძანებების შესახებ დახმარებისთვის\n"
+" \\g ან დაასრულეთ წერტილმძიმით, მოთხოვნის შესასრულებლად\n"
+" \\q გასვლა\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "გასასვლელად გამოიყენეთ \\q."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "გასასვლელა გამოიყენეთ Control-D."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "გასასვლელა გამოიყენეთ Control-C."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "მოთხოვნა იგნორირებულია; მიმდინარე \\if ბლოკიდან გამოსასვლელად გამოიყენეთ \\endif ან Ctrl-C"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "მიღწეულია EOF დამხურავი \\endif-ების პოვნის გარეშე"
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "ბრჭყალებში ჩასმული ციტატის დაუსრულებელი სტრიქონი"
+
+#: psqlscanslash.l:811
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: არასაკმარისი მეხსიერება"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1996
+#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154
+#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228
+#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431
+#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517
+#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594
+#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730
+#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071
+#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171
+#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259
+#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338
+#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396
+#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428
+#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464
+#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499
+#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537
+#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574
+#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606
+#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638
+#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680
+#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030
+#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687
+#: sql_help.c:4735 sql_help.c:4893
+msgid "name"
+msgstr "სახელი"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846
+#: sql_help.c:3339 sql_help.c:4455
+msgid "aggregate_signature"
+msgstr "აგრეგატის სახელმოწერა"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "ახალი_სახელი"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3011
+msgid "new_owner"
+msgstr "ახალი_მფლობელი"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "ახალი_სქემა"
+
+#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484
+msgid "where aggregate_signature is:"
+msgstr "სადაც aggregate_signature არის:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911
+#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085
+#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341
+#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527
+#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461
+#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488
+#: sql_help.c:4491
+msgid "argmode"
+msgstr "არგრეჟიმი"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912
+#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2067 sql_help.c:2086
+#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342
+#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528
+#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475
+#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492
+msgid "argname"
+msgstr "არგსახელი"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2388 sql_help.c:2597
+#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440
+#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470
+#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493
+msgid "argtype"
+msgstr "არგტიპი"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974
+#: sql_help.c:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343
+#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040
+#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742
+#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956
+msgid "option"
+msgstr "მორგება"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433
+#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388
+msgid "where option can be:"
+msgstr "სადაც option შეიძლება იყოს:"
+
+#: sql_help.c:116 sql_help.c:2209
+msgid "allowconn"
+msgstr "შეერთ_ნებართვ"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210
+#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227
+msgid "connlimit"
+msgstr "შეერთ_ლიმიტი"
+
+#: sql_help.c:118 sql_help.c:2211
+msgid "istemplate"
+msgstr "შაბლონია"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4187
+msgid "new_tablespace"
+msgstr "ცხრილების_ახალი_სივრცე"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2398 sql_help.c:2601
+#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675
+msgid "configuration_parameter"
+msgstr "კონფიგურაციის_პარამეტრი"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344
+#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467
+#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626
+#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915
+#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014
+#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676
+#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679
+msgid "value"
+msgstr "მნიშვნელობა"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "სამიზნე_როლი"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631
+#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889
+#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338
+#: sql_help.c:4357 sql_help.c:4369
+msgid "schema_name"
+msgstr "სქემის_სახელი"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "შეთავაზება_GRANT_ან_REVOKE"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "სადაც abbreviated_grant_or_revoke ერთ-ერთია სიიდან:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2437 sql_help.c:2438
+#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575
+#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667
+#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232
+#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933
+#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697
+msgid "role_name"
+msgstr "როლის_სახელი"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352
+#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774
+#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924
+#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981
+#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088
+#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558
+#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608
+#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651
+#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806
+#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864
+#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921
+#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044
+#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102
+#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105
+msgid "expression"
+msgstr "გამსახულება"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "დომენის_შეზღუდვა"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852
+#: sql_help.c:1854 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351
+#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993
+msgid "constraint_name"
+msgstr "შეზღუდვის_სახელი"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "ახალი_შეზღუდვის_სახელი"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "ახალი_მნიშვნელობა"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "წევრი_ობიექტი"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "სადაც member_object არის:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856
+#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860
+#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869
+#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884
+#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894
+#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898
+#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902
+#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4451 sql_help.c:4456
+#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465
+#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477
+#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481
+#: sql_help.c:4482
+msgid "object_name"
+msgstr "ობიექტის_სახელი"
+
+#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454
+msgid "aggregate_name"
+msgstr "აგრეგატის სახელი"
+
+#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135
+#: sql_help.c:2137 sql_help.c:3357
+msgid "source_type"
+msgstr "წყაროს_ტიპი"
+
+#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136
+#: sql_help.c:2138 sql_help.c:3358
+msgid "target_type"
+msgstr "სამიზნის_ტიპი"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133
+#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549
+#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577
+#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834
+#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072
+#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083
+msgid "function_name"
+msgstr "ფუნქციის_სახელი"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542
+msgid "operator_name"
+msgstr "ოპერატორის_სახელი"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871
+#: sql_help.c:2519 sql_help.c:3481
+msgid "left_type"
+msgstr "მარჯვენა ტიპი"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872
+#: sql_help.c:2520 sql_help.c:3482
+msgid "right_type"
+msgstr "სწორი_ტიპი"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2539
+#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500
+msgid "index_method"
+msgstr "ინდექსის_მეთოდი"
+
+#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467
+msgid "procedure_name"
+msgstr "პროცედურის სახელი"
+
+#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473
+msgid "routine_name"
+msgstr "ქვეპროგრამის სახელი"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394
+#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662
+#: sql_help.c:3926 sql_help.c:4375
+msgid "type_name"
+msgstr "ტიპის სახელი"
+
+#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599
+#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911
+#: sql_help.c:4360
+msgid "lang_name"
+msgstr "ენის_სახელი"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "და აგრეგატული_ხელმოწერა არის:"
+
+#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275
+msgid "handler_function"
+msgstr "დამმუშავებელი_ფუნქცია"
+
+#: sql_help.c:396 sql_help.c:2276
+msgid "validator_function"
+msgstr "შემმოწმებელი_ფუნქცია"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "ქმედება"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851
+#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1983 sql_help.c:1984
+#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391
+#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629
+#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887
+#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919
+#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955
+#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978
+#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883
+#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997
+#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089
+#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614
+#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877
+#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924
+#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117
+msgid "column_name"
+msgstr "სვეტის_სახელი"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "ახალი_სვეტის_სახელი"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "და როცა ქმედება არის ერთერთი სიიდან:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2229
+#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888
+#: sql_help.c:3167 sql_help.c:4141
+msgid "data_type"
+msgstr "მონაცემების_ტიპი"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2230 sql_help.c:2329
+#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911
+#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990
+msgid "collation"
+msgstr "კოლაცია"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339
+#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920
+msgid "column_constraint"
+msgstr "სვეტის_შეზღუდვა"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968
+msgid "integer"
+msgstr "მთელი რიცხვი"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "ატრიბუტის პარამეტრი"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340
+#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921
+msgid "table_constraint"
+msgstr "ცხრილის_შეზღუდვები"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905
+msgid "trigger_name"
+msgstr "ტრიგერის_სახელი"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918
+msgid "parent_table"
+msgstr "მშობელი_ცხრილი"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2261
+msgid "extension_name"
+msgstr "გაფართოების სახელი"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395
+msgid "execution_cost"
+msgstr "გაშვების_ფასი"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396
+msgid "result_rows"
+msgstr "მწკრივები_შედეგში"
+
+#: sql_help.c:547 sql_help.c:2397
+msgid "support_function"
+msgstr "დამხმარე_ფუნქცია"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2709
+#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881
+#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890
+#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 sql_help.c:3896
+#: sql_help.c:3897 sql_help.c:3899 sql_help.c:3900 sql_help.c:3902
+#: sql_help.c:3903 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918
+#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924
+#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930
+#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335
+#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342
+#: sql_help.c:4343 sql_help.c:4345 sql_help.c:4346 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4351 sql_help.c:4352 sql_help.c:4358
+#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364
+#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370
+#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376
+#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380
+msgid "role_specification"
+msgstr "როლის_შემოწმება"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198
+#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707
+msgid "user_name"
+msgstr "მომხმარებლის_სახელი"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716
+#: sql_help.c:3932 sql_help.c:4381
+msgid "where role_specification can be:"
+msgstr "სადაც როლის_სპეციფიკაცია შეიძლება იყოს ერთ-ერთი სიიდან:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "ჯგუფის_სახელი"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468
+#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930
+#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923
+#: sql_help.c:4372
+msgid "tablespace_name"
+msgstr "ცხრილების_სივრცის_სახელი"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783
+msgid "index_name"
+msgstr "ინდექსის_სახელი"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2466 sql_help.c:2500
+#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969
+#: sql_help.c:2996
+msgid "storage_parameter"
+msgstr "საცავის_პარამეტრი"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "სვეტის_ნომერი"
+
+#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464
+msgid "large_object_oid"
+msgstr "დიდი_ობიექტის_oid"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889
+msgid "compression_method"
+msgstr "შეკუმშვის_მეთოდი"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "წვდომის_ახალი_მეთოდი"
+
+#: sql_help.c:725 sql_help.c:2523
+msgid "res_proc"
+msgstr "შეზღუდვის_პროცედურა"
+
+#: sql_help.c:726 sql_help.c:2524
+msgid "join_proc"
+msgstr "შეერთების_პროცედურა"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2541
+msgid "strategy_number"
+msgstr "სტრატეგიის_ნომერი"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2543 sql_help.c:2544
+#: sql_help.c:2547 sql_help.c:2548
+msgid "op_type"
+msgstr "ოპ_ტიპი"
+
+#: sql_help.c:782 sql_help.c:2545
+msgid "sort_family_name"
+msgstr "დალაგების_ოჯახის_სახელი"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2546
+msgid "support_number"
+msgstr "დამხმარე_რიცხვი"
+
+#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087
+#: sql_help.c:3089
+msgid "argument_type"
+msgstr "არგუმენტის_ტიპი"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779
+#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891
+#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2324
+#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574
+#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770
+#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917
+#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517
+#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885
+#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334
+#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627
+#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884
+#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060
+#: sql_help.c:5122
+msgid "table_name"
+msgstr "ცხრილის_სახელი"
+
+#: sql_help.c:823 sql_help.c:2576
+msgid "using_expression"
+msgstr "გამოყენების_გამოხატულება"
+
+#: sql_help.c:824 sql_help.c:2577
+msgid "check_expression"
+msgstr "გამოსახულების_შემოწმება"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624
+msgid "publication_object"
+msgstr "გამოცემის_ობიექტი"
+
+#: sql_help.c:903 sql_help.c:2625
+msgid "publication_parameter"
+msgstr "გამოცემის_პარამეტრი"
+
+#: sql_help.c:909 sql_help.c:2627
+msgid "where publication_object is one of:"
+msgstr "სადაც პუბლიკაციის_ობიექტი ერთერთია სიიდან:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662
+#: sql_help.c:3228
+msgid "password"
+msgstr "პაროლი"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663
+#: sql_help.c:3229
+msgid "timestamp"
+msgstr "დროის შტამპი"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3892
+#: sql_help.c:4341
+msgid "database_name"
+msgstr "ბაზის_სახელი"
+
+#: sql_help.c:1073 sql_help.c:2732
+msgid "increment"
+msgstr "გაზრდა"
+
+#: sql_help.c:1074 sql_help.c:2733
+msgid "minvalue"
+msgstr "მინ_მნიშვნელობა"
+
+#: sql_help.c:1075 sql_help.c:2734
+msgid "maxvalue"
+msgstr "მაქს_მნიშვნელობა"
+
+#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664
+#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056
+msgid "start"
+msgstr "დაწყება"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "გადატვრთვა"
+
+#: sql_help.c:1078 sql_help.c:2736
+msgid "cache"
+msgstr "კეში"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "ახალი_სამიზნე"
+
+#: sql_help.c:1142 sql_help.c:2789
+msgid "conninfo"
+msgstr "შეერთ_ინფო"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790
+msgid "publication_name"
+msgstr "გამოცემის_სახელი"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "გამოცემის_მორგება"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "განახლების_პარამეტრები"
+
+#: sql_help.c:1161 sql_help.c:2791
+msgid "subscription_parameter"
+msgstr "გამოწერის_პარამეტრი"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "პარამეტრის_გამოტოვება"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "დანაყოფის_სახელი"
+
+#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922
+msgid "partition_bound_spec"
+msgstr "დანაყოფის_საზღვრის_მითითება"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936
+msgid "sequence_options"
+msgstr "მიმდევრობის_პარამეტრები"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "მიმდევრობის_პარამეტრი"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "ცხრილის_შეზღუდვა_ინდექსით"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "გადაწერის_წესის_სახელი"
+
+#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961
+msgid "and partition_bound_spec is:"
+msgstr "და დანაყოფის_საზღვარის_სპეციფიკაცია არის:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354
+#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963
+#: sql_help.c:2964
+msgid "partition_bound_expr"
+msgstr "დანაყოფის_საზღვრის_გამოსახულება"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358
+#: sql_help.c:2965 sql_help.c:2966
+msgid "numeric_literal"
+msgstr "რიცხვითი_მუდმივა"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "და სვეტის_შეზღუდვა არის:"
+
+#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598
+#: sql_help.c:2934
+msgid "default_expr"
+msgstr "ნაგულისხმები_გამოსახულება"
+
+#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935
+msgid "generation_expr"
+msgstr "გენერირებული_გამოსახულება"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947
+#: sql_help.c:2949 sql_help.c:2953
+msgid "index_parameters"
+msgstr "ინდექსის_პარამეტრები"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956
+msgid "reftable"
+msgstr "მიბმების_ცხრილი"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957
+msgid "refcolumn"
+msgstr "მიბმული_სვეტი"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959
+msgid "referential_action"
+msgstr "მიბმის_ქმედებები"
+
+#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943
+msgid "and table_constraint is:"
+msgstr "და table_constraint არის:"
+
+#: sql_help.c:1409 sql_help.c:2951
+msgid "exclude_element"
+msgstr "ელემენტის_ამოღება"
+
+#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662
+#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054
+msgid "operator"
+msgstr "ოპერატორი"
+
+#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954
+msgid "predicate"
+msgstr "პრედიკატი"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "და table_constraint_using_index არის:"
+
+#: sql_help.c:1421 sql_help.c:2967
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "ინდექსის_პარამეტრები UNIQUE, PRIMARY KEY და EXCLUDE შეზღუდვებში:"
+
+#: sql_help.c:1426 sql_help.c:2972
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "ელემენტის_ამოღება EXCLUDE შეზღუდვაში წარმოადგენს:"
+
+#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912
+#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991
+msgid "opclass"
+msgstr "ოპერატ_კლასი"
+
+#: sql_help.c:1430 sql_help.c:2976
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "მიბმის ქმედება FOREIGN KEY/REFERENCES შეზღუდვაში წარმოადგენს:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013
+msgid "tablespace_option"
+msgstr "ცხრილების_სივრცის_პარამეტრი"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "კოდის_ტიპი"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "ლექსიკონის_სახელი"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "ძველი_ლექსიკონი"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "ახალი_ლექსიკონი"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3166
+msgid "attribute_name"
+msgstr "ატრიბუტის_სახელი"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "ახალი_ატრიბუტის_სახელი"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "ათვლის_ახალი_მნიშვნელობა"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "მეზობლად_ათვლის_მნიშვნელობა"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "აღრიცხვის_არსებული_მნიშვნელობა"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "თვისება"
+
+#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748
+#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947
+#: sql_help.c:4350
+msgid "server_name"
+msgstr "სერვერის_სახელი"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261
+msgid "view_option_name"
+msgstr "ხედის_პარამეტრის_სახელი"
+
+#: sql_help.c:1698 sql_help.c:3262
+msgid "view_option_value"
+msgstr "ხედის_პარამეტრის_მნიშვნელობა"
+
+#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958
+msgid "table_and_columns"
+msgstr "ცხრილი_და სვეტები"
+
+#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745
+#: sql_help.c:4185 sql_help.c:4959
+msgid "where option can be one of:"
+msgstr "სადაც option შეიძლება იყოს ერთ-ერთი სიიდან:"
+
+#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977
+#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747
+#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188
+#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963
+#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967
+msgid "boolean"
+msgstr "ლოგიკური"
+
+#: sql_help.c:1724 sql_help.c:4969
+msgid "and table_and_columns is:"
+msgstr "და table_and_columns არის:"
+
+#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749
+msgid "transaction_mode"
+msgstr "ტრანზაქციის_რეჟიმი"
+
+#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750
+msgid "where transaction_mode is one of:"
+msgstr "სადაც transaction_mode შეიძლება იყოს ერთ-ერთი სიიდან:"
+
+#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582
+#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835
+#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064
+#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084
+msgid "argument"
+msgstr "არგიმენტი"
+
+#: sql_help.c:1850
+msgid "relation_name"
+msgstr "ურთიერთობის_სახელი"
+
+#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344
+msgid "domain_name"
+msgstr "დომენის_სახელი"
+
+#: sql_help.c:1877
+msgid "policy_name"
+msgstr "წესის_სახელი"
+
+#: sql_help.c:1890
+msgid "rule_name"
+msgstr "წესის_სახელი"
+
+#: sql_help.c:1909 sql_help.c:4483
+msgid "string_literal"
+msgstr "სტრიქონი_მუდმივა"
+
+#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397
+msgid "transaction_id"
+msgstr "ტრანზაქციის_id"
+
+#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017
+msgid "filename"
+msgstr "ფაილის სახელი"
+
+#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688
+#: sql_help.c:2689
+msgid "command"
+msgstr "ბრძანება"
+
+#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297
+#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552
+#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809
+#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049
+msgid "condition"
+msgstr "მდგომარეობა"
+
+#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263
+#: sql_help.c:3281 sql_help.c:3982
+msgid "query"
+msgstr "მოთხოვნა"
+
+#: sql_help.c:1976
+msgid "format_name"
+msgstr "ფორმატის_სახელი"
+
+#: sql_help.c:1978
+msgid "delimiter_character"
+msgstr "გამყოფი_სიმბოლო"
+
+#: sql_help.c:1979
+msgid "null_string"
+msgstr "ნულოვანი_სტრიქონი"
+
+#: sql_help.c:1981
+msgid "quote_character"
+msgstr "ციტატის_სიმბოლო"
+
+#: sql_help.c:1982
+msgid "escape_character"
+msgstr "სპეციალური_სიმბოლო"
+
+#: sql_help.c:1986
+msgid "encoding_name"
+msgstr "კოდირების-სახელი"
+
+#: sql_help.c:1997
+msgid "access_method_type"
+msgstr "წვდომის_მეთოდის_ტიპი"
+
+#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090
+msgid "arg_data_type"
+msgstr "არგ_მონაც_ტიპი"
+
+#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099
+msgid "sfunc"
+msgstr "მდგომარეობის_ფუნქცია"
+
+#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100
+msgid "state_data_type"
+msgstr "მდგომარეობის_მონაცემების_ტიპი"
+
+#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101
+msgid "state_data_size"
+msgstr "მდგომარეობის_მონაცემების_ზომა"
+
+#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102
+msgid "ffunc"
+msgstr "დასრულების ფუნქცია"
+
+#: sql_help.c:2073 sql_help.c:2103
+msgid "combinefunc"
+msgstr "კომბინ_ფუნქც"
+
+#: sql_help.c:2074 sql_help.c:2104
+msgid "serialfunc"
+msgstr "დესერიალიზაციის_ფუნქცია"
+
+#: sql_help.c:2075 sql_help.c:2105
+msgid "deserialfunc"
+msgstr "დესერიალიზაციის_ფუნქც"
+
+#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106
+msgid "initial_condition"
+msgstr "საწყისი_მდგომარეობა"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "msfunc"
+msgstr "გადაადგ_მდგომ_ფუნქცია"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "minvfunc"
+msgstr "გადაადგ_მინ_მნიშვნ_ფუნქცია"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "mstate_data_type"
+msgstr "გადაადგ_მონაც_ტიპი"
+
+#: sql_help.c:2080 sql_help.c:2110
+msgid "mstate_data_size"
+msgstr "გადაადგ_მონაც_ზომ"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "mffunc"
+msgstr "გადადგ_დასრულ_ფუნქცია"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minitial_condition"
+msgstr "გადაადგ­_დასაწყ_ფუნქცია"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "sort_operator"
+msgstr "დალაგების_ოპერატორი"
+
+#: sql_help.c:2096
+msgid "or the old syntax"
+msgstr "ან ძველი სინტაქსი"
+
+#: sql_help.c:2098
+msgid "base_type"
+msgstr "საბაზისო_ტიპი"
+
+#: sql_help.c:2155 sql_help.c:2202
+msgid "locale"
+msgstr "ენა"
+
+#: sql_help.c:2156 sql_help.c:2203
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2157 sql_help.c:2204
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2158 sql_help.c:4450
+msgid "provider"
+msgstr "მომწოდებელი"
+
+#: sql_help.c:2160 sql_help.c:2263
+msgid "version"
+msgstr "ვერსია"
+
+#: sql_help.c:2162
+msgid "existing_collation"
+msgstr "არსებული_კოლაცია"
+
+#: sql_help.c:2172
+msgid "source_encoding"
+msgstr "წყაროს_კოდირება"
+
+#: sql_help.c:2173
+msgid "dest_encoding"
+msgstr "სამიზნე_კოდირება"
+
+#: sql_help.c:2199 sql_help.c:3039
+msgid "template"
+msgstr "შაბლონი"
+
+#: sql_help.c:2200
+msgid "encoding"
+msgstr "კოდირება"
+
+#: sql_help.c:2201
+msgid "strategy"
+msgstr "სტრატეგია"
+
+#: sql_help.c:2205
+msgid "icu_locale"
+msgstr "icu_ენა"
+
+#: sql_help.c:2206
+msgid "locale_provider"
+msgstr "ენის_მომწოდებელი"
+
+#: sql_help.c:2207
+msgid "collation_version"
+msgstr "კოლაციის ვერსია"
+
+#: sql_help.c:2212
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2232
+msgid "constraint"
+msgstr "შეზღუდვა"
+
+#: sql_help.c:2233
+msgid "where constraint is:"
+msgstr "სადაც constraint არის:"
+
+#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112
+msgid "event"
+msgstr "მოვლენა"
+
+#: sql_help.c:2248
+msgid "filter_variable"
+msgstr "ფილტრის_ცვლადი"
+
+#: sql_help.c:2249
+msgid "filter_value"
+msgstr "ფილტრის_მნიშვნელობა"
+
+#: sql_help.c:2345 sql_help.c:2931
+msgid "where column_constraint is:"
+msgstr "სადაც column_constraint არის:"
+
+#: sql_help.c:2390
+msgid "rettype"
+msgstr "დაბრუნების_ტიპი"
+
+#: sql_help.c:2392
+msgid "column_type"
+msgstr "სვეტის_ტიპი"
+
+#: sql_help.c:2401 sql_help.c:2604
+msgid "definition"
+msgstr "აღწერა"
+
+#: sql_help.c:2402 sql_help.c:2605
+msgid "obj_file"
+msgstr "ობიექტის_ფაილი"
+
+#: sql_help.c:2403 sql_help.c:2606
+msgid "link_symbol"
+msgstr "სიმბოლოს_მიბმა"
+
+#: sql_help.c:2404 sql_help.c:2607
+msgid "sql_body"
+msgstr "sql_ის_სხეული"
+
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913
+#: sql_help.c:2927 sql_help.c:2995
+msgid "method"
+msgstr "მეთოდი"
+
+#: sql_help.c:2463
+msgid "opclass_parameter"
+msgstr "ოპერატ_კლასის_პარამეტრი"
+
+#: sql_help.c:2480
+msgid "call_handler"
+msgstr "გამოძახების_დამმუშავებელი"
+
+#: sql_help.c:2481
+msgid "inline_handler"
+msgstr "ჩადგმული_კოდის_დამმუშავებელი"
+
+#: sql_help.c:2482
+msgid "valfunction"
+msgstr "მნიშვნფუნქცია"
+
+#: sql_help.c:2521
+msgid "com_op"
+msgstr "კომუტ_ოპერ"
+
+#: sql_help.c:2522
+msgid "neg_op"
+msgstr "უარყ_ოპერატ"
+
+#: sql_help.c:2540
+msgid "family_name"
+msgstr "ოჯახის_სახელი"
+
+#: sql_help.c:2551
+msgid "storage_type"
+msgstr "საცავის_ტიპი"
+
+#: sql_help.c:2690 sql_help.c:3119
+msgid "where event can be one of:"
+msgstr "სადაც event შეიძლება იყოს ერთ-ერთი:"
+
+#: sql_help.c:2710 sql_help.c:2712
+msgid "schema_element"
+msgstr "სქემის_ელემენტი"
+
+#: sql_help.c:2749
+msgid "server_type"
+msgstr "სერვერის_ტიპი"
+
+#: sql_help.c:2750
+msgid "server_version"
+msgstr "სერვერის_ვერსია"
+
+#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347
+msgid "fdw_name"
+msgstr "fdw_name"
+
+#: sql_help.c:2768 sql_help.c:2771
+msgid "statistics_name"
+msgstr "სტატისტიკის_სახელი"
+
+#: sql_help.c:2772
+msgid "statistics_kind"
+msgstr "სტატისტიკის_ტიპი"
+
+#: sql_help.c:2788
+msgid "subscription_name"
+msgstr "გამოწერის_სახელი"
+
+#: sql_help.c:2893
+msgid "source_table"
+msgstr "წყაროს_ცხრილი"
+
+#: sql_help.c:2894
+msgid "like_option"
+msgstr "მსგავსების_პარამეტრი"
+
+#: sql_help.c:2960
+msgid "and like_option is:"
+msgstr "და like_option არის:"
+
+#: sql_help.c:3012
+msgid "directory"
+msgstr "საქაღალდე"
+
+#: sql_help.c:3026
+msgid "parser_name"
+msgstr "დამმუშავებლის_სახელი"
+
+#: sql_help.c:3027
+msgid "source_config"
+msgstr "წყაროს_კონფიგურაცია"
+
+#: sql_help.c:3056
+msgid "start_function"
+msgstr "გაშვების_ფუნქცია"
+
+#: sql_help.c:3057
+msgid "gettoken_function"
+msgstr "კოდის_მიღების_ფუნქცია"
+
+#: sql_help.c:3058
+msgid "end_function"
+msgstr "დასრულების ფუნქცია"
+
+#: sql_help.c:3059
+msgid "lextypes_function"
+msgstr "ლექს_ტიპების_ფუნქცია"
+
+#: sql_help.c:3060
+msgid "headline_function"
+msgstr "headline_function"
+
+#: sql_help.c:3072
+msgid "init_function"
+msgstr "ინიციალიზაციის_ფუნქცია"
+
+#: sql_help.c:3073
+msgid "lexize_function"
+msgstr "ლექსით_გამოყოფის_ფუნქცია"
+
+#: sql_help.c:3086
+msgid "from_sql_function_name"
+msgstr "sql_ფუნქციის_სახელიდან"
+
+#: sql_help.c:3088
+msgid "to_sql_function_name"
+msgstr "ფუნქციის_სახელი_sql_ში"
+
+#: sql_help.c:3114
+msgid "referenced_table_name"
+msgstr "მიბმული_ცხრილის_სახელი"
+
+#: sql_help.c:3115
+msgid "transition_relation_name"
+msgstr "გარდამავალი_ურთიერთობის_სახელი"
+
+#: sql_help.c:3118
+msgid "arguments"
+msgstr "არგუმენტები"
+
+#: sql_help.c:3170
+msgid "label"
+msgstr "ჭდე"
+
+#: sql_help.c:3172
+msgid "subtype"
+msgstr "ქვეტიპი"
+
+#: sql_help.c:3173
+msgid "subtype_operator_class"
+msgstr "ქვეტიპის_ოპერატორის_კლასი"
+
+#: sql_help.c:3175
+msgid "canonical_function"
+msgstr "კანონიკური_ფუნქცია"
+
+#: sql_help.c:3176
+msgid "subtype_diff_function"
+msgstr "ქვეტიპის_სხვაობის_ფუნქცია"
+
+#: sql_help.c:3177
+msgid "multirange_type_name"
+msgstr "მრავალდიაპაზონიანი_ტიპის_სახელი"
+
+#: sql_help.c:3179
+msgid "input_function"
+msgstr "შეყვანის_ფუნქცია"
+
+#: sql_help.c:3180
+msgid "output_function"
+msgstr "გამოტანის_ფუნქცია"
+
+#: sql_help.c:3181
+msgid "receive_function"
+msgstr "მიღების_ფუნქცია"
+
+#: sql_help.c:3182
+msgid "send_function"
+msgstr "საწყისი_მნიშვნელობის_ფუნქცია"
+
+#: sql_help.c:3183
+msgid "type_modifier_input_function"
+msgstr "ტიპის_მოდიფიკატორის_შემყვანის_ფუნქცია"
+
+#: sql_help.c:3184
+msgid "type_modifier_output_function"
+msgstr "ტიპის_მოტიფიკატორის_გამოტანის_ფუნქცია"
+
+#: sql_help.c:3185
+msgid "analyze_function"
+msgstr "ფუნქციის_ანალიზი"
+
+#: sql_help.c:3186
+msgid "subscript_function"
+msgstr "ინდექსით_მიმართვის_ფუნქცია"
+
+#: sql_help.c:3187
+msgid "internallength"
+msgstr "შიდასიგრძე"
+
+#: sql_help.c:3188
+msgid "alignment"
+msgstr "სწორება"
+
+#: sql_help.c:3189
+msgid "storage"
+msgstr "საცავი"
+
+#: sql_help.c:3190
+msgid "like_type"
+msgstr "მსგავსების_ტიპი"
+
+#: sql_help.c:3191
+msgid "category"
+msgstr "კატეგორია"
+
+#: sql_help.c:3192
+msgid "preferred"
+msgstr "რჩეული"
+
+#: sql_help.c:3193
+msgid "default"
+msgstr "ნაგულისხმები"
+
+#: sql_help.c:3194
+msgid "element"
+msgstr "ელემენტი"
+
+#: sql_help.c:3195
+msgid "delimiter"
+msgstr "გამყოფი"
+
+#: sql_help.c:3196
+msgid "collatable"
+msgstr "დალაგებადი"
+
+#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547
+#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042
+msgid "with_query"
+msgstr "მოთხოვნით"
+
+#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572
+#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591
+#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836
+#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061
+#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078
+#: sql_help.c:5086
+msgid "alias"
+msgstr "მეტსახელი"
+
+#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603
+#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852
+#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860
+#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090
+#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098
+msgid "from_item"
+msgstr "ჩანაწერიდან"
+
+#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928
+msgid "cursor_name"
+msgstr "კურსორის_სახელი"
+
+#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929
+msgid "output_expression"
+msgstr "გამოტანის_გამოსახულება"
+
+#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652
+#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045
+msgid "output_name"
+msgstr "გამოტანს_სახელი"
+
+#: sql_help.c:3316
+msgid "code"
+msgstr "კოდი"
+
+#: sql_help.c:3721
+msgid "parameter"
+msgstr "Პარამეტრი"
+
+#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142
+msgid "statement"
+msgstr "ოპერატორი"
+
+#: sql_help.c:3778 sql_help.c:4116
+msgid "direction"
+msgstr "მიმართულება"
+
+#: sql_help.c:3780 sql_help.c:4118
+msgid "where direction can be one of:"
+msgstr "სადაც მიმართულება შეიძლება იყოს ერთ-ერთი:"
+
+#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784
+#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121
+#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562
+#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819
+#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057
+msgid "count"
+msgstr "რაოდენობა"
+
+#: sql_help.c:3888 sql_help.c:4337
+msgid "sequence_name"
+msgstr "მიმდევრობის _სახელი"
+
+#: sql_help.c:3906 sql_help.c:4355
+msgid "arg_name"
+msgstr "არგ_სახელი"
+
+#: sql_help.c:3907 sql_help.c:4356
+msgid "arg_type"
+msgstr "არგ_ტიპი"
+
+#: sql_help.c:3914 sql_help.c:4363
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3945
+msgid "remote_schema"
+msgstr "დაშორებული_სქემა"
+
+#: sql_help.c:3948
+msgid "local_schema"
+msgstr "ლოკალური_სქემა"
+
+#: sql_help.c:3983
+msgid "conflict_target"
+msgstr "კონფლიქტის_ობიექტი"
+
+#: sql_help.c:3984
+msgid "conflict_action"
+msgstr "ქმედება_კონფლიქტის_დროს"
+
+#: sql_help.c:3987
+msgid "where conflict_target can be one of:"
+msgstr "სადაც conflict_target შეიძლება იყოს სიიდან:"
+
+#: sql_help.c:3988
+msgid "index_column_name"
+msgstr "ინდექსის_სვეტის_სახელი"
+
+#: sql_help.c:3989
+msgid "index_expression"
+msgstr "გამოსახულების_ინდექსი"
+
+#: sql_help.c:3992
+msgid "index_predicate"
+msgstr "ინდექსის_პრედიკატი"
+
+#: sql_help.c:3994
+msgid "and conflict_action is one of:"
+msgstr "და conflict_action შეიძლება იყოს სიიდან:"
+
+#: sql_help.c:4000 sql_help.c:4925
+msgid "sub-SELECT"
+msgstr "ქვე-SELECT"
+
+#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901
+msgid "channel"
+msgstr "არხი"
+
+#: sql_help.c:4031
+msgid "lockmode"
+msgstr "ბლოკის_რეჟიმი"
+
+#: sql_help.c:4032
+msgid "where lockmode is one of:"
+msgstr "სადაც lockmode ერთერთია სიიდან:"
+
+#: sql_help.c:4068
+msgid "target_table_name"
+msgstr "სამიზნე ცხრილის სახელი"
+
+#: sql_help.c:4069
+msgid "target_alias"
+msgstr "სამიზნე_მეტსახელი"
+
+#: sql_help.c:4070
+msgid "data_source"
+msgstr "მონაცემების_წყარო"
+
+#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091
+msgid "join_condition"
+msgstr "შეერთების პირობა"
+
+#: sql_help.c:4072
+msgid "when_clause"
+msgstr "პირობა_როდის"
+
+#: sql_help.c:4073
+msgid "where data_source is:"
+msgstr "სადაც data_source არის:"
+
+#: sql_help.c:4074
+msgid "source_table_name"
+msgstr "წყაროს_ცხრილის_სახელი"
+
+#: sql_help.c:4075
+msgid "source_query"
+msgstr "წყაროს_მოთხოვნა"
+
+#: sql_help.c:4076
+msgid "source_alias"
+msgstr "წყაროს_მეტსახელი"
+
+#: sql_help.c:4077
+msgid "and when_clause is:"
+msgstr "და when_clause არის:"
+
+#: sql_help.c:4079
+msgid "merge_update"
+msgstr "განახლების_შერწყმა"
+
+#: sql_help.c:4080
+msgid "merge_delete"
+msgstr "წაშლის_შერწყმა"
+
+#: sql_help.c:4082
+msgid "merge_insert"
+msgstr "ჩასმის_შერწყმა"
+
+#: sql_help.c:4083
+msgid "and merge_insert is:"
+msgstr "და merge_insert არის:"
+
+#: sql_help.c:4086
+msgid "and merge_update is:"
+msgstr "და merge_update არის:"
+
+#: sql_help.c:4091
+msgid "and merge_delete is:"
+msgstr "და merge_delete არის:"
+
+#: sql_help.c:4132
+msgid "payload"
+msgstr "შემცველობა"
+
+#: sql_help.c:4159
+msgid "old_role"
+msgstr "ძველი_როლი"
+
+#: sql_help.c:4160
+msgid "new_role"
+msgstr "ახალი_როლი"
+
+#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413
+msgid "savepoint_name"
+msgstr "შენახვის_წერტილის_სახელი"
+
+#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868
+#: sql_help.c:5048 sql_help.c:5106
+msgid "grouping_element"
+msgstr "დაჯგუფების_ელემენტი"
+
+#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050
+msgid "window_name"
+msgstr "ფანჯრის_სახელი"
+
+#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051
+msgid "window_definition"
+msgstr "ფანჯრის_აღწერა"
+
+#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660
+#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052
+#: sql_help.c:5066 sql_help.c:5110
+msgid "select"
+msgstr "არჩევა"
+
+#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059
+msgid "where from_item can be one of:"
+msgstr "სადაც from_item შეიძლება იყოს სიიდან ერთი:"
+
+#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580
+#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833
+#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068
+#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087
+msgid "column_alias"
+msgstr "სვეტის_მეტსახელი"
+
+#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063
+msgid "sampling_method"
+msgstr "სემპლინგის_მეთოდი"
+
+#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065
+msgid "seed"
+msgstr "საწყისი მნიშვნელობა"
+
+#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870
+#: sql_help.c:5069 sql_help.c:5108
+msgid "with_query_name"
+msgstr "მოთხოვნის_სახელით"
+
+#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841
+#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082
+#: sql_help.c:5085
+msgid "column_definition"
+msgstr "სვეტის_აღწერა"
+
+#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857
+#: sql_help.c:5089 sql_help.c:5095
+msgid "join_type"
+msgstr "შეერთების_ტიპი"
+
+#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092
+msgid "join_column"
+msgstr "სვეტების შეერთება"
+
+#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093
+msgid "join_using_alias"
+msgstr "მეტსახელით_შეერთბა"
+
+#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099
+msgid "and grouping_element can be one of:"
+msgstr "და grouping_element შეძლება იყოს სიიდან ერთი:"
+
+#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107
+msgid "and with_query is:"
+msgstr "და with_query არის:"
+
+#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111
+msgid "values"
+msgstr "მნიშვნელობები"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112
+msgid "insert"
+msgstr "ჩასმა"
+
+#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113
+msgid "update"
+msgstr "განახლება"
+
+#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114
+msgid "delete"
+msgstr "წაშლა"
+
+#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116
+msgid "search_seq_col_name"
+msgstr "ბოლო_ძებნის_სვეტის_სახელი"
+
+#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118
+msgid "cycle_mark_col_name"
+msgstr "ციკლის_ნიშნიანი_სვეტის_სახელი"
+
+#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119
+msgid "cycle_mark_value"
+msgstr "ციკლის ნიშნის მნიშვნელობა"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120
+msgid "cycle_mark_default"
+msgstr "ციკლის_ნაგულისხმები_ნიშანი"
+
+#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121
+msgid "cycle_path_col_name"
+msgstr "ციკლის_ბილიკის_სვეტის_სახელი"
+
+#: sql_help.c:4653
+msgid "new_table"
+msgstr "ახალი_ცხრილის"
+
+#: sql_help.c:4724
+msgid "snapshot_id"
+msgstr "სწრაფი_ასლის_id"
+
+#: sql_help.c:4984
+msgid "sort_expression"
+msgstr "დალაგების_გამოსახულება"
+
+#: sql_help.c:5128 sql_help.c:6112
+msgid "abort the current transaction"
+msgstr "მიმდინარე ტრანზაქციის გაუქმება"
+
+#: sql_help.c:5134
+msgid "change the definition of an aggregate function"
+msgstr "აგრეგატული ფუნქციის აღწერის შექმნა"
+
+#: sql_help.c:5140
+msgid "change the definition of a collation"
+msgstr "კოლაციის აღწერის შეცვლა"
+
+#: sql_help.c:5146
+msgid "change the definition of a conversion"
+msgstr "გადაყვანის აღწერის შეცვლა"
+
+#: sql_help.c:5152
+msgid "change a database"
+msgstr "მონაცემთა ბაზის შეცვლა"
+
+#: sql_help.c:5158
+msgid "define default access privileges"
+msgstr "წვდომის ნაგულისხმები უფლებების აღწერა"
+
+#: sql_help.c:5164
+msgid "change the definition of a domain"
+msgstr "დომენის აღწერის შეცვლა"
+
+#: sql_help.c:5170
+msgid "change the definition of an event trigger"
+msgstr "დომენის აღწერის შეცვლა"
+
+#: sql_help.c:5176
+msgid "change the definition of an extension"
+msgstr "გაფართოების აღწერის შეცვლა"
+
+#: sql_help.c:5182
+msgid "change the definition of a foreign-data wrapper"
+msgstr "გარე-მონაცემების გადამტანის აღწერის შეცვლა"
+
+#: sql_help.c:5188
+msgid "change the definition of a foreign table"
+msgstr "გარე ცხრილის აღწერის შეცვლა"
+
+#: sql_help.c:5194
+msgid "change the definition of a function"
+msgstr "ფუნქციის აღწერის შეცვლა"
+
+#: sql_help.c:5200
+msgid "change role name or membership"
+msgstr "როლის სახელის ან წევრობის შეცვლა"
+
+#: sql_help.c:5206
+msgid "change the definition of an index"
+msgstr "ინდექსის აღწერის შეცვლა"
+
+#: sql_help.c:5212
+msgid "change the definition of a procedural language"
+msgstr "პროცედურული ენის აღწერის შეცვლა"
+
+#: sql_help.c:5218
+msgid "change the definition of a large object"
+msgstr "დიდი ობიექტის აღწერის შეცვლა"
+
+#: sql_help.c:5224
+msgid "change the definition of a materialized view"
+msgstr "მატერიალიზებული ხედის აღწერის შეცვლა"
+
+#: sql_help.c:5230
+msgid "change the definition of an operator"
+msgstr "ოპერატორის აღწერის შეცვლა"
+
+#: sql_help.c:5236
+msgid "change the definition of an operator class"
+msgstr "ოპერატორის კლასის აღწერის შეცვლა"
+
+#: sql_help.c:5242
+msgid "change the definition of an operator family"
+msgstr "ოპერატორის ოჯახის აღწერის შეცვლა"
+
+#: sql_help.c:5248
+msgid "change the definition of a row-level security policy"
+msgstr "მწკრივის-დონის-უსაფრთხოების წესების აღწერის შეცვლა"
+
+#: sql_help.c:5254
+msgid "change the definition of a procedure"
+msgstr "პროცედურის აღწერის შეცვლა"
+
+#: sql_help.c:5260
+msgid "change the definition of a publication"
+msgstr "გამოცემის აღწერის შეცვლა"
+
+#: sql_help.c:5266 sql_help.c:5368
+msgid "change a database role"
+msgstr "მონაცემთა ბაზის როლის შეცვლა"
+
+#: sql_help.c:5272
+msgid "change the definition of a routine"
+msgstr "ქვეპროგრამის აღწერის შეცვლა"
+
+#: sql_help.c:5278
+msgid "change the definition of a rule"
+msgstr "წესის აღწერის შეცვლა"
+
+#: sql_help.c:5284
+msgid "change the definition of a schema"
+msgstr "სქემის აღწერის შეცვლა"
+
+#: sql_help.c:5290
+msgid "change the definition of a sequence generator"
+msgstr "მიმდევრობის გენერატორის აღწერის შეცვლა"
+
+#: sql_help.c:5296
+msgid "change the definition of a foreign server"
+msgstr "გარე სერვერის აღწერის შეცვლა"
+
+#: sql_help.c:5302
+msgid "change the definition of an extended statistics object"
+msgstr "სტატისტიკის გაფართოებული ობიექტის აღწერის შეცვლა"
+
+#: sql_help.c:5308
+msgid "change the definition of a subscription"
+msgstr "გამოწერის აღწერის შეცვლა"
+
+#: sql_help.c:5314
+msgid "change a server configuration parameter"
+msgstr "სერვერის კონფიგურაციის პარამეტრის შეცვლა"
+
+#: sql_help.c:5320
+msgid "change the definition of a table"
+msgstr "ცხრილის აღწერის შეცვლა"
+
+#: sql_help.c:5326
+msgid "change the definition of a tablespace"
+msgstr "ცხრილების სივრცის აღწერის შეცვლა"
+
+#: sql_help.c:5332
+msgid "change the definition of a text search configuration"
+msgstr "ტექსტის ძებნის კონფიგურაციის აღწერის შეცვლა"
+
+#: sql_help.c:5338
+msgid "change the definition of a text search dictionary"
+msgstr "ტექსტის ძებნის ლექსიკონის აღწერის შეცვლა"
+
+#: sql_help.c:5344
+msgid "change the definition of a text search parser"
+msgstr "ტექსტის ძებნის დამმუშავებლის აღწერს შეცვლა"
+
+#: sql_help.c:5350
+msgid "change the definition of a text search template"
+msgstr "ტექსტის ძებნის შაბლონის აღწერის შეცვლა"
+
+#: sql_help.c:5356
+msgid "change the definition of a trigger"
+msgstr "ტრიგერის აღწერის შეცვლა"
+
+#: sql_help.c:5362
+msgid "change the definition of a type"
+msgstr "ტიპის აღწერის შეცვლა"
+
+#: sql_help.c:5374
+msgid "change the definition of a user mapping"
+msgstr "მომხარებლის მიბმის აღწერის შეცვლა"
+
+#: sql_help.c:5380
+msgid "change the definition of a view"
+msgstr "ხედის აღწერის შეცვლა"
+
+#: sql_help.c:5386
+msgid "collect statistics about a database"
+msgstr "მონაცემების სტატისტიკის მოგროვება"
+
+#: sql_help.c:5392 sql_help.c:6190
+msgid "start a transaction block"
+msgstr "ტრანზაქციის ბლოკის დაწყება"
+
+#: sql_help.c:5398
+msgid "invoke a procedure"
+msgstr "პროცედურის ჩაწოდება"
+
+#: sql_help.c:5404
+msgid "force a write-ahead log checkpoint"
+msgstr "წინასწარ-ჩაწერად ჟურნალში საკონტროლო წერტილის დასმა"
+
+#: sql_help.c:5410
+msgid "close a cursor"
+msgstr "კურსორის დახურვა"
+
+#: sql_help.c:5416
+msgid "cluster a table according to an index"
+msgstr "ცხრილის გადაჯგუფება ინდექსის მიხედვით"
+
+#: sql_help.c:5422
+msgid "define or change the comment of an object"
+msgstr "ობიექტის კომენტარის აღწერა ან შეცვლა"
+
+#: sql_help.c:5428 sql_help.c:5986
+msgid "commit the current transaction"
+msgstr "მიმდინარე ტრანზაქციის გადაცემა"
+
+#: sql_help.c:5434
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "წინასწარ ორ ფაზაში გადასაცემად მომზადებული ტრანზაქციის გადაცემა"
+
+#: sql_help.c:5440
+msgid "copy data between a file and a table"
+msgstr "მონაცემების კოპირება ფაილსა და ცხრილს შორის"
+
+#: sql_help.c:5446
+msgid "define a new access method"
+msgstr "წვდომის ახალი მეთოდის აღწერა"
+
+#: sql_help.c:5452
+msgid "define a new aggregate function"
+msgstr "ახალი აგრეგატული ფუნქციის აღწერა"
+
+#: sql_help.c:5458
+msgid "define a new cast"
+msgstr "ახალი კასტის აღწერა"
+
+#: sql_help.c:5464
+msgid "define a new collation"
+msgstr "ახალი კოლაციის აღწერა"
+
+#: sql_help.c:5470
+msgid "define a new encoding conversion"
+msgstr "კოდირების ახალი გადაყვანის აღწერა"
+
+#: sql_help.c:5476
+msgid "create a new database"
+msgstr "ახალი მონაცემთა ბაზის შექმნა"
+
+#: sql_help.c:5482
+msgid "define a new domain"
+msgstr "ახალი დომენის შექმნა"
+
+#: sql_help.c:5488
+msgid "define a new event trigger"
+msgstr "მოვლენის ახალი ტრიგერის აღწერა"
+
+#: sql_help.c:5494
+msgid "install an extension"
+msgstr "გაფართოების დაყენება"
+
+#: sql_help.c:5500
+msgid "define a new foreign-data wrapper"
+msgstr "გარე მონაცემების ახალი გადამტანის აღწერა"
+
+#: sql_help.c:5506
+msgid "define a new foreign table"
+msgstr "მონაცემების გარე ცხრილის აღწერა"
+
+#: sql_help.c:5512
+msgid "define a new function"
+msgstr "ახალი ფუნქციის აღწერა"
+
+#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680
+msgid "define a new database role"
+msgstr "მონაცემთა ბაზის ახალი როლის აღწერა"
+
+#: sql_help.c:5524
+msgid "define a new index"
+msgstr "ახალი ინდექსის აღწერა"
+
+#: sql_help.c:5530
+msgid "define a new procedural language"
+msgstr "ახალი პროცედურული ენის აღწერა"
+
+#: sql_help.c:5536
+msgid "define a new materialized view"
+msgstr "ახალი მატერიალიზებული ხედის აღწერა"
+
+#: sql_help.c:5542
+msgid "define a new operator"
+msgstr "ახალი ოპერატორის აღწერა"
+
+#: sql_help.c:5548
+msgid "define a new operator class"
+msgstr "ოპერატორის ახალი კლასის აღწერა"
+
+#: sql_help.c:5554
+msgid "define a new operator family"
+msgstr "ოპერატორის ახალი ოჯახის აღწერა"
+
+#: sql_help.c:5560
+msgid "define a new row-level security policy for a table"
+msgstr "ცხრილისთვის ახალი მწკრივის-დონის-უსაფრთხოების წესის აღწერა"
+
+#: sql_help.c:5566
+msgid "define a new procedure"
+msgstr "ახალი პროცედურის აღწერა"
+
+#: sql_help.c:5572
+msgid "define a new publication"
+msgstr "ახალი გამოცემის აღწერა"
+
+#: sql_help.c:5584
+msgid "define a new rewrite rule"
+msgstr "ახალი გადაწერის წესის აღწერა"
+
+#: sql_help.c:5590
+msgid "define a new schema"
+msgstr "ახალი სქემის აღწერა"
+
+#: sql_help.c:5596
+msgid "define a new sequence generator"
+msgstr "მიმდევრობის ახალი გენერატორის აღწერა"
+
+#: sql_help.c:5602
+msgid "define a new foreign server"
+msgstr "ახალი გარე სერვერის აღწერა"
+
+#: sql_help.c:5608
+msgid "define extended statistics"
+msgstr "გაფართოებული სტატისტიკის აღწერა"
+
+#: sql_help.c:5614
+msgid "define a new subscription"
+msgstr "ახალი გამოწერის აღწერა"
+
+#: sql_help.c:5620
+msgid "define a new table"
+msgstr "ახალი ცხრილის აღწერა"
+
+#: sql_help.c:5626 sql_help.c:6148
+msgid "define a new table from the results of a query"
+msgstr "მოთხოვნის შედეგებიდან ახალი ცხრილის აღწერა"
+
+#: sql_help.c:5632
+msgid "define a new tablespace"
+msgstr "ცხრილების ახალი სივრცის აღწერა"
+
+#: sql_help.c:5638
+msgid "define a new text search configuration"
+msgstr "ტექსტის ძებნის ახალი კონფიგურაციის აღწერა"
+
+#: sql_help.c:5644
+msgid "define a new text search dictionary"
+msgstr "ტექსტის ძებნის ახალ ლექსიკონის აღწერა"
+
+#: sql_help.c:5650
+msgid "define a new text search parser"
+msgstr "ტექსტის ძებნის ახალი დამმუშავებლის აღწერა"
+
+#: sql_help.c:5656
+msgid "define a new text search template"
+msgstr "ტექსტის ძებნის ახალი შაბლონის აღწერა"
+
+#: sql_help.c:5662
+msgid "define a new transform"
+msgstr "ახალი გარდაქმნის აღწერა"
+
+#: sql_help.c:5668
+msgid "define a new trigger"
+msgstr "ახალი ტრიგერის აღწერა"
+
+#: sql_help.c:5674
+msgid "define a new data type"
+msgstr "მონაცემების ახალი ტიპის აღწერა"
+
+#: sql_help.c:5686
+msgid "define a new mapping of a user to a foreign server"
+msgstr "მომხმარებლის გარე სერვერთან ახალი ბმის აღწერა"
+
+#: sql_help.c:5692
+msgid "define a new view"
+msgstr "ახალი ხედის აღწერა"
+
+#: sql_help.c:5698
+msgid "deallocate a prepared statement"
+msgstr "მომზადებული ოპერატორის გათავისუფლება"
+
+#: sql_help.c:5704
+msgid "define a cursor"
+msgstr "კურსორის აღწერა"
+
+#: sql_help.c:5710
+msgid "delete rows of a table"
+msgstr "ცხრილში მწკრივების წაშლა"
+
+#: sql_help.c:5716
+msgid "discard session state"
+msgstr "სესიის მდგომარეობის მოშორება"
+
+#: sql_help.c:5722
+msgid "execute an anonymous code block"
+msgstr "კოდის ანონიმური ბლოკის შესრულება"
+
+#: sql_help.c:5728
+msgid "remove an access method"
+msgstr "წვდომის მეთოდის წაშლა"
+
+#: sql_help.c:5734
+msgid "remove an aggregate function"
+msgstr "აგრეგატული ფუნქციის წაშლა"
+
+#: sql_help.c:5740
+msgid "remove a cast"
+msgstr "კასტის წაშლა"
+
+#: sql_help.c:5746
+msgid "remove a collation"
+msgstr "კოლაციის წაშლა"
+
+#: sql_help.c:5752
+msgid "remove a conversion"
+msgstr "გადაყვანის წაშლა"
+
+#: sql_help.c:5758
+msgid "remove a database"
+msgstr "მონაცემთა ბაზის წაშლა"
+
+#: sql_help.c:5764
+msgid "remove a domain"
+msgstr "დომენის წაშლა"
+
+#: sql_help.c:5770
+msgid "remove an event trigger"
+msgstr "მოვლენის ტრიგერის წაშლა"
+
+#: sql_help.c:5776
+msgid "remove an extension"
+msgstr "გაფართოების წაშლა"
+
+#: sql_help.c:5782
+msgid "remove a foreign-data wrapper"
+msgstr "გარე-მონაცემების გადამტანის წაშლა"
+
+#: sql_help.c:5788
+msgid "remove a foreign table"
+msgstr "გარე ცხრილის წაშლა"
+
+#: sql_help.c:5794
+msgid "remove a function"
+msgstr "ფუნქციის წაშლა"
+
+#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968
+msgid "remove a database role"
+msgstr "მონაცემთა ბაზის როლის წაშლა"
+
+#: sql_help.c:5806
+msgid "remove an index"
+msgstr "ინდექსის წაშლა"
+
+#: sql_help.c:5812
+msgid "remove a procedural language"
+msgstr "პროცედურული ენის წაშლა"
+
+#: sql_help.c:5818
+msgid "remove a materialized view"
+msgstr "მატერიალიზებული ხედის წაშლა"
+
+#: sql_help.c:5824
+msgid "remove an operator"
+msgstr "ოპერატორის წაშლა"
+
+#: sql_help.c:5830
+msgid "remove an operator class"
+msgstr "ოპერატორის კლასის წაშლა"
+
+#: sql_help.c:5836
+msgid "remove an operator family"
+msgstr "ოპერატორის ოჯახის წაშლა"
+
+#: sql_help.c:5842
+msgid "remove database objects owned by a database role"
+msgstr "მონაცემთა ბაზის როლის მფლობელობაში მყოფი ბაზის ობიექტების წაშლა"
+
+#: sql_help.c:5848
+msgid "remove a row-level security policy from a table"
+msgstr "ცხრილიდან მწკრივის-დონის უსაფრთხოების წესის წაშლა"
+
+#: sql_help.c:5854
+msgid "remove a procedure"
+msgstr "პროცედურის წაშლა"
+
+#: sql_help.c:5860
+msgid "remove a publication"
+msgstr "გამოცემის წაშლა"
+
+#: sql_help.c:5872
+msgid "remove a routine"
+msgstr "წესრიგის წაშლა"
+
+#: sql_help.c:5878
+msgid "remove a rewrite rule"
+msgstr "გადაწერის წესის წაშლა"
+
+#: sql_help.c:5884
+msgid "remove a schema"
+msgstr "სქემის წაშლა"
+
+#: sql_help.c:5890
+msgid "remove a sequence"
+msgstr "მიმდევრობის წაშლა"
+
+#: sql_help.c:5896
+msgid "remove a foreign server descriptor"
+msgstr "გარე სერვერის დესკრიპტორის წაშლა"
+
+#: sql_help.c:5902
+msgid "remove extended statistics"
+msgstr "გაფართოებული სტატისტიკის წაშლა"
+
+#: sql_help.c:5908
+msgid "remove a subscription"
+msgstr "გამოწერის წაშლა"
+
+#: sql_help.c:5914
+msgid "remove a table"
+msgstr "ცხრილის წაშლა"
+
+#: sql_help.c:5920
+msgid "remove a tablespace"
+msgstr "ცხრილების სივრცის წაშლა"
+
+#: sql_help.c:5926
+msgid "remove a text search configuration"
+msgstr "ტექსტის ძებნის კონფიგურაციის წაშლა"
+
+#: sql_help.c:5932
+msgid "remove a text search dictionary"
+msgstr "ტექსტის ძებნის ლექსიკონის წაშლა"
+
+#: sql_help.c:5938
+msgid "remove a text search parser"
+msgstr "ტექსტის ძებნის დამმუშავებლის წაშლა"
+
+#: sql_help.c:5944
+msgid "remove a text search template"
+msgstr "ტექსტის ძებნის შაბლონის წაშლა"
+
+#: sql_help.c:5950
+msgid "remove a transform"
+msgstr "გარდაქმნის წაშლა"
+
+#: sql_help.c:5956
+msgid "remove a trigger"
+msgstr "ტრიგერის წაშლა"
+
+#: sql_help.c:5962
+msgid "remove a data type"
+msgstr "მონაცემების ტიპის წაშლა"
+
+#: sql_help.c:5974
+msgid "remove a user mapping for a foreign server"
+msgstr "მომხმარებლის გარე სერვერისთვის მიბმის წაშლა"
+
+#: sql_help.c:5980
+msgid "remove a view"
+msgstr "ხედის წაშლა"
+
+#: sql_help.c:5992
+msgid "execute a prepared statement"
+msgstr "მზა ოპერატორის შესრულება"
+
+#: sql_help.c:5998
+msgid "show the execution plan of a statement"
+msgstr "ოპერატორის შესრულების გეგმის ჩვენება"
+
+#: sql_help.c:6004
+msgid "retrieve rows from a query using a cursor"
+msgstr "კურსორის გამოყენებით მოთხოვნიდან მწკრივების მიღება"
+
+#: sql_help.c:6010
+msgid "define access privileges"
+msgstr "წვდომის უფლებების აღწერა"
+
+#: sql_help.c:6016
+msgid "import table definitions from a foreign server"
+msgstr "ცხრილის აღწერების უცხო სერვერიდან შემოტანა"
+
+#: sql_help.c:6022
+msgid "create new rows in a table"
+msgstr "ცხრილში ახალი მწკრივების შექმნა"
+
+#: sql_help.c:6028
+msgid "listen for a notification"
+msgstr "შეტყობინების მოლოდინი"
+
+#: sql_help.c:6034
+msgid "load a shared library file"
+msgstr "გაზიარებული ბიბლიოთეკის ფაილის ჩატვირთვა"
+
+#: sql_help.c:6040
+msgid "lock a table"
+msgstr "ცხრილის დაბლოკვა"
+
+#: sql_help.c:6046
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "ცხრილის მწკრივების ჩასმა, განახლება ან წაშლა პირობის მიხედვით"
+
+#: sql_help.c:6052
+msgid "position a cursor"
+msgstr "კურსორის მოთავსება"
+
+#: sql_help.c:6058
+msgid "generate a notification"
+msgstr "შეტყობინების გენერაცია"
+
+#: sql_help.c:6064
+msgid "prepare a statement for execution"
+msgstr "ოპერატორის გასაშვებად მომზადება"
+
+#: sql_help.c:6070
+msgid "prepare the current transaction for two-phase commit"
+msgstr "ტრანზაქციის მომზადება ორ ფაზაში გადასაცემად"
+
+#: sql_help.c:6076
+msgid "change the ownership of database objects owned by a database role"
+msgstr "ბაზის როლის მფლობელობაში მყოფი ბაზის ობიექტების მფლობელის შეცვლა"
+
+#: sql_help.c:6082
+msgid "replace the contents of a materialized view"
+msgstr "მატერიალიზებული ხედის შემცველობის ჩანაცვლება"
+
+#: sql_help.c:6088
+msgid "rebuild indexes"
+msgstr "ინდექსების თავიდან აგება"
+
+#: sql_help.c:6094
+msgid "destroy a previously defined savepoint"
+msgstr "ადრე აღწერილი შენახვის წერტილის განადგურება"
+
+#: sql_help.c:6100
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "გაშვების პარამეტრის მნიშვნელობის საწყის მნიშვნელობაზე აღდგენა"
+
+#: sql_help.c:6106
+msgid "remove access privileges"
+msgstr "წვდომის უფლებების წაშლა"
+
+#: sql_help.c:6118
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "წინასწარ ორ ფაზაში გადასაცემად მომზადებული ტრანზაქციის გაუქმება"
+
+#: sql_help.c:6124
+msgid "roll back to a savepoint"
+msgstr "შენახვის წერტილზე დაბრუნება"
+
+#: sql_help.c:6130
+msgid "define a new savepoint within the current transaction"
+msgstr "ახალი შესანახი წერტილის აღწერა მიმდინარე ტრანზაქციაში"
+
+#: sql_help.c:6136
+msgid "define or change a security label applied to an object"
+msgstr "ობიექტზე გადატარებული უსაფრთხოების ჭდის აღწერა ან შეცვლა"
+
+#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232
+msgid "retrieve rows from a table or view"
+msgstr "მწკრივის მიღება ცხრილიდან ან ხედიდან"
+
+#: sql_help.c:6154
+msgid "change a run-time parameter"
+msgstr "გაშვების პარამეტრის შეცვლა"
+
+#: sql_help.c:6160
+msgid "set constraint check timing for the current transaction"
+msgstr "მიმდინარე ტრანზაქციის შეზღუდვის შემოწმების დროის დაყენება"
+
+#: sql_help.c:6166
+msgid "set the current user identifier of the current session"
+msgstr "მიმდინარე სესიის მიმდინარე მომხმარებლის იდენტიფიკატორის დაყენება"
+
+#: sql_help.c:6172
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "სესიის მომხმარებლის იდენტიფიკატორისა და მიმდინარე სესიის მიმდინარე მომხმარებლის იდენტიფიკატორის დაყენება"
+
+#: sql_help.c:6178
+msgid "set the characteristics of the current transaction"
+msgstr "მიმდინარე ტრანზაქციის თვისებების დაყენება"
+
+#: sql_help.c:6184
+msgid "show the value of a run-time parameter"
+msgstr "გაშვების პარამეტრის მნიშვნელობის ჩვენება"
+
+#: sql_help.c:6202
+msgid "empty a table or set of tables"
+msgstr "ცხრილის ან ცხრილების სეტის დაცარიელება"
+
+#: sql_help.c:6208
+msgid "stop listening for a notification"
+msgstr "გაფრთხილებების მოსმენის შეწყვეტა"
+
+#: sql_help.c:6214
+msgid "update rows of a table"
+msgstr "ცხრილის მწკრივების განახლება"
+
+#: sql_help.c:6220
+msgid "garbage-collect and optionally analyze a database"
+msgstr "ნაგვის-მოგროვება და ბაზის არასავალდებულო ანალიზი"
+
+#: sql_help.c:6226
+msgid "compute a set of rows"
+msgstr "მწკრივების სეტის გამოთვლა"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 მხოლოდ არაინტერაქტიურ რეჟიმში შეიძლება იყოს გამოყენებული"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "ჟურნალის ფაილის გახსნის შეცდომა \"%s\": %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"დახმარებისთვის აკრიფეთ \"help\".\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "გამოტანის პარამეტრის დაყენების შეცდომა: \"%s\""
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "ბრძანების სტრიქონის დამატებითი არგუმენტი \"%s\" იგნორირებულია"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "საკუთარი პროგრამის გამშვები ფაილის პოვნა შეუძლებელია"
+
+#: tab-complete.c:5955
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"ჩანართის დაბრუნების მოთხოვნის შეცდომა: %s\n"
+"მოთხოვნის ტექსტი:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "მნიშვნელობა \"%s\" \"%s\"-სთვის მიუღებელია: ველოდებოდი ლოგიკურ მნიშვნელობას"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "არასწორი მნიშვნელობა \"%s\" \"%s\"-სთვის (უნდა იყოს მთელი რიცხვი)"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "ცვლადის არასწორი სახელი: \"%s\""
+
+#: variables.c:419
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"\"%s\" არასწორი მნიშვნელობაა \"%s\"-სთვის\n"
+"შესაძლო მნიშვნელობებია: %s."
+
+#, c-format
+#~ msgid "\\watch cannot be used with COPY"
+#~ msgstr "\\watch -ს COPY-სთან ერთად ვერ გამოყენებთ"
+
+#~ msgid "text"
+#~ msgstr "ტექსტი"
+
+#~ msgid "timezone"
+#~ msgstr "დროის_სარტყელი"
+
+#~ msgid "where direction can be empty or one of:"
+#~ msgstr "სადაც direction შეიძლება იყოს ცარიელი, ან ერთ-ერთი სიიდან::"
diff --git a/src/bin/psql/po/ko.po b/src/bin/psql/po/ko.po
new file mode 100644
index 0000000..3521ba6
--- /dev/null
+++ b/src/bin/psql/po/ko.po
@@ -0,0 +1,6597 @@
+# Korean message translation file for psql
+# Ioseph Kim. <ioseph@uri.sarang.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:46+0000\n"
+"PO-Revision-Date: 2023-04-08 00:31+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <kr@postgresql.org>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "상세정보: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "현재 디렉터리가 무엇인지 모르겠음: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "잘못된 바이너리 파일: \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "\"%s\" 바이너리 파일을 읽을 수 없음"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "실행할 \"%s\" 파일 찾을 수 없음"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "\"%s\" 이름의 디렉터리로 이동할 수 없습니다: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "\"%s\" 심볼릭 링크 파일을 읽을 수 없음: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 실패: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "메모리 부족"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null 포인터를 복제할 수 없음(내부 오류)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "UID %ld 해당하는 사용자를 찾을 수 없음: %s"
+
+#: ../../common/username.c:45 command.c:575
+msgid "user does not exist"
+msgstr "사용자 없음"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "사용자 이름 찾기 실패: 오류번호 %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "명령을 실행할 수 없음"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "명령어를 찾을 수 없음"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "하위 프로세스가 %d 코드로 종료했음"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "0x%X 예외처리에 의해 하위 프로세스가 종료되었음"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "하위 프로세스가 %d 신호를 받고 종료되었음: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "하위 프로세스가 알 수 없는 상태(%d)로 종료되었음"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "취소 요청 보냄\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "취소 요청 보내기 실패: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu개 행)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "인트럽트발생\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "테이블 내용에 헤더를 추가할 수 없음: 열 수가 %d개를 초과했습니다.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "테이블 내용에 셀을 추가할 수 없음: 총 셀 수가 %d개를 초과했습니다.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "잘못된 출력 형식 (내부 오류): %d"
+
+#: ../../fe_utils/psqlscan.l:702
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "\"%s\" 변수의 재귀적 확장을 건너뛰는 중"
+
+#: ../../port/thread.c:100 ../../port/thread.c:136
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "UID %d 해당하는 로컬 사용자를 찾을 수 없음: %s"
+
+#: ../../port/thread.c:105 ../../port/thread.c:141
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "ID %d 로컬 사용자 없음"
+
+#: command.c:232
+#, c-format
+msgid "invalid command \\%s"
+msgstr "잘못된 명령: \\%s"
+
+#: command.c:234
+#, c-format
+msgid "Try \\? for help."
+msgstr "도움말을 보려면 \\?를 입력하십시오."
+
+#: command.c:252
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: \"%s\" 추가 인자가 무시되었음"
+
+#: command.c:304
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr ""
+"\\%s 명령은 무시함; 현재 \\if 블록을 중지하려면, \\endif 명령이나 Ctrl-C 키"
+"를 사용하세요."
+
+#: command.c:573
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "UID %ld 사용자의 홈 디렉터리를 찾을 수 없음: %s"
+
+#: command.c:592
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: \"%s\" 디렉터리로 이동할 수 없음: %m"
+
+#: command.c:617
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "현재 데이터베이스에 연결되어있지 않습니다.\n"
+
+#: command.c:627
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" on address \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"접속정보: 데이터베이스=\"%s\", 사용자=\"%s\", 주소=\"%s\", 포트=\"%s\".\n"
+
+#: command.c:630
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"접속정보: 데이터베이스=\"%s\", 사용자=\"%s\", 소켓=\"%s\", 포트=\"%s\".\n"
+
+#: command.c:636
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address "
+"\"%s\") at port \"%s\".\n"
+msgstr ""
+"접속정보: 데이터베이스=\"%s\", 사용자=\"%s\", 호스트=\"%s\" (주소=\"%s\"), 포"
+"트=\"%s\".\n"
+
+#: command.c:639
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port "
+"\"%s\".\n"
+msgstr ""
+"접속정보: 데이터베이스=\"%s\", 사용자=\"%s\", 호스트=\"%s\", 포트=\"%s\".\n"
+
+#: command.c:1030 command.c:1125 command.c:2654
+#, c-format
+msgid "no query buffer"
+msgstr "쿼리 버퍼가 없음"
+
+#: command.c:1063 command.c:5491
+#, c-format
+msgid "invalid line number: %s"
+msgstr "잘못된 줄 번호: %s"
+
+#: command.c:1203
+msgid "No changes"
+msgstr "변경 내용 없음"
+
+#: command.c:1282
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: 잘못된 인코딩 이름 또는 문자셋 변환 프로시저 없음"
+
+#: command.c:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597
+#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100
+#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443
+#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1324
+msgid "There is no previous error."
+msgstr "이전 오류가 없습니다."
+
+#: command.c:1437
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: 오른쪽 괄호 빠졌음"
+
+#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989
+#: command.c:2173 command.c:2415 command.c:2621 command.c:2661
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: 필요한 인자가 빠졌음"
+
+#: command.c:1782
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: \\else 구문 뒤에 올 수 없음"
+
+#: command.c:1787
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: \\if 명령과 짝이 안맞음"
+
+#: command.c:1851
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: \\else 명령 뒤에 올 수 없음"
+
+#: command.c:1856
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: \\if 명령과 짝이 안맞음"
+
+#: command.c:1896
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: \\if 명령과 짝이 안맞음"
+
+#: command.c:2053
+msgid "Query buffer is empty."
+msgstr "쿼리 버퍼가 비었음."
+
+#: command.c:2096
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "\"%s\" 사용자의 새 암호: "
+
+#: command.c:2100
+msgid "Enter it again: "
+msgstr "다시 입력해 주세요:"
+
+#: command.c:2109
+#, c-format
+msgid "Passwords didn't match."
+msgstr "암호가 서로 틀립니다."
+
+#: command.c:2208
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: 변수 값을 읽을 수 없음"
+
+#: command.c:2311
+msgid "Query buffer reset (cleared)."
+msgstr "쿼리 버퍼 초기화 (비웠음)."
+
+#: command.c:2333
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "명령내역(history)을 \"%s\" 파일에 기록했습니다.\n"
+
+#: command.c:2420
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: OS 환경 변수 이름에는 \"=\" 문자가 없어야 함"
+
+#: command.c:2468
+#, c-format
+msgid "function name is required"
+msgstr "함수 이름이 필요함"
+
+#: command.c:2470
+#, c-format
+msgid "view name is required"
+msgstr "뷰 이름이 필요함"
+
+#: command.c:2593
+msgid "Timing is on."
+msgstr "작업수행시간 보임"
+
+#: command.c:2595
+msgid "Timing is off."
+msgstr "작업수행시간 숨김"
+
+#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952
+#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008
+#: command.c:4022 command.c:4049 command.c:4107 common.c:77 copy.c:331
+#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:3107 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "암호: "
+
+#: command.c:3112 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "%s 사용자의 암호: "
+
+#: command.c:3168
+#, c-format
+msgid ""
+"Do not give user, host, or port separately when using a connection string"
+msgstr ""
+"연결 문자열을 사용할 때는 user, host, port 를 따로 따로 지정하지 마세요."
+
+#: command.c:3203
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "재접속할 데이터베이스 연결 정보가 없음"
+
+#: command.c:3511
+#, c-format
+msgid "Previous connection kept"
+msgstr "이전 연결이 유지되었음"
+
+#: command.c:3517
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\연결: %s"
+
+#: command.c:3573
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"접속정보: 데이터베이스=\"%s\", 사용자=\"%s\", 주소=\"%s\", 포트=\"%s\".\n"
+
+#: command.c:3576
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" "
+"at port \"%s\".\n"
+msgstr ""
+"접속정보: 데이터베이스=\"%s\", 사용자=\"%s\", 소켓=\"%s\", 포트=\"%s\".\n"
+
+#: command.c:3582
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" on host \"%s"
+"\" (address \"%s\") at port \"%s\".\n"
+msgstr ""
+"접속정보: 데이터베이스=\"%s\", 사용자=\"%s\", 호스트=\"%s\" (주소 \"%s\"), 포"
+"트=\"%s\".\n"
+
+#: command.c:3585
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"접속정보: 데이터베이스=\"%s\", 사용자=\"%s\", 호스트=\"%s\", 포트=\"%s\".\n"
+
+#: command.c:3590
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "접속정보: 데이터베이스=\"%s\", 사용자=\"%s\".\n"
+
+#: command.c:3630
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s(%s, %s 서버)\n"
+
+#: command.c:3643
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"경고: %s 메이저 버전 %s, 서버 메이저 버전 %s.\n"
+" 일부 psql 기능이 작동하지 않을 수도 있습니다.\n"
+
+#: command.c:3680
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "SSL 연결정보 (프로토콜: %s, 암호화기법: %s, 압축: %s)\n"
+
+#: command.c:3681 command.c:3682
+msgid "unknown"
+msgstr "알수없음"
+
+#: command.c:3683 help.c:42
+msgid "off"
+msgstr "off"
+
+#: command.c:3683 help.c:42
+msgid "on"
+msgstr "on"
+
+#: command.c:3697
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "암호화된 GSSAPI 연결\n"
+
+#: command.c:3717
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"경고: 콘솔 코드 페이지(%u)가 Windows 코드 페이지(%u)와 달라서\n"
+" 8비트 문자가 올바르게 표시되지 않을 수 있습니다. 자세한 내용은 psql "
+"참조\n"
+" 페이지 \"Notes for Windows users\"를 참조하십시오.\n"
+
+#: command.c:3822
+#, c-format
+msgid ""
+"environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a "
+"line number"
+msgstr ""
+"지정한 줄번호를 사용하기 위해서는 PSQL_EDITOR_LINENUMBER_ARG 이름의 OS 환경변"
+"수가 설정되어 있어야 합니다."
+
+#: command.c:3851
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "\"%s\" 문서 편집기를 실행시킬 수 없음"
+
+#: command.c:3853
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "/bin/sh 명령을 실행할 수 없음"
+
+#: command.c:3903
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "임시 디렉터리 경로를 알 수 없음: %s"
+
+#: command.c:3930
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "\"%s\" 임시 파일을 열 수 없음: %m"
+
+#: command.c:4266
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: \"%s\" 생략형이 \"%s\" 또는 \"%s\" 값 모두 선택가능해서 모호함"
+
+#: command.c:4286
+#, c-format
+msgid ""
+"\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-"
+"longtable, troff-ms, unaligned, wrapped"
+msgstr ""
+"\\pset: 허용되는 출력 형식: aligned, asciidoc, csv, html, latex, latex-"
+"longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4305
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: 사용할 수 있는 선 모양은 ascii, old-ascii, unicode"
+
+#: command.c:4320
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: 사용할 수 있는 유니코드 테두리 모양은 single, double"
+
+#: command.c:4335
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: 사용할 수 있는 유니코드 칼럼 선 모양은 single, double"
+
+#: command.c:4350
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: 사용할 수 있는 유니코드 헤더 선 모양은 single, double"
+
+#: command.c:4393
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep 문자는 1바이트의 단일 문자여야 함"
+
+#: command.c:4398
+#, c-format
+msgid ""
+"\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage "
+"return"
+msgstr ""
+"\\pset: csv_fieldsep 문자로 따옴표, 줄바꿈(\\n, \\r) 문자는 사용할 수 없음"
+
+#: command.c:4535 command.c:4723
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: 알 수 없는 옵션: %s"
+
+#: command.c:4555
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "html 테이블의 테두리를 %d로 지정했습니다.\n"
+
+#: command.c:4561
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "대상 너비 미지정.\n"
+
+#: command.c:4563
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "대상 너비는 %d입니다.\n"
+
+#: command.c:4570
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "칼럼 단위 보기 기능 켬.\n"
+
+#: command.c:4572
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "칼럼 단위 보기 기능을 자동으로 지정 함.\n"
+
+#: command.c:4574
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "칼럼 단위 보기 기능 끔.\n"
+
+#: command.c:4580
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "CSV용 필드 구분자: \"%s\".\n"
+
+#: command.c:4588 command.c:4596
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "필드 구분자가 0 바이트입니다.\n"
+
+#: command.c:4590
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "필드 구분자 \"%s\".\n"
+
+#: command.c:4603
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "기본 꼬릿말 보기 기능 켬.\n"
+
+#: command.c:4605
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "기본 꼬릿말 보기 기능 끔.\n"
+
+#: command.c:4611
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "현재 출력 형식: %s.\n"
+
+#: command.c:4617
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "선 모양: %s.\n"
+
+#: command.c:4624
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Null 값은 \"%s\" 문자로 보여짐.\n"
+
+#: command.c:4632
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "로케일 맞춤 숫자 표기 기능 켬.\n"
+
+#: command.c:4634
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "로케일 맞춤 숫자 표기 기능 끔.\n"
+
+#: command.c:4641
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "긴 출력을 위해 페이저가 사용됨.\n"
+
+#: command.c:4643
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "항상 페이저가 사용됨.\n"
+
+#: command.c:4645
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "화면단위 보기 기능 끔(전체 자료 모두 보여줌).\n"
+
+#: command.c:4651
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "%d 줄보다 적은 경우는 페이지 단위 보기가 사용되지 않음\n"
+
+#: command.c:4661 command.c:4671
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "레코드 구분자가 0 바이트임.\n"
+
+#: command.c:4663
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "레코드 구분자는 줄바꿈 문자입니다.\n"
+
+#: command.c:4665
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "레코드 구분자 \"%s\".\n"
+
+#: command.c:4678
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "테이블 속성: \"%s\".\n"
+
+#: command.c:4681
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "테이블 속성 모두 지움.\n"
+
+#: command.c:4688
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "출력 테이블의 제목: \"%s\"\n"
+
+#: command.c:4690
+#, c-format
+msgid "Title is unset.\n"
+msgstr "출력 테이블의 제목을 지정하지 않았습니다.\n"
+
+#: command.c:4697
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "자료만 보기 기능 켬.\n"
+
+#: command.c:4699
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "자료만 보기 기능 끔.\n"
+
+#: command.c:4705
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "유니코드 테두리 선문자: \"%s\".\n"
+
+#: command.c:4711
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "유니코드 칼럼 선문자: \"%s\".\n"
+
+#: command.c:4717
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "유니코드 헤더 선문자: \"%s\".\n"
+
+#: command.c:4950
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: 실패"
+
+#: command.c:4984
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch 명령으로 수행할 쿼리가 없습니다."
+
+#: command.c:5016
+#, c-format
+msgid "could not set timer: %m"
+msgstr "타이머 설정 실패: %m"
+
+#: command.c:5078
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (%g초 간격)\n"
+
+#: command.c:5081
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (%g초 간격)\n"
+
+#: command.c:5142
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "신호를 기다릴 수 없었음: %m"
+
+#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********** 쿼리 **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5386
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" 뷰(view)가 아님"
+
+#: command.c:5402
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "reloptions 배열을 분석할 수 없음"
+
+#: common.c:166
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "현재 접속한 연결 없이는 특수문자처리를 할 수 없음"
+
+#: common.c:207
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "쉘 명령의 인자에 줄바꿈 문자가 있음: \"%s\""
+
+#: common.c:311
+#, c-format
+msgid "connection to server was lost"
+msgstr "서버 접속 끊김"
+
+#: common.c:315
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "서버로부터 연결이 끊어졌습니다. 다시 연결을 시도합니다: "
+
+#: common.c:320
+#, c-format
+msgid "Failed.\n"
+msgstr "실패.\n"
+
+#: common.c:337
+#, c-format
+msgid "Succeeded.\n"
+msgstr "성공.\n"
+
+#: common.c:389 common.c:1001
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "PQresultStatus 반환값이 잘못됨: %d"
+
+#: common.c:511
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "작업시간: %.3f ms\n"
+
+#: common.c:526
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "작업시간: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:535
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "작업시간: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:542
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "작업시간: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:566 common.c:623 common.c:1034 describe.c:6135
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "현재 데이터베이스에 연결되어있지 않습니다."
+
+#: common.c:654
+#, c-format
+msgid ""
+"Asynchronous notification \"%s\" with payload \"%s\" received from server "
+"process with PID %d.\n"
+msgstr "\"%s\" 비동기 통지를 받음, 부가정보: \"%s\", 보낸 프로세스: %d.\n"
+
+#: common.c:657
+#, c-format
+msgid ""
+"Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "동기화 신호 \"%s\" 받음, 해당 서버 프로세스 PID %d.\n"
+
+#: common.c:688
+#, c-format
+msgid "could not print result table: %m"
+msgstr "결과 테이블을 출력할 수 없음: %m"
+
+#: common.c:708
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "\\gset 해당 자료 없음"
+
+#: common.c:713
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "\\gset 실행 결과가 단일 자료가 아님"
+
+#: common.c:731
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr ""
+"\\gset 작업으로 특수하게 처리되는 변수인 \"%s\" 변수값을 바꿀 수 있어 무시함"
+
+#: common.c:1043
+#, c-format
+msgid ""
+"***(Single step mode: verify "
+"command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to "
+"cancel)********************\n"
+msgstr ""
+"***(단독 순차 모드: 쿼리 확인)*********************************************\n"
+"%s\n"
+"***(Enter: 계속 진행, x Enter: 중지)********************\n"
+
+#: common.c:1126
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "명령구문: %s"
+
+#: common.c:1162
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "알 수 없는 트랜잭션 상태 (%d)"
+
+#: common.c:1303 describe.c:2020
+msgid "Column"
+msgstr "필드명"
+
+#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037
+#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021
+#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504
+#: describe.c:5767
+msgid "Type"
+msgstr "형태"
+
+#: common.c:1353
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "해당 명령 결과가 없거나, 그 결과에는 칼럼이 없습니다.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: 인자가 필요함"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: 구문 오류: \"%s\""
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: 줄 끝에 구문 오류"
+
+#: copy.c:328
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "\"%s\" 명령을 실행할 수 없음: %m"
+
+#: copy.c:344
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" 파일의 상태값을 알 수 없음: %m"
+
+#: copy.c:348
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: 디렉터리부터 또는 디렉터리로 복사할 수 없음"
+
+#: copy.c:385
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "외부 명령으로 파이프를 닫을 수 없음: %m"
+
+#: copy.c:390
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: copy.c:453 copy.c:463
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "COPY 자료를 기록할 수 없음: %m"
+
+#: copy.c:469
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "COPY 자료 변환 실패: %s"
+
+#: copy.c:530
+msgid "canceled by user"
+msgstr "사용자에 의해서 취소됨"
+
+#: copy.c:541
+msgid ""
+"Enter data to be copied followed by a newline.\n"
+"End with a backslash and a period on a line by itself, or an EOF signal."
+msgstr ""
+"한 줄에 한 레코드씩 데이터를 입력하고\n"
+"자료입력이 끝나면 backslash 점 (\\.) 마지막 줄 처음에 입력하는 EOF 시그널을 "
+"보내세요."
+
+#: copy.c:684
+msgid "aborted because of read failure"
+msgstr "읽기 실패로 중지됨"
+
+#: copy.c:718
+msgid "trying to exit copy mode"
+msgstr "복사 모드를 종료하는 중"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: 구문 결과가 집합을 반환하지 않았음"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: 쿼리 결과는 적어도 세 개의 칼럼은 반환 해야 함"
+
+#: crosstabview.c:156
+#, c-format
+msgid ""
+"\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: 행과 열의 칼럼이 각각 다른 칼럼이어야 함"
+
+#: crosstabview.c:172
+#, c-format
+msgid ""
+"\\crosstabview: data column must be specified when query returns more than "
+"three columns"
+msgstr ""
+"\\crosstabview: 처리할 칼럼이 세개보다 많을 때는 자료로 사용할 칼럼을 지정해"
+"야 함"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: 최대 칼럼 수 (%d) 초과"
+
+#: crosstabview.c:397
+#, c-format
+msgid ""
+"\\crosstabview: query result contains multiple data values for row \"%s\", "
+"column \"%s\""
+msgstr ""
+"\\crosstabview: \"%s\" 로우, \"%s\" 칼럼에 대해 쿼리 결과는 다중값이어야 함"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: %d 번째 열은 1..%d 범위를 벗어났음"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: 칼럼 이름이 모호함: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: 칼럼 이름 없음: \"%s\""
+
+#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029
+#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090
+#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866
+#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420
+#: describe.c:5477 describe.c:5881 describe.c:5959
+msgid "Schema"
+msgstr "스키마"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636
+#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258
+#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341
+#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867
+#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410
+#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748
+#: describe.c:5957 describe.c:6186 describe.c:6494
+msgid "Name"
+msgstr "이름"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "반환 자료형"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "인자 자료형"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423
+#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041
+#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280
+#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777
+#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248
+#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422
+#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895
+#: describe.c:5960 describe.c:6992
+msgid "Description"
+msgstr "설명"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "통계 함수 목록"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "서버(%s 버전)에서 접근 방법을 지원하지 않습니다."
+
+#: describe.c:168
+msgid "Index"
+msgstr "인덱스"
+
+#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882
+msgid "Table"
+msgstr "테이블"
+
+#: describe.c:177 describe.c:5679
+msgid "Handler"
+msgstr "핸들러"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "접근 방법 목록"
+
+#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181
+#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588
+#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187
+#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718
+#: describe.c:6980
+msgid "Owner"
+msgstr "소유주"
+
+#: describe.c:231
+msgid "Location"
+msgstr "위치"
+
+#: describe.c:241 describe.c:3509
+msgid "Options"
+msgstr "옵션"
+
+#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934
+msgid "Size"
+msgstr "크기"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "테이블스페이스 목록"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df 명령은 [anptwS+]만 추가로 사용함"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df 명령은 \"%c\" 옵션을 %s 버전 서버에서는 사용할 수 없음"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "집계"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "창"
+
+#: describe.c:356
+msgid "proc"
+msgstr "proc"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "함수"
+
+#: describe.c:374 describe.c:1390
+msgid "trigger"
+msgstr "트리거"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "immutable"
+
+#: describe.c:387
+msgid "stable"
+msgstr "stable"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "volatile"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "휘발성"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "엄격함"
+
+#: describe.c:398
+msgid "safe"
+msgstr "safe"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "unsafe"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "병렬처리"
+
+#: describe.c:405
+msgid "definer"
+msgstr "definer"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "invoker"
+
+#: describe.c:407
+msgid "Security"
+msgstr "보안"
+
+#: describe.c:412
+msgid "Language"
+msgstr "언어"
+
+#: describe.c:416 describe.c:420
+msgid "Source code"
+msgstr "소스 코드"
+
+#: describe.c:594
+msgid "List of functions"
+msgstr "함수 목록"
+
+#: describe.c:657
+msgid "Internal name"
+msgstr "내부 이름"
+
+#: describe.c:659
+msgid "Elements"
+msgstr "요소"
+
+#: describe.c:711
+msgid "List of data types"
+msgstr "자료형 목록"
+
+#: describe.c:814
+msgid "Left arg type"
+msgstr "왼쪽 인수 자료형"
+
+#: describe.c:815
+msgid "Right arg type"
+msgstr "오른쪽 인수 자료형"
+
+#: describe.c:816
+msgid "Result type"
+msgstr "반환 자료형"
+
+#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247
+#: describe.c:6909 describe.c:6913
+msgid "Function"
+msgstr "함수"
+
+#: describe.c:902
+msgid "List of operators"
+msgstr "연산자 목록"
+
+#: describe.c:938
+msgid "Encoding"
+msgstr "인코딩"
+
+#: describe.c:939 describe.c:4868
+msgid "Collate"
+msgstr "Collate"
+
+#: describe.c:940 describe.c:4869
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878
+msgid "ICU Locale"
+msgstr "ICU 로케일"
+
+#: describe.c:946 describe.c:952
+msgid "Locale Provider"
+msgstr "로케일 제공자"
+
+#: describe.c:964
+msgid "Tablespace"
+msgstr "테이블스페이스"
+
+#: describe.c:990
+msgid "List of databases"
+msgstr "데이터베이스 목록"
+
+#: describe.c:1031 describe.c:1184 describe.c:3882
+msgid "table"
+msgstr "테이블"
+
+#: describe.c:1032 describe.c:3883
+msgid "view"
+msgstr "뷰(view)"
+
+#: describe.c:1033 describe.c:3884
+msgid "materialized view"
+msgstr "구체화된 뷰"
+
+#: describe.c:1034 describe.c:1186 describe.c:3886
+msgid "sequence"
+msgstr "시퀀스"
+
+#: describe.c:1035 describe.c:3888
+msgid "foreign table"
+msgstr "외부 테이블"
+
+#: describe.c:1036 describe.c:3889 describe.c:4101
+msgid "partitioned table"
+msgstr "파티션 테이블"
+
+#: describe.c:1047
+msgid "Column privileges"
+msgstr "칼럼 접근권한"
+
+#: describe.c:1078 describe.c:1112
+msgid "Policies"
+msgstr "정책"
+
+#: describe.c:1143 describe.c:4510 describe.c:6577
+msgid "Access privileges"
+msgstr "액세스 권한"
+
+#: describe.c:1188
+msgid "function"
+msgstr "함수"
+
+#: describe.c:1190
+msgid "type"
+msgstr "type"
+
+#: describe.c:1192
+msgid "schema"
+msgstr "스키마"
+
+#: describe.c:1215
+msgid "Default access privileges"
+msgstr "기본 접근권한"
+
+#: describe.c:1259
+msgid "Object"
+msgstr "개체"
+
+#: describe.c:1273
+msgid "table constraint"
+msgstr "테이블 제약 조건"
+
+#: describe.c:1297
+msgid "domain constraint"
+msgstr "도메인 제약조건"
+
+#: describe.c:1321
+msgid "operator class"
+msgstr "연산자 클래스"
+
+#: describe.c:1345
+msgid "operator family"
+msgstr "연산자 부류"
+
+#: describe.c:1368
+msgid "rule"
+msgstr "룰(rule)"
+
+#: describe.c:1414
+msgid "Object descriptions"
+msgstr "개체 설명"
+
+#: describe.c:1479 describe.c:4007
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "\"%s\" 이름을 릴레이션(relation) 없음."
+
+#: describe.c:1482 describe.c:4010
+#, c-format
+msgid "Did not find any relations."
+msgstr "관련 릴레이션 찾을 수 없음."
+
+#: describe.c:1678
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "%s oid의 어떤 릴레이션(relation)도 찾을 수 없음."
+
+#: describe.c:1726 describe.c:1750
+msgid "Start"
+msgstr "시작"
+
+#: describe.c:1727 describe.c:1751
+msgid "Minimum"
+msgstr "최소값"
+
+#: describe.c:1728 describe.c:1752
+msgid "Maximum"
+msgstr "최대값"
+
+#: describe.c:1729 describe.c:1753
+msgid "Increment"
+msgstr "증가값"
+
+#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426
+#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620
+msgid "yes"
+msgstr "예"
+
+#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426
+#: describe.c:4768 describe.c:4892 describe.c:6621
+msgid "no"
+msgstr "아니오"
+
+#: describe.c:1732 describe.c:1756
+msgid "Cycles?"
+msgstr "순환?"
+
+#: describe.c:1733 describe.c:1757
+msgid "Cache"
+msgstr "캐쉬"
+
+#: describe.c:1798
+#, c-format
+msgid "Owned by: %s"
+msgstr "소유주: %s"
+
+#: describe.c:1802
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "식별 칼럼용 시퀀스: %s"
+
+#: describe.c:1810
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "\"%s.%s\" 로그 미사용 시퀀스"
+
+#: describe.c:1813
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "\"%s.%s\" 시퀀스"
+
+#: describe.c:1957
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "로그 미사용 테이블 \"%s.%s\""
+
+#: describe.c:1960
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "\"%s.%s\" 테이블"
+
+#: describe.c:1964
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "\"%s.%s\" 뷰(view)"
+
+#: describe.c:1969
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "트랜잭션 로그를 남기지 않은 구체화된 뷰 \"%s.%s\""
+
+#: describe.c:1972
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Materialized 뷰 \"%s.%s\""
+
+#: describe.c:1977
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "\"%s.%s\" 로그 미사용 인덱스"
+
+#: describe.c:1980
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "\"%s.%s\" 인덱스"
+
+#: describe.c:1985
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "\"%s.%s\" 로그 미사용 파티션 인덱스"
+
+#: describe.c:1988
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "\"%s.%s\" 파티션 인덱스"
+
+#: describe.c:1992
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "\"%s.%s\" TOAST 테이블"
+
+#: describe.c:1996
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "\"%s.%s\" 복합자료형"
+
+#: describe.c:2000
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "\"%s.%s\" 외부 테이블"
+
+#: describe.c:2005
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "로그 미사용 파티션 테이블 \"%s.%s\""
+
+#: describe.c:2008
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "\"%s.%s\" 파티션 테이블"
+
+#: describe.c:2024 describe.c:4343
+msgid "Collation"
+msgstr "정렬규칙"
+
+#: describe.c:2025 describe.c:4344
+msgid "Nullable"
+msgstr "NULL허용"
+
+#: describe.c:2026 describe.c:4345
+msgid "Default"
+msgstr "초기값"
+
+#: describe.c:2029
+msgid "Key?"
+msgstr "Key?"
+
+#: describe.c:2031 describe.c:4665 describe.c:4676
+msgid "Definition"
+msgstr "정의"
+
+#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835
+#: describe.c:5894
+msgid "FDW options"
+msgstr "FDW 옵션"
+
+#: describe.c:2035
+msgid "Storage"
+msgstr "스토리지"
+
+#: describe.c:2037
+msgid "Compression"
+msgstr "압축"
+
+#: describe.c:2039
+msgid "Stats target"
+msgstr "통계수집량"
+
+#: describe.c:2175
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "소속 파티션: %s %s%s"
+
+#: describe.c:2188
+msgid "No partition constraint"
+msgstr "파티션 제약 조건 없음"
+
+#: describe.c:2190
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "파티션 제약조건: %s"
+
+#: describe.c:2214
+#, c-format
+msgid "Partition key: %s"
+msgstr "파티션 키: %s"
+
+#: describe.c:2240
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "소속 테이블: \"%s.%s\""
+
+#: describe.c:2309
+msgid "primary key, "
+msgstr "기본키, "
+
+#: describe.c:2312
+msgid "unique"
+msgstr "고유"
+
+#: describe.c:2314
+msgid " nulls not distinct"
+msgstr " nulls not distinct"
+
+#: describe.c:2315
+msgid ", "
+msgstr ", "
+
+#: describe.c:2322
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "적용테이블: \"%s.%s\""
+
+#: describe.c:2326
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", predicate (%s)"
+
+#: describe.c:2329
+msgid ", clustered"
+msgstr ", 클러스됨"
+
+#: describe.c:2332
+msgid ", invalid"
+msgstr ", 잘못됨"
+
+#: describe.c:2335
+msgid ", deferrable"
+msgstr ", 지연가능"
+
+#: describe.c:2338
+msgid ", initially deferred"
+msgstr ", 트랜잭션단위지연"
+
+#: describe.c:2341
+msgid ", replica identity"
+msgstr ", 복제 식별자"
+
+#: describe.c:2395
+msgid "Indexes:"
+msgstr "인덱스들:"
+
+#: describe.c:2478
+msgid "Check constraints:"
+msgstr "체크 제약 조건:"
+
+#: describe.c:2546
+msgid "Foreign-key constraints:"
+msgstr "참조키 제약 조건:"
+
+#: describe.c:2609
+msgid "Referenced by:"
+msgstr "다음에서 참조됨:"
+
+#: describe.c:2659
+msgid "Policies:"
+msgstr "정책:"
+
+#: describe.c:2662
+msgid "Policies (forced row security enabled):"
+msgstr "정책 (로우단위 보안정책 강제 활성화):"
+
+#: describe.c:2665
+msgid "Policies (row security enabled): (none)"
+msgstr "정책 (로우단위 보안정책 활성화): (없음)"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled): (none)"
+msgstr "정책 (로우단위 보안정책 강제 활성화): (없음)"
+
+#: describe.c:2671
+msgid "Policies (row security disabled):"
+msgstr "정책 (로우단위 보안정책 비활성화):"
+
+#: describe.c:2731 describe.c:2835
+msgid "Statistics objects:"
+msgstr "통계정보 객체:"
+
+#: describe.c:2937 describe.c:3090
+msgid "Rules:"
+msgstr "룰(rule)들:"
+
+#: describe.c:2940
+msgid "Disabled rules:"
+msgstr "사용중지된 규칙:"
+
+#: describe.c:2943
+msgid "Rules firing always:"
+msgstr "항상 발생하는 규칙:"
+
+#: describe.c:2946
+msgid "Rules firing on replica only:"
+msgstr "복제본에서만 발생하는 규칙:"
+
+#: describe.c:3025 describe.c:5030
+msgid "Publications:"
+msgstr "발행자:"
+
+#: describe.c:3073
+msgid "View definition:"
+msgstr "뷰 정의:"
+
+#: describe.c:3236
+msgid "Triggers:"
+msgstr "트리거들:"
+
+#: describe.c:3239
+msgid "Disabled user triggers:"
+msgstr "사용중지된 사용자 트리거:"
+
+#: describe.c:3242
+msgid "Disabled internal triggers:"
+msgstr "사용중지된 내부 트리거:"
+
+#: describe.c:3245
+msgid "Triggers firing always:"
+msgstr "항상 발생하는 트리거:"
+
+#: describe.c:3248
+msgid "Triggers firing on replica only:"
+msgstr "복제본에서만 발생하는 트리거:"
+
+#: describe.c:3319
+#, c-format
+msgid "Server: %s"
+msgstr "서버: %s"
+
+#: describe.c:3327
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW 옵션들: (%s)"
+
+#: describe.c:3348
+msgid "Inherits"
+msgstr "상속"
+
+#: describe.c:3413
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "파티션 테이블 수: %d"
+
+#: describe.c:3422
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "파티션 테이블 수: %d (\\d+ 명령으로 볼 수 있음)"
+
+#: describe.c:3424
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "하위 테이블 수: %d (\\d+ 명령으로 볼 수 있음)"
+
+#: describe.c:3431
+msgid "Child tables"
+msgstr "하위 테이블"
+
+#: describe.c:3431
+msgid "Partitions"
+msgstr "파티션들"
+
+#: describe.c:3462
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "자료형의 typed 테이블: %s"
+
+#: describe.c:3478
+msgid "Replica Identity"
+msgstr "복제 식별자"
+
+#: describe.c:3491
+msgid "Has OIDs: yes"
+msgstr "OID 사용: yes"
+
+#: describe.c:3500
+#, c-format
+msgid "Access method: %s"
+msgstr "접근 방법: %s"
+
+#: describe.c:3579
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "테이블스페이스: \"%s\""
+
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:3591
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", \"%s\" 테이블스페이스"
+
+#: describe.c:3668
+msgid "List of roles"
+msgstr "롤 목록"
+
+#: describe.c:3670
+msgid "Role name"
+msgstr "롤 이름"
+
+#: describe.c:3671
+msgid "Attributes"
+msgstr "속성"
+
+#: describe.c:3673
+msgid "Member of"
+msgstr "소속 그룹:"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "슈퍼유저"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "상속 없음"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "롤 만들기"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "DB 만들기"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "로그인할 수 없음"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "복제"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "RLS 통과"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "연결 없음"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d개 연결"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "비밀번호 만료기한: "
+
+#: describe.c:3777
+msgid "Role"
+msgstr "롤"
+
+#: describe.c:3778
+msgid "Database"
+msgstr "데이터베이스"
+
+#: describe.c:3779
+msgid "Settings"
+msgstr "설정"
+
+#: describe.c:3803
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "\"%s\" 롤과 \"%s\" 데이터베이스에 대한 특정 설정이 없습니다."
+
+#: describe.c:3806
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "\"%s\" 롤용 특정 설정이 없음."
+
+#: describe.c:3809
+#, c-format
+msgid "Did not find any settings."
+msgstr "추가 설정 없음."
+
+#: describe.c:3814
+msgid "List of settings"
+msgstr "설정 목록"
+
+#: describe.c:3885
+msgid "index"
+msgstr "인덱스"
+
+#: describe.c:3887
+msgid "TOAST table"
+msgstr "TOAST 테이블"
+
+#: describe.c:3890 describe.c:4102
+msgid "partitioned index"
+msgstr "파티션_인덱스"
+
+#: describe.c:3910
+msgid "permanent"
+msgstr "영구"
+
+#: describe.c:3911
+msgid "temporary"
+msgstr "임시"
+
+#: describe.c:3912
+msgid "unlogged"
+msgstr "로깅안함"
+
+#: describe.c:3913
+msgid "Persistence"
+msgstr "지속성"
+
+#: describe.c:3929
+msgid "Access method"
+msgstr "접근 방법"
+
+#: describe.c:4015
+msgid "List of relations"
+msgstr "릴레이션 목록"
+
+#: describe.c:4063
+#, c-format
+msgid ""
+"The server (version %s) does not support declarative table partitioning."
+msgstr "이 서버(%s 버전)는 파티션 테이블 기능을 지원하지 않습니다."
+
+#: describe.c:4074
+msgid "List of partitioned indexes"
+msgstr "파티션 인덱스 목록"
+
+#: describe.c:4076
+msgid "List of partitioned tables"
+msgstr "파티션 테이블 목록"
+
+#: describe.c:4080
+msgid "List of partitioned relations"
+msgstr "파티션 릴레이션(relation) 목록"
+
+#: describe.c:4111
+msgid "Parent name"
+msgstr "상위 이름"
+
+#: describe.c:4124
+msgid "Leaf partition size"
+msgstr "하위 파티션 크기"
+
+#: describe.c:4127 describe.c:4133
+msgid "Total size"
+msgstr "전체 크기"
+
+#: describe.c:4258
+msgid "Trusted"
+msgstr "신뢰됨"
+
+#: describe.c:4267
+msgid "Internal language"
+msgstr "내부 언어"
+
+#: describe.c:4268
+msgid "Call handler"
+msgstr "호출 핸들러"
+
+#: describe.c:4269 describe.c:5680
+msgid "Validator"
+msgstr "유효성 검사기"
+
+#: describe.c:4270
+msgid "Inline handler"
+msgstr "인라인 핸들러"
+
+#: describe.c:4305
+msgid "List of languages"
+msgstr "언어 목록"
+
+#: describe.c:4346
+msgid "Check"
+msgstr "체크"
+
+#: describe.c:4390
+msgid "List of domains"
+msgstr "도메인(domain) 목록"
+
+#: describe.c:4424
+msgid "Source"
+msgstr "소스"
+
+#: describe.c:4425
+msgid "Destination"
+msgstr "설명"
+
+#: describe.c:4427 describe.c:6622
+msgid "Default?"
+msgstr "초기값?"
+
+#: describe.c:4469
+msgid "List of conversions"
+msgstr "문자코드변환규칙(conversion) 목록"
+
+#: describe.c:4497
+msgid "Parameter"
+msgstr "매개변수"
+
+#: describe.c:4498
+msgid "Value"
+msgstr "값"
+
+#: describe.c:4505
+msgid "Context"
+msgstr "컨텍스트"
+
+#: describe.c:4538
+msgid "List of configuration parameters"
+msgstr "환경설정 매개변수 목록"
+
+#: describe.c:4540
+msgid "List of non-default configuration parameters"
+msgstr "기본값이 아닌 값으로 지정된 환경설정 매개변수 목록"
+
+#: describe.c:4567
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "이 서버(%s 버전)는 이벤트 트리거를 지원하지 않습니다."
+
+#: describe.c:4587
+msgid "Event"
+msgstr "이벤트"
+
+#: describe.c:4589
+msgid "enabled"
+msgstr "활성화"
+
+#: describe.c:4590
+msgid "replica"
+msgstr "replica"
+
+#: describe.c:4591
+msgid "always"
+msgstr "항상"
+
+#: describe.c:4592
+msgid "disabled"
+msgstr "비활성화"
+
+#: describe.c:4593 describe.c:6496
+msgid "Enabled"
+msgstr "활성화"
+
+#: describe.c:4595
+msgid "Tags"
+msgstr "태그"
+
+#: describe.c:4619
+msgid "List of event triggers"
+msgstr "이벤트 트리거 목록"
+
+#: describe.c:4646
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "이 서버(%s 버전)에서 확장 통계정보를 지원하지 않습니다."
+
+#: describe.c:4683
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4684
+msgid "Dependencies"
+msgstr "Dependencies"
+
+#: describe.c:4694
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4718
+msgid "List of extended statistics"
+msgstr "확장 통계정보 목록"
+
+#: describe.c:4745
+msgid "Source type"
+msgstr "Source 자료형"
+
+#: describe.c:4746
+msgid "Target type"
+msgstr "Target 자료형"
+
+#: describe.c:4770
+msgid "in assignment"
+msgstr "in assignment"
+
+#: describe.c:4772
+msgid "Implicit?"
+msgstr "Implicit?"
+
+#: describe.c:4831
+msgid "List of casts"
+msgstr "형변환자 목록"
+
+#: describe.c:4883 describe.c:4887
+msgid "Provider"
+msgstr "제공자"
+
+#: describe.c:4893 describe.c:4898
+msgid "Deterministic?"
+msgstr "Deterministic?"
+
+#: describe.c:4938
+msgid "List of collations"
+msgstr "문자 정렬 목록"
+
+#: describe.c:5000
+msgid "List of schemas"
+msgstr "스키마 목록"
+
+#: describe.c:5117
+msgid "List of text search parsers"
+msgstr "텍스트 검색 파서 목록"
+
+#: describe.c:5167
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "\"%s\"(이)라는 전문 검색 분석기를 찾지 못했습니다."
+
+#: describe.c:5170
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "특정 전문 검색 분석기를 찾지 못했습니다."
+
+#: describe.c:5245
+msgid "Start parse"
+msgstr "구문 분석 시작"
+
+#: describe.c:5246
+msgid "Method"
+msgstr "방법"
+
+#: describe.c:5250
+msgid "Get next token"
+msgstr "다음 토큰 가져오기"
+
+#: describe.c:5252
+msgid "End parse"
+msgstr "구문 분석 종료"
+
+#: describe.c:5254
+msgid "Get headline"
+msgstr "헤드라인 가져오기"
+
+#: describe.c:5256
+msgid "Get token types"
+msgstr "토큰 형식 가져오기"
+
+#: describe.c:5267
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "\"%s.%s\" 텍스트 검색 파서"
+
+#: describe.c:5270
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "\"%s\" 텍스트 검색 파서"
+
+#: describe.c:5289
+msgid "Token name"
+msgstr "토큰 이름"
+
+#: describe.c:5303
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "\"%s.%s\" 파서의 토큰 형식"
+
+#: describe.c:5306
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "\"%s\" 파서의 토큰 형식"
+
+#: describe.c:5350
+msgid "Template"
+msgstr "템플릿"
+
+#: describe.c:5351
+msgid "Init options"
+msgstr "초기화 옵션"
+
+#: describe.c:5378
+msgid "List of text search dictionaries"
+msgstr "텍스트 검색 사전 목록"
+
+#: describe.c:5411
+msgid "Init"
+msgstr "초기화"
+
+#: describe.c:5412
+msgid "Lexize"
+msgstr "Lexize"
+
+#: describe.c:5444
+msgid "List of text search templates"
+msgstr "텍스트 검색 템플릿 목록"
+
+#: describe.c:5499
+msgid "List of text search configurations"
+msgstr "텍스트 검색 구성 목록"
+
+#: describe.c:5550
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "\"%s\"(이)라는 텍스트 검색 구성을 찾지 못했습니다."
+
+#: describe.c:5553
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "특정 텍스트 검색 구성을 찾지 못했습니다."
+
+#: describe.c:5619
+msgid "Token"
+msgstr "토큰"
+
+#: describe.c:5620
+msgid "Dictionaries"
+msgstr "사전"
+
+#: describe.c:5631
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "텍스트 검색 구성 \"%s.%s\""
+
+#: describe.c:5634
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "텍스트 검색 구성 \"%s\""
+
+#: describe.c:5638
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"파서: \"%s.%s\""
+
+#: describe.c:5641
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"파서: \"%s\""
+
+#: describe.c:5722
+msgid "List of foreign-data wrappers"
+msgstr "외부 데이터 래퍼 목록"
+
+#: describe.c:5750
+msgid "Foreign-data wrapper"
+msgstr "외부 데이터 래퍼"
+
+#: describe.c:5768 describe.c:5958
+msgid "Version"
+msgstr "버전"
+
+#: describe.c:5799
+msgid "List of foreign servers"
+msgstr "외부 서버 목록"
+
+#: describe.c:5824 describe.c:5883
+msgid "Server"
+msgstr "서버"
+
+#: describe.c:5825
+msgid "User name"
+msgstr "사용자 이름"
+
+#: describe.c:5855
+msgid "List of user mappings"
+msgstr "사용자 매핑 목록"
+
+#: describe.c:5928
+msgid "List of foreign tables"
+msgstr "외부 테이블 목록"
+
+#: describe.c:5980
+msgid "List of installed extensions"
+msgstr "설치된 확장기능 목록"
+
+#: describe.c:6028
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "\"%s\" 이름의 확장 기능 모듈을 찾을 수 없습니다."
+
+#: describe.c:6031
+#, c-format
+msgid "Did not find any extensions."
+msgstr "추가할 확장 기능 모듈이 없음."
+
+#: describe.c:6075
+msgid "Object description"
+msgstr "개체 설명"
+
+#: describe.c:6085
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "\"%s\" 확장 기능 안에 포함된 객체들"
+
+#: describe.c:6126
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "적당하지 않은 qualified 이름 입니다 (너무 많은 점이 있네요): %s"
+
+#: describe.c:6140
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "서로 다른 데이터베이스간의 참조는 구현되어있지 않습니다: %s"
+
+#: describe.c:6171 describe.c:6298
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "이 서버(%s 버전)는 논리 복제 발행 기능을 지원하지 않습니다."
+
+#: describe.c:6188 describe.c:6376
+msgid "All tables"
+msgstr "모든 테이블"
+
+#: describe.c:6189 describe.c:6377
+msgid "Inserts"
+msgstr "Inserts"
+
+#: describe.c:6190 describe.c:6378
+msgid "Updates"
+msgstr "Updates"
+
+#: describe.c:6191 describe.c:6379
+msgid "Deletes"
+msgstr "Deletes"
+
+#: describe.c:6195 describe.c:6381
+msgid "Truncates"
+msgstr "Truncates"
+
+#: describe.c:6199 describe.c:6383
+msgid "Via root"
+msgstr "Via root"
+
+#: describe.c:6221
+msgid "List of publications"
+msgstr "발행 목록"
+
+#: describe.c:6345
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "\"%s\" 이름의 발행 없음."
+
+#: describe.c:6348
+#, c-format
+msgid "Did not find any publications."
+msgstr "발행 없음."
+
+#: describe.c:6372
+#, c-format
+msgid "Publication %s"
+msgstr "%s 발행"
+
+#: describe.c:6425
+msgid "Tables:"
+msgstr "테이블들:"
+
+#: describe.c:6437
+msgid "Tables from schemas:"
+msgstr "다음 스키마의 모든 테이블:"
+
+#: describe.c:6481
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "이 서버(%s 버전)는 구독 기능을 지원하지 않습니다."
+
+#: describe.c:6497
+msgid "Publication"
+msgstr "발행"
+
+#: describe.c:6506
+msgid "Binary"
+msgstr "바이너리"
+
+#: describe.c:6507
+msgid "Streaming"
+msgstr "스트리밍"
+
+#: describe.c:6514
+msgid "Two-phase commit"
+msgstr "2단계 커밋"
+
+#: describe.c:6515
+msgid "Disable on error"
+msgstr "오류가 생기면 비활성"
+
+#: describe.c:6520
+msgid "Synchronous commit"
+msgstr "동기식 커밋"
+
+#: describe.c:6521
+msgid "Conninfo"
+msgstr "연결정보"
+
+#: describe.c:6527
+msgid "Skip LSN"
+msgstr "LSN 건너뜀"
+
+#: describe.c:6554
+msgid "List of subscriptions"
+msgstr "구독 목록"
+
+#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6617
+msgid "Input type"
+msgstr "입력 자료형"
+
+#: describe.c:6618
+msgid "Storage type"
+msgstr "스토리지 유형"
+
+#: describe.c:6619
+msgid "Operator class"
+msgstr "연산자 클래스"
+
+#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901
+msgid "Operator family"
+msgstr "연산자 부류"
+
+#: describe.c:6667
+msgid "List of operator classes"
+msgstr "연산자 클래스 목록"
+
+#: describe.c:6714
+msgid "Applicable types"
+msgstr "Applicable types"
+
+#: describe.c:6756
+msgid "List of operator families"
+msgstr "연산자 부류 목록"
+
+#: describe.c:6807
+msgid "Operator"
+msgstr "연산자"
+
+#: describe.c:6808
+msgid "Strategy"
+msgstr "전략번호"
+
+#: describe.c:6809
+msgid "ordering"
+msgstr "ordering"
+
+#: describe.c:6810
+msgid "search"
+msgstr "search"
+
+#: describe.c:6811
+msgid "Purpose"
+msgstr "Purpose"
+
+#: describe.c:6816
+msgid "Sort opfamily"
+msgstr "정렬 연산자 부류"
+
+#: describe.c:6855
+msgid "List of operators of operator families"
+msgstr "연산자 부류 소속 연산자 목록"
+
+#: describe.c:6902
+msgid "Registered left type"
+msgstr "등록된 왼쪽 자료형"
+
+#: describe.c:6903
+msgid "Registered right type"
+msgstr "등록된 오른쪽 자료형"
+
+#: describe.c:6904
+msgid "Number"
+msgstr "번호"
+
+#: describe.c:6948
+msgid "List of support functions of operator families"
+msgstr "연산자 부류 소속 지원 함수 목록"
+
+#: describe.c:6979
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7000
+msgid "Large objects"
+msgstr "대형 객체들"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql은 PostgreSQL 대화식 터미널입니다.\n"
+"\n"
+
+#: help.c:76 help.c:393 help.c:473 help.c:516
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "일반 옵션:\n"
+
+#: help.c:84
+msgid ""
+" -c, --command=COMMAND run only single command (SQL or internal) and "
+"exit\n"
+msgstr ""
+" -c, --command=COMMAND 하나의 명령(SQL 또는 내부 명령)만 실행하고 끝냄\n"
+
+#: help.c:85
+#, c-format
+msgid ""
+" -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=DBNAME 연결할 데이터베이스 이름(기본 값: \"%s\")\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=FILENAME 파일 안에 지정한 명령을 실행하고 끝냄\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr ""
+" -l, --list 사용 가능한 데이터베이스 목록을 표시하고 끝냄\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" psql 변수 NAME을 VALUE로 설정\n"
+" (예, -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc 시작 파일(~/.psqlrc)을 읽지 않음\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-"
+"interactive)\n"
+msgstr ""
+" -1 (\"one\"), --single-transaction\n"
+" 명령 파일을 하나의 트랜잭션으로 실행\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] 이 도움말을 표시하고 종료\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr ""
+" --help=commands psql 내장명령어(\\문자로 시작하는)를 표시하고 종"
+"료\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables 특별 변수들 보여주고, 종료\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"입출력 옵션:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all 스크립트의 모든 입력 표시\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors 실패한 명령들 출력\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries 서버로 보낸 명령 표시\n"
+
+#: help.c:104
+msgid ""
+" -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden 내부 명령이 생성하는 쿼리 표시\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=FILENAME 세션 로그를 파일로 보냄\n"
+
+#: help.c:106
+msgid ""
+" -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr ""
+" -n, --no-readline 확장된 명령행 편집 기능을 사용중지함(readline)\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=FILENAME 쿼리 결과를 파일(또는 |파이프)로 보냄\n"
+
+#: help.c:108
+msgid ""
+" -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet 자동 실행(메시지 없이 쿼리 결과만 표시)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step 단독 순차 모드(각 쿼리 확인)\n"
+
+#: help.c:110
+msgid ""
+" -S, --single-line single-line mode (end of line terminates SQL "
+"command)\n"
+msgstr " -S, --single-line 한 줄 모드(줄 끝에서 SQL 명령이 종료됨)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"출력 형식 옵션:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align 정렬되지 않은 표 형태의 출력 모드\n"
+
+#: help.c:114
+msgid ""
+" --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv CSV (쉼표-분리 자료) 테이블 출력 모드\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: "
+"\"%s\")\n"
+msgstr ""
+" -F, --field-separator=STRING\n"
+" unaligned 출력용 필드 구분자 설정(기본 값: \"%s"
+"\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html HTML 표 형태 출력 모드\n"
+
+#: help.c:119
+msgid ""
+" -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset "
+"command)\n"
+msgstr ""
+" -P, --pset=VAR[=ARG] 인쇄 옵션 VAR을 ARG로 설정(\\pset 명령 참조)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: "
+"newline)\n"
+msgstr ""
+" -R, --record-separator=STRING\n"
+" unaligned 출력용 레코드 구분자 설정\n"
+" (기본 값: 줄바꿈 문자)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only 행만 인쇄\n"
+
+#: help.c:123
+msgid ""
+" -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, "
+"border)\n"
+msgstr ""
+" -T, --table-attr=TEXT HTML table 태그 속성 설정(예: width, border)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded 확장된 표 형태로 출력\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero "
+"byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" unaligned 출력용 필드 구분자를 0 바이트로 지정\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero "
+"byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" unaligned 출력용 레코드 구분자를 0 바이트로 지정\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"연결 옵션들:\n"
+
+#: help.c:133
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory "
+"(default: \"%s\")\n"
+msgstr ""
+" -h, --host=HOSTNAME 데이터베이스 서버 호스트 또는 소켓 디렉터리\n"
+" (기본값: \"%s\")\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "로컬 소켓"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT 데이터베이스 서버 포트(기본 값: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=USERNAME 데이터베이스 사용자 이름(기본 값: \"%s\")\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 암호 프롬프트 표시 안 함\n"
+
+#: help.c:143
+msgid ""
+" -W, --password force password prompt (should happen "
+"automatically)\n"
+msgstr " -W, --password 암호 입력 프롬프트 보임(자동으로 처리함)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help"
+"\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"자세한 내용을 보려면 psql 내에서 \"\\?\"(내부 명령) 또는 \"\\help\"(SQL\n"
+"명령)를 입력하거나 PostgreSQL\n"
+"설명서에서 psql 섹션을 참조하십시오.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "문제점 보고 주소: <%s>\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "일반\n"
+
+#: help.c:192
+msgid ""
+" \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright PostgreSQL 사용법 및 저작권 정보 표시\n"
+
+#: help.c:193
+msgid ""
+" \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr ""
+" \\crosstabview [칼럼들] 쿼리를 실행하고, 피봇 테이블 형태로 자료를 보여줌\n"
+
+#: help.c:194
+msgid ""
+" \\errverbose show most recent error message at maximum "
+"verbosity\n"
+msgstr ""
+" \\errverbose 최대 자세히 보기 상태에서 최근 오류를 다 보여줌\n"
+
+#: help.c:195
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPTIONS)] [FILE] 쿼리 실행 (결과는 지정한 파일로, 또는 |파이프로);\n"
+" \\g 명령에서 인자가 없으면 세미콜론과 같음\n"
+
+#: help.c:197
+msgid ""
+" \\gdesc describe result of query, without executing it\n"
+msgstr ""
+" \\gdesc 쿼리를 실행하지 않고 그 결과 칼럼과 자료형을 출력\n"
+
+#: help.c:198
+msgid ""
+" \\gexec execute query, then execute each value in its "
+"result\n"
+msgstr " \\gexec 쿼리를 실행하고, 그 결과를 각각 실행 함\n"
+
+#: help.c:199
+msgid ""
+" \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [PREFIX] 쿼리 실행 뒤 그 결과를 psql 변수로 저장\n"
+
+#: help.c:200
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr ""
+" \\gx [(OPTIONS)] [FILE] \\g 명령과 같으나, 출력을 확장 모드로 강제함\n"
+
+#: help.c:201
+msgid " \\q quit psql\n"
+msgstr " \\q psql 종료\n"
+
+#: help.c:202
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SEC] 매 초마다 쿼리 실행\n"
+
+#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304
+#: help.c:324 help.c:337 help.c:346
+msgid "\n"
+msgstr "\n"
+
+#: help.c:205
+msgid "Help\n"
+msgstr "도움말\n"
+
+#: help.c:207
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] psql 역슬래시 명령어 설명\n"
+
+#: help.c:208
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options psql 명령행 옵션 도움말 보기\n"
+
+#: help.c:209
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables psql 환경 설정 변수들에 설명 보기\n"
+
+#: help.c:210
+msgid ""
+" \\h [NAME] help on syntax of SQL commands, * for all "
+"commands\n"
+msgstr ""
+" \\h [NAME] SQL 명령 구문 도움말, 모든 명령을 표시하려면 * 입"
+"력\n"
+
+#: help.c:213
+msgid "Query Buffer\n"
+msgstr "쿼리 버퍼\n"
+
+#: help.c:214
+msgid ""
+" \\e [FILE] [LINE] edit the query buffer (or file) with external "
+"editor\n"
+msgstr " \\e [FILE] [LINE] 외부 편집기로 쿼리 버퍼(또는 파일) 편집\n"
+
+#: help.c:215
+msgid ""
+" \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [FUNCNAME [LINE]] 외부 편집기로 해당 함수 내용 편집\n"
+
+#: help.c:216
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [VIEWNAME [LINE]] 외부 편집기로 해당 뷰 정의 편집\n"
+
+#: help.c:217
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p 쿼리 버퍼의 내용 표시\n"
+
+#: help.c:218
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r 쿼리 버퍼 초기화(모두 지움)\n"
+
+#: help.c:220
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [FILE] 기록 표시 또는 파일에 저장\n"
+
+#: help.c:222
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w FILE 쿼리 버퍼를 파일에 기록\n"
+
+#: help.c:225
+msgid "Input/Output\n"
+msgstr "입력/출력\n"
+
+#: help.c:226
+msgid ""
+" \\copy ... perform SQL COPY with data stream to the client "
+"host\n"
+msgstr ""
+" \\copy ... 클라이언트 호스트에 있는 자료를 SQL COPY 명령 실"
+"행\n"
+
+#: help.c:227
+msgid ""
+" \\echo [-n] [STRING] write string to standard output (-n for no "
+"newline)\n"
+msgstr " \\echo [-n] [STRING] 문자열을 표준 출력에 기록 (-n 줄바꿈 없음)\n"
+
+#: help.c:228
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i FILE 파일에서 명령 실행\n"
+
+#: help.c:229
+msgid ""
+" \\ir FILE as \\i, but relative to location of current "
+"script\n"
+msgstr ""
+" \\ir FILE \\i 명령과 같으나, 경로가 현재 위치 기준 상대적\n"
+
+#: help.c:230
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [FILE] 모든 쿼리 결과를 파일 또는 |파이프로 보냄\n"
+
+#: help.c:231
+msgid ""
+" \\qecho [-n] [STRING] write string to \\o output stream (-n for no "
+"newline)\n"
+msgstr ""
+" \\qecho [-n] [STRING] 문자열을 \\o 출력 스트림에 기록 (-n 줄바꿈 없음)\n"
+
+#: help.c:232
+msgid ""
+" \\warn [-n] [STRING] write string to standard error (-n for no "
+"newline)\n"
+msgstr " \\warn [-n] [STRING] 문자열을 stderr에 기록 (-n 줄바꿈 없음)\n"
+
+#: help.c:235
+msgid "Conditional\n"
+msgstr "조건문\n"
+
+#: help.c:236
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR 조건문 시작\n"
+
+#: help.c:237
+msgid ""
+" \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR else if 구문 시작\n"
+
+#: help.c:238
+msgid ""
+" \\else final alternative within current conditional "
+"block\n"
+msgstr " \\else 조건문의 그 외 조건\n"
+
+#: help.c:239
+msgid " \\endif end conditional block\n"
+msgstr " \\endif 조건문 끝\n"
+
+#: help.c:242
+msgid "Informational\n"
+msgstr "정보보기\n"
+
+#: help.c:243
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (옵션: S = 시스템 개체 표시, + = 추가 상세 정보)\n"
+
+#: help.c:244
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] 테이블, 뷰 및 시퀀스 목록\n"
+
+#: help.c:245
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NAME 테이블, 뷰, 시퀀스 또는 인덱스 설명\n"
+
+#: help.c:246
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [PATTERN] 집계 함수 목록\n"
+
+#: help.c:247
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [PATTERN] 접근 방법 목록\n"
+
+#: help.c:248
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] 연산자 클래스 목록\n"
+
+#: help.c:249
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] 연산자 부류 목록\n"
+
+#: help.c:250
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] 연산자 부류 소속 연산자 목록\n"
+
+#: help.c:251
+msgid ""
+" \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] 연산자 가족에 포함된 지원 함수 목록\n"
+
+#: help.c:252
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [PATTERN] 테이블스페이스 목록\n"
+
+#: help.c:253
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [PATTERN] 문자셋 변환자 목록\n"
+
+#: help.c:254
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [PATTERN] 환경설정 매개변수 목록\n"
+
+#: help.c:255
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [PATTERN] 자료형 변환자 목록\n"
+
+#: help.c:256
+msgid ""
+" \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr ""
+" \\dd[S] [PATTERN] 다른 곳에서는 볼 수 없는 객체 설명을 보여줌\n"
+
+#: help.c:257
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [PATTERN] 도메인 목록\n"
+
+#: help.c:258
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [PATTERN] 기본 접근권한 목록\n"
+
+#: help.c:259
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [PATTERN] 외부 테이블 목록\n"
+
+#: help.c:260
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [PATTERN] 외부 서버 목록\n"
+
+#: help.c:261
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [PATTERN] 외부 테이블 목록\n"
+
+#: help.c:262
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [PATTERN] 사용자 매핑 목록\n"
+
+#: help.c:263
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [PATTERN] 외부 데이터 래퍼 목록\n"
+
+#: help.c:264
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] "
+"functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" [agg/normal/procedure/trigger/window 단일] 함수 목"
+"록\n"
+
+#: help.c:266
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [PATTERN] 텍스트 검색 구성 목록\n"
+
+#: help.c:267
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [PATTERN] 텍스트 검색 사전 목록\n"
+
+#: help.c:268
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [PATTERN] 텍스트 검색 파서 목록\n"
+
+#: help.c:269
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [PATTERN] 텍스트 검색 템플릿 목록\n"
+
+#: help.c:270
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [PATTERN] 롤 목록\n"
+
+#: help.c:271
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [PATTERN] 인덱스 목록\n"
+
+#: help.c:272
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] 큰 개체 목록, \\lo_list 명령과 같음\n"
+
+#: help.c:273
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [PATTERN] 프로시져 언어 목록\n"
+
+#: help.c:274
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [PATTERN] materialized 뷰 목록\n"
+
+#: help.c:275
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [PATTERN] 스키마 목록\n"
+
+#: help.c:276
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" 연산자 목록\n"
+
+#: help.c:278
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [PATTERN] collation 목록\n"
+
+#: help.c:279
+msgid ""
+" \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp [PATTERN] 테이블, 뷰 및 시퀀스 액세스 권한 목록\n"
+
+#: help.c:280
+msgid ""
+" \\dP[itn+] [PATTERN] list [only index/table] partitioned relations "
+"[n=nested]\n"
+msgstr ""
+" \\dP[itn+] [PATTERN] 파티션 릴레이션 목록 [인덱스/테이블만] [n=nested]\n"
+
+#: help.c:281
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr " \\drds [ROLEPTRN [DBPTRN]] per-database 롤 설정 목록\n"
+
+#: help.c:282
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [PATTERN] 복제 발행 목록\n"
+
+#: help.c:283
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [PATTERN] 복제 구독 목록\n"
+
+#: help.c:284
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [PATTERN] 시퀀스 목록\n"
+
+#: help.c:285
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [PATTERN] 테이블 목록\n"
+
+#: help.c:286
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [PATTERN] 데이터 형식 목록\n"
+
+#: help.c:287
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [PATTERN] 롤 목록\n"
+
+#: help.c:288
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [PATTERN] 뷰 목록\n"
+
+#: help.c:289
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [PATTERN] 확장 모듈 목록\n"
+
+#: help.c:290
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [PATTERN] 확장 통계 정보 목록\n"
+
+#: help.c:291
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [PATTERN] 이벤트 트리거 목록\n"
+
+#: help.c:292
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [PATTERN] 데이터베이스 목록\n"
+
+#: help.c:293
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] 함수이름 함수 정의 보기\n"
+
+#: help.c:294
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] 뷰이름 뷰 정의 보기\n"
+
+#: help.c:295
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [PATTERN] \\dp와 같음\n"
+
+#: help.c:298
+msgid "Large Objects\n"
+msgstr "큰 개체\n"
+
+#: help.c:299
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export LOBOID FILE 큰 개체를 파일로 저장\n"
+
+#: help.c:300
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import FILE [COMMENT]\n"
+" 파일에서 큰 개체 가져오기\n"
+
+#: help.c:302
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] 큰 개체 목록\n"
+
+#: help.c:303
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID 큰 개체 삭제\n"
+
+#: help.c:306
+msgid "Formatting\n"
+msgstr "출력 형식\n"
+
+#: help.c:307
+msgid ""
+" \\a toggle between unaligned and aligned output mode\n"
+msgstr ""
+" \\a 정렬되지 않은 출력 모드와 정렬된 출력 모드 전환\n"
+
+#: help.c:308
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr ""
+" \\C [STRING] 테이블 제목 설정 또는 값이 없는 경우 설정 안 함\n"
+
+#: help.c:309
+msgid ""
+" \\f [STRING] show or set field separator for unaligned query "
+"output\n"
+msgstr ""
+" \\f [STRING] unaligned 출력에 대해 필드 구분자 표시 또는 설정\n"
+
+#: help.c:310
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H HTML 출력 모드 전환(현재 %s)\n"
+
+#: help.c:312
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [이름 [값]] 테이블 출력 옵션 설정\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:319
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] 행만 표시(현재 %s)\n"
+
+#: help.c:321
+msgid ""
+" \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr ""
+" \\T [STRING] HTML <table> 태그 속성 설정 또는 비었는 경우 설정 "
+"안 함\n"
+
+#: help.c:322
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] 확장된 출력 전환 (현재 %s)\n"
+
+#: help.c:323
+msgid "auto"
+msgstr "자동"
+
+#: help.c:326
+msgid "Connection\n"
+msgstr "연결\n"
+
+#: help.c:328
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" 새 데이터베이스에 접속 (현재 \"%s\")\n"
+
+#: help.c:332
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" 새 데이터베이스에 접속 (현재 접속해 있지 않음)\n"
+
+#: help.c:334
+msgid ""
+" \\conninfo display information about current connection\n"
+msgstr " \\conninfo 현재 데이터베이스 접속 정보 보기\n"
+
+#: help.c:335
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [ENCODING] 클라이언트 인코딩 표시 또는 설정\n"
+
+#: help.c:336
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [USERNAME] 사용자 암호를 안전하게 변경\n"
+
+#: help.c:339
+msgid "Operating System\n"
+msgstr "운영 체제\n"
+
+#: help.c:340
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [DIR] 현재 작업 디렉터리 변경\n"
+
+#: help.c:341
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR 환경 변수값을 psql 변수값으로\n"
+
+#: help.c:342
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAME [VALUE] 환경 변수 지정 및 해제\n"
+
+#: help.c:343
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] 명령 실행 시간 전환(현재 %s)\n"
+
+#: help.c:345
+msgid ""
+" \\! [COMMAND] execute command in shell or start interactive "
+"shell\n"
+msgstr " \\! [COMMAND] 셸 명령 실행 또는 대화식 셸 시작\n"
+
+#: help.c:348
+msgid "Variables\n"
+msgstr "변수\n"
+
+#: help.c:349
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr ""
+" \\prompt [TEXT] NAME 사용자에게 내부 변수를 설정하라는 메시지 표시\n"
+
+#: help.c:350
+msgid ""
+" \\set [NAME [VALUE]] set internal variable, or list all if no "
+"parameters\n"
+msgstr ""
+" \\set [NAME [VALUE]] 내부 변수 설정 또는 미지정 경우 모든 변수 목록 표"
+"시\n"
+
+#: help.c:351
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NAME 내부 변수 설정 해제(삭제)\n"
+
+#: help.c:390
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr "특별한 기능 설정 변수 목록\n"
+
+#: help.c:392
+msgid "psql variables:\n"
+msgstr "psql 변수들:\n"
+
+#: help.c:394
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAME=VALUE\n"
+" 또는 psql 명령 모드에서는 \\set NAME VALUE\n"
+"\n"
+
+#: help.c:396
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" 설정 되면, SQL 명령이 정상 실행 되면 자동 커밋 함\n"
+
+#: help.c:398
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" SQL 키워드 자동완성에서 대소문자 처리\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:401
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" 현재 접속한 데이터베이스 이름\n"
+
+#: help.c:403
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" 입력을 표준 출력으로 보낼 종류\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:406
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" 지정 되면 psql 내장 명령어의 내부 쿼리를 출력함;\n"
+" \"noexec\" 값으로 설정하면, 실행되지 않고 쿼리만 보여줌\n"
+
+#: help.c:409
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" 현재 클라이언트 인코딩 지정\n"
+
+#: help.c:411
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr ""
+" ERROR\n"
+" 마지막 쿼리가 실패했으면 true, 아니면 false\n"
+
+#: help.c:413
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = "
+"unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" 쿼리 결과에 대해서 출력할 최대 로우 개수 (0=제한없음)\n"
+
+#: help.c:415
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" 지정하면 테이블 접근 방법을 보여주지 않음\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" 지정하면 TOAST 압축 종류 보여주지 않음\n"
+
+#: help.c:419
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" 명령 내역 처리 방법 [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:421
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" 명령 내역을 저장할 파일 이름\n"
+
+#: help.c:423
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" 명령 내역 최대 보관 개수\n"
+
+#: help.c:425
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" 현재 접속한 데이터베이스 서버 호스트\n"
+
+#: help.c:427
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" 대화형 세션 종료를 위한 EOF 개수\n"
+
+#: help.c:429
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" 마지막 영향 받은 OID 값\n"
+
+#: help.c:431
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if "
+"none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" 마지막 오류 메시지와 SQLSTATE, 정상이면, 빈 문자열과 \"00000\"\n"
+
+#: help.c:434
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" 설정하면 오류 발생시에도 트랜잭션 중지 안함 (savepoint 암묵적 사용)\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" 배치 작업 시 오류가 발생하면 중지함\n"
+
+#: help.c:438
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" 현재 접속한 서버 포트\n"
+
+#: help.c:440
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" 기본 psql 프롬프트 정의\n"
+
+#: help.c:442
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous "
+"line\n"
+msgstr ""
+" PROMPT2\n"
+" 아직 구문이 덜 끝난 명령행의 프롬프트\n"
+
+#: help.c:444
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" COPY ... FROM STDIN 작업시 보일 프롬프트\n"
+
+#: help.c:446
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" 조용히 실행 (-q 옵션과 같음)\n"
+
+#: help.c:448
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" 마지막 쿼리 작업 대상 로우 수, 또는 0\n"
+
+#: help.c:450
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" 문자열 버전 정보나, 숫자 형식 버전 정보\n"
+
+#: help.c:453
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" 여러 쿼리가 연속하는 경우(\\;) 모든 쿼리 결과를 출력, off면 마지막 결과"
+"만\n"
+
+#: help.c:455
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" 상황별 자세한 메시지 내용 출력 제어 [never, errors, always]\n"
+
+#: help.c:457
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" 한 줄에 하나의 SQL 명령 실행 (-S 옵션과 같음)\n"
+
+#: help.c:459
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" 각 명령을 확인하며 실행 (-s 옵션과 같음)\n"
+
+#: help.c:461
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" 마지막 쿼리의 SQLSTATE 값, 오류가 없으면 \"00000\"\n"
+
+#: help.c:463
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" 현재 접속한 데이터베이스 사용자\n"
+
+#: help.c:465
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" 오류 출력시 자세히 볼 내용 범위 [default, verbose, terse, sqlstate]\n"
+
+#: help.c:467
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql 버전 (자세한 버전, 단순한 버전, 숫자형 버전)\n"
+
+#: help.c:472
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"출력 설정들:\n"
+
+#: help.c:474
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NAME[=VALUE]\n"
+" 또는 psql 명령 모드에서는 \\pset NAME [VALUE]\n"
+"\n"
+
+#: help.c:476
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" 테두리 모양 (숫자)\n"
+
+#: help.c:478
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" 줄바꿈을 위한 너비 지정\n"
+
+#: help.c:480
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (또는 x)\n"
+" 확장된 출력 전환 [on, off, auto]\n"
+
+#: help.c:482
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" unaligned 출력용 필드 구분자 (초기값 \"%s\"')\n"
+
+#: help.c:485
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" unaligned 출력용 필드 구분자를 0 바이트로 지정\n"
+
+#: help.c:487
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" 테이블 꼬리말 보이기 전환 [on, off]\n"
+
+#: help.c:489
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" 출력 양식 지정 [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:491
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" 테두리 선 모양 지정 [ascii, old-ascii, unicode]\n"
+
+#: help.c:493
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" null 값 출력 방법\n"
+
+#: help.c:495
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of "
+"digits\n"
+msgstr ""
+" numericlocale\n"
+" 숫자 출력에서 로케일 기반 천자리 분리 문자 활성화 [on, off]\n"
+
+#: help.c:497
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" 외부 페이지 단위 보기 도구 사용 여부 [yes, no, always]\n"
+
+#: help.c:499
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" unaligned 출력용 레코드(줄) 구분자\n"
+
+#: help.c:501
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" unaligned 출력용 레코드 구분자를 0 바이트로 지정\n"
+
+#: help.c:503
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (또는 T)\n"
+" html 테이블 태그에 대한 속성이나,\n"
+" latex-longtable 양식에서 왼쪽 정렬 자료용 칼럼 넓이 지정\n"
+
+#: help.c:506
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" 테이블 제목 지정\n"
+
+#: help.c:508
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" 지정되면, 자료만 보임\n"
+
+#: help.c:510
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" 유니코드 선 종류 [single, double]\n"
+
+#: help.c:515
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"OS 환경 변수들:\n"
+
+#: help.c:519
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" 또는 psql 명령 모드에서는 \\setenv NAME [VALUE]\n"
+"\n"
+
+#: help.c:521
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" 또는 psql 명령 모드에서는 \\setenv NAME [VALUE]\n"
+"\n"
+
+#: help.c:524
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" 다음 줄로 넘어갈 칼럼 수\n"
+
+#: help.c:526
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" application_name 변수값으로 사용됨\n"
+
+#: help.c:528
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" 접속할 데이터베이스 이름\n"
+
+#: help.c:530
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" 서버 접속용 호스트 이름\n"
+
+#: help.c:532
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" 서버 접속용 비밀번호가 저장된 파일 이름\n"
+
+#: help.c:534
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" 서버 접속 비밀번호 (보안에 취약함)\n"
+
+#: help.c:536
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" 서버 접속용 포트\n"
+
+#: help.c:538
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" 서버 접속용 데이터베이스 사용자 이름\n"
+
+#: help.c:540
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" \\e, \\ef, \\ev 명령에서 사용할 외부 편집기 경로\n"
+
+#: help.c:542
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" 외부 편집기 호출 시 사용할 줄번호 선택 옵션\n"
+
+#: help.c:544
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" 사용자 .psql_history 파일 임의 지정\n"
+
+#: help.c:546
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PAGER\n"
+" 페이지 단위 보기에서 사용할 프로그램\n"
+
+#: help.c:549
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" \\watch 명령에서 사용할 외장 페이저 프로그램 이름\n"
+
+#: help.c:552
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" 사용자 .psqlrc 파일의 임의 지정\n"
+
+#: help.c:554
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" \\! 명령에서 사용할 쉘\n"
+
+#: help.c:556
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" 임시 파일을 사용할 디렉터리\n"
+
+#: help.c:616
+msgid "Available help:\n"
+msgstr "사용 가능한 도움말:\n"
+
+#: help.c:711
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"명령: %s\n"
+"설명: %s\n"
+"문법:\n"
+"%s\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:734
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"\"%s\" 명령에 대한 도움말 없음.\n"
+"\\h 명령을 인자 없이 호출 하면 사용 가능한 모든 명령 보여줌.\n"
+
+#: input.c:217
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "입력 파일을 읽을 수 없음: %m"
+
+#: input.c:478 input.c:516
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "history를 \"%s\" 파일로 저장할 수 없음: %m"
+
+#: input.c:535
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "히스토리 기능은 이 설치본에서는 지원하지 않음"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: 데이터베이스에 연되어있지 않음"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: 현재 트랜잭션 중지됨"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: 알 수 없는 트랜잭션 상태"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: escaped"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "마치려면 \"\\q\"를 입력하세요: %s\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"이 입력은 PostgreSQL 사용자양식 덤프 내용입니다.\n"
+"이 덤프 내용을 데이터베이스에 반영하려면,\n"
+"pg_restore 명령행 클라이언트를 사용하세요.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "\\? 도움말, Ctrl-C 입력 버퍼 비우기"
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "도움말을 보려면 \\?를 입력하십시오."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "PostgreSQL에 대한 명령행 인터페이스인 psql을 사용하고 있습니다."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"사용법: \\copyright 저작권 정보\n"
+" \\h SQL 명령 도움말\n"
+" \\? psql 명령 도움말\n"
+" \\g 또는 명령 끝에 세미콜론(;) 쿼리 실행\n"
+" \\q 마침\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "\\q 마침"
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "마침은 Ctrl-D"
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "마침은 Ctrl-C"
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr ""
+"쿼리 무시됨; 현재 \\if 블록을 끝내려면 \\endif 또는 Ctrl-C 키를 사용하세요."
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "\\endif 없이 EOF 도달"
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "마무리 안된 따옴표 안의 문자열"
+
+#: psqlscanslash.l:811
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: 메모리 부족"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1996
+#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154
+#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228
+#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431
+#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517
+#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594
+#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730
+#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071
+#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171
+#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259
+#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338
+#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396
+#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428
+#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464
+#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499
+#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537
+#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574
+#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606
+#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638
+#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680
+#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030
+#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687
+#: sql_help.c:4735 sql_help.c:4893
+msgid "name"
+msgstr "이름"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846
+#: sql_help.c:3339 sql_help.c:4455
+msgid "aggregate_signature"
+msgstr "집계함수_식별구문"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "새이름"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3011
+msgid "new_owner"
+msgstr "새사용자"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "새스키마"
+
+#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484
+msgid "where aggregate_signature is:"
+msgstr "집계함수_식별구문 사용법:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911
+#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085
+#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341
+#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527
+#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461
+#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488
+#: sql_help.c:4491
+msgid "argmode"
+msgstr "인자모드"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912
+#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2067 sql_help.c:2086
+#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342
+#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528
+#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475
+#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492
+msgid "argname"
+msgstr "인자이름"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2388 sql_help.c:2597
+#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440
+#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470
+#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493
+msgid "argtype"
+msgstr "인자자료형"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974
+#: sql_help.c:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343
+#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040
+#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742
+#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956
+msgid "option"
+msgstr "옵션"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433
+#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388
+msgid "where option can be:"
+msgstr "옵션 사용법:"
+
+#: sql_help.c:116 sql_help.c:2209
+msgid "allowconn"
+msgstr "접속허용"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210
+#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227
+msgid "connlimit"
+msgstr "접속제한"
+
+#: sql_help.c:118 sql_help.c:2211
+msgid "istemplate"
+msgstr "템플릿?"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4187
+msgid "new_tablespace"
+msgstr "새테이블스페이스"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2398 sql_help.c:2601
+#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675
+msgid "configuration_parameter"
+msgstr "환경설정_매개변수"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344
+#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467
+#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626
+#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915
+#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014
+#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676
+#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679
+msgid "value"
+msgstr "값"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "대상롤"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631
+#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889
+#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338
+#: sql_help.c:4357 sql_help.c:4369
+msgid "schema_name"
+msgstr "스키마이름"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "grant_또는_revoke_내용"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "grant_또는_revoke_내용에 사용되는 구문:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2437 sql_help.c:2438
+#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575
+#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667
+#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232
+#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933
+#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697
+msgid "role_name"
+msgstr "롤이름"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352
+#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774
+#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924
+#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981
+#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088
+#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558
+#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608
+#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651
+#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806
+#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864
+#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921
+#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044
+#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102
+#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105
+msgid "expression"
+msgstr "표현식"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "도메인_제약조건"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852
+#: sql_help.c:1854 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351
+#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993
+msgid "constraint_name"
+msgstr "제약조건_이름"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "새제약조건_이름"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "새버전"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "맴버_객체"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "맴버_객체 사용법:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856
+#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860
+#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869
+#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884
+#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894
+#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898
+#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902
+#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4451 sql_help.c:4456
+#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465
+#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477
+#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481
+#: sql_help.c:4482
+msgid "object_name"
+msgstr "객체이름"
+
+#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454
+msgid "aggregate_name"
+msgstr "집계함수이름"
+
+#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135
+#: sql_help.c:2137 sql_help.c:3357
+msgid "source_type"
+msgstr "기존자료형"
+
+#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136
+#: sql_help.c:2138 sql_help.c:3358
+msgid "target_type"
+msgstr "대상자료형"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133
+#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549
+#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577
+#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834
+#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072
+#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083
+msgid "function_name"
+msgstr "함수이름"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542
+msgid "operator_name"
+msgstr "연산자이름"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871
+#: sql_help.c:2519 sql_help.c:3481
+msgid "left_type"
+msgstr "왼쪽인자_자료형"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872
+#: sql_help.c:2520 sql_help.c:3482
+msgid "right_type"
+msgstr "오른쪽인자_자료형"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2539
+#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500
+msgid "index_method"
+msgstr "색인방법"
+
+#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467
+msgid "procedure_name"
+msgstr "프로시져_이름"
+
+#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473
+msgid "routine_name"
+msgstr "루틴_이름"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394
+#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662
+#: sql_help.c:3926 sql_help.c:4375
+msgid "type_name"
+msgstr "자료형이름"
+
+#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599
+#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911
+#: sql_help.c:4360
+msgid "lang_name"
+msgstr "언어_이름"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "집계함수_식별구문 사용법:"
+
+#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275
+msgid "handler_function"
+msgstr "핸들러_함수"
+
+#: sql_help.c:396 sql_help.c:2276
+msgid "validator_function"
+msgstr "유효성검사_함수"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "동작"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851
+#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1983 sql_help.c:1984
+#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391
+#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629
+#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887
+#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919
+#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955
+#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978
+#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883
+#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997
+#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089
+#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614
+#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877
+#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924
+#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117
+msgid "column_name"
+msgstr "칼럼이름"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "새칼럼이름"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "동작 사용법:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2229
+#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888
+#: sql_help.c:3167 sql_help.c:4141
+msgid "data_type"
+msgstr "자료형"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2230 sql_help.c:2329
+#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911
+#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990
+msgid "collation"
+msgstr "collation"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339
+#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920
+msgid "column_constraint"
+msgstr "칼럼_제약조건"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968
+msgid "integer"
+msgstr "정수"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "속성_옵션"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340
+#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921
+msgid "table_constraint"
+msgstr "테이블_제약조건"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905
+msgid "trigger_name"
+msgstr "트리거이름"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918
+msgid "parent_table"
+msgstr "상위_테이블"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2261
+msgid "extension_name"
+msgstr "확장모듈이름"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395
+msgid "execution_cost"
+msgstr "실행비용"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396
+msgid "result_rows"
+msgstr "반환자료수"
+
+#: sql_help.c:547 sql_help.c:2397
+msgid "support_function"
+msgstr "지원_함수"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2709
+#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881
+#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890
+#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 sql_help.c:3896
+#: sql_help.c:3897 sql_help.c:3899 sql_help.c:3900 sql_help.c:3902
+#: sql_help.c:3903 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918
+#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924
+#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930
+#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335
+#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342
+#: sql_help.c:4343 sql_help.c:4345 sql_help.c:4346 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4351 sql_help.c:4352 sql_help.c:4358
+#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364
+#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370
+#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376
+#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380
+msgid "role_specification"
+msgstr "롤_명세"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198
+#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707
+msgid "user_name"
+msgstr "사용자이름"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716
+#: sql_help.c:3932 sql_help.c:4381
+msgid "where role_specification can be:"
+msgstr "롤_명세 사용법:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "그룹이름"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468
+#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930
+#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923
+#: sql_help.c:4372
+msgid "tablespace_name"
+msgstr "테이블스페이스이름"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783
+msgid "index_name"
+msgstr "인덱스이름"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2466 sql_help.c:2500
+#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969
+#: sql_help.c:2996
+msgid "storage_parameter"
+msgstr "스토리지_매개변수"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "칼럼번호"
+
+#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464
+msgid "large_object_oid"
+msgstr "대형_객체_oid"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889
+msgid "compression_method"
+msgstr "압축_방법"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "새_접근_방법"
+
+#: sql_help.c:725 sql_help.c:2523
+msgid "res_proc"
+msgstr "res_proc"
+
+#: sql_help.c:726 sql_help.c:2524
+msgid "join_proc"
+msgstr "join_proc"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2541
+msgid "strategy_number"
+msgstr "전략_번호"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2543 sql_help.c:2544
+#: sql_help.c:2547 sql_help.c:2548
+msgid "op_type"
+msgstr "연산자자료형"
+
+#: sql_help.c:782 sql_help.c:2545
+msgid "sort_family_name"
+msgstr "정렬_가족_이름"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2546
+msgid "support_number"
+msgstr "지원_번호"
+
+#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087
+#: sql_help.c:3089
+msgid "argument_type"
+msgstr "인자자료형"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779
+#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891
+#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2324
+#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574
+#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770
+#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917
+#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517
+#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885
+#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334
+#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627
+#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884
+#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060
+#: sql_help.c:5122
+msgid "table_name"
+msgstr "테이블_이름"
+
+#: sql_help.c:823 sql_help.c:2576
+msgid "using_expression"
+msgstr "using_expression"
+
+#: sql_help.c:824 sql_help.c:2577
+msgid "check_expression"
+msgstr "체크_표현식"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624
+msgid "publication_object"
+msgstr "발행_객체"
+
+#: sql_help.c:903 sql_help.c:2625
+msgid "publication_parameter"
+msgstr "발행_매개변수"
+
+#: sql_help.c:909 sql_help.c:2627
+msgid "where publication_object is one of:"
+msgstr "발행_객체 사용법:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662
+#: sql_help.c:3228
+msgid "password"
+msgstr "암호"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663
+#: sql_help.c:3229
+msgid "timestamp"
+msgstr "타임스탬프"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3892
+#: sql_help.c:4341
+msgid "database_name"
+msgstr "데이터베이스_이름"
+
+#: sql_help.c:1073 sql_help.c:2732
+msgid "increment"
+msgstr "증가값"
+
+#: sql_help.c:1074 sql_help.c:2733
+msgid "minvalue"
+msgstr "최소값"
+
+#: sql_help.c:1075 sql_help.c:2734
+msgid "maxvalue"
+msgstr "최대값"
+
+#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664
+#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056
+msgid "start"
+msgstr "시작"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "재시작"
+
+#: sql_help.c:1078 sql_help.c:2736
+msgid "cache"
+msgstr "캐쉬"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "새대상"
+
+#: sql_help.c:1142 sql_help.c:2789
+msgid "conninfo"
+msgstr "접속정보"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790
+msgid "publication_name"
+msgstr "발행_이름"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "발행_옵션"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "새로고침_옵션"
+
+#: sql_help.c:1161 sql_help.c:2791
+msgid "subscription_parameter"
+msgstr "구독_매개변수"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "skip_option"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "파티션_이름"
+
+#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922
+msgid "partition_bound_spec"
+msgstr "파티션_범위_정의"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936
+msgid "sequence_options"
+msgstr "시퀀스_옵션"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "시퀀스_옵션"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "색인을_사용하는_테이블_제약조건"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "rewrite_룰_이름"
+
+#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961
+msgid "and partition_bound_spec is:"
+msgstr "파티션_범위_정의 사용법:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354
+#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963
+#: sql_help.c:2964
+msgid "partition_bound_expr"
+msgstr "파티션_범위_표현식"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358
+#: sql_help.c:2965 sql_help.c:2966
+msgid "numeric_literal"
+msgstr "숫자"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "칼럼_제약조건 사용법:"
+
+#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598
+#: sql_help.c:2934
+msgid "default_expr"
+msgstr "초기값_표현식"
+
+#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935
+msgid "generation_expr"
+msgstr "생성_표현식"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947
+#: sql_help.c:2949 sql_help.c:2953
+msgid "index_parameters"
+msgstr "색인_매개변수"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956
+msgid "reftable"
+msgstr "참조테이블"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957
+msgid "refcolumn"
+msgstr "참조칼럼"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959
+msgid "referential_action"
+msgstr "참조_방식"
+
+#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943
+msgid "and table_constraint is:"
+msgstr "테이블_제약조건 사용법:"
+
+#: sql_help.c:1409 sql_help.c:2951
+msgid "exclude_element"
+msgstr "exclude_요소"
+
+#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662
+#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054
+msgid "operator"
+msgstr "연산자"
+
+#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954
+msgid "predicate"
+msgstr "범위한정구문"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "색인을_사용하는_테이블_제약조건 사용법:"
+
+#: sql_help.c:1421 sql_help.c:2967
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "UNIQUE, PRIMARY KEY, EXCLUDE 제약조건에서 쓰는 색인_매개변수 사용법:"
+
+#: sql_help.c:1426 sql_help.c:2972
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "EXCLUDE 제약조건에서 쓰는 exclude_요소 사용법:"
+
+#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912
+#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991
+msgid "opclass"
+msgstr "연산자클래스"
+
+#: sql_help.c:1430 sql_help.c:2976
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "FOREIGN KEY/REFERENCES 제약조건에서 쓰는 참조_방식 사용법:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013
+msgid "tablespace_option"
+msgstr "테이블스페이스_옵션"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "토큰_종류"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "사전이름"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "옛사전"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "새사전"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3166
+msgid "attribute_name"
+msgstr "속성이름"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "새속성이름"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "새_enum_값"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "옆_enum_값"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "기존_enum_값"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "속성"
+
+#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748
+#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947
+#: sql_help.c:4350
+msgid "server_name"
+msgstr "서버이름"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261
+msgid "view_option_name"
+msgstr "뷰_옵션이름"
+
+#: sql_help.c:1698 sql_help.c:3262
+msgid "view_option_value"
+msgstr "뷰_옵션_값"
+
+#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958
+msgid "table_and_columns"
+msgstr "테이블과_칼럼"
+
+#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745
+#: sql_help.c:4185 sql_help.c:4959
+msgid "where option can be one of:"
+msgstr "옵션 사용법:"
+
+#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977
+#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747
+#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188
+#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963
+#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967
+msgid "boolean"
+msgstr "불린"
+
+#: sql_help.c:1724 sql_help.c:4969
+msgid "and table_and_columns is:"
+msgstr "테이블과_칼럼 사용법:"
+
+#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749
+msgid "transaction_mode"
+msgstr "트랜잭션모드"
+
+#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750
+msgid "where transaction_mode is one of:"
+msgstr "트랜잭션모드 사용법:"
+
+#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582
+#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835
+#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064
+#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084
+msgid "argument"
+msgstr "인자"
+
+#: sql_help.c:1850
+msgid "relation_name"
+msgstr "릴레이션이름"
+
+#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344
+msgid "domain_name"
+msgstr "도메인이름"
+
+#: sql_help.c:1877
+msgid "policy_name"
+msgstr "정책이름"
+
+#: sql_help.c:1890
+msgid "rule_name"
+msgstr "룰이름"
+
+#: sql_help.c:1909 sql_help.c:4483
+msgid "string_literal"
+msgstr "문자열_리터럴"
+
+#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397
+msgid "transaction_id"
+msgstr "트랜잭션_id"
+
+#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017
+msgid "filename"
+msgstr "파일이름"
+
+#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688
+#: sql_help.c:2689
+msgid "command"
+msgstr "명령어"
+
+#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297
+#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552
+#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809
+#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049
+msgid "condition"
+msgstr "조건"
+
+#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263
+#: sql_help.c:3281 sql_help.c:3982
+msgid "query"
+msgstr "쿼리문"
+
+#: sql_help.c:1976
+msgid "format_name"
+msgstr "입출력양식이름"
+
+#: sql_help.c:1978
+msgid "delimiter_character"
+msgstr "구분문자"
+
+#: sql_help.c:1979
+msgid "null_string"
+msgstr "널문자열"
+
+#: sql_help.c:1981
+msgid "quote_character"
+msgstr "인용부호"
+
+#: sql_help.c:1982
+msgid "escape_character"
+msgstr "이스케이프 문자"
+
+#: sql_help.c:1986
+msgid "encoding_name"
+msgstr "인코딩이름"
+
+#: sql_help.c:1997
+msgid "access_method_type"
+msgstr "접근_방법_종류"
+
+#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090
+msgid "arg_data_type"
+msgstr "인자자료형"
+
+#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099
+msgid "sfunc"
+msgstr "sfunc"
+
+#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100
+msgid "state_data_type"
+msgstr "state_data_type"
+
+#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101
+msgid "state_data_size"
+msgstr "state_data_size"
+
+#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102
+msgid "ffunc"
+msgstr "ffunc"
+
+#: sql_help.c:2073 sql_help.c:2103
+msgid "combinefunc"
+msgstr "combinefunc"
+
+#: sql_help.c:2074 sql_help.c:2104
+msgid "serialfunc"
+msgstr "serialfunc"
+
+#: sql_help.c:2075 sql_help.c:2105
+msgid "deserialfunc"
+msgstr "deserialfunc"
+
+#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106
+msgid "initial_condition"
+msgstr "initial_condition"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "msfunc"
+msgstr "msfunc"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "minvfunc"
+msgstr "minvfunc"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "mstate_data_type"
+msgstr "mstate_data_type"
+
+#: sql_help.c:2080 sql_help.c:2110
+msgid "mstate_data_size"
+msgstr "mstate_data_size"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "mffunc"
+msgstr "mffunc"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minitial_condition"
+msgstr "minitial_condition"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "sort_operator"
+msgstr "정렬연산자"
+
+#: sql_help.c:2096
+msgid "or the old syntax"
+msgstr "또는 옛날 구문"
+
+#: sql_help.c:2098
+msgid "base_type"
+msgstr "기본자료형"
+
+#: sql_help.c:2155 sql_help.c:2202
+msgid "locale"
+msgstr "로케일"
+
+#: sql_help.c:2156 sql_help.c:2203
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2157 sql_help.c:2204
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2158 sql_help.c:4450
+msgid "provider"
+msgstr "제공자"
+
+#: sql_help.c:2160 sql_help.c:2263
+msgid "version"
+msgstr "버전"
+
+#: sql_help.c:2162
+msgid "existing_collation"
+msgstr "기존_collation"
+
+#: sql_help.c:2172
+msgid "source_encoding"
+msgstr "원래인코딩"
+
+#: sql_help.c:2173
+msgid "dest_encoding"
+msgstr "대상인코딩"
+
+#: sql_help.c:2199 sql_help.c:3039
+msgid "template"
+msgstr "템플릿"
+
+#: sql_help.c:2200
+msgid "encoding"
+msgstr "인코딩"
+
+#: sql_help.c:2201
+msgid "strategy"
+msgstr "전략번호"
+
+#: sql_help.c:2205
+msgid "icu_locale"
+msgstr "icu_로케일"
+
+#: sql_help.c:2206
+msgid "locale_provider"
+msgstr "로케일_제공자"
+
+#: sql_help.c:2207
+msgid "collation_version"
+msgstr "collation_version"
+
+#: sql_help.c:2212
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2232
+msgid "constraint"
+msgstr "제약조건"
+
+#: sql_help.c:2233
+msgid "where constraint is:"
+msgstr "제약조건 사용법:"
+
+#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112
+msgid "event"
+msgstr "이벤트"
+
+#: sql_help.c:2248
+msgid "filter_variable"
+msgstr "필터_변수"
+
+#: sql_help.c:2249
+msgid "filter_value"
+msgstr "필터_값"
+
+#: sql_help.c:2345 sql_help.c:2931
+msgid "where column_constraint is:"
+msgstr "칼럼_제약조건 사용법:"
+
+#: sql_help.c:2390
+msgid "rettype"
+msgstr "rettype"
+
+#: sql_help.c:2392
+msgid "column_type"
+msgstr "칼럼_자료형"
+
+#: sql_help.c:2401 sql_help.c:2604
+msgid "definition"
+msgstr "함수정의"
+
+#: sql_help.c:2402 sql_help.c:2605
+msgid "obj_file"
+msgstr "오브젝트파일"
+
+#: sql_help.c:2403 sql_help.c:2606
+msgid "link_symbol"
+msgstr "연결할_함수명"
+
+#: sql_help.c:2404 sql_help.c:2607
+msgid "sql_body"
+msgstr "sql_본문"
+
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913
+#: sql_help.c:2927 sql_help.c:2995
+msgid "method"
+msgstr "색인방법"
+
+#: sql_help.c:2463
+msgid "opclass_parameter"
+msgstr "opclass_매개변수"
+
+#: sql_help.c:2480
+msgid "call_handler"
+msgstr "호출_핸들러"
+
+#: sql_help.c:2481
+msgid "inline_handler"
+msgstr "인라인_핸들러"
+
+#: sql_help.c:2482
+msgid "valfunction"
+msgstr "구문검사함수"
+
+#: sql_help.c:2521
+msgid "com_op"
+msgstr "com_op"
+
+#: sql_help.c:2522
+msgid "neg_op"
+msgstr "neg_op"
+
+#: sql_help.c:2540
+msgid "family_name"
+msgstr "family_name"
+
+#: sql_help.c:2551
+msgid "storage_type"
+msgstr "스토리지_유형"
+
+#: sql_help.c:2690 sql_help.c:3119
+msgid "where event can be one of:"
+msgstr "이벤트 사용법:"
+
+#: sql_help.c:2710 sql_help.c:2712
+msgid "schema_element"
+msgstr "스키마_요소"
+
+#: sql_help.c:2749
+msgid "server_type"
+msgstr "서버_종류"
+
+#: sql_help.c:2750
+msgid "server_version"
+msgstr "서버_버전"
+
+#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347
+msgid "fdw_name"
+msgstr "fdw_이름"
+
+#: sql_help.c:2768 sql_help.c:2771
+msgid "statistics_name"
+msgstr "통계정보_이름"
+
+#: sql_help.c:2772
+msgid "statistics_kind"
+msgstr "통계정보_종류"
+
+#: sql_help.c:2788
+msgid "subscription_name"
+msgstr "구독_이름"
+
+#: sql_help.c:2893
+msgid "source_table"
+msgstr "원본테이블"
+
+#: sql_help.c:2894
+msgid "like_option"
+msgstr "LIKE구문옵션"
+
+#: sql_help.c:2960
+msgid "and like_option is:"
+msgstr "LIKE구문옵션 사용법:"
+
+#: sql_help.c:3012
+msgid "directory"
+msgstr "디렉터리"
+
+#: sql_help.c:3026
+msgid "parser_name"
+msgstr "구문분석기_이름"
+
+#: sql_help.c:3027
+msgid "source_config"
+msgstr "원본_설정"
+
+#: sql_help.c:3056
+msgid "start_function"
+msgstr "시작_함수"
+
+#: sql_help.c:3057
+msgid "gettoken_function"
+msgstr "gettoken함수"
+
+#: sql_help.c:3058
+msgid "end_function"
+msgstr "종료_함수"
+
+#: sql_help.c:3059
+msgid "lextypes_function"
+msgstr "lextypes함수"
+
+#: sql_help.c:3060
+msgid "headline_function"
+msgstr "headline함수"
+
+#: sql_help.c:3072
+msgid "init_function"
+msgstr "init함수"
+
+#: sql_help.c:3073
+msgid "lexize_function"
+msgstr "lexize함수"
+
+#: sql_help.c:3086
+msgid "from_sql_function_name"
+msgstr "sql에서_언어로_바꿀때쓸_함수이름"
+
+#: sql_help.c:3088
+msgid "to_sql_function_name"
+msgstr "언어에서_sql로_바꿀때쓸_함수이름"
+
+#: sql_help.c:3114
+msgid "referenced_table_name"
+msgstr "참조된_테이블_이름"
+
+#: sql_help.c:3115
+msgid "transition_relation_name"
+msgstr "전달_릴레이션_이름"
+
+#: sql_help.c:3118
+msgid "arguments"
+msgstr "인자들"
+
+#: sql_help.c:3170
+msgid "label"
+msgstr "enum요소"
+
+#: sql_help.c:3172
+msgid "subtype"
+msgstr "subtype"
+
+#: sql_help.c:3173
+msgid "subtype_operator_class"
+msgstr "subtype_operator_class"
+
+#: sql_help.c:3175
+msgid "canonical_function"
+msgstr "canonical_function"
+
+#: sql_help.c:3176
+msgid "subtype_diff_function"
+msgstr "subtype_diff_function"
+
+#: sql_help.c:3177
+msgid "multirange_type_name"
+msgstr "다중범위_자료형_이름"
+
+#: sql_help.c:3179
+msgid "input_function"
+msgstr "입력함수"
+
+#: sql_help.c:3180
+msgid "output_function"
+msgstr "출력함수"
+
+#: sql_help.c:3181
+msgid "receive_function"
+msgstr "받는함수"
+
+#: sql_help.c:3182
+msgid "send_function"
+msgstr "주는함수"
+
+#: sql_help.c:3183
+msgid "type_modifier_input_function"
+msgstr "type_modifier_input_function"
+
+#: sql_help.c:3184
+msgid "type_modifier_output_function"
+msgstr "type_modifier_output_function"
+
+#: sql_help.c:3185
+msgid "analyze_function"
+msgstr "분석함수"
+
+#: sql_help.c:3186
+msgid "subscript_function"
+msgstr "구독_함수"
+
+#: sql_help.c:3187
+msgid "internallength"
+msgstr "내부길이"
+
+#: sql_help.c:3188
+msgid "alignment"
+msgstr "정렬"
+
+#: sql_help.c:3189
+msgid "storage"
+msgstr "스토리지"
+
+#: sql_help.c:3190
+msgid "like_type"
+msgstr "like_type"
+
+#: sql_help.c:3191
+msgid "category"
+msgstr "category"
+
+#: sql_help.c:3192
+msgid "preferred"
+msgstr "preferred"
+
+#: sql_help.c:3193
+msgid "default"
+msgstr "기본값"
+
+#: sql_help.c:3194
+msgid "element"
+msgstr "요소"
+
+#: sql_help.c:3195
+msgid "delimiter"
+msgstr "구분자"
+
+#: sql_help.c:3196
+msgid "collatable"
+msgstr "collatable"
+
+#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547
+#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042
+msgid "with_query"
+msgstr "with절_쿼리"
+
+#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572
+#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591
+#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836
+#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061
+#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078
+#: sql_help.c:5086
+msgid "alias"
+msgstr "별칭"
+
+#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603
+#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852
+#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860
+#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090
+#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098
+msgid "from_item"
+msgstr "from절_항목"
+
+#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928
+msgid "cursor_name"
+msgstr "커서이름"
+
+#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929
+msgid "output_expression"
+msgstr "출력표현식"
+
+#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652
+#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045
+msgid "output_name"
+msgstr "출력_이름"
+
+#: sql_help.c:3316
+msgid "code"
+msgstr "코드"
+
+#: sql_help.c:3721
+msgid "parameter"
+msgstr "매개변수"
+
+#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142
+msgid "statement"
+msgstr "명령구문"
+
+#: sql_help.c:3778 sql_help.c:4116
+msgid "direction"
+msgstr "방향"
+
+#: sql_help.c:3780 sql_help.c:4118
+msgid "where direction can be one of:"
+msgstr "방향 사용법:"
+
+#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784
+#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121
+#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562
+#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819
+#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057
+msgid "count"
+msgstr "출력개수"
+
+#: sql_help.c:3888 sql_help.c:4337
+msgid "sequence_name"
+msgstr "시퀀스이름"
+
+#: sql_help.c:3906 sql_help.c:4355
+msgid "arg_name"
+msgstr "인자이름"
+
+#: sql_help.c:3907 sql_help.c:4356
+msgid "arg_type"
+msgstr "인자자료형"
+
+#: sql_help.c:3914 sql_help.c:4363
+msgid "loid"
+msgstr "큰개체_oid"
+
+#: sql_help.c:3945
+msgid "remote_schema"
+msgstr "원격_스키마"
+
+#: sql_help.c:3948
+msgid "local_schema"
+msgstr "로컬_스키마"
+
+#: sql_help.c:3983
+msgid "conflict_target"
+msgstr "충돌_대상"
+
+#: sql_help.c:3984
+msgid "conflict_action"
+msgstr "충돌_작업"
+
+#: sql_help.c:3987
+msgid "where conflict_target can be one of:"
+msgstr "충돌_대상 사용법:"
+
+#: sql_help.c:3988
+msgid "index_column_name"
+msgstr "인덱스칼럼이름"
+
+#: sql_help.c:3989
+msgid "index_expression"
+msgstr "인덱스표현식"
+
+#: sql_help.c:3992
+msgid "index_predicate"
+msgstr "부분인덱스식"
+
+#: sql_help.c:3994
+msgid "and conflict_action is one of:"
+msgstr "충돌_작업 사용법:"
+
+#: sql_help.c:4000 sql_help.c:4925
+msgid "sub-SELECT"
+msgstr "서브셀렉트"
+
+#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901
+msgid "channel"
+msgstr "채널"
+
+#: sql_help.c:4031
+msgid "lockmode"
+msgstr "잠금모드"
+
+#: sql_help.c:4032
+msgid "where lockmode is one of:"
+msgstr "잠금모드 사용법:"
+
+#: sql_help.c:4068
+msgid "target_table_name"
+msgstr "대상_테이블_이름"
+
+#: sql_help.c:4069
+msgid "target_alias"
+msgstr "대상_별칭"
+
+#: sql_help.c:4070
+msgid "data_source"
+msgstr "데이터_소스"
+
+#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091
+msgid "join_condition"
+msgstr "조인_조건"
+
+#: sql_help.c:4072
+msgid "when_clause"
+msgstr "when절"
+
+#: sql_help.c:4073
+msgid "where data_source is:"
+msgstr "데이터_소스 사용법:"
+
+#: sql_help.c:4074
+msgid "source_table_name"
+msgstr "원본_테이블_이름"
+
+#: sql_help.c:4075
+msgid "source_query"
+msgstr "소스_쿼리"
+
+#: sql_help.c:4076
+msgid "source_alias"
+msgstr "소스_별칭"
+
+#: sql_help.c:4077
+msgid "and when_clause is:"
+msgstr "when절 사용법:"
+
+#: sql_help.c:4079
+msgid "merge_update"
+msgstr "merge_update"
+
+#: sql_help.c:4080
+msgid "merge_delete"
+msgstr "merge_delete"
+
+#: sql_help.c:4082
+msgid "merge_insert"
+msgstr "merge_insert"
+
+#: sql_help.c:4083
+msgid "and merge_insert is:"
+msgstr "merge_insert 사용법:"
+
+#: sql_help.c:4086
+msgid "and merge_update is:"
+msgstr "merge_update 사용법:"
+
+#: sql_help.c:4091
+msgid "and merge_delete is:"
+msgstr "merge_delete 사용법:"
+
+#: sql_help.c:4132
+msgid "payload"
+msgstr "payload"
+
+#: sql_help.c:4159
+msgid "old_role"
+msgstr "기존롤"
+
+#: sql_help.c:4160
+msgid "new_role"
+msgstr "새롤"
+
+#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413
+msgid "savepoint_name"
+msgstr "savepoint_name"
+
+#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868
+#: sql_help.c:5048 sql_help.c:5106
+msgid "grouping_element"
+msgstr "grouping_element"
+
+#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050
+msgid "window_name"
+msgstr "윈도우이름"
+
+#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051
+msgid "window_definition"
+msgstr "원도우정의"
+
+#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660
+#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052
+#: sql_help.c:5066 sql_help.c:5110
+msgid "select"
+msgstr "select"
+
+#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059
+msgid "where from_item can be one of:"
+msgstr "from절_항목 사용법:"
+
+#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580
+#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833
+#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068
+#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087
+msgid "column_alias"
+msgstr "칼럼별칭"
+
+#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063
+msgid "sampling_method"
+msgstr "표본추출방법"
+
+#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065
+msgid "seed"
+msgstr "seed"
+
+#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870
+#: sql_help.c:5069 sql_help.c:5108
+msgid "with_query_name"
+msgstr "with절_쿼리_이름"
+
+#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841
+#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082
+#: sql_help.c:5085
+msgid "column_definition"
+msgstr "칼럼정의"
+
+#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857
+#: sql_help.c:5089 sql_help.c:5095
+msgid "join_type"
+msgstr "조인_종류"
+
+#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092
+msgid "join_column"
+msgstr "조인_칼럼"
+
+#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093
+msgid "join_using_alias"
+msgstr "조인_별칭"
+
+#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099
+msgid "and grouping_element can be one of:"
+msgstr "grouping_element 사용법:"
+
+#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107
+msgid "and with_query is:"
+msgstr "with절_쿼리 사용법:"
+
+#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111
+msgid "values"
+msgstr "값"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116
+msgid "search_seq_col_name"
+msgstr "search_seq_col_name"
+
+#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118
+msgid "cycle_mark_col_name"
+msgstr "cycle_mark_col_name"
+
+#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119
+msgid "cycle_mark_value"
+msgstr "cycle_mark_value"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120
+msgid "cycle_mark_default"
+msgstr "cycle_mark_default"
+
+#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121
+msgid "cycle_path_col_name"
+msgstr "cycle_path_col_name"
+
+#: sql_help.c:4653
+msgid "new_table"
+msgstr "새테이블"
+
+#: sql_help.c:4724
+msgid "snapshot_id"
+msgstr "스냅샷_id"
+
+#: sql_help.c:4984
+msgid "sort_expression"
+msgstr "정렬_표현식"
+
+#: sql_help.c:5128 sql_help.c:6112
+msgid "abort the current transaction"
+msgstr "현재 트랜잭션 중지함"
+
+#: sql_help.c:5134
+msgid "change the definition of an aggregate function"
+msgstr "집계함수 정보 바꾸기"
+
+#: sql_help.c:5140
+msgid "change the definition of a collation"
+msgstr "collation 정의 바꾸기"
+
+#: sql_help.c:5146
+msgid "change the definition of a conversion"
+msgstr "문자코드 변환규칙(conversion) 정보 바꾸기"
+
+#: sql_help.c:5152
+msgid "change a database"
+msgstr "데이터베이스 변경"
+
+#: sql_help.c:5158
+msgid "define default access privileges"
+msgstr "기본 접근 권한 정의"
+
+#: sql_help.c:5164
+msgid "change the definition of a domain"
+msgstr "도메인 정보 바꾸기"
+
+#: sql_help.c:5170
+msgid "change the definition of an event trigger"
+msgstr "트리거 정보 바꾸기"
+
+#: sql_help.c:5176
+msgid "change the definition of an extension"
+msgstr "확장모듈 정의 바꾸기"
+
+#: sql_help.c:5182
+msgid "change the definition of a foreign-data wrapper"
+msgstr "외부 데이터 래퍼 정의 바꾸기"
+
+#: sql_help.c:5188
+msgid "change the definition of a foreign table"
+msgstr "외부 테이블 정의 바꾸기"
+
+#: sql_help.c:5194
+msgid "change the definition of a function"
+msgstr "함수 정보 바꾸기"
+
+#: sql_help.c:5200
+msgid "change role name or membership"
+msgstr "롤 이름이나 맴버쉽 바꾸기"
+
+#: sql_help.c:5206
+msgid "change the definition of an index"
+msgstr "인덱스 정의 바꾸기"
+
+#: sql_help.c:5212
+msgid "change the definition of a procedural language"
+msgstr "procedural language 정보 바꾸기"
+
+#: sql_help.c:5218
+msgid "change the definition of a large object"
+msgstr "대형 객체 정의 바꾸기"
+
+#: sql_help.c:5224
+msgid "change the definition of a materialized view"
+msgstr "materialized 뷰 정의 바꾸기"
+
+#: sql_help.c:5230
+msgid "change the definition of an operator"
+msgstr "연산자 정의 바꾸기"
+
+#: sql_help.c:5236
+msgid "change the definition of an operator class"
+msgstr "연산자 클래스 정보 바꾸기"
+
+#: sql_help.c:5242
+msgid "change the definition of an operator family"
+msgstr "연산자 부류의 정의 바꾸기"
+
+#: sql_help.c:5248
+msgid "change the definition of a row-level security policy"
+msgstr "로우 단위 보안 정책의 정의 바꾸기"
+
+#: sql_help.c:5254
+msgid "change the definition of a procedure"
+msgstr "프로시져 정의 바꾸기"
+
+#: sql_help.c:5260
+msgid "change the definition of a publication"
+msgstr "발행 정보 바꾸기"
+
+#: sql_help.c:5266 sql_help.c:5368
+msgid "change a database role"
+msgstr "데이터베이스 롤 변경"
+
+#: sql_help.c:5272
+msgid "change the definition of a routine"
+msgstr "루틴 정의 바꾸기"
+
+#: sql_help.c:5278
+msgid "change the definition of a rule"
+msgstr "룰 정의 바꾸기"
+
+#: sql_help.c:5284
+msgid "change the definition of a schema"
+msgstr "스키마 이름 바꾸기"
+
+#: sql_help.c:5290
+msgid "change the definition of a sequence generator"
+msgstr "시퀀스 정보 바꾸기"
+
+#: sql_help.c:5296
+msgid "change the definition of a foreign server"
+msgstr "외부 서버 정의 바꾸기"
+
+#: sql_help.c:5302
+msgid "change the definition of an extended statistics object"
+msgstr "확장 통계정보 객체 정의 바꾸기"
+
+#: sql_help.c:5308
+msgid "change the definition of a subscription"
+msgstr "구독 정보 바꾸기"
+
+#: sql_help.c:5314
+msgid "change a server configuration parameter"
+msgstr "서버 환경 설정 매개 변수 바꾸기"
+
+#: sql_help.c:5320
+msgid "change the definition of a table"
+msgstr "테이블 정보 바꾸기"
+
+#: sql_help.c:5326
+msgid "change the definition of a tablespace"
+msgstr "테이블스페이스 정의 바꾸기"
+
+#: sql_help.c:5332
+msgid "change the definition of a text search configuration"
+msgstr "텍스트 검색 구성 정의 바꾸기"
+
+#: sql_help.c:5338
+msgid "change the definition of a text search dictionary"
+msgstr "텍스트 검색 사전 정의 바꾸기"
+
+#: sql_help.c:5344
+msgid "change the definition of a text search parser"
+msgstr "텍스트 검색 파서 정의 바꾸기"
+
+#: sql_help.c:5350
+msgid "change the definition of a text search template"
+msgstr "텍스트 검색 템플릿 정의 바꾸기"
+
+#: sql_help.c:5356
+msgid "change the definition of a trigger"
+msgstr "트리거 정보 바꾸기"
+
+#: sql_help.c:5362
+msgid "change the definition of a type"
+msgstr "자료형 정의 바꾸기"
+
+#: sql_help.c:5374
+msgid "change the definition of a user mapping"
+msgstr "사용자 매핑 정의 바꾸기"
+
+#: sql_help.c:5380
+msgid "change the definition of a view"
+msgstr "뷰 정의 바꾸기"
+
+#: sql_help.c:5386
+msgid "collect statistics about a database"
+msgstr "데이터베이스 사용 통계 정보를 갱신함"
+
+#: sql_help.c:5392 sql_help.c:6190
+msgid "start a transaction block"
+msgstr "트랜잭션 블럭을 시작함"
+
+#: sql_help.c:5398
+msgid "invoke a procedure"
+msgstr "프로시져 호출"
+
+#: sql_help.c:5404
+msgid "force a write-ahead log checkpoint"
+msgstr "트랜잭션 로그를 강제로 체크포인트 함"
+
+#: sql_help.c:5410
+msgid "close a cursor"
+msgstr "커서 닫기"
+
+#: sql_help.c:5416
+msgid "cluster a table according to an index"
+msgstr "지정한 인덱스 기준으로 테이블 자료를 다시 저장함"
+
+#: sql_help.c:5422
+msgid "define or change the comment of an object"
+msgstr "해당 개체의 코멘트를 지정하거나 수정함"
+
+#: sql_help.c:5428 sql_help.c:5986
+msgid "commit the current transaction"
+msgstr "현재 트랜잭션 commit"
+
+#: sql_help.c:5434
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "two-phase 커밋을 위해 먼저 준비된 트랜잭션을 커밋하세요."
+
+#: sql_help.c:5440
+msgid "copy data between a file and a table"
+msgstr "테이블과 파일 사이 자료를 복사함"
+
+#: sql_help.c:5446
+msgid "define a new access method"
+msgstr "새 접속 방법 정의"
+
+#: sql_help.c:5452
+msgid "define a new aggregate function"
+msgstr "새 집계합수 만들기"
+
+#: sql_help.c:5458
+msgid "define a new cast"
+msgstr "새 형변환자 만들기"
+
+#: sql_help.c:5464
+msgid "define a new collation"
+msgstr "새 collation 만들기"
+
+#: sql_help.c:5470
+msgid "define a new encoding conversion"
+msgstr "새 문자코드변환규칙(conversion) 만들기"
+
+#: sql_help.c:5476
+msgid "create a new database"
+msgstr "데이터베이스 생성"
+
+#: sql_help.c:5482
+msgid "define a new domain"
+msgstr "새 도메인 만들기"
+
+#: sql_help.c:5488
+msgid "define a new event trigger"
+msgstr "새 이벤트 트리거 만들기"
+
+#: sql_help.c:5494
+msgid "install an extension"
+msgstr "확장 모듈 설치"
+
+#: sql_help.c:5500
+msgid "define a new foreign-data wrapper"
+msgstr "새 외부 데이터 래퍼 정의"
+
+#: sql_help.c:5506
+msgid "define a new foreign table"
+msgstr "새 외부 테이블 정의"
+
+#: sql_help.c:5512
+msgid "define a new function"
+msgstr "새 함수 만들기"
+
+#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680
+msgid "define a new database role"
+msgstr "새 데이터베이스 롤 만들기"
+
+#: sql_help.c:5524
+msgid "define a new index"
+msgstr "새 인덱스 만들기"
+
+#: sql_help.c:5530
+msgid "define a new procedural language"
+msgstr "새 프로시주얼 언어 만들기"
+
+#: sql_help.c:5536
+msgid "define a new materialized view"
+msgstr "새 materialized 뷰 만들기"
+
+#: sql_help.c:5542
+msgid "define a new operator"
+msgstr "새 연산자 만들기"
+
+#: sql_help.c:5548
+msgid "define a new operator class"
+msgstr "새 연잔자 클래스 만들기"
+
+#: sql_help.c:5554
+msgid "define a new operator family"
+msgstr "새 연산자 부류 만들기"
+
+#: sql_help.c:5560
+msgid "define a new row-level security policy for a table"
+msgstr "특정 테이블에 로우 단위 보안 정책 정의"
+
+#: sql_help.c:5566
+msgid "define a new procedure"
+msgstr "새 프로시져 만들기"
+
+#: sql_help.c:5572
+msgid "define a new publication"
+msgstr "새 발행 만들기"
+
+#: sql_help.c:5584
+msgid "define a new rewrite rule"
+msgstr "새 룰(rule) 만들기"
+
+#: sql_help.c:5590
+msgid "define a new schema"
+msgstr "새 스키마(schema) 만들기"
+
+#: sql_help.c:5596
+msgid "define a new sequence generator"
+msgstr "새 시퀀스 만들기"
+
+#: sql_help.c:5602
+msgid "define a new foreign server"
+msgstr "새 외부 서버 정의"
+
+#: sql_help.c:5608
+msgid "define extended statistics"
+msgstr "새 확장 통계정보 만들기"
+
+#: sql_help.c:5614
+msgid "define a new subscription"
+msgstr "새 구독 만들기"
+
+#: sql_help.c:5620
+msgid "define a new table"
+msgstr "새 테이블 만들기"
+
+#: sql_help.c:5626 sql_help.c:6148
+msgid "define a new table from the results of a query"
+msgstr "쿼리 결과를 새 테이블로 만들기"
+
+#: sql_help.c:5632
+msgid "define a new tablespace"
+msgstr "새 테이블스페이스 만들기"
+
+#: sql_help.c:5638
+msgid "define a new text search configuration"
+msgstr "새 텍스트 검색 구성 정의"
+
+#: sql_help.c:5644
+msgid "define a new text search dictionary"
+msgstr "새 텍스트 검색 사전 정의"
+
+#: sql_help.c:5650
+msgid "define a new text search parser"
+msgstr "새 텍스트 검색 파서 정의"
+
+#: sql_help.c:5656
+msgid "define a new text search template"
+msgstr "새 텍스트 검색 템플릿 정의"
+
+#: sql_help.c:5662
+msgid "define a new transform"
+msgstr "새 transform 만들기"
+
+#: sql_help.c:5668
+msgid "define a new trigger"
+msgstr "새 트리거 만들기"
+
+#: sql_help.c:5674
+msgid "define a new data type"
+msgstr "새 자료형 만들기"
+
+#: sql_help.c:5686
+msgid "define a new mapping of a user to a foreign server"
+msgstr "사용자와 외부 서버 간의 새 매핑 정의"
+
+#: sql_help.c:5692
+msgid "define a new view"
+msgstr "새 view 만들기"
+
+#: sql_help.c:5698
+msgid "deallocate a prepared statement"
+msgstr "준비된 구문(prepared statement) 지우기"
+
+#: sql_help.c:5704
+msgid "define a cursor"
+msgstr "커서 지정"
+
+#: sql_help.c:5710
+msgid "delete rows of a table"
+msgstr "테이블의 자료 삭제"
+
+#: sql_help.c:5716
+msgid "discard session state"
+msgstr "세션 상태 삭제"
+
+#: sql_help.c:5722
+msgid "execute an anonymous code block"
+msgstr "임의 코드 블록 실행"
+
+#: sql_help.c:5728
+msgid "remove an access method"
+msgstr "접근 방법 삭제"
+
+#: sql_help.c:5734
+msgid "remove an aggregate function"
+msgstr "집계 함수 삭제"
+
+#: sql_help.c:5740
+msgid "remove a cast"
+msgstr "형변환자 삭제"
+
+#: sql_help.c:5746
+msgid "remove a collation"
+msgstr "collation 삭제"
+
+#: sql_help.c:5752
+msgid "remove a conversion"
+msgstr "문자코드 변환규칙(conversion) 삭제"
+
+#: sql_help.c:5758
+msgid "remove a database"
+msgstr "데이터베이스 삭제"
+
+#: sql_help.c:5764
+msgid "remove a domain"
+msgstr "도메인 삭제"
+
+#: sql_help.c:5770
+msgid "remove an event trigger"
+msgstr "이벤트 트리거 삭제"
+
+#: sql_help.c:5776
+msgid "remove an extension"
+msgstr "확장 모듈 삭제"
+
+#: sql_help.c:5782
+msgid "remove a foreign-data wrapper"
+msgstr "외부 데이터 래퍼 제거"
+
+#: sql_help.c:5788
+msgid "remove a foreign table"
+msgstr "외부 테이블 삭제"
+
+#: sql_help.c:5794
+msgid "remove a function"
+msgstr "함수 삭제"
+
+#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968
+msgid "remove a database role"
+msgstr "데이터베이스 롤 삭제"
+
+#: sql_help.c:5806
+msgid "remove an index"
+msgstr "인덱스 삭제"
+
+#: sql_help.c:5812
+msgid "remove a procedural language"
+msgstr "프로시주얼 언어 삭제"
+
+#: sql_help.c:5818
+msgid "remove a materialized view"
+msgstr "materialized 뷰 삭제"
+
+#: sql_help.c:5824
+msgid "remove an operator"
+msgstr "연산자 삭제"
+
+#: sql_help.c:5830
+msgid "remove an operator class"
+msgstr "연산자 클래스 삭제"
+
+#: sql_help.c:5836
+msgid "remove an operator family"
+msgstr "연산자 부류 삭제"
+
+#: sql_help.c:5842
+msgid "remove database objects owned by a database role"
+msgstr "데이터베이스 롤로 권한이 부여된 데이터베이스 개체들을 삭제하세요"
+
+#: sql_help.c:5848
+msgid "remove a row-level security policy from a table"
+msgstr "해당 테이블에 정의된 로우 단위 보안 정책 삭제"
+
+#: sql_help.c:5854
+msgid "remove a procedure"
+msgstr "프로시져 삭제"
+
+#: sql_help.c:5860
+msgid "remove a publication"
+msgstr "발행 삭제"
+
+#: sql_help.c:5872
+msgid "remove a routine"
+msgstr "루틴 삭제"
+
+#: sql_help.c:5878
+msgid "remove a rewrite rule"
+msgstr "룰(rule) 삭제"
+
+#: sql_help.c:5884
+msgid "remove a schema"
+msgstr "스키마(schema) 삭제"
+
+#: sql_help.c:5890
+msgid "remove a sequence"
+msgstr "시퀀스 삭제"
+
+#: sql_help.c:5896
+msgid "remove a foreign server descriptor"
+msgstr "외부 서버 설명자 제거"
+
+#: sql_help.c:5902
+msgid "remove extended statistics"
+msgstr "확장 통계정보 삭제"
+
+#: sql_help.c:5908
+msgid "remove a subscription"
+msgstr "구독 삭제"
+
+#: sql_help.c:5914
+msgid "remove a table"
+msgstr "테이블 삭제"
+
+#: sql_help.c:5920
+msgid "remove a tablespace"
+msgstr "테이블스페이스 삭제"
+
+#: sql_help.c:5926
+msgid "remove a text search configuration"
+msgstr "텍스트 검색 구성 제거"
+
+#: sql_help.c:5932
+msgid "remove a text search dictionary"
+msgstr "텍스트 검색 사전 제거"
+
+#: sql_help.c:5938
+msgid "remove a text search parser"
+msgstr "텍스트 검색 파서 제거"
+
+#: sql_help.c:5944
+msgid "remove a text search template"
+msgstr "텍스트 검색 템플릿 제거"
+
+#: sql_help.c:5950
+msgid "remove a transform"
+msgstr "transform 삭제"
+
+#: sql_help.c:5956
+msgid "remove a trigger"
+msgstr "트리거 삭제"
+
+#: sql_help.c:5962
+msgid "remove a data type"
+msgstr "자료형 삭제"
+
+#: sql_help.c:5974
+msgid "remove a user mapping for a foreign server"
+msgstr "외부 서버에 대한 사용자 매핑 제거"
+
+#: sql_help.c:5980
+msgid "remove a view"
+msgstr "뷰(view) 삭제"
+
+#: sql_help.c:5992
+msgid "execute a prepared statement"
+msgstr "준비된 구문(prepared statement) 실행"
+
+#: sql_help.c:5998
+msgid "show the execution plan of a statement"
+msgstr "쿼리 실행계획 보기"
+
+#: sql_help.c:6004
+msgid "retrieve rows from a query using a cursor"
+msgstr "해당 커서에서 자료 뽑기"
+
+#: sql_help.c:6010
+msgid "define access privileges"
+msgstr "액세스 권한 지정하기"
+
+#: sql_help.c:6016
+msgid "import table definitions from a foreign server"
+msgstr "외부 서버로부터 테이블 정의 가져오기"
+
+#: sql_help.c:6022
+msgid "create new rows in a table"
+msgstr "테이블 자료 삽입"
+
+#: sql_help.c:6028
+msgid "listen for a notification"
+msgstr "특정 서버 메시지 수신함"
+
+#: sql_help.c:6034
+msgid "load a shared library file"
+msgstr "공유 라이브러리 파일 로드"
+
+#: sql_help.c:6040
+msgid "lock a table"
+msgstr "테이블 잠금"
+
+#: sql_help.c:6046
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "조건부 테이블 insert, update, delete"
+
+#: sql_help.c:6052
+msgid "position a cursor"
+msgstr "커서 위치 옮기기"
+
+#: sql_help.c:6058
+msgid "generate a notification"
+msgstr "특정 서버 메시지 발생"
+
+#: sql_help.c:6064
+msgid "prepare a statement for execution"
+msgstr "준비된 구문(prepared statement) 만들기"
+
+#: sql_help.c:6070
+msgid "prepare the current transaction for two-phase commit"
+msgstr "two-phase 커밋을 위해 현재 트랜잭션을 준비함"
+
+#: sql_help.c:6076
+msgid "change the ownership of database objects owned by a database role"
+msgstr "데이터베이스 롤로 권한이 부여된 데이터베이스 개체들의 소유주 바꾸기"
+
+#: sql_help.c:6082
+msgid "replace the contents of a materialized view"
+msgstr "구체화된 뷰의 내용 수정"
+
+#: sql_help.c:6088
+msgid "rebuild indexes"
+msgstr "인덱스 다시 만들기"
+
+#: sql_help.c:6094
+msgid "destroy a previously defined savepoint"
+msgstr "이전 정의된 savepoint를 파기함"
+
+#: sql_help.c:6100
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "실시간 환경 변수값을 초기값으로 다시 지정"
+
+#: sql_help.c:6106
+msgid "remove access privileges"
+msgstr "액세스 권한 해제하기"
+
+#: sql_help.c:6118
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "two-phase 커밋을 위해 먼저 준비되었던 트랜잭션 실행취소하기"
+
+#: sql_help.c:6124
+msgid "roll back to a savepoint"
+msgstr "savepoint 파기하기"
+
+#: sql_help.c:6130
+msgid "define a new savepoint within the current transaction"
+msgstr "현재 트랜잭션에서 새로운 savepoint 만들기"
+
+#: sql_help.c:6136
+msgid "define or change a security label applied to an object"
+msgstr "해당 개체에 보안 라벨을 정의하거나 변경"
+
+#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232
+msgid "retrieve rows from a table or view"
+msgstr "테이블이나 뷰의 자료를 출력"
+
+#: sql_help.c:6154
+msgid "change a run-time parameter"
+msgstr "실시간 환경 변수값 바꾸기"
+
+#: sql_help.c:6160
+msgid "set constraint check timing for the current transaction"
+msgstr "현재 트랜잭션에서 제약조건 설정"
+
+#: sql_help.c:6166
+msgid "set the current user identifier of the current session"
+msgstr "현재 세션의 현재 사용자 식별자를 지정"
+
+#: sql_help.c:6172
+msgid ""
+"set the session user identifier and the current user identifier of the "
+"current session"
+msgstr "현재 세션의 사용자 인증을 지정함 - 사용자 지정"
+
+#: sql_help.c:6178
+msgid "set the characteristics of the current transaction"
+msgstr "현재 트랜잭션의 성질을 지정함"
+
+#: sql_help.c:6184
+msgid "show the value of a run-time parameter"
+msgstr "실시간 환경 변수값들을 보여줌"
+
+#: sql_help.c:6202
+msgid "empty a table or set of tables"
+msgstr "하나 또는 지정한 여러개의 테이블에서 모든 자료 지움"
+
+#: sql_help.c:6208
+msgid "stop listening for a notification"
+msgstr "특정 서버 메시지 수신 기능 끔"
+
+#: sql_help.c:6214
+msgid "update rows of a table"
+msgstr "테이블 자료 갱신"
+
+#: sql_help.c:6220
+msgid "garbage-collect and optionally analyze a database"
+msgstr "물리적인 자료 정리 작업 - 쓰레기값 청소"
+
+#: sql_help.c:6226
+msgid "compute a set of rows"
+msgstr "compute a set of rows"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 옵션은 비대화형 모드에서만 사용할 수 있음"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "\"%s\" 잠금파일을 열 수 없음: %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"도움말을 보려면 \"help\"를 입력하십시오.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "출력 매개 변수 \"%s\" 지정할 수 없음"
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "자세한 사항은 \"%s --help\" 명령으로 살펴보세요."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "추가 명령행 인자 \"%s\" 무시됨"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "실행 가능한 프로그램을 찾을 수 없음"
+
+#: tab-complete.c:5955
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"탭 자동완성용 쿼리 실패: %s\n"
+"사용한 쿼리:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "잘못된 \"%s\" 값을 \"%s\" 변수값으로 사용함: 불린형이어야 함"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "\"%s\" 값은 \"%s\" 변수값으로 사용할 수 없음; 정수형이어야 함"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "잘못된 변수 이름: \"%s\""
+
+#: variables.c:419
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"\"%s\" 값은 \"%s\" 변수값으로 사용할 수 없음\n"
+"사용할 수 있는 변수값: %s"
diff --git a/src/bin/psql/po/ru.po b/src/bin/psql/po/ru.po
new file mode 100644
index 0000000..3026961
--- /dev/null
+++ b/src/bin/psql/po/ru.po
@@ -0,0 +1,7067 @@
+# Russian message translation file for psql
+# Copyright (C) 2001-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Serguei A. Mokhov <mokhov@cs.concordia.ca>, 2001-2005.
+# Oleg Bartunov <oleg@sai.msu.su>, 2004-2005.
+# Sergey Burladyan <eshkinkot@gmail.com>, 2012.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023.
+# Maxim Yablokov <m.yablokov@postgrespro.ru>, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 09:09+0300\n"
+"PO-Revision-Date: 2023-02-03 15:12+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробности: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подсказка: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "не удалось определить текущий каталог: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "неверный исполняемый файл \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "не удалось прочитать исполняемый файл \"%s\""
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "не удалось найти запускаемый файл \"%s\""
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "не удалось перейти в каталог \"%s\": %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "не удалось прочитать символическую ссылку \"%s\": %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "ошибка в %s(): %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "нехватка памяти"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памяти\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "выяснить эффективный идентификатор пользователя (%ld) не удалось: %s"
+
+#: ../../common/username.c:45 command.c:575
+msgid "user does not exist"
+msgstr "пользователь не существует"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "распознать имя пользователя не удалось (код ошибки: %lu)"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "неисполняемая команда"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "команда не найдена"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "дочерний процесс завершился с кодом возврата %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "дочерний процесс прерван исключением 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "дочерний процесс завершён по сигналу %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "дочерний процесс завершился с нераспознанным состоянием %d"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Сигнал отмены отправлен\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Отправить сигнал отмены не удалось: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu строка)"
+msgstr[1] "(%lu строки)"
+msgstr[2] "(%lu строк)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Прервано\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr ""
+"Ошибка добавления заголовка таблицы: превышен предел числа столбцов (%d).\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr ""
+"Ошибка добавления ячейки в таблицу: превышен предел числа ячеек (%d).\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "неверный формат вывода (внутренняя ошибка): %d"
+
+#: ../../fe_utils/psqlscan.l:702
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "рекурсивное расширение переменной \"%s\" пропускается"
+
+#: ../../port/thread.c:100 ../../port/thread.c:136
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "найти локального пользователя по идентификатору (%d) не удалось: %s"
+
+#: ../../port/thread.c:105 ../../port/thread.c:141
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "локальный пользователь с ID %d не существует"
+
+#: command.c:232
+#, c-format
+msgid "invalid command \\%s"
+msgstr "неверная команда \\%s"
+
+#: command.c:234
+#, c-format
+msgid "Try \\? for help."
+msgstr "Введите \\? для получения справки."
+
+#: command.c:252
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: лишний аргумент \"%s\" пропущен"
+
+#: command.c:304
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr ""
+"команда \\%s игнорируется; добавьте \\endif или нажмите Ctrl-C для "
+"завершения текущего блока \\if"
+
+#: command.c:573
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "не удалось получить домашний каталог пользователя c ид. %ld: %s"
+
+#: command.c:592
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: не удалось перейти в каталог \"%s\": %m"
+
+#: command.c:617
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "В данный момент вы не подключены к базе данных.\n"
+
+#: command.c:627
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" on address \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"Вы подключены к базе данных \"%s\" как пользователь \"%s\" (адрес сервера "
+"\"%s\", порт \"%s\").\n"
+
+#: command.c:630
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"Вы подключены к базе данных \"%s\" как пользователь \"%s\" через сокет в "
+"\"%s\", порт \"%s\".\n"
+
+#: command.c:636
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address "
+"\"%s\") at port \"%s\".\n"
+msgstr ""
+"Вы подключены к базе данных \"%s\" как пользователь \"%s\" (сервер \"%s\": "
+"адрес \"%s\", порт \"%s\").\n"
+
+#: command.c:639
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port "
+"\"%s\".\n"
+msgstr ""
+"Вы подключены к базе данных \"%s\" как пользователь \"%s\" (сервер \"%s\", "
+"порт \"%s\").\n"
+
+#: command.c:1030 command.c:1125 command.c:2654
+#, c-format
+msgid "no query buffer"
+msgstr "нет буфера запросов"
+
+#: command.c:1063 command.c:5497
+#, c-format
+msgid "invalid line number: %s"
+msgstr "неверный номер строки: %s"
+
+#: command.c:1203
+msgid "No changes"
+msgstr "Изменений нет"
+
+#: command.c:1282
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr ""
+"%s: неверное название кодировки символов или не найдена процедура "
+"перекодировки"
+
+#: command.c:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5603
+#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100
+#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443
+#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1324
+msgid "There is no previous error."
+msgstr "Ошибки не было."
+
+#: command.c:1437
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: отсутствует правая скобка"
+
+#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989
+#: command.c:2173 command.c:2415 command.c:2621 command.c:2661
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "отсутствует необходимый аргумент \\%s"
+
+#: command.c:1782
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif не может находиться после \\else"
+
+#: command.c:1787
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif без соответствующего \\if"
+
+#: command.c:1851
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else не может находиться после \\else"
+
+#: command.c:1856
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else без соответствующего \\if"
+
+#: command.c:1896
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif без соответствующего \\if"
+
+#: command.c:2053
+msgid "Query buffer is empty."
+msgstr "Буфер запроса пуст."
+
+#: command.c:2096
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Введите новый пароль для пользователя \"%s\": "
+
+#: command.c:2100
+msgid "Enter it again: "
+msgstr "Повторите его: "
+
+#: command.c:2109
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Пароли не совпадают."
+
+#: command.c:2208
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: не удалось прочитать значение переменной"
+
+#: command.c:2311
+msgid "Query buffer reset (cleared)."
+msgstr "Буфер запроса сброшен (очищен)."
+
+#: command.c:2333
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "История записана в файл \"%s\".\n"
+
+#: command.c:2420
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: имя переменной окружения не может содержать знак \"=\""
+
+#: command.c:2468
+#, c-format
+msgid "function name is required"
+msgstr "требуется имя функции"
+
+#: command.c:2470
+#, c-format
+msgid "view name is required"
+msgstr "требуется имя представления"
+
+#: command.c:2593
+msgid "Timing is on."
+msgstr "Секундомер включён."
+
+#: command.c:2595
+msgid "Timing is off."
+msgstr "Секундомер выключен."
+
+#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952
+#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008
+#: command.c:4022 command.c:4049 command.c:4107 common.c:77 copy.c:331
+#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:3107 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Пароль: "
+
+#: command.c:3112 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Пароль пользователя %s: "
+
+#: command.c:3168
+#, c-format
+msgid ""
+"Do not give user, host, or port separately when using a connection string"
+msgstr ""
+"Не указывайте пользователя, сервер или порт отдельно, когда используете "
+"строку подключения"
+
+#: command.c:3203
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr ""
+"Нет подключения к базе, из которого можно было бы использовать параметры"
+
+#: command.c:3511
+#, c-format
+msgid "Previous connection kept"
+msgstr "Сохранено предыдущее подключение"
+
+#: command.c:3517
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3573
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"Сейчас вы подключены к базе данных \"%s\" как пользователь \"%s\" (адрес "
+"сервера \"%s\", порт \"%s\").\n"
+
+#: command.c:3576
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" "
+"at port \"%s\".\n"
+msgstr ""
+"Вы подключены к базе данных \"%s\" как пользователь \"%s\" через сокет в "
+"\"%s\", порт \"%s\".\n"
+
+#: command.c:3582
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" on host "
+"\"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr ""
+"Сейчас вы подключены к базе данных \"%s\" как пользователь \"%s\" (сервер "
+"\"%s\": адрес \"%s\", порт \"%s\").\n"
+
+#: command.c:3585
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"Вы подключены к базе данных \"%s\" как пользователь \"%s\" (сервер \"%s\", "
+"порт \"%s\").\n"
+
+#: command.c:3590
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Вы подключены к базе данных \"%s\" как пользователь \"%s\".\n"
+
+#: command.c:3630
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, сервер %s)\n"
+
+#: command.c:3643
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"ПРЕДУПРЕЖДЕНИЕ: %s имеет базовую версию %s, а сервер - %s.\n"
+" Часть функций psql может не работать.\n"
+
+#: command.c:3680
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "SSL-соединение (протокол: %s, шифр: %s, сжатие: %s)\n"
+
+#: command.c:3681 command.c:3682
+msgid "unknown"
+msgstr "неизвестно"
+
+#: command.c:3683 help.c:42
+msgid "off"
+msgstr "выкл."
+
+#: command.c:3683 help.c:42
+msgid "on"
+msgstr "вкл."
+
+#: command.c:3697
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "Соединение зашифровано GSSAPI\n"
+
+#: command.c:3717
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"ПРЕДУПРЕЖДЕНИЕ: Кодовая страница консоли (%u) отличается от основной\n"
+" страницы Windows (%u).\n"
+" 8-битовые (русские) символы могут отображаться некорректно.\n"
+" Подробнее об этом смотрите документацию psql, раздел\n"
+" \"Notes for Windows users\".\n"
+
+#: command.c:3822
+#, c-format
+msgid ""
+"environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a "
+"line number"
+msgstr ""
+"в переменной окружения PSQL_EDITOR_LINENUMBER_ARG должен быть указан номер "
+"строки"
+
+#: command.c:3851
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "не удалось запустить редактор \"%s\""
+
+#: command.c:3853
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "не удалось запустить /bin/sh"
+
+#: command.c:3903
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "не удалось найти временный каталог: %s"
+
+#: command.c:3930
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "не удалось открыть временный файл \"%s\": %m"
+
+#: command.c:4266
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr ""
+"\\pset: неоднозначному сокращению \"%s\" соответствует и \"%s\", и \"%s\""
+
+#: command.c:4286
+#, c-format
+msgid ""
+"\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-"
+"longtable, troff-ms, unaligned, wrapped"
+msgstr ""
+"\\pset: допустимые форматы: aligned, asciidoc, csv, html, latex, latex-"
+"longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4305
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: допустимые стили линий: ascii, old-ascii, unicode"
+
+#: command.c:4320
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: допустимые стили Unicode-линий границ: single, double"
+
+#: command.c:4335
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: допустимые стили Unicode-линий столбцов: single, double"
+
+#: command.c:4350
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: допустимые стили Unicode-линий заголовков: single, double"
+
+#: command.c:4393
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: символ csv_fieldsep должен быть однобайтовым"
+
+#: command.c:4398
+#, c-format
+msgid ""
+"\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage "
+"return"
+msgstr ""
+"\\pset: в качестве csv_fieldsep нельзя выбрать символ кавычек, новой строки "
+"или возврата каретки"
+
+#: command.c:4535 command.c:4723
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "неизвестный параметр \\pset: %s"
+
+#: command.c:4555
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Стиль границ: %d.\n"
+
+#: command.c:4561
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "Ширина вывода сброшена.\n"
+
+#: command.c:4563
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "Ширина вывода: %d.\n"
+
+#: command.c:4570
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Расширенный вывод включён.\n"
+
+#: command.c:4572
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "Расширенный вывод применяется автоматически.\n"
+
+#: command.c:4574
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Расширенный вывод выключен.\n"
+
+#: command.c:4580
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "Разделитель полей для CSV: \"%s\".\n"
+
+#: command.c:4588 command.c:4596
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "Разделитель полей - нулевой байт.\n"
+
+#: command.c:4590
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "Разделитель полей: \"%s\".\n"
+
+#: command.c:4603
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Строка итогов включена.\n"
+
+#: command.c:4605
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Строка итогов выключена.\n"
+
+#: command.c:4611
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Формат вывода: %s.\n"
+
+#: command.c:4617
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Установлен стиль линий: %s.\n"
+
+#: command.c:4624
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Null выводится как: \"%s\".\n"
+
+#: command.c:4632
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "Локализованный вывод чисел включён.\n"
+
+#: command.c:4634
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "Локализованный вывод чисел выключен.\n"
+
+#: command.c:4641
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "Постраничник используется для вывода длинного текста.\n"
+
+#: command.c:4643
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "Постраничник используется всегда.\n"
+
+#: command.c:4645
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "Постраничник выключен.\n"
+
+#: command.c:4651
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "Постраничник не будет использоваться, если строк меньше %d\n"
+msgstr[1] "Постраничник не будет использоваться, если строк меньше %d\n"
+msgstr[2] "Постраничник не будет использоваться, если строк меньше %d\n"
+
+#: command.c:4661 command.c:4671
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "Разделитель записей - нулевой байт.\n"
+
+#: command.c:4663
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "Разделитель записей: <новая строка>.\n"
+
+#: command.c:4665
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "Разделитель записей: \"%s\".\n"
+
+#: command.c:4678
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Атрибуты HTML-таблицы: \"%s\".\n"
+
+#: command.c:4681
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Атрибуты HTML-таблицы не заданы.\n"
+
+#: command.c:4688
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Заголовок: \"%s\".\n"
+
+#: command.c:4690
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Заголовок не задан.\n"
+
+#: command.c:4697
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "Режим вывода только кортежей включён.\n"
+
+#: command.c:4699
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "Режим вывода только кортежей выключен.\n"
+
+#: command.c:4705
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Стиль Unicode-линий границ: \"%s\".\n"
+
+#: command.c:4711
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Стиль Unicode-линий столбцов: \"%s\".\n"
+
+#: command.c:4717
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Стиль Unicode-линий границ: \"%s\".\n"
+
+#: command.c:4950
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: ошибка"
+
+#: command.c:4984
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch нельзя использовать с пустым запросом"
+
+#: command.c:5016
+#, c-format
+msgid "could not set timer: %m"
+msgstr "не удалось установить таймер: %m"
+
+#: command.c:5084
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (обновление: %g с)\n"
+
+#: command.c:5087
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (обновление: %g с)\n"
+
+#: command.c:5148
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "сбой при ожидании сигналов: %m"
+
+#: command.c:5206 command.c:5213 common.c:572 common.c:579 common.c:1063
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* ЗАПРОС *********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5392
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" — не представление"
+
+#: command.c:5408
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "не удалось разобрать массив reloptions"
+
+#: common.c:166
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "экранирование строк не работает без подключения к БД"
+
+#: common.c:207
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr ""
+"аргумент команды оболочки содержит символ новой строки или перевода каретки: "
+"\"%s\""
+
+#: common.c:311
+#, c-format
+msgid "connection to server was lost"
+msgstr "подключение к серверу было потеряно"
+
+#: common.c:315
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "Подключение к серверу потеряно. Попытка восстановления "
+
+#: common.c:320
+#, c-format
+msgid "Failed.\n"
+msgstr "неудачна.\n"
+
+#: common.c:337
+#, c-format
+msgid "Succeeded.\n"
+msgstr "удачна.\n"
+
+#: common.c:389 common.c:1001
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "неожиданное значение PQresultStatus: %d"
+
+#: common.c:511
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Время: %.3f мс\n"
+
+#: common.c:526
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Время: %.3f мс (%02d:%06.3f)\n"
+
+#: common.c:535
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Время: %.3f мс (%02d:%02d:%06.3f)\n"
+
+#: common.c:542
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Время: %.3f мс (%.0f д. %02d:%02d:%06.3f)\n"
+
+#: common.c:566 common.c:623 common.c:1034 describe.c:6135
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "В данный момент вы не подключены к базе данных."
+
+#: common.c:654
+#, c-format
+msgid ""
+"Asynchronous notification \"%s\" with payload \"%s\" received from server "
+"process with PID %d.\n"
+msgstr ""
+"Получено асинхронное уведомление \"%s\" с сообщением-нагрузкой \"%s\" от "
+"серверного процесса с PID %d.\n"
+
+#: common.c:657
+#, c-format
+msgid ""
+"Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr ""
+"Получено асинхронное уведомление \"%s\" от серверного процесса с PID %d.\n"
+
+#: common.c:688
+#, c-format
+msgid "could not print result table: %m"
+msgstr "не удалось вывести таблицу результатов: %m"
+
+#: common.c:708
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "сервер не возвратил строк для \\gset"
+
+#: common.c:713
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "сервер возвратил больше одной строки для \\gset"
+
+#: common.c:731
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "попытка выполнить \\gset со специальной переменной \"%s\" игнорируется"
+
+#: common.c:1043
+#, c-format
+msgid ""
+"***(Single step mode: verify "
+"command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to "
+"cancel)********************\n"
+msgstr ""
+"***(Пошаговый режим: проверка "
+"команды)******************************************\n"
+"%s\n"
+"***(Enter - выполнение; x и Enter - отмена)**************\n"
+
+#: common.c:1126
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "ОПЕРАТОР: %s"
+
+#: common.c:1162
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "неожиданное состояние транзакции (%d)"
+
+#: common.c:1303 describe.c:2020
+msgid "Column"
+msgstr "Столбец"
+
+#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037
+#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021
+#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504
+#: describe.c:5767
+msgid "Type"
+msgstr "Тип"
+
+#: common.c:1353
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "Команда не выдала результат, либо в результате нет столбцов.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "укажите аргументы \\copy"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: ошибка разбора аргумента \"%s\""
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: ошибка разбора в конце строки"
+
+#: copy.c:328
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "не удалось выполнить команду \"%s\": %m"
+
+#: copy.c:344
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не удалось получить информацию о файле \"%s\": %m"
+
+#: copy.c:348
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "COPY FROM/TO не может работать с каталогом (%s)"
+
+#: copy.c:385
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "не удалось закрыть канал сообщений с внешней командой: %m"
+
+#: copy.c:390
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: copy.c:453 copy.c:463
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "не удалось записать данные COPY: %m"
+
+#: copy.c:469
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "ошибка передачи данных COPY: %s"
+
+#: copy.c:530
+msgid "canceled by user"
+msgstr "отменено пользователем"
+
+#: copy.c:541
+msgid ""
+"Enter data to be copied followed by a newline.\n"
+"End with a backslash and a period on a line by itself, or an EOF signal."
+msgstr ""
+"Вводите данные для копирования, разделяя строки переводом строки.\n"
+"Закончите ввод строкой '\\.' или сигналом EOF."
+
+#: copy.c:684
+msgid "aborted because of read failure"
+msgstr "прерывание из-за ошибки чтения"
+
+#: copy.c:718
+msgid "trying to exit copy mode"
+msgstr "попытка выйти из режима копирования"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: оператор не возвратил результирующий набор"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: запрос должен возвращать минимум три столбца"
+
+#: crosstabview.c:156
+#, c-format
+msgid ""
+"\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr ""
+"\\crosstabview: для вертикальных и горизонтальных заголовков должны "
+"задаваться разные столбцы"
+
+#: crosstabview.c:172
+#, c-format
+msgid ""
+"\\crosstabview: data column must be specified when query returns more than "
+"three columns"
+msgstr ""
+"\\crosstabview: когда запрос возвращает больше трёх столбцов, необходимо "
+"указать столбец данных"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: превышен максимум числа столбцов (%d)"
+
+#: crosstabview.c:397
+#, c-format
+msgid ""
+"\\crosstabview: query result contains multiple data values for row \"%s\", "
+"column \"%s\""
+msgstr ""
+"\\crosstabview: в результатах запроса содержится несколько значений данных "
+"для строки \"%s\", столбца \"%s\""
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: номер столбца %d выходит за рамки диапазона 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: неоднозначное имя столбца: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: имя столбца не найдено: \"%s\""
+
+#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029
+#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090
+#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866
+#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420
+#: describe.c:5477 describe.c:5881 describe.c:5959
+msgid "Schema"
+msgstr "Схема"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636
+#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258
+#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341
+#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867
+#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410
+#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748
+#: describe.c:5957 describe.c:6186 describe.c:6494
+msgid "Name"
+msgstr "Имя"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "Тип данных результата"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "Типы данных аргументов"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423
+#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041
+#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280
+#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777
+#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248
+#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422
+#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895
+#: describe.c:5960 describe.c:6992
+msgid "Description"
+msgstr "Описание"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "Список агрегатных функций"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "Сервер (версия %s) не поддерживает методы доступа."
+
+#: describe.c:168
+msgid "Index"
+msgstr "Индекс"
+
+#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882
+msgid "Table"
+msgstr "Таблица"
+
+#: describe.c:177 describe.c:5679
+msgid "Handler"
+msgstr "Обработчик"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "Список методов доступа"
+
+#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181
+#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588
+#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187
+#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718
+#: describe.c:6980
+msgid "Owner"
+msgstr "Владелец"
+
+#: describe.c:231
+msgid "Location"
+msgstr "Расположение"
+
+#: describe.c:241 describe.c:3509
+msgid "Options"
+msgstr "Параметры"
+
+#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934
+msgid "Size"
+msgstr "Размер"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "Список табличных пространств"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df принимает в качестве параметров только [anptwS+]"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df не поддерживает параметр \"%c\" с сервером версии %s"
+
+# well-spelled: агр
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "агр."
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "оконная"
+
+#: describe.c:356
+msgid "proc"
+msgstr "проц."
+
+# well-spelled: функ
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "функ."
+
+#: describe.c:374 describe.c:1390
+msgid "trigger"
+msgstr "триггерная"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "постоянная"
+
+#: describe.c:387
+msgid "stable"
+msgstr "стабильная"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "изменчивая"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "Изменчивость"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "ограниченная"
+
+#: describe.c:398
+msgid "safe"
+msgstr "безопасная"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "небезопасная"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "Параллельность"
+
+#: describe.c:405
+msgid "definer"
+msgstr "определившего"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "вызывающего"
+
+#: describe.c:407
+msgid "Security"
+msgstr "Безопасность"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Язык"
+
+#: describe.c:416 describe.c:420
+msgid "Source code"
+msgstr "Исходный код"
+
+#: describe.c:594
+msgid "List of functions"
+msgstr "Список функций"
+
+#: describe.c:657
+msgid "Internal name"
+msgstr "Внутреннее имя"
+
+#: describe.c:659
+msgid "Elements"
+msgstr "Элементы"
+
+#: describe.c:711
+msgid "List of data types"
+msgstr "Список типов данных"
+
+#: describe.c:814
+msgid "Left arg type"
+msgstr "Тип левого аргумента"
+
+#: describe.c:815
+msgid "Right arg type"
+msgstr "Тип правого аргумента"
+
+#: describe.c:816
+msgid "Result type"
+msgstr "Результирующий тип"
+
+#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247
+#: describe.c:6909 describe.c:6913
+msgid "Function"
+msgstr "Функция"
+
+#: describe.c:902
+msgid "List of operators"
+msgstr "Список операторов"
+
+#: describe.c:938
+msgid "Encoding"
+msgstr "Кодировка"
+
+#: describe.c:939 describe.c:4868
+msgid "Collate"
+msgstr "LC_COLLATE"
+
+#: describe.c:940 describe.c:4869
+msgid "Ctype"
+msgstr "LC_CTYPE"
+
+#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878
+msgid "ICU Locale"
+msgstr "локаль ICU"
+
+#: describe.c:946 describe.c:952
+msgid "Locale Provider"
+msgstr "Провайдер локали"
+
+#: describe.c:964
+msgid "Tablespace"
+msgstr "Табл. пространство"
+
+#: describe.c:990
+msgid "List of databases"
+msgstr "Список баз данных"
+
+#: describe.c:1031 describe.c:1184 describe.c:3882
+msgid "table"
+msgstr "таблица"
+
+#: describe.c:1032 describe.c:3883
+msgid "view"
+msgstr "представление"
+
+#: describe.c:1033 describe.c:3884
+msgid "materialized view"
+msgstr "материализованное представление"
+
+#: describe.c:1034 describe.c:1186 describe.c:3886
+msgid "sequence"
+msgstr "последовательность"
+
+#: describe.c:1035 describe.c:3888
+msgid "foreign table"
+msgstr "сторонняя таблица"
+
+#: describe.c:1036 describe.c:3889 describe.c:4101
+msgid "partitioned table"
+msgstr "секционированная таблица"
+
+#: describe.c:1047
+msgid "Column privileges"
+msgstr "Права для столбцов"
+
+#: describe.c:1078 describe.c:1112
+msgid "Policies"
+msgstr "Политики"
+
+#: describe.c:1143 describe.c:4510 describe.c:6577
+msgid "Access privileges"
+msgstr "Права доступа"
+
+#: describe.c:1188
+msgid "function"
+msgstr "функция"
+
+#: describe.c:1190
+msgid "type"
+msgstr "тип"
+
+#: describe.c:1192
+msgid "schema"
+msgstr "схема"
+
+#: describe.c:1215
+msgid "Default access privileges"
+msgstr "Права доступа по умолчанию"
+
+#: describe.c:1259
+msgid "Object"
+msgstr "Объект"
+
+#: describe.c:1273
+msgid "table constraint"
+msgstr "ограничение таблицы"
+
+#: describe.c:1297
+msgid "domain constraint"
+msgstr "ограничение домена"
+
+#: describe.c:1321
+msgid "operator class"
+msgstr "класс операторов"
+
+#: describe.c:1345
+msgid "operator family"
+msgstr "семейство операторов"
+
+#: describe.c:1368
+msgid "rule"
+msgstr "правило"
+
+#: describe.c:1414
+msgid "Object descriptions"
+msgstr "Описание объекта"
+
+#: describe.c:1479 describe.c:4007
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Отношение \"%s\" не найдено."
+
+#: describe.c:1482 describe.c:4010
+#, c-format
+msgid "Did not find any relations."
+msgstr "Отношения не найдены."
+
+#: describe.c:1678
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Отношение с OID %s не найдено."
+
+#: describe.c:1726 describe.c:1750
+msgid "Start"
+msgstr "Начальное_значение"
+
+#: describe.c:1727 describe.c:1751
+msgid "Minimum"
+msgstr "Минимум"
+
+#: describe.c:1728 describe.c:1752
+msgid "Maximum"
+msgstr "Максимум"
+
+#: describe.c:1729 describe.c:1753
+msgid "Increment"
+msgstr "Шаг"
+
+#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426
+#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620
+msgid "yes"
+msgstr "да"
+
+#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426
+#: describe.c:4768 describe.c:4892 describe.c:6621
+msgid "no"
+msgstr "нет"
+
+#: describe.c:1732 describe.c:1756
+msgid "Cycles?"
+msgstr "Зацикливается?"
+
+#: describe.c:1733 describe.c:1757
+msgid "Cache"
+msgstr "Кешируется"
+
+#: describe.c:1798
+#, c-format
+msgid "Owned by: %s"
+msgstr "Владелец: %s"
+
+#: describe.c:1802
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Последовательность для столбца идентификации: %s"
+
+#: describe.c:1810
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "Нежурналируемая последовательность \"%s.%s\""
+
+#: describe.c:1813
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Последовательность \"%s.%s\""
+
+#: describe.c:1957
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Нежурналируемая таблица \"%s.%s\""
+
+#: describe.c:1960
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Таблица \"%s.%s\""
+
+#: describe.c:1964
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Представление \"%s.%s\""
+
+#: describe.c:1969
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Нежурналируемое материализованное представление \"%s.%s\""
+
+#: describe.c:1972
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Материализованное представление \"%s.%s\""
+
+#: describe.c:1977
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Нежурналируемый индекс \"%s.%s\""
+
+#: describe.c:1980
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Индекс \"%s.%s\""
+
+#: describe.c:1985
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Нежурналируемый секционированный индекс \"%s.%s\""
+
+#: describe.c:1988
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Секционированный индекс \"%s.%s\""
+
+#: describe.c:1992
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST-таблица \"%s.%s\""
+
+#: describe.c:1996
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Составной тип \"%s.%s\""
+
+#: describe.c:2000
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Сторонняя таблица \"%s.%s\""
+
+#: describe.c:2005
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Нежурналируемая секционированная таблица \"%s.%s\""
+
+#: describe.c:2008
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Секционированная таблица \"%s.%s\""
+
+#: describe.c:2024 describe.c:4343
+msgid "Collation"
+msgstr "Правило сортировки"
+
+#: describe.c:2025 describe.c:4344
+msgid "Nullable"
+msgstr "Допустимость NULL"
+
+#: describe.c:2026 describe.c:4345
+msgid "Default"
+msgstr "По умолчанию"
+
+#: describe.c:2029
+msgid "Key?"
+msgstr "Ключевой?"
+
+#: describe.c:2031 describe.c:4665 describe.c:4676
+msgid "Definition"
+msgstr "Определение"
+
+# well-spelled: ОСД
+#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835
+#: describe.c:5894
+msgid "FDW options"
+msgstr "Параметры ОСД"
+
+#: describe.c:2035
+msgid "Storage"
+msgstr "Хранилище"
+
+#: describe.c:2037
+msgid "Compression"
+msgstr "Сжатие"
+
+#: describe.c:2039
+msgid "Stats target"
+msgstr "Цель для статистики"
+
+#: describe.c:2175
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "Секция: %s %s%s"
+
+#: describe.c:2188
+msgid "No partition constraint"
+msgstr "Нет ограничения секции"
+
+#: describe.c:2190
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Ограничение секции: %s"
+
+#: describe.c:2214
+#, c-format
+msgid "Partition key: %s"
+msgstr "Ключ разбиения: %s"
+
+#: describe.c:2240
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Принадлежит таблице: \"%s.%s\""
+
+#: describe.c:2309
+msgid "primary key, "
+msgstr "первичный ключ, "
+
+#: describe.c:2312
+msgid "unique"
+msgstr "уникальный"
+
+#: describe.c:2314
+msgid " nulls not distinct"
+msgstr " null не различаются"
+
+#: describe.c:2315
+msgid ", "
+msgstr ", "
+
+#: describe.c:2322
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "для таблицы \"%s.%s\""
+
+#: describe.c:2326
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", предикат (%s)"
+
+#: describe.c:2329
+msgid ", clustered"
+msgstr ", кластеризованный"
+
+#: describe.c:2332
+msgid ", invalid"
+msgstr ", нерабочий"
+
+#: describe.c:2335
+msgid ", deferrable"
+msgstr ", откладываемый"
+
+#: describe.c:2338
+msgid ", initially deferred"
+msgstr ", изначально отложенный"
+
+#: describe.c:2341
+msgid ", replica identity"
+msgstr ", репликационный"
+
+#: describe.c:2395
+msgid "Indexes:"
+msgstr "Индексы:"
+
+#: describe.c:2478
+msgid "Check constraints:"
+msgstr "Ограничения-проверки:"
+
+# TO REWVIEW
+#: describe.c:2546
+msgid "Foreign-key constraints:"
+msgstr "Ограничения внешнего ключа:"
+
+#: describe.c:2609
+msgid "Referenced by:"
+msgstr "Ссылки извне:"
+
+#: describe.c:2659
+msgid "Policies:"
+msgstr "Политики:"
+
+#: describe.c:2662
+msgid "Policies (forced row security enabled):"
+msgstr "Политики (усиленная защита строк включена):"
+
+#: describe.c:2665
+msgid "Policies (row security enabled): (none)"
+msgstr "Политики (защита строк включена): (Нет)"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Политики (усиленная защита строк включена): (Нет)"
+
+#: describe.c:2671
+msgid "Policies (row security disabled):"
+msgstr "Политики (защита строк выключена):"
+
+#: describe.c:2731 describe.c:2835
+msgid "Statistics objects:"
+msgstr "Объекты статистики:"
+
+#: describe.c:2937 describe.c:3090
+msgid "Rules:"
+msgstr "Правила:"
+
+#: describe.c:2940
+msgid "Disabled rules:"
+msgstr "Отключённые правила:"
+
+#: describe.c:2943
+msgid "Rules firing always:"
+msgstr "Правила, срабатывающие всегда:"
+
+#: describe.c:2946
+msgid "Rules firing on replica only:"
+msgstr "Правила, срабатывающие только в реплике:"
+
+#: describe.c:3025 describe.c:5030
+msgid "Publications:"
+msgstr "Публикации:"
+
+#: describe.c:3073
+msgid "View definition:"
+msgstr "Определение представления:"
+
+#: describe.c:3236
+msgid "Triggers:"
+msgstr "Триггеры:"
+
+#: describe.c:3239
+msgid "Disabled user triggers:"
+msgstr "Отключённые пользовательские триггеры:"
+
+#: describe.c:3242
+msgid "Disabled internal triggers:"
+msgstr "Отключённые внутренние триггеры:"
+
+#: describe.c:3245
+msgid "Triggers firing always:"
+msgstr "Триггеры, срабатывающие всегда:"
+
+#: describe.c:3248
+msgid "Triggers firing on replica only:"
+msgstr "Триггеры, срабатывающие только в реплике:"
+
+#: describe.c:3319
+#, c-format
+msgid "Server: %s"
+msgstr "Сервер: %s"
+
+# well-spelled: ОСД
+#: describe.c:3327
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "Параметр ОСД: (%s)"
+
+#: describe.c:3348
+msgid "Inherits"
+msgstr "Наследует"
+
+#: describe.c:3413
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "Число секций: %d"
+
+#: describe.c:3422
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Число секций: %d (чтобы просмотреть их, введите \\d+)"
+
+#: describe.c:3424
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Дочерних таблиц: %d (чтобы просмотреть и их, воспользуйтесь \\d+)"
+
+#: describe.c:3431
+msgid "Child tables"
+msgstr "Дочерние таблицы"
+
+#: describe.c:3431
+msgid "Partitions"
+msgstr "Секции"
+
+#: describe.c:3462
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Типизированная таблица типа: %s"
+
+#: describe.c:3478
+msgid "Replica Identity"
+msgstr "Идентификация реплики"
+
+#: describe.c:3491
+msgid "Has OIDs: yes"
+msgstr "Содержит OID: да"
+
+#: describe.c:3500
+#, c-format
+msgid "Access method: %s"
+msgstr "Метод доступа: %s"
+
+#: describe.c:3579
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "Табличное пространство: \"%s\""
+
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:3591
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", табл. пространство \"%s\""
+
+#: describe.c:3668
+msgid "List of roles"
+msgstr "Список ролей"
+
+#: describe.c:3670
+msgid "Role name"
+msgstr "Имя роли"
+
+#: describe.c:3671
+msgid "Attributes"
+msgstr "Атрибуты"
+
+#: describe.c:3673
+msgid "Member of"
+msgstr "Член ролей"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "Суперпользователь"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "Не наследуется"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "Создаёт роли"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "Создаёт БД"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "Вход запрещён"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "Репликация"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "Пропускать RLS"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "Нет подключений"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d подключение"
+msgstr[1] "%d подключения"
+msgstr[2] "%d подключений"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Пароль действует до "
+
+#: describe.c:3777
+msgid "Role"
+msgstr "Роль"
+
+#: describe.c:3778
+msgid "Database"
+msgstr "БД"
+
+#: describe.c:3779
+msgid "Settings"
+msgstr "Параметры"
+
+#: describe.c:3803
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "Параметры для роли \"%s\" и базы данных \"%s\" не найдены."
+
+#: describe.c:3806
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Параметры для роли \"%s\" не найдены."
+
+#: describe.c:3809
+#, c-format
+msgid "Did not find any settings."
+msgstr "Никакие параметры не найдены."
+
+#: describe.c:3814
+msgid "List of settings"
+msgstr "Список параметров"
+
+#: describe.c:3885
+msgid "index"
+msgstr "индекс"
+
+#: describe.c:3887
+msgid "TOAST table"
+msgstr "TOAST-таблица"
+
+#: describe.c:3890 describe.c:4102
+msgid "partitioned index"
+msgstr "секционированный индекс"
+
+#: describe.c:3910
+msgid "permanent"
+msgstr "постоянное"
+
+#: describe.c:3911
+msgid "temporary"
+msgstr "временное"
+
+#: describe.c:3912
+msgid "unlogged"
+msgstr "нежурналируемое"
+
+#: describe.c:3913
+msgid "Persistence"
+msgstr "Хранение"
+
+#: describe.c:3929
+msgid "Access method"
+msgstr "Метод доступа"
+
+#: describe.c:4015
+msgid "List of relations"
+msgstr "Список отношений"
+
+#: describe.c:4063
+#, c-format
+msgid ""
+"The server (version %s) does not support declarative table partitioning."
+msgstr ""
+"Сервер (версия %s) не поддерживает декларативное секционирование таблиц."
+
+#: describe.c:4074
+msgid "List of partitioned indexes"
+msgstr "Список секционированных индексов"
+
+#: describe.c:4076
+msgid "List of partitioned tables"
+msgstr "Список секционированных таблиц"
+
+#: describe.c:4080
+msgid "List of partitioned relations"
+msgstr "Список секционированных отношений"
+
+#: describe.c:4111
+msgid "Parent name"
+msgstr "Имя родителя"
+
+#: describe.c:4124
+msgid "Leaf partition size"
+msgstr "Размер конечной секции"
+
+#: describe.c:4127 describe.c:4133
+msgid "Total size"
+msgstr "Общий размер"
+
+#: describe.c:4258
+msgid "Trusted"
+msgstr "Доверенный"
+
+#: describe.c:4267
+msgid "Internal language"
+msgstr "Внутренний язык"
+
+#: describe.c:4268
+msgid "Call handler"
+msgstr "Обработчик вызова"
+
+#: describe.c:4269 describe.c:5680
+msgid "Validator"
+msgstr "Функция проверки"
+
+#: describe.c:4270
+msgid "Inline handler"
+msgstr "Обработчик внедрённого кода"
+
+#: describe.c:4305
+msgid "List of languages"
+msgstr "Список языков"
+
+#: describe.c:4346
+msgid "Check"
+msgstr "Проверка"
+
+#: describe.c:4390
+msgid "List of domains"
+msgstr "Список доменов"
+
+#: describe.c:4424
+msgid "Source"
+msgstr "Источник"
+
+#: describe.c:4425
+msgid "Destination"
+msgstr "Назначение"
+
+#: describe.c:4427 describe.c:6622
+msgid "Default?"
+msgstr "По умолчанию?"
+
+#: describe.c:4469
+msgid "List of conversions"
+msgstr "Список преобразований"
+
+#: describe.c:4497
+msgid "Parameter"
+msgstr "Параметр"
+
+#: describe.c:4498
+msgid "Value"
+msgstr "Значение"
+
+#: describe.c:4505
+msgid "Context"
+msgstr "Контекст"
+
+#: describe.c:4538
+msgid "List of configuration parameters"
+msgstr "Список параметров конфигурации"
+
+#: describe.c:4540
+msgid "List of non-default configuration parameters"
+msgstr "Список изменённых параметров конфигурации"
+
+#: describe.c:4567
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "Сервер (версия %s) не поддерживает событийные триггеры."
+
+#: describe.c:4587
+msgid "Event"
+msgstr "Событие"
+
+#: describe.c:4589
+msgid "enabled"
+msgstr "включён"
+
+#: describe.c:4590
+msgid "replica"
+msgstr "реплика"
+
+#: describe.c:4591
+msgid "always"
+msgstr "всегда"
+
+#: describe.c:4592
+msgid "disabled"
+msgstr "отключён"
+
+#: describe.c:4593 describe.c:6496
+msgid "Enabled"
+msgstr "Включён"
+
+#: describe.c:4595
+msgid "Tags"
+msgstr "Теги"
+
+#: describe.c:4619
+msgid "List of event triggers"
+msgstr "Список событийных триггеров"
+
+#: describe.c:4646
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "Сервер (версия %s) не поддерживает расширенные статистики."
+
+#: describe.c:4683
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4684
+msgid "Dependencies"
+msgstr "Зависимости"
+
+#: describe.c:4694
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4718
+msgid "List of extended statistics"
+msgstr "Список расширенных статистик"
+
+#: describe.c:4745
+msgid "Source type"
+msgstr "Исходный тип"
+
+#: describe.c:4746
+msgid "Target type"
+msgstr "Целевой тип"
+
+#: describe.c:4770
+msgid "in assignment"
+msgstr "в присваивании"
+
+#: describe.c:4772
+msgid "Implicit?"
+msgstr "Неявное?"
+
+#: describe.c:4831
+msgid "List of casts"
+msgstr "Список приведений типов"
+
+#: describe.c:4883 describe.c:4887
+msgid "Provider"
+msgstr "Провайдер"
+
+#: describe.c:4893 describe.c:4898
+msgid "Deterministic?"
+msgstr "Детерминированное?"
+
+#: describe.c:4938
+msgid "List of collations"
+msgstr "Список правил сортировки"
+
+#: describe.c:5000
+msgid "List of schemas"
+msgstr "Список схем"
+
+#: describe.c:5117
+msgid "List of text search parsers"
+msgstr "Список анализаторов текстового поиска"
+
+#: describe.c:5167
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Анализатор текстового поиска \"%s\" не найден."
+
+#: describe.c:5170
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Никакие анализаторы текстового поиска не найдены."
+
+#: describe.c:5245
+msgid "Start parse"
+msgstr "Начало разбора"
+
+#: describe.c:5246
+msgid "Method"
+msgstr "Метод"
+
+#: describe.c:5250
+msgid "Get next token"
+msgstr "Получение следующего фрагмента"
+
+#: describe.c:5252
+msgid "End parse"
+msgstr "Окончание разбора"
+
+#: describe.c:5254
+msgid "Get headline"
+msgstr "Получение выдержки"
+
+#: describe.c:5256
+msgid "Get token types"
+msgstr "Получение типов фрагментов"
+
+#: describe.c:5267
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Анализатор текстового поиска \"%s.%s\""
+
+#: describe.c:5270
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Анализатор текстового поиска \"%s\""
+
+#: describe.c:5289
+msgid "Token name"
+msgstr "Имя фрагмента"
+
+#: describe.c:5303
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Типы фрагментов для анализатора \"%s.%s\""
+
+#: describe.c:5306
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Типы фрагментов для анализатора \"%s\""
+
+#: describe.c:5350
+msgid "Template"
+msgstr "Шаблон"
+
+#: describe.c:5351
+msgid "Init options"
+msgstr "Параметры инициализации"
+
+#: describe.c:5378
+msgid "List of text search dictionaries"
+msgstr "Список словарей текстового поиска"
+
+#: describe.c:5411
+msgid "Init"
+msgstr "Инициализация"
+
+#: describe.c:5412
+msgid "Lexize"
+msgstr "Выделение лексем"
+
+#: describe.c:5444
+msgid "List of text search templates"
+msgstr "Список шаблонов текстового поиска"
+
+#: describe.c:5499
+msgid "List of text search configurations"
+msgstr "Список конфигураций текстового поиска"
+
+#: describe.c:5550
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "Конфигурация текстового поиска \"%s\" не найдена."
+
+#: describe.c:5553
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Никакие конфигурации текстового поиска не найдены."
+
+#: describe.c:5619
+msgid "Token"
+msgstr "Фрагмент"
+
+#: describe.c:5620
+msgid "Dictionaries"
+msgstr "Словари"
+
+#: describe.c:5631
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Конфигурация текстового поиска \"%s.%s\""
+
+#: describe.c:5634
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Конфигурация текстового поиска \"%s\""
+
+#: describe.c:5638
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Анализатор: \"%s.%s\""
+
+#: describe.c:5641
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Анализатор: \"%s\""
+
+#: describe.c:5722
+msgid "List of foreign-data wrappers"
+msgstr "Список обёрток сторонних данных"
+
+#: describe.c:5750
+msgid "Foreign-data wrapper"
+msgstr "Обёртка сторонних данных"
+
+#: describe.c:5768 describe.c:5958
+msgid "Version"
+msgstr "Версия"
+
+#: describe.c:5799
+msgid "List of foreign servers"
+msgstr "Список сторонних серверов"
+
+#: describe.c:5824 describe.c:5883
+msgid "Server"
+msgstr "Сервер"
+
+#: describe.c:5825
+msgid "User name"
+msgstr "Имя пользователя"
+
+#: describe.c:5855
+msgid "List of user mappings"
+msgstr "Список сопоставлений пользователей"
+
+#: describe.c:5928
+msgid "List of foreign tables"
+msgstr "Список сторонних таблиц"
+
+#: describe.c:5980
+msgid "List of installed extensions"
+msgstr "Список установленных расширений"
+
+#: describe.c:6028
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "Расширение \"%s\" не найдено."
+
+#: describe.c:6031
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Никакие расширения не найдены."
+
+#: describe.c:6075
+msgid "Object description"
+msgstr "Описание объекта"
+
+#: describe.c:6085
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Объекты в расширении \"%s\""
+
+#: describe.c:6126
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "неверное полное имя (слишком много компонентов): %s"
+
+#: describe.c:6140
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "ссылки между базами не реализованы: %s"
+
+#: describe.c:6171 describe.c:6298
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "Сервер (версия %s) не поддерживает публикации."
+
+#: describe.c:6188 describe.c:6376
+msgid "All tables"
+msgstr "Все таблицы"
+
+#: describe.c:6189 describe.c:6377
+msgid "Inserts"
+msgstr "Добавления"
+
+#: describe.c:6190 describe.c:6378
+msgid "Updates"
+msgstr "Изменения"
+
+#: describe.c:6191 describe.c:6379
+msgid "Deletes"
+msgstr "Удаления"
+
+#: describe.c:6195 describe.c:6381
+msgid "Truncates"
+msgstr "Опустошения"
+
+#: describe.c:6199 describe.c:6383
+msgid "Via root"
+msgstr "Через корень"
+
+#: describe.c:6221
+msgid "List of publications"
+msgstr "Список публикаций"
+
+#: describe.c:6345
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "Публикация \"%s\" не найдена."
+
+#: describe.c:6348
+#, c-format
+msgid "Did not find any publications."
+msgstr "Никакие публикации не найдены."
+
+#: describe.c:6372
+#, c-format
+msgid "Publication %s"
+msgstr "Публикация %s"
+
+#: describe.c:6425
+msgid "Tables:"
+msgstr "Таблицы:"
+
+#: describe.c:6437
+msgid "Tables from schemas:"
+msgstr "Таблицы из схем:"
+
+#: describe.c:6481
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Сервер (версия %s) не поддерживает подписки."
+
+#: describe.c:6497
+msgid "Publication"
+msgstr "Публикация"
+
+#: describe.c:6506
+msgid "Binary"
+msgstr "Бинарная"
+
+#: describe.c:6507
+msgid "Streaming"
+msgstr "Потоковая"
+
+#: describe.c:6514
+msgid "Two-phase commit"
+msgstr "Двухфазная фиксация"
+
+#: describe.c:6515
+msgid "Disable on error"
+msgstr "Отключается при ошибке"
+
+#: describe.c:6520
+msgid "Synchronous commit"
+msgstr "Синхронная фиксация"
+
+#: describe.c:6521
+msgid "Conninfo"
+msgstr "Строка подключения"
+
+#: describe.c:6527
+msgid "Skip LSN"
+msgstr "Пропустить LSN"
+
+#: describe.c:6554
+msgid "List of subscriptions"
+msgstr "Список подписок"
+
+#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900
+msgid "AM"
+msgstr "МД"
+
+#: describe.c:6617
+msgid "Input type"
+msgstr "Входной тип"
+
+#: describe.c:6618
+msgid "Storage type"
+msgstr "Тип хранения"
+
+#: describe.c:6619
+msgid "Operator class"
+msgstr "Класс операторов"
+
+#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901
+msgid "Operator family"
+msgstr "Семейство операторов"
+
+#: describe.c:6667
+msgid "List of operator classes"
+msgstr "Список классов операторов"
+
+#: describe.c:6714
+msgid "Applicable types"
+msgstr "Применимые типы"
+
+#: describe.c:6756
+msgid "List of operator families"
+msgstr "Список семейств операторов"
+
+#: describe.c:6807
+msgid "Operator"
+msgstr "Оператор"
+
+#: describe.c:6808
+msgid "Strategy"
+msgstr "Стратегия"
+
+#: describe.c:6809
+msgid "ordering"
+msgstr "сортировка"
+
+#: describe.c:6810
+msgid "search"
+msgstr "поиск"
+
+#: describe.c:6811
+msgid "Purpose"
+msgstr "Назначение"
+
+#: describe.c:6816
+msgid "Sort opfamily"
+msgstr "Семейство для сортировки"
+
+#: describe.c:6855
+msgid "List of operators of operator families"
+msgstr "Список операторов из семейств операторов"
+
+#: describe.c:6902
+msgid "Registered left type"
+msgstr "Зарегистрированный левый тип"
+
+#: describe.c:6903
+msgid "Registered right type"
+msgstr "Зарегистрированный правый тип"
+
+#: describe.c:6904
+msgid "Number"
+msgstr "Номер"
+
+#: describe.c:6948
+msgid "List of support functions of operator families"
+msgstr "Список опорных функций из семейств операторов"
+
+#: describe.c:6979
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7000
+msgid "Large objects"
+msgstr "Большие объекты"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql - это интерактивный терминал PostgreSQL.\n"
+"\n"
+
+#: help.c:76 help.c:393 help.c:473 help.c:516
+msgid "Usage:\n"
+msgstr "Использование:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [ПАРАМЕТР]... [БД [ПОЛЬЗОВАТЕЛЬ]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "Общие параметры:\n"
+
+#: help.c:84
+msgid ""
+" -c, --command=COMMAND run only single command (SQL or internal) and "
+"exit\n"
+msgstr ""
+" -c, --command=КОМАНДА выполнить одну команду (SQL или внутреннюю) и "
+"выйти\n"
+
+#: help.c:85
+#, c-format
+msgid ""
+" -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr ""
+" -d, --dbname=БД имя подключаемой базы данных (по умолчанию "
+"\"%s\")\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=ИМЯ_ФАЙЛА выполнить команды из файла и выйти\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list вывести список баз данных и выйти\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=ИМЯ=ЗНАЧЕНИЕ\n"
+" присвоить переменной psql ИМЯ заданное ЗНАЧЕНИЕ\n"
+" (например: -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr ""
+" -X, --no-psqlrc игнорировать файл параметров запуска (~/.psqlrc)\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-"
+"interactive)\n"
+msgstr ""
+" -1 (\"один\"), --single-transaction\n"
+" выполнить как одну транзакцию\n"
+" (в неинтерактивном режиме)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] показать эту справку и выйти\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands перечислить команды с \\ и выйти\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr ""
+" --help=variables перечислить специальные переменные и выйти\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Параметры ввода/вывода:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all отображать все команды из скрипта\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors отображать команды с ошибками\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries отображать команды, отправляемые серверу\n"
+
+#: help.c:104
+msgid ""
+" -E, --echo-hidden display queries that internal commands generate\n"
+msgstr ""
+" -E, --echo-hidden выводить запросы, порождённые внутренними "
+"командами\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=ИМЯ_ФАЙЛА сохранять протокол работы в файл\n"
+
+#: help.c:106
+msgid ""
+" -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr ""
+" -n, --no-readline отключить редактор командной строки readline\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr ""
+" -o, --output=ИМЯ_ФАЙЛА направить результаты запроса в файл (или канал "
+"|)\n"
+
+#: help.c:108
+msgid ""
+" -q, --quiet run quietly (no messages, only query output)\n"
+msgstr ""
+" -q, --quiet показывать только результаты запросов, без "
+"сообщений\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr ""
+" -s, --single-step пошаговый режим (подтверждение каждого запроса)\n"
+
+#: help.c:110
+msgid ""
+" -S, --single-line single-line mode (end of line terminates SQL "
+"command)\n"
+msgstr ""
+" -S, --single-line однострочный режим (конец строки завершает "
+"команду)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Параметры вывода:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align режим вывода невыровненной таблицы\n"
+
+#: help.c:114
+msgid ""
+" --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr ""
+" --csv режим вывода в формате CSV (значения, "
+"разделённые\n"
+" запятыми)\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: "
+"\"%s\")\n"
+msgstr ""
+" -F, --field-separator=СТРОКА\n"
+" разделителей полей при невыровненном выводе\n"
+" (по умолчанию: \"%s\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html вывод таблицы в формате HTML\n"
+
+#: help.c:119
+msgid ""
+" -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset "
+"command)\n"
+msgstr ""
+" -P, --pset=ПАР[=ЗНАЧ] определить параметр печати ПАР (с заданным "
+"ЗНАЧЕНИЕМ)\n"
+" (см. описание \\pset)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: "
+"newline)\n"
+msgstr ""
+" -R, --record-separator=СТРОКА\n"
+" разделитель записей при невыровненном выводе\n"
+" (по умолчанию: новая строка)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only выводить только кортежи\n"
+
+#: help.c:123
+msgid ""
+" -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, "
+"border)\n"
+msgstr ""
+" -T, --table-attr=ТЕКСТ установить атрибуты HTML-таблицы (width, border)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded включить развёрнутый вывод таблицы\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero "
+"byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" сделать разделителем полей при невыровненном\n"
+" выводе нулевой байт\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero "
+"byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" сделать разделителем записей при невыровненном\n"
+" нулевой байт\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Параметры подключения:\n"
+
+#: help.c:133
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory "
+"(default: \"%s\")\n"
+msgstr ""
+" -h, --host=ИМЯ имя сервера баз данных или каталог сокетов\n"
+" (по умолчанию: \"%s\")\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "локальный сокет"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr ""
+" -p, --port=ПОРТ порт сервера баз данных (по умолчанию: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=ИМЯ имя пользователя (по умолчанию: \"%s\")\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password не запрашивать пароль\n"
+
+#: help.c:143
+msgid ""
+" -W, --password force password prompt (should happen "
+"automatically)\n"
+msgstr ""
+" -W, --password запрашивать пароль всегда (обычно не требуется)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or "
+"\"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Чтобы узнать больше, введите \"\\?\" (список внутренних команд) или "
+"\"\\help\"\n"
+"(справка по операторам SQL) в psql, либо обратитесь к разделу psql в\n"
+"документации PostgreSQL.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Об ошибках сообщайте по адресу <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "Общие\n"
+
+# skip-rule: copyright
+#: help.c:192
+msgid ""
+" \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr ""
+" \\copyright условия использования и распространения "
+"PostgreSQL\n"
+
+#: help.c:193
+msgid ""
+" \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr ""
+" \\crosstabview [СТОЛБЦЫ] выполнить запрос и вывести результат в "
+"перекрёстном виде\n"
+
+#: help.c:194
+msgid ""
+" \\errverbose show most recent error message at maximum "
+"verbosity\n"
+msgstr ""
+" \\errverbose вывести максимально подробное сообщение о "
+"последней ошибке\n"
+
+#: help.c:195
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(ПАРАМЕТРЫ)] [ФАЙЛ] выполнить запрос (и направить результат в файл\n"
+" или канал |); \\g без аргументов равнозначно \";"
+"\"\n"
+
+#: help.c:197
+msgid ""
+" \\gdesc describe result of query, without executing it\n"
+msgstr ""
+" \\gdesc описать результат запроса, но не выполнять его\n"
+
+#: help.c:198
+msgid ""
+" \\gexec execute query, then execute each value in its "
+"result\n"
+msgstr ""
+" \\gexec выполнить запрос, а затем выполнить каждую строку "
+"в результате\n"
+
+#: help.c:199
+msgid ""
+" \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr ""
+" \\gset [ПРЕФИКС] выполнить запрос и сохранить результат в "
+"переменных\n"
+" psql\n"
+
+#: help.c:200
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr ""
+" \\gx [(ПАРАМЕТРЫ)] [ФАЙЛ] то же, что \\g, но в режиме развёрнутого вывода\n"
+
+#: help.c:201
+msgid " \\q quit psql\n"
+msgstr " \\q выйти из psql\n"
+
+#: help.c:202
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr ""
+" \\watch [СЕК] повторять запрос в цикле через заданное число "
+"секунд\n"
+
+#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304
+#: help.c:324 help.c:337 help.c:346
+msgid "\n"
+msgstr "\n"
+
+#: help.c:205
+msgid "Help\n"
+msgstr "Справка\n"
+
+#: help.c:207
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] справка по командам psql c \\\n"
+
+#: help.c:208
+msgid " \\? options show help on psql command-line options\n"
+msgstr ""
+" \\? options справка по параметрам командной строки psql\n"
+
+#: help.c:209
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables справка по специальным переменным\n"
+
+#: help.c:210
+msgid ""
+" \\h [NAME] help on syntax of SQL commands, * for all "
+"commands\n"
+msgstr ""
+" \\h [ИМЯ] справка по заданному SQL-оператору; * - по всем\n"
+
+#: help.c:213
+msgid "Query Buffer\n"
+msgstr "Буфер запроса\n"
+
+#: help.c:214
+msgid ""
+" \\e [FILE] [LINE] edit the query buffer (or file) with external "
+"editor\n"
+msgstr ""
+" \\e [ФАЙЛ] [СТРОКА] править буфер запроса (или файл) во внешнем "
+"редакторе\n"
+
+#: help.c:215
+msgid ""
+" \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr ""
+" \\ef [ФУНКЦИЯ [СТРОКА]] править определение функции во внешнем редакторе\n"
+
+#: help.c:216
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr ""
+" \\ev [VIEWNAME [LINE]] править определение представления во внешнем "
+"редакторе\n"
+
+#: help.c:217
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p вывести содержимое буфера запросов\n"
+
+#: help.c:218
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r очистить буфер запроса\n"
+
+#: help.c:220
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [ФАЙЛ] вывести историю или сохранить её в файл\n"
+
+#: help.c:222
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w ФАЙЛ записать буфер запроса в файл\n"
+
+#: help.c:225
+msgid "Input/Output\n"
+msgstr "Ввод/Вывод\n"
+
+#: help.c:226
+msgid ""
+" \\copy ... perform SQL COPY with data stream to the client "
+"host\n"
+msgstr " \\copy ... выполнить SQL COPY на стороне клиента\n"
+
+#: help.c:227
+msgid ""
+" \\echo [-n] [STRING] write string to standard output (-n for no "
+"newline)\n"
+msgstr ""
+" \\echo [-n] [СТРОКА] записать строку в поток стандартного вывода\n"
+" (-n отключает перевод строки)\n"
+
+#: help.c:228
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i ФАЙЛ выполнить команды из файла\n"
+
+#: help.c:229
+msgid ""
+" \\ir FILE as \\i, but relative to location of current "
+"script\n"
+msgstr ""
+" \\ir ФАЙЛ подобно \\i, но путь задаётся относительно\n"
+" текущего скрипта\n"
+
+#: help.c:230
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr ""
+" \\o [ФАЙЛ] выводить все результаты запросов в файл или канал "
+"|\n"
+
+#: help.c:231
+msgid ""
+" \\qecho [-n] [STRING] write string to \\o output stream (-n for no "
+"newline)\n"
+msgstr ""
+" \\qecho [-n] [СТРОКА] записать строку в выходной поток \\o\n"
+" (-n отключает перевод строки)\n"
+
+#: help.c:232
+msgid ""
+" \\warn [-n] [STRING] write string to standard error (-n for no "
+"newline)\n"
+msgstr ""
+" \\warn [-n] [СТРОКА] записать строку в поток вывода ошибок\n"
+" (-n отключает перевод строки)\n"
+
+#: help.c:235
+msgid "Conditional\n"
+msgstr "Условия\n"
+
+#: help.c:236
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if ВЫРАЖЕНИЕ начало блока условия\n"
+
+#: help.c:237
+msgid ""
+" \\elif EXPR alternative within current conditional block\n"
+msgstr ""
+" \\elif ВЫРАЖЕНИЕ альтернативная ветвь в текущем блоке условия\n"
+
+#: help.c:238
+msgid ""
+" \\else final alternative within current conditional "
+"block\n"
+msgstr ""
+" \\else окончательная ветвь в текущем блоке условия\n"
+
+#: help.c:239
+msgid " \\endif end conditional block\n"
+msgstr " \\endif конец блока условия\n"
+
+#: help.c:242
+msgid "Informational\n"
+msgstr "Информационные\n"
+
+#: help.c:243
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr ""
+" (дополнения: S = показывать системные объекты, + = дополнительные "
+"подробности)\n"
+
+#: help.c:244
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr ""
+" \\d[S+] список таблиц, представлений и "
+"последовательностей\n"
+
+#: help.c:245
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr ""
+" \\d[S+] ИМЯ описание таблицы, представления, "
+"последовательности\n"
+" или индекса\n"
+
+#: help.c:246
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [МАСКА] список агрегатных функций\n"
+
+#: help.c:247
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [МАСКА] список методов доступа\n"
+
+# well-spelled: МСК
+#: help.c:248
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [МСК_МД [МСК_ТИПА]] список классов операторов\n"
+
+# well-spelled: МСК
+#: help.c:249
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [МСК_МД [МСК_ТИПА]] список семейств операторов\n"
+
+# well-spelled: МСК
+#: help.c:250
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr ""
+" \\dAo[+] [МСК_МД [МСК_СОП]] список операторов из семейств операторов\n"
+
+# well-spelled: МСК
+#: help.c:251
+msgid ""
+" \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [МСК_МД [МСК_СОП]] список опорных функций из семейств\n"
+
+#: help.c:252
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [МАСКА] список табличных пространств\n"
+
+#: help.c:253
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [МАСКА] список преобразований\n"
+
+#: help.c:254
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [МАСКА] список параметров конфигурации\n"
+
+#: help.c:255
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [МАСКА] список приведений типов\n"
+
+#: help.c:256
+msgid ""
+" \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr ""
+" \\dd[S] [МАСКА] описания объектов, не выводимые в других режимах\n"
+
+#: help.c:257
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [МАСКА] список доменов\n"
+
+#: help.c:258
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [МАСКА] список прав по умолчанию\n"
+
+#: help.c:259
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [МАСКА] список сторонних таблиц\n"
+
+#: help.c:260
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [МАСКА] список сторонних серверов\n"
+
+#: help.c:261
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [МАСКА] список сторонних таблиц\n"
+
+#: help.c:262
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [МАСКА] список сопоставлений пользователей\n"
+
+#: help.c:263
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [МАСКА] список обёрток сторонних данных\n"
+
+# well-spelled: МСК, ФУНК
+#: help.c:264
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] "
+"functions\n"
+msgstr ""
+" \\df[anptw][S+] [МСК_ФУНК [МСК_ТИПА ...]]\n"
+" список функций [только агрегатных/обычных/процедур/"
+"триггеров/оконных]\n"
+
+#: help.c:266
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [МАСКА] список конфигураций текстового поиска\n"
+
+#: help.c:267
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [МАСКА] список словарей текстового поиска\n"
+
+#: help.c:268
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [МАСКА] список анализаторов текстового поиска\n"
+
+#: help.c:269
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [МАСКА] список шаблонов текстового поиска\n"
+
+#: help.c:270
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [МАСКА] список ролей\n"
+
+#: help.c:271
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [МАСКА] список индексов\n"
+
+#: help.c:272
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr ""
+" \\dl[+] список больших объектов (то же, что и \\lo_list)\n"
+
+#: help.c:273
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [МАСКА] список языков процедур\n"
+
+#: help.c:274
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [МАСКА] список материализованных представлений\n"
+
+#: help.c:275
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [МАСКА] список схем\n"
+
+# well-spelled: МСК
+#: help.c:276
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [МСК_ОП [МСК_ТИПА [МСК_ТИПА]]]\n"
+" список операторов\n"
+
+#: help.c:278
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [МАСКА] список правил сортировки\n"
+
+#: help.c:279
+msgid ""
+" \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr ""
+" \\dp [МАСКА] список прав доступа к таблицам, представлениям и\n"
+" последовательностям\n"
+
+#: help.c:280
+msgid ""
+" \\dP[itn+] [PATTERN] list [only index/table] partitioned relations "
+"[n=nested]\n"
+msgstr ""
+" \\dP[itn+] [МАСКА] список секционированных отношений\n"
+" [только индексов (i)/таблиц (t)], с вложенностью "
+"(n)\n"
+
+# well-spelled: МСК
+#: help.c:281
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr " \\drds [МСК_РОЛИ [МСК_БД]] список параметров роли на уровне БД\n"
+
+#: help.c:282
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [МАСКА] список публикаций для репликации\n"
+
+#: help.c:283
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [МАСКА] список подписок на репликацию\n"
+
+#: help.c:284
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [МАСКА] список последовательностей\n"
+
+#: help.c:285
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [МАСКА] список таблиц\n"
+
+#: help.c:286
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [МАСКА] список типов данных\n"
+
+#: help.c:287
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [МАСКА] список ролей\n"
+
+#: help.c:288
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [МАСКА] список представлений\n"
+
+#: help.c:289
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [МАСКА] список расширений\n"
+
+#: help.c:290
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [МАСКА] список расширенных статистик\n"
+
+#: help.c:291
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [МАСКА] список событийных триггеров\n"
+
+#: help.c:292
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [МАСКА] список баз данных\n"
+
+#: help.c:293
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] ИМЯ_ФУНКЦИИ показать определение функции\n"
+
+# well-spelled: ПРЕДСТ
+#: help.c:294
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] ИМЯ_ПРЕДСТ показать определение представления\n"
+
+#: help.c:295
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [МАСКА] то же, что и \\dp\n"
+
+#: help.c:298
+msgid "Large Objects\n"
+msgstr "Большие объекты\n"
+
+#: help.c:299
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export OID_БО ФАЙЛ записать большой объект в файл\n"
+
+#: help.c:300
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import ФАЙЛ [КОММЕНТАРИЙ]\n"
+" прочитать большой объект из файла\n"
+
+#: help.c:302
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] список больших объектов\n"
+
+#: help.c:303
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink OID_БО удалить большой объект\n"
+
+#: help.c:306
+msgid "Formatting\n"
+msgstr "Форматирование\n"
+
+#: help.c:307
+msgid ""
+" \\a toggle between unaligned and aligned output mode\n"
+msgstr ""
+" \\a переключение режимов вывода:\n"
+" неформатированный/выровненный\n"
+
+#: help.c:308
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr ""
+" \\C [СТРОКА] задать заголовок таблицы или убрать, если не "
+"задан\n"
+
+#: help.c:309
+msgid ""
+" \\f [STRING] show or set field separator for unaligned query "
+"output\n"
+msgstr ""
+" \\f [СТРОКА] показать или установить разделитель полей для\n"
+" неформатированного вывода\n"
+
+#: help.c:310
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr ""
+" \\H переключить режим вывода в HTML (текущий: %s)\n"
+
+#: help.c:312
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [ИМЯ [ЗНАЧЕНИЕ]] установить параметр вывода таблицы\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:319
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] режим вывода только строк (сейчас: %s)\n"
+
+#: help.c:321
+msgid ""
+" \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr ""
+" \\T [СТРОКА] задать атрибуты для <table> или убрать, если не "
+"заданы\n"
+
+#: help.c:322
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr ""
+" \\x [on|off|auto] переключить режим расширенного вывода (сейчас: "
+"%s)\n"
+
+#: help.c:323
+msgid "auto"
+msgstr "auto"
+
+#: help.c:326
+msgid "Connection\n"
+msgstr "Соединение\n"
+
+#: help.c:328
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[БД|- ПОЛЬЗОВАТЕЛЬ|- СЕРВЕР|- ПОРТ|-] | conninfo}\n"
+" подключиться к другой базе данных\n"
+" (текущая: \"%s\")\n"
+
+#: help.c:332
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[БД|- ПОЛЬЗОВАТЕЛЬ|- СЕРВЕР|- ПОРТ|-] | conninfo}\n"
+" подключиться к другой базе данных\n"
+" (сейчас подключения нет)\n"
+
+#: help.c:334
+msgid ""
+" \\conninfo display information about current connection\n"
+msgstr " \\conninfo информация о текущем соединении\n"
+
+#: help.c:335
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [КОДИРОВКА] показать/установить клиентскую кодировку\n"
+
+#: help.c:336
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [ИМЯ] безопасно сменить пароль пользователя\n"
+
+#: help.c:339
+msgid "Operating System\n"
+msgstr "Операционная система\n"
+
+#: help.c:340
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [ПУТЬ] сменить текущий каталог\n"
+
+# well-spelled: ОКР
+#: help.c:341
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv ПЕР_PSQL ПЕР_ОКР прочитать переменную окружения\n"
+
+#: help.c:342
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr ""
+" \\setenv ИМЯ [ЗНАЧЕНИЕ] установить или сбросить переменную окружения\n"
+
+#: help.c:343
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] включить/выключить секундомер (сейчас: %s)\n"
+
+#: help.c:345
+msgid ""
+" \\! [COMMAND] execute command in shell or start interactive "
+"shell\n"
+msgstr ""
+" \\! [КОМАНДА] выполнить команду в командной оболочке\n"
+" или запустить интерактивную оболочку\n"
+
+#: help.c:348
+msgid "Variables\n"
+msgstr "Переменные\n"
+
+#: help.c:349
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr ""
+" \\prompt [ТЕКСТ] ИМЯ предложить пользователю задать внутреннюю "
+"переменную\n"
+
+#: help.c:350
+msgid ""
+" \\set [NAME [VALUE]] set internal variable, or list all if no "
+"parameters\n"
+msgstr ""
+" \\set [ИМЯ [ЗНАЧЕНИЕ]] установить внутреннюю переменную или вывести все,\n"
+" если имя не задано\n"
+
+#: help.c:351
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset ИМЯ сбросить (удалить) внутреннюю переменную\n"
+
+#: help.c:390
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"Список специальных переменных\n"
+"\n"
+
+#: help.c:392
+msgid "psql variables:\n"
+msgstr "Переменные psql:\n"
+
+#: help.c:394
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=ИМЯ=ЗНАЧЕНИЕ\n"
+" или \\set ИМЯ ЗНАЧЕНИЕ в приглашении psql\n"
+"\n"
+
+#: help.c:396
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" если установлен, успешные SQL-команды фиксируются автоматически\n"
+
+#: help.c:398
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" определяет регистр для автодополнения ключевых слов SQL\n"
+" [lower (нижний), upper (верхний),\n"
+" preserve-lower (сохранять нижний),\n"
+" preserve-upper (сохранять верхний)]\n"
+
+#: help.c:401
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" имя текущей подключённой базы данных\n"
+
+#: help.c:403
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" определяет, что выдаётся на стандартный вывод\n"
+" [all (всё), errors (ошибки), none (ничего),\n"
+" queries (запросы)]\n"
+
+#: help.c:406
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" если включено, выводит внутренние запросы, порождаемые командами с \\;\n"
+" если установлено значение \"noexec\", они выводятся, но не выполняются\n"
+
+#: help.c:409
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" текущая кодировка клиентского набора символов\n"
+
+#: help.c:411
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr ""
+" ERROR\n"
+" true в случае ошибки в последнем запросе, иначе — false\n"
+
+#: help.c:413
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = "
+"unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" число результирующих строк, извлекаемых и отображаемых за раз\n"
+" (0 = без ограничений)\n"
+
+#: help.c:415
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" если установлено, табличные методы доступа не выводятся\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" если установлено, методы сжатия не выводятся\n"
+
+#: help.c:419
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" управляет историей команд [ignorespace (игнорировать пробелы),\n"
+" ignoredups (игнорировать дубли), ignoreboth (и то, и другое)]\n"
+
+#: help.c:421
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" имя файла, в котором будет сохраняться история команд\n"
+
+#: help.c:423
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" максимальное число команд, сохраняемых в истории\n"
+
+#: help.c:425
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" сервер баз данных, к которому установлено подключение\n"
+
+#: help.c:427
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" количество EOF для завершения интерактивного сеанса\n"
+
+#: help.c:429
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" значение последнего задействованного OID\n"
+
+#: help.c:431
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if "
+"none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" сообщение и код SQLSTATE последней ошибки, либо пустая строка и "
+"\"00000\",\n"
+" если ошибки не было\n"
+
+#: help.c:434
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" если установлено, транзакция не прекращается при ошибке\n"
+" (используются неявные точки сохранения)\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" останавливать выполнение пакета команд после ошибки\n"
+
+#: help.c:438
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" порт сервера для текущего соединения\n"
+
+#: help.c:440
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" устанавливает стандартное приглашение psql\n"
+
+#: help.c:442
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous "
+"line\n"
+msgstr ""
+" PROMPT2\n"
+" устанавливает приглашение, которое выводится при переносе оператора\n"
+" на новую строку\n"
+
+#: help.c:444
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" устанавливает приглашение для выполнения COPY ... FROM STDIN\n"
+
+#: help.c:446
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" выводить минимум сообщений (как и с параметром -q)\n"
+
+#: help.c:448
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" число строк, возвращённых или обработанных последним SQL-запросом, либо "
+"0\n"
+
+#: help.c:450
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" версия сервера (в коротком текстовом и числовом формате)\n"
+
+#: help.c:453
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" выводить все результаты объединённых запросов (\\;), а не только "
+"последнего\n"
+
+#: help.c:455
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" управляет отображением полей контекста сообщений\n"
+" [never (не отображать никогда), errors (ошибки), always (всегда]\n"
+
+#: help.c:457
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" если установлено, конец строки завершает режим ввода SQL-команды\n"
+" (как и с параметром -S)\n"
+
+#: help.c:459
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" пошаговый режим (как и с параметром -s)\n"
+
+#: help.c:461
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" SQLSTATE последнего запроса или \"00000\", если он выполнился без "
+"ошибок\n"
+
+#: help.c:463
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" текущий пользователь, подключённый к БД\n"
+
+#: help.c:465
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" управляет детализацией отчётов об ошибках [default (по умолчанию),\n"
+" verbose (подробно), terse (кратко), sqlstate (код состояния)]\n"
+
+#: help.c:467
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" версия psql (в развёрнутом, в коротком текстовом и в числовом формате)\n"
+
+#: help.c:472
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Параметры отображения:\n"
+
+#: help.c:474
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=ИМЯ[=ЗНАЧЕНИЕ]\n"
+" или \\pset ИМЯ [ЗНАЧЕНИЕ] в приглашении psql\n"
+"\n"
+
+#: help.c:476
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" стиль границы (число)\n"
+
+#: help.c:478
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" целевая ширина для формата с переносом\n"
+
+#: help.c:480
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (или x)\n"
+" расширенный вывод [on (вкл.), off (выкл.), auto (авто)]\n"
+
+#: help.c:482
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" разделитель полей для неформатированного вывода (по умолчанию \"%s\")\n"
+
+#: help.c:485
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" устанавливает ноль разделителем полей при неформатированном выводе\n"
+
+#: help.c:487
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" включает или выключает вывод подписей таблицы [on (вкл.), off (выкл.)]\n"
+
+#: help.c:489
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" устанавливает формат вывода [unaligned (неформатированный),\n"
+"\n"
+" aligned (выровненный), wrapped (с переносом), html, asciidoc, ...]\n"
+
+#: help.c:491
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" задаёт стиль рисования линий границы [ascii, old-ascii, unicode]\n"
+
+#: help.c:493
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" устанавливает строку, выводимую вместо значения NULL\n"
+
+#: help.c:495
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of "
+"digits\n"
+msgstr ""
+" numericlocale\n"
+" отключает вывод заданного локалью разделителя группы цифр\n"
+
+#: help.c:497
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" определяет, используется ли внешний постраничник\n"
+" [yes (да), no (нет), always (всегда)]\n"
+
+#: help.c:499
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" разделитель записей (строк) при неформатированном выводе\n"
+
+#: help.c:501
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" устанавливает ноль разделителем записей при неформатированном выводе\n"
+
+#: help.c:503
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (или T)\n"
+" задаёт атрибуты для тега table в формате html или пропорциональные\n"
+" ширины столбцов для выровненных влево данных, в формате latex-longtable\n"
+
+#: help.c:506
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" задаёт заголовок таблицы для последовательно печатаемых таблиц\n"
+
+#: help.c:508
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" если установлено, выводятся только непосредственно табличные данные\n"
+
+#: help.c:510
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" задаёт стиль рисуемых линий Unicode [single (одинарные), double "
+"(двойные)]\n"
+
+#: help.c:515
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Переменные окружения:\n"
+
+#: help.c:519
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" ИМЯ=ЗНАЧЕНИЕ [ИМЯ=ЗНАЧЕНИЕ] psql ...\n"
+" или \\setenv ИМЯ [ЗНАЧЕНИЕ] в приглашении psql\n"
+"\n"
+
+#: help.c:521
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set ИМЯ=ЗНАЧЕНИЕ\n"
+" psql ...\n"
+" или \\setenv ИМЯ ЗНАЧЕНИЕ в приглашении psql\n"
+"\n"
+
+#: help.c:524
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" число столбцов для форматирования с переносом\n"
+
+#: help.c:526
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" синоним параметра подключения application_name\n"
+
+#: help.c:528
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" синоним параметра подключения dbname\n"
+
+#: help.c:530
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" синоним параметра подключения host\n"
+
+#: help.c:532
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" имя файла с паролем\n"
+
+#: help.c:534
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" пароль для подключения (использовать не рекомендуется)\n"
+
+#: help.c:536
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" синоним параметра подключения port\n"
+
+#: help.c:538
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" синоним параметра подключения user\n"
+
+#: help.c:540
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" редактор, вызываемый командами \\e, \\ef и \\ev\n"
+
+#: help.c:542
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" определяет способ передачи номера строки при вызове редактора\n"
+
+#: help.c:544
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" альтернативное размещение файла с историей команд\n"
+
+#: help.c:546
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" имя программы внешнего постраничника\n"
+
+#: help.c:549
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" имя программы внешнего постраничника для \\watch\n"
+
+#: help.c:552
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" альтернативное размещение пользовательского файла .psqlrc\n"
+
+#: help.c:554
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" оболочка, вызываемая командой \\!\n"
+
+#: help.c:556
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" каталог для временных файлов\n"
+
+#: help.c:616
+msgid "Available help:\n"
+msgstr "Имеющаяся справка:\n"
+
+#: help.c:711
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Команда: %s\n"
+"Описание: %s\n"
+"Синтаксис:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:734
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Нет справки по команде \"%s\".\n"
+"Попробуйте \\h без аргументов и посмотрите, что есть.\n"
+
+#: input.c:217
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "не удалось прочитать входной файл: %m"
+
+#: input.c:478 input.c:516
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "не удалось сохранить историю в файле \"%s\": %m"
+
+#: input.c:535
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "в данной среде история не поддерживается"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: нет соединения с базой данных"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: текущая транзакция прервана"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: неизвестное состояние транзакции"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "выход из блока \\if"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Чтобы выйти из %s, введите \"\\q\".\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"Результат выдаётся в специальном формате выгрузки PostgreSQL.\n"
+"Чтобы восстановить базу данных из этого формата, воспользуйтесь программой "
+"командной строки pg_restore.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr ""
+"Введите \\? для получения справки или нажмите Control-C для очистки буфера "
+"ввода."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "Введите \\? для получения справки."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Вы используете psql - интерфейс командной строки к PostgreSQL."
+
+# skip-rule: copyright
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Азы: \\copyright - условия распространения\n"
+" \\h - справка по операторам SQL\n"
+" \\? - справка по командам psql\n"
+" \\g или ; в конце строки - выполнение запроса\n"
+" \\q - выход\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "Введите \\q для выхода."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "Нажмите Control-D для выхода."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "Нажмите Control-C для выхода."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr ""
+"запрос игнорируется; добавьте \\endif или нажмите Ctrl-C для завершения "
+"текущего блока \\if"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "в закончившемся потоке команд не хватает \\endif"
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "незавершённая строка в кавычках"
+
+#: psqlscanslash.l:811
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: нехватка памяти"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1307 sql_help.c:1309
+#: sql_help.c:1312 sql_help.c:1315 sql_help.c:1317 sql_help.c:1319
+#: sql_help.c:1322 sql_help.c:1325 sql_help.c:1442 sql_help.c:1444
+#: sql_help.c:1446 sql_help.c:1449 sql_help.c:1470 sql_help.c:1473
+#: sql_help.c:1476 sql_help.c:1479 sql_help.c:1483 sql_help.c:1485
+#: sql_help.c:1487 sql_help.c:1489 sql_help.c:1503 sql_help.c:1506
+#: sql_help.c:1508 sql_help.c:1510 sql_help.c:1520 sql_help.c:1522
+#: sql_help.c:1532 sql_help.c:1534 sql_help.c:1544 sql_help.c:1547
+#: sql_help.c:1570 sql_help.c:1572 sql_help.c:1574 sql_help.c:1576
+#: sql_help.c:1579 sql_help.c:1581 sql_help.c:1584 sql_help.c:1587
+#: sql_help.c:1638 sql_help.c:1681 sql_help.c:1684 sql_help.c:1686
+#: sql_help.c:1688 sql_help.c:1691 sql_help.c:1693 sql_help.c:1695
+#: sql_help.c:1698 sql_help.c:1748 sql_help.c:1764 sql_help.c:1995
+#: sql_help.c:2064 sql_help.c:2083 sql_help.c:2096 sql_help.c:2153
+#: sql_help.c:2160 sql_help.c:2170 sql_help.c:2196 sql_help.c:2227
+#: sql_help.c:2245 sql_help.c:2273 sql_help.c:2384 sql_help.c:2430
+#: sql_help.c:2455 sql_help.c:2478 sql_help.c:2482 sql_help.c:2516
+#: sql_help.c:2536 sql_help.c:2558 sql_help.c:2572 sql_help.c:2593
+#: sql_help.c:2622 sql_help.c:2657 sql_help.c:2682 sql_help.c:2729
+#: sql_help.c:3024 sql_help.c:3037 sql_help.c:3054 sql_help.c:3070
+#: sql_help.c:3110 sql_help.c:3164 sql_help.c:3168 sql_help.c:3170
+#: sql_help.c:3177 sql_help.c:3196 sql_help.c:3223 sql_help.c:3258
+#: sql_help.c:3270 sql_help.c:3279 sql_help.c:3323 sql_help.c:3337
+#: sql_help.c:3365 sql_help.c:3373 sql_help.c:3385 sql_help.c:3395
+#: sql_help.c:3403 sql_help.c:3411 sql_help.c:3419 sql_help.c:3427
+#: sql_help.c:3436 sql_help.c:3447 sql_help.c:3455 sql_help.c:3463
+#: sql_help.c:3471 sql_help.c:3479 sql_help.c:3489 sql_help.c:3498
+#: sql_help.c:3507 sql_help.c:3515 sql_help.c:3525 sql_help.c:3536
+#: sql_help.c:3544 sql_help.c:3553 sql_help.c:3564 sql_help.c:3573
+#: sql_help.c:3581 sql_help.c:3589 sql_help.c:3597 sql_help.c:3605
+#: sql_help.c:3613 sql_help.c:3621 sql_help.c:3629 sql_help.c:3637
+#: sql_help.c:3645 sql_help.c:3653 sql_help.c:3670 sql_help.c:3679
+#: sql_help.c:3687 sql_help.c:3704 sql_help.c:3719 sql_help.c:4029
+#: sql_help.c:4139 sql_help.c:4168 sql_help.c:4183 sql_help.c:4686
+#: sql_help.c:4734 sql_help.c:4892
+msgid "name"
+msgstr "имя"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1845
+#: sql_help.c:3338 sql_help.c:4454
+msgid "aggregate_signature"
+msgstr "сигнатура_агр_функции"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1316 sql_help.c:1443
+#: sql_help.c:1486 sql_help.c:1507 sql_help.c:1521 sql_help.c:1533
+#: sql_help.c:1546 sql_help.c:1573 sql_help.c:1639 sql_help.c:1692
+msgid "new_name"
+msgstr "новое_имя"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1380 sql_help.c:1445 sql_help.c:1488 sql_help.c:1509
+#: sql_help.c:1571 sql_help.c:1687 sql_help.c:3010
+msgid "new_owner"
+msgstr "новый_владелец"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1318 sql_help.c:1490 sql_help.c:1511
+#: sql_help.c:1523 sql_help.c:1535 sql_help.c:1575 sql_help.c:1694
+msgid "new_schema"
+msgstr "новая_схема"
+
+#: sql_help.c:44 sql_help.c:1909 sql_help.c:3339 sql_help.c:4483
+msgid "where aggregate_signature is:"
+msgstr "где сигнатура_агр_функции:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1863 sql_help.c:1880 sql_help.c:1886 sql_help.c:1910
+#: sql_help.c:1913 sql_help.c:1916 sql_help.c:2065 sql_help.c:2084
+#: sql_help.c:2087 sql_help.c:2385 sql_help.c:2594 sql_help.c:3340
+#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3437 sql_help.c:3526
+#: sql_help.c:3554 sql_help.c:3904 sql_help.c:4353 sql_help.c:4460
+#: sql_help.c:4467 sql_help.c:4473 sql_help.c:4484 sql_help.c:4487
+#: sql_help.c:4490
+msgid "argmode"
+msgstr "режим_аргумента"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911
+#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085
+#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341
+#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527
+#: sql_help.c:3555 sql_help.c:4461 sql_help.c:4468 sql_help.c:4474
+#: sql_help.c:4485 sql_help.c:4488 sql_help.c:4491
+msgid "argname"
+msgstr "имя_аргумента"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912
+#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2387 sql_help.c:2596
+#: sql_help.c:3342 sql_help.c:3345 sql_help.c:3348 sql_help.c:3439
+#: sql_help.c:3528 sql_help.c:3556 sql_help.c:4462 sql_help.c:4469
+#: sql_help.c:4475 sql_help.c:4486 sql_help.c:4489 sql_help.c:4492
+msgid "argtype"
+msgstr "тип_аргумента"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1504 sql_help.c:1633 sql_help.c:1665
+#: sql_help.c:1717 sql_help.c:1780 sql_help.c:1966 sql_help.c:1973
+#: sql_help.c:2276 sql_help.c:2326 sql_help.c:2333 sql_help.c:2342
+#: sql_help.c:2431 sql_help.c:2658 sql_help.c:2751 sql_help.c:3039
+#: sql_help.c:3224 sql_help.c:3246 sql_help.c:3386 sql_help.c:3741
+#: sql_help.c:3948 sql_help.c:4182 sql_help.c:4955
+msgid "option"
+msgstr "параметр"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1634 sql_help.c:2432
+#: sql_help.c:2659 sql_help.c:3225 sql_help.c:3387
+msgid "where option can be:"
+msgstr "где допустимые параметры:"
+
+#: sql_help.c:116 sql_help.c:2208
+msgid "allowconn"
+msgstr "разр_подключения"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1635 sql_help.c:2209
+#: sql_help.c:2433 sql_help.c:2660 sql_help.c:3226
+msgid "connlimit"
+msgstr "предел_подключений"
+
+#: sql_help.c:118 sql_help.c:2210
+msgid "istemplate"
+msgstr "это_шаблон"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1321
+#: sql_help.c:1373 sql_help.c:4186
+msgid "new_tablespace"
+msgstr "новое_табл_пространство"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1182 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:2397 sql_help.c:2600
+#: sql_help.c:3916 sql_help.c:4204 sql_help.c:4365 sql_help.c:4674
+msgid "configuration_parameter"
+msgstr "параметр_конфигурации"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1352
+#: sql_help.c:1375 sql_help.c:1423 sql_help.c:1448 sql_help.c:1505
+#: sql_help.c:1589 sql_help.c:1643 sql_help.c:1666 sql_help.c:2277
+#: sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 sql_help.c:2398
+#: sql_help.c:2399 sql_help.c:2463 sql_help.c:2466 sql_help.c:2500
+#: sql_help.c:2601 sql_help.c:2602 sql_help.c:2625 sql_help.c:2752
+#: sql_help.c:2791 sql_help.c:2901 sql_help.c:2914 sql_help.c:2928
+#: sql_help.c:2969 sql_help.c:2996 sql_help.c:3013 sql_help.c:3040
+#: sql_help.c:3247 sql_help.c:3949 sql_help.c:4675 sql_help.c:4676
+#: sql_help.c:4677 sql_help.c:4678
+msgid "value"
+msgstr "значение"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "целевая_роль"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2261 sql_help.c:2630
+#: sql_help.c:2707 sql_help.c:2712 sql_help.c:3879 sql_help.c:3888
+#: sql_help.c:3907 sql_help.c:3919 sql_help.c:4328 sql_help.c:4337
+#: sql_help.c:4356 sql_help.c:4368
+msgid "schema_name"
+msgstr "имя_схемы"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "предложение_GRANT_или_REVOKE"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "где допустимое предложение_GRANT_или_REVOKE:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1320 sql_help.c:1653 sql_help.c:2436 sql_help.c:2437
+#: sql_help.c:2438 sql_help.c:2439 sql_help.c:2440 sql_help.c:2574
+#: sql_help.c:2663 sql_help.c:2664 sql_help.c:2665 sql_help.c:2666
+#: sql_help.c:2667 sql_help.c:3229 sql_help.c:3230 sql_help.c:3231
+#: sql_help.c:3232 sql_help.c:3233 sql_help.c:3928 sql_help.c:3932
+#: sql_help.c:4377 sql_help.c:4381 sql_help.c:4696
+msgid "role_name"
+msgstr "имя_роли"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1336 sql_help.c:1338
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1427 sql_help.c:1683
+#: sql_help.c:2230 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351
+#: sql_help.c:2459 sql_help.c:2629 sql_help.c:2768 sql_help.c:2773
+#: sql_help.c:2775 sql_help.c:2896 sql_help.c:2909 sql_help.c:2923
+#: sql_help.c:2932 sql_help.c:2944 sql_help.c:2973 sql_help.c:3980
+#: sql_help.c:3995 sql_help.c:3997 sql_help.c:4084 sql_help.c:4087
+#: sql_help.c:4089 sql_help.c:4547 sql_help.c:4548 sql_help.c:4557
+#: sql_help.c:4604 sql_help.c:4605 sql_help.c:4606 sql_help.c:4607
+#: sql_help.c:4608 sql_help.c:4609 sql_help.c:4649 sql_help.c:4650
+#: sql_help.c:4655 sql_help.c:4660 sql_help.c:4804 sql_help.c:4805
+#: sql_help.c:4814 sql_help.c:4861 sql_help.c:4862 sql_help.c:4863
+#: sql_help.c:4864 sql_help.c:4865 sql_help.c:4866 sql_help.c:4920
+#: sql_help.c:4922 sql_help.c:4982 sql_help.c:5042 sql_help.c:5043
+#: sql_help.c:5052 sql_help.c:5099 sql_help.c:5100 sql_help.c:5101
+#: sql_help.c:5102 sql_help.c:5103 sql_help.c:5104
+msgid "expression"
+msgstr "выражение"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "ограничение_домена"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1313 sql_help.c:1360 sql_help.c:1361 sql_help.c:1362
+#: sql_help.c:1389 sql_help.c:1401 sql_help.c:1418 sql_help.c:1851
+#: sql_help.c:1853 sql_help.c:2233 sql_help.c:2345 sql_help.c:2350
+#: sql_help.c:2931 sql_help.c:2943 sql_help.c:3992
+msgid "constraint_name"
+msgstr "имя_ограничения"
+
+#: sql_help.c:247 sql_help.c:1314
+msgid "new_constraint_name"
+msgstr "имя_нового_ограничения"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "новая_версия"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "элемент_объект"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "где элемент_объект:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1843 sql_help.c:1848 sql_help.c:1855
+#: sql_help.c:1856 sql_help.c:1857 sql_help.c:1858 sql_help.c:1859
+#: sql_help.c:1860 sql_help.c:1861 sql_help.c:1866 sql_help.c:1868
+#: sql_help.c:1872 sql_help.c:1874 sql_help.c:1878 sql_help.c:1883
+#: sql_help.c:1884 sql_help.c:1891 sql_help.c:1892 sql_help.c:1893
+#: sql_help.c:1894 sql_help.c:1895 sql_help.c:1896 sql_help.c:1897
+#: sql_help.c:1898 sql_help.c:1899 sql_help.c:1900 sql_help.c:1901
+#: sql_help.c:1906 sql_help.c:1907 sql_help.c:4450 sql_help.c:4455
+#: sql_help.c:4456 sql_help.c:4457 sql_help.c:4458 sql_help.c:4464
+#: sql_help.c:4465 sql_help.c:4470 sql_help.c:4471 sql_help.c:4476
+#: sql_help.c:4477 sql_help.c:4478 sql_help.c:4479 sql_help.c:4480
+#: sql_help.c:4481
+msgid "object_name"
+msgstr "имя_объекта"
+
+# well-spelled: агр
+#: sql_help.c:329 sql_help.c:1844 sql_help.c:4453
+msgid "aggregate_name"
+msgstr "имя_агр_функции"
+
+#: sql_help.c:331 sql_help.c:1846 sql_help.c:2130 sql_help.c:2134
+#: sql_help.c:2136 sql_help.c:3356
+msgid "source_type"
+msgstr "исходный_тип"
+
+#: sql_help.c:332 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135
+#: sql_help.c:2137 sql_help.c:3357
+msgid "target_type"
+msgstr "целевой_тип"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1862 sql_help.c:2132
+#: sql_help.c:2173 sql_help.c:2249 sql_help.c:2517 sql_help.c:2548
+#: sql_help.c:3116 sql_help.c:4352 sql_help.c:4459 sql_help.c:4576
+#: sql_help.c:4580 sql_help.c:4584 sql_help.c:4587 sql_help.c:4833
+#: sql_help.c:4837 sql_help.c:4841 sql_help.c:4844 sql_help.c:5071
+#: sql_help.c:5075 sql_help.c:5079 sql_help.c:5082
+msgid "function_name"
+msgstr "имя_функции"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1869 sql_help.c:2541
+msgid "operator_name"
+msgstr "имя_оператора"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1870
+#: sql_help.c:2518 sql_help.c:3480
+msgid "left_type"
+msgstr "тип_слева"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1871
+#: sql_help.c:2519 sql_help.c:3481
+msgid "right_type"
+msgstr "тип_справа"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1407 sql_help.c:1873 sql_help.c:1875 sql_help.c:2538
+#: sql_help.c:2559 sql_help.c:2949 sql_help.c:3490 sql_help.c:3499
+msgid "index_method"
+msgstr "метод_индекса"
+
+#: sql_help.c:352 sql_help.c:1879 sql_help.c:4466
+msgid "procedure_name"
+msgstr "имя_процедуры"
+
+#: sql_help.c:356 sql_help.c:1885 sql_help.c:3903 sql_help.c:4472
+msgid "routine_name"
+msgstr "имя_подпрограммы"
+
+#: sql_help.c:368 sql_help.c:1379 sql_help.c:1902 sql_help.c:2393
+#: sql_help.c:2599 sql_help.c:2904 sql_help.c:3083 sql_help.c:3661
+#: sql_help.c:3925 sql_help.c:4374
+msgid "type_name"
+msgstr "имя_типа"
+
+#: sql_help.c:369 sql_help.c:1903 sql_help.c:2392 sql_help.c:2598
+#: sql_help.c:3084 sql_help.c:3314 sql_help.c:3662 sql_help.c:3910
+#: sql_help.c:4359
+msgid "lang_name"
+msgstr "имя_языка"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "и сигнатура_агр_функции:"
+
+#: sql_help.c:395 sql_help.c:1997 sql_help.c:2274
+msgid "handler_function"
+msgstr "функция_обработчик"
+
+#: sql_help.c:396 sql_help.c:2275
+msgid "validator_function"
+msgstr "функция_проверки"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1308 sql_help.c:1580
+msgid "action"
+msgstr "действие"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1310 sql_help.c:1328 sql_help.c:1332 sql_help.c:1333
+#: sql_help.c:1337 sql_help.c:1339 sql_help.c:1340 sql_help.c:1341
+#: sql_help.c:1342 sql_help.c:1344 sql_help.c:1347 sql_help.c:1348
+#: sql_help.c:1350 sql_help.c:1353 sql_help.c:1355 sql_help.c:1356
+#: sql_help.c:1403 sql_help.c:1405 sql_help.c:1412 sql_help.c:1421
+#: sql_help.c:1426 sql_help.c:1430 sql_help.c:1431 sql_help.c:1682
+#: sql_help.c:1685 sql_help.c:1689 sql_help.c:1725 sql_help.c:1850
+#: sql_help.c:1963 sql_help.c:1969 sql_help.c:1982 sql_help.c:1983
+#: sql_help.c:1984 sql_help.c:2324 sql_help.c:2337 sql_help.c:2390
+#: sql_help.c:2458 sql_help.c:2464 sql_help.c:2497 sql_help.c:2628
+#: sql_help.c:2737 sql_help.c:2772 sql_help.c:2774 sql_help.c:2886
+#: sql_help.c:2895 sql_help.c:2905 sql_help.c:2908 sql_help.c:2918
+#: sql_help.c:2922 sql_help.c:2945 sql_help.c:2947 sql_help.c:2954
+#: sql_help.c:2967 sql_help.c:2972 sql_help.c:2976 sql_help.c:2977
+#: sql_help.c:2993 sql_help.c:3119 sql_help.c:3259 sql_help.c:3882
+#: sql_help.c:3883 sql_help.c:3979 sql_help.c:3994 sql_help.c:3996
+#: sql_help.c:3998 sql_help.c:4083 sql_help.c:4086 sql_help.c:4088
+#: sql_help.c:4331 sql_help.c:4332 sql_help.c:4452 sql_help.c:4613
+#: sql_help.c:4619 sql_help.c:4621 sql_help.c:4870 sql_help.c:4876
+#: sql_help.c:4878 sql_help.c:4919 sql_help.c:4921 sql_help.c:4923
+#: sql_help.c:4970 sql_help.c:5108 sql_help.c:5114 sql_help.c:5116
+msgid "column_name"
+msgstr "имя_столбца"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1311 sql_help.c:1690
+msgid "new_column_name"
+msgstr "новое_имя_столбца"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1327 sql_help.c:1590
+msgid "where action is one of:"
+msgstr "где допустимое действие:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1329
+#: sql_help.c:1334 sql_help.c:1592 sql_help.c:1596 sql_help.c:2228
+#: sql_help.c:2325 sql_help.c:2537 sql_help.c:2730 sql_help.c:2887
+#: sql_help.c:3166 sql_help.c:4140
+msgid "data_type"
+msgstr "тип_данных"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1330 sql_help.c:1335
+#: sql_help.c:1593 sql_help.c:1597 sql_help.c:2229 sql_help.c:2328
+#: sql_help.c:2460 sql_help.c:2889 sql_help.c:2897 sql_help.c:2910
+#: sql_help.c:2924 sql_help.c:3167 sql_help.c:3173 sql_help.c:3989
+msgid "collation"
+msgstr "правило_сортировки"
+
+#: sql_help.c:456 sql_help.c:1331 sql_help.c:2329 sql_help.c:2338
+#: sql_help.c:2890 sql_help.c:2906 sql_help.c:2919
+msgid "column_constraint"
+msgstr "ограничение_столбца"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1349 sql_help.c:4967
+msgid "integer"
+msgstr "целое"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1351
+#: sql_help.c:1354
+msgid "attribute_option"
+msgstr "атрибут"
+
+#: sql_help.c:476 sql_help.c:1358 sql_help.c:2330 sql_help.c:2339
+#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920
+msgid "table_constraint"
+msgstr "ограничение_таблицы"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1363
+#: sql_help.c:1364 sql_help.c:1365 sql_help.c:1366 sql_help.c:1904
+msgid "trigger_name"
+msgstr "имя_триггера"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1377 sql_help.c:1378
+#: sql_help.c:2331 sql_help.c:2336 sql_help.c:2894 sql_help.c:2917
+msgid "parent_table"
+msgstr "таблица_родитель"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1549 sql_help.c:2260
+msgid "extension_name"
+msgstr "имя_расширения"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2394
+msgid "execution_cost"
+msgstr "стоимость_выполнения"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2395
+msgid "result_rows"
+msgstr "строк_в_результате"
+
+#: sql_help.c:547 sql_help.c:2396
+msgid "support_function"
+msgstr "вспомогательная_функция"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1632 sql_help.c:1640
+#: sql_help.c:1644 sql_help.c:1647 sql_help.c:1650 sql_help.c:2708
+#: sql_help.c:2710 sql_help.c:2713 sql_help.c:2714 sql_help.c:3880
+#: sql_help.c:3881 sql_help.c:3885 sql_help.c:3886 sql_help.c:3889
+#: sql_help.c:3890 sql_help.c:3892 sql_help.c:3893 sql_help.c:3895
+#: sql_help.c:3896 sql_help.c:3898 sql_help.c:3899 sql_help.c:3901
+#: sql_help.c:3902 sql_help.c:3908 sql_help.c:3909 sql_help.c:3911
+#: sql_help.c:3912 sql_help.c:3914 sql_help.c:3915 sql_help.c:3917
+#: sql_help.c:3918 sql_help.c:3920 sql_help.c:3921 sql_help.c:3923
+#: sql_help.c:3924 sql_help.c:3926 sql_help.c:3927 sql_help.c:3929
+#: sql_help.c:3930 sql_help.c:4329 sql_help.c:4330 sql_help.c:4334
+#: sql_help.c:4335 sql_help.c:4338 sql_help.c:4339 sql_help.c:4341
+#: sql_help.c:4342 sql_help.c:4344 sql_help.c:4345 sql_help.c:4347
+#: sql_help.c:4348 sql_help.c:4350 sql_help.c:4351 sql_help.c:4357
+#: sql_help.c:4358 sql_help.c:4360 sql_help.c:4361 sql_help.c:4363
+#: sql_help.c:4364 sql_help.c:4366 sql_help.c:4367 sql_help.c:4369
+#: sql_help.c:4370 sql_help.c:4372 sql_help.c:4373 sql_help.c:4375
+#: sql_help.c:4376 sql_help.c:4378 sql_help.c:4379
+msgid "role_specification"
+msgstr "указание_роли"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1663 sql_help.c:2197
+#: sql_help.c:2716 sql_help.c:3244 sql_help.c:3695 sql_help.c:4706
+msgid "user_name"
+msgstr "имя_пользователя"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1652 sql_help.c:2715
+#: sql_help.c:3931 sql_help.c:4380
+msgid "where role_specification can be:"
+msgstr "где допустимое указание_роли:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "имя_группы"
+
+#: sql_help.c:596 sql_help.c:1424 sql_help.c:2207 sql_help.c:2467
+#: sql_help.c:2501 sql_help.c:2902 sql_help.c:2915 sql_help.c:2929
+#: sql_help.c:2970 sql_help.c:2997 sql_help.c:3009 sql_help.c:3922
+#: sql_help.c:4371
+msgid "tablespace_name"
+msgstr "табл_пространство"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1371 sql_help.c:1381
+#: sql_help.c:1419 sql_help.c:1779 sql_help.c:1782
+msgid "index_name"
+msgstr "имя_индекса"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1374
+#: sql_help.c:1376 sql_help.c:1422 sql_help.c:2465 sql_help.c:2499
+#: sql_help.c:2900 sql_help.c:2913 sql_help.c:2927 sql_help.c:2968
+#: sql_help.c:2995
+msgid "storage_parameter"
+msgstr "параметр_хранения"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "номер_столбца"
+
+#: sql_help.c:631 sql_help.c:1867 sql_help.c:4463
+msgid "large_object_oid"
+msgstr "oid_большого_объекта"
+
+#: sql_help.c:690 sql_help.c:1357 sql_help.c:2888
+msgid "compression_method"
+msgstr "метод_сжатия"
+
+#: sql_help.c:692 sql_help.c:1372
+msgid "new_access_method"
+msgstr "новый_метод_доступа"
+
+#: sql_help.c:725 sql_help.c:2522
+msgid "res_proc"
+msgstr "процедура_ограничения"
+
+#: sql_help.c:726 sql_help.c:2523
+msgid "join_proc"
+msgstr "процедура_соединения"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2540
+msgid "strategy_number"
+msgstr "номер_стратегии"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2542 sql_help.c:2543
+#: sql_help.c:2546 sql_help.c:2547
+msgid "op_type"
+msgstr "тип_операции"
+
+#: sql_help.c:782 sql_help.c:2544
+msgid "sort_family_name"
+msgstr "семейство_сортировки"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2545
+msgid "support_number"
+msgstr "номер_опорной_процедуры"
+
+#: sql_help.c:787 sql_help.c:2133 sql_help.c:2549 sql_help.c:3086
+#: sql_help.c:3088
+msgid "argument_type"
+msgstr "тип_аргумента"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1545 sql_help.c:1548 sql_help.c:1724 sql_help.c:1778
+#: sql_help.c:1781 sql_help.c:1852 sql_help.c:1877 sql_help.c:1890
+#: sql_help.c:1905 sql_help.c:1962 sql_help.c:1968 sql_help.c:2323
+#: sql_help.c:2335 sql_help.c:2456 sql_help.c:2496 sql_help.c:2573
+#: sql_help.c:2627 sql_help.c:2684 sql_help.c:2736 sql_help.c:2769
+#: sql_help.c:2776 sql_help.c:2885 sql_help.c:2903 sql_help.c:2916
+#: sql_help.c:2992 sql_help.c:3112 sql_help.c:3293 sql_help.c:3516
+#: sql_help.c:3565 sql_help.c:3671 sql_help.c:3878 sql_help.c:3884
+#: sql_help.c:3945 sql_help.c:3977 sql_help.c:4327 sql_help.c:4333
+#: sql_help.c:4451 sql_help.c:4562 sql_help.c:4564 sql_help.c:4626
+#: sql_help.c:4665 sql_help.c:4819 sql_help.c:4821 sql_help.c:4883
+#: sql_help.c:4917 sql_help.c:4969 sql_help.c:5057 sql_help.c:5059
+#: sql_help.c:5121
+msgid "table_name"
+msgstr "имя_таблицы"
+
+#: sql_help.c:823 sql_help.c:2575
+msgid "using_expression"
+msgstr "выражение_использования"
+
+#: sql_help.c:824 sql_help.c:2576
+msgid "check_expression"
+msgstr "выражение_проверки"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2623
+msgid "publication_object"
+msgstr "объект_публикации"
+
+#: sql_help.c:903 sql_help.c:2624
+msgid "publication_parameter"
+msgstr "параметр_публикации"
+
+#: sql_help.c:909 sql_help.c:2626
+msgid "where publication_object is one of:"
+msgstr "где объект_публикации:"
+
+#: sql_help.c:952 sql_help.c:1636 sql_help.c:2434 sql_help.c:2661
+#: sql_help.c:3227
+msgid "password"
+msgstr "пароль"
+
+#: sql_help.c:953 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662
+#: sql_help.c:3228
+msgid "timestamp"
+msgstr "timestamp"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:3891
+#: sql_help.c:4340
+msgid "database_name"
+msgstr "имя_БД"
+
+#: sql_help.c:1073 sql_help.c:2731
+msgid "increment"
+msgstr "шаг"
+
+#: sql_help.c:1074 sql_help.c:2732
+msgid "minvalue"
+msgstr "мин_значение"
+
+#: sql_help.c:1075 sql_help.c:2733
+msgid "maxvalue"
+msgstr "макс_значение"
+
+#: sql_help.c:1076 sql_help.c:2734 sql_help.c:4560 sql_help.c:4663
+#: sql_help.c:4817 sql_help.c:4986 sql_help.c:5055
+msgid "start"
+msgstr "начальное_значение"
+
+#: sql_help.c:1077 sql_help.c:1346
+msgid "restart"
+msgstr "значение_перезапуска"
+
+#: sql_help.c:1078 sql_help.c:2735
+msgid "cache"
+msgstr "кеш"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "новое_имя"
+
+#: sql_help.c:1142 sql_help.c:2788
+msgid "conninfo"
+msgstr "строка_подключения"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2789
+msgid "publication_name"
+msgstr "имя_публикации"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "параметр_публикации"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "параметр_обновления"
+
+#: sql_help.c:1161 sql_help.c:2790
+msgid "subscription_parameter"
+msgstr "параметр_подписки"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "параметр_пропуска"
+
+#: sql_help.c:1323 sql_help.c:1326
+msgid "partition_name"
+msgstr "имя_секции"
+
+#: sql_help.c:1324 sql_help.c:2340 sql_help.c:2921
+msgid "partition_bound_spec"
+msgstr "указание_границ_секции"
+
+#: sql_help.c:1343 sql_help.c:1393 sql_help.c:2935
+msgid "sequence_options"
+msgstr "параметры_последовательности"
+
+#: sql_help.c:1345
+msgid "sequence_option"
+msgstr "параметр_последовательности"
+
+#: sql_help.c:1359
+msgid "table_constraint_using_index"
+msgstr "ограничение_таблицы_с_индексом"
+
+#: sql_help.c:1367 sql_help.c:1368 sql_help.c:1369 sql_help.c:1370
+msgid "rewrite_rule_name"
+msgstr "имя_правила_перезаписи"
+
+#: sql_help.c:1382 sql_help.c:2352 sql_help.c:2960
+msgid "and partition_bound_spec is:"
+msgstr "и указание_границ_секции:"
+
+#: sql_help.c:1383 sql_help.c:1384 sql_help.c:1385 sql_help.c:2353
+#: sql_help.c:2354 sql_help.c:2355 sql_help.c:2961 sql_help.c:2962
+#: sql_help.c:2963
+msgid "partition_bound_expr"
+msgstr "выражение_границ_секции"
+
+#: sql_help.c:1386 sql_help.c:1387 sql_help.c:2356 sql_help.c:2357
+#: sql_help.c:2964 sql_help.c:2965
+msgid "numeric_literal"
+msgstr "числовая_константа"
+
+#: sql_help.c:1388
+msgid "and column_constraint is:"
+msgstr "и ограничение_столбца:"
+
+#: sql_help.c:1391 sql_help.c:2347 sql_help.c:2388 sql_help.c:2597
+#: sql_help.c:2933
+msgid "default_expr"
+msgstr "выражение_по_умолчанию"
+
+#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2934
+msgid "generation_expr"
+msgstr "генерирующее_выражение"
+
+#: sql_help.c:1394 sql_help.c:1395 sql_help.c:1404 sql_help.c:1406
+#: sql_help.c:1410 sql_help.c:2936 sql_help.c:2937 sql_help.c:2946
+#: sql_help.c:2948 sql_help.c:2952
+msgid "index_parameters"
+msgstr "параметры_индекса"
+
+#: sql_help.c:1396 sql_help.c:1413 sql_help.c:2938 sql_help.c:2955
+msgid "reftable"
+msgstr "целевая_таблица"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956
+msgid "refcolumn"
+msgstr "целевой_столбец"
+
+#: sql_help.c:1398 sql_help.c:1399 sql_help.c:1415 sql_help.c:1416
+#: sql_help.c:2940 sql_help.c:2941 sql_help.c:2957 sql_help.c:2958
+msgid "referential_action"
+msgstr "ссылочное_действие"
+
+#: sql_help.c:1400 sql_help.c:2349 sql_help.c:2942
+msgid "and table_constraint is:"
+msgstr "и ограничение_таблицы:"
+
+#: sql_help.c:1408 sql_help.c:2950
+msgid "exclude_element"
+msgstr "объект_исключения"
+
+#: sql_help.c:1409 sql_help.c:2951 sql_help.c:4558 sql_help.c:4661
+#: sql_help.c:4815 sql_help.c:4984 sql_help.c:5053
+msgid "operator"
+msgstr "оператор"
+
+#: sql_help.c:1411 sql_help.c:2468 sql_help.c:2953
+msgid "predicate"
+msgstr "предикат"
+
+#: sql_help.c:1417
+msgid "and table_constraint_using_index is:"
+msgstr "и ограничение_таблицы_с_индексом:"
+
+#: sql_help.c:1420 sql_help.c:2966
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "параметры_индекса в ограничениях UNIQUE, PRIMARY KEY и EXCLUDE:"
+
+#: sql_help.c:1425 sql_help.c:2971
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "объект_исключения в ограничении EXCLUDE:"
+
+#: sql_help.c:1428 sql_help.c:2461 sql_help.c:2898 sql_help.c:2911
+#: sql_help.c:2925 sql_help.c:2974 sql_help.c:3990
+msgid "opclass"
+msgstr "класс_оператора"
+
+#: sql_help.c:1429 sql_help.c:2975
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "ссылочное действие в ограничении FOREIGN KEY/REFERENCES:"
+
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:3012
+msgid "tablespace_option"
+msgstr "параметр_табл_пространства"
+
+#: sql_help.c:1471 sql_help.c:1474 sql_help.c:1480 sql_help.c:1484
+msgid "token_type"
+msgstr "тип_фрагмента"
+
+#: sql_help.c:1472 sql_help.c:1475
+msgid "dictionary_name"
+msgstr "имя_словаря"
+
+#: sql_help.c:1477 sql_help.c:1481
+msgid "old_dictionary"
+msgstr "старый_словарь"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "new_dictionary"
+msgstr "новый_словарь"
+
+#: sql_help.c:1577 sql_help.c:1591 sql_help.c:1594 sql_help.c:1595
+#: sql_help.c:3165
+msgid "attribute_name"
+msgstr "имя_атрибута"
+
+#: sql_help.c:1578
+msgid "new_attribute_name"
+msgstr "новое_имя_атрибута"
+
+#: sql_help.c:1582 sql_help.c:1586
+msgid "new_enum_value"
+msgstr "новое_значение_перечисления"
+
+#: sql_help.c:1583
+msgid "neighbor_enum_value"
+msgstr "соседнее_значение_перечисления"
+
+#: sql_help.c:1585
+msgid "existing_enum_value"
+msgstr "существующее_значение_перечисления"
+
+#: sql_help.c:1588
+msgid "property"
+msgstr "свойство"
+
+#: sql_help.c:1664 sql_help.c:2332 sql_help.c:2341 sql_help.c:2747
+#: sql_help.c:3245 sql_help.c:3696 sql_help.c:3900 sql_help.c:3946
+#: sql_help.c:4349
+msgid "server_name"
+msgstr "имя_сервера"
+
+#: sql_help.c:1696 sql_help.c:1699 sql_help.c:3260
+msgid "view_option_name"
+msgstr "имя_параметра_представления"
+
+#: sql_help.c:1697 sql_help.c:3261
+msgid "view_option_value"
+msgstr "значение_параметра_представления"
+
+#: sql_help.c:1718 sql_help.c:1719 sql_help.c:4956 sql_help.c:4957
+msgid "table_and_columns"
+msgstr "таблица_и_столбцы"
+
+#: sql_help.c:1720 sql_help.c:1783 sql_help.c:1974 sql_help.c:3744
+#: sql_help.c:4184 sql_help.c:4958
+msgid "where option can be one of:"
+msgstr "где допустимый параметр:"
+
+#: sql_help.c:1721 sql_help.c:1722 sql_help.c:1784 sql_help.c:1976
+#: sql_help.c:1979 sql_help.c:2158 sql_help.c:3745 sql_help.c:3746
+#: sql_help.c:3747 sql_help.c:3748 sql_help.c:3749 sql_help.c:3750
+#: sql_help.c:3751 sql_help.c:3752 sql_help.c:4185 sql_help.c:4187
+#: sql_help.c:4959 sql_help.c:4960 sql_help.c:4961 sql_help.c:4962
+#: sql_help.c:4963 sql_help.c:4964 sql_help.c:4965 sql_help.c:4966
+msgid "boolean"
+msgstr "логическое_значение"
+
+#: sql_help.c:1723 sql_help.c:4968
+msgid "and table_and_columns is:"
+msgstr "и таблица_и_столбцы:"
+
+#: sql_help.c:1739 sql_help.c:4722 sql_help.c:4724 sql_help.c:4748
+msgid "transaction_mode"
+msgstr "режим_транзакции"
+
+#: sql_help.c:1740 sql_help.c:4725 sql_help.c:4749
+msgid "where transaction_mode is one of:"
+msgstr "где допустимый режим_транзакции:"
+
+#: sql_help.c:1749 sql_help.c:4568 sql_help.c:4577 sql_help.c:4581
+#: sql_help.c:4585 sql_help.c:4588 sql_help.c:4825 sql_help.c:4834
+#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5063
+#: sql_help.c:5072 sql_help.c:5076 sql_help.c:5080 sql_help.c:5083
+msgid "argument"
+msgstr "аргумент"
+
+#: sql_help.c:1849
+msgid "relation_name"
+msgstr "имя_отношения"
+
+#: sql_help.c:1854 sql_help.c:3894 sql_help.c:4343
+msgid "domain_name"
+msgstr "имя_домена"
+
+#: sql_help.c:1876
+msgid "policy_name"
+msgstr "имя_политики"
+
+#: sql_help.c:1889
+msgid "rule_name"
+msgstr "имя_правила"
+
+#: sql_help.c:1908 sql_help.c:4482
+msgid "string_literal"
+msgstr "строковая_константа"
+
+#: sql_help.c:1933 sql_help.c:4149 sql_help.c:4396
+msgid "transaction_id"
+msgstr "код_транзакции"
+
+#: sql_help.c:1964 sql_help.c:1971 sql_help.c:4016
+msgid "filename"
+msgstr "имя_файла"
+
+#: sql_help.c:1965 sql_help.c:1972 sql_help.c:2686 sql_help.c:2687
+#: sql_help.c:2688
+msgid "command"
+msgstr "команда"
+
+#: sql_help.c:1967 sql_help.c:2685 sql_help.c:3115 sql_help.c:3296
+#: sql_help.c:4000 sql_help.c:4077 sql_help.c:4080 sql_help.c:4551
+#: sql_help.c:4553 sql_help.c:4654 sql_help.c:4656 sql_help.c:4808
+#: sql_help.c:4810 sql_help.c:4926 sql_help.c:5046 sql_help.c:5048
+msgid "condition"
+msgstr "условие"
+
+#: sql_help.c:1970 sql_help.c:2502 sql_help.c:2998 sql_help.c:3262
+#: sql_help.c:3280 sql_help.c:3981
+msgid "query"
+msgstr "запрос"
+
+#: sql_help.c:1975
+msgid "format_name"
+msgstr "имя_формата"
+
+#: sql_help.c:1977
+msgid "delimiter_character"
+msgstr "символ_разделитель"
+
+#: sql_help.c:1978
+msgid "null_string"
+msgstr "представление_NULL"
+
+#: sql_help.c:1980
+msgid "quote_character"
+msgstr "символ_кавычек"
+
+#: sql_help.c:1981
+msgid "escape_character"
+msgstr "спецсимвол"
+
+#: sql_help.c:1985
+msgid "encoding_name"
+msgstr "имя_кодировки"
+
+#: sql_help.c:1996
+msgid "access_method_type"
+msgstr "тип_метода_доступа"
+
+#: sql_help.c:2067 sql_help.c:2086 sql_help.c:2089
+msgid "arg_data_type"
+msgstr "тип_данных_аргумента"
+
+#: sql_help.c:2068 sql_help.c:2090 sql_help.c:2098
+msgid "sfunc"
+msgstr "функция_состояния"
+
+#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099
+msgid "state_data_type"
+msgstr "тип_данных_состояния"
+
+#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100
+msgid "state_data_size"
+msgstr "размер_данных_состояния"
+
+#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101
+msgid "ffunc"
+msgstr "функция_завершения"
+
+#: sql_help.c:2072 sql_help.c:2102
+msgid "combinefunc"
+msgstr "комбинирующая_функция"
+
+#: sql_help.c:2073 sql_help.c:2103
+msgid "serialfunc"
+msgstr "функция_сериализации"
+
+#: sql_help.c:2074 sql_help.c:2104
+msgid "deserialfunc"
+msgstr "функция_десериализации"
+
+#: sql_help.c:2075 sql_help.c:2094 sql_help.c:2105
+msgid "initial_condition"
+msgstr "начальное_условие"
+
+#: sql_help.c:2076 sql_help.c:2106
+msgid "msfunc"
+msgstr "функция_состояния_движ"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "minvfunc"
+msgstr "обратная_функция_движ"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "mstate_data_type"
+msgstr "тип_данных_состояния_движ"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "mstate_data_size"
+msgstr "размер_данных_состояния_движ"
+
+#: sql_help.c:2080 sql_help.c:2110
+msgid "mffunc"
+msgstr "функция_завершения_движ"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "minitial_condition"
+msgstr "начальное_условие_движ"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "sort_operator"
+msgstr "оператор_сортировки"
+
+#: sql_help.c:2095
+msgid "or the old syntax"
+msgstr "или старый синтаксис"
+
+#: sql_help.c:2097
+msgid "base_type"
+msgstr "базовый_тип"
+
+#: sql_help.c:2154 sql_help.c:2201
+msgid "locale"
+msgstr "код_локали"
+
+#: sql_help.c:2155 sql_help.c:2202
+msgid "lc_collate"
+msgstr "код_правила_сортировки"
+
+#: sql_help.c:2156 sql_help.c:2203
+msgid "lc_ctype"
+msgstr "код_классификации_символов"
+
+#: sql_help.c:2157 sql_help.c:4449
+msgid "provider"
+msgstr "провайдер"
+
+#: sql_help.c:2159 sql_help.c:2262
+msgid "version"
+msgstr "версия"
+
+#: sql_help.c:2161
+msgid "existing_collation"
+msgstr "существующее_правило_сортировки"
+
+#: sql_help.c:2171
+msgid "source_encoding"
+msgstr "исходная_кодировка"
+
+#: sql_help.c:2172
+msgid "dest_encoding"
+msgstr "целевая_кодировка"
+
+#: sql_help.c:2198 sql_help.c:3038
+msgid "template"
+msgstr "шаблон"
+
+#: sql_help.c:2199
+msgid "encoding"
+msgstr "кодировка"
+
+#: sql_help.c:2200
+msgid "strategy"
+msgstr "стратегия"
+
+#: sql_help.c:2204
+msgid "icu_locale"
+msgstr "локаль_icu"
+
+#: sql_help.c:2205
+msgid "locale_provider"
+msgstr "провайдер_локали"
+
+#: sql_help.c:2206
+msgid "collation_version"
+msgstr "версия_правила_сортировки"
+
+#: sql_help.c:2211
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2231
+msgid "constraint"
+msgstr "ограничение"
+
+#: sql_help.c:2232
+msgid "where constraint is:"
+msgstr "где ограничение:"
+
+#: sql_help.c:2246 sql_help.c:2683 sql_help.c:3111
+msgid "event"
+msgstr "событие"
+
+#: sql_help.c:2247
+msgid "filter_variable"
+msgstr "переменная_фильтра"
+
+#: sql_help.c:2248
+msgid "filter_value"
+msgstr "значение_фильтра"
+
+#: sql_help.c:2344 sql_help.c:2930
+msgid "where column_constraint is:"
+msgstr "где ограничение_столбца:"
+
+#: sql_help.c:2389
+msgid "rettype"
+msgstr "тип_возврата"
+
+#: sql_help.c:2391
+msgid "column_type"
+msgstr "тип_столбца"
+
+#: sql_help.c:2400 sql_help.c:2603
+msgid "definition"
+msgstr "определение"
+
+#: sql_help.c:2401 sql_help.c:2604
+msgid "obj_file"
+msgstr "объектный_файл"
+
+#: sql_help.c:2402 sql_help.c:2605
+msgid "link_symbol"
+msgstr "символ_в_экспорте"
+
+#: sql_help.c:2403 sql_help.c:2606
+msgid "sql_body"
+msgstr "тело_sql"
+
+#: sql_help.c:2441 sql_help.c:2668 sql_help.c:3234
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2457 sql_help.c:2498 sql_help.c:2899 sql_help.c:2912
+#: sql_help.c:2926 sql_help.c:2994
+msgid "method"
+msgstr "метод"
+
+#: sql_help.c:2462
+msgid "opclass_parameter"
+msgstr "параметр_класса_оп"
+
+#: sql_help.c:2479
+msgid "call_handler"
+msgstr "обработчик_вызова"
+
+#: sql_help.c:2480
+msgid "inline_handler"
+msgstr "обработчик_внедрённого_кода"
+
+#: sql_help.c:2481
+msgid "valfunction"
+msgstr "функция_проверки"
+
+#: sql_help.c:2520
+msgid "com_op"
+msgstr "коммут_оператор"
+
+#: sql_help.c:2521
+msgid "neg_op"
+msgstr "обратный_оператор"
+
+#: sql_help.c:2539
+msgid "family_name"
+msgstr "имя_семейства"
+
+#: sql_help.c:2550
+msgid "storage_type"
+msgstr "тип_хранения"
+
+#: sql_help.c:2689 sql_help.c:3118
+msgid "where event can be one of:"
+msgstr "где допустимое событие:"
+
+#: sql_help.c:2709 sql_help.c:2711
+msgid "schema_element"
+msgstr "элемент_схемы"
+
+#: sql_help.c:2748
+msgid "server_type"
+msgstr "тип_сервера"
+
+#: sql_help.c:2749
+msgid "server_version"
+msgstr "версия_сервера"
+
+#: sql_help.c:2750 sql_help.c:3897 sql_help.c:4346
+msgid "fdw_name"
+msgstr "имя_обёртки_сторонних_данных"
+
+#: sql_help.c:2767 sql_help.c:2770
+msgid "statistics_name"
+msgstr "имя_статистики"
+
+#: sql_help.c:2771
+msgid "statistics_kind"
+msgstr "вид_статистики"
+
+#: sql_help.c:2787
+msgid "subscription_name"
+msgstr "имя_подписки"
+
+#: sql_help.c:2892
+msgid "source_table"
+msgstr "исходная_таблица"
+
+#: sql_help.c:2893
+msgid "like_option"
+msgstr "параметр_порождения"
+
+#: sql_help.c:2959
+msgid "and like_option is:"
+msgstr "и параметр_порождения:"
+
+#: sql_help.c:3011
+msgid "directory"
+msgstr "каталог"
+
+#: sql_help.c:3025
+msgid "parser_name"
+msgstr "имя_анализатора"
+
+#: sql_help.c:3026
+msgid "source_config"
+msgstr "исходная_конфигурация"
+
+#: sql_help.c:3055
+msgid "start_function"
+msgstr "функция_начала"
+
+#: sql_help.c:3056
+msgid "gettoken_function"
+msgstr "функция_выдачи_фрагмента"
+
+#: sql_help.c:3057
+msgid "end_function"
+msgstr "функция_окончания"
+
+#: sql_help.c:3058
+msgid "lextypes_function"
+msgstr "функция_лекс_типов"
+
+#: sql_help.c:3059
+msgid "headline_function"
+msgstr "функция_создания_выдержек"
+
+#: sql_help.c:3071
+msgid "init_function"
+msgstr "функция_инициализации"
+
+#: sql_help.c:3072
+msgid "lexize_function"
+msgstr "функция_выделения_лексем"
+
+#: sql_help.c:3085
+msgid "from_sql_function_name"
+msgstr "имя_функции_из_sql"
+
+#: sql_help.c:3087
+msgid "to_sql_function_name"
+msgstr "имя_функции_в_sql"
+
+#: sql_help.c:3113
+msgid "referenced_table_name"
+msgstr "ссылающаяся_таблица"
+
+#: sql_help.c:3114
+msgid "transition_relation_name"
+msgstr "имя_переходного_отношения"
+
+#: sql_help.c:3117
+msgid "arguments"
+msgstr "аргументы"
+
+#: sql_help.c:3169
+msgid "label"
+msgstr "метка"
+
+#: sql_help.c:3171
+msgid "subtype"
+msgstr "подтип"
+
+#: sql_help.c:3172
+msgid "subtype_operator_class"
+msgstr "класс_оператора_подтипа"
+
+#: sql_help.c:3174
+msgid "canonical_function"
+msgstr "каноническая_функция"
+
+#: sql_help.c:3175
+msgid "subtype_diff_function"
+msgstr "функция_различий_подтипа"
+
+#: sql_help.c:3176
+msgid "multirange_type_name"
+msgstr "имя_мультидиапазонного_типа"
+
+#: sql_help.c:3178
+msgid "input_function"
+msgstr "функция_ввода"
+
+#: sql_help.c:3179
+msgid "output_function"
+msgstr "функция_вывода"
+
+#: sql_help.c:3180
+msgid "receive_function"
+msgstr "функция_получения"
+
+#: sql_help.c:3181
+msgid "send_function"
+msgstr "функция_отправки"
+
+#: sql_help.c:3182
+msgid "type_modifier_input_function"
+msgstr "функция_ввода_модификатора_типа"
+
+#: sql_help.c:3183
+msgid "type_modifier_output_function"
+msgstr "функция_вывода_модификатора_типа"
+
+#: sql_help.c:3184
+msgid "analyze_function"
+msgstr "функция_анализа"
+
+#: sql_help.c:3185
+msgid "subscript_function"
+msgstr "функция_обращения_по_индексу"
+
+#: sql_help.c:3186
+msgid "internallength"
+msgstr "внутр_длина"
+
+#: sql_help.c:3187
+msgid "alignment"
+msgstr "выравнивание"
+
+#: sql_help.c:3188
+msgid "storage"
+msgstr "хранение"
+
+#: sql_help.c:3189
+msgid "like_type"
+msgstr "тип_образец"
+
+#: sql_help.c:3190
+msgid "category"
+msgstr "категория"
+
+#: sql_help.c:3191
+msgid "preferred"
+msgstr "предпочитаемый"
+
+#: sql_help.c:3192
+msgid "default"
+msgstr "по_умолчанию"
+
+#: sql_help.c:3193
+msgid "element"
+msgstr "элемент"
+
+#: sql_help.c:3194
+msgid "delimiter"
+msgstr "разделитель"
+
+#: sql_help.c:3195
+msgid "collatable"
+msgstr "сортируемый"
+
+#: sql_help.c:3292 sql_help.c:3976 sql_help.c:4066 sql_help.c:4546
+#: sql_help.c:4648 sql_help.c:4803 sql_help.c:4916 sql_help.c:5041
+msgid "with_query"
+msgstr "запрос_WITH"
+
+#: sql_help.c:3294 sql_help.c:3978 sql_help.c:4565 sql_help.c:4571
+#: sql_help.c:4574 sql_help.c:4578 sql_help.c:4582 sql_help.c:4590
+#: sql_help.c:4822 sql_help.c:4828 sql_help.c:4831 sql_help.c:4835
+#: sql_help.c:4839 sql_help.c:4847 sql_help.c:4918 sql_help.c:5060
+#: sql_help.c:5066 sql_help.c:5069 sql_help.c:5073 sql_help.c:5077
+#: sql_help.c:5085
+msgid "alias"
+msgstr "псевдоним"
+
+#: sql_help.c:3295 sql_help.c:4550 sql_help.c:4592 sql_help.c:4594
+#: sql_help.c:4598 sql_help.c:4600 sql_help.c:4601 sql_help.c:4602
+#: sql_help.c:4653 sql_help.c:4807 sql_help.c:4849 sql_help.c:4851
+#: sql_help.c:4855 sql_help.c:4857 sql_help.c:4858 sql_help.c:4859
+#: sql_help.c:4925 sql_help.c:5045 sql_help.c:5087 sql_help.c:5089
+#: sql_help.c:5093 sql_help.c:5095 sql_help.c:5096 sql_help.c:5097
+msgid "from_item"
+msgstr "источник_данных"
+
+#: sql_help.c:3297 sql_help.c:3778 sql_help.c:4116 sql_help.c:4927
+msgid "cursor_name"
+msgstr "имя_курсора"
+
+#: sql_help.c:3298 sql_help.c:3984 sql_help.c:4928
+msgid "output_expression"
+msgstr "выражение_результата"
+
+#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4549 sql_help.c:4651
+#: sql_help.c:4806 sql_help.c:4929 sql_help.c:5044
+msgid "output_name"
+msgstr "имя_результата"
+
+#: sql_help.c:3315
+msgid "code"
+msgstr "внедрённый_код"
+
+#: sql_help.c:3720
+msgid "parameter"
+msgstr "параметр"
+
+#: sql_help.c:3742 sql_help.c:3743 sql_help.c:4141
+msgid "statement"
+msgstr "оператор"
+
+#: sql_help.c:3777 sql_help.c:4115
+msgid "direction"
+msgstr "направление"
+
+#: sql_help.c:3779 sql_help.c:4117
+msgid "where direction can be one of:"
+msgstr "где допустимое направление:"
+
+#: sql_help.c:3780 sql_help.c:3781 sql_help.c:3782 sql_help.c:3783
+#: sql_help.c:3784 sql_help.c:4118 sql_help.c:4119 sql_help.c:4120
+#: sql_help.c:4121 sql_help.c:4122 sql_help.c:4559 sql_help.c:4561
+#: sql_help.c:4662 sql_help.c:4664 sql_help.c:4816 sql_help.c:4818
+#: sql_help.c:4985 sql_help.c:4987 sql_help.c:5054 sql_help.c:5056
+msgid "count"
+msgstr "число"
+
+#: sql_help.c:3887 sql_help.c:4336
+msgid "sequence_name"
+msgstr "имя_последовательности"
+
+#: sql_help.c:3905 sql_help.c:4354
+msgid "arg_name"
+msgstr "имя_аргумента"
+
+#: sql_help.c:3906 sql_help.c:4355
+msgid "arg_type"
+msgstr "тип_аргумента"
+
+#: sql_help.c:3913 sql_help.c:4362
+msgid "loid"
+msgstr "код_БО"
+
+#: sql_help.c:3944
+msgid "remote_schema"
+msgstr "удалённая_схема"
+
+#: sql_help.c:3947
+msgid "local_schema"
+msgstr "локальная_схема"
+
+#: sql_help.c:3982
+msgid "conflict_target"
+msgstr "объект_конфликта"
+
+#: sql_help.c:3983
+msgid "conflict_action"
+msgstr "действие_при_конфликте"
+
+#: sql_help.c:3986
+msgid "where conflict_target can be one of:"
+msgstr "где допустимый объект_конфликта:"
+
+#: sql_help.c:3987
+msgid "index_column_name"
+msgstr "имя_столбца_индекса"
+
+#: sql_help.c:3988
+msgid "index_expression"
+msgstr "выражение_индекса"
+
+#: sql_help.c:3991
+msgid "index_predicate"
+msgstr "предикат_индекса"
+
+#: sql_help.c:3993
+msgid "and conflict_action is one of:"
+msgstr "а допустимое действие_при_конфликте:"
+
+#: sql_help.c:3999 sql_help.c:4924
+msgid "sub-SELECT"
+msgstr "вложенный_SELECT"
+
+#: sql_help.c:4008 sql_help.c:4130 sql_help.c:4900
+msgid "channel"
+msgstr "канал"
+
+#: sql_help.c:4030
+msgid "lockmode"
+msgstr "режим_блокировки"
+
+#: sql_help.c:4031
+msgid "where lockmode is one of:"
+msgstr "где допустимый режим_блокировки:"
+
+#: sql_help.c:4067
+msgid "target_table_name"
+msgstr "имя_целевой_таблицы"
+
+#: sql_help.c:4068
+msgid "target_alias"
+msgstr "псевдоним_назначения"
+
+#: sql_help.c:4069
+msgid "data_source"
+msgstr "источник_данных"
+
+#: sql_help.c:4070 sql_help.c:4595 sql_help.c:4852 sql_help.c:5090
+msgid "join_condition"
+msgstr "условие_соединения"
+
+#: sql_help.c:4071
+msgid "when_clause"
+msgstr "предложение_when"
+
+#: sql_help.c:4072
+msgid "where data_source is:"
+msgstr "где источник_данных:"
+
+#: sql_help.c:4073
+msgid "source_table_name"
+msgstr "имя_исходной_таблицы"
+
+#: sql_help.c:4074
+msgid "source_query"
+msgstr "исходный_запрос"
+
+#: sql_help.c:4075
+msgid "source_alias"
+msgstr "псевдоним_источника"
+
+#: sql_help.c:4076
+msgid "and when_clause is:"
+msgstr "и предложение_when:"
+
+#: sql_help.c:4078
+msgid "merge_update"
+msgstr "merge_update"
+
+#: sql_help.c:4079
+msgid "merge_delete"
+msgstr "merge_delete"
+
+#: sql_help.c:4081
+msgid "merge_insert"
+msgstr "merge_insert"
+
+#: sql_help.c:4082
+msgid "and merge_insert is:"
+msgstr "и merge_insert:"
+
+#: sql_help.c:4085
+msgid "and merge_update is:"
+msgstr "и merge_update:"
+
+#: sql_help.c:4090
+msgid "and merge_delete is:"
+msgstr "и merge_delete:"
+
+#: sql_help.c:4131
+msgid "payload"
+msgstr "сообщение_нагрузка"
+
+#: sql_help.c:4158
+msgid "old_role"
+msgstr "старая_роль"
+
+#: sql_help.c:4159
+msgid "new_role"
+msgstr "новая_роль"
+
+#: sql_help.c:4195 sql_help.c:4404 sql_help.c:4412
+msgid "savepoint_name"
+msgstr "имя_точки_сохранения"
+
+#: sql_help.c:4552 sql_help.c:4610 sql_help.c:4809 sql_help.c:4867
+#: sql_help.c:5047 sql_help.c:5105
+msgid "grouping_element"
+msgstr "элемент_группирования"
+
+#: sql_help.c:4554 sql_help.c:4657 sql_help.c:4811 sql_help.c:5049
+msgid "window_name"
+msgstr "имя_окна"
+
+#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050
+msgid "window_definition"
+msgstr "определение_окна"
+
+#: sql_help.c:4556 sql_help.c:4570 sql_help.c:4614 sql_help.c:4659
+#: sql_help.c:4813 sql_help.c:4827 sql_help.c:4871 sql_help.c:5051
+#: sql_help.c:5065 sql_help.c:5109
+msgid "select"
+msgstr "select"
+
+#: sql_help.c:4563 sql_help.c:4820 sql_help.c:5058
+msgid "where from_item can be one of:"
+msgstr "где допустимый источник_данных:"
+
+#: sql_help.c:4566 sql_help.c:4572 sql_help.c:4575 sql_help.c:4579
+#: sql_help.c:4591 sql_help.c:4823 sql_help.c:4829 sql_help.c:4832
+#: sql_help.c:4836 sql_help.c:4848 sql_help.c:5061 sql_help.c:5067
+#: sql_help.c:5070 sql_help.c:5074 sql_help.c:5086
+msgid "column_alias"
+msgstr "псевдоним_столбца"
+
+#: sql_help.c:4567 sql_help.c:4824 sql_help.c:5062
+msgid "sampling_method"
+msgstr "метод_выборки"
+
+#: sql_help.c:4569 sql_help.c:4826 sql_help.c:5064
+msgid "seed"
+msgstr "начальное_число"
+
+#: sql_help.c:4573 sql_help.c:4612 sql_help.c:4830 sql_help.c:4869
+#: sql_help.c:5068 sql_help.c:5107
+msgid "with_query_name"
+msgstr "имя_запроса_WITH"
+
+#: sql_help.c:4583 sql_help.c:4586 sql_help.c:4589 sql_help.c:4840
+#: sql_help.c:4843 sql_help.c:4846 sql_help.c:5078 sql_help.c:5081
+#: sql_help.c:5084
+msgid "column_definition"
+msgstr "определение_столбца"
+
+#: sql_help.c:4593 sql_help.c:4599 sql_help.c:4850 sql_help.c:4856
+#: sql_help.c:5088 sql_help.c:5094
+msgid "join_type"
+msgstr "тип_соединения"
+
+#: sql_help.c:4596 sql_help.c:4853 sql_help.c:5091
+msgid "join_column"
+msgstr "столбец_соединения"
+
+#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092
+msgid "join_using_alias"
+msgstr "псевдоним_использования_соединения"
+
+#: sql_help.c:4603 sql_help.c:4860 sql_help.c:5098
+msgid "and grouping_element can be one of:"
+msgstr "где допустимый элемент_группирования:"
+
+#: sql_help.c:4611 sql_help.c:4868 sql_help.c:5106
+msgid "and with_query is:"
+msgstr "и запрос_WITH:"
+
+#: sql_help.c:4615 sql_help.c:4872 sql_help.c:5110
+msgid "values"
+msgstr "значения"
+
+#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4620 sql_help.c:4877 sql_help.c:5115
+msgid "search_seq_col_name"
+msgstr "имя_столбца_послед_поиска"
+
+#: sql_help.c:4622 sql_help.c:4879 sql_help.c:5117
+msgid "cycle_mark_col_name"
+msgstr "имя_столбца_пометки_цикла"
+
+#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118
+msgid "cycle_mark_value"
+msgstr "значение_пометки_цикла"
+
+#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119
+msgid "cycle_mark_default"
+msgstr "пометка_цикла_по_умолчанию"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120
+msgid "cycle_path_col_name"
+msgstr "имя_столбца_пути_цикла"
+
+#: sql_help.c:4652
+msgid "new_table"
+msgstr "новая_таблица"
+
+#: sql_help.c:4723
+msgid "snapshot_id"
+msgstr "код_снимка"
+
+#: sql_help.c:4983
+msgid "sort_expression"
+msgstr "выражение_сортировки"
+
+#: sql_help.c:5127 sql_help.c:6111
+msgid "abort the current transaction"
+msgstr "прервать текущую транзакцию"
+
+#: sql_help.c:5133
+msgid "change the definition of an aggregate function"
+msgstr "изменить определение агрегатной функции"
+
+#: sql_help.c:5139
+msgid "change the definition of a collation"
+msgstr "изменить определение правила сортировки"
+
+#: sql_help.c:5145
+msgid "change the definition of a conversion"
+msgstr "изменить определение преобразования"
+
+#: sql_help.c:5151
+msgid "change a database"
+msgstr "изменить атрибуты базы данных"
+
+#: sql_help.c:5157
+msgid "define default access privileges"
+msgstr "определить права доступа по умолчанию"
+
+#: sql_help.c:5163
+msgid "change the definition of a domain"
+msgstr "изменить определение домена"
+
+#: sql_help.c:5169
+msgid "change the definition of an event trigger"
+msgstr "изменить определение событийного триггера"
+
+#: sql_help.c:5175
+msgid "change the definition of an extension"
+msgstr "изменить определение расширения"
+
+#: sql_help.c:5181
+msgid "change the definition of a foreign-data wrapper"
+msgstr "изменить определение обёртки сторонних данных"
+
+#: sql_help.c:5187
+msgid "change the definition of a foreign table"
+msgstr "изменить определение сторонней таблицы"
+
+#: sql_help.c:5193
+msgid "change the definition of a function"
+msgstr "изменить определение функции"
+
+#: sql_help.c:5199
+msgid "change role name or membership"
+msgstr "изменить имя роли или членство"
+
+#: sql_help.c:5205
+msgid "change the definition of an index"
+msgstr "изменить определение индекса"
+
+#: sql_help.c:5211
+msgid "change the definition of a procedural language"
+msgstr "изменить определение процедурного языка"
+
+#: sql_help.c:5217
+msgid "change the definition of a large object"
+msgstr "изменить определение большого объекта"
+
+#: sql_help.c:5223
+msgid "change the definition of a materialized view"
+msgstr "изменить определение материализованного представления"
+
+#: sql_help.c:5229
+msgid "change the definition of an operator"
+msgstr "изменить определение оператора"
+
+#: sql_help.c:5235
+msgid "change the definition of an operator class"
+msgstr "изменить определение класса операторов"
+
+#: sql_help.c:5241
+msgid "change the definition of an operator family"
+msgstr "изменить определение семейства операторов"
+
+#: sql_help.c:5247
+msgid "change the definition of a row-level security policy"
+msgstr "изменить определение политики защиты на уровне строк"
+
+#: sql_help.c:5253
+msgid "change the definition of a procedure"
+msgstr "изменить определение процедуры"
+
+#: sql_help.c:5259
+msgid "change the definition of a publication"
+msgstr "изменить определение публикации"
+
+#: sql_help.c:5265 sql_help.c:5367
+msgid "change a database role"
+msgstr "изменить роль пользователя БД"
+
+#: sql_help.c:5271
+msgid "change the definition of a routine"
+msgstr "изменить определение подпрограммы"
+
+#: sql_help.c:5277
+msgid "change the definition of a rule"
+msgstr "изменить определение правила"
+
+#: sql_help.c:5283
+msgid "change the definition of a schema"
+msgstr "изменить определение схемы"
+
+#: sql_help.c:5289
+msgid "change the definition of a sequence generator"
+msgstr "изменить определение генератора последовательности"
+
+#: sql_help.c:5295
+msgid "change the definition of a foreign server"
+msgstr "изменить определение стороннего сервера"
+
+#: sql_help.c:5301
+msgid "change the definition of an extended statistics object"
+msgstr "изменить определение объекта расширенной статистики"
+
+#: sql_help.c:5307
+msgid "change the definition of a subscription"
+msgstr "изменить определение подписки"
+
+#: sql_help.c:5313
+msgid "change a server configuration parameter"
+msgstr "изменить параметр конфигурации сервера"
+
+#: sql_help.c:5319
+msgid "change the definition of a table"
+msgstr "изменить определение таблицы"
+
+#: sql_help.c:5325
+msgid "change the definition of a tablespace"
+msgstr "изменить определение табличного пространства"
+
+#: sql_help.c:5331
+msgid "change the definition of a text search configuration"
+msgstr "изменить определение конфигурации текстового поиска"
+
+#: sql_help.c:5337
+msgid "change the definition of a text search dictionary"
+msgstr "изменить определение словаря текстового поиска"
+
+#: sql_help.c:5343
+msgid "change the definition of a text search parser"
+msgstr "изменить определение анализатора текстового поиска"
+
+#: sql_help.c:5349
+msgid "change the definition of a text search template"
+msgstr "изменить определение шаблона текстового поиска"
+
+#: sql_help.c:5355
+msgid "change the definition of a trigger"
+msgstr "изменить определение триггера"
+
+#: sql_help.c:5361
+msgid "change the definition of a type"
+msgstr "изменить определение типа"
+
+#: sql_help.c:5373
+msgid "change the definition of a user mapping"
+msgstr "изменить сопоставление пользователей"
+
+#: sql_help.c:5379
+msgid "change the definition of a view"
+msgstr "изменить определение представления"
+
+#: sql_help.c:5385
+msgid "collect statistics about a database"
+msgstr "собрать статистику о базе данных"
+
+#: sql_help.c:5391 sql_help.c:6189
+msgid "start a transaction block"
+msgstr "начать транзакцию"
+
+#: sql_help.c:5397
+msgid "invoke a procedure"
+msgstr "вызвать процедуру"
+
+#: sql_help.c:5403
+msgid "force a write-ahead log checkpoint"
+msgstr "произвести контрольную точку в журнале предзаписи"
+
+#: sql_help.c:5409
+msgid "close a cursor"
+msgstr "закрыть курсор"
+
+#: sql_help.c:5415
+msgid "cluster a table according to an index"
+msgstr "перегруппировать таблицу по индексу"
+
+#: sql_help.c:5421
+msgid "define or change the comment of an object"
+msgstr "задать или изменить комментарий объекта"
+
+#: sql_help.c:5427 sql_help.c:5985
+msgid "commit the current transaction"
+msgstr "зафиксировать текущую транзакцию"
+
+#: sql_help.c:5433
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "зафиксировать транзакцию, ранее подготовленную для двухфазной фиксации"
+
+#: sql_help.c:5439
+msgid "copy data between a file and a table"
+msgstr "импорт/экспорт данных в файл"
+
+#: sql_help.c:5445
+msgid "define a new access method"
+msgstr "создать новый метод доступа"
+
+#: sql_help.c:5451
+msgid "define a new aggregate function"
+msgstr "создать агрегатную функцию"
+
+#: sql_help.c:5457
+msgid "define a new cast"
+msgstr "создать приведение типов"
+
+#: sql_help.c:5463
+msgid "define a new collation"
+msgstr "создать правило сортировки"
+
+#: sql_help.c:5469
+msgid "define a new encoding conversion"
+msgstr "создать преобразование кодировки"
+
+#: sql_help.c:5475
+msgid "create a new database"
+msgstr "создать базу данных"
+
+#: sql_help.c:5481
+msgid "define a new domain"
+msgstr "создать домен"
+
+#: sql_help.c:5487
+msgid "define a new event trigger"
+msgstr "создать событийный триггер"
+
+#: sql_help.c:5493
+msgid "install an extension"
+msgstr "установить расширение"
+
+#: sql_help.c:5499
+msgid "define a new foreign-data wrapper"
+msgstr "создать обёртку сторонних данных"
+
+#: sql_help.c:5505
+msgid "define a new foreign table"
+msgstr "создать стороннюю таблицу"
+
+#: sql_help.c:5511
+msgid "define a new function"
+msgstr "создать функцию"
+
+#: sql_help.c:5517 sql_help.c:5577 sql_help.c:5679
+msgid "define a new database role"
+msgstr "создать роль пользователя БД"
+
+#: sql_help.c:5523
+msgid "define a new index"
+msgstr "создать индекс"
+
+#: sql_help.c:5529
+msgid "define a new procedural language"
+msgstr "создать процедурный язык"
+
+#: sql_help.c:5535
+msgid "define a new materialized view"
+msgstr "создать материализованное представление"
+
+#: sql_help.c:5541
+msgid "define a new operator"
+msgstr "создать оператор"
+
+#: sql_help.c:5547
+msgid "define a new operator class"
+msgstr "создать класс операторов"
+
+#: sql_help.c:5553
+msgid "define a new operator family"
+msgstr "создать семейство операторов"
+
+#: sql_help.c:5559
+msgid "define a new row-level security policy for a table"
+msgstr "создать новую политику защиты на уровне строк для таблицы"
+
+#: sql_help.c:5565
+msgid "define a new procedure"
+msgstr "создать процедуру"
+
+#: sql_help.c:5571
+msgid "define a new publication"
+msgstr "создать публикацию"
+
+#: sql_help.c:5583
+msgid "define a new rewrite rule"
+msgstr "создать правило перезаписи"
+
+#: sql_help.c:5589
+msgid "define a new schema"
+msgstr "создать схему"
+
+#: sql_help.c:5595
+msgid "define a new sequence generator"
+msgstr "создать генератор последовательностей"
+
+#: sql_help.c:5601
+msgid "define a new foreign server"
+msgstr "создать сторонний сервер"
+
+#: sql_help.c:5607
+msgid "define extended statistics"
+msgstr "создать расширенную статистику"
+
+#: sql_help.c:5613
+msgid "define a new subscription"
+msgstr "создать подписку"
+
+#: sql_help.c:5619
+msgid "define a new table"
+msgstr "создать таблицу"
+
+#: sql_help.c:5625 sql_help.c:6147
+msgid "define a new table from the results of a query"
+msgstr "создать таблицу из результатов запроса"
+
+#: sql_help.c:5631
+msgid "define a new tablespace"
+msgstr "создать табличное пространство"
+
+#: sql_help.c:5637
+msgid "define a new text search configuration"
+msgstr "создать конфигурацию текстового поиска"
+
+#: sql_help.c:5643
+msgid "define a new text search dictionary"
+msgstr "создать словарь текстового поиска"
+
+#: sql_help.c:5649
+msgid "define a new text search parser"
+msgstr "создать анализатор текстового поиска"
+
+#: sql_help.c:5655
+msgid "define a new text search template"
+msgstr "создать шаблон текстового поиска"
+
+#: sql_help.c:5661
+msgid "define a new transform"
+msgstr "создать преобразование"
+
+#: sql_help.c:5667
+msgid "define a new trigger"
+msgstr "создать триггер"
+
+#: sql_help.c:5673
+msgid "define a new data type"
+msgstr "создать тип данных"
+
+#: sql_help.c:5685
+msgid "define a new mapping of a user to a foreign server"
+msgstr "создать сопоставление пользователя для стороннего сервера"
+
+#: sql_help.c:5691
+msgid "define a new view"
+msgstr "создать представление"
+
+#: sql_help.c:5697
+msgid "deallocate a prepared statement"
+msgstr "освободить подготовленный оператор"
+
+#: sql_help.c:5703
+msgid "define a cursor"
+msgstr "создать курсор"
+
+#: sql_help.c:5709
+msgid "delete rows of a table"
+msgstr "удалить записи таблицы"
+
+#: sql_help.c:5715
+msgid "discard session state"
+msgstr "очистить состояние сеанса"
+
+#: sql_help.c:5721
+msgid "execute an anonymous code block"
+msgstr "выполнить анонимный блок кода"
+
+#: sql_help.c:5727
+msgid "remove an access method"
+msgstr "удалить метод доступа"
+
+#: sql_help.c:5733
+msgid "remove an aggregate function"
+msgstr "удалить агрегатную функцию"
+
+#: sql_help.c:5739
+msgid "remove a cast"
+msgstr "удалить приведение типа"
+
+#: sql_help.c:5745
+msgid "remove a collation"
+msgstr "удалить правило сортировки"
+
+#: sql_help.c:5751
+msgid "remove a conversion"
+msgstr "удалить преобразование"
+
+#: sql_help.c:5757
+msgid "remove a database"
+msgstr "удалить базу данных"
+
+#: sql_help.c:5763
+msgid "remove a domain"
+msgstr "удалить домен"
+
+#: sql_help.c:5769
+msgid "remove an event trigger"
+msgstr "удалить событийный триггер"
+
+#: sql_help.c:5775
+msgid "remove an extension"
+msgstr "удалить расширение"
+
+#: sql_help.c:5781
+msgid "remove a foreign-data wrapper"
+msgstr "удалить обёртку сторонних данных"
+
+#: sql_help.c:5787
+msgid "remove a foreign table"
+msgstr "удалить стороннюю таблицу"
+
+#: sql_help.c:5793
+msgid "remove a function"
+msgstr "удалить функцию"
+
+#: sql_help.c:5799 sql_help.c:5865 sql_help.c:5967
+msgid "remove a database role"
+msgstr "удалить роль пользователя БД"
+
+#: sql_help.c:5805
+msgid "remove an index"
+msgstr "удалить индекс"
+
+#: sql_help.c:5811
+msgid "remove a procedural language"
+msgstr "удалить процедурный язык"
+
+#: sql_help.c:5817
+msgid "remove a materialized view"
+msgstr "удалить материализованное представление"
+
+#: sql_help.c:5823
+msgid "remove an operator"
+msgstr "удалить оператор"
+
+#: sql_help.c:5829
+msgid "remove an operator class"
+msgstr "удалить класс операторов"
+
+#: sql_help.c:5835
+msgid "remove an operator family"
+msgstr "удалить семейство операторов"
+
+#: sql_help.c:5841
+msgid "remove database objects owned by a database role"
+msgstr "удалить объекты базы данных, принадлежащие роли"
+
+#: sql_help.c:5847
+msgid "remove a row-level security policy from a table"
+msgstr "удалить из таблицы политику защиты на уровне строк"
+
+#: sql_help.c:5853
+msgid "remove a procedure"
+msgstr "удалить процедуру"
+
+#: sql_help.c:5859
+msgid "remove a publication"
+msgstr "удалить публикацию"
+
+#: sql_help.c:5871
+msgid "remove a routine"
+msgstr "удалить подпрограмму"
+
+#: sql_help.c:5877
+msgid "remove a rewrite rule"
+msgstr "удалить правило перезаписи"
+
+#: sql_help.c:5883
+msgid "remove a schema"
+msgstr "удалить схему"
+
+#: sql_help.c:5889
+msgid "remove a sequence"
+msgstr "удалить последовательность"
+
+#: sql_help.c:5895
+msgid "remove a foreign server descriptor"
+msgstr "удалить описание стороннего сервера"
+
+#: sql_help.c:5901
+msgid "remove extended statistics"
+msgstr "удалить расширенную статистику"
+
+#: sql_help.c:5907
+msgid "remove a subscription"
+msgstr "удалить подписку"
+
+#: sql_help.c:5913
+msgid "remove a table"
+msgstr "удалить таблицу"
+
+#: sql_help.c:5919
+msgid "remove a tablespace"
+msgstr "удалить табличное пространство"
+
+#: sql_help.c:5925
+msgid "remove a text search configuration"
+msgstr "удалить конфигурацию текстового поиска"
+
+#: sql_help.c:5931
+msgid "remove a text search dictionary"
+msgstr "удалить словарь текстового поиска"
+
+#: sql_help.c:5937
+msgid "remove a text search parser"
+msgstr "удалить анализатор текстового поиска"
+
+#: sql_help.c:5943
+msgid "remove a text search template"
+msgstr "удалить шаблон текстового поиска"
+
+#: sql_help.c:5949
+msgid "remove a transform"
+msgstr "удалить преобразование"
+
+#: sql_help.c:5955
+msgid "remove a trigger"
+msgstr "удалить триггер"
+
+#: sql_help.c:5961
+msgid "remove a data type"
+msgstr "удалить тип данных"
+
+#: sql_help.c:5973
+msgid "remove a user mapping for a foreign server"
+msgstr "удалить сопоставление пользователя для стороннего сервера"
+
+#: sql_help.c:5979
+msgid "remove a view"
+msgstr "удалить представление"
+
+#: sql_help.c:5991
+msgid "execute a prepared statement"
+msgstr "выполнить подготовленный оператор"
+
+#: sql_help.c:5997
+msgid "show the execution plan of a statement"
+msgstr "показать план выполнения оператора"
+
+#: sql_help.c:6003
+msgid "retrieve rows from a query using a cursor"
+msgstr "получить результат запроса через курсор"
+
+#: sql_help.c:6009
+msgid "define access privileges"
+msgstr "определить права доступа"
+
+#: sql_help.c:6015
+msgid "import table definitions from a foreign server"
+msgstr "импортировать определения таблиц со стороннего сервера"
+
+#: sql_help.c:6021
+msgid "create new rows in a table"
+msgstr "добавить строки в таблицу"
+
+#: sql_help.c:6027
+msgid "listen for a notification"
+msgstr "ожидать уведомления"
+
+#: sql_help.c:6033
+msgid "load a shared library file"
+msgstr "загрузить файл разделяемой библиотеки"
+
+#: sql_help.c:6039
+msgid "lock a table"
+msgstr "заблокировать таблицу"
+
+#: sql_help.c:6045
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "добавление, изменение или удаление строк таблицы по условию"
+
+#: sql_help.c:6051
+msgid "position a cursor"
+msgstr "установить курсор"
+
+#: sql_help.c:6057
+msgid "generate a notification"
+msgstr "сгенерировать уведомление"
+
+#: sql_help.c:6063
+msgid "prepare a statement for execution"
+msgstr "подготовить оператор для выполнения"
+
+#: sql_help.c:6069
+msgid "prepare the current transaction for two-phase commit"
+msgstr "подготовить текущую транзакцию для двухфазной фиксации"
+
+#: sql_help.c:6075
+msgid "change the ownership of database objects owned by a database role"
+msgstr "изменить владельца объектов БД, принадлежащих заданной роли"
+
+#: sql_help.c:6081
+msgid "replace the contents of a materialized view"
+msgstr "заменить содержимое материализованного представления"
+
+#: sql_help.c:6087
+msgid "rebuild indexes"
+msgstr "перестроить индексы"
+
+#: sql_help.c:6093
+msgid "destroy a previously defined savepoint"
+msgstr "удалить ранее определённую точку сохранения"
+
+#: sql_help.c:6099
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "восстановить исходное значение параметра выполнения"
+
+#: sql_help.c:6105
+msgid "remove access privileges"
+msgstr "удалить права доступа"
+
+#: sql_help.c:6117
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "отменить транзакцию, подготовленную ранее для двухфазной фиксации"
+
+#: sql_help.c:6123
+msgid "roll back to a savepoint"
+msgstr "откатиться к точке сохранения"
+
+#: sql_help.c:6129
+msgid "define a new savepoint within the current transaction"
+msgstr "определить новую точку сохранения в текущей транзакции"
+
+#: sql_help.c:6135
+msgid "define or change a security label applied to an object"
+msgstr "задать или изменить метку безопасности, применённую к объекту"
+
+#: sql_help.c:6141 sql_help.c:6195 sql_help.c:6231
+msgid "retrieve rows from a table or view"
+msgstr "выбрать строки из таблицы или представления"
+
+#: sql_help.c:6153
+msgid "change a run-time parameter"
+msgstr "изменить параметр выполнения"
+
+#: sql_help.c:6159
+msgid "set constraint check timing for the current transaction"
+msgstr "установить время проверки ограничений для текущей транзакции"
+
+#: sql_help.c:6165
+msgid "set the current user identifier of the current session"
+msgstr "задать идентификатор текущего пользователя в текущем сеансе"
+
+#: sql_help.c:6171
+msgid ""
+"set the session user identifier and the current user identifier of the "
+"current session"
+msgstr ""
+"задать идентификатор пользователя сеанса и идентификатор текущего "
+"пользователя в текущем сеансе"
+
+#: sql_help.c:6177
+msgid "set the characteristics of the current transaction"
+msgstr "задать свойства текущей транзакции"
+
+#: sql_help.c:6183
+msgid "show the value of a run-time parameter"
+msgstr "показать значение параметра выполнения"
+
+#: sql_help.c:6201
+msgid "empty a table or set of tables"
+msgstr "опустошить таблицу или набор таблиц"
+
+#: sql_help.c:6207
+msgid "stop listening for a notification"
+msgstr "прекратить ожидание уведомлений"
+
+#: sql_help.c:6213
+msgid "update rows of a table"
+msgstr "изменить строки таблицы"
+
+#: sql_help.c:6219
+msgid "garbage-collect and optionally analyze a database"
+msgstr "произвести сборку мусора и проанализировать базу данных"
+
+#: sql_help.c:6225
+msgid "compute a set of rows"
+msgstr "получить набор строк"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 можно использовать только в неинтерактивном режиме"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "не удалось открыть файл протокола \"%s\": %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Введите \"help\", чтобы получить справку.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "не удалось установить параметр печати \"%s\""
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Для дополнительной информации попробуйте \"%s --help\"."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "лишний аргумент \"%s\" проигнорирован"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "не удалось найти свой исполняемый файл"
+
+#: tab-complete.c:5955
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"ошибка запроса Tab-дополнения: %s\n"
+"Запрос:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr ""
+"нераспознанное значение \"%s\" для \"%s\": ожидалось булевское значение"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "неправильное значение \"%s\" для \"%s\": ожидалось целое"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "неправильное имя переменной: \"%s\""
+
+#: variables.c:419
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"нераспознанное значение \"%s\" для \"%s\"\n"
+"Допустимые значения: %s."
+
+#~ msgid "text"
+#~ msgstr "текст"
+
+#~ msgid "\\watch cannot be used with COPY"
+#~ msgstr "\\watch нельзя использовать с COPY"
+
+#~ msgid "where direction can be empty or one of:"
+#~ msgstr "где допустимое направление пустое или:"
+
+#~ msgid "timezone"
+#~ msgstr "часовой_пояс"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "The server (version %s) does not support editing function source."
+#~ msgstr ""
+#~ "Сервер (версия %s) не поддерживает редактирование исходного кода функции."
+
+#~ msgid "The server (version %s) does not support editing view definitions."
+#~ msgstr ""
+#~ "Сервер (версия %s) не поддерживает редактирование определения "
+#~ "представления."
+
+#~ msgid "The server (version %s) does not support showing function source."
+#~ msgstr "Сервер (версия %s) не поддерживает вывод исходного кода функции."
+
+#~ msgid "The server (version %s) does not support showing view definitions."
+#~ msgstr "Сервер (версия %s) не поддерживает вывод определения представлений."
+
+#~ msgid "unexpected result status for \\watch"
+#~ msgstr "неожиданное состояние результата для \\watch"
+
+#~ msgid ""
+#~ "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK."
+#~ msgstr ""
+#~ "Сервер (версия %s) не поддерживает точки сохранения для ON_ERROR_ROLLBACK."
+
+#~ msgid "The server (version %s) does not support tablespaces."
+#~ msgstr "Сервер (версия %s) не поддерживает табличные пространства."
+
+#~ msgid ""
+#~ "The server (version %s) does not support altering default privileges."
+#~ msgstr "Сервер (версия %s) не поддерживает изменение прав по умолчанию."
+
+#~ msgid "Special relation \"%s.%s\""
+#~ msgstr "Специальное отношение \"%s.%s\""
+
+#~ msgid "Disabled triggers:"
+#~ msgstr "Отключённые триггеры:"
+
+#~ msgid "The server (version %s) does not support per-database role settings."
+#~ msgstr ""
+#~ "Сервер (версия %s) не поддерживает назначение параметров ролей для баз "
+#~ "данных."
+
+# skip-rule: capital-letter-first
+#~ msgid "special"
+#~ msgstr "спец. отношение"
+
+#~ msgid "The server (version %s) does not support collations."
+#~ msgstr "Сервер (версия %s) не поддерживает правила сравнения."
+
+#~ msgid "The server (version %s) does not support full text search."
+#~ msgstr "Сервер (версия %s) не поддерживает полнотекстовый поиск."
+
+#~ msgid "The server (version %s) does not support foreign-data wrappers."
+#~ msgstr "Сервер (версия %s) не поддерживает обёртки сторонних данных."
+
+#~ msgid "The server (version %s) does not support foreign servers."
+#~ msgstr "Сервер (версия %s) не поддерживает сторонние серверы."
+
+#~ msgid "The server (version %s) does not support user mappings."
+#~ msgstr "Сервер (версия %s) не поддерживает сопоставления пользователей."
+
+#~ msgid "The server (version %s) does not support foreign tables."
+#~ msgstr "Сервер (версия %s) не поддерживает сторонние таблицы."
+
+#~ msgid ""
+#~ " \\lo_export LOBOID FILE\n"
+#~ " \\lo_import FILE [COMMENT]\n"
+#~ " \\lo_list\n"
+#~ " \\lo_unlink LOBOID large object operations\n"
+#~ msgstr ""
+#~ " \\lo_export LOBOID ФАЙЛ\n"
+#~ " \\lo_import ФАЙЛ [КОММЕНТАРИЙ]\n"
+#~ " \\lo_list\n"
+#~ " \\lo_unlink LOBOID операции с большими объектами\n"
+
+#~ msgid "Enter new password: "
+#~ msgstr "Введите новый пароль: "
+
+#~ msgid ""
+#~ "All connection parameters must be supplied because no database connection "
+#~ "exists"
+#~ msgstr ""
+#~ "Без подключения к базе данных необходимо указывать все параметры "
+#~ "подключения"
+
+#~ msgid "Could not send cancel request: %s"
+#~ msgstr "Отправить сигнал отмены не удалось: %s"
+
+#~ msgid "could not connect to server: %s"
+#~ msgstr "не удалось подключиться к серверу: %s"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid ""
+#~ " \\g [FILE] or ; execute query (and send results to file or |"
+#~ "pipe)\n"
+#~ msgstr ""
+#~ " \\g [ФАЙЛ] или ; выполнить запрос\n"
+#~ " (и направить результаты в файл или канал |)\n"
+
+#~ msgid "from_list"
+#~ msgstr "список_FROM"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "дочерний процесс завершён по сигналу %s"
+
+#~ msgid "Invalid command \\%s. Try \\? for help.\n"
+#~ msgstr "Неверная команда \\%s. Справка по командам: \\?\n"
+
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#~ msgid "normal"
+#~ msgstr "обычная"
+
+#~ msgid "Procedure"
+#~ msgstr "Процедура"
+
+#~ msgid " SERVER_VERSION_NAME server's version (short string)\n"
+#~ msgstr " SERVER_VERSION_NAME версия сервера (короткая строка)\n"
+
+#~ msgid " VERSION psql's version (verbose string)\n"
+#~ msgstr " VERSION версия psql (развёрнутая строка)\n"
+
+#~ msgid " VERSION_NAME psql's version (short string)\n"
+#~ msgstr " VERSION_NAME версия psql (короткая строка)\n"
+
+#~ msgid " VERSION_NUM psql's version (numeric format)\n"
+#~ msgstr " VERSION_NUM версия psql (в числовом формате)\n"
+
+#~ msgid "attribute"
+#~ msgstr "атрибут"
+
+#~ msgid "statistic_type"
+#~ msgstr "тип_статистики"
+
+#~ msgid "No per-database role settings support in this server version.\n"
+#~ msgstr ""
+#~ "Это версия сервера не поддерживает параметры ролей на уровне базы "
+#~ "данных.\n"
+
+#~ msgid "No matching settings found.\n"
+#~ msgstr "Соответствующие параметры не найдены.\n"
+
+#~ msgid "No settings found.\n"
+#~ msgstr "Параметры не найдены.\n"
+
+#~ msgid "No matching relations found.\n"
+#~ msgstr "Соответствующие отношения не найдены.\n"
+
+#~ msgid "No relations found.\n"
+#~ msgstr "Отношения не найдены.\n"
+
+#~ msgid "Object Description"
+#~ msgstr "Описание объекта"
+
+#~ msgid "Password encryption failed.\n"
+#~ msgstr "Ошибка при шифровании пароля.\n"
+
+#~ msgid "suboption"
+#~ msgstr "подпараметр"
+
+#~ msgid "where suboption can be:"
+#~ msgstr "где допустимые подпараметры:"
+
+#~ msgid "slot_name"
+#~ msgstr "имя_слота"
+
+#~ msgid "puboption"
+#~ msgstr "параметр_публикации"
+
+#~ msgid "where puboption can be:"
+#~ msgstr "где допустимый параметр_публикации:"
+
+#~ msgid "+ opt(%d) = |%s|\n"
+#~ msgstr "+ opt(%d) = |%s|\n"
+
+#~ msgid "\\%s: error while setting variable\n"
+#~ msgstr "\\%s: не удалось установить переменную\n"
+
+#~ msgid "could not set variable \"%s\"\n"
+#~ msgstr "не удалось установить переменную \"%s\"\n"
+
+#~ msgid "Modifiers"
+#~ msgstr "Модификаторы"
+
+#~ msgid "collate %s"
+#~ msgstr "правило сортировки %s"
+
+#~ msgid "not null"
+#~ msgstr "NOT NULL"
+
+#~ msgid "default %s"
+#~ msgstr "DEFAULT %s"
+
+#~ msgid "Modifier"
+#~ msgstr "Модификатор"
+
+#~ msgid "%s: could not set variable \"%s\"\n"
+#~ msgstr "%s: не удалось установить переменную \"%s\"\n"
+
+#~ msgid "\\crosstabview: query must return results to be shown in crosstab\n"
+#~ msgstr ""
+#~ "\\crosstabview: запрос должен возвращать результаты для вывода в "
+#~ "перекрёстном виде\n"
+
+#~ msgid "\\crosstabview: invalid column number: \"%s\"\n"
+#~ msgstr "\\crosstabview: неверный номер столбца: \"%s\"\n"
+
+#~ msgid "serialtype"
+#~ msgstr "сериализованный_тип"
+
+#~ msgid "Watch every %lds\t%s"
+#~ msgstr "Повтор запрос через %ld сек.\t%s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Display influencing variables:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Рабочие параметры:\n"
+
+#~ msgid " unicode_border_linestyle\n"
+#~ msgstr " unicode_border_linestyle\n"
+
+#~ msgid " unicode_column_linestyle\n"
+#~ msgstr " unicode_column_linestyle\n"
+
+#~ msgid "column_name_index"
+#~ msgstr "индекс_по_имени_столбца"
+
+#~ msgid "expression_index"
+#~ msgstr "индекс_по_выражению"
+
+#~ msgid "SSL connection (unknown cipher)\n"
+#~ msgstr "SSL-соединение (шифр неизвестен)\n"
+
+#~ msgid "(No rows)\n"
+#~ msgstr "(Нет записей)\n"
+
+#~ msgid "where view_option_name can be one of:"
+#~ msgstr "где допустимое имя_параметра_представления:"
+
+#~ msgid "local"
+#~ msgstr "local"
+
+#~ msgid "cascaded"
+#~ msgstr "cascaded"
+
+#~ msgid "Border style (%s) unset.\n"
+#~ msgstr "Стиль границ (%s) сброшен.\n"
+
+#~ msgid "Output format (%s) is aligned.\n"
+#~ msgstr "Формат вывода (%s): выровненный.\n"
+
+#~ msgid "invfunc"
+#~ msgstr "обр_функция"
+
+#~ msgid ""
+#~ "change the definition of a tablespace or affect objects of a tablespace"
+#~ msgstr "изменить определение или содержимое табличного пространства"
+
+#~ msgid "Showing locale-adjusted numeric output."
+#~ msgstr "Числа выводятся в локализованном формате."
+
+#~ msgid "Showing only tuples."
+#~ msgstr "Выводятся только кортежи."
+
+#~ msgid "could not get current user name: %s\n"
+#~ msgstr "не удалось узнать имя текущего пользователя: %s\n"
+
+#~ msgid "agg_name"
+#~ msgstr "агр_функция"
+
+#~ msgid "agg_type"
+#~ msgstr "агр_тип"
+
+#~ msgid "input_data_type"
+#~ msgstr "тип_входных_данных"
+
+#~ msgid "%s: -1 is incompatible with -c and -l\n"
+#~ msgstr "%s: -1 несовместимо с -c и -l\n"
+
+#~ msgid "column"
+#~ msgstr "столбец"
+
+#~ msgid "new_column"
+#~ msgstr "новая_столбец"
+
+#~ msgid "tablespace"
+#~ msgstr "табл_пространство"
+
+#~ msgid "\\%s: error\n"
+#~ msgstr "ошибка \\%s\n"
+
+#~ msgid "\\copy: %s"
+#~ msgstr "\\copy: %s"
+
+#~ msgid "contains support for command-line editing"
+#~ msgstr "включает поддержку редактирования командной строки"
+
+#~ msgid "data type"
+#~ msgstr "тип данных"
diff --git a/src/bin/psql/po/sv.po b/src/bin/psql/po/sv.po
new file mode 100644
index 0000000..c7e135e
--- /dev/null
+++ b/src/bin/psql/po/sv.po
@@ -0,0 +1,6479 @@
+# Swedish message translation file for psql
+# Peter Eisentraut <peter_e@gmx.net>, 2001, 2009, 2010.
+# Dennis Björklund <db@zigo.dhs.org>, 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+#
+# Use these quotes: "%s"
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-02-03 19:46+0000\n"
+"PO-Revision-Date: 2023-03-09 22:34+0100\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "kunde inte identifiera aktuell katalog: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "ogiltig binär \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "kunde inte läsa binär \"%s\""
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "kunde inte hitta en \"%s\" att köra"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "kunde inte byta katalog till \"%s\": %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "kan inte läsa symbolisk länk \"%s\": %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() misslyckades: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kan inte duplicera null-pekare (internt fel)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "kunde inte slå upp effektivt användar-id %ld: %s"
+
+#: ../../common/username.c:45 command.c:575
+msgid "user does not exist"
+msgstr "användaren finns inte"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "misslyckad sökning efter användarnamn: felkod %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "kommandot är inte körbart"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "kommandot kan ej hittas"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "barnprocess avslutade med kod %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "barnprocess terminerades med avbrott 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "barnprocess terminerades av signal %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "barnprocess avslutade med okänd statuskod %d"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Förfrågan om avbrytning skickad\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Kunde inte skicka förfrågan om avbrytning: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu rad)"
+msgstr[1] "(%lu rader)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Avbruten\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Kan inte lägga till rubrik till tabellinnehåll: antal kolumner (%d) överskridet.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Kan inte lägga till cell till tabellinnehåll: totala cellantalet (%d) överskridet.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "ogiltigt utdataformat (internt fel): %d"
+
+#: ../../fe_utils/psqlscan.l:702
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "hoppar över rekursiv expandering av variabeln \"%s\""
+
+#: ../../port/thread.c:100 ../../port/thread.c:136
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "kunde inte slå upp lokalt användar-id %d: %s"
+
+#: ../../port/thread.c:105 ../../port/thread.c:141
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "lokal användare med ID %d existerar inte"
+
+#: command.c:232
+#, c-format
+msgid "invalid command \\%s"
+msgstr "ogiltigt kommando \\%s"
+
+#: command.c:234
+#, c-format
+msgid "Try \\? for help."
+msgstr "Försök med \\? för hjälp."
+
+#: command.c:252
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: extra argument \"%s\" ignorerat"
+
+#: command.c:304
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "kommandot \\%s ignorerat; använd \\endif eller Ctrl-C för att avsluta nuvarande \\if-block"
+
+#: command.c:573
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "kunde inte hämta hemkatalog för användar-ID %ld: %s"
+
+#: command.c:592
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: kunde inte byta katalog till \"%s\": %m"
+
+#: command.c:617
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "Du är för närvarande inte uppkopplad mot en databas.\n"
+
+#: command.c:627
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Du är uppkopplad upp mot databas \"%s\" som användare \"%s\" på adress \"%s\" på port \"%s\".\n"
+
+#: command.c:630
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Du är uppkopplad mot databas \"%s\" som användare \"%s\" via uttag i \"%s\" på port \"%s\".\n"
+
+#: command.c:636
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Du är uppkopplad upp mot databas \"%s\" som användare \"%s\" på värd \"%s\" (adress \"%s\") på port \"%s\".\n"
+
+#: command.c:639
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Du är uppkopplad upp mot databas \"%s\" som användare \"%s\" på värd \"%s\" på port \"%s\".\n"
+
+#: command.c:1030 command.c:1125 command.c:2654
+#, c-format
+msgid "no query buffer"
+msgstr "ingen frågebuffert"
+
+#: command.c:1063 command.c:5491
+#, c-format
+msgid "invalid line number: %s"
+msgstr "ogiltigt radnummer: %s"
+
+#: command.c:1203
+msgid "No changes"
+msgstr "Inga ändringar"
+
+#: command.c:1282
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: ogiltigt kodningsnamn eller konverteringsprocedur hittades inte"
+
+#: command.c:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597
+#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100
+#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443
+#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1324
+msgid "There is no previous error."
+msgstr "Det finns inget tidigare fel."
+
+#: command.c:1437
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: saknar höger parentes"
+
+#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989
+#: command.c:2173 command.c:2415 command.c:2621 command.c:2661
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: obligatoriskt argument saknas"
+
+#: command.c:1782
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: kan inte komma efter \\else"
+
+#: command.c:1787
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: ingen matchande \\if"
+
+#: command.c:1851
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: kan inte komma efter \\else"
+
+#: command.c:1856
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: ingen matchande \\if"
+
+#: command.c:1896
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: ingen matchande \\if"
+
+#: command.c:2053
+msgid "Query buffer is empty."
+msgstr "Frågebufferten är tom."
+
+#: command.c:2096
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Mata in nytt lösenord för användare \"%s\": "
+
+#: command.c:2100
+msgid "Enter it again: "
+msgstr "Mata in det igen: "
+
+#: command.c:2109
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Lösenorden stämde inte överens."
+
+#: command.c:2208
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: kunde inte läsa värde på varibeln"
+
+#: command.c:2311
+msgid "Query buffer reset (cleared)."
+msgstr "Frågebufferten har blivit borttagen."
+
+#: command.c:2333
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "Skrev historiken till fil \"%s\".\n"
+
+#: command.c:2420
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: omgivningsvariabelnamn får ej innehålla \"=\""
+
+#: command.c:2468
+#, c-format
+msgid "function name is required"
+msgstr "funktionsnamn krävs"
+
+#: command.c:2470
+#, c-format
+msgid "view name is required"
+msgstr "vynamn krävs"
+
+#: command.c:2593
+msgid "Timing is on."
+msgstr "Tidtagning är på."
+
+#: command.c:2595
+msgid "Timing is off."
+msgstr "Tidtagning är av."
+
+#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952
+#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008
+#: command.c:4022 command.c:4049 command.c:4107 common.c:77 copy.c:331
+#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:3107 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Lösenord: "
+
+#: command.c:3112 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Lösenord för användare %s: "
+
+#: command.c:3168
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "Ange inte användare, värd eller port separat tillsammans med en anslutningssträng"
+
+#: command.c:3203
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "Det finns ingen anslutning att återanvända parametrar från"
+
+#: command.c:3511
+#, c-format
+msgid "Previous connection kept"
+msgstr "Föregående anslutning bevarad"
+
+#: command.c:3517
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3573
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\" på adress \"%s\" på port \"%s\".\n"
+
+#: command.c:3576
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\" via uttag i \"%s\" på port \"%s\".\n"
+
+#: command.c:3582
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\" på värd \"%s\" (adress \"%s\") på port \"%s\".\n"
+
+#: command.c:3585
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\" på värd \"%s\" på port \"%s\".\n"
+
+#: command.c:3590
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\".\n"
+
+#: command.c:3630
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, server %s)\n"
+
+#: command.c:3643
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"VARNING: %s huvudversion %s, server huvudversion %s.\n"
+" En del psql-finesser kommer kanske inte fungera.\n"
+
+#: command.c:3680
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "SSL-anslutning (protokoll: %s, krypto: %s, komprimering: %s)\n"
+
+#: command.c:3681 command.c:3682
+msgid "unknown"
+msgstr "okänd"
+
+#: command.c:3683 help.c:42
+msgid "off"
+msgstr "av"
+
+#: command.c:3683 help.c:42
+msgid "on"
+msgstr "på"
+
+#: command.c:3697
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "GSSAPI-krypterad anslutning\n"
+
+#: command.c:3717
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"VARNING: Konsollens \"code page\" (%u) skiljer sig fån Windows \"code page\" (%u)\n"
+" 8-bitars tecken kommer troligen inte fungera korrekt. Se psql:s\n"
+" referensmanual i sektionen \"Notes for Windows users\" för mer detaljer.\n"
+
+#: command.c:3822
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "omgivningsvariabeln PSQL_EDITOR_LINENUMBER_ARG måste ange ett radnummer"
+
+#: command.c:3851
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "kunde inte starta editorn \"%s\""
+
+#: command.c:3853
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "kunde inte starta /bin/sh"
+
+#: command.c:3903
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "kunde inte hitta temp-katalog: %s"
+
+#: command.c:3930
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "kunde inte öppna temporär fil \"%s\": %m"
+
+#: command.c:4266
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: tvetydig förkortning \"%s\" matchar både \"%s\" och \"%s\""
+
+#: command.c:4286
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: tillåtna format är aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4305
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: tillåtna linjestilar är ascii, old-ascii, unicode"
+
+#: command.c:4320
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: tillåtna Unicode-ramstilar är single, double"
+
+#: command.c:4335
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: tillåtna Unicode-kolumnlinjestilar ärsingle, double"
+
+#: command.c:4350
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: tillåtna Unicode-rubriklinjestilar är single, double"
+
+#: command.c:4393
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep måste vara ett ensamt en-byte-tecken"
+
+#: command.c:4398
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldset kan inte vara dubbelcitat, nyrad eller vagnretur"
+
+#: command.c:4535 command.c:4723
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: okänd parameter: %s"
+
+#: command.c:4555
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Ramstil är %d.\n"
+
+#: command.c:4561
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "Målvidd är inte satt.\n"
+
+#: command.c:4563
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "Målvidd är %d.\n"
+
+#: command.c:4570
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Utökad visning är på.\n"
+
+#: command.c:4572
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "Utökad visning används automatiskt.\n"
+
+#: command.c:4574
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Utökad visning är av.\n"
+
+#: command.c:4580
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "Fältseparatorn för CSV är \"%s\".\n"
+
+#: command.c:4588 command.c:4596
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "Fältseparatorn är noll-byte.\n"
+
+#: command.c:4590
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "Fältseparatorn är \"%s\".\n"
+
+#: command.c:4603
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Standard sidfot är på.\n"
+
+#: command.c:4605
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Standard sidfot är av.\n"
+
+#: command.c:4611
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Utdataformatet är \"%s\".\n"
+
+#: command.c:4617
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Linjestil är %s.\n"
+
+#: command.c:4624
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Null-visare är \"%s\".\n"
+
+#: command.c:4632
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "Lokal-anpassad numerisk utdata är på.\n"
+
+#: command.c:4634
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "Lokal-anpassad numerisk utdata är av.\n"
+
+#: command.c:4641
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "Siduppdelare är på för lång utdata.\n"
+
+#: command.c:4643
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "Siduppdelare används alltid.\n"
+
+#: command.c:4645
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "Siduppdelare är av.\n"
+
+#: command.c:4651
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "Siduppdelare kommer inte användas för färre än %d linje.\n"
+msgstr[1] "Siduppdelare kommer inte användas för färre än %d linjer.\n"
+
+#: command.c:4661 command.c:4671
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "Postseparatorn är noll-byte.\n"
+
+#: command.c:4663
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "Postseparatorn är <nyrad>.\n"
+
+#: command.c:4665
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "Postseparatorn är \"%s\".\n"
+
+#: command.c:4678
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Tabellattributen är \"%s\".\n"
+
+#: command.c:4681
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Tabellattributen är ej satta.\n"
+
+#: command.c:4688
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Titeln är \"%s\".\n"
+
+#: command.c:4690
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Titeln är inte satt.\n"
+
+#: command.c:4697
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "Visa bara tupler är på.\n"
+
+#: command.c:4699
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "Visa bara tupler är av.\n"
+
+#: command.c:4705
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Unicode-ramstil är \"%s\".\n"
+
+#: command.c:4711
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Unicode-kolumnLinjestil är \"%s\".\n"
+
+#: command.c:4717
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Unicode-rubriklinjestil är \"%s\".\n"
+
+#: command.c:4950
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: misslyckades"
+
+#: command.c:4984
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch kan inte användas på en tom fråga"
+
+#: command.c:5016
+#, c-format
+msgid "could not set timer: %m"
+msgstr "kunde inte sätta timer: %m"
+
+#: command.c:5078
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (varje %gs)\n"
+
+#: command.c:5081
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (varje %gs)\n"
+
+#: command.c:5142
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "kunde inte vänta på signaler: %m"
+
+#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* FRÅGA **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5386
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" är inte en vy"
+
+#: command.c:5402
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "kunde inte parsa arrayen reloptions"
+
+#: common.c:166
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "kan inte escape:a utan en aktiv uppkoppling"
+
+#: common.c:207
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "shell-kommandots argument innehåller nyrad eller vagnretur: \"%s\""
+
+#: common.c:311
+#, c-format
+msgid "connection to server was lost"
+msgstr "uppkopplingen till servern har brutits"
+
+#: common.c:315
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "Anslutningen till servern har brutits. Försöker starta om: "
+
+#: common.c:320
+#, c-format
+msgid "Failed.\n"
+msgstr "Misslyckades.\n"
+
+#: common.c:337
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Lyckades.\n"
+
+#: common.c:389 common.c:1001
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "oväntad PQresultStatus: %d"
+
+#: common.c:511
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Tid: %.3f ms\n"
+
+#: common.c:526
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Tid: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:535
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Tid: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:542
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Tid: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:566 common.c:623 common.c:1034 describe.c:6135
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Du är för närvarande inte uppkopplad mot en databas."
+
+#: common.c:654
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "Asynkron notificering \"%s\" mottagen med innehåll \"%s\" från serverprocess med PID %d.\n"
+
+#: common.c:657
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "Asynkron notificering \"%s\" mottagen från serverprocess med PID %d.\n"
+
+#: common.c:688
+#, c-format
+msgid "could not print result table: %m"
+msgstr "kunde inte visa resultatabell: %m"
+
+#: common.c:708
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "inga rader returnerades för \\gset"
+
+#: common.c:713
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "mer än en rad returnerades för \\gset"
+
+#: common.c:731
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "försök att utföra \\gset in i en speciellt hanterad variabel \"%s\" hoppas över"
+
+#: common.c:1043
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Stegningsläge: Verifiera kommando)*******************************************\n"
+"%s\n"
+"***(tryck return för att fortsätta eller skriv x och return för att avbryta)*****\n"
+
+#: common.c:1126
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "SATS: %s"
+
+#: common.c:1162
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "oväntad transaktionsstatus (%d)"
+
+#: common.c:1303 describe.c:2020
+msgid "Column"
+msgstr "Kolumn"
+
+#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037
+#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021
+#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504
+#: describe.c:5767
+msgid "Type"
+msgstr "Typ"
+
+#: common.c:1353
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "Kommandot hade inget resultat eller så hade resultatet inga kolumner.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: argument krävs"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: parsfel vid \"%s\""
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: parsfel vid radslutet"
+
+#: copy.c:328
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "kunde inte köra kommandot \"%s\": %m"
+
+#: copy.c:344
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "kunde inte göra stat() på fil \"%s\": %m"
+
+#: copy.c:348
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: kan inte kopiera från/till en katalog"
+
+#: copy.c:385
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "kunde inte stänga rör till externt komamndo: %m"
+
+#: copy.c:390
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: copy.c:453 copy.c:463
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "kunde inte skriva COPY-data: %m"
+
+#: copy.c:469
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "COPY-överföring av data misslyckades: %s"
+
+#: copy.c:530
+msgid "canceled by user"
+msgstr "avbruten av användaren"
+
+#: copy.c:541
+msgid ""
+"Enter data to be copied followed by a newline.\n"
+"End with a backslash and a period on a line by itself, or an EOF signal."
+msgstr ""
+"Mata in data som skall kopieras följt av en nyrad.\n"
+"Avsluta med bakstreck och en punkt ensamma på en rad eller av en EOF."
+
+#: copy.c:684
+msgid "aborted because of read failure"
+msgstr "avbruten på grund av läsfel"
+
+#: copy.c:718
+msgid "trying to exit copy mode"
+msgstr "försöker avsluta kopieringsläge"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: satsen returnerade ingen resultatmängd"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: frågan måste returnera minst tre kolumner"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: vertikala och horisontala rubriker måste vara olika kolumner"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: datakolumn måste anges när frågan returnerar mer än tre kolumner"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: maximalt antal kolumner (%d) överskridet"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: frågeresultatet innehåller multipla värden för rad \"%s\", kolumn \"%s\""
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: kolumnnummer %d är utanför giltigt intervall 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: tvetydigt kolumnnamn: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: hittar ej kolumnnamn: \"%s\""
+
+#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029
+#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090
+#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866
+#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420
+#: describe.c:5477 describe.c:5881 describe.c:5959
+msgid "Schema"
+msgstr "Schema"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636
+#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258
+#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341
+#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867
+#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410
+#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748
+#: describe.c:5957 describe.c:6186 describe.c:6494
+msgid "Name"
+msgstr "Namn"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "Resultatdatatyp"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "Argumentdatatyp"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423
+#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041
+#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280
+#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777
+#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248
+#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422
+#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895
+#: describe.c:5960 describe.c:6992
+msgid "Description"
+msgstr "Beskrivning"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "Lista med aggregatfunktioner"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "Servern (version %s) stöder inte accessmetoder."
+
+#: describe.c:168
+msgid "Index"
+msgstr "Index"
+
+#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882
+msgid "Table"
+msgstr "Tabell"
+
+#: describe.c:177 describe.c:5679
+msgid "Handler"
+msgstr "Hanterare"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "Lista med accessmetoder"
+
+#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181
+#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588
+#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187
+#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718
+#: describe.c:6980
+msgid "Owner"
+msgstr "Ägare"
+
+#: describe.c:231
+msgid "Location"
+msgstr "Plats"
+
+#: describe.c:241 describe.c:3509
+msgid "Options"
+msgstr "Alternativ"
+
+#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934
+msgid "Size"
+msgstr "Storlek"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "Lista med tabellutrymmen"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df tar bara [anptwS+] som flaggor"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df tar inte en \"%c\"-flagga med serverversion %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "agg"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "fönster"
+
+#: describe.c:356
+msgid "proc"
+msgstr "proc"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "funk"
+
+# Vi väljer att bevara den engelska termen då det dels refererar till kommandot CREATE TRIGGER
+# och dels för att detta begreppet normalt benäms som triggers i dagligt tal i Sverige.
+#: describe.c:374 describe.c:1390
+msgid "trigger"
+msgstr "trigger"
+
+# Vi väljer att bevara den engelska termen då det refererar till en del av CREATE FUNCTION-syntaxen
+#: describe.c:386
+msgid "immutable"
+msgstr "immutable"
+
+# Vi väljer att bevara den engelska termen då det refererar till en del av CREATE FUNCTION-syntaxen
+#: describe.c:387
+msgid "stable"
+msgstr "stable"
+
+# Vi väljer att bevara den engelska termen då det refererar till en del av CREATE FUNCTION-syntaxen
+#: describe.c:388
+msgid "volatile"
+msgstr "volatile"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "Flyktighet"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "begränsad"
+
+#: describe.c:398
+msgid "safe"
+msgstr "säker"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "osäker"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "Parallell"
+
+#: describe.c:405
+msgid "definer"
+msgstr "definierare"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "anropare"
+
+#: describe.c:407
+msgid "Security"
+msgstr "Säkerhet"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Språk"
+
+#: describe.c:416 describe.c:420
+msgid "Source code"
+msgstr "Källkod"
+
+#: describe.c:594
+msgid "List of functions"
+msgstr "Lista med funktioner"
+
+#: describe.c:657
+msgid "Internal name"
+msgstr "Internt namn"
+
+#: describe.c:659
+msgid "Elements"
+msgstr "Element"
+
+#: describe.c:711
+msgid "List of data types"
+msgstr "Lista med datatyper"
+
+#: describe.c:814
+msgid "Left arg type"
+msgstr "Vänster argumenttyp"
+
+#: describe.c:815
+msgid "Right arg type"
+msgstr "Höger argumenttyp"
+
+#: describe.c:816
+msgid "Result type"
+msgstr "Resultattyp"
+
+#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247
+#: describe.c:6909 describe.c:6913
+msgid "Function"
+msgstr "Funktion"
+
+#: describe.c:902
+msgid "List of operators"
+msgstr "Lista med operatorer"
+
+#: describe.c:938
+msgid "Encoding"
+msgstr "Kodning"
+
+#: describe.c:939 describe.c:4868
+msgid "Collate"
+msgstr "Jämförelse"
+
+#: describe.c:940 describe.c:4869
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878
+msgid "ICU Locale"
+msgstr "ICU-lokal"
+
+#: describe.c:946 describe.c:952
+msgid "Locale Provider"
+msgstr "Lokalleverantör"
+
+#: describe.c:964
+msgid "Tablespace"
+msgstr "Tabellutrymme"
+
+#: describe.c:990
+msgid "List of databases"
+msgstr "Lista med databaser"
+
+#: describe.c:1031 describe.c:1184 describe.c:3882
+msgid "table"
+msgstr "tabell"
+
+#: describe.c:1032 describe.c:3883
+msgid "view"
+msgstr "vy"
+
+#: describe.c:1033 describe.c:3884
+msgid "materialized view"
+msgstr "materialiserad vy"
+
+#: describe.c:1034 describe.c:1186 describe.c:3886
+msgid "sequence"
+msgstr "sekvens"
+
+#: describe.c:1035 describe.c:3888
+msgid "foreign table"
+msgstr "främmande tabell"
+
+#: describe.c:1036 describe.c:3889 describe.c:4101
+msgid "partitioned table"
+msgstr "partitionerad tabell"
+
+#: describe.c:1047
+msgid "Column privileges"
+msgstr "Kolumnrättigheter"
+
+#: describe.c:1078 describe.c:1112
+msgid "Policies"
+msgstr "Policys"
+
+#: describe.c:1143 describe.c:4510 describe.c:6577
+msgid "Access privileges"
+msgstr "Åtkomsträttigheter"
+
+#: describe.c:1188
+msgid "function"
+msgstr "funktion"
+
+#: describe.c:1190
+msgid "type"
+msgstr "typ"
+
+#: describe.c:1192
+msgid "schema"
+msgstr "schema"
+
+#: describe.c:1215
+msgid "Default access privileges"
+msgstr "Standard accessrättigheter"
+
+#: describe.c:1259
+msgid "Object"
+msgstr "Objekt"
+
+#: describe.c:1273
+msgid "table constraint"
+msgstr "tabellvillkor"
+
+#: describe.c:1297
+msgid "domain constraint"
+msgstr "domänvillkor"
+
+#: describe.c:1321
+msgid "operator class"
+msgstr "operatorklass"
+
+#: describe.c:1345
+msgid "operator family"
+msgstr "operatorfamilj"
+
+#: describe.c:1368
+msgid "rule"
+msgstr "rule"
+
+#: describe.c:1414
+msgid "Object descriptions"
+msgstr "Objektbeskrivningar"
+
+#: describe.c:1479 describe.c:4007
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Kunde inte hitta en relation med namn \"%s\"."
+
+#: describe.c:1482 describe.c:4010
+#, c-format
+msgid "Did not find any relations."
+msgstr "Kunde inte hitta några relationer."
+
+#: describe.c:1678
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Kunde inte hitta en relation med OID %s."
+
+#: describe.c:1726 describe.c:1750
+msgid "Start"
+msgstr "Start"
+
+#: describe.c:1727 describe.c:1751
+msgid "Minimum"
+msgstr "Minimum"
+
+#: describe.c:1728 describe.c:1752
+msgid "Maximum"
+msgstr "Maximum"
+
+#: describe.c:1729 describe.c:1753
+msgid "Increment"
+msgstr "Ökning"
+
+#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426
+#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620
+msgid "yes"
+msgstr "ja"
+
+#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426
+#: describe.c:4768 describe.c:4892 describe.c:6621
+msgid "no"
+msgstr "nej"
+
+#: describe.c:1732 describe.c:1756
+msgid "Cycles?"
+msgstr "Cyklisk?"
+
+#: describe.c:1733 describe.c:1757
+msgid "Cache"
+msgstr "Cache"
+
+#: describe.c:1798
+#, c-format
+msgid "Owned by: %s"
+msgstr "Ägd av: %s"
+
+#: describe.c:1802
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Sekvens för identitetskolumn: %s"
+
+#: describe.c:1810
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "Ologgat sekvens \"%s.%s\""
+
+#: describe.c:1813
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Sekvens \"%s.%s\""
+
+#: describe.c:1957
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Ologgad tabell \"%s.%s\""
+
+#: describe.c:1960
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Tabell \"%s.%s\""
+
+#: describe.c:1964
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Vy \"%s.%s\""
+
+#: describe.c:1969
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Ologgad materialiserad vy \"%s.%s\""
+
+#: describe.c:1972
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Materialiserad vy \"%s.%s\""
+
+#: describe.c:1977
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Ologgat index \"%s.%s\""
+
+#: describe.c:1980
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Index \"%s.%s\""
+
+#: describe.c:1985
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Ologgat partitionerat index \"%s.%s\""
+
+#: describe.c:1988
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Partitionerat index \"%s.%s\""
+
+#: describe.c:1992
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST-tabell \"%s.%s\""
+
+#: describe.c:1996
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Sammansatt typ \"%s.%s\""
+
+#: describe.c:2000
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Främmande tabell \"%s.%s\""
+
+#: describe.c:2005
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Ologgad partitionerad tabell \"%s.%s\""
+
+#: describe.c:2008
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Partitionerad tabell \"%s.%s\""
+
+#: describe.c:2024 describe.c:4343
+msgid "Collation"
+msgstr "Jämförelse"
+
+#: describe.c:2025 describe.c:4344
+msgid "Nullable"
+msgstr "Nullbar"
+
+#: describe.c:2026 describe.c:4345
+msgid "Default"
+msgstr "Standard"
+
+#: describe.c:2029
+msgid "Key?"
+msgstr "Nyckel?"
+
+#: describe.c:2031 describe.c:4665 describe.c:4676
+msgid "Definition"
+msgstr "Definition"
+
+#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835
+#: describe.c:5894
+msgid "FDW options"
+msgstr "FDW-alternativ"
+
+#: describe.c:2035
+msgid "Storage"
+msgstr "Lagring"
+
+#: describe.c:2037
+msgid "Compression"
+msgstr "Komprimering"
+
+#: describe.c:2039
+msgid "Stats target"
+msgstr "Statistikmål"
+
+#: describe.c:2175
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "Partition av: %s %s%s"
+
+#: describe.c:2188
+msgid "No partition constraint"
+msgstr "Inget partitioneringsvillkor"
+
+#: describe.c:2190
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Partitioneringsvillkor: %s"
+
+#: describe.c:2214
+#, c-format
+msgid "Partition key: %s"
+msgstr "Partitioneringsnyckel: %s"
+
+#: describe.c:2240
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Ägande tabell \"%s.%s\""
+
+#: describe.c:2309
+msgid "primary key, "
+msgstr "primärnyckel, "
+
+#: describe.c:2312
+msgid "unique"
+msgstr "unik"
+
+#: describe.c:2314
+msgid " nulls not distinct"
+msgstr " null-värden ej distinkta"
+
+#: describe.c:2315
+msgid ", "
+msgstr ", "
+
+#: describe.c:2322
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "för tabell \"%s.%s\""
+
+#: describe.c:2326
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", predikat (%s)"
+
+#: describe.c:2329
+msgid ", clustered"
+msgstr ", klustrad"
+
+#: describe.c:2332
+msgid ", invalid"
+msgstr ", ogiltig"
+
+#: describe.c:2335
+msgid ", deferrable"
+msgstr ", uppskjutbar"
+
+#: describe.c:2338
+msgid ", initially deferred"
+msgstr ", initialt uppskjuten"
+
+#: describe.c:2341
+msgid ", replica identity"
+msgstr ", replikaidentitet"
+
+#: describe.c:2395
+msgid "Indexes:"
+msgstr "Index:"
+
+#: describe.c:2478
+msgid "Check constraints:"
+msgstr "Kontrollvillkor:"
+
+#: describe.c:2546
+msgid "Foreign-key constraints:"
+msgstr "Främmande nyckel-villkor:"
+
+#: describe.c:2609
+msgid "Referenced by:"
+msgstr "Refererad av:"
+
+#: describe.c:2659
+msgid "Policies:"
+msgstr "Policys:"
+
+#: describe.c:2662
+msgid "Policies (forced row security enabled):"
+msgstr "Policys (tvingad radsäkerhet påslagen):"
+
+#: describe.c:2665
+msgid "Policies (row security enabled): (none)"
+msgstr "Policys (radsäkerhet påslagna): (ingen)"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Policys (tvingad radsäkerhet påslagen): (ingen)"
+
+#: describe.c:2671
+msgid "Policies (row security disabled):"
+msgstr "Policys (radsäkerhet avstängd):"
+
+#: describe.c:2731 describe.c:2835
+msgid "Statistics objects:"
+msgstr "Statistikobjekt:"
+
+#: describe.c:2937 describe.c:3090
+msgid "Rules:"
+msgstr "Regler:"
+
+#: describe.c:2940
+msgid "Disabled rules:"
+msgstr "Avstängda regler:"
+
+#: describe.c:2943
+msgid "Rules firing always:"
+msgstr "Regler som alltid utförs:"
+
+#: describe.c:2946
+msgid "Rules firing on replica only:"
+msgstr "Regler som utförs enbart på replika:"
+
+#: describe.c:3025 describe.c:5030
+msgid "Publications:"
+msgstr "Publiceringar:"
+
+#: describe.c:3073
+msgid "View definition:"
+msgstr "Vydefinition:"
+
+#: describe.c:3236
+msgid "Triggers:"
+msgstr "Triggrar:"
+
+#: describe.c:3239
+msgid "Disabled user triggers:"
+msgstr "Avstängda användartriggrar:"
+
+#: describe.c:3242
+msgid "Disabled internal triggers:"
+msgstr "Avstängda interna triggrar:"
+
+#: describe.c:3245
+msgid "Triggers firing always:"
+msgstr "Triggrar som alltid körs:"
+
+#: describe.c:3248
+msgid "Triggers firing on replica only:"
+msgstr "Triggrar som enbart körs på replika:"
+
+#: describe.c:3319
+#, c-format
+msgid "Server: %s"
+msgstr "Server: %s"
+
+#: describe.c:3327
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW-alternativ: (%s)"
+
+#: describe.c:3348
+msgid "Inherits"
+msgstr "Ärver"
+
+#: describe.c:3413
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "Antal partitioner: %d"
+
+#: describe.c:3422
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Antal partitioner: %d (Använd \\d+ för att lista dem.)"
+
+#: describe.c:3424
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Antal barntabeller: %d (Använd \\d+ för att lista dem.)"
+
+#: describe.c:3431
+msgid "Child tables"
+msgstr "Barntabeller"
+
+#: describe.c:3431
+msgid "Partitions"
+msgstr "Partitioner"
+
+#: describe.c:3462
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Typad tabell av typ: %s"
+
+#: describe.c:3478
+msgid "Replica Identity"
+msgstr "Replikaidentitet"
+
+#: describe.c:3491
+msgid "Has OIDs: yes"
+msgstr "Har OID:er: ja"
+
+#: describe.c:3500
+#, c-format
+msgid "Access method: %s"
+msgstr "Accessmetod: %s"
+
+#: describe.c:3579
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "Tabellutrymme: \"%s\""
+
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:3591
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", tabellutrymme: \"%s\""
+
+#: describe.c:3668
+msgid "List of roles"
+msgstr "Lista med roller"
+
+#: describe.c:3670
+msgid "Role name"
+msgstr "Rollnamn"
+
+#: describe.c:3671
+msgid "Attributes"
+msgstr "Attribut"
+
+#: describe.c:3673
+msgid "Member of"
+msgstr "Medlem av"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "Superanvändare"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "Inget arv"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "Skapa roll"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "Skapa DB"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "Kan inte logga in"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "Replikering"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "Hopp över RLS"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "Inga uppkopplingar"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d uppkoppling"
+msgstr[1] "%d uppkopplingar"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Lösenord giltigt till "
+
+#: describe.c:3777
+msgid "Role"
+msgstr "Roll"
+
+#: describe.c:3778
+msgid "Database"
+msgstr "Databas"
+
+#: describe.c:3779
+msgid "Settings"
+msgstr "Inställningar"
+
+#: describe.c:3803
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "Kunde inte hitta några inställningar för roll \"%s\" och databas \"%s\"."
+
+#: describe.c:3806
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Kunde inte hitta några inställningar för roll \"%s\"."
+
+#: describe.c:3809
+#, c-format
+msgid "Did not find any settings."
+msgstr "Kunde inte hitta några inställningar."
+
+#: describe.c:3814
+msgid "List of settings"
+msgstr "Lista med inställningar"
+
+#: describe.c:3885
+msgid "index"
+msgstr "index"
+
+#: describe.c:3887
+msgid "TOAST table"
+msgstr "TOAST-tabell"
+
+#: describe.c:3890 describe.c:4102
+msgid "partitioned index"
+msgstr "partitionerat index"
+
+#: describe.c:3910
+msgid "permanent"
+msgstr "permanent"
+
+#: describe.c:3911
+msgid "temporary"
+msgstr "temporär"
+
+#: describe.c:3912
+msgid "unlogged"
+msgstr "ologgad"
+
+#: describe.c:3913
+msgid "Persistence"
+msgstr "Persistens"
+
+#: describe.c:3929
+msgid "Access method"
+msgstr "Accessmetod"
+
+#: describe.c:4015
+msgid "List of relations"
+msgstr "Lista med relationer"
+
+#: describe.c:4063
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "Servern (version %s) stöder inte deklarativ tabellpartitionering."
+
+#: describe.c:4074
+msgid "List of partitioned indexes"
+msgstr "Lista med partitionerade index"
+
+#: describe.c:4076
+msgid "List of partitioned tables"
+msgstr "Lista med partitionerade tabeller"
+
+#: describe.c:4080
+msgid "List of partitioned relations"
+msgstr "Lista med partitionerade relationer"
+
+#: describe.c:4111
+msgid "Parent name"
+msgstr "Föräldranamn"
+
+#: describe.c:4124
+msgid "Leaf partition size"
+msgstr "Partitionsstorlek av löv"
+
+#: describe.c:4127 describe.c:4133
+msgid "Total size"
+msgstr "Total storlek"
+
+#: describe.c:4258
+msgid "Trusted"
+msgstr "Tillförlitlig"
+
+#: describe.c:4267
+msgid "Internal language"
+msgstr "Internt språk"
+
+#: describe.c:4268
+msgid "Call handler"
+msgstr "Anropshanterare"
+
+#: describe.c:4269 describe.c:5680
+msgid "Validator"
+msgstr "Validerare"
+
+#: describe.c:4270
+msgid "Inline handler"
+msgstr "Inline-hanterare"
+
+#: describe.c:4305
+msgid "List of languages"
+msgstr "Lista med språk"
+
+#: describe.c:4346
+msgid "Check"
+msgstr "Check"
+
+#: describe.c:4390
+msgid "List of domains"
+msgstr "Lista med domäner"
+
+#: describe.c:4424
+msgid "Source"
+msgstr "Källa"
+
+#: describe.c:4425
+msgid "Destination"
+msgstr "Mål"
+
+#: describe.c:4427 describe.c:6622
+msgid "Default?"
+msgstr "Standard?"
+
+#: describe.c:4469
+msgid "List of conversions"
+msgstr "Lista med konverteringar"
+
+#: describe.c:4497
+msgid "Parameter"
+msgstr "Parameter"
+
+#: describe.c:4498
+msgid "Value"
+msgstr "Värde"
+
+#: describe.c:4505
+msgid "Context"
+msgstr "Kontext"
+
+#: describe.c:4538
+msgid "List of configuration parameters"
+msgstr "Lista med konfigurationsparametrar"
+
+#: describe.c:4540
+msgid "List of non-default configuration parameters"
+msgstr "Lista med icke-defaulta konfigurationsparametrar"
+
+#: describe.c:4567
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "Servern (version %s) stöder inte händelsetriggrar."
+
+#: describe.c:4587
+msgid "Event"
+msgstr "Händelse"
+
+#: describe.c:4589
+msgid "enabled"
+msgstr "påslagen"
+
+#: describe.c:4590
+msgid "replica"
+msgstr "replika"
+
+#: describe.c:4591
+msgid "always"
+msgstr "alltid"
+
+#: describe.c:4592
+msgid "disabled"
+msgstr "avstängd"
+
+#: describe.c:4593 describe.c:6496
+msgid "Enabled"
+msgstr "Påslagen"
+
+#: describe.c:4595
+msgid "Tags"
+msgstr "Etiketter"
+
+#: describe.c:4619
+msgid "List of event triggers"
+msgstr "Lista med händelsetriggrar"
+
+#: describe.c:4646
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "Servern (version %s) stöder inte utökad statistik."
+
+#: describe.c:4683
+msgid "Ndistinct"
+msgstr "Nunika"
+
+#: describe.c:4684
+msgid "Dependencies"
+msgstr "Beroenden"
+
+#: describe.c:4694
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4718
+msgid "List of extended statistics"
+msgstr "Lista med utökad statistik"
+
+#: describe.c:4745
+msgid "Source type"
+msgstr "Källtyp"
+
+#: describe.c:4746
+msgid "Target type"
+msgstr "Måltyp"
+
+#: describe.c:4770
+msgid "in assignment"
+msgstr "i tilldelning"
+
+#: describe.c:4772
+msgid "Implicit?"
+msgstr "Implicit?"
+
+#: describe.c:4831
+msgid "List of casts"
+msgstr "Lista med typomvandlingar"
+
+#: describe.c:4883 describe.c:4887
+msgid "Provider"
+msgstr "Leverantör"
+
+#: describe.c:4893 describe.c:4898
+msgid "Deterministic?"
+msgstr "Deterministisk?"
+
+#: describe.c:4938
+msgid "List of collations"
+msgstr "Lista med jämförelser (collations)"
+
+#: describe.c:5000
+msgid "List of schemas"
+msgstr "Lista med scheman"
+
+#: describe.c:5117
+msgid "List of text search parsers"
+msgstr "Lista med textsökparsrar"
+
+#: describe.c:5167
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Kunde inte hitta en textsökparser med namn \"%s\"."
+
+#: describe.c:5170
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Kunde inte hitta några textsökparsrar."
+
+#: describe.c:5245
+msgid "Start parse"
+msgstr "Starta parsning"
+
+#: describe.c:5246
+msgid "Method"
+msgstr "Metod"
+
+#: describe.c:5250
+msgid "Get next token"
+msgstr "Hämta nästa symbol"
+
+#: describe.c:5252
+msgid "End parse"
+msgstr "Avsluta parsning"
+
+#: describe.c:5254
+msgid "Get headline"
+msgstr "Hämta rubrik"
+
+#: describe.c:5256
+msgid "Get token types"
+msgstr "Hämta symboltyper"
+
+#: describe.c:5267
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Textsökparser \"%s.%s\""
+
+#: describe.c:5270
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Textsökparser \"%s\""
+
+#: describe.c:5289
+msgid "Token name"
+msgstr "Symbolnamn"
+
+#: describe.c:5303
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Symboltyper för parser \"%s.%s\""
+
+#: describe.c:5306
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Symboltyper för parser \"%s\""
+
+#: describe.c:5350
+msgid "Template"
+msgstr "Mall"
+
+#: describe.c:5351
+msgid "Init options"
+msgstr "Initieringsalternativ"
+
+#: describe.c:5378
+msgid "List of text search dictionaries"
+msgstr "Lista med textsökordlistor"
+
+#: describe.c:5411
+msgid "Init"
+msgstr "Init"
+
+#: describe.c:5412
+msgid "Lexize"
+msgstr "Symboluppdelning"
+
+#: describe.c:5444
+msgid "List of text search templates"
+msgstr "Lista med textsökmallar"
+
+#: describe.c:5499
+msgid "List of text search configurations"
+msgstr "Lista med textsökkonfigurationer"
+
+#: describe.c:5550
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "Kunde inte hitta en textsökkonfiguration med namn \"%s\"."
+
+#: describe.c:5553
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Kunde inte hitta några textsökkonfigurationer."
+
+#: describe.c:5619
+msgid "Token"
+msgstr "Symbol"
+
+#: describe.c:5620
+msgid "Dictionaries"
+msgstr "Ordlistor"
+
+#: describe.c:5631
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Textsökkonfiguration \"%s.%s\""
+
+#: describe.c:5634
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Textsökkonfiguration \"%s\""
+
+#: describe.c:5638
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Parser: \"%s.%s\""
+
+#: describe.c:5641
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Parser: \"%s\""
+
+#: describe.c:5722
+msgid "List of foreign-data wrappers"
+msgstr "Lista med främmande data-omvandlare"
+
+#: describe.c:5750
+msgid "Foreign-data wrapper"
+msgstr "Främmande data-omvandlare"
+
+#: describe.c:5768 describe.c:5958
+msgid "Version"
+msgstr "Version"
+
+#: describe.c:5799
+msgid "List of foreign servers"
+msgstr "Lista med främmande servrar"
+
+#: describe.c:5824 describe.c:5883
+msgid "Server"
+msgstr "Server"
+
+#: describe.c:5825
+msgid "User name"
+msgstr "Användarnamn"
+
+#: describe.c:5855
+msgid "List of user mappings"
+msgstr "Lista av användarmappningar"
+
+#: describe.c:5928
+msgid "List of foreign tables"
+msgstr "Lista med främmande tabeller"
+
+#: describe.c:5980
+msgid "List of installed extensions"
+msgstr "Lista med installerade utökningar"
+
+#: describe.c:6028
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "Kunde inte hitta en utökning med namn \"%s\"."
+
+#: describe.c:6031
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Kunde inte hitta några utökningar."
+
+#: describe.c:6075
+msgid "Object description"
+msgstr "Objektbeskrivning"
+
+#: describe.c:6085
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Objekt i utökning \"%s\""
+
+#: describe.c:6126
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "ej korrekt kvalificerat namn (för många namn med punkt): %s"
+
+#: describe.c:6140
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "referenser till andra databaser är inte implementerat: %s"
+
+#: describe.c:6171 describe.c:6298
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "Servern (version %s) stöder inte publiceringar."
+
+#: describe.c:6188 describe.c:6376
+msgid "All tables"
+msgstr "Alla tabeller"
+
+#: describe.c:6189 describe.c:6377
+msgid "Inserts"
+msgstr "Insättningar"
+
+#: describe.c:6190 describe.c:6378
+msgid "Updates"
+msgstr "Uppdateringar"
+
+#: describe.c:6191 describe.c:6379
+msgid "Deletes"
+msgstr "Borttagningar"
+
+#: describe.c:6195 describe.c:6381
+msgid "Truncates"
+msgstr "Trunkeringar"
+
+#: describe.c:6199 describe.c:6383
+msgid "Via root"
+msgstr "Via root"
+
+#: describe.c:6221
+msgid "List of publications"
+msgstr "Lista med publiceringar"
+
+#: describe.c:6345
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "Kunde inte hitta någon publicering med namn \"%s\"."
+
+#: describe.c:6348
+#, c-format
+msgid "Did not find any publications."
+msgstr "Kunde inte hitta några publiceringar."
+
+#: describe.c:6372
+#, c-format
+msgid "Publication %s"
+msgstr "Publicering %s"
+
+#: describe.c:6425
+msgid "Tables:"
+msgstr "Tabeller:"
+
+#: describe.c:6437
+msgid "Tables from schemas:"
+msgstr "Tabeller från scheman:"
+
+#: describe.c:6481
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Denna server (version %s) stöder inte prenumerationer."
+
+#: describe.c:6497
+msgid "Publication"
+msgstr "Publicering"
+
+#: describe.c:6506
+msgid "Binary"
+msgstr "Binär"
+
+#: describe.c:6507
+msgid "Streaming"
+msgstr "Strömmande"
+
+#: describe.c:6514
+msgid "Two-phase commit"
+msgstr "Tvåfas-commit"
+
+#: describe.c:6515
+msgid "Disable on error"
+msgstr "Stäng av vid fel"
+
+#: describe.c:6520
+msgid "Synchronous commit"
+msgstr "Synkron commit"
+
+#: describe.c:6521
+msgid "Conninfo"
+msgstr "Anslutningsinfo"
+
+#: describe.c:6527
+msgid "Skip LSN"
+msgstr "Skippa LSN"
+
+#: describe.c:6554
+msgid "List of subscriptions"
+msgstr "Lista med prenumerationer"
+
+#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6617
+msgid "Input type"
+msgstr "Indatatyp"
+
+#: describe.c:6618
+msgid "Storage type"
+msgstr "Lagringstyp"
+
+#: describe.c:6619
+msgid "Operator class"
+msgstr "Operatorklass"
+
+#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901
+msgid "Operator family"
+msgstr "Operatorfamilj"
+
+#: describe.c:6667
+msgid "List of operator classes"
+msgstr "Lista med operatorklasser"
+
+#: describe.c:6714
+msgid "Applicable types"
+msgstr "Applicerbara typer"
+
+#: describe.c:6756
+msgid "List of operator families"
+msgstr "Lista med operatorfamiljer"
+
+#: describe.c:6807
+msgid "Operator"
+msgstr "Operator"
+
+#: describe.c:6808
+msgid "Strategy"
+msgstr "Strategi"
+
+#: describe.c:6809
+msgid "ordering"
+msgstr "ordning"
+
+#: describe.c:6810
+msgid "search"
+msgstr "sök"
+
+#: describe.c:6811
+msgid "Purpose"
+msgstr "Ändamål"
+
+#: describe.c:6816
+msgid "Sort opfamily"
+msgstr "Sortering-opfamilj"
+
+#: describe.c:6855
+msgid "List of operators of operator families"
+msgstr "Lista med operatorer i operatorfamiljer"
+
+#: describe.c:6902
+msgid "Registered left type"
+msgstr "Registrerad vänstertyp"
+
+#: describe.c:6903
+msgid "Registered right type"
+msgstr "Registrerad högertyp"
+
+#: describe.c:6904
+msgid "Number"
+msgstr "Nummer"
+
+#: describe.c:6948
+msgid "List of support functions of operator families"
+msgstr "Lista med supportfunktioner i operatorfamiljer"
+
+#: describe.c:6979
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7000
+msgid "Large objects"
+msgstr "Stora objekt"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql är den interaktiva PostgreSQL-terminalen.\n"
+"\n"
+
+#: help.c:76 help.c:393 help.c:473 help.c:516
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [FLAGGA]... [DBNAMN [ANVÄNDARNAMN]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "Allmänna flaggor:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=KOMMANDO kör ett kommando (SQL eller internt) och avsluta sedan\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=DBNAMN databasnamn att koppla upp mot (standard: \"%s\")\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=FILNAMN kör kommandon från fil och avsluta sedan\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list lista befintliga databaser och avsluta sedan\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variale=NAMN=VÄRDE\n"
+" sätt psql-variabel NAMN till VÄRDE\n"
+" (t.ex. -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc läs inte startfilen (~/.psqlrc)\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (\"ett\"), --single-transaction\n"
+" kör kommandofilen som en transaktion (om icke-interaktiv)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=alternativ] visa denna hjälp, avsluta sedan\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands lista bakstreck-kommandon, avsluta sedan\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variabler lista speciella variabler, avsluta sedan\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Flaggor för in-/utmatning:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all visa all indata från skript\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors visa misslyckade kommandon\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries visa kommandon som skickas till servern\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden visa frågor som interna kommandon skapar\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=FILENAME skicka sessions-logg till fil\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline slå av förbättrad kommandoradsredigering (readline)\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=FILNAMN skriv frågeresultat till fil (eller |rör)\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet kör tyst (inga meddelanden, endast frågeutdata)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step stegningsläge (bekräfta varje fråga)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line enradsläge (slutet på raden avslutar SQL-kommando)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Flaggor för utdataformat:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align ojusterad utskrift av tabeller\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv CSV-utmarningsläge (kommaseparerade värden)\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=STRÄNG\n"
+" fältseparator för icke justerad utdata (standard: \"%s\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html HTML-utskrift av tabeller\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=VAR[=ARG] sätt utskriftsvariabel VAR till ARG (se kommando \\pset)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=STRÄNG\n"
+" sätt postseparator för icke justerad utdata (standard: newline)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only visa endast rader\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=TEXT sätt HTML-tabellers flaggor (t.ex. width, border)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded slå på utökad utsrift av tabeller\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" sätt fältseparator för icke justerad utdata till noll-byte\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator=zero\n"
+" sätt postseparator för icke justerad utdata till noll-byte\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Flaggor för anslutning:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr ""
+" -h, --host=VÄRDNAMN databasens värdnamn eller uttagkatalog (socket)\n"
+" (standard: \"%s\")\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "lokalt uttag (socket)"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT databasens serverport (standard: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=ANVNAMN användarnamn för databasen (standard: \"%s\")\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password fråga aldrig efter lösenord\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password fråga om lösenord (borde ske automatiskt)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"För mer information, skriv \"\\?\" (för interna kommandon) eller\n"
+"\"\\help\" (för SQL-kommandon) i psql, eller läs avsnittet om psql\n"
+"i PostgreSQL-dokumentationen.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapportera fel till <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "Allmänna\n"
+
+#: help.c:192
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright visa PostgreSQL-upphovsrättsinformation\n"
+
+#: help.c:193
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr " \\crosstabview [KOLUMNER] kör fråga och visa resultatet i en korstabell\n"
+
+#: help.c:194
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose visa senste felmeddelande vid maximal verbositet\n"
+
+#: help.c:195
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(FLAGGOR)] [FIL] kör frågan (och skicka resultatet till fil eller |rör);\n"
+" \\g utan argument är samma som ett semikolon\n"
+
+#: help.c:197
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc beskriv resultatet av fråga utan att köra den\n"
+
+#: help.c:198
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec kör fråga, kör sen varje värde i resultatet\n"
+
+#: help.c:199
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [PREFIX] kör frågan och spara resultatet i psql-variabler\n"
+
+#: help.c:200
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(FLAGGOR)] [FIL] som \\g, men tvinga expanderat utmatningsläge\n"
+
+#: help.c:201
+msgid " \\q quit psql\n"
+msgstr " \\q avsluta psql\n"
+
+#: help.c:202
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SEK] kör fråga var SEK sekund\n"
+
+#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304
+#: help.c:324 help.c:337 help.c:346
+msgid "\n"
+msgstr "\n"
+
+#: help.c:205
+msgid "Help\n"
+msgstr "Hjälp\n"
+
+#: help.c:207
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [kommandon] visa hjälp om backstreckkommandon\n"
+
+#: help.c:208
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options visa hjälp för psqls kommandoradflaggor\n"
+
+#: help.c:209
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables visa hjälp om speciella variabler\n"
+
+#: help.c:210
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [NAMN] hjälp med syntaxen för SQL-kommandon, * för alla kommandon\n"
+
+#: help.c:213
+msgid "Query Buffer\n"
+msgstr "Frågebuffert\n"
+
+#: help.c:214
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [FIL] [RAD] redigera frågebufferten (eller filen) med extern redigerare\n"
+
+#: help.c:215
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [FUNKNAMN [RAD]] redigera funktionsdefinition med extern redigerare\n"
+
+#: help.c:216
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [FUNKNAMN [RAD]] redigera vydefinition med extern redigerare\n"
+
+#: help.c:217
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p visa innehållet i frågebufferten\n"
+
+#: help.c:218
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r nollställ (radera) frågebufferten\n"
+
+#: help.c:220
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [FILNAMN] visa kommandohistorien eller spara den i fil\n"
+
+#: help.c:222
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w FILNAMN skriv frågebuffert till fil\n"
+
+#: help.c:225
+msgid "Input/Output\n"
+msgstr "In-/Utmatning\n"
+
+#: help.c:226
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... utför SQL COPY med dataström till klientvärden\n"
+
+#: help.c:227
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [TEXT] skriv text till standard ut (-n för ingen nyrad)\n"
+
+#: help.c:228
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i FILNAMN kör kommandon från fil\n"
+
+#: help.c:229
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir FIL som \\i, men relativt platsen för aktuellt script\n"
+
+#: help.c:230
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [FIL] skicka frågeresultat till fil eller |rör\n"
+
+#: help.c:231
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr " \\qecho [-n] [TEXT] skriv text till \\o-utdataströmmen (-n för ingen nyrad)\n"
+
+#: help.c:232
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [TEXT] skriv text till standard error (-n för ingen nyrad)\n"
+
+#: help.c:235
+msgid "Conditional\n"
+msgstr "Villkor\n"
+
+#: help.c:236
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR starta villkorsblock\n"
+
+#: help.c:237
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR alternativ inom aktuellt villkorsblock\n"
+
+#: help.c:238
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else avslutningsalternativ inom aktuellt villkorsblock\n"
+
+#: help.c:239
+msgid " \\endif end conditional block\n"
+msgstr " \\endif avsluta villkorsblock\n"
+
+#: help.c:242
+msgid "Informational\n"
+msgstr "Information\n"
+
+#: help.c:243
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (flaggor: S = lista systemobjekt, + = mer detaljer)\n"
+
+#: help.c:244
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] lista tabeller, vyer och sekvenser\n"
+
+#: help.c:245
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NAMN beskriv tabell, vy, sekvens eller index\n"
+
+#: help.c:246
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [MALL] lista aggregatfunktioner\n"
+
+#: help.c:247
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [MALL] lista accessmetoder\n"
+
+#: help.c:248
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] lista operatorklasser\n"
+
+#: help.c:249
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] lista operatorfamiljer\n"
+
+#: help.c:250
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] lista operatorer i operatorfamiljer\n"
+
+#: help.c:251
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] lista supportfunktioner i operatorfamiljer\n"
+
+#: help.c:252
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [MALL] lista tabellutrymmen\n"
+
+#: help.c:253
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [MALL] lista konverteringar\n"
+
+#: help.c:254
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [MALL] lista konfigurationsparametrar\n"
+
+#: help.c:255
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [MALL] lista typomvandlingar\n"
+
+#: help.c:256
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [MALL] visa objektbeskrivning som inte visas på andra ställen\n"
+
+#: help.c:257
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [MALL] lista domäner\n"
+
+#: help.c:258
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [MALL] lista standardrättigheter\n"
+
+#: help.c:259
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [MALL] lista främmande tabeller\n"
+
+#: help.c:260
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [MALL] lista främmande servrar\n"
+
+#: help.c:261
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [MALL] lista främmande tabeller\n"
+
+#: help.c:262
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [MALL] lista användarmappning\n"
+
+#: help.c:263
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [MALL] lista främmande data-omvandlare\n"
+
+#: help.c:264
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNKMALL [TYPMALL ...]]\n"
+" lista [endast agg/normala/procedur/trigger/window] funktioner\n"
+
+#: help.c:266
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [MALL] lista textsökkonfigurationer\n"
+
+#: help.c:267
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [MALL] lista textsökordlistor\n"
+
+#: help.c:268
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [MALL] lista textsökparsrar\n"
+
+#: help.c:269
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [MALL] lista textsökmallar\n"
+
+#: help.c:270
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [MALL] lista roller\n"
+
+#: help.c:271
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [MALL] lista index\n"
+
+#: help.c:272
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] lista stora objekt, samma som \\lo_list\n"
+
+#: help.c:273
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [MALL] lista procedurspråk\n"
+
+#: help.c:274
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [MALL] lista materialiserade vyer\n"
+
+#: help.c:275
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [MALL] lista scheman\n"
+
+#: help.c:276
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPMALL [TYPMALL [TYPMALL]]]\n"
+" lista operatorer\n"
+
+#: help.c:278
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [MALL] lista jämförelser (collation)\n"
+
+#: help.c:279
+msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp [MALL] lista åtkomsträttigheter för tabeller, vyer och sekvenser\n"
+
+#: help.c:280
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[tin+] [MALL] lista [bara tabell/index] partitionerade relationer [n=nästlad]\n"
+
+#: help.c:281
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr ""
+" \\drds [ROLLMALL1 [DBMALL2]]\n"
+" lista rollinställningar per databas\n"
+
+#: help.c:282
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [MALL] lista replikeringspubliceringar\n"
+
+#: help.c:283
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [MALL] lista replikeringsprenumerationer\n"
+
+#: help.c:284
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [MALL] lista sekvenser\n"
+
+#: help.c:285
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [MALL] lista tabeller\n"
+
+#: help.c:286
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [MALL] lista datatyper\n"
+
+#: help.c:287
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [MALL] lista roller\n"
+
+#: help.c:288
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [MALL] lista vyer\n"
+
+#: help.c:289
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [MALL] lista utökningar\n"
+
+#: help.c:290
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [MALL] lista utökad statistik\n"
+
+#: help.c:291
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [MALL] lista händelsetriggrar\n"
+
+#: help.c:292
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [MALL] lista databaser\n"
+
+#: help.c:293
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNKNAMN visa en funktions definition\n"
+
+#: help.c:294
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VYNAMN visa en vys definition\n"
+
+#: help.c:295
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [MALL] samma som \\dp\n"
+
+#: help.c:298
+msgid "Large Objects\n"
+msgstr "Stora objekt\n"
+
+#: help.c:299
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export LOBOID FIL skriv stort objekt till fil\n"
+
+#: help.c:300
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import FIL [KOMMENTAR]\n"
+" läs stort objekt från fil\n"
+
+#: help.c:302
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] lista stora objekt\n"
+
+#: help.c:303
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID ta bort stort objekt\n"
+
+#: help.c:306
+msgid "Formatting\n"
+msgstr "Formatering\n"
+
+#: help.c:307
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a byt mellan ojusterat och justerat utdataformat\n"
+
+#: help.c:308
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [TEXT] sätt tabelltitel, eller nollställ\n"
+
+#: help.c:309
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [TEXT] visa eller sätt fältseparatorn för ojusterad utmatning\n"
+
+#: help.c:310
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H slå på/av HTML-utskriftsläge (för närvarande: %s)\n"
+
+#: help.c:312
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NAMN [VÄRDE]] sätt utmatningsalternativ för tabeller\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:319
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] visa endast rader (för närvarande: %s)\n"
+
+#: help.c:321
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [TEXT] sätt HTML-tabellens <table>-attribut, eller nollställ\n"
+
+#: help.c:322
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] slå på/av utökad utskrift (för närvarande: %s)\n"
+
+#: help.c:323
+msgid "auto"
+msgstr "auto"
+
+#: help.c:326
+msgid "Connection\n"
+msgstr "Anslutning\n"
+
+#: help.c:328
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[DBNAMN|- ANVÄNDARE|- VÄRD|- PORT|-] | conninfo}\n"
+" koppla upp mot ny databas (för närvarande \"%s\")\n"
+
+#: help.c:332
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[DBNAMN|- ANVÄNDARE|- VÄRD|- PORT|-] | conninfo}\n"
+" koppla upp mot ny databas (för närvarande ingen uppkoppling)\n"
+
+#: help.c:334
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo visa information om aktuell uppkoppling\n"
+
+#: help.c:335
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [KODNING] visa eller sätt klientens teckenkodning\n"
+
+#: help.c:336
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [ANVÄNDARNAMN] byt användares lösenord på ett säkert sätt\n"
+
+#: help.c:339
+msgid "Operating System\n"
+msgstr "Operativsystem\n"
+
+#: help.c:340
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [KATALOG] byt den aktuella katalogen\n"
+
+#: help.c:341
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR hämta omgivningsvariabel\n"
+
+#: help.c:342
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAMN [VÄRDE] sätt eller nollställ omgivningsvariabel\n"
+
+#: help.c:343
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] slå på/av tidstagning av kommandon (för närvarande: %s)\n"
+
+#: help.c:345
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [KOMMANDO] kör kommando i skal eller starta interaktivt skal\n"
+
+#: help.c:348
+msgid "Variables\n"
+msgstr "Variabler\n"
+
+#: help.c:349
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TEXT] NAMN be användaren att sätta en intern variabel\n"
+
+#: help.c:350
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [NAMN [VÄRDE]] sätt intern variabel, eller lista alla om ingen param\n"
+
+#: help.c:351
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NAME ta bort intern variabel\n"
+
+#: help.c:390
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr "Lista av variabler som hanteras speciellt\n"
+
+#: help.c:392
+msgid "psql variables:\n"
+msgstr "psql-variabler:\n"
+
+#: help.c:394
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAMN=VÄRDE\n"
+" eller \\set NAMN VÄRDE inne i psql\n"
+"\n"
+
+#: help.c:396
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" om satt så kommer efterföljande SQL-kommandon commit:as automatiskt\n"
+
+#: help.c:398
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" bestämmer skiftläge för att komplettera SQL-nyckelord\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:401
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" den uppkopplade databasens namn\n"
+
+#: help.c:403
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" bestämmer vilken indata som skrivs till standard ut\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:406
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" om satt, visa interna frågor som körs av backåtstreckkommandon:\n"
+" om satt till \"noexec\", bara visa dem utan att köra\n"
+
+#: help.c:409
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" aktuell teckenkodning för klient\n"
+
+#: help.c:411
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr ""
+" ERROR\n"
+" sant om sista frågan misslyckades, falskt annars\n"
+
+#: help.c:413
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" antal resultatrader som hämtas och visas åt gången (0=obegränsat)\n"
+
+#: help.c:415
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" om satt så visas inte accessmetoder\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" om satt så visas inte komprimeringsmetoder\n"
+
+#: help.c:419
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" styr kommandohistoriken [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:421
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" filnamn för att spara kommandohistoriken i\n"
+
+#: help.c:423
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" maximalt antal kommandon som sparas i kommandohistoriken\n"
+
+#: help.c:425
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" den uppkopplade databasens värd\n"
+
+#: help.c:427
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" antal EOF som behövs för att avsluta en interaktiv session\n"
+
+#: help.c:429
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" värdet av den senast påverkade OID:en\n"
+
+#: help.c:431
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" meddelande och SQLSTATE för sista felet eller en tom sträng och \"00000\" om det inte varit fel\n"
+
+#: help.c:434
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" om satt, ett fel stoppar inte en transaktion (använder implicita sparpunkter)\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" avsluta batchkörning vid fel\n"
+
+#: help.c:438
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" värdport för den aktuella uppkopplingen\n"
+
+#: help.c:440
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" anger standardprompten för psql\n"
+
+#: help.c:442
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" anger den prompt som används om en sats forsätter på efterföljande rad\n"
+
+#: help.c:444
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" anger den prompt som används för COPY ... FROM STDIN\n"
+
+#: help.c:446
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" kör tyst (samma som flaggan -q)\n"
+
+#: help.c:448
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" antal rader som returnerades eller påverkades av senaste frågan alternativt 0\n"
+
+#: help.c:450
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NUM\n"
+" SERVER_VERSION_NAME\n"
+" serverns version (i kort sträng eller numeriskt format)\n"
+
+#: help.c:453
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" visa alla resultat från en kombinerad fråga (\\;) istället för bara\n"
+" det sista\n"
+
+#: help.c:455
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" styr visning av meddelandekontextfält [never, errors, always]\n"
+
+#: help.c:457
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" om satt, slut på raden avslutar SQL-kommandon (samma som flaggan -S )\n"
+
+#: help.c:459
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" stegningsläge (samma som flaggan -s)\n"
+
+#: help.c:461
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" SQLSTATE för sista frågan eller \"00000\" om det inte varit fel\n"
+
+#: help.c:463
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" den uppkopplade databasanvändaren\n"
+
+#: help.c:465
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" styr verbositet för felrapporter [default, verbose, terse, sqlstate]\n"
+
+#: help.c:467
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql:s version (i lång sträng, kort sträng eller numeriskt format)\n"
+
+#: help.c:472
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Visningsinställningar:\n"
+
+#: help.c:474
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NAMN[=VÄRDE]\n"
+" eller \\pset NAMN [VÄRDE] inne i psql\n"
+"\n"
+
+#: help.c:476
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" ramstil (nummer)\n"
+
+#: help.c:478
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" målvidd för wrappade format\n"
+
+#: help.c:480
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (eller x)\n"
+" expanderad utdata [on, off, auto]\n"
+
+#: help.c:482
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" fältseparator för ej justerad utdata (standard \"%s\")\n"
+
+#: help.c:485
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" sätt fältseparator för ej justerad utdata till noll-byte\n"
+
+#: help.c:487
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" slå på/av visning av tabellfot [on, off]\n"
+
+#: help.c:489
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" sätt utdataformat [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:491
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" sätt ramlinjestil [ascii, old-ascii, unicode]\n"
+
+#: help.c:493
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" sätt sträng som visas istället för null-värden\n"
+
+#: help.c:495
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" slå på visning av lokalspecifika tecken för gruppering av siffror\n"
+
+#: help.c:497
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" styr när en extern pagenerare används [yes, no, always]\n"
+
+#: help.c:499
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" post (rad) separator för ej justerad utdata\n"
+
+#: help.c:501
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" sätt postseparator för ej justerad utdata till noll-byte\n"
+
+#: help.c:503
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (el. T)\n"
+" ange attribut för tabelltaggen i html-format eller proportionella\n"
+" kolumnvidder för vänsterjusterade datatypet i latex-longtable-format\n"
+
+#: help.c:506
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" sätt tabelltitel för efterkommande tabellutskrifter\n"
+
+#: help.c:508
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" om satt, bara tabelldatan visas\n"
+
+#: help.c:510
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" sätter stilen på Unicode-linjer [single, double]\n"
+
+#: help.c:515
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Omgivningsvariabler:\n"
+
+#: help.c:519
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NAMN=VÄRDE [NAMN=VÄRDE] psql ...\n"
+" eller \\setenv NAMN [VÄRDE] inne psql\n"
+"\n"
+
+#: help.c:521
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NAMN=VÄRDE\n"
+" psql ...\n"
+" eller \\setenv NAMN [VÄRDE] inne i psql\n"
+"\n"
+
+#: help.c:524
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" antal kolumner i wrappade format\n"
+
+#: help.c:526
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" samma som anslutningsparametern \"application_name\"\n"
+
+#: help.c:528
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" samma som anslutningsparametern \"dbname\"\n"
+
+#: help.c:530
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" samma som anslutningsparametern \"host\"\n"
+
+#: help.c:532
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" lösenordsfilnamn\n"
+
+#: help.c:534
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" uppkoppingens lösenord (rekommenderas inte)\n"
+
+#: help.c:536
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" samma som anslutingsparametern \"port\"\n"
+
+#: help.c:538
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" samma som anslutningsparametern \"user\"\n"
+
+#: help.c:540
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" redigerare som används av kommanona \\e, \\ef och \\ev\n"
+
+#: help.c:542
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" hur radnummer anges när redigerare startas\n"
+
+#: help.c:544
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" alternativ plats för kommandohistorikfilen\n"
+
+#: help.c:546
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PAGER\n"
+" namnet på den externa pageneraren\n"
+
+#: help.c:549
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" namn på externt paginerarprogram för \\watch\n"
+
+#: help.c:552
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" alternativ plats för användarens \".psqlrc\"-fil\n"
+
+#: help.c:554
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" skalet som används av kommandot \\!\n"
+
+#: help.c:556
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" katalog för temporärfiler\n"
+
+#: help.c:616
+msgid "Available help:\n"
+msgstr "Tillgänglig hjälp:\n"
+
+#: help.c:711
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Kommando: %s\n"
+"Beskrivning: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:734
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Ingen hjälp tillgänglig för \"%s\".\n"
+"Försök med \\h utan argument för att se den tillgängliga hjälpen.\n"
+
+#: input.c:217
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "kunde inte läsa från infilen: %m"
+
+#: input.c:478 input.c:516
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "kunde inte skriva kommandohistorien till \"%s\": %m"
+
+#: input.c:535
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "historia stöds inte av denna installationen"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: ej uppkopplad mot en databas"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: aktuell transaktion är avbruten"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: okänd transaktionsstatus"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: escape:ad"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Använd \"\\q\" för att lämna %s.\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"Indatan är en PostgreSQL-specifik dump.\n"
+"Använd kommandoradsprogrammet pg_restore för att läsa in denna dump till databasen.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Använd \\? för hjälp eller tryck control-C för att nollställa inmatningsbufferten."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "Använd \\? för hjälp."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Du använder psql, den interaktiva PostgreSQL-terminalen."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Skriv: \\copyright för upphovsrättsinformation\n"
+" \\h för hjälp om SQL-kommandon\n"
+" \\? för hjälp om psql-kommandon\n"
+" \\g eller avsluta med semikolon för att köra en fråga\n"
+" \\q för att avsluta\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "Använd \\q för att avsluta."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "Använd control-D för att avsluta."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "Använd control-C för att avsluta."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "fråga ignorerat; använd \\endif eller Ctrl-C för att avsluta aktuellt \\if-block"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "kom till EOF utan att hitta avslutande \\endif"
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "icketerminerad citerad sträng"
+
+#: psqlscanslash.l:811
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: slut på minne"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1996
+#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154
+#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228
+#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431
+#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517
+#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594
+#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730
+#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071
+#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171
+#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259
+#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338
+#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396
+#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428
+#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464
+#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499
+#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537
+#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574
+#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606
+#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638
+#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680
+#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030
+#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687
+#: sql_help.c:4735 sql_help.c:4893
+msgid "name"
+msgstr "namn"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846
+#: sql_help.c:3339 sql_help.c:4455
+msgid "aggregate_signature"
+msgstr "aggregatsignatur"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "nytt_namn"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3011
+msgid "new_owner"
+msgstr "ny_ägare"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "nytt_schema"
+
+#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484
+msgid "where aggregate_signature is:"
+msgstr "där aggregatsignatur är:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911
+#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085
+#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341
+#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527
+#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461
+#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488
+#: sql_help.c:4491
+msgid "argmode"
+msgstr "arg_läge"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912
+#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2067 sql_help.c:2086
+#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342
+#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528
+#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475
+#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492
+msgid "argname"
+msgstr "arg_namn"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2388 sql_help.c:2597
+#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440
+#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470
+#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493
+msgid "argtype"
+msgstr "arg_typ"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974
+#: sql_help.c:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343
+#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040
+#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742
+#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956
+msgid "option"
+msgstr "flaggor"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433
+#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388
+msgid "where option can be:"
+msgstr "där flaggor kan vara:"
+
+#: sql_help.c:116 sql_help.c:2209
+msgid "allowconn"
+msgstr "tillåtansl"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210
+#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227
+msgid "connlimit"
+msgstr "anslutningstak"
+
+#: sql_help.c:118 sql_help.c:2211
+msgid "istemplate"
+msgstr "ärmall"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4187
+msgid "new_tablespace"
+msgstr "nytt_tabellutrymme"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2398 sql_help.c:2601
+#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675
+msgid "configuration_parameter"
+msgstr "konfigurationsparameter"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344
+#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467
+#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626
+#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915
+#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014
+#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676
+#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679
+msgid "value"
+msgstr "värde"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "målroll"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631
+#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889
+#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338
+#: sql_help.c:4357 sql_help.c:4369
+msgid "schema_name"
+msgstr "schemanamn"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "förkortad_grant_eller_revoke"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "där förkortad_grant_eller_revok är en av:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2437 sql_help.c:2438
+#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575
+#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667
+#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232
+#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933
+#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697
+msgid "role_name"
+msgstr "rollnamn"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352
+#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774
+#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924
+#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981
+#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088
+#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558
+#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608
+#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651
+#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806
+#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864
+#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921
+#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044
+#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102
+#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105
+msgid "expression"
+msgstr "uttryck"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "domain_villkor"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852
+#: sql_help.c:1854 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351
+#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993
+msgid "constraint_name"
+msgstr "villkorsnamn"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "nyy_villkorsnamn"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "ny_version"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "medlemsobjekt"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "där medlemsobjekt är:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856
+#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860
+#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869
+#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884
+#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894
+#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898
+#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902
+#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4451 sql_help.c:4456
+#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465
+#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477
+#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481
+#: sql_help.c:4482
+msgid "object_name"
+msgstr "objektnamn"
+
+#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454
+msgid "aggregate_name"
+msgstr "aggregatnamn"
+
+#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135
+#: sql_help.c:2137 sql_help.c:3357
+msgid "source_type"
+msgstr "källtyp"
+
+#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136
+#: sql_help.c:2138 sql_help.c:3358
+msgid "target_type"
+msgstr "måltyp"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133
+#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549
+#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577
+#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834
+#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072
+#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083
+msgid "function_name"
+msgstr "funktionsnamn"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542
+msgid "operator_name"
+msgstr "operatornamn"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871
+#: sql_help.c:2519 sql_help.c:3481
+msgid "left_type"
+msgstr "vänster_typ"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872
+#: sql_help.c:2520 sql_help.c:3482
+msgid "right_type"
+msgstr "höger_typ"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2539
+#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500
+msgid "index_method"
+msgstr "indexmetod"
+
+#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467
+msgid "procedure_name"
+msgstr "procedurnamn"
+
+#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473
+msgid "routine_name"
+msgstr "rutinnamn"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394
+#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662
+#: sql_help.c:3926 sql_help.c:4375
+msgid "type_name"
+msgstr "typnamn"
+
+#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599
+#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911
+#: sql_help.c:4360
+msgid "lang_name"
+msgstr "språknamn"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "och aggregatsignatur är:"
+
+#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275
+msgid "handler_function"
+msgstr "hanterarfunktion"
+
+#: sql_help.c:396 sql_help.c:2276
+msgid "validator_function"
+msgstr "valideringsfunktion"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "aktion"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851
+#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1983 sql_help.c:1984
+#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391
+#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629
+#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887
+#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919
+#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955
+#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978
+#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883
+#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997
+#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089
+#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614
+#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877
+#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924
+#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117
+msgid "column_name"
+msgstr "kolumnnamn"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "nytt_kolumnnamn"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "där aktion är en av:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2229
+#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888
+#: sql_help.c:3167 sql_help.c:4141
+msgid "data_type"
+msgstr "datatyp"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2230 sql_help.c:2329
+#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911
+#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990
+msgid "collation"
+msgstr "jämförelse"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339
+#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920
+msgid "column_constraint"
+msgstr "kolumnvillkor"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968
+msgid "integer"
+msgstr "heltal"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "attributalternativ"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340
+#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921
+msgid "table_constraint"
+msgstr "tabellvillkor"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905
+msgid "trigger_name"
+msgstr "triggernamn"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918
+msgid "parent_table"
+msgstr "föräldertabell"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2261
+msgid "extension_name"
+msgstr "utökningsnamn"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395
+msgid "execution_cost"
+msgstr "körkostnad"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396
+msgid "result_rows"
+msgstr "resultatrader"
+
+#: sql_help.c:547 sql_help.c:2397
+msgid "support_function"
+msgstr "supportfunktion"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2709
+#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881
+#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890
+#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 sql_help.c:3896
+#: sql_help.c:3897 sql_help.c:3899 sql_help.c:3900 sql_help.c:3902
+#: sql_help.c:3903 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918
+#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924
+#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930
+#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335
+#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342
+#: sql_help.c:4343 sql_help.c:4345 sql_help.c:4346 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4351 sql_help.c:4352 sql_help.c:4358
+#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364
+#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370
+#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376
+#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380
+msgid "role_specification"
+msgstr "rollspecifikation"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198
+#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707
+msgid "user_name"
+msgstr "användarnamn"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716
+#: sql_help.c:3932 sql_help.c:4381
+msgid "where role_specification can be:"
+msgstr "där rollspecifikation kan vara:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "gruppnamn"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468
+#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930
+#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923
+#: sql_help.c:4372
+msgid "tablespace_name"
+msgstr "tabellutrymmesnamn"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783
+msgid "index_name"
+msgstr "indexnamn"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2466 sql_help.c:2500
+#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969
+#: sql_help.c:2996
+msgid "storage_parameter"
+msgstr "lagringsparameter"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "kolumnnummer"
+
+#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464
+msgid "large_object_oid"
+msgstr "stort_objekt_oid"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889
+msgid "compression_method"
+msgstr "komprimeringsmetod"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "ny_accessmetod"
+
+#: sql_help.c:725 sql_help.c:2523
+msgid "res_proc"
+msgstr "res_proc"
+
+#: sql_help.c:726 sql_help.c:2524
+msgid "join_proc"
+msgstr "join_proc"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2541
+msgid "strategy_number"
+msgstr "strateginummer"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2543 sql_help.c:2544
+#: sql_help.c:2547 sql_help.c:2548
+msgid "op_type"
+msgstr "op_typ"
+
+#: sql_help.c:782 sql_help.c:2545
+msgid "sort_family_name"
+msgstr "sorteringsfamiljnamn"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2546
+msgid "support_number"
+msgstr "supportnummer"
+
+#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087
+#: sql_help.c:3089
+msgid "argument_type"
+msgstr "argumenttyp"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779
+#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891
+#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2324
+#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574
+#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770
+#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917
+#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517
+#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885
+#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334
+#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627
+#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884
+#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060
+#: sql_help.c:5122
+msgid "table_name"
+msgstr "tabellnamn"
+
+#: sql_help.c:823 sql_help.c:2576
+msgid "using_expression"
+msgstr "using-uttryck"
+
+#: sql_help.c:824 sql_help.c:2577
+msgid "check_expression"
+msgstr "check-uttryck"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624
+msgid "publication_object"
+msgstr "publiceringsobject"
+
+#: sql_help.c:903 sql_help.c:2625
+msgid "publication_parameter"
+msgstr "publiceringsparameter"
+
+#: sql_help.c:909 sql_help.c:2627
+msgid "where publication_object is one of:"
+msgstr "där publiceringsobjekt är en av:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662
+#: sql_help.c:3228
+msgid "password"
+msgstr "lösenord"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663
+#: sql_help.c:3229
+msgid "timestamp"
+msgstr "tidsstämpel"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3892
+#: sql_help.c:4341
+msgid "database_name"
+msgstr "databasnamn"
+
+#: sql_help.c:1073 sql_help.c:2732
+msgid "increment"
+msgstr "ökningsvärde"
+
+#: sql_help.c:1074 sql_help.c:2733
+msgid "minvalue"
+msgstr "minvärde"
+
+#: sql_help.c:1075 sql_help.c:2734
+msgid "maxvalue"
+msgstr "maxvärde"
+
+#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664
+#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056
+msgid "start"
+msgstr "start"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "starta om"
+
+#: sql_help.c:1078 sql_help.c:2736
+msgid "cache"
+msgstr "cache"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "nytt_mål"
+
+#: sql_help.c:1142 sql_help.c:2789
+msgid "conninfo"
+msgstr "anslinfo"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790
+msgid "publication_name"
+msgstr "publiceringsnamn"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "publicerings_alternativ"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "refresh_alternativ"
+
+#: sql_help.c:1161 sql_help.c:2791
+msgid "subscription_parameter"
+msgstr "prenumerationsparameter"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "skip_alternativ"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "partitionsnamn"
+
+#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922
+msgid "partition_bound_spec"
+msgstr "partitionsgränsspec"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936
+msgid "sequence_options"
+msgstr "sekvensalternativ"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "sekvensalternativ"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "tabellvillkor_för_index"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "omskrivningsregelnamn"
+
+#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961
+msgid "and partition_bound_spec is:"
+msgstr "och partitionsgränsspec är:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354
+#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963
+#: sql_help.c:2964
+msgid "partition_bound_expr"
+msgstr "partitionsgränsuttryck"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358
+#: sql_help.c:2965 sql_help.c:2966
+msgid "numeric_literal"
+msgstr "numerisk_literal"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "och kolumnvillkor är:"
+
+#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598
+#: sql_help.c:2934
+msgid "default_expr"
+msgstr "default_uttryck"
+
+#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935
+msgid "generation_expr"
+msgstr "generatoruttryck"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947
+#: sql_help.c:2949 sql_help.c:2953
+msgid "index_parameters"
+msgstr "indexparametrar"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956
+msgid "reftable"
+msgstr "reftabell"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957
+msgid "refcolumn"
+msgstr "refkolumn"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959
+msgid "referential_action"
+msgstr "referentiell_aktion"
+
+#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943
+msgid "and table_constraint is:"
+msgstr "och tabellvillkor är:"
+
+#: sql_help.c:1409 sql_help.c:2951
+msgid "exclude_element"
+msgstr "uteslutelement"
+
+#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662
+#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054
+msgid "operator"
+msgstr "operator"
+
+#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954
+msgid "predicate"
+msgstr "predikat"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "och tabellvillkor_för_index är:"
+
+#: sql_help.c:1421 sql_help.c:2967
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "indexparametrar i UNIQUE-, PRIMARY KEY- och EXCLUDE-villkor är:"
+
+#: sql_help.c:1426 sql_help.c:2972
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "uteslutelement i ett EXCLUDE-villkort är:"
+
+#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912
+#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991
+msgid "opclass"
+msgstr "op-klass"
+
+#: sql_help.c:1430 sql_help.c:2976
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "referentiell_aktion i ett FOREIGN KEY/REFERENCES-villkor är:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013
+msgid "tablespace_option"
+msgstr "tabellutrymmesalternativ"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "symboltyp"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "ordlistnamn"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "gammal_ordlista"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "ny_ordlista"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3166
+msgid "attribute_name"
+msgstr "attributnamn"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "nytt_attributnamn"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "nytt_enumvärde"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "närliggande_enumvärde"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "existerande_enumvärde"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "egenskap"
+
+#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748
+#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947
+#: sql_help.c:4350
+msgid "server_name"
+msgstr "servernamn"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261
+msgid "view_option_name"
+msgstr "visningsalternativnamn"
+
+#: sql_help.c:1698 sql_help.c:3262
+msgid "view_option_value"
+msgstr "visningsalternativvärde"
+
+#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958
+msgid "table_and_columns"
+msgstr "tabell_och_kolumner"
+
+#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745
+#: sql_help.c:4185 sql_help.c:4959
+msgid "where option can be one of:"
+msgstr "där flaggor kan vara en av:"
+
+#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977
+#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747
+#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188
+#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963
+#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967
+msgid "boolean"
+msgstr "boolean"
+
+#: sql_help.c:1724 sql_help.c:4969
+msgid "and table_and_columns is:"
+msgstr "och tabell_och_kolumner är:"
+
+#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749
+msgid "transaction_mode"
+msgstr "transaktionsläge"
+
+#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750
+msgid "where transaction_mode is one of:"
+msgstr "där transaktionsläge är en av:"
+
+#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582
+#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835
+#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064
+#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084
+msgid "argument"
+msgstr "argument"
+
+#: sql_help.c:1850
+msgid "relation_name"
+msgstr "relationsnamn"
+
+#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344
+msgid "domain_name"
+msgstr "domännamn"
+
+#: sql_help.c:1877
+msgid "policy_name"
+msgstr "policynamn"
+
+#: sql_help.c:1890
+msgid "rule_name"
+msgstr "regelnamn"
+
+#: sql_help.c:1909 sql_help.c:4483
+msgid "string_literal"
+msgstr "sträng_literal"
+
+#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397
+msgid "transaction_id"
+msgstr "transaktions-id"
+
+#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017
+msgid "filename"
+msgstr "filnamn"
+
+#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688
+#: sql_help.c:2689
+msgid "command"
+msgstr "kommando"
+
+#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297
+#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552
+#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809
+#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049
+msgid "condition"
+msgstr "villkor"
+
+#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263
+#: sql_help.c:3281 sql_help.c:3982
+msgid "query"
+msgstr "fråga"
+
+#: sql_help.c:1976
+msgid "format_name"
+msgstr "formatnamn"
+
+#: sql_help.c:1978
+msgid "delimiter_character"
+msgstr "avdelartecken"
+
+#: sql_help.c:1979
+msgid "null_string"
+msgstr "null-sträng"
+
+#: sql_help.c:1981
+msgid "quote_character"
+msgstr "citattecken"
+
+#: sql_help.c:1982
+msgid "escape_character"
+msgstr "escape-tecken"
+
+#: sql_help.c:1986
+msgid "encoding_name"
+msgstr "kodningsnamn"
+
+#: sql_help.c:1997
+msgid "access_method_type"
+msgstr "accessmetodtyp"
+
+#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090
+msgid "arg_data_type"
+msgstr "arg_datatyp"
+
+#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099
+msgid "sfunc"
+msgstr "sfunc"
+
+#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100
+msgid "state_data_type"
+msgstr "tillståndsdatatyp"
+
+#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101
+msgid "state_data_size"
+msgstr "tillståndsdatastorlek"
+
+#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102
+msgid "ffunc"
+msgstr "ffunc"
+
+#: sql_help.c:2073 sql_help.c:2103
+msgid "combinefunc"
+msgstr "kombinerafunk"
+
+#: sql_help.c:2074 sql_help.c:2104
+msgid "serialfunc"
+msgstr "serialiseringsfunk"
+
+#: sql_help.c:2075 sql_help.c:2105
+msgid "deserialfunc"
+msgstr "deserialiseringsfunk"
+
+#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106
+msgid "initial_condition"
+msgstr "startvärde"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "msfunc"
+msgstr "msfunk"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "minvfunc"
+msgstr "minvfunk"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "mstate_data_type"
+msgstr "mtillståndsdatatyp"
+
+#: sql_help.c:2080 sql_help.c:2110
+msgid "mstate_data_size"
+msgstr "ntillståndsstorlek"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "mffunc"
+msgstr "mffunk"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minitial_condition"
+msgstr "mstartvärde"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "sort_operator"
+msgstr "sorteringsoperator"
+
+#: sql_help.c:2096
+msgid "or the old syntax"
+msgstr "eller gamla syntaxen"
+
+#: sql_help.c:2098
+msgid "base_type"
+msgstr "bastyp"
+
+#: sql_help.c:2155 sql_help.c:2202
+msgid "locale"
+msgstr "lokal"
+
+#: sql_help.c:2156 sql_help.c:2203
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2157 sql_help.c:2204
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2158 sql_help.c:4450
+msgid "provider"
+msgstr "leverantör"
+
+#: sql_help.c:2160 sql_help.c:2263
+msgid "version"
+msgstr "version"
+
+#: sql_help.c:2162
+msgid "existing_collation"
+msgstr "existerande_jämförelse"
+
+#: sql_help.c:2172
+msgid "source_encoding"
+msgstr "källkodning"
+
+#: sql_help.c:2173
+msgid "dest_encoding"
+msgstr "målkodning"
+
+#: sql_help.c:2199 sql_help.c:3039
+msgid "template"
+msgstr "mall"
+
+#: sql_help.c:2200
+msgid "encoding"
+msgstr "kodning"
+
+#: sql_help.c:2201
+msgid "strategy"
+msgstr "strategi"
+
+#: sql_help.c:2205
+msgid "icu_locale"
+msgstr "icu_lokal"
+
+#: sql_help.c:2206
+msgid "locale_provider"
+msgstr "lokal_leverantör"
+
+#: sql_help.c:2207
+msgid "collation_version"
+msgstr "jämförelse_version"
+
+#: sql_help.c:2212
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2232
+msgid "constraint"
+msgstr "villkor"
+
+#: sql_help.c:2233
+msgid "where constraint is:"
+msgstr "där villkor är:"
+
+#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112
+msgid "event"
+msgstr "händelse"
+
+#: sql_help.c:2248
+msgid "filter_variable"
+msgstr "filtervariabel"
+
+#: sql_help.c:2249
+msgid "filter_value"
+msgstr "filtervärde"
+
+#: sql_help.c:2345 sql_help.c:2931
+msgid "where column_constraint is:"
+msgstr "där kolumnvillkor är:"
+
+#: sql_help.c:2390
+msgid "rettype"
+msgstr "rettyp"
+
+#: sql_help.c:2392
+msgid "column_type"
+msgstr "kolumntyp"
+
+#: sql_help.c:2401 sql_help.c:2604
+msgid "definition"
+msgstr "definition"
+
+#: sql_help.c:2402 sql_help.c:2605
+msgid "obj_file"
+msgstr "obj-fil"
+
+#: sql_help.c:2403 sql_help.c:2606
+msgid "link_symbol"
+msgstr "linksymbol"
+
+#: sql_help.c:2404 sql_help.c:2607
+msgid "sql_body"
+msgstr "sql-kropp"
+
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913
+#: sql_help.c:2927 sql_help.c:2995
+msgid "method"
+msgstr "metod"
+
+#: sql_help.c:2463
+msgid "opclass_parameter"
+msgstr "opclass_parameter"
+
+#: sql_help.c:2480
+msgid "call_handler"
+msgstr "anropshanterare"
+
+#: sql_help.c:2481
+msgid "inline_handler"
+msgstr "inline-hanterare"
+
+#: sql_help.c:2482
+msgid "valfunction"
+msgstr "val-funktion"
+
+#: sql_help.c:2521
+msgid "com_op"
+msgstr "com_op"
+
+#: sql_help.c:2522
+msgid "neg_op"
+msgstr "neg_op"
+
+#: sql_help.c:2540
+msgid "family_name"
+msgstr "familjenamn"
+
+#: sql_help.c:2551
+msgid "storage_type"
+msgstr "lagringstyp"
+
+#: sql_help.c:2690 sql_help.c:3119
+msgid "where event can be one of:"
+msgstr "där händelse kan vara en av:"
+
+#: sql_help.c:2710 sql_help.c:2712
+msgid "schema_element"
+msgstr "schema-element"
+
+#: sql_help.c:2749
+msgid "server_type"
+msgstr "servertyp"
+
+#: sql_help.c:2750
+msgid "server_version"
+msgstr "serverversion"
+
+#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347
+msgid "fdw_name"
+msgstr "fdw-namn"
+
+#: sql_help.c:2768 sql_help.c:2771
+msgid "statistics_name"
+msgstr "statistiknamn"
+
+#: sql_help.c:2772
+msgid "statistics_kind"
+msgstr "statistiksort"
+
+#: sql_help.c:2788
+msgid "subscription_name"
+msgstr "prenumerationsnamn"
+
+#: sql_help.c:2893
+msgid "source_table"
+msgstr "källtabell"
+
+#: sql_help.c:2894
+msgid "like_option"
+msgstr "like_alternativ"
+
+#: sql_help.c:2960
+msgid "and like_option is:"
+msgstr "och likealternativ är:"
+
+#: sql_help.c:3012
+msgid "directory"
+msgstr "katalog"
+
+#: sql_help.c:3026
+msgid "parser_name"
+msgstr "parsernamn"
+
+#: sql_help.c:3027
+msgid "source_config"
+msgstr "källkonfig"
+
+#: sql_help.c:3056
+msgid "start_function"
+msgstr "startfunktion"
+
+#: sql_help.c:3057
+msgid "gettoken_function"
+msgstr "gettoken_funktion"
+
+#: sql_help.c:3058
+msgid "end_function"
+msgstr "slutfunktion"
+
+#: sql_help.c:3059
+msgid "lextypes_function"
+msgstr "symboltypfunktion"
+
+#: sql_help.c:3060
+msgid "headline_function"
+msgstr "rubrikfunktion"
+
+#: sql_help.c:3072
+msgid "init_function"
+msgstr "init_funktion"
+
+#: sql_help.c:3073
+msgid "lexize_function"
+msgstr "symboluppdelningsfunktion"
+
+#: sql_help.c:3086
+msgid "from_sql_function_name"
+msgstr "från_sql_funktionsnamn"
+
+#: sql_help.c:3088
+msgid "to_sql_function_name"
+msgstr "till_sql_funktionsnamn"
+
+#: sql_help.c:3114
+msgid "referenced_table_name"
+msgstr "refererat_tabellnamn"
+
+#: sql_help.c:3115
+msgid "transition_relation_name"
+msgstr "övergångsrelationsnamn"
+
+#: sql_help.c:3118
+msgid "arguments"
+msgstr "argument"
+
+#: sql_help.c:3170
+msgid "label"
+msgstr "etikett"
+
+#: sql_help.c:3172
+msgid "subtype"
+msgstr "subtyp"
+
+#: sql_help.c:3173
+msgid "subtype_operator_class"
+msgstr "subtypoperatorklass"
+
+#: sql_help.c:3175
+msgid "canonical_function"
+msgstr "kanonisk_funktion"
+
+#: sql_help.c:3176
+msgid "subtype_diff_function"
+msgstr "subtyp_diff_funktion"
+
+#: sql_help.c:3177
+msgid "multirange_type_name"
+msgstr "multirange_typnamn"
+
+#: sql_help.c:3179
+msgid "input_function"
+msgstr "inmatningsfunktion"
+
+#: sql_help.c:3180
+msgid "output_function"
+msgstr "utmatningsfunktion"
+
+#: sql_help.c:3181
+msgid "receive_function"
+msgstr "mottagarfunktion"
+
+#: sql_help.c:3182
+msgid "send_function"
+msgstr "sändfunktion"
+
+#: sql_help.c:3183
+msgid "type_modifier_input_function"
+msgstr "typmodifiering_indatafunktion"
+
+#: sql_help.c:3184
+msgid "type_modifier_output_function"
+msgstr "typmodifiering_utdatafunktion"
+
+#: sql_help.c:3185
+msgid "analyze_function"
+msgstr "analysfunktion"
+
+#: sql_help.c:3186
+msgid "subscript_function"
+msgstr "arrayindexfunktion"
+
+#: sql_help.c:3187
+msgid "internallength"
+msgstr "internlängd"
+
+#: sql_help.c:3188
+msgid "alignment"
+msgstr "justering"
+
+#: sql_help.c:3189
+msgid "storage"
+msgstr "lagring"
+
+#: sql_help.c:3190
+msgid "like_type"
+msgstr "liketyp"
+
+#: sql_help.c:3191
+msgid "category"
+msgstr "kategori"
+
+#: sql_help.c:3192
+msgid "preferred"
+msgstr "föredragen"
+
+#: sql_help.c:3193
+msgid "default"
+msgstr "standard"
+
+#: sql_help.c:3194
+msgid "element"
+msgstr "element"
+
+#: sql_help.c:3195
+msgid "delimiter"
+msgstr "avskiljare"
+
+#: sql_help.c:3196
+msgid "collatable"
+msgstr "sorterbar"
+
+#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547
+#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042
+msgid "with_query"
+msgstr "with_fråga"
+
+#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572
+#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591
+#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836
+#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061
+#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078
+#: sql_help.c:5086
+msgid "alias"
+msgstr "alias"
+
+#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603
+#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852
+#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860
+#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090
+#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098
+msgid "from_item"
+msgstr "frånval"
+
+#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928
+msgid "cursor_name"
+msgstr "markörnamn"
+
+#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929
+msgid "output_expression"
+msgstr "utdatauttryck"
+
+#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652
+#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045
+msgid "output_name"
+msgstr "utdatanamn"
+
+#: sql_help.c:3316
+msgid "code"
+msgstr "kod"
+
+#: sql_help.c:3721
+msgid "parameter"
+msgstr "parameter"
+
+#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142
+msgid "statement"
+msgstr "sats"
+
+#: sql_help.c:3778 sql_help.c:4116
+msgid "direction"
+msgstr "riktning"
+
+#: sql_help.c:3780 sql_help.c:4118
+msgid "where direction can be one of:"
+msgstr "där riktning kan vara en av:"
+
+#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784
+#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121
+#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562
+#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819
+#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057
+msgid "count"
+msgstr "antal"
+
+#: sql_help.c:3888 sql_help.c:4337
+msgid "sequence_name"
+msgstr "sekvensnamn"
+
+#: sql_help.c:3906 sql_help.c:4355
+msgid "arg_name"
+msgstr "arg_namn"
+
+#: sql_help.c:3907 sql_help.c:4356
+msgid "arg_type"
+msgstr "arg_typ"
+
+#: sql_help.c:3914 sql_help.c:4363
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3945
+msgid "remote_schema"
+msgstr "externt_schema"
+
+#: sql_help.c:3948
+msgid "local_schema"
+msgstr "lokalt_schema"
+
+#: sql_help.c:3983
+msgid "conflict_target"
+msgstr "konfliktmål"
+
+#: sql_help.c:3984
+msgid "conflict_action"
+msgstr "konfliktaktion"
+
+#: sql_help.c:3987
+msgid "where conflict_target can be one of:"
+msgstr "där konfliktmål kan vara en av:"
+
+#: sql_help.c:3988
+msgid "index_column_name"
+msgstr "indexkolumnnamn"
+
+#: sql_help.c:3989
+msgid "index_expression"
+msgstr "indexuttryck"
+
+#: sql_help.c:3992
+msgid "index_predicate"
+msgstr "indexpredikat"
+
+#: sql_help.c:3994
+msgid "and conflict_action is one of:"
+msgstr "och konfliktaktion är en av:"
+
+#: sql_help.c:4000 sql_help.c:4925
+msgid "sub-SELECT"
+msgstr "sub-SELECT"
+
+#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901
+msgid "channel"
+msgstr "kanal"
+
+#: sql_help.c:4031
+msgid "lockmode"
+msgstr "låsläge"
+
+#: sql_help.c:4032
+msgid "where lockmode is one of:"
+msgstr "där låsläge är en av:"
+
+#: sql_help.c:4068
+msgid "target_table_name"
+msgstr "måltabellnamn"
+
+#: sql_help.c:4069
+msgid "target_alias"
+msgstr "målalias"
+
+#: sql_help.c:4070
+msgid "data_source"
+msgstr "datakälla"
+
+#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091
+msgid "join_condition"
+msgstr "join-villkor"
+
+#: sql_help.c:4072
+msgid "when_clause"
+msgstr "when_sats"
+
+#: sql_help.c:4073
+msgid "where data_source is:"
+msgstr "där datakälla är:"
+
+#: sql_help.c:4074
+msgid "source_table_name"
+msgstr "källtabellnamn"
+
+#: sql_help.c:4075
+msgid "source_query"
+msgstr "källfråga"
+
+#: sql_help.c:4076
+msgid "source_alias"
+msgstr "källalias"
+
+#: sql_help.c:4077
+msgid "and when_clause is:"
+msgstr "och when_sats är:"
+
+#: sql_help.c:4079
+msgid "merge_update"
+msgstr "merge_update"
+
+#: sql_help.c:4080
+msgid "merge_delete"
+msgstr "merge_delete"
+
+#: sql_help.c:4082
+msgid "merge_insert"
+msgstr "merge_insert"
+
+#: sql_help.c:4083
+msgid "and merge_insert is:"
+msgstr "och merge_insert är:"
+
+#: sql_help.c:4086
+msgid "and merge_update is:"
+msgstr "och merge_update är:"
+
+#: sql_help.c:4091
+msgid "and merge_delete is:"
+msgstr "och merge_delete är:"
+
+#: sql_help.c:4132
+msgid "payload"
+msgstr "innehåll"
+
+#: sql_help.c:4159
+msgid "old_role"
+msgstr "gammal_roll"
+
+#: sql_help.c:4160
+msgid "new_role"
+msgstr "ny_roll"
+
+#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413
+msgid "savepoint_name"
+msgstr "sparpunktnamn"
+
+#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868
+#: sql_help.c:5048 sql_help.c:5106
+msgid "grouping_element"
+msgstr "gruperingselement"
+
+#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050
+msgid "window_name"
+msgstr "fönsternamn"
+
+#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051
+msgid "window_definition"
+msgstr "fönsterdefinition"
+
+#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660
+#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052
+#: sql_help.c:5066 sql_help.c:5110
+msgid "select"
+msgstr "select"
+
+#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059
+msgid "where from_item can be one of:"
+msgstr "där frånval kan vara en av:"
+
+#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580
+#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833
+#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068
+#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087
+msgid "column_alias"
+msgstr "kolumnalias"
+
+#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063
+msgid "sampling_method"
+msgstr "samplingsmetod"
+
+#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065
+msgid "seed"
+msgstr "frö"
+
+#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870
+#: sql_help.c:5069 sql_help.c:5108
+msgid "with_query_name"
+msgstr "with_frågenamn"
+
+#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841
+#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082
+#: sql_help.c:5085
+msgid "column_definition"
+msgstr "kolumndefinition"
+
+#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857
+#: sql_help.c:5089 sql_help.c:5095
+msgid "join_type"
+msgstr "join-typ"
+
+#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092
+msgid "join_column"
+msgstr "join-kolumn"
+
+#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093
+msgid "join_using_alias"
+msgstr "join_using_alias"
+
+#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099
+msgid "and grouping_element can be one of:"
+msgstr "och grupperingselement kan vara en av:"
+
+#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107
+msgid "and with_query is:"
+msgstr "och with_fråga är:"
+
+#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111
+msgid "values"
+msgstr "värden"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116
+msgid "search_seq_col_name"
+msgstr "söksekvens_kolumnnamn"
+
+#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118
+msgid "cycle_mark_col_name"
+msgstr "cykelmarkering_kolumnnamn"
+
+#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119
+msgid "cycle_mark_value"
+msgstr "cykelmarkering_värde"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120
+msgid "cycle_mark_default"
+msgstr "cykelmarkering_standard"
+
+#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121
+msgid "cycle_path_col_name"
+msgstr "cykelväg_kolumnnamn"
+
+#: sql_help.c:4653
+msgid "new_table"
+msgstr "ny_tabell"
+
+#: sql_help.c:4724
+msgid "snapshot_id"
+msgstr "snapshot_id"
+
+#: sql_help.c:4984
+msgid "sort_expression"
+msgstr "sorteringsuttryck"
+
+#: sql_help.c:5128 sql_help.c:6112
+msgid "abort the current transaction"
+msgstr "avbryt aktuell transaktion"
+
+#: sql_help.c:5134
+msgid "change the definition of an aggregate function"
+msgstr "ändra definitionen av en aggregatfunktion"
+
+#: sql_help.c:5140
+msgid "change the definition of a collation"
+msgstr "ändra definitionen av en jämförelse"
+
+#: sql_help.c:5146
+msgid "change the definition of a conversion"
+msgstr "ändra definitionen av en konvertering"
+
+#: sql_help.c:5152
+msgid "change a database"
+msgstr "ändra en databas"
+
+#: sql_help.c:5158
+msgid "define default access privileges"
+msgstr "definiera standardaccessrättigheter"
+
+#: sql_help.c:5164
+msgid "change the definition of a domain"
+msgstr "ändra definitionen av en domän"
+
+#: sql_help.c:5170
+msgid "change the definition of an event trigger"
+msgstr "ändra definitionen av en händelsetrigger"
+
+#: sql_help.c:5176
+msgid "change the definition of an extension"
+msgstr "ändra definitionen av en utökning"
+
+#: sql_help.c:5182
+msgid "change the definition of a foreign-data wrapper"
+msgstr "ändra definitionen av en främmande data-omvandlare"
+
+#: sql_help.c:5188
+msgid "change the definition of a foreign table"
+msgstr "ändra definitionen av en främmande tabell"
+
+#: sql_help.c:5194
+msgid "change the definition of a function"
+msgstr "ändra definitionen av en funktion"
+
+#: sql_help.c:5200
+msgid "change role name or membership"
+msgstr "ändra rollnamn eller medlemskap"
+
+#: sql_help.c:5206
+msgid "change the definition of an index"
+msgstr "ändra definitionen av ett index"
+
+#: sql_help.c:5212
+msgid "change the definition of a procedural language"
+msgstr "ändra definitionen av ett procedur-språk"
+
+#: sql_help.c:5218
+msgid "change the definition of a large object"
+msgstr "ändra definitionen av ett stort objekt"
+
+#: sql_help.c:5224
+msgid "change the definition of a materialized view"
+msgstr "ändra definitionen av en materialiserad vy"
+
+#: sql_help.c:5230
+msgid "change the definition of an operator"
+msgstr "ändra definitionen av en operator"
+
+#: sql_help.c:5236
+msgid "change the definition of an operator class"
+msgstr "ändra definitionen av en operatorklass"
+
+#: sql_help.c:5242
+msgid "change the definition of an operator family"
+msgstr "ändra definitionen av en operatorfamilj"
+
+#: sql_help.c:5248
+msgid "change the definition of a row-level security policy"
+msgstr "ändra definitionen av en säkerhetspolicy på radnivå"
+
+#: sql_help.c:5254
+msgid "change the definition of a procedure"
+msgstr "ändra definitionen av en procedur"
+
+#: sql_help.c:5260
+msgid "change the definition of a publication"
+msgstr "ändra definitionen av en publicering"
+
+#: sql_help.c:5266 sql_help.c:5368
+msgid "change a database role"
+msgstr "ändra databasroll"
+
+#: sql_help.c:5272
+msgid "change the definition of a routine"
+msgstr "ändra definitionen av en rutin"
+
+#: sql_help.c:5278
+msgid "change the definition of a rule"
+msgstr "ändra definitionen av en regel"
+
+#: sql_help.c:5284
+msgid "change the definition of a schema"
+msgstr "ändra definitionen av ett schema"
+
+#: sql_help.c:5290
+msgid "change the definition of a sequence generator"
+msgstr "ändra definitionen av en sekvensgenerator"
+
+#: sql_help.c:5296
+msgid "change the definition of a foreign server"
+msgstr "ändra definitionen av en främmande server"
+
+#: sql_help.c:5302
+msgid "change the definition of an extended statistics object"
+msgstr "ändra definitionen av ett utökat statistikobjekt"
+
+#: sql_help.c:5308
+msgid "change the definition of a subscription"
+msgstr "ändra definitionen av en prenumerering"
+
+#: sql_help.c:5314
+msgid "change a server configuration parameter"
+msgstr "ändra en servers konfigurationsparameter"
+
+#: sql_help.c:5320
+msgid "change the definition of a table"
+msgstr "ändra definitionen av en tabell"
+
+#: sql_help.c:5326
+msgid "change the definition of a tablespace"
+msgstr "ändra definitionen av ett tabellutrymme"
+
+#: sql_help.c:5332
+msgid "change the definition of a text search configuration"
+msgstr "ändra definitionen av en textsökkonfiguration"
+
+#: sql_help.c:5338
+msgid "change the definition of a text search dictionary"
+msgstr "ändra definitionen av en textsökordlista"
+
+#: sql_help.c:5344
+msgid "change the definition of a text search parser"
+msgstr "ändra definitionen av en textsökparser"
+
+#: sql_help.c:5350
+msgid "change the definition of a text search template"
+msgstr "ändra definitionen av en textsökmall"
+
+#: sql_help.c:5356
+msgid "change the definition of a trigger"
+msgstr "ändra definitionen av en trigger"
+
+#: sql_help.c:5362
+msgid "change the definition of a type"
+msgstr "ändra definitionen av en typ"
+
+#: sql_help.c:5374
+msgid "change the definition of a user mapping"
+msgstr "ändra definitionen av en användarmappning"
+
+#: sql_help.c:5380
+msgid "change the definition of a view"
+msgstr "ändra definitionen av en vy"
+
+#: sql_help.c:5386
+msgid "collect statistics about a database"
+msgstr "samla in statistik om en databas"
+
+#: sql_help.c:5392 sql_help.c:6190
+msgid "start a transaction block"
+msgstr "starta ett transaktionsblock"
+
+#: sql_help.c:5398
+msgid "invoke a procedure"
+msgstr "anropa en procedur"
+
+#: sql_help.c:5404
+msgid "force a write-ahead log checkpoint"
+msgstr "tvinga checkpoint i transaktionsloggen"
+
+#: sql_help.c:5410
+msgid "close a cursor"
+msgstr "stäng en markör"
+
+#: sql_help.c:5416
+msgid "cluster a table according to an index"
+msgstr "klustra en tabell efter ett index"
+
+#: sql_help.c:5422
+msgid "define or change the comment of an object"
+msgstr "definiera eller ändra en kommentar på ett objekt"
+
+#: sql_help.c:5428 sql_help.c:5986
+msgid "commit the current transaction"
+msgstr "utför den aktuella transaktionen"
+
+#: sql_help.c:5434
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "utför commit på en transaktion som tidigare förberetts för två-fas-commit"
+
+#: sql_help.c:5440
+msgid "copy data between a file and a table"
+msgstr "kopiera data mellan en fil och en tabell"
+
+#: sql_help.c:5446
+msgid "define a new access method"
+msgstr "definiera en ny accessmetod"
+
+#: sql_help.c:5452
+msgid "define a new aggregate function"
+msgstr "definiera en ny aggregatfunktion"
+
+#: sql_help.c:5458
+msgid "define a new cast"
+msgstr "definiera en ny typomvandling"
+
+#: sql_help.c:5464
+msgid "define a new collation"
+msgstr "definiera en ny jämförelse"
+
+#: sql_help.c:5470
+msgid "define a new encoding conversion"
+msgstr "definiera en ny teckenkodningskonvertering"
+
+#: sql_help.c:5476
+msgid "create a new database"
+msgstr "skapa en ny databas"
+
+#: sql_help.c:5482
+msgid "define a new domain"
+msgstr "definiera en ny domän"
+
+#: sql_help.c:5488
+msgid "define a new event trigger"
+msgstr "definiera en ny händelsetrigger"
+
+#: sql_help.c:5494
+msgid "install an extension"
+msgstr "installera en utökning"
+
+#: sql_help.c:5500
+msgid "define a new foreign-data wrapper"
+msgstr "definiera en ny främmande data-omvandlare"
+
+#: sql_help.c:5506
+msgid "define a new foreign table"
+msgstr "definiera en ny främmande tabell"
+
+#: sql_help.c:5512
+msgid "define a new function"
+msgstr "definiera en ny funktion"
+
+#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680
+msgid "define a new database role"
+msgstr "definiera en ny databasroll"
+
+#: sql_help.c:5524
+msgid "define a new index"
+msgstr "skapa ett nytt index"
+
+#: sql_help.c:5530
+msgid "define a new procedural language"
+msgstr "definiera ett nytt procedur-språk"
+
+#: sql_help.c:5536
+msgid "define a new materialized view"
+msgstr "definiera en ny materialiserad vy"
+
+#: sql_help.c:5542
+msgid "define a new operator"
+msgstr "definiera en ny operator"
+
+#: sql_help.c:5548
+msgid "define a new operator class"
+msgstr "definiera en ny operatorklass"
+
+#: sql_help.c:5554
+msgid "define a new operator family"
+msgstr "definiera en ny operatorfamilj"
+
+#: sql_help.c:5560
+msgid "define a new row-level security policy for a table"
+msgstr "definiera en ny säkerhetspolicy på radnivå för en tabell"
+
+#: sql_help.c:5566
+msgid "define a new procedure"
+msgstr "definiera ett ny procedur"
+
+#: sql_help.c:5572
+msgid "define a new publication"
+msgstr "definiera en ny publicering"
+
+#: sql_help.c:5584
+msgid "define a new rewrite rule"
+msgstr "definiera en ny omskrivningsregel"
+
+#: sql_help.c:5590
+msgid "define a new schema"
+msgstr "definiera ett nytt schema"
+
+#: sql_help.c:5596
+msgid "define a new sequence generator"
+msgstr "definiera en ny sekvensgenerator"
+
+#: sql_help.c:5602
+msgid "define a new foreign server"
+msgstr "definiera en ny främmande server"
+
+#: sql_help.c:5608
+msgid "define extended statistics"
+msgstr "definiera utökad statistik"
+
+#: sql_help.c:5614
+msgid "define a new subscription"
+msgstr "definiera en ny prenumeration"
+
+#: sql_help.c:5620
+msgid "define a new table"
+msgstr "definiera en ny tabell"
+
+#: sql_help.c:5626 sql_help.c:6148
+msgid "define a new table from the results of a query"
+msgstr "definiera en ny tabell utifrån resultatet av en fråga"
+
+#: sql_help.c:5632
+msgid "define a new tablespace"
+msgstr "definiera ett nytt tabellutrymme"
+
+#: sql_help.c:5638
+msgid "define a new text search configuration"
+msgstr "definiera en ny textsökkonfiguration"
+
+#: sql_help.c:5644
+msgid "define a new text search dictionary"
+msgstr "definiera en ny textsökordlista"
+
+#: sql_help.c:5650
+msgid "define a new text search parser"
+msgstr "definiera en ny textsökparser"
+
+#: sql_help.c:5656
+msgid "define a new text search template"
+msgstr "definiera en ny textsökmall"
+
+#: sql_help.c:5662
+msgid "define a new transform"
+msgstr "definiera en ny transform"
+
+#: sql_help.c:5668
+msgid "define a new trigger"
+msgstr "definiera en ny trigger"
+
+#: sql_help.c:5674
+msgid "define a new data type"
+msgstr "definiera en ny datatyp"
+
+#: sql_help.c:5686
+msgid "define a new mapping of a user to a foreign server"
+msgstr "definiera en ny mappning av en användare till en främmande server"
+
+#: sql_help.c:5692
+msgid "define a new view"
+msgstr "definiera en ny vy"
+
+#: sql_help.c:5698
+msgid "deallocate a prepared statement"
+msgstr "deallokera en förberedd sats"
+
+#: sql_help.c:5704
+msgid "define a cursor"
+msgstr "definiera en markör"
+
+#: sql_help.c:5710
+msgid "delete rows of a table"
+msgstr "radera rader i en tabell"
+
+#: sql_help.c:5716
+msgid "discard session state"
+msgstr "släng sessionstillstånd"
+
+#: sql_help.c:5722
+msgid "execute an anonymous code block"
+msgstr "kör ett annonymt kodblock"
+
+#: sql_help.c:5728
+msgid "remove an access method"
+msgstr "ta bort en accessmetod"
+
+#: sql_help.c:5734
+msgid "remove an aggregate function"
+msgstr "ta bort en aggregatfunktioner"
+
+#: sql_help.c:5740
+msgid "remove a cast"
+msgstr "ta bort en typomvandling"
+
+#: sql_help.c:5746
+msgid "remove a collation"
+msgstr "ta bort en jämförelse"
+
+#: sql_help.c:5752
+msgid "remove a conversion"
+msgstr "ta bort en konvertering"
+
+#: sql_help.c:5758
+msgid "remove a database"
+msgstr "ta bort en databas"
+
+#: sql_help.c:5764
+msgid "remove a domain"
+msgstr "ta bort en domän"
+
+#: sql_help.c:5770
+msgid "remove an event trigger"
+msgstr "ta bort en händelsetrigger"
+
+#: sql_help.c:5776
+msgid "remove an extension"
+msgstr "ta bort en utökning"
+
+#: sql_help.c:5782
+msgid "remove a foreign-data wrapper"
+msgstr "ta bort en frammande data-omvandlare"
+
+#: sql_help.c:5788
+msgid "remove a foreign table"
+msgstr "ta bort en främmande tabell"
+
+#: sql_help.c:5794
+msgid "remove a function"
+msgstr "ta bort en funktion"
+
+#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968
+msgid "remove a database role"
+msgstr "ta bort en databasroll"
+
+#: sql_help.c:5806
+msgid "remove an index"
+msgstr "ta bort ett index"
+
+#: sql_help.c:5812
+msgid "remove a procedural language"
+msgstr "ta bort ett procedur-språk"
+
+#: sql_help.c:5818
+msgid "remove a materialized view"
+msgstr "ta bort en materialiserad vy"
+
+#: sql_help.c:5824
+msgid "remove an operator"
+msgstr "ta bort en operator"
+
+#: sql_help.c:5830
+msgid "remove an operator class"
+msgstr "ta bort en operatorklass"
+
+#: sql_help.c:5836
+msgid "remove an operator family"
+msgstr "ta bort en operatorfamilj"
+
+#: sql_help.c:5842
+msgid "remove database objects owned by a database role"
+msgstr "ta bort databasobjekt som ägs av databasroll"
+
+#: sql_help.c:5848
+msgid "remove a row-level security policy from a table"
+msgstr "ta bort en säkerhetspolicy på radnivå från en tabell"
+
+#: sql_help.c:5854
+msgid "remove a procedure"
+msgstr "ta bort en procedur"
+
+#: sql_help.c:5860
+msgid "remove a publication"
+msgstr "ta bort en publicering"
+
+#: sql_help.c:5872
+msgid "remove a routine"
+msgstr "ta bort en rutin"
+
+#: sql_help.c:5878
+msgid "remove a rewrite rule"
+msgstr "ta bort en omskrivningsregel"
+
+#: sql_help.c:5884
+msgid "remove a schema"
+msgstr "ta bort ett schema"
+
+#: sql_help.c:5890
+msgid "remove a sequence"
+msgstr "ta bort en sekvens"
+
+#: sql_help.c:5896
+msgid "remove a foreign server descriptor"
+msgstr "ta bort en främmande server-deskriptor"
+
+#: sql_help.c:5902
+msgid "remove extended statistics"
+msgstr "ta bort utökad statistik"
+
+#: sql_help.c:5908
+msgid "remove a subscription"
+msgstr "ta bort en prenumeration"
+
+#: sql_help.c:5914
+msgid "remove a table"
+msgstr "ta bort en tabell"
+
+#: sql_help.c:5920
+msgid "remove a tablespace"
+msgstr "ta bort ett tabellutrymme"
+
+#: sql_help.c:5926
+msgid "remove a text search configuration"
+msgstr "ta bort en textsökkonfiguration"
+
+#: sql_help.c:5932
+msgid "remove a text search dictionary"
+msgstr "ta bort en textsökordlista"
+
+#: sql_help.c:5938
+msgid "remove a text search parser"
+msgstr "ta bort en textsökparser"
+
+#: sql_help.c:5944
+msgid "remove a text search template"
+msgstr "ta bort en textsökmall"
+
+#: sql_help.c:5950
+msgid "remove a transform"
+msgstr "ta bort en transform"
+
+#: sql_help.c:5956
+msgid "remove a trigger"
+msgstr "ta bort en trigger"
+
+#: sql_help.c:5962
+msgid "remove a data type"
+msgstr "ta bort en datatyp"
+
+#: sql_help.c:5974
+msgid "remove a user mapping for a foreign server"
+msgstr "ta bort en användarmappning för en främmande server"
+
+#: sql_help.c:5980
+msgid "remove a view"
+msgstr "ta bort en vy"
+
+#: sql_help.c:5992
+msgid "execute a prepared statement"
+msgstr "utför en förberedd sats"
+
+#: sql_help.c:5998
+msgid "show the execution plan of a statement"
+msgstr "visa körningsplanen för en sats"
+
+#: sql_help.c:6004
+msgid "retrieve rows from a query using a cursor"
+msgstr "hämta rader från en fråga med hjälp av en markör"
+
+#: sql_help.c:6010
+msgid "define access privileges"
+msgstr "definera åtkomsträttigheter"
+
+#: sql_help.c:6016
+msgid "import table definitions from a foreign server"
+msgstr "importera tabelldefinitioner från en främmande server"
+
+#: sql_help.c:6022
+msgid "create new rows in a table"
+msgstr "skapa nya rader i en tabell"
+
+#: sql_help.c:6028
+msgid "listen for a notification"
+msgstr "lyssna efter notifiering"
+
+#: sql_help.c:6034
+msgid "load a shared library file"
+msgstr "ladda en delad biblioteksfil (shared library)"
+
+#: sql_help.c:6040
+msgid "lock a table"
+msgstr "lås en tabell"
+
+#: sql_help.c:6046
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "villkorlig insert, updare eller delete av rader i en tabell"
+
+#: sql_help.c:6052
+msgid "position a cursor"
+msgstr "flytta en markör"
+
+#: sql_help.c:6058
+msgid "generate a notification"
+msgstr "generera en notifiering"
+
+#: sql_help.c:6064
+msgid "prepare a statement for execution"
+msgstr "förbered en sats för körning"
+
+#: sql_help.c:6070
+msgid "prepare the current transaction for two-phase commit"
+msgstr "avbryt aktuell transaktion för två-fas-commit"
+
+#: sql_help.c:6076
+msgid "change the ownership of database objects owned by a database role"
+msgstr "byt ägare på databasobjekt som ägs av en databasroll"
+
+#: sql_help.c:6082
+msgid "replace the contents of a materialized view"
+msgstr "ersätt innehållet av en materialiserad vy"
+
+#: sql_help.c:6088
+msgid "rebuild indexes"
+msgstr "återskapa index"
+
+#: sql_help.c:6094
+msgid "destroy a previously defined savepoint"
+msgstr "ta bort en tidigare definierad sparpunkt"
+
+#: sql_help.c:6100
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "återställ värde av körningsparameter till standardvärdet"
+
+#: sql_help.c:6106
+msgid "remove access privileges"
+msgstr "ta bort åtkomsträttigheter"
+
+#: sql_help.c:6118
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "avbryt en transaktion som tidigare förberetts för två-fas-commit"
+
+#: sql_help.c:6124
+msgid "roll back to a savepoint"
+msgstr "rulla tillbaka till sparpunkt"
+
+#: sql_help.c:6130
+msgid "define a new savepoint within the current transaction"
+msgstr "definera en ny sparpunkt i den aktuella transaktionen"
+
+#: sql_help.c:6136
+msgid "define or change a security label applied to an object"
+msgstr "definiera eller ändra en säkerhetsetikett på ett objekt"
+
+#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232
+msgid "retrieve rows from a table or view"
+msgstr "hämta rader från en tabell eller vy"
+
+#: sql_help.c:6154
+msgid "change a run-time parameter"
+msgstr "ändra en körningsparameter"
+
+#: sql_help.c:6160
+msgid "set constraint check timing for the current transaction"
+msgstr "sätt integritetsvillkorstiming för nuvarande transaktion"
+
+#: sql_help.c:6166
+msgid "set the current user identifier of the current session"
+msgstr "sätt användare för den aktiva sessionen"
+
+#: sql_help.c:6172
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "sätt sessionsanvändaridentifierare och nuvarande användaridentifierare för den aktiva sessionen"
+
+#: sql_help.c:6178
+msgid "set the characteristics of the current transaction"
+msgstr "sätt inställningar för nuvarande transaktionen"
+
+#: sql_help.c:6184
+msgid "show the value of a run-time parameter"
+msgstr "visa värde på en körningsparameter"
+
+#: sql_help.c:6202
+msgid "empty a table or set of tables"
+msgstr "töm en eller flera tabeller"
+
+#: sql_help.c:6208
+msgid "stop listening for a notification"
+msgstr "sluta att lyssna efter notifiering"
+
+#: sql_help.c:6214
+msgid "update rows of a table"
+msgstr "uppdatera rader i en tabell"
+
+#: sql_help.c:6220
+msgid "garbage-collect and optionally analyze a database"
+msgstr "skräpsamla och eventuellt analysera en databas"
+
+#: sql_help.c:6226
+msgid "compute a set of rows"
+msgstr "beräkna en mängd rader"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 kan bara användas i icke-interaktivt läge"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "kunde inte öppna loggfil \"%s\": %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Skriv \"help\" för hjälp.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "kunde inte sätta utskriftsparameter \"%s\""
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "extra kommandoradsargument \"%s\" ignorerad"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "kunde inte hitta det egna programmets körbara fil"
+
+#: tab-complete.c:5955
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"tab-kompletteringsfråga misslyckades: %s\n"
+"Frågan var:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "okänt värde \"%s\" för \"%s\": förväntade sig en Boolean"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "ogiltigt värde \"%s\" för \"%s\": förväntade sig ett heltal"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "ogiltigt variabelnamn: \"%s\""
+
+#: variables.c:419
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"okänt värde \"%s\" för \"%s\"\n"
+"Tillgängliga värden är: %s."
+
+#, c-format
+#~ msgid ""
+#~ " \\lo_export LOBOID FILE\n"
+#~ " \\lo_import FILE [COMMENT]\n"
+#~ " \\lo_list[+]\n"
+#~ " \\lo_unlink LOBOID large object operations\n"
+#~ msgstr ""
+#~ " \\lo_export LOBOID FIL\n"
+#~ " \\lo_import FIL [KOMMENTAR]\n"
+#~ " \\lo_list[+]\n"
+#~ " \\lo_unlink LOBOID operationer på stora objekt\n"
+
+#, c-format
+#~ msgid "\\watch cannot be used with COPY"
+#~ msgstr "\\watch kan inte användas med COPY"
+
+#~ msgid "match"
+#~ msgstr "match"
+
+#~ msgid "text"
+#~ msgstr "text"
+
+#~ msgid "timezone"
+#~ msgstr "tidszon"
+
+#~ msgid "where direction can be empty or one of:"
+#~ msgstr "där riktning kan vara tom eller en av:"
diff --git a/src/bin/psql/po/uk.po b/src/bin/psql/po/uk.po
new file mode 100644
index 0000000..93cc6e8
--- /dev/null
+++ b/src/bin/psql/po/uk.po
@@ -0,0 +1,6427 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-18 19:16+0000\n"
+"PO-Revision-Date: 2023-04-20 14:13+0200\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/psql.pot\n"
+"X-Crowdin-File-ID: 900\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередження: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "не вдалося визначити поточний каталог: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "невірний бінарний файл \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "неможливо прочитати бінарний файл \"%s\""
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "неможливо знайти \"%s\" для виконання"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "не вдалося змінити каталог на \"%s\": %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "не можливо прочитати символічне послання \"%s\": %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() помилка: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "недостатньо пам'яті"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "недостатньо пам'яті\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "неможливо дублювати нульовий покажчик (внутрішня помилка)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "не можу знайти користувача з ефективним ID %ld: %s"
+
+#: ../../common/username.c:45 command.c:575
+msgid "user does not exist"
+msgstr "користувача не існує"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "невдала підстановка імені користувача: код помилки %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "неможливо виконати команду"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "команду не знайдено"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "дочірній процес завершився з кодом виходу %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "дочірній процес перервано через помилку 0х%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "дочірній процес перервано через сигнал %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "дочірній процес завершився з невизнаним статусом %d"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Запит на скасування відправлений\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Не вдалося надіслати запит на скасування: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu рядок)"
+msgstr[1] "(%lu рядки)"
+msgstr[2] "(%lu рядків)"
+msgstr[3] "(%lu рядка)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Перервано\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Неможливо додати заголовок до вмісту таблиці: кількість колонок %d перевищено.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Неможливо додати комірку до вмісту таблиці: перевищено загальну кількість комірок %d.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "невірний формат виводу (внутрішня помилка): %d"
+
+#: ../../fe_utils/psqlscan.l:702
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "пропуск рекурсивного розгортання змінної \"%s\""
+
+#: ../../port/thread.c:100 ../../port/thread.c:136
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "не вдалося знайти локального користувача з ідентифікатором %d: %s"
+
+#: ../../port/thread.c:105 ../../port/thread.c:141
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "локального користувача з ідентифікатором %d не існує"
+
+#: command.c:232
+#, c-format
+msgid "invalid command \\%s"
+msgstr "Невірна команда \\%s"
+
+#: command.c:234
+#, c-format
+msgid "Try \\? for help."
+msgstr "Спробуйте \\? для отримання довідки."
+
+#: command.c:252
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: зайвий аргумент \"%s\" проігноровано"
+
+#: command.c:304
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "\\%s команду проігноровано; скористайтесь \\endif або Ctrl-C, щоб вийти з поточного блоку \\if"
+
+#: command.c:573
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "неможливо отримати домашню директорію для користувача ID %ld: %s"
+
+#: command.c:592
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: неможливо змінити директорію на \"%s\": %m"
+
+#: command.c:617
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "На даний момент ви від'єднанні від бази даних.\n"
+
+#: command.c:627
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Ви під'єднані до бази даних \"%s\" як користувач \"%s\" за аресою \"%s\" на порту \"%s\".\n"
+
+#: command.c:630
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Ви під'єднані до бази даних \"%s\" як користувач \"%s\" через сокет в \"%s\" на порту \"%s\".\n"
+
+#: command.c:636
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Ви під'єднані до бази даних \"%s\" як користувач \"%s\" на хості \"%s\" (за аресою \"%s\") на порту \"%s\".\n"
+
+#: command.c:639
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Ви під'єднані до бази даних \"%s\" як користувач \"%s\" на хості \"%s\" на порту \"%s\".\n"
+
+#: command.c:1030 command.c:1125 command.c:2654
+#, c-format
+msgid "no query buffer"
+msgstr "немає буферу запитів"
+
+#: command.c:1063 command.c:5491
+#, c-format
+msgid "invalid line number: %s"
+msgstr "невірний номер рядка: %s"
+
+#: command.c:1203
+msgid "No changes"
+msgstr "Без змін"
+
+#: command.c:1282
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: невірне ім'я кодування або не знайдено процедуру конверсії"
+
+#: command.c:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597
+#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100
+#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443
+#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1324
+msgid "There is no previous error."
+msgstr "Попередня помилка відсутня."
+
+#: command.c:1437
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: відсутня права дужка"
+
+#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989
+#: command.c:2173 command.c:2415 command.c:2621 command.c:2661
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: не вистачає обов'язкового аргументу"
+
+#: command.c:1782
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: не може йти після \\else"
+
+#: command.c:1787
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: немає відповідного \\if"
+
+#: command.c:1851
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: не може йти після \\else"
+
+#: command.c:1856
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: немає відповідного \\if"
+
+#: command.c:1896
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: немає відповідного \\if"
+
+#: command.c:2053
+msgid "Query buffer is empty."
+msgstr "Буфер запиту порожній."
+
+#: command.c:2096
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Введіть новий пароль користувача \"%s\": "
+
+#: command.c:2100
+msgid "Enter it again: "
+msgstr "Введіть знову: "
+
+#: command.c:2109
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Паролі не співпадають."
+
+#: command.c:2208
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: не вдалося прочитати значення змінної"
+
+#: command.c:2311
+msgid "Query buffer reset (cleared)."
+msgstr "Буфер запитів скинуто (очищено)."
+
+#: command.c:2333
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "Історію записано до файлу \"%s\".\n"
+
+#: command.c:2420
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: змінна середовища не повинна містити \"=\""
+
+#: command.c:2468
+#, c-format
+msgid "function name is required"
+msgstr "необхідне ім'я функції"
+
+#: command.c:2470
+#, c-format
+msgid "view name is required"
+msgstr "необхідне ім'я подання"
+
+#: command.c:2593
+msgid "Timing is on."
+msgstr "Таймер увімкнено."
+
+#: command.c:2595
+msgid "Timing is off."
+msgstr "Таймер вимкнено."
+
+#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952
+#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008
+#: command.c:4022 command.c:4049 command.c:4107 common.c:77 copy.c:331
+#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:3107 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Пароль: "
+
+#: command.c:3112 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Пароль користувача %s:"
+
+#: command.c:3168
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "Не надайте користувачеві, хосту або порту окремо під час використання рядка підключення"
+
+#: command.c:3203
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "Не існує підключення до бази даних для повторного використання параметрів"
+
+#: command.c:3511
+#, c-format
+msgid "Previous connection kept"
+msgstr "Попереднє підключення триває"
+
+#: command.c:3517
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3573
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Ви під'єднані до бази даних \"%s\" як користувач \"%s\" за адресою \"%s\" на порту \"%s\".\n"
+
+#: command.c:3576
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Ви тепер під'єднані до бази даних \"%s\" як користувач \"%s\" через сокет в \"%s\" на порту \"%s\".\n"
+
+#: command.c:3582
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Ви під'єднані до бази даних \"%s\" як користувач \"%s\" на хості \"%s\" (за адресою \"%s\") на порту \"%s\".\n"
+
+#: command.c:3585
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Ви тепер під'єднані до бази даних \"%s\" як користувач \"%s\" на хості \"%s\" на порту \"%s\".\n"
+
+#: command.c:3590
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Ви тепер під'єднані до бази даних \"%s\" як користувач \"%s\".\n"
+
+#: command.c:3630
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, сервер %s)\n"
+
+#: command.c:3643
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"УВАГА: мажорна версія %s %s, мажорна версія сервера %s.\n"
+" Деякі функції psql можуть не працювати.\n"
+
+#: command.c:3680
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "З'єднання SSL (протокол: %s, шифр: %s, компресія: %s)\n"
+
+#: command.c:3681 command.c:3682
+msgid "unknown"
+msgstr "невідомо"
+
+#: command.c:3683 help.c:42
+msgid "off"
+msgstr "вимк"
+
+#: command.c:3683 help.c:42
+msgid "on"
+msgstr "увімк"
+
+#: command.c:3697
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "З'єднання зашифровано GSSAPI\n"
+
+#: command.c:3717
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"УВАГА: Кодова сторінка консолі (%u) відрізняється від кодової сторінки Windows (%u)\n"
+" 8-бітові символи можуть працювати неправильно. Детальніше у розділі \n"
+" \"Нотатки для користувачів Windows\" у документації psql.\n"
+
+#: command.c:3822
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "змінна середовища PSQL_EDITOR_LINENUMBER_ARG має бути встановлена, щоб вказувати номер рядка"
+
+#: command.c:3851
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "неможливо запустити редактор \"%s\""
+
+#: command.c:3853
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "неможливо запустити /bin/sh"
+
+#: command.c:3903
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "неможливо знайти тимчасову директорію: %s"
+
+#: command.c:3930
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "неможливо відкрити тимчасовий файл \"%s\": %m"
+
+#: command.c:4266
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: неоднозначна абревіатура \"%s\" відповідає обом \"%s\" і \"%s"
+
+#: command.c:4286
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: дозволені формати: aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4305
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: дозволені стилі ліній: ascii, old-ascii, unicode"
+
+#: command.c:4320
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: дозволені стилі ліній рамок Unicode: single, double"
+
+#: command.c:4335
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: дозволені стилі ліній стовпців для Unicode: single, double"
+
+#: command.c:4350
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: дозволені стилі ліній заголовків для Unicode: single, double"
+
+#: command.c:4393
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep повинен бути однобайтовим символом"
+
+#: command.c:4398
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep не може бути подвійною лапкою, новим рядком або поверненням каретки"
+
+#: command.c:4535 command.c:4723
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: невідомий параметр: %s"
+
+#: command.c:4555
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Стиль рамки %d.\n"
+
+#: command.c:4561
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "Цільова ширина не встановлена.\n"
+
+#: command.c:4563
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "Цільова ширина %d.\n"
+
+#: command.c:4570
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Розширене відображення увімкнуто.\n"
+
+#: command.c:4572
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "Розширене відображення використовується автоматично.\n"
+
+#: command.c:4574
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Розширене відображення вимкнуто.\n"
+
+#: command.c:4580
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "Розділювач полів CSV: \"%s\".\n"
+
+#: command.c:4588 command.c:4596
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "Розділювач полів - нульовий байт.\n"
+
+#: command.c:4590
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "Розділювач полів \"%s\".\n"
+
+#: command.c:4603
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Нинжній колонтитул увімкнуто за замовчуванням.\n"
+
+#: command.c:4605
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Нинжній колонтитул вимкнуто за замовчуванням.\n"
+
+#: command.c:4611
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Формат виводу %s.\n"
+
+#: command.c:4617
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Стиль лінії %s.\n"
+
+#: command.c:4624
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Null відображається як \"%s\".\n"
+
+#: command.c:4632
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "Локалізоване виведення чисел ввімкнено.\n"
+
+#: command.c:4634
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "Локалізоване виведення чисел вимкнено.\n"
+
+#: command.c:4641
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "Пейджер використовується для виведення довгого тексту.\n"
+
+#: command.c:4643
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "Завжди використовується пейджер.\n"
+
+#: command.c:4645
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "Пейджер не використовується.\n"
+
+#: command.c:4651
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "Пейджер не буде використовуватися для менш ніж %d рядка.\n"
+msgstr[1] "Пейджер не буде використовуватися для менш ніж %d рядків.\n"
+msgstr[2] "Пейджер не буде використовуватися для менш ніж %d рядків.\n"
+msgstr[3] "Пейджер не буде використовуватися для менш ніж %d рядка.\n"
+
+#: command.c:4661 command.c:4671
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "Розділювач записів - нульовий байт.\n"
+
+#: command.c:4663
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "Розділювач записів: <newline>.\n"
+
+#: command.c:4665
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "Розділювач записів: \"%s\".\n"
+
+#: command.c:4678
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Табличні атрибути \"%s\".\n"
+
+#: command.c:4681
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Атрибути таблиць не задані.\n"
+
+#: command.c:4688
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Заголовок: \"%s\".\n"
+
+#: command.c:4690
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Заголовок не встановлено.\n"
+
+#: command.c:4697
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "Увімкнуто тільки кортежі.\n"
+
+#: command.c:4699
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "Вимкнуто тільки кортежі.\n"
+
+#: command.c:4705
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Стиль ліній рамки для Unicode: \"%s\".\n"
+
+#: command.c:4711
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Стиль ліній стовпців для Unicode: \"%s\".\n"
+
+#: command.c:4717
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Стиль ліній заголовків для Unicode: \"%s\".\n"
+
+#: command.c:4950
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: помилка"
+
+#: command.c:4984
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch не може бути використано із пустим запитом"
+
+#: command.c:5016
+#, c-format
+msgid "could not set timer: %m"
+msgstr "не вдалося встановити таймер: %m"
+
+#: command.c:5078
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (кожні %g сек)\n"
+
+#: command.c:5081
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (кожні %g сек)\n"
+
+#: command.c:5142
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "не вдалося дочекатися сигналів: %m"
+
+#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* ЗАПИТ **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5386
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" не є поданням"
+
+#: command.c:5402
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "неможливо розібрати масив reloptions"
+
+#: common.c:166
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "не можна вийти без активного з'єднання"
+
+#: common.c:207
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "аргумент командної оболонки містить символ нового рядка або повернення каретки: \"%s\""
+
+#: common.c:311
+#, c-format
+msgid "connection to server was lost"
+msgstr "з'єднання із сервером втрачено"
+
+#: common.c:315
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "З'єднання із сервером втрачено. Спроба перевстановити:"
+
+#: common.c:320
+#, c-format
+msgid "Failed.\n"
+msgstr "Помилка.\n"
+
+#: common.c:337
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Вдало.\n"
+
+#: common.c:389 common.c:1001
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "неочікуваний PQresultStatus: %d"
+
+#: common.c:511
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Час: %.3f мс\n"
+
+#: common.c:526
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Час: %.3f мс (%02d:%06.3f)\n"
+
+#: common.c:535
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Час: %.3f мс (%02d:%02d:%06.3f)\n"
+
+#: common.c:542
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Час: %.3f мс (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:566 common.c:623 common.c:1034 describe.c:6135
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "На даний момент ви від'єднанні від бази даних."
+
+#: common.c:654
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "Асинхронне сповіщення \"%s\" з навантаженням \"%s\" отримане від серверного процесу з PID %d.\n"
+
+#: common.c:657
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "Асинхронне сповіщення \"%s\" отримане від серверного процесу з PID %d.\n"
+
+#: common.c:688
+#, c-format
+msgid "could not print result table: %m"
+msgstr "не вдалося надрукувати таблицю результатів: %m"
+
+#: common.c:708
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "немає рядків повернутих для \\gset"
+
+#: common.c:713
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "більш, ніж один рядок повернуто для \\gset"
+
+#: common.c:731
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "спробу виконати \\gset в спеціальну змінну \"%s\" проігноровано"
+
+#: common.c:1043
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Покроковий режим: перевірка команди)*******************************************\n"
+"%s\n"
+"***(Enter - виповнити; х і Enter - відмінити)********************\n"
+
+#: common.c:1126
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "ІНСТРУКЦІЯ: %s"
+
+#: common.c:1162
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "неочікуваний стан транзакції (%d)"
+
+#: common.c:1303 describe.c:2020
+msgid "Column"
+msgstr "Стовпець"
+
+#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037
+#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021
+#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504
+#: describe.c:5767
+msgid "Type"
+msgstr "Тип"
+
+#: common.c:1353
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "Команда не має результату або результат не має стовпців.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: необхідні аргументи"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: помилка розбору аргументу біля \"%s\""
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: помилка розбору в кінці рядка"
+
+#: copy.c:328
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "не вдалося виконати команду \"%s\": %m"
+
+#: copy.c:344
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не вдалося отримати інформацію від файлу \"%s\": %m"
+
+#: copy.c:348
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: не можна копіювати з/до каталогу"
+
+#: copy.c:385
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "не вдалося закрити канал за допомогою зовнішньої команди: %m"
+
+#: copy.c:390
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: copy.c:453 copy.c:463
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "неможливо записати дані COPY: %m"
+
+#: copy.c:469
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "Помилка передачі даних COPY: %s"
+
+#: copy.c:530
+msgid "canceled by user"
+msgstr "скасовано користувачем"
+
+#: copy.c:541
+msgid ""
+"Enter data to be copied followed by a newline.\n"
+"End with a backslash and a period on a line by itself, or an EOF signal."
+msgstr ""
+"Введіть дані для копювання, розділяючи переносом рядка.\n"
+"Завершіть введення за допомогою \"\\.\" або за допомогою сигналу EOF."
+
+#: copy.c:684
+msgid "aborted because of read failure"
+msgstr "перервано через помилку читання"
+
+#: copy.c:718
+msgid "trying to exit copy mode"
+msgstr "спроба вийти з режиму копіювання"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: команда не повернула набір з результатами"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: запит має повернути принаймні три стовпці"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: вертикальні і горизонтальні заголовки повинні бути різними стовпцями"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: необхідно вказати стовпець даних, коли запит повертає більше трьох стовпців"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: Максимальна кількість стовпців (%d) перевищена"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: результат запиту містить кілька значень даних для рядка «%s», стовпця «%s»"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: номер стовпця %d поза межами 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: неоднозначна назва стовпця: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: ім'я стовпця не знайдено: \"%s\""
+
+#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029
+#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090
+#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866
+#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420
+#: describe.c:5477 describe.c:5881 describe.c:5959
+msgid "Schema"
+msgstr "Схема"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636
+#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258
+#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341
+#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867
+#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410
+#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748
+#: describe.c:5957 describe.c:6186 describe.c:6494
+msgid "Name"
+msgstr "Назва"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "Тип даних результату"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "Типи даних аргументів"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423
+#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041
+#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280
+#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777
+#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248
+#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422
+#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895
+#: describe.c:5960 describe.c:6992
+msgid "Description"
+msgstr "Опис"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "Перелік агрегатних функцій"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "Сервер (версія %s) не підтримує методи доступу."
+
+#: describe.c:168
+msgid "Index"
+msgstr "Індекс"
+
+#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882
+msgid "Table"
+msgstr "Таблиця"
+
+#: describe.c:177 describe.c:5679
+msgid "Handler"
+msgstr "Обробник"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "Список методів доступу"
+
+#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181
+#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588
+#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187
+#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718
+#: describe.c:6980
+msgid "Owner"
+msgstr "Власник"
+
+#: describe.c:231
+msgid "Location"
+msgstr "Розташування"
+
+#: describe.c:241 describe.c:3509
+msgid "Options"
+msgstr "Параметри"
+
+#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934
+msgid "Size"
+msgstr "Розмір"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "Список табличних просторів"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df приймає в якості параметрів тільки [anptwS+]"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df не приймає параметр \"%c\" із сервером версії %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "агр."
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "вікно"
+
+#: describe.c:356
+msgid "proc"
+msgstr "проц"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "функ"
+
+#: describe.c:374 describe.c:1390
+msgid "trigger"
+msgstr "тригер"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "постійна"
+
+#: describe.c:387
+msgid "stable"
+msgstr "стабільна"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "мінлива"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "Мінливість"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "обмежений"
+
+#: describe.c:398
+msgid "safe"
+msgstr "безпечний"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "небезпечний"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "Паралельність"
+
+#: describe.c:405
+msgid "definer"
+msgstr "визначник"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "викликач"
+
+#: describe.c:407
+msgid "Security"
+msgstr "Безпека"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Мова"
+
+#: describe.c:416 describe.c:420
+msgid "Source code"
+msgstr "Вихідний код"
+
+#: describe.c:594
+msgid "List of functions"
+msgstr "Список функцій"
+
+#: describe.c:657
+msgid "Internal name"
+msgstr "Внутрішнє назва"
+
+#: describe.c:659
+msgid "Elements"
+msgstr "Елементи"
+
+#: describe.c:711
+msgid "List of data types"
+msgstr "Список типів даних"
+
+#: describe.c:814
+msgid "Left arg type"
+msgstr "Тип лівого аргумента"
+
+#: describe.c:815
+msgid "Right arg type"
+msgstr "Тип правого аргумента"
+
+#: describe.c:816
+msgid "Result type"
+msgstr "Результуючий тип"
+
+#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247
+#: describe.c:6909 describe.c:6913
+msgid "Function"
+msgstr "Функція"
+
+#: describe.c:902
+msgid "List of operators"
+msgstr "Список операторів"
+
+#: describe.c:938
+msgid "Encoding"
+msgstr "Кодування"
+
+#: describe.c:939 describe.c:4868
+msgid "Collate"
+msgstr "Порядок сортування"
+
+#: describe.c:940 describe.c:4869
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878
+msgid "ICU Locale"
+msgstr "Локалізація ICU"
+
+#: describe.c:946 describe.c:952
+msgid "Locale Provider"
+msgstr "Постачальник локалі"
+
+#: describe.c:964
+msgid "Tablespace"
+msgstr "Табличний простір"
+
+#: describe.c:990
+msgid "List of databases"
+msgstr "Список баз даних"
+
+#: describe.c:1031 describe.c:1184 describe.c:3882
+msgid "table"
+msgstr "таблиця"
+
+#: describe.c:1032 describe.c:3883
+msgid "view"
+msgstr "подання"
+
+#: describe.c:1033 describe.c:3884
+msgid "materialized view"
+msgstr "матеріалізоване подання"
+
+#: describe.c:1034 describe.c:1186 describe.c:3886
+msgid "sequence"
+msgstr "послідовність"
+
+#: describe.c:1035 describe.c:3888
+msgid "foreign table"
+msgstr "зовнішня таблиця"
+
+#: describe.c:1036 describe.c:3889 describe.c:4101
+msgid "partitioned table"
+msgstr "секційна таблиця"
+
+#: describe.c:1047
+msgid "Column privileges"
+msgstr "Права для стовпців"
+
+#: describe.c:1078 describe.c:1112
+msgid "Policies"
+msgstr "Політики"
+
+#: describe.c:1143 describe.c:4510 describe.c:6577
+msgid "Access privileges"
+msgstr "Права доступу"
+
+#: describe.c:1188
+msgid "function"
+msgstr "функція"
+
+#: describe.c:1190
+msgid "type"
+msgstr "тип"
+
+#: describe.c:1192
+msgid "schema"
+msgstr "схема"
+
+#: describe.c:1215
+msgid "Default access privileges"
+msgstr "Права доступу за замовчуванням"
+
+#: describe.c:1259
+msgid "Object"
+msgstr "Об'єкт"
+
+#: describe.c:1273
+msgid "table constraint"
+msgstr "обмеження таблиці"
+
+#: describe.c:1297
+msgid "domain constraint"
+msgstr "обмеження домену"
+
+#: describe.c:1321
+msgid "operator class"
+msgstr "клас операторів"
+
+#: describe.c:1345
+msgid "operator family"
+msgstr "сімейство операторів"
+
+#: describe.c:1368
+msgid "rule"
+msgstr "правило"
+
+#: describe.c:1414
+msgid "Object descriptions"
+msgstr "Опис об'єкту"
+
+#: describe.c:1479 describe.c:4007
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Не знайдено жодного відношення під назвою \"%s\"."
+
+#: describe.c:1482 describe.c:4010
+#, c-format
+msgid "Did not find any relations."
+msgstr "Не знайдено жодного відношення."
+
+#: describe.c:1678
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Не знайдено жодного відношення з OID %s."
+
+#: describe.c:1726 describe.c:1750
+msgid "Start"
+msgstr "Початок"
+
+#: describe.c:1727 describe.c:1751
+msgid "Minimum"
+msgstr "Мінімум"
+
+#: describe.c:1728 describe.c:1752
+msgid "Maximum"
+msgstr "Максимум"
+
+#: describe.c:1729 describe.c:1753
+msgid "Increment"
+msgstr "Приріст"
+
+#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426
+#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620
+msgid "yes"
+msgstr "так"
+
+#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426
+#: describe.c:4768 describe.c:4892 describe.c:6621
+msgid "no"
+msgstr "ні"
+
+#: describe.c:1732 describe.c:1756
+msgid "Cycles?"
+msgstr "Цикли?"
+
+#: describe.c:1733 describe.c:1757
+msgid "Cache"
+msgstr "Кеш"
+
+#: describe.c:1798
+#, c-format
+msgid "Owned by: %s"
+msgstr "Власник: %s"
+
+#: describe.c:1802
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Послідовність для стовпця identity: %s"
+
+#: describe.c:1810
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "Послідовність без журналювання \"%s.%s\""
+
+#: describe.c:1813
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Послідовність \"%s.%s\""
+
+#: describe.c:1957
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Таблиця без журналювання \"%s.%s\""
+
+#: describe.c:1960
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Таблиця \"%s.%s\""
+
+#: describe.c:1964
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Подання \"%s.%s\""
+
+#: describe.c:1969
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Матеріалізоване подання без журналювання \"%s.%s\""
+
+#: describe.c:1972
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Матеріалізоване подання \"%s.%s\""
+
+#: describe.c:1977
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Індекс без журналювання \"%s.%s\""
+
+#: describe.c:1980
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Індекс \"%s.%s\""
+
+#: describe.c:1985
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Секційний індекс без журналювання \"%s.%s\""
+
+#: describe.c:1988
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Секційний індекс \"%s.%s\""
+
+#: describe.c:1992
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "Таблиця TOAST \"%s.%s\""
+
+#: describe.c:1996
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Композитний тип \"%s.%s\""
+
+#: describe.c:2000
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Зовнішня таблиця \"%s.%s\""
+
+#: describe.c:2005
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Секційна таблиця без журналювання \"%s.%s\""
+
+#: describe.c:2008
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Секційна таблиця \"%s.%s\""
+
+#: describe.c:2024 describe.c:4343
+msgid "Collation"
+msgstr "Сортування"
+
+#: describe.c:2025 describe.c:4344
+msgid "Nullable"
+msgstr "Обнуляється"
+
+#: describe.c:2026 describe.c:4345
+msgid "Default"
+msgstr "За замовчуванням"
+
+#: describe.c:2029
+msgid "Key?"
+msgstr "Ключ?"
+
+#: describe.c:2031 describe.c:4665 describe.c:4676
+msgid "Definition"
+msgstr "Визначення"
+
+#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835
+#: describe.c:5894
+msgid "FDW options"
+msgstr "Налаштування FDW"
+
+#: describe.c:2035
+msgid "Storage"
+msgstr "Сховище"
+
+#: describe.c:2037
+msgid "Compression"
+msgstr "Стискання"
+
+#: describe.c:2039
+msgid "Stats target"
+msgstr "Статистична ціль"
+
+#: describe.c:2175
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "Розділ: %s %s%s"
+
+#: describe.c:2188
+msgid "No partition constraint"
+msgstr "Відсутнє розділове обмеження"
+
+#: describe.c:2190
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Обмеження секції: %s"
+
+#: describe.c:2214
+#, c-format
+msgid "Partition key: %s"
+msgstr "Ключ розділу: %s"
+
+#: describe.c:2240
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Таблиця, що володіє: \"%s.%s\""
+
+#: describe.c:2309
+msgid "primary key, "
+msgstr "первинний ключ,"
+
+#: describe.c:2312
+msgid "unique"
+msgstr "унікальний"
+
+#: describe.c:2314
+msgid " nulls not distinct"
+msgstr " nulls не відрізняються"
+
+#: describe.c:2315
+msgid ", "
+msgstr ", "
+
+#: describe.c:2322
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "для таблиці \"%s.%s\""
+
+#: describe.c:2326
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", предикат (%s)"
+
+#: describe.c:2329
+msgid ", clustered"
+msgstr ", кластеризовано"
+
+#: describe.c:2332
+msgid ", invalid"
+msgstr ", недійсний"
+
+#: describe.c:2335
+msgid ", deferrable"
+msgstr ", відтермінований"
+
+#: describe.c:2338
+msgid ", initially deferred"
+msgstr ", від початку відтермінований"
+
+#: describe.c:2341
+msgid ", replica identity"
+msgstr ", ідентичність репліки"
+
+#: describe.c:2395
+msgid "Indexes:"
+msgstr "Індекси:"
+
+#: describe.c:2478
+msgid "Check constraints:"
+msgstr "Обмеження перевірки:"
+
+#: describe.c:2546
+msgid "Foreign-key constraints:"
+msgstr "Обмеження зовнішнього ключа:"
+
+#: describe.c:2609
+msgid "Referenced by:"
+msgstr "Посилання ззовні:"
+
+#: describe.c:2659
+msgid "Policies:"
+msgstr "Політики:"
+
+#: describe.c:2662
+msgid "Policies (forced row security enabled):"
+msgstr "Політики (посилений захист рядків активовано):"
+
+#: describe.c:2665
+msgid "Policies (row security enabled): (none)"
+msgstr "Політики (захист рядків ввімкнуто): (ні)"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Політики (посилений захист рядків ввімкнуто): (ні)"
+
+#: describe.c:2671
+msgid "Policies (row security disabled):"
+msgstr "Політики (захист рядків вимкнуто):"
+
+#: describe.c:2731 describe.c:2835
+msgid "Statistics objects:"
+msgstr "Об'єкти статистики:"
+
+#: describe.c:2937 describe.c:3090
+msgid "Rules:"
+msgstr "Правила:"
+
+#: describe.c:2940
+msgid "Disabled rules:"
+msgstr "Вимкнені правила:"
+
+#: describe.c:2943
+msgid "Rules firing always:"
+msgstr "Правила, що завжди працюють:"
+
+#: describe.c:2946
+msgid "Rules firing on replica only:"
+msgstr "Правила, що працюють тільки на репліці:"
+
+#: describe.c:3025 describe.c:5030
+msgid "Publications:"
+msgstr "Публікації:"
+
+#: describe.c:3073
+msgid "View definition:"
+msgstr "Визначення подання:"
+
+#: describe.c:3236
+msgid "Triggers:"
+msgstr "Тригери:"
+
+#: describe.c:3239
+msgid "Disabled user triggers:"
+msgstr "Вимкнені користувацькі тригери:"
+
+#: describe.c:3242
+msgid "Disabled internal triggers:"
+msgstr "Вимкнені внутрішні тригери:"
+
+#: describe.c:3245
+msgid "Triggers firing always:"
+msgstr "Тригери, що завжди працюють:"
+
+#: describe.c:3248
+msgid "Triggers firing on replica only:"
+msgstr "Тригери, що працюють тільки на репліці:"
+
+#: describe.c:3319
+#, c-format
+msgid "Server: %s"
+msgstr "Сервер: %s"
+
+#: describe.c:3327
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "Налаштування FDW: (%s)"
+
+#: describe.c:3348
+msgid "Inherits"
+msgstr "Успадковує"
+
+#: describe.c:3413
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "Число секцій: %d"
+
+#: describe.c:3422
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Кількість розділів: %d (\\d+ для списку)"
+
+#: describe.c:3424
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Кількість дочірніх таблиць: %d (\\d+ для списку)"
+
+#: describe.c:3431
+msgid "Child tables"
+msgstr "Дочірні таблиці"
+
+#: describe.c:3431
+msgid "Partitions"
+msgstr "Розділи"
+
+#: describe.c:3462
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Типізована таблиця типу: %s"
+
+#: describe.c:3478
+msgid "Replica Identity"
+msgstr "Ідентичність репліки"
+
+#: describe.c:3491
+msgid "Has OIDs: yes"
+msgstr "Має OIDs: так"
+
+#: describe.c:3500
+#, c-format
+msgid "Access method: %s"
+msgstr "Метод доступу: %s"
+
+#: describe.c:3579
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "Табличний простір: \"%s\""
+
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:3591
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", табличний простір \"%s\""
+
+#: describe.c:3668
+msgid "List of roles"
+msgstr "Список ролей"
+
+#: describe.c:3670
+msgid "Role name"
+msgstr "Ім'я ролі"
+
+#: describe.c:3671
+msgid "Attributes"
+msgstr "Атрибути"
+
+#: describe.c:3673
+msgid "Member of"
+msgstr "Член"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "Суперкористувач"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "Без успадкування"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "Створити роль"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "Створити базу даних"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "Не може увійти"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "Реплікація"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "Обхід RLC"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "Без підключень"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d підключення"
+msgstr[1] "%d підключення"
+msgstr[2] "%d підключень"
+msgstr[3] "%d підключення"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Пароль дійнсий до"
+
+#: describe.c:3777
+msgid "Role"
+msgstr "Роль"
+
+#: describe.c:3778
+msgid "Database"
+msgstr "База даних"
+
+#: describe.c:3779
+msgid "Settings"
+msgstr "Параметри"
+
+#: describe.c:3803
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "Не знайдено жодного параметра для ролі \"%s\" і бази даних \"%s\"."
+
+#: describe.c:3806
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Не знайдено жодного параметру для ролі \"%s\"."
+
+#: describe.c:3809
+#, c-format
+msgid "Did not find any settings."
+msgstr "Не знайдено жодного параметру."
+
+#: describe.c:3814
+msgid "List of settings"
+msgstr "Список параметрів"
+
+#: describe.c:3885
+msgid "index"
+msgstr "індекс"
+
+#: describe.c:3887
+msgid "TOAST table"
+msgstr "Таблиця TOAST"
+
+#: describe.c:3890 describe.c:4102
+msgid "partitioned index"
+msgstr "секційний індекс"
+
+#: describe.c:3910
+msgid "permanent"
+msgstr "постійна"
+
+#: describe.c:3911
+msgid "temporary"
+msgstr "тимчасова"
+
+#: describe.c:3912
+msgid "unlogged"
+msgstr "нежурнальована"
+
+#: describe.c:3913
+msgid "Persistence"
+msgstr "Стійкість"
+
+#: describe.c:3929
+msgid "Access method"
+msgstr "Метод доступу"
+
+#: describe.c:4015
+msgid "List of relations"
+msgstr "Список відношень"
+
+#: describe.c:4063
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "Сервер (версія %s) не підтримує декларативне секціонування таблиць."
+
+#: describe.c:4074
+msgid "List of partitioned indexes"
+msgstr "Список секційних індексів"
+
+#: describe.c:4076
+msgid "List of partitioned tables"
+msgstr "Список секційних таблиць"
+
+#: describe.c:4080
+msgid "List of partitioned relations"
+msgstr "Список секційних відношень"
+
+#: describe.c:4111
+msgid "Parent name"
+msgstr "Батьківська назва"
+
+#: describe.c:4124
+msgid "Leaf partition size"
+msgstr "Розмір дочірньої секції"
+
+#: describe.c:4127 describe.c:4133
+msgid "Total size"
+msgstr "Загальний розмір"
+
+#: describe.c:4258
+msgid "Trusted"
+msgstr "Надійний"
+
+#: describe.c:4267
+msgid "Internal language"
+msgstr "Внутрішня мова"
+
+#: describe.c:4268
+msgid "Call handler"
+msgstr "Обробник виклику"
+
+#: describe.c:4269 describe.c:5680
+msgid "Validator"
+msgstr "Функція перевірки"
+
+#: describe.c:4270
+msgid "Inline handler"
+msgstr "Оброблювач впровадженого коду"
+
+#: describe.c:4305
+msgid "List of languages"
+msgstr "Список мов"
+
+#: describe.c:4346
+msgid "Check"
+msgstr "Перевірка"
+
+#: describe.c:4390
+msgid "List of domains"
+msgstr "Список доменів"
+
+#: describe.c:4424
+msgid "Source"
+msgstr "Джерело"
+
+#: describe.c:4425
+msgid "Destination"
+msgstr "Призначення"
+
+#: describe.c:4427 describe.c:6622
+msgid "Default?"
+msgstr "За замовчуванням?"
+
+#: describe.c:4469
+msgid "List of conversions"
+msgstr "Список перетворень"
+
+#: describe.c:4497
+msgid "Parameter"
+msgstr "Параметр"
+
+#: describe.c:4498
+msgid "Value"
+msgstr "Значення"
+
+#: describe.c:4505
+msgid "Context"
+msgstr "Контекст"
+
+#: describe.c:4538
+msgid "List of configuration parameters"
+msgstr "Список параметрів конфігурації"
+
+#: describe.c:4540
+msgid "List of non-default configuration parameters"
+msgstr "Список параметрів конфігурації не за замовчуванням"
+
+#: describe.c:4567
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "Сервер (версія %s) не підтримує тригери подій."
+
+#: describe.c:4587
+msgid "Event"
+msgstr "Подія"
+
+#: describe.c:4589
+msgid "enabled"
+msgstr "увімкнено"
+
+#: describe.c:4590
+msgid "replica"
+msgstr "репліка"
+
+#: describe.c:4591
+msgid "always"
+msgstr "завжди"
+
+#: describe.c:4592
+msgid "disabled"
+msgstr "вимкнено"
+
+#: describe.c:4593 describe.c:6496
+msgid "Enabled"
+msgstr "Увімкнено"
+
+#: describe.c:4595
+msgid "Tags"
+msgstr "Теги"
+
+#: describe.c:4619
+msgid "List of event triggers"
+msgstr "Список тригерів подій"
+
+#: describe.c:4646
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "Сервер (версія %s) не підтримує розширену статистику."
+
+#: describe.c:4683
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4684
+msgid "Dependencies"
+msgstr "Залежності"
+
+#: describe.c:4694
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4718
+msgid "List of extended statistics"
+msgstr "Список розширеної статистики"
+
+#: describe.c:4745
+msgid "Source type"
+msgstr "Початковий тип"
+
+#: describe.c:4746
+msgid "Target type"
+msgstr "Тип цілі"
+
+#: describe.c:4770
+msgid "in assignment"
+msgstr "у призначенні"
+
+#: describe.c:4772
+msgid "Implicit?"
+msgstr "Приховане?"
+
+#: describe.c:4831
+msgid "List of casts"
+msgstr "Список приведення типів"
+
+#: describe.c:4883 describe.c:4887
+msgid "Provider"
+msgstr "Постачальник"
+
+#: describe.c:4893 describe.c:4898
+msgid "Deterministic?"
+msgstr "Детермінований?"
+
+#: describe.c:4938
+msgid "List of collations"
+msgstr "Список правил сортування"
+
+#: describe.c:5000
+msgid "List of schemas"
+msgstr "Список схем"
+
+#: describe.c:5117
+msgid "List of text search parsers"
+msgstr "Список парсерів текстового пошуку"
+
+#: describe.c:5167
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Не знайдено жодного парсера текстового пошуку \"%s\"."
+
+#: describe.c:5170
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Не знайдено жодного парсера текстового пошуку."
+
+#: describe.c:5245
+msgid "Start parse"
+msgstr "Почати розбір"
+
+#: describe.c:5246
+msgid "Method"
+msgstr "Метод"
+
+#: describe.c:5250
+msgid "Get next token"
+msgstr "Отримати наступний токен"
+
+#: describe.c:5252
+msgid "End parse"
+msgstr "Закінчити розбір"
+
+#: describe.c:5254
+msgid "Get headline"
+msgstr "Отримати заголовок"
+
+#: describe.c:5256
+msgid "Get token types"
+msgstr "Отримати типи токенів"
+
+#: describe.c:5267
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Парсер текстового пошуку \"%s.%s\""
+
+#: describe.c:5270
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Парсер текстового пошуку \"%s\""
+
+#: describe.c:5289
+msgid "Token name"
+msgstr "Ім'я токену"
+
+#: describe.c:5303
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Типи токенів для парсера \"%s.%s\""
+
+#: describe.c:5306
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Типи токенів для парсера \"%s\""
+
+#: describe.c:5350
+msgid "Template"
+msgstr "Шаблон"
+
+#: describe.c:5351
+msgid "Init options"
+msgstr "Параметри ініціалізації"
+
+#: describe.c:5378
+msgid "List of text search dictionaries"
+msgstr "Список словників текстового пошуку"
+
+#: describe.c:5411
+msgid "Init"
+msgstr "Ініціалізація"
+
+#: describe.c:5412
+msgid "Lexize"
+msgstr "Виділення лексем"
+
+#: describe.c:5444
+msgid "List of text search templates"
+msgstr "Список шаблонів текстового пошуку"
+
+#: describe.c:5499
+msgid "List of text search configurations"
+msgstr "Список конфігурацій текстового пошуку"
+
+#: describe.c:5550
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "Не знайдено жодної конфігурації текстового пошуку під назвою \"%s\"."
+
+#: describe.c:5553
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Не знайдено жодної конфігурації текствого пошуку."
+
+#: describe.c:5619
+msgid "Token"
+msgstr "Токен"
+
+#: describe.c:5620
+msgid "Dictionaries"
+msgstr "Словники"
+
+#: describe.c:5631
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Конфігурація пошуку тексту \"%s.%s\""
+
+#: describe.c:5634
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Конфігурація пошуку тексту \"%s\""
+
+#: describe.c:5638
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Парсер: \"%s.%s\""
+
+#: describe.c:5641
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Парсер: \"%s\""
+
+#: describe.c:5722
+msgid "List of foreign-data wrappers"
+msgstr "Список джерел сторонніх даних"
+
+#: describe.c:5750
+msgid "Foreign-data wrapper"
+msgstr "Джерело сторонніх даних"
+
+#: describe.c:5768 describe.c:5958
+msgid "Version"
+msgstr "Версія"
+
+#: describe.c:5799
+msgid "List of foreign servers"
+msgstr "Список сторонніх серверів"
+
+#: describe.c:5824 describe.c:5883
+msgid "Server"
+msgstr "Сервер"
+
+#: describe.c:5825
+msgid "User name"
+msgstr "Ім'я користувача"
+
+#: describe.c:5855
+msgid "List of user mappings"
+msgstr "Список зіставлень користувачів"
+
+#: describe.c:5928
+msgid "List of foreign tables"
+msgstr "Список сторонніх таблиць"
+
+#: describe.c:5980
+msgid "List of installed extensions"
+msgstr "Список встановлених розширень"
+
+#: describe.c:6028
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "Не знайдено жодного розширення під назвою \"%s\"."
+
+#: describe.c:6031
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Не знайдено жодного розширення."
+
+#: describe.c:6075
+msgid "Object description"
+msgstr "Опис об'єкту"
+
+#: describe.c:6085
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Об'єкти в розширенні \"%s\""
+
+#: describe.c:6126
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "неправильне повне ім'я (забагато компонентів): %s"
+
+#: describe.c:6140
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "міжбазові посилання не реалізовані: %s"
+
+#: describe.c:6171 describe.c:6298
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "Сервер (версія %s) не підтримує публікації."
+
+#: describe.c:6188 describe.c:6376
+msgid "All tables"
+msgstr "Усі таблиці"
+
+#: describe.c:6189 describe.c:6377
+msgid "Inserts"
+msgstr "Вставки"
+
+#: describe.c:6190 describe.c:6378
+msgid "Updates"
+msgstr "Оновлення"
+
+#: describe.c:6191 describe.c:6379
+msgid "Deletes"
+msgstr "Видалення"
+
+#: describe.c:6195 describe.c:6381
+msgid "Truncates"
+msgstr "Очищення"
+
+#: describe.c:6199 describe.c:6383
+msgid "Via root"
+msgstr "Через root"
+
+#: describe.c:6221
+msgid "List of publications"
+msgstr "Список публікацій"
+
+#: describe.c:6345
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "Не знайдено жодної публікації під назвою \"%s\"."
+
+#: describe.c:6348
+#, c-format
+msgid "Did not find any publications."
+msgstr "Не знайдено жодної публікації."
+
+#: describe.c:6372
+#, c-format
+msgid "Publication %s"
+msgstr "Публікація %s"
+
+#: describe.c:6425
+msgid "Tables:"
+msgstr "Таблиці:"
+
+#: describe.c:6437
+msgid "Tables from schemas:"
+msgstr "Таблиці зі схеми:"
+
+#: describe.c:6481
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Сервер (версія %s) не підтримує підписки."
+
+#: describe.c:6497
+msgid "Publication"
+msgstr "Публікація"
+
+#: describe.c:6506
+msgid "Binary"
+msgstr "Бінарний"
+
+#: describe.c:6507
+msgid "Streaming"
+msgstr "Потокова передача"
+
+#: describe.c:6514
+msgid "Two-phase commit"
+msgstr "Двофазовий коміт"
+
+#: describe.c:6515
+msgid "Disable on error"
+msgstr "Вимкнути при помилці"
+
+#: describe.c:6520
+msgid "Synchronous commit"
+msgstr "Синхронні затвердження"
+
+#: describe.c:6521
+msgid "Conninfo"
+msgstr "Conninfo"
+
+#: describe.c:6527
+msgid "Skip LSN"
+msgstr "Пропустити LSN"
+
+#: describe.c:6554
+msgid "List of subscriptions"
+msgstr "Список підписок"
+
+#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900
+msgid "AM"
+msgstr "АМ"
+
+#: describe.c:6617
+msgid "Input type"
+msgstr "Тип вводу"
+
+#: describe.c:6618
+msgid "Storage type"
+msgstr "Тип сховища"
+
+#: describe.c:6619
+msgid "Operator class"
+msgstr "Клас операторів"
+
+#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901
+msgid "Operator family"
+msgstr "Сімейство операторів"
+
+#: describe.c:6667
+msgid "List of operator classes"
+msgstr "Список класів операторів"
+
+#: describe.c:6714
+msgid "Applicable types"
+msgstr "Типи для застосування"
+
+#: describe.c:6756
+msgid "List of operator families"
+msgstr "Список сімейств операторів"
+
+#: describe.c:6807
+msgid "Operator"
+msgstr "Оператор"
+
+#: describe.c:6808
+msgid "Strategy"
+msgstr "Стратегія"
+
+#: describe.c:6809
+msgid "ordering"
+msgstr "упорядкування"
+
+#: describe.c:6810
+msgid "search"
+msgstr "пошук"
+
+#: describe.c:6811
+msgid "Purpose"
+msgstr "Ціль"
+
+#: describe.c:6816
+msgid "Sort opfamily"
+msgstr "Сімейство операторів сортування"
+
+#: describe.c:6855
+msgid "List of operators of operator families"
+msgstr "Список операторів сімейств операторів"
+
+#: describe.c:6902
+msgid "Registered left type"
+msgstr "Зареєстрований лівий тип"
+
+#: describe.c:6903
+msgid "Registered right type"
+msgstr "Зареєстрований правий тип"
+
+#: describe.c:6904
+msgid "Number"
+msgstr "Число"
+
+#: describe.c:6948
+msgid "List of support functions of operator families"
+msgstr "Список функцій підтримки сімейств операторів"
+
+#: describe.c:6979
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7000
+msgid "Large objects"
+msgstr "Великі об'єкти"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql - це інтерактивний термінал PostgreSQL.\n"
+"\n"
+
+#: help.c:76 help.c:393 help.c:473 help.c:516
+msgid "Usage:\n"
+msgstr "Використання:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [ОПЦІЯ]... [БД [КОРИСТУВАЧ]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "Основні налаштування:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=КОМАНДА виконати лише одну команду (SQL або внутрішню) і вийти\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=DBNAME ім'я бази даних для підключення (за замовчання: \"%s\") \n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=FILENAME виконує команди з файлу, потім виходить\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list виводить список доступних баз даних, потім виходить\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" присвоїти змінній psql NAME значення VALUE\n"
+" (наприклад, -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію, потім вийти\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc ігнорувати файл параметрів запуска (~/.psqlrc)\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (\"один\"), --single-transaction\n"
+" виконує як одну транзакцію (якщо не інтерактивна)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help [=options] показати цю довідку, потім вийти\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands перерахувати команди, потім вийти\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables перерахувати спеціальні змінні, потім вийти\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Параметри вводу і виводу:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all відобразити всі вхідні дані з скрипта\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors відобразити команди з помилками\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries відобразити команди, відправлені на сервер\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden відобразити запити, згенеровані внутрішніми командами\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=FILENAME зберегти протокол роботи у файл\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline вимкнути розширене редагування командного рядка (readline)\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=FILENAME надсилати результати запиту до файлу (або до каналу |)\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet тихий запуск (ніяких повідомлень, лише результат запитів)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step покроковий режим (підтвердження кожного запиту)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line однорядковий режим (кінець рядка завершує команду)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Параметри формату виводу:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align режим виводу не вирівняної таблиці\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv режим виводу таблиць CSV (Comma-Separated Values)\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=СТРОКА\n"
+" розділювач полів при не вирівняному виводі\n"
+" (за замовчуванням: \"%s\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html вивід таблиці у форматі HTML\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=VAR[=ARG] встановити параметр виводу змінної VAR значенню ARG (див. команду \"\\pset\")\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=СТРОКА\n"
+" розділювач записів при не вирівняному виводі\n"
+" (за замовчуванням: новий рядок)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only виводити лише рядки\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=ТЕКСТ встановити атрибути HTML-таблиці (width, border)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded ввімкнути розширене виведення таблиці\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" встановити розділювач полів для не вирівняного виводу в нульовий байт\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" встановити розділювач записів для не вирівняного виводу в нульовий байт\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Налаштування з'єднання:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr " -h, --host=HOSTNAME хост сервера бази даних або каталог сокетів (за замовчуванням: \"%s)\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "локальний сокет"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT порт сервера бази даних (за замовчуванням: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=USERNAME ім'я користувача бази даних (за змовчуванням: \"%s\")\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ніколи не запитувати пароль\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password запитувати пароль завжди (повинно траплятись автоматично)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Щоб дізнатися більше, введіть \"\\?\" (для внутрішніх команд) або \"\\help\"(для команд SQL) в psql, або звіртеся з розділом psql документації PostgreSQL. \n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Повідомляти про помилки на <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "Загальні\n"
+
+#: help.c:192
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright умови використання і розповсюдження PostgreSQL\n"
+
+#: help.c:193
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr " \\crosstabview [COLUMNS] виконати запит і відобразити результат у перехресній таблиці\n"
+
+#: help.c:194
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose вивести максимально докладне повідомлення про останню помилку\n"
+
+#: help.c:195
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPTIONS)] [FILE] виконати запит (і надіслати результат до файлу або |каналу);\n"
+" \\g без аргументів рівнозначно крапці з комою\n"
+
+#: help.c:197
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc описати результат запиту без виконання\n"
+
+#: help.c:198
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec виконати запит, потім виконати кожне значення в його результаті\n"
+
+#: help.c:199
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [PREFIX] виконати запит та зберегти результат в змінних psql \n"
+
+#: help.c:200
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(OPTIONS)] [FILE] як \\g, але вмикає розширений режим виводу\n"
+
+#: help.c:201
+msgid " \\q quit psql\n"
+msgstr " \\q вийти з psql\n"
+
+#: help.c:202
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SEC] виконувати запит кожні SEC секунд\n"
+
+#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304
+#: help.c:324 help.c:337 help.c:346
+msgid "\n"
+msgstr "\n"
+
+#: help.c:205
+msgid "Help\n"
+msgstr "Довідка\n"
+
+#: help.c:207
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] показати довідку по командах з \\\n"
+
+#: help.c:208
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options показати довідку по параметрах командного рядку psql\n"
+
+#: help.c:209
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables показати довідку по спеціальних змінних\n"
+
+#: help.c:210
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [NAME] довідка з синтаксису команд SQL, * для всіх команд\n"
+
+#: help.c:213
+msgid "Query Buffer\n"
+msgstr "Буфер запитів\n"
+
+#: help.c:214
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [FILE] [LINE] редагувати буфер запитів (або файл) зовнішнім редактором\n"
+
+#: help.c:215
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [FUNCNAME [LINE]] редагувати визначення функції зовнішнім редактором\n"
+
+#: help.c:216
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [VIEWNAME [LINE]] редагувати визначення подання зовнішнім редактором\n"
+
+#: help.c:217
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p показати вміст буфера запитів\n"
+
+#: help.c:218
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r скинути (очистити) буфер запитів\n"
+
+#: help.c:220
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [FILE] відобразити історію або зберегти її до файлу\n"
+
+#: help.c:222
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w FILE писати буфер запитів до файлу\n"
+
+#: help.c:225
+msgid "Input/Output\n"
+msgstr "Ввід/Вивід\n"
+
+#: help.c:226
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... виконати команду SQL COPY з потоком даних на клієнтський хост\n"
+
+#: help.c:227
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [STRING] записати рядок до стандартного виводу (-n для пропуску нового рядка)\n"
+
+#: help.c:228
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i FILE виконати команди з файлу\n"
+
+#: help.c:229
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir ФАЙЛ те саме, що \\i, але відносно розташування поточного сценарію\n"
+
+#: help.c:230
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [FILE] надсилати всі результати запитів до файлу або до каналу |\n"
+
+#: help.c:231
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr " \\qecho [-n] [STRING] записати рядок до вихідного потоку \\o (-n для пропуску нового рядка)\n"
+
+#: help.c:232
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [STRING] записати рядок до стандартної помилки (-n для пропуску нового рядка)\n"
+
+#: help.c:235
+msgid "Conditional\n"
+msgstr "Умовний\n"
+
+#: help.c:236
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR початок умовного блоку\n"
+
+#: help.c:237
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR альтернатива в рамках поточного блоку\n"
+
+#: help.c:238
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else остаточна альтернатива в рамках поточного умовного блоку\n"
+
+#: help.c:239
+msgid " \\endif end conditional block\n"
+msgstr " \\endif кінець умовного блоку\n"
+
+#: help.c:242
+msgid "Informational\n"
+msgstr "Інформаційний\n"
+
+#: help.c:243
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (параметри: S = показати системні об'єкти, + = додаткові деталі)\n"
+
+#: help.c:244
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] вивести таблиці, подання і послідовності\n"
+
+#: help.c:245
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NAME описати таблицю, подання, послідовність або індекс\n"
+
+#: help.c:246
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [PATTERN] вивести агрегати\n"
+
+#: help.c:247
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [PATTERN] вивести методи доступу\n"
+
+#: help.c:248
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] список класів операторів\n"
+
+#: help.c:249
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] список сімейств операторів\n"
+
+#: help.c:250
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] список операторів сімейств операторів\n"
+
+#: help.c:251
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] список функцій підтримки сімейств операторів\n"
+
+#: help.c:252
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [PATTERN] вивести табличні простори\n"
+
+#: help.c:253
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [PATTERN] вивести перетворення\n"
+
+#: help.c:254
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [PATTERN] вивести параметри конфігурації\n"
+
+#: help.c:255
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [PATTERN] вивести приведення типів\n"
+
+#: help.c:256
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [PATTERN] показати опис об'єкта, що не відображається в іншому місці\n"
+
+#: help.c:257
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [PATTERN] вивести домени\n"
+
+#: help.c:258
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [PATTERN] вивести привілеї за замовчуванням\n"
+
+#: help.c:259
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [PATTERN] вивести зовнішні таблиці\n"
+
+#: help.c:260
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [PATTERN] вивести зовнішні сервери\n"
+
+#: help.c:261
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [PATTERN] вивести зовнішні таблиці\n"
+
+#: help.c:262
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [PATTERN] вивести користувацькі зіставлення\n"
+
+#: help.c:263
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [PATTERN] список джерел сторонніх даних\n"
+
+#: help.c:264
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" список [лише агрегатних/нормальних/процедурних/тригерних/віконних] функцій\n"
+
+#: help.c:266
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [PATTERN] вивести конфігурації текстового пошуку\n"
+
+#: help.c:267
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [PATTERN] вивести словники текстового пошуку\n"
+
+#: help.c:268
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [PATTERN] вивести парсери текстового пошуку\n"
+
+#: help.c:269
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [PATTERN] вивести шаблони текстового пошуку\n"
+
+#: help.c:270
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [PATTERN] вивести ролі\n"
+
+#: help.c:271
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [PATTERN] вивести індекси\n"
+
+#: help.c:272
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] вивести великі об'єкти, те саме, що \\lo_list\n"
+
+#: help.c:273
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [PATTERN] вивести процедурні мови\n"
+
+#: help.c:274
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [PATTERN] вивести матеріалізовані подання\n"
+
+#: help.c:275
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [PATTERN] вивести схеми\n"
+
+#: help.c:276
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" список операторів\n"
+
+#: help.c:278
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [PATTERN] вивести правила сортування\n"
+
+#: help.c:279
+msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp [PATTERN] вивести привілеї доступу до таблиць, подань або послідновностей \n"
+
+#: help.c:280
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[itn+] [PATTERN] вивести [тільки індекс/таблицю] секційні відношення [n=вкладені]\n"
+
+#: help.c:281
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr " \\drds [ROLEPTRN [DBPTRN]] вивести налаштування ролей побазово\n"
+
+#: help.c:282
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [PATTERN] вивести реплікаційні публікації\n"
+
+#: help.c:283
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [PATTERN] вивести реплікаційні підписки\n"
+
+#: help.c:284
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [PATTERN] вивести послідовності\n"
+
+#: help.c:285
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [PATTERN] вивести таблиці\n"
+
+#: help.c:286
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [PATTERN] вивести типи даних\n"
+
+#: help.c:287
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [PATTERN] вивести ролі\n"
+
+#: help.c:288
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [PATTERN] вивести подання\n"
+
+#: help.c:289
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [PATTERN] вивести розширення\n"
+
+#: help.c:290
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [PATTERN] список розширеної статистики\n"
+
+#: help.c:291
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [PATTERN] вивести тригери подій\n"
+
+#: help.c:292
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [PATTERN] вивести бази даних\n"
+
+#: help.c:293
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNCNAME відобразити визначення функції\n"
+
+#: help.c:294
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VIEWNAME відобразити визначення подання\n"
+
+#: help.c:295
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [PATTERN] те саме, що \\dp\n"
+
+#: help.c:298
+msgid "Large Objects\n"
+msgstr "Великі об'єкти\n"
+
+#: help.c:299
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export LOBOID FILE записати великий об'єкт в файл\n"
+
+#: help.c:300
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import FILE [COMMENT]\n"
+" читати великий об'єкт з файлу\n"
+
+#: help.c:302
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] вивести великі об'єкти\n"
+
+#: help.c:303
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID видалити великий об’єкт\n"
+
+#: help.c:306
+msgid "Formatting\n"
+msgstr "Форматування\n"
+
+#: help.c:307
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a перемикання між режимами виводу: unaligned, aligned\n"
+
+#: help.c:308
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [STRING] встановити заголовок таблиці або прибрати, якщо не задано\n"
+
+#: help.c:309
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [STRING] показати або встановити розділювач полів для не вирівняного виводу запиту\n"
+
+#: help.c:310
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H переключити режим виводу HTML (поточний: %s)\n"
+
+#: help.c:312
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NAME [VALUE]] встановити параметр виводу таблиці\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:319
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] показувати лише рядки (поточно %s)\n"
+
+#: help.c:321
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [STRING] встановити атрибути для HTML <table> або прибрати, якщо не задані\n"
+
+#: help.c:322
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] переключити розширений вивід (поточний: %s)\n"
+
+#: help.c:323
+msgid "auto"
+msgstr "авто"
+
+#: help.c:326
+msgid "Connection\n"
+msgstr "Підключення\n"
+
+#: help.c:328
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo} під'єднатися до нової бази даних (поточно \"%s\")\n"
+
+#: help.c:332
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo} під'єднатися до нової бази даних (зараз з'єднання відсутнє)\n"
+
+#: help.c:334
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo показати інформацію про поточне з'єднання\n"
+
+#: help.c:335
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [ENCODING] показати або встановити кодування клієнта\n"
+
+#: help.c:336
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [USERNAME] безпечно змінити пароль користувача \n"
+
+#: help.c:339
+msgid "Operating System\n"
+msgstr "Операційна система\n"
+
+#: help.c:340
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [DIR] змінити поточний робочий каталог\n"
+
+#: help.c:341
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVAR отримати змінну середовища\n"
+
+#: help.c:342
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAME [VALUE] встановити або скинути змінну середовища\n"
+
+#: help.c:343
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] переключити таймер команд (поточний: %s)\n"
+
+#: help.c:345
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [COMMAND] виконати команду в оболонці або запустити інтерактивну оболонку\n"
+
+#: help.c:348
+msgid "Variables\n"
+msgstr "Змінні\n"
+
+#: help.c:349
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TEXT] NAME запитати користувача значення внутрішньої змінної\n"
+
+#: help.c:350
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [NAME [VALUE]] встановити внутрішню змінну або вивести всі, якщо не задані параметри\n"
+
+#: help.c:351
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NAME скинути (видалити) значення внутрішньої змінної\n"
+
+#: help.c:390
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"Список спеціальних змінних\n"
+"\n"
+
+#: help.c:392
+msgid "psql variables:\n"
+msgstr "змінні psql:\n"
+
+#: help.c:394
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=ІМ'Я=ЗНАЧЕННЯ\n"
+" або \\set ІМ'Я ЗНАЧЕННЯ усередині psql\n"
+"\n"
+
+#: help.c:396
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" якщо встановлений, успішні SQL-команди підтверджуються автоматично\n"
+
+#: help.c:398
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" визначає регістр для автодоповнення ключових слів SQL\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:401
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr " DBNAME назва під'єднаної бази даних\n"
+
+#: help.c:403
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr " ECHO контролює ввід, що виводиться на стандартний вивід [all, errors, none, queries]\n"
+
+#: help.c:406
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" якщо ввімкнено, виводить внутрішні запити, виконані за допомогою \"\\\";\n"
+" якщо встановлено значення \"noexec\", тільки виводяться, але не виконуються\n"
+
+#: help.c:409
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" поточне кодування набору символів клієнта\n"
+
+#: help.c:411
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr ""
+" ERROR\n"
+" істина, якщо в останньому запиті є помилка, в іншому разі - хибність\n"
+
+#: help.c:413
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" число рядків з результатами для передачі та відображення за один раз (0 = необмежено)\n"
+
+#: help.c:415
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" якщо вказано, методи доступу до таблиць не відображаються\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" якщо встановлено, методи стискання не відображаються\n"
+
+#: help.c:419
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr " HISTCONTROL контролює історію команд [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:421
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr " HISTFILE ім'я файлу для зберігання історії команд\n"
+
+#: help.c:423
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr " HISTSIZE максимальна кількість команд для зберігання в історії команд\n"
+
+#: help.c:425
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr " HOST поточний підключений хост сервера бази даних\n"
+
+#: help.c:427
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr " IGNOREEOF кількість EOF для завершення інтерактивної сесії\n"
+
+#: help.c:429
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr " LASTOID значення останнього залученого OID\n"
+
+#: help.c:431
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" повідомлення та код SQLSTATE останньої помилки, або пустий рядок та \"00000\", якщо помилки не було\n"
+
+#: help.c:434
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" якщо встановлено, транзакція не припиняється у разі помилки (використовуються неявні точки збереження)\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" зупиняти виконання пакету команд після помилки\n"
+
+#: help.c:438
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" порт сервера для поточного з'єднання\n"
+
+#: help.c:440
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" визначає стандратне запрошення psql \n"
+
+#: help.c:442
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" визначає запрошення, яке використовується при продовженні команди з попереднього рядка\n"
+
+#: help.c:444
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" визначає запрошення, яке виконується під час COPY ... FROM STDIN\n"
+
+#: help.c:446
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" тихий запуск ( як із параметром -q)\n"
+
+#: help.c:448
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" число повернених або оброблених рядків останнім запитом, або 0\n"
+
+#: help.c:450
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" версія серевера (у короткому текстовому або числовому форматі)\n"
+
+#: help.c:453
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" показати всі результати комбінованого запиту (\\;) замість тільки останнього\n"
+
+#: help.c:455
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" керує відображенням полів контексту повідомлень [never, errors, always]\n"
+
+#: help.c:457
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" якщо встановлено, кінець рядка завершує режим вводу SQL-команди (як з параметром -S)\n"
+
+#: help.c:459
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" покроковий режим (як з параметром -s)\n"
+
+#: help.c:461
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" SQLSTATE останнього запиту, або \"00000\" якщо немає помилок\n"
+
+#: help.c:463
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" поточний користувач, підключений до бази даних\n"
+
+#: help.c:465
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" контролює докладність звітів про помилку [default, verbose, terse, sqlstate]\n"
+
+#: help.c:467
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql версія (в розгорнутому, в короткому текстовому або числовому форматі)\n"
+
+#: help.c:472
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Налаштування відобреження:\n"
+
+#: help.c:474
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NAME[=VALUE]\n"
+" або \\pset ІМ'Я [VALUE] всередині psql\n"
+"\n"
+
+#: help.c:476
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" стиль рамки (число)\n"
+
+#: help.c:478
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" цільова ширина для формату з переносом\n"
+
+#: help.c:480
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (or x)\n"
+" розширений вивід [on, off, auto]\n"
+
+#: help.c:482
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" розділювач полів для не вирівняного виводу (за замовчуванням \"%s\")\n"
+
+#: help.c:485
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" встановити розділювач полів для невирівняного виводу на нульовий байт\n"
+
+#: help.c:487
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" вмикає або вимикає вивід підписів таблиці [on, off]\n"
+
+#: help.c:489
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" встановити формат виводу [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:491
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" встановлює стиль малювання ліній рамки [ascii, old-ascii, unicode]\n"
+
+#: help.c:493
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" встановлює рядок, який буде виведено замість значення (null)\n"
+
+#: help.c:495
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" вмикає виведення заданого локалью роздільника групи цифр\n"
+
+#: help.c:497
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" контролює використання зовнішнього пейджера [yes, no, always]\n"
+
+#: help.c:499
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" розділювач записів (рядків) для не вирівняного виводу\n"
+
+#: help.c:501
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" встановлює розділювач записів для невирівняного виводу на нульовий байт\n"
+
+#: help.c:503
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (або T)\n"
+" вказує атрибути для тегу table у html форматі або пропорційні \n"
+" ширини стовпців для вирівняних вліво даних, у latex-longtable форматі\n"
+
+#: help.c:506
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" задає заголовок таблиці для послідовно друкованих таблиць\n"
+
+#: help.c:508
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" якщо встановлено, виводяться лише фактичні табличні дані\n"
+
+#: help.c:510
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" задає стиль мальювання ліній (Unicode) [single, double]\n"
+
+#: help.c:515
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Змінні оточення:\n"
+
+#: help.c:519
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" ІМ'Я=ЗНАЧЕННЯ [ІМ'Я=ЗНАЧЕННЯ] psql ...\n"
+" або \\setenv ІМ'Я [VALUE] всередині psql\n"
+"\n"
+
+#: help.c:521
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" встановлює ІМ'Я=ЗНАЧЕННЯ\n"
+" psql ...\n"
+" або \\setenv ІМ'Я [VALUE] всередині psql\n"
+"\n"
+
+#: help.c:524
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" число стовпців для форматування з переносом\n"
+
+#: help.c:526
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" те саме, що параметр підключення application_name\n"
+
+#: help.c:528
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" те саме, що параметр підключення dbname\n"
+
+#: help.c:530
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" те саме, що параметр підключення host\n"
+
+#: help.c:532
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" назва файлу з паролем\n"
+
+#: help.c:534
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" пароль для підключення (не рекомендується)\n"
+
+#: help.c:536
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" те саме, що параметр підключення port\n"
+
+#: help.c:538
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" те саме, що параметр підключення user\n"
+
+#: help.c:540
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" редактор для команд \\e, \\ef і \\ev\n"
+
+#: help.c:542
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" як вказати номер рядка при виклику редактора\n"
+
+#: help.c:544
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" альтернативне розміщення файлу з історією команд\n"
+
+#: help.c:546
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" ім'я програми зовнішнього пейджеру\n"
+
+#: help.c:549
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" назва зовнішньої програми-пейджера для використання з \\watch\n"
+
+#: help.c:552
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" альтернативне розміщення користувацького файла .psqlrc\n"
+
+#: help.c:554
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" оболонка, що використовується командою \\!\n"
+
+#: help.c:556
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" каталог для тимчасових файлів\n"
+
+#: help.c:616
+msgid "Available help:\n"
+msgstr "Доступна довідка:\n"
+
+#: help.c:711
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Команда: %s\n"
+"Опис: %s\n"
+"Синтаксис:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:734
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Немає доступної довідки по команді \"%s\".\n"
+"Спробуйте \\h без аргументів, щоб подивитись доступну довідку.\n"
+
+#: input.c:217
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "не вдалося прочитати з вхідного файлу: %m"
+
+#: input.c:478 input.c:516
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "не можливо зберегти історію в файлі \"%s\": %m"
+
+#: input.c:535
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "ця установка не підтримує історію"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: немає з'єднання з базою даних"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: поточна транзакція перервана"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: невідомий стан транзакції"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: вихід"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Введіть \"\\q\", щоб вийти з %s.\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"Ввід являє собою спеціальний формат дампу PostgreSQL.\n"
+"Щоб відновити базу даних з цього дампу, скористайтеся командою pg_restore.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Для отримання довідки введіть \\? або натисніть сontrol-C для очищення буферу вводу."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "Введіть \\? для отримання довідки."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Ви використовуєте psql — інтерфейс командного рядка до PostgreSQL."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Введіть: \\copyright для умов розповсюдження\n"
+" \\h для довідки по командах SQL\n"
+" \\? для довідки по командах psql\n"
+" \\g або крапку з комою в кінці рядка для виконання запиту\n"
+" \\q для виходу\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "Введіть \\q, щоб вийти."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "Натисніть control-D, щоб вийти."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "Натисніть control-C, щоб вийти."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "запит ігнорується; введіть \\endif або натисніть Ctrl-C для завершення поточного \\if блоку"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "досягнуто кінця файлу без завершального \\endif"
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "незавершений рядок в лапках"
+
+#: psqlscanslash.l:811
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: бракує пам'яті"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1996
+#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154
+#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228
+#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431
+#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517
+#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594
+#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730
+#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071
+#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171
+#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259
+#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338
+#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396
+#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428
+#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464
+#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499
+#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537
+#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574
+#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606
+#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638
+#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680
+#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030
+#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687
+#: sql_help.c:4735 sql_help.c:4893
+msgid "name"
+msgstr "назва"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846
+#: sql_help.c:3339 sql_help.c:4455
+msgid "aggregate_signature"
+msgstr "сигнатура_агр_функції"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "нова_назва"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3011
+msgid "new_owner"
+msgstr "новий_власник"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "нова_схема"
+
+#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484
+msgid "where aggregate_signature is:"
+msgstr "де сигнатура_агр_функції:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911
+#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085
+#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341
+#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527
+#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461
+#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488
+#: sql_help.c:4491
+msgid "argmode"
+msgstr "режим_аргументу"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912
+#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2067 sql_help.c:2086
+#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342
+#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528
+#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475
+#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492
+msgid "argname"
+msgstr "ім'я_аргументу"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2388 sql_help.c:2597
+#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440
+#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470
+#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493
+msgid "argtype"
+msgstr "тип_аргументу"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974
+#: sql_help.c:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343
+#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040
+#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742
+#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956
+msgid "option"
+msgstr "параметр"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433
+#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388
+msgid "where option can be:"
+msgstr "де параметр може бути:"
+
+#: sql_help.c:116 sql_help.c:2209
+msgid "allowconn"
+msgstr "дозвол_підкл"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210
+#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227
+msgid "connlimit"
+msgstr "ліміт_підключень"
+
+#: sql_help.c:118 sql_help.c:2211
+msgid "istemplate"
+msgstr "чи_шаблон"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4187
+msgid "new_tablespace"
+msgstr "новий_табл_простір"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2398 sql_help.c:2601
+#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675
+msgid "configuration_parameter"
+msgstr "параметр_конфігурації"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344
+#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467
+#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626
+#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915
+#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014
+#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676
+#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679
+msgid "value"
+msgstr "значення"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "цільова_роль"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631
+#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889
+#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338
+#: sql_help.c:4357 sql_help.c:4369
+msgid "schema_name"
+msgstr "ім'я_схеми"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "скорочено_GRANT_або_REVOKE"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "де скорочено_GRANT_або_REVOKE є одним з:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2437 sql_help.c:2438
+#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575
+#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667
+#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232
+#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933
+#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697
+msgid "role_name"
+msgstr "ім'я_ролі"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352
+#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774
+#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924
+#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981
+#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088
+#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558
+#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608
+#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651
+#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806
+#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864
+#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921
+#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044
+#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102
+#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105
+msgid "expression"
+msgstr "вираз"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "обмеження_домену"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852
+#: sql_help.c:1854 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351
+#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993
+msgid "constraint_name"
+msgstr "ім'я_обмеження"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "ім'я_нового_обмеження"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "нова_версія"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "елемент_об'єкт"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "де елемент_об'єкт є:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856
+#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860
+#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869
+#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884
+#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894
+#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898
+#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902
+#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4451 sql_help.c:4456
+#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465
+#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477
+#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481
+#: sql_help.c:4482
+msgid "object_name"
+msgstr "ім'я_об'єкту"
+
+#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454
+msgid "aggregate_name"
+msgstr "ім'я_агр_функції"
+
+#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135
+#: sql_help.c:2137 sql_help.c:3357
+msgid "source_type"
+msgstr "початковий_тип"
+
+#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136
+#: sql_help.c:2138 sql_help.c:3358
+msgid "target_type"
+msgstr "тип_цілі"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133
+#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549
+#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577
+#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834
+#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072
+#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083
+msgid "function_name"
+msgstr "ім'я_функції"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542
+msgid "operator_name"
+msgstr "ім'я_оператора"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871
+#: sql_help.c:2519 sql_help.c:3481
+msgid "left_type"
+msgstr "тип_ліворуч"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872
+#: sql_help.c:2520 sql_help.c:3482
+msgid "right_type"
+msgstr "тип_праворуч"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2539
+#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500
+msgid "index_method"
+msgstr "метод_індексу"
+
+#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467
+msgid "procedure_name"
+msgstr "назва_процедури"
+
+#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473
+msgid "routine_name"
+msgstr "ім'я_підпрограми"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394
+#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662
+#: sql_help.c:3926 sql_help.c:4375
+msgid "type_name"
+msgstr "назва_типу"
+
+#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599
+#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911
+#: sql_help.c:4360
+msgid "lang_name"
+msgstr "назва_мови"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "і сигнатура_агр_функції:"
+
+#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275
+msgid "handler_function"
+msgstr "функція_обробник"
+
+#: sql_help.c:396 sql_help.c:2276
+msgid "validator_function"
+msgstr "функція_перевірки"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "дія"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851
+#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1983 sql_help.c:1984
+#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391
+#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629
+#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887
+#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919
+#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955
+#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978
+#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883
+#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997
+#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089
+#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614
+#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877
+#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924
+#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117
+msgid "column_name"
+msgstr "назва_стовпця"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "нова_назва_стовпця"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "де допустима дія:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2229
+#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888
+#: sql_help.c:3167 sql_help.c:4141
+msgid "data_type"
+msgstr "тип_даних"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2230 sql_help.c:2329
+#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911
+#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990
+msgid "collation"
+msgstr "правила_сортування"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339
+#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920
+msgid "column_constraint"
+msgstr "обмеження_стовпця"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968
+msgid "integer"
+msgstr "ціле"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "параметр_атрибуту"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340
+#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921
+msgid "table_constraint"
+msgstr "обмеження_таблиці"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905
+msgid "trigger_name"
+msgstr "ім'я_тригеру"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918
+msgid "parent_table"
+msgstr "батьківська_таблиця"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2261
+msgid "extension_name"
+msgstr "ім'я_розширення"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395
+msgid "execution_cost"
+msgstr "вартість_виконання"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396
+msgid "result_rows"
+msgstr "рядки_результату"
+
+#: sql_help.c:547 sql_help.c:2397
+msgid "support_function"
+msgstr "функція_підтримки"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2709
+#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881
+#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890
+#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 sql_help.c:3896
+#: sql_help.c:3897 sql_help.c:3899 sql_help.c:3900 sql_help.c:3902
+#: sql_help.c:3903 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918
+#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924
+#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930
+#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335
+#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342
+#: sql_help.c:4343 sql_help.c:4345 sql_help.c:4346 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4351 sql_help.c:4352 sql_help.c:4358
+#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364
+#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370
+#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376
+#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380
+msgid "role_specification"
+msgstr "вказання_ролі"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198
+#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707
+msgid "user_name"
+msgstr "ім'я_користувача"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716
+#: sql_help.c:3932 sql_help.c:4381
+msgid "where role_specification can be:"
+msgstr "де вказання_ролі може бути:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "ім'я_групи"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468
+#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930
+#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923
+#: sql_help.c:4372
+msgid "tablespace_name"
+msgstr "ім'я_табличного_простору"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783
+msgid "index_name"
+msgstr "назва_індексу"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2466 sql_help.c:2500
+#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969
+#: sql_help.c:2996
+msgid "storage_parameter"
+msgstr "параметр_зберігання"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "номер_стовпця"
+
+#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464
+msgid "large_object_oid"
+msgstr "oid_великого_об'єкта"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889
+msgid "compression_method"
+msgstr "compression_method"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "новий_метод_доступа"
+
+#: sql_help.c:725 sql_help.c:2523
+msgid "res_proc"
+msgstr "res_процедура"
+
+#: sql_help.c:726 sql_help.c:2524
+msgid "join_proc"
+msgstr "процедура_приєднання"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2541
+msgid "strategy_number"
+msgstr "номер_стратегії"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2543 sql_help.c:2544
+#: sql_help.c:2547 sql_help.c:2548
+msgid "op_type"
+msgstr "тип_операції"
+
+#: sql_help.c:782 sql_help.c:2545
+msgid "sort_family_name"
+msgstr "ім'я_родини_сортування"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2546
+msgid "support_number"
+msgstr "номер_підтримки"
+
+#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087
+#: sql_help.c:3089
+msgid "argument_type"
+msgstr "тип_аргументу"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779
+#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891
+#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2324
+#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574
+#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770
+#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917
+#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517
+#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885
+#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334
+#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627
+#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884
+#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060
+#: sql_help.c:5122
+msgid "table_name"
+msgstr "ім'я_таблиці"
+
+#: sql_help.c:823 sql_help.c:2576
+msgid "using_expression"
+msgstr "вираз_використання"
+
+#: sql_help.c:824 sql_help.c:2577
+msgid "check_expression"
+msgstr "вираз_перевірки"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624
+msgid "publication_object"
+msgstr "об'єкт_публікація"
+
+#: sql_help.c:903 sql_help.c:2625
+msgid "publication_parameter"
+msgstr "параметр_публікації"
+
+#: sql_help.c:909 sql_help.c:2627
+msgid "where publication_object is one of:"
+msgstr "де об'єкт_публікація є одним з:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662
+#: sql_help.c:3228
+msgid "password"
+msgstr "пароль"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663
+#: sql_help.c:3229
+msgid "timestamp"
+msgstr "мітка часу"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3892
+#: sql_help.c:4341
+msgid "database_name"
+msgstr "назва_бази_даних"
+
+#: sql_help.c:1073 sql_help.c:2732
+msgid "increment"
+msgstr "інкремент"
+
+#: sql_help.c:1074 sql_help.c:2733
+msgid "minvalue"
+msgstr "мін_значення"
+
+#: sql_help.c:1075 sql_help.c:2734
+msgid "maxvalue"
+msgstr "макс_значення"
+
+#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664
+#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056
+msgid "start"
+msgstr "початок"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "перезапуск"
+
+#: sql_help.c:1078 sql_help.c:2736
+msgid "cache"
+msgstr "кеш"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "нова_ціль"
+
+#: sql_help.c:1142 sql_help.c:2789
+msgid "conninfo"
+msgstr "інформація_підключення"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790
+msgid "publication_name"
+msgstr "назва_публікації"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "publication_option"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "опція_оновлення"
+
+#: sql_help.c:1161 sql_help.c:2791
+msgid "subscription_parameter"
+msgstr "параметр_підписки"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "опція_пропуска"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "ім'я_розділу"
+
+#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922
+msgid "partition_bound_spec"
+msgstr "специфікація_рамок_розділу"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936
+msgid "sequence_options"
+msgstr "опції_послідовності"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "опція_послідовності"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "індекс_обмеження_таблиці"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "ім'я_правила_перезапису"
+
+#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961
+msgid "and partition_bound_spec is:"
+msgstr "і специфікація_рамок_розділу:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354
+#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963
+#: sql_help.c:2964
+msgid "partition_bound_expr"
+msgstr "код_секції"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358
+#: sql_help.c:2965 sql_help.c:2966
+msgid "numeric_literal"
+msgstr "числовий_літерал"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "і обмеження_стовпця:"
+
+#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598
+#: sql_help.c:2934
+msgid "default_expr"
+msgstr "вираз_за_замовчуванням"
+
+#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935
+msgid "generation_expr"
+msgstr "код_генерації"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947
+#: sql_help.c:2949 sql_help.c:2953
+msgid "index_parameters"
+msgstr "параметри_індексу"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956
+msgid "reftable"
+msgstr "залежна_таблиця"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957
+msgid "refcolumn"
+msgstr "залежний_стовпець"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959
+msgid "referential_action"
+msgstr "дія_посилання"
+
+#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943
+msgid "and table_constraint is:"
+msgstr "і обмеження_таблиці:"
+
+#: sql_help.c:1409 sql_help.c:2951
+msgid "exclude_element"
+msgstr "об'єкт_виключення"
+
+#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662
+#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054
+msgid "operator"
+msgstr "оператор"
+
+#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954
+msgid "predicate"
+msgstr "предикат"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "і індекс_обмеження_таблиці:"
+
+#: sql_help.c:1421 sql_help.c:2967
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "параметри_індексу в обмеженнях UNIQUE, PRIMARY KEY, EXCLUDE:"
+
+#: sql_help.c:1426 sql_help.c:2972
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "елемент_виключення в обмеженні EXCLUDE:"
+
+#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912
+#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991
+msgid "opclass"
+msgstr "клас_оператора"
+
+#: sql_help.c:1430 sql_help.c:2976
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "посилання на дію в обмеженні FOREIGN KEY/REFERENCES:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013
+msgid "tablespace_option"
+msgstr "опція_табличного_простору"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "тип_токену"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "ім'я_словника"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "старий_словник"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "новий_словник"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3166
+msgid "attribute_name"
+msgstr "ім'я_атрибута"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "нове_ім'я_атрибута"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "нове_значення_перерахування"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "сусіднє_значення_перерахування"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "існуюче_значення_перерахування"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "властивість"
+
+#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748
+#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947
+#: sql_help.c:4350
+msgid "server_name"
+msgstr "назва_серверу"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261
+msgid "view_option_name"
+msgstr "ім'я_параметра_представлення"
+
+#: sql_help.c:1698 sql_help.c:3262
+msgid "view_option_value"
+msgstr "значення_параметра_представлення"
+
+#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958
+msgid "table_and_columns"
+msgstr "таблиця_і_стовпці"
+
+#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745
+#: sql_help.c:4185 sql_help.c:4959
+msgid "where option can be one of:"
+msgstr "де параметр може бути одним із:"
+
+#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977
+#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747
+#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188
+#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963
+#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967
+msgid "boolean"
+msgstr "логічний"
+
+#: sql_help.c:1724 sql_help.c:4969
+msgid "and table_and_columns is:"
+msgstr "і таблиця_і_стовпці:"
+
+#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749
+msgid "transaction_mode"
+msgstr "режим_транзакції"
+
+#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750
+msgid "where transaction_mode is one of:"
+msgstr "де режим_транзакції один з:"
+
+#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582
+#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835
+#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064
+#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084
+msgid "argument"
+msgstr "аргумент"
+
+#: sql_help.c:1850
+msgid "relation_name"
+msgstr "назва_відношення"
+
+#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344
+msgid "domain_name"
+msgstr "назва_домену"
+
+#: sql_help.c:1877
+msgid "policy_name"
+msgstr "назва_політики"
+
+#: sql_help.c:1890
+msgid "rule_name"
+msgstr "назва_правила"
+
+#: sql_help.c:1909 sql_help.c:4483
+msgid "string_literal"
+msgstr "рядковий_літерал"
+
+#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397
+msgid "transaction_id"
+msgstr "ідентифікатор_транзакції"
+
+#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017
+msgid "filename"
+msgstr "ім'я файлу"
+
+#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688
+#: sql_help.c:2689
+msgid "command"
+msgstr "команда"
+
+#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297
+#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552
+#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809
+#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049
+msgid "condition"
+msgstr "умова"
+
+#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263
+#: sql_help.c:3281 sql_help.c:3982
+msgid "query"
+msgstr "запит"
+
+#: sql_help.c:1976
+msgid "format_name"
+msgstr "назва_формату"
+
+#: sql_help.c:1978
+msgid "delimiter_character"
+msgstr "символ_роздільник"
+
+#: sql_help.c:1979
+msgid "null_string"
+msgstr "представлення_NULL"
+
+#: sql_help.c:1981
+msgid "quote_character"
+msgstr "символ_лапок"
+
+#: sql_help.c:1982
+msgid "escape_character"
+msgstr "символ_екранування"
+
+#: sql_help.c:1986
+msgid "encoding_name"
+msgstr "ім'я_кодування"
+
+#: sql_help.c:1997
+msgid "access_method_type"
+msgstr "тип_метода_доступа"
+
+#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090
+msgid "arg_data_type"
+msgstr "тип_даних_аргумента"
+
+#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099
+msgid "sfunc"
+msgstr "функція_стану"
+
+#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100
+msgid "state_data_type"
+msgstr "тип_даних_стану"
+
+#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101
+msgid "state_data_size"
+msgstr "розмір_даних_стану"
+
+#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102
+msgid "ffunc"
+msgstr "функція_завершення"
+
+#: sql_help.c:2073 sql_help.c:2103
+msgid "combinefunc"
+msgstr "комбінуюча_функція"
+
+#: sql_help.c:2074 sql_help.c:2104
+msgid "serialfunc"
+msgstr "функція_серіалізації"
+
+#: sql_help.c:2075 sql_help.c:2105
+msgid "deserialfunc"
+msgstr "функція_десеріалізації"
+
+#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106
+msgid "initial_condition"
+msgstr "початкова_умова"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "msfunc"
+msgstr "функція_стану_рух"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "minvfunc"
+msgstr "зворотна_функція_рух"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "mstate_data_type"
+msgstr "тип_даних_стану_рух"
+
+#: sql_help.c:2080 sql_help.c:2110
+msgid "mstate_data_size"
+msgstr "розмір_даних_стану_рух"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "mffunc"
+msgstr "функція_завершення_рух"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minitial_condition"
+msgstr "початкова_умова_рух"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "sort_operator"
+msgstr "оператор_сортування"
+
+#: sql_help.c:2096
+msgid "or the old syntax"
+msgstr "або старий синтаксис"
+
+#: sql_help.c:2098
+msgid "base_type"
+msgstr "базовий_тип"
+
+#: sql_help.c:2155 sql_help.c:2202
+msgid "locale"
+msgstr "локаль"
+
+#: sql_help.c:2156 sql_help.c:2203
+msgid "lc_collate"
+msgstr "код_правила_сортування"
+
+#: sql_help.c:2157 sql_help.c:2204
+msgid "lc_ctype"
+msgstr "код_класифікації_символів"
+
+#: sql_help.c:2158 sql_help.c:4450
+msgid "provider"
+msgstr "постачальник"
+
+#: sql_help.c:2160 sql_help.c:2263
+msgid "version"
+msgstr "версія"
+
+#: sql_help.c:2162
+msgid "existing_collation"
+msgstr "існуюче_правило_сортування"
+
+#: sql_help.c:2172
+msgid "source_encoding"
+msgstr "початкове_кодування"
+
+#: sql_help.c:2173
+msgid "dest_encoding"
+msgstr "цільве_кодування"
+
+#: sql_help.c:2199 sql_help.c:3039
+msgid "template"
+msgstr "шаблон"
+
+#: sql_help.c:2200
+msgid "encoding"
+msgstr "кодування"
+
+#: sql_help.c:2201
+msgid "strategy"
+msgstr "стратегія"
+
+#: sql_help.c:2205
+msgid "icu_locale"
+msgstr "icu_locale"
+
+#: sql_help.c:2206
+msgid "locale_provider"
+msgstr "локаль_провайдер"
+
+#: sql_help.c:2207
+msgid "collation_version"
+msgstr "версія_сортування"
+
+#: sql_help.c:2212
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2232
+msgid "constraint"
+msgstr "обмеження"
+
+#: sql_help.c:2233
+msgid "where constraint is:"
+msgstr "де обмеження:"
+
+#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112
+msgid "event"
+msgstr "подія"
+
+#: sql_help.c:2248
+msgid "filter_variable"
+msgstr "змінна_фільтру"
+
+#: sql_help.c:2249
+msgid "filter_value"
+msgstr "значення_фільтру"
+
+#: sql_help.c:2345 sql_help.c:2931
+msgid "where column_constraint is:"
+msgstr "де обмеження_стовпців:"
+
+#: sql_help.c:2390
+msgid "rettype"
+msgstr "тип_результату"
+
+#: sql_help.c:2392
+msgid "column_type"
+msgstr "тип_стовпця"
+
+#: sql_help.c:2401 sql_help.c:2604
+msgid "definition"
+msgstr "визначення"
+
+#: sql_help.c:2402 sql_help.c:2605
+msgid "obj_file"
+msgstr "об'єктний_файл"
+
+#: sql_help.c:2403 sql_help.c:2606
+msgid "link_symbol"
+msgstr "символ_експорту"
+
+#: sql_help.c:2404 sql_help.c:2607
+msgid "sql_body"
+msgstr "sql_body"
+
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913
+#: sql_help.c:2927 sql_help.c:2995
+msgid "method"
+msgstr "метод"
+
+#: sql_help.c:2463
+msgid "opclass_parameter"
+msgstr "opclass_parameter"
+
+#: sql_help.c:2480
+msgid "call_handler"
+msgstr "обробник_виклику"
+
+#: sql_help.c:2481
+msgid "inline_handler"
+msgstr "обробник_впровадженого_коду"
+
+#: sql_help.c:2482
+msgid "valfunction"
+msgstr "функція_перевірки"
+
+#: sql_help.c:2521
+msgid "com_op"
+msgstr "комут_оператор"
+
+#: sql_help.c:2522
+msgid "neg_op"
+msgstr "зворотній_оператор"
+
+#: sql_help.c:2540
+msgid "family_name"
+msgstr "назва_сімейства"
+
+#: sql_help.c:2551
+msgid "storage_type"
+msgstr "тип_зберігання"
+
+#: sql_help.c:2690 sql_help.c:3119
+msgid "where event can be one of:"
+msgstr "де подія може бути однією з:"
+
+#: sql_help.c:2710 sql_help.c:2712
+msgid "schema_element"
+msgstr "елемент_схеми"
+
+#: sql_help.c:2749
+msgid "server_type"
+msgstr "тип_серверу"
+
+#: sql_help.c:2750
+msgid "server_version"
+msgstr "версія_серверу"
+
+#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347
+msgid "fdw_name"
+msgstr "назва_fdw"
+
+#: sql_help.c:2768 sql_help.c:2771
+msgid "statistics_name"
+msgstr "назва_статистики"
+
+#: sql_help.c:2772
+msgid "statistics_kind"
+msgstr "вид_статистики"
+
+#: sql_help.c:2788
+msgid "subscription_name"
+msgstr "назва_підписки"
+
+#: sql_help.c:2893
+msgid "source_table"
+msgstr "вихідна_таблиця"
+
+#: sql_help.c:2894
+msgid "like_option"
+msgstr "параметр_породження"
+
+#: sql_help.c:2960
+msgid "and like_option is:"
+msgstr "і параметр_породження:"
+
+#: sql_help.c:3012
+msgid "directory"
+msgstr "каталог"
+
+#: sql_help.c:3026
+msgid "parser_name"
+msgstr "назва_парсера"
+
+#: sql_help.c:3027
+msgid "source_config"
+msgstr "початкова_конфігурація"
+
+#: sql_help.c:3056
+msgid "start_function"
+msgstr "функція_початку"
+
+#: sql_help.c:3057
+msgid "gettoken_function"
+msgstr "функція_видачі_токену"
+
+#: sql_help.c:3058
+msgid "end_function"
+msgstr "функція_завершення"
+
+#: sql_help.c:3059
+msgid "lextypes_function"
+msgstr "функція_лекс_типів"
+
+#: sql_help.c:3060
+msgid "headline_function"
+msgstr "функція_створення_заголовків"
+
+#: sql_help.c:3072
+msgid "init_function"
+msgstr "функція_ініціалізації"
+
+#: sql_help.c:3073
+msgid "lexize_function"
+msgstr "функція_виділення_лексем"
+
+#: sql_help.c:3086
+msgid "from_sql_function_name"
+msgstr "ім'я_функції_з_sql"
+
+#: sql_help.c:3088
+msgid "to_sql_function_name"
+msgstr "ім'я_функції_в_sql"
+
+#: sql_help.c:3114
+msgid "referenced_table_name"
+msgstr "ім'я_залежної_таблиці"
+
+#: sql_help.c:3115
+msgid "transition_relation_name"
+msgstr "ім'я_перехідного_відношення"
+
+#: sql_help.c:3118
+msgid "arguments"
+msgstr "аргументи"
+
+#: sql_help.c:3170
+msgid "label"
+msgstr "мітка"
+
+#: sql_help.c:3172
+msgid "subtype"
+msgstr "підтип"
+
+#: sql_help.c:3173
+msgid "subtype_operator_class"
+msgstr "клас_оператора_підтипу"
+
+#: sql_help.c:3175
+msgid "canonical_function"
+msgstr "канонічна_функція"
+
+#: sql_help.c:3176
+msgid "subtype_diff_function"
+msgstr "функція_розбіжностей_підтипу"
+
+#: sql_help.c:3177
+msgid "multirange_type_name"
+msgstr "multirange_type_name"
+
+#: sql_help.c:3179
+msgid "input_function"
+msgstr "функція_вводу"
+
+#: sql_help.c:3180
+msgid "output_function"
+msgstr "функція_виводу"
+
+#: sql_help.c:3181
+msgid "receive_function"
+msgstr "функція_отримання"
+
+#: sql_help.c:3182
+msgid "send_function"
+msgstr "функція_відправки"
+
+#: sql_help.c:3183
+msgid "type_modifier_input_function"
+msgstr "функція_введення_модифікатора_типу"
+
+#: sql_help.c:3184
+msgid "type_modifier_output_function"
+msgstr "функція_виводу_модифікатора_типу"
+
+#: sql_help.c:3185
+msgid "analyze_function"
+msgstr "функція_аналізу"
+
+#: sql_help.c:3186
+msgid "subscript_function"
+msgstr "subscript_function"
+
+#: sql_help.c:3187
+msgid "internallength"
+msgstr "внутр_довжина"
+
+#: sql_help.c:3188
+msgid "alignment"
+msgstr "вирівнювання"
+
+#: sql_help.c:3189
+msgid "storage"
+msgstr "зберігання"
+
+#: sql_help.c:3190
+msgid "like_type"
+msgstr "тип_зразок"
+
+#: sql_help.c:3191
+msgid "category"
+msgstr "категорія"
+
+#: sql_help.c:3192
+msgid "preferred"
+msgstr "привілейований"
+
+#: sql_help.c:3193
+msgid "default"
+msgstr "за_замовчуванням"
+
+#: sql_help.c:3194
+msgid "element"
+msgstr "елемент"
+
+#: sql_help.c:3195
+msgid "delimiter"
+msgstr "роздільник"
+
+#: sql_help.c:3196
+msgid "collatable"
+msgstr "сортувальний"
+
+#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547
+#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042
+msgid "with_query"
+msgstr "with_запит"
+
+#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572
+#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591
+#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836
+#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061
+#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078
+#: sql_help.c:5086
+msgid "alias"
+msgstr "псевдонім"
+
+#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603
+#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852
+#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860
+#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090
+#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098
+msgid "from_item"
+msgstr "джерело_даних"
+
+#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928
+msgid "cursor_name"
+msgstr "ім'я_курсору"
+
+#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929
+msgid "output_expression"
+msgstr "вираз_результату"
+
+#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652
+#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045
+msgid "output_name"
+msgstr "ім'я_результату"
+
+#: sql_help.c:3316
+msgid "code"
+msgstr "код"
+
+#: sql_help.c:3721
+msgid "parameter"
+msgstr "параметр"
+
+#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142
+msgid "statement"
+msgstr "оператор"
+
+#: sql_help.c:3778 sql_help.c:4116
+msgid "direction"
+msgstr "напрямок"
+
+#: sql_help.c:3780 sql_help.c:4118
+msgid "where direction can be one of:"
+msgstr "де напрямок може бути одним із:"
+
+#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784
+#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121
+#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562
+#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819
+#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057
+msgid "count"
+msgstr "кількість"
+
+#: sql_help.c:3888 sql_help.c:4337
+msgid "sequence_name"
+msgstr "ім'я_послідовності"
+
+#: sql_help.c:3906 sql_help.c:4355
+msgid "arg_name"
+msgstr "ім'я_аргументу"
+
+#: sql_help.c:3907 sql_help.c:4356
+msgid "arg_type"
+msgstr "тип_аргументу"
+
+#: sql_help.c:3914 sql_help.c:4363
+msgid "loid"
+msgstr "код_вел_об'єкту"
+
+#: sql_help.c:3945
+msgid "remote_schema"
+msgstr "віддалена_схема"
+
+#: sql_help.c:3948
+msgid "local_schema"
+msgstr "локальна_схема"
+
+#: sql_help.c:3983
+msgid "conflict_target"
+msgstr "ціль_конфлікту"
+
+#: sql_help.c:3984
+msgid "conflict_action"
+msgstr "дія_при_конфлікті"
+
+#: sql_help.c:3987
+msgid "where conflict_target can be one of:"
+msgstr "де ціль_конфлікту може бути одним з:"
+
+#: sql_help.c:3988
+msgid "index_column_name"
+msgstr "ім'я_стовпця_індексу"
+
+#: sql_help.c:3989
+msgid "index_expression"
+msgstr "вираз_індексу"
+
+#: sql_help.c:3992
+msgid "index_predicate"
+msgstr "предикат_індексу"
+
+#: sql_help.c:3994
+msgid "and conflict_action is one of:"
+msgstr "і дія_при_конфлікті одна з:"
+
+#: sql_help.c:4000 sql_help.c:4925
+msgid "sub-SELECT"
+msgstr "вкладений-SELECT"
+
+#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901
+msgid "channel"
+msgstr "канал"
+
+#: sql_help.c:4031
+msgid "lockmode"
+msgstr "режим_блокування"
+
+#: sql_help.c:4032
+msgid "where lockmode is one of:"
+msgstr "де режим_блокування один з:"
+
+#: sql_help.c:4068
+msgid "target_table_name"
+msgstr "ім'я_цілі_таблиці"
+
+#: sql_help.c:4069
+msgid "target_alias"
+msgstr "псевдонім_цілі"
+
+#: sql_help.c:4070
+msgid "data_source"
+msgstr "джерело_даних"
+
+#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091
+msgid "join_condition"
+msgstr "умова_поєднання"
+
+#: sql_help.c:4072
+msgid "when_clause"
+msgstr "when_твердження"
+
+#: sql_help.c:4073
+msgid "where data_source is:"
+msgstr "де джерело_даних:"
+
+#: sql_help.c:4074
+msgid "source_table_name"
+msgstr "ім'я_початкова_таблиці"
+
+#: sql_help.c:4075
+msgid "source_query"
+msgstr "джерело_запит"
+
+#: sql_help.c:4076
+msgid "source_alias"
+msgstr "джерело_псевдоніма"
+
+#: sql_help.c:4077
+msgid "and when_clause is:"
+msgstr "і when_clause:"
+
+#: sql_help.c:4079
+msgid "merge_update"
+msgstr "merge_update"
+
+#: sql_help.c:4080
+msgid "merge_delete"
+msgstr "merge_delete"
+
+#: sql_help.c:4082
+msgid "merge_insert"
+msgstr "merge_insert"
+
+#: sql_help.c:4083
+msgid "and merge_insert is:"
+msgstr "і merge_insert:"
+
+#: sql_help.c:4086
+msgid "and merge_update is:"
+msgstr "і merge_update:"
+
+#: sql_help.c:4091
+msgid "and merge_delete is:"
+msgstr "і merge_delete:"
+
+#: sql_help.c:4132
+msgid "payload"
+msgstr "зміст"
+
+#: sql_help.c:4159
+msgid "old_role"
+msgstr "стара_роль"
+
+#: sql_help.c:4160
+msgid "new_role"
+msgstr "нова_роль"
+
+#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413
+msgid "savepoint_name"
+msgstr "ім'я_точки_збереження"
+
+#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868
+#: sql_help.c:5048 sql_help.c:5106
+msgid "grouping_element"
+msgstr "елемент_групування"
+
+#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050
+msgid "window_name"
+msgstr "назва_вікна"
+
+#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051
+msgid "window_definition"
+msgstr "визначення_вікна"
+
+#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660
+#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052
+#: sql_help.c:5066 sql_help.c:5110
+msgid "select"
+msgstr "виберіть"
+
+#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059
+msgid "where from_item can be one of:"
+msgstr "де джерело_даних може бути одним з:"
+
+#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580
+#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833
+#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068
+#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087
+msgid "column_alias"
+msgstr "псевдонім_стовпця"
+
+#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063
+msgid "sampling_method"
+msgstr "метод_вибірки"
+
+#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065
+msgid "seed"
+msgstr "початкове_число"
+
+#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870
+#: sql_help.c:5069 sql_help.c:5108
+msgid "with_query_name"
+msgstr "ім'я_запиту_WITH"
+
+#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841
+#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082
+#: sql_help.c:5085
+msgid "column_definition"
+msgstr "визначення_стовпця"
+
+#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857
+#: sql_help.c:5089 sql_help.c:5095
+msgid "join_type"
+msgstr "тип_поєднання"
+
+#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092
+msgid "join_column"
+msgstr "стовпець_поєднання"
+
+#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093
+msgid "join_using_alias"
+msgstr "join_using_alias"
+
+#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099
+msgid "and grouping_element can be one of:"
+msgstr "і елемент_групування може бути одним з:"
+
+#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107
+msgid "and with_query is:"
+msgstr "і запит_WITH:"
+
+#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111
+msgid "values"
+msgstr "значення"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112
+msgid "insert"
+msgstr "вставка"
+
+#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113
+msgid "update"
+msgstr "оновлення"
+
+#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114
+msgid "delete"
+msgstr "видалення"
+
+#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116
+msgid "search_seq_col_name"
+msgstr "search_seq_col_name"
+
+#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118
+msgid "cycle_mark_col_name"
+msgstr "cycle_mark_col_name"
+
+#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119
+msgid "cycle_mark_value"
+msgstr "cycle_mark_value"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120
+msgid "cycle_mark_default"
+msgstr "cycle_mark_default"
+
+#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121
+msgid "cycle_path_col_name"
+msgstr "cycle_path_col_name"
+
+#: sql_help.c:4653
+msgid "new_table"
+msgstr "нова_таблиця"
+
+#: sql_help.c:4724
+msgid "snapshot_id"
+msgstr "код_знімку"
+
+#: sql_help.c:4984
+msgid "sort_expression"
+msgstr "вираз_сортування"
+
+#: sql_help.c:5128 sql_help.c:6112
+msgid "abort the current transaction"
+msgstr "перервати поточну транзакцію"
+
+#: sql_help.c:5134
+msgid "change the definition of an aggregate function"
+msgstr "змінити визначення агрегатної функції"
+
+#: sql_help.c:5140
+msgid "change the definition of a collation"
+msgstr "змінити визначення правила сортування"
+
+#: sql_help.c:5146
+msgid "change the definition of a conversion"
+msgstr "змінити визначення перетворення"
+
+#: sql_help.c:5152
+msgid "change a database"
+msgstr "змінити базу даних"
+
+#: sql_help.c:5158
+msgid "define default access privileges"
+msgstr "визначити права доступу за замовчуванням"
+
+#: sql_help.c:5164
+msgid "change the definition of a domain"
+msgstr "змінити визначення домену"
+
+#: sql_help.c:5170
+msgid "change the definition of an event trigger"
+msgstr "змінити визначення тригеру події"
+
+#: sql_help.c:5176
+msgid "change the definition of an extension"
+msgstr "змінити визначення розширення"
+
+#: sql_help.c:5182
+msgid "change the definition of a foreign-data wrapper"
+msgstr "змінити визначення джерела сторонніх даних"
+
+#: sql_help.c:5188
+msgid "change the definition of a foreign table"
+msgstr "змінити визначення сторонньої таблиці"
+
+#: sql_help.c:5194
+msgid "change the definition of a function"
+msgstr "змінити визначення функції"
+
+#: sql_help.c:5200
+msgid "change role name or membership"
+msgstr "змінити назву ролі або членства"
+
+#: sql_help.c:5206
+msgid "change the definition of an index"
+msgstr "змінити визначення індексу"
+
+#: sql_help.c:5212
+msgid "change the definition of a procedural language"
+msgstr "змінити визначення процедурної мови"
+
+#: sql_help.c:5218
+msgid "change the definition of a large object"
+msgstr "змінити визначення великого об'єкту"
+
+#: sql_help.c:5224
+msgid "change the definition of a materialized view"
+msgstr "змінити визначення матеріалізованого подання"
+
+#: sql_help.c:5230
+msgid "change the definition of an operator"
+msgstr "змінити визначення оператора"
+
+#: sql_help.c:5236
+msgid "change the definition of an operator class"
+msgstr "змінити визначення класа операторів"
+
+#: sql_help.c:5242
+msgid "change the definition of an operator family"
+msgstr "змінити визначення сімейства операторів"
+
+#: sql_help.c:5248
+msgid "change the definition of a row-level security policy"
+msgstr "змінити визначення політики безпеки на рівні рядків"
+
+#: sql_help.c:5254
+msgid "change the definition of a procedure"
+msgstr "змінити визначення процедури"
+
+#: sql_help.c:5260
+msgid "change the definition of a publication"
+msgstr "змінити визначення публікації"
+
+#: sql_help.c:5266 sql_help.c:5368
+msgid "change a database role"
+msgstr "змінити роль бази даних"
+
+#: sql_help.c:5272
+msgid "change the definition of a routine"
+msgstr "змінити визначення підпрограми"
+
+#: sql_help.c:5278
+msgid "change the definition of a rule"
+msgstr "змінити визначення правила"
+
+#: sql_help.c:5284
+msgid "change the definition of a schema"
+msgstr "змінити визначення схеми"
+
+#: sql_help.c:5290
+msgid "change the definition of a sequence generator"
+msgstr "змінити визначення генератору послідовності"
+
+#: sql_help.c:5296
+msgid "change the definition of a foreign server"
+msgstr "змінити визначення стороннього серверу"
+
+#: sql_help.c:5302
+msgid "change the definition of an extended statistics object"
+msgstr "змінити визначення об'єкту розширеної статистики"
+
+#: sql_help.c:5308
+msgid "change the definition of a subscription"
+msgstr "змінити визначення підписки"
+
+#: sql_help.c:5314
+msgid "change a server configuration parameter"
+msgstr "змінити параметр конфігурації сервера"
+
+#: sql_help.c:5320
+msgid "change the definition of a table"
+msgstr "змінити визначення таблиці"
+
+#: sql_help.c:5326
+msgid "change the definition of a tablespace"
+msgstr "змінити визначення табличного простору"
+
+#: sql_help.c:5332
+msgid "change the definition of a text search configuration"
+msgstr "змінити визначення конфігурації текстового пошуку"
+
+#: sql_help.c:5338
+msgid "change the definition of a text search dictionary"
+msgstr "змінити визначення словника текстового пошуку"
+
+#: sql_help.c:5344
+msgid "change the definition of a text search parser"
+msgstr "змінити визначення парсера текстового пошуку"
+
+#: sql_help.c:5350
+msgid "change the definition of a text search template"
+msgstr "змінити визначення шаблона текстового пошуку"
+
+#: sql_help.c:5356
+msgid "change the definition of a trigger"
+msgstr "змінити визначення тригеру"
+
+#: sql_help.c:5362
+msgid "change the definition of a type"
+msgstr "змінити визначення типу"
+
+#: sql_help.c:5374
+msgid "change the definition of a user mapping"
+msgstr "змінити визначення зіставлень користувачів"
+
+#: sql_help.c:5380
+msgid "change the definition of a view"
+msgstr "змінити визначення подання"
+
+#: sql_help.c:5386
+msgid "collect statistics about a database"
+msgstr "зібрати статистику про базу даних"
+
+#: sql_help.c:5392 sql_help.c:6190
+msgid "start a transaction block"
+msgstr "розпочати транзакцію"
+
+#: sql_help.c:5398
+msgid "invoke a procedure"
+msgstr "викликати процедуру"
+
+#: sql_help.c:5404
+msgid "force a write-ahead log checkpoint"
+msgstr "провести контрольну точку в журналі попереднього запису"
+
+#: sql_help.c:5410
+msgid "close a cursor"
+msgstr "закрити курсор"
+
+#: sql_help.c:5416
+msgid "cluster a table according to an index"
+msgstr "перегрупувати таблицю за індексом"
+
+#: sql_help.c:5422
+msgid "define or change the comment of an object"
+msgstr "задати або змінити коментар об'єкта"
+
+#: sql_help.c:5428 sql_help.c:5986
+msgid "commit the current transaction"
+msgstr "затвердити поточну транзакцію"
+
+#: sql_help.c:5434
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "затвердити транзакцію, раніше підготовлену до двохфазного затвердження"
+
+#: sql_help.c:5440
+msgid "copy data between a file and a table"
+msgstr "копіювати дані між файлом та таблицею"
+
+#: sql_help.c:5446
+msgid "define a new access method"
+msgstr "визначити новий метод доступу"
+
+#: sql_help.c:5452
+msgid "define a new aggregate function"
+msgstr "визначити нову агрегатну функцію"
+
+#: sql_help.c:5458
+msgid "define a new cast"
+msgstr "визначити приведення типів"
+
+#: sql_help.c:5464
+msgid "define a new collation"
+msgstr "визначити нове правило сортування"
+
+#: sql_help.c:5470
+msgid "define a new encoding conversion"
+msgstr "визначити нове перетворення кодування"
+
+#: sql_help.c:5476
+msgid "create a new database"
+msgstr "створити нову базу даних"
+
+#: sql_help.c:5482
+msgid "define a new domain"
+msgstr "визначити новий домен"
+
+#: sql_help.c:5488
+msgid "define a new event trigger"
+msgstr "визначити новий тригер події"
+
+#: sql_help.c:5494
+msgid "install an extension"
+msgstr "встановити розширення"
+
+#: sql_help.c:5500
+msgid "define a new foreign-data wrapper"
+msgstr "визначити нове джерело сторонніх даних"
+
+#: sql_help.c:5506
+msgid "define a new foreign table"
+msgstr "визначити нову сторонню таблицю"
+
+#: sql_help.c:5512
+msgid "define a new function"
+msgstr "визначити нову функцію"
+
+#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680
+msgid "define a new database role"
+msgstr "визначити нову роль бази даних"
+
+#: sql_help.c:5524
+msgid "define a new index"
+msgstr "визначити новий індекс"
+
+#: sql_help.c:5530
+msgid "define a new procedural language"
+msgstr "визначити нову процедурну мову"
+
+#: sql_help.c:5536
+msgid "define a new materialized view"
+msgstr "визначити нове матеріалізоване подання"
+
+#: sql_help.c:5542
+msgid "define a new operator"
+msgstr "визначити новий оператор"
+
+#: sql_help.c:5548
+msgid "define a new operator class"
+msgstr "визначити новий клас оператора"
+
+#: sql_help.c:5554
+msgid "define a new operator family"
+msgstr "визначити нове сімейство операторів"
+
+#: sql_help.c:5560
+msgid "define a new row-level security policy for a table"
+msgstr "визначити нову політику безпеки на рівні рядків для таблиці"
+
+#: sql_help.c:5566
+msgid "define a new procedure"
+msgstr "визначити нову процедуру"
+
+#: sql_help.c:5572
+msgid "define a new publication"
+msgstr "визначити нову публікацію"
+
+#: sql_help.c:5584
+msgid "define a new rewrite rule"
+msgstr "визначити нове правило перезапису"
+
+#: sql_help.c:5590
+msgid "define a new schema"
+msgstr "визначити нову схему"
+
+#: sql_help.c:5596
+msgid "define a new sequence generator"
+msgstr "визначити новий генератор послідовностей"
+
+#: sql_help.c:5602
+msgid "define a new foreign server"
+msgstr "визначити новий сторонній сервер"
+
+#: sql_help.c:5608
+msgid "define extended statistics"
+msgstr "визначити розширену статистику"
+
+#: sql_help.c:5614
+msgid "define a new subscription"
+msgstr "визначити нову підписку"
+
+#: sql_help.c:5620
+msgid "define a new table"
+msgstr "визначити нову таблицю"
+
+#: sql_help.c:5626 sql_help.c:6148
+msgid "define a new table from the results of a query"
+msgstr "визначити нову таблицю з результатів запиту"
+
+#: sql_help.c:5632
+msgid "define a new tablespace"
+msgstr "визначити новий табличний простір"
+
+#: sql_help.c:5638
+msgid "define a new text search configuration"
+msgstr "визначити нову конфігурацію текстового пошуку"
+
+#: sql_help.c:5644
+msgid "define a new text search dictionary"
+msgstr "визначити новий словник текстового пошуку"
+
+#: sql_help.c:5650
+msgid "define a new text search parser"
+msgstr "визначити новий аналізатор текстового пошуку"
+
+#: sql_help.c:5656
+msgid "define a new text search template"
+msgstr "визначити новий шаблон текстового пошуку"
+
+#: sql_help.c:5662
+msgid "define a new transform"
+msgstr "визначити нове перетворення"
+
+#: sql_help.c:5668
+msgid "define a new trigger"
+msgstr "визначити новий тригер"
+
+#: sql_help.c:5674
+msgid "define a new data type"
+msgstr "визначити новий тип даних"
+
+#: sql_help.c:5686
+msgid "define a new mapping of a user to a foreign server"
+msgstr "визначити нове зіставлення користувача для стороннього сервера"
+
+#: sql_help.c:5692
+msgid "define a new view"
+msgstr "визначити нове подання"
+
+#: sql_help.c:5698
+msgid "deallocate a prepared statement"
+msgstr "звільнити підготовлену команду"
+
+#: sql_help.c:5704
+msgid "define a cursor"
+msgstr "визначити курсор"
+
+#: sql_help.c:5710
+msgid "delete rows of a table"
+msgstr "видалити рядки таблиці"
+
+#: sql_help.c:5716
+msgid "discard session state"
+msgstr "очистити стан сесії"
+
+#: sql_help.c:5722
+msgid "execute an anonymous code block"
+msgstr "виконати анонімний блок коду"
+
+#: sql_help.c:5728
+msgid "remove an access method"
+msgstr "видалити метод доступу"
+
+#: sql_help.c:5734
+msgid "remove an aggregate function"
+msgstr "видалити агрегатну функцію"
+
+#: sql_help.c:5740
+msgid "remove a cast"
+msgstr "видалити приведення типів"
+
+#: sql_help.c:5746
+msgid "remove a collation"
+msgstr "видалити правило сортування"
+
+#: sql_help.c:5752
+msgid "remove a conversion"
+msgstr "видалити перетворення"
+
+#: sql_help.c:5758
+msgid "remove a database"
+msgstr "видалити базу даних"
+
+#: sql_help.c:5764
+msgid "remove a domain"
+msgstr "видалити домен"
+
+#: sql_help.c:5770
+msgid "remove an event trigger"
+msgstr "видалити тригер події"
+
+#: sql_help.c:5776
+msgid "remove an extension"
+msgstr "видалити розширення"
+
+#: sql_help.c:5782
+msgid "remove a foreign-data wrapper"
+msgstr "видалити джерело сторонніх даних"
+
+#: sql_help.c:5788
+msgid "remove a foreign table"
+msgstr "видалити сторонню таблицю"
+
+#: sql_help.c:5794
+msgid "remove a function"
+msgstr "видалити функцію"
+
+#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968
+msgid "remove a database role"
+msgstr "видалити роль бази даних"
+
+#: sql_help.c:5806
+msgid "remove an index"
+msgstr "видалити індекс"
+
+#: sql_help.c:5812
+msgid "remove a procedural language"
+msgstr "видалити процедурну мову"
+
+#: sql_help.c:5818
+msgid "remove a materialized view"
+msgstr "видалити матеріалізоване подання"
+
+#: sql_help.c:5824
+msgid "remove an operator"
+msgstr "видалити оператор"
+
+#: sql_help.c:5830
+msgid "remove an operator class"
+msgstr "видалити клас операторів"
+
+#: sql_help.c:5836
+msgid "remove an operator family"
+msgstr "видалити сімейство операторів"
+
+#: sql_help.c:5842
+msgid "remove database objects owned by a database role"
+msgstr "видалити об'єкти бази даних, що належать ролі"
+
+#: sql_help.c:5848
+msgid "remove a row-level security policy from a table"
+msgstr "видалити політику безпеки на рівні рядків з таблиці"
+
+#: sql_help.c:5854
+msgid "remove a procedure"
+msgstr "видалити процедуру"
+
+#: sql_help.c:5860
+msgid "remove a publication"
+msgstr "видалити публікацію"
+
+#: sql_help.c:5872
+msgid "remove a routine"
+msgstr "видалити підпрограму"
+
+#: sql_help.c:5878
+msgid "remove a rewrite rule"
+msgstr "видалити правило перезапису"
+
+#: sql_help.c:5884
+msgid "remove a schema"
+msgstr "видалити схему"
+
+#: sql_help.c:5890
+msgid "remove a sequence"
+msgstr "видалити послідовність"
+
+#: sql_help.c:5896
+msgid "remove a foreign server descriptor"
+msgstr "видалити опис стороннього серверу"
+
+#: sql_help.c:5902
+msgid "remove extended statistics"
+msgstr "видалити розширену статистику"
+
+#: sql_help.c:5908
+msgid "remove a subscription"
+msgstr "видалити підписку"
+
+#: sql_help.c:5914
+msgid "remove a table"
+msgstr "видалити таблицю"
+
+#: sql_help.c:5920
+msgid "remove a tablespace"
+msgstr "видалити табличний простір"
+
+#: sql_help.c:5926
+msgid "remove a text search configuration"
+msgstr "видалити конфігурацію тектового пошуку"
+
+#: sql_help.c:5932
+msgid "remove a text search dictionary"
+msgstr "видалити словник тектового пошуку"
+
+#: sql_help.c:5938
+msgid "remove a text search parser"
+msgstr "видалити парсер тектового пошуку"
+
+#: sql_help.c:5944
+msgid "remove a text search template"
+msgstr "видалити шаблон тектового пошуку"
+
+#: sql_help.c:5950
+msgid "remove a transform"
+msgstr "видалити перетворення"
+
+#: sql_help.c:5956
+msgid "remove a trigger"
+msgstr "видалити тригер"
+
+#: sql_help.c:5962
+msgid "remove a data type"
+msgstr "видалити тип даних"
+
+#: sql_help.c:5974
+msgid "remove a user mapping for a foreign server"
+msgstr "видалити зіставлення користувача для стороннього серверу"
+
+#: sql_help.c:5980
+msgid "remove a view"
+msgstr "видалити подання"
+
+#: sql_help.c:5992
+msgid "execute a prepared statement"
+msgstr "виконати підготовлену команду"
+
+#: sql_help.c:5998
+msgid "show the execution plan of a statement"
+msgstr "показати план виконання команди"
+
+#: sql_help.c:6004
+msgid "retrieve rows from a query using a cursor"
+msgstr "отримати рядки запиту з курсору"
+
+#: sql_help.c:6010
+msgid "define access privileges"
+msgstr "визначити права доступу"
+
+#: sql_help.c:6016
+msgid "import table definitions from a foreign server"
+msgstr "імпортувати визначення таблиць зі стороннього серверу"
+
+#: sql_help.c:6022
+msgid "create new rows in a table"
+msgstr "створити нові рядки в таблиці"
+
+#: sql_help.c:6028
+msgid "listen for a notification"
+msgstr "очікувати на повідомлення"
+
+#: sql_help.c:6034
+msgid "load a shared library file"
+msgstr "завантажити файл спільної бібліотеки"
+
+#: sql_help.c:6040
+msgid "lock a table"
+msgstr "заблокувати таблицю"
+
+#: sql_help.c:6046
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "умовно вставити, оновити або видалити рядки таблиці"
+
+#: sql_help.c:6052
+msgid "position a cursor"
+msgstr "розташувати курсор"
+
+#: sql_help.c:6058
+msgid "generate a notification"
+msgstr "згенерувати повідомлення"
+
+#: sql_help.c:6064
+msgid "prepare a statement for execution"
+msgstr "підготувати команду для виконання"
+
+#: sql_help.c:6070
+msgid "prepare the current transaction for two-phase commit"
+msgstr "підготувати поточну транзакцію для двохфазного затвердження"
+
+#: sql_help.c:6076
+msgid "change the ownership of database objects owned by a database role"
+msgstr "змінити власника об'єктів БД, що належать заданій ролі"
+
+#: sql_help.c:6082
+msgid "replace the contents of a materialized view"
+msgstr "замінити вміст матеріалізованого подання"
+
+#: sql_help.c:6088
+msgid "rebuild indexes"
+msgstr "перебудувати індекси"
+
+#: sql_help.c:6094
+msgid "destroy a previously defined savepoint"
+msgstr "видалити раніше визначену точку збереження"
+
+#: sql_help.c:6100
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "відновити початкове значення параметру виконання"
+
+#: sql_help.c:6106
+msgid "remove access privileges"
+msgstr "видалити права доступу"
+
+#: sql_help.c:6118
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "скасувати транзакцію, раніше підготовлену до двохфазного затвердження"
+
+#: sql_help.c:6124
+msgid "roll back to a savepoint"
+msgstr "відкотитися до точки збереження"
+
+#: sql_help.c:6130
+msgid "define a new savepoint within the current transaction"
+msgstr "визначити нову точку збереження в рамках поточної транзакції"
+
+#: sql_help.c:6136
+msgid "define or change a security label applied to an object"
+msgstr "визначити або змінити мітку безпеки, застосовану до об'єкта"
+
+#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232
+msgid "retrieve rows from a table or view"
+msgstr "отримати рядки з таблиці або подання"
+
+#: sql_help.c:6154
+msgid "change a run-time parameter"
+msgstr "змінити параметр виконання"
+
+#: sql_help.c:6160
+msgid "set constraint check timing for the current transaction"
+msgstr "встановити час перевірки обмеження для поточної транзакції"
+
+#: sql_help.c:6166
+msgid "set the current user identifier of the current session"
+msgstr "встановити ідентифікатор поточного користувача в поточній сесії"
+
+#: sql_help.c:6172
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "встановити ідентифікатор користувача сесії й ідентифікатор поточного користувача в поточній сесії"
+
+#: sql_help.c:6178
+msgid "set the characteristics of the current transaction"
+msgstr "встановити характеристики поточної транзакції"
+
+#: sql_help.c:6184
+msgid "show the value of a run-time parameter"
+msgstr "показати значення параметра виконання"
+
+#: sql_help.c:6202
+msgid "empty a table or set of tables"
+msgstr "очистити таблицю або декілька таблиць"
+
+#: sql_help.c:6208
+msgid "stop listening for a notification"
+msgstr "припинити очікування повідомлень"
+
+#: sql_help.c:6214
+msgid "update rows of a table"
+msgstr "змінити рядки таблиці"
+
+#: sql_help.c:6220
+msgid "garbage-collect and optionally analyze a database"
+msgstr "виконати збір сміття і проаналізувати базу даних"
+
+#: sql_help.c:6226
+msgid "compute a set of rows"
+msgstr "отримати набір рядків"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 можна використовувати лише в неінтерактивному режимі"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "не вдалося відкрити файл журналу \"%s\": %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Введіть \"help\", щоб отримати допомогу.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "не вдалося встановити параметр друку \"%s\""
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" для додаткової інформації."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "зайвий аргумент \"%s\" проігнорований"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "не вдалося знайти ехе файл власної програми"
+
+#: tab-complete.c:5955
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"помилка запиту Tab-доповнення: %s\n"
+"Запит:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "нерозпізнане значення \"%s\" для \"%s\": очікувалося логічне значення"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "неправильне значення \"%s\" для \"%s\": очікувалося ціле число"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "неправильне ім'я змінної: \"%s\""
+
+#: variables.c:419
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"нерозпізнане значення \"%s\" для \"%s\"\n"
+"Допустимі значення: %s."
diff --git a/src/bin/psql/po/zh_CN.po b/src/bin/psql/po/zh_CN.po
new file mode 100644
index 0000000..43eff2c
--- /dev/null
+++ b/src/bin/psql/po/zh_CN.po
@@ -0,0 +1,6476 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:45+0000\n"
+"PO-Revision-Date: 2021-08-16 16:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Poedit-Bookmarks: 175,-1,-1,-1,-1,-1,-1,-1,-1,-1\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.5.7\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的:"
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "无法确认当前目录: %m"
+
+#: ../../common/exec.c:155
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "无效的二进制码 \"%s\""
+
+#: ../../common/exec.c:205
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "无法读取二进制码 \"%s\""
+
+#: ../../common/exec.c:213
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "未能找到一个 \"%s\" 来执行"
+
+#: ../../common/exec.c:269 ../../common/exec.c:308
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "无法跳转到目录 \"%s\" 中: %m"
+
+#: ../../common/exec.c:286
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "无法读取符号链接 \"%s\": %m"
+
+#: ../../common/exec.c:409
+msgid "%s() failed: %m"
+msgstr "%s()失败: %m"
+
+#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659
+#: command.c:1315 command.c:3246 command.c:3295 command.c:3412 input.c:227
+#: mainloop.c:81 mainloop.c:402
+#, c-format
+msgid "out of memory"
+msgstr "内存不足"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "内存不足\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "无法复制空指针 (内部错误)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "无法找到有效的用户ID %ld: %s"
+
+#: ../../common/username.c:45 command.c:565
+msgid "user does not exist"
+msgstr "用户不存在"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "用户名查找失败:错误代码%lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "无法执行命令"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "命令没有找到"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "子进程已退出, 退出码为 %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "子进程被例外(exception) 0x%X 终止"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "子进程被信号 %d 终止: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "子进程已退出, 未知状态 %d"
+
+#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206
+msgid "Cancel request sent\n"
+msgstr "取消发送的请求\n"
+
+#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210
+msgid "Could not send cancel request: "
+msgstr "无法发送取消请求: "
+
+#: ../../fe_utils/print.c:336
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu 行记录)"
+
+#: ../../fe_utils/print.c:3039
+#, c-format
+msgid "Interrupted\n"
+msgstr "已中断\n"
+
+#: ../../fe_utils/print.c:3103
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "无法对表的内容增加标题:已经超过%d列的数量.\n"
+
+#: ../../fe_utils/print.c:3143
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "无法对表的内容添加单元: 总共有%d个单元超过.\n"
+
+#: ../../fe_utils/print.c:3401
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "无效的输出格式 (内部错误): %d"
+
+#: ../../fe_utils/psqlscan.l:697
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "跳过变量 \"%s\"的递归扩展"
+
+#: command.c:230
+#, c-format
+msgid "invalid command \\%s"
+msgstr "无效的命令 \\%s"
+
+#: command.c:232
+#, c-format
+msgid "Try \\? for help."
+msgstr "使用\\?获取帮助."
+
+#: command.c:250
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s:忽略多余的参数 \"%s\""
+
+#: command.c:302
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "忽略\\%s命令;使用\\endif或Ctrl-C退出当前\\if块"
+
+#: command.c:563
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "无法获取用户ID %ld: %s对应的home 目录"
+
+#: command.c:581
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: 无法切换目录至 \"%s\": %m"
+
+#: command.c:606
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "你目前没有连接到数据库.\n"
+
+#: command.c:616
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "以用户 \"%2$s\" 的身份, 在地址\"%3$s\", 端口\"%4$s\"连接到数据库 \"%1$s\"\n"
+
+#: command.c:619
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "以用户 \"%2$s\" 的身份,通过套接字\"%3$s\"在端口\"%4$s\"连接到数据库 \"%1$s\"\n"
+
+#: command.c:625
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "以用户 \"%2$s\" 的身份, 在主机\"%3$s\" (地址 \"%4$s\"), 端口\"%5$s\"连接到数据库 \"%1$s\".\n"
+
+#: command.c:628
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "以用户 \"%2$s\" 的身份, 在主机\"%3$s\", 端口\"%4$s\"连接到数据库 \"%1$s\"\n"
+
+#: command.c:1012 command.c:1121 command.c:2602
+#, c-format
+msgid "no query buffer"
+msgstr "没有查询缓存区"
+
+#: command.c:1045 command.c:5304
+#, c-format
+msgid "invalid line number: %s"
+msgstr "行号无效: %s"
+
+#: command.c:1112
+#, c-format
+msgid "The server (version %s) does not support editing function source."
+msgstr "服务器(版本%s)不支持编辑函数源码."
+
+#: command.c:1115
+#, c-format
+msgid "The server (version %s) does not support editing view definitions."
+msgstr "服务器(版本%s)不支持编辑视图定义."
+
+#: command.c:1197
+msgid "No changes"
+msgstr "没有发生更改"
+
+#: command.c:1276
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s:无效的编码名称或找不到转换程序"
+
+#: command.c:1311 command.c:2052 command.c:3242 command.c:3434 command.c:5406
+#: common.c:174 common.c:223 common.c:392 common.c:1248 common.c:1276
+#: common.c:1385 common.c:1492 common.c:1530 copy.c:488 copy.c:709 help.c:62
+#: large_obj.c:157 large_obj.c:192 large_obj.c:254 startup.c:298
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1318
+msgid "There is no previous error."
+msgstr "没有之前的错误。"
+
+#: command.c:1431
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s:缺少一个右括弧"
+
+#: command.c:1608 command.c:1913 command.c:1927 command.c:1944 command.c:2106
+#: command.c:2342 command.c:2569 command.c:2609
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s:缺少所需参数"
+
+#: command.c:1739
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif:不能出现在\\else之后"
+
+#: command.c:1744
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: 不匹配\\if"
+
+#: command.c:1808
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: 不能出现在 \\else"
+
+#: command.c:1813
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: 不匹配\\if"
+
+#: command.c:1853
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif:不匹配\\if"
+
+#: command.c:2008
+msgid "Query buffer is empty."
+msgstr "查询缓存区是空的."
+
+#: command.c:2030
+msgid "Enter new password: "
+msgstr "输入新的密码:"
+
+#: command.c:2031
+msgid "Enter it again: "
+msgstr "再输入一遍:"
+
+#: command.c:2035
+#, c-format
+msgid "Passwords didn't match."
+msgstr "口令不匹配."
+
+#: command.c:2135
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s:无法读取变量的值"
+
+#: command.c:2238
+msgid "Query buffer reset (cleared)."
+msgstr "查询缓存区重置(已清空)."
+
+#: command.c:2260
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "写入历史记录到文件 \"%s\".\n"
+
+#: command.c:2347
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: 环境变量不能包含 \"=\""
+
+#: command.c:2399
+#, c-format
+msgid "The server (version %s) does not support showing function source."
+msgstr "服务器(版本%s)不支持显示函数源码."
+
+#: command.c:2402
+#, c-format
+msgid "The server (version %s) does not support showing view definitions."
+msgstr "服务器(版本%s)不支持显示视图定义."
+
+#: command.c:2409
+#, c-format
+msgid "function name is required"
+msgstr "需要函数名"
+
+#: command.c:2411
+#, c-format
+msgid "view name is required"
+msgstr "需要视图名"
+
+#: command.c:2541
+msgid "Timing is on."
+msgstr "启用计时功能."
+
+#: command.c:2543
+msgid "Timing is off."
+msgstr "停止计时功能."
+
+#: command.c:2628 command.c:2656 command.c:3873 command.c:3876 command.c:3879
+#: command.c:3885 command.c:3887 command.c:3913 command.c:3923 command.c:3935
+#: command.c:3949 command.c:3976 command.c:4034 common.c:70 copy.c:331
+#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:3047 startup.c:237 startup.c:287
+msgid "Password: "
+msgstr "口令: "
+
+#: command.c:3052 startup.c:284
+#, c-format
+msgid "Password for user %s: "
+msgstr "用户 %s 的口令:"
+
+#: command.c:3104
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "使用连接字符串时,不要单独提供用户、主机或端口"
+
+#: command.c:3139
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "不存在可从中重复使用参数的数据库连接"
+
+#: command.c:3440
+#, c-format
+msgid "Previous connection kept"
+msgstr "保留上一次连接"
+
+#: command.c:3446
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\连接:%s"
+
+#: command.c:3502
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "您现在已经连接到数据库 \"%s\", 用户 \"%s\",地址 \"%s\",端口号 \"%s\".\n"
+
+#: command.c:3505
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "您现在已经连接到数据库 \"%s\", 用户名 \"%s\" , 套接字 \"%s\", 端口号 \"%s\".\n"
+
+#: command.c:3511
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "您现在已经连接到数据库 \"%s\", 用户 \"%s\",主机 \"%s\"(地址 \"%s\"),端口号 \"%s\".\n"
+
+#: command.c:3514
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "您现在已经连接到数据库 \"%s\", 用户 \"%s\",主机 \"%s\",端口号 \"%s\".\n"
+
+#: command.c:3519
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "您现在已经连接到数据库 \"%s\",用户 \"%s\".\n"
+
+#: command.c:3559
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, 服务器 %s)\n"
+
+#: command.c:3567
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"警告:%s 主版本%s,服务器主版本为%s.\n"
+" 一些psql功能可能无法正常使用.\n"
+
+#: command.c:3606
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n"
+msgstr "SSL 连接(协议:%s,密码:%s,密钥位:%s,压缩:%s)\n"
+
+#: command.c:3607 command.c:3608 command.c:3609
+msgid "unknown"
+msgstr "未知"
+
+#: command.c:3610 help.c:45
+msgid "off"
+msgstr "关闭"
+
+#: command.c:3610 help.c:45
+msgid "on"
+msgstr "开启"
+
+#: command.c:3624
+msgid "GSSAPI-encrypted connection\n"
+msgstr "GSSAPI加密连接\n"
+
+#: command.c:3644
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"警告:来自 Windows 代码页 (%u) 的控制台代码页 (%u) 的差异\n"
+" 8-bit 字符可能无法正常工作。请查阅 psql 参考\n"
+" 页 \"Windows 用户注意事项\" 的详细说明.\n"
+
+#: command.c:3749
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "必须设置环境变量 PSQL_EDITOR_LINENUMBER_ARG,用于指定行号"
+
+#: command.c:3778
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "无法启动编辑器 \"%s\""
+
+#: command.c:3780
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "无法启动 /bin/sh"
+
+#: command.c:3830
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "找不到临时目录:%s"
+
+#: command.c:3857
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "无法打开临时文件 \"%s\": %m"
+
+#: command.c:4193
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset:模糊的缩写\"%s\"同时匹配\"%s\"和\"%s\""
+
+#: command.c:4213
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: 允许的格式是 aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4232
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: 所允许使用的文本风格是ascii, old-ascii, unicode"
+
+#: command.c:4247
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset:允许的 Unicode 边界线型是 single 和 double"
+
+#: command.c:4262
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset:允许的 Unicode 列线型是 single 和 double"
+
+#: command.c:4277
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset:允许的 Unicode 页眉线型是 single 和 double"
+
+#: command.c:4320
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep必须是单字节字符"
+
+#: command.c:4325
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep不能是双引号、换行符或回车符"
+
+#: command.c:4462 command.c:4650
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: 不明选项: %s"
+
+#: command.c:4482
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "边缘风格是 %d.\n"
+
+#: command.c:4488
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "目标宽度未设置.\n"
+
+#: command.c:4490
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "目标宽度为 %d.\n"
+
+#: command.c:4497
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "扩展显示已打开.\n"
+
+#: command.c:4499
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "扩展显示已自动打开.\n"
+
+#: command.c:4501
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "扩展显示已关闭.\n"
+
+#: command.c:4507
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "CSV的字段分隔符是\"%s\".\n"
+
+#: command.c:4515 command.c:4523
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "栏位分隔符号是0字节\n"
+
+#: command.c:4517
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "栏位分隔符号是 \"%s\".\n"
+
+#: command.c:4530
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "打开默认步进器.\n"
+
+#: command.c:4532
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "关闭默认步进器.\n"
+
+#: command.c:4538
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "输出格式是 %s.\n"
+
+#: command.c:4544
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "文本的风格是%s. \n"
+
+#: command.c:4551
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr " \"%s\" 是空值显示.\n"
+
+#: command.c:4559
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "启动语言环境调整后的数值输出.\n"
+
+#: command.c:4561
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "关闭语言环境调整后的数值输出.\n"
+
+#: command.c:4568
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "显示大量数据时使用分页器.\n"
+
+#: command.c:4570
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "总是使用分页器.\n"
+
+#: command.c:4572
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "不使用分页器.\n"
+
+#: command.c:4578
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "分页器不能被用于少于%d行.\n"
+
+#: command.c:4588 command.c:4598
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "记录分隔符号是 0字节.\n"
+
+#: command.c:4590
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "记录分隔符号是 <newline>.\n"
+
+#: command.c:4592
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "记录分隔符号是 \"%s\".\n"
+
+#: command.c:4605
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "表属性是 \"%s\".\n"
+
+#: command.c:4608
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "未设置数据表属性.\n"
+
+#: command.c:4615
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "标题是 \"%s\".\n"
+
+#: command.c:4617
+#, c-format
+msgid "Title is unset.\n"
+msgstr "无标题.\n"
+
+#: command.c:4624
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "开启只显示元组.\n"
+
+#: command.c:4626
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "关闭只显示元组.\n"
+
+#: command.c:4632
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Unicode 边界线型是 \"%s\".\n"
+
+#: command.c:4638
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Unicode 列线型是 \"%s\".\n"
+
+#: command.c:4644
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Unicode 页眉线型是 \"%s\".\n"
+
+#: command.c:4877
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!:失败"
+
+#: command.c:4902 common.c:652
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch命令不能用于空查询"
+
+#: command.c:4943
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (每 %gs)\n"
+
+#: command.c:4946
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (每 %gs)\n"
+
+#: command.c:5000 command.c:5007 common.c:552 common.c:559 common.c:1231
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* 查询 **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5199
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\"不是一个视图"
+
+#: command.c:5215
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "无法解析 reloptions 数组"
+
+#: common.c:159
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "没有数据库连接时无法转义"
+
+#: common.c:200
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "shell命令参数包含换行符或回车符: \"%s\""
+
+#: common.c:304
+#, c-format
+msgid "connection to server was lost"
+msgstr "与数据库的连接已经断开"
+
+#: common.c:308
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "与服务器的连接已断开,正在试图重置: "
+
+#: common.c:313
+#, c-format
+msgid "Failed.\n"
+msgstr "失败。\n"
+
+#: common.c:330
+#, c-format
+msgid "Succeeded.\n"
+msgstr "完成。\n"
+
+#: common.c:382 common.c:949 common.c:1166
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "意外的 PQresultStatus: %d"
+
+#: common.c:491
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "时间:%.3f ms\n"
+
+#: common.c:506
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "时间:%.3f ms (%02d:%06.3f)\n"
+
+#: common.c:515
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "时间: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:522
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "时间:%.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:546 common.c:604 common.c:1202
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "你目前没有连接到数据库."
+
+#: common.c:659
+#, c-format
+msgid "\\watch cannot be used with COPY"
+msgstr "\\watch不能用于COPY命令中"
+
+#: common.c:664
+#, c-format
+msgid "unexpected result status for \\watch"
+msgstr "\\Watch出现意外的结果状态"
+
+#: common.c:694
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "从PID为%3$d的服务器进程接收到带有字节流量\"%2$s\"的异步通知消息\"%1$s\".\n"
+
+#: common.c:697
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "收到来自服务器 \"%s\" 进程 PID %d 非同步通知。\n"
+
+#: common.c:730 common.c:747
+msgid "could not print result table: %m"
+msgstr "无法打印结果表: %m"
+
+#: common.c:768
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "\\gset没有记录行返回"
+
+#: common.c:773
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "\\gset返回超过1个记录行"
+
+#: common.c:791
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "试图\\gset为经过特殊处理的变量\"%s\"已忽略"
+
+#: common.c:1211
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(单步模式:验证命令)*******************************************\n"
+"%s\n"
+"***(按 Enter 键继续或键入 x 来取消)********************\n"
+
+#: common.c:1266
+#, c-format
+msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK."
+msgstr "服务器(版本 %s)不支持保存点(Savepoint)ON_ERROR_ROLLBACK."
+
+#: common.c:1329
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "语句: %s"
+
+#: common.c:1373
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "意外的事务状态值 (%d)"
+
+#: common.c:1514 describe.c:2179
+msgid "Column"
+msgstr "栏位"
+
+#: common.c:1515 describe.c:178 describe.c:396 describe.c:414 describe.c:459
+#: describe.c:476 describe.c:1128 describe.c:1292 describe.c:1878
+#: describe.c:1902 describe.c:2180 describe.c:4048 describe.c:4271
+#: describe.c:4496 describe.c:5794
+msgid "Type"
+msgstr "类型"
+
+#: common.c:1564
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "命令没有结果,或者结果没有列.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy:需要参数"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy:在 \"%s\" 发生解读错误"
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy:在行尾发生解读错误"
+
+#: copy.c:328
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "无法执行命令 \"%s\": %m"
+
+#: copy.c:344
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "无法取文件 \"%s\" 的状态: %m"
+
+#: copy.c:348
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s:无法从目录复制或复制到目录"
+
+#: copy.c:385
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "无法为外部命令: %m关闭管道"
+
+#: copy.c:390
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: copy.c:453 copy.c:463
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "无法写入 COPY 数据:%m"
+
+#: copy.c:469
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "COPY 数据转换失败:%s"
+
+#: copy.c:530
+msgid "canceled by user"
+msgstr "依用户取消"
+
+#: copy.c:541
+msgid ""
+"Enter data to be copied followed by a newline.\n"
+"End with a backslash and a period on a line by itself, or an EOF signal."
+msgstr ""
+"输入要复制的数据并且换行。\n"
+"在独立的一行上输入一个反斜线和一个句点结束,或者以一个EOF信号结束."
+
+#: copy.c:671
+msgid "aborted because of read failure"
+msgstr "因读取失败已被中止"
+
+#: copy.c:705
+msgid "trying to exit copy mode"
+msgstr "正在尝试退出"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview:语句未返回结果集"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview:查询必须返回至少三列"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: 垂直和水平表头必须是不同的列"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: 当查询返回三列以上时,必须指定数据列"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: 超过最大列数(%d)"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: 查询结果包含行\"%s\"、列\"%s\"的多个数据值"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: 列号码 %d 超出了范围 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: 不明确的列名: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: 找不到列名: \"%s\""
+
+#: describe.c:76 describe.c:376 describe.c:728 describe.c:924 describe.c:1120
+#: describe.c:1281 describe.c:1353 describe.c:4036 describe.c:4258
+#: describe.c:4494 describe.c:4585 describe.c:4731 describe.c:4944
+#: describe.c:5104 describe.c:5345 describe.c:5420 describe.c:5431
+#: describe.c:5493 describe.c:5918 describe.c:6001
+msgid "Schema"
+msgstr "架构模式"
+
+#: describe.c:77 describe.c:175 describe.c:243 describe.c:251 describe.c:377
+#: describe.c:729 describe.c:925 describe.c:1038 describe.c:1121
+#: describe.c:1354 describe.c:4037 describe.c:4259 describe.c:4417
+#: describe.c:4495 describe.c:4586 describe.c:4665 describe.c:4732
+#: describe.c:4945 describe.c:5029 describe.c:5105 describe.c:5346
+#: describe.c:5421 describe.c:5432 describe.c:5494 describe.c:5691
+#: describe.c:5775 describe.c:5999 describe.c:6171 describe.c:6411
+msgid "Name"
+msgstr "名称"
+
+#: describe.c:78 describe.c:389 describe.c:407 describe.c:453 describe.c:470
+msgid "Result data type"
+msgstr "结果数据类型"
+
+#: describe.c:86 describe.c:99 describe.c:103 describe.c:390 describe.c:408
+#: describe.c:454 describe.c:471
+msgid "Argument data types"
+msgstr "参数数据类型"
+
+#: describe.c:111 describe.c:118 describe.c:186 describe.c:274 describe.c:523
+#: describe.c:777 describe.c:940 describe.c:1063 describe.c:1356
+#: describe.c:2200 describe.c:3823 describe.c:4108 describe.c:4305
+#: describe.c:4448 describe.c:4522 describe.c:4595 describe.c:4678
+#: describe.c:4853 describe.c:4972 describe.c:5038 describe.c:5106
+#: describe.c:5247 describe.c:5289 describe.c:5362 describe.c:5424
+#: describe.c:5433 describe.c:5495 describe.c:5717 describe.c:5797
+#: describe.c:5932 describe.c:6002 large_obj.c:290 large_obj.c:300
+msgid "Description"
+msgstr "描述"
+
+#: describe.c:136
+msgid "List of aggregate functions"
+msgstr "聚集函数列表"
+
+#: describe.c:161
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "服务器(版本%s) 不支持访问方法."
+
+#: describe.c:176
+msgid "Index"
+msgstr "索引"
+
+#: describe.c:177 describe.c:4056 describe.c:4284 describe.c:5919
+msgid "Table"
+msgstr "数据表"
+
+#: describe.c:185 describe.c:5696
+msgid "Handler"
+msgstr "处理函数"
+
+#: describe.c:204
+msgid "List of access methods"
+msgstr "访问方法列表"
+
+#: describe.c:230
+#, c-format
+msgid "The server (version %s) does not support tablespaces."
+msgstr "服务器(版本%s) 不支持使用表空间."
+
+#: describe.c:244 describe.c:252 describe.c:504 describe.c:767 describe.c:1039
+#: describe.c:1280 describe.c:4049 describe.c:4260 describe.c:4421
+#: describe.c:4667 describe.c:5030 describe.c:5692 describe.c:5776
+#: describe.c:6172 describe.c:6309 describe.c:6412 describe.c:6535
+#: describe.c:6613 large_obj.c:289
+msgid "Owner"
+msgstr "拥有者"
+
+#: describe.c:245 describe.c:253
+msgid "Location"
+msgstr "所在地"
+
+#: describe.c:264 describe.c:3639
+msgid "Options"
+msgstr "选项"
+
+#: describe.c:269 describe.c:740 describe.c:1055 describe.c:4100
+#: describe.c:4104
+msgid "Size"
+msgstr "大小"
+
+#: describe.c:291
+msgid "List of tablespaces"
+msgstr "表空间列表"
+
+#: describe.c:336
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df 只能将 [anptwS+]作为选项"
+
+#: describe.c:344 describe.c:355
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df 不能有带着服务器版本%2$s 的选项\"%1$c\""
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:392 describe.c:410 describe.c:456 describe.c:473
+msgid "agg"
+msgstr "agg"
+
+#: describe.c:393 describe.c:411
+msgid "window"
+msgstr "窗口"
+
+#: describe.c:394
+msgid "proc"
+msgstr "proc"
+
+#: describe.c:395 describe.c:413 describe.c:458 describe.c:475
+msgid "func"
+msgstr "函数"
+
+#: describe.c:412 describe.c:457 describe.c:474 describe.c:1490
+msgid "trigger"
+msgstr "触发器"
+
+#: describe.c:486
+msgid "immutable"
+msgstr "不可更改"
+
+#: describe.c:487
+msgid "stable"
+msgstr "稳定"
+
+#: describe.c:488
+msgid "volatile"
+msgstr "不稳定性"
+
+#: describe.c:489
+msgid "Volatility"
+msgstr "挥发性"
+
+#: describe.c:497
+msgid "restricted"
+msgstr "受限制的"
+
+#: describe.c:498
+msgid "safe"
+msgstr "安全的"
+
+#: describe.c:499
+msgid "unsafe"
+msgstr "不安全的"
+
+#: describe.c:500
+msgid "Parallel"
+msgstr "平行"
+
+#: describe.c:505
+msgid "definer"
+msgstr "定义者"
+
+#: describe.c:506
+msgid "invoker"
+msgstr "调用者"
+
+#: describe.c:507
+msgid "Security"
+msgstr "安全"
+
+#: describe.c:512
+msgid "Language"
+msgstr "程序语言"
+
+#: describe.c:516 describe.c:520
+msgid "Source code"
+msgstr "原始程式"
+
+#: describe.c:691
+msgid "List of functions"
+msgstr "函数列表"
+
+#: describe.c:739
+msgid "Internal name"
+msgstr "内部名称"
+
+#: describe.c:761
+msgid "Elements"
+msgstr "成员"
+
+#: describe.c:822
+msgid "List of data types"
+msgstr "数据类型列表"
+
+#: describe.c:926
+msgid "Left arg type"
+msgstr "左参数类型"
+
+#: describe.c:927
+msgid "Right arg type"
+msgstr "右参数类型"
+
+#: describe.c:928
+msgid "Result type"
+msgstr "结果类型"
+
+#: describe.c:933 describe.c:4673 describe.c:4830 describe.c:4836
+#: describe.c:5246 describe.c:6784 describe.c:6788
+msgid "Function"
+msgstr "函数"
+
+#: describe.c:1010
+msgid "List of operators"
+msgstr "运算子列表"
+
+#: describe.c:1040
+msgid "Encoding"
+msgstr "字元编码"
+
+#: describe.c:1045 describe.c:4946
+msgid "Collate"
+msgstr "校对规则"
+
+#: describe.c:1046 describe.c:4947
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:1059
+msgid "Tablespace"
+msgstr "表空间"
+
+#: describe.c:1081
+msgid "List of databases"
+msgstr "数据库列表"
+
+#: describe.c:1122 describe.c:1283 describe.c:4038
+msgid "table"
+msgstr "数据表"
+
+#: describe.c:1123 describe.c:4039
+msgid "view"
+msgstr "视图"
+
+#: describe.c:1124 describe.c:4040
+msgid "materialized view"
+msgstr "物化视图"
+
+#: describe.c:1125 describe.c:1285 describe.c:4042
+msgid "sequence"
+msgstr "序列数"
+
+#: describe.c:1126 describe.c:4045
+msgid "foreign table"
+msgstr "所引用的外表"
+
+#: describe.c:1127 describe.c:4046 describe.c:4269
+msgid "partitioned table"
+msgstr "分区表"
+
+#: describe.c:1139
+msgid "Column privileges"
+msgstr "列特权"
+
+#: describe.c:1170 describe.c:1204
+msgid "Policies"
+msgstr "策略"
+
+#: describe.c:1236 describe.c:6476 describe.c:6480
+msgid "Access privileges"
+msgstr "存取权限"
+
+#: describe.c:1267
+#, c-format
+msgid "The server (version %s) does not support altering default privileges."
+msgstr "服务器(版本%s)不支持修改默认权限."
+
+#: describe.c:1287
+msgid "function"
+msgstr "函数"
+
+#: describe.c:1289
+msgid "type"
+msgstr "类型Ctype"
+
+#: describe.c:1291
+msgid "schema"
+msgstr "架构模式"
+
+#: describe.c:1315
+msgid "Default access privileges"
+msgstr "默认的访问权限"
+
+#: describe.c:1355
+msgid "Object"
+msgstr "对象"
+
+#: describe.c:1369
+msgid "table constraint"
+msgstr "表约束"
+
+#: describe.c:1391
+msgid "domain constraint"
+msgstr "域约束"
+
+#: describe.c:1419
+msgid "operator class"
+msgstr "操作符类"
+
+#: describe.c:1448
+msgid "operator family"
+msgstr "操作符家族"
+
+#: describe.c:1470
+msgid "rule"
+msgstr "规则"
+
+#: describe.c:1512
+msgid "Object descriptions"
+msgstr "对象描述"
+
+#: describe.c:1568 describe.c:4175
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "没有找到任何名称为 \"%s\" 的关联."
+
+#: describe.c:1571 describe.c:4178
+#, c-format
+msgid "Did not find any relations."
+msgstr "没有找到任何关系."
+
+#: describe.c:1827
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "没有找到任何OID为 %s 的关联."
+
+#: describe.c:1879 describe.c:1903
+msgid "Start"
+msgstr "起始值"
+
+#: describe.c:1880 describe.c:1904
+msgid "Minimum"
+msgstr "最小值"
+
+#: describe.c:1881 describe.c:1905
+msgid "Maximum"
+msgstr "最大值"
+
+#: describe.c:1882 describe.c:1906
+msgid "Increment"
+msgstr "增量"
+
+#: describe.c:1883 describe.c:1907 describe.c:2038 describe.c:4589
+#: describe.c:4847 describe.c:4961 describe.c:4966 describe.c:6523
+msgid "yes"
+msgstr "是"
+
+#: describe.c:1884 describe.c:1908 describe.c:2039 describe.c:4589
+#: describe.c:4844 describe.c:4961 describe.c:6524
+msgid "no"
+msgstr "否"
+
+#: describe.c:1885 describe.c:1909
+msgid "Cycles?"
+msgstr "循环?"
+
+#: describe.c:1886 describe.c:1910
+msgid "Cache"
+msgstr "缓存"
+
+#: describe.c:1953
+#, c-format
+msgid "Owned by: %s"
+msgstr "属于: %s"
+
+#: describe.c:1957
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "标识列的序列: %s"
+
+#: describe.c:1964
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "序列数 \"%s.%s\""
+
+#: describe.c:2111
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "不记录日志的表 \"%s.%s\""
+
+#: describe.c:2114
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "数据表 \"%s.%s\""
+
+#: describe.c:2118
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "视图 \"%s.%s\""
+
+#: describe.c:2123
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "不记录日志的物化视图 \"%s.%s\""
+
+#: describe.c:2126
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "物化视图 \"%s.%s\""
+
+#: describe.c:2131
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "不记录日志的索引 \"%s.%s\""
+
+#: describe.c:2134
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "索引 \"%s.%s\""
+
+#: describe.c:2139
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "不记录日志的分区索引 \"%s.%s\""
+
+#: describe.c:2142
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "分区索引 \"%s.%s\""
+
+#: describe.c:2147
+#, c-format
+msgid "Special relation \"%s.%s\""
+msgstr "特殊关联 \"%s.%s\""
+
+#: describe.c:2151
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST 数据表 \"%s.%s\""
+
+#: describe.c:2155
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "合成类型 \"%s.%s\""
+
+#: describe.c:2159
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "引用的外部表 \"%s.%s\""
+
+#: describe.c:2164
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "不记录日志的分区表 \"%s.%s\""
+
+#: describe.c:2167
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "分区表 \"%s.%s\""
+
+#: describe.c:2183 describe.c:4502
+msgid "Collation"
+msgstr "校对规则"
+
+#: describe.c:2184 describe.c:4509
+msgid "Nullable"
+msgstr "可空的"
+
+#: describe.c:2185 describe.c:4510
+msgid "Default"
+msgstr "预设"
+
+#: describe.c:2188
+msgid "Key?"
+msgstr "键值?"
+
+#: describe.c:2190 describe.c:4739 describe.c:4750
+msgid "Definition"
+msgstr "定义"
+
+#: describe.c:2192 describe.c:5712 describe.c:5796 describe.c:5867
+#: describe.c:5931
+msgid "FDW options"
+msgstr "FDW选项"
+
+#: describe.c:2194
+msgid "Storage"
+msgstr "存储"
+
+#: describe.c:2196
+msgid "Compression"
+msgstr "压缩"
+
+#: describe.c:2198
+msgid "Stats target"
+msgstr "统计目标"
+
+#: describe.c:2334
+msgid "Partition of: %s %s%s"
+msgstr "分区: %s %s%s"
+
+#: describe.c:2347
+msgid "No partition constraint"
+msgstr "无分区约束"
+
+#: describe.c:2349
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "分区约束: %s"
+
+#: describe.c:2373
+#, c-format
+msgid "Partition key: %s"
+msgstr "分区键值: %s"
+
+#: describe.c:2399
+msgid "Owning table: \"%s.%s\""
+msgstr "拥有表: \"%s.%s\""
+
+#: describe.c:2470
+msgid "primary key, "
+msgstr "主键(PK),"
+
+#: describe.c:2472
+msgid "unique, "
+msgstr "唯一的,"
+
+#: describe.c:2478
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "给数据表 \"%s.%s\""
+
+#: describe.c:2482
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", 叙述 (%s)"
+
+#: describe.c:2485
+msgid ", clustered"
+msgstr ", 已丛集"
+
+#: describe.c:2488
+msgid ", invalid"
+msgstr ", 无效的"
+
+#: describe.c:2491
+msgid ", deferrable"
+msgstr ",可延迟"
+
+#: describe.c:2494
+msgid ", initially deferred"
+msgstr ",开始被延迟"
+
+#: describe.c:2497
+msgid ", replica identity"
+msgstr ",复制标识"
+
+#: describe.c:2564
+msgid "Indexes:"
+msgstr "索引:"
+
+#: describe.c:2648
+msgid "Check constraints:"
+msgstr "检查约束限制"
+
+#: describe.c:2716
+msgid "Foreign-key constraints:"
+msgstr "外部键(FK)限制:"
+
+#: describe.c:2779
+msgid "Referenced by:"
+msgstr "由引用:"
+
+#: describe.c:2829
+msgid "Policies:"
+msgstr "策略:"
+
+#: describe.c:2832
+msgid "Policies (forced row security enabled):"
+msgstr "策略(强制行安全性启用):"
+
+#: describe.c:2835
+msgid "Policies (row security enabled): (none)"
+msgstr "策略(行安全性启用):(无)"
+
+#: describe.c:2838
+msgid "Policies (forced row security enabled): (none)"
+msgstr "策略(强制行安全性启用):(无)"
+
+#: describe.c:2841
+msgid "Policies (row security disabled):"
+msgstr "策略(行安全性禁用):"
+
+#: describe.c:2902 describe.c:3006
+msgid "Statistics objects:"
+msgstr "统计信息对象:"
+
+#: describe.c:3120 describe.c:3224
+msgid "Rules:"
+msgstr "规则:"
+
+#: describe.c:3123
+msgid "Disabled rules:"
+msgstr "已停用规则:"
+
+#: describe.c:3126
+msgid "Rules firing always:"
+msgstr "永远触发规则"
+
+#: describe.c:3129
+msgid "Rules firing on replica only:"
+msgstr "只有在复制时触发规则:"
+
+#: describe.c:3169
+msgid "Publications:"
+msgstr "发布:"
+
+#: describe.c:3207
+msgid "View definition:"
+msgstr "视图定义:"
+
+#: describe.c:3354
+msgid "Triggers:"
+msgstr "触发器:"
+
+#: describe.c:3358
+msgid "Disabled user triggers:"
+msgstr "禁用用户触发器:"
+
+#: describe.c:3360
+msgid "Disabled triggers:"
+msgstr "停用触发器:"
+
+#: describe.c:3363
+msgid "Disabled internal triggers:"
+msgstr "禁用内部触发器:"
+
+#: describe.c:3366
+msgid "Triggers firing always:"
+msgstr "永远激活触发器"
+
+#: describe.c:3369
+msgid "Triggers firing on replica only:"
+msgstr "只有在复制时激活触发器"
+
+#: describe.c:3441
+#, c-format
+msgid "Server: %s"
+msgstr "服务器 %s"
+
+#: describe.c:3449
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW选项: (%s)"
+
+#: describe.c:3470
+msgid "Inherits"
+msgstr "继承"
+
+#: describe.c:3543
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "分区数: %d"
+
+#: describe.c:3552
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "分区的数量:%d(可以使用 \\d+ 来列出它们)"
+
+#: describe.c:3554
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "子表的数量:%d(可以使用 \\d+ 来列出它们)"
+
+#: describe.c:3561
+msgid "Child tables"
+msgstr "子表"
+
+#: describe.c:3561
+msgid "Partitions"
+msgstr "分区"
+
+#: describe.c:3592
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "类型的已确定类型表(typed table):%s"
+
+#: describe.c:3608
+msgid "Replica Identity"
+msgstr "复制标识"
+
+#: describe.c:3621
+msgid "Has OIDs: yes"
+msgstr "有 OIDs:yes"
+
+#: describe.c:3630
+#, c-format
+msgid "Access method: %s"
+msgstr "访问方法 %s"
+
+#: describe.c:3710
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "表空间:\"%s\""
+
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:3722
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", 表空间 \"%s\""
+
+#: describe.c:3815
+msgid "List of roles"
+msgstr "角色列表"
+
+#: describe.c:3817
+msgid "Role name"
+msgstr "角色名称"
+
+#: describe.c:3818
+msgid "Attributes"
+msgstr "属性"
+
+#: describe.c:3820
+msgid "Member of"
+msgstr "成员属于"
+
+#: describe.c:3831
+msgid "Superuser"
+msgstr "超级用户"
+
+#: describe.c:3834
+msgid "No inheritance"
+msgstr "没有继承"
+
+#: describe.c:3837
+msgid "Create role"
+msgstr "建立角色"
+
+#: describe.c:3840
+msgid "Create DB"
+msgstr "建立 DB"
+
+#: describe.c:3843
+msgid "Cannot login"
+msgstr "无法登录"
+
+#: describe.c:3847
+msgid "Replication"
+msgstr "复制"
+
+#: describe.c:3851
+msgid "Bypass RLS"
+msgstr "绕过RLS"
+
+#: describe.c:3860
+msgid "No connections"
+msgstr "没有连接"
+
+#: describe.c:3862
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d个连接"
+
+#: describe.c:3872
+msgid "Password valid until "
+msgstr "密码有效直至"
+
+#: describe.c:3922
+#, c-format
+msgid "The server (version %s) does not support per-database role settings."
+msgstr "服务器(版本%s) 每个数据库角色设置."
+
+#: describe.c:3935
+msgid "Role"
+msgstr "角色"
+
+#: describe.c:3936
+msgid "Database"
+msgstr "数据库"
+
+#: describe.c:3937
+msgid "Settings"
+msgstr "设置"
+
+#: describe.c:3958
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "找不到角色\"%s\"和数据库\"%s\"的任何设置."
+
+#: describe.c:3961
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "找不到角色\"%s\"的任何设置."
+
+#: describe.c:3964
+#, c-format
+msgid "Did not find any settings."
+msgstr "找不到任何设置."
+
+#: describe.c:3969
+msgid "List of settings"
+msgstr "设置的列表"
+
+#: describe.c:4041
+msgid "index"
+msgstr "索引"
+
+#: describe.c:4043
+msgid "special"
+msgstr "特殊"
+
+#: describe.c:4044
+msgid "TOAST table"
+msgstr "TOAST 表"
+
+#: describe.c:4047 describe.c:4270
+msgid "partitioned index"
+msgstr "分区索引"
+
+#: describe.c:4071
+msgid "permanent"
+msgstr "永久的"
+
+#: describe.c:4072
+msgid "temporary"
+msgstr "临时的"
+
+#: describe.c:4073
+msgid "unlogged"
+msgstr "未记录"
+
+#: describe.c:4074
+msgid "Persistence"
+msgstr "持续的"
+
+#: describe.c:4091
+msgid "Access method"
+msgstr "访问方法"
+
+#: describe.c:4183
+msgid "List of relations"
+msgstr "关联列表"
+
+#: describe.c:4231
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "服务器(版本%s)不支持声明性表分区."
+
+#: describe.c:4242
+msgid "List of partitioned indexes"
+msgstr "分区索引列表"
+
+#: describe.c:4244
+msgid "List of partitioned tables"
+msgstr "分区表列表"
+
+#: describe.c:4248
+msgid "List of partitioned relations"
+msgstr "分区关系列表"
+
+#: describe.c:4279
+msgid "Parent name"
+msgstr "父名"
+
+#: describe.c:4292
+msgid "Leaf partition size"
+msgstr "叶子分区大小"
+
+#: describe.c:4295 describe.c:4301
+msgid "Total size"
+msgstr "总大小"
+
+#: describe.c:4425
+msgid "Trusted"
+msgstr "信任"
+
+#: describe.c:4433
+msgid "Internal language"
+msgstr "内部语言"
+
+#: describe.c:4434
+msgid "Call handler"
+msgstr "调用函数"
+
+#: describe.c:4435 describe.c:5699
+msgid "Validator"
+msgstr "验证"
+
+#: describe.c:4438
+msgid "Inline handler"
+msgstr "内联函数"
+
+#: describe.c:4466
+msgid "List of languages"
+msgstr "语言列表"
+
+#: describe.c:4511
+msgid "Check"
+msgstr "检查"
+
+#: describe.c:4553
+msgid "List of domains"
+msgstr "共同值域列表"
+
+#: describe.c:4587
+msgid "Source"
+msgstr "来源"
+
+#: describe.c:4588
+msgid "Destination"
+msgstr "目的地"
+
+#: describe.c:4590 describe.c:6525
+msgid "Default?"
+msgstr "预设?"
+
+#: describe.c:4627
+msgid "List of conversions"
+msgstr "字元编码转换列表"
+
+#: describe.c:4666
+msgid "Event"
+msgstr "Event"
+
+#: describe.c:4668
+msgid "enabled"
+msgstr "启用"
+
+#: describe.c:4669
+msgid "replica"
+msgstr "replica"
+
+#: describe.c:4670
+msgid "always"
+msgstr "经常"
+
+#: describe.c:4671
+msgid "disabled"
+msgstr "禁用"
+
+#: describe.c:4672 describe.c:6413
+msgid "Enabled"
+msgstr "使能"
+
+#: describe.c:4674
+msgid "Tags"
+msgstr "标签"
+
+#: describe.c:4693
+msgid "List of event triggers"
+msgstr "事件触发器列表"
+
+#: describe.c:4720
+msgid "The server (version %s) does not support extended statistics."
+msgstr "服务器(版本%s) 不支持使用扩展统计."
+
+#: describe.c:4757
+msgid "Ndistinct"
+msgstr "禁止"
+
+#: describe.c:4758
+msgid "Dependencies"
+msgstr "依赖关系"
+
+#: describe.c:4768
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4787
+msgid "List of extended statistics"
+msgstr "扩展统计表"
+
+#: describe.c:4814
+msgid "Source type"
+msgstr "来源类型"
+
+#: describe.c:4815
+msgid "Target type"
+msgstr "目标类型"
+
+#: describe.c:4846
+msgid "in assignment"
+msgstr "在指派中"
+
+#: describe.c:4848
+msgid "Implicit?"
+msgstr "隐含的?"
+
+#: describe.c:4903
+msgid "List of casts"
+msgstr "类型转换列表"
+
+#: describe.c:4931
+#, c-format
+msgid "The server (version %s) does not support collations."
+msgstr "服务器(版本%s)不支持排序校对."
+
+#: describe.c:4952 describe.c:4956
+msgid "Provider"
+msgstr "提供者"
+
+#: describe.c:4962 describe.c:4967
+msgid "Deterministic?"
+msgstr "确定性?"
+
+#: describe.c:5002
+msgid "List of collations"
+msgstr "校对列表"
+
+#: describe.c:5061
+msgid "List of schemas"
+msgstr "架构模式列表"
+
+#: describe.c:5086 describe.c:5333 describe.c:5404 describe.c:5475
+#, c-format
+msgid "The server (version %s) does not support full text search."
+msgstr "服务器(版本%s)不支持使用全文搜索."
+
+#: describe.c:5121
+msgid "List of text search parsers"
+msgstr "文本剖析器列表"
+
+#: describe.c:5166
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "没有找到任何命名为 \"%s\" 的文本剖析器."
+
+#: describe.c:5169
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "找不到任何文本搜索解析器."
+
+#: describe.c:5244
+msgid "Start parse"
+msgstr "开始剖析"
+
+#: describe.c:5245
+msgid "Method"
+msgstr "方法"
+
+#: describe.c:5249
+msgid "Get next token"
+msgstr "取得下一个标志符"
+
+#: describe.c:5251
+msgid "End parse"
+msgstr "结束剖析"
+
+#: describe.c:5253
+msgid "Get headline"
+msgstr "取得首行"
+
+#: describe.c:5255
+msgid "Get token types"
+msgstr "取得标志符类型"
+
+#: describe.c:5266
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "文本搜索剖析器 \"%s.%s\""
+
+#: describe.c:5269
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "文本搜索剖析器 \"%s\""
+
+#: describe.c:5288
+msgid "Token name"
+msgstr "标志名称"
+
+#: describe.c:5299
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "标志符别型给剖析器 \"%s.%s\""
+
+#: describe.c:5302
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "标志符类型给剖析器 \"%s\""
+
+#: describe.c:5356
+msgid "Template"
+msgstr "模版"
+
+#: describe.c:5357
+msgid "Init options"
+msgstr "初始选项"
+
+#: describe.c:5379
+msgid "List of text search dictionaries"
+msgstr "文本搜索字典列表"
+
+#: describe.c:5422
+msgid "Init"
+msgstr "初始化"
+
+#: describe.c:5423
+msgid "Lexize"
+msgstr "词汇"
+
+#: describe.c:5450
+msgid "List of text search templates"
+msgstr "文本搜索样式列表"
+
+#: describe.c:5510
+msgid "List of text search configurations"
+msgstr "文本搜索组态列表"
+
+#: describe.c:5556
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "没有找到任何命名为 \"%s\" 的文本搜索组态."
+
+#: describe.c:5559
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "未找到任何文本搜索配置."
+
+#: describe.c:5625
+msgid "Token"
+msgstr "标志符"
+
+#: describe.c:5626
+msgid "Dictionaries"
+msgstr "字典"
+
+#: describe.c:5637
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "文本搜索组态 \"%s.%s\""
+
+#: describe.c:5640
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "文本搜索组态 \"%s\""
+
+#: describe.c:5644
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"剖析器:\"%s.%s\""
+
+#: describe.c:5647
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"剖析器:\"%s\""
+
+#: describe.c:5681
+#, c-format
+msgid "The server (version %s) does not support foreign-data wrappers."
+msgstr "服务器(版本%s)不支持使用外部数据封装器."
+
+#: describe.c:5739
+msgid "List of foreign-data wrappers"
+msgstr "外部数据封装器列表"
+
+#: describe.c:5764
+#, c-format
+msgid "The server (version %s) does not support foreign servers."
+msgstr "服务器(版本%s)不支持使用外部服务器."
+
+#: describe.c:5777
+msgid "Foreign-data wrapper"
+msgstr "外部数据封装器"
+
+#: describe.c:5795 describe.c:6000
+msgid "Version"
+msgstr "版本"
+
+#: describe.c:5821
+msgid "List of foreign servers"
+msgstr "外部服务器列表"
+
+#: describe.c:5846
+#, c-format
+msgid "The server (version %s) does not support user mappings."
+msgstr "服务器(版本%s)不支持使用用户映射."
+
+#: describe.c:5856 describe.c:5920
+msgid "Server"
+msgstr "服务器"
+
+#: describe.c:5857
+msgid "User name"
+msgstr "用户名: "
+
+#: describe.c:5882
+msgid "List of user mappings"
+msgstr "列出用户映射"
+
+#: describe.c:5907
+#, c-format
+msgid "The server (version %s) does not support foreign tables."
+msgstr "服务器(版本%s)不支持使用引用表."
+
+#: describe.c:5960
+msgid "List of foreign tables"
+msgstr "引用表列表"
+
+#: describe.c:5985 describe.c:6042
+#, c-format
+msgid "The server (version %s) does not support extensions."
+msgstr "服务器(版本%s) 不支持使用扩展."
+
+#: describe.c:6017
+msgid "List of installed extensions"
+msgstr "已安装扩展列表"
+
+#: describe.c:6070
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "没有找到任何名称为 \"%s\" 的扩展."
+
+#: describe.c:6073
+#, c-format
+msgid "Did not find any extensions."
+msgstr "没有找到任何扩展."
+
+#: describe.c:6117
+msgid "Object description"
+msgstr "对象描述"
+
+#: describe.c:6127
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "对象用于扩展 \"%s\""
+
+#: describe.c:6156 describe.c:6232
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "服务器(版本%s)不支持发布."
+
+#: describe.c:6173 describe.c:6310
+msgid "All tables"
+msgstr "所有表"
+
+#: describe.c:6174 describe.c:6311
+msgid "Inserts"
+msgstr "插入"
+
+#: describe.c:6175 describe.c:6312
+msgid "Updates"
+msgstr "更新"
+
+#: describe.c:6176 describe.c:6313
+msgid "Deletes"
+msgstr "删除"
+
+#: describe.c:6180 describe.c:6315
+msgid "Truncates"
+msgstr "截断"
+
+#: describe.c:6184 describe.c:6317
+msgid "Via root"
+msgstr "Via root"
+
+#: describe.c:6201
+msgid "List of publications"
+msgstr "发布列表"
+
+#: describe.c:6274
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "没有找到任何名称为 \"%s\" 的发布."
+
+#: describe.c:6277
+#, c-format
+msgid "Did not find any publications."
+msgstr "没有找到任何发布."
+
+#: describe.c:6306
+#, c-format
+msgid "Publication %s"
+msgstr "发布 %s"
+
+#: describe.c:6354
+msgid "Tables:"
+msgstr "数据表"
+
+#: describe.c:6398
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "服务器(版本%s)不支持订阅."
+
+#: describe.c:6414
+msgid "Publication"
+msgstr "发布"
+
+#: describe.c:6423
+msgid "Binary"
+msgstr "二进制"
+
+#: describe.c:6424
+msgid "Streaming"
+msgstr "流"
+
+#: describe.c:6429
+msgid "Synchronous commit"
+msgstr "同步提交"
+
+#: describe.c:6430
+msgid "Conninfo"
+msgstr "连接信息"
+
+#: describe.c:6452
+msgid "List of subscriptions"
+msgstr "订阅列表"
+
+#: describe.c:6519 describe.c:6607 describe.c:6692 describe.c:6775
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6520
+msgid "Input type"
+msgstr "输入类型"
+
+#: describe.c:6521
+msgid "Storage type"
+msgstr "存储类型"
+
+#: describe.c:6522
+msgid "Operator class"
+msgstr "操作符类"
+
+#: describe.c:6534 describe.c:6608 describe.c:6693 describe.c:6776
+msgid "Operator family"
+msgstr "操作符家族"
+
+#: describe.c:6566
+msgid "List of operator classes"
+msgstr "运算子列表"
+
+#: describe.c:6609
+msgid "Applicable types"
+msgstr "适用类型"
+
+#: describe.c:6647
+msgid "List of operator families"
+msgstr "运算子系列列表"
+
+#: describe.c:6694
+msgid "Operator"
+msgstr "运算子"
+
+#: describe.c:6695
+msgid "Strategy"
+msgstr "策略"
+
+#: describe.c:6696
+msgid "ordering"
+msgstr "排序"
+
+#: describe.c:6697
+msgid "search"
+msgstr "搜索"
+
+#: describe.c:6698
+msgid "Purpose"
+msgstr "目的"
+
+#: describe.c:6703
+msgid "Sort opfamily"
+msgstr "排序操作符家族"
+
+#: describe.c:6734
+msgid "List of operators of operator families"
+msgstr "操作符集合的列表"
+
+#: describe.c:6777
+msgid "Registered left type"
+msgstr "注册左型"
+
+#: describe.c:6778
+msgid "Registered right type"
+msgstr "注册右型"
+
+#: describe.c:6779
+msgid "Number"
+msgstr "数"
+
+#: describe.c:6815
+msgid "List of support functions of operator families"
+msgstr "操作符集合的支持功能列表"
+
+#: help.c:73
+#, c-format
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr "psql是PostgreSQL 的交互式客户端工具。\n"
+
+#: help.c:74 help.c:355 help.c:433 help.c:476
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: help.c:75
+#, c-format
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr " psql [选项]... [数据库名称 [用户名称]]\n"
+
+#: help.c:77
+#, c-format
+msgid "General options:\n"
+msgstr "通用选项:\n"
+
+#: help.c:82
+#, c-format
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=命令 执行单一命令(SQL或内部指令)然后结束\n"
+
+#: help.c:83
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=DBNAME 指定要连接的数据库 (默认:\"%s\")\n"
+
+#: help.c:84
+#, c-format
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=文件名 从文件中执行命令然后退出\n"
+
+#: help.c:85
+#, c-format
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list 列出所有可用的数据库,然后退出\n"
+
+#: help.c:86
+#, c-format
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" 设置psql变量NAME为VALUE\n"
+" (例如,-v ON_ERROR_STOP=1)\n"
+
+#: help.c:89
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信息, 然后退出\n"
+
+#: help.c:90
+#, c-format
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc 不读取启动文档(~/.psqlrc)\n"
+
+#: help.c:91
+#, c-format
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (\"one\"), --single-transaction\n"
+" 作为一个单一事务来执行命令文件(如果是非交互型的)\n"
+
+#: help.c:93
+#, c-format
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] 显示此帮助,然后退出\n"
+
+#: help.c:94
+#, c-format
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands 列出反斜线命令,然后退出\n"
+
+#: help.c:95
+#, c-format
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables 列出特殊变量,然后退出\n"
+
+#: help.c:97
+#, c-format
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"输入和输出选项:\n"
+
+#: help.c:98
+#, c-format
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all 显示所有来自于脚本的输入\n"
+
+#: help.c:99
+#, c-format
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors 回显失败的命令\n"
+
+#: help.c:100
+#, c-format
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries 显示发送给服务器的命令\n"
+
+#: help.c:101
+#, c-format
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden 显示内部命令产生的查询\n"
+
+#: help.c:102
+#, c-format
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=文件名 将会话日志写入文件\n"
+
+#: help.c:103
+#, c-format
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline 禁用增强命令行编辑功能(readline)\n"
+
+#: help.c:104
+#, c-format
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=FILENAME 将查询结果写入文件(或 |管道)\n"
+
+#: help.c:105
+#, c-format
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet 以沉默模式运行(不显示消息,只有查询结果)\n"
+
+#: help.c:106
+#, c-format
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step 单步模式 (确认每个查询)\n"
+
+#: help.c:107
+#, c-format
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line 单行模式 (一行就是一条 SQL 命令)\n"
+
+#: help.c:109
+#, c-format
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"输出格式选项 :\n"
+
+#: help.c:110
+#, c-format
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align 使用非对齐表格输出模式\n"
+
+#: help.c:111
+#, c-format
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv CSV(逗号分隔值)表输出模式\n"
+
+#: help.c:112
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=STRING\n"
+" 为字段设置分隔符,用于不整齐的输出(默认:\"%s\")\n"
+
+#: help.c:115
+#, c-format
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html HTML 表格输出模式\n"
+
+#: help.c:116
+#, c-format
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=变量[=参数] 设置将变量打印到参数的选项(查阅 \\pset 命令)\n"
+
+#: help.c:117
+#, c-format
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=STRING\n"
+" 为不整齐的输出设置字录的分隔符(默认:换行符号)\n"
+
+#: help.c:119
+#, c-format
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only 只打印记录i\n"
+
+#: help.c:120
+#, c-format
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=文本 设定 HTML 表格标记属性(例如,宽度,边界)\n"
+
+#: help.c:121
+#, c-format
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded 打开扩展表格输出\n"
+
+#: help.c:122
+#, c-format
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" 为不整齐的输出设置字段分隔符为字节0\n"
+
+#: help.c:124
+#, c-format
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" 为不整齐的输出设置记录分隔符为字节0\n"
+
+#: help.c:127
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"联接选项:\n"
+
+#: help.c:130
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr " -h, --host=主机名 数据库服务器主机或socket目录(默认:\"%s\")\n"
+
+#: help.c:131
+msgid "local socket"
+msgstr "本地接口"
+
+#: help.c:134
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=端口 数据库服务器的端口(默认:\"%s\")\n"
+
+#: help.c:137
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=用户名 指定数据库用户名(默认:\"%s\")\n"
+
+#: help.c:138
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 永远不提示输入口令\n"
+
+#: help.c:139
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password 强制口令提示 (自动)\n"
+
+#: help.c:141
+#, c-format
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"更多信息,请在psql中输入\"\\?\"(用于内部指令)或者 \"\\help\"(用于SQL命令),\n"
+"或者参考PostgreSQL文档中的psql章节.\n"
+"\n"
+
+#: help.c:144
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "臭虫报告至<%s>.\n"
+
+#: help.c:145
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: help.c:171
+#, c-format
+msgid "General\n"
+msgstr "一般性\n"
+
+#: help.c:172
+#, c-format
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright 显示PostgreSQL的使用和发行许可条款\n"
+
+#: help.c:173
+#, c-format
+msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n"
+msgstr " \\crosstabview [COLUMNS] 执行查询并且以交叉表显示结果\n"
+
+#: help.c:174
+#, c-format
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose 以最冗长的形式显示最近的错误消息\n"
+
+#: help.c:175
+#, c-format
+#: help.c:175
+#, c-format
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send results to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPTIONS)] [FILE] 执行查询(并将结果发送到文件或|管道);\n"
+" 不带参数的\\g等价于分号\n"
+
+#: help.c:177
+#, c-format
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc 描述查询结果,而不执行它\n"
+
+#: help.c:178
+#, c-format
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec 执行策略,然后执行其结果中的每个值\n"
+
+#: help.c:179
+#, c-format
+msgid " \\gset [PREFIX] execute query and store results in psql variables\n"
+msgstr " \\gset [PREFIX] 执行查询并把结果存到psql变量中\n"
+
+#: help.c:180
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(OPTIONS)] [FILE] 就像\\g,但强制扩展输出模式\n"
+
+#: help.c:181
+#, c-format
+msgid " \\q quit psql\n"
+msgstr " \\q 退出 psql\n"
+
+#: help.c:182
+#, c-format
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SEC] 每隔SEC秒执行一次查询\n"
+
+#: help.c:185
+#, c-format
+msgid "Help\n"
+msgstr "帮助\n"
+
+#: help.c:187
+#, c-format
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] 显示反斜线命令的帮助\n"
+
+#: help.c:188
+#, c-format
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options 显示 psql 命令行选项的帮助\n"
+
+#: help.c:189
+#, c-format
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables 显示特殊变量的帮助\n"
+
+#: help.c:190
+#, c-format
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [NAME] SQL命令语法上的说明,用*显示全部命令的语法说明\n"
+
+#: help.c:193
+#, c-format
+msgid "Query Buffer\n"
+msgstr "查询缓存区\n"
+
+#: help.c:194
+#, c-format
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [FILE] [LINE] 使用外部编辑器编辑查询缓存区(或文件)\n"
+
+#: help.c:195
+#, c-format
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [FUNCNAME [LINE]] 使用外部编辑器编辑函数定义\n"
+
+#: help.c:196
+#, c-format
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [VIEWNAME [LINE]] 用外部编辑器编辑视图定义\n"
+
+#: help.c:197
+#, c-format
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p 显示查询缓存区的内容\n"
+
+#: help.c:198
+#, c-format
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r 重置(清除)查询缓存区\n"
+
+#: help.c:200
+#, c-format
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [文件] 显示历史记录或将历史记录保存在文件中\n"
+
+#: help.c:202
+#, c-format
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w 文件 将查询缓存区的内容写入文件\n"
+
+#: help.c:205
+#, c-format
+msgid "Input/Output\n"
+msgstr "输入/输出\n"
+
+#: help.c:206
+#, c-format
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... 执行 SQL COPY,将数据流发送到客户端主机\n"
+
+#: help.c:207
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [STRING] 将字符串写到标准输出(-n表示没有换行符)\n"
+
+#: help.c:208
+#, c-format
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i 文件 从文件中执行命令\n"
+
+#: help.c:209
+#, c-format
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir FILE 与 \\i类似, 但是相对于当前脚本的位置\n"
+
+#: help.c:210
+#, c-format
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [文件] 将全部查询结果写入文件或 |管道\n"
+
+#: help.c:211
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr " \\qecho [-n] [STRING] 将字符串写入\\o输出流(-n表示无换行)\n"
+
+#: help.c:212
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [STRING] 将字符串写入标准错误(-n 表示无换行)\n"
+
+#: help.c:215
+#, c-format
+msgid "Conditional\n"
+msgstr "条件\n"
+
+#: help.c:216
+#, c-format
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR 开始条件块\n"
+
+#: help.c:217
+#, c-format
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR 当前条件块内的备选方案\n"
+
+#: help.c:218
+#, c-format
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else 当前条件块内的最终备选方案\n"
+
+#: help.c:219
+#, c-format
+msgid " \\endif end conditional block\n"
+msgstr " \\endif 条件块的结尾\n"
+
+#: help.c:222
+#, c-format
+msgid "Informational\n"
+msgstr "资讯性\n"
+
+#: help.c:223
+#, c-format
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (选项: S = 显示系统对象, + = 其余的详细信息)\n"
+
+#: help.c:224
+#, c-format
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] 列出表,视图和序列\n"
+
+#: help.c:225
+#, c-format
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] 名称 描述表,视图,序列,或索引\n"
+
+#: help.c:226
+#, c-format
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [模式] 列出聚合函数\n"
+
+#: help.c:227
+#, c-format
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [模式] 列出访问方法\n"
+
+#: help.c:228
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] 列出运算符\n"
+
+#: help.c:229
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] 列出运算符集合\n"
+
+#: help.c:230
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] 列出运算符集合\n"
+
+#: help.c:231
+#, c-format
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] 列出运算符集合所支持的功能\n"
+
+#: help.c:232
+#, c-format
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [模式] 列出表空间\n"
+
+#: help.c:233
+#, c-format
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [模式] 列表转换\n"
+
+#: help.c:234
+#, c-format
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [模式] 列出类型强制转换\n"
+
+#: help.c:235
+#, c-format
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [模式] 显示没有在别处显示的对象描述\n"
+
+#: help.c:236
+#, c-format
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [模式] 列出共同值域\n"
+
+#: help.c:237
+#, c-format
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [模式] 列出默认权限\n"
+
+#: help.c:238
+#, c-format
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [模式] 列出引用表\n"
+
+#: help.c:239
+#, c-format
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [模式] 列出引用表\n"
+
+#: help.c:240
+#, c-format
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [模式] 列出外部服务器\n"
+
+#: help.c:241
+#, c-format
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [模式] 列出用户映射\n"
+
+#: help.c:242
+#, c-format
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [模式] 列出外部数据封装器\n"
+
+#: help.c:243
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" 列出 [only agg/normal/procedure/trigger/window] 函数\n"
+
+#: help.c:245
+#, c-format
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [模式] 列出文本搜索配置\n"
+
+#: help.c:246
+#, c-format
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [模式] 列出文本搜索字典\n"
+
+#: help.c:247
+#, c-format
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [模式] 列出文本搜索解析器\n"
+
+#: help.c:248
+#, c-format
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [模式] 列出文本搜索模版\n"
+
+#: help.c:249
+#, c-format
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [模式] 列出角色\n"
+
+#: help.c:250
+#, c-format
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [模式] 列出索引\n"
+
+#: help.c:251
+#, c-format
+msgid " \\dl list large objects, same as \\lo_list\n"
+msgstr " \\dl 列出大对象, 功能与\\lo_list相同\n"
+
+#: help.c:252
+#, c-format
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [模式] 列出所有过程语言\n"
+
+#: help.c:253
+#, c-format
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [模式] 列出所有物化视图\n"
+
+#: help.c:254
+#, c-format
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [模式] 列出所有模式\n"
+
+#: help.c:255
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" 列出运算符\n"
+
+#: help.c:257
+#, c-format
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [模式] 列出所有校对规则\n"
+
+#: help.c:258
+#, c-format
+msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp [模式] 列出表,视图和序列的访问权限\n"
+
+#: help.c:259
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[itn+] [PATTERN] 列出[仅表/索引]分区关系[n=nested]\n"
+
+#: help.c:260
+#, c-format
+msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n"
+msgstr " \\drds [模式1 [模式2]] 列出每个数据库的角色设置\n"
+
+#: help.c:261
+#, c-format
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [模式] 列出复制发布\n"
+
+#: help.c:262
+#, c-format
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [模式] 列出复制订阅\n"
+
+#: help.c:263
+#, c-format
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [模式] 列出序列\n"
+
+#: help.c:264
+#, c-format
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [模式] 列出表\n"
+
+#: help.c:265
+#, c-format
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [模式] 列出数据类型\n"
+
+#: help.c:266
+#, c-format
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [模式] 列出角色\n"
+
+#: help.c:267
+#, c-format
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [模式] 列出视图\n"
+
+#: help.c:268
+#, c-format
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [模式] 列出扩展\n"
+
+#: help.c:269
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [PATTERN] 列出扩展统计信息\n"
+
+#: help.c:270
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [PATTERN] 列出所有事件触发器\n"
+
+#: help.c:271
+#, c-format
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [模式] 列出所有数据库\n"
+
+#: help.c:272
+#, c-format
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNCNAME 显示一个函数的定义\n"
+
+#: help.c:273
+#, c-format
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VIEWNAME 显示一个视图的定义\n"
+
+#: help.c:274
+#, c-format
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [模式] 和\\dp的功能相同\n"
+
+#: help.c:277
+#, c-format
+msgid "Formatting\n"
+msgstr "格式化\n"
+
+#: help.c:278
+#, c-format
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a 在非对齐模式和对齐模式之间切换\n"
+
+#: help.c:279
+#, c-format
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [字符串] 设置表的标题,或如果没有的标题就取消\n"
+
+#: help.c:280
+#, c-format
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [字符串] 显示或设定非对齐模式查询输出的字段分隔符\n"
+
+#: help.c:281
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H 切换HTML输出模式 (目前是 %s)\n"
+
+#: help.c:283
+#, c-format
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NAME [VALUE]] 设置表输出选项\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle\n"
+
+#: help.c:290
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [开|关] 只显示记录 (目前是%s)\n"
+
+#: help.c:292
+#, c-format
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [字符串] 设置HTML <表格>标签属性, 或者如果没有的话取消设置\n"
+
+#: help.c:293
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] 切换扩展输出模式(目前是 %s)\n"
+
+#: help.c:297
+#, c-format
+msgid "Connection\n"
+msgstr "连接\n"
+
+#: help.c:299
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" 连接到新数据库(当前是\"%s\")\n"
+
+#: help.c:303
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" 连接到新数据库(当前无连接)\n"
+
+#: help.c:305
+#, c-format
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo 显示当前连接的相关信息\n"
+
+#: help.c:306
+#, c-format
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [编码名称] 显示或设定客户端编码\n"
+
+#: help.c:307
+#, c-format
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [USERNAME] 安全地为用户更改口令\n"
+
+#: help.c:310
+#, c-format
+msgid "Operating System\n"
+msgstr "操作系统\n"
+
+#: help.c:311
+#, c-format
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [目录] 更改目前的工作目录\n"
+
+#: help.c:312
+#, c-format
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAME [VALUE] 设置或清空环境变量\n"
+
+#: help.c:313
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [开|关] 切换命令计时开关 (目前是%s)\n"
+
+#: help.c:315
+#, c-format
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [命令] 在 shell中执行命令或启动一个交互式shell\n"
+
+#: help.c:318
+#, c-format
+msgid "Variables\n"
+msgstr "变量\n"
+
+#: help.c:319
+#, c-format
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [文本] 名称 提示用户设定内部变量\n"
+
+#: help.c:320
+#, c-format
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [名称 [值数]] 设定内部变量,若无参数则列出全部变量\n"
+
+#: help.c:321
+#, c-format
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset 名称 清空(删除)内部变量\n"
+
+#: help.c:324
+#, c-format
+msgid "Large Objects\n"
+msgstr "大对象\n"
+
+#: help.c:325
+#, c-format
+msgid ""
+" \\lo_export LOBOID FILE\n"
+" \\lo_import FILE [COMMENT]\n"
+" \\lo_list\n"
+" \\lo_unlink LOBOID large object operations\n"
+msgstr ""
+" \\lo_export LOBOID 文件\n"
+" \\lo_import 文件 [注释]\n"
+" \\lo_list\n"
+" \\lo_unlink LOBOID 大对象运算\n"
+
+#: help.c:352
+#, c-format
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"特殊对待的变量的列表\n"
+"\n"
+
+#: help.c:354
+#, c-format
+msgid "psql variables:\n"
+msgstr "psql变量:\n"
+
+#: help.c:356
+#, c-format
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAME=VALUE\n"
+" 或者在 psql 中的 \\set NAME VALUE\n"
+"\n"
+
+#: help.c:358
+#, c-format
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" 如果被设置,成功的SQL命令将会被自动提交\n"
+
+#: help.c:360
+#, c-format
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" 决定用于完成 SQL 关键词的大小写\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:363
+#, c-format
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" 当前已连接的数据库名\n"
+
+#: help.c:365
+#, c-format
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" 控制哪些输入被写入到标准输出\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:368
+#, c-format
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" 如果被设置,显示反斜线命令执行的内部命令;\n"
+" 如果被设置为 \"noexec\",只显示但不执行\n"
+
+#: help.c:371
+#, c-format
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" 当前的客户端字符集编码\n"
+
+#: help.c:373
+#, c-format
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr ""
+" 错误\n"
+" 如果上次查询失败,则为true,否则为false\n"
+
+#: help.c:375
+#, c-format
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" 一次取得并显示的结果行的数量 (0=无限)\n"
+
+#: help.c:377
+#, c-format
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" 如果设置,则不显示表访问方法\n"
+
+#: help.c:379
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" 如果设置,不显示压缩方法\n"
+
+#: help.c:381
+#, c-format
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" 控制命令历史 [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:383
+#, c-format
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" 用来存储命令历史的文件名\n"
+
+#: help.c:385
+#, c-format
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" 保存在命令历史中的最大命令数\n"
+
+#: help.c:387
+#, c-format
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" 当前连接的数据库服务器主机\n"
+
+#: help.c:389
+#, c-format
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" 终止交互式会话所需的EOF数\n"
+
+#: help.c:391
+#, c-format
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" 最后一个受影响的 OID 的值\n"
+
+#: help.c:393
+#, c-format
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" 最后一个错误的消息和SQL状态,如果没有,则为空字符串和\"00000\"\n"
+
+#: help.c:396
+#, c-format
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" 如果被设置,则错误不会停止一个事务(使用隐式保存点)\n"
+
+#: help.c:398
+#, c-format
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" 发生错误后停止批量执行\n"
+
+#: help.c:400
+#, c-format
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" 当前连接的服务器端口\n"
+
+#: help.c:402
+#, c-format
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" 指定标准的 psql 提示符\n"
+
+#: help.c:404
+#, c-format
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" 指定在语句跨行时使用的提示符\n"
+
+#: help.c:406
+#, c-format
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" 指定 COPY ... FROM STDIN 期间使用的提示符\n"
+
+#: help.c:408
+#, c-format
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" 静默地运行(和-q选项相同)\n"
+
+#: help.c:410
+#, c-format
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" 上一个查询返回或影响的行数,或0\n"
+
+#: help.c:412
+#, c-format
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" 服务器版本(短字符串或数字格式)\n"
+
+#: help.c:415
+#, c-format
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" 控制消息上下文域的显示 [never, errors, always]\n"
+
+#: help.c:417
+#, c-format
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" 设置的话,行尾会终止SQL命令模式(与-S选项相同)\n"
+
+#: help.c:419
+#, c-format
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" 单步模式(与-s选项相同)\n"
+
+#: help.c:421
+#, c-format
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" 上次查询的SQL状态,如果没有错误,则为\"00000\"\n"
+
+#: help.c:423
+#, c-format
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" 当前连接上的数据库用户\n"
+
+#: help.c:425
+#, c-format
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" 控制错误报告的冗长程度 [default, verbose, terse, sqlstate]\n"
+
+#: help.c:427
+#, c-format
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql版本(详细字符串、短字符串或数字格式)\n"
+
+#: help.c:432
+#, c-format
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"显示设置:\n"
+
+#: help.c:434
+#, c-format
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NAME[=VALUE]\n"
+" 或者 psql 中的 \\pset NAME [VALUE]\n"
+"\n"
+
+#: help.c:436
+#, c-format
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" 边界样式(数字)\n"
+
+#: help.c:438
+#, c-format
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" 用于回卷格式的目标宽度\n"
+
+#: help.c:440
+#, c-format
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (or x)\n"
+" 扩展输出 [on, off, auto]\n"
+
+#: help.c:442
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" 用于非对齐输出的域分隔符(默认是 \"%s\")\n"
+
+#: help.c:445
+#, c-format
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" 将用于非对齐模式中的域分隔符设置为零字节\n"
+
+#: help.c:447
+#, c-format
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" 启用或禁用表格页脚的显示 [on, off]\n"
+
+#: help.c:449
+#, c-format
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" 设置输出格式 [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:451
+#, c-format
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" 设置边界线绘制风格 [ascii, old-ascii, unicode]\n"
+
+#: help.c:453
+#, c-format
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" 设置代替空值被打印的字符串\n"
+
+#: help.c:455
+#, c-format
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" 允许显示特定于区域设置的字符以分隔数字组\n"
+
+#: help.c:457
+#, c-format
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" 控制何时使用一个外部分页器 [yes, no, always]\n"
+
+#: help.c:459
+#, c-format
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" 用于非对齐输出中的记录(行)分隔符\n"
+
+#: help.c:461
+#, c-format
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" 将用于非对齐输出中的记录分隔符设置为零字节\n"
+
+#: help.c:463
+#, c-format
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (或者 T)\n"
+" 指定 html 格式中表标签的属性\n"
+" 或者 latex-longtable 格式中左对齐数据类型的比例列宽\n"
+
+#: help.c:466
+#, c-format
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" 为任何后续被打印的表设置表标题\n"
+
+#: help.c:468
+#, c-format
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" 如果被设置,只有真实的表数据会被显示\n"
+
+#: help.c:470
+#, c-format
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" 设置 Unicode 线绘制的风格 [single, double]\n"
+
+#: help.c:475
+#, c-format
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"环境变量:\n"
+
+#: help.c:479
+#, c-format
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" 或者 psql 中的 \\setenv NAME [VALUE]\n"
+"\n"
+
+#: help.c:481
+#, c-format
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" 或者 psql 中的 \\setenv NAME [VALUE]\n"
+"\n"
+
+#: help.c:484
+#, c-format
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" 回卷格式的列数\n"
+
+#: help.c:486
+#, c-format
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" 和application_name连接参数相同\n"
+
+#: help.c:488
+#, c-format
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" 和dbname连接参数相同\n"
+
+#: help.c:490
+#, c-format
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" 与主机连接参数相同\n"
+
+#: help.c:492
+#, c-format
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" 口令文件名\n"
+
+#: help.c:494
+#, c-format
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" 连接口令(不推荐)\n"
+
+#: help.c:496
+#, c-format
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" 与端口连接参数相同\n"
+
+#: help.c:498
+#, c-format
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" 与用户连接参数相同\n"
+
+#: help.c:500
+#, c-format
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" \\e, \\ef, 和 \\ev 命令使用的编辑器\n"
+
+#: help.c:502
+#, c-format
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" 调用编辑器时如何指定一个行号\n"
+
+#: help.c:504
+#, c-format
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" 命令历史文件的可选位置\n"
+
+#: help.c:506
+#, c-format
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" 外部分页程序的名称\n"
+
+#: help.c:508
+#, c-format
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" 用户的.psqlrc文件的可选位置\n"
+
+#: help.c:510
+#, c-format
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" \\! 命令使用的shell\n"
+
+#: help.c:512
+#, c-format
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" 临时文件的目录\n"
+
+#: help.c:557
+msgid "Available help:\n"
+msgstr "可用的说明:\n"
+
+#: help.c:652
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"命令: %s\n"
+"描述: %s\n"
+"语法:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:675
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"没有 \"%s\" 的帮助说明.\n"
+"请尝试用不带参数的 \\h 来看一下是否有可使用的帮助信息.\n"
+
+#: input.c:217
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "无法从输入档案读取:%m"
+
+#: input.c:471 input.c:509
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "无法将历史记录储存到 \"%s\":%m"
+
+#: input.c:528
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "这个安装不支援命令记录"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s:尚未与数据库连接"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s:目前的事务被中止"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s:不明事务状态"
+
+#: large_obj.c:288 large_obj.c:299
+msgid "ID"
+msgstr "ID"
+
+#: large_obj.c:309
+msgid "Large objects"
+msgstr "大型对象"
+
+#: mainloop.c:136
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: 逃脱"
+
+#: mainloop.c:195
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "使用 \"\\q\" 离开 %s.\n"
+
+#: mainloop.c:217
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"该输入是一个PostgreSQL自定义格式的转储.\n"
+"请使用pg_restore命令行客户端来将这个转储恢复到数据库.\n"
+
+#: mainloop.c:298
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "使用\\?获得帮助或按control-C清除输入缓冲区."
+
+#: mainloop.c:300
+msgid "Use \\? for help."
+msgstr "使用\\?获取帮助."
+
+#: mainloop.c:304
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "您正在使用psql, 这是一种用于访问PostgreSQL的命令行界面."
+
+#: mainloop.c:305
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"键入: \\copyright 显示发行条款\n"
+" \\h 显示 SQL 命令的说明\n"
+" \\? 显示 pgsql 命令的说明\n"
+" \\g 或者以分号(;)结尾以执行查询\n"
+" \\q 退出\n"
+
+#: mainloop.c:329
+msgid "Use \\q to quit."
+msgstr "使用\\q 退出."
+
+#: mainloop.c:332 mainloop.c:356
+msgid "Use control-D to quit."
+msgstr "使用control-D退出."
+
+#: mainloop.c:334 mainloop.c:358
+msgid "Use control-C to quit."
+msgstr "使用control-C退出."
+
+#: mainloop.c:465 mainloop.c:613
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "查询被忽略;使用\\endif或Ctrl-C退出当前\\if块"
+
+#: mainloop.c:631
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "已到达EOF,但未找到结束符\\endif"
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "未结束的引用字符串"
+
+#: psqlscanslash.l:811
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: 内存不足"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:111 sql_help.c:117 sql_help.c:119 sql_help.c:121 sql_help.c:123
+#: sql_help.c:126 sql_help.c:128 sql_help.c:130 sql_help.c:235 sql_help.c:237
+#: sql_help.c:238 sql_help.c:240 sql_help.c:242 sql_help.c:245 sql_help.c:247
+#: sql_help.c:249 sql_help.c:251 sql_help.c:263 sql_help.c:264 sql_help.c:265
+#: sql_help.c:267 sql_help.c:316 sql_help.c:318 sql_help.c:320 sql_help.c:322
+#: sql_help.c:391 sql_help.c:396 sql_help.c:398 sql_help.c:440 sql_help.c:442
+#: sql_help.c:445 sql_help.c:447 sql_help.c:516 sql_help.c:521 sql_help.c:526
+#: sql_help.c:531 sql_help.c:536 sql_help.c:590 sql_help.c:592 sql_help.c:594
+#: sql_help.c:596 sql_help.c:598 sql_help.c:601 sql_help.c:603 sql_help.c:606
+#: sql_help.c:617 sql_help.c:619 sql_help.c:661 sql_help.c:663 sql_help.c:665
+#: sql_help.c:668 sql_help.c:670 sql_help.c:672 sql_help.c:707 sql_help.c:711
+#: sql_help.c:715 sql_help.c:734 sql_help.c:737 sql_help.c:740 sql_help.c:769
+#: sql_help.c:781 sql_help.c:789 sql_help.c:792 sql_help.c:795 sql_help.c:810
+#: sql_help.c:813 sql_help.c:842 sql_help.c:847 sql_help.c:852 sql_help.c:857
+#: sql_help.c:862 sql_help.c:884 sql_help.c:886 sql_help.c:888 sql_help.c:890
+#: sql_help.c:893 sql_help.c:895 sql_help.c:937 sql_help.c:982 sql_help.c:987
+#: sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1021
+#: sql_help.c:1032 sql_help.c:1034 sql_help.c:1053 sql_help.c:1063
+#: sql_help.c:1065 sql_help.c:1067 sql_help.c:1079 sql_help.c:1083
+#: sql_help.c:1085 sql_help.c:1097 sql_help.c:1099 sql_help.c:1101
+#: sql_help.c:1103 sql_help.c:1121 sql_help.c:1123 sql_help.c:1127
+#: sql_help.c:1131 sql_help.c:1135 sql_help.c:1138 sql_help.c:1139
+#: sql_help.c:1140 sql_help.c:1143 sql_help.c:1145 sql_help.c:1280
+#: sql_help.c:1282 sql_help.c:1285 sql_help.c:1288 sql_help.c:1290
+#: sql_help.c:1292 sql_help.c:1295 sql_help.c:1298 sql_help.c:1411
+#: sql_help.c:1413 sql_help.c:1415 sql_help.c:1418 sql_help.c:1439
+#: sql_help.c:1442 sql_help.c:1445 sql_help.c:1448 sql_help.c:1452
+#: sql_help.c:1454 sql_help.c:1456 sql_help.c:1458 sql_help.c:1472
+#: sql_help.c:1475 sql_help.c:1477 sql_help.c:1479 sql_help.c:1489
+#: sql_help.c:1491 sql_help.c:1501 sql_help.c:1503 sql_help.c:1513
+#: sql_help.c:1516 sql_help.c:1539 sql_help.c:1541 sql_help.c:1543
+#: sql_help.c:1545 sql_help.c:1548 sql_help.c:1550 sql_help.c:1553
+#: sql_help.c:1556 sql_help.c:1607 sql_help.c:1650 sql_help.c:1653
+#: sql_help.c:1655 sql_help.c:1657 sql_help.c:1660 sql_help.c:1662
+#: sql_help.c:1664 sql_help.c:1667 sql_help.c:1717 sql_help.c:1733
+#: sql_help.c:1964 sql_help.c:2033 sql_help.c:2052 sql_help.c:2065
+#: sql_help.c:2122 sql_help.c:2129 sql_help.c:2139 sql_help.c:2160
+#: sql_help.c:2186 sql_help.c:2204 sql_help.c:2231 sql_help.c:2328
+#: sql_help.c:2374 sql_help.c:2398 sql_help.c:2421 sql_help.c:2425
+#: sql_help.c:2459 sql_help.c:2479 sql_help.c:2501 sql_help.c:2515
+#: sql_help.c:2536 sql_help.c:2560 sql_help.c:2590 sql_help.c:2615
+#: sql_help.c:2662 sql_help.c:2950 sql_help.c:2963 sql_help.c:2980
+#: sql_help.c:2996 sql_help.c:3036 sql_help.c:3090 sql_help.c:3094
+#: sql_help.c:3096 sql_help.c:3103 sql_help.c:3122 sql_help.c:3149
+#: sql_help.c:3184 sql_help.c:3196 sql_help.c:3205 sql_help.c:3249
+#: sql_help.c:3263 sql_help.c:3291 sql_help.c:3299 sql_help.c:3311
+#: sql_help.c:3321 sql_help.c:3329 sql_help.c:3337 sql_help.c:3345
+#: sql_help.c:3353 sql_help.c:3362 sql_help.c:3373 sql_help.c:3381
+#: sql_help.c:3389 sql_help.c:3397 sql_help.c:3405 sql_help.c:3415
+#: sql_help.c:3424 sql_help.c:3433 sql_help.c:3441 sql_help.c:3451
+#: sql_help.c:3462 sql_help.c:3470 sql_help.c:3479 sql_help.c:3490
+#: sql_help.c:3499 sql_help.c:3507 sql_help.c:3515 sql_help.c:3523
+#: sql_help.c:3531 sql_help.c:3539 sql_help.c:3547 sql_help.c:3555
+#: sql_help.c:3563 sql_help.c:3571 sql_help.c:3579 sql_help.c:3596
+#: sql_help.c:3605 sql_help.c:3613 sql_help.c:3630 sql_help.c:3645
+#: sql_help.c:3947 sql_help.c:3998 sql_help.c:4027 sql_help.c:4042
+#: sql_help.c:4527 sql_help.c:4575 sql_help.c:4726
+msgid "name"
+msgstr "名称"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1814
+#: sql_help.c:3264 sql_help.c:4303
+msgid "aggregate_signature"
+msgstr "aggregate_signature"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:118 sql_help.c:250
+#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:525 sql_help.c:573
+#: sql_help.c:591 sql_help.c:618 sql_help.c:669 sql_help.c:736 sql_help.c:791
+#: sql_help.c:812 sql_help.c:851 sql_help.c:896 sql_help.c:938 sql_help.c:991
+#: sql_help.c:1023 sql_help.c:1033 sql_help.c:1066 sql_help.c:1086
+#: sql_help.c:1100 sql_help.c:1146 sql_help.c:1289 sql_help.c:1412
+#: sql_help.c:1455 sql_help.c:1476 sql_help.c:1490 sql_help.c:1502
+#: sql_help.c:1515 sql_help.c:1542 sql_help.c:1608 sql_help.c:1661
+msgid "new_name"
+msgstr "新的名称"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:120 sql_help.c:248
+#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:530 sql_help.c:620
+#: sql_help.c:629 sql_help.c:690 sql_help.c:710 sql_help.c:739 sql_help.c:794
+#: sql_help.c:856 sql_help.c:894 sql_help.c:996 sql_help.c:1035 sql_help.c:1064
+#: sql_help.c:1084 sql_help.c:1098 sql_help.c:1144 sql_help.c:1352
+#: sql_help.c:1414 sql_help.c:1457 sql_help.c:1478 sql_help.c:1540
+#: sql_help.c:1656 sql_help.c:2936
+msgid "new_owner"
+msgstr "新的属主"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:252 sql_help.c:319
+#: sql_help.c:448 sql_help.c:535 sql_help.c:671 sql_help.c:714 sql_help.c:742
+#: sql_help.c:797 sql_help.c:861 sql_help.c:1001 sql_help.c:1068
+#: sql_help.c:1102 sql_help.c:1291 sql_help.c:1459 sql_help.c:1480
+#: sql_help.c:1492 sql_help.c:1504 sql_help.c:1544 sql_help.c:1663
+msgid "new_schema"
+msgstr "新的模式"
+
+#: sql_help.c:44 sql_help.c:1878 sql_help.c:3265 sql_help.c:4332
+msgid "where aggregate_signature is:"
+msgstr "其中 aggregate_signature 是:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:337 sql_help.c:350
+#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:517
+#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:843
+#: sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:863 sql_help.c:983
+#: sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1003 sql_help.c:1832
+#: sql_help.c:1849 sql_help.c:1855 sql_help.c:1879 sql_help.c:1882
+#: sql_help.c:1885 sql_help.c:2034 sql_help.c:2053 sql_help.c:2056
+#: sql_help.c:2329 sql_help.c:2537 sql_help.c:3266 sql_help.c:3269
+#: sql_help.c:3272 sql_help.c:3363 sql_help.c:3452 sql_help.c:3480
+#: sql_help.c:3825 sql_help.c:4205 sql_help.c:4309 sql_help.c:4316
+#: sql_help.c:4322 sql_help.c:4333 sql_help.c:4336 sql_help.c:4339
+msgid "argmode"
+msgstr "参数模式"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:338 sql_help.c:351
+#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:518
+#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:844
+#: sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:864 sql_help.c:984
+#: sql_help.c:989 sql_help.c:994 sql_help.c:999 sql_help.c:1004 sql_help.c:1833
+#: sql_help.c:1850 sql_help.c:1856 sql_help.c:1880 sql_help.c:1883
+#: sql_help.c:1886 sql_help.c:2035 sql_help.c:2054 sql_help.c:2057
+#: sql_help.c:2330 sql_help.c:2538 sql_help.c:3267 sql_help.c:3270
+#: sql_help.c:3273 sql_help.c:3364 sql_help.c:3453 sql_help.c:3481
+#: sql_help.c:4310 sql_help.c:4317 sql_help.c:4323 sql_help.c:4334
+#: sql_help.c:4337 sql_help.c:4340
+msgid "argname"
+msgstr "参数名称"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:339 sql_help.c:352
+#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:519
+#: sql_help.c:524 sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:845
+#: sql_help.c:850 sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:985
+#: sql_help.c:990 sql_help.c:995 sql_help.c:1000 sql_help.c:1005
+#: sql_help.c:1834 sql_help.c:1851 sql_help.c:1857 sql_help.c:1881
+#: sql_help.c:1884 sql_help.c:1887 sql_help.c:2331 sql_help.c:2539
+#: sql_help.c:3268 sql_help.c:3271 sql_help.c:3274 sql_help.c:3365
+#: sql_help.c:3454 sql_help.c:3482 sql_help.c:4311 sql_help.c:4318
+#: sql_help.c:4324 sql_help.c:4335 sql_help.c:4338 sql_help.c:4341
+msgid "argtype"
+msgstr "参数类型"
+
+#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:932
+#: sql_help.c:1081 sql_help.c:1473 sql_help.c:1602 sql_help.c:1634
+#: sql_help.c:1686 sql_help.c:1749 sql_help.c:1935 sql_help.c:1942
+#: sql_help.c:2234 sql_help.c:2276 sql_help.c:2283 sql_help.c:2292
+#: sql_help.c:2375 sql_help.c:2591 sql_help.c:2684 sql_help.c:2965
+#: sql_help.c:3150 sql_help.c:3172 sql_help.c:3312 sql_help.c:3667
+#: sql_help.c:3866 sql_help.c:4041 sql_help.c:4789
+msgid "option"
+msgstr "选项"
+
+#: sql_help.c:113 sql_help.c:933 sql_help.c:1603 sql_help.c:2376
+#: sql_help.c:2592 sql_help.c:3151 sql_help.c:3313
+msgid "where option can be:"
+msgstr "选项可以是"
+
+#: sql_help.c:114 sql_help.c:2168
+msgid "allowconn"
+msgstr "allowconn"
+
+#: sql_help.c:115 sql_help.c:934 sql_help.c:1604 sql_help.c:2169
+#: sql_help.c:2377 sql_help.c:2593 sql_help.c:3152
+msgid "connlimit"
+msgstr "连接限制"
+
+#: sql_help.c:116 sql_help.c:2170
+msgid "istemplate"
+msgstr "istemplate"
+
+#: sql_help.c:122 sql_help.c:608 sql_help.c:674 sql_help.c:1294 sql_help.c:1345
+#: sql_help.c:4045
+msgid "new_tablespace"
+msgstr "新的表空间"
+
+#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:545 sql_help.c:547
+#: sql_help.c:548 sql_help.c:868 sql_help.c:870 sql_help.c:871 sql_help.c:941
+#: sql_help.c:945 sql_help.c:948 sql_help.c:1010 sql_help.c:1012
+#: sql_help.c:1013 sql_help.c:1157 sql_help.c:1160 sql_help.c:1611
+#: sql_help.c:1615 sql_help.c:1618 sql_help.c:2341 sql_help.c:2543
+#: sql_help.c:4063 sql_help.c:4516
+msgid "configuration_parameter"
+msgstr "配置参数"
+
+#: sql_help.c:125 sql_help.c:395 sql_help.c:466 sql_help.c:472 sql_help.c:484
+#: sql_help.c:546 sql_help.c:600 sql_help.c:680 sql_help.c:688 sql_help.c:869
+#: sql_help.c:892 sql_help.c:942 sql_help.c:1011 sql_help.c:1082
+#: sql_help.c:1126 sql_help.c:1130 sql_help.c:1134 sql_help.c:1137
+#: sql_help.c:1142 sql_help.c:1158 sql_help.c:1159 sql_help.c:1325
+#: sql_help.c:1347 sql_help.c:1395 sql_help.c:1417 sql_help.c:1474
+#: sql_help.c:1558 sql_help.c:1612 sql_help.c:1635 sql_help.c:2235
+#: sql_help.c:2277 sql_help.c:2284 sql_help.c:2293 sql_help.c:2342
+#: sql_help.c:2343 sql_help.c:2406 sql_help.c:2409 sql_help.c:2443
+#: sql_help.c:2544 sql_help.c:2545 sql_help.c:2563 sql_help.c:2685
+#: sql_help.c:2724 sql_help.c:2830 sql_help.c:2843 sql_help.c:2857
+#: sql_help.c:2898 sql_help.c:2922 sql_help.c:2939 sql_help.c:2966
+#: sql_help.c:3173 sql_help.c:3867 sql_help.c:4517 sql_help.c:4518
+msgid "value"
+msgstr "值"
+
+#: sql_help.c:197
+msgid "target_role"
+msgstr "目标角色"
+
+#: sql_help.c:198 sql_help.c:2219 sql_help.c:2640 sql_help.c:2645
+#: sql_help.c:3800 sql_help.c:3809 sql_help.c:3828 sql_help.c:3837
+#: sql_help.c:4180 sql_help.c:4189 sql_help.c:4208 sql_help.c:4217
+msgid "schema_name"
+msgstr "模式名称"
+
+#: sql_help.c:199
+msgid "abbreviated_grant_or_revoke"
+msgstr "简写形式的可授予或回收的权限"
+
+#: sql_help.c:200
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "简写形式的可授予或回收权限是下列内容之一:"
+
+#: sql_help.c:201 sql_help.c:202 sql_help.c:203 sql_help.c:204 sql_help.c:205
+#: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210
+#: sql_help.c:571 sql_help.c:607 sql_help.c:673 sql_help.c:815 sql_help.c:952
+#: sql_help.c:1293 sql_help.c:1622 sql_help.c:2380 sql_help.c:2381
+#: sql_help.c:2382 sql_help.c:2383 sql_help.c:2384 sql_help.c:2517
+#: sql_help.c:2596 sql_help.c:2597 sql_help.c:2598 sql_help.c:2599
+#: sql_help.c:2600 sql_help.c:3155 sql_help.c:3156 sql_help.c:3157
+#: sql_help.c:3158 sql_help.c:3159 sql_help.c:3846 sql_help.c:3850
+#: sql_help.c:4226 sql_help.c:4230 sql_help.c:4537
+msgid "role_name"
+msgstr "角色名称"
+
+#: sql_help.c:236 sql_help.c:459 sql_help.c:1309 sql_help.c:1311
+#: sql_help.c:1362 sql_help.c:1374 sql_help.c:1399 sql_help.c:1652
+#: sql_help.c:2189 sql_help.c:2193 sql_help.c:2296 sql_help.c:2301
+#: sql_help.c:2402 sql_help.c:2701 sql_help.c:2706 sql_help.c:2708
+#: sql_help.c:2825 sql_help.c:2838 sql_help.c:2852 sql_help.c:2861
+#: sql_help.c:2873 sql_help.c:2902 sql_help.c:3898 sql_help.c:3913
+#: sql_help.c:3915 sql_help.c:4394 sql_help.c:4395 sql_help.c:4404
+#: sql_help.c:4446 sql_help.c:4447 sql_help.c:4448 sql_help.c:4449
+#: sql_help.c:4450 sql_help.c:4451 sql_help.c:4491 sql_help.c:4492
+#: sql_help.c:4497 sql_help.c:4502 sql_help.c:4643 sql_help.c:4644
+#: sql_help.c:4653 sql_help.c:4695 sql_help.c:4696 sql_help.c:4697
+#: sql_help.c:4698 sql_help.c:4699 sql_help.c:4700 sql_help.c:4754
+#: sql_help.c:4756 sql_help.c:4816 sql_help.c:4874 sql_help.c:4875
+#: sql_help.c:4884 sql_help.c:4926 sql_help.c:4927 sql_help.c:4928
+#: sql_help.c:4929 sql_help.c:4930 sql_help.c:4931
+msgid "expression"
+msgstr "表达式"
+
+#: sql_help.c:239
+msgid "domain_constraint"
+msgstr "域_约束"
+
+#: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:474 sql_help.c:475
+#: sql_help.c:1286 sql_help.c:1333 sql_help.c:1334 sql_help.c:1335
+#: sql_help.c:1361 sql_help.c:1373 sql_help.c:1390 sql_help.c:1820
+#: sql_help.c:1822 sql_help.c:2192 sql_help.c:2295 sql_help.c:2300
+#: sql_help.c:2860 sql_help.c:2872 sql_help.c:3910
+msgid "constraint_name"
+msgstr "约束名称"
+
+#: sql_help.c:244 sql_help.c:1287
+msgid "new_constraint_name"
+msgstr "new_constraint_name(新约束名)"
+
+#: sql_help.c:317 sql_help.c:1080
+msgid "new_version"
+msgstr "新版本"
+
+#: sql_help.c:321 sql_help.c:323
+msgid "member_object"
+msgstr "member_object"
+
+#: sql_help.c:324
+msgid "where member_object is:"
+msgstr "member_object的位置:"
+
+#: sql_help.c:325 sql_help.c:330 sql_help.c:331 sql_help.c:332 sql_help.c:333
+#: sql_help.c:334 sql_help.c:335 sql_help.c:340 sql_help.c:344 sql_help.c:346
+#: sql_help.c:348 sql_help.c:357 sql_help.c:358 sql_help.c:359 sql_help.c:360
+#: sql_help.c:361 sql_help.c:362 sql_help.c:363 sql_help.c:364 sql_help.c:367
+#: sql_help.c:368 sql_help.c:1812 sql_help.c:1817 sql_help.c:1824
+#: sql_help.c:1825 sql_help.c:1826 sql_help.c:1827 sql_help.c:1828
+#: sql_help.c:1829 sql_help.c:1830 sql_help.c:1835 sql_help.c:1837
+#: sql_help.c:1841 sql_help.c:1843 sql_help.c:1847 sql_help.c:1852
+#: sql_help.c:1853 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862
+#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1865 sql_help.c:1866
+#: sql_help.c:1867 sql_help.c:1868 sql_help.c:1869 sql_help.c:1870
+#: sql_help.c:1875 sql_help.c:1876 sql_help.c:4299 sql_help.c:4304
+#: sql_help.c:4305 sql_help.c:4306 sql_help.c:4307 sql_help.c:4313
+#: sql_help.c:4314 sql_help.c:4319 sql_help.c:4320 sql_help.c:4325
+#: sql_help.c:4326 sql_help.c:4327 sql_help.c:4328 sql_help.c:4329
+#: sql_help.c:4330
+msgid "object_name"
+msgstr "对象_名称"
+
+#: sql_help.c:326 sql_help.c:1813 sql_help.c:4302
+msgid "aggregate_name"
+msgstr "aggregate_name"
+
+#: sql_help.c:328 sql_help.c:1815 sql_help.c:2099 sql_help.c:2103
+#: sql_help.c:2105 sql_help.c:3282
+msgid "source_type"
+msgstr "类型指派中的源数据类型"
+
+#: sql_help.c:329 sql_help.c:1816 sql_help.c:2100 sql_help.c:2104
+#: sql_help.c:2106 sql_help.c:3283
+msgid "target_type"
+msgstr "类型指派中的目标数据类型"
+
+#: sql_help.c:336 sql_help.c:779 sql_help.c:1831 sql_help.c:2101
+#: sql_help.c:2142 sql_help.c:2207 sql_help.c:2460 sql_help.c:2491
+#: sql_help.c:3042 sql_help.c:4204 sql_help.c:4308 sql_help.c:4423
+#: sql_help.c:4427 sql_help.c:4431 sql_help.c:4434 sql_help.c:4672
+#: sql_help.c:4676 sql_help.c:4680 sql_help.c:4683 sql_help.c:4903
+#: sql_help.c:4907 sql_help.c:4911 sql_help.c:4914
+msgid "function_name"
+msgstr "函数名称"
+
+#: sql_help.c:341 sql_help.c:772 sql_help.c:1838 sql_help.c:2484
+msgid "operator_name"
+msgstr "操作符名称"
+
+#: sql_help.c:342 sql_help.c:708 sql_help.c:712 sql_help.c:716 sql_help.c:1839
+#: sql_help.c:2461 sql_help.c:3406
+msgid "left_type"
+msgstr "操作符左边操作数的类型"
+
+#: sql_help.c:343 sql_help.c:709 sql_help.c:713 sql_help.c:717 sql_help.c:1840
+#: sql_help.c:2462 sql_help.c:3407
+msgid "right_type"
+msgstr "操作符右边操作数的类型"
+
+#: sql_help.c:345 sql_help.c:347 sql_help.c:735 sql_help.c:738 sql_help.c:741
+#: sql_help.c:770 sql_help.c:782 sql_help.c:790 sql_help.c:793 sql_help.c:796
+#: sql_help.c:1379 sql_help.c:1842 sql_help.c:1844 sql_help.c:2481
+#: sql_help.c:2502 sql_help.c:2878 sql_help.c:3416 sql_help.c:3425
+msgid "index_method"
+msgstr "访问索引的方法"
+
+#: sql_help.c:349 sql_help.c:1848 sql_help.c:4315
+msgid "procedure_name"
+msgstr "程序名称 "
+
+#: sql_help.c:353 sql_help.c:1854 sql_help.c:3824 sql_help.c:4321
+msgid "routine_name"
+msgstr "程序名称"
+
+#: sql_help.c:365 sql_help.c:1351 sql_help.c:1871 sql_help.c:2337
+#: sql_help.c:2542 sql_help.c:2833 sql_help.c:3009 sql_help.c:3587
+#: sql_help.c:3843 sql_help.c:4223
+msgid "type_name"
+msgstr "类型名称"
+
+#: sql_help.c:366 sql_help.c:1872 sql_help.c:2336 sql_help.c:2541
+#: sql_help.c:3010 sql_help.c:3240 sql_help.c:3588 sql_help.c:3831
+#: sql_help.c:4211
+msgid "lang_name"
+msgstr "语言名称"
+
+#: sql_help.c:369
+msgid "and aggregate_signature is:"
+msgstr "aggregate_signature指的是:"
+
+#: sql_help.c:392 sql_help.c:1966 sql_help.c:2232
+msgid "handler_function"
+msgstr "handler_function(处理_函数)"
+
+#: sql_help.c:393 sql_help.c:2233
+msgid "validator_function"
+msgstr "validator_function(验证_函数)"
+
+#: sql_help.c:441 sql_help.c:520 sql_help.c:662 sql_help.c:846 sql_help.c:986
+#: sql_help.c:1281 sql_help.c:1549
+msgid "action"
+msgstr "操作"
+
+#: sql_help.c:443 sql_help.c:450 sql_help.c:454 sql_help.c:455 sql_help.c:458
+#: sql_help.c:460 sql_help.c:461 sql_help.c:462 sql_help.c:464 sql_help.c:467
+#: sql_help.c:469 sql_help.c:470 sql_help.c:666 sql_help.c:676 sql_help.c:678
+#: sql_help.c:681 sql_help.c:683 sql_help.c:684 sql_help.c:1062 sql_help.c:1283
+#: sql_help.c:1301 sql_help.c:1305 sql_help.c:1306 sql_help.c:1310
+#: sql_help.c:1312 sql_help.c:1313 sql_help.c:1314 sql_help.c:1315
+#: sql_help.c:1317 sql_help.c:1320 sql_help.c:1321 sql_help.c:1323
+#: sql_help.c:1326 sql_help.c:1328 sql_help.c:1329 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1384 sql_help.c:1393 sql_help.c:1398
+#: sql_help.c:1651 sql_help.c:1654 sql_help.c:1658 sql_help.c:1694
+#: sql_help.c:1819 sql_help.c:1932 sql_help.c:1938 sql_help.c:1951
+#: sql_help.c:1952 sql_help.c:1953 sql_help.c:2274 sql_help.c:2287
+#: sql_help.c:2334 sql_help.c:2401 sql_help.c:2407 sql_help.c:2440
+#: sql_help.c:2670 sql_help.c:2705 sql_help.c:2707 sql_help.c:2815
+#: sql_help.c:2824 sql_help.c:2834 sql_help.c:2837 sql_help.c:2847
+#: sql_help.c:2851 sql_help.c:2874 sql_help.c:2876 sql_help.c:2883
+#: sql_help.c:2896 sql_help.c:2901 sql_help.c:2919 sql_help.c:3045
+#: sql_help.c:3185 sql_help.c:3803 sql_help.c:3804 sql_help.c:3897
+#: sql_help.c:3912 sql_help.c:3914 sql_help.c:3916 sql_help.c:4183
+#: sql_help.c:4184 sql_help.c:4301 sql_help.c:4455 sql_help.c:4461
+#: sql_help.c:4463 sql_help.c:4704 sql_help.c:4710 sql_help.c:4712
+#: sql_help.c:4753 sql_help.c:4755 sql_help.c:4757 sql_help.c:4804
+#: sql_help.c:4935 sql_help.c:4941 sql_help.c:4943
+msgid "column_name"
+msgstr "列名称"
+
+#: sql_help.c:444 sql_help.c:667 sql_help.c:1284 sql_help.c:1659
+msgid "new_column_name"
+msgstr "new_column_name(新列名)"
+
+#: sql_help.c:449 sql_help.c:541 sql_help.c:675 sql_help.c:867 sql_help.c:1007
+#: sql_help.c:1300 sql_help.c:1559
+msgid "where action is one of:"
+msgstr "操作可以是下列选项之一"
+
+#: sql_help.c:451 sql_help.c:456 sql_help.c:1054 sql_help.c:1302
+#: sql_help.c:1307 sql_help.c:1561 sql_help.c:1565 sql_help.c:2187
+#: sql_help.c:2275 sql_help.c:2480 sql_help.c:2663 sql_help.c:2816
+#: sql_help.c:3092 sql_help.c:3999
+msgid "data_type"
+msgstr "数据_类型"
+
+#: sql_help.c:452 sql_help.c:457 sql_help.c:1303 sql_help.c:1308
+#: sql_help.c:1562 sql_help.c:1566 sql_help.c:2188 sql_help.c:2278
+#: sql_help.c:2403 sql_help.c:2818 sql_help.c:2826 sql_help.c:2839
+#: sql_help.c:2853 sql_help.c:3093 sql_help.c:3099 sql_help.c:3907
+msgid "collation"
+msgstr "校对规则"
+
+#: sql_help.c:453 sql_help.c:1304 sql_help.c:2279 sql_help.c:2288
+#: sql_help.c:2819 sql_help.c:2835 sql_help.c:2848
+msgid "column_constraint"
+msgstr "列约束"
+
+#: sql_help.c:463 sql_help.c:605 sql_help.c:677 sql_help.c:1322 sql_help.c:4801
+msgid "integer"
+msgstr "整数"
+
+#: sql_help.c:465 sql_help.c:468 sql_help.c:679 sql_help.c:682 sql_help.c:1324
+#: sql_help.c:1327
+msgid "attribute_option"
+msgstr "属性选项"
+
+#: sql_help.c:473 sql_help.c:1331 sql_help.c:2280 sql_help.c:2289
+#: sql_help.c:2820 sql_help.c:2836 sql_help.c:2849
+msgid "table_constraint"
+msgstr "表约束"
+
+#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1336
+#: sql_help.c:1337 sql_help.c:1338 sql_help.c:1339 sql_help.c:1873
+msgid "trigger_name"
+msgstr "触发器_名称"
+
+#: sql_help.c:480 sql_help.c:481 sql_help.c:1349 sql_help.c:1350
+#: sql_help.c:2281 sql_help.c:2286 sql_help.c:2823 sql_help.c:2846
+msgid "parent_table"
+msgstr "父表"
+
+#: sql_help.c:540 sql_help.c:597 sql_help.c:664 sql_help.c:866 sql_help.c:1006
+#: sql_help.c:1518 sql_help.c:2218
+msgid "extension_name"
+msgstr "extension_name(扩展名)"
+
+#: sql_help.c:542 sql_help.c:1008 sql_help.c:2338
+msgid "execution_cost"
+msgstr "执行函数的开销"
+
+#: sql_help.c:543 sql_help.c:1009 sql_help.c:2339
+msgid "result_rows"
+msgstr "返回记录的数量"
+
+#: sql_help.c:544 sql_help.c:2340
+msgid "support_function"
+msgstr "支持_函数"
+
+#: sql_help.c:566 sql_help.c:568 sql_help.c:931 sql_help.c:939 sql_help.c:943
+#: sql_help.c:946 sql_help.c:949 sql_help.c:1601 sql_help.c:1609
+#: sql_help.c:1613 sql_help.c:1616 sql_help.c:1619 sql_help.c:2641
+#: sql_help.c:2643 sql_help.c:2646 sql_help.c:2647 sql_help.c:3801
+#: sql_help.c:3802 sql_help.c:3806 sql_help.c:3807 sql_help.c:3810
+#: sql_help.c:3811 sql_help.c:3813 sql_help.c:3814 sql_help.c:3816
+#: sql_help.c:3817 sql_help.c:3819 sql_help.c:3820 sql_help.c:3822
+#: sql_help.c:3823 sql_help.c:3829 sql_help.c:3830 sql_help.c:3832
+#: sql_help.c:3833 sql_help.c:3835 sql_help.c:3836 sql_help.c:3838
+#: sql_help.c:3839 sql_help.c:3841 sql_help.c:3842 sql_help.c:3844
+#: sql_help.c:3845 sql_help.c:3847 sql_help.c:3848 sql_help.c:4181
+#: sql_help.c:4182 sql_help.c:4186 sql_help.c:4187 sql_help.c:4190
+#: sql_help.c:4191 sql_help.c:4193 sql_help.c:4194 sql_help.c:4196
+#: sql_help.c:4197 sql_help.c:4199 sql_help.c:4200 sql_help.c:4202
+#: sql_help.c:4203 sql_help.c:4209 sql_help.c:4210 sql_help.c:4212
+#: sql_help.c:4213 sql_help.c:4215 sql_help.c:4216 sql_help.c:4218
+#: sql_help.c:4219 sql_help.c:4221 sql_help.c:4222 sql_help.c:4224
+#: sql_help.c:4225 sql_help.c:4227 sql_help.c:4228
+msgid "role_specification"
+msgstr "role_specification"
+
+#: sql_help.c:567 sql_help.c:569 sql_help.c:1632 sql_help.c:2161
+#: sql_help.c:2649 sql_help.c:3170 sql_help.c:3621 sql_help.c:4547
+msgid "user_name"
+msgstr "用户名"
+
+#: sql_help.c:570 sql_help.c:951 sql_help.c:1621 sql_help.c:2648
+#: sql_help.c:3849 sql_help.c:4229
+msgid "where role_specification can be:"
+msgstr "这里role_specification可以是:"
+
+#: sql_help.c:572
+msgid "group_name"
+msgstr "组名称"
+
+#: sql_help.c:593 sql_help.c:1396 sql_help.c:2167 sql_help.c:2410
+#: sql_help.c:2444 sql_help.c:2831 sql_help.c:2844 sql_help.c:2858
+#: sql_help.c:2899 sql_help.c:2923 sql_help.c:2935 sql_help.c:3840
+#: sql_help.c:4220
+msgid "tablespace_name"
+msgstr "表空间的名称"
+
+#: sql_help.c:595 sql_help.c:686 sql_help.c:1344 sql_help.c:1353
+#: sql_help.c:1391 sql_help.c:1748 sql_help.c:1751
+msgid "index_name"
+msgstr "索引名称"
+
+#: sql_help.c:599 sql_help.c:602 sql_help.c:687 sql_help.c:689 sql_help.c:1346
+#: sql_help.c:1348 sql_help.c:1394 sql_help.c:2408 sql_help.c:2442
+#: sql_help.c:2829 sql_help.c:2842 sql_help.c:2856 sql_help.c:2897
+#: sql_help.c:2921
+msgid "storage_parameter"
+msgstr "存储参数"
+
+#: sql_help.c:604
+msgid "column_number"
+msgstr "列数"
+
+#: sql_help.c:628 sql_help.c:1836 sql_help.c:4312
+msgid "large_object_oid"
+msgstr "大对象的OID"
+
+#: sql_help.c:685 sql_help.c:1330 sql_help.c:2817
+msgid "compression_method"
+msgstr "压缩方法"
+
+#: sql_help.c:718 sql_help.c:2465
+msgid "res_proc"
+msgstr "限制选择性估算函数"
+
+#: sql_help.c:719 sql_help.c:2466
+msgid "join_proc"
+msgstr "连接选择性估算函数"
+
+#: sql_help.c:771 sql_help.c:783 sql_help.c:2483
+msgid "strategy_number"
+msgstr "访问索引所用方法的编号"
+
+#: sql_help.c:773 sql_help.c:774 sql_help.c:777 sql_help.c:778 sql_help.c:784
+#: sql_help.c:785 sql_help.c:787 sql_help.c:788 sql_help.c:2485 sql_help.c:2486
+#: sql_help.c:2489 sql_help.c:2490
+msgid "op_type"
+msgstr "操作数类型"
+
+#: sql_help.c:775 sql_help.c:2487
+msgid "sort_family_name"
+msgstr "sort_family_name(排序家族名)"
+
+#: sql_help.c:776 sql_help.c:786 sql_help.c:2488
+msgid "support_number"
+msgstr "访问索引所使用函数的编号"
+
+#: sql_help.c:780 sql_help.c:2102 sql_help.c:2492 sql_help.c:3012
+#: sql_help.c:3014
+msgid "argument_type"
+msgstr "参数类型"
+
+#: sql_help.c:811 sql_help.c:814 sql_help.c:885 sql_help.c:887 sql_help.c:889
+#: sql_help.c:1022 sql_help.c:1061 sql_help.c:1514 sql_help.c:1517
+#: sql_help.c:1693 sql_help.c:1747 sql_help.c:1750 sql_help.c:1821
+#: sql_help.c:1846 sql_help.c:1859 sql_help.c:1874 sql_help.c:1931
+#: sql_help.c:1937 sql_help.c:2273 sql_help.c:2285 sql_help.c:2399
+#: sql_help.c:2439 sql_help.c:2516 sql_help.c:2561 sql_help.c:2617
+#: sql_help.c:2669 sql_help.c:2702 sql_help.c:2709 sql_help.c:2814
+#: sql_help.c:2832 sql_help.c:2845 sql_help.c:2918 sql_help.c:3038
+#: sql_help.c:3219 sql_help.c:3442 sql_help.c:3491 sql_help.c:3597
+#: sql_help.c:3799 sql_help.c:3805 sql_help.c:3863 sql_help.c:3895
+#: sql_help.c:4179 sql_help.c:4185 sql_help.c:4300 sql_help.c:4409
+#: sql_help.c:4411 sql_help.c:4468 sql_help.c:4507 sql_help.c:4658
+#: sql_help.c:4660 sql_help.c:4717 sql_help.c:4751 sql_help.c:4803
+#: sql_help.c:4889 sql_help.c:4891 sql_help.c:4948
+msgid "table_name"
+msgstr "表名"
+
+#: sql_help.c:816 sql_help.c:2518
+msgid "using_expression"
+msgstr "使用表达式"
+
+#: sql_help.c:817 sql_help.c:2519
+msgid "check_expression"
+msgstr "检查表达式"
+
+#: sql_help.c:891 sql_help.c:2562
+msgid "publication_parameter"
+msgstr "发布参数"
+
+#: sql_help.c:935 sql_help.c:1605 sql_help.c:2378 sql_help.c:2594
+#: sql_help.c:3153
+msgid "password"
+msgstr "口令"
+
+#: sql_help.c:936 sql_help.c:1606 sql_help.c:2379 sql_help.c:2595
+#: sql_help.c:3154
+msgid "timestamp"
+msgstr "时间戳"
+
+#: sql_help.c:940 sql_help.c:944 sql_help.c:947 sql_help.c:950 sql_help.c:1610
+#: sql_help.c:1614 sql_help.c:1617 sql_help.c:1620 sql_help.c:3812
+#: sql_help.c:4192
+msgid "database_name"
+msgstr "数据库名称"
+
+#: sql_help.c:1055 sql_help.c:2664
+msgid "increment"
+msgstr "增量"
+
+#: sql_help.c:1056 sql_help.c:2665
+msgid "minvalue"
+msgstr "最小值"
+
+#: sql_help.c:1057 sql_help.c:2666
+msgid "maxvalue"
+msgstr "最大值"
+
+#: sql_help.c:1058 sql_help.c:2667 sql_help.c:4407 sql_help.c:4505
+#: sql_help.c:4656 sql_help.c:4820 sql_help.c:4887
+msgid "start"
+msgstr "起始值"
+
+#: sql_help.c:1059 sql_help.c:1319
+msgid "restart"
+msgstr "重新启动后的序列值"
+
+#: sql_help.c:1060 sql_help.c:2668
+msgid "cache"
+msgstr "缓存"
+
+#: sql_help.c:1104
+msgid "new_target"
+msgstr "新目标"
+
+#: sql_help.c:1122 sql_help.c:2721
+msgid "conninfo"
+msgstr "连接信息"
+
+#: sql_help.c:1124 sql_help.c:1128 sql_help.c:1132 sql_help.c:2722
+msgid "publication_name"
+msgstr "发布名"
+
+#: sql_help.c:1125 sql_help.c:1129 sql_help.c:1133
+msgid "publication_option"
+msgstr "发布选项"
+
+#: sql_help.c:1136
+msgid "refresh_option"
+msgstr "refresh选项"
+
+#: sql_help.c:1141 sql_help.c:2723
+msgid "subscription_parameter"
+msgstr "订阅参数"
+
+#: sql_help.c:1296 sql_help.c:1299
+msgid "partition_name"
+msgstr "分区名"
+
+#: sql_help.c:1297 sql_help.c:2290 sql_help.c:2850
+msgid "partition_bound_spec"
+msgstr "分区绑定规范"
+
+#: sql_help.c:1316 sql_help.c:1365 sql_help.c:2864
+msgid "sequence_options"
+msgstr "序列选项"
+
+#: sql_help.c:1318
+msgid "sequence_option"
+msgstr "序列选项"
+
+#: sql_help.c:1332
+msgid "table_constraint_using_index"
+msgstr "table_constraint_using_index(表约束使用索引)"
+
+#: sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 sql_help.c:1343
+msgid "rewrite_rule_name"
+msgstr "重写规则名称"
+
+#: sql_help.c:1354 sql_help.c:2889
+msgid "and partition_bound_spec is:"
+msgstr "并且分区绑定的规范是:"
+
+#: sql_help.c:1355 sql_help.c:1356 sql_help.c:1357 sql_help.c:2890
+#: sql_help.c:2891 sql_help.c:2892
+msgid "partition_bound_expr"
+msgstr "分区_绑定_表达式"
+
+#: sql_help.c:1358 sql_help.c:1359 sql_help.c:2893 sql_help.c:2894
+msgid "numeric_literal"
+msgstr "数字_文字"
+
+#: sql_help.c:1360
+msgid "and column_constraint is:"
+msgstr "并且列的约束是:"
+
+#: sql_help.c:1363 sql_help.c:2297 sql_help.c:2332 sql_help.c:2540
+#: sql_help.c:2862
+msgid "default_expr"
+msgstr "默认_表达式"
+
+#: sql_help.c:1364 sql_help.c:2298 sql_help.c:2863
+msgid "generation_expr"
+msgstr "生成表_达式"
+
+#: sql_help.c:1366 sql_help.c:1367 sql_help.c:1376 sql_help.c:1378
+#: sql_help.c:1382 sql_help.c:2865 sql_help.c:2866 sql_help.c:2875
+#: sql_help.c:2877 sql_help.c:2881
+msgid "index_parameters"
+msgstr "索引参数"
+
+#: sql_help.c:1368 sql_help.c:1385 sql_help.c:2867 sql_help.c:2884
+msgid "reftable"
+msgstr "所引用的表"
+
+#: sql_help.c:1369 sql_help.c:1386 sql_help.c:2868 sql_help.c:2885
+msgid "refcolumn"
+msgstr "所引用的列"
+
+#: sql_help.c:1370 sql_help.c:1371 sql_help.c:1387 sql_help.c:1388
+#: sql_help.c:2869 sql_help.c:2870 sql_help.c:2886 sql_help.c:2887
+msgid "referential_action"
+msgstr "参考_行动"
+
+#: sql_help.c:1372 sql_help.c:2299 sql_help.c:2871
+msgid "and table_constraint is:"
+msgstr "表约束是:"
+
+#: sql_help.c:1380 sql_help.c:2879
+msgid "exclude_element"
+msgstr "排除项"
+
+#: sql_help.c:1381 sql_help.c:2880 sql_help.c:4405 sql_help.c:4503
+#: sql_help.c:4654 sql_help.c:4818 sql_help.c:4885
+msgid "operator"
+msgstr "运算子"
+
+#: sql_help.c:1383 sql_help.c:2411 sql_help.c:2882
+msgid "predicate"
+msgstr "述词"
+
+#: sql_help.c:1389
+msgid "and table_constraint_using_index is:"
+msgstr "table_constraint_using_index 是:"
+
+#: sql_help.c:1392 sql_help.c:2895
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "在UNIQUE, PRIMARY KEY和EXCLUDE中的索引参数是:"
+
+#: sql_help.c:1397 sql_help.c:2900
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "在EXCLUDE约束中的排除项是:"
+
+#: sql_help.c:1400 sql_help.c:2404 sql_help.c:2827 sql_help.c:2840
+#: sql_help.c:2854 sql_help.c:2903 sql_help.c:3908
+msgid "opclass"
+msgstr "操作符类型的名称"
+
+#: sql_help.c:1416 sql_help.c:1419 sql_help.c:2938
+msgid "tablespace_option"
+msgstr "表空间_选项"
+
+#: sql_help.c:1440 sql_help.c:1443 sql_help.c:1449 sql_help.c:1453
+msgid "token_type"
+msgstr "符号类型"
+
+#: sql_help.c:1441 sql_help.c:1444
+msgid "dictionary_name"
+msgstr "字典名称"
+
+#: sql_help.c:1446 sql_help.c:1450
+msgid "old_dictionary"
+msgstr "旧的字典"
+
+#: sql_help.c:1447 sql_help.c:1451
+msgid "new_dictionary"
+msgstr "新的字典"
+
+#: sql_help.c:1546 sql_help.c:1560 sql_help.c:1563 sql_help.c:1564
+#: sql_help.c:3091
+msgid "attribute_name"
+msgstr "属性_名称"
+
+#: sql_help.c:1547
+msgid "new_attribute_name"
+msgstr "new_attribute_name(新属性名)"
+
+#: sql_help.c:1551 sql_help.c:1555
+msgid "new_enum_value"
+msgstr "new_enum_value(新枚举名)"
+
+#: sql_help.c:1552
+msgid "neighbor_enum_value"
+msgstr "相邻的枚举值"
+
+#: sql_help.c:1554
+msgid "existing_enum_value"
+msgstr "现有枚举值"
+
+#: sql_help.c:1557
+msgid "property"
+msgstr "属性"
+
+#: sql_help.c:1633 sql_help.c:2282 sql_help.c:2291 sql_help.c:2680
+#: sql_help.c:3171 sql_help.c:3622 sql_help.c:3821 sql_help.c:3864
+#: sql_help.c:4201
+msgid "server_name"
+msgstr "服务器名称"
+
+#: sql_help.c:1665 sql_help.c:1668 sql_help.c:3186
+msgid "view_option_name"
+msgstr "view_option_name(视图选项名)"
+
+#: sql_help.c:1666 sql_help.c:3187
+msgid "view_option_value"
+msgstr "view_option_value(视图选项值)"
+
+#: sql_help.c:1687 sql_help.c:1688 sql_help.c:4790 sql_help.c:4791
+msgid "table_and_columns"
+msgstr "表和列"
+
+#: sql_help.c:1689 sql_help.c:1752 sql_help.c:1943 sql_help.c:3670
+#: sql_help.c:4043 sql_help.c:4792
+msgid "where option can be one of:"
+msgstr "选项可以是下列内容之一:"
+
+#: sql_help.c:1690 sql_help.c:1691 sql_help.c:1753 sql_help.c:1945
+#: sql_help.c:1948 sql_help.c:2127 sql_help.c:3671 sql_help.c:3672
+#: sql_help.c:3673 sql_help.c:3674 sql_help.c:3675 sql_help.c:3676
+#: sql_help.c:3677 sql_help.c:3678 sql_help.c:4044 sql_help.c:4046
+#: sql_help.c:4793 sql_help.c:4794 sql_help.c:4795 sql_help.c:4796
+#: sql_help.c:4797 sql_help.c:4798 sql_help.c:4799 sql_help.c:4800
+msgid "boolean"
+msgstr "布尔"
+
+#: sql_help.c:1692 sql_help.c:4802
+msgid "and table_and_columns is:"
+msgstr "并且表和列:"
+
+#: sql_help.c:1708 sql_help.c:4563 sql_help.c:4565 sql_help.c:4589
+msgid "transaction_mode"
+msgstr "事务模式"
+
+#: sql_help.c:1709 sql_help.c:4566 sql_help.c:4590
+msgid "where transaction_mode is one of:"
+msgstr "事务模式可以是下列选项之一:"
+
+#: sql_help.c:1718 sql_help.c:4415 sql_help.c:4424 sql_help.c:4428
+#: sql_help.c:4432 sql_help.c:4435 sql_help.c:4664 sql_help.c:4673
+#: sql_help.c:4677 sql_help.c:4681 sql_help.c:4684 sql_help.c:4895
+#: sql_help.c:4904 sql_help.c:4908 sql_help.c:4912 sql_help.c:4915
+msgid "argument"
+msgstr "参数"
+
+#: sql_help.c:1818
+msgid "relation_name"
+msgstr "relation_name(关系名)"
+
+#: sql_help.c:1823 sql_help.c:3815 sql_help.c:4195
+msgid "domain_name"
+msgstr "域_名称"
+
+#: sql_help.c:1845
+msgid "policy_name"
+msgstr "policy_name"
+
+#: sql_help.c:1858
+msgid "rule_name"
+msgstr "规则_名称"
+
+#: sql_help.c:1877
+msgid "text"
+msgstr "文本"
+
+#: sql_help.c:1902 sql_help.c:4008 sql_help.c:4245
+msgid "transaction_id"
+msgstr "事务_ID"
+
+#: sql_help.c:1933 sql_help.c:1940 sql_help.c:3934
+msgid "filename"
+msgstr "文件名"
+
+#: sql_help.c:1934 sql_help.c:1941 sql_help.c:2619 sql_help.c:2620
+#: sql_help.c:2621
+msgid "command"
+msgstr "命令"
+
+#: sql_help.c:1936 sql_help.c:2618 sql_help.c:3041 sql_help.c:3222
+#: sql_help.c:3918 sql_help.c:4398 sql_help.c:4400 sql_help.c:4496
+#: sql_help.c:4498 sql_help.c:4647 sql_help.c:4649 sql_help.c:4760
+#: sql_help.c:4878 sql_help.c:4880
+msgid "condition"
+msgstr "条件"
+
+#: sql_help.c:1939 sql_help.c:2445 sql_help.c:2924 sql_help.c:3188
+#: sql_help.c:3206 sql_help.c:3899
+msgid "query"
+msgstr "查询"
+
+#: sql_help.c:1944
+msgid "format_name"
+msgstr "格式_名称"
+
+#: sql_help.c:1946
+msgid "delimiter_character"
+msgstr "分隔字符"
+
+#: sql_help.c:1947
+msgid "null_string"
+msgstr "空字符串"
+
+#: sql_help.c:1949
+msgid "quote_character"
+msgstr "引用字符"
+
+#: sql_help.c:1950
+msgid "escape_character"
+msgstr "转义字符"
+
+#: sql_help.c:1954
+msgid "encoding_name"
+msgstr "encoding_name(编码名)"
+
+#: sql_help.c:1965
+msgid "access_method_type"
+msgstr "access_method_type"
+
+#: sql_help.c:2036 sql_help.c:2055 sql_help.c:2058
+msgid "arg_data_type"
+msgstr "arg_data_type"
+
+#: sql_help.c:2037 sql_help.c:2059 sql_help.c:2067
+msgid "sfunc"
+msgstr "状态转换函数名称"
+
+#: sql_help.c:2038 sql_help.c:2060 sql_help.c:2068
+msgid "state_data_type"
+msgstr "状态值的数据类型"
+
+#: sql_help.c:2039 sql_help.c:2061 sql_help.c:2069
+msgid "state_data_size"
+msgstr "state_data_size"
+
+#: sql_help.c:2040 sql_help.c:2062 sql_help.c:2070
+msgid "ffunc"
+msgstr "计算最终结果集的函数名称"
+
+#: sql_help.c:2041 sql_help.c:2071
+msgid "combinefunc"
+msgstr "combinefunc"
+
+#: sql_help.c:2042 sql_help.c:2072
+msgid "serialfunc"
+msgstr "serialfunc"
+
+#: sql_help.c:2043 sql_help.c:2073
+msgid "deserialfunc"
+msgstr "deserialfunc"
+
+#: sql_help.c:2044 sql_help.c:2063 sql_help.c:2074
+msgid "initial_condition"
+msgstr "初始条件"
+
+#: sql_help.c:2045 sql_help.c:2075
+msgid "msfunc"
+msgstr "msfunc"
+
+#: sql_help.c:2046 sql_help.c:2076
+msgid "minvfunc"
+msgstr "minvfunc"
+
+#: sql_help.c:2047 sql_help.c:2077
+msgid "mstate_data_type"
+msgstr "mstate_data_type"
+
+#: sql_help.c:2048 sql_help.c:2078
+msgid "mstate_data_size"
+msgstr "mstate_data_size"
+
+#: sql_help.c:2049 sql_help.c:2079
+msgid "mffunc"
+msgstr "mffunc"
+
+#: sql_help.c:2050 sql_help.c:2080
+msgid "minitial_condition"
+msgstr "minitial_condition"
+
+#: sql_help.c:2051 sql_help.c:2081
+msgid "sort_operator"
+msgstr "排序_操作符"
+
+#: sql_help.c:2064
+msgid "or the old syntax"
+msgstr "或者是旧的语法"
+
+#: sql_help.c:2066
+msgid "base_type"
+msgstr "基础_类型"
+
+#: sql_help.c:2123 sql_help.c:2164
+msgid "locale"
+msgstr "本地化语言"
+
+#: sql_help.c:2124 sql_help.c:2165
+msgid "lc_collate"
+msgstr "排序规则"
+
+#: sql_help.c:2125 sql_help.c:2166
+msgid "lc_ctype"
+msgstr "字符分类"
+
+#: sql_help.c:2126 sql_help.c:4298
+msgid "provider"
+msgstr "provider(提供者)"
+
+#: sql_help.c:2128 sql_help.c:2220
+msgid "version"
+msgstr "version(版本)"
+
+#: sql_help.c:2130
+msgid "existing_collation"
+msgstr "existing_collation(当前的本地化语言)"
+
+#: sql_help.c:2140
+msgid "source_encoding"
+msgstr "源_编码"
+
+#: sql_help.c:2141
+msgid "dest_encoding"
+msgstr "目的_编码"
+
+#: sql_help.c:2162 sql_help.c:2964
+msgid "template"
+msgstr "模版"
+
+#: sql_help.c:2163
+msgid "encoding"
+msgstr "字符集编码"
+
+#: sql_help.c:2190
+msgid "constraint"
+msgstr "约束"
+
+#: sql_help.c:2191
+msgid "where constraint is:"
+msgstr "约束是:"
+
+#: sql_help.c:2205 sql_help.c:2616 sql_help.c:3037
+msgid "event"
+msgstr "事件"
+
+#: sql_help.c:2206
+msgid "filter_variable"
+msgstr "过滤器变量"
+
+#: sql_help.c:2294 sql_help.c:2859
+msgid "where column_constraint is:"
+msgstr "列的约束是:"
+
+#: sql_help.c:2333
+msgid "rettype"
+msgstr "返回类型"
+
+#: sql_help.c:2335
+msgid "column_type"
+msgstr "列的类型"
+
+#: sql_help.c:2344 sql_help.c:2546
+msgid "definition"
+msgstr "定义"
+
+#: sql_help.c:2345 sql_help.c:2547
+msgid "obj_file"
+msgstr "目标文件"
+
+#: sql_help.c:2346 sql_help.c:2548
+msgid "link_symbol"
+msgstr "链接_符号"
+
+#: sql_help.c:2347 sql_help.c:2549
+msgid "sql_body"
+msgstr "sql_body"
+
+#: sql_help.c:2385 sql_help.c:2601 sql_help.c:3160
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2400 sql_help.c:2441 sql_help.c:2828 sql_help.c:2841
+#: sql_help.c:2855 sql_help.c:2920
+msgid "method"
+msgstr "方法"
+
+#: sql_help.c:2405
+msgid "opclass_parameter"
+msgstr "opclass_parameter"
+
+#: sql_help.c:2422
+msgid "call_handler"
+msgstr "调用函数"
+
+#: sql_help.c:2423
+msgid "inline_handler"
+msgstr "匿名代码块"
+
+#: sql_help.c:2424
+msgid "valfunction"
+msgstr "验证函数"
+
+#: sql_help.c:2463
+msgid "com_op"
+msgstr "交换操作符"
+
+#: sql_help.c:2464
+msgid "neg_op"
+msgstr "取负操作符"
+
+#: sql_help.c:2482
+msgid "family_name"
+msgstr "操作符群的名称"
+
+#: sql_help.c:2493
+msgid "storage_type"
+msgstr "存储类型"
+
+#: sql_help.c:2622 sql_help.c:3044
+msgid "where event can be one of:"
+msgstr "事件可以下述之一:"
+
+#: sql_help.c:2642 sql_help.c:2644
+msgid "schema_element"
+msgstr "模式中对象"
+
+#: sql_help.c:2681
+msgid "server_type"
+msgstr "服务器类型"
+
+#: sql_help.c:2682
+msgid "server_version"
+msgstr "服务器版本"
+
+#: sql_help.c:2683 sql_help.c:3818 sql_help.c:4198
+msgid "fdw_name"
+msgstr "外部数据封装器的名称"
+
+#: sql_help.c:2700 sql_help.c:2703
+msgid "statistics_name"
+msgstr "统计信息_名称"
+
+#: sql_help.c:2704
+msgid "statistics_kind"
+msgstr "统计信息_方式"
+
+#: sql_help.c:2720
+msgid "subscription_name"
+msgstr "订阅_名称"
+
+#: sql_help.c:2821
+msgid "source_table"
+msgstr "源表"
+
+#: sql_help.c:2822
+msgid "like_option"
+msgstr "like选项"
+
+#: sql_help.c:2888
+msgid "and like_option is:"
+msgstr "like_选项是"
+
+#: sql_help.c:2937
+msgid "directory"
+msgstr "目录"
+
+#: sql_help.c:2951
+msgid "parser_name"
+msgstr "解析器名称 "
+
+#: sql_help.c:2952
+msgid "source_config"
+msgstr "已存在的文本搜索配置名称"
+
+#: sql_help.c:2981
+msgid "start_function"
+msgstr "启动_函数"
+
+#: sql_help.c:2982
+msgid "gettoken_function"
+msgstr "获取下一个符号函数的名称"
+
+#: sql_help.c:2983
+msgid "end_function"
+msgstr "结束_函数"
+
+#: sql_help.c:2984
+msgid "lextypes_function"
+msgstr "语义类型_函数"
+
+#: sql_help.c:2985
+msgid "headline_function"
+msgstr "标题_函数"
+
+#: sql_help.c:2997
+msgid "init_function"
+msgstr "初始化_函数"
+
+#: sql_help.c:2998
+msgid "lexize_function"
+msgstr "LEXIZE函数"
+
+#: sql_help.c:3011
+msgid "from_sql_function_name"
+msgstr "from_sql_function_name"
+
+#: sql_help.c:3013
+msgid "to_sql_function_name"
+msgstr "to_sql_function_name"
+
+#: sql_help.c:3039
+msgid "referenced_table_name"
+msgstr "被引用表的名称"
+
+#: sql_help.c:3040
+msgid "transition_relation_name"
+msgstr "transition_relation_name(转换关系名)"
+
+#: sql_help.c:3043
+msgid "arguments"
+msgstr "参数"
+
+#: sql_help.c:3095 sql_help.c:4331
+msgid "label"
+msgstr "标签"
+
+#: sql_help.c:3097
+msgid "subtype"
+msgstr "子类型"
+
+#: sql_help.c:3098
+msgid "subtype_operator_class"
+msgstr "subtype_operator_class(子类型_操作符_类)"
+
+#: sql_help.c:3100
+msgid "canonical_function"
+msgstr "标准_函数"
+
+#: sql_help.c:3101
+msgid "subtype_diff_function"
+msgstr "subtype_diff_function(子类型_区分_函数)"
+
+#: sql_help.c:3102
+msgid "multirange_type_name"
+msgstr "multirange_type_name"
+
+#: sql_help.c:3104
+msgid "input_function"
+msgstr "输入_函数"
+
+#: sql_help.c:3105
+msgid "output_function"
+msgstr "输出_函数"
+
+#: sql_help.c:3106
+msgid "receive_function"
+msgstr "接收_函数"
+
+#: sql_help.c:3107
+msgid "send_function"
+msgstr "发送_函数"
+
+#: sql_help.c:3108
+msgid "type_modifier_input_function"
+msgstr "类型修改器数组输入函数名称"
+
+#: sql_help.c:3109
+msgid "type_modifier_output_function"
+msgstr "类型修改器输出函数名称"
+
+#: sql_help.c:3110
+msgid "analyze_function"
+msgstr "分析_函数"
+
+#: sql_help.c:3111
+msgid "subscript_function"
+msgstr "subscript_function"
+
+#: sql_help.c:3112
+msgid "internallength"
+msgstr "内部长度"
+
+#: sql_help.c:3113
+msgid "alignment"
+msgstr "顺序排列(alignment)"
+
+#: sql_help.c:3114
+msgid "storage"
+msgstr "存储"
+
+#: sql_help.c:3115
+msgid "like_type"
+msgstr "LIKE类型(like_type)"
+
+#: sql_help.c:3116
+msgid "category"
+msgstr "类型"
+
+#: sql_help.c:3117
+msgid "preferred"
+msgstr "优先"
+
+#: sql_help.c:3118
+msgid "default"
+msgstr "默认"
+
+#: sql_help.c:3119
+msgid "element"
+msgstr "成员项"
+
+#: sql_help.c:3120
+msgid "delimiter"
+msgstr "分隔符"
+
+#: sql_help.c:3121
+msgid "collatable"
+msgstr "要校对的"
+
+#: sql_help.c:3218 sql_help.c:3894 sql_help.c:4393 sql_help.c:4490
+#: sql_help.c:4642 sql_help.c:4750 sql_help.c:4873
+msgid "with_query"
+msgstr "with查询语句(with_query)"
+
+#: sql_help.c:3220 sql_help.c:3896 sql_help.c:4412 sql_help.c:4418
+#: sql_help.c:4421 sql_help.c:4425 sql_help.c:4429 sql_help.c:4437
+#: sql_help.c:4661 sql_help.c:4667 sql_help.c:4670 sql_help.c:4674
+#: sql_help.c:4678 sql_help.c:4686 sql_help.c:4752 sql_help.c:4892
+#: sql_help.c:4898 sql_help.c:4901 sql_help.c:4905 sql_help.c:4909
+#: sql_help.c:4917
+msgid "alias"
+msgstr "别名"
+
+#: sql_help.c:3221 sql_help.c:4397 sql_help.c:4439 sql_help.c:4441
+#: sql_help.c:4495 sql_help.c:4646 sql_help.c:4688 sql_help.c:4690
+#: sql_help.c:4759 sql_help.c:4877 sql_help.c:4919 sql_help.c:4921
+msgid "from_item"
+msgstr "from列表中项"
+
+#: sql_help.c:3223 sql_help.c:3704 sql_help.c:3975 sql_help.c:4761
+msgid "cursor_name"
+msgstr "游标名称"
+
+#: sql_help.c:3224 sql_help.c:3902 sql_help.c:4762
+msgid "output_expression"
+msgstr "输出表达式"
+
+#: sql_help.c:3225 sql_help.c:3903 sql_help.c:4396 sql_help.c:4493
+#: sql_help.c:4645 sql_help.c:4763 sql_help.c:4876
+msgid "output_name"
+msgstr "输出名称"
+
+#: sql_help.c:3241
+msgid "code"
+msgstr "编码"
+
+#: sql_help.c:3646
+msgid "parameter"
+msgstr "参数"
+
+#: sql_help.c:3668 sql_help.c:3669 sql_help.c:4000
+msgid "statement"
+msgstr "语句"
+
+#: sql_help.c:3703 sql_help.c:3974
+msgid "direction"
+msgstr "方向"
+
+#: sql_help.c:3705 sql_help.c:3976
+msgid "where direction can be empty or one of:"
+msgstr "方向可以为空或者是下列选项之一:"
+
+#: sql_help.c:3706 sql_help.c:3707 sql_help.c:3708 sql_help.c:3709
+#: sql_help.c:3710 sql_help.c:3977 sql_help.c:3978 sql_help.c:3979
+#: sql_help.c:3980 sql_help.c:3981 sql_help.c:4406 sql_help.c:4408
+#: sql_help.c:4504 sql_help.c:4506 sql_help.c:4655 sql_help.c:4657
+#: sql_help.c:4819 sql_help.c:4821 sql_help.c:4886 sql_help.c:4888
+msgid "count"
+msgstr "计数"
+
+#: sql_help.c:3808 sql_help.c:4188
+msgid "sequence_name"
+msgstr "序列名称"
+
+#: sql_help.c:3826 sql_help.c:4206
+msgid "arg_name"
+msgstr "参数名称"
+
+#: sql_help.c:3827 sql_help.c:4207
+msgid "arg_type"
+msgstr "参数类型"
+
+#: sql_help.c:3834 sql_help.c:4214
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3862
+msgid "remote_schema"
+msgstr "remote_schema"
+
+#: sql_help.c:3865
+msgid "local_schema"
+msgstr "local_schema"
+
+#: sql_help.c:3900
+msgid "conflict_target"
+msgstr "冲突目标"
+
+#: sql_help.c:3901
+msgid "conflict_action"
+msgstr "冲突行动"
+
+#: sql_help.c:3904
+msgid "where conflict_target can be one of:"
+msgstr "这里conflict_target可以是下列之一:"
+
+#: sql_help.c:3905
+msgid "index_column_name"
+msgstr "索引列名称"
+
+#: sql_help.c:3906
+msgid "index_expression"
+msgstr "索引表达式"
+
+#: sql_help.c:3909
+msgid "index_predicate"
+msgstr "index_predicate"
+
+#: sql_help.c:3911
+msgid "and conflict_action is one of:"
+msgstr "并且conflict_action是下列之一:"
+
+#: sql_help.c:3917 sql_help.c:4758
+msgid "sub-SELECT"
+msgstr "sub-SELECT"
+
+#: sql_help.c:3926 sql_help.c:3989 sql_help.c:4734
+msgid "channel"
+msgstr "通道"
+
+#: sql_help.c:3948
+msgid "lockmode"
+msgstr "锁模式"
+
+#: sql_help.c:3949
+msgid "where lockmode is one of:"
+msgstr "锁模式可以是下列选项之一:"
+
+#: sql_help.c:3990
+msgid "payload"
+msgstr "消息中负载流量(payload)"
+
+#: sql_help.c:4017
+msgid "old_role"
+msgstr "旧的角色"
+
+#: sql_help.c:4018
+msgid "new_role"
+msgstr "新的角色"
+
+#: sql_help.c:4054 sql_help.c:4253 sql_help.c:4261
+msgid "savepoint_name"
+msgstr "保存点名称"
+
+#: sql_help.c:4399 sql_help.c:4452 sql_help.c:4648 sql_help.c:4701
+#: sql_help.c:4879 sql_help.c:4932
+msgid "grouping_element"
+msgstr "grouping_element"
+
+#: sql_help.c:4401 sql_help.c:4499 sql_help.c:4650 sql_help.c:4881
+msgid "window_name"
+msgstr "窗口名称"
+
+#: sql_help.c:4402 sql_help.c:4500 sql_help.c:4651 sql_help.c:4882
+msgid "window_definition"
+msgstr "窗口定义"
+
+#: sql_help.c:4403 sql_help.c:4417 sql_help.c:4456 sql_help.c:4501
+#: sql_help.c:4652 sql_help.c:4666 sql_help.c:4705 sql_help.c:4883
+#: sql_help.c:4897 sql_help.c:4936
+msgid "select"
+msgstr "查询"
+
+#: sql_help.c:4410 sql_help.c:4659 sql_help.c:4890
+msgid "where from_item can be one of:"
+msgstr "from 列表中的项可以是下列内容之一"
+
+#: sql_help.c:4413 sql_help.c:4419 sql_help.c:4422 sql_help.c:4426
+#: sql_help.c:4438 sql_help.c:4662 sql_help.c:4668 sql_help.c:4671
+#: sql_help.c:4675 sql_help.c:4687 sql_help.c:4893 sql_help.c:4899
+#: sql_help.c:4902 sql_help.c:4906 sql_help.c:4918
+msgid "column_alias"
+msgstr "列的别名"
+
+#: sql_help.c:4414 sql_help.c:4663 sql_help.c:4894
+msgid "sampling_method"
+msgstr "sampling_method"
+
+#: sql_help.c:4416 sql_help.c:4665 sql_help.c:4896
+msgid "seed"
+msgstr "种子"
+
+#: sql_help.c:4420 sql_help.c:4454 sql_help.c:4669 sql_help.c:4703
+#: sql_help.c:4900 sql_help.c:4934
+msgid "with_query_name"
+msgstr "WITH查询语句名称(with_query_name)"
+
+#: sql_help.c:4430 sql_help.c:4433 sql_help.c:4436 sql_help.c:4679
+#: sql_help.c:4682 sql_help.c:4685 sql_help.c:4910 sql_help.c:4913
+#: sql_help.c:4916
+msgid "column_definition"
+msgstr "列定义"
+
+#: sql_help.c:4440 sql_help.c:4689 sql_help.c:4920
+msgid "join_type"
+msgstr "连接操作的类型"
+
+#: sql_help.c:4442 sql_help.c:4691 sql_help.c:4922
+msgid "join_condition"
+msgstr "用连接操作的条件"
+
+#: sql_help.c:4443 sql_help.c:4692 sql_help.c:4923
+msgid "join_column"
+msgstr "用于连接操作的列"
+
+#: sql_help.c:4444 sql_help.c:4693 sql_help.c:4924
+msgid "join_using_alias"
+msgstr "join_using_alia"
+
+#: sql_help.c:4445 sql_help.c:4694 sql_help.c:4925
+msgid "and grouping_element can be one of:"
+msgstr "并且grouping_element可以是下列之一:"
+
+#: sql_help.c:4453 sql_help.c:4702 sql_help.c:4933
+msgid "and with_query is:"
+msgstr "with查询语句是:"
+
+#: sql_help.c:4457 sql_help.c:4706 sql_help.c:4937
+msgid "values"
+msgstr "值"
+
+#: sql_help.c:4458 sql_help.c:4707 sql_help.c:4938
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4459 sql_help.c:4708 sql_help.c:4939
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4460 sql_help.c:4709 sql_help.c:4940
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4462 sql_help.c:4711 sql_help.c:4942
+msgid "search_seq_col_name"
+msgstr "search_seq_col_name"
+
+#: sql_help.c:4464 sql_help.c:4713 sql_help.c:4944
+msgid "cycle_mark_col_name"
+msgstr "cycle_mark_col_name"
+
+#: sql_help.c:4465 sql_help.c:4714 sql_help.c:4945
+msgid "cycle_mark_value"
+msgstr "cycle_mark_value"
+
+#: sql_help.c:4466 sql_help.c:4715 sql_help.c:4946
+msgid "cycle_mark_default"
+msgstr "cycle_mark_default"
+
+#: sql_help.c:4467 sql_help.c:4716 sql_help.c:4947
+msgid "cycle_path_col_name"
+msgstr "cycle_path_col_name"
+
+#: sql_help.c:4494
+msgid "new_table"
+msgstr "新的表"
+
+#: sql_help.c:4519
+msgid "timezone"
+msgstr "时区"
+
+#: sql_help.c:4564
+msgid "snapshot_id"
+msgstr "快照id"
+
+#: sql_help.c:4817
+msgid "sort_expression"
+msgstr "排序表达式"
+
+#: sql_help.c:4954 sql_help.c:5932
+msgid "abort the current transaction"
+msgstr "中止目前的事务"
+
+#: sql_help.c:4960
+msgid "change the definition of an aggregate function"
+msgstr "更改聚集函数的定义"
+
+#: sql_help.c:4966
+msgid "change the definition of a collation"
+msgstr "更改校对规则的定义"
+
+#: sql_help.c:4972
+msgid "change the definition of a conversion"
+msgstr "更改一个字符编码转换的定义"
+
+#: sql_help.c:4978
+msgid "change a database"
+msgstr "更改一个数据库"
+
+#: sql_help.c:4984
+msgid "define default access privileges"
+msgstr "定义默认的访问权限"
+
+#: sql_help.c:4990
+msgid "change the definition of a domain"
+msgstr "更改共同值域的定义"
+
+#: sql_help.c:4996
+msgid "change the definition of an event trigger"
+msgstr "更改事件触发器的定义"
+
+#: sql_help.c:5002
+msgid "change the definition of an extension"
+msgstr "更改扩展的定义"
+
+#: sql_help.c:5008
+msgid "change the definition of a foreign-data wrapper"
+msgstr "更改外部数据封装器的定义"
+
+#: sql_help.c:5014
+msgid "change the definition of a foreign table"
+msgstr "更改外部表的定义"
+
+#: sql_help.c:5020
+msgid "change the definition of a function"
+msgstr "更改函数的定义"
+
+#: sql_help.c:5026
+msgid "change role name or membership"
+msgstr "更改角色名称或成员状态"
+
+#: sql_help.c:5032
+msgid "change the definition of an index"
+msgstr "更改索引的定义"
+
+#: sql_help.c:5038
+msgid "change the definition of a procedural language"
+msgstr "更改程序语言的定义"
+
+#: sql_help.c:5044
+msgid "change the definition of a large object"
+msgstr "更改大对象的定义"
+
+#: sql_help.c:5050
+msgid "change the definition of a materialized view"
+msgstr "更改物化视图的定义"
+
+#: sql_help.c:5056
+msgid "change the definition of an operator"
+msgstr "更改运算子的定义"
+
+#: sql_help.c:5062
+msgid "change the definition of an operator class"
+msgstr "更改运算子类别的定义"
+
+#: sql_help.c:5068
+msgid "change the definition of an operator family"
+msgstr "更改一个运算子家族的识别"
+
+#: sql_help.c:5074
+msgid "change the definition of a row-level security policy"
+msgstr "更改一条行级安全性策略的定义"
+
+#: sql_help.c:5080
+msgid "change the definition of a procedure"
+msgstr "更改程序的定义"
+
+#: sql_help.c:5086
+msgid "change the definition of a publication"
+msgstr "更改发布的定义"
+
+#: sql_help.c:5092 sql_help.c:5194
+msgid "change a database role"
+msgstr "更改数据库角色"
+
+#: sql_help.c:5098
+msgid "change the definition of a routine"
+msgstr "更改程序的定义"
+
+#: sql_help.c:5104
+msgid "change the definition of a rule"
+msgstr "更改规则的定义"
+
+#: sql_help.c:5110
+msgid "change the definition of a schema"
+msgstr "更改架构模式的定义"
+
+#: sql_help.c:5116
+msgid "change the definition of a sequence generator"
+msgstr "更改序列数产生器的定义"
+
+#: sql_help.c:5122
+msgid "change the definition of a foreign server"
+msgstr "更改外部服务器的定义"
+
+#: sql_help.c:5128
+msgid "change the definition of an extended statistics object"
+msgstr "更改扩展统计信息对象的定义"
+
+#: sql_help.c:5134
+msgid "change the definition of a subscription"
+msgstr "更改订阅的定义"
+
+#: sql_help.c:5140
+msgid "change a server configuration parameter"
+msgstr "更改服务器的配置参数"
+
+#: sql_help.c:5146
+msgid "change the definition of a table"
+msgstr "更改数据表的定义"
+
+#: sql_help.c:5152
+msgid "change the definition of a tablespace"
+msgstr "更改表空间的定义"
+
+#: sql_help.c:5158
+msgid "change the definition of a text search configuration"
+msgstr "更改一个文本搜索组态的定义"
+
+#: sql_help.c:5164
+msgid "change the definition of a text search dictionary"
+msgstr "更改一个文本搜索字典的定义"
+
+#: sql_help.c:5170
+msgid "change the definition of a text search parser"
+msgstr "更改一个文本搜索剖析器的定义"
+
+#: sql_help.c:5176
+msgid "change the definition of a text search template"
+msgstr "更改一个文本搜索模版的定义"
+
+#: sql_help.c:5182
+msgid "change the definition of a trigger"
+msgstr "更改触发器的定义"
+
+#: sql_help.c:5188
+msgid "change the definition of a type"
+msgstr "更改数据类型的定义"
+
+#: sql_help.c:5200
+msgid "change the definition of a user mapping"
+msgstr "更改用户映射的定义"
+
+#: sql_help.c:5206
+msgid "change the definition of a view"
+msgstr "更改视图的定义"
+
+#: sql_help.c:5212
+msgid "collect statistics about a database"
+msgstr "收集数据库的统计信息"
+
+#: sql_help.c:5218 sql_help.c:6010
+msgid "start a transaction block"
+msgstr "开始一个事务区块"
+
+#: sql_help.c:5224
+msgid "invoke a procedure"
+msgstr "调用过程"
+
+#: sql_help.c:5230
+msgid "force a write-ahead log checkpoint"
+msgstr "强制一个预写日志检查点"
+
+#: sql_help.c:5236
+msgid "close a cursor"
+msgstr "关闭游标"
+
+#: sql_help.c:5242
+msgid "cluster a table according to an index"
+msgstr "按照索引进行表的聚集"
+
+#: sql_help.c:5248
+msgid "define or change the comment of an object"
+msgstr "定义或更改一个对象的注解"
+
+#: sql_help.c:5254 sql_help.c:5812
+msgid "commit the current transaction"
+msgstr "确认目前的事务"
+
+#: sql_help.c:5260
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "提交一项事务这是两阶段提交的先前准备"
+
+#: sql_help.c:5266
+msgid "copy data between a file and a table"
+msgstr "在档案和数据表间复制数据"
+
+#: sql_help.c:5272
+msgid "define a new access method"
+msgstr "定义新的访问方法"
+
+#: sql_help.c:5278
+msgid "define a new aggregate function"
+msgstr "定义一个新的聚集函数"
+
+#: sql_help.c:5284
+msgid "define a new cast"
+msgstr "建立新的类型转换"
+
+#: sql_help.c:5290
+msgid "define a new collation"
+msgstr "建立新的校对规则"
+
+#: sql_help.c:5296
+msgid "define a new encoding conversion"
+msgstr "定义一个新的字元编码转换"
+
+#: sql_help.c:5302
+msgid "create a new database"
+msgstr "建立新的数据库"
+
+#: sql_help.c:5308
+msgid "define a new domain"
+msgstr "建立新的共同值域"
+
+#: sql_help.c:5314
+msgid "define a new event trigger"
+msgstr "定义新的事件触发器"
+
+#: sql_help.c:5320
+msgid "install an extension"
+msgstr "安装一个扩展"
+
+#: sql_help.c:5326
+msgid "define a new foreign-data wrapper"
+msgstr "定义一个新的外部数据封装器"
+
+#: sql_help.c:5332
+msgid "define a new foreign table"
+msgstr "建立新的外部表"
+
+#: sql_help.c:5338
+msgid "define a new function"
+msgstr "建立新的函数"
+
+#: sql_help.c:5344 sql_help.c:5404 sql_help.c:5506
+msgid "define a new database role"
+msgstr "定义一个新数据库角色"
+
+#: sql_help.c:5350
+msgid "define a new index"
+msgstr "建立新的索引"
+
+#: sql_help.c:5356
+msgid "define a new procedural language"
+msgstr "建立新的程序语言"
+
+#: sql_help.c:5362
+msgid "define a new materialized view"
+msgstr "建立新的物化视图"
+
+#: sql_help.c:5368
+msgid "define a new operator"
+msgstr "建立新的运算子"
+
+#: sql_help.c:5374
+msgid "define a new operator class"
+msgstr "建立新的运算子类别"
+
+#: sql_help.c:5380
+msgid "define a new operator family"
+msgstr "定义一个新的运算子家族"
+
+#: sql_help.c:5386
+msgid "define a new row-level security policy for a table"
+msgstr "为一个表定义一条新的行级安全性策略"
+
+#: sql_help.c:5392
+msgid "define a new procedure"
+msgstr "建立新的程序"
+
+#: sql_help.c:5398
+msgid "define a new publication"
+msgstr "建立新的发布"
+
+#: sql_help.c:5410
+msgid "define a new rewrite rule"
+msgstr "建立新的重写规则"
+
+#: sql_help.c:5416
+msgid "define a new schema"
+msgstr "建立新的架构模式"
+
+#: sql_help.c:5422
+msgid "define a new sequence generator"
+msgstr "建立新的序列数产生器"
+
+#: sql_help.c:5428
+msgid "define a new foreign server"
+msgstr "建立新的触发器"
+
+#: sql_help.c:5434
+msgid "define extended statistics"
+msgstr "建立新的扩展统计"
+
+#: sql_help.c:5440
+msgid "define a new subscription"
+msgstr "建立新的订阅"
+
+#: sql_help.c:5446
+msgid "define a new table"
+msgstr "建立新的数据表"
+
+#: sql_help.c:5452 sql_help.c:5968
+msgid "define a new table from the results of a query"
+msgstr "以查询结果建立新的数据表"
+
+#: sql_help.c:5458
+msgid "define a new tablespace"
+msgstr "建立新的表空间"
+
+#: sql_help.c:5464
+msgid "define a new text search configuration"
+msgstr "定义一个新文本搜索组态"
+
+#: sql_help.c:5470
+msgid "define a new text search dictionary"
+msgstr "定义一个新文本搜索字典"
+
+#: sql_help.c:5476
+msgid "define a new text search parser"
+msgstr "定义一个新文本搜索剖析器"
+
+#: sql_help.c:5482
+msgid "define a new text search template"
+msgstr "定义一个新文本搜索模版"
+
+#: sql_help.c:5488
+msgid "define a new transform"
+msgstr "定义一个新的转换"
+
+#: sql_help.c:5494
+msgid "define a new trigger"
+msgstr "建立新的触发器"
+
+#: sql_help.c:5500
+msgid "define a new data type"
+msgstr "建立新的数据类型"
+
+#: sql_help.c:5512
+msgid "define a new mapping of a user to a foreign server"
+msgstr "将用户的新映射定义到一个外部服务器"
+
+#: sql_help.c:5518
+msgid "define a new view"
+msgstr "建立新的视图"
+
+#: sql_help.c:5524
+msgid "deallocate a prepared statement"
+msgstr "释放一个已预备好的叙述区块"
+
+#: sql_help.c:5530
+msgid "define a cursor"
+msgstr "建立一个 cursor"
+
+#: sql_help.c:5536
+msgid "delete rows of a table"
+msgstr "删除数据表中的数据列"
+
+#: sql_help.c:5542
+msgid "discard session state"
+msgstr "抛弃 session 状态"
+
+#: sql_help.c:5548
+msgid "execute an anonymous code block"
+msgstr "执行一个匿名代码块"
+
+#: sql_help.c:5554
+msgid "remove an access method"
+msgstr "移除一种访问方法"
+
+#: sql_help.c:5560
+msgid "remove an aggregate function"
+msgstr "移除一个聚集函数"
+
+#: sql_help.c:5566
+msgid "remove a cast"
+msgstr "移除一个类型转换"
+
+#: sql_help.c:5572
+msgid "remove a collation"
+msgstr "移除一个校对规则"
+
+#: sql_help.c:5578
+msgid "remove a conversion"
+msgstr "移除一个字元编码转换"
+
+#: sql_help.c:5584
+msgid "remove a database"
+msgstr "移除数据库"
+
+#: sql_help.c:5590
+msgid "remove a domain"
+msgstr "移除一个共同值域"
+
+#: sql_help.c:5596
+msgid "remove an event trigger"
+msgstr "移除事件触发器"
+
+#: sql_help.c:5602
+msgid "remove an extension"
+msgstr "移除一个扩展"
+
+#: sql_help.c:5608
+msgid "remove a foreign-data wrapper"
+msgstr "删除一个外部数据封装器"
+
+#: sql_help.c:5614
+msgid "remove a foreign table"
+msgstr "移除外部引用表"
+
+#: sql_help.c:5620
+msgid "remove a function"
+msgstr "移除函数"
+
+#: sql_help.c:5626 sql_help.c:5692 sql_help.c:5794
+msgid "remove a database role"
+msgstr "移除一个数据库成员"
+
+#: sql_help.c:5632
+msgid "remove an index"
+msgstr "移除一个索引"
+
+#: sql_help.c:5638
+msgid "remove a procedural language"
+msgstr "移除一个程序语言"
+
+#: sql_help.c:5644
+msgid "remove a materialized view"
+msgstr "移除一个物化视图"
+
+#: sql_help.c:5650
+msgid "remove an operator"
+msgstr "移除运算子"
+
+#: sql_help.c:5656
+msgid "remove an operator class"
+msgstr "移除一个运算子类别"
+
+#: sql_help.c:5662
+msgid "remove an operator family"
+msgstr "移除一个运算子家族"
+
+#: sql_help.c:5668
+msgid "remove database objects owned by a database role"
+msgstr "依照一个数据库角色拥有的数据库对象来移除"
+
+#: sql_help.c:5674
+msgid "remove a row-level security policy from a table"
+msgstr "从一个表移除一条行级安全性策略"
+
+#: sql_help.c:5680
+msgid "remove a procedure"
+msgstr "移除一个程序"
+
+#: sql_help.c:5686
+msgid "remove a publication"
+msgstr "移除一个发布"
+
+#: sql_help.c:5698
+msgid "remove a routine"
+msgstr "移除程序"
+
+#: sql_help.c:5704
+msgid "remove a rewrite rule"
+msgstr "移除一个重写规则"
+
+#: sql_help.c:5710
+msgid "remove a schema"
+msgstr "移除一个模式"
+
+#: sql_help.c:5716
+msgid "remove a sequence"
+msgstr "移除序列"
+
+#: sql_help.c:5722
+msgid "remove a foreign server descriptor"
+msgstr "删除一个外部服务器描述符"
+
+#: sql_help.c:5728
+msgid "remove extended statistics"
+msgstr "移除一个扩展统计"
+
+#: sql_help.c:5734
+msgid "remove a subscription"
+msgstr "移除一个订阅"
+
+#: sql_help.c:5740
+msgid "remove a table"
+msgstr "移除数据表"
+
+#: sql_help.c:5746
+msgid "remove a tablespace"
+msgstr "移除一个表空间"
+
+#: sql_help.c:5752
+msgid "remove a text search configuration"
+msgstr "移除一个文本搜索配置"
+
+#: sql_help.c:5758
+msgid "remove a text search dictionary"
+msgstr "移除一个文本搜索字典"
+
+#: sql_help.c:5764
+msgid "remove a text search parser"
+msgstr "移除一个文本搜索剖析器"
+
+#: sql_help.c:5770
+msgid "remove a text search template"
+msgstr "移除一个文本搜索模版"
+
+#: sql_help.c:5776
+msgid "remove a transform"
+msgstr "移除一个转换"
+
+#: sql_help.c:5782
+msgid "remove a trigger"
+msgstr "移除触发器"
+
+#: sql_help.c:5788
+msgid "remove a data type"
+msgstr "移除数据类型"
+
+#: sql_help.c:5800
+msgid "remove a user mapping for a foreign server"
+msgstr "为外部服务器删除用户映射"
+
+#: sql_help.c:5806
+msgid "remove a view"
+msgstr "移除一个视图"
+
+#: sql_help.c:5818
+msgid "execute a prepared statement"
+msgstr "执行一个已准备好的语句块"
+
+#: sql_help.c:5824
+msgid "show the execution plan of a statement"
+msgstr "显示一个语句块的执行计划"
+
+#: sql_help.c:5830
+msgid "retrieve rows from a query using a cursor"
+msgstr "从使用游标的查询读取数据"
+
+#: sql_help.c:5836
+msgid "define access privileges"
+msgstr "定义存取权限"
+
+#: sql_help.c:5842
+msgid "import table definitions from a foreign server"
+msgstr "从一个外部服务器导入表定义"
+
+#: sql_help.c:5848
+msgid "create new rows in a table"
+msgstr "在表中创建新数据行"
+
+#: sql_help.c:5854
+msgid "listen for a notification"
+msgstr "等待通知"
+
+#: sql_help.c:5860
+msgid "load a shared library file"
+msgstr "加载一个共享库文件"
+
+#: sql_help.c:5866
+msgid "lock a table"
+msgstr "锁定数据表"
+
+#: sql_help.c:5872
+msgid "position a cursor"
+msgstr "移动游标位置"
+
+#: sql_help.c:5878
+msgid "generate a notification"
+msgstr "产生通知"
+
+#: sql_help.c:5884
+msgid "prepare a statement for execution"
+msgstr "预先编译语句以执行"
+
+#: sql_help.c:5890
+msgid "prepare the current transaction for two-phase commit"
+msgstr "准备将当前事务进行二段式提交"
+
+#: sql_help.c:5896
+msgid "change the ownership of database objects owned by a database role"
+msgstr "依照一个数据库角色拥有的的数据库对象来更变所有权"
+
+#: sql_help.c:5902
+msgid "replace the contents of a materialized view"
+msgstr "替换物化视图的内容"
+
+#: sql_help.c:5908
+msgid "rebuild indexes"
+msgstr "重新建构索引"
+
+#: sql_help.c:5914
+msgid "destroy a previously defined savepoint"
+msgstr "删除先前建立的储存点(Savepoint)"
+
+#: sql_help.c:5920
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "将执行时期参数还原成预设值"
+
+#: sql_help.c:5926
+msgid "remove access privileges"
+msgstr "移除存取权限"
+
+#: sql_help.c:5938
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "取消一个可以为两阶段提交容易配置的事务"
+
+#: sql_help.c:5944
+msgid "roll back to a savepoint"
+msgstr "还原至一个储存点(Savepoint)"
+
+#: sql_help.c:5950
+msgid "define a new savepoint within the current transaction"
+msgstr "在当前事务中建立新的储存点(Savepoint)"
+
+#: sql_help.c:5956
+msgid "define or change a security label applied to an object"
+msgstr "定义或更改一个对象的安全标签"
+
+#: sql_help.c:5962 sql_help.c:6016 sql_help.c:6052
+msgid "retrieve rows from a table or view"
+msgstr "从数据表或视图中读取数据"
+
+#: sql_help.c:5974
+msgid "change a run-time parameter"
+msgstr "更改一个运行期参数"
+
+#: sql_help.c:5980
+msgid "set constraint check timing for the current transaction"
+msgstr "为当前事务设定约束限制检查的时间模式"
+
+#: sql_help.c:5986
+msgid "set the current user identifier of the current session"
+msgstr "为当前会话的当前用户的设置身份标识"
+
+#: sql_help.c:5992
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "为当前会话设置会话用户标识符和当前用户标识符"
+
+#: sql_help.c:5998
+msgid "set the characteristics of the current transaction"
+msgstr "设定当前事务属性"
+
+#: sql_help.c:6004
+msgid "show the value of a run-time parameter"
+msgstr "显示运行期的参数值"
+
+#: sql_help.c:6022
+msgid "empty a table or set of tables"
+msgstr "空的数据表或数据表集合"
+
+#: sql_help.c:6028
+msgid "stop listening for a notification"
+msgstr "停止监听通知"
+
+#: sql_help.c:6034
+msgid "update rows of a table"
+msgstr "更新数据表中的数据列"
+
+#: sql_help.c:6040
+msgid "garbage-collect and optionally analyze a database"
+msgstr "垃圾收集(GC)并选择地分析数据库"
+
+#: sql_help.c:6046
+msgid "compute a set of rows"
+msgstr "计算一个数据列的集合"
+
+#: startup.c:213
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1只能在非交互模式下使用"
+
+#: startup.c:326
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "无法打开事务日志文件 \"%s\": %m"
+
+#: startup.c:438
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"输入 \"help\" 来获取帮助信息.\n"
+"\n"
+
+#: startup.c:591
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "无法设定列打印参数 \"%s\""
+
+#: startup.c:699
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获取更多的信息.\n"
+
+#: startup.c:716
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "忽略多余的命令行参数 \"%s\""
+
+#: startup.c:765
+#, c-format
+msgid "could not find own program executable"
+msgstr "找不到可执行文件"
+
+#: tab-complete.c:4904
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"自动补全查询失败: %s\n"
+"查询是:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "\"%2$s\"的不能识别的值\"%1$s\":应为布尔值"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "\"%s\"的值\"%s\"无效: 应为整数"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "无效的语言环境名称: \"%s\""
+
+#: variables.c:419
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"\"%2$s\"的不能识别的值\"%1$s\"\n"
+"可用值为\"%3$s\"."
diff --git a/src/bin/psql/prompt.c b/src/bin/psql/prompt.c
new file mode 100644
index 0000000..509e642
--- /dev/null
+++ b/src/bin/psql/prompt.c
@@ -0,0 +1,382 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/prompt.c
+ */
+#include "postgres_fe.h"
+
+#ifdef WIN32
+#include <io.h>
+#include <win32.h>
+#endif
+
+#include "common.h"
+#include "common/string.h"
+#include "input.h"
+#include "libpq/pqcomm.h"
+#include "prompt.h"
+#include "settings.h"
+
+/*--------------------------
+ * get_prompt
+ *
+ * Returns a statically allocated prompt made by interpolating certain
+ * tcsh style escape sequences into pset.vars "PROMPT1|2|3".
+ * (might not be completely multibyte safe)
+ *
+ * Defined interpolations are:
+ * %M - database server "hostname.domainname", "[local]" for AF_UNIX
+ * sockets, "[local:/dir/name]" if not default
+ * %m - like %M, but hostname only (before first dot), or always "[local]"
+ * %p - backend pid
+ * %> - database server port number
+ * %n - database user name
+ * %/ - current database
+ * %~ - like %/ but "~" when database name equals user name
+ * %w - whitespace of the same width as the most recent output of PROMPT1
+ * %# - "#" if superuser, ">" otherwise
+ * %R - in prompt1 normally =, or ^ if single line mode,
+ * or a ! if session is not connected to a database;
+ * in prompt2 -, *, ', or ";
+ * in prompt3 nothing
+ * %x - transaction status: empty, *, !, ? (unknown or no connection)
+ * %l - The line number inside the current statement, starting from 1.
+ * %? - the error code of the last query (not yet implemented)
+ * %% - a percent sign
+ *
+ * %[0-9] - the character with the given decimal code
+ * %0[0-7] - the character with the given octal code
+ * %0x[0-9A-Fa-f] - the character with the given hexadecimal code
+ *
+ * %`command` - The result of executing command in /bin/sh with trailing
+ * newline stripped.
+ * %:name: - The value of the psql variable 'name'
+ * (those will not be rescanned for more escape sequences!)
+ *
+ * %[ ... %] - tell readline that the contained text is invisible
+ *
+ * If the application-wide prompts become NULL somehow, the returned string
+ * will be empty (not NULL!).
+ *--------------------------
+ */
+
+char *
+get_prompt(promptStatus_t status, ConditionalStack cstack)
+{
+#define MAX_PROMPT_SIZE 256
+ static char destination[MAX_PROMPT_SIZE + 1];
+ char buf[MAX_PROMPT_SIZE + 1];
+ bool esc = false;
+ const char *p;
+ const char *prompt_string = "? ";
+ static size_t last_prompt1_width = 0;
+
+ switch (status)
+ {
+ case PROMPT_READY:
+ prompt_string = pset.prompt1;
+ break;
+
+ case PROMPT_CONTINUE:
+ case PROMPT_SINGLEQUOTE:
+ case PROMPT_DOUBLEQUOTE:
+ case PROMPT_DOLLARQUOTE:
+ case PROMPT_COMMENT:
+ case PROMPT_PAREN:
+ prompt_string = pset.prompt2;
+ break;
+
+ case PROMPT_COPY:
+ prompt_string = pset.prompt3;
+ break;
+ }
+
+ destination[0] = '\0';
+
+ for (p = prompt_string;
+ *p && strlen(destination) < sizeof(destination) - 1;
+ p++)
+ {
+ memset(buf, 0, sizeof(buf));
+ if (esc)
+ {
+ switch (*p)
+ {
+ /* Current database */
+ case '/':
+ if (pset.db)
+ strlcpy(buf, PQdb(pset.db), sizeof(buf));
+ break;
+ case '~':
+ if (pset.db)
+ {
+ const char *var;
+
+ if (strcmp(PQdb(pset.db), PQuser(pset.db)) == 0 ||
+ ((var = getenv("PGDATABASE")) && strcmp(var, PQdb(pset.db)) == 0))
+ strlcpy(buf, "~", sizeof(buf));
+ else
+ strlcpy(buf, PQdb(pset.db), sizeof(buf));
+ }
+ break;
+
+ /* Whitespace of the same width as the last PROMPT1 */
+ case 'w':
+ if (pset.db)
+ memset(buf, ' ',
+ Min(last_prompt1_width, sizeof(buf) - 1));
+ break;
+
+ /* DB server hostname (long/short) */
+ case 'M':
+ case 'm':
+ if (pset.db)
+ {
+ const char *host = PQhost(pset.db);
+
+ /* INET socket */
+ if (host && host[0] && !is_unixsock_path(host))
+ {
+ strlcpy(buf, host, sizeof(buf));
+ if (*p == 'm')
+ buf[strcspn(buf, ".")] = '\0';
+ }
+ /* UNIX socket */
+ else
+ {
+ if (!host
+ || strcmp(host, DEFAULT_PGSOCKET_DIR) == 0
+ || *p == 'm')
+ strlcpy(buf, "[local]", sizeof(buf));
+ else
+ snprintf(buf, sizeof(buf), "[local:%s]", host);
+ }
+ }
+ break;
+ /* DB server port number */
+ case '>':
+ if (pset.db && PQport(pset.db))
+ strlcpy(buf, PQport(pset.db), sizeof(buf));
+ break;
+ /* DB server user name */
+ case 'n':
+ if (pset.db)
+ strlcpy(buf, session_username(), sizeof(buf));
+ break;
+ /* backend pid */
+ case 'p':
+ if (pset.db)
+ {
+ int pid = PQbackendPID(pset.db);
+
+ if (pid)
+ snprintf(buf, sizeof(buf), "%d", pid);
+ }
+ break;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ *buf = (char) strtol(p, unconstify(char **, &p), 8);
+ --p;
+ break;
+ case 'R':
+ switch (status)
+ {
+ case PROMPT_READY:
+ if (cstack != NULL && !conditional_active(cstack))
+ buf[0] = '@';
+ else if (!pset.db)
+ buf[0] = '!';
+ else if (!pset.singleline)
+ buf[0] = '=';
+ else
+ buf[0] = '^';
+ break;
+ case PROMPT_CONTINUE:
+ buf[0] = '-';
+ break;
+ case PROMPT_SINGLEQUOTE:
+ buf[0] = '\'';
+ break;
+ case PROMPT_DOUBLEQUOTE:
+ buf[0] = '"';
+ break;
+ case PROMPT_DOLLARQUOTE:
+ buf[0] = '$';
+ break;
+ case PROMPT_COMMENT:
+ buf[0] = '*';
+ break;
+ case PROMPT_PAREN:
+ buf[0] = '(';
+ break;
+ default:
+ buf[0] = '\0';
+ break;
+ }
+ break;
+
+ case 'x':
+ if (!pset.db)
+ buf[0] = '?';
+ else
+ switch (PQtransactionStatus(pset.db))
+ {
+ case PQTRANS_IDLE:
+ buf[0] = '\0';
+ break;
+ case PQTRANS_ACTIVE:
+ case PQTRANS_INTRANS:
+ buf[0] = '*';
+ break;
+ case PQTRANS_INERROR:
+ buf[0] = '!';
+ break;
+ default:
+ buf[0] = '?';
+ break;
+ }
+ break;
+
+ case 'l':
+ snprintf(buf, sizeof(buf), UINT64_FORMAT, pset.stmt_lineno);
+ break;
+
+ case '?':
+ /* not here yet */
+ break;
+
+ case '#':
+ if (is_superuser())
+ buf[0] = '#';
+ else
+ buf[0] = '>';
+ break;
+
+ /* execute command */
+ case '`':
+ {
+ int cmdend = strcspn(p + 1, "`");
+ char *file = pnstrdup(p + 1, cmdend);
+ FILE *fd = popen(file, "r");
+
+ if (fd)
+ {
+ if (fgets(buf, sizeof(buf), fd) == NULL)
+ buf[0] = '\0';
+ pclose(fd);
+ }
+
+ /* strip trailing newline and carriage return */
+ (void) pg_strip_crlf(buf);
+
+ free(file);
+ p += cmdend + 1;
+ break;
+ }
+
+ /* interpolate variable */
+ case ':':
+ {
+ int nameend = strcspn(p + 1, ":");
+ char *name = pnstrdup(p + 1, nameend);
+ const char *val;
+
+ val = GetVariable(pset.vars, name);
+ if (val)
+ strlcpy(buf, val, sizeof(buf));
+ free(name);
+ p += nameend + 1;
+ break;
+ }
+
+ case '[':
+ case ']':
+#if defined(USE_READLINE) && defined(RL_PROMPT_START_IGNORE)
+
+ /*
+ * readline >=4.0 undocumented feature: non-printing
+ * characters in prompt strings must be marked as such, in
+ * order to properly display the line during editing.
+ */
+ buf[0] = (*p == '[') ? RL_PROMPT_START_IGNORE : RL_PROMPT_END_IGNORE;
+ buf[1] = '\0';
+#endif /* USE_READLINE */
+ break;
+
+ default:
+ buf[0] = *p;
+ buf[1] = '\0';
+ break;
+ }
+ esc = false;
+ }
+ else if (*p == '%')
+ esc = true;
+ else
+ {
+ buf[0] = *p;
+ buf[1] = '\0';
+ esc = false;
+ }
+
+ if (!esc)
+ strlcat(destination, buf, sizeof(destination));
+ }
+
+ /* Compute the visible width of PROMPT1, for PROMPT2's %w */
+ if (prompt_string == pset.prompt1)
+ {
+ char *p = destination;
+ char *end = p + strlen(p);
+ bool visible = true;
+
+ last_prompt1_width = 0;
+ while (*p)
+ {
+#if defined(USE_READLINE) && defined(RL_PROMPT_START_IGNORE)
+ if (*p == RL_PROMPT_START_IGNORE)
+ {
+ visible = false;
+ ++p;
+ }
+ else if (*p == RL_PROMPT_END_IGNORE)
+ {
+ visible = true;
+ ++p;
+ }
+ else
+#endif
+ {
+ int chlen,
+ chwidth;
+
+ chlen = PQmblen(p, pset.encoding);
+ if (p + chlen > end)
+ break; /* Invalid string */
+
+ if (visible)
+ {
+ chwidth = PQdsplen(p, pset.encoding);
+
+ if (*p == '\n')
+ last_prompt1_width = 0;
+ else if (chwidth > 0)
+ last_prompt1_width += chwidth;
+ }
+
+ p += chlen;
+ }
+ }
+ }
+
+ return destination;
+}
diff --git a/src/bin/psql/prompt.h b/src/bin/psql/prompt.h
new file mode 100644
index 0000000..eeb2140
--- /dev/null
+++ b/src/bin/psql/prompt.h
@@ -0,0 +1,17 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/prompt.h
+ */
+#ifndef PROMPT_H
+#define PROMPT_H
+
+#include "fe_utils/conditional.h"
+/* enum promptStatus_t is now defined by psqlscan.h */
+#include "fe_utils/psqlscan.h"
+
+char *get_prompt(promptStatus_t status, ConditionalStack cstack);
+
+#endif /* PROMPT_H */
diff --git a/src/bin/psql/psqlrc.sample b/src/bin/psql/psqlrc.sample
new file mode 100644
index 0000000..8152cac
--- /dev/null
+++ b/src/bin/psql/psqlrc.sample
@@ -0,0 +1,8 @@
+--
+-- system-wide psql configuration file
+--
+-- This file is read before the .psqlrc file in the user's home directory.
+--
+-- Copy this to your installation's sysconf directory and rename it psqlrc.
+-- The sysconf directory can be identified via "pg_config --sysconfdir".
+--
diff --git a/src/bin/psql/psqlscanslash.c b/src/bin/psql/psqlscanslash.c
new file mode 100644
index 0000000..515f215
--- /dev/null
+++ b/src/bin/psql/psqlscanslash.c
@@ -0,0 +1,3485 @@
+#line 2 "psqlscanslash.c"
+/*-------------------------------------------------------------------------
+ *
+ * psqlscanslash.l
+ * lexical scanner for psql backslash commands
+ *
+ * XXX Avoid creating backtracking cases --- see the backend lexer for info.
+ *
+ * See fe_utils/psqlscan_int.h for additional commentary.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/psql/psqlscanslash.l
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "psqlscanslash.h"
+#include "common/logging.h"
+#include "fe_utils/conditional.h"
+
+#include "libpq-fe.h"
+
+#line 28 "psqlscanslash.c"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 6
+#define YY_FLEX_SUBMINOR_VERSION 4
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+#ifdef yy_create_buffer
+#define slash_yy_create_buffer_ALREADY_DEFINED
+#else
+#define yy_create_buffer slash_yy_create_buffer
+#endif
+
+#ifdef yy_delete_buffer
+#define slash_yy_delete_buffer_ALREADY_DEFINED
+#else
+#define yy_delete_buffer slash_yy_delete_buffer
+#endif
+
+#ifdef yy_scan_buffer
+#define slash_yy_scan_buffer_ALREADY_DEFINED
+#else
+#define yy_scan_buffer slash_yy_scan_buffer
+#endif
+
+#ifdef yy_scan_string
+#define slash_yy_scan_string_ALREADY_DEFINED
+#else
+#define yy_scan_string slash_yy_scan_string
+#endif
+
+#ifdef yy_scan_bytes
+#define slash_yy_scan_bytes_ALREADY_DEFINED
+#else
+#define yy_scan_bytes slash_yy_scan_bytes
+#endif
+
+#ifdef yy_init_buffer
+#define slash_yy_init_buffer_ALREADY_DEFINED
+#else
+#define yy_init_buffer slash_yy_init_buffer
+#endif
+
+#ifdef yy_flush_buffer
+#define slash_yy_flush_buffer_ALREADY_DEFINED
+#else
+#define yy_flush_buffer slash_yy_flush_buffer
+#endif
+
+#ifdef yy_load_buffer_state
+#define slash_yy_load_buffer_state_ALREADY_DEFINED
+#else
+#define yy_load_buffer_state slash_yy_load_buffer_state
+#endif
+
+#ifdef yy_switch_to_buffer
+#define slash_yy_switch_to_buffer_ALREADY_DEFINED
+#else
+#define yy_switch_to_buffer slash_yy_switch_to_buffer
+#endif
+
+#ifdef yypush_buffer_state
+#define slash_yypush_buffer_state_ALREADY_DEFINED
+#else
+#define yypush_buffer_state slash_yypush_buffer_state
+#endif
+
+#ifdef yypop_buffer_state
+#define slash_yypop_buffer_state_ALREADY_DEFINED
+#else
+#define yypop_buffer_state slash_yypop_buffer_state
+#endif
+
+#ifdef yyensure_buffer_stack
+#define slash_yyensure_buffer_stack_ALREADY_DEFINED
+#else
+#define yyensure_buffer_stack slash_yyensure_buffer_stack
+#endif
+
+#ifdef yylex
+#define slash_yylex_ALREADY_DEFINED
+#else
+#define yylex slash_yylex
+#endif
+
+#ifdef yyrestart
+#define slash_yyrestart_ALREADY_DEFINED
+#else
+#define yyrestart slash_yyrestart
+#endif
+
+#ifdef yylex_init
+#define slash_yylex_init_ALREADY_DEFINED
+#else
+#define yylex_init slash_yylex_init
+#endif
+
+#ifdef yylex_init_extra
+#define slash_yylex_init_extra_ALREADY_DEFINED
+#else
+#define yylex_init_extra slash_yylex_init_extra
+#endif
+
+#ifdef yylex_destroy
+#define slash_yylex_destroy_ALREADY_DEFINED
+#else
+#define yylex_destroy slash_yylex_destroy
+#endif
+
+#ifdef yyget_debug
+#define slash_yyget_debug_ALREADY_DEFINED
+#else
+#define yyget_debug slash_yyget_debug
+#endif
+
+#ifdef yyset_debug
+#define slash_yyset_debug_ALREADY_DEFINED
+#else
+#define yyset_debug slash_yyset_debug
+#endif
+
+#ifdef yyget_extra
+#define slash_yyget_extra_ALREADY_DEFINED
+#else
+#define yyget_extra slash_yyget_extra
+#endif
+
+#ifdef yyset_extra
+#define slash_yyset_extra_ALREADY_DEFINED
+#else
+#define yyset_extra slash_yyset_extra
+#endif
+
+#ifdef yyget_in
+#define slash_yyget_in_ALREADY_DEFINED
+#else
+#define yyget_in slash_yyget_in
+#endif
+
+#ifdef yyset_in
+#define slash_yyset_in_ALREADY_DEFINED
+#else
+#define yyset_in slash_yyset_in
+#endif
+
+#ifdef yyget_out
+#define slash_yyget_out_ALREADY_DEFINED
+#else
+#define yyget_out slash_yyget_out
+#endif
+
+#ifdef yyset_out
+#define slash_yyset_out_ALREADY_DEFINED
+#else
+#define yyset_out slash_yyset_out
+#endif
+
+#ifdef yyget_leng
+#define slash_yyget_leng_ALREADY_DEFINED
+#else
+#define yyget_leng slash_yyget_leng
+#endif
+
+#ifdef yyget_text
+#define slash_yyget_text_ALREADY_DEFINED
+#else
+#define yyget_text slash_yyget_text
+#endif
+
+#ifdef yyget_lineno
+#define slash_yyget_lineno_ALREADY_DEFINED
+#else
+#define yyget_lineno slash_yyget_lineno
+#endif
+
+#ifdef yyset_lineno
+#define slash_yyset_lineno_ALREADY_DEFINED
+#else
+#define yyset_lineno slash_yyset_lineno
+#endif
+
+#ifdef yyget_column
+#define slash_yyget_column_ALREADY_DEFINED
+#else
+#define yyget_column slash_yyget_column
+#endif
+
+#ifdef yyset_column
+#define slash_yyset_column_ALREADY_DEFINED
+#else
+#define yyset_column slash_yyset_column
+#endif
+
+#ifdef yywrap
+#define slash_yywrap_ALREADY_DEFINED
+#else
+#define yywrap slash_yywrap
+#endif
+
+#ifdef yyget_lval
+#define slash_yyget_lval_ALREADY_DEFINED
+#else
+#define yyget_lval slash_yyget_lval
+#endif
+
+#ifdef yyset_lval
+#define slash_yyset_lval_ALREADY_DEFINED
+#else
+#define yyset_lval slash_yyset_lval
+#endif
+
+#ifdef yyalloc
+#define slash_yyalloc_ALREADY_DEFINED
+#else
+#define yyalloc slash_yyalloc
+#endif
+
+#ifdef yyrealloc
+#define slash_yyrealloc_ALREADY_DEFINED
+#else
+#define yyrealloc slash_yyrealloc
+#endif
+
+#ifdef yyfree
+#define slash_yyfree_ALREADY_DEFINED
+#else
+#define yyfree slash_yyfree
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#ifndef SIZE_MAX
+#define SIZE_MAX (~(size_t)0)
+#endif
+
+#endif /* ! C99 */
+
+#endif /* ! FLEXINT_H */
+
+/* begin standard C++ headers. */
+
+/* TODO: this is always defined, so inline it */
+#define yyconst const
+
+#if defined(__GNUC__) && __GNUC__ >= 3
+#define yynoreturn __attribute__((__noreturn__))
+#else
+#define yynoreturn
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an
+ * integer in range [0..255] for use as an array index.
+ */
+#define YY_SC_TO_UI(c) ((YY_CHAR) (c))
+
+/* An opaque pointer. */
+#ifndef YY_TYPEDEF_YY_SCANNER_T
+#define YY_TYPEDEF_YY_SCANNER_T
+typedef void* yyscan_t;
+#endif
+
+/* For convenience, these vars (plus the bison vars far below)
+ are macros in the reentrant scanner. */
+#define yyin yyg->yyin_r
+#define yyout yyg->yyout_r
+#define yyextra yyg->yyextra_r
+#define yyleng yyg->yyleng_r
+#define yytext yyg->yytext_r
+#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
+#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
+#define yy_flex_debug yyg->yy_flex_debug_r
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yyg->yy_start = 1 + 2 *
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yyg->yy_start - 1) / 2)
+#define YYSTATE YY_START
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin , yyscanner )
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
+#define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+ #define YY_LINENO_REWIND_TO(ptr)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = yyg->yy_hold_char; \
+ YY_RESTORE_YY_MORE_OFFSET \
+ yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ int yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via yyrestart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \
+ ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \
+ : NULL)
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]
+
+void yyrestart ( FILE *input_file , yyscan_t yyscanner );
+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner );
+void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
+void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
+void yypop_buffer_state ( yyscan_t yyscanner );
+
+static void yyensure_buffer_stack ( yyscan_t yyscanner );
+static void yy_load_buffer_state ( yyscan_t yyscanner );
+static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner );
+#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner)
+
+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner );
+
+void *yyalloc ( yy_size_t , yyscan_t yyscanner );
+void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner );
+void yyfree ( void * , yyscan_t yyscanner );
+
+#define yy_new_buffer yy_create_buffer
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ yyensure_buffer_stack (yyscanner); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ yyensure_buffer_stack (yyscanner); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define slash_yywrap(yyscanner) (/*CONSTCOND*/1)
+#define YY_SKIP_YYWRAP
+typedef flex_uint8_t YY_CHAR;
+
+typedef int yy_state_type;
+
+#define yytext_ptr yytext_r
+
+static const flex_int16_t yy_nxt[][22] =
+ {
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0
+ },
+
+ {
+ 19, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20
+ },
+
+ {
+ 19, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20
+ },
+
+ {
+ 19, 21, 22, 23, 21, 21, 21, 21, 21, 21,
+
+ 21, 22, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21
+ },
+
+ {
+ 19, 21, 22, 23, 21, 21, 21, 21, 21, 21,
+ 21, 22, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21
+ },
+
+ {
+ 19, 24, 25, 26, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 27, 24
+ },
+
+ {
+ 19, 24, 25, 26, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+
+ 27, 24
+ },
+
+ {
+ 19, 28, 29, 30, 31, 32, 28, 28, 33, 28,
+ 28, 29, 34, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28
+ },
+
+ {
+ 19, 28, 29, 30, 31, 32, 28, 28, 33, 28,
+ 28, 29, 34, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28
+ },
+
+ {
+ 19, 35, 35, 35, 35, 36, 35, 35, 35, 35,
+ 35, 37, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35
+
+ },
+
+ {
+ 19, 35, 35, 35, 35, 36, 35, 35, 35, 35,
+ 35, 37, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35
+ },
+
+ {
+ 19, 38, 38, 38, 38, 38, 38, 38, 39, 38,
+ 38, 38, 40, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38
+ },
+
+ {
+ 19, 38, 38, 38, 38, 38, 38, 38, 39, 38,
+ 38, 38, 40, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38
+ },
+
+ {
+ 19, 41, 41, 41, 42, 41, 41, 41, 41, 41,
+
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41
+ },
+
+ {
+ 19, 41, 41, 41, 42, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41
+ },
+
+ {
+ 19, 43, 44, 45, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43
+ },
+
+ {
+ 19, 43, 44, 45, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+
+ 43, 43
+ },
+
+ {
+ 19, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 47, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46
+ },
+
+ {
+ 19, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 47, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46
+ },
+
+ {
+ -19, -19, -19, -19, -19, -19, -19, -19, -19, -19,
+ -19, -19, -19, -19, -19, -19, -19, -19, -19, -19,
+ -19, -19
+
+ },
+
+ {
+ 19, -20, -20, -20, -20, -20, -20, -20, -20, -20,
+ -20, -20, -20, -20, -20, -20, -20, -20, -20, -20,
+ -20, -20
+ },
+
+ {
+ 19, -21, -21, -21, -21, -21, -21, -21, -21, -21,
+ -21, -21, -21, -21, -21, -21, -21, -21, -21, -21,
+ -21, -21
+ },
+
+ {
+ 19, -22, -22, -22, -22, -22, -22, -22, -22, -22,
+ -22, -22, -22, -22, -22, -22, -22, -22, -22, -22,
+ -22, -22
+ },
+
+ {
+ 19, -23, -23, -23, -23, -23, -23, -23, -23, -23,
+
+ -23, -23, -23, -23, -23, -23, -23, -23, -23, -23,
+ -23, -23
+ },
+
+ {
+ 19, -24, -24, -24, -24, -24, -24, -24, -24, -24,
+ -24, -24, -24, -24, -24, -24, -24, -24, -24, -24,
+ -24, -24
+ },
+
+ {
+ 19, -25, 48, 48, -25, -25, -25, -25, -25, -25,
+ -25, -25, -25, -25, -25, -25, -25, -25, -25, -25,
+ -25, -25
+ },
+
+ {
+ 19, -26, 48, 48, -26, -26, -26, -26, -26, -26,
+ -26, -26, -26, -26, -26, -26, -26, -26, -26, -26,
+
+ -26, -26
+ },
+
+ {
+ 19, -27, -27, -27, -27, -27, -27, -27, -27, -27,
+ -27, -27, -27, -27, -27, -27, -27, -27, -27, -27,
+ -27, -27
+ },
+
+ {
+ 19, -28, -28, -28, -28, -28, -28, -28, -28, -28,
+ -28, -28, -28, -28, -28, -28, -28, -28, -28, -28,
+ -28, -28
+ },
+
+ {
+ 19, -29, -29, -29, -29, -29, -29, -29, -29, -29,
+ -29, -29, -29, -29, -29, -29, -29, -29, -29, -29,
+ -29, -29
+
+ },
+
+ {
+ 19, -30, -30, -30, -30, -30, -30, -30, -30, -30,
+ -30, -30, -30, -30, -30, -30, -30, -30, -30, -30,
+ -30, -30
+ },
+
+ {
+ 19, -31, -31, -31, -31, -31, -31, -31, -31, -31,
+ -31, -31, -31, -31, -31, -31, -31, -31, -31, -31,
+ -31, -31
+ },
+
+ {
+ 19, -32, -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32
+ },
+
+ {
+ 19, -33, -33, -33, 49, 50, 51, 51, -33, -33,
+
+ 51, -33, -33, 51, 51, 51, 51, 51, 51, 52,
+ -33, -33
+ },
+
+ {
+ 19, -34, -34, -34, -34, -34, -34, -34, -34, -34,
+ -34, -34, -34, -34, -34, -34, -34, -34, -34, -34,
+ -34, -34
+ },
+
+ {
+ 19, -35, -35, -35, -35, -35, -35, -35, -35, -35,
+ -35, -35, -35, -35, -35, -35, -35, -35, -35, -35,
+ -35, -35
+ },
+
+ {
+ 19, -36, -36, -36, -36, 53, -36, -36, -36, -36,
+ -36, -36, -36, -36, -36, -36, -36, -36, -36, -36,
+
+ -36, -36
+ },
+
+ {
+ 19, 54, 54, -37, 54, 54, 55, 54, 54, 54,
+ 54, 54, 54, 56, 57, 58, 59, 60, 61, 54,
+ 54, 54
+ },
+
+ {
+ 19, -38, -38, -38, -38, -38, -38, -38, -38, -38,
+ -38, -38, -38, -38, -38, -38, -38, -38, -38, -38,
+ -38, -38
+ },
+
+ {
+ 19, -39, -39, -39, -39, 62, 63, 63, -39, -39,
+ 63, -39, -39, 63, 63, 63, 63, 63, 63, -39,
+ -39, -39
+
+ },
+
+ {
+ 19, -40, -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40
+ },
+
+ {
+ 19, -41, -41, -41, -41, -41, -41, -41, -41, -41,
+ -41, -41, -41, -41, -41, -41, -41, -41, -41, -41,
+ -41, -41
+ },
+
+ {
+ 19, -42, -42, -42, -42, -42, -42, -42, -42, -42,
+ -42, -42, -42, -42, -42, -42, -42, -42, -42, -42,
+ -42, -42
+ },
+
+ {
+ 19, -43, -43, -43, -43, -43, -43, -43, -43, -43,
+
+ -43, -43, -43, -43, -43, -43, -43, -43, -43, -43,
+ -43, -43
+ },
+
+ {
+ 19, -44, 64, 64, -44, -44, -44, -44, -44, -44,
+ -44, -44, -44, -44, -44, -44, -44, -44, -44, -44,
+ -44, -44
+ },
+
+ {
+ 19, -45, 64, 64, -45, -45, -45, -45, -45, -45,
+ -45, -45, -45, -45, -45, -45, -45, -45, -45, -45,
+ -45, -45
+ },
+
+ {
+ 19, -46, -46, -46, -46, -46, -46, -46, -46, -46,
+ -46, -46, -46, -46, -46, -46, -46, -46, -46, -46,
+
+ -46, -46
+ },
+
+ {
+ 19, -47, -47, -47, -47, -47, -47, -47, -47, -47,
+ -47, 65, -47, -47, -47, -47, -47, -47, -47, -47,
+ -47, -47
+ },
+
+ {
+ 19, -48, 48, 48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48
+ },
+
+ {
+ 19, -49, -49, -49, -49, -49, 66, 66, -49, -49,
+ 66, -49, -49, 66, 66, 66, 66, 66, 66, -49,
+ -49, -49
+
+ },
+
+ {
+ 19, -50, -50, -50, -50, -50, 67, 67, -50, -50,
+ 67, -50, -50, 67, 67, 67, 67, 67, 67, -50,
+ -50, -50
+ },
+
+ {
+ 19, -51, -51, -51, -51, -51, 51, 51, -51, -51,
+ 51, -51, -51, 51, 51, 51, 51, 51, 51, -51,
+ -51, -51
+ },
+
+ {
+ 19, -52, -52, -52, -52, -52, -52, -52, -52, 68,
+ -52, -52, -52, -52, -52, -52, -52, -52, -52, -52,
+ -52, -52
+ },
+
+ {
+ 19, -53, -53, -53, -53, -53, -53, -53, -53, -53,
+
+ -53, -53, -53, -53, -53, -53, -53, -53, -53, -53,
+ -53, -53
+ },
+
+ {
+ 19, -54, -54, -54, -54, -54, -54, -54, -54, -54,
+ -54, -54, -54, -54, -54, -54, -54, -54, -54, -54,
+ -54, -54
+ },
+
+ {
+ 19, -55, -55, -55, -55, -55, 69, -55, -55, -55,
+ -55, -55, -55, -55, -55, -55, -55, -55, -55, -55,
+ -55, -55
+ },
+
+ {
+ 19, -56, -56, -56, -56, -56, -56, -56, -56, -56,
+ -56, -56, -56, -56, -56, -56, -56, -56, -56, -56,
+
+ -56, -56
+ },
+
+ {
+ 19, -57, -57, -57, -57, -57, -57, -57, -57, -57,
+ -57, -57, -57, -57, -57, -57, -57, -57, -57, -57,
+ -57, -57
+ },
+
+ {
+ 19, -58, -58, -58, -58, -58, -58, -58, -58, -58,
+ -58, -58, -58, -58, -58, -58, -58, -58, -58, -58,
+ -58, -58
+ },
+
+ {
+ 19, -59, -59, -59, -59, -59, -59, -59, -59, -59,
+ -59, -59, -59, -59, -59, -59, -59, -59, -59, -59,
+ -59, -59
+
+ },
+
+ {
+ 19, -60, -60, -60, -60, -60, -60, -60, -60, -60,
+ -60, -60, -60, -60, -60, -60, -60, -60, -60, -60,
+ -60, -60
+ },
+
+ {
+ 19, -61, -61, -61, -61, -61, 70, 70, -61, -61,
+ -61, -61, -61, 70, 70, -61, -61, -61, -61, -61,
+ -61, -61
+ },
+
+ {
+ 19, -62, -62, -62, -62, -62, 71, 71, -62, -62,
+ 71, -62, -62, 71, 71, 71, 71, 71, 71, -62,
+ -62, -62
+ },
+
+ {
+ 19, -63, -63, -63, -63, -63, 63, 63, -63, -63,
+
+ 63, -63, -63, 63, 63, 63, 63, 63, 63, -63,
+ -63, -63
+ },
+
+ {
+ 19, -64, 64, 64, -64, -64, -64, -64, -64, -64,
+ -64, -64, -64, -64, -64, -64, -64, -64, -64, -64,
+ -64, -64
+ },
+
+ {
+ 19, -65, -65, -65, -65, -65, -65, -65, -65, -65,
+ -65, -65, -65, -65, -65, -65, -65, -65, -65, -65,
+ -65, -65
+ },
+
+ {
+ 19, -66, -66, -66, 72, -66, 66, 66, -66, -66,
+ 66, -66, -66, 66, 66, 66, 66, 66, 66, -66,
+
+ -66, -66
+ },
+
+ {
+ 19, -67, -67, -67, -67, 73, 67, 67, -67, -67,
+ 67, -67, -67, 67, 67, 67, 67, 67, 67, -67,
+ -67, -67
+ },
+
+ {
+ 19, -68, -68, -68, -68, -68, 74, 74, -68, -68,
+ 74, -68, -68, 74, 74, 74, 74, 74, 74, -68,
+ -68, -68
+ },
+
+ {
+ 19, -69, -69, -69, -69, -69, 75, -69, -69, -69,
+ -69, -69, -69, -69, -69, -69, -69, -69, -69, -69,
+ -69, -69
+
+ },
+
+ {
+ 19, -70, -70, -70, -70, -70, 76, 76, -70, -70,
+ -70, -70, -70, 76, 76, -70, -70, -70, -70, -70,
+ -70, -70
+ },
+
+ {
+ 19, -71, -71, -71, -71, 77, 71, 71, -71, -71,
+ 71, -71, -71, 71, 71, 71, 71, 71, 71, -71,
+ -71, -71
+ },
+
+ {
+ 19, -72, -72, -72, -72, -72, -72, -72, -72, -72,
+ -72, -72, -72, -72, -72, -72, -72, -72, -72, -72,
+ -72, -72
+ },
+
+ {
+ 19, -73, -73, -73, -73, -73, -73, -73, -73, -73,
+
+ -73, -73, -73, -73, -73, -73, -73, -73, -73, -73,
+ -73, -73
+ },
+
+ {
+ 19, -74, -74, -74, -74, -74, 74, 74, -74, -74,
+ 74, -74, -74, 74, 74, 74, 74, 74, 74, -74,
+ -74, 78
+ },
+
+ {
+ 19, -75, -75, -75, -75, -75, -75, -75, -75, -75,
+ -75, -75, -75, -75, -75, -75, -75, -75, -75, -75,
+ -75, -75
+ },
+
+ {
+ 19, -76, -76, -76, -76, -76, -76, -76, -76, -76,
+ -76, -76, -76, -76, -76, -76, -76, -76, -76, -76,
+
+ -76, -76
+ },
+
+ {
+ 19, -77, -77, -77, -77, -77, -77, -77, -77, -77,
+ -77, -77, -77, -77, -77, -77, -77, -77, -77, -77,
+ -77, -77
+ },
+
+ {
+ 19, -78, -78, -78, -78, -78, -78, -78, -78, -78,
+ -78, -78, -78, -78, -78, -78, -78, -78, -78, -78,
+ -78, -78
+ },
+
+ } ;
+
+static yy_state_type yy_get_previous_state ( yyscan_t yyscanner );
+static yy_state_type yy_try_NUL_trans ( yy_state_type current_state , yyscan_t yyscanner);
+static int yy_get_next_buffer ( yyscan_t yyscanner );
+static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ yyg->yytext_ptr = yy_bp; \
+ yyleng = (int) (yy_cp - yy_bp); \
+ yyg->yy_hold_char = *yy_cp; \
+ *yy_cp = '\0'; \
+ yyg->yy_c_buf_p = yy_cp;
+#define YY_NUM_RULES 42
+#define YY_END_OF_BUFFER 43
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static const flex_int16_t yy_accept[79] =
+ { 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 43, 1,
+ 3, 2, 2, 6, 4, 4, 5, 19, 7, 7,
+ 10, 8, 19, 9, 30, 20, 30, 35, 35, 31,
+ 37, 36, 39, 38, 38, 41, 41, 4, 16, 15,
+ 11, 18, 21, 29, 27, 24, 26, 22, 25, 23,
+ 29, 34, 32, 38, 40, 16, 15, 17, 27, 28,
+ 34, 13, 12, 17, 27, 28, 33, 14
+ } ;
+
+static const YY_CHAR yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 2, 2, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 1, 4, 1, 1, 1, 1, 5, 1,
+ 1, 1, 1, 1, 1, 1, 1, 6, 6, 6,
+ 6, 6, 6, 6, 6, 7, 7, 8, 1, 1,
+ 1, 1, 9, 1, 7, 7, 7, 7, 7, 7,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 1, 11, 1, 1, 10, 12, 7, 13, 7, 7,
+
+ 7, 14, 10, 10, 10, 10, 10, 10, 10, 15,
+ 10, 10, 10, 16, 10, 17, 10, 10, 10, 18,
+ 10, 10, 19, 20, 21, 1, 1, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10
+ } ;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+#line 1 "psqlscanslash.l"
+
+#line 29 "psqlscanslash.l"
+#include "fe_utils/psqlscan_int.h"
+
+/*
+ * We must have a typedef YYSTYPE for yylex's first argument, but this lexer
+ * doesn't presently make use of that argument, so just declare it as int.
+ */
+typedef int YYSTYPE;
+
+/*
+ * Set the type of yyextra; we use it as a pointer back to the containing
+ * PsqlScanState.
+ */
+#define YY_EXTRA_TYPE PsqlScanState
+
+/*
+ * These variables do not need to be saved across calls. Yeah, it's a bit
+ * of a hack, but putting them into PsqlScanStateData would be klugy too.
+ */
+static enum slash_option_type option_type;
+static char *option_quote;
+static int unquoted_option_chars;
+static int backtick_start_offset;
+
+
+/* Return values from yylex() */
+#define LEXRES_EOL 0 /* end of input */
+#define LEXRES_OK 1 /* OK completion of backslash argument */
+
+
+static void evaluate_backtick(PsqlScanState state);
+
+#define ECHO psqlscan_emit(cur_state, yytext, yyleng)
+
+/*
+ * Work around a bug in flex 2.5.35: it emits a couple of functions that
+ * it forgets to emit declarations for. Since we use -Wmissing-prototypes,
+ * this would cause warnings. Providing our own declarations should be
+ * harmless even when the bug gets fixed.
+ */
+extern int slash_yyget_column(yyscan_t yyscanner);
+extern void slash_yyset_column(int column_no, yyscan_t yyscanner);
+
+/* LCOV_EXCL_START */
+
+#line 1197 "psqlscanslash.c"
+/* Except for the prefix, these options should match psqlscan.l */
+#define YY_NO_INPUT 1
+/*
+ * OK, here is a short description of lex/flex rules behavior.
+ * The longest pattern which matches an input string is always chosen.
+ * For equal-length patterns, the first occurring in the rules list is chosen.
+ * INITIAL is the starting state, to which all non-conditional rules apply.
+ * Exclusive states change parsing rules while the state is active. When in
+ * an exclusive state, only those rules defined for that state apply.
+ */
+/* Exclusive states for lexing backslash commands */
+
+/*
+ * Assorted character class definitions that should match psqlscan.l.
+ */
+#line 1213 "psqlscanslash.c"
+
+#define INITIAL 0
+#define xslashcmd 1
+#define xslashargstart 2
+#define xslasharg 3
+#define xslashquote 4
+#define xslashbackquote 5
+#define xslashdquote 6
+#define xslashwholeline 7
+#define xslashend 8
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+/* Holds the entire state of the reentrant scanner. */
+struct yyguts_t
+ {
+
+ /* User-defined. Not touched by flex. */
+ YY_EXTRA_TYPE yyextra_r;
+
+ /* The rest are the same as the globals declared in the non-reentrant scanner. */
+ FILE *yyin_r, *yyout_r;
+ size_t yy_buffer_stack_top; /**< index of top of stack. */
+ size_t yy_buffer_stack_max; /**< capacity of stack. */
+ YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
+ char yy_hold_char;
+ int yy_n_chars;
+ int yyleng_r;
+ char *yy_c_buf_p;
+ int yy_init;
+ int yy_start;
+ int yy_did_buffer_switch_on_eof;
+ int yy_start_stack_ptr;
+ int yy_start_stack_depth;
+ int *yy_start_stack;
+ yy_state_type yy_last_accepting_state;
+ char* yy_last_accepting_cpos;
+
+ int yylineno_r;
+ int yy_flex_debug_r;
+
+ char *yytext_r;
+ int yy_more_flag;
+ int yy_more_len;
+
+ YYSTYPE * yylval_r;
+
+ }; /* end struct yyguts_t */
+
+static int yy_init_globals ( yyscan_t yyscanner );
+
+ /* This must go here because YYSTYPE and YYLTYPE are included
+ * from bison output in section 1.*/
+ # define yylval yyg->yylval_r
+
+int yylex_init (yyscan_t* scanner);
+
+int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner);
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int yylex_destroy ( yyscan_t yyscanner );
+
+int yyget_debug ( yyscan_t yyscanner );
+
+void yyset_debug ( int debug_flag , yyscan_t yyscanner );
+
+YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner );
+
+void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner );
+
+FILE *yyget_in ( yyscan_t yyscanner );
+
+void yyset_in ( FILE * _in_str , yyscan_t yyscanner );
+
+FILE *yyget_out ( yyscan_t yyscanner );
+
+void yyset_out ( FILE * _out_str , yyscan_t yyscanner );
+
+ int yyget_leng ( yyscan_t yyscanner );
+
+char *yyget_text ( yyscan_t yyscanner );
+
+int yyget_lineno ( yyscan_t yyscanner );
+
+void yyset_lineno ( int _line_number , yyscan_t yyscanner );
+
+int yyget_column ( yyscan_t yyscanner );
+
+void yyset_column ( int _column_no , yyscan_t yyscanner );
+
+YYSTYPE * yyget_lval ( yyscan_t yyscanner );
+
+void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap ( yyscan_t yyscanner );
+#else
+extern int yywrap ( yyscan_t yyscanner );
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner);
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen ( const char * , yyscan_t yyscanner);
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput ( yyscan_t yyscanner );
+#else
+static int input ( yyscan_t yyscanner );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
+#define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ int n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner)
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int yylex \
+ (YYSTYPE * yylval_param , yyscan_t yyscanner);
+
+#define YY_DECL int yylex \
+ (YYSTYPE * yylval_param , yyscan_t yyscanner)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK /*LINTED*/break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ yy_state_type yy_current_state;
+ char *yy_cp, *yy_bp;
+ int yy_act;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ yylval = yylval_param;
+
+ if ( !yyg->yy_init )
+ {
+ yyg->yy_init = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! yyg->yy_start )
+ yyg->yy_start = 1; /* first start state */
+
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ yyensure_buffer_stack (yyscanner);
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);
+ }
+
+ yy_load_buffer_state( yyscanner );
+ }
+
+ {
+#line 119 "psqlscanslash.l"
+
+
+
+#line 123 "psqlscanslash.l"
+ /* Declare some local variables inside yylex(), for convenience */
+ PsqlScanState cur_state = yyextra;
+ PQExpBuffer output_buf = cur_state->output_buf;
+
+ /*
+ * Force flex into the state indicated by start_state. This has a
+ * couple of purposes: it lets some of the functions below set a new
+ * starting state without ugly direct access to flex variables, and it
+ * allows us to transition from one flex lexer to another so that we
+ * can lex different parts of the source string using separate lexers.
+ */
+ BEGIN(cur_state->start_state);
+
+
+ /*
+ * We don't really expect to be invoked in the INITIAL state in this
+ * lexer; but if we are, just spit data to the output_buf until EOF.
+ */
+
+#line 1517 "psqlscanslash.c"
+
+ while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = yyg->yy_c_buf_p;
+
+ /* Support of yytext. */
+ *yy_cp = yyg->yy_hold_char;
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = yyg->yy_start;
+yy_match:
+ while ( (yy_current_state = yy_nxt[yy_current_state][ yy_ec[YY_SC_TO_UI(*yy_cp)] ]) > 0 )
+ ++yy_cp;
+
+ yy_current_state = -yy_current_state;
+
+yy_find_action:
+ yy_act = yy_accept[yy_current_state];
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+case 1:
+/* rule 1 can match eol */
+YY_RULE_SETUP
+#line 142 "psqlscanslash.l"
+{ ECHO; }
+ YY_BREAK
+/*
+ * Exclusive lexer states to handle backslash command lexing
+ */
+
+/* command name ends at whitespace or backslash; eat all else */
+case 2:
+/* rule 2 can match eol */
+YY_RULE_SETUP
+#line 151 "psqlscanslash.l"
+{
+ yyless(0);
+ cur_state->start_state = YY_START;
+ return LEXRES_OK;
+ }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 157 "psqlscanslash.l"
+{ ECHO; }
+ YY_BREAK
+
+
+/*
+ * Discard any whitespace before argument, then go to xslasharg state.
+ * An exception is that "|" is only special at start of argument, so we
+ * check for it here.
+ */
+case 4:
+/* rule 4 can match eol */
+YY_RULE_SETUP
+#line 168 "psqlscanslash.l"
+{ }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 170 "psqlscanslash.l"
+{
+ if (option_type == OT_FILEPIPE)
+ {
+ /* treat like whole-string case */
+ ECHO;
+ BEGIN(xslashwholeline);
+ }
+ else
+ {
+ /* vertical bar is not special otherwise */
+ yyless(0);
+ BEGIN(xslasharg);
+ }
+ }
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 185 "psqlscanslash.l"
+{
+ yyless(0);
+ BEGIN(xslasharg);
+ }
+ YY_BREAK
+
+
+/*
+ * Default processing of text in a slash command's argument.
+ *
+ * Note: unquoted_option_chars counts the number of characters at the
+ * end of the argument that were not subject to any form of quoting.
+ * psql_scan_slash_option needs this to strip trailing semicolons safely.
+ */
+case 7:
+/* rule 7 can match eol */
+YY_RULE_SETUP
+#line 201 "psqlscanslash.l"
+{
+ /*
+ * Unquoted space is end of arg; do not eat. Likewise
+ * backslash is end of command or next command, do not eat
+ *
+ * XXX this means we can't conveniently accept options
+ * that include unquoted backslashes; therefore, option
+ * processing that encourages use of backslashes is rather
+ * broken.
+ */
+ yyless(0);
+ cur_state->start_state = YY_START;
+ return LEXRES_OK;
+ }
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 216 "psqlscanslash.l"
+{
+ *option_quote = '\'';
+ unquoted_option_chars = 0;
+ BEGIN(xslashquote);
+ }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 222 "psqlscanslash.l"
+{
+ backtick_start_offset = output_buf->len;
+ *option_quote = '`';
+ unquoted_option_chars = 0;
+ BEGIN(xslashbackquote);
+ }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 229 "psqlscanslash.l"
+{
+ ECHO;
+ *option_quote = '"';
+ unquoted_option_chars = 0;
+ BEGIN(xslashdquote);
+ }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 236 "psqlscanslash.l"
+{
+ /* Possible psql variable substitution */
+ if (cur_state->callbacks->get_variable == NULL)
+ ECHO;
+ else
+ {
+ char *varname;
+ char *value;
+
+ varname = psqlscan_extract_substring(cur_state,
+ yytext + 1,
+ yyleng - 1);
+ value = cur_state->callbacks->get_variable(varname,
+ PQUOTE_PLAIN,
+ cur_state->cb_passthrough);
+ free(varname);
+
+ /*
+ * The variable value is just emitted without any
+ * further examination. This is consistent with the
+ * pre-8.0 code behavior, if not with the way that
+ * variables are handled outside backslash commands.
+ * Note that we needn't guard against recursion here.
+ */
+ if (value)
+ {
+ appendPQExpBufferStr(output_buf, value);
+ free(value);
+ }
+ else
+ ECHO;
+
+ *option_quote = ':';
+ }
+ unquoted_option_chars = 0;
+ }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 273 "psqlscanslash.l"
+{
+ psqlscan_escape_variable(cur_state, yytext, yyleng,
+ PQUOTE_SQL_LITERAL);
+ *option_quote = ':';
+ unquoted_option_chars = 0;
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 281 "psqlscanslash.l"
+{
+ psqlscan_escape_variable(cur_state, yytext, yyleng,
+ PQUOTE_SQL_IDENT);
+ *option_quote = ':';
+ unquoted_option_chars = 0;
+ }
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 288 "psqlscanslash.l"
+{
+ psqlscan_test_variable(cur_state, yytext, yyleng);
+ }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 292 "psqlscanslash.l"
+{
+ /* Throw back everything but the colon */
+ yyless(1);
+ unquoted_option_chars++;
+ ECHO;
+ }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 299 "psqlscanslash.l"
+{
+ /* Throw back everything but the colon */
+ yyless(1);
+ unquoted_option_chars++;
+ ECHO;
+ }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 306 "psqlscanslash.l"
+{
+ /* Throw back everything but the colon */
+ yyless(1);
+ unquoted_option_chars++;
+ ECHO;
+ }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 313 "psqlscanslash.l"
+{
+ /* Throw back everything but the colon */
+ yyless(1);
+ unquoted_option_chars++;
+ ECHO;
+ }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 320 "psqlscanslash.l"
+{
+ unquoted_option_chars++;
+ ECHO;
+ }
+ YY_BREAK
+
+
+/*
+ * single-quoted text: copy literally except for '' and backslash
+ * sequences
+ */
+case 20:
+YY_RULE_SETUP
+#line 333 "psqlscanslash.l"
+{ BEGIN(xslasharg); }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 335 "psqlscanslash.l"
+{ appendPQExpBufferChar(output_buf, '\''); }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 337 "psqlscanslash.l"
+{ appendPQExpBufferChar(output_buf, '\n'); }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 338 "psqlscanslash.l"
+{ appendPQExpBufferChar(output_buf, '\t'); }
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 339 "psqlscanslash.l"
+{ appendPQExpBufferChar(output_buf, '\b'); }
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 340 "psqlscanslash.l"
+{ appendPQExpBufferChar(output_buf, '\r'); }
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 341 "psqlscanslash.l"
+{ appendPQExpBufferChar(output_buf, '\f'); }
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 343 "psqlscanslash.l"
+{
+ /* octal case */
+ appendPQExpBufferChar(output_buf,
+ (char) strtol(yytext + 1, NULL, 8));
+ }
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 349 "psqlscanslash.l"
+{
+ /* hex case */
+ appendPQExpBufferChar(output_buf,
+ (char) strtol(yytext + 2, NULL, 16));
+ }
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 355 "psqlscanslash.l"
+{ psqlscan_emit(cur_state, yytext + 1, 1); }
+ YY_BREAK
+case 30:
+/* rule 30 can match eol */
+YY_RULE_SETUP
+#line 357 "psqlscanslash.l"
+{ ECHO; }
+ YY_BREAK
+
+
+/*
+ * backticked text: copy everything until next backquote (expanding
+ * variable references, but doing nought else), then evaluate.
+ */
+case 31:
+YY_RULE_SETUP
+#line 367 "psqlscanslash.l"
+{
+ /* In an inactive \if branch, don't evaluate the command */
+ if (cur_state->cb_passthrough == NULL ||
+ conditional_active((ConditionalStack) cur_state->cb_passthrough))
+ evaluate_backtick(cur_state);
+ BEGIN(xslasharg);
+ }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 375 "psqlscanslash.l"
+{
+ /* Possible psql variable substitution */
+ if (cur_state->callbacks->get_variable == NULL)
+ ECHO;
+ else
+ {
+ char *varname;
+ char *value;
+
+ varname = psqlscan_extract_substring(cur_state,
+ yytext + 1,
+ yyleng - 1);
+ value = cur_state->callbacks->get_variable(varname,
+ PQUOTE_PLAIN,
+ cur_state->cb_passthrough);
+ free(varname);
+
+ if (value)
+ {
+ appendPQExpBufferStr(output_buf, value);
+ free(value);
+ }
+ else
+ ECHO;
+ }
+ }
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 402 "psqlscanslash.l"
+{
+ psqlscan_escape_variable(cur_state, yytext, yyleng,
+ PQUOTE_SHELL_ARG);
+ }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 407 "psqlscanslash.l"
+{
+ /* Throw back everything but the colon */
+ yyless(1);
+ ECHO;
+ }
+ YY_BREAK
+case 35:
+/* rule 35 can match eol */
+YY_RULE_SETUP
+#line 413 "psqlscanslash.l"
+{ ECHO; }
+ YY_BREAK
+
+
+/* double-quoted text: copy verbatim, including the double quotes */
+case 36:
+YY_RULE_SETUP
+#line 420 "psqlscanslash.l"
+{
+ ECHO;
+ BEGIN(xslasharg);
+ }
+ YY_BREAK
+case 37:
+/* rule 37 can match eol */
+YY_RULE_SETUP
+#line 425 "psqlscanslash.l"
+{ ECHO; }
+ YY_BREAK
+
+
+/* copy everything until end of input line */
+/* but suppress leading whitespace */
+case 38:
+/* rule 38 can match eol */
+YY_RULE_SETUP
+#line 433 "psqlscanslash.l"
+{
+ if (output_buf->len > 0)
+ ECHO;
+ }
+ YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 438 "psqlscanslash.l"
+{ ECHO; }
+ YY_BREAK
+
+
+/* at end of command, eat a double backslash, but not anything else */
+case 40:
+YY_RULE_SETUP
+#line 445 "psqlscanslash.l"
+{
+ cur_state->start_state = YY_START;
+ return LEXRES_OK;
+ }
+ YY_BREAK
+case 41:
+/* rule 41 can match eol */
+YY_RULE_SETUP
+#line 450 "psqlscanslash.l"
+{
+ yyless(0);
+ cur_state->start_state = YY_START;
+ return LEXRES_OK;
+ }
+ YY_BREAK
+
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(xslashcmd):
+case YY_STATE_EOF(xslashargstart):
+case YY_STATE_EOF(xslasharg):
+case YY_STATE_EOF(xslashquote):
+case YY_STATE_EOF(xslashbackquote):
+case YY_STATE_EOF(xslashdquote):
+case YY_STATE_EOF(xslashwholeline):
+case YY_STATE_EOF(xslashend):
+#line 458 "psqlscanslash.l"
+{
+ if (cur_state->buffer_stack == NULL)
+ {
+ cur_state->start_state = YY_START;
+ return LEXRES_EOL; /* end of input reached */
+ }
+
+ /*
+ * We were expanding a variable, so pop the inclusion
+ * stack and keep lexing
+ */
+ psqlscan_pop_buffer_stack(cur_state);
+ psqlscan_select_top_buffer(cur_state);
+ }
+ YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 473 "psqlscanslash.l"
+YY_FATAL_ERROR( "flex scanner jammed" );
+ YY_BREAK
+#line 2011 "psqlscanslash.c"
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = yyg->yy_hold_char;
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * yylex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner);
+
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++yyg->yy_c_buf_p;
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = yyg->yy_c_buf_p;
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( yyscanner ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ yyg->yy_did_buffer_switch_on_eof = 0;
+
+ if ( yywrap( yyscanner ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! yyg->yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yyg->yy_c_buf_p =
+ yyg->yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ yy_cp = yyg->yy_c_buf_p;
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ yyg->yy_c_buf_p =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars];
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ yy_cp = yyg->yy_c_buf_p;
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+ } /* end of user's declarations */
+} /* end of yylex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ char *source = yyg->yytext_ptr;
+ int number_to_move, i;
+ int ret_val;
+
+ if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1);
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0;
+
+ else
+ {
+ int num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
+
+ int yy_c_buf_p_offset =
+ (int) (yyg->yy_c_buf_p - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ int new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ yyrealloc( (void *) b->yy_ch_buf,
+ (yy_size_t) (b->yy_buf_size + 2) , yyscanner );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = NULL;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+ number_to_move - 1;
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ yyg->yy_n_chars, num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ if ( yyg->yy_n_chars == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ yyrestart( yyin , yyscanner);
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
+ (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ /* "- 2" to take care of EOB's */
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
+ }
+
+ yyg->yy_n_chars += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+ yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
+{
+ yy_state_type yy_current_state;
+ char *yy_cp;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ yy_current_state = yyg->yy_start;
+
+ for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )
+ {
+ yy_current_state = yy_nxt[yy_current_state][(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1)];
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner)
+{
+ int yy_is_jam;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
+
+ yy_current_state = yy_nxt[yy_current_state][1];
+ yy_is_jam = (yy_current_state <= 0);
+
+ (void)yyg;
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (yyscan_t yyscanner)
+#else
+ static int input (yyscan_t yyscanner)
+#endif
+
+{
+ int c;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+
+ if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
+ /* This was really a NUL. */
+ *yyg->yy_c_buf_p = '\0';
+
+ else
+ { /* need more input */
+ int offset = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr);
+ ++yyg->yy_c_buf_p;
+
+ switch ( yy_get_next_buffer( yyscanner ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ yyrestart( yyin , yyscanner);
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( yywrap( yyscanner ) )
+ return 0;
+
+ if ( ! yyg->yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput(yyscanner);
+#else
+ return input(yyscanner);
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yyg->yy_c_buf_p = yyg->yytext_ptr + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */
+ *yyg->yy_c_buf_p = '\0'; /* preserve yytext */
+ yyg->yy_hold_char = *++yyg->yy_c_buf_p;
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * @param yyscanner The scanner object.
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void yyrestart (FILE * input_file , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if ( ! YY_CURRENT_BUFFER ){
+ yyensure_buffer_stack (yyscanner);
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);
+ }
+
+ yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner);
+ yy_load_buffer_state( yyscanner );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * @param yyscanner The scanner object.
+ */
+ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * yypop_buffer_state();
+ * yypush_buffer_state(new_buffer);
+ */
+ yyensure_buffer_stack (yyscanner);
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ yy_load_buffer_state( yyscanner );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (yywrap()) processing, but the only time this flag
+ * is looked at is after yywrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ yyg->yy_did_buffer_switch_on_eof = 1;
+}
+
+static void yy_load_buffer_state (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ yyg->yy_hold_char = *yyg->yy_c_buf_p;
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * @param yyscanner The scanner object.
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ yy_init_buffer( b, file , yyscanner);
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ * @param yyscanner The scanner object.
+ */
+ void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ yyfree( (void *) b->yy_ch_buf , yyscanner );
+
+ yyfree( (void *) b , yyscanner );
+}
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner)
+
+{
+ int oerrno = errno;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ yy_flush_buffer( b , yyscanner);
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then yy_init_buffer was _probably_
+ * called from yyrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * @param yyscanner The scanner object.
+ */
+ void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ yy_load_buffer_state( yyscanner );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ * @param yyscanner The scanner object.
+ */
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if (new_buffer == NULL)
+ return;
+
+ yyensure_buffer_stack(yyscanner);
+
+ /* This block is copied from yy_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ yyg->yy_buffer_stack_top++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from yy_switch_to_buffer. */
+ yy_load_buffer_state( yyscanner );
+ yyg->yy_did_buffer_switch_on_eof = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ * @param yyscanner The scanner object.
+ */
+void yypop_buffer_state (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ yy_delete_buffer(YY_CURRENT_BUFFER , yyscanner);
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if (yyg->yy_buffer_stack_top > 0)
+ --yyg->yy_buffer_stack_top;
+
+ if (YY_CURRENT_BUFFER) {
+ yy_load_buffer_state( yyscanner );
+ yyg->yy_did_buffer_switch_on_eof = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void yyensure_buffer_stack (yyscan_t yyscanner)
+{
+ yy_size_t num_to_alloc;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (!yyg->yy_buffer_stack) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
+ yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ , yyscanner);
+ if ( ! yyg->yy_buffer_stack )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ yyg->yy_buffer_stack_max = num_to_alloc;
+ yyg->yy_buffer_stack_top = 0;
+ return;
+ }
+
+ if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ yy_size_t grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
+ yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc
+ (yyg->yy_buffer_stack,
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ , yyscanner);
+ if ( ! yyg->yy_buffer_stack )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));
+ yyg->yy_buffer_stack_max = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return NULL;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+ b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = NULL;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ yy_switch_to_buffer( b , yyscanner );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner)
+{
+
+ return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner);
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len , yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = (yy_size_t) (_yybytes_len + 2);
+ buf = (char *) yyalloc( n , yyscanner );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = yy_scan_buffer( buf, n , yyscanner);
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+ fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ yytext[yyleng] = yyg->yy_hold_char; \
+ yyg->yy_c_buf_p = yytext + yyless_macro_arg; \
+ yyg->yy_hold_char = *yyg->yy_c_buf_p; \
+ *yyg->yy_c_buf_p = '\0'; \
+ yyleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the user-defined data for this scanner.
+ * @param yyscanner The scanner object.
+ */
+YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyextra;
+}
+
+/** Get the current line number.
+ * @param yyscanner The scanner object.
+ */
+int yyget_lineno (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (! YY_CURRENT_BUFFER)
+ return 0;
+
+ return yylineno;
+}
+
+/** Get the current column number.
+ * @param yyscanner The scanner object.
+ */
+int yyget_column (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (! YY_CURRENT_BUFFER)
+ return 0;
+
+ return yycolumn;
+}
+
+/** Get the input stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *yyget_in (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyin;
+}
+
+/** Get the output stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *yyget_out (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyout;
+}
+
+/** Get the length of the current token.
+ * @param yyscanner The scanner object.
+ */
+int yyget_leng (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyleng;
+}
+
+/** Get the current token.
+ * @param yyscanner The scanner object.
+ */
+
+char *yyget_text (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yytext;
+}
+
+/** Set the user-defined data. This data is never touched by the scanner.
+ * @param user_defined The data to be associated with this scanner.
+ * @param yyscanner The scanner object.
+ */
+void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyextra = user_defined ;
+}
+
+/** Set the current line number.
+ * @param _line_number line number
+ * @param yyscanner The scanner object.
+ */
+void yyset_lineno (int _line_number , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* lineno is only valid if an input buffer exists. */
+ if (! YY_CURRENT_BUFFER )
+ YY_FATAL_ERROR( "yyset_lineno called with no buffer" );
+
+ yylineno = _line_number;
+}
+
+/** Set the current column.
+ * @param _column_no column number
+ * @param yyscanner The scanner object.
+ */
+void yyset_column (int _column_no , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* column is only valid if an input buffer exists. */
+ if (! YY_CURRENT_BUFFER )
+ YY_FATAL_ERROR( "yyset_column called with no buffer" );
+
+ yycolumn = _column_no;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param _in_str A readable stream.
+ * @param yyscanner The scanner object.
+ * @see yy_switch_to_buffer
+ */
+void yyset_in (FILE * _in_str , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyin = _in_str ;
+}
+
+void yyset_out (FILE * _out_str , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyout = _out_str ;
+}
+
+int yyget_debug (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yy_flex_debug;
+}
+
+void yyset_debug (int _bdebug , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yy_flex_debug = _bdebug ;
+}
+
+/* Accessor methods for yylval and yylloc */
+
+YYSTYPE * yyget_lval (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yylval;
+}
+
+void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yylval = yylval_param;
+}
+
+/* User-visible API */
+
+/* yylex_init is special because it creates the scanner itself, so it is
+ * the ONLY reentrant function that doesn't take the scanner as the last argument.
+ * That's why we explicitly handle the declaration, instead of using our macros.
+ */
+int yylex_init(yyscan_t* ptr_yy_globals)
+{
+ if (ptr_yy_globals == NULL){
+ errno = EINVAL;
+ return 1;
+ }
+
+ *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL );
+
+ if (*ptr_yy_globals == NULL){
+ errno = ENOMEM;
+ return 1;
+ }
+
+ /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */
+ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+
+ return yy_init_globals ( *ptr_yy_globals );
+}
+
+/* yylex_init_extra has the same functionality as yylex_init, but follows the
+ * convention of taking the scanner as the last argument. Note however, that
+ * this is a *pointer* to a scanner, as it will be allocated by this call (and
+ * is the reason, too, why this function also must handle its own declaration).
+ * The user defined value in the first argument will be available to yyalloc in
+ * the yyextra field.
+ */
+int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals )
+{
+ struct yyguts_t dummy_yyguts;
+
+ yyset_extra (yy_user_defined, &dummy_yyguts);
+
+ if (ptr_yy_globals == NULL){
+ errno = EINVAL;
+ return 1;
+ }
+
+ *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
+
+ if (*ptr_yy_globals == NULL){
+ errno = ENOMEM;
+ return 1;
+ }
+
+ /* By setting to 0xAA, we expose bugs in
+ yy_init_globals. Leave at 0x00 for releases. */
+ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+
+ yyset_extra (yy_user_defined, *ptr_yy_globals);
+
+ return yy_init_globals ( *ptr_yy_globals );
+}
+
+static int yy_init_globals (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from yylex_destroy(), so don't allocate here.
+ */
+
+ yyg->yy_buffer_stack = NULL;
+ yyg->yy_buffer_stack_top = 0;
+ yyg->yy_buffer_stack_max = 0;
+ yyg->yy_c_buf_p = NULL;
+ yyg->yy_init = 0;
+ yyg->yy_start = 0;
+
+ yyg->yy_start_stack_ptr = 0;
+ yyg->yy_start_stack_depth = 0;
+ yyg->yy_start_stack = NULL;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ yyin = stdin;
+ yyout = stdout;
+#else
+ yyin = NULL;
+ yyout = NULL;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * yylex_init()
+ */
+ return 0;
+}
+
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ yypop_buffer_state(yyscanner);
+ }
+
+ /* Destroy the stack itself. */
+ yyfree(yyg->yy_buffer_stack , yyscanner);
+ yyg->yy_buffer_stack = NULL;
+
+ /* Destroy the start condition stack. */
+ yyfree( yyg->yy_start_stack , yyscanner );
+ yyg->yy_start_stack = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * yylex() is called, initialization will occur. */
+ yy_init_globals( yyscanner);
+
+ /* Destroy the main struct (reentrant only). */
+ yyfree ( yyscanner , yyscanner );
+ yyscanner = NULL;
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+
+ int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (const char * s , yyscan_t yyscanner)
+{
+ int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *yyalloc (yy_size_t size , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+ return malloc(size);
+}
+
+void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return realloc(ptr, size);
+}
+
+void yyfree (void * ptr , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 473 "psqlscanslash.l"
+
+
+/* LCOV_EXCL_STOP */
+
+/*
+ * Scan the command name of a psql backslash command. This should be called
+ * after psql_scan() returns PSCAN_BACKSLASH. It is assumed that the input
+ * has been consumed through the leading backslash.
+ *
+ * The return value is a malloc'd copy of the command name, as parsed off
+ * from the input.
+ */
+char *
+psql_scan_slash_command(PsqlScanState state)
+{
+ PQExpBufferData mybuf;
+
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ /* Build a local buffer that we'll return the data of */
+ initPQExpBuffer(&mybuf);
+
+ /* Set current output target */
+ state->output_buf = &mybuf;
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /*
+ * Set lexer start state. Note that this is sufficient to switch
+ * state->scanner over to using the tables in this lexer file.
+ */
+ state->start_state = xslashcmd;
+
+ /* And lex. */
+ yylex(NULL, state->scanner);
+
+ /* There are no possible errors in this lex state... */
+
+ /*
+ * In case the caller returns to using the regular SQL lexer, reselect the
+ * appropriate initial state.
+ */
+ psql_scan_reselect_sql_lexer(state);
+
+ return mybuf.data;
+}
+
+/*
+ * Parse off the next argument for a backslash command, and return it as a
+ * malloc'd string. If there are no more arguments, returns NULL.
+ *
+ * type tells what processing, if any, to perform on the option string;
+ * for example, if it's a SQL identifier, we want to downcase any unquoted
+ * letters.
+ *
+ * if quote is not NULL, *quote is set to 0 if no quoting was found, else
+ * the last quote symbol used in the argument.
+ *
+ * if semicolon is true, unquoted trailing semicolon(s) that would otherwise
+ * be taken as part of the option string will be stripped.
+ *
+ * NOTE: the only possible syntax errors for backslash options are unmatched
+ * quotes, which are detected when we run out of input. Therefore, on a
+ * syntax error we just throw away the string and return NULL; there is no
+ * need to worry about flushing remaining input.
+ */
+char *
+psql_scan_slash_option(PsqlScanState state,
+ enum slash_option_type type,
+ char *quote,
+ bool semicolon)
+{
+ PQExpBufferData mybuf;
+ int lexresult PG_USED_FOR_ASSERTS_ONLY;
+ int final_state;
+ char local_quote;
+
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ if (quote == NULL)
+ quote = &local_quote;
+ *quote = 0;
+
+ /* Build a local buffer that we'll return the data of */
+ initPQExpBuffer(&mybuf);
+
+ /* Set up static variables that will be used by yylex */
+ option_type = type;
+ option_quote = quote;
+ unquoted_option_chars = 0;
+
+ /* Set current output target */
+ state->output_buf = &mybuf;
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /* Set lexer start state */
+ if (type == OT_WHOLE_LINE)
+ state->start_state = xslashwholeline;
+ else
+ state->start_state = xslashargstart;
+
+ /* And lex. */
+ lexresult = yylex(NULL, state->scanner);
+
+ /* Save final state for a moment... */
+ final_state = state->start_state;
+
+ /*
+ * In case the caller returns to using the regular SQL lexer, reselect the
+ * appropriate initial state.
+ */
+ psql_scan_reselect_sql_lexer(state);
+
+ /*
+ * Check the lex result: we should have gotten back either LEXRES_OK
+ * or LEXRES_EOL (the latter indicating end of string). If we were inside
+ * a quoted string, as indicated by final_state, EOL is an error.
+ */
+ Assert(lexresult == LEXRES_EOL || lexresult == LEXRES_OK);
+
+ switch (final_state)
+ {
+ case xslashargstart:
+ /* empty arg */
+ break;
+ case xslasharg:
+ /* Strip any unquoted trailing semi-colons if requested */
+ if (semicolon)
+ {
+ while (unquoted_option_chars-- > 0 &&
+ mybuf.len > 0 &&
+ mybuf.data[mybuf.len - 1] == ';')
+ {
+ mybuf.data[--mybuf.len] = '\0';
+ }
+ }
+
+ /*
+ * If SQL identifier processing was requested, then we strip out
+ * excess double quotes and optionally downcase unquoted letters.
+ */
+ if (type == OT_SQLID || type == OT_SQLIDHACK)
+ {
+ dequote_downcase_identifier(mybuf.data,
+ (type != OT_SQLIDHACK),
+ state->encoding);
+ /* update mybuf.len for possible shortening */
+ mybuf.len = strlen(mybuf.data);
+ }
+ break;
+ case xslashquote:
+ case xslashbackquote:
+ case xslashdquote:
+ /* must have hit EOL inside quotes */
+ pg_log_error("unterminated quoted string");
+ termPQExpBuffer(&mybuf);
+ return NULL;
+ case xslashwholeline:
+ /* always okay */
+ break;
+ default:
+ /* can't get here */
+ fprintf(stderr, "invalid YY_START\n");
+ exit(1);
+ }
+
+ /*
+ * An unquoted empty argument isn't possible unless we are at end of
+ * command. Return NULL instead.
+ */
+ if (mybuf.len == 0 && *quote == 0)
+ {
+ termPQExpBuffer(&mybuf);
+ return NULL;
+ }
+
+ /* Else return the completed string. */
+ return mybuf.data;
+}
+
+/*
+ * Eat up any unused \\ to complete a backslash command.
+ */
+void
+psql_scan_slash_command_end(PsqlScanState state)
+{
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ /* Set current output target */
+ state->output_buf = NULL; /* we won't output anything */
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /* Set lexer start state */
+ state->start_state = xslashend;
+
+ /* And lex. */
+ yylex(NULL, state->scanner);
+
+ /* There are no possible errors in this lex state... */
+
+ /*
+ * We expect the caller to return to using the regular SQL lexer, so
+ * reselect the appropriate initial state.
+ */
+ psql_scan_reselect_sql_lexer(state);
+}
+
+/*
+ * Fetch current paren nesting depth
+ */
+int
+psql_scan_get_paren_depth(PsqlScanState state)
+{
+ return state->paren_depth;
+}
+
+/*
+ * Set paren nesting depth
+ */
+void
+psql_scan_set_paren_depth(PsqlScanState state, int depth)
+{
+ Assert(depth >= 0);
+ state->paren_depth = depth;
+}
+
+/*
+ * De-quote and optionally downcase a SQL identifier.
+ *
+ * The string at *str is modified in-place; it can become shorter,
+ * but not longer.
+ *
+ * If downcase is true then non-quoted letters are folded to lower case.
+ * Ideally this behavior will match the backend's downcase_identifier();
+ * but note that it could differ if LC_CTYPE is different in the frontend.
+ *
+ * Note that a string like FOO"BAR"BAZ will be converted to fooBARbaz;
+ * this is somewhat inconsistent with the SQL spec, which would have us
+ * parse it as several identifiers. But for psql's purposes, we want a
+ * string like "foo"."bar" to be treated as one option, so there's little
+ * choice; this routine doesn't get to change the token boundaries.
+ */
+void
+dequote_downcase_identifier(char *str, bool downcase, int encoding)
+{
+ bool inquotes = false;
+ char *cp = str;
+
+ while (*cp)
+ {
+ if (*cp == '"')
+ {
+ if (inquotes && cp[1] == '"')
+ {
+ /* Keep the first quote, remove the second */
+ cp++;
+ }
+ else
+ inquotes = !inquotes;
+ /* Collapse out quote at *cp */
+ memmove(cp, cp + 1, strlen(cp));
+ /* do not advance cp */
+ }
+ else
+ {
+ if (downcase && !inquotes)
+ *cp = pg_tolower((unsigned char) *cp);
+ cp += PQmblenBounded(cp, encoding);
+ }
+ }
+}
+
+/*
+ * Evaluate a backticked substring of a slash command's argument.
+ *
+ * The portion of output_buf starting at backtick_start_offset is evaluated
+ * as a shell command and then replaced by the command's output.
+ */
+static void
+evaluate_backtick(PsqlScanState state)
+{
+ PQExpBuffer output_buf = state->output_buf;
+ char *cmd = output_buf->data + backtick_start_offset;
+ PQExpBufferData cmd_output;
+ FILE *fd;
+ bool error = false;
+ char buf[512];
+ size_t result;
+
+ initPQExpBuffer(&cmd_output);
+
+ fd = popen(cmd, "r");
+ if (!fd)
+ {
+ pg_log_error("%s: %m", cmd);
+ error = true;
+ }
+
+ if (!error)
+ {
+ do
+ {
+ result = fread(buf, 1, sizeof(buf), fd);
+ if (ferror(fd))
+ {
+ pg_log_error("%s: %m", cmd);
+ error = true;
+ break;
+ }
+ appendBinaryPQExpBuffer(&cmd_output, buf, result);
+ } while (!feof(fd));
+ }
+
+ if (fd && pclose(fd) == -1)
+ {
+ pg_log_error("%s: %m", cmd);
+ error = true;
+ }
+
+ if (PQExpBufferDataBroken(cmd_output))
+ {
+ pg_log_error("%s: out of memory", cmd);
+ error = true;
+ }
+
+ /* Now done with cmd, delete it from output_buf */
+ output_buf->len = backtick_start_offset;
+ output_buf->data[output_buf->len] = '\0';
+
+ /* If no error, transfer result to output_buf */
+ if (!error)
+ {
+ /* strip any trailing newline (but only one) */
+ if (cmd_output.len > 0 &&
+ cmd_output.data[cmd_output.len - 1] == '\n')
+ cmd_output.len--;
+ appendBinaryPQExpBuffer(output_buf, cmd_output.data, cmd_output.len);
+ }
+
+ termPQExpBuffer(&cmd_output);
+}
+
diff --git a/src/bin/psql/psqlscanslash.h b/src/bin/psql/psqlscanslash.h
new file mode 100644
index 0000000..95b2c29
--- /dev/null
+++ b/src/bin/psql/psqlscanslash.h
@@ -0,0 +1,40 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/psqlscanslash.h
+ */
+#ifndef PSQLSCANSLASH_H
+#define PSQLSCANSLASH_H
+
+#include "fe_utils/psqlscan.h"
+
+
+/* Different ways for scan_slash_option to handle parameter words */
+enum slash_option_type
+{
+ OT_NORMAL, /* normal case */
+ OT_SQLID, /* treat as SQL identifier */
+ OT_SQLIDHACK, /* SQL identifier, but don't downcase */
+ OT_FILEPIPE, /* it's a filename or pipe */
+ OT_WHOLE_LINE /* just snarf the rest of the line */
+};
+
+
+extern char *psql_scan_slash_command(PsqlScanState state);
+
+extern char *psql_scan_slash_option(PsqlScanState state,
+ enum slash_option_type type,
+ char *quote,
+ bool semicolon);
+
+extern void psql_scan_slash_command_end(PsqlScanState state);
+
+extern int psql_scan_get_paren_depth(PsqlScanState state);
+
+extern void psql_scan_set_paren_depth(PsqlScanState state, int depth);
+
+extern void dequote_downcase_identifier(char *str, bool downcase, int encoding);
+
+#endif /* PSQLSCANSLASH_H */
diff --git a/src/bin/psql/psqlscanslash.l b/src/bin/psql/psqlscanslash.l
new file mode 100644
index 0000000..878da9f
--- /dev/null
+++ b/src/bin/psql/psqlscanslash.l
@@ -0,0 +1,829 @@
+%top{
+/*-------------------------------------------------------------------------
+ *
+ * psqlscanslash.l
+ * lexical scanner for psql backslash commands
+ *
+ * XXX Avoid creating backtracking cases --- see the backend lexer for info.
+ *
+ * See fe_utils/psqlscan_int.h for additional commentary.
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/psql/psqlscanslash.l
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "psqlscanslash.h"
+#include "common/logging.h"
+#include "fe_utils/conditional.h"
+
+#include "libpq-fe.h"
+}
+
+%{
+#include "fe_utils/psqlscan_int.h"
+
+/*
+ * We must have a typedef YYSTYPE for yylex's first argument, but this lexer
+ * doesn't presently make use of that argument, so just declare it as int.
+ */
+typedef int YYSTYPE;
+
+/*
+ * Set the type of yyextra; we use it as a pointer back to the containing
+ * PsqlScanState.
+ */
+#define YY_EXTRA_TYPE PsqlScanState
+
+/*
+ * These variables do not need to be saved across calls. Yeah, it's a bit
+ * of a hack, but putting them into PsqlScanStateData would be klugy too.
+ */
+static enum slash_option_type option_type;
+static char *option_quote;
+static int unquoted_option_chars;
+static int backtick_start_offset;
+
+
+/* Return values from yylex() */
+#define LEXRES_EOL 0 /* end of input */
+#define LEXRES_OK 1 /* OK completion of backslash argument */
+
+
+static void evaluate_backtick(PsqlScanState state);
+
+#define ECHO psqlscan_emit(cur_state, yytext, yyleng)
+
+/*
+ * Work around a bug in flex 2.5.35: it emits a couple of functions that
+ * it forgets to emit declarations for. Since we use -Wmissing-prototypes,
+ * this would cause warnings. Providing our own declarations should be
+ * harmless even when the bug gets fixed.
+ */
+extern int slash_yyget_column(yyscan_t yyscanner);
+extern void slash_yyset_column(int column_no, yyscan_t yyscanner);
+
+/* LCOV_EXCL_START */
+
+%}
+
+/* Except for the prefix, these options should match psqlscan.l */
+%option reentrant
+%option bison-bridge
+%option 8bit
+%option never-interactive
+%option nodefault
+%option noinput
+%option nounput
+%option noyywrap
+%option warn
+%option prefix="slash_yy"
+
+/*
+ * OK, here is a short description of lex/flex rules behavior.
+ * The longest pattern which matches an input string is always chosen.
+ * For equal-length patterns, the first occurring in the rules list is chosen.
+ * INITIAL is the starting state, to which all non-conditional rules apply.
+ * Exclusive states change parsing rules while the state is active. When in
+ * an exclusive state, only those rules defined for that state apply.
+ */
+
+/* Exclusive states for lexing backslash commands */
+%x xslashcmd
+%x xslashargstart
+%x xslasharg
+%x xslashquote
+%x xslashbackquote
+%x xslashdquote
+%x xslashwholeline
+%x xslashend
+
+/*
+ * Assorted character class definitions that should match psqlscan.l.
+ */
+space [ \t\n\r\f]
+quote '
+xeoctesc [\\][0-7]{1,3}
+xehexesc [\\]x[0-9A-Fa-f]{1,2}
+xqdouble {quote}{quote}
+dquote \"
+variable_char [A-Za-z\200-\377_0-9]
+
+other .
+
+%%
+
+%{
+ /* Declare some local variables inside yylex(), for convenience */
+ PsqlScanState cur_state = yyextra;
+ PQExpBuffer output_buf = cur_state->output_buf;
+
+ /*
+ * Force flex into the state indicated by start_state. This has a
+ * couple of purposes: it lets some of the functions below set a new
+ * starting state without ugly direct access to flex variables, and it
+ * allows us to transition from one flex lexer to another so that we
+ * can lex different parts of the source string using separate lexers.
+ */
+ BEGIN(cur_state->start_state);
+%}
+
+ /*
+ * We don't really expect to be invoked in the INITIAL state in this
+ * lexer; but if we are, just spit data to the output_buf until EOF.
+ */
+
+{other}|\n { ECHO; }
+
+ /*
+ * Exclusive lexer states to handle backslash command lexing
+ */
+
+<xslashcmd>{
+ /* command name ends at whitespace or backslash; eat all else */
+
+{space}|"\\" {
+ yyless(0);
+ cur_state->start_state = YY_START;
+ return LEXRES_OK;
+ }
+
+{other} { ECHO; }
+
+}
+
+<xslashargstart>{
+ /*
+ * Discard any whitespace before argument, then go to xslasharg state.
+ * An exception is that "|" is only special at start of argument, so we
+ * check for it here.
+ */
+
+{space}+ { }
+
+"|" {
+ if (option_type == OT_FILEPIPE)
+ {
+ /* treat like whole-string case */
+ ECHO;
+ BEGIN(xslashwholeline);
+ }
+ else
+ {
+ /* vertical bar is not special otherwise */
+ yyless(0);
+ BEGIN(xslasharg);
+ }
+ }
+
+{other} {
+ yyless(0);
+ BEGIN(xslasharg);
+ }
+
+}
+
+<xslasharg>{
+ /*
+ * Default processing of text in a slash command's argument.
+ *
+ * Note: unquoted_option_chars counts the number of characters at the
+ * end of the argument that were not subject to any form of quoting.
+ * psql_scan_slash_option needs this to strip trailing semicolons safely.
+ */
+
+{space}|"\\" {
+ /*
+ * Unquoted space is end of arg; do not eat. Likewise
+ * backslash is end of command or next command, do not eat
+ *
+ * XXX this means we can't conveniently accept options
+ * that include unquoted backslashes; therefore, option
+ * processing that encourages use of backslashes is rather
+ * broken.
+ */
+ yyless(0);
+ cur_state->start_state = YY_START;
+ return LEXRES_OK;
+ }
+
+{quote} {
+ *option_quote = '\'';
+ unquoted_option_chars = 0;
+ BEGIN(xslashquote);
+ }
+
+"`" {
+ backtick_start_offset = output_buf->len;
+ *option_quote = '`';
+ unquoted_option_chars = 0;
+ BEGIN(xslashbackquote);
+ }
+
+{dquote} {
+ ECHO;
+ *option_quote = '"';
+ unquoted_option_chars = 0;
+ BEGIN(xslashdquote);
+ }
+
+:{variable_char}+ {
+ /* Possible psql variable substitution */
+ if (cur_state->callbacks->get_variable == NULL)
+ ECHO;
+ else
+ {
+ char *varname;
+ char *value;
+
+ varname = psqlscan_extract_substring(cur_state,
+ yytext + 1,
+ yyleng - 1);
+ value = cur_state->callbacks->get_variable(varname,
+ PQUOTE_PLAIN,
+ cur_state->cb_passthrough);
+ free(varname);
+
+ /*
+ * The variable value is just emitted without any
+ * further examination. This is consistent with the
+ * pre-8.0 code behavior, if not with the way that
+ * variables are handled outside backslash commands.
+ * Note that we needn't guard against recursion here.
+ */
+ if (value)
+ {
+ appendPQExpBufferStr(output_buf, value);
+ free(value);
+ }
+ else
+ ECHO;
+
+ *option_quote = ':';
+ }
+ unquoted_option_chars = 0;
+ }
+
+:'{variable_char}+' {
+ psqlscan_escape_variable(cur_state, yytext, yyleng,
+ PQUOTE_SQL_LITERAL);
+ *option_quote = ':';
+ unquoted_option_chars = 0;
+ }
+
+
+:\"{variable_char}+\" {
+ psqlscan_escape_variable(cur_state, yytext, yyleng,
+ PQUOTE_SQL_IDENT);
+ *option_quote = ':';
+ unquoted_option_chars = 0;
+ }
+
+:\{\?{variable_char}+\} {
+ psqlscan_test_variable(cur_state, yytext, yyleng);
+ }
+
+:'{variable_char}* {
+ /* Throw back everything but the colon */
+ yyless(1);
+ unquoted_option_chars++;
+ ECHO;
+ }
+
+:\"{variable_char}* {
+ /* Throw back everything but the colon */
+ yyless(1);
+ unquoted_option_chars++;
+ ECHO;
+ }
+
+:\{\?{variable_char}* {
+ /* Throw back everything but the colon */
+ yyless(1);
+ unquoted_option_chars++;
+ ECHO;
+ }
+
+:\{ {
+ /* Throw back everything but the colon */
+ yyless(1);
+ unquoted_option_chars++;
+ ECHO;
+ }
+
+{other} {
+ unquoted_option_chars++;
+ ECHO;
+ }
+
+}
+
+<xslashquote>{
+ /*
+ * single-quoted text: copy literally except for '' and backslash
+ * sequences
+ */
+
+{quote} { BEGIN(xslasharg); }
+
+{xqdouble} { appendPQExpBufferChar(output_buf, '\''); }
+
+"\\n" { appendPQExpBufferChar(output_buf, '\n'); }
+"\\t" { appendPQExpBufferChar(output_buf, '\t'); }
+"\\b" { appendPQExpBufferChar(output_buf, '\b'); }
+"\\r" { appendPQExpBufferChar(output_buf, '\r'); }
+"\\f" { appendPQExpBufferChar(output_buf, '\f'); }
+
+{xeoctesc} {
+ /* octal case */
+ appendPQExpBufferChar(output_buf,
+ (char) strtol(yytext + 1, NULL, 8));
+ }
+
+{xehexesc} {
+ /* hex case */
+ appendPQExpBufferChar(output_buf,
+ (char) strtol(yytext + 2, NULL, 16));
+ }
+
+"\\". { psqlscan_emit(cur_state, yytext + 1, 1); }
+
+{other}|\n { ECHO; }
+
+}
+
+<xslashbackquote>{
+ /*
+ * backticked text: copy everything until next backquote (expanding
+ * variable references, but doing nought else), then evaluate.
+ */
+
+"`" {
+ /* In an inactive \if branch, don't evaluate the command */
+ if (cur_state->cb_passthrough == NULL ||
+ conditional_active((ConditionalStack) cur_state->cb_passthrough))
+ evaluate_backtick(cur_state);
+ BEGIN(xslasharg);
+ }
+
+:{variable_char}+ {
+ /* Possible psql variable substitution */
+ if (cur_state->callbacks->get_variable == NULL)
+ ECHO;
+ else
+ {
+ char *varname;
+ char *value;
+
+ varname = psqlscan_extract_substring(cur_state,
+ yytext + 1,
+ yyleng - 1);
+ value = cur_state->callbacks->get_variable(varname,
+ PQUOTE_PLAIN,
+ cur_state->cb_passthrough);
+ free(varname);
+
+ if (value)
+ {
+ appendPQExpBufferStr(output_buf, value);
+ free(value);
+ }
+ else
+ ECHO;
+ }
+ }
+
+:'{variable_char}+' {
+ psqlscan_escape_variable(cur_state, yytext, yyleng,
+ PQUOTE_SHELL_ARG);
+ }
+
+:'{variable_char}* {
+ /* Throw back everything but the colon */
+ yyless(1);
+ ECHO;
+ }
+
+{other}|\n { ECHO; }
+
+}
+
+<xslashdquote>{
+ /* double-quoted text: copy verbatim, including the double quotes */
+
+{dquote} {
+ ECHO;
+ BEGIN(xslasharg);
+ }
+
+{other}|\n { ECHO; }
+
+}
+
+<xslashwholeline>{
+ /* copy everything until end of input line */
+ /* but suppress leading whitespace */
+
+{space}+ {
+ if (output_buf->len > 0)
+ ECHO;
+ }
+
+{other} { ECHO; }
+
+}
+
+<xslashend>{
+ /* at end of command, eat a double backslash, but not anything else */
+
+"\\\\" {
+ cur_state->start_state = YY_START;
+ return LEXRES_OK;
+ }
+
+{other}|\n {
+ yyless(0);
+ cur_state->start_state = YY_START;
+ return LEXRES_OK;
+ }
+
+}
+
+<<EOF>> {
+ if (cur_state->buffer_stack == NULL)
+ {
+ cur_state->start_state = YY_START;
+ return LEXRES_EOL; /* end of input reached */
+ }
+
+ /*
+ * We were expanding a variable, so pop the inclusion
+ * stack and keep lexing
+ */
+ psqlscan_pop_buffer_stack(cur_state);
+ psqlscan_select_top_buffer(cur_state);
+ }
+
+%%
+
+/* LCOV_EXCL_STOP */
+
+/*
+ * Scan the command name of a psql backslash command. This should be called
+ * after psql_scan() returns PSCAN_BACKSLASH. It is assumed that the input
+ * has been consumed through the leading backslash.
+ *
+ * The return value is a malloc'd copy of the command name, as parsed off
+ * from the input.
+ */
+char *
+psql_scan_slash_command(PsqlScanState state)
+{
+ PQExpBufferData mybuf;
+
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ /* Build a local buffer that we'll return the data of */
+ initPQExpBuffer(&mybuf);
+
+ /* Set current output target */
+ state->output_buf = &mybuf;
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /*
+ * Set lexer start state. Note that this is sufficient to switch
+ * state->scanner over to using the tables in this lexer file.
+ */
+ state->start_state = xslashcmd;
+
+ /* And lex. */
+ yylex(NULL, state->scanner);
+
+ /* There are no possible errors in this lex state... */
+
+ /*
+ * In case the caller returns to using the regular SQL lexer, reselect the
+ * appropriate initial state.
+ */
+ psql_scan_reselect_sql_lexer(state);
+
+ return mybuf.data;
+}
+
+/*
+ * Parse off the next argument for a backslash command, and return it as a
+ * malloc'd string. If there are no more arguments, returns NULL.
+ *
+ * type tells what processing, if any, to perform on the option string;
+ * for example, if it's a SQL identifier, we want to downcase any unquoted
+ * letters.
+ *
+ * if quote is not NULL, *quote is set to 0 if no quoting was found, else
+ * the last quote symbol used in the argument.
+ *
+ * if semicolon is true, unquoted trailing semicolon(s) that would otherwise
+ * be taken as part of the option string will be stripped.
+ *
+ * NOTE: the only possible syntax errors for backslash options are unmatched
+ * quotes, which are detected when we run out of input. Therefore, on a
+ * syntax error we just throw away the string and return NULL; there is no
+ * need to worry about flushing remaining input.
+ */
+char *
+psql_scan_slash_option(PsqlScanState state,
+ enum slash_option_type type,
+ char *quote,
+ bool semicolon)
+{
+ PQExpBufferData mybuf;
+ int lexresult PG_USED_FOR_ASSERTS_ONLY;
+ int final_state;
+ char local_quote;
+
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ if (quote == NULL)
+ quote = &local_quote;
+ *quote = 0;
+
+ /* Build a local buffer that we'll return the data of */
+ initPQExpBuffer(&mybuf);
+
+ /* Set up static variables that will be used by yylex */
+ option_type = type;
+ option_quote = quote;
+ unquoted_option_chars = 0;
+
+ /* Set current output target */
+ state->output_buf = &mybuf;
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /* Set lexer start state */
+ if (type == OT_WHOLE_LINE)
+ state->start_state = xslashwholeline;
+ else
+ state->start_state = xslashargstart;
+
+ /* And lex. */
+ lexresult = yylex(NULL, state->scanner);
+
+ /* Save final state for a moment... */
+ final_state = state->start_state;
+
+ /*
+ * In case the caller returns to using the regular SQL lexer, reselect the
+ * appropriate initial state.
+ */
+ psql_scan_reselect_sql_lexer(state);
+
+ /*
+ * Check the lex result: we should have gotten back either LEXRES_OK
+ * or LEXRES_EOL (the latter indicating end of string). If we were inside
+ * a quoted string, as indicated by final_state, EOL is an error.
+ */
+ Assert(lexresult == LEXRES_EOL || lexresult == LEXRES_OK);
+
+ switch (final_state)
+ {
+ case xslashargstart:
+ /* empty arg */
+ break;
+ case xslasharg:
+ /* Strip any unquoted trailing semi-colons if requested */
+ if (semicolon)
+ {
+ while (unquoted_option_chars-- > 0 &&
+ mybuf.len > 0 &&
+ mybuf.data[mybuf.len - 1] == ';')
+ {
+ mybuf.data[--mybuf.len] = '\0';
+ }
+ }
+
+ /*
+ * If SQL identifier processing was requested, then we strip out
+ * excess double quotes and optionally downcase unquoted letters.
+ */
+ if (type == OT_SQLID || type == OT_SQLIDHACK)
+ {
+ dequote_downcase_identifier(mybuf.data,
+ (type != OT_SQLIDHACK),
+ state->encoding);
+ /* update mybuf.len for possible shortening */
+ mybuf.len = strlen(mybuf.data);
+ }
+ break;
+ case xslashquote:
+ case xslashbackquote:
+ case xslashdquote:
+ /* must have hit EOL inside quotes */
+ pg_log_error("unterminated quoted string");
+ termPQExpBuffer(&mybuf);
+ return NULL;
+ case xslashwholeline:
+ /* always okay */
+ break;
+ default:
+ /* can't get here */
+ fprintf(stderr, "invalid YY_START\n");
+ exit(1);
+ }
+
+ /*
+ * An unquoted empty argument isn't possible unless we are at end of
+ * command. Return NULL instead.
+ */
+ if (mybuf.len == 0 && *quote == 0)
+ {
+ termPQExpBuffer(&mybuf);
+ return NULL;
+ }
+
+ /* Else return the completed string. */
+ return mybuf.data;
+}
+
+/*
+ * Eat up any unused \\ to complete a backslash command.
+ */
+void
+psql_scan_slash_command_end(PsqlScanState state)
+{
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ /* Set current output target */
+ state->output_buf = NULL; /* we won't output anything */
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /* Set lexer start state */
+ state->start_state = xslashend;
+
+ /* And lex. */
+ yylex(NULL, state->scanner);
+
+ /* There are no possible errors in this lex state... */
+
+ /*
+ * We expect the caller to return to using the regular SQL lexer, so
+ * reselect the appropriate initial state.
+ */
+ psql_scan_reselect_sql_lexer(state);
+}
+
+/*
+ * Fetch current paren nesting depth
+ */
+int
+psql_scan_get_paren_depth(PsqlScanState state)
+{
+ return state->paren_depth;
+}
+
+/*
+ * Set paren nesting depth
+ */
+void
+psql_scan_set_paren_depth(PsqlScanState state, int depth)
+{
+ Assert(depth >= 0);
+ state->paren_depth = depth;
+}
+
+/*
+ * De-quote and optionally downcase a SQL identifier.
+ *
+ * The string at *str is modified in-place; it can become shorter,
+ * but not longer.
+ *
+ * If downcase is true then non-quoted letters are folded to lower case.
+ * Ideally this behavior will match the backend's downcase_identifier();
+ * but note that it could differ if LC_CTYPE is different in the frontend.
+ *
+ * Note that a string like FOO"BAR"BAZ will be converted to fooBARbaz;
+ * this is somewhat inconsistent with the SQL spec, which would have us
+ * parse it as several identifiers. But for psql's purposes, we want a
+ * string like "foo"."bar" to be treated as one option, so there's little
+ * choice; this routine doesn't get to change the token boundaries.
+ */
+void
+dequote_downcase_identifier(char *str, bool downcase, int encoding)
+{
+ bool inquotes = false;
+ char *cp = str;
+
+ while (*cp)
+ {
+ if (*cp == '"')
+ {
+ if (inquotes && cp[1] == '"')
+ {
+ /* Keep the first quote, remove the second */
+ cp++;
+ }
+ else
+ inquotes = !inquotes;
+ /* Collapse out quote at *cp */
+ memmove(cp, cp + 1, strlen(cp));
+ /* do not advance cp */
+ }
+ else
+ {
+ if (downcase && !inquotes)
+ *cp = pg_tolower((unsigned char) *cp);
+ cp += PQmblenBounded(cp, encoding);
+ }
+ }
+}
+
+/*
+ * Evaluate a backticked substring of a slash command's argument.
+ *
+ * The portion of output_buf starting at backtick_start_offset is evaluated
+ * as a shell command and then replaced by the command's output.
+ */
+static void
+evaluate_backtick(PsqlScanState state)
+{
+ PQExpBuffer output_buf = state->output_buf;
+ char *cmd = output_buf->data + backtick_start_offset;
+ PQExpBufferData cmd_output;
+ FILE *fd;
+ bool error = false;
+ char buf[512];
+ size_t result;
+
+ initPQExpBuffer(&cmd_output);
+
+ fd = popen(cmd, "r");
+ if (!fd)
+ {
+ pg_log_error("%s: %m", cmd);
+ error = true;
+ }
+
+ if (!error)
+ {
+ do
+ {
+ result = fread(buf, 1, sizeof(buf), fd);
+ if (ferror(fd))
+ {
+ pg_log_error("%s: %m", cmd);
+ error = true;
+ break;
+ }
+ appendBinaryPQExpBuffer(&cmd_output, buf, result);
+ } while (!feof(fd));
+ }
+
+ if (fd && pclose(fd) == -1)
+ {
+ pg_log_error("%s: %m", cmd);
+ error = true;
+ }
+
+ if (PQExpBufferDataBroken(cmd_output))
+ {
+ pg_log_error("%s: out of memory", cmd);
+ error = true;
+ }
+
+ /* Now done with cmd, delete it from output_buf */
+ output_buf->len = backtick_start_offset;
+ output_buf->data[output_buf->len] = '\0';
+
+ /* If no error, transfer result to output_buf */
+ if (!error)
+ {
+ /* strip any trailing newline (but only one) */
+ if (cmd_output.len > 0 &&
+ cmd_output.data[cmd_output.len - 1] == '\n')
+ cmd_output.len--;
+ appendBinaryPQExpBuffer(output_buf, cmd_output.data, cmd_output.len);
+ }
+
+ termPQExpBuffer(&cmd_output);
+}
diff --git a/src/bin/psql/settings.h b/src/bin/psql/settings.h
new file mode 100644
index 0000000..2399cff
--- /dev/null
+++ b/src/bin/psql/settings.h
@@ -0,0 +1,170 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/settings.h
+ */
+#ifndef SETTINGS_H
+#define SETTINGS_H
+
+#include "fe_utils/print.h"
+#include "variables.h"
+
+#define DEFAULT_CSV_FIELD_SEP ','
+#define DEFAULT_FIELD_SEP "|"
+#define DEFAULT_RECORD_SEP "\n"
+
+#if defined(WIN32) || defined(__CYGWIN__)
+#define DEFAULT_EDITOR "notepad.exe"
+/* no DEFAULT_EDITOR_LINENUMBER_ARG for Notepad */
+#else
+#define DEFAULT_EDITOR "vi"
+#define DEFAULT_EDITOR_LINENUMBER_ARG "+"
+#endif
+
+#define DEFAULT_PROMPT1 "%/%R%x%# "
+#define DEFAULT_PROMPT2 "%/%R%x%# "
+#define DEFAULT_PROMPT3 ">> "
+
+/*
+ * Note: these enums should generally be chosen so that zero corresponds
+ * to the default behavior.
+ */
+
+typedef enum
+{
+ PSQL_ECHO_NONE,
+ PSQL_ECHO_QUERIES,
+ PSQL_ECHO_ERRORS,
+ PSQL_ECHO_ALL
+} PSQL_ECHO;
+
+typedef enum
+{
+ PSQL_ECHO_HIDDEN_OFF,
+ PSQL_ECHO_HIDDEN_ON,
+ PSQL_ECHO_HIDDEN_NOEXEC
+} PSQL_ECHO_HIDDEN;
+
+typedef enum
+{
+ PSQL_ERROR_ROLLBACK_OFF,
+ PSQL_ERROR_ROLLBACK_INTERACTIVE,
+ PSQL_ERROR_ROLLBACK_ON
+} PSQL_ERROR_ROLLBACK;
+
+typedef enum
+{
+ PSQL_COMP_CASE_PRESERVE_UPPER,
+ PSQL_COMP_CASE_PRESERVE_LOWER,
+ PSQL_COMP_CASE_UPPER,
+ PSQL_COMP_CASE_LOWER
+} PSQL_COMP_CASE;
+
+typedef enum
+{
+ hctl_none = 0,
+ hctl_ignorespace = 1,
+ hctl_ignoredups = 2,
+ hctl_ignoreboth = hctl_ignorespace | hctl_ignoredups
+} HistControl;
+
+enum trivalue
+{
+ TRI_DEFAULT,
+ TRI_NO,
+ TRI_YES
+};
+
+typedef struct _psqlSettings
+{
+ PGconn *db; /* connection to backend */
+ int encoding; /* client_encoding */
+ FILE *queryFout; /* where to send the query results */
+ bool queryFoutPipe; /* queryFout is from a popen() */
+
+ FILE *copyStream; /* Stream to read/write for \copy command */
+
+ PGresult *last_error_result; /* most recent error result, if any */
+
+ printQueryOpt popt; /* The active print format settings */
+
+ char *gfname; /* one-shot file output argument for \g */
+ printQueryOpt *gsavepopt; /* if not null, saved print format settings */
+
+ char *gset_prefix; /* one-shot prefix argument for \gset */
+ bool gdesc_flag; /* one-shot request to describe query result */
+ bool gexec_flag; /* one-shot request to execute query result */
+ bool crosstab_flag; /* one-shot request to crosstab result */
+ char *ctv_args[4]; /* \crosstabview arguments */
+
+ bool notty; /* stdin or stdout is not a tty (as determined
+ * on startup) */
+ enum trivalue getPassword; /* prompt the user for a username and password */
+ FILE *cur_cmd_source; /* describe the status of the current main
+ * loop */
+ bool cur_cmd_interactive;
+ int sversion; /* backend server version */
+ const char *progname; /* in case you renamed psql */
+ char *inputfile; /* file being currently processed, if any */
+ uint64 lineno; /* also for error reporting */
+ uint64 stmt_lineno; /* line number inside the current statement */
+
+ bool timing; /* enable timing of all queries */
+
+ FILE *logfile; /* session log file handle */
+
+ VariableSpace vars; /* "shell variable" repository */
+
+ /*
+ * If we get a connection failure, the now-unusable PGconn is stashed here
+ * until we can successfully reconnect. Never attempt to do anything with
+ * this PGconn except extract parameters for a \connect attempt.
+ */
+ PGconn *dead_conn; /* previous connection to backend */
+
+ /*
+ * The remaining fields are set by assign hooks associated with entries in
+ * "vars". They should not be set directly except by those hook
+ * functions.
+ */
+ bool autocommit;
+ bool on_error_stop;
+ bool quiet;
+ bool singleline;
+ bool singlestep;
+ bool hide_compression;
+ bool hide_tableam;
+ int fetch_count;
+ int histsize;
+ int ignoreeof;
+ PSQL_ECHO echo;
+ PSQL_ECHO_HIDDEN echo_hidden;
+ PSQL_ERROR_ROLLBACK on_error_rollback;
+ PSQL_COMP_CASE comp_case;
+ HistControl histcontrol;
+ const char *prompt1;
+ const char *prompt2;
+ const char *prompt3;
+ PGVerbosity verbosity; /* current error verbosity level */
+ bool show_all_results;
+ PGContextVisibility show_context; /* current context display level */
+} PsqlSettings;
+
+extern PsqlSettings pset;
+
+
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#endif
+
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+
+#define EXIT_BADCONN 2
+
+#define EXIT_USER 3
+
+#endif
diff --git a/src/bin/psql/sql_help.c b/src/bin/psql/sql_help.c
new file mode 100644
index 0000000..4c5e883
--- /dev/null
+++ b/src/bin/psql/sql_help.c
@@ -0,0 +1,6238 @@
+/*
+ * *** Do not change this file by hand. It is automatically
+ * *** generated from the DocBook documentation.
+ *
+ * generated by src/bin/psql/create_help.pl
+ *
+ */
+
+#define N_(x) (x) /* gettext noop */
+
+#include "postgres_fe.h"
+#include "sql_help.h"
+
+static void
+sql_help_ABORT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ABORT [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]");
+}
+
+static void
+sql_help_ALTER_AGGREGATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER AGGREGATE %s ( %s ) RENAME TO %s\n"
+ "ALTER AGGREGATE %s ( %s )\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER AGGREGATE %s ( %s ) SET SCHEMA %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "* |\n"
+ "[ %s ] [ %s ] %s [ , ... ] |\n"
+ "[ [ %s ] [ %s ] %s [ , ... ] ] ORDER BY [ %s ] [ %s ] %s [ , ... ]",
+ _("name"),
+ _("aggregate_signature"),
+ _("new_name"),
+ _("name"),
+ _("aggregate_signature"),
+ _("new_owner"),
+ _("name"),
+ _("aggregate_signature"),
+ _("new_schema"),
+ _("where aggregate_signature is:"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"));
+}
+
+static void
+sql_help_ALTER_COLLATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER COLLATION %s REFRESH VERSION\n"
+ "\n"
+ "ALTER COLLATION %s RENAME TO %s\n"
+ "ALTER COLLATION %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER COLLATION %s SET SCHEMA %s",
+ _("name"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_CONVERSION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER CONVERSION %s RENAME TO %s\n"
+ "ALTER CONVERSION %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER CONVERSION %s SET SCHEMA %s",
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_DATABASE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER DATABASE %s [ [ WITH ] %s [ ... ] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ALLOW_CONNECTIONS %s\n"
+ " CONNECTION LIMIT %s\n"
+ " IS_TEMPLATE %s\n"
+ "\n"
+ "ALTER DATABASE %s RENAME TO %s\n"
+ "\n"
+ "ALTER DATABASE %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "\n"
+ "ALTER DATABASE %s SET TABLESPACE %s\n"
+ "\n"
+ "ALTER DATABASE %s REFRESH COLLATION VERSION\n"
+ "\n"
+ "ALTER DATABASE %s SET %s { TO | = } { %s | DEFAULT }\n"
+ "ALTER DATABASE %s SET %s FROM CURRENT\n"
+ "ALTER DATABASE %s RESET %s\n"
+ "ALTER DATABASE %s RESET ALL",
+ _("name"),
+ _("option"),
+ _("where option can be:"),
+ _("allowconn"),
+ _("connlimit"),
+ _("istemplate"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_tablespace"),
+ _("name"),
+ _("name"),
+ _("configuration_parameter"),
+ _("value"),
+ _("name"),
+ _("configuration_parameter"),
+ _("name"),
+ _("configuration_parameter"),
+ _("name"));
+}
+
+static void
+sql_help_ALTER_DEFAULT_PRIVILEGES(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER DEFAULT PRIVILEGES\n"
+ " [ FOR { ROLE | USER } %s [, ...] ]\n"
+ " [ IN SCHEMA %s [, ...] ]\n"
+ " %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }\n"
+ " [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON TABLES\n"
+ " TO { [ GROUP ] %s | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+ "\n"
+ "GRANT { { USAGE | SELECT | UPDATE }\n"
+ " [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON SEQUENCES\n"
+ " TO { [ GROUP ] %s | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+ "\n"
+ "GRANT { EXECUTE | ALL [ PRIVILEGES ] }\n"
+ " ON { FUNCTIONS | ROUTINES }\n"
+ " TO { [ GROUP ] %s | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+ "\n"
+ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON TYPES\n"
+ " TO { [ GROUP ] %s | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+ "\n"
+ "GRANT { USAGE | CREATE | ALL [ PRIVILEGES ] }\n"
+ " ON SCHEMAS\n"
+ " TO { [ GROUP ] %s | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }\n"
+ " [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON TABLES\n"
+ " FROM { [ GROUP ] %s | PUBLIC } [, ...]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { USAGE | SELECT | UPDATE }\n"
+ " [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON SEQUENCES\n"
+ " FROM { [ GROUP ] %s | PUBLIC } [, ...]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { EXECUTE | ALL [ PRIVILEGES ] }\n"
+ " ON { FUNCTIONS | ROUTINES }\n"
+ " FROM { [ GROUP ] %s | PUBLIC } [, ...]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON TYPES\n"
+ " FROM { [ GROUP ] %s | PUBLIC } [, ...]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { USAGE | CREATE | ALL [ PRIVILEGES ] }\n"
+ " ON SCHEMAS\n"
+ " FROM { [ GROUP ] %s | PUBLIC } [, ...]\n"
+ " [ CASCADE | RESTRICT ]",
+ _("target_role"),
+ _("schema_name"),
+ _("abbreviated_grant_or_revoke"),
+ _("where abbreviated_grant_or_revoke is one of:"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"));
+}
+
+static void
+sql_help_ALTER_DOMAIN(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER DOMAIN %s\n"
+ " { SET DEFAULT %s | DROP DEFAULT }\n"
+ "ALTER DOMAIN %s\n"
+ " { SET | DROP } NOT NULL\n"
+ "ALTER DOMAIN %s\n"
+ " ADD %s [ NOT VALID ]\n"
+ "ALTER DOMAIN %s\n"
+ " DROP CONSTRAINT [ IF EXISTS ] %s [ RESTRICT | CASCADE ]\n"
+ "ALTER DOMAIN %s\n"
+ " RENAME CONSTRAINT %s TO %s\n"
+ "ALTER DOMAIN %s\n"
+ " VALIDATE CONSTRAINT %s\n"
+ "ALTER DOMAIN %s\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER DOMAIN %s\n"
+ " RENAME TO %s\n"
+ "ALTER DOMAIN %s\n"
+ " SET SCHEMA %s",
+ _("name"),
+ _("expression"),
+ _("name"),
+ _("name"),
+ _("domain_constraint"),
+ _("name"),
+ _("constraint_name"),
+ _("name"),
+ _("constraint_name"),
+ _("new_constraint_name"),
+ _("name"),
+ _("constraint_name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_EVENT_TRIGGER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER EVENT TRIGGER %s DISABLE\n"
+ "ALTER EVENT TRIGGER %s ENABLE [ REPLICA | ALWAYS ]\n"
+ "ALTER EVENT TRIGGER %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER EVENT TRIGGER %s RENAME TO %s",
+ _("name"),
+ _("name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"));
+}
+
+static void
+sql_help_ALTER_EXTENSION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER EXTENSION %s UPDATE [ TO %s ]\n"
+ "ALTER EXTENSION %s SET SCHEMA %s\n"
+ "ALTER EXTENSION %s ADD %s\n"
+ "ALTER EXTENSION %s DROP %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ACCESS METHOD %s |\n"
+ " AGGREGATE %s ( %s ) |\n"
+ " CAST (%s AS %s) |\n"
+ " COLLATION %s |\n"
+ " CONVERSION %s |\n"
+ " DOMAIN %s |\n"
+ " EVENT TRIGGER %s |\n"
+ " FOREIGN DATA WRAPPER %s |\n"
+ " FOREIGN TABLE %s |\n"
+ " FUNCTION %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " MATERIALIZED VIEW %s |\n"
+ " OPERATOR %s (%s, %s) |\n"
+ " OPERATOR CLASS %s USING %s |\n"
+ " OPERATOR FAMILY %s USING %s |\n"
+ " [ PROCEDURAL ] LANGUAGE %s |\n"
+ " PROCEDURE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " ROUTINE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " SCHEMA %s |\n"
+ " SEQUENCE %s |\n"
+ " SERVER %s |\n"
+ " TABLE %s |\n"
+ " TEXT SEARCH CONFIGURATION %s |\n"
+ " TEXT SEARCH DICTIONARY %s |\n"
+ " TEXT SEARCH PARSER %s |\n"
+ " TEXT SEARCH TEMPLATE %s |\n"
+ " TRANSFORM FOR %s LANGUAGE %s |\n"
+ " TYPE %s |\n"
+ " VIEW %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "* |\n"
+ "[ %s ] [ %s ] %s [ , ... ] |\n"
+ "[ [ %s ] [ %s ] %s [ , ... ] ] ORDER BY [ %s ] [ %s ] %s [ , ... ]",
+ _("name"),
+ _("new_version"),
+ _("name"),
+ _("new_schema"),
+ _("name"),
+ _("member_object"),
+ _("name"),
+ _("member_object"),
+ _("where member_object is:"),
+ _("object_name"),
+ _("aggregate_name"),
+ _("aggregate_signature"),
+ _("source_type"),
+ _("target_type"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("function_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("object_name"),
+ _("operator_name"),
+ _("left_type"),
+ _("right_type"),
+ _("object_name"),
+ _("index_method"),
+ _("object_name"),
+ _("index_method"),
+ _("object_name"),
+ _("procedure_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("routine_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("type_name"),
+ _("lang_name"),
+ _("object_name"),
+ _("object_name"),
+ _("and aggregate_signature is:"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"));
+}
+
+static void
+sql_help_ALTER_FOREIGN_DATA_WRAPPER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER FOREIGN DATA WRAPPER %s\n"
+ " [ HANDLER %s | NO HANDLER ]\n"
+ " [ VALIDATOR %s | NO VALIDATOR ]\n"
+ " [ OPTIONS ( [ ADD | SET | DROP ] %s ['%s'] [, ... ]) ]\n"
+ "ALTER FOREIGN DATA WRAPPER %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER FOREIGN DATA WRAPPER %s RENAME TO %s",
+ _("name"),
+ _("handler_function"),
+ _("validator_function"),
+ _("option"),
+ _("value"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"));
+}
+
+static void
+sql_help_ALTER_FOREIGN_TABLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ] %s [ * ]\n"
+ " %s [, ... ]\n"
+ "ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ] %s [ * ]\n"
+ " RENAME [ COLUMN ] %s TO %s\n"
+ "ALTER FOREIGN TABLE [ IF EXISTS ] %s\n"
+ " RENAME TO %s\n"
+ "ALTER FOREIGN TABLE [ IF EXISTS ] %s\n"
+ " SET SCHEMA %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ADD [ COLUMN ] %s %s [ COLLATE %s ] [ %s [ ... ] ]\n"
+ " DROP [ COLUMN ] [ IF EXISTS ] %s [ RESTRICT | CASCADE ]\n"
+ " ALTER [ COLUMN ] %s [ SET DATA ] TYPE %s [ COLLATE %s ]\n"
+ " ALTER [ COLUMN ] %s SET DEFAULT %s\n"
+ " ALTER [ COLUMN ] %s DROP DEFAULT\n"
+ " ALTER [ COLUMN ] %s { SET | DROP } NOT NULL\n"
+ " ALTER [ COLUMN ] %s SET STATISTICS %s\n"
+ " ALTER [ COLUMN ] %s SET ( %s = %s [, ... ] )\n"
+ " ALTER [ COLUMN ] %s RESET ( %s [, ... ] )\n"
+ " ALTER [ COLUMN ] %s SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }\n"
+ " ALTER [ COLUMN ] %s OPTIONS ( [ ADD | SET | DROP ] %s ['%s'] [, ... ])\n"
+ " ADD %s [ NOT VALID ]\n"
+ " VALIDATE CONSTRAINT %s\n"
+ " DROP CONSTRAINT [ IF EXISTS ] %s [ RESTRICT | CASCADE ]\n"
+ " DISABLE TRIGGER [ %s | ALL | USER ]\n"
+ " ENABLE TRIGGER [ %s | ALL | USER ]\n"
+ " ENABLE REPLICA TRIGGER %s\n"
+ " ENABLE ALWAYS TRIGGER %s\n"
+ " SET WITHOUT OIDS\n"
+ " INHERIT %s\n"
+ " NO INHERIT %s\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ " OPTIONS ( [ ADD | SET | DROP ] %s ['%s'] [, ... ])",
+ _("name"),
+ _("action"),
+ _("name"),
+ _("column_name"),
+ _("new_column_name"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"),
+ _("where action is one of:"),
+ _("column_name"),
+ _("data_type"),
+ _("collation"),
+ _("column_constraint"),
+ _("column_name"),
+ _("column_name"),
+ _("data_type"),
+ _("collation"),
+ _("column_name"),
+ _("expression"),
+ _("column_name"),
+ _("column_name"),
+ _("column_name"),
+ _("integer"),
+ _("column_name"),
+ _("attribute_option"),
+ _("value"),
+ _("column_name"),
+ _("attribute_option"),
+ _("column_name"),
+ _("column_name"),
+ _("option"),
+ _("value"),
+ _("table_constraint"),
+ _("constraint_name"),
+ _("constraint_name"),
+ _("trigger_name"),
+ _("trigger_name"),
+ _("trigger_name"),
+ _("trigger_name"),
+ _("parent_table"),
+ _("parent_table"),
+ _("new_owner"),
+ _("option"),
+ _("value"));
+}
+
+static void
+sql_help_ALTER_FUNCTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER FUNCTION %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " %s [ ... ] [ RESTRICT ]\n"
+ "ALTER FUNCTION %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " RENAME TO %s\n"
+ "ALTER FUNCTION %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER FUNCTION %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " SET SCHEMA %s\n"
+ "ALTER FUNCTION %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " [ NO ] DEPENDS ON EXTENSION %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT\n"
+ " IMMUTABLE | STABLE | VOLATILE\n"
+ " [ NOT ] LEAKPROOF\n"
+ " [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n"
+ " PARALLEL { UNSAFE | RESTRICTED | SAFE }\n"
+ " COST %s\n"
+ " ROWS %s\n"
+ " SUPPORT %s\n"
+ " SET %s { TO | = } { %s | DEFAULT }\n"
+ " SET %s FROM CURRENT\n"
+ " RESET %s\n"
+ " RESET ALL",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("action"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_name"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_owner"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_schema"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("extension_name"),
+ _("where action is one of:"),
+ _("execution_cost"),
+ _("result_rows"),
+ _("support_function"),
+ _("configuration_parameter"),
+ _("value"),
+ _("configuration_parameter"),
+ _("configuration_parameter"));
+}
+
+static void
+sql_help_ALTER_GROUP(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER GROUP %s ADD USER %s [, ... ]\n"
+ "ALTER GROUP %s DROP USER %s [, ... ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s\n"
+ " | CURRENT_ROLE\n"
+ " | CURRENT_USER\n"
+ " | SESSION_USER\n"
+ "\n"
+ "ALTER GROUP %s RENAME TO %s",
+ _("role_specification"),
+ _("user_name"),
+ _("role_specification"),
+ _("user_name"),
+ _("where role_specification can be:"),
+ _("role_name"),
+ _("group_name"),
+ _("new_name"));
+}
+
+static void
+sql_help_ALTER_INDEX(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER INDEX [ IF EXISTS ] %s RENAME TO %s\n"
+ "ALTER INDEX [ IF EXISTS ] %s SET TABLESPACE %s\n"
+ "ALTER INDEX %s ATTACH PARTITION %s\n"
+ "ALTER INDEX %s [ NO ] DEPENDS ON EXTENSION %s\n"
+ "ALTER INDEX [ IF EXISTS ] %s SET ( %s [= %s] [, ... ] )\n"
+ "ALTER INDEX [ IF EXISTS ] %s RESET ( %s [, ... ] )\n"
+ "ALTER INDEX [ IF EXISTS ] %s ALTER [ COLUMN ] %s\n"
+ " SET STATISTICS %s\n"
+ "ALTER INDEX ALL IN TABLESPACE %s [ OWNED BY %s [, ... ] ]\n"
+ " SET TABLESPACE %s [ NOWAIT ]",
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("tablespace_name"),
+ _("name"),
+ _("index_name"),
+ _("name"),
+ _("extension_name"),
+ _("name"),
+ _("storage_parameter"),
+ _("value"),
+ _("name"),
+ _("storage_parameter"),
+ _("name"),
+ _("column_number"),
+ _("integer"),
+ _("name"),
+ _("role_name"),
+ _("new_tablespace"));
+}
+
+static void
+sql_help_ALTER_LANGUAGE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER [ PROCEDURAL ] LANGUAGE %s RENAME TO %s\n"
+ "ALTER [ PROCEDURAL ] LANGUAGE %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }",
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_owner"));
+}
+
+static void
+sql_help_ALTER_LARGE_OBJECT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER LARGE OBJECT %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }",
+ _("large_object_oid"),
+ _("new_owner"));
+}
+
+static void
+sql_help_ALTER_MATERIALIZED_VIEW(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER MATERIALIZED VIEW [ IF EXISTS ] %s\n"
+ " %s [, ... ]\n"
+ "ALTER MATERIALIZED VIEW %s\n"
+ " [ NO ] DEPENDS ON EXTENSION %s\n"
+ "ALTER MATERIALIZED VIEW [ IF EXISTS ] %s\n"
+ " RENAME [ COLUMN ] %s TO %s\n"
+ "ALTER MATERIALIZED VIEW [ IF EXISTS ] %s\n"
+ " RENAME TO %s\n"
+ "ALTER MATERIALIZED VIEW [ IF EXISTS ] %s\n"
+ " SET SCHEMA %s\n"
+ "ALTER MATERIALIZED VIEW ALL IN TABLESPACE %s [ OWNED BY %s [, ... ] ]\n"
+ " SET TABLESPACE %s [ NOWAIT ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ALTER [ COLUMN ] %s SET STATISTICS %s\n"
+ " ALTER [ COLUMN ] %s SET ( %s = %s [, ... ] )\n"
+ " ALTER [ COLUMN ] %s RESET ( %s [, ... ] )\n"
+ " ALTER [ COLUMN ] %s SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }\n"
+ " ALTER [ COLUMN ] %s SET COMPRESSION %s\n"
+ " CLUSTER ON %s\n"
+ " SET WITHOUT CLUSTER\n"
+ " SET ACCESS METHOD %s\n"
+ " SET TABLESPACE %s\n"
+ " SET ( %s [= %s] [, ... ] )\n"
+ " RESET ( %s [, ... ] )\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }",
+ _("name"),
+ _("action"),
+ _("name"),
+ _("extension_name"),
+ _("name"),
+ _("column_name"),
+ _("new_column_name"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"),
+ _("name"),
+ _("role_name"),
+ _("new_tablespace"),
+ _("where action is one of:"),
+ _("column_name"),
+ _("integer"),
+ _("column_name"),
+ _("attribute_option"),
+ _("value"),
+ _("column_name"),
+ _("attribute_option"),
+ _("column_name"),
+ _("column_name"),
+ _("compression_method"),
+ _("index_name"),
+ _("new_access_method"),
+ _("new_tablespace"),
+ _("storage_parameter"),
+ _("value"),
+ _("storage_parameter"),
+ _("new_owner"));
+}
+
+static void
+sql_help_ALTER_OPERATOR(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER OPERATOR %s ( { %s | NONE } , %s )\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "\n"
+ "ALTER OPERATOR %s ( { %s | NONE } , %s )\n"
+ " SET SCHEMA %s\n"
+ "\n"
+ "ALTER OPERATOR %s ( { %s | NONE } , %s )\n"
+ " SET ( { RESTRICT = { %s | NONE }\n"
+ " | JOIN = { %s | NONE }\n"
+ " } [, ... ] )",
+ _("name"),
+ _("left_type"),
+ _("right_type"),
+ _("new_owner"),
+ _("name"),
+ _("left_type"),
+ _("right_type"),
+ _("new_schema"),
+ _("name"),
+ _("left_type"),
+ _("right_type"),
+ _("res_proc"),
+ _("join_proc"));
+}
+
+static void
+sql_help_ALTER_OPERATOR_CLASS(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER OPERATOR CLASS %s USING %s\n"
+ " RENAME TO %s\n"
+ "\n"
+ "ALTER OPERATOR CLASS %s USING %s\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "\n"
+ "ALTER OPERATOR CLASS %s USING %s\n"
+ " SET SCHEMA %s",
+ _("name"),
+ _("index_method"),
+ _("new_name"),
+ _("name"),
+ _("index_method"),
+ _("new_owner"),
+ _("name"),
+ _("index_method"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_OPERATOR_FAMILY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER OPERATOR FAMILY %s USING %s ADD\n"
+ " { OPERATOR %s %s ( %s, %s )\n"
+ " [ FOR SEARCH | FOR ORDER BY %s ]\n"
+ " | FUNCTION %s [ ( %s [ , %s ] ) ]\n"
+ " %s [ ( %s [, ...] ) ]\n"
+ " } [, ... ]\n"
+ "\n"
+ "ALTER OPERATOR FAMILY %s USING %s DROP\n"
+ " { OPERATOR %s ( %s [ , %s ] )\n"
+ " | FUNCTION %s ( %s [ , %s ] )\n"
+ " } [, ... ]\n"
+ "\n"
+ "ALTER OPERATOR FAMILY %s USING %s\n"
+ " RENAME TO %s\n"
+ "\n"
+ "ALTER OPERATOR FAMILY %s USING %s\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "\n"
+ "ALTER OPERATOR FAMILY %s USING %s\n"
+ " SET SCHEMA %s",
+ _("name"),
+ _("index_method"),
+ _("strategy_number"),
+ _("operator_name"),
+ _("op_type"),
+ _("op_type"),
+ _("sort_family_name"),
+ _("support_number"),
+ _("op_type"),
+ _("op_type"),
+ _("function_name"),
+ _("argument_type"),
+ _("name"),
+ _("index_method"),
+ _("strategy_number"),
+ _("op_type"),
+ _("op_type"),
+ _("support_number"),
+ _("op_type"),
+ _("op_type"),
+ _("name"),
+ _("index_method"),
+ _("new_name"),
+ _("name"),
+ _("index_method"),
+ _("new_owner"),
+ _("name"),
+ _("index_method"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_POLICY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER POLICY %s ON %s RENAME TO %s\n"
+ "\n"
+ "ALTER POLICY %s ON %s\n"
+ " [ TO { %s | PUBLIC | CURRENT_ROLE | CURRENT_USER | SESSION_USER } [, ...] ]\n"
+ " [ USING ( %s ) ]\n"
+ " [ WITH CHECK ( %s ) ]",
+ _("name"),
+ _("table_name"),
+ _("new_name"),
+ _("name"),
+ _("table_name"),
+ _("role_name"),
+ _("using_expression"),
+ _("check_expression"));
+}
+
+static void
+sql_help_ALTER_PROCEDURE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER PROCEDURE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " %s [ ... ] [ RESTRICT ]\n"
+ "ALTER PROCEDURE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " RENAME TO %s\n"
+ "ALTER PROCEDURE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER PROCEDURE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " SET SCHEMA %s\n"
+ "ALTER PROCEDURE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " [ NO ] DEPENDS ON EXTENSION %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n"
+ " SET %s { TO | = } { %s | DEFAULT }\n"
+ " SET %s FROM CURRENT\n"
+ " RESET %s\n"
+ " RESET ALL",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("action"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_name"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_owner"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_schema"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("extension_name"),
+ _("where action is one of:"),
+ _("configuration_parameter"),
+ _("value"),
+ _("configuration_parameter"),
+ _("configuration_parameter"));
+}
+
+static void
+sql_help_ALTER_PUBLICATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER PUBLICATION %s ADD %s [, ...]\n"
+ "ALTER PUBLICATION %s SET %s [, ...]\n"
+ "ALTER PUBLICATION %s DROP %s [, ...]\n"
+ "ALTER PUBLICATION %s SET ( %s [= %s] [, ... ] )\n"
+ "ALTER PUBLICATION %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER PUBLICATION %s RENAME TO %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " TABLE [ ONLY ] %s [ * ] [ ( %s [, ... ] ) ] [ WHERE ( %s ) ] [, ... ]\n"
+ " TABLES IN SCHEMA { %s | CURRENT_SCHEMA } [, ... ]",
+ _("name"),
+ _("publication_object"),
+ _("name"),
+ _("publication_object"),
+ _("name"),
+ _("publication_object"),
+ _("name"),
+ _("publication_parameter"),
+ _("value"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"),
+ _("where publication_object is one of:"),
+ _("table_name"),
+ _("column_name"),
+ _("expression"),
+ _("schema_name"));
+}
+
+static void
+sql_help_ALTER_ROLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER ROLE %s [ WITH ] %s [ ... ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " SUPERUSER | NOSUPERUSER\n"
+ " | CREATEDB | NOCREATEDB\n"
+ " | CREATEROLE | NOCREATEROLE\n"
+ " | INHERIT | NOINHERIT\n"
+ " | LOGIN | NOLOGIN\n"
+ " | REPLICATION | NOREPLICATION\n"
+ " | BYPASSRLS | NOBYPASSRLS\n"
+ " | CONNECTION LIMIT %s\n"
+ " | [ ENCRYPTED ] PASSWORD '%s' | PASSWORD NULL\n"
+ " | VALID UNTIL '%s'\n"
+ "\n"
+ "ALTER ROLE %s RENAME TO %s\n"
+ "\n"
+ "ALTER ROLE { %s | ALL } [ IN DATABASE %s ] SET %s { TO | = } { %s | DEFAULT }\n"
+ "ALTER ROLE { %s | ALL } [ IN DATABASE %s ] SET %s FROM CURRENT\n"
+ "ALTER ROLE { %s | ALL } [ IN DATABASE %s ] RESET %s\n"
+ "ALTER ROLE { %s | ALL } [ IN DATABASE %s ] RESET ALL\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s\n"
+ " | CURRENT_ROLE\n"
+ " | CURRENT_USER\n"
+ " | SESSION_USER",
+ _("role_specification"),
+ _("option"),
+ _("where option can be:"),
+ _("connlimit"),
+ _("password"),
+ _("timestamp"),
+ _("name"),
+ _("new_name"),
+ _("role_specification"),
+ _("database_name"),
+ _("configuration_parameter"),
+ _("value"),
+ _("role_specification"),
+ _("database_name"),
+ _("configuration_parameter"),
+ _("role_specification"),
+ _("database_name"),
+ _("configuration_parameter"),
+ _("role_specification"),
+ _("database_name"),
+ _("where role_specification can be:"),
+ _("role_name"));
+}
+
+static void
+sql_help_ALTER_ROUTINE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER ROUTINE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " %s [ ... ] [ RESTRICT ]\n"
+ "ALTER ROUTINE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " RENAME TO %s\n"
+ "ALTER ROUTINE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER ROUTINE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " SET SCHEMA %s\n"
+ "ALTER ROUTINE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " [ NO ] DEPENDS ON EXTENSION %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " IMMUTABLE | STABLE | VOLATILE\n"
+ " [ NOT ] LEAKPROOF\n"
+ " [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n"
+ " PARALLEL { UNSAFE | RESTRICTED | SAFE }\n"
+ " COST %s\n"
+ " ROWS %s\n"
+ " SET %s { TO | = } { %s | DEFAULT }\n"
+ " SET %s FROM CURRENT\n"
+ " RESET %s\n"
+ " RESET ALL",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("action"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_name"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_owner"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_schema"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("extension_name"),
+ _("where action is one of:"),
+ _("execution_cost"),
+ _("result_rows"),
+ _("configuration_parameter"),
+ _("value"),
+ _("configuration_parameter"),
+ _("configuration_parameter"));
+}
+
+static void
+sql_help_ALTER_RULE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER RULE %s ON %s RENAME TO %s",
+ _("name"),
+ _("table_name"),
+ _("new_name"));
+}
+
+static void
+sql_help_ALTER_SCHEMA(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER SCHEMA %s RENAME TO %s\n"
+ "ALTER SCHEMA %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }",
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_owner"));
+}
+
+static void
+sql_help_ALTER_SEQUENCE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER SEQUENCE [ IF EXISTS ] %s\n"
+ " [ AS %s ]\n"
+ " [ INCREMENT [ BY ] %s ]\n"
+ " [ MINVALUE %s | NO MINVALUE ] [ MAXVALUE %s | NO MAXVALUE ]\n"
+ " [ START [ WITH ] %s ]\n"
+ " [ RESTART [ [ WITH ] %s ] ]\n"
+ " [ CACHE %s ] [ [ NO ] CYCLE ]\n"
+ " [ OWNED BY { %s.%s | NONE } ]\n"
+ "ALTER SEQUENCE [ IF EXISTS ] %s SET { LOGGED | UNLOGGED }\n"
+ "ALTER SEQUENCE [ IF EXISTS ] %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER SEQUENCE [ IF EXISTS ] %s RENAME TO %s\n"
+ "ALTER SEQUENCE [ IF EXISTS ] %s SET SCHEMA %s",
+ _("name"),
+ _("data_type"),
+ _("increment"),
+ _("minvalue"),
+ _("maxvalue"),
+ _("start"),
+ _("restart"),
+ _("cache"),
+ _("table_name"),
+ _("column_name"),
+ _("name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_SERVER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER SERVER %s [ VERSION '%s' ]\n"
+ " [ OPTIONS ( [ ADD | SET | DROP ] %s ['%s'] [, ... ] ) ]\n"
+ "ALTER SERVER %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER SERVER %s RENAME TO %s",
+ _("name"),
+ _("new_version"),
+ _("option"),
+ _("value"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"));
+}
+
+static void
+sql_help_ALTER_STATISTICS(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER STATISTICS %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER STATISTICS %s RENAME TO %s\n"
+ "ALTER STATISTICS %s SET SCHEMA %s\n"
+ "ALTER STATISTICS %s SET STATISTICS %s",
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"),
+ _("name"),
+ _("new_target"));
+}
+
+static void
+sql_help_ALTER_SUBSCRIPTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER SUBSCRIPTION %s CONNECTION '%s'\n"
+ "ALTER SUBSCRIPTION %s SET PUBLICATION %s [, ...] [ WITH ( %s [= %s] [, ... ] ) ]\n"
+ "ALTER SUBSCRIPTION %s ADD PUBLICATION %s [, ...] [ WITH ( %s [= %s] [, ... ] ) ]\n"
+ "ALTER SUBSCRIPTION %s DROP PUBLICATION %s [, ...] [ WITH ( %s [= %s] [, ... ] ) ]\n"
+ "ALTER SUBSCRIPTION %s REFRESH PUBLICATION [ WITH ( %s [= %s] [, ... ] ) ]\n"
+ "ALTER SUBSCRIPTION %s ENABLE\n"
+ "ALTER SUBSCRIPTION %s DISABLE\n"
+ "ALTER SUBSCRIPTION %s SET ( %s [= %s] [, ... ] )\n"
+ "ALTER SUBSCRIPTION %s SKIP ( %s = %s )\n"
+ "ALTER SUBSCRIPTION %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER SUBSCRIPTION %s RENAME TO %s",
+ _("name"),
+ _("conninfo"),
+ _("name"),
+ _("publication_name"),
+ _("publication_option"),
+ _("value"),
+ _("name"),
+ _("publication_name"),
+ _("publication_option"),
+ _("value"),
+ _("name"),
+ _("publication_name"),
+ _("publication_option"),
+ _("value"),
+ _("name"),
+ _("refresh_option"),
+ _("value"),
+ _("name"),
+ _("name"),
+ _("name"),
+ _("subscription_parameter"),
+ _("value"),
+ _("name"),
+ _("skip_option"),
+ _("value"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"));
+}
+
+static void
+sql_help_ALTER_SYSTEM(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER SYSTEM SET %s { TO | = } { %s [, ...] | DEFAULT }\n"
+ "\n"
+ "ALTER SYSTEM RESET %s\n"
+ "ALTER SYSTEM RESET ALL",
+ _("configuration_parameter"),
+ _("value"),
+ _("configuration_parameter"));
+}
+
+static void
+sql_help_ALTER_TABLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER TABLE [ IF EXISTS ] [ ONLY ] %s [ * ]\n"
+ " %s [, ... ]\n"
+ "ALTER TABLE [ IF EXISTS ] [ ONLY ] %s [ * ]\n"
+ " RENAME [ COLUMN ] %s TO %s\n"
+ "ALTER TABLE [ IF EXISTS ] [ ONLY ] %s [ * ]\n"
+ " RENAME CONSTRAINT %s TO %s\n"
+ "ALTER TABLE [ IF EXISTS ] %s\n"
+ " RENAME TO %s\n"
+ "ALTER TABLE [ IF EXISTS ] %s\n"
+ " SET SCHEMA %s\n"
+ "ALTER TABLE ALL IN TABLESPACE %s [ OWNED BY %s [, ... ] ]\n"
+ " SET TABLESPACE %s [ NOWAIT ]\n"
+ "ALTER TABLE [ IF EXISTS ] %s\n"
+ " ATTACH PARTITION %s { FOR VALUES %s | DEFAULT }\n"
+ "ALTER TABLE [ IF EXISTS ] %s\n"
+ " DETACH PARTITION %s [ CONCURRENTLY | FINALIZE ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ADD [ COLUMN ] [ IF NOT EXISTS ] %s %s [ COLLATE %s ] [ %s [ ... ] ]\n"
+ " DROP [ COLUMN ] [ IF EXISTS ] %s [ RESTRICT | CASCADE ]\n"
+ " ALTER [ COLUMN ] %s [ SET DATA ] TYPE %s [ COLLATE %s ] [ USING %s ]\n"
+ " ALTER [ COLUMN ] %s SET DEFAULT %s\n"
+ " ALTER [ COLUMN ] %s DROP DEFAULT\n"
+ " ALTER [ COLUMN ] %s { SET | DROP } NOT NULL\n"
+ " ALTER [ COLUMN ] %s DROP EXPRESSION [ IF EXISTS ]\n"
+ " ALTER [ COLUMN ] %s ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( %s ) ]\n"
+ " ALTER [ COLUMN ] %s { SET GENERATED { ALWAYS | BY DEFAULT } | SET %s | RESTART [ [ WITH ] %s ] } [...]\n"
+ " ALTER [ COLUMN ] %s DROP IDENTITY [ IF EXISTS ]\n"
+ " ALTER [ COLUMN ] %s SET STATISTICS %s\n"
+ " ALTER [ COLUMN ] %s SET ( %s = %s [, ... ] )\n"
+ " ALTER [ COLUMN ] %s RESET ( %s [, ... ] )\n"
+ " ALTER [ COLUMN ] %s SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }\n"
+ " ALTER [ COLUMN ] %s SET COMPRESSION %s\n"
+ " ADD %s [ NOT VALID ]\n"
+ " ADD %s\n"
+ " ALTER CONSTRAINT %s [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n"
+ " VALIDATE CONSTRAINT %s\n"
+ " DROP CONSTRAINT [ IF EXISTS ] %s [ RESTRICT | CASCADE ]\n"
+ " DISABLE TRIGGER [ %s | ALL | USER ]\n"
+ " ENABLE TRIGGER [ %s | ALL | USER ]\n"
+ " ENABLE REPLICA TRIGGER %s\n"
+ " ENABLE ALWAYS TRIGGER %s\n"
+ " DISABLE RULE %s\n"
+ " ENABLE RULE %s\n"
+ " ENABLE REPLICA RULE %s\n"
+ " ENABLE ALWAYS RULE %s\n"
+ " DISABLE ROW LEVEL SECURITY\n"
+ " ENABLE ROW LEVEL SECURITY\n"
+ " FORCE ROW LEVEL SECURITY\n"
+ " NO FORCE ROW LEVEL SECURITY\n"
+ " CLUSTER ON %s\n"
+ " SET WITHOUT CLUSTER\n"
+ " SET WITHOUT OIDS\n"
+ " SET ACCESS METHOD %s\n"
+ " SET TABLESPACE %s\n"
+ " SET { LOGGED | UNLOGGED }\n"
+ " SET ( %s [= %s] [, ... ] )\n"
+ " RESET ( %s [, ... ] )\n"
+ " INHERIT %s\n"
+ " NO INHERIT %s\n"
+ " OF %s\n"
+ " NOT OF\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ " REPLICA IDENTITY { DEFAULT | USING INDEX %s | FULL | NOTHING }\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "IN ( %s [, ...] ) |\n"
+ "FROM ( { %s | MINVALUE | MAXVALUE } [, ...] )\n"
+ " TO ( { %s | MINVALUE | MAXVALUE } [, ...] ) |\n"
+ "WITH ( MODULUS %s, REMAINDER %s )\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ CONSTRAINT %s ]\n"
+ "{ NOT NULL |\n"
+ " NULL |\n"
+ " CHECK ( %s ) [ NO INHERIT ] |\n"
+ " DEFAULT %s |\n"
+ " GENERATED ALWAYS AS ( %s ) STORED |\n"
+ " GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( %s ) ] |\n"
+ " UNIQUE [ NULLS [ NOT ] DISTINCT ] %s |\n"
+ " PRIMARY KEY %s |\n"
+ " REFERENCES %s [ ( %s ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]\n"
+ " [ ON DELETE %s ] [ ON UPDATE %s ] }\n"
+ "[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ CONSTRAINT %s ]\n"
+ "{ CHECK ( %s ) [ NO INHERIT ] |\n"
+ " UNIQUE [ NULLS [ NOT ] DISTINCT ] ( %s [, ... ] ) %s |\n"
+ " PRIMARY KEY ( %s [, ... ] ) %s |\n"
+ " EXCLUDE [ USING %s ] ( %s WITH %s [, ... ] ) %s [ WHERE ( %s ) ] |\n"
+ " FOREIGN KEY ( %s [, ... ] ) REFERENCES %s [ ( %s [, ... ] ) ]\n"
+ " [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE %s ] [ ON UPDATE %s ] }\n"
+ "[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " [ CONSTRAINT %s ]\n"
+ " { UNIQUE | PRIMARY KEY } USING INDEX %s\n"
+ " [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ INCLUDE ( %s [, ... ] ) ]\n"
+ "[ WITH ( %s [= %s] [, ... ] ) ]\n"
+ "[ USING INDEX TABLESPACE %s ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "{ %s | ( %s ) } [ %s ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "{ NO ACTION | RESTRICT | CASCADE | SET NULL [ ( %s [, ... ] ) ] | SET DEFAULT [ ( %s [, ... ] ) ] }",
+ _("name"),
+ _("action"),
+ _("name"),
+ _("column_name"),
+ _("new_column_name"),
+ _("name"),
+ _("constraint_name"),
+ _("new_constraint_name"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"),
+ _("name"),
+ _("role_name"),
+ _("new_tablespace"),
+ _("name"),
+ _("partition_name"),
+ _("partition_bound_spec"),
+ _("name"),
+ _("partition_name"),
+ _("where action is one of:"),
+ _("column_name"),
+ _("data_type"),
+ _("collation"),
+ _("column_constraint"),
+ _("column_name"),
+ _("column_name"),
+ _("data_type"),
+ _("collation"),
+ _("expression"),
+ _("column_name"),
+ _("expression"),
+ _("column_name"),
+ _("column_name"),
+ _("column_name"),
+ _("column_name"),
+ _("sequence_options"),
+ _("column_name"),
+ _("sequence_option"),
+ _("restart"),
+ _("column_name"),
+ _("column_name"),
+ _("integer"),
+ _("column_name"),
+ _("attribute_option"),
+ _("value"),
+ _("column_name"),
+ _("attribute_option"),
+ _("column_name"),
+ _("column_name"),
+ _("compression_method"),
+ _("table_constraint"),
+ _("table_constraint_using_index"),
+ _("constraint_name"),
+ _("constraint_name"),
+ _("constraint_name"),
+ _("trigger_name"),
+ _("trigger_name"),
+ _("trigger_name"),
+ _("trigger_name"),
+ _("rewrite_rule_name"),
+ _("rewrite_rule_name"),
+ _("rewrite_rule_name"),
+ _("rewrite_rule_name"),
+ _("index_name"),
+ _("new_access_method"),
+ _("new_tablespace"),
+ _("storage_parameter"),
+ _("value"),
+ _("storage_parameter"),
+ _("parent_table"),
+ _("parent_table"),
+ _("type_name"),
+ _("new_owner"),
+ _("index_name"),
+ _("and partition_bound_spec is:"),
+ _("partition_bound_expr"),
+ _("partition_bound_expr"),
+ _("partition_bound_expr"),
+ _("numeric_literal"),
+ _("numeric_literal"),
+ _("and column_constraint is:"),
+ _("constraint_name"),
+ _("expression"),
+ _("default_expr"),
+ _("generation_expr"),
+ _("sequence_options"),
+ _("index_parameters"),
+ _("index_parameters"),
+ _("reftable"),
+ _("refcolumn"),
+ _("referential_action"),
+ _("referential_action"),
+ _("and table_constraint is:"),
+ _("constraint_name"),
+ _("expression"),
+ _("column_name"),
+ _("index_parameters"),
+ _("column_name"),
+ _("index_parameters"),
+ _("index_method"),
+ _("exclude_element"),
+ _("operator"),
+ _("index_parameters"),
+ _("predicate"),
+ _("column_name"),
+ _("reftable"),
+ _("refcolumn"),
+ _("referential_action"),
+ _("referential_action"),
+ _("and table_constraint_using_index is:"),
+ _("constraint_name"),
+ _("index_name"),
+ _("index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"),
+ _("column_name"),
+ _("storage_parameter"),
+ _("value"),
+ _("tablespace_name"),
+ _("exclude_element in an EXCLUDE constraint is:"),
+ _("column_name"),
+ _("expression"),
+ _("opclass"),
+ _("referential_action in a FOREIGN KEY/REFERENCES constraint is:"),
+ _("column_name"),
+ _("column_name"));
+}
+
+static void
+sql_help_ALTER_TABLESPACE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER TABLESPACE %s RENAME TO %s\n"
+ "ALTER TABLESPACE %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER TABLESPACE %s SET ( %s = %s [, ... ] )\n"
+ "ALTER TABLESPACE %s RESET ( %s [, ... ] )",
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("tablespace_option"),
+ _("value"),
+ _("name"),
+ _("tablespace_option"));
+}
+
+static void
+sql_help_ALTER_TEXT_SEARCH_CONFIGURATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER TEXT SEARCH CONFIGURATION %s\n"
+ " ADD MAPPING FOR %s [, ... ] WITH %s [, ... ]\n"
+ "ALTER TEXT SEARCH CONFIGURATION %s\n"
+ " ALTER MAPPING FOR %s [, ... ] WITH %s [, ... ]\n"
+ "ALTER TEXT SEARCH CONFIGURATION %s\n"
+ " ALTER MAPPING REPLACE %s WITH %s\n"
+ "ALTER TEXT SEARCH CONFIGURATION %s\n"
+ " ALTER MAPPING FOR %s [, ... ] REPLACE %s WITH %s\n"
+ "ALTER TEXT SEARCH CONFIGURATION %s\n"
+ " DROP MAPPING [ IF EXISTS ] FOR %s [, ... ]\n"
+ "ALTER TEXT SEARCH CONFIGURATION %s RENAME TO %s\n"
+ "ALTER TEXT SEARCH CONFIGURATION %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER TEXT SEARCH CONFIGURATION %s SET SCHEMA %s",
+ _("name"),
+ _("token_type"),
+ _("dictionary_name"),
+ _("name"),
+ _("token_type"),
+ _("dictionary_name"),
+ _("name"),
+ _("old_dictionary"),
+ _("new_dictionary"),
+ _("name"),
+ _("token_type"),
+ _("old_dictionary"),
+ _("new_dictionary"),
+ _("name"),
+ _("token_type"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_TEXT_SEARCH_DICTIONARY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER TEXT SEARCH DICTIONARY %s (\n"
+ " %s [ = %s ] [, ... ]\n"
+ ")\n"
+ "ALTER TEXT SEARCH DICTIONARY %s RENAME TO %s\n"
+ "ALTER TEXT SEARCH DICTIONARY %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER TEXT SEARCH DICTIONARY %s SET SCHEMA %s",
+ _("name"),
+ _("option"),
+ _("value"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_TEXT_SEARCH_PARSER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER TEXT SEARCH PARSER %s RENAME TO %s\n"
+ "ALTER TEXT SEARCH PARSER %s SET SCHEMA %s",
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_TEXT_SEARCH_TEMPLATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER TEXT SEARCH TEMPLATE %s RENAME TO %s\n"
+ "ALTER TEXT SEARCH TEMPLATE %s SET SCHEMA %s",
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_TRIGGER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER TRIGGER %s ON %s RENAME TO %s\n"
+ "ALTER TRIGGER %s ON %s [ NO ] DEPENDS ON EXTENSION %s",
+ _("name"),
+ _("table_name"),
+ _("new_name"),
+ _("name"),
+ _("table_name"),
+ _("extension_name"));
+}
+
+static void
+sql_help_ALTER_TYPE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER TYPE %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER TYPE %s RENAME TO %s\n"
+ "ALTER TYPE %s SET SCHEMA %s\n"
+ "ALTER TYPE %s RENAME ATTRIBUTE %s TO %s [ CASCADE | RESTRICT ]\n"
+ "ALTER TYPE %s %s [, ... ]\n"
+ "ALTER TYPE %s ADD VALUE [ IF NOT EXISTS ] %s [ { BEFORE | AFTER } %s ]\n"
+ "ALTER TYPE %s RENAME VALUE %s TO %s\n"
+ "ALTER TYPE %s SET ( %s = %s [, ... ] )\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ADD ATTRIBUTE %s %s [ COLLATE %s ] [ CASCADE | RESTRICT ]\n"
+ " DROP ATTRIBUTE [ IF EXISTS ] %s [ CASCADE | RESTRICT ]\n"
+ " ALTER ATTRIBUTE %s [ SET DATA ] TYPE %s [ COLLATE %s ] [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"),
+ _("name"),
+ _("attribute_name"),
+ _("new_attribute_name"),
+ _("name"),
+ _("action"),
+ _("name"),
+ _("new_enum_value"),
+ _("neighbor_enum_value"),
+ _("name"),
+ _("existing_enum_value"),
+ _("new_enum_value"),
+ _("name"),
+ _("property"),
+ _("value"),
+ _("where action is one of:"),
+ _("attribute_name"),
+ _("data_type"),
+ _("collation"),
+ _("attribute_name"),
+ _("attribute_name"),
+ _("data_type"),
+ _("collation"));
+}
+
+static void
+sql_help_ALTER_USER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER USER %s [ WITH ] %s [ ... ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " SUPERUSER | NOSUPERUSER\n"
+ " | CREATEDB | NOCREATEDB\n"
+ " | CREATEROLE | NOCREATEROLE\n"
+ " | INHERIT | NOINHERIT\n"
+ " | LOGIN | NOLOGIN\n"
+ " | REPLICATION | NOREPLICATION\n"
+ " | BYPASSRLS | NOBYPASSRLS\n"
+ " | CONNECTION LIMIT %s\n"
+ " | [ ENCRYPTED ] PASSWORD '%s' | PASSWORD NULL\n"
+ " | VALID UNTIL '%s'\n"
+ "\n"
+ "ALTER USER %s RENAME TO %s\n"
+ "\n"
+ "ALTER USER { %s | ALL } [ IN DATABASE %s ] SET %s { TO | = } { %s | DEFAULT }\n"
+ "ALTER USER { %s | ALL } [ IN DATABASE %s ] SET %s FROM CURRENT\n"
+ "ALTER USER { %s | ALL } [ IN DATABASE %s ] RESET %s\n"
+ "ALTER USER { %s | ALL } [ IN DATABASE %s ] RESET ALL\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s\n"
+ " | CURRENT_ROLE\n"
+ " | CURRENT_USER\n"
+ " | SESSION_USER",
+ _("role_specification"),
+ _("option"),
+ _("where option can be:"),
+ _("connlimit"),
+ _("password"),
+ _("timestamp"),
+ _("name"),
+ _("new_name"),
+ _("role_specification"),
+ _("database_name"),
+ _("configuration_parameter"),
+ _("value"),
+ _("role_specification"),
+ _("database_name"),
+ _("configuration_parameter"),
+ _("role_specification"),
+ _("database_name"),
+ _("configuration_parameter"),
+ _("role_specification"),
+ _("database_name"),
+ _("where role_specification can be:"),
+ _("role_name"));
+}
+
+static void
+sql_help_ALTER_USER_MAPPING(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER USER MAPPING FOR { %s | USER | CURRENT_ROLE | CURRENT_USER | SESSION_USER | PUBLIC }\n"
+ " SERVER %s\n"
+ " OPTIONS ( [ ADD | SET | DROP ] %s ['%s'] [, ... ] )",
+ _("user_name"),
+ _("server_name"),
+ _("option"),
+ _("value"));
+}
+
+static void
+sql_help_ALTER_VIEW(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER VIEW [ IF EXISTS ] %s ALTER [ COLUMN ] %s SET DEFAULT %s\n"
+ "ALTER VIEW [ IF EXISTS ] %s ALTER [ COLUMN ] %s DROP DEFAULT\n"
+ "ALTER VIEW [ IF EXISTS ] %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER VIEW [ IF EXISTS ] %s RENAME [ COLUMN ] %s TO %s\n"
+ "ALTER VIEW [ IF EXISTS ] %s RENAME TO %s\n"
+ "ALTER VIEW [ IF EXISTS ] %s SET SCHEMA %s\n"
+ "ALTER VIEW [ IF EXISTS ] %s SET ( %s [= %s] [, ... ] )\n"
+ "ALTER VIEW [ IF EXISTS ] %s RESET ( %s [, ... ] )",
+ _("name"),
+ _("column_name"),
+ _("expression"),
+ _("name"),
+ _("column_name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("column_name"),
+ _("new_column_name"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"),
+ _("name"),
+ _("view_option_name"),
+ _("view_option_value"),
+ _("name"),
+ _("view_option_name"));
+}
+
+static void
+sql_help_ANALYZE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ANALYZE [ ( %s [, ...] ) ] [ %s [, ...] ]\n"
+ "ANALYZE [ VERBOSE ] [ %s [, ...] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " VERBOSE [ %s ]\n"
+ " SKIP_LOCKED [ %s ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s [ ( %s [, ...] ) ]",
+ _("option"),
+ _("table_and_columns"),
+ _("table_and_columns"),
+ _("where option can be one of:"),
+ _("boolean"),
+ _("boolean"),
+ _("and table_and_columns is:"),
+ _("table_name"),
+ _("column_name"));
+}
+
+static void
+sql_help_BEGIN(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "BEGIN [ WORK | TRANSACTION ] [ %s [, ...] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n"
+ " READ WRITE | READ ONLY\n"
+ " [ NOT ] DEFERRABLE",
+ _("transaction_mode"),
+ _("where transaction_mode is one of:"));
+}
+
+static void
+sql_help_CALL(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CALL %s ( [ %s ] [, ...] )",
+ _("name"),
+ _("argument"));
+}
+
+static void
+sql_help_CHECKPOINT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CHECKPOINT");
+}
+
+static void
+sql_help_CLOSE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CLOSE { %s | ALL }",
+ _("name"));
+}
+
+static void
+sql_help_CLUSTER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CLUSTER [VERBOSE] %s [ USING %s ]\n"
+ "CLUSTER ( %s [, ...] ) %s [ USING %s ]\n"
+ "CLUSTER [VERBOSE]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " VERBOSE [ %s ]",
+ _("table_name"),
+ _("index_name"),
+ _("option"),
+ _("table_name"),
+ _("index_name"),
+ _("where option can be one of:"),
+ _("boolean"));
+}
+
+static void
+sql_help_COMMENT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "COMMENT ON\n"
+ "{\n"
+ " ACCESS METHOD %s |\n"
+ " AGGREGATE %s ( %s ) |\n"
+ " CAST (%s AS %s) |\n"
+ " COLLATION %s |\n"
+ " COLUMN %s.%s |\n"
+ " CONSTRAINT %s ON %s |\n"
+ " CONSTRAINT %s ON DOMAIN %s |\n"
+ " CONVERSION %s |\n"
+ " DATABASE %s |\n"
+ " DOMAIN %s |\n"
+ " EXTENSION %s |\n"
+ " EVENT TRIGGER %s |\n"
+ " FOREIGN DATA WRAPPER %s |\n"
+ " FOREIGN TABLE %s |\n"
+ " FUNCTION %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " INDEX %s |\n"
+ " LARGE OBJECT %s |\n"
+ " MATERIALIZED VIEW %s |\n"
+ " OPERATOR %s (%s, %s) |\n"
+ " OPERATOR CLASS %s USING %s |\n"
+ " OPERATOR FAMILY %s USING %s |\n"
+ " POLICY %s ON %s |\n"
+ " [ PROCEDURAL ] LANGUAGE %s |\n"
+ " PROCEDURE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " PUBLICATION %s |\n"
+ " ROLE %s |\n"
+ " ROUTINE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " RULE %s ON %s |\n"
+ " SCHEMA %s |\n"
+ " SEQUENCE %s |\n"
+ " SERVER %s |\n"
+ " STATISTICS %s |\n"
+ " SUBSCRIPTION %s |\n"
+ " TABLE %s |\n"
+ " TABLESPACE %s |\n"
+ " TEXT SEARCH CONFIGURATION %s |\n"
+ " TEXT SEARCH DICTIONARY %s |\n"
+ " TEXT SEARCH PARSER %s |\n"
+ " TEXT SEARCH TEMPLATE %s |\n"
+ " TRANSFORM FOR %s LANGUAGE %s |\n"
+ " TRIGGER %s ON %s |\n"
+ " TYPE %s |\n"
+ " VIEW %s\n"
+ "} IS { %s | NULL }\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "* |\n"
+ "[ %s ] [ %s ] %s [ , ... ] |\n"
+ "[ [ %s ] [ %s ] %s [ , ... ] ] ORDER BY [ %s ] [ %s ] %s [ , ... ]",
+ _("object_name"),
+ _("aggregate_name"),
+ _("aggregate_signature"),
+ _("source_type"),
+ _("target_type"),
+ _("object_name"),
+ _("relation_name"),
+ _("column_name"),
+ _("constraint_name"),
+ _("table_name"),
+ _("constraint_name"),
+ _("domain_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("function_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("object_name"),
+ _("large_object_oid"),
+ _("object_name"),
+ _("operator_name"),
+ _("left_type"),
+ _("right_type"),
+ _("object_name"),
+ _("index_method"),
+ _("object_name"),
+ _("index_method"),
+ _("policy_name"),
+ _("table_name"),
+ _("object_name"),
+ _("procedure_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("object_name"),
+ _("object_name"),
+ _("routine_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("rule_name"),
+ _("table_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("type_name"),
+ _("lang_name"),
+ _("trigger_name"),
+ _("table_name"),
+ _("object_name"),
+ _("object_name"),
+ _("string_literal"),
+ _("where aggregate_signature is:"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"));
+}
+
+static void
+sql_help_COMMIT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "COMMIT [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]");
+}
+
+static void
+sql_help_COMMIT_PREPARED(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "COMMIT PREPARED %s",
+ _("transaction_id"));
+}
+
+static void
+sql_help_COPY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "COPY %s [ ( %s [, ...] ) ]\n"
+ " FROM { '%s' | PROGRAM '%s' | STDIN }\n"
+ " [ [ WITH ] ( %s [, ...] ) ]\n"
+ " [ WHERE %s ]\n"
+ "\n"
+ "COPY { %s [ ( %s [, ...] ) ] | ( %s ) }\n"
+ " TO { '%s' | PROGRAM '%s' | STDOUT }\n"
+ " [ [ WITH ] ( %s [, ...] ) ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " FORMAT %s\n"
+ " FREEZE [ %s ]\n"
+ " DELIMITER '%s'\n"
+ " NULL '%s'\n"
+ " HEADER [ %s | MATCH ]\n"
+ " QUOTE '%s'\n"
+ " ESCAPE '%s'\n"
+ " FORCE_QUOTE { ( %s [, ...] ) | * }\n"
+ " FORCE_NOT_NULL ( %s [, ...] )\n"
+ " FORCE_NULL ( %s [, ...] )\n"
+ " ENCODING '%s'",
+ _("table_name"),
+ _("column_name"),
+ _("filename"),
+ _("command"),
+ _("option"),
+ _("condition"),
+ _("table_name"),
+ _("column_name"),
+ _("query"),
+ _("filename"),
+ _("command"),
+ _("option"),
+ _("where option can be one of:"),
+ _("format_name"),
+ _("boolean"),
+ _("delimiter_character"),
+ _("null_string"),
+ _("boolean"),
+ _("quote_character"),
+ _("escape_character"),
+ _("column_name"),
+ _("column_name"),
+ _("column_name"),
+ _("encoding_name"));
+}
+
+static void
+sql_help_CREATE_ACCESS_METHOD(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE ACCESS METHOD %s\n"
+ " TYPE %s\n"
+ " HANDLER %s",
+ _("name"),
+ _("access_method_type"),
+ _("handler_function"));
+}
+
+static void
+sql_help_CREATE_AGGREGATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ OR REPLACE ] AGGREGATE %s ( [ %s ] [ %s ] %s [ , ... ] ) (\n"
+ " SFUNC = %s,\n"
+ " STYPE = %s\n"
+ " [ , SSPACE = %s ]\n"
+ " [ , FINALFUNC = %s ]\n"
+ " [ , FINALFUNC_EXTRA ]\n"
+ " [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]\n"
+ " [ , COMBINEFUNC = %s ]\n"
+ " [ , SERIALFUNC = %s ]\n"
+ " [ , DESERIALFUNC = %s ]\n"
+ " [ , INITCOND = %s ]\n"
+ " [ , MSFUNC = %s ]\n"
+ " [ , MINVFUNC = %s ]\n"
+ " [ , MSTYPE = %s ]\n"
+ " [ , MSSPACE = %s ]\n"
+ " [ , MFINALFUNC = %s ]\n"
+ " [ , MFINALFUNC_EXTRA ]\n"
+ " [ , MFINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]\n"
+ " [ , MINITCOND = %s ]\n"
+ " [ , SORTOP = %s ]\n"
+ " [ , PARALLEL = { SAFE | RESTRICTED | UNSAFE } ]\n"
+ ")\n"
+ "\n"
+ "CREATE [ OR REPLACE ] AGGREGATE %s ( [ [ %s ] [ %s ] %s [ , ... ] ]\n"
+ " ORDER BY [ %s ] [ %s ] %s [ , ... ] ) (\n"
+ " SFUNC = %s,\n"
+ " STYPE = %s\n"
+ " [ , SSPACE = %s ]\n"
+ " [ , FINALFUNC = %s ]\n"
+ " [ , FINALFUNC_EXTRA ]\n"
+ " [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]\n"
+ " [ , INITCOND = %s ]\n"
+ " [ , PARALLEL = { SAFE | RESTRICTED | UNSAFE } ]\n"
+ " [ , HYPOTHETICAL ]\n"
+ ")\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "CREATE [ OR REPLACE ] AGGREGATE %s (\n"
+ " BASETYPE = %s,\n"
+ " SFUNC = %s,\n"
+ " STYPE = %s\n"
+ " [ , SSPACE = %s ]\n"
+ " [ , FINALFUNC = %s ]\n"
+ " [ , FINALFUNC_EXTRA ]\n"
+ " [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]\n"
+ " [ , COMBINEFUNC = %s ]\n"
+ " [ , SERIALFUNC = %s ]\n"
+ " [ , DESERIALFUNC = %s ]\n"
+ " [ , INITCOND = %s ]\n"
+ " [ , MSFUNC = %s ]\n"
+ " [ , MINVFUNC = %s ]\n"
+ " [ , MSTYPE = %s ]\n"
+ " [ , MSSPACE = %s ]\n"
+ " [ , MFINALFUNC = %s ]\n"
+ " [ , MFINALFUNC_EXTRA ]\n"
+ " [ , MFINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]\n"
+ " [ , MINITCOND = %s ]\n"
+ " [ , SORTOP = %s ]\n"
+ ")",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("arg_data_type"),
+ _("sfunc"),
+ _("state_data_type"),
+ _("state_data_size"),
+ _("ffunc"),
+ _("combinefunc"),
+ _("serialfunc"),
+ _("deserialfunc"),
+ _("initial_condition"),
+ _("msfunc"),
+ _("minvfunc"),
+ _("mstate_data_type"),
+ _("mstate_data_size"),
+ _("mffunc"),
+ _("minitial_condition"),
+ _("sort_operator"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("arg_data_type"),
+ _("argmode"),
+ _("argname"),
+ _("arg_data_type"),
+ _("sfunc"),
+ _("state_data_type"),
+ _("state_data_size"),
+ _("ffunc"),
+ _("initial_condition"),
+ _("or the old syntax"),
+ _("name"),
+ _("base_type"),
+ _("sfunc"),
+ _("state_data_type"),
+ _("state_data_size"),
+ _("ffunc"),
+ _("combinefunc"),
+ _("serialfunc"),
+ _("deserialfunc"),
+ _("initial_condition"),
+ _("msfunc"),
+ _("minvfunc"),
+ _("mstate_data_type"),
+ _("mstate_data_size"),
+ _("mffunc"),
+ _("minitial_condition"),
+ _("sort_operator"));
+}
+
+static void
+sql_help_CREATE_CAST(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE CAST (%s AS %s)\n"
+ " WITH FUNCTION %s [ (%s [, ...]) ]\n"
+ " [ AS ASSIGNMENT | AS IMPLICIT ]\n"
+ "\n"
+ "CREATE CAST (%s AS %s)\n"
+ " WITHOUT FUNCTION\n"
+ " [ AS ASSIGNMENT | AS IMPLICIT ]\n"
+ "\n"
+ "CREATE CAST (%s AS %s)\n"
+ " WITH INOUT\n"
+ " [ AS ASSIGNMENT | AS IMPLICIT ]",
+ _("source_type"),
+ _("target_type"),
+ _("function_name"),
+ _("argument_type"),
+ _("source_type"),
+ _("target_type"),
+ _("source_type"),
+ _("target_type"));
+}
+
+static void
+sql_help_CREATE_COLLATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE COLLATION [ IF NOT EXISTS ] %s (\n"
+ " [ LOCALE = %s, ]\n"
+ " [ LC_COLLATE = %s, ]\n"
+ " [ LC_CTYPE = %s, ]\n"
+ " [ PROVIDER = %s, ]\n"
+ " [ DETERMINISTIC = %s, ]\n"
+ " [ VERSION = %s ]\n"
+ ")\n"
+ "CREATE COLLATION [ IF NOT EXISTS ] %s FROM %s",
+ _("name"),
+ _("locale"),
+ _("lc_collate"),
+ _("lc_ctype"),
+ _("provider"),
+ _("boolean"),
+ _("version"),
+ _("name"),
+ _("existing_collation"));
+}
+
+static void
+sql_help_CREATE_CONVERSION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ DEFAULT ] CONVERSION %s\n"
+ " FOR %s TO %s FROM %s",
+ _("name"),
+ _("source_encoding"),
+ _("dest_encoding"),
+ _("function_name"));
+}
+
+static void
+sql_help_CREATE_DATABASE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE DATABASE %s\n"
+ " [ WITH ] [ OWNER [=] %s ]\n"
+ " [ TEMPLATE [=] %s ]\n"
+ " [ ENCODING [=] %s ]\n"
+ " [ STRATEGY [=] %s ] ]\n"
+ " [ LOCALE [=] %s ]\n"
+ " [ LC_COLLATE [=] %s ]\n"
+ " [ LC_CTYPE [=] %s ]\n"
+ " [ ICU_LOCALE [=] %s ]\n"
+ " [ LOCALE_PROVIDER [=] %s ]\n"
+ " [ COLLATION_VERSION = %s ]\n"
+ " [ TABLESPACE [=] %s ]\n"
+ " [ ALLOW_CONNECTIONS [=] %s ]\n"
+ " [ CONNECTION LIMIT [=] %s ]\n"
+ " [ IS_TEMPLATE [=] %s ]\n"
+ " [ OID [=] %s ]",
+ _("name"),
+ _("user_name"),
+ _("template"),
+ _("encoding"),
+ _("strategy"),
+ _("locale"),
+ _("lc_collate"),
+ _("lc_ctype"),
+ _("icu_locale"),
+ _("locale_provider"),
+ _("collation_version"),
+ _("tablespace_name"),
+ _("allowconn"),
+ _("connlimit"),
+ _("istemplate"),
+ _("oid"));
+}
+
+static void
+sql_help_CREATE_DOMAIN(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE DOMAIN %s [ AS ] %s\n"
+ " [ COLLATE %s ]\n"
+ " [ DEFAULT %s ]\n"
+ " [ %s [ ... ] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ CONSTRAINT %s ]\n"
+ "{ NOT NULL | NULL | CHECK (%s) }",
+ _("name"),
+ _("data_type"),
+ _("collation"),
+ _("expression"),
+ _("constraint"),
+ _("where constraint is:"),
+ _("constraint_name"),
+ _("expression"));
+}
+
+static void
+sql_help_CREATE_EVENT_TRIGGER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE EVENT TRIGGER %s\n"
+ " ON %s\n"
+ " [ WHEN %s IN (%s [, ... ]) [ AND ... ] ]\n"
+ " EXECUTE { FUNCTION | PROCEDURE } %s()",
+ _("name"),
+ _("event"),
+ _("filter_variable"),
+ _("filter_value"),
+ _("function_name"));
+}
+
+static void
+sql_help_CREATE_EXTENSION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE EXTENSION [ IF NOT EXISTS ] %s\n"
+ " [ WITH ] [ SCHEMA %s ]\n"
+ " [ VERSION %s ]\n"
+ " [ CASCADE ]",
+ _("extension_name"),
+ _("schema_name"),
+ _("version"));
+}
+
+static void
+sql_help_CREATE_FOREIGN_DATA_WRAPPER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE FOREIGN DATA WRAPPER %s\n"
+ " [ HANDLER %s | NO HANDLER ]\n"
+ " [ VALIDATOR %s | NO VALIDATOR ]\n"
+ " [ OPTIONS ( %s '%s' [, ... ] ) ]",
+ _("name"),
+ _("handler_function"),
+ _("validator_function"),
+ _("option"),
+ _("value"));
+}
+
+static void
+sql_help_CREATE_FOREIGN_TABLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE FOREIGN TABLE [ IF NOT EXISTS ] %s ( [\n"
+ " { %s %s [ OPTIONS ( %s '%s' [, ... ] ) ] [ COLLATE %s ] [ %s [ ... ] ]\n"
+ " | %s }\n"
+ " [, ... ]\n"
+ "] )\n"
+ "[ INHERITS ( %s [, ... ] ) ]\n"
+ " SERVER %s\n"
+ "[ OPTIONS ( %s '%s' [, ... ] ) ]\n"
+ "\n"
+ "CREATE FOREIGN TABLE [ IF NOT EXISTS ] %s\n"
+ " PARTITION OF %s [ (\n"
+ " { %s [ WITH OPTIONS ] [ %s [ ... ] ]\n"
+ " | %s }\n"
+ " [, ... ]\n"
+ ") ]\n"
+ "{ FOR VALUES %s | DEFAULT }\n"
+ " SERVER %s\n"
+ "[ OPTIONS ( %s '%s' [, ... ] ) ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ CONSTRAINT %s ]\n"
+ "{ NOT NULL |\n"
+ " NULL |\n"
+ " CHECK ( %s ) [ NO INHERIT ] |\n"
+ " DEFAULT %s |\n"
+ " GENERATED ALWAYS AS ( %s ) STORED }\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ CONSTRAINT %s ]\n"
+ "CHECK ( %s ) [ NO INHERIT ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "IN ( %s [, ...] ) |\n"
+ "FROM ( { %s | MINVALUE | MAXVALUE } [, ...] )\n"
+ " TO ( { %s | MINVALUE | MAXVALUE } [, ...] ) |\n"
+ "WITH ( MODULUS %s, REMAINDER %s )",
+ _("table_name"),
+ _("column_name"),
+ _("data_type"),
+ _("option"),
+ _("value"),
+ _("collation"),
+ _("column_constraint"),
+ _("table_constraint"),
+ _("parent_table"),
+ _("server_name"),
+ _("option"),
+ _("value"),
+ _("table_name"),
+ _("parent_table"),
+ _("column_name"),
+ _("column_constraint"),
+ _("table_constraint"),
+ _("partition_bound_spec"),
+ _("server_name"),
+ _("option"),
+ _("value"),
+ _("where column_constraint is:"),
+ _("constraint_name"),
+ _("expression"),
+ _("default_expr"),
+ _("generation_expr"),
+ _("and table_constraint is:"),
+ _("constraint_name"),
+ _("expression"),
+ _("and partition_bound_spec is:"),
+ _("partition_bound_expr"),
+ _("partition_bound_expr"),
+ _("partition_bound_expr"),
+ _("numeric_literal"),
+ _("numeric_literal"));
+}
+
+static void
+sql_help_CREATE_FUNCTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ OR REPLACE ] FUNCTION\n"
+ " %s ( [ [ %s ] [ %s ] %s [ { DEFAULT | = } %s ] [, ...] ] )\n"
+ " [ RETURNS %s\n"
+ " | RETURNS TABLE ( %s %s [, ...] ) ]\n"
+ " { LANGUAGE %s\n"
+ " | TRANSFORM { FOR TYPE %s } [, ... ]\n"
+ " | WINDOW\n"
+ " | { IMMUTABLE | STABLE | VOLATILE }\n"
+ " | [ NOT ] LEAKPROOF\n"
+ " | { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }\n"
+ " | { [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER }\n"
+ " | PARALLEL { UNSAFE | RESTRICTED | SAFE }\n"
+ " | COST %s\n"
+ " | ROWS %s\n"
+ " | SUPPORT %s\n"
+ " | SET %s { TO %s | = %s | FROM CURRENT }\n"
+ " | AS '%s'\n"
+ " | AS '%s', '%s'\n"
+ " | %s\n"
+ " } ...",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("default_expr"),
+ _("rettype"),
+ _("column_name"),
+ _("column_type"),
+ _("lang_name"),
+ _("type_name"),
+ _("execution_cost"),
+ _("result_rows"),
+ _("support_function"),
+ _("configuration_parameter"),
+ _("value"),
+ _("value"),
+ _("definition"),
+ _("obj_file"),
+ _("link_symbol"),
+ _("sql_body"));
+}
+
+static void
+sql_help_CREATE_GROUP(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE GROUP %s [ [ WITH ] %s [ ... ] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " SUPERUSER | NOSUPERUSER\n"
+ " | CREATEDB | NOCREATEDB\n"
+ " | CREATEROLE | NOCREATEROLE\n"
+ " | INHERIT | NOINHERIT\n"
+ " | LOGIN | NOLOGIN\n"
+ " | REPLICATION | NOREPLICATION\n"
+ " | BYPASSRLS | NOBYPASSRLS\n"
+ " | CONNECTION LIMIT %s\n"
+ " | [ ENCRYPTED ] PASSWORD '%s' | PASSWORD NULL\n"
+ " | VALID UNTIL '%s'\n"
+ " | IN ROLE %s [, ...]\n"
+ " | IN GROUP %s [, ...]\n"
+ " | ROLE %s [, ...]\n"
+ " | ADMIN %s [, ...]\n"
+ " | USER %s [, ...]\n"
+ " | SYSID %s",
+ _("name"),
+ _("option"),
+ _("where option can be:"),
+ _("connlimit"),
+ _("password"),
+ _("timestamp"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("uid"));
+}
+
+static void
+sql_help_CREATE_INDEX(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] %s ] ON [ ONLY ] %s [ USING %s ]\n"
+ " ( { %s | ( %s ) } [ COLLATE %s ] [ %s [ ( %s = %s [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )\n"
+ " [ INCLUDE ( %s [, ...] ) ]\n"
+ " [ NULLS [ NOT ] DISTINCT ]\n"
+ " [ WITH ( %s [= %s] [, ... ] ) ]\n"
+ " [ TABLESPACE %s ]\n"
+ " [ WHERE %s ]",
+ _("name"),
+ _("table_name"),
+ _("method"),
+ _("column_name"),
+ _("expression"),
+ _("collation"),
+ _("opclass"),
+ _("opclass_parameter"),
+ _("value"),
+ _("column_name"),
+ _("storage_parameter"),
+ _("value"),
+ _("tablespace_name"),
+ _("predicate"));
+}
+
+static void
+sql_help_CREATE_LANGUAGE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE %s\n"
+ " HANDLER %s [ INLINE %s ] [ VALIDATOR %s ]\n"
+ "CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE %s",
+ _("name"),
+ _("call_handler"),
+ _("inline_handler"),
+ _("valfunction"),
+ _("name"));
+}
+
+static void
+sql_help_CREATE_MATERIALIZED_VIEW(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] %s\n"
+ " [ (%s [, ...] ) ]\n"
+ " [ USING %s ]\n"
+ " [ WITH ( %s [= %s] [, ... ] ) ]\n"
+ " [ TABLESPACE %s ]\n"
+ " AS %s\n"
+ " [ WITH [ NO ] DATA ]",
+ _("table_name"),
+ _("column_name"),
+ _("method"),
+ _("storage_parameter"),
+ _("value"),
+ _("tablespace_name"),
+ _("query"));
+}
+
+static void
+sql_help_CREATE_OPERATOR(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE OPERATOR %s (\n"
+ " {FUNCTION|PROCEDURE} = %s\n"
+ " [, LEFTARG = %s ] [, RIGHTARG = %s ]\n"
+ " [, COMMUTATOR = %s ] [, NEGATOR = %s ]\n"
+ " [, RESTRICT = %s ] [, JOIN = %s ]\n"
+ " [, HASHES ] [, MERGES ]\n"
+ ")",
+ _("name"),
+ _("function_name"),
+ _("left_type"),
+ _("right_type"),
+ _("com_op"),
+ _("neg_op"),
+ _("res_proc"),
+ _("join_proc"));
+}
+
+static void
+sql_help_CREATE_OPERATOR_CLASS(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE OPERATOR CLASS %s [ DEFAULT ] FOR TYPE %s\n"
+ " USING %s [ FAMILY %s ] AS\n"
+ " { OPERATOR %s %s [ ( %s, %s ) ] [ FOR SEARCH | FOR ORDER BY %s ]\n"
+ " | FUNCTION %s [ ( %s [ , %s ] ) ] %s ( %s [, ...] )\n"
+ " | STORAGE %s\n"
+ " } [, ... ]",
+ _("name"),
+ _("data_type"),
+ _("index_method"),
+ _("family_name"),
+ _("strategy_number"),
+ _("operator_name"),
+ _("op_type"),
+ _("op_type"),
+ _("sort_family_name"),
+ _("support_number"),
+ _("op_type"),
+ _("op_type"),
+ _("function_name"),
+ _("argument_type"),
+ _("storage_type"));
+}
+
+static void
+sql_help_CREATE_OPERATOR_FAMILY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE OPERATOR FAMILY %s USING %s",
+ _("name"),
+ _("index_method"));
+}
+
+static void
+sql_help_CREATE_POLICY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE POLICY %s ON %s\n"
+ " [ AS { PERMISSIVE | RESTRICTIVE } ]\n"
+ " [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ]\n"
+ " [ TO { %s | PUBLIC | CURRENT_ROLE | CURRENT_USER | SESSION_USER } [, ...] ]\n"
+ " [ USING ( %s ) ]\n"
+ " [ WITH CHECK ( %s ) ]",
+ _("name"),
+ _("table_name"),
+ _("role_name"),
+ _("using_expression"),
+ _("check_expression"));
+}
+
+static void
+sql_help_CREATE_PROCEDURE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ OR REPLACE ] PROCEDURE\n"
+ " %s ( [ [ %s ] [ %s ] %s [ { DEFAULT | = } %s ] [, ...] ] )\n"
+ " { LANGUAGE %s\n"
+ " | TRANSFORM { FOR TYPE %s } [, ... ]\n"
+ " | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n"
+ " | SET %s { TO %s | = %s | FROM CURRENT }\n"
+ " | AS '%s'\n"
+ " | AS '%s', '%s'\n"
+ " | %s\n"
+ " } ...",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("default_expr"),
+ _("lang_name"),
+ _("type_name"),
+ _("configuration_parameter"),
+ _("value"),
+ _("value"),
+ _("definition"),
+ _("obj_file"),
+ _("link_symbol"),
+ _("sql_body"));
+}
+
+static void
+sql_help_CREATE_PUBLICATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE PUBLICATION %s\n"
+ " [ FOR ALL TABLES\n"
+ " | FOR %s [, ... ] ]\n"
+ " [ WITH ( %s [= %s] [, ... ] ) ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " TABLE [ ONLY ] %s [ * ] [ ( %s [, ... ] ) ] [ WHERE ( %s ) ] [, ... ]\n"
+ " TABLES IN SCHEMA { %s | CURRENT_SCHEMA } [, ... ]",
+ _("name"),
+ _("publication_object"),
+ _("publication_parameter"),
+ _("value"),
+ _("where publication_object is one of:"),
+ _("table_name"),
+ _("column_name"),
+ _("expression"),
+ _("schema_name"));
+}
+
+static void
+sql_help_CREATE_ROLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE ROLE %s [ [ WITH ] %s [ ... ] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " SUPERUSER | NOSUPERUSER\n"
+ " | CREATEDB | NOCREATEDB\n"
+ " | CREATEROLE | NOCREATEROLE\n"
+ " | INHERIT | NOINHERIT\n"
+ " | LOGIN | NOLOGIN\n"
+ " | REPLICATION | NOREPLICATION\n"
+ " | BYPASSRLS | NOBYPASSRLS\n"
+ " | CONNECTION LIMIT %s\n"
+ " | [ ENCRYPTED ] PASSWORD '%s' | PASSWORD NULL\n"
+ " | VALID UNTIL '%s'\n"
+ " | IN ROLE %s [, ...]\n"
+ " | IN GROUP %s [, ...]\n"
+ " | ROLE %s [, ...]\n"
+ " | ADMIN %s [, ...]\n"
+ " | USER %s [, ...]\n"
+ " | SYSID %s",
+ _("name"),
+ _("option"),
+ _("where option can be:"),
+ _("connlimit"),
+ _("password"),
+ _("timestamp"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("uid"));
+}
+
+static void
+sql_help_CREATE_RULE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ OR REPLACE ] RULE %s AS ON %s\n"
+ " TO %s [ WHERE %s ]\n"
+ " DO [ ALSO | INSTEAD ] { NOTHING | %s | ( %s ; %s ... ) }\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " SELECT | INSERT | UPDATE | DELETE",
+ _("name"),
+ _("event"),
+ _("table_name"),
+ _("condition"),
+ _("command"),
+ _("command"),
+ _("command"),
+ _("where event can be one of:"));
+}
+
+static void
+sql_help_CREATE_SCHEMA(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE SCHEMA %s [ AUTHORIZATION %s ] [ %s [ ... ] ]\n"
+ "CREATE SCHEMA AUTHORIZATION %s [ %s [ ... ] ]\n"
+ "CREATE SCHEMA IF NOT EXISTS %s [ AUTHORIZATION %s ]\n"
+ "CREATE SCHEMA IF NOT EXISTS AUTHORIZATION %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s\n"
+ " | CURRENT_ROLE\n"
+ " | CURRENT_USER\n"
+ " | SESSION_USER",
+ _("schema_name"),
+ _("role_specification"),
+ _("schema_element"),
+ _("role_specification"),
+ _("schema_element"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("where role_specification can be:"),
+ _("user_name"));
+}
+
+static void
+sql_help_CREATE_SEQUENCE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ { TEMPORARY | TEMP } | UNLOGGED ] SEQUENCE [ IF NOT EXISTS ] %s\n"
+ " [ AS %s ]\n"
+ " [ INCREMENT [ BY ] %s ]\n"
+ " [ MINVALUE %s | NO MINVALUE ] [ MAXVALUE %s | NO MAXVALUE ]\n"
+ " [ START [ WITH ] %s ] [ CACHE %s ] [ [ NO ] CYCLE ]\n"
+ " [ OWNED BY { %s.%s | NONE } ]",
+ _("name"),
+ _("data_type"),
+ _("increment"),
+ _("minvalue"),
+ _("maxvalue"),
+ _("start"),
+ _("cache"),
+ _("table_name"),
+ _("column_name"));
+}
+
+static void
+sql_help_CREATE_SERVER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE SERVER [ IF NOT EXISTS ] %s [ TYPE '%s' ] [ VERSION '%s' ]\n"
+ " FOREIGN DATA WRAPPER %s\n"
+ " [ OPTIONS ( %s '%s' [, ... ] ) ]",
+ _("server_name"),
+ _("server_type"),
+ _("server_version"),
+ _("fdw_name"),
+ _("option"),
+ _("value"));
+}
+
+static void
+sql_help_CREATE_STATISTICS(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE STATISTICS [ IF NOT EXISTS ] %s\n"
+ " ON ( %s )\n"
+ " FROM %s\n"
+ "\n"
+ "CREATE STATISTICS [ IF NOT EXISTS ] %s\n"
+ " [ ( %s [, ... ] ) ]\n"
+ " ON { %s | ( %s ) }, { %s | ( %s ) } [, ...]\n"
+ " FROM %s",
+ _("statistics_name"),
+ _("expression"),
+ _("table_name"),
+ _("statistics_name"),
+ _("statistics_kind"),
+ _("column_name"),
+ _("expression"),
+ _("column_name"),
+ _("expression"),
+ _("table_name"));
+}
+
+static void
+sql_help_CREATE_SUBSCRIPTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE SUBSCRIPTION %s\n"
+ " CONNECTION '%s'\n"
+ " PUBLICATION %s [, ...]\n"
+ " [ WITH ( %s [= %s] [, ... ] ) ]",
+ _("subscription_name"),
+ _("conninfo"),
+ _("publication_name"),
+ _("subscription_parameter"),
+ _("value"));
+}
+
+static void
+sql_help_CREATE_TABLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] %s ( [\n"
+ " { %s %s [ COMPRESSION %s ] [ COLLATE %s ] [ %s [ ... ] ]\n"
+ " | %s\n"
+ " | LIKE %s [ %s ... ] }\n"
+ " [, ... ]\n"
+ "] )\n"
+ "[ INHERITS ( %s [, ... ] ) ]\n"
+ "[ PARTITION BY { RANGE | LIST | HASH } ( { %s | ( %s ) } [ COLLATE %s ] [ %s ] [, ... ] ) ]\n"
+ "[ USING %s ]\n"
+ "[ WITH ( %s [= %s] [, ... ] ) | WITHOUT OIDS ]\n"
+ "[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n"
+ "[ TABLESPACE %s ]\n"
+ "\n"
+ "CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] %s\n"
+ " OF %s [ (\n"
+ " { %s [ WITH OPTIONS ] [ %s [ ... ] ]\n"
+ " | %s }\n"
+ " [, ... ]\n"
+ ") ]\n"
+ "[ PARTITION BY { RANGE | LIST | HASH } ( { %s | ( %s ) } [ COLLATE %s ] [ %s ] [, ... ] ) ]\n"
+ "[ USING %s ]\n"
+ "[ WITH ( %s [= %s] [, ... ] ) | WITHOUT OIDS ]\n"
+ "[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n"
+ "[ TABLESPACE %s ]\n"
+ "\n"
+ "CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] %s\n"
+ " PARTITION OF %s [ (\n"
+ " { %s [ WITH OPTIONS ] [ %s [ ... ] ]\n"
+ " | %s }\n"
+ " [, ... ]\n"
+ ") ] { FOR VALUES %s | DEFAULT }\n"
+ "[ PARTITION BY { RANGE | LIST | HASH } ( { %s | ( %s ) } [ COLLATE %s ] [ %s ] [, ... ] ) ]\n"
+ "[ USING %s ]\n"
+ "[ WITH ( %s [= %s] [, ... ] ) | WITHOUT OIDS ]\n"
+ "[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n"
+ "[ TABLESPACE %s ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ CONSTRAINT %s ]\n"
+ "{ NOT NULL |\n"
+ " NULL |\n"
+ " CHECK ( %s ) [ NO INHERIT ] |\n"
+ " DEFAULT %s |\n"
+ " GENERATED ALWAYS AS ( %s ) STORED |\n"
+ " GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( %s ) ] |\n"
+ " UNIQUE [ NULLS [ NOT ] DISTINCT ] %s |\n"
+ " PRIMARY KEY %s |\n"
+ " REFERENCES %s [ ( %s ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]\n"
+ " [ ON DELETE %s ] [ ON UPDATE %s ] }\n"
+ "[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ CONSTRAINT %s ]\n"
+ "{ CHECK ( %s ) [ NO INHERIT ] |\n"
+ " UNIQUE [ NULLS [ NOT ] DISTINCT ] ( %s [, ... ] ) %s |\n"
+ " PRIMARY KEY ( %s [, ... ] ) %s |\n"
+ " EXCLUDE [ USING %s ] ( %s WITH %s [, ... ] ) %s [ WHERE ( %s ) ] |\n"
+ " FOREIGN KEY ( %s [, ... ] ) REFERENCES %s [ ( %s [, ... ] ) ]\n"
+ " [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE %s ] [ ON UPDATE %s ] }\n"
+ "[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "{ INCLUDING | EXCLUDING } { COMMENTS | COMPRESSION | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | STORAGE | ALL }\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "IN ( %s [, ...] ) |\n"
+ "FROM ( { %s | MINVALUE | MAXVALUE } [, ...] )\n"
+ " TO ( { %s | MINVALUE | MAXVALUE } [, ...] ) |\n"
+ "WITH ( MODULUS %s, REMAINDER %s )\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ INCLUDE ( %s [, ... ] ) ]\n"
+ "[ WITH ( %s [= %s] [, ... ] ) ]\n"
+ "[ USING INDEX TABLESPACE %s ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "{ %s | ( %s ) } [ %s ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "{ NO ACTION | RESTRICT | CASCADE | SET NULL [ ( %s [, ... ] ) ] | SET DEFAULT [ ( %s [, ... ] ) ] }",
+ _("table_name"),
+ _("column_name"),
+ _("data_type"),
+ _("compression_method"),
+ _("collation"),
+ _("column_constraint"),
+ _("table_constraint"),
+ _("source_table"),
+ _("like_option"),
+ _("parent_table"),
+ _("column_name"),
+ _("expression"),
+ _("collation"),
+ _("opclass"),
+ _("method"),
+ _("storage_parameter"),
+ _("value"),
+ _("tablespace_name"),
+ _("table_name"),
+ _("type_name"),
+ _("column_name"),
+ _("column_constraint"),
+ _("table_constraint"),
+ _("column_name"),
+ _("expression"),
+ _("collation"),
+ _("opclass"),
+ _("method"),
+ _("storage_parameter"),
+ _("value"),
+ _("tablespace_name"),
+ _("table_name"),
+ _("parent_table"),
+ _("column_name"),
+ _("column_constraint"),
+ _("table_constraint"),
+ _("partition_bound_spec"),
+ _("column_name"),
+ _("expression"),
+ _("collation"),
+ _("opclass"),
+ _("method"),
+ _("storage_parameter"),
+ _("value"),
+ _("tablespace_name"),
+ _("where column_constraint is:"),
+ _("constraint_name"),
+ _("expression"),
+ _("default_expr"),
+ _("generation_expr"),
+ _("sequence_options"),
+ _("index_parameters"),
+ _("index_parameters"),
+ _("reftable"),
+ _("refcolumn"),
+ _("referential_action"),
+ _("referential_action"),
+ _("and table_constraint is:"),
+ _("constraint_name"),
+ _("expression"),
+ _("column_name"),
+ _("index_parameters"),
+ _("column_name"),
+ _("index_parameters"),
+ _("index_method"),
+ _("exclude_element"),
+ _("operator"),
+ _("index_parameters"),
+ _("predicate"),
+ _("column_name"),
+ _("reftable"),
+ _("refcolumn"),
+ _("referential_action"),
+ _("referential_action"),
+ _("and like_option is:"),
+ _("and partition_bound_spec is:"),
+ _("partition_bound_expr"),
+ _("partition_bound_expr"),
+ _("partition_bound_expr"),
+ _("numeric_literal"),
+ _("numeric_literal"),
+ _("index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"),
+ _("column_name"),
+ _("storage_parameter"),
+ _("value"),
+ _("tablespace_name"),
+ _("exclude_element in an EXCLUDE constraint is:"),
+ _("column_name"),
+ _("expression"),
+ _("opclass"),
+ _("referential_action in a FOREIGN KEY/REFERENCES constraint is:"),
+ _("column_name"),
+ _("column_name"));
+}
+
+static void
+sql_help_CREATE_TABLE_AS(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] %s\n"
+ " [ (%s [, ...] ) ]\n"
+ " [ USING %s ]\n"
+ " [ WITH ( %s [= %s] [, ... ] ) | WITHOUT OIDS ]\n"
+ " [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n"
+ " [ TABLESPACE %s ]\n"
+ " AS %s\n"
+ " [ WITH [ NO ] DATA ]",
+ _("table_name"),
+ _("column_name"),
+ _("method"),
+ _("storage_parameter"),
+ _("value"),
+ _("tablespace_name"),
+ _("query"));
+}
+
+static void
+sql_help_CREATE_TABLESPACE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE TABLESPACE %s\n"
+ " [ OWNER { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER } ]\n"
+ " LOCATION '%s'\n"
+ " [ WITH ( %s = %s [, ... ] ) ]",
+ _("tablespace_name"),
+ _("new_owner"),
+ _("directory"),
+ _("tablespace_option"),
+ _("value"));
+}
+
+static void
+sql_help_CREATE_TEXT_SEARCH_CONFIGURATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE TEXT SEARCH CONFIGURATION %s (\n"
+ " PARSER = %s |\n"
+ " COPY = %s\n"
+ ")",
+ _("name"),
+ _("parser_name"),
+ _("source_config"));
+}
+
+static void
+sql_help_CREATE_TEXT_SEARCH_DICTIONARY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE TEXT SEARCH DICTIONARY %s (\n"
+ " TEMPLATE = %s\n"
+ " [, %s = %s [, ... ]]\n"
+ ")",
+ _("name"),
+ _("template"),
+ _("option"),
+ _("value"));
+}
+
+static void
+sql_help_CREATE_TEXT_SEARCH_PARSER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE TEXT SEARCH PARSER %s (\n"
+ " START = %s ,\n"
+ " GETTOKEN = %s ,\n"
+ " END = %s ,\n"
+ " LEXTYPES = %s\n"
+ " [, HEADLINE = %s ]\n"
+ ")",
+ _("name"),
+ _("start_function"),
+ _("gettoken_function"),
+ _("end_function"),
+ _("lextypes_function"),
+ _("headline_function"));
+}
+
+static void
+sql_help_CREATE_TEXT_SEARCH_TEMPLATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE TEXT SEARCH TEMPLATE %s (\n"
+ " [ INIT = %s , ]\n"
+ " LEXIZE = %s\n"
+ ")",
+ _("name"),
+ _("init_function"),
+ _("lexize_function"));
+}
+
+static void
+sql_help_CREATE_TRANSFORM(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ OR REPLACE ] TRANSFORM FOR %s LANGUAGE %s (\n"
+ " FROM SQL WITH FUNCTION %s [ (%s [, ...]) ],\n"
+ " TO SQL WITH FUNCTION %s [ (%s [, ...]) ]\n"
+ ");",
+ _("type_name"),
+ _("lang_name"),
+ _("from_sql_function_name"),
+ _("argument_type"),
+ _("to_sql_function_name"),
+ _("argument_type"));
+}
+
+static void
+sql_help_CREATE_TRIGGER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ OR REPLACE ] [ CONSTRAINT ] TRIGGER %s { BEFORE | AFTER | INSTEAD OF } { %s [ OR ... ] }\n"
+ " ON %s\n"
+ " [ FROM %s ]\n"
+ " [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]\n"
+ " [ REFERENCING { { OLD | NEW } TABLE [ AS ] %s } [ ... ] ]\n"
+ " [ FOR [ EACH ] { ROW | STATEMENT } ]\n"
+ " [ WHEN ( %s ) ]\n"
+ " EXECUTE { FUNCTION | PROCEDURE } %s ( %s )\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " INSERT\n"
+ " UPDATE [ OF %s [, ... ] ]\n"
+ " DELETE\n"
+ " TRUNCATE",
+ _("name"),
+ _("event"),
+ _("table_name"),
+ _("referenced_table_name"),
+ _("transition_relation_name"),
+ _("condition"),
+ _("function_name"),
+ _("arguments"),
+ _("where event can be one of:"),
+ _("column_name"));
+}
+
+static void
+sql_help_CREATE_TYPE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE TYPE %s AS\n"
+ " ( [ %s %s [ COLLATE %s ] [, ... ] ] )\n"
+ "\n"
+ "CREATE TYPE %s AS ENUM\n"
+ " ( [ '%s' [, ... ] ] )\n"
+ "\n"
+ "CREATE TYPE %s AS RANGE (\n"
+ " SUBTYPE = %s\n"
+ " [ , SUBTYPE_OPCLASS = %s ]\n"
+ " [ , COLLATION = %s ]\n"
+ " [ , CANONICAL = %s ]\n"
+ " [ , SUBTYPE_DIFF = %s ]\n"
+ " [ , MULTIRANGE_TYPE_NAME = %s ]\n"
+ ")\n"
+ "\n"
+ "CREATE TYPE %s (\n"
+ " INPUT = %s,\n"
+ " OUTPUT = %s\n"
+ " [ , RECEIVE = %s ]\n"
+ " [ , SEND = %s ]\n"
+ " [ , TYPMOD_IN = %s ]\n"
+ " [ , TYPMOD_OUT = %s ]\n"
+ " [ , ANALYZE = %s ]\n"
+ " [ , SUBSCRIPT = %s ]\n"
+ " [ , INTERNALLENGTH = { %s | VARIABLE } ]\n"
+ " [ , PASSEDBYVALUE ]\n"
+ " [ , ALIGNMENT = %s ]\n"
+ " [ , STORAGE = %s ]\n"
+ " [ , LIKE = %s ]\n"
+ " [ , CATEGORY = %s ]\n"
+ " [ , PREFERRED = %s ]\n"
+ " [ , DEFAULT = %s ]\n"
+ " [ , ELEMENT = %s ]\n"
+ " [ , DELIMITER = %s ]\n"
+ " [ , COLLATABLE = %s ]\n"
+ ")\n"
+ "\n"
+ "CREATE TYPE %s",
+ _("name"),
+ _("attribute_name"),
+ _("data_type"),
+ _("collation"),
+ _("name"),
+ _("label"),
+ _("name"),
+ _("subtype"),
+ _("subtype_operator_class"),
+ _("collation"),
+ _("canonical_function"),
+ _("subtype_diff_function"),
+ _("multirange_type_name"),
+ _("name"),
+ _("input_function"),
+ _("output_function"),
+ _("receive_function"),
+ _("send_function"),
+ _("type_modifier_input_function"),
+ _("type_modifier_output_function"),
+ _("analyze_function"),
+ _("subscript_function"),
+ _("internallength"),
+ _("alignment"),
+ _("storage"),
+ _("like_type"),
+ _("category"),
+ _("preferred"),
+ _("default"),
+ _("element"),
+ _("delimiter"),
+ _("collatable"),
+ _("name"));
+}
+
+static void
+sql_help_CREATE_USER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE USER %s [ [ WITH ] %s [ ... ] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " SUPERUSER | NOSUPERUSER\n"
+ " | CREATEDB | NOCREATEDB\n"
+ " | CREATEROLE | NOCREATEROLE\n"
+ " | INHERIT | NOINHERIT\n"
+ " | LOGIN | NOLOGIN\n"
+ " | REPLICATION | NOREPLICATION\n"
+ " | BYPASSRLS | NOBYPASSRLS\n"
+ " | CONNECTION LIMIT %s\n"
+ " | [ ENCRYPTED ] PASSWORD '%s' | PASSWORD NULL\n"
+ " | VALID UNTIL '%s'\n"
+ " | IN ROLE %s [, ...]\n"
+ " | IN GROUP %s [, ...]\n"
+ " | ROLE %s [, ...]\n"
+ " | ADMIN %s [, ...]\n"
+ " | USER %s [, ...]\n"
+ " | SYSID %s",
+ _("name"),
+ _("option"),
+ _("where option can be:"),
+ _("connlimit"),
+ _("password"),
+ _("timestamp"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("uid"));
+}
+
+static void
+sql_help_CREATE_USER_MAPPING(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE USER MAPPING [ IF NOT EXISTS ] FOR { %s | USER | CURRENT_ROLE | CURRENT_USER | PUBLIC }\n"
+ " SERVER %s\n"
+ " [ OPTIONS ( %s '%s' [ , ... ] ) ]",
+ _("user_name"),
+ _("server_name"),
+ _("option"),
+ _("value"));
+}
+
+static void
+sql_help_CREATE_VIEW(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW %s [ ( %s [, ...] ) ]\n"
+ " [ WITH ( %s [= %s] [, ... ] ) ]\n"
+ " AS %s\n"
+ " [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]",
+ _("name"),
+ _("column_name"),
+ _("view_option_name"),
+ _("view_option_value"),
+ _("query"));
+}
+
+static void
+sql_help_DEALLOCATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DEALLOCATE [ PREPARE ] { %s | ALL }",
+ _("name"));
+}
+
+static void
+sql_help_DECLARE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DECLARE %s [ BINARY ] [ ASENSITIVE | INSENSITIVE ] [ [ NO ] SCROLL ]\n"
+ " CURSOR [ { WITH | WITHOUT } HOLD ] FOR %s",
+ _("name"),
+ _("query"));
+}
+
+static void
+sql_help_DELETE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "[ WITH [ RECURSIVE ] %s [, ...] ]\n"
+ "DELETE FROM [ ONLY ] %s [ * ] [ [ AS ] %s ]\n"
+ " [ USING %s [, ...] ]\n"
+ " [ WHERE %s | WHERE CURRENT OF %s ]\n"
+ " [ RETURNING * | %s [ [ AS ] %s ] [, ...] ]",
+ _("with_query"),
+ _("table_name"),
+ _("alias"),
+ _("from_item"),
+ _("condition"),
+ _("cursor_name"),
+ _("output_expression"),
+ _("output_name"));
+}
+
+static void
+sql_help_DISCARD(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DISCARD { ALL | PLANS | SEQUENCES | TEMPORARY | TEMP }");
+}
+
+static void
+sql_help_DO(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DO [ LANGUAGE %s ] %s",
+ _("lang_name"),
+ _("code"));
+}
+
+static void
+sql_help_DROP_ACCESS_METHOD(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP ACCESS METHOD [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_AGGREGATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP AGGREGATE [ IF EXISTS ] %s ( %s ) [, ...] [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "* |\n"
+ "[ %s ] [ %s ] %s [ , ... ] |\n"
+ "[ [ %s ] [ %s ] %s [ , ... ] ] ORDER BY [ %s ] [ %s ] %s [ , ... ]",
+ _("name"),
+ _("aggregate_signature"),
+ _("where aggregate_signature is:"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"));
+}
+
+static void
+sql_help_DROP_CAST(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP CAST [ IF EXISTS ] (%s AS %s) [ CASCADE | RESTRICT ]",
+ _("source_type"),
+ _("target_type"));
+}
+
+static void
+sql_help_DROP_COLLATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP COLLATION [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_CONVERSION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP CONVERSION [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_DATABASE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP DATABASE [ IF EXISTS ] %s [ [ WITH ] ( %s [, ...] ) ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " FORCE",
+ _("name"),
+ _("option"),
+ _("where option can be:"));
+}
+
+static void
+sql_help_DROP_DOMAIN(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP DOMAIN [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_EVENT_TRIGGER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP EVENT TRIGGER [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_EXTENSION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP EXTENSION [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_FOREIGN_DATA_WRAPPER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP FOREIGN DATA WRAPPER [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_FOREIGN_TABLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP FOREIGN TABLE [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_FUNCTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP FUNCTION [ IF EXISTS ] %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] [, ...]\n"
+ " [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"));
+}
+
+static void
+sql_help_DROP_GROUP(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP GROUP [ IF EXISTS ] %s [, ...]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_INDEX(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP INDEX [ CONCURRENTLY ] [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_LANGUAGE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP [ PROCEDURAL ] LANGUAGE [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_MATERIALIZED_VIEW(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP MATERIALIZED VIEW [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_OPERATOR(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP OPERATOR [ IF EXISTS ] %s ( { %s | NONE } , %s ) [, ...] [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("left_type"),
+ _("right_type"));
+}
+
+static void
+sql_help_DROP_OPERATOR_CLASS(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP OPERATOR CLASS [ IF EXISTS ] %s USING %s [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("index_method"));
+}
+
+static void
+sql_help_DROP_OPERATOR_FAMILY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP OPERATOR FAMILY [ IF EXISTS ] %s USING %s [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("index_method"));
+}
+
+static void
+sql_help_DROP_OWNED(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP OWNED BY { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER } [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_POLICY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP POLICY [ IF EXISTS ] %s ON %s [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("table_name"));
+}
+
+static void
+sql_help_DROP_PROCEDURE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP PROCEDURE [ IF EXISTS ] %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] [, ...]\n"
+ " [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"));
+}
+
+static void
+sql_help_DROP_PUBLICATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP PUBLICATION [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_ROLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP ROLE [ IF EXISTS ] %s [, ...]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_ROUTINE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP ROUTINE [ IF EXISTS ] %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] [, ...]\n"
+ " [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"));
+}
+
+static void
+sql_help_DROP_RULE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP RULE [ IF EXISTS ] %s ON %s [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("table_name"));
+}
+
+static void
+sql_help_DROP_SCHEMA(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP SCHEMA [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_SEQUENCE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP SEQUENCE [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_SERVER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP SERVER [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_STATISTICS(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP STATISTICS [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_SUBSCRIPTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP SUBSCRIPTION [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_TABLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TABLE [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_TABLESPACE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TABLESPACE [ IF EXISTS ] %s",
+ _("name"));
+}
+
+static void
+sql_help_DROP_TEXT_SEARCH_CONFIGURATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_TEXT_SEARCH_DICTIONARY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_TEXT_SEARCH_PARSER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TEXT SEARCH PARSER [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_TEXT_SEARCH_TEMPLATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TEXT SEARCH TEMPLATE [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_TRANSFORM(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TRANSFORM [ IF EXISTS ] FOR %s LANGUAGE %s [ CASCADE | RESTRICT ]",
+ _("type_name"),
+ _("lang_name"));
+}
+
+static void
+sql_help_DROP_TRIGGER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TRIGGER [ IF EXISTS ] %s ON %s [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("table_name"));
+}
+
+static void
+sql_help_DROP_TYPE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TYPE [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_USER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP USER [ IF EXISTS ] %s [, ...]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_USER_MAPPING(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP USER MAPPING [ IF EXISTS ] FOR { %s | USER | CURRENT_ROLE | CURRENT_USER | PUBLIC } SERVER %s",
+ _("user_name"),
+ _("server_name"));
+}
+
+static void
+sql_help_DROP_VIEW(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP VIEW [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_END(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "END [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]");
+}
+
+static void
+sql_help_EXECUTE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "EXECUTE %s [ ( %s [, ...] ) ]",
+ _("name"),
+ _("parameter"));
+}
+
+static void
+sql_help_EXPLAIN(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "EXPLAIN [ ( %s [, ...] ) ] %s\n"
+ "EXPLAIN [ ANALYZE ] [ VERBOSE ] %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ANALYZE [ %s ]\n"
+ " VERBOSE [ %s ]\n"
+ " COSTS [ %s ]\n"
+ " SETTINGS [ %s ]\n"
+ " BUFFERS [ %s ]\n"
+ " WAL [ %s ]\n"
+ " TIMING [ %s ]\n"
+ " SUMMARY [ %s ]\n"
+ " FORMAT { TEXT | XML | JSON | YAML }",
+ _("option"),
+ _("statement"),
+ _("statement"),
+ _("where option can be one of:"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"));
+}
+
+static void
+sql_help_FETCH(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "FETCH [ %s ] [ FROM | IN ] %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " NEXT\n"
+ " PRIOR\n"
+ " FIRST\n"
+ " LAST\n"
+ " ABSOLUTE %s\n"
+ " RELATIVE %s\n"
+ " %s\n"
+ " ALL\n"
+ " FORWARD\n"
+ " FORWARD %s\n"
+ " FORWARD ALL\n"
+ " BACKWARD\n"
+ " BACKWARD %s\n"
+ " BACKWARD ALL",
+ _("direction"),
+ _("cursor_name"),
+ _("where direction can be one of:"),
+ _("count"),
+ _("count"),
+ _("count"),
+ _("count"),
+ _("count"));
+}
+
+static void
+sql_help_GRANT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }\n"
+ " [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON { [ TABLE ] %s [, ...]\n"
+ " | ALL TABLES IN SCHEMA %s [, ...] }\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( %s [, ...] )\n"
+ " [, ...] | ALL [ PRIVILEGES ] ( %s [, ...] ) }\n"
+ " ON [ TABLE ] %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { { USAGE | SELECT | UPDATE }\n"
+ " [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON { SEQUENCE %s [, ...]\n"
+ " | ALL SEQUENCES IN SCHEMA %s [, ...] }\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON DATABASE %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON DOMAIN %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON FOREIGN DATA WRAPPER %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON FOREIGN SERVER %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { EXECUTE | ALL [ PRIVILEGES ] }\n"
+ " ON { { FUNCTION | PROCEDURE | ROUTINE } %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] [, ...]\n"
+ " | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA %s [, ...] }\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON LANGUAGE %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON LARGE OBJECT %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { { SET | ALTER SYSTEM } [, ... ] | ALL [ PRIVILEGES ] }\n"
+ " ON PARAMETER %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON SCHEMA %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { CREATE | ALL [ PRIVILEGES ] }\n"
+ " ON TABLESPACE %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON TYPE %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT %s [, ...] TO %s [, ...]\n"
+ " [ WITH ADMIN OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " [ GROUP ] %s\n"
+ " | PUBLIC\n"
+ " | CURRENT_ROLE\n"
+ " | CURRENT_USER\n"
+ " | SESSION_USER",
+ _("table_name"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("column_name"),
+ _("column_name"),
+ _("table_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("sequence_name"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("database_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("domain_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("fdw_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("server_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("routine_name"),
+ _("argmode"),
+ _("arg_name"),
+ _("arg_type"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("lang_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("loid"),
+ _("role_specification"),
+ _("role_specification"),
+ _("configuration_parameter"),
+ _("role_specification"),
+ _("role_specification"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("tablespace_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("type_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("role_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("where role_specification can be:"),
+ _("role_name"));
+}
+
+static void
+sql_help_IMPORT_FOREIGN_SCHEMA(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "IMPORT FOREIGN SCHEMA %s\n"
+ " [ { LIMIT TO | EXCEPT } ( %s [, ...] ) ]\n"
+ " FROM SERVER %s\n"
+ " INTO %s\n"
+ " [ OPTIONS ( %s '%s' [, ... ] ) ]",
+ _("remote_schema"),
+ _("table_name"),
+ _("server_name"),
+ _("local_schema"),
+ _("option"),
+ _("value"));
+}
+
+static void
+sql_help_INSERT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "[ WITH [ RECURSIVE ] %s [, ...] ]\n"
+ "INSERT INTO %s [ AS %s ] [ ( %s [, ...] ) ]\n"
+ " [ OVERRIDING { SYSTEM | USER } VALUE ]\n"
+ " { DEFAULT VALUES | VALUES ( { %s | DEFAULT } [, ...] ) [, ...] | %s }\n"
+ " [ ON CONFLICT [ %s ] %s ]\n"
+ " [ RETURNING * | %s [ [ AS ] %s ] [, ...] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ( { %s | ( %s ) } [ COLLATE %s ] [ %s ] [, ...] ) [ WHERE %s ]\n"
+ " ON CONSTRAINT %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " DO NOTHING\n"
+ " DO UPDATE SET { %s = { %s | DEFAULT } |\n"
+ " ( %s [, ...] ) = [ ROW ] ( { %s | DEFAULT } [, ...] ) |\n"
+ " ( %s [, ...] ) = ( %s )\n"
+ " } [, ...]\n"
+ " [ WHERE %s ]",
+ _("with_query"),
+ _("table_name"),
+ _("alias"),
+ _("column_name"),
+ _("expression"),
+ _("query"),
+ _("conflict_target"),
+ _("conflict_action"),
+ _("output_expression"),
+ _("output_name"),
+ _("where conflict_target can be one of:"),
+ _("index_column_name"),
+ _("index_expression"),
+ _("collation"),
+ _("opclass"),
+ _("index_predicate"),
+ _("constraint_name"),
+ _("and conflict_action is one of:"),
+ _("column_name"),
+ _("expression"),
+ _("column_name"),
+ _("expression"),
+ _("column_name"),
+ _("sub-SELECT"),
+ _("condition"));
+}
+
+static void
+sql_help_LISTEN(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "LISTEN %s",
+ _("channel"));
+}
+
+static void
+sql_help_LOAD(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "LOAD '%s'",
+ _("filename"));
+}
+
+static void
+sql_help_LOCK(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "LOCK [ TABLE ] [ ONLY ] %s [ * ] [, ...] [ IN %s MODE ] [ NOWAIT ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE\n"
+ " | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE",
+ _("name"),
+ _("lockmode"),
+ _("where lockmode is one of:"));
+}
+
+static void
+sql_help_MERGE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "[ WITH %s [, ...] ]\n"
+ "MERGE INTO [ ONLY ] %s [ * ] [ [ AS ] %s ]\n"
+ "USING %s ON %s\n"
+ "%s [...]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "{ [ ONLY ] %s [ * ] | ( %s ) } [ [ AS ] %s ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "{ WHEN MATCHED [ AND %s ] THEN { %s | %s | DO NOTHING } |\n"
+ " WHEN NOT MATCHED [ AND %s ] THEN { %s | DO NOTHING } }\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "INSERT [( %s [, ...] )]\n"
+ "[ OVERRIDING { SYSTEM | USER } VALUE ]\n"
+ "{ VALUES ( { %s | DEFAULT } [, ...] ) | DEFAULT VALUES }\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "UPDATE SET { %s = { %s | DEFAULT } |\n"
+ " ( %s [, ...] ) = ( { %s | DEFAULT } [, ...] ) } [, ...]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "DELETE",
+ _("with_query"),
+ _("target_table_name"),
+ _("target_alias"),
+ _("data_source"),
+ _("join_condition"),
+ _("when_clause"),
+ _("where data_source is:"),
+ _("source_table_name"),
+ _("source_query"),
+ _("source_alias"),
+ _("and when_clause is:"),
+ _("condition"),
+ _("merge_update"),
+ _("merge_delete"),
+ _("condition"),
+ _("merge_insert"),
+ _("and merge_insert is:"),
+ _("column_name"),
+ _("expression"),
+ _("and merge_update is:"),
+ _("column_name"),
+ _("expression"),
+ _("column_name"),
+ _("expression"),
+ _("and merge_delete is:"));
+}
+
+static void
+sql_help_MOVE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "MOVE [ %s ] [ FROM | IN ] %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " NEXT\n"
+ " PRIOR\n"
+ " FIRST\n"
+ " LAST\n"
+ " ABSOLUTE %s\n"
+ " RELATIVE %s\n"
+ " %s\n"
+ " ALL\n"
+ " FORWARD\n"
+ " FORWARD %s\n"
+ " FORWARD ALL\n"
+ " BACKWARD\n"
+ " BACKWARD %s\n"
+ " BACKWARD ALL",
+ _("direction"),
+ _("cursor_name"),
+ _("where direction can be one of:"),
+ _("count"),
+ _("count"),
+ _("count"),
+ _("count"),
+ _("count"));
+}
+
+static void
+sql_help_NOTIFY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "NOTIFY %s [ , %s ]",
+ _("channel"),
+ _("payload"));
+}
+
+static void
+sql_help_PREPARE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "PREPARE %s [ ( %s [, ...] ) ] AS %s",
+ _("name"),
+ _("data_type"),
+ _("statement"));
+}
+
+static void
+sql_help_PREPARE_TRANSACTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "PREPARE TRANSACTION %s",
+ _("transaction_id"));
+}
+
+static void
+sql_help_REASSIGN_OWNED(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "REASSIGN OWNED BY { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER } [, ...]\n"
+ " TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }",
+ _("old_role"),
+ _("new_role"));
+}
+
+static void
+sql_help_REFRESH_MATERIALIZED_VIEW(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] %s\n"
+ " [ WITH [ NO ] DATA ]",
+ _("name"));
+}
+
+static void
+sql_help_REINDEX(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "REINDEX [ ( %s [, ...] ) ] { INDEX | TABLE | SCHEMA | DATABASE | SYSTEM } [ CONCURRENTLY ] %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " CONCURRENTLY [ %s ]\n"
+ " TABLESPACE %s\n"
+ " VERBOSE [ %s ]",
+ _("option"),
+ _("name"),
+ _("where option can be one of:"),
+ _("boolean"),
+ _("new_tablespace"),
+ _("boolean"));
+}
+
+static void
+sql_help_RELEASE_SAVEPOINT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "RELEASE [ SAVEPOINT ] %s",
+ _("savepoint_name"));
+}
+
+static void
+sql_help_RESET(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "RESET %s\n"
+ "RESET ALL",
+ _("configuration_parameter"));
+}
+
+static void
+sql_help_REVOKE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }\n"
+ " [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON { [ TABLE ] %s [, ...]\n"
+ " | ALL TABLES IN SCHEMA %s [, ...] }\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { SELECT | INSERT | UPDATE | REFERENCES } ( %s [, ...] )\n"
+ " [, ...] | ALL [ PRIVILEGES ] ( %s [, ...] ) }\n"
+ " ON [ TABLE ] %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { USAGE | SELECT | UPDATE }\n"
+ " [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON { SEQUENCE %s [, ...]\n"
+ " | ALL SEQUENCES IN SCHEMA %s [, ...] }\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON DATABASE %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON DOMAIN %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON FOREIGN DATA WRAPPER %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON FOREIGN SERVER %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { EXECUTE | ALL [ PRIVILEGES ] }\n"
+ " ON { { FUNCTION | PROCEDURE | ROUTINE } %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] [, ...]\n"
+ " | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA %s [, ...] }\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON LANGUAGE %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON LARGE OBJECT %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { SET | ALTER SYSTEM } [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON PARAMETER %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON SCHEMA %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { CREATE | ALL [ PRIVILEGES ] }\n"
+ " ON TABLESPACE %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON TYPE %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ ADMIN OPTION FOR ]\n"
+ " %s [, ...] FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " [ GROUP ] %s\n"
+ " | PUBLIC\n"
+ " | CURRENT_ROLE\n"
+ " | CURRENT_USER\n"
+ " | SESSION_USER",
+ _("table_name"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("column_name"),
+ _("column_name"),
+ _("table_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("sequence_name"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("database_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("domain_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("fdw_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("server_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("function_name"),
+ _("argmode"),
+ _("arg_name"),
+ _("arg_type"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("lang_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("loid"),
+ _("role_specification"),
+ _("role_specification"),
+ _("configuration_parameter"),
+ _("role_specification"),
+ _("role_specification"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("tablespace_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("type_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("role_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("where role_specification can be:"),
+ _("role_name"));
+}
+
+static void
+sql_help_ROLLBACK(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ROLLBACK [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]");
+}
+
+static void
+sql_help_ROLLBACK_PREPARED(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ROLLBACK PREPARED %s",
+ _("transaction_id"));
+}
+
+static void
+sql_help_ROLLBACK_TO_SAVEPOINT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] %s",
+ _("savepoint_name"));
+}
+
+static void
+sql_help_SAVEPOINT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "SAVEPOINT %s",
+ _("savepoint_name"));
+}
+
+static void
+sql_help_SECURITY_LABEL(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "SECURITY LABEL [ FOR %s ] ON\n"
+ "{\n"
+ " TABLE %s |\n"
+ " COLUMN %s.%s |\n"
+ " AGGREGATE %s ( %s ) |\n"
+ " DATABASE %s |\n"
+ " DOMAIN %s |\n"
+ " EVENT TRIGGER %s |\n"
+ " FOREIGN TABLE %s\n"
+ " FUNCTION %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " LARGE OBJECT %s |\n"
+ " MATERIALIZED VIEW %s |\n"
+ " [ PROCEDURAL ] LANGUAGE %s |\n"
+ " PROCEDURE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " PUBLICATION %s |\n"
+ " ROLE %s |\n"
+ " ROUTINE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " SCHEMA %s |\n"
+ " SEQUENCE %s |\n"
+ " SUBSCRIPTION %s |\n"
+ " TABLESPACE %s |\n"
+ " TYPE %s |\n"
+ " VIEW %s\n"
+ "} IS { %s | NULL }\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "* |\n"
+ "[ %s ] [ %s ] %s [ , ... ] |\n"
+ "[ [ %s ] [ %s ] %s [ , ... ] ] ORDER BY [ %s ] [ %s ] %s [ , ... ]",
+ _("provider"),
+ _("object_name"),
+ _("table_name"),
+ _("column_name"),
+ _("aggregate_name"),
+ _("aggregate_signature"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("function_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("large_object_oid"),
+ _("object_name"),
+ _("object_name"),
+ _("procedure_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("object_name"),
+ _("object_name"),
+ _("routine_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("string_literal"),
+ _("where aggregate_signature is:"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"));
+}
+
+static void
+sql_help_SELECT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "[ WITH [ RECURSIVE ] %s [, ...] ]\n"
+ "SELECT [ ALL | DISTINCT [ ON ( %s [, ...] ) ] ]\n"
+ " [ * | %s [ [ AS ] %s ] [, ...] ]\n"
+ " [ FROM %s [, ...] ]\n"
+ " [ WHERE %s ]\n"
+ " [ GROUP BY [ ALL | DISTINCT ] %s [, ...] ]\n"
+ " [ HAVING %s ]\n"
+ " [ WINDOW %s AS ( %s ) [, ...] ]\n"
+ " [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] %s ]\n"
+ " [ ORDER BY %s [ ASC | DESC | USING %s ] [ NULLS { FIRST | LAST } ] [, ...] ]\n"
+ " [ LIMIT { %s | ALL } ]\n"
+ " [ OFFSET %s [ ROW | ROWS ] ]\n"
+ " [ FETCH { FIRST | NEXT } [ %s ] { ROW | ROWS } { ONLY | WITH TIES } ]\n"
+ " [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF %s [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " [ ONLY ] %s [ * ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ TABLESAMPLE %s ( %s [, ...] ) [ REPEATABLE ( %s ) ] ]\n"
+ " [ LATERAL ] ( %s ) [ AS ] %s [ ( %s [, ...] ) ]\n"
+ " %s [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] )\n"
+ " [ WITH ORDINALITY ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] ) [ AS ] %s ( %s [, ...] )\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] ) AS ( %s [, ...] )\n"
+ " [ LATERAL ] ROWS FROM( %s ( [ %s [, ...] ] ) [ AS ( %s [, ...] ) ] [, ...] )\n"
+ " [ WITH ORDINALITY ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " %s %s %s { ON %s | USING ( %s [, ...] ) [ AS %s ] }\n"
+ " %s NATURAL %s %s\n"
+ " %s CROSS JOIN %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ( )\n"
+ " %s\n"
+ " ( %s [, ...] )\n"
+ " ROLLUP ( { %s | ( %s [, ...] ) } [, ...] )\n"
+ " CUBE ( { %s | ( %s [, ...] ) } [, ...] )\n"
+ " GROUPING SETS ( %s [, ...] )\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s [ ( %s [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( %s | %s | %s | %s | %s )\n"
+ " [ SEARCH { BREADTH | DEPTH } FIRST BY %s [, ...] SET %s ]\n"
+ " [ CYCLE %s [, ...] SET %s [ TO %s DEFAULT %s ] USING %s ]\n"
+ "\n"
+ "TABLE [ ONLY ] %s [ * ]",
+ _("with_query"),
+ _("expression"),
+ _("expression"),
+ _("output_name"),
+ _("from_item"),
+ _("condition"),
+ _("grouping_element"),
+ _("condition"),
+ _("window_name"),
+ _("window_definition"),
+ _("select"),
+ _("expression"),
+ _("operator"),
+ _("count"),
+ _("start"),
+ _("count"),
+ _("table_name"),
+ _("where from_item can be one of:"),
+ _("table_name"),
+ _("alias"),
+ _("column_alias"),
+ _("sampling_method"),
+ _("argument"),
+ _("seed"),
+ _("select"),
+ _("alias"),
+ _("column_alias"),
+ _("with_query_name"),
+ _("alias"),
+ _("column_alias"),
+ _("function_name"),
+ _("argument"),
+ _("alias"),
+ _("column_alias"),
+ _("function_name"),
+ _("argument"),
+ _("alias"),
+ _("column_definition"),
+ _("function_name"),
+ _("argument"),
+ _("column_definition"),
+ _("function_name"),
+ _("argument"),
+ _("column_definition"),
+ _("alias"),
+ _("column_alias"),
+ _("from_item"),
+ _("join_type"),
+ _("from_item"),
+ _("join_condition"),
+ _("join_column"),
+ _("join_using_alias"),
+ _("from_item"),
+ _("join_type"),
+ _("from_item"),
+ _("from_item"),
+ _("from_item"),
+ _("and grouping_element can be one of:"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("grouping_element"),
+ _("and with_query is:"),
+ _("with_query_name"),
+ _("column_name"),
+ _("select"),
+ _("values"),
+ _("insert"),
+ _("update"),
+ _("delete"),
+ _("column_name"),
+ _("search_seq_col_name"),
+ _("column_name"),
+ _("cycle_mark_col_name"),
+ _("cycle_mark_value"),
+ _("cycle_mark_default"),
+ _("cycle_path_col_name"),
+ _("table_name"));
+}
+
+static void
+sql_help_SELECT_INTO(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "[ WITH [ RECURSIVE ] %s [, ...] ]\n"
+ "SELECT [ ALL | DISTINCT [ ON ( %s [, ...] ) ] ]\n"
+ " * | %s [ [ AS ] %s ] [, ...]\n"
+ " INTO [ TEMPORARY | TEMP | UNLOGGED ] [ TABLE ] %s\n"
+ " [ FROM %s [, ...] ]\n"
+ " [ WHERE %s ]\n"
+ " [ GROUP BY %s [, ...] ]\n"
+ " [ HAVING %s ]\n"
+ " [ WINDOW %s AS ( %s ) [, ...] ]\n"
+ " [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] %s ]\n"
+ " [ ORDER BY %s [ ASC | DESC | USING %s ] [ NULLS { FIRST | LAST } ] [, ...] ]\n"
+ " [ LIMIT { %s | ALL } ]\n"
+ " [ OFFSET %s [ ROW | ROWS ] ]\n"
+ " [ FETCH { FIRST | NEXT } [ %s ] { ROW | ROWS } ONLY ]\n"
+ " [ FOR { UPDATE | SHARE } [ OF %s [, ...] ] [ NOWAIT ] [...] ]",
+ _("with_query"),
+ _("expression"),
+ _("expression"),
+ _("output_name"),
+ _("new_table"),
+ _("from_item"),
+ _("condition"),
+ _("expression"),
+ _("condition"),
+ _("window_name"),
+ _("window_definition"),
+ _("select"),
+ _("expression"),
+ _("operator"),
+ _("count"),
+ _("start"),
+ _("count"),
+ _("table_name"));
+}
+
+static void
+sql_help_SET(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "SET [ SESSION | LOCAL ] %s { TO | = } { %s | '%s' | DEFAULT }\n"
+ "SET [ SESSION | LOCAL ] TIME ZONE { %s | '%s' | LOCAL | DEFAULT }",
+ _("configuration_parameter"),
+ _("value"),
+ _("value"),
+ _("value"),
+ _("value"));
+}
+
+static void
+sql_help_SET_CONSTRAINTS(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "SET CONSTRAINTS { ALL | %s [, ...] } { DEFERRED | IMMEDIATE }",
+ _("name"));
+}
+
+static void
+sql_help_SET_ROLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "SET [ SESSION | LOCAL ] ROLE %s\n"
+ "SET [ SESSION | LOCAL ] ROLE NONE\n"
+ "RESET ROLE",
+ _("role_name"));
+}
+
+static void
+sql_help_SET_SESSION_AUTHORIZATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "SET [ SESSION | LOCAL ] SESSION AUTHORIZATION %s\n"
+ "SET [ SESSION | LOCAL ] SESSION AUTHORIZATION DEFAULT\n"
+ "RESET SESSION AUTHORIZATION",
+ _("user_name"));
+}
+
+static void
+sql_help_SET_TRANSACTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "SET TRANSACTION %s [, ...]\n"
+ "SET TRANSACTION SNAPSHOT %s\n"
+ "SET SESSION CHARACTERISTICS AS TRANSACTION %s [, ...]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n"
+ " READ WRITE | READ ONLY\n"
+ " [ NOT ] DEFERRABLE",
+ _("transaction_mode"),
+ _("snapshot_id"),
+ _("transaction_mode"),
+ _("where transaction_mode is one of:"));
+}
+
+static void
+sql_help_SHOW(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "SHOW %s\n"
+ "SHOW ALL",
+ _("name"));
+}
+
+static void
+sql_help_START_TRANSACTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "START TRANSACTION [ %s [, ...] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n"
+ " READ WRITE | READ ONLY\n"
+ " [ NOT ] DEFERRABLE",
+ _("transaction_mode"),
+ _("where transaction_mode is one of:"));
+}
+
+static void
+sql_help_TABLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "[ WITH [ RECURSIVE ] %s [, ...] ]\n"
+ "SELECT [ ALL | DISTINCT [ ON ( %s [, ...] ) ] ]\n"
+ " [ * | %s [ [ AS ] %s ] [, ...] ]\n"
+ " [ FROM %s [, ...] ]\n"
+ " [ WHERE %s ]\n"
+ " [ GROUP BY [ ALL | DISTINCT ] %s [, ...] ]\n"
+ " [ HAVING %s ]\n"
+ " [ WINDOW %s AS ( %s ) [, ...] ]\n"
+ " [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] %s ]\n"
+ " [ ORDER BY %s [ ASC | DESC | USING %s ] [ NULLS { FIRST | LAST } ] [, ...] ]\n"
+ " [ LIMIT { %s | ALL } ]\n"
+ " [ OFFSET %s [ ROW | ROWS ] ]\n"
+ " [ FETCH { FIRST | NEXT } [ %s ] { ROW | ROWS } { ONLY | WITH TIES } ]\n"
+ " [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF %s [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " [ ONLY ] %s [ * ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ TABLESAMPLE %s ( %s [, ...] ) [ REPEATABLE ( %s ) ] ]\n"
+ " [ LATERAL ] ( %s ) [ AS ] %s [ ( %s [, ...] ) ]\n"
+ " %s [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] )\n"
+ " [ WITH ORDINALITY ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] ) [ AS ] %s ( %s [, ...] )\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] ) AS ( %s [, ...] )\n"
+ " [ LATERAL ] ROWS FROM( %s ( [ %s [, ...] ] ) [ AS ( %s [, ...] ) ] [, ...] )\n"
+ " [ WITH ORDINALITY ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " %s %s %s { ON %s | USING ( %s [, ...] ) [ AS %s ] }\n"
+ " %s NATURAL %s %s\n"
+ " %s CROSS JOIN %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ( )\n"
+ " %s\n"
+ " ( %s [, ...] )\n"
+ " ROLLUP ( { %s | ( %s [, ...] ) } [, ...] )\n"
+ " CUBE ( { %s | ( %s [, ...] ) } [, ...] )\n"
+ " GROUPING SETS ( %s [, ...] )\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s [ ( %s [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( %s | %s | %s | %s | %s )\n"
+ " [ SEARCH { BREADTH | DEPTH } FIRST BY %s [, ...] SET %s ]\n"
+ " [ CYCLE %s [, ...] SET %s [ TO %s DEFAULT %s ] USING %s ]\n"
+ "\n"
+ "TABLE [ ONLY ] %s [ * ]",
+ _("with_query"),
+ _("expression"),
+ _("expression"),
+ _("output_name"),
+ _("from_item"),
+ _("condition"),
+ _("grouping_element"),
+ _("condition"),
+ _("window_name"),
+ _("window_definition"),
+ _("select"),
+ _("expression"),
+ _("operator"),
+ _("count"),
+ _("start"),
+ _("count"),
+ _("table_name"),
+ _("where from_item can be one of:"),
+ _("table_name"),
+ _("alias"),
+ _("column_alias"),
+ _("sampling_method"),
+ _("argument"),
+ _("seed"),
+ _("select"),
+ _("alias"),
+ _("column_alias"),
+ _("with_query_name"),
+ _("alias"),
+ _("column_alias"),
+ _("function_name"),
+ _("argument"),
+ _("alias"),
+ _("column_alias"),
+ _("function_name"),
+ _("argument"),
+ _("alias"),
+ _("column_definition"),
+ _("function_name"),
+ _("argument"),
+ _("column_definition"),
+ _("function_name"),
+ _("argument"),
+ _("column_definition"),
+ _("alias"),
+ _("column_alias"),
+ _("from_item"),
+ _("join_type"),
+ _("from_item"),
+ _("join_condition"),
+ _("join_column"),
+ _("join_using_alias"),
+ _("from_item"),
+ _("join_type"),
+ _("from_item"),
+ _("from_item"),
+ _("from_item"),
+ _("and grouping_element can be one of:"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("grouping_element"),
+ _("and with_query is:"),
+ _("with_query_name"),
+ _("column_name"),
+ _("select"),
+ _("values"),
+ _("insert"),
+ _("update"),
+ _("delete"),
+ _("column_name"),
+ _("search_seq_col_name"),
+ _("column_name"),
+ _("cycle_mark_col_name"),
+ _("cycle_mark_value"),
+ _("cycle_mark_default"),
+ _("cycle_path_col_name"),
+ _("table_name"));
+}
+
+static void
+sql_help_TRUNCATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "TRUNCATE [ TABLE ] [ ONLY ] %s [ * ] [, ... ]\n"
+ " [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_UNLISTEN(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "UNLISTEN { %s | * }",
+ _("channel"));
+}
+
+static void
+sql_help_UPDATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "[ WITH [ RECURSIVE ] %s [, ...] ]\n"
+ "UPDATE [ ONLY ] %s [ * ] [ [ AS ] %s ]\n"
+ " SET { %s = { %s | DEFAULT } |\n"
+ " ( %s [, ...] ) = [ ROW ] ( { %s | DEFAULT } [, ...] ) |\n"
+ " ( %s [, ...] ) = ( %s )\n"
+ " } [, ...]\n"
+ " [ FROM %s [, ...] ]\n"
+ " [ WHERE %s | WHERE CURRENT OF %s ]\n"
+ " [ RETURNING * | %s [ [ AS ] %s ] [, ...] ]",
+ _("with_query"),
+ _("table_name"),
+ _("alias"),
+ _("column_name"),
+ _("expression"),
+ _("column_name"),
+ _("expression"),
+ _("column_name"),
+ _("sub-SELECT"),
+ _("from_item"),
+ _("condition"),
+ _("cursor_name"),
+ _("output_expression"),
+ _("output_name"));
+}
+
+static void
+sql_help_VACUUM(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "VACUUM [ ( %s [, ...] ) ] [ %s [, ...] ]\n"
+ "VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ %s [, ...] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " FULL [ %s ]\n"
+ " FREEZE [ %s ]\n"
+ " VERBOSE [ %s ]\n"
+ " ANALYZE [ %s ]\n"
+ " DISABLE_PAGE_SKIPPING [ %s ]\n"
+ " SKIP_LOCKED [ %s ]\n"
+ " INDEX_CLEANUP { AUTO | ON | OFF }\n"
+ " PROCESS_TOAST [ %s ]\n"
+ " TRUNCATE [ %s ]\n"
+ " PARALLEL %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s [ ( %s [, ...] ) ]",
+ _("option"),
+ _("table_and_columns"),
+ _("table_and_columns"),
+ _("where option can be one of:"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("integer"),
+ _("and table_and_columns is:"),
+ _("table_name"),
+ _("column_name"));
+}
+
+static void
+sql_help_VALUES(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "VALUES ( %s [, ...] ) [, ...]\n"
+ " [ ORDER BY %s [ ASC | DESC | USING %s ] [, ...] ]\n"
+ " [ LIMIT { %s | ALL } ]\n"
+ " [ OFFSET %s [ ROW | ROWS ] ]\n"
+ " [ FETCH { FIRST | NEXT } [ %s ] { ROW | ROWS } ONLY ]",
+ _("expression"),
+ _("sort_expression"),
+ _("operator"),
+ _("count"),
+ _("start"),
+ _("count"));
+}
+
+static void
+sql_help_WITH(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "[ WITH [ RECURSIVE ] %s [, ...] ]\n"
+ "SELECT [ ALL | DISTINCT [ ON ( %s [, ...] ) ] ]\n"
+ " [ * | %s [ [ AS ] %s ] [, ...] ]\n"
+ " [ FROM %s [, ...] ]\n"
+ " [ WHERE %s ]\n"
+ " [ GROUP BY [ ALL | DISTINCT ] %s [, ...] ]\n"
+ " [ HAVING %s ]\n"
+ " [ WINDOW %s AS ( %s ) [, ...] ]\n"
+ " [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] %s ]\n"
+ " [ ORDER BY %s [ ASC | DESC | USING %s ] [ NULLS { FIRST | LAST } ] [, ...] ]\n"
+ " [ LIMIT { %s | ALL } ]\n"
+ " [ OFFSET %s [ ROW | ROWS ] ]\n"
+ " [ FETCH { FIRST | NEXT } [ %s ] { ROW | ROWS } { ONLY | WITH TIES } ]\n"
+ " [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF %s [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " [ ONLY ] %s [ * ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ TABLESAMPLE %s ( %s [, ...] ) [ REPEATABLE ( %s ) ] ]\n"
+ " [ LATERAL ] ( %s ) [ AS ] %s [ ( %s [, ...] ) ]\n"
+ " %s [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] )\n"
+ " [ WITH ORDINALITY ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] ) [ AS ] %s ( %s [, ...] )\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] ) AS ( %s [, ...] )\n"
+ " [ LATERAL ] ROWS FROM( %s ( [ %s [, ...] ] ) [ AS ( %s [, ...] ) ] [, ...] )\n"
+ " [ WITH ORDINALITY ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " %s %s %s { ON %s | USING ( %s [, ...] ) [ AS %s ] }\n"
+ " %s NATURAL %s %s\n"
+ " %s CROSS JOIN %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ( )\n"
+ " %s\n"
+ " ( %s [, ...] )\n"
+ " ROLLUP ( { %s | ( %s [, ...] ) } [, ...] )\n"
+ " CUBE ( { %s | ( %s [, ...] ) } [, ...] )\n"
+ " GROUPING SETS ( %s [, ...] )\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s [ ( %s [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( %s | %s | %s | %s | %s )\n"
+ " [ SEARCH { BREADTH | DEPTH } FIRST BY %s [, ...] SET %s ]\n"
+ " [ CYCLE %s [, ...] SET %s [ TO %s DEFAULT %s ] USING %s ]\n"
+ "\n"
+ "TABLE [ ONLY ] %s [ * ]",
+ _("with_query"),
+ _("expression"),
+ _("expression"),
+ _("output_name"),
+ _("from_item"),
+ _("condition"),
+ _("grouping_element"),
+ _("condition"),
+ _("window_name"),
+ _("window_definition"),
+ _("select"),
+ _("expression"),
+ _("operator"),
+ _("count"),
+ _("start"),
+ _("count"),
+ _("table_name"),
+ _("where from_item can be one of:"),
+ _("table_name"),
+ _("alias"),
+ _("column_alias"),
+ _("sampling_method"),
+ _("argument"),
+ _("seed"),
+ _("select"),
+ _("alias"),
+ _("column_alias"),
+ _("with_query_name"),
+ _("alias"),
+ _("column_alias"),
+ _("function_name"),
+ _("argument"),
+ _("alias"),
+ _("column_alias"),
+ _("function_name"),
+ _("argument"),
+ _("alias"),
+ _("column_definition"),
+ _("function_name"),
+ _("argument"),
+ _("column_definition"),
+ _("function_name"),
+ _("argument"),
+ _("column_definition"),
+ _("alias"),
+ _("column_alias"),
+ _("from_item"),
+ _("join_type"),
+ _("from_item"),
+ _("join_condition"),
+ _("join_column"),
+ _("join_using_alias"),
+ _("from_item"),
+ _("join_type"),
+ _("from_item"),
+ _("from_item"),
+ _("from_item"),
+ _("and grouping_element can be one of:"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("grouping_element"),
+ _("and with_query is:"),
+ _("with_query_name"),
+ _("column_name"),
+ _("select"),
+ _("values"),
+ _("insert"),
+ _("update"),
+ _("delete"),
+ _("column_name"),
+ _("search_seq_col_name"),
+ _("column_name"),
+ _("cycle_mark_col_name"),
+ _("cycle_mark_value"),
+ _("cycle_mark_default"),
+ _("cycle_path_col_name"),
+ _("table_name"));
+}
+
+
+const struct _helpStruct QL_HELP[] = {
+ {"ABORT",
+ N_("abort the current transaction"),
+ "sql-abort",
+ sql_help_ABORT,
+ 0},
+
+ {"ALTER AGGREGATE",
+ N_("change the definition of an aggregate function"),
+ "sql-alteraggregate",
+ sql_help_ALTER_AGGREGATE,
+ 9},
+
+ {"ALTER COLLATION",
+ N_("change the definition of a collation"),
+ "sql-altercollation",
+ sql_help_ALTER_COLLATION,
+ 4},
+
+ {"ALTER CONVERSION",
+ N_("change the definition of a conversion"),
+ "sql-alterconversion",
+ sql_help_ALTER_CONVERSION,
+ 2},
+
+ {"ALTER DATABASE",
+ N_("change a database"),
+ "sql-alterdatabase",
+ sql_help_ALTER_DATABASE,
+ 19},
+
+ {"ALTER DEFAULT PRIVILEGES",
+ N_("define default access privileges"),
+ "sql-alterdefaultprivileges",
+ sql_help_ALTER_DEFAULT_PRIVILEGES,
+ 59},
+
+ {"ALTER DOMAIN",
+ N_("change the definition of a domain"),
+ "sql-alterdomain",
+ sql_help_ALTER_DOMAIN,
+ 17},
+
+ {"ALTER EVENT TRIGGER",
+ N_("change the definition of an event trigger"),
+ "sql-altereventtrigger",
+ sql_help_ALTER_EVENT_TRIGGER,
+ 3},
+
+ {"ALTER EXTENSION",
+ N_("change the definition of an extension"),
+ "sql-alterextension",
+ sql_help_ALTER_EXTENSION,
+ 40},
+
+ {"ALTER FOREIGN DATA WRAPPER",
+ N_("change the definition of a foreign-data wrapper"),
+ "sql-alterforeigndatawrapper",
+ sql_help_ALTER_FOREIGN_DATA_WRAPPER,
+ 5},
+
+ {"ALTER FOREIGN TABLE",
+ N_("change the definition of a foreign table"),
+ "sql-alterforeigntable",
+ sql_help_ALTER_FOREIGN_TABLE,
+ 33},
+
+ {"ALTER FUNCTION",
+ N_("change the definition of a function"),
+ "sql-alterfunction",
+ sql_help_ALTER_FUNCTION,
+ 24},
+
+ {"ALTER GROUP",
+ N_("change role name or membership"),
+ "sql-altergroup",
+ sql_help_ALTER_GROUP,
+ 10},
+
+ {"ALTER INDEX",
+ N_("change the definition of an index"),
+ "sql-alterindex",
+ sql_help_ALTER_INDEX,
+ 9},
+
+ {"ALTER LANGUAGE",
+ N_("change the definition of a procedural language"),
+ "sql-alterlanguage",
+ sql_help_ALTER_LANGUAGE,
+ 1},
+
+ {"ALTER LARGE OBJECT",
+ N_("change the definition of a large object"),
+ "sql-alterlargeobject",
+ sql_help_ALTER_LARGE_OBJECT,
+ 0},
+
+ {"ALTER MATERIALIZED VIEW",
+ N_("change the definition of a materialized view"),
+ "sql-altermaterializedview",
+ sql_help_ALTER_MATERIALIZED_VIEW,
+ 26},
+
+ {"ALTER OPERATOR",
+ N_("change the definition of an operator"),
+ "sql-alteroperator",
+ sql_help_ALTER_OPERATOR,
+ 9},
+
+ {"ALTER OPERATOR CLASS",
+ N_("change the definition of an operator class"),
+ "sql-alteropclass",
+ sql_help_ALTER_OPERATOR_CLASS,
+ 7},
+
+ {"ALTER OPERATOR FAMILY",
+ N_("change the definition of an operator family"),
+ "sql-alteropfamily",
+ sql_help_ALTER_OPERATOR_FAMILY,
+ 19},
+
+ {"ALTER POLICY",
+ N_("change the definition of a row-level security policy"),
+ "sql-alterpolicy",
+ sql_help_ALTER_POLICY,
+ 5},
+
+ {"ALTER PROCEDURE",
+ N_("change the definition of a procedure"),
+ "sql-alterprocedure",
+ sql_help_ALTER_PROCEDURE,
+ 17},
+
+ {"ALTER PUBLICATION",
+ N_("change the definition of a publication"),
+ "sql-alterpublication",
+ sql_help_ALTER_PUBLICATION,
+ 10},
+
+ {"ALTER ROLE",
+ N_("change a database role"),
+ "sql-alterrole",
+ sql_help_ALTER_ROLE,
+ 27},
+
+ {"ALTER ROUTINE",
+ N_("change the definition of a routine"),
+ "sql-alterroutine",
+ sql_help_ALTER_ROUTINE,
+ 22},
+
+ {"ALTER RULE",
+ N_("change the definition of a rule"),
+ "sql-alterrule",
+ sql_help_ALTER_RULE,
+ 0},
+
+ {"ALTER SCHEMA",
+ N_("change the definition of a schema"),
+ "sql-alterschema",
+ sql_help_ALTER_SCHEMA,
+ 1},
+
+ {"ALTER SEQUENCE",
+ N_("change the definition of a sequence generator"),
+ "sql-altersequence",
+ sql_help_ALTER_SEQUENCE,
+ 11},
+
+ {"ALTER SERVER",
+ N_("change the definition of a foreign server"),
+ "sql-alterserver",
+ sql_help_ALTER_SERVER,
+ 3},
+
+ {"ALTER STATISTICS",
+ N_("change the definition of an extended statistics object"),
+ "sql-alterstatistics",
+ sql_help_ALTER_STATISTICS,
+ 3},
+
+ {"ALTER SUBSCRIPTION",
+ N_("change the definition of a subscription"),
+ "sql-altersubscription",
+ sql_help_ALTER_SUBSCRIPTION,
+ 10},
+
+ {"ALTER SYSTEM",
+ N_("change a server configuration parameter"),
+ "sql-altersystem",
+ sql_help_ALTER_SYSTEM,
+ 3},
+
+ {"ALTER TABLE",
+ N_("change the definition of a table"),
+ "sql-altertable",
+ sql_help_ALTER_TABLE,
+ 117},
+
+ {"ALTER TABLESPACE",
+ N_("change the definition of a tablespace"),
+ "sql-altertablespace",
+ sql_help_ALTER_TABLESPACE,
+ 3},
+
+ {"ALTER TEXT SEARCH CONFIGURATION",
+ N_("change the definition of a text search configuration"),
+ "sql-altertsconfig",
+ sql_help_ALTER_TEXT_SEARCH_CONFIGURATION,
+ 12},
+
+ {"ALTER TEXT SEARCH DICTIONARY",
+ N_("change the definition of a text search dictionary"),
+ "sql-altertsdictionary",
+ sql_help_ALTER_TEXT_SEARCH_DICTIONARY,
+ 5},
+
+ {"ALTER TEXT SEARCH PARSER",
+ N_("change the definition of a text search parser"),
+ "sql-altertsparser",
+ sql_help_ALTER_TEXT_SEARCH_PARSER,
+ 1},
+
+ {"ALTER TEXT SEARCH TEMPLATE",
+ N_("change the definition of a text search template"),
+ "sql-altertstemplate",
+ sql_help_ALTER_TEXT_SEARCH_TEMPLATE,
+ 1},
+
+ {"ALTER TRIGGER",
+ N_("change the definition of a trigger"),
+ "sql-altertrigger",
+ sql_help_ALTER_TRIGGER,
+ 1},
+
+ {"ALTER TYPE",
+ N_("change the definition of a type"),
+ "sql-altertype",
+ sql_help_ALTER_TYPE,
+ 13},
+
+ {"ALTER USER",
+ N_("change a database role"),
+ "sql-alteruser",
+ sql_help_ALTER_USER,
+ 27},
+
+ {"ALTER USER MAPPING",
+ N_("change the definition of a user mapping"),
+ "sql-alterusermapping",
+ sql_help_ALTER_USER_MAPPING,
+ 2},
+
+ {"ALTER VIEW",
+ N_("change the definition of a view"),
+ "sql-alterview",
+ sql_help_ALTER_VIEW,
+ 7},
+
+ {"ANALYZE",
+ N_("collect statistics about a database"),
+ "sql-analyze",
+ sql_help_ANALYZE,
+ 10},
+
+ {"BEGIN",
+ N_("start a transaction block"),
+ "sql-begin",
+ sql_help_BEGIN,
+ 6},
+
+ {"CALL",
+ N_("invoke a procedure"),
+ "sql-call",
+ sql_help_CALL,
+ 0},
+
+ {"CHECKPOINT",
+ N_("force a write-ahead log checkpoint"),
+ "sql-checkpoint",
+ sql_help_CHECKPOINT,
+ 0},
+
+ {"CLOSE",
+ N_("close a cursor"),
+ "sql-close",
+ sql_help_CLOSE,
+ 0},
+
+ {"CLUSTER",
+ N_("cluster a table according to an index"),
+ "sql-cluster",
+ sql_help_CLUSTER,
+ 6},
+
+ {"COMMENT",
+ N_("define or change the comment of an object"),
+ "sql-comment",
+ sql_help_COMMENT,
+ 51},
+
+ {"COMMIT",
+ N_("commit the current transaction"),
+ "sql-commit",
+ sql_help_COMMIT,
+ 0},
+
+ {"COMMIT PREPARED",
+ N_("commit a transaction that was earlier prepared for two-phase commit"),
+ "sql-commit-prepared",
+ sql_help_COMMIT_PREPARED,
+ 0},
+
+ {"COPY",
+ N_("copy data between a file and a table"),
+ "sql-copy",
+ sql_help_COPY,
+ 21},
+
+ {"CREATE ACCESS METHOD",
+ N_("define a new access method"),
+ "sql-create-access-method",
+ sql_help_CREATE_ACCESS_METHOD,
+ 2},
+
+ {"CREATE AGGREGATE",
+ N_("define a new aggregate function"),
+ "sql-createaggregate",
+ sql_help_CREATE_AGGREGATE,
+ 59},
+
+ {"CREATE CAST",
+ N_("define a new cast"),
+ "sql-createcast",
+ sql_help_CREATE_CAST,
+ 10},
+
+ {"CREATE COLLATION",
+ N_("define a new collation"),
+ "sql-createcollation",
+ sql_help_CREATE_COLLATION,
+ 8},
+
+ {"CREATE CONVERSION",
+ N_("define a new encoding conversion"),
+ "sql-createconversion",
+ sql_help_CREATE_CONVERSION,
+ 1},
+
+ {"CREATE DATABASE",
+ N_("create a new database"),
+ "sql-createdatabase",
+ sql_help_CREATE_DATABASE,
+ 15},
+
+ {"CREATE DOMAIN",
+ N_("define a new domain"),
+ "sql-createdomain",
+ sql_help_CREATE_DOMAIN,
+ 8},
+
+ {"CREATE EVENT TRIGGER",
+ N_("define a new event trigger"),
+ "sql-createeventtrigger",
+ sql_help_CREATE_EVENT_TRIGGER,
+ 3},
+
+ {"CREATE EXTENSION",
+ N_("install an extension"),
+ "sql-createextension",
+ sql_help_CREATE_EXTENSION,
+ 3},
+
+ {"CREATE FOREIGN DATA WRAPPER",
+ N_("define a new foreign-data wrapper"),
+ "sql-createforeigndatawrapper",
+ sql_help_CREATE_FOREIGN_DATA_WRAPPER,
+ 3},
+
+ {"CREATE FOREIGN TABLE",
+ N_("define a new foreign table"),
+ "sql-createforeigntable",
+ sql_help_CREATE_FOREIGN_TABLE,
+ 38},
+
+ {"CREATE FUNCTION",
+ N_("define a new function"),
+ "sql-createfunction",
+ sql_help_CREATE_FUNCTION,
+ 19},
+
+ {"CREATE GROUP",
+ N_("define a new database role"),
+ "sql-creategroup",
+ sql_help_CREATE_GROUP,
+ 19},
+
+ {"CREATE INDEX",
+ N_("define a new index"),
+ "sql-createindex",
+ sql_help_CREATE_INDEX,
+ 6},
+
+ {"CREATE LANGUAGE",
+ N_("define a new procedural language"),
+ "sql-createlanguage",
+ sql_help_CREATE_LANGUAGE,
+ 2},
+
+ {"CREATE MATERIALIZED VIEW",
+ N_("define a new materialized view"),
+ "sql-creatematerializedview",
+ sql_help_CREATE_MATERIALIZED_VIEW,
+ 6},
+
+ {"CREATE OPERATOR",
+ N_("define a new operator"),
+ "sql-createoperator",
+ sql_help_CREATE_OPERATOR,
+ 6},
+
+ {"CREATE OPERATOR CLASS",
+ N_("define a new operator class"),
+ "sql-createopclass",
+ sql_help_CREATE_OPERATOR_CLASS,
+ 5},
+
+ {"CREATE OPERATOR FAMILY",
+ N_("define a new operator family"),
+ "sql-createopfamily",
+ sql_help_CREATE_OPERATOR_FAMILY,
+ 0},
+
+ {"CREATE POLICY",
+ N_("define a new row-level security policy for a table"),
+ "sql-createpolicy",
+ sql_help_CREATE_POLICY,
+ 5},
+
+ {"CREATE PROCEDURE",
+ N_("define a new procedure"),
+ "sql-createprocedure",
+ sql_help_CREATE_PROCEDURE,
+ 9},
+
+ {"CREATE PUBLICATION",
+ N_("define a new publication"),
+ "sql-createpublication",
+ sql_help_CREATE_PUBLICATION,
+ 8},
+
+ {"CREATE ROLE",
+ N_("define a new database role"),
+ "sql-createrole",
+ sql_help_CREATE_ROLE,
+ 19},
+
+ {"CREATE RULE",
+ N_("define a new rewrite rule"),
+ "sql-createrule",
+ sql_help_CREATE_RULE,
+ 6},
+
+ {"CREATE SCHEMA",
+ N_("define a new schema"),
+ "sql-createschema",
+ sql_help_CREATE_SCHEMA,
+ 10},
+
+ {"CREATE SEQUENCE",
+ N_("define a new sequence generator"),
+ "sql-createsequence",
+ sql_help_CREATE_SEQUENCE,
+ 5},
+
+ {"CREATE SERVER",
+ N_("define a new foreign server"),
+ "sql-createserver",
+ sql_help_CREATE_SERVER,
+ 2},
+
+ {"CREATE STATISTICS",
+ N_("define extended statistics"),
+ "sql-createstatistics",
+ sql_help_CREATE_STATISTICS,
+ 7},
+
+ {"CREATE SUBSCRIPTION",
+ N_("define a new subscription"),
+ "sql-createsubscription",
+ sql_help_CREATE_SUBSCRIPTION,
+ 3},
+
+ {"CREATE TABLE",
+ N_("define a new table"),
+ "sql-createtable",
+ sql_help_CREATE_TABLE,
+ 87},
+
+ {"CREATE TABLE AS",
+ N_("define a new table from the results of a query"),
+ "sql-createtableas",
+ sql_help_CREATE_TABLE_AS,
+ 7},
+
+ {"CREATE TABLESPACE",
+ N_("define a new tablespace"),
+ "sql-createtablespace",
+ sql_help_CREATE_TABLESPACE,
+ 3},
+
+ {"CREATE TEXT SEARCH CONFIGURATION",
+ N_("define a new text search configuration"),
+ "sql-createtsconfig",
+ sql_help_CREATE_TEXT_SEARCH_CONFIGURATION,
+ 3},
+
+ {"CREATE TEXT SEARCH DICTIONARY",
+ N_("define a new text search dictionary"),
+ "sql-createtsdictionary",
+ sql_help_CREATE_TEXT_SEARCH_DICTIONARY,
+ 3},
+
+ {"CREATE TEXT SEARCH PARSER",
+ N_("define a new text search parser"),
+ "sql-createtsparser",
+ sql_help_CREATE_TEXT_SEARCH_PARSER,
+ 6},
+
+ {"CREATE TEXT SEARCH TEMPLATE",
+ N_("define a new text search template"),
+ "sql-createtstemplate",
+ sql_help_CREATE_TEXT_SEARCH_TEMPLATE,
+ 3},
+
+ {"CREATE TRANSFORM",
+ N_("define a new transform"),
+ "sql-createtransform",
+ sql_help_CREATE_TRANSFORM,
+ 3},
+
+ {"CREATE TRIGGER",
+ N_("define a new trigger"),
+ "sql-createtrigger",
+ sql_help_CREATE_TRIGGER,
+ 14},
+
+ {"CREATE TYPE",
+ N_("define a new data type"),
+ "sql-createtype",
+ sql_help_CREATE_TYPE,
+ 37},
+
+ {"CREATE USER",
+ N_("define a new database role"),
+ "sql-createuser",
+ sql_help_CREATE_USER,
+ 19},
+
+ {"CREATE USER MAPPING",
+ N_("define a new mapping of a user to a foreign server"),
+ "sql-createusermapping",
+ sql_help_CREATE_USER_MAPPING,
+ 2},
+
+ {"CREATE VIEW",
+ N_("define a new view"),
+ "sql-createview",
+ sql_help_CREATE_VIEW,
+ 3},
+
+ {"DEALLOCATE",
+ N_("deallocate a prepared statement"),
+ "sql-deallocate",
+ sql_help_DEALLOCATE,
+ 0},
+
+ {"DECLARE",
+ N_("define a cursor"),
+ "sql-declare",
+ sql_help_DECLARE,
+ 1},
+
+ {"DELETE",
+ N_("delete rows of a table"),
+ "sql-delete",
+ sql_help_DELETE,
+ 4},
+
+ {"DISCARD",
+ N_("discard session state"),
+ "sql-discard",
+ sql_help_DISCARD,
+ 0},
+
+ {"DO",
+ N_("execute an anonymous code block"),
+ "sql-do",
+ sql_help_DO,
+ 0},
+
+ {"DROP ACCESS METHOD",
+ N_("remove an access method"),
+ "sql-drop-access-method",
+ sql_help_DROP_ACCESS_METHOD,
+ 0},
+
+ {"DROP AGGREGATE",
+ N_("remove an aggregate function"),
+ "sql-dropaggregate",
+ sql_help_DROP_AGGREGATE,
+ 6},
+
+ {"DROP CAST",
+ N_("remove a cast"),
+ "sql-dropcast",
+ sql_help_DROP_CAST,
+ 0},
+
+ {"DROP COLLATION",
+ N_("remove a collation"),
+ "sql-dropcollation",
+ sql_help_DROP_COLLATION,
+ 0},
+
+ {"DROP CONVERSION",
+ N_("remove a conversion"),
+ "sql-dropconversion",
+ sql_help_DROP_CONVERSION,
+ 0},
+
+ {"DROP DATABASE",
+ N_("remove a database"),
+ "sql-dropdatabase",
+ sql_help_DROP_DATABASE,
+ 4},
+
+ {"DROP DOMAIN",
+ N_("remove a domain"),
+ "sql-dropdomain",
+ sql_help_DROP_DOMAIN,
+ 0},
+
+ {"DROP EVENT TRIGGER",
+ N_("remove an event trigger"),
+ "sql-dropeventtrigger",
+ sql_help_DROP_EVENT_TRIGGER,
+ 0},
+
+ {"DROP EXTENSION",
+ N_("remove an extension"),
+ "sql-dropextension",
+ sql_help_DROP_EXTENSION,
+ 0},
+
+ {"DROP FOREIGN DATA WRAPPER",
+ N_("remove a foreign-data wrapper"),
+ "sql-dropforeigndatawrapper",
+ sql_help_DROP_FOREIGN_DATA_WRAPPER,
+ 0},
+
+ {"DROP FOREIGN TABLE",
+ N_("remove a foreign table"),
+ "sql-dropforeigntable",
+ sql_help_DROP_FOREIGN_TABLE,
+ 0},
+
+ {"DROP FUNCTION",
+ N_("remove a function"),
+ "sql-dropfunction",
+ sql_help_DROP_FUNCTION,
+ 1},
+
+ {"DROP GROUP",
+ N_("remove a database role"),
+ "sql-dropgroup",
+ sql_help_DROP_GROUP,
+ 0},
+
+ {"DROP INDEX",
+ N_("remove an index"),
+ "sql-dropindex",
+ sql_help_DROP_INDEX,
+ 0},
+
+ {"DROP LANGUAGE",
+ N_("remove a procedural language"),
+ "sql-droplanguage",
+ sql_help_DROP_LANGUAGE,
+ 0},
+
+ {"DROP MATERIALIZED VIEW",
+ N_("remove a materialized view"),
+ "sql-dropmaterializedview",
+ sql_help_DROP_MATERIALIZED_VIEW,
+ 0},
+
+ {"DROP OPERATOR",
+ N_("remove an operator"),
+ "sql-dropoperator",
+ sql_help_DROP_OPERATOR,
+ 0},
+
+ {"DROP OPERATOR CLASS",
+ N_("remove an operator class"),
+ "sql-dropopclass",
+ sql_help_DROP_OPERATOR_CLASS,
+ 0},
+
+ {"DROP OPERATOR FAMILY",
+ N_("remove an operator family"),
+ "sql-dropopfamily",
+ sql_help_DROP_OPERATOR_FAMILY,
+ 0},
+
+ {"DROP OWNED",
+ N_("remove database objects owned by a database role"),
+ "sql-drop-owned",
+ sql_help_DROP_OWNED,
+ 0},
+
+ {"DROP POLICY",
+ N_("remove a row-level security policy from a table"),
+ "sql-droppolicy",
+ sql_help_DROP_POLICY,
+ 0},
+
+ {"DROP PROCEDURE",
+ N_("remove a procedure"),
+ "sql-dropprocedure",
+ sql_help_DROP_PROCEDURE,
+ 1},
+
+ {"DROP PUBLICATION",
+ N_("remove a publication"),
+ "sql-droppublication",
+ sql_help_DROP_PUBLICATION,
+ 0},
+
+ {"DROP ROLE",
+ N_("remove a database role"),
+ "sql-droprole",
+ sql_help_DROP_ROLE,
+ 0},
+
+ {"DROP ROUTINE",
+ N_("remove a routine"),
+ "sql-droproutine",
+ sql_help_DROP_ROUTINE,
+ 1},
+
+ {"DROP RULE",
+ N_("remove a rewrite rule"),
+ "sql-droprule",
+ sql_help_DROP_RULE,
+ 0},
+
+ {"DROP SCHEMA",
+ N_("remove a schema"),
+ "sql-dropschema",
+ sql_help_DROP_SCHEMA,
+ 0},
+
+ {"DROP SEQUENCE",
+ N_("remove a sequence"),
+ "sql-dropsequence",
+ sql_help_DROP_SEQUENCE,
+ 0},
+
+ {"DROP SERVER",
+ N_("remove a foreign server descriptor"),
+ "sql-dropserver",
+ sql_help_DROP_SERVER,
+ 0},
+
+ {"DROP STATISTICS",
+ N_("remove extended statistics"),
+ "sql-dropstatistics",
+ sql_help_DROP_STATISTICS,
+ 0},
+
+ {"DROP SUBSCRIPTION",
+ N_("remove a subscription"),
+ "sql-dropsubscription",
+ sql_help_DROP_SUBSCRIPTION,
+ 0},
+
+ {"DROP TABLE",
+ N_("remove a table"),
+ "sql-droptable",
+ sql_help_DROP_TABLE,
+ 0},
+
+ {"DROP TABLESPACE",
+ N_("remove a tablespace"),
+ "sql-droptablespace",
+ sql_help_DROP_TABLESPACE,
+ 0},
+
+ {"DROP TEXT SEARCH CONFIGURATION",
+ N_("remove a text search configuration"),
+ "sql-droptsconfig",
+ sql_help_DROP_TEXT_SEARCH_CONFIGURATION,
+ 0},
+
+ {"DROP TEXT SEARCH DICTIONARY",
+ N_("remove a text search dictionary"),
+ "sql-droptsdictionary",
+ sql_help_DROP_TEXT_SEARCH_DICTIONARY,
+ 0},
+
+ {"DROP TEXT SEARCH PARSER",
+ N_("remove a text search parser"),
+ "sql-droptsparser",
+ sql_help_DROP_TEXT_SEARCH_PARSER,
+ 0},
+
+ {"DROP TEXT SEARCH TEMPLATE",
+ N_("remove a text search template"),
+ "sql-droptstemplate",
+ sql_help_DROP_TEXT_SEARCH_TEMPLATE,
+ 0},
+
+ {"DROP TRANSFORM",
+ N_("remove a transform"),
+ "sql-droptransform",
+ sql_help_DROP_TRANSFORM,
+ 0},
+
+ {"DROP TRIGGER",
+ N_("remove a trigger"),
+ "sql-droptrigger",
+ sql_help_DROP_TRIGGER,
+ 0},
+
+ {"DROP TYPE",
+ N_("remove a data type"),
+ "sql-droptype",
+ sql_help_DROP_TYPE,
+ 0},
+
+ {"DROP USER",
+ N_("remove a database role"),
+ "sql-dropuser",
+ sql_help_DROP_USER,
+ 0},
+
+ {"DROP USER MAPPING",
+ N_("remove a user mapping for a foreign server"),
+ "sql-dropusermapping",
+ sql_help_DROP_USER_MAPPING,
+ 0},
+
+ {"DROP VIEW",
+ N_("remove a view"),
+ "sql-dropview",
+ sql_help_DROP_VIEW,
+ 0},
+
+ {"END",
+ N_("commit the current transaction"),
+ "sql-end",
+ sql_help_END,
+ 0},
+
+ {"EXECUTE",
+ N_("execute a prepared statement"),
+ "sql-execute",
+ sql_help_EXECUTE,
+ 0},
+
+ {"EXPLAIN",
+ N_("show the execution plan of a statement"),
+ "sql-explain",
+ sql_help_EXPLAIN,
+ 13},
+
+ {"FETCH",
+ N_("retrieve rows from a query using a cursor"),
+ "sql-fetch",
+ sql_help_FETCH,
+ 17},
+
+ {"GRANT",
+ N_("define access privileges"),
+ "sql-grant",
+ sql_help_GRANT,
+ 86},
+
+ {"IMPORT FOREIGN SCHEMA",
+ N_("import table definitions from a foreign server"),
+ "sql-importforeignschema",
+ sql_help_IMPORT_FOREIGN_SCHEMA,
+ 4},
+
+ {"INSERT",
+ N_("create new rows in a table"),
+ "sql-insert",
+ sql_help_INSERT,
+ 19},
+
+ {"LISTEN",
+ N_("listen for a notification"),
+ "sql-listen",
+ sql_help_LISTEN,
+ 0},
+
+ {"LOAD",
+ N_("load a shared library file"),
+ "sql-load",
+ sql_help_LOAD,
+ 0},
+
+ {"LOCK",
+ N_("lock a table"),
+ "sql-lock",
+ sql_help_LOCK,
+ 5},
+
+ {"MERGE",
+ N_("conditionally insert, update, or delete rows of a table"),
+ "sql-merge",
+ sql_help_MERGE,
+ 27},
+
+ {"MOVE",
+ N_("position a cursor"),
+ "sql-move",
+ sql_help_MOVE,
+ 17},
+
+ {"NOTIFY",
+ N_("generate a notification"),
+ "sql-notify",
+ sql_help_NOTIFY,
+ 0},
+
+ {"PREPARE",
+ N_("prepare a statement for execution"),
+ "sql-prepare",
+ sql_help_PREPARE,
+ 0},
+
+ {"PREPARE TRANSACTION",
+ N_("prepare the current transaction for two-phase commit"),
+ "sql-prepare-transaction",
+ sql_help_PREPARE_TRANSACTION,
+ 0},
+
+ {"REASSIGN OWNED",
+ N_("change the ownership of database objects owned by a database role"),
+ "sql-reassign-owned",
+ sql_help_REASSIGN_OWNED,
+ 1},
+
+ {"REFRESH MATERIALIZED VIEW",
+ N_("replace the contents of a materialized view"),
+ "sql-refreshmaterializedview",
+ sql_help_REFRESH_MATERIALIZED_VIEW,
+ 1},
+
+ {"REINDEX",
+ N_("rebuild indexes"),
+ "sql-reindex",
+ sql_help_REINDEX,
+ 6},
+
+ {"RELEASE SAVEPOINT",
+ N_("destroy a previously defined savepoint"),
+ "sql-release-savepoint",
+ sql_help_RELEASE_SAVEPOINT,
+ 0},
+
+ {"RESET",
+ N_("restore the value of a run-time parameter to the default value"),
+ "sql-reset",
+ sql_help_RESET,
+ 1},
+
+ {"REVOKE",
+ N_("remove access privileges"),
+ "sql-revoke",
+ sql_help_REVOKE,
+ 115},
+
+ {"ROLLBACK",
+ N_("abort the current transaction"),
+ "sql-rollback",
+ sql_help_ROLLBACK,
+ 0},
+
+ {"ROLLBACK PREPARED",
+ N_("cancel a transaction that was earlier prepared for two-phase commit"),
+ "sql-rollback-prepared",
+ sql_help_ROLLBACK_PREPARED,
+ 0},
+
+ {"ROLLBACK TO SAVEPOINT",
+ N_("roll back to a savepoint"),
+ "sql-rollback-to",
+ sql_help_ROLLBACK_TO_SAVEPOINT,
+ 0},
+
+ {"SAVEPOINT",
+ N_("define a new savepoint within the current transaction"),
+ "sql-savepoint",
+ sql_help_SAVEPOINT,
+ 0},
+
+ {"SECURITY LABEL",
+ N_("define or change a security label applied to an object"),
+ "sql-security-label",
+ sql_help_SECURITY_LABEL,
+ 29},
+
+ {"SELECT",
+ N_("retrieve rows from a table or view"),
+ "sql-select",
+ sql_help_SELECT,
+ 46},
+
+ {"SELECT INTO",
+ N_("define a new table from the results of a query"),
+ "sql-selectinto",
+ sql_help_SELECT_INTO,
+ 14},
+
+ {"SET",
+ N_("change a run-time parameter"),
+ "sql-set",
+ sql_help_SET,
+ 1},
+
+ {"SET CONSTRAINTS",
+ N_("set constraint check timing for the current transaction"),
+ "sql-set-constraints",
+ sql_help_SET_CONSTRAINTS,
+ 0},
+
+ {"SET ROLE",
+ N_("set the current user identifier of the current session"),
+ "sql-set-role",
+ sql_help_SET_ROLE,
+ 2},
+
+ {"SET SESSION AUTHORIZATION",
+ N_("set the session user identifier and the current user identifier of the current session"),
+ "sql-set-session-authorization",
+ sql_help_SET_SESSION_AUTHORIZATION,
+ 2},
+
+ {"SET TRANSACTION",
+ N_("set the characteristics of the current transaction"),
+ "sql-set-transaction",
+ sql_help_SET_TRANSACTION,
+ 8},
+
+ {"SHOW",
+ N_("show the value of a run-time parameter"),
+ "sql-show",
+ sql_help_SHOW,
+ 1},
+
+ {"START TRANSACTION",
+ N_("start a transaction block"),
+ "sql-start-transaction",
+ sql_help_START_TRANSACTION,
+ 6},
+
+ {"TABLE",
+ N_("retrieve rows from a table or view"),
+ "sql-select",
+ sql_help_TABLE,
+ 46},
+
+ {"TRUNCATE",
+ N_("empty a table or set of tables"),
+ "sql-truncate",
+ sql_help_TRUNCATE,
+ 1},
+
+ {"UNLISTEN",
+ N_("stop listening for a notification"),
+ "sql-unlisten",
+ sql_help_UNLISTEN,
+ 0},
+
+ {"UPDATE",
+ N_("update rows of a table"),
+ "sql-update",
+ sql_help_UPDATE,
+ 8},
+
+ {"VACUUM",
+ N_("garbage-collect and optionally analyze a database"),
+ "sql-vacuum",
+ sql_help_VACUUM,
+ 18},
+
+ {"VALUES",
+ N_("compute a set of rows"),
+ "sql-values",
+ sql_help_VALUES,
+ 4},
+
+ {"WITH",
+ N_("retrieve rows from a table or view"),
+ "sql-select",
+ sql_help_WITH,
+ 46},
+
+
+ {NULL, NULL, NULL} /* End of list marker */
+};
diff --git a/src/bin/psql/sql_help.h b/src/bin/psql/sql_help.h
new file mode 100644
index 0000000..d401e31
--- /dev/null
+++ b/src/bin/psql/sql_help.h
@@ -0,0 +1,30 @@
+/*
+ * *** Do not change this file by hand. It is automatically
+ * *** generated from the DocBook documentation.
+ *
+ * generated by src/bin/psql/create_help.pl
+ *
+ */
+
+#ifndef SQL_HELP_H
+#define SQL_HELP_H
+
+#include "pqexpbuffer.h"
+
+struct _helpStruct
+{
+ const char *cmd; /* the command name */
+ const char *help; /* the help associated with it */
+ const char *docbook_id; /* DocBook XML id (for generating URL) */
+ void (*syntaxfunc) (PQExpBuffer); /* function that prints the
+ * syntax associated with it */
+ int nl_count; /* number of newlines in syntax (for pager) */
+};
+
+extern const struct _helpStruct QL_HELP[];
+
+#define QL_HELP_COUNT 185 /* number of help items */
+#define QL_MAX_CMD_LEN 32 /* largest strlen(cmd) */
+
+
+#endif /* SQL_HELP_H */
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
new file mode 100644
index 0000000..7c2f555
--- /dev/null
+++ b/src/bin/psql/startup.c
@@ -0,0 +1,1268 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/startup.c
+ */
+#include "postgres_fe.h"
+
+#ifndef WIN32
+#include <unistd.h>
+#else /* WIN32 */
+#include <io.h>
+#include <win32.h>
+#endif /* WIN32 */
+
+#include "command.h"
+#include "common.h"
+#include "common/logging.h"
+#include "common/string.h"
+#include "describe.h"
+#include "fe_utils/print.h"
+#include "getopt_long.h"
+#include "help.h"
+#include "input.h"
+#include "mainloop.h"
+#include "settings.h"
+
+/*
+ * Global psql options
+ */
+PsqlSettings pset;
+
+#ifndef WIN32
+#define SYSPSQLRC "psqlrc"
+#define PSQLRC ".psqlrc"
+#else
+#define SYSPSQLRC "psqlrc"
+#define PSQLRC "psqlrc.conf"
+#endif
+
+/*
+ * Structures to pass information between the option parsing routine
+ * and the main function
+ */
+enum _actions
+{
+ ACT_SINGLE_QUERY,
+ ACT_SINGLE_SLASH,
+ ACT_FILE
+};
+
+typedef struct SimpleActionListCell
+{
+ struct SimpleActionListCell *next;
+ enum _actions action;
+ char *val;
+} SimpleActionListCell;
+
+typedef struct SimpleActionList
+{
+ SimpleActionListCell *head;
+ SimpleActionListCell *tail;
+} SimpleActionList;
+
+struct adhoc_opts
+{
+ char *dbname;
+ char *host;
+ char *port;
+ char *username;
+ char *logfilename;
+ bool no_readline;
+ bool no_psqlrc;
+ bool single_txn;
+ bool list_dbs;
+ SimpleActionList actions;
+};
+
+static void parse_psql_options(int argc, char *argv[],
+ struct adhoc_opts *options);
+static void simple_action_list_append(SimpleActionList *list,
+ enum _actions action, const char *val);
+static void process_psqlrc(char *argv0);
+static void process_psqlrc_file(char *filename);
+static void showVersion(void);
+static void EstablishVariableSpace(void);
+
+#define NOPAGER 0
+
+static void
+log_pre_callback(void)
+{
+ if (pset.queryFout && pset.queryFout != stdout)
+ fflush(pset.queryFout);
+}
+
+static void
+log_locus_callback(const char **filename, uint64 *lineno)
+{
+ if (pset.inputfile)
+ {
+ *filename = pset.inputfile;
+ *lineno = pset.lineno;
+ }
+ else
+ {
+ *filename = NULL;
+ *lineno = 0;
+ }
+}
+
+#ifdef HAVE_POSIX_DECL_SIGWAIT
+static void
+empty_signal_handler(SIGNAL_ARGS)
+{
+}
+#endif
+
+/*
+ *
+ * main
+ *
+ */
+int
+main(int argc, char *argv[])
+{
+ struct adhoc_opts options;
+ int successResult;
+ char *password = NULL;
+ bool new_pass;
+
+ pg_logging_init(argv[0]);
+ pg_logging_set_pre_callback(log_pre_callback);
+ pg_logging_set_locus_callback(log_locus_callback);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("psql"));
+
+ if (argc > 1)
+ {
+ if ((strcmp(argv[1], "-?") == 0) || (argc == 2 && (strcmp(argv[1], "--help") == 0)))
+ {
+ usage(NOPAGER);
+ exit(EXIT_SUCCESS);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ showVersion();
+ exit(EXIT_SUCCESS);
+ }
+ }
+
+ pset.progname = get_progname(argv[0]);
+
+ pset.db = NULL;
+ pset.dead_conn = NULL;
+ setDecimalLocale();
+ pset.encoding = PQenv2encoding();
+ pset.queryFout = stdout;
+ pset.queryFoutPipe = false;
+ pset.copyStream = NULL;
+ pset.last_error_result = NULL;
+ pset.cur_cmd_source = stdin;
+ pset.cur_cmd_interactive = false;
+
+ /* We rely on unmentioned fields of pset.popt to start out 0/false/NULL */
+ pset.popt.topt.format = PRINT_ALIGNED;
+ pset.popt.topt.border = 1;
+ pset.popt.topt.pager = 1;
+ pset.popt.topt.pager_min_lines = 0;
+ pset.popt.topt.start_table = true;
+ pset.popt.topt.stop_table = true;
+ pset.popt.topt.default_footer = true;
+
+ pset.popt.topt.csvFieldSep[0] = DEFAULT_CSV_FIELD_SEP;
+ pset.popt.topt.csvFieldSep[1] = '\0';
+
+ pset.popt.topt.unicode_border_linestyle = UNICODE_LINESTYLE_SINGLE;
+ pset.popt.topt.unicode_column_linestyle = UNICODE_LINESTYLE_SINGLE;
+ pset.popt.topt.unicode_header_linestyle = UNICODE_LINESTYLE_SINGLE;
+
+ refresh_utf8format(&(pset.popt.topt));
+
+ /* We must get COLUMNS here before readline() sets it */
+ pset.popt.topt.env_columns = getenv("COLUMNS") ? atoi(getenv("COLUMNS")) : 0;
+
+ pset.notty = (!isatty(fileno(stdin)) || !isatty(fileno(stdout)));
+
+ pset.getPassword = TRI_DEFAULT;
+
+ EstablishVariableSpace();
+
+ /* Create variables showing psql version number */
+ SetVariable(pset.vars, "VERSION", PG_VERSION_STR);
+ SetVariable(pset.vars, "VERSION_NAME", PG_VERSION);
+ SetVariable(pset.vars, "VERSION_NUM", CppAsString2(PG_VERSION_NUM));
+
+ /* Initialize variables for last error */
+ SetVariable(pset.vars, "LAST_ERROR_MESSAGE", "");
+ SetVariable(pset.vars, "LAST_ERROR_SQLSTATE", "00000");
+
+ /* Default values for variables (that don't match the result of \unset) */
+ SetVariableBool(pset.vars, "AUTOCOMMIT");
+ SetVariable(pset.vars, "PROMPT1", DEFAULT_PROMPT1);
+ SetVariable(pset.vars, "PROMPT2", DEFAULT_PROMPT2);
+ SetVariable(pset.vars, "PROMPT3", DEFAULT_PROMPT3);
+ SetVariableBool(pset.vars, "SHOW_ALL_RESULTS");
+
+ parse_psql_options(argc, argv, &options);
+
+ /*
+ * If no action was specified and we're in non-interactive mode, treat it
+ * as if the user had specified "-f -". This lets single-transaction mode
+ * work in this case.
+ */
+ if (options.actions.head == NULL && pset.notty)
+ simple_action_list_append(&options.actions, ACT_FILE, NULL);
+
+ /* Bail out if -1 was specified but will be ignored. */
+ if (options.single_txn && options.actions.head == NULL)
+ pg_fatal("-1 can only be used in non-interactive mode");
+
+ if (!pset.popt.topt.fieldSep.separator &&
+ !pset.popt.topt.fieldSep.separator_zero)
+ {
+ pset.popt.topt.fieldSep.separator = pg_strdup(DEFAULT_FIELD_SEP);
+ pset.popt.topt.fieldSep.separator_zero = false;
+ }
+ if (!pset.popt.topt.recordSep.separator &&
+ !pset.popt.topt.recordSep.separator_zero)
+ {
+ pset.popt.topt.recordSep.separator = pg_strdup(DEFAULT_RECORD_SEP);
+ pset.popt.topt.recordSep.separator_zero = false;
+ }
+
+ if (pset.getPassword == TRI_YES)
+ {
+ /*
+ * We can't be sure yet of the username that will be used, so don't
+ * offer a potentially wrong one. Typical uses of this option are
+ * noninteractive anyway. (Note: since we've not yet set up our
+ * cancel handler, there's no need to use simple_prompt_extended.)
+ */
+ password = simple_prompt("Password: ", false);
+ }
+
+ /* loop until we have a password if requested by backend */
+ do
+ {
+#define PARAMS_ARRAY_SIZE 8
+ const char **keywords = pg_malloc(PARAMS_ARRAY_SIZE * sizeof(*keywords));
+ const char **values = pg_malloc(PARAMS_ARRAY_SIZE * sizeof(*values));
+
+ keywords[0] = "host";
+ values[0] = options.host;
+ keywords[1] = "port";
+ values[1] = options.port;
+ keywords[2] = "user";
+ values[2] = options.username;
+ keywords[3] = "password";
+ values[3] = password;
+ keywords[4] = "dbname"; /* see do_connect() */
+ values[4] = (options.list_dbs && options.dbname == NULL) ?
+ "postgres" : options.dbname;
+ keywords[5] = "fallback_application_name";
+ values[5] = pset.progname;
+ keywords[6] = "client_encoding";
+ values[6] = (pset.notty || getenv("PGCLIENTENCODING")) ? NULL : "auto";
+ keywords[7] = NULL;
+ values[7] = NULL;
+
+ new_pass = false;
+ pset.db = PQconnectdbParams(keywords, values, true);
+ free(keywords);
+ free(values);
+
+ if (PQstatus(pset.db) == CONNECTION_BAD &&
+ PQconnectionNeedsPassword(pset.db) &&
+ !password &&
+ pset.getPassword != TRI_NO)
+ {
+ /*
+ * Before closing the old PGconn, extract the user name that was
+ * actually connected with --- it might've come out of a URI or
+ * connstring "database name" rather than options.username.
+ */
+ const char *realusername = PQuser(pset.db);
+ char *password_prompt;
+
+ if (realusername && realusername[0])
+ password_prompt = psprintf(_("Password for user %s: "),
+ realusername);
+ else
+ password_prompt = pg_strdup(_("Password: "));
+ PQfinish(pset.db);
+
+ password = simple_prompt(password_prompt, false);
+ free(password_prompt);
+ new_pass = true;
+ }
+ } while (new_pass);
+
+ if (PQstatus(pset.db) == CONNECTION_BAD)
+ {
+ pg_log_error("%s", PQerrorMessage(pset.db));
+ PQfinish(pset.db);
+ exit(EXIT_BADCONN);
+ }
+
+ psql_setup_cancel_handler();
+
+#ifdef HAVE_POSIX_DECL_SIGWAIT
+
+ /*
+ * do_watch() needs signal handlers installed (otherwise sigwait() will
+ * filter them out on some platforms), but doesn't need them to do
+ * anything, and they shouldn't ever run (unless perhaps a stray SIGALRM
+ * arrives due to a race when do_watch() cancels an itimer).
+ */
+ pqsignal(SIGCHLD, empty_signal_handler);
+ pqsignal(SIGALRM, empty_signal_handler);
+#endif
+
+ PQsetNoticeProcessor(pset.db, NoticeProcessor, NULL);
+
+ SyncVariables();
+
+ if (options.list_dbs)
+ {
+ int success;
+
+ if (!options.no_psqlrc)
+ process_psqlrc(argv[0]);
+
+ success = listAllDbs(NULL, false);
+ PQfinish(pset.db);
+ exit(success ? EXIT_SUCCESS : EXIT_FAILURE);
+ }
+
+ if (options.logfilename)
+ {
+ pset.logfile = fopen(options.logfilename, "a");
+ if (!pset.logfile)
+ pg_fatal("could not open log file \"%s\": %m",
+ options.logfilename);
+ }
+
+ if (!options.no_psqlrc)
+ process_psqlrc(argv[0]);
+
+ /*
+ * If any actions were given by user, process them in the order in which
+ * they were specified. Note single_txn is only effective in this mode.
+ */
+ if (options.actions.head != NULL)
+ {
+ PGresult *res;
+ SimpleActionListCell *cell;
+
+ successResult = EXIT_SUCCESS; /* silence compiler */
+
+ if (options.single_txn)
+ {
+ if ((res = PSQLexec("BEGIN")) == NULL)
+ {
+ if (pset.on_error_stop)
+ {
+ successResult = EXIT_USER;
+ goto error;
+ }
+ }
+ else
+ PQclear(res);
+ }
+
+ for (cell = options.actions.head; cell; cell = cell->next)
+ {
+ if (cell->action == ACT_SINGLE_QUERY)
+ {
+ pg_logging_config(PG_LOG_FLAG_TERSE);
+
+ if (pset.echo == PSQL_ECHO_ALL)
+ puts(cell->val);
+
+ successResult = SendQuery(cell->val)
+ ? EXIT_SUCCESS : EXIT_FAILURE;
+ }
+ else if (cell->action == ACT_SINGLE_SLASH)
+ {
+ PsqlScanState scan_state;
+ ConditionalStack cond_stack;
+
+ pg_logging_config(PG_LOG_FLAG_TERSE);
+
+ if (pset.echo == PSQL_ECHO_ALL)
+ puts(cell->val);
+
+ scan_state = psql_scan_create(&psqlscan_callbacks);
+ psql_scan_setup(scan_state,
+ cell->val, strlen(cell->val),
+ pset.encoding, standard_strings());
+ cond_stack = conditional_stack_create();
+ psql_scan_set_passthrough(scan_state, (void *) cond_stack);
+
+ successResult = HandleSlashCmds(scan_state,
+ cond_stack,
+ NULL,
+ NULL) != PSQL_CMD_ERROR
+ ? EXIT_SUCCESS : EXIT_FAILURE;
+
+ psql_scan_destroy(scan_state);
+ conditional_stack_destroy(cond_stack);
+ }
+ else if (cell->action == ACT_FILE)
+ {
+ successResult = process_file(cell->val, false);
+ }
+ else
+ {
+ /* should never come here */
+ Assert(false);
+ }
+
+ if (successResult != EXIT_SUCCESS && pset.on_error_stop)
+ break;
+ }
+
+ if (options.single_txn)
+ {
+ /*
+ * Rollback the contents of the single transaction if the caller
+ * has set ON_ERROR_STOP and one of the steps has failed. This
+ * check needs to match the one done a couple of lines above.
+ */
+ res = PSQLexec((successResult != EXIT_SUCCESS && pset.on_error_stop) ?
+ "ROLLBACK" : "COMMIT");
+ if (res == NULL)
+ {
+ if (pset.on_error_stop)
+ {
+ successResult = EXIT_USER;
+ goto error;
+ }
+ }
+ else
+ PQclear(res);
+ }
+
+error:
+ ;
+ }
+
+ /*
+ * or otherwise enter interactive main loop
+ */
+ else
+ {
+ pg_logging_config(PG_LOG_FLAG_TERSE);
+ connection_warnings(true);
+ if (!pset.quiet)
+ printf(_("Type \"help\" for help.\n\n"));
+ initializeInput(options.no_readline ? 0 : 1);
+ successResult = MainLoop(stdin);
+ }
+
+ /* clean up */
+ if (pset.logfile)
+ fclose(pset.logfile);
+ if (pset.db)
+ PQfinish(pset.db);
+ if (pset.dead_conn)
+ PQfinish(pset.dead_conn);
+ setQFout(NULL);
+
+ return successResult;
+}
+
+
+/*
+ * Parse command line options
+ */
+
+static void
+parse_psql_options(int argc, char *argv[], struct adhoc_opts *options)
+{
+ static struct option long_options[] =
+ {
+ {"echo-all", no_argument, NULL, 'a'},
+ {"no-align", no_argument, NULL, 'A'},
+ {"command", required_argument, NULL, 'c'},
+ {"dbname", required_argument, NULL, 'd'},
+ {"echo-queries", no_argument, NULL, 'e'},
+ {"echo-errors", no_argument, NULL, 'b'},
+ {"echo-hidden", no_argument, NULL, 'E'},
+ {"file", required_argument, NULL, 'f'},
+ {"field-separator", required_argument, NULL, 'F'},
+ {"field-separator-zero", no_argument, NULL, 'z'},
+ {"host", required_argument, NULL, 'h'},
+ {"html", no_argument, NULL, 'H'},
+ {"list", no_argument, NULL, 'l'},
+ {"log-file", required_argument, NULL, 'L'},
+ {"no-readline", no_argument, NULL, 'n'},
+ {"single-transaction", no_argument, NULL, '1'},
+ {"output", required_argument, NULL, 'o'},
+ {"port", required_argument, NULL, 'p'},
+ {"pset", required_argument, NULL, 'P'},
+ {"quiet", no_argument, NULL, 'q'},
+ {"record-separator", required_argument, NULL, 'R'},
+ {"record-separator-zero", no_argument, NULL, '0'},
+ {"single-step", no_argument, NULL, 's'},
+ {"single-line", no_argument, NULL, 'S'},
+ {"tuples-only", no_argument, NULL, 't'},
+ {"table-attr", required_argument, NULL, 'T'},
+ {"username", required_argument, NULL, 'U'},
+ {"set", required_argument, NULL, 'v'},
+ {"variable", required_argument, NULL, 'v'},
+ {"version", no_argument, NULL, 'V'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"expanded", no_argument, NULL, 'x'},
+ {"no-psqlrc", no_argument, NULL, 'X'},
+ {"help", optional_argument, NULL, 1},
+ {"csv", no_argument, NULL, 2},
+ {NULL, 0, NULL, 0}
+ };
+
+ int optindex;
+ int c;
+
+ memset(options, 0, sizeof *options);
+
+ while ((c = getopt_long(argc, argv, "aAbc:d:eEf:F:h:HlL:no:p:P:qR:sStT:U:v:VwWxXz?01",
+ long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'a':
+ SetVariable(pset.vars, "ECHO", "all");
+ break;
+ case 'A':
+ pset.popt.topt.format = PRINT_UNALIGNED;
+ break;
+ case 'b':
+ SetVariable(pset.vars, "ECHO", "errors");
+ break;
+ case 'c':
+ if (optarg[0] == '\\')
+ simple_action_list_append(&options->actions,
+ ACT_SINGLE_SLASH,
+ optarg + 1);
+ else
+ simple_action_list_append(&options->actions,
+ ACT_SINGLE_QUERY,
+ optarg);
+ break;
+ case 'd':
+ options->dbname = pg_strdup(optarg);
+ break;
+ case 'e':
+ SetVariable(pset.vars, "ECHO", "queries");
+ break;
+ case 'E':
+ SetVariableBool(pset.vars, "ECHO_HIDDEN");
+ break;
+ case 'f':
+ simple_action_list_append(&options->actions,
+ ACT_FILE,
+ optarg);
+ break;
+ case 'F':
+ pset.popt.topt.fieldSep.separator = pg_strdup(optarg);
+ pset.popt.topt.fieldSep.separator_zero = false;
+ break;
+ case 'h':
+ options->host = pg_strdup(optarg);
+ break;
+ case 'H':
+ pset.popt.topt.format = PRINT_HTML;
+ break;
+ case 'l':
+ options->list_dbs = true;
+ break;
+ case 'L':
+ options->logfilename = pg_strdup(optarg);
+ break;
+ case 'n':
+ options->no_readline = true;
+ break;
+ case 'o':
+ if (!setQFout(optarg))
+ exit(EXIT_FAILURE);
+ break;
+ case 'p':
+ options->port = pg_strdup(optarg);
+ break;
+ case 'P':
+ {
+ char *value;
+ char *equal_loc;
+ bool result;
+
+ value = pg_strdup(optarg);
+ equal_loc = strchr(value, '=');
+ if (!equal_loc)
+ result = do_pset(value, NULL, &pset.popt, true);
+ else
+ {
+ *equal_loc = '\0';
+ result = do_pset(value, equal_loc + 1, &pset.popt, true);
+ }
+
+ if (!result)
+ pg_fatal("could not set printing parameter \"%s\"", value);
+
+ free(value);
+ break;
+ }
+ case 'q':
+ SetVariableBool(pset.vars, "QUIET");
+ break;
+ case 'R':
+ pset.popt.topt.recordSep.separator = pg_strdup(optarg);
+ pset.popt.topt.recordSep.separator_zero = false;
+ break;
+ case 's':
+ SetVariableBool(pset.vars, "SINGLESTEP");
+ break;
+ case 'S':
+ SetVariableBool(pset.vars, "SINGLELINE");
+ break;
+ case 't':
+ pset.popt.topt.tuples_only = true;
+ break;
+ case 'T':
+ pset.popt.topt.tableAttr = pg_strdup(optarg);
+ break;
+ case 'U':
+ options->username = pg_strdup(optarg);
+ break;
+ case 'v':
+ {
+ char *value;
+ char *equal_loc;
+
+ value = pg_strdup(optarg);
+ equal_loc = strchr(value, '=');
+ if (!equal_loc)
+ {
+ if (!DeleteVariable(pset.vars, value))
+ exit(EXIT_FAILURE); /* error already printed */
+ }
+ else
+ {
+ *equal_loc = '\0';
+ if (!SetVariable(pset.vars, value, equal_loc + 1))
+ exit(EXIT_FAILURE); /* error already printed */
+ }
+
+ free(value);
+ break;
+ }
+ case 'V':
+ showVersion();
+ exit(EXIT_SUCCESS);
+ case 'w':
+ pset.getPassword = TRI_NO;
+ break;
+ case 'W':
+ pset.getPassword = TRI_YES;
+ break;
+ case 'x':
+ pset.popt.topt.expanded = true;
+ break;
+ case 'X':
+ options->no_psqlrc = true;
+ break;
+ case 'z':
+ pset.popt.topt.fieldSep.separator_zero = true;
+ break;
+ case '0':
+ pset.popt.topt.recordSep.separator_zero = true;
+ break;
+ case '1':
+ options->single_txn = true;
+ break;
+ case '?':
+ if (optind <= argc &&
+ strcmp(argv[optind - 1], "-?") == 0)
+ {
+ /* actual help option given */
+ usage(NOPAGER);
+ exit(EXIT_SUCCESS);
+ }
+ else
+ {
+ /* getopt error (unknown option or missing argument) */
+ goto unknown_option;
+ }
+ break;
+ case 1:
+ {
+ if (!optarg || strcmp(optarg, "options") == 0)
+ usage(NOPAGER);
+ else if (optarg && strcmp(optarg, "commands") == 0)
+ slashUsage(NOPAGER);
+ else if (optarg && strcmp(optarg, "variables") == 0)
+ helpVariables(NOPAGER);
+ else
+ goto unknown_option;
+
+ exit(EXIT_SUCCESS);
+ }
+ break;
+ case 2:
+ pset.popt.topt.format = PRINT_CSV;
+ break;
+ default:
+ unknown_option:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.",
+ pset.progname);
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ /*
+ * if we still have arguments, use it as the database name and username
+ */
+ while (argc - optind >= 1)
+ {
+ if (!options->dbname)
+ options->dbname = argv[optind];
+ else if (!options->username)
+ options->username = argv[optind];
+ else if (!pset.quiet)
+ pg_log_warning("extra command-line argument \"%s\" ignored",
+ argv[optind]);
+
+ optind++;
+ }
+}
+
+
+/*
+ * Append a new item to the end of the SimpleActionList.
+ * Note that "val" is copied if it's not NULL.
+ */
+static void
+simple_action_list_append(SimpleActionList *list,
+ enum _actions action, const char *val)
+{
+ SimpleActionListCell *cell;
+
+ cell = (SimpleActionListCell *) pg_malloc(sizeof(SimpleActionListCell));
+
+ cell->next = NULL;
+ cell->action = action;
+ if (val)
+ cell->val = pg_strdup(val);
+ else
+ cell->val = NULL;
+
+ if (list->tail)
+ list->tail->next = cell;
+ else
+ list->head = cell;
+ list->tail = cell;
+}
+
+
+/*
+ * Load .psqlrc file, if found.
+ */
+static void
+process_psqlrc(char *argv0)
+{
+ char home[MAXPGPATH];
+ char rc_file[MAXPGPATH];
+ char my_exec_path[MAXPGPATH];
+ char etc_path[MAXPGPATH];
+ char *envrc = getenv("PSQLRC");
+
+ if (find_my_exec(argv0, my_exec_path) < 0)
+ pg_fatal("could not find own program executable");
+
+ get_etc_path(my_exec_path, etc_path);
+
+ snprintf(rc_file, MAXPGPATH, "%s/%s", etc_path, SYSPSQLRC);
+ process_psqlrc_file(rc_file);
+
+ if (envrc != NULL && strlen(envrc) > 0)
+ {
+ /* might need to free() this */
+ char *envrc_alloc = pstrdup(envrc);
+
+ expand_tilde(&envrc_alloc);
+ process_psqlrc_file(envrc_alloc);
+ }
+ else if (get_home_path(home))
+ {
+ snprintf(rc_file, MAXPGPATH, "%s/%s", home, PSQLRC);
+ process_psqlrc_file(rc_file);
+ }
+}
+
+
+
+static void
+process_psqlrc_file(char *filename)
+{
+ char *psqlrc_minor,
+ *psqlrc_major;
+
+#if defined(WIN32) && (!defined(__MINGW32__))
+#define R_OK 4
+#endif
+
+ psqlrc_minor = psprintf("%s-%s", filename, PG_VERSION);
+ psqlrc_major = psprintf("%s-%s", filename, PG_MAJORVERSION);
+
+ /* check for minor version first, then major, then no version */
+ if (access(psqlrc_minor, R_OK) == 0)
+ (void) process_file(psqlrc_minor, false);
+ else if (access(psqlrc_major, R_OK) == 0)
+ (void) process_file(psqlrc_major, false);
+ else if (access(filename, R_OK) == 0)
+ (void) process_file(filename, false);
+
+ free(psqlrc_minor);
+ free(psqlrc_major);
+}
+
+
+
+/* showVersion
+ *
+ * This output format is intended to match GNU standards.
+ */
+static void
+showVersion(void)
+{
+ puts("psql (PostgreSQL) " PG_VERSION);
+}
+
+
+
+/*
+ * Substitute hooks and assign hooks for psql variables.
+ *
+ * This isn't an amazingly good place for them, but neither is anywhere else.
+ *
+ * By policy, every special variable that controls any psql behavior should
+ * have one or both hooks, even if they're just no-ops. This ensures that
+ * the variable will remain present in variables.c's list even when unset,
+ * which ensures that it's known to tab completion.
+ */
+
+static char *
+bool_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ {
+ /* "\unset FOO" becomes "\set FOO off" */
+ newval = pg_strdup("off");
+ }
+ else if (newval[0] == '\0')
+ {
+ /* "\set FOO" becomes "\set FOO on" */
+ pg_free(newval);
+ newval = pg_strdup("on");
+ }
+ return newval;
+}
+
+static bool
+autocommit_hook(const char *newval)
+{
+ return ParseVariableBool(newval, "AUTOCOMMIT", &pset.autocommit);
+}
+
+static bool
+on_error_stop_hook(const char *newval)
+{
+ return ParseVariableBool(newval, "ON_ERROR_STOP", &pset.on_error_stop);
+}
+
+static bool
+quiet_hook(const char *newval)
+{
+ return ParseVariableBool(newval, "QUIET", &pset.quiet);
+}
+
+static bool
+singleline_hook(const char *newval)
+{
+ return ParseVariableBool(newval, "SINGLELINE", &pset.singleline);
+}
+
+static bool
+singlestep_hook(const char *newval)
+{
+ return ParseVariableBool(newval, "SINGLESTEP", &pset.singlestep);
+}
+
+static char *
+fetch_count_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ newval = pg_strdup("0");
+ return newval;
+}
+
+static bool
+fetch_count_hook(const char *newval)
+{
+ return ParseVariableNum(newval, "FETCH_COUNT", &pset.fetch_count);
+}
+
+static bool
+histfile_hook(const char *newval)
+{
+ /*
+ * Someday we might try to validate the filename, but for now, this is
+ * just a placeholder to ensure HISTFILE is known to tab completion.
+ */
+ return true;
+}
+
+static char *
+histsize_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ newval = pg_strdup("500");
+ return newval;
+}
+
+static bool
+histsize_hook(const char *newval)
+{
+ return ParseVariableNum(newval, "HISTSIZE", &pset.histsize);
+}
+
+static char *
+ignoreeof_substitute_hook(char *newval)
+{
+ int dummy;
+
+ /*
+ * This tries to mimic the behavior of bash, to wit "If set, the value is
+ * the number of consecutive EOF characters which must be typed as the
+ * first characters on an input line before bash exits. If the variable
+ * exists but does not have a numeric value, or has no value, the default
+ * value is 10. If it does not exist, EOF signifies the end of input to
+ * the shell." Unlike bash, however, we insist on the stored value
+ * actually being a valid integer.
+ */
+ if (newval == NULL)
+ newval = pg_strdup("0");
+ else if (!ParseVariableNum(newval, NULL, &dummy))
+ newval = pg_strdup("10");
+ return newval;
+}
+
+static bool
+ignoreeof_hook(const char *newval)
+{
+ return ParseVariableNum(newval, "IGNOREEOF", &pset.ignoreeof);
+}
+
+static char *
+echo_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ newval = pg_strdup("none");
+ return newval;
+}
+
+static bool
+echo_hook(const char *newval)
+{
+ Assert(newval != NULL); /* else substitute hook messed up */
+ if (pg_strcasecmp(newval, "queries") == 0)
+ pset.echo = PSQL_ECHO_QUERIES;
+ else if (pg_strcasecmp(newval, "errors") == 0)
+ pset.echo = PSQL_ECHO_ERRORS;
+ else if (pg_strcasecmp(newval, "all") == 0)
+ pset.echo = PSQL_ECHO_ALL;
+ else if (pg_strcasecmp(newval, "none") == 0)
+ pset.echo = PSQL_ECHO_NONE;
+ else
+ {
+ PsqlVarEnumError("ECHO", newval, "none, errors, queries, all");
+ return false;
+ }
+ return true;
+}
+
+static bool
+echo_hidden_hook(const char *newval)
+{
+ Assert(newval != NULL); /* else substitute hook messed up */
+ if (pg_strcasecmp(newval, "noexec") == 0)
+ pset.echo_hidden = PSQL_ECHO_HIDDEN_NOEXEC;
+ else
+ {
+ bool on_off;
+
+ if (ParseVariableBool(newval, NULL, &on_off))
+ pset.echo_hidden = on_off ? PSQL_ECHO_HIDDEN_ON : PSQL_ECHO_HIDDEN_OFF;
+ else
+ {
+ PsqlVarEnumError("ECHO_HIDDEN", newval, "on, off, noexec");
+ return false;
+ }
+ }
+ return true;
+}
+
+static bool
+on_error_rollback_hook(const char *newval)
+{
+ Assert(newval != NULL); /* else substitute hook messed up */
+ if (pg_strcasecmp(newval, "interactive") == 0)
+ pset.on_error_rollback = PSQL_ERROR_ROLLBACK_INTERACTIVE;
+ else
+ {
+ bool on_off;
+
+ if (ParseVariableBool(newval, NULL, &on_off))
+ pset.on_error_rollback = on_off ? PSQL_ERROR_ROLLBACK_ON : PSQL_ERROR_ROLLBACK_OFF;
+ else
+ {
+ PsqlVarEnumError("ON_ERROR_ROLLBACK", newval, "on, off, interactive");
+ return false;
+ }
+ }
+ return true;
+}
+
+static char *
+comp_keyword_case_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ newval = pg_strdup("preserve-upper");
+ return newval;
+}
+
+static bool
+comp_keyword_case_hook(const char *newval)
+{
+ Assert(newval != NULL); /* else substitute hook messed up */
+ if (pg_strcasecmp(newval, "preserve-upper") == 0)
+ pset.comp_case = PSQL_COMP_CASE_PRESERVE_UPPER;
+ else if (pg_strcasecmp(newval, "preserve-lower") == 0)
+ pset.comp_case = PSQL_COMP_CASE_PRESERVE_LOWER;
+ else if (pg_strcasecmp(newval, "upper") == 0)
+ pset.comp_case = PSQL_COMP_CASE_UPPER;
+ else if (pg_strcasecmp(newval, "lower") == 0)
+ pset.comp_case = PSQL_COMP_CASE_LOWER;
+ else
+ {
+ PsqlVarEnumError("COMP_KEYWORD_CASE", newval,
+ "lower, upper, preserve-lower, preserve-upper");
+ return false;
+ }
+ return true;
+}
+
+static char *
+histcontrol_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ newval = pg_strdup("none");
+ return newval;
+}
+
+static bool
+histcontrol_hook(const char *newval)
+{
+ Assert(newval != NULL); /* else substitute hook messed up */
+ if (pg_strcasecmp(newval, "ignorespace") == 0)
+ pset.histcontrol = hctl_ignorespace;
+ else if (pg_strcasecmp(newval, "ignoredups") == 0)
+ pset.histcontrol = hctl_ignoredups;
+ else if (pg_strcasecmp(newval, "ignoreboth") == 0)
+ pset.histcontrol = hctl_ignoreboth;
+ else if (pg_strcasecmp(newval, "none") == 0)
+ pset.histcontrol = hctl_none;
+ else
+ {
+ PsqlVarEnumError("HISTCONTROL", newval,
+ "none, ignorespace, ignoredups, ignoreboth");
+ return false;
+ }
+ return true;
+}
+
+static bool
+prompt1_hook(const char *newval)
+{
+ pset.prompt1 = newval ? newval : "";
+ return true;
+}
+
+static bool
+prompt2_hook(const char *newval)
+{
+ pset.prompt2 = newval ? newval : "";
+ return true;
+}
+
+static bool
+prompt3_hook(const char *newval)
+{
+ pset.prompt3 = newval ? newval : "";
+ return true;
+}
+
+static char *
+verbosity_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ newval = pg_strdup("default");
+ return newval;
+}
+
+static bool
+verbosity_hook(const char *newval)
+{
+ Assert(newval != NULL); /* else substitute hook messed up */
+ if (pg_strcasecmp(newval, "default") == 0)
+ pset.verbosity = PQERRORS_DEFAULT;
+ else if (pg_strcasecmp(newval, "verbose") == 0)
+ pset.verbosity = PQERRORS_VERBOSE;
+ else if (pg_strcasecmp(newval, "terse") == 0)
+ pset.verbosity = PQERRORS_TERSE;
+ else if (pg_strcasecmp(newval, "sqlstate") == 0)
+ pset.verbosity = PQERRORS_SQLSTATE;
+ else
+ {
+ PsqlVarEnumError("VERBOSITY", newval, "default, verbose, terse, sqlstate");
+ return false;
+ }
+
+ if (pset.db)
+ PQsetErrorVerbosity(pset.db, pset.verbosity);
+ return true;
+}
+
+static bool
+show_all_results_hook(const char *newval)
+{
+ return ParseVariableBool(newval, "SHOW_ALL_RESULTS", &pset.show_all_results);
+}
+
+static char *
+show_context_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ newval = pg_strdup("errors");
+ return newval;
+}
+
+static bool
+show_context_hook(const char *newval)
+{
+ Assert(newval != NULL); /* else substitute hook messed up */
+ if (pg_strcasecmp(newval, "never") == 0)
+ pset.show_context = PQSHOW_CONTEXT_NEVER;
+ else if (pg_strcasecmp(newval, "errors") == 0)
+ pset.show_context = PQSHOW_CONTEXT_ERRORS;
+ else if (pg_strcasecmp(newval, "always") == 0)
+ pset.show_context = PQSHOW_CONTEXT_ALWAYS;
+ else
+ {
+ PsqlVarEnumError("SHOW_CONTEXT", newval, "never, errors, always");
+ return false;
+ }
+
+ if (pset.db)
+ PQsetErrorContextVisibility(pset.db, pset.show_context);
+ return true;
+}
+
+static bool
+hide_compression_hook(const char *newval)
+{
+ return ParseVariableBool(newval, "HIDE_TOAST_COMPRESSION",
+ &pset.hide_compression);
+}
+
+static bool
+hide_tableam_hook(const char *newval)
+{
+ return ParseVariableBool(newval, "HIDE_TABLEAM", &pset.hide_tableam);
+}
+
+static void
+EstablishVariableSpace(void)
+{
+ pset.vars = CreateVariableSpace();
+
+ SetVariableHooks(pset.vars, "AUTOCOMMIT",
+ bool_substitute_hook,
+ autocommit_hook);
+ SetVariableHooks(pset.vars, "ON_ERROR_STOP",
+ bool_substitute_hook,
+ on_error_stop_hook);
+ SetVariableHooks(pset.vars, "QUIET",
+ bool_substitute_hook,
+ quiet_hook);
+ SetVariableHooks(pset.vars, "SINGLELINE",
+ bool_substitute_hook,
+ singleline_hook);
+ SetVariableHooks(pset.vars, "SINGLESTEP",
+ bool_substitute_hook,
+ singlestep_hook);
+ SetVariableHooks(pset.vars, "FETCH_COUNT",
+ fetch_count_substitute_hook,
+ fetch_count_hook);
+ SetVariableHooks(pset.vars, "HISTFILE",
+ NULL,
+ histfile_hook);
+ SetVariableHooks(pset.vars, "HISTSIZE",
+ histsize_substitute_hook,
+ histsize_hook);
+ SetVariableHooks(pset.vars, "IGNOREEOF",
+ ignoreeof_substitute_hook,
+ ignoreeof_hook);
+ SetVariableHooks(pset.vars, "ECHO",
+ echo_substitute_hook,
+ echo_hook);
+ SetVariableHooks(pset.vars, "ECHO_HIDDEN",
+ bool_substitute_hook,
+ echo_hidden_hook);
+ SetVariableHooks(pset.vars, "ON_ERROR_ROLLBACK",
+ bool_substitute_hook,
+ on_error_rollback_hook);
+ SetVariableHooks(pset.vars, "COMP_KEYWORD_CASE",
+ comp_keyword_case_substitute_hook,
+ comp_keyword_case_hook);
+ SetVariableHooks(pset.vars, "HISTCONTROL",
+ histcontrol_substitute_hook,
+ histcontrol_hook);
+ SetVariableHooks(pset.vars, "PROMPT1",
+ NULL,
+ prompt1_hook);
+ SetVariableHooks(pset.vars, "PROMPT2",
+ NULL,
+ prompt2_hook);
+ SetVariableHooks(pset.vars, "PROMPT3",
+ NULL,
+ prompt3_hook);
+ SetVariableHooks(pset.vars, "VERBOSITY",
+ verbosity_substitute_hook,
+ verbosity_hook);
+ SetVariableHooks(pset.vars, "SHOW_ALL_RESULTS",
+ bool_substitute_hook,
+ show_all_results_hook);
+ SetVariableHooks(pset.vars, "SHOW_CONTEXT",
+ show_context_substitute_hook,
+ show_context_hook);
+ SetVariableHooks(pset.vars, "HIDE_TOAST_COMPRESSION",
+ bool_substitute_hook,
+ hide_compression_hook);
+ SetVariableHooks(pset.vars, "HIDE_TABLEAM",
+ bool_substitute_hook,
+ hide_tableam_hook);
+}
diff --git a/src/bin/psql/stringutils.c b/src/bin/psql/stringutils.c
new file mode 100644
index 0000000..ba4c4e0
--- /dev/null
+++ b/src/bin/psql/stringutils.c
@@ -0,0 +1,342 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/stringutils.c
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+
+#include "common.h"
+#include "stringutils.h"
+
+
+/*
+ * Replacement for strtok() (a.k.a. poor man's flex)
+ *
+ * Splits a string into tokens, returning one token per call, then NULL
+ * when no more tokens exist in the given string.
+ *
+ * The calling convention is similar to that of strtok, but with more
+ * frammishes.
+ *
+ * s - string to parse, if NULL continue parsing the last string
+ * whitespace - set of whitespace characters that separate tokens
+ * delim - set of non-whitespace separator characters (or NULL)
+ * quote - set of characters that can quote a token (NULL if none)
+ * escape - character that can quote quotes (0 if none)
+ * e_strings - if true, treat E'...' syntax as a valid token
+ * del_quotes - if true, strip quotes from the returned token, else return
+ * it exactly as found in the string
+ * encoding - the active character-set encoding
+ *
+ * Characters in 'delim', if any, will be returned as single-character
+ * tokens unless part of a quoted token.
+ *
+ * Double occurrences of the quoting character are always taken to represent
+ * a single quote character in the data. If escape isn't 0, then escape
+ * followed by anything (except \0) is a data character too.
+ *
+ * The combination of e_strings and del_quotes both true is not currently
+ * handled. This could be fixed but it's not needed anywhere at the moment.
+ *
+ * Note that the string s is _not_ overwritten in this implementation.
+ *
+ * NB: it's okay to vary delim, quote, and escape from one call to the
+ * next on a single source string, but changing whitespace is a bad idea
+ * since you might lose data.
+ */
+char *
+strtokx(const char *s,
+ const char *whitespace,
+ const char *delim,
+ const char *quote,
+ char escape,
+ bool e_strings,
+ bool del_quotes,
+ int encoding)
+{
+ static char *storage = NULL; /* store the local copy of the users
+ * string here */
+ static char *string = NULL; /* pointer into storage where to continue on
+ * next call */
+
+ /* variously abused variables: */
+ unsigned int offset;
+ char *start;
+ char *p;
+
+ if (s)
+ {
+ free(storage);
+
+ /*
+ * We may need extra space to insert delimiter nulls for adjacent
+ * tokens. 2X the space is a gross overestimate, but it's unlikely
+ * that this code will be used on huge strings anyway.
+ */
+ storage = pg_malloc(2 * strlen(s) + 1);
+ strcpy(storage, s);
+ string = storage;
+ }
+
+ if (!storage)
+ return NULL;
+
+ /* skip leading whitespace */
+ offset = strspn(string, whitespace);
+ start = &string[offset];
+
+ /* end of string reached? */
+ if (*start == '\0')
+ {
+ /* technically we don't need to free here, but we're nice */
+ free(storage);
+ storage = NULL;
+ string = NULL;
+ return NULL;
+ }
+
+ /* test if delimiter character */
+ if (delim && strchr(delim, *start))
+ {
+ /*
+ * If not at end of string, we need to insert a null to terminate the
+ * returned token. We can just overwrite the next character if it
+ * happens to be in the whitespace set ... otherwise move over the
+ * rest of the string to make room. (This is why we allocated extra
+ * space above).
+ */
+ p = start + 1;
+ if (*p != '\0')
+ {
+ if (!strchr(whitespace, *p))
+ memmove(p + 1, p, strlen(p) + 1);
+ *p = '\0';
+ string = p + 1;
+ }
+ else
+ {
+ /* at end of string, so no extra work */
+ string = p;
+ }
+
+ return start;
+ }
+
+ /* check for E string */
+ p = start;
+ if (e_strings &&
+ (*p == 'E' || *p == 'e') &&
+ p[1] == '\'')
+ {
+ quote = "'";
+ escape = '\\'; /* if std strings before, not any more */
+ p++;
+ }
+
+ /* test if quoting character */
+ if (quote && strchr(quote, *p))
+ {
+ /* okay, we have a quoted token, now scan for the closer */
+ char thisquote = *p++;
+
+ for (; *p; p += PQmblenBounded(p, encoding))
+ {
+ if (*p == escape && p[1] != '\0')
+ p++; /* process escaped anything */
+ else if (*p == thisquote && p[1] == thisquote)
+ p++; /* process doubled quote */
+ else if (*p == thisquote)
+ {
+ p++; /* skip trailing quote */
+ break;
+ }
+ }
+
+ /*
+ * If not at end of string, we need to insert a null to terminate the
+ * returned token. See notes above.
+ */
+ if (*p != '\0')
+ {
+ if (!strchr(whitespace, *p))
+ memmove(p + 1, p, strlen(p) + 1);
+ *p = '\0';
+ string = p + 1;
+ }
+ else
+ {
+ /* at end of string, so no extra work */
+ string = p;
+ }
+
+ /* Clean up the token if caller wants that */
+ if (del_quotes)
+ strip_quotes(start, thisquote, escape, encoding);
+
+ return start;
+ }
+
+ /*
+ * Otherwise no quoting character. Scan till next whitespace, delimiter
+ * or quote. NB: at this point, *start is known not to be '\0',
+ * whitespace, delim, or quote, so we will consume at least one character.
+ */
+ offset = strcspn(start, whitespace);
+
+ if (delim)
+ {
+ unsigned int offset2 = strcspn(start, delim);
+
+ if (offset > offset2)
+ offset = offset2;
+ }
+
+ if (quote)
+ {
+ unsigned int offset2 = strcspn(start, quote);
+
+ if (offset > offset2)
+ offset = offset2;
+ }
+
+ p = start + offset;
+
+ /*
+ * If not at end of string, we need to insert a null to terminate the
+ * returned token. See notes above.
+ */
+ if (*p != '\0')
+ {
+ if (!strchr(whitespace, *p))
+ memmove(p + 1, p, strlen(p) + 1);
+ *p = '\0';
+ string = p + 1;
+ }
+ else
+ {
+ /* at end of string, so no extra work */
+ string = p;
+ }
+
+ return start;
+}
+
+
+/*
+ * strip_quotes
+ *
+ * Remove quotes from the string at *source. Leading and trailing occurrences
+ * of 'quote' are removed; embedded double occurrences of 'quote' are reduced
+ * to single occurrences; if 'escape' is not 0 then 'escape' removes special
+ * significance of next character.
+ *
+ * Note that the source string is overwritten in-place.
+ */
+void
+strip_quotes(char *source, char quote, char escape, int encoding)
+{
+ char *src;
+ char *dst;
+
+ Assert(source != NULL);
+ Assert(quote != '\0');
+
+ src = dst = source;
+
+ if (*src && *src == quote)
+ src++; /* skip leading quote */
+
+ while (*src)
+ {
+ char c = *src;
+ int i;
+
+ if (c == quote && src[1] == '\0')
+ break; /* skip trailing quote */
+ else if (c == quote && src[1] == quote)
+ src++; /* process doubled quote */
+ else if (c == escape && src[1] != '\0')
+ src++; /* process escaped character */
+
+ i = PQmblenBounded(src, encoding);
+ while (i--)
+ *dst++ = *src++;
+ }
+
+ *dst = '\0';
+}
+
+
+/*
+ * quote_if_needed
+ *
+ * Opposite of strip_quotes(). If "source" denotes itself literally without
+ * quoting or escaping, returns NULL. Otherwise, returns a malloc'd copy with
+ * quoting and escaping applied:
+ *
+ * source - string to parse
+ * entails_quote - any of these present? need outer quotes
+ * quote - doubled within string, affixed to both ends
+ * escape - doubled within string
+ * force_quote - if true, quote the output even if it doesn't "need" it
+ * encoding - the active character-set encoding
+ *
+ * Do not use this as a substitute for PQescapeStringConn(). Use it for
+ * strings to be parsed by strtokx() or psql_scan_slash_option().
+ */
+char *
+quote_if_needed(const char *source, const char *entails_quote,
+ char quote, char escape, bool force_quote,
+ int encoding)
+{
+ const char *src;
+ char *ret;
+ char *dst;
+ bool need_quotes = force_quote;
+
+ Assert(source != NULL);
+ Assert(quote != '\0');
+
+ src = source;
+ dst = ret = pg_malloc(2 * strlen(src) + 3); /* excess */
+
+ *dst++ = quote;
+
+ while (*src)
+ {
+ char c = *src;
+ int i;
+
+ if (c == quote)
+ {
+ need_quotes = true;
+ *dst++ = quote;
+ }
+ else if (c == escape)
+ {
+ need_quotes = true;
+ *dst++ = escape;
+ }
+ else if (strchr(entails_quote, c))
+ need_quotes = true;
+
+ i = PQmblenBounded(src, encoding);
+ while (i--)
+ *dst++ = *src++;
+ }
+
+ *dst++ = quote;
+ *dst = '\0';
+
+ if (!need_quotes)
+ {
+ free(ret);
+ ret = NULL;
+ }
+
+ return ret;
+}
diff --git a/src/bin/psql/stringutils.h b/src/bin/psql/stringutils.h
new file mode 100644
index 0000000..5d49422
--- /dev/null
+++ b/src/bin/psql/stringutils.h
@@ -0,0 +1,28 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/stringutils.h
+ */
+#ifndef STRINGUTILS_H
+#define STRINGUTILS_H
+
+/* The cooler version of strtok() which knows about quotes and doesn't
+ * overwrite your input */
+extern char *strtokx(const char *s,
+ const char *whitespace,
+ const char *delim,
+ const char *quote,
+ char escape,
+ bool e_strings,
+ bool del_quotes,
+ int encoding);
+
+extern void strip_quotes(char *source, char quote, char escape, int encoding);
+
+extern char *quote_if_needed(const char *source, const char *entails_quote,
+ char quote, char escape, bool force_quote,
+ int encoding);
+
+#endif /* STRINGUTILS_H */
diff --git a/src/bin/psql/t/001_basic.pl b/src/bin/psql/t/001_basic.pl
new file mode 100644
index 0000000..f447845
--- /dev/null
+++ b/src/bin/psql/t/001_basic.pl
@@ -0,0 +1,328 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('psql');
+program_version_ok('psql');
+program_options_handling_ok('psql');
+
+# Execute a psql command and check its output.
+sub psql_like
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($node, $sql, $expected_stdout, $test_name) = @_;
+
+ my ($ret, $stdout, $stderr) = $node->psql('postgres', $sql);
+
+ is($ret, 0, "$test_name: exit code 0");
+ is($stderr, '', "$test_name: no stderr");
+ like($stdout, $expected_stdout, "$test_name: matches");
+
+ return;
+}
+
+# Execute a psql command and check that it fails and check the stderr.
+sub psql_fails_like
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($node, $sql, $expected_stderr, $test_name) = @_;
+
+ # Use the context of a WAL sender, some of the tests rely on that.
+ my ($ret, $stdout, $stderr) =
+ $node->psql('postgres', $sql, replication => 'database');
+
+ isnt($ret, 0, "$test_name: exit code not 0");
+ like($stderr, $expected_stderr, "$test_name: matches");
+
+ return;
+}
+
+# test --help=foo, analogous to program_help_ok()
+foreach my $arg (qw(commands variables))
+{
+ my ($stdout, $stderr);
+ my $result;
+
+ $result = IPC::Run::run [ 'psql', "--help=$arg" ], '>', \$stdout, '2>',
+ \$stderr;
+ ok($result, "psql --help=$arg exit code 0");
+ isnt($stdout, '', "psql --help=$arg goes to stdout");
+ is($stderr, '', "psql --help=$arg nothing to stderr");
+}
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init(extra => [ '--locale=C', '--encoding=UTF8' ]);
+$node->append_conf(
+ 'postgresql.conf', q{
+wal_level = 'logical'
+max_replication_slots = 4
+max_wal_senders = 4
+});
+$node->start;
+
+psql_like($node, '\copyright', qr/Copyright/, '\copyright');
+psql_like($node, '\help', qr/ALTER/, '\help without arguments');
+psql_like($node, '\help SELECT', qr/SELECT/, '\help with argument');
+
+# Test clean handling of unsupported replication command responses
+psql_fails_like(
+ $node,
+ 'START_REPLICATION 0/0',
+ qr/unexpected PQresultStatus: 8$/,
+ 'handling of unexpected PQresultStatus');
+
+# test \timing
+psql_like(
+ $node,
+ '\timing on
+SELECT 1',
+ qr/^1$
+^Time: \d+[.,]\d\d\d ms/m,
+ '\timing with successful query');
+
+# test \timing with query that fails
+{
+ my ($ret, $stdout, $stderr) =
+ $node->psql('postgres', "\\timing on\nSELECT error");
+ isnt($ret, 0, '\timing with query error: query failed');
+ like(
+ $stdout,
+ qr/^Time: \d+[.,]\d\d\d ms/m,
+ '\timing with query error: timing output appears');
+ unlike(
+ $stdout,
+ qr/^Time: 0[.,]000 ms/m,
+ '\timing with query error: timing was updated');
+}
+
+# test that ENCODING variable is set and that it is updated when
+# client encoding is changed
+psql_like(
+ $node,
+ '\echo :ENCODING
+set client_encoding = LATIN1;
+\echo :ENCODING',
+ qr/^UTF8$
+^LATIN1$/m,
+ 'ENCODING variable is set and updated');
+
+# test LISTEN/NOTIFY
+psql_like(
+ $node,
+ 'LISTEN foo;
+NOTIFY foo;',
+ qr/^Asynchronous notification "foo" received from server process with PID \d+\.$/,
+ 'notification');
+
+psql_like(
+ $node,
+ "LISTEN foo;
+NOTIFY foo, 'bar';",
+ qr/^Asynchronous notification "foo" with payload "bar" received from server process with PID \d+\.$/,
+ 'notification with payload');
+
+# test behavior and output on server crash
+my ($ret, $out, $err) = $node->psql('postgres',
+ "SELECT 'before' AS running;\n"
+ . "SELECT pg_terminate_backend(pg_backend_pid());\n"
+ . "SELECT 'AFTER' AS not_running;\n");
+
+is($ret, 2, 'server crash: psql exit code');
+like($out, qr/before/, 'server crash: output before crash');
+ok($out !~ qr/AFTER/, 'server crash: no output after crash');
+is( $err,
+ 'psql:<stdin>:2: FATAL: terminating connection due to administrator command
+psql:<stdin>:2: server closed the connection unexpectedly
+ This probably means the server terminated abnormally
+ before or while processing the request.
+psql:<stdin>:2: error: connection to server was lost',
+ 'server crash: error message');
+
+# test \errverbose
+#
+# (This is not in the regular regression tests because the output
+# contains the source code location and we don't want to have to
+# update that every time it changes.)
+
+psql_like(
+ $node,
+ 'SELECT 1;
+\errverbose',
+ qr/^1\nThere is no previous error\.$/,
+ '\errverbose with no previous error');
+
+# There are three main ways to run a query that might affect
+# \errverbose: The normal way, using a cursor by setting FETCH_COUNT,
+# and using \gdesc. Test them all.
+
+like(
+ ( $node->psql(
+ 'postgres',
+ "SELECT error;\n\\errverbose",
+ on_error_stop => 0))[2],
+ qr/\A^psql:<stdin>:1: ERROR: .*$
+^LINE 1: SELECT error;$
+^ *^.*$
+^psql:<stdin>:2: error: ERROR: [0-9A-Z]{5}: .*$
+^LINE 1: SELECT error;$
+^ *^.*$
+^LOCATION: .*$/m,
+ '\errverbose after normal query with error');
+
+like(
+ ( $node->psql(
+ 'postgres',
+ "\\set FETCH_COUNT 1\nSELECT error;\n\\errverbose",
+ on_error_stop => 0))[2],
+ qr/\A^psql:<stdin>:2: ERROR: .*$
+^LINE 2: SELECT error;$
+^ *^.*$
+^psql:<stdin>:3: error: ERROR: [0-9A-Z]{5}: .*$
+^LINE 2: SELECT error;$
+^ *^.*$
+^LOCATION: .*$/m,
+ '\errverbose after FETCH_COUNT query with error');
+
+like(
+ ( $node->psql(
+ 'postgres',
+ "SELECT error\\gdesc\n\\errverbose",
+ on_error_stop => 0))[2],
+ qr/\A^psql:<stdin>:1: ERROR: .*$
+^LINE 1: SELECT error$
+^ *^.*$
+^psql:<stdin>:2: error: ERROR: [0-9A-Z]{5}: .*$
+^LINE 1: SELECT error$
+^ *^.*$
+^LOCATION: .*$/m,
+ '\errverbose after \gdesc with error');
+
+# Check behavior when using multiple -c and -f switches.
+# Note that we cannot test backend-side errors as tests are unstable in this
+# case: IPC::Run can complain about a SIGPIPE if psql quits before reading a
+# query result.
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+$node->safe_psql('postgres', "CREATE TABLE tab_psql_single (a int);");
+
+# Tests with ON_ERROR_STOP.
+$node->command_ok(
+ [
+ 'psql', '-X',
+ '--single-transaction', '-v',
+ 'ON_ERROR_STOP=1', '-c',
+ 'INSERT INTO tab_psql_single VALUES (1)', '-c',
+ 'INSERT INTO tab_psql_single VALUES (2)'
+ ],
+ 'ON_ERROR_STOP, --single-transaction and multiple -c switches');
+my $row_count =
+ $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single');
+is($row_count, '2',
+ '--single-transaction commits transaction, ON_ERROR_STOP and multiple -c switches'
+);
+
+$node->command_fails(
+ [
+ 'psql', '-X',
+ '--single-transaction', '-v',
+ 'ON_ERROR_STOP=1', '-c',
+ 'INSERT INTO tab_psql_single VALUES (3)', '-c',
+ "\\copy tab_psql_single FROM '$tempdir/nonexistent'"
+ ],
+ 'ON_ERROR_STOP, --single-transaction and multiple -c switches, error');
+$row_count =
+ $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single');
+is($row_count, '2',
+ 'client-side error rolls back transaction, ON_ERROR_STOP and multiple -c switches'
+);
+
+# Tests mixing files and commands.
+my $copy_sql_file = "$tempdir/tab_copy.sql";
+my $insert_sql_file = "$tempdir/tab_insert.sql";
+append_to_file($copy_sql_file,
+ "\\copy tab_psql_single FROM '$tempdir/nonexistent';");
+append_to_file($insert_sql_file, 'INSERT INTO tab_psql_single VALUES (4);');
+$node->command_ok(
+ [
+ 'psql', '-X', '--single-transaction', '-v',
+ 'ON_ERROR_STOP=1', '-f', $insert_sql_file, '-f',
+ $insert_sql_file
+ ],
+ 'ON_ERROR_STOP, --single-transaction and multiple -f switches');
+$row_count =
+ $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single');
+is($row_count, '4',
+ '--single-transaction commits transaction, ON_ERROR_STOP and multiple -f switches'
+);
+
+$node->command_fails(
+ [
+ 'psql', '-X', '--single-transaction', '-v',
+ 'ON_ERROR_STOP=1', '-f', $insert_sql_file, '-f',
+ $copy_sql_file
+ ],
+ 'ON_ERROR_STOP, --single-transaction and multiple -f switches, error');
+$row_count =
+ $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single');
+is($row_count, '4',
+ 'client-side error rolls back transaction, ON_ERROR_STOP and multiple -f switches'
+);
+
+# Tests without ON_ERROR_STOP.
+# The last switch fails on \copy. The command returns a failure and the
+# transaction commits.
+$node->command_fails(
+ [
+ 'psql', '-X',
+ '--single-transaction', '-f',
+ $insert_sql_file, '-f',
+ $insert_sql_file, '-c',
+ "\\copy tab_psql_single FROM '$tempdir/nonexistent'"
+ ],
+ 'no ON_ERROR_STOP, --single-transaction and multiple -f/-c switches');
+$row_count =
+ $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single');
+is($row_count, '6',
+ 'client-side error commits transaction, no ON_ERROR_STOP and multiple -f/-c switches'
+);
+
+# The last switch fails on \copy coming from an input file. The command
+# returns a success and the transaction commits.
+$node->command_ok(
+ [
+ 'psql', '-X', '--single-transaction', '-f',
+ $insert_sql_file, '-f', $insert_sql_file, '-f',
+ $copy_sql_file
+ ],
+ 'no ON_ERROR_STOP, --single-transaction and multiple -f switches');
+$row_count =
+ $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single');
+is($row_count, '8',
+ 'client-side error commits transaction, no ON_ERROR_STOP and multiple -f switches'
+);
+
+# The last switch makes the command return a success, and the contents of
+# the transaction commit even if there is a failure in-between.
+$node->command_ok(
+ [
+ 'psql', '-X',
+ '--single-transaction', '-c',
+ 'INSERT INTO tab_psql_single VALUES (5)', '-f',
+ $copy_sql_file, '-c',
+ 'INSERT INTO tab_psql_single VALUES (6)'
+ ],
+ 'no ON_ERROR_STOP, --single-transaction and multiple -c switches');
+$row_count =
+ $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single');
+is($row_count, '10',
+ 'client-side error commits transaction, no ON_ERROR_STOP and multiple -c switches'
+);
+
+done_testing();
diff --git a/src/bin/psql/t/010_tab_completion.pl b/src/bin/psql/t/010_tab_completion.pl
new file mode 100644
index 0000000..2eea515
--- /dev/null
+++ b/src/bin/psql/t/010_tab_completion.pl
@@ -0,0 +1,452 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+use IPC::Run qw(pump finish timer);
+use Data::Dumper;
+
+# Do nothing unless Makefile has told us that the build is --with-readline.
+if (!defined($ENV{with_readline}) || $ENV{with_readline} ne 'yes')
+{
+ plan skip_all => 'readline is not supported by this build';
+}
+
+# Also, skip if user has set environment variable to command that.
+# This is mainly intended to allow working around some of the more broken
+# versions of libedit --- some users might find them acceptable even if
+# they won't pass these tests.
+if (defined($ENV{SKIP_READLINE_TESTS}))
+{
+ plan skip_all => 'SKIP_READLINE_TESTS is set';
+}
+
+# If we don't have IO::Pty, forget it, because IPC::Run depends on that
+# to support pty connections
+eval { require IO::Pty; };
+if ($@)
+{
+ plan skip_all => 'IO::Pty is needed to run this test';
+}
+
+# start a new server
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+# set up a few database objects
+$node->safe_psql('postgres',
+ "CREATE TABLE tab1 (c1 int primary key, c2 text);\n"
+ . "CREATE TABLE mytab123 (f1 int, f2 text);\n"
+ . "CREATE TABLE mytab246 (f1 int, f2 text);\n"
+ . "CREATE TABLE \"mixedName\" (f1 int, f2 text);\n"
+ . "CREATE TYPE enum1 AS ENUM ('foo', 'bar', 'baz', 'BLACK');\n"
+ . "CREATE PUBLICATION some_publication;\n");
+
+# Developers would not appreciate this test adding a bunch of junk to
+# their ~/.psql_history, so be sure to redirect history into a temp file.
+# We might as well put it in the test log directory, so that buildfarm runs
+# capture the result for possible debugging purposes.
+my $historyfile = "${PostgreSQL::Test::Utils::log_path}/010_psql_history.txt";
+$ENV{PSQL_HISTORY} = $historyfile;
+
+# Another pitfall for developers is that they might have a ~/.inputrc
+# file that changes readline's behavior enough to affect this test.
+# So ignore any such file.
+$ENV{INPUTRC} = '/dev/null';
+
+# Unset $TERM so that readline/libedit won't use any terminal-dependent
+# escape sequences; that leads to way too many cross-version variations
+# in the output.
+delete $ENV{TERM};
+# Some versions of readline inspect LS_COLORS, so for luck unset that too.
+delete $ENV{LS_COLORS};
+
+# In a VPATH build, we'll be started in the source directory, but we want
+# to run in the build directory so that we can use relative paths to
+# access the tmp_check subdirectory; otherwise the output from filename
+# completion tests is too variable.
+if ($ENV{TESTDIR})
+{
+ chdir $ENV{TESTDIR} or die "could not chdir to \"$ENV{TESTDIR}\": $!";
+}
+
+# Create some junk files for filename completion testing.
+my $FH;
+open $FH, ">", "tmp_check/somefile"
+ or die("could not create file \"tmp_check/somefile\": $!");
+print $FH "some stuff\n";
+close $FH;
+open $FH, ">", "tmp_check/afile123"
+ or die("could not create file \"tmp_check/afile123\": $!");
+print $FH "more stuff\n";
+close $FH;
+open $FH, ">", "tmp_check/afile456"
+ or die("could not create file \"tmp_check/afile456\": $!");
+print $FH "other stuff\n";
+close $FH;
+
+# fire up an interactive psql session
+my $in = '';
+my $out = '';
+
+my $timer = timer($PostgreSQL::Test::Utils::timeout_default);
+
+my $h = $node->interactive_psql('postgres', \$in, \$out, $timer);
+
+like($out, qr/psql/, "print startup banner");
+
+# Simple test case: type something and see if psql responds as expected
+sub check_completion
+{
+ my ($send, $pattern, $annotation) = @_;
+
+ # report test failures from caller location
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ # reset output collector
+ $out = "";
+ # restart per-command timer
+ $timer->start($PostgreSQL::Test::Utils::timeout_default);
+ # send the data to be sent
+ $in .= $send;
+ # wait ...
+ pump $h until ($out =~ $pattern || $timer->is_expired);
+ my $okay = ($out =~ $pattern && !$timer->is_expired);
+ ok($okay, $annotation);
+ # for debugging, log actual output if it didn't match
+ local $Data::Dumper::Terse = 1;
+ local $Data::Dumper::Useqq = 1;
+ diag 'Actual output was ' . Dumper($out) . "Did not match \"$pattern\"\n"
+ if !$okay;
+ return;
+}
+
+# Clear query buffer to start over
+# (won't work if we are inside a string literal!)
+sub clear_query
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ check_completion("\\r\n", qr/Query buffer reset.*postgres=# /s,
+ "\\r works");
+ return;
+}
+
+# Clear current line to start over
+# (this will work in an incomplete string literal, but it's less desirable
+# than clear_query because we lose evidence in the history file)
+sub clear_line
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ check_completion("\025\n", qr/postgres=# /, "control-U works");
+ return;
+}
+
+# check basic command completion: SEL<tab> produces SELECT<space>
+check_completion("SEL\t", qr/SELECT /, "complete SEL<tab> to SELECT");
+
+clear_query();
+
+# check case variation is honored
+check_completion("sel\t", qr/select /, "complete sel<tab> to select");
+
+# check basic table name completion
+check_completion("* from t\t", qr/\* from tab1 /, "complete t<tab> to tab1");
+
+clear_query();
+
+# check table name completion with multiple alternatives
+# note: readline might print a bell before the completion
+check_completion(
+ "select * from my\t",
+ qr/select \* from my\a?tab/,
+ "complete my<tab> to mytab when there are multiple choices");
+
+# some versions of readline/libedit require two tabs here, some only need one
+check_completion(
+ "\t\t",
+ qr/mytab123 +mytab246/,
+ "offer multiple table choices");
+
+check_completion("2\t", qr/246 /,
+ "finish completion of one of multiple table choices");
+
+clear_query();
+
+# check handling of quoted names
+check_completion(
+ "select * from \"my\t",
+ qr/select \* from "my\a?tab/,
+ "complete \"my<tab> to \"mytab when there are multiple choices");
+
+check_completion(
+ "\t\t",
+ qr/"mytab123" +"mytab246"/,
+ "offer multiple quoted table choices");
+
+# note: broken versions of libedit want to backslash the closing quote;
+# not much we can do about that
+check_completion("2\t", qr/246\\?" /,
+ "finish completion of one of multiple quoted table choices");
+
+# note: broken versions of libedit may leave us in a state where psql
+# thinks there's an unclosed double quote, so that we have to use
+# clear_line not clear_query here
+clear_line();
+
+# check handling of mixed-case names
+# note: broken versions of libedit want to backslash the closing quote;
+# not much we can do about that
+check_completion(
+ "select * from \"mi\t",
+ qr/"mixedName\\?" /,
+ "complete a mixed-case name");
+
+# as above, must use clear_line not clear_query here
+clear_line();
+
+# check case folding
+check_completion("select * from TAB\t", qr/tab1 /, "automatically fold case");
+
+clear_query();
+
+# check case-sensitive keyword replacement
+# note: various versions of readline/libedit handle backspacing
+# differently, so just check that the replacement comes out correctly
+check_completion("\\DRD\t", qr/drds /, "complete \\DRD<tab> to \\drds");
+
+# broken versions of libedit require clear_line not clear_query here
+clear_line();
+
+# check completion of a schema-qualified name
+check_completion("select * from pub\t",
+ qr/public\./, "complete schema when relevant");
+
+check_completion("tab\t", qr/tab1 /, "complete schema-qualified name");
+
+clear_query();
+
+check_completion(
+ "select * from PUBLIC.t\t",
+ qr/public\.tab1 /,
+ "automatically fold case in schema-qualified name");
+
+clear_query();
+
+# check interpretation of referenced names
+check_completion(
+ "alter table tab1 drop constraint \t",
+ qr/tab1_pkey /,
+ "complete index name for referenced table");
+
+clear_query();
+
+check_completion(
+ "alter table TAB1 drop constraint \t",
+ qr/tab1_pkey /,
+ "complete index name for referenced table, with downcasing");
+
+clear_query();
+
+check_completion(
+ "alter table public.\"tab1\" drop constraint \t",
+ qr/tab1_pkey /,
+ "complete index name for referenced table, with schema and quoting");
+
+clear_query();
+
+# check variant where we're completing a qualified name from a refname
+# (this one also checks successful completion in a multiline command)
+check_completion(
+ "comment on constraint tab1_pkey \n on public.\t",
+ qr/public\.tab1/,
+ "complete qualified name from object reference");
+
+clear_query();
+
+# check filename completion
+check_completion(
+ "\\lo_import tmp_check/some\t",
+ qr|tmp_check/somefile |,
+ "filename completion with one possibility");
+
+clear_query();
+
+# note: readline might print a bell before the completion
+check_completion(
+ "\\lo_import tmp_check/af\t",
+ qr|tmp_check/af\a?ile|,
+ "filename completion with multiple possibilities");
+
+# broken versions of libedit require clear_line not clear_query here
+clear_line();
+
+# COPY requires quoting
+# note: broken versions of libedit want to backslash the closing quote;
+# not much we can do about that
+check_completion(
+ "COPY foo FROM tmp_check/some\t",
+ qr|'tmp_check/somefile\\?' |,
+ "quoted filename completion with one possibility");
+
+clear_line();
+
+check_completion(
+ "COPY foo FROM tmp_check/af\t",
+ qr|'tmp_check/afile|,
+ "quoted filename completion with multiple possibilities");
+
+# some versions of readline/libedit require two tabs here, some only need one
+# also, some will offer the whole path name and some just the file name
+# the quotes might appear, too
+check_completion(
+ "\t\t",
+ qr|afile123'? +'?(tmp_check/)?afile456|,
+ "offer multiple file choices");
+
+clear_line();
+
+# check enum label completion
+# some versions of readline/libedit require two tabs here, some only need one
+# also, some versions will offer quotes, some will not
+check_completion(
+ "ALTER TYPE enum1 RENAME VALUE 'ba\t\t",
+ qr|'?bar'? +'?baz'?|,
+ "offer multiple enum choices");
+
+clear_line();
+
+# enum labels are case sensitive, so this should complete BLACK immediately
+check_completion(
+ "ALTER TYPE enum1 RENAME VALUE 'B\t",
+ qr|BLACK|,
+ "enum labels are case sensitive");
+
+clear_line();
+
+# check timezone name completion
+check_completion("SET timezone TO am\t",
+ qr|'America/|, "offer partial timezone name");
+
+check_completion("new_\t", qr|New_York|, "complete partial timezone name");
+
+clear_line();
+
+# check completion of a keyword offered in addition to object names;
+# such a keyword should obey COMP_KEYWORD_CASE
+foreach (
+ [ 'lower', 'CO', 'column' ],
+ [ 'upper', 'co', 'COLUMN' ],
+ [ 'preserve-lower', 'co', 'column' ],
+ [ 'preserve-upper', 'CO', 'COLUMN' ],)
+{
+ my ($case, $in, $out) = @$_;
+
+ check_completion(
+ "\\set COMP_KEYWORD_CASE $case\n",
+ qr/postgres=#/,
+ "set completion case to '$case'");
+ check_completion("alter table tab1 rename $in\t\t\t",
+ qr|$out|,
+ "offer keyword $out for input $in<TAB>, COMP_KEYWORD_CASE = $case");
+ clear_query();
+}
+
+# alternate path where keyword comes from SchemaQuery
+check_completion(
+ "DROP TYPE big\t",
+ qr/DROP TYPE bigint /,
+ "offer keyword from SchemaQuery");
+
+clear_query();
+
+# check create_command_generator
+check_completion(
+ "CREATE TY\t",
+ qr/CREATE TYPE /,
+ "check create_command_generator");
+
+clear_query();
+
+# check words_after_create infrastructure
+check_completion(
+ "CREATE TABLE mytab\t\t",
+ qr/mytab123 +mytab246/,
+ "check words_after_create");
+
+clear_query();
+
+# check VersionedQuery infrastructure
+check_completion(
+ "DROP PUBLIC\t \t\t",
+ qr/DROP PUBLICATION\s+some_publication /,
+ "check VersionedQuery");
+
+clear_query();
+
+# hits ends_with() and logic for completing in multi-line queries
+check_completion("analyze (\n\t\t", qr/VERBOSE/,
+ "check ANALYZE (VERBOSE ...");
+
+clear_query();
+
+# check completions for GUCs
+check_completion(
+ "set interval\t\t",
+ qr/intervalstyle TO/,
+ "complete a GUC name");
+check_completion(" iso\t", qr/iso_8601 /, "complete a GUC enum value");
+
+clear_query();
+
+# same, for qualified GUC names
+check_completion(
+ "DO \$\$begin end\$\$ LANGUAGE plpgsql;\n",
+ qr/postgres=# /,
+ "load plpgsql extension");
+
+check_completion("set plpg\t", qr/plpg\a?sql\./,
+ "complete prefix of a GUC name");
+check_completion(
+ "var\t\t",
+ qr/variable_conflict TO/,
+ "complete a qualified GUC name");
+check_completion(" USE_C\t",
+ qr/use_column/, "complete a qualified GUC enum value");
+
+clear_query();
+
+# check completions for psql variables
+check_completion("\\set VERB\t", qr/VERBOSITY /,
+ "complete a psql variable name");
+check_completion("def\t", qr/default /, "complete a psql variable value");
+
+clear_query();
+
+check_completion(
+ "\\echo :VERB\t",
+ qr/:VERBOSITY /,
+ "complete an interpolated psql variable name");
+
+clear_query();
+
+# check no-completions code path
+check_completion("blarg \t\t", qr//, "check completion failure path");
+
+clear_query();
+
+# send psql an explicit \q to shut it down, else pty won't close properly
+$timer->start($PostgreSQL::Test::Utils::timeout_default);
+$in .= "\\q\n";
+finish $h or die "psql returned $?";
+$timer->reset;
+
+# done
+$node->stop;
+done_testing();
diff --git a/src/bin/psql/t/020_cancel.pl b/src/bin/psql/t/020_cancel.pl
new file mode 100644
index 0000000..0265b86
--- /dev/null
+++ b/src/bin/psql/t/020_cancel.pl
@@ -0,0 +1,80 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+use Time::HiRes qw(usleep);
+
+# Test query canceling by sending SIGINT to a running psql
+#
+# There is, as of this writing, no documented way to get the PID of
+# the process from IPC::Run. As a workaround, we have psql print its
+# own PID (which is the parent of the shell launched by psql) to a
+# file.
+if ($windows_os)
+{
+ plan skip_all => "cancel test requires a Unix shell";
+}
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+local %ENV = $node->_get_env();
+
+my ($stdin, $stdout, $stderr);
+
+# Test whether shell supports $PPID. It's part of POSIX, but some
+# pre-/non-POSIX shells don't support it (e.g., NetBSD).
+$stdin = "\\! echo \$PPID";
+IPC::Run::run([ 'psql', '-X', '-v', 'ON_ERROR_STOP=1' ],
+ '<', \$stdin, '>', \$stdout, '2>', \$stderr);
+$stdout =~ /^\d+$/ or skip "shell apparently does not support \$PPID", 2;
+
+# Now start the real test
+my $h = IPC::Run::start([ 'psql', '-X', '-v', 'ON_ERROR_STOP=1' ],
+ \$stdin, \$stdout, \$stderr);
+
+# Get the PID
+$stdout = '';
+$stderr = '';
+$stdin = "\\! echo \$PPID >$tempdir/psql.pid\n";
+pump $h while length $stdin;
+my $count;
+my $psql_pid;
+until (
+ -s "$tempdir/psql.pid"
+ and ($psql_pid =
+ PostgreSQL::Test::Utils::slurp_file("$tempdir/psql.pid")) =~
+ /^\d+\n/s)
+{
+ ($count++ < 100 * $PostgreSQL::Test::Utils::timeout_default)
+ or die "pid file did not appear";
+ usleep(10_000);
+}
+
+# Send sleep command and wait until the server has registered it
+$stdin = "select pg_sleep($PostgreSQL::Test::Utils::timeout_default);\n";
+pump $h while length $stdin;
+$node->poll_query_until('postgres',
+ q{SELECT (SELECT count(*) FROM pg_stat_activity WHERE query ~ '^select pg_sleep') > 0;}
+) or die "timed out";
+
+# Send cancel request
+kill 'INT', $psql_pid;
+
+my $result = finish $h;
+
+ok(!$result, 'query failed as expected');
+like(
+ $stderr,
+ qr/canceling statement due to user request/,
+ 'query was canceled');
+
+done_testing();
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
new file mode 100644
index 0000000..f6e7011
--- /dev/null
+++ b/src/bin/psql/tab-complete.c
@@ -0,0 +1,6238 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/tab-complete.c
+ */
+
+/*----------------------------------------------------------------------
+ * This file implements a somewhat more sophisticated readline "TAB
+ * completion" in psql. It is not intended to be AI, to replace
+ * learning SQL, or to relieve you from thinking about what you're
+ * doing. Also it does not always give you all the syntactically legal
+ * completions, only those that are the most common or the ones that
+ * the programmer felt most like implementing.
+ *
+ * CAVEAT: Tab completion causes queries to be sent to the backend.
+ * The number of tuples returned gets limited, in most default
+ * installations to 1000, but if you still don't like this prospect,
+ * you can turn off tab completion in your ~/.inputrc (or else
+ * ${INPUTRC}) file so:
+ *
+ * $if psql
+ * set disable-completion on
+ * $endif
+ *
+ * See `man 3 readline' or `info readline' for the full details.
+ *
+ * BUGS:
+ * - Quotes, parentheses, and other funny characters are not handled
+ * all that gracefully.
+ *----------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include "input.h"
+#include "tab-complete.h"
+
+/* If we don't have this, we might as well forget about the whole thing: */
+#ifdef USE_READLINE
+
+#include <ctype.h>
+#include <sys/stat.h>
+
+#include "catalog/pg_am_d.h"
+#include "catalog/pg_class_d.h"
+#include "common.h"
+#include "common/keywords.h"
+#include "libpq-fe.h"
+#include "mb/pg_wchar.h"
+#include "pqexpbuffer.h"
+#include "settings.h"
+#include "stringutils.h"
+
+/*
+ * Ancient versions of libedit provide filename_completion_function()
+ * instead of rl_filename_completion_function(). Likewise for
+ * [rl_]completion_matches().
+ */
+#ifndef HAVE_RL_FILENAME_COMPLETION_FUNCTION
+#define rl_filename_completion_function filename_completion_function
+#endif
+
+#ifndef HAVE_RL_COMPLETION_MATCHES
+#define rl_completion_matches completion_matches
+#endif
+
+/*
+ * Currently we assume that rl_filename_dequoting_function exists if
+ * rl_filename_quoting_function does. If that proves not to be the case,
+ * we'd need to test for the former, or possibly both, in configure.
+ */
+#ifdef HAVE_RL_FILENAME_QUOTING_FUNCTION
+#define USE_FILENAME_QUOTING_FUNCTIONS 1
+#endif
+
+/* word break characters */
+#define WORD_BREAKS "\t\n@$><=;|&{() "
+
+/*
+ * Since readline doesn't let us pass any state through to the tab completion
+ * callback, we have to use this global variable to let get_previous_words()
+ * get at the previous lines of the current command. Ick.
+ */
+PQExpBuffer tab_completion_query_buf = NULL;
+
+/*
+ * In some situations, the query to find out what names are available to
+ * complete with must vary depending on server version. We handle this by
+ * storing a list of queries, each tagged with the minimum server version
+ * it will work for. Each list must be stored in descending server version
+ * order, so that the first satisfactory query is the one to use.
+ *
+ * When the query string is otherwise constant, an array of VersionedQuery
+ * suffices. Terminate the array with an entry having min_server_version = 0.
+ * That entry's query string can be a query that works in all supported older
+ * server versions, or NULL to give up and do no completion.
+ */
+typedef struct VersionedQuery
+{
+ int min_server_version;
+ const char *query;
+} VersionedQuery;
+
+/*
+ * This struct is used to define "schema queries", which are custom-built
+ * to obtain possibly-schema-qualified names of database objects. There is
+ * enough similarity in the structure that we don't want to repeat it each
+ * time. So we put the components of each query into this struct and
+ * assemble them with the common boilerplate in _complete_from_query().
+ *
+ * We also use this struct to define queries that use completion_ref_object,
+ * which is some object related to the one(s) we want to get the names of
+ * (for example, the table we want the indexes of). In that usage the
+ * objects we're completing might not have a schema of their own, but the
+ * reference object almost always does (passed in completion_ref_schema).
+ *
+ * As with VersionedQuery, we can use an array of these if the query details
+ * must vary across versions.
+ */
+typedef struct SchemaQuery
+{
+ /*
+ * If not zero, minimum server version this struct applies to. If not
+ * zero, there should be a following struct with a smaller minimum server
+ * version; use catname == NULL in the last entry if we should do nothing.
+ */
+ int min_server_version;
+
+ /*
+ * Name of catalog or catalogs to be queried, with alias(es), eg.
+ * "pg_catalog.pg_class c". Note that "pg_namespace n" and/or
+ * "pg_namespace nr" will be added automatically when needed.
+ */
+ const char *catname;
+
+ /*
+ * Selection condition --- only rows meeting this condition are candidates
+ * to display. If catname mentions multiple tables, include the necessary
+ * join condition here. For example, this might look like "c.relkind = "
+ * CppAsString2(RELKIND_RELATION). Write NULL (not an empty string) if
+ * not needed.
+ */
+ const char *selcondition;
+
+ /*
+ * Visibility condition --- which rows are visible without schema
+ * qualification? For example, "pg_catalog.pg_table_is_visible(c.oid)".
+ * NULL if not needed.
+ */
+ const char *viscondition;
+
+ /*
+ * Namespace --- name of field to join to pg_namespace.oid when there is
+ * schema qualification. For example, "c.relnamespace". NULL if we don't
+ * want to join to pg_namespace (then any schema part in the input word
+ * will be ignored).
+ */
+ const char *namespace;
+
+ /*
+ * Result --- the base object name to return. For example, "c.relname".
+ */
+ const char *result;
+
+ /*
+ * In some cases, it's difficult to keep the query from returning the same
+ * object multiple times. Specify use_distinct to filter out duplicates.
+ */
+ bool use_distinct;
+
+ /*
+ * Additional literal strings (usually keywords) to be offered along with
+ * the query results. Provide a NULL-terminated array of constant
+ * strings, or NULL if none.
+ */
+ const char *const *keywords;
+
+ /*
+ * If this query uses completion_ref_object/completion_ref_schema,
+ * populate the remaining fields, else leave them NULL. When using this
+ * capability, catname must include the catalog that defines the
+ * completion_ref_object, and selcondition must include the join condition
+ * that connects it to the result's catalog.
+ *
+ * refname is the field that should be equated to completion_ref_object,
+ * for example "cr.relname".
+ */
+ const char *refname;
+
+ /*
+ * Visibility condition to use when completion_ref_schema is not set. For
+ * example, "pg_catalog.pg_table_is_visible(cr.oid)". NULL if not needed.
+ */
+ const char *refviscondition;
+
+ /*
+ * Name of field to join to pg_namespace.oid when completion_ref_schema is
+ * set. For example, "cr.relnamespace". NULL if we don't want to
+ * consider completion_ref_schema.
+ */
+ const char *refnamespace;
+} SchemaQuery;
+
+
+/* Store maximum number of records we want from database queries
+ * (implemented via SELECT ... LIMIT xx).
+ */
+static int completion_max_records;
+
+/*
+ * Communication variables set by psql_completion (mostly in COMPLETE_WITH_FOO
+ * macros) and then used by the completion callback functions. Ugly but there
+ * is no better way.
+ */
+static char completion_last_char; /* last char of input word */
+static const char *completion_charp; /* to pass a string */
+static const char *const *completion_charpp; /* to pass a list of strings */
+static const VersionedQuery *completion_vquery; /* to pass a VersionedQuery */
+static const SchemaQuery *completion_squery; /* to pass a SchemaQuery */
+static char *completion_ref_object; /* name of reference object */
+static char *completion_ref_schema; /* schema name of reference object */
+static bool completion_case_sensitive; /* completion is case sensitive */
+static bool completion_verbatim; /* completion is verbatim */
+static bool completion_force_quote; /* true to force-quote filenames */
+
+/*
+ * A few macros to ease typing. You can use these to complete the given
+ * string with
+ * 1) The result from a query you pass it. (Perhaps one of those below?)
+ * We support both simple and versioned queries.
+ * 2) The result from a schema query you pass it.
+ * We support both simple and versioned schema queries.
+ * 3) The items from a null-pointer-terminated list (with or without
+ * case-sensitive comparison); if the list is constant you can build it
+ * with COMPLETE_WITH() or COMPLETE_WITH_CS(). The QUERY_LIST and
+ * QUERY_PLUS forms combine such literal lists with a query result.
+ * 4) The list of attributes of the given table (possibly schema-qualified).
+ * 5) The list of arguments to the given function (possibly schema-qualified).
+ *
+ * The query is generally expected to return raw SQL identifiers; matching
+ * to what the user typed is done in a quoting-aware fashion. If what is
+ * returned is not SQL identifiers, use one of the VERBATIM forms, in which
+ * case the query results are matched to the user's text without double-quote
+ * processing (so if quoting is needed, you must provide it in the query
+ * results).
+ */
+#define COMPLETE_WITH_QUERY(query) \
+ COMPLETE_WITH_QUERY_LIST(query, NULL)
+
+#define COMPLETE_WITH_QUERY_LIST(query, list) \
+do { \
+ completion_charp = query; \
+ completion_charpp = list; \
+ completion_verbatim = false; \
+ matches = rl_completion_matches(text, complete_from_query); \
+} while (0)
+
+#define COMPLETE_WITH_QUERY_PLUS(query, ...) \
+do { \
+ static const char *const list[] = { __VA_ARGS__, NULL }; \
+ COMPLETE_WITH_QUERY_LIST(query, list); \
+} while (0)
+
+#define COMPLETE_WITH_QUERY_VERBATIM(query) \
+ COMPLETE_WITH_QUERY_VERBATIM_LIST(query, NULL)
+
+#define COMPLETE_WITH_QUERY_VERBATIM_LIST(query, list) \
+do { \
+ completion_charp = query; \
+ completion_charpp = list; \
+ completion_verbatim = true; \
+ matches = rl_completion_matches(text, complete_from_query); \
+} while (0)
+
+#define COMPLETE_WITH_QUERY_VERBATIM_PLUS(query, ...) \
+do { \
+ static const char *const list[] = { __VA_ARGS__, NULL }; \
+ COMPLETE_WITH_QUERY_VERBATIM_LIST(query, list); \
+} while (0)
+
+#define COMPLETE_WITH_VERSIONED_QUERY(query) \
+ COMPLETE_WITH_VERSIONED_QUERY_LIST(query, NULL)
+
+#define COMPLETE_WITH_VERSIONED_QUERY_LIST(query, list) \
+do { \
+ completion_vquery = query; \
+ completion_charpp = list; \
+ completion_verbatim = false; \
+ matches = rl_completion_matches(text, complete_from_versioned_query); \
+} while (0)
+
+#define COMPLETE_WITH_VERSIONED_QUERY_PLUS(query, ...) \
+do { \
+ static const char *const list[] = { __VA_ARGS__, NULL }; \
+ COMPLETE_WITH_VERSIONED_QUERY_LIST(query, list); \
+} while (0)
+
+#define COMPLETE_WITH_SCHEMA_QUERY(query) \
+ COMPLETE_WITH_SCHEMA_QUERY_LIST(query, NULL)
+
+#define COMPLETE_WITH_SCHEMA_QUERY_LIST(query, list) \
+do { \
+ completion_squery = &(query); \
+ completion_charpp = list; \
+ completion_verbatim = false; \
+ matches = rl_completion_matches(text, complete_from_schema_query); \
+} while (0)
+
+#define COMPLETE_WITH_SCHEMA_QUERY_PLUS(query, ...) \
+do { \
+ static const char *const list[] = { __VA_ARGS__, NULL }; \
+ COMPLETE_WITH_SCHEMA_QUERY_LIST(query, list); \
+} while (0)
+
+#define COMPLETE_WITH_SCHEMA_QUERY_VERBATIM(query) \
+do { \
+ completion_squery = &(query); \
+ completion_charpp = NULL; \
+ completion_verbatim = true; \
+ matches = rl_completion_matches(text, complete_from_schema_query); \
+} while (0)
+
+#define COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(query) \
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(query, NULL)
+
+#define COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(query, list) \
+do { \
+ completion_squery = query; \
+ completion_charpp = list; \
+ completion_verbatim = false; \
+ matches = rl_completion_matches(text, complete_from_versioned_schema_query); \
+} while (0)
+
+#define COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_PLUS(query, ...) \
+do { \
+ static const char *const list[] = { __VA_ARGS__, NULL }; \
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(query, list); \
+} while (0)
+
+/*
+ * Caution: COMPLETE_WITH_CONST is not for general-purpose use; you probably
+ * want COMPLETE_WITH() with one element, instead.
+ */
+#define COMPLETE_WITH_CONST(cs, con) \
+do { \
+ completion_case_sensitive = (cs); \
+ completion_charp = (con); \
+ matches = rl_completion_matches(text, complete_from_const); \
+} while (0)
+
+#define COMPLETE_WITH_LIST_INT(cs, list) \
+do { \
+ completion_case_sensitive = (cs); \
+ completion_charpp = (list); \
+ matches = rl_completion_matches(text, complete_from_list); \
+} while (0)
+
+#define COMPLETE_WITH_LIST(list) COMPLETE_WITH_LIST_INT(false, list)
+#define COMPLETE_WITH_LIST_CS(list) COMPLETE_WITH_LIST_INT(true, list)
+
+#define COMPLETE_WITH(...) \
+do { \
+ static const char *const list[] = { __VA_ARGS__, NULL }; \
+ COMPLETE_WITH_LIST(list); \
+} while (0)
+
+#define COMPLETE_WITH_CS(...) \
+do { \
+ static const char *const list[] = { __VA_ARGS__, NULL }; \
+ COMPLETE_WITH_LIST_CS(list); \
+} while (0)
+
+#define COMPLETE_WITH_ATTR(relation) \
+ COMPLETE_WITH_ATTR_LIST(relation, NULL)
+
+#define COMPLETE_WITH_ATTR_LIST(relation, list) \
+do { \
+ set_completion_reference(relation); \
+ completion_squery = &(Query_for_list_of_attributes); \
+ completion_charpp = list; \
+ completion_verbatim = false; \
+ matches = rl_completion_matches(text, complete_from_schema_query); \
+} while (0)
+
+#define COMPLETE_WITH_ATTR_PLUS(relation, ...) \
+do { \
+ static const char *const list[] = { __VA_ARGS__, NULL }; \
+ COMPLETE_WITH_ATTR_LIST(relation, list); \
+} while (0)
+
+/*
+ * libedit will typically include the literal's leading single quote in
+ * "text", while readline will not. Adapt our offered strings to fit.
+ * But include a quote if there's not one just before "text", to get the
+ * user off to the right start.
+ */
+#define COMPLETE_WITH_ENUM_VALUE(type) \
+do { \
+ set_completion_reference(type); \
+ if (text[0] == '\'' || \
+ start == 0 || rl_line_buffer[start - 1] != '\'') \
+ completion_squery = &(Query_for_list_of_enum_values_quoted); \
+ else \
+ completion_squery = &(Query_for_list_of_enum_values_unquoted); \
+ completion_charpp = NULL; \
+ completion_verbatim = true; \
+ matches = rl_completion_matches(text, complete_from_schema_query); \
+} while (0)
+
+/*
+ * Timezone completion is mostly like enum label completion, but we work
+ * a little harder since this is a more common use-case.
+ */
+#define COMPLETE_WITH_TIMEZONE_NAME() \
+do { \
+ static const char *const list[] = { "DEFAULT", NULL }; \
+ if (text[0] == '\'') \
+ completion_charp = Query_for_list_of_timezone_names_quoted_in; \
+ else if (start == 0 || rl_line_buffer[start - 1] != '\'') \
+ completion_charp = Query_for_list_of_timezone_names_quoted_out; \
+ else \
+ completion_charp = Query_for_list_of_timezone_names_unquoted; \
+ completion_charpp = list; \
+ completion_verbatim = true; \
+ matches = rl_completion_matches(text, complete_from_query); \
+} while (0)
+
+#define COMPLETE_WITH_FUNCTION_ARG(function) \
+do { \
+ set_completion_reference(function); \
+ completion_squery = &(Query_for_list_of_arguments); \
+ completion_charpp = NULL; \
+ completion_verbatim = true; \
+ matches = rl_completion_matches(text, complete_from_schema_query); \
+} while (0)
+
+/*
+ * Assembly instructions for schema queries
+ *
+ * Note that toast tables are not included in those queries to avoid
+ * unnecessary bloat in the completions generated.
+ */
+
+static const SchemaQuery Query_for_constraint_of_table = {
+ .catname = "pg_catalog.pg_constraint con, pg_catalog.pg_class c1",
+ .selcondition = "con.conrelid=c1.oid",
+ .result = "con.conname",
+ .refname = "c1.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)",
+ .refnamespace = "c1.relnamespace",
+};
+
+static const SchemaQuery Query_for_constraint_of_table_not_validated = {
+ .catname = "pg_catalog.pg_constraint con, pg_catalog.pg_class c1",
+ .selcondition = "con.conrelid=c1.oid and not con.convalidated",
+ .result = "con.conname",
+ .refname = "c1.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)",
+ .refnamespace = "c1.relnamespace",
+};
+
+static const SchemaQuery Query_for_constraint_of_type = {
+ .catname = "pg_catalog.pg_constraint con, pg_catalog.pg_type t",
+ .selcondition = "con.contypid=t.oid",
+ .result = "con.conname",
+ .refname = "t.typname",
+ .refviscondition = "pg_catalog.pg_type_is_visible(t.oid)",
+ .refnamespace = "t.typnamespace",
+};
+
+static const SchemaQuery Query_for_index_of_table = {
+ .catname = "pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_index i",
+ .selcondition = "c1.oid=i.indrelid and i.indexrelid=c2.oid",
+ .result = "c2.relname",
+ .refname = "c1.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)",
+ .refnamespace = "c1.relnamespace",
+};
+
+static const SchemaQuery Query_for_unique_index_of_table = {
+ .catname = "pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_index i",
+ .selcondition = "c1.oid=i.indrelid and i.indexrelid=c2.oid and i.indisunique",
+ .result = "c2.relname",
+ .refname = "c1.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)",
+ .refnamespace = "c1.relnamespace",
+};
+
+static const SchemaQuery Query_for_list_of_aggregates[] = {
+ {
+ .min_server_version = 110000,
+ .catname = "pg_catalog.pg_proc p",
+ .selcondition = "p.prokind = 'a'",
+ .viscondition = "pg_catalog.pg_function_is_visible(p.oid)",
+ .namespace = "p.pronamespace",
+ .result = "p.proname",
+ },
+ {
+ .catname = "pg_catalog.pg_proc p",
+ .selcondition = "p.proisagg",
+ .viscondition = "pg_catalog.pg_function_is_visible(p.oid)",
+ .namespace = "p.pronamespace",
+ .result = "p.proname",
+ }
+};
+
+static const SchemaQuery Query_for_list_of_arguments = {
+ .catname = "pg_catalog.pg_proc p",
+ .result = "pg_catalog.oidvectortypes(p.proargtypes)||')'",
+ .refname = "p.proname",
+ .refviscondition = "pg_catalog.pg_function_is_visible(p.oid)",
+ .refnamespace = "p.pronamespace",
+};
+
+static const SchemaQuery Query_for_list_of_attributes = {
+ .catname = "pg_catalog.pg_attribute a, pg_catalog.pg_class c",
+ .selcondition = "c.oid = a.attrelid and a.attnum > 0 and not a.attisdropped",
+ .result = "a.attname",
+ .refname = "c.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .refnamespace = "c.relnamespace",
+};
+
+static const SchemaQuery Query_for_list_of_attribute_numbers = {
+ .catname = "pg_catalog.pg_attribute a, pg_catalog.pg_class c",
+ .selcondition = "c.oid = a.attrelid and a.attnum > 0 and not a.attisdropped",
+ .result = "a.attnum::pg_catalog.text",
+ .refname = "c.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .refnamespace = "c.relnamespace",
+};
+
+static const char *const Keywords_for_list_of_datatypes[] = {
+ "bigint",
+ "boolean",
+ "character",
+ "double precision",
+ "integer",
+ "real",
+ "smallint",
+
+ /*
+ * Note: currently there's no value in offering the following multiword
+ * type names, because tab completion cannot succeed for them: we can't
+ * disambiguate until somewhere in the second word, at which point we
+ * won't have the first word as context. ("double precision" does work,
+ * as long as no other type name begins with "double".) Leave them out to
+ * encourage users to use the PG-specific aliases, which we can complete.
+ */
+#ifdef NOT_USED
+ "bit varying",
+ "character varying",
+ "time with time zone",
+ "time without time zone",
+ "timestamp with time zone",
+ "timestamp without time zone",
+#endif
+ NULL
+};
+
+static const SchemaQuery Query_for_list_of_datatypes = {
+ .catname = "pg_catalog.pg_type t",
+ /* selcondition --- ignore table rowtypes and array types */
+ .selcondition = "(t.typrelid = 0 "
+ " OR (SELECT c.relkind = " CppAsString2(RELKIND_COMPOSITE_TYPE)
+ " FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid)) "
+ "AND t.typname !~ '^_'",
+ .viscondition = "pg_catalog.pg_type_is_visible(t.oid)",
+ .namespace = "t.typnamespace",
+ .result = "t.typname",
+ .keywords = Keywords_for_list_of_datatypes,
+};
+
+static const SchemaQuery Query_for_list_of_composite_datatypes = {
+ .catname = "pg_catalog.pg_type t",
+ /* selcondition --- only get composite types */
+ .selcondition = "(SELECT c.relkind = " CppAsString2(RELKIND_COMPOSITE_TYPE)
+ " FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid) "
+ "AND t.typname !~ '^_'",
+ .viscondition = "pg_catalog.pg_type_is_visible(t.oid)",
+ .namespace = "t.typnamespace",
+ .result = "t.typname",
+};
+
+static const SchemaQuery Query_for_list_of_domains = {
+ .catname = "pg_catalog.pg_type t",
+ .selcondition = "t.typtype = 'd'",
+ .viscondition = "pg_catalog.pg_type_is_visible(t.oid)",
+ .namespace = "t.typnamespace",
+ .result = "t.typname",
+};
+
+static const SchemaQuery Query_for_list_of_enum_values_quoted = {
+ .catname = "pg_catalog.pg_enum e, pg_catalog.pg_type t",
+ .selcondition = "t.oid = e.enumtypid",
+ .result = "pg_catalog.quote_literal(enumlabel)",
+ .refname = "t.typname",
+ .refviscondition = "pg_catalog.pg_type_is_visible(t.oid)",
+ .refnamespace = "t.typnamespace",
+};
+
+static const SchemaQuery Query_for_list_of_enum_values_unquoted = {
+ .catname = "pg_catalog.pg_enum e, pg_catalog.pg_type t",
+ .selcondition = "t.oid = e.enumtypid",
+ .result = "e.enumlabel",
+ .refname = "t.typname",
+ .refviscondition = "pg_catalog.pg_type_is_visible(t.oid)",
+ .refnamespace = "t.typnamespace",
+};
+
+/* Note: this intentionally accepts aggregates as well as plain functions */
+static const SchemaQuery Query_for_list_of_functions[] = {
+ {
+ .min_server_version = 110000,
+ .catname = "pg_catalog.pg_proc p",
+ .selcondition = "p.prokind != 'p'",
+ .viscondition = "pg_catalog.pg_function_is_visible(p.oid)",
+ .namespace = "p.pronamespace",
+ .result = "p.proname",
+ },
+ {
+ .catname = "pg_catalog.pg_proc p",
+ .viscondition = "pg_catalog.pg_function_is_visible(p.oid)",
+ .namespace = "p.pronamespace",
+ .result = "p.proname",
+ }
+};
+
+static const SchemaQuery Query_for_list_of_procedures[] = {
+ {
+ .min_server_version = 110000,
+ .catname = "pg_catalog.pg_proc p",
+ .selcondition = "p.prokind = 'p'",
+ .viscondition = "pg_catalog.pg_function_is_visible(p.oid)",
+ .namespace = "p.pronamespace",
+ .result = "p.proname",
+ },
+ {
+ /* not supported in older versions */
+ .catname = NULL,
+ }
+};
+
+static const SchemaQuery Query_for_list_of_routines = {
+ .catname = "pg_catalog.pg_proc p",
+ .viscondition = "pg_catalog.pg_function_is_visible(p.oid)",
+ .namespace = "p.pronamespace",
+ .result = "p.proname",
+};
+
+static const SchemaQuery Query_for_list_of_sequences = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition = "c.relkind IN (" CppAsString2(RELKIND_SEQUENCE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_foreign_tables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition = "c.relkind IN (" CppAsString2(RELKIND_FOREIGN_TABLE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_tables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_partitioned_tables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition = "c.relkind IN (" CppAsString2(RELKIND_PARTITIONED_TABLE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_tables_for_constraint = {
+ .catname = "pg_catalog.pg_class c, pg_catalog.pg_constraint con",
+ .selcondition = "c.oid=con.conrelid and c.relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+ .use_distinct = true,
+ .refname = "con.conname",
+};
+
+static const SchemaQuery Query_for_list_of_tables_for_policy = {
+ .catname = "pg_catalog.pg_class c, pg_catalog.pg_policy p",
+ .selcondition = "c.oid=p.polrelid",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+ .use_distinct = true,
+ .refname = "p.polname",
+};
+
+static const SchemaQuery Query_for_list_of_tables_for_rule = {
+ .catname = "pg_catalog.pg_class c, pg_catalog.pg_rewrite r",
+ .selcondition = "c.oid=r.ev_class",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+ .use_distinct = true,
+ .refname = "r.rulename",
+};
+
+static const SchemaQuery Query_for_list_of_tables_for_trigger = {
+ .catname = "pg_catalog.pg_class c, pg_catalog.pg_trigger t",
+ .selcondition = "c.oid=t.tgrelid",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+ .use_distinct = true,
+ .refname = "t.tgname",
+};
+
+static const SchemaQuery Query_for_list_of_ts_configurations = {
+ .catname = "pg_catalog.pg_ts_config c",
+ .viscondition = "pg_catalog.pg_ts_config_is_visible(c.oid)",
+ .namespace = "c.cfgnamespace",
+ .result = "c.cfgname",
+};
+
+static const SchemaQuery Query_for_list_of_ts_dictionaries = {
+ .catname = "pg_catalog.pg_ts_dict d",
+ .viscondition = "pg_catalog.pg_ts_dict_is_visible(d.oid)",
+ .namespace = "d.dictnamespace",
+ .result = "d.dictname",
+};
+
+static const SchemaQuery Query_for_list_of_ts_parsers = {
+ .catname = "pg_catalog.pg_ts_parser p",
+ .viscondition = "pg_catalog.pg_ts_parser_is_visible(p.oid)",
+ .namespace = "p.prsnamespace",
+ .result = "p.prsname",
+};
+
+static const SchemaQuery Query_for_list_of_ts_templates = {
+ .catname = "pg_catalog.pg_ts_template t",
+ .viscondition = "pg_catalog.pg_ts_template_is_visible(t.oid)",
+ .namespace = "t.tmplnamespace",
+ .result = "t.tmplname",
+};
+
+static const SchemaQuery Query_for_list_of_views = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition = "c.relkind IN (" CppAsString2(RELKIND_VIEW) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_matviews = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition = "c.relkind IN (" CppAsString2(RELKIND_MATVIEW) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_indexes = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_INDEX) ", "
+ CppAsString2(RELKIND_PARTITIONED_INDEX) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_partitioned_indexes = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition = "c.relkind = " CppAsString2(RELKIND_PARTITIONED_INDEX),
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+
+/* All relations */
+static const SchemaQuery Query_for_list_of_relations = {
+ .catname = "pg_catalog.pg_class c",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+/* partitioned relations */
+static const SchemaQuery Query_for_list_of_partitioned_relations = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition = "c.relkind IN (" CppAsString2(RELKIND_PARTITIONED_TABLE)
+ ", " CppAsString2(RELKIND_PARTITIONED_INDEX) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_operator_families = {
+ .catname = "pg_catalog.pg_opfamily c",
+ .viscondition = "pg_catalog.pg_opfamily_is_visible(c.oid)",
+ .namespace = "c.opfnamespace",
+ .result = "c.opfname",
+};
+
+/* Relations supporting INSERT, UPDATE or DELETE */
+static const SchemaQuery Query_for_list_of_updatables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_FOREIGN_TABLE) ", "
+ CppAsString2(RELKIND_VIEW) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+/* Relations supporting MERGE */
+static const SchemaQuery Query_for_list_of_mergetargets = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ") ",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+/* Relations supporting SELECT */
+static const SchemaQuery Query_for_list_of_selectables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_SEQUENCE) ", "
+ CppAsString2(RELKIND_VIEW) ", "
+ CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_FOREIGN_TABLE) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+/* Relations supporting TRUNCATE */
+static const SchemaQuery Query_for_list_of_truncatables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_FOREIGN_TABLE) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+/* Relations supporting GRANT are currently same as those supporting SELECT */
+#define Query_for_list_of_grantables Query_for_list_of_selectables
+
+/* Relations supporting ANALYZE */
+static const SchemaQuery Query_for_list_of_analyzables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ", "
+ CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_FOREIGN_TABLE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+/* Relations supporting index creation */
+static const SchemaQuery Query_for_list_of_indexables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ", "
+ CppAsString2(RELKIND_MATVIEW) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+/*
+ * Relations supporting VACUUM are currently same as those supporting
+ * indexing.
+ */
+#define Query_for_list_of_vacuumables Query_for_list_of_indexables
+
+/* Relations supporting CLUSTER */
+static const SchemaQuery Query_for_list_of_clusterables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ", "
+ CppAsString2(RELKIND_MATVIEW) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_constraints_with_schema = {
+ .catname = "pg_catalog.pg_constraint c",
+ .selcondition = "c.conrelid <> 0",
+ .namespace = "c.connamespace",
+ .result = "c.conname",
+};
+
+static const SchemaQuery Query_for_list_of_statistics = {
+ .catname = "pg_catalog.pg_statistic_ext s",
+ .viscondition = "pg_catalog.pg_statistics_obj_is_visible(s.oid)",
+ .namespace = "s.stxnamespace",
+ .result = "s.stxname",
+};
+
+static const SchemaQuery Query_for_list_of_collations = {
+ .catname = "pg_catalog.pg_collation c",
+ .selcondition = "c.collencoding IN (-1, pg_catalog.pg_char_to_encoding(pg_catalog.getdatabaseencoding()))",
+ .viscondition = "pg_catalog.pg_collation_is_visible(c.oid)",
+ .namespace = "c.collnamespace",
+ .result = "c.collname",
+};
+
+static const SchemaQuery Query_for_partition_of_table = {
+ .catname = "pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_inherits i",
+ .selcondition = "c1.oid=i.inhparent and i.inhrelid=c2.oid and c2.relispartition",
+ .viscondition = "pg_catalog.pg_table_is_visible(c2.oid)",
+ .namespace = "c2.relnamespace",
+ .result = "c2.relname",
+ .refname = "c1.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)",
+ .refnamespace = "c1.relnamespace",
+};
+
+static const SchemaQuery Query_for_rule_of_table = {
+ .catname = "pg_catalog.pg_rewrite r, pg_catalog.pg_class c1",
+ .selcondition = "r.ev_class=c1.oid",
+ .result = "r.rulename",
+ .refname = "c1.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)",
+ .refnamespace = "c1.relnamespace",
+};
+
+static const SchemaQuery Query_for_trigger_of_table = {
+ .catname = "pg_catalog.pg_trigger t, pg_catalog.pg_class c1",
+ .selcondition = "t.tgrelid=c1.oid and not t.tgisinternal",
+ .result = "t.tgname",
+ .refname = "c1.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)",
+ .refnamespace = "c1.relnamespace",
+};
+
+
+/*
+ * Queries to get lists of names of various kinds of things, possibly
+ * restricted to names matching a partially entered name. Don't use
+ * this method where the user might wish to enter a schema-qualified
+ * name; make a SchemaQuery instead.
+ *
+ * In these queries, there must be a restriction clause of the form
+ * output LIKE '%s'
+ * where "output" is the same string that the query returns. The %s
+ * will be replaced by a LIKE pattern to match the already-typed text.
+ *
+ * There can be a second '%s', which will be replaced by a suitably-escaped
+ * version of the string provided in completion_ref_object. If there is a
+ * third '%s', it will be replaced by a suitably-escaped version of the string
+ * provided in completion_ref_schema. NOTE: using completion_ref_object
+ * that way is usually the wrong thing, and using completion_ref_schema
+ * that way is always the wrong thing. Make a SchemaQuery instead.
+ */
+
+#define Query_for_list_of_template_databases \
+"SELECT d.datname "\
+" FROM pg_catalog.pg_database d "\
+" WHERE d.datname LIKE '%s' "\
+" AND (d.datistemplate OR pg_catalog.pg_has_role(d.datdba, 'USAGE'))"
+
+#define Query_for_list_of_databases \
+"SELECT datname FROM pg_catalog.pg_database "\
+" WHERE datname LIKE '%s'"
+
+#define Query_for_list_of_tablespaces \
+"SELECT spcname FROM pg_catalog.pg_tablespace "\
+" WHERE spcname LIKE '%s'"
+
+#define Query_for_list_of_encodings \
+" SELECT DISTINCT pg_catalog.pg_encoding_to_char(conforencoding) "\
+" FROM pg_catalog.pg_conversion "\
+" WHERE pg_catalog.pg_encoding_to_char(conforencoding) LIKE pg_catalog.upper('%s')"
+
+#define Query_for_list_of_languages \
+"SELECT lanname "\
+" FROM pg_catalog.pg_language "\
+" WHERE lanname != 'internal' "\
+" AND lanname LIKE '%s'"
+
+#define Query_for_list_of_schemas \
+"SELECT nspname FROM pg_catalog.pg_namespace "\
+" WHERE nspname LIKE '%s'"
+
+/* Use COMPLETE_WITH_QUERY_VERBATIM with these queries for GUC names: */
+#define Query_for_list_of_alter_system_set_vars \
+"SELECT pg_catalog.lower(name) FROM pg_catalog.pg_settings "\
+" WHERE context != 'internal' "\
+" AND pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
+
+#define Query_for_list_of_set_vars \
+"SELECT pg_catalog.lower(name) FROM pg_catalog.pg_settings "\
+" WHERE context IN ('user', 'superuser') "\
+" AND pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
+
+#define Query_for_list_of_show_vars \
+"SELECT pg_catalog.lower(name) FROM pg_catalog.pg_settings "\
+" WHERE pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
+
+#define Query_for_list_of_roles \
+" SELECT rolname "\
+" FROM pg_catalog.pg_roles "\
+" WHERE rolname LIKE '%s'"
+
+/* add these to Query_for_list_of_roles in GRANT contexts */
+#define Keywords_for_list_of_grant_roles \
+"PUBLIC", "CURRENT_ROLE", "CURRENT_USER", "SESSION_USER"
+
+#define Query_for_all_table_constraints \
+"SELECT conname "\
+" FROM pg_catalog.pg_constraint c "\
+" WHERE c.conrelid <> 0 "\
+" and conname LIKE '%s'"
+
+#define Query_for_list_of_fdws \
+" SELECT fdwname "\
+" FROM pg_catalog.pg_foreign_data_wrapper "\
+" WHERE fdwname LIKE '%s'"
+
+#define Query_for_list_of_servers \
+" SELECT srvname "\
+" FROM pg_catalog.pg_foreign_server "\
+" WHERE srvname LIKE '%s'"
+
+#define Query_for_list_of_user_mappings \
+" SELECT usename "\
+" FROM pg_catalog.pg_user_mappings "\
+" WHERE usename LIKE '%s'"
+
+#define Query_for_list_of_access_methods \
+" SELECT amname "\
+" FROM pg_catalog.pg_am "\
+" WHERE amname LIKE '%s'"
+
+#define Query_for_list_of_index_access_methods \
+" SELECT amname "\
+" FROM pg_catalog.pg_am "\
+" WHERE amname LIKE '%s' AND "\
+" amtype=" CppAsString2(AMTYPE_INDEX)
+
+#define Query_for_list_of_table_access_methods \
+" SELECT amname "\
+" FROM pg_catalog.pg_am "\
+" WHERE amname LIKE '%s' AND "\
+" amtype=" CppAsString2(AMTYPE_TABLE)
+
+#define Query_for_list_of_extensions \
+" SELECT extname "\
+" FROM pg_catalog.pg_extension "\
+" WHERE extname LIKE '%s'"
+
+#define Query_for_list_of_available_extensions \
+" SELECT name "\
+" FROM pg_catalog.pg_available_extensions "\
+" WHERE name LIKE '%s' AND installed_version IS NULL"
+
+#define Query_for_list_of_available_extension_versions \
+" SELECT version "\
+" FROM pg_catalog.pg_available_extension_versions "\
+" WHERE version LIKE '%s' AND name='%s'"
+
+#define Query_for_list_of_prepared_statements \
+" SELECT name "\
+" FROM pg_catalog.pg_prepared_statements "\
+" WHERE name LIKE '%s'"
+
+#define Query_for_list_of_event_triggers \
+" SELECT evtname "\
+" FROM pg_catalog.pg_event_trigger "\
+" WHERE evtname LIKE '%s'"
+
+#define Query_for_list_of_tablesample_methods \
+" SELECT proname "\
+" FROM pg_catalog.pg_proc "\
+" WHERE prorettype = 'pg_catalog.tsm_handler'::pg_catalog.regtype AND "\
+" proargtypes[0] = 'pg_catalog.internal'::pg_catalog.regtype AND "\
+" proname LIKE '%s'"
+
+#define Query_for_list_of_policies \
+" SELECT polname "\
+" FROM pg_catalog.pg_policy "\
+" WHERE polname LIKE '%s'"
+
+#define Query_for_values_of_enum_GUC \
+" SELECT val FROM ( "\
+" SELECT name, pg_catalog.unnest(enumvals) AS val "\
+" FROM pg_catalog.pg_settings "\
+" ) ss "\
+" WHERE val LIKE '%s'"\
+" and pg_catalog.lower(name)=pg_catalog.lower('%s')"
+
+#define Query_for_list_of_channels \
+" SELECT channel "\
+" FROM pg_catalog.pg_listening_channels() AS channel "\
+" WHERE channel LIKE '%s'"
+
+#define Query_for_list_of_cursors \
+" SELECT name "\
+" FROM pg_catalog.pg_cursors "\
+" WHERE name LIKE '%s'"
+
+#define Query_for_list_of_timezone_names_unquoted \
+" SELECT name "\
+" FROM pg_catalog.pg_timezone_names() "\
+" WHERE pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
+
+#define Query_for_list_of_timezone_names_quoted_out \
+"SELECT pg_catalog.quote_literal(name) AS name "\
+" FROM pg_catalog.pg_timezone_names() "\
+" WHERE pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
+
+#define Query_for_list_of_timezone_names_quoted_in \
+"SELECT pg_catalog.quote_literal(name) AS name "\
+" FROM pg_catalog.pg_timezone_names() "\
+" WHERE pg_catalog.quote_literal(pg_catalog.lower(name)) LIKE pg_catalog.lower('%s')"
+
+/*
+ * These object types were introduced later than our support cutoff of
+ * server version 9.2. We use the VersionedQuery infrastructure so that
+ * we don't send certain-to-fail queries to older servers.
+ */
+
+static const VersionedQuery Query_for_list_of_publications[] = {
+ {100000,
+ " SELECT pubname "
+ " FROM pg_catalog.pg_publication "
+ " WHERE pubname LIKE '%s'"
+ },
+ {0, NULL}
+};
+
+static const VersionedQuery Query_for_list_of_subscriptions[] = {
+ {100000,
+ " SELECT s.subname "
+ " FROM pg_catalog.pg_subscription s, pg_catalog.pg_database d "
+ " WHERE s.subname LIKE '%s' "
+ " AND d.datname = pg_catalog.current_database() "
+ " AND s.subdbid = d.oid"
+ },
+ {0, NULL}
+};
+
+/*
+ * This is a list of all "things" in Pgsql, which can show up after CREATE or
+ * DROP; and there is also a query to get a list of them.
+ */
+
+typedef struct
+{
+ const char *name;
+ /* Provide at most one of these three types of query: */
+ const char *query; /* simple query, or NULL */
+ const VersionedQuery *vquery; /* versioned query, or NULL */
+ const SchemaQuery *squery; /* schema query, or NULL */
+ const char *const *keywords; /* keywords to be offered as well */
+ const bits32 flags; /* visibility flags, see below */
+} pgsql_thing_t;
+
+#define THING_NO_CREATE (1 << 0) /* should not show up after CREATE */
+#define THING_NO_DROP (1 << 1) /* should not show up after DROP */
+#define THING_NO_ALTER (1 << 2) /* should not show up after ALTER */
+#define THING_NO_SHOW (THING_NO_CREATE | THING_NO_DROP | THING_NO_ALTER)
+
+/* When we have DROP USER etc, also offer MAPPING FOR */
+static const char *const Keywords_for_user_thing[] = {
+ "MAPPING FOR",
+ NULL
+};
+
+static const pgsql_thing_t words_after_create[] = {
+ {"ACCESS METHOD", NULL, NULL, NULL, NULL, THING_NO_ALTER},
+ {"AGGREGATE", NULL, NULL, Query_for_list_of_aggregates},
+ {"CAST", NULL, NULL, NULL}, /* Casts have complex structures for names, so
+ * skip it */
+ {"COLLATION", NULL, NULL, &Query_for_list_of_collations},
+
+ /*
+ * CREATE CONSTRAINT TRIGGER is not supported here because it is designed
+ * to be used only by pg_dump.
+ */
+ {"CONFIGURATION", NULL, NULL, &Query_for_list_of_ts_configurations, NULL, THING_NO_SHOW},
+ {"CONVERSION", "SELECT conname FROM pg_catalog.pg_conversion WHERE conname LIKE '%s'"},
+ {"DATABASE", Query_for_list_of_databases},
+ {"DEFAULT PRIVILEGES", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP},
+ {"DICTIONARY", NULL, NULL, &Query_for_list_of_ts_dictionaries, NULL, THING_NO_SHOW},
+ {"DOMAIN", NULL, NULL, &Query_for_list_of_domains},
+ {"EVENT TRIGGER", NULL, NULL, NULL},
+ {"EXTENSION", Query_for_list_of_extensions},
+ {"FOREIGN DATA WRAPPER", NULL, NULL, NULL},
+ {"FOREIGN TABLE", NULL, NULL, NULL},
+ {"FUNCTION", NULL, NULL, Query_for_list_of_functions},
+ {"GROUP", Query_for_list_of_roles},
+ {"INDEX", NULL, NULL, &Query_for_list_of_indexes},
+ {"LANGUAGE", Query_for_list_of_languages},
+ {"LARGE OBJECT", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP},
+ {"MATERIALIZED VIEW", NULL, NULL, &Query_for_list_of_matviews},
+ {"OPERATOR", NULL, NULL, NULL}, /* Querying for this is probably not such
+ * a good idea. */
+ {"OR REPLACE", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER},
+ {"OWNED", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_ALTER}, /* for DROP OWNED BY ... */
+ {"PARSER", NULL, NULL, &Query_for_list_of_ts_parsers, NULL, THING_NO_SHOW},
+ {"POLICY", NULL, NULL, NULL},
+ {"PROCEDURE", NULL, NULL, Query_for_list_of_procedures},
+ {"PUBLICATION", NULL, Query_for_list_of_publications},
+ {"ROLE", Query_for_list_of_roles},
+ {"ROUTINE", NULL, NULL, &Query_for_list_of_routines, NULL, THING_NO_CREATE},
+ {"RULE", "SELECT rulename FROM pg_catalog.pg_rules WHERE rulename LIKE '%s'"},
+ {"SCHEMA", Query_for_list_of_schemas},
+ {"SEQUENCE", NULL, NULL, &Query_for_list_of_sequences},
+ {"SERVER", Query_for_list_of_servers},
+ {"STATISTICS", NULL, NULL, &Query_for_list_of_statistics},
+ {"SUBSCRIPTION", NULL, Query_for_list_of_subscriptions},
+ {"SYSTEM", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP},
+ {"TABLE", NULL, NULL, &Query_for_list_of_tables},
+ {"TABLESPACE", Query_for_list_of_tablespaces},
+ {"TEMP", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, /* for CREATE TEMP TABLE
+ * ... */
+ {"TEMPLATE", NULL, NULL, &Query_for_list_of_ts_templates, NULL, THING_NO_SHOW},
+ {"TEMPORARY", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, /* for CREATE TEMPORARY
+ * TABLE ... */
+ {"TEXT SEARCH", NULL, NULL, NULL},
+ {"TRANSFORM", NULL, NULL, NULL, NULL, THING_NO_ALTER},
+ {"TRIGGER", "SELECT tgname FROM pg_catalog.pg_trigger WHERE tgname LIKE '%s' AND NOT tgisinternal"},
+ {"TYPE", NULL, NULL, &Query_for_list_of_datatypes},
+ {"UNIQUE", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, /* for CREATE UNIQUE
+ * INDEX ... */
+ {"UNLOGGED", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, /* for CREATE UNLOGGED
+ * TABLE ... */
+ {"USER", Query_for_list_of_roles, NULL, NULL, Keywords_for_user_thing},
+ {"USER MAPPING FOR", NULL, NULL, NULL},
+ {"VIEW", NULL, NULL, &Query_for_list_of_views},
+ {NULL} /* end of list */
+};
+
+/* Storage parameters for CREATE TABLE and ALTER TABLE */
+static const char *const table_storage_parameters[] = {
+ "autovacuum_analyze_scale_factor",
+ "autovacuum_analyze_threshold",
+ "autovacuum_enabled",
+ "autovacuum_freeze_max_age",
+ "autovacuum_freeze_min_age",
+ "autovacuum_freeze_table_age",
+ "autovacuum_multixact_freeze_max_age",
+ "autovacuum_multixact_freeze_min_age",
+ "autovacuum_multixact_freeze_table_age",
+ "autovacuum_vacuum_cost_delay",
+ "autovacuum_vacuum_cost_limit",
+ "autovacuum_vacuum_insert_scale_factor",
+ "autovacuum_vacuum_insert_threshold",
+ "autovacuum_vacuum_scale_factor",
+ "autovacuum_vacuum_threshold",
+ "fillfactor",
+ "log_autovacuum_min_duration",
+ "parallel_workers",
+ "toast.autovacuum_enabled",
+ "toast.autovacuum_freeze_max_age",
+ "toast.autovacuum_freeze_min_age",
+ "toast.autovacuum_freeze_table_age",
+ "toast.autovacuum_multixact_freeze_max_age",
+ "toast.autovacuum_multixact_freeze_min_age",
+ "toast.autovacuum_multixact_freeze_table_age",
+ "toast.autovacuum_vacuum_cost_delay",
+ "toast.autovacuum_vacuum_cost_limit",
+ "toast.autovacuum_vacuum_insert_scale_factor",
+ "toast.autovacuum_vacuum_insert_threshold",
+ "toast.autovacuum_vacuum_scale_factor",
+ "toast.autovacuum_vacuum_threshold",
+ "toast.log_autovacuum_min_duration",
+ "toast.vacuum_index_cleanup",
+ "toast.vacuum_truncate",
+ "toast_tuple_target",
+ "user_catalog_table",
+ "vacuum_index_cleanup",
+ "vacuum_truncate",
+ NULL
+};
+
+
+/* Forward declaration of functions */
+static char **psql_completion(const char *text, int start, int end);
+static char *create_command_generator(const char *text, int state);
+static char *drop_command_generator(const char *text, int state);
+static char *alter_command_generator(const char *text, int state);
+static char *complete_from_query(const char *text, int state);
+static char *complete_from_versioned_query(const char *text, int state);
+static char *complete_from_schema_query(const char *text, int state);
+static char *complete_from_versioned_schema_query(const char *text, int state);
+static char *_complete_from_query(const char *simple_query,
+ const SchemaQuery *schema_query,
+ const char *const *keywords,
+ bool verbatim,
+ const char *text, int state);
+static void set_completion_reference(const char *word);
+static void set_completion_reference_verbatim(const char *word);
+static char *complete_from_list(const char *text, int state);
+static char *complete_from_const(const char *text, int state);
+static void append_variable_names(char ***varnames, int *nvars,
+ int *maxvars, const char *varname,
+ const char *prefix, const char *suffix);
+static char **complete_from_variables(const char *text,
+ const char *prefix, const char *suffix, bool need_value);
+static char *complete_from_files(const char *text, int state);
+
+static char *pg_strdup_keyword_case(const char *s, const char *ref);
+static char *escape_string(const char *text);
+static char *make_like_pattern(const char *word);
+static void parse_identifier(const char *ident,
+ char **schemaname, char **objectname,
+ bool *schemaquoted, bool *objectquoted);
+static char *requote_identifier(const char *schemaname, const char *objectname,
+ bool quote_schema, bool quote_object);
+static bool identifier_needs_quotes(const char *ident);
+static PGresult *exec_query(const char *query);
+
+static char **get_previous_words(int point, char **buffer, int *nwords);
+
+static char *get_guctype(const char *varname);
+
+#ifdef USE_FILENAME_QUOTING_FUNCTIONS
+static char *quote_file_name(char *fname, int match_type, char *quote_pointer);
+static char *dequote_file_name(char *fname, int quote_char);
+#endif
+
+
+/*
+ * Initialize the readline library for our purposes.
+ */
+void
+initialize_readline(void)
+{
+ rl_readline_name = (char *) pset.progname;
+ rl_attempted_completion_function = psql_completion;
+
+#ifdef USE_FILENAME_QUOTING_FUNCTIONS
+ rl_filename_quoting_function = quote_file_name;
+ rl_filename_dequoting_function = dequote_file_name;
+#endif
+
+ rl_basic_word_break_characters = WORD_BREAKS;
+
+ /*
+ * Ideally we'd include '"' in rl_completer_quote_characters too, which
+ * should allow us to complete quoted identifiers that include spaces.
+ * However, the library support for rl_completer_quote_characters is
+ * presently too inconsistent to want to mess with that. (Note in
+ * particular that libedit has this variable but completely ignores it.)
+ */
+ rl_completer_quote_characters = "'";
+
+ /*
+ * Set rl_filename_quote_characters to "all possible characters",
+ * otherwise Readline will skip filename quoting if it thinks a filename
+ * doesn't need quoting. Readline actually interprets this as bytes, so
+ * there are no encoding considerations here.
+ */
+#ifdef HAVE_RL_FILENAME_QUOTE_CHARACTERS
+ {
+ unsigned char *fqc = (unsigned char *) pg_malloc(256);
+
+ for (int i = 0; i < 255; i++)
+ fqc[i] = (unsigned char) (i + 1);
+ fqc[255] = '\0';
+ rl_filename_quote_characters = (const char *) fqc;
+ }
+#endif
+
+ completion_max_records = 1000;
+
+ /*
+ * There is a variable rl_completion_query_items for this but apparently
+ * it's not defined everywhere.
+ */
+}
+
+/*
+ * Check if 'word' matches any of the '|'-separated strings in 'pattern',
+ * using case-insensitive or case-sensitive comparisons.
+ *
+ * If pattern is NULL, it's a wild card that matches any word.
+ * If pattern begins with '!', the result is negated, ie we check that 'word'
+ * does *not* match any alternative appearing in the rest of 'pattern'.
+ * Any alternative can contain '*' which is a wild card, i.e., it can match
+ * any substring; however, we allow at most one '*' per alternative.
+ *
+ * For readability, callers should use the macros MatchAny and MatchAnyExcept
+ * to invoke those two special cases for 'pattern'. (But '|' and '*' must
+ * just be written directly in patterns.)
+ */
+#define MatchAny NULL
+#define MatchAnyExcept(pattern) ("!" pattern)
+
+static bool
+word_matches(const char *pattern,
+ const char *word,
+ bool case_sensitive)
+{
+ size_t wordlen;
+
+#define cimatch(s1, s2, n) \
+ (case_sensitive ? strncmp(s1, s2, n) == 0 : pg_strncasecmp(s1, s2, n) == 0)
+
+ /* NULL pattern matches anything. */
+ if (pattern == NULL)
+ return true;
+
+ /* Handle negated patterns from the MatchAnyExcept macro. */
+ if (*pattern == '!')
+ return !word_matches(pattern + 1, word, case_sensitive);
+
+ /* Else consider each alternative in the pattern. */
+ wordlen = strlen(word);
+ for (;;)
+ {
+ const char *star = NULL;
+ const char *c;
+
+ /* Find end of current alternative, and locate any wild card. */
+ c = pattern;
+ while (*c != '\0' && *c != '|')
+ {
+ if (*c == '*')
+ star = c;
+ c++;
+ }
+ /* Was there a wild card? */
+ if (star)
+ {
+ /* Yes, wildcard match? */
+ size_t beforelen = star - pattern,
+ afterlen = c - star - 1;
+
+ if (wordlen >= (beforelen + afterlen) &&
+ cimatch(word, pattern, beforelen) &&
+ cimatch(word + wordlen - afterlen, star + 1, afterlen))
+ return true;
+ }
+ else
+ {
+ /* No, plain match? */
+ if (wordlen == (c - pattern) &&
+ cimatch(word, pattern, wordlen))
+ return true;
+ }
+ /* Out of alternatives? */
+ if (*c == '\0')
+ break;
+ /* Nope, try next alternative. */
+ pattern = c + 1;
+ }
+
+ return false;
+}
+
+/*
+ * Implementation of TailMatches and TailMatchesCS macros: do the last N words
+ * in previous_words match the variadic arguments?
+ *
+ * The array indexing might look backwards, but remember that
+ * previous_words[0] contains the *last* word on the line, not the first.
+ */
+static bool
+TailMatchesImpl(bool case_sensitive,
+ int previous_words_count, char **previous_words,
+ int narg,...)
+{
+ va_list args;
+
+ if (previous_words_count < narg)
+ return false;
+
+ va_start(args, narg);
+
+ for (int argno = 0; argno < narg; argno++)
+ {
+ const char *arg = va_arg(args, const char *);
+
+ if (!word_matches(arg, previous_words[narg - argno - 1],
+ case_sensitive))
+ {
+ va_end(args);
+ return false;
+ }
+ }
+
+ va_end(args);
+
+ return true;
+}
+
+/*
+ * Implementation of Matches and MatchesCS macros: do all of the words
+ * in previous_words match the variadic arguments?
+ */
+static bool
+MatchesImpl(bool case_sensitive,
+ int previous_words_count, char **previous_words,
+ int narg,...)
+{
+ va_list args;
+
+ if (previous_words_count != narg)
+ return false;
+
+ va_start(args, narg);
+
+ for (int argno = 0; argno < narg; argno++)
+ {
+ const char *arg = va_arg(args, const char *);
+
+ if (!word_matches(arg, previous_words[narg - argno - 1],
+ case_sensitive))
+ {
+ va_end(args);
+ return false;
+ }
+ }
+
+ va_end(args);
+
+ return true;
+}
+
+/*
+ * Implementation of HeadMatches and HeadMatchesCS macros: do the first N
+ * words in previous_words match the variadic arguments?
+ */
+static bool
+HeadMatchesImpl(bool case_sensitive,
+ int previous_words_count, char **previous_words,
+ int narg,...)
+{
+ va_list args;
+
+ if (previous_words_count < narg)
+ return false;
+
+ va_start(args, narg);
+
+ for (int argno = 0; argno < narg; argno++)
+ {
+ const char *arg = va_arg(args, const char *);
+
+ if (!word_matches(arg, previous_words[previous_words_count - argno - 1],
+ case_sensitive))
+ {
+ va_end(args);
+ return false;
+ }
+ }
+
+ va_end(args);
+
+ return true;
+}
+
+/*
+ * Check if the final character of 's' is 'c'.
+ */
+static bool
+ends_with(const char *s, char c)
+{
+ size_t length = strlen(s);
+
+ return (length > 0 && s[length - 1] == c);
+}
+
+/*
+ * The completion function.
+ *
+ * According to readline spec this gets passed the text entered so far and its
+ * start and end positions in the readline buffer. The return value is some
+ * partially obscure list format that can be generated by readline's
+ * rl_completion_matches() function, so we don't have to worry about it.
+ */
+static char **
+psql_completion(const char *text, int start, int end)
+{
+ /* This is the variable we'll return. */
+ char **matches = NULL;
+
+ /* Workspace for parsed words. */
+ char *words_buffer;
+
+ /* This array will contain pointers to parsed words. */
+ char **previous_words;
+
+ /* The number of words found on the input line. */
+ int previous_words_count;
+
+ /*
+ * For compactness, we use these macros to reference previous_words[].
+ * Caution: do not access a previous_words[] entry without having checked
+ * previous_words_count to be sure it's valid. In most cases below, that
+ * check is implicit in a TailMatches() or similar macro, but in some
+ * places we have to check it explicitly.
+ */
+#define prev_wd (previous_words[0])
+#define prev2_wd (previous_words[1])
+#define prev3_wd (previous_words[2])
+#define prev4_wd (previous_words[3])
+#define prev5_wd (previous_words[4])
+#define prev6_wd (previous_words[5])
+#define prev7_wd (previous_words[6])
+#define prev8_wd (previous_words[7])
+#define prev9_wd (previous_words[8])
+
+ /* Match the last N words before point, case-insensitively. */
+#define TailMatches(...) \
+ TailMatchesImpl(false, previous_words_count, previous_words, \
+ VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
+
+ /* Match the last N words before point, case-sensitively. */
+#define TailMatchesCS(...) \
+ TailMatchesImpl(true, previous_words_count, previous_words, \
+ VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
+
+ /* Match N words representing all of the line, case-insensitively. */
+#define Matches(...) \
+ MatchesImpl(false, previous_words_count, previous_words, \
+ VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
+
+ /* Match N words representing all of the line, case-sensitively. */
+#define MatchesCS(...) \
+ MatchesImpl(true, previous_words_count, previous_words, \
+ VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
+
+ /* Match the first N words on the line, case-insensitively. */
+#define HeadMatches(...) \
+ HeadMatchesImpl(false, previous_words_count, previous_words, \
+ VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
+
+ /* Match the first N words on the line, case-sensitively. */
+#define HeadMatchesCS(...) \
+ HeadMatchesImpl(true, previous_words_count, previous_words, \
+ VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
+
+ /* Known command-starting keywords. */
+ static const char *const sql_commands[] = {
+ "ABORT", "ALTER", "ANALYZE", "BEGIN", "CALL", "CHECKPOINT", "CLOSE", "CLUSTER",
+ "COMMENT", "COMMIT", "COPY", "CREATE", "DEALLOCATE", "DECLARE",
+ "DELETE FROM", "DISCARD", "DO", "DROP", "END", "EXECUTE", "EXPLAIN",
+ "FETCH", "GRANT", "IMPORT FOREIGN SCHEMA", "INSERT INTO", "LISTEN", "LOAD", "LOCK",
+ "MERGE INTO", "MOVE", "NOTIFY", "PREPARE",
+ "REASSIGN", "REFRESH MATERIALIZED VIEW", "REINDEX", "RELEASE",
+ "RESET", "REVOKE", "ROLLBACK",
+ "SAVEPOINT", "SECURITY LABEL", "SELECT", "SET", "SHOW", "START",
+ "TABLE", "TRUNCATE", "UNLISTEN", "UPDATE", "VACUUM", "VALUES", "WITH",
+ NULL
+ };
+
+ /* psql's backslash commands. */
+ static const char *const backslash_commands[] = {
+ "\\a",
+ "\\connect", "\\conninfo", "\\C", "\\cd", "\\copy",
+ "\\copyright", "\\crosstabview",
+ "\\d", "\\da", "\\dA", "\\dAc", "\\dAf", "\\dAo", "\\dAp",
+ "\\db", "\\dc", "\\dconfig", "\\dC", "\\dd", "\\ddp", "\\dD",
+ "\\des", "\\det", "\\deu", "\\dew", "\\dE", "\\df",
+ "\\dF", "\\dFd", "\\dFp", "\\dFt", "\\dg", "\\di", "\\dl", "\\dL",
+ "\\dm", "\\dn", "\\do", "\\dO", "\\dp", "\\dP", "\\dPi", "\\dPt",
+ "\\drds", "\\dRs", "\\dRp", "\\ds",
+ "\\dt", "\\dT", "\\dv", "\\du", "\\dx", "\\dX", "\\dy",
+ "\\echo", "\\edit", "\\ef", "\\elif", "\\else", "\\encoding",
+ "\\endif", "\\errverbose", "\\ev",
+ "\\f",
+ "\\g", "\\gdesc", "\\getenv", "\\gexec", "\\gset", "\\gx",
+ "\\help", "\\html",
+ "\\if", "\\include", "\\include_relative", "\\ir",
+ "\\list", "\\lo_import", "\\lo_export", "\\lo_list", "\\lo_unlink",
+ "\\out",
+ "\\password", "\\print", "\\prompt", "\\pset",
+ "\\qecho", "\\quit",
+ "\\reset",
+ "\\s", "\\set", "\\setenv", "\\sf", "\\sv",
+ "\\t", "\\T", "\\timing",
+ "\\unset",
+ "\\x",
+ "\\warn", "\\watch", "\\write",
+ "\\z",
+ "\\!", "\\?",
+ NULL
+ };
+
+ /*
+ * Temporary workaround for a bug in recent (2019) libedit: it incorrectly
+ * de-escapes the input "text", causing us to fail to recognize backslash
+ * commands. So get the string to look at from rl_line_buffer instead.
+ */
+ char *text_copy = pnstrdup(rl_line_buffer + start, end - start);
+ text = text_copy;
+
+ /* Remember last char of the given input word. */
+ completion_last_char = (end > start) ? text[end - start - 1] : '\0';
+
+ /* We usually want the append character to be a space. */
+ rl_completion_append_character = ' ';
+
+ /* Clear a few things. */
+ completion_charp = NULL;
+ completion_charpp = NULL;
+ completion_vquery = NULL;
+ completion_squery = NULL;
+ completion_ref_object = NULL;
+ completion_ref_schema = NULL;
+
+ /*
+ * Scan the input line to extract the words before our current position.
+ * According to those we'll make some smart decisions on what the user is
+ * probably intending to type.
+ */
+ previous_words = get_previous_words(start,
+ &words_buffer,
+ &previous_words_count);
+
+ /* If current word is a backslash command, offer completions for that */
+ if (text[0] == '\\')
+ COMPLETE_WITH_LIST_CS(backslash_commands);
+
+ /* If current word is a variable interpolation, handle that case */
+ else if (text[0] == ':' && text[1] != ':')
+ {
+ if (text[1] == '\'')
+ matches = complete_from_variables(text, ":'", "'", true);
+ else if (text[1] == '"')
+ matches = complete_from_variables(text, ":\"", "\"", true);
+ else
+ matches = complete_from_variables(text, ":", "", true);
+ }
+
+ /* If no previous word, suggest one of the basic sql commands */
+ else if (previous_words_count == 0)
+ COMPLETE_WITH_LIST(sql_commands);
+
+/* CREATE */
+ /* complete with something you can create */
+ else if (TailMatches("CREATE"))
+ matches = rl_completion_matches(text, create_command_generator);
+
+ /* complete with something you can create or replace */
+ else if (TailMatches("CREATE", "OR", "REPLACE"))
+ COMPLETE_WITH("FUNCTION", "PROCEDURE", "LANGUAGE", "RULE", "VIEW",
+ "AGGREGATE", "TRANSFORM", "TRIGGER");
+
+/* DROP, but not DROP embedded in other commands */
+ /* complete with something you can drop */
+ else if (Matches("DROP"))
+ matches = rl_completion_matches(text, drop_command_generator);
+
+/* ALTER */
+
+ /* ALTER TABLE */
+ else if (Matches("ALTER", "TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables,
+ "ALL IN TABLESPACE");
+
+ /* ALTER something */
+ else if (Matches("ALTER"))
+ matches = rl_completion_matches(text, alter_command_generator);
+ /* ALTER TABLE,INDEX,MATERIALIZED VIEW ALL IN TABLESPACE xxx */
+ else if (TailMatches("ALL", "IN", "TABLESPACE", MatchAny))
+ COMPLETE_WITH("SET TABLESPACE", "OWNED BY");
+ /* ALTER TABLE,INDEX,MATERIALIZED VIEW ALL IN TABLESPACE xxx OWNED BY */
+ else if (TailMatches("ALL", "IN", "TABLESPACE", MatchAny, "OWNED", "BY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+ /* ALTER TABLE,INDEX,MATERIALIZED VIEW ALL IN TABLESPACE xxx OWNED BY xxx */
+ else if (TailMatches("ALL", "IN", "TABLESPACE", MatchAny, "OWNED", "BY", MatchAny))
+ COMPLETE_WITH("SET TABLESPACE");
+ /* ALTER AGGREGATE,FUNCTION,PROCEDURE,ROUTINE <name> */
+ else if (Matches("ALTER", "AGGREGATE|FUNCTION|PROCEDURE|ROUTINE", MatchAny))
+ COMPLETE_WITH("(");
+ /* ALTER AGGREGATE <name> (...) */
+ else if (Matches("ALTER", "AGGREGATE", MatchAny, MatchAny))
+ {
+ if (ends_with(prev_wd, ')'))
+ COMPLETE_WITH("OWNER TO", "RENAME TO", "SET SCHEMA");
+ else
+ COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
+ }
+ /* ALTER FUNCTION,PROCEDURE,ROUTINE <name> (...) */
+ else if (Matches("ALTER", "FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny))
+ {
+ if (ends_with(prev_wd, ')'))
+ COMPLETE_WITH("OWNER TO", "RENAME TO", "SET SCHEMA",
+ "DEPENDS ON EXTENSION", "NO DEPENDS ON EXTENSION");
+ else
+ COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
+ }
+
+ /* ALTER PUBLICATION <name> */
+ else if (Matches("ALTER", "PUBLICATION", MatchAny))
+ COMPLETE_WITH("ADD", "DROP", "OWNER TO", "RENAME TO", "SET");
+ /* ALTER PUBLICATION <name> ADD */
+ else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD"))
+ COMPLETE_WITH("TABLES IN SCHEMA", "TABLE");
+ else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "TABLE") ||
+ (HeadMatches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "TABLE") &&
+ ends_with(prev_wd, ',')))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+
+ /*
+ * "ALTER PUBLICATION <name> SET TABLE <name> WHERE (" - complete with
+ * table attributes
+ *
+ * "ALTER PUBLICATION <name> ADD TABLE <name> WHERE (" - complete with
+ * table attributes
+ */
+ else if (HeadMatches("ALTER", "PUBLICATION", MatchAny) && TailMatches("WHERE"))
+ COMPLETE_WITH("(");
+ else if (HeadMatches("ALTER", "PUBLICATION", MatchAny) && TailMatches("WHERE", "("))
+ COMPLETE_WITH_ATTR(prev3_wd);
+ else if (HeadMatches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "TABLE") &&
+ !TailMatches("WHERE", "(*)"))
+ COMPLETE_WITH(",", "WHERE (");
+ else if (HeadMatches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "TABLE"))
+ COMPLETE_WITH(",");
+ /* ALTER PUBLICATION <name> DROP */
+ else if (Matches("ALTER", "PUBLICATION", MatchAny, "DROP"))
+ COMPLETE_WITH("TABLES IN SCHEMA", "TABLE");
+ /* ALTER PUBLICATION <name> SET */
+ else if (Matches("ALTER", "PUBLICATION", MatchAny, "SET"))
+ COMPLETE_WITH("(", "TABLES IN SCHEMA", "TABLE");
+ else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD|DROP|SET", "TABLES", "IN", "SCHEMA"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas
+ " AND nspname NOT LIKE E'pg\\\\_%%'",
+ "CURRENT_SCHEMA");
+ /* ALTER PUBLICATION <name> SET ( */
+ else if (HeadMatches("ALTER", "PUBLICATION", MatchAny) && TailMatches("SET", "("))
+ COMPLETE_WITH("publish", "publish_via_partition_root");
+ /* ALTER SUBSCRIPTION <name> */
+ else if (Matches("ALTER", "SUBSCRIPTION", MatchAny))
+ COMPLETE_WITH("CONNECTION", "ENABLE", "DISABLE", "OWNER TO",
+ "RENAME TO", "REFRESH PUBLICATION", "SET", "SKIP (",
+ "ADD PUBLICATION", "DROP PUBLICATION");
+ /* ALTER SUBSCRIPTION <name> REFRESH PUBLICATION */
+ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) &&
+ TailMatches("REFRESH", "PUBLICATION"))
+ COMPLETE_WITH("WITH (");
+ /* ALTER SUBSCRIPTION <name> REFRESH PUBLICATION WITH ( */
+ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) &&
+ TailMatches("REFRESH", "PUBLICATION", "WITH", "("))
+ COMPLETE_WITH("copy_data");
+ /* ALTER SUBSCRIPTION <name> SET */
+ else if (Matches("ALTER", "SUBSCRIPTION", MatchAny, "SET"))
+ COMPLETE_WITH("(", "PUBLICATION");
+ /* ALTER SUBSCRIPTION <name> SET ( */
+ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) && TailMatches("SET", "("))
+ COMPLETE_WITH("binary", "disable_on_error", "slot_name", "streaming", "synchronous_commit");
+ /* ALTER SUBSCRIPTION <name> SKIP ( */
+ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) && TailMatches("SKIP", "("))
+ COMPLETE_WITH("lsn");
+ /* ALTER SUBSCRIPTION <name> SET PUBLICATION */
+ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) && TailMatches("SET", "PUBLICATION"))
+ {
+ /* complete with nothing here as this refers to remote publications */
+ }
+ /* ALTER SUBSCRIPTION <name> ADD|DROP|SET PUBLICATION <name> */
+ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) &&
+ TailMatches("ADD|DROP|SET", "PUBLICATION", MatchAny))
+ COMPLETE_WITH("WITH (");
+ /* ALTER SUBSCRIPTION <name> ADD|DROP|SET PUBLICATION <name> WITH ( */
+ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) &&
+ TailMatches("ADD|DROP|SET", "PUBLICATION", MatchAny, "WITH", "("))
+ COMPLETE_WITH("copy_data", "refresh");
+
+ /* ALTER SCHEMA <name> */
+ else if (Matches("ALTER", "SCHEMA", MatchAny))
+ COMPLETE_WITH("OWNER TO", "RENAME TO");
+
+ /* ALTER COLLATION <name> */
+ else if (Matches("ALTER", "COLLATION", MatchAny))
+ COMPLETE_WITH("OWNER TO", "REFRESH VERSION", "RENAME TO", "SET SCHEMA");
+
+ /* ALTER CONVERSION <name> */
+ else if (Matches("ALTER", "CONVERSION", MatchAny))
+ COMPLETE_WITH("OWNER TO", "RENAME TO", "SET SCHEMA");
+
+ /* ALTER DATABASE <name> */
+ else if (Matches("ALTER", "DATABASE", MatchAny))
+ COMPLETE_WITH("RESET", "SET", "OWNER TO", "REFRESH COLLATION VERSION", "RENAME TO",
+ "IS_TEMPLATE", "ALLOW_CONNECTIONS",
+ "CONNECTION LIMIT");
+
+ /* ALTER DATABASE <name> SET TABLESPACE */
+ else if (Matches("ALTER", "DATABASE", MatchAny, "SET", "TABLESPACE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
+
+ /* ALTER EVENT TRIGGER */
+ else if (Matches("ALTER", "EVENT", "TRIGGER"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
+
+ /* ALTER EVENT TRIGGER <name> */
+ else if (Matches("ALTER", "EVENT", "TRIGGER", MatchAny))
+ COMPLETE_WITH("DISABLE", "ENABLE", "OWNER TO", "RENAME TO");
+
+ /* ALTER EVENT TRIGGER <name> ENABLE */
+ else if (Matches("ALTER", "EVENT", "TRIGGER", MatchAny, "ENABLE"))
+ COMPLETE_WITH("REPLICA", "ALWAYS");
+
+ /* ALTER EXTENSION <name> */
+ else if (Matches("ALTER", "EXTENSION", MatchAny))
+ COMPLETE_WITH("ADD", "DROP", "UPDATE", "SET SCHEMA");
+
+ /* ALTER EXTENSION <name> UPDATE */
+ else if (Matches("ALTER", "EXTENSION", MatchAny, "UPDATE"))
+ COMPLETE_WITH("TO");
+
+ /* ALTER EXTENSION <name> UPDATE TO */
+ else if (Matches("ALTER", "EXTENSION", MatchAny, "UPDATE", "TO"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions);
+ }
+
+ /* ALTER FOREIGN */
+ else if (Matches("ALTER", "FOREIGN"))
+ COMPLETE_WITH("DATA WRAPPER", "TABLE");
+
+ /* ALTER FOREIGN DATA WRAPPER <name> */
+ else if (Matches("ALTER", "FOREIGN", "DATA", "WRAPPER", MatchAny))
+ COMPLETE_WITH("HANDLER", "VALIDATOR", "NO",
+ "OPTIONS", "OWNER TO", "RENAME TO");
+ else if (Matches("ALTER", "FOREIGN", "DATA", "WRAPPER", MatchAny, "NO"))
+ COMPLETE_WITH("HANDLER", "VALIDATOR");
+
+ /* ALTER FOREIGN TABLE <name> */
+ else if (Matches("ALTER", "FOREIGN", "TABLE", MatchAny))
+ COMPLETE_WITH("ADD", "ALTER", "DISABLE TRIGGER", "DROP", "ENABLE",
+ "INHERIT", "NO INHERIT", "OPTIONS", "OWNER TO",
+ "RENAME", "SET", "VALIDATE CONSTRAINT");
+
+ /* ALTER INDEX */
+ else if (Matches("ALTER", "INDEX"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
+ "ALL IN TABLESPACE");
+ /* ALTER INDEX <name> */
+ else if (Matches("ALTER", "INDEX", MatchAny))
+ COMPLETE_WITH("ALTER COLUMN", "OWNER TO", "RENAME TO", "SET",
+ "RESET", "ATTACH PARTITION",
+ "DEPENDS ON EXTENSION", "NO DEPENDS ON EXTENSION");
+ else if (Matches("ALTER", "INDEX", MatchAny, "ATTACH"))
+ COMPLETE_WITH("PARTITION");
+ else if (Matches("ALTER", "INDEX", MatchAny, "ATTACH", "PARTITION"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes);
+ /* ALTER INDEX <name> ALTER */
+ else if (Matches("ALTER", "INDEX", MatchAny, "ALTER"))
+ COMPLETE_WITH("COLUMN");
+ /* ALTER INDEX <name> ALTER COLUMN */
+ else if (Matches("ALTER", "INDEX", MatchAny, "ALTER", "COLUMN"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY_VERBATIM(Query_for_list_of_attribute_numbers);
+ }
+ /* ALTER INDEX <name> ALTER COLUMN <colnum> */
+ else if (Matches("ALTER", "INDEX", MatchAny, "ALTER", "COLUMN", MatchAny))
+ COMPLETE_WITH("SET STATISTICS");
+ /* ALTER INDEX <name> ALTER COLUMN <colnum> SET */
+ else if (Matches("ALTER", "INDEX", MatchAny, "ALTER", "COLUMN", MatchAny, "SET"))
+ COMPLETE_WITH("STATISTICS");
+ /* ALTER INDEX <name> ALTER COLUMN <colnum> SET STATISTICS */
+ else if (Matches("ALTER", "INDEX", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "STATISTICS"))
+ {
+ /* Enforce no completion here, as an integer has to be specified */
+ }
+ /* ALTER INDEX <name> SET */
+ else if (Matches("ALTER", "INDEX", MatchAny, "SET"))
+ COMPLETE_WITH("(", "TABLESPACE");
+ /* ALTER INDEX <name> RESET */
+ else if (Matches("ALTER", "INDEX", MatchAny, "RESET"))
+ COMPLETE_WITH("(");
+ /* ALTER INDEX <foo> SET|RESET ( */
+ else if (Matches("ALTER", "INDEX", MatchAny, "RESET", "("))
+ COMPLETE_WITH("fillfactor",
+ "deduplicate_items", /* BTREE */
+ "fastupdate", "gin_pending_list_limit", /* GIN */
+ "buffering", /* GiST */
+ "pages_per_range", "autosummarize" /* BRIN */
+ );
+ else if (Matches("ALTER", "INDEX", MatchAny, "SET", "("))
+ COMPLETE_WITH("fillfactor =",
+ "deduplicate_items =", /* BTREE */
+ "fastupdate =", "gin_pending_list_limit =", /* GIN */
+ "buffering =", /* GiST */
+ "pages_per_range =", "autosummarize =" /* BRIN */
+ );
+ else if (Matches("ALTER", "INDEX", MatchAny, "NO", "DEPENDS"))
+ COMPLETE_WITH("ON EXTENSION");
+ else if (Matches("ALTER", "INDEX", MatchAny, "DEPENDS"))
+ COMPLETE_WITH("ON EXTENSION");
+
+ /* ALTER LANGUAGE <name> */
+ else if (Matches("ALTER", "LANGUAGE", MatchAny))
+ COMPLETE_WITH("OWNER TO", "RENAME TO");
+
+ /* ALTER LARGE OBJECT <oid> */
+ else if (Matches("ALTER", "LARGE", "OBJECT", MatchAny))
+ COMPLETE_WITH("OWNER TO");
+
+ /* ALTER MATERIALIZED VIEW */
+ else if (Matches("ALTER", "MATERIALIZED", "VIEW"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_matviews,
+ "ALL IN TABLESPACE");
+
+ /* ALTER USER,ROLE <name> */
+ else if (Matches("ALTER", "USER|ROLE", MatchAny) &&
+ !TailMatches("USER", "MAPPING"))
+ COMPLETE_WITH("BYPASSRLS", "CONNECTION LIMIT", "CREATEDB", "CREATEROLE",
+ "ENCRYPTED PASSWORD", "INHERIT", "LOGIN", "NOBYPASSRLS",
+ "NOCREATEDB", "NOCREATEROLE", "NOINHERIT",
+ "NOLOGIN", "NOREPLICATION", "NOSUPERUSER", "PASSWORD",
+ "RENAME TO", "REPLICATION", "RESET", "SET", "SUPERUSER",
+ "VALID UNTIL", "WITH");
+
+ /* ALTER USER,ROLE <name> WITH */
+ else if (Matches("ALTER", "USER|ROLE", MatchAny, "WITH"))
+ /* Similar to the above, but don't complete "WITH" again. */
+ COMPLETE_WITH("BYPASSRLS", "CONNECTION LIMIT", "CREATEDB", "CREATEROLE",
+ "ENCRYPTED PASSWORD", "INHERIT", "LOGIN", "NOBYPASSRLS",
+ "NOCREATEDB", "NOCREATEROLE", "NOINHERIT",
+ "NOLOGIN", "NOREPLICATION", "NOSUPERUSER", "PASSWORD",
+ "RENAME TO", "REPLICATION", "RESET", "SET", "SUPERUSER",
+ "VALID UNTIL");
+
+ /* ALTER DEFAULT PRIVILEGES */
+ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES"))
+ COMPLETE_WITH("FOR ROLE", "IN SCHEMA");
+ /* ALTER DEFAULT PRIVILEGES FOR */
+ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES", "FOR"))
+ COMPLETE_WITH("ROLE");
+ /* ALTER DEFAULT PRIVILEGES IN */
+ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES", "IN"))
+ COMPLETE_WITH("SCHEMA");
+ /* ALTER DEFAULT PRIVILEGES FOR ROLE|USER ... */
+ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES", "FOR", "ROLE|USER",
+ MatchAny))
+ COMPLETE_WITH("GRANT", "REVOKE", "IN SCHEMA");
+ /* ALTER DEFAULT PRIVILEGES IN SCHEMA ... */
+ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES", "IN", "SCHEMA",
+ MatchAny))
+ COMPLETE_WITH("GRANT", "REVOKE", "FOR ROLE");
+ /* ALTER DEFAULT PRIVILEGES IN SCHEMA ... FOR */
+ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES", "IN", "SCHEMA",
+ MatchAny, "FOR"))
+ COMPLETE_WITH("ROLE");
+ /* ALTER DEFAULT PRIVILEGES FOR ROLE|USER ... IN SCHEMA ... */
+ /* ALTER DEFAULT PRIVILEGES IN SCHEMA ... FOR ROLE|USER ... */
+ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES", "FOR", "ROLE|USER",
+ MatchAny, "IN", "SCHEMA", MatchAny) ||
+ Matches("ALTER", "DEFAULT", "PRIVILEGES", "IN", "SCHEMA",
+ MatchAny, "FOR", "ROLE|USER", MatchAny))
+ COMPLETE_WITH("GRANT", "REVOKE");
+ /* ALTER DOMAIN <name> */
+ else if (Matches("ALTER", "DOMAIN", MatchAny))
+ COMPLETE_WITH("ADD", "DROP", "OWNER TO", "RENAME", "SET",
+ "VALIDATE CONSTRAINT");
+ /* ALTER DOMAIN <sth> DROP */
+ else if (Matches("ALTER", "DOMAIN", MatchAny, "DROP"))
+ COMPLETE_WITH("CONSTRAINT", "DEFAULT", "NOT NULL");
+ /* ALTER DOMAIN <sth> DROP|RENAME|VALIDATE CONSTRAINT */
+ else if (Matches("ALTER", "DOMAIN", MatchAny, "DROP|RENAME|VALIDATE", "CONSTRAINT"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_constraint_of_type);
+ }
+ /* ALTER DOMAIN <sth> RENAME */
+ else if (Matches("ALTER", "DOMAIN", MatchAny, "RENAME"))
+ COMPLETE_WITH("CONSTRAINT", "TO");
+ /* ALTER DOMAIN <sth> RENAME CONSTRAINT <sth> */
+ else if (Matches("ALTER", "DOMAIN", MatchAny, "RENAME", "CONSTRAINT", MatchAny))
+ COMPLETE_WITH("TO");
+
+ /* ALTER DOMAIN <sth> SET */
+ else if (Matches("ALTER", "DOMAIN", MatchAny, "SET"))
+ COMPLETE_WITH("DEFAULT", "NOT NULL", "SCHEMA");
+ /* ALTER SEQUENCE <name> */
+ else if (Matches("ALTER", "SEQUENCE", MatchAny))
+ COMPLETE_WITH("AS", "INCREMENT", "MINVALUE", "MAXVALUE", "RESTART",
+ "NO", "CACHE", "CYCLE", "SET", "OWNED BY",
+ "OWNER TO", "RENAME TO");
+ /* ALTER SEQUENCE <name> AS */
+ else if (TailMatches("ALTER", "SEQUENCE", MatchAny, "AS"))
+ COMPLETE_WITH_CS("smallint", "integer", "bigint");
+ /* ALTER SEQUENCE <name> NO */
+ else if (Matches("ALTER", "SEQUENCE", MatchAny, "NO"))
+ COMPLETE_WITH("MINVALUE", "MAXVALUE", "CYCLE");
+ /* ALTER SEQUENCE <name> SET */
+ else if (Matches("ALTER", "SEQUENCE", MatchAny, "SET"))
+ COMPLETE_WITH("SCHEMA", "LOGGED", "UNLOGGED");
+ /* ALTER SERVER <name> */
+ else if (Matches("ALTER", "SERVER", MatchAny))
+ COMPLETE_WITH("VERSION", "OPTIONS", "OWNER TO", "RENAME TO");
+ /* ALTER SERVER <name> VERSION <version> */
+ else if (Matches("ALTER", "SERVER", MatchAny, "VERSION", MatchAny))
+ COMPLETE_WITH("OPTIONS");
+ /* ALTER SYSTEM SET, RESET, RESET ALL */
+ else if (Matches("ALTER", "SYSTEM"))
+ COMPLETE_WITH("SET", "RESET");
+ else if (Matches("ALTER", "SYSTEM", "SET|RESET"))
+ COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_alter_system_set_vars,
+ "ALL");
+ else if (Matches("ALTER", "SYSTEM", "SET", MatchAny))
+ COMPLETE_WITH("TO");
+ /* ALTER VIEW <name> */
+ else if (Matches("ALTER", "VIEW", MatchAny))
+ COMPLETE_WITH("ALTER COLUMN", "OWNER TO", "RENAME",
+ "SET SCHEMA");
+ /* ALTER VIEW xxx RENAME */
+ else if (Matches("ALTER", "VIEW", MatchAny, "RENAME"))
+ COMPLETE_WITH_ATTR_PLUS(prev2_wd, "COLUMN", "TO");
+ else if (Matches("ALTER", "VIEW", MatchAny, "ALTER|RENAME", "COLUMN"))
+ COMPLETE_WITH_ATTR(prev3_wd);
+ /* ALTER VIEW xxx ALTER [ COLUMN ] yyy */
+ else if (Matches("ALTER", "VIEW", MatchAny, "ALTER", MatchAny) ||
+ Matches("ALTER", "VIEW", MatchAny, "ALTER", "COLUMN", MatchAny))
+ COMPLETE_WITH("SET DEFAULT", "DROP DEFAULT");
+ /* ALTER VIEW xxx RENAME yyy */
+ else if (Matches("ALTER", "VIEW", MatchAny, "RENAME", MatchAnyExcept("TO")))
+ COMPLETE_WITH("TO");
+ /* ALTER VIEW xxx RENAME COLUMN yyy */
+ else if (Matches("ALTER", "VIEW", MatchAny, "RENAME", "COLUMN", MatchAnyExcept("TO")))
+ COMPLETE_WITH("TO");
+
+ /* ALTER MATERIALIZED VIEW <name> */
+ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny))
+ COMPLETE_WITH("ALTER COLUMN", "CLUSTER ON", "DEPENDS ON EXTENSION",
+ "NO DEPENDS ON EXTENSION", "OWNER TO", "RENAME",
+ "RESET (", "SET");
+ /* ALTER MATERIALIZED VIEW xxx RENAME */
+ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "RENAME"))
+ COMPLETE_WITH_ATTR_PLUS(prev2_wd, "COLUMN", "TO");
+ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "ALTER|RENAME", "COLUMN"))
+ COMPLETE_WITH_ATTR(prev3_wd);
+ /* ALTER MATERIALIZED VIEW xxx RENAME yyy */
+ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "RENAME", MatchAnyExcept("TO")))
+ COMPLETE_WITH("TO");
+ /* ALTER MATERIALIZED VIEW xxx RENAME COLUMN yyy */
+ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "RENAME", "COLUMN", MatchAnyExcept("TO")))
+ COMPLETE_WITH("TO");
+ /* ALTER MATERIALIZED VIEW xxx SET */
+ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "SET"))
+ COMPLETE_WITH("(", "ACCESS METHOD", "SCHEMA", "TABLESPACE", "WITHOUT CLUSTER");
+ /* ALTER MATERIALIZED VIEW xxx SET ACCESS METHOD */
+ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "SET", "ACCESS", "METHOD"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_table_access_methods);
+
+ /* ALTER POLICY <name> */
+ else if (Matches("ALTER", "POLICY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_policies);
+ /* ALTER POLICY <name> ON */
+ else if (Matches("ALTER", "POLICY", MatchAny))
+ COMPLETE_WITH("ON");
+ /* ALTER POLICY <name> ON <table> */
+ else if (Matches("ALTER", "POLICY", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_policy);
+ }
+ /* ALTER POLICY <name> ON <table> - show options */
+ else if (Matches("ALTER", "POLICY", MatchAny, "ON", MatchAny))
+ COMPLETE_WITH("RENAME TO", "TO", "USING (", "WITH CHECK (");
+ /* ALTER POLICY <name> ON <table> TO <role> */
+ else if (Matches("ALTER", "POLICY", MatchAny, "ON", MatchAny, "TO"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ Keywords_for_list_of_grant_roles);
+ /* ALTER POLICY <name> ON <table> USING ( */
+ else if (Matches("ALTER", "POLICY", MatchAny, "ON", MatchAny, "USING"))
+ COMPLETE_WITH("(");
+ /* ALTER POLICY <name> ON <table> WITH CHECK ( */
+ else if (Matches("ALTER", "POLICY", MatchAny, "ON", MatchAny, "WITH", "CHECK"))
+ COMPLETE_WITH("(");
+
+ /* ALTER RULE <name>, add ON */
+ else if (Matches("ALTER", "RULE", MatchAny))
+ COMPLETE_WITH("ON");
+
+ /* If we have ALTER RULE <name> ON, then add the correct tablename */
+ else if (Matches("ALTER", "RULE", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_rule);
+ }
+
+ /* ALTER RULE <name> ON <name> */
+ else if (Matches("ALTER", "RULE", MatchAny, "ON", MatchAny))
+ COMPLETE_WITH("RENAME TO");
+
+ /* ALTER STATISTICS <name> */
+ else if (Matches("ALTER", "STATISTICS", MatchAny))
+ COMPLETE_WITH("OWNER TO", "RENAME TO", "SET SCHEMA", "SET STATISTICS");
+
+ /* ALTER TRIGGER <name>, add ON */
+ else if (Matches("ALTER", "TRIGGER", MatchAny))
+ COMPLETE_WITH("ON");
+
+ else if (Matches("ALTER", "TRIGGER", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_trigger);
+ }
+
+ /* ALTER TRIGGER <name> ON <name> */
+ else if (Matches("ALTER", "TRIGGER", MatchAny, "ON", MatchAny))
+ COMPLETE_WITH("RENAME TO", "DEPENDS ON EXTENSION",
+ "NO DEPENDS ON EXTENSION");
+
+ /*
+ * If we detect ALTER TABLE <name>, suggest sub commands
+ */
+ else if (Matches("ALTER", "TABLE", MatchAny))
+ COMPLETE_WITH("ADD", "ALTER", "CLUSTER ON", "DISABLE", "DROP",
+ "ENABLE", "INHERIT", "NO", "RENAME", "RESET",
+ "OWNER TO", "SET", "VALIDATE CONSTRAINT",
+ "REPLICA IDENTITY", "ATTACH PARTITION",
+ "DETACH PARTITION", "FORCE ROW LEVEL SECURITY");
+ /* ALTER TABLE xxx ADD */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD"))
+ {
+ /* make sure to keep this list and the !Matches() below in sync */
+ COMPLETE_WITH("COLUMN", "CONSTRAINT", "CHECK", "UNIQUE", "PRIMARY KEY",
+ "EXCLUDE", "FOREIGN KEY");
+ }
+ /* ALTER TABLE xxx ADD [COLUMN] yyy */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "COLUMN", MatchAny) ||
+ (Matches("ALTER", "TABLE", MatchAny, "ADD", MatchAny) &&
+ !Matches("ALTER", "TABLE", MatchAny, "ADD", "COLUMN|CONSTRAINT|CHECK|UNIQUE|PRIMARY|EXCLUDE|FOREIGN")))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ /* ALTER TABLE xxx ADD CONSTRAINT yyy */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny))
+ COMPLETE_WITH("CHECK", "UNIQUE", "PRIMARY KEY", "EXCLUDE", "FOREIGN KEY");
+ /* ALTER TABLE xxx ADD [CONSTRAINT yyy] (PRIMARY KEY|UNIQUE) */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "PRIMARY", "KEY") ||
+ Matches("ALTER", "TABLE", MatchAny, "ADD", "UNIQUE") ||
+ Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny, "PRIMARY", "KEY") ||
+ Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny, "UNIQUE"))
+ COMPLETE_WITH("(", "USING INDEX");
+ /* ALTER TABLE xxx ADD PRIMARY KEY USING INDEX */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "PRIMARY", "KEY", "USING", "INDEX"))
+ {
+ set_completion_reference(prev6_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table);
+ }
+ /* ALTER TABLE xxx ADD UNIQUE USING INDEX */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "UNIQUE", "USING", "INDEX"))
+ {
+ set_completion_reference(prev5_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table);
+ }
+ /* ALTER TABLE xxx ADD CONSTRAINT yyy PRIMARY KEY USING INDEX */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny,
+ "PRIMARY", "KEY", "USING", "INDEX"))
+ {
+ set_completion_reference(prev8_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table);
+ }
+ /* ALTER TABLE xxx ADD CONSTRAINT yyy UNIQUE USING INDEX */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny,
+ "UNIQUE", "USING", "INDEX"))
+ {
+ set_completion_reference(prev7_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table);
+ }
+ /* ALTER TABLE xxx ENABLE */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE"))
+ COMPLETE_WITH("ALWAYS", "REPLICA", "ROW LEVEL SECURITY", "RULE",
+ "TRIGGER");
+ else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE", "REPLICA|ALWAYS"))
+ COMPLETE_WITH("RULE", "TRIGGER");
+ else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE", "RULE"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_rule_of_table);
+ }
+ else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE", MatchAny, "RULE"))
+ {
+ set_completion_reference(prev4_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_rule_of_table);
+ }
+ else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE", "TRIGGER"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_trigger_of_table);
+ }
+ else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE", MatchAny, "TRIGGER"))
+ {
+ set_completion_reference(prev4_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_trigger_of_table);
+ }
+ /* ALTER TABLE xxx INHERIT */
+ else if (Matches("ALTER", "TABLE", MatchAny, "INHERIT"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+ /* ALTER TABLE xxx NO */
+ else if (Matches("ALTER", "TABLE", MatchAny, "NO"))
+ COMPLETE_WITH("FORCE ROW LEVEL SECURITY", "INHERIT");
+ /* ALTER TABLE xxx NO INHERIT */
+ else if (Matches("ALTER", "TABLE", MatchAny, "NO", "INHERIT"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+ /* ALTER TABLE xxx DISABLE */
+ else if (Matches("ALTER", "TABLE", MatchAny, "DISABLE"))
+ COMPLETE_WITH("ROW LEVEL SECURITY", "RULE", "TRIGGER");
+ else if (Matches("ALTER", "TABLE", MatchAny, "DISABLE", "RULE"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_rule_of_table);
+ }
+ else if (Matches("ALTER", "TABLE", MatchAny, "DISABLE", "TRIGGER"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_trigger_of_table);
+ }
+
+ /* ALTER TABLE xxx ALTER */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER"))
+ COMPLETE_WITH_ATTR_PLUS(prev2_wd, "COLUMN", "CONSTRAINT");
+
+ /* ALTER TABLE xxx RENAME */
+ else if (Matches("ALTER", "TABLE", MatchAny, "RENAME"))
+ COMPLETE_WITH_ATTR_PLUS(prev2_wd, "COLUMN", "CONSTRAINT", "TO");
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER|RENAME", "COLUMN"))
+ COMPLETE_WITH_ATTR(prev3_wd);
+
+ /* ALTER TABLE xxx RENAME yyy */
+ else if (Matches("ALTER", "TABLE", MatchAny, "RENAME", MatchAnyExcept("CONSTRAINT|TO")))
+ COMPLETE_WITH("TO");
+
+ /* ALTER TABLE xxx RENAME COLUMN/CONSTRAINT yyy */
+ else if (Matches("ALTER", "TABLE", MatchAny, "RENAME", "COLUMN|CONSTRAINT", MatchAnyExcept("TO")))
+ COMPLETE_WITH("TO");
+
+ /* If we have ALTER TABLE <sth> DROP, provide COLUMN or CONSTRAINT */
+ else if (Matches("ALTER", "TABLE", MatchAny, "DROP"))
+ COMPLETE_WITH("COLUMN", "CONSTRAINT");
+ /* If we have ALTER TABLE <sth> DROP COLUMN, provide list of columns */
+ else if (Matches("ALTER", "TABLE", MatchAny, "DROP", "COLUMN"))
+ COMPLETE_WITH_ATTR(prev3_wd);
+ /* ALTER TABLE <sth> ALTER|DROP|RENAME CONSTRAINT <constraint> */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER|DROP|RENAME", "CONSTRAINT"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_constraint_of_table);
+ }
+ /* ALTER TABLE <sth> VALIDATE CONSTRAINT <non-validated constraint> */
+ else if (Matches("ALTER", "TABLE", MatchAny, "VALIDATE", "CONSTRAINT"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_constraint_of_table_not_validated);
+ }
+ /* ALTER TABLE ALTER [COLUMN] <foo> */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny) ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny))
+ COMPLETE_WITH("TYPE", "SET", "RESET", "RESTART", "ADD", "DROP");
+ /* ALTER TABLE ALTER [COLUMN] <foo> SET */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET"))
+ COMPLETE_WITH("(", "COMPRESSION", "DEFAULT", "NOT NULL", "STATISTICS", "STORAGE");
+ /* ALTER TABLE ALTER [COLUMN] <foo> SET ( */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "(") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "("))
+ COMPLETE_WITH("n_distinct", "n_distinct_inherited");
+ /* ALTER TABLE ALTER [COLUMN] <foo> SET STORAGE */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "STORAGE") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "STORAGE"))
+ COMPLETE_WITH("PLAIN", "EXTERNAL", "EXTENDED", "MAIN");
+ /* ALTER TABLE ALTER [COLUMN] <foo> SET STATISTICS */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "STATISTICS") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "STATISTICS"))
+ {
+ /* Enforce no completion here, as an integer has to be specified */
+ }
+ /* ALTER TABLE ALTER [COLUMN] <foo> DROP */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "DROP") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "DROP"))
+ COMPLETE_WITH("DEFAULT", "EXPRESSION", "IDENTITY", "NOT NULL");
+ else if (Matches("ALTER", "TABLE", MatchAny, "CLUSTER"))
+ COMPLETE_WITH("ON");
+ else if (Matches("ALTER", "TABLE", MatchAny, "CLUSTER", "ON"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_index_of_table);
+ }
+ /* If we have ALTER TABLE <sth> SET, provide list of attributes and '(' */
+ else if (Matches("ALTER", "TABLE", MatchAny, "SET"))
+ COMPLETE_WITH("(", "ACCESS METHOD", "LOGGED", "SCHEMA",
+ "TABLESPACE", "UNLOGGED", "WITH", "WITHOUT");
+
+ /*
+ * If we have ALTER TABLE <sth> SET ACCESS METHOD provide a list of table
+ * AMs.
+ */
+ else if (Matches("ALTER", "TABLE", MatchAny, "SET", "ACCESS", "METHOD"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_table_access_methods);
+
+ /*
+ * If we have ALTER TABLE <sth> SET TABLESPACE provide a list of
+ * tablespaces
+ */
+ else if (Matches("ALTER", "TABLE", MatchAny, "SET", "TABLESPACE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
+ /* If we have ALTER TABLE <sth> SET WITHOUT provide CLUSTER or OIDS */
+ else if (Matches("ALTER", "TABLE", MatchAny, "SET", "WITHOUT"))
+ COMPLETE_WITH("CLUSTER", "OIDS");
+ /* ALTER TABLE <foo> RESET */
+ else if (Matches("ALTER", "TABLE", MatchAny, "RESET"))
+ COMPLETE_WITH("(");
+ /* ALTER TABLE <foo> SET|RESET ( */
+ else if (Matches("ALTER", "TABLE", MatchAny, "SET|RESET", "("))
+ COMPLETE_WITH_LIST(table_storage_parameters);
+ else if (Matches("ALTER", "TABLE", MatchAny, "REPLICA", "IDENTITY", "USING", "INDEX"))
+ {
+ set_completion_reference(prev5_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_index_of_table);
+ }
+ else if (Matches("ALTER", "TABLE", MatchAny, "REPLICA", "IDENTITY", "USING"))
+ COMPLETE_WITH("INDEX");
+ else if (Matches("ALTER", "TABLE", MatchAny, "REPLICA", "IDENTITY"))
+ COMPLETE_WITH("FULL", "NOTHING", "DEFAULT", "USING");
+ else if (Matches("ALTER", "TABLE", MatchAny, "REPLICA"))
+ COMPLETE_WITH("IDENTITY");
+
+ /*
+ * If we have ALTER TABLE <foo> ATTACH PARTITION, provide a list of
+ * tables.
+ */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ATTACH", "PARTITION"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+ /* Limited completion support for partition bound specification */
+ else if (TailMatches("ATTACH", "PARTITION", MatchAny))
+ COMPLETE_WITH("FOR VALUES", "DEFAULT");
+ else if (TailMatches("FOR", "VALUES"))
+ COMPLETE_WITH("FROM (", "IN (", "WITH (");
+
+ /*
+ * If we have ALTER TABLE <foo> DETACH PARTITION, provide a list of
+ * partitions of <foo>.
+ */
+ else if (Matches("ALTER", "TABLE", MatchAny, "DETACH", "PARTITION"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_partition_of_table);
+ }
+ else if (Matches("ALTER", "TABLE", MatchAny, "DETACH", "PARTITION", MatchAny))
+ COMPLETE_WITH("CONCURRENTLY", "FINALIZE");
+
+ /* ALTER TABLESPACE <foo> with RENAME TO, OWNER TO, SET, RESET */
+ else if (Matches("ALTER", "TABLESPACE", MatchAny))
+ COMPLETE_WITH("RENAME TO", "OWNER TO", "SET", "RESET");
+ /* ALTER TABLESPACE <foo> SET|RESET */
+ else if (Matches("ALTER", "TABLESPACE", MatchAny, "SET|RESET"))
+ COMPLETE_WITH("(");
+ /* ALTER TABLESPACE <foo> SET|RESET ( */
+ else if (Matches("ALTER", "TABLESPACE", MatchAny, "SET|RESET", "("))
+ COMPLETE_WITH("seq_page_cost", "random_page_cost",
+ "effective_io_concurrency", "maintenance_io_concurrency");
+
+ /* ALTER TEXT SEARCH */
+ else if (Matches("ALTER", "TEXT", "SEARCH"))
+ COMPLETE_WITH("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE");
+ else if (Matches("ALTER", "TEXT", "SEARCH", "TEMPLATE|PARSER", MatchAny))
+ COMPLETE_WITH("RENAME TO", "SET SCHEMA");
+ else if (Matches("ALTER", "TEXT", "SEARCH", "DICTIONARY", MatchAny))
+ COMPLETE_WITH("(", "OWNER TO", "RENAME TO", "SET SCHEMA");
+ else if (Matches("ALTER", "TEXT", "SEARCH", "CONFIGURATION", MatchAny))
+ COMPLETE_WITH("ADD MAPPING FOR", "ALTER MAPPING",
+ "DROP MAPPING FOR",
+ "OWNER TO", "RENAME TO", "SET SCHEMA");
+
+ /* complete ALTER TYPE <foo> with actions */
+ else if (Matches("ALTER", "TYPE", MatchAny))
+ COMPLETE_WITH("ADD ATTRIBUTE", "ADD VALUE", "ALTER ATTRIBUTE",
+ "DROP ATTRIBUTE",
+ "OWNER TO", "RENAME", "SET SCHEMA", "SET (");
+ /* complete ALTER TYPE <foo> ADD with actions */
+ else if (Matches("ALTER", "TYPE", MatchAny, "ADD"))
+ COMPLETE_WITH("ATTRIBUTE", "VALUE");
+ /* ALTER TYPE <foo> RENAME */
+ else if (Matches("ALTER", "TYPE", MatchAny, "RENAME"))
+ COMPLETE_WITH("ATTRIBUTE", "TO", "VALUE");
+ /* ALTER TYPE xxx RENAME (ATTRIBUTE|VALUE) yyy */
+ else if (Matches("ALTER", "TYPE", MatchAny, "RENAME", "ATTRIBUTE|VALUE", MatchAny))
+ COMPLETE_WITH("TO");
+
+ /*
+ * If we have ALTER TYPE <sth> ALTER/DROP/RENAME ATTRIBUTE, provide list
+ * of attributes
+ */
+ else if (Matches("ALTER", "TYPE", MatchAny, "ALTER|DROP|RENAME", "ATTRIBUTE"))
+ COMPLETE_WITH_ATTR(prev3_wd);
+ /* ALTER TYPE ALTER ATTRIBUTE <foo> */
+ else if (Matches("ALTER", "TYPE", MatchAny, "ALTER", "ATTRIBUTE", MatchAny))
+ COMPLETE_WITH("TYPE");
+ /* complete ALTER GROUP <foo> */
+ else if (Matches("ALTER", "GROUP", MatchAny))
+ COMPLETE_WITH("ADD USER", "DROP USER", "RENAME TO");
+ /* complete ALTER GROUP <foo> ADD|DROP with USER */
+ else if (Matches("ALTER", "GROUP", MatchAny, "ADD|DROP"))
+ COMPLETE_WITH("USER");
+ /* complete ALTER GROUP <foo> ADD|DROP USER with a user name */
+ else if (Matches("ALTER", "GROUP", MatchAny, "ADD|DROP", "USER"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+
+ /*
+ * If we have ALTER TYPE <sth> RENAME VALUE, provide list of enum values
+ */
+ else if (Matches("ALTER", "TYPE", MatchAny, "RENAME", "VALUE"))
+ COMPLETE_WITH_ENUM_VALUE(prev3_wd);
+
+/*
+ * ANALYZE [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
+ * ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ]
+ */
+ else if (Matches("ANALYZE"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_analyzables,
+ "VERBOSE");
+ else if (HeadMatches("ANALYZE", "(*") &&
+ !HeadMatches("ANALYZE", "(*)"))
+ {
+ /*
+ * This fires if we're in an unfinished parenthesized option list.
+ * get_previous_words treats a completed parenthesized option list as
+ * one word, so the above test is correct.
+ */
+ if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
+ COMPLETE_WITH("VERBOSE", "SKIP_LOCKED");
+ else if (TailMatches("VERBOSE|SKIP_LOCKED"))
+ COMPLETE_WITH("ON", "OFF");
+ }
+ else if (HeadMatches("ANALYZE") && TailMatches("("))
+ /* "ANALYZE (" should be caught above, so assume we want columns */
+ COMPLETE_WITH_ATTR(prev2_wd);
+ else if (HeadMatches("ANALYZE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_analyzables);
+
+/* BEGIN */
+ else if (Matches("BEGIN"))
+ COMPLETE_WITH("WORK", "TRANSACTION", "ISOLATION LEVEL", "READ", "DEFERRABLE", "NOT DEFERRABLE");
+/* END, ABORT */
+ else if (Matches("END|ABORT"))
+ COMPLETE_WITH("AND", "WORK", "TRANSACTION");
+/* COMMIT */
+ else if (Matches("COMMIT"))
+ COMPLETE_WITH("AND", "WORK", "TRANSACTION", "PREPARED");
+/* RELEASE SAVEPOINT */
+ else if (Matches("RELEASE"))
+ COMPLETE_WITH("SAVEPOINT");
+/* ROLLBACK */
+ else if (Matches("ROLLBACK"))
+ COMPLETE_WITH("AND", "WORK", "TRANSACTION", "TO SAVEPOINT", "PREPARED");
+ else if (Matches("ABORT|END|COMMIT|ROLLBACK", "AND"))
+ COMPLETE_WITH("CHAIN");
+/* CALL */
+ else if (Matches("CALL"))
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_procedures);
+ else if (Matches("CALL", MatchAny))
+ COMPLETE_WITH("(");
+/* CLOSE */
+ else if (Matches("CLOSE"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors,
+ "ALL");
+/* CLUSTER */
+ else if (Matches("CLUSTER"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_clusterables,
+ "VERBOSE");
+ else if (Matches("CLUSTER", "VERBOSE") ||
+ Matches("CLUSTER", "(*)"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_clusterables);
+ /* If we have CLUSTER <sth>, then add "USING" */
+ else if (Matches("CLUSTER", MatchAnyExcept("VERBOSE|ON|(|(*)")))
+ COMPLETE_WITH("USING");
+ /* If we have CLUSTER VERBOSE <sth>, then add "USING" */
+ else if (Matches("CLUSTER", "VERBOSE|(*)", MatchAny))
+ COMPLETE_WITH("USING");
+ /* If we have CLUSTER <sth> USING, then add the index as well */
+ else if (Matches("CLUSTER", MatchAny, "USING") ||
+ Matches("CLUSTER", "VERBOSE|(*)", MatchAny, "USING"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_index_of_table);
+ }
+ else if (HeadMatches("CLUSTER", "(*") &&
+ !HeadMatches("CLUSTER", "(*)"))
+ {
+ /*
+ * This fires if we're in an unfinished parenthesized option list.
+ * get_previous_words treats a completed parenthesized option list as
+ * one word, so the above test is correct.
+ */
+ if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
+ COMPLETE_WITH("VERBOSE");
+ }
+
+/* COMMENT */
+ else if (Matches("COMMENT"))
+ COMPLETE_WITH("ON");
+ else if (Matches("COMMENT", "ON"))
+ COMPLETE_WITH("ACCESS METHOD", "AGGREGATE", "CAST", "COLLATION",
+ "COLUMN", "CONSTRAINT", "CONVERSION", "DATABASE",
+ "DOMAIN", "EXTENSION", "EVENT TRIGGER",
+ "FOREIGN DATA WRAPPER", "FOREIGN TABLE",
+ "FUNCTION", "INDEX", "LANGUAGE", "LARGE OBJECT",
+ "MATERIALIZED VIEW", "OPERATOR", "POLICY",
+ "PROCEDURE", "PROCEDURAL LANGUAGE", "PUBLICATION", "ROLE",
+ "ROUTINE", "RULE", "SCHEMA", "SEQUENCE", "SERVER",
+ "STATISTICS", "SUBSCRIPTION", "TABLE",
+ "TABLESPACE", "TEXT SEARCH", "TRANSFORM FOR",
+ "TRIGGER", "TYPE", "VIEW");
+ else if (Matches("COMMENT", "ON", "ACCESS", "METHOD"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_access_methods);
+ else if (Matches("COMMENT", "ON", "CONSTRAINT"))
+ COMPLETE_WITH_QUERY(Query_for_all_table_constraints);
+ else if (Matches("COMMENT", "ON", "CONSTRAINT", MatchAny))
+ COMPLETE_WITH("ON");
+ else if (Matches("COMMENT", "ON", "CONSTRAINT", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables_for_constraint,
+ "DOMAIN");
+ }
+ else if (Matches("COMMENT", "ON", "CONSTRAINT", MatchAny, "ON", "DOMAIN"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains);
+ else if (Matches("COMMENT", "ON", "EVENT", "TRIGGER"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
+ else if (Matches("COMMENT", "ON", "FOREIGN"))
+ COMPLETE_WITH("DATA WRAPPER", "TABLE");
+ else if (Matches("COMMENT", "ON", "FOREIGN", "TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables);
+ else if (Matches("COMMENT", "ON", "MATERIALIZED", "VIEW"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews);
+ else if (Matches("COMMENT", "ON", "POLICY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_policies);
+ else if (Matches("COMMENT", "ON", "POLICY", MatchAny))
+ COMPLETE_WITH("ON");
+ else if (Matches("COMMENT", "ON", "POLICY", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_policy);
+ }
+ else if (Matches("COMMENT", "ON", "PROCEDURAL", "LANGUAGE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_languages);
+ else if (Matches("COMMENT", "ON", "RULE", MatchAny))
+ COMPLETE_WITH("ON");
+ else if (Matches("COMMENT", "ON", "RULE", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_rule);
+ }
+ else if (Matches("COMMENT", "ON", "TEXT", "SEARCH"))
+ COMPLETE_WITH("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE");
+ else if (Matches("COMMENT", "ON", "TEXT", "SEARCH", "CONFIGURATION"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_configurations);
+ else if (Matches("COMMENT", "ON", "TEXT", "SEARCH", "DICTIONARY"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_dictionaries);
+ else if (Matches("COMMENT", "ON", "TEXT", "SEARCH", "PARSER"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_parsers);
+ else if (Matches("COMMENT", "ON", "TEXT", "SEARCH", "TEMPLATE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_templates);
+ else if (Matches("COMMENT", "ON", "TRANSFORM", "FOR"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (Matches("COMMENT", "ON", "TRANSFORM", "FOR", MatchAny))
+ COMPLETE_WITH("LANGUAGE");
+ else if (Matches("COMMENT", "ON", "TRANSFORM", "FOR", MatchAny, "LANGUAGE"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_QUERY(Query_for_list_of_languages);
+ }
+ else if (Matches("COMMENT", "ON", "TRIGGER", MatchAny))
+ COMPLETE_WITH("ON");
+ else if (Matches("COMMENT", "ON", "TRIGGER", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_trigger);
+ }
+ else if (Matches("COMMENT", "ON", MatchAny, MatchAnyExcept("IS")) ||
+ Matches("COMMENT", "ON", MatchAny, MatchAny, MatchAnyExcept("IS")) ||
+ Matches("COMMENT", "ON", MatchAny, MatchAny, MatchAny, MatchAnyExcept("IS")) ||
+ Matches("COMMENT", "ON", MatchAny, MatchAny, MatchAny, MatchAny, MatchAnyExcept("IS")))
+ COMPLETE_WITH("IS");
+
+/* COPY */
+
+ /*
+ * If we have COPY, offer list of tables or "(" (Also cover the analogous
+ * backslash command).
+ */
+ else if (Matches("COPY|\\copy"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables, "(");
+ /* Complete COPY ( with legal query commands */
+ else if (Matches("COPY|\\copy", "("))
+ COMPLETE_WITH("SELECT", "TABLE", "VALUES", "INSERT INTO", "UPDATE", "DELETE FROM", "WITH");
+ /* Complete COPY <sth> */
+ else if (Matches("COPY|\\copy", MatchAny))
+ COMPLETE_WITH("FROM", "TO");
+ /* Complete COPY <sth> FROM|TO with filename */
+ else if (Matches("COPY", MatchAny, "FROM|TO"))
+ {
+ completion_charp = "";
+ completion_force_quote = true; /* COPY requires quoted filename */
+ matches = rl_completion_matches(text, complete_from_files);
+ }
+ else if (Matches("\\copy", MatchAny, "FROM|TO"))
+ {
+ completion_charp = "";
+ completion_force_quote = false;
+ matches = rl_completion_matches(text, complete_from_files);
+ }
+
+ /* Complete COPY <sth> TO <sth> */
+ else if (Matches("COPY|\\copy", MatchAny, "TO", MatchAny))
+ COMPLETE_WITH("WITH (");
+
+ /* Complete COPY <sth> FROM <sth> */
+ else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny))
+ COMPLETE_WITH("WITH (", "WHERE");
+
+ /* Complete COPY <sth> FROM|TO filename WITH ( */
+ else if (Matches("COPY|\\copy", MatchAny, "FROM|TO", MatchAny, "WITH", "("))
+ COMPLETE_WITH("FORMAT", "FREEZE", "DELIMITER", "NULL",
+ "HEADER", "QUOTE", "ESCAPE", "FORCE_QUOTE",
+ "FORCE_NOT_NULL", "FORCE_NULL", "ENCODING");
+
+ /* Complete COPY <sth> FROM|TO filename WITH (FORMAT */
+ else if (Matches("COPY|\\copy", MatchAny, "FROM|TO", MatchAny, "WITH", "(", "FORMAT"))
+ COMPLETE_WITH("binary", "csv", "text");
+
+ /* Complete COPY <sth> FROM <sth> WITH (<options>) */
+ else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny, "WITH", MatchAny))
+ COMPLETE_WITH("WHERE");
+
+ /* CREATE ACCESS METHOD */
+ /* Complete "CREATE ACCESS METHOD <name>" */
+ else if (Matches("CREATE", "ACCESS", "METHOD", MatchAny))
+ COMPLETE_WITH("TYPE");
+ /* Complete "CREATE ACCESS METHOD <name> TYPE" */
+ else if (Matches("CREATE", "ACCESS", "METHOD", MatchAny, "TYPE"))
+ COMPLETE_WITH("INDEX", "TABLE");
+ /* Complete "CREATE ACCESS METHOD <name> TYPE <type>" */
+ else if (Matches("CREATE", "ACCESS", "METHOD", MatchAny, "TYPE", MatchAny))
+ COMPLETE_WITH("HANDLER");
+
+ /* CREATE COLLATION */
+ else if (Matches("CREATE", "COLLATION", MatchAny))
+ COMPLETE_WITH("(", "FROM");
+ else if (Matches("CREATE", "COLLATION", MatchAny, "FROM"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_collations);
+ else if (HeadMatches("CREATE", "COLLATION", MatchAny, "(*"))
+ {
+ if (TailMatches("(|*,"))
+ COMPLETE_WITH("LOCALE =", "LC_COLLATE =", "LC_CTYPE =",
+ "PROVIDER =", "DETERMINISTIC =");
+ else if (TailMatches("PROVIDER", "="))
+ COMPLETE_WITH("libc", "icu");
+ else if (TailMatches("DETERMINISTIC", "="))
+ COMPLETE_WITH("true", "false");
+ }
+
+ /* CREATE DATABASE */
+ else if (Matches("CREATE", "DATABASE", MatchAny))
+ COMPLETE_WITH("OWNER", "TEMPLATE", "ENCODING", "TABLESPACE",
+ "IS_TEMPLATE", "STRATEGY",
+ "ALLOW_CONNECTIONS", "CONNECTION LIMIT",
+ "LC_COLLATE", "LC_CTYPE", "LOCALE", "OID",
+ "LOCALE_PROVIDER", "ICU_LOCALE");
+
+ else if (Matches("CREATE", "DATABASE", MatchAny, "TEMPLATE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_template_databases);
+ else if (Matches("CREATE", "DATABASE", MatchAny, "STRATEGY"))
+ COMPLETE_WITH("WAL_LOG", "FILE_COPY");
+
+ /* CREATE DOMAIN */
+ else if (Matches("CREATE", "DOMAIN", MatchAny))
+ COMPLETE_WITH("AS");
+ else if (Matches("CREATE", "DOMAIN", MatchAny, "AS"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (Matches("CREATE", "DOMAIN", MatchAny, "AS", MatchAny))
+ COMPLETE_WITH("COLLATE", "DEFAULT", "CONSTRAINT",
+ "NOT NULL", "NULL", "CHECK (");
+ else if (Matches("CREATE", "DOMAIN", MatchAny, "COLLATE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_collations);
+
+ /* CREATE EXTENSION */
+ /* Complete with available extensions rather than installed ones. */
+ else if (Matches("CREATE", "EXTENSION"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_available_extensions);
+ /* CREATE EXTENSION <name> */
+ else if (Matches("CREATE", "EXTENSION", MatchAny))
+ COMPLETE_WITH("WITH SCHEMA", "CASCADE", "VERSION");
+ /* CREATE EXTENSION <name> VERSION */
+ else if (Matches("CREATE", "EXTENSION", MatchAny, "VERSION"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions);
+ }
+
+ /* CREATE FOREIGN */
+ else if (Matches("CREATE", "FOREIGN"))
+ COMPLETE_WITH("DATA WRAPPER", "TABLE");
+
+ /* CREATE FOREIGN DATA WRAPPER */
+ else if (Matches("CREATE", "FOREIGN", "DATA", "WRAPPER", MatchAny))
+ COMPLETE_WITH("HANDLER", "VALIDATOR", "OPTIONS");
+
+ /* CREATE FOREIGN TABLE */
+ else if (Matches("CREATE", "FOREIGN", "TABLE", MatchAny))
+ COMPLETE_WITH("(", "PARTITION OF");
+
+ /* CREATE INDEX --- is allowed inside CREATE SCHEMA, so use TailMatches */
+ /* First off we complete CREATE UNIQUE with "INDEX" */
+ else if (TailMatches("CREATE", "UNIQUE"))
+ COMPLETE_WITH("INDEX");
+
+ /*
+ * If we have CREATE|UNIQUE INDEX, then add "ON", "CONCURRENTLY", and
+ * existing indexes
+ */
+ else if (TailMatches("CREATE|UNIQUE", "INDEX"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
+ "ON", "CONCURRENTLY");
+
+ /*
+ * Complete ... INDEX|CONCURRENTLY [<name>] ON with a list of relations
+ * that indexes can be created on
+ */
+ else if (TailMatches("INDEX|CONCURRENTLY", MatchAny, "ON") ||
+ TailMatches("INDEX|CONCURRENTLY", "ON"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexables);
+
+ /*
+ * Complete CREATE|UNIQUE INDEX CONCURRENTLY with "ON" and existing
+ * indexes
+ */
+ else if (TailMatches("CREATE|UNIQUE", "INDEX", "CONCURRENTLY"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
+ "ON");
+ /* Complete CREATE|UNIQUE INDEX [CONCURRENTLY] <sth> with "ON" */
+ else if (TailMatches("CREATE|UNIQUE", "INDEX", MatchAny) ||
+ TailMatches("CREATE|UNIQUE", "INDEX", "CONCURRENTLY", MatchAny))
+ COMPLETE_WITH("ON");
+
+ /*
+ * Complete INDEX <name> ON <table> with a list of table columns (which
+ * should really be in parens)
+ */
+ else if (TailMatches("INDEX", MatchAny, "ON", MatchAny) ||
+ TailMatches("INDEX|CONCURRENTLY", "ON", MatchAny))
+ COMPLETE_WITH("(", "USING");
+ else if (TailMatches("INDEX", MatchAny, "ON", MatchAny, "(") ||
+ TailMatches("INDEX|CONCURRENTLY", "ON", MatchAny, "("))
+ COMPLETE_WITH_ATTR(prev2_wd);
+ /* same if you put in USING */
+ else if (TailMatches("ON", MatchAny, "USING", MatchAny, "("))
+ COMPLETE_WITH_ATTR(prev4_wd);
+ /* Complete USING with an index method */
+ else if (TailMatches("INDEX", MatchAny, MatchAny, "ON", MatchAny, "USING") ||
+ TailMatches("INDEX", MatchAny, "ON", MatchAny, "USING") ||
+ TailMatches("INDEX", "ON", MatchAny, "USING"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_index_access_methods);
+ else if (TailMatches("ON", MatchAny, "USING", MatchAny) &&
+ !TailMatches("POLICY", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny) &&
+ !TailMatches("FOR", MatchAny, MatchAny, MatchAny))
+ COMPLETE_WITH("(");
+
+ /* CREATE OR REPLACE */
+ else if (Matches("CREATE", "OR"))
+ COMPLETE_WITH("REPLACE");
+
+ /* CREATE POLICY */
+ /* Complete "CREATE POLICY <name> ON" */
+ else if (Matches("CREATE", "POLICY", MatchAny))
+ COMPLETE_WITH("ON");
+ /* Complete "CREATE POLICY <name> ON <table>" */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+ /* Complete "CREATE POLICY <name> ON <table> AS|FOR|TO|USING|WITH CHECK" */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny))
+ COMPLETE_WITH("AS", "FOR", "TO", "USING (", "WITH CHECK (");
+ /* CREATE POLICY <name> ON <table> AS PERMISSIVE|RESTRICTIVE */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS"))
+ COMPLETE_WITH("PERMISSIVE", "RESTRICTIVE");
+
+ /*
+ * CREATE POLICY <name> ON <table> AS PERMISSIVE|RESTRICTIVE
+ * FOR|TO|USING|WITH CHECK
+ */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS", MatchAny))
+ COMPLETE_WITH("FOR", "TO", "USING", "WITH CHECK");
+ /* CREATE POLICY <name> ON <table> FOR ALL|SELECT|INSERT|UPDATE|DELETE */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "FOR"))
+ COMPLETE_WITH("ALL", "SELECT", "INSERT", "UPDATE", "DELETE");
+ /* Complete "CREATE POLICY <name> ON <table> FOR INSERT TO|WITH CHECK" */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "FOR", "INSERT"))
+ COMPLETE_WITH("TO", "WITH CHECK (");
+ /* Complete "CREATE POLICY <name> ON <table> FOR SELECT|DELETE TO|USING" */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "FOR", "SELECT|DELETE"))
+ COMPLETE_WITH("TO", "USING (");
+ /* CREATE POLICY <name> ON <table> FOR ALL|UPDATE TO|USING|WITH CHECK */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "FOR", "ALL|UPDATE"))
+ COMPLETE_WITH("TO", "USING (", "WITH CHECK (");
+ /* Complete "CREATE POLICY <name> ON <table> TO <role>" */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "TO"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ Keywords_for_list_of_grant_roles);
+ /* Complete "CREATE POLICY <name> ON <table> USING (" */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "USING"))
+ COMPLETE_WITH("(");
+
+ /*
+ * CREATE POLICY <name> ON <table> AS PERMISSIVE|RESTRICTIVE FOR
+ * ALL|SELECT|INSERT|UPDATE|DELETE
+ */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS", MatchAny, "FOR"))
+ COMPLETE_WITH("ALL", "SELECT", "INSERT", "UPDATE", "DELETE");
+
+ /*
+ * Complete "CREATE POLICY <name> ON <table> AS PERMISSIVE|RESTRICTIVE FOR
+ * INSERT TO|WITH CHECK"
+ */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS", MatchAny, "FOR", "INSERT"))
+ COMPLETE_WITH("TO", "WITH CHECK (");
+
+ /*
+ * Complete "CREATE POLICY <name> ON <table> AS PERMISSIVE|RESTRICTIVE FOR
+ * SELECT|DELETE TO|USING"
+ */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS", MatchAny, "FOR", "SELECT|DELETE"))
+ COMPLETE_WITH("TO", "USING (");
+
+ /*
+ * CREATE POLICY <name> ON <table> AS PERMISSIVE|RESTRICTIVE FOR
+ * ALL|UPDATE TO|USING|WITH CHECK
+ */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS", MatchAny, "FOR", "ALL|UPDATE"))
+ COMPLETE_WITH("TO", "USING (", "WITH CHECK (");
+
+ /*
+ * Complete "CREATE POLICY <name> ON <table> AS PERMISSIVE|RESTRICTIVE TO
+ * <role>"
+ */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS", MatchAny, "TO"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ Keywords_for_list_of_grant_roles);
+
+ /*
+ * Complete "CREATE POLICY <name> ON <table> AS PERMISSIVE|RESTRICTIVE
+ * USING ("
+ */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS", MatchAny, "USING"))
+ COMPLETE_WITH("(");
+
+
+/* CREATE PUBLICATION */
+ else if (Matches("CREATE", "PUBLICATION", MatchAny))
+ COMPLETE_WITH("FOR TABLE", "FOR ALL TABLES", "FOR TABLES IN SCHEMA", "WITH (");
+ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR"))
+ COMPLETE_WITH("TABLE", "ALL TABLES", "TABLES IN SCHEMA");
+ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL"))
+ COMPLETE_WITH("TABLES");
+ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES"))
+ COMPLETE_WITH("WITH (");
+ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLES"))
+ COMPLETE_WITH("IN SCHEMA");
+ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLE", MatchAny) && !ends_with(prev_wd, ','))
+ COMPLETE_WITH("WHERE (", "WITH (");
+ /* Complete "CREATE PUBLICATION <name> FOR TABLE" with "<table>, ..." */
+ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+
+ /*
+ * "CREATE PUBLICATION <name> FOR TABLE <name> WHERE (" - complete with
+ * table attributes
+ */
+ else if (HeadMatches("CREATE", "PUBLICATION", MatchAny) && TailMatches("WHERE"))
+ COMPLETE_WITH("(");
+ else if (HeadMatches("CREATE", "PUBLICATION", MatchAny) && TailMatches("WHERE", "("))
+ COMPLETE_WITH_ATTR(prev3_wd);
+ else if (HeadMatches("CREATE", "PUBLICATION", MatchAny) && TailMatches("WHERE", "(*)"))
+ COMPLETE_WITH(" WITH (");
+
+ /*
+ * Complete "CREATE PUBLICATION <name> FOR TABLES IN SCHEMA <schema>, ..."
+ */
+ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLES", "IN", "SCHEMA"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas
+ " AND nspname NOT LIKE E'pg\\\\_%%'",
+ "CURRENT_SCHEMA");
+ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLES", "IN", "SCHEMA", MatchAny) && (!ends_with(prev_wd, ',')))
+ COMPLETE_WITH("WITH (");
+ /* Complete "CREATE PUBLICATION <name> [...] WITH" */
+ else if (HeadMatches("CREATE", "PUBLICATION") && TailMatches("WITH", "("))
+ COMPLETE_WITH("publish", "publish_via_partition_root");
+
+/* CREATE RULE */
+ /* Complete "CREATE [ OR REPLACE ] RULE <sth>" with "AS ON" */
+ else if (Matches("CREATE", "RULE", MatchAny) ||
+ Matches("CREATE", "OR", "REPLACE", "RULE", MatchAny))
+ COMPLETE_WITH("AS ON");
+ /* Complete "CREATE [ OR REPLACE ] RULE <sth> AS" with "ON" */
+ else if (Matches("CREATE", "RULE", MatchAny, "AS") ||
+ Matches("CREATE", "OR", "REPLACE", "RULE", MatchAny, "AS"))
+ COMPLETE_WITH("ON");
+
+ /*
+ * Complete "CREATE [ OR REPLACE ] RULE <sth> AS ON" with
+ * SELECT|UPDATE|INSERT|DELETE
+ */
+ else if (Matches("CREATE", "RULE", MatchAny, "AS", "ON") ||
+ Matches("CREATE", "OR", "REPLACE", "RULE", MatchAny, "AS", "ON"))
+ COMPLETE_WITH("SELECT", "UPDATE", "INSERT", "DELETE");
+ /* Complete "AS ON SELECT|UPDATE|INSERT|DELETE" with a "TO" */
+ else if (TailMatches("AS", "ON", "SELECT|UPDATE|INSERT|DELETE"))
+ COMPLETE_WITH("TO");
+ /* Complete "AS ON <sth> TO" with a table name */
+ else if (TailMatches("AS", "ON", "SELECT|UPDATE|INSERT|DELETE", "TO"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+
+/* CREATE SEQUENCE --- is allowed inside CREATE SCHEMA, so use TailMatches */
+ else if (TailMatches("CREATE", "SEQUENCE", MatchAny) ||
+ TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny))
+ COMPLETE_WITH("AS", "INCREMENT BY", "MINVALUE", "MAXVALUE", "NO",
+ "CACHE", "CYCLE", "OWNED BY", "START WITH");
+ else if (TailMatches("CREATE", "SEQUENCE", MatchAny, "AS") ||
+ TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny, "AS"))
+ COMPLETE_WITH_CS("smallint", "integer", "bigint");
+ else if (TailMatches("CREATE", "SEQUENCE", MatchAny, "NO") ||
+ TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny, "NO"))
+ COMPLETE_WITH("MINVALUE", "MAXVALUE", "CYCLE");
+
+/* CREATE SERVER <name> */
+ else if (Matches("CREATE", "SERVER", MatchAny))
+ COMPLETE_WITH("TYPE", "VERSION", "FOREIGN DATA WRAPPER");
+
+/* CREATE STATISTICS <name> */
+ else if (Matches("CREATE", "STATISTICS", MatchAny))
+ COMPLETE_WITH("(", "ON");
+ else if (Matches("CREATE", "STATISTICS", MatchAny, "("))
+ COMPLETE_WITH("ndistinct", "dependencies", "mcv");
+ else if (Matches("CREATE", "STATISTICS", MatchAny, "(*)"))
+ COMPLETE_WITH("ON");
+ else if (HeadMatches("CREATE", "STATISTICS", MatchAny) &&
+ TailMatches("FROM"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+
+/* CREATE TABLE --- is allowed inside CREATE SCHEMA, so use TailMatches */
+ /* Complete "CREATE TEMP/TEMPORARY" with the possible temp objects */
+ else if (TailMatches("CREATE", "TEMP|TEMPORARY"))
+ COMPLETE_WITH("SEQUENCE", "TABLE", "VIEW");
+ /* Complete "CREATE UNLOGGED" with TABLE or MATVIEW */
+ else if (TailMatches("CREATE", "UNLOGGED"))
+ COMPLETE_WITH("TABLE", "MATERIALIZED VIEW");
+ /* Complete PARTITION BY with RANGE ( or LIST ( or ... */
+ else if (TailMatches("PARTITION", "BY"))
+ COMPLETE_WITH("RANGE (", "LIST (", "HASH (");
+ /* If we have xxx PARTITION OF, provide a list of partitioned tables */
+ else if (TailMatches("PARTITION", "OF"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_tables);
+ /* Limited completion support for partition bound specification */
+ else if (TailMatches("PARTITION", "OF", MatchAny))
+ COMPLETE_WITH("FOR VALUES", "DEFAULT");
+ /* Complete CREATE TABLE <name> with '(', OF or PARTITION OF */
+ else if (TailMatches("CREATE", "TABLE", MatchAny) ||
+ TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny))
+ COMPLETE_WITH("(", "OF", "PARTITION OF");
+ /* Complete CREATE TABLE <name> OF with list of composite types */
+ else if (TailMatches("CREATE", "TABLE", MatchAny, "OF") ||
+ TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny, "OF"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_composite_datatypes);
+ /* Complete CREATE TABLE name (...) with supported options */
+ else if (TailMatches("CREATE", "TABLE", MatchAny, "(*)") ||
+ TailMatches("CREATE", "UNLOGGED", "TABLE", MatchAny, "(*)"))
+ COMPLETE_WITH("INHERITS (", "PARTITION BY", "USING", "TABLESPACE", "WITH (");
+ else if (TailMatches("CREATE", "TEMP|TEMPORARY", "TABLE", MatchAny, "(*)"))
+ COMPLETE_WITH("INHERITS (", "ON COMMIT", "PARTITION BY",
+ "TABLESPACE", "WITH (");
+ /* Complete CREATE TABLE (...) USING with table access methods */
+ else if (TailMatches("CREATE", "TABLE", MatchAny, "(*)", "USING") ||
+ TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny, "(*)", "USING"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_table_access_methods);
+ /* Complete CREATE TABLE (...) WITH with storage parameters */
+ else if (TailMatches("CREATE", "TABLE", MatchAny, "(*)", "WITH", "(") ||
+ TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny, "(*)", "WITH", "("))
+ COMPLETE_WITH_LIST(table_storage_parameters);
+ /* Complete CREATE TABLE ON COMMIT with actions */
+ else if (TailMatches("CREATE", "TEMP|TEMPORARY", "TABLE", MatchAny, "(*)", "ON", "COMMIT"))
+ COMPLETE_WITH("DELETE ROWS", "DROP", "PRESERVE ROWS");
+
+/* CREATE TABLESPACE */
+ else if (Matches("CREATE", "TABLESPACE", MatchAny))
+ COMPLETE_WITH("OWNER", "LOCATION");
+ /* Complete CREATE TABLESPACE name OWNER name with "LOCATION" */
+ else if (Matches("CREATE", "TABLESPACE", MatchAny, "OWNER", MatchAny))
+ COMPLETE_WITH("LOCATION");
+
+/* CREATE TEXT SEARCH */
+ else if (Matches("CREATE", "TEXT", "SEARCH"))
+ COMPLETE_WITH("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE");
+ else if (Matches("CREATE", "TEXT", "SEARCH", "CONFIGURATION|DICTIONARY|PARSER|TEMPLATE", MatchAny))
+ COMPLETE_WITH("(");
+
+/* CREATE TRANSFORM */
+ else if (Matches("CREATE", "TRANSFORM") ||
+ Matches("CREATE", "OR", "REPLACE", "TRANSFORM"))
+ COMPLETE_WITH("FOR");
+ else if (Matches("CREATE", "TRANSFORM", "FOR") ||
+ Matches("CREATE", "OR", "REPLACE", "TRANSFORM", "FOR"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (Matches("CREATE", "TRANSFORM", "FOR", MatchAny) ||
+ Matches("CREATE", "OR", "REPLACE", "TRANSFORM", "FOR", MatchAny))
+ COMPLETE_WITH("LANGUAGE");
+ else if (Matches("CREATE", "TRANSFORM", "FOR", MatchAny, "LANGUAGE") ||
+ Matches("CREATE", "OR", "REPLACE", "TRANSFORM", "FOR", MatchAny, "LANGUAGE"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_QUERY(Query_for_list_of_languages);
+ }
+
+/* CREATE SUBSCRIPTION */
+ else if (Matches("CREATE", "SUBSCRIPTION", MatchAny))
+ COMPLETE_WITH("CONNECTION");
+ else if (Matches("CREATE", "SUBSCRIPTION", MatchAny, "CONNECTION", MatchAny))
+ COMPLETE_WITH("PUBLICATION");
+ else if (Matches("CREATE", "SUBSCRIPTION", MatchAny, "CONNECTION",
+ MatchAny, "PUBLICATION"))
+ {
+ /* complete with nothing here as this refers to remote publications */
+ }
+ else if (HeadMatches("CREATE", "SUBSCRIPTION") && TailMatches("PUBLICATION", MatchAny))
+ COMPLETE_WITH("WITH (");
+ /* Complete "CREATE SUBSCRIPTION <name> ... WITH ( <opt>" */
+ else if (HeadMatches("CREATE", "SUBSCRIPTION") && TailMatches("WITH", "("))
+ COMPLETE_WITH("binary", "connect", "copy_data", "create_slot",
+ "disable_on_error", "enabled", "slot_name", "streaming",
+ "synchronous_commit", "two_phase");
+
+/* CREATE TRIGGER --- is allowed inside CREATE SCHEMA, so use TailMatches */
+
+ /*
+ * Complete CREATE [ OR REPLACE ] TRIGGER <name> with BEFORE|AFTER|INSTEAD
+ * OF.
+ */
+ else if (TailMatches("CREATE", "TRIGGER", MatchAny) ||
+ TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny))
+ COMPLETE_WITH("BEFORE", "AFTER", "INSTEAD OF");
+
+ /*
+ * Complete CREATE [ OR REPLACE ] TRIGGER <name> BEFORE,AFTER with an
+ * event.
+ */
+ else if (TailMatches("CREATE", "TRIGGER", MatchAny, "BEFORE|AFTER") ||
+ TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "BEFORE|AFTER"))
+ COMPLETE_WITH("INSERT", "DELETE", "UPDATE", "TRUNCATE");
+ /* Complete CREATE [ OR REPLACE ] TRIGGER <name> INSTEAD OF with an event */
+ else if (TailMatches("CREATE", "TRIGGER", MatchAny, "INSTEAD", "OF") ||
+ TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "INSTEAD", "OF"))
+ COMPLETE_WITH("INSERT", "DELETE", "UPDATE");
+
+ /*
+ * Complete CREATE [ OR REPLACE ] TRIGGER <name> BEFORE,AFTER sth with
+ * OR|ON.
+ */
+ else if (TailMatches("CREATE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny) ||
+ TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny) ||
+ TailMatches("CREATE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny) ||
+ TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny))
+ COMPLETE_WITH("ON", "OR");
+
+ /*
+ * Complete CREATE [ OR REPLACE ] TRIGGER <name> BEFORE,AFTER event ON
+ * with a list of tables. EXECUTE FUNCTION is the recommended grammar
+ * instead of EXECUTE PROCEDURE in version 11 and upwards.
+ */
+ else if (TailMatches("CREATE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny, "ON") ||
+ TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny, "ON"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+
+ /*
+ * Complete CREATE [ OR REPLACE ] TRIGGER ... INSTEAD OF event ON with a
+ * list of views.
+ */
+ else if (TailMatches("CREATE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny, "ON") ||
+ TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny, "ON"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views);
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ TailMatches("ON", MatchAny))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("NOT DEFERRABLE", "DEFERRABLE", "INITIALLY",
+ "REFERENCING", "FOR", "WHEN (", "EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("NOT DEFERRABLE", "DEFERRABLE", "INITIALLY",
+ "REFERENCING", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+ }
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ (TailMatches("DEFERRABLE") || TailMatches("INITIALLY", "IMMEDIATE|DEFERRED")))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("REFERENCING", "FOR", "WHEN (", "EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("REFERENCING", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+ }
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ TailMatches("REFERENCING"))
+ COMPLETE_WITH("OLD TABLE", "NEW TABLE");
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ TailMatches("OLD|NEW", "TABLE"))
+ COMPLETE_WITH("AS");
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ (TailMatches("REFERENCING", "OLD", "TABLE", "AS", MatchAny) ||
+ TailMatches("REFERENCING", "OLD", "TABLE", MatchAny)))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("NEW TABLE", "FOR", "WHEN (", "EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("NEW TABLE", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+ }
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ (TailMatches("REFERENCING", "NEW", "TABLE", "AS", MatchAny) ||
+ TailMatches("REFERENCING", "NEW", "TABLE", MatchAny)))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("OLD TABLE", "FOR", "WHEN (", "EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("OLD TABLE", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+ }
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ (TailMatches("REFERENCING", "OLD|NEW", "TABLE", "AS", MatchAny, "OLD|NEW", "TABLE", "AS", MatchAny) ||
+ TailMatches("REFERENCING", "OLD|NEW", "TABLE", MatchAny, "OLD|NEW", "TABLE", "AS", MatchAny) ||
+ TailMatches("REFERENCING", "OLD|NEW", "TABLE", "AS", MatchAny, "OLD|NEW", "TABLE", MatchAny) ||
+ TailMatches("REFERENCING", "OLD|NEW", "TABLE", MatchAny, "OLD|NEW", "TABLE", MatchAny)))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("FOR", "WHEN (", "EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("FOR", "WHEN (", "EXECUTE PROCEDURE");
+ }
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ TailMatches("FOR"))
+ COMPLETE_WITH("EACH", "ROW", "STATEMENT");
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ TailMatches("FOR", "EACH"))
+ COMPLETE_WITH("ROW", "STATEMENT");
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ (TailMatches("FOR", "EACH", "ROW|STATEMENT") ||
+ TailMatches("FOR", "ROW|STATEMENT")))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("WHEN (", "EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("WHEN (", "EXECUTE PROCEDURE");
+ }
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ TailMatches("WHEN", "(*)"))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("EXECUTE PROCEDURE");
+ }
+
+ /*
+ * Complete CREATE [ OR REPLACE ] TRIGGER ... EXECUTE with
+ * PROCEDURE|FUNCTION.
+ */
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ TailMatches("EXECUTE"))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("FUNCTION");
+ else
+ COMPLETE_WITH("PROCEDURE");
+ }
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ TailMatches("EXECUTE", "FUNCTION|PROCEDURE"))
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions);
+
+/* CREATE ROLE,USER,GROUP <name> */
+ else if (Matches("CREATE", "ROLE|GROUP|USER", MatchAny) &&
+ !TailMatches("USER", "MAPPING"))
+ COMPLETE_WITH("ADMIN", "BYPASSRLS", "CONNECTION LIMIT", "CREATEDB",
+ "CREATEROLE", "ENCRYPTED PASSWORD", "IN", "INHERIT",
+ "LOGIN", "NOBYPASSRLS",
+ "NOCREATEDB", "NOCREATEROLE", "NOINHERIT",
+ "NOLOGIN", "NOREPLICATION", "NOSUPERUSER", "PASSWORD",
+ "REPLICATION", "ROLE", "SUPERUSER", "SYSID",
+ "VALID UNTIL", "WITH");
+
+/* CREATE ROLE,USER,GROUP <name> WITH */
+ else if (Matches("CREATE", "ROLE|GROUP|USER", MatchAny, "WITH"))
+ /* Similar to the above, but don't complete "WITH" again. */
+ COMPLETE_WITH("ADMIN", "BYPASSRLS", "CONNECTION LIMIT", "CREATEDB",
+ "CREATEROLE", "ENCRYPTED PASSWORD", "IN", "INHERIT",
+ "LOGIN", "NOBYPASSRLS",
+ "NOCREATEDB", "NOCREATEROLE", "NOINHERIT",
+ "NOLOGIN", "NOREPLICATION", "NOSUPERUSER", "PASSWORD",
+ "REPLICATION", "ROLE", "SUPERUSER", "SYSID",
+ "VALID UNTIL");
+
+ /* complete CREATE ROLE,USER,GROUP <name> IN with ROLE,GROUP */
+ else if (Matches("CREATE", "ROLE|USER|GROUP", MatchAny, "IN"))
+ COMPLETE_WITH("GROUP", "ROLE");
+
+/* CREATE TYPE */
+ else if (Matches("CREATE", "TYPE", MatchAny))
+ COMPLETE_WITH("(", "AS");
+ else if (Matches("CREATE", "TYPE", MatchAny, "AS"))
+ COMPLETE_WITH("ENUM", "RANGE", "(");
+ else if (HeadMatches("CREATE", "TYPE", MatchAny, "AS", "("))
+ {
+ if (TailMatches("(|*,", MatchAny))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (TailMatches("(|*,", MatchAny, MatchAnyExcept("*)")))
+ COMPLETE_WITH("COLLATE", ",", ")");
+ }
+ else if (Matches("CREATE", "TYPE", MatchAny, "AS", "ENUM|RANGE"))
+ COMPLETE_WITH("(");
+ else if (HeadMatches("CREATE", "TYPE", MatchAny, "("))
+ {
+ if (TailMatches("(|*,"))
+ COMPLETE_WITH("INPUT", "OUTPUT", "RECEIVE", "SEND",
+ "TYPMOD_IN", "TYPMOD_OUT", "ANALYZE", "SUBSCRIPT",
+ "INTERNALLENGTH", "PASSEDBYVALUE", "ALIGNMENT",
+ "STORAGE", "LIKE", "CATEGORY", "PREFERRED",
+ "DEFAULT", "ELEMENT", "DELIMITER",
+ "COLLATABLE");
+ else if (TailMatches("(*|*,", MatchAnyExcept("*=")))
+ COMPLETE_WITH("=");
+ else if (TailMatches("=", MatchAnyExcept("*)")))
+ COMPLETE_WITH(",", ")");
+ }
+ else if (HeadMatches("CREATE", "TYPE", MatchAny, "AS", "RANGE", "("))
+ {
+ if (TailMatches("(|*,"))
+ COMPLETE_WITH("SUBTYPE", "SUBTYPE_OPCLASS", "COLLATION",
+ "CANONICAL", "SUBTYPE_DIFF",
+ "MULTIRANGE_TYPE_NAME");
+ else if (TailMatches("(*|*,", MatchAnyExcept("*=")))
+ COMPLETE_WITH("=");
+ else if (TailMatches("=", MatchAnyExcept("*)")))
+ COMPLETE_WITH(",", ")");
+ }
+
+/* CREATE VIEW --- is allowed inside CREATE SCHEMA, so use TailMatches */
+ /* Complete CREATE [ OR REPLACE ] VIEW <name> with AS */
+ else if (TailMatches("CREATE", "VIEW", MatchAny) ||
+ TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny))
+ COMPLETE_WITH("AS");
+ /* Complete "CREATE [ OR REPLACE ] VIEW <sth> AS with "SELECT" */
+ else if (TailMatches("CREATE", "VIEW", MatchAny, "AS") ||
+ TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny, "AS"))
+ COMPLETE_WITH("SELECT");
+
+/* CREATE MATERIALIZED VIEW */
+ else if (Matches("CREATE", "MATERIALIZED"))
+ COMPLETE_WITH("VIEW");
+ /* Complete CREATE MATERIALIZED VIEW <name> with AS */
+ else if (Matches("CREATE", "MATERIALIZED", "VIEW", MatchAny))
+ COMPLETE_WITH("AS");
+ /* Complete "CREATE MATERIALIZED VIEW <sth> AS with "SELECT" */
+ else if (Matches("CREATE", "MATERIALIZED", "VIEW", MatchAny, "AS"))
+ COMPLETE_WITH("SELECT");
+
+/* CREATE EVENT TRIGGER */
+ else if (Matches("CREATE", "EVENT"))
+ COMPLETE_WITH("TRIGGER");
+ /* Complete CREATE EVENT TRIGGER <name> with ON */
+ else if (Matches("CREATE", "EVENT", "TRIGGER", MatchAny))
+ COMPLETE_WITH("ON");
+ /* Complete CREATE EVENT TRIGGER <name> ON with event_type */
+ else if (Matches("CREATE", "EVENT", "TRIGGER", MatchAny, "ON"))
+ COMPLETE_WITH("ddl_command_start", "ddl_command_end", "sql_drop",
+ "table_rewrite");
+
+ /*
+ * Complete CREATE EVENT TRIGGER <name> ON <event_type>. EXECUTE FUNCTION
+ * is the recommended grammar instead of EXECUTE PROCEDURE in version 11
+ * and upwards.
+ */
+ else if (Matches("CREATE", "EVENT", "TRIGGER", MatchAny, "ON", MatchAny))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("WHEN TAG IN (", "EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("WHEN TAG IN (", "EXECUTE PROCEDURE");
+ }
+ else if (HeadMatches("CREATE", "EVENT", "TRIGGER") &&
+ TailMatches("WHEN|AND", MatchAny, "IN", "(*)"))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("EXECUTE PROCEDURE");
+ }
+ else if (HeadMatches("CREATE", "EVENT", "TRIGGER") &&
+ TailMatches("EXECUTE", "FUNCTION|PROCEDURE"))
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions);
+
+/* DEALLOCATE */
+ else if (Matches("DEALLOCATE"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_prepared_statements,
+ "ALL");
+
+/* DECLARE */
+
+ /*
+ * Complete DECLARE <name> with one of BINARY, ASENSITIVE, INSENSITIVE,
+ * SCROLL, NO SCROLL, and CURSOR.
+ */
+ else if (Matches("DECLARE", MatchAny))
+ COMPLETE_WITH("BINARY", "ASENSITIVE", "INSENSITIVE", "SCROLL", "NO SCROLL",
+ "CURSOR");
+
+ /*
+ * Complete DECLARE ... <option> with other options. The PostgreSQL parser
+ * allows DECLARE options to be specified in any order. But the
+ * tab-completion follows the ordering of them that the SQL standard
+ * provides, like the syntax of DECLARE command in the documentation
+ * indicates.
+ */
+ else if (HeadMatches("DECLARE") && TailMatches("BINARY"))
+ COMPLETE_WITH("ASENSITIVE", "INSENSITIVE", "SCROLL", "NO SCROLL", "CURSOR");
+ else if (HeadMatches("DECLARE") && TailMatches("ASENSITIVE|INSENSITIVE"))
+ COMPLETE_WITH("SCROLL", "NO SCROLL", "CURSOR");
+ else if (HeadMatches("DECLARE") && TailMatches("SCROLL"))
+ COMPLETE_WITH("CURSOR");
+ /* Complete DECLARE ... [options] NO with SCROLL */
+ else if (HeadMatches("DECLARE") && TailMatches("NO"))
+ COMPLETE_WITH("SCROLL");
+
+ /*
+ * Complete DECLARE ... CURSOR with one of WITH HOLD, WITHOUT HOLD, and
+ * FOR
+ */
+ else if (HeadMatches("DECLARE") && TailMatches("CURSOR"))
+ COMPLETE_WITH("WITH HOLD", "WITHOUT HOLD", "FOR");
+ /* Complete DECLARE ... CURSOR WITH|WITHOUT with HOLD */
+ else if (HeadMatches("DECLARE") && TailMatches("CURSOR", "WITH|WITHOUT"))
+ COMPLETE_WITH("HOLD");
+ /* Complete DECLARE ... CURSOR WITH|WITHOUT HOLD with FOR */
+ else if (HeadMatches("DECLARE") && TailMatches("CURSOR", "WITH|WITHOUT", "HOLD"))
+ COMPLETE_WITH("FOR");
+
+/* DELETE --- can be inside EXPLAIN, RULE, etc */
+ /* Complete DELETE with "FROM" */
+ else if (Matches("DELETE"))
+ COMPLETE_WITH("FROM");
+ /* Complete DELETE FROM with a list of tables */
+ else if (TailMatches("DELETE", "FROM"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables);
+ /* Complete DELETE FROM <table> */
+ else if (TailMatches("DELETE", "FROM", MatchAny))
+ COMPLETE_WITH("USING", "WHERE");
+ /* XXX: implement tab completion for DELETE ... USING */
+
+/* DISCARD */
+ else if (Matches("DISCARD"))
+ COMPLETE_WITH("ALL", "PLANS", "SEQUENCES", "TEMP");
+
+/* DO */
+ else if (Matches("DO"))
+ COMPLETE_WITH("LANGUAGE");
+
+/* DROP */
+ /* Complete DROP object with CASCADE / RESTRICT */
+ else if (Matches("DROP",
+ "COLLATION|CONVERSION|DOMAIN|EXTENSION|LANGUAGE|PUBLICATION|SCHEMA|SEQUENCE|SERVER|SUBSCRIPTION|STATISTICS|TABLE|TYPE|VIEW",
+ MatchAny) ||
+ Matches("DROP", "ACCESS", "METHOD", MatchAny) ||
+ (Matches("DROP", "AGGREGATE|FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny) &&
+ ends_with(prev_wd, ')')) ||
+ Matches("DROP", "EVENT", "TRIGGER", MatchAny) ||
+ Matches("DROP", "FOREIGN", "DATA", "WRAPPER", MatchAny) ||
+ Matches("DROP", "FOREIGN", "TABLE", MatchAny) ||
+ Matches("DROP", "TEXT", "SEARCH", "CONFIGURATION|DICTIONARY|PARSER|TEMPLATE", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+ /* help completing some of the variants */
+ else if (Matches("DROP", "AGGREGATE|FUNCTION|PROCEDURE|ROUTINE", MatchAny))
+ COMPLETE_WITH("(");
+ else if (Matches("DROP", "AGGREGATE|FUNCTION|PROCEDURE|ROUTINE", MatchAny, "("))
+ COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
+ else if (Matches("DROP", "FOREIGN"))
+ COMPLETE_WITH("DATA WRAPPER", "TABLE");
+ else if (Matches("DROP", "DATABASE", MatchAny))
+ COMPLETE_WITH("WITH (");
+ else if (HeadMatches("DROP", "DATABASE") && (ends_with(prev_wd, '(')))
+ COMPLETE_WITH("FORCE");
+
+ /* DROP INDEX */
+ else if (Matches("DROP", "INDEX"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
+ "CONCURRENTLY");
+ else if (Matches("DROP", "INDEX", "CONCURRENTLY"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes);
+ else if (Matches("DROP", "INDEX", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+ else if (Matches("DROP", "INDEX", "CONCURRENTLY", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+ /* DROP MATERIALIZED VIEW */
+ else if (Matches("DROP", "MATERIALIZED"))
+ COMPLETE_WITH("VIEW");
+ else if (Matches("DROP", "MATERIALIZED", "VIEW"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews);
+ else if (Matches("DROP", "MATERIALIZED", "VIEW", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+ /* DROP OWNED BY */
+ else if (Matches("DROP", "OWNED"))
+ COMPLETE_WITH("BY");
+ else if (Matches("DROP", "OWNED", "BY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+ else if (Matches("DROP", "OWNED", "BY", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+ /* DROP TEXT SEARCH */
+ else if (Matches("DROP", "TEXT", "SEARCH"))
+ COMPLETE_WITH("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE");
+
+ /* DROP TRIGGER */
+ else if (Matches("DROP", "TRIGGER", MatchAny))
+ COMPLETE_WITH("ON");
+ else if (Matches("DROP", "TRIGGER", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_trigger);
+ }
+ else if (Matches("DROP", "TRIGGER", MatchAny, "ON", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+ /* DROP ACCESS METHOD */
+ else if (Matches("DROP", "ACCESS"))
+ COMPLETE_WITH("METHOD");
+ else if (Matches("DROP", "ACCESS", "METHOD"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_access_methods);
+
+ /* DROP EVENT TRIGGER */
+ else if (Matches("DROP", "EVENT"))
+ COMPLETE_WITH("TRIGGER");
+ else if (Matches("DROP", "EVENT", "TRIGGER"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
+
+ /* DROP POLICY <name> */
+ else if (Matches("DROP", "POLICY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_policies);
+ /* DROP POLICY <name> ON */
+ else if (Matches("DROP", "POLICY", MatchAny))
+ COMPLETE_WITH("ON");
+ /* DROP POLICY <name> ON <table> */
+ else if (Matches("DROP", "POLICY", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_policy);
+ }
+ else if (Matches("DROP", "POLICY", MatchAny, "ON", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+ /* DROP RULE */
+ else if (Matches("DROP", "RULE", MatchAny))
+ COMPLETE_WITH("ON");
+ else if (Matches("DROP", "RULE", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_rule);
+ }
+ else if (Matches("DROP", "RULE", MatchAny, "ON", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+ /* DROP TRANSFORM */
+ else if (Matches("DROP", "TRANSFORM"))
+ COMPLETE_WITH("FOR");
+ else if (Matches("DROP", "TRANSFORM", "FOR"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (Matches("DROP", "TRANSFORM", "FOR", MatchAny))
+ COMPLETE_WITH("LANGUAGE");
+ else if (Matches("DROP", "TRANSFORM", "FOR", MatchAny, "LANGUAGE"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_QUERY(Query_for_list_of_languages);
+ }
+ else if (Matches("DROP", "TRANSFORM", "FOR", MatchAny, "LANGUAGE", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+/* EXECUTE */
+ else if (Matches("EXECUTE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_prepared_statements);
+
+/*
+ * EXPLAIN [ ( option [, ...] ) ] statement
+ * EXPLAIN [ ANALYZE ] [ VERBOSE ] statement
+ */
+ else if (Matches("EXPLAIN"))
+ COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE",
+ "MERGE INTO", "EXECUTE", "ANALYZE", "VERBOSE");
+ else if (HeadMatches("EXPLAIN", "(*") &&
+ !HeadMatches("EXPLAIN", "(*)"))
+ {
+ /*
+ * This fires if we're in an unfinished parenthesized option list.
+ * get_previous_words treats a completed parenthesized option list as
+ * one word, so the above test is correct.
+ */
+ if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
+ COMPLETE_WITH("ANALYZE", "VERBOSE", "COSTS", "SETTINGS",
+ "BUFFERS", "WAL", "TIMING", "SUMMARY", "FORMAT");
+ else if (TailMatches("ANALYZE|VERBOSE|COSTS|SETTINGS|BUFFERS|WAL|TIMING|SUMMARY"))
+ COMPLETE_WITH("ON", "OFF");
+ else if (TailMatches("FORMAT"))
+ COMPLETE_WITH("TEXT", "XML", "JSON", "YAML");
+ }
+ else if (Matches("EXPLAIN", "ANALYZE"))
+ COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE",
+ "MERGE INTO", "EXECUTE", "VERBOSE");
+ else if (Matches("EXPLAIN", "(*)") ||
+ Matches("EXPLAIN", "VERBOSE") ||
+ Matches("EXPLAIN", "ANALYZE", "VERBOSE"))
+ COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE",
+ "MERGE INTO", "EXECUTE");
+
+/* FETCH && MOVE */
+
+ /*
+ * Complete FETCH with one of ABSOLUTE, BACKWARD, FORWARD, RELATIVE, ALL,
+ * NEXT, PRIOR, FIRST, LAST, FROM, IN, and a list of cursors
+ */
+ else if (Matches("FETCH|MOVE"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors,
+ "ABSOLUTE",
+ "BACKWARD",
+ "FORWARD",
+ "RELATIVE",
+ "ALL",
+ "NEXT",
+ "PRIOR",
+ "FIRST",
+ "LAST",
+ "FROM",
+ "IN");
+
+ /*
+ * Complete FETCH BACKWARD or FORWARD with one of ALL, FROM, IN, and a
+ * list of cursors
+ */
+ else if (Matches("FETCH|MOVE", "BACKWARD|FORWARD"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors,
+ "ALL",
+ "FROM",
+ "IN");
+
+ /*
+ * Complete FETCH <direction> with "FROM" or "IN". These are equivalent,
+ * but we may as well tab-complete both: perhaps some users prefer one
+ * variant or the other.
+ */
+ else if (Matches("FETCH|MOVE", "ABSOLUTE|BACKWARD|FORWARD|RELATIVE",
+ MatchAnyExcept("FROM|IN")) ||
+ Matches("FETCH|MOVE", "ALL|NEXT|PRIOR|FIRST|LAST"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors,
+ "FROM",
+ "IN");
+ /* Complete FETCH <direction> "FROM" or "IN" with a list of cursors */
+ else if (HeadMatches("FETCH|MOVE") &&
+ TailMatches("FROM|IN"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_cursors);
+
+/* FOREIGN DATA WRAPPER */
+ /* applies in ALTER/DROP FDW and in CREATE SERVER */
+ else if (TailMatches("FOREIGN", "DATA", "WRAPPER") &&
+ !TailMatches("CREATE", MatchAny, MatchAny, MatchAny))
+ COMPLETE_WITH_QUERY(Query_for_list_of_fdws);
+ /* applies in CREATE SERVER */
+ else if (TailMatches("FOREIGN", "DATA", "WRAPPER", MatchAny) &&
+ HeadMatches("CREATE", "SERVER"))
+ COMPLETE_WITH("OPTIONS");
+
+/* FOREIGN TABLE */
+ else if (TailMatches("FOREIGN", "TABLE") &&
+ !TailMatches("CREATE", MatchAny, MatchAny))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables);
+
+/* FOREIGN SERVER */
+ else if (TailMatches("FOREIGN", "SERVER"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_servers);
+
+/*
+ * GRANT and REVOKE are allowed inside CREATE SCHEMA and
+ * ALTER DEFAULT PRIVILEGES, so use TailMatches
+ */
+ /* Complete GRANT/REVOKE with a list of roles and privileges */
+ else if (TailMatches("GRANT|REVOKE") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR"))
+ {
+ /*
+ * With ALTER DEFAULT PRIVILEGES, restrict completion to grantable
+ * privileges (can't grant roles)
+ */
+ if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES"))
+ COMPLETE_WITH("SELECT", "INSERT", "UPDATE",
+ "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER",
+ "EXECUTE", "USAGE", "ALL");
+ else
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ "GRANT",
+ "SELECT",
+ "INSERT",
+ "UPDATE",
+ "DELETE",
+ "TRUNCATE",
+ "REFERENCES",
+ "TRIGGER",
+ "CREATE",
+ "CONNECT",
+ "TEMPORARY",
+ "EXECUTE",
+ "USAGE",
+ "SET",
+ "ALTER SYSTEM",
+ "ALL");
+ }
+
+ else if (TailMatches("REVOKE", "GRANT"))
+ COMPLETE_WITH("OPTION FOR");
+ else if (TailMatches("REVOKE", "GRANT", "OPTION"))
+ COMPLETE_WITH("FOR");
+
+ else if (TailMatches("GRANT|REVOKE", "ALTER") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", "ALTER"))
+ COMPLETE_WITH("SYSTEM");
+
+ else if (TailMatches("GRANT|REVOKE", "SET") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", "SET") ||
+ TailMatches("GRANT|REVOKE", "ALTER", "SYSTEM") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", "ALTER", "SYSTEM"))
+ COMPLETE_WITH("ON PARAMETER");
+
+ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "PARAMETER") ||
+ TailMatches("GRANT|REVOKE", MatchAny, MatchAny, "ON", "PARAMETER") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "PARAMETER") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, MatchAny, "ON", "PARAMETER"))
+ COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_alter_system_set_vars);
+
+ else if (TailMatches("GRANT", MatchAny, "ON", "PARAMETER", MatchAny) ||
+ TailMatches("GRANT", MatchAny, MatchAny, "ON", "PARAMETER", MatchAny))
+ COMPLETE_WITH("TO");
+
+ else if (TailMatches("REVOKE", MatchAny, "ON", "PARAMETER", MatchAny) ||
+ TailMatches("REVOKE", MatchAny, MatchAny, "ON", "PARAMETER", MatchAny) ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "PARAMETER", MatchAny) ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, MatchAny, "ON", "PARAMETER", MatchAny))
+ COMPLETE_WITH("FROM");
+
+ /*
+ * Complete GRANT/REVOKE <privilege> with "ON", GRANT/REVOKE <role> with
+ * TO/FROM
+ */
+ else if (TailMatches("GRANT|REVOKE", MatchAny) ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny))
+ {
+ if (TailMatches("SELECT|INSERT|UPDATE|DELETE|TRUNCATE|REFERENCES|TRIGGER|CREATE|CONNECT|TEMPORARY|TEMP|EXECUTE|USAGE|ALL"))
+ COMPLETE_WITH("ON");
+ else if (TailMatches("GRANT", MatchAny))
+ COMPLETE_WITH("TO");
+ else
+ COMPLETE_WITH("FROM");
+ }
+
+ /*
+ * Complete GRANT/REVOKE <sth> ON with a list of appropriate relations.
+ *
+ * Note: GRANT/REVOKE can get quite complex; tab-completion as implemented
+ * here will only work if the privilege list contains exactly one
+ * privilege.
+ */
+ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON"))
+ {
+ /*
+ * With ALTER DEFAULT PRIVILEGES, restrict completion to the kinds of
+ * objects supported.
+ */
+ if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES"))
+ COMPLETE_WITH("TABLES", "SEQUENCES", "FUNCTIONS", "PROCEDURES", "ROUTINES", "TYPES", "SCHEMAS");
+ else
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_grantables,
+ "ALL FUNCTIONS IN SCHEMA",
+ "ALL PROCEDURES IN SCHEMA",
+ "ALL ROUTINES IN SCHEMA",
+ "ALL SEQUENCES IN SCHEMA",
+ "ALL TABLES IN SCHEMA",
+ "DATABASE",
+ "DOMAIN",
+ "FOREIGN DATA WRAPPER",
+ "FOREIGN SERVER",
+ "FUNCTION",
+ "LANGUAGE",
+ "LARGE OBJECT",
+ "PARAMETER",
+ "PROCEDURE",
+ "ROUTINE",
+ "SCHEMA",
+ "SEQUENCE",
+ "TABLE",
+ "TABLESPACE",
+ "TYPE");
+ }
+ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "ALL") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "ALL"))
+ COMPLETE_WITH("FUNCTIONS IN SCHEMA",
+ "PROCEDURES IN SCHEMA",
+ "ROUTINES IN SCHEMA",
+ "SEQUENCES IN SCHEMA",
+ "TABLES IN SCHEMA");
+ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "FOREIGN") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "FOREIGN"))
+ COMPLETE_WITH("DATA WRAPPER", "SERVER");
+
+ /*
+ * Complete "GRANT/REVOKE * ON DATABASE/DOMAIN/..." with a list of
+ * appropriate objects.
+ *
+ * Complete "GRANT/REVOKE * ON *" with "TO/FROM".
+ */
+ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", MatchAny) ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", MatchAny))
+ {
+ if (TailMatches("DATABASE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_databases);
+ else if (TailMatches("DOMAIN"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains);
+ else if (TailMatches("FUNCTION"))
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions);
+ else if (TailMatches("LANGUAGE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_languages);
+ else if (TailMatches("PROCEDURE"))
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_procedures);
+ else if (TailMatches("ROUTINE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines);
+ else if (TailMatches("SCHEMA"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
+ else if (TailMatches("SEQUENCE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences);
+ else if (TailMatches("TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_grantables);
+ else if (TailMatches("TABLESPACE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
+ else if (TailMatches("TYPE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (TailMatches("GRANT", MatchAny, MatchAny, MatchAny))
+ COMPLETE_WITH("TO");
+ else
+ COMPLETE_WITH("FROM");
+ }
+
+ /*
+ * Complete "GRANT/REVOKE ... TO/FROM" with username, PUBLIC,
+ * CURRENT_ROLE, CURRENT_USER, or SESSION_USER.
+ */
+ else if ((HeadMatches("GRANT") && TailMatches("TO")) ||
+ (HeadMatches("REVOKE") && TailMatches("FROM")))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ Keywords_for_list_of_grant_roles);
+
+ /*
+ * Offer grant options after that.
+ */
+ else if (HeadMatches("GRANT") && TailMatches("TO", MatchAny))
+ COMPLETE_WITH("WITH ADMIN OPTION",
+ "WITH GRANT OPTION",
+ "GRANTED BY");
+ else if (HeadMatches("GRANT") && TailMatches("TO", MatchAny, "WITH"))
+ COMPLETE_WITH("ADMIN OPTION",
+ "GRANT OPTION");
+ else if (HeadMatches("GRANT") && TailMatches("TO", MatchAny, "WITH", MatchAny, "OPTION"))
+ COMPLETE_WITH("GRANTED BY");
+ else if (HeadMatches("GRANT") && TailMatches("TO", MatchAny, "WITH", MatchAny, "OPTION", "GRANTED", "BY"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ Keywords_for_list_of_grant_roles);
+ /* Complete "ALTER DEFAULT PRIVILEGES ... GRANT/REVOKE ... TO/FROM */
+ else if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES") && TailMatches("TO|FROM"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ Keywords_for_list_of_grant_roles);
+ /* Complete "GRANT/REVOKE ... ON * *" with TO/FROM */
+ else if (HeadMatches("GRANT") && TailMatches("ON", MatchAny, MatchAny))
+ COMPLETE_WITH("TO");
+ else if (HeadMatches("REVOKE") && TailMatches("ON", MatchAny, MatchAny))
+ COMPLETE_WITH("FROM");
+
+ /* Complete "GRANT/REVOKE * ON ALL * IN SCHEMA *" with TO/FROM */
+ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "ALL", MatchAny, "IN", "SCHEMA", MatchAny) ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "ALL", MatchAny, "IN", "SCHEMA", MatchAny))
+ {
+ if (TailMatches("GRANT", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny, MatchAny, MatchAny))
+ COMPLETE_WITH("TO");
+ else
+ COMPLETE_WITH("FROM");
+ }
+
+ /* Complete "GRANT/REVOKE * ON FOREIGN DATA WRAPPER *" with TO/FROM */
+ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "FOREIGN", "DATA", "WRAPPER", MatchAny) ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "FOREIGN", "DATA", "WRAPPER", MatchAny))
+ {
+ if (TailMatches("GRANT", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny, MatchAny))
+ COMPLETE_WITH("TO");
+ else
+ COMPLETE_WITH("FROM");
+ }
+
+ /* Complete "GRANT/REVOKE * ON FOREIGN SERVER *" with TO/FROM */
+ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "FOREIGN", "SERVER", MatchAny) ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "FOREIGN", "SERVER", MatchAny))
+ {
+ if (TailMatches("GRANT", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny))
+ COMPLETE_WITH("TO");
+ else
+ COMPLETE_WITH("FROM");
+ }
+
+/* GROUP BY */
+ else if (TailMatches("FROM", MatchAny, "GROUP"))
+ COMPLETE_WITH("BY");
+
+/* IMPORT FOREIGN SCHEMA */
+ else if (Matches("IMPORT"))
+ COMPLETE_WITH("FOREIGN SCHEMA");
+ else if (Matches("IMPORT", "FOREIGN"))
+ COMPLETE_WITH("SCHEMA");
+ else if (Matches("IMPORT", "FOREIGN", "SCHEMA", MatchAny))
+ COMPLETE_WITH("EXCEPT (", "FROM SERVER", "LIMIT TO (");
+ else if (TailMatches("LIMIT", "TO", "(*)") ||
+ TailMatches("EXCEPT", "(*)"))
+ COMPLETE_WITH("FROM SERVER");
+ else if (TailMatches("FROM", "SERVER", MatchAny))
+ COMPLETE_WITH("INTO");
+ else if (TailMatches("FROM", "SERVER", MatchAny, "INTO"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
+ else if (TailMatches("FROM", "SERVER", MatchAny, "INTO", MatchAny))
+ COMPLETE_WITH("OPTIONS (");
+
+/* INSERT --- can be inside EXPLAIN, RULE, etc */
+ /* Complete NOT MATCHED THEN INSERT */
+ else if (TailMatches("NOT", "MATCHED", "THEN", "INSERT"))
+ COMPLETE_WITH("VALUES", "(");
+ /* Complete INSERT with "INTO" */
+ else if (TailMatches("INSERT"))
+ COMPLETE_WITH("INTO");
+ /* Complete INSERT INTO with table names */
+ else if (TailMatches("INSERT", "INTO"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables);
+ /* Complete "INSERT INTO <table> (" with attribute names */
+ else if (TailMatches("INSERT", "INTO", MatchAny, "("))
+ COMPLETE_WITH_ATTR(prev2_wd);
+
+ /*
+ * Complete INSERT INTO <table> with "(" or "VALUES" or "SELECT" or
+ * "TABLE" or "DEFAULT VALUES" or "OVERRIDING"
+ */
+ else if (TailMatches("INSERT", "INTO", MatchAny))
+ COMPLETE_WITH("(", "DEFAULT VALUES", "SELECT", "TABLE", "VALUES", "OVERRIDING");
+
+ /*
+ * Complete INSERT INTO <table> (attribs) with "VALUES" or "SELECT" or
+ * "TABLE" or "OVERRIDING"
+ */
+ else if (TailMatches("INSERT", "INTO", MatchAny, MatchAny) &&
+ ends_with(prev_wd, ')'))
+ COMPLETE_WITH("SELECT", "TABLE", "VALUES", "OVERRIDING");
+
+ /* Complete OVERRIDING */
+ else if (TailMatches("OVERRIDING"))
+ COMPLETE_WITH("SYSTEM VALUE", "USER VALUE");
+
+ /* Complete after OVERRIDING clause */
+ else if (TailMatches("OVERRIDING", MatchAny, "VALUE"))
+ COMPLETE_WITH("SELECT", "TABLE", "VALUES");
+
+ /* Insert an open parenthesis after "VALUES" */
+ else if (TailMatches("VALUES") && !TailMatches("DEFAULT", "VALUES"))
+ COMPLETE_WITH("(");
+
+/* LOCK */
+ /* Complete LOCK [TABLE] [ONLY] with a list of tables */
+ else if (Matches("LOCK"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables,
+ "TABLE", "ONLY");
+ else if (Matches("LOCK", "TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables,
+ "ONLY");
+ else if (Matches("LOCK", "TABLE", "ONLY") || Matches("LOCK", "ONLY"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+ /* For the following, handle the case of a single table only for now */
+
+ /* Complete LOCK [TABLE] [ONLY] <table> with IN or NOWAIT */
+ else if (Matches("LOCK", MatchAnyExcept("TABLE|ONLY")) ||
+ Matches("LOCK", "TABLE", MatchAnyExcept("ONLY")) ||
+ Matches("LOCK", "ONLY", MatchAny) ||
+ Matches("LOCK", "TABLE", "ONLY", MatchAny))
+ COMPLETE_WITH("IN", "NOWAIT");
+
+ /* Complete LOCK [TABLE] [ONLY] <table> IN with a lock mode */
+ else if (HeadMatches("LOCK") && TailMatches("IN"))
+ COMPLETE_WITH("ACCESS SHARE MODE",
+ "ROW SHARE MODE", "ROW EXCLUSIVE MODE",
+ "SHARE UPDATE EXCLUSIVE MODE", "SHARE MODE",
+ "SHARE ROW EXCLUSIVE MODE",
+ "EXCLUSIVE MODE", "ACCESS EXCLUSIVE MODE");
+
+ /*
+ * Complete LOCK [TABLE][ONLY] <table> IN ACCESS|ROW with rest of lock
+ * mode
+ */
+ else if (HeadMatches("LOCK") && TailMatches("IN", "ACCESS|ROW"))
+ COMPLETE_WITH("EXCLUSIVE MODE", "SHARE MODE");
+
+ /* Complete LOCK [TABLE] [ONLY] <table> IN SHARE with rest of lock mode */
+ else if (HeadMatches("LOCK") && TailMatches("IN", "SHARE"))
+ COMPLETE_WITH("MODE", "ROW EXCLUSIVE MODE",
+ "UPDATE EXCLUSIVE MODE");
+
+ /* Complete LOCK [TABLE] [ONLY] <table> [IN lockmode MODE] with "NOWAIT" */
+ else if (HeadMatches("LOCK") && TailMatches("MODE"))
+ COMPLETE_WITH("NOWAIT");
+
+/* MERGE --- can be inside EXPLAIN */
+ else if (TailMatches("MERGE"))
+ COMPLETE_WITH("INTO");
+ else if (TailMatches("MERGE", "INTO"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_mergetargets);
+
+ /* Complete MERGE INTO <table> [[AS] <alias>] with USING */
+ else if (TailMatches("MERGE", "INTO", MatchAny))
+ COMPLETE_WITH("USING", "AS");
+ else if (TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny) ||
+ TailMatches("MERGE", "INTO", MatchAny, MatchAnyExcept("USING|AS")))
+ COMPLETE_WITH("USING");
+
+ /*
+ * Complete MERGE INTO ... USING with a list of relations supporting
+ * SELECT
+ */
+ else if (TailMatches("MERGE", "INTO", MatchAny, "USING") ||
+ TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING") ||
+ TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
+
+ /*
+ * Complete MERGE INTO <table> [[AS] <alias>] USING <relations> [[AS]
+ * alias] with ON
+ */
+ else if (TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny) ||
+ TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING", MatchAny) ||
+ TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING", MatchAny))
+ COMPLETE_WITH("AS", "ON");
+ else if (TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny, "AS", MatchAny) ||
+ TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny) ||
+ TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING", MatchAny, "AS", MatchAny) ||
+ TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny, MatchAnyExcept("ON|AS")) ||
+ TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, MatchAnyExcept("ON|AS")) ||
+ TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAnyExcept("ON|AS")))
+ COMPLETE_WITH("ON");
+
+ /* Complete MERGE INTO ... ON with target table attributes */
+ else if (TailMatches("INTO", MatchAny, "USING", MatchAny, "ON"))
+ COMPLETE_WITH_ATTR(prev4_wd);
+ else if (TailMatches("INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny, "ON"))
+ COMPLETE_WITH_ATTR(prev8_wd);
+ else if (TailMatches("INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAny, "ON"))
+ COMPLETE_WITH_ATTR(prev6_wd);
+
+ /*
+ * Complete ... USING <relation> [[AS] alias] ON join condition
+ * (consisting of one or three words typically used) with WHEN [NOT]
+ * MATCHED
+ */
+ else if (TailMatches("USING", MatchAny, "ON", MatchAny) ||
+ TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny) ||
+ TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny) ||
+ TailMatches("USING", MatchAny, "ON", MatchAny, MatchAnyExcept("WHEN"), MatchAnyExcept("WHEN")) ||
+ TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny, MatchAnyExcept("WHEN"), MatchAnyExcept("WHEN")) ||
+ TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny, MatchAnyExcept("WHEN"), MatchAnyExcept("WHEN")))
+ COMPLETE_WITH("WHEN MATCHED", "WHEN NOT MATCHED");
+ else if (TailMatches("USING", MatchAny, "ON", MatchAny, "WHEN") ||
+ TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny, "WHEN") ||
+ TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny, "WHEN") ||
+ TailMatches("USING", MatchAny, "ON", MatchAny, MatchAny, MatchAny, "WHEN") ||
+ TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny, MatchAny, MatchAny, "WHEN") ||
+ TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny, MatchAny, MatchAny, "WHEN"))
+ COMPLETE_WITH("MATCHED", "NOT MATCHED");
+
+ /* Complete ... WHEN [NOT] MATCHED with THEN/AND */
+ else if (TailMatches("WHEN", "MATCHED") ||
+ TailMatches("WHEN", "NOT", "MATCHED"))
+ COMPLETE_WITH("THEN", "AND");
+
+ /* Complete ... WHEN MATCHED THEN with UPDATE SET/DELETE/DO NOTHING */
+ else if (TailMatches("WHEN", "MATCHED", "THEN"))
+ COMPLETE_WITH("UPDATE SET", "DELETE", "DO NOTHING");
+
+ /* Complete ... WHEN NOT MATCHED THEN with INSERT/DO NOTHING */
+ else if (TailMatches("WHEN", "NOT", "MATCHED", "THEN"))
+ COMPLETE_WITH("INSERT", "DO NOTHING");
+
+/* NOTIFY --- can be inside EXPLAIN, RULE, etc */
+ else if (TailMatches("NOTIFY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_channels);
+
+/* OPTIONS */
+ else if (TailMatches("OPTIONS"))
+ COMPLETE_WITH("(");
+
+/* OWNER TO - complete with available roles */
+ else if (TailMatches("OWNER", "TO"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+
+/* ORDER BY */
+ else if (TailMatches("FROM", MatchAny, "ORDER"))
+ COMPLETE_WITH("BY");
+ else if (TailMatches("FROM", MatchAny, "ORDER", "BY"))
+ COMPLETE_WITH_ATTR(prev3_wd);
+
+/* PREPARE xx AS */
+ else if (Matches("PREPARE", MatchAny, "AS"))
+ COMPLETE_WITH("SELECT", "UPDATE", "INSERT INTO", "DELETE FROM");
+
+/*
+ * PREPARE TRANSACTION is missing on purpose. It's intended for transaction
+ * managers, not for manual use in interactive sessions.
+ */
+
+/* REASSIGN OWNED BY xxx TO yyy */
+ else if (Matches("REASSIGN"))
+ COMPLETE_WITH("OWNED BY");
+ else if (Matches("REASSIGN", "OWNED"))
+ COMPLETE_WITH("BY");
+ else if (Matches("REASSIGN", "OWNED", "BY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+ else if (Matches("REASSIGN", "OWNED", "BY", MatchAny))
+ COMPLETE_WITH("TO");
+ else if (Matches("REASSIGN", "OWNED", "BY", MatchAny, "TO"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+
+/* REFRESH MATERIALIZED VIEW */
+ else if (Matches("REFRESH"))
+ COMPLETE_WITH("MATERIALIZED VIEW");
+ else if (Matches("REFRESH", "MATERIALIZED"))
+ COMPLETE_WITH("VIEW");
+ else if (Matches("REFRESH", "MATERIALIZED", "VIEW"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_matviews,
+ "CONCURRENTLY");
+ else if (Matches("REFRESH", "MATERIALIZED", "VIEW", "CONCURRENTLY"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews);
+ else if (Matches("REFRESH", "MATERIALIZED", "VIEW", MatchAny))
+ COMPLETE_WITH("WITH");
+ else if (Matches("REFRESH", "MATERIALIZED", "VIEW", "CONCURRENTLY", MatchAny))
+ COMPLETE_WITH("WITH");
+ else if (Matches("REFRESH", "MATERIALIZED", "VIEW", MatchAny, "WITH"))
+ COMPLETE_WITH("NO DATA", "DATA");
+ else if (Matches("REFRESH", "MATERIALIZED", "VIEW", "CONCURRENTLY", MatchAny, "WITH"))
+ COMPLETE_WITH("NO DATA", "DATA");
+ else if (Matches("REFRESH", "MATERIALIZED", "VIEW", MatchAny, "WITH", "NO"))
+ COMPLETE_WITH("DATA");
+ else if (Matches("REFRESH", "MATERIALIZED", "VIEW", "CONCURRENTLY", MatchAny, "WITH", "NO"))
+ COMPLETE_WITH("DATA");
+
+/* REINDEX */
+ else if (Matches("REINDEX") ||
+ Matches("REINDEX", "(*)"))
+ COMPLETE_WITH("TABLE", "INDEX", "SYSTEM", "SCHEMA", "DATABASE");
+ else if (Matches("REINDEX", "TABLE") ||
+ Matches("REINDEX", "(*)", "TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexables,
+ "CONCURRENTLY");
+ else if (Matches("REINDEX", "INDEX") ||
+ Matches("REINDEX", "(*)", "INDEX"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
+ "CONCURRENTLY");
+ else if (Matches("REINDEX", "SCHEMA") ||
+ Matches("REINDEX", "(*)", "SCHEMA"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas,
+ "CONCURRENTLY");
+ else if (Matches("REINDEX", "SYSTEM|DATABASE") ||
+ Matches("REINDEX", "(*)", "SYSTEM|DATABASE"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_databases,
+ "CONCURRENTLY");
+ else if (Matches("REINDEX", "TABLE", "CONCURRENTLY") ||
+ Matches("REINDEX", "(*)", "TABLE", "CONCURRENTLY"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexables);
+ else if (Matches("REINDEX", "INDEX", "CONCURRENTLY") ||
+ Matches("REINDEX", "(*)", "INDEX", "CONCURRENTLY"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes);
+ else if (Matches("REINDEX", "SCHEMA", "CONCURRENTLY") ||
+ Matches("REINDEX", "(*)", "SCHEMA", "CONCURRENTLY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
+ else if (Matches("REINDEX", "SYSTEM|DATABASE", "CONCURRENTLY") ||
+ Matches("REINDEX", "(*)", "SYSTEM|DATABASE", "CONCURRENTLY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_databases);
+ else if (HeadMatches("REINDEX", "(*") &&
+ !HeadMatches("REINDEX", "(*)"))
+ {
+ /*
+ * This fires if we're in an unfinished parenthesized option list.
+ * get_previous_words treats a completed parenthesized option list as
+ * one word, so the above test is correct.
+ */
+ if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
+ COMPLETE_WITH("CONCURRENTLY", "TABLESPACE", "VERBOSE");
+ else if (TailMatches("TABLESPACE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
+ }
+
+/* SECURITY LABEL */
+ else if (Matches("SECURITY"))
+ COMPLETE_WITH("LABEL");
+ else if (Matches("SECURITY", "LABEL"))
+ COMPLETE_WITH("ON", "FOR");
+ else if (Matches("SECURITY", "LABEL", "FOR", MatchAny))
+ COMPLETE_WITH("ON");
+ else if (Matches("SECURITY", "LABEL", "ON") ||
+ Matches("SECURITY", "LABEL", "FOR", MatchAny, "ON"))
+ COMPLETE_WITH("TABLE", "COLUMN", "AGGREGATE", "DATABASE", "DOMAIN",
+ "EVENT TRIGGER", "FOREIGN TABLE", "FUNCTION",
+ "LARGE OBJECT", "MATERIALIZED VIEW", "LANGUAGE",
+ "PUBLICATION", "PROCEDURE", "ROLE", "ROUTINE", "SCHEMA",
+ "SEQUENCE", "SUBSCRIPTION", "TABLESPACE", "TYPE", "VIEW");
+ else if (Matches("SECURITY", "LABEL", "ON", MatchAny, MatchAny))
+ COMPLETE_WITH("IS");
+
+/* SELECT */
+ /* naah . . . */
+
+/* SET, RESET, SHOW */
+ /* Complete with a variable name */
+ else if (TailMatches("SET|RESET") && !TailMatches("UPDATE", MatchAny, "SET"))
+ COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars,
+ "CONSTRAINTS",
+ "TRANSACTION",
+ "SESSION",
+ "ROLE",
+ "TABLESPACE",
+ "ALL");
+ else if (Matches("SHOW"))
+ COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_show_vars,
+ "SESSION AUTHORIZATION",
+ "ALL");
+ else if (Matches("SHOW", "SESSION"))
+ COMPLETE_WITH("AUTHORIZATION");
+ /* Complete "SET TRANSACTION" */
+ else if (Matches("SET", "TRANSACTION"))
+ COMPLETE_WITH("SNAPSHOT", "ISOLATION LEVEL", "READ", "DEFERRABLE", "NOT DEFERRABLE");
+ else if (Matches("BEGIN|START", "TRANSACTION") ||
+ Matches("BEGIN", "WORK") ||
+ Matches("BEGIN") ||
+ Matches("SET", "SESSION", "CHARACTERISTICS", "AS", "TRANSACTION"))
+ COMPLETE_WITH("ISOLATION LEVEL", "READ", "DEFERRABLE", "NOT DEFERRABLE");
+ else if (Matches("SET|BEGIN|START", "TRANSACTION|WORK", "NOT") ||
+ Matches("BEGIN", "NOT") ||
+ Matches("SET", "SESSION", "CHARACTERISTICS", "AS", "TRANSACTION", "NOT"))
+ COMPLETE_WITH("DEFERRABLE");
+ else if (Matches("SET|BEGIN|START", "TRANSACTION|WORK", "ISOLATION") ||
+ Matches("BEGIN", "ISOLATION") ||
+ Matches("SET", "SESSION", "CHARACTERISTICS", "AS", "TRANSACTION", "ISOLATION"))
+ COMPLETE_WITH("LEVEL");
+ else if (Matches("SET|BEGIN|START", "TRANSACTION|WORK", "ISOLATION", "LEVEL") ||
+ Matches("BEGIN", "ISOLATION", "LEVEL") ||
+ Matches("SET", "SESSION", "CHARACTERISTICS", "AS", "TRANSACTION", "ISOLATION", "LEVEL"))
+ COMPLETE_WITH("READ", "REPEATABLE READ", "SERIALIZABLE");
+ else if (Matches("SET|BEGIN|START", "TRANSACTION|WORK", "ISOLATION", "LEVEL", "READ") ||
+ Matches("BEGIN", "ISOLATION", "LEVEL", "READ") ||
+ Matches("SET", "SESSION", "CHARACTERISTICS", "AS", "TRANSACTION", "ISOLATION", "LEVEL", "READ"))
+ COMPLETE_WITH("UNCOMMITTED", "COMMITTED");
+ else if (Matches("SET|BEGIN|START", "TRANSACTION|WORK", "ISOLATION", "LEVEL", "REPEATABLE") ||
+ Matches("BEGIN", "ISOLATION", "LEVEL", "REPEATABLE") ||
+ Matches("SET", "SESSION", "CHARACTERISTICS", "AS", "TRANSACTION", "ISOLATION", "LEVEL", "REPEATABLE"))
+ COMPLETE_WITH("READ");
+ else if (Matches("SET|BEGIN|START", "TRANSACTION|WORK", "READ") ||
+ Matches("BEGIN", "READ") ||
+ Matches("SET", "SESSION", "CHARACTERISTICS", "AS", "TRANSACTION", "READ"))
+ COMPLETE_WITH("ONLY", "WRITE");
+ /* SET CONSTRAINTS */
+ else if (Matches("SET", "CONSTRAINTS"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_constraints_with_schema,
+ "ALL");
+ /* Complete SET CONSTRAINTS <foo> with DEFERRED|IMMEDIATE */
+ else if (Matches("SET", "CONSTRAINTS", MatchAny))
+ COMPLETE_WITH("DEFERRED", "IMMEDIATE");
+ /* Complete SET ROLE */
+ else if (Matches("SET", "ROLE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+ /* Complete SET SESSION with AUTHORIZATION or CHARACTERISTICS... */
+ else if (Matches("SET", "SESSION"))
+ COMPLETE_WITH("AUTHORIZATION", "CHARACTERISTICS AS TRANSACTION");
+ /* Complete SET SESSION AUTHORIZATION with username */
+ else if (Matches("SET", "SESSION", "AUTHORIZATION"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ "DEFAULT");
+ /* Complete RESET SESSION with AUTHORIZATION */
+ else if (Matches("RESET", "SESSION"))
+ COMPLETE_WITH("AUTHORIZATION");
+ /* Complete SET <var> with "TO" */
+ else if (Matches("SET", MatchAny))
+ COMPLETE_WITH("TO");
+
+ /*
+ * Complete ALTER DATABASE|FUNCTION|PROCEDURE|ROLE|ROUTINE|USER ... SET
+ * <name>
+ */
+ else if (HeadMatches("ALTER", "DATABASE|FUNCTION|PROCEDURE|ROLE|ROUTINE|USER") &&
+ TailMatches("SET", MatchAny) &&
+ !TailMatches("SCHEMA"))
+ COMPLETE_WITH("FROM CURRENT", "TO");
+
+ /*
+ * Suggest possible variable values in SET variable TO|=, along with the
+ * preceding ALTER syntaxes.
+ */
+ else if (TailMatches("SET", MatchAny, "TO|=") &&
+ !TailMatches("UPDATE", MatchAny, "SET", MatchAny, "TO|="))
+ {
+ /* special cased code for individual GUCs */
+ if (TailMatches("DateStyle", "TO|="))
+ COMPLETE_WITH("ISO", "SQL", "Postgres", "German",
+ "YMD", "DMY", "MDY",
+ "US", "European", "NonEuropean",
+ "DEFAULT");
+ else if (TailMatches("search_path", "TO|="))
+ {
+ /* Here, we want to allow pg_catalog, so use narrower exclusion */
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas
+ " AND nspname NOT LIKE E'pg\\\\_toast%%'"
+ " AND nspname NOT LIKE E'pg\\\\_temp%%'",
+ "DEFAULT");
+ }
+ else if (TailMatches("TimeZone", "TO|="))
+ COMPLETE_WITH_TIMEZONE_NAME();
+ else
+ {
+ /* generic, type based, GUC support */
+ char *guctype = get_guctype(prev2_wd);
+
+ /*
+ * Note: if we don't recognize the GUC name, it's important to not
+ * offer any completions, as most likely we've misinterpreted the
+ * context and this isn't a GUC-setting command at all.
+ */
+ if (guctype)
+ {
+ if (strcmp(guctype, "enum") == 0)
+ {
+ set_completion_reference_verbatim(prev2_wd);
+ COMPLETE_WITH_QUERY_PLUS(Query_for_values_of_enum_GUC,
+ "DEFAULT");
+ }
+ else if (strcmp(guctype, "bool") == 0)
+ COMPLETE_WITH("on", "off", "true", "false", "yes", "no",
+ "1", "0", "DEFAULT");
+ else
+ COMPLETE_WITH("DEFAULT");
+
+ free(guctype);
+ }
+ }
+ }
+
+/* START TRANSACTION */
+ else if (Matches("START"))
+ COMPLETE_WITH("TRANSACTION");
+
+/* TABLE, but not TABLE embedded in other commands */
+ else if (Matches("TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
+
+/* TABLESAMPLE */
+ else if (TailMatches("TABLESAMPLE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_tablesample_methods);
+ else if (TailMatches("TABLESAMPLE", MatchAny))
+ COMPLETE_WITH("(");
+
+/* TRUNCATE */
+ else if (Matches("TRUNCATE"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_truncatables,
+ "TABLE", "ONLY");
+ else if (Matches("TRUNCATE", "TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_truncatables,
+ "ONLY");
+ else if (HeadMatches("TRUNCATE") && TailMatches("ONLY"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_truncatables);
+ else if (Matches("TRUNCATE", MatchAny) ||
+ Matches("TRUNCATE", "TABLE|ONLY", MatchAny) ||
+ Matches("TRUNCATE", "TABLE", "ONLY", MatchAny))
+ COMPLETE_WITH("RESTART IDENTITY", "CONTINUE IDENTITY", "CASCADE", "RESTRICT");
+ else if (HeadMatches("TRUNCATE") && TailMatches("IDENTITY"))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+/* UNLISTEN */
+ else if (Matches("UNLISTEN"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_channels, "*");
+
+/* UPDATE --- can be inside EXPLAIN, RULE, etc */
+ /* If prev. word is UPDATE suggest a list of tables */
+ else if (TailMatches("UPDATE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables);
+ /* Complete UPDATE <table> with "SET" */
+ else if (TailMatches("UPDATE", MatchAny))
+ COMPLETE_WITH("SET");
+ /* Complete UPDATE <table> SET with list of attributes */
+ else if (TailMatches("UPDATE", MatchAny, "SET"))
+ COMPLETE_WITH_ATTR(prev2_wd);
+ /* UPDATE <table> SET <attr> = */
+ else if (TailMatches("UPDATE", MatchAny, "SET", MatchAnyExcept("*=")))
+ COMPLETE_WITH("=");
+
+/* USER MAPPING */
+ else if (Matches("ALTER|CREATE|DROP", "USER", "MAPPING"))
+ COMPLETE_WITH("FOR");
+ else if (Matches("CREATE", "USER", "MAPPING", "FOR"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ "CURRENT_ROLE",
+ "CURRENT_USER",
+ "PUBLIC",
+ "USER");
+ else if (Matches("ALTER|DROP", "USER", "MAPPING", "FOR"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_user_mappings);
+ else if (Matches("CREATE|ALTER|DROP", "USER", "MAPPING", "FOR", MatchAny))
+ COMPLETE_WITH("SERVER");
+ else if (Matches("CREATE|ALTER", "USER", "MAPPING", "FOR", MatchAny, "SERVER", MatchAny))
+ COMPLETE_WITH("OPTIONS");
+
+/*
+ * VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
+ * VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]
+ */
+ else if (Matches("VACUUM"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
+ "FULL",
+ "FREEZE",
+ "ANALYZE",
+ "VERBOSE");
+ else if (Matches("VACUUM", "FULL"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
+ "FREEZE",
+ "ANALYZE",
+ "VERBOSE");
+ else if (Matches("VACUUM", "FREEZE") ||
+ Matches("VACUUM", "FULL", "FREEZE"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
+ "VERBOSE",
+ "ANALYZE");
+ else if (Matches("VACUUM", "VERBOSE") ||
+ Matches("VACUUM", "FULL|FREEZE", "VERBOSE") ||
+ Matches("VACUUM", "FULL", "FREEZE", "VERBOSE"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
+ "ANALYZE");
+ else if (HeadMatches("VACUUM", "(*") &&
+ !HeadMatches("VACUUM", "(*)"))
+ {
+ /*
+ * This fires if we're in an unfinished parenthesized option list.
+ * get_previous_words treats a completed parenthesized option list as
+ * one word, so the above test is correct.
+ */
+ if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
+ COMPLETE_WITH("FULL", "FREEZE", "ANALYZE", "VERBOSE",
+ "DISABLE_PAGE_SKIPPING", "SKIP_LOCKED",
+ "INDEX_CLEANUP", "PROCESS_TOAST",
+ "TRUNCATE", "PARALLEL");
+ else if (TailMatches("FULL|FREEZE|ANALYZE|VERBOSE|DISABLE_PAGE_SKIPPING|SKIP_LOCKED|PROCESS_TOAST|TRUNCATE"))
+ COMPLETE_WITH("ON", "OFF");
+ else if (TailMatches("INDEX_CLEANUP"))
+ COMPLETE_WITH("AUTO", "ON", "OFF");
+ }
+ else if (HeadMatches("VACUUM") && TailMatches("("))
+ /* "VACUUM (" should be caught above, so assume we want columns */
+ COMPLETE_WITH_ATTR(prev2_wd);
+ else if (HeadMatches("VACUUM"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_vacuumables);
+
+/* WITH [RECURSIVE] */
+
+ /*
+ * Only match when WITH is the first word, as WITH may appear in many
+ * other contexts.
+ */
+ else if (Matches("WITH"))
+ COMPLETE_WITH("RECURSIVE");
+
+/* WHERE */
+ /* Simple case of the word before the where being the table name */
+ else if (TailMatches(MatchAny, "WHERE"))
+ COMPLETE_WITH_ATTR(prev2_wd);
+
+/* ... FROM ... */
+/* TODO: also include SRF ? */
+ else if (TailMatches("FROM") && !Matches("COPY|\\copy", MatchAny, "FROM"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
+
+/* ... JOIN ... */
+ else if (TailMatches("JOIN"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
+
+/* Backslash commands */
+/* TODO: \dc \dd \dl */
+ else if (TailMatchesCS("\\?"))
+ COMPLETE_WITH_CS("commands", "options", "variables");
+ else if (TailMatchesCS("\\connect|\\c"))
+ {
+ if (!recognized_connection_string(text))
+ COMPLETE_WITH_QUERY(Query_for_list_of_databases);
+ }
+ else if (TailMatchesCS("\\connect|\\c", MatchAny))
+ {
+ if (!recognized_connection_string(prev_wd))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+ }
+ else if (TailMatchesCS("\\da*"))
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_aggregates);
+ else if (TailMatchesCS("\\dAc*", MatchAny) ||
+ TailMatchesCS("\\dAf*", MatchAny))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (TailMatchesCS("\\dAo*", MatchAny) ||
+ TailMatchesCS("\\dAp*", MatchAny))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_operator_families);
+ else if (TailMatchesCS("\\dA*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_access_methods);
+ else if (TailMatchesCS("\\db*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
+ else if (TailMatchesCS("\\dconfig*"))
+ COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_show_vars);
+ else if (TailMatchesCS("\\dD*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains);
+ else if (TailMatchesCS("\\des*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_servers);
+ else if (TailMatchesCS("\\deu*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_user_mappings);
+ else if (TailMatchesCS("\\dew*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_fdws);
+ else if (TailMatchesCS("\\df*"))
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions);
+ else if (HeadMatchesCS("\\df*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+
+ else if (TailMatchesCS("\\dFd*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_dictionaries);
+ else if (TailMatchesCS("\\dFp*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_parsers);
+ else if (TailMatchesCS("\\dFt*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_templates);
+ /* must be at end of \dF alternatives: */
+ else if (TailMatchesCS("\\dF*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_configurations);
+
+ else if (TailMatchesCS("\\di*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes);
+ else if (TailMatchesCS("\\dL*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_languages);
+ else if (TailMatchesCS("\\dn*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
+ /* no support for completing operators, but we can complete types: */
+ else if (HeadMatchesCS("\\do*", MatchAny))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (TailMatchesCS("\\dp") || TailMatchesCS("\\z"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_grantables);
+ else if (TailMatchesCS("\\dPi*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_indexes);
+ else if (TailMatchesCS("\\dPt*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_tables);
+ else if (TailMatchesCS("\\dP*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_relations);
+ else if (TailMatchesCS("\\ds*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences);
+ else if (TailMatchesCS("\\dt*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+ else if (TailMatchesCS("\\dT*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (TailMatchesCS("\\du*") || TailMatchesCS("\\dg*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+ else if (TailMatchesCS("\\dv*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views);
+ else if (TailMatchesCS("\\dx*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_extensions);
+ else if (TailMatchesCS("\\dX*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_statistics);
+ else if (TailMatchesCS("\\dm*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews);
+ else if (TailMatchesCS("\\dE*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables);
+ else if (TailMatchesCS("\\dy*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
+
+ /* must be at end of \d alternatives: */
+ else if (TailMatchesCS("\\d*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_relations);
+
+ else if (TailMatchesCS("\\ef"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines);
+ else if (TailMatchesCS("\\ev"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views);
+
+ else if (TailMatchesCS("\\encoding"))
+ COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_encodings);
+ else if (TailMatchesCS("\\h|\\help"))
+ COMPLETE_WITH_LIST(sql_commands);
+ else if (TailMatchesCS("\\h|\\help", MatchAny))
+ {
+ if (TailMatches("DROP"))
+ matches = rl_completion_matches(text, drop_command_generator);
+ else if (TailMatches("ALTER"))
+ matches = rl_completion_matches(text, alter_command_generator);
+
+ /*
+ * CREATE is recognized by tail match elsewhere, so doesn't need to be
+ * repeated here
+ */
+ }
+ else if (TailMatchesCS("\\h|\\help", MatchAny, MatchAny))
+ {
+ if (TailMatches("CREATE|DROP", "ACCESS"))
+ COMPLETE_WITH("METHOD");
+ else if (TailMatches("ALTER", "DEFAULT"))
+ COMPLETE_WITH("PRIVILEGES");
+ else if (TailMatches("CREATE|ALTER|DROP", "EVENT"))
+ COMPLETE_WITH("TRIGGER");
+ else if (TailMatches("CREATE|ALTER|DROP", "FOREIGN"))
+ COMPLETE_WITH("DATA WRAPPER", "TABLE");
+ else if (TailMatches("ALTER", "LARGE"))
+ COMPLETE_WITH("OBJECT");
+ else if (TailMatches("CREATE|ALTER|DROP", "MATERIALIZED"))
+ COMPLETE_WITH("VIEW");
+ else if (TailMatches("CREATE|ALTER|DROP", "TEXT"))
+ COMPLETE_WITH("SEARCH");
+ else if (TailMatches("CREATE|ALTER|DROP", "USER"))
+ COMPLETE_WITH("MAPPING FOR");
+ }
+ else if (TailMatchesCS("\\h|\\help", MatchAny, MatchAny, MatchAny))
+ {
+ if (TailMatches("CREATE|ALTER|DROP", "FOREIGN", "DATA"))
+ COMPLETE_WITH("WRAPPER");
+ else if (TailMatches("CREATE|ALTER|DROP", "TEXT", "SEARCH"))
+ COMPLETE_WITH("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE");
+ else if (TailMatches("CREATE|ALTER|DROP", "USER", "MAPPING"))
+ COMPLETE_WITH("FOR");
+ }
+ else if (TailMatchesCS("\\l*") && !TailMatchesCS("\\lo*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_databases);
+ else if (TailMatchesCS("\\password"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+ else if (TailMatchesCS("\\pset"))
+ COMPLETE_WITH_CS("border", "columns", "csv_fieldsep", "expanded",
+ "fieldsep", "fieldsep_zero", "footer", "format",
+ "linestyle", "null", "numericlocale",
+ "pager", "pager_min_lines",
+ "recordsep", "recordsep_zero",
+ "tableattr", "title", "tuples_only",
+ "unicode_border_linestyle",
+ "unicode_column_linestyle",
+ "unicode_header_linestyle");
+ else if (TailMatchesCS("\\pset", MatchAny))
+ {
+ if (TailMatchesCS("format"))
+ COMPLETE_WITH_CS("aligned", "asciidoc", "csv", "html", "latex",
+ "latex-longtable", "troff-ms", "unaligned",
+ "wrapped");
+ else if (TailMatchesCS("linestyle"))
+ COMPLETE_WITH_CS("ascii", "old-ascii", "unicode");
+ else if (TailMatchesCS("pager"))
+ COMPLETE_WITH_CS("on", "off", "always");
+ else if (TailMatchesCS("unicode_border_linestyle|"
+ "unicode_column_linestyle|"
+ "unicode_header_linestyle"))
+ COMPLETE_WITH_CS("single", "double");
+ }
+ else if (TailMatchesCS("\\unset"))
+ matches = complete_from_variables(text, "", "", true);
+ else if (TailMatchesCS("\\set"))
+ matches = complete_from_variables(text, "", "", false);
+ else if (TailMatchesCS("\\set", MatchAny))
+ {
+ if (TailMatchesCS("AUTOCOMMIT|ON_ERROR_STOP|QUIET|SHOW_ALL_RESULTS|"
+ "SINGLELINE|SINGLESTEP"))
+ COMPLETE_WITH_CS("on", "off");
+ else if (TailMatchesCS("COMP_KEYWORD_CASE"))
+ COMPLETE_WITH_CS("lower", "upper",
+ "preserve-lower", "preserve-upper");
+ else if (TailMatchesCS("ECHO"))
+ COMPLETE_WITH_CS("errors", "queries", "all", "none");
+ else if (TailMatchesCS("ECHO_HIDDEN"))
+ COMPLETE_WITH_CS("noexec", "off", "on");
+ else if (TailMatchesCS("HISTCONTROL"))
+ COMPLETE_WITH_CS("ignorespace", "ignoredups",
+ "ignoreboth", "none");
+ else if (TailMatchesCS("ON_ERROR_ROLLBACK"))
+ COMPLETE_WITH_CS("on", "off", "interactive");
+ else if (TailMatchesCS("SHOW_CONTEXT"))
+ COMPLETE_WITH_CS("never", "errors", "always");
+ else if (TailMatchesCS("VERBOSITY"))
+ COMPLETE_WITH_CS("default", "verbose", "terse", "sqlstate");
+ }
+ else if (TailMatchesCS("\\sf*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines);
+ else if (TailMatchesCS("\\sv*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views);
+ else if (TailMatchesCS("\\cd|\\e|\\edit|\\g|\\gx|\\i|\\include|"
+ "\\ir|\\include_relative|\\o|\\out|"
+ "\\s|\\w|\\write|\\lo_import"))
+ {
+ completion_charp = "\\";
+ completion_force_quote = false;
+ matches = rl_completion_matches(text, complete_from_files);
+ }
+
+ /*
+ * Finally, we look through the list of "things", such as TABLE, INDEX and
+ * check if that was the previous word. If so, execute the query to get a
+ * list of them.
+ */
+ else
+ {
+ const pgsql_thing_t *wac;
+
+ for (wac = words_after_create; wac->name != NULL; wac++)
+ {
+ if (pg_strcasecmp(prev_wd, wac->name) == 0)
+ {
+ if (wac->query)
+ COMPLETE_WITH_QUERY_LIST(wac->query,
+ wac->keywords);
+ else if (wac->vquery)
+ COMPLETE_WITH_VERSIONED_QUERY_LIST(wac->vquery,
+ wac->keywords);
+ else if (wac->squery)
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(wac->squery,
+ wac->keywords);
+ break;
+ }
+ }
+ }
+
+ /*
+ * If we still don't have anything to match we have to fabricate some sort
+ * of default list. If we were to just return NULL, readline automatically
+ * attempts filename completion, and that's usually no good.
+ */
+ if (matches == NULL)
+ {
+ COMPLETE_WITH_CONST(true, "");
+ /* Also, prevent Readline from appending stuff to the non-match */
+ rl_completion_append_character = '\0';
+#ifdef HAVE_RL_COMPLETION_SUPPRESS_QUOTE
+ rl_completion_suppress_quote = 1;
+#endif
+ }
+
+ /* free storage */
+ free(previous_words);
+ free(words_buffer);
+ free(text_copy);
+ if (completion_ref_object)
+ free(completion_ref_object);
+ completion_ref_object = NULL;
+ if (completion_ref_schema)
+ free(completion_ref_schema);
+ completion_ref_schema = NULL;
+
+ /* Return our Grand List O' Matches */
+ return matches;
+}
+
+
+/*
+ * GENERATOR FUNCTIONS
+ *
+ * These functions do all the actual work of completing the input. They get
+ * passed the text so far and the count how many times they have been called
+ * so far with the same text.
+ * If you read the above carefully, you'll see that these don't get called
+ * directly but through the readline interface.
+ * The return value is expected to be the full completion of the text, going
+ * through a list each time, or NULL if there are no more matches. The string
+ * will be free()'d by readline, so you must run it through strdup() or
+ * something of that sort.
+ */
+
+/*
+ * Common routine for create_command_generator and drop_command_generator.
+ * Entries that have 'excluded' flags are not returned.
+ */
+static char *
+create_or_drop_command_generator(const char *text, int state, bits32 excluded)
+{
+ static int list_index,
+ string_length;
+ const char *name;
+
+ /* If this is the first time for this completion, init some values */
+ if (state == 0)
+ {
+ list_index = 0;
+ string_length = strlen(text);
+ }
+
+ /* find something that matches */
+ while ((name = words_after_create[list_index++].name))
+ {
+ if ((pg_strncasecmp(name, text, string_length) == 0) &&
+ !(words_after_create[list_index - 1].flags & excluded))
+ return pg_strdup_keyword_case(name, text);
+ }
+ /* if nothing matches, return NULL */
+ return NULL;
+}
+
+/*
+ * This one gives you one from a list of things you can put after CREATE
+ * as defined above.
+ */
+static char *
+create_command_generator(const char *text, int state)
+{
+ return create_or_drop_command_generator(text, state, THING_NO_CREATE);
+}
+
+/*
+ * This function gives you a list of things you can put after a DROP command.
+ */
+static char *
+drop_command_generator(const char *text, int state)
+{
+ return create_or_drop_command_generator(text, state, THING_NO_DROP);
+}
+
+/*
+ * This function gives you a list of things you can put after an ALTER command.
+ */
+static char *
+alter_command_generator(const char *text, int state)
+{
+ return create_or_drop_command_generator(text, state, THING_NO_ALTER);
+}
+
+/*
+ * These functions generate lists using server queries.
+ * They are all wrappers for _complete_from_query.
+ */
+
+static char *
+complete_from_query(const char *text, int state)
+{
+ /* query is assumed to work for any server version */
+ return _complete_from_query(completion_charp, NULL, completion_charpp,
+ completion_verbatim, text, state);
+}
+
+static char *
+complete_from_versioned_query(const char *text, int state)
+{
+ const VersionedQuery *vquery = completion_vquery;
+
+ /* Find appropriate array element */
+ while (pset.sversion < vquery->min_server_version)
+ vquery++;
+ /* Fail completion if server is too old */
+ if (vquery->query == NULL)
+ return NULL;
+
+ return _complete_from_query(vquery->query, NULL, completion_charpp,
+ completion_verbatim, text, state);
+}
+
+static char *
+complete_from_schema_query(const char *text, int state)
+{
+ /* query is assumed to work for any server version */
+ return _complete_from_query(NULL, completion_squery, completion_charpp,
+ completion_verbatim, text, state);
+}
+
+static char *
+complete_from_versioned_schema_query(const char *text, int state)
+{
+ const SchemaQuery *squery = completion_squery;
+
+ /* Find appropriate array element */
+ while (pset.sversion < squery->min_server_version)
+ squery++;
+ /* Fail completion if server is too old */
+ if (squery->catname == NULL)
+ return NULL;
+
+ return _complete_from_query(NULL, squery, completion_charpp,
+ completion_verbatim, text, state);
+}
+
+
+/*
+ * This creates a list of matching things, according to a query described by
+ * the initial arguments. The caller has already done any work needed to
+ * select the appropriate query for the server's version.
+ *
+ * The query can be one of two kinds:
+ *
+ * 1. A simple query, which must contain a restriction clause of the form
+ * output LIKE '%s'
+ * where "output" is the same string that the query returns. The %s
+ * will be replaced by a LIKE pattern to match the already-typed text.
+ * There can be a second '%s', which will be replaced by a suitably-escaped
+ * version of the string provided in completion_ref_object. If there is a
+ * third '%s', it will be replaced by a suitably-escaped version of the string
+ * provided in completion_ref_schema. Those strings should be set up
+ * by calling set_completion_reference or set_completion_reference_verbatim.
+ * Simple queries should return a single column of matches. If "verbatim"
+ * is true, the matches are returned as-is; otherwise, they are taken to
+ * be SQL identifiers and quoted if necessary.
+ *
+ * 2. A schema query used for completion of both schema and relation names.
+ * This is represented by a SchemaQuery object; see that typedef for details.
+ *
+ * See top of file for examples of both kinds of query.
+ *
+ * In addition to the query itself, we accept a null-terminated array of
+ * literal keywords, which will be returned if they match the input-so-far
+ * (case insensitively). (These are in addition to keywords specified
+ * within the schema_query, if any.)
+ *
+ * If "verbatim" is true, then we use the given text as-is to match the
+ * query results; otherwise we parse it as a possibly-qualified identifier,
+ * and reconstruct suitable quoting afterward.
+ *
+ * "text" and "state" are supplied by Readline. "text" is the word we are
+ * trying to complete. "state" is zero on first call, nonzero later.
+ *
+ * readline will call this repeatedly with the same text and varying
+ * state. On each call, we are supposed to return a malloc'd string
+ * that is a candidate completion. Return NULL when done.
+ */
+static char *
+_complete_from_query(const char *simple_query,
+ const SchemaQuery *schema_query,
+ const char *const *keywords,
+ bool verbatim,
+ const char *text, int state)
+{
+ static int list_index,
+ num_schema_only,
+ num_query_other,
+ num_keywords;
+ static PGresult *result = NULL;
+ static bool non_empty_object;
+ static bool schemaquoted;
+ static bool objectquoted;
+
+ /*
+ * If this is the first time for this completion, we fetch a list of our
+ * "things" from the backend.
+ */
+ if (state == 0)
+ {
+ PQExpBufferData query_buffer;
+ char *schemaname;
+ char *objectname;
+ char *e_object_like;
+ char *e_schemaname;
+ char *e_ref_object;
+ char *e_ref_schema;
+
+ /* Reset static state, ensuring no memory leaks */
+ list_index = 0;
+ num_schema_only = 0;
+ num_query_other = 0;
+ num_keywords = 0;
+ PQclear(result);
+ result = NULL;
+
+ /* Parse text, splitting into schema and object name if needed */
+ if (verbatim)
+ {
+ objectname = pg_strdup(text);
+ schemaname = NULL;
+ }
+ else
+ {
+ parse_identifier(text,
+ &schemaname, &objectname,
+ &schemaquoted, &objectquoted);
+ }
+
+ /* Remember whether the user has typed anything in the object part */
+ non_empty_object = (*objectname != '\0');
+
+ /*
+ * Convert objectname to a LIKE prefix pattern (e.g. 'foo%'), and set
+ * up suitably-escaped copies of all the strings we need.
+ */
+ e_object_like = make_like_pattern(objectname);
+
+ if (schemaname)
+ e_schemaname = escape_string(schemaname);
+ else
+ e_schemaname = NULL;
+
+ if (completion_ref_object)
+ e_ref_object = escape_string(completion_ref_object);
+ else
+ e_ref_object = NULL;
+
+ if (completion_ref_schema)
+ e_ref_schema = escape_string(completion_ref_schema);
+ else
+ e_ref_schema = NULL;
+
+ initPQExpBuffer(&query_buffer);
+
+ if (schema_query)
+ {
+ Assert(simple_query == NULL);
+
+ /*
+ * We issue different queries depending on whether the input is
+ * already qualified or not. schema_query gives us the pieces to
+ * assemble.
+ */
+ if (schemaname == NULL || schema_query->namespace == NULL)
+ {
+ /* Get unqualified names matching the input-so-far */
+ appendPQExpBufferStr(&query_buffer, "SELECT ");
+ if (schema_query->use_distinct)
+ appendPQExpBufferStr(&query_buffer, "DISTINCT ");
+ appendPQExpBuffer(&query_buffer,
+ "%s, NULL::pg_catalog.text FROM %s",
+ schema_query->result,
+ schema_query->catname);
+ if (schema_query->refnamespace && completion_ref_schema)
+ appendPQExpBufferStr(&query_buffer,
+ ", pg_catalog.pg_namespace nr");
+ appendPQExpBufferStr(&query_buffer, " WHERE ");
+ if (schema_query->selcondition)
+ appendPQExpBuffer(&query_buffer, "%s AND ",
+ schema_query->selcondition);
+ appendPQExpBuffer(&query_buffer, "(%s) LIKE '%s'",
+ schema_query->result,
+ e_object_like);
+ if (schema_query->viscondition)
+ appendPQExpBuffer(&query_buffer, " AND %s",
+ schema_query->viscondition);
+ if (schema_query->refname)
+ {
+ Assert(completion_ref_object);
+ appendPQExpBuffer(&query_buffer, " AND %s = '%s'",
+ schema_query->refname, e_ref_object);
+ if (schema_query->refnamespace && completion_ref_schema)
+ appendPQExpBuffer(&query_buffer,
+ " AND %s = nr.oid AND nr.nspname = '%s'",
+ schema_query->refnamespace,
+ e_ref_schema);
+ else if (schema_query->refviscondition)
+ appendPQExpBuffer(&query_buffer,
+ " AND %s",
+ schema_query->refviscondition);
+ }
+
+ /*
+ * When fetching relation names, suppress system catalogs
+ * unless the input-so-far begins with "pg_". This is a
+ * compromise between not offering system catalogs for
+ * completion at all, and having them swamp the result when
+ * the input is just "p".
+ */
+ if (strcmp(schema_query->catname,
+ "pg_catalog.pg_class c") == 0 &&
+ strncmp(objectname, "pg_", 3) != 0)
+ {
+ appendPQExpBufferStr(&query_buffer,
+ " AND c.relnamespace <> (SELECT oid FROM"
+ " pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')");
+ }
+
+ /*
+ * If the target object type can be schema-qualified, add in
+ * schema names matching the input-so-far.
+ */
+ if (schema_query->namespace)
+ {
+ appendPQExpBuffer(&query_buffer, "\nUNION ALL\n"
+ "SELECT NULL::pg_catalog.text, n.nspname "
+ "FROM pg_catalog.pg_namespace n "
+ "WHERE n.nspname LIKE '%s'",
+ e_object_like);
+
+ /*
+ * Likewise, suppress system schemas unless the
+ * input-so-far begins with "pg_".
+ */
+ if (strncmp(objectname, "pg_", 3) != 0)
+ appendPQExpBufferStr(&query_buffer,
+ " AND n.nspname NOT LIKE E'pg\\\\_%'");
+
+ /*
+ * Since we're matching these schema names to the object
+ * name, handle their quoting using the object name's
+ * quoting state.
+ */
+ schemaquoted = objectquoted;
+ }
+ }
+ else
+ {
+ /* Input is qualified, so produce only qualified names */
+ appendPQExpBufferStr(&query_buffer, "SELECT ");
+ if (schema_query->use_distinct)
+ appendPQExpBufferStr(&query_buffer, "DISTINCT ");
+ appendPQExpBuffer(&query_buffer, "%s, n.nspname "
+ "FROM %s, pg_catalog.pg_namespace n",
+ schema_query->result,
+ schema_query->catname);
+ if (schema_query->refnamespace && completion_ref_schema)
+ appendPQExpBufferStr(&query_buffer,
+ ", pg_catalog.pg_namespace nr");
+ appendPQExpBuffer(&query_buffer, " WHERE %s = n.oid AND ",
+ schema_query->namespace);
+ if (schema_query->selcondition)
+ appendPQExpBuffer(&query_buffer, "%s AND ",
+ schema_query->selcondition);
+ appendPQExpBuffer(&query_buffer, "(%s) LIKE '%s' AND ",
+ schema_query->result,
+ e_object_like);
+ appendPQExpBuffer(&query_buffer, "n.nspname = '%s'",
+ e_schemaname);
+ if (schema_query->refname)
+ {
+ Assert(completion_ref_object);
+ appendPQExpBuffer(&query_buffer, " AND %s = '%s'",
+ schema_query->refname, e_ref_object);
+ if (schema_query->refnamespace && completion_ref_schema)
+ appendPQExpBuffer(&query_buffer,
+ " AND %s = nr.oid AND nr.nspname = '%s'",
+ schema_query->refnamespace,
+ e_ref_schema);
+ else if (schema_query->refviscondition)
+ appendPQExpBuffer(&query_buffer,
+ " AND %s",
+ schema_query->refviscondition);
+ }
+ }
+ }
+ else
+ {
+ Assert(simple_query);
+ /* simple_query is an sprintf-style format string */
+ appendPQExpBuffer(&query_buffer, simple_query,
+ e_object_like,
+ e_ref_object, e_ref_schema);
+ }
+
+ /* Limit the number of records in the result */
+ appendPQExpBuffer(&query_buffer, "\nLIMIT %d",
+ completion_max_records);
+
+ /* Finally, we can issue the query */
+ result = exec_query(query_buffer.data);
+
+ /* Clean up */
+ termPQExpBuffer(&query_buffer);
+ if (schemaname)
+ free(schemaname);
+ if (objectname)
+ free(objectname);
+ free(e_object_like);
+ if (e_schemaname)
+ free(e_schemaname);
+ if (e_ref_object)
+ free(e_ref_object);
+ if (e_ref_schema)
+ free(e_ref_schema);
+ }
+
+ /* Return the next result, if any, but not if the query failed */
+ if (result && PQresultStatus(result) == PGRES_TUPLES_OK)
+ {
+ int nskip;
+
+ while (list_index < PQntuples(result))
+ {
+ const char *item = NULL;
+ const char *nsp = NULL;
+
+ if (!PQgetisnull(result, list_index, 0))
+ item = PQgetvalue(result, list_index, 0);
+ if (PQnfields(result) > 1 &&
+ !PQgetisnull(result, list_index, 1))
+ nsp = PQgetvalue(result, list_index, 1);
+ list_index++;
+
+ /* In verbatim mode, we return all the items as-is */
+ if (verbatim)
+ {
+ num_query_other++;
+ return pg_strdup(item);
+ }
+
+ /*
+ * In normal mode, a name requiring quoting will be returned only
+ * if the input was empty or quoted. Otherwise the user might see
+ * completion inserting a quote she didn't type, which is
+ * surprising. This restriction also dodges some odd behaviors of
+ * some versions of readline/libedit.
+ */
+ if (non_empty_object)
+ {
+ if (item && !objectquoted && identifier_needs_quotes(item))
+ continue;
+ if (nsp && !schemaquoted && identifier_needs_quotes(nsp))
+ continue;
+ }
+
+ /* Count schema-only results for hack below */
+ if (item == NULL && nsp != NULL)
+ num_schema_only++;
+ else
+ num_query_other++;
+
+ return requote_identifier(nsp, item, schemaquoted, objectquoted);
+ }
+
+ /*
+ * When the query result is exhausted, check for hard-wired keywords.
+ * These will only be returned if they match the input-so-far,
+ * ignoring case.
+ */
+ nskip = list_index - PQntuples(result);
+ if (schema_query && schema_query->keywords)
+ {
+ const char *const *itemp = schema_query->keywords;
+
+ while (*itemp)
+ {
+ const char *item = *itemp++;
+
+ if (nskip-- > 0)
+ continue;
+ list_index++;
+ if (pg_strncasecmp(text, item, strlen(text)) == 0)
+ {
+ num_keywords++;
+ return pg_strdup_keyword_case(item, text);
+ }
+ }
+ }
+ if (keywords)
+ {
+ const char *const *itemp = keywords;
+
+ while (*itemp)
+ {
+ const char *item = *itemp++;
+
+ if (nskip-- > 0)
+ continue;
+ list_index++;
+ if (pg_strncasecmp(text, item, strlen(text)) == 0)
+ {
+ num_keywords++;
+ return pg_strdup_keyword_case(item, text);
+ }
+ }
+ }
+ }
+
+ /*
+ * Hack: if we returned only bare schema names, don't let Readline add a
+ * space afterwards. Otherwise the schema will stop being part of the
+ * completion subject text, which is not what we want.
+ */
+ if (num_schema_only > 0 && num_query_other == 0 && num_keywords == 0)
+ rl_completion_append_character = '\0';
+
+ /* No more matches, so free the result structure and return null */
+ PQclear(result);
+ result = NULL;
+ return NULL;
+}
+
+
+/*
+ * Set up completion_ref_object and completion_ref_schema
+ * by parsing the given word. These variables can then be
+ * used in a query passed to _complete_from_query.
+ */
+static void
+set_completion_reference(const char *word)
+{
+ bool schemaquoted,
+ objectquoted;
+
+ parse_identifier(word,
+ &completion_ref_schema, &completion_ref_object,
+ &schemaquoted, &objectquoted);
+}
+
+/*
+ * Set up completion_ref_object when it should just be
+ * the given word verbatim.
+ */
+static void
+set_completion_reference_verbatim(const char *word)
+{
+ completion_ref_schema = NULL;
+ completion_ref_object = pg_strdup(word);
+}
+
+
+/*
+ * This function returns in order one of a fixed, NULL pointer terminated list
+ * of strings (if matching). This can be used if there are only a fixed number
+ * SQL words that can appear at certain spot.
+ */
+static char *
+complete_from_list(const char *text, int state)
+{
+ static int string_length,
+ list_index,
+ matches;
+ static bool casesensitive;
+ const char *item;
+
+ /* need to have a list */
+ Assert(completion_charpp != NULL);
+
+ /* Initialization */
+ if (state == 0)
+ {
+ list_index = 0;
+ string_length = strlen(text);
+ casesensitive = completion_case_sensitive;
+ matches = 0;
+ }
+
+ while ((item = completion_charpp[list_index++]))
+ {
+ /* First pass is case sensitive */
+ if (casesensitive && strncmp(text, item, string_length) == 0)
+ {
+ matches++;
+ return pg_strdup(item);
+ }
+
+ /* Second pass is case insensitive, don't bother counting matches */
+ if (!casesensitive && pg_strncasecmp(text, item, string_length) == 0)
+ {
+ if (completion_case_sensitive)
+ return pg_strdup(item);
+ else
+
+ /*
+ * If case insensitive matching was requested initially,
+ * adjust the case according to setting.
+ */
+ return pg_strdup_keyword_case(item, text);
+ }
+ }
+
+ /*
+ * No matches found. If we're not case insensitive already, lets switch to
+ * being case insensitive and try again
+ */
+ if (casesensitive && matches == 0)
+ {
+ casesensitive = false;
+ list_index = 0;
+ state++;
+ return complete_from_list(text, state);
+ }
+
+ /* If no more matches, return null. */
+ return NULL;
+}
+
+
+/*
+ * This function returns one fixed string the first time even if it doesn't
+ * match what's there, and nothing the second time. The string
+ * to be used must be in completion_charp.
+ *
+ * If the given string is "", this has the effect of preventing readline
+ * from doing any completion. (Without this, readline tries to do filename
+ * completion which is seldom the right thing.)
+ *
+ * If the given string is not empty, readline will replace whatever the
+ * user typed with that string. This behavior might be useful if it's
+ * completely certain that we know what must appear at a certain spot,
+ * so that it's okay to overwrite misspellings. In practice, given the
+ * relatively lame parsing technology used in this file, the level of
+ * certainty is seldom that high, so that you probably don't want to
+ * use this. Use complete_from_list with a one-element list instead;
+ * that won't try to auto-correct "misspellings".
+ */
+static char *
+complete_from_const(const char *text, int state)
+{
+ Assert(completion_charp != NULL);
+ if (state == 0)
+ {
+ if (completion_case_sensitive)
+ return pg_strdup(completion_charp);
+ else
+
+ /*
+ * If case insensitive matching was requested initially, adjust
+ * the case according to setting.
+ */
+ return pg_strdup_keyword_case(completion_charp, text);
+ }
+ else
+ return NULL;
+}
+
+
+/*
+ * This function appends the variable name with prefix and suffix to
+ * the variable names array.
+ */
+static void
+append_variable_names(char ***varnames, int *nvars,
+ int *maxvars, const char *varname,
+ const char *prefix, const char *suffix)
+{
+ if (*nvars >= *maxvars)
+ {
+ *maxvars *= 2;
+ *varnames = (char **) pg_realloc(*varnames,
+ ((*maxvars) + 1) * sizeof(char *));
+ }
+
+ (*varnames)[(*nvars)++] = psprintf("%s%s%s", prefix, varname, suffix);
+}
+
+
+/*
+ * This function supports completion with the name of a psql variable.
+ * The variable names can be prefixed and suffixed with additional text
+ * to support quoting usages. If need_value is true, only variables
+ * that are currently set are included; otherwise, special variables
+ * (those that have hooks) are included even if currently unset.
+ */
+static char **
+complete_from_variables(const char *text, const char *prefix, const char *suffix,
+ bool need_value)
+{
+ char **matches;
+ char **varnames;
+ int nvars = 0;
+ int maxvars = 100;
+ int i;
+ struct _variable *ptr;
+
+ varnames = (char **) pg_malloc((maxvars + 1) * sizeof(char *));
+
+ for (ptr = pset.vars->next; ptr; ptr = ptr->next)
+ {
+ if (need_value && !(ptr->value))
+ continue;
+ append_variable_names(&varnames, &nvars, &maxvars, ptr->name,
+ prefix, suffix);
+ }
+
+ varnames[nvars] = NULL;
+ COMPLETE_WITH_LIST_CS((const char *const *) varnames);
+
+ for (i = 0; i < nvars; i++)
+ free(varnames[i]);
+ free(varnames);
+
+ return matches;
+}
+
+
+/*
+ * This function wraps rl_filename_completion_function() to strip quotes from
+ * the input before searching for matches and to quote any matches for which
+ * the consuming command will require it.
+ *
+ * Caller must set completion_charp to a zero- or one-character string
+ * containing the escape character. This is necessary since \copy has no
+ * escape character, but every other backslash command recognizes "\" as an
+ * escape character.
+ *
+ * Caller must also set completion_force_quote to indicate whether to force
+ * quotes around the result. (The SQL COPY command requires that.)
+ */
+static char *
+complete_from_files(const char *text, int state)
+{
+#ifdef USE_FILENAME_QUOTING_FUNCTIONS
+
+ /*
+ * If we're using a version of Readline that supports filename quoting
+ * hooks, rely on those, and invoke rl_filename_completion_function()
+ * without messing with its arguments. Readline does stuff internally
+ * that does not work well at all if we try to handle dequoting here.
+ * Instead, Readline will call quote_file_name() and dequote_file_name()
+ * (see below) at appropriate times.
+ *
+ * ... or at least, mostly it will. There are some paths involving
+ * unmatched file names in which Readline never calls quote_file_name(),
+ * and if left to its own devices it will incorrectly append a quote
+ * anyway. Set rl_completion_suppress_quote to prevent that. If we do
+ * get to quote_file_name(), we'll clear this again. (Yes, this seems
+ * like it's working around Readline bugs.)
+ */
+#ifdef HAVE_RL_COMPLETION_SUPPRESS_QUOTE
+ rl_completion_suppress_quote = 1;
+#endif
+
+ /* If user typed a quote, force quoting (never remove user's quote) */
+ if (*text == '\'')
+ completion_force_quote = true;
+
+ return rl_filename_completion_function(text, state);
+#else
+
+ /*
+ * Otherwise, we have to do the best we can.
+ */
+ static const char *unquoted_text;
+ char *unquoted_match;
+ char *ret = NULL;
+
+ /* If user typed a quote, force quoting (never remove user's quote) */
+ if (*text == '\'')
+ completion_force_quote = true;
+
+ if (state == 0)
+ {
+ /* Initialization: stash the unquoted input. */
+ unquoted_text = strtokx(text, "", NULL, "'", *completion_charp,
+ false, true, pset.encoding);
+ /* expect a NULL return for the empty string only */
+ if (!unquoted_text)
+ {
+ Assert(*text == '\0');
+ unquoted_text = text;
+ }
+ }
+
+ unquoted_match = rl_filename_completion_function(unquoted_text, state);
+ if (unquoted_match)
+ {
+ struct stat statbuf;
+ bool is_dir = (stat(unquoted_match, &statbuf) == 0 &&
+ S_ISDIR(statbuf.st_mode) != 0);
+
+ /* Re-quote the result, if needed. */
+ ret = quote_if_needed(unquoted_match, " \t\r\n\"`",
+ '\'', *completion_charp,
+ completion_force_quote,
+ pset.encoding);
+ if (ret)
+ free(unquoted_match);
+ else
+ ret = unquoted_match;
+
+ /*
+ * If it's a directory, replace trailing quote with a slash; this is
+ * usually more convenient. (If we didn't quote, leave this to
+ * libedit.)
+ */
+ if (*ret == '\'' && is_dir)
+ {
+ char *retend = ret + strlen(ret) - 1;
+
+ Assert(*retend == '\'');
+ *retend = '/';
+ /* Prevent libedit from adding a space, too */
+ rl_completion_append_character = '\0';
+ }
+ }
+
+ return ret;
+#endif /* USE_FILENAME_QUOTING_FUNCTIONS */
+}
+
+
+/* HELPER FUNCTIONS */
+
+
+/*
+ * Make a pg_strdup copy of s and convert the case according to
+ * COMP_KEYWORD_CASE setting, using ref as the text that was already entered.
+ */
+static char *
+pg_strdup_keyword_case(const char *s, const char *ref)
+{
+ char *ret,
+ *p;
+ unsigned char first = ref[0];
+
+ ret = pg_strdup(s);
+
+ if (pset.comp_case == PSQL_COMP_CASE_LOWER ||
+ ((pset.comp_case == PSQL_COMP_CASE_PRESERVE_LOWER ||
+ pset.comp_case == PSQL_COMP_CASE_PRESERVE_UPPER) && islower(first)) ||
+ (pset.comp_case == PSQL_COMP_CASE_PRESERVE_LOWER && !isalpha(first)))
+ {
+ for (p = ret; *p; p++)
+ *p = pg_tolower((unsigned char) *p);
+ }
+ else
+ {
+ for (p = ret; *p; p++)
+ *p = pg_toupper((unsigned char) *p);
+ }
+
+ return ret;
+}
+
+
+/*
+ * escape_string - Escape argument for use as string literal.
+ *
+ * The returned value has to be freed.
+ */
+static char *
+escape_string(const char *text)
+{
+ size_t text_length;
+ char *result;
+
+ text_length = strlen(text);
+
+ result = pg_malloc(text_length * 2 + 1);
+ PQescapeStringConn(pset.db, result, text, text_length, NULL);
+
+ return result;
+}
+
+
+/*
+ * make_like_pattern - Convert argument to a LIKE prefix pattern.
+ *
+ * We escape _ and % in the given text by backslashing, append a % to
+ * represent "any subsequent characters", and then pass the string through
+ * escape_string() so it's ready to insert in a query. The result needs
+ * to be freed.
+ */
+static char *
+make_like_pattern(const char *word)
+{
+ char *result;
+ char *buffer = pg_malloc(strlen(word) * 2 + 2);
+ char *bptr = buffer;
+
+ while (*word)
+ {
+ if (*word == '_' || *word == '%')
+ *bptr++ = '\\';
+ if (IS_HIGHBIT_SET(*word))
+ {
+ /*
+ * Transfer multibyte characters without further processing, to
+ * avoid getting confused in unsafe client encodings.
+ */
+ int chlen = PQmblenBounded(word, pset.encoding);
+
+ while (chlen-- > 0)
+ *bptr++ = *word++;
+ }
+ else
+ *bptr++ = *word++;
+ }
+ *bptr++ = '%';
+ *bptr = '\0';
+
+ result = escape_string(buffer);
+ free(buffer);
+ return result;
+}
+
+
+/*
+ * parse_identifier - Parse a possibly-schema-qualified SQL identifier.
+ *
+ * This involves splitting off the schema name if present, de-quoting,
+ * and downcasing any unquoted text. We are a bit laxer than the backend
+ * in that we allow just portions of a name to be quoted --- that's because
+ * psql metacommands have traditionally behaved that way.
+ *
+ * Outputs are a malloc'd schema name (NULL if none), malloc'd object name,
+ * and booleans telling whether any part of the schema and object name was
+ * double-quoted.
+ */
+static void
+parse_identifier(const char *ident,
+ char **schemaname, char **objectname,
+ bool *schemaquoted, bool *objectquoted)
+{
+ size_t buflen = strlen(ident) + 1;
+ bool enc_is_single_byte = (pg_encoding_max_length(pset.encoding) == 1);
+ char *sname;
+ char *oname;
+ char *optr;
+ bool inquotes;
+
+ /* Initialize, making a certainly-large-enough output buffer */
+ sname = NULL;
+ oname = pg_malloc(buflen);
+ *schemaquoted = *objectquoted = false;
+ /* Scan */
+ optr = oname;
+ inquotes = false;
+ while (*ident)
+ {
+ unsigned char ch = (unsigned char) *ident++;
+
+ if (ch == '"')
+ {
+ if (inquotes && *ident == '"')
+ {
+ /* two quote marks within a quoted identifier = emit quote */
+ *optr++ = '"';
+ ident++;
+ }
+ else
+ {
+ inquotes = !inquotes;
+ *objectquoted = true;
+ }
+ }
+ else if (ch == '.' && !inquotes)
+ {
+ /* Found a schema name, transfer it to sname / *schemaquoted */
+ *optr = '\0';
+ free(sname); /* drop any catalog name */
+ sname = oname;
+ oname = pg_malloc(buflen);
+ optr = oname;
+ *schemaquoted = *objectquoted;
+ *objectquoted = false;
+ }
+ else if (!enc_is_single_byte && IS_HIGHBIT_SET(ch))
+ {
+ /*
+ * Transfer multibyte characters without further processing. They
+ * wouldn't be affected by our downcasing rule anyway, and this
+ * avoids possibly doing the wrong thing in unsafe client
+ * encodings.
+ */
+ int chlen = PQmblenBounded(ident - 1, pset.encoding);
+
+ *optr++ = (char) ch;
+ while (--chlen > 0)
+ *optr++ = *ident++;
+ }
+ else
+ {
+ if (!inquotes)
+ {
+ /*
+ * This downcasing transformation should match the backend's
+ * downcase_identifier() as best we can. We do not know the
+ * backend's locale, though, so it's necessarily approximate.
+ * We assume that psql is operating in the same locale and
+ * encoding as the backend.
+ */
+ if (ch >= 'A' && ch <= 'Z')
+ ch += 'a' - 'A';
+ else if (enc_is_single_byte && IS_HIGHBIT_SET(ch) && isupper(ch))
+ ch = tolower(ch);
+ }
+ *optr++ = (char) ch;
+ }
+ }
+
+ *optr = '\0';
+ *schemaname = sname;
+ *objectname = oname;
+}
+
+
+/*
+ * requote_identifier - Reconstruct a possibly-schema-qualified SQL identifier.
+ *
+ * Build a malloc'd string containing the identifier, with quoting applied
+ * as necessary. This is more or less the inverse of parse_identifier;
+ * in particular, if an input component was quoted, we'll quote the output
+ * even when that isn't strictly required.
+ *
+ * Unlike parse_identifier, we handle the case where a schema and no
+ * object name is provided, producing just "schema.".
+ */
+static char *
+requote_identifier(const char *schemaname, const char *objectname,
+ bool quote_schema, bool quote_object)
+{
+ char *result;
+ size_t buflen = 1; /* count the trailing \0 */
+ char *ptr;
+
+ /*
+ * We could use PQescapeIdentifier for some of this, but not all, and it
+ * adds more notational cruft than it seems worth.
+ */
+ if (schemaname)
+ {
+ buflen += strlen(schemaname) + 1; /* +1 for the dot */
+ if (!quote_schema)
+ quote_schema = identifier_needs_quotes(schemaname);
+ if (quote_schema)
+ {
+ buflen += 2; /* account for quote marks */
+ for (const char *p = schemaname; *p; p++)
+ {
+ if (*p == '"')
+ buflen++;
+ }
+ }
+ }
+ if (objectname)
+ {
+ buflen += strlen(objectname);
+ if (!quote_object)
+ quote_object = identifier_needs_quotes(objectname);
+ if (quote_object)
+ {
+ buflen += 2; /* account for quote marks */
+ for (const char *p = objectname; *p; p++)
+ {
+ if (*p == '"')
+ buflen++;
+ }
+ }
+ }
+ result = pg_malloc(buflen);
+ ptr = result;
+ if (schemaname)
+ {
+ if (quote_schema)
+ *ptr++ = '"';
+ for (const char *p = schemaname; *p; p++)
+ {
+ *ptr++ = *p;
+ if (*p == '"')
+ *ptr++ = '"';
+ }
+ if (quote_schema)
+ *ptr++ = '"';
+ *ptr++ = '.';
+ }
+ if (objectname)
+ {
+ if (quote_object)
+ *ptr++ = '"';
+ for (const char *p = objectname; *p; p++)
+ {
+ *ptr++ = *p;
+ if (*p == '"')
+ *ptr++ = '"';
+ }
+ if (quote_object)
+ *ptr++ = '"';
+ }
+ *ptr = '\0';
+ return result;
+}
+
+
+/*
+ * Detect whether an identifier must be double-quoted.
+ *
+ * Note we'll quote anything that's not ASCII; the backend's quote_ident()
+ * does the same. Perhaps this could be relaxed in future.
+ */
+static bool
+identifier_needs_quotes(const char *ident)
+{
+ int kwnum;
+
+ /* Check syntax. */
+ if (!((ident[0] >= 'a' && ident[0] <= 'z') || ident[0] == '_'))
+ return true;
+ if (strspn(ident, "abcdefghijklmnopqrstuvwxyz0123456789_") != strlen(ident))
+ return true;
+
+ /*
+ * Check for keyword. We quote keywords except for unreserved ones.
+ *
+ * It is possible that our keyword list doesn't quite agree with the
+ * server's, but this should be close enough for tab-completion purposes.
+ *
+ * Note: ScanKeywordLookup() does case-insensitive comparison, but that's
+ * fine, since we already know we have all-lower-case.
+ */
+ kwnum = ScanKeywordLookup(ident, &ScanKeywords);
+
+ if (kwnum >= 0 && ScanKeywordCategories[kwnum] != UNRESERVED_KEYWORD)
+ return true;
+
+ return false;
+}
+
+
+/*
+ * Execute a query, returning NULL if there was any error.
+ * This should be the preferred way of talking to the database in this file.
+ */
+static PGresult *
+exec_query(const char *query)
+{
+ PGresult *result;
+
+ if (query == NULL || !pset.db || PQstatus(pset.db) != CONNECTION_OK)
+ return NULL;
+
+ result = PQexec(pset.db, query);
+
+ if (PQresultStatus(result) != PGRES_TUPLES_OK)
+ {
+ /*
+ * Printing an error while the user is typing would be quite annoying,
+ * so we don't. This does complicate debugging of this code; but you
+ * can look in the server log instead.
+ */
+#ifdef NOT_USED
+ pg_log_error("tab completion query failed: %s\nQuery was:\n%s",
+ PQerrorMessage(pset.db), query);
+#endif
+ PQclear(result);
+ result = NULL;
+ }
+
+ return result;
+}
+
+
+/*
+ * Parse all the word(s) before point.
+ *
+ * Returns a malloc'd array of character pointers that point into the malloc'd
+ * data array returned to *buffer; caller must free() both of these when done.
+ * *nwords receives the number of words found, ie, the valid length of the
+ * return array.
+ *
+ * Words are returned right to left, that is, previous_words[0] gets the last
+ * word before point, previous_words[1] the next-to-last, etc.
+ */
+static char **
+get_previous_words(int point, char **buffer, int *nwords)
+{
+ char **previous_words;
+ char *buf;
+ char *outptr;
+ int words_found = 0;
+ int i;
+
+ /*
+ * If we have anything in tab_completion_query_buf, paste it together with
+ * rl_line_buffer to construct the full query. Otherwise we can just use
+ * rl_line_buffer as the input string.
+ */
+ if (tab_completion_query_buf && tab_completion_query_buf->len > 0)
+ {
+ i = tab_completion_query_buf->len;
+ buf = pg_malloc(point + i + 2);
+ memcpy(buf, tab_completion_query_buf->data, i);
+ buf[i++] = '\n';
+ memcpy(buf + i, rl_line_buffer, point);
+ i += point;
+ buf[i] = '\0';
+ /* Readjust point to reference appropriate offset in buf */
+ point = i;
+ }
+ else
+ buf = rl_line_buffer;
+
+ /*
+ * Allocate an array of string pointers and a buffer to hold the strings
+ * themselves. The worst case is that the line contains only
+ * non-whitespace WORD_BREAKS characters, making each one a separate word.
+ * This is usually much more space than we need, but it's cheaper than
+ * doing a separate malloc() for each word.
+ */
+ previous_words = (char **) pg_malloc(point * sizeof(char *));
+ *buffer = outptr = (char *) pg_malloc(point * 2);
+
+ /*
+ * First we look for a non-word char before the current point. (This is
+ * probably useless, if readline is on the same page as we are about what
+ * is a word, but if so it's cheap.)
+ */
+ for (i = point - 1; i >= 0; i--)
+ {
+ if (strchr(WORD_BREAKS, buf[i]))
+ break;
+ }
+ point = i;
+
+ /*
+ * Now parse words, working backwards, until we hit start of line. The
+ * backwards scan has some interesting but intentional properties
+ * concerning parenthesis handling.
+ */
+ while (point >= 0)
+ {
+ int start,
+ end;
+ bool inquotes = false;
+ int parentheses = 0;
+
+ /* now find the first non-space which then constitutes the end */
+ end = -1;
+ for (i = point; i >= 0; i--)
+ {
+ if (!isspace((unsigned char) buf[i]))
+ {
+ end = i;
+ break;
+ }
+ }
+ /* if no end found, we're done */
+ if (end < 0)
+ break;
+
+ /*
+ * Otherwise we now look for the start. The start is either the last
+ * character before any word-break character going backwards from the
+ * end, or it's simply character 0. We also handle open quotes and
+ * parentheses.
+ */
+ for (start = end; start > 0; start--)
+ {
+ if (buf[start] == '"')
+ inquotes = !inquotes;
+ if (!inquotes)
+ {
+ if (buf[start] == ')')
+ parentheses++;
+ else if (buf[start] == '(')
+ {
+ if (--parentheses <= 0)
+ break;
+ }
+ else if (parentheses == 0 &&
+ strchr(WORD_BREAKS, buf[start - 1]))
+ break;
+ }
+ }
+
+ /* Return the word located at start to end inclusive */
+ previous_words[words_found++] = outptr;
+ i = end - start + 1;
+ memcpy(outptr, &buf[start], i);
+ outptr += i;
+ *outptr++ = '\0';
+
+ /* Continue searching */
+ point = start - 1;
+ }
+
+ /* Release parsing input workspace, if we made one above */
+ if (buf != rl_line_buffer)
+ free(buf);
+
+ *nwords = words_found;
+ return previous_words;
+}
+
+/*
+ * Look up the type for the GUC variable with the passed name.
+ *
+ * Returns NULL if the variable is unknown. Otherwise the returned string,
+ * containing the type, has to be freed.
+ */
+static char *
+get_guctype(const char *varname)
+{
+ PQExpBufferData query_buffer;
+ char *e_varname;
+ PGresult *result;
+ char *guctype = NULL;
+
+ e_varname = escape_string(varname);
+
+ initPQExpBuffer(&query_buffer);
+ appendPQExpBuffer(&query_buffer,
+ "SELECT vartype FROM pg_catalog.pg_settings "
+ "WHERE pg_catalog.lower(name) = pg_catalog.lower('%s')",
+ e_varname);
+
+ result = exec_query(query_buffer.data);
+ termPQExpBuffer(&query_buffer);
+ free(e_varname);
+
+ if (PQresultStatus(result) == PGRES_TUPLES_OK && PQntuples(result) > 0)
+ guctype = pg_strdup(PQgetvalue(result, 0, 0));
+
+ PQclear(result);
+
+ return guctype;
+}
+
+#ifdef USE_FILENAME_QUOTING_FUNCTIONS
+
+/*
+ * Quote a filename according to SQL rules, returning a malloc'd string.
+ * completion_charp must point to escape character or '\0', and
+ * completion_force_quote must be set correctly, as per comments for
+ * complete_from_files().
+ */
+static char *
+quote_file_name(char *fname, int match_type, char *quote_pointer)
+{
+ char *s;
+ struct stat statbuf;
+
+ /* Quote if needed. */
+ s = quote_if_needed(fname, " \t\r\n\"`",
+ '\'', *completion_charp,
+ completion_force_quote,
+ pset.encoding);
+ if (!s)
+ s = pg_strdup(fname);
+
+ /*
+ * However, some of the time we have to strip the trailing quote from what
+ * we send back. Never strip the trailing quote if the user already typed
+ * one; otherwise, suppress the trailing quote if we have multiple/no
+ * matches (because we don't want to add a quote if the input is seemingly
+ * unfinished), or if the input was already quoted (because Readline will
+ * do arguably-buggy things otherwise), or if the file does not exist, or
+ * if it's a directory.
+ */
+ if (*s == '\'' &&
+ completion_last_char != '\'' &&
+ (match_type != SINGLE_MATCH ||
+ (quote_pointer && *quote_pointer == '\'') ||
+ stat(fname, &statbuf) != 0 ||
+ S_ISDIR(statbuf.st_mode)))
+ {
+ char *send = s + strlen(s) - 1;
+
+ Assert(*send == '\'');
+ *send = '\0';
+ }
+
+ /*
+ * And now we can let Readline do its thing with possibly adding a quote
+ * on its own accord. (This covers some additional cases beyond those
+ * dealt with above.)
+ */
+#ifdef HAVE_RL_COMPLETION_SUPPRESS_QUOTE
+ rl_completion_suppress_quote = 0;
+#endif
+
+ /*
+ * If user typed a leading quote character other than single quote (i.e.,
+ * double quote), zap it, so that we replace it with the correct single
+ * quote.
+ */
+ if (quote_pointer && *quote_pointer != '\'')
+ *quote_pointer = '\0';
+
+ return s;
+}
+
+/*
+ * Dequote a filename, if it's quoted.
+ * completion_charp must point to escape character or '\0', as per
+ * comments for complete_from_files().
+ */
+static char *
+dequote_file_name(char *fname, int quote_char)
+{
+ char *unquoted_fname;
+
+ /*
+ * If quote_char is set, it's not included in "fname". We have to add it
+ * or strtokx will not interpret the string correctly (notably, it won't
+ * recognize escapes).
+ */
+ if (quote_char == '\'')
+ {
+ char *workspace = (char *) pg_malloc(strlen(fname) + 2);
+
+ workspace[0] = quote_char;
+ strcpy(workspace + 1, fname);
+ unquoted_fname = strtokx(workspace, "", NULL, "'", *completion_charp,
+ false, true, pset.encoding);
+ free(workspace);
+ }
+ else
+ unquoted_fname = strtokx(fname, "", NULL, "'", *completion_charp,
+ false, true, pset.encoding);
+
+ /* expect a NULL return for the empty string only */
+ if (!unquoted_fname)
+ {
+ Assert(*fname == '\0');
+ unquoted_fname = fname;
+ }
+
+ /* readline expects a malloc'd result that it is to free */
+ return pg_strdup(unquoted_fname);
+}
+
+#endif /* USE_FILENAME_QUOTING_FUNCTIONS */
+
+#endif /* USE_READLINE */
diff --git a/src/bin/psql/tab-complete.h b/src/bin/psql/tab-complete.h
new file mode 100644
index 0000000..1c4190e
--- /dev/null
+++ b/src/bin/psql/tab-complete.h
@@ -0,0 +1,17 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/tab-complete.h
+ */
+#ifndef TAB_COMPLETE_H
+#define TAB_COMPLETE_H
+
+#include "pqexpbuffer.h"
+
+extern PQExpBuffer tab_completion_query_buf;
+
+extern void initialize_readline(void);
+
+#endif /* TAB_COMPLETE_H */
diff --git a/src/bin/psql/variables.c b/src/bin/psql/variables.c
new file mode 100644
index 0000000..47c58d2
--- /dev/null
+++ b/src/bin/psql/variables.c
@@ -0,0 +1,422 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/variables.c
+ */
+#include "postgres_fe.h"
+
+#include "common.h"
+#include "common/logging.h"
+#include "variables.h"
+
+/*
+ * Check whether a variable's name is allowed.
+ *
+ * We allow any non-ASCII character, as well as ASCII letters, digits, and
+ * underscore. Keep this in sync with the definition of variable_char in
+ * psqlscan.l and psqlscanslash.l.
+ */
+static bool
+valid_variable_name(const char *name)
+{
+ const unsigned char *ptr = (const unsigned char *) name;
+
+ /* Mustn't be zero-length */
+ if (*ptr == '\0')
+ return false;
+
+ while (*ptr)
+ {
+ if (IS_HIGHBIT_SET(*ptr) ||
+ strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"
+ "_0123456789", *ptr) != NULL)
+ ptr++;
+ else
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * A "variable space" is represented by an otherwise-unused struct _variable
+ * that serves as list header.
+ *
+ * The list entries are kept in name order (according to strcmp). This
+ * is mainly to make the output of PrintVariables() more pleasing.
+ */
+VariableSpace
+CreateVariableSpace(void)
+{
+ struct _variable *ptr;
+
+ ptr = pg_malloc(sizeof *ptr);
+ ptr->name = NULL;
+ ptr->value = NULL;
+ ptr->substitute_hook = NULL;
+ ptr->assign_hook = NULL;
+ ptr->next = NULL;
+
+ return ptr;
+}
+
+/*
+ * Get string value of variable, or NULL if it's not defined.
+ *
+ * Note: result is valid until variable is next assigned to.
+ */
+const char *
+GetVariable(VariableSpace space, const char *name)
+{
+ struct _variable *current;
+
+ if (!space)
+ return NULL;
+
+ for (current = space->next; current; current = current->next)
+ {
+ int cmp = strcmp(current->name, name);
+
+ if (cmp == 0)
+ {
+ /* this is correct answer when value is NULL, too */
+ return current->value;
+ }
+ if (cmp > 0)
+ break; /* it's not there */
+ }
+
+ return NULL;
+}
+
+/*
+ * Try to interpret "value" as a boolean value, and if successful,
+ * store it in *result. Otherwise don't clobber *result.
+ *
+ * Valid values are: true, false, yes, no, on, off, 1, 0; as well as unique
+ * prefixes thereof.
+ *
+ * "name" is the name of the variable we're assigning to, to use in error
+ * report if any. Pass name == NULL to suppress the error report.
+ *
+ * Return true when "value" is syntactically valid, false otherwise.
+ */
+bool
+ParseVariableBool(const char *value, const char *name, bool *result)
+{
+ size_t len;
+ bool valid = true;
+
+ /* Treat "unset" as an empty string, which will lead to error below */
+ if (value == NULL)
+ value = "";
+
+ len = strlen(value);
+
+ if (len > 0 && pg_strncasecmp(value, "true", len) == 0)
+ *result = true;
+ else if (len > 0 && pg_strncasecmp(value, "false", len) == 0)
+ *result = false;
+ else if (len > 0 && pg_strncasecmp(value, "yes", len) == 0)
+ *result = true;
+ else if (len > 0 && pg_strncasecmp(value, "no", len) == 0)
+ *result = false;
+ /* 'o' is not unique enough */
+ else if (pg_strncasecmp(value, "on", (len > 2 ? len : 2)) == 0)
+ *result = true;
+ else if (pg_strncasecmp(value, "off", (len > 2 ? len : 2)) == 0)
+ *result = false;
+ else if (pg_strcasecmp(value, "1") == 0)
+ *result = true;
+ else if (pg_strcasecmp(value, "0") == 0)
+ *result = false;
+ else
+ {
+ /* string is not recognized; don't clobber *result */
+ if (name)
+ pg_log_error("unrecognized value \"%s\" for \"%s\": Boolean expected",
+ value, name);
+ valid = false;
+ }
+ return valid;
+}
+
+/*
+ * Try to interpret "value" as an integer value, and if successful,
+ * store it in *result. Otherwise don't clobber *result.
+ *
+ * "name" is the name of the variable we're assigning to, to use in error
+ * report if any. Pass name == NULL to suppress the error report.
+ *
+ * Return true when "value" is syntactically valid, false otherwise.
+ */
+bool
+ParseVariableNum(const char *value, const char *name, int *result)
+{
+ char *end;
+ long numval;
+
+ /* Treat "unset" as an empty string, which will lead to error below */
+ if (value == NULL)
+ value = "";
+
+ errno = 0;
+ numval = strtol(value, &end, 0);
+ if (errno == 0 && *end == '\0' && end != value && numval == (int) numval)
+ {
+ *result = (int) numval;
+ return true;
+ }
+ else
+ {
+ /* string is not recognized; don't clobber *result */
+ if (name)
+ pg_log_error("invalid value \"%s\" for \"%s\": integer expected",
+ value, name);
+ return false;
+ }
+}
+
+/*
+ * Print values of all variables.
+ */
+void
+PrintVariables(VariableSpace space)
+{
+ struct _variable *ptr;
+
+ if (!space)
+ return;
+
+ for (ptr = space->next; ptr; ptr = ptr->next)
+ {
+ if (ptr->value)
+ printf("%s = '%s'\n", ptr->name, ptr->value);
+ if (cancel_pressed)
+ break;
+ }
+}
+
+/*
+ * Set the variable named "name" to value "value",
+ * or delete it if "value" is NULL.
+ *
+ * Returns true if successful, false if not; in the latter case a suitable
+ * error message has been printed, except for the unexpected case of
+ * space or name being NULL.
+ */
+bool
+SetVariable(VariableSpace space, const char *name, const char *value)
+{
+ struct _variable *current,
+ *previous;
+
+ if (!space || !name)
+ return false;
+
+ if (!valid_variable_name(name))
+ {
+ /* Deletion of non-existent variable is not an error */
+ if (!value)
+ return true;
+ pg_log_error("invalid variable name: \"%s\"", name);
+ return false;
+ }
+
+ for (previous = space, current = space->next;
+ current;
+ previous = current, current = current->next)
+ {
+ int cmp = strcmp(current->name, name);
+
+ if (cmp == 0)
+ {
+ /*
+ * Found entry, so update, unless assign hook returns false.
+ *
+ * We must duplicate the passed value to start with. This
+ * simplifies the API for substitute hooks. Moreover, some assign
+ * hooks assume that the passed value has the same lifespan as the
+ * variable. Having to free the string again on failure is a
+ * small price to pay for keeping these APIs simple.
+ */
+ char *new_value = value ? pg_strdup(value) : NULL;
+ bool confirmed;
+
+ if (current->substitute_hook)
+ new_value = current->substitute_hook(new_value);
+
+ if (current->assign_hook)
+ confirmed = current->assign_hook(new_value);
+ else
+ confirmed = true;
+
+ if (confirmed)
+ {
+ if (current->value)
+ pg_free(current->value);
+ current->value = new_value;
+
+ /*
+ * If we deleted the value, and there are no hooks to
+ * remember, we can discard the variable altogether.
+ */
+ if (new_value == NULL &&
+ current->substitute_hook == NULL &&
+ current->assign_hook == NULL)
+ {
+ previous->next = current->next;
+ free(current->name);
+ free(current);
+ }
+ }
+ else if (new_value)
+ pg_free(new_value); /* current->value is left unchanged */
+
+ return confirmed;
+ }
+ if (cmp > 0)
+ break; /* it's not there */
+ }
+
+ /* not present, make new entry ... unless we were asked to delete */
+ if (value)
+ {
+ current = pg_malloc(sizeof *current);
+ current->name = pg_strdup(name);
+ current->value = pg_strdup(value);
+ current->substitute_hook = NULL;
+ current->assign_hook = NULL;
+ current->next = previous->next;
+ previous->next = current;
+ }
+ return true;
+}
+
+/*
+ * Attach substitute and/or assign hook functions to the named variable.
+ * If you need only one hook, pass NULL for the other.
+ *
+ * If the variable doesn't already exist, create it with value NULL, just so
+ * we have a place to store the hook function(s). (The substitute hook might
+ * immediately change the NULL to something else; if not, this state is
+ * externally the same as the variable not being defined.)
+ *
+ * The substitute hook, if given, is immediately called on the variable's
+ * value. Then the assign hook, if given, is called on the variable's value.
+ * This is meant to let it update any derived psql state. If the assign hook
+ * doesn't like the current value, it will print a message to that effect,
+ * but we'll ignore it. Generally we do not expect any such failure here,
+ * because this should get called before any user-supplied value is assigned.
+ */
+void
+SetVariableHooks(VariableSpace space, const char *name,
+ VariableSubstituteHook shook,
+ VariableAssignHook ahook)
+{
+ struct _variable *current,
+ *previous;
+
+ if (!space || !name)
+ return;
+
+ if (!valid_variable_name(name))
+ return;
+
+ for (previous = space, current = space->next;
+ current;
+ previous = current, current = current->next)
+ {
+ int cmp = strcmp(current->name, name);
+
+ if (cmp == 0)
+ {
+ /* found entry, so update */
+ current->substitute_hook = shook;
+ current->assign_hook = ahook;
+ if (shook)
+ current->value = (*shook) (current->value);
+ if (ahook)
+ (void) (*ahook) (current->value);
+ return;
+ }
+ if (cmp > 0)
+ break; /* it's not there */
+ }
+
+ /* not present, make new entry */
+ current = pg_malloc(sizeof *current);
+ current->name = pg_strdup(name);
+ current->value = NULL;
+ current->substitute_hook = shook;
+ current->assign_hook = ahook;
+ current->next = previous->next;
+ previous->next = current;
+ if (shook)
+ current->value = (*shook) (current->value);
+ if (ahook)
+ (void) (*ahook) (current->value);
+}
+
+/*
+ * Return true iff the named variable has substitute and/or assign hook
+ * functions.
+ */
+bool
+VariableHasHook(VariableSpace space, const char *name)
+{
+ struct _variable *current;
+
+ Assert(space);
+ Assert(name);
+
+ for (current = space->next; current; current = current->next)
+ {
+ int cmp = strcmp(current->name, name);
+
+ if (cmp == 0)
+ return (current->substitute_hook != NULL ||
+ current->assign_hook != NULL);
+ if (cmp > 0)
+ break; /* it's not there */
+ }
+
+ return false;
+}
+
+/*
+ * Convenience function to set a variable's value to "on".
+ */
+bool
+SetVariableBool(VariableSpace space, const char *name)
+{
+ return SetVariable(space, name, "on");
+}
+
+/*
+ * Attempt to delete variable.
+ *
+ * If unsuccessful, print a message and return "false".
+ * Deleting a nonexistent variable is not an error.
+ */
+bool
+DeleteVariable(VariableSpace space, const char *name)
+{
+ return SetVariable(space, name, NULL);
+}
+
+/*
+ * Emit error with suggestions for variables or commands
+ * accepting enum-style arguments.
+ * This function just exists to standardize the wording.
+ * suggestions should follow the format "fee, fi, fo, fum".
+ */
+void
+PsqlVarEnumError(const char *name, const char *value, const char *suggestions)
+{
+ pg_log_error("unrecognized value \"%s\" for \"%s\"\n"
+ "Available values are: %s.",
+ value, name, suggestions);
+}
diff --git a/src/bin/psql/variables.h b/src/bin/psql/variables.h
new file mode 100644
index 0000000..e57933f
--- /dev/null
+++ b/src/bin/psql/variables.h
@@ -0,0 +1,97 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2022, PostgreSQL Global Development Group
+ *
+ * This implements a sort of variable repository. One could also think of it
+ * as a cheap version of an associative array. Each variable has a string
+ * name and a string value. The value can't be NULL, or more precisely
+ * that's not distinguishable from the variable being unset.
+ *
+ * src/bin/psql/variables.h
+ */
+#ifndef VARIABLES_H
+#define VARIABLES_H
+
+/*
+ * Variables can be given "assign hook" functions. The assign hook can
+ * prevent invalid values from being assigned, and can update internal C
+ * variables to keep them in sync with the variable's current value.
+ *
+ * An assign hook function is called before any attempted assignment, with the
+ * proposed new value of the variable (or with NULL, if an \unset is being
+ * attempted). If it returns false, the assignment doesn't occur --- it
+ * should print an error message with pg_log_error() to tell the user why.
+ *
+ * When an assign hook function is installed with SetVariableHooks(), it is
+ * called with the variable's current value (or with NULL, if it wasn't set
+ * yet). But its return value is ignored in this case. The hook should be
+ * set before any possibly-invalid value can be assigned.
+ */
+typedef bool (*VariableAssignHook) (const char *newval);
+
+/*
+ * Variables can also be given "substitute hook" functions. The substitute
+ * hook can replace values (including NULL) with other values, allowing
+ * normalization of variable contents. For example, for a boolean variable,
+ * we wish to interpret "\unset FOO" as "\set FOO off", and we can do that
+ * by installing a substitute hook. (We can use the same substitute hook
+ * for all bool or nearly-bool variables, which is why this responsibility
+ * isn't part of the assign hook.)
+ *
+ * The substitute hook is called before any attempted assignment, and before
+ * the assign hook if any, passing the proposed new value of the variable as a
+ * malloc'd string (or NULL, if an \unset is being attempted). It can return
+ * the same value, or a different malloc'd string, or modify the string
+ * in-place. It should free the passed-in value if it's not returning it.
+ * The substitute hook generally should not complain about erroneous values;
+ * that's a job for the assign hook.
+ *
+ * When a substitute hook is installed with SetVariableHooks(), it is applied
+ * to the variable's current value (typically NULL, if it wasn't set yet).
+ * That also happens before applying the assign hook.
+ */
+typedef char *(*VariableSubstituteHook) (char *newval);
+
+/*
+ * Data structure representing one variable.
+ *
+ * Note: if value == NULL then the variable is logically unset, but we are
+ * keeping the struct around so as not to forget about its hook function(s).
+ */
+struct _variable
+{
+ char *name;
+ char *value;
+ VariableSubstituteHook substitute_hook;
+ VariableAssignHook assign_hook;
+ struct _variable *next;
+};
+
+/* Data structure representing a set of variables */
+typedef struct _variable *VariableSpace;
+
+
+VariableSpace CreateVariableSpace(void);
+const char *GetVariable(VariableSpace space, const char *name);
+
+bool ParseVariableBool(const char *value, const char *name,
+ bool *result);
+
+bool ParseVariableNum(const char *value, const char *name,
+ int *result);
+
+void PrintVariables(VariableSpace space);
+
+bool SetVariable(VariableSpace space, const char *name, const char *value);
+bool SetVariableBool(VariableSpace space, const char *name);
+bool DeleteVariable(VariableSpace space, const char *name);
+
+void SetVariableHooks(VariableSpace space, const char *name,
+ VariableSubstituteHook shook,
+ VariableAssignHook ahook);
+bool VariableHasHook(VariableSpace space, const char *name);
+
+void PsqlVarEnumError(const char *name, const char *value, const char *suggestions);
+
+#endif /* VARIABLES_H */
diff --git a/src/bin/scripts/.gitignore b/src/bin/scripts/.gitignore
new file mode 100644
index 0000000..0f23fe0
--- /dev/null
+++ b/src/bin/scripts/.gitignore
@@ -0,0 +1,10 @@
+/clusterdb
+/createdb
+/createuser
+/dropdb
+/dropuser
+/reindexdb
+/vacuumdb
+/pg_isready
+
+/tmp_check/
diff --git a/src/bin/scripts/Makefile b/src/bin/scripts/Makefile
new file mode 100644
index 0000000..25e7da3
--- /dev/null
+++ b/src/bin/scripts/Makefile
@@ -0,0 +1,62 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/scripts
+#
+# Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/bin/scripts/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "PostgreSQL utility"
+PGAPPICON=win32
+
+subdir = src/bin/scripts
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+PROGRAMS = createdb createuser dropdb dropuser clusterdb vacuumdb reindexdb pg_isready
+
+override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+all: $(PROGRAMS)
+
+createdb: createdb.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+createuser: createuser.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+dropdb: dropdb.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+dropuser: dropuser.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+clusterdb: clusterdb.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+vacuumdb: vacuumdb.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+reindexdb: reindexdb.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+pg_isready: pg_isready.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+
+install: all installdirs
+ $(INSTALL_PROGRAM) createdb$(X) '$(DESTDIR)$(bindir)'/createdb$(X)
+ $(INSTALL_PROGRAM) dropdb$(X) '$(DESTDIR)$(bindir)'/dropdb$(X)
+ $(INSTALL_PROGRAM) createuser$(X) '$(DESTDIR)$(bindir)'/createuser$(X)
+ $(INSTALL_PROGRAM) dropuser$(X) '$(DESTDIR)$(bindir)'/dropuser$(X)
+ $(INSTALL_PROGRAM) clusterdb$(X) '$(DESTDIR)$(bindir)'/clusterdb$(X)
+ $(INSTALL_PROGRAM) vacuumdb$(X) '$(DESTDIR)$(bindir)'/vacuumdb$(X)
+ $(INSTALL_PROGRAM) reindexdb$(X) '$(DESTDIR)$(bindir)'/reindexdb$(X)
+ $(INSTALL_PROGRAM) pg_isready$(X) '$(DESTDIR)$(bindir)'/pg_isready$(X)
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f $(addprefix '$(DESTDIR)$(bindir)'/, $(addsuffix $(X), $(PROGRAMS)))
+
+clean distclean maintainer-clean:
+ rm -f $(addsuffix $(X), $(PROGRAMS)) $(addsuffix .o, $(PROGRAMS))
+ rm -f common.o $(WIN32RES)
+ rm -rf tmp_check
+
+export with_icu
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/scripts/clusterdb.c b/src/bin/scripts/clusterdb.c
new file mode 100644
index 0000000..bc5a109
--- /dev/null
+++ b/src/bin/scripts/clusterdb.c
@@ -0,0 +1,286 @@
+/*-------------------------------------------------------------------------
+ *
+ * clusterdb
+ *
+ * Portions Copyright (c) 2002-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/scripts/clusterdb.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+#include "common.h"
+#include "common/logging.h"
+#include "fe_utils/cancel.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/query_utils.h"
+#include "fe_utils/simple_list.h"
+#include "fe_utils/string_utils.h"
+
+
+static void cluster_one_database(const ConnParams *cparams, const char *table,
+ const char *progname, bool verbose, bool echo);
+static void cluster_all_databases(ConnParams *cparams, const char *progname,
+ bool verbose, bool echo, bool quiet);
+static void help(const char *progname);
+
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"echo", no_argument, NULL, 'e'},
+ {"quiet", no_argument, NULL, 'q'},
+ {"dbname", required_argument, NULL, 'd'},
+ {"all", no_argument, NULL, 'a'},
+ {"table", required_argument, NULL, 't'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"maintenance-db", required_argument, NULL, 2},
+ {NULL, 0, NULL, 0}
+ };
+
+ const char *progname;
+ int optindex;
+ int c;
+
+ const char *dbname = NULL;
+ const char *maintenance_db = NULL;
+ char *host = NULL;
+ char *port = NULL;
+ char *username = NULL;
+ enum trivalue prompt_password = TRI_DEFAULT;
+ ConnParams cparams;
+ bool echo = false;
+ bool quiet = false;
+ bool alldb = false;
+ bool verbose = false;
+ SimpleStringList tables = {NULL, NULL};
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
+
+ handle_help_version_opts(argc, argv, "clusterdb", help);
+
+ while ((c = getopt_long(argc, argv, "h:p:U:wWeqd:at:v", long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'h':
+ host = pg_strdup(optarg);
+ break;
+ case 'p':
+ port = pg_strdup(optarg);
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'w':
+ prompt_password = TRI_NO;
+ break;
+ case 'W':
+ prompt_password = TRI_YES;
+ break;
+ case 'e':
+ echo = true;
+ break;
+ case 'q':
+ quiet = true;
+ break;
+ case 'd':
+ dbname = pg_strdup(optarg);
+ break;
+ case 'a':
+ alldb = true;
+ break;
+ case 't':
+ simple_string_list_append(&tables, optarg);
+ break;
+ case 'v':
+ verbose = true;
+ break;
+ case 2:
+ maintenance_db = pg_strdup(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /*
+ * Non-option argument specifies database name as long as it wasn't
+ * already specified with -d / --dbname
+ */
+ if (optind < argc && dbname == NULL)
+ {
+ dbname = argv[optind];
+ optind++;
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* fill cparams except for dbname, which is set below */
+ cparams.pghost = host;
+ cparams.pgport = port;
+ cparams.pguser = username;
+ cparams.prompt_password = prompt_password;
+ cparams.override_dbname = NULL;
+
+ setup_cancel_handler(NULL);
+
+ if (alldb)
+ {
+ if (dbname)
+ pg_fatal("cannot cluster all databases and a specific one at the same time");
+
+ if (tables.head != NULL)
+ pg_fatal("cannot cluster specific table(s) in all databases");
+
+ cparams.dbname = maintenance_db;
+
+ cluster_all_databases(&cparams, progname, verbose, echo, quiet);
+ }
+ else
+ {
+ if (dbname == NULL)
+ {
+ if (getenv("PGDATABASE"))
+ dbname = getenv("PGDATABASE");
+ else if (getenv("PGUSER"))
+ dbname = getenv("PGUSER");
+ else
+ dbname = get_user_name_or_exit(progname);
+ }
+
+ cparams.dbname = dbname;
+
+ if (tables.head != NULL)
+ {
+ SimpleStringListCell *cell;
+
+ for (cell = tables.head; cell; cell = cell->next)
+ {
+ cluster_one_database(&cparams, cell->val,
+ progname, verbose, echo);
+ }
+ }
+ else
+ cluster_one_database(&cparams, NULL,
+ progname, verbose, echo);
+ }
+
+ exit(0);
+}
+
+
+static void
+cluster_one_database(const ConnParams *cparams, const char *table,
+ const char *progname, bool verbose, bool echo)
+{
+ PQExpBufferData sql;
+
+ PGconn *conn;
+
+ conn = connectDatabase(cparams, progname, echo, false, false);
+
+ initPQExpBuffer(&sql);
+
+ appendPQExpBufferStr(&sql, "CLUSTER");
+ if (verbose)
+ appendPQExpBufferStr(&sql, " VERBOSE");
+ if (table)
+ {
+ appendPQExpBufferChar(&sql, ' ');
+ appendQualifiedRelation(&sql, table, conn, echo);
+ }
+ appendPQExpBufferChar(&sql, ';');
+
+ if (!executeMaintenanceCommand(conn, sql.data, echo))
+ {
+ if (table)
+ pg_log_error("clustering of table \"%s\" in database \"%s\" failed: %s",
+ table, PQdb(conn), PQerrorMessage(conn));
+ else
+ pg_log_error("clustering of database \"%s\" failed: %s",
+ PQdb(conn), PQerrorMessage(conn));
+ PQfinish(conn);
+ exit(1);
+ }
+ PQfinish(conn);
+ termPQExpBuffer(&sql);
+}
+
+
+static void
+cluster_all_databases(ConnParams *cparams, const char *progname,
+ bool verbose, bool echo, bool quiet)
+{
+ PGconn *conn;
+ PGresult *result;
+ int i;
+
+ conn = connectMaintenanceDatabase(cparams, progname, echo);
+ result = executeQuery(conn,
+ "SELECT datname FROM pg_database WHERE datallowconn AND datconnlimit <> -2 ORDER BY 1;",
+ echo);
+ PQfinish(conn);
+
+ for (i = 0; i < PQntuples(result); i++)
+ {
+ char *dbname = PQgetvalue(result, i, 0);
+
+ if (!quiet)
+ {
+ printf(_("%s: clustering database \"%s\"\n"), progname, dbname);
+ fflush(stdout);
+ }
+
+ cparams->override_dbname = dbname;
+
+ cluster_one_database(cparams, NULL, progname, verbose, echo);
+ }
+
+ PQclear(result);
+}
+
+
+static void
+help(const char *progname)
+{
+ printf(_("%s clusters all previously clustered tables in a database.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DBNAME]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -a, --all cluster all databases\n"));
+ printf(_(" -d, --dbname=DBNAME database to cluster\n"));
+ printf(_(" -e, --echo show the commands being sent to the server\n"));
+ printf(_(" -q, --quiet don't write any messages\n"));
+ printf(_(" -t, --table=TABLE cluster specific table(s) only\n"));
+ printf(_(" -v, --verbose write a lot of output\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -U, --username=USERNAME user name to connect as\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt\n"));
+ printf(_(" --maintenance-db=DBNAME alternate maintenance database\n"));
+ printf(_("\nRead the description of the SQL command CLUSTER for details.\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/scripts/common.c b/src/bin/scripts/common.c
new file mode 100644
index 0000000..9e38b60
--- /dev/null
+++ b/src/bin/scripts/common.c
@@ -0,0 +1,167 @@
+/*-------------------------------------------------------------------------
+ *
+ * common.c
+ * Common support routines for bin/scripts/
+ *
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/scripts/common.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <signal.h>
+#include <unistd.h>
+
+#include "common.h"
+#include "common/connect.h"
+#include "common/logging.h"
+#include "common/string.h"
+#include "fe_utils/cancel.h"
+#include "fe_utils/query_utils.h"
+#include "fe_utils/string_utils.h"
+
+/*
+ * Split TABLE[(COLUMNS)] into TABLE and [(COLUMNS)] portions. When you
+ * finish using them, pg_free(*table). *columns is a pointer into "spec",
+ * possibly to its NUL terminator.
+ */
+void
+splitTableColumnsSpec(const char *spec, int encoding,
+ char **table, const char **columns)
+{
+ bool inquotes = false;
+ const char *cp = spec;
+
+ /*
+ * Find the first '(' not identifier-quoted. Based on
+ * dequote_downcase_identifier().
+ */
+ while (*cp && (*cp != '(' || inquotes))
+ {
+ if (*cp == '"')
+ {
+ if (inquotes && cp[1] == '"')
+ cp++; /* pair does not affect quoting */
+ else
+ inquotes = !inquotes;
+ cp++;
+ }
+ else
+ cp += PQmblenBounded(cp, encoding);
+ }
+ *table = pnstrdup(spec, cp - spec);
+ *columns = cp;
+}
+
+/*
+ * Break apart TABLE[(COLUMNS)] of "spec". With the reset_val of search_path
+ * in effect, have regclassin() interpret the TABLE portion. Append to "buf"
+ * the qualified name of TABLE, followed by any (COLUMNS). Exit on failure.
+ * We use this to interpret --table=foo under the search path psql would get,
+ * in advance of "ANALYZE public.foo" under the always-secure search path.
+ */
+void
+appendQualifiedRelation(PQExpBuffer buf, const char *spec,
+ PGconn *conn, bool echo)
+{
+ char *table;
+ const char *columns;
+ PQExpBufferData sql;
+ PGresult *res;
+ int ntups;
+
+ splitTableColumnsSpec(spec, PQclientEncoding(conn), &table, &columns);
+
+ /*
+ * Query must remain ABSOLUTELY devoid of unqualified names. This would
+ * be unnecessary given a regclassin() variant taking a search_path
+ * argument.
+ */
+ initPQExpBuffer(&sql);
+ appendPQExpBufferStr(&sql,
+ "SELECT c.relname, ns.nspname\n"
+ " FROM pg_catalog.pg_class c,"
+ " pg_catalog.pg_namespace ns\n"
+ " WHERE c.relnamespace OPERATOR(pg_catalog.=) ns.oid\n"
+ " AND c.oid OPERATOR(pg_catalog.=) ");
+ appendStringLiteralConn(&sql, table, conn);
+ appendPQExpBufferStr(&sql, "::pg_catalog.regclass;");
+
+ executeCommand(conn, "RESET search_path;", echo);
+
+ /*
+ * One row is a typical result, as is a nonexistent relation ERROR.
+ * regclassin() unconditionally accepts all-digits input as an OID; if no
+ * relation has that OID; this query returns no rows. Catalog corruption
+ * might elicit other row counts.
+ */
+ res = executeQuery(conn, sql.data, echo);
+ ntups = PQntuples(res);
+ if (ntups != 1)
+ {
+ pg_log_error(ngettext("query returned %d row instead of one: %s",
+ "query returned %d rows instead of one: %s",
+ ntups),
+ ntups, sql.data);
+ PQfinish(conn);
+ exit(1);
+ }
+ appendPQExpBufferStr(buf,
+ fmtQualifiedId(PQgetvalue(res, 0, 1),
+ PQgetvalue(res, 0, 0)));
+ appendPQExpBufferStr(buf, columns);
+ PQclear(res);
+ termPQExpBuffer(&sql);
+ pg_free(table);
+
+ PQclear(executeQuery(conn, ALWAYS_SECURE_SEARCH_PATH_SQL, echo));
+}
+
+
+/*
+ * Check yes/no answer in a localized way. 1=yes, 0=no, -1=neither.
+ */
+
+/* translator: abbreviation for "yes" */
+#define PG_YESLETTER gettext_noop("y")
+/* translator: abbreviation for "no" */
+#define PG_NOLETTER gettext_noop("n")
+
+bool
+yesno_prompt(const char *question)
+{
+ char prompt[256];
+
+ /*------
+ translator: This is a question followed by the translated options for
+ "yes" and "no". */
+ snprintf(prompt, sizeof(prompt), _("%s (%s/%s) "),
+ _(question), _(PG_YESLETTER), _(PG_NOLETTER));
+
+ for (;;)
+ {
+ char *resp;
+
+ resp = simple_prompt(prompt, true);
+
+ if (strcmp(resp, _(PG_YESLETTER)) == 0)
+ {
+ free(resp);
+ return true;
+ }
+ if (strcmp(resp, _(PG_NOLETTER)) == 0)
+ {
+ free(resp);
+ return false;
+ }
+ free(resp);
+
+ printf(_("Please answer \"%s\" or \"%s\".\n"),
+ _(PG_YESLETTER), _(PG_NOLETTER));
+ }
+}
diff --git a/src/bin/scripts/common.h b/src/bin/scripts/common.h
new file mode 100644
index 0000000..84a1be7
--- /dev/null
+++ b/src/bin/scripts/common.h
@@ -0,0 +1,26 @@
+/*
+ * common.h
+ * Common support routines for bin/scripts/
+ *
+ * Copyright (c) 2003-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/scripts/common.h
+ */
+#ifndef COMMON_H
+#define COMMON_H
+
+#include "common/username.h"
+#include "fe_utils/connect_utils.h"
+#include "getopt_long.h" /* pgrminclude ignore */
+#include "libpq-fe.h"
+#include "pqexpbuffer.h" /* pgrminclude ignore */
+
+extern void splitTableColumnsSpec(const char *spec, int encoding,
+ char **table, const char **columns);
+
+extern void appendQualifiedRelation(PQExpBuffer buf, const char *name,
+ PGconn *conn, bool echo);
+
+extern bool yesno_prompt(const char *question);
+
+#endif /* COMMON_H */
diff --git a/src/bin/scripts/createdb.c b/src/bin/scripts/createdb.c
new file mode 100644
index 0000000..a1482df
--- /dev/null
+++ b/src/bin/scripts/createdb.c
@@ -0,0 +1,308 @@
+/*-------------------------------------------------------------------------
+ *
+ * createdb
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/scripts/createdb.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "common.h"
+#include "common/logging.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/string_utils.h"
+
+
+static void help(const char *progname);
+
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"echo", no_argument, NULL, 'e'},
+ {"owner", required_argument, NULL, 'O'},
+ {"tablespace", required_argument, NULL, 'D'},
+ {"template", required_argument, NULL, 'T'},
+ {"encoding", required_argument, NULL, 'E'},
+ {"strategy", required_argument, NULL, 'S'},
+ {"lc-collate", required_argument, NULL, 1},
+ {"lc-ctype", required_argument, NULL, 2},
+ {"locale", required_argument, NULL, 'l'},
+ {"maintenance-db", required_argument, NULL, 3},
+ {"locale-provider", required_argument, NULL, 4},
+ {"icu-locale", required_argument, NULL, 5},
+ {NULL, 0, NULL, 0}
+ };
+
+ const char *progname;
+ int optindex;
+ int c;
+
+ const char *dbname = NULL;
+ const char *maintenance_db = NULL;
+ char *comment = NULL;
+ char *host = NULL;
+ char *port = NULL;
+ char *username = NULL;
+ enum trivalue prompt_password = TRI_DEFAULT;
+ ConnParams cparams;
+ bool echo = false;
+ char *owner = NULL;
+ char *tablespace = NULL;
+ char *template = NULL;
+ char *encoding = NULL;
+ char *strategy = NULL;
+ char *lc_collate = NULL;
+ char *lc_ctype = NULL;
+ char *locale = NULL;
+ char *locale_provider = NULL;
+ char *icu_locale = NULL;
+
+ PQExpBufferData sql;
+
+ PGconn *conn;
+ PGresult *result;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
+
+ handle_help_version_opts(argc, argv, "createdb", help);
+
+ while ((c = getopt_long(argc, argv, "h:p:U:wWeO:D:T:E:l:S:", long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'h':
+ host = pg_strdup(optarg);
+ break;
+ case 'p':
+ port = pg_strdup(optarg);
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'w':
+ prompt_password = TRI_NO;
+ break;
+ case 'W':
+ prompt_password = TRI_YES;
+ break;
+ case 'e':
+ echo = true;
+ break;
+ case 'O':
+ owner = pg_strdup(optarg);
+ break;
+ case 'D':
+ tablespace = pg_strdup(optarg);
+ break;
+ case 'T':
+ template = pg_strdup(optarg);
+ break;
+ case 'E':
+ encoding = pg_strdup(optarg);
+ break;
+ case 'S':
+ strategy = pg_strdup(optarg);
+ break;
+ case 1:
+ lc_collate = pg_strdup(optarg);
+ break;
+ case 2:
+ lc_ctype = pg_strdup(optarg);
+ break;
+ case 'l':
+ locale = pg_strdup(optarg);
+ break;
+ case 3:
+ maintenance_db = pg_strdup(optarg);
+ break;
+ case 4:
+ locale_provider = pg_strdup(optarg);
+ break;
+ case 5:
+ icu_locale = pg_strdup(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ switch (argc - optind)
+ {
+ case 0:
+ break;
+ case 1:
+ dbname = argv[optind];
+ break;
+ case 2:
+ dbname = argv[optind];
+ comment = argv[optind + 1];
+ break;
+ default:
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind + 2]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (locale)
+ {
+ if (!lc_ctype)
+ lc_ctype = locale;
+ if (!lc_collate)
+ lc_collate = locale;
+ }
+
+ if (encoding)
+ {
+ if (pg_char_to_encoding(encoding) < 0)
+ pg_fatal("\"%s\" is not a valid encoding name", encoding);
+ }
+
+ if (dbname == NULL)
+ {
+ if (getenv("PGDATABASE"))
+ dbname = getenv("PGDATABASE");
+ else if (getenv("PGUSER"))
+ dbname = getenv("PGUSER");
+ else
+ dbname = get_user_name_or_exit(progname);
+ }
+
+ /* No point in trying to use postgres db when creating postgres db. */
+ if (maintenance_db == NULL && strcmp(dbname, "postgres") == 0)
+ maintenance_db = "template1";
+
+ cparams.dbname = maintenance_db;
+ cparams.pghost = host;
+ cparams.pgport = port;
+ cparams.pguser = username;
+ cparams.prompt_password = prompt_password;
+ cparams.override_dbname = NULL;
+
+ conn = connectMaintenanceDatabase(&cparams, progname, echo);
+
+ initPQExpBuffer(&sql);
+
+ appendPQExpBuffer(&sql, "CREATE DATABASE %s",
+ fmtId(dbname));
+
+ if (owner)
+ appendPQExpBuffer(&sql, " OWNER %s", fmtId(owner));
+ if (tablespace)
+ appendPQExpBuffer(&sql, " TABLESPACE %s", fmtId(tablespace));
+ if (encoding)
+ {
+ appendPQExpBufferStr(&sql, " ENCODING ");
+ appendStringLiteralConn(&sql, encoding, conn);
+ }
+ if (strategy)
+ appendPQExpBuffer(&sql, " STRATEGY %s", fmtId(strategy));
+ if (template)
+ appendPQExpBuffer(&sql, " TEMPLATE %s", fmtId(template));
+ if (lc_collate)
+ {
+ appendPQExpBufferStr(&sql, " LC_COLLATE ");
+ appendStringLiteralConn(&sql, lc_collate, conn);
+ }
+ if (lc_ctype)
+ {
+ appendPQExpBufferStr(&sql, " LC_CTYPE ");
+ appendStringLiteralConn(&sql, lc_ctype, conn);
+ }
+ if (locale_provider)
+ appendPQExpBuffer(&sql, " LOCALE_PROVIDER %s", locale_provider);
+ if (icu_locale)
+ {
+ appendPQExpBufferStr(&sql, " ICU_LOCALE ");
+ appendStringLiteralConn(&sql, icu_locale, conn);
+ }
+
+ appendPQExpBufferChar(&sql, ';');
+
+ if (echo)
+ printf("%s\n", sql.data);
+ result = PQexec(conn, sql.data);
+
+ if (PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("database creation failed: %s", PQerrorMessage(conn));
+ PQfinish(conn);
+ exit(1);
+ }
+
+ PQclear(result);
+
+ if (comment)
+ {
+ printfPQExpBuffer(&sql, "COMMENT ON DATABASE %s IS ", fmtId(dbname));
+ appendStringLiteralConn(&sql, comment, conn);
+ appendPQExpBufferChar(&sql, ';');
+
+ if (echo)
+ printf("%s\n", sql.data);
+ result = PQexec(conn, sql.data);
+
+ if (PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("comment creation failed (database was created): %s",
+ PQerrorMessage(conn));
+ PQfinish(conn);
+ exit(1);
+ }
+
+ PQclear(result);
+ }
+
+ PQfinish(conn);
+
+ exit(0);
+}
+
+
+static void
+help(const char *progname)
+{
+ printf(_("%s creates a PostgreSQL database.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DBNAME] [DESCRIPTION]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -D, --tablespace=TABLESPACE default tablespace for the database\n"));
+ printf(_(" -e, --echo show the commands being sent to the server\n"));
+ printf(_(" -E, --encoding=ENCODING encoding for the database\n"));
+ printf(_(" -l, --locale=LOCALE locale settings for the database\n"));
+ printf(_(" --lc-collate=LOCALE LC_COLLATE setting for the database\n"));
+ printf(_(" --lc-ctype=LOCALE LC_CTYPE setting for the database\n"));
+ printf(_(" --icu-locale=LOCALE ICU locale setting for the database\n"));
+ printf(_(" --locale-provider={libc|icu}\n"
+ " locale provider for the database's default collation\n"));
+ printf(_(" -O, --owner=OWNER database user to own the new database\n"));
+ printf(_(" -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"));
+ printf(_(" -T, --template=TEMPLATE template database to copy\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -U, --username=USERNAME user name to connect as\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt\n"));
+ printf(_(" --maintenance-db=DBNAME alternate maintenance database\n"));
+ printf(_("\nBy default, a database with the same name as the current user is created.\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/scripts/createuser.c b/src/bin/scripts/createuser.c
new file mode 100644
index 0000000..bfba0d0
--- /dev/null
+++ b/src/bin/scripts/createuser.c
@@ -0,0 +1,378 @@
+/*-------------------------------------------------------------------------
+ *
+ * createuser
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/scripts/createuser.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <limits.h>
+
+#include "common.h"
+#include "common/logging.h"
+#include "common/string.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/simple_list.h"
+#include "fe_utils/string_utils.h"
+
+
+static void help(const char *progname);
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"role", required_argument, NULL, 'g'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"echo", no_argument, NULL, 'e'},
+ {"createdb", no_argument, NULL, 'd'},
+ {"no-createdb", no_argument, NULL, 'D'},
+ {"superuser", no_argument, NULL, 's'},
+ {"no-superuser", no_argument, NULL, 'S'},
+ {"createrole", no_argument, NULL, 'r'},
+ {"no-createrole", no_argument, NULL, 'R'},
+ {"inherit", no_argument, NULL, 'i'},
+ {"no-inherit", no_argument, NULL, 'I'},
+ {"login", no_argument, NULL, 'l'},
+ {"no-login", no_argument, NULL, 'L'},
+ {"replication", no_argument, NULL, 1},
+ {"no-replication", no_argument, NULL, 2},
+ {"interactive", no_argument, NULL, 3},
+ {"connection-limit", required_argument, NULL, 'c'},
+ {"pwprompt", no_argument, NULL, 'P'},
+ {"encrypted", no_argument, NULL, 'E'},
+ {NULL, 0, NULL, 0}
+ };
+
+ const char *progname;
+ int optindex;
+ int c;
+ const char *newuser = NULL;
+ char *host = NULL;
+ char *port = NULL;
+ char *username = NULL;
+ SimpleStringList roles = {NULL, NULL};
+ enum trivalue prompt_password = TRI_DEFAULT;
+ ConnParams cparams;
+ bool echo = false;
+ bool interactive = false;
+ int conn_limit = -2; /* less than minimum valid value */
+ bool pwprompt = false;
+ char *newpassword = NULL;
+
+ /* Tri-valued variables. */
+ enum trivalue createdb = TRI_DEFAULT,
+ superuser = TRI_DEFAULT,
+ createrole = TRI_DEFAULT,
+ inherit = TRI_DEFAULT,
+ login = TRI_DEFAULT,
+ replication = TRI_DEFAULT;
+
+ PQExpBufferData sql;
+
+ PGconn *conn;
+ PGresult *result;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
+
+ handle_help_version_opts(argc, argv, "createuser", help);
+
+ while ((c = getopt_long(argc, argv, "h:p:U:g:wWedDsSrRiIlLc:PE",
+ long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'h':
+ host = pg_strdup(optarg);
+ break;
+ case 'p':
+ port = pg_strdup(optarg);
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'g':
+ simple_string_list_append(&roles, optarg);
+ break;
+ case 'w':
+ prompt_password = TRI_NO;
+ break;
+ case 'W':
+ prompt_password = TRI_YES;
+ break;
+ case 'e':
+ echo = true;
+ break;
+ case 'd':
+ createdb = TRI_YES;
+ break;
+ case 'D':
+ createdb = TRI_NO;
+ break;
+ case 's':
+ superuser = TRI_YES;
+ break;
+ case 'S':
+ superuser = TRI_NO;
+ break;
+ case 'r':
+ createrole = TRI_YES;
+ break;
+ case 'R':
+ createrole = TRI_NO;
+ break;
+ case 'i':
+ inherit = TRI_YES;
+ break;
+ case 'I':
+ inherit = TRI_NO;
+ break;
+ case 'l':
+ login = TRI_YES;
+ break;
+ case 'L':
+ login = TRI_NO;
+ break;
+ case 'c':
+ if (!option_parse_int(optarg, "-c/--connection-limit",
+ -1, INT_MAX, &conn_limit))
+ exit(1);
+ break;
+ case 'P':
+ pwprompt = true;
+ break;
+ case 'E':
+ /* no-op, accepted for backward compatibility */
+ break;
+ case 1:
+ replication = TRI_YES;
+ break;
+ case 2:
+ replication = TRI_NO;
+ break;
+ case 3:
+ interactive = true;
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ switch (argc - optind)
+ {
+ case 0:
+ break;
+ case 1:
+ newuser = argv[optind];
+ break;
+ default:
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind + 1]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (newuser == NULL)
+ {
+ if (interactive)
+ {
+ newuser = simple_prompt("Enter name of role to add: ", true);
+ }
+ else
+ {
+ if (getenv("PGUSER"))
+ newuser = getenv("PGUSER");
+ else
+ newuser = get_user_name_or_exit(progname);
+ }
+ }
+
+ if (pwprompt)
+ {
+ char *pw2;
+
+ newpassword = simple_prompt("Enter password for new role: ", false);
+ pw2 = simple_prompt("Enter it again: ", false);
+ if (strcmp(newpassword, pw2) != 0)
+ {
+ fprintf(stderr, _("Passwords didn't match.\n"));
+ exit(1);
+ }
+ free(pw2);
+ }
+
+ if (superuser == 0)
+ {
+ if (interactive && yesno_prompt("Shall the new role be a superuser?"))
+ superuser = TRI_YES;
+ else
+ superuser = TRI_NO;
+ }
+
+ if (superuser == TRI_YES)
+ {
+ /* Not much point in trying to restrict a superuser */
+ createdb = TRI_YES;
+ createrole = TRI_YES;
+ }
+
+ if (createdb == 0)
+ {
+ if (interactive && yesno_prompt("Shall the new role be allowed to create databases?"))
+ createdb = TRI_YES;
+ else
+ createdb = TRI_NO;
+ }
+
+ if (createrole == 0)
+ {
+ if (interactive && yesno_prompt("Shall the new role be allowed to create more new roles?"))
+ createrole = TRI_YES;
+ else
+ createrole = TRI_NO;
+ }
+
+ if (inherit == 0)
+ inherit = TRI_YES;
+
+ if (login == 0)
+ login = TRI_YES;
+
+ cparams.dbname = NULL; /* this program lacks any dbname option... */
+ cparams.pghost = host;
+ cparams.pgport = port;
+ cparams.pguser = username;
+ cparams.prompt_password = prompt_password;
+ cparams.override_dbname = NULL;
+
+ conn = connectMaintenanceDatabase(&cparams, progname, echo);
+
+ initPQExpBuffer(&sql);
+
+ printfPQExpBuffer(&sql, "CREATE ROLE %s", fmtId(newuser));
+ if (newpassword)
+ {
+ char *encrypted_password;
+
+ appendPQExpBufferStr(&sql, " PASSWORD ");
+
+ encrypted_password = PQencryptPasswordConn(conn,
+ newpassword,
+ newuser,
+ NULL);
+ if (!encrypted_password)
+ pg_fatal("password encryption failed: %s",
+ PQerrorMessage(conn));
+ appendStringLiteralConn(&sql, encrypted_password, conn);
+ PQfreemem(encrypted_password);
+ }
+ if (superuser == TRI_YES)
+ appendPQExpBufferStr(&sql, " SUPERUSER");
+ if (superuser == TRI_NO)
+ appendPQExpBufferStr(&sql, " NOSUPERUSER");
+ if (createdb == TRI_YES)
+ appendPQExpBufferStr(&sql, " CREATEDB");
+ if (createdb == TRI_NO)
+ appendPQExpBufferStr(&sql, " NOCREATEDB");
+ if (createrole == TRI_YES)
+ appendPQExpBufferStr(&sql, " CREATEROLE");
+ if (createrole == TRI_NO)
+ appendPQExpBufferStr(&sql, " NOCREATEROLE");
+ if (inherit == TRI_YES)
+ appendPQExpBufferStr(&sql, " INHERIT");
+ if (inherit == TRI_NO)
+ appendPQExpBufferStr(&sql, " NOINHERIT");
+ if (login == TRI_YES)
+ appendPQExpBufferStr(&sql, " LOGIN");
+ if (login == TRI_NO)
+ appendPQExpBufferStr(&sql, " NOLOGIN");
+ if (replication == TRI_YES)
+ appendPQExpBufferStr(&sql, " REPLICATION");
+ if (replication == TRI_NO)
+ appendPQExpBufferStr(&sql, " NOREPLICATION");
+ if (conn_limit >= -1)
+ appendPQExpBuffer(&sql, " CONNECTION LIMIT %d", conn_limit);
+ if (roles.head != NULL)
+ {
+ SimpleStringListCell *cell;
+
+ appendPQExpBufferStr(&sql, " IN ROLE ");
+
+ for (cell = roles.head; cell; cell = cell->next)
+ {
+ if (cell->next)
+ appendPQExpBuffer(&sql, "%s,", fmtId(cell->val));
+ else
+ appendPQExpBufferStr(&sql, fmtId(cell->val));
+ }
+ }
+ appendPQExpBufferChar(&sql, ';');
+
+ if (echo)
+ printf("%s\n", sql.data);
+ result = PQexec(conn, sql.data);
+
+ if (PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("creation of new role failed: %s", PQerrorMessage(conn));
+ PQfinish(conn);
+ exit(1);
+ }
+
+ PQclear(result);
+ PQfinish(conn);
+ exit(0);
+}
+
+
+static void
+help(const char *progname)
+{
+ printf(_("%s creates a new PostgreSQL role.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [ROLENAME]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -c, --connection-limit=N connection limit for role (default: no limit)\n"));
+ printf(_(" -d, --createdb role can create new databases\n"));
+ printf(_(" -D, --no-createdb role cannot create databases (default)\n"));
+ printf(_(" -e, --echo show the commands being sent to the server\n"));
+ printf(_(" -g, --role=ROLE new role will be a member of this role\n"));
+ printf(_(" -i, --inherit role inherits privileges of roles it is a\n"
+ " member of (default)\n"));
+ printf(_(" -I, --no-inherit role does not inherit privileges\n"));
+ printf(_(" -l, --login role can login (default)\n"));
+ printf(_(" -L, --no-login role cannot login\n"));
+ printf(_(" -P, --pwprompt assign a password to new role\n"));
+ printf(_(" -r, --createrole role can create new roles\n"));
+ printf(_(" -R, --no-createrole role cannot create roles (default)\n"));
+ printf(_(" -s, --superuser role will be superuser\n"));
+ printf(_(" -S, --no-superuser role will not be superuser (default)\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" --interactive prompt for missing role name and attributes rather\n"
+ " than using defaults\n"));
+ printf(_(" --replication role can initiate replication\n"));
+ printf(_(" --no-replication role cannot initiate replication\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -U, --username=USERNAME user name to connect as (not the one to create)\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/scripts/dropdb.c b/src/bin/scripts/dropdb.c
new file mode 100644
index 0000000..afc00da
--- /dev/null
+++ b/src/bin/scripts/dropdb.c
@@ -0,0 +1,190 @@
+/*-------------------------------------------------------------------------
+ *
+ * dropdb
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/scripts/dropdb.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+#include "common.h"
+#include "common/logging.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/string_utils.h"
+
+
+static void help(const char *progname);
+
+
+int
+main(int argc, char *argv[])
+{
+ static int if_exists = 0;
+
+ static struct option long_options[] = {
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"echo", no_argument, NULL, 'e'},
+ {"interactive", no_argument, NULL, 'i'},
+ {"if-exists", no_argument, &if_exists, 1},
+ {"maintenance-db", required_argument, NULL, 2},
+ {"force", no_argument, NULL, 'f'},
+ {NULL, 0, NULL, 0}
+ };
+
+ const char *progname;
+ int optindex;
+ int c;
+
+ char *dbname = NULL;
+ char *maintenance_db = NULL;
+ char *host = NULL;
+ char *port = NULL;
+ char *username = NULL;
+ enum trivalue prompt_password = TRI_DEFAULT;
+ ConnParams cparams;
+ bool echo = false;
+ bool interactive = false;
+ bool force = false;
+
+ PQExpBufferData sql;
+
+ PGconn *conn;
+ PGresult *result;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
+
+ handle_help_version_opts(argc, argv, "dropdb", help);
+
+ while ((c = getopt_long(argc, argv, "h:p:U:wWeif", long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'h':
+ host = pg_strdup(optarg);
+ break;
+ case 'p':
+ port = pg_strdup(optarg);
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'w':
+ prompt_password = TRI_NO;
+ break;
+ case 'W':
+ prompt_password = TRI_YES;
+ break;
+ case 'e':
+ echo = true;
+ break;
+ case 'i':
+ interactive = true;
+ break;
+ case 'f':
+ force = true;
+ break;
+ case 0:
+ /* this covers the long options */
+ break;
+ case 2:
+ maintenance_db = pg_strdup(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ switch (argc - optind)
+ {
+ case 0:
+ pg_log_error("missing required argument database name");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ case 1:
+ dbname = argv[optind];
+ break;
+ default:
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind + 1]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (interactive)
+ {
+ printf(_("Database \"%s\" will be permanently removed.\n"), dbname);
+ if (!yesno_prompt("Are you sure?"))
+ exit(0);
+ }
+
+ initPQExpBuffer(&sql);
+
+ appendPQExpBuffer(&sql, "DROP DATABASE %s%s%s;",
+ (if_exists ? "IF EXISTS " : ""),
+ fmtId(dbname),
+ force ? " WITH (FORCE)" : "");
+
+ /* Avoid trying to drop postgres db while we are connected to it. */
+ if (maintenance_db == NULL && strcmp(dbname, "postgres") == 0)
+ maintenance_db = "template1";
+
+ cparams.dbname = maintenance_db;
+ cparams.pghost = host;
+ cparams.pgport = port;
+ cparams.pguser = username;
+ cparams.prompt_password = prompt_password;
+ cparams.override_dbname = NULL;
+
+ conn = connectMaintenanceDatabase(&cparams, progname, echo);
+
+ if (echo)
+ printf("%s\n", sql.data);
+ result = PQexec(conn, sql.data);
+ if (PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("database removal failed: %s", PQerrorMessage(conn));
+ PQfinish(conn);
+ exit(1);
+ }
+
+ PQclear(result);
+ PQfinish(conn);
+ exit(0);
+}
+
+
+static void
+help(const char *progname)
+{
+ printf(_("%s removes a PostgreSQL database.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... DBNAME\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -e, --echo show the commands being sent to the server\n"));
+ printf(_(" -f, --force try to terminate other connections before dropping\n"));
+ printf(_(" -i, --interactive prompt before deleting anything\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" --if-exists don't report error if database doesn't exist\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -U, --username=USERNAME user name to connect as\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt\n"));
+ printf(_(" --maintenance-db=DBNAME alternate maintenance database\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/scripts/dropuser.c b/src/bin/scripts/dropuser.c
new file mode 100644
index 0000000..82c1f35
--- /dev/null
+++ b/src/bin/scripts/dropuser.c
@@ -0,0 +1,187 @@
+/*-------------------------------------------------------------------------
+ *
+ * dropuser
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/scripts/dropuser.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+#include "common.h"
+#include "common/logging.h"
+#include "common/string.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/string_utils.h"
+
+
+static void help(const char *progname);
+
+
+int
+main(int argc, char *argv[])
+{
+ static int if_exists = 0;
+
+ static struct option long_options[] = {
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"echo", no_argument, NULL, 'e'},
+ {"interactive", no_argument, NULL, 'i'},
+ {"if-exists", no_argument, &if_exists, 1},
+ {NULL, 0, NULL, 0}
+ };
+
+ const char *progname;
+ int optindex;
+ int c;
+
+ char *dropuser = NULL;
+ char *host = NULL;
+ char *port = NULL;
+ char *username = NULL;
+ enum trivalue prompt_password = TRI_DEFAULT;
+ ConnParams cparams;
+ bool echo = false;
+ bool interactive = false;
+
+ PQExpBufferData sql;
+
+ PGconn *conn;
+ PGresult *result;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
+
+ handle_help_version_opts(argc, argv, "dropuser", help);
+
+ while ((c = getopt_long(argc, argv, "h:p:U:wWei", long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'h':
+ host = pg_strdup(optarg);
+ break;
+ case 'p':
+ port = pg_strdup(optarg);
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'w':
+ prompt_password = TRI_NO;
+ break;
+ case 'W':
+ prompt_password = TRI_YES;
+ break;
+ case 'e':
+ echo = true;
+ break;
+ case 'i':
+ interactive = true;
+ break;
+ case 0:
+ /* this covers the long options */
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ switch (argc - optind)
+ {
+ case 0:
+ break;
+ case 1:
+ dropuser = argv[optind];
+ break;
+ default:
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind + 1]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (dropuser == NULL)
+ {
+ if (interactive)
+ {
+ dropuser = simple_prompt("Enter name of role to drop: ", true);
+ }
+ else
+ {
+ pg_log_error("missing required argument role name");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ if (interactive)
+ {
+ printf(_("Role \"%s\" will be permanently removed.\n"), dropuser);
+ if (!yesno_prompt("Are you sure?"))
+ exit(0);
+ }
+
+ cparams.dbname = NULL; /* this program lacks any dbname option... */
+ cparams.pghost = host;
+ cparams.pgport = port;
+ cparams.pguser = username;
+ cparams.prompt_password = prompt_password;
+ cparams.override_dbname = NULL;
+
+ conn = connectMaintenanceDatabase(&cparams, progname, echo);
+
+ initPQExpBuffer(&sql);
+ appendPQExpBuffer(&sql, "DROP ROLE %s%s;",
+ (if_exists ? "IF EXISTS " : ""), fmtId(dropuser));
+
+ if (echo)
+ printf("%s\n", sql.data);
+ result = PQexec(conn, sql.data);
+
+ if (PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("removal of role \"%s\" failed: %s",
+ dropuser, PQerrorMessage(conn));
+ PQfinish(conn);
+ exit(1);
+ }
+
+ PQclear(result);
+ PQfinish(conn);
+ exit(0);
+}
+
+
+static void
+help(const char *progname)
+{
+ printf(_("%s removes a PostgreSQL role.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [ROLENAME]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -e, --echo show the commands being sent to the server\n"));
+ printf(_(" -i, --interactive prompt before deleting anything, and prompt for\n"
+ " role name if not specified\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" --if-exists don't report error if user doesn't exist\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -U, --username=USERNAME user name to connect as (not the one to drop)\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/scripts/nls.mk b/src/bin/scripts/nls.mk
new file mode 100644
index 0000000..9044fda
--- /dev/null
+++ b/src/bin/scripts/nls.mk
@@ -0,0 +1,17 @@
+# src/bin/scripts/nls.mk
+CATALOG_NAME = pgscripts
+AVAIL_LANGUAGES = cs de el es fr it ja ka ko pt_BR ru sv tr uk zh_CN
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ createdb.c createuser.c \
+ dropdb.c dropuser.c \
+ clusterdb.c vacuumdb.c reindexdb.c \
+ pg_isready.c \
+ common.c \
+ ../../fe_utils/parallel_slot.c \
+ ../../fe_utils/cancel.c ../../fe_utils/print.c \
+ ../../fe_utils/connect_utils.c \
+ ../../fe_utils/option_utils.c \
+ ../../fe_utils/query_utils.c \
+ ../../common/fe_memutils.c ../../common/username.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) simple_prompt yesno_prompt
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/scripts/pg_isready.c b/src/bin/scripts/pg_isready.c
new file mode 100644
index 0000000..1aa8347
--- /dev/null
+++ b/src/bin/scripts/pg_isready.c
@@ -0,0 +1,242 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_isready --- checks the status of the PostgreSQL server
+ *
+ * Copyright (c) 2013-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/scripts/pg_isready.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+#include "common.h"
+#include "common/logging.h"
+#include "fe_utils/option_utils.h"
+
+#define DEFAULT_CONNECT_TIMEOUT "3"
+
+static void
+ help(const char *progname);
+
+int
+main(int argc, char **argv)
+{
+ int c;
+
+ const char *progname;
+
+ const char *pghost = NULL;
+ const char *pgport = NULL;
+ const char *pguser = NULL;
+ const char *pgdbname = NULL;
+ const char *connect_timeout = DEFAULT_CONNECT_TIMEOUT;
+
+ const char *pghost_str = NULL;
+ const char *pghostaddr_str = NULL;
+ const char *pgport_str = NULL;
+
+#define PARAMS_ARRAY_SIZE 7
+
+ const char *keywords[PARAMS_ARRAY_SIZE];
+ const char *values[PARAMS_ARRAY_SIZE];
+
+ bool quiet = false;
+
+ PGPing rv;
+ PQconninfoOption *opts = NULL;
+ PQconninfoOption *defs = NULL;
+ PQconninfoOption *opt;
+ PQconninfoOption *def;
+ char *errmsg = NULL;
+
+ /*
+ * We accept user and database as options to avoid useless errors from
+ * connecting with invalid params
+ */
+
+ static struct option long_options[] = {
+ {"dbname", required_argument, NULL, 'd'},
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"quiet", no_argument, NULL, 'q'},
+ {"timeout", required_argument, NULL, 't'},
+ {"username", required_argument, NULL, 'U'},
+ {NULL, 0, NULL, 0}
+ };
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
+ handle_help_version_opts(argc, argv, progname, help);
+
+ while ((c = getopt_long(argc, argv, "d:h:p:qt:U:", long_options, NULL)) != -1)
+ {
+ switch (c)
+ {
+ case 'd':
+ pgdbname = pg_strdup(optarg);
+ break;
+ case 'h':
+ pghost = pg_strdup(optarg);
+ break;
+ case 'p':
+ pgport = pg_strdup(optarg);
+ break;
+ case 'q':
+ quiet = true;
+ break;
+ case 't':
+ connect_timeout = pg_strdup(optarg);
+ break;
+ case 'U':
+ pguser = pg_strdup(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+
+ /*
+ * We need to make sure we don't return 1 here because someone
+ * checking the return code might infer unintended meaning
+ */
+ exit(PQPING_NO_ATTEMPT);
+ }
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+
+ /*
+ * We need to make sure we don't return 1 here because someone
+ * checking the return code might infer unintended meaning
+ */
+ exit(PQPING_NO_ATTEMPT);
+ }
+
+ keywords[0] = "host";
+ values[0] = pghost;
+ keywords[1] = "port";
+ values[1] = pgport;
+ keywords[2] = "user";
+ values[2] = pguser;
+ keywords[3] = "dbname";
+ values[3] = pgdbname;
+ keywords[4] = "connect_timeout";
+ values[4] = connect_timeout;
+ keywords[5] = "fallback_application_name";
+ values[5] = progname;
+ keywords[6] = NULL;
+ values[6] = NULL;
+
+ /*
+ * Get the host and port so we can display them in our output
+ */
+ if (pgdbname &&
+ (strncmp(pgdbname, "postgresql://", 13) == 0 ||
+ strncmp(pgdbname, "postgres://", 11) == 0 ||
+ strchr(pgdbname, '=') != NULL))
+ {
+ opts = PQconninfoParse(pgdbname, &errmsg);
+ if (opts == NULL)
+ {
+ pg_log_error("%s", errmsg);
+ exit(PQPING_NO_ATTEMPT);
+ }
+ }
+
+ defs = PQconndefaults();
+ if (defs == NULL)
+ {
+ pg_log_error("could not fetch default options");
+ exit(PQPING_NO_ATTEMPT);
+ }
+
+ for (opt = opts, def = defs; def->keyword; def++)
+ {
+ if (strcmp(def->keyword, "host") == 0)
+ {
+ if (opt && opt->val)
+ pghost_str = opt->val;
+ else if (pghost)
+ pghost_str = pghost;
+ else if (def->val)
+ pghost_str = def->val;
+ else
+ pghost_str = DEFAULT_PGSOCKET_DIR;
+ }
+ else if (strcmp(def->keyword, "hostaddr") == 0)
+ {
+ if (opt && opt->val)
+ pghostaddr_str = opt->val;
+ else if (def->val)
+ pghostaddr_str = def->val;
+ }
+ else if (strcmp(def->keyword, "port") == 0)
+ {
+ if (opt && opt->val)
+ pgport_str = opt->val;
+ else if (pgport)
+ pgport_str = pgport;
+ else if (def->val)
+ pgport_str = def->val;
+ }
+
+ if (opt)
+ opt++;
+ }
+
+ rv = PQpingParams(keywords, values, 1);
+
+ if (!quiet)
+ {
+ printf("%s:%s - ",
+ pghostaddr_str != NULL ? pghostaddr_str : pghost_str,
+ pgport_str);
+
+ switch (rv)
+ {
+ case PQPING_OK:
+ printf(_("accepting connections\n"));
+ break;
+ case PQPING_REJECT:
+ printf(_("rejecting connections\n"));
+ break;
+ case PQPING_NO_RESPONSE:
+ printf(_("no response\n"));
+ break;
+ case PQPING_NO_ATTEMPT:
+ printf(_("no attempt\n"));
+ break;
+ default:
+ printf(_("unknown\n"));
+ }
+ }
+
+ exit(rv);
+}
+
+static void
+help(const char *progname)
+{
+ printf(_("%s issues a connection check to a PostgreSQL database.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]...\n"), progname);
+
+ printf(_("\nOptions:\n"));
+ printf(_(" -d, --dbname=DBNAME database name\n"));
+ printf(_(" -q, --quiet run quietly\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"), DEFAULT_CONNECT_TIMEOUT);
+ printf(_(" -U, --username=USERNAME user name to connect as\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/scripts/po/cs.po b/src/bin/scripts/po/cs.po
new file mode 100644
index 0000000..dead987
--- /dev/null
+++ b/src/bin/scripts/po/cs.po
@@ -0,0 +1,1267 @@
+# Czech translation of pgscripts messages.
+#
+# pgtranslation Id: pgscripts.po,v 1.3 2009/10/14 21:08:40 petere Exp $
+#
+# Karel Žák, 2001-2003, 2004.
+# Zdeněk Kotala, 2009, 2011, 2012, 2013.
+# Tomáš Vondra <tv@fuzzy.cz>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts-cs (PostgreSQL 9.3)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:16+0000\n"
+"PO-Revision-Date: 2021-09-16 09:15+0200\n"
+"Last-Translator: Tomas Vondra <tv@fuzzy.cz>\n"
+"Language-Team: Czech <info@cspug.cx>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.1\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "fatal: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "paměť vyčerpána\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nelze duplikovat nulový ukazatel (interní chyba)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "nelze nalézt effective user ID %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "uživatel neexistuje"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "chyba vyhledávání jména uživatele: chybový kód %lu"
+
+#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206
+msgid "Cancel request sent\n"
+msgstr "Požadavek na zrušení byl poslán\n"
+
+#: ../../fe_utils/cancel.c:165
+msgid "Could not send cancel request: "
+msgstr "Nelze poslat požadavek na zrušení: "
+
+#: ../../fe_utils/cancel.c:210
+#, c-format
+msgid "Could not send cancel request: %s"
+msgstr "Nelze poslat požadavek na zrušení: %s"
+
+#: ../../fe_utils/print.c:350
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu řádka)"
+msgstr[1] "(%lu řádky)"
+msgstr[2] "(%lu řádek)"
+
+#: ../../fe_utils/print.c:3055
+#, c-format
+msgid "Interrupted\n"
+msgstr "Přerušeno\n"
+
+#: ../../fe_utils/print.c:3119
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Nelze přidat hlavičku k obsahu tabulky: překročen počet sloupců %d.\n"
+
+#: ../../fe_utils/print.c:3159
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Nelze přidat buňku do obsahu tabulky: překročen celkový počet buněk %d.\n"
+
+#: ../../fe_utils/print.c:3414
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "specifikován neplatný formát výstupu (interní chyba): %d"
+
+#: clusterdb.c:110 clusterdb.c:129 createdb.c:122 createdb.c:141
+#: createuser.c:172 createuser.c:187 dropdb.c:102 dropdb.c:111 dropdb.c:119
+#: dropuser.c:93 dropuser.c:108 dropuser.c:123 pg_isready.c:95 pg_isready.c:109
+#: reindexdb.c:166 reindexdb.c:185 vacuumdb.c:225 vacuumdb.c:244
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: clusterdb.c:127 createdb.c:139 createuser.c:185 dropdb.c:117 dropuser.c:106
+#: pg_isready.c:107 reindexdb.c:183 vacuumdb.c:242
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "příliš mnoho parametrů příkazové řádky (první je \"%s\")"
+
+#: clusterdb.c:146
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "nelze provést cluster ve všech databázích a zároveň specifikovat jen jednu"
+
+#: clusterdb.c:152
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "nelze provést cluster specifické tabulky ve všech databázích"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "clusterování tabulky \"%s\" v databázi \"%s\" selhalo: %s"
+
+#: clusterdb.c:221
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "clusterování databáze \"%s\" selhalo: %s"
+
+#: clusterdb.c:249
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: provádí se cluster databáze \"%s\"\n"
+
+#: clusterdb.c:265
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s vytváří cluster všech již dříve clusterovaných tabulek v databázi.\n"
+"\n"
+
+#: clusterdb.c:266 createdb.c:266 createuser.c:354 dropdb.c:170 dropuser.c:170
+#: pg_isready.c:224 reindexdb.c:750 vacuumdb.c:911
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: clusterdb.c:267 reindexdb.c:751 vacuumdb.c:912
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [PŘEPÍNAČ]... [DATABÁZE]\n"
+
+#: clusterdb.c:268 createdb.c:268 createuser.c:356 dropdb.c:172 dropuser.c:172
+#: pg_isready.c:227 reindexdb.c:752 vacuumdb.c:913
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Přepínače:\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all clusterovat všechny databáze\n"
+
+#: clusterdb.c:270
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=DATABÁZE databáze pro cluster\n"
+
+#: clusterdb.c:271 createuser.c:360 dropdb.c:173 dropuser.c:173 reindexdb.c:756
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo ukazovat příkazy posílané na server\n"
+
+#: clusterdb.c:272 reindexdb.c:759
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet nevypisovat žádné zprávy\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABULKA provést cluster pro danou tabulku\n"
+
+#: clusterdb.c:274 reindexdb.c:763
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose vypisovat více informací\n"
+
+#: clusterdb.c:275 createuser.c:372 dropdb.c:176 dropuser.c:176 reindexdb.c:764
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ukáže informaci o verzi a skončí\n"
+
+#: clusterdb.c:276 createuser.c:377 dropdb.c:178 dropuser.c:178 reindexdb.c:765
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukáže tuto nápovědu a skončí\n"
+
+#: clusterdb.c:277 createdb.c:279 createuser.c:378 dropdb.c:179 dropuser.c:179
+#: pg_isready.c:233 reindexdb.c:766 vacuumdb.c:934
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Parametry spojení:\n"
+
+#: clusterdb.c:278 createuser.c:379 dropdb.c:180 dropuser.c:180 reindexdb.c:767
+#: vacuumdb.c:935
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME jméno databázového serveru nebo adresáře se soketem\n"
+
+#: clusterdb.c:279 createuser.c:380 dropdb.c:181 dropuser.c:181 reindexdb.c:768
+#: vacuumdb.c:936
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT port databázového serveru\n"
+
+#: clusterdb.c:280 dropdb.c:182 reindexdb.c:769 vacuumdb.c:937
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UŽIVATEL jméno uživatele pro spojení se serverem\n"
+
+#: clusterdb.c:281 createuser.c:382 dropdb.c:183 dropuser.c:183 reindexdb.c:770
+#: vacuumdb.c:938
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password neptá se na heslo\n"
+
+#: clusterdb.c:282 createuser.c:383 dropdb.c:184 dropuser.c:184 reindexdb.c:771
+#: vacuumdb.c:939
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password vynutí dotaz na heslo\n"
+
+#: clusterdb.c:283 dropdb.c:185 reindexdb.c:772 vacuumdb.c:940
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME alternativní maintenance databáze\n"
+
+#: clusterdb.c:284
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Pro detaily čtěte popis SQL příkazu CLUSTER.\n"
+
+#: clusterdb.c:285 createdb.c:287 createuser.c:384 dropdb.c:186 dropuser.c:185
+#: pg_isready.c:238 reindexdb.c:774 vacuumdb.c:942
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Chyby hlašte na <%s>.\n"
+
+#: clusterdb.c:286 createdb.c:288 createuser.c:385 dropdb.c:187 dropuser.c:186
+#: pg_isready.c:239 reindexdb.c:775 vacuumdb.c:943
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: common.c:80 common.c:138
+msgid "Password: "
+msgstr "Heslo: "
+
+#: common.c:125
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "nelze navázat spojení s databází %s: nedotatek paměti"
+
+#: common.c:152
+#, c-format
+msgid "could not connect to database %s: %s"
+msgstr "nelze navázat spojení s databází %s: %s"
+
+#: common.c:231 common.c:256
+#, c-format
+msgid "query failed: %s"
+msgstr "dotaz selhal: %s"
+
+#: common.c:232 common.c:257
+#, c-format
+msgid "query was: %s"
+msgstr "dotaz byl: %s"
+
+#: common.c:329
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "zpracování databáze \"%s\" selhalo: %s"
+
+#: common.c:423
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "dotaz vrátil %d řádku namísto jedné: %s"
+msgstr[1] "dotaz vrátil %d řádky namísto jedné: %s"
+msgstr[2] "dotaz vrátil %d řádek namísto jedné: %s"
+
+# translator: Make sure the (y/n) prompts match the translation of this.
+#. translator: abbreviation for "yes"
+#: common.c:447
+msgid "y"
+msgstr "a"
+
+# translator: Make sure the (y/n) prompts match the translation of this.
+#. translator: abbreviation for "no"
+#: common.c:449
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:459
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:473
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Prosím odpovězte \"%s\" nebo \"%s\".\n"
+
+#: createdb.c:149
+#, c-format
+msgid "only one of --locale and --lc-ctype can be specified"
+msgstr "--locale a --lc-ctype nelze zvolit současně"
+
+#: createdb.c:154
+#, c-format
+msgid "only one of --locale and --lc-collate can be specified"
+msgstr "--locale a --lc-collate nelze zvolit současně"
+
+#: createdb.c:165
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" není platné jméno kódování znaků"
+
+#: createdb.c:228
+#, c-format
+msgid "database creation failed: %s"
+msgstr "vytvoření databáze selhalo: %s"
+
+#: createdb.c:247
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "tvorba komentáře selhala (databáze byla vytvořena): %s"
+
+#: createdb.c:265
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s vytvoří PostgreSQL databázi.\n"
+"\n"
+
+#: createdb.c:267
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [PŘEPÍNAČ]... [DATABÁZE] [POPIS]\n"
+
+#: createdb.c:269
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=PROSTOR výchozí prostor tabulek pro databázi\n"
+
+#: createdb.c:270
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo ukázat příkazy posílané na server\n"
+
+#: createdb.c:271
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=KÓDOVÁNÍ kódování znaků databáze\n"
+
+#: createdb.c:272
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE nastavení locale pro databázi\n"
+
+#: createdb.c:273
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE nastavení LC_COLLATE pro databázi\n"
+
+#: createdb.c:274
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE nastavení LC_CTYPE pro databázi\n"
+
+#: createdb.c:275
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=VLASTNÍK uživatel, který má být vlastníkem nové databáze\n"
+
+#: createdb.c:276
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=ŠABLONA šablona databáze ke kopírování\n"
+
+#: createdb.c:277
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ukáže informaci o verzi a skončí\n"
+
+#: createdb.c:278
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukáže tuto nápovědu a skončí\n"
+
+#: createdb.c:280
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME jméno databázového serveru nebo adresáře se soketem\n"
+
+#: createdb.c:281
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT port databázového serveru\n"
+
+#: createdb.c:282
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UŽIVATEL jméno uživatele pro spojení se serverem\n"
+
+#: createdb.c:283
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password neptá se na heslo\n"
+
+#: createdb.c:284
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password vynutí dotaz na heslo\n"
+
+#: createdb.c:285
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME alternativní maintenance databáze\n"
+
+#: createdb.c:286
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Implicitně je vytvořena databáze stejného jména jako je jméno aktuálního uživatele.\n"
+
+#: createuser.c:151
+#, c-format
+msgid "invalid value for --connection-limit: %s"
+msgstr "chybná hodnota pro volbu --connection-limit: %s"
+
+#: createuser.c:195
+msgid "Enter name of role to add: "
+msgstr "Vložte jméno role, kterou chete přidat: "
+
+#: createuser.c:212
+msgid "Enter password for new role: "
+msgstr "Vložte heslo nové role: "
+
+#: createuser.c:214
+msgid "Enter it again: "
+msgstr "Zadejte znova: "
+
+#: createuser.c:217
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Hesla se neshodují.\n"
+
+#: createuser.c:225
+msgid "Shall the new role be a superuser?"
+msgstr "Má být nová role superuživatel?"
+
+#: createuser.c:240
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Měla by mít nová role právo vytvářet databáze?"
+
+#: createuser.c:248
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Měla by mít nová role právo vytvářet další nové role?"
+
+#: createuser.c:284
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "šifrování hesla selhalo: %s"
+
+#: createuser.c:339
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "tvorba nové role selhala: %s"
+
+#: createuser.c:353
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s vytvoří novou PostgreSQL roli.\n"
+"\n"
+
+#: createuser.c:355 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [PŘEPÍNAČ]... [JMÉNO ROLE]\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N limit počtu konexí pro role (implicitně: bez limitu)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb role může vytvářet nové databáze\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb role nemůže vytvářet nové databáze (výchozí)\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROLE nová role bude členem této role\n"
+
+#: createuser.c:362
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit role dědí práva rolí, kterých je členem\n"
+" (implicitně)\n"
+
+#: createuser.c:364
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit role nedědí práva\n"
+
+#: createuser.c:365
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login role se může přihlásit (implicitně)\n"
+
+#: createuser.c:366
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login role se nemůže přihlásit\n"
+
+#: createuser.c:367
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt nastavit heslo pro novou roli\n"
+
+#: createuser.c:368
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole role může vytvářet nové role\n"
+
+#: createuser.c:369
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole role nemůže vytvářet nové role (výchozí)\n"
+
+#: createuser.c:370
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser role bude superuživatel\n"
+
+#: createuser.c:371
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser role nebude superuživatel (výchozí)\n"
+
+#: createuser.c:373
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive zeptej se na chybějící jméno role a atributy namísto\n"
+" použití výchozích hodnot\n"
+
+#: createuser.c:375
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication role může inicializovat replikaci\n"
+
+#: createuser.c:376
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication role nemůže inicializovat replikaci\n"
+
+#: createuser.c:381
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=UŽIVATEL jméno uživatele pro spojení (ne pro tvorbu)\n"
+
+#: dropdb.c:110
+#, c-format
+msgid "missing required argument database name"
+msgstr "chybí vyžadovaný parametr jméno databáze"
+
+#: dropdb.c:125
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "Databáze \"%s\" bude trvale odstraněna.\n"
+
+#: dropdb.c:126 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Určitě?"
+
+#: dropdb.c:155
+#, c-format
+msgid "database removal failed: %s"
+msgstr "odstraňování databáze selhalo: %s"
+
+#: dropdb.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s odstraňuje PostgreSQL databázi.\n"
+"\n"
+
+#: dropdb.c:171
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [PŘEPÍNAČ]... DATABÁZE\n"
+
+#: dropdb.c:174
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force pokus se přerušit ostatní spojení před smazáním\n"
+
+#: dropdb.c:175
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive zeptej se před smazáním čehokoli\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists nevypisuj chybu pokud databáze neexistuje\n"
+
+#: dropuser.c:116
+msgid "Enter name of role to drop: "
+msgstr "Vložte jméno role pro odstranění: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "chybí povinný parametr jméno role"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Role \"%s\" bude trvale odstraněna.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "odstraňování role \"%s\" selhalo: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s odstraňuje PostgreSQL roli.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive před smazáním čehokoliv se zeptá, a také na jméno\n"
+" role pokud není zadáno\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists nevypisuj chybu pokud uživatel neexistuje\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=UŽIVATEL jméno uživatele pro spojení (ne pro odstranění)\n"
+
+#: pg_isready.c:144
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_isready.c:152
+#, c-format
+msgid "could not fetch default options"
+msgstr "nelze načíst výchozí volby"
+
+#: pg_isready.c:201
+#, c-format
+msgid "accepting connections\n"
+msgstr "server přijímá spojení\n"
+
+#: pg_isready.c:204
+#, c-format
+msgid "rejecting connections\n"
+msgstr "server odmítá spojení\n"
+
+#: pg_isready.c:207
+#, c-format
+msgid "no response\n"
+msgstr "žádná odpověď\n"
+
+#: pg_isready.c:210
+#, c-format
+msgid "no attempt\n"
+msgstr "žádný pokus\n"
+
+#: pg_isready.c:213
+#, c-format
+msgid "unknown\n"
+msgstr "neznámo\n"
+
+#: pg_isready.c:223
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s provede kontrolu spojení k PostgreSQL databázi.\n"
+"\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [PŘEPÍNAČ]...\n"
+
+#: pg_isready.c:228
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DATABÁZE databáze k reindexaci\n"
+
+#: pg_isready.c:229
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet nevypisovat žádné zprávy\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ukáže informaci o verzi a skončí\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukáže tuto nápovědu a skončí\n"
+
+#: pg_isready.c:234
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME jméno databázového serveru nebo adresáře se soketem\n"
+
+#: pg_isready.c:235
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT port databázového serveru\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SECS počet vteřin čekání při pokusu o spojení, 0 toto omezení vypne (výchozí: %s)\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UŽIVATEL jméno uživatele pro připojení\n"
+
+#: reindexdb.c:152 vacuumdb.c:184
+#, c-format
+msgid "number of parallel jobs must be at least 1"
+msgstr "počet paralelních jobů musí být alespoň 1"
+
+#: reindexdb.c:202
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "nelze reindexovat všechny databáze a současně zvolenou databázi"
+
+#: reindexdb.c:207
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "nelze reindexovat všechny databáze a současně systemový katalog"
+
+#: reindexdb.c:212
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "nelze reindexovat vybrané schema ve všech databázích"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "nelze reindexovat vybranou tabulku ve všech databázích"
+
+#: reindexdb.c:222
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "nelze reindexovat vybraný index ve všech databázích"
+
+#: reindexdb.c:235
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "nelze reindexovat vybraná schemata a současně sytémové katalogy"
+
+#: reindexdb.c:240
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "nelze reindexovat vybranou tabulku a současně sytémové katalogy"
+
+#: reindexdb.c:245
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "nelze reindexovat vybraný index a současně sytémový katalog"
+
+#: reindexdb.c:251
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "pro reindexování systémových katalogů nelze použít více jobů"
+
+#: reindexdb.c:280
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "pro reindexování nelze použít více paralelních jobů"
+
+#: reindexdb.c:344 vacuumdb.c:413 vacuumdb.c:421 vacuumdb.c:428 vacuumdb.c:435
+#: vacuumdb.c:442
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "volbu \"%s\" nelze použít na serverech starších než PostgreSQL %s"
+
+#: reindexdb.c:384
+#, c-format
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr "katalogy nelze reindexovat v \"concurrent\" módu, přeskakuji."
+
+#: reindexdb.c:564
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "reindexace databáze \"%s\" selhala: %s"
+
+#: reindexdb.c:568
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "reindexace indexu \"%s\" v databázi \"%s\" selhala: %s"
+
+#: reindexdb.c:572
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "reindexace schematu \"%s\" v databázi \"%s\" selhala: %s"
+
+#: reindexdb.c:576
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "reindexování systémových katalogů v databázi \"%s\" selhalo: %s"
+
+#: reindexdb.c:580
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "reindexace tabulky \"%s\" v databázi \"%s\" selhala: %s"
+
+#: reindexdb.c:732
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: reindexace databáze \"%s\"\n"
+
+#: reindexdb.c:749
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s vytvoří PostgreSQL databázi.\n"
+"\n"
+
+#: reindexdb.c:753
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all reindexovat všechny databáze\n"
+
+#: reindexdb.c:754
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently reindex concurrently\n"
+
+#: reindexdb.c:755
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DATABÁZE databáze k reindexaci\n"
+
+#: reindexdb.c:757
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=JMÉNO obnovit pouze vybraný index\n"
+
+#: reindexdb.c:758
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=NUM použij tento počet paralelních jobů pro reindexování\n"
+
+#: reindexdb.c:760
+#, c-format
+msgid " -s, --system reindex system catalogs\n"
+msgstr " -s, --system reindexace systémového katalogu\n"
+
+#: reindexdb.c:761
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA reindexace pouze zadaných schemat\n"
+
+#: reindexdb.c:762
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABULKA reidexace pouze vybranou tabulku\n"
+
+#: reindexdb.c:773
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Pro detaily čtěte popis SQL příkazu REINDEX.\n"
+
+#: scripts_parallel.c:232
+#, c-format
+msgid "too many jobs for this platform -- try %d"
+msgstr "příliš mnoho jobů pro tuto platformu -- zkuste %d"
+
+#: vacuumdb.c:192
+#, c-format
+msgid "parallel vacuum degree must be a non-negative integer"
+msgstr "parallel vacuum degree musí být nezáporné celé číslo"
+
+#: vacuumdb.c:212
+#, c-format
+msgid "minimum transaction ID age must be at least 1"
+msgstr "minimální stáří transaction ID musí být alespoň 1"
+
+#: vacuumdb.c:220
+#, c-format
+msgid "minimum multixact ID age must be at least 1"
+msgstr "minimální stáří multixact ID musí být alespoň 1"
+
+#: vacuumdb.c:252 vacuumdb.c:258 vacuumdb.c:264 vacuumdb.c:276
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "při provádění jen analyze nelze použít volbu \"%s\""
+
+#: vacuumdb.c:282
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "při provádění full vacuum nelze použít volbu \"%s\""
+
+#: vacuumdb.c:305
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "nelze provádět vacuum všech databází a zároveň specifikovat jen jednu"
+
+#: vacuumdb.c:310
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "nelze provést vacuum specifické tabulky (tabulek) ve všech databázích"
+
+#: vacuumdb.c:400
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Generuji minimální statistiky optimizéru (1 cíl)"
+
+#: vacuumdb.c:401
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Generuji minimální statistiky optimizéru (1 cílů)"
+
+#: vacuumdb.c:402
+msgid "Generating default (full) optimizer statistics"
+msgstr "Generuji výchozí (plné) statistiky optimizéru"
+
+#: vacuumdb.c:450
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: zpracovávám databázi \"%s\" : %s\n"
+
+#: vacuumdb.c:453
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: provádí se VACUUM databáze \"%s\"\n"
+
+#: vacuumdb.c:899
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "provádění VACUUM tabulky \"%s\" v databázi \"%s\" selhalo: %s"
+
+#: vacuumdb.c:902
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "provádění VACUUM databáze \"%s\" selhalo: %s"
+
+#: vacuumdb.c:910
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s pročišťuje a analyzuje PostgreSQL databázi.\n"
+"\n"
+
+#: vacuumdb.c:914
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all provést VACUUM všech databází\n"
+
+#: vacuumdb.c:915
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=DATABÁZE jméno databáze k provedení příkazu VACUUM\n"
+
+#: vacuumdb.c:916
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping vypne veškeré přeskakování stránek\n"
+
+#: vacuumdb.c:917
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo ukázat příkazy posílané na server\n"
+
+#: vacuumdb.c:918
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full provést plné (FULL) VACUUM\n"
+
+#: vacuumdb.c:919
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze zmrazí transakční informace záznamů\n"
+
+#: vacuumdb.c:920
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=NUM použij tento počet paralelních jobů pro vacuum\n"
+
+#: vacuumdb.c:921
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_AGE minimální stáří multixact ID tabulek pro vacuum\n"
+
+#: vacuumdb.c:922
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=XID_AGE minimání stáří transaction ID pro vacuum\n"
+
+#: vacuumdb.c:923
+#, c-format
+msgid " -P, --parallel=PARALLEL_DEGREE use this many background workers for vacuum, if available\n"
+msgstr " -P, --parallel=PARALLEL_DEGREE použij tento počet pracovních procesů pro vacuum, pokud je to možné\n"
+
+#: vacuumdb.c:924
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet tichý mód\n"
+
+#: vacuumdb.c:925
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked přeskočí relace které nemohou být ihned zamknuty\n"
+
+#: vacuumdb.c:926
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABULKA[(SLOUPCE)]' provést VACUUM pouze u specifikované tabulky\n"
+
+#: vacuumdb.c:927
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose vypisovat více informací\n"
+
+#: vacuumdb.c:928
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ukáže informace o verzi a skončí\n"
+
+#: vacuumdb.c:929
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze aktualizace statistik optimalizéru\n"
+
+#: vacuumdb.c:930
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -Z, --analyze-only pouze aktualizaze statistik optimalizéru; bez vacuum\n"
+
+#: vacuumdb.c:931
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages pouze aktualizuje statistiky optimizéru, v několika\n"
+" fázích pro rychlejší výsledky; bez vacuum\n"
+
+#: vacuumdb.c:933
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukáže tento text a skončí\n"
+
+#: vacuumdb.c:941
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Pro detaily čtěte popis SQL příkazu VACUUM.\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s: dotaz selhal: %s"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s: dotaz byl: %s\n"
+
+#~ msgid "%s: query returned %d row instead of one: %s\n"
+#~ msgid_plural "%s: query returned %d rows instead of one: %s\n"
+#~ msgstr[0] "%s: dotaz vrátil %d řádek namísto jedné: %s\n"
+#~ msgstr[1] "%s: dotaz vrátil %d řádky namísto jedné: %s\n"
+#~ msgstr[2] "%s: dotaz vrátil %d řádek namísto jedné: %s\n"
+
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
+
+#~ msgid "%s: too many parallel jobs requested (maximum: %d)\n"
+#~ msgstr "%s: vyžadováno příliš mnoho paralelních jobů (maximum: %d)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If one of -d, -D, -r, -R, -s, -S, and ROLENAME is not specified, you will\n"
+#~ "be prompted interactively.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Je-li použit jeden z parametrů -d, -D, -r, -R, -s, -S, a jméno role\n"
+#~ "není zadáno, budete dotázán/a interaktivně.\n"
+
+#~ msgid "%s: still %s functions declared in language \"%s\"; language not removed\n"
+#~ msgstr "%s: stále je %s funkcí definováno v jazyce \"%s\"; jazyk nebyl odstraněn.\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version ukáže informace o verzi a skončí\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help ukáže tento text a skončí\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: nedostatek paměti\n"
+
+#~ msgid "%s: cannot use the \"freeze\" option when performing only analyze\n"
+#~ msgstr "%s: při provádění jen analyze nelze použít volbu \"freeze\"\n"
+
+#~ msgid " -d, --dbname=DBNAME database from which to remove the language\n"
+#~ msgstr " -d, --dbname=DATABÁZE databáze, ze které bude jazyk odstraněn\n"
+
+#~ msgid ""
+#~ "%s removes a procedural language from a database.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s odstraňuje procedurální jazyk z databáze.\n"
+#~ "\n"
+
+#~ msgid "%s: language removal failed: %s"
+#~ msgstr "%s: odstraňování jazyka selhalo: %s"
+
+#~ msgid "%s: language \"%s\" is not installed in database \"%s\"\n"
+#~ msgstr "%s: jazyk \"%s\" není v databázi \"%s\" instalován\n"
+
+#~ msgid " -N, --unencrypted do not encrypt stored password\n"
+#~ msgstr " -N, --unencrypted uložit heslo v otevřeném tvaru\n"
+
+#~ msgid " -E, --encrypted encrypt stored password\n"
+#~ msgstr " -E, --encrypted uložit heslo v zašifrované podobě\n"
+
+#~ msgid " -l, --list show a list of currently installed languages\n"
+#~ msgstr " -l, --list ukáže seznam již nainstalovaných jazyků\n"
+
+#~ msgid " -d, --dbname=DBNAME database to install language in\n"
+#~ msgstr " -d, --dbname=DATABÁZE databáze do které bude jazyk instalován\n"
+
+#~ msgid " %s [OPTION]... LANGNAME [DBNAME]\n"
+#~ msgstr " %s [PŘEPÍNAČ]... JAZYK [DATABÁZE]\n"
+
+#~ msgid ""
+#~ "%s installs a procedural language into a PostgreSQL database.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s instaluje procedurální jazyk do PostgreSQL databáze.\n"
+#~ "\n"
+
+#~ msgid "%s: language installation failed: %s"
+#~ msgstr "%s: instalace jazyka selhala: %s"
+
+#~ msgid "%s: language \"%s\" is already installed in database \"%s\"\n"
+#~ msgstr "%s: jazyk \"%s\" je již v databázi \"%s\" instalován\n"
+
+#~ msgid "%s: missing required argument language name\n"
+#~ msgstr "%s: chybí povinný parametr jméno jazyka\n"
+
+#~ msgid "Procedural Languages"
+#~ msgstr "Procedurální jazyky"
+
+#~ msgid "Trusted?"
+#~ msgstr "Důvěryhodný?"
+
+#~ msgid "yes"
+#~ msgstr "ano"
+
+#~ msgid "no"
+#~ msgstr "ne"
+
+#~ msgid "Name"
+#~ msgstr "Jméno"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s: nelze získat aktuální uživatelské jméno: %s\n"
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s: nelze získat informace o aktuálním uživateli: %s\n"
+
+#~ msgid "reindexing of system catalogs failed: %s"
+#~ msgstr "reindexace systémového katalogu selhala: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
diff --git a/src/bin/scripts/po/de.po b/src/bin/scripts/po/de.po
new file mode 100644
index 0000000..7093aec
--- /dev/null
+++ b/src/bin/scripts/po/de.po
@@ -0,0 +1,1210 @@
+# German message translation file for "scripts".
+# Peter Eisentraut <peter@eisentraut.org>, 2003 - 2022.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 15:05+0000\n"
+"PO-Revision-Date: 2022-05-10 07:33+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "konnte effektive Benutzer-ID %ld nicht nachschlagen: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "Benutzer existiert nicht"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "Fehler beim Nachschlagen des Benutzernamens: Fehlercode %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Abbruchsanforderung gesendet\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Konnte Abbruchsanforderung nicht senden: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104
+msgid "Password: "
+msgstr "Passwort: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "konnte nicht mit Datenbank %s verbinden: Speicher aufgebraucht"
+
+#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ungültiger Wert »%s« für Option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s muss im Bereich %d..%d sein"
+
+#: ../../fe_utils/parallel_slot.c:319
+#, c-format
+msgid "too many jobs for this platform: %d"
+msgstr "zu viele Jobs für diese Plattform: %d"
+
+#: ../../fe_utils/parallel_slot.c:328
+#, c-format
+msgid "socket file descriptor out of range for select(): %d"
+msgstr "Socket-Dateideskriptor außerhalb des gültigen Bereichs für select(): %d"
+
+#: ../../fe_utils/parallel_slot.c:330
+#, c-format
+msgid "Try fewer jobs."
+msgstr "Versuchen Sie es mit weniger Jobs."
+
+#: ../../fe_utils/parallel_slot.c:552
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "Verarbeitung der Datenbank »%s« fehlgeschlagen: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu Zeile)"
+msgstr[1] "(%lu Zeilen)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Unterbrochen\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Kann keinen weiteren Spaltenkopf zur Tabelle hinzufügen: Spaltenzahl %d überschritten.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Cann keine weitere Zelle zur Tabelle hinzufügen: Zellengesamtzahl %d überschritten.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "ungültiges Ausgabeformat (interner Fehler): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "Anfrage fehlgeschlagen: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "Anfrage war: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158
+#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121
+#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111
+#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "kann nicht alle Datenbanken und eine bestimmte gleichzeitig clustern"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "kann nicht bestimmte Tabelle(n) in allen Datenbanken clustern"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "Clustern der Tabelle »%s« in Datenbank »%s« fehlgeschlagen: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "Clustern der Datenbank »%s« fehlgeschlagen: %s"
+
+#: clusterdb.c:248
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: clustere Datenbank »%s«\n"
+
+#: clusterdb.c:264
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s clustert alle vorher geclusterten Tabellen in einer Datenbank.\n"
+"\n"
+
+#: clusterdb.c:265 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:762 vacuumdb.c:964
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: clusterdb.c:266 reindexdb.c:763 vacuumdb.c:965
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [DBNAME]\n"
+
+#: clusterdb.c:267 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:764 vacuumdb.c:966
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Optionen:\n"
+
+#: clusterdb.c:268
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all clustere alle Datenbanken\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=DBNAME zu clusternde Datenbank\n"
+
+#: clusterdb.c:270 createuser.c:352 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr ""
+" -e, --echo zeige die Befehle, die an den Server\n"
+" gesendet werden\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet unterdrücke alle Mitteilungen\n"
+
+#: clusterdb.c:272
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABELLE clustere nur bestimmte Tabelle(n)\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose erzeuge viele Meldungen\n"
+
+#: clusterdb.c:274 createuser.c:364 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: clusterdb.c:275 createuser.c:369 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: clusterdb.c:276 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:779 vacuumdb.c:991
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Verbindungsoptionen:\n"
+
+#: clusterdb.c:277 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n"
+
+#: clusterdb.c:278 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT Port des Datenbankservers\n"
+
+#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:994
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=NAME Datenbankbenutzername\n"
+
+#: clusterdb.c:280 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password niemals nach Passwort fragen\n"
+
+#: clusterdb.c:281 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password Passwortfrage erzwingen\n"
+
+#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:997
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME alternative Wartungsdatenbank\n"
+
+#: clusterdb.c:283
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Für weitere Informationen lesen Sie bitte die Beschreibung des\n"
+"SQL-Befehls CLUSTER.\n"
+
+#: clusterdb.c:284 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:787 vacuumdb.c:999
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: clusterdb.c:285 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:788 vacuumdb.c:1000
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "Anfrage ergab %d Zeile anstatt einer: %s"
+msgstr[1] "Anfrage ergab %d Zeilen anstatt einer: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "j"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Bitte antworten Sie »%s« oder »%s«.\n"
+
+#: createdb.c:173
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "»%s« ist kein gültiger Kodierungsname"
+
+#: createdb.c:243
+#, c-format
+msgid "database creation failed: %s"
+msgstr "Erzeugen der Datenbank ist fehlgeschlagen: %s"
+
+#: createdb.c:262
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "Erzeugen des Kommentars ist fehlgeschlagen (Datenbank wurde erzeugt): %s"
+
+#: createdb.c:280
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s erzeugt eine PostgreSQL-Datenbank.\n"
+"\n"
+
+#: createdb.c:282
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [OPTION]... [DBNAME] [BESCHREIBUNG]\n"
+
+#: createdb.c:284
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE Standard-Tablespace der Datenbank\n"
+
+#: createdb.c:285 reindexdb.c:768
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr ""
+" -e, --echo zeige die Befehle, die an den Server\n"
+" gesendet werden\n"
+
+#: createdb.c:286
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=KODIERUNG Kodierung für die Datenbank\n"
+
+#: createdb.c:287
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE Locale-Einstellungen für die Datenbank\n"
+
+#: createdb.c:288
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE LC_COLLATE-Einstellung für die Datenbank\n"
+
+#: createdb.c:289
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE LC_CTYPE-Einstellung für die Datenbank\n"
+
+#: createdb.c:290
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE ICU-Locale-Einstellung für die Datenbank\n"
+
+#: createdb.c:291
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" Locale-Provider für Standardsortierfolge der Datenbank\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=EIGENTÜMER Eigentümer der neuen Datenbank\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr " -S, --strategy=STRATEGIE Datenbankerzeugungsstrategie wal_log oder file_copy\n"
+
+#: createdb.c:295
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=TEMPLATE zu kopierende Template-Datenbank\n"
+
+#: createdb.c:296 reindexdb.c:777
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: createdb.c:297 reindexdb.c:778
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: createdb.c:299 reindexdb.c:780
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n"
+
+#: createdb.c:300 reindexdb.c:781
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT Port des Datenbankservers\n"
+
+#: createdb.c:301 reindexdb.c:782
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=NAME Datenbankbenutzername\n"
+
+#: createdb.c:302 reindexdb.c:783
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password niemals nach Passwort fragen\n"
+
+#: createdb.c:303 reindexdb.c:784
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password Passwortfrage erzwingen\n"
+
+#: createdb.c:304 reindexdb.c:785
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME alternative Wartungsdatenbank\n"
+
+#: createdb.c:305
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Wenn nichts anderes angegeben ist, dann wird eine Datenbank mit dem Namen\n"
+"des aktuellen Benutzers erzeugt.\n"
+
+#: createuser.c:193
+msgid "Enter name of role to add: "
+msgstr "Geben Sie den Namen der neuen Rolle ein: "
+
+#: createuser.c:208
+msgid "Enter password for new role: "
+msgstr "Geben Sie das Passwort der neuen Rolle ein: "
+
+#: createuser.c:209
+msgid "Enter it again: "
+msgstr "Geben Sie es noch einmal ein: "
+
+#: createuser.c:212
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Passwörter stimmten nicht überein.\n"
+
+#: createuser.c:220
+msgid "Shall the new role be a superuser?"
+msgstr "Soll die neue Rolle ein Superuser sein?"
+
+#: createuser.c:235
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Soll die neue Rolle Datenbanken erzeugen dürfen?"
+
+#: createuser.c:243
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Soll die neue Rolle weitere neue Rollen erzeugen dürfen?"
+
+#: createuser.c:278
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "Passwortverschlüsselung ist fehlgeschlagen: %s"
+
+#: createuser.c:331
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "Erzeugen der neuen Rolle fehlgeschlagen: %s"
+
+#: createuser.c:345
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s erzeugt eine neue PostgreSQL-Rolle.\n"
+"\n"
+
+#: createuser.c:347 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [OPTION]... [ROLLENNAME]\n"
+
+#: createuser.c:349
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr ""
+" -c, --connection-limit=N Hochzahl an Verbindungen für Rolle\n"
+" (Voreinstellung: keine Begrenzung)\n"
+
+#: createuser.c:350
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb Rolle kann neue Datenbanken erzeugen\n"
+
+#: createuser.c:351
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb Rolle kann keine Datenbanken erzeugen (Voreinstellung)\n"
+
+#: createuser.c:353
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROLLE neue Rolle wird Mitglied dieser Rolle\n"
+
+#: createuser.c:354
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit Rolle erbt alle Privilegien von Rollen, deren\n"
+" Mitglied sie ist (Voreinstellung)\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit Rolle erbt keine Privilegien\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login Rolle kann sich anmelden (Voreinstellung)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login Rolle kann sich nicht anmelden\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt weise der neuen Rolle ein Passwort zu\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole Rolle kann neue Rollen erzeugen\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole Rolle kann keine Rollen erzeugen (Voreinstellung)\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser Rolle wird Superuser\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser Rolle wird kein Superuser (Voreinstellung)\n"
+
+#: createuser.c:365
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive nach fehlenden Rollennamen und -attributen fragen\n"
+" anstatt Vorgabewerte zu nehmen\n"
+
+#: createuser.c:367
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication Rolle kann Replikation einleiten\n"
+
+#: createuser.c:368
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication Rolle kann Replikation nicht einleiten\n"
+
+#: createuser.c:373
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr ""
+" -U, --username=NAME Datenbankbenutzername für die Verbindung\n"
+" (nicht der Name des neuen Benutzers)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "Datenbankname als Argument fehlt"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "Datenbank »%s« wird unwiderruflich gelöscht werden.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Sind Sie sich sicher?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "Löschen der Datenbank fehlgeschlagen: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s löscht eine PostgreSQL-Datenbank.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [OPTION]... DBNAME\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force vor dem Löschen versuchen andere Verbindungen abzubrechen\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive frage nach, bevor irgendetwas gelöscht wird\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists keinen Fehler ausgeben, wenn Datenbank nicht existiert\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Geben Sie den Namen der zu löschenden Rolle ein: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "Rollenname als Argument fehlt"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Rolle »%s« wird unwiderruflich gelöscht werden.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "Löschen der Rolle »%s« fehlgeschlagen: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s löscht eine PostgreSQL-Rolle.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive nachfragen, bevor irgendetwas gelöscht wird, und\n"
+" nach Rollennamen fragen, wenn nicht angegeben\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists keinen Fehler ausgeben, wenn Benutzer nicht existiert\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr ""
+" -U, --username=NAME Datenbankbenutzername für die Verbindung\n"
+" (nicht der Name des zu löschenden Benutzers)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "konnte Standardoptionen nicht ermitteln"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "Verbindungen werden angenommen\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "Verbindungen werden abgelehnt\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "keine Antwort\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "kein Verbindungsversuch\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "unbekannt\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s führt eine Verbindungsprüfung gegen eine PostgreSQL-Datenbank aus.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DBNAME Datenbankname\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet weniger ausgeben\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT Port des Datenbankservers\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SEK Sekunden auf Verbindung warten, 0 schaltet aus (Vorgabe: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=NAME Datenbankbenutzername\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "kann nicht alle Datenbanken und eine bestimmte gleichzeitig reindizieren"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "kann nicht alle Datenbanken und Systemkataloge gleichzeitig reindizieren"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "kann nicht bestimmte Schemas in allen Datenbanken reindizieren"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "kann nicht bestimmte Tabelle(n) in allen Datenbanken reindizieren"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "kann nicht bestimmte Indexe in allen Datenbanken reindizieren"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "kann nicht bestimmte Schemas und Systemkataloge gleichzeitig reindizieren"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "kann nicht bestimmte Tabelle(n) und Systemkataloge gleichzeitig reindizieren"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "kann nicht bestimmte Indexe und Systemkataloge gleichzeitig reindizieren"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "kann nicht mehrere Jobs verwenden, um Systemkataloge zu reindizieren"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "kann nicht mehrere Jobs verwenden, um Indexe zu reindizieren"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439
+#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469
+#: vacuumdb.c:473
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "Option »%s« kann nicht mit Serverversionen älter als PostgreSQL %s verwendet werden"
+
+#: reindexdb.c:369
+#, c-format
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr "Systemkataloge können nicht nebenläufig reindiziert werden, werden alle übersprungen"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "Reindizieren der Datenbank »%s« fehlgeschlagen: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "Reindizieren des Index »%s« in Datenbank »%s« fehlgeschlagen: %s"
+
+#: reindexdb.c:581
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "Reindizieren des Schemas »%s« in Datenbank »%s« fehlgeschlagen: %s"
+
+#: reindexdb.c:585
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "Reindizieren der Systemkataloge in Datenbank »%s« fehlgeschlagen: %s"
+
+#: reindexdb.c:589
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "Reindizieren der Tabelle »%s« in Datenbank »%s« fehlgeschlagen: %s"
+
+#: reindexdb.c:744
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: reindiziere Datenbank »%s«\n"
+
+#: reindexdb.c:761
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s reindiziert eine PostgreSQL-Datenbank.\n"
+"\n"
+
+#: reindexdb.c:765
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all alle Datenbanken reindizieren\n"
+
+#: reindexdb.c:766
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently nebenläufig reindizieren\n"
+
+#: reindexdb.c:767
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DBNAME zu reindizierende Datenbank\n"
+
+#: reindexdb.c:769
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX nur bestimmte(n) Index(e) erneuern\n"
+
+#: reindexdb.c:770
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr ""
+" -j, --jobs=NUM so viele parallele Verbindungen zum Reindizieren\n"
+" verwenden\n"
+
+#: reindexdb.c:771
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet unterdrücke alle Mitteilungen\n"
+
+#: reindexdb.c:772
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system nur Systemkataloge reindizieren\n"
+
+#: reindexdb.c:773
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA nur bestimmte(s) Schema(s) reindizieren\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABELLE nur bestimmte Tabelle(n) reindizieren\n"
+
+#: reindexdb.c:775
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=TABLESPACE Tablespace wo Indexe neu gebaut werden\n"
+
+#: reindexdb.c:776
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose erzeuge viele Meldungen\n"
+
+#: reindexdb.c:786
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Für weitere Informationen lesen Sie bitte die Beschreibung des\n"
+"SQL-Befehls REINDEX.\n"
+
+#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279
+#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "kann Option »%s« nicht verwenden, wenn nur Analyze durchgeführt wird"
+
+#: vacuumdb.c:297
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "kann Option »%s« nicht verwenden, wenn volles Vacuum durchgeführt wird"
+
+#: vacuumdb.c:303
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "kann Option »%s« nicht mit der Option »%s« verwenden"
+
+#: vacuumdb.c:322
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "kann nicht alle Datenbanken und eine bestimmte gleichzeitig vacuumen"
+
+#: vacuumdb.c:324
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "kann nicht bestimmte Tabelle(n) in allen Datenbanken vacuumen"
+
+#: vacuumdb.c:412
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Erzeuge minimale Optimierer-Statistiken (1 Ziel)"
+
+#: vacuumdb.c:413
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Erzeuge mittlere Optimierer-Statistiken (10 Ziele)"
+
+#: vacuumdb.c:414
+msgid "Generating default (full) optimizer statistics"
+msgstr "Erzeuge volle Optimierer-Statistiken"
+
+#: vacuumdb.c:479
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: bearbeite Datenbank »%s«: %s\n"
+
+#: vacuumdb.c:482
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: führe Vacuum in Datenbank »%s« aus\n"
+
+#: vacuumdb.c:952
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "Vacuum der Tabelle »%s« in Datenbank »%s« fehlgeschlagen: %s"
+
+#: vacuumdb.c:955
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "Vacuum der Datenbank »%s« fehlgeschlagen: %s"
+
+#: vacuumdb.c:963
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s säubert und analysiert eine PostgreSQL-Datenbank.\n"
+"\n"
+
+#: vacuumdb.c:967
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all führe Vacuum in allen Datenbanken aus\n"
+
+#: vacuumdb.c:968
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=DBNAME führe Vacuum in dieser Datenbank aus\n"
+
+#: vacuumdb.c:969
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping Page-Skipping-Verhalten abschalten\n"
+
+#: vacuumdb.c:970
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr ""
+" -e, --echo zeige die Befehle, die an den Server\n"
+" gesendet werden\n"
+
+#: vacuumdb.c:971
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full führe volles Vacuum durch\n"
+
+#: vacuumdb.c:972
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze Zeilentransaktionsinformationen einfrieren\n"
+
+#: vacuumdb.c:973
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr " --force-index-cleanup Indexeinträge, die auf tote Tupel zeigen, immer entfernen\n"
+
+#: vacuumdb.c:974
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr ""
+" -j, --jobs=NUM so viele parallele Verbindungen zum Vacuum\n"
+" verwenden\n"
+
+#: vacuumdb.c:975
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr ""
+" --min-mxid-age=MXID-ALTER minimales Multixact-ID-Alter zu bearbeitender\n"
+" Tabellen\n"
+
+#: vacuumdb.c:976
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr ""
+" --min-xid-age=XID-ALTER minimales Transaktions-ID-Alter zu bearbeitender\n"
+" Tabellen\n"
+
+#: vacuumdb.c:977
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr " --no-index-cleanup Indexeinträge, die auf tote Tupel zeigen, nicht entfernen\n"
+
+#: vacuumdb.c:978
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr " --no-process-toast zur Tabelle gehörige TOAST-Tabelle überspringen\n"
+
+#: vacuumdb.c:979
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate leere Seiten am Ende der Tabelle nicht abschneiden\n"
+
+#: vacuumdb.c:980
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr ""
+" -P, --parallel=PARALLEL-PROZ so viele Background-Worker für Vacuum verwenden,\n"
+" wenn verfügbar\n"
+
+#: vacuumdb.c:981
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet unterdrücke alle Mitteilungen\n"
+
+#: vacuumdb.c:982
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr ""
+" --skip-locked Relationen überspringen, die nicht sofort\n"
+" gesperrt werden können\n"
+
+#: vacuumdb.c:983
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr ""
+" -t, --table='TABELLE[(SPALTEN)]'\n"
+" führe Vacuum für bestimmte Tabelle(n) aus\n"
+
+#: vacuumdb.c:984
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose erzeuge viele Meldungen\n"
+
+#: vacuumdb.c:985
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: vacuumdb.c:986
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze aktualisiere Statistiken für den Optimierer\n"
+
+#: vacuumdb.c:987
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr ""
+" -Z, --analyze-only aktualisiere nur Statistiken für den Optimierer;\n"
+" kein Vacuum\n"
+
+#: vacuumdb.c:988
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages aktualisiere nur Statistiken für den Optimierer,\n"
+" in mehreren Phasen für schnellere Ergebnisse;\n"
+" kein Vacuum\n"
+
+#: vacuumdb.c:990
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: vacuumdb.c:998
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Für weitere Information lesen Sie bitte die Beschreibung des\n"
+"SQL-Befehls VACUUM.\n"
diff --git a/src/bin/scripts/po/el.po b/src/bin/scripts/po/el.po
new file mode 100644
index 0000000..814e90a
--- /dev/null
+++ b/src/bin/scripts/po/el.po
@@ -0,0 +1,1196 @@
+# Greek message translation file for pgscripts
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pgscripts (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-14 09:19+0000\n"
+"PO-Revision-Date: 2023-04-14 14:51+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "προειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέρεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "έλλειψη μνήμης\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "δεν ήταν δυνατή η αντιγραφή δείκτη null (εσωτερικό σφάλμα)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "δεν ήταν δυνατή η αναζήτηση ενεργής ταυτότητας χρήστη %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "ο χρήστης δεν υπάρχει"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "αποτυχία αναζήτησης ονόματος χρήστη: κωδικός σφάλματος %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Αίτηση ακύρωσης εστάλη\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Δεν ήταν δυνατή η αποστολή αίτησης ακύρωσης: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104
+msgid "Password: "
+msgstr "Κωδικός πρόσβασης: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "δεν ήταν δυνατή η σύνδεση με τη βάσης δεδομένων %s: έλλειψη μνήμης"
+
+#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "μη έγκυρη τιμή «%s» για την επιλογή %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s πρέπει να βρίσκεται εντός εύρους %d..%d"
+
+#: ../../fe_utils/parallel_slot.c:301
+#, c-format
+msgid "too many jobs for this platform"
+msgstr "πάρα πολλές εργασίες για την παρούσα πλατφόρμα"
+
+#: ../../fe_utils/parallel_slot.c:519
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "η επεξεργασία της βάσης δεδομένων «%s» απέτυχε: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu σειρά)"
+msgstr[1] "(%lu σειρές)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Διακόπηκε\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Δεν είναι δυνατή η προσθήκη κεφαλίδας σε περιεχόμενο πίνακα: υπέρβαση του πλήθους στηλών %d.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Δεν είναι δυνατή η προσθήκη κελιού σε περιεχόμενο πίνακα: υπέρβαση του συνολικού αριθμού κελιών %d.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "μη έγκυρη μορφή εξόδου (εσωτερικό σφάλμα): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "το ερώτημα απέτυχε: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "Το ερώτημα ήταν: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158
+#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121
+#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111
+#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες."
+
+#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάρα πολλοί παραμέτροι εισόδου από την γραμμή εντολών (ο πρώτη είναι η «%s»)"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "δεν είναι δυνατή η ομαδοποίηση όλων των βάσεων δεδομένων και μιας συγκεκριμένης ταυτόχρονα"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "δεν είναι δυνατή η ομαδοποίηση συγκεκριμένων πινάκων σε όλες τις βάσεις δεδομένων"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "η ομαδοποίηση του πίνακα «%s» στη βάση δεδομένων «%s» απέτυχε: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "η ομαδοποίηση της βάσης δεδομένων «%s» απέτυχε: %s"
+
+#: clusterdb.c:246
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: ομαδοποιείται η βάση δεδομένων «%s»\n"
+
+#: clusterdb.c:262
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s: ομαδοποιεί όλους του προηγούμενα ομαδοποιημένους πίνακες σε μία βάση δεδομένων\n"
+"\n"
+
+#: clusterdb.c:263 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964
+#, c-format
+msgid "Usage:\n"
+msgstr "Χρήση:\n"
+
+#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME]\n"
+
+#: clusterdb.c:265 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Επιλογές:\n"
+
+#: clusterdb.c:266
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all ομαδοποίησε όλες τις βάσεις δεδομένων\n"
+
+#: clusterdb.c:267
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=DBNAME βάση δεδομένων για ομαδοποίηση\n"
+
+#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet να μην γράψεις κανένα μήνυμα\n"
+
+#: clusterdb.c:270
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABLE να ομαδοποιήσεις μόνο συγκεκριμένους πίνακες\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose γράψε πολλά μηνύματα εξόδου\n"
+
+#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: clusterdb.c:274 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Επιλογές σύνδεσης:\n"
+
+#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n"
+
+#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT θύρα διακομιστή βάσης δεδομένων\n"
+
+#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME όνομα χρήστη με το οποίο να συνδεθεί\n"
+
+#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός πρόσβασης\n"
+
+#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password αναγκαστική προτροπή κωδικού πρόσβασης\n"
+
+#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME εναλλακτική βάση δεδομένων συντήρησης\n"
+
+#: clusterdb.c:281
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Διαβάστε την περιγραφή της SQL εντολής CLUSTER για λεπτομέρειες.\n"
+
+#: clusterdb.c:282 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφορές σφάλματων σε <%s>.\n"
+
+#: clusterdb.c:283 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αρχική σελίδα: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "το ερώτημα επέστρεψε %d σειρά αντί μίας: %s"
+msgstr[1] "το ερώτημα επέστρεψε %d σειρές αντί μίας: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "y"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Παρακαλώ απαντήστε «%s» ή «%s».\n"
+
+#: createdb.c:173
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "«%s» δεν είναι έγκυρο όνομα κωδικοποίησης"
+
+#: createdb.c:243
+#, c-format
+msgid "database creation failed: %s"
+msgstr "η δημιουργία βάσης δεδομένων απέτυχε: %s"
+
+#: createdb.c:262
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "η δημιουργία σχολίων απέτυχε (δημιουργήθηκε βάση δεδομένων): %s"
+
+#: createdb.c:280
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s δημιουργεί μια βάση δεδομένων PostgreSQL.\n"
+"\n"
+
+#: createdb.c:282
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME] [ΠΕΡΙΓΡΑΦΗ]\n"
+
+#: createdb.c:284
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE προεπιλεγμένος πινακοχώρος για τη βάση δεδομένων\n"
+
+#: createdb.c:285 reindexdb.c:766
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n"
+
+#: createdb.c:286
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=ENCODING κωδικοποίηση για την βάση δεδομένων\n"
+
+#: createdb.c:287
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE ρυθμίσεις εντοπιότητας για τη βάση δεδομένων\n"
+
+#: createdb.c:288
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE ρύθμιση LC_COLLATE για την βάση δεδομένων\n"
+
+#: createdb.c:289
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-collate=LOCALE ρύθμιση LC_CTYPE για την βάση δεδομένων\n"
+
+#: createdb.c:290
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE ICU ρυθμίσεις εντοπιότητας για τη βάση δεδομένων\n"
+
+#: createdb.c:291
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" πάροχος εντοπιότητας για την προεπιλεγμένη συρραφή της βάσης\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=OWNER όνομα χρήστη που θα κατέχει την νέα βάση δεδομένων\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr " -S, --strategy=STRATEGY δημιουργία στρατηγικής wal_log βάσης δεδομένων ή flle_copy\n"
+
+#: createdb.c:295
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=TEMPLATE πρωτότυπη βάση δεδομένων για αντιγραφή\n"
+
+#: createdb.c:296 reindexdb.c:775
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης και, στη συνέχεια, έξοδος\n"
+
+#: createdb.c:297 reindexdb.c:776
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, και μετά έξοδος\n"
+
+#: createdb.c:299 reindexdb.c:778
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n"
+
+#: createdb.c:300 reindexdb.c:779
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT θύρα διακομιστή βάσης δεδομένων\n"
+
+#: createdb.c:301 reindexdb.c:780
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME όνομα χρήστη με το οποίο να συνδεθεί\n"
+
+#: createdb.c:302 reindexdb.c:781
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός πρόσβασης\n"
+
+#: createdb.c:303 reindexdb.c:782
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password αναγκαστική προτροπή κωδικού πρόσβασης\n"
+
+#: createdb.c:304 reindexdb.c:783
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME εναλλακτική βάση δεδομένων συντήρησης\n"
+
+#: createdb.c:305
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Από προεπιλογή, δημιουργείται μια βάση δεδομένων με το ίδιο όνομα με τον τρέχοντα χρήστη.\n"
+
+#: createuser.c:193
+msgid "Enter name of role to add: "
+msgstr "Εισαγάγετε το όνομα του ρόλου για να προσθέσετε: "
+
+#: createuser.c:208
+msgid "Enter password for new role: "
+msgstr "Εισαγάγετε κωδικό πρόσβασης για νέο ρόλο: "
+
+#: createuser.c:209
+msgid "Enter it again: "
+msgstr "Εισάγετε ξανά: "
+
+#: createuser.c:212
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Οι κωδικοί πρόσβασης δεν είναι ίδιοι.\n"
+
+#: createuser.c:220
+msgid "Shall the new role be a superuser?"
+msgstr "Να είναι ο νέος ρόλος υπερχρήστης;"
+
+#: createuser.c:235
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Να επιτραπεί στον νέο ρόλο η δημιουργία βάσεων δεδομένων;"
+
+#: createuser.c:243
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Να επιτραπεί στον νέο ρόλο να δημιουργήσει περισσότερους νέους ρόλους;"
+
+#: createuser.c:278
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "η κρυπτογράφηση κωδικού πρόσβασης απέτυχε: %s"
+
+#: createuser.c:331
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "η δημιουργία νέου ρόλου απέτυχε: %s"
+
+#: createuser.c:345
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s δημιουργεί ένα νέο ρόλο PostgreSQL.\n"
+"\n"
+
+#: createuser.c:347 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [ROLENAME]\n"
+
+#: createuser.c:349
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N όριο σύνδεσης για το ρόλο (προεπιλογή: κανένα όριο)\n"
+
+#: createuser.c:350
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb ο ρόλος μπορεί να δημιουργήσει νέες βάσεις δεδομένων\n"
+
+#: createuser.c:351
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb ο ρόλος δεν μπορεί να δημιουργήσει βάσεις δεδομένων (προεπιλογή)\n"
+
+#: createuser.c:353
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROLE ο καινούριος ρόλος να αποτελεί μέλος αυτού του ρόλου\n"
+
+#: createuser.c:354
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit ο ρόλος να κληρονομεί τα προνόμια των ρόλων των\n"
+" οποίων είναι μέλος τους (προεπιλογή)\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit ο ρόλος δεν κληρονομεί προνόμια\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login ο ρόλος μπορεί να συνδεθεί (προεπιλογή)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login ο ρόλος δεν μπορεί να συνδεθεί\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt αντιστοιχίσε έναν κωδικό πρόσβασης στο νέο ρόλο\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole ο ρόλος μπορεί να δημιουργεί νέους ρόλους\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole ο ρόλος δεν μπορεί να δημιουργεί νέους ρόλους (προεπιλογή)\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser ο ρόλος θα είναι υπερχρήστης\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser ο ρόλος δεν θα είναι υπερχρήστης (προεπιλογή)\n"
+
+#: createuser.c:365
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive να προτρέψει για το όνομα ρόλου και τα χαρακτηριστικά αντί\n"
+" να χρησιμοποιήσει προεπιλογές\n"
+
+#: createuser.c:367
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication ο ρόλος μπορεί να εκκινήσει αναπαραγωγή\n"
+
+#: createuser.c:368
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication ο ρόλος να μην μπορεί να εκκινήσει αναπαραγωγή\n"
+
+#: createuser.c:373
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=USERNAME όνομα χρήστη για να συνδεθεί ως (όχι αυτό που θα δημιουργηθεί)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "λείπει αναγκαία παράμετρος ονόματος βάσης δεδομένων"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "Η βάση δεδομένων «%s» θα αφαιρεθεί οριστικά.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Είστε βέβαιος;"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "η αφαίρεση της βάσης δεδομένων απέτυχε: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s αφαιρεί μία βάση δεδομένων PostgreSQL.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME]\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force να προσπαθήσει να τερματίσει άλλες συνδέσεις πριν την εγκατάληψη\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive να προτρέψει πριν να διαγράψει οτιδήποτε\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists να μην αναφέρει σφάλμα εάν η βάση δεδομένων δεν υπάρχει\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Εισαγάγετε το όνομα του ρόλου για να απορρίψετε: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "λείπει η απαιτούμενη παράμετρος ονόματος ρόλου"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Ο ρόλος «%s» θα αφαιρεθεί οριστικά.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "η αφαίρεση του ρόλου «%s» απέτυχε: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s αφαιρεί ένα ρόλο PostgreSQL.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive να προτρέψει πριν να διαγράψει οτιδήποτε, και να προτρέψει για\n"
+" το όνομα του ρόλου, εάν αυτό δεν έχει καθοριστεί\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists να μην αναφέρει σφάλμα εάν ο χρήστης δεν υπάρχει\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=USERNAME όνομα χρήστη με το οποίο να συνδεθεί (όχι αυτό που θα αφαιρέσει)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "δεν ήταν δυνατή η λήψη προεπιλεγμένων ρυθμίσεων"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "αποδέχεται συνδέσεις\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "απορρίπτει συνδέσεις\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "καμία απάντηση\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "καμία προσπάθεια\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "άγνωστο\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s εκτελεί ένα έλεγχο σύνδεσης σε μια βάση δεδομένων PostgreSQL.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DBNAME ονομασία βάσης δεδομένων\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet εκτέλεσε σιωπηλά\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT θύρα διακομιστή βάσης δεδομένων\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr ""
+" -t, --timeout=SECS πόσα δευτερόλεπτα να περιμένει όταν προσπαθεί να συνδεθεί,\n"
+" 0 το απενεργοποιεί (προεπιλογή: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME όνομα χρήστη με το οποίο να συνδεθεί\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση όλων των βάσεων δεδομένων και μιας συγκεκριμένης ταυτόχρονα"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση όλων των βάσεων δεδομένων και των καταλόγων συστήματος ταυτόχρονα"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων σχημάτων σε όλες τις βάσεις δεδομένων"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων πινάκων σε όλες τις βάσεις δεδομένων"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων ευρετηρίων σε όλες τις βάσεις δεδομένων"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων σχημάτων και καταλόγων συστήματος ταυτόχρονα"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων πινάκων και καταλόγων συστήματος ταυτόχρονα"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "δεν είναι δυνατή η επαναευρετηριοποίηση συγκεκριμένων ευρετηρίων και καταλόγων συστήματος ταυτόχρονα"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "δεν είναι δυνατή η χρήση πολλαπλών εργασιών για την επαναευρετηριοποίηση καταλόγων συστήματος"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "δεν είναι δυνατή η χρήση πολλαπλών εργασιών για την επαναευρετηριοποίηση ευρετηρίων"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439
+#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469
+#: vacuumdb.c:473
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "δεν είναι δυνατή η χρήση της επιλογής «%s» σε εκδόσεις διακομιστών παλαιότερες από την PostgreSQL %s"
+
+#: reindexdb.c:369
+#, c-format
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr "δεν είναι δυνατή η ταυτόχρονη επαναευρετηριοποίηση καταλόγων συστήματος, παρακάμπτονται όλοι"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "επαναευρετηριοποίηση της βάσης δεδομένων «%s» απέτυχε: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "η επανενεξάγηση του ευρετηρίου «%s» στη βάση δεδομένων «%s» απέτυχε: %s"
+
+#: reindexdb.c:581
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "η επαναευρετηριοποίηση του σχήματος «%s» στη βάση δεδομένων «%s» απέτυχε: %s"
+
+#: reindexdb.c:585
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "η επαναευρετηριοποίηση καταλόγων συστήματος στη βάση δεδομένων «%s» απέτυχε: %s"
+
+#: reindexdb.c:589
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "η επαναευρετηριοποίηση του πίνακα «%s» στη βάση δεδομένων «%s» απέτυχε: %s"
+
+#: reindexdb.c:742
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: επαναευρετηριοποίηση της βάσης δεδομένων «%s»\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s επαναευρετηριοποιεί μια βάση δεδομένων PostgreSQL.\n"
+"\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all επαναευρετηριοποίηση όλων των βάσεων δεδομένων\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " -a, --all ταυτόχρονη επαναευρετηριοποίηση\n"
+
+#: reindexdb.c:765
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DBNAME βάση δεδομένων για επαναευρετηριοποίηση\n"
+
+#: reindexdb.c:767
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX δημιούργησε συγκεκριμένο(ους) πίνακα(ες) μόνο\n"
+
+#: reindexdb.c:768
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=NUM χρησιμοποιήσε τόσες πολλές ταυτόχρονες συνδέσεις με το διακομιστή\n"
+
+#: reindexdb.c:769
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet να μην γράψεις κανένα μήνυμα\n"
+
+#: reindexdb.c:770
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system επαναευρετηριοποίηση μόνο καταλόγων συστήματος\n"
+
+#: reindexdb.c:771
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA επαναευρετηριοποίησε συγκεκριμένο(-α) σχήμα(-τα) μόνο\n"
+
+#: reindexdb.c:772
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLE επαναευρετηριοποίησε συγκεκριμένο(-ους) πίνακα(-ες) μόνο\n"
+
+#: reindexdb.c:773
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=TABLESPACE πινακοχώρος όπου επαναδημιουργούνται τα ευρετήρια\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose γράψε πολλά μηνύματα εξόδου\n"
+
+#: reindexdb.c:784
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Διαβάστε την περιγραφή της SQL εντολής REINDEX για λεπτομέρειες.\n"
+
+#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279
+#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "δεν είναι δυνατή η χρήση της επιλογής «%s» κατά την εκτέλεση μόνο της ανάλυσης"
+
+#: vacuumdb.c:297
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "δεν είναι δυνατή η χρήση της επιλογής «%s» κατά την εκτέλεση full vacuum"
+
+#: vacuumdb.c:303
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "δεν είναι δυνατή η χρήση της επιλογής «%s» μαζί με την επιλογή«%s»"
+
+#: vacuumdb.c:322
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "δεν μπορεί να εκτελέσει vacuum σε όλες τις βάσεις δεδομένων και μια συγκεκριμένη ταυτόχρονα"
+
+#: vacuumdb.c:324
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "δεν μπορεί να εκτελέσει vacuum συγκεκριμένους πίνακες σε όλες τις βάσεις δεδομένων"
+
+#: vacuumdb.c:412
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Δημιουργία ελάχιστων στατιστικών βελτιστοποιητή (1 στόχος)"
+
+#: vacuumdb.c:413
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Δημιουργία μεσαίων στατιστικών βελτιστοποιητή (10 στόχοι)"
+
+#: vacuumdb.c:414
+msgid "Generating default (full) optimizer statistics"
+msgstr "Δημιουργία προεπιλεγμένων (πλήρων) στατιστικών βελτιστοποιητή"
+
+#: vacuumdb.c:479
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: επεξεργάζεται τη βάση δεδομένων «%s»: %s\n"
+
+#: vacuumdb.c:482
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: εκτελεί vacuum στη βάση δεδομένων «%s»\n"
+
+#: vacuumdb.c:952
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "η εκτέλεση vacuum στον πίνακα «%s» στη βάση δεδομένων «%s» απέτυχε: %s"
+
+#: vacuumdb.c:955
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "η εκτέλεση vacuum στη βάση δεδομένων «%s» απέτυχε: %s"
+
+#: vacuumdb.c:963
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s καθαρίζει και αναλύει μια βάση δεδομένων PostgreSQL.\n"
+"\n"
+
+#: vacuumdb.c:967
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all εκτέλεσε vacuum σε όλες τις βάσεις δεδομένων\n"
+
+#: vacuumdb.c:968
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=DBNAME βάση δεδομένων για vacuum\n"
+
+#: vacuumdb.c:969
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping απενεργοποιήστε κάθε συμπεριφορά παράλειψης σελίδας\n"
+
+#: vacuumdb.c:970
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n"
+
+#: vacuumdb.c:971
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full να εκτελέσει πλήρες vacuum\n"
+
+#: vacuumdb.c:972
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze πάγωσε τις πληροφορίες σειράς συναλλαγής\n"
+
+#: vacuumdb.c:973
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr " --force-index-cleanup αφαιρεί πάντα καταχωρήσεις ευρετηρίου που οδηγούν σε νεκρές πλειάδες\n"
+
+#: vacuumdb.c:974
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=NUM χρησιμοποιήσε τόσες πολλές ταυτόχρονες συνδέσεις με το διακομιστή\n"
+
+#: vacuumdb.c:975
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_AGE ελάχιστη ηλικία multixact ID πινάκων για vacuum\n"
+
+#: vacuumdb.c:976
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=XID_AGE ελάχιστη ηλικία transaction ID πινάκων για vacuum\n"
+
+#: vacuumdb.c:977
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr " --no-index-cleanup να μην αφαιρέσει καταχωρήσεις ευρετηρίου που οδηγούν σε νεκρές πλειάδες\n"
+
+#: vacuumdb.c:978
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr " --no-process-toast παράλειψε τον πίνακα TOAST που σχετίζεται με τον πίνακα που εκτελείται vacuum\n"
+
+#: vacuumdb.c:979
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate να μην περικόψει άδειες σελίδες από το τέλος του πίνακα\n"
+
+#: vacuumdb.c:980
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr ""
+" -P, --parallel=PARALLEL_WORKERS χρησιμοποίησε τόσους πολλούς εργάτες παρασκηνίου\n"
+" για την εκτέλεση vacuum, εάν αυτοί είναι διαθέσιμοι\n"
+
+#: vacuumdb.c:981
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet να μην γράψεις κανένα μήνυμα\n"
+
+#: vacuumdb.c:982
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked να παραλείψει σχέσεις που δεν μπορούν να κλειδωθούν άμεσα\n"
+
+#: vacuumdb.c:983
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table=‘TABLE[(COLUMNS)]’ να εκτελέσει vacuum μόνο σε συγκεκριμένους πίνακες\n"
+
+#: vacuumdb.c:984
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose γράψε πολλά μηνύματα εξόδου\n"
+
+#: vacuumdb.c:985
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: vacuumdb.c:986
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze ενημέρωσε τα στατιστικά του βελτιστοποιητή\n"
+
+#: vacuumdb.c:987
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -z, --analyze μόνο ενημέρωσε τα στατιστικά του βελτιστοποιητή· χωρίς vacuum\n"
+
+#: vacuumdb.c:988
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages ενημέρωσε μόνο τα στατιστικά στοιχεία βελτιστοποίησης, σε πολλαπλά\n"
+" στάδια για ταχύτερα αποτελέσματα· χωρίς vacuum\n"
+
+#: vacuumdb.c:990
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: vacuumdb.c:998
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Διαβάστε την περιγραφή της SQL εντολής VACUUM για λεπτομέρειες.\n"
+
+#~ msgid "fatal: "
+#~ msgstr "κρίσιμο: "
+
+#~ msgid "invalid value for --connection-limit: %s"
+#~ msgstr "άκυρη τιμή για --connection-limit: %s"
+
+#~ msgid "minimum multixact ID age must be at least 1"
+#~ msgstr "η ελάχιστη ηλικία multixact ID πρέπει να είναι τουλάχιστον 1"
+
+#~ msgid "minimum transaction ID age must be at least 1"
+#~ msgstr "η ελάχιστη ηλικία transaction ID πρέπει να είναι τουλάχιστον 1"
+
+#~ msgid "number of parallel jobs must be at least 1"
+#~ msgstr "ο αριθμός παράλληλων εργασιών πρέπει να είναι τουλάχιστον 1"
+
+#~ msgid "only one of --locale and --lc-collate can be specified"
+#~ msgstr "μόνο ένα από τα --locale και --lc-collate μπορεί να καθοριστεί"
+
+#~ msgid "only one of --locale and --lc-ctype can be specified"
+#~ msgstr "μόνο ένα από τα --locale και --lc-ctype μπορεί να καθοριστεί"
+
+#~ msgid "parallel workers for vacuum must be greater than or equal to zero"
+#~ msgstr "οι παράλληλοι εργάτες για vacuum πρέπει να είναι περισσότεροι ή ίσοι με μηδέν"
diff --git a/src/bin/scripts/po/es.po b/src/bin/scripts/po/es.po
new file mode 100644
index 0000000..bf65372
--- /dev/null
+++ b/src/bin/scripts/po/es.po
@@ -0,0 +1,1191 @@
+# pgscripts spanish translation
+#
+# Copyright (c) 2003-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Alvaro Herrera, <alvherre@alvh.no-ip.org>, 2003-2013
+# Jaime Casanova, <systemguards@gmail.com>, 2005
+# Carlos Chapi <carlos.chapi@2ndquadrant.com>, 2013-2014, 2021
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:49+0000\n"
+"PO-Revision-Date: 2022-11-04 13:14+0100\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "no se puede duplicar un puntero nulo (error interno)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "no se pudo buscar el ID de usuario efectivo %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "el usuario no existe"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "fallo en la búsqueda de nombre de usuario: código de error %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Petición de cancelación enviada\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "No se pudo enviar el paquete de cancelación: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104
+msgid "Password: "
+msgstr "Contraseña: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "no se pudo conectar a la base de datos %s: memoria agotada"
+
+#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "el valor «%s» no es válido para la opción %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s debe estar en el rango %d..%d"
+
+#: ../../fe_utils/parallel_slot.c:301
+#, c-format
+msgid "too many jobs for this platform"
+msgstr "demasiados procesos para esta plataforma"
+
+#: ../../fe_utils/parallel_slot.c:519
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "falló el procesamiento de la base de datos «%s»: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu fila)"
+msgstr[1] "(%lu filas)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Interrumpido\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "No se puede agregar un encabezado al contenido de la tabla: la cantidad de columnas de %d ha sido excedida.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "No se puede agregar una celda al contenido de la tabla: la cantidad de celdas de %d ha sido excedida.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "formato de salida no válido (error interno): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "la consulta falló: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "La consulta era: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158
+#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121
+#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111
+#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "no se pueden reordenar todas las bases de datos y una de ellas en particular simultáneamente"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "no es posible reordenar tablas específicas en todas las bases de datos"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "falló el reordenamiento de la tabla «%s» en la base de datos «%s»: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "falló el reordenamiento de la base de datos «%s»: %s"
+
+#: clusterdb.c:246
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: reordenando la base de datos «%s»\n"
+
+#: clusterdb.c:262
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s reordena todas las tablas previamente reordenadas\n"
+"en una base de datos.\n"
+"\n"
+
+#: clusterdb.c:263 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPCIÓN]... [BASE-DE-DATOS]\n"
+
+#: clusterdb.c:265 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opciones:\n"
+
+#: clusterdb.c:266
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all reordenar todas las bases de datos\n"
+
+#: clusterdb.c:267
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=BASE base de datos a reordenar\n"
+
+#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostrar las órdenes a medida que se ejecutan\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet no escribir ningún mensaje\n"
+
+#: clusterdb.c:270
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABLA reordenar sólo esta(s) tabla(s)\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose desplegar varios mensajes informativos\n"
+
+#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: clusterdb.c:274 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opciones de conexión:\n"
+
+#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=ANFITRIÓN nombre del servidor o directorio del socket\n"
+
+#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PUERTO puerto del servidor\n"
+
+#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USUARIO nombre de usuario para la conexión\n"
+
+#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pedir contraseña\n"
+
+#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password forzar la petición de contraseña\n"
+
+#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=BASE base de datos de mantención alternativa\n"
+
+#: clusterdb.c:281
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Lea la descripción de la orden CLUSTER de SQL para obtener mayores detalles.\n"
+
+#: clusterdb.c:282 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: clusterdb.c:283 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "la consulta retornó %d fila en lugar de una: %s"
+msgstr[1] "la consulta retornó %d filas en lugar de una: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "s"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Por favor conteste «%s» o «%s».\n"
+
+#: createdb.c:173
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "«%s» no es un nombre válido de codificación"
+
+#: createdb.c:243
+#, c-format
+msgid "database creation failed: %s"
+msgstr "falló la creación de la base de datos: %s"
+
+#: createdb.c:262
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "falló la creación del comentario (la base de datos fue creada): %s"
+
+#: createdb.c:280
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s crea una base de datos PostgreSQL.\n"
+"\n"
+
+#: createdb.c:282
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [OPCIÓN]... [NOMBRE] [DESCRIPCIÓN]\n"
+
+#: createdb.c:284
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TBLSPC tablespace por omisión de la base de datos\n"
+
+#: createdb.c:285 reindexdb.c:766
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostrar las órdenes enviadas al servidor\n"
+
+#: createdb.c:286
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=CODIF codificación para la base de datos\n"
+
+#: createdb.c:287
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE configuración regional para la base de datos\n"
+
+#: createdb.c:288
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE configuración LC_COLLATE para la base de datos\n"
+
+#: createdb.c:289
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE configuración LC_CTYPE para la base de datos\n"
+
+#: createdb.c:290
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE configuración regional ICU para la base de datos\n"
+
+#: createdb.c:291
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" proveedor de configuración regional para el ordenamiento\n"
+" por omisión de las bases de datos\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=DUEÑO usuario que será dueño de la base de datos\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr ""
+" -S, --strategy=ESTRATEGIA estrategia de creación de bases de datos\n"
+" wal_log o file_copy\n"
+
+#: createdb.c:295
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=PATRÓN base de datos patrón a copiar\n"
+
+#: createdb.c:296 reindexdb.c:775
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: createdb.c:297 reindexdb.c:776
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: createdb.c:299 reindexdb.c:778
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=ANFITRIÓN nombre del servidor o directorio del socket\n"
+
+#: createdb.c:300 reindexdb.c:779
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PUERTO puerto del servidor\n"
+
+#: createdb.c:301 reindexdb.c:780
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USUARIO nombre de usuario para la conexión\n"
+
+#: createdb.c:302 reindexdb.c:781
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pedir contraseña\n"
+
+#: createdb.c:303 reindexdb.c:782
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password forzar la petición de contraseña\n"
+
+#: createdb.c:304 reindexdb.c:783
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=BASE base de datos de mantención alternativa\n"
+
+#: createdb.c:305
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Si no se especifica, se creará una base de datos con el mismo nombre que\n"
+"el usuario actual.\n"
+
+#: createuser.c:193
+msgid "Enter name of role to add: "
+msgstr "Ingrese el nombre del rol a agregar: "
+
+#: createuser.c:208
+msgid "Enter password for new role: "
+msgstr "Ingrese la contraseña para el nuevo rol: "
+
+#: createuser.c:209
+msgid "Enter it again: "
+msgstr "Ingrésela nuevamente: "
+
+#: createuser.c:212
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Las contraseñas no coinciden.\n"
+
+#: createuser.c:220
+msgid "Shall the new role be a superuser?"
+msgstr "¿Será el nuevo rol un superusuario?"
+
+#: createuser.c:235
+msgid "Shall the new role be allowed to create databases?"
+msgstr "¿Debe permitírsele al rol la creación de bases de datos?"
+
+#: createuser.c:243
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "¿Debe permitírsele al rol la creación de otros roles?"
+
+#: createuser.c:278
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "el cifrado de la contraseña falló: %s"
+
+#: createuser.c:331
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "falló la creación del nuevo rol: %s"
+
+#: createuser.c:345
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s crea un nuevo rol de PostgreSQL.\n"
+"\n"
+
+#: createuser.c:347 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [OPCIÓN]... [ROL]\n"
+
+#: createuser.c:349
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr ""
+" -c, --connection-limit=N límite de conexiones para el rol\n"
+" (predeterminado: sin límite)\n"
+
+#: createuser.c:350
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb el rol podrá crear bases de datos\n"
+
+#: createuser.c:351
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb el rol no podrá crear bases de datos (predeterm.)\n"
+
+#: createuser.c:353
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROL el nuevo rol será un miembro de este rol\n"
+
+#: createuser.c:354
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit el rol heredará los privilegios de los roles de\n"
+" los cuales es miembro (predeterminado)\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit rol no heredará privilegios\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login el rol podrá conectarse (predeterminado)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login el rol no podrá conectarse\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt asignar una contraseña al nuevo rol\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole el rol podrá crear otros roles\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole el rol no podrá crear otros roles (predeterminado)\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser el rol será un superusuario\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser el rol no será un superusuario (predeterminado)\n"
+
+#: createuser.c:365
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive preguntar los nombres y atributos de rol faltantes\n"
+" en lugar de asumir los valores por omisión\n"
+
+#: createuser.c:367
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication el rol podrá iniciar replicación\n"
+
+#: createuser.c:368
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication el rol no podrá iniciar replicación\n"
+
+#: createuser.c:373
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr ""
+" -U, --username=NOMBRE nombre de usuario con el cual conectarse\n"
+" (no el usuario a crear)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "falta el nombre de base de datos requerido"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "La base de datos «%s» será eliminada permanentemente.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "¿Está seguro?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "falló la eliminación de la base de datos: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s elimina una base de datos de PostgreSQL.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [OPCIÓN]... BASE-DE-DATOS\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force intentar cancelar otras conexiones antes de borrar\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive preguntar antes de eliminar\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists no reportar error si la base de datos no existe\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Ingrese el nombre del rol a eliminar: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "falta el nombre de rol requerido"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "El rol «%s» será eliminado permanentemente.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "falló la eliminación del rol «%s»: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s elimina un rol de PostgreSQL.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive preguntar antes de eliminar cualquier cosa, y\n"
+" preguntar el nombre de rol si no se especifica\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists no reportar error si el usuario no existe\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr ""
+" -U, --username=USUARIO nombre del usuario con el cual conectarse\n"
+" (no el usuario a eliminar)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "no se pudo extraer las opciones por omisión"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "aceptando conexiones\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "rechazando conexiones\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "sin respuesta\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "sin intentos\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "desconocido\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s emite una prueba de conexión a una base de datos PostgreSQL.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPCIÓN]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DBNAME nombre de la base de datos\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet ejecutar de forma silenciosa\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=ANFITRIÓN nombre del servidor o directorio del socket\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PUERTO puerto del servidor\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr ""
+" -t, --timeout=SEGUNDOS segundos a esperar al intentar conectarse\n"
+" 0 lo deshabilita (por omisión: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USUARIO nombre de usuario para la conexión\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "no se pueden reindexar todas las bases de datos y una de ellas en particular simultáneamente"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "no se pueden reindexar todas las bases de datos y los catálogos del sistema simultáneamente"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "no es posible reindexar esquemas específicos en todas las bases de datos"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "no es posible reindexar tablas específicas en todas las bases de datos"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "no es posible reindexar índices específicos en todas las bases de datos"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "no es posible reindexar esquemas específicos y los catálogos del sistema simultáneamente"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "no es posible reindexar tablas específicas y los catálogos del sistema simultáneamente"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "no es posible reindexar índices específicos y los catálogos del sistema simultáneamente"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "no se pueden usar múltiples procesos para reindexar índices de sistema"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "no se pueden usar múltiples procesos para reindexar índices"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439
+#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469
+#: vacuumdb.c:473
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "no se puede usar la opción «%s» cuando con versiones más antiguas que PostgreSQL %s"
+
+#: reindexdb.c:369
+#, c-format
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr "no se puede reindexar un catálogo de sistema concurrentemente, omitiéndolos todos"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "falló la reindexación de la base de datos «%s»: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "falló la reindexación del índice «%s» en la base de datos «%s»: %s"
+
+#: reindexdb.c:581
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "falló la reindexación del esquema «%s» en la base de datos «%s»: %s"
+
+#: reindexdb.c:585
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "falló la reindexación de los catálogos de sistema en la base de datos «%s»: %s"
+
+#: reindexdb.c:589
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "falló la reindexación de la tabla «%s» en la base de datos «%s»: %s"
+
+#: reindexdb.c:742
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: reindexando la base de datos «%s»\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s reindexa una base de datos PostgreSQL.\n"
+"\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all reindexar todas las bases de datos\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently reindexar en modo concurrente\n"
+
+#: reindexdb.c:765
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=BASE-DATOS base de datos a reindexar\n"
+
+#: reindexdb.c:767
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=ÍNDICE recrear sólo este o estos índice(s)\n"
+
+#: reindexdb.c:768
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=NÚM usar esta cantidad de conexiones concurrentes\n"
+
+#: reindexdb.c:769
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet no desplegar mensajes\n"
+
+#: reindexdb.c:770
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system sólo reindexar los catálogos del sistema\n"
+
+#: reindexdb.c:771
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=ESQUEMA reindexar sólo este o estos esquemas\n"
+
+#: reindexdb.c:772
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLA reindexar sólo esta(s) tabla(s)\n"
+
+#: reindexdb.c:773
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=TABLESPACE tablespace donde se reconstruirán los índices\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose desplegar varios mensajes informativos\n"
+
+#: reindexdb.c:784
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Lea la descripción de la orden REINDEX de SQL para obtener mayores detalles.\n"
+
+#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279
+#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "no se puede usar la opción «%s» cuando se está sólo actualizando estadísticas"
+
+#: vacuumdb.c:297
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "no se puede usar la opción «%s» cuando se está ejecutando vacuum full"
+
+#: vacuumdb.c:303
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "no se puede usar la opción «%s» junto con la opción «%s»"
+
+#: vacuumdb.c:322
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "no se pueden limpiar todas las bases de datos y una de ellas en particular simultáneamente"
+
+#: vacuumdb.c:324
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "no es posible limpiar tablas específicas en todas las bases de datos"
+
+#: vacuumdb.c:412
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Generando estadísticas mínimas para el optimizador (tamaño = 1)"
+
+#: vacuumdb.c:413
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Generando estadísticas medias para el optimizador (tamaño = 10)"
+
+#: vacuumdb.c:414
+msgid "Generating default (full) optimizer statistics"
+msgstr "Generando estadísticas predeterminadas (completas) para el optimizador"
+
+#: vacuumdb.c:479
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: procesando la base de datos «%s»: %s\n"
+
+#: vacuumdb.c:482
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: limpiando la base de datos «%s»\n"
+
+#: vacuumdb.c:952
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "falló la limpieza de la tabla «%s» en la base de datos «%s»: %s"
+
+#: vacuumdb.c:955
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "falló la limpieza de la base de datos «%s»: %s"
+
+#: vacuumdb.c:963
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s limpia (VACUUM) y analiza una base de datos PostgreSQL.\n"
+"\n"
+
+#: vacuumdb.c:967
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all limpia todas las bases de datos\n"
+
+#: vacuumdb.c:968
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=BASE base de datos a limpiar\n"
+
+#: vacuumdb.c:969
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping desactiva todo comportamiento de saltar páginas\n"
+
+#: vacuumdb.c:970
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostrar las órdenes enviadas al servidor\n"
+
+#: vacuumdb.c:971
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full usar «vacuum full»\n"
+
+#: vacuumdb.c:972
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze usar «vacuum freeze»\n"
+
+#: vacuumdb.c:973
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr " --force-index-cleanup siempre eliminar entradas de índice que apunten a tuplas muertas\n"
+
+#: vacuumdb.c:974
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=NUM usar esta cantidad de conexiones concurrentes\n"
+
+#: vacuumdb.c:975
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=EDAD_MXID edad de multixact ID mínima de tablas a limpiar\n"
+
+#: vacuumdb.c:976
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=EDAD_XID edad de ID de transacción mínima de tablas a limpiar\n"
+
+#: vacuumdb.c:977
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr " --no-index-cleanup no eliminar entradas de índice que apunten a tuplas muertas\n"
+
+#: vacuumdb.c:978
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr " --no-process-toast omitir la tabla TOAST asociada con la tabla a la que se hará vacuum\n"
+
+#: vacuumdb.c:979
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate no truncar las páginas vacías al final de la tabla\n"
+
+#: vacuumdb.c:980
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr " -P, --parallel=NPROCS usar esta cantidad de procesos para vacuum, si están disponibles\n"
+
+#: vacuumdb.c:981
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet no desplegar mensajes\n"
+
+#: vacuumdb.c:982
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked ignorar relaciones que no pueden bloquearse inmediatamente\n"
+
+#: vacuumdb.c:983
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr ""
+" -t, --table='TABLA[(COLUMNAS)]'\n"
+" limpiar sólo esta(s) tabla(s)\n"
+
+#: vacuumdb.c:984
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose desplegar varios mensajes informativos\n"
+
+#: vacuumdb.c:985
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: vacuumdb.c:986
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze actualizar las estadísticas del optimizador\n"
+
+#: vacuumdb.c:987
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr ""
+" -Z, --analyze-only sólo actualizar las estadísticas del optimizador;\n"
+" no hacer vacuum\n"
+
+#: vacuumdb.c:988
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages sólo actualizar las estadísticas del optimizador,\n"
+" en múltiples etapas para resultados más rápidos;\n"
+" no hacer vacuum\n"
+
+#: vacuumdb.c:990
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: vacuumdb.c:998
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Lea la descripción de la orden VACUUM de SQL para obtener mayores detalles.\n"
diff --git a/src/bin/scripts/po/fr.po b/src/bin/scripts/po/fr.po
new file mode 100644
index 0000000..d024520
--- /dev/null
+++ b/src/bin/scripts/po/fr.po
@@ -0,0 +1,1444 @@
+# LANGUAGE message translation file for pgscripts
+# Copyright (C) 2004-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pgscripts (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2004-2009.
+# Stéphane Schildknecht <stephane.schildknecht@dalibo.com>, 2009.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2010-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-10-29 12:05+0000\n"
+"PO-Revision-Date: 2023-10-30 13:37+0100\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.4\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "n'a pas pu trouver l'identifiant réel %ld de l'utilisateur : %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "l'utilisateur n'existe pas"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Requête d'annulation envoyée\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "N'a pas pu envoyer la requête d'annulation : "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104
+msgid "Password: "
+msgstr "Mot de passe : "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "n'a pas pu se connecter à la base de données %s : plus de mémoire"
+
+#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valeur « %s » invalide pour l'option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s doit être compris entre %d et %d"
+
+#: ../../fe_utils/parallel_slot.c:319
+#, c-format
+msgid "too many jobs for this platform: %d"
+msgstr "trop de jobs pour cette plateforme : %d"
+
+#: ../../fe_utils/parallel_slot.c:328
+#, c-format
+msgid "socket file descriptor out of range for select(): %d"
+msgstr "descripteur de fichier socket hors d'échelle pour select() : %d"
+
+#: ../../fe_utils/parallel_slot.c:330
+#, c-format
+msgid "Try fewer jobs."
+msgstr "Essayez moins de jobs."
+
+#: ../../fe_utils/parallel_slot.c:552
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "le traitement de la base de données « %s » a échoué : %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu ligne)"
+msgstr[1] "(%lu lignes)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Interrompu\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr ""
+"Ne peut pas ajouter l'en-tête au contenu de la table : le nombre de colonnes\n"
+"%d est dépassé.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr ""
+"Ne peut pas ajouter une cellule au contenu de la table : le nombre total des\n"
+"cellules %d est dépassé.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "format de sortie invalide (erreur interne) : %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "échec de la requête : %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "La requête était : %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158
+#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121
+#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111
+#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "ne peut pas réorganiser à la fois toutes les bases de données et une base spécifique via la commande CLUSTER"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "ne peut pas réorganiser la(les) table(s) spécifique(s) dans toutes les bases de données"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "la réorganisation de la table « %s » de la base de données « %s » avec la commande CLUSTER a échoué : %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "la réorganisation de la base de données « %s » via la commande CLUSTER a échoué : %s"
+
+#: clusterdb.c:248
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s : réorganisation de la base de données « %s » via la commande CLUSTER\n"
+
+#: clusterdb.c:264
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s réorganise toutes les tables précédemment réorganisées au sein d'une\n"
+"base de données via la commande CLUSTER.\n"
+"\n"
+
+#: clusterdb.c:265 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:762 vacuumdb.c:964
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: clusterdb.c:266 reindexdb.c:763 vacuumdb.c:965
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [BASE]\n"
+
+#: clusterdb.c:267 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:764 vacuumdb.c:966
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options :\n"
+
+#: clusterdb.c:268
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all réorganise toutes les bases de données\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=BASE réorganise la base de données spécifiée\n"
+
+#: clusterdb.c:270 createuser.c:352 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo affiche les commandes envoyées au serveur\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet n'écrit aucun message\n"
+
+#: clusterdb.c:272
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABLE réorganise uniquement la table spécifiée\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mode verbeux\n"
+
+#: clusterdb.c:274 createuser.c:364 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: clusterdb.c:275 createuser.c:369 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: clusterdb.c:276 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:779 vacuumdb.c:991
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Options de connexion :\n"
+
+#: clusterdb.c:277 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HÔTE hôte du serveur de bases de données ou\n"
+" répertoire des sockets\n"
+
+#: clusterdb.c:278 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT port du serveur de bases de données\n"
+
+#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:994
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n"
+
+#: clusterdb.c:280 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password empêche la demande d'un mot de passe\n"
+
+#: clusterdb.c:281 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password force la demande d'un mot de passe\n"
+
+#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:997
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=BASE indique une autre base par défaut\n"
+
+#: clusterdb.c:283
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Lire la description de la commande SQL CLUSTER pour de plus amples détails.\n"
+
+#: clusterdb.c:284 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:787 vacuumdb.c:999
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: clusterdb.c:285 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:788 vacuumdb.c:1000
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "la requête a renvoyé %d ligne au lieu d'une seule : %s"
+msgstr[1] "la requête a renvoyé %d lignes au lieu d'une seule : %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "o"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Merci de répondre « %s » ou « %s ».\n"
+
+#: createdb.c:173
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "« %s » n'est pas un nom d'encodage valide"
+
+#: createdb.c:243
+#, c-format
+msgid "database creation failed: %s"
+msgstr "la création de la base de données a échoué : %s"
+
+#: createdb.c:262
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "l'ajout du commentaire a échoué (la base de données a été créée) : %s"
+
+#: createdb.c:280
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s crée une base de données PostgreSQL.\n"
+"\n"
+
+#: createdb.c:282
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [OPTION]... [BASE] [DESCRIPTION]\n"
+
+#: createdb.c:284
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE tablespace par défaut de la base de données\n"
+
+#: createdb.c:285 reindexdb.c:768
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo affiche les commandes envoyées au serveur\n"
+
+#: createdb.c:286
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=ENCODAGE encodage de la base de données\n"
+
+#: createdb.c:287
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE paramètre de la locale pour la base de données\n"
+
+#: createdb.c:288
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE paramètre LC_COLLATE pour la base de données\n"
+
+#: createdb.c:289
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE paramètre LC_CTYPE pour la base de données\n"
+
+#: createdb.c:290
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE paramètre de la locale ICU pour la base de données\n"
+
+#: createdb.c:291
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" fournisseur de locale pour la collation par défaut de la base de données\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr ""
+" -O, --owner=PROPRIÉTAIRE nom du propriétaire de la nouvelle base de\n"
+" données\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr " -S, --strategy=STRATEGIE stratégie de création de base (wal_log ou file_copy)\n"
+
+#: createdb.c:295
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=MODÈLE base de données modèle à copier\n"
+
+#: createdb.c:296 reindexdb.c:777
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: createdb.c:297 reindexdb.c:778
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: createdb.c:299 reindexdb.c:780
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HÔTE hôte du serveur de bases de données\n"
+" ou répertoire des sockets\n"
+
+#: createdb.c:300 reindexdb.c:781
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT port du serveur de bases de données\n"
+
+#: createdb.c:301 reindexdb.c:782
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n"
+
+#: createdb.c:302 reindexdb.c:783
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password empêche la demande d'un mot de passe\n"
+
+#: createdb.c:303 reindexdb.c:784
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password force la demande d'un mot de passe\n"
+
+#: createdb.c:304 reindexdb.c:785
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=BASE indique une autre base par défaut\n"
+
+#: createdb.c:305
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Par défaut, la base de donnée créée porte le nom de l'utilisateur courant.\n"
+
+#: createuser.c:193
+msgid "Enter name of role to add: "
+msgstr "Saisir le nom du rôle à ajouter : "
+
+#: createuser.c:208
+msgid "Enter password for new role: "
+msgstr "Saisir le mot de passe pour le nouveau rôle : "
+
+#: createuser.c:209
+msgid "Enter it again: "
+msgstr "Saisir le mot de passe à nouveau : "
+
+#: createuser.c:212
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Les mots de passe ne sont pas identiques.\n"
+
+#: createuser.c:220
+msgid "Shall the new role be a superuser?"
+msgstr "Le nouveau rôle est-il super-utilisateur ?"
+
+#: createuser.c:235
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Le nouveau rôle est-il autorisé à créer des bases de données ?"
+
+#: createuser.c:243
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Le nouveau rôle est-il autorisé à créer de nouveaux rôles ?"
+
+#: createuser.c:278
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "échec du chiffrement du mot de passe : %s"
+
+#: createuser.c:331
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "la création du nouveau rôle a échoué : %s"
+
+#: createuser.c:345
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s crée un nouvel rôle PostgreSQL.\n"
+"\n"
+
+#: createuser.c:347 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [OPTION]... [RÔLE]\n"
+
+#: createuser.c:349
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr ""
+" -c, --connection-limit=N nombre maximum de connexions pour le rôle (par\n"
+" défaut sans limite)\n"
+
+#: createuser.c:350
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb le rôle peut créer des bases de données\n"
+
+#: createuser.c:351
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr ""
+" -D, --no-createdb le rôle ne peut pas créer de bases de données\n"
+" (par défaut)\n"
+
+#: createuser.c:353
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROLE le nouveau rôle sera un membre de ce rôle\n"
+
+#: createuser.c:354
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit le rôle hérite des droits des rôles dont il est\n"
+" membre (par défaut)\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit le rôle n'hérite pas des droits\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login le rôle peut se connecter (par défaut)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login le rôle ne peut pas se connecter\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt affecte un mot de passe au nouveau rôle\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole le rôle peut créer des rôles\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole le rôle ne peut pas créer de rôles (par défaut)\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser le rôle est super-utilisateur\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr ""
+" -S, --no-superuser le rôle n'est pas super-utilisateur (par\n"
+" défaut)\n"
+
+#: createuser.c:365
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive demande le nom du rôle et les attributs\n"
+" plutôt qu'utiliser des valeurs par défaut\n"
+
+#: createuser.c:367
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr ""
+" --replication le rôle peut initier une connexion de\n"
+" réplication\n"
+
+#: createuser.c:368
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr ""
+" --no-replication le rôle ne peut pas initier de connexion de\n"
+" réplication\n"
+
+#: createuser.c:373
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr ""
+" -U, --username=UTILISATEUR nom de l'utilisateur pour la connexion (pas\n"
+" celui à créer)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "argument nom de la base de données requis mais manquant"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "La base de données « %s » sera définitivement supprimée.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Êtes-vous sûr ?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "la suppression de la base de données a échoué : %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s supprime une base de données PostgreSQL.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [OPTION]... BASE\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr ""
+" -f, --force essaie d'arrêter les autres connexions avant de\n"
+" supprimer\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr ""
+" -i, --interactive demande confirmation avant de supprimer quoi\n"
+" que ce soit\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr ""
+" --if-exists ne renvoie pas d'erreur si la base\n"
+" n'existe pas\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Saisir le nom du rôle à supprimer : "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "argument nom du rôle requis mais manquant"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Le rôle « %s » sera définitivement supprimé.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "la suppression du rôle « %s » a échoué : %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s supprime un rôle PostgreSQL.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive demande confirmation avant de supprimer quoi\n"
+" que ce soit, et demande le nom du rôle s'il\n"
+" n'est pas indiqué\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr ""
+" --if-exists ne renvoie pas d'erreur si l'utilisateur\n"
+" n'existe pas\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr ""
+" -U, --username=UTILISATEUR nom de l'utilisateur pour la connexion (pas\n"
+" celui à supprimer)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "n'a pas pu récupérer les options par défaut"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "acceptation des connexions\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "rejet des connexions\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "pas de réponse\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "pas de tentative\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "inconnu\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s réalise un test de connexion à une base de données PostgreSQL.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=BASE base de données\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet s'exécute sans affichage\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HÔTE hôte du serveur de bases de données ou\n"
+" répertoire des sockets\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT port du serveur de bases de données\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr ""
+" -t, --timeout=SECS durée en secondes à attendre lors d'une tentative\n"
+" de connexion ; 0 pour désactiver (défaut: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "ne peut pas réindexer toutes les bases de données et une base spécifique en même temps"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "ne peut pas réindexer toutes les bases de données et les catalogues système en même temps"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "ne peut pas réindexer un (des) schéma(s) spécifique(s) dans toutes les bases de données"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "ne peut pas réindexer une (des) table(s) spécifique(s) dans toutes les bases de données"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "ne peut pas réindexer un (des) index spécifique(s) dans toutes les bases de données"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "ne peut pas réindexer un (des) schéma(s) spécifique(s) et les catalogues système en même temps"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "ne peut pas réindexer une (des) table(s) spécifique(s) etles catalogues système en même temps"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "ne peut pas réindexer un (des) index spécifique(s) et les catalogues système en même temps"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "ne peut pas utiliser plusieurs jobs pour réindexer les catalogues systèmes"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "ne peut pas utiliser plusieurs jobs pour réindexer les index"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439
+#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469
+#: vacuumdb.c:473
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "ne peut utiliser l'option « %s » sur des versions serveurs plus anciennes que PostgreSQL %s"
+
+#: reindexdb.c:369
+#, c-format
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr "ne peut pas réindexer les catalogues système de manière concurrente, ignore tout"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "la réindexation de la base de données « %s » a échoué : %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "la réindexation de l'index « %s » dans la base de données « %s » a échoué : %s"
+
+#: reindexdb.c:581
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "la réindexation du schéma « %s » dans la base de données « %s » a échoué : %s"
+
+#: reindexdb.c:585
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "la réindexation des catalogues systèmes dans la base de données « %s » a échoué : %s"
+
+#: reindexdb.c:589
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "la réindexation de la table « %s » dans la base de données « %s » a échoué : %s"
+
+#: reindexdb.c:744
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s : réindexation de la base de données « %s »\n"
+
+#: reindexdb.c:761
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s réindexe une base de données PostgreSQL.\n"
+"\n"
+
+#: reindexdb.c:765
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all réindexe toutes les bases de données\n"
+
+#: reindexdb.c:766
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently réindexation en concurrence\n"
+
+#: reindexdb.c:767
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=BASE réindexe la base de données spécifiée\n"
+
+#: reindexdb.c:769
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX réindexe uniquement l'index spécifié\n"
+
+#: reindexdb.c:770
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr ""
+" -j, --jobs=NOMBRE utilise ce nombre de connexions concurrentes\n"
+" pour l'opération de réindexation\n"
+
+#: reindexdb.c:771
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet n'écrit aucun message\n"
+
+#: reindexdb.c:772
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system réindexe seulement les catalogues système\n"
+
+#: reindexdb.c:773
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHÉMA réindexe uniquement le schéma spécifié\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLE réindexe uniquement la table spécifiée\n"
+
+#: reindexdb.c:775
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr ""
+" --tablespace=TABLESPACE précise le tablespace où les index seront\n"
+" reconstruits\n"
+
+#: reindexdb.c:776
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mode verbeux\n"
+
+#: reindexdb.c:786
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Lire la description de la commande SQL REINDEX pour plus d'informations.\n"
+
+#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279
+#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "ne peut pas utiliser l'option « %s » lors de l'exécution d'un ANALYZE seul"
+
+#: vacuumdb.c:297
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "ne peut pas utiliser l'option « %s » lors de l'exécution d'un VACUUM FULL"
+
+#: vacuumdb.c:303
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "ne peut pas utiliser l'option « %s » lors de l'option « %s »"
+
+#: vacuumdb.c:322
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "ne peut pas exécuter VACUUM sur toutes les bases de données et sur une base spécifique en même temps"
+
+#: vacuumdb.c:324
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "ne peut pas exécuter VACUUM sur une(des) table(s) spécifique(s) dans toutes les bases de données"
+
+#: vacuumdb.c:412
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Génération de statistiques minimales pour l'optimiseur (une cible)"
+
+#: vacuumdb.c:413
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Génération de statistiques moyennes pour l'optimiseur (dix cibles)"
+
+#: vacuumdb.c:414
+msgid "Generating default (full) optimizer statistics"
+msgstr "Génération de statistiques complètes pour l'optimiseur"
+
+#: vacuumdb.c:479
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s : traitement de la base de données « %s » %s\n"
+
+#: vacuumdb.c:482
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s : exécution de VACUUM sur la base de données « %s »\n"
+
+#: vacuumdb.c:952
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "l'exécution de VACUUM sur la table « %s » dans la base de données « %s » a échoué : %s"
+
+#: vacuumdb.c:955
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "l'exécution de VACUUM sur la base de données « %s » a échoué : %s"
+
+#: vacuumdb.c:963
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s nettoie et analyse une base de données PostgreSQL.\n"
+"\n"
+
+#: vacuumdb.c:967
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all exécute VACUUM sur toutes les bases de données\n"
+
+#: vacuumdb.c:968
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=BASE exécute VACUUM sur cette base de données\n"
+
+#: vacuumdb.c:969
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping désactive le comportement page-skipping\n"
+
+#: vacuumdb.c:970
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo affiche les commandes envoyées au serveur\n"
+
+#: vacuumdb.c:971
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full exécute VACUUM en mode FULL\n"
+
+#: vacuumdb.c:972
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr ""
+" -F, --freeze gèle les informations de transactions des\n"
+" lignes\n"
+
+#: vacuumdb.c:973
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr ""
+" --force-index-cleanup supprime toujours les enregistrements dans\n"
+" l'index pointant vers des lignes mortes\n"
+
+#: vacuumdb.c:974
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr ""
+" -j, --jobs=NOMBRE utilise ce nombre de connexions concurrentes\n"
+" pour le VACUUM\n"
+
+#: vacuumdb.c:975
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr ""
+" --min-mxid-age=MXID_AGE âge minimum des identifiants de\n"
+" multitransactions pour les tables à nettoyer\n"
+
+#: vacuumdb.c:976
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr ""
+" --min-xid-age=XID_AGE âge minimum des identifiants de transactions\n"
+" pour les tables à nettoyer\n"
+
+#: vacuumdb.c:977
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr ""
+" --no-index-cleanup ne supprime pas les enregistrements dans\n"
+" l'index pointant vers des lignes mortes\n"
+
+#: vacuumdb.c:978
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr ""
+" --no-process-toast ignore la table TOAST associée à la table à\n"
+" traiter\n"
+
+#: vacuumdb.c:979
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr ""
+" --no-truncate ne supprime pas les pages vides à la fin de\n"
+" la table\n"
+
+#: vacuumdb.c:980
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr ""
+" -P, --parallel=NOMBRE utilise ce nombre de processus en tâche de\n"
+" fond pour le VACUUM, si possible\n"
+
+#: vacuumdb.c:981
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet n'écrit aucun message\n"
+
+#: vacuumdb.c:982
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr ""
+" --skip-locked ignore les relations qui ne peuvent pas être\n"
+" verrouillées immédiatement\n"
+
+#: vacuumdb.c:983
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABLE[(COLONNES)]' exécute VACUUM sur cette table\n"
+
+#: vacuumdb.c:984
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mode verbeux\n"
+
+#: vacuumdb.c:985
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: vacuumdb.c:986
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze met à jour les statistiques de l'optimiseur\n"
+
+#: vacuumdb.c:987
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr ""
+" -Z, --analyze-only met seulement à jour les statistiques de\n"
+" l'optimiseur ; pas de VACUUM\n"
+
+#: vacuumdb.c:988
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages met seulement à jour les statistiques de\n"
+" l'optimiseur, en plusieurs étapes pour de\n"
+" meilleurs résultats ; pas de VACUUM\n"
+
+#: vacuumdb.c:990
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: vacuumdb.c:998
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Lire la description de la commande SQL VACUUM pour plus d'informations.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If one of -d, -D, -r, -R, -s, -S, and ROLENAME is not specified, you will\n"
+#~ "be prompted interactively.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Si une des options -d, -D, -r, -R, -s, -S et RÔLE n'est pas précisée,\n"
+#~ "elle sera demandée interactivement.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid " %s [OPTION]... LANGNAME [DBNAME]\n"
+#~ msgstr " %s [OPTION]... NOMLANGAGE [BASE]\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide et quitte\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide et quitte\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide et quitte\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version affiche la version et quitte\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version affiche la version et quitte\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version affiche la version et quitte\n"
+
+#~ msgid " -E, --encrypted encrypt stored password\n"
+#~ msgstr " -E, --encrypted chiffre le mot de passe stocké\n"
+
+#~ msgid " -N, --unencrypted do not encrypt stored password\n"
+#~ msgstr " -N, --unencrypted ne chiffre pas le mot de passe stocké\n"
+
+#~ msgid " -d, --dbname=DBNAME database from which to remove the language\n"
+#~ msgstr ""
+#~ " -d, --dbname=BASE base de données à partir de laquelle\n"
+#~ " supprimer le langage\n"
+
+#~ msgid " -d, --dbname=DBNAME database to install language in\n"
+#~ msgstr " -d, --dbname=BASE base sur laquelle installer le langage\n"
+
+#~ msgid " -l, --list show a list of currently installed languages\n"
+#~ msgstr ""
+#~ " -l, --list affiche la liste des langages déjà\n"
+#~ " installés\n"
+
+#~ msgid ""
+#~ "%s installs a procedural language into a PostgreSQL database.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s installe un langage de procédures dans une base de données PostgreSQL.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "%s removes a procedural language from a database.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s supprime un langage procédural d'une base de données.\n"
+#~ "\n"
+
+#~ msgid "%s: \"%s\" is not a valid encoding name\n"
+#~ msgstr "%s : « %s » n'est pas un nom d'encodage valide\n"
+
+#~ msgid "%s: %s"
+#~ msgstr "%s : %s"
+
+#~ msgid "%s: cannot use the \"freeze\" option when performing only analyze\n"
+#~ msgstr ""
+#~ "%s : ne peut utiliser l'option « freeze » lors de l'exécution d'un ANALYZE\n"
+#~ "seul\n"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s : n'a pas pu récupérer le nom de l'utilisateur actuel : %s\n"
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s : n'a pas pu obtenir les informations concernant l'utilisateur actuel : %s\n"
+
+#~ msgid "%s: invalid socket: %s"
+#~ msgstr "%s : socket invalide : %s"
+
+#~ msgid "%s: language \"%s\" is already installed in database \"%s\"\n"
+#~ msgstr "%s : le langage « %s » est déjà installé sur la base de données « %s »\n"
+
+#~ msgid "%s: language \"%s\" is not installed in database \"%s\"\n"
+#~ msgstr "%s : le langage « %s » n'est pas installé dans la base de données « %s »\n"
+
+#~ msgid "%s: language installation failed: %s"
+#~ msgstr "%s : l'installation du langage a échoué : %s"
+
+#~ msgid "%s: language removal failed: %s"
+#~ msgstr "%s : la suppression du langage a échoué : %s"
+
+#~ msgid "%s: missing required argument language name\n"
+#~ msgstr "%s : argument nom du langage requis mais manquant\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s : mémoire épuisée\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s : échec de la requête : %s"
+
+#~ msgid "%s: query returned %d row instead of one: %s\n"
+#~ msgid_plural "%s: query returned %d rows instead of one: %s\n"
+#~ msgstr[0] "%s : la requête a renvoyé %d ligne au lieu d'une seule : %s\n"
+#~ msgstr[1] "%s : la requête a renvoyé %d lignes au lieu d'une seule : %s\n"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s : la requête était : %s\n"
+
+#~ msgid "%s: still %s functions declared in language \"%s\"; language not removed\n"
+#~ msgstr ""
+#~ "%s : il existe encore %s fonctions déclarées dans le langage « %s » ;\n"
+#~ "langage non supprimé\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#~ msgid "%s: too many parallel jobs requested (maximum: %d)\n"
+#~ msgstr "%s : trop de jobs en parallèle demandés (maximum %d)\n"
+
+#~ msgid "Could not send cancel request: %s"
+#~ msgstr "N'a pas pu envoyer la requête d'annulation : %s"
+
+#~ msgid "Name"
+#~ msgstr "Nom"
+
+#~ msgid "Procedural Languages"
+#~ msgstr "Langages procéduraux"
+
+#~ msgid "Trusted?"
+#~ msgstr "De confiance (trusted) ?"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayer « %s --help » pour plus d'informations.\n"
+
+#~ msgid "could not connect to database %s: %s"
+#~ msgstr "n'a pas pu se connecter à la base de données %s : %s"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#, c-format
+#~ msgid "invalid value for --connection-limit: %s"
+#~ msgstr "valeur invalide pour --connection-limit : %s"
+
+#, c-format
+#~ msgid "minimum multixact ID age must be at least 1"
+#~ msgstr "l'âge minimum de l'identifiant de multitransaction doit au moins être 1"
+
+#, c-format
+#~ msgid "minimum transaction ID age must be at least 1"
+#~ msgstr "l'identifiant de la transaction (-x) doit valoir au moins 1"
+
+#~ msgid "no"
+#~ msgstr "non"
+
+#, c-format
+#~ msgid "number of parallel jobs must be at least 1"
+#~ msgstr "le nombre maximum de jobs en parallèle doit être au moins de 1"
+
+#, c-format
+#~ msgid "only one of --locale and --lc-collate can be specified"
+#~ msgstr "une seule des options --locale et --lc-collate peut être indiquée"
+
+#, c-format
+#~ msgid "only one of --locale and --lc-ctype can be specified"
+#~ msgstr "une seule des options --locale et --lc-ctype peut être indiquée"
+
+#~ msgid "parallel vacuum degree must be a non-negative integer"
+#~ msgstr "le degré de parallélisation du VACUUM doit être un entier non négatif"
+
+#, c-format
+#~ msgid "parallel workers for vacuum must be greater than or equal to zero"
+#~ msgstr "le nombre de processus parallélisés pour l VACUUM doit être supérieur à zéro"
+
+#~ msgid "pg_strdup: cannot duplicate null pointer (internal error)\n"
+#~ msgstr "pg_strdup : ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#~ msgid "reindexing of system catalogs failed: %s"
+#~ msgstr "la réindexation des catalogues système a échoué : %s"
+
+#~ msgid "yes"
+#~ msgstr "oui"
diff --git a/src/bin/scripts/po/it.po b/src/bin/scripts/po/it.po
new file mode 100644
index 0000000..50551cd
--- /dev/null
+++ b/src/bin/scripts/po/it.po
@@ -0,0 +1,1228 @@
+#
+# pgscripts.po
+# Italian message translation file for pgscripts
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+# Copyright (C) 2010, Associazione Culturale ITPUG
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017.
+# Emanuele Zamprogno <ez@medicinaopen.info>, 2009.
+# Mirko Tebaldi <mirko.tebaldi@libero.it>, 2004.
+# Fabrizio Mazzoni <veramente@libero.it>, 2003.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:19+0000\n"
+"PO-Revision-Date: 2022-10-03 20:43+0200\n"
+"Last-Translator: Daniele Varrazzo <daniele.varrazzo@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "impossibile duplicare il puntatore nullo (errore interno)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "impossibile cercare l'ID utente effettivo %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "l'utente non esiste"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "ricerca del nome utente fallita: codice di errore %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Richiesta di annullamento inviata\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Impossibile inviare la richiesta di annullamento: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104
+msgid "Password: "
+msgstr "Password: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "impossibile connettersi al database %s: memoria insufficiente"
+
+#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valore \"%s\" non valido per l'opzione %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s deve essere compreso nell'intervallo %d..%d"
+
+#: ../../fe_utils/parallel_slot.c:301
+#, c-format
+msgid "too many jobs for this platform"
+msgstr "troppi lavori per questa piattaforma"
+
+#: ../../fe_utils/parallel_slot.c:519
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "elaborazione del database \"%s\" non riuscita: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu riga)"
+msgstr[1] "(%lu righe)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Interrotto\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Impossibile aggiungere l'intestazione al contenuto della tabella: numero di colonne è più di %d.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Impossibile aggiungere la cella al contenuto della tabella: il numero totale di celle è più di %d.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "formato di output non valido (errore interno): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "query fallita: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "La richiesta era: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158
+#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121
+#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111
+#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "non può raggruppare tutti i database e uno specifico contemporaneamente"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "impossibile raggruppare tabelle specifiche in tutti i database"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "raggruppamento della tabella \"%s\" nel database \"%s\" non riuscito: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "raggruppamento del database \"%s\" non riuscito: %s"
+
+#: clusterdb.c:246
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: riordino del database \"%s\"\n"
+
+#: clusterdb.c:262
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s raggruppa tutte le tabelle precedentemente raggruppate in un database.\n"
+"\n"
+
+#: clusterdb.c:263 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPZIONE]... [NOMEDB]\n"
+
+#: clusterdb.c:265 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opzioni:\n"
+
+#: clusterdb.c:266
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all raggruppa tutti i database\n"
+
+#: clusterdb.c:267
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=NOMEDB database da raggruppare\n"
+
+#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostra i comandi inviati al server\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet non stampare alcun messaggio\n"
+
+#: clusterdb.c:270
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABELLA raggruppa solo le tabelle specificate\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mostra un output completo\n"
+
+#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: clusterdb.c:274 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opzioni di connessione:\n"
+
+#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME host del server database o directory socket\n"
+
+#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORTA porta del server database\n"
+
+#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UTENTE nome utente da utilizzare per la connessione\n"
+
+#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password non richiedere mai una password\n"
+
+#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password forza la richiesta di una password\n"
+
+#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=NOMEDB database di manutenzione alternativo\n"
+
+#: clusterdb.c:281
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Consulta la descrizione del comando SQL CLUSTER per maggiori informazioni.\n"
+
+#: clusterdb.c:282 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: clusterdb.c:283 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "la query ha restituito %d riga anziché una: %s"
+msgstr[1] "le query hanno restituito %d righe invece di una: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "s"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Prego rispondere \"%s\" o \"%s\".\n"
+
+#: createdb.c:173
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" non è un nome di codifica valido"
+
+#: createdb.c:243
+#, c-format
+msgid "database creation failed: %s"
+msgstr "creazione del database non riuscita: %s"
+
+#: createdb.c:262
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "creazione commento non riuscita (database creato): %s"
+
+#: createdb.c:280
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s crea un database PostgreSQL.\n"
+"\n"
+
+#: createdb.c:282
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [OPZIONE]... [NOMEDB] [DESCRIZIONE]\n"
+
+#: createdb.c:284
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE tablespace predefinito per il database\n"
+
+#: createdb.c:285 reindexdb.c:766
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostra i comandi che vengono inviati al server\n"
+
+#: createdb.c:286
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=ENCODING codifica del database\n"
+
+#: createdb.c:287
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE impostazioni di localizzazione del database\n"
+
+#: createdb.c:288
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE impostazione LC_COLLATE per il database\n"
+
+#: createdb.c:289
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE impostazione LC_CTYPE per il database\n"
+
+#: createdb.c:290
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE Impostazione locale ICU per il database\n"
+
+#: createdb.c:291
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" provider delle impostazioni locali per le regole di confronto predefinite del database\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=OWNER utente database proprietario del nuovo database\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr " -S, --strategy=strategia di creazione del database STRATEGIA wal_log o file_copy\n"
+
+#: createdb.c:295
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=TEMPLATE modello database da copiare\n"
+
+#: createdb.c:296 reindexdb.c:775
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: createdb.c:297 reindexdb.c:776
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: createdb.c:299 reindexdb.c:778
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME host del server database o directory socket\n"
+
+#: createdb.c:300 reindexdb.c:779
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT porta del server database\n"
+
+#: createdb.c:301 reindexdb.c:780
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME nome utente da usare per connettersi\n"
+
+#: createdb.c:302 reindexdb.c:781
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password non richiedere mai una password\n"
+
+#: createdb.c:303 reindexdb.c:782
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password forza la richiesta di una password\n"
+
+#: createdb.c:304 reindexdb.c:783
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=NOMEDB database di manutenzione alternativo\n"
+
+#: createdb.c:305
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Se il nome non è specificato verrà creato un database con lo stesso nome\n"
+"dell'utente corrente.\n"
+
+#: createuser.c:193
+msgid "Enter name of role to add: "
+msgstr "Inserisci il nome del ruolo da aggiungere: "
+
+#: createuser.c:208
+msgid "Enter password for new role: "
+msgstr "Inserisci la password per il nuovo ruolo: "
+
+#: createuser.c:209
+msgid "Enter it again: "
+msgstr "Conferma password: "
+
+#: createuser.c:212
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Le password non corrispondono.\n"
+
+#: createuser.c:220
+msgid "Shall the new role be a superuser?"
+msgstr "Il nuovo ruolo dev'essere un superutente?"
+
+#: createuser.c:235
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Il nuovo ruolo può creare database?"
+
+#: createuser.c:243
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Il nuovo ruolo può creare altri ruoli?"
+
+#: createuser.c:278
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "crittografia della password non riuscita: %s"
+
+#: createuser.c:331
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "creazione di un nuovo ruolo non riuscita: %s"
+
+#: createuser.c:345
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s crea un nuovo ruolo PostgreSQL.\n"
+"\n"
+
+#: createuser.c:347 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [OPZIONI]... [NOME_RUOLO]\n"
+
+#: createuser.c:349
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N limite di connessione per un ruolo (predefinito: nessun limite)\n"
+
+#: createuser.c:350
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb il ruolo può creare nuovi database\n"
+
+#: createuser.c:351
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb il ruolo non può creare database (predefinito)\n"
+
+#: createuser.c:353
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=RUOLO il nuovo ruolo sarà membro di questo ruolo\n"
+
+#: createuser.c:354
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit il ruolo eredita i privilegi dei ruoli di cui\n"
+" è membro (predefinito)\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit il ruolo non eredita privilegi\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login il ruolo può accedere al database (predefinito)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login il ruolo non può accedere al database\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt assegna una password al nuovo ruolo\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole il ruolo può creare nuovi ruoli\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole il ruolo non può creare ruoli (predefinito)\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser il ruolo sarà un superutente\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser il ruolo non sarà un superutente (predefinito)\n"
+
+#: createuser.c:365
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive richiedi i nomi ed attributi dei ruoli mancanti\n"
+" invece di usare i valori predefiniti\n"
+
+#: createuser.c:367
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication il ruolo può avviare una replica\n"
+
+#: createuser.c:368
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication il ruolo non può avviare una replica\n"
+
+#: createuser.c:373
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr ""
+" -U, --username=UTENTE nome utente con cui collegarsi\n"
+" (non quello da creare)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "nome del database dell'argomento richiesto mancante"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "Il database \"%s\" sarà eliminato definitivamente.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Sei sicuro?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "rimozione del database non riuscita: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s elimina un database PostgreSQL.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [OPZIONE]... NOMEDB\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force prova a terminare altre connessioni prima di cadere\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive chiedi conferma prima di cancellare qualunque cosa\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists non riportare errori se il database non esiste\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Inserisci il nome del ruolo da eliminare: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "nome del ruolo dell'argomento richiesto mancante"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Il ruolo \"%s\" sarà eliminato definitivamente.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "rimozione del ruolo \"%s\" non riuscita: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s elimina un ruolo PostgreSQL.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive chiedi conferma prima cancellare qualunque cosa\n"
+" e richiedi i nomi dei ruoli se non specificati\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists non riportare errori se l'utente non esiste\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr ""
+" -U, --username=UTENTE nome utente con cui collegarsi\n"
+" (non quello da eliminare)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "impossibile recuperare le opzioni predefinite"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "le connessioni sono accettate\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "le connessioni sono rifiutate\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "nessuna risposta\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "nessun tentativo\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "sconosciuto\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s effettua una connessione di controllo ad un database PostgreSQL.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPZIONE]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=NOMEDB nome database\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet esegui silenziosamente\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=NOMEHOST host server del database o directory socket\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORTA porta del server database\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SEC secondi di attesa tentando una connessione, 0 disabilita (predefinito: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UTENTE nome utente con cui connettersi\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "non può reindicizzare tutti i database e uno specifico contemporaneamente"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "non può reindicizzare tutti i database e i cataloghi di sistema contemporaneamente"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "non può reindicizzare schemi specifici in tutti i database"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "impossibile reindicizzare tabelle specifiche in tutti i database"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "non può reindicizzare indici specifici in tutti i database"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "non può reindicizzare contemporaneamente schemi e cataloghi di sistema specifici"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "non può reindicizzare tabelle specifiche e cataloghi di sistema contemporaneamente"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "non può reindicizzare contemporaneamente indici specifici e cataloghi di sistema"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "non è possibile utilizzare più lavori per reindicizzare i cataloghi di sistema"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "non è possibile utilizzare più lavori per reindicizzare gli indici"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439
+#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469
+#: vacuumdb.c:473
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "non è possibile utilizzare l'opzione \"%s\" su versioni del server precedenti a PostgreSQL %s"
+
+#: reindexdb.c:369
+#, c-format
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr "impossibile reindicizzare i cataloghi di sistema contemporaneamente, saltando tutto"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "reindicizzazione del database \"%s\" non riuscita: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "reindicizzazione dell'indice \"%s\" nel database \"%s\" non riuscita: %s"
+
+#: reindexdb.c:581
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "reindicizzazione dello schema \"%s\" nel database \"%s\" non riuscita: %s"
+
+#: reindexdb.c:585
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "reindicizzazione dei cataloghi di sistema nel database \"%s\" non riuscita: %s"
+
+#: reindexdb.c:589
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "reindicizzazione della tabella \"%s\" nel database \"%s\" non riuscita: %s"
+
+#: reindexdb.c:742
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: re-indicizzazione del database \"%s\"\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s re-indicizza un database PostgreSQL.\n"
+"\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all reindicizza tutti i database\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently reindecizza in contemporanea\n"
+
+#: reindexdb.c:765
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=database DBNAME da reindicizzare\n"
+
+#: reindexdb.c:767
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX ricrea solo indici specifici\n"
+
+#: reindexdb.c:768
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=NUM usa questo numero di connessioni simultanee per reindicizzare\n"
+
+#: reindexdb.c:769
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet non scrive alcun messaggio\n"
+
+#: reindexdb.c:770
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system reindex solo i cataloghi di sistema\n"
+
+#: reindexdb.c:771
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA reindicizza solo gli schemi specifici\n"
+
+#: reindexdb.c:772
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLE solo per tabelle specifiche per reindicizzare\n"
+
+#: reindexdb.c:773
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=TABLESPACE tablespace in cui vengono ricostruiti gli indici\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose scrive molto output\n"
+
+#: reindexdb.c:784
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Consulta la descrizione del comando SQL REINDEX per maggiori informazioni.\n"
+
+#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279
+#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "non è possibile utilizzare l'opzione \"%s\" quando si esegue solo l'analisi"
+
+#: vacuumdb.c:297
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "non è possibile utilizzare l'opzione \"%s\" quando si esegue il vuoto completo"
+
+#: vacuumdb.c:303
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "non è possibile utilizzare l'opzione \"%s\" con l'opzione \"%s\"."
+
+#: vacuumdb.c:322
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "non è possibile fare il vacuum di tutti i database e uno specifico contemporaneamente"
+
+#: vacuumdb.c:324
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "non può aspirare tabelle specifiche in tutti i database"
+
+#: vacuumdb.c:412
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Generazione di statistiche ottimizzatore minime (1 obiettivo)"
+
+#: vacuumdb.c:413
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Generazione di statistiche ottimizzatore medie (10 obiettivi)"
+
+#: vacuumdb.c:414
+msgid "Generating default (full) optimizer statistics"
+msgstr "Generazione di statistiche ottimizzatore di default (completo)"
+
+#: vacuumdb.c:479
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: elaborazione del database \"%s\": %s\n"
+
+#: vacuumdb.c:482
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: pulizia del database \"%s\"\n"
+
+#: vacuumdb.c:952
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "svuotamento della tabella \"%s\" nel database \"%s\" non riuscito: %s"
+
+#: vacuumdb.c:955
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "svuotamento del database \"%s\" non riuscito: %s"
+
+#: vacuumdb.c:963
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s pulisce ed analizza un database PostgreSQL.\n"
+"\n"
+
+#: vacuumdb.c:967
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all pulisci tutti i database\n"
+
+#: vacuumdb.c:968
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=NOMEDB database da pulire\n"
+
+#: vacuumdb.c:969
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping disabilita tutti i comportamenti di salto di pagina\n"
+
+#: vacuumdb.c:970
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostra i comandi inviati al server\n"
+
+#: vacuumdb.c:971
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full esegui una pulizia completa\n"
+
+#: vacuumdb.c:972
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr ""
+" -F, --freeze congela le informazioni per la transazione\n"
+" sulla riga\n"
+
+#: vacuumdb.c:973
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr " --force-index-cleanup rimuove sempre le voci di indice che puntano a tuple morte\n"
+
+#: vacuumdb.c:974
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr ""
+" -j, --jobs=NUM usa questo numero di connessioni concorrenti\n"
+" per effetturare il vacuum\n"
+
+#: vacuumdb.c:975
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_AGE età minima dell'ID multixact delle tabelle da aspirare\n"
+
+#: vacuumdb.c:976
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=XID_AGE minimo ID transazione età delle tabelle da aspirare\n"
+
+#: vacuumdb.c:977
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr " --no-index-cleanup non rimuove le voci di indice che puntano a tuple morte\n"
+
+#: vacuumdb.c:978
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr " --no-process-toast salta la tabella TOAST associata alla tabella da aspirare\n"
+
+#: vacuumdb.c:979
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate non tronca le pagine vuote alla fine della tabella\n"
+
+#: vacuumdb.c:980
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr " -P, --parallel=PARALLEL_WORKERS usa questo numero di lavoratori in background per il vuoto, se disponibile\n"
+
+#: vacuumdb.c:981
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet non stampare alcun messaggio\n"
+
+#: vacuumdb.c:982
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked salta le relazioni che non possono essere bloccate immediatamente\n"
+
+#: vacuumdb.c:983
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABELLA[(COLONNE)]' ripulisci solo le tabelle specificate\n"
+
+#: vacuumdb.c:984
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mostra molti messaggi\n"
+
+#: vacuumdb.c:985
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: vacuumdb.c:986
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze aggiorna le statistiche per l'ottimizzatore\n"
+
+#: vacuumdb.c:987
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -Z, --analyze-only aggiorna solo le statistiche; niente vacuum\n"
+
+#: vacuumdb.c:988
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages aggiorna solo le statistiche, in fasi multiple\n"
+" per maggiore velocità, niente vacuum\n"
+
+#: vacuumdb.c:990
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: vacuumdb.c:998
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Consulta la descrizione del comando SQL VACUUM per maggiori informazioni.\n"
+
+#~ msgid "%s: \"%s\" is not a valid encoding name\n"
+#~ msgstr "%s: \"%s\" non è un nome di codifica valido\n"
+
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
+
+#~ msgid "%s: could not connect to database %s: %s"
+#~ msgstr "%s: connessione al database %s fallita: %s"
+
+#~ msgid "%s: number of parallel jobs must be at least 1\n"
+#~ msgstr "%s: il numero dei lavori paralleli dev'essere almeno 1\n"
+
+#~ msgid "%s: only one of --locale and --lc-collate can be specified\n"
+#~ msgstr "%s: solo uno tra --locale e --lc-collate può essere specificato\n"
+
+#~ msgid "%s: only one of --locale and --lc-ctype can be specified\n"
+#~ msgstr "%s: solo uno tra --locale e --lc-ctype può essere specificato\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s: query fallita: %s"
+
+#~ msgid "%s: query returned %d row instead of one: %s\n"
+#~ msgid_plural "%s: query returned %d rows instead of one: %s\n"
+#~ msgstr[0] "%s: la query ha restituito %d righe invece di una: %s\n"
+#~ msgstr[1] "%s: la query ha restituito %d righe invece di una: %s\n"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s: la query era: %s\n"
+
+#~ msgid "%s: reindexing of system catalogs failed: %s"
+#~ msgstr "%s: la re-indicizzazione dei cataloghi di sistema è fallita: %s"
+
+#~ msgid "%s: too many parallel jobs requested (maximum: %d)\n"
+#~ msgstr "%s: troppi lavori in parallelo richiesti (massimo: %d)\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
diff --git a/src/bin/scripts/po/ja.po b/src/bin/scripts/po/ja.po
new file mode 100644
index 0000000..8286285
--- /dev/null
+++ b/src/bin/scripts/po/ja.po
@@ -0,0 +1,1195 @@
+# pgscripts.po
+# Japanese message translation file for scripts
+#
+# Copyright (C) 2011-2022 PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: scripts (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-10-16 10:45+0900\n"
+"PO-Revision-Date: 2023-10-16 11:01+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: jpug-doc <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリ不足です\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nullポインタを複製できません(内部エラー)。\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "実効ユーザーID %ldが見つかりませんでした: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "ユーザーが存在しません"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "ユーザー名の検索に失敗: エラーコード%lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "キャンセル要求を送信しました\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "キャンセル要求を送信できませんでした: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104
+msgid "Password: "
+msgstr "パスワード: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "データベース%sに接続できませんでした: メモリ不足です"
+
+#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "オプション %2$s に対する不正な値\"%1$s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%sは%d..%dの範囲でなければなりません"
+
+#: ../../fe_utils/parallel_slot.c:319
+#, c-format
+msgid "too many jobs for this platform: %d"
+msgstr "このプラットフォームに対してジョブ数が多すぎます: %d"
+
+#: ../../fe_utils/parallel_slot.c:328
+#, c-format
+msgid "socket file descriptor out of range for select(): %d"
+msgstr "socket() のソケットファイル記述子が範囲外です: %d"
+
+#: ../../fe_utils/parallel_slot.c:330
+#, c-format
+msgid "Try fewer jobs."
+msgstr "ジョブ数を減らしてみてください。"
+
+#: ../../fe_utils/parallel_slot.c:552
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "データベース\"%s\"の処理に失敗しました: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu 行)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "中断されました\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "テーブルの内容に見出しを追加できませんでした:列数%dが制限を越えています。\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "テーブルの内容にセルを追加できませんでした:全セル数%dが制限を越えています。\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "出力フォーマットが無効(内部エラー):%d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "問い合わせが失敗しました: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "問い合わせ: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158
+#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121
+#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111
+#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細は\"%s --help\"を実行してください。"
+
+#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "全データベースと特定のデータベースを同時にクラスタ化することはできません"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "すべてのデータベースの特定のテーブル(群)はクラスタ化できません"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "データベース\"%2$s\"のテーブル\"%1$s\"のクラスタ化に失敗しました: %3$s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "データベース\"%s\"のクラスタ化に失敗しました: %s"
+
+#: clusterdb.c:248
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: データベース\"%s\"をクラスタ化しています\n"
+
+#: clusterdb.c:264
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr "%sはデータベース内で事前にクラスタ化されているすべてのテーブルをクラスタ化します。\n"
+
+#: clusterdb.c:265 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:762 vacuumdb.c:964
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: clusterdb.c:266 reindexdb.c:763 vacuumdb.c:965
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [オプション]... [データベース名]\n"
+
+#: clusterdb.c:267 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:764 vacuumdb.c:966
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"オプション:\n"
+
+#: clusterdb.c:268
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all すべてのデータベースをクラスタ化\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=DBNAME クラスタ化するデータベース\n"
+
+#: clusterdb.c:270 createuser.c:352 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo サーバーへ送信されているコマンドを表示\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet メッセージを何も出力しない\n"
+
+#: clusterdb.c:272
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=テーブル名 指定したテーブル(群)のみをクラスタ化する\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 多量のメッセージを出力\n"
+
+#: clusterdb.c:274 createuser.c:364 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: clusterdb.c:275 createuser.c:369 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: clusterdb.c:276 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:779 vacuumdb.c:991
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"接続オプション:\n"
+
+#: clusterdb.c:277 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME データベースサーバーのホストまたはソケット\n"
+" ディレクトリ\n"
+
+#: clusterdb.c:278 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT データベースサーバーのポート番号\n"
+
+#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:994
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME このユーザー名で接続する\n"
+
+#: clusterdb.c:280 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password パスワード入力を要求しない\n"
+
+#: clusterdb.c:281 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password パスワードプロンプトを強制表示する\n"
+
+#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:997
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 別の保守用データベースを指定する\n"
+
+#: clusterdb.c:283
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"詳細は SQL コマンドの CLUSTER の説明を参照してください。\n"
+
+#: clusterdb.c:284 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:787 vacuumdb.c:999
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"バグは<%s>に報告してください。\n"
+
+#: clusterdb.c:285 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:788 vacuumdb.c:1000
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "問い合わせが1行ではなく%d行返しました: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "y"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s)"
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr " \"%s\" または \"%s\" に答えてください\n"
+
+#: createdb.c:173
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" は有効な符号化方式名ではありません"
+
+#: createdb.c:243
+#, c-format
+msgid "database creation failed: %s"
+msgstr "データベースの生成に失敗しました:%s"
+
+#: createdb.c:262
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "コメントの生成に失敗(データベースは生成されました): %s"
+
+#: createdb.c:280
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%sはPostgreSQLデータベースを生成します。\n"
+"\n"
+
+#: createdb.c:282
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [オプション]... [データベース名] [説明]\n"
+
+#: createdb.c:284
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE データベースのデフォルトテーブルスペース名\n"
+
+#: createdb.c:285 reindexdb.c:768
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo サーバーに送られるコマンドを表示\n"
+
+#: createdb.c:286
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=ENCODING データベースの符号化方式\n"
+
+#: createdb.c:287
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE データベースのロケール設定\n"
+
+#: createdb.c:288
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE データベースのLC_COLLATE設定\n"
+
+#: createdb.c:289
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE データベースのLC_CTYPE設定\n"
+
+#: createdb.c:290
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE データベースのICUロケール設定\n"
+
+#: createdb.c:291
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" データベースのデフォルト照合順序のロケール\n"
+" プロバイダ\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=OWNER 新しいデータベースを所有するデータベースユーザー\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr " -S, --strategy=STRATEGY データベース生成方法 wal_log または file_copy\n"
+
+#: createdb.c:295
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=TEMPLATE コピーするテンプレートデータベース\n"
+
+#: createdb.c:296 reindexdb.c:777
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: createdb.c:297 reindexdb.c:778
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: createdb.c:299 reindexdb.c:780
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME データベースサーバーホストまたはソケット\n"
+" ディレクトリ\n"
+
+#: createdb.c:300 reindexdb.c:781
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT データベースサーバーのポート番号\n"
+
+#: createdb.c:301 reindexdb.c:782
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME 接続する際のユーザー名\n"
+
+#: createdb.c:302 reindexdb.c:783
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password パスワード入力を要求しない\n"
+
+#: createdb.c:303 reindexdb.c:784
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password パスワードプロンプトを強制\n"
+
+#: createdb.c:304 reindexdb.c:785
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 別の保守用データベースを指定する\n"
+
+#: createdb.c:305
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"デフォルトでは、現在のユーザー名と同名のデータベースが生成されます\n"
+
+#: createuser.c:193
+msgid "Enter name of role to add: "
+msgstr "追加したいロール名を入力:"
+
+#: createuser.c:208
+msgid "Enter password for new role: "
+msgstr "新しいロールのためのパスワード: "
+
+#: createuser.c:209
+msgid "Enter it again: "
+msgstr "もう一度入力してください:"
+
+#: createuser.c:212
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "パスワードがマッチしません。\n"
+
+#: createuser.c:220
+msgid "Shall the new role be a superuser?"
+msgstr "新しいロールをスーパーユーザーにしますか?"
+
+#: createuser.c:235
+msgid "Shall the new role be allowed to create databases?"
+msgstr "新しいロールに対してデータベースを作成する権限を与えますか?"
+
+#: createuser.c:243
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "新しいロールに対して別のロールを作成する権限を与えますか?"
+
+#: createuser.c:278
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "パスワードの暗号化に失敗しました: %s"
+
+#: createuser.c:331
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "新しいロールの作成に失敗しました: %s"
+
+#: createuser.c:345
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%sは新しいPostgreSQLロールを作成します。\n"
+"\n"
+
+#: createuser.c:347 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [オプション]... [ロール名]\n"
+
+#: createuser.c:349
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N ロールのコネクション数制限(デフォルト: 制限なし)\n"
+
+#: createuser.c:350
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb ロールは新しいデータベースを作成可\n"
+
+#: createuser.c:351
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb ロールは新しいデータベースを作成不可(デフォルト)\n"
+
+#: createuser.c:353
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROLE 新しいロールはこのロールのメンバーにする\n"
+
+#: createuser.c:354
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit ロールがメンバーとなるロール群から権限を継承\n"
+" (デフォルト)\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit 権限を継承しない\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login ロールはログイン可能(デフォルト)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login ロールはログイン不可\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt 新しいロールにパスワードを割り当てる\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole ロールは別のロールを作成可\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole ロールは別のロールを作成不可(デフォルト)\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser ロールをスーパーユーザーにする\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser ロールをスーパーユーザーにしない(デフォルト)\n"
+
+#: createuser.c:365
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr " --interactive デフォルトを使わず未指定のロール名や属性は入力を促す\n"
+
+#: createuser.c:367
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication ロールはレプリケーションを初期化可\n"
+
+#: createuser.c:368
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication ロールはレプリケーションを初期化不可\n"
+
+#: createuser.c:373
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr ""
+" -U, --username=USERNAME このユーザーとして接続(作成対象ユーザーでは\n"
+" ありません)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "必須の引数であるデータベース名がありません"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "データベース\"%s\"は永久に削除されます。\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "実行しますか?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "データベースの削除に失敗しました: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%sはPostgreSQLデータベースを削除します。\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [オプション]... [データベース名]\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force 削除前に他の接続の終了を試行\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive 何かを削除する前に警告する\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists データベースが存在しない場合にエラーを報告しない\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "削除したいロール名を入力:"
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "必須の引数であるロール名がありません"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "ロール\"%s\"は永久に削除されます\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "ロール\"%s\"の削除に失敗しました: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%sはPostgreSQLのロールを削除します。\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive 何かを削除する前に入力を促し、またロール名が指定\n"
+" されていない場合はその入力を促す\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists ユーザーが存在しない場合にエラーを報告しない\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr ""
+" -U, --username=USERNAME このユーザーとして接続(削除対象ユーザーでは\n"
+" ありません)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "デフォルトのオプションを取り出すことができませんでした"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "接続を受け付けています\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "接続を拒絶しています\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "レスポンスがありません\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "施行がありません\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "unknown\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%sはPostgreSQLデータベースに対して接続検査を発行します。\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DBNAME データベース名\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet メッセージを出力せずに実行する\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME データベースサーバーのホストまたはソケット\n"
+" ディレクトリ\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT データベースサーバーのポート番号\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SECS 接続試行時の待機秒数、ゼロで無効化(デフォルト: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME このユーザー名で接続する\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "全データベースと特定のデータベースは同時に再インデックス化はできません"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "全データベースとシステムカタログの両方は同時に再インデックス化はできません"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "全データベースにおける特定のスキーマ(群)の再インデックス化はできません"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "全データベースにおける特定のテーブル(群)の再インデックス化はできません"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "全データベースにおける特定のインデックス(群)の再作成はできません"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "特定のスキーマ(群)とシステムカタログは同時に再インデックス化はできません"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "特定のテーブル(群)とシステムカタログは同時に再インデックス化はできません"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "特定のインデックスとシステムカタログは同時に再インデックス化はできません"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "システムカタログのインデックス再構築では複数ジョブを使用できません"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "インデックス再構築には複数ジョブを使用できません"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439
+#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469
+#: vacuumdb.c:473
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "PostgreSQL %2$sよりも古いサーバーバージョンでは\"%1$s\"オプションは使えません"
+
+#: reindexdb.c:369
+#, c-format
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr "システムカタログではインデックスの並行再構築はできません、全てスキップします"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "データベース\"%s\"のインデックス再構築に失敗しました: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "データベース\"%2$s\"中にあるインデックス\"%1$s\"の再作成に失敗しました: %3$s"
+
+#: reindexdb.c:581
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "データベース\"%2$s\"中にあるスキーマ\"%1$s\"のインデックス再構築に失敗しました: %3$s"
+
+#: reindexdb.c:585
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "データベース\"%s\"中のシステムカタログのインデックス再構築に失敗しました: %s"
+
+#: reindexdb.c:589
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "データベース\"%2$s\"中にあるテーブル\"%1$s\"のインでックス再構築に失敗しました: %3$s"
+
+#: reindexdb.c:744
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: データベース\"%s\"を再インデックス化しています\n"
+
+#: reindexdb.c:761
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%sはPostgreSQLデータベースを再インデックス化します。\n"
+"\n"
+
+#: reindexdb.c:765
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all 全データベースでインデックス再構築を行う\n"
+
+#: reindexdb.c:766
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently 並行インデックス再構築\n"
+
+#: reindexdb.c:767
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DBNAME インデックス再構築対象のデータベース\n"
+
+#: reindexdb.c:769
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX 指定したインデックス(群)のみを再構築\n"
+
+#: reindexdb.c:770
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=NUM インデックス再構築にこの数の並列接続を使用\n"
+
+#: reindexdb.c:771
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet メッセージを一切出力しない\n"
+
+#: reindexdb.c:772
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system システムカタログのインデックスのみを再構築\n"
+
+#: reindexdb.c:773
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA 指定したスキーマ(群)のインデックスのみを再構築\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLE 指定したテーブル(群)のインデックスを再構築\n"
+
+#: reindexdb.c:775
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " -D, --tablespace=TABLESPACE インデックス再構築先のテーブル空間\n"
+
+#: reindexdb.c:776
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 多量のメッセージを出力\n"
+
+#: reindexdb.c:786
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"詳細はSQLコマンドREINDEXに関する説明を参照してください。\n"
+
+#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279
+#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "analyzeのみを実行する場合\"%s\"は使えません"
+
+#: vacuumdb.c:297
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "完全(full)VACUUMを実行する場合は\"%s\"オプションは使えません"
+
+#: vacuumdb.c:303
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "\"%s\"オプションは\"%s\"と同時には使えません"
+
+#: vacuumdb.c:322
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "全データベースと特定のデータベースを同時にVACUUMすることはできません"
+
+#: vacuumdb.c:324
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "全データベースの特定のテーブル(群)をVACUUMすることはできません"
+
+#: vacuumdb.c:412
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "最適化のための情報を最小限生成します(1対象)"
+
+#: vacuumdb.c:413
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "最適化のための情報を複数生成します(10対象)"
+
+#: vacuumdb.c:414
+msgid "Generating default (full) optimizer statistics"
+msgstr "最適化のための情報をデフォルト数(全て)生成します"
+
+#: vacuumdb.c:479
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: データベース\"%s\"の処理中です: %s\n"
+
+#: vacuumdb.c:482
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: データベース\"%s\"をVACUUMしています\n"
+
+#: vacuumdb.c:952
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "データベース \"%2$s\"のテーブル\"%1$sのVACUUMに失敗しました: %3$s"
+
+#: vacuumdb.c:955
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "データベース\"%s\"のVACUUMに失敗しました: %s"
+
+#: vacuumdb.c:963
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr "%sはPostgreSQLデータベースのゴミ回収および分析を行います。\n"
+
+#: vacuumdb.c:967
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all 全データベースをVACUUM\n"
+
+#: vacuumdb.c:968
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=DBNAME VACUUMするデータベース名\n"
+
+#: vacuumdb.c:969
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping すべてのページスキップ動作を禁止\n"
+
+#: vacuumdb.c:970
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo サーバーに送られるコマンドを表示\n"
+
+#: vacuumdb.c:971
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full VACUUM FULLを実行\n"
+
+#: vacuumdb.c:972
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze 行トランザクション情報を凍結\n"
+
+#: vacuumdb.c:973
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr ""
+" --force-index-cleanup デッドタプルを指すインデックスエントリを常に\n"
+" 除去する\n"
+
+#: vacuumdb.c:974
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=NUM バキューム時に指定した同時接続数を使用\n"
+
+#: vacuumdb.c:975
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr ""
+" --min-mxid-age=MXID_AGE VACUUM対象とするテーブルの最小のマルチ\n"
+" トランザクションID差分\n"
+
+#: vacuumdb.c:976
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr ""
+" --min-xid-age=XID_AGE VACUUM対象とするテーブルの最小の\n"
+" トランザクションID差分\n"
+
+#: vacuumdb.c:977
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr ""
+" --no-index-cleanup デッドタプルを指すインデックスエントリを\n"
+" 削除しない\n"
+
+#: vacuumdb.c:978
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr ""
+" --no-process-toast テーブルに関連づくTOASTテーブルのVACUUMを\n"
+" スキップ\n"
+
+#: vacuumdb.c:979
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate テーブル終端の空ページの切り詰めを行わない\n"
+
+#: vacuumdb.c:980
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr ""
+" -P, --parallel=PARALLEL_WORKERS 可能であればVACUUMで指定の数のバックグラウンド\n"
+" ワーカーを使用\n"
+
+#: vacuumdb.c:981
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet メッセージを出力しない\n"
+
+#: vacuumdb.c:982
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked 直ちにロックできなかったリレーションをスキップ\n"
+
+#: vacuumdb.c:983
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABLE[(COLUMNS)]' 指定したテーブル(複数可)のみをVACUUM\n"
+
+#: vacuumdb.c:984
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 多量のメッセージを出力\n"
+
+#: vacuumdb.c:985
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: vacuumdb.c:986
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze 最適化用統計情報を更新\n"
+
+#: vacuumdb.c:987
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -Z, --analyze-only 最適化用統計情報のみ更新; バキュームは行わない\n"
+
+#: vacuumdb.c:988
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages 高速化のため最適化用統計情報のみを複数段階で\n"
+" 更新; VACUUMは行わない\n"
+
+#: vacuumdb.c:990
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: vacuumdb.c:998
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"詳細はSQLコマンドのVACUUMの説明を参照してください。\n"
diff --git a/src/bin/scripts/po/ka.po b/src/bin/scripts/po/ka.po
new file mode 100644
index 0000000..d5c81a1
--- /dev/null
+++ b/src/bin/scripts/po/ka.po
@@ -0,0 +1,1299 @@
+# Georgian message translation file for pgscripts
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pgscripts (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:49+0000\n"
+"PO-Revision-Date: 2022-07-04 15:48+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდომა: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტალები: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნება: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "არასაკმარისი მეხსიერება\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ნულოვანი მაჩვენებლის დუბლირება შეუძლებელია (შიდა შეცდომა)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "მომხმარებლის ეფექტური ID-ის (%ld) ამოხსნა შეუძლებელია: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "მომხმარებელი არ არსებობს"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "მომხარებლის სახელის ამოხსნის პრობლემა: შეცდომის კოდი: %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "გაუქმების მოთხოვნა გაგზავნილია\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "გაუქმების მოთხოვნის გაგზავნა შეუძლებელია: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104
+msgid "Password: "
+msgstr "პაროლი: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "ბაზასთან (%s) მიერთება შეუძლებელია: არასაკმარისი მეხსიერება"
+
+#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "არასწორი მნიშვნელობა \"%s\" პარამეტრისთვის %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s არაა საზღვრებში %d-დან %d-მდე"
+
+#: ../../fe_utils/parallel_slot.c:301
+#, c-format
+msgid "too many jobs for this platform"
+msgstr "მეტისმეტად ბევრი დავალება ამ პლატფორმისთვის"
+
+#: ../../fe_utils/parallel_slot.c:519
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "ბაზის (%s) დამუშავების შეცდომა:%s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu მწკრივი)"
+msgstr[1] "(%lu მწკრივი)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "შეწყვეტილია\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr ""
+"ცხრილის შემცველობაზე თავსართის დამატება შეუძლებელია: სვეტების რაოდენობა %d "
+"გადაჭარბებულია.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr ""
+"ცხრილის შემცველობაზე უჯრედის დამატება შეუძლებელია: უჯრედების რაოდენობა %d-ზე "
+"მეტია.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "გამოტანის არასწორი ფორმატი (შიდა შეცდომა): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "მოთხოვნის შეცდომა: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "მოთხოვნის შინაარსი: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158
+#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121
+#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111
+#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'."
+
+#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "ყველა და მითითებული ბაზების ერთდროული დაკლასტერება შეუძლებელია"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "მითითებული ცხრილების ყველა ბაზაში დაკლასტერება შეუძლებელია"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "ცხრილის (\"%s\"), ბაზაში \"%s\" დაკლასტერების პრობლემა: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "ბაზის (\"%s\") დაკლასტერების შეცდომა: %s"
+
+#: clusterdb.c:246
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: ბაზის დაკლასტერება: \"%s\"\n"
+
+#: clusterdb.c:262
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s ალაგებს ბაზაში ადრე დალაგებული ცხრილებს.\n"
+"\n"
+
+#: clusterdb.c:263 createdb.c:283 createuser.c:346 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964
+#, c-format
+msgid "Usage:\n"
+msgstr "გამოყენება:\n"
+
+#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [პარამეტრი]... [ბაზისსახელი]\n"
+
+#: clusterdb.c:265 createdb.c:285 createuser.c:348 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"პარამეტრები:\n"
+
+#: clusterdb.c:266
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all ყველა ბაზის დაკლასტერება\n"
+
+#: clusterdb.c:267
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=ბაზისსახელი დასაკლასერებელი ბაზის სახელი\n"
+
+#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo-queries სერვერზე გაგზავნილი ბრძანებების გამოტანა\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet არ გამოიტანო შეტყობინებები\n"
+
+#: clusterdb.c:270
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr ""
+" -t, --table=ცხრილი მხოლოდ მითითებული ცხრილების დაკლასტერება\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose დამატებითი ინფორმაციის გამოტანა\n"
+
+#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: clusterdb.c:274 createdb.c:300 createuser.c:370 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"შეერთების პარამეტრები:\n"
+
+#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME მონაცემთა ბაზის სერვერის ჰოსტის ან სოკეტის "
+"საქაღალდე\n"
+
+#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT მონაცემთა ბაზის სერვერის პორტი\n"
+
+#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=მომხმარებელი ბაზის მომხმარებლის სახელი\n"
+
+#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password არასოდეს მკითხო პაროლი\n"
+
+#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password პაროლის ყოველთვის კითხვა\n"
+
+#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=ბაზისსახელი ალტერნატიული საავარიო ბაზა\n"
+
+#: clusterdb.c:281
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"დაკლასტერების შესახებ მეტი ინფორმაციის მიღება SQL ბრძანების, CLUSTER, "
+"დეტალებში შეგიძლიათ.\n"
+
+#: clusterdb.c:282 createdb.c:308 createuser.c:376 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდომების შესახებ მიწერეთ: %s\n"
+
+#: clusterdb.c:283 createdb.c:309 createuser.c:377 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "მოთხოვნამ %d მწკრივი დააბრუნა, ერთის მაგიერ: %s"
+msgstr[1] "მოთხოვნამ %d მწკრივი დააბრუნა, ერთის მაგიერ: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "y"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "ნანო"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "უპასუხეთ \"%s\" ან \"%s\".\n"
+
+#: createdb.c:165
+#, c-format
+msgid "only one of --locale and --lc-ctype can be specified"
+msgstr "--locale და --lc-ctype მხოლოდ ერთ ერთი შეიძლება იყოს მითითებული"
+
+#: createdb.c:167
+#, c-format
+msgid "only one of --locale and --lc-collate can be specified"
+msgstr "--locale და --lc-collate მხოლოდ ერთ ერთი შეიძლება იყოს მითითებული"
+
+#: createdb.c:175
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" კოდირების სწორ სახელს არ წარმოადგენს"
+
+#: createdb.c:245
+#, c-format
+msgid "database creation failed: %s"
+msgstr "ბაზის შექმნის შეცდომა:%s"
+
+#: createdb.c:264
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "კომენტარის შექმნის შეცდომა (ბაზა შეიქმნა): %s"
+
+#: createdb.c:282
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL-ის ბაზას ქმნის.\n"
+"\n"
+
+#: createdb.c:284
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [პარამეტრი]... [ბაზისსახელი] [აღწერა]\n"
+
+#: createdb.c:286
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr ""
+" -D, --tablespace=ცხრილებისსივრცე მონაცემთა ბაზის ცხრილების ნაგულისხმები "
+"სივრცე\n"
+
+#: createdb.c:287 reindexdb.c:766
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo-queries სერვერზე გაგზავნილი ბრძანებების გამოტანა\n"
+
+#: createdb.c:288
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " \\encoding [კოდირება] კლიენტის კოდირების ჩვენება ან დაყენება\n"
+
+#: createdb.c:289
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=ენა ბაზის ენის პარამეტრები\n"
+
+#: createdb.c:290
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=ენა ბაზის LC_COLLATE პარამეტრი\n"
+
+#: createdb.c:291
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=ენა ბაზის LC_CTYPE პარამეტრი\n"
+
+#: createdb.c:292
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=ენა ბაზის ICU ენის პარამეტრი\n"
+
+#: createdb.c:293
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default "
+"collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" ბაზის ნაგულისხმები კოლაციის ენის მომწოდებელი\n"
+
+#: createdb.c:295
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr ""
+" -O, --owner=მფლობელი ახალი ბაზის მფლობელი მომხმარებლის სახელი\n"
+
+#: createdb.c:296
+#, c-format
+msgid ""
+" -S, --strategy=STRATEGY database creation strategy wal_log or "
+"file_copy\n"
+msgstr ""
+" -S, --strategy=სტრატეგია ბაზის შექმნის სტრატეგია: wal_log ან "
+"file_copy\n"
+
+#: createdb.c:297
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=შაბლონი ბაზის დასაკოპირებელი შაბლონი\n"
+
+#: createdb.c:298 reindexdb.c:775
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: createdb.c:299 reindexdb.c:776
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: createdb.c:301 reindexdb.c:778
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME მონაცემთა ბაზის სერვერის ჰოსტის ან სოკეტის "
+"საქაღალდე\n"
+
+#: createdb.c:302 reindexdb.c:779
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT მონაცემთა ბაზის სერვერის პორტი\n"
+
+#: createdb.c:303 reindexdb.c:780
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=მომხმარებელი ბაზის მომხმარებლის სახელი\n"
+
+#: createdb.c:304 reindexdb.c:781
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password არასოდეს მკითხო პაროლი\n"
+
+#: createdb.c:305 reindexdb.c:782
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password პაროლის ყოველთვის კითხვა\n"
+
+#: createdb.c:306 reindexdb.c:783
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=ბაზისსახელი ალტერნატიული საავარიო ბაზა\n"
+
+#: createdb.c:307
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"ნაგულისხმებად შექმნილი ბაზის სახელად მიმდინარე მომხმარებლის სახელი "
+"გამოიყენება.\n"
+
+#: createuser.c:193
+msgid "Enter name of role to add: "
+msgstr "შეიყვანეთ დასამატებელი როლის სახელი: "
+
+#: createuser.c:208
+msgid "Enter password for new role: "
+msgstr "შეყვანეთ ახალი როლის პაროლი: "
+
+#: createuser.c:209
+msgid "Enter it again: "
+msgstr "შეიყვანეთ კდევ ერთხელ: "
+
+#: createuser.c:212
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "პაროლები არ ემთხვევა.\n"
+
+#: createuser.c:220
+msgid "Shall the new role be a superuser?"
+msgstr "იქნება ახალი როლი ზემომხმარებელი?"
+
+#: createuser.c:235
+msgid "Shall the new role be allowed to create databases?"
+msgstr "ექნება ახალ როლს ბაზების შექმნის უფლება?"
+
+#: createuser.c:243
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "ექნება ახალ როლს სხვა როლების შექმნს უფლება?"
+
+#: createuser.c:278
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "პაროლის დაშიფვრის შეცდომა: %s"
+
+#: createuser.c:331
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "ახალი როლის შექმნის შეცდომა: %s"
+
+#: createuser.c:345
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL-ის როლს ქმნის.\n"
+"\n"
+
+#: createuser.c:347 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [პარამეტრი]... [როლისსახელი]\n"
+
+#: createuser.c:349
+#, c-format
+msgid ""
+" -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr ""
+" -c, --connection-limit=N როლის შეერთებების ლიმიტი (ნაგულისხმები: ლიმიტის "
+"გარეშე)\n"
+
+#: createuser.c:350
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb როლს შეუძლია ახალი ბაზების შექმნა\n"
+
+#: createuser.c:351
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr ""
+" -D, --no-createdb როლს ბაზების შექმნა არ შეუძლია (ნაგულისხმები)\n"
+
+#: createuser.c:353
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=როლი ახალი როლი ამ როლის წევრი იქნება\n"
+
+#: createuser.c:354
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit რომლი მემკვიდრეობით იღებს იმ როლებსაც, რომლის\n"
+" წევრიც თვითონაა (ნაგულისხმები)\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr ""
+" -I, --no-inherit როლი პრივილეგიებს მემკვიდრეობით არ მიიღებს\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login როლით შესვლა შეიძლება (ნაგულისხმები)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login როლს შესვლა არ შეუძლია\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt როლისთვის პაროლის მინიჭება\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole როლს ახალი როლების შექმნა შეუძლია\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr ""
+" -R, --no-createrole როლს ახალი როლების შექმნა არ შეუძლია "
+"(ნაგულისხმები)\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser როლი ახალი ზემომხმარებელი იქნება\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr ""
+" -S, --no-superuser როლი ზემომხმარებელი არ იქნება (ნაგულისხმები)\n"
+
+#: createuser.c:365
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes "
+"rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive ნაგულისხმები მნიშვნელობების გამოყენების მაგიერ "
+"როლის \n"
+" ნაკლული სახელისა და ატრიბუტების ინტერაქტიურად "
+"კითხვაs\n"
+
+#: createuser.c:367
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication როლს შეუძლია რეპლიკაციის ინიცირება\n"
+
+#: createuser.c:368
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication როლს რეპლიკაციის ინიცირება არ შეუძლია\n"
+
+#: createuser.c:373
+#, c-format
+msgid ""
+" -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr ""
+" -U, --username=მომხმარებელი სერვერთან მიერთების მომხმარებლის სახელი (ის "
+"არა, რომელსაც ქმნით)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "აკლია აუცილებელი არგუმენტი: ბაზის სახელი"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "მონაცემთა ბაზა \"%s\" სამუდამოდ წაიშლება.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "დარწმუნებული ბრძანდებით?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "ბაზის წაშლის შეცდომა:%s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s წაშლის PostgreSQL ბაზას.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [პარამეტრი]... [ბაზისსახელი]\n"
+
+#: dropdb.c:176
+#, c-format
+msgid ""
+" -f, --force try to terminate other connections before "
+"dropping\n"
+msgstr " -f, --force შეერთებების დახურვა მათ გათიშვამდე\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive გკითხავ, სანამ რამეს წავშლი\n"
+
+#: dropdb.c:179
+#, c-format
+msgid ""
+" --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists თუ ბაზა არ არსებობს, შეცდომა არ ამოაგდო\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "შეიყვანეთ წასაშლელი როლის სახელი: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "აკლია აუცილებელი არგუმენტი: როლის სახელი"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "როლი \"%s\" სამუდამოდ წაიშლება.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "როლის (\"%s\") წაშლის შეცდომა: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s წაშლის PostgreSQL-ის როლს.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive გკითხავ, სანამ რამეს წავშლი\n"
+" და გკითხავ როლის სახელსაც, თუ მითითბული არაა\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr ""
+" --if-exists თუ მომხმარებელი არ არსებობს, შეცდომა არ ამოაგდო\n"
+
+#: dropuser.c:182
+#, c-format
+msgid ""
+" -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr ""
+" -U, --username=მომხმარებელი სერვერთან მიერთების მომხმარებლის სახელი (ის "
+"არა, რომელსაც შლით)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "ნაგულისხმები პარამეტრების გამოთხოვის შეცდომა"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "მზადაა შეერთებისთვის\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "უარყოფს შეერთებას\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "პასუხის გარეშე\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "მცდელობის გარეშე\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "უცნობი\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL მონაცემთა ბაზასთან კავშირს ამოწმებს.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [პარამეტრი]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=ბაზისსახელი მონაცემთა ბაზის სახელი\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet ჩუმად გაშვება\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME მონაცემთა ბაზის სერვერის ჰოსტის ან სოკეტის "
+"საქაღალდე\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT მონაცემთა ბაზის სერვერის პორტი\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid ""
+" -t, --timeout=SECS seconds to wait when attempting connection, 0 "
+"disables (default: %s)\n"
+msgstr ""
+" -t, --timeout=წამი შეერთების ლოდინის ვადა, წამებში. 0 გათიშავს "
+"(ნაგულისხმები: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=მომხმარებელი ბაზის მომხმარებლის სახელი\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "ყველა და მითითებული ბაზების ერთდროული რეინდექსი შეუძლებელია"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "ყველა ბაზის და სისტემური კატალოგების ერთდროული რეინდექსი შეუძლებელია"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "მითითებული სქემის ყველა ბაზაში რეინდექსი შეუძლებელია"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "მითითებული ცხრილის ყველა ბაზაში რეინდექსი შეუძლებელია"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "მითითებული ინდექსის ყველა ბაზაში რეინდექსი შეუძლებელია"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr ""
+"მითითებული სქემის და სისტემური კატალოგების ერთდროული რეინდექსი შეუძლებელია"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr ""
+"მითითებული ცხრილის და სისტემური კატალოგების ერთდროული რეინდექსი შეუძლებელია"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr ""
+"მითითებული ინდექსის და სისტემური კატალოგების ერთდროული რეინდექსი შეუძლებელია"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr ""
+"სისტემური კატალოგების რეინდექსისთვის ბევრი დავალების გამოყენება შეუძლებელია"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "ინდექსების რეინდექსისთვის ბევრი დავალების გამოყენება შეუძლებელია"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439
+#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469
+#: vacuumdb.c:473
+#, c-format
+msgid ""
+"cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr ""
+"პარამეტრი \"%s\" არ გამოიყენება PostgreSQL-ის ვერსიაში \"%s\" ან უფრო ძველში"
+
+#: reindexdb.c:369
+#, c-format
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr ""
+"სისტემური კატალოგების ერთდროული რეინდექსი შეუძლებელია. ყველას გამოტოვება"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "ბაზის (\"%s\") რეინდექსის პრობლემა: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "რეინდექსის შეცდომა ინდექსისთვის \"%s\" ბაზაში \"%s\": %s"
+
+#: reindexdb.c:581
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "რეინდექსის შეცდომა სქემისთვის \"%s\" ბაზაში \"%s\": %s"
+
+#: reindexdb.c:585
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "სისტემური კატალოგების რეინდექსის შეცდომა ბაზაში \"%s\": %s"
+
+#: reindexdb.c:589
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "რეინდექსის შეცდომა ცხრილისთვის \"%s\" ბაზაში \"%s\": %s"
+
+#: reindexdb.c:742
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: ბაზის თავიდან ინდექსირება \"%s\"\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL ბაზის თავიდან ინდექსირება.\n"
+"\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all ყველა ბაზის თავიდან ინდექსირება\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently ერთდროული ინდექსირება\n"
+
+#: reindexdb.c:765
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=ბაზისსახელი დასაინდექსებელი ბაზის სახელი\n"
+
+#: reindexdb.c:767
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr ""
+" -i, --index=ინდექსი მითითებული ინდექს(ებ)-ი თავიდან შეიქმნება\n"
+
+#: reindexdb.c:768
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"reindex\n"
+msgstr ""
+" -j, --jobs=რიცხვი თავიდან ინდექსირებისთვის მითითებული "
+"რაოდენობის შეერთებების გამოყენება\n"
+
+#: reindexdb.c:769
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet არ გამოიტანო შეტყობინებები\n"
+
+#: reindexdb.c:770
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr ""
+" -s, --system მოხდება მხოლოდ სისტემური კატალოგების თავიდან "
+"ინდექსირება\n"
+
+#: reindexdb.c:771
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr ""
+" -S, --schema=სქემა მოხდება მხოლოდ მითითებული სქემების თავიდან "
+"ინდექსირება\n"
+
+#: reindexdb.c:772
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr ""
+" -t, --table=ცხრილი მოხდება მხოლოდ მითითებული ცხრილების თავიდან "
+"ინდექსირება\n"
+
+#: reindexdb.c:773
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr ""
+" --tablespace=ცხრილებისსივრცე ცხრილების სივრცე, სადაც რეინდექსი "
+"მოხდება\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose დამატებითი ინფორმაციის გამოტანა\n"
+
+#: reindexdb.c:784
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"მეტი დეტალებისთვის იხილეთ SQL-ის ბრძანების, REINDEX-ის დეტალები.\n"
+
+#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279
+#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "მხოლოდ ანალიზის დროს პარამეტრის \"%s\" გამოყენება შეუძლებელია"
+
+#: vacuumdb.c:297
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "სრული დამტვერსასრუტების დროს პარამეტრის \"%s\" გამოყენება შეუძლებელია"
+
+#: vacuumdb.c:303
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "\"%s\" პარამეტრთან ერთად \"%s\"-ის გამოყენება შეუძლებელია"
+
+#: vacuumdb.c:322
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "ყველა და მითითებული ბაზების ერთდროული დამტვერსასრუტება შეუძლებელია"
+
+#: vacuumdb.c:324
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "მითითებული ცხრილების ყველა ბაზაში დამტვერსასრუტება შეუძლებელია"
+
+#: vacuumdb.c:412
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "ოპტიმიზატორის მინიმალური სტატისტიკის გენერაცია (1 სამიზნე)"
+
+#: vacuumdb.c:413
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "ოპტიმიზატორის საშუალო სტატისტიკის გენერაცია (10 სამიზნე)"
+
+#: vacuumdb.c:414
+msgid "Generating default (full) optimizer statistics"
+msgstr "ოპტიმიზატორის ნაგულისხმები (სრული) სტატისტიკის გენერაცია"
+
+#: vacuumdb.c:479
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: ბაზის დამუშავება \"%s\": %s\n"
+
+#: vacuumdb.c:482
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: ბაზის \"%s\" დამტვერასრუტება\n"
+
+#: vacuumdb.c:952
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "ცხრილის (\"%s\") (ბაზაში \"%s\") დამტვერსასრუტების პრობლემა: %s"
+
+#: vacuumdb.c:955
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "ბაზის (\"%s\") დამტვერსასრუტების პრობლემა: %s"
+
+#: vacuumdb.c:963
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL ბაზის გასუფთავება და ოპტიმიზაცია.\n"
+"\n"
+
+#: vacuumdb.c:967
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all ყველა ბაზის დამტვერსასრუტება\n"
+
+#: vacuumdb.c:968
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=ბაზისსახელი დასამტვერსასრუტებელი ბაზები\n"
+
+#: vacuumdb.c:969
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr ""
+" --disable-page-skipping გვერდის გამოტოვების ყველა ვარიანტის "
+"გამორთვა\n"
+
+#: vacuumdb.c:970
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the "
+"server\n"
+msgstr " -e, --echo-queries სერვერზე გაგზავნილი ბრძანებების გამოტანა\n"
+
+#: vacuumdb.c:971
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full სრული დამტვერსასრუტება\n"
+
+#: vacuumdb.c:972
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr ""
+" -F, --freeze მწკრივის ტრანზაქციის ინფორმაციის გაყინვა\n"
+
+#: vacuumdb.c:973
+#, c-format
+msgid ""
+" --force-index-cleanup always remove index entries that point to "
+"dead tuples\n"
+msgstr ""
+" --force-index-cleanup ინდექსის ჩანაწერები, რომლებიც მკვდარ "
+"მონაცემებზე მიუთითებენ, ყოველთვის წაიშლება\n"
+
+#: vacuumdb.c:974
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"vacuum\n"
+msgstr ""
+" -j, --jobs=რიცხვი დამტვერსასრუტებისას მითითებული რაოდენობის "
+"შეერთებების გამოყენება\n"
+
+#: vacuumdb.c:975
+#, c-format
+msgid ""
+" --min-mxid-age=MXID_AGE minimum multixact ID age of tables to "
+"vacuum\n"
+msgstr ""
+" --min-mxid-age=MXID_AGE დასამტვერსასრუტებელი ცხრილების "
+"მულტიტრანზაქციის ID-ის მინიმალური ასაკი\n"
+
+#: vacuumdb.c:976
+#, c-format
+msgid ""
+" --min-xid-age=XID_AGE minimum transaction ID age of tables to "
+"vacuum\n"
+msgstr ""
+" --min-xid-age=XID_AGE დასამტვერსასრუტებელი ცხრილების "
+"ტრანზაქციების ID-ის მინიმალური ასაკი\n"
+
+#: vacuumdb.c:977
+#, c-format
+msgid ""
+" --no-index-cleanup don't remove index entries that point to "
+"dead tuples\n"
+msgstr ""
+" --no-index-cleanup ინდექსის ჩანაწერები, რომლებიც მკვდარ "
+"მონაცემებზე მიუთითებენ, არ წაიშლება\n"
+
+#: vacuumdb.c:978
+#, c-format
+msgid ""
+" --no-process-toast skip the TOAST table associated with the "
+"table to vacuum\n"
+msgstr ""
+" --no-process-toast მომტვერსასრუტებისას ცხრილთან ასოცირებული "
+"TOAST cxrilis gamotoveba\n"
+
+#: vacuumdb.c:979
+#, c-format
+msgid ""
+" --no-truncate don't truncate empty pages at the end of "
+"the table\n"
+msgstr ""
+" --no-truncate ცხრილის ბოლოში ცარიელი გვერდები არ "
+"მოიკვეთება\n"
+
+#: vacuumdb.c:980
+#, c-format
+msgid ""
+" -P, --parallel=PARALLEL_WORKERS use this many background workers for "
+"vacuum, if available\n"
+msgstr ""
+" -P, --parallel=პარალელური_დამხმარე_პროცესი დასამტვერსასრუტებლად მითითებული "
+"რაოდენობის დამხმარე პროცესის გამოყენება, თუ ეს შესაძლებელია\n"
+
+#: vacuumdb.c:981
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet არ გამოიტანო შეტყობინებები\n"
+
+#: vacuumdb.c:982
+#, c-format
+msgid ""
+" --skip-locked skip relations that cannot be immediately "
+"locked\n"
+msgstr ""
+" --skip-locked გამოტოვებული იქნება ურთიერთობები, რომლის "
+"მაშინვე ჩაკეტვაც შეუძლებელია\n"
+
+#: vacuumdb.c:983
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr ""
+" -t, --table='ცხრილი[(სვეტები)]' მხოლოდ მითითებული ცხრილების "
+"დამტვერსასრუტება\n"
+
+#: vacuumdb.c:984
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose დამატებითი ინფორმაციის გამოტანა\n"
+
+#: vacuumdb.c:985
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: vacuumdb.c:986
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr ""
+" -z, --analyze ოპტიმიზატორის სტატისტიკის განახლება\n"
+
+#: vacuumdb.c:987
+#, c-format
+msgid ""
+" -Z, --analyze-only only update optimizer statistics; no "
+"vacuum\n"
+msgstr ""
+" -Z, --analyze-only მხოლოდ ოპტიმიზატორის სტატისტიკის "
+"განახლება; დამტვერსასრუტების გარეშე\n"
+
+#: vacuumdb.c:988
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in "
+"multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages უკეთესი შედეგებისთვის ოპტიმიზატორის "
+"სტატისტიკის\n"
+" მრავალსაფეხურიანი რეჟიმი; "
+"დამტვერსასრუტების გარეშე\n"
+
+#: vacuumdb.c:990
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: vacuumdb.c:998
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"მეტი ინფორმაციისთვის იხილეთ SQL ბრძანების, VACUUM -ის დეტალები.\n"
diff --git a/src/bin/scripts/po/ko.po b/src/bin/scripts/po/ko.po
new file mode 100644
index 0000000..3a399a4
--- /dev/null
+++ b/src/bin/scripts/po/ko.po
@@ -0,0 +1,1245 @@
+# Korean message translation file for PostgreSQL pgscripts
+# Ioseph Kim <ioseph@uri.sarang.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:49+0000\n"
+"PO-Revision-Date: 2023-04-05 13:02+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "상세정보: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null 포인터를 복제할 수 없음(내부 오류)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "UID %ld 해당하는 사용자를 찾을 수 없음: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "사용자 없음"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "사용자 이름 찾기 실패: 오류번호 %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "취소 요청을 전송함\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "취소 요청을 전송할 수 없음: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104
+msgid "Password: "
+msgstr "암호:"
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "%s 데이터베이스에 연결 할 수 없음: 메모리 부족"
+
+#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "\"%s\" 값은 \"%s\" 옵션 값으로 유효하지 않음"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s 값은 %d부터 %d까지 지정할 수 있습니다."
+
+#: ../../fe_utils/parallel_slot.c:301
+#, c-format
+msgid "too many jobs for this platform"
+msgstr "이 운영체제에서는 너무 많은 동시 작업임"
+
+#: ../../fe_utils/parallel_slot.c:519
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "\"%s\" 데이터베이스 작업 실패: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu개 행)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "인트럽트발생\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "테이블 내용에 헤더를 추가할 수 없음: 열 수가 %d개를 초과했습니다.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "테이블 내용에 셀을 추가할 수 없음: 총 셀 수가 %d개를 초과했습니다.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "잘못된 출력 형식 (내부 오류): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "쿼리 실패: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "사용한 쿼리: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158
+#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121
+#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111
+#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "자세한 사항은 \"%s --help\" 명령으로 살펴보세요."
+
+#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "명령행 인자를 너무 많이 지정했습니다 (시작: \"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "모든 DB 작업과 특정 DB 작업은 동시에 할 수 없습니다."
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "모든 DB를 대상으로 특정 테이블들을 클러스터할 수 없음"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%s\" 테이블(해당DB: \"%s\") 클러스터 작업 실패: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "\"%s\" 데이터베이스 클러스터 실패: %s"
+
+#: clusterdb.c:246
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: \"%s\" 데이터베이스 클러스터 작업 중\n"
+
+#: clusterdb.c:262
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 DB 안에서 이전에 클러스터된 모든 테이블을 찾아\n"
+"다시 클러스터 작업을 합니다.\n"
+"\n"
+
+#: clusterdb.c:263 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [옵션]... [DB이름]\n"
+
+#: clusterdb.c:265 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"옵션들:\n"
+
+#: clusterdb.c:266
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all 모든 데이터베이스를 대상으로\n"
+
+#: clusterdb.c:267
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=DBNAME 클러스터 작업할 DB\n"
+
+#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo 서버로 보내는 작업 명령을 보여줌\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet 어떠한 메시지도 보여주지 않음\n"
+
+#: clusterdb.c:270
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABLE 지정한 테이블들만 클러스터\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 많은 출력 작성\n"
+
+#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: clusterdb.c:274 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"연결 옵션들:\n"
+
+#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME 데이터베이스 서버 호스트 또는 소켓 디렉터리\n"
+
+#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT 데이터베이스 서버 포트\n"
+
+#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME 접속할 사용자이름\n"
+
+#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 암호 프롬프트 표시 안 함\n"
+
+#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password 암호 프롬프트 표시함\n"
+
+#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 대체용 관리 대상 데이터베이스\n"
+
+#: clusterdb.c:281
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"보다 자세한 내용은 CLUSTER SQL 명령어 설명서를 참조하십시오.\n"
+
+#: clusterdb.c:282 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"문제점 보고 주소: <%s>\n"
+
+#: clusterdb.c:283 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "쿼리에서 한 개가 아닌 %d개의 행을 반환: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "y"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "\"%s\" 또는 \"%s\" 만 허용합니다.\n"
+
+#: createdb.c:173
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" 이름은 잘못된 인코딩 이름임"
+
+#: createdb.c:243
+#, c-format
+msgid "database creation failed: %s"
+msgstr "데이터베이스 만들기 실패: %s"
+
+#: createdb.c:262
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "코멘트 추가하기 실패 (데이터베이스는 만들어졌음): %s"
+
+#: createdb.c:280
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 PostgreSQL 데이터베이스를 만듭니다.\n"
+"\n"
+
+#: createdb.c:282
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [옵션]... [DB이름] [설명]\n"
+
+#: createdb.c:284
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr ""
+" -D, --tablespace=TABLESPACE 데이터베이스를 위한 기본 테이블스페이스\n"
+
+#: createdb.c:285 reindexdb.c:766
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo 서버로 보내는 작업 명령들을 보여줌\n"
+
+#: createdb.c:286
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=ENCODING 데이터베이스 인코딩\n"
+
+#: createdb.c:287
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE 데이터베이스의 로캘 설정\n"
+
+#: createdb.c:288
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE 데이터베이스의 LC_COLLATE 설정\n"
+
+#: createdb.c:289
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE 데이터베이스의 LC_CTYPE 설정\n"
+
+#: createdb.c:290
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE 데이터베이스 ICU 로캘 설정\n"
+
+#: createdb.c:291
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default "
+"collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" 데이터베이스 기본 문자 정렬을 위한 로케일 제공"
+"자\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=OWNER 데이터베이스 소유주\n"
+
+#: createdb.c:294
+#, c-format
+msgid ""
+" -S, --strategy=STRATEGY database creation strategy wal_log or "
+"file_copy\n"
+msgstr ""
+" -S, --strategy=STRATEGY 데이터베이스 만드는 전략(wal_log 또는 "
+"file_copy)\n"
+
+#: createdb.c:295
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=TEMPLATE 복사할 템플릿 데이터베이스\n"
+
+#: createdb.c:296 reindexdb.c:775
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: createdb.c:297 reindexdb.c:776
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: createdb.c:299 reindexdb.c:778
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME 데이터베이스 서버 호스트나 소켓 디렉터리\n"
+
+#: createdb.c:300 reindexdb.c:779
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT 데이터베이스 서버 포트\n"
+
+#: createdb.c:301 reindexdb.c:780
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME 접속할 사용자\n"
+
+#: createdb.c:302 reindexdb.c:781
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 암호 프롬프트 표시 안 함\n"
+
+#: createdb.c:303 reindexdb.c:782
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password 암호 프롬프트 표시함\n"
+
+#: createdb.c:304 reindexdb.c:783
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 대체용 관리 대상 데이터베이스\n"
+
+#: createdb.c:305
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"초기값으로, DB이름을 지정하지 않으면, 현재 사용자의 이름과 같은 데이터베이스"
+"가 만들어집니다.\n"
+
+#: createuser.c:193
+msgid "Enter name of role to add: "
+msgstr "추가할 새 롤(role)이름: "
+
+#: createuser.c:208
+msgid "Enter password for new role: "
+msgstr "새 롤의 암호: "
+
+#: createuser.c:209
+msgid "Enter it again: "
+msgstr "암호 확인: "
+
+#: createuser.c:212
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "암호가 서로 틀림.\n"
+
+#: createuser.c:220
+msgid "Shall the new role be a superuser?"
+msgstr "새 롤을 superuser 권한으로 지정할까요?"
+
+#: createuser.c:235
+msgid "Shall the new role be allowed to create databases?"
+msgstr "이 새 롤에게 데이터베이스를 만들 수 있는 권할을 줄까요?"
+
+#: createuser.c:243
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "이 새 롤에게 또 다른 롤을 만들 수 있는 권한을 줄까요?"
+
+#: createuser.c:278
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "암호 암호화 실패: %s"
+
+#: createuser.c:331
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "새 롤 만들기 실패: %s"
+
+#: createuser.c:345
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 PostgreSQL 롤을 만듭니다.\n"
+"\n"
+
+#: createuser.c:347 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [옵션]... [롤이름]\n"
+
+#: createuser.c:349
+#, c-format
+msgid ""
+" -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N 연결 제한 수 (초기값: 무제한)\n"
+
+#: createuser.c:350
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb 새 데이터베이스를 만들 수 있음\n"
+
+#: createuser.c:351
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr ""
+" -D, --no-createdb 데이터베이스를 만들 수 있는 권한 없음 (초기값)\n"
+
+#: createuser.c:353
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROLE 만들어지는 롤이 이 롤의 구성원이 됨\n"
+
+#: createuser.c:354
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit 롤의 권한을 상속할 수 있음\n"
+" (초기값)\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit 이 롤의 권한을 상속할 수 없음\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login 로그인 허용 (초기값)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login 로그인 할 수 없음\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt 새 롤의 암호 지정\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole 새 롤을 만들 수 있음\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole 롤 만들 수 있는 권한 없음 (초기값)\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser superuser 권한으로 지정\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser 슈퍼유저 권한 없음 (초기값)\n"
+
+#: createuser.c:365
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes "
+"rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive 롤 이름과 속성을 초기값을 쓰지 않고\n"
+" 각각 직접 입력 선택 함\n"
+
+#: createuser.c:367
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication 복제 기능 이용할 수 있는 롤\n"
+
+#: createuser.c:368
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication 복제 기능을 이용할 수 없음\n"
+
+#: createuser.c:373
+#, c-format
+msgid ""
+" -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr ""
+" -U, --username=USERNAME 서버에 접속할 사용자\n"
+" (사용자만들기 작업을 할 사용자)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "필수 항목인 데이터베이스 이름이 빠졌습니다"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "\"%s\" 데이터베이스가 완전히 삭제 될 것입니다.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "정말 계속 할까요? (y/n) "
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "데이터베이스 삭제 실패: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 PostgreSQL 데이터베이스를 삭제합니다.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [옵션]... DB이름\n"
+
+#: dropdb.c:176
+#, c-format
+msgid ""
+" -f, --force try to terminate other connections before "
+"dropping\n"
+msgstr " -f, --force 삭제 전에 접속한 다른 세션들 강제로 끊음\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive 지우기 전에 한 번 더 물어봄\n"
+
+#: dropdb.c:179
+#, c-format
+msgid ""
+" --if-exists don't report error if database doesn't exist\n"
+msgstr ""
+" --if-exists 해당 데이터베이스가 없어도 오류를 보고하지 않음\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "삭제할 롤 이름을 입력하십시오: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "롤 이름은 필수 입력 인자입니다"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "\"%s\" 롤은 영구히 삭제될 것입니다.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "\"%s\" 롤 삭제 실패: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 PostgreSQL 롤을 삭제합니다.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive 롤 이름을 입력하지 않았다면,\n"
+" 해당 이름을 물어봄\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists 해당 롤이 없어도 오류를 보고하지 않음\n"
+
+#: dropuser.c:182
+#, c-format
+msgid ""
+" -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=USERNAME 이 작업을 진행할 DB에 접속할 사용자\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "기본 옵션 값을 가져올 수 없음"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "접속을 받아드리는 중\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "접속을 거절하는 중\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "응답 없음\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "시도 없음\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "알수없음\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 PostgreSQL 데이터베이스 접속을 검사합니다.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [옵션]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DBNAME 데이터베이스 이름\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet 조용히 실행함\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME 접속할 데이터베이스 서버 또는 소켓 디렉터리\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT 데이터베이스 서버 포트\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid ""
+" -t, --timeout=SECS seconds to wait when attempting connection, 0 "
+"disables (default: %s)\n"
+msgstr " -t, --timeout=초 연결 제한 시간, 0 무제한 (초기값: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME 접속할 사용자이름\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr ""
+"모든 데이터베이스 재색인 작업과 특정 데이터베이스 재색인 작업은 동시에 진행"
+"할 수 없습니다"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr ""
+"모든 데이터베이스 재색인 작업과 시스템 카탈로그 재색인 작업은 동시에 진행할 "
+"수 없습니다"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr ""
+"모든 데이터베이스 재색인 작업에서 특정 스키마들의 재색인 작업을 지정할 수 없"
+"습니다"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr ""
+"모든 데이터베이스 재색인 작업에서 특정 테이블의 재색인 작업을 지정할 수 없습"
+"니다"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr ""
+"모든 데이터베이스 재색인 작업에서 특정 인덱스 재색인 작업을 지정할 수 없습니"
+"다"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "특정 스키마와 시스템 카탈로그 재색인 작업은 동시에 진행할 수 없습니다"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "특정 테이블과 시스템 카탈로그 재색인 작업은 동시에 진행할 수 없습니다"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "특정 인덱스와 시스템 카탈로그 재색인 작업은 동시에 진행할 수 없습니다"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "시스템 카탈로그 재색인 작업은 병렬로 처리할 수 없음"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "인덱스 다시 만들기에서는 다중 작업을 사용할 수 없음"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439
+#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469
+#: vacuumdb.c:473
+#, c-format
+msgid ""
+"cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "\"%s\" 옵션은 PostgreSQL %s 버전보다 오래된 서버에서는 사용할 수 없음"
+
+#: reindexdb.c:369
+#, c-format
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr "시스템 카탈로그 인덱스는 CONCURRENTLY 다시 만들기 못함, 모두 건너 뜀"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "\"%s\" 데이터베이스 재색인 작업 실패: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%s\" 인덱스(해당DB: \"%s\") 재색인 작업 실패: %s"
+
+#: reindexdb.c:581
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%s\" 스키마(해당DB: \"%s\") 재색인 작업 실패: %s"
+
+#: reindexdb.c:585
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "\"%s\" 데이터베이스 시스템 카탈로그 재색인 작업 실패: %s"
+
+#: reindexdb.c:589
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%s\" 테이블(해당DB: \"%s\") 재색인 작업 실패: %s"
+
+#: reindexdb.c:742
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: \"%s\" 데이터베이스 재색인 작업 중\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 PostgreSQL 데이터베이스 재색인 작업을 합니다.\n"
+"\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all 모든 데이터베이스 재색인\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently 테이블 잠그지 않는 재색인\n"
+
+#: reindexdb.c:765
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DBNAME 지정한 데이터베이스의 재색인 작업\n"
+
+#: reindexdb.c:767
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX 지정한 인덱스들만 다시 만듬\n"
+
+#: reindexdb.c:768
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"reindex\n"
+msgstr ""
+" -j, --jobs=NUM 재색인 작업을 여러개의 연결로 동시에 작업함\n"
+
+#: reindexdb.c:769
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet 어떠한 메시지도 보여주지 않음\n"
+
+#: reindexdb.c:770
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system 시스템 카탈로그 재색인\n"
+
+#: reindexdb.c:771
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA 지정한 스키마들 자료만 덤프\n"
+
+#: reindexdb.c:772
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLE 지정한 테이블들만 재색인 작업\n"
+
+#: reindexdb.c:773
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr ""
+" --tablespace=TABLESPACE 데이터베이스를 위한 기본 테이블스페이스\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 작업내역의 자세한 출력\n"
+
+#: reindexdb.c:784
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"보다 자세한 내용은 REINDEX SQL 명령어 설명서를 참조하십시오.\n"
+
+#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279
+#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "통계 수집 전용 작업에서는 \"%s\" 옵션을 사용할 수 없음"
+
+#: vacuumdb.c:297
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "full vacuum 작업에서는 \"%s\" 옵션을 사용할 수 없음"
+
+#: vacuumdb.c:303
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "\"%s\" 옵션과 \"%s\" 옵션을 함께 사용할 수 없음"
+
+#: vacuumdb.c:322
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr ""
+"-a 옵션이 있을 경우는 한 데이터베이스를 대상으로 작업을 진행할 수 없습니다."
+
+#: vacuumdb.c:324
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "모든 데이터베이스를 대상으로 특정 테이블들을 청소할 수는 없음"
+
+#: vacuumdb.c:412
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "최소 최적화 통계 수집 수행 중 (1% 대상)"
+
+#: vacuumdb.c:413
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "일반 최적화 통계 수집 수행 중 (10% 대상)"
+
+#: vacuumdb.c:414
+msgid "Generating default (full) optimizer statistics"
+msgstr "최대 최적화 통계 수집 수행중 (모든 자료 대상)"
+
+#: vacuumdb.c:479
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: \"%s\" 데이터베이스 작업 중: %s\n"
+
+#: vacuumdb.c:482
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: \"%s\" 데이터베이스를 청소 중\n"
+
+#: vacuumdb.c:952
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%s\" 테이블 (해당 DB: \"%s\") 청소하기 실패: %s"
+
+#: vacuumdb.c:955
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "\"%s\" 데이터베이스 청소하기 실패: %s"
+
+#: vacuumdb.c:963
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s 프로그램은 PostgreSQL 데이터베이스 자료 정리 및\n"
+"퀴리 최적화기의 참고 자료를 갱신합니다.\n"
+"\n"
+
+#: vacuumdb.c:967
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all 모든 데이터베이스 청소\n"
+
+#: vacuumdb.c:968
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=DBNAME DBNAME 데이터베이스 청소\n"
+
+#: vacuumdb.c:969
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping 모든 page-skipping 기능 비활성화\n"
+
+#: vacuumdb.c:970
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the "
+"server\n"
+msgstr " -e, --echo 서버로 보내는 명령들을 보여줌\n"
+
+#: vacuumdb.c:971
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full 대청소\n"
+
+#: vacuumdb.c:972
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze 행 트랜잭션 정보 동결\n"
+
+#: vacuumdb.c:973
+#, c-format
+msgid ""
+" --force-index-cleanup always remove index entries that point to "
+"dead tuples\n"
+msgstr ""
+" --force-index-cleanup 삭제된 튜플 대상 인덱스 항목 항상 삭제\n"
+
+#: vacuumdb.c:974
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"vacuum\n"
+msgstr ""
+" -j, --jobs=NUM 청소 작업을 여러개의 연결로 동시에 작업함\n"
+
+#: vacuumdb.c:975
+#, c-format
+msgid ""
+" --min-mxid-age=MXID_AGE minimum multixact ID age of tables to "
+"vacuum\n"
+msgstr ""
+" --min-mxid-age=MXID_AGE 청소할 테이블의 최소 multixact ID 나이\n"
+
+#: vacuumdb.c:976
+#, c-format
+msgid ""
+" --min-xid-age=XID_AGE minimum transaction ID age of tables to "
+"vacuum\n"
+msgstr ""
+" --min-xid-age=XID_AGE 청소할 테이블의 최소 트랜잭션 ID 나이\n"
+
+#: vacuumdb.c:977
+#, c-format
+msgid ""
+" --no-index-cleanup don't remove index entries that point to "
+"dead tuples\n"
+msgstr ""
+" --no-index-cleanup 삭제된 튜플 대상 인덱스 항목 지우지 않음\n"
+
+#: vacuumdb.c:978
+#, c-format
+msgid ""
+" --no-process-toast skip the TOAST table associated with the "
+"table to vacuum\n"
+msgstr ""
+" --no-process-toast vacuum 대상 테이블과 관련된 TOAST 테이블 건"
+"너뜀\n"
+
+#: vacuumdb.c:979
+#, c-format
+msgid ""
+" --no-truncate don't truncate empty pages at the end of "
+"the table\n"
+msgstr ""
+" --no-truncate 테이블 끝에 있는 빈 페이지를 지우지 않음\n"
+
+#: vacuumdb.c:980
+#, c-format
+msgid ""
+" -P, --parallel=PARALLEL_WORKERS use this many background workers for "
+"vacuum, if available\n"
+msgstr ""
+" -P, --parallel=병렬작업수 vacuum 작업을 병렬로 처리 할 수 있는 경우\n"
+" 백그라운드 작업 프로세스 수\n"
+
+#: vacuumdb.c:981
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet 어떠한 메시지도 보여주지 않음\n"
+
+#: vacuumdb.c:982
+#, c-format
+msgid ""
+" --skip-locked skip relations that cannot be immediately "
+"locked\n"
+msgstr ""
+" --skip-locked 즉시 잠글 수 없는 릴레이션은 건너 뜀\n"
+
+#: vacuumdb.c:983
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABLE[(COLUMNS)]' 지정한 특정 테이블들만 청소\n"
+
+#: vacuumdb.c:984
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 작업내역의 자세한 출력\n"
+
+#: vacuumdb.c:985
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: vacuumdb.c:986
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze 쿼리최적화 통계 정보를 갱신함\n"
+
+#: vacuumdb.c:987
+#, c-format
+msgid ""
+" -Z, --analyze-only only update optimizer statistics; no "
+"vacuum\n"
+msgstr ""
+" -Z, --analyze-only 청소 작업 없이 쿼리최적화 통계 정보만 갱신"
+"함\n"
+
+#: vacuumdb.c:988
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in "
+"multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages 보다 빠른 결과를 위해 다중 스테이지에서\n"
+" 최적화 통계치만 갱신함;청소 안함\n"
+
+#: vacuumdb.c:990
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 표시하고 종료\n"
+
+#: vacuumdb.c:998
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"보다 자세한 내용은 VACUUM SQL 명령어 설명서를 참조하십시오.\n"
diff --git a/src/bin/scripts/po/pt_BR.po b/src/bin/scripts/po/pt_BR.po
new file mode 100644
index 0000000..e6abb54
--- /dev/null
+++ b/src/bin/scripts/po/pt_BR.po
@@ -0,0 +1,1169 @@
+# Brazilian Portuguese message translation file for pgscripts
+#
+# Copyright (C) 2003-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Euler Taveira <euler@eulerto.com>, 2003-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-27 13:15-0300\n"
+"PO-Revision-Date: 2016-06-07 06:54-0400\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n>1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erro: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "aviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalhe: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "dica: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "sem memória\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "não pode duplicar ponteiro nulo (erro interno)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "não pôde encontrar ID de usuário efetivo %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "usuário não existe"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "falhou ao pesquisar nome de usuário: código de erro %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Requisição de cancelamento enviada\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Não pôde enviar requisição de cancelamento: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104
+msgid "Password: "
+msgstr "Senha: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "não pôde conectar ao banco de dados %s: sem memória"
+
+#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valor \"%s\" é inválido para opção %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s deve estar no intervalo de %d..%d"
+
+#: ../../fe_utils/parallel_slot.c:301
+#, c-format
+msgid "too many jobs for this platform"
+msgstr "muitas tarefas para esta plataforma"
+
+#: ../../fe_utils/parallel_slot.c:519
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "processamento do banco de dados \"%s\" falhou: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu registro)"
+msgstr[1] "(%lu registros)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Interrompido\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Não pode adicionar cabeçalho a conteúdo de tabela: quantidade de colunas %d foi excedida.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Não pode adicionar célula a conteúdo de tabela: quantidade total de células %d foi excedida.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "formato de saída inválido (erro interno): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "consulta falhou: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "Consulta foi: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158
+#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121
+#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111
+#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Tente \"%s --help\" para obter informações adicionais."
+
+#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "muitos argumentos de linha de comando (primeiro é \"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "não pode agrupar todos os bancos de dados e um específico ao mesmo tempo"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "não pode agrupar tabela(s) específica(s) em todos os bancos de dados"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "agrupamento da tabela \"%s\" no banco de dados \"%s\" falhou: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "agrupamento do banco de dados \"%s\" falhou: %s"
+
+#: clusterdb.c:246
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: agrupando banco de dados \"%s\"\n"
+
+#: clusterdb.c:262
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s agrupa todas as tabelas agrupadas anteriormente no banco de dados.\n"
+"\n"
+
+#: clusterdb.c:263 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPÇÃO]... [NOMEBD]\n"
+
+#: clusterdb.c:265 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opções:\n"
+
+#: clusterdb.c:266
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all agrupa todos os bancos de dados\n"
+
+#: clusterdb.c:267
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=NOMEBD banco de dados a ser agrupado\n"
+
+#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostra os comandos enviados ao servidor\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet não exibe nenhuma mensagem\n"
+
+#: clusterdb.c:270
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABELA agrupa somente a(s) tabela(s) especificada(s)\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mostra muitas mensagens\n"
+
+#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: clusterdb.c:274 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opções de conexão:\n"
+
+#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=MÁQUINA máquina do servidor de banco de dados ou diretório do soquete\n"
+
+#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORTA porta do servidor de banco de dados\n"
+
+#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USUÁRIO nome do usuário para se conectar\n"
+
+#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pergunta senha\n"
+
+#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password pergunta senha\n"
+
+#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=NOMEBD especifica um banco de dados para manutenção\n"
+
+#: clusterdb.c:281
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Leia a descrição do comando SQL CLUSTER para obter detalhes.\n"
+
+#: clusterdb.c:282 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Relate erros a <%s>.\n"
+
+#: clusterdb.c:283 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "página web do %s: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "consulta retornou %d registro ao invés de um: %s"
+msgstr[1] "consulta retornou %d registros ao invés de um: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "s"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Por favor responda \"%s\" ou \"%s\".\n"
+
+#: createdb.c:173
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" não é um nome de codificação válido"
+
+#: createdb.c:243
+#, c-format
+msgid "database creation failed: %s"
+msgstr "criação do banco de dados falhou: %s"
+
+#: createdb.c:262
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "criação de comentário falhou (banco de dados foi criado): %s"
+
+#: createdb.c:280
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s cria um banco de dados PostgreSQL.\n"
+"\n"
+
+#: createdb.c:282
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [OPÇÃO]... [NOMEBD] [DESCRIÇÃO]\n"
+
+#: createdb.c:284
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE tablespace padrão para o banco de dados\n"
+
+#: createdb.c:285 reindexdb.c:766
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostra os comandos enviados ao servidor\n"
+
+#: createdb.c:286
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=CODIFICAÇÃO codificação para o banco de dados\n"
+
+#: createdb.c:287
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE configurações regionais para o banco de dados\n"
+
+#: createdb.c:288
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE configuração LC_COLLATE para o banco de dados\n"
+
+#: createdb.c:289
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE configuração LC_CTYPE para o banco de dados\n"
+
+#: createdb.c:290
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE configuração regional ICU para o banco de dados\n"
+
+#: createdb.c:291
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" provedor de configuração regional para ordenação padrão de bancos de dados\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=DONO usuário do banco que será dono do novo banco de dados\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr " -S, --strategy=ESTRATÉGIA estratégia de criação do banco de dados wal_log ou file_copy\n"
+
+#: createdb.c:295
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=MODELO modelo de banco de dados para copiar\n"
+
+#: createdb.c:296 reindexdb.c:775
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: createdb.c:297 reindexdb.c:776
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: createdb.c:299 reindexdb.c:778
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=MÁQUINA máquina do servidor de banco de dados ou diretório do soquete\n"
+
+#: createdb.c:300 reindexdb.c:779
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORTA porta do servidor de banco de dados\n"
+
+#: createdb.c:301 reindexdb.c:780
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USUÁRIO nome do usuário para se conectar\n"
+
+#: createdb.c:302 reindexdb.c:781
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pergunta senha\n"
+
+#: createdb.c:303 reindexdb.c:782
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password pergunta senha\n"
+
+#: createdb.c:304 reindexdb.c:783
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=NOMEBD especifica um banco de dados para manutenção\n"
+
+#: createdb.c:305
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Por padrão, um banco de dados com o mesmo nome do usuário é criado.\n"
+
+#: createuser.c:193
+msgid "Enter name of role to add: "
+msgstr "Digite o nome da role a ser adicionada: "
+
+#: createuser.c:208
+msgid "Enter password for new role: "
+msgstr "Digite a senha para a nova role: "
+
+#: createuser.c:209
+msgid "Enter it again: "
+msgstr "Digite-a novamente: "
+
+#: createuser.c:212
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Senhas não correspondem.\n"
+
+#: createuser.c:220
+msgid "Shall the new role be a superuser?"
+msgstr "A nova role poderá criar um super-usuário?"
+
+#: createuser.c:235
+msgid "Shall the new role be allowed to create databases?"
+msgstr "A nova role poderá criar bancos de dados?"
+
+#: createuser.c:243
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "A nova role poderá criar novas roles?"
+
+#: createuser.c:278
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "criptografia de senha falhou: %s"
+
+#: createuser.c:331
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "criação de nova role falhou: %s"
+
+#: createuser.c:345
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s cria uma nova role do PostgreSQL.\n"
+"\n"
+
+#: createuser.c:347 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [OPÇÃO]... [NOME_ROLE]\n"
+
+#: createuser.c:349
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N limite de conexão por role (padrão: ilimitado)\n"
+
+#: createuser.c:350
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb role pode criar novos bancos de dados\n"
+
+#: createuser.c:351
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb role não pode criar novos bancos de dados (padrão)\n"
+
+#: createuser.c:353
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROLE nova role será um membro desta role\n"
+
+#: createuser.c:354
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit role herda privilégios de roles das quais ela\n"
+" é um membro (padrão)\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit role não herda privilégios\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login role pode efetuar login (padrão)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login role não pode efetuar login\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt atribui uma senha a nova role\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole role pode criar novas roles\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole role não pode criar novas roles (padrão)\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser role será super-usuário\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser role não será super-usuário (padrão)\n"
+
+#: createuser.c:365
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive pergunta pelo nome e atributos não informados da role\n"
+" ao invés de utilizar o padrão\n"
+
+#: createuser.c:367
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication role pode iniciar replicação\n"
+
+#: createuser.c:368
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication role não pode iniciar replicação\n"
+
+#: createuser.c:373
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=USUÁRIO nome do usuário para se conectar (não é o usuário a ser criado)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "nome do banco de dados é um argumento requerido"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "Banco de dados \"%s\" será permanentemente removido.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Você tem certeza?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "remoção do banco de dados falhou: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s remove um banco de dados PostgreSQL.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [OPÇÃO]... NOMEBD]\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force tenta terminar outras conexões antes de remover\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive pergunta antes de apagar algo\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists não relata erro se banco de dados não existir\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Digite o nome da role a ser removida: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "nome da role é um argumento requerido"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Role \"%s\" será permanentemente removida.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "remoção da role \"%s\" falhou: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s remove uma role do PostgreSQL.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive pergunta antes de apagar algo, e pergunta o nome\n"
+" da role se não for especificado\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists não relata erro se usuário não existir\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=USUÁRIO nome do usuário para se conectar (não é o usuário a ser removido)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "não pôde obter opções padrão"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "aceitando conexões\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "rejeitando conexões\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "nenhuma resposta\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "nenhuma tentativa\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "desconhecido\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s envia uma verificação de conexão para um banco de dados PostgreSQL.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPÇÃO]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=NOMEBD nome do banco de dados\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet executa silenciosamente\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=MÁQUINA máquina do servidor de banco de dados ou diretório do soquete\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORTA porta do servidor de banco de dados\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SEGS segundos a esperar ao tentar conexão, 0 desabilita (padrão: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USUÁRIO nome do usuário para se conectar\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "não pode reindexar todos os bancos de dados e um específico ao mesmo tempo"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "não pode reindexar todos os bancos de dados e os catálogos do sistema ao mesmo tempo"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "não pode reindexar esquema(s) específico(s) em todos os bancos de dados"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "não pode reindexar tabela(s) específica(s) em todos os bancos de dados"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "não pode reindexar índice(s) específico(s) em todos os bancos de dados"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "não pode reindexar esquema(s) específico(s) e os catálogos do sistema ao mesmo tempo"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "não pode reindexar tabela(s) específica(s) e os catálogos do sistema ao mesmo tempo"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "não pode reindexar índice(s) específico(s) e os catálogos do sistema ao mesmo tempo"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "não pode utilizar múltiplas tarefas ao reindexar os catálogos do sistema"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "não pode utilizar múltiplas tarefas ao reindexar índices"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439
+#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469
+#: vacuumdb.c:473
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "não pode utilizar a opção \"%s\" em versões do servidor mais antigas do que PostgreSQL %s"
+
+#: reindexdb.c:369
+#, c-format
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr "não pode reindexar catálogos do sistemas concorrentemente, ignorando todos"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "reindexação do banco de dados \"%s\" falhou: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "reindexação do índice \"%s\" no banco de dados \"%s\" falhou: %s"
+
+#: reindexdb.c:581
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "reindexação do esquema \"%s\" no banco de dados \"%s\" falhou: %s"
+
+#: reindexdb.c:585
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "reindexação de catálogos do sistema no banco de dados \"%s\" falhou: %s"
+
+#: reindexdb.c:589
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "reindexação da tabela \"%s\" no banco de dados \"%s\" falhou: %s"
+
+#: reindexdb.c:742
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: reindexando banco de dados \"%s\"\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s reindexa um banco de dados PostgreSQL.\n"
+"\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all reindexa todos os bancos de dados\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently reindexa concorrentemente\n"
+
+#: reindexdb.c:765
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=NOMEBD banco de dados a ser reindexado\n"
+
+#: reindexdb.c:767
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=ÍNDICE reindexa somente índice(s) especificado(s)\n"
+
+#: reindexdb.c:768
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=NUM usa esse número de conexões concorrentes para reindexar\n"
+
+#: reindexdb.c:769
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet não exibe nenhuma mensagem\n"
+
+#: reindexdb.c:770
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system reindexa os catálogos do sistema\n"
+
+#: reindexdb.c:771
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=ESQUEMA reindexa somente esquema(s) especificado(s)\n"
+
+#: reindexdb.c:772
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABELA reindexa somente tabela(s) especificada(s)\n"
+
+#: reindexdb.c:773
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=TABLESPACE tablespace onde índices serão reconstruídos\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mostra muitas mensagens\n"
+
+#: reindexdb.c:784
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Leia a descrição do comando SQL REINDEX para obter detalhes.\n"
+
+#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279
+#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "não pode utilizar a opção \"%s\" ao executar somente analyze"
+
+#: vacuumdb.c:297
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "não pode utilizar a opção \"%s\" ao executar vacuum full"
+
+#: vacuumdb.c:303
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "não pode utilizar a opção \"%s\" com a opção \"%s\""
+
+#: vacuumdb.c:322
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "não pode limpar todos os bancos de dados e um específico ao mesmo tempo"
+
+#: vacuumdb.c:324
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "não pode limpar tabela(s) específica(s) em todos os bancos de dados"
+
+#: vacuumdb.c:412
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Gerando estatísticas mínimas para otimizador (1 alvo)"
+
+#: vacuumdb.c:413
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Gerando estatísticas parciais para otimizador (10 alvos)"
+
+#: vacuumdb.c:414
+msgid "Generating default (full) optimizer statistics"
+msgstr "Gerando estatísticas padrão (completa) para otimizador"
+
+#: vacuumdb.c:479
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: processando banco de dados \"%s\": %s\n"
+
+#: vacuumdb.c:482
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: limpando banco de dados \"%s\"\n"
+
+#: vacuumdb.c:952
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "limpeza na tabela \"%s\" no banco de dados \"%s\" falhou: %s"
+
+#: vacuumdb.c:955
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "limpeza no banco de dados \"%s\" falhou: %s"
+
+#: vacuumdb.c:963
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s limpa e analisa um banco de dados PostgreSQL.\n"
+"\n"
+
+#: vacuumdb.c:967
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all limpa todos bancos de dados\n"
+
+#: vacuumdb.c:968
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=NOMEBD banco de dados a ser limpo\n"
+
+#: vacuumdb.c:969
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping desabilita comportamento de ignorar páginas\n"
+
+#: vacuumdb.c:970
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostra os comandos enviados ao servidor\n"
+
+#: vacuumdb.c:971
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full faz uma limpeza completa\n"
+
+#: vacuumdb.c:972
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze congela informação sobre transação de registros\n"
+
+#: vacuumdb.c:973
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr " --force-index-cleanup sempre remove entradas de índice que apontam para tuplas mortas\n"
+
+#: vacuumdb.c:974
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=NUM usa esse número de conexões concorrentes para limpar\n"
+
+#: vacuumdb.c:975
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=IDADE_MXID idade mínima do ID de multixact das tabelas para limpar\n"
+
+#: vacuumdb.c:976
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=IDADE_XID idade mínima do ID de transação das tabelas para limpar\n"
+
+#: vacuumdb.c:977
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr " --no-index-cleanup não remove entradas de índice que apontam para tuplas mortas\n"
+
+#: vacuumdb.c:978
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr " --no-process-toast ignora a tabela TOAST associada a tabela para limpar\n"
+
+#: vacuumdb.c:979
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate não truncar páginas vazias ao final da tabela\n"
+
+#: vacuumdb.c:980
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr " -P, --parallel=QTDE_PROCESSOS use essa quantidade de processos filho em segundo plano para limpar, se disponível\n"
+
+#: vacuumdb.c:981
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet não exibe nenhuma mensagem\n"
+
+#: vacuumdb.c:982
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked ignora relações que não podem ser bloqueadas imediatamente\n"
+
+#: vacuumdb.c:983
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABELA[(COLUNAS)]' limpa somente tabela(s) específica(s)\n"
+
+#: vacuumdb.c:984
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mostra muitas mensagens\n"
+
+#: vacuumdb.c:985
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: vacuumdb.c:986
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze atualiza estatísticas do otimizador\n"
+
+#: vacuumdb.c:987
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -Z, --analyze-only atualiza somente estatísticas do otimizador; sem limpeza\n"
+
+#: vacuumdb.c:988
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages atualiza somente estatísticas do otimizador, em\n"
+" múltiplos estágios para resultados mais rápidos; sem limpeza\n"
+
+#: vacuumdb.c:990
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: vacuumdb.c:998
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Leia a descrição do comando SQL VACUUM para obter detalhes.\n"
diff --git a/src/bin/scripts/po/ru.po b/src/bin/scripts/po/ru.po
new file mode 100644
index 0000000..65a9219
--- /dev/null
+++ b/src/bin/scripts/po/ru.po
@@ -0,0 +1,1467 @@
+# Russian message translation file for pgscripts
+# Copyright (C) 2003-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Serguei A. Mokhov, <mokhov@cs.concordia.ca>, 2003-2004.
+# Oleg Bartunov <oleg@sai.msu.su>, 2004.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2017, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 09:09+0300\n"
+"PO-Revision-Date: 2023-11-03 10:36+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробности: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подсказка: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памяти\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "выяснить эффективный идентификатор пользователя (%ld) не удалось: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "пользователь не существует"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "распознать имя пользователя не удалось (код ошибки: %lu)"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Сигнал отмены отправлен\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Отправить сигнал отмены не удалось: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104
+msgid "Password: "
+msgstr "Пароль: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "не удалось подключиться к базе %s (нехватка памяти)"
+
+#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неверное значение \"%s\" для параметра %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "значение %s должно быть в диапазоне %d..%d"
+
+#: ../../fe_utils/parallel_slot.c:319
+#, c-format
+msgid "too many jobs for this platform: %d"
+msgstr "слишком много заданий для этой платформы: %d"
+
+#: ../../fe_utils/parallel_slot.c:328
+#, c-format
+msgid "socket file descriptor out of range for select(): %d"
+msgstr "дескриптор файла сокета вне диапазона, допустимого для select(): %d"
+
+#: ../../fe_utils/parallel_slot.c:330
+#, c-format
+msgid "Try fewer jobs."
+msgstr "Попробуйте уменьшить количество заданий."
+
+#: ../../fe_utils/parallel_slot.c:552
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "ошибка при обработке базы \"%s\": %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu строка)"
+msgstr[1] "(%lu строки)"
+msgstr[2] "(%lu строк)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Прервано\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr ""
+"Ошибка добавления заголовка таблицы: превышен предел числа столбцов (%d).\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr ""
+"Ошибка добавления ячейки в таблицу: превышен предел числа ячеек (%d).\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "неверный формат вывода (внутренняя ошибка): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "ошибка при выполнении запроса: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "Выполнялся запрос: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158
+#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121
+#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111
+#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Для дополнительной информации попробуйте \"%s --help\"."
+
+#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "слишком много аргументов командной строки (первый: \"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "нельзя кластеризовать все базы и одну конкретную одновременно"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "нельзя кластеризовать указанную таблицу(ы) во всех базах"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "кластеризовать таблицу \"%s\" в базе \"%s\" не удалось: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "кластеризовать базу \"%s\" не удалось: %s"
+
+#: clusterdb.c:248
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: кластеризация базы \"%s\"\n"
+
+#: clusterdb.c:264
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s упорядочивает данные всех кластеризованных таблиц в базе данных.\n"
+"\n"
+
+#: clusterdb.c:265 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:762 vacuumdb.c:964
+#, c-format
+msgid "Usage:\n"
+msgstr "Использование:\n"
+
+#: clusterdb.c:266 reindexdb.c:763 vacuumdb.c:965
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [ПАРАМЕТР]... [ИМЯ_БД]\n"
+
+#: clusterdb.c:267 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:764 vacuumdb.c:966
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметры:\n"
+
+#: clusterdb.c:268
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all кластеризовать все базы\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=ИМЯ_БД имя базы данных для кластеризации\n"
+
+#: clusterdb.c:270 createuser.c:352 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo отображать команды, отправляемые серверу\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet не выводить никакие сообщения\n"
+
+#: clusterdb.c:272
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr ""
+" -t, --table=ТАБЛИЦА кластеризовать только указанную таблицу(ы)\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose выводить исчерпывающие сообщения\n"
+
+#: clusterdb.c:274 createuser.c:364 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: clusterdb.c:275 createuser.c:369 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: clusterdb.c:276 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:779 vacuumdb.c:991
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Параметры подключения:\n"
+
+#: clusterdb.c:277 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=ИМЯ имя сервера баз данных или каталог сокетов\n"
+
+#: clusterdb.c:278 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=ПОРТ порт сервера баз данных\n"
+
+#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:994
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr ""
+" -U, --username=ИМЯ имя пользователя для подключения к серверу\n"
+
+#: clusterdb.c:280 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password не запрашивать пароль\n"
+
+#: clusterdb.c:281 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password запросить пароль\n"
+
+#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:997
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=ИМЯ_БД сменить опорную базу данных\n"
+
+#: clusterdb.c:283
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Подробнее о кластеризации вы можете узнать в описании SQL-команды CLUSTER.\n"
+
+#: clusterdb.c:284 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:787 vacuumdb.c:999
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках сообщайте по адресу <%s>.\n"
+
+#: clusterdb.c:285 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:788 vacuumdb.c:1000
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "запрос вернул %d строку вместо одной: %s"
+msgstr[1] "запрос вернул %d строки вместо одной: %s"
+msgstr[2] "запрос вернул %d строк вместо одной: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "y"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s - да/%s - нет) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Пожалуйста, введите \"%s\" или \"%s\".\n"
+
+#: createdb.c:173
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" не является верным названием кодировки"
+
+#: createdb.c:243
+#, c-format
+msgid "database creation failed: %s"
+msgstr "создать базу данных не удалось: %s"
+
+#: createdb.c:262
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "создать комментарий не удалось (база данных была создана): %s"
+
+#: createdb.c:280
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s создаёт базу данных PostgreSQL.\n"
+"\n"
+
+#: createdb.c:282
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [ПАРАМЕТР]... [ИМЯ_БД] [ОПИСАНИЕ]\n"
+
+# well-spelled: ПРОСТР
+#: createdb.c:284
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr ""
+" -D, --tablespace=ТАБЛ_ПРОСТР табличное пространство по умолчанию для базы "
+"данных\n"
+
+#: createdb.c:285 reindexdb.c:768
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the server\n"
+msgstr ""
+" -e, --echo отображать команды, отправляемые серверу\n"
+
+#: createdb.c:286
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=КОДИРОВКА кодировка базы данных\n"
+
+#: createdb.c:287
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=ЛОКАЛЬ локаль для базы данных\n"
+
+#: createdb.c:288
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=ЛОКАЛЬ параметр LC_COLLATE для базы данных\n"
+
+#: createdb.c:289
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=ЛОКАЛЬ параметр LC_CTYPE для базы данных\n"
+
+#: createdb.c:290
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=ЛОКАЛЬ локаль ICU для базы данных\n"
+
+#: createdb.c:291
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default "
+"collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" провайдер локали для основного правила "
+"сортировки БД\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr ""
+" -O, --owner=ВЛАДЕЛЕЦ пользователь-владелец новой базы данных\n"
+
+#: createdb.c:294
+#, c-format
+msgid ""
+" -S, --strategy=STRATEGY database creation strategy wal_log or "
+"file_copy\n"
+msgstr ""
+" -S, --strategy=STRATEGY стратегия создания базы данных: wal_log или "
+"file_copy\n"
+
+#: createdb.c:295
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=ШАБЛОН исходная база данных для копирования\n"
+
+#: createdb.c:296 reindexdb.c:777
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: createdb.c:297 reindexdb.c:778
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: createdb.c:299 reindexdb.c:780
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=ИМЯ имя сервера баз данных или каталог сокетов\n"
+
+#: createdb.c:300 reindexdb.c:781
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=ПОРТ порт сервера баз данных\n"
+
+#: createdb.c:301 reindexdb.c:782
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr ""
+" -U, --username=ИМЯ имя пользователя для подключения к серверу\n"
+
+#: createdb.c:302 reindexdb.c:783
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password не запрашивать пароль\n"
+
+#: createdb.c:303 reindexdb.c:784
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password запросить пароль\n"
+
+#: createdb.c:304 reindexdb.c:785
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=ИМЯ_БД сменить опорную базу данных\n"
+
+#: createdb.c:305
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"По умолчанию именем базы данных считается имя текущего пользователя.\n"
+
+#: createuser.c:193
+msgid "Enter name of role to add: "
+msgstr "Введите имя новой роли: "
+
+#: createuser.c:208
+msgid "Enter password for new role: "
+msgstr "Введите пароль для новой роли: "
+
+#: createuser.c:209
+msgid "Enter it again: "
+msgstr "Повторите его: "
+
+#: createuser.c:212
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Пароли не совпадают.\n"
+
+#: createuser.c:220
+msgid "Shall the new role be a superuser?"
+msgstr "Должна ли новая роль иметь полномочия суперпользователя?"
+
+#: createuser.c:235
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Новая роль должна иметь право создавать базы данных?"
+
+#: createuser.c:243
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Новая роль должна иметь право создавать другие роли?"
+
+#: createuser.c:278
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "ошибка при шифровании пароля: %s"
+
+#: createuser.c:331
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "создать роль не удалось: %s"
+
+#: createuser.c:345
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s создаёт роль пользователя PostgreSQL.\n"
+"\n"
+
+#: createuser.c:347 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [ПАРАМЕТР]... [ИМЯ_РОЛИ]\n"
+
+#: createuser.c:349
+#, c-format
+msgid ""
+" -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr ""
+" -c, --connection-limit=N предел подключений для роли\n"
+" (по умолчанию предела нет)\n"
+
+#: createuser.c:350
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb роль с правом создания баз данных\n"
+
+#: createuser.c:351
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr ""
+" -D, --no-createdb роль без права создания баз данных (по "
+"умолчанию)\n"
+
+#: createuser.c:353
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=РОЛЬ новая роль будет включена в эту роль\n"
+
+#: createuser.c:354
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit роль наследует права ролей (групп), в которые "
+"она\n"
+" включена (по умолчанию)\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit роль не наследует права\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr ""
+" -l, --login роль с правом подключения к серверу (по "
+"умолчанию)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login роль без права подключения\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt назначить пароль новой роли\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole роль с правом создания других ролей\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr ""
+" -R, --no-createrole роль без права создания ролей (по умолчанию)\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser роль с полномочиями суперпользователя\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr ""
+" -S, --no-superuser роль без полномочий суперпользователя (по "
+"умолчанию)\n"
+
+#: createuser.c:365
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes "
+"rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive запрашивать отсутствующие атрибуты и имя роли,\n"
+" а не использовать значения по умолчанию\n"
+
+#: createuser.c:367
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication роль может инициировать репликацию\n"
+
+#: createuser.c:368
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication роль не может инициировать репликацию\n"
+
+#: createuser.c:373
+#, c-format
+msgid ""
+" -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr ""
+" -U, --username=ИМЯ имя пользователя для выполнения операции\n"
+" (но не имя новой роли)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "отсутствует необходимый аргумент: имя базы данных"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "База данных \"%s\" будет удалена безвозвратно.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Вы уверены? (y/n)"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "ошибка при удалении базы данных: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s удаляет базу данных PostgreSQL.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [ПАРАМЕТР]... БД\n"
+
+#: dropdb.c:176
+#, c-format
+msgid ""
+" -f, --force try to terminate other connections before "
+"dropping\n"
+msgstr ""
+" -f, --force пытаться закрыть другие подключения перед "
+"удалением\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive подтвердить операцию удаления\n"
+
+#: dropdb.c:179
+#, c-format
+msgid ""
+" --if-exists don't report error if database doesn't exist\n"
+msgstr ""
+" --if-exists не считать ошибкой отсутствие базы данных\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Введите имя удаляемой роли: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "отсутствует необходимый аргумент: имя роли"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Роль \"%s\" будет удалена безвозвратно.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "ошибка при удалении роли \"%s\": %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s удаляет роль PostgreSQL.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive подтверждать операцию удаления и запрашивать\n"
+" имя роли, если оно не указано\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr ""
+" --if-exists не считать ошибкой отсутствие пользователя\n"
+
+#: dropuser.c:182
+#, c-format
+msgid ""
+" -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr ""
+" -U, --username=ИМЯ имя пользователя для выполнения операции\n"
+" (но не имя удаляемой роли)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "не удалось получить параметры по умолчанию"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "принимает подключения\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "отвергает подключения\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "нет ответа\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "проверка не выполнялась\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "неизвестно\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s проверяет подключение к базе данных PostgreSQL.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [ПАРАМЕТР]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=БД имя базы\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet не выводить никакие сообщения\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=ИМЯ имя сервера баз данных или каталог сокетов\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=ПОРТ порт сервера баз данных\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid ""
+" -t, --timeout=SECS seconds to wait when attempting connection, 0 "
+"disables (default: %s)\n"
+msgstr ""
+" -t, --timeout=СЕК время ожидания при попытке подключения;\n"
+" 0 - без ограничения (по умолчанию: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr ""
+" -U, --username=ИМЯ имя пользователя для подключения к серверу\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr ""
+"нельзя переиндексировать все базы данных и одну конкретную одновременно"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr ""
+"нельзя переиндексировать все базы данных и системные каталоги одновременно"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "нельзя переиндексировать указанную схему(ы) во всех базах"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "нельзя переиндексировать указанную таблицу(ы) во всех базах"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "нельзя переиндексировать указанный индекс(ы) во всех базах"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr ""
+"нельзя переиндексировать указанную схему(ы) и системные каталоги одновременно"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr ""
+"нельзя переиндексировать указанную таблицу(ы) и системные каталоги "
+"одновременно"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr ""
+"нельзя переиндексировать указанный индекс(ы) и системные каталоги "
+"одновременно"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr ""
+"нельзя задействовать несколько заданий для переиндексирования системных "
+"каталогов"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "нельзя задействовать несколько заданий для перестроения индексов"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439
+#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469
+#: vacuumdb.c:473
+#, c-format
+msgid ""
+"cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr ""
+"параметр \"%s\" нельзя использовать с серверами PostgreSQL версии старее %s"
+
+#: reindexdb.c:369
+#, c-format
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr ""
+"все системные каталоги пропускаются, так как их нельзя переиндексировать "
+"неблокирующим способом"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "переиндексировать базу данных \"%s\" не удалось: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "перестроить индекс \"%s\" в базе \"%s\" не удалось: %s"
+
+#: reindexdb.c:581
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "переиндексировать схему \"%s\" в базе \"%s\" не удалось: %s"
+
+#: reindexdb.c:585
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "переиндексировать системные каталоги в базе \"%s\" не удалось: %s"
+
+#: reindexdb.c:589
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "переиндексировать таблицу \"%s\" в базе \"%s\" не удалось: %s"
+
+#: reindexdb.c:744
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: переиндексация базы данных \"%s\"\n"
+
+#: reindexdb.c:761
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s переиндексирует базу данных PostgreSQL.\n"
+"\n"
+
+#: reindexdb.c:765
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all переиндексировать все базы данных\n"
+
+#: reindexdb.c:766
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr ""
+" --concurrently переиндексировать в неблокирующем режиме\n"
+
+#: reindexdb.c:767
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=БД имя базы для переиндексации\n"
+
+#: reindexdb.c:769
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr ""
+" -i, --index=ИНДЕКС пересоздать только указанный индекс(ы)\n"
+
+#: reindexdb.c:770
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"reindex\n"
+msgstr ""
+" -j, --jobs=ЧИСЛО запускать для переиндексации заданное число\n"
+" заданий\n"
+
+#: reindexdb.c:771
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet не выводить сообщения\n"
+
+#: reindexdb.c:772
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr ""
+" -s, --system переиндексировать только системные каталоги\n"
+
+#: reindexdb.c:773
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr ""
+" -S, --schema=СХЕМА переиндексировать только указанную схему(ы)\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr ""
+" -t, --table=ТАБЛИЦА переиндексировать только указанную "
+"таблицу(ы)\n"
+
+# well-spelled: ПРОСТР
+#: reindexdb.c:775
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr ""
+" --tablespace=ТАБЛ_ПРОСТР табличное пространство, в котором будут\n"
+" перестраиваться индексы\n"
+
+#: reindexdb.c:776
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose выводить исчерпывающие сообщения\n"
+
+#: reindexdb.c:786
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Подробнее о переиндексации вы можете узнать в описании SQL-команды REINDEX.\n"
+
+#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279
+#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "при выполнении только анализа нельзя использовать параметр \"%s\""
+
+#: vacuumdb.c:297
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "при выполнении полной очистки нельзя использовать параметр \"%s\""
+
+#: vacuumdb.c:303
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "параметр \"%s\" нельзя использовать совместно с \"%s\""
+
+#: vacuumdb.c:322
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "нельзя очистить все базы данных и одну конкретную одновременно"
+
+#: vacuumdb.c:324
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "нельзя очистить только указанную таблицу(ы) во всех базах"
+
+#: vacuumdb.c:412
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Вычисление минимальной статистики для оптимизатора (1 запись)"
+
+#: vacuumdb.c:413
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Вычисление средней статистики для оптимизатора (10 записей)"
+
+#: vacuumdb.c:414
+msgid "Generating default (full) optimizer statistics"
+msgstr "Вычисление стандартной (полной) статистики для оптимизатора"
+
+#: vacuumdb.c:479
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: обработка базы данных \"%s\": %s\n"
+
+#: vacuumdb.c:482
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: очистка базы данных \"%s\"\n"
+
+#: vacuumdb.c:952
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "очистить таблицу \"%s\" в базе \"%s\" не удалось: %s"
+
+#: vacuumdb.c:955
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "очистить базу данных \"%s\" не удалось: %s"
+
+#: vacuumdb.c:963
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s очищает и анализирует базу данных PostgreSQL.\n"
+"\n"
+
+#: vacuumdb.c:967
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all очистить все базы данных\n"
+
+#: vacuumdb.c:968
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=ИМЯ_БД очистить указанную базу данных\n"
+
+#: vacuumdb.c:969
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr ""
+" --disable-page-skipping исключить все варианты пропуска страниц\n"
+
+#: vacuumdb.c:970
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the "
+"server\n"
+msgstr ""
+" -e, --echo отображать команды, отправляемые серверу\n"
+
+#: vacuumdb.c:971
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full произвести полную очистку\n"
+
+#: vacuumdb.c:972
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr ""
+" -F, --freeze заморозить информацию о транзакциях в "
+"строках\n"
+
+#: vacuumdb.c:973
+#, c-format
+msgid ""
+" --force-index-cleanup always remove index entries that point to "
+"dead tuples\n"
+msgstr ""
+" --force-index-cleanup всегда удалять элементы индекса, "
+"указывающие\n"
+" на мёртвые кортежи\n"
+
+#: vacuumdb.c:974
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"vacuum\n"
+msgstr ""
+" -j, --jobs=ЧИСЛО запускать для очистки заданное число "
+"заданий\n"
+
+#: vacuumdb.c:975
+#, c-format
+msgid ""
+" --min-mxid-age=MXID_AGE minimum multixact ID age of tables to "
+"vacuum\n"
+msgstr ""
+" --min-mxid-age=ВОЗРАСТ минимальный возраст мультитранзакций для\n"
+" таблиц, подлежащих очистке\n"
+
+#: vacuumdb.c:976
+#, c-format
+msgid ""
+" --min-xid-age=XID_AGE minimum transaction ID age of tables to "
+"vacuum\n"
+msgstr ""
+" --min-xid-age=ВОЗРАСТ минимальный возраст транзакций для "
+"таблиц,\n"
+" подлежащих очистке\n"
+
+#: vacuumdb.c:977
+#, c-format
+msgid ""
+" --no-index-cleanup don't remove index entries that point to "
+"dead tuples\n"
+msgstr ""
+" --no-index-cleanup не удалять элементы индекса, указывающие\n"
+" на мёртвые кортежи\n"
+
+#: vacuumdb.c:978
+#, c-format
+msgid ""
+" --no-process-toast skip the TOAST table associated with the "
+"table to vacuum\n"
+msgstr ""
+" --no-process-toast пропускать TOAST-таблицу, связанную\n"
+" с очищаемой таблицей\n"
+
+#: vacuumdb.c:979
+#, c-format
+msgid ""
+" --no-truncate don't truncate empty pages at the end of "
+"the table\n"
+msgstr ""
+" --no-truncate не отсекать пустые страницы в конце "
+"таблицы\n"
+
+#: vacuumdb.c:980
+#, c-format
+msgid ""
+" -P, --parallel=PARALLEL_WORKERS use this many background workers for "
+"vacuum, if available\n"
+msgstr ""
+" -P, --parallel=ПАРАЛЛЕЛЬНЫЕ_ИСПОЛНИТЕЛИ\n"
+" по возможности использовать для очистки\n"
+" заданное число фоновых процессов\n"
+
+#: vacuumdb.c:981
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet не выводить сообщения\n"
+
+#: vacuumdb.c:982
+#, c-format
+msgid ""
+" --skip-locked skip relations that cannot be immediately "
+"locked\n"
+msgstr ""
+" --skip-locked пропускать отношения, которые не удаётся\n"
+" заблокировать немедленно\n"
+
+#: vacuumdb.c:983
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr ""
+" -t, --table='ТАБЛ[(СТОЛБЦЫ)]' очистить только указанную таблицу(ы)\n"
+
+#: vacuumdb.c:984
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose выводить исчерпывающие сообщения\n"
+
+#: vacuumdb.c:985
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: vacuumdb.c:986
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze обновить статистику оптимизатора\n"
+
+#: vacuumdb.c:987
+#, c-format
+msgid ""
+" -Z, --analyze-only only update optimizer statistics; no "
+"vacuum\n"
+msgstr ""
+" -Z, --analyze-only только обновить статистику оптимизатора,\n"
+" не очищать БД\n"
+
+#: vacuumdb.c:988
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in "
+"multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages только пересчитать статистику для "
+"оптимизатора\n"
+" (в несколько проходов для большей "
+"скорости), без очистки\n"
+
+#: vacuumdb.c:990
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: vacuumdb.c:998
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Подробнее об очистке вы можете узнать в описании SQL-команды VACUUM.\n"
+
+#~ msgid "only one of --locale and --lc-ctype can be specified"
+#~ msgstr "можно указать только --locale или --lc-ctype"
+
+#~ msgid "only one of --locale and --lc-collate can be specified"
+#~ msgstr "можно указать только --locale и --lc-collate"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "number of parallel jobs must be at least 1"
+#~ msgstr "число параллельных заданий должно быть не меньше 1"
+
+#~ msgid "parallel workers for vacuum must be greater than or equal to zero"
+#~ msgstr ""
+#~ "число параллельных исполнителей для выполнения очистки должно быть "
+#~ "неотрицательным"
+
+#~ msgid "minimum transaction ID age must be at least 1"
+#~ msgstr "минимальный возраст транзакций должен быть не меньше 1"
+
+#~ msgid "minimum multixact ID age must be at least 1"
+#~ msgstr "минимальный возраст мультитранзакций должен быть не меньше 1"
+
+#~ msgid "could not connect to database %s: %s"
+#~ msgstr "не удалось подключиться к базе %s: %s"
+
+#~ msgid "parallel vacuum degree must be a non-negative integer"
+#~ msgstr ""
+#~ "степень параллельности для очистки должна задаваться неотрицательным целым"
+
+#~ msgid "Could not send cancel request: %s"
+#~ msgstr "Отправить сигнал отмены не удалось: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "reindexing of system catalogs failed: %s"
+#~ msgstr "переиндексировать системные каталоги не удалось: %s"
+
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
+
+#, fuzzy
+#~ msgid "%s: too many parallel jobs requested (maximum: %d)\n"
+#~ msgstr ""
+#~ "%s: запрошено слишком много параллельных заданий (при максимуме: %d)\n"
+
+#~ msgid "%s: invalid socket: %s"
+#~ msgstr "%s: неверный сокет: %s"
+
+#~ msgid " -E, --encrypted encrypt stored password\n"
+#~ msgstr " -E, --encrypted зашифровать сохранённый пароль\n"
+
+#~ msgid " -N, --unencrypted do not encrypt stored password\n"
+#~ msgstr " -N, --unencrypted не шифровать сохранённый пароль\n"
+
+#~ msgid "Name"
+#~ msgstr "Имя"
+
+#~ msgid "no"
+#~ msgstr "нет"
+
+#~ msgid "yes"
+#~ msgstr "да"
+
+#~ msgid "Trusted?"
+#~ msgstr "Доверенный?"
+
+#~ msgid "Procedural Languages"
+#~ msgstr "Процедурные языки"
+
+#~ msgid "%s: missing required argument language name\n"
+#~ msgstr "%s: отсутствует необходимый аргумент: название языка\n"
+
+#~ msgid "%s: language \"%s\" is already installed in database \"%s\"\n"
+#~ msgstr "%s: поддержка языка \"%s\" уже имеется в базе \"%s\"\n"
+
+#~ msgid "%s: language installation failed: %s"
+#~ msgstr "%s: установить поддержку языка не удалось: %s"
+
+#~ msgid ""
+#~ "%s installs a procedural language into a PostgreSQL database.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s устанавливает поддержку процедурного языка в базу PostgreSQL.\n"
+#~ "\n"
+
+#~ msgid " %s [OPTION]... LANGNAME [DBNAME]\n"
+#~ msgstr " %s [ПАРАМЕТР]... ЯЗЫК [ИМЯ_БД]\n"
+
+#~ msgid " -d, --dbname=DBNAME database to install language in\n"
+#~ msgstr ""
+#~ " -d, --dbname=ИМЯ_БД база данных, куда будет установлен язык\n"
+
+#~ msgid ""
+#~ " -l, --list show a list of currently installed languages\n"
+#~ msgstr " -l, --list показать список установленных языков\n"
+
+#~ msgid "%s: language \"%s\" is not installed in database \"%s\"\n"
+#~ msgstr "%s: поддержка языка \"%s\" не установлена в базе данных\"%s\"\n"
+
+#~ msgid "%s: language removal failed: %s"
+#~ msgstr "%s: ошибка при удалении поддержки языка: %s"
+
+#~ msgid ""
+#~ "%s removes a procedural language from a database.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s удаляет процедурный язык из базы данных.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " -d, --dbname=DBNAME database from which to remove the language\n"
+#~ msgstr ""
+#~ " -d, --dbname=ИМЯ_БД база данных, из которой будет удалён язык\n"
+
+#~ msgid "%s: cannot use the \"freeze\" option when performing only analyze\n"
+#~ msgstr ""
+#~ "%s: при выполнении только анализа нельзя использовать только \"freeze\"\n"
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s: не удалось получить информацию о текущем пользователе: %s\n"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s: не удалось узнать имя текущего пользователя: %s\n"
+
+#~ msgid " -U, --username=USERNAME database username\n"
+#~ msgstr " -U, --username=ИМЯ имя пользователя\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: нехватка памяти\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If one of -d, -D, -r, -R, -s, -S, and ROLENAME is not specified, you "
+#~ "will\n"
+#~ "be prompted interactively.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Если параметры -d, -D, -r, -R, -s, -S или ИМЯ_РОЛИ не определены, вам "
+#~ "будет\n"
+#~ "предложено ввести их интерактивно.\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help показать эту справку и выйти\n"
+
+#~ msgid ""
+#~ " --version output version information, then exit\n"
+#~ msgstr " --version показать версию и выйти\n"
diff --git a/src/bin/scripts/po/sv.po b/src/bin/scripts/po/sv.po
new file mode 100644
index 0000000..c33a139
--- /dev/null
+++ b/src/bin/scripts/po/sv.po
@@ -0,0 +1,1181 @@
+# Swedish message translation file for postgresql
+# Dennis Björklund <db@zigo.dhs.org>, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022.
+# Peter Eisentraut <peter_e@gmx.net>, 2013.
+# Mats Erik Andersson <bsd@gisladisker.se>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-09 18:50+0000\n"
+"PO-Revision-Date: 2022-05-09 21:46+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kan inte duplicera null-pekare (internt fel)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "kunde inte slå upp effektivt användar-id %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "användaren finns inte"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "misslyckad sökning efter användarnamn: felkod %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Förfrågan om avbrytning skickad\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Kunde inte skicka förfrågan om avbrytning: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104
+msgid "Password: "
+msgstr "Lösenord: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "kunde inte ansluta till databas %s: slut på minne"
+
+#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ogiltigt värde \"%s\" för flaggan \"%s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s måste vara i intervallet %d..%d"
+
+#: ../../fe_utils/parallel_slot.c:301
+#, c-format
+msgid "too many jobs for this platform"
+msgstr "för många jobb för denna plattform"
+
+#: ../../fe_utils/parallel_slot.c:519
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "processande av databas \"%s\" misslyckades: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu rad)"
+msgstr[1] "(%lu rader)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Avbruten\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Kan inte lägga till rubrik till tabellinnehåll: antal kolumner (%d) överskridet.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Kan inte lägga till cell till tabellinnehåll: totala cellantalet (%d) överskridet.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "ogiltigt utdataformat (internt fel): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "fråga misslyckades: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "Frågan var: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158
+#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121
+#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111
+#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "kan inte klustra alla databaser och en angiven på samma gång"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "kan inte klustra angivna tabeller i alla databaser"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "klustring av tabell \"%s\" i databas \"%s\" misslyckades: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "klustring av databas \"%s\" misslyckades: %s"
+
+#: clusterdb.c:246
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: klustring av databas \"%s\"\n"
+
+#: clusterdb.c:262
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s klustrar alla tidigare klustrade tabeller i en databas.\n"
+"\n"
+
+#: clusterdb.c:263 createdb.c:283 createuser.c:346 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [FLAGGA]... [DBNAMN]\n"
+
+#: clusterdb.c:265 createdb.c:285 createuser.c:348 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Flaggor:\n"
+
+#: clusterdb.c:266
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all klustra alla databaser\n"
+
+#: clusterdb.c:267
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=DBNAME databas att klustra\n"
+
+#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo visa kommandon som skickas till servern\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet skriv inte ut några meddelanden\n"
+
+#: clusterdb.c:270
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABELL klustra enbart ingivna tabeller\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose skriv massor med utdata\n"
+
+#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: clusterdb.c:274 createdb.c:300 createuser.c:370 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Flaggor för anslutning:\n"
+
+#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n"
+
+#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT databasserverns port\n"
+
+#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n"
+
+#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password fråga ej efter lösenord\n"
+
+#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password framtvinga fråga om lösenord\n"
+
+#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAMN annat val av underhållsdatabas\n"
+
+#: clusterdb.c:281
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Läs beskrivningen av SQL-kommandot CLUSTER för detaljer.\n"
+
+#: clusterdb.c:282 createdb.c:308 createuser.c:376 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: clusterdb.c:283 createdb.c:309 createuser.c:377 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "fråga gav %d rad istället för en: %s"
+msgstr[1] "fråga gav %d rader istället för en: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "j"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Var vänlig att svara \"%s\" eller \"%s\".\n"
+
+#: createdb.c:165
+#, c-format
+msgid "only one of --locale and --lc-ctype can be specified"
+msgstr "endast en av --locale och --lc-ctype kan anges"
+
+#: createdb.c:167
+#, c-format
+msgid "only one of --locale and --lc-collate can be specified"
+msgstr "endast en av --locale och --lc-collate kan anges"
+
+#: createdb.c:175
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" är inte ett giltigt kodningsnamn"
+
+#: createdb.c:245
+#, c-format
+msgid "database creation failed: %s"
+msgstr "misslyckades att skapa databas: %s"
+
+#: createdb.c:264
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "misslyckades att skapa kommentar (databasen skapades): %s"
+
+#: createdb.c:282
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s skapar en PostgreSQL-databas.\n"
+"\n"
+
+#: createdb.c:284
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [FLAGGA]... [DBNAMN] [BESKRIVNING]\n"
+
+#: createdb.c:286
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABELLRYMD förvalt tabellutrymme för databasen\n"
+
+#: createdb.c:287 reindexdb.c:766
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo visa kommandon som skickas till servern\n"
+
+#: createdb.c:288
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=KODNING teckenkodning för databasen\n"
+
+#: createdb.c:289
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOKAL lokalnamn för databasen\n"
+
+#: createdb.c:290
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOKAL värde på LC_COLLATE för databasen\n"
+
+#: createdb.c:291
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOKAL värde på LC_CTYPE för databasen\n"
+
+#: createdb.c:292
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOKAL värde på ICU-lokal för databasen\n"
+
+#: createdb.c:293
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" lokalleverantör av databasens standardjämförelser\n"
+
+#: createdb.c:295
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=ÄGARE databasanvändare som äger nya databasen\n"
+
+#: createdb.c:296
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr ""
+" -S, --strategy=STRATEGI strategi för att skapa en databas, wal_log\n"
+" eller file_copy\n"
+
+#: createdb.c:297
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=MALL databasmall att kopiera\n"
+
+#: createdb.c:298 reindexdb.c:775
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: createdb.c:299 reindexdb.c:776
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: createdb.c:301 reindexdb.c:778
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n"
+
+#: createdb.c:302 reindexdb.c:779
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT databasserverns port\n"
+
+#: createdb.c:303 reindexdb.c:780
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n"
+
+#: createdb.c:304 reindexdb.c:781
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password fråga ej efter lösenord\n"
+
+#: createdb.c:305 reindexdb.c:782
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password framtvinga fråga om lösenord\n"
+
+#: createdb.c:306 reindexdb.c:783
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAMN annat val av underhållsdatabas\n"
+
+#: createdb.c:307
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Som standard skapas en databas med samma namn som den nuvarande användares namn.\n"
+
+#: createuser.c:193
+msgid "Enter name of role to add: "
+msgstr "Mata in namn på den roll som skall läggas till: "
+
+#: createuser.c:208
+msgid "Enter password for new role: "
+msgstr "Mata in lösenord för den nya rollen: "
+
+#: createuser.c:209
+msgid "Enter it again: "
+msgstr "Mata in det igen: "
+
+#: createuser.c:212
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Lösenorden stämde inte överens.\n"
+
+#: createuser.c:220
+msgid "Shall the new role be a superuser?"
+msgstr "Skall den nya rollen vara en superuser?"
+
+#: createuser.c:235
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Skall den nya rollen tillåtas skapa databaser?"
+
+#: createuser.c:243
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Skall den nya rollen tillåtas skapa fler nya roller?"
+
+#: createuser.c:278
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "misslyckades med lösenordskryptering: %s"
+
+#: createuser.c:331
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "misslyckades med att skapa ny roll: %s"
+
+#: createuser.c:345
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s skapar en ny PostgreSQL-roll.\n"
+"\n"
+
+#: createuser.c:347 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [FLAGGA]... [ROLLNAMN]\n"
+
+#: createuser.c:349
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N anslutningsgräns för roll (standard: ingen gräns)\n"
+
+#: createuser.c:350
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb rollen kan skapa nya databaser\n"
+
+#: createuser.c:351
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb rollen kan inte skapa databaser (standard)\n"
+
+#: createuser.c:353
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROLL nya rollen kommer bli medlem i denna roll\n"
+
+#: createuser.c:354
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit rollen ärver rättigheter från roller den\n"
+" är medlem i (standard)\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit rollen ärver inga rättigheter\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login rollen kan logga in (standard)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login rollen kan inte logga in\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt tilldela den nya rollen ett lösenord\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole rollen kan skapa nya roller\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole rollen kan inte skapa roller (standard)\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser rollen blir en superuser\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser rollen blir inte superuser (standard)\n"
+
+#: createuser.c:365
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive fråga efter rollnamn och egenskaper, snarare än\n"
+" att falla tillbaka på förval\n"
+
+#: createuser.c:367
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication rollen kan starta replikering\n"
+
+#: createuser.c:368
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication rollen får inte starta replikering\n"
+
+#: createuser.c:373
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som (ej den som skapas)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "saknar nödvändigt databasnamn"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "Databasen \"%s\" kommer att tas bort permanent.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Är du säker?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "borttagning av databas misslyckades: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s tar bort en PostgreSQL-databas.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [FLAGGA]... DBNAMN\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force försöka stänga andra uppkopplingar innan radering\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive fråga innan något tas bort\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists felrapportera ej om databasen saknas\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Mata inn namnet på den roll som skall tas bort: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "saknar ett nödvändigt rollnamn"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Rollen \"%s\" kommer att tas bort permanent.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "borttagning av rollen \"%s\" misslyckades: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr "%s tar bort en PostgreSQL-roll.\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive fråga innan något tas bort och fråga efter\n"
+" rollnamn om sådant saknas\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists felrapportera ej om användaren saknas\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=ANVÄNDARE användare som ansluter (inte den som tas bort)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "kunde inte hämta förvalda värde."
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "accepterar anslutningar\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "vägrar anslutningar\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "inget svar\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "inget försök\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "okänt\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s utför en anslutningskontroll mot en PostgreSQL-databas.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [FLAGGA]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DBNAMN databasens namn\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet tyst körning\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT databasserverns port\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SEK sekunder att vänta på anslutning; 0 stänger av (förval: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "kan inte omindexera alla databaser och samtidigt en specifik databas"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "kan inte omindexera alla databaser samtidigt med systemkatalogerna"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "kan inte omindexera angivna scheman i alla databaser"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "Kan inte indexera specifik tabell i alla databaser"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "Kan inte omindexera angivet index i alla databaser"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "kan inte omindexera angivna scheman och systemkataloger på samma gång"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "kan inte omindexera specifik tabell och systemkatalogerna samtidigt"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "kan inte omindexera angivna index och systemkatalogerna samtidigt."
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "kan inte använda multipla jobb för att omindexera systemkataloger"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "kan inte använda multipla jobb för att omindexera index"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439
+#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469
+#: vacuumdb.c:473
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "flaggan \"%s\" kan inte användas på serverversioner äldre än PostgreSQL %s"
+
+#: reindexdb.c:369
+#, c-format
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr "kan inte omindexera systemkataloger parallellt, hoppar över alla"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "omindexering av databasen \"%s\" misslyckades: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "omindexering av index \"%s\" i databasen \"%s\" misslyckades: %s"
+
+#: reindexdb.c:581
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "omindexering av schemat \"%s\" i databasen \"%s\" misslyckades: %s"
+
+#: reindexdb.c:585
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "omindexering av systemkataloger i databasen \"%s\" misslyckades: %s"
+
+#: reindexdb.c:589
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "omindexering av tabell \"%s\" i databasen \"%s\" misslyckades: %s"
+
+#: reindexdb.c:742
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: omindexering av databasen \"%s\"\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s indexerar om en PostgreSQL-databas.\n"
+"\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all indexera om alla databaser\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently indexera om utan att låsa\n"
+
+#: reindexdb.c:765
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DBNAME databas att indexera om\n"
+
+#: reindexdb.c:767
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX återskapa enbart angivna index\n"
+
+#: reindexdb.c:768
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr ""
+" -j, --jobs=NUM använd så här många samtida anslutningar\n"
+" för omindexering\n"
+
+#: reindexdb.c:769
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet skriv inte ut några meddelanden\n"
+
+#: reindexdb.c:770
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system indexera enbart om systemkataloger\n"
+
+#: reindexdb.c:771
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA indexera enbart om angivna scheman\n"
+
+#: reindexdb.c:772
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABELL indexera enbart om angivna tabeller\n"
+
+#: reindexdb.c:773
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=TABELLRYMD tabellutrymme där index byggs om\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose skriv massor med utdata\n"
+
+#: reindexdb.c:784
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Läs beskrivningen av SQL-kommandot REINDEX för detaljer.\n"
+
+#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279
+#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "flaggan \"%s\" kan inte användas vid enbart analys"
+
+#: vacuumdb.c:297
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "flaggan \"%s\" kan inte användas vid \"full vacuum\""
+
+#: vacuumdb.c:303
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "flaggan \"%s\" kan inte användas tillsammans med flaggan \"%s\""
+
+#: vacuumdb.c:322
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "kan inte städa alla databaser och endast en angiven på samma gång"
+
+#: vacuumdb.c:324
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "kan inte städa en specifik tabell i alla databaser."
+
+#: vacuumdb.c:412
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Skapar minimal optimeringsstatistik (1 mål)"
+
+#: vacuumdb.c:413
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Skapar medium optimeringsstatistik (10 mål)"
+
+#: vacuumdb.c:414
+msgid "Generating default (full) optimizer statistics"
+msgstr "Skapar förvald (full) optimeringsstatistik"
+
+#: vacuumdb.c:479
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: processar databasen \"%s\": %s\n"
+
+#: vacuumdb.c:482
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: städar databasen \"%s\".\n"
+
+#: vacuumdb.c:952
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "städning av tabell \"%s\" i databasen \"%s\" misslyckades: %s"
+
+#: vacuumdb.c:955
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "städning av databasen \"%s\" misslyckades: %s"
+
+#: vacuumdb.c:963
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s städar och analyserar en PostgreSQL-databas.\n"
+"\n"
+
+#: vacuumdb.c:967
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all städa i alla databaser\n"
+
+#: vacuumdb.c:968
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=DBNAMN databas att städa i\n"
+
+#: vacuumdb.c:969
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping stäng av alla sidöverhoppande beteeenden\n"
+
+#: vacuumdb.c:970
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo visa kommandon som skickas till servern\n"
+
+#: vacuumdb.c:971
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full utför full städning\n"
+
+#: vacuumdb.c:972
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze frys information om radtransaktioner\n"
+
+#: vacuumdb.c:973
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr " --force-index-cleanup ta alltid bort indexposter som pekar på döda tupler\n"
+
+#: vacuumdb.c:974
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=NUM använd så här många samtida anslutningar för städning\n"
+
+#: vacuumdb.c:975
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_ÅLDER minimal multixact-ID-ålder i tabeller som skall städas\n"
+
+#: vacuumdb.c:976
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=XID_ÅLDER minimal transaktions-ID-ålder i tabeller som skall städas\n"
+
+#: vacuumdb.c:977
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr " --no-index-cleanup ta inte bort indexposter som pekar på döda tupler\n"
+
+#: vacuumdb.c:978
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr " --no-process-toast hoppa över TOAST-tabellen som hör ihop med tabellen som städas\n"
+
+#: vacuumdb.c:979
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate trunkera inte tomma sidor i slutet av tabellen\n"
+
+#: vacuumdb.c:980
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr ""
+" -P, --parallel=PARALLELLA_ARBETARE\n"
+" använda så här många bakgrundsarbetare för städning, om det finns\n"
+
+#: vacuumdb.c:981
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet skriv inte ut några meddelanden\n"
+
+#: vacuumdb.c:982
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked hoppa äver relationer som inte kan låsas direkt\n"
+
+#: vacuumdb.c:983
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABELL[(KOLUMNER)]' städa enbart i dessa tabeller\n"
+
+#: vacuumdb.c:984
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose skriv massor med utdata\n"
+
+#: vacuumdb.c:985
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: vacuumdb.c:986
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze uppdatera optimeringsstatistik\n"
+
+#: vacuumdb.c:987
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -Z, --analyze-only uppdatera bara optimeringsstatistik; ingen städning\n"
+
+#: vacuumdb.c:988
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages uppdatera bara optimeringsstatistik, men i\n"
+" flera steg för snabbare resultat; ingen städning\n"
+
+#: vacuumdb.c:990
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: vacuumdb.c:998
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Läs beskrivningen av SQL-kommandot VACUUM för detaljer.\n"
diff --git a/src/bin/scripts/po/tr.po b/src/bin/scripts/po/tr.po
new file mode 100644
index 0000000..0565244
--- /dev/null
+++ b/src/bin/scripts/po/tr.po
@@ -0,0 +1,1223 @@
+# translation of pgscripts-tr.po to Turkish
+# Devrim GUNDUZ <devrim@CommandPrompt.com>, 2004, 2005, 2006, 2007.
+# Nicolai Tufar <ntufar@gmail.org>, 2005, 2006, 2007.
+# İbrahim Edib Kökdemir <>, 2018.
+# Abdullah G. GÜLNER <>, 2018.
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts-tr\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2019-04-26 13:47+0000\n"
+"PO-Revision-Date: 2021-09-16 09:36+0200\n"
+"Last-Translator: Abdullah G. GüLNER\n"
+"Language-Team: Turkish <ceviri@postgresql.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Basepath: /home/ntufar/pg/pgsql/src/bin/scripts\n"
+"X-Poedit-SearchPath-0: /home/ntufar/pg/pgsql/src/bin/scripts\n"
+
+#: ../../../src/fe_utils/logging.c:182
+#, c-format
+msgid "fatal: "
+msgstr "ölümcül (fatal): "
+
+#: ../../../src/fe_utils/logging.c:189
+#, c-format
+msgid "error: "
+msgstr "hata: "
+
+#: ../../../src/fe_utils/logging.c:196
+#, c-format
+msgid "warning: "
+msgstr "uyarı: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "bellek yetersiz\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null pointer duplicate edilemiyor (iç hata)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "geçerli kullanıcı ID si bulunamadı %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "kullanıcı mevcut değil"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "kullanıcı adı arama başarısız: hata kodu %lu"
+
+#: ../../fe_utils/print.c:353
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu satır)"
+msgstr[1] "(%lu satır)"
+
+#: ../../fe_utils/print.c:3058
+#, c-format
+msgid "Interrupted\n"
+msgstr "kesildi\n"
+
+#: ../../fe_utils/print.c:3122
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "B aşlık tablo içeriğine eklenemedi: %d kolon sayısı aşıldı.\n"
+
+#: ../../fe_utils/print.c:3162
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Hücre tablo içeriğine eklenemedi: %d olan toplan hücre sayısı açıldı.\n"
+
+#: ../../fe_utils/print.c:3417
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "geçersiz çıktı biçimi (iç hata): %d"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:121 createdb.c:140
+#: createuser.c:168 createuser.c:183 dropdb.c:96 dropdb.c:105 dropdb.c:113
+#: dropuser.c:92 dropuser.c:107 dropuser.c:122 pg_isready.c:95 pg_isready.c:109
+#: reindexdb.c:139 reindexdb.c:158 vacuumdb.c:246 vacuumdb.c:265
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" komutunu deneyiniz.\n"
+
+#: clusterdb.c:130 createdb.c:138 createuser.c:181 dropdb.c:111 dropuser.c:105
+#: pg_isready.c:107 reindexdb.c:156 vacuumdb.c:263
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "çok sayıda komut satırı argümanı (ilki \"%s\")"
+
+#: clusterdb.c:142
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "aynı anda tüm veritabanları ve de belirli bir tanesi cluster edilemez"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "tüm veritabanlarındaki belirli tablo(lar) cluster edilemez"
+
+#: clusterdb.c:216
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%2$s\" veritabanındaki \"%1$s\"tablosunun cluster işlemi başarısız oldu: %3$s"
+
+#: clusterdb.c:219
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "\"%s\" veritabanının cluster işlemi başarısız oldu: %s"
+
+#: clusterdb.c:252
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: \"%s\" veritabanı cluster ediliyor\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s komutu bir veritabanında daha önceden cluster edilmiş tüm tabloları cluster eder.\n"
+"\n"
+
+#: clusterdb.c:274 createdb.c:250 createuser.c:344 dropdb.c:157 dropuser.c:163
+#: pg_isready.c:224 reindexdb.c:425 vacuumdb.c:1213
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: clusterdb.c:275 reindexdb.c:426 vacuumdb.c:1214
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [SEÇENEK]... [VERİTABANI_ADI]\n"
+
+#: clusterdb.c:276 createdb.c:252 createuser.c:346 dropdb.c:159 dropuser.c:165
+#: pg_isready.c:227 reindexdb.c:427 vacuumdb.c:1215
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Seçenekler:\n"
+
+#: clusterdb.c:277
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all tüm veritabanlarını cluster eder\n"
+
+#: clusterdb.c:278
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=VERİTABANI_ADI cluster edilecek veritabanı adı\n"
+
+#: clusterdb.c:279 createuser.c:350 dropdb.c:160 dropuser.c:166 reindexdb.c:431
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo sunucuya gönderilen komutları göster\n"
+
+#: clusterdb.c:280 reindexdb.c:433
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet hiçbir ileti yazma\n"
+
+#: clusterdb.c:281
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABLO_ADI sadece belirli (bir) tabloyu/tabloları cluster eder\n"
+
+#: clusterdb.c:282 reindexdb.c:437
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose bolca çıktı yaz\n"
+
+#: clusterdb.c:283 createuser.c:362 dropdb.c:162 dropuser.c:169 reindexdb.c:438
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini gösterir ve sonra çıkar\n"
+
+#: clusterdb.c:284 createuser.c:367 dropdb.c:164 dropuser.c:171 reindexdb.c:439
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#: clusterdb.c:285 createdb.c:263 createuser.c:368 dropdb.c:165 dropuser.c:172
+#: pg_isready.c:233 reindexdb.c:440 vacuumdb.c:1235
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Bağlantı seçenekleri:\n"
+
+#: clusterdb.c:286 createuser.c:369 dropdb.c:166 dropuser.c:173 reindexdb.c:441
+#: vacuumdb.c:1236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME veritabanı sunucusu adresi ya da soket dizini\n"
+
+#: clusterdb.c:287 createuser.c:370 dropdb.c:167 dropuser.c:174 reindexdb.c:442
+#: vacuumdb.c:1237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT veritabanı sunucusunun portu\n"
+
+#: clusterdb.c:288 dropdb.c:168 reindexdb.c:443 vacuumdb.c:1238
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=KULLANICI_ADI bağlanılacak kullanıcı adı\n"
+
+#: clusterdb.c:289 createuser.c:372 dropdb.c:169 dropuser.c:176 reindexdb.c:444
+#: vacuumdb.c:1239
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password parola sorma\n"
+
+#: clusterdb.c:290 createuser.c:373 dropdb.c:170 dropuser.c:177 reindexdb.c:445
+#: vacuumdb.c:1240
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password parola sorulmasını sağla\n"
+
+#: clusterdb.c:291 dropdb.c:171 reindexdb.c:446 vacuumdb.c:1241
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=VTADI alternatif bakım veritabanı\n"
+
+#: clusterdb.c:292
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Ayrıntılar için bir SQL komutu olan CLUSTER'in açıklamasını okuyabilirsiniz.\n"
+
+#: clusterdb.c:293 createdb.c:271 createuser.c:374 dropdb.c:172 dropuser.c:178
+#: pg_isready.c:238 reindexdb.c:448 vacuumdb.c:1243
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+msgstr ""
+"\n"
+"Hataları <pgsql-bugs@lists.postgresql.org> adresine bildirebilirsiniz.\n"
+
+#: common.c:84 common.c:130
+msgid "Password: "
+msgstr "Parola: "
+
+#: common.c:117
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "%s veritabanına bağlanılamadı: bellek yetersiz"
+
+#: common.c:144
+#, c-format
+msgid "could not connect to database %s: %s"
+msgstr "%s veritabanına bağlanılamadı: %s"
+
+#: common.c:197 common.c:223
+#, c-format
+msgid "query failed: %s"
+msgstr "sorgu başarısız oldu: %s"
+
+#: common.c:198 common.c:224
+#, c-format
+msgid "query was: %s"
+msgstr "sorgu şu idi: %s"
+
+#: common.c:347
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "sorgu 1 yerine %d satır döndürdü: %s"
+msgstr[1] "sorgu 1 yerine %d satır döndürdü: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:372
+msgid "y"
+msgstr "e"
+
+#. translator: abbreviation for "no"
+#: common.c:374
+msgid "n"
+msgstr "h"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:384
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:398
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Lütfen yanıtlayınız: \"%s\" veya \"%s\".\n"
+
+#: common.c:477 common.c:514
+#, c-format
+msgid "Cancel request sent\n"
+msgstr "İptal isteği gönderildi\n"
+
+#: common.c:480 common.c:518
+#, c-format
+msgid "Could not send cancel request: %s"
+msgstr "İptal isteği gönderilemedi: %s"
+
+#: createdb.c:148
+#, c-format
+msgid "only one of --locale and --lc-ctype can be specified"
+msgstr "--locale ve --lc-ctype seçeneklerinden sadece birisi belirtilebilir"
+
+#: createdb.c:153
+#, c-format
+msgid "only one of --locale and --lc-collate can be specified"
+msgstr "--locale ve --lc-collate seçeneklerinden sadece birisi belirtilebilir"
+
+#: createdb.c:164
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" geçerli bir dil kodlaması adı değildir"
+
+#: createdb.c:212
+#, c-format
+msgid "database creation failed: %s"
+msgstr "veritabanı yaratma başarısız oldu: %s"
+
+#: createdb.c:231
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "yorum yaratma işlemi başarısız oldu (veritabanı yaratıldı): %s"
+
+#: createdb.c:249
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s bir PostgreSQL veritabanı yaratır.\n"
+"\n"
+
+#: createdb.c:251
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [SEÇENEK]... [VERİTABANI_ADI] [TANIM]\n"
+
+#: createdb.c:253
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE veritabanı için öntanımlı tablo uzayı\n"
+
+#: createdb.c:254
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo sunucuya gönderilen komutları göster\n"
+
+#: createdb.c:255
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=ENCODING veritabanı için dil kodlaması\n"
+
+#: createdb.c:256
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE veritabanı için yerel ayarları\n"
+
+#: createdb.c:257
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE Veritabanı için LC_COLLATE ayarı\n"
+
+#: createdb.c:258
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE Veritabanı için LC_CTYPE ayarı\n"
+
+#: createdb.c:259
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=OWNER yeni veritabanının sahibi olacak veritabanı kullanıcısı\n"
+
+#: createdb.c:260
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=TEMPLATE kopyalanacak şablon veritabanı\n"
+
+#: createdb.c:261
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#: createdb.c:262
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#: createdb.c:264
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME veritabanı sunucusu adresi ya da soket dizini\n"
+
+#: createdb.c:265
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT veritabanı sunucu portu\n"
+
+#: createdb.c:266
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=KULLANICI_ADI bağlanılacak kullanıcı adı\n"
+
+#: createdb.c:267
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password asla parola sorma\n"
+
+#: createdb.c:268
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password parola sormasını sağla\n"
+
+#: createdb.c:269
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=VTADI alternatif bakım veritabanı\n"
+
+#: createdb.c:270
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Öntanımlı olarak , mevcut kullanıcı ile aynı adda veritabanı yaratılır.\n"
+
+#: createuser.c:191
+msgid "Enter name of role to add: "
+msgstr "Eklenecek rol adını girin: "
+
+#: createuser.c:208
+msgid "Enter password for new role: "
+msgstr "Yeni rol için parola girin: "
+
+#: createuser.c:210
+msgid "Enter it again: "
+msgstr "Yeniden girin: "
+
+#: createuser.c:213
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Parolalar uyuşmadı.\n"
+
+#: createuser.c:221
+msgid "Shall the new role be a superuser?"
+msgstr "Yeni rol superuser olsun mu?"
+
+#: createuser.c:236
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Yeni rol, veritabanı oluşturabilsin mi?"
+
+#: createuser.c:244
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Yeni rol, başka yeni roller oluşturabilsin mi?"
+
+#: createuser.c:274
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "parola şifreleme hatası: %s"
+
+#: createuser.c:329
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "yeni rol oluşturma işlemi başarısız oldu: %s"
+
+#: createuser.c:343
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s yeni bir PostgreSQL rol oluşturur.\n"
+"\n"
+
+#: createuser.c:345 dropuser.c:164
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [SEÇENEKLER]... [ROL_ADI]\n"
+
+#: createuser.c:347
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N rol için azami bağlantı sayısı (varsayılan: sınırsız)\n"
+
+#: createuser.c:348
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb rol yeni veritabanı oluşturabiliyor\n"
+
+#: createuser.c:349
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb rol veritabanı oluşturamaz (varsayılan)\n"
+
+#: createuser.c:351
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROL yeni rol bu rolün üyesi olacaktır\n"
+
+#: createuser.c:352
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit rol, üye olduğu rollerin yetkilerini \n"
+" miras alır (varsayılan)\n"
+
+#: createuser.c:354
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit rol, hiçbir yetkiyi miras almaz\n"
+
+#: createuser.c:355
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login rol giriş yapabiliyor\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login role giriş yapamaz\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt yeni role bir şifre atar\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole rol yeni rol oluşturabiliyor\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole rol başka bir rol oluşturamaz (varsayılan)\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser rol, superuser olacaktır\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser rol, superuser olmayacaktır (varsayılan)\n"
+
+#: createuser.c:363
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive varsayılanları kullanmaktansa eksik rol ve niteliklerin\n"
+" girilmesini sağla\n"
+
+#: createuser.c:365
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication rol replikasyon başlatabilir\n"
+
+#: createuser.c:366
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication rol replikasyon başlatamaz\n"
+
+#: createuser.c:371
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=KULLANICI_ADI bağlanılacak kullanıcı adı (yaratılacak değil)\n"
+
+#: dropdb.c:104
+#, c-format
+msgid "missing required argument database name"
+msgstr "gerekli argüman eksik: veritabanı adı"
+
+#: dropdb.c:119
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "\"%s\" veritabanı kalıcı olarak silinecektir.\n"
+
+#: dropdb.c:120 dropuser.c:130
+msgid "Are you sure?"
+msgstr "Emin misiniz?"
+
+#: dropdb.c:142
+#, c-format
+msgid "database removal failed: %s"
+msgstr "veritabanı silme işlemi başarısız oldu: %s"
+
+#: dropdb.c:156
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL veritabanını siler.\n"
+"\n"
+
+#: dropdb.c:158
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [SEÇENEK]... VERİTABANI_ADI\n"
+
+#: dropdb.c:161
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive herhangi birşeyi silmeden önce uyarı verir\n"
+
+#: dropdb.c:163
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists don't report error if database doesn't exist\n"
+
+#: dropuser.c:115
+msgid "Enter name of role to drop: "
+msgstr "Silinecek rolün adını giriniz: "
+
+#: dropuser.c:121
+#, c-format
+msgid "missing required argument role name"
+msgstr "gerekli bir argüman olan rol adı eksik"
+
+#: dropuser.c:129
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "\"%s\" rolü kalıcı olarak silinecektir.\n"
+
+#: dropuser.c:147
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "\"%s\" rolünün silinmesi başarısız oldu: %s"
+
+#: dropuser.c:162
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s bir PostgreSQL rolünü siler.\n"
+"\n"
+
+#: dropuser.c:167
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive herhangi birşeyi silmeden önce uyarı ver, ve\n"
+" belirtilmemişse rol adının girilmesini iste\n"
+
+#: dropuser.c:170
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists kullanıcı mevcut değilse bildirimde bulunma\n"
+
+#: dropuser.c:175
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=KULLANICI _ADI bağlanırken kullanılacak kullanıcı adı (silinecek olan değil)\n"
+
+#: pg_isready.c:144
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_isready.c:152
+#, c-format
+msgid "could not fetch default options"
+msgstr "varsayılan seçenekler getirilemedi"
+
+#: pg_isready.c:201
+#, c-format
+msgid "accepting connections\n"
+msgstr "bağlantılar kabul ediliyor\n"
+
+#: pg_isready.c:204
+#, c-format
+msgid "rejecting connections\n"
+msgstr "bağlantılar reddediliyor\n"
+
+#: pg_isready.c:207
+#, c-format
+msgid "no response\n"
+msgstr "cevap yok\n"
+
+#: pg_isready.c:210
+#, c-format
+msgid "no attempt\n"
+msgstr "deneme yok\n"
+
+#: pg_isready.c:213
+#, c-format
+msgid "unknown\n"
+msgstr "bilinmeyen\n"
+
+#: pg_isready.c:223
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s bir PostgreSQL veritabanına bağlantı kontrolü sağlar.\n"
+"\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [SEÇENEK]...\n"
+
+#: pg_isready.c:228
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=VERİTABANI_ADI veritabanı adı\n"
+
+#: pg_isready.c:229
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet sessizce çalış\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini gösterir ve sonra çıkar\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı gösterir ve sonra çıkar\n"
+
+#: pg_isready.c:234
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME veritabanı sunucusu adresi ya da soket dizini\n"
+
+#: pg_isready.c:235
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT veritabanı sunucusunun portu\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SANİYE bağlantı denenirken beklenecek saniye, 0 devre dışı bırakır (vrsayılan: %s)\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=KULLANICI_ADI bağlanılacak kullanıcı adı\n"
+
+#: reindexdb.c:168
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "aynı anda hem tüm veritabanları hem belirli bir veritabanı tekrar indekslenemez"
+
+#: reindexdb.c:173
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "aynı anda tüm veritabanları ve sistem katalogları reindex edilemez"
+
+#: reindexdb.c:178
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "tüm veritabanlarındaki belirli şema(lar) tekrar indekslenemez"
+
+#: reindexdb.c:183
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "tüm veritabanlarındaki belirli tablo(lar) tekrar indekslenemez"
+
+#: reindexdb.c:188
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "tüm veritabanlarındaki belirli ndeks(ler) tekrar indekslenemez"
+
+#: reindexdb.c:199
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "aynı anda belirli şema(lar) ve sistem katalogları tekrar indekslenemez"
+
+#: reindexdb.c:204
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "aynı anda belirli tablo(lar) ve sistem katalogları tekrar indekslenemez"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "aynı anda belirli indeks(ler) ve sistem katalogları tekrar indekslenemez"
+
+#: reindexdb.c:298
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "PostgreSQL %2$s den eski sunucu sürümlerinde \"%1$s\" seçeneği kullanılamaz"
+
+#: reindexdb.c:326
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%2$s\" veritabanındaki \"%1$s\" tablosunun tekrar indeksleme işlemi başarısız: %3$s"
+
+#: reindexdb.c:329
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%2$s\" veritabanındaki \"%1$s\" indeksinin yeniden oluşturulması başarısız: %3$s"
+
+#: reindexdb.c:332
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%2$s\" veritabanındaki \"%1$s\" şemasının tekrar indeksleme işlemi başarısız: %3$s"
+
+#: reindexdb.c:335
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "\"%s\" veritabanının yeniden indekslenmesi başarısız oldu: %s"
+
+#: reindexdb.c:369
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: \"%s\" veritabanı yeniden indeksleniyor\n"
+
+#: reindexdb.c:412
+#, c-format
+msgid "reindexing of system catalogs failed: %s"
+msgstr "sistem kataloglarının yeniden indekslemesi başarısız: %s"
+
+#: reindexdb.c:424
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL veritabanını yeniden indeksler.\n"
+"\n"
+
+#: reindexdb.c:428
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all tüm veritabanlarını yeniden indeksle\n"
+
+#: reindexdb.c:429
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently eşzamanlı olarak yeniden indeksle\n"
+
+#: reindexdb.c:430
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=VERİTABANI_ADI yeniden indekslenecek veritabanı adı\n"
+
+#: reindexdb.c:432
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX sadece belirli indeks(ler)i yeniden oluştur\n"
+
+#: reindexdb.c:434
+#, c-format
+msgid " -s, --system reindex system catalogs\n"
+msgstr " -s, --system sistem kataloglarını yeniden indeksle\n"
+
+#: reindexdb.c:435
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=ŞEMA sadece belirtilen şema veya şemaları tekrar indeksle\n"
+
+#: reindexdb.c:436
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLO_ADI sadece belirli bir tablonun veya tabloların indekslerini yeniden oluştur\n"
+
+#: reindexdb.c:447
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Ayrıntılar için bir REINDEX SQL komutunun açıklamasını okuyabilirsiniz.\n"
+
+#: vacuumdb.c:207
+#, c-format
+msgid "number of parallel jobs must be at least 1"
+msgstr "paralel iş sayısı en azından 1 olmalı"
+
+#: vacuumdb.c:212
+#, c-format
+msgid "too many parallel jobs requested (maximum: %d)"
+msgstr "çok fazla paralel iş talep edildi (azami: %d)"
+
+#: vacuumdb.c:233
+#, c-format
+msgid "minimum transaction ID age must be at least 1"
+msgstr "asgari transaction ID yaşı en az 1 olmalı"
+
+#: vacuumdb.c:241
+#, c-format
+msgid "minimum multixact ID age must be at least 1"
+msgstr "asgari multixact ID yaşı en az 1 olmalı"
+
+#: vacuumdb.c:273 vacuumdb.c:279 vacuumdb.c:285
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "sadece analyze gerçekleştirilirken \"%s\" seçeneği kullanılamaz"
+
+#: vacuumdb.c:302
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "aynı anda tüm veritabanları ve de belirli bir tanesi vakumlanamaz"
+
+#: vacuumdb.c:307
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "tüm veritabanlarındaki belirli (bir) tablo(lar) vakumlanamaz"
+
+#: vacuumdb.c:398
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Minimal optimizer istatistikleri oluşturuluyor (1 hedef)"
+
+#: vacuumdb.c:399
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Orta ölçekte optimizer istatistikleri oluşturuluyor (10 hedef)"
+
+#: vacuumdb.c:400
+msgid "Generating default (full) optimizer statistics"
+msgstr "Varsayılan (tam) optimizer istatistikleri oluşturuluyor"
+
+#: vacuumdb.c:412 vacuumdb.c:427 vacuumdb.c:434
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL 9.6"
+msgstr "PostgreSQL 9,6'dan eski sunucu sürümlerinde \"%s\" seçeneği kullanılamaz"
+
+#: vacuumdb.c:420
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL 12"
+msgstr "PostgreSQL 12'den eski sunucu sürümlerinde \"%s\" seçeneği kullanılamaz"
+
+#: vacuumdb.c:442
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: \"%s\" veritabanı üzerinde işlem yapılıyor: %s\n"
+
+#: vacuumdb.c:445
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: \"%s\" veritabanı vakumlanıyor\n"
+
+#: vacuumdb.c:939
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%2$s\" veritabanındaki \"%1$s\" tablosunun vakumlama işlemi başarısız oldu: %3$s"
+
+#: vacuumdb.c:942 vacuumdb.c:1077
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "\"%s\" veritabanının vakumlanması başarısız oldu: %s"
+
+#: vacuumdb.c:1212
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s bir PostgreSQL veritabanını temizler ve analiz eder.\n"
+"\n"
+
+#: vacuumdb.c:1216
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all tüm veritabanlarını vakumlar\n"
+
+#: vacuumdb.c:1217
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=VERİTABANI_ADI vakumlanacak veritabanı\n"
+
+#: vacuumdb.c:1218
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping bütün sayfa atlama davranışını devre dışı bırak\n"
+
+#: vacuumdb.c:1219
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo sunucuya gönderilen komutları yaz\n"
+
+#: vacuumdb.c:1220
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full tam (FULL) vakumlama yap\n"
+
+#: vacuumdb.c:1221
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze Dondurulan satır transaction bilgisi\n"
+
+#: vacuumdb.c:1222
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=SAYI vakum için bu sayı kadar eşzamanlı bağlantı kullan\n"
+
+#: vacuumdb.c:1223
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_AGE vakumlanacak tabloların asgari multixact ID yaşı\n"
+
+#: vacuumdb.c:1224
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=XID_AGE vakumlanacak tabloların asgari transaction ID yaşı\n"
+
+#: vacuumdb.c:1225
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet hiçbir mesaj yazma\n"
+
+#: vacuumdb.c:1226
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked hemen kilitlenemeyecek tabloları atla\n"
+
+#: vacuumdb.c:1227
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABLO[(KOLONLAR)]' sadece belirli bir tabloyu / tabloları vakumlar\n"
+
+#: vacuumdb.c:1228
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose bolca çıktı yaz\n"
+
+#: vacuumdb.c:1229
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#: vacuumdb.c:1230
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze optimizer istatistiklerini güncelle\n"
+
+#: vacuumdb.c:1231
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -z, --analyze-only sadece optimizer bilgilerini güncelle; vakum işlemi yok\n"
+
+#: vacuumdb.c:1232
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages sadece optimizer istatistiklerini güncelle, daha hızlı\n"
+" sonuç için birden fazla aşamada; vakum işlemi yok\n"
+
+#: vacuumdb.c:1234
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonrasında çık\n"
+
+#: vacuumdb.c:1242
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Ayrıntılar için, bir SQL komutu olan VACUUM'un tanımlarını okuyun.\n"
+
+#~ msgid "%s: invalid socket: %s"
+#~ msgstr "%s: geçersiz soket: %s"
+
+#~ msgid "Could not send cancel request: %s\n"
+#~ msgstr "İptal isteği gönderilemedi: %s\n"
+
+#~ msgid " -q, --quiet don't write any messages\n"
+#~ msgstr " -q, --quiet Hiç bir mesaj yazma\n"
+
+#~ msgid "pg_strdup: cannot duplicate null pointer (internal error)\n"
+#~ msgstr "pg_strdup: null pointer duplicate edilemiyor (iç hata)\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: yetersiz bellek\n"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s: geçerli kullanıcı adı alınamadı: %s\n"
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s: geçerli kullanıcı hakkında bilgi alınamadı: %s\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version sürüm bilgisini göster ve çık\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help bu yardımı göster ve çık\n"
+
+#~ msgid "%s: cannot use the \"freeze\" option when performing only analyze\n"
+#~ msgstr "%s: sadece analyze işlemi yapıldığında \"freeze\" seçeneğini kullanamaz\n"
+
+#~ msgid " -d, --dbname=DBNAME database from which to remove the language\n"
+#~ msgstr " -d, --dbname=VERİTABANI_ADI dilin sileneceği veritabanının adı\n"
+
+#~ msgid ""
+#~ "%s removes a procedural language from a database.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s veritabanından yordamsal bir dili siler.\n"
+#~ "\n"
+
+#~ msgid "%s: language removal failed: %s"
+#~ msgstr "%s: dil silme işlemi başarısız oldu: %s"
+
+#~ msgid "%s: still %s functions declared in language \"%s\"; language not removed\n"
+#~ msgstr "%s: %s fonksiyon, \"%s\" dilinde tanımlanmış durumda; dil kaldırılamadı\n"
+
+#~ msgid "%s: language \"%s\" is not installed in database \"%s\"\n"
+#~ msgstr "%s: \"%s\" dili \"%s\" veritabanında kurulu değil \n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If one of -d, -D, -r, -R, -s, -S, and ROLENAME is not specified, you will\n"
+#~ "be prompted interactively.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Eğer -d, -D, -r, -R, -s, -S ve ROLENAME'den birisi belirtilmezse, bunlar size\n"
+#~ "etkileşimli olarak sorulacaktır.\n"
+
+#~ msgid " -N, --unencrypted do not encrypt stored password\n"
+#~ msgstr " -N, --unencrypted saklanmış şifreyi kriptolamaz\n"
+
+#~ msgid " -E, --encrypted encrypt stored password\n"
+#~ msgstr " -E, --encrypted saklanan şifreleri encrypt eder\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version sürüm bilgisini göster ve çık\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help bu yardımı göster ve çık\n"
+
+#~ msgid " -l, --list show a list of currently installed languages\n"
+#~ msgstr " -l, --list Şu anda kurulu olan dilleri göster\n"
+
+#~ msgid " -d, --dbname=DBNAME database to install language in\n"
+#~ msgstr " -d, --dbname=VERİTABANI_ADI dilin kurulacağı veritabanının adı\n"
+
+#~ msgid " %s [OPTION]... LANGNAME [DBNAME]\n"
+#~ msgstr " %s [SEÇENEK]... DİL_ADI [VERİTABANI_ADI]\n"
+
+#~ msgid ""
+#~ "%s installs a procedural language into a PostgreSQL database.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s Bir PostgreSQL veritabanına yordamsal bir dil kurar.\n"
+#~ "\n"
+
+#~ msgid "%s: language installation failed: %s"
+#~ msgstr "%s: Dil kurulumu başarısız oldu: %s"
+
+#~ msgid "%s: language \"%s\" is already installed in database \"%s\"\n"
+#~ msgstr "%s: \"%s\" dili daha önceden veritabanına yüklenmiştir \"%s\"\n"
+
+#~ msgid "Procedural Languages"
+#~ msgstr "Yordamsal Diller"
+
+#~ msgid "Trusted?"
+#~ msgstr "Güvenilir mi?"
+
+#~ msgid "no"
+#~ msgstr "hayır"
+
+#~ msgid "yes"
+#~ msgstr "evet"
+
+#~ msgid "Name"
+#~ msgstr "Adı"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version sürüm bilgisini göster ve çık\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help bu yardımı göster ve çık\n"
+
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
+
+#~ msgid "%s: \"%s\" is not a valid encoding name\n"
+#~ msgstr "%s: \"%s\" geçerli bir dil kodlaması değil\n"
+
+#~ msgid "%s: query returned %d row instead of one: %s\n"
+#~ msgid_plural "%s: query returned %d rows instead of one: %s\n"
+#~ msgstr[0] "%s: sorgu bir yerine %d satır döndürdü: %s\n"
+#~ msgstr[1] "%s: sorgu bir yerine %d satır döndürdü: %s\n"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s: sorgu şu idi: %s\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s: sorgu başarısız oldu: %s"
diff --git a/src/bin/scripts/po/uk.po b/src/bin/scripts/po/uk.po
new file mode 100644
index 0000000..59346f8
--- /dev/null
+++ b/src/bin/scripts/po/uk.po
@@ -0,0 +1,1124 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:50+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pgscripts.pot\n"
+"X-Crowdin-File-ID: 922\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередження: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "недостатньо пам'яті\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "неможливо дублювати нульовий покажчик (внутрішня помилка)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "не можу знайти користувача з ефективним ID %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "користувача не існує"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "невдала підстановка імені користувача: код помилки %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Запит на скасування відправлений\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Не вдалося надіслати запит на скасування: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104
+msgid "Password: "
+msgstr "Пароль: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "не можливо під'єднатися до бази даних %s: не вистачає пам'яті"
+
+#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неприпустиме значення \"%s\" для параметра %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s має бути в діапазоні %d..%d"
+
+#: ../../fe_utils/parallel_slot.c:301
+#, c-format
+msgid "too many jobs for this platform"
+msgstr "занадто багато завдань для цієї платформи"
+
+#: ../../fe_utils/parallel_slot.c:519
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "обробка бази даних \"%s\" не вдалась: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu рядок)"
+msgstr[1] "(%lu рядки)"
+msgstr[2] "(%lu рядків)"
+msgstr[3] "(%lu рядка)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Перервано\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Неможливо додати заголовок до вмісту таблиці: кількість колонок %d перевищено.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Неможливо додати комірку до вмісту таблиці: перевищено загальну кількість комірок %d.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "невірний формат виводу (внутрішня помилка): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "запит не вдався: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "Запит був: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158
+#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121
+#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111
+#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" для додаткової інформації."
+
+#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному рядку (перший \"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "неможливо кластеризувати всі бази даних і одну вказану одночасно"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "неможливо кластеризувати вказані таблиці у всіх базах даних"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "кластеризувати таблицю \"%s\" у базі даних \"%s\" не вдалося: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "кластеризувати базу даних \"%s\" не вдалося: %s"
+
+#: clusterdb.c:246
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: кластеризація бази даних \"%s\"\n"
+
+#: clusterdb.c:262
+#, c-format
+msgid "%s clusters all previously clustered tables in a database.\n\n"
+msgstr "%s кластеризація усіх попередньо кластеризованих таблиць в базі даних.\n\n"
+
+#: clusterdb.c:263 createdb.c:283 createuser.c:346 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964
+#, c-format
+msgid "Usage:\n"
+msgstr "Використання:\n"
+
+#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [DBNAME]\n"
+
+#: clusterdb.c:265 createdb.c:285 createuser.c:348 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966
+#, c-format
+msgid "\n"
+"Options:\n"
+msgstr "\n"
+"Параметри:\n"
+
+#: clusterdb.c:266
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all кластеризація усіх баз даних\n"
+
+#: clusterdb.c:267
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=ІМ'Я_БД база даних для кластеризації\n"
+
+#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo показати команди, надіслані серверу\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet не виводити жодних повідомлень\n"
+
+#: clusterdb.c:270
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=ТАБЛИЦЯ кластеризувати тільки вказані таблиці\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose виводити багато інформації\n"
+
+#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію і вийти\n"
+
+#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: clusterdb.c:274 createdb.c:300 createuser.c:370 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991
+#, c-format
+msgid "\n"
+"Connection options:\n"
+msgstr "\n"
+"Налаштування з'єднання:\n"
+
+#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME хост сервера бази даних або каталог сокетів\n"
+
+#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT порт сервера бази даних\n"
+
+#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=ІМ'Я_КОРИСТУВАЧА ім'я користувача для з'єднання з сервером\n"
+
+#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ніколи не запитувати пароль\n"
+
+#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password запросити пароль\n"
+
+#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME альтернативна бази даних для обслуговування\n"
+
+#: clusterdb.c:281
+#, c-format
+msgid "\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr "\n"
+"Для деталей читайте опис команди SQL CLUSTER.\n"
+
+#: clusterdb.c:282 createdb.c:308 createuser.c:376 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"Повідомляти про помилки на <%s>.\n"
+
+#: clusterdb.c:283 createdb.c:309 createuser.c:377 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "запит повернув %d рядок замість одного: %s"
+msgstr[1] "запит повернув %d рядки замість одного: %s"
+msgstr[2] "запит повернув %d рядків замість одного: %s"
+msgstr[3] "запит повернув %d рядків замість одного: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "y"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Відповідь має бути \"%s\" або \"%s\".\n"
+
+#: createdb.c:165
+#, c-format
+msgid "only one of --locale and --lc-ctype can be specified"
+msgstr "тільки --locale або --lc-ctype може бути вказаний"
+
+#: createdb.c:167
+#, c-format
+msgid "only one of --locale and --lc-collate can be specified"
+msgstr "можна вказати лише одне: або --locale, або --lc-collate"
+
+#: createdb.c:175
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" не є невірним ім'ям кодування"
+
+#: createdb.c:245
+#, c-format
+msgid "database creation failed: %s"
+msgstr "створити базу даних не вдалося: %s"
+
+#: createdb.c:264
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "не вдалося створити коментарі (база даних була створена): %s"
+
+#: createdb.c:282
+#, c-format
+msgid "%s creates a PostgreSQL database.\n\n"
+msgstr "%s створює базу даних PostgreSQL.\n\n"
+
+#: createdb.c:284
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+
+#: createdb.c:286
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=ТАБЛИЧНИЙ_ПРОСТІР табличний простір для бази даних за замовчуванням\n"
+
+#: createdb.c:287 reindexdb.c:766
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo показати команди, надіслані серверу\n"
+
+#: createdb.c:288
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=КОДУВАННЯ кодування бази даних\n"
+
+#: createdb.c:289
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=ЛОКАЛЬ параметри локалі бази даних\n"
+
+#: createdb.c:290
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=ЛОКАЛЬ параметр LC_COLLATE для бази даних\n"
+
+#: createdb.c:291
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=ЛОКАЛЬ параметр LC_CTYPE для бази даних\n"
+
+#: createdb.c:292
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE параметр локалі ICU бази даних\n"
+
+#: createdb.c:293
+#, c-format
+msgid " --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr " --locale-provider={libc|icu}\n"
+" провайдер локалі для сортування бази даних за замовчуванням\n"
+
+#: createdb.c:295
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --власник=ВЛАСНИК користувач-власник нової бази даних\n"
+
+#: createdb.c:296
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr " -S, --strategy=STRATEGY стратегія створення бази даних для wal_log або file_copy\n"
+
+#: createdb.c:297
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --шаблон=ШАБЛОН шаблонна база даних для копіювання\n"
+
+#: createdb.c:298 reindexdb.c:775
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію, потім вийти\n"
+
+#: createdb.c:299 reindexdb.c:776
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: createdb.c:301 reindexdb.c:778
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=ІМ'Я_ХОСТА хост сервера бази даних або каталог сокетів\n"
+
+#: createdb.c:302 reindexdb.c:779
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=ПОРТ порт сервера бази даних\n"
+
+#: createdb.c:303 reindexdb.c:780
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=ІМ'Я_КОРИСТУВАЧА ім'я користувача для з'єднання з сервером\n"
+
+#: createdb.c:304 reindexdb.c:781
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ніколи не запитувати пароль\n"
+
+#: createdb.c:305 reindexdb.c:782
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password запросити пароль\n"
+
+#: createdb.c:306 reindexdb.c:783
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME альтернативна бази даних для обслуговування\n"
+
+#: createdb.c:307
+#, c-format
+msgid "\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr "\n"
+"За замовчуванням ім'ям бази даних вважається ім'я поточного користувача.\n"
+
+#: createuser.c:193
+msgid "Enter name of role to add: "
+msgstr "Введіть ім'я нової ролі: "
+
+#: createuser.c:208
+msgid "Enter password for new role: "
+msgstr "Введіть пароль для нової ролі: "
+
+#: createuser.c:209
+msgid "Enter it again: "
+msgstr "Введіть знову: "
+
+#: createuser.c:212
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Паролі не співпадають.\n"
+
+#: createuser.c:220
+msgid "Shall the new role be a superuser?"
+msgstr "Чи буде нова роль суперкористувачем?"
+
+#: createuser.c:235
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Чи дозволено новій ролі створювати бази даних?"
+
+#: createuser.c:243
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Чи дозволено новій ролі створювати інші нові ролі?"
+
+#: createuser.c:278
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "помилка шифрування пароля: %s"
+
+#: createuser.c:331
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "не вдалося створити нову роль: %s"
+
+#: createuser.c:345
+#, c-format
+msgid "%s creates a new PostgreSQL role.\n\n"
+msgstr "%s створює нову роль PostgreSQL.\n\n"
+
+#: createuser.c:347 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [OPTION]... [ROLENAME]\n"
+
+#: createuser.c:349
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N ліміт під'єднань для ролі (за замовчуванням ліміту немає)\n"
+
+#: createuser.c:350
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb роль може створювати нові бази даних\n"
+
+#: createuser.c:351
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb роль не може створювати нові бази даних (за замовчуванням)\n"
+
+#: createuser.c:353
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=РОЛЬ нова роль буде включена в цю роль\n"
+
+#: createuser.c:354
+#, c-format
+msgid " -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr " -i, --inherit роль переймає права від ролей до яких вона\n"
+" включена (за замовчуванням)\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit роль не переймає права\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login роль може увійти (за замовчуванням)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login роль не може увійти\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt призначення паролю для нової ролі\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole роль може створювати нові ролі\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole роль не може створювати нові бази даних (за замовчуванням)\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser роль буде суперкористувачем\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser роль не буде суперкористувачем (за замовчуванням)\n"
+
+#: createuser.c:365
+#, c-format
+msgid " --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr " --interactive запитати пропущені ім’я ролі та атрибути, а не використовувати стандартні\n"
+
+#: createuser.c:367
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication роль може ініціювати реплікацію\n"
+
+#: createuser.c:368
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication роль не може ініціювати реплікацію\n"
+
+#: createuser.c:373
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=USERNAME ім'я користувача для підключення (не для створення)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "немає запитаного аргументу: імені бази даних"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "База даних \"%s\" буде назавжди видалена.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Ви впевнені?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "помилка при видаленні бази даних: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid "%s removes a PostgreSQL database.\n\n"
+msgstr "%s видаляє базу даних PostgreSQL.\n\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [OPTION]... ІМ'Я_БД\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force спробувати завершити інші підключення перед видаленням\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive запитувати перед видаленням чого-небудь\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists не повідомляти про помилку, якщо бази даних не існує\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Введіть ім'я ролі для видалення: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "немає запитаного аргументу: імені ролі"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Роль \"%s\" буде назавжди видалена.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "помилка при видаленні ролі \"%s\": %s"
+
+#: dropuser.c:169
+#, c-format
+msgid "%s removes a PostgreSQL role.\n\n"
+msgstr "%s видаляє роль PostgreSQL.\n\n"
+
+#: dropuser.c:174
+#, c-format
+msgid " -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr " -i, --interactive запитувати перед видаленням чого-небудь і запитувати\n"
+" ім'я ролі, якщо не вказано\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists не повідомляти про помилку, якщо користувача не існує\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=USERNAME ім'я користувача для підключення (не для розривання)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "не вдалося отримати параметри за замовчуванням"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "отримання підключень\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "відторгнення підключень\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "відповіді немає\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "немає спроб\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "невідомо\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid "%s issues a connection check to a PostgreSQL database.\n\n"
+msgstr "%s: перевірка підключення до бази даних PostgreSQL.\n\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s: [OPTION]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=ІМ'Я_БД ім'я бази даних\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet тихий запуск\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію, потім вийти\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME хост серверу баз даних або каталог сокетів\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=ПОРТ порт сервера бази даних\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SECS секунд для очікування при спробі підключення, 0 без обмежень (за замовчуванням: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=ІМ'Я_КОРИСТУВАЧА ім'я користувача для з'єднання з сервером\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "неможливо переіндексувати всі бази даних і одну вказану одночасно"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "не можливо переіндексувати всі бази даних і системні каталоги одночасно"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "неможливо переіндексувати вказані схеми в усіх базах даних"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "неможливо переіндексувати вказані таблиці в усіх базах даних"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "неможливо переіндексувати вказані індекси в усіх базах даних"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "не можливо переіндексувати вказані схеми і системні каталоги одночасно"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "не можливо переіндексувати вказані таблиці і системні каталоги одночасно"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "не можливо переіндексувати вказані індекси і системні каталоги одночасно"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "не можна використовувати декілька завдань для переіндексування системних каталогів"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "не можна використовувати декілька завдань для переіндексування індексів"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439
+#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469
+#: vacuumdb.c:473
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "не можна використовувати параметр \"%s\" на серверній версії старішій за PostgreSQL %s"
+
+#: reindexdb.c:369
+#, c-format
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr "не можна конкурентно переіндексувати системні каталоги, пропускаємо"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "переіндексувати базу даних \"%s\" не вдалося: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "переіндексувати індекси \"%s\" в базі даних \"%s\" не вдалося: %s"
+
+#: reindexdb.c:581
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "переіндексувати схему \"%s\" в базі даних \"%s\" не вдалося: %s"
+
+#: reindexdb.c:585
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "переіндексування системних каталогів в базі даних \"%s\" не вдалося: %s"
+
+#: reindexdb.c:589
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "переіндексувати таблиці \"%s\" в базі даних \"%s\" не вдалося: %s"
+
+#: reindexdb.c:742
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: переіндексування бази даних \"%s\"\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid "%s reindexes a PostgreSQL database.\n\n"
+msgstr "%s переіндексовує базу даних PostgreSQL.\n\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all переіндексувати всі бази даних\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently переіндексувати одночасно\n"
+
+#: reindexdb.c:765
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DBNAME база даних для переіндексування\n"
+
+#: reindexdb.c:767
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX повторно створити лише вказані індекси\n"
+
+#: reindexdb.c:768
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=NUM використати цю кількість паралельних підключень для переіндексування\n"
+
+#: reindexdb.c:769
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet не писати жодних повідомлень\n"
+
+#: reindexdb.c:770
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system переіндексувати тільки системні каталоги\n"
+
+#: reindexdb.c:771
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA переіндексувати лише вказані схеми\n"
+
+#: reindexdb.c:772
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLE переіндексувати лише вказані таблиці\n"
+
+#: reindexdb.c:773
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=TABLESPACE табличний простір для перебудованих індексів\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose виводити багато повідомлень\n"
+
+#: reindexdb.c:784
+#, c-format
+msgid "\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr "\n"
+"Для деталей читайте опис команди SQL REINDEX.\n"
+
+#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279
+#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "не можна використовувати параметр \"%s\" під час виконання лише аналіза"
+
+#: vacuumdb.c:297
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "не можна використовувати параметр \"%s\" під час виконання VACUUM FULL"
+
+#: vacuumdb.c:303
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "використовувати параметр \"%s\" з параметром \"%s\" не можна"
+
+#: vacuumdb.c:322
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "неможливо очистити всі бази даних і одну вказану одночасно"
+
+#: vacuumdb.c:324
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "неможливо очистити вказані таблиці в усіх базах даних"
+
+#: vacuumdb.c:412
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Генерування мінімальної статистики для оптімизатора (1 мета)"
+
+#: vacuumdb.c:413
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Генерування середньої статистики для оптимізатора (10 цілей)"
+
+#: vacuumdb.c:414
+msgid "Generating default (full) optimizer statistics"
+msgstr "Генерування статистики для оптимізатора за замовчуванням (повністю)"
+
+#: vacuumdb.c:479
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: обробка бази даних \"%s\": %s\n"
+
+#: vacuumdb.c:482
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: очищення бази даних \"%s\"\n"
+
+#: vacuumdb.c:952
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "очистити таблиці \"%s\" в базі даних \"%s\" не вдалося: %s"
+
+#: vacuumdb.c:955
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "очистити базу даних \"%s\" не вдалося: %s"
+
+#: vacuumdb.c:963
+#, c-format
+msgid "%s cleans and analyzes a PostgreSQL database.\n\n"
+msgstr "%s очищує й аналізує базу даних PostgreSQL.\n\n"
+
+#: vacuumdb.c:967
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all очистити усі бази даних\n"
+
+#: vacuumdb.c:968
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=ІМ'Я_БД база даних для очищення\n"
+
+#: vacuumdb.c:969
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping відключити пропуск сторінок\n"
+
+#: vacuumdb.c:970
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo показати команди, надіслані серверу\n"
+
+#: vacuumdb.c:971
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full зробити повне очищення\n"
+
+#: vacuumdb.c:972
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze заморозити інформацію щодо транзакцій в рядках\n"
+
+#: vacuumdb.c:973
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr " --force-index-cleanup завжди видаляти записи індексів, які вказують на мертві кортежі\n"
+
+#: vacuumdb.c:974
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=ЧИСЛО використати ці паралельні підключення для очищення\n"
+
+#: vacuumdb.c:975
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_AGE мінімальний ID ери мультитранзакції таблиць для вакууму\n"
+
+#: vacuumdb.c:976
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_AGE мінімальний ID ери транзакції таблиць для вакууму\n"
+
+#: vacuumdb.c:977
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr " --no-index-cleanup не видаляти записи індексів, які вказують на мертві кортежі\n"
+
+#: vacuumdb.c:978
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr " --no-process-toast пропускати таблицю TOAST, пов'язану з таблицею для очищення\n"
+
+#: vacuumdb.c:979
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate не скорочувати пусті сторінки наприкінці таблиці\n"
+
+#: vacuumdb.c:980
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr " -P, --parallel=PARALLEL_WORKERS використати таку кількість фонових робітників для очищення, якщо вони доступні\n"
+
+#: vacuumdb.c:981
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet не писати жодних повідомлень\n"
+
+#: vacuumdb.c:982
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked пропустити відношення, що не можуть бути заблоковані негайно\n"
+
+#: vacuumdb.c:983
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='ТАБЛИЦЯ[(СТОВПЦІ)]' очистити тільки вказані таблиці\n"
+
+#: vacuumdb.c:984
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose виводити багато інформації\n"
+
+#: vacuumdb.c:985
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію і вийти\n"
+
+#: vacuumdb.c:986
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze оновити статистику для оптимізатора\n"
+
+#: vacuumdb.c:987
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -Z, --analyze-only оновити лише статистику для оптимізатора, не очищати\n"
+
+#: vacuumdb.c:988
+#, c-format
+msgid " --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr " --analyze-in-stages оновити лише статистику для оптимізатора, у декілька стадій для швидших результатів, не очищати\n"
+
+#: vacuumdb.c:990
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю справку, потім вийти\n"
+
+#: vacuumdb.c:998
+#, c-format
+msgid "\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr "\n"
+"Для деталей читайте опис команди SQL VACUUM.\n"
+
diff --git a/src/bin/scripts/po/zh_CN.po b/src/bin/scripts/po/zh_CN.po
new file mode 100644
index 0000000..12c7560
--- /dev/null
+++ b/src/bin/scripts/po/zh_CN.po
@@ -0,0 +1,1147 @@
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:47+0000\n"
+"PO-Revision-Date: 2021-08-15 18:30+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.7\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的: "
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "内存不足\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "无法复制空指针 (内部错误)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "无法找到有效的用户ID %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "用户不存在"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "用户名查找失败:错误代码%lu"
+
+#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206
+msgid "Cancel request sent\n"
+msgstr "取消发送的请求\n"
+
+#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210
+msgid "Could not send cancel request: "
+msgstr "无法发送取消请求: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:107
+msgid "Password: "
+msgstr "口令: "
+
+#: ../../fe_utils/connect_utils.c:92
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "无法连接到数据库 %s:内存不足"
+
+#: ../../fe_utils/connect_utils.c:120 pg_isready.c:145
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/parallel_slot.c:302
+#, c-format
+msgid "too many jobs for this platform"
+msgstr "此平台的作业太多"
+
+#: ../../fe_utils/parallel_slot.c:522
+msgid "processing of database \"%s\" failed: %s"
+msgstr "处理数据库\"%s\"失败:%s"
+
+#: ../../fe_utils/print.c:336
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu 行记录)"
+msgstr[1] "(%lu 行记录)"
+
+#: ../../fe_utils/print.c:3039
+#, c-format
+msgid "Interrupted\n"
+msgstr "已中断\n"
+
+#: ../../fe_utils/print.c:3103
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "无法对表的内容增加标题:已经超过%d列的数量.\n"
+
+#: ../../fe_utils/print.c:3143
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "无法对表的内容添加单元: 总共有%d个单元超过.\n"
+
+#: ../../fe_utils/print.c:3401
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "无效的输出格式 (内部错误): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "查询失败: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "query was: %s"
+msgstr "查询是: %s"
+
+#: clusterdb.c:112 clusterdb.c:131 createdb.c:123 createdb.c:142
+#: createuser.c:172 createuser.c:187 dropdb.c:103 dropdb.c:112 dropdb.c:120
+#: dropuser.c:94 dropuser.c:109 dropuser.c:122 pg_isready.c:96 pg_isready.c:110
+#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:251 vacuumdb.c:270
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获取更多的信息.\n"
+
+#: clusterdb.c:129 createdb.c:140 createuser.c:185 dropdb.c:118 dropuser.c:107
+#: pg_isready.c:108 reindexdb.c:191 vacuumdb.c:268
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行参数太多 (第一个是 \"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "无法对所有数据库和一个指定的数据库同时建簇"
+
+#: clusterdb.c:154
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "无法在所有数据库中对指定表进行建簇"
+
+#: clusterdb.c:220
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "在数据库 \"%2$s\" 中的表 \"%1$s\" 建簇失败: %3$s"
+
+#: clusterdb.c:223
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "数据库 \"%s\" 建簇失败: %s"
+
+#: clusterdb.c:251
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: 对数据库 \"%s\" 进行建簇\n"
+
+#: clusterdb.c:267
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s 对一个数据库中先前已经建过簇的表进行建簇.\n"
+"\n"
+
+#: clusterdb.c:268 createdb.c:267 createuser.c:351 dropdb.c:171 dropuser.c:169
+#: pg_isready.c:225 reindexdb.c:792 vacuumdb.c:1025
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: clusterdb.c:269 reindexdb.c:793 vacuumdb.c:1026
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [选项]... [数据库名字]\n"
+
+#: clusterdb.c:270 createdb.c:269 createuser.c:353 dropdb.c:173 dropuser.c:171
+#: pg_isready.c:228 reindexdb.c:794 vacuumdb.c:1027
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"选项:\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all 对所有数据库建簇\n"
+
+#: clusterdb.c:272
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=DBNAME 对数据库 DBNAME 建簇\n"
+
+#: clusterdb.c:273 createuser.c:357 dropdb.c:174 dropuser.c:172
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo 显示发送到服务端的命令\n"
+
+#: clusterdb.c:274
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet 不写任何信息\n"
+
+#: clusterdb.c:275
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABLE 只对指定的表建簇\n"
+
+#: clusterdb.c:276
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 写大量的输出\n"
+
+#: clusterdb.c:277 createuser.c:369 dropdb.c:177 dropuser.c:175
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信息, 然后退出\n"
+
+#: clusterdb.c:278 createuser.c:374 dropdb.c:179 dropuser.c:177
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然后退出\n"
+
+#: clusterdb.c:279 createdb.c:280 createuser.c:375 dropdb.c:180 dropuser.c:178
+#: pg_isready.c:234 reindexdb.c:809 vacuumdb.c:1052
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"联接选项:\n"
+
+#: clusterdb.c:280 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1053
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAM 数据库服务器所在机器的主机名或套接字目录\n"
+
+#: clusterdb.c:281 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1054
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT 数据库服务器端口号\n"
+
+#: clusterdb.c:282 dropdb.c:183 vacuumdb.c:1055
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME 联接的用户名\n"
+
+#: clusterdb.c:283 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1056
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 永远不提示输入口令\n"
+
+#: clusterdb.c:284 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1057
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password 强制提示输入口令\n"
+
+#: clusterdb.c:285 dropdb.c:186 vacuumdb.c:1058
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 更改维护数据库\n"
+
+#: clusterdb.c:286
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"阅读 SQL 命令 CLUSTER 的描述信息, 以便获得更详细的信息.\n"
+
+#: clusterdb.c:287 createdb.c:288 createuser.c:381 dropdb.c:187 dropuser.c:184
+#: pg_isready.c:239 reindexdb.c:817 vacuumdb.c:1060
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: clusterdb.c:288 createdb.c:289 createuser.c:382 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:818 vacuumdb.c:1061
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "查询返回了%d条记录,而不是一条记录: %s"
+msgstr[1] "查询返回了%d条记录,而不是一条记录: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "y"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "请回答\"%s\"或\"%s\".\n"
+
+#: createdb.c:150
+#, c-format
+msgid "only one of --locale and --lc-ctype can be specified"
+msgstr "只能指定--locale和--lc-ctype这两个选项之一"
+
+#: createdb.c:155
+#, c-format
+msgid "only one of --locale and --lc-collate can be specified"
+msgstr "只能指定--locale和--lc-collate这两个选项之一"
+
+#: createdb.c:166
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" 是一个无效编码名"
+
+#: createdb.c:229
+#, c-format
+msgid "database creation failed: %s"
+msgstr "创建数据库失败: %s"
+
+#: createdb.c:248
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "创建注释失败 (数据库已创建): %s"
+
+#: createdb.c:266
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s 创建一个 PostgreSQL 数据库.\n"
+"\n"
+
+#: createdb.c:268
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [选项]... [数据库名称] [描述]\n"
+
+#: createdb.c:270
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE 数据库默认表空间\n"
+
+#: createdb.c:271 reindexdb.c:798
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo 显示发送到服务端的命令\n"
+
+#: createdb.c:272
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=ENCODING 数据库编码\n"
+
+#: createdb.c:273
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE 数据库的本地化设置\n"
+
+#: createdb.c:274
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE 数据库的LC_COLLATE设置\n"
+
+#: createdb.c:275
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE 数据库的LC_CTYPE设置\n"
+
+#: createdb.c:276
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=OWNER 新数据库的所属用户\n"
+
+#: createdb.c:277
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=TEMPLATE 要拷贝的数据库模板\n"
+
+#: createdb.c:278 reindexdb.c:807
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信息, 然后退出\n"
+
+#: createdb.c:279 reindexdb.c:808
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然后退出\n"
+
+#: createdb.c:281 reindexdb.c:810
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME 数据库服务器所在机器的主机名或套接字目录\n"
+
+#: createdb.c:282 reindexdb.c:811
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT 数据库服务器端口号\n"
+
+#: createdb.c:283 reindexdb.c:812
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME 联接的用户名\n"
+
+#: createdb.c:284 reindexdb.c:813
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 永远不提示输入口令\n"
+
+#: createdb.c:285 reindexdb.c:814
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password 强制提示输入口令\n"
+
+#: createdb.c:286 reindexdb.c:815
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 更改维护数据库\n"
+
+#: createdb.c:287
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"默认情况下, 以当前用户的用户名创建数据库.\n"
+
+#: createuser.c:151
+msgid "invalid value for --connection-limit: %s"
+msgstr "--connection-limit的值无效: %s"
+
+#: createuser.c:195
+msgid "Enter name of role to add: "
+msgstr "输入要增加的角色名称: "
+
+#: createuser.c:210
+msgid "Enter password for new role: "
+msgstr "为新角色输入的口令: "
+
+#: createuser.c:211
+msgid "Enter it again: "
+msgstr "再输入一遍: "
+
+#: createuser.c:214
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "口令不匹配.\n"
+
+#: createuser.c:222
+msgid "Shall the new role be a superuser?"
+msgstr "新的角色是否是超级用户?"
+
+#: createuser.c:237
+msgid "Shall the new role be allowed to create databases?"
+msgstr "新的角色允许创建数据库吗?"
+
+#: createuser.c:245
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "新角色允许创建其它新的角色吗? "
+
+#: createuser.c:281
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "密码加密失败: %s"
+
+#: createuser.c:336
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "创建新用户失败: %s"
+
+#: createuser.c:350
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s 创建一个新的 PostgreSQL 用户.\n"
+"\n"
+
+#: createuser.c:352 dropuser.c:170
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [选项]... [用户名]\n"
+
+#: createuser.c:354
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N 角色的连接限制(缺省: 没有限制)\n"
+
+#: createuser.c:355
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb 此角色可以创建新数据库\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb 此角色不可以创建新数据库(默认)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROLE 新的角色必须是这个角色的成员\n"
+
+#: createuser.c:359
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit 角色能够继承它所属角色的权限\n"
+" (这是缺省情况)\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit 角色不继承权限\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login 角色能够登录(这是缺省情况)\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login 角色不能登录\n"
+
+#: createuser.c:364
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt 给新角色指定口令\n"
+
+#: createuser.c:365
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole 这个角色可以创建新的角色\n"
+
+#: createuser.c:366
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole 这个角色没有创建其它角色的权限(默认)\n"
+
+#: createuser.c:367
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser 角色将是超级用户\n"
+
+#: createuser.c:368
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser 角色不能是超级用户(默认)\n"
+
+#: createuser.c:370
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive 提示缺少角色名及其属性\n"
+" 而不是使用默认值\n"
+
+#: createuser.c:372
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication 角色能启动复制\n"
+
+#: createuser.c:373
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication 角色不能启动复制\n"
+
+#: createuser.c:378
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=USERNAME 联接用户 (不是要创建的用户名)\n"
+
+#: dropdb.c:111
+#, c-format
+msgid "missing required argument database name"
+msgstr "缺少需要的数据库名参数"
+
+#: dropdb.c:126
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "数据库 \"%s\" 将被永久的删除.\n"
+
+#: dropdb.c:127 dropuser.c:130
+msgid "Are you sure?"
+msgstr "您确定吗? (y/n) "
+
+#: dropdb.c:156
+#, c-format
+msgid "database removal failed: %s"
+msgstr "数据库删除失败: %s"
+
+#: dropdb.c:170
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s 删除一个 PostgreSQL 数据库.\n"
+"\n"
+
+#: dropdb.c:172
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [选项]... 数据库名\n"
+
+#: dropdb.c:175
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force 强尝试在删除之前终止其他连接\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive 删除任何东西之前给予提示\n"
+
+#: dropdb.c:178
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists 如果数据库不存在则不报告错误\n"
+
+#: dropuser.c:117
+msgid "Enter name of role to drop: "
+msgstr "输入要删除的用户名: "
+
+#: dropuser.c:121
+#, c-format
+msgid "missing required argument role name"
+msgstr "缺少需要的参数角色名"
+
+#: dropuser.c:129
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "用户 \"%s\" 将被永久删除.\n"
+
+#: dropuser.c:153
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "删除用户 \"%s\" 失败: %s"
+
+#: dropuser.c:168
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s 删除一个 PostgreSQL 用户.\n"
+"\n"
+
+#: dropuser.c:173
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive 删除任何东西之前给予提示, 如果没有指定\n"
+" 角色名也给予提示\n"
+
+#: dropuser.c:176
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists 用户名不存在时则不报告错误\n"
+
+#: dropuser.c:181
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=USERNAME 联接用户 (不是要删除的用户名)\n"
+
+#: pg_isready.c:153
+#, c-format
+msgid "could not fetch default options"
+msgstr "无法取得缺省选项"
+
+#: pg_isready.c:202
+#, c-format
+msgid "accepting connections\n"
+msgstr "接受连接\n"
+
+#: pg_isready.c:205
+#, c-format
+msgid "rejecting connections\n"
+msgstr "拒绝连接\n"
+
+#: pg_isready.c:208
+#, c-format
+msgid "no response\n"
+msgstr "没有响应\n"
+
+#: pg_isready.c:211
+#, c-format
+msgid "no attempt\n"
+msgstr "没有尝试\n"
+
+#: pg_isready.c:214
+#, c-format
+msgid "unknown\n"
+msgstr "未知\n"
+
+#: pg_isready.c:224
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s 发起一个到指定 PostgreSQL数据库的连接检查.\n"
+"\n"
+
+#: pg_isready.c:226
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [选项]...\n"
+
+#: pg_isready.c:229
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DBNAME 数据库名\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet 静默运行\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信息, 然后退出\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然后退出\n"
+
+#: pg_isready.c:235
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=主机名 数据库服务器的主机名或套接字目录\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT 数据库服务器端口\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SECS 尝试连接时要等待的秒数, 值为0表示禁用(缺省值: %s)\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME 连接的用户名\n"
+
+#: reindexdb.c:157 vacuumdb.c:198
+#, c-format
+msgid "number of parallel jobs must be at least 1"
+msgstr "并行工作的数量必须至少为1"
+
+#: reindexdb.c:210
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "无法对所有数据库和一个指定的索引同时进行索引重建操作"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "无法对所有数据库和系统目录同时进行索引重建操作"
+
+#: reindexdb.c:220
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "无法在所有数据库中对指定模式上的索引进行重建"
+
+#: reindexdb.c:225
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "无法在所有数据库中对指定表上的索引进行重建"
+
+#: reindexdb.c:230
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "无法在所有数据库中对指定的索引进行重建"
+
+#: reindexdb.c:243
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "无法对指定的模式和系统目录同时进行索引重建"
+
+#: reindexdb.c:248
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "无法对指定的表和系统视图同时进行索引重建操作"
+
+#: reindexdb.c:253
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "无法对指定索引和系统视图同时进行索引重建操作"
+
+#: reindexdb.c:259
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "无法使用多个作业重新索引系统目录"
+
+#: reindexdb.c:288
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "无法使用多个作业重新索引索引"
+
+#: reindexdb.c:353 reindexdb.c:361 vacuumdb.c:471 vacuumdb.c:479 vacuumdb.c:487
+#: vacuumdb.c:495 vacuumdb.c:503 vacuumdb.c:511 vacuumdb.c:518 vacuumdb.c:525
+#: vacuumdb.c:532
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "不能在PostgreSQL %2$s之前的服务器版本上使用 \"%1$s\" 选项"
+
+#: reindexdb.c:401
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr "无法同时重新索引系统目录,跳过所有"
+
+#: reindexdb.c:605
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "在数据库\"%s\"上重新创建索引失败: %s"
+
+#: reindexdb.c:609
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "在数据库\"%2$s\"中对索引\"%1$s\"重新创建失败: %3$s"
+
+#: reindexdb.c:613
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "在数据库\"%2$s\"中对模式\"%1$s\"的索引重建失败:%3$s"
+
+#: reindexdb.c:617
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "在数据库\"%s\"中重新索引系统目录失败: %s"
+
+#: reindexdb.c:621
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "在数据库\"%2$s\"中对表\"%1$s\"上的索引重新创建失败: %3$s"
+
+#: reindexdb.c:774
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: 对数据库 \"%s\" 重新创建索引\n"
+
+#: reindexdb.c:791
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s 对一个PostgreSQL 数据库重新创建索引.\n"
+"\n"
+
+#: reindexdb.c:795
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all 对所有数据库进行重建索引操作\n"
+
+#: reindexdb.c:796
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently 同时重新索引\n"
+
+#: reindexdb.c:797
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DBNAME 对数据库中的索引进行重建\n"
+
+#: reindexdb.c:799
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX 仅重新创建指定的索引\n"
+
+#: reindexdb.c:800
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=NUM 使用这么多并发连接来重新创建索引\n"
+
+#: reindexdb.c:801
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet 不写任何信息\n"
+
+#: reindexdb.c:802
+msgid " -s, --system reindex system catalogs\n"
+msgstr " -s, --system 对系统视图重新创建索引\n"
+
+#: reindexdb.c:803
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA 只对指定模式重建索引\n"
+
+#: reindexdb.c:804
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLE 只对指定的表重新创建索引\n"
+
+#: reindexdb.c:805
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=TABLESPACE 重建索引的表空间\n"
+
+#: reindexdb.c:806
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 写大量的输出\n"
+
+#: reindexdb.c:816
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"阅读SQL命令REINDEX的描述信息, 以便获得更详细的信息.\n"
+
+#: vacuumdb.c:206
+msgid "parallel workers for vacuum must be greater than or equal to zero"
+msgstr "真空平行工作必须大于或等于零"
+
+#: vacuumdb.c:226
+#, c-format
+msgid "minimum transaction ID age must be at least 1"
+msgstr "最小事务ID必须至少为1"
+
+#: vacuumdb.c:234
+#, c-format
+msgid "minimum multixact ID age must be at least 1"
+msgstr "最小多事务ID必须至少为1"
+
+#: vacuumdb.c:278 vacuumdb.c:284 vacuumdb.c:290 vacuumdb.c:296 vacuumdb.c:302
+#: vacuumdb.c:308 vacuumdb.c:314 vacuumdb.c:326
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "在只执行分析的时候,无法使用\"%s\"选项"
+
+#: vacuumdb.c:332
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "执行完全真空时,无法使用\"%s\"选项"
+
+#: vacuumdb.c:341
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "无法将\"%s\"选项与\"%s\"选项一起使用"
+
+#: vacuumdb.c:363
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "无法对所有数据库和一个指定的数据库同时清理"
+
+#: vacuumdb.c:368
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "无法在所有数据库中对指定的表进行清理"
+
+#: vacuumdb.c:458
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "产生最小优化器统计(一个目标)"
+
+#: vacuumdb.c:459
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "产生中等优化器统计(10个目标)"
+
+#: vacuumdb.c:460
+msgid "Generating default (full) optimizer statistics"
+msgstr "产生缺省(完全)优化器统计"
+
+#: vacuumdb.c:540
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s:处理数据库\"%s\":%s\n"
+
+#: vacuumdb.c:543
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: 清理数据库 \"%s\"\n"
+
+#: vacuumdb.c:1013
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "在数据库 \"%2$s\" 中的表 \"%1$s\" 清理失败: %3$s"
+
+#: vacuumdb.c:1016
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "数据库 \"%s\" 清理失败: %s"
+
+#: vacuumdb.c:1024
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s 清理并且优化一个 PostgreSQL 数据库.\n"
+"\n"
+
+#: vacuumdb.c:1028
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all 清理所有的数据库\n"
+
+#: vacuumdb.c:1029
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=DBNAME 清理数据库 DBNAME\n"
+
+#: vacuumdb.c:1030
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping 禁用所有页面跳过行为\n"
+
+#: vacuumdb.c:1031
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo 显示发送到服务端的命令\n"
+
+#: vacuumdb.c:1032
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full 完全清理\n"
+
+#: vacuumdb.c:1033
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze 冻结记录的事务信息\n"
+
+#: vacuumdb.c:1034
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr " --force-index-cleanup 始终删除指向死元组的索引项\n"
+
+#: vacuumdb.c:1035
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=NUM 使用这么多个并发连接进行清理\n"
+
+#: vacuumdb.c:1036
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_AGE 清理表的最小多事务ID\n"
+
+#: vacuumdb.c:1037
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=XID_AGE 清理表的最小事务ID\n"
+
+#: vacuumdb.c:1038
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr " --no-index-cleanup 不要删除指向死元组的索引项\n"
+
+#: vacuumdb.c:1039
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr " --no-process-toast 跳过与该表关联的TOAST表以使用真空\n"
+
+#: vacuumdb.c:1040
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate 不要截断表末尾的空白页\n"
+
+#: vacuumdb.c:1041
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr " -P, --parallel=PARALLEL_WORKERS 如果可以的话,用这么多的后台工作来制作真空\n"
+
+#: vacuumdb.c:1042
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet 不写任何信息\n"
+
+#: vacuumdb.c:1043
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked 跳过不能立即锁定的关系\n"
+
+#: vacuumdb.c:1044
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABLE[(COLUMNS)]' 只清理指定的表\n"
+
+#: vacuumdb.c:1045
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 写大量的输出\n"
+
+#: vacuumdb.c:1046
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信息, 然后退出\n"
+
+#: vacuumdb.c:1047
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze 更新优化器统计\n"
+
+#: vacuumdb.c:1048
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -Z, --analyze-only 只更新优化器统计信息,但不做清理\n"
+
+#: vacuumdb.c:1049
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages 只更新优化器统计, 为了更快得到结果分多阶段;\n"
+" 不做清理\n"
+
+#: vacuumdb.c:1051
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助信息, 然后退出\n"
+
+#: vacuumdb.c:1059
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"阅读 SQL 命令 VACUUM 的描述信息, 以便获得更详细的信息.\n"
+
diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c
new file mode 100644
index 0000000..fc2ad9d
--- /dev/null
+++ b/src/bin/scripts/reindexdb.c
@@ -0,0 +1,789 @@
+/*-------------------------------------------------------------------------
+ *
+ * reindexdb
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ *
+ * src/bin/scripts/reindexdb.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <limits.h>
+
+#include "catalog/pg_class_d.h"
+#include "common.h"
+#include "common/connect.h"
+#include "common/logging.h"
+#include "fe_utils/cancel.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/parallel_slot.h"
+#include "fe_utils/query_utils.h"
+#include "fe_utils/simple_list.h"
+#include "fe_utils/string_utils.h"
+
+typedef enum ReindexType
+{
+ REINDEX_DATABASE,
+ REINDEX_INDEX,
+ REINDEX_SCHEMA,
+ REINDEX_SYSTEM,
+ REINDEX_TABLE
+} ReindexType;
+
+
+static SimpleStringList *get_parallel_object_list(PGconn *conn,
+ ReindexType type,
+ SimpleStringList *user_list,
+ bool echo);
+static void reindex_one_database(ConnParams *cparams, ReindexType type,
+ SimpleStringList *user_list,
+ const char *progname,
+ bool echo, bool verbose, bool concurrently,
+ int concurrentCons, const char *tablespace);
+static void reindex_all_databases(ConnParams *cparams,
+ const char *progname, bool echo,
+ bool quiet, bool verbose, bool concurrently,
+ int concurrentCons, const char *tablespace);
+static void run_reindex_command(PGconn *conn, ReindexType type,
+ const char *name, bool echo, bool verbose,
+ bool concurrently, bool async,
+ const char *tablespace);
+
+static void help(const char *progname);
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"echo", no_argument, NULL, 'e'},
+ {"quiet", no_argument, NULL, 'q'},
+ {"schema", required_argument, NULL, 'S'},
+ {"dbname", required_argument, NULL, 'd'},
+ {"all", no_argument, NULL, 'a'},
+ {"system", no_argument, NULL, 's'},
+ {"table", required_argument, NULL, 't'},
+ {"index", required_argument, NULL, 'i'},
+ {"jobs", required_argument, NULL, 'j'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"concurrently", no_argument, NULL, 1},
+ {"maintenance-db", required_argument, NULL, 2},
+ {"tablespace", required_argument, NULL, 3},
+ {NULL, 0, NULL, 0}
+ };
+
+ const char *progname;
+ int optindex;
+ int c;
+
+ const char *dbname = NULL;
+ const char *maintenance_db = NULL;
+ const char *host = NULL;
+ const char *port = NULL;
+ const char *username = NULL;
+ const char *tablespace = NULL;
+ enum trivalue prompt_password = TRI_DEFAULT;
+ ConnParams cparams;
+ bool syscatalog = false;
+ bool alldb = false;
+ bool echo = false;
+ bool quiet = false;
+ bool verbose = false;
+ bool concurrently = false;
+ SimpleStringList indexes = {NULL, NULL};
+ SimpleStringList tables = {NULL, NULL};
+ SimpleStringList schemas = {NULL, NULL};
+ int concurrentCons = 1;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
+
+ handle_help_version_opts(argc, argv, "reindexdb", help);
+
+ /* process command-line options */
+ while ((c = getopt_long(argc, argv, "h:p:U:wWeqS:d:ast:i:j:v", long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'h':
+ host = pg_strdup(optarg);
+ break;
+ case 'p':
+ port = pg_strdup(optarg);
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'w':
+ prompt_password = TRI_NO;
+ break;
+ case 'W':
+ prompt_password = TRI_YES;
+ break;
+ case 'e':
+ echo = true;
+ break;
+ case 'q':
+ quiet = true;
+ break;
+ case 'S':
+ simple_string_list_append(&schemas, optarg);
+ break;
+ case 'd':
+ dbname = pg_strdup(optarg);
+ break;
+ case 'a':
+ alldb = true;
+ break;
+ case 's':
+ syscatalog = true;
+ break;
+ case 't':
+ simple_string_list_append(&tables, optarg);
+ break;
+ case 'i':
+ simple_string_list_append(&indexes, optarg);
+ break;
+ case 'j':
+ if (!option_parse_int(optarg, "-j/--jobs", 1, INT_MAX,
+ &concurrentCons))
+ exit(1);
+ break;
+ case 'v':
+ verbose = true;
+ break;
+ case 1:
+ concurrently = true;
+ break;
+ case 2:
+ maintenance_db = pg_strdup(optarg);
+ break;
+ case 3:
+ tablespace = pg_strdup(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /*
+ * Non-option argument specifies database name as long as it wasn't
+ * already specified with -d / --dbname
+ */
+ if (optind < argc && dbname == NULL)
+ {
+ dbname = argv[optind];
+ optind++;
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* fill cparams except for dbname, which is set below */
+ cparams.pghost = host;
+ cparams.pgport = port;
+ cparams.pguser = username;
+ cparams.prompt_password = prompt_password;
+ cparams.override_dbname = NULL;
+
+ setup_cancel_handler(NULL);
+
+ if (alldb)
+ {
+ if (dbname)
+ pg_fatal("cannot reindex all databases and a specific one at the same time");
+ if (syscatalog)
+ pg_fatal("cannot reindex all databases and system catalogs at the same time");
+ if (schemas.head != NULL)
+ pg_fatal("cannot reindex specific schema(s) in all databases");
+ if (tables.head != NULL)
+ pg_fatal("cannot reindex specific table(s) in all databases");
+ if (indexes.head != NULL)
+ pg_fatal("cannot reindex specific index(es) in all databases");
+
+ cparams.dbname = maintenance_db;
+
+ reindex_all_databases(&cparams, progname, echo, quiet, verbose,
+ concurrently, concurrentCons, tablespace);
+ }
+ else if (syscatalog)
+ {
+ if (schemas.head != NULL)
+ pg_fatal("cannot reindex specific schema(s) and system catalogs at the same time");
+ if (tables.head != NULL)
+ pg_fatal("cannot reindex specific table(s) and system catalogs at the same time");
+ if (indexes.head != NULL)
+ pg_fatal("cannot reindex specific index(es) and system catalogs at the same time");
+
+ if (concurrentCons > 1)
+ pg_fatal("cannot use multiple jobs to reindex system catalogs");
+
+ if (dbname == NULL)
+ {
+ if (getenv("PGDATABASE"))
+ dbname = getenv("PGDATABASE");
+ else if (getenv("PGUSER"))
+ dbname = getenv("PGUSER");
+ else
+ dbname = get_user_name_or_exit(progname);
+ }
+
+ cparams.dbname = dbname;
+
+ reindex_one_database(&cparams, REINDEX_SYSTEM, NULL,
+ progname, echo, verbose,
+ concurrently, 1, tablespace);
+ }
+ else
+ {
+ /*
+ * Index-level REINDEX is not supported with multiple jobs as we
+ * cannot control the concurrent processing of multiple indexes
+ * depending on the same relation.
+ */
+ if (concurrentCons > 1 && indexes.head != NULL)
+ pg_fatal("cannot use multiple jobs to reindex indexes");
+
+ if (dbname == NULL)
+ {
+ if (getenv("PGDATABASE"))
+ dbname = getenv("PGDATABASE");
+ else if (getenv("PGUSER"))
+ dbname = getenv("PGUSER");
+ else
+ dbname = get_user_name_or_exit(progname);
+ }
+
+ cparams.dbname = dbname;
+
+ if (schemas.head != NULL)
+ reindex_one_database(&cparams, REINDEX_SCHEMA, &schemas,
+ progname, echo, verbose,
+ concurrently, concurrentCons, tablespace);
+
+ if (indexes.head != NULL)
+ reindex_one_database(&cparams, REINDEX_INDEX, &indexes,
+ progname, echo, verbose,
+ concurrently, 1, tablespace);
+
+ if (tables.head != NULL)
+ reindex_one_database(&cparams, REINDEX_TABLE, &tables,
+ progname, echo, verbose,
+ concurrently, concurrentCons, tablespace);
+
+ /*
+ * reindex database only if neither index nor table nor schema is
+ * specified
+ */
+ if (indexes.head == NULL && tables.head == NULL && schemas.head == NULL)
+ reindex_one_database(&cparams, REINDEX_DATABASE, NULL,
+ progname, echo, verbose,
+ concurrently, concurrentCons, tablespace);
+ }
+
+ exit(0);
+}
+
+static void
+reindex_one_database(ConnParams *cparams, ReindexType type,
+ SimpleStringList *user_list,
+ const char *progname, bool echo,
+ bool verbose, bool concurrently, int concurrentCons,
+ const char *tablespace)
+{
+ PGconn *conn;
+ SimpleStringListCell *cell;
+ bool parallel = concurrentCons > 1;
+ SimpleStringList *process_list = user_list;
+ ReindexType process_type = type;
+ ParallelSlotArray *sa;
+ bool failed = false;
+ int items_count = 0;
+
+ conn = connectDatabase(cparams, progname, echo, false, false);
+
+ if (concurrently && PQserverVersion(conn) < 120000)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "concurrently", "12");
+ }
+
+ if (tablespace && PQserverVersion(conn) < 140000)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "tablespace", "14");
+ }
+
+ if (!parallel)
+ {
+ switch (process_type)
+ {
+ case REINDEX_DATABASE:
+ case REINDEX_SYSTEM:
+
+ /*
+ * Database and system reindexes only need to work on the
+ * database itself, so build a list with a single entry.
+ */
+ Assert(user_list == NULL);
+ process_list = pg_malloc0(sizeof(SimpleStringList));
+ simple_string_list_append(process_list, PQdb(conn));
+ break;
+
+ case REINDEX_INDEX:
+ case REINDEX_SCHEMA:
+ case REINDEX_TABLE:
+ Assert(user_list != NULL);
+ break;
+ }
+ }
+ else
+ {
+ switch (process_type)
+ {
+ case REINDEX_DATABASE:
+
+ /*
+ * Database-wide parallel reindex requires special processing.
+ * If multiple jobs were asked, we have to reindex system
+ * catalogs first as they cannot be processed in parallel.
+ */
+ if (concurrently)
+ pg_log_warning("cannot reindex system catalogs concurrently, skipping all");
+ else
+ run_reindex_command(conn, REINDEX_SYSTEM, PQdb(conn), echo,
+ verbose, concurrently, false,
+ tablespace);
+
+ /* Build a list of relations from the database */
+ process_list = get_parallel_object_list(conn, process_type,
+ user_list, echo);
+ process_type = REINDEX_TABLE;
+
+ /* Bail out if nothing to process */
+ if (process_list == NULL)
+ return;
+ break;
+
+ case REINDEX_SCHEMA:
+ Assert(user_list != NULL);
+
+ /* Build a list of relations from all the schemas */
+ process_list = get_parallel_object_list(conn, process_type,
+ user_list, echo);
+ process_type = REINDEX_TABLE;
+
+ /* Bail out if nothing to process */
+ if (process_list == NULL)
+ return;
+ break;
+
+ case REINDEX_SYSTEM:
+ case REINDEX_INDEX:
+ /* not supported */
+ Assert(false);
+ break;
+
+ case REINDEX_TABLE:
+
+ /*
+ * Fall through. The list of items for tables is already
+ * created.
+ */
+ break;
+ }
+ }
+
+ /*
+ * Adjust the number of concurrent connections depending on the items in
+ * the list. We choose the minimum between the number of concurrent
+ * connections and the number of items in the list.
+ */
+ for (cell = process_list->head; cell; cell = cell->next)
+ {
+ items_count++;
+
+ /* no need to continue if there are more elements than jobs */
+ if (items_count >= concurrentCons)
+ break;
+ }
+ concurrentCons = Min(concurrentCons, items_count);
+ Assert(concurrentCons > 0);
+
+ Assert(process_list != NULL);
+
+ sa = ParallelSlotsSetup(concurrentCons, cparams, progname, echo, NULL);
+ ParallelSlotsAdoptConn(sa, conn);
+
+ cell = process_list->head;
+ do
+ {
+ const char *objname = cell->val;
+ ParallelSlot *free_slot = NULL;
+
+ if (CancelRequested)
+ {
+ failed = true;
+ goto finish;
+ }
+
+ free_slot = ParallelSlotsGetIdle(sa, NULL);
+ if (!free_slot)
+ {
+ failed = true;
+ goto finish;
+ }
+
+ ParallelSlotSetHandler(free_slot, TableCommandResultHandler, NULL);
+ run_reindex_command(free_slot->connection, process_type, objname,
+ echo, verbose, concurrently, true, tablespace);
+
+ cell = cell->next;
+ } while (cell != NULL);
+
+ if (!ParallelSlotsWaitCompletion(sa))
+ failed = true;
+
+finish:
+ if (process_list != user_list)
+ {
+ simple_string_list_destroy(process_list);
+ pg_free(process_list);
+ }
+
+ ParallelSlotsTerminate(sa);
+ pfree(sa);
+
+ if (failed)
+ exit(1);
+}
+
+static void
+run_reindex_command(PGconn *conn, ReindexType type, const char *name,
+ bool echo, bool verbose, bool concurrently, bool async,
+ const char *tablespace)
+{
+ const char *paren = "(";
+ const char *comma = ", ";
+ const char *sep = paren;
+ PQExpBufferData sql;
+ bool status;
+
+ Assert(name);
+
+ /* build the REINDEX query */
+ initPQExpBuffer(&sql);
+
+ appendPQExpBufferStr(&sql, "REINDEX ");
+
+ if (verbose)
+ {
+ appendPQExpBuffer(&sql, "%sVERBOSE", sep);
+ sep = comma;
+ }
+
+ if (tablespace)
+ {
+ appendPQExpBuffer(&sql, "%sTABLESPACE %s", sep, fmtId(tablespace));
+ sep = comma;
+ }
+
+ if (sep != paren)
+ appendPQExpBufferStr(&sql, ") ");
+
+ /* object type */
+ switch (type)
+ {
+ case REINDEX_DATABASE:
+ appendPQExpBufferStr(&sql, "DATABASE ");
+ break;
+ case REINDEX_INDEX:
+ appendPQExpBufferStr(&sql, "INDEX ");
+ break;
+ case REINDEX_SCHEMA:
+ appendPQExpBufferStr(&sql, "SCHEMA ");
+ break;
+ case REINDEX_SYSTEM:
+ appendPQExpBufferStr(&sql, "SYSTEM ");
+ break;
+ case REINDEX_TABLE:
+ appendPQExpBufferStr(&sql, "TABLE ");
+ break;
+ }
+
+ /*
+ * Parenthesized grammar is only supported for CONCURRENTLY since
+ * PostgreSQL 14. Since 12, CONCURRENTLY can be specified after the
+ * object type.
+ */
+ if (concurrently)
+ appendPQExpBufferStr(&sql, "CONCURRENTLY ");
+
+ /* object name */
+ switch (type)
+ {
+ case REINDEX_DATABASE:
+ case REINDEX_SYSTEM:
+ appendPQExpBufferStr(&sql, fmtId(name));
+ break;
+ case REINDEX_INDEX:
+ case REINDEX_TABLE:
+ appendQualifiedRelation(&sql, name, conn, echo);
+ break;
+ case REINDEX_SCHEMA:
+ appendPQExpBufferStr(&sql, name);
+ break;
+ }
+
+ /* finish the query */
+ appendPQExpBufferChar(&sql, ';');
+
+ if (async)
+ {
+ if (echo)
+ printf("%s\n", sql.data);
+
+ status = PQsendQuery(conn, sql.data) == 1;
+ }
+ else
+ status = executeMaintenanceCommand(conn, sql.data, echo);
+
+ if (!status)
+ {
+ switch (type)
+ {
+ case REINDEX_DATABASE:
+ pg_log_error("reindexing of database \"%s\" failed: %s",
+ PQdb(conn), PQerrorMessage(conn));
+ break;
+ case REINDEX_INDEX:
+ pg_log_error("reindexing of index \"%s\" in database \"%s\" failed: %s",
+ name, PQdb(conn), PQerrorMessage(conn));
+ break;
+ case REINDEX_SCHEMA:
+ pg_log_error("reindexing of schema \"%s\" in database \"%s\" failed: %s",
+ name, PQdb(conn), PQerrorMessage(conn));
+ break;
+ case REINDEX_SYSTEM:
+ pg_log_error("reindexing of system catalogs in database \"%s\" failed: %s",
+ PQdb(conn), PQerrorMessage(conn));
+ break;
+ case REINDEX_TABLE:
+ pg_log_error("reindexing of table \"%s\" in database \"%s\" failed: %s",
+ name, PQdb(conn), PQerrorMessage(conn));
+ break;
+ }
+ if (!async)
+ {
+ PQfinish(conn);
+ exit(1);
+ }
+ }
+
+ termPQExpBuffer(&sql);
+}
+
+/*
+ * Prepare the list of objects to process by querying the catalogs.
+ *
+ * This function will return a SimpleStringList object containing the entire
+ * list of tables in the given database that should be processed by a parallel
+ * database-wide reindex (excluding system tables), or NULL if there's no such
+ * table.
+ */
+static SimpleStringList *
+get_parallel_object_list(PGconn *conn, ReindexType type,
+ SimpleStringList *user_list, bool echo)
+{
+ PQExpBufferData catalog_query;
+ PQExpBufferData buf;
+ PGresult *res;
+ SimpleStringList *tables;
+ int ntups,
+ i;
+
+ initPQExpBuffer(&catalog_query);
+
+ /*
+ * The queries here are using a safe search_path, so there's no need to
+ * fully qualify everything.
+ */
+ switch (type)
+ {
+ case REINDEX_DATABASE:
+ Assert(user_list == NULL);
+ appendPQExpBufferStr(&catalog_query,
+ "SELECT c.relname, ns.nspname\n"
+ " FROM pg_catalog.pg_class c\n"
+ " JOIN pg_catalog.pg_namespace ns"
+ " ON c.relnamespace = ns.oid\n"
+ " WHERE ns.nspname != 'pg_catalog'\n"
+ " AND c.relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ")\n"
+ " ORDER BY c.relpages DESC;");
+ break;
+
+ case REINDEX_SCHEMA:
+ {
+ SimpleStringListCell *cell;
+ bool nsp_listed = false;
+
+ Assert(user_list != NULL);
+
+ /*
+ * All the tables from all the listed schemas are grabbed at
+ * once.
+ */
+ appendPQExpBufferStr(&catalog_query,
+ "SELECT c.relname, ns.nspname\n"
+ " FROM pg_catalog.pg_class c\n"
+ " JOIN pg_catalog.pg_namespace ns"
+ " ON c.relnamespace = ns.oid\n"
+ " WHERE c.relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ")\n"
+ " AND ns.nspname IN (");
+
+ for (cell = user_list->head; cell; cell = cell->next)
+ {
+ const char *nspname = cell->val;
+
+ if (nsp_listed)
+ appendPQExpBufferStr(&catalog_query, ", ");
+ else
+ nsp_listed = true;
+
+ appendStringLiteralConn(&catalog_query, nspname, conn);
+ }
+
+ appendPQExpBufferStr(&catalog_query, ")\n"
+ " ORDER BY c.relpages DESC;");
+ }
+ break;
+
+ case REINDEX_SYSTEM:
+ case REINDEX_INDEX:
+ case REINDEX_TABLE:
+ Assert(false);
+ break;
+ }
+
+ res = executeQuery(conn, catalog_query.data, echo);
+ termPQExpBuffer(&catalog_query);
+
+ /*
+ * If no rows are returned, there are no matching tables, so we are done.
+ */
+ ntups = PQntuples(res);
+ if (ntups == 0)
+ {
+ PQclear(res);
+ PQfinish(conn);
+ return NULL;
+ }
+
+ tables = pg_malloc0(sizeof(SimpleStringList));
+
+ /* Build qualified identifiers for each table */
+ initPQExpBuffer(&buf);
+ for (i = 0; i < ntups; i++)
+ {
+ appendPQExpBufferStr(&buf,
+ fmtQualifiedId(PQgetvalue(res, i, 1),
+ PQgetvalue(res, i, 0)));
+
+ simple_string_list_append(tables, buf.data);
+ resetPQExpBuffer(&buf);
+ }
+ termPQExpBuffer(&buf);
+ PQclear(res);
+
+ return tables;
+}
+
+static void
+reindex_all_databases(ConnParams *cparams,
+ const char *progname, bool echo, bool quiet, bool verbose,
+ bool concurrently, int concurrentCons,
+ const char *tablespace)
+{
+ PGconn *conn;
+ PGresult *result;
+ int i;
+
+ conn = connectMaintenanceDatabase(cparams, progname, echo);
+ result = executeQuery(conn,
+ "SELECT datname FROM pg_database WHERE datallowconn AND datconnlimit <> -2 ORDER BY 1;",
+ echo);
+ PQfinish(conn);
+
+ for (i = 0; i < PQntuples(result); i++)
+ {
+ char *dbname = PQgetvalue(result, i, 0);
+
+ if (!quiet)
+ {
+ printf(_("%s: reindexing database \"%s\"\n"), progname, dbname);
+ fflush(stdout);
+ }
+
+ cparams->override_dbname = dbname;
+
+ reindex_one_database(cparams, REINDEX_DATABASE, NULL,
+ progname, echo, verbose, concurrently,
+ concurrentCons, tablespace);
+ }
+
+ PQclear(result);
+}
+
+static void
+help(const char *progname)
+{
+ printf(_("%s reindexes a PostgreSQL database.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DBNAME]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -a, --all reindex all databases\n"));
+ printf(_(" --concurrently reindex concurrently\n"));
+ printf(_(" -d, --dbname=DBNAME database to reindex\n"));
+ printf(_(" -e, --echo show the commands being sent to the server\n"));
+ printf(_(" -i, --index=INDEX recreate specific index(es) only\n"));
+ printf(_(" -j, --jobs=NUM use this many concurrent connections to reindex\n"));
+ printf(_(" -q, --quiet don't write any messages\n"));
+ printf(_(" -s, --system reindex system catalogs only\n"));
+ printf(_(" -S, --schema=SCHEMA reindex specific schema(s) only\n"));
+ printf(_(" -t, --table=TABLE reindex specific table(s) only\n"));
+ printf(_(" --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"));
+ printf(_(" -v, --verbose write a lot of output\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -U, --username=USERNAME user name to connect as\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt\n"));
+ printf(_(" --maintenance-db=DBNAME alternate maintenance database\n"));
+ printf(_("\nRead the description of the SQL command REINDEX for details.\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/scripts/t/010_clusterdb.pl b/src/bin/scripts/t/010_clusterdb.pl
new file mode 100644
index 0000000..3d9abbb
--- /dev/null
+++ b/src/bin/scripts/t/010_clusterdb.pl
@@ -0,0 +1,38 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('clusterdb');
+program_version_ok('clusterdb');
+program_options_handling_ok('clusterdb');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->issues_sql_like(
+ ['clusterdb'],
+ qr/statement: CLUSTER;/,
+ 'SQL CLUSTER run');
+
+$node->command_fails([ 'clusterdb', '-t', 'nonexistent' ],
+ 'fails with nonexistent table');
+
+$node->safe_psql('postgres',
+ 'CREATE TABLE test1 (a int); CREATE INDEX test1x ON test1 (a); CLUSTER test1 USING test1x'
+);
+$node->issues_sql_like(
+ [ 'clusterdb', '-t', 'test1' ],
+ qr/statement: CLUSTER public\.test1;/,
+ 'cluster specific table');
+
+$node->command_ok([qw(clusterdb --echo --verbose dbname=template1)],
+ 'clusterdb with connection string');
+
+done_testing();
diff --git a/src/bin/scripts/t/011_clusterdb_all.pl b/src/bin/scripts/t/011_clusterdb_all.pl
new file mode 100644
index 0000000..7a209cf
--- /dev/null
+++ b/src/bin/scripts/t/011_clusterdb_all.pl
@@ -0,0 +1,38 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+# clusterdb -a is not compatible with -d, hence enforce environment variable
+# correctly.
+$ENV{PGDATABASE} = 'postgres';
+
+$node->issues_sql_like(
+ [ 'clusterdb', '-a' ],
+ qr/statement: CLUSTER.*statement: CLUSTER/s,
+ 'cluster all databases');
+
+$node->safe_psql(
+ 'postgres', q(
+ CREATE DATABASE regression_invalid;
+ UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid';
+));
+$node->command_ok([ 'clusterdb', '-a' ],
+ 'invalid database not targeted by clusterdb -a');
+
+# Doesn't quite belong here, but don't want to waste time by creating an
+# invalid database in 010_clusterdb.pl as well.
+$node->command_fails_like([ 'clusterdb', '-d', 'regression_invalid'],
+ qr/FATAL: cannot connect to invalid database "regression_invalid"/,
+ 'clusterdb cannot target invalid database');
+
+done_testing();
diff --git a/src/bin/scripts/t/020_createdb.pl b/src/bin/scripts/t/020_createdb.pl
new file mode 100644
index 0000000..2e712f4
--- /dev/null
+++ b/src/bin/scripts/t/020_createdb.pl
@@ -0,0 +1,161 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('createdb');
+program_version_ok('createdb');
+program_options_handling_ok('createdb');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->issues_sql_like(
+ [ 'createdb', 'foobar1' ],
+ qr/statement: CREATE DATABASE foobar1/,
+ 'SQL CREATE DATABASE run');
+$node->issues_sql_like(
+ [ 'createdb', '-l', 'C', '-E', 'LATIN1', '-T', 'template0', 'foobar2' ],
+ qr/statement: CREATE DATABASE foobar2 ENCODING 'LATIN1'/,
+ 'create database with encoding');
+
+if ($ENV{with_icu} eq 'yes')
+{
+ # This fails because template0 uses libc provider and has no ICU
+ # locale set. It would succeed if template0 used the icu
+ # provider. XXX Maybe split into multiple tests?
+ $node->command_fails(
+ [
+ 'createdb', '-T', 'template0', '-E', 'UTF8',
+ '--locale-provider=icu', 'foobar4'
+ ],
+ 'create database with ICU fails without ICU locale specified');
+
+ $node->issues_sql_like(
+ [
+ 'createdb', '-T',
+ 'template0', '-E', 'UTF8', '--locale-provider=icu',
+ '--icu-locale=en', 'foobar5'
+ ],
+ qr/statement: CREATE DATABASE foobar5 .* LOCALE_PROVIDER icu ICU_LOCALE 'en'/,
+ 'create database with ICU locale specified');
+
+ $node->command_fails(
+ [
+ 'createdb', '-T', 'template0', '-E', 'UTF8',
+ '--locale-provider=icu',
+ '--icu-locale=@colNumeric=lower', 'foobarX'
+ ],
+ 'fails for invalid ICU locale');
+
+ $node->command_fails_like(
+ [
+ 'createdb', '-T',
+ 'template0', '--locale-provider=icu',
+ '--encoding=SQL_ASCII', 'foobarX'
+ ],
+ qr/ERROR: encoding "SQL_ASCII" is not supported with ICU provider/,
+ 'fails for encoding not supported by ICU');
+
+ # additional node, which uses the icu provider
+ my $node2 = PostgreSQL::Test::Cluster->new('icu');
+ $node2->init(extra => ['--locale-provider=icu', '--icu-locale=en']);
+ $node2->start;
+
+ $node2->command_ok(
+ [ 'createdb', '-T', 'template0', '--locale-provider=libc', 'foobar55' ],
+ 'create database with libc provider from template database with icu provider');
+
+ $node2->command_ok(
+ [ 'createdb', '-T', 'template0', '--icu-locale', 'en-US', 'foobar56' ],
+ 'create database with icu locale from template database with icu provider');
+}
+else
+{
+ $node->command_fails(
+ [ 'createdb', '-T', 'template0', '--locale-provider=icu', 'foobar4' ],
+ 'create database with ICU fails since no ICU support');
+}
+
+$node->command_fails([ 'createdb', 'foobar1' ],
+ 'fails if database already exists');
+
+$node->command_fails(
+ [ 'createdb', '-T', 'template0', '--locale-provider=xyz', 'foobarX' ],
+ 'fails for invalid locale provider');
+
+# Check use of templates with shared dependencies copied from the template.
+my ($ret, $stdout, $stderr) = $node->psql(
+ 'foobar2',
+ 'CREATE ROLE role_foobar;
+CREATE TABLE tab_foobar (id int);
+ALTER TABLE tab_foobar owner to role_foobar;
+CREATE POLICY pol_foobar ON tab_foobar FOR ALL TO role_foobar;');
+$node->issues_sql_like(
+ [ 'createdb', '-l', 'C', '-T', 'foobar2', 'foobar3' ],
+ qr/statement: CREATE DATABASE foobar3 TEMPLATE foobar2/,
+ 'create database with template');
+($ret, $stdout, $stderr) = $node->psql(
+ 'foobar3',
+ "SELECT pg_describe_object(classid, objid, objsubid) AS obj,
+ pg_describe_object(refclassid, refobjid, 0) AS refobj
+ FROM pg_shdepend s JOIN pg_database d ON (d.oid = s.dbid)
+ WHERE d.datname = 'foobar3' ORDER BY obj;", on_error_die => 1);
+chomp($stdout);
+like(
+ $stdout,
+ qr/^policy pol_foobar on table tab_foobar\|role role_foobar
+table tab_foobar\|role role_foobar$/,
+ 'shared dependencies copied over to target database');
+
+# Check quote handling with incorrect option values.
+$node->command_checks_all(
+ [ 'createdb', '--encoding', "foo'; SELECT '1", 'foobar2' ],
+ 1,
+ [qr/^$/],
+ [qr/^createdb: error: "foo'; SELECT '1" is not a valid encoding name/s],
+ 'createdb with incorrect --encoding');
+$node->command_checks_all(
+ [ 'createdb', '--lc-collate', "foo'; SELECT '1", 'foobar2' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/^createdb: error: database creation failed: ERROR: invalid locale name|^createdb: error: database creation failed: ERROR: new collation \(foo'; SELECT '1\) is incompatible with the collation of the template database/s
+ ],
+ 'createdb with incorrect --lc-collate');
+$node->command_checks_all(
+ [ 'createdb', '--lc-ctype', "foo'; SELECT '1", 'foobar2' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/^createdb: error: database creation failed: ERROR: invalid locale name|^createdb: error: database creation failed: ERROR: new LC_CTYPE \(foo'; SELECT '1\) is incompatible with the LC_CTYPE of the template database/s
+ ],
+ 'createdb with incorrect --lc-ctype');
+
+$node->command_checks_all(
+ [ 'createdb', '--strategy', "foo", 'foobar2' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/^createdb: error: database creation failed: ERROR: invalid create database strategy "foo"/s
+ ],
+ 'createdb with incorrect --strategy');
+
+# Check database creation strategy
+$node->issues_sql_like(
+ [ 'createdb', '-T', 'foobar2', '-S', 'wal_log', 'foobar6' ],
+ qr/statement: CREATE DATABASE foobar6 STRATEGY wal_log TEMPLATE foobar2/,
+ 'create database with WAL_LOG strategy');
+
+$node->issues_sql_like(
+ [ 'createdb', '-T', 'foobar2', '-S', 'file_copy', 'foobar7' ],
+ qr/statement: CREATE DATABASE foobar7 STRATEGY file_copy TEMPLATE foobar2/,
+ 'create database with FILE_COPY strategy');
+
+done_testing();
diff --git a/src/bin/scripts/t/040_createuser.pl b/src/bin/scripts/t/040_createuser.pl
new file mode 100644
index 0000000..2a34be8
--- /dev/null
+++ b/src/bin/scripts/t/040_createuser.pl
@@ -0,0 +1,39 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('createuser');
+program_version_ok('createuser');
+program_options_handling_ok('createuser');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->issues_sql_like(
+ [ 'createuser', 'regress_user1' ],
+ qr/statement: CREATE ROLE regress_user1 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;/,
+ 'SQL CREATE USER run');
+$node->issues_sql_like(
+ [ 'createuser', '-L', 'regress_role1' ],
+ qr/statement: CREATE ROLE regress_role1 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOLOGIN;/,
+ 'create a non-login role');
+$node->issues_sql_like(
+ [ 'createuser', '-r', 'regress_user2' ],
+ qr/statement: CREATE ROLE regress_user2 NOSUPERUSER NOCREATEDB CREATEROLE INHERIT LOGIN;/,
+ 'create a CREATEROLE user');
+$node->issues_sql_like(
+ [ 'createuser', '-s', 'regress_user3' ],
+ qr/statement: CREATE ROLE regress_user3 SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN;/,
+ 'create a superuser');
+
+$node->command_fails([ 'createuser', 'regress_user1' ],
+ 'fails if role already exists');
+
+done_testing();
diff --git a/src/bin/scripts/t/050_dropdb.pl b/src/bin/scripts/t/050_dropdb.pl
new file mode 100644
index 0000000..1ca9ab8
--- /dev/null
+++ b/src/bin/scripts/t/050_dropdb.pl
@@ -0,0 +1,43 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('dropdb');
+program_version_ok('dropdb');
+program_options_handling_ok('dropdb');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->safe_psql('postgres', 'CREATE DATABASE foobar1');
+$node->issues_sql_like(
+ [ 'dropdb', 'foobar1' ],
+ qr/statement: DROP DATABASE foobar1/,
+ 'SQL DROP DATABASE run');
+
+$node->safe_psql('postgres', 'CREATE DATABASE foobar2');
+$node->issues_sql_like(
+ [ 'dropdb', '--force', 'foobar2' ],
+ qr/statement: DROP DATABASE foobar2 WITH \(FORCE\);/,
+ 'SQL DROP DATABASE (FORCE) run');
+
+$node->command_fails([ 'dropdb', 'nonexistent' ],
+ 'fails with nonexistent database');
+
+# check that invalid database can be dropped with dropdb
+$node->safe_psql(
+ 'postgres', q(
+ CREATE DATABASE regression_invalid;
+ UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid';
+));
+$node->command_ok([ 'dropdb', 'regression_invalid' ],
+ 'invalid database can be dropped');
+
+done_testing();
diff --git a/src/bin/scripts/t/070_dropuser.pl b/src/bin/scripts/t/070_dropuser.pl
new file mode 100644
index 0000000..e4eac21
--- /dev/null
+++ b/src/bin/scripts/t/070_dropuser.pl
@@ -0,0 +1,28 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('dropuser');
+program_version_ok('dropuser');
+program_options_handling_ok('dropuser');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->safe_psql('postgres', 'CREATE ROLE regress_foobar1');
+$node->issues_sql_like(
+ [ 'dropuser', 'regress_foobar1' ],
+ qr/statement: DROP ROLE regress_foobar1/,
+ 'SQL DROP ROLE run');
+
+$node->command_fails([ 'dropuser', 'regress_nonexistent' ],
+ 'fails with nonexistent user');
+
+done_testing();
diff --git a/src/bin/scripts/t/080_pg_isready.pl b/src/bin/scripts/t/080_pg_isready.pl
new file mode 100644
index 0000000..c45ca66
--- /dev/null
+++ b/src/bin/scripts/t/080_pg_isready.pl
@@ -0,0 +1,25 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_isready');
+program_version_ok('pg_isready');
+program_options_handling_ok('pg_isready');
+
+command_fails(['pg_isready'], 'fails with no server running');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->command_ok(
+ [ 'pg_isready', "--timeout=$PostgreSQL::Test::Utils::timeout_default" ],
+ 'succeeds with server running');
+
+done_testing();
diff --git a/src/bin/scripts/t/090_reindexdb.pl b/src/bin/scripts/t/090_reindexdb.pl
new file mode 100644
index 0000000..398fc4e
--- /dev/null
+++ b/src/bin/scripts/t/090_reindexdb.pl
@@ -0,0 +1,202 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('reindexdb');
+program_version_ok('reindexdb');
+program_options_handling_ok('reindexdb');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$ENV{PGOPTIONS} = '--client-min-messages=WARNING';
+
+# Create a tablespace for testing.
+my $tbspace_path = $node->basedir . '/regress_reindex_tbspace';
+mkdir $tbspace_path or die "cannot create directory $tbspace_path";
+my $tbspace_name = 'reindex_tbspace';
+$node->safe_psql('postgres',
+ "CREATE TABLESPACE $tbspace_name LOCATION '$tbspace_path';");
+
+$node->issues_sql_like(
+ [ 'reindexdb', 'postgres' ],
+ qr/statement: REINDEX DATABASE postgres;/,
+ 'SQL REINDEX run');
+
+# Use text as data type to get a toast table.
+$node->safe_psql('postgres',
+ 'CREATE TABLE test1 (a text); CREATE INDEX test1x ON test1 (a);');
+# Collect toast table and index names of this relation, for later use.
+my $toast_table = $node->safe_psql('postgres',
+ "SELECT reltoastrelid::regclass FROM pg_class WHERE oid = 'test1'::regclass;"
+);
+my $toast_index = $node->safe_psql('postgres',
+ "SELECT indexrelid::regclass FROM pg_index WHERE indrelid = '$toast_table'::regclass;"
+);
+
+$node->issues_sql_like(
+ [ 'reindexdb', '-t', 'test1', 'postgres' ],
+ qr/statement: REINDEX TABLE public\.test1;/,
+ 'reindex specific table');
+$node->issues_sql_like(
+ [ 'reindexdb', '-t', 'test1', '--tablespace', $tbspace_name, 'postgres' ],
+ qr/statement: REINDEX \(TABLESPACE $tbspace_name\) TABLE public\.test1;/,
+ 'reindex specific table on tablespace');
+$node->issues_sql_like(
+ [ 'reindexdb', '-i', 'test1x', 'postgres' ],
+ qr/statement: REINDEX INDEX public\.test1x;/,
+ 'reindex specific index');
+$node->issues_sql_like(
+ [ 'reindexdb', '-S', 'pg_catalog', 'postgres' ],
+ qr/statement: REINDEX SCHEMA pg_catalog;/,
+ 'reindex specific schema');
+$node->issues_sql_like(
+ [ 'reindexdb', '-s', 'postgres' ],
+ qr/statement: REINDEX SYSTEM postgres;/,
+ 'reindex system tables');
+$node->issues_sql_like(
+ [ 'reindexdb', '-v', '-t', 'test1', 'postgres' ],
+ qr/statement: REINDEX \(VERBOSE\) TABLE public\.test1;/,
+ 'reindex with verbose output');
+$node->issues_sql_like(
+ [
+ 'reindexdb', '-v', '-t', 'test1',
+ '--tablespace', $tbspace_name, 'postgres'
+ ],
+ qr/statement: REINDEX \(VERBOSE, TABLESPACE $tbspace_name\) TABLE public\.test1;/,
+ 'reindex with verbose output and tablespace');
+
+# the same with --concurrently
+$node->issues_sql_like(
+ [ 'reindexdb', '--concurrently', 'postgres' ],
+ qr/statement: REINDEX DATABASE CONCURRENTLY postgres;/,
+ 'SQL REINDEX CONCURRENTLY run');
+
+$node->issues_sql_like(
+ [ 'reindexdb', '--concurrently', '-t', 'test1', 'postgres' ],
+ qr/statement: REINDEX TABLE CONCURRENTLY public\.test1;/,
+ 'reindex specific table concurrently');
+$node->issues_sql_like(
+ [ 'reindexdb', '--concurrently', '-i', 'test1x', 'postgres' ],
+ qr/statement: REINDEX INDEX CONCURRENTLY public\.test1x;/,
+ 'reindex specific index concurrently');
+$node->issues_sql_like(
+ [ 'reindexdb', '--concurrently', '-S', 'public', 'postgres' ],
+ qr/statement: REINDEX SCHEMA CONCURRENTLY public;/,
+ 'reindex specific schema concurrently');
+$node->command_fails([ 'reindexdb', '--concurrently', '-s', 'postgres' ],
+ 'reindex system tables concurrently');
+$node->issues_sql_like(
+ [ 'reindexdb', '--concurrently', '-v', '-t', 'test1', 'postgres' ],
+ qr/statement: REINDEX \(VERBOSE\) TABLE CONCURRENTLY public\.test1;/,
+ 'reindex with verbose output concurrently');
+$node->issues_sql_like(
+ [
+ 'reindexdb', '--concurrently', '-v', '-t',
+ 'test1', '--tablespace', $tbspace_name, 'postgres'
+ ],
+ qr/statement: REINDEX \(VERBOSE, TABLESPACE $tbspace_name\) TABLE CONCURRENTLY public\.test1;/,
+ 'reindex concurrently with verbose output and tablespace');
+
+# REINDEX TABLESPACE on toast indexes and tables fails. This is not
+# part of the main regression test suite as these have unpredictable
+# names, and CONCURRENTLY cannot be used in transaction blocks, preventing
+# the use of TRY/CATCH blocks in a custom function to filter error
+# messages.
+$node->command_checks_all(
+ [
+ 'reindexdb', '-t', $toast_table, '--tablespace',
+ $tbspace_name, 'postgres'
+ ],
+ 1,
+ [],
+ [qr/cannot move system relation/],
+ 'reindex toast table with tablespace');
+$node->command_checks_all(
+ [
+ 'reindexdb', '--concurrently', '-t', $toast_table,
+ '--tablespace', $tbspace_name, 'postgres'
+ ],
+ 1,
+ [],
+ [qr/cannot move system relation/],
+ 'reindex toast table concurrently with tablespace');
+$node->command_checks_all(
+ [
+ 'reindexdb', '-i', $toast_index, '--tablespace',
+ $tbspace_name, 'postgres'
+ ],
+ 1,
+ [],
+ [qr/cannot move system relation/],
+ 'reindex toast index with tablespace');
+$node->command_checks_all(
+ [
+ 'reindexdb', '--concurrently', '-i', $toast_index,
+ '--tablespace', $tbspace_name, 'postgres'
+ ],
+ 1,
+ [],
+ [qr/cannot move system relation/],
+ 'reindex toast index concurrently with tablespace');
+
+# connection strings
+$node->command_ok([qw(reindexdb --echo --table=pg_am dbname=template1)],
+ 'reindexdb table with connection string');
+$node->command_ok(
+ [qw(reindexdb --echo dbname=template1)],
+ 'reindexdb database with connection string');
+$node->command_ok(
+ [qw(reindexdb --echo --system dbname=template1)],
+ 'reindexdb system with connection string');
+
+# parallel processing
+$node->safe_psql(
+ 'postgres', q|
+ CREATE SCHEMA s1;
+ CREATE TABLE s1.t1(id integer);
+ CREATE INDEX ON s1.t1(id);
+ CREATE SCHEMA s2;
+ CREATE TABLE s2.t2(id integer);
+ CREATE INDEX ON s2.t2(id);
+ -- empty schema
+ CREATE SCHEMA s3;
+|);
+
+$node->command_fails(
+ [ 'reindexdb', '-j', '2', '-s', 'postgres' ],
+ 'parallel reindexdb cannot process system catalogs');
+$node->command_fails(
+ [ 'reindexdb', '-j', '2', '-i', 'i1', 'postgres' ],
+ 'parallel reindexdb cannot process indexes');
+$node->issues_sql_like(
+ [ 'reindexdb', '-j', '2', 'postgres' ],
+ qr/statement:\ REINDEX SYSTEM postgres;
+.*statement:\ REINDEX TABLE public\.test1/s,
+ 'parallel reindexdb for database issues REINDEX SYSTEM first');
+# Note that the ordering of the commands is not stable, so the second
+# command for s2.t2 is not checked after.
+$node->issues_sql_like(
+ [ 'reindexdb', '-j', '2', '-S', 's1', '-S', 's2', 'postgres' ],
+ qr/statement:\ REINDEX TABLE s1.t1;/,
+ 'parallel reindexdb for schemas does a per-table REINDEX');
+$node->command_ok(
+ [ 'reindexdb', '-j', '2', '-S', 's3' ],
+ 'parallel reindexdb with empty schema');
+$node->command_checks_all(
+ [ 'reindexdb', '-j', '2', '--concurrently', '-d', 'postgres' ],
+ 0,
+ [qr/^$/],
+ [
+ qr/^reindexdb: warning: cannot reindex system catalogs concurrently, skipping all/s
+ ],
+ 'parallel reindexdb for system with --concurrently skips catalogs');
+
+done_testing();
diff --git a/src/bin/scripts/t/091_reindexdb_all.pl b/src/bin/scripts/t/091_reindexdb_all.pl
new file mode 100644
index 0000000..b197ef9
--- /dev/null
+++ b/src/bin/scripts/t/091_reindexdb_all.pl
@@ -0,0 +1,35 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use Test::More;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$ENV{PGOPTIONS} = '--client-min-messages=WARNING';
+
+$node->issues_sql_like(
+ [ 'reindexdb', '-a' ],
+ qr/statement: REINDEX.*statement: REINDEX/s,
+ 'reindex all databases');
+
+$node->safe_psql(
+ 'postgres', q(
+ CREATE DATABASE regression_invalid;
+ UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid';
+));
+$node->command_ok([ 'reindexdb', '-a' ],
+ 'invalid database not targeted by reindexdb -a');
+
+# Doesn't quite belong here, but don't want to waste time by creating an
+# invalid database in 090_reindexdb.pl as well.
+$node->command_fails_like([ 'reindexdb', '-d', 'regression_invalid'],
+ qr/FATAL: cannot connect to invalid database "regression_invalid"/,
+ 'reindexdb cannot target invalid database');
+
+done_testing();
diff --git a/src/bin/scripts/t/100_vacuumdb.pl b/src/bin/scripts/t/100_vacuumdb.pl
new file mode 100644
index 0000000..96a818a
--- /dev/null
+++ b/src/bin/scripts/t/100_vacuumdb.pl
@@ -0,0 +1,150 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('vacuumdb');
+program_version_ok('vacuumdb');
+program_options_handling_ok('vacuumdb');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->issues_sql_like(
+ [ 'vacuumdb', 'postgres' ],
+ qr/statement: VACUUM.*;/,
+ 'SQL VACUUM run');
+$node->issues_sql_like(
+ [ 'vacuumdb', '-f', 'postgres' ],
+ qr/statement: VACUUM \(FULL\).*;/,
+ 'vacuumdb -f');
+$node->issues_sql_like(
+ [ 'vacuumdb', '-F', 'postgres' ],
+ qr/statement: VACUUM \(FREEZE\).*;/,
+ 'vacuumdb -F');
+$node->issues_sql_like(
+ [ 'vacuumdb', '-zj2', 'postgres' ],
+ qr/statement: VACUUM \(ANALYZE\).*;/,
+ 'vacuumdb -zj2');
+$node->issues_sql_like(
+ [ 'vacuumdb', '-Z', 'postgres' ],
+ qr/statement: ANALYZE.*;/,
+ 'vacuumdb -Z');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--disable-page-skipping', 'postgres' ],
+ qr/statement: VACUUM \(DISABLE_PAGE_SKIPPING\).*;/,
+ 'vacuumdb --disable-page-skipping');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--skip-locked', 'postgres' ],
+ qr/statement: VACUUM \(SKIP_LOCKED\).*;/,
+ 'vacuumdb --skip-locked');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--skip-locked', '--analyze-only', 'postgres' ],
+ qr/statement: ANALYZE \(SKIP_LOCKED\).*;/,
+ 'vacuumdb --skip-locked --analyze-only');
+$node->command_fails(
+ [ 'vacuumdb', '--analyze-only', '--disable-page-skipping', 'postgres' ],
+ '--analyze-only and --disable-page-skipping specified together');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--no-index-cleanup', 'postgres' ],
+ qr/statement: VACUUM \(INDEX_CLEANUP FALSE\).*;/,
+ 'vacuumdb --no-index-cleanup');
+$node->command_fails(
+ [ 'vacuumdb', '--analyze-only', '--no-index-cleanup', 'postgres' ],
+ '--analyze-only and --no-index-cleanup specified together');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--no-truncate', 'postgres' ],
+ qr/statement: VACUUM \(TRUNCATE FALSE\).*;/,
+ 'vacuumdb --no-truncate');
+$node->command_fails(
+ [ 'vacuumdb', '--analyze-only', '--no-truncate', 'postgres' ],
+ '--analyze-only and --no-truncate specified together');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--no-process-toast', 'postgres' ],
+ qr/statement: VACUUM \(PROCESS_TOAST FALSE\).*;/,
+ 'vacuumdb --no-process-toast');
+$node->command_fails(
+ [ 'vacuumdb', '--analyze-only', '--no-process-toast', 'postgres' ],
+ '--analyze-only and --no-process-toast specified together');
+$node->issues_sql_like(
+ [ 'vacuumdb', '-P', 2, 'postgres' ],
+ qr/statement: VACUUM \(PARALLEL 2\).*;/,
+ 'vacuumdb -P 2');
+$node->issues_sql_like(
+ [ 'vacuumdb', '-P', 0, 'postgres' ],
+ qr/statement: VACUUM \(PARALLEL 0\).*;/,
+ 'vacuumdb -P 0');
+$node->command_ok([qw(vacuumdb -Z --table=pg_am dbname=template1)],
+ 'vacuumdb with connection string');
+
+$node->command_fails(
+ [qw(vacuumdb -Zt pg_am;ABORT postgres)],
+ 'trailing command in "-t", without COLUMNS');
+
+# Unwanted; better if it failed.
+$node->command_ok(
+ [qw(vacuumdb -Zt pg_am(amname);ABORT postgres)],
+ 'trailing command in "-t", with COLUMNS');
+
+$node->safe_psql(
+ 'postgres', q|
+ CREATE TABLE "need""q(uot" (")x" text);
+ CREATE TABLE vactable (a int, b int);
+ CREATE VIEW vacview AS SELECT 1 as a;
+
+ CREATE FUNCTION f0(int) RETURNS int LANGUAGE SQL AS 'SELECT $1 * $1';
+ CREATE FUNCTION f1(int) RETURNS int LANGUAGE SQL AS 'SELECT f0($1)';
+ CREATE TABLE funcidx (x int);
+ INSERT INTO funcidx VALUES (0),(1),(2),(3);
+ CREATE INDEX i0 ON funcidx ((f1(x)));
+|);
+$node->command_ok([qw|vacuumdb -Z --table="need""q(uot"(")x") postgres|],
+ 'column list');
+$node->command_fails(
+ [qw|vacuumdb -Zt funcidx postgres|],
+ 'unqualifed name via functional index');
+
+$node->command_fails(
+ [ 'vacuumdb', '--analyze', '--table', 'vactable(c)', 'postgres' ],
+ 'incorrect column name with ANALYZE');
+$node->command_fails([ 'vacuumdb', '-P', -1, 'postgres' ],
+ 'negative parallel degree');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--analyze', '--table', 'vactable(a, b)', 'postgres' ],
+ qr/statement: VACUUM \(ANALYZE\) public.vactable\(a, b\);/,
+ 'vacuumdb --analyze with complete column list');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--analyze-only', '--table', 'vactable(b)', 'postgres' ],
+ qr/statement: ANALYZE public.vactable\(b\);/,
+ 'vacuumdb --analyze-only with partial column list');
+$node->command_checks_all(
+ [ 'vacuumdb', '--analyze', '--table', 'vacview', 'postgres' ],
+ 0,
+ [qr/^.*vacuuming database "postgres"/],
+ [qr/^WARNING.*cannot vacuum non-tables or special system tables/s],
+ 'vacuumdb with view');
+$node->command_fails(
+ [ 'vacuumdb', '--table', 'vactable', '--min-mxid-age', '0', 'postgres' ],
+ 'vacuumdb --min-mxid-age with incorrect value');
+$node->command_fails(
+ [ 'vacuumdb', '--table', 'vactable', '--min-xid-age', '0', 'postgres' ],
+ 'vacuumdb --min-xid-age with incorrect value');
+$node->issues_sql_like(
+ [
+ 'vacuumdb', '--table', 'vactable', '--min-mxid-age',
+ '2147483000', 'postgres'
+ ],
+ qr/GREATEST.*relminmxid.*2147483000/,
+ 'vacuumdb --table --min-mxid-age');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--min-xid-age', '2147483001', 'postgres' ],
+ qr/GREATEST.*relfrozenxid.*2147483001/,
+ 'vacuumdb --table --min-xid-age');
+
+done_testing();
diff --git a/src/bin/scripts/t/101_vacuumdb_all.pl b/src/bin/scripts/t/101_vacuumdb_all.pl
new file mode 100644
index 0000000..d3fe59b
--- /dev/null
+++ b/src/bin/scripts/t/101_vacuumdb_all.pl
@@ -0,0 +1,33 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use Test::More;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->issues_sql_like(
+ [ 'vacuumdb', '-a' ],
+ qr/statement: VACUUM.*statement: VACUUM/s,
+ 'vacuum all databases');
+
+$node->safe_psql(
+ 'postgres', q(
+ CREATE DATABASE regression_invalid;
+ UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid';
+));
+$node->command_ok([ 'vacuumdb', '-a' ],
+ 'invalid database not targeted by vacuumdb -a');
+
+# Doesn't quite belong here, but don't want to waste time by creating an
+# invalid database in 010_vacuumdb.pl as well.
+$node->command_fails_like([ 'vacuumdb', '-d', 'regression_invalid'],
+ qr/FATAL: cannot connect to invalid database "regression_invalid"/,
+ 'vacuumdb cannot target invalid database');
+
+done_testing();
diff --git a/src/bin/scripts/t/102_vacuumdb_stages.pl b/src/bin/scripts/t/102_vacuumdb_stages.pl
new file mode 100644
index 0000000..caff3a3
--- /dev/null
+++ b/src/bin/scripts/t/102_vacuumdb_stages.pl
@@ -0,0 +1,40 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use Test::More;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->issues_sql_like(
+ [ 'vacuumdb', '--analyze-in-stages', 'postgres' ],
+ qr/statement:\ SET\ default_statistics_target=1;\ SET\ vacuum_cost_delay=0;
+ .*statement:\ ANALYZE
+ .*statement:\ SET\ default_statistics_target=10;\ RESET\ vacuum_cost_delay;
+ .*statement:\ ANALYZE
+ .*statement:\ RESET\ default_statistics_target;
+ .*statement:\ ANALYZE/sx,
+ 'analyze three times');
+
+$node->issues_sql_like(
+ [ 'vacuumdb', '--analyze-in-stages', '--all' ],
+ qr/statement:\ SET\ default_statistics_target=1;\ SET\ vacuum_cost_delay=0;
+ .*statement:\ ANALYZE
+ .*statement:\ SET\ default_statistics_target=1;\ SET\ vacuum_cost_delay=0;
+ .*statement:\ ANALYZE
+ .*statement:\ SET\ default_statistics_target=10;\ RESET\ vacuum_cost_delay;
+ .*statement:\ ANALYZE
+ .*statement:\ SET\ default_statistics_target=10;\ RESET\ vacuum_cost_delay;
+ .*statement:\ ANALYZE
+ .*statement:\ RESET\ default_statistics_target;
+ .*statement:\ ANALYZE
+ .*statement:\ RESET\ default_statistics_target;
+ .*statement:\ ANALYZE/sx,
+ 'analyze more than one database in stages');
+
+done_testing();
diff --git a/src/bin/scripts/t/200_connstr.pl b/src/bin/scripts/t/200_connstr.pl
new file mode 100644
index 0000000..c865146
--- /dev/null
+++ b/src/bin/scripts/t/200_connstr.pl
@@ -0,0 +1,44 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+# Tests to check connection string handling in utilities
+
+# We're going to use byte sequences that aren't valid UTF-8 strings. Use
+# LATIN1, which accepts any byte and has a conversion from each byte to UTF-8.
+$ENV{LC_ALL} = 'C';
+$ENV{PGCLIENTENCODING} = 'LATIN1';
+
+# Create database names covering the range of LATIN1 characters and
+# run the utilities' --all options over them.
+my $dbname1 = generate_ascii_string(1, 63); # contains '='
+my $dbname2 =
+ generate_ascii_string(67, 129); # skip 64-66 to keep length to 62
+my $dbname3 = generate_ascii_string(130, 192);
+my $dbname4 = generate_ascii_string(193, 255);
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init(extra => [ '--locale=C', '--encoding=LATIN1' ]);
+$node->start;
+
+foreach my $dbname ($dbname1, $dbname2, $dbname3, $dbname4, 'CamelCase')
+{
+ $node->run_log([ 'createdb', $dbname ]);
+}
+
+$node->command_ok(
+ [qw(vacuumdb --all --echo --analyze-only)],
+ 'vacuumdb --all with unusual database names');
+$node->command_ok([qw(reindexdb --all --echo)],
+ 'reindexdb --all with unusual database names');
+$node->command_ok(
+ [qw(clusterdb --all --echo --verbose)],
+ 'clusterdb --all with unusual database names');
+
+done_testing();
diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c
new file mode 100644
index 0000000..2c57634
--- /dev/null
+++ b/src/bin/scripts/vacuumdb.c
@@ -0,0 +1,1001 @@
+/*-------------------------------------------------------------------------
+ *
+ * vacuumdb
+ *
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/scripts/vacuumdb.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <limits.h>
+
+#include "catalog/pg_class_d.h"
+#include "common.h"
+#include "common/connect.h"
+#include "common/logging.h"
+#include "fe_utils/cancel.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/parallel_slot.h"
+#include "fe_utils/query_utils.h"
+#include "fe_utils/simple_list.h"
+#include "fe_utils/string_utils.h"
+
+
+/* vacuum options controlled by user flags */
+typedef struct vacuumingOptions
+{
+ bool analyze_only;
+ bool verbose;
+ bool and_analyze;
+ bool full;
+ bool freeze;
+ bool disable_page_skipping;
+ bool skip_locked;
+ int min_xid_age;
+ int min_mxid_age;
+ int parallel_workers; /* >= 0 indicates user specified the
+ * parallel degree, otherwise -1 */
+ bool no_index_cleanup;
+ bool force_index_cleanup;
+ bool do_truncate;
+ bool process_toast;
+} vacuumingOptions;
+
+
+static void vacuum_one_database(ConnParams *cparams,
+ vacuumingOptions *vacopts,
+ int stage,
+ SimpleStringList *tables,
+ int concurrentCons,
+ const char *progname, bool echo, bool quiet);
+
+static void vacuum_all_databases(ConnParams *cparams,
+ vacuumingOptions *vacopts,
+ bool analyze_in_stages,
+ int concurrentCons,
+ const char *progname, bool echo, bool quiet);
+
+static void prepare_vacuum_command(PQExpBuffer sql, int serverVersion,
+ vacuumingOptions *vacopts, const char *table);
+
+static void run_vacuum_command(PGconn *conn, const char *sql, bool echo,
+ const char *table);
+
+static void help(const char *progname);
+
+/* For analyze-in-stages mode */
+#define ANALYZE_NO_STAGE -1
+#define ANALYZE_NUM_STAGES 3
+
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"echo", no_argument, NULL, 'e'},
+ {"quiet", no_argument, NULL, 'q'},
+ {"dbname", required_argument, NULL, 'd'},
+ {"analyze", no_argument, NULL, 'z'},
+ {"analyze-only", no_argument, NULL, 'Z'},
+ {"freeze", no_argument, NULL, 'F'},
+ {"all", no_argument, NULL, 'a'},
+ {"table", required_argument, NULL, 't'},
+ {"full", no_argument, NULL, 'f'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"jobs", required_argument, NULL, 'j'},
+ {"parallel", required_argument, NULL, 'P'},
+ {"maintenance-db", required_argument, NULL, 2},
+ {"analyze-in-stages", no_argument, NULL, 3},
+ {"disable-page-skipping", no_argument, NULL, 4},
+ {"skip-locked", no_argument, NULL, 5},
+ {"min-xid-age", required_argument, NULL, 6},
+ {"min-mxid-age", required_argument, NULL, 7},
+ {"no-index-cleanup", no_argument, NULL, 8},
+ {"force-index-cleanup", no_argument, NULL, 9},
+ {"no-truncate", no_argument, NULL, 10},
+ {"no-process-toast", no_argument, NULL, 11},
+ {NULL, 0, NULL, 0}
+ };
+
+ const char *progname;
+ int optindex;
+ int c;
+ const char *dbname = NULL;
+ const char *maintenance_db = NULL;
+ char *host = NULL;
+ char *port = NULL;
+ char *username = NULL;
+ enum trivalue prompt_password = TRI_DEFAULT;
+ ConnParams cparams;
+ bool echo = false;
+ bool quiet = false;
+ vacuumingOptions vacopts;
+ bool analyze_in_stages = false;
+ bool alldb = false;
+ SimpleStringList tables = {NULL, NULL};
+ int concurrentCons = 1;
+ int tbl_count = 0;
+
+ /* initialize options */
+ memset(&vacopts, 0, sizeof(vacopts));
+ vacopts.parallel_workers = -1;
+ vacopts.no_index_cleanup = false;
+ vacopts.force_index_cleanup = false;
+ vacopts.do_truncate = true;
+ vacopts.process_toast = true;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
+
+ handle_help_version_opts(argc, argv, "vacuumdb", help);
+
+ while ((c = getopt_long(argc, argv, "h:p:U:wWeqd:zZFat:fvj:P:", long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'h':
+ host = pg_strdup(optarg);
+ break;
+ case 'p':
+ port = pg_strdup(optarg);
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'w':
+ prompt_password = TRI_NO;
+ break;
+ case 'W':
+ prompt_password = TRI_YES;
+ break;
+ case 'e':
+ echo = true;
+ break;
+ case 'q':
+ quiet = true;
+ break;
+ case 'd':
+ dbname = pg_strdup(optarg);
+ break;
+ case 'z':
+ vacopts.and_analyze = true;
+ break;
+ case 'Z':
+ vacopts.analyze_only = true;
+ break;
+ case 'F':
+ vacopts.freeze = true;
+ break;
+ case 'a':
+ alldb = true;
+ break;
+ case 't':
+ {
+ simple_string_list_append(&tables, optarg);
+ tbl_count++;
+ break;
+ }
+ case 'f':
+ vacopts.full = true;
+ break;
+ case 'v':
+ vacopts.verbose = true;
+ break;
+ case 'j':
+ if (!option_parse_int(optarg, "-j/--jobs", 1, INT_MAX,
+ &concurrentCons))
+ exit(1);
+ break;
+ case 'P':
+ if (!option_parse_int(optarg, "-P/--parallel", 0, INT_MAX,
+ &vacopts.parallel_workers))
+ exit(1);
+ break;
+ case 2:
+ maintenance_db = pg_strdup(optarg);
+ break;
+ case 3:
+ analyze_in_stages = vacopts.analyze_only = true;
+ break;
+ case 4:
+ vacopts.disable_page_skipping = true;
+ break;
+ case 5:
+ vacopts.skip_locked = true;
+ break;
+ case 6:
+ if (!option_parse_int(optarg, "--min-xid-age", 1, INT_MAX,
+ &vacopts.min_xid_age))
+ exit(1);
+ break;
+ case 7:
+ if (!option_parse_int(optarg, "--min-mxid-age", 1, INT_MAX,
+ &vacopts.min_mxid_age))
+ exit(1);
+ break;
+ case 8:
+ vacopts.no_index_cleanup = true;
+ break;
+ case 9:
+ vacopts.force_index_cleanup = true;
+ break;
+ case 10:
+ vacopts.do_truncate = false;
+ break;
+ case 11:
+ vacopts.process_toast = false;
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /*
+ * Non-option argument specifies database name as long as it wasn't
+ * already specified with -d / --dbname
+ */
+ if (optind < argc && dbname == NULL)
+ {
+ dbname = argv[optind];
+ optind++;
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (vacopts.analyze_only)
+ {
+ if (vacopts.full)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "full");
+ if (vacopts.freeze)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "freeze");
+ if (vacopts.disable_page_skipping)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "disable-page-skipping");
+ if (vacopts.no_index_cleanup)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "no-index-cleanup");
+ if (vacopts.force_index_cleanup)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "force-index-cleanup");
+ if (!vacopts.do_truncate)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "no-truncate");
+ if (!vacopts.process_toast)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "no-process-toast");
+ /* allow 'and_analyze' with 'analyze_only' */
+ }
+
+ /* Prohibit full and analyze_only options with parallel option */
+ if (vacopts.parallel_workers >= 0)
+ {
+ if (vacopts.analyze_only)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "parallel");
+ if (vacopts.full)
+ pg_fatal("cannot use the \"%s\" option when performing full vacuum",
+ "parallel");
+ }
+
+ /* Prohibit --no-index-cleanup and --force-index-cleanup together */
+ if (vacopts.no_index_cleanup && vacopts.force_index_cleanup)
+ pg_fatal("cannot use the \"%s\" option with the \"%s\" option",
+ "no-index-cleanup", "force-index-cleanup");
+
+ /* fill cparams except for dbname, which is set below */
+ cparams.pghost = host;
+ cparams.pgport = port;
+ cparams.pguser = username;
+ cparams.prompt_password = prompt_password;
+ cparams.override_dbname = NULL;
+
+ setup_cancel_handler(NULL);
+
+ /* Avoid opening extra connections. */
+ if (tbl_count && (concurrentCons > tbl_count))
+ concurrentCons = tbl_count;
+
+ if (alldb)
+ {
+ if (dbname)
+ pg_fatal("cannot vacuum all databases and a specific one at the same time");
+ if (tables.head != NULL)
+ pg_fatal("cannot vacuum specific table(s) in all databases");
+
+ cparams.dbname = maintenance_db;
+
+ vacuum_all_databases(&cparams, &vacopts,
+ analyze_in_stages,
+ concurrentCons,
+ progname, echo, quiet);
+ }
+ else
+ {
+ if (dbname == NULL)
+ {
+ if (getenv("PGDATABASE"))
+ dbname = getenv("PGDATABASE");
+ else if (getenv("PGUSER"))
+ dbname = getenv("PGUSER");
+ else
+ dbname = get_user_name_or_exit(progname);
+ }
+
+ cparams.dbname = dbname;
+
+ if (analyze_in_stages)
+ {
+ int stage;
+
+ for (stage = 0; stage < ANALYZE_NUM_STAGES; stage++)
+ {
+ vacuum_one_database(&cparams, &vacopts,
+ stage,
+ &tables,
+ concurrentCons,
+ progname, echo, quiet);
+ }
+ }
+ else
+ vacuum_one_database(&cparams, &vacopts,
+ ANALYZE_NO_STAGE,
+ &tables,
+ concurrentCons,
+ progname, echo, quiet);
+ }
+
+ exit(0);
+}
+
+/*
+ * vacuum_one_database
+ *
+ * Process tables in the given database. If the 'tables' list is empty,
+ * process all tables in the database.
+ *
+ * Note that this function is only concerned with running exactly one stage
+ * when in analyze-in-stages mode; caller must iterate on us if necessary.
+ *
+ * If concurrentCons is > 1, multiple connections are used to vacuum tables
+ * in parallel. In this case and if the table list is empty, we first obtain
+ * a list of tables from the database.
+ */
+static void
+vacuum_one_database(ConnParams *cparams,
+ vacuumingOptions *vacopts,
+ int stage,
+ SimpleStringList *tables,
+ int concurrentCons,
+ const char *progname, bool echo, bool quiet)
+{
+ PQExpBufferData sql;
+ PQExpBufferData buf;
+ PQExpBufferData catalog_query;
+ PGresult *res;
+ PGconn *conn;
+ SimpleStringListCell *cell;
+ ParallelSlotArray *sa;
+ SimpleStringList dbtables = {NULL, NULL};
+ int i;
+ int ntups;
+ bool failed = false;
+ bool tables_listed = false;
+ bool has_where = false;
+ const char *initcmd;
+ const char *stage_commands[] = {
+ "SET default_statistics_target=1; SET vacuum_cost_delay=0;",
+ "SET default_statistics_target=10; RESET vacuum_cost_delay;",
+ "RESET default_statistics_target;"
+ };
+ const char *stage_messages[] = {
+ gettext_noop("Generating minimal optimizer statistics (1 target)"),
+ gettext_noop("Generating medium optimizer statistics (10 targets)"),
+ gettext_noop("Generating default (full) optimizer statistics")
+ };
+
+ Assert(stage == ANALYZE_NO_STAGE ||
+ (stage >= 0 && stage < ANALYZE_NUM_STAGES));
+
+ conn = connectDatabase(cparams, progname, echo, false, true);
+
+ if (vacopts->disable_page_skipping && PQserverVersion(conn) < 90600)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "disable-page-skipping", "9.6");
+ }
+
+ if (vacopts->no_index_cleanup && PQserverVersion(conn) < 120000)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "no-index-cleanup", "12");
+ }
+
+ if (vacopts->force_index_cleanup && PQserverVersion(conn) < 120000)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "force-index-cleanup", "12");
+ }
+
+ if (!vacopts->do_truncate && PQserverVersion(conn) < 120000)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "no-truncate", "12");
+ }
+
+ if (!vacopts->process_toast && PQserverVersion(conn) < 140000)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "no-process-toast", "14");
+ }
+
+ if (vacopts->skip_locked && PQserverVersion(conn) < 120000)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "skip-locked", "12");
+ }
+
+ if (vacopts->min_xid_age != 0 && PQserverVersion(conn) < 90600)
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "--min-xid-age", "9.6");
+
+ if (vacopts->min_mxid_age != 0 && PQserverVersion(conn) < 90600)
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "--min-mxid-age", "9.6");
+
+ if (vacopts->parallel_workers >= 0 && PQserverVersion(conn) < 130000)
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "--parallel", "13");
+
+ if (!quiet)
+ {
+ if (stage != ANALYZE_NO_STAGE)
+ printf(_("%s: processing database \"%s\": %s\n"),
+ progname, PQdb(conn), _(stage_messages[stage]));
+ else
+ printf(_("%s: vacuuming database \"%s\"\n"),
+ progname, PQdb(conn));
+ fflush(stdout);
+ }
+
+ /*
+ * Prepare the list of tables to process by querying the catalogs.
+ *
+ * Since we execute the constructed query with the default search_path
+ * (which could be unsafe), everything in this query MUST be fully
+ * qualified.
+ *
+ * First, build a WITH clause for the catalog query if any tables were
+ * specified, with a set of values made of relation names and their
+ * optional set of columns. This is used to match any provided column
+ * lists with the generated qualified identifiers and to filter for the
+ * tables provided via --table. If a listed table does not exist, the
+ * catalog query will fail.
+ */
+ initPQExpBuffer(&catalog_query);
+ for (cell = tables ? tables->head : NULL; cell; cell = cell->next)
+ {
+ char *just_table;
+ const char *just_columns;
+
+ /*
+ * Split relation and column names given by the user, this is used to
+ * feed the CTE with values on which are performed pre-run validity
+ * checks as well. For now these happen only on the relation name.
+ */
+ splitTableColumnsSpec(cell->val, PQclientEncoding(conn),
+ &just_table, &just_columns);
+
+ if (!tables_listed)
+ {
+ appendPQExpBufferStr(&catalog_query,
+ "WITH listed_tables (table_oid, column_list) "
+ "AS (\n VALUES (");
+ tables_listed = true;
+ }
+ else
+ appendPQExpBufferStr(&catalog_query, ",\n (");
+
+ appendStringLiteralConn(&catalog_query, just_table, conn);
+ appendPQExpBufferStr(&catalog_query, "::pg_catalog.regclass, ");
+
+ if (just_columns && just_columns[0] != '\0')
+ appendStringLiteralConn(&catalog_query, just_columns, conn);
+ else
+ appendPQExpBufferStr(&catalog_query, "NULL");
+
+ appendPQExpBufferStr(&catalog_query, "::pg_catalog.text)");
+
+ pg_free(just_table);
+ }
+
+ /* Finish formatting the CTE */
+ if (tables_listed)
+ appendPQExpBufferStr(&catalog_query, "\n)\n");
+
+ appendPQExpBufferStr(&catalog_query, "SELECT c.relname, ns.nspname");
+
+ if (tables_listed)
+ appendPQExpBufferStr(&catalog_query, ", listed_tables.column_list");
+
+ appendPQExpBufferStr(&catalog_query,
+ " FROM pg_catalog.pg_class c\n"
+ " JOIN pg_catalog.pg_namespace ns"
+ " ON c.relnamespace OPERATOR(pg_catalog.=) ns.oid\n"
+ " LEFT JOIN pg_catalog.pg_class t"
+ " ON c.reltoastrelid OPERATOR(pg_catalog.=) t.oid\n");
+
+ /* Used to match the tables listed by the user */
+ if (tables_listed)
+ appendPQExpBufferStr(&catalog_query, " JOIN listed_tables"
+ " ON listed_tables.table_oid OPERATOR(pg_catalog.=) c.oid\n");
+
+ /*
+ * If no tables were listed, filter for the relevant relation types. If
+ * tables were given via --table, don't bother filtering by relation type.
+ * Instead, let the server decide whether a given relation can be
+ * processed in which case the user will know about it.
+ */
+ if (!tables_listed)
+ {
+ appendPQExpBufferStr(&catalog_query, " WHERE c.relkind OPERATOR(pg_catalog.=) ANY (array["
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) "])\n");
+ has_where = true;
+ }
+
+ /*
+ * For --min-xid-age and --min-mxid-age, the age of the relation is the
+ * greatest of the ages of the main relation and its associated TOAST
+ * table. The commands generated by vacuumdb will also process the TOAST
+ * table for the relation if necessary, so it does not need to be
+ * considered separately.
+ */
+ if (vacopts->min_xid_age != 0)
+ {
+ appendPQExpBuffer(&catalog_query,
+ " %s GREATEST(pg_catalog.age(c.relfrozenxid),"
+ " pg_catalog.age(t.relfrozenxid)) "
+ " OPERATOR(pg_catalog.>=) '%d'::pg_catalog.int4\n"
+ " AND c.relfrozenxid OPERATOR(pg_catalog.!=)"
+ " '0'::pg_catalog.xid\n",
+ has_where ? "AND" : "WHERE", vacopts->min_xid_age);
+ has_where = true;
+ }
+
+ if (vacopts->min_mxid_age != 0)
+ {
+ appendPQExpBuffer(&catalog_query,
+ " %s GREATEST(pg_catalog.mxid_age(c.relminmxid),"
+ " pg_catalog.mxid_age(t.relminmxid)) OPERATOR(pg_catalog.>=)"
+ " '%d'::pg_catalog.int4\n"
+ " AND c.relminmxid OPERATOR(pg_catalog.!=)"
+ " '0'::pg_catalog.xid\n",
+ has_where ? "AND" : "WHERE", vacopts->min_mxid_age);
+ has_where = true;
+ }
+
+ /*
+ * Execute the catalog query. We use the default search_path for this
+ * query for consistency with table lookups done elsewhere by the user.
+ */
+ appendPQExpBufferStr(&catalog_query, " ORDER BY c.relpages DESC;");
+ executeCommand(conn, "RESET search_path;", echo);
+ res = executeQuery(conn, catalog_query.data, echo);
+ termPQExpBuffer(&catalog_query);
+ PQclear(executeQuery(conn, ALWAYS_SECURE_SEARCH_PATH_SQL, echo));
+
+ /*
+ * If no rows are returned, there are no matching tables, so we are done.
+ */
+ ntups = PQntuples(res);
+ if (ntups == 0)
+ {
+ PQclear(res);
+ PQfinish(conn);
+ return;
+ }
+
+ /*
+ * Build qualified identifiers for each table, including the column list
+ * if given.
+ */
+ initPQExpBuffer(&buf);
+ for (i = 0; i < ntups; i++)
+ {
+ appendPQExpBufferStr(&buf,
+ fmtQualifiedId(PQgetvalue(res, i, 1),
+ PQgetvalue(res, i, 0)));
+
+ if (tables_listed && !PQgetisnull(res, i, 2))
+ appendPQExpBufferStr(&buf, PQgetvalue(res, i, 2));
+
+ simple_string_list_append(&dbtables, buf.data);
+ resetPQExpBuffer(&buf);
+ }
+ termPQExpBuffer(&buf);
+ PQclear(res);
+
+ /*
+ * Ensure concurrentCons is sane. If there are more connections than
+ * vacuumable relations, we don't need to use them all.
+ */
+ if (concurrentCons > ntups)
+ concurrentCons = ntups;
+ if (concurrentCons <= 0)
+ concurrentCons = 1;
+
+ /*
+ * All slots need to be prepared to run the appropriate analyze stage, if
+ * caller requested that mode. We have to prepare the initial connection
+ * ourselves before setting up the slots.
+ */
+ if (stage == ANALYZE_NO_STAGE)
+ initcmd = NULL;
+ else
+ {
+ initcmd = stage_commands[stage];
+ executeCommand(conn, initcmd, echo);
+ }
+
+ /*
+ * Setup the database connections. We reuse the connection we already have
+ * for the first slot. If not in parallel mode, the first slot in the
+ * array contains the connection.
+ */
+ sa = ParallelSlotsSetup(concurrentCons, cparams, progname, echo, initcmd);
+ ParallelSlotsAdoptConn(sa, conn);
+
+ initPQExpBuffer(&sql);
+
+ cell = dbtables.head;
+ do
+ {
+ const char *tabname = cell->val;
+ ParallelSlot *free_slot;
+
+ if (CancelRequested)
+ {
+ failed = true;
+ goto finish;
+ }
+
+ free_slot = ParallelSlotsGetIdle(sa, NULL);
+ if (!free_slot)
+ {
+ failed = true;
+ goto finish;
+ }
+
+ prepare_vacuum_command(&sql, PQserverVersion(free_slot->connection),
+ vacopts, tabname);
+
+ /*
+ * Execute the vacuum. All errors are handled in processQueryResult
+ * through ParallelSlotsGetIdle.
+ */
+ ParallelSlotSetHandler(free_slot, TableCommandResultHandler, NULL);
+ run_vacuum_command(free_slot->connection, sql.data,
+ echo, tabname);
+
+ cell = cell->next;
+ } while (cell != NULL);
+
+ if (!ParallelSlotsWaitCompletion(sa))
+ failed = true;
+
+finish:
+ ParallelSlotsTerminate(sa);
+ pg_free(sa);
+
+ termPQExpBuffer(&sql);
+
+ if (failed)
+ exit(1);
+}
+
+/*
+ * Vacuum/analyze all connectable databases.
+ *
+ * In analyze-in-stages mode, we process all databases in one stage before
+ * moving on to the next stage. That ensure minimal stats are available
+ * quickly everywhere before generating more detailed ones.
+ */
+static void
+vacuum_all_databases(ConnParams *cparams,
+ vacuumingOptions *vacopts,
+ bool analyze_in_stages,
+ int concurrentCons,
+ const char *progname, bool echo, bool quiet)
+{
+ PGconn *conn;
+ PGresult *result;
+ int stage;
+ int i;
+
+ conn = connectMaintenanceDatabase(cparams, progname, echo);
+ result = executeQuery(conn,
+ "SELECT datname FROM pg_database WHERE datallowconn AND datconnlimit <> -2 ORDER BY 1;",
+ echo);
+ PQfinish(conn);
+
+ if (analyze_in_stages)
+ {
+ /*
+ * When analyzing all databases in stages, we analyze them all in the
+ * fastest stage first, so that initial statistics become available
+ * for all of them as soon as possible.
+ *
+ * This means we establish several times as many connections, but
+ * that's a secondary consideration.
+ */
+ for (stage = 0; stage < ANALYZE_NUM_STAGES; stage++)
+ {
+ for (i = 0; i < PQntuples(result); i++)
+ {
+ cparams->override_dbname = PQgetvalue(result, i, 0);
+
+ vacuum_one_database(cparams, vacopts,
+ stage,
+ NULL,
+ concurrentCons,
+ progname, echo, quiet);
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < PQntuples(result); i++)
+ {
+ cparams->override_dbname = PQgetvalue(result, i, 0);
+
+ vacuum_one_database(cparams, vacopts,
+ ANALYZE_NO_STAGE,
+ NULL,
+ concurrentCons,
+ progname, echo, quiet);
+ }
+ }
+
+ PQclear(result);
+}
+
+/*
+ * Construct a vacuum/analyze command to run based on the given options, in the
+ * given string buffer, which may contain previous garbage.
+ *
+ * The table name used must be already properly quoted. The command generated
+ * depends on the server version involved and it is semicolon-terminated.
+ */
+static void
+prepare_vacuum_command(PQExpBuffer sql, int serverVersion,
+ vacuumingOptions *vacopts, const char *table)
+{
+ const char *paren = " (";
+ const char *comma = ", ";
+ const char *sep = paren;
+
+ resetPQExpBuffer(sql);
+
+ if (vacopts->analyze_only)
+ {
+ appendPQExpBufferStr(sql, "ANALYZE");
+
+ /* parenthesized grammar of ANALYZE is supported since v11 */
+ if (serverVersion >= 110000)
+ {
+ if (vacopts->skip_locked)
+ {
+ /* SKIP_LOCKED is supported since v12 */
+ Assert(serverVersion >= 120000);
+ appendPQExpBuffer(sql, "%sSKIP_LOCKED", sep);
+ sep = comma;
+ }
+ if (vacopts->verbose)
+ {
+ appendPQExpBuffer(sql, "%sVERBOSE", sep);
+ sep = comma;
+ }
+ if (sep != paren)
+ appendPQExpBufferChar(sql, ')');
+ }
+ else
+ {
+ if (vacopts->verbose)
+ appendPQExpBufferStr(sql, " VERBOSE");
+ }
+ }
+ else
+ {
+ appendPQExpBufferStr(sql, "VACUUM");
+
+ /* parenthesized grammar of VACUUM is supported since v9.0 */
+ if (serverVersion >= 90000)
+ {
+ if (vacopts->disable_page_skipping)
+ {
+ /* DISABLE_PAGE_SKIPPING is supported since v9.6 */
+ Assert(serverVersion >= 90600);
+ appendPQExpBuffer(sql, "%sDISABLE_PAGE_SKIPPING", sep);
+ sep = comma;
+ }
+ if (vacopts->no_index_cleanup)
+ {
+ /* "INDEX_CLEANUP FALSE" has been supported since v12 */
+ Assert(serverVersion >= 120000);
+ Assert(!vacopts->force_index_cleanup);
+ appendPQExpBuffer(sql, "%sINDEX_CLEANUP FALSE", sep);
+ sep = comma;
+ }
+ if (vacopts->force_index_cleanup)
+ {
+ /* "INDEX_CLEANUP TRUE" has been supported since v12 */
+ Assert(serverVersion >= 120000);
+ Assert(!vacopts->no_index_cleanup);
+ appendPQExpBuffer(sql, "%sINDEX_CLEANUP TRUE", sep);
+ sep = comma;
+ }
+ if (!vacopts->do_truncate)
+ {
+ /* TRUNCATE is supported since v12 */
+ Assert(serverVersion >= 120000);
+ appendPQExpBuffer(sql, "%sTRUNCATE FALSE", sep);
+ sep = comma;
+ }
+ if (!vacopts->process_toast)
+ {
+ /* PROCESS_TOAST is supported since v14 */
+ Assert(serverVersion >= 140000);
+ appendPQExpBuffer(sql, "%sPROCESS_TOAST FALSE", sep);
+ sep = comma;
+ }
+ if (vacopts->skip_locked)
+ {
+ /* SKIP_LOCKED is supported since v12 */
+ Assert(serverVersion >= 120000);
+ appendPQExpBuffer(sql, "%sSKIP_LOCKED", sep);
+ sep = comma;
+ }
+ if (vacopts->full)
+ {
+ appendPQExpBuffer(sql, "%sFULL", sep);
+ sep = comma;
+ }
+ if (vacopts->freeze)
+ {
+ appendPQExpBuffer(sql, "%sFREEZE", sep);
+ sep = comma;
+ }
+ if (vacopts->verbose)
+ {
+ appendPQExpBuffer(sql, "%sVERBOSE", sep);
+ sep = comma;
+ }
+ if (vacopts->and_analyze)
+ {
+ appendPQExpBuffer(sql, "%sANALYZE", sep);
+ sep = comma;
+ }
+ if (vacopts->parallel_workers >= 0)
+ {
+ /* PARALLEL is supported since v13 */
+ Assert(serverVersion >= 130000);
+ appendPQExpBuffer(sql, "%sPARALLEL %d", sep,
+ vacopts->parallel_workers);
+ sep = comma;
+ }
+ if (sep != paren)
+ appendPQExpBufferChar(sql, ')');
+ }
+ else
+ {
+ if (vacopts->full)
+ appendPQExpBufferStr(sql, " FULL");
+ if (vacopts->freeze)
+ appendPQExpBufferStr(sql, " FREEZE");
+ if (vacopts->verbose)
+ appendPQExpBufferStr(sql, " VERBOSE");
+ if (vacopts->and_analyze)
+ appendPQExpBufferStr(sql, " ANALYZE");
+ }
+ }
+
+ appendPQExpBuffer(sql, " %s;", table);
+}
+
+/*
+ * Send a vacuum/analyze command to the server, returning after sending the
+ * command.
+ *
+ * Any errors during command execution are reported to stderr.
+ */
+static void
+run_vacuum_command(PGconn *conn, const char *sql, bool echo,
+ const char *table)
+{
+ bool status;
+
+ if (echo)
+ printf("%s\n", sql);
+
+ status = PQsendQuery(conn, sql) == 1;
+
+ if (!status)
+ {
+ if (table)
+ pg_log_error("vacuuming of table \"%s\" in database \"%s\" failed: %s",
+ table, PQdb(conn), PQerrorMessage(conn));
+ else
+ pg_log_error("vacuuming of database \"%s\" failed: %s",
+ PQdb(conn), PQerrorMessage(conn));
+ }
+}
+
+static void
+help(const char *progname)
+{
+ printf(_("%s cleans and analyzes a PostgreSQL database.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DBNAME]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -a, --all vacuum all databases\n"));
+ printf(_(" -d, --dbname=DBNAME database to vacuum\n"));
+ printf(_(" --disable-page-skipping disable all page-skipping behavior\n"));
+ printf(_(" -e, --echo show the commands being sent to the server\n"));
+ printf(_(" -f, --full do full vacuuming\n"));
+ printf(_(" -F, --freeze freeze row transaction information\n"));
+ printf(_(" --force-index-cleanup always remove index entries that point to dead tuples\n"));
+ printf(_(" -j, --jobs=NUM use this many concurrent connections to vacuum\n"));
+ printf(_(" --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"));
+ printf(_(" --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"));
+ printf(_(" --no-index-cleanup don't remove index entries that point to dead tuples\n"));
+ printf(_(" --no-process-toast skip the TOAST table associated with the table to vacuum\n"));
+ printf(_(" --no-truncate don't truncate empty pages at the end of the table\n"));
+ printf(_(" -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"));
+ printf(_(" -q, --quiet don't write any messages\n"));
+ printf(_(" --skip-locked skip relations that cannot be immediately locked\n"));
+ printf(_(" -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"));
+ printf(_(" -v, --verbose write a lot of output\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -z, --analyze update optimizer statistics\n"));
+ printf(_(" -Z, --analyze-only only update optimizer statistics; no vacuum\n"));
+ printf(_(" --analyze-in-stages only update optimizer statistics, in multiple\n"
+ " stages for faster results; no vacuum\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -U, --username=USERNAME user name to connect as\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt\n"));
+ printf(_(" --maintenance-db=DBNAME alternate maintenance database\n"));
+ printf(_("\nRead the description of the SQL command VACUUM for details.\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}